@agoric/inter-protocol 0.13.2-dev-0153ef0.0 → 0.13.2-dev-753bc47.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundles/bundle-amm-meta.js +125 -125
- package/bundles/bundle-amm.js +1 -1
- package/bundles/bundle-econCommitteeCharter-meta.js +70 -70
- package/bundles/bundle-econCommitteeCharter.js +1 -1
- package/bundles/bundle-feeDistributor-meta.js +53 -53
- package/bundles/bundle-feeDistributor.js +1 -1
- package/bundles/bundle-interchainPool-meta.js +103 -103
- package/bundles/bundle-interchainPool.js +1 -1
- package/bundles/bundle-liquidateIncrementally-meta.js +68 -68
- package/bundles/bundle-liquidateIncrementally.js +1 -1
- package/bundles/bundle-liquidateMinimum-meta.js +68 -68
- package/bundles/bundle-liquidateMinimum.js +1 -1
- package/bundles/bundle-priceAggregatorChainlink-meta.js +72 -72
- package/bundles/bundle-priceAggregatorChainlink.js +1 -1
- package/bundles/bundle-psm-meta.js +109 -109
- package/bundles/bundle-psm.js +1 -1
- package/bundles/bundle-reserve-meta.js +108 -108
- package/bundles/bundle-reserve.js +1 -1
- package/bundles/bundle-scaledPriceAuthority-meta.js +145 -145
- package/bundles/bundle-scaledPriceAuthority.js +1 -1
- package/bundles/bundle-stakeFactory-meta.js +114 -114
- package/bundles/bundle-stakeFactory.js +1 -1
- package/bundles/bundle-vaultFactory-meta.js +121 -121
- package/bundles/bundle-vaultFactory.js +1 -1
- package/package.json +15 -15
|
@@ -1 +1 @@
|
|
|
1
|
-
export default {"moduleFormat":"endoZipBase64","endoZipBase64":"UEsDBAoAAAAAAAAAAACRR/zTpeAAAKXgAAAUAAAAY29tcGFydG1lbnQtbWFwLmpzb257CiAgImVudHJ5IjogewogICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMSIsCiAgICAibW9kdWxlIjogIi4vc3JjL2Vjb25Db21taXR0ZWVDaGFydGVyLmpzIgogIH0sCiAgImNvbXBhcnRtZW50cyI6IHsKICAgICJAYWdvcmljL2Fzc2VydC12MC41LjEiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvYXNzZXJ0IiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvYXNzZXJ0LXYwLjUuMSIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL2Fzc2VydC12MC41LjEiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9pbnRlci1wcm90b2NvbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9hc3NlcnQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2Fzc2VydC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjcyMjI2ZGYxOWEwYzViYWEzNGU1NzQ5ZGEwMDllYjI3ZTZiYzEyMTFiNWZhMzY3YjBhYWM4N2Y3M2QzMWJhODdjYWMwMDM5NjM0ZjA2MjNjMjliMGIzZDcyYWU2MWQ5NjBjMzllM2ZjMzQ3ZWY3ZmFhODAzZDVmYTc4OGU0N2IxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImE2MmQ4N2ZiMDNhYjc4MTY0YzM0MWZhYTJmNmZjYjZlZTg3M2ZlY2RmMmM3MDA0MjQ4YjM5MzU3MDYxMDJjOWM2ODZjMTJmNTQyYjQyMDdhNzk1OThkMmUyMDVlZjVkYzJiN2YwZjRkZDVmYzBjYmFhMDBmZTdhNDNmNWQwYWU5IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL2VydHAtdjAuMTUuMyI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy9lcnRwIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvZXJ0cC12MC4xNS4zIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvZXJ0cC12MC4xNS4zIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvYXNzZXJ0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvYXNzZXJ0LXYwLjUuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2Fzc2VydC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVyLXByb3RvY29sIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbmF0LXY0LjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZGlzdC9uYXQuZXNtLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC41LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N0b3JlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3RvcmUtdjAuOC4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zdG9yZS9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjguMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZXhwb3J0ZWQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zd2luZ3NldC12YXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zd2luZ3NldC12YXQtdjAuMzAuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdmF0LWRhdGEiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy92YXQtZGF0YS12MC40LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTYuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZmFyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Zhci12MC4yLjE0IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYwLjguMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41MiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiLi9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJleHBvcnRlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjg5YTUyMGNiZjFmMWRkMDVkZjI1YzdhZjFiYWFiMTc5ZDk4OWFhMmRjYjNmZDdiZjc0YmZkZTI1OTJiMzMzODY0MmNjZWM1N2ZjM2IzYzRmMTg2NWE3YmUzMWVjMjRiZTZkNTg1OTdmYWQwZTY3NmZlMjc3MWJjOTU1ODM0MDhhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2Ftb3VudE1hdGguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2Ftb3VudE1hdGguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjYzRkN2QwMGYwNGZhYmYyNmRlMWIwNWFmMThiY2E5NzlhZDVjMjY0ZDJhNjUxMjc5ZmY0Yjg0ZTY4ODE4OTcwMDljYTQyOWZjYjAwMGI2MTU1MmZjOGRjYmFiNTQzNzQzMjYyNTcyNTRjNzRmNGFkMzZkYzI2YmE2Y2FkMTAxNSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9kaXNwbGF5SW5mby5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZGlzcGxheUluZm8uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyYjE0Mjc1Y2I3ZGNhYmI0NDk2ZTBmMDIyYjZjOTc5NWQ3NTgzM2ViODkzYzQ4MDMwZWFmNTZhZmEzOWMzODMxZWNkZjQ1OTA0YTY2MmQ5MmJlYTk3MjMyZDMyNDZkZjMwNzY5ZjI5NzFiMjFiMjYwMmM2YjgyYWZiMjY0ZTUwZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlYmVhNzRhZWYwMDgzZTVlMjNkZjEyZDkyM2Q4MWZkZmJmMWJkZjhkZDYxZjhlMzJhYzg1OGFiY2UzODFmMjMzZDFjNTRkOWU2YjE3MTRhMjliY2JhOTYxOWQ0OGJiOWE2MDcxOGVjZjYwZTA4NTFhYTIxMzI1MzZhMDIzYmNhYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pc3N1ZXJLaXQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2lzc3VlcktpdC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjdiY2YyMGNlYWRiMzU4ODMzMTVjMzdiYzY3YTdhYjA0MGQ5NzZmNGY2N2ExMTA2MTUxOWM2MzIxYmM4ZjdhM2RkNGEzMTkzZTYwOTAyZjYyMDJmMTcxZWQ5NmE3NjU5OTRiZjQ2YTI3YWQ0MTVjNDZkN2IyNWQ5MzRiNTAyM2U1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hdGhIZWxwZXJzL2NvcHlCYWdNYXRoSGVscGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWF0aEhlbHBlcnMvY29weUJhZ01hdGhIZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNWExNTJkNzMwNDhmMTQyYTFlOThhOWI0MDNhMjk4MmE0NjJkY2FiZDI2ODZmNzFlZmU0OGY5MGM3YTE3NzU2MDk3YzE5NTE5MTIzMmUzNzcwOWNhNjdiMjdkZWQ5OGQ4YjcyNTlhMmVhZmM4NDU5MGM4M2ZiOGNkODYxNTcyZWMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWF0aEhlbHBlcnMvY29weVNldE1hdGhIZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXRoSGVscGVycy9jb3B5U2V0TWF0aEhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2ZjBhODBhYzMzYTdjYTNkYzQ1ZjU2YTYzODgzMmI0MzUzNzhmYmQxMmQ2NTY2NjRjZGYxNzk0MzU2YjcwMWNiNDMxMDY3YmJiNTQzZGYzZTQ4YjIzMDMzYjFlNDE0MjY3YWEyZmJjZTUwYTBjMjAyYjlmNjZjM2ZkYjNlZDg5YiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYXRoSGVscGVycy9uYXRNYXRoSGVscGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWF0aEhlbHBlcnMvbmF0TWF0aEhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1OWU5MWU4NzU5MmVjZmY5ZjE0NWRmNTI1MTg2OTI0ODU4YWQ3OWQyNjQxNWZhZDdiNWI3MjU5Njk4YWU3ZGM1MTUzNzZhY2RkOWM1NjRkZWVjZTVhMmExYTdhZDI4YjFkYjhlNTJjMDJiOWFiMDliYzAxYTQyM2M0ZWYxNWI5YiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYXRoSGVscGVycy9zZXRNYXRoSGVscGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWF0aEhlbHBlcnMvc2V0TWF0aEhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhNjE5NmQ3N2ViZDQwMzUyNmM0ZGE4NTM2ZWVlYzM2YTExMGEzMDQzOGEwMTk4MjE5MWQ3ZWYxNjQ3NjdhZWQ3OWM2YzhjNWRiZDYzZjdkNzM4NDk5NWY5ZmZjMDZhZTgzYmJkMTg3N2FjNGI1YzFmNzAzYzIxNTcxMzIxMGJkMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXltZW50LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXltZW50LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTZkMWQ2MzRhNTZmOTdhZDNkMTAzYTQ4N2U3ZDk4OTFlNmE5MmJjMDZlYmRmZGU1NTEyMWI2NzA3ZTBjOTA5ZGQ1YWU2OGI1M2JhZTM0MDkxMmU2ZGM3YzhiNWM2MDEwZDY3MTkwZjg4MzM0MjkwNmE4YTA5ZTY1OWUzNDMyNDgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGF5bWVudExlZGdlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGF5bWVudExlZGdlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNmMzI3OThhYzVlMjU1ODdhZTY5MmI4NTAwNjYxYTkzNzYyMjIxZmYyMDhhY2E5MGE5ZDJkYmVmMjJkMTVhMjJlNGYwMmY4YjNlNDJkZjlhYjE3MGMwNDFmYTU5YjkzYTZiOTc4Mjg3NWM5MjY5MDZkZDAzYTdiNzhlYjYzNWNiIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3B1cnNlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wdXJzZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjAzOTMyZDg3NzZmZjk2MTU1ZDYzMTRhMGE4YjY5YzQ4YTQ4NWI0NmExZTVmN2NiNjE0ZDQ0Y2VlNzRmYTI0YTNjYWRkZWVlMjdkYTY2ODBkN2MzYTljNmRlNDBkNDg0MDE4YTgzOTMyYWUzY2Y1ODU1MzgzZjAxYjE1MDExOGQyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3RyYW5zaWVudE5vdGlmaWVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90cmFuc2llbnROb3RpZmllci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjc4ZTljZjZkMTkwMTNkYzQ0YTk3Mzg3Zjk2NDczYjBlZWY0YzM3MzNmZDg1OTJjM2UwNzZjYjVmZGY2YzBhZWQ4MTFlZDNmZmM4YzczMTQwZjcxMjNkNWNjYmUyNDVkY2EyYzE3NTU3YTNhYjlmZGE1NTAwNGJiMGVhNGEyOGI2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVHdWFyZHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVHdWFyZHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYmVjNDg1OGNmN2M5YjUyN2MxN2Y4NDE5NTkxZTBhOTQ4ZjYxYzU2OTI4ZjU2ZjgzYWZlMWViOWQ5ODJiYjgxYWMzNTIzZTRhMTg5NmZiMzdiM2NiM2JmMDJkNGU5ZWViY2NmYTQxZmRhYmFkM2Q3NzU0MTQxOTBjOTU1ZmNiMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy1hbWJpZW50LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy1hbWJpZW50LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiN2YyMDZmYzZkZGNlMTAzNmM1ZWE2NTE2YWQyMWU5MmUzZmZlNzFhYjU1Zjg3Y2NiMjY0ZGRlYzNlNGQwNTI1YTFlYjI5M2MzN2FkMTdjOTJmYzc3ZTEwMjk0ODcwYjlkNTkyMjRmODBkM2MzNmU4OWNiMzBiZTYxZjlkMGM4N2MiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvZ292ZXJuYW5jZS12MC45LjEiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvZ292ZXJuYW5jZSIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL2dvdmVybmFuY2UtdjAuOS4xIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvZ292ZXJuYW5jZS12MC45LjEiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9hc3NlcnQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9hc3NlcnQtdjAuNS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvYXNzZXJ0LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvZXJ0cCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2VydHAtdjAuMTUuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlcm5hbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjIuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbmF0LXY0LjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZGlzdC9uYXQuZXNtLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC41LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N0b3JlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3RvcmUtdjAuOC4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zd2luZ3NldC12YXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zd2luZ3NldC12YXQtdjAuMzAuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdmF0LWRhdGEiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy92YXQtZGF0YS12MC40LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3ZhdHMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy92YXRzLXYwLjEzLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvem9lIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvem9lLXYwLjI1LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy96b2VTZXJ2aWNlL3pvZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jYXB0cCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jYXB0cC12Mi4wLjE4IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE2LjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ZhciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9mYXItdjAuMi4xNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MC44LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vZXhwb3J0ZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiZXhwb3J0ZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4OWE1MjBjYmYxZjFkZDA1ZGYyNWM3YWYxYmFhYjE3OWQ5ODlhYTJkY2IzZmQ3YmY3NGJmZGUyNTkyYjMzMzg2NDJjY2VjNTdmYzNiM2M0ZjE4NjVhN2JlMzFlYzI0YmU2ZDU4NTk3ZmFkMGU2NzZmZTI3NzFiYzk1NTgzNDA4YSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy1hbWJpZW50LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy1hbWJpZW50LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYzFmNWU2ODllMjc2MjM4ZWM2NTE5OGEwMzllYTZkN2FhNGZjNjJmMTZkYmY3Yzc0YzA5Yjk4Yjg2ZmUwM2IwZTk2MDI2ZTk4ODZlZDAxOGZkN2U5ODQ4ZWE2OWE0M2VmYTZlNmQ0N2FkNDhkOGJjMTkyYTA5NTU4NWQ1NTJkZmQiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMSI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbCIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjEiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvYXNzZXJ0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvYXNzZXJ0LXYwLjUuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2Fzc2VydC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2VydHAiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9lcnRwLXYwLjE1LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2dvdmVybmFuY2UiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjkuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvZ292ZXJuYW5jZS9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2dvdmVybmFuY2UtdjAuOS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9leHBvcnRlZC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVyLXByb3RvY29sIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXJuYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4yLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25hdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25hdC12NC4xLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2Rpc3QvbmF0LmVzbS5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zdG9yZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjguMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3dpbmdzZXQtdmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3dpbmdzZXQtdmF0LXYwLjMwLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N3aW5nc2V0LXZhdC9zcmMvdmF0cy90aW1lci90eXBlR3VhcmRzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3dpbmdzZXQtdmF0LXYwLjMwLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy92YXRzL3RpbWVyL3R5cGVHdWFyZHMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy92YXQtZGF0YSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3ZhdC1kYXRhLXYwLjQuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdmF0cyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3ZhdHMtdjAuMTMuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy96b2UiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy96b2UtdjAuMjUuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL3pvZVNlcnZpY2Uvem9lLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvem9lL2V4cG9ydGVkLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvem9lLXYwLjI1LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2V4cG9ydGVkLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvem9lL3NyYy9jb250cmFjdHMvZXhwb3J0ZWQuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy96b2UtdjAuMjUuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2NvbnRyYWN0cy9leHBvcnRlZC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3pvZS9zcmMvdHlwZUd1YXJkcy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3pvZS12MC4yNS4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvdHlwZUd1YXJkcy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9idW5kbGUtc291cmNlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2J1bmRsZS1zb3VyY2UtdjIuNC4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYnVuZGxlLXNvdXJjZS9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9idW5kbGUtc291cmNlLXYyLjQuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZXhwb3J0ZWQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYnVuZGxlLXNvdXJjZS9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYnVuZGxlLXNvdXJjZS12Mi40LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jYXB0cCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jYXB0cC12Mi4wLjE4IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE2LjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ZhciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9mYXItdjAuMi4xNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MC44LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjQuMS4yMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY0LjEuMjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41MiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3NoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41MiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lY29uQ29tbWl0dGVlQ2hhcnRlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZWNvbkNvbW1pdHRlZUNoYXJ0ZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4OTM5YzdiZjM5ZTBlOTg4NTI1MDlmNjJlODM0YjkyMWY2ZTdjMDU4Mzg5M2M3YzY3MTc2YWIxNmQ3OGZjZjZhZTg4ZDIyODVlNjVhZDY5YjQ0OGFkZGJmYWJiMjczZTMyODY0NDU2NDI5ZTI4NGFmMTkyYTNiMDBhYjczNDQ3NCIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy9pbnRlcm5hbC12MC4yLjEiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvaW50ZXJuYWwiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4yLjEiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4yLjEiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9pbnRlci1wcm90b2NvbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTYuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYwLjguMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41MiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29uZmlnLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb25maWcuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxZTRjZWYxMDVhNTdhYmI5OGJiOGM5ZDNiNDhlZTYwZDY3ZTJlMWZjODYwNmRhNmJkOWVmZGJkODI2ZmYwNWEyNmUwZmY2M2U0MTUwNzNhNzM2MjkxZTVlYzVkMWQ1MjFmMDNjODExODlhNjljYWMwZDUzZjhhYmZjMzY3NGQyMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxNTg0NDgxZjk4YzYxMzhkMGRjMmU5ZGY0MmVmNzE5MThjZTQ4ODMzNzQxMDVjMzk1ZWQ2NjNjMzBkOWMzOTg3NTNkMDliYmIyMTliZTA5OWZhMWFhYTAwOTUwZTkwMTg5MzdkMGM0NmJkOGJkODkyNDE1MWRhYTQ0MTgxNWNkZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy91dGlscy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdXRpbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2OGE5OGNlNzA4OGM4YTUwYmZlYzM4YjFlMmM0NDZmNTcwYmM1NjU5MmRkMDExNDI3NDhkNzIwZGFlZGExNWY2NzI5Y2E1YmVhYThhMWQ5OGNiMjJiMmU3NDhiZTU3YmUxODQyM2VkNGE2ZGM0Y2U3YjVjYmJjNDAxYzIzMmEzMyIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy9uYXQtdjQuMS4wIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL25hdCIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL25hdC12NC4xLjAiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy9uYXQtdjQuMS4wIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9kaXN0L25hdC5lc20uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiZGlzdC9uYXQuZXNtLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNjJjZTRmYjYxN2U1NDhhMjRiZTQwNzQyNDFhNDNmZDlkMjNmNTc5OTE0MDEzMjc0ZTA2NjA3OTc0ZGI4YWMwMTAyYjkzNzgwODIxYmJmNmQ0OTRjOTVhZGM1NGNhMjE0N2IxMjU4NWFkODk2MmIzMDQ5ZjQyOGMxZDk5YTIwMmUiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvbm90aWZpZXItdjAuNS4xIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL25vdGlmaWVyIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvbm90aWZpZXItdjAuNS4xIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvbm90aWZpZXItdjAuNS4xIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvYXNzZXJ0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvYXNzZXJ0LXYwLjUuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2Fzc2VydC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVyLXByb3RvY29sIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXJuYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4yLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N0b3JlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3RvcmUtdjAuOC4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zd2luZy1zdG9yZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N3aW5nLXN0b3JlLXYwLjguMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL3N3aW5nU3RvcmUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zd2luZ3NldC12YXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zd2luZ3NldC12YXQtdjAuMzAuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdmF0LWRhdGEiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy92YXQtZGF0YS12MC40LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTYuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYwLjguMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41MiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiLi9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJleHBvcnRlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjg5YTUyMGNiZjFmMWRkMDVkZjI1YzdhZjFiYWFiMTc5ZDk4OWFhMmRjYjNmZDdiZjc0YmZkZTI1OTJiMzMzODY0MmNjZWM1N2ZjM2IzYzRmMTg2NWE3YmUzMWVjMjRiZTZkNTg1OTdmYWQwZTY3NmZlMjc3MWJjOTU1ODM0MDhhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9hc3luY0l0ZXJhYmxlQWRhcHRvci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImFlOGFhZmRiMjQzYzc5MWQwZGUxOWQ0MDhiOGVmNGZjOTgwZDBhMjA5YjE4YTdjZjNiYjQxODdmOGNmODg3ZmYzZTdhZjcxYjIzOGFhZGI2MTU0NzBmMTZmYjk2NWU5MjUzMDIyMzVjNWQxOTcwYWEwNTY5NzdmNzRiNDcyNTA0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImUwNGE4MDI0OTY3MGY1OGY1YWEzYzFlZDY2ZmU0NWM4NDA2ZTQwZmFiZjdmN2Y0ZDA1MDFkYzE3OWQzY2M0MmU1ZDk2Y2RlMmM3NzhhNDg3NzZjOGQxMjI4MDc5NGI5MmJjNjI1MzdmN2IxMDczYzY5MjE3NzYyOWFlNDhlMmEyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL25vdGlmaWVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9ub3RpZmllci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImI0ODgwZmJmYmIxMTk3MGI5YTM1MTc0NGJkNWY0Yzc2NzEyZDNmZmU5OGI0Mzk1NTE3YTcyOWYxYjk0MGE4OWVlMmIzNTJlNzJkZGIwOWY0NTk2ZjA1NWM3YWFiZjk5Njk4ODdkNDljMWZjY2ZkZjc4OThmNWU0YWI4ZDY3ZGU5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3B1Ymxpc2gta2l0LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wdWJsaXNoLWtpdC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjU5NmU1MjIzZGFkMDUyMGMwMDNhMTlkODJhMTBkNmI0OWJmNzYwYzI5NDU5M2VhNDVjOGJhZGMzODZlYmEzMmVkMDZjMTBlMmJjNWI3YTU3NzEwNjBkNTFmMzVmMmQxYjUwZjM3MjZlYjZmNmM1YjBkMTJmNmIzZjdhMjFkZWNmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0b3Jlc3ViLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdG9yZXN1Yi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImY2ZDgyODZmZWUzMWI1MDYyNjkyMGFlMmI0ODk1YTkzMTQ2OGQwMGMxMzAzYWU2ZGE1YWUxZGE3N2MyOTIwYmQxYTM0NGE4MzcxN2M4YzFkNjY3YzU5MzU4NmFlYzM4N2JiMGE1NDgzOGM5ZjdiODUxZjRlZjNlMjVlZjFlYjkxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N1YnNjcmliZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N1YnNjcmliZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjZWVhMjk5NGFhYTM1OGUxZWJmMjNjZTYwNjcwYTI4NDBmOTMwYTQ1NWM2MjI4MWI2ZjY5Y2Q1MjVlMDFjYTc4NzdlZmIxOTQyZjZjMTYwZjM4OTUwOTEyMjBjM2M1Y2E5MzhjODU1OWQzMTNlNWNhOGFmNDI5NmI0ZjI0MjZlMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy1hbWJpZW50LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy1hbWJpZW50LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMGQ4YThhM2UzMmJiZGQ2NmViZWVmMTkyMDU2MWFhZWEyMDgzNGUwNDMyMGMxNzBiZGViNGQ1YmJmZTZhNjIwN2MxOWE2ZDc4Mzk3YzNiM2UwMzdmNmU5NmQyY2MzNjlhN2MwN2QyZTYxMjA4M2RhZWZmNDA0NTMxMzE0ZTc4YWYiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvc3RvcmUtdjAuOC4zIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL3N0b3JlIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvc3RvcmUtdjAuOC4zIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvc3RvcmUtdjAuOC4zIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvYXNzZXJ0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvYXNzZXJ0LXYwLjUuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2Fzc2VydC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVyLXByb3RvY29sIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXJuYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4yLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTYuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYwLjguMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbC9zcmMvaGVscGVycy9lcnJvci5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYwLjguMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2hlbHBlcnMvZXJyb3IuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41MiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGZhc3QtY2hlY2svYXZhIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBmYXN0LWNoZWNrL2F2YS12MS4wLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2xpYi9lc20vYXZhLWZhc3QtY2hlY2suanMiCiAgICAgICAgfSwKICAgICAgICAiQGZhc3QtY2hlY2svYXZhL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZmFzdC1jaGVjay9hdmEtdjEuMC4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiLi9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJleHBvcnRlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImYyOWZlMzUzMDVmODA3ZGEyMzVmMDY4OGQzYjY1ZTM1MTAzOGRmYjU3NDBjZjcyODFjMjBjNDUzODI1ZjgzYTA2Njc3Njk2ZDNiZTJjMDE4NGJmMmQyNTA4MWEwOGI5MjkwZGVlYzY5YTM5Zjg4NjI5MDAxN2NjODJiYjA0YzZlIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImUxYWVhZmU1MzFiYTk1NzAxNThhMzhhNWNmZjk5YzJkZmExZjg5MzAyYTFkYzJjNjE1YTBiNWZmMjlkZDgzMmJiNTk0MmNiMjQwZDAyNTQzYTYzNjIyZTQ5ZTk2OThiNzk2N2RlZGU1NDljZjRhNmYxNWZiODkyMDA4NjVjYzk4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tleXMvY2hlY2tLZXkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMvY2hlY2tLZXkuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0YzhjZmU1OGNlOTdiYTY1YWQwZjhiZDdiMDdjMTcxZDQ1NzAyM2RiZDYwNTMyMTI1NWVmZmRiNDdiYzVkMDAxZTE3ZDE2MTFiYzczOWZlZmFhNjYxNGI1MDA1NGJkOTgxOWI3N2QyNzc4MjA2NDFiMmU3MTY2ZTdkNTFlYjg2NyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9rZXlzL2NvbXBhcmVLZXlzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9rZXlzL2NvbXBhcmVLZXlzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYzYwZDk5ZGM1NTQyM2RkN2ZjNGM5NWUzYTdiNjFjMmIxZGYyMzgwMTdkMDk0NDQ3ODNjZmU1MDI5NzFmNTcxODdkYmI5MDEwMTNlNTUwOTFlMWEzMGVmNzdmMjBiYjFmZWYwNGNiZDkyZmViMmQzZjYyZDIzOGJhMjU5NTU0Y2IiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMva2V5cy9jb3B5QmFnLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9rZXlzL2NvcHlCYWcuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlMmE0ZjZiMWQ0YTI4ZGZkYmYwOTlhYWE2ZTIyYzBiMjczZTExYzAwNDMyN2IzZjExMmQ4Mjk3NzA3NmM3ZWQwY2Y0N2RmMDE0ZWU1MDIzNTNhNjVlNjgyNTRmMzhiYjFlYTUyNGRkZjYzZmQ0NTUwYzBjZjQ5N2MyNmRkMmMxOSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9rZXlzL2NvcHlTZXQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMvY29weVNldC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjhhODFiOGQxNjdhOWQ4ZWFiOWQxYzk0Nzk0Y2UwNTExOTI3ZTg3YjlkNjJjZDEwZTBhOTk3Y2VmODNiMzcyODAzODE5NDZmNDMwYzc4MmUxODYyNGRiN2ZkYjE0ZmVmMDUwMDc2MDdlNmQ5MTM3MzNjMGZlNjcyNTBiY2Q4NzczIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMva2V5cy9tZXJnZS1iYWctb3BlcmF0b3JzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNmJiZjk3NDJjZWY0NTc1ZjUxZmUyNDgwYTU5ZTQ1YzYyOTMxNjgwOWE4NzdkZTMwZGM1YjM1YjEwZjEwNTViNjFiMTQ1YzM2MmU2Yjg0MTJjZWVkYWIxNTI4OTI4M2YwN2FhNmZjZDg5NjVlMmJiMGRmZjlhNGYwYzE5NjFkZDUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMva2V5cy9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1NTNiODg1ODc0MmM0MmU2NDgzYzRmYWU3ZTk0N2Y3YWZkYjFlZGY2YjQwMGU4MjE1ZmNhMWQ0NzFmNDFmZDMyZTliNDljYTdiMTE0ZmU5OWRkMWQ1NmI2OTRiMjhmZDBkOTg5MTYzYzIyN2ZkNzllZjMwYWNlMzA4YmE1MzcwMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9sZWdhY3kvbGVnYWN5TWFwLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9sZWdhY3kvbGVnYWN5TWFwLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZThkYmFiYTFhOGE2M2FjMGYwMDE0YzFiNDhmNTZjZDM0MjE2YWYzMzRjM2ZlODI4M2Y2MzM4YzlhNjdmZWY0ODQyODA5ZDkwMTMyNmE5ZWFmMDVhZDY4NGY0YTRiMDM3YjUzZTNhOTBmOGJiMGE4YmRkNTg3MjJiMGYwMTAzYjYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbGVnYWN5L2xlZ2FjeVdlYWtNYXAuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2xlZ2FjeS9sZWdhY3lXZWFrTWFwLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNjRmYTEwNTY5Mjc3Y2Y2NzMzOTA3ZmRiMjQ1ZTliZWYyMmE4ZmU3ZTc5Y2EwNWJlZGY3ZDU4YjllYzU1MjZjMzhjMWE5MGUzZDgyYWRiZWJkY2M5NTExZGY5ODM0YzEzMGRlZmNkM2RkOWQyMGYxNDJhMDY2YjBmMjNlOGVjYmMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGF0dGVybnMvZW5jb2RlUGFzc2FibGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BhdHRlcm5zL2VuY29kZVBhc3NhYmxlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2NmZGJlMjgwZmY0ZDVhZTMzMzliMmQ5OTg2NjhiNjc3NDE2MjU4MTQ2N2RjOWE1YzRjYmFjMGI1MjQyN2U0OWJjMzM0ZTljY2E0MzkyZDgzMzFmMWZkNDIwMGQ4MzRjMzFjMDUyZTVlN2RlOGEzZjlmMDYwYzJmYmI3NDA4YzQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGF0dGVybnMvaW50ZXJmYWNlLXRvb2xzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXR0ZXJucy9pbnRlcmZhY2UtdG9vbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxYTgxNzJlMmFmZjViY2VlZTQ4YTBmZGMxZDYyZmRhMzk5NGZkNmQyOGM5ZGFlNmY3NjQ4NWQxYzFiMTk2N2NlNGQyYTAxOTQzMzFkMzU1ZDM5NzdhMDE1NGViYWY2ZjRlNWJkODJjOGIwOGFiNWQ1NWRhNGQyMGEwNWUzZjdhMiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXR0ZXJucy9pbnRlcm5hbC10eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGF0dGVybnMvaW50ZXJuYWwtdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0MzVkMjY4NWExY2Y2MDliZWU1OTAzYjIyMTZhZWUzN2M4MDdmZTRlMWFjYzUyOWZmZWVjNWYyNTI5NjI4NGYyZGVmNTY2MTZkZTczNmJiMmQ1NGIxZjY1MzE2ZmI3YzU5ZDJiYzk4NjZhYzJiNTYzM2JlMDJhYTM3ZTI5MzNkMiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImMwY2VhYzBjYTk1ZjNjZWU5NDEyYjYzNWUwZThlZjFlN2JlNzYyZjdkZWEyMTNjNDA0ZjQ1ZWVmNGQ1MDAyNWMxOWE4MWY4YjUxZjEyOGZkZjQ0NDY2YTlkZTViYWViZTQzMTkwM2IxZGI3NjI5ZjZhMWY3ODdhMzc0MzhmNWNiIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BhdHRlcm5zL3JhbmtPcmRlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGF0dGVybnMvcmFua09yZGVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDNkZmRkMDJiNGRkMmJlZjE1ZTk3YmU3NmNkYmUyZWM4N2EzNzM2ZGRkNDNmNzU3Mjk1ZjNlN2QwZGE1YmJiZGFkMjAyMGE3OWY0YzkwMDEyMWJhZDljYjU5ZmNlZDdhMzZjMjUzZWU3MWU5MGIxODMzMGMzMGI2MTYzMWFlYmYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RvcmVzL3NjYWxhck1hcFN0b3JlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdG9yZXMvc2NhbGFyTWFwU3RvcmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjZGI3MzdmZGNjOWRkMzBiNTYyMjI2OGRkMmNkMDU0NTQ5MTFhYmVkMDU4YThhZjRkYzUxYzRmYTU0M2EyN2MyNWM4NTAxMjBjNmVmZTY1ZTQxYWM3NTFjNTg1NGVkOGYxNzhkOTNiMjY0ZGJjOTU3ZTJiNmUxMDkzZjFhMWVhNyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdG9yZXMvc2NhbGFyU2V0U3RvcmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0b3Jlcy9zY2FsYXJTZXRTdG9yZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjFlODY1MWUxZWNjZDJiYjcxOTE0NDM1MWU0NDgwZWM1ZmY3NWE3ZjgyMDQxNmExZDQ3ZGYzNWMzMWIzZTVhNTBmZmIyMDRhNDE5OWNlY2I1NmQ5MTBjN2VlOTkzMjc1NTY2MDE1MmYxNThhNGEwZmJjYjc3OTZiY2JkOWYzNzg4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0b3Jlcy9zY2FsYXJXZWFrTWFwU3RvcmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0b3Jlcy9zY2FsYXJXZWFrTWFwU3RvcmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyZGU5ODg3NWRiNzBkOGMyZGQxOGYzMDk4YTQ4NWZkOGMxZTI2OWQ2ZTFkNDY5NjQ1YzRiNTI2MTBlYTY4N2JmMDQ1OWFhYzZjMzA3NDRhNjU0ZjY5MTJmMzk4OGQzMThiMWI4NzM3ZDc3NDBmY2IzYTY2ZmQzMDgwNzdhZmU3YSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdG9yZXMvc2NhbGFyV2Vha1NldFN0b3JlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdG9yZXMvc2NhbGFyV2Vha1NldFN0b3JlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYmI1NDA3OGNhMGNlMTA4MTE1NWUxMjU4MGFlYTUzZGQyNzU0MzRlNmYxODkwMWQ2MWJlNTc4ZDRmMDg4MmQ5NTIwYzJiN2U0NWViZjUwMmI3NDhkZWU4MDVhODBhMjEzZGM3ODczMzgwZGIxN2FiZTJkNjY2MTA5ZGFjMGU4YjQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RvcmVzL3N0b3JlLXV0aWxzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdG9yZXMvc3RvcmUtdXRpbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4OTZhMTExNWQzMjI0ODU0MjlmODhjNmQ1MDIxM2FmNDgwNGExODZlODIzNDFiY2NkMDdjYWEzYTVlMzBkYWYxNTA2MDIzODc1ZjMxYmZiYmU2YWU4OTJhNWMyY2E3YmEwOTY2NDRjZDNjMzM5MjJkNzljZTQxMTEyYjRlZDgwYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyNmMwMDZiYmU1NTE3ZDM5Y2Q1YzlmMzhhYTRhN2M2YTI3ZDFjNGFlOTAxMTA2NDU2NjBkMDhhMDUxM2NkNGMyY2Q0ZjgyOTMwNDViYzg5NmQ5Y2NkN2RkODI0OTZhNjgxODNmNGFiYmU0ZmNjYjRmZDA2OGE0YmMzMDZkMTJjZiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy9zd2luZ3NldC12YXQtdjAuMzAuMiI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy9zd2luZ3NldC12YXQiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy9zd2luZ3NldC12YXQtdjAuMzAuMiIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL3N3aW5nc2V0LXZhdC12MC4zMC4yIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvYXNzZXJ0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvYXNzZXJ0LXYwLjUuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2Fzc2VydC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVyLXByb3RvY29sIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXJuYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4yLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25hdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25hdC12NC4xLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2Rpc3QvbmF0LmVzbS5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zdG9yZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjguMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3dpbmctc3RvcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zd2luZy1zdG9yZS12MC44LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9zd2luZ1N0b3JlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdmF0LWRhdGEiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy92YXQtZGF0YS12MC40LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3hzbmFwIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMveHNuYXAtdjAuMTMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Jhc2U2NCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9iYXNlNjQtdjAuMi4yOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYmFzZTY0L2F0b2IuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYmFzZTY0LXYwLjIuMjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2F0b2IuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYmFzZTY0L2J0b2EuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYmFzZTY0LXYwLjIuMjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2J0b2EuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYmFzZTY0L2RlY29kZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9iYXNlNjQtdjAuMi4yOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZGVjb2RlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Jhc2U2NC9lbmNvZGUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYmFzZTY0LXYwLjIuMjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2VuY29kZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9iYXNlNjQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Jhc2U2NC12MC4yLjI4IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYmFzZTY0L3NoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYmFzZTY0LXYwLjIuMjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYnVuZGxlLXNvdXJjZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9idW5kbGUtc291cmNlLXYyLjQuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2J1bmRsZS1zb3VyY2UvZXhwb3J0ZWQuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYnVuZGxlLXNvdXJjZS12Mi40LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2V4cG9ydGVkLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2J1bmRsZS1zb3VyY2UvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2J1bmRsZS1zb3VyY2UtdjIuNC4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY2FwdHAiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY2FwdHAtdjIuMC4xOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NoZWNrLWJ1bmRsZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jaGVjay1idW5kbGUtdjAuMi4xNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY2hlY2stYnVuZGxlL2xpdGUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY2hlY2stYnVuZGxlLXYwLjIuMTQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2xpdGUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY2hlY2stYnVuZGxlL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jaGVjay1idW5kbGUtdjAuMi4xNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIvYXJjaGl2ZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9hcmNoaXZlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci9idW5kbGUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjguMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vYnVuZGxlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci9pbXBvcnQtYXJjaGl2ZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbXBvcnQtYXJjaGl2ZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIvaW1wb3J0LmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MC44LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2ltcG9ydC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIvbm9kZS1wb3dlcnMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjguMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vbm9kZS1wb3dlcnMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE2LjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ltcG9ydC1idW5kbGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vaW1wb3J0LWJ1bmRsZS12MC4zLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9pbml0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2luaXQtdjAuNS41MiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vaW5pdC9kZWJ1Zy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9pbml0LXYwLjUuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2RlYnVnLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2luaXQvbGVnYWN5LmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2luaXQtdjAuNS41MiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vbGVnYWN5LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2luaXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2luaXQtdjAuNS41MiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2luaXQvcHJlLWJ1bmRsZS1zb3VyY2UuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vaW5pdC12MC41LjUyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wcmUtYnVuZGxlLXNvdXJjZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9pbml0L3ByZS1yZW1vdGluZy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9pbml0LXYwLjUuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3ByZS1yZW1vdGluZy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9pbml0L3ByZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9pbml0LXYwLjUuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3ByZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjAuOC4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY0LjEuMjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NC4xLjIzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41MiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vc2VzLWF2YSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9zZXMtYXZhLXYwLjIuMzYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Nlcy1hdmEvZXhwb3J0ZWQuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vc2VzLWF2YS12MC4yLjM2IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9leHBvcnRlZC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9zZXMtYXZhL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9zZXMtYXZhLXYwLjIuMzYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby96aXAiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vemlwLXYwLjIuMjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3ppcC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vemlwLXYwLjIuMjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby96aXAvcmVhZGVyLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3ppcC12MC4yLjI4IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9yZWFkZXIuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vemlwL3dyaXRlci5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby96aXAtdjAuMi4yOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vd3JpdGVyLmpzIgogICAgICAgIH0sCiAgICAgICAgImFueWxvZ2dlciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJhbnlsb2dnZXItdjAuMjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vYW55bG9nZ2VyLmpzIgogICAgICAgIH0sCiAgICAgICAgImF2YSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJhdmEtdjUuMC4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9lbnRyeXBvaW50cy9tYWluLm1qcyIKICAgICAgICB9LAogICAgICAgICJhdmEvZXNsaW50LXBsdWdpbi1oZWxwZXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiYXZhLXY1LjAuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZW50cnlwb2ludHMvZXNsaW50LXBsdWdpbi1oZWxwZXIuY2pzIgogICAgICAgIH0sCiAgICAgICAgImF2YS9wbHVnaW4iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiYXZhLXY1LjAuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZW50cnlwb2ludHMvcGx1Z2luLm1qcyIKICAgICAgICB9LAogICAgICAgICJpbXBvcnQtbWV0YS1yZXNvbHZlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogImltcG9ydC1tZXRhLXJlc29sdmUtdjEuMS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJtaWNyb3RpbWUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAibWljcm90aW1lLXYzLjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXgiCiAgICAgICAgfSwKICAgICAgICAic2VtdmVyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlbXZlci12Ni4zLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NlbXZlci5qcyIKICAgICAgICB9LAogICAgICAgICIuL2V4cG9ydGVkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImV4cG9ydGVkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMTNmYzY2YTlmMGFhN2YwZTBmYzVkNGFkMDQ3NGZlNThiMTRkOWQ0N2ViMDU4ODQ0MjFjYWE4NGZiZGM2MjZjMWZjYTZkYTA4M2MxNTVhZWU0YjJiNGE2ZjRjN2QwNjJlZjU0ZTNkZDdlNWEyNzEwNjBiNmZmNmNmYTM3MDQ5MmUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdmF0cy90aW1lci90eXBlR3VhcmRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy92YXRzL3RpbWVyL3R5cGVHdWFyZHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyZjQxMDg3Y2ZkZjllN2U0ZjIzODBhOTM2ZmQ1NTVmYmQ2ZmRjNTAwZTgyNzY3MzUzNDc1MDkxNTdiYjAxMDAwOTg3YmU0OGQ1YzNmM2I0ZTMzODVhYzhhZGVjMDhjMTdhOTNjZDBmY2IwYzBkMzI2ZjhiODgwNWUwMDI1OWFjNyIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy92YXQtZGF0YS12MC40LjMiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvdmF0LWRhdGEiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy92YXQtZGF0YS12MC40LjMiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy92YXQtZGF0YS12MC40LjMiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9hc3NlcnQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9hc3NlcnQtdjAuNS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvYXNzZXJ0LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlcm5hbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjIuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3RvcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC44LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9mYXItY2xhc3MtdXRpbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2Zhci1jbGFzcy11dGlscy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImZlMWU0ZDFmZTNhNzJkNWI1YzllNzU1OTRhMDk5YmMzOGIyNjgxNmQyOGYxMGM0ZDliMWI0MDhmMjE0ZThhNmY5OTU2NmQxZjE4YmY4MDhmMDhlMDBkYjNiNDk5NTcwMDNmYjg0MjhkNTUxZmQyNGNlZjJiODYwYjI4ZTZjN2E0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImYwNGNjNDE2OTVmN2QyZDJkZTFhZTY5M2E1M2M4OTk0ZTUxZWExYTFhMjNlOGY4YjEyMDFjNzQ1MDljNTgyNWI0NDMzNGYyNWNhOTdiMDQ4OWI3MzgzZTQyNmZkM2I3YWU0ODVmMmNhMWI0YzE0MzNiMTViN2FkNDM2ZTY2N2U4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tpbmQtdXRpbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tpbmQtdXRpbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIwMDU5YWE1YTQ3NTg4ZDAwZTVkODUwMzg0MjdkOTM4NjhjMzg2OGEyZjJjNjA1MGNkYThhZDg4M2QzNDU2NDk4Nzc2ZjQ0ZTQwY2JiNmViZDI2MTkzNjEyZmQ2YWQ3ODc5YjgxMjAwMWUzZTUzMjM1ZWFjNmY1NjJiNTY1ZGU2YSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy92YXQtZGF0YS1iaW5kaW5ncy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdmF0LWRhdGEtYmluZGluZ3MuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyYTYwMmE5YTJkOTI3YmYxODViN2M5M2Y0NjViMTdjMzk1NDVmNTkyODBlNTU4YjBkNGVjMzFlYzRjYjZlYTQxMDA1MTc5YTlmNTg2ODk5NzVhNDM5ZjkxOWU0MzU2MDJiYTUwNTI4ODVjMzZlYTVlMjk4ZTcwMzU4NGQwYWRlNiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy96b2UtdjAuMjUuMyI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy96b2UiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy96b2UtdjAuMjUuMyIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL3pvZS12MC4yNS4zIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvYXNzZXJ0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvYXNzZXJ0LXYwLjUuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2Fzc2VydC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2VydHAiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9lcnRwLXYwLjE1LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2VydHAvZXhwb3J0ZWQuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9lcnRwLXYwLjE1LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2V4cG9ydGVkLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlcm5hbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjIuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbmF0LXY0LjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZGlzdC9uYXQuZXNtLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC41LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyL2V4cG9ydGVkLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9leHBvcnRlZC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N0b3JlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3RvcmUtdjAuOC4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zdG9yZS9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjguMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZXhwb3J0ZWQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zd2luZ3NldC12YXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zd2luZ3NldC12YXQtdjAuMzAuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3dpbmdzZXQtdmF0L2V4cG9ydGVkLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3dpbmdzZXQtdmF0LXYwLjMwLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2V4cG9ydGVkLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3dpbmdzZXQtdmF0L3NyYy92YXRzL3RpbWVyL3R5cGVHdWFyZHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zd2luZ3NldC12YXQtdjAuMzAuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL3ZhdHMvdGltZXIvdHlwZUd1YXJkcy5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3ZhdC1kYXRhIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvdmF0LWRhdGEtdjAuNC4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy92YXRzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvdmF0cy12MC4xMy4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9idW5kbGUtc291cmNlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2J1bmRsZS1zb3VyY2UtdjIuNC4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYnVuZGxlLXNvdXJjZS9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9idW5kbGUtc291cmNlLXYyLjQuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZXhwb3J0ZWQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYnVuZGxlLXNvdXJjZS9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYnVuZGxlLXNvdXJjZS12Mi40LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTYuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZmFyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Zhci12MC4yLjE0IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vaW1wb3J0LWJ1bmRsZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9pbXBvcnQtYnVuZGxlLXYwLjMuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MC44LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vZXhwb3J0ZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiZXhwb3J0ZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmZDI1NTE2NmUyNDhkODMwOTdkZjg4MTc2YmE4YjI1YTU5YzBjYjI4OTIwY2U2YmM0YjhlNWZiMGJlNGI0MzY5MzYxYjQwZWQ1YWJkMzk1NDQxOTE2ZWRiZDQzMGI3MDFlYjlkZmRkY2QxMWEzNWRmOWJlNDE4OWQ1YjYwOTlmMiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdEZhY2V0L3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdEZhY2V0L3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYzc5NGFlMTg2YTZhNjE1YzVhNTM3Njg5YzU1MzZmNmNlMjgxMjUxMGQ4NWRhYTE2YTA3Mzg0NGMzZmEzZTUwMWU5OGIwNWQ4YTljYmUxODRmYzgzZjExZTZiY2NiYzJkYjFjMTYyM2IxMDZkYzNkM2EzNjI3ZjJlN2E2ODY0NTQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RTdXBwb3J0L3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdFN1cHBvcnQvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIwMTJmOTRhMDAyZjEwYzhhZWNjNWViZmFiYzViMjExYWZhN2Q2NWY1MGMyYWNhZDY4NDIyZGFjMTFkOWVkMjg4MGMzZGVjYTMwNDJkNDJjMzVjYmY4MzZkYWM0NjQ3N2U0ZTk3ZGU5ODVmMDY0ZjJjYTgyMjBiYWU5ZDdjNWYxNCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdHMvY2FsbFNwcmVhZC90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RzL2NhbGxTcHJlYWQvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiNTc1MDAwMjk1Yzk1MzkzN2YxMGZiNWUzODNjODQzYmM3MTY0YTQ5MDc1YzUzZTE5Y2JhNDQ1YzFmZDVlNDFmZWEzMmQxYzI3NWFmNTRjNGNhZDFjNDlmNGE3NzE2YTljODU0MDYxMjY3YmY3MGQ1NzRlYmNhZWQ4ZDFjOTJiYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdHMvZXhwb3J0ZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0cy9leHBvcnRlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImM0NjUxOGZkZjFjODVhMzljZjBmNTdkZTFlMWJhNmE3N2FjMTY3ZTMyYTg0YTVlMjg3OGQxY2I5NWMyMTA4NzkyYjBmMThkYWJhZTZmZDA0ZTI0NWZiY2IwZDRkYTg3YTUwMmE5YmY3YzA3ZTkyZjBkMDgyZTI4MzhhYTlhOGM4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0cy9sb2FuL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdHMvbG9hbi90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjJjNjU3NDJlNWI4YmE3NjM4ZTU4ZGVjYjIyNmUwZTk2YjVmYzAxOWNlYzQ5YWM1YmQ3MTdmNGExMjM3NjljZDdlNTgxNGEwNDJlOTc4ODMxYWVkMzRlZjc2ZmNkNmNhMDNmNzljMjU4ZWNiNjY0MzA3MWJjYWVmNGQ2MTQ4YWMzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0cy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RzL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODFkNDI5YTA4OWNhNWFjMzM1ZjZhOTBkMjFiNTMxOGZkZTg4NGE5ZDIzNDU1MzM0Y2U1YjAxZWNmOTljZTA5Nzk4OThhYTQ3ZTBjMmQzN2I2YzhmMjQxMmQ4M2Q0ZDkzMDk5MWIwMmUwNTBhMzJiYzg5NzM2NDgwYTE0NDg3MTAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZUd1YXJkcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZUd1YXJkcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjM1OGJhZTNmNGM2MTdlYzE1YTBjYmYzYmZmM2YxMmUxZWJmNDI1OGI3YmVmYWEzMGEyNDY5ZTI4YzMxOGExNTdmMjVkNjAzMTFiMTFjMDMwNzc2YmQ5ZGI1MmNjZmVmYTYyYjdkN2FiYjAwNmRhYzY3NzY2NGQ5MzliMTEwZjEwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjg3ODdmNDc3NGFlYmMxOGQ2Njk1ZTQxMmU4ZDg2ZmQ4YjUxMDE3ZGEwODE4MGQxYThjNWVhMTY4NDY0MTE2ZjM4YjI4NDBkZjYzNjU4ZjFhNTIwODI5YzE1Y2FiN2ZjYjRjZGY5OTc4ZTdlYjg5MWVjNjQzYzBlYzFiN2E0ZTYyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3pvZVNlcnZpY2UvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3pvZVNlcnZpY2UvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3OTQwOWY0YWRkYWEzYzBkMWFkNWRmM2E5N2I3Njc1YTI3Y2YxN2Y3NTE5NDVjN2EwOTNmZmNiOWJjNGVhMzk3NjIxYTExZGY4MDEwNjMwNzU5NmY4ZGRhZTc4NTI4ZDU0MWIwNWI3MTk5NTUwNzg0OGIzMjIzZWIzMDUwNGIzNyIKICAgICAgICB9LAogICAgICAgICIuL3Rvb2xzL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInRvb2xzL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTIyOGEzYjRiNjE2ZjU5YjYwMzI2ZGE0MjA1ODExOWI2MWJhYmRiOGIzMTE2NjUxZmQ3YjJjNjY5MjA2Y2IxOWRmZThhY2IyYzYxZGQ1ZDg4ZDY1OTVhOTQ0N2U4M2FlYzZkOTkxMjQzZDU2ODVkZDRhNDViMTM1ZWFmNGQyZGUiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTYuOCI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZCIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE2LjgiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNi44IiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvRS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvRS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImY1NWZjODk5MzQzNjFiZGYyNTJhMTA0Y2Q2ZmI0ZmE3YmE5NGVkMjdlOTEyZGFiZTRiZmUyN2FmYzQwNjIxNTQ1NzExNjk3N2Q2ODY5ODdkMDYyMWI1NzhlZDExZjgwMTFiYTYyM2U4N2UwMDEwYmUxMWZiYWFiZDE1YWU0ZDM5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL25vLXNoaW0uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL25vLXNoaW0uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4YzY4NTNiYTFlNTQ2ZWZlYzg1YjJmNjhjOTM1OGQxNzQ3OWFjYWM5M2ZkYTllZTA0NGUyZmU4MDA2MDdlMWE2YjYzMzMwNmM1OTdmOTI5ZmRhYzhmNTRhY2RmZTY0YWJkYjUxYjUzMDQ0ZDJkMDhiYWQ5MGEyZGQ2ZWExNzgwMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90cmFjay10dXJucy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHJhY2stdHVybnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1MjJhYjA3NGY1MTYwM2FiZDA2ZTNiMTk2ZmVhYjFjYzE4MjZiMWEyNjM3OGQwMjViYmIzZGQyNWFlNjY0NDMwOTE1NTM4ZjBhNThhZjZiZDI5N2Y1MWJiMWYzZTBhNjJjMzcwN2FkZTMzN2I5ZmI2YmZkOGE4ZmEzMDg0YTFkNCIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vZmFyLXYwLjIuMTQiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL2ZhciIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9mYXItdjAuMi4xNCIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9mYXItdjAuMi4xNCIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2ludGVyLXByb3RvY29sIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNi44IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbm8tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjAuOC4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyODY4ZDgzYTU1YTYzZDE2YmI1NDA3YjIzODc3NThhMTI2NmI1NmNjNThlNGFjZmFjOGE2ZTEyYTAzNWY1ODllYjczZjFiYTIzMWRhZDEzZDVjNjVjZTQ4ZWViMmQ2MjYyODE0MjExODQyZGYzOTFjYmM0NGJlYmM2ZTAwMGMyMiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vbWFyc2hhbC12MC44LjEiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL21hcnNoYWwiLAogICAgICAibGFiZWwiOiAiQGVuZG8vbWFyc2hhbC12MC44LjEiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vbWFyc2hhbC12MC44LjEiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9pbnRlci1wcm90b2NvbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTYuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NC4xLjIzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjQuMS4yMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkOWNlZjM2YTIxNzE1MDA4YWJhNWU5Mjk2NTNmMjcyMDhjNjZiYjc5OGY0MGNiNmQzMzJkZmU0MzlkZGFjYWRjNTYyMmQ1YzAwOGY3NjU3MjQyMTcxMjA5NjdjYmU5MjQ4MGZmMzU2NmYxZDkyYzIxZGI4Y2E2ZjhlMGY5ZGYyMSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9kZWVwbHlGdWxmaWxsZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2RlZXBseUZ1bGZpbGxlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQzOGEwMmJkZGY2ZWRhNWY4OWRjMTc5MjQ5M2JlZjMwNWQwYzg2OTlmYTVjZDFhNWQ0ZWZkOTgzNmZjNGU5ZjVlYjJkZGQ4NmYxM2NjMWI0NjcxNDQyM2U4ZjhhNTlkYTJlMDAzZDM4MmU1ZTg1YTBiNzM3OWY3YWMxYjNjMGI5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2VuY29kZVRvQ2FwRGF0YS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZW5jb2RlVG9DYXBEYXRhLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODIzY2U5ZjYwMTFkMjUxMTRhZmZkZGM3ZmNjYzI5NzdlYmMxNTM0NzA3MGY2MjNlZGNlNTY0NzM2NDdjYjA5NGZjYjE3ZGI4MzBlNjk0ODNhNjE3ZjFmM2JhN2RjMWEzZDk1OGM5OThhMTcyYjY4MDExYzYzNGRiMjFlY2E1YTQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZW5jb2RlVG9TbWFsbGNhcHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2VuY29kZVRvU21hbGxjYXBzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNWI4NWRiZTRjZDU5N2RiMjg1YWFkNTI0ZTIxNGNjOWE5MzY1MWRmM2Q4Nzg5MDBlY2NhNjk4N2M5MDFmNjg1MTg3ZWM1YTllMjYxZjg3YzYxMWVlYjdmYWJjODU1MzYzMjk1MzA2ZTliNTNmMWQ5N2Y0ZjZiMDJlNGJiZDMzZTgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaGVscGVycy9jb3B5QXJyYXkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2hlbHBlcnMvY29weUFycmF5LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZjJlZDM5MzhmMWVjMTgwOTYxZjk2MTFkODMzNDI2N2IyODlmOWY3YWMyMTdkYTU1NjE5MGU3NTdkODVlYzhjNWZiOTgxYzg1YzU1ZWQ2N2E2ODZiZjVmYTUyMDUzMDZhY2U1NzY5YTkyZThmN2FlZjE4ZjUxYTUwMDNjMTRkNGUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaGVscGVycy9jb3B5UmVjb3JkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9oZWxwZXJzL2NvcHlSZWNvcmQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxMjdiYmRlNjlhNjg1ODY2NzZhNTExMmY1NDJlNzk3ZjU4MDNkZmFkNTgyYTY2ZTBjZDYxNDU5ODg0OTU0MzkzOGYxYTg5MWI2OGU0NTk4MWQxMjIyMjg1NThhNmQwOWI2N2VhYWE0ZWYyYmMzMGJiMjhiNzgwZTgxYWY2MTI1ZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9oZWxwZXJzL2Vycm9yLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9oZWxwZXJzL2Vycm9yLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODFmZmE4OGE2NjFiY2Q5MTc0OWMxYjRkZjVlYThmMmE3ZjhjNTM0OGI3ZDg0ZWFiMzNjNDA2ZDU2NjkyNmViOGNkNjVkNDYwZjIxMDg5ZmZlZmE5MzRjZDc0NTBhNzgzNjAyNzc0YWM3MGU2NTNhNDE1MTkxZDFiMzE2YTk1YmIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaGVscGVycy9pdGVyLWhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2hlbHBlcnMvaXRlci1oZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMmQxMTFmMWI2YzE4OWU1MjBhY2UzNWVkOGUwYmJhNmFhNmQyMDdlZTg3ODFmNmE3Njk4ODEzZDU2MWM3ZWM5YWRmYTJjY2JmNGY4ZmE1MjE3NzVlZDJhMjEwYzQ0N2UwMTc0YjdhMzZlOGZmYmQwZjBlYzc3NzI3Y2RkMWM4MjAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjc0ZTIwNjI2MzAyNzZmZWIzNTFkMWNkNDM3MzI0MzIwZWRkMDliOWUzYjI3N2I1Mjc4Nzc5ZTUxN2M5NWYwNjhmNmZjMzEzOGFhODI3OTA4MjBhOGZkMzg5OTA3NTNjNmUyZDJlNDQ2NTlkZDhlMjJlM2UzODEyYTU4YzczNGQyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2hlbHBlcnMvcmVtb3RhYmxlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9oZWxwZXJzL3JlbW90YWJsZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjBjYjUzMmNiZTMyNmY4NmViNGNjZDM1Mjk5MTJiYWU1NTQ5MjI0OGE0NTU4OWE4MDcwNzJjNWMzODRiZjQ3NGM0ZDZlMTkwZGE0MzNmNTZiYmIyMGNhNjM2ZDYyNmI2YzBhY2E0NTc2NmRjYjJlMWQ2Nzk5ZWE5NDU5NTU4NjA5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2hlbHBlcnMvc2FmZS1wcm9taXNlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9oZWxwZXJzL3NhZmUtcHJvbWlzZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImRhOTIzYzc4ODFkZTYwMTEwY2FhOTNlNmRmOWQwZDRmNzViZDUwZjkwYjM1YzgyM2JmM2ZhOGU1MTc3MDkyZTNjNzEyNzlmOTNkZGYyNTExNjYyZTQ5NjNiZWM3MmM0ZTk1OGE1MjI0YjJmNzY3ZDQxZTRjZGMxYzBiYjVkMTg2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2hlbHBlcnMvc3ltYm9sLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9oZWxwZXJzL3N5bWJvbC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImJjZjE3NzYxMmZkNzJlY2EwZTNlNWNjZTE4OTRjZDRiODQwYWRjMzQ0NTgwODk3Zjk3MDYyZDI3OGYwNTRjN2I3MzA0NWY1NDRiODM3ZDQ0YTM4YTc4NWE5ODIzZjU2MTdlYWEzMDg3ODJiOWMyYWZiMTgwZTMwZTAwNTk5MzNmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2hlbHBlcnMvdGFnZ2VkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9oZWxwZXJzL3RhZ2dlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjA1OTBmMzJkYTNlZjNjMzU2NjI0MDEyMGY1NjJmNTZmMDJhN2E0NWE3ZDJjOGZhMDFkNmYyNmE0MWE1NzFkNWQzYzU0ODEzMWYwOTExZGFiNmM1NWYzNTY3M2I2MmRhOTQ4MmQ0OTFkM2NjYzIwNDAwYWY2NmNhMmEyM2JmNmI5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21ha2UtZmFyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYWtlLWZhci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjBkMjlhNjhmZDJkNDk3MTc1NmRjYWQzNDdhYTViZjEyNGQyZDdmNGNmYmY3ZWI1NWMyM2M5NjQ5ODA0YWRjMjE4YWUzMDgwY2QxMjQwY2MzYWYxZjdmYzA0ZjVjMzA2MjI0MDZhNWMxYzFmMWY3MDg0ZDI3ZGQyZTU5OTZiZjUzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21ha2VUYWdnZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21ha2VUYWdnZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzMGJlNmFhMjdhMGE2YjEyZDg2Njc4NTkxMDE4ZDEyZTljODgxYTc0ZmVkM2RkY2UxZTc3MzNlMjk5ODM1NjYwMDUyZGQ0MmQ5NmY2NWE0YmQ1NjZiMmExZmU4ZTJhZWY1ZWQ1M2ZiNDkwNTBiNzk5NDU5Yjc0NmQ0Njc1MjYwZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYXJzaGFsLWp1c3Rpbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFyc2hhbC1qdXN0aW4uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzNzNiYzExMDFhNWQxZTE4NjM4YzY5NGZlYTZlMDdlMTJmMDAxYzZiNDQ3YWQzMTBhNWYxMWQ2M2ZlNThiMTU5NDgzN2I5ZDQ5YTc4ZjNkMmFjM2M5OThlMDg0ZDk3ZTcwM2EzMmUwOWIyNjZkYzVjMjkyYzYyZGQzY2NlNWU0OCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYXJzaGFsLXN0cmluZ2lmeS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFyc2hhbC1zdHJpbmdpZnkuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4NWQ2MzZhY2Y4OWUzYzBkMDg3Y2YxNTRiZDQzNDc2ZDk4NjBmZmM1MmQ3OWYxYzI5ZmQzYzg2ZWNiZTg2MGRmNmJjNjIyOGE0M2NhMzhhM2Q3NmQ5N2QxNTUwOTRhODk3Njk5Y2Q0ZjdhYTRkMmM1ZWIyZTIyYTY3ZTVkMmRhNyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYXJzaGFsLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXJzaGFsLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMzRjYTBlMWRhNWY0ZjgzZmJmY2Q1OWIzYjdhODhiZWRkNTk1OGNlYTZmNmMzYzgyN2U3NzQ5ZTFlMzFhOTE2MzA2Yzg4ZmM3MThlMmNkNDYwMjRiNGNlMTVmM2M3YTQxY2FjZmVmZGFhMDllMzQzZWYyOTJiYmE2NDkyMmQ1ODciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGFzc1N0eWxlT2YuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3Bhc3NTdHlsZU9mLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTFmMGRmZDVlOTkzNzY2MmMyN2UxOTRhYzU5YTk4Y2VlMjJkNGQ5ODhkYWM1MThmOGI2YzY5YjYyMmFhMWY4NTYxNTZlYjc2ZTE0YmMzYzQzZmVhM2QwZDE4YjhiZTlhN2JkY2NlNzk0NjBkNThlOTM2MGQxNTYxOGJkMWQxZWEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZUd1YXJkcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZUd1YXJkcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImI1ODM5N2U4NmI0NjBjMGQ2MmQ3ODk4ZjljMzhhOTAzNDljMTJmYmI0NmQzY2ExMmQwZTgzZjg2YzM4ZTg2MDg5Njc4M2EyN2IzMzRhMzE0ODhlYzRkZmRjYjVjYjBkYWI0YzVhNTg5M2U0NDFjNzEwODhjMTliYTQ0MTczMzI4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjU2N2VmMWIxYjE2MmQwMjhhZDQ5MzgyOGNlM2VkNDUwOTM4ZDBiZmZkNGY4Y2VlMWQ3NjE4ZDU5OTcwOWFjZmM0YjkyNWUwMzc5NWU4NjFkN2RiYjliODlmMDE0N2VlYzJiMjFmMTk0NGY3YTkyOTcwMzU1NTAyNWY4NjI4N2U2IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9uYXQtdjQuMS4yMyI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vbmF0IiwKICAgICAgImxhYmVsIjogIkBlbmRvL25hdC12NC4xLjIzIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL25hdC12NC4xLjIzIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNWNkNjc5Mjg3NTAwMWRlZGRhNTUxY2U5MjRlZjFhM2UyZDA2M2Q1Zjc3NmZjM2FkZjQ3NDJkMzM2MjJkNDUxYzU0NTUzNDY2ZWM4ZGY0MjhlMWU3M2JiMGQyNzQyMzIxNmU0MzlhYjE2ODUzNDk4M2E4OGU5MzhlOTRkOTFmMzQiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL3Byb21pc2Uta2l0IiwKICAgICAgImxhYmVsIjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41MiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2ludGVyLXByb3RvY29sIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgInNlcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJzZXMtdjAuMTguMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAic2VzL2xvY2tkb3duIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MC4xOC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJzZXMvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MC4xOC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjkyZmY5OGQ1MmVkZGYzOThjZjk2YWNiMTA1OWJlZDAyN2Y0ODZlNWJkZDcxYzA1NzZiMjhhZmEyMTE5ZGE2Yjg0MWMzODlkMDJiMzMxMDdkOGFiYTBhZWU0OTI1ZTYzZmI3YzM1OGE2YTQ1ZmE0YWMxYWU3NzY1ODAyMDU2YWIzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2lzLXByb21pc2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2lzLXByb21pc2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlYWZhYjE5Y2I5ZDczMjM3YmI2YzVmNTY4ZTU3ODY3NTFhN2FlZWY5NjYzZjJhMzBjNGI4ZjQ2NWUyMDEzOWYzZGEzNDZlYjJlNDEwMzg2ZjJkOTkyOWRmMzNjNTBmYThmMjQzNzMzZDc0ZjhiMGNmYzljOGI5ZjMxOGM0YWMwZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tZW1vLXJhY2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21lbW8tcmFjZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjZlZGI2ZThhZjFjYzkxYzY2MzJhYjI2ZTU4NjkwOGM5N2NhNmYyNmM5N2VhZTEzNjZjMGYwNTc3OTc5MTEzYjE1YzViYTRiMzQzZDUxOWE5ZWQwNWRjZmMyMTA3OTAxNDhkN2E3YzY5ZDllNjYyNDQ2N2I2NTlkMGM2ZTI5MTMzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImNjODNhM2EzZTk2ZTZjNTlmMTllZWY1OWY3ZTQxN2RiNzViZjFlNmQxZGM3NmFhZGRkMmJlNDYzZTVmNGU0NzkyOWNjMWNiYjMzZjkxY2FiODZjMTc5NGY1Zjg0MDNiYzQ3ZTMzZTI2ZDExODYwM2M3ZDA1MjgxZjQ1MTdhNGFjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjU2N2VmMWIxYjE2MmQwMjhhZDQ5MzgyOGNlM2VkNDUwOTM4ZDBiZmZkNGY4Y2VlMWQ3NjE4ZDU5OTcwOWFjZmM0YjkyNWUwMzc5NWU4NjFkN2RiYjliODlmMDE0N2VlYzJiMjFmMTk0NGY3YTkyOTcwMzU1NTAyNWY4NjI4N2U2IgogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfVBLAwQKAAAAAAAAAAAAAe3aYBoLAAAaCwAAIwAAAEBhZ29yaWMvYXNzZXJ0LXYwLjUuMS9zcmMvYXNzZXJ0LmpzeyJpbXBvcnRzIjpbIi4vdHlwZXMuanMiXSwiZXhwb3J0cyI6WyJGYWlsIiwiTm9uTnVsbGlzaCIsImFuIiwiYXNzZXJ0IiwiZGV0YWlscyIsImlkZW50Q2hlY2tlciIsIm1ha2VBc3NlcnQiLCJxIiwicXVvdGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3R5cGVzLmpzXCIsIFtdXV0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShhbiwgJ25hbWUnLCB7dmFsdWU6IFwiYW5cIn0pOyRo4oCNX29uY2UuYW4oYW4pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuQ2hlY2tlcn0gQ2hlY2tlciAqL1xuXG5jb25zdHtmcmVlemV9PU9iamVjdDtcblxuLyoqIEB0eXBlIHtBc3NlcnR9ICovXG5jb25zdCBnbG9iYWxBc3NlcnQ9Z2xvYmFsVGhpcy5hc3NlcnQ7JGjigI1fb25jZS5nbG9iYWxBc3NlcnQoZ2xvYmFsQXNzZXJ0KTtcblxuaWYoZ2xvYmFsQXNzZXJ0PT09dW5kZWZpbmVkKXtcbnRocm93IG5ldyBFcnJvcihcbiBgQ2Fubm90IGluaXRpYWxpemUgQGFnb3JpYy9hc3NlcnQsIG1pc3NpbmcgZ2xvYmFsVGhpcy5hc3NlcnQsIGltcG9ydCAnc2VzJyBiZWZvcmUgJ0BhZ29yaWMvYXNzZXJ0J2ApO1xuXG4gfVxuXG5jb25zdCBtaXNzaW5nPVtcbidmYWlsJyxcbidlcXVhbCcsXG4ndHlwZW9mJyxcbidzdHJpbmcnLFxuJ25vdGUnLFxuJ2RldGFpbHMnLFxuJ0ZhaWwnLFxuJ3F1b3RlJyxcbidtYWtlQXNzZXJ0J10uXG5maWx0ZXIoKG5hbWUpPT5nbG9iYWxBc3NlcnRbbmFtZV09PT11bmRlZmluZWQpO1xuaWYobWlzc2luZy5sZW5ndGg+MCl7XG50aHJvdyBuZXcgRXJyb3IoXG4gYENhbm5vdCBpbml0aWFsaXplIEBhZ29yaWMvYXNzZXJ0LCBtaXNzaW5nIGdsb2JhbFRoaXMuYXNzZXJ0IG1ldGhvZHMgJHttaXNzaW5nLmpvaW4oXG4nLCAnKVxuIH1gKTtcblxuIH1cblxuY29uc3R7ZGV0YWlscyxGYWlsLHF1b3RlLG1ha2VBc3NlcnR9PWdsb2JhbEFzc2VydDskaOKAjV9vbmNlLmRldGFpbHMoZGV0YWlscyk7JGjigI1fb25jZS5GYWlsKEZhaWwpOyRo4oCNX29uY2UucXVvdGUocXVvdGUpOyRo4oCNX29uY2UubWFrZUFzc2VydChtYWtlQXNzZXJ0KTtcblxuXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7VCB8IG51bGwgfCB1bmRlZmluZWR9IHZhbFxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHREZXRhaWxzXVxuICogQHJldHVybnMge1R9XG4gKi9cbmNvbnN0ICAgICAgICBOb25OdWxsaXNoPSh2YWwsb3B0RGV0YWlscz0gYHVuZXhwZWN0ZWQgJHtxdW90ZSh2YWwpfWApPT57XG5pZih2YWwhPW51bGwpe1xuLyogVGhpcyBgIT0gbnVsbGAgaWRpb20gY2hlY2tzIHRoYXQgYHZhbGAgaXMgbmVpdGhlciBgbnVsbGAgbm9yIGB1bmRlZmluZWRgLiovXG5yZXR1cm4gdmFsO1xuIH1cbmFzc2VydC5mYWlsKG9wdERldGFpbHMpO1xuIH07JGjigI1fb25jZS5Ob25OdWxsaXNoKE5vbk51bGxpc2gpO1xuaGFyZGVuKE5vbk51bGxpc2gpO1xuXG4vKipcbiAqIFByZXBlbmQgdGhlIGNvcnJlY3QgaW5kZWZpbml0ZSBhcnRpY2xlIG9udG8gYSBub3VuLCB0eXBpY2FsbHkgYSB0eXBlb2YgcmVzdWx0XG4gKiBlLmcuLCBcImFuIE9iamVjdFwiIHZzLiBcImEgTnVtYmVyXCJcbiAqXG4gKiBAZGVwcmVjYXRlZFxuICogQHBhcmFtIHtzdHJpbmd9IHN0ciBUaGUgbm91biB0byBwcmVwZW5kXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgbm91biBwcmVwZW5kZWQgd2l0aCBhL2FuXG4gKi9cbmZ1bmN0aW9uIGFuKHN0cil7XG5zdHI9IGAke3N0cn1gO1xuaWYoc3RyLmxlbmd0aD49MSYmJ2FlaW91QUVJT1UnLmluY2x1ZGVzKHN0clswXSkpe1xucmV0dXJuIGBhbiAke3N0cn1gO1xuIH1cbnJldHVybiBgYSAke3N0cn1gO1xuIH1cbmZyZWV6ZShhbik7XG5cblxuLyoqXG4gKiBJbiB0aGUgYGFzc2VydEZvb2AvYGlzRm9vYC9gY2hlY2tGb29gIHBhdHRlcm4sIGBjaGVja0Zvb2AgaGFzIGEgYGNoZWNrYFxuICogcGFyYW1ldGVyIG9mIHR5cGUgYENoZWNrZXJgLiBgYXNzZXJ0Rm9vYCBjYWxscyBgY2hlY2tGb29gIHBhc3Nlc1xuICogYGFzc2VydENoZWNrZXJgIGFzIHRoZSBgY2hlY2tgIGFyZ3VtZW50LiBgaXNGb29gIHBhc3NlcyBgaWRlbnRDaGVja2VyYFxuICogYXMgdGhlIGBjaGVja2AgYXJndW1lbnQuIGBpZGVudENoZWNrZXJgIGFjdHMgcHJlY2lzZWx5IGxpa2UgYW5cbiAqIGlkZW50aXR5IGZ1bmN0aW9uLCBidXQgaXMgdHlwZWQgYXMgYSBgQ2hlY2tlcmAgdG8gaW5kaWNhdGUgaXRzXG4gKiBpbnRlbmRlZCB1c2UuXG4gKlxuICogQHR5cGUge0NoZWNrZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBpZGVudENoZWNrZXI9KGNvbmQsX2RldGFpbHMpPT5jb25kOyRo4oCNX29uY2UuaWRlbnRDaGVja2VyKGlkZW50Q2hlY2tlcik7XG5oYXJkZW4oaWRlbnRDaGVja2VyKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhc3NlcnQiOlsiZ2xvYmFsQXNzZXJ0Il0sImRldGFpbHMiOlsiZGV0YWlscyJdLCJGYWlsIjpbIkZhaWwiXSwicXVvdGUiOlsicXVvdGUiXSwicSI6WyJxdW90ZSJdLCJtYWtlQXNzZXJ0IjpbIm1ha2VBc3NlcnQiXSwiYW4iOlsiYW4iXSwiTm9uTnVsbGlzaCI6WyJOb25OdWxsaXNoIl0sImlkZW50Q2hlY2tlciI6WyJpZGVudENoZWNrZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA4m9OmTgvAAA4LwAAIgAAAEBhZ29yaWMvYXNzZXJ0LXYwLjUuMS9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBAdHMtY2hlY2sqL1xuLyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIi8+Ki9cblxuLyogQmFzZWQgb24qL1xuLyogaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9TRVMtc2hpbS9ibG9iL21hc3Rlci9wYWNrYWdlcy9zZXMvc3JjL2Vycm9yL3R5cGVzLmpzKi9cbi8qIENvb3JkaW5hdGUgZWRpdHMgdW50aWwgd2UgcmVmYWN0b3IgdG8gYXZvaWQgdGhpcyBkdXBsaWNhdGlvbiovXG4vKiBBdCBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzI3NzQqL1xuLyogaXMgYSByZWNvcmQgb2YgYSBmYWlsZWQgYXR0ZW1wdCB0byByZW1vdmUgdGhpcyBkdXBsaWNhdGlvbi4qL1xuXG4vKipcbiAqIEBjYWxsYmFjayBCYXNlQXNzZXJ0XG4gKiBUaGUgYGFzc2VydGAgZnVuY3Rpb24gaXRzZWxmLlxuICpcbiAqIEBwYXJhbSB7Kn0gZmxhZyBUaGUgdHJ1dGh5L2ZhbHN5IHZhbHVlXG4gKiBAcGFyYW0ge0RldGFpbHM9fSBvcHREZXRhaWxzIFRoZSBkZXRhaWxzIHRvIHRocm93XG4gKiBAcGFyYW0ge0Vycm9yQ29uc3RydWN0b3I9fSBFcnJvckNvbnN0cnVjdG9yIEFuIG9wdGlvbmFsIGFsdGVybmF0ZSBlcnJvclxuICogY29uc3RydWN0b3IgdG8gdXNlLlxuICogQHJldHVybnMge2Fzc2VydHMgZmxhZ31cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEFzc2VydE1ha2VFcnJvck9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nPX0gZXJyb3JOYW1lXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0TWFrZUVycm9yXG4gKlxuICogVGhlIGBhc3NlcnQuZXJyb3JgIG1ldGhvZCwgcmVjb3JkaW5nIGRldGFpbHMgZm9yIHRoZSBjb25zb2xlLlxuICpcbiAqIFRoZSBvcHRpb25hbCBgb3B0RGV0YWlsc2AgY2FuIGJlIGEgc3RyaW5nLlxuICogQHBhcmFtIHtEZXRhaWxzPX0gb3B0RGV0YWlscyBUaGUgZGV0YWlscyBvZiB3aGF0IHdhcyBhc3NlcnRlZFxuICogQHBhcmFtIHtFcnJvckNvbnN0cnVjdG9yPX0gRXJyb3JDb25zdHJ1Y3RvciBBbiBvcHRpb25hbCBhbHRlcm5hdGUgZXJyb3JcbiAqIGNvbnN0cnVjdG9yIHRvIHVzZS5cbiAqIEBwYXJhbSB7QXNzZXJ0TWFrZUVycm9yT3B0aW9ucz19IG9wdGlvbnNcbiAqIEByZXR1cm5zIHtFcnJvcn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRGYWlsXG4gKlxuICogVGhlIGBhc3NlcnQuZmFpbGAgbWV0aG9kLlxuICpcbiAqIEZhaWwgYW4gYXNzZXJ0aW9uLCByZWNvcmRpbmcgZGV0YWlscyB0byB0aGUgY29uc29sZSBhbmRcbiAqIHJhaXNpbmcgYW4gZXhjZXB0aW9uIHdpdGgganVzdCB0eXBlIGluZm9ybWF0aW9uLlxuICpcbiAqIFRoZSBvcHRpb25hbCBgb3B0RGV0YWlsc2AgY2FuIGJlIGEgc3RyaW5nIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICogd2l0aCB0aGUgbm9kZWpzIGFzc2VydGlvbiBsaWJyYXJ5LlxuICogQHBhcmFtIHtEZXRhaWxzPX0gb3B0RGV0YWlscyBUaGUgZGV0YWlscyBvZiB3aGF0IHdhcyBhc3NlcnRlZFxuICogQHBhcmFtIHtFcnJvckNvbnN0cnVjdG9yPX0gRXJyb3JDb25zdHJ1Y3RvciBBbiBvcHRpb25hbCBhbHRlcm5hdGUgZXJyb3JcbiAqIGNvbnN0cnVjdG9yIHRvIHVzZS5cbiAqIEByZXR1cm5zIHtuZXZlcn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRFcXVhbFxuICogVGhlIGBhc3NlcnQuZXF1YWxgIG1ldGhvZFxuICpcbiAqIEFzc2VydCB0aGF0IHR3byB2YWx1ZXMgbXVzdCBiZSBgT2JqZWN0LmlzYC5cbiAqIEBwYXJhbSB7Kn0gYWN0dWFsIFRoZSB2YWx1ZSB3ZSByZWNlaXZlZFxuICogQHBhcmFtIHsqfSBleHBlY3RlZCBXaGF0IHdlIHdhbnRlZFxuICogQHBhcmFtIHtEZXRhaWxzPX0gb3B0RGV0YWlscyBUaGUgZGV0YWlscyB0byB0aHJvd1xuICogQHBhcmFtIHtFcnJvckNvbnN0cnVjdG9yPX0gRXJyb3JDb25zdHJ1Y3RvciBBbiBvcHRpb25hbCBhbHRlcm5hdGUgZXJyb3JcbiAqIGNvbnN0cnVjdG9yIHRvIHVzZS5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5cbi8qIFR5cGUgYWxsIHRoZSBvdmVybG9hZHMgb2YgdGhlIGFzc2VydFR5cGVvZiBmdW5jdGlvbi4qL1xuLyogVGhlcmUgbWF5IGV2ZW50dWFsbHkgYmUgYSBiZXR0ZXIgd2F5IHRvIGRvIHRoaXMsIGJ1dCovXG4vKiB0aGVtcyB0aGUgYnJlYWtzIHdpdGggVHlwZXNjcmlwdCA0LjAuKi9cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydFR5cGVvZkJpZ2ludFxuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcGFyYW0geydiaWdpbnQnfSB0eXBlbmFtZVxuICogQHBhcmFtIHtEZXRhaWxzPX0gb3B0RGV0YWlsc1xuICogQHJldHVybnMge2Fzc2VydHMgc3BlY2ltZW4gaXMgYmlnaW50fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydFR5cGVvZkJvb2xlYW5cbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHBhcmFtIHsnYm9vbGVhbid9IHR5cGVuYW1lXG4gKiBAcGFyYW0ge0RldGFpbHM9fSBvcHREZXRhaWxzXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzcGVjaW1lbiBpcyBib29sZWFufVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydFR5cGVvZkZ1bmN0aW9uXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7J2Z1bmN0aW9uJ30gdHlwZW5hbWVcbiAqIEBwYXJhbSB7RGV0YWlscz19IG9wdERldGFpbHNcbiAqIEByZXR1cm5zIHthc3NlcnRzIHNwZWNpbWVuIGlzIEZ1bmN0aW9ufVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydFR5cGVvZk51bWJlclxuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcGFyYW0geydudW1iZXInfSB0eXBlbmFtZVxuICogQHBhcmFtIHtEZXRhaWxzPX0gb3B0RGV0YWlsc1xuICogQHJldHVybnMge2Fzc2VydHMgc3BlY2ltZW4gaXMgbnVtYmVyfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydFR5cGVvZk9iamVjdFxuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcGFyYW0geydvYmplY3QnfSB0eXBlbmFtZVxuICogQHBhcmFtIHtEZXRhaWxzPX0gb3B0RGV0YWlsc1xuICogQHJldHVybnMge2Fzc2VydHMgc3BlY2ltZW4gaXMgUmVjb3JkPGFueSwgYW55PiB8IG51bGx9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0VHlwZW9mU3RyaW5nXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7J3N0cmluZyd9IHR5cGVuYW1lXG4gKiBAcGFyYW0ge0RldGFpbHM9fSBvcHREZXRhaWxzXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzcGVjaW1lbiBpcyBzdHJpbmd9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0VHlwZW9mU3ltYm9sXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7J3N5bWJvbCd9IHR5cGVuYW1lXG4gKiBAcGFyYW0ge0RldGFpbHM9fSBvcHREZXRhaWxzXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzcGVjaW1lbiBpcyBzeW1ib2x9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0VHlwZW9mVW5kZWZpbmVkXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7J3VuZGVmaW5lZCd9IHR5cGVuYW1lXG4gKiBAcGFyYW0ge0RldGFpbHM9fSBvcHREZXRhaWxzXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzcGVjaW1lbiBpcyB1bmRlZmluZWR9XG4gKi9cblxuLyoqXG4gKiBUaGUgYGFzc2VydC50eXBlb2ZgIG1ldGhvZFxuICpcbiAqIEB0eXBlZGVmIHtBc3NlcnRUeXBlb2ZCaWdpbnQgJiBBc3NlcnRUeXBlb2ZCb29sZWFuICYgQXNzZXJ0VHlwZW9mRnVuY3Rpb24gJiBBc3NlcnRUeXBlb2ZOdW1iZXIgJiBBc3NlcnRUeXBlb2ZPYmplY3QgJiBBc3NlcnRUeXBlb2ZTdHJpbmcgJiBBc3NlcnRUeXBlb2ZTeW1ib2wgJiBBc3NlcnRUeXBlb2ZVbmRlZmluZWR9IEFzc2VydFR5cGVvZlxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydFN0cmluZ1xuICogVGhlIGBhc3NlcnQuc3RyaW5nYCBtZXRob2QuXG4gKlxuICogYGFzc2VydC5zdHJpbmcodilgIGlzIGVxdWl2YWxlbnQgdG8gYGFzc2VydC50eXBlb2YodiwgJ3N0cmluZycpYC4gV2VcbiAqIHNwZWNpYWwgY2FzZSB0aGlzIG9uZSBiZWNhdXNlIGl0IGlzIHRoZSBtb3N0IGZyZXF1ZW50bHkgdXNlZC5cbiAqXG4gKiBBc3NlcnQgYW4gZXhwZWN0ZWQgdHlwZW9mIHJlc3VsdC5cbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lbiBUaGUgdmFsdWUgdG8gZ2V0IHRoZSB0eXBlb2ZcbiAqIEBwYXJhbSB7RGV0YWlscz19IG9wdERldGFpbHMgVGhlIGRldGFpbHMgdG8gdGhyb3dcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnROb3RlXG4gKiBUaGUgYGFzc2VydC5ub3RlYCBtZXRob2QuXG4gKlxuICogQW5ub3RhdGUgdGhpcyBlcnJvciB3aXRoIHRoZXNlIGRldGFpbHMsIHBvdGVudGlhbGx5IHRvIGJlIHVzZWQgYnkgYW5cbiAqIGF1Z21lbnRlZCBjb25zb2xlLCBsaWtlIHRoZSBjYXVzYWwgY29uc29sZSBvZiBgY29uc29sZS5qc2AsIHRvXG4gKiBwcm92aWRlIGV4dHJhIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCBsb2dnZWQgZXJyb3JzLlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IGVycm9yXG4gKiBAcGFyYW0ge0RldGFpbHN9IGRldGFpbHNOb3RlXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQHR5cGVkZWYge3t9fSBEZXRhaWxzVG9rZW5cbiAqIEEgY2FsbCB0byB0aGUgYGRldGFpbHNgIHRlbXBsYXRlIGxpdGVyYWwgbWFrZXMgYW5kIHJldHVybnMgYSBmcmVzaCBkZXRhaWxzXG4gKiB0b2tlbiwgd2hpY2ggaXMgYSBmcm96ZW4gZW1wdHkgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgYXJndW1lbnRzIG9mIHRoYXRcbiAqIGBkZXRhaWxzYCB0ZW1wbGF0ZSBsaXRlcmFsIGV4cHJlc3Npb24uXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7c3RyaW5nIHwgRGV0YWlsc1Rva2VufSBEZXRhaWxzXG4gKiBFaXRoZXIgYSBwbGFpbiBzdHJpbmcsIG9yIG1hZGUgYnkgdGhlIGBkZXRhaWxzYCB0ZW1wbGF0ZSBsaXRlcmFsIHRhZy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN0cmluZ2FibGVQYXlsb2FkXG4gKiBIb2xkcyB0aGUgcGF5bG9hZCBwYXNzZWQgdG8gcXVvdGUgc28gdGhhdCBpdHMgcHJpbnRlZCBmb3JtIGlzIHZpc2libGUuXG4gKiBAcHJvcGVydHkgeygpID0+IHN0cmluZ30gdG9TdHJpbmcgSG93IHRvIHByaW50IHRoZSBwYXlsb2FkXG4gKi9cblxuLyoqXG4gKiBUbyBcImRlY2xhc3NpZnlcIiBhbmQgcXVvdGUgYSBzdWJzdGl0dXRpb24gdmFsdWUgdXNlZCBpbiBhXG4gKiBkZXRhaWxzYC4uLmAgdGVtcGxhdGUgbGl0ZXJhbCwgZW5jbG9zZSB0aGF0IHN1YnN0aXR1dGlvbiBleHByZXNzaW9uXG4gKiBpbiBhIGNhbGwgdG8gYHF1b3RlYC4gVGhpcyBzdGF0ZXMgdGhhdCB0aGUgYXJndW1lbnQgc2hvdWxkIGFwcGVhciBxdW90ZWRcbiAqIChhcyBpZiB3aXRoIGBKU09OLnN0cmluZ2lmeWApLCBpbiB0aGUgZXJyb3IgbWVzc2FnZSBvZiB0aGUgdGhyb3duIGVycm9yLiBUaGVcbiAqIHBheWxvYWQgaXRzZWxmIGlzIHN0aWxsIHBhc3NlZCB1bnF1b3RlZCB0byB0aGUgY29uc29sZSBhcyBpdCB3b3VsZCBiZVxuICogd2l0aG91dCBgcXVvdGVgLlxuICpcbiAqIFN0YXJ0aW5nIGZyb20gdGhlIGV4YW1wbGUgaW4gdGhlIGBkZXRhaWxzYCBjb21tZW50LCBzYXkgaW5zdGVhZCB0aGF0IHRoZVxuICogY29sb3IgdGhlIHNreSBpcyBzdXBwb3NlZCB0byBiZSBpcyBhbHNvIGNvbXB1dGVkLiBTYXkgdGhhdCB3ZSBzdGlsbCBkb24ndFxuICogd2FudCB0byByZXZlYWwgdGhlIHNreSdzIGFjdHVhbCBjb2xvciwgYnV0IHdlIGRvIHdhbnQgdGhlIHRocm93biBlcnJvcidzXG4gKiBtZXNzYWdlIHRvIHJldmVhbCB3aGF0IGNvbG9yIHRoZSBza3kgd2FzIHN1cHBvc2VkIHRvIGJlOlxuICogYGBganNcbiAqIGFzc2VydC5lcXVhbChcbiAqICAgc2t5LmNvbG9yLFxuICogICBjb2xvcixcbiAqICAgZGV0YWlsc2Ake3NreS5jb2xvcn0gc2hvdWxkIGJlICR7cXVvdGUoY29sb3IpfWAsXG4gKiApO1xuICogYGBgXG4gKlxuICogVGhlIG5vcm1hbCBjb252ZW50aW9uIGlzIHRvIGxvY2FsbHkgcmVuYW1lIGBxdW90ZWAgdG8gYHFgIGFuZFxuICogYGRldGFpbHNgIHRvIGBYYFxuICogYGBganNcbiAqIGNvbnN0IHsgZGV0YWlsczogWCwgcXVvdGU6IHEgfSA9IGFzc2VydDtcbiAqIGBgYFxuICogc28gdGhlIGFib3ZlIGV4YW1wbGUgd291bGQgdGhlbiBiZVxuICogYGBganNcbiAqIGFzc2VydC5lcXVhbChcbiAqICAgc2t5LmNvbG9yLFxuICogICBjb2xvcixcbiAqICAgWGAke3NreS5jb2xvcn0gc2hvdWxkIGJlICR7cShjb2xvcil9YCxcbiAqICk7XG4gKiBgYGBcbiAqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0UXVvdGVcbiAqIEBwYXJhbSB7Kn0gcGF5bG9hZCBXaGF0IHRvIGRlY2xhc3NpZnlcbiAqIEBwYXJhbSB7KHN0cmluZ3xudW1iZXIpPX0gc3BhY2VzXG4gKiBAcmV0dXJucyB7U3RyaW5nYWJsZVBheWxvYWR9IFRoZSBkZWNsYXNzaWZpZWQgcGF5bG9hZFxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFJhaXNlXG4gKlxuICogVG8gbWFrZSBhbiBgYXNzZXJ0YCB3aGljaCB0ZXJtaW5hdGVzIHNvbWUgbGFyZ2VyIHVuaXQgb2YgY29tcHV0YXRpb25cbiAqIGxpa2UgYSB0cmFuc2FjdGlvbiwgdmF0LCBvciBwcm9jZXNzLCBjYWxsIGBtYWtlQXNzZXJ0YCB3aXRoIGEgYFJhaXNlYFxuICogY2FsbGJhY2ssIHdoZXJlIHRoYXQgY2FsbGJhY2sgYWN0dWFsbHkgcGVyZm9ybXMgdGhhdCBsYXJnZXIgdGVybWluYXRpb24uXG4gKiBJZiBwb3NzaWJsZSwgdGhlIGNhbGxiYWNrIHNob3VsZCBhbHNvIHJlcG9ydCBpdHMgYHJlYXNvbmAgcGFyYW1ldGVyIGFzXG4gKiB0aGUgYWxsZWdlZCByZWFzb24gZm9yIHRoZSB0ZXJtaW5hdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSByZWFzb25cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBNYWtlQXNzZXJ0XG4gKlxuICogTWFrZXMgYW5kIHJldHVybnMgYW4gYGFzc2VydGAgZnVuY3Rpb24gb2JqZWN0IHRoYXQgc2hhcmVzIHRoZSBib29ra2VlcGluZ1xuICogc3RhdGUgZGVmaW5lZCBieSB0aGlzIG1vZHVsZSB3aXRoIG90aGVyIGBhc3NlcnRgIGZ1bmN0aW9uIG9iamVjdHMgbWFkZSBieVxuICogYG1ha2VBc3NlcnRgLiBUaGlzIHN0YXRlIGlzIHBlci1tb2R1bGUtaW5zdGFuY2UgYW5kIGlzIGV4cG9zZWQgYnkgdGhlXG4gKiBgbG9nZ2VkRXJyb3JIYW5kbGVyYCBhYm92ZS4gV2UgcmVmZXIgdG8gYGFzc2VydGAgYXMgYSBcImZ1bmN0aW9uIG9iamVjdFwiXG4gKiBiZWNhdXNlIGl0IGNhbiBiZSBjYWxsZWQgZGlyZWN0bHkgYXMgYSBmdW5jdGlvbiwgYnV0IGFsc28gaGFzIG1ldGhvZHMgdGhhdFxuICogY2FuIGJlIGNhbGxlZC5cbiAqXG4gKiBJZiBgb3B0UmFpc2VgIGlzIHByb3ZpZGVkLCB0aGUgcmV0dXJuZWQgYGFzc2VydGAgZnVuY3Rpb24gb2JqZWN0IHdpbGwgY2FsbFxuICogYG9wdFJhaXNlKHJlYXNvbilgIGJlZm9yZSB0aHJvd2luZyB0aGUgZXJyb3IuIFRoaXMgZW5hYmxlcyBgb3B0UmFpc2VgIHRvXG4gKiBlbmdhZ2UgaW4gZXZlbiBtb3JlIHZpb2xlbnQgdGVybWluYXRpb24gYmVoYXZpb3IsIGxpa2UgdGVybWluYXRpbmcgdGhlIHZhdCxcbiAqIHRoYXQgcHJldmVudHMgZXhlY3V0aW9uIGZyb20gcmVhY2hpbmcgdGhlIGZvbGxvd2luZyB0aHJvdy4gSG93ZXZlciwgaWZcbiAqIGBvcHRSYWlzZWAgcmV0dXJucyBub3JtYWxseSwgd2hpY2ggd291bGQgYmUgdW51c3VhbCwgdGhlIHRocm93IGZvbGxvd2luZ1xuICogYG9wdFJhaXNlKHJlYXNvbilgIHdvdWxkIHN0aWxsIGhhcHBlbi5cbiAqXG4gKiBAcGFyYW0ge1JhaXNlPX0gb3B0UmFpc2VcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IHVucmVkYWN0ZWRcbiAqIEByZXR1cm5zIHtBc3NlcnR9XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KHRlbXBsYXRlOiBUZW1wbGF0ZVN0cmluZ3NBcnJheSB8IHN0cmluZ1tdLCAuLi5hcmdzOiBhbnkpID0+IERldGFpbHNUb2tlbn0gRGV0YWlsc1RhZ1xuICpcbiAqIFVzZSB0aGUgYGRldGFpbHNgIGZ1bmN0aW9uIGFzIGEgdGVtcGxhdGUgbGl0ZXJhbCB0YWcgdG8gY3JlYXRlXG4gKiBpbmZvcm1hdGl2ZSBlcnJvciBtZXNzYWdlcy4gVGhlIGFzc2VydGlvbiBmdW5jdGlvbnMgdGFrZSBzdWNoIG1lc3NhZ2VzXG4gKiBhcyBvcHRpb25hbCBhcmd1bWVudHM6XG4gKiBgYGBqc1xuICogYXNzZXJ0KHNreS5pc0JsdWUoKSwgZGV0YWlsc2Ake3NreS5jb2xvcn0gc2hvdWxkIGJlIFwiYmx1ZVwiYCk7XG4gKiBgYGBcbiAqIFRoZSBkZXRhaWxzIHRlbXBsYXRlIHRhZyByZXR1cm5zIGEgYERldGFpbHNUb2tlbmAgb2JqZWN0IHRoYXQgY2FuIHByaW50XG4gKiBpdHNlbGYgd2l0aCB0aGUgZm9ybWF0dGVkIG1lc3NhZ2UgaW4gdHdvIHdheXMuXG4gKiBJdCB3aWxsIHJlcG9ydCB0aGUgcmVhbCBkZXRhaWxzIHRvXG4gKiB0aGUgY29uc29sZSBidXQgaW5jbHVkZSBvbmx5IHRoZSB0eXBlb2YgaW5mb3JtYXRpb24gaW4gdGhlIHRocm93biBlcnJvclxuICogdG8gcHJldmVudCByZXZlYWxpbmcgc2VjcmV0cyB1cCB0aGUgZXhjZXB0aW9uYWwgcGF0aC4gSW4gdGhlIGV4YW1wbGVcbiAqIGFib3ZlLCB0aGUgdGhyb3duIGVycm9yIG1heSByZXZlYWwgb25seSB0aGF0IGBza3kuY29sb3JgIGlzIGEgc3RyaW5nLFxuICogd2hlcmVhcyB0aGUgc2FtZSBkaWFnbm9zdGljIHByaW50ZWQgdG8gdGhlIGNvbnNvbGUgcmV2ZWFscyB0aGF0IHRoZVxuICogc2t5IHdhcyBncmVlbi5cbiAqXG4gKiBUaGUgYHJhd2AgbWVtYmVyIG9mIGEgYHRlbXBsYXRlYCBpcyBpZ25vcmVkLCBzbyBhIHNpbXBsZVxuICogYHN0cmluZ1tdYCBjYW4gYWxzbyBiZSB1c2VkIGFzIGEgdGVtcGxhdGUuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KHRlbXBsYXRlOiBUZW1wbGF0ZVN0cmluZ3NBcnJheSB8IHN0cmluZ1tdLCAuLi5hcmdzOiBhbnkpID0+IG5ldmVyfSBGYWlsVGFnXG4gKiBUaGUgYEZhaWxgIHRhbXBsYXRlIHRhZyBzdXBwb3J0cyByZXBsYWNpbmcgcGF0dGVybnMgbGlrZVxuICogYGBganNcbiAqIGFzc2VydChjb25kLCBYYC4uLmNvbXBsYWludC4uLmApO1xuICogYGBgXG4gKiBvclxuICogYGBganNcbiAqIGNvbmQgfHwgYXNzZXJ0LmZhaWwoWGAuLi5jb21wbGFpbnQuLi5gKTtcbiAqIGBgYFxuICogd2l0aCBwYXR0ZXJucyBsaWtlXG4gKiBgYGBqc1xuICogY29uZCB8fCBGYWlsYC4uLmNvbXBsYWludC4uLmA7XG4gKiBgYGBcbiAqXG4gKiBIb3dldmVyLCBkdWUgdG8gW3dlYWtuZXNzIGluIGN1cnJlbnRcbiAqIFR5cGVTY3JpcHRdKGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvNTE0MjYpLCB0aGUgYHx8YFxuICogcGF0dGVybnMgYXJlIG5vdCBhcyBwb3dlcmZ1bCBhcyB0aGUgYGFzc2VydCguLi4pYCBjYWxsIGF0IGVuYWJsaW5nIHN0YXRpY1xuICogcmVhc29uaW5nLiBPZiB0aGUgYHx8YCwgYWdhaW4gZHVlIHRvIHdlYWtuZXNzZXMgaW4gY3VycmVudCBUeXBlU2NyaXB0LFxuICogdGhlXG4gKiBgYGBqc1xuICogY29uZCB8fCBGYWlsYC4uLmNvbXBsYWludC4uLmBcbiAqIGBgYFxuICogcGF0dGVybiBpcyBub3QgYXMgcG93ZXJmdWwgYXMgdGhlXG4gKiBgYGBqc1xuICogY29uZCB8fCBhc3NlcnQuZmFpbChYYC4uLmNvbXBsYWludC4uLmApO1xuICogYGBgXG4gKiBhdCBlbmFibGluZyBzdGF0aWMgcmVzb25pbmcuIERlc3BpdGUgdGhlc2UgcHJvYmxlbXMsIHdlIGRvIG5vdCB3YW50IHRvXG4gKiByZXR1cm4gdG8gdGhlXG4gKiBgYGBqc1xuICogYXNzZXJ0KGNvbmQsIFhgLi4uY29tcGxhaW50Li4uYClcbiAqIGBgYFxuICogc3R5bGUgYmVjYXVzZSBvZiB0aGUgc3Vic3RhbnRpYWwgb3ZlcmhlYWQgaW5cbiAqIGV2YWx1YXRpbmcgdGhlIGBYYCB0ZW1wbGF0ZSBpbiB0aGUgdHlwaWNhbCBgdHJ1ZWAgY2FzZSB3aGVyZSBpdCBpcyBub3RcbiAqIG5lZWRlZC4gQW5kIHdlIGRvIG5vdCB3YW50IHRvIHJldHVybiB0byB0aGVcbiAqIGBgYGpzXG4gKiBhc3NlcnQuZmFpbChYYC4uLmNvbXBsYWludC4uLmApYFxuICogYGBgXG4gKiBiZWNhdXNlIG9mIHRoZSB2ZXJib3NpdHkgYW5kIGxvc3Mgb2YgcmVhZGFiaWxpdHkuIEluc3RlYWQsIHVudGlsL3VubGVzc1xuICogaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy81MTQyNiBpcyBmaXhlZCwgZm9yIHRob3NlXG4gKiBuZXctc3R5bGUgYXNzZXJ0aW9ucyB3aGVyZSB0aGlzIGxvc3Mgb2Ygc3RhdGljIHJlYXNvbmluZyBpcyBhIHByb2JsZW0sXG4gKiBpbnN0ZWFkIGV4cHJlc3MgdGhlIGFzc2VydGlvbiBhc1xuICogYGBganNcbiAqICAgaWYgKCFjb25kKSB7XG4gKiAgICAgRmFpbGAuLi5jb21wbGFpbnQuLi5gO1xuICogICB9XG4gKiBgYGBcbiAqIG9yLCBpZiBuZWVkZWQsXG4gKiBgYGBqc1xuICogICBpZiAoIWNvbmQpIHtcbiAqICAgICAvLyBgdGhyb3dgIGlzIG5vb3Agc2luY2UgYEZhaWxgIHRocm93cy4gQnV0IGxpbnRlciBjb25mdXNlZFxuICogICAgIHRocm93IEZhaWxgLi4uY29tcGxhaW50Li4uYDtcbiAqICAgfVxuICogYGBgXG4gKiBUaGlzIGF2b2lkIHRoZSBUeXBlU2NyaXB0IGJ1Z3MgdGhhdCBjYXVzZSB0aGUgbG9zcyBvZiBzdGF0aWMgcmVhc29uaW5nLFxuICogYnV0IHdpdGggbm8gbG9zcyBvZiBlZmZpY2llbmN5IGFuZCBsaXR0bGUgbG9zcyBvZiByZWFkYWJpbGl0eS5cbiAqL1xuXG4vKipcbiAqIGFzc2VydCB0aGF0IGV4cHIgaXMgdHJ1dGh5LCB3aXRoIGFuIG9wdGlvbmFsIGRldGFpbHMgdG8gZGVzY3JpYmVcbiAqIHRoZSBhc3NlcnRpb24uIEl0IGlzIGEgdGFnZ2VkIHRlbXBsYXRlIGxpdGVyYWwgbGlrZVxuICogYGBganNcbiAqIGFzc2VydChleHByLCBkZXRhaWxzYC4uLi5gKTtgXG4gKiBgYGBcbiAqXG4gKiBUaGUgbGl0ZXJhbCBwb3J0aW9ucyBvZiB0aGUgdGVtcGxhdGUgYXJlIGFzc3VtZWQgbm9uLXNlbnNpdGl2ZSwgYXNcbiAqIGFyZSB0aGUgYHR5cGVvZmAgdHlwZXMgb2YgdGhlIHN1YnN0aXR1dGlvbiB2YWx1ZXMuIFRoZXNlIGFyZVxuICogYXNzZW1ibGVkIGludG8gdGhlIHRocm93biBlcnJvciBtZXNzYWdlLiBUaGUgYWN0dWFsIGNvbnRlbnRzIG9mIHRoZVxuICogc3Vic3RpdHV0aW9uIHZhbHVlcyBhcmUgYXNzdW1lZCBzZW5zaXRpdmUsIHRvIGJlIHJldmVhbGVkIHRvXG4gKiB0aGUgY29uc29sZSBvbmx5LiBXZSBhc3N1bWUgb25seSB0aGUgdmlydHVhbCBwbGF0Zm9ybSdzIG93bmVyIGNhbiByZWFkXG4gKiB3aGF0IGlzIHdyaXR0ZW4gdG8gdGhlIGNvbnNvbGUsIHdoZXJlIHRoZSBvd25lciBpcyBpbiBhIHByaXZpbGVnZWRcbiAqIHBvc2l0aW9uIG92ZXIgY29tcHV0YXRpb24gcnVubmluZyBvbiB0aGF0IHBsYXRmb3JtLlxuICpcbiAqIFRoZSBvcHRpb25hbCBgb3B0RGV0YWlsc2AgY2FuIGJlIGEgc3RyaW5nIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICogd2l0aCB0aGUgbm9kZWpzIGFzc2VydGlvbiBsaWJyYXJ5LlxuICpcbiAqIEB0eXBlZGVmIHsgQmFzZUFzc2VydCAmIHtcbiAqICAgdHlwZW9mOiBBc3NlcnRUeXBlb2YsXG4gKiAgIGVycm9yOiBBc3NlcnRNYWtlRXJyb3IsXG4gKiAgIGZhaWw6IEFzc2VydEZhaWwsXG4gKiAgIGVxdWFsOiBBc3NlcnRFcXVhbCxcbiAqICAgc3RyaW5nOiBBc3NlcnRTdHJpbmcsXG4gKiAgIG5vdGU6IEFzc2VydE5vdGUsXG4gKiAgIGRldGFpbHM6IERldGFpbHNUYWcsXG4gKiAgIEZhaWw6IEZhaWxUYWcsXG4gKiAgIHF1b3RlOiBBc3NlcnRRdW90ZSxcbiAqICAgbWFrZUFzc2VydDogTWFrZUFzc2VydCxcbiAqIH0gfSBBc3NlcnRcbiAqL1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABdze4OVwEAAFcBAAAgAAAAQGFnb3JpYy9lcnRwLXYwLjE1LjMvZXhwb3J0ZWQuanN7ImltcG9ydHMiOlsiLi9zcmMvdHlwZXMtYW1iaWVudC5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3NyYy90eXBlcy1hbWJpZW50LmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA4wt3p2TYAANk2AAAmAAAAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL2Ftb3VudE1hdGguanN7ImltcG9ydHMiOlsiLi9tYXRoSGVscGVycy9jb3B5QmFnTWF0aEhlbHBlcnMuanMiLCIuL21hdGhIZWxwZXJzL2NvcHlTZXRNYXRoSGVscGVycy5qcyIsIi4vbWF0aEhlbHBlcnMvbmF0TWF0aEhlbHBlcnMuanMiLCIuL21hdGhIZWxwZXJzL3NldE1hdGhIZWxwZXJzLmpzIiwiQGFnb3JpYy9zdG9yZSIsIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJBbW91bnRNYXRoIiwiQXNzZXRLaW5kIiwiYXNzZXJ0QXNzZXRLaW5kIiwiYXNzZXJ0VmFsdWVHZXRIZWxwZXJzIiwiZ2V0QXNzZXRLaW5kIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IHBhc3NTdHlsZU9mLGFzc2VydFJlbW90YWJsZSxhc3NlcnRSZWNvcmQsTSxtYXRjaGVzLG5hdE1hdGhIZWxwZXJzLHNldE1hdGhIZWxwZXJzLGNvcHlTZXRNYXRoSGVscGVycyxjb3B5QmFnTWF0aEhlbHBlcnM7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXSxbXCJhc3NlcnRSZW1vdGFibGVcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFJlbW90YWJsZSA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0UmVjb3JkXCIsIFskaOKAjV9hID0+IChhc3NlcnRSZWNvcmQgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiTVwiLCBbJGjigI1fYSA9PiAoTSA9ICRo4oCNX2EpXV0sW1wibWF0Y2hlc1wiLCBbJGjigI1fYSA9PiAobWF0Y2hlcyA9ICRo4oCNX2EpXV1dXSxbXCIuL21hdGhIZWxwZXJzL25hdE1hdGhIZWxwZXJzLmpzXCIsIFtbXCJuYXRNYXRoSGVscGVyc1wiLCBbJGjigI1fYSA9PiAobmF0TWF0aEhlbHBlcnMgPSAkaOKAjV9hKV1dXV0sW1wiLi9tYXRoSGVscGVycy9zZXRNYXRoSGVscGVycy5qc1wiLCBbW1wic2V0TWF0aEhlbHBlcnNcIiwgWyRo4oCNX2EgPT4gKHNldE1hdGhIZWxwZXJzID0gJGjigI1fYSldXV1dLFtcIi4vbWF0aEhlbHBlcnMvY29weVNldE1hdGhIZWxwZXJzLmpzXCIsIFtbXCJjb3B5U2V0TWF0aEhlbHBlcnNcIiwgWyRo4oCNX2EgPT4gKGNvcHlTZXRNYXRoSGVscGVycyA9ICRo4oCNX2EpXV1dXSxbXCIuL21hdGhIZWxwZXJzL2NvcHlCYWdNYXRoSGVscGVycy5qc1wiLCBbW1wiY29weUJhZ01hdGhIZWxwZXJzXCIsIFskaOKAjV9hID0+IChjb3B5QmFnTWF0aEhlbHBlcnMgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuY29uc3R7cXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5cbi8qKlxuICogQ29uc3RhbnRzIGZvciB0aGUga2luZHMgb2YgYXNzZXRzIHdlIHN1cHBvcnQuXG4gKlxuICogQHR5cGUge3sgTkFUOiAnbmF0JywgU0VUOiAnc2V0JywgQ09QWV9TRVQ6ICdjb3B5U2V0JywgQ09QWV9CQUc6ICdjb3B5QmFnJyB9fVxuICovXG5jb25zdCBBc3NldEtpbmQ9aGFyZGVuKHtcbk5BVDonbmF0JyxcblNFVDonc2V0JyxcbkNPUFlfU0VUOidjb3B5U2V0JyxcbkNPUFlfQkFHOidjb3B5QmFnJ30pOyRo4oCNX29uY2UuQXNzZXRLaW5kKEFzc2V0S2luZCk7XG5cbmNvbnN0IGFzc2V0S2luZE5hbWVzPWhhcmRlbihPYmplY3QudmFsdWVzKEFzc2V0S2luZCkuc29ydCgpKTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHtBc3NldEtpbmR9IGFsbGVnZWRBS1xuICovXG5jb25zdCBhc3NlcnRBc3NldEtpbmQ9KGFsbGVnZWRBSyk9PntcbmFzc2V0S2luZE5hbWVzLmluY2x1ZGVzKGFsbGVnZWRBSyl8fFxuRmFpbCBgVGhlIGFzc2V0S2luZCAke2FsbGVnZWRBS30gbXVzdCBiZSBvbmUgb2YgJHtxKGFzc2V0S2luZE5hbWVzKX1gO1xuIH07JGjigI1fb25jZS5hc3NlcnRBc3NldEtpbmQoYXNzZXJ0QXNzZXRLaW5kKTtcbmhhcmRlbihhc3NlcnRBc3NldEtpbmQpO1xuXG4vKipcbiAqIEFtb3VudHMgZGVzY3JpYmUgZGlnaXRhbCBhc3NldHMuIEZyb20gYW4gYW1vdW50LCB5b3UgY2FuIGxlYXJuIHRoZVxuICogYnJhbmQgb2YgZGlnaXRhbCBhc3NldCBhcyB3ZWxsIGFzIFwiaG93IG11Y2hcIiBvciBcImhvdyBtYW55XCIuIEFtb3VudHNcbiAqIGhhdmUgdHdvIHBhcnRzOiBhIGJyYW5kIChsb29zZWx5IHNwZWFraW5nLCB0aGUgdHlwZSBvZiBkaWdpdGFsXG4gKiBhc3NldCkgYW5kIHRoZSB2YWx1ZSAodGhlIGFuc3dlciB0byBcImhvdyBtdWNoXCIpLiBGb3IgZXhhbXBsZSwgaW5cbiAqIHRoZSBwaHJhc2UgXCI1IGJ1Y2tzXCIsIFwiYnVja3NcIiB0YWtlcyB0aGUgcm9sZSBvZiB0aGUgYnJhbmQgYW5kIHRoZVxuICogdmFsdWUgaXMgNS4gQW1vdW50cyBjYW4gZGVzY3JpYmUgZnVuZ2libGUgYW5kIG5vbi1mdW5naWJsZSBkaWdpdGFsXG4gKiBhc3NldHMuIEFtb3VudHMgYXJlIHBhc3MtYnktY29weSBhbmQgY2FuIGJlIG1hZGUgYnkgYW5kIHNlbnQgdG9cbiAqIGFueW9uZS5cbiAqXG4gKiBUaGUgaXNzdWVyIGlzIHRoZSBhdXRob3JpdGF0aXZlIHNvdXJjZSBvZiB0aGUgYW1vdW50IGluIHBheW1lbnRzXG4gKiBhbmQgcHVyc2VzLiBUaGUgaXNzdWVyIG11c3QgYmUgYWJsZSB0byBkbyB0aGluZ3Mgc3VjaCBhcyBhZGRcbiAqIGRpZ2l0YWwgYXNzZXRzIHRvIGEgcHVyc2UgYW5kIHdpdGhkcmF3IGRpZ2l0YWwgYXNzZXRzIGZyb20gYSBwdXJzZS5cbiAqIFRvIGRvIHNvLCBpdCBtdXN0IGtub3cgaG93IHRvIGFkZCBhbmQgc3VidHJhY3QgZGlnaXRhbCBhc3NldHMuXG4gKiBSYXRoZXIgdGhhbiBoYXJkLWNvZGluZyBhIHBhcnRpY3VsYXIgc29sdXRpb24sIHdlIGNob3NlIHRvXG4gKiBwYXJhbWV0ZXJpemUgdGhlIGlzc3VlciB3aXRoIGEgY29sbGVjdGlvbiBvZiBwb2x5bW9ycGhpYyBmdW5jdGlvbnMsXG4gKiB3aGljaCB3ZSBjYWxsIGBBbW91bnRNYXRoYC4gVGhlc2UgbWF0aCBmdW5jdGlvbnMgaW5jbHVkZSBjb25jZXB0c1xuICogbGlrZSBhZGRpdGlvbiwgc3VidHJhY3Rpb24sIGFuZCBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8uXG4gKlxuICogV2UgYWxzbyB3YW50IHRvIG1ha2Ugc3VyZSB0aGVyZSBpcyBubyBjb25mdXNpb24gYXMgdG8gd2hhdCBraW5kIG9mXG4gKiBhc3NldCB3ZSBhcmUgdXNpbmcuIFRodXMsIEFtb3VudE1hdGggaW5jbHVkZXMgY2hlY2tzIG9mIHRoZVxuICogYGJyYW5kYCwgdGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgdHlwZSBvZiBkaWdpdGFsIGFzc2V0LiBJZlxuICogdGhlIHdyb25nIGJyYW5kIGlzIHVzZWQgaW4gQW1vdW50TWF0aCwgYW4gZXJyb3IgaXMgdGhyb3duIGFuZCB0aGVcbiAqIG9wZXJhdGlvbiBkb2VzIG5vdCBzdWNjZWVkLlxuICpcbiAqIEFtb3VudE1hdGggdXNlcyBtYXRoSGVscGVycyB0byBkbyBtb3N0IG9mIHRoZSB3b3JrLCBidXQgdGhlbiBhZGRzXG4gKiB0aGUgYnJhbmQgdG8gdGhlIHJlc3VsdC4gVGhlIGZ1bmN0aW9uIGB2YWx1ZWAgZ2V0cyB0aGUgdmFsdWUgZnJvbVxuICogdGhlIGFtb3VudCBieSByZW1vdmluZyB0aGUgYnJhbmQgKGFtb3VudCAtPiB2YWx1ZSksIGFuZCB0aGVcbiAqIGZ1bmN0aW9uIGBtYWtlYCBhZGRzIHRoZSBicmFuZCB0byBwcm9kdWNlIGFuIGFtb3VudCAodmFsdWUgLT5cbiAqIGFtb3VudCkuIFRoZSBmdW5jdGlvbiBgY29lcmNlYCB0YWtlcyBhbiBhbW91bnQgYW5kIGNoZWNrcyBpdCxcbiAqIHJldHVybmluZyBhbiBhbW91bnQgKGFtb3VudCAtPiBhbW91bnQpLlxuICpcbiAqIEVhY2ggaXNzdWVyIG9mIGRpZ2l0YWwgYXNzZXRzIGhhcyBhbiBhc3NvY2lhdGVkIGJyYW5kIGluIGFcbiAqIG9uZS10by1vbmUgbWFwcGluZy4gSW4gdW50cnVzdGVkIGNvbnRleHRzLCBzdWNoIGFzIGluIGFuYWx5emluZ1xuICogcGF5bWVudHMgYW5kIGFtb3VudHMsIHdlIGNhbiBnZXQgdGhlIGJyYW5kIGFuZCBmaW5kIHRoZSBpc3N1ZXJcbiAqIHdoaWNoIG1hdGNoZXMgdGhlIGJyYW5kLiBUaGUgaXNzdWVyIGFuZCB0aGUgYnJhbmQgbXV0dWFsbHkgdmFsaWRhdGVcbiAqIGVhY2ggb3RoZXIuXG4gKi9cblxuY29uc3QgaGVscGVycz17XG5uYXQ6bmF0TWF0aEhlbHBlcnMsXG5zZXQ6c2V0TWF0aEhlbHBlcnMsXG5jb3B5U2V0OmNvcHlTZXRNYXRoSGVscGVycyxcbmNvcHlCYWc6Y29weUJhZ01hdGhIZWxwZXJzfTtcblxuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QW1vdW50VmFsdWV9IFZcbiAqIEB0eXBlIHsodmFsdWU6IFYpID0+IEFzc2V0S2luZEZvclZhbHVlPFY+fVxuICovXG5jb25zdCBhc3NlcnRWYWx1ZUdldEFzc2V0S2luZD0odmFsdWUpPT57XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YodmFsdWUpO1xuaWYocGFzc1N0eWxlPT09J2JpZ2ludCcpe1xuLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0Ki9cbnJldHVybiduYXQnO1xuIH1cbmlmKHBhc3NTdHlsZT09PSdjb3B5QXJyYXknKXtcbi8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCovXG5yZXR1cm4nc2V0JztcbiB9XG5pZihtYXRjaGVzKHZhbHVlLE0uc2V0KCkpKXtcbi8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCovXG5yZXR1cm4nY29weVNldCc7XG4gfVxuaWYobWF0Y2hlcyh2YWx1ZSxNLmJhZygpKSl7XG4vKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xucmV0dXJuJ2NvcHlCYWcnO1xuIH1cbi8qIFRPRE8gVGhpcyBpc24ndCBxdWl0ZSB0aGUgcmlnaHQgZXJyb3IgbWVzc2FnZSwgaW4gY2FzZSB2YWx1ZVBhc3NTdHlsZSovXG4vKiBpcyAndGFnZ2VkJy4gV2Ugd291bGQgbmVlZCB0byBkaXN0aW5ndWlzaCB3aGF0IGtpbmQgb2YgdGFnZ2VkKi9cbi8qIG9iamVjdCBpdCBpcy4qL1xuLyogQWxzbywgdGhpcyBraW5kIG9mIG1hbnVhbCBsaXN0aW5nIGlzIGEgbWFpbnRlbmFuY2UgaGF6YXJkIHdlKi9cbi8qIChUT0RPKSB3aWxsIGVuY291bnRlciB3aGVuIHdlIGV4dGVuZCB0aGUgbWF0aCBoZWxwZXJzIGZ1cnRoZXIuKi9cbnRocm93IEZhaWwgYHZhbHVlICR7dmFsdWV9IG11c3QgYmUgYSBiaWdpbnQsIGNvcHlTZXQsIGNvcHlCYWcsIG9yIGFuIGFycmF5LCBub3QgJHtxKFxucGFzc1N0eWxlKVxuIH1gO1xuIH07XG5cbi8qKlxuICpcbiAqIEFzc2VydHMgdGhhdCB2YWx1ZSBpcyBhIHZhbGlkIEFtb3VudE1hdGggYW5kIHJldHVybnMgdGhlIGFwcHJvcHJpYXRlIGhlbHBlcnMuXG4gKlxuICogTWFkZSBhdmFpbGFibGUgb25seSBmb3IgdGVzdGluZywgYnV0IGl0IGlzIGhhcm1sZXNzIGZvciBvdGhlciB1c2VzLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QW1vdW50VmFsdWV9IFZcbiAqIEBwYXJhbSB7Vn0gdmFsdWVcbiAqIEByZXR1cm5zIHtNYXRoSGVscGVyczxWPn1cbiAqL1xuY29uc3QgICAgICAgIGFzc2VydFZhbHVlR2V0SGVscGVycz0odmFsdWUpPT5cbi8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCovXG5oZWxwZXJzW2Fzc2VydFZhbHVlR2V0QXNzZXRLaW5kKHZhbHVlKV07XG5cbi8qKiBAdHlwZSB7KGFsbGVnZWRCcmFuZDogQnJhbmQsIGJyYW5kPzogQnJhbmQpID0+IHZvaWR9ICovJGjigI1fb25jZS5hc3NlcnRWYWx1ZUdldEhlbHBlcnMoYXNzZXJ0VmFsdWVHZXRIZWxwZXJzKTtcbmNvbnN0IG9wdGlvbmFsQnJhbmRDaGVjaz0oYWxsZWdlZEJyYW5kLGJyYW5kKT0+e1xuaWYoYnJhbmQhPT11bmRlZmluZWQpe1xuYXNzZXJ0UmVtb3RhYmxlKGJyYW5kLCdicmFuZCcpO1xuYWxsZWdlZEJyYW5kPT09YnJhbmR8fFxuRmFpbCBgYW1vdW50J3MgYnJhbmQgJHtxKGFsbGVnZWRCcmFuZCl9IGRpZCBub3QgbWF0Y2ggZXhwZWN0ZWQgYnJhbmQgJHtxKFxuYnJhbmQpXG4gfWA7XG4gfVxuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEBwYXJhbSB7QW1vdW50PEs+fSBsZWZ0QW1vdW50XG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gcmlnaHRBbW91bnRcbiAqIEBwYXJhbSB7QnJhbmQ8Sz4gfCB1bmRlZmluZWR9IGJyYW5kXG4gKiBAcmV0dXJucyB7TWF0aEhlbHBlcnM8Kj59XG4gKi9cbmNvbnN0IGNoZWNrTFJBbmRHZXRIZWxwZXJzPShsZWZ0QW1vdW50LHJpZ2h0QW1vdW50LGJyYW5kPXVuZGVmaW5lZCk9PntcbmFzc2VydFJlY29yZChsZWZ0QW1vdW50LCdsZWZ0QW1vdW50Jyk7XG5hc3NlcnRSZWNvcmQocmlnaHRBbW91bnQsJ3JpZ2h0QW1vdW50Jyk7XG5jb25zdHt2YWx1ZTpsZWZ0VmFsdWUsYnJhbmQ6bGVmdEJyYW5kfT1sZWZ0QW1vdW50O1xuY29uc3R7dmFsdWU6cmlnaHRWYWx1ZSxicmFuZDpyaWdodEJyYW5kfT1yaWdodEFtb3VudDtcbmFzc2VydFJlbW90YWJsZShsZWZ0QnJhbmQsJ2xlZnRCcmFuZCcpO1xuYXNzZXJ0UmVtb3RhYmxlKHJpZ2h0QnJhbmQsJ3JpZ2h0QnJhbmQnKTtcbm9wdGlvbmFsQnJhbmRDaGVjayhsZWZ0QnJhbmQsYnJhbmQpO1xub3B0aW9uYWxCcmFuZENoZWNrKHJpZ2h0QnJhbmQsYnJhbmQpO1xubGVmdEJyYW5kPT09cmlnaHRCcmFuZHx8XG5GYWlsIGBCcmFuZHMgaW4gbGVmdCAke3EobGVmdEJyYW5kKX0gYW5kIHJpZ2h0ICR7cShcbnJpZ2h0QnJhbmQpXG4gfSBzaG91bGQgbWF0Y2ggYnV0IGRvIG5vdGA7XG5jb25zdCBsZWZ0SGVscGVycz1hc3NlcnRWYWx1ZUdldEhlbHBlcnMobGVmdFZhbHVlKTtcbmNvbnN0IHJpZ2h0SGVscGVycz1hc3NlcnRWYWx1ZUdldEhlbHBlcnMocmlnaHRWYWx1ZSk7XG5sZWZ0SGVscGVycz09PXJpZ2h0SGVscGVyc3x8XG5GYWlsIGBUaGUgbGVmdCAke2xlZnRBbW91bnR9IGFuZCByaWdodCBhbW91bnQgJHtyaWdodEFtb3VudH0gaGFkIGRpZmZlcmVudCBhc3NldEtpbmRzYDtcbnJldHVybiBsZWZ0SGVscGVycztcbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge01hdGhIZWxwZXJzPEFzc2V0VmFsdWVGb3JLaW5kPEs+Pn0gaFxuICogQHBhcmFtIHtBbW91bnQ8Sz59IGxlZnRBbW91bnRcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSByaWdodEFtb3VudFxuICogQHJldHVybnMge1tLLCBLXX1cbiAqL1xuY29uc3QgY29lcmNlTFI9KGgsbGVmdEFtb3VudCxyaWdodEFtb3VudCk9Pntcbi8qIEB0cy1leHBlY3QtZXJyb3IgY291bGQgYmUgYXJiaXRyYXJ5IHN1YnR5cGUqL1xucmV0dXJuW2guZG9Db2VyY2UobGVmdEFtb3VudC52YWx1ZSksaC5kb0NvZXJjZShyaWdodEFtb3VudC52YWx1ZSldO1xuIH07XG5cbi8qKlxuICogTG9naWMgZm9yIG1hbmlwdWxhdGluZyBhbW91bnRzLlxuICpcbiAqIEFtb3VudHMgYXJlIHRoZSBjYW5vbmljYWwgZGVzY3JpcHRpb24gb2YgdHJhZGFibGUgZ29vZHMuIFRoZXkgYXJlIG1hbmlwdWxhdGVkXG4gKiBieSBpc3N1ZXJzIGFuZCBtaW50cywgYW5kIHJlcHJlc2VudCB0aGUgZ29vZHMgYW5kIGN1cnJlbmN5IGNhcnJpZWQgYnkgcHVyc2VzXG4gKiBhbmRcbiAqIHBheW1lbnRzLiBUaGV5IGNhbiBiZSB1c2VkIHRvIHJlcHJlc2VudCB0aGluZ3MgbGlrZSBjdXJyZW5jeSwgc3RvY2ssIGFuZCB0aGVcbiAqIGFic3RyYWN0IHJpZ2h0IHRvIHBhcnRpY2lwYXRlIGluIGEgcGFydGljdWxhciBleGNoYW5nZS5cbiAqL1xuY29uc3QgQW1vdW50TWF0aD17XG4vKipcbiAqIE1ha2UgYW4gYW1vdW50IGZyb20gYSB2YWx1ZSBieSBhZGRpbmcgdGhlIGJyYW5kLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAcGFyYW0ge0JyYW5kPEs+fSBicmFuZFxuICogQHBhcmFtIHtBc3NldFZhbHVlRm9yS2luZDxLPn0gYWxsZWdlZFZhbHVlXG4gKiBAcmV0dXJucyB7QW1vdW50PEs+fVxuICovXG4vKiBhbGxlZ2VkVmFsdWUgaGFzIGEgY29uZGl0aW9uYWwgZXhwcmVzc2lvbiBmb3IgdHlwZSB3aWRlbmluZywgdG8gcHJldmVudCBWIGJlaW5nIGJvdW5kIHRvIGEgYSBsaXRlcmFsIGxpa2UgMW4qL1xubWFrZTooYnJhbmQsYWxsZWdlZFZhbHVlKT0+e1xuYXNzZXJ0UmVtb3RhYmxlKGJyYW5kLCdicmFuZCcpO1xuY29uc3QgaD1hc3NlcnRWYWx1ZUdldEhlbHBlcnMoYWxsZWdlZFZhbHVlKTtcbmNvbnN0IHZhbHVlPWguZG9Db2VyY2UoYWxsZWdlZFZhbHVlKTtcbnJldHVybiBoYXJkZW4oe2JyYW5kLHZhbHVlfSk7XG4gfSxcbi8qKlxuICogTWFrZSBzdXJlIHRoaXMgYW1vdW50IGlzIHZhbGlkIGVub3VnaCwgYW5kIHJldHVybiBhIGNvcnJlc3BvbmRpbmdcbiAqIHZhbGlkIGFtb3VudCBpZiBzby5cbiAqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHBhcmFtIHtCcmFuZDxLPn0gYnJhbmRcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSBhbGxlZ2VkQW1vdW50XG4gKiBAcmV0dXJucyB7QW1vdW50PEs+fVxuICovXG5jb2VyY2U6KGJyYW5kLGFsbGVnZWRBbW91bnQpPT57XG5hc3NlcnRSZW1vdGFibGUoYnJhbmQsJ2JyYW5kJyk7XG5hc3NlcnRSZWNvcmQoYWxsZWdlZEFtb3VudCwnYW1vdW50Jyk7XG5jb25zdHticmFuZDphbGxlZ2VkQnJhbmQsdmFsdWU6YWxsZWdlZFZhbHVlfT1hbGxlZ2VkQW1vdW50O1xuYnJhbmQ9PT1hbGxlZ2VkQnJhbmR8fFxuRmFpbCBgVGhlIGJyYW5kIGluIHRoZSBhbGxlZ2VkQW1vdW50ICR7YWxsZWdlZEFtb3VudH0gaW4gJ2NvZXJjZScgZGlkbid0IG1hdGNoIHRoZSBzcGVjaWZpZWQgYnJhbmQgJHticmFuZH0uYDtcbi8qIFdpbGwgdGhyb3cgb24gaW5hcHByb3ByaWF0ZSB2YWx1ZSovXG5yZXR1cm4gQW1vdW50TWF0aC5tYWtlKGJyYW5kLGFsbGVnZWRWYWx1ZSk7XG4gfSxcbi8qKlxuICogRXh0cmFjdCBhbmQgcmV0dXJuIHRoZSB2YWx1ZS5cbiAqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHBhcmFtIHtCcmFuZDxLPn0gYnJhbmRcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSBhbW91bnRcbiAqIEByZXR1cm5zIHtBc3NldFZhbHVlRm9yS2luZDxLPn1cbiAqL1xuZ2V0VmFsdWU6KGJyYW5kLGFtb3VudCk9PkFtb3VudE1hdGguY29lcmNlKGJyYW5kLGFtb3VudCkudmFsdWUsXG4vKipcbiAqIFJldHVybiB0aGUgYW1vdW50IHJlcHJlc2VudGluZyBhbiBlbXB0eSBhbW91bnQuIFRoaXMgaXMgdGhlXG4gKiBpZGVudGl0eSBlbGVtZW50IGZvciBNYXRoSGVscGVycy5hZGQgYW5kIE1hdEhlbHBlcnMuc3VidHJhY3QuXG4gKlxuICogQHR5cGUge3tcbiAqICAgKGJyYW5kOiBCcmFuZCk6IEFtb3VudDwnbmF0Jz47XG4gKiAgIDxLIGV4dGVuZHMgQXNzZXRLaW5kPihicmFuZDogQnJhbmQsIGFzc2V0S2luZDogSyk6IEFtb3VudDxLPjtcbiAqIH19XG4gKi9cbm1ha2VFbXB0eTooYnJhbmQsYXNzZXRLaW5kPS8qKiBAdHlwZSB7Y29uc3R9ICovJ25hdCcpPT57XG5hc3NlcnRSZW1vdGFibGUoYnJhbmQsJ2JyYW5kJyk7XG5hc3NlcnRBc3NldEtpbmQoYXNzZXRLaW5kKTtcbmNvbnN0IHZhbHVlPWhlbHBlcnNbYXNzZXRLaW5kXS5kb01ha2VFbXB0eSgpO1xucmV0dXJuIGhhcmRlbih7YnJhbmQsdmFsdWV9KTtcbiB9LFxuLyoqXG4gKiBSZXR1cm4gdGhlIGFtb3VudCByZXByZXNlbnRpbmcgYW4gZW1wdHkgYW1vdW50LCB1c2luZyBhbm90aGVyXG4gKiBhbW91bnQgYXMgdGhlIHRlbXBsYXRlIGZvciB0aGUgYnJhbmQgYW5kIGFzc2V0S2luZC5cbiAqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQHBhcmFtIHtBbW91bnQ8Sz59IGFtb3VudFxuICogQHJldHVybnMge0Ftb3VudDxLPn1cbiAqL1xubWFrZUVtcHR5RnJvbUFtb3VudDooYW1vdW50KT0+e1xuYXNzZXJ0UmVjb3JkKGFtb3VudCwnYW1vdW50Jyk7XG5jb25zdHticmFuZCx2YWx1ZX09YW1vdW50O1xuLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0Ki9cbmNvbnN0IGFzc2V0S2luZD1hc3NlcnRWYWx1ZUdldEFzc2V0S2luZCh2YWx1ZSk7XG4vKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QgKGlnbm9yZSBiL2MgZXJyb3JpbmcgaW4gQ0kgYnV0IG5vdCBteSBJREUpKi9cbnJldHVybiBBbW91bnRNYXRoLm1ha2VFbXB0eShicmFuZCxhc3NldEtpbmQpO1xuIH0sXG4vKipcbiAqIFJldHVybiB0cnVlIGlmIHRoZSBBbW91bnQgaXMgZW1wdHkuIE90aGVyd2lzZSBmYWxzZS5cbiAqXG4gKiBAcGFyYW0ge0Ftb3VudH0gYW1vdW50XG4gKiBAcGFyYW0ge0JyYW5kPX0gYnJhbmRcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5pc0VtcHR5OihhbW91bnQsYnJhbmQ9dW5kZWZpbmVkKT0+e1xuYXNzZXJ0UmVjb3JkKGFtb3VudCwnYW1vdW50Jyk7XG5jb25zdHticmFuZDphbGxlZ2VkQnJhbmQsdmFsdWV9PWFtb3VudDtcbmFzc2VydFJlbW90YWJsZShhbGxlZ2VkQnJhbmQsJ2JyYW5kJyk7XG5vcHRpb25hbEJyYW5kQ2hlY2soYWxsZWdlZEJyYW5kLGJyYW5kKTtcbmNvbnN0IGg9YXNzZXJ0VmFsdWVHZXRIZWxwZXJzKHZhbHVlKTtcbnJldHVybiBoLmRvSXNFbXB0eShoLmRvQ29lcmNlKHZhbHVlKSk7XG4gfSxcbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBsZWZ0QW1vdW50IGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGVcbiAqIHJpZ2h0QW1vdW50LiBGb3Igbm9uLXNjYWxhcnMsIFwiZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvXCIgZGVwZW5kc1xuICogb24gdGhlIGtpbmQgb2YgYW1vdW50LCBhcyBkZWZpbmVkIGJ5IHRoZSBNYXRoSGVscGVycy4gRm9yIGV4YW1wbGUsXG4gKiB3aGV0aGVyIHJlY3RhbmdsZSBBIGlzIGdyZWF0ZXIgdGhhbiByZWN0YW5nbGUgQiBkZXBlbmRzIG9uIHdoZXRoZXIgcmVjdGFuZ2xlXG4gKiBBIGluY2x1ZGVzIHJlY3RhbmdsZSBCIGFzIGRlZmluZWQgYnkgdGhlIGxvZ2ljIGluIE1hdGhIZWxwZXJzLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gbGVmdEFtb3VudFxuICogQHBhcmFtIHtBbW91bnQ8Sz59IHJpZ2h0QW1vdW50XG4gKiBAcGFyYW0ge0JyYW5kPEs+PX0gYnJhbmRcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5pc0dURToobGVmdEFtb3VudCxyaWdodEFtb3VudCxicmFuZD11bmRlZmluZWQpPT57XG5jb25zdCBoPWNoZWNrTFJBbmRHZXRIZWxwZXJzKGxlZnRBbW91bnQscmlnaHRBbW91bnQsYnJhbmQpO1xucmV0dXJuIGguZG9Jc0dURSguLi5jb2VyY2VMUihoLGxlZnRBbW91bnQscmlnaHRBbW91bnQpKTtcbiB9LFxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIGxlZnRBbW91bnQgZXF1YWxzIHRoZSByaWdodEFtb3VudC4gV2UgYXNzdW1lXG4gKiB0aGF0IGlmIGlzR1RFIGlzIHRydWUgaW4gYm90aCBkaXJlY3Rpb25zLCBpc0VxdWFsIGlzIGFsc28gdHJ1ZVxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gbGVmdEFtb3VudFxuICogQHBhcmFtIHtBbW91bnQ8Sz59IHJpZ2h0QW1vdW50XG4gKiBAcGFyYW0ge0JyYW5kPEs+PX0gYnJhbmRcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5pc0VxdWFsOihsZWZ0QW1vdW50LHJpZ2h0QW1vdW50LGJyYW5kPXVuZGVmaW5lZCk9PntcbmNvbnN0IGg9Y2hlY2tMUkFuZEdldEhlbHBlcnMobGVmdEFtb3VudCxyaWdodEFtb3VudCxicmFuZCk7XG5yZXR1cm4gaC5kb0lzRXF1YWwoLi4uY29lcmNlTFIoaCxsZWZ0QW1vdW50LHJpZ2h0QW1vdW50KSk7XG4gfSxcbi8qKlxuICogUmV0dXJucyBhIG5ldyBhbW91bnQgdGhhdCBpcyB0aGUgdW5pb24gb2YgYm90aCBsZWZ0QW1vdW50IGFuZCByaWdodEFtb3VudC5cbiAqXG4gKiBGb3IgZnVuZ2libGUgYW1vdW50IHRoaXMgbWVhbnMgYWRkaW5nIHRoZSB2YWx1ZXMuIEZvciBvdGhlciBraW5kcyBvZlxuICogYW1vdW50LCBpdCB1c3VhbGx5IG1lYW5zIGluY2x1ZGluZyBhbGwgb2YgdGhlIGVsZW1lbnRzIGZyb20gYm90aFxuICogbGVmdCBhbmQgcmlnaHQuXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEBwYXJhbSB7QW1vdW50PEs+fSBsZWZ0QW1vdW50XG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gcmlnaHRBbW91bnRcbiAqIEBwYXJhbSB7QnJhbmQ8Sz49fSBicmFuZFxuICogQHJldHVybnMge0Ftb3VudDxLPn1cbiAqL1xuYWRkOihsZWZ0QW1vdW50LHJpZ2h0QW1vdW50LGJyYW5kPXVuZGVmaW5lZCk9PntcbmNvbnN0IGg9Y2hlY2tMUkFuZEdldEhlbHBlcnMobGVmdEFtb3VudCxyaWdodEFtb3VudCxicmFuZCk7XG5jb25zdCB2YWx1ZT1oLmRvQWRkKC4uLmNvZXJjZUxSKGgsbGVmdEFtb3VudCxyaWdodEFtb3VudCkpO1xucmV0dXJuIGhhcmRlbih7YnJhbmQ6bGVmdEFtb3VudC5icmFuZCx2YWx1ZX0pO1xuIH0sXG4vKipcbiAqIFJldHVybnMgYSBuZXcgYW1vdW50IHRoYXQgaXMgdGhlIGxlZnRBbW91bnQgbWludXMgdGhlIHJpZ2h0QW1vdW50XG4gKiAoaS5lLiBldmVyeXRoaW5nIGluIHRoZSBsZWZ0QW1vdW50IHRoYXQgaXMgbm90IGluIHRoZVxuICogcmlnaHRBbW91bnQpLiBJZiBsZWZ0QW1vdW50IGRvZXNuJ3QgaW5jbHVkZSByaWdodEFtb3VudFxuICogKHN1YnRyYWN0aW9uIHJlc3VsdHMgaW4gYSBuZWdhdGl2ZSksIHRocm93ICBhbiBlcnJvci4gQmVjYXVzZSB0aGVcbiAqIGxlZnQgYW1vdW50IG11c3QgaW5jbHVkZSB0aGUgcmlnaHQgYW1vdW50LCB0aGlzIGlzIE5PVCBlcXVpdmFsZW50XG4gKiB0byBzZXQgc3VidHJhY3Rpb24uXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEBwYXJhbSB7QW1vdW50PEs+fSBsZWZ0QW1vdW50XG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gcmlnaHRBbW91bnRcbiAqIEBwYXJhbSB7QnJhbmQ8Sz49fSBicmFuZFxuICogQHJldHVybnMge0Ftb3VudDxLPn1cbiAqL1xuc3VidHJhY3Q6KGxlZnRBbW91bnQscmlnaHRBbW91bnQsYnJhbmQ9dW5kZWZpbmVkKT0+e1xuY29uc3QgaD1jaGVja0xSQW5kR2V0SGVscGVycyhsZWZ0QW1vdW50LHJpZ2h0QW1vdW50LGJyYW5kKTtcbmNvbnN0IHZhbHVlPWguZG9TdWJ0cmFjdCguLi5jb2VyY2VMUihoLGxlZnRBbW91bnQscmlnaHRBbW91bnQpKTtcbnJldHVybiBoYXJkZW4oe2JyYW5kOmxlZnRBbW91bnQuYnJhbmQsdmFsdWV9KTtcbiB9LFxuLyoqXG4gKiBSZXR1cm5zIHRoZSBtaW4gdmFsdWUgYmV0d2VlbiB4IGFuZCB5IHVzaW5nIGlzR1RFXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEBwYXJhbSB7QW1vdW50PEs+fSB4XG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0geVxuICogQHBhcmFtIHtCcmFuZDxLPj19IGJyYW5kXG4gKiBAcmV0dXJucyB7QW1vdW50PEs+fVxuICovXG5taW46KHgseSxicmFuZD11bmRlZmluZWQpPT5BbW91bnRNYXRoLmlzR1RFKHgseSxicmFuZCk/eTp4LFxuLyoqXG4gKiBSZXR1cm5zIHRoZSBtYXggdmFsdWUgYmV0d2VlbiB4IGFuZCB5IHVzaW5nIGlzR1RFXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEBwYXJhbSB7QW1vdW50PEs+fSB4XG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0geVxuICogQHBhcmFtIHtCcmFuZDxLPj19IGJyYW5kXG4gKiBAcmV0dXJucyB7QW1vdW50PEs+fVxuICovXG5tYXg6KHgseSxicmFuZD11bmRlZmluZWQpPT5BbW91bnRNYXRoLmlzR1RFKHgseSxicmFuZCk/eDp5fTskaOKAjV9vbmNlLkFtb3VudE1hdGgoQW1vdW50TWF0aCk7XG5cbmhhcmRlbihBbW91bnRNYXRoKTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHtBbW91bnR9IGFtb3VudFxuICovXG5jb25zdCBnZXRBc3NldEtpbmQ9KGFtb3VudCk9PntcbmFzc2VydFJlY29yZChhbW91bnQsJ2Ftb3VudCcpO1xuY29uc3R7dmFsdWV9PWFtb3VudDtcbi8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCAoaWdub3JlIGIvYyBlcnJvcmluZyBpbiBDSSBidXQgbm90IG15IElERSkqL1xucmV0dXJuIGFzc2VydFZhbHVlR2V0QXNzZXRLaW5kKHZhbHVlKTtcbiB9OyRo4oCNX29uY2UuZ2V0QXNzZXRLaW5kKGdldEFzc2V0S2luZCk7XG5oYXJkZW4oZ2V0QXNzZXRLaW5kKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJBc3NldEtpbmQiOlsiQXNzZXRLaW5kIl0sImFzc2VydEFzc2V0S2luZCI6WyJhc3NlcnRBc3NldEtpbmQiXSwiQW1vdW50TWF0aCI6WyJBbW91bnRNYXRoIl0sImdldEFzc2V0S2luZCI6WyJnZXRBc3NldEtpbmQiXSwiYXNzZXJ0VmFsdWVHZXRIZWxwZXJzIjpbImFzc2VydFZhbHVlR2V0SGVscGVycyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACO5t8cpAUAAKQFAAAnAAAAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL2Rpc3BsYXlJbmZvLmpzeyJpbXBvcnRzIjpbIi4vdHlwZUd1YXJkcy5qcyIsIkBhZ29yaWMvYXNzZXJ0IiwiQGFnb3JpYy9zdG9yZSJdLCJleHBvcnRzIjpbImNvZXJjZURpc3BsYXlJbmZvIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEZhaWwsZml0LERpc3BsYXlJbmZvU2hhcGU7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9hc3NlcnRcIiwgW1tcIkZhaWxcIiwgWyRo4oCNX2EgPT4gKEZhaWwgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiZml0XCIsIFskaOKAjV9hID0+IChmaXQgPSAkaOKAjV9hKV1dXV0sW1wiLi90eXBlR3VhcmRzLmpzXCIsIFtbXCJEaXNwbGF5SW5mb1NoYXBlXCIsIFskaOKAjV9hID0+IChEaXNwbGF5SW5mb1NoYXBlID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cbi8qKlxuICogQHBhcmFtIHtBZGRpdGlvbmFsRGlzcGxheUluZm99IGFsbGVnZWREaXNwbGF5SW5mb1xuICogQHBhcmFtIHtBc3NldEtpbmR9IGFzc2V0S2luZFxuICogQHJldHVybnMge0Rpc3BsYXlJbmZvfVxuICovXG5jb25zdCAgICAgICAgY29lcmNlRGlzcGxheUluZm89KGFsbGVnZWREaXNwbGF5SW5mbyxhc3NldEtpbmQpPT57XG5maXQoYWxsZWdlZERpc3BsYXlJbmZvLERpc3BsYXlJbmZvU2hhcGUsJ2Rpc3BsYXlJbmZvJyk7XG5cbmlmKGFsbGVnZWREaXNwbGF5SW5mby5hc3NldEtpbmQhPT11bmRlZmluZWQpe1xuYWxsZWdlZERpc3BsYXlJbmZvLmFzc2V0S2luZD09PWFzc2V0S2luZHx8XG5GYWlsIGBkaXNwbGF5SW5mby5hc3NldEtpbmQgd2FzIHByZXNlbnQgKCR7YWxsZWdlZERpc3BsYXlJbmZvLmFzc2V0S2luZH0pIGFuZCBkaWQgbm90IG1hdGNoIHRoZSBhc3NldEtpbmQgYXJndW1lbnQgKCR7YXNzZXRLaW5kfSlgO1xuIH1cbmNvbnN0IGRpc3BsYXlJbmZvPWhhcmRlbih7Li4uYWxsZWdlZERpc3BsYXlJbmZvLGFzc2V0S2luZH0pO1xuXG5pZihkaXNwbGF5SW5mby5kZWNpbWFsUGxhY2VzIT09dW5kZWZpbmVkKXtcbk51bWJlci5pc1NhZmVJbnRlZ2VyKGRpc3BsYXlJbmZvLmRlY2ltYWxQbGFjZXMpfHxcbkZhaWwgYGRlY2ltYWxQbGFjZXMgJHtkaXNwbGF5SW5mby5kZWNpbWFsUGxhY2VzfSBpcyBub3QgYSBzYWZlIGludGVnZXJgO1xuIH1cblxucmV0dXJuIGRpc3BsYXlJbmZvO1xuIH07JGjigI1fb25jZS5jb2VyY2VEaXNwbGF5SW5mbyhjb2VyY2VEaXNwbGF5SW5mbyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiY29lcmNlRGlzcGxheUluZm8iOlsiY29lcmNlRGlzcGxheUluZm8iXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAyb0sONMBAADTAQAAIQAAAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy9pbmRleC5qc3siaW1wb3J0cyI6WyIuL2Ftb3VudE1hdGguanMiLCIuL2lzc3VlcktpdC5qcyIsIi4vdHlwZUd1YXJkcy5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIi4vYW1vdW50TWF0aC5qcyIsIi4vaXNzdWVyS2l0LmpzIiwiLi90eXBlR3VhcmRzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9hbW91bnRNYXRoLmpzXCIsIFtdXSxbXCIuL2lzc3VlcktpdC5qc1wiLCBbXV0sW1wiLi90eXBlR3VhcmRzLmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADaWHrcMxsAADMbAAAlAAAAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL2lzc3VlcktpdC5qc3siaW1wb3J0cyI6WyIuL2Ftb3VudE1hdGguanMiLCIuL2Rpc3BsYXlJbmZvLmpzIiwiLi9wYXltZW50TGVkZ2VyLmpzIiwiLi90eXBlcy1hbWJpZW50LmpzIiwiQGFnb3JpYy9hc3NlcnQiLCJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy92YXQtZGF0YSJdLCJleHBvcnRzIjpbIm1ha2VEdXJhYmxlSXNzdWVyS2l0IiwibWFrZUlzc3VlcktpdCIsInZpdmlmeUlzc3VlcktpdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnQsYXNzZXJ0UGF0dGVybixtYWtlU2NhbGFyQmlnTWFwU3RvcmUsQXNzZXRLaW5kLGFzc2VydEFzc2V0S2luZCxjb2VyY2VEaXNwbGF5SW5mbyx2aXZpZnlQYXltZW50TGVkZ2VyOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvYXNzZXJ0XCIsIFtbXCJhc3NlcnRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJhc3NlcnRQYXR0ZXJuXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXR0ZXJuID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcIm1ha2VTY2FsYXJCaWdNYXBTdG9yZVwiLCBbJGjigI1fYSA9PiAobWFrZVNjYWxhckJpZ01hcFN0b3JlID0gJGjigI1fYSldXV1dLFtcIi4vYW1vdW50TWF0aC5qc1wiLCBbW1wiQXNzZXRLaW5kXCIsIFskaOKAjV9hID0+IChBc3NldEtpbmQgPSAkaOKAjV9hKV1dLFtcImFzc2VydEFzc2V0S2luZFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0QXNzZXRLaW5kID0gJGjigI1fYSldXV1dLFtcIi4vZGlzcGxheUluZm8uanNcIiwgW1tcImNvZXJjZURpc3BsYXlJbmZvXCIsIFskaOKAjV9hID0+IChjb2VyY2VEaXNwbGF5SW5mbyA9ICRo4oCNX2EpXV1dXSxbXCIuL3BheW1lbnRMZWRnZXIuanNcIiwgW1tcInZpdmlmeVBheW1lbnRMZWRnZXJcIiwgWyRo4oCNX2EgPT4gKHZpdmlmeVBheW1lbnRMZWRnZXIgPSAkaOKAjV9hKV1dXV0sW1wiLi90eXBlcy1hbWJpZW50LmpzXCIsIFtdXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGFnb3JpYy92YXQtZGF0YScpLkJhZ2dhZ2V9IEJhZ2dhZ2UgKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQHBhcmFtIHtCYWdnYWdlfSBpc3N1ZXJCYWdnYWdlXG4gKiBAcGFyYW0ge1NodXRkb3duV2l0aEZhaWx1cmU9fSBvcHRTaHV0ZG93bldpdGhGYWlsdXJlIElmIHRoaXMgaXNzdWVyIGZhaWxzXG4gKiBpbiB0aGUgbWlkZGxlIG9mIGFuIGF0b21pYyBhY3Rpb24gKHdoaWNoIGJ0dyBzaG91bGQgbmV2ZXIgaGFwcGVuKSwgaXRcbiAqIHBvdGVudGlhbGx5IGxlYXZlcyBpdHMgbGVkZ2VyIGluIGEgY29ycnVwdGVkIHN0YXRlLiBJZiB0aGlzIGZ1bmN0aW9uIHdhc1xuICogcHJvdmlkZWQsIHRoZW4gdGhlIGZhaWxlZCBhdG9taWMgYWN0aW9uIHdpbGwgY2FsbCBpdCwgc28gdGhhdCBzb21lXG4gKiBsYXJnZXIgdW5pdCBvZiBjb21wdXRhdGlvbiwgbGlrZSB0aGUgZW5jbG9zaW5nIHZhdCwgY2FuIGJlIHNodXRkb3duXG4gKiBiZWZvcmUgYW55dGhpbmcgZWxzZSBpcyBjb3JydXB0ZWQgYnkgdGhhdCBjb3JydXB0ZWQgc3RhdGUuXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNDM0XG4gKiBAcmV0dXJucyB7SXNzdWVyS2l0PEs+fVxuICovXG5jb25zdCAgICAgICAgdml2aWZ5SXNzdWVyS2l0PShcbmlzc3VlckJhZ2dhZ2UsXG5vcHRTaHV0ZG93bldpdGhGYWlsdXJlPXVuZGVmaW5lZCk9Plxue1xuY29uc3QgbmFtZT1pc3N1ZXJCYWdnYWdlLmdldCgnbmFtZScpO1xuLyoqIEB0eXBlIHtLfSAqL1xuY29uc3QgYXNzZXRLaW5kPWlzc3VlckJhZ2dhZ2UuZ2V0KCdhc3NldEtpbmQnKTtcbmNvbnN0IGRpc3BsYXlJbmZvPWlzc3VlckJhZ2dhZ2UuZ2V0KCdkaXNwbGF5SW5mbycpO1xuY29uc3QgZWxlbWVudFNoYXBlPWlzc3VlckJhZ2dhZ2UuZ2V0KCdlbGVtZW50U2hhcGUnKTtcbmFzc2VydC50eXBlb2YobmFtZSwnc3RyaW5nJyk7XG5hc3NlcnRBc3NldEtpbmQoYXNzZXRLaW5kKTtcblxuLyogQWRkIGFzc2V0S2luZCB0byBkaXNwbGF5SW5mbywgb3Igb3ZlcnJpZGUgaWYgcHJlc2VudCovXG5jb25zdCBjbGVhbkRpc3BsYXlJbmZvPWNvZXJjZURpc3BsYXlJbmZvKGRpc3BsYXlJbmZvLGFzc2V0S2luZCk7XG5pZihvcHRTaHV0ZG93bldpdGhGYWlsdXJlIT09dW5kZWZpbmVkKXtcbmFzc2VydC50eXBlb2Yob3B0U2h1dGRvd25XaXRoRmFpbHVyZSwnZnVuY3Rpb24nKTtcbiB9XG5cbmlmKGVsZW1lbnRTaGFwZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnRQYXR0ZXJuKGVsZW1lbnRTaGFwZSk7XG4gfVxuXG4vKiBBdHRlbnVhdGUgdGhlIHBvd2VyZnVsIGF1dGhvcml0eSB0byBtaW50IGFuZCBjaGFuZ2UgYmFsYW5jZXMqL1xuLyoqIEB0eXBlIHtQYXltZW50TGVkZ2VyPEs+fSAqL1xuLyogQHRzLWV4cGVjdC1lcnJvciBjb3VsZCBiZSBpbnN0YW50aWF0ZWQgd2l0aCBkaWZmZXJlbnQgc3VidHlwZSBvZiBBc3NldEtpbmQqL1xuY29uc3R7aXNzdWVyLG1pbnQsYnJhbmR9PXZpdmlmeVBheW1lbnRMZWRnZXIoXG5pc3N1ZXJCYWdnYWdlLFxubmFtZSxcbmFzc2V0S2luZCxcbmNsZWFuRGlzcGxheUluZm8sXG5lbGVtZW50U2hhcGUsXG5vcHRTaHV0ZG93bldpdGhGYWlsdXJlKTtcblxuXG5yZXR1cm4gaGFyZGVuKHtcbmJyYW5kLFxuaXNzdWVyLFxubWludCxcbmRpc3BsYXlJbmZvOmNsZWFuRGlzcGxheUluZm99KTtcblxuIH07JGjigI1fb25jZS52aXZpZnlJc3N1ZXJLaXQodml2aWZ5SXNzdWVyS2l0KTtcbmhhcmRlbih2aXZpZnlJc3N1ZXJLaXQpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBUaGUgbmFtZSBiZWNvbWVzIHBhcnQgb2YgdGhlIGJyYW5kIGluIGFzc2V0IGRlc2NyaXB0aW9ucy5cbiAqIFRoZSBuYW1lIGlzIHVzZWZ1bCBmb3IgZGVidWdnaW5nIGFuZCBkb3VibGUtY2hlY2tpbmdcbiAqIGFzc3VtcHRpb25zLCBidXQgc2hvdWxkIG5vdCBiZSB0cnVzdGVkIHdydCBhbnkgZXh0ZXJuYWwgbmFtZXNwYWNlLlxuICogRm9yIGV4YW1wbGUsIGFueW9uZSBjb3VsZCBjcmVhdGUgYSBuZXcgaXNzdWVyIGtpdCB3aXRoIG5hbWUgJ0JUQycsIGJ1dFxuICogaXQgaXMgbm90IGJpdGNvaW4gb3IgZXZlbiByZWxhdGVkLiBJdCBpcyBvbmx5IHRoZSBuYW1lIGFjY29yZGluZ1xuICogdG8gdGhhdCBpc3N1ZXIgYW5kIGJyYW5kLlxuICpcbiAqIFRoZSBhc3NldEtpbmQgd2lsbCBiZSB1c2VkIHRvIGltcG9ydCBhIHNwZWNpZmljIG1hdGhIZWxwZXJzXG4gKiBmcm9tIHRoZSBtYXRoSGVscGVycyBsaWJyYXJ5LiBGb3IgZXhhbXBsZSwgbmF0TWF0aEhlbHBlcnMsIHRoZVxuICogZGVmYXVsdCwgaXMgdXNlZCBmb3IgYmFzaWMgZnVuZ2libGUgdG9rZW5zLlxuICpcbiAqICBgZGlzcGxheUluZm9gIGdpdmVzIGluZm9ybWF0aW9uIHRvIHRoZSBVSSBvbiBob3cgdG8gZGlzcGxheSB0aGUgYW1vdW50LlxuICpcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gaXNzdWVyQmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7S30gW2Fzc2V0S2luZD1Bc3NldEtpbmQuTkFUXVxuICogQHBhcmFtIHtBZGRpdGlvbmFsRGlzcGxheUluZm99IFtkaXNwbGF5SW5mbz17fV1cbiAqIEBwYXJhbSB7U2h1dGRvd25XaXRoRmFpbHVyZT19IG9wdFNodXRkb3duV2l0aEZhaWx1cmUgSWYgdGhpcyBpc3N1ZXIgZmFpbHNcbiAqIGluIHRoZSBtaWRkbGUgb2YgYW4gYXRvbWljIGFjdGlvbiAod2hpY2ggYnR3IHNob3VsZCBuZXZlciBoYXBwZW4pLCBpdFxuICogcG90ZW50aWFsbHkgbGVhdmVzIGl0cyBsZWRnZXIgaW4gYSBjb3JydXB0ZWQgc3RhdGUuIElmIHRoaXMgZnVuY3Rpb24gd2FzXG4gKiBwcm92aWRlZCwgdGhlbiB0aGUgZmFpbGVkIGF0b21pYyBhY3Rpb24gd2lsbCBjYWxsIGl0LCBzbyB0aGF0IHNvbWVcbiAqIGxhcmdlciB1bml0IG9mIGNvbXB1dGF0aW9uLCBsaWtlIHRoZSBlbmNsb3NpbmcgdmF0LCBjYW4gYmUgc2h1dGRvd25cbiAqIGJlZm9yZSBhbnl0aGluZyBlbHNlIGlzIGNvcnJ1cHRlZCBieSB0aGF0IGNvcnJ1cHRlZCBzdGF0ZS5cbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM0MzRcbiAqIEBwYXJhbSB7UGFydGlhbDx7ZWxlbWVudFNoYXBlOiBQYXR0ZXJufT59IFtvcHRpb25zXVxuICogQHJldHVybnMge0lzc3VlcktpdDxLPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VEdXJhYmxlSXNzdWVyS2l0PShcbmlzc3VlckJhZ2dhZ2UsXG5uYW1lLFxuLyogQHRzLWV4cGVjdC1lcnJvciBLIGNvdWxkIGJlIGluc3RhbnRpYXRlZCB3aXRoIGEgZGlmZmVyZW50IHN1YnR5cGUgb2YgQXNzZXRLaW5kKi9cbmFzc2V0S2luZD1Bc3NldEtpbmQuTkFULFxuZGlzcGxheUluZm89aGFyZGVuKHt9KSxcbm9wdFNodXRkb3duV2l0aEZhaWx1cmU9dW5kZWZpbmVkLFxue2VsZW1lbnRTaGFwZT11bmRlZmluZWR9PXt9KT0+XG57XG5pc3N1ZXJCYWdnYWdlLmluaXQoJ25hbWUnLG5hbWUpO1xuaXNzdWVyQmFnZ2FnZS5pbml0KCdhc3NldEtpbmQnLGFzc2V0S2luZCk7XG5pc3N1ZXJCYWdnYWdlLmluaXQoJ2Rpc3BsYXlJbmZvJyxkaXNwbGF5SW5mbyk7XG5pc3N1ZXJCYWdnYWdlLmluaXQoJ2VsZW1lbnRTaGFwZScsZWxlbWVudFNoYXBlKTtcbnJldHVybiB2aXZpZnlJc3N1ZXJLaXQoaXNzdWVyQmFnZ2FnZSxvcHRTaHV0ZG93bldpdGhGYWlsdXJlKTtcbiB9OyRo4oCNX29uY2UubWFrZUR1cmFibGVJc3N1ZXJLaXQobWFrZUR1cmFibGVJc3N1ZXJLaXQpO1xuaGFyZGVuKG1ha2VEdXJhYmxlSXNzdWVyS2l0KTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9J25hdCddXG4gKiBUaGUgbmFtZSBiZWNvbWVzIHBhcnQgb2YgdGhlIGJyYW5kIGluIGFzc2V0IGRlc2NyaXB0aW9ucy5cbiAqIFRoZSBuYW1lIGlzIHVzZWZ1bCBmb3IgZGVidWdnaW5nIGFuZCBkb3VibGUtY2hlY2tpbmdcbiAqIGFzc3VtcHRpb25zLCBidXQgc2hvdWxkIG5vdCBiZSB0cnVzdGVkIHdydCBhbnkgZXh0ZXJuYWwgbmFtZXNwYWNlLlxuICogRm9yIGV4YW1wbGUsIGFueW9uZSBjb3VsZCBjcmVhdGUgYSBuZXcgaXNzdWVyIGtpdCB3aXRoIG5hbWUgJ0JUQycsIGJ1dFxuICogaXQgaXMgbm90IGJpdGNvaW4gb3IgZXZlbiByZWxhdGVkLiBJdCBpcyBvbmx5IHRoZSBuYW1lIGFjY29yZGluZ1xuICogdG8gdGhhdCBpc3N1ZXIgYW5kIGJyYW5kLlxuICpcbiAqIFRoZSBhc3NldEtpbmQgd2lsbCBiZSB1c2VkIHRvIGltcG9ydCBhIHNwZWNpZmljIG1hdGhIZWxwZXJzXG4gKiBmcm9tIHRoZSBtYXRoSGVscGVycyBsaWJyYXJ5LiBGb3IgZXhhbXBsZSwgbmF0TWF0aEhlbHBlcnMsIHRoZVxuICogZGVmYXVsdCwgaXMgdXNlZCBmb3IgYmFzaWMgZnVuZ2libGUgdG9rZW5zLlxuICpcbiAqICBgZGlzcGxheUluZm9gIGdpdmVzIGluZm9ybWF0aW9uIHRvIHRoZSBVSSBvbiBob3cgdG8gZGlzcGxheSB0aGUgYW1vdW50LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge0t9IFthc3NldEtpbmQ9J25hdCddXG4gKiBAcGFyYW0ge0FkZGl0aW9uYWxEaXNwbGF5SW5mb30gW2Rpc3BsYXlJbmZvPXt9XVxuICogQHBhcmFtIHtTaHV0ZG93bldpdGhGYWlsdXJlPX0gb3B0U2h1dGRvd25XaXRoRmFpbHVyZSBJZiB0aGlzIGlzc3VlciBmYWlsc1xuICogaW4gdGhlIG1pZGRsZSBvZiBhbiBhdG9taWMgYWN0aW9uICh3aGljaCBidHcgc2hvdWxkIG5ldmVyIGhhcHBlbiksIGl0XG4gKiBwb3RlbnRpYWxseSBsZWF2ZXMgaXRzIGxlZGdlciBpbiBhIGNvcnJ1cHRlZCBzdGF0ZS4gSWYgdGhpcyBmdW5jdGlvbiB3YXNcbiAqIHByb3ZpZGVkLCB0aGVuIHRoZSBmYWlsZWQgYXRvbWljIGFjdGlvbiB3aWxsIGNhbGwgaXQsIHNvIHRoYXQgc29tZVxuICogbGFyZ2VyIHVuaXQgb2YgY29tcHV0YXRpb24sIGxpa2UgdGhlIGVuY2xvc2luZyB2YXQsIGNhbiBiZSBzaHV0ZG93blxuICogYmVmb3JlIGFueXRoaW5nIGVsc2UgaXMgY29ycnVwdGVkIGJ5IHRoYXQgY29ycnVwdGVkIHN0YXRlLlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzQzNFxuICogQHBhcmFtIHtQYXJ0aWFsPHtlbGVtZW50U2hhcGU6IFBhdHRlcm59Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7SXNzdWVyS2l0PEs+fVxuICovXG5jb25zdCAgICAgICAgbWFrZUlzc3VlcktpdD0oXG5uYW1lLFxuLyogQHRzLWV4cGVjdC1lcnJvciBLIGNvdWxkIGJlIGluc3RhbnRpYXRlZCB3aXRoIGEgZGlmZmVyZW50IHN1YnR5cGUgb2YgQXNzZXRLaW5kKi9cbmFzc2V0S2luZD1Bc3NldEtpbmQuTkFULFxuZGlzcGxheUluZm89aGFyZGVuKHt9KSxcbm9wdFNodXRkb3duV2l0aEZhaWx1cmU9dW5kZWZpbmVkLFxue2VsZW1lbnRTaGFwZT11bmRlZmluZWR9PXt9KT0+XG5cbm1ha2VEdXJhYmxlSXNzdWVyS2l0KFxubWFrZVNjYWxhckJpZ01hcFN0b3JlKCdkcm9wcGVkIGlzc3VlciBraXQnLHtkdXJhYmxlOnRydWV9KSxcbm5hbWUsXG5hc3NldEtpbmQsXG5kaXNwbGF5SW5mbyxcbm9wdFNodXRkb3duV2l0aEZhaWx1cmUsXG57ZWxlbWVudFNoYXBlfSk7JGjigI1fb25jZS5tYWtlSXNzdWVyS2l0KG1ha2VJc3N1ZXJLaXQpO1xuXG5oYXJkZW4obWFrZUlzc3VlcktpdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsidml2aWZ5SXNzdWVyS2l0IjpbInZpdmlmeUlzc3VlcktpdCJdLCJtYWtlRHVyYWJsZUlzc3VlcktpdCI6WyJtYWtlRHVyYWJsZUlzc3VlcktpdCJdLCJtYWtlSXNzdWVyS2l0IjpbIm1ha2VJc3N1ZXJLaXQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAKS7skYwFAACMBQAAOgAAAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy9tYXRoSGVscGVycy9jb3B5QmFnTWF0aEhlbHBlcnMuanN7ImltcG9ydHMiOlsiLi4vdHlwZXMtYW1iaWVudC5qcyIsIkBhZ29yaWMvc3RvcmUiXSwiZXhwb3J0cyI6WyJjb3B5QmFnTWF0aEhlbHBlcnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQga2V5RVEsbWFrZUNvcHlCYWcsZml0LE0sZ2V0Q29weUJhZ0VudHJpZXMsYmFnSXNTdXBlcmJhZyxiYWdVbmlvbixiYWdEaXNqb2ludFN1YnRyYWN0OyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvc3RvcmVcIiwgW1tcImtleUVRXCIsIFskaOKAjV9hID0+IChrZXlFUSA9ICRo4oCNX2EpXV0sW1wibWFrZUNvcHlCYWdcIiwgWyRo4oCNX2EgPT4gKG1ha2VDb3B5QmFnID0gJGjigI1fYSldXSxbXCJmaXRcIiwgWyRo4oCNX2EgPT4gKGZpdCA9ICRo4oCNX2EpXV0sW1wiTVwiLCBbJGjigI1fYSA9PiAoTSA9ICRo4oCNX2EpXV0sW1wiZ2V0Q29weUJhZ0VudHJpZXNcIiwgWyRo4oCNX2EgPT4gKGdldENvcHlCYWdFbnRyaWVzID0gJGjigI1fYSldXSxbXCJiYWdJc1N1cGVyYmFnXCIsIFskaOKAjV9hID0+IChiYWdJc1N1cGVyYmFnID0gJGjigI1fYSldXSxbXCJiYWdVbmlvblwiLCBbJGjigI1fYSA9PiAoYmFnVW5pb24gPSAkaOKAjV9hKV1dLFtcImJhZ0Rpc2pvaW50U3VidHJhY3RcIiwgWyRo4oCNX2EgPT4gKGJhZ0Rpc2pvaW50U3VidHJhY3QgPSAkaOKAjV9hKV1dXV0sW1wiLi4vdHlwZXMtYW1iaWVudC5qc1wiLCBbXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGUge0NvcHlCYWdWYWx1ZX0gKi9cbmNvbnN0IGVtcHR5PW1ha2VDb3B5QmFnKFtdKTtcblxuLyoqXG4gKiBAdHlwZSB7TWF0aEhlbHBlcnM8Q29weUJhZ1ZhbHVlPn1cbiAqL1xuY29uc3QgICAgICAgIGNvcHlCYWdNYXRoSGVscGVycz1oYXJkZW4oe1xuZG9Db2VyY2U6KGJhZyk9PntcbmZpdChiYWcsTS5iYWcoKSwnYmFnIG9mIGFtb3VudCcpO1xucmV0dXJuIGJhZztcbiB9LFxuZG9NYWtlRW1wdHk6KCk9PmVtcHR5LFxuZG9Jc0VtcHR5OihiYWcpPT5nZXRDb3B5QmFnRW50cmllcyhiYWcpLmxlbmd0aD09PTAsXG5kb0lzR1RFOmJhZ0lzU3VwZXJiYWcsXG5kb0lzRXF1YWw6a2V5RVEsXG5kb0FkZDpiYWdVbmlvbixcbmRvU3VidHJhY3Q6YmFnRGlzam9pbnRTdWJ0cmFjdH0pOyRo4oCNX29uY2UuY29weUJhZ01hdGhIZWxwZXJzKGNvcHlCYWdNYXRoSGVscGVycyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiY29weUJhZ01hdGhIZWxwZXJzIjpbImNvcHlCYWdNYXRoSGVscGVycyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADliLpcmQUAAJkFAAA6AAAAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL21hdGhIZWxwZXJzL2NvcHlTZXRNYXRoSGVscGVycy5qc3siaW1wb3J0cyI6WyIuLi90eXBlcy1hbWJpZW50LmpzIiwiQGFnb3JpYy9zdG9yZSJdLCJleHBvcnRzIjpbImNvcHlTZXRNYXRoSGVscGVycyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBrZXlFUSxtYWtlQ29weVNldCxmaXQsTSxnZXRDb3B5U2V0S2V5cyxzZXRJc1N1cGVyc2V0LHNldERpc2pvaW50VW5pb24sc2V0RGlzam9pbnRTdWJ0cmFjdDskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJrZXlFUVwiLCBbJGjigI1fYSA9PiAoa2V5RVEgPSAkaOKAjV9hKV1dLFtcIm1ha2VDb3B5U2V0XCIsIFskaOKAjV9hID0+IChtYWtlQ29weVNldCA9ICRo4oCNX2EpXV0sW1wiZml0XCIsIFskaOKAjV9hID0+IChmaXQgPSAkaOKAjV9hKV1dLFtcIk1cIiwgWyRo4oCNX2EgPT4gKE0gPSAkaOKAjV9hKV1dLFtcImdldENvcHlTZXRLZXlzXCIsIFskaOKAjV9hID0+IChnZXRDb3B5U2V0S2V5cyA9ICRo4oCNX2EpXV0sW1wic2V0SXNTdXBlcnNldFwiLCBbJGjigI1fYSA9PiAoc2V0SXNTdXBlcnNldCA9ICRo4oCNX2EpXV0sW1wic2V0RGlzam9pbnRVbmlvblwiLCBbJGjigI1fYSA9PiAoc2V0RGlzam9pbnRVbmlvbiA9ICRo4oCNX2EpXV0sW1wic2V0RGlzam9pbnRTdWJ0cmFjdFwiLCBbJGjigI1fYSA9PiAoc2V0RGlzam9pbnRTdWJ0cmFjdCA9ICRo4oCNX2EpXV1dXSxbXCIuLi90eXBlcy1hbWJpZW50LmpzXCIsIFtdXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZSB7Q29weVNldFZhbHVlfSAqL1xuY29uc3QgZW1wdHk9bWFrZUNvcHlTZXQoW10pO1xuXG4vKipcbiAqIEB0eXBlIHtDb3B5U2V0TWF0aEhlbHBlcnN9XG4gKi9cbmNvbnN0ICAgICAgICBjb3B5U2V0TWF0aEhlbHBlcnM9aGFyZGVuKHtcbmRvQ29lcmNlOihzZXQpPT57XG5maXQoc2V0LE0uc2V0KCksJ3NldCBvZiBhbW91bnQnKTtcbnJldHVybiBzZXQ7XG4gfSxcbmRvTWFrZUVtcHR5OigpPT5lbXB0eSxcbmRvSXNFbXB0eTooc2V0KT0+Z2V0Q29weVNldEtleXMoc2V0KS5sZW5ndGg9PT0wLFxuZG9Jc0dURTpzZXRJc1N1cGVyc2V0LFxuZG9Jc0VxdWFsOmtleUVRLFxuZG9BZGQ6c2V0RGlzam9pbnRVbmlvbixcbmRvU3VidHJhY3Q6c2V0RGlzam9pbnRTdWJ0cmFjdH0pOyRo4oCNX29uY2UuY29weVNldE1hdGhIZWxwZXJzKGNvcHlTZXRNYXRoSGVscGVycyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiY29weVNldE1hdGhIZWxwZXJzIjpbImNvcHlTZXRNYXRoSGVscGVycyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABPEGsAEwYAABMGAAA2AAAAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL21hdGhIZWxwZXJzL25hdE1hdGhIZWxwZXJzLmpzeyJpbXBvcnRzIjpbIi4uL3R5cGVzLWFtYmllbnQuanMiLCJAYWdvcmljL25hdCJdLCJleHBvcnRzIjpbIm5hdE1hdGhIZWxwZXJzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IE5hdCxpc05hdDskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL25hdFwiLCBbW1wiTmF0XCIsIFskaOKAjV9hID0+IChOYXQgPSAkaOKAjV9hKV1dLFtcImlzTmF0XCIsIFskaOKAjV9hID0+IChpc05hdCA9ICRo4oCNX2EpXV1dXSxbXCIuLi90eXBlcy1hbWJpZW50LmpzXCIsIFtdXV0pOyAgIFxuXG5cblxuY29uc3R7RmFpbH09YXNzZXJ0O1xuY29uc3QgZW1wdHk9MG47XG5cbi8qKlxuICogRnVuZ2libGUgZGlnaXRhbCBhc3NldHMgdXNlIHRoZSBuYXRNYXRoSGVscGVycyB0byBtYW5hZ2UgYmFsYW5jZXMgLVxuICogdGhlIG9wZXJhdGlvbnMgYXJlIG1lcmVseSBhcml0aG1ldGljIG9uIG5hdHVyYWwsIG5vbi1uZWdhdGl2ZVxuICogbnVtYmVycy5cbiAqXG4gKiBOYXR1cmFsIG51bWJlcnMgYXJlIHVzZWQgZm9yIGZ1bmdpYmxlIGVyaWdodHMgc3VjaCBhcyBtb25leSBiZWNhdXNlXG4gKiByb3VuZGluZyBpc3N1ZXMgbWFrZSBmbG9hdHMgcHJvYmxlbWF0aWMuIEFsbCBvcGVyYXRpb25zIHNob3VsZCBiZVxuICogZG9uZSB3aXRoIHRoZSBzbWFsbGVzdCB3aG9sZSB1bml0IHN1Y2ggdGhhdCB0aGUgTmF0TWF0aEhlbHBlcnMgbmV2ZXJcbiAqIGRlYWxzIHdpdGggZnJhY3Rpb25hbCBwYXJ0cy5cbiAqXG4gKiBAdHlwZSB7TWF0aEhlbHBlcnM8TmF0VmFsdWU+fVxuICovXG5jb25zdCAgICAgICAgbmF0TWF0aEhlbHBlcnM9aGFyZGVuKHtcbmRvQ29lcmNlOihuYXQpPT57XG4vKiBUT0RPOiB0aWdodGVuIHRoZSBkZWZpbml0aW9uIG9mIE5hdCBpbiBAYWdvcmljL25hdCB0byB0aHJvdyBvbiBgbnVtYmVyYCovXG5hc3NlcnQudHlwZW9mKG5hdCwnYmlnaW50Jyk7XG5pc05hdChuYXQpfHxGYWlsIGB2YWx1ZSAke25hdH0gbXVzdCBiZSBhIG5hdHVyYWwgbnVtYmVyYDtcbnJldHVybiBOYXQobmF0KTtcbiB9LFxuZG9NYWtlRW1wdHk6KCk9PmVtcHR5LFxuZG9Jc0VtcHR5OihuYXQpPT5uYXQ9PT1lbXB0eSxcbmRvSXNHVEU6KGxlZnQscmlnaHQpPT5sZWZ0Pj1yaWdodCxcbmRvSXNFcXVhbDoobGVmdCxyaWdodCk9PmxlZnQ9PT1yaWdodCxcbi8qIEJpZ0ludHMgZG9uJ3Qgb2JzZXJ2YWJseSBvdmVyZmxvdyovXG5kb0FkZDoobGVmdCxyaWdodCk9PmxlZnQrcmlnaHQsXG5kb1N1YnRyYWN0OihsZWZ0LHJpZ2h0KT0+TmF0KGxlZnQtcmlnaHQpfSk7JGjigI1fb25jZS5uYXRNYXRoSGVscGVycyhuYXRNYXRoSGVscGVycyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibmF0TWF0aEhlbHBlcnMiOlsibmF0TWF0aEhlbHBlcnMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAkYC5rn8HAAB/BwAANgAAAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy9tYXRoSGVscGVycy9zZXRNYXRoSGVscGVycy5qc3siaW1wb3J0cyI6WyIuLi90eXBlcy1hbWJpZW50LmpzIiwiQGFnb3JpYy9zdG9yZSIsIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJzZXRNYXRoSGVscGVycyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBwYXNzU3R5bGVPZixhc3NlcnRLZXksZWxlbWVudHNJc1N1cGVyc2V0LGVsZW1lbnRzRGlzam9pbnRVbmlvbixlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QsY29lcmNlVG9FbGVtZW50cyxlbGVtZW50c0NvbXBhcmU7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcImFzc2VydEtleVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0S2V5ID0gJGjigI1fYSldXSxbXCJlbGVtZW50c0lzU3VwZXJzZXRcIiwgWyRo4oCNX2EgPT4gKGVsZW1lbnRzSXNTdXBlcnNldCA9ICRo4oCNX2EpXV0sW1wiZWxlbWVudHNEaXNqb2ludFVuaW9uXCIsIFskaOKAjV9hID0+IChlbGVtZW50c0Rpc2pvaW50VW5pb24gPSAkaOKAjV9hKV1dLFtcImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdFwiLCBbJGjigI1fYSA9PiAoZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0ID0gJGjigI1fYSldXSxbXCJjb2VyY2VUb0VsZW1lbnRzXCIsIFskaOKAjV9hID0+IChjb2VyY2VUb0VsZW1lbnRzID0gJGjigI1fYSldXSxbXCJlbGVtZW50c0NvbXBhcmVcIiwgWyRo4oCNX2EgPT4gKGVsZW1lbnRzQ29tcGFyZSA9ICRo4oCNX2EpXV1dXSxbXCIuLi90eXBlcy1hbWJpZW50LmpzXCIsIFtdXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG4vKiBPcGVyYXRpb25zIGZvciBhcnJheXMgd2l0aCB1bmlxdWUgb2JqZWN0cyBpZGVudGlmeWluZyBhbmQgcHJvdmlkaW5nKi9cbi8qIGluZm9ybWF0aW9uIGFib3V0IGRpZ2l0YWwgYXNzZXRzLiBVc2VkIGZvciBab2UgaW52aXRlcy4qL1xuLyoqIEB0eXBlIHtTZXRWYWx1ZX0gKi9cbmNvbnN0IGVtcHR5PWhhcmRlbihbXSk7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgUmVwbGFjZSBhcnJheS1iYXNlZCBTZXRNYXRoIHdpdGggQ29weVNldC1iYXNlZCBDb3B5U2V0TWF0aFxuICogQHR5cGUge1NldE1hdGhIZWxwZXJzfVxuICovXG5jb25zdCAgICAgICAgc2V0TWF0aEhlbHBlcnM9aGFyZGVuKHtcbmRvQ29lcmNlOihsaXN0KT0+e1xubGlzdD1jb2VyY2VUb0VsZW1lbnRzKGxpc3QpO1xuLyogQXNzZXJ0IHRoYXQgbGlzdCBjb250YWlucyBvbmx5Ki9cbi8qICogcGFzcy1ieS1jb3B5IHByaW1pdGl2ZXMsKi9cbi8qICogcGFzcy1ieS1jb3B5IGNvbnRhaW5lcnMgY29udGFpbmluZyBrZXlzLCovXG4vKiAqIHJlbW90YWJsZXMuKi9cbmFzc2VydEtleShsaXN0KTtcbnJldHVybiBsaXN0O1xuIH0sXG5kb01ha2VFbXB0eTooKT0+ZW1wdHksXG5kb0lzRW1wdHk6KGxpc3QpPT5wYXNzU3R5bGVPZihsaXN0KT09PSdjb3B5QXJyYXknJiZsaXN0Lmxlbmd0aD09PTAsXG5kb0lzR1RFOmVsZW1lbnRzSXNTdXBlcnNldCxcbmRvSXNFcXVhbDooeCx5KT0+ZWxlbWVudHNDb21wYXJlKHgseSk9PT0wLFxuZG9BZGQ6ZWxlbWVudHNEaXNqb2ludFVuaW9uLFxuZG9TdWJ0cmFjdDplbGVtZW50c0Rpc2pvaW50U3VidHJhY3R9KTskaOKAjV9vbmNlLnNldE1hdGhIZWxwZXJzKHNldE1hdGhIZWxwZXJzKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJzZXRNYXRoSGVscGVycyI6WyJzZXRNYXRoSGVscGVycyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAEVD8rgQQAAIEEAAAjAAAAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL3BheW1lbnQuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvdmF0LWRhdGEiXSwiZXhwb3J0cyI6WyJ2aXZpZnlQYXltZW50S2luZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBpbml0RW1wdHksdml2aWZ5RmFyQ2xhc3M7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiaW5pdEVtcHR5XCIsIFskaOKAjV9hID0+IChpbml0RW1wdHkgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1widml2aWZ5RmFyQ2xhc3NcIiwgWyRo4oCNX2EgPT4gKHZpdmlmeUZhckNsYXNzID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAYWdvcmljL3ZhdC1kYXRhJykuQmFnZ2FnZX0gQmFnZ2FnZSAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGlzc3VlckJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge0JyYW5kPEs+fSBicmFuZFxuICogQHBhcmFtIHtJbnRlcmZhY2VHdWFyZH0gUGF5bWVudElcbiAqIEByZXR1cm5zIHsoKSA9PiBQYXltZW50PEs+fVxuICovXG5jb25zdCAgICAgICAgdml2aWZ5UGF5bWVudEtpbmQ9KGlzc3VlckJhZ2dhZ2UsbmFtZSxicmFuZCxQYXltZW50SSk9PntcbmNvbnN0IG1ha2VQYXltZW50PXZpdmlmeUZhckNsYXNzKFxuaXNzdWVyQmFnZ2FnZSxcbiBgJHtuYW1lfSBwYXltZW50YCxcblBheW1lbnRJLFxuaW5pdEVtcHR5LFxue1xuZ2V0QWxsZWdlZEJyYW5kKCl7XG5yZXR1cm4gYnJhbmQ7XG4gfX0pO1xuXG5cbnJldHVybiBtYWtlUGF5bWVudDtcbiB9OyRo4oCNX29uY2Uudml2aWZ5UGF5bWVudEtpbmQodml2aWZ5UGF5bWVudEtpbmQpO1xuaGFyZGVuKHZpdmlmeVBheW1lbnRLaW5kKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJ2aXZpZnlQYXltZW50S2luZCI6WyJ2aXZpZnlQYXltZW50S2luZCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACpSD8cnDwAAJw8AAApAAAAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL3BheW1lbnRMZWRnZXIuanN7ImltcG9ydHMiOlsiLi9hbW91bnRNYXRoLmpzIiwiLi9wYXltZW50LmpzIiwiLi9wdXJzZS5qcyIsIi4vdHlwZUd1YXJkcy5qcyIsIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL3N0b3JlL2V4cG9ydGVkLmpzIiwiQGFnb3JpYy92YXQtZGF0YSIsIkBlbmRvL21hcnNoYWwiLCJAZW5kby9wcm9taXNlLWtpdCJdLCJleHBvcnRzIjpbInZpdmlmeVBheW1lbnRMZWRnZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgaXNQcm9taXNlLGFzc2VydENvcHlBcnJheSxmaXQsTSxwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSx2aXZpZnlGYXJJbnN0YW5jZSxBbW91bnRNYXRoLHZpdmlmeVBheW1lbnRLaW5kLHZpdmlmeVB1cnNlS2luZCxCcmFuZEksbWFrZUlzc3VlckludGVyZmFjZXM7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcImlzUHJvbWlzZVwiLCBbJGjigI1fYSA9PiAoaXNQcm9taXNlID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcImFzc2VydENvcHlBcnJheVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q29weUFycmF5ID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcImZpdFwiLCBbJGjigI1fYSA9PiAoZml0ID0gJGjigI1fYSldXSxbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcInByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlXCIsIFskaOKAjV9hID0+IChwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSA9ICRo4oCNX2EpXV0sW1widml2aWZ5RmFySW5zdGFuY2VcIiwgWyRo4oCNX2EgPT4gKHZpdmlmeUZhckluc3RhbmNlID0gJGjigI1fYSldXV1dLFtcIi4vYW1vdW50TWF0aC5qc1wiLCBbW1wiQW1vdW50TWF0aFwiLCBbJGjigI1fYSA9PiAoQW1vdW50TWF0aCA9ICRo4oCNX2EpXV1dXSxbXCIuL3BheW1lbnQuanNcIiwgW1tcInZpdmlmeVBheW1lbnRLaW5kXCIsIFskaOKAjV9hID0+ICh2aXZpZnlQYXltZW50S2luZCA9ICRo4oCNX2EpXV1dXSxbXCIuL3B1cnNlLmpzXCIsIFtbXCJ2aXZpZnlQdXJzZUtpbmRcIiwgWyRo4oCNX2EgPT4gKHZpdmlmeVB1cnNlS2luZCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlL2V4cG9ydGVkLmpzXCIsIFtdXSxbXCIuL3R5cGVHdWFyZHMuanNcIiwgW1tcIkJyYW5kSVwiLCBbJGjigI1fYSA9PiAoQnJhbmRJID0gJGjigI1fYSldXSxbXCJtYWtlSXNzdWVySW50ZXJmYWNlc1wiLCBbJGjigI1fYSA9PiAobWFrZUlzc3VlckludGVyZmFjZXMgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BhZ29yaWMvdmF0LWRhdGEnKS5CYWdnYWdlfSBCYWdnYWdlICovXG5cbmNvbnN0e2RldGFpbHM6WCxxdW90ZTpxLEZhaWx9PWFzc2VydDtcblxuY29uc3QgYW1vdW50U2hhcGVGcm9tRWxlbWVudFNoYXBlPShicmFuZCxhc3NldEtpbmQsZWxlbWVudFNoYXBlKT0+e1xubGV0IHZhbHVlU2hhcGU7XG5zd2l0Y2goYXNzZXRLaW5kKXtcbmNhc2UnbmF0Jzp7XG52YWx1ZVNoYXBlPU0ubmF0KCk7XG5lbGVtZW50U2hhcGU9PT11bmRlZmluZWR8fFxuRmFpbCBgRnVuZ2libGUgYXNzZXRzIGNhbm5vdCBoYXZlIGFuIGVsZW1lbnRTaGFwZTogJHtxKGVsZW1lbnRTaGFwZSl9YDtcbmJyZWFrO1xuIH1cbmNhc2Unc2V0Jzp7XG5pZihlbGVtZW50U2hhcGU9PT11bmRlZmluZWQpe1xudmFsdWVTaGFwZT1NLmFycmF5T2YoTS5rZXkoKSk7XG4gfWVsc2V7XG52YWx1ZVNoYXBlPU0uYXJyYXlPZihNLmFuZChNLmtleSgpLGVsZW1lbnRTaGFwZSkpO1xuIH1cbmJyZWFrO1xuIH1cbmNhc2UnY29weVNldCc6e1xuaWYoZWxlbWVudFNoYXBlPT09dW5kZWZpbmVkKXtcbnZhbHVlU2hhcGU9TS5zZXQoKTtcbiB9ZWxzZXtcbnZhbHVlU2hhcGU9TS5zZXRPZihlbGVtZW50U2hhcGUpO1xuIH1cbmJyZWFrO1xuIH1cbmNhc2UnY29weUJhZyc6e1xuaWYoZWxlbWVudFNoYXBlPT09dW5kZWZpbmVkKXtcbnZhbHVlU2hhcGU9TS5iYWcoKTtcbiB9ZWxzZXtcbnZhbHVlU2hhcGU9TS5iYWdPZihlbGVtZW50U2hhcGUpO1xuIH1cbmJyZWFrO1xuIH1cbmRlZmF1bHQ6e1xuRmFpbCBgdW5leHBlY3RlZCBhc3NldCBraW5kICR7cShhc3NldEtpbmQpfWA7XG4gfX1cblxuXG5jb25zdCBhbW91bnRTaGFwZT1oYXJkZW4oe1xuYnJhbmQsLyogbWF0Y2hlcyBvbmx5IHRoaXMgZXhhY3QgYnJhbmQqL1xudmFsdWU6dmFsdWVTaGFwZX0pO1xuXG5yZXR1cm4gYW1vdW50U2hhcGU7XG4gfTtcblxuLyoqXG4gKiBNYWtlIHRoZSBwYXltZW50TGVkZ2VyLCB0aGUgc291cmNlIG9mIHRydXRoIGZvciB0aGUgYmFsYW5jZXMgb2ZcbiAqIHBheW1lbnRzLiBBbGwgbWludGluZyBhbmQgdHJhbnNmZXIgYXV0aG9yaXR5IG9yaWdpbmF0ZXMgaGVyZS5cbiAqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQHBhcmFtIHtCYWdnYWdlfSBpc3N1ZXJCYWdnYWdlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtLfSBhc3NldEtpbmRcbiAqIEBwYXJhbSB7RGlzcGxheUluZm88Sz59IGRpc3BsYXlJbmZvXG4gKiBAcGFyYW0ge1BhdHRlcm59IGVsZW1lbnRTaGFwZVxuICogQHBhcmFtIHtTaHV0ZG93bldpdGhGYWlsdXJlPX0gb3B0U2h1dGRvd25XaXRoRmFpbHVyZVxuICogQHJldHVybnMge1BheW1lbnRMZWRnZXI8Sz59XG4gKi9cbmNvbnN0ICAgICAgICB2aXZpZnlQYXltZW50TGVkZ2VyPShcbmlzc3VlckJhZ2dhZ2UsXG5uYW1lLFxuYXNzZXRLaW5kLFxuZGlzcGxheUluZm8sXG5lbGVtZW50U2hhcGUsXG5vcHRTaHV0ZG93bldpdGhGYWlsdXJlPXVuZGVmaW5lZCk9Plxue1xuLyoqIEB0eXBlIHtCcmFuZDxLPn0gKi9cbmNvbnN0IGJyYW5kPXZpdmlmeUZhckluc3RhbmNlKGlzc3VlckJhZ2dhZ2UsIGAke25hbWV9IGJyYW5kYCxCcmFuZEkse1xuaXNNeUlzc3VlcihhbGxlZ2VkSXNzdWVyKXtcbi8qIEJyYW5kSSBkZWxheXMgY2FsbGluZyB0aGlzIG1ldGhvZCB1bnRpbCBgYWxsZWdlZElzc3VlcmAgaXMgYSBSZW1vdGFibGUqL1xucmV0dXJuIGFsbGVnZWRJc3N1ZXI9PT1pc3N1ZXI7XG4gfSxcbmdldEFsbGVnZWROYW1lKCl7XG5yZXR1cm4gbmFtZTtcbiB9LFxuLyogR2l2ZSBpbmZvcm1hdGlvbiB0byBVSSBvbiBob3cgdG8gZGlzcGxheSB0aGUgYW1vdW50LiovXG5nZXREaXNwbGF5SW5mbygpe1xucmV0dXJuIGRpc3BsYXlJbmZvO1xuIH0sXG5nZXRBbW91bnRTaGFwZSgpe1xucmV0dXJuIGFtb3VudFNoYXBlO1xuIH19KTtcblxuXG5jb25zdCBlbXB0eUFtb3VudD1BbW91bnRNYXRoLm1ha2VFbXB0eShicmFuZCxhc3NldEtpbmQpO1xuY29uc3QgYW1vdW50U2hhcGU9YW1vdW50U2hhcGVGcm9tRWxlbWVudFNoYXBlKFxuYnJhbmQsXG5hc3NldEtpbmQsXG5lbGVtZW50U2hhcGUpO1xuXG5cbmNvbnN0e0lzc3VlckksTWludEksUGF5bWVudEksUHVyc2VJS2l0fT1tYWtlSXNzdWVySW50ZXJmYWNlcyhcbmJyYW5kLFxuYXNzZXRLaW5kLFxuYW1vdW50U2hhcGUpO1xuXG5cbmNvbnN0IG1ha2VQYXltZW50PXZpdmlmeVBheW1lbnRLaW5kKGlzc3VlckJhZ2dhZ2UsbmFtZSxicmFuZCxQYXltZW50SSk7XG5cbi8qKiBAdHlwZSB7U2h1dGRvd25XaXRoRmFpbHVyZX0gKi9cbmNvbnN0IHNodXRkb3duTGVkZ2VyV2l0aEZhaWx1cmU9KHJlYXNvbik9Pntcbi8qIFRPRE8gVGhpcyBzaG91bGQgYWxzbyBkZXN0cm95IGxlZGdlciBzdGF0ZS4qL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzQzNCovXG5pZihvcHRTaHV0ZG93bldpdGhGYWlsdXJlIT09dW5kZWZpbmVkKXtcbnRyeXtcbm9wdFNodXRkb3duV2l0aEZhaWx1cmUocmVhc29uKTtcbiB9Y2F0Y2goZXJySW5TaHV0ZG93bil7XG5hc3NlcnQubm90ZShlcnJJblNodXRkb3duLFggYENhdXNlZCBieTogJHtyZWFzb259YCk7XG50aHJvdyBlcnJJblNodXRkb3duO1xuIH1cbiB9XG50aHJvdyByZWFzb247XG4gfTtcblxuLyoqIEB0eXBlIHtXZWFrTWFwU3RvcmU8UGF5bWVudCwgQW1vdW50Pn0gKi9cbmNvbnN0IHBheW1lbnRMZWRnZXI9cHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUoXG5pc3N1ZXJCYWdnYWdlLFxuJ3BheW1lbnRMZWRnZXInKTtcblxuXG4vKipcbiAqIEEgd2l0aGRyYXduIGxpdmUgcGF5bWVudCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIHJlY292ZXJ5IHNldCBvZlxuICogdGhlIHB1cnNlIGl0IHdhcyB3aXRoZHJhd24gZnJvbS4gTGV0J3MgY2FsbCB0aGVzZSBcInJlY292ZXJhYmxlXCJcbiAqIHBheW1lbnRzLiBBbGwgcmVjb3ZlcmFibGUgcGF5bWVudHMgYXJlIGxpdmUsIGJ1dCBub3QgYWxsIGxpdmVcbiAqIHBheW1lbnRzIGFyZSByZWNvdmVyYWJsZS4gV2UgZG8gdGhlIGJvb2trZWVwaW5nIGZvciBwYXltZW50IHJlY292ZXJ5XG4gKiB3aXRoIHRoaXMgd2Vha21hcCBmcm9tIHJlY292ZXJhYmxlIHBheW1lbnRzIHRvIHRoZSByZWNvdmVyeSBzZXQgdGhleSBhcmVcbiAqIGluLlxuICogQSBidW5jaCBvZiBpbnRlcmVzdGluZyBpbnZhcmlhbnRzIGhlcmU6XG4gKiAgICAqIEV2ZXJ5IHBheW1lbnQgdGhhdCBpcyBhIGtleSBpbiB0aGUgb3V0ZXIgYHBheW1lbnRSZWNvdmVyeVNldHNgXG4gKiAgICAgIHdlYWtNYXAgaXMgYWxzbyBpbiB0aGUgcmVjb3Zlcnkgc2V0IGluZGV4ZWQgYnkgdGhhdCBwYXltZW50LlxuICogICAgKiBJbXBsaWVkIGJ5IHRoZSBhYm92ZSBidXQgd29ydGggc3RhdGluZzogdGhlIHBheW1lbnQgaXMgb25seVxuICogICAgICBpbiBhdCBtb3N0IG9uZSByZWNvdmVyeSBzZXQuXG4gKiAgICAqIEEgcmVjb3Zlcnkgc2V0IG9ubHkgY29udGFpbnMgc3VjaCBwYXltZW50cy5cbiAqICAgICogRXZlcnkgcHVyc2UgaXMgYXNzb2NpYXRlZCB3aXRoIGV4YWN0bHkgb25lIHJlY292ZXJ5IHNldCB1bmlxdWUgdG9cbiAqICAgICAgaXQuXG4gKiAgICAqIEEgcHVyc2UncyByZWNvdmVyeSBzZXQgb25seSBjb250YWlucyBwYXltZW50cyB3aXRoZHJhd24gZnJvbVxuICogICAgICB0aGF0IHB1cnNlIGFuZCBub3QgeWV0IGNvbnN1bWVkLlxuICpcbiAqIEB0eXBlIHtXZWFrTWFwU3RvcmU8UGF5bWVudCwgU2V0U3RvcmU8UGF5bWVudD4+fVxuICovXG5jb25zdCBwYXltZW50UmVjb3ZlcnlTZXRzPXByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlKFxuaXNzdWVyQmFnZ2FnZSxcbidwYXltZW50UmVjb3ZlcnlTZXRzJyk7XG5cblxuLyoqXG4gKiBUbyBtYWludGFpbiB0aGUgaW52YXJpYW50cyBsaXN0ZWQgaW4gdGhlIGBwYXltZW50UmVjb3ZlcnlTZXRzYCBjb21tZW50LFxuICogYGluaXRQYXltZW50YCBzaG91bGQgY29udGFpbiB0aGUgb25seVxuICogY2FsbCB0byBgcGF5bWVudExlZGdlci5pbml0YC5cbiAqXG4gKiBAcGFyYW0ge1BheW1lbnR9IHBheW1lbnRcbiAqIEBwYXJhbSB7QW1vdW50fSBhbW91bnRcbiAqIEBwYXJhbSB7U2V0U3RvcmU8UGF5bWVudD59IFtvcHRSZWNvdmVyeVNldF1cbiAqL1xuY29uc3QgaW5pdFBheW1lbnQ9KHBheW1lbnQsYW1vdW50LG9wdFJlY292ZXJ5U2V0PXVuZGVmaW5lZCk9PntcbmlmKG9wdFJlY292ZXJ5U2V0IT09dW5kZWZpbmVkKXtcbm9wdFJlY292ZXJ5U2V0LmFkZChwYXltZW50KTtcbnBheW1lbnRSZWNvdmVyeVNldHMuaW5pdChwYXltZW50LG9wdFJlY292ZXJ5U2V0KTtcbiB9XG5wYXltZW50TGVkZ2VyLmluaXQocGF5bWVudCxhbW91bnQpO1xuIH07XG5cbi8qKlxuICogVG8gbWFpbnRhaW4gdGhlIGludmFyaWFudHMgbGlzdGVkIGluIHRoZSBgcGF5bWVudFJlY292ZXJ5U2V0c2AgY29tbWVudCxcbiAqIGBkZWxldGVQYXltZW50YCBzaG91bGQgY29udGFpbiB0aGUgb25seVxuICogY2FsbCB0byBgcGF5bWVudExlZGdlci5kZWxldGVgLlxuICpcbiAqIEBwYXJhbSB7UGF5bWVudH0gcGF5bWVudFxuICovXG5jb25zdCBkZWxldGVQYXltZW50PShwYXltZW50KT0+e1xucGF5bWVudExlZGdlci5kZWxldGUocGF5bWVudCk7XG5pZihwYXltZW50UmVjb3ZlcnlTZXRzLmhhcyhwYXltZW50KSl7XG5jb25zdCByZWNvdmVyeVNldD1wYXltZW50UmVjb3ZlcnlTZXRzLmdldChwYXltZW50KTtcbnBheW1lbnRSZWNvdmVyeVNldHMuZGVsZXRlKHBheW1lbnQpO1xucmVjb3ZlcnlTZXQuZGVsZXRlKHBheW1lbnQpO1xuIH1cbiB9O1xuXG4vKiogQHR5cGUgeyhsZWZ0OiBBbW91bnQsIHJpZ2h0OiBBbW91bnQpID0+IEFtb3VudCB9ICovXG5jb25zdCBhZGQ9KGxlZnQscmlnaHQpPT5BbW91bnRNYXRoLmFkZChsZWZ0LHJpZ2h0LGJyYW5kKTtcbi8qKiBAdHlwZSB7KGxlZnQ6IEFtb3VudCwgcmlnaHQ6IEFtb3VudCkgPT4gQW1vdW50IH0gKi9cbmNvbnN0IHN1YnRyYWN0PShsZWZ0LHJpZ2h0KT0+QW1vdW50TWF0aC5zdWJ0cmFjdChsZWZ0LHJpZ2h0LGJyYW5kKTtcbi8qKiBAdHlwZSB7KGFsbGVnZWRBbW91bnQ6IEFtb3VudCkgPT4gQW1vdW50fSAqL1xuY29uc3QgY29lcmNlPShhbGxlZ2VkQW1vdW50KT0+QW1vdW50TWF0aC5jb2VyY2UoYnJhbmQsYWxsZWdlZEFtb3VudCk7XG4vKiogQHR5cGUgeyhsZWZ0OiBBbW91bnQsIHJpZ2h0OiBBbW91bnQpID0+IGJvb2xlYW4gfSAqL1xuY29uc3QgaXNFcXVhbD0obGVmdCxyaWdodCk9PkFtb3VudE1hdGguaXNFcXVhbChsZWZ0LHJpZ2h0LGJyYW5kKTtcblxuLyoqXG4gKiBNZXRob2RzIGxpa2UgZGVwb3NpdCgpIGhhdmUgYW4gb3B0aW9uYWwgc2Vjb25kIHBhcmFtZXRlclxuICogYG9wdEFtb3VudFNoYXBlYFxuICogd2hpY2gsIGlmIHByZXNlbnQsIGlzIHN1cHBvc2VkIHRvIG1hdGNoIHRoZSBiYWxhbmNlIG9mIHRoZVxuICogcGF5bWVudC4gVGhpcyBoZWxwZXIgZnVuY3Rpb24gZG9lcyB0aGF0IGNoZWNrLlxuICpcbiAqIE5vdGU6IGBvcHRBbW91bnRTaGFwZWAgaXMgdXNlci1zdXBwbGllZCB3aXRoIG5vIHByZXZpb3VzIHZhbGlkYXRpb24uXG4gKlxuICogQHBhcmFtIHtBbW91bnR9IHBheW1lbnRCYWxhbmNlXG4gKiBAcGFyYW0ge1BhdHRlcm49fSBvcHRBbW91bnRTaGFwZVxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmNvbnN0IGFzc2VydEFtb3VudENvbnNpc3RlbnQ9KHBheW1lbnRCYWxhbmNlLG9wdEFtb3VudFNoYXBlKT0+e1xuaWYob3B0QW1vdW50U2hhcGUhPT11bmRlZmluZWQpe1xuZml0KHBheW1lbnRCYWxhbmNlLG9wdEFtb3VudFNoYXBlLCdhbW91bnQnKTtcbiB9XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1BheW1lbnR9IHBheW1lbnRcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5jb25zdCBhc3NlcnRMaXZlUGF5bWVudD0ocGF5bWVudCk9PntcbnBheW1lbnRMZWRnZXIuaGFzKHBheW1lbnQpfHxcbkZhaWwgYCR7cGF5bWVudH0gd2FzIG5vdCBhIGxpdmUgcGF5bWVudCBmb3IgYnJhbmQgJHtxKFxuYnJhbmQpXG4gfS4gSXQgY291bGQgYmUgYSB1c2VkLXVwIHBheW1lbnQsIGEgcGF5bWVudCBmb3IgYW5vdGhlciBicmFuZCwgb3IgaXQgbWlnaHQgbm90IGJlIGEgcGF5bWVudCBhdCBhbGwuYDtcbiB9O1xuXG4vKipcbiAqIFJlYWxsb2NhdGUgYXNzZXRzIGZyb20gdGhlIGBwYXltZW50c2AgcGFzc2VkIGluIHRvIG5ldyBwYXltZW50c1xuICogY3JlYXRlZCBhbmQgcmV0dXJuZWQsIHdpdGggYmFsYW5jZXMgZnJvbSBgbmV3UGF5bWVudEJhbGFuY2VzYC5cbiAqIEVuZm9yY2VzIHRoYXQgdG90YWwgYXNzZXRzIGFyZSBjb25zZXJ2ZWQuXG4gKlxuICogTm90ZSB0aGF0IHRoaXMgaXMgbm90IHRoZSBvbmx5IG9wZXJhdGlvbiB0aGF0IG1vdmVzIGFzc2V0cy5cbiAqIGBwdXJzZS5kZXBvc2l0YCBhbmQgYHB1cnNlLndpdGhkcmF3YCBtb3ZlIGFzc2V0cyBiZXR3ZWVuIGEgcHVyc2UgYW5kXG4gKiBhIHBheW1lbnQsIGFuZCBzbyBtdXN0IGFsc28gZW5mb3JjZSBjb25zZXJ2YXRpb24gdGhlcmUuXG4gKlxuICogQHBhcmFtIHtQYXltZW50W119IHBheW1lbnRzXG4gKiBAcGFyYW0ge0Ftb3VudFtdfSBuZXdQYXltZW50QmFsYW5jZXNcbiAqIEByZXR1cm5zIHtQYXltZW50W119XG4gKi9cbmNvbnN0IG1vdmVBc3NldHM9KHBheW1lbnRzLG5ld1BheW1lbnRCYWxhbmNlcyk9PntcbmFzc2VydENvcHlBcnJheShwYXltZW50cywncGF5bWVudHMnKTtcbmFzc2VydENvcHlBcnJheShuZXdQYXltZW50QmFsYW5jZXMsJ25ld1BheW1lbnRCYWxhbmNlcycpO1xuXG4vKiBUaGVyZSBtYXkgYmUgemVybywgb25lLCBvciBtYW55IHBheW1lbnRzIGFzIGlucHV0IHRvKi9cbi8qIG1vdmVBc3NldHMuIFdlIHdhbnQgdG8gcHJvdGVjdCBhZ2FpbnN0IHNvbWVvbmUgcGFzc2luZyBpbiovXG4vKiB3aGF0IGFwcGVhcnMgdG8gYmUgbXVsdGlwbGUgcGF5bWVudHMgdGhhdCB0dXJuIG91dCB0byBhY3R1YWxseSovXG4vKiBiZSB0aGUgc2FtZSBwYXltZW50IChhbiBhbGlhc2luZyBpc3N1ZSkuIFRoZSBgY29tYmluZWAgbWV0aG9kKi9cbi8qIGxlZ2l0aW1hdGVseSBuZWVkcyB0byB0YWtlIGluIG11bHRpcGxlIHBheW1lbnRzLCBidXQgd2UgZG9uJ3QqL1xuLyogbmVlZCB0byBwYXkgdGhlIGNvc3RzIG9mIHByb3RlY3RpbmcgYWdhaW5zdCBhbGlhc2luZyBmb3IgdGhlKi9cbi8qIG90aGVyIHVzZXMuKi9cblxuaWYocGF5bWVudHMubGVuZ3RoPjEpe1xuY29uc3QgYW50aUFsaWFzaW5nU3RvcmU9bmV3IFNldCgpO1xucGF5bWVudHMuZm9yRWFjaCgocGF5bWVudCk9PntcbiFhbnRpQWxpYXNpbmdTdG9yZS5oYXMocGF5bWVudCl8fFxuRmFpbCBgc2FtZSBwYXltZW50ICR7cGF5bWVudH0gc2VlbiB0d2ljZWA7XG5hbnRpQWxpYXNpbmdTdG9yZS5hZGQocGF5bWVudCk7XG4gfSk7XG4gfVxuXG5jb25zdCB0b3RhbD1wYXltZW50cy5tYXAocGF5bWVudExlZGdlci5nZXQpLnJlZHVjZShhZGQsZW1wdHlBbW91bnQpO1xuXG5jb25zdCBuZXdUb3RhbD1uZXdQYXltZW50QmFsYW5jZXMucmVkdWNlKGFkZCxlbXB0eUFtb3VudCk7XG5cbi8qIEludmFyaWFudCBjaGVjayovXG5pc0VxdWFsKHRvdGFsLG5ld1RvdGFsKXx8XG5GYWlsIGByaWdodHMgd2VyZSBub3QgY29uc2VydmVkOiAke3RvdGFsfSB2cyAke25ld1RvdGFsfWA7XG5cbmxldCBuZXdQYXltZW50cztcbnRyeXtcbi8qIENPTU1JVCBQT0lOVCovXG5wYXltZW50cy5mb3JFYWNoKChwYXltZW50KT0+ZGVsZXRlUGF5bWVudChwYXltZW50KSk7XG5cbm5ld1BheW1lbnRzPW5ld1BheW1lbnRCYWxhbmNlcy5tYXAoKGJhbGFuY2UpPT57XG5jb25zdCBuZXdQYXltZW50PW1ha2VQYXltZW50KCk7XG5pbml0UGF5bWVudChuZXdQYXltZW50LGJhbGFuY2UsdW5kZWZpbmVkKTtcbnJldHVybiBuZXdQYXltZW50O1xuIH0pO1xuIH1jYXRjaChlcnIpe1xuc2h1dGRvd25MZWRnZXJXaXRoRmFpbHVyZShlcnIpO1xudGhyb3cgZXJyO1xuIH1cbnJldHVybiBoYXJkZW4obmV3UGF5bWVudHMpO1xuIH07XG5cbi8qKlxuICogVXNlZCBieSB0aGUgcHVyc2UgY29kZSB0byBpbXBsZW1lbnQgcHVyc2UuZGVwb3NpdFxuICpcbiAqIEBwYXJhbSB7QW1vdW50fSBjdXJyZW50QmFsYW5jZSAtIHRoZSBjdXJyZW50IGJhbGFuY2Ugb2YgdGhlIHB1cnNlXG4gKiBiZWZvcmUgYSBkZXBvc2l0XG4gKiBAcGFyYW0geyhuZXdQdXJzZUJhbGFuY2U6IEFtb3VudCkgPT4gdm9pZH0gdXBkYXRlUHVyc2VCYWxhbmNlIC1cbiAqIGNvbW1pdCB0aGUgcHVyc2UgYmFsYW5jZVxuICogQHBhcmFtIHtQYXltZW50fSBzcmNQYXltZW50XG4gKiBAcGFyYW0ge1BhdHRlcm49fSBvcHRBbW91bnRTaGFwZVxuICogQHJldHVybnMge0Ftb3VudH1cbiAqL1xuY29uc3QgZGVwb3NpdEludGVybmFsPShcbmN1cnJlbnRCYWxhbmNlLFxudXBkYXRlUHVyc2VCYWxhbmNlLFxuc3JjUGF5bWVudCxcbm9wdEFtb3VudFNoYXBlPXVuZGVmaW5lZCk9Plxue1xuYXNzZXJ0KFxuIWlzUHJvbWlzZShzcmNQYXltZW50KSxcbiBgZGVwb3NpdCBkb2VzIG5vdCBhY2NlcHQgcHJvbWlzZXMgYXMgZmlyc3QgYXJndW1lbnQuIEluc3RlYWQgb2YgcGFzc2luZyB0aGUgcHJvbWlzZSAoZGVwb3NpdChwYXltZW50UHJvbWlzZSkpLCBjb25zaWRlciB1bndyYXBwaW5nIHRoZSBwcm9taXNlIGZpcnN0OiBFLndoZW4ocGF5bWVudFByb21pc2UsIChhY3R1YWxQYXltZW50ID0+IGRlcG9zaXQoYWN0dWFsUGF5bWVudCkpYCxcblR5cGVFcnJvcik7XG5cbmFzc2VydExpdmVQYXltZW50KHNyY1BheW1lbnQpO1xuY29uc3Qgc3JjUGF5bWVudEJhbGFuY2U9cGF5bWVudExlZGdlci5nZXQoc3JjUGF5bWVudCk7XG5hc3NlcnRBbW91bnRDb25zaXN0ZW50KHNyY1BheW1lbnRCYWxhbmNlLG9wdEFtb3VudFNoYXBlKTtcbmNvbnN0IG5ld1B1cnNlQmFsYW5jZT1hZGQoc3JjUGF5bWVudEJhbGFuY2UsY3VycmVudEJhbGFuY2UpO1xudHJ5e1xuLyogQ09NTUlUIFBPSU5UKi9cbi8qIE1vdmUgdGhlIGFzc2V0cyBpbiBgc3JjUGF5bWVudGAgaW50byB0aGlzIHB1cnNlLCB1c2luZyB1cCB0aGUqL1xuLyogc291cmNlIHBheW1lbnQsIHN1Y2ggdGhhdCB0b3RhbCBhc3NldHMgYXJlIGNvbnNlcnZlZC4qL1xuZGVsZXRlUGF5bWVudChzcmNQYXltZW50KTtcbnVwZGF0ZVB1cnNlQmFsYW5jZShuZXdQdXJzZUJhbGFuY2UpO1xuIH1jYXRjaChlcnIpe1xuc2h1dGRvd25MZWRnZXJXaXRoRmFpbHVyZShlcnIpO1xudGhyb3cgZXJyO1xuIH1cbnJldHVybiBzcmNQYXltZW50QmFsYW5jZTtcbiB9O1xuXG4vKipcbiAqIFVzZWQgYnkgdGhlIHB1cnNlIGNvZGUgdG8gaW1wbGVtZW50IHB1cnNlLndpdGhkcmF3XG4gKlxuICogQHBhcmFtIHtBbW91bnR9IGN1cnJlbnRCYWxhbmNlIC0gdGhlIGN1cnJlbnQgYmFsYW5jZSBvZiB0aGUgcHVyc2VcbiAqIGJlZm9yZSBhIHdpdGhkcmF3YWxcbiAqIEBwYXJhbSB7KG5ld1B1cnNlQmFsYW5jZTogQW1vdW50KSA9PiB2b2lkfSB1cGRhdGVQdXJzZUJhbGFuY2UgLVxuICogY29tbWl0IHRoZSBwdXJzZSBiYWxhbmNlXG4gKiBAcGFyYW0ge0Ftb3VudH0gYW1vdW50IC0gdGhlIGFtb3VudCB0byBiZSB3aXRoZHJhd25cbiAqIEBwYXJhbSB7U2V0U3RvcmU8UGF5bWVudD59IHJlY292ZXJ5U2V0XG4gKiBAcmV0dXJucyB7UGF5bWVudH1cbiAqL1xuY29uc3Qgd2l0aGRyYXdJbnRlcm5hbD0oXG5jdXJyZW50QmFsYW5jZSxcbnVwZGF0ZVB1cnNlQmFsYW5jZSxcbmFtb3VudCxcbnJlY292ZXJ5U2V0KT0+XG57XG5hbW91bnQ9Y29lcmNlKGFtb3VudCk7XG5BbW91bnRNYXRoLmlzR1RFKGN1cnJlbnRCYWxhbmNlLGFtb3VudCl8fFxuRmFpbCBgV2l0aGRyYXdhbCBvZiAke2Ftb3VudH0gZmFpbGVkIGJlY2F1c2UgdGhlIHB1cnNlIG9ubHkgY29udGFpbmVkICR7Y3VycmVudEJhbGFuY2V9YDtcbmNvbnN0IG5ld1B1cnNlQmFsYW5jZT1zdWJ0cmFjdChjdXJyZW50QmFsYW5jZSxhbW91bnQpO1xuXG5jb25zdCBwYXltZW50PW1ha2VQYXltZW50KCk7XG50cnl7XG4vKiBDT01NSVQgUE9JTlQgTW92ZSB0aGUgd2l0aGRyYXduIGFzc2V0cyBmcm9tIHRoaXMgcHVyc2UgaW50byovXG4vKiBwYXltZW50LiBUb3RhbCBhc3NldHMgbXVzdCByZW1haW4gY29uc2VydmVkLiovXG51cGRhdGVQdXJzZUJhbGFuY2UobmV3UHVyc2VCYWxhbmNlKTtcbmluaXRQYXltZW50KHBheW1lbnQsYW1vdW50LHJlY292ZXJ5U2V0KTtcbiB9Y2F0Y2goZXJyKXtcbnNodXRkb3duTGVkZ2VyV2l0aEZhaWx1cmUoZXJyKTtcbnRocm93IGVycjtcbiB9XG5yZXR1cm4gcGF5bWVudDtcbiB9O1xuXG5jb25zdCBtYWtlRW1wdHlQdXJzZT12aXZpZnlQdXJzZUtpbmQoXG5pc3N1ZXJCYWdnYWdlLFxubmFtZSxcbmFzc2V0S2luZCxcbmJyYW5kLFxuUHVyc2VJS2l0LFxuaGFyZGVuKHtcbmRlcG9zaXRJbnRlcm5hbCxcbndpdGhkcmF3SW50ZXJuYWx9KSk7XG5cblxuXG4vKiogQHR5cGUge0lzc3VlcjxLPn0gKi9cbmNvbnN0IGlzc3Vlcj12aXZpZnlGYXJJbnN0YW5jZShpc3N1ZXJCYWdnYWdlLCBgJHtuYW1lfSBpc3N1ZXJgLElzc3Vlckkse1xuZ2V0QnJhbmQoKXtcbnJldHVybiBicmFuZDtcbiB9LFxuZ2V0QWxsZWdlZE5hbWUoKXtcbnJldHVybiBuYW1lO1xuIH0sXG5nZXRBc3NldEtpbmQoKXtcbnJldHVybiBhc3NldEtpbmQ7XG4gfSxcbmdldERpc3BsYXlJbmZvKCl7XG5yZXR1cm4gZGlzcGxheUluZm87XG4gfSxcbm1ha2VFbXB0eVB1cnNlKCl7XG5yZXR1cm4gbWFrZUVtcHR5UHVyc2UoKTtcbiB9LFxuaXNMaXZlKHBheW1lbnQpe1xuLyogSXNzdWVySSBkZWxheXMgY2FsbGluZyB0aGlzIG1ldGhvZCB1bnRpbCBgcGF5bWVudGAgaXMgYSBSZW1vdGFibGUqL1xucmV0dXJuIHBheW1lbnRMZWRnZXIuaGFzKHBheW1lbnQpO1xuIH0sXG5nZXRBbW91bnRPZihwYXltZW50KXtcbi8qIElzc3VlckkgZGVsYXlzIGNhbGxpbmcgdGhpcyBtZXRob2QgdW50aWwgYHBheW1lbnRgIGlzIGEgUmVtb3RhYmxlKi9cbmFzc2VydExpdmVQYXltZW50KHBheW1lbnQpO1xucmV0dXJuIHBheW1lbnRMZWRnZXIuZ2V0KHBheW1lbnQpO1xuIH0sXG5cbmJ1cm4ocGF5bWVudCxvcHRBbW91bnRTaGFwZT11bmRlZmluZWQpe1xuLyogSXNzdWVySSBkZWxheXMgY2FsbGluZyB0aGlzIG1ldGhvZCB1bnRpbCBgcGF5bWVudGAgaXMgYSBSZW1vdGFibGUqL1xuYXNzZXJ0TGl2ZVBheW1lbnQocGF5bWVudCk7XG5jb25zdCBwYXltZW50QmFsYW5jZT1wYXltZW50TGVkZ2VyLmdldChwYXltZW50KTtcbmFzc2VydEFtb3VudENvbnNpc3RlbnQocGF5bWVudEJhbGFuY2Usb3B0QW1vdW50U2hhcGUpO1xudHJ5e1xuLyogQ09NTUlUIFBPSU5ULiovXG5kZWxldGVQYXltZW50KHBheW1lbnQpO1xuIH1jYXRjaChlcnIpe1xuc2h1dGRvd25MZWRnZXJXaXRoRmFpbHVyZShlcnIpO1xudGhyb3cgZXJyO1xuIH1cbnJldHVybiBwYXltZW50QmFsYW5jZTtcbiB9LFxuY2xhaW0oc3JjUGF5bWVudCxvcHRBbW91bnRTaGFwZT11bmRlZmluZWQpe1xuLyogSXNzdWVySSBkZWxheXMgY2FsbGluZyB0aGlzIG1ldGhvZCB1bnRpbCBgc3JjUGF5bWVudGAgaXMgYSBSZW1vdGFibGUqL1xuYXNzZXJ0TGl2ZVBheW1lbnQoc3JjUGF5bWVudCk7XG5jb25zdCBzcmNQYXltZW50QmFsYW5jZT1wYXltZW50TGVkZ2VyLmdldChzcmNQYXltZW50KTtcbmFzc2VydEFtb3VudENvbnNpc3RlbnQoc3JjUGF5bWVudEJhbGFuY2Usb3B0QW1vdW50U2hhcGUpO1xuLyogTm90ZSBDT01NSVQgUE9JTlQgd2l0aGluIG1vdmVBc3NldHMuKi9cbmNvbnN0W3BheW1lbnRdPW1vdmVBc3NldHMoXG5oYXJkZW4oW3NyY1BheW1lbnRdKSxcbmhhcmRlbihbc3JjUGF5bWVudEJhbGFuY2VdKSk7XG5cbnJldHVybiBwYXltZW50O1xuIH0sXG5jb21iaW5lKGZyb21QYXltZW50c1BBcnJheSxvcHRUb3RhbEFtb3VudD11bmRlZmluZWQpe1xuLyogSXNzdWVySSBkb2VzICpub3QqIGRlbGF5IGNhbGxpbmcgYGNvbWJpbmVgLCBidXQgcmF0aGVyIGxlYXZlcyBpdCovXG4vKiB0byBgY29tYmluZWAgdG8gZGVsYXkgZnVydGhlciBwcm9jZXNzaW5nIHVudGlsIGFsbCB0aGUgZWxlbWVudHMgb2YqL1xuLyogYGZyb21QYXltZW50c1BBcnJheWAgaGF2ZSBmdWxmaWxsZWQuKi9cblxuLyogUGF5bWVudHMgaW4gYGZyb21QYXltZW50c1BBcnJheWAgbXVzdCBiZSBkaXN0aW5jdC4gQWxpYXMqL1xuLyogY2hlY2tpbmcgaXMgZGVsZWdhdGVkIHRvIHRoZSBgbW92ZUFzc2V0c2AgZnVuY3Rpb24uKi9cbnJldHVybiBQcm9taXNlLmFsbChmcm9tUGF5bWVudHNQQXJyYXkpLnRoZW4oKGZyb21QYXltZW50c0FycmF5KT0+e1xuZnJvbVBheW1lbnRzQXJyYXkuZXZlcnkoYXNzZXJ0TGl2ZVBheW1lbnQpO1xuY29uc3QgdG90YWxQYXltZW50c0JhbGFuY2U9ZnJvbVBheW1lbnRzQXJyYXkuXG5tYXAocGF5bWVudExlZGdlci5nZXQpLlxucmVkdWNlKGFkZCxlbXB0eUFtb3VudCk7XG5hc3NlcnRBbW91bnRDb25zaXN0ZW50KHRvdGFsUGF5bWVudHNCYWxhbmNlLG9wdFRvdGFsQW1vdW50KTtcbi8qIE5vdGUgQ09NTUlUIFBPSU5UIHdpdGhpbiBtb3ZlQXNzZXRzLiovXG5jb25zdFtwYXltZW50XT1tb3ZlQXNzZXRzKFxuaGFyZGVuKGZyb21QYXltZW50c0FycmF5KSxcbmhhcmRlbihbdG90YWxQYXltZW50c0JhbGFuY2VdKSk7XG5cbnJldHVybiBwYXltZW50O1xuIH0pO1xuIH0sXG5zcGxpdChzcmNQYXltZW50LHBheW1lbnRBbW91bnRBKXtcbi8qIElzc3VlckkgZGVsYXlzIGNhbGxpbmcgdGhpcyBtZXRob2QgdW50aWwgYHNyY1BheW1lbnRgIGlzIGEgUmVtb3RhYmxlKi9cbnBheW1lbnRBbW91bnRBPWNvZXJjZShwYXltZW50QW1vdW50QSk7XG5hc3NlcnRMaXZlUGF5bWVudChzcmNQYXltZW50KTtcbmNvbnN0IHNyY1BheW1lbnRCYWxhbmNlPXBheW1lbnRMZWRnZXIuZ2V0KHNyY1BheW1lbnQpO1xuY29uc3QgcGF5bWVudEFtb3VudEI9c3VidHJhY3Qoc3JjUGF5bWVudEJhbGFuY2UscGF5bWVudEFtb3VudEEpO1xuLyogTm90ZSBDT01NSVQgUE9JTlQgd2l0aGluIG1vdmVBc3NldHMuKi9cbmNvbnN0IG5ld1BheW1lbnRzPW1vdmVBc3NldHMoXG5oYXJkZW4oW3NyY1BheW1lbnRdKSxcbmhhcmRlbihbcGF5bWVudEFtb3VudEEscGF5bWVudEFtb3VudEJdKSk7XG5cbnJldHVybiBuZXdQYXltZW50cztcbiB9LFxuc3BsaXRNYW55KHNyY1BheW1lbnQsYW1vdW50cyl7XG4vKiBJc3N1ZXJJIGRlbGF5cyBjYWxsaW5nIHRoaXMgbWV0aG9kIHVudGlsIGBzcmNQYXltZW50YCBpcyBhIFJlbW90YWJsZSovXG5hc3NlcnRMaXZlUGF5bWVudChzcmNQYXltZW50KTtcbmFzc2VydENvcHlBcnJheShhbW91bnRzLCdhbW91bnRzJyk7XG5hbW91bnRzPWFtb3VudHMubWFwKGNvZXJjZSk7XG4vKiBOb3RlIENPTU1JVCBQT0lOVCB3aXRoaW4gbW92ZUFzc2V0cy4qL1xuY29uc3QgbmV3UGF5bWVudHM9bW92ZUFzc2V0cyhoYXJkZW4oW3NyY1BheW1lbnRdKSxoYXJkZW4oYW1vdW50cykpO1xucmV0dXJuIG5ld1BheW1lbnRzO1xuIH19KTtcblxuXG4vKiogQHR5cGUge01pbnQ8Sz59ICovXG5jb25zdCBtaW50PXZpdmlmeUZhckluc3RhbmNlKGlzc3VlckJhZ2dhZ2UsIGAke25hbWV9IG1pbnRgLE1pbnRJLHtcbmdldElzc3Vlcigpe1xucmV0dXJuIGlzc3VlcjtcbiB9LFxubWludFBheW1lbnQobmV3QW1vdW50KXtcbm5ld0Ftb3VudD1jb2VyY2UobmV3QW1vdW50KTtcbmZpdChuZXdBbW91bnQsYW1vdW50U2hhcGUsJ21pbnRlZCBhbW91bnQnKTtcbmNvbnN0IHBheW1lbnQ9bWFrZVBheW1lbnQoKTtcbmluaXRQYXltZW50KHBheW1lbnQsbmV3QW1vdW50LHVuZGVmaW5lZCk7XG5yZXR1cm4gcGF5bWVudDtcbiB9fSk7XG5cblxuY29uc3QgaXNzdWVyS2l0PWhhcmRlbih7aXNzdWVyLG1pbnQsYnJhbmR9KTtcbnJldHVybiBpc3N1ZXJLaXQ7XG4gfTskaOKAjV9vbmNlLnZpdmlmeVBheW1lbnRMZWRnZXIodml2aWZ5UGF5bWVudExlZGdlcik7XG5oYXJkZW4odml2aWZ5UGF5bWVudExlZGdlcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsidml2aWZ5UGF5bWVudExlZGdlciI6WyJ2aXZpZnlQYXltZW50TGVkZ2VyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADVNirnbDgAA2w4AACEAAABAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvcHVyc2UuanN7ImltcG9ydHMiOlsiLi9hbW91bnRNYXRoLmpzIiwiLi90cmFuc2llbnROb3RpZmllci5qcyIsIkBhZ29yaWMvdmF0LWRhdGEiXSwiZXhwb3J0cyI6WyJ2aXZpZnlQdXJzZUtpbmQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgdml2aWZ5RmFyQ2xhc3NLaXQsbWFrZVNjYWxhckJpZ1NldFN0b3JlLEFtb3VudE1hdGgsbWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0OyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcInZpdmlmeUZhckNsYXNzS2l0XCIsIFskaOKAjV9hID0+ICh2aXZpZnlGYXJDbGFzc0tpdCA9ICRo4oCNX2EpXV0sW1wibWFrZVNjYWxhckJpZ1NldFN0b3JlXCIsIFskaOKAjV9hID0+IChtYWtlU2NhbGFyQmlnU2V0U3RvcmUgPSAkaOKAjV9hKV1dXV0sW1wiLi9hbW91bnRNYXRoLmpzXCIsIFtbXCJBbW91bnRNYXRoXCIsIFskaOKAjV9hID0+IChBbW91bnRNYXRoID0gJGjigI1fYSldXV1dLFtcIi4vdHJhbnNpZW50Tm90aWZpZXIuanNcIiwgW1tcIm1ha2VUcmFuc2llbnROb3RpZmllcktpdFwiLCBbJGjigI1fYSA9PiAobWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5jb25zdHtGYWlsfT1hc3NlcnQ7XG5cbmNvbnN0ICAgICAgICB2aXZpZnlQdXJzZUtpbmQ9KFxuaXNzdWVyQmFnZ2FnZSxcbm5hbWUsXG5hc3NldEtpbmQsXG5icmFuZCxcblB1cnNlSUtpdCxcbnB1cnNlTWV0aG9kcyk9Plxue1xuLyogTm90ZTogVmlydHVhbCBmb3IgaGlnaCBjYXJkaW5hbGl0eSwgYnV0ICpub3QqIGR1cmFibGUsIGFuZCBzbyovXG4vKiBicm9rZW4gYWNyb3NzIGFuIHVwZ3JhZGUuKi9cbmNvbnN0e3Byb3ZpZGVOb3RpZmllcix1cGRhdGU6dXBkYXRlQmFsYW5jZX09bWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0KCk7XG5cbmNvbnN0IHVwZGF0ZVB1cnNlQmFsYW5jZT0oc3RhdGUsbmV3UHVyc2VCYWxhbmNlLHB1cnNlKT0+e1xuc3RhdGUuY3VycmVudEJhbGFuY2U9bmV3UHVyc2VCYWxhbmNlO1xudXBkYXRlQmFsYW5jZShwdXJzZSxwdXJzZS5nZXRDdXJyZW50QW1vdW50KCkpO1xuIH07XG5cbi8qIC0gVGhpcyBraW5kIGlzIGEgcGFpciBvZiBwdXJzZSBhbmQgZGVwb3NpdEZhY2V0IHRoYXQgaGF2ZSBhIDE6MSovXG4vKiBjb3JyZXNwb25kZW5jZS4qL1xuLyogLSBUaGV5IGFyZSB2aXJ0dWFsaXplZCB0b2dldGhlciB0byBzaGFyZSBhIHNpbmdsZSBzdGF0ZSByZWNvcmQuKi9cbi8qIC0gQW4gYWx0ZXJuYXRpdmUgZGVzaWduIGNvbnNpZGVyZWQgd2FzIHRvIGhhdmUgdGhpcyByZXR1cm4gYSBQdXJzZSBhbG9uZSovXG4vKiB0aGF0IGNyZWF0ZWQgZGVwb3NpdEZhY2V0IGFzIG5lZWRlZC4gQnV0IHRoaXMgYXBwcm9hY2ggZW5zdXJlcyBhIGNvbnN0YW50Ki9cbi8qIGlkZW50aXR5IGZvciB0aGUgZmFjZXQgYW5kIGV4ZXJjaXNlcyB0aGUgbXVsdGktZmFjZXRlZCBvYmplY3Qgc3R5bGUuKi9cbmNvbnN0e2RlcG9zaXRJbnRlcm5hbCx3aXRoZHJhd0ludGVybmFsfT1wdXJzZU1ldGhvZHM7XG5jb25zdCBtYWtlUHVyc2VLaXQ9dml2aWZ5RmFyQ2xhc3NLaXQoXG5pc3N1ZXJCYWdnYWdlLFxuIGAke25hbWV9IFB1cnNlYCxcblB1cnNlSUtpdCxcbigpPT57XG5jb25zdCBjdXJyZW50QmFsYW5jZT1BbW91bnRNYXRoLm1ha2VFbXB0eShicmFuZCxhc3NldEtpbmQpO1xuXG4vKiogQHR5cGUge1NldFN0b3JlPFBheW1lbnQ+fSAqL1xuY29uc3QgcmVjb3ZlcnlTZXQ9bWFrZVNjYWxhckJpZ1NldFN0b3JlKCdyZWNvdmVyeSBzZXQnLHtcbmR1cmFibGU6dHJ1ZX0pO1xuXG5cbnJldHVybntcbmN1cnJlbnRCYWxhbmNlLFxucmVjb3ZlcnlTZXR9O1xuXG4gfSxcbntcbnB1cnNlOntcbmRlcG9zaXQoc3JjUGF5bWVudCxvcHRBbW91bnRTaGFwZT11bmRlZmluZWQpe1xuLyogUHVyc2VJIGRvZXMgKm5vdCogZGVsYXkgYGRlcG9zaXRgIHVudGlsIGBzcmNQYXltZW50YCBpcyBmdWxmdWxsZWQuKi9cbi8qIFNlZSB0aGUgY29tbWVudHMgb24gUHVyc2VJLmRlcG9zaXQgaW4gdHlwZUd1YXJkcy5qcyovXG5jb25zdHtzdGF0ZX09dGhpcztcbi8qIE5vdGUgQ09NTUlUIFBPSU5UIHdpdGhpbiBkZXBvc2l0LiovXG5yZXR1cm4gZGVwb3NpdEludGVybmFsKFxuc3RhdGUuY3VycmVudEJhbGFuY2UsXG4obmV3UHVyc2VCYWxhbmNlKT0+XG51cGRhdGVQdXJzZUJhbGFuY2Uoc3RhdGUsbmV3UHVyc2VCYWxhbmNlLHRoaXMuZmFjZXRzLnB1cnNlKSxcbnNyY1BheW1lbnQsXG5vcHRBbW91bnRTaGFwZSxcbnN0YXRlLnJlY292ZXJ5U2V0KTtcblxuIH0sXG53aXRoZHJhdyhhbW91bnQpe1xuY29uc3R7c3RhdGV9PXRoaXM7XG4vKiBOb3RlIENPTU1JVCBQT0lOVCB3aXRoaW4gd2l0aGRyYXcuKi9cbnJldHVybiB3aXRoZHJhd0ludGVybmFsKFxuc3RhdGUuY3VycmVudEJhbGFuY2UsXG4obmV3UHVyc2VCYWxhbmNlKT0+XG51cGRhdGVQdXJzZUJhbGFuY2Uoc3RhdGUsbmV3UHVyc2VCYWxhbmNlLHRoaXMuZmFjZXRzLnB1cnNlKSxcbmFtb3VudCxcbnN0YXRlLnJlY292ZXJ5U2V0KTtcblxuIH0sXG5nZXRDdXJyZW50QW1vdW50KCl7XG5yZXR1cm4gdGhpcy5zdGF0ZS5jdXJyZW50QmFsYW5jZTtcbiB9LFxuZ2V0Q3VycmVudEFtb3VudE5vdGlmaWVyKCl7XG5yZXR1cm4gcHJvdmlkZU5vdGlmaWVyKHRoaXMuZmFjZXRzLnB1cnNlKTtcbiB9LFxuZ2V0QWxsZWdlZEJyYW5kKCl7XG5yZXR1cm4gYnJhbmQ7XG4gfSxcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5nZXREZXBvc2l0RmFjZXQoKXtcbnJldHVybiB0aGlzLmZhY2V0cy5kZXBvc2l0RmFjZXQ7XG4gfSxcblxuZ2V0UmVjb3ZlcnlTZXQoKXtcbnJldHVybiB0aGlzLnN0YXRlLnJlY292ZXJ5U2V0LnNuYXBzaG90KCk7XG4gfSxcbnJlY292ZXJBbGwoKXtcbmNvbnN0e3N0YXRlLGZhY2V0c309dGhpcztcbmxldCBhbW91bnQ9QW1vdW50TWF0aC5tYWtlRW1wdHkoYnJhbmQsYXNzZXRLaW5kKTtcbmZvcihjb25zdCBwYXltZW50IG9mIHN0YXRlLnJlY292ZXJ5U2V0LmtleXMoKSl7XG4vKiBUaGlzIGRvZXMgY2F1c2UgZGVsZXRpb25zIGZyb20gdGhlIHNldCB3aGlsZSBpdGVyYXRpbmcsKi9cbi8qIGJ1dCB0aGlzIHNwZWNpYWwgY2FzZSBpcyBhbGxvd2VkLiovXG5jb25zdCBkZWx0YT1mYWNldHMucHVyc2UuZGVwb3NpdChwYXltZW50KTtcbmFtb3VudD1BbW91bnRNYXRoLmFkZChhbW91bnQsZGVsdGEsYnJhbmQpO1xuIH1cbnN0YXRlLnJlY292ZXJ5U2V0LmdldFNpemUoKT09PTB8fFxuRmFpbCBgaW50ZXJuYWw6IFJlbWFpbmluZyB1bnJlY292ZXJlZCBwYXltZW50czogJHtmYWNldHMucHVyc2UuZ2V0UmVjb3ZlcnlTZXQoKX1gO1xucmV0dXJuIGFtb3VudDtcbiB9fSxcblxuZGVwb3NpdEZhY2V0OntcbnJlY2VpdmUoLi4uYXJncyl7XG5yZXR1cm4gdGhpcy5mYWNldHMucHVyc2UuZGVwb3NpdCguLi5hcmdzKTtcbiB9fX0pO1xuXG5cblxucmV0dXJuKCk9Pm1ha2VQdXJzZUtpdCgpLnB1cnNlO1xuIH07JGjigI1fb25jZS52aXZpZnlQdXJzZUtpbmQodml2aWZ5UHVyc2VLaW5kKTtcbmhhcmRlbih2aXZpZnlQdXJzZUtpbmQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InZpdmlmeVB1cnNlS2luZCI6WyJ2aXZpZnlQdXJzZUtpbmQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA3ts1pfsFAAD7BQAALQAAAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy90cmFuc2llbnROb3RpZmllci5qc3siaW1wb3J0cyI6WyJAYWdvcmljL25vdGlmaWVyIiwiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvdmF0LWRhdGEiXSwiZXhwb3J0cyI6WyJtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgbWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSxwcm92aWRlTGF6eSxtYWtlTm90aWZpZXJLaXQ7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1wibWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZVwiLCBbJGjigI1fYSA9PiAobWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJwcm92aWRlTGF6eVwiLCBbJGjigI1fYSA9PiAocHJvdmlkZUxhenkgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9ub3RpZmllclwiLCBbW1wibWFrZU5vdGlmaWVyS2l0XCIsIFskaOKAjV9hID0+IChtYWtlTm90aWZpZXJLaXQgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cbi8qIE5vdGU6IFZpcnR1YWwgZm9yIGhpZ2ggY2FyZGluYWxpdHksIGJ1dCAqbm90KiBkdXJhYmxlLCBhbmQgc28qL1xuLyogYnJva2VuIGFjcm9zcyBhbiB1cGdyYWRlLiovXG5jb25zdCAgICAgICAgbWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0PSgpPT57XG4vKiogQHR5cGUge1dlYWtNYXBTdG9yZTxQdXJzZSwgTm90aWZpZXJSZWNvcmQ8YW55Pj59ICovXG5jb25zdCB0cmFuc2llbnROb3RpZmVyS2l0cz1tYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlKFxuJ3RyYW5zaWVudE5vdGlmZXJLaXRzJyk7XG5cblxuY29uc3QgcHJvdmlkZU5vdGlmaWVyS2l0PShrZXkpPT5cbnByb3ZpZGVMYXp5KHRyYW5zaWVudE5vdGlmZXJLaXRzLGtleSwoKT0+XG5tYWtlTm90aWZpZXJLaXQoa2V5LmdldEN1cnJlbnRBbW91bnQoKSkpO1xuXG5cbmNvbnN0IHByb3ZpZGVOb3RpZmllcj0oa2V5KT0+cHJvdmlkZU5vdGlmaWVyS2l0KGtleSkubm90aWZpZXI7XG5jb25zdCB1cGRhdGU9KGtleSxuZXdWYWx1ZSk9PntcbmlmKHRyYW5zaWVudE5vdGlmZXJLaXRzLmhhcyhrZXkpKXtcbmNvbnN0e3VwZGF0ZXJ9PXRyYW5zaWVudE5vdGlmZXJLaXRzLmdldChrZXkpO1xudXBkYXRlci51cGRhdGVTdGF0ZShuZXdWYWx1ZSk7XG4gfVxuIH07XG5cbnJldHVybntwcm92aWRlTm90aWZpZXIsdXBkYXRlfTtcbiB9OyRo4oCNX29uY2UubWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0KG1ha2VUcmFuc2llbnROb3RpZmllcktpdCk7XG5oYXJkZW4obWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQiOlsibWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAF6JbmdpJwAAaScAACYAAABAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvdHlwZUd1YXJkcy5qc3siaW1wb3J0cyI6WyJAYWdvcmljL3N0b3JlIl0sImV4cG9ydHMiOlsiQW1vdW50U2hhcGUiLCJBc3NldEtpbmRTaGFwZSIsIkJyYW5kSSIsIkJyYW5kU2hhcGUiLCJEZXBvc2l0RmFjZXRTaGFwZSIsIkRpc3BsYXlJbmZvU2hhcGUiLCJJc3N1ZXJLaXRTaGFwZSIsIklzc3VlclNoYXBlIiwiTUFYX0FCU09MVVRFX0RFQ0lNQUxfUExBQ0VTIiwiTWludFNoYXBlIiwiUGF5bWVudFNoYXBlIiwiUHVyc2VTaGFwZSIsImlzQ29weUJhZ1ZhbHVlIiwiaXNDb3B5U2V0VmFsdWUiLCJpc05hdFZhbHVlIiwiaXNTZXRWYWx1ZSIsIm1ha2VJc3N1ZXJJbnRlcmZhY2VzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IE0sbWF0Y2hlczskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXSxbXCJtYXRjaGVzXCIsIFskaOKAjV9hID0+IChtYXRjaGVzID0gJGjigI1fYSldXV1dXSk7ICAgXG5cbmNvbnN0ICAgICAgICBCcmFuZFNoYXBlPU0ucmVtb3RhYmxlKCdCcmFuZCcpOyRo4oCNX29uY2UuQnJhbmRTaGFwZShCcmFuZFNoYXBlKTtcbmNvbnN0ICAgICAgICBJc3N1ZXJTaGFwZT1NLnJlbW90YWJsZSgnSXNzdWVyJyk7JGjigI1fb25jZS5Jc3N1ZXJTaGFwZShJc3N1ZXJTaGFwZSk7XG5jb25zdCAgICAgICAgUGF5bWVudFNoYXBlPU0ucmVtb3RhYmxlKCdQYXltZW50Jyk7JGjigI1fb25jZS5QYXltZW50U2hhcGUoUGF5bWVudFNoYXBlKTtcbmNvbnN0ICAgICAgICBQdXJzZVNoYXBlPU0ucmVtb3RhYmxlKCdQdXJzZScpOyRo4oCNX29uY2UuUHVyc2VTaGFwZShQdXJzZVNoYXBlKTtcbmNvbnN0ICAgICAgICBEZXBvc2l0RmFjZXRTaGFwZT1NLnJlbW90YWJsZSgnRGVwb3NpdEZhY2V0Jyk7JGjigI1fb25jZS5EZXBvc2l0RmFjZXRTaGFwZShEZXBvc2l0RmFjZXRTaGFwZSk7XG5jb25zdCBOb3RpZmllclNoYXBlPU0ucmVtb3RhYmxlKCdOb3RpZmllcicpO1xuY29uc3QgICAgICAgIE1pbnRTaGFwZT1NLnJlbW90YWJsZSgnTWludCcpO1xuXG4vKipcbiAqIFdoZW4gdGhlIEFtb3VudFZhbHVlIG9mIGFuIEFtb3VudCBmaXRzIHRoZSBOYXRWYWx1ZVNoYXBlLCBpLmUuLCB3aGVuIGl0IGlzXG4gKiBhIG5vbi1uZWdhdGl2ZSBiaWdpbnQsIHRoZW4gaXQgcmVwcmVzZW50cyB0aGF0IG1hbnkgdW5pdHMgb2YgdGhlXG4gKiBmdW5naWJsZSBhc3NldCByZXByZXNlbnRlZCBieSB0aGF0IGFtb3VudC4gVGhlIGJyYW5kIG9mIHRoYXQgYW1vdW50XG4gKiBzaG91bGQgaW5kZWVkIHJlcHJlc2VudCBhIGtpbmQgb2YgYXNzZXQgY29uc2lzdGluZyBvZiBhIGNvdW50YWJsZVxuICogc2V0IG9mIGZ1bmdpYmxlIHVuaXRzLlxuICovJGjigI1fb25jZS5NaW50U2hhcGUoTWludFNoYXBlKTtcbmNvbnN0IE5hdFZhbHVlU2hhcGU9TS5uYXQoKTtcblxuLyoqXG4gKiBXaGVuIHRoZSBBbW91bnRWYWx1ZSBvZiBhbiBBbW91bnQgZml0cyB0aGUgQ29weVNldFZhbHVlU2hhcGUsIGkuZS4sIHdoZW4gaXRcbiAqIGlzIGEgQ29weVNldCwgdGhlbiBpdCByZXByZXNlbnRzIHRoZSBzZXQgb2YgdGhvc2VcbiAqIGtleXMsIHdoZXJlIGVhY2gga2V5IHJlcHJlc2VudHMgc29tZSBpbmRpdmlkdWFsIG5vbi1mdW5naWJsZVxuICogaXRlbSwgbGlrZSBhIGNvbmNlcnQgdGlja2V0LCBmcm9tIHRoZSBub24tZnVuZ2libGUgYXNzZXQgY2xhc3NcbiAqIHJlcHJlc2VudGVkIGJ5IHRoYXQgYW1vdW50J3MgYnJhbmQuIFRoZSBhbW91bnQgaXRzZWxmIHJlcHJlc2VudHNcbiAqIHRoZSBzZXQgb2YgdGhlc2UgaXRlbXMsIGFzIG9wcG9zZWQgdG8gYW55IG9mIHRoZSBvdGhlciBpdGVtc1xuICogZnJvbSB0aGUgc2FtZSBhc3NldCBjbGFzcy5cbiAqXG4gKiBJZiBhIGdpdmVuIHZhbHVlIGNsYXNzIHJlcHJlc2VudHMgY29uY2VydCB0aWNrZXRzLCBpdCBzZWVtcyBiaXphcnJlXG4gKiB0aGF0IHdlIGNhbiBmb3JtIGFtb3VudHMgb2YgYW55IGtleS4gVGhlIGhhcmQgY29uc3RyYWludCBpcyB0aGF0XG4gKiB0aGUgY29kZSB0aGF0IGhvbGRzIHRoZSBtaW50IGZvciB0aGF0IGFzc2V0IGNsYXNzLS0tdGhlIG9uZSBhc3NvY2lhdGVkXG4gKiB3aXRoIHRoYXQgYnJhbmQsIG9ubHkgbWludHMgdGhlIGl0ZW1zIHJlcHJlc2VudGluZyB0aGUgcmVhbCB1bml0c1xuICogb2YgdGhhdCBhc3NldCBjbGFzcyBhcyBkZWZpbmVkIGJ5IGl0LiBBbnlvbmUgZWxzZSBjYW4gcHV0IHRvZ2V0aGVyXG4gKiBhbiBhbW91bnQgZXhwcmVzc2luZywgZm9yIGV4YW1wbGUsIHRoYXQgdGhleSBcIndhbnRcIiBzb21lIGl0ZW1zIHRoYXRcbiAqIHdpbGwgbmV2ZXIgYmUgbWludGVkLiBUaGF0IHdhbnQgd2lsbCBuZXZlciBiZSBzYXRpc2ZpZWQuXG4gKiBcIllvdSBjYW4ndCBhbHdheXMgZ2V0Li4uXCJcbiAqL1xuY29uc3QgQ29weVNldFZhbHVlU2hhcGU9TS5zZXQoKTtcblxuLyoqXG4gKiBXaGVuIHRoZSBBbW91bnRWYWx1ZSBvZiBhbiBBbW91bnQgZml0cyB0aGUgU2V0VmFsdWVTaGFwZSwgaS5lLiwgd2hlbiBpdFxuICogaXMgYSBDb3B5QXJyYXkgb2YgcGFzc2FibGUgS2V5cy4gVGhpcyByZXByZXNlbnRhdGlvbiBpcyBkZXByZWNhdGVkLlxuICpcbiAqIEBkZXByZWNhdGVkIFBsZWFzZSBjaGFuZ2UgZnJvbSB1c2luZyBhcnJheS1iYXNlZCBTZXRWYWx1ZXMgdG8gQ29weVNldC1iYXNlZFxuICogQ29weVNldFZhbHVlcy5cbiAqL1xuY29uc3QgU2V0VmFsdWVTaGFwZT1NLmFycmF5T2YoTS5rZXkoKSk7XG5cbi8qKlxuICogV2hlbiB0aGUgQW1vdW50VmFsdWUgb2YgYW4gQW1vdW50IGZpdHMgdGhlIENvcHlCYWdWYWx1ZVNoYXBlLCBpLmUuLCB3aGVuIGl0XG4gKiBpcyBhIENvcHlCYWcsIHRoZW4gaXQgcmVwcmVzZW50cyB0aGUgYmFnIChtdWx0aXNldCkgb2YgdGhvc2VcbiAqIGtleXMsIHdoZXJlIGVhY2gga2V5IHJlcHJlc2VudHMgc29tZSBpbmRpdmlkdWFsIHNlbWktZnVuZ2libGVcbiAqIGl0ZW0sIGxpa2UgYSBjb25jZXJ0IHRpY2tldCwgZnJvbSB0aGUgc2VtaS1mdW5naWJsZSBhc3NldCBjbGFzc1xuICogcmVwcmVzZW50ZWQgYnkgdGhhdCBhbW91bnQncyBicmFuZC4gVGhlIG51bWJlciBvZiB0aW1lcyB0aGF0IGtleVxuICogYXBwZWFycyBpbiB0aGUgYmFnIGlzIHRoZSBudW1iZXIgb2YgZnVuZ2libGUgdW5pdHMgb2YgdGhhdCBrZXkuXG4gKiBUaGUgYW1vdW50IGl0c2VsZiByZXByZXNlbnRzXG4gKiB0aGUgYmFnIG9mIHRoZXNlIGl0ZW1zLCBhcyBvcHBvc2VkIHRvIGFueSBvZiB0aGUgb3RoZXIgaXRlbXNcbiAqIGZyb20gdGhlIHNhbWUgYXNzZXQgY2xhc3MuXG4gKlxuICogSWYgYSBnaXZlbiB2YWx1ZSBjbGFzcyByZXByZXNlbnRzIGNvbmNlcnQgdGlja2V0cywgaXQgc2VlbXMgYml6YXJyZVxuICogdGhhdCB3ZSBjYW4gZm9ybSBhbW91bnRzIG9mIGFueSBrZXkuIFRoZSBoYXJkIGNvbnN0cmFpbnQgaXMgdGhhdFxuICogdGhlIGNvZGUgdGhhdCBob2xkcyB0aGUgbWludCBmb3IgdGhhdCBhc3NldCBjbGFzcy0tLXRoZSBvbmUgYXNzb2NpYXRlZFxuICogd2l0aCB0aGF0IGJyYW5kLCBvbmx5IG1pbnRzIHRoZSBpdGVtcyByZXByZXNlbnRpbmcgdGhlIHJlYWwgdW5pdHNcbiAqIG9mIHRoYXQgYXNzZXQgY2xhc3MgYXMgZGVmaW5lZCBieSBpdC4gQW55b25lIGVsc2UgY2FuIHB1dCB0b2dldGhlclxuICogYW4gYW1vdW50IGV4cHJlc3NpbmcsIGZvciBleGFtcGxlLCB0aGF0IHRoZXkgXCJ3YW50XCIgc29tZSBpdGVtcyB0aGF0XG4gKiB3aWxsIG5ldmVyIGJlIG1pbnRlZC4gVGhhdCB3YW50IHdpbGwgbmV2ZXIgYmUgc2F0aXNmaWVkLlxuICogXCJZb3UgY2FuJ3QgYWx3YXlzIGdldC4uLlwiXG4gKi9cbmNvbnN0IENvcHlCYWdWYWx1ZVNoYXBlPU0uYmFnKCk7XG5cbmNvbnN0IEFtb3VudFZhbHVlU2hhcGU9TS5vcihcbk5hdFZhbHVlU2hhcGUsXG5Db3B5U2V0VmFsdWVTaGFwZSxcblNldFZhbHVlU2hhcGUsXG5Db3B5QmFnVmFsdWVTaGFwZSk7XG5cblxuY29uc3QgICAgICAgIEFtb3VudFNoYXBlPWhhcmRlbih7XG5icmFuZDpCcmFuZFNoYXBlLFxudmFsdWU6QW1vdW50VmFsdWVTaGFwZX0pO1xuXG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHZhbHVlIGlzIGEgTmF0IGJpZ2ludC5cbiAqXG4gKiBAcGFyYW0ge0Ftb3VudFZhbHVlfSB2YWx1ZVxuICogQHJldHVybnMge3ZhbHVlIGlzIFhpbXBvcnQoJy4vdHlwZXMuanMnKS5OYXRWYWx1ZX1cbiAqLyRo4oCNX29uY2UuQW1vdW50U2hhcGUoQW1vdW50U2hhcGUpO1xuY29uc3QgICAgICAgIGlzTmF0VmFsdWU9KHZhbHVlKT0+bWF0Y2hlcyh2YWx1ZSxOYXRWYWx1ZVNoYXBlKTskaOKAjV9vbmNlLmlzTmF0VmFsdWUoaXNOYXRWYWx1ZSk7XG5oYXJkZW4oaXNOYXRWYWx1ZSk7XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHZhbHVlIGlzIGEgQ29weVNldFxuICpcbiAqIEBwYXJhbSB7QW1vdW50VmFsdWV9IHZhbHVlXG4gKiBAcmV0dXJucyB7dmFsdWUgaXMgQ29weVNldFZhbHVlfVxuICovXG5jb25zdCAgICAgICAgaXNDb3B5U2V0VmFsdWU9KHZhbHVlKT0+bWF0Y2hlcyh2YWx1ZSxDb3B5U2V0VmFsdWVTaGFwZSk7JGjigI1fb25jZS5pc0NvcHlTZXRWYWx1ZShpc0NvcHlTZXRWYWx1ZSk7XG5oYXJkZW4oaXNDb3B5U2V0VmFsdWUpO1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB2YWx1ZSBpcyBhIHBhc3MgYnkgY29weSBhcnJheSBzdHJ1Y3R1cmUuIERvZXMgbm90XG4gKiBjaGVjayBmb3IgZHVwbGljYXRlcy4gVG8gY2hlY2sgZm9yIGR1cGxpY2F0ZXMsIHVzZSBzZXRNYXRoSGVscGVycy5jb2VyY2UuXG4gKlxuICogQGRlcHJlY2F0ZWQgUGxlYXNlIGNoYW5nZSBmcm9tIHVzaW5nIGFycmF5LWJhc2VkIFNldFZhbHVlcyB0byBDb3B5U2V0LWJhc2VkXG4gKiBDb3B5U2V0VmFsdWVzLlxuICogQHBhcmFtIHtBbW91bnRWYWx1ZX0gdmFsdWVcbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBTZXRWYWx1ZX1cbiAqL1xuY29uc3QgICAgICAgIGlzU2V0VmFsdWU9KHZhbHVlKT0+bWF0Y2hlcyh2YWx1ZSxTZXRWYWx1ZVNoYXBlKTskaOKAjV9vbmNlLmlzU2V0VmFsdWUoaXNTZXRWYWx1ZSk7XG5oYXJkZW4oaXNTZXRWYWx1ZSk7XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHZhbHVlIGlzIGEgQ29weUJhZ1xuICpcbiAqIEBwYXJhbSB7QW1vdW50VmFsdWV9IHZhbHVlXG4gKiBAcmV0dXJucyB7dmFsdWUgaXMgQ29weUJhZ1ZhbHVlfVxuICovXG5jb25zdCAgICAgICAgaXNDb3B5QmFnVmFsdWU9KHZhbHVlKT0+bWF0Y2hlcyh2YWx1ZSxDb3B5QmFnVmFsdWVTaGFwZSk7JGjigI1fb25jZS5pc0NvcHlCYWdWYWx1ZShpc0NvcHlCYWdWYWx1ZSk7XG5oYXJkZW4oaXNDb3B5QmFnVmFsdWUpO1xuXG4vKiBPbmUgR09PR09MdGggc2hvdWxkIGJlIGVub3VnaCBkZWNpbWFsIHBsYWNlcyBmb3IgYW55Ym9keS4qL1xuY29uc3QgICAgICAgIE1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUz0xMDA7JGjigI1fb25jZS5NQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVMoTUFYX0FCU09MVVRFX0RFQ0lNQUxfUExBQ0VTKTtcblxuY29uc3QgICAgICAgIEFzc2V0S2luZFNoYXBlPU0ub3IoJ25hdCcsJ3NldCcsJ2NvcHlTZXQnLCdjb3B5QmFnJyk7JGjigI1fb25jZS5Bc3NldEtpbmRTaGFwZShBc3NldEtpbmRTaGFwZSk7XG5cbmNvbnN0ICAgICAgICBEaXNwbGF5SW5mb1NoYXBlPU0uc3BsaXRSZWNvcmQoXG57fSxcbntcbmRlY2ltYWxQbGFjZXM6TS5hbmQoXG5NLmd0ZSgtTUFYX0FCU09MVVRFX0RFQ0lNQUxfUExBQ0VTKSxcbk0ubHRlKE1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUykpLFxuXG5hc3NldEtpbmQ6QXNzZXRLaW5kU2hhcGV9LFxuXG57XG4vKiBJbmNsdWRpbmcgdGhpcyBlbXB0eSBgcmVzdGAgZW5zdXJlcyB0aGF0IHRoZXJlIGFyZSBubyBvdGhlciovXG4vKiBwcm9wZXJ0aWVzIGJleW9uZCB0aG9zZSBpbiB0aGUgYGJhc2VgIHJlY29yZC4qL30pOyRo4oCNX29uY2UuRGlzcGxheUluZm9TaGFwZShEaXNwbGF5SW5mb1NoYXBlKTtcblxuXG5cbmNvbnN0ICAgICAgICBJc3N1ZXJLaXRTaGFwZT1oYXJkZW4oe1xuYnJhbmQ6QnJhbmRTaGFwZSxcbm1pbnQ6TWludFNoYXBlLFxuaXNzdWVyOklzc3VlclNoYXBlLFxuZGlzcGxheUluZm86RGlzcGxheUluZm9TaGFwZX0pO1xuXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBJbnRlcmZhY2VzIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi8kaOKAjV9vbmNlLklzc3VlcktpdFNoYXBlKElzc3VlcktpdFNoYXBlKTtcblxuY29uc3QgICAgICAgIEJyYW5kST1NLmludGVyZmFjZSgnQnJhbmQnLHtcbmlzTXlJc3N1ZXI6TS5jYWxsV2hlbihNLmF3YWl0KElzc3VlclNoYXBlKSkucmV0dXJucyhNLmJvb2xlYW4oKSksXG5nZXRBbGxlZ2VkTmFtZTpNLmNhbGwoKS5yZXR1cm5zKE0uc3RyaW5nKCkpLFxuZ2V0RGlzcGxheUluZm86TS5jYWxsKCkucmV0dXJucyhEaXNwbGF5SW5mb1NoYXBlKSxcbmdldEFtb3VudFNoYXBlOk0uY2FsbCgpLnJldHVybnMoTS5wYXR0ZXJuKCkpfSk7XG5cblxuLyoqXG4gKiBAcGFyYW0ge1BhdHRlcm59IFticmFuZFNoYXBlXVxuICogQHBhcmFtIHtQYXR0ZXJufSBbYXNzZXRLaW5kU2hhcGVdXG4gKiBAcGFyYW0ge1BhdHRlcm59IFthbW91bnRTaGFwZV1cbiAqLyRo4oCNX29uY2UuQnJhbmRJKEJyYW5kSSk7XG5jb25zdCAgICAgICAgbWFrZUlzc3VlckludGVyZmFjZXM9KFxuYnJhbmRTaGFwZT1CcmFuZFNoYXBlLFxuYXNzZXRLaW5kU2hhcGU9QXNzZXRLaW5kU2hhcGUsXG5hbW91bnRTaGFwZT1BbW91bnRTaGFwZSk9Plxue1xuY29uc3QgSXNzdWVyST1NLmludGVyZmFjZSgnSXNzdWVyJyx7XG5nZXRCcmFuZDpNLmNhbGwoKS5yZXR1cm5zKGJyYW5kU2hhcGUpLFxuZ2V0QWxsZWdlZE5hbWU6TS5jYWxsKCkucmV0dXJucyhNLnN0cmluZygpKSxcbmdldEFzc2V0S2luZDpNLmNhbGwoKS5yZXR1cm5zKGFzc2V0S2luZFNoYXBlKSxcbmdldERpc3BsYXlJbmZvOk0uY2FsbCgpLnJldHVybnMoRGlzcGxheUluZm9TaGFwZSksXG5tYWtlRW1wdHlQdXJzZTpNLmNhbGwoKS5yZXR1cm5zKFB1cnNlU2hhcGUpLFxuXG5pc0xpdmU6TS5jYWxsV2hlbihNLmF3YWl0KFBheW1lbnRTaGFwZSkpLnJldHVybnMoTS5ib29sZWFuKCkpLFxuZ2V0QW1vdW50T2Y6TS5jYWxsV2hlbihNLmF3YWl0KFBheW1lbnRTaGFwZSkpLnJldHVybnMoYW1vdW50U2hhcGUpLFxuYnVybjpNLmNhbGxXaGVuKE0uYXdhaXQoUGF5bWVudFNoYXBlKSkuXG5vcHRpb25hbChNLnBhdHRlcm4oKSkuXG5yZXR1cm5zKGFtb3VudFNoYXBlKSxcbmNsYWltOk0uY2FsbFdoZW4oTS5hd2FpdChQYXltZW50U2hhcGUpKS5cbm9wdGlvbmFsKE0ucGF0dGVybigpKS5cbnJldHVybnMoUGF5bWVudFNoYXBlKSxcbmNvbWJpbmU6TS5jYWxsKE0uYXJyYXlPZihNLmVyZWYoUGF5bWVudFNoYXBlKSkpLlxub3B0aW9uYWwoYW1vdW50U2hhcGUpLlxucmV0dXJucyhNLmVyZWYoUGF5bWVudFNoYXBlKSksXG5zcGxpdDpNLmNhbGxXaGVuKE0uYXdhaXQoUGF5bWVudFNoYXBlKSxhbW91bnRTaGFwZSkucmV0dXJucyhcbk0uYXJyYXlPZihQYXltZW50U2hhcGUpKSxcblxuc3BsaXRNYW55Ok0uY2FsbFdoZW4oXG5NLmF3YWl0KFBheW1lbnRTaGFwZSksXG5NLmFycmF5T2YoYW1vdW50U2hhcGUpKS5cbnJldHVybnMoTS5hcnJheU9mKFBheW1lbnRTaGFwZSkpfSk7XG5cblxuY29uc3QgTWludEk9TS5pbnRlcmZhY2UoJ01pbnQnLHtcbmdldElzc3VlcjpNLmNhbGwoKS5yZXR1cm5zKElzc3VlclNoYXBlKSxcbm1pbnRQYXltZW50Ok0uY2FsbChhbW91bnRTaGFwZSkucmV0dXJucyhQYXltZW50U2hhcGUpfSk7XG5cblxuY29uc3QgUGF5bWVudEk9TS5pbnRlcmZhY2UoJ1BheW1lbnQnLHtcbmdldEFsbGVnZWRCcmFuZDpNLmNhbGwoKS5yZXR1cm5zKGJyYW5kU2hhcGUpfSk7XG5cblxuY29uc3QgUHVyc2VJPU0uaW50ZXJmYWNlKCdQdXJzZScse1xuZ2V0QWxsZWdlZEJyYW5kOk0uY2FsbCgpLnJldHVybnMoYnJhbmRTaGFwZSksXG5nZXRDdXJyZW50QW1vdW50Ok0uY2FsbCgpLnJldHVybnMoYW1vdW50U2hhcGUpLFxuZ2V0Q3VycmVudEFtb3VudE5vdGlmaWVyOk0uY2FsbCgpLnJldHVybnMoTm90aWZpZXJTaGFwZSksXG4vKiBQdXJzZUkgZG9lcyAqbm90KiBkZWxheSBgZGVwb3NpdGAgdW50aWwgYHNyY1BheW1lbnRgIGlzIGZ1bGZ1bGxlZC4qL1xuLyogUmF0aGVyLCB0aGUgc2VtYW50aWNzIG9mIGBkZXBvc2l0YCByZXF1aXJlIGl0IHRvIHByb3ZpZGUgaXRzKi9cbi8qIGNhbGxlcnMgd2l0aCBhIHN0cm9uZyBndWFyYW50ZWUgdGhhdCBgZGVwb3NpdGAgbWVzc2FnZXMgYXJlKi9cbi8qIHByb2Nlc3NlZCB3aXRob3V0IGZ1cnRoZXIgZGVsYXkgaW4gdGhlIG9yZGVyIHRoZXkgYXJyaXZlLiovXG4vKiBQdXJzZUkgdGhlcmVmb3JlIHJlcXVpcmVzIHRoYXQgdGhlIGBzcmNQYXltZW50YCBhcmd1bWVudCBhbHJlYWR5Ki9cbi8qIGJlIGEgcmVtb3RhYmxlLCBub3QgYSBwcm9taXNlLiovXG4vKiBQdXJzZUkgb25seSBjYWxscyB0aGlzIHJhdyBtZXRob2QgYWZ0ZXIgdmFsaWRhdGluZyB0aGF0Ki9cbi8qIGBzcmNQYXltZW50YCBpcyBhIHJlbW90YWJsZSwgbGVhdmluZyBpdCovXG4vKiB0byB0aGlzIHJhdyBtZXRob2QgdG8gdmFsaWRhdGUgdGhhdCB0aGlzIHJlbW90YWJsZSBpcyBhY3R1YWxseSovXG4vKiBhIGxpdmUgcGF5bWVudCBvZiB0aGUgY29ycmVjdCBicmFuZCB3aXRoIHN1ZmZpY2llbnQgZnVuZHMuKi9cbmRlcG9zaXQ6TS5jYWxsKFBheW1lbnRTaGFwZSkub3B0aW9uYWwoTS5wYXR0ZXJuKCkpLnJldHVybnMoYW1vdW50U2hhcGUpLFxuZ2V0RGVwb3NpdEZhY2V0Ok0uY2FsbCgpLnJldHVybnMoRGVwb3NpdEZhY2V0U2hhcGUpLFxud2l0aGRyYXc6TS5jYWxsKGFtb3VudFNoYXBlKS5yZXR1cm5zKFBheW1lbnRTaGFwZSksXG5nZXRSZWNvdmVyeVNldDpNLmNhbGwoKS5yZXR1cm5zKE0uc2V0T2YoUGF5bWVudFNoYXBlKSksXG5yZWNvdmVyQWxsOk0uY2FsbCgpLnJldHVybnMoYW1vdW50U2hhcGUpfSk7XG5cblxuY29uc3QgRGVwb3NpdEZhY2V0ST1NLmludGVyZmFjZSgnRGVwb3NpdEZhY2V0Jyx7XG5yZWNlaXZlOlB1cnNlSS5tZXRob2RHdWFyZHMuZGVwb3NpdH0pO1xuXG5cbmNvbnN0IFB1cnNlSUtpdD1oYXJkZW4oe1xucHVyc2U6UHVyc2VJLFxuZGVwb3NpdEZhY2V0OkRlcG9zaXRGYWNldEl9KTtcblxuXG5yZXR1cm4gaGFyZGVuKHtcbklzc3VlckksXG5NaW50SSxcblBheW1lbnRJLFxuUHVyc2VJS2l0fSk7XG5cbiB9OyRo4oCNX29uY2UubWFrZUlzc3VlckludGVyZmFjZXMobWFrZUlzc3VlckludGVyZmFjZXMpO1xuaGFyZGVuKG1ha2VJc3N1ZXJJbnRlcmZhY2VzKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJCcmFuZFNoYXBlIjpbIkJyYW5kU2hhcGUiXSwiSXNzdWVyU2hhcGUiOlsiSXNzdWVyU2hhcGUiXSwiUGF5bWVudFNoYXBlIjpbIlBheW1lbnRTaGFwZSJdLCJQdXJzZVNoYXBlIjpbIlB1cnNlU2hhcGUiXSwiRGVwb3NpdEZhY2V0U2hhcGUiOlsiRGVwb3NpdEZhY2V0U2hhcGUiXSwiTWludFNoYXBlIjpbIk1pbnRTaGFwZSJdLCJBbW91bnRTaGFwZSI6WyJBbW91bnRTaGFwZSJdLCJpc05hdFZhbHVlIjpbImlzTmF0VmFsdWUiXSwiaXNDb3B5U2V0VmFsdWUiOlsiaXNDb3B5U2V0VmFsdWUiXSwiaXNTZXRWYWx1ZSI6WyJpc1NldFZhbHVlIl0sImlzQ29weUJhZ1ZhbHVlIjpbImlzQ29weUJhZ1ZhbHVlIl0sIk1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUyI6WyJNQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVMiXSwiQXNzZXRLaW5kU2hhcGUiOlsiQXNzZXRLaW5kU2hhcGUiXSwiRGlzcGxheUluZm9TaGFwZSI6WyJEaXNwbGF5SW5mb1NoYXBlIl0sIklzc3VlcktpdFNoYXBlIjpbIklzc3VlcktpdFNoYXBlIl0sIkJyYW5kSSI6WyJCcmFuZEkiXSwibWFrZUlzc3VlckludGVyZmFjZXMiOlsibWFrZUlzc3VlckludGVyZmFjZXMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAK4Nx++lCAADpQgAAKQAAAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy90eXBlcy1hbWJpZW50LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIi8+Ki9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHR5cGVkZWYge29iamVjdH0gQW1vdW50XG4gKiBBbW91bnRzIGFyZSBkZXNjcmlwdGlvbnMgb2YgZGlnaXRhbCBhc3NldHMsIGFuc3dlcmluZyB0aGUgcXVlc3Rpb25zXG4gKiBcImhvdyBtdWNoXCIgYW5kIFwib2Ygd2hhdCBraW5kXCIuIEFtb3VudHMgYXJlIHZhbHVlcyBsYWJlbGVkIHdpdGggYSBicmFuZC5cbiAqIEFtb3VudE1hdGggZXhlY3V0ZXMgdGhlIGxvZ2ljIG9mIGhvdyBhbW91bnRzIGFyZSBjaGFuZ2VkIHdoZW4gZGlnaXRhbFxuICogYXNzZXRzIGFyZSBtZXJnZWQsIHNlcGFyYXRlZCwgb3Igb3RoZXJ3aXNlIG1hbmlwdWxhdGVkLiBGb3JcbiAqIGV4YW1wbGUsIGEgZGVwb3NpdCBvZiAyIGJ1Y2tzIGludG8gYSBwdXJzZSB0aGF0IGFscmVhZHkgaGFzIDMgYnVja3NcbiAqIGdpdmVzIGEgbmV3IHB1cnNlIGJhbGFuY2Ugb2YgNSBidWNrcy4gQW4gZW1wdHkgcHVyc2UgaGFzIDAgYnVja3MuIEFtb3VudE1hdGhcbiAqIHJlbGllcyBoZWF2aWx5IG9uIHBvbHltb3JwaGljIE1hdGhIZWxwZXJzLCB3aGljaCBtYW5pcHVsYXRlIHRoZSB1bmJyYW5kZWRcbiAqIHBvcnRpb24uXG4gKlxuICogQHByb3BlcnR5IHtCcmFuZDxLPn0gYnJhbmRcbiAqIEBwcm9wZXJ0eSB7QXNzZXRWYWx1ZUZvcktpbmQ8Sz59IHZhbHVlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7TmF0VmFsdWUgfCBTZXRWYWx1ZSB8IENvcHlTZXRWYWx1ZSB8IENvcHlCYWdWYWx1ZX0gQW1vdW50VmFsdWVcbiAqIEFuIGBBbW91bnRWYWx1ZWAgZGVzY3JpYmVzIGEgc2V0IG9yIHF1YW50aXR5IG9mIGFzc2V0cyB0aGF0IGNhbiBiZSBvd25lZCBvclxuICogc2hhcmVkLlxuICpcbiAqIEEgZnVuZ2libGUgYEFtb3VudFZhbHVlYCB1c2VzIGEgbm9uLW5lZ2F0aXZlIGJpZ2ludCB0byByZXByZXNlbnQgYSBxdWFudGl0eVxuICogb2YgdGhhdCBtYW55IGFzc2V0cy5cbiAqXG4gKiBBIG5vbi1mdW5naWJsZSBgQW1vdW50VmFsdWVgIHVzZXMgYW4gYXJyYXkgb3IgQ29weVNldCBvZiBgS2V5YHMgdG8gcmVwcmVzZW50XG4gKiBhIHNldCBvZiB3aGF0ZXZlciBhc3NldCBlYWNoIGtleSByZXByZXNlbnRzLiBBIGBLZXlgIGlzIGEgcGFzc2FibGUgdmFsdWVcbiAqIHRoYXQgY2FuIGJlIHVzZWQgYXMgYW4gZWxlbWVudCBpbiBhIHNldCAoU2V0U3RvcmUgb3IgQ29weVNldCkgb3IgYXMgdGhlXG4gKiBrZXkgaW4gYSBtYXAgKE1hcFN0b3JlIG9yIENvcHlNYXApLlxuICpcbiAqIGBTZXRWYWx1ZWAgaXMgZm9yIHRoZSBkZXByZWNhdGVkIHNldCByZXByZXNlbnRhdGlvbiwgdXNpbmcgYW4gYXJyYXkgZGlyZWN0bHlcbiAqIHRvIHJlcHJlc2VudCB0aGUgYXJyYXkgb2YgaXRzIGVsZW1lbnRzLiBgQ29weVNldFZhbHVlYCBpcyB0aGUgcHJvcGVyXG4gKiByZXByZXNlbnRhdGlvbiB1c2luZyBhIENvcHlTZXQuXG4gKlxuICogQSBzZW1pLWZ1bmdpYmxlIGBDb3B5QmFnVmFsdWVgIGlzIHJlcHJlc2VudGVkIGFzIGFcbiAqIGBDb3B5QmFnYCBvZiBgS2V5YCBvYmplY3RzLiBcIkJhZ1wiIGlzIHN5bm9ueW1vdXMgd2l0aCBNdWx0aVNldCwgd2hlcmUgYW5cbiAqIGVsZW1lbnQgb2YgYSBiYWcgY2FuIGJlIHByZXNlbnQgb25jZSBvciBtb3JlIHRpbWVzLCBpLmUuLCBzb21lIHBvc2l0aXZlXG4gKiBiaWdpbnQgbnVtYmVyIG9mIHRpbWVzLCByZXByZXNlbnRpbmcgdGhhdCBxdWFudGl0eSBvZiB0aGUgYXNzZXQgcmVwcmVzZW50ZWRcbiAqIGJ5IHRoYXQga2V5LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyduYXQnIHwgJ3NldCcgfCAnY29weVNldCcgfCAnY29weUJhZycgfSBBc3NldEtpbmRcbiAqXG4gKiBTZWUgZG9jLWNvbW1lbnQgZm9yIGBBbW91bnRWYWx1ZWAuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQHR5cGVkZWYge0sgZXh0ZW5kcyAnbmF0JyA/IE5hdFZhbHVlIDpcbiAqIEsgZXh0ZW5kcyAnc2V0JyA/IFNldFZhbHVlIDpcbiAqIEsgZXh0ZW5kcyAnY29weVNldCcgPyBDb3B5U2V0VmFsdWU6XG4gKiBLIGV4dGVuZHMgJ2NvcHlCYWcnID8gQ29weUJhZ1ZhbHVlIDpcbiAqIG5ldmVyXG4gKiB9IEFzc2V0VmFsdWVGb3JLaW5kXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Ftb3VudFZhbHVlfSBWXG4gKiBAdHlwZWRlZiB7ViBleHRlbmRzIE5hdFZhbHVlID8gJ25hdCcgOlxuICogIFYgZXh0ZW5kcyBTZXRWYWx1ZSA/ICdzZXQnIDpcbiAqICBWIGV4dGVuZHMgQ29weVNldFZhbHVlID8gJ2NvcHlTZXQnIDpcbiAqICBWIGV4dGVuZHMgQ29weUJhZ1ZhbHVlID8gJ2NvcHlCYWcnIDpcbiAqICBuZXZlcn0gQXNzZXRLaW5kRm9yVmFsdWVcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBEaXNwbGF5SW5mb1xuICogQHByb3BlcnR5IHtudW1iZXI9fSBkZWNpbWFsUGxhY2VzIFRlbGxzIHRoZSBkaXNwbGF5IHNvZnR3YXJlIGhvd1xuICogICBtYW55IGRlY2ltYWwgcGxhY2VzIHRvIG1vdmUgdGhlIGRlY2ltYWwgb3ZlciB0byB0aGUgbGVmdCwgb3IgaW5cbiAqICAgb3RoZXIgd29yZHMsIHdoaWNoIHBvc2l0aW9uIGNvcnJlc3BvbmRzIHRvIHdob2xlIG51bWJlcnMuIFdlXG4gKiAgIHJlcXVpcmUgZnVuZ2libGUgZGlnaXRhbCBhc3NldHMgdG8gYmUgcmVwcmVzZW50ZWQgaW4gaW50ZWdlcnMsIGluXG4gKiAgIHRoZSBzbWFsbGVzdCB1bml0IChpLmUuIFVTRCBtaWdodCBiZSByZXByZXNlbnRlZCBpbiBtaWxsLCBhXG4gKiAgIHRob3VzYW5kdGggb2YgYSBkb2xsYXIuIEluIHRoYXQgY2FzZSwgYGRlY2ltYWxQbGFjZXNgIHdvdWxkIGJlXG4gKiAgIDMuKSBUaGlzIHByb3BlcnR5IGlzIG9wdGlvbmFsLCBhbmQgZm9yIG5vbi1mdW5naWJsZSBkaWdpdGFsXG4gKiAgIGFzc2V0cywgc2hvdWxkIG5vdCBiZSBzcGVjaWZpZWQuIFRoZSBkZWNpbWFsUGxhY2VzIHByb3BlcnR5XG4gKiAgIHNob3VsZCBiZSB1c2VkIGZvciAqZGlzcGxheSBwdXJwb3NlcyBvbmx5Ki4gQW55IG90aGVyIHVzZSBpcyBhblxuICogICBhbnRpLXBhdHRlcm4uXG4gKiBAcHJvcGVydHkge0t9IGFzc2V0S2luZCAtIHRoZSBraW5kIG9mIGFzc2V0LCBlaXRoZXJcbiAqICAgQXNzZXRLaW5kLk5BVCAoZnVuZ2libGUpIG9yXG4gKiAgIEFzc2V0S2luZC5TRVQgb3IgQXNzZXRLaW5kLkNPUFlfU0VUIChub24tZnVuZ2libGUpXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHR5cGVkZWYge29iamVjdH0gQnJhbmRcbiAqIFRoZSBicmFuZCBpZGVudGlmaWVzIHRoZSBraW5kIG9mIGlzc3VlciwgYW5kIGhhcyBhIGZ1bmN0aW9uIHRvIGdldCB0aGVcbiAqIGFsbGVnZWQgbmFtZSBmb3IgdGhlIGtpbmQgb2YgYXNzZXQgZGVzY3JpYmVkLiBUaGUgYWxsZWdlZCBuYW1lIChzdWNoXG4gKiBhcyAnQlRDJyBvciAnbW9vbGEnKSBpcyBwcm92aWRlZCBieSB0aGUgbWFrZXIgb2YgdGhlIGlzc3VlciBhbmQgc2hvdWxkXG4gKiBub3QgYmUgdHJ1c3RlZCBhcyBhY2N1cmF0ZS5cbiAqXG4gKiBFdmVyeSBhbW91bnQgY3JlYXRlZCBieSBhIHBhcnRpY3VsYXIgQW1vdW50TWF0aCB3aWxsIHNoYXJlIHRoZSBzYW1lIGJyYW5kLFxuICogYnV0IHJlY2lwaWVudHMgY2Fubm90IHJlbHkgb24gdGhlIGJyYW5kIHRvIHZlcmlmeSB0aGF0IGEgcHVycG9ydGVkIGFtb3VudFxuICogcmVwcmVzZW50cyB0aGUgaXNzdWVyIHRoZXkgaW50ZW5kZWQsIHNpbmNlIHRoZSBzYW1lIGJyYW5kIGNhbiBiZSByZXVzZWQgYnlcbiAqIGEgbWlzYmVoYXZpbmcgaXNzdWVyLlxuICpcbiAqIEBwcm9wZXJ0eSB7KGFsbGVnZWRJc3N1ZXI6IEVSZWY8SXNzdWVyPikgPT4gUHJvbWlzZTxib29sZWFuPn0gaXNNeUlzc3VlclxuICogU2hvdWxkIGJlIHVzZWQgd2l0aCBgaXNzdWVyLmdldEJyYW5kYCB0byBlbnN1cmUgYW4gaXNzdWVyIGFuZCBicmFuZCBtYXRjaC5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gc3RyaW5nfSBnZXRBbGxlZ2VkTmFtZVxuICogQHByb3BlcnR5IHsoKSA9PiBEaXNwbGF5SW5mbzxLPn0gZ2V0RGlzcGxheUluZm9cbiAqIEdpdmUgaW5mb3JtYXRpb24gdG8gVUkgb24gaG93IHRvIGRpc3BsYXkgdGhlIGFtb3VudC5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUGF0dGVybn0gZ2V0QW1vdW50U2hhcGVcbiAqL1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gSXNzdWVyIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQGNhbGxiYWNrIElzc3VlcklzTGl2ZVxuICpcbiAqIFJldHVybiB0cnVlIGlmIHRoZSBwYXltZW50IGNvbnRpbnVlcyB0byBleGlzdC5cbiAqXG4gKiBJZiB0aGUgcGF5bWVudCBpcyBhIHByb21pc2UsIHRoZSBvcGVyYXRpb24gd2lsbCBwcm9jZWVkIHVwb25cbiAqIHJlc29sdXRpb24uXG4gKlxuICogQHBhcmFtIHtFUmVmPFBheW1lbnQ+fSBwYXltZW50XG4gKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn1cbiAqL1xuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQGNhbGxiYWNrIElzc3VlckdldEFtb3VudE9mXG4gKlxuICogR2V0IHRoZSBhbW91bnQgb2YgZGlnaXRhbCBhc3NldHMgaW4gdGhlIHBheW1lbnQuIEJlY2F1c2UgdGhlXG4gKiBwYXltZW50IGlzIG5vdCB0cnVzdGVkLCB3ZSBjYW5ub3QgY2FsbCBhIG1ldGhvZCBvbiBpdCBkaXJlY3RseSwgYW5kXG4gKiBtdXN0IHVzZSB0aGUgaXNzdWVyIGluc3RlYWQuXG4gKlxuICogSWYgdGhlIHBheW1lbnQgaXMgYSBwcm9taXNlLCB0aGUgb3BlcmF0aW9uIHdpbGwgcHJvY2VlZCB1cG9uXG4gKiByZXNvbHV0aW9uLlxuICpcbiAqIEBwYXJhbSB7RVJlZjxQYXltZW50Pn0gcGF5bWVudFxuICogQHJldHVybnMge1Byb21pc2U8QW1vdW50PEs+Pn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBJc3N1ZXJCdXJuXG4gKlxuICogQnVybiBhbGwgb2YgdGhlIGRpZ2l0YWwgYXNzZXRzIGluIHRoZVxuICogcGF5bWVudC4gYG9wdEFtb3VudGAgaXMgb3B0aW9uYWwuIElmIGBvcHRBbW91bnRgIGlzIHByZXNlbnQsIHRoZVxuICogY29kZSB3aWxsIGluc2lzdCB0aGF0IHRoZSBhbW91bnQgb2YgdGhlIGRpZ2l0YWwgYXNzZXRzIGluIHRoZVxuICogcGF5bWVudCBpcyBlcXVhbCB0byBgb3B0QW1vdW50YCwgdG8gcHJldmVudCBzZW5kaW5nIHRoZSB3cm9uZ1xuICogcGF5bWVudCBhbmQgb3RoZXIgY29uZnVzaW9uLlxuICpcbiAqIElmIHRoZSBwYXltZW50IGlzIGEgcHJvbWlzZSwgdGhlIG9wZXJhdGlvbiB3aWxsIHByb2NlZWQgdXBvblxuICogcmVzb2x1dGlvbi5cbiAqXG4gKiBAcGFyYW0ge0VSZWY8UGF5bWVudD59IHBheW1lbnRcbiAqIEBwYXJhbSB7UGF0dGVybj19IG9wdEFtb3VudFNoYXBlXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxBbW91bnQ+fVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBjYWxsYmFjayBJc3N1ZXJDbGFpbVxuICpcbiAqIFRyYW5zZmVyIGFsbCBkaWdpdGFsIGFzc2V0cyBmcm9tIHRoZSBwYXltZW50IHRvIGEgbmV3IHBheW1lbnQgYW5kXG4gKiBkZWxldGUgdGhlIG9yaWdpbmFsLiBgb3B0QW1vdW50YCBpcyBvcHRpb25hbC4gSWYgYG9wdEFtb3VudGAgaXNcbiAqIHByZXNlbnQsIHRoZSBjb2RlIHdpbGwgaW5zaXN0IHRoYXQgdGhlIGFtb3VudCBvZiBkaWdpdGFsIGFzc2V0cyBpblxuICogdGhlIHBheW1lbnQgaXMgZXF1YWwgdG8gYG9wdEFtb3VudGAsIHRvIHByZXZlbnQgc2VuZGluZyB0aGUgd3JvbmdcbiAqIHBheW1lbnQgYW5kIG90aGVyIGNvbmZ1c2lvbi5cbiAqXG4gKiBJZiB0aGUgcGF5bWVudCBpcyBhIHByb21pc2UsIHRoZSBvcGVyYXRpb24gd2lsbCBwcm9jZWVkIHVwb25cbiAqIHJlc29sdXRpb24uXG4gKlxuICogQHBhcmFtIHtFUmVmPFBheW1lbnQ8Sz4+fSBwYXltZW50XG4gKiBAcGFyYW0ge1BhdHRlcm49fSBvcHRBbW91bnRTaGFwZVxuICogQHJldHVybnMge1Byb21pc2U8UGF5bWVudDxLPj59XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQGNhbGxiYWNrIElzc3VlckNvbWJpbmVcbiAqXG4gKiBDb21iaW5lIG11bHRpcGxlIHBheW1lbnRzIGludG8gb25lIHBheW1lbnQuXG4gKlxuICogSWYgYW55IG9mIHRoZSBwYXltZW50cyBpcyBhIHByb21pc2UsIHRoZSBvcGVyYXRpb24gd2lsbCBwcm9jZWVkXG4gKiB1cG9uIHJlc29sdXRpb24uXG4gKlxuICogQHBhcmFtIHtFUmVmPFBheW1lbnQ8Sz4+W119IHBheW1lbnRzQXJyYXlcbiAqIEBwYXJhbSB7QW1vdW50PEs+PX0gb3B0VG90YWxBbW91bnRcbiAqIEByZXR1cm5zIHtQcm9taXNlPFBheW1lbnQ8Sz4+fVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBjYWxsYmFjayBJc3N1ZXJTcGxpdFxuICpcbiAqIFNwbGl0IGEgc2luZ2xlIHBheW1lbnQgaW50byB0d28gcGF5bWVudHMsXG4gKiBBIGFuZCBCLCBhY2NvcmRpbmcgdG8gdGhlIHBheW1lbnRBbW91bnRBIHBhc3NlZCBpbi5cbiAqXG4gKiBJZiB0aGUgcGF5bWVudCBpcyBhIHByb21pc2UsIHRoZSBvcGVyYXRpb24gd2lsbCBwcm9jZWVkIHVwb25cbiAqIHJlc29sdXRpb24uXG4gKlxuICogQHBhcmFtIHtFUmVmPFBheW1lbnQ8Sz4+fSBwYXltZW50XG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gcGF5bWVudEFtb3VudEFcbiAqIEByZXR1cm5zIHtQcm9taXNlPFBheW1lbnQ8Sz5bXT59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgSXNzdWVyU3BsaXRNYW55XG4gKlxuICogU3BsaXQgYSBzaW5nbGUgcGF5bWVudCBpbnRvIG1hbnkgcGF5bWVudHMsIGFjY29yZGluZyB0byB0aGUgYW1vdW50c1xuICogcGFzc2VkIGluLlxuICpcbiAqIElmIHRoZSBwYXltZW50IGlzIGEgcHJvbWlzZSwgdGhlIG9wZXJhdGlvbiB3aWxsIHByb2NlZWQgdXBvblxuICogcmVzb2x1dGlvbi5cbiAqXG4gKiBAcGFyYW0ge0VSZWY8UGF5bWVudD59IHBheW1lbnRcbiAqIEBwYXJhbSB7QW1vdW50W119IGFtb3VudHNcbiAqIEByZXR1cm5zIHtQcm9taXNlPFBheW1lbnRbXT59XG4gKlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IElzc3VlclxuICpcbiAqIFRoZSBpc3N1ZXIgY2Fubm90IG1pbnQgYSBuZXcgYW1vdW50LCBidXQgaXQgY2FuIGNyZWF0ZSBlbXB0eSBwdXJzZXNcbiAqIGFuZCBwYXltZW50cy4gVGhlIGlzc3VlciBjYW4gYWxzbyB0cmFuc2Zvcm0gcGF5bWVudHMgKHNwbGl0dGluZ1xuICogcGF5bWVudHMsIGNvbWJpbmluZyBwYXltZW50cywgYnVybmluZyBwYXltZW50cywgYW5kIGNsYWltaW5nXG4gKiBwYXltZW50cyBleGNsdXNpdmVseSkuIFRoZSBpc3N1ZXIgc2hvdWxkIGJlIGdvdHRlbiBmcm9tIGEgdHJ1c3RlZFxuICogc291cmNlIGFuZCB0aGVuIHJlbGllZCB1cG9uIGFzIHRoZSBkZWNpZGVyIG9mIHdoZXRoZXIgYW4gdW50cnVzdGVkXG4gKiBwYXltZW50IGlzIHZhbGlkLlxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gQnJhbmQ8Sz59IGdldEJyYW5kIEdldCB0aGUgQnJhbmQgZm9yIHRoaXMgSXNzdWVyLiBUaGVcbiAqIEJyYW5kIGluZGljYXRlcyB0aGUgdHlwZSBvZiBkaWdpdGFsIGFzc2V0IGFuZCBpcyBzaGFyZWQgYnkgdGhlXG4gKiBtaW50LCB0aGUgaXNzdWVyLCBhbmQgYW55IHB1cnNlcyBhbmQgcGF5bWVudHMgb2YgdGhpcyBwYXJ0aWN1bGFyXG4gKiBraW5kLiBUaGUgYnJhbmQgaXMgbm90IGNsb3NlbHkgaGVsZCwgc28gdGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlXG4gKiB0cnVzdGVkIHRvIGlkZW50aWZ5IGFuIGlzc3VlciBhbG9uZS4gRmFrZSBkaWdpdGFsIGFzc2V0cyBhbmQgYW1vdW50XG4gKiBjYW4gdXNlIGFub3RoZXIgaXNzdWVyJ3MgYnJhbmQuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBzdHJpbmd9IGdldEFsbGVnZWROYW1lIEdldCB0aGUgYWxsZWdlZE5hbWUgZm9yXG4gKiB0aGlzIG1pbnQvaXNzdWVyXG4gKiBAcHJvcGVydHkgeygpID0+IEFzc2V0S2luZH0gZ2V0QXNzZXRLaW5kIEdldCB0aGUga2luZCBvZlxuICogTWF0aEhlbHBlcnMgdXNlZCBieSB0aGlzIElzc3Vlci5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gRGlzcGxheUluZm99IGdldERpc3BsYXlJbmZvIEdpdmUgaW5mb3JtYXRpb24gdG8gVUlcbiAqICBvbiBob3cgdG8gZGlzcGxheSBhbW91bnRzIGZvciB0aGlzIGlzc3Vlci5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHVyc2U8Sz59IG1ha2VFbXB0eVB1cnNlIE1ha2UgYW4gZW1wdHkgcHVyc2Ugb2YgdGhpc1xuICogYnJhbmQuXG4gKiBAcHJvcGVydHkge0lzc3VlcklzTGl2ZX0gaXNMaXZlXG4gKiBAcHJvcGVydHkge0lzc3VlckdldEFtb3VudE9mPEs+fSBnZXRBbW91bnRPZlxuICogQHByb3BlcnR5IHtJc3N1ZXJCdXJufSBidXJuXG4gKiBAcHJvcGVydHkge0lzc3VlckNsYWltPEs+fSBjbGFpbVxuICogQHByb3BlcnR5IHtJc3N1ZXJDb21iaW5lPEs+fSBjb21iaW5lXG4gKiBAcHJvcGVydHkge0lzc3VlclNwbGl0PEs+fSBzcGxpdFxuICogQHByb3BlcnR5IHtJc3N1ZXJTcGxpdE1hbnl9IHNwbGl0TWFueVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBheW1lbnRMZWRnZXJcbiAqIEBwcm9wZXJ0eSB7TWludDxLPn0gbWludFxuICogQHByb3BlcnR5IHtJc3N1ZXI8Sz59IGlzc3VlclxuICogQHByb3BlcnR5IHtCcmFuZDxLPn0gYnJhbmRcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBJc3N1ZXJLaXRcbiAqIEBwcm9wZXJ0eSB7TWludDxLPn0gbWludFxuICogQHByb3BlcnR5IHtJc3N1ZXI8Sz59IGlzc3VlclxuICogQHByb3BlcnR5IHtCcmFuZDxLPn0gYnJhbmRcbiAqIEBwcm9wZXJ0eSB7RGlzcGxheUluZm99IGRpc3BsYXlJbmZvXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBBZGRpdGlvbmFsRGlzcGxheUluZm9cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcj19IGRlY2ltYWxQbGFjZXMgVGVsbHMgdGhlIGRpc3BsYXkgc29mdHdhcmUgaG93XG4gKiAgIG1hbnkgZGVjaW1hbCBwbGFjZXMgdG8gbW92ZSB0aGUgZGVjaW1hbCBvdmVyIHRvIHRoZSBsZWZ0LCBvciBpblxuICogICBvdGhlciB3b3Jkcywgd2hpY2ggcG9zaXRpb24gY29ycmVzcG9uZHMgdG8gd2hvbGUgbnVtYmVycy4gV2VcbiAqICAgcmVxdWlyZSBmdW5naWJsZSBkaWdpdGFsIGFzc2V0cyB0byBiZSByZXByZXNlbnRlZCBpbiBpbnRlZ2VycywgaW5cbiAqICAgdGhlIHNtYWxsZXN0IHVuaXQgKGkuZS4gVVNEIG1pZ2h0IGJlIHJlcHJlc2VudGVkIGluIG1pbGwsIGFcbiAqICAgdGhvdXNhbmR0aCBvZiBhIGRvbGxhci4gSW4gdGhhdCBjYXNlLCBgZGVjaW1hbFBsYWNlc2Agd291bGQgYmVcbiAqICAgMy4pIFRoaXMgcHJvcGVydHkgaXMgb3B0aW9uYWwsIGFuZCBmb3Igbm9uLWZ1bmdpYmxlIGRpZ2l0YWxcbiAqICAgYXNzZXRzLCBzaG91bGQgbm90IGJlIHNwZWNpZmllZC4gVGhlIGRlY2ltYWxQbGFjZXMgcHJvcGVydHlcbiAqICAgc2hvdWxkIGJlIHVzZWQgZm9yICpkaXNwbGF5IHB1cnBvc2VzIG9ubHkqLiBBbnkgb3RoZXIgdXNlIGlzIGFuXG4gKiAgIGFudGktcGF0dGVybi5cbiAqIEBwcm9wZXJ0eSB7QXNzZXRLaW5kPX0gYXNzZXRLaW5kXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgU2h1dGRvd25XaXRoRmFpbHVyZVxuICogQ2FsbGVkIHRvIHNodXQgc29tZXRoaW5nIGRvd24gYmVjYXVzZSBzb21ldGhpbmcgd2VudCB3cm9uZywgd2hlcmUgdGhlIHJlYXNvblxuICogaXMgc3VwcG9zZWQgdG8gYmUgYW4gRXJyb3IgdGhhdCBkZXNjcmliZXMgd2hhdCB3ZW50IHdyb25nLiBTb21lIHZhbGlkXG4gKiBpbXBsZW1lbnRhdGlvbnMgb2YgYFNodXRkb3duV2l0aEZhaWx1cmVgIHdpbGwgbmV2ZXIgcmV0dXJuLCBlaXRoZXJcbiAqIGJlY2F1c2UgdGhleSB0aHJvdyBvciBiZWNhdXNlIHRoZXkgaW1tZWRpYXRlbHkgc2h1dGRvd24gdGhlIGVuY2xvc2luZyB1bml0XG4gKiBvZiBjb21wdXRhdGlvbi4gSG93ZXZlciwgdGhleSBhbHNvIG1pZ2h0IHJldHVybiwgc28gdGhlIGNhbGxlciBzaG91bGRcbiAqIGZvbGxvdyB0aGlzIGNhbGwgYnkgdGhlaXIgb3duIGRlZmVuc2l2ZSBgdGhyb3cgcmVhc29uO2AgaWYgYXBwcm9wcmlhdGUuXG4gKlxuICogQHBhcmFtIHtFcnJvcn0gcmVhc29uXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBNaW50XG4gKiBIb2xkaW5nIGEgTWludCBjYXJyaWVzIHRoZSByaWdodCB0byBpc3N1ZSBuZXcgZGlnaXRhbCBhc3NldHMuIFRoZXNlXG4gKiBhc3NldHMgYWxsIGhhdmUgdGhlIHNhbWUga2luZCwgd2hpY2ggaXMgY2FsbGVkIGEgQnJhbmQuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBJc3N1ZXI8Sz59IGdldElzc3VlciBHZXRzIHRoZSBJc3N1ZXIgZm9yIHRoaXMgbWludC5cbiAqIEBwcm9wZXJ0eSB7KG5ld0Ftb3VudDogQW1vdW50PEs+KSA9PiBQYXltZW50PEs+fSBtaW50UGF5bWVudFxuICogQ3JlYXRlcyBhIG5ldyBQYXltZW50IGNvbnRhaW5pbmcgbmV3bHkgbWludGVkIGFtb3VudC5cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBEZXBvc2l0RmFjZXRSZWNlaXZlXG4gKiBAcGFyYW0ge1BheW1lbnR9IHBheW1lbnRcbiAqIEBwYXJhbSB7UGF0dGVybj19IG9wdEFtb3VudFNoYXBlXG4gKiBAcmV0dXJucyB7QW1vdW50fVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRGVwb3NpdEZhY2V0XG4gKiBAcHJvcGVydHkge0RlcG9zaXRGYWNldFJlY2VpdmV9IHJlY2VpdmVcbiAqIERlcG9zaXQgYWxsIHRoZSBjb250ZW50cyBvZiBwYXltZW50IGludG8gdGhlIHB1cnNlIHRoYXQgbWFkZSB0aGlzIGZhY2V0LFxuICogcmV0dXJuaW5nIHRoZSBhbW91bnQuIElmIHRoZSBvcHRpb25hbCBhcmd1bWVudCBgb3B0QW1vdW50YCBkb2VzIG5vdCBlcXVhbCB0aGVcbiAqIGFtb3VudCBvZiBkaWdpdGFsIGFzc2V0cyBpbiB0aGUgcGF5bWVudCwgdGhyb3cgYW4gZXJyb3IuXG4gKlxuICogSWYgcGF5bWVudCBpcyBhIHByb21pc2UsIHRocm93IGFuIGVycm9yLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBjYWxsYmFjayBQdXJzZURlcG9zaXRcbiAqIEBwYXJhbSB7UGF5bWVudDxLPn0gcGF5bWVudFxuICogQHBhcmFtIHtQYXR0ZXJuPX0gb3B0QW1vdW50U2hhcGVcbiAqIEByZXR1cm5zIHtBbW91bnQ8Sz59XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHR5cGVkZWYge29iamVjdH0gUHVyc2VcbiAqIFB1cnNlcyBob2xkIGFtb3VudCBvZiBkaWdpdGFsIGFzc2V0cyBvZiB0aGUgc2FtZSBicmFuZCwgYnV0IHVubGlrZSBQYXltZW50cyxcbiAqIHRoZXkgYXJlIG5vdCBtZWFudCB0byBiZSBzZW50IHRvIG90aGVycy4gVG8gdHJhbnNmZXIgZGlnaXRhbCBhc3NldHMsIGFcbiAqIFBheW1lbnQgc2hvdWxkIGJlIHdpdGhkcmF3biBmcm9tIGEgUHVyc2UuIFRoZSBhbW91bnQgb2YgZGlnaXRhbFxuICogYXNzZXRzIGluIGEgcHVyc2UgY2FuIGNoYW5nZSB0aHJvdWdoIHRoZSBhY3Rpb24gb2YgZGVwb3NpdCgpIGFuZCB3aXRoZHJhdygpLlxuICpcbiAqIFRoZSBwcmltYXJ5IHVzZSBmb3IgUHVyc2VzIGFuZCBQYXltZW50cyBpcyBmb3IgY3VycmVuY3ktbGlrZSBhbmQgZ29vZHMtbGlrZVxuICogZGlnaXRhbCBhc3NldHMsIGJ1dCB0aGV5IGNhbiBhbHNvIGJlIHVzZWQgdG8gcmVwcmVzZW50IG90aGVyIGtpbmRzIG9mIHJpZ2h0cyxcbiAqIHN1Y2ggYXMgdGhlIHJpZ2h0IHRvIHBhcnRpY2lwYXRlIGluIGEgcGFydGljdWxhciBjb250cmFjdC5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IEJyYW5kPEs+fSBnZXRBbGxlZ2VkQnJhbmQgR2V0IHRoZSBhbGxlZ2VkIEJyYW5kIGZvciB0aGlzIFB1cnNlXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBBbW91bnQ8Sz59IGdldEN1cnJlbnRBbW91bnRcbiAqIEdldCB0aGUgYW1vdW50IGNvbnRhaW5lZCBpbiB0aGlzIHB1cnNlLlxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gTm90aWZpZXI8QW1vdW50PEs+Pn0gZ2V0Q3VycmVudEFtb3VudE5vdGlmaWVyXG4gKiBHZXQgYSBsb3NzeSBub3RpZmllciBmb3IgY2hhbmdlcyB0byB0aGlzIHB1cnNlJ3MgYmFsYW5jZS5cbiAqXG4gKiBAcHJvcGVydHkge1B1cnNlRGVwb3NpdDxLPn0gZGVwb3NpdFxuICogRGVwb3NpdCBhbGwgdGhlIGNvbnRlbnRzIG9mIHBheW1lbnQgaW50byB0aGlzIHB1cnNlLCByZXR1cm5pbmcgdGhlXG4gKiBhbW91bnQuIElmIHRoZSBvcHRpb25hbCBhcmd1bWVudCBgb3B0QW1vdW50YCBkb2VzIG5vdCBlcXVhbCB0aGVcbiAqIGFtb3VudCBvZiBkaWdpdGFsIGFzc2V0cyBpbiB0aGUgcGF5bWVudCwgdGhyb3cgYW4gZXJyb3IuXG4gKlxuICogSWYgcGF5bWVudCBpcyBhIHByb21pc2UsIHRocm93IGFuIGVycm9yLlxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gRGVwb3NpdEZhY2V0fSBnZXREZXBvc2l0RmFjZXRcbiAqIFJldHVybiBhbiBvYmplY3Qgd2hvc2UgYHJlY2VpdmVgIG1ldGhvZCBkZXBvc2l0cyB0byB0aGUgY3VycmVudCBQdXJzZS5cbiAqXG4gKiBAcHJvcGVydHkgeyhhbW91bnQ6IEFtb3VudDxLPikgPT4gUGF5bWVudDxLPn0gd2l0aGRyYXdcbiAqIFdpdGhkcmF3IGFtb3VudCBmcm9tIHRoaXMgcHVyc2UgaW50byBhIG5ldyBQYXltZW50LlxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gQ29weVNldDxQYXltZW50PEs+Pn0gZ2V0UmVjb3ZlcnlTZXRcbiAqIFRoZSBzZXQgb2YgcGF5bWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcHVyc2UgdGhhdCBhcmUgc3RpbGwgbGl2ZS4gVGhlc2VcbiAqIGFyZSB0aGUgcGF5bWVudHMgdGhhdCBjYW4gc3RpbGwgYmUgcmVjb3ZlcmVkIGluIGVtZXJnZW5jaWVzIGJ5LCBmb3IgZXhhbXBsZSxcbiAqIGRlcG9zaXRpbmcgaW50byB0aGlzIHB1cnNlLiBTdWNoIGEgZGVwb3NpdCBhY3Rpb24gaXMgbGlrZSBjYW5jZWxpbmcgYW5cbiAqIG91dHN0YW5kaW5nIGNoZWNrIGJlY2F1c2UgeW91J3JlIHRpcmVkIG9mIHdhaXRpbmcgZm9yIGl0LiBPbmNlIHlvdXJcbiAqIGNhbmNlbGxhdGlvbiBpcyBhY2tub3dsZWRnZWQsIHlvdSBjYW4gc3BlbmQgdGhlIGFzc2V0cyBhdCBzdGFrZSBvbiBvdGhlclxuICogdGhpbmdzLiBBZnRlcndhcmRzLCBpZiB0aGUgcmVjaXBpZW50IG9mIHRoZSBvcmlnaW5hbCBjaGVjayBmaW5hbGx5IGdldHNcbiAqIGFyb3VuZCB0byBkZXBvc2l0aW5nIGl0LCB0aGVpciBkZXBvc2l0IGZhaWxzLlxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gQW1vdW50PEs+fSByZWNvdmVyQWxsXG4gKiBGb3IgdXNlIGluIGVtZXJnZW5jaWVzLCBzdWNoIGFzIGNvbWluZyBiYWNrIGZyb20gYSB0cmF1bWF0aWMgY3Jhc2ggYW5kXG4gKiB1cGdyYWRlLiBUaGlzIGRlcG9zaXRzIGFsbCB0aGUgcGF5bWVudHMgaW4gdGhpcyBwdXJzZSdzIHJlY292ZXJ5IHNldFxuICogaW50byB0aGUgcHVyc2UgaXRzZWxmLCByZXR1cm5pbmcgdGhlIHRvdGFsIGFtb3VudCBvZiBhc3NldHMgcmVjb3ZlcmVkLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBheW1lbnRcbiAqIFBheW1lbnRzIGhvbGQgYW1vdW50IG9mIGRpZ2l0YWwgYXNzZXRzIG9mIHRoZSBzYW1lIGJyYW5kIGluIHRyYW5zaXQuIFBheW1lbnRzXG4gKiBjYW4gYmUgZGVwb3NpdGVkIGluIHB1cnNlcywgc3BsaXQgaW50byBtdWx0aXBsZSBwYXltZW50cywgY29tYmluZWQsIGFuZFxuICogY2xhaW1lZCAoZ2V0dGluZyBhbiBleGNsdXNpdmUgcGF5bWVudCkuIFBheW1lbnRzIGFyZSBsaW5lYXIsIG1lYW5pbmdcbiAqIHRoYXQgZWl0aGVyIGEgcGF5bWVudCBoYXMgdGhlIHNhbWUgYW1vdW50IG9mIGRpZ2l0YWwgYXNzZXRzIGl0XG4gKiBzdGFydGVkIHdpdGgsIG9yIGl0IGlzIHVzZWQgdXAgZW50aXJlbHkuIEl0IGlzIGltcG9zc2libGUgdG8gcGFydGlhbGx5IHVzZSBhXG4gKiBwYXltZW50LlxuICpcbiAqIFBheW1lbnRzIGFyZSBvZnRlbiByZWNlaXZlZCBmcm9tIG90aGVyIGFjdG9ycyBhbmQgdGhlcmVmb3JlIHNob3VsZFxuICogbm90IGJlIHRydXN0ZWQgdGhlbXNlbHZlcy4gVG8gZ2V0IHRoZSBhbW91bnQgb2YgZGlnaXRhbCBhc3NldHMgaW4gYSBwYXltZW50LFxuICogdXNlIHRoZSB0cnVzdGVkIGlzc3VlcjogaXNzdWVyLmdldEFtb3VudE9mKHBheW1lbnQpLFxuICpcbiAqIFBheW1lbnRzIGNhbiBiZSBjb252ZXJ0ZWQgdG8gUHVyc2VzIGJ5IGdldHRpbmcgYSB0cnVzdGVkIGlzc3VlciBhbmRcbiAqIGNhbGxpbmcgYGlzc3Vlci5tYWtlRW1wdHlQdXJzZSgpYCB0byBjcmVhdGUgYSBwdXJzZSwgdGhlblxuICogYHB1cnNlLmRlcG9zaXQocGF5bWVudClgLlxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gQnJhbmQ8Sz59IGdldEFsbGVnZWRCcmFuZFxuICogR2V0IHRoZSBhbGxlZ2VkQnJhbmQsIGluZGljYXRpbmcgdGhlIHR5cGUgb2YgZGlnaXRhbCBhc3NldCB0aGlzXG4gKiBwYXltZW50IHB1cnBvcnRzIHRvIGJlLCBhbmQgd2hpY2ggaXNzdWVyIHRvIHVzZS4gQmVjYXVzZSBwYXltZW50c1xuICogYXJlIG5vdCB0cnVzdGVkLCBhbnkgbWV0aG9kIGNhbGxzIG9uIHBheW1lbnRzIHNob3VsZCBiZSB0cmVhdGVkXG4gKiB3aXRoIHN1c3BpY2lvbiBhbmQgdmVyaWZpZWQgZWxzZXdoZXJlLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBbW91bnRWYWx1ZX0gVlxuICogQHR5cGVkZWYge29iamVjdH0gTWF0aEhlbHBlcnNcbiAqIEFsbCBvZiB0aGUgZGlmZmVyZW5jZSBpbiBob3cgZGlnaXRhbCBhc3NldCBhbW91bnQgYXJlIG1hbmlwdWxhdGVkIGNhbiBiZVxuICogcmVkdWNlZCB0byB0aGUgYmVoYXZpb3Igb2YgdGhlIG1hdGggb24gdmFsdWVzLiBXZSBleHRyYWN0IHRoaXNcbiAqIGN1c3RvbSBsb2dpYyBpbnRvIG1hdGhIZWxwZXJzLiBNYXRoSGVscGVycyBhcmUgYWJvdXQgdmFsdWVcbiAqIGFyaXRobWV0aWMsIHdoZXJlYXMgQW1vdW50TWF0aCBpcyBhYm91dCBhbW91bnRzLCB3aGljaCBhcmUgdGhlXG4gKiB2YWx1ZXMgbGFiZWxlZCB3aXRoIGEgYnJhbmQuIEFtb3VudE1hdGggdXNlIG1hdGhIZWxwZXJzIHRvIGRvIHRoZWlyIHZhbHVlXG4gKiBhcml0aG1ldGljLCBhbmQgdGhlbiBicmFuZCB0aGUgcmVzdWx0cywgbWFraW5nIGEgbmV3IGFtb3VudC5cbiAqXG4gKiBUaGUgTWF0aEhlbHBlcnMgYXJlIGRlc2lnbmVkIHRvIGJlIGNhbGxlZCBvbmx5IGZyb20gQW1vdW50TWF0aCwgYW5kIHNvXG4gKiBhbGwgbWV0aG9kcyBidXQgY29lcmNlIGNhbiBhc3N1bWUgdGhlaXIgaW5wdXRzIGFyZSB2YWxpZC4gVGhleSBvbmx5XG4gKiBuZWVkIHRvIGRvIG91dHB1dCB2YWxpZGF0aW9uLCBhbmQgb25seSB3aGVuIHRoZXJlIGlzIGEgcG9zc2liaWxpdHkgb2ZcbiAqIGludmFsaWQgb3V0cHV0LlxuICpcbiAqIEBwcm9wZXJ0eSB7KGFsbGVnZWRWYWx1ZTogVikgPT4gVn0gZG9Db2VyY2VcbiAqIENoZWNrIHRoZSBraW5kIG9mIHRoaXMgdmFsdWUgYW5kIHRocm93IGlmIGl0IGlzIG5vdCB0aGVcbiAqIGV4cGVjdGVkIGtpbmQuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBWfSBkb01ha2VFbXB0eVxuICogR2V0IHRoZSByZXByZXNlbnRhdGlvbiBmb3IgdGhlIGlkZW50aXR5IGVsZW1lbnQgKG9mdGVuIDAgb3IgYW5cbiAqIGVtcHR5IGFycmF5KVxuICpcbiAqIEBwcm9wZXJ0eSB7KHZhbHVlOiBWKSA9PiBib29sZWFufSBkb0lzRW1wdHlcbiAqIElzIHRoZSB2YWx1ZSB0aGUgaWRlbnRpdHkgZWxlbWVudD9cbiAqXG4gKiBAcHJvcGVydHkgeyhsZWZ0OiBWLCByaWdodDogVikgPT4gYm9vbGVhbn0gZG9Jc0dURVxuICogSXMgdGhlIGxlZnQgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSByaWdodD9cbiAqXG4gKiBAcHJvcGVydHkgeyhsZWZ0OiBWLCByaWdodDogVikgPT4gYm9vbGVhbn0gZG9Jc0VxdWFsXG4gKiBEb2VzIGxlZnQgZXF1YWwgcmlnaHQ/XG4gKlxuICogQHByb3BlcnR5IHsobGVmdDogViwgcmlnaHQ6IFYpID0+IFZ9IGRvQWRkXG4gKiBSZXR1cm4gdGhlIGxlZnQgY29tYmluZWQgd2l0aCB0aGUgcmlnaHQuXG4gKlxuICogQHByb3BlcnR5IHsobGVmdDogViwgcmlnaHQ6IFYpID0+IFZ9IGRvU3VidHJhY3RcbiAqIFJldHVybiB3aGF0IHJlbWFpbnMgYWZ0ZXIgcmVtb3ZpbmcgdGhlIHJpZ2h0IGZyb20gdGhlIGxlZnQuIElmXG4gKiBzb21ldGhpbmcgaW4gdGhlIHJpZ2h0IHdhcyBub3QgaW4gdGhlIGxlZnQsIHdlIHRocm93IGFuIGVycm9yLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge2JpZ2ludH0gTmF0VmFsdWVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtNYXRoSGVscGVyczxOYXRWYWx1ZT59IE5hdE1hdGhIZWxwZXJzXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7QXJyYXk8S2V5Pn0gU2V0VmFsdWVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtNYXRoSGVscGVyczxTZXRWYWx1ZT59IFNldE1hdGhIZWxwZXJzXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7Q29weVNldDxLZXk+fSBDb3B5U2V0VmFsdWVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtNYXRoSGVscGVyczxDb3B5U2V0VmFsdWU+fSBDb3B5U2V0TWF0aEhlbHBlcnNcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtDb3B5QmFnPEtleT59IENvcHlCYWdWYWx1ZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge01hdGhIZWxwZXJzPENvcHlCYWdWYWx1ZT59IENvcHlCYWdNYXRoSGVscGVyc1xuICovXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAF3N7g5XAQAAVwEAACUAAABAYWdvcmljL2dvdmVybmFuY2UtdjAuOS4xL2V4cG9ydGVkLmpzeyJpbXBvcnRzIjpbIi4vc3JjL3R5cGVzLWFtYmllbnQuanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9zcmMvdHlwZXMtYW1iaWVudC5qc1wiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAT1Jlay9cAAAvXAAALgAAAEBhZ29yaWMvZ292ZXJuYW5jZS12MC45LjEvc3JjL3R5cGVzLWFtYmllbnQuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKipcbiAqIEB0eXBlZGVmIHsgJ3VucmFua2VkJyB8ICdvcmRlcicgfCAncGx1cmFsaXR5JyB9IENob2ljZU1ldGhvZFxuICogKiBVTlJBTktFRDogXCJ1bnJhbmtlZCB2b3RpbmdcIiBtZWFucyB0aGF0IHRoZSB2b3RlciBzcGVjaWZpZXMgc29tZSBudW1iZXIgb2ZcbiAqICAgIHBvc2l0aW9ucywgYW5kIGlzIGVuZG9yc2luZyB0aGVtIGVxdWFsbHkuXG4gKiAqIE9SREVSOiBUaGUgdm90ZXIgYXNzaWducyBvcmRpbmFsIG51bWJlcnMgdG8gc29tZSBvZiB0aGUgcG9zaXRpb25zLiBUaGVcbiAqICAgIHBvc2l0aW9ucyB3aWxsIGJlIHRyZWF0ZWQgYXMgYW4gb3JkZXJlZCBsaXN0IHdpdGggbm8gZ2Fwcy5cbiAqXG4gKiBXaGVuIHZvdGVycyBhcmUgbGltaXRlZCB0byBjaG9vc2luZyBhIHNpbmdsZSBjYW5kaWRhdGUsIGVpdGhlciBVTlJBTktFRCBvclxuICogT1JERVIgd291bGQgd29yay4gVU5SQU5LRUQgaGFzIGEgc2ltcGxlciByZXByZXNlbnRhdGlvbiBzbyB3ZSB1c2UgdGhhdC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsgJ3BhcmFtX2NoYW5nZScgfCAnZWxlY3Rpb24nIHwgJ3N1cnZleScgfCAnYXBpX2ludm9jYXRpb24nIHxcbiAqICAgJ29mZmVyX2ZpbHRlcicgfSBFbGVjdGlvblR5cGVcbiAqIHBhcmFtX2NoYW5nZSBpcyB2ZXJ5IHNwZWNpZmljLiBTdXJ2ZXkgbWVhbnMgbXVsdGlwbGUgYW5zd2VycyBhcmUgcG9zc2libGUsXG4gKiBFbGVjdGlvbiBtZWFucyBzb21lIGNhbmRpZGF0ZXMgYXJlIGdvaW5nIHRvIFwid2luXCIuIEl0J3Mgbm90IGNsZWFyIHRoZXNlIGFyZVxuICogb3J0aG9nb25hbC4gVGhlIGltcG9ydGFudCBkaXN0aW5jdGlvbiBpcyB0aGF0IHBhcmFtX2NoYW5nZSBoYXMgYSBzdHJ1Y3R1cmVkXG4gKiBpc3N1ZSwgd2hpbGUgdGhlIG90aGVycyBoYXZlIGEgaXNzdWUgcHJlc2VudGVkIGFzIGEgc3RyaW5nLlxuICovXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi9jb25zdGFudHMuanMnKS5QYXJhbVR5cGV9IFBhcmFtVHlwZSAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsgJ21ham9yaXR5JyB8ICdhbGwnIHwgJ25vX3F1b3J1bScgfSBRdW9ydW1SdWxlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTaW1wbGVJc3N1ZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRleHRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsgQW1vdW50IHwgQnJhbmQgfCBJbnN0YWxsYXRpb24gfCBJbnN0YW5jZSB8IGJpZ2ludCB8XG4gKiAgIFJhdGlvIHwgc3RyaW5nIHwgdW5rbm93biB9IFBhcmFtVmFsdWVcbiAqL1xuXG4vKiBYWFggYmV0dGVyIHRvIHVzZSB0aGUgbWFuaWZlc3QgY29uc3RhbnQgUGFyYW1UeXBlcyovXG4vKiBidXQgaW1wb3J0aW5nIHRoYXQgaGVyZSB0dXJucyB0aGlzIGZpbGUgaW50byBhIG1vZHVsZSwqL1xuLyogYnJlYWtpbmcgdGhlIGFtYmllbnQgdHlwaW5nKi9cbi8qKlxuICogQHRlbXBsYXRlIHtQYXJhbVR5cGV9IFRcbiAqIEB0eXBlZGVmIHtUIGV4dGVuZHMgJ2Ftb3VudCcgPyBBbW91bnQgOlxuICogVCBleHRlbmRzICdicmFuZCcgPyBCcmFuZCA6XG4gKiBUIGV4dGVuZHMgJ2luc3RhbGxhdGlvbicgPyBJbnN0YWxsYXRpb246XG4gKiBUIGV4dGVuZHMgJ2luc3RhbmNlJyA/IEluc3RhbmNlIDpcbiAqIFQgZXh0ZW5kcyAnaW52aXRhdGlvbicgPyBBbW91bnQgOiAvLyBYWFggdGhpcyBpcyB0aGUgZ2V0dGVyIHZhbHVlIGJ1dCBub3QgdGhlIHNldHRlclxuICogVCBleHRlbmRzICduYXQnID8gYmlnaW50IDpcbiAqIFQgZXh0ZW5kcyAncmF0aW8nID8gUmF0aW8gOlxuICogVCBleHRlbmRzICdzdHJpbmcnID8gc3RyaW5nIDpcbiAqIFQgZXh0ZW5kcyAndW5rbm93bicgPyB1bmtub3duIDpcbiAqIG5ldmVyXG4gKiB9IFBhcmFtVmFsdWVGb3JUeXBlXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge1BhcmFtVHlwZX0gW1Q9UGFyYW1UeXBlXVxuICogQHR5cGVkZWYge3sgdHlwZTogVCwgdmFsdWU6IFBhcmFtVmFsdWVGb3JUeXBlPFQ+IH19IFBhcmFtVmFsdWVUeXBlZDxUPlxuICovXG5cbi8qKlxuICogVGVybXMgYSBjb250cmFjdCBtdXN0IHByb3ZpZGUgaW4gb3JkZXIgdG8gYmUgZ292ZXJuZWQuXG4gKlxuICogQHRlbXBsYXRlIHtYaW1wb3J0KCcuL2NvbnRyYWN0R292ZXJuYW5jZS90eXBlZFBhcmFtTWFuYWdlci5qcycpLlBhcmFtVHlwZXNNYXB9IFQgR292ZXJuZWQgcGFyYW1ldGVycyBvZiBjb250cmFjdFxuICogQHR5cGVkZWYge3tcbiAqICAgZWxlY3Rpb25NYW5hZ2VyOiBYaW1wb3J0KCdAYWdvcmljL3pvZS9zcmMvem9lU2VydmljZS91dGlscy5qcycpLkluc3RhbmNlPFhpbXBvcnQoJy4vY29udHJhY3RHb3Zlcm5vcicpLnN0YXJ0PixcbiAqICAgZ292ZXJuZWRQYXJhbXM6IFhpbXBvcnQoJy4vY29udHJhY3RHb3Zlcm5hbmNlL3R5cGVkUGFyYW1NYW5hZ2VyLmpzJykuUGFyYW1SZWNvcmRzRnJvbVR5cGVzPFQgJiB7XG4gKiAgICAgRWxlY3RvcmF0ZTogJ2ludml0YXRpb24nXG4gKiAgIH0+XG4gKiB9fSBHb3Zlcm5hbmNlVGVybXM8VD5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsgU2ltcGxlSXNzdWUgfCBQYXJhbUNoYW5nZUlzc3VlPHVua25vd24+IHwgQXBpSW52b2NhdGlvbklzc3VlIHxcbiAqICAgT2ZmZXJGaWx0ZXJJc3N1ZSB9IElzc3VlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBRdWVzdGlvblRlcm1zIC0gUXVlc3Rpb25TcGVjIHBsdXMgdGhlIEVsZWN0b3JhdGUgSW5zdGFuY2UgYW5kXG4gKiAgIGEgbnVtZXJpY2FsIHRocmVzaG9sZCBmb3IgdGhlIHF1b3J1bS4gKFRoZSB2b3RlQ291bnRlciBkb2Vzbid0IGtub3cgdGhlXG4gKiAgIHNpemUgb2YgdGhlIGVsZWN0b3JhdGUsIHNvIHRoZSBFbGVjdG9yYXRlIGhhcyB0byBzYXkgd2hhdCBsaW1pdCB0byBlbmZvcmNlLilcbiAqIEBwcm9wZXJ0eSB7UXVlc3Rpb25TcGVjfSBxdWVzdGlvblNwZWNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBxdW9ydW1UaHJlc2hvbGRcbiAqIEBwcm9wZXJ0eSB7SW5zdGFuY2V9IGVsZWN0b3JhdGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFRleHRQb3NpdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRleHRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsgVGV4dFBvc2l0aW9uIHwgQ2hhbmdlUGFyYW1zUG9zaXRpb24gfCBOb0NoYW5nZVBhcmFtc1Bvc2l0aW9uIHwgSW52b2tlQXBpUG9zaXRpb24gfCBEb250SW52b2tlQXBpUG9zaXRpb24gfFxuICogICAgT2ZmZXJGaWx0ZXJQb3NpdGlvbiB8IE5vQ2hhbmdlT2ZmZXJGaWx0ZXJQb3NpdGlvbiB8IEludm9rZUFwaVBvc2l0aW9uIH0gUG9zaXRpb25cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHt7IHF1ZXN0aW9uOiBIYW5kbGU8J1F1ZXN0aW9uJz4gfSAmIChcbiAqICAgeyBvdXRjb21lOiAnd2luJywgcG9zaXRpb246IFBvc2l0aW9uIH0gfFxuICogICB7IG91dGNvbWU6ICdmYWlsJywgcmVhc29uOiAnTm8gcXVvcnVtJyB9XG4gKiApfSBPdXRjb21lUmVjb3JkXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7eyBxdWVzdGlvbjogSGFuZGxlPCdRdWVzdGlvbic+IH0gJiAoXG4gKiAgeyBvdXRjb21lOiAnd2luJywgcG9zaXRpb25zOiBQb3NpdGlvbltdIH0gfFxuICogIHsgb3V0Y29tZTogJ2ZhaWwnLCByZWFzb246ICdObyBxdW9ydW0nIH1cbiAqICl9IE11bHRpT3V0Y29tZVJlY29yZFxuICovXG5cbi8qKlxuICogU3BlY2lmaWNhdGlvbiB3aGVuIHJlcXVlc3RpbmcgY3JlYXRpb24gb2YgYSBRdWVzdGlvblxuICpcbiAqIEB0ZW1wbGF0ZSB7SXNzdWV9IFtJPUlzc3VlXVxuICogQHR5cGVkZWYge29iamVjdH0gUXVlc3Rpb25TcGVjXG4gKiBAcHJvcGVydHkge0Nob2ljZU1ldGhvZH0gbWV0aG9kXG4gKiBAcHJvcGVydHkge0l9IGlzc3VlXG4gKiBAcHJvcGVydHkge1Bvc2l0aW9uW119IHBvc2l0aW9uc1xuICogQHByb3BlcnR5IHtFbGVjdGlvblR5cGV9IGVsZWN0aW9uVHlwZVxuICogQHByb3BlcnR5IHtudW1iZXJ9IG1heENob2ljZXNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBtYXhXaW5uZXJzXG4gKiBAcHJvcGVydHkge0Nsb3NpbmdSdWxlfSBjbG9zaW5nUnVsZVxuICogQHByb3BlcnR5IHtRdW9ydW1SdWxlfSBxdW9ydW1SdWxlXG4gKiBAcHJvcGVydHkge1Bvc2l0aW9ufSB0aWVPdXRjb21lXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBRdWVzdGlvbkRldGFpbHNFeHRyYVByb3BlcnRpZXNcbiAqIEBwcm9wZXJ0eSB7SW5zdGFuY2V9IGNvdW50ZXJJbnN0YW5jZSAtIGluc3RhbmNlIG9mIHRoZSBWb3RlQ291bnRlclxuICogQHByb3BlcnR5IHtIYW5kbGU8J1F1ZXN0aW9uJz59IHF1ZXN0aW9uSGFuZGxlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7UXVlc3Rpb25TcGVjICYgUXVlc3Rpb25EZXRhaWxzRXh0cmFQcm9wZXJ0aWVzfSBRdWVzdGlvbkRldGFpbHNcbiAqICAgIGNvbXBsZXRlIHF1ZXN0aW9uIGRldGFpbHM6IHF1ZXN0aW9uU3BlYyBwbHVzIGNvdW50ZXIgYW5kIHF1ZXN0aW9uSGFuZGxlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBHb3Zlcm5hbmNlUGFpclxuICogQHByb3BlcnR5IHtJbnN0YW5jZX0gZ292ZXJub3JcbiAqIEBwcm9wZXJ0eSB7SW5zdGFuY2V9IGdvdmVybmVkXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBRdWVzdGlvblxuICogQHByb3BlcnR5IHsoKSA9PiBJbnN0YW5jZX0gZ2V0Vm90ZUNvdW50ZXJcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUXVlc3Rpb25EZXRhaWxzfSBnZXREZXRhaWxzXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBDb21wbGV0ZVVucmFua2VkUXVlc3Rpb25cbiAqIEBwcm9wZXJ0eSB7SGFuZGxlPCdRdWVzdGlvbic+fSBxdWVzdGlvbkhhbmRsZVxuICogQHByb3BlcnR5IHtQb3NpdGlvbltdfSBjaG9zZW4gLSBhIGxpc3Qgb2YgZXF1YWwtd2VpZ2h0IHByZWZlcnJlZCBwb3NpdGlvbnNcbiAqL1xuXG4vKiBub3QgeWV0IGluIHVzZSovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IENvbXBsZXRlV2VpZ2h0ZWRCYWxsb3RcbiAqIEBwcm9wZXJ0eSB7SGFuZGxlPCdRdWVzdGlvbic+fSBxdWVzdGlvbkhhbmRsZVxuICogQHByb3BlcnR5IHtbUG9zaXRpb24sYmlnaW50XVtdfSB3ZWlnaHRlZCAtIGxpc3Qgb2YgcG9zaXRpb25zIHdpdGhcbiAqICAgd2VpZ2h0cy4gVm90ZUNvdW50ZXIgbWF5IGxpbWl0IHdlaWdodHMgdG8gYSByYW5nZSBvciByZXF1aXJlIHVuaXF1ZW5lc3MuXG4gKi9cblxuLyogbm90IHlldCBpbiB1c2UqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBDb21wbGV0ZU9yZGVyZWRCYWxsb3RcbiAqIEBwcm9wZXJ0eSB7SGFuZGxlPCdRdWVzdGlvbic+fSBxdWVzdGlvbkhhbmRsZVxuICogQHByb3BlcnR5IHtQb3NpdGlvbltdfSBvcmRlcmVkIC0gb3JkZXJlZCBsaXN0IG9mIHBvc2l0aW9uIGZyb20gbW9zdCBwcmVmZXJyZWRcbiAqICAgdG8gbGVhc3QgcHJlZmVycmVkXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQb3NpdGlvbkNvdW50XG4gKiBAcHJvcGVydHkge1Bvc2l0aW9ufSBwb3NpdGlvblxuICogQHByb3BlcnR5IHtiaWdpbnR9IHRvdGFsXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBWb3RlU3RhdGlzdGljc1xuICogQHByb3BlcnR5IHtiaWdpbnR9IHNwb2lsZWRcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB2b3Rlc1xuICogQHByb3BlcnR5IHtQb3NpdGlvbkNvdW50W119IHJlc3VsdHNcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFF1b3J1bUNvdW50ZXJcbiAqIEBwcm9wZXJ0eSB7KHN0YXRzOiBWb3RlU3RhdGlzdGljcykgPT4gYm9vbGVhbn0gY2hlY2tcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBCdWlsZFF1ZXN0aW9uXG4gKiBAcGFyYW0ge1F1ZXN0aW9uU3BlY30gcXVlc3Rpb25TcGVjXG4gKiBAcGFyYW0ge0luc3RhbmNlfSBpbnN0YW5jZSAtIHZvdGVDb3VudGVyIGluc3RhbmNlXG4gKiBAcmV0dXJucyB7UXVlc3Rpb259XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBWb3RlQ291bnRlckNyZWF0b3JGYWNldCAtIGEgZmFjZXQgdGhhdCB0aGUgRWxlY3RvcmF0ZSBzaG91bGRcbiAqICAgaG9sZCB0aWdodGx5LiBzdWJtaXRWb3RlKCkgaXMgdGhlIGNvcmUgY2FwYWJpbGl0eSB0aGF0IGFsbG93cyB0aGUgaG9sZGVyIHRvXG4gKiAgIHNwZWNpZnkgdGhlIGlkZW50aXR5IGFuZCBjaG9pY2Ugb2YgYSB2b3Rlci4gVGhlIHZvdGVDb3VudGVyIGlzIG1ha2luZyB0aGF0XG4gKiAgIGF2YWlsYWJsZSB0byB0aGUgRWxlY3RvcmF0ZSwgd2hpY2ggc2hvdWxkIHdyYXAgYW5kIGF0dGVudWF0ZSBpdCBzbyBlYWNoXG4gKiAgIHZvdGVyIGdldHMgb25seSB0aGUgYWJpbGl0eSB0byBjYXN0IHRoZWlyIG93biB2b3RlIGF0IGEgd2VpZ2h0IHNwZWNpZmllZCBieVxuICogICB0aGUgZWxlY3RvcmF0ZS5cbiAqIEBwcm9wZXJ0eSB7U3VibWl0Vm90ZX0gc3VibWl0Vm90ZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gVm90ZUNvdW50ZXJQdWJsaWNGYWNldFxuICogQHByb3BlcnR5IHsoKSA9PiBib29sZWFufSBpc09wZW5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUXVlc3Rpb259IGdldFF1ZXN0aW9uXG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8UG9zaXRpb24+fSBnZXRPdXRjb21lXG4gKiBAcHJvcGVydHkgeygpID0+IFF1ZXN0aW9uRGV0YWlsc30gZ2V0RGV0YWlsc1xuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPFZvdGVTdGF0aXN0aWNzPn0gZ2V0U3RhdHNcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IE11bHRpVm90ZUNvdW50ZXJQdWJsaWNGYWNldFxuICogQHByb3BlcnR5IHsoKSA9PiBib29sZWFufSBpc09wZW5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUXVlc3Rpb259IGdldFF1ZXN0aW9uXG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8UG9zaXRpb25bXT59IGdldE91dGNvbWVcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUXVlc3Rpb25EZXRhaWxzfSBnZXREZXRhaWxzXG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8Vm90ZVN0YXRpc3RpY3M+fSBnZXRTdGF0c1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gVm90ZUNvdW50ZXJDbG9zZUZhY2V0XG4gKiAgIFRFU1QgT05MWTogU2hvdWxkIG5vdCBiZSBhbGxvd2VkIHRvIGVzY2FwZSBmcm9tIGNvbnRyYWN0c1xuICogQHByb3BlcnR5IHsoKSA9PiB2b2lkfSBjbG9zZVZvdGluZ1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gVm90ZUNvdW50ZXJGYWNldHNcbiAqIEBwcm9wZXJ0eSB7Vm90ZUNvdW50ZXJQdWJsaWNGYWNldH0gcHVibGljRmFjZXRcbiAqIEBwcm9wZXJ0eSB7Vm90ZUNvdW50ZXJDcmVhdG9yRmFjZXR9IGNyZWF0b3JGYWNldFxuICogQHByb3BlcnR5IHtWb3RlQ291bnRlckNsb3NlRmFjZXR9IGNsb3NlRmFjZXRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IE11bHRpVm90ZUNvdW50ZXJGYWNldHNcbiAqIEBwcm9wZXJ0eSB7TXVsdGlWb3RlQ291bnRlclB1YmxpY0ZhY2V0fSBwdWJsaWNGYWNldFxuICogQHByb3BlcnR5IHtWb3RlQ291bnRlckNyZWF0b3JGYWNldH0gY3JlYXRvckZhY2V0XG4gKiBAcHJvcGVydHkge1ZvdGVDb3VudGVyQ2xvc2VGYWNldH0gY2xvc2VGYWNldFxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEJ1aWxkVm90ZUNvdW50ZXJcbiAqIEBwYXJhbSB7UXVlc3Rpb25TcGVjfSBxdWVzdGlvblNwZWNcbiAqIEBwYXJhbSB7YmlnaW50fSB0aHJlc2hvbGQgLSBxdWVzdGlvblNwZWMgaW5jbHVkZXMgcXVvcnVtUnVsZTsgdGhlIGVsZWN0b3JhdGVcbiAqICAgIGNvbnZlcnRzIHRoYXQgdG8gYSBudW1iZXIgdGhhdCB0aGUgY291bnRlciBjYW4gZW5mb3JjZS5cbiAqIEBwYXJhbSB7SW5zdGFuY2V9IGluc3RhbmNlXG4gKiBAcGFyYW0ge0VSZWY8UHVibGlzaGVyPE91dGNvbWVSZWNvcmQ+Pn0gcHVibGlzaGVyXG4gKiBAcmV0dXJucyB7Vm90ZUNvdW50ZXJGYWNldHN9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQnVpbGRNdWx0aVZvdGVDb3VudGVyXG4gKiBAcGFyYW0ge1F1ZXN0aW9uU3BlY30gcXVlc3Rpb25TcGVjXG4gKiBAcGFyYW0ge2JpZ2ludH0gdGhyZXNob2xkIC0gcXVlc3Rpb25TcGVjIGluY2x1ZGVzIHF1b3J1bVJ1bGU7IHRoZSBlbGVjdG9yYXRlXG4gKiAgICBjb252ZXJ0cyB0aGF0IHRvIGEgbnVtYmVyIHRoYXQgdGhlIGNvdW50ZXIgY2FuIGVuZm9yY2UuXG4gKiBAcGFyYW0ge0luc3RhbmNlfSBpbnN0YW5jZVxuICogQHBhcmFtIHtFUmVmPFB1Ymxpc2hlcjxNdWx0aU91dGNvbWVSZWNvcmQ+Pn0gcHVibGlzaGVyXG4gKiBAcmV0dXJucyB7TXVsdGlWb3RlQ291bnRlckZhY2V0c31cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IENvbXBsZXRlZEJhbGxldFxuICogQHByb3BlcnR5IHtQb3NpdGlvbn0gY2hvc2VuXG4gKiBAcHJvcGVydHkge2JpZ2ludH0gc2hhcmVzXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgU3VibWl0Vm90ZVxuICogQHBhcmFtIHtIYW5kbGU8J1ZvdGVyJz59IHZvdGVySGFuZGxlXG4gKiBAcGFyYW0ge1Bvc2l0aW9uW119IGNob3NlblBvc2l0aW9uc1xuICogQHBhcmFtIHtiaWdpbnQ9fSB3ZWlnaHRcbiAqIEByZXR1cm5zIHtDb21wbGV0ZWRCYWxsZXR9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgR2V0T3BlblF1ZXN0aW9uc1xuICogQHJldHVybnMge1Byb21pc2U8SGFuZGxlPCdRdWVzdGlvbic+W10+fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEdldFF1ZXN0aW9uXG4gKiBAcGFyYW0ge0hhbmRsZTwnUXVlc3Rpb24nPn0gaFxuICogQHJldHVybnMge1Byb21pc2U8UXVlc3Rpb24+fVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRWxlY3RvcmF0ZVB1YmxpY1xuICogQHByb3BlcnR5IHsoKSA9PiBTdWJzY3JpYmVyPFF1ZXN0aW9uRGV0YWlscz59IGdldFF1ZXN0aW9uU3Vic2NyaWJlclxuICogQHByb3BlcnR5IHtHZXRPcGVuUXVlc3Rpb25zfSBnZXRPcGVuUXVlc3Rpb25zLFxuICogQHByb3BlcnR5IHsoKSA9PiBJbnN0YW5jZX0gZ2V0SW5zdGFuY2VcbiAqIEBwcm9wZXJ0eSB7R2V0UXVlc3Rpb259IGdldFF1ZXN0aW9uXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7IEVsZWN0b3JhdGVQdWJsaWMgJiB7bWFrZVZvdGVySW52aXRhdGlvbjogKCkgPT4gRVJlZjxJbnZpdGF0aW9uPn0gfSBDbGFpbXNFbGVjdG9yYXRlUHVibGljXG4gKiBAdHlwZWRlZiB7IEVsZWN0b3JhdGVQdWJsaWMgJiB7Z2V0TmFtZTogKCkgPT4gc3RyaW5nfSB9IENvbW1pdHRlZUVsZWN0b3JhdGVQdWJsaWNcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBvc2VyRmFjZXRcbiAqIEBwcm9wZXJ0eSB7QWRkUXVlc3Rpb259IGFkZFF1ZXN0aW9uXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBFbGVjdG9yYXRlQ3JlYXRvckZhY2V0XG4gKiBAcHJvcGVydHkge0FkZFF1ZXN0aW9ufSBhZGRRdWVzdGlvbiBjYW4gYmUgdXNlZCBkaXJlY3RseSB3aGVuIHRoZSBjcmVhdG9yIGRvZXNuJ3QgbmVlZCBhbnlcbiAqICByZWFzc3VyYW5jZS4gV2hlbiBzb21lb25lIG5lZWRzIHRvIGNvbm5lY3QgYWRkUXVlc3Rpb24gdG8gdGhlIEVsZWN0b3JhdGVcbiAqICBpbnN0YW5jZSwgZ2V0UG9zZXJJbnZpdGF0aW9uKCkgbGV0cyB0aGVtIGdldCBhZGRRdWVzdGlvbiB3aXRoIGFzc3VyYW5jZS5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxJbnZpdGF0aW9uPn0gZ2V0UG9zZXJJbnZpdGF0aW9uXG4gKiBAcHJvcGVydHkgeygpID0+IFN1YnNjcmliZXI8UXVlc3Rpb25EZXRhaWxzPn0gZ2V0UXVlc3Rpb25TdWJzY3JpYmVyXG4gKiBAcHJvcGVydHkgeygpID0+IEVsZWN0b3JhdGVQdWJsaWN9IGdldFB1YmxpY0ZhY2V0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBHZXRWb3Rlckludml0YXRpb25zXG4gKiBAcHJvcGVydHkgeygpID0+IEludml0YXRpb25bXX0gZ2V0Vm90ZXJJbnZpdGF0aW9uc1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gVm90ZXJGYWNldCAtIGEgZmFjZXQgdGhhdCB0aGUgRWxlY3RvcmF0ZSBzaG91bGQgaG9sZFxuICogICB0aWdodGx5LiBJdCBhbGxvd3Mgc3BlY2lmaWNhdGlvbiBvZiB0aGUgdm90ZSdzIHdlaWdodCwgc28gdGhlIEVsZWN0b3JhdGVcbiAqICAgc2hvdWxkIGRpc3RyaWJ1dGUgYW4gYXR0ZW51YXRlZCB3cmFwcGVyIHRoYXQgZG9lc24ndCBtYWtlIHRoYXQgYXZhaWxhYmxlIVxuICogQHByb3BlcnR5IHtTdWJtaXRWb3RlfSBzdWJtaXRWb3RlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBDbG9zaW5nUnVsZVxuICogQHByb3BlcnR5IHtFUmVmPFRpbWVyPn0gdGltZXJcbiAqIEBwcm9wZXJ0eSB7VGltZXN0YW1wfSBkZWFkbGluZVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIENsb3NlVm90aW5nXG4gKiBAcGFyYW0ge0Nsb3NpbmdSdWxlfSBjbG9zaW5nUnVsZVxuICogQHBhcmFtIHsoKSA9PiB2b2lkfSBjbG9zZVZvdGluZ1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQWRkUXVlc3Rpb25SZXR1cm5cbiAqIEBwcm9wZXJ0eSB7Vm90ZUNvdW50ZXJQdWJsaWNGYWNldH0gcHVibGljRmFjZXRcbiAqIEBwcm9wZXJ0eSB7Vm90ZUNvdW50ZXJDcmVhdG9yRmFjZXR9IGNyZWF0b3JGYWNldFxuICogQHByb3BlcnR5IHtYaW1wb3J0KCdAYWdvcmljL3pvZS9zcmMvem9lU2VydmljZS91dGlscy5qcycpLkluc3RhbmNlPHR5cGVvZiBYaW1wb3J0KCcuL2JpbmFyeVZvdGVDb3VudGVyLmpzJykuc3RhcnQ+fSBpbnN0YW5jZVxuICogQHByb3BlcnR5IHtUaW1lc3RhbXB9IGRlYWRsaW5lXG4gKiBAcHJvcGVydHkge0hhbmRsZTwnUXVlc3Rpb24nPn0gcXVlc3Rpb25IYW5kbGVcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBBZGRRdWVzdGlvblxuICogQHBhcmFtIHtFUmVmPEluc3RhbGxhdGlvbj59IHZvdGVDb3VudGVyXG4gKiBAcGFyYW0ge1F1ZXN0aW9uU3BlY30gcXVlc3Rpb25TcGVjXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxBZGRRdWVzdGlvblJldHVybj59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQ3JlYXRlUXVlc3Rpb25cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIgdG8gY2hhbmdlXG4gKiBAcGFyYW0ge1BhcmFtVmFsdWV9IHByb3Bvc2VkVmFsdWUgLSB0aGUgcHJvcG9zZWQgdmFsdWUgZm9yIHRoZSBuYW1lZFxuICogICBwYXJhbWV0ZXJcbiAqIEBwYXJhbSB7SW5zdGFsbGF0aW9ufSB2b3RlQ291bnRlckluc3RhbGxhdGlvbiAtIHRoZSB2b3RlQ291bnRlciB0b1xuICogICBpbnN0YW50aWF0ZSB0byBjb3VudCB2b3Rlcy4gRXhwZWN0ZWQgdG8gYmUgYSBiaW5hcnlWb3RlQ291bnRlci4gT3RoZXJcbiAqICAgdm90ZUNvdW50ZXJzIG1pZ2h0IGJlIGFkZGVkIGhlcmUsIG9yIG1pZ2h0IHJlcXVpcmUgc2VwYXJhdGUgZ292ZXJub3JzLlxuICogICB1bmRlciBtYW5hZ2VtZW50IHNvIHVzZXJzIGNhbiB0cmFjZSBpdCBiYWNrIGFuZCBzZWUgdGhhdCBpdCB3b3VsZCB1c2VcbiAqICAgdGhpcyBlbGVjdGlvbk1hbmFnZXIgdG8gbWFuYWdlIHBhcmFtZXRlcnNcbiAqIEBwYXJhbSB7SW5zdGFuY2V9IGNvbnRyYWN0SW5zdGFuY2UgLSBpbmNsdWRlIHRoZSBpbnN0YW5jZSBvZiB0aGUgY29udHJhY3RcbiAqIEBwYXJhbSB7Q2xvc2luZ1J1bGV9IGNsb3NpbmdSdWxlIC0gZGVhZGxpbmUgYW5kIHRpbWVyIGZvciBjbG9zaW5nIHZvdGluZ1xuICogQHJldHVybnMge1Byb21pc2U8UXVlc3Rpb25EZXRhaWxzPn1cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBbUD1TdGFuZGFyZFBhcmFtUGF0aF0gcGF0aCBmb3IgYSBwYXJhbU1hbmFnZXJSZXRyaWV2ZXJcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBhcmFtQ2hhbmdlSXNzdWVcbiAqIEBwcm9wZXJ0eSB7UGFyYW1DaGFuZ2VzU3BlYzxQPn0gc3BlY1xuICogQHByb3BlcnR5IHtYaW1wb3J0KCdAYWdvcmljL3pvZS9zcmMvem9lU2VydmljZS91dGlscy5qcycpLkluc3RhbmNlPCh6Y2Y6IFpDRjxHb3Zlcm5hbmNlVGVybXM8e30+PikgPT4ge30+fSBjb250cmFjdFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQXBpSW52b2NhdGlvbklzc3VlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYXBpTWV0aG9kTmFtZVxuICogQHByb3BlcnR5IHt1bmtub3duW119IG1ldGhvZEFyZ3NcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IE9mZmVyRmlsdGVySXNzdWVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IHN0cmluZ3NcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBhcmFtQ2hhbmdlUG9zaXRpb25zXG4gKiBAcHJvcGVydHkge0NoYW5nZVBhcmFtc1Bvc2l0aW9ufSBwb3NpdGl2ZVxuICogQHByb3BlcnR5IHtOb0NoYW5nZVBhcmFtc1Bvc2l0aW9ufSBuZWdhdGl2ZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUGFyYW1DaGFuZ2VJc3N1ZURldGFpbHNcbiAqICAgIGRldGFpbHMgZm9yIGEgcXVlc3Rpb24gdGhhdCBjYW4gY2hhbmdlIGEgY29udHJhY3QgcGFyYW1ldGVyXG4gKiBAcHJvcGVydHkge0Nob2ljZU1ldGhvZH0gbWV0aG9kXG4gKiBAcHJvcGVydHkge1BhcmFtQ2hhbmdlSXNzdWU8dW5rbm93bj59IGlzc3VlXG4gKiBAcHJvcGVydHkge1BhcmFtQ2hhbmdlUG9zaXRpb25zfSBwb3NpdGlvbnNcbiAqIEBwcm9wZXJ0eSB7RWxlY3Rpb25UeXBlfSBlbGVjdGlvblR5cGVcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBtYXhDaG9pY2VzXG4gKiBAcHJvcGVydHkge0Nsb3NpbmdSdWxlfSBjbG9zaW5nUnVsZVxuICogQHByb3BlcnR5IHtRdW9ydW1SdWxlfSBxdW9ydW1SdWxlXG4gKiBAcHJvcGVydHkge05vQ2hhbmdlUGFyYW1zUG9zaXRpb259IHRpZU91dGNvbWVcbiAqIEBwcm9wZXJ0eSB7SW5zdGFuY2V9IGNvdW50ZXJJbnN0YW5jZSAtIGluc3RhbmNlIG9mIHRoZSBWb3RlQ291bnRlclxuICogQHByb3BlcnR5IHtIYW5kbGU8J1F1ZXN0aW9uJz59IHF1ZXN0aW9uSGFuZGxlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7UmVjb3JkPEtleXdvcmQsIFBhcmFtVmFsdWVUeXBlZD59IFBhcmFtU3RhdGVSZWNvcmQgYSBSZWNvcmQgY29udGFpbmluZ1xuICogICBrZXl3b3JkIHBhaXJzIHdpdGggZGVzY3JpcHRpb25zIG9mIHBhcmFtZXRlcnMgdW5kZXIgZ292ZXJuYW5jZS5cbiAqL1xuXG4vKiogQHR5cGVkZWYge3tjdXJyZW50OiBQYXJhbVN0YXRlUmVjb3JkfX0gR292ZXJuYW5jZVN1YnNjcmlwdGlvblN0YXRlICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUGFyYW1NYW5hZ2VyQmFzZSBUaGUgYmFzZSBwYXJhbU1hbmFnZXIgd2l0aCB0eXBlZCBnZXR0ZXJzXG4gKiBAcHJvcGVydHkgeygpID0+IFBhcmFtU3RhdGVSZWNvcmR9IGdldFBhcmFtc1xuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nKSA9PiBBbW91bnR9IGdldEFtb3VudFxuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nKSA9PiBCcmFuZH0gZ2V0QnJhbmRcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZykgPT4gSW5zdGFuY2V9IGdldEluc3RhbmNlXG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcpID0+IEluc3RhbGxhdGlvbn0gZ2V0SW5zdGFsbGF0aW9uXG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcpID0+IEFtb3VudDwnc2V0Jz59IGdldEludml0YXRpb25BbW91bnRcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZykgPT4gYmlnaW50fSBnZXROYXRcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZykgPT4gUmF0aW99IGdldFJhdGlvXG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcpID0+IHN0cmluZ30gZ2V0U3RyaW5nXG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcpID0+IGFueX0gZ2V0VW5rbm93blxuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nLCBwcm9wb3NlZFZhbHVlOiBQYXJhbVZhbHVlKSA9PiBQYXJhbVZhbHVlfSBnZXRWaXNpYmxlVmFsdWUgLSBmb3JcbiAqICAgbW9zdCB0eXBlcywgdGhlIHZpc2libGUgdmFsdWUgaXMgdGhlIHNhbWUgYXMgcHJvcG9zZWRWYWx1ZS4gRm9yIEludml0YXRpb25zXG4gKiAgIHRoZSB2aXNpYmxlIHZhbHVlIGlzIHRoZSBhbW91bnQgb2YgdGhlIGludml0YXRpb24uXG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcpID0+IFByb21pc2U8SW52aXRhdGlvbj59IGdldEludGVybmFsUGFyYW1WYWx1ZVxuICogQHByb3BlcnR5IHsoKSA9PiBTdG9yZWRTdWJzY3JpcHRpb248R292ZXJuYW5jZVN1YnNjcmlwdGlvblN0YXRlPn0gZ2V0U3Vic2NyaXB0aW9uXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgVXBkYXRlUGFyYW1zXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsUGFyYW1WYWx1ZT59IHBhcmFtQ2hhbmdlc1xuICovXG5cbi8qKlxuICogVGhlc2UgYXJlIHR5cGVkIGBhbnlgIGJlY2F1c2UgdGhlIGJ1aWxkZXIgcGF0dGVybiBvZiBwYXJhbU1hbmFnZXIgbWFrZXMgaXQgdmVyeVxuICogY29tcGxpY2F0ZWQgZm9yIHRoZSB0eXBlIHN5c3RlbSB0byBrbm93IHRoZSBzZXQgb2YgcGFyYW0tc3BlY2lmaWMgZnVuY3Rpb25zXG4gKiByZXR1cm5lZCBieSBgLmJ1aWxkKClgLiBJbnN0ZWFkIHdlIGxldCBwYXJhbU1hbmFnZXIgY3JlYXRlIHRoZSBkZXNpcmVkIG1ldGhvZHNcbiAqIGFuZCB1c2UgdHlwZWRQYXJhbU1hbmFnZXIgdG8gY3JlYXRlIGEgdmVyc2lvbiB0aGF0IGluY2x1ZGVzIHRoZSBzdGF0aWMgdHlwZXMuXG4gKlxuICogQHR5cGVkZWYge1JlY29yZDxzdHJpbmcsIGFueT59IFBhcmFtTWFuYWdlckdldHRlcnNBbmRVcGRhdGVyc1xuICogQHR5cGVkZWYge1BhcmFtTWFuYWdlckJhc2UgJiBQYXJhbU1hbmFnZXJHZXR0ZXJzQW5kVXBkYXRlcnMgJiB7dXBkYXRlUGFyYW1zOiBVcGRhdGVQYXJhbXN9fSBBbnlQYXJhbU1hbmFnZXJcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT59IFBhcmFtZXRlck5hbWVMaXN0XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0UGFyYW1NYW5hZ2VyVHlwZVxuICogQHBhcmFtIHtQYXJhbVR5cGV9IHR5cGVcbiAqIEBwYXJhbSB7UGFyYW1WYWx1ZX0gdmFsdWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQnVpbGRQYXJhbU1hbmFnZXIgLSBQYXJhbU1hbmFnZXIgaXMgYSBmYWNpbGl0eSB0aGF0IGdvdmVybmVkXG4gKiAgIGNvbnRyYWN0cyBjYW4gdXNlIHRvIG1hbmFnZSB0aGVpciB2aXNpYmxlIHN0YXRlIGluIGEgd2F5IHRoYXQgYWxsb3dzIHRoZVxuICogICBDb250cmFjdEdvdmVybm9yIHRvIHVwZGF0ZSB2YWx1ZXMgdXNpbmcgZ292ZXJuYW5jZS4gV2hlbiBwYXJhbU1hbmFnZXIgaXNcbiAqICAgaW5zdGFudGlhdGVkIGluc2lkZSB0aGUgY29udHJhY3QsIHRoZSBjb250cmFjdCBoYXMgc3luY2hyb25vdXMgYWNjZXNzIHRvXG4gKiAgIHRoZSB2YWx1ZXMsIGFuZCBjbGllbnRzIG9mIHRoZSBjb250cmFjdCBjYW4gdmVyaWZ5IHRoYXQgYSBDb250cmFjdEdvdmVybm9yXG4gKiAgIGNhbiBjaGFuZ2UgdGhlIHZhbHVlcyBpbiBhIGxlZ2libGUgd2F5LlxuICogQHBhcmFtIHtJdGVyYWJsZTxQYXJhbVZhbHVlVHlwZWQ+fSBwYXJhbURlc2NyaXB0aW9uc1xuICogQHJldHVybnMge0FueVBhcmFtTWFuYWdlcn1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IENoYW5nZVBhcmFtc1Bvc2l0aW9uXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsUGFyYW1WYWx1ZT59IGNoYW5nZXMgb25lIG9yIG1vcmUgY2hhbmdlcyB0byBwYXJhbWV0ZXJzXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBPZmZlckZpbHRlclBvc2l0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBzdHJpbmdzXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBOb0NoYW5nZU9mZmVyRmlsdGVyUG9zaXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IGRvbnRVcGRhdGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEludm9rZUFwaVBvc2l0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYXBpTWV0aG9kTmFtZVxuICogQHByb3BlcnR5IHt1bmtub3duW119IG1ldGhvZEFyZ3NcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IERvbnRJbnZva2VBcGlQb3NpdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRvbnRJbnZva2VcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IE5vQ2hhbmdlUGFyYW1zUG9zaXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IG5vQ2hhbmdlIFBhcmFtZXRlcnMgaW4gdGhlIHByb3Bvc2FsIHRoYXQgdGhpcyBwb3NpdGlvblxuICogICBpcyBvcHBvc2VkIHRvXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBHb3Zlcm5vclxuICogQHByb3BlcnR5IHtDcmVhdGVRdWVzdGlvbn0gY3JlYXRlUXVlc3Rpb25cbiAqL1xuXG4vKiogQHR5cGVkZWYge3sgW21ldGhvZE5hbWU6IHN0cmluZ106ICguLi5hcmdzOiBhbnkpID0+IHVua25vd24gfX0gR292ZXJuZWRBcGlzICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHt7fX0gQ0ZcbiAqIEB0eXBlZGVmIHtHb3Zlcm5lZENyZWF0b3JGYWNldDxDRj4gJiB7XG4gKiBnZXRHb3Zlcm5lZEFwaXM6ICgpID0+IEVSZWY8R292ZXJuZWRBcGlzPjtcbiAqIGdldEdvdmVybmVkQXBpTmFtZXM6ICgpID0+IChzdHJpbmcgfCBzeW1ib2wpW107XG4gKiBzZXRPZmZlckZpbHRlcjogKHN0cmluZ3M6IHN0cmluZ1tdKSA9PiB2b2lkO1xuICogfX0gR292ZXJub3JGYWNldFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gR292ZXJub3JQdWJsaWNcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxJbnN0YW5jZT59IGdldEVsZWN0b3JhdGVcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gSW5zdGFuY2V9IGdldEdvdmVybmVkQ29udHJhY3RcbiAqIEBwcm9wZXJ0eSB7KHZvdGVDb3VudGVyOiBJbnN0YW5jZSkgPT4gUHJvbWlzZTxib29sZWFuPn0gdmFsaWRhdGVWb3RlQ291bnRlclxuICogQHByb3BlcnR5IHsocmVnUDogRVJlZjxJbnN0YW5jZT4pID0+IFByb21pc2U8Ym9vbGVhbj59IHZhbGlkYXRlRWxlY3RvcmF0ZVxuICogQHByb3BlcnR5IHsoY2xvc2luZ1J1bGU6IENsb3NpbmdSdWxlKSA9PiBib29sZWFufSB2YWxpZGF0ZVRpbWVyXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQYXJhbUtleSBpZGVudGlmaWVyIGZvciBhIHBhcmFtTWFuYWdlciB3aXRoaW4gYSBjb250cmFjdFxuICogQHByb3BlcnR5IHtzdHJpbmd9IGtleVxuICovXG5cbi8qKlxuICogRGVzY3JpcHRpb24gb2YgYSBzZXQgb2YgY29vcmRpbmF0ZWQgY2hhbmdlcyBmb3IgYSBQYXJhbU1hbmFnZXJcbiAqXG4gKiBAdGVtcGxhdGUgUCBwYXRoIGZvciBhIHBhcmFtTWFuYWdlclJldHJpZXZlclxuICogQHR5cGVkZWYge29iamVjdH0gUGFyYW1DaGFuZ2VzU3BlYzxQPlxuICogQHByb3BlcnR5IHtQfSBwYXJhbVBhdGhcbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgUGFyYW1WYWx1ZT59IGNoYW5nZXMgb25lIG9yIG1vcmUgY2hhbmdlcyB0byBwYXJhbWV0ZXJzXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBDb250cmFjdEdvdmVybmFuY2VWb3RlUmVzdWx0XG4gKiBAcHJvcGVydHkge0luc3RhbmNlfSBpbnN0YW5jZSAtIGluc3RhbmNlIG9mIHRoZSBWb3RlQ291bnRlclxuICogQHByb3BlcnR5IHtFUmVmPFF1ZXN0aW9uRGV0YWlscz59IGRldGFpbHNcbiAqIEBwcm9wZXJ0eSB7UHJvbWlzZTxQYXJhbVZhbHVlPn0gb3V0Y29tZU9mVXBkYXRlIC0gQSBwcm9taXNlIGZvciB0aGUgcmVzdWx0XG4gKiAgICBvZiB1cGRhdGluZyB0aGUgcGFyYW1ldGVyIHZhbHVlLiBQcmltYXJpbHkgdXNlZnVsIGZvciBpdHMgYmVoYXZpb3Igb25cbiAqICAgIHJlamVjdGlvbi5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7e319IENGXG4gKiBAdHlwZWRlZiB7Q0Z9IExpbWl0ZWRDcmVhdG9yRmFjZXRcbiAqXG4gKiBUaGUgY3JlYXRvckZhY2V0IGZvciB0aGUgZ292ZXJuZWQgY29udHJhY3QgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byB0aGVcbiAqIHJlc3BvbnNpYmxlIHBhcnR5LiBJdCBkb2VzIG5vdCBoYXZlIGFjY2VzcyB0byB0aGUgcGFyYW1NYW5hZ2VyLlxuICogQHByb3BlcnR5IHsoKSA9PiBJbnN0YW5jZX0gZ2V0Q29udHJhY3RHb3Zlcm5vclxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHt7fX0gUEYgUHVibGljIGZhY2V0IG9mIGdvdmVybmVkIGNvbnRyYWN0XG4gKiBAdGVtcGxhdGUge3t9fSBDRiBDcmVhdG9yIGZhY2V0IG9mIGdvdmVybmVkIGNvbnRyYWN0XG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBHb3Zlcm5lZENvbnRyYWN0RmFjZXRBY2Nlc3NcbiAqIEBwcm9wZXJ0eSB7Vm90ZU9uUGFyYW1DaGFuZ2VzfSB2b3RlT25QYXJhbUNoYW5nZXNcbiAqIEBwcm9wZXJ0eSB7Vm90ZU9uQXBpSW52b2NhdGlvbn0gdm90ZU9uQXBpSW52b2NhdGlvblxuICogQHByb3BlcnR5IHtWb3RlT25PZmZlckZpbHRlcn0gdm90ZU9uT2ZmZXJGaWx0ZXJcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxMaW1pdGVkQ3JlYXRvckZhY2V0PENGPj59IGdldENyZWF0b3JGYWNldCAtIGNyZWF0b3JcbiAqICAgZmFjZXQgb2YgdGhlIGdvdmVybmVkIGNvbnRyYWN0LCB3aXRob3V0IHRoZSB0aWdodGx5IGhlbGQgYWJpbGl0eSB0byBjaGFuZ2VcbiAqICAgcGFyYW0gdmFsdWVzLlxuICogQHByb3BlcnR5IHsocG9zZXJJbnZpdGF0aW9uOiBJbnZpdGF0aW9uKSA9PiBQcm9taXNlPHZvaWQ+fSByZXBsYWNlRWxlY3RvcmF0ZVxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPEFkbWluRmFjZXQ+fSBnZXRBZG1pbkZhY2V0XG4gKiBAcHJvcGVydHkgeygpID0+IEdvdmVybmVkUHVibGljRmFjZXQ8UEY+fSBnZXRQdWJsaWNGYWNldCAtIHB1YmxpYyBmYWNldCBvZiB0aGUgZ292ZXJuZWQgY29udHJhY3RcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gSW5zdGFuY2V9IGdldEluc3RhbmNlIC0gaW5zdGFuY2Ugb2YgdGhlIGdvdmVybmVkXG4gKiAgIGNvbnRyYWN0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBHb3Zlcm5lZFB1YmxpY0ZhY2V0TWV0aG9kc1xuICogQHByb3BlcnR5IHsoKSA9PiBTdG9yZWRTdWJzY3JpcHRpb248R292ZXJuYW5jZVN1YnNjcmlwdGlvblN0YXRlPn0gZ2V0U3Vic2NyaXB0aW9uXG4gKiBAcHJvcGVydHkgeygpID0+IEluc3RhbmNlfSBnZXRDb250cmFjdEdvdmVybm9yXG4gKiBAcHJvcGVydHkgeygpID0+IFBhcmFtU3RhdGVSZWNvcmR9IGdldEdvdmVybmVkUGFyYW1zIC0gZ2V0IGRlc2NyaXB0aW9ucyBvZlxuICogICBhbGwgdGhlIGdvdmVybmVkIHBhcmFtZXRlcnNcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZykgPT4gQW1vdW50fSBnZXRBbW91bnRcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZykgPT4gQnJhbmR9IGdldEJyYW5kXG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcpID0+IEluc3RhbmNlfSBnZXRJbnN0YW5jZVxuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nKSA9PiBJbnN0YWxsYXRpb259IGdldEluc3RhbGxhdGlvblxuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nKSA9PiBBbW91bnR9IGdldEludml0YXRpb25BbW91bnRcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZykgPT4gYmlnaW50fSBnZXROYXRcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZykgPT4gUmF0aW99IGdldFJhdGlvXG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcpID0+IHN0cmluZ30gZ2V0U3RyaW5nXG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcpID0+IGFueX0gZ2V0VW5rbm93blxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtvYmplY3R9IFBGIFB1YmxpYyBmYWNldFxuICogQHR5cGVkZWYge1BGICYgR292ZXJuZWRQdWJsaWNGYWNldE1ldGhvZHN9IEdvdmVybmVkUHVibGljRmFjZXRcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7e319IENGIGNyZWF0b3IgZmFjZXRcbiAqIEB0eXBlZGVmIEdvdmVybmVkQ3JlYXRvckZhY2V0XG4gKiBAcHJvcGVydHkgeygpID0+IFBhcmFtTWFuYWdlclJldHJpZXZlcn0gZ2V0UGFyYW1NZ3JSZXRyaWV2ZXIgLSBhbGxvd3MgYWNjZXNzaW5nXG4gKiAgIGFuZCB1cGRhdGluZyBnb3Zlcm5lZCBwYXJhbWV0ZXJzLiBTaG91bGQgb25seSBiZSBkaXJlY3RseSBhY2Nlc3NpYmxlIHRvIHRoZVxuICogICBjb250cmFjdEdvdmVybm9yXG4gKiBAcHJvcGVydHkgeygpID0+IExpbWl0ZWRDcmVhdG9yRmFjZXQ8Q0Y+fSBnZXRMaW1pdGVkQ3JlYXRvckZhY2V0IC0gdGhlIGNyZWF0b3JcbiAqICAgZmFjZXQgb2YgdGhlIGdvdmVybmVkIGNvbnRyYWN0LiBEb2Vzbid0IHByb3ZpZGUgYWNjZXNzIHRvIGFueSBnb3Zlcm5hbmNlXG4gKiAgIGZ1bmN0aW9uYWxpdHlcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZykgPT4gUHJvbWlzZTxJbnZpdGF0aW9uPn0gZ2V0SW52aXRhdGlvblxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFdyYXBQdWJsaWNGYWNldFxuICogQHBhcmFtIHtUfSBvcmlnaW5hbFB1YmxpY0ZhY2V0XG4gKiBAcmV0dXJucyB7VCAmIEdvdmVybmVkUHVibGljRmFjZXR9XG4gKiBAdGVtcGxhdGUgVFxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFdyYXBDcmVhdG9yRmFjZXRcbiAqIEBwYXJhbSB7VH0gb3JpZ2luYWxDcmVhdG9yRmFjZXRcbiAqIEByZXR1cm5zIHtHb3Zlcm5lZENyZWF0b3JGYWNldDxUPn1cbiAqIEB0ZW1wbGF0ZSBUXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7e2tleTogc3RyaW5nfX0gU3RhbmRhcmRQYXJhbVBhdGhcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBhcmFtTWFuYWdlclJldHJpZXZlclxuICogQHByb3BlcnR5IHsocGFyYW1LZXk/OiBQYXJhbUtleSkgPT4gQW55UGFyYW1NYW5hZ2VyfSBnZXRcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBbUD1TdGFuZGFyZFBhcmFtUGF0aF1cbiAqXG4gKiBAY2FsbGJhY2sgVm90ZU9uUGFyYW1DaGFuZ2VzXG4gKiBAcGFyYW0ge0luc3RhbGxhdGlvbn0gdm90ZUNvdW50ZXJJbnN0YWxsYXRpb25cbiAqIEBwYXJhbSB7VGltZXN0YW1wfSBkZWFkbGluZVxuICogQHBhcmFtIHtQYXJhbUNoYW5nZXNTcGVjPFA+fSBwYXJhbVNwZWNcbiAqIEByZXR1cm5zIHtDb250cmFjdEdvdmVybmFuY2VWb3RlUmVzdWx0fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFZvdGVPbkFwaUludm9jYXRpb25cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcGlNZXRob2ROYW1lXG4gKiBAcGFyYW0ge3Vua25vd25bXX0gbWV0aG9kQXJnc1xuICogQHBhcmFtIHtJbnN0YWxsYXRpb259IHZvdGVDb3VudGVySW5zdGFsbGF0aW9uXG4gKiBAcGFyYW0ge1RpbWVzdGFtcH0gZGVhZGxpbmVcbiAqIEByZXR1cm5zIHtDb250cmFjdEdvdmVybmFuY2VWb3RlUmVzdWx0fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFZvdGVPbk9mZmVyRmlsdGVyXG4gKiBAcGFyYW0ge0luc3RhbGxhdGlvbn0gdm90ZUNvdW50ZXJJbnN0YWxsYXRpb25cbiAqIEBwYXJhbSB7VGltZXN0YW1wfSBkZWFkbGluZVxuICogQHBhcmFtIHtzdHJpbmdbXX0gc3RyaW5nc1xuICogQHJldHVybnMge0NvbnRyYWN0R292ZXJuYW5jZVZvdGVSZXN1bHR9XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQYXJhbUdvdmVybm9yXG4gKiBAcHJvcGVydHkge1ZvdGVPblBhcmFtQ2hhbmdlc30gdm90ZU9uUGFyYW1DaGFuZ2VzXG4gKiBAcHJvcGVydHkge0NyZWF0ZWRRdWVzdGlvbn0gY3JlYXRlZFF1ZXN0aW9uXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBBcGlHb3Zlcm5vclxuICogQHByb3BlcnR5IHtWb3RlT25BcGlJbnZvY2F0aW9ufSB2b3RlT25BcGlJbnZvY2F0aW9uXG4gKiBAcHJvcGVydHkge0NyZWF0ZWRRdWVzdGlvbn0gY3JlYXRlZFF1ZXN0aW9uXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBGaWx0ZXJHb3Zlcm5vclxuICogQHByb3BlcnR5IHtWb3RlT25PZmZlckZpbHRlcn0gdm90ZU9uRmlsdGVyXG4gKiBAcHJvcGVydHkge0NyZWF0ZWRRdWVzdGlvbn0gY3JlYXRlZEZpbHRlclF1ZXN0aW9uXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgU2V0dXBHb3Zlcm5hbmNlXG4gKiBAcGFyYW0ge0VSZWY8Wm9lU2VydmljZT59IHpvZVxuICogQHBhcmFtIHtFUmVmPFBhcmFtTWFuYWdlclJldHJpZXZlcj59IHBhcmFtTWFuYWdlclJldHJpZXZlclxuICogQHBhcmFtIHtJbnN0YW5jZX0gY29udHJhY3RJbnN0YW5jZVxuICogQHBhcmFtIHtUaW1lclNlcnZpY2V9IHRpbWVyXG4gKiBAcGFyYW0geygpID0+IFByb21pc2U8UG9zZXJGYWNldD59IGdldFVwZGF0ZWRQb3NlckZhY2V0XG4gKiBAcmV0dXJucyB7UGFyYW1Hb3Zlcm5vcn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBDcmVhdGVkUXVlc3Rpb25cbiAqICAgV2FzIHRoaXMgcXVlc3Rpb24gY3JlYXRlZCBieSB0aGlzIENvbnRyYWN0R292ZXJub3I/XG4gKiBAcGFyYW0ge0luc3RhbmNlfSBxdWVzdGlvbkluc3RhbmNlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBQb3NpdGlvbkluY2x1ZGVkXG4gKiBAcGFyYW0ge1Bvc2l0aW9uW119IHBvc2l0aW9uc1xuICogQHBhcmFtIHtQb3NpdGlvbn0gcG9zaXRpb25cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gR292ZXJuZWRDb250cmFjdFRlcm1zXG4gKiBAcHJvcGVydHkge1RpbWVyU2VydmljZX0gdGltZXJcbiAqIEBwcm9wZXJ0eSB7SXNzdWVyS2V5d29yZFJlY29yZH0gaXNzdWVyS2V5d29yZFJlY29yZFxuICogQHByb3BlcnR5IHtvYmplY3R9IHByaXZhdGVBcmdzXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0Q29udHJhY3RHb3Zlcm5hbmNlXG4gKlxuICogQHBhcmFtIHtFUmVmPFpvZVNlcnZpY2U+fSB6b2VcbiAqIEBwYXJhbSB7WGltcG9ydCgnQGFnb3JpYy96b2Uvc3JjL3pvZVNlcnZpY2UvdXRpbHMuanMnKS5JbnN0YW5jZTwoemNmOiBaQ0Y8R292ZXJuYW5jZVRlcm1zPHt9Pj4pID0+IHt9Pn0gYWxsZWdlZEdvdmVybmVkXG4gKiBAcGFyYW0ge0luc3RhbmNlfSBhbGxlZ2VkR292ZXJub3JcbiAqIEBwYXJhbSB7SW5zdGFsbGF0aW9uPFhpbXBvcnQoJ0BhZ29yaWMvZ292ZXJuYW5jZS9zcmMvY29udHJhY3RHb3Zlcm5vcicpLnN0YXJ0Pn0gY29udHJhY3RHb3Zlcm5vckluc3RhbGxhdGlvblxuICogQHJldHVybnMge1Byb21pc2U8R292ZXJuYW5jZVBhaXI+fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydENvbnRyYWN0RWxlY3RvcmF0ZSAtIGFzc2VydCB0aGF0IHRoZSBjb250cmFjdCB1c2VzIHRoZVxuICogICBlbGVjdG9yYXRlXG4gKlxuICogQHBhcmFtIHtFUmVmPFpvZVNlcnZpY2U+fSB6b2VcbiAqIEBwYXJhbSB7SW5zdGFuY2V9IGFsbGVnZWRHb3Zlcm5vclxuICogQHBhcmFtIHtJbnN0YW5jZX0gYWxsZWdlZEVsZWN0b3JhdGVcbiAqL1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAO61XYMhIAADISAAA6AAAAQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xL3NyYy9lY29uQ29tbWl0dGVlQ2hhcnRlci5qc3siaW1wb3J0cyI6WyJAYWdvcmljL2dvdmVybmFuY2UvZXhwb3J0ZWQuanMiLCJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy9zd2luZ3NldC12YXQvc3JjL3ZhdHMvdGltZXIvdHlwZUd1YXJkcy5qcyIsIkBhZ29yaWMvem9lL2V4cG9ydGVkLmpzIiwiQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0cy9leHBvcnRlZC5qcyIsIkBhZ29yaWMvem9lL3NyYy90eXBlR3VhcmRzLmpzIiwiQGVuZG8vZmFyIl0sImV4cG9ydHMiOlsiSU5WSVRBVElPTl9NQUtFUlNfREVTQyIsInN0YXJ0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IG1ha2VTY2FsYXJNYXBTdG9yZSxNLG1ha2VIZWFwRmFySW5zdGFuY2UsZml0LEluc3RhbmNlSGFuZGxlU2hhcGUsVGltZXN0YW1wU2hhcGUsRTskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2dvdmVybmFuY2UvZXhwb3J0ZWQuanNcIiwgW11dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIm1ha2VTY2FsYXJNYXBTdG9yZVwiLCBbJGjigI1fYSA9PiAobWFrZVNjYWxhck1hcFN0b3JlID0gJGjigI1fYSldXSxbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXSxbXCJtYWtlSGVhcEZhckluc3RhbmNlXCIsIFskaOKAjV9hID0+IChtYWtlSGVhcEZhckluc3RhbmNlID0gJGjigI1fYSldXSxbXCJmaXRcIiwgWyRo4oCNX2EgPT4gKGZpdCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3pvZS9leHBvcnRlZC5qc1wiLCBbXV0sW1wiQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0cy9leHBvcnRlZC5qc1wiLCBbXV0sW1wiQGFnb3JpYy96b2Uvc3JjL3R5cGVHdWFyZHMuanNcIiwgW1tcIkluc3RhbmNlSGFuZGxlU2hhcGVcIiwgWyRo4oCNX2EgPT4gKEluc3RhbmNlSGFuZGxlU2hhcGUgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zd2luZ3NldC12YXQvc3JjL3ZhdHMvdGltZXIvdHlwZUd1YXJkcy5qc1wiLCBbW1wiVGltZXN0YW1wU2hhcGVcIiwgWyRo4oCNX2EgPT4gKFRpbWVzdGFtcFNoYXBlID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBmaWxlXG4gKlxuICogVGhpcyBjb250cmFjdCBtYWtlcyBpdCBwb3NzaWJsZSBmb3IgdGhvc2Ugd2hvIGdvdmVybiBjb250cmFjdHMgdG8gY2FsbCBmb3JcbiAqIHZvdGVzIG9uIGNoYW5nZXMuIEEgbW9yZSBjb21wbGV0ZSBpbXBsZW1lbnRhdGlvbiB3b3VsZCB2YWxpZGF0ZSBwYXJhbWV0ZXJzLFxuICogY29uc3RyYWluIGRlYWRsaW5lcyBhbmQgcG9zc2libHkgc3BsaXQgdGhlIGFiaWxpdHkgdG8gY2FsbCBmb3Igdm90ZXMgaW50b1xuICogc2VwYXJhdGUgY2FwYWJpbGl0aWVzIGZvciBmaW5lciBncmFpbiBlbmNhcHN1bGF0aW9uLlxuICovXG5cbmNvbnN0ICAgICAgICBJTlZJVEFUSU9OX01BS0VSU19ERVNDPSdjaGFydGVyIG1lbWJlciBpbnZpdGF0aW9uJztcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQYXJhbUNoYW5nZXNPZmZlckFyZ3NcbiAqIEBwcm9wZXJ0eSB7YmlnaW50fSBkZWFkbGluZVxuICogQHByb3BlcnR5IHtJbnN0YW5jZX0gaW5zdGFuY2VcbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59IHBhcmFtc1xuICogQHByb3BlcnR5IHt7cGFyYW1QYXRoOiB7IGtleTogc3RyaW5nIH19fSBbcGF0aF1cbiAqLyRo4oCNX29uY2UuSU5WSVRBVElPTl9NQUtFUlNfREVTQyhJTlZJVEFUSU9OX01BS0VSU19ERVNDKTtcbmNvbnN0IFBhcmFtQ2hhbmdlc09mZmVyQXJnc1NoYXBlPWhhcmRlbihcbk0uc3BsaXQoXG57XG5kZWFkbGluZTpUaW1lc3RhbXBTaGFwZSxcbmluc3RhbmNlOkluc3RhbmNlSGFuZGxlU2hhcGUsXG5wYXJhbXM6TS5yZWNvcmRPZihNLnN0cmluZygpLE0uYW55KCkpfSxcblxuTS5wYXJ0aWFsKHtcbnBhdGg6e3BhcmFtUGF0aDp7a2V5Ok0uYW55KCl9fX0pKSk7XG5cblxuXG5cbi8qKlxuICogQHBhcmFtIHtaQ0Y8e2JpbmFyeVZvdGVDb3VudGVySW5zdGFsbGF0aW9uOkluc3RhbGxhdGlvbn0+fSB6Y2ZcbiAqL1xuY29uc3QgICAgICAgIHN0YXJ0PWFzeW5jKHpjZik9PntcbmNvbnN0e2JpbmFyeVZvdGVDb3VudGVySW5zdGFsbGF0aW9uOmNvdW50ZXJ9PXpjZi5nZXRUZXJtcygpO1xuLyoqIEB0eXBlIHtNYXBTdG9yZTxJbnN0YW5jZSxHb3Zlcm5lZENvbnRyYWN0RmFjZXRBY2Nlc3M8e30se30+Pn0gKi9cbmNvbnN0IGluc3RhbmNlVG9Hb3Zlcm5vcj1tYWtlU2NhbGFyTWFwU3RvcmUoKTtcblxuY29uc3QgbWFrZVBhcmFtSW52aXRhdGlvbj0oKT0+e1xuLyoqXG4gKiBAcGFyYW0ge1pDRlNlYXR9IHNlYXRcbiAqIEBwYXJhbSB7UGFyYW1DaGFuZ2VzT2ZmZXJBcmdzfSBhcmdzXG4gKi9cbmNvbnN0IHZvdGVPblBhcmFtQ2hhbmdlcz0oc2VhdCxhcmdzKT0+e1xuZml0KGFyZ3MsUGFyYW1DaGFuZ2VzT2ZmZXJBcmdzU2hhcGUpO1xuc2VhdC5leGl0KCk7XG5cbmNvbnN0e1xucGFyYW1zLFxuaW5zdGFuY2UsXG5kZWFkbGluZSxcbnBhdGg9e3BhcmFtUGF0aDp7a2V5Oidnb3Zlcm5lZEFwaSd9fX09XG5hcmdzO1xuY29uc3QgZ292ZXJub3I9aW5zdGFuY2VUb0dvdmVybm9yLmdldChpbnN0YW5jZSk7XG5yZXR1cm4gRShnb3Zlcm5vcikudm90ZU9uUGFyYW1DaGFuZ2VzKGNvdW50ZXIsZGVhZGxpbmUse1xuLi4ucGF0aCxcbmNoYW5nZXM6cGFyYW1zfSk7XG5cbiB9O1xuXG5yZXR1cm4gemNmLm1ha2VJbnZpdGF0aW9uKHZvdGVPblBhcmFtQ2hhbmdlcywndm90ZSBvbiBwYXJhbSBjaGFuZ2VzJyk7XG4gfTtcblxuY29uc3QgbWFrZU9mZmVyRmlsdGVySW52aXRhdGlvbj0oaW5zdGFuY2Usc3RyaW5ncyxkZWFkbGluZSk9PntcbmNvbnN0IHZvdGVPbk9mZmVyRmlsdGVySGFuZGxlcj0oc2VhdCk9PntcbnNlYXQuZXhpdCgpO1xuXG5jb25zdCBnb3Zlcm5vcj1pbnN0YW5jZVRvR292ZXJub3IuZ2V0KGluc3RhbmNlKTtcbnJldHVybiBFKGdvdmVybm9yKS52b3RlT25PZmZlckZpbHRlcihjb3VudGVyLGRlYWRsaW5lLHN0cmluZ3MpO1xuIH07XG5cbnJldHVybiB6Y2YubWFrZUludml0YXRpb24odm90ZU9uT2ZmZXJGaWx0ZXJIYW5kbGVyLCd2b3RlIG9uIG9mZmVyIGZpbHRlcicpO1xuIH07XG5cbmNvbnN0IE1ha2VyST1NLmludGVyZmFjZSgnQ2hhcnRlciBJbnZpdGF0aW9uTWFrZXJzJyx7XG5Wb3RlT25QYXJhbUNoYW5nZTpNLmNhbGwoKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcblZvdGVPblBhdXNlT2ZmZXJzOk0uY2FsbChcbkluc3RhbmNlSGFuZGxlU2hhcGUsXG5NLmFycmF5T2YoTS5zdHJpbmcoKSksXG5UaW1lc3RhbXBTaGFwZSkuXG5yZXR1cm5zKE0ucHJvbWlzZSgpKX0pO1xuXG5jb25zdCBpbnZpdGF0aW9uTWFrZXJzPW1ha2VIZWFwRmFySW5zdGFuY2UoXG4nQ2hhcnRlciBJbnZpdGF0aW9uIE1ha2VycycsXG5NYWtlckksXG57XG5Wb3RlT25QYXJhbUNoYW5nZTptYWtlUGFyYW1JbnZpdGF0aW9uLFxuVm90ZU9uUGF1c2VPZmZlcnM6bWFrZU9mZmVyRmlsdGVySW52aXRhdGlvbn0pO1xuXG5cblxuY29uc3QgY2hhcnRlck1lbWJlckhhbmRsZXI9KHNlYXQpPT57XG5zZWF0LmV4aXQoKTtcbnJldHVybiBoYXJkZW4oe2ludml0YXRpb25NYWtlcnN9KTtcbiB9O1xuXG5jb25zdCBjaGFydGVyQ3JlYXRvckk9TS5pbnRlcmZhY2UoJ0NoYXJ0ZXIgY3JlYXRvckZhY2V0Jyx7XG5hZGRJbnN0YW5jZTpNLmNhbGwoSW5zdGFuY2VIYW5kbGVTaGFwZSxNLmFueSgpKS5cbm9wdGlvbmFsKE0uc3RyaW5nKCkpLlxucmV0dXJucygpLFxubWFrZUNoYXJ0ZXJNZW1iZXJJbnZpdGF0aW9uOk0uY2FsbCgpLnJldHVybnMoTS5wcm9taXNlKCkpfSk7XG5cblxuY29uc3QgY3JlYXRvckZhY2V0PW1ha2VIZWFwRmFySW5zdGFuY2UoXG4nQ2hhcnRlciBjcmVhdG9yRmFjZXQnLFxuY2hhcnRlckNyZWF0b3JJLFxue1xuLyoqXG4gKiBAcGFyYW0ge0luc3RhbmNlfSBnb3Zlcm5lZEluc3RhbmNlXG4gKiBAcGFyYW0ge0dvdmVybmVkQ29udHJhY3RGYWNldEFjY2Vzczx7fSx7fT59IGdvdmVybm9yRmFjZXRcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbGFiZWxdIGZvciBkaWFnbm9zdGljIHVzZSBvbmx5XG4gKi9cbmFkZEluc3RhbmNlOihnb3Zlcm5lZEluc3RhbmNlLGdvdmVybm9yRmFjZXQsbGFiZWwpPT57XG5jb25zb2xlLmxvZygnY2hhcnRlcjogYWRkaW5nIGluc3RhbmNlJyxsYWJlbCk7XG5pbnN0YW5jZVRvR292ZXJub3IuaW5pdChnb3Zlcm5lZEluc3RhbmNlLGdvdmVybm9yRmFjZXQpO1xuIH0sXG5tYWtlQ2hhcnRlck1lbWJlckludml0YXRpb246KCk9PlxuemNmLm1ha2VJbnZpdGF0aW9uKGNoYXJ0ZXJNZW1iZXJIYW5kbGVyLElOVklUQVRJT05fTUFLRVJTX0RFU0MpfSk7XG5cblxuXG5yZXR1cm4gaGFyZGVuKHtjcmVhdG9yRmFjZXR9KTtcbiB9OyRo4oCNX29uY2Uuc3RhcnQoc3RhcnQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IklOVklUQVRJT05fTUFLRVJTX0RFU0MiOlsiSU5WSVRBVElPTl9NQUtFUlNfREVTQyJdLCJzdGFydCI6WyJzdGFydCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA2Z8jheAQAAHgEAAAlAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4yLjEvc3JjL2NvbmZpZy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiQnJpZGdlSWQiLCJXYWxsZXROYW1lIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQHRzLWNoZWNrKi9cbi8qKiBAZmlsZVxuICpcbiAqIFNvbWUgb2YgdGhpcyBjb25maWcgaW5mbyBtYXkgbWFrZSBtb3JlIHNlbnNlIGluIGEgcGFydGljdWxhciBwYWNrYWdlLiBIb3dldmVyXG4gKiBkdWUgdG8gaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80NjIwIGFuZCBvdXIgbGF4IHBhY2thZ2VcbiAqIGRlcGVuZGVuY3kgZ3JhcGgsIHNvbWV0aW1lcyByYXRpb25hbCBwbGFjZW1lbnRzIGNhdXNlIHR5cGUgcmVzb2x1dGlvbiBlcnJvcnMuXG4gKlxuICogU28gYXMgYSB3b3JrLWFyb3VuZCBzb21lIGNvbnN0YW50cyB0aGF0IG5lZWQgYWNjZXNzIGZyb20gbW9yZSB0aGFuIG9uZSBwYWNrYWdlIGFyZSBwbGFjZWQgaGVyZS5cbiAqL1xuXG4vKipcbiAqIEV2ZW50IHNvdXJjZSBpZHMgdXNlZCBieSB0aGUgYnJpZGdlIGRldmljZS5cbiAqL1xuY29uc3QgICAgICAgIEJyaWRnZUlkPXtcbkJBTks6J2JhbmsnLFxuQ09SRTonY29yZScsXG5ESUJDOidkaWJjJyxcblNUT1JBR0U6J3N0b3JhZ2UnLFxuUFJPVklTSU9OOidwcm92aXNpb24nLFxuUFJPVklTSU9OX1NNQVJUX1dBTExFVDoncHJvdmlzaW9uV2FsbGV0JyxcbldBTExFVDond2FsbGV0J307JGjigI1fb25jZS5CcmlkZ2VJZChCcmlkZ2VJZCk7XG5cbmhhcmRlbihCcmlkZ2VJZCk7XG5cbmNvbnN0ICAgICAgICBXYWxsZXROYW1lPXtcbmRlcG9zaXRGYWNldDonZGVwb3NpdEZhY2V0J307JGjigI1fb25jZS5XYWxsZXROYW1lKFdhbGxldE5hbWUpO1xuXG5oYXJkZW4oV2FsbGV0TmFtZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQnJpZGdlSWQiOlsiQnJpZGdlSWQiXSwiV2FsbGV0TmFtZSI6WyJXYWxsZXROYW1lIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAK/0Jsh9AQAAfQEAACQAAABAYWdvcmljL2ludGVybmFsLXYwLjIuMS9zcmMvaW5kZXguanN7ImltcG9ydHMiOlsiLi9jb25maWcuanMiLCIuL3V0aWxzLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9jb25maWcuanMiLCIuL3V0aWxzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi91dGlscy5qc1wiLCBbXV0sW1wiLi9jb25maWcuanNcIiwgW11dXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGM+OswjNwAAIzcAACQAAABAYWdvcmljL2ludGVybmFsLXYwLjIuMS9zcmMvdXRpbHMuanN7ImltcG9ydHMiOlsiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL21hcnNoYWwiLCJAZW5kby9wcm9taXNlLWtpdCJdLCJleHBvcnRzIjpbIlByb21pc2VBbGxPckVycm9ycyIsImFnZ3JlZ2F0ZVRyeUZpbmFsbHkiLCJhcHBseUxhYmVsaW5nRXJyb3IiLCJhc3NlcnRBbGxEZWZpbmVkIiwiYmluZEFsbE1ldGhvZHMiLCJkZWVwbHlGdWxmaWxsZWRPYmplY3QiLCJmcm9tVW5pcXVlRW50cmllcyIsImZzU3RyZWFtUmVhZHkiLCJnZXRNZXRob2ROYW1lcyIsImxpc3REaWZmZXJlbmNlIiwibWFrZUFnZ3JlZ2F0ZUVycm9yIiwibWFrZU1lYXN1cmVTZWNvbmRzIiwib2JqZWN0TWFwIiwidGhyb3dMYWJlbGVkIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEUsZGVlcGx5RnVsZmlsbGVkLGlzT2JqZWN0LGlzUHJvbWlzZTskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcImRlZXBseUZ1bGZpbGxlZFwiLCBbJGjigI1fYSA9PiAoZGVlcGx5RnVsZmlsbGVkID0gJGjigI1fYSldXSxbXCJpc09iamVjdFwiLCBbJGjigI1fYSA9PiAoaXNPYmplY3QgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcImlzUHJvbWlzZVwiLCBbJGjigI1fYSA9PiAoaXNQcm9taXNlID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vbWFyc2hhbC9zcmMvdHlwZXMnKS5SZW1vdGFibGV9IFJlbW90YWJsZSAqL1xuXG5jb25zdHtcbmdldFByb3RvdHlwZU9mLFxuY3JlYXRlLFxuZW50cmllcyxcbmZyb21FbnRyaWVzLFxuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yc309XG5PYmplY3Q7XG5jb25zdHtvd25LZXlzLGFwcGx5fT1SZWZsZWN0O1xuXG5jb25zdHtkZXRhaWxzOlgscXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5cbi8qKlxuICogVGhyb3dzIGlmIG11bHRpcGxlIGVudHJpZXMgdXNlIHRoZSBzYW1lIHByb3BlcnR5IG5hbWUuIE90aGVyd2lzZSBhY3RzXG4gKiBsaWtlIGBPYmplY3QuZnJvbUVudHJpZXNgIGJ1dCBoYXJkZW5zIHRoZSByZXN1bHQuXG4gKiBVc2UgaXQgdG8gcHJvdGVjdCBmcm9tIHByb3BlcnR5IG5hbWVzIGNvbXB1dGVkIGZyb20gdXNlci1wcm92aWRlZCBkYXRhLlxuICpcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEBwYXJhbSB7SXRlcmFibGU8W0ssVl0+fSBhbGxFbnRyaWVzXG4gKiBAcmV0dXJucyB7e1trOiBLXTogVn19XG4gKi9cbmNvbnN0ICAgICAgICBmcm9tVW5pcXVlRW50cmllcz0oYWxsRW50cmllcyk9PntcbmNvbnN0IGVudHJpZXNBcnJheT1bLi4uYWxsRW50cmllc107XG5jb25zdCByZXN1bHQ9aGFyZGVuKGZyb21FbnRyaWVzKGVudHJpZXNBcnJheSkpO1xuaWYob3duS2V5cyhyZXN1bHQpLmxlbmd0aD09PWVudHJpZXNBcnJheS5sZW5ndGgpe1xucmV0dXJuIHJlc3VsdDtcbiB9XG5jb25zdCBuYW1lcz1uZXcgU2V0KCk7XG5mb3IoY29uc3RbbmFtZSxfXW9mIGVudHJpZXNBcnJheSl7XG5pZihuYW1lcy5oYXMobmFtZSkpe1xuRmFpbCBgY29sbGlzaW9uIG9uIHByb3BlcnR5IG5hbWUgJHtxKG5hbWUpfTogJHtlbnRyaWVzQXJyYXl9YDtcbiB9XG5uYW1lcy5hZGQobmFtZSk7XG4gfVxudGhyb3cgRmFpbCBgaW50ZXJuYWw6IGZhaWxlZCB0byBjcmVhdGUgb2JqZWN0IGZyb20gdW5pcXVlIGVudHJpZXNgO1xuIH07JGjigI1fb25jZS5mcm9tVW5pcXVlRW50cmllcyhmcm9tVW5pcXVlRW50cmllcyk7XG5oYXJkZW4oZnJvbVVuaXF1ZUVudHJpZXMpO1xuXG4vKipcbiAqIEJ5IGFuYWxvZ3kgd2l0aCBob3cgYEFycmF5LnByb3RvdHlwZS5tYXBgIHdpbGwgbWFwIHRoZSBlbGVtZW50cyBvZlxuICogYW4gYXJyYXkgdG8gdHJhbnNmb3JtZWQgZWxlbWVudHMgb2YgYW4gYXJyYXkgb2YgdGhlIHNhbWUgc2hhcGUsXG4gKiBgb2JqZWN0TWFwYCB3aWxsIGRvIGxpa2V3aXNlIGZvciB0aGUgc3RyaW5nLW5hbWVkIG93biBlbnVtZXJhYmxlXG4gKiBwcm9wZXJ0aWVzIG9mIGFuIG9iamVjdC5cbiAqXG4gKiBUeXBpY2FsIHVzYWdlIGFwcGxpZXMgYG9iamVjdE1hcGAgdG8gYSBDb3B5UmVjb3JkLCBpLmUuLFxuICogYW4gb2JqZWN0IGZvciB3aGljaCBgcGFzc1N0eWxlT2Yob3JpZ2luYWwpID09PSAnY29weVJlY29yZCdgLiBGb3IgdGhlc2UsXG4gKiBub25lIG9mIHRoZSBmb2xsb3dpbmcgZWRnZSBjYXNlcyBhcmlzZS4gVGhlIHJlc3VsdCB3aWxsIGJlIGEgQ29weVJlY29yZFxuICogd2l0aCBleGFjdGx5IHRoZSBzYW1lIHByb3BlcnR5IG5hbWVzLCB3aG9zZSB2YWx1ZXMgYXJlIHRoZSBtYXBwZWQgZm9ybSBvZlxuICogdGhlIG9yaWdpbmFsJ3MgdmFsdWVzLlxuICpcbiAqIFdoZW4gdGhlIG9yaWdpbmFsIGlzIG5vdCBhIENvcHlSZWNvcmQsIHNvbWUgZWRnZSBjYXNlcyB0byBiZSBhd2FyZSBvZlxuICogICAgKiBObyBtYXR0ZXIgaG93IG11dGFibGUgdGhlIG9yaWdpbmFsIG9iamVjdCwgdGhlIHJldHVybmVkIG9iamVjdCBpc1xuICogICAgICBoYXJkZW5lZC5cbiAqICAgICogT25seSB0aGUgc3RyaW5nLW5hbWVkIGVudW1lcmFibGUgb3duIHByb3BlcnRpZXMgb2YgdGhlIG9yaWdpbmFsXG4gKiAgICAgIGFyZSBtYXBwZWQuIEFsbCBvdGhlciBwcm9wZXJ0aWVzIGFyZSBpZ25vcmVkLlxuICogICAgKiBJZiBhbnkgb2YgdGhlIG9yaWdpbmFsIHByb3BlcnRpZXMgd2VyZSBhY2Nlc3NvcnMsIGBPYmplY3QuZW50cmllc2BcbiAqICAgICAgd2lsbCBjYXVzZSBpdHMgYGdldHRlcmAgdG8gYmUgY2FsbGVkIGFuZCB3aWxsIHVzZSB0aGUgcmVzdWx0aW5nXG4gKiAgICAgIHZhbHVlLlxuICogICAgKiBObyBtYXR0ZXIgd2hldGhlciB0aGUgb3JpZ2luYWwgcHJvcGVydHkgd2FzIGFuIGFjY2Vzc29yLCB3cml0YWJsZSxcbiAqICAgICAgb3IgY29uZmlndXJhYmxlLCBhbGwgdGhlIHByb3BlcnRpZXMgb2YgdGhlIHJldHVybmVkIG9iamVjdCB3aWxsIGJlXG4gKiAgICAgIG5vbi13cml0YWJsZSwgbm9uLWNvbmZpZ3VyYWJsZSwgZGF0YSBwcm9wZXJ0aWVzLlxuICogICAgKiBObyBtYXR0ZXIgd2hhdCB0aGUgb3JpZ2luYWwgb2JqZWN0IG1heSBoYXZlIGluaGVyaXRlZCBmcm9tLCBhbmRcbiAqICAgICAgbm8gbWF0dGVyIHdoZXRoZXIgaXQgd2FzIGEgc3BlY2lhbCBraW5kIG9mIG9iamVjdCBzdWNoIGFzIGFuIGFycmF5LFxuICogICAgICB0aGUgcmV0dXJuZWQgb2JqZWN0IHdpbGwgYWx3YXlzIGJlIGEgcGxhaW4gb2JqZWN0IGluaGVyaXRpbmcgZGlyZWN0bHlcbiAqICAgICAgZnJvbSBgT2JqZWN0LnByb3RvdHlwZWAgYW5kIHdob3NlIHN0YXRlIGlzIG9ubHkgdGhlc2UgbmV3IG1hcHBlZFxuICogICAgICBvd24gcHJvcGVydGllcy5cbiAqXG4gKiBXaXRoIHRoZXNlIGRpZmZlcmVuY2VzLCBldmVuIGlmIHRoZSBvcmlnaW5hbCBvYmplY3Qgd2FzIG5vdCBhIENvcHlSZWNvcmQsXG4gKiBpZiBhbGwgdGhlIG1hcHBlZCB2YWx1ZXMgYXJlIFBhc3NhYmxlLCB0aGVuIHRoZSByZXR1cm5lZCBvYmplY3Qgd2lsbCBiZVxuICogYSBDb3B5UmVjb3JkLlxuICpcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gT1xuICogQHBhcmFtIHtPfSBvcmlnaW5hbFxuICogQHRlbXBsYXRlIFIgbWFwIHJlc3VsdFxuICogQHBhcmFtIHsodmFsdWU6IE9ba2V5b2YgT10sIGtleToga2V5b2YgTykgPT4gUn0gbWFwRm5cbiAqIEByZXR1cm5zIHt7IFtQIGluIGtleW9mIE9dOiBSfX1cbiAqL1xuY29uc3QgICAgICAgIG9iamVjdE1hcD0ob3JpZ2luYWwsbWFwRm4pPT57XG5jb25zdCBlbnRzPWVudHJpZXMob3JpZ2luYWwpO1xuY29uc3QgbWFwRW50cz1lbnRzLm1hcCgoW2ssdl0pPT5bayxtYXBGbih2LGspXSk7XG5yZXR1cm4gaGFyZGVuKGZyb21FbnRyaWVzKG1hcEVudHMpKTtcbiB9OyRo4oCNX29uY2Uub2JqZWN0TWFwKG9iamVjdE1hcCk7XG5oYXJkZW4ob2JqZWN0TWFwKTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHtBcnJheTxzdHJpbmcgfCBzeW1ib2w+fSBsZWZ0TmFtZXNcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nIHwgc3ltYm9sPn0gcmlnaHROYW1lc1xuICovXG5jb25zdCAgICAgICAgbGlzdERpZmZlcmVuY2U9KGxlZnROYW1lcyxyaWdodE5hbWVzKT0+e1xuY29uc3QgcmlnaHRTZXQ9bmV3IFNldChyaWdodE5hbWVzKTtcbnJldHVybiBsZWZ0TmFtZXMuZmlsdGVyKChuYW1lKT0+IXJpZ2h0U2V0LmhhcyhuYW1lKSk7XG4gfTskaOKAjV9vbmNlLmxpc3REaWZmZXJlbmNlKGxpc3REaWZmZXJlbmNlKTtcbmhhcmRlbihsaXN0RGlmZmVyZW5jZSk7XG5cbi8qKlxuICogQHBhcmFtIHtFcnJvcn0gaW5uZXJFcnJcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gbGFiZWxcbiAqIEBwYXJhbSB7RXJyb3JDb25zdHJ1Y3Rvcj19IEVycm9yQ29uc3RydWN0b3JcbiAqIEByZXR1cm5zIHtuZXZlcn1cbiAqL1xuY29uc3QgICAgICAgIHRocm93TGFiZWxlZD0oaW5uZXJFcnIsbGFiZWwsRXJyb3JDb25zdHJ1Y3Rvcj11bmRlZmluZWQpPT57XG5pZih0eXBlb2YgbGFiZWw9PT0nbnVtYmVyJyl7XG5sYWJlbD0gYFske2xhYmVsfV1gO1xuIH1cbmNvbnN0IG91dGVyRXJyPWFzc2VydC5lcnJvcihcbiBgJHtsYWJlbH06ICR7aW5uZXJFcnIubWVzc2FnZX1gLFxuRXJyb3JDb25zdHJ1Y3Rvcik7XG5cbmFzc2VydC5ub3RlKG91dGVyRXJyLFggYENhdXNlZCBieSAke2lubmVyRXJyfWApO1xudGhyb3cgb3V0ZXJFcnI7XG4gfTskaOKAjV9vbmNlLnRocm93TGFiZWxlZCh0aHJvd0xhYmVsZWQpO1xuaGFyZGVuKHRocm93TGFiZWxlZCk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEEsUlxuICogQHBhcmFtIHsoLi4uYXJnczogQVtdKSA9PiBSfSBmdW5jXG4gKiBAcGFyYW0ge0FbXX0gYXJnc1xuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBbbGFiZWxdXG4gKiBAcmV0dXJucyB7Un1cbiAqL1xuY29uc3QgICAgICAgIGFwcGx5TGFiZWxpbmdFcnJvcj0oZnVuYyxhcmdzLGxhYmVsPXVuZGVmaW5lZCk9PntcbmlmKGxhYmVsPT09dW5kZWZpbmVkKXtcbnJldHVybiBmdW5jKC4uLmFyZ3MpO1xuIH1cbmxldCByZXN1bHQ7XG50cnl7XG5yZXN1bHQ9ZnVuYyguLi5hcmdzKTtcbiB9Y2F0Y2goZXJyKXtcbnRocm93TGFiZWxlZChlcnIsbGFiZWwpO1xuIH1cbmlmKGlzUHJvbWlzZShyZXN1bHQpKXtcbi8qIEB0cy1leHBlY3QtZXJyb3IgSWYgcmVzdWx0IGlzIGEgcmVqZWN0ZWQgcHJvbWlzZSwgdGhpcyB3aWxsKi9cbi8qIHJldHVybiBhIHByb21pc2Ugd2l0aCBhIGRpZmZlcmVudCByZWplY3Rpb24gcmVhc29uLiBCdXQgdGhpcyovXG4vKiBjb25mdXNlcyBUeXBlU2NyaXB0IGJlY2F1c2UgaXQgdHlwZXMgdGhhdCBjYXNlIGFzIGBQcm9taXNlPG5ldmVyPmAqL1xuLyogd2hpY2ggaXMgY29vbCBmb3IgYSBwcm9taXNlIHRoYXQgd2lsbCBuZXZlciBmdWxmbGwuKi9cbi8qIEJ1dCBUeXBlU2NyaXB0IGRvZXNuJ3QgdW5kZXJzdGFuZCB0aGF0IHRoaXMgd2lsbCBvbmx5IGhhcHBlbiovXG4vKiB3aGVuIGByZXN1bHRgIHdhcyBhIHJlamVjdGVkIHByb21pc2UuIEluIG9ubHkgdGhpcyBjYXNlIGBSYCovXG4vKiBzaG91bGQgYWxyZWFkeSBhbGxvdyBgUHJvbWlzZTxuZXZlcj5gIGFzIGEgc3VidHlwZS4qL1xucmV0dXJuIEUud2hlbihyZXN1bHQsdW5kZWZpbmVkLChyZWFzb24pPT50aHJvd0xhYmVsZWQocmVhc29uLGxhYmVsKSk7XG4gfWVsc2V7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbiB9OyRo4oCNX29uY2UuYXBwbHlMYWJlbGluZ0Vycm9yKGFwcGx5TGFiZWxpbmdFcnJvcik7XG5oYXJkZW4oYXBwbHlMYWJlbGluZ0Vycm9yKTtcblxuLyoqXG4gKiBQcmlvcml0aXplIHN5bWJvbHMgYXMgZWFybGllciB0aGFuIHN0cmluZ3MuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8c3ltYm9sfSBhXG4gKiBAcGFyYW0ge3N0cmluZ3xzeW1ib2x9IGJcbiAqIEByZXR1cm5zIHstMSB8IDAgfCAxfVxuICovXG5jb25zdCBjb21wYXJlU3RyaW5naWZpZWQ9KGEsYik9PntcbmlmKHR5cGVvZiBhPT09dHlwZW9mIGIpe1xuY29uc3QgbGVmdD1TdHJpbmcoYSk7XG5jb25zdCByaWdodD1TdHJpbmcoYik7XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmVzdGVkLXRlcm5hcnkqL1xucmV0dXJuIGxlZnQ8cmlnaHQ/LTE6bGVmdD5yaWdodD8xOjA7XG4gfVxuaWYodHlwZW9mIGE9PT0nc3ltYm9sJyl7XG5hc3NlcnQodHlwZW9mIGI9PT0nc3RyaW5nJyk7XG5yZXR1cm4tMTtcbiB9XG5hc3NlcnQodHlwZW9mIGE9PT0nc3RyaW5nJyk7XG5hc3NlcnQodHlwZW9mIGI9PT0nc3ltYm9sJyk7XG5yZXR1cm4gMTtcbiB9O1xuXG4vKipcbiAqIFRPRE8gQ29uc29saWRhdGUgd2l0aCB0aGUgYGdldE1ldGhvZE5hbWVzYCBpbiBgQGVuZG8vZXZlbnR1YWwtc2VuZGBcbiAqXG4gKiBAcGFyYW0ge2FueX0gdmFsXG4gKiBAcmV0dXJucyB7KHN0cmluZ3xzeW1ib2wpW119XG4gKi9cbmNvbnN0ICAgICAgICBnZXRNZXRob2ROYW1lcz0odmFsKT0+e1xubGV0IGxheWVyPXZhbDtcbmNvbnN0IG5hbWVzPW5ldyBTZXQoKTsvKiBTZXQgdG8gZGVkdXBsaWNhdGUqL1xud2hpbGUobGF5ZXIhPT1udWxsJiZsYXllciE9PU9iamVjdC5wcm90b3R5cGUpe1xuLyogYmUgdG9sZXJhbnQgb2Ygbm9uLW9iamVjdHMqL1xuY29uc3QgZGVzY3M9Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhsYXllcik7XG5mb3IoY29uc3QgbmFtZSBvZiBvd25LZXlzKGRlc2NzKSl7XG4vKiBJbiBjYXNlIGEgbWV0aG9kIGlzIG92ZXJyaWRkZW4gYnkgYSBub24tbWV0aG9kLCovXG4vKiB0ZXN0IGB2YWxbbmFtZV1gIHJhdGhlciB0aGFuIGBsYXllcltuYW1lXWAqL1xuaWYodHlwZW9mIHZhbFtuYW1lXT09PSdmdW5jdGlvbicpe1xubmFtZXMuYWRkKG5hbWUpO1xuIH1cbiB9XG5pZighaXNPYmplY3QodmFsKSl7XG5icmVhaztcbiB9XG5sYXllcj1nZXRQcm90b3R5cGVPZihsYXllcik7XG4gfVxucmV0dXJuIGhhcmRlbihbLi4ubmFtZXNdLnNvcnQoY29tcGFyZVN0cmluZ2lmaWVkKSk7XG4gfTskaOKAjV9vbmNlLmdldE1ldGhvZE5hbWVzKGdldE1ldGhvZE5hbWVzKTtcbmhhcmRlbihnZXRNZXRob2ROYW1lcyk7XG5cbi8qKlxuICogVE9ETyBUaGlzIGZ1bmN0aW9uIGV4aXN0cyBvbmx5IHRvIGVhc2UgdGhlXG4gKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvcHVsbC81OTcwIHRyYW5zaXRpb24sIGZyb20gYWxsIG1ldGhvZHNcbiAqIGJlaW5nIG93biBwcm9wZXJ0aWVzIHRvIG1ldGhvZHMgYmVpbmcgaW5oZXJpdGVkIGZyb20gYSBjb21tb24gcHJvdG90eXBlLlxuICogVGhpcyB0cmFuc2l0aW9uIGJyZWFrcyB0d28gcGF0dGVybnMgdXNlZCBpbiBwcmlvciBjb2RlOiBhdXRvYmluZGluZyxcbiAqIGFuZCBlbnVtZXJhdGluZyBtZXRob2RzIGJ5IGVudW1lcmF0aW5nIG93biBwcm9wZXJ0aWVzLiBGb3IgYm90aCwgdGhlXG4gKiBwcmVmZXJyZWQgcmVwYWlycyBhcmVcbiAqICAgICogYXV0b2JpbmRpbmc6IFJlcGxhY2UsIGZvciBleGFtcGxlLFxuICogICAgICBgZm9vKG9iai5tZXRob2QpYCB3aXRoIGBmb28oYXJnID0+IGBvYmoubWV0aG9kKGFyZykpYC4gSU9XLCBzdG9wIHJlbHlpbmdcbiAqICAgICAgb24gZXhwcmVzc2lvbnMgbGlrZSBgb2JqLm1ldGhvZGAgdG8gZXh0cmFjdCBhIG1ldGhvZCBzdGlsbCBib3VuZCB0byB0aGVcbiAqICAgICAgc3RhdGUgb2YgYG9iamAgYmVjYXVzZSwgZm9yIHZpcnR1YWwgYW5kIGR1cmFibGUgb2JqZWN0cyxcbiAqICAgICAgdGhleSBubyBsb25nZXIgd2lsbCBhZnRlciAjNTk3MC5cbiAqICAgICogbWV0aG9kIGVudW1lcmF0aW9uOiBSZXBsYWNlLCBmb3IgZXhhbXBsZVxuICogICAgICBgUmVmbGVjdC5vd25LZXlzKG9iailgIHdpdGggYGdldE1ldGhvZE5hbWVzKG9iailgLlxuICpcbiAqIE9uY2UgYWxsIHByb2JsZW1hdGljIGNhc2VzIGhhdmUgYmVlbiBjb252ZXJ0ZWQgaW4gdGhpcyBtYW5uZXIsIHRoaXNcbiAqIGBiaW5kQWxsTWV0aG9kc2AgaGFjayBjYW4gYW5kIFRPRE8gc2hvdWxkIGJlIGRlbGV0ZWQuIEhvd2V2ZXIsIHdlIGN1cnJlbnRseVxuICogaGF2ZSBubyByZWxpYWJsZSBzdGF0aWMgd2F5IHRvIHRyYWNrIGRvd24gYW5kIGZpeCBhbGwgYXV0b2JpbmRpbmcgc2l0ZXMuXG4gKiBGb3IgdGhvc2Ugb2JqZWN0cyB0aGF0IGhhdmUgbm90IHlldCBiZWVuIGZ1bGx5IHJlcGFpcmVkIGJ5IHRoZSBhYm92ZSB0d29cbiAqIHRlY2huaXF1ZXMsIGBiaW5kQWxsTWV0aG9kc2AgY3JlYXRlcyBhbiBvYmplY3QgdGhhdCBhY3RzIG11Y2ggbGlrZSB0aGVcbiAqIHByZS0jNTk3MCBvYmplY3RzLCB3aXRoIGFsbCB0aGVpciBtZXRob2RzIGFzIGluc3RhbmNlLWJvdW5kIG93biBwcm9wZXJ0aWVzLlxuICogSXQgZG9lcyB0aGlzIGJ5IG1ha2luZyBhIG5ldyBvYmplY3QgaW5oZXJpdGluZyBmcm9tIGBvYmpgIHdoZXJlIHRoZSBuZXdcbiAqIG9iamVjdCBoYXMgYm91bmQgb3duIG1ldGhvZHMgb3ZlcnJpZGRpbmcgYWxsIHRoZSBtZXRob2RzIGl0IHdvdWxkIGhhdmVcbiAqIGluaGVyaXRlZCBmcm9tIGBvYmpgLlxuICpcbiAqIEBwYXJhbSB7UmVtb3RhYmxlfSBvYmpcbiAqIEByZXR1cm5zIHtSZW1vdGFibGV9XG4gKi9cbmNvbnN0ICAgICAgICBiaW5kQWxsTWV0aG9kcz0ob2JqKT0+XG5oYXJkZW4oXG5jcmVhdGUoXG5vYmosXG5mcm9tRW50cmllcyhcbmdldE1ldGhvZE5hbWVzKG9iaikubWFwKChuYW1lKT0+W1xubmFtZSxcbntcbnZhbHVlOigvKiogQHR5cGUge3Vua25vd25bXX0gKi8uLi5hcmdzKT0+XG5hcHBseShvYmpbbmFtZV0sb2JqLGFyZ3MpLFxuZW51bWVyYWJsZTp0cnVlfV0pKSkpOyRo4oCNX29uY2UuYmluZEFsbE1ldGhvZHMoYmluZEFsbE1ldGhvZHMpO1xuXG5cblxuXG5cbmhhcmRlbihiaW5kQWxsTWV0aG9kcyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHt7fX0gVFxuICogQHR5cGVkZWYge3sgW0sgaW4ga2V5b2YgVF06IERlZXBseUF3YWl0ZWQ8VFtLXT4gfX0gRGVlcGx5QXdhaXRlZE9iamVjdFxuICovXG5cbi8qKlxuICogQ2F2ZWF0czpcbiAqIC0gZG9lc24ndCByZWN1ciB3aXRoaW4gUHJvbWlzZSByZXN1bHRzXG4gKiAtIHJlc3VsdGluZyB0eXBlIGhhcyB3cmFwcGVyIGluIGl0cyBuYW1lXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtUIGV4dGVuZHMgUHJvbWlzZUxpa2U8YW55PiA/IEF3YWl0ZWQ8VD4gOiBUIGV4dGVuZHMge30gPyBEZWVwbHlBd2FpdGVkT2JqZWN0PFQ+IDogQXdhaXRlZDxUPn0gRGVlcGx5QXdhaXRlZFxuICovXG5cbi8qKlxuICogQSBtb3JlIGNvbnN0cmFpbmVkIHZlcnNpb24gb2Yge2RlZXBseUZ1bGZpbGxlZH0gZm9yIHR5cGUgc2FmZXR5IHVudGlsIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9pc3N1ZXMvMTI1N1xuICogVXNlZnVsIGluIHN0YXJ0aW5nIGNvbnRyYWN0cyB0aGF0IG5lZWQgYWxsIHRlcm1zIHRvIGJlIGZ1bGZpbGxlZCBpbiBvcmRlciB0byBiZSBkdXJhYmxlLlxuICpcbiAqIEB0eXBlIHs8VCBleHRlbmRzIHt9Pih1bmZ1bGZpbGxlZFRlcm1zOiBUKSA9PiBYaW1wb3J0KCdAZW5kby9ldmVudHVhbC1zZW5kJykuRVJlZjxEZWVwbHlBd2FpdGVkPFQ+Pn1cbiAqL1xuY29uc3QgICAgICAgIGRlZXBseUZ1bGZpbGxlZE9iamVjdD0ob2JqKT0+e1xuYXNzZXJ0KGlzT2JqZWN0KG9iaiksJ3BhcmFtIG11c3QgYmUgYW4gb2JqZWN0Jyk7XG5yZXR1cm4gZGVlcGx5RnVsZmlsbGVkKG9iaik7XG4gfTtcblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCB1c2VzIGEgbWlsbGlzZWNvbmQtYmFzZWQgdGltZS1zaW5jZS1lcG9jaCBjYXBhYmlsaXR5XG4gKiAoc3VjaCBhcyBgcGVyZm9ybWFuY2Uubm93YCkgdG8gbWVhc3VyZSBleGVjdXRpb24gdGltZSBvZiBhbiBhc3luYyBmdW5jdGlvblxuICogYW5kIHJlcG9ydCB0aGUgcmVzdWx0IGluIHNlY29uZHMgdG8gbWF0Y2ggb3VyIHRlbGVtZXRyeSBzdGFuZGFyZC5cbiAqXG4gKiBAcGFyYW0ge3R5cGVvZiBYaW1wb3J0KCdwZXJmX2hvb2tzJykucGVyZm9ybWFuY2Uubm93fSBjdXJyZW50VGltZU1pbGxpc2VjXG4gKiBAcmV0dXJucyB7PFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KSA9PiBQcm9taXNlPHsgcmVzdWx0OiBULCBkdXJhdGlvbjogbnVtYmVyIH0+fVxuICovJGjigI1fb25jZS5kZWVwbHlGdWxmaWxsZWRPYmplY3QoZGVlcGx5RnVsZmlsbGVkT2JqZWN0KTtcbmNvbnN0ICAgICAgICBtYWtlTWVhc3VyZVNlY29uZHM9KGN1cnJlbnRUaW1lTWlsbGlzZWMpPT57XG4vKiogQHBhcmFtIHsoKSA9PiBhbnl9IGZuICovXG5jb25zdCBtZWFzdXJlU2Vjb25kcz1hc3luYyhmbik9PntcbmNvbnN0IHQwPWN1cnJlbnRUaW1lTWlsbGlzZWMoKTtcbmNvbnN0IHJlc3VsdD1hd2FpdCBmbigpO1xuY29uc3QgZHVyYXRpb25NaWxsaXNlYz1jdXJyZW50VGltZU1pbGxpc2VjKCktdDA7XG5yZXR1cm57cmVzdWx0LGR1cmF0aW9uOmR1cmF0aW9uTWlsbGlzZWMvMTAwMH07XG4gfTtcbnJldHVybiBtZWFzdXJlU2Vjb25kcztcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7RXJyb3JbXX0gZXJyb3JzXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdXG4gKi8kaOKAjV9vbmNlLm1ha2VNZWFzdXJlU2Vjb25kcyhtYWtlTWVhc3VyZVNlY29uZHMpO1xuY29uc3QgICAgICAgIG1ha2VBZ2dyZWdhdGVFcnJvcj0oZXJyb3JzLG1lc3NhZ2UpPT57XG5jb25zdCBlcnI9bmV3IEVycm9yKG1lc3NhZ2UpO1xuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZXJyLHtcbm5hbWU6e1xudmFsdWU6J0FnZ3JlZ2F0ZUVycm9yJ30sXG5cbmVycm9yczp7XG52YWx1ZTplcnJvcnN9fSk7XG5cblxucmV0dXJuIGVycjtcbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge3JlYWRvbmx5IChUIHwgUHJvbWlzZUxpa2U8VD4pW119IHZhbHVlc1xuICogQHJldHVybnMge1Byb21pc2U8VFtdPn1cbiAqLyRo4oCNX29uY2UubWFrZUFnZ3JlZ2F0ZUVycm9yKG1ha2VBZ2dyZWdhdGVFcnJvcik7XG5jb25zdCAgICAgICAgUHJvbWlzZUFsbE9yRXJyb3JzPWFzeW5jKHZhbHVlcyk9PntcbnJldHVybiBQcm9taXNlLmFsbFNldHRsZWQodmFsdWVzKS50aGVuKChyZXN1bHRzKT0+e1xuY29uc3QgZXJyb3JzPS8qKiBAdHlwZSB7UHJvbWlzZVJlamVjdGVkUmVzdWx0W119ICovXG5yZXN1bHRzLmZpbHRlcigoe3N0YXR1c30pPT5zdGF0dXM9PT0ncmVqZWN0ZWQnKS5cbm1hcCgocmVzdWx0KT0+cmVzdWx0LnJlYXNvbik7XG5pZighZXJyb3JzLmxlbmd0aCl7XG5yZXR1cm4gKC8qKiBAdHlwZSB7UHJvbWlzZUZ1bGZpbGxlZFJlc3VsdDxUPltdfSAqL3Jlc3VsdHMubWFwKFxuKHJlc3VsdCk9PnJlc3VsdC52YWx1ZSkpO1xuXG4gfWVsc2UgaWYoZXJyb3JzLmxlbmd0aD09PTEpe1xudGhyb3cgZXJyb3JzWzBdO1xuIH1lbHNle1xudGhyb3cgbWFrZUFnZ3JlZ2F0ZUVycm9yKGVycm9ycyk7XG4gfVxuIH0pO1xuIH07XG5cbi8qKlxuICogQHR5cGUgezxUPihcbiAqICAgdHJpZXI6ICgpID0+IFByb21pc2U8VD4sXG4gKiAgZmluYWxpemVyOiAoZXJyb3I/OiB1bmtub3duKSA9PiBQcm9taXNlPHZvaWQ+LFxuICogKSA9PiBQcm9taXNlPFQ+fVxuICovJGjigI1fb25jZS5Qcm9taXNlQWxsT3JFcnJvcnMoUHJvbWlzZUFsbE9yRXJyb3JzKTtjb25zdCBhZ2dyZWdhdGVUcnlGaW5hbGx5PWFzeW5jKHRyaWVyLGZpbmFsaXplcik9PlxudHJpZXIoKS50aGVuKFxuYXN5bmMocmVzdWx0KT0+ZmluYWxpemVyKCkudGhlbigoKT0+cmVzdWx0KSxcbmFzeW5jKHRyeUVycm9yKT0+XG5maW5hbGl6ZXIodHJ5RXJyb3IpLlxudGhlbihcbigpPT50cnlFcnJvcixcbihmaW5hbGl6ZUVycm9yKT0+bWFrZUFnZ3JlZ2F0ZUVycm9yKFt0cnlFcnJvcixmaW5hbGl6ZUVycm9yXSkpLlxuXG50aGVuKChlcnJvcik9PlByb21pc2UucmVqZWN0KGVycm9yKSkpO1xuXG5cbi8qKlxuICogQHBhcmFtIHtYaW1wb3J0KFwiZnNcIikuUmVhZFN0cmVhbSB8IFhpbXBvcnQoXCJmc1wiKS5Xcml0ZVN0cmVhbX0gc3RyZWFtXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAqLyRo4oCNX29uY2UuYWdncmVnYXRlVHJ5RmluYWxseShhZ2dyZWdhdGVUcnlGaW5hbGx5KTtcbmNvbnN0ICAgICAgICBmc1N0cmVhbVJlYWR5PShzdHJlYW0pPT5cbm5ldyBQcm9taXNlKChyZXNvbHZlLHJlamVjdCk9PntcbmlmKHN0cmVhbS5kZXN0cm95ZWQpe1xucmVqZWN0KG5ldyBFcnJvcignU3RyZWFtIGFscmVhZHkgZGVzdHJveWVkJykpO1xucmV0dXJuO1xuIH1cblxuaWYoIXN0cmVhbS5wZW5kaW5nKXtcbnJlc29sdmUoKTtcbnJldHVybjtcbiB9XG5cbmNvbnN0IG9uUmVhZHk9KCk9PntcbmNsZWFudXAoKTsvKiBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbnJlc29sdmUoKTtcbiB9O1xuXG4vKiogQHBhcmFtIHtFcnJvcn0gZXJyICovXG5jb25zdCBvbkVycm9yPShlcnIpPT57XG5jbGVhbnVwKCk7LyogZXNsaW50LWRpc2FibGUtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5yZWplY3QoZXJyKTtcbiB9O1xuXG5jb25zdCBjbGVhbnVwPSgpPT57XG5zdHJlYW0ub2ZmKCdyZWFkeScsb25SZWFkeSk7XG5zdHJlYW0ub2ZmKCdlcnJvcicsb25FcnJvcik7XG4gfTtcblxuc3RyZWFtLm9uKCdyZWFkeScsb25SZWFkeSk7XG5zdHJlYW0ub24oJ2Vycm9yJyxvbkVycm9yKTtcbiB9KTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBUXG4gKiBAdHlwZWRlZiB7e1tQIGluIGtleW9mIFRdOiBFeGNsdWRlPFRbUF0sIHVuZGVmaW5lZD47fX0gQWxsRGVmaW5lZFxuICovXG5cbi8qKlxuICogQ29uY2lzZSB3YXkgdG8gY2hlY2sgdmFsdWVzIGFyZSBhdmFpbGFibGUgZnJvbSBvYmplY3QgbGl0ZXJhbCBzaG9ydGhhbmQuXG4gKiBUaHJvd3MgZXJyb3IgbWVzc2FnZSB0byBzcGVjaWZ5IHRoZSBtaXNzaW5nIHZhbHVlcy5cbiAqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBUXG4gKiBAcGFyYW0ge1R9IG9ialxuICogQHRocm93cyBpZiBhbnkgdmFsdWUgaW4gdGhlIG9iamVjdCBlbnRyaWVzIGlzIG5vdCBkZWZpbmVkXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBvYmogaXMgQWxsRGVmaW5lZDxUPn1cbiAqLyRo4oCNX29uY2UuZnNTdHJlYW1SZWFkeShmc1N0cmVhbVJlYWR5KTtcblxuY29uc3QgICAgICAgIGFzc2VydEFsbERlZmluZWQ9KG9iaik9PntcbmNvbnN0IG1pc3Npbmc9W107XG5mb3IoY29uc3Rba2V5LHZhbF1vZiBPYmplY3QuZW50cmllcyhvYmopKXtcbmlmKHZhbD09PXVuZGVmaW5lZCl7XG5taXNzaW5nLnB1c2goa2V5KTtcbiB9XG4gfVxuaWYobWlzc2luZy5sZW5ndGg+MCl7XG5GYWlsIGBtaXNzaW5nICR7cShtaXNzaW5nKX1gO1xuIH1cbiB9OyRo4oCNX29uY2UuYXNzZXJ0QWxsRGVmaW5lZChhc3NlcnRBbGxEZWZpbmVkKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJmcm9tVW5pcXVlRW50cmllcyI6WyJmcm9tVW5pcXVlRW50cmllcyJdLCJvYmplY3RNYXAiOlsib2JqZWN0TWFwIl0sImxpc3REaWZmZXJlbmNlIjpbImxpc3REaWZmZXJlbmNlIl0sInRocm93TGFiZWxlZCI6WyJ0aHJvd0xhYmVsZWQiXSwiYXBwbHlMYWJlbGluZ0Vycm9yIjpbImFwcGx5TGFiZWxpbmdFcnJvciJdLCJnZXRNZXRob2ROYW1lcyI6WyJnZXRNZXRob2ROYW1lcyJdLCJiaW5kQWxsTWV0aG9kcyI6WyJiaW5kQWxsTWV0aG9kcyJdLCJkZWVwbHlGdWxmaWxsZWRPYmplY3QiOlsiZGVlcGx5RnVsZmlsbGVkT2JqZWN0Il0sIm1ha2VNZWFzdXJlU2Vjb25kcyI6WyJtYWtlTWVhc3VyZVNlY29uZHMiXSwibWFrZUFnZ3JlZ2F0ZUVycm9yIjpbIm1ha2VBZ2dyZWdhdGVFcnJvciJdLCJQcm9taXNlQWxsT3JFcnJvcnMiOlsiUHJvbWlzZUFsbE9yRXJyb3JzIl0sImFnZ3JlZ2F0ZVRyeUZpbmFsbHkiOlsiYWdncmVnYXRlVHJ5RmluYWxseSJdLCJmc1N0cmVhbVJlYWR5IjpbImZzU3RyZWFtUmVhZHkiXSwiYXNzZXJ0QWxsRGVmaW5lZCI6WyJhc3NlcnRBbGxEZWZpbmVkIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAFLz3TiICwAAiAsAACIAAABAYWdvcmljL25hdC12NC4xLjAvZGlzdC9uYXQuZXNtLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJOYXQiLCJpc05hdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShpc05hdCwgJ25hbWUnLCB7dmFsdWU6IFwiaXNOYXRcIn0pOyRo4oCNX29uY2UuaXNOYXQoaXNOYXQpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShOYXQsICduYW1lJywge3ZhbHVlOiBcIk5hdFwifSk7JGjigI1fb25jZS5OYXQoTmF0KTsgICAvKiBDb3B5cmlnaHQgKEMpIDIwMTEgR29vZ2xlIEluYy4qL1xuLyogQ29weXJpZ2h0IChDKSAyMDE4IEFnb3JpYyovXG4vKiovXG4vKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOyovXG4vKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuKi9cbi8qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCovXG4vKiovXG4vKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAqL1xuLyoqL1xuLyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSovXG4vKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsKi9cbi8qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiovXG4vKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kKi9cbi8qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiovXG5cbi8qIEB0cy1jaGVjayovXG5cbi8qKlxuICogSXMgYGFsbGVnZWROdW1gIGEgbnVtYmVyIGluIHRoZSBbY29udGlndW91cyByYW5nZSBvZiBleGFjdGx5IGFuZFxuICogdW5hbWJpZ3VvdXNseVxuICogcmVwcmVzZW50YWJsZV0oaHR0cHM6Ly9lc2Rpc2N1c3Mub3JnL3RvcGljL21vcmUtbnVtZXJpYy1jb25zdGFudHMtcGxlYXNlLWVzcGVjaWFsbHktZXBzaWxvbiNjb250ZW50LTE0KVxuICogIG5hdHVyYWwgbnVtYmVycyAobm9uLW5lZ2F0aXZlIGludGVnZXJzKT9cbiAqXG4gKiBUbyBxdWFsaWZ5IGBhbGxlZ2VkTnVtYCBtdXN0IGVpdGhlciBiZSBhXG4gKiBub24tbmVnYXRpdmUgYGJpZ2ludGAsIG9yIGEgbm9uLW5lZ2F0aXZlIGBudW1iZXJgIHJlcHJlc2VudGluZyBhbiBpbnRlZ2VyXG4gKiB3aXRoaW4gcmFuZ2Ugb2YgW2ludGVnZXJzIHNhZmVseSByZXByZXNlbnRhYmxlIGluXG4gKiBmbG9hdGluZyBwb2ludF0oaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1udW1iZXIuaXNzYWZlaW50ZWdlcikuXG4gKlxuICogQHBhcmFtIHthbnl9IGFsbGVnZWROdW1cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBpc05hdChhbGxlZ2VkTnVtKXtcbmlmKHR5cGVvZiBhbGxlZ2VkTnVtPT09J2JpZ2ludCcpe1xucmV0dXJuIGFsbGVnZWROdW0+PTA7XG4gfVxuXG5yZXR1cm4gTnVtYmVyLmlzU2FmZUludGVnZXIoYWxsZWdlZE51bSkmJmFsbGVnZWROdW0+PTA7XG4gfVxuXG4vKipcbiAqIElmIGBhbGxlZ2VkTnVtYmVyYCBwYXNzZXMgdGhlIGBpc05hdGAgdGVzdCwgdGhlbiByZXR1cm4gaXQgYXMgYSBiaWdpbnQuXG4gKiBPdGhlcndpc2UgdGhyb3cgYW4gYXBwcm9wcmlhdGUgZXJyb3IuXG4gKlxuICogSWYgYGFsbGVnZWROdW1gIGlzIG5laXRoZXIgYSBiaWdpbnQgbm9yIGEgbnVtYmVyLCBgTmF0YCB0aHJvd3MgYSBgVHlwZUVycm9yYC5cbiAqIE90aGVyd2lzZSwgaWYgaXQgaXMgbm90IGEgW3NhZmVseVxuICogcmVwcmVzZW50YWJsZV0oaHR0cHM6Ly9lc2Rpc2N1c3Mub3JnL3RvcGljL21vcmUtbnVtZXJpYy1jb25zdGFudHMtcGxlYXNlLWVzcGVjaWFsbHktZXBzaWxvbiNjb250ZW50LTE0KVxuICogbm9uLW5lZ2F0aXZlIGludGVnZXIsIGBOYXRgIHRocm93cyBhIGBSYW5nZUVycm9yYC5cbiAqIE90aGVyd2lzZSwgaXQgaXMgY29udmVydGVkIHRvIGEgYmlnaW50IGlmIG5lY2Vzc2FyeSBhbmQgcmV0dXJuZWQuXG4gKlxuICogQHBhcmFtIHtiaWdpbnQgfCBudW1iZXJ9IGFsbGVnZWROdW1cbiAqIEByZXR1cm5zIHtiaWdpbnR9XG4gKi9cbmZ1bmN0aW9uIE5hdChhbGxlZ2VkTnVtKXtcbmlmKHR5cGVvZiBhbGxlZ2VkTnVtPT09J2JpZ2ludCcpe1xuaWYoYWxsZWdlZE51bTwwKXtcbnRocm93IG5ldyBSYW5nZUVycm9yKCBgJHthbGxlZ2VkTnVtfSBpcyBuZWdhdGl2ZWApO1xuIH1cbnJldHVybiBhbGxlZ2VkTnVtO1xuIH1cblxuaWYodHlwZW9mIGFsbGVnZWROdW09PT0nbnVtYmVyJyl7XG5pZighTnVtYmVyLmlzU2FmZUludGVnZXIoYWxsZWdlZE51bSkpe1xudGhyb3cgbmV3IFJhbmdlRXJyb3IoIGAke2FsbGVnZWROdW19IG5vdCBhIHNhZmUgaW50ZWdlcmApO1xuIH1cbmlmKGFsbGVnZWROdW08MCl7XG50aHJvdyBuZXcgUmFuZ2VFcnJvciggYCR7YWxsZWdlZE51bX0gaXMgbmVnYXRpdmVgKTtcbiB9XG5yZXR1cm4gQmlnSW50KGFsbGVnZWROdW0pO1xuIH1cblxudGhyb3cgbmV3IFR5cGVFcnJvcihcbiBgJHthbGxlZ2VkTnVtfSBpcyBhICR7dHlwZW9mIGFsbGVnZWROdW19IGJ1dCBtdXN0IGJlIGEgYmlnaW50IG9yIGEgbnVtYmVyYCk7XG5cbiB9XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNOYXQiOlsiaXNOYXQiXSwiTmF0IjpbIk5hdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABdze4OVwEAAFcBAAAjAAAAQGFnb3JpYy9ub3RpZmllci12MC41LjEvZXhwb3J0ZWQuanN7ImltcG9ydHMiOlsiLi9zcmMvdHlwZXMtYW1iaWVudC5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3NyYy90eXBlcy1hbWJpZW50LmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB3Sz4jox0AAKMdAAAzAAAAQGFnb3JpYy9ub3RpZmllci12MC41LjEvc3JjL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzeyJpbXBvcnRzIjpbIi4vdHlwZXMtYW1iaWVudC5qcyIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsibWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIiLCJvYnNlcnZlSXRlcmF0aW9uIiwib2JzZXJ2ZUl0ZXJhdG9yIiwib2JzZXJ2ZU5vdGlmaWVyIiwidXBkYXRlRnJvbUl0ZXJhYmxlIiwidXBkYXRlRnJvbU5vdGlmaWVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEUsRmFyOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV0sW1wiLi90eXBlcy1hbWJpZW50LmpzXCIsIFtdXV0pOyAgIFxuXG5cblxuXG5cblxuLyoqXG4gKiBBZGFwdG9yIGZyb20gYSBub3RpZmllclAgdG8gYW4gYXN5bmMgaXRlcmFibGUuXG4gKiBUaGUgbm90aWZpZXJQIGNhbiBiZSBhbnkgb2JqZWN0IHRoYXQgaGFzIGFuIGV2ZW50dWFsbHkgaW52b2NhYmxlXG4gKiBgZ2V0VXBkYXRlU2luY2VgIG1ldGhvZCB0aGF0IGJlaGF2ZXMgYWNjb3JkaW5nIHRvIHRoZSBub3RpZmllclxuICogc3BlYy4gVGhpcyBjYW4gYmUgYSBub3RpZmllciwgYSBwcm9taXNlIGZvciBhIGxvY2FsIG9yIHJlbW90ZVxuICogbm90aWZpZXIsIG9yIGEgcHJlc2VuY2Ugb2YgYSByZW1vdGUgbm90aWZpZXIuXG4gKlxuICogSXQgaXMgYWxzbyB1c2VkIGludGVybmFsbHkgYnkgbm90aWZpZXIuanMgc28gdGhhdCBhIG5vdGlmaWVyIGl0c2VsZiBpcyBhblxuICogYXN5bmMgaXRlcmFibGUuXG4gKlxuICogQW4gYXN5bmMgaXRlcmFibGUgaXMgYW4gb2JqZWN0IHdpdGggYSBgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpYCBtZXRob2RcbiAqIHRoYXQgcmV0dXJucyBhbiBhc3luYyBpdGVyYXRvci4gVGhlIGFzeW5jIGl0ZXJhdG9yIHdlIHJldHVybiBoZXJlIGhhcyBvbmx5XG4gKiBhIGBuZXh0KClgIG1ldGhvZCwgd2l0aG91dCB0aGUgb3B0aW9uYWwgYHJldHVybmAgYW5kIGB0aHJvd2AgbWV0aG9kcy4gVGhlXG4gKiBvbWl0dGVkIG1ldGhvZHMsIGlmIHByZXNlbnQsIHdvdWxkIGJlIHVzZWQgYnkgdGhlIGZvci9hd2FpdC9vZiBsb29wIHRvXG4gKiBpbmZvcm0gdGhlIGl0ZXJhdG9yIG9mIGVhcmx5IHRlcm1pbmF0aW9uLiBCdXQgdGhpcyBhZGFwdG9yIHdvdWxkIG5vdCBkb1xuICogYW55dGhpbmcgdXNlZnVsIGluIHJlYWN0aW9uIHRvIHRoaXMgbm90aWZpY2F0aW9uLlxuICpcbiAqIEFuIGFzeW5jIGl0ZXJhdG9yJ3MgYG5leHQoKWAgbWV0aG9kIHJldHVybnMgYSBwcm9taXNlIGZvciBhbiBpdGVyYXRpb25cbiAqIHJlc3VsdC4gQW4gaXRlcmF0aW9uIHJlc3VsdCBpcyBhIHJlY29yZCB3aXRoIGB2YWx1ZWAgYW5kIGBkb25lYCBwcm9wZXJ0aWVzLlxuICpcbiAqIFRoZSBwdXJwb3NlIG9mIGJ1aWxkaW5nIG9uIHRoZSBub3RpZmllciBwcm90b2NvbCBpcyB0byBoYXZlIGEgbG9zc3lcbiAqIGFkYXB0b3IsIHdoZXJlIGludGVybWVkaWF0ZSByZXN1bHRzIGNhbiBiZSBtaXNzZWQgaW4gZmF2b3Igb2YgbW9yZSByZWNlbnRcbiAqIHJlc3VsdHMgd2hpY2ggYXJlIHRoZXJlZm9yZSBsZXNzIHN0YWxlLiBTZWVcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvZG9jdW1lbnRhdGlvbi9ibG9iL21hc3Rlci9tYWluL2Rpc3RyaWJ1dGVkLXByb2dyYW1taW5nLm1kI25vdGlmaWVyc1xuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8QmFzZU5vdGlmaWVyPFQ+Pn0gbm90aWZpZXJQXG4gKiBAcmV0dXJucyB7Q29uc2lzdGVudEFzeW5jSXRlcmFibGU8VD59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllcj0obm90aWZpZXJQKT0+e1xucmV0dXJuIEZhcignYXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllcicse1xuW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTooKT0+e1xuLyoqIEB0eXBlIHtVcGRhdGVDb3VudH0gKi9cbmxldCBsb2NhbFVwZGF0ZUNvdW50O1xuLyoqIEB0eXBlIHtQcm9taXNlPHt2YWx1ZTogVCwgZG9uZTogYm9vbGVhbn0+IHwgdW5kZWZpbmVkfSAqL1xubGV0IG15SXRlcmF0aW9uUmVzdWx0UDtcbnJldHVybiBGYXIoJ2FzeW5jSXRlcmF0b3JGcm9tTm90aWZpZXInLHtcbm5leHQ6KCk9PntcbmlmKCFteUl0ZXJhdGlvblJlc3VsdFApe1xuLyogSW4gdGhpcyBhZGFwdG9yLCBvbmNlIGBuZXh0KClgIGlzIGNhbGxlZCBhbmQgcmV0dXJucyBhbiovXG4vKiB1bnJlc29sdmVkIHByb21pc2UsIGBteUl0ZXJhdGlvblJlc3VsdFBgLCBhbmQgdW50aWwqL1xuLyogYG15SXRlcmF0aW9uUmVzdWx0UGAgaXMgZnVsZmlsbGVkIHdpdGggYW4qL1xuLyogaXRlcmF0aW9uIHJlc3VsdCwgZnVydGhlciBgbmV4dCgpYCBjYWxscyB3aWxsIHJldHVybiB0aGUgc2FtZSovXG4vKiBgbXlJdGVyYXRpb25SZXN1bHRQYCBwcm9taXNlIGFnYWluIHdpdGhvdXQgYXNraW5nIHRoZSBub3RpZmllciovXG4vKiBmb3IgbW9yZSB1cGRhdGVzLiBJZiB0aGVyZSdzIGFscmVhZHkgYW4gdW5hbnN3ZXJlZCBhc2sgaW4gdGhlKi9cbi8qIGFpciwgYWxsIGZ1cnRoZXIgYXNrcyBzaG91bGQganVzdCByZXVzZSB0aGUgcmVzdWx0IG9mIHRoYXQgb25lLiovXG4vKiovXG4vKiBUaGlzIHJldXNlIGJlaGF2aW9yIGlzIG9ubHkgbmVlZGVkIGZvciBjb2RlIHRoYXQgdXNlcyB0aGUgYXN5bmMqL1xuLyogaXRlcmF0b3IgcHJvdG9jb2wgZXhwbGljaXRseS4gV2hlbiB0aGlzIGFzeW5jIGl0ZXJhdG9yIGlzKi9cbi8qIGNvbnN1bWVkIGJ5IGEgZm9yL2F3YWl0L29mIGxvb3AsIGBuZXh0KClgIHdpbGwgb25seSBiZSBjYWxsZWQqL1xuLyogYWZ0ZXIgdGhlIHByb21pc2UgZm9yIHRoZSBwcmV2aW91cyBpdGVyYXRpb24gcmVzdWx0IGhhcyovXG4vKiBmdWxmaWxsZWQuIElmIGl0IGZ1bGZpbGxzIHdpdGggYGRvbmU6IHRydWVgLCB0aGUgZm9yL2F3YWl0L29mKi9cbi8qIGxvb3Agd2lsbCBuZXZlciBjYWxsIGBuZXh0KClgIGFnYWluLiovXG4vKiovXG4vKiBTZWUqL1xuLyogaHR0cHM6Ly8yYWxpdHkuY29tLzIwMTYvMTAvYXN5bmNocm9ub3VzLWl0ZXJhdGlvbi5odG1sI3F1ZXVpbmctbmV4dCgpLWludm9jYXRpb25zKi9cbi8qIGZvciBhbiBleHBsaWNpdCB1c2UgdGhhdCBzZW5kcyBgbmV4dCgpYCB3aXRob3V0IHdhaXRpbmcuKi9cbm15SXRlcmF0aW9uUmVzdWx0UD1FKG5vdGlmaWVyUCkuXG5nZXRVcGRhdGVTaW5jZShsb2NhbFVwZGF0ZUNvdW50KS5cbnRoZW4oKHt2YWx1ZSx1cGRhdGVDb3VudH0pPT57XG5sb2NhbFVwZGF0ZUNvdW50PXVwZGF0ZUNvdW50O1xuY29uc3QgZG9uZT1sb2NhbFVwZGF0ZUNvdW50PT09dW5kZWZpbmVkO1xuaWYoIWRvbmUpe1xuLyogT25jZSB0aGUgb3V0c3RhbmRpbmcgcXVlc3Rpb24gaGFzIGJlZW4gYW5zd2VyZWQsIHN0b3AqL1xuLyogdXNpbmcgdGhhdCBhbnN3ZXIsIHNvIGFueSBmdXJ0aGVyIGBuZXh0KClgIHF1ZXN0aW9ucyovXG4vKiBjYXVzZSBhIG5ldyBgZ2V0VXBkYXRlU2luY2VgIHJlcXVlc3QuKi9cbi8qKi9cbi8qIEJ1dCBvbmx5IGlmIG1vcmUgYW5zd2VycyBhcmUgZXhwZWN0ZWQuIE9uY2UgdGhlIG5vdGlmaWVyKi9cbi8qIGlzIGBkb25lYCwgdGhhdCB3YXMgdGhlIGxhc3QgYW5zd2VyIHNvIHJldXNlIGl0IGZvcmV2ZXIuKi9cbm15SXRlcmF0aW9uUmVzdWx0UD11bmRlZmluZWQ7XG4gfVxucmV0dXJuIGhhcmRlbih7dmFsdWUsZG9uZX0pO1xuIH0pO1xuIH1cbi8qIHh4eCBoaW50IGZvciB0eXBlIGNoZWNrZXIqL1xuYXNzZXJ0KG15SXRlcmF0aW9uUmVzdWx0UCk7XG5yZXR1cm4gbXlJdGVyYXRpb25SZXN1bHRQO1xuIH19KTtcblxuIH19KTtcblxuIH07XG5cbi8qKlxuICogVGhpcyBhZHZhbmNlcyBgYXN5bmNJdGVyYXRvclBgIHVwZGF0aW5nIGBpdGVyYXRpb25PYnNlcnZlcmAgd2l0aCBlYWNoXG4gKiBzdWNjZXNzaXZlIHZhbHVlLiBUaGUgYGl0ZXJhdGlvbk9ic2VydmVyYCBtYXkgb25seSBiZSBpbnRlcmVzdGVkIGluIGNlcnRhaW5cbiAqIG9jY3VycmVuY2VzIChgdXBkYXRlU3RhdGVgLCBgZmluaXNoYCwgYGZhaWxgKSwgc28gZm9yIGNvbnZlbmllbmNlLFxuICogYG9ic2VydmVJdGVyYXRvcmAgZmVhdHVyZSB0ZXN0cyBmb3IgdGhvc2UgbWV0aG9kcyBiZWZvcmUgY2FsbGluZyB0aGVtLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8QXN5bmNJdGVyYXRvcjxUPj59IGFzeW5jSXRlcmF0b3JQXG4gKiBAcGFyYW0ge1BhcnRpYWw8SXRlcmF0aW9uT2JzZXJ2ZXI8VD4+fSBpdGVyYXRpb25PYnNlcnZlclxuICogQHJldHVybnMge1Byb21pc2U8dW5kZWZpbmVkPn1cbiAqLyRo4oCNX29uY2UubWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIobWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIpO1xuY29uc3QgICAgICAgIG9ic2VydmVJdGVyYXRvcj0oYXN5bmNJdGVyYXRvclAsaXRlcmF0aW9uT2JzZXJ2ZXIpPT57XG5yZXR1cm4gbmV3IFByb21pc2UoKGFjayxvYnNlcnZlckVycm9yKT0+e1xuY29uc3QgcmVjdXI9KCk9PntcbkUud2hlbihcbkUoYXN5bmNJdGVyYXRvclApLm5leHQoKSxcbih7dmFsdWUsZG9uZX0pPT57XG5pZihkb25lKXtcbml0ZXJhdGlvbk9ic2VydmVyLmZpbmlzaCYmaXRlcmF0aW9uT2JzZXJ2ZXIuZmluaXNoKHZhbHVlKTtcbmFjayh1bmRlZmluZWQpO1xuIH1lbHNle1xuaXRlcmF0aW9uT2JzZXJ2ZXIudXBkYXRlU3RhdGUmJlxuaXRlcmF0aW9uT2JzZXJ2ZXIudXBkYXRlU3RhdGUodmFsdWUpO1xucmVjdXIoKTtcbiB9XG4gfSxcbihyZWFzb24pPT57XG5pdGVyYXRpb25PYnNlcnZlci5mYWlsJiZpdGVyYXRpb25PYnNlcnZlci5mYWlsKHJlYXNvbik7XG5hY2sodW5kZWZpbmVkKTtcbiB9KS5cbmNhdGNoKG9ic2VydmVyRXJyb3IpO1xuIH07XG5yZWN1cigpO1xuIH0pO1xuIH07XG5cbi8qKlxuICogVGhpcyByZWFkcyBmcm9tIGBhc3luY0l0ZXJhYmxlUGAgdXBkYXRpbmcgYGl0ZXJhdGlvbk9ic2VydmVyYCB3aXRoIGVhY2hcbiAqIHN1Y2Nlc3NpdmUgdmFsdWUuIFRoZSBgaXRlcmF0aW9uT2JzZXJ2ZXJgIG1heSBvbmx5IGJlIGludGVyZXN0ZWQgaW4gY2VydGFpblxuICogb2NjdXJyZW5jZXMgKGB1cGRhdGVTdGF0ZWAsIGBmaW5pc2hgLCBgZmFpbGApLCBzbyBmb3IgY29udmVuaWVuY2UsXG4gKiBgb2JzZXJ2ZUl0ZXJhdGlvbmAgZmVhdHVyZSB0ZXN0cyBmb3IgdGhvc2UgbWV0aG9kcyBiZWZvcmUgY2FsbGluZyB0aGVtLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8QXN5bmNJdGVyYWJsZTxUPj59IGFzeW5jSXRlcmFibGVQXG4gKiBAcGFyYW0ge1BhcnRpYWw8SXRlcmF0aW9uT2JzZXJ2ZXI8VD4+fSBpdGVyYXRpb25PYnNlcnZlclxuICogQHJldHVybnMge1Byb21pc2U8dW5kZWZpbmVkPn1cbiAqLyRo4oCNX29uY2Uub2JzZXJ2ZUl0ZXJhdG9yKG9ic2VydmVJdGVyYXRvcik7XG5jb25zdCAgICAgICAgb2JzZXJ2ZUl0ZXJhdGlvbj0oYXN5bmNJdGVyYWJsZVAsaXRlcmF0aW9uT2JzZXJ2ZXIpPT57XG5jb25zdCBpdGVyYXRvclA9RShhc3luY0l0ZXJhYmxlUClbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk7XG5yZXR1cm4gb2JzZXJ2ZUl0ZXJhdG9yKGl0ZXJhdG9yUCxpdGVyYXRpb25PYnNlcnZlcik7XG4gfTtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgYG9ic2VydmVJdGVyYXRpb25gIGluc3RlYWRcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1BhcnRpYWw8SXRlcmF0aW9uT2JzZXJ2ZXI8VD4+fSBpdGVyYXRpb25PYnNlcnZlclxuICogQHBhcmFtIHtFUmVmPEFzeW5jSXRlcmFibGU8VD4+fSBhc3luY0l0ZXJhYmxlUFxuICogQHJldHVybnMge1Byb21pc2U8dW5kZWZpbmVkPn1cbiAqLyRo4oCNX29uY2Uub2JzZXJ2ZUl0ZXJhdGlvbihvYnNlcnZlSXRlcmF0aW9uKTtcbmNvbnN0ICAgICAgICB1cGRhdGVGcm9tSXRlcmFibGU9KGl0ZXJhdGlvbk9ic2VydmVyLGFzeW5jSXRlcmFibGVQKT0+XG5vYnNlcnZlSXRlcmF0aW9uKGFzeW5jSXRlcmFibGVQLGl0ZXJhdGlvbk9ic2VydmVyKTtcblxuLyoqXG4gKiBBcyB1cGRhdGVzIGNvbWUgaW4gZnJvbSB0aGUgcG9zc2libHkgcmVtb3RlIGBub3RpZmllclBgLCB1cGRhdGVcbiAqIHRoZSBsb2NhbCBgdXBkYXRlcmAuIFNpbmNlIHRoZSB1cGRhdGVzIGNvbWUgZnJvbSBhIG5vdGlmaWVyLCB0aGV5XG4gKiBhcmUgbG9zc3ksIGkuZS4sIG9uY2UgYSBtb3JlIHJlY2VudCBzdGF0ZSBjYW4gYmUgcmVwb3J0ZWQsIGxlc3MgcmVjZW50XG4gKiBzdGF0ZXMgYXJlIGFzc3VtZWQgaXJyZWxldmFudCBhbmQgZHJvcHBlZC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPE5vdGlmaWVyPFQ+Pn0gbm90aWZpZXJQXG4gKiBAcGFyYW0ge1BhcnRpYWw8SXRlcmF0aW9uT2JzZXJ2ZXI8VD4+fSBpdGVyYXRpb25PYnNlcnZlclxuICogQHJldHVybnMge1Byb21pc2U8dW5kZWZpbmVkPn1cbiAqLyRo4oCNX29uY2UudXBkYXRlRnJvbUl0ZXJhYmxlKHVwZGF0ZUZyb21JdGVyYWJsZSk7XG5jb25zdCAgICAgICAgb2JzZXJ2ZU5vdGlmaWVyPShub3RpZmllclAsaXRlcmF0aW9uT2JzZXJ2ZXIpPT5cbm9ic2VydmVJdGVyYXRpb24obWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIobm90aWZpZXJQKSxpdGVyYXRpb25PYnNlcnZlcik7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlICdvYnNlcnZlTm90aWZpZXJgIGluc3RlYWQuXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtQYXJ0aWFsPEl0ZXJhdGlvbk9ic2VydmVyPFQ+Pn0gaXRlcmF0aW9uT2JzZXJ2ZXJcbiAqIEBwYXJhbSB7RVJlZjxOb3RpZmllcjxUPj59IG5vdGlmaWVyUFxuICogQHJldHVybnMge1Byb21pc2U8dW5kZWZpbmVkPn1cbiAqLyRo4oCNX29uY2Uub2JzZXJ2ZU5vdGlmaWVyKG9ic2VydmVOb3RpZmllcik7XG5jb25zdCAgICAgICAgdXBkYXRlRnJvbU5vdGlmaWVyPShpdGVyYXRpb25PYnNlcnZlcixub3RpZmllclApPT5cbm9ic2VydmVJdGVyYXRpb24obWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIobm90aWZpZXJQKSxpdGVyYXRpb25PYnNlcnZlcik7JGjigI1fb25jZS51cGRhdGVGcm9tTm90aWZpZXIodXBkYXRlRnJvbU5vdGlmaWVyKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllciI6WyJtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllciJdLCJvYnNlcnZlSXRlcmF0b3IiOlsib2JzZXJ2ZUl0ZXJhdG9yIl0sIm9ic2VydmVJdGVyYXRpb24iOlsib2JzZXJ2ZUl0ZXJhdGlvbiJdLCJ1cGRhdGVGcm9tSXRlcmFibGUiOlsidXBkYXRlRnJvbUl0ZXJhYmxlIl0sIm9ic2VydmVOb3RpZmllciI6WyJvYnNlcnZlTm90aWZpZXIiXSwidXBkYXRlRnJvbU5vdGlmaWVyIjpbInVwZGF0ZUZyb21Ob3RpZmllciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADPkEiLAAsAAAALAAAkAAAAQGFnb3JpYy9ub3RpZmllci12MC41LjEvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vYXN5bmNJdGVyYWJsZUFkYXB0b3IuanMiLCIuL25vdGlmaWVyLmpzIiwiLi9wdWJsaXNoLWtpdC5qcyIsIi4vc3RvcmVzdWIuanMiLCIuL3N1YnNjcmliZXIuanMiXSwiZXhwb3J0cyI6WyJTdWJzY3JpYmVyU2hhcGUiLCJtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllciIsIm1ha2VOb3RpZmllciIsIm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlIiwibWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIiLCJtYWtlTm90aWZpZXJLaXQiLCJtYWtlUHVibGlzaEtpdCIsIm1ha2VTdWJzY3JpcHRpb24iLCJtYWtlU3Vic2NyaXB0aW9uS2l0Iiwib2JzZXJ2ZUl0ZXJhdGlvbiIsIm9ic2VydmVJdGVyYXRvciIsIm9ic2VydmVOb3RpZmllciIsInN1YnNjcmliZUVhY2giLCJzdWJzY3JpYmVMYXRlc3QiLCJ1cGRhdGVGcm9tSXRlcmFibGUiLCJ1cGRhdGVGcm9tTm90aWZpZXIiLCJ2aXZpZnlEdXJhYmxlUHVibGlzaEtpdCJdLCJyZWV4cG9ydHMiOlsiLi9zdG9yZXN1Yi5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vcHVibGlzaC1raXQuanNcIiwgW1tcIm1ha2VQdWJsaXNoS2l0XCIsIFskaOKAjV9saXZlW1wibWFrZVB1Ymxpc2hLaXRcIl1dXSxbXCJzdWJzY3JpYmVFYWNoXCIsIFskaOKAjV9saXZlW1wic3Vic2NyaWJlRWFjaFwiXV1dLFtcInN1YnNjcmliZUxhdGVzdFwiLCBbJGjigI1fbGl2ZVtcInN1YnNjcmliZUxhdGVzdFwiXV1dLFtcInZpdmlmeUR1cmFibGVQdWJsaXNoS2l0XCIsIFskaOKAjV9saXZlW1widml2aWZ5RHVyYWJsZVB1Ymxpc2hLaXRcIl1dXSxbXCJTdWJzY3JpYmVyU2hhcGVcIiwgWyRo4oCNX2xpdmVbXCJTdWJzY3JpYmVyU2hhcGVcIl1dXV1dLFtcIi4vbm90aWZpZXIuanNcIiwgW1tcIm1ha2VOb3RpZmllclwiLCBbJGjigI1fbGl2ZVtcIm1ha2VOb3RpZmllclwiXV1dLFtcIm1ha2VOb3RpZmllcktpdFwiLCBbJGjigI1fbGl2ZVtcIm1ha2VOb3RpZmllcktpdFwiXV1dLFtcIm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlXCIsIFskaOKAjV9saXZlW1wibWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGVcIl1dXSxbXCJtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlclwiLCBbJGjigI1fbGl2ZVtcIm1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyXCJdXV1dXSxbXCIuL3N1YnNjcmliZXIuanNcIiwgW1tcIm1ha2VTdWJzY3JpcHRpb25cIiwgWyRo4oCNX2xpdmVbXCJtYWtlU3Vic2NyaXB0aW9uXCJdXV0sW1wibWFrZVN1YnNjcmlwdGlvbktpdFwiLCBbJGjigI1fbGl2ZVtcIm1ha2VTdWJzY3JpcHRpb25LaXRcIl1dXV1dLFtcIi4vYXN5bmNJdGVyYWJsZUFkYXB0b3IuanNcIiwgW1tcIm9ic2VydmVOb3RpZmllclwiLCBbJGjigI1fbGl2ZVtcIm9ic2VydmVOb3RpZmllclwiXV1dLFtcIm9ic2VydmVJdGVyYXRvclwiLCBbJGjigI1fbGl2ZVtcIm9ic2VydmVJdGVyYXRvclwiXV1dLFtcIm9ic2VydmVJdGVyYXRpb25cIiwgWyRo4oCNX2xpdmVbXCJvYnNlcnZlSXRlcmF0aW9uXCJdXV0sW1widXBkYXRlRnJvbUl0ZXJhYmxlXCIsIFskaOKAjV9saXZlW1widXBkYXRlRnJvbUl0ZXJhYmxlXCJdXV0sW1widXBkYXRlRnJvbU5vdGlmaWVyXCIsIFskaOKAjV9saXZlW1widXBkYXRlRnJvbU5vdGlmaWVyXCJdXV0sW1wibWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXJcIiwgWyRo4oCNX2xpdmVbXCJtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllclwiXV1dXV0sW1wiLi9zdG9yZXN1Yi5qc1wiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6eyJtYWtlUHVibGlzaEtpdCI6WyJtYWtlUHVibGlzaEtpdCIsZmFsc2VdLCJzdWJzY3JpYmVFYWNoIjpbInN1YnNjcmliZUVhY2giLGZhbHNlXSwic3Vic2NyaWJlTGF0ZXN0IjpbInN1YnNjcmliZUxhdGVzdCIsZmFsc2VdLCJ2aXZpZnlEdXJhYmxlUHVibGlzaEtpdCI6WyJ2aXZpZnlEdXJhYmxlUHVibGlzaEtpdCIsZmFsc2VdLCJTdWJzY3JpYmVyU2hhcGUiOlsiU3Vic2NyaWJlclNoYXBlIixmYWxzZV0sIm1ha2VOb3RpZmllciI6WyJtYWtlTm90aWZpZXIiLGZhbHNlXSwibWFrZU5vdGlmaWVyS2l0IjpbIm1ha2VOb3RpZmllcktpdCIsZmFsc2VdLCJtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSI6WyJtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSIsZmFsc2VdLCJtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlciI6WyJtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlciIsZmFsc2VdLCJtYWtlU3Vic2NyaXB0aW9uIjpbIm1ha2VTdWJzY3JpcHRpb24iLGZhbHNlXSwibWFrZVN1YnNjcmlwdGlvbktpdCI6WyJtYWtlU3Vic2NyaXB0aW9uS2l0IixmYWxzZV0sIm9ic2VydmVOb3RpZmllciI6WyJvYnNlcnZlTm90aWZpZXIiLGZhbHNlXSwib2JzZXJ2ZUl0ZXJhdG9yIjpbIm9ic2VydmVJdGVyYXRvciIsZmFsc2VdLCJvYnNlcnZlSXRlcmF0aW9uIjpbIm9ic2VydmVJdGVyYXRpb24iLGZhbHNlXSwidXBkYXRlRnJvbUl0ZXJhYmxlIjpbInVwZGF0ZUZyb21JdGVyYWJsZSIsZmFsc2VdLCJ1cGRhdGVGcm9tTm90aWZpZXIiOlsidXBkYXRlRnJvbU5vdGlmaWVyIixmYWxzZV0sIm1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyIjpbIm1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyIixmYWxzZV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADmvR3hAKgAAQCoAACcAAABAYWdvcmljL25vdGlmaWVyLXYwLjUuMS9zcmMvbm90aWZpZXIuanN7ImltcG9ydHMiOlsiLi9hc3luY0l0ZXJhYmxlQWRhcHRvci5qcyIsIi4vdHlwZXMtYW1iaWVudC5qcyIsIkBhZ29yaWMvYXNzZXJ0IiwiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL21hcnNoYWwiLCJAZW5kby9wcm9taXNlLWtpdCJdLCJleHBvcnRzIjpbIm1ha2VOb3RpZmllciIsIm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlIiwibWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIiLCJtYWtlTm90aWZpZXJLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0LG1ha2VQcm9taXNlS2l0LEUsRmFyLG1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvYXNzZXJ0XCIsIFtbXCJhc3NlcnRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydCA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wibWFrZVByb21pc2VLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VQcm9taXNlS2l0ID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV0sW1wiLi9hc3luY0l0ZXJhYmxlQWRhcHRvci5qc1wiLCBbW1wibWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXJcIiwgWyRo4oCNX2EgPT4gKG1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyID0gJGjigI1fYSldXV1dLFtcIi4vdHlwZXMtYW1iaWVudC5qc1wiLCBbXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxCYXNlTm90aWZpZXI8VD4gfCBOb3RpZmllckludGVybmFsczxUPj59IHNoYXJhYmxlSW50ZXJuYWxzUFxuICogQHJldHVybnMge0FzeW5jSXRlcmFibGU8VD4gJiBTaGFyYWJsZU5vdGlmaWVyPFQ+fVxuICovXG5jb25zdCAgICAgICAgbWFrZU5vdGlmaWVyPShzaGFyYWJsZUludGVybmFsc1ApPT57XG5jb25zdCBhc3luY0l0ZXJhYmxlPW1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyKHNoYXJhYmxlSW50ZXJuYWxzUCk7XG5cbi8qKiBAdHlwZSB7QXN5bmNJdGVyYWJsZTxUPiAmIFNoYXJhYmxlTm90aWZpZXI8VD59ICovXG5jb25zdCBub3RpZmllcj1GYXIoJ25vdGlmaWVyJyx7XG4uLi5hc3luY0l0ZXJhYmxlLFxuXG4vKipcbiAqIFVzZSB0aGlzIHRvIGRpc3RyaWJ1dGUgYSBOb3RpZmllciBlZmZpY2llbnRseSBvdmVyIHRoZSBuZXR3b3JrLFxuICogYnkgb2J0YWluaW5nIHRoaXMgZnJvbSB0aGUgTm90aWZpZXIgdG8gYmUgcmVwbGljYXRlZCwgYW5kIGFwcGx5aW5nXG4gKiBgbWFrZU5vdGlmaWVyYCB0byBpdCBhdCB0aGUgbmV3IHNpdGUgdG8gZ2V0IGFuIGVxdWl2YWxlbnQgbG9jYWxcbiAqIE5vdGlmaWVyIGF0IHRoYXQgc2l0ZS5cbiAqL1xuZ2V0U2hhcmFibGVOb3RpZmllckludGVybmFsczooKT0+c2hhcmFibGVJbnRlcm5hbHNQLFxuZ2V0U3RvcmVLZXk6KCk9PmhhcmRlbih7bm90aWZpZXJ9KX0pO1xuXG5yZXR1cm4gbm90aWZpZXI7XG4gfTtcblxuLyoqXG4gKiBQcm9kdWNlcyBhIHBhaXIgb2Ygb2JqZWN0cywgd2hpY2ggYWxsb3cgYSBzZXJ2aWNlIHRvIHByb2R1Y2UgYSBzdHJlYW0gb2ZcbiAqIHVwZGF0ZSBwcm9taXNlcy5cbiAqXG4gKiBUaGUgaW5pdGlhbCBzdGF0ZSBhcmd1bWVudCBoYXMgdG8gYmUgdHJ1bHkgb3B0aW9uYWwgZXZlbiB0aG91Z2ggaXQgY2FuXG4gKiBiZSBhbnkgZmlyc3QgY2xhc3MgdmFsdWUgaW5jbHVkaW5nIGB1bmRlZmluZWRgLiBXZSBuZWVkIHRvIGRpc3Rpbmd1aXNoIHRoZVxuICogcHJlc2VuY2UgdnMgdGhlIGFic2VuY2Ugb2YgaXQsIHdoaWNoIHdlIGNhbm5vdCBkbyB3aXRoIHRoZSBvcHRpb25hbCBhcmd1bWVudFxuICogc3ludGF4LiBSYXRoZXIgd2UgdXNlIHRoZSBhcml0eSBvZiB0aGUgYGluaXRpYWxTdGF0ZUFycmAgYXJyYXkuXG4gKlxuICogSWYgbm8gaW5pdGlhbCBzdGF0ZSBpcyBwcm92aWRlZCB0byBgbWFrZU5vdGlmaWVyS2l0YCwgdGhlbiBpdCBzdGFydHMgd2l0aG91dFxuICogYW4gaW5pdGlhbCBzdGF0ZS4gSXRzIGluaXRpYWwgc3RhdGUgd2lsbCBpbnN0ZWFkIGJlIHRoZSBzdGF0ZSBvZiB0aGUgZmlyc3RcbiAqIHVwZGF0ZS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtbXSB8IFtUXX0gaW5pdGlhbFN0YXRlQXJyIHRoZSBmaXJzdCBzdGF0ZSB0byBiZSByZXR1cm5lZCAodHlwZWQgYXMgcmVzdCBhcnJheSB0byBwZXJtaXQgYHVuZGVmaW5lZGApXG4gKiBAcmV0dXJucyB7Tm90aWZpZXJSZWNvcmQ8VD59IHRoZSBub3RpZmllciBhbmQgdXBkYXRlclxuICovJGjigI1fb25jZS5tYWtlTm90aWZpZXIobWFrZU5vdGlmaWVyKTtcbmNvbnN0ICAgICAgICBtYWtlTm90aWZpZXJLaXQ9KC4uLmluaXRpYWxTdGF0ZUFycik9Pntcbi8qKiBAdHlwZSB7UHJvbWlzZVJlY29yZDxVcGRhdGVSZWNvcmQ8VD4+fHVuZGVmaW5lZH0gKi9cbmxldCBvcHROZXh0UHJvbWlzZUtpdDtcbi8qKiBAdHlwZSB7VXBkYXRlQ291bnQgJiAobnVtYmVyIHwgdW5kZWZpbmVkKX0gKi9cbmxldCBjdXJyZW50VXBkYXRlQ291bnQ9MTsvKiBhdm9pZCBmYWxzeSBudW1iZXJzKi9cbi8qKiBAdHlwZSB7VXBkYXRlUmVjb3JkPFQ+fHVuZGVmaW5lZH0gKi9cbmxldCBjdXJyZW50UmVzcG9uc2U7XG5cbmNvbnN0IGhhc1N0YXRlPSgpPT5jdXJyZW50UmVzcG9uc2UhPT11bmRlZmluZWQ7XG5cbmNvbnN0IGZpbmFsPSgpPT5jdXJyZW50VXBkYXRlQ291bnQ9PT11bmRlZmluZWQ7XG5cbmNvbnN0IGJhc2VOb3RpZmllcj1GYXIoJ2Jhc2VOb3RpZmllcicse1xuLyogTmFOIG1hdGNoZXMgbm90aGluZyovXG5nZXRVcGRhdGVTaW5jZSh1cGRhdGVDb3VudD1OYU4pe1xuaWYoXG5oYXNTdGF0ZSgpJiYoXG5maW5hbCgpfHxcbmN1cnJlbnRSZXNwb25zZSYmY3VycmVudFJlc3BvbnNlLnVwZGF0ZUNvdW50IT09dXBkYXRlQ291bnQpKVxue1xuLyogSWYgaGFzU3RhdGUoKSBhbmQgZWl0aGVyIGl0IGlzIGZpbmFsKCkgb3IgaXQgaXMqL1xuLyogbm90IHRoZSBzdGF0ZSBvZiB1cGRhdGVDb3VudCwgcmV0dXJuIHRoZSBjdXJyZW50IHN0YXRlLiovXG5hc3NlcnQoY3VycmVudFJlc3BvbnNlIT09dW5kZWZpbmVkKTtcbnJldHVybiBQcm9taXNlLnJlc29sdmUoY3VycmVudFJlc3BvbnNlKTtcbiB9XG4vKiBvdGhlcndpc2UgcmV0dXJuIGEgcHJvbWlzZSBmb3IgdGhlIG5leHQgc3RhdGUuKi9cbmlmKCFvcHROZXh0UHJvbWlzZUtpdCl7XG5vcHROZXh0UHJvbWlzZUtpdD1tYWtlUHJvbWlzZUtpdCgpO1xuIH1cbnJldHVybiBvcHROZXh0UHJvbWlzZUtpdC5wcm9taXNlO1xuIH19KTtcblxuXG5jb25zdCBub3RpZmllcj1GYXIoJ25vdGlmaWVyJyx7XG4uLi5tYWtlTm90aWZpZXIoYmFzZU5vdGlmaWVyKSxcbi4uLmJhc2VOb3RpZmllcn0pO1xuXG5cbmNvbnN0IHVwZGF0ZXI9RmFyKCd1cGRhdGVyJyx7XG51cGRhdGVTdGF0ZShzdGF0ZSl7XG5pZihmaW5hbCgpKXtcbnRocm93IG5ldyBFcnJvcignQ2Fubm90IHVwZGF0ZSBzdGF0ZSBhZnRlciB0ZXJtaW5hdGlvbi4nKTtcbiB9XG5cbi8qIGJlY29tZSBoYXNTdGF0ZSgpICYmICFmaW5hbCgpKi9cbmFzc2VydChjdXJyZW50VXBkYXRlQ291bnQpO1xuY3VycmVudFVwZGF0ZUNvdW50Kz0xO1xuY3VycmVudFJlc3BvbnNlPWhhcmRlbih7XG52YWx1ZTpzdGF0ZSxcbnVwZGF0ZUNvdW50OmN1cnJlbnRVcGRhdGVDb3VudH0pO1xuXG5pZihvcHROZXh0UHJvbWlzZUtpdCl7XG5vcHROZXh0UHJvbWlzZUtpdC5yZXNvbHZlKGN1cnJlbnRSZXNwb25zZSk7XG5vcHROZXh0UHJvbWlzZUtpdD11bmRlZmluZWQ7XG4gfVxuIH0sXG5cbmZpbmlzaChmaW5hbFN0YXRlKXtcbmlmKGZpbmFsKCkpe1xudGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZmluaXNoIGFmdGVyIHRlcm1pbmF0aW9uLicpO1xuIH1cblxuLyogYmVjb21lIGhhc1N0YXRlKCkgJiYgZmluYWwoKSovXG5jdXJyZW50VXBkYXRlQ291bnQ9dW5kZWZpbmVkO1xuY3VycmVudFJlc3BvbnNlPWhhcmRlbih7XG52YWx1ZTpmaW5hbFN0YXRlLFxudXBkYXRlQ291bnQ6Y3VycmVudFVwZGF0ZUNvdW50fSk7XG5cbmlmKG9wdE5leHRQcm9taXNlS2l0KXtcbm9wdE5leHRQcm9taXNlS2l0LnJlc29sdmUoY3VycmVudFJlc3BvbnNlKTtcbm9wdE5leHRQcm9taXNlS2l0PXVuZGVmaW5lZDtcbiB9XG4gfSxcblxuZmFpbChyZWFzb24pe1xuaWYoZmluYWwoKSl7XG50aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBmYWlsIGFmdGVyIHRlcm1pbmF0aW9uLicpO1xuIH1cblxuLyogYmVjb21lICFoYXNTdGF0ZSgpICYmIGZpbmFsKCkqL1xuY3VycmVudFVwZGF0ZUNvdW50PXVuZGVmaW5lZDtcbmN1cnJlbnRSZXNwb25zZT11bmRlZmluZWQ7XG5pZighb3B0TmV4dFByb21pc2VLaXQpe1xub3B0TmV4dFByb21pc2VLaXQ9bWFrZVByb21pc2VLaXQoKTtcbiB9XG4vKiBEb24ndCB0cmlnZ2VyIE5vZGUuanMncyBVbmhhbmRsZWRQcm9taXNlUmVqZWN0aW9uV2FybmluZyovXG5vcHROZXh0UHJvbWlzZUtpdC5wcm9taXNlLmNhdGNoKChfKT0+eyB9KTtcbm9wdE5leHRQcm9taXNlS2l0LnJlamVjdChyZWFzb24pO1xuIH19KTtcblxuXG5hc3NlcnQoaW5pdGlhbFN0YXRlQXJyLmxlbmd0aDw9MSwndG9vIG1hbnkgYXJndW1lbnRzJyk7XG5pZihpbml0aWFsU3RhdGVBcnIubGVuZ3RoPT09MSl7XG51cGRhdGVyLnVwZGF0ZVN0YXRlKGluaXRpYWxTdGF0ZUFyclswXSk7XG4gfVxuXG4vKiBub3RpZmllciBmYWNldCBpcyBzZXBhcmF0ZSBzbyBpdCBjYW4gYmUgaGFuZGVkIG91dCB3aGlsZSB1cGRhdGVyKi9cbi8qIGlzIHRpZ2h0bHkgaGVsZCovXG5yZXR1cm4gaGFyZGVuKHtub3RpZmllcix1cGRhdGVyfSk7XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPFN1YnNjcmliZXI8VD4+fSBzdWJzY3JpYmVyUFxuICogQHJldHVybnMge05vdGlmaWVyPFQ+fVxuICovJGjigI1fb25jZS5tYWtlTm90aWZpZXJLaXQobWFrZU5vdGlmaWVyS2l0KTtcbmNvbnN0ICAgICAgICBtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlcj0oc3Vic2NyaWJlclApPT57XG4vKiogQHR5cGUge2JpZ2ludH0gKi9cbmxldCBsYXRlc3RJbmJvdW5kQ291bnQ7XG4vKiogQHR5cGUge1VwZGF0ZUNvdW50ICYgYmlnaW50fSAqL1xubGV0IGxhdGVzdFVwZGF0ZUNvdW50PTBuO1xuLyoqIEB0eXBlIHtXZWFrTWFwPFB1YmxpY2F0aW9uUmVjb3JkPFQ+LCBQcm9taXNlPFVwZGF0ZVJlY29yZDxUPj4+fSAqL1xuY29uc3Qgb3V0Ym91bmRSZXN1bHRzPW5ldyBXZWFrTWFwKCk7XG5cbi8qKlxuICogQHBhcmFtIHtQdWJsaWNhdGlvblJlY29yZDxUPn0gcmVjb3JkXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxVcGRhdGVSZWNvcmQ8VD4+fVxuICovXG5jb25zdCB0cmFuc2xhdGVJbmJvdW5kUHVibGljYXRpb25SZWNvcmQ9KHJlY29yZCk9Pntcbi8qIExldmVyYWdlIGlkZW50aXR5IHByZXNlcnZhdGlvbiBvZiBgcmVjb3JkYC4qL1xuY29uc3QgZXhpc3RpbmdPdXRib3VuZFJlc3VsdD1vdXRib3VuZFJlc3VsdHMuZ2V0KHJlY29yZCk7XG5pZihleGlzdGluZ091dGJvdW5kUmVzdWx0KXtcbnJldHVybiBleGlzdGluZ091dGJvdW5kUmVzdWx0O1xuIH1cblxubGF0ZXN0SW5ib3VuZENvdW50PXJlY29yZC5wdWJsaXNoQ291bnQ7XG5sYXRlc3RVcGRhdGVDb3VudCs9MW47XG5jb25zdCByZXN1bHRQPUUud2hlbihyZWNvcmQuaGVhZCwoe3ZhbHVlLGRvbmV9KT0+e1xuaWYoZG9uZSl7XG4vKiBGaW5hbCByZXN1bHRzIGhhdmUgdW5kZWZpbmVkIHVwZGF0ZUNvdW50LiovXG5yZXR1cm4gaGFyZGVuKHt2YWx1ZSx1cGRhdGVDb3VudDp1bmRlZmluZWR9KTtcbiB9XG5yZXR1cm4gaGFyZGVuKHt2YWx1ZSx1cGRhdGVDb3VudDpsYXRlc3RVcGRhdGVDb3VudH0pO1xuIH0pO1xub3V0Ym91bmRSZXN1bHRzLnNldChyZWNvcmQscmVzdWx0UCk7XG5yZXR1cm4gcmVzdWx0UDtcbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZSB7QmFzZU5vdGlmaWVyPFQ+fVxuICovXG5jb25zdCBiYXNlTm90aWZpZXI9RmFyKCdiYXNlTm90aWZpZXInLHtcbmdldFVwZGF0ZVNpbmNlKHVwZGF0ZUNvdW50PS0xbil7XG5hc3NlcnQoXG51cGRhdGVDb3VudDw9bGF0ZXN0VXBkYXRlQ291bnQsXG4nYXJndW1lbnQgbXVzdCBiZSBhIHByZXZpb3VzbHktaXNzdWVkIHVwZGF0ZUNvdW50LicpO1xuXG5cbmlmKHVwZGF0ZUNvdW50PGxhdGVzdFVwZGF0ZUNvdW50KXtcbi8qIFJldHVybiB0aGUgbW9zdCByZWNlbnQgcmVzdWx0IHBvc3NpYmxlIHdpdGhvdXQgaW1wb3NpbmcgYW4gdW5uZWNlc3NhcnkgZGVsYXkuKi9cbnJldHVybiBFKHN1YnNjcmliZXJQKS5cbnN1YnNjcmliZUFmdGVyKCkuXG50aGVuKHRyYW5zbGF0ZUluYm91bmRQdWJsaWNhdGlvblJlY29yZCk7XG4gfVxuXG4vKiBSZXR1cm4gYSByZXN1bHQgdGhhdCBmb2xsb3dzIHRoZSBsYXN0LXJldHVybmVkIHJlc3VsdCwqL1xuLyogc2tpcHBpbmcgb3ZlciBpbnRlcm1lZGlhdGUgcmVzdWx0cyBpZiBsYXRlc3RJbmJvdW5kQ291bnQqL1xuLyogbm8gbG9uZ2VyIGNvcnJlc3BvbmRzIHdpdGggdGhlIGxhdGVzdCByZXN1bHQuKi9cbi8qIE5vdGUgdGhhdCB1bmxpa2Ugbm90aWZpZXJzIGFuZCBzdWJzY3JpYmVycyByZXNwZWN0aXZlbHkgcmV0dXJuZWQgYnkqL1xuLyogbWFrZU5vdGlmaWVyS2l0IGFuZCBtYWtlUHVibGlzaEtpdCwgdGhpcyByZXN1bHQgaXMgbm90IGd1YXJhbnRlZWQqL1xuLyogdG8gZm9sbG93IHRoZSByZXN1bHQgcmV0dXJuZWQgd2hlbiBhIG5vbi1sYXRlc3QgdXBkYXRlQ291bnQgaXMgcHJvdmlkZWQqL1xuLyogKGUuZy4sIGl0IGlzIHBvc3NpYmxlIGZvciBgbm90aWZpZXJGcm9tU3Vic2NyaWJlci5nZXRVcGRhdGVTaW5jZSgpYCBhbmQqL1xuLyogYG5vdGlmaWVyRnJvbVN1YnNjcmliZXIuZ2V0VXBkYXRlU2luY2UobGF0ZXN0VXBkYXRlQ291bnQpYCB0byBib3RoKi9cbi8qIHNldHRsZSB0byB0aGUgc2FtZSBvYmplY3QgYG5ld0xhdGVzdGAgd2hlcmUgYG5ld0xhdGVzdC51cGRhdGVDb3VudGAqL1xuLyogaXMgb25lIGdyZWF0ZXIgdGhhbiBgbGF0ZXN0VXBkYXRlQ291bnRgKS4qL1xucmV0dXJuIEUoc3Vic2NyaWJlclApLlxuc3Vic2NyaWJlQWZ0ZXIobGF0ZXN0SW5ib3VuZENvdW50KS5cbnRoZW4odHJhbnNsYXRlSW5ib3VuZFB1YmxpY2F0aW9uUmVjb3JkKTtcbiB9fSk7XG5cblxuLyoqIEB0eXBlIHtOb3RpZmllcjxUPn0gKi9cbmNvbnN0IG5vdGlmaWVyPUZhcignbm90aWZpZXInLHtcbi4uLm1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyKGJhc2VOb3RpZmllciksXG4uLi5iYXNlTm90aWZpZXIsXG5cbi8qKlxuICogVXNlIHRoaXMgdG8gZGlzdHJpYnV0ZSBhIE5vdGlmaWVyIGVmZmljaWVudGx5IG92ZXIgdGhlIG5ldHdvcmssXG4gKiBieSBvYnRhaW5pbmcgdGhpcyBmcm9tIHRoZSBOb3RpZmllciB0byBiZSByZXBsaWNhdGVkLCBhbmQgYXBwbHlpbmdcbiAqIGBtYWtlTm90aWZpZXJgIHRvIGl0IGF0IHRoZSBuZXcgc2l0ZSB0byBnZXQgYW4gZXF1aXZhbGVudCBsb2NhbFxuICogTm90aWZpZXIgYXQgdGhhdCBzaXRlLlxuICovXG5nZXRTaGFyYWJsZU5vdGlmaWVySW50ZXJuYWxzOigpPT5iYXNlTm90aWZpZXIsXG5nZXRTdG9yZUtleTooKT0+aGFyZGVuKHtub3RpZmllcn0pfSk7XG5cbnJldHVybiBub3RpZmllcjtcbiB9OyRo4oCNX29uY2UubWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIobWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIpO1xuaGFyZGVuKG1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyKTtcblxuLyoqXG4gKiBBZGFwdG9yIGZyb20gYXN5bmMgaXRlcmFibGUgdG8gbm90aWZpZXIuXG4gKlxuICogQGRlcHJlY2F0ZWQgVGhlIHJlc3VsdGluZyBub3RpZmllciBpcyBsb3NzbGVzcywgd2hpY2ggaXMgbm90IGRlc2lyYWJsZS5cbiAqIFByZWZlciBtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlciwgYW5kIHJlZmVyIHRvXG4gKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzU0MTMgYW5kXG4gKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvcHVsbC81Njk1IGZvciBjb250ZXh0LlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8QXN5bmNJdGVyYWJsZTxUPj59IGFzeW5jSXRlcmFibGVQXG4gKiBAcmV0dXJucyB7Tm90aWZpZXI8VD59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZT0oYXN5bmNJdGVyYWJsZVApPT57XG5jb25zdCBpdGVyYXRvclA9RShhc3luY0l0ZXJhYmxlUClbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk7XG5cbi8qKiBAdHlwZSB7UHJvbWlzZTxVcGRhdGVSZWNvcmQ8VD4+fHVuZGVmaW5lZH0gKi9cbmxldCBvcHROZXh0UHJvbWlzZTtcbi8qKiBAdHlwZSB7VXBkYXRlQ291bnQgJiBiaWdpbnR9ICovXG5sZXQgY3VycmVudFVwZGF0ZUNvdW50PTBuO1xuLyoqIEB0eXBlIHtFUmVmPFVwZGF0ZVJlY29yZDxUPj58dW5kZWZpbmVkfSAqL1xubGV0IGN1cnJlbnRSZXNwb25zZTtcbmxldCBmaW5hbD1mYWxzZTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGUge0Jhc2VOb3RpZmllcjxUPn1cbiAqL1xuY29uc3QgYmFzZU5vdGlmaWVyPUZhcignYmFzZU5vdGlmaWVyJyx7XG5nZXRVcGRhdGVTaW5jZSh1cGRhdGVDb3VudD0tMW4pe1xuaWYodXBkYXRlQ291bnQ8Y3VycmVudFVwZGF0ZUNvdW50KXtcbmlmKGN1cnJlbnRSZXNwb25zZSl7XG5yZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGN1cnJlbnRSZXNwb25zZSk7XG4gfVxuIH1lbHNlIGlmKHVwZGF0ZUNvdW50IT09Y3VycmVudFVwZGF0ZUNvdW50KXtcbnRocm93IG5ldyBFcnJvcihcbidnZXRVcGRhdGVTaW5jZSBhcmd1bWVudCBtdXN0IGJlIGEgcHJldmlvdXNseS1pc3N1ZWQgdXBkYXRlQ291bnQuJyk7XG5cbiB9XG5cbi8qIFJldHVybiBhIGZpbmFsIHJlc3BvbnNlIGlmIHdlIGhhdmUgb25lLCBvdGhlcndpc2UgYSBwcm9taXNlIGZvciB0aGUgbmV4dCBzdGF0ZS4qL1xuaWYoZmluYWwpe1xuYXNzZXJ0KGN1cnJlbnRSZXNwb25zZSE9PXVuZGVmaW5lZCk7XG5yZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGN1cnJlbnRSZXNwb25zZSk7XG4gfVxuaWYoIW9wdE5leHRQcm9taXNlKXtcbmNvbnN0IG5leHRJdGVyUmVzdWx0UD1FKGl0ZXJhdG9yUCkubmV4dCgpO1xub3B0TmV4dFByb21pc2U9RS53aGVuKFxubmV4dEl0ZXJSZXN1bHRQLFxuKHtkb25lLHZhbHVlfSk9PntcbmFzc2VydCghZmluYWwpO1xuaWYoZG9uZSl7XG5maW5hbD10cnVlO1xuIH1cbmN1cnJlbnRVcGRhdGVDb3VudCs9MW47XG5jdXJyZW50UmVzcG9uc2U9aGFyZGVuKHtcbnZhbHVlLFxudXBkYXRlQ291bnQ6ZG9uZT91bmRlZmluZWQ6Y3VycmVudFVwZGF0ZUNvdW50fSk7XG5cbm9wdE5leHRQcm9taXNlPXVuZGVmaW5lZDtcbnJldHVybiBjdXJyZW50UmVzcG9uc2U7XG4gfSxcbihfcmVhc29uKT0+e1xuZmluYWw9dHJ1ZTtcbmN1cnJlbnRSZXNwb25zZT1cbi8qKiBAdHlwZSB7UHJvbWlzZTxVcGRhdGVSZWNvcmQ8VD4+fSAqL1xubmV4dEl0ZXJSZXN1bHRQO1xub3B0TmV4dFByb21pc2U9dW5kZWZpbmVkO1xucmV0dXJuIGN1cnJlbnRSZXNwb25zZTtcbiB9KTtcblxuIH1cbnJldHVybiBvcHROZXh0UHJvbWlzZTtcbiB9fSk7XG5cblxuLyoqIEB0eXBlIHtOb3RpZmllcjxUPn0gKi9cbmNvbnN0IG5vdGlmaWVyPUZhcignbm90aWZpZXInLHtcbi8qIERvbid0IGxlYWsgdGhlIG9yaWdpbmFsIGFzeW5jSXRlcmFibGVQIHNpbmNlIGl0IG1heSBiZSByZW1vdGUgYW5kIHdlIGFsc28qL1xuLyogd2FudCB0aGUgc2FtZSBzZW1hbnRpY3MgZm9yIHRoaXMgZXhwb3NlZCBpdGVyYWJsZSBhbmQgdGhlIGJhc2VOb3RpZmllci4qL1xuLi4ubWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIoYmFzZU5vdGlmaWVyKSxcbi4uLmJhc2VOb3RpZmllcixcblxuLyoqXG4gKiBVc2UgdGhpcyB0byBkaXN0cmlidXRlIGEgTm90aWZpZXIgZWZmaWNpZW50bHkgb3ZlciB0aGUgbmV0d29yayxcbiAqIGJ5IG9idGFpbmluZyB0aGlzIGZyb20gdGhlIE5vdGlmaWVyIHRvIGJlIHJlcGxpY2F0ZWQsIGFuZCBhcHBseWluZ1xuICogYG1ha2VOb3RpZmllcmAgdG8gaXQgYXQgdGhlIG5ldyBzaXRlIHRvIGdldCBhbiBlcXVpdmFsZW50IGxvY2FsXG4gKiBOb3RpZmllciBhdCB0aGF0IHNpdGUuXG4gKi9cbmdldFNoYXJhYmxlTm90aWZpZXJJbnRlcm5hbHM6KCk9PmJhc2VOb3RpZmllcixcbmdldFN0b3JlS2V5OigpPT5oYXJkZW4oe25vdGlmaWVyfSl9KTtcblxucmV0dXJuIG5vdGlmaWVyO1xuIH07JGjigI1fb25jZS5tYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZShtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSk7XG5oYXJkZW4obWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VOb3RpZmllciI6WyJtYWtlTm90aWZpZXIiXSwibWFrZU5vdGlmaWVyS2l0IjpbIm1ha2VOb3RpZmllcktpdCJdLCJtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlciI6WyJtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlciJdLCJtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSI6WyJtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADUg33V9jIAAPYyAAAqAAAAQGFnb3JpYy9ub3RpZmllci12MC41LjEvc3JjL3B1Ymxpc2gta2l0LmpzeyJpbXBvcnRzIjpbIi4vdHlwZXMtYW1iaWVudC5qcyIsIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL3ZhdC1kYXRhIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL21hcnNoYWwiLCJAZW5kby9wcm9taXNlLWtpdCJdLCJleHBvcnRzIjpbIlB1Ymxpc2hlckkiLCJTdWJzY3JpYmVySSIsIlN1YnNjcmliZXJTaGFwZSIsIm1ha2VQdWJsaXNoS2l0IiwicHVibGlzaEtpdElLaXQiLCJzdWJzY3JpYmVFYWNoIiwic3Vic2NyaWJlTGF0ZXN0Iiwidml2aWZ5RHVyYWJsZVB1Ymxpc2hLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgSGFuZGxlZFByb21pc2UsRSxtYWtlUHJvbWlzZUtpdCxGYXIsTSxjYW5CZUR1cmFibGUsdml2aWZ5RmFyQ2xhc3NLaXQ7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiSGFuZGxlZFByb21pc2VcIiwgWyRo4oCNX2EgPT4gKEhhbmRsZWRQcm9taXNlID0gJGjigI1fYSldXSxbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJtYWtlUHJvbWlzZUtpdFwiLCBbJGjigI1fYSA9PiAobWFrZVByb21pc2VLaXQgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiTVwiLCBbJGjigI1fYSA9PiAoTSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJjYW5CZUR1cmFibGVcIiwgWyRo4oCNX2EgPT4gKGNhbkJlRHVyYWJsZSA9ICRo4oCNX2EpXV0sW1widml2aWZ5RmFyQ2xhc3NLaXRcIiwgWyRo4oCNX2EgPT4gKHZpdmlmeUZhckNsYXNzS2l0ID0gJGjigI1fYSldXV1dLFtcIi4vdHlwZXMtYW1iaWVudC5qc1wiLCBbXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cbmNvbnN0e0ZhaWwscXVvdGU6cX09YXNzZXJ0O1xuXG5jb25zdCBzaW5rPSgpPT57IH07XG5jb25zdCBtYWtlUXVpZXRSZWplY3Rpb249KHJlYXNvbik9PntcbmNvbnN0IHJlamVjdGlvbj1IYW5kbGVkUHJvbWlzZS5yZWplY3QocmVhc29uKTtcbnZvaWQgRS53aGVuKHJlamVjdGlvbixzaW5rLHNpbmspO1xucmV0dXJuIGhhcmRlbihyZWplY3Rpb24pO1xuIH07XG5cbi8qKlxuICogQXN5bmNyb25vdXNseSBpdGVyYXRlcyBvdmVyIHRoZSBjb250ZW50cyBvZiBhIFB1YmxpY2F0aW9uTGlzdCBhcyB0aGV5IGFwcGVhci5cbiAqIFRoaXMgaXRlcmF0aW9uIG11c3QgZHJvcCBwYXJ0cyBvZiBwdWJsaWNhdGlvbiByZWNvcmRzIHRoYXQgYXJlIG5vIGxvbmdlclxuICogbmVlZGVkIHNvIHRoZXkgY2FuIGJlIGdhcmJhZ2UgY29sbGVjdGVkLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1B1YmxpY2F0aW9uTGlzdDxUPn0gcHViTGlzdFxuICogQHJldHVybnMge0FzeW5jSXRlcmF0b3I8VD59XG4gKi9cbmNvbnN0IG1ha2VFYWNoSXRlcmF0b3I9KHB1Ykxpc3QpPT57XG4vKiBUbyB1bmRlcnN0YW5kIHRoZSBpbXBsZW1lbnRhdGlvbiwgc3RhcnQgd2l0aCovXG4vKiBodHRwczovL3dlYi5hcmNoaXZlLm9yZy93ZWIvMjAxNjA0MDQxMjIyNTAvaHR0cDovL3dpa2kuZWNtYXNjcmlwdC5vcmcvZG9rdS5waHA/aWQ9c3RyYXdtYW46Y29uY3VycmVuY3kjaW5maW5pdGVfcXVldWUqL1xucmV0dXJuIEZhcignRWFjaEl0ZXJhdG9yJyx7XG5uZXh0OigpPT57XG5jb25zdCByZXN1bHRQPUUuZ2V0KHB1Ykxpc3QpLmhlYWQ7XG5wdWJMaXN0PUUuZ2V0KHB1Ykxpc3QpLnRhaWw7XG4vKiBXZSBleHBlY3QgdGhlIHRhaWwgdG8gYmUgdGhlIFwiY2Fubm90IHJlYWQgcGFzdCBlbmRcIiBlcnJvciBhdCB0aGUgZW5kKi9cbi8qIG9mIHRoZSBoYXBweSBwYXRoLiovXG4vKiBTaW5jZSB3ZSBhcmUgd3JhcHBpbmcgdGhhdCBlcnJvciB3aXRoIGV2ZW50dWFsIHNlbmQsIHdlIHNpbmsgdGhlKi9cbi8qIHJlamVjdGlvbiBoZXJlIHRvbyBzbyBpdCBkb2Vzbid0IGJlY29tZSBhbiBpbnZhbGlkIHVuaGFuZGxlZCByZWplY3Rpb24qL1xuLyogbGF0ZXIuKi9cbnZvaWQgRS53aGVuKHB1Ykxpc3Qsc2luayxzaW5rKTtcbnJldHVybiByZXN1bHRQO1xuIH19KTtcblxuIH07XG5cbi8qKlxuICogR2l2ZW4gYSBsb2NhbCBvciByZW1vdGUgc3Vic2NyaWJlciwgcmV0dXJucyBhIGxvY2FsIEFzeW5jSXRlcmFibGUgd2hpY2hcbiAqIHByb3ZpZGVzIFwicHJlZml4IGxvc3N5XCIgaXRlcmF0aW9ucyBvZiB0aGUgdW5kZXJseWluZyBQdWJsaWNhdGlvbkxpc3QuXG4gKiBCeSBcInByZWZpeCBsb3NzeVwiLCB3ZSBtZWFuIHRoYXQgeW91IG1heSBtaXNzIGV2ZXJ5dGhpbmcgcHVibGlzaGVkIGJlZm9yZVxuICogeW91IGFzayB0aGUgcmV0dXJuZWQgaXRlcmFibGUgZm9yIGFuIGl0ZXJhdG9yLiBCdXQgdGhlIHJldHVybmVkIGl0ZXJhdG9yXG4gKiB3aWxsIGVudW1lcmF0ZSBlYWNoIHRoaW5nIHB1Ymxpc2hlZCBmcm9tIHRoYXQgaXRlcmF0b3IncyBzdGFydGluZyBwb2ludC5cbiAqXG4gKiBJZiB0aGUgdW5kZXJseWluZyBQdWJsaWNhdGlvbkxpc3QgaXMgdGVybWluYXRlZCwgdGhhdCB0ZXJtaW5hbCB2YWx1ZSB3aWxsIGJlXG4gKiByZXBvcnRlZCBsb3NzbGVzc2x5LlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8U3Vic2NyaWJlcjxUPj59IHN1YnNjcmliZXJcbiAqIEByZXR1cm5zIHtBc3luY0l0ZXJhYmxlPFQ+fVxuICovXG5jb25zdCAgICAgICAgc3Vic2NyaWJlRWFjaD0oc3Vic2NyaWJlcik9PntcbmNvbnN0IGl0ZXJhYmxlPUZhcignRWFjaEl0ZXJhYmxlJyx7XG5bU3ltYm9sLmFzeW5jSXRlcmF0b3JdOigpPT57XG5jb25zdCBwdWJMaXN0PUUoc3Vic2NyaWJlcikuc3Vic2NyaWJlQWZ0ZXIoKTtcbnJldHVybiBtYWtlRWFjaEl0ZXJhdG9yKHB1Ykxpc3QpO1xuIH19KTtcblxucmV0dXJuIGl0ZXJhYmxlO1xuIH07JGjigI1fb25jZS5zdWJzY3JpYmVFYWNoKHN1YnNjcmliZUVhY2gpO1xuaGFyZGVuKHN1YnNjcmliZUVhY2gpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8U3Vic2NyaWJlcjxUPj59IHN1YnNjcmliZXJcbiAqIEByZXR1cm5zIHtBc3luY0l0ZXJhdG9yPFQ+fVxuICovXG5jb25zdCBtYWtlTGF0ZXN0SXRlcmF0b3I9KHN1YnNjcmliZXIpPT57XG5sZXQgbGF0ZXN0UHVibGlzaENvdW50O1xucmV0dXJuIEZhcignTGF0ZXN0SXRlcmF0b3InLHtcbm5leHQ6KCk9PntcbmNvbnN0IHB1Ykxpc3Q9RShzdWJzY3JpYmVyKS5zdWJzY3JpYmVBZnRlcihsYXRlc3RQdWJsaXNoQ291bnQpO1xuLyogV2l0aG91dCBhbiBvblJlamVjdGlvbiwgaWYgcHViTGlzdCBpcyBhIHJlamVjdGlvbiwgdGhpcyB3aWxsKi9cbi8qIHByb3BhZ2F0ZSB0aGUgcmVqZWN0aW9uIGFzIGl0IHNob3VsZC4qL1xucmV0dXJuIEUud2hlbihwdWJMaXN0LCh7aGVhZCxwdWJsaXNoQ291bnR9KT0+e1xubGF0ZXN0UHVibGlzaENvdW50PXB1Ymxpc2hDb3VudDtcbnJldHVybiBoZWFkO1xuIH0pO1xuIH19KTtcblxuIH07XG5cbi8qKlxuICogR2l2ZW4gYSBsb2NhbCBvciByZW1vdGUgc3Vic2NyaWJlciwgcmV0dXJucyBhIGxvY2FsIEFzeW5jSXRlcmFibGUgd2hpY2hcbiAqIHByb3ZpZGVzIFwibG9zc3lcIiBpdGVyYXRpb25zIG9mIHRoZSB1bmRlcmx5aW5nIFB1YmxpY2F0aW9uTGlzdC5cbiAqIEJ5IFwibG9zc3lcIiwgd2UgbWVhbiB0aGF0IHlvdSBtYXkgbWlzcyBhbnkgcHVibGlzaGVkIHN0YXRlIGlmIGEgbW9yZVxuICogcmVjZW50IHB1Ymxpc2hlZCBzdGF0ZSBjYW4gYmUgcmVwb3J0ZWQgaW5zdGVhZC5cbiAqXG4gKiBJZiB0aGUgdW5kZXJseWluZyBQdWJsaWNhdGlvbkxpc3QgaXMgdGVybWluYXRlZCwgdGhhdCB0ZXJtaW5hbCB2YWx1ZSB3aWxsIGJlXG4gKiByZXBvcnRlZCBsb3NzbGVzc2x5LlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8U3Vic2NyaWJlcjxUPj59IHN1YnNjcmliZXJcbiAqIEByZXR1cm5zIHtBc3luY0l0ZXJhYmxlPFQ+fVxuICovXG5jb25zdCAgICAgICAgc3Vic2NyaWJlTGF0ZXN0PShzdWJzY3JpYmVyKT0+e1xuY29uc3QgaXRlcmFibGU9RmFyKCdMYXRlc3RJdGVyYWJsZScse1xuW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTooKT0+bWFrZUxhdGVzdEl0ZXJhdG9yKHN1YnNjcmliZXIpfSk7XG5cbnJldHVybiBpdGVyYWJsZTtcbiB9OyRo4oCNX29uY2Uuc3Vic2NyaWJlTGF0ZXN0KHN1YnNjcmliZUxhdGVzdCk7XG5oYXJkZW4oc3Vic2NyaWJlTGF0ZXN0KTtcblxuY29uc3QgICAgICAgIFB1Ymxpc2hlckk9TS5pbnRlcmZhY2UoJ1B1Ymxpc2hlcicse1xucHVibGlzaDpNLmNhbGwoTS5hbnkoKSkucmV0dXJucygpLFxuZmluaXNoOk0uY2FsbChNLmFueSgpKS5yZXR1cm5zKCksXG5mYWlsOk0uY2FsbChNLmFueSgpKS5yZXR1cm5zKCl9KTskaOKAjV9vbmNlLlB1Ymxpc2hlckkoUHVibGlzaGVySSk7XG5cbmNvbnN0ICAgICAgICBTdWJzY3JpYmVyST1NLmludGVyZmFjZSgnU3Vic2NyaWJlcicse1xuc3Vic2NyaWJlQWZ0ZXI6TS5jYWxsKCkub3B0aW9uYWwoTS5iaWdpbnQoKSkucmV0dXJucyhNLnByb21pc2UoKSl9KTskaOKAjV9vbmNlLlN1YnNjcmliZXJJKFN1YnNjcmliZXJJKTtcblxuY29uc3QgICAgICAgIHB1Ymxpc2hLaXRJS2l0PWhhcmRlbih7XG5wdWJsaXNoZXI6UHVibGlzaGVySSxcbnN1YnNjcmliZXI6U3Vic2NyaWJlckl9KTtcblxuXG4vKipcbiAqIE1ha2VzIGEgYHsgcHVibGlzaGVyLCBzdWJzY3JpYmVyIH1gIHBhaXIgZm9yIGRvaW5nIGVmZmljaWVudFxuICogZGlzdHJpYnV0ZWQgcHViL3N1YiBzdXBwb3J0aW5nIGJvdGggXCJlYWNoXCIgYW5kIFwibGF0ZXN0XCIgaXRlcmF0aW9uXG4gKiBvZiBwdWJsaXNoZWQgdmFsdWVzLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcmV0dXJucyB7UHVibGlzaEtpdDxUPn1cbiAqLyRo4oCNX29uY2UucHVibGlzaEtpdElLaXQocHVibGlzaEtpdElLaXQpO1xuY29uc3QgICAgICAgIG1ha2VQdWJsaXNoS2l0PSgpPT57XG4vKiogQHR5cGUge1Byb21pc2U8UHVibGljYXRpb25SZWNvcmQ8VD4+fSAqL1xubGV0IHRhaWxQO1xuLyoqIEB0eXBlIHt1bmRlZmluZWQgfCAoKHZhbHVlOiBFUmVmPFB1YmxpY2F0aW9uUmVjb3JkPFQ+PikgPT4gdm9pZCl9ICovXG5sZXQgdGFpbFI7XG4oe3Byb21pc2U6dGFpbFAscmVzb2x2ZTp0YWlsUn09bWFrZVByb21pc2VLaXQoKSk7XG5cbmxldCBjdXJyZW50UHVibGlzaENvdW50PTBuO1xubGV0IGN1cnJlbnRQPXRhaWxQO1xuY29uc3QgYWR2YW5jZUN1cnJlbnQ9KGRvbmUsdmFsdWUscmVqZWN0aW9uKT0+e1xuaWYodGFpbFI9PT11bmRlZmluZWQpe1xudGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgdXBkYXRlIHN0YXRlIGFmdGVyIHRlcm1pbmF0aW9uLicpO1xuIH1cblxuY3VycmVudFB1Ymxpc2hDb3VudCs9MW47XG5jdXJyZW50UD10YWlsUDtcbmNvbnN0IHJlc29sdmVDdXJyZW50PXRhaWxSO1xuXG5pZihkb25lKXtcbnRhaWxQPW1ha2VRdWlldFJlamVjdGlvbihcbm5ldyBFcnJvcignQ2Fubm90IHJlYWQgcGFzdCBlbmQgb2YgaXRlcmF0aW9uLicpKTtcblxudGFpbFI9dW5kZWZpbmVkO1xuIH1lbHNle1xuKHtwcm9taXNlOnRhaWxQLHJlc29sdmU6dGFpbFJ9PW1ha2VQcm9taXNlS2l0KCkpO1xuIH1cblxuaWYocmVqZWN0aW9uKXtcbnJlc29sdmVDdXJyZW50KHJlamVjdGlvbik7XG4gfWVsc2V7XG5yZXNvbHZlQ3VycmVudChcbmhhcmRlbih7XG5oZWFkOnt2YWx1ZSxkb25lfSxcbnB1Ymxpc2hDb3VudDpjdXJyZW50UHVibGlzaENvdW50LFxudGFpbDp0YWlsUH0pKTtcblxuXG4gfVxuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlIHtTdWJzY3JpYmVyPFQ+fVxuICovXG5jb25zdCBzdWJzY3JpYmVyPUZhcignU3Vic2NyaWJlcicse1xuc3Vic2NyaWJlQWZ0ZXI6KHB1Ymxpc2hDb3VudD0tMW4pPT57XG5hc3NlcnQudHlwZW9mKHB1Ymxpc2hDb3VudCwnYmlnaW50Jyk7XG5pZihwdWJsaXNoQ291bnQ9PT1jdXJyZW50UHVibGlzaENvdW50KXtcbnJldHVybiB0YWlsUDtcbiB9ZWxzZSBpZihwdWJsaXNoQ291bnQ8Y3VycmVudFB1Ymxpc2hDb3VudCl7XG5yZXR1cm4gY3VycmVudFA7XG4gfWVsc2V7XG50aHJvdyBuZXcgRXJyb3IoXG4nc3Vic2NyaWJlQWZ0ZXIgYXJndW1lbnQgbXVzdCBiZSBhIHByZXZpb3VzbHktaXNzdWVkIHB1Ymxpc2hDb3VudC4nKTtcblxuIH1cbiB9fSk7XG5cblxuLyoqIEB0eXBlIHtQdWJsaXNoZXI8VD59ICovXG5jb25zdCBwdWJsaXNoZXI9RmFyKCdQdWJsaXNoZXInLHtcbnB1Ymxpc2g6KHZhbHVlKT0+e1xuYWR2YW5jZUN1cnJlbnQoZmFsc2UsdmFsdWUpO1xuIH0sXG5maW5pc2g6KGZpbmFsVmFsdWUpPT57XG5hZHZhbmNlQ3VycmVudCh0cnVlLGZpbmFsVmFsdWUpO1xuIH0sXG5mYWlsOihyZWFzb24pPT57XG5hZHZhbmNlQ3VycmVudCh0cnVlLHVuZGVmaW5lZCxtYWtlUXVpZXRSZWplY3Rpb24ocmVhc29uKSk7XG4gfX0pO1xuXG5yZXR1cm4gaGFyZGVuKHtwdWJsaXNoZXIsc3Vic2NyaWJlcn0pO1xuIH07JGjigI1fb25jZS5tYWtlUHVibGlzaEtpdChtYWtlUHVibGlzaEtpdCk7XG5oYXJkZW4obWFrZVB1Ymxpc2hLaXQpO1xuXG4vKiBUT0RPOiBNb3ZlIGR1cmFibGUgcHVibGlzaCBraXQgdG8gYSBuZXcgZmlsZT8qL1xuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7RHVyYWJsZVB1Ymxpc2hLaXRWYWx1ZUR1cmFiaWxpdHkgJiAnbWFuZGF0b3J5J30gW29wdGlvbnMudmFsdWVEdXJhYmlsaXR5PSdtYW5kYXRvcnknXVxuICogQHJldHVybnMge0R1cmFibGVQdWJsaXNoS2l0U3RhdGV9XG4gKi9cbmNvbnN0IGluaXREdXJhYmxlUHVibGlzaEtpdFN0YXRlPShvcHRpb25zPXt9KT0+e1xuY29uc3R7dmFsdWVEdXJhYmlsaXR5PSdtYW5kYXRvcnknfT1vcHRpb25zO1xuYXNzZXJ0LmVxdWFsKHZhbHVlRHVyYWJpbGl0eSwnbWFuZGF0b3J5Jyk7XG5yZXR1cm57XG4vKiBjb25maWd1cmF0aW9uKi9cbnZhbHVlRHVyYWJpbGl0eSxcblxuLyogbGlmZWN5Y2xlIHByb2dyZXNzKi9cbnB1Ymxpc2hDb3VudDowbixcbnN0YXR1czonbGl2ZScsLyogfCAnZmluaXNoZWQnIHwgJ2ZhaWxlZCcqL1xuXG4vKiBwZXJzaXN0ZWQgcmVzdWx0IGRhdGEqL1xuLyogTm90ZSB0aGF0IGluIGFkZGl0aW9uIHRvIG5vbi10ZXJtaW5hbCB2YWx1ZXMgZnJvbSBgcHVibGlzaGAsKi9cbi8qIHZhbHVlIGFsc28gaG9sZHMgdGhlIHRlcm1pbmFsIHZhbHVlIGZyb20gYGZpbmlzaGAgb3IgYGZhaWxgLiovXG5oYXNWYWx1ZTpmYWxzZSxcbnZhbHVlOnVuZGVmaW5lZH07XG5cbiB9O1xuXG4vKiBXZSBuZWVkIHRoZSBXZWFrTWFwIGtleSBmb3IgYSBraXQgdG8gYmUgYSB2cmVmLWJlYXJpbmcgb2JqZWN0Ki9cbi8qIGluIGl0cyBjb2hvcnQsIGFuZCBoYXZlIGFyYml0cmFyaWx5IGNob3NlbiB0aGUgcHVibGlzaGVyIGZhY2V0LiovXG4vKiogQHR5cGVkZWYge1B1Ymxpc2hlcjwqPn0gRHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxLZXkgKi9cbi8qKlxuICogQHBhcmFtIHtQdWJsaXNoS2l0PCo+fSBmYWNldHNcbiAqIEByZXR1cm5zIHtEdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbEtleX1cbiAqL1xuY29uc3QgZ2V0RXBoZW1lcmFsS2V5PShmYWNldHMpPT5mYWNldHMucHVibGlzaGVyO1xuXG4vKiogQHR5cGUge1dlYWtNYXA8RHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxLZXksIHtjdXJyZW50UCwgdGFpbFAsIHRhaWxSfT59ICovXG5jb25zdCBkdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbERhdGE9bmV3IFdlYWtNYXAoKTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBjdXJyZW50L25leHQtcmVzdWx0IHByb21pc2VzIGFuZCBuZXh0LXJlc3VsdCByZXNvbHZlclxuICogYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gZHVyYWJsZSBwdWJsaXNoIGtpdC5cbiAqIFRoZXkgYXJlIGxvc3Qgb24gdXBncmFkZSwgYnV0IHJlY3JlYXRlZCBvbi1kZW1hbmQuXG4gKiBTdWNoIHJlY3JlYXRpb24gcHJlc2VydmVzIHRoZSB2YWx1ZSBpbiAoYnV0IG5vdCB0aGUgaWRlbnRpdHkgb2YpIHRoZVxuICogY3VycmVudCB7IHZhbHVlLCBkb25lIH0gcmVzdWx0IHdoZW4gcG9zc2libGUsIHdoaWNoIGlzIGFsd2F5cyB0aGVcbiAqIGNhc2Ugd2hlbiB0aGF0IHZhbHVlIGlzIHRlcm1pbmFsIChpLmUuLCBmcm9tIGBmaW5pc2hgIG9yIGBmYWlsYCkgb3JcbiAqIHdoZW4gdGhlIGR1cmFibGUgcHVibGlzaCBraXQgaXMgY29uZmlndXJlZCB3aXRoXG4gKiBgdmFsdWVEdXJhYmlsaXR5OiAnbWFuZGF0b3J5J2AuXG4gKlxuICogQHBhcmFtIHtEdXJhYmxlUHVibGlzaEtpdFN0YXRlfSBzdGF0ZVxuICogQHBhcmFtIHtQdWJsaXNoS2l0PCo+fSBmYWNldHNcbiAqL1xuY29uc3QgcHJvdmlkZUR1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YT0oc3RhdGUsZmFjZXRzKT0+e1xuY29uc3QgZXBoZW1lcmFsS2V5PWdldEVwaGVtZXJhbEtleShmYWNldHMpO1xuY29uc3QgZm91bmREYXRhPWR1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YS5nZXQoZXBoZW1lcmFsS2V5KTtcbmlmKGZvdW5kRGF0YSl7XG5yZXR1cm4gZm91bmREYXRhO1xuIH1cbmNvbnN0e3N0YXR1cyxwdWJsaXNoQ291bnR9PXN0YXRlO1xuLyoqIEB0eXBlIHtvYmplY3R9ICovXG5sZXQgbmV3RGF0YTtcbmlmKHN0YXR1cz09PSdmYWlsZWQnKXtcbm5ld0RhdGE9e1xuY3VycmVudFA6bWFrZVF1aWV0UmVqZWN0aW9uKHN0YXRlLnZhbHVlKSxcbnRhaWxQOm1ha2VRdWlldFJlamVjdGlvbihcbm5ldyBFcnJvcignQ2Fubm90IHJlYWQgcGFzdCBlbmQgb2YgaXRlcmF0aW9uLicpKSxcblxudGFpbFI6dW5kZWZpbmVkfTtcblxuIH1lbHNlIGlmKHN0YXR1cz09PSdmaW5pc2hlZCcpe1xuY29uc3QgdGFpbFA9bWFrZVF1aWV0UmVqZWN0aW9uKFxubmV3IEVycm9yKCdDYW5ub3QgcmVhZCBwYXN0IGVuZCBvZiBpdGVyYXRpb24uJykpO1xuXG5uZXdEYXRhPXtcbmN1cnJlbnRQOkhhbmRsZWRQcm9taXNlLnJlc29sdmUoXG5oYXJkZW4oe1xuaGVhZDp7dmFsdWU6c3RhdGUudmFsdWUsZG9uZTp0cnVlfSxcbnB1Ymxpc2hDb3VudCxcbnRhaWw6dGFpbFB9KSksXG5cblxudGFpbFAsXG50YWlsUjp1bmRlZmluZWR9O1xuXG4gfWVsc2UgaWYoc3RhdHVzPT09J2xpdmUnKXtcbmNvbnN0e3Byb21pc2U6dGFpbFAscmVzb2x2ZTp0YWlsUn09bWFrZVByb21pc2VLaXQoKTtcbnZvaWQgRS53aGVuKHRhaWxQLHNpbmssc2luayk7XG5uZXdEYXRhPXtcbmN1cnJlbnRQOnN0YXRlLmhhc1ZhbHVlP1xuSGFuZGxlZFByb21pc2UucmVzb2x2ZShcbmhhcmRlbih7XG5oZWFkOnt2YWx1ZTpzdGF0ZS52YWx1ZSxkb25lOmZhbHNlfSxcbnB1Ymxpc2hDb3VudCxcbnRhaWw6dGFpbFB9KSk6XG5cblxudGFpbFAsXG50YWlsUCxcbnRhaWxSfTtcblxuIH1lbHNle1xuRmFpbCBgSW52YWxpZCBkdXJhYmxlIHByb21pc2Uga2l0IHN0YXR1czogJHtxKHN0YXR1cyl9YDtcbiB9XG5kdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbERhdGEuc2V0KGVwaGVtZXJhbEtleSxoYXJkZW4obmV3RGF0YSkpO1xucmV0dXJuIG5ld0RhdGE7XG4gfTtcblxuLyoqXG4gKiBFeHRlbmRzIHRoZSBzZXF1ZW5jZSBvZiByZXN1bHRzLlxuICpcbiAqIEBwYXJhbSB7e3N0YXRlOiBEdXJhYmxlUHVibGlzaEtpdFN0YXRlLCBmYWNldHM6IFB1Ymxpc2hLaXQ8Kj59fSBjb250ZXh0XG4gKiBAcGFyYW0ge2Jvb2xlYW59IGRvbmVcbiAqIEBwYXJhbSB7YW55fSB2YWx1ZVxuICogQHBhcmFtIHthbnl9IFtyZWplY3Rpb25dXG4gKi9cbmNvbnN0IGFkdmFuY2VEdXJhYmxlUHVibGlzaEtpdD0oY29udGV4dCxkb25lLHZhbHVlLHJlamVjdGlvbik9PntcbmNvbnN0e3N0YXRlLGZhY2V0c309Y29udGV4dDtcbmNvbnN0e3ZhbHVlRHVyYWJpbGl0eSxzdGF0dXN9PXN0YXRlO1xuaWYoc3RhdHVzIT09J2xpdmUnKXtcbnRocm93IG5ldyBFcnJvcignQ2Fubm90IHVwZGF0ZSBzdGF0ZSBhZnRlciB0ZXJtaW5hdGlvbi4nKTtcbiB9XG5pZihkb25lfHx2YWx1ZUR1cmFiaWxpdHk9PT0nbWFuZGF0b3J5Jyl7XG5jYW5CZUR1cmFibGUodmFsdWUpfHxGYWlsIGBDYW5ub3QgYWNjZXB0IG5vbi1kdXJhYmxlIHZhbHVlOiAke3ZhbHVlfWA7XG5jYW5CZUR1cmFibGUocmVqZWN0aW9uKXx8XG5GYWlsIGBDYW5ub3QgYWNjZXB0IG5vbi1kdXJhYmxlIHJlamVjdGlvbjogJHtyZWplY3Rpb259YDtcbiB9XG5jb25zdHt0YWlsUDpjdXJyZW50UCx0YWlsUjpyZXNvbHZlQ3VycmVudH09XG5wcm92aWRlRHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxEYXRhKHN0YXRlLGZhY2V0cyk7XG5cbmNvbnN0IHB1Ymxpc2hDb3VudD1zdGF0ZS5wdWJsaXNoQ291bnQrMW47XG5zdGF0ZS5wdWJsaXNoQ291bnQ9cHVibGlzaENvdW50O1xubGV0IHRhaWxQO1xubGV0IHRhaWxSO1xuXG5pZihkb25lKXtcbnN0YXRlLnN0YXR1cz1yZWplY3Rpb24/J2ZhaWxlZCc6J2ZpbmlzaGVkJztcbnRhaWxQPW1ha2VRdWlldFJlamVjdGlvbihuZXcgRXJyb3IoJ0Nhbm5vdCByZWFkIHBhc3QgZW5kIG9mIGl0ZXJhdGlvbi4nKSk7XG50YWlsUj11bmRlZmluZWQ7XG4gfWVsc2V7XG4oe3Byb21pc2U6dGFpbFAscmVzb2x2ZTp0YWlsUn09bWFrZVByb21pc2VLaXQoKSk7XG52b2lkIEUud2hlbih0YWlsUCxzaW5rLHNpbmspO1xuIH1cbmR1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YS5zZXQoXG5nZXRFcGhlbWVyYWxLZXkoZmFjZXRzKSxcbmhhcmRlbih7Y3VycmVudFAsdGFpbFAsdGFpbFJ9KSk7XG5cblxuaWYocmVqZWN0aW9uKXtcbnN0YXRlLmhhc1ZhbHVlPXRydWU7XG5zdGF0ZS52YWx1ZT1yZWplY3Rpb247XG5yZXNvbHZlQ3VycmVudChyZWplY3Rpb24pO1xuIH1lbHNle1xuLyogUGVyc2lzdCBhIHRlcm1pbmFsIHZhbHVlLCBvciBhIG5vbi10ZXJtaW5hbCB2YWx1ZSovXG4vKiBpZiBjb25maWd1cmVkIGFzICdtYW5kYXRvcnknIG9yICdvcHBvcnR1bmlzdGljJy4qL1xuaWYoZG9uZXx8dmFsdWVEdXJhYmlsaXR5IT09J2lnbm9yZWQnJiZjYW5CZUR1cmFibGUodmFsdWUpKXtcbnN0YXRlLmhhc1ZhbHVlPXRydWU7XG5zdGF0ZS52YWx1ZT12YWx1ZTtcbiB9ZWxzZXtcbnN0YXRlLmhhc1ZhbHVlPWZhbHNlO1xuc3RhdGUudmFsdWU9dW5kZWZpbmVkO1xuIH1cblxucmVzb2x2ZUN1cnJlbnQoXG5oYXJkZW4oe1xuaGVhZDp7dmFsdWUsZG9uZX0sXG5wdWJsaXNoQ291bnQsXG50YWlsOnRhaWxQfSkpO1xuXG5cbiB9XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1hpbXBvcnQoJy4uLy4uL3ZhdC1kYXRhL3NyYy90eXBlcy5qcycpLkJhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBraW5kTmFtZVxuICovXG5jb25zdCAgICAgICAgdml2aWZ5RHVyYWJsZVB1Ymxpc2hLaXQ9KGJhZ2dhZ2Usa2luZE5hbWUpPT57XG4vKipcbiAqIEByZXR1cm5zIHsoKSA9PiBQdWJsaXNoS2l0PCo+fVxuICovXG5yZXR1cm4gdml2aWZ5RmFyQ2xhc3NLaXQoXG5iYWdnYWdlLFxua2luZE5hbWUsXG5wdWJsaXNoS2l0SUtpdCxcbmluaXREdXJhYmxlUHVibGlzaEtpdFN0YXRlLFxue1xuLyogVGhlIHB1Ymxpc2hlciBmYWNldCBvZiBhIGR1cmFibGUgcHVibGlzaCBraXQqL1xuLyogYWNjZXB0cyBuZXcgdmFsdWVzLiovXG5wdWJsaXNoZXI6e1xucHVibGlzaCh2YWx1ZSl7XG5hZHZhbmNlRHVyYWJsZVB1Ymxpc2hLaXQodGhpcyxmYWxzZSx2YWx1ZSk7XG4gfSxcbmZpbmlzaChmaW5hbFZhbHVlKXtcbmFkdmFuY2VEdXJhYmxlUHVibGlzaEtpdCh0aGlzLHRydWUsZmluYWxWYWx1ZSk7XG4gfSxcbmZhaWwocmVhc29uKXtcbmNvbnN0IHJlamVjdGlvbj1tYWtlUXVpZXRSZWplY3Rpb24ocmVhc29uKTtcbmFkdmFuY2VEdXJhYmxlUHVibGlzaEtpdCh0aGlzLHRydWUsdW5kZWZpbmVkLHJlamVjdGlvbik7XG4gfX0sXG5cblxuLyogVGhlIHN1YnNjcmliZXIgZmFjZXQgb2YgYSBkdXJhYmxlIHB1Ymxpc2gga2l0Ki9cbi8qIHByb3BhZ2F0ZXMgdmFsdWVzLiovXG5zdWJzY3JpYmVyOntcbnN1YnNjcmliZUFmdGVyKHB1Ymxpc2hDb3VudD0tMW4pe1xuY29uc3R7c3RhdGUsZmFjZXRzfT10aGlzO1xuY29uc3R7cHVibGlzaENvdW50OmN1cnJlbnRQdWJsaXNoQ291bnR9PXN0YXRlO1xuY29uc3R7Y3VycmVudFAsdGFpbFB9PXByb3ZpZGVEdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbERhdGEoXG5zdGF0ZSxcbmZhY2V0cyk7XG5cbmlmKHB1Ymxpc2hDb3VudD09PWN1cnJlbnRQdWJsaXNoQ291bnQpe1xucmV0dXJuIHRhaWxQO1xuIH1lbHNlIGlmKHB1Ymxpc2hDb3VudDxjdXJyZW50UHVibGlzaENvdW50KXtcbnJldHVybiBjdXJyZW50UDtcbiB9ZWxzZXtcbnRocm93IG5ldyBFcnJvcihcbidzdWJzY3JpYmVBZnRlciBhcmd1bWVudCBtdXN0IGJlIGEgcHJldmlvdXNseS1pc3N1ZWQgcHVibGlzaENvdW50LicpO1xuXG4gfVxuIH19fSk7XG5cblxuXG4gfTskaOKAjV9vbmNlLnZpdmlmeUR1cmFibGVQdWJsaXNoS2l0KHZpdmlmeUR1cmFibGVQdWJsaXNoS2l0KTtcbmhhcmRlbih2aXZpZnlEdXJhYmxlUHVibGlzaEtpdCk7XG5cbmNvbnN0ICAgICAgICBTdWJzY3JpYmVyU2hhcGU9TS5yZW1vdGFibGUoJ1N1YnNjcmliZXInKTskaOKAjV9vbmNlLlN1YnNjcmliZXJTaGFwZShTdWJzY3JpYmVyU2hhcGUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InN1YnNjcmliZUVhY2giOlsic3Vic2NyaWJlRWFjaCJdLCJzdWJzY3JpYmVMYXRlc3QiOlsic3Vic2NyaWJlTGF0ZXN0Il0sIlB1Ymxpc2hlckkiOlsiUHVibGlzaGVySSJdLCJTdWJzY3JpYmVySSI6WyJTdWJzY3JpYmVySSJdLCJwdWJsaXNoS2l0SUtpdCI6WyJwdWJsaXNoS2l0SUtpdCJdLCJtYWtlUHVibGlzaEtpdCI6WyJtYWtlUHVibGlzaEtpdCJdLCJ2aXZpZnlEdXJhYmxlUHVibGlzaEtpdCI6WyJ2aXZpZnlEdXJhYmxlUHVibGlzaEtpdCJdLCJTdWJzY3JpYmVyU2hhcGUiOlsiU3Vic2NyaWJlclNoYXBlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAFYIhWa/HgAAvx4AACcAAABAYWdvcmljL25vdGlmaWVyLXYwLjUuMS9zcmMvc3RvcmVzdWIuanN7ImltcG9ydHMiOlsiLi9hc3luY0l0ZXJhYmxlQWRhcHRvci5qcyIsIi4vcHVibGlzaC1raXQuanMiLCIuL3N1YnNjcmliZXIuanMiLCJAYWdvcmljL2ludGVybmFsIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJtYWtlU3RvcmVkUHVibGlzaEtpdCIsIm1ha2VTdG9yZWRQdWJsaXNoZXJLaXQiLCJtYWtlU3RvcmVkU3Vic2NyaWJlciIsIm1ha2VTdG9yZWRTdWJzY3JpcHRpb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRSxGYXIsbWFrZU1hcnNoYWwsYXNzZXJ0QWxsRGVmaW5lZCxvYnNlcnZlSXRlcmF0aW9uLG1ha2VQdWJsaXNoS2l0LHN1YnNjcmliZUVhY2gsbWFrZVN1YnNjcmlwdGlvbktpdDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXSxbXCJtYWtlTWFyc2hhbFwiLCBbJGjigI1fYSA9PiAobWFrZU1hcnNoYWwgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbFwiLCBbW1wiYXNzZXJ0QWxsRGVmaW5lZFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0QWxsRGVmaW5lZCA9ICRo4oCNX2EpXV1dXSxbXCIuL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzXCIsIFtbXCJvYnNlcnZlSXRlcmF0aW9uXCIsIFskaOKAjV9hID0+IChvYnNlcnZlSXRlcmF0aW9uID0gJGjigI1fYSldXV1dLFtcIi4vcHVibGlzaC1raXQuanNcIiwgW1tcIm1ha2VQdWJsaXNoS2l0XCIsIFskaOKAjV9hID0+IChtYWtlUHVibGlzaEtpdCA9ICRo4oCNX2EpXV0sW1wic3Vic2NyaWJlRWFjaFwiLCBbJGjigI1fYSA9PiAoc3Vic2NyaWJlRWFjaCA9ICRo4oCNX2EpXV1dXSxbXCIuL3N1YnNjcmliZXIuanNcIiwgW1tcIm1ha2VTdWJzY3JpcHRpb25LaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VTdWJzY3JpcHRpb25LaXQgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7U3Vic2NyaWJlcjxUPn0gc3Vic2NyaWJlclxuICogQHBhcmFtIHsodjogVCkgPT4gdm9pZH0gY29uc3VtZVZhbHVlXG4gKi9cbmNvbnN0IGZvckVhY2hQdWJsaWNhdGlvblJlY29yZD1hc3luYyhzdWJzY3JpYmVyLGNvbnN1bWVWYWx1ZSk9PntcbmNvbnN0IGl0ZXJhdG9yUD1FKHN1YnNjcmliZUVhY2goc3Vic2NyaWJlcikpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpO1xuXG5sZXQgZmluaXNoZWQ9ZmFsc2U7XG53aGlsZSghZmluaXNoZWQpe1xuLyogQWxsb3cgbmVzdGVkIGF3YWl0cyAoaW4gbG9vcCkgYmVjYXVzZSBpdCdzIHNhZmUgZm9yIGVhY2ggdG8gcnVuIGluIGEgdHVybiovXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXdhaXQtaW4tbG9vcCwgQGplc3NpZS5qcy9uby1uZXN0ZWQtYXdhaXQqL1xuY29uc3R7dmFsdWUsZG9uZX09YXdhaXQgRShpdGVyYXRvclApLm5leHQoKTtcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hd2FpdC1pbi1sb29wLCBAamVzc2llLmpzL25vLW5lc3RlZC1hd2FpdCovXG5hd2FpdCBjb25zdW1lVmFsdWUodmFsdWUpO1xuZmluaXNoZWQ9ISFkb25lO1xuIH1cbiB9O1xuXG4vKipcbiAqIEJlZ2luIGl0ZXJhdGluZyB0aGUgc291cmNlLCBzdG9yaW5nIHNlcmlhbGl6ZWQgaXRlcmF0aW9uIHZhbHVlcy4gIElmIHRoZVxuICogc3RvcmFnZU5vZGUncyBgc2V0VmFsdWVgIG9wZXJhdGlvbiByZWplY3RzLCBubyBmdXJ0aGVyIHdyaXRlcyB0byBpdCB3aWxsXG4gKiBiZSBhdHRlbXB0ZWQgKGJ1dCByZXN1bHRzIHdpbGwgcmVtYWluIGF2YWlsYWJsZSBmcm9tIHRoZSBzdWJzY3JpYmVyKS5cbiAqXG4gKiBSZXR1cm5zIGEgU3RvcmVkU3Vic2NyaWJlciB0aGF0IGNhbiBiZSB1c2VkIGJ5IGEgY2xpZW50IHRvIGRpcmVjdGx5IGZvbGxvd1xuICogdGhlIGl0ZXJhdGlvbiB0aGVtc2VsdmVzLCBvciBvYnRhaW4gaW5mb3JtYXRpb24gdG8gc3Vic2NyaWJlIHRvIHRoZSBzdG9yZWRcbiAqIGRhdGEgb3V0LW9mLWJhbmQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7U3Vic2NyaWJlcjxUPn0gc3Vic2NyaWJlclxuICogQHBhcmFtIHtFUmVmPFN0b3JhZ2VOb2RlPn0gc3RvcmFnZU5vZGVcbiAqIEBwYXJhbSB7RVJlZjxSZXR1cm5UeXBlPHR5cGVvZiBtYWtlTWFyc2hhbD4+fSBtYXJzaGFsbGVyXG4gKiBAcmV0dXJucyB7U3RvcmVkU3Vic2NyaWJlcjxUPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VTdG9yZWRTdWJzY3JpYmVyPShzdWJzY3JpYmVyLHN0b3JhZ2VOb2RlLG1hcnNoYWxsZXIpPT57XG5hc3NlcnRBbGxEZWZpbmVkKHtzdWJzY3JpYmVyLHN0b3JhZ2VOb2RlLG1hcnNoYWxsZXJ9KTtcblxuY29uc3Qgc3RvcmVWYWx1ZT0odmFsdWUpPT5cbkUobWFyc2hhbGxlcikuXG5zZXJpYWxpemUodmFsdWUpLlxudGhlbigoc2VyaWFsaXplZCk9PntcbmNvbnN0IGVuY29kZWQ9SlNPTi5zdHJpbmdpZnkoc2VyaWFsaXplZCk7XG5yZXR1cm4gRShzdG9yYWdlTm9kZSkuc2V0VmFsdWUoZW5jb2RlZCk7XG4gfSk7XG5cbi8qIFN0YXJ0IHB1Ymxpc2hpbmcgdGhlIHNvdXJjZS4qL1xuZm9yRWFjaFB1YmxpY2F0aW9uUmVjb3JkKHN1YnNjcmliZXIsc3RvcmVWYWx1ZSkuY2F0Y2goKGVycik9Pntcbi8qIFRPRE86IEhvdyBzaG91bGQgd2UgaGFuZGxlIGFuZC9vciBzdXJmYWNlIHRoaXMgZmFpbHVyZT8qL1xuLyogaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL3B1bGwvNTc2NiNkaXNjdXNzaW9uX3I5MjI0OTgwODgqL1xuY29uc29sZS5lcnJvcignU3RvcmVkU3Vic2NyaWJlciBmYWlsZWQgdG8gaXRlcmF0ZScsZXJyKTtcbiB9KTtcblxuLyoqIEB0eXBlIHtVbnNlcmlhbGl6ZXJ9ICovXG5jb25zdCB1bnNlcmlhbGl6ZXI9RmFyKCd1bnNlcmlhbGl6ZXInLHtcbnVuc2VyaWFsaXplOihkYXRhKT0+RShtYXJzaGFsbGVyKS51bnNlcmlhbGl6ZShkYXRhKX0pO1xuXG5cbi8qKiBAdHlwZSB7U3RvcmVkU3Vic2NyaWJlcjxUPn0gKi9cbmNvbnN0IHN0b3Jlc3ViPUZhcignU3RvcmVkU3Vic2NyaWJlcicse1xuLi4uc3Vic2NyaWJlcixcbmdldFN0b3JlS2V5OigpPT5FKHN0b3JhZ2VOb2RlKS5nZXRTdG9yZUtleSgpLFxuZ2V0VW5zZXJpYWxpemVyOigpPT51bnNlcmlhbGl6ZXJ9KTtcblxucmV0dXJuIHN0b3Jlc3ViO1xuIH07XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgdXNlIG1ha2VTdG9yZWRTdWJzY3JpYmVyXG4gKlxuICogQmVnaW4gaXRlcmF0aW5nIHRoZSBzb3VyY2UsIHN0b3Jpbmcgc2VyaWFsaXplZCBpdGVyYXRpb24gdmFsdWVzLiAgSWYgdGhlXG4gKiBzdG9yYWdlTm9kZSdzIGBzZXRWYWx1ZWAgb3BlcmF0aW9uIHJlamVjdHMsIHRoZSBpdGVyYXRpb24gd2lsbCBiZSB0ZXJtaW5hdGVkLlxuICpcbiAqIFJldHVybnMgYSBTdG9yZWRTdWJzY3JpcHRpb24gdGhhdCBjYW4gYmUgdXNlZCBieSBhIGNsaWVudCB0byBkaXJlY3RseSBmb2xsb3dcbiAqIHRoZSBpdGVyYXRpb24gdGhlbXNlbHZlcywgb3Igb2J0YWluIGluZm9ybWF0aW9uIHRvIHN1YnNjcmliZSB0byB0aGUgc3RvcmVkXG4gKiBkYXRhIG91dC1vZi1iYW5kLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1N1YnNjcmlwdGlvbjxUPn0gc3Vic2NyaXB0aW9uXG4gKiBAcGFyYW0ge0VSZWY8U3RvcmFnZU5vZGU+fSBbc3RvcmFnZU5vZGVdXG4gKiBAcGFyYW0ge0VSZWY8UmV0dXJuVHlwZTx0eXBlb2YgbWFrZU1hcnNoYWw+Pn0gW21hcnNoYWxsZXJdXG4gKiBAcmV0dXJucyB7U3RvcmVkU3Vic2NyaXB0aW9uPFQ+fVxuICovJGjigI1fb25jZS5tYWtlU3RvcmVkU3Vic2NyaWJlcihtYWtlU3RvcmVkU3Vic2NyaWJlcik7XG5jb25zdCAgICAgICAgbWFrZVN0b3JlZFN1YnNjcmlwdGlvbj0oXG5zdWJzY3JpcHRpb24sXG5zdG9yYWdlTm9kZSxcbm1hcnNoYWxsZXI9bWFrZU1hcnNoYWwodW5kZWZpbmVkLHVuZGVmaW5lZCx7XG5tYXJzaGFsU2F2ZUVycm9yOigpPT57IH19KSk9PlxuXG57XG4vKiogQHR5cGUge1Vuc2VyaWFsaXplcn0gKi9cbmNvbnN0IHVuc2VyaWFsaXplcj1GYXIoJ3Vuc2VyaWFsaXplcicse1xudW5zZXJpYWxpemU6KGRhdGEpPT5FKG1hcnNoYWxsZXIpLnVuc2VyaWFsaXplKGRhdGEpfSk7XG5cblxuLyogQWJvcnQgdGhlIGl0ZXJhdGlvbiBvbiB0aGUgbmV4dCBvYnNlcnZhdGlvbiBpZiB0aGUgcHVibGlzaGVyIGV2ZXIgZmFpbHMuKi9cbmxldCBwdWJsaXNoRmFpbGVkPWZhbHNlO1xubGV0IHB1Ymxpc2hFeGNlcHRpb247XG5cbmNvbnN0IGZhaWw9KGVycik9PntcbnB1Ymxpc2hGYWlsZWQ9dHJ1ZTtcbnB1Ymxpc2hFeGNlcHRpb249ZXJyO1xuIH07XG5cbi8qIE11c3QgKm5vdCogYmUgYW4gYXN5bmMgZnVuY3Rpb24sIGJlY2F1c2UgaXQgc29tZXRpbWVzIG11c3QgdGhyb3cgdG8gYWJvcnQqL1xuLyogdGhlIGl0ZXJhdGlvbi4qL1xuY29uc3QgcHVibGlzaFZhbHVlPShvYmopPT57XG5hc3NlcnQoc3RvcmFnZU5vZGUpO1xuaWYocHVibGlzaEZhaWxlZCl7XG4vKiBUbyBwcm9wZXJseSBhYm9ydCB0aGUgaXRlcmF0aW9uLCB0aGlzIG11c3QgYmUgYSBzeW5jaHJvbm91cyBleGNlcHRpb24uKi9cbnRocm93IHB1Ymxpc2hFeGNlcHRpb247XG4gfVxuXG4vKiBQdWJsaXNoIHRoZSB2YWx1ZSwgY2FwdHVyaW5nIGFueSBlcnJvci4qL1xuRShtYXJzaGFsbGVyKS5cbnNlcmlhbGl6ZShvYmopLlxudGhlbigoc2VyaWFsaXplZCk9PntcbmNvbnN0IGVuY29kZWQ9SlNPTi5zdHJpbmdpZnkoc2VyaWFsaXplZCk7XG5yZXR1cm4gRShzdG9yYWdlTm9kZSkuc2V0VmFsdWUoZW5jb2RlZCk7XG4gfSkuXG5jYXRjaChmYWlsKTtcbiB9O1xuXG5pZihzdG9yYWdlTm9kZSl7XG4vKiBTdGFydCBwdWJsaXNoaW5nIHRoZSBzb3VyY2UuKi9cbm9ic2VydmVJdGVyYXRpb24oc3Vic2NyaXB0aW9uLHtcbnVwZGF0ZVN0YXRlOnB1Ymxpc2hWYWx1ZSxcbmZpbmlzaDpwdWJsaXNoVmFsdWV9KS5cbmNhdGNoKGZhaWwpO1xuIH1cblxuLyoqIEB0eXBlIHtTdG9yZWRTdWJzY3JpcHRpb248VD59ICovXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgLS0gZGlmZmVyZW50IHBlciBwYWNrYWdlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNDYyMCovXG4vKiBAdHMtaWdub3JlIGdldFN0b3JlS2V5IHR5cGUgZG9lcyBub3QgaGF2ZSBgc3Vic2NyaXB0aW9uYCovXG5jb25zdCBzdG9yZXN1Yj1GYXIoJ1N0b3JlZFN1YnNjcmlwdGlvbicse1xuZ2V0U3RvcmVLZXk6YXN5bmMoKT0+e1xuaWYoIXN0b3JhZ2VOb2RlKXtcbnJldHVybiBoYXJkZW4oe3N1YnNjcmlwdGlvbn0pO1xuIH1cbmNvbnN0IHN0b3JlS2V5PWF3YWl0IEUoc3RvcmFnZU5vZGUpLmdldFN0b3JlS2V5KCk7XG5yZXR1cm4gaGFyZGVuKHsuLi5zdG9yZUtleSxzdWJzY3JpcHRpb259KTtcbiB9LFxuZ2V0VW5zZXJpYWxpemVyOigpPT51bnNlcmlhbGl6ZXIsXG5nZXRTaGFyYWJsZVN1YnNjcmlwdGlvbkludGVybmFsczpcbnN1YnNjcmlwdGlvbi5nZXRTaGFyYWJsZVN1YnNjcmlwdGlvbkludGVybmFscyxcbltTeW1ib2wuYXN5bmNJdGVyYXRvcl06c3Vic2NyaXB0aW9uW1N5bWJvbC5hc3luY0l0ZXJhdG9yXX0pO1xuXG5yZXR1cm4gc3RvcmVzdWI7XG4gfTskaOKAjV9vbmNlLm1ha2VTdG9yZWRTdWJzY3JpcHRpb24obWFrZVN0b3JlZFN1YnNjcmlwdGlvbik7XG5oYXJkZW4obWFrZVN0b3JlZFN1YnNjcmlwdGlvbik7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgdXNlIFN0b3JlZFB1Ymxpc2hLaXRcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTdG9yZWRQdWJsaXNoZXJLaXRcbiAqIEBwcm9wZXJ0eSB7U3RvcmVkU3Vic2NyaXB0aW9uPFQ+fSBzdWJzY3JpYmVyXG4gKiBAcHJvcGVydHkge0l0ZXJhdGlvbk9ic2VydmVyPFQ+fSBwdWJsaXNoZXJcbiAqL1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIHVzZSBtYWtlU3RvcmVkUHVibGlzaEtpdFxuICpcbiAqIEB0ZW1wbGF0ZSBbVD11bmtub3duXVxuICogQHBhcmFtIHtFUmVmPFN0b3JhZ2VOb2RlPn0gW3N0b3JhZ2VOb2RlXVxuICogQHBhcmFtIHtFUmVmPE1hcnNoYWxsZXI+fSBbbWFyc2hhbGxlcl1cbiAqIEBwYXJhbSB7c3RyaW5nfSBbY2hpbGRQYXRoXVxuICogQHJldHVybnMge1N0b3JlZFB1Ymxpc2hlcktpdDxUPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VTdG9yZWRQdWJsaXNoZXJLaXQ9KHN0b3JhZ2VOb2RlLG1hcnNoYWxsZXIsY2hpbGRQYXRoKT0+e1xuY29uc3R7cHVibGljYXRpb24sc3Vic2NyaXB0aW9ufT1tYWtlU3Vic2NyaXB0aW9uS2l0KCk7XG5cbmlmKHN0b3JhZ2VOb2RlJiZjaGlsZFBhdGgpe1xuc3RvcmFnZU5vZGU9RShzdG9yYWdlTm9kZSkubWFrZUNoaWxkTm9kZShjaGlsZFBhdGgpO1xuIH1cblxuLyogd3JhcCB0aGUgc3Vic2NyaXB0aW9uIHRvIHRlZSBldmVudHMgdG8gc3RvcmFnZSwgcmVwZWF0aW5nIHRvIHRoaXMgYHN1YnNjcmliZXJgKi9cbmNvbnN0IHN1YnNjcmliZXI9bWFrZVN0b3JlZFN1YnNjcmlwdGlvbihcbnN1YnNjcmlwdGlvbixcbnN0b3JhZ2VOb2RlLFxubWFyc2hhbGxlcik7XG5cblxucmV0dXJue1xucHVibGlzaGVyOnB1YmxpY2F0aW9uLFxuc3Vic2NyaWJlcn07XG5cbiB9O1xuXG4vKipcbiAqIExpa2UgbWFrZVB1Ymxpc2hLaXQgdGhpcyBtYWtlcyBhIGB7IHB1Ymxpc2hlciwgc3Vic2NyaWJlciB9YCBwYWlyIGZvciBkb2luZyBlZmZpY2llbnRcbiAqIGRpc3RyaWJ1dGVkIHB1Yi9zdWIgc3VwcG9ydGluZyBib3RoIFwiZWFjaFwiIGFuZCBcImxhdGVzdFwiIGl0ZXJhdGlvblxuICogb2YgcHVibGlzaGVkIHZhbHVlcy5cbiAqXG4gKiBXaGF0J3MgZGlmZmVyZW50IGlzIGBzdWJzY3JpYmVyYCB0ZWVzIHJlY29yZHMsIHdyaXRpbmcgb3V0IHRvIHN0b3JhZ2VOb2RlLlxuICpcbiAqIEB0ZW1wbGF0ZSBbVD11bmtub3duXVxuICogQHBhcmFtIHtFUmVmPFN0b3JhZ2VOb2RlPn0gc3RvcmFnZU5vZGVcbiAqIEBwYXJhbSB7RVJlZjxNYXJzaGFsbGVyPn0gbWFyc2hhbGxlclxuICogQHJldHVybnMge1N0b3JlZFB1Ymxpc2hLaXQ8VD59XG4gKi8kaOKAjV9vbmNlLm1ha2VTdG9yZWRQdWJsaXNoZXJLaXQobWFrZVN0b3JlZFB1Ymxpc2hlcktpdCk7XG5jb25zdCAgICAgICAgbWFrZVN0b3JlZFB1Ymxpc2hLaXQ9KHN0b3JhZ2VOb2RlLG1hcnNoYWxsZXIpPT57XG5jb25zdHtwdWJsaXNoZXIsc3Vic2NyaWJlcn09bWFrZVB1Ymxpc2hLaXQoKTtcblxucmV0dXJue1xucHVibGlzaGVyLFxuLyogd3JhcCB0aGUgc3Vic2NyaWJlciB0byB0ZWUgZXZlbnRzIHRvIHN0b3JhZ2UqL1xuc3Vic2NyaWJlcjptYWtlU3RvcmVkU3Vic2NyaWJlcihzdWJzY3JpYmVyLHN0b3JhZ2VOb2RlLG1hcnNoYWxsZXIpfTtcblxuIH07JGjigI1fb25jZS5tYWtlU3RvcmVkUHVibGlzaEtpdChtYWtlU3RvcmVkUHVibGlzaEtpdCk7XG5oYXJkZW4obWFrZVN0b3JlZFB1Ymxpc2hLaXQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VTdG9yZWRTdWJzY3JpYmVyIjpbIm1ha2VTdG9yZWRTdWJzY3JpYmVyIl0sIm1ha2VTdG9yZWRTdWJzY3JpcHRpb24iOlsibWFrZVN0b3JlZFN1YnNjcmlwdGlvbiJdLCJtYWtlU3RvcmVkUHVibGlzaGVyS2l0IjpbIm1ha2VTdG9yZWRQdWJsaXNoZXJLaXQiXSwibWFrZVN0b3JlZFB1Ymxpc2hLaXQiOlsibWFrZVN0b3JlZFB1Ymxpc2hLaXQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA0bxMuTkMAAA5DAAAKQAAAEBhZ29yaWMvbm90aWZpZXItdjAuNS4xL3NyYy9zdWJzY3JpYmVyLmpzeyJpbXBvcnRzIjpbIi4vcHVibGlzaC1raXQuanMiLCIuL3R5cGVzLWFtYmllbnQuanMiLCJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbIm1ha2VTdWJzY3JpcHRpb24iLCJtYWtlU3Vic2NyaXB0aW9uS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEUsRmFyLG1ha2VQdWJsaXNoS2l0OyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV0sW1wiLi9wdWJsaXNoLWtpdC5qc1wiLCBbW1wibWFrZVB1Ymxpc2hLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VQdWJsaXNoS2l0ID0gJGjigI1fYSldXV1dLFtcIi4vdHlwZXMtYW1iaWVudC5qc1wiLCBbXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8UHVibGljYXRpb25SZWNvcmQ8VD4+fSBzaGFyYWJsZUludGVybmFsc1BcbiAqIEByZXR1cm5zIHtTdWJzY3JpcHRpb248VD59XG4gKi9cbmNvbnN0IG1ha2VTdWJzY3JpcHRpb249KHNoYXJhYmxlSW50ZXJuYWxzUCk9PntcbmNvbnN0IHN1YnNjcmlwdGlvbj1GYXIoJ1N1YnNjcmlwdGlvbicse1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbltTeW1ib2wuYXN5bmNJdGVyYXRvcl06KCk9Pm1ha2VTdWJzY3JpcHRpb25JdGVyYXRvcihzaGFyYWJsZUludGVybmFsc1ApLFxuXG4vKipcbiAqIFVzZSB0aGlzIHRvIGRpc3RyaWJ1dGUgYSBTdWJzY3JpcHRpb24gZWZmaWNpZW50bHkgb3ZlciB0aGUgbmV0d29yayxcbiAqIGJ5IG9idGFpbmluZyB0aGlzIGZyb20gdGhlIFN1YnNjcmlwdGlvbiB0byBiZSByZXBsaWNhdGVkLCBhbmQgYXBwbHlpbmdcbiAqIGBtYWtlU3Vic2NyaXB0aW9uYCB0byBpdCBhdCB0aGUgbmV3IHNpdGUgdG8gZ2V0IGFuIGVxdWl2YWxlbnQgbG9jYWxcbiAqIFN1YnNjcmlwdGlvbiBhdCB0aGF0IHNpdGUuXG4gKlxuICogQHJldHVybnMge0VSZWY8UHVibGljYXRpb25SZWNvcmQ8VD4+fVxuICovXG5nZXRTaGFyYWJsZVN1YnNjcmlwdGlvbkludGVybmFsczooKT0+c2hhcmFibGVJbnRlcm5hbHNQLFxuXG5nZXRTdG9yZUtleTooKT0+aGFyZGVuKHtzdWJzY3JpcHRpb259KX0pO1xuXG5yZXR1cm4gc3Vic2NyaXB0aW9uO1xuIH07JGjigI1fb25jZS5tYWtlU3Vic2NyaXB0aW9uKG1ha2VTdWJzY3JpcHRpb24pO1xuaGFyZGVuKG1ha2VTdWJzY3JpcHRpb24pO1xuXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxQdWJsaWNhdGlvblJlY29yZDxUPj59IHRhaWxQXG4gKiBAcmV0dXJucyB7U3Vic2NyaXB0aW9uSXRlcmF0b3I8VD59XG4gKi9cbmNvbnN0IG1ha2VTdWJzY3JpcHRpb25JdGVyYXRvcj0odGFpbFApPT57XG4vKiBUbyB1bmRlcnN0YW5kIHRoZSBpbXBsZW1lbnRhdGlvbiwgc3RhcnQgd2l0aCovXG4vKiBodHRwczovL3dlYi5hcmNoaXZlLm9yZy93ZWIvMjAxNjA0MDQxMjIyNTAvaHR0cDovL3dpa2kuZWNtYXNjcmlwdC5vcmcvZG9rdS5waHA/aWQ9c3RyYXdtYW46Y29uY3VycmVuY3kjaW5maW5pdGVfcXVldWUqL1xucmV0dXJuIEZhcignU3Vic2NyaXB0aW9uSXRlcmF0b3InLHtcbnN1YnNjcmliZTooKT0+bWFrZVN1YnNjcmlwdGlvbih0YWlsUCksXG5bU3ltYm9sLmFzeW5jSXRlcmF0b3JdOigpPT5tYWtlU3Vic2NyaXB0aW9uSXRlcmF0b3IodGFpbFApLFxubmV4dDooKT0+e1xuY29uc3QgcmVzdWx0UD1FLmdldCh0YWlsUCkuaGVhZDtcbnRhaWxQPUUuZ2V0KHRhaWxQKS50YWlsO1xuUHJvbWlzZS5yZXNvbHZlKHRhaWxQKS5jYXRjaCgoKT0+eyB9KTsvKiBzdXBwcmVzcyB1bmhhbmRsZWQgcmVqZWN0aW9uIGVycm9yKi9cbnJldHVybiByZXN1bHRQO1xuIH19KTtcblxuIH07XG5cbi8qKlxuICogTWFrZXMgYSBgeyBwdWJsaWNhdGlvbiwgc3Vic2NyaXB0aW9uIH1gIGZvciBkb2luZyBsb3NzbGVzcyBlZmZpY2llbnRcbiAqIGRpc3RyaWJ1dGVkIHB1Yi9zdWIuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEByZXR1cm5zIHtTdWJzY3JpcHRpb25SZWNvcmQ8VD59XG4gKi9cbmNvbnN0IG1ha2VTdWJzY3JpcHRpb25LaXQ9KCk9PntcbmNvbnN0e3B1Ymxpc2hlcixzdWJzY3JpYmVyfT1tYWtlUHVibGlzaEtpdCgpO1xuXG4vKiBUaGUgcHVibGlzaCBraXQgc3Vic2NyaWJlciBpcyBwcmVmaXgtbG9zc3ksIHNvIG1ha2luZyAqdGhpcyogc3Vic2NyaWJlciBjb21wbGV0ZWx5Ki9cbi8qIGxvc3NsZXNzIHJlcXVpcmVzIGVhZ2VyIGNvbnN1bXB0aW9uIG9mIHRoZSBmb3JtZXIuKi9cbi8qIFN1Y2ggbG9zc2xlc3NuZXNzIGluaGliaXRzIEdDLCB3aGljaCBpcyB3aHkgd2UncmUgbW92aW5nIGF3YXkgZnJvbSBpdC4qL1xuY29uc3QgcHViTGlzdD1zdWJzY3JpYmVyLnN1YnNjcmliZUFmdGVyKCk7XG5jb25zdCBzdWJzY3JpcHRpb249bWFrZVN1YnNjcmlwdGlvbihwdWJMaXN0KTtcblxuLyoqIEB0eXBlIHtJdGVyYXRpb25PYnNlcnZlcjxUPn0gKi9cbmNvbnN0IHB1YmxpY2F0aW9uPUZhcigncHVibGljYXRpb24nLHtcbnVwZGF0ZVN0YXRlOnB1Ymxpc2hlci5wdWJsaXNoLFxuZmluaXNoOnB1Ymxpc2hlci5maW5pc2gsXG5mYWlsOnB1Ymxpc2hlci5mYWlsfSk7XG5cblxucmV0dXJuIGhhcmRlbih7cHVibGljYXRpb24sc3Vic2NyaXB0aW9ufSk7XG4gfTskaOKAjV9vbmNlLm1ha2VTdWJzY3JpcHRpb25LaXQobWFrZVN1YnNjcmlwdGlvbktpdCk7XG5oYXJkZW4obWFrZVN1YnNjcmlwdGlvbktpdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVN1YnNjcmlwdGlvbiI6WyJtYWtlU3Vic2NyaXB0aW9uIl0sIm1ha2VTdWJzY3JpcHRpb25LaXQiOlsibWFrZVN1YnNjcmlwdGlvbktpdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAD5xDWI/ScAAP0nAAAsAAAAQGFnb3JpYy9ub3RpZmllci12MC41LjEvc3JjL3R5cGVzLWFtYmllbnQuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vZmFyJykuRVJlZjxUPn0gRVJlZlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9wcm9taXNlLWtpdCcpLlByb21pc2VLaXQ8VD59IFByb21pc2VLaXRcbiAqL1xuXG4vKipcbiAqIERlcHJlY2F0ZWQuIFVzZSBQcm9taXNlS2l0IGluc3RlYWQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9wcm9taXNlLWtpdCcpLlByb21pc2VSZWNvcmQ8VD59IFByb21pc2VSZWNvcmRcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7e1xuICogICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdOiAoKSA9PiBBc3luY0l0ZXJhdG9yPFQsIFQ+XG4gKiB9fSBDb25zaXN0ZW50QXN5bmNJdGVyYWJsZVxuICogQW4gQXN5bmNJdGVyYWJsZSB0aGF0IHJldHVybnMgdGhlIHNhbWUgdHlwZSBhcyBpdCB5aWVsZHMuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gSXRlcmF0aW9uT2JzZXJ2ZXI8VD5cbiAqIEEgdmFsaWQgc2VxdWVuY2Ugb2YgY2FsbHMgdG8gdGhlIG1ldGhvZHMgb2YgYW4gYEl0ZXJhdGlvbk9ic2VydmVyYFxuICogcmVwcmVzZW50cyBhbiBpdGVyYXRpb24uIEEgdmFsaWQgc2VxdWVuY2UgY29uc2lzdHMgb2YgYW55IG51bWJlciBvZiBjYWxsc1xuICogdG8gYHVwZGF0ZVN0YXRlYCB3aXRoIHRoZSBzdWNjZXNzaXZlIG5vbi1maW5hbCB2YWx1ZXMsIGZvbGxvd2VkIGJ5IGFcbiAqIGZpbmFsIGNhbGwgdG8gZWl0aGVyIGBmaW5pc2hgIHdpdGggYSBzdWNjZXNzZnVsIGBjb21wbGV0aW9uYCB2YWx1ZVxuICogb3IgYGZhaWxgIHdpdGggdGhlIGFsbGVnZWQgYHJlYXNvbmAgZm9yIGZhaWx1cmUuIEFmdGVyIGF0IG1vc3Qgb25lXG4gKiB0ZXJtaW5hdGluZyBjYWxscywgbm8gZnVydGhlciBjYWxscyB0byB0aGVzZSBtZXRob2RzIGFyZSB2YWxpZCBhbmQgbXVzdCBiZVxuICogcmVqZWN0ZWQuXG4gKiBAcHJvcGVydHkgeyhub25GaW5hbFZhbHVlOiBUKSA9PiB2b2lkfSB1cGRhdGVTdGF0ZVxuICogQHByb3BlcnR5IHsoY29tcGxldGlvbjogVCkgPT4gdm9pZH0gZmluaXNoXG4gKiBAcHJvcGVydHkgeyhyZWFzb246IGFueSkgPT4gdm9pZH0gZmFpbFxuICovXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gUHVibGljYXRpb25SZWNvcmRcbiAqIEBwcm9wZXJ0eSB7SXRlcmF0b3JSZXN1bHQ8VD59IGhlYWRcbiAqIEBwcm9wZXJ0eSB7YmlnaW50fSBwdWJsaXNoQ291bnRcbiAqIEBwcm9wZXJ0eSB7UHVibGljYXRpb25MaXN0PFQ+fSB0YWlsXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge0VSZWY8UHVibGljYXRpb25SZWNvcmQ8VD4+fSBQdWJsaWNhdGlvbkxpc3RcbiAqIFdpbGwgYmUgc2hhcmVkIGJldHdlZW4gbWFjaGluZXMsIHNvIGl0IG11c3QgYmUgc2FmZSB0byBleHBvc2UuIEJ1dCBvdGhlclxuICogc29mdHdhcmUgc2hvdWxkIGNvbnNpZGVyIGl0IG9wYXF1ZSwgbm90IGRlcGVuZGluZyBvbiBpdHMgaW50ZXJuYWwgc3RydWN0dXJlLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN1YnNjcmliZXJcbiAqIEBwcm9wZXJ0eSB7KHB1Ymxpc2hDb3VudD86IGJpZ2ludCkgPT4gUHVibGljYXRpb25MaXN0PFQ+fSBzdWJzY3JpYmVBZnRlclxuICogSW50ZXJuYWxseSB1c2VkIHRvIGdldCB0aGUgXCJjdXJyZW50XCIgU2hhcmFibGVTdWJzY3JpcHRpb25JbnRlcm5hbHNcbiAqIGluIG9yZGVyIHRvIG1ha2UgYSBzdWJzY3JpcHRpb24gaXRlcmF0b3IgdGhhdCBzdGFydHMgdGhlcmUuXG4gKiBUaGUgYW5zd2VyIGlzIFwiY3VycmVudFwiIGluIHRoYXQgaXQgd2FzIGFjY3VyYXRlIGF0IHNvbWUgbW9tZW50IGJldHdlZW5cbiAqIHdoZW4geW91IGFza2VkIGFuZCB3aGVuIHlvdSBnb3QgdGhlIGFuc3dlci5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQdWJsaXNoZXJcbiAqIEEgdmFsaWQgc2VxdWVuY2Ugb2YgY2FsbHMgdG8gdGhlIG1ldGhvZHMgb2YgYW4gYEl0ZXJhdGlvbk9ic2VydmVyYFxuICogcmVwcmVzZW50cyBhbiBpdGVyYXRpb24uIEEgdmFsaWQgc2VxdWVuY2UgY29uc2lzdHMgb2YgYW55IG51bWJlciBvZiBjYWxsc1xuICogdG8gYHB1Ymxpc2hgIHdpdGggdGhlIHN1Y2Nlc3NpdmUgbm9uLWZpbmFsIHZhbHVlcywgZm9sbG93ZWQgYnkgYVxuICogZmluYWwgY2FsbCB0byBlaXRoZXIgYGZpbmlzaGAgd2l0aCBhIHN1Y2Nlc3NmdWwgYGNvbXBsZXRpb25gIHZhbHVlXG4gKiBvciBgZmFpbGAgd2l0aCB0aGUgYWxsZWdlZCBgcmVhc29uYCBmb3IgZmFpbHVyZS4gQWZ0ZXIgYXQgbW9zdCBvbmVcbiAqIHRlcm1pbmF0aW5nIGNhbGxzLCBubyBmdXJ0aGVyIGNhbGxzIHRvIHRoZXNlIG1ldGhvZHMgYXJlIHZhbGlkIGFuZCBtdXN0IGJlXG4gKiByZWplY3RlZC5cbiAqIEBwcm9wZXJ0eSB7KG5vbkZpbmFsVmFsdWU6IFQpID0+IHZvaWR9IHB1Ymxpc2hcbiAqIEBwcm9wZXJ0eSB7KGNvbXBsZXRpb246IFQpID0+IHZvaWR9IGZpbmlzaFxuICogQHByb3BlcnR5IHsocmVhc29uOiBhbnkpID0+IHZvaWR9IGZhaWxcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7UGFydGlhbDxQdWJsaXNoZXI8VD4+fSBQdWJsaXNoT2JzZXJ2ZXJcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQdWJsaXNoS2l0PFQ+XG4gKiBAcHJvcGVydHkge1B1Ymxpc2hlcjxUPn0gcHVibGlzaGVyXG4gKiBAcHJvcGVydHkge1N1YnNjcmliZXI8VD59IHN1YnNjcmliZXJcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTdG9yZWRQdWJsaXNoS2l0PFQ+XG4gKiBAcHJvcGVydHkge1B1Ymxpc2hlcjxUPn0gcHVibGlzaGVyXG4gKiBAcHJvcGVydHkge1N0b3JlZFN1YnNjcmliZXI8VD59IHN1YnNjcmliZXJcbiAqL1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQHR5cGVkZWYgeydtYW5kYXRvcnknIHwgJ29wcG9ydHVuaXN0aWMnIHwgJ2lnbm9yZWQnfSBEdXJhYmxlUHVibGlzaEtpdFZhbHVlRHVyYWJpbGl0eVxuICpcbiAqIER1cmFiaWxpdHkgY29uZmlndXJlcyBjb25zdHJhaW50cyBvbiBub24tdGVybWluYWwgdmFsdWVzIHRoYXQgY2FuIGJlXG4gKiBwdWJsaXNoZWQgdG8gYSBkdXJhYmxlIHB1Ymxpc2gga2l0ICh0ZXJtaW5hbCB2YWx1ZXMgc2VudCB0byBmaW5pc2ggb3IgZmFpbFxuICogbXVzdCBhbHdheXMgYmUgZHVyYWJsZSkuXG4gKiAtICdtYW5kYXRvcnknIG1lYW5zIHRoYXQgZWFjaCB2YWx1ZSBtdXN0IGJlIGR1cmFibGUsIHNvIGl0IGNhbiBiZSByZXN0b3JlZFxuICogICBvbiB1cGdyYWRlLlxuICogLSAnb3Bwb3J0dW5pc3RpYycgbWVhbnMgdGhhdCBhIGR1cmFibGUgdmFsdWUgaXMgcGVyc2lzdGVkIGZvciBwb3N0LXVwZ3JhZGVcbiAqICAgcmVzdG9yYXRpb24sIGJ1dCBhIG5vbi1kdXJhYmxlIHZhbHVlIGlzIHN0aWxsIGFjY2VwdGVkIChhbmQgd2lsbCByZXN1bHQgaW5cbiAqICAgdmFsdWVsZXNzIHJlc3RvcmF0aW9uKS5cbiAqIC0gJ2lnbm9yZWQnIG1lYW5zIHRoYXQgYSB2YWx1ZSBpcyBub3QgcGVyc2lzdGVkIGZvciByZXN0b3JhdGlvbiBldmVuIGlmIGl0XG4gKiAgIGlzIGR1cmFibGUuXG4gKlxuICogJ21hbmRhdG9yeScgaXMgdGhlIG9ubHkgY3VycmVudGx5LXN1cHBvcnRlZCB2YWx1ZSwgYW5kIG90aGVycyBtdXN0IG5vdCBiZVxuICogZW5hYmxlZCB3aXRob3V0IHRlc3QgY292ZXJhZ2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBEdXJhYmxlUHVibGlzaEtpdFN0YXRlXG4gKlxuICogQHByb3BlcnR5IHtEdXJhYmxlUHVibGlzaEtpdFZhbHVlRHVyYWJpbGl0eX0gdmFsdWVEdXJhYmlsaXR5XG4gKlxuICogQHByb3BlcnR5IHtiaWdpbnR9IHB1Ymxpc2hDb3VudFxuICpcbiAqIEBwcm9wZXJ0eSB7J2xpdmUnIHwgJ2ZpbmlzaGVkJyB8ICdmYWlsZWQnfSBzdGF0dXNcbiAqXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGhhc1ZhbHVlXG4gKiBoYXNWYWx1ZSBpbmRpY2F0ZXMgdGhlIHByZXNlbmNlIG9mIHZhbHVlLiBJdCBzdGFydHMgb2ZmIGZhbHNlLFxuICogYW5kIGNhbiBiZSByZXNldCB0byBmYWxzZSB3aGVuIGEgZHVyYWJsZSBwdWJsaXNoIGtpdCBpcyByZXN0b3JlZCBhbmRcbiAqIHRoZSBwcmV2aW91cyB2YWx1ZSB3YXMgbm90IGR1cmFibGUsIG9yIG5vbi10ZXJtaW5hbCBhbmQgdmFsdWVEdXJhYmxpdHkgaXMgJ2lnbm9yZWQnLlxuICpcbiAqIEBwcm9wZXJ0eSB7YW55fSB2YWx1ZVxuICogdmFsdWUgaG9sZHMgZWl0aGVyIGEgbm9uLXRlcm1pbmFsIHZhbHVlIGZyb20gYHB1Ymxpc2hgIG9yIGEgdGVybWluYWwgdmFsdWVcbiAqIGZyb20gYGZpbmlzaGAgb3IgYGZhaWxgLCBkZXBlbmRpbmcgdXBvbiB0aGUgdmFsdWUgaW4gc3RhdHVzLlxuICovXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyogVE9ETzogTmFycm93IHRvIGV4Y2x1ZGUgbnVtYmVyLiovXG4vKipcbiAqIEB0eXBlZGVmIHtudW1iZXIgfCBiaWdpbnQgfCB1bmRlZmluZWR9IFVwZGF0ZUNvdW50IGEgdmFsdWUgdXNlZCB0byBtYXJrIHRoZSBwb3NpdGlvblxuICogaW4gdGhlIHVwZGF0ZSBzdHJlYW0uIEZvciB0aGUgbGFzdCBzdGF0ZSwgdGhlIHVwZGF0ZUNvdW50IGlzIHVuZGVmaW5lZC5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBVcGRhdGVSZWNvcmQ8VD5cbiAqIEBwcm9wZXJ0eSB7VH0gdmFsdWUgaXMgd2hhdGV2ZXIgc3RhdGUgdGhlIHNlcnZpY2Ugd2FudHMgdG8gcHVibGlzaFxuICogQHByb3BlcnR5IHtVcGRhdGVDb3VudH0gdXBkYXRlQ291bnQgaXMgYSB2YWx1ZSB0aGF0IGlkZW50aWZpZXMgdGhlIHVwZGF0ZVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBjYWxsYmFjayBHZXRVcGRhdGVTaW5jZTxUPiBDYW4gYmUgY2FsbGVkIHJlcGVhdGVkbHkgdG8gZ2V0IGEgc2VxdWVuY2Ugb2ZcbiAqIHVwZGF0ZSByZWNvcmRzXG4gKiBAcGFyYW0ge1VwZGF0ZUNvdW50fSBbdXBkYXRlQ291bnRdIHJldHVybiB1cGRhdGUgcmVjb3JkIGFzIG9mIGFuIHVwZGF0ZVxuICogY291bnQuIElmIHRoZSBgdXBkYXRlQ291bnRgIGFyZ3VtZW50IGlzIG9taXR0ZWQgb3IgZGlmZmVycyBmcm9tIHRoZSBjdXJyZW50XG4gKiB1cGRhdGUgY291bnQsIHJldHVybiB0aGUgY3VycmVudCByZWNvcmQuXG4gKiBPdGhlcndpc2UsIGFmdGVyIHRoZSBuZXh0IHN0YXRlIGNoYW5nZSwgdGhlIHByb21pc2Ugd2lsbCByZXNvbHZlIHRvIHRoZVxuICogdGhlbi1jdXJyZW50IHZhbHVlIG9mIHRoZSByZWNvcmQuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxVcGRhdGVSZWNvcmQ8VD4+fSByZXNvbHZlcyB0byB0aGUgY29ycmVzcG9uZGluZ1xuICogdXBkYXRlXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gQmFzZU5vdGlmaWVyPFQ+IGFuIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvIGdldCB0aGVcbiAqIGN1cnJlbnQgc3RhdGUgb3IgdXBkYXRlc1xuICogQHByb3BlcnR5IHtHZXRVcGRhdGVTaW5jZTxUPn0gZ2V0VXBkYXRlU2luY2UgcmV0dXJuIHVwZGF0ZSByZWNvcmQgYXMgb2YgYW5cbiAqIHVwZGF0ZSBjb3VudC5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7QmFzZU5vdGlmaWVyPFQ+fSBOb3RpZmllckludGVybmFscyBXaWxsIGJlIHNoYXJlZCBiZXR3ZWVuIG1hY2hpbmVzLFxuICogc28gaXQgbXVzdCBiZSBzYWZlIHRvIGV4cG9zZS4gQnV0IG90aGVyIHNvZnR3YXJlIHNob3VsZCBhdm9pZCBkZXBlbmRpbmcgb25cbiAqIGl0cyBpbnRlcm5hbCBzdHJ1Y3R1cmUuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge0Jhc2VOb3RpZmllcjxUPiAmXG4gKiAgIENvbnNpc3RlbnRBc3luY0l0ZXJhYmxlPFQ+ICZcbiAqICAgU2hhcmFibGVOb3RpZmllcjxUPlxuICogfSBOb3RpZmllcjxUPiBhbiBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCB0byBnZXQgdGhlIGN1cnJlbnQgc3RhdGUgb3IgdXBkYXRlc1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFNoYXJhYmxlTm90aWZpZXJcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gRVJlZjxOb3RpZmllckludGVybmFsczxUPj59IGdldFNoYXJhYmxlTm90aWZpZXJJbnRlcm5hbHNcbiAqIFVzZWQgdG8gcmVwbGljYXRlIHRoZSBtdWx0aWNhc3QgdmFsdWVzIGF0IG90aGVyIHNpdGVzLiBUbyBtYW51YWxseSBjcmVhdGUgYVxuICogbG9jYWwgcmVwcmVzZW50YXRpdmUgb2YgYSBOb3RpZmljYXRpb24sIGRvXG4gKiBgYGBqc1xuICogbG9jYWxJdGVyYWJsZSA9XG4gKiAgIG1ha2VOb3RpZmllcihFKHJlbW90ZUl0ZXJhYmxlKS5nZXRTaGFyYWJsZU5vdGlmaWVySW50ZXJuYWxzKCkpO1xuICogYGBgXG4gKiBUaGUgcmVzdWx0aW5nIGBsb2NhbEl0ZXJhYmxlYCBhbHNvIHN1cHBvcnRzIHN1Y2ggcmVtb3RlIHVzZSwgYW5kXG4gKiB3aWxsIHJldHVybiBhY2Nlc3MgdG8gdGhlIHNhbWUgcmVwcmVzZW50YXRpb24uXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gTm90aWZpZXJSZWNvcmQ8VD4gdGhlIHByb2R1Y2VkIG5vdGlmaWVyL3VwZGF0ZXIgcGFpclxuICogQHByb3BlcnR5IHtJdGVyYXRpb25PYnNlcnZlcjxUPn0gdXBkYXRlciB0aGUgKGNsb3NlbHktaGVsZCkgbm90aWZpZXIgcHJvZHVjZXJcbiAqIEBwcm9wZXJ0eSB7Tm90aWZpZXI8VD59IG5vdGlmaWVyIHRoZSAod2lkZWx5LWhlbGQpIG5vdGlmaWVyIGNvbnN1bWVyXG4gKi9cblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7Q29uc2lzdGVudEFzeW5jSXRlcmFibGU8VD4gJlxuICogICBTaGFyYWJsZVN1YnNjcmlwdGlvbjxUPn0gU3Vic2NyaXB0aW9uPFQ+XG4gKiBBIGZvcm0gb2YgQXN5bmNJdGVyYWJsZSBzdXBwb3J0aW5nIGRpc3RyaWJ1dGVkIGFuZCBtdWx0aWNhc3QgdXNhZ2UuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gU2hhcmFibGVTdWJzY3JpcHRpb25cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gRVJlZjxQdWJsaWNhdGlvblJlY29yZDxUPj59IGdldFNoYXJhYmxlU3Vic2NyaXB0aW9uSW50ZXJuYWxzXG4gKiBVc2VkIHRvIHJlcGxpY2F0ZSB0aGUgbXVsdGljYXN0IHZhbHVlcyBhdCBvdGhlciBzaXRlcy4gVG8gbWFudWFsbHkgY3JlYXRlIGFcbiAqIGxvY2FsIHJlcHJlc2VudGF0aXZlIG9mIGEgU3Vic2NyaXB0aW9uLCBkb1xuICogYGBganNcbiAqIGxvY2FsSXRlcmFibGUgPVxuICogICBtYWtlU3Vic2NyaXB0aW9uKEUocmVtb3RlSXRlcmFibGUpLmdldFNoYXJhYmxlU3Vic2NyaXB0aW9uSW50ZXJuYWxzKCkpO1xuICogYGBgXG4gKiBUaGUgcmVzdWx0aW5nIGBsb2NhbEl0ZXJhYmxlYCBhbHNvIHN1cHBvcnRzIHN1Y2ggcmVtb3RlIHVzZSwgYW5kXG4gKiB3aWxsIHJldHVybiBhY2Nlc3MgdG8gdGhlIHNhbWUgcmVwcmVzZW50YXRpb24uXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge0FzeW5jSXRlcmF0b3I8VCwgVD4gJiBDb25zaXN0ZW50QXN5bmNJdGVyYWJsZTxUPn0gU3Vic2NyaXB0aW9uSXRlcmF0b3I8VD5cbiAqIGFuIEFzeW5jSXRlcmF0b3Igc3VwcG9ydGluZyBkaXN0cmlidXRlZCBhbmQgbXVsdGljYXN0IHVzYWdlLlxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gU3Vic2NyaXB0aW9uPFQ+fSBzdWJzY3JpYmVcbiAqIEdldCBhIG5ldyBzdWJzY3JpcHRpb24gd2hvc2Ugc3RhcnRpbmcgcG9zaXRpb24gaXMgdGhpcyBpdGVyYXRvcidzIGN1cnJlbnRcbiAqIHBvc2l0aW9uLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN1YnNjcmlwdGlvblJlY29yZDxUPlxuICogQHByb3BlcnR5IHtJdGVyYXRpb25PYnNlcnZlcjxUPn0gcHVibGljYXRpb25cbiAqIEBwcm9wZXJ0eSB7U3Vic2NyaXB0aW9uPFQ+fSBzdWJzY3JpcHRpb25cbiAqL1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKiBAdHlwZWRlZiB7UmV0dXJuVHlwZTx0eXBlb2YgWGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLm1ha2VNYXJzaGFsPn0gTWFyc2hhbGxlciAqL1xuLyoqIEB0eXBlZGVmIHtQaWNrPE1hcnNoYWxsZXIsICd1bnNlcmlhbGl6ZSc+fSBVbnNlcmlhbGl6ZXIgKi9cblxuLyoqXG4gKiBEZWZpbmVkIGJ5IHZzdG9yYWdlU3RvcmVLZXkgaW4gdnN0b3JhZ2UuZ29cbiAqXG4gKiBAdHlwZWRlZiBWU3RvcmFnZUtleVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHN0b3JlTmFtZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHN0b3JlU3Via2V5XG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGF0YVByZWZpeEJ5dGVzXG4gKi9cblxuLyoqXG4gKiBUaGlzIHJlcHJlc2VudHMgYSBub2RlIGluIGFuIElBVkwgdHJlZS5cbiAqXG4gKiBUaGUgYWN0aXZlIGltcGxlbWVudGF0aW9uIGlzIHgvdnN0b3JhZ2UsIGFuIEFnb3JpYyBleHRlbnNpb24gb2YgdGhlIENvc21vcyBTREsuXG4gKlxuICogVnN0b3JhZ2UgaXMgYSBoaWVyYXJjaGljYWwgZXh0ZXJuYWxseS1yZWFjaGFibGUgc3RvcmFnZSBzdHJ1Y3R1cmUgdGhhdFxuICogaWRlbnRpZmllcyBjaGlsZHJlbiBieSByZXN0cmljdGVkIEFTQ0lJIG5hbWUgYW5kIGlzIGFzc29jaWF0ZWQgd2l0aCBhcmJpdHJhcnlcbiAqIHN0cmluZy12YWx1ZWQgZGF0YSBmb3IgZWFjaCBub2RlLCBkZWZhdWx0aW5nIHRvIHRoZSBlbXB0eSBzdHJpbmcuXG4gKlxuICogQHR5cGVkZWYge29iamVjdH0gU3RvcmFnZU5vZGVcbiAqIEBwcm9wZXJ0eSB7KGRhdGE6IHN0cmluZykgPT4gdm9pZH0gc2V0VmFsdWUgcHVibGlzaGVzIHNvbWUgZGF0YVxuICogQHByb3BlcnR5IHsoKSA9PiBFUmVmPFZTdG9yYWdlS2V5Pn0gZ2V0U3RvcmVLZXkgZ2V0IHRoZVxuICogZXh0ZXJuYWxseS1yZWFjaGFibGUgc3RvcmUga2V5IGZvciB0aGlzIHN0b3JhZ2UgaXRlbVxuICogQHByb3BlcnR5IHsoc3ViUGF0aDogc3RyaW5nLCBvcHRpb25zPzoge3NlcXVlbmNlPzogYm9vbGVhbn0pID0+IFN0b3JhZ2VOb2RlfSBtYWtlQ2hpbGROb2RlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTdG9yZWRGYWNldFxuICogQHByb3BlcnR5IHtTdG9yYWdlTm9kZVsnZ2V0U3RvcmVLZXknXX0gZ2V0U3RvcmVLZXkgZ2V0IHRoZSBleHRlcm5hbGx5LXJlYWNoYWJsZSBzdG9yZSBrZXlcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gVW5zZXJpYWxpemVyfSBnZXRVbnNlcmlhbGl6ZXIgZ2V0IHRoZSB1bnNlcmlhbGl6ZXIgZm9yIHRoZSBzdG9yZWQgZGF0YVxuICovXG5cbi8qKlxuICogQGRlcHJlY2F0ZWRcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7U3Vic2NyaXB0aW9uPFQ+ICYgU3RvcmVkRmFjZXR9IFN0b3JlZFN1YnNjcmlwdGlvblxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtTdWJzY3JpYmVyPFQ+ICYgU3RvcmVkRmFjZXR9IFN0b3JlZFN1YnNjcmliZXJcbiAqL1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADW1iozlQEAAJUBAAAgAAAAQGFnb3JpYy9zdG9yZS12MC44LjMvZXhwb3J0ZWQuanN7ImltcG9ydHMiOlsiLi9zcmMvcGF0dGVybnMvaW50ZXJuYWwtdHlwZXMuanMiLCIuL3NyYy90eXBlcy5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3NyYy90eXBlcy5qc1wiLCBbXV0sW1wiLi9zcmMvcGF0dGVybnMvaW50ZXJuYWwtdHlwZXMuanNcIiwgW11dXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAE5VRpSeIgAAniIAACEAAABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvaW5kZXguanN7ImltcG9ydHMiOlsiLi9rZXlzL2NoZWNrS2V5LmpzIiwiLi9rZXlzL2NvbXBhcmVLZXlzLmpzIiwiLi9rZXlzL2NvcHlCYWcuanMiLCIuL2tleXMvY29weVNldC5qcyIsIi4va2V5cy9tZXJnZS1iYWctb3BlcmF0b3JzLmpzIiwiLi9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanMiLCIuL2xlZ2FjeS9sZWdhY3lNYXAuanMiLCIuL2xlZ2FjeS9sZWdhY3lXZWFrTWFwLmpzIiwiLi9wYXR0ZXJucy9lbmNvZGVQYXNzYWJsZS5qcyIsIi4vcGF0dGVybnMvaW50ZXJmYWNlLXRvb2xzLmpzIiwiLi9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanMiLCIuL3BhdHRlcm5zL3JhbmtPcmRlci5qcyIsIi4vc3RvcmVzL3NjYWxhck1hcFN0b3JlLmpzIiwiLi9zdG9yZXMvc2NhbGFyU2V0U3RvcmUuanMiLCIuL3N0b3Jlcy9zY2FsYXJXZWFrTWFwU3RvcmUuanMiLCIuL3N0b3Jlcy9zY2FsYXJXZWFrU2V0U3RvcmUuanMiLCIuL3N0b3Jlcy9zdG9yZS11dGlscy5qcyJdLCJleHBvcnRzIjpbIk0iLCJhc3NlcnRLZXkiLCJhc3NlcnRLZXlQYXR0ZXJuIiwiYXNzZXJ0UGF0dGVybiIsImJhZ0NvbXBhcmUiLCJiYWdEaXNqb2ludFN1YnRyYWN0IiwiYmFnSW50ZXJzZWN0aW9uIiwiYmFnSXNTdXBlcmJhZyIsImJhZ1VuaW9uIiwiY29lcmNlVG9CYWdFbnRyaWVzIiwiY29lcmNlVG9FbGVtZW50cyIsImNvbXBhcmVLZXlzIiwiY29tcGFyZVJhbmsiLCJkZWZhdWx0IiwiZGVmZW5kUHJvdG90eXBlIiwiZGVmZW5kUHJvdG90eXBlS2l0IiwiZGVmaW5lSGVhcEZhckNsYXNzIiwiZGVmaW5lSGVhcEZhckNsYXNzS2l0IiwiZWxlbWVudHNDb21wYXJlIiwiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0IiwiZWxlbWVudHNEaXNqb2ludFVuaW9uIiwiZWxlbWVudHNJbnRlcnNlY3Rpb24iLCJlbGVtZW50c0lzRGlzam9pbnQiLCJlbGVtZW50c0lzU3VwZXJzZXQiLCJlbGVtZW50c1VuaW9uIiwiZml0IiwiZ2V0Q29weUJhZ0VudHJpZXMiLCJnZXRDb3B5TWFwRW50cmllcyIsImdldENvcHlTZXRLZXlzIiwiZ2V0UmFua0NvdmVyIiwiaW5pdEVtcHR5IiwiaXNFbmNvZGVkUmVtb3RhYmxlIiwiaXNLZXkiLCJpc1BhdHRlcm4iLCJpc1JhbmtTb3J0ZWQiLCJrZXlFUSIsImtleUdUIiwia2V5R1RFIiwia2V5TFQiLCJrZXlMVEUiLCJtYWtlQ29weUJhZyIsIm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzIiwibWFrZUNvcHlNYXAiLCJtYWtlQ29weVNldCIsIm1ha2VEZWNvZGVQYXNzYWJsZSIsIm1ha2VFbmNvZGVQYXNzYWJsZSIsIm1ha2VIZWFwRmFySW5zdGFuY2UiLCJtYWtlTGVnYWN5TWFwIiwibWFrZUxlZ2FjeVdlYWtNYXAiLCJtYWtlU2NhbGFyTWFwIiwibWFrZVNjYWxhck1hcFN0b3JlIiwibWFrZVNjYWxhclNldFN0b3JlIiwibWFrZVNjYWxhcldlYWtNYXAiLCJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIiwibWFrZVNjYWxhcldlYWtTZXRTdG9yZSIsIm1ha2VTdG9yZSIsIm1ha2VXZWFrU3RvcmUiLCJtYXRjaGVzIiwicHJvdmlkZUxhenkiLCJzZXRDb21wYXJlIiwic2V0RGlzam9pbnRTdWJ0cmFjdCIsInNldERpc2pvaW50VW5pb24iLCJzZXRJbnRlcnNlY3Rpb24iLCJzZXRJc0Rpc2pvaW50Iiwic2V0SXNTdXBlcnNldCIsInNldFVuaW9uIiwic29ydEJ5UmFuayIsInplcm9QYWQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL2tleXMvY2hlY2tLZXkuanNcIiwgW1tcImlzS2V5XCIsIFskaOKAjV9saXZlW1wiaXNLZXlcIl1dXSxbXCJhc3NlcnRLZXlcIiwgWyRo4oCNX2xpdmVbXCJhc3NlcnRLZXlcIl1dXSxbXCJtYWtlQ29weVNldFwiLCBbJGjigI1fbGl2ZVtcIm1ha2VDb3B5U2V0XCJdXV0sW1wiZ2V0Q29weVNldEtleXNcIiwgWyRo4oCNX2xpdmVbXCJnZXRDb3B5U2V0S2V5c1wiXV1dLFtcIm1ha2VDb3B5QmFnXCIsIFskaOKAjV9saXZlW1wibWFrZUNvcHlCYWdcIl1dXSxbXCJtYWtlQ29weUJhZ0Zyb21FbGVtZW50c1wiLCBbJGjigI1fbGl2ZVtcIm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzXCJdXV0sW1wiZ2V0Q29weUJhZ0VudHJpZXNcIiwgWyRo4oCNX2xpdmVbXCJnZXRDb3B5QmFnRW50cmllc1wiXV1dLFtcIm1ha2VDb3B5TWFwXCIsIFskaOKAjV9saXZlW1wibWFrZUNvcHlNYXBcIl1dXSxbXCJnZXRDb3B5TWFwRW50cmllc1wiLCBbJGjigI1fbGl2ZVtcImdldENvcHlNYXBFbnRyaWVzXCJdXV1dXSxbXCIuL2tleXMvY29weVNldC5qc1wiLCBbW1wiY29lcmNlVG9FbGVtZW50c1wiLCBbJGjigI1fbGl2ZVtcImNvZXJjZVRvRWxlbWVudHNcIl1dXV1dLFtcIi4va2V5cy9jb3B5QmFnLmpzXCIsIFtbXCJjb2VyY2VUb0JhZ0VudHJpZXNcIiwgWyRo4oCNX2xpdmVbXCJjb2VyY2VUb0JhZ0VudHJpZXNcIl1dXV1dLFtcIi4va2V5cy9jb21wYXJlS2V5cy5qc1wiLCBbW1wiY29tcGFyZUtleXNcIiwgWyRo4oCNX2xpdmVbXCJjb21wYXJlS2V5c1wiXV1dLFtcImtleUxUXCIsIFskaOKAjV9saXZlW1wia2V5TFRcIl1dXSxbXCJrZXlMVEVcIiwgWyRo4oCNX2xpdmVbXCJrZXlMVEVcIl1dXSxbXCJrZXlFUVwiLCBbJGjigI1fbGl2ZVtcImtleUVRXCJdXV0sW1wia2V5R1RFXCIsIFskaOKAjV9saXZlW1wia2V5R1RFXCJdXV0sW1wia2V5R1RcIiwgWyRo4oCNX2xpdmVbXCJrZXlHVFwiXV1dXV0sW1wiLi9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanNcIiwgW1tcImVsZW1lbnRzSXNTdXBlcnNldFwiLCBbJGjigI1fbGl2ZVtcImVsZW1lbnRzSXNTdXBlcnNldFwiXV1dLFtcImVsZW1lbnRzSXNEaXNqb2ludFwiLCBbJGjigI1fbGl2ZVtcImVsZW1lbnRzSXNEaXNqb2ludFwiXV1dLFtcImVsZW1lbnRzQ29tcGFyZVwiLCBbJGjigI1fbGl2ZVtcImVsZW1lbnRzQ29tcGFyZVwiXV1dLFtcImVsZW1lbnRzVW5pb25cIiwgWyRo4oCNX2xpdmVbXCJlbGVtZW50c1VuaW9uXCJdXV0sW1wiZWxlbWVudHNEaXNqb2ludFVuaW9uXCIsIFskaOKAjV9saXZlW1wiZWxlbWVudHNEaXNqb2ludFVuaW9uXCJdXV0sW1wiZWxlbWVudHNJbnRlcnNlY3Rpb25cIiwgWyRo4oCNX2xpdmVbXCJlbGVtZW50c0ludGVyc2VjdGlvblwiXV1dLFtcImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdFwiLCBbJGjigI1fbGl2ZVtcImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdFwiXV1dLFtcInNldElzU3VwZXJzZXRcIiwgWyRo4oCNX2xpdmVbXCJzZXRJc1N1cGVyc2V0XCJdXV0sW1wic2V0SXNEaXNqb2ludFwiLCBbJGjigI1fbGl2ZVtcInNldElzRGlzam9pbnRcIl1dXSxbXCJzZXRDb21wYXJlXCIsIFskaOKAjV9saXZlW1wic2V0Q29tcGFyZVwiXV1dLFtcInNldFVuaW9uXCIsIFskaOKAjV9saXZlW1wic2V0VW5pb25cIl1dXSxbXCJzZXREaXNqb2ludFVuaW9uXCIsIFskaOKAjV9saXZlW1wic2V0RGlzam9pbnRVbmlvblwiXV1dLFtcInNldEludGVyc2VjdGlvblwiLCBbJGjigI1fbGl2ZVtcInNldEludGVyc2VjdGlvblwiXV1dLFtcInNldERpc2pvaW50U3VidHJhY3RcIiwgWyRo4oCNX2xpdmVbXCJzZXREaXNqb2ludFN1YnRyYWN0XCJdXV1dXSxbXCIuL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qc1wiLCBbW1wiYmFnSXNTdXBlcmJhZ1wiLCBbJGjigI1fbGl2ZVtcImJhZ0lzU3VwZXJiYWdcIl1dXSxbXCJiYWdDb21wYXJlXCIsIFskaOKAjV9saXZlW1wiYmFnQ29tcGFyZVwiXV1dLFtcImJhZ1VuaW9uXCIsIFskaOKAjV9saXZlW1wiYmFnVW5pb25cIl1dXSxbXCJiYWdJbnRlcnNlY3Rpb25cIiwgWyRo4oCNX2xpdmVbXCJiYWdJbnRlcnNlY3Rpb25cIl1dXSxbXCJiYWdEaXNqb2ludFN1YnRyYWN0XCIsIFskaOKAjV9saXZlW1wiYmFnRGlzam9pbnRTdWJ0cmFjdFwiXV1dXV0sW1wiLi9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanNcIiwgW1tcIk1cIiwgWyRo4oCNX2xpdmVbXCJNXCJdXV0sW1wiZ2V0UmFua0NvdmVyXCIsIFskaOKAjV9saXZlW1wiZ2V0UmFua0NvdmVyXCJdXV0sW1wiaXNQYXR0ZXJuXCIsIFskaOKAjV9saXZlW1wiaXNQYXR0ZXJuXCJdXV0sW1wiYXNzZXJ0UGF0dGVyblwiLCBbJGjigI1fbGl2ZVtcImFzc2VydFBhdHRlcm5cIl1dXSxbXCJhc3NlcnRLZXlQYXR0ZXJuXCIsIFskaOKAjV9saXZlW1wiYXNzZXJ0S2V5UGF0dGVyblwiXV1dLFtcIm1hdGNoZXNcIiwgWyRo4oCNX2xpdmVbXCJtYXRjaGVzXCJdXV0sW1wiZml0XCIsIFskaOKAjV9saXZlW1wiZml0XCJdXV1dXSxbXCIuL3BhdHRlcm5zL2ludGVyZmFjZS10b29scy5qc1wiLCBbW1wiZGVmZW5kUHJvdG90eXBlXCIsIFskaOKAjV9saXZlW1wiZGVmZW5kUHJvdG90eXBlXCJdXV0sW1wiZGVmZW5kUHJvdG90eXBlS2l0XCIsIFskaOKAjV9saXZlW1wiZGVmZW5kUHJvdG90eXBlS2l0XCJdXV0sW1wiaW5pdEVtcHR5XCIsIFskaOKAjV9saXZlW1wiaW5pdEVtcHR5XCJdXV0sW1wiZGVmaW5lSGVhcEZhckNsYXNzXCIsIFskaOKAjV9saXZlW1wiZGVmaW5lSGVhcEZhckNsYXNzXCJdXV0sW1wiZGVmaW5lSGVhcEZhckNsYXNzS2l0XCIsIFskaOKAjV9saXZlW1wiZGVmaW5lSGVhcEZhckNsYXNzS2l0XCJdXV0sW1wibWFrZUhlYXBGYXJJbnN0YW5jZVwiLCBbJGjigI1fbGl2ZVtcIm1ha2VIZWFwRmFySW5zdGFuY2VcIl1dXV1dLFtcIi4vcGF0dGVybnMvcmFua09yZGVyLmpzXCIsIFtbXCJjb21wYXJlUmFua1wiLCBbJGjigI1fbGl2ZVtcImNvbXBhcmVSYW5rXCJdXV0sW1wiaXNSYW5rU29ydGVkXCIsIFskaOKAjV9saXZlW1wiaXNSYW5rU29ydGVkXCJdXV0sW1wic29ydEJ5UmFua1wiLCBbJGjigI1fbGl2ZVtcInNvcnRCeVJhbmtcIl1dXV1dLFtcIi4vcGF0dGVybnMvZW5jb2RlUGFzc2FibGUuanNcIiwgW1tcIm1ha2VEZWNvZGVQYXNzYWJsZVwiLCBbJGjigI1fbGl2ZVtcIm1ha2VEZWNvZGVQYXNzYWJsZVwiXV1dLFtcIm1ha2VFbmNvZGVQYXNzYWJsZVwiLCBbJGjigI1fbGl2ZVtcIm1ha2VFbmNvZGVQYXNzYWJsZVwiXV1dLFtcImlzRW5jb2RlZFJlbW90YWJsZVwiLCBbJGjigI1fbGl2ZVtcImlzRW5jb2RlZFJlbW90YWJsZVwiXV1dLFtcInplcm9QYWRcIiwgWyRo4oCNX2xpdmVbXCJ6ZXJvUGFkXCJdXV1dXSxbXCIuL3N0b3Jlcy9zY2FsYXJXZWFrU2V0U3RvcmUuanNcIiwgW1tcIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmVcIiwgWyRo4oCNX2xpdmVbXCJtYWtlU2NhbGFyV2Vha1NldFN0b3JlXCJdXV1dXSxbXCIuL3N0b3Jlcy9zY2FsYXJTZXRTdG9yZS5qc1wiLCBbW1wibWFrZVNjYWxhclNldFN0b3JlXCIsIFskaOKAjV9saXZlW1wibWFrZVNjYWxhclNldFN0b3JlXCJdXV1dXSxbXCIuL3N0b3Jlcy9zY2FsYXJXZWFrTWFwU3RvcmUuanNcIiwgW1tcIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmVcIiwgWyRo4oCNX2xpdmVbXCJtYWtlU2NhbGFyV2Vha01hcFN0b3JlXCJdLCRo4oCNX2xpdmVbXCJtYWtlU2NhbGFyV2Vha01hcFN0b3JlXCJdLCRo4oCNX2xpdmVbXCJtYWtlU2NhbGFyV2Vha01hcFN0b3JlXCJdXV1dXSxbXCIuL3N0b3Jlcy9zY2FsYXJNYXBTdG9yZS5qc1wiLCBbW1wibWFrZVNjYWxhck1hcFN0b3JlXCIsIFskaOKAjV9saXZlW1wibWFrZVNjYWxhck1hcFN0b3JlXCJdLCRo4oCNX2xpdmVbXCJtYWtlU2NhbGFyTWFwU3RvcmVcIl0sJGjigI1fbGl2ZVtcIm1ha2VTY2FsYXJNYXBTdG9yZVwiXV1dXV0sW1wiLi9zdG9yZXMvc3RvcmUtdXRpbHMuanNcIiwgW1tcInByb3ZpZGVMYXp5XCIsIFskaOKAjV9saXZlW1wicHJvdmlkZUxhenlcIl1dXV1dLFtcIi4vbGVnYWN5L2xlZ2FjeU1hcC5qc1wiLCBbW1wibWFrZUxlZ2FjeU1hcFwiLCBbJGjigI1fbGl2ZVtcIm1ha2VMZWdhY3lNYXBcIl0sJGjigI1fbGl2ZVtcIm1ha2VMZWdhY3lNYXBcIl1dXV1dLFtcIi4vbGVnYWN5L2xlZ2FjeVdlYWtNYXAuanNcIiwgW1tcIm1ha2VMZWdhY3lXZWFrTWFwXCIsIFskaOKAjV9saXZlW1wibWFrZUxlZ2FjeVdlYWtNYXBcIl1dXV1dXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnsiaXNLZXkiOlsiaXNLZXkiLGZhbHNlXSwiYXNzZXJ0S2V5IjpbImFzc2VydEtleSIsZmFsc2VdLCJtYWtlQ29weVNldCI6WyJtYWtlQ29weVNldCIsZmFsc2VdLCJnZXRDb3B5U2V0S2V5cyI6WyJnZXRDb3B5U2V0S2V5cyIsZmFsc2VdLCJtYWtlQ29weUJhZyI6WyJtYWtlQ29weUJhZyIsZmFsc2VdLCJtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyI6WyJtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyIsZmFsc2VdLCJnZXRDb3B5QmFnRW50cmllcyI6WyJnZXRDb3B5QmFnRW50cmllcyIsZmFsc2VdLCJtYWtlQ29weU1hcCI6WyJtYWtlQ29weU1hcCIsZmFsc2VdLCJnZXRDb3B5TWFwRW50cmllcyI6WyJnZXRDb3B5TWFwRW50cmllcyIsZmFsc2VdLCJjb2VyY2VUb0VsZW1lbnRzIjpbImNvZXJjZVRvRWxlbWVudHMiLGZhbHNlXSwiY29lcmNlVG9CYWdFbnRyaWVzIjpbImNvZXJjZVRvQmFnRW50cmllcyIsZmFsc2VdLCJjb21wYXJlS2V5cyI6WyJjb21wYXJlS2V5cyIsZmFsc2VdLCJrZXlMVCI6WyJrZXlMVCIsZmFsc2VdLCJrZXlMVEUiOlsia2V5TFRFIixmYWxzZV0sImtleUVRIjpbImtleUVRIixmYWxzZV0sImtleUdURSI6WyJrZXlHVEUiLGZhbHNlXSwia2V5R1QiOlsia2V5R1QiLGZhbHNlXSwiZWxlbWVudHNJc1N1cGVyc2V0IjpbImVsZW1lbnRzSXNTdXBlcnNldCIsZmFsc2VdLCJlbGVtZW50c0lzRGlzam9pbnQiOlsiZWxlbWVudHNJc0Rpc2pvaW50IixmYWxzZV0sImVsZW1lbnRzQ29tcGFyZSI6WyJlbGVtZW50c0NvbXBhcmUiLGZhbHNlXSwiZWxlbWVudHNVbmlvbiI6WyJlbGVtZW50c1VuaW9uIixmYWxzZV0sImVsZW1lbnRzRGlzam9pbnRVbmlvbiI6WyJlbGVtZW50c0Rpc2pvaW50VW5pb24iLGZhbHNlXSwiZWxlbWVudHNJbnRlcnNlY3Rpb24iOlsiZWxlbWVudHNJbnRlcnNlY3Rpb24iLGZhbHNlXSwiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0IjpbImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCIsZmFsc2VdLCJzZXRJc1N1cGVyc2V0IjpbInNldElzU3VwZXJzZXQiLGZhbHNlXSwic2V0SXNEaXNqb2ludCI6WyJzZXRJc0Rpc2pvaW50IixmYWxzZV0sInNldENvbXBhcmUiOlsic2V0Q29tcGFyZSIsZmFsc2VdLCJzZXRVbmlvbiI6WyJzZXRVbmlvbiIsZmFsc2VdLCJzZXREaXNqb2ludFVuaW9uIjpbInNldERpc2pvaW50VW5pb24iLGZhbHNlXSwic2V0SW50ZXJzZWN0aW9uIjpbInNldEludGVyc2VjdGlvbiIsZmFsc2VdLCJzZXREaXNqb2ludFN1YnRyYWN0IjpbInNldERpc2pvaW50U3VidHJhY3QiLGZhbHNlXSwiYmFnSXNTdXBlcmJhZyI6WyJiYWdJc1N1cGVyYmFnIixmYWxzZV0sImJhZ0NvbXBhcmUiOlsiYmFnQ29tcGFyZSIsZmFsc2VdLCJiYWdVbmlvbiI6WyJiYWdVbmlvbiIsZmFsc2VdLCJiYWdJbnRlcnNlY3Rpb24iOlsiYmFnSW50ZXJzZWN0aW9uIixmYWxzZV0sImJhZ0Rpc2pvaW50U3VidHJhY3QiOlsiYmFnRGlzam9pbnRTdWJ0cmFjdCIsZmFsc2VdLCJNIjpbIk0iLGZhbHNlXSwiZ2V0UmFua0NvdmVyIjpbImdldFJhbmtDb3ZlciIsZmFsc2VdLCJpc1BhdHRlcm4iOlsiaXNQYXR0ZXJuIixmYWxzZV0sImFzc2VydFBhdHRlcm4iOlsiYXNzZXJ0UGF0dGVybiIsZmFsc2VdLCJhc3NlcnRLZXlQYXR0ZXJuIjpbImFzc2VydEtleVBhdHRlcm4iLGZhbHNlXSwibWF0Y2hlcyI6WyJtYXRjaGVzIixmYWxzZV0sImZpdCI6WyJmaXQiLGZhbHNlXSwiZGVmZW5kUHJvdG90eXBlIjpbImRlZmVuZFByb3RvdHlwZSIsZmFsc2VdLCJkZWZlbmRQcm90b3R5cGVLaXQiOlsiZGVmZW5kUHJvdG90eXBlS2l0IixmYWxzZV0sImluaXRFbXB0eSI6WyJpbml0RW1wdHkiLGZhbHNlXSwiZGVmaW5lSGVhcEZhckNsYXNzIjpbImRlZmluZUhlYXBGYXJDbGFzcyIsZmFsc2VdLCJkZWZpbmVIZWFwRmFyQ2xhc3NLaXQiOlsiZGVmaW5lSGVhcEZhckNsYXNzS2l0IixmYWxzZV0sIm1ha2VIZWFwRmFySW5zdGFuY2UiOlsibWFrZUhlYXBGYXJJbnN0YW5jZSIsZmFsc2VdLCJjb21wYXJlUmFuayI6WyJjb21wYXJlUmFuayIsZmFsc2VdLCJpc1JhbmtTb3J0ZWQiOlsiaXNSYW5rU29ydGVkIixmYWxzZV0sInNvcnRCeVJhbmsiOlsic29ydEJ5UmFuayIsZmFsc2VdLCJtYWtlRGVjb2RlUGFzc2FibGUiOlsibWFrZURlY29kZVBhc3NhYmxlIixmYWxzZV0sIm1ha2VFbmNvZGVQYXNzYWJsZSI6WyJtYWtlRW5jb2RlUGFzc2FibGUiLGZhbHNlXSwiaXNFbmNvZGVkUmVtb3RhYmxlIjpbImlzRW5jb2RlZFJlbW90YWJsZSIsZmFsc2VdLCJ6ZXJvUGFkIjpbInplcm9QYWQiLGZhbHNlXSwibWFrZVNjYWxhcldlYWtTZXRTdG9yZSI6WyJtYWtlU2NhbGFyV2Vha1NldFN0b3JlIixmYWxzZV0sIm1ha2VTY2FsYXJTZXRTdG9yZSI6WyJtYWtlU2NhbGFyU2V0U3RvcmUiLGZhbHNlXSwibWFrZVNjYWxhcldlYWtNYXBTdG9yZSI6WyJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIixmYWxzZV0sIm1ha2VTY2FsYXJXZWFrTWFwIjpbIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmUiLGZhbHNlXSwibWFrZVdlYWtTdG9yZSI6WyJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIixmYWxzZV0sIm1ha2VTY2FsYXJNYXBTdG9yZSI6WyJtYWtlU2NhbGFyTWFwU3RvcmUiLGZhbHNlXSwibWFrZVNjYWxhck1hcCI6WyJtYWtlU2NhbGFyTWFwU3RvcmUiLGZhbHNlXSwibWFrZVN0b3JlIjpbIm1ha2VTY2FsYXJNYXBTdG9yZSIsZmFsc2VdLCJwcm92aWRlTGF6eSI6WyJwcm92aWRlTGF6eSIsZmFsc2VdLCJtYWtlTGVnYWN5TWFwIjpbIm1ha2VMZWdhY3lNYXAiLGZhbHNlXSwiZGVmYXVsdCI6WyJtYWtlTGVnYWN5TWFwIixmYWxzZV0sIm1ha2VMZWdhY3lXZWFrTWFwIjpbIm1ha2VMZWdhY3lXZWFrTWFwIixmYWxzZV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACEE+ZSCQwAAgkMAACkAAABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMva2V5cy9jaGVja0tleS5qc3siaW1wb3J0cyI6WyIuLi9wYXR0ZXJucy9yYW5rT3JkZXIuanMiLCIuL2NvcHlCYWcuanMiLCIuL2NvcHlTZXQuanMiLCJAYWdvcmljL2Fzc2VydCIsIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJhc3NlcnRDb3B5QmFnIiwiYXNzZXJ0Q29weU1hcCIsImFzc2VydENvcHlTZXQiLCJhc3NlcnRLZXkiLCJhc3NlcnRQcmltaXRpdmVLZXkiLCJhc3NlcnRTY2FsYXJLZXkiLCJjaGVja0NvcHlCYWciLCJjaGVja0NvcHlNYXAiLCJjaGVja0NvcHlTZXQiLCJjaGVja0tleSIsImNoZWNrU2NhbGFyS2V5IiwiY29weU1hcEtleVNldCIsImV2ZXJ5Q29weUJhZ0VudHJ5IiwiZXZlcnlDb3B5TWFwS2V5IiwiZXZlcnlDb3B5TWFwVmFsdWUiLCJldmVyeUNvcHlTZXRLZXkiLCJnZXRDb3B5QmFnRW50cmllcyIsImdldENvcHlNYXBFbnRyaWVzIiwiZ2V0Q29weU1hcEtleXMiLCJnZXRDb3B5TWFwVmFsdWVzIiwiZ2V0Q29weVNldEtleXMiLCJpc0NvcHlCYWciLCJpc0NvcHlNYXAiLCJpc0NvcHlTZXQiLCJpc0tleSIsImlzUHJpbWl0aXZlS2V5IiwiaXNTY2FsYXJLZXkiLCJtYWtlQ29weUJhZyIsIm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzIiwibWFrZUNvcHlNYXAiLCJtYWtlQ29weVNldCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnRDaGVja2VyLGFzc2VydFBhc3NhYmxlLEZhcixnZXRUYWcsaXNPYmplY3QsbWFrZVRhZ2dlZCxwYXNzU3R5bGVPZixpZGVudENoZWNrZXIsY2hlY2tFbGVtZW50cyxtYWtlU2V0T2ZFbGVtZW50cyxjaGVja0JhZ0VudHJpZXMsbWFrZUJhZ09mRW50cmllcyxjb21wYXJlQW50aVJhbmssbWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQsc29ydEJ5UmFuazskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXSxbXCJhc3NlcnRQYXNzYWJsZVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGFzc2FibGUgPSAkaOKAjV9hKV1dLFtcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXSxbXCJnZXRUYWdcIiwgWyRo4oCNX2EgPT4gKGdldFRhZyA9ICRo4oCNX2EpXV0sW1wiaXNPYmplY3RcIiwgWyRo4oCNX2EgPT4gKGlzT2JqZWN0ID0gJGjigI1fYSldXSxbXCJtYWtlVGFnZ2VkXCIsIFskaOKAjV9hID0+IChtYWtlVGFnZ2VkID0gJGjigI1fYSldXSxbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9hc3NlcnRcIiwgW1tcImlkZW50Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoaWRlbnRDaGVja2VyID0gJGjigI1fYSldXV1dLFtcIi4vY29weVNldC5qc1wiLCBbW1wiY2hlY2tFbGVtZW50c1wiLCBbJGjigI1fYSA9PiAoY2hlY2tFbGVtZW50cyA9ICRo4oCNX2EpXV0sW1wibWFrZVNldE9mRWxlbWVudHNcIiwgWyRo4oCNX2EgPT4gKG1ha2VTZXRPZkVsZW1lbnRzID0gJGjigI1fYSldXV1dLFtcIi4vY29weUJhZy5qc1wiLCBbW1wiY2hlY2tCYWdFbnRyaWVzXCIsIFskaOKAjV9hID0+IChjaGVja0JhZ0VudHJpZXMgPSAkaOKAjV9hKV1dLFtcIm1ha2VCYWdPZkVudHJpZXNcIiwgWyRo4oCNX2EgPT4gKG1ha2VCYWdPZkVudHJpZXMgPSAkaOKAjV9hKV1dXV0sW1wiLi4vcGF0dGVybnMvcmFua09yZGVyLmpzXCIsIFtbXCJjb21wYXJlQW50aVJhbmtcIiwgWyRo4oCNX2EgPT4gKGNvbXBhcmVBbnRpUmFuayA9ICRo4oCNX2EpXV0sW1wibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0ID0gJGjigI1fYSldXSxbXCJzb3J0QnlSYW5rXCIsIFskaOKAjV9hID0+IChzb3J0QnlSYW5rID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3R7ZGV0YWlsczpYLHF1b3RlOnEsRmFpbH09YXNzZXJ0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vIFByaW1pdGl2ZSBhbmQgU2NhbGFyIGtleXMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHZhbFxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrUHJpbWl0aXZlS2V5PSh2YWwsY2hlY2spPT57XG5pZihpc09iamVjdCh2YWwpKXtcbnJldHVybihcbmNoZWNrIT09aWRlbnRDaGVja2VyJiZcbmNoZWNrKGZhbHNlLFggYEEgJHtxKHR5cGVvZiB2YWwpfSBjYW5ub3QgYmUgYSBwcmltaXRpdmU6ICR7dmFsfWApKTtcblxuIH1cbi8qIFRPRE8gVGhlcmUgaXMgbm90IHlldCBhIGNoZWNrUGFzc2FibGUsIGJ1dCBwZXJoYXBzIHRoZXJlIHNob3VsZCBiZS4qL1xuLyogSWYgdGhhdCBoYXBwZW5zLCB3ZSBzaG91bGQgY2FsbCBpdCBoZXJlIGluc3RlYWQuKi9cbmFzc2VydFBhc3NhYmxlKHZhbCk7XG5yZXR1cm4gdHJ1ZTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHZhbFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBpc1ByaW1pdGl2ZUtleT0odmFsKT0+Y2hlY2tQcmltaXRpdmVLZXkodmFsLGlkZW50Q2hlY2tlcik7JGjigI1fb25jZS5pc1ByaW1pdGl2ZUtleShpc1ByaW1pdGl2ZUtleSk7XG5oYXJkZW4oaXNQcmltaXRpdmVLZXkpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHZhbFxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRQcmltaXRpdmVLZXk9KHZhbCk9PntcbmNoZWNrUHJpbWl0aXZlS2V5KHZhbCxhc3NlcnRDaGVja2VyKTtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0UHJpbWl0aXZlS2V5KGFzc2VydFByaW1pdGl2ZUtleSk7XG5oYXJkZW4oYXNzZXJ0UHJpbWl0aXZlS2V5KTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB2YWxcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgY2hlY2tTY2FsYXJLZXk9KHZhbCxjaGVjayk9PntcbmlmKGlzUHJpbWl0aXZlS2V5KHZhbCkpe1xucmV0dXJuIHRydWU7XG4gfVxuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHZhbCk7XG5pZihwYXNzU3R5bGU9PT0ncmVtb3RhYmxlJyl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgQSAke3EocGFzc1N0eWxlKX0gY2Fubm90IGJlIGEgc2NhbGFyIGtleTogJHt2YWx9YCk7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB2YWxcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovJGjigI1fb25jZS5jaGVja1NjYWxhcktleShjaGVja1NjYWxhcktleSk7XG5jb25zdCAgICAgICAgaXNTY2FsYXJLZXk9KHZhbCk9PmNoZWNrU2NhbGFyS2V5KHZhbCxpZGVudENoZWNrZXIpOyRo4oCNX29uY2UuaXNTY2FsYXJLZXkoaXNTY2FsYXJLZXkpO1xuaGFyZGVuKGlzU2NhbGFyS2V5KTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB2YWxcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5jb25zdCAgICAgICAgYXNzZXJ0U2NhbGFyS2V5PSh2YWwpPT57XG5jaGVja1NjYWxhcktleSh2YWwsYXNzZXJ0Q2hlY2tlcik7XG4gfTskaOKAjV9vbmNlLmFzc2VydFNjYWxhcktleShhc3NlcnRTY2FsYXJLZXkpO1xuaGFyZGVuKGFzc2VydFNjYWxhcktleSk7XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBLZXlzIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqIEB0eXBlIHtXZWFrU2V0PEtleT59ICovXG5jb25zdCBrZXlNZW1vPW5ldyBXZWFrU2V0KCk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdmFsXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGNoZWNrS2V5PSh2YWwsY2hlY2spPT57XG5pZighaXNPYmplY3QodmFsKSl7XG4vKiBUT0RPIFRoZXJlIGlzIG5vdCB5ZXQgYSBjaGVja1Bhc3NhYmxlLCBidXQgcGVyaGFwcyB0aGVyZSBzaG91bGQgYmUuKi9cbi8qIElmIHRoYXQgaGFwcGVucywgd2Ugc2hvdWxkIGNhbGwgaXQgaGVyZSBpbnN0ZWFkLiovXG5hc3NlcnRQYXNzYWJsZSh2YWwpO1xucmV0dXJuIHRydWU7XG4gfVxuaWYoa2V5TWVtby5oYXModmFsKSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuY29uc3QgcmVzdWx0PWNoZWNrS2V5SW50ZXJuYWwodmFsLGNoZWNrKTtcbmlmKHJlc3VsdCl7XG4vKiBEb24ndCBjYWNoZSB0aGUgdW5kZWZpbmVkIGNhc2VzLCBzbyB0aGF0IGlmIGl0IGlzIHRyaWVkIGFnYWluKi9cbi8qIHdpdGggYGFzc2VydENoZWNrZXJgIGl0J2xsIHRocm93IGEgZGlhZ25vc3RpYyBhZ2FpbiovXG5rZXlNZW1vLmFkZCh2YWwpO1xuIH1cbi8qIE5vdGUgdGhhdCB3ZSBkbyBub3QgbWVtb2l6ZSBhIG5lZ2F0aXZlIGp1ZGdlbWVudCwgc28gdGhhdCBpZiBpdCBpcyB0cmllZCovXG4vKiBhZ2FpbiB3aXRoIGEgY2hlY2tlciwgaXQgd2lsbCBzdGlsbCBwcm9kdWNlIGEgdXNlZnVsIGRpYWdub3N0aWMuKi9cbnJldHVybiByZXN1bHQ7XG4gfTskaOKAjV9vbmNlLmNoZWNrS2V5KGNoZWNrS2V5KTtcbmhhcmRlbihjaGVja0tleSk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdmFsXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGlzS2V5PSh2YWwpPT5jaGVja0tleSh2YWwsaWRlbnRDaGVja2VyKTskaOKAjV9vbmNlLmlzS2V5KGlzS2V5KTtcbmhhcmRlbihpc0tleSk7XG5cbi8qKlxuICogQHBhcmFtIHtLZXl9IHZhbFxuICovXG5jb25zdCAgICAgICAgYXNzZXJ0S2V5PSh2YWwpPT57XG5jaGVja0tleSh2YWwsYXNzZXJ0Q2hlY2tlcik7XG4gfTskaOKAjV9vbmNlLmFzc2VydEtleShhc3NlcnRLZXkpO1xuaGFyZGVuKGFzc2VydEtleSk7XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gQ29weVNldCAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyogTW92ZWQgdG8gaGVyZSBzbyB0aGV5IGNhbiBjaGVjayB0aGF0IHRoZSBjb3B5U2V0IGNvbnRhaW5zIG9ubHkga2V5cyovXG4vKiB3aXRob3V0IGNyZWF0aW5nIGFuIGltcG9ydCBjeWNsZS4qL1xuXG4vKiogQHR5cGUgV2Vha1NldDxDb3B5U2V0PEtleT4+ICovXG5jb25zdCBjb3B5U2V0TWVtbz1uZXcgV2Vha1NldCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHNcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgY2hlY2tDb3B5U2V0PShzLGNoZWNrKT0+e1xuaWYoY29weVNldE1lbW8uaGFzKHMpKXtcbnJldHVybiB0cnVlO1xuIH1cbmNvbnN0IHJlc3VsdD1cbihwYXNzU3R5bGVPZihzKT09PSd0YWdnZWQnJiZnZXRUYWcocyk9PT0nY29weVNldCd8fFxuY2hlY2soZmFsc2UsWCBgTm90IGEgY29weVNldDogJHtzfWApKSYmXG5jaGVja0VsZW1lbnRzKHMucGF5bG9hZCxjaGVjaykmJlxuY2hlY2tLZXkocy5wYXlsb2FkLGNoZWNrKTtcbmlmKHJlc3VsdCl7XG5jb3B5U2V0TWVtby5hZGQocyk7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9OyRo4oCNX29uY2UuY2hlY2tDb3B5U2V0KGNoZWNrQ29weVNldCk7XG5oYXJkZW4oY2hlY2tDb3B5U2V0KTtcblxuLyoqXG4gKiBAY2FsbGJhY2sgSXNDb3B5U2V0XG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBzXG4gKiBAcmV0dXJucyB7cyBpcyBDb3B5U2V0PEtleT59XG4gKi9cblxuLyoqIEB0eXBlIHtJc0NvcHlTZXR9ICovXG5jb25zdCAgICAgICAgaXNDb3B5U2V0PShzKT0+Y2hlY2tDb3B5U2V0KHMsaWRlbnRDaGVja2VyKTskaOKAjV9vbmNlLmlzQ29weVNldChpc0NvcHlTZXQpO1xuaGFyZGVuKGlzQ29weVNldCk7XG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydENvcHlTZXRcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHNcbiAqIEByZXR1cm5zIHthc3NlcnRzIHMgaXMgQ29weVNldDxLZXk+fVxuICovXG5cbi8qKiBAdHlwZSB7QXNzZXJ0Q29weVNldH0gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRDb3B5U2V0PShzKT0+e1xuY2hlY2tDb3B5U2V0KHMsYXNzZXJ0Q2hlY2tlcik7XG4gfTskaOKAjV9vbmNlLmFzc2VydENvcHlTZXQoYXNzZXJ0Q29weVNldCk7XG5oYXJkZW4oYXNzZXJ0Q29weVNldCk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7Q29weVNldDxLPn0gc1xuICogQHJldHVybnMge0tbXX1cbiAqL1xuY29uc3QgICAgICAgIGdldENvcHlTZXRLZXlzPShzKT0+e1xuYXNzZXJ0Q29weVNldChzKTtcbnJldHVybiBzLnBheWxvYWQ7XG4gfTskaOKAjV9vbmNlLmdldENvcHlTZXRLZXlzKGdldENvcHlTZXRLZXlzKTtcbmhhcmRlbihnZXRDb3B5U2V0S2V5cyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7Q29weVNldDxLPn0gc1xuICogQHBhcmFtIHsoa2V5OiBLLCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFufSBmblxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBldmVyeUNvcHlTZXRLZXk9KHMsZm4pPT5cbmdldENvcHlTZXRLZXlzKHMpLmV2ZXJ5KChrZXksaW5kZXgpPT5mbihrZXksaW5kZXgpKTskaOKAjV9vbmNlLmV2ZXJ5Q29weVNldEtleShldmVyeUNvcHlTZXRLZXkpO1xuaGFyZGVuKGV2ZXJ5Q29weVNldEtleSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7SXRlcmFibGU8Sz59IGVsZW1lbnRJdGVyXG4gKiBAcmV0dXJucyB7Q29weVNldDxLPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VDb3B5U2V0PShlbGVtZW50SXRlcik9PntcbmNvbnN0IHJlc3VsdD1tYWtlU2V0T2ZFbGVtZW50cyhlbGVtZW50SXRlcik7XG5hc3NlcnRDb3B5U2V0KHJlc3VsdCk7XG5yZXR1cm4gcmVzdWx0O1xuIH07JGjigI1fb25jZS5tYWtlQ29weVNldChtYWtlQ29weVNldCk7XG5oYXJkZW4obWFrZUNvcHlTZXQpO1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIENvcHlCYWcgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qIE1vdmVkIHRvIGhlcmUgc28gdGhleSBjYW4gY2hlY2sgdGhhdCB0aGUgY29weUJhZyBjb250YWlucyBvbmx5IGtleXMqL1xuLyogd2l0aG91dCBjcmVhdGluZyBhbiBpbXBvcnQgY3ljbGUuKi9cblxuLyoqIEB0eXBlIFdlYWtTZXQ8Q29weUJhZzxLZXk+PiAqL1xuY29uc3QgY29weUJhZ01lbW89bmV3IFdlYWtTZXQoKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBiXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGNoZWNrQ29weUJhZz0oYixjaGVjayk9PntcbmlmKGNvcHlCYWdNZW1vLmhhcyhiKSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5jb25zdCByZXN1bHQ9XG4ocGFzc1N0eWxlT2YoYik9PT0ndGFnZ2VkJyYmZ2V0VGFnKGIpPT09J2NvcHlCYWcnfHxcbmNoZWNrKGZhbHNlLFggYE5vdCBhIGNvcHlCYWc6ICR7Yn1gKSkmJlxuY2hlY2tCYWdFbnRyaWVzKGIucGF5bG9hZCxjaGVjaykmJlxuY2hlY2tLZXkoYi5wYXlsb2FkLGNoZWNrKTtcbmlmKHJlc3VsdCl7XG5jb3B5QmFnTWVtby5hZGQoYik7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9OyRo4oCNX29uY2UuY2hlY2tDb3B5QmFnKGNoZWNrQ29weUJhZyk7XG5oYXJkZW4oY2hlY2tDb3B5QmFnKTtcblxuLyoqXG4gKiBAY2FsbGJhY2sgSXNDb3B5QmFnXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBiXG4gKiBAcmV0dXJucyB7YiBpcyBDb3B5QmFnPEtleT59XG4gKi9cblxuLyoqIEB0eXBlIHtJc0NvcHlCYWd9ICovXG5jb25zdCAgICAgICAgaXNDb3B5QmFnPShiKT0+Y2hlY2tDb3B5QmFnKGIsaWRlbnRDaGVja2VyKTskaOKAjV9vbmNlLmlzQ29weUJhZyhpc0NvcHlCYWcpO1xuaGFyZGVuKGlzQ29weUJhZyk7XG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydENvcHlCYWdcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGJcbiAqIEByZXR1cm5zIHthc3NlcnRzIGIgaXMgQ29weUJhZzxLZXk+fVxuICovXG5cbi8qKiBAdHlwZSB7QXNzZXJ0Q29weUJhZ30gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRDb3B5QmFnPShiKT0+e1xuY2hlY2tDb3B5QmFnKGIsYXNzZXJ0Q2hlY2tlcik7XG4gfTskaOKAjV9vbmNlLmFzc2VydENvcHlCYWcoYXNzZXJ0Q29weUJhZyk7XG5oYXJkZW4oYXNzZXJ0Q29weUJhZyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7Q29weUJhZzxLPn0gYlxuICogQHJldHVybnMge0NvcHlCYWc8Sz5bJ3BheWxvYWQnXX1cbiAqL1xuY29uc3QgICAgICAgIGdldENvcHlCYWdFbnRyaWVzPShiKT0+e1xuYXNzZXJ0Q29weUJhZyhiKTtcbnJldHVybiBiLnBheWxvYWQ7XG4gfTskaOKAjV9vbmNlLmdldENvcHlCYWdFbnRyaWVzKGdldENvcHlCYWdFbnRyaWVzKTtcbmhhcmRlbihnZXRDb3B5QmFnRW50cmllcyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7Q29weUJhZzxLPn0gYlxuICogQHBhcmFtIHsoZW50cnk6IFtLLCBiaWdpbnRdLCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFufSBmblxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBldmVyeUNvcHlCYWdFbnRyeT0oYixmbik9PlxuZ2V0Q29weUJhZ0VudHJpZXMoYikuZXZlcnkoKGVudHJ5LGluZGV4KT0+Zm4oZW50cnksaW5kZXgpKTskaOKAjV9vbmNlLmV2ZXJ5Q29weUJhZ0VudHJ5KGV2ZXJ5Q29weUJhZ0VudHJ5KTtcbmhhcmRlbihldmVyeUNvcHlCYWdFbnRyeSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7SXRlcmFibGU8W0ssYmlnaW50XT59IGJhZ0VudHJ5SXRlclxuICogQHJldHVybnMge0NvcHlCYWc8Sz59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlQ29weUJhZz0oYmFnRW50cnlJdGVyKT0+e1xuY29uc3QgcmVzdWx0PW1ha2VCYWdPZkVudHJpZXMoYmFnRW50cnlJdGVyKTtcbmFzc2VydENvcHlCYWcocmVzdWx0KTtcbnJldHVybiByZXN1bHQ7XG4gfTskaOKAjV9vbmNlLm1ha2VDb3B5QmFnKG1ha2VDb3B5QmFnKTtcbmhhcmRlbihtYWtlQ29weUJhZyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7SXRlcmFibGU8Sz59IGVsZW1lbnRJdGVyXG4gKiBAcmV0dXJucyB7Q29weVNldDxLPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzPShlbGVtZW50SXRlcik9Pntcbi8qIFRoaXMgZnVsbE9yZGVyIGNvbnRhaW5zIGhpc3RvcnkgZGVwZW5kZW50IHN0YXRlLiBJdCBpcyBzcGVjaWZpYyovXG4vKiB0byB0aGlzIG9uZSBjYWxsIGFuZCBkb2VzIG5vdCBzdXJ2aXZlIGl0LiovXG5jb25zdCBmdWxsQ29tcGFyZT1tYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCgpLmFudGlDb21wYXJhdG9yO1xuY29uc3Qgc29ydGVkPXNvcnRCeVJhbmsoZWxlbWVudEl0ZXIsZnVsbENvbXBhcmUpO1xuLyoqIEB0eXBlIHtbSyxiaWdpbnRdW119ICovXG5jb25zdCBlbnRyaWVzPVtdO1xuZm9yKGxldCBpPTA7aTxzb3J0ZWQubGVuZ3RoOyl7XG5jb25zdCBrPXNvcnRlZFtpXTtcbmxldCBqPWkrMTtcbndoaWxlKGo8c29ydGVkLmxlbmd0aCYmZnVsbENvbXBhcmUoayxzb3J0ZWRbal0pPT09MCl7XG5qKz0xO1xuIH1cbmVudHJpZXMucHVzaChbayxCaWdJbnQoai1pKV0pO1xuaT1qO1xuIH1cbnJldHVybiBtYWtlQ29weUJhZyhlbnRyaWVzKTtcbiB9OyRo4oCNX29uY2UubWFrZUNvcHlCYWdGcm9tRWxlbWVudHMobWFrZUNvcHlCYWdGcm9tRWxlbWVudHMpO1xuaGFyZGVuKG1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzKTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBDb3B5TWFwIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiBNb3ZlZCB0byBoZXJlIHNvIHRoZXkgY2FuIGNoZWNrIHRoYXQgdGhlIGNvcHlNYXAncyBrZXlzIGNvbnRhaW5zIG9ubHkga2V5cyovXG4vKiB3aXRob3V0IGNyZWF0aW5nIGFuIGltcG9ydCBjeWNsZS4qL1xuXG4vKiogQHR5cGUgV2Vha1NldDxDb3B5TWFwPGFueSxhbnk+PiAqL1xuY29uc3QgY29weU1hcE1lbW89bmV3IFdlYWtTZXQoKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBtXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGNoZWNrQ29weU1hcD0obSxjaGVjayk9PntcbmlmKGNvcHlNYXBNZW1vLmhhcyhtKSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5pZighKHBhc3NTdHlsZU9mKG0pPT09J3RhZ2dlZCcmJmdldFRhZyhtKT09PSdjb3B5TWFwJykpe1xucmV0dXJuIGNoZWNrKGZhbHNlLFggYE5vdCBhIGNvcHlNYXA6ICR7bX1gKTtcbiB9XG5jb25zdHtwYXlsb2FkfT1tO1xuaWYocGFzc1N0eWxlT2YocGF5bG9hZCkhPT0nY29weVJlY29yZCcpe1xucmV0dXJuIGNoZWNrKGZhbHNlLFggYEEgY29weU1hcCdzIHBheWxvYWQgbXVzdCBiZSBhIHJlY29yZDogJHttfWApO1xuIH1cbmNvbnN0e2tleXMsdmFsdWVzLC4uLnJlc3R9PXBheWxvYWQ7XG5jb25zdCByZXN1bHQ9XG4ob3duS2V5cyhyZXN0KS5sZW5ndGg9PT0wfHxcbmNoZWNrKFxuZmFsc2UsXG5YIGBBIGNvcHlNYXAncyBwYXlsb2FkIG11c3Qgb25seSBoYXZlIC5rZXlzIGFuZCAudmFsdWVzOiAke219YCkpJiZcblxuY2hlY2tFbGVtZW50cyhrZXlzLGNoZWNrKSYmXG5jaGVja0tleShrZXlzLGNoZWNrKSYmKFxucGFzc1N0eWxlT2YodmFsdWVzKT09PSdjb3B5QXJyYXknfHxcbmNoZWNrKGZhbHNlLFggYEEgY29weU1hcCdzIC52YWx1ZXMgbXVzdCBiZSBhIGNvcHlBcnJheTogJHttfWApKSYmKFxua2V5cy5sZW5ndGg9PT12YWx1ZXMubGVuZ3RofHxcbmNoZWNrKFxuZmFsc2UsXG5YIGBBIGNvcHlNYXAgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBrZXlzIGFuZCB2YWx1ZXM6ICR7bX1gKSk7XG5cbmlmKHJlc3VsdCl7XG5jb3B5TWFwTWVtby5hZGQobSk7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9OyRo4oCNX29uY2UuY2hlY2tDb3B5TWFwKGNoZWNrQ29weU1hcCk7XG5oYXJkZW4oY2hlY2tDb3B5TWFwKTtcblxuLyoqXG4gKiBAY2FsbGJhY2sgSXNDb3B5TWFwXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBtXG4gKiBAcmV0dXJucyB7bSBpcyBDb3B5TWFwPEtleSwgUGFzc2FibGU+fVxuICovXG5cbi8qKiBAdHlwZSB7SXNDb3B5TWFwfSAqL1xuY29uc3QgICAgICAgIGlzQ29weU1hcD0obSk9PmNoZWNrQ29weU1hcChtLGlkZW50Q2hlY2tlcik7JGjigI1fb25jZS5pc0NvcHlNYXAoaXNDb3B5TWFwKTtcbmhhcmRlbihpc0NvcHlNYXApO1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRDb3B5TWFwXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBtXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBtIGlzIENvcHlNYXA8S2V5LCBQYXNzYWJsZT59XG4gKi9cblxuLyoqIEB0eXBlIHtBc3NlcnRDb3B5TWFwfSAqL1xuY29uc3QgICAgICAgIGFzc2VydENvcHlNYXA9KG0pPT57XG5jaGVja0NvcHlNYXAobSxhc3NlcnRDaGVja2VyKTtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0Q29weU1hcChhc3NlcnRDb3B5TWFwKTtcbmhhcmRlbihhc3NlcnRDb3B5TWFwKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAcGFyYW0ge0NvcHlNYXA8SyxWPn0gbVxuICogQHJldHVybnMge0tbXX1cbiAqL1xuY29uc3QgICAgICAgIGdldENvcHlNYXBLZXlzPShtKT0+e1xuYXNzZXJ0Q29weU1hcChtKTtcbnJldHVybiBtLnBheWxvYWQua2V5cztcbiB9OyRo4oCNX29uY2UuZ2V0Q29weU1hcEtleXMoZ2V0Q29weU1hcEtleXMpO1xuaGFyZGVuKGdldENvcHlNYXBLZXlzKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAcGFyYW0ge0NvcHlNYXA8SyxWPn0gbVxuICogQHJldHVybnMge1ZbXX1cbiAqL1xuY29uc3QgICAgICAgIGdldENvcHlNYXBWYWx1ZXM9KG0pPT57XG5hc3NlcnRDb3B5TWFwKG0pO1xucmV0dXJuIG0ucGF5bG9hZC52YWx1ZXM7XG4gfTskaOKAjV9vbmNlLmdldENvcHlNYXBWYWx1ZXMoZ2V0Q29weU1hcFZhbHVlcyk7XG5oYXJkZW4oZ2V0Q29weU1hcFZhbHVlcyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEssVlxuICogQHBhcmFtIHtDb3B5TWFwPEssVj59IG1cbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxbSyxWXT59XG4gKi9cbmNvbnN0ICAgICAgICBnZXRDb3B5TWFwRW50cmllcz0obSk9PntcbmFzc2VydENvcHlNYXAobSk7XG5jb25zdHtcbnBheWxvYWQ6e2tleXMsdmFsdWVzfX09XG5tO1xuY29uc3R7bGVuZ3RofT1rZXlzO1xucmV0dXJuIEZhcignQ29weU1hcCBlbnRyaWVzIGl0ZXJhYmxlJyx7XG5bU3ltYm9sLml0ZXJhdG9yXTooKT0+e1xubGV0IGk9MDtcbnJldHVybiBGYXIoJ0NvcHlNYXAgZW50cmllcyBpdGVyYXRvcicse1xubmV4dDooKT0+e1xuLyoqIEB0eXBlIHtJdGVyYXRvclJlc3VsdDxbSyxWXSx2b2lkPn0gKi9cbmxldCByZXN1bHQ7XG5pZihpPGxlbmd0aCl7XG5yZXN1bHQ9aGFyZGVuKHtkb25lOmZhbHNlLHZhbHVlOltrZXlzW2ldLHZhbHVlc1tpXV19KTtcbmkrPTE7XG5yZXR1cm4gcmVzdWx0O1xuIH1lbHNle1xucmVzdWx0PWhhcmRlbih7ZG9uZTp0cnVlLHZhbHVlOnVuZGVmaW5lZH0pO1xuIH1cbnJldHVybiByZXN1bHQ7XG4gfX0pO1xuXG4gfX0pO1xuXG4gfTskaOKAjV9vbmNlLmdldENvcHlNYXBFbnRyaWVzKGdldENvcHlNYXBFbnRyaWVzKTtcbmhhcmRlbihnZXRDb3B5TWFwRW50cmllcyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEssVlxuICogQHBhcmFtIHtDb3B5TWFwPEssVj59IG1cbiAqIEBwYXJhbSB7KGtleTogSywgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbn0gZm5cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgZXZlcnlDb3B5TWFwS2V5PShtLGZuKT0+XG5nZXRDb3B5TWFwS2V5cyhtKS5ldmVyeSgoa2V5LGluZGV4KT0+Zm4oa2V5LGluZGV4KSk7JGjigI1fb25jZS5ldmVyeUNvcHlNYXBLZXkoZXZlcnlDb3B5TWFwS2V5KTtcbmhhcmRlbihldmVyeUNvcHlNYXBLZXkpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEBwYXJhbSB7Q29weU1hcDxLLFY+fSBtXG4gKiBAcGFyYW0geyh2YWx1ZTogViwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbn0gZm5cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgZXZlcnlDb3B5TWFwVmFsdWU9KG0sZm4pPT5cbmdldENvcHlNYXBWYWx1ZXMobSkuZXZlcnkoKHZhbHVlLGluZGV4KT0+Zm4odmFsdWUsaW5kZXgpKTskaOKAjV9vbmNlLmV2ZXJ5Q29weU1hcFZhbHVlKGV2ZXJ5Q29weU1hcFZhbHVlKTtcbmhhcmRlbihldmVyeUNvcHlNYXBWYWx1ZSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEssVlxuICogQHBhcmFtIHtDb3B5TWFwPEssVj59IG1cbiAqIEByZXR1cm5zIHtDb3B5U2V0PEs+fVxuICovXG5jb25zdCAgICAgICAgY29weU1hcEtleVNldD0obSk9PlxuLyogQSBjb3B5TWFwJ3Mga2V5cyBhcmUgYWxyZWFkeSBpbiB0aGUgaW50ZXJuYWwgZm9ybSB1c2VkIGJ5IGNvcHlTZXRzLiovXG5tYWtlVGFnZ2VkKCdjb3B5U2V0JyxtLnBheWxvYWQua2V5cyk7JGjigI1fb25jZS5jb3B5TWFwS2V5U2V0KGNvcHlNYXBLZXlTZXQpO1xuaGFyZGVuKGNvcHlNYXBLZXlTZXQpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEBwYXJhbSB7SXRlcmFibGU8W0ssIFZdPn0gZW50cmllc1xuICogQHJldHVybnMge0NvcHlNYXA8SyxWPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VDb3B5TWFwPShlbnRyaWVzKT0+e1xuLyogVGhpcyBpcyB3ZWlyZCwgYnV0IHJldmVyc2UgcmFuayBzb3J0aW5nIHRoZSBlbnRyaWVzIGlzIGEgZ29vZCBmaXJzdCBzdGVwKi9cbi8qIGZvciBnZXR0aW5nIHRoZSByYW5rIHNvcnRlZCBrZXlzIHRvZ2V0aGVyIHdpdGggdGhlIHZhbHVlcyovXG4vKiBvcmdhbml6ZWQgYnkgdGhvc2Uga2V5cy4gQWxzbywgYW1vbmcgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCovXG4vKiBrZXlzIGluIHRoZSBzYW1lIGVxdWl2YWxlbmNlIGNsYXNzLCB0aG9zZSBhcmUgcmFuayBzb3J0ZWQuKi9cbi8qIFRPRE8gVGhpcyovXG4vKiBjb3VsZCBzb2x2ZSB0aGUgY29weU1hcCBjb3ZlciBpc3N1ZSBleHBsYWluZWQgaW4gcGF0dGVybk1hdGNoZXJzLmpzLiovXG4vKiBCdXQgb25seSBpZiB3ZSBpbmNsdWRlIHRoaXMgY3JpdGVyaWEgaW4gb3VyIHZhbGlkYXRpb24gb2YgY29weU1hcHMsKi9cbi8qIHdoaWNoIHdlIGN1cnJlbnRseSBkbyBub3QuKi9cbmNvbnN0IHNvcnRlZEVudHJpZXM9c29ydEJ5UmFuayhlbnRyaWVzLGNvbXBhcmVBbnRpUmFuayk7XG5jb25zdCBrZXlzPXNvcnRlZEVudHJpZXMubWFwKChbayxfdl0pPT5rKTtcbmNvbnN0IHZhbHVlcz1zb3J0ZWRFbnRyaWVzLm1hcCgoW19rLHZdKT0+dik7XG5jb25zdCByZXN1bHQ9bWFrZVRhZ2dlZCgnY29weU1hcCcse2tleXMsdmFsdWVzfSk7XG5hc3NlcnRDb3B5TWFwKHJlc3VsdCk7XG5yZXR1cm4gcmVzdWx0O1xuIH07JGjigI1fb25jZS5tYWtlQ29weU1hcChtYWtlQ29weU1hcCk7XG5oYXJkZW4obWFrZUNvcHlNYXApO1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gS2V5cyBSZWN1ciAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdmFsXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tLZXlJbnRlcm5hbD0odmFsLGNoZWNrKT0+e1xuY29uc3QgY2hlY2tJdD0oY2hpbGQpPT5jaGVja0tleShjaGlsZCxjaGVjayk7XG5cbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZih2YWwpO1xuc3dpdGNoKHBhc3NTdHlsZSl7XG5jYXNlJ2NvcHlSZWNvcmQnOntcbi8qIEEgY29weVJlY29yZCBpcyBhIGtleSBpZmYgYWxsIGl0cyBjaGlsZHJlbiBhcmUga2V5cyovXG5yZXR1cm4gT2JqZWN0LnZhbHVlcyh2YWwpLmV2ZXJ5KGNoZWNrSXQpO1xuIH1cbmNhc2UnY29weUFycmF5Jzp7XG4vKiBBIGNvcHlBcnJheSBpcyBhIGtleSBpZmYgYWxsIGl0cyBjaGlsZHJlbiBhcmUga2V5cyovXG5yZXR1cm4gdmFsLmV2ZXJ5KGNoZWNrSXQpO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5jb25zdCB0YWc9Z2V0VGFnKHZhbCk7XG5zd2l0Y2godGFnKXtcbmNhc2UnY29weVNldCc6e1xucmV0dXJuIGNoZWNrQ29weVNldCh2YWwsY2hlY2spO1xuIH1cbmNhc2UnY29weUJhZyc6e1xucmV0dXJuIGNoZWNrQ29weUJhZyh2YWwsY2hlY2spO1xuIH1cbmNhc2UnY29weU1hcCc6e1xucmV0dXJuKFxuY2hlY2tDb3B5TWFwKHZhbCxjaGVjaykmJlxuLyogRm9yIGEgY29weU1hcCB0byBiZSBhIGtleSwgYWxsIGl0cyBrZXlzIGFuZCB2YWx1ZXMgbXVzdCovXG4vKiBiZSBrZXlzLiBLZXlzIGFscmVhZHkgY2hlY2tlZCBieSBgY2hlY2tDb3B5TWFwYCBzaW5jZSovXG4vKiB0aGF0J3MgYSBjb3B5TWFwIHJlcXVpcmVtZW50IGluIGdlbmVyYWwuKi9cbmV2ZXJ5Q29weU1hcFZhbHVlKHZhbCxjaGVja0l0KSk7XG5cbiB9XG5kZWZhdWx0OntcbnJldHVybihcbmNoZWNrIT09aWRlbnRDaGVja2VyJiZcbmNoZWNrKGZhbHNlLFggYEEgcGFzc2FibGUgdGFnZ2VkICR7cSh0YWcpfSBpcyBub3QgYSBrZXk6ICR7dmFsfWApKTtcblxuIH19XG5cbiB9XG5jYXNlJ3JlbW90YWJsZSc6e1xuLyogQWxsIHJlbW90YWJsZXMgYXJlIGtleXMuKi9cbnJldHVybiB0cnVlO1xuIH1cbmNhc2UnZXJyb3InOlxuY2FzZSdwcm9taXNlJzp7XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgQSAke3EocGFzc1N0eWxlKX0gY2Fubm90IGJlIGEga2V5YCk7XG4gfVxuZGVmYXVsdDp7XG4vKiBVbmV4cGVjdGVkIHRhZ3MgYXJlIGp1c3Qgbm9uLWtleXMsIGJ1dCBhbiB1bmV4cGVjdGVkIHBhc3NTdHlsZSovXG4vKiBpcyBhbHdheXMgYW4gZXJyb3IuKi9cbnRocm93IEZhaWwgYHVuZXhwZWN0ZWQgcGFzc1N0eWxlICR7cShwYXNzU3R5bGUpfTogJHt2YWx9YDtcbiB9fVxuXG4gfTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc1ByaW1pdGl2ZUtleSI6WyJpc1ByaW1pdGl2ZUtleSJdLCJhc3NlcnRQcmltaXRpdmVLZXkiOlsiYXNzZXJ0UHJpbWl0aXZlS2V5Il0sImNoZWNrU2NhbGFyS2V5IjpbImNoZWNrU2NhbGFyS2V5Il0sImlzU2NhbGFyS2V5IjpbImlzU2NhbGFyS2V5Il0sImFzc2VydFNjYWxhcktleSI6WyJhc3NlcnRTY2FsYXJLZXkiXSwiY2hlY2tLZXkiOlsiY2hlY2tLZXkiXSwiaXNLZXkiOlsiaXNLZXkiXSwiYXNzZXJ0S2V5IjpbImFzc2VydEtleSJdLCJjaGVja0NvcHlTZXQiOlsiY2hlY2tDb3B5U2V0Il0sImlzQ29weVNldCI6WyJpc0NvcHlTZXQiXSwiYXNzZXJ0Q29weVNldCI6WyJhc3NlcnRDb3B5U2V0Il0sImdldENvcHlTZXRLZXlzIjpbImdldENvcHlTZXRLZXlzIl0sImV2ZXJ5Q29weVNldEtleSI6WyJldmVyeUNvcHlTZXRLZXkiXSwibWFrZUNvcHlTZXQiOlsibWFrZUNvcHlTZXQiXSwiY2hlY2tDb3B5QmFnIjpbImNoZWNrQ29weUJhZyJdLCJpc0NvcHlCYWciOlsiaXNDb3B5QmFnIl0sImFzc2VydENvcHlCYWciOlsiYXNzZXJ0Q29weUJhZyJdLCJnZXRDb3B5QmFnRW50cmllcyI6WyJnZXRDb3B5QmFnRW50cmllcyJdLCJldmVyeUNvcHlCYWdFbnRyeSI6WyJldmVyeUNvcHlCYWdFbnRyeSJdLCJtYWtlQ29weUJhZyI6WyJtYWtlQ29weUJhZyJdLCJtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyI6WyJtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyJdLCJjaGVja0NvcHlNYXAiOlsiY2hlY2tDb3B5TWFwIl0sImlzQ29weU1hcCI6WyJpc0NvcHlNYXAiXSwiYXNzZXJ0Q29weU1hcCI6WyJhc3NlcnRDb3B5TWFwIl0sImdldENvcHlNYXBLZXlzIjpbImdldENvcHlNYXBLZXlzIl0sImdldENvcHlNYXBWYWx1ZXMiOlsiZ2V0Q29weU1hcFZhbHVlcyJdLCJnZXRDb3B5TWFwRW50cmllcyI6WyJnZXRDb3B5TWFwRW50cmllcyJdLCJldmVyeUNvcHlNYXBLZXkiOlsiZXZlcnlDb3B5TWFwS2V5Il0sImV2ZXJ5Q29weU1hcFZhbHVlIjpbImV2ZXJ5Q29weU1hcFZhbHVlIl0sImNvcHlNYXBLZXlTZXQiOlsiY29weU1hcEtleVNldCJdLCJtYWtlQ29weU1hcCI6WyJtYWtlQ29weU1hcCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA0aHctyhoAAMoaAAAsAAAAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL2tleXMvY29tcGFyZUtleXMuanN7ImltcG9ydHMiOlsiLi4vcGF0dGVybnMvZW5jb2RlUGFzc2FibGUuanMiLCIuLi9wYXR0ZXJucy9yYW5rT3JkZXIuanMiLCIuL2NoZWNrS2V5LmpzIiwiLi9tZXJnZS1iYWctb3BlcmF0b3JzLmpzIiwiLi9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbImNvbXBhcmVLZXlzIiwia2V5RVEiLCJrZXlHVCIsImtleUdURSIsImtleUxUIiwia2V5TFRFIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IHBhc3NTdHlsZU9mLGdldFRhZyxjb21wYXJlUmFuayxyZWNvcmROYW1lcyxyZWNvcmRWYWx1ZXMsYXNzZXJ0S2V5LGJhZ0NvbXBhcmUsc2V0Q29tcGFyZTskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dLFtcImdldFRhZ1wiLCBbJGjigI1fYSA9PiAoZ2V0VGFnID0gJGjigI1fYSldXV1dLFtcIi4uL3BhdHRlcm5zL3JhbmtPcmRlci5qc1wiLCBbW1wiY29tcGFyZVJhbmtcIiwgWyRo4oCNX2EgPT4gKGNvbXBhcmVSYW5rID0gJGjigI1fYSldXV1dLFtcIi4uL3BhdHRlcm5zL2VuY29kZVBhc3NhYmxlLmpzXCIsIFtbXCJyZWNvcmROYW1lc1wiLCBbJGjigI1fYSA9PiAocmVjb3JkTmFtZXMgPSAkaOKAjV9hKV1dLFtcInJlY29yZFZhbHVlc1wiLCBbJGjigI1fYSA9PiAocmVjb3JkVmFsdWVzID0gJGjigI1fYSldXV1dLFtcIi4vY2hlY2tLZXkuanNcIiwgW1tcImFzc2VydEtleVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0S2V5ID0gJGjigI1fYSldXV1dLFtcIi4vbWVyZ2UtYmFnLW9wZXJhdG9ycy5qc1wiLCBbW1wiYmFnQ29tcGFyZVwiLCBbJGjigI1fYSA9PiAoYmFnQ29tcGFyZSA9ICRo4oCNX2EpXV1dXSxbXCIuL21lcmdlLXNldC1vcGVyYXRvcnMuanNcIiwgW1tcInNldENvbXBhcmVcIiwgWyRo4oCNX2EgPT4gKHNldENvbXBhcmUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5jb25zdHtxdW90ZTpxLEZhaWx9PWFzc2VydDtcblxuLyoqIEB0eXBlIHtLZXlDb21wYXJlfSAqL1xuY29uc3QgICAgICAgIGNvbXBhcmVLZXlzPShsZWZ0LHJpZ2h0KT0+e1xuYXNzZXJ0S2V5KGxlZnQpO1xuYXNzZXJ0S2V5KHJpZ2h0KTtcbmNvbnN0IGxlZnRTdHlsZT1wYXNzU3R5bGVPZihsZWZ0KTtcbmNvbnN0IHJpZ2h0U3R5bGU9cGFzc1N0eWxlT2YocmlnaHQpO1xuaWYobGVmdFN0eWxlIT09cmlnaHRTdHlsZSl7XG4vKiBEaWZmZXJlbnQgcGFzc1N0eWxlcyBhcmUgaW5jb21tZW5zdXJhdGUqL1xucmV0dXJuIE5hTjtcbiB9XG5zd2l0Y2gobGVmdFN0eWxlKXtcbmNhc2UndW5kZWZpbmVkJzpcbmNhc2UnbnVsbCc6XG5jYXNlJ2Jvb2xlYW4nOlxuY2FzZSdiaWdpbnQnOlxuY2FzZSdzdHJpbmcnOlxuY2FzZSdzeW1ib2wnOntcbi8qIGZvciB0aGVzZSwga2V5cyBjb21wYXJlIHRoZSBzYW1lIGFzIHJhbmsqL1xucmV0dXJuIGNvbXBhcmVSYW5rKGxlZnQscmlnaHQpO1xuIH1cbmNhc2UnbnVtYmVyJzp7XG5jb25zdCByYW5rQ29tcD1jb21wYXJlUmFuayhsZWZ0LHJpZ2h0KTtcbmlmKHJhbmtDb21wPT09MCl7XG5yZXR1cm4gMDtcbiB9XG5pZihOdW1iZXIuaXNOYU4obGVmdCl8fE51bWJlci5pc05hTihyaWdodCkpe1xuLyogTmFOIGlzIGVxdWFsIHRvIGl0c2VsZiwgYnV0IGluY29tbWVuc3VyYXRlIHdpdGggZXZlcnl0aGluZyBlbHNlKi9cbmFzc2VydCghTnVtYmVyLmlzTmFOKGxlZnQpfHwhTnVtYmVyLmlzTmFOKHJpZ2h0KSk7XG5yZXR1cm4gTmFOO1xuIH1cbi8qIEFtb25nIG5vbi1OYU4gbnVtYmVycywga2V5IG9yZGVyIGlzIHRoZSBzYW1lIGFzIHJhbmsgb3JkZXIuIE5vdGUgdGhhdCovXG4vKiBpbiBib3RoIG9yZGVycywgYC0wYCBpcyBpbiB0aGUgc2FtZSBlcXVpdmFsZW5jZSBjbGFzcyBhcyBgMGAuKi9cbnJldHVybiByYW5rQ29tcDtcbiB9XG5jYXNlJ3JlbW90YWJsZSc6e1xuaWYobGVmdD09PXJpZ2h0KXtcbnJldHVybiAwO1xuIH1cbi8qIElmIHR3byByZW1vdGFibGVzIGFyZSBub3QgaWRlbnRpY2FsLCB0aGVuIGFzIGtleXMgdGhleSBhcmUqL1xuLyogaW5jb21tZW5zdXJhdGUuKi9cbnJldHVybiBOYU47XG4gfVxuY2FzZSdjb3B5QXJyYXknOntcbi8qIExleGljb2dyYXBoaWMgYnkga2V5IG9yZGVyLiBSYW5rIG9yZGVyIG9mIGFycmF5cyBpcyBsZXhpY29ncmFwaGljIGJ5Ki9cbi8qIHJhbmsgb3JkZXIuKi9cbi8qIEJlY2F1c2UgdGhlIGludmFyaWFudHMgYWJvdmUgYXBwbHkgdG8gdGhlIGVsZW1lbnRzIG9mIHRoZSBhcnJheSwqL1xuLyogdGhleSBhcHBseSB0byB0aGUgYXJyYXkgYXMgYSB3aG9sZS4qL1xuY29uc3QgbGVuPU1hdGgubWluKGxlZnQubGVuZ3RoLHJpZ2h0Lmxlbmd0aCk7XG5mb3IobGV0IGk9MDtpPGxlbjtpKz0xKXtcbmNvbnN0IHJlc3VsdD1jb21wYXJlS2V5cyhsZWZ0W2ldLHJpZ2h0W2ldKTtcbmlmKHJlc3VsdCE9PTApe1xucmV0dXJuIHJlc3VsdDtcbiB9XG4gfVxuLyogSWYgYWxsIG1hdGNoaW5nIGVsZW1lbnRzIGFyZSBrZXlFUSwgdGhlbiBhY2NvcmRpbmcgdG8gdGhlaXIgbGVuZ3Rocy4qL1xuLyogVGh1cywgaWYgYXJyYXkgWCBpcyBhIHByZWZpeCBvZiBhcnJheSBZLCB0aGVuIFggaXMgc21hbGxlciB0aGFuIFkuKi9cbnJldHVybiBjb21wYXJlUmFuayhsZWZ0Lmxlbmd0aCxyaWdodC5sZW5ndGgpO1xuIH1cbmNhc2UnY29weVJlY29yZCc6e1xuLyogUGFyZXRvIHBhcnRpYWwgb3JkZXIgY29tcGFyaXNvbi4qL1xuY29uc3QgbGVmdE5hbWVzPXJlY29yZE5hbWVzKGxlZnQpO1xuY29uc3QgcmlnaHROYW1lcz1yZWNvcmROYW1lcyhyaWdodCk7XG5cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5pZigha2V5RVEobGVmdE5hbWVzLHJpZ2h0TmFtZXMpKXtcbi8qIElmIHRoZXkgZG8gbm90IGhhdmUgZXhhY3RseSB0aGUgc2FtZSBwcm9wZXJ0aWVzLCovXG4vKiB0aGV5IGFyZSBpbmNvbW1lbnN1cmF0ZS4qL1xuLyogTm90ZSB0aGF0IHJhbmsgc29ydGluZyBvZiBjb3B5UmVjb3JkcyBncm91cHMgYWxsIGNvcHlSZWNvcmRzIHdpdGgqL1xuLyogdGhlIHNhbWUga2V5cyB0b2dldGhlciwgZW5hYmxpbmcgcmFuZ2Ugc2VhcmNoaW5nIG92ZXIgY29weVJlY29yZHMqL1xuLyogdG8gYXZvaWQgbW9yZSBpcnJlbGV2YW50IG9uZXMuKi9cbnJldHVybiBOYU47XG4gfVxuY29uc3QgbGVmdFZhbHVlcz1yZWNvcmRWYWx1ZXMobGVmdCxsZWZ0TmFtZXMpO1xuY29uc3QgcmlnaHRWYWx1ZXM9cmVjb3JkVmFsdWVzKHJpZ2h0LHJpZ2h0TmFtZXMpO1xuLyogUHJlc3VtZSB0aGF0IGJvdGggY29weVJlY29yZHMgaGF2ZSB0aGUgc2FtZSBrZXkgb3JkZXIqL1xuLyogdW50aWwgZW5jb3VudGVyaW5nIGEgcHJvcGVydHkgZGlzcHJvdmluZyB0aGF0IGh5cG90aGVzaXMuKi9cbmxldCByZXN1bHQ9MDtcbmZvcihsZXQgaT0wO2k8bGVmdFZhbHVlcy5sZW5ndGg7aSs9MSl7XG5jb25zdCBjb21wPWNvbXBhcmVLZXlzKGxlZnRWYWx1ZXNbaV0scmlnaHRWYWx1ZXNbaV0pO1xuaWYoTnVtYmVyLmlzTmFOKGNvbXApKXtcbnJldHVybiBOYU47XG4gfVxuaWYocmVzdWx0IT09Y29tcCYmY29tcCE9PTApe1xuaWYocmVzdWx0PT09MCl7XG5yZXN1bHQ9Y29tcDtcbiB9ZWxzZXtcbmFzc2VydChcbnJlc3VsdD09PS0xJiZjb21wPT09MXx8cmVzdWx0PT09MSYmY29tcD09PS0xKTtcblxucmV0dXJuIE5hTjtcbiB9XG4gfVxuIH1cbi8qIElmIGNvcHlSZWNvcmQgWCBpcyBzbWFsbGVyIHRoYW4gY29weVJlY29yZCBZLCB0aGVuIHRoZXkgbXVzdCBoYXZlIHRoZSovXG4vKiBzYW1lIHByb3BlcnR5IG5hbWVzIGFuZCBldmVyeSB2YWx1ZSBpbiBYIG11c3QgYmUgc21hbGxlciBvciBlcXVhbCB0byovXG4vKiB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBpbiBZICh3aXRoIGF0IGxlYXN0IG9uZSB2YWx1ZSBzbWFsbGVyKS4qL1xuLyogVGhlIHJhbmsgb3JkZXIgb2YgWCBhbmQgWSBpcyBiYXNlZCBvbiBsZXhpY29ncmFwaGljIHJhbmsgb3JkZXIgb2YqL1xuLyogdGhlaXIgdmFsdWVzLCBhcyBvcmdhbml6ZWQgYnkgcmV2ZXJzZSBsZXhpY29ncmFwaGljIG9yZGVyIG9mIHRoZWlyKi9cbi8qIHByb3BlcnR5IG5hbWVzLiovXG4vKiBUaHVzIGlmIGNvbXBhcmVLZXlzKFgsWSkgPCAwIHRoZW4gY29tcGFyZVJhbmsoWCxZKSA8IDAuKi9cbnJldHVybiByZXN1bHQ7XG4gfVxuY2FzZSd0YWdnZWQnOntcbmNvbnN0IGxlZnRUYWc9Z2V0VGFnKGxlZnQpO1xuY29uc3QgcmlnaHRUYWc9Z2V0VGFnKHJpZ2h0KTtcbmlmKGxlZnRUYWchPT1yaWdodFRhZyl7XG4vKiBkaWZmZXJlbnQgdGFncyBhcmUgaW5jb21tZW5zdXJhdGUqL1xucmV0dXJuIE5hTjtcbiB9XG5zd2l0Y2gobGVmdFRhZyl7XG5jYXNlJ2NvcHlTZXQnOntcbi8qIGNvcHlTZXQgWCBpcyBzbWFsbGVyIHRoYW4gY29weVNldCBZIHdoZW4gZXZlcnkgZWxlbWVudCBvZiBYKi9cbi8qIGlzIGtleUVRIHRvIHNvbWUgZWxlbWVudCBvZiBZIGFuZCBzb21lIGVsZW1lbnQgb2YgWSBpcyovXG4vKiBub3Qga2V5RVEgdG8gYW55IGVsZW1lbnQgb2YgWC4qL1xucmV0dXJuIHNldENvbXBhcmUobGVmdCxyaWdodCk7XG4gfVxuY2FzZSdjb3B5QmFnJzp7XG4vKiBjb3B5QmFnIFggaXMgc21hbGxlciB0aGFuIGNvcHlCYWcgWSB3aGVuIGV2ZXJ5IGVsZW1lbnQgb2YgWCovXG4vKiBvY2N1cnMgbm8gbW9yZSB0aGFuIHRoZSBrZXlFUSBlbGVtZW50IG9mIFksIGFuZCBzb21lIGVsZW1lbnQqL1xuLyogb2YgWSBvY2N1cnMgbW9yZSB0aGFuIHNvbWUgZWxlbWVudCBvZiBYLCB3aGVyZSBiZWluZyBhYnNlbnQqL1xuLyogZnJvbSBYIGNvdW50cyBhcyBvY2N1cnJpbmcgemVybyB0aW1lcy4qL1xucmV0dXJuIGJhZ0NvbXBhcmUobGVmdCxyaWdodCk7XG4gfVxuY2FzZSdjb3B5TWFwJzp7XG4vKiBUd28gY29weU1hcHMgdGhhdCBoYXZlIGRpZmZlcmVudCBrZXlzIChhY2NvcmRpbmcgdG8ga2V5RVEpIGFyZSovXG4vKiBpbmNvbW1lbnN1cmF0ZS4gVGhlIHJlcHJlc2VudGF0aW9uIG9mIGNvcHlNYXBzIGluY2x1ZGVzIHRoZSBrZXlzKi9cbi8qIGZpcnN0LCBpbiB0aGUgc2FtZSByZXZlcnNlIHJhbmsgb3JkZXIgdXNlZCBieSBzZXRzLiBUaHVzLCBhbGwqL1xuLyogY29weU1hcHMgd2l0aCBrZXlzIG9mIHRoZSBzYW1lIHJhbmsgKHdoaWNoIGlzKi9cbi8qIGxlc3MgcHJlY2lzZSEpIHdpbGwgYmUgZ3JvdXBlZCB0b2dldGhlciB3aGVuIGNvcHlNYXBzIGFyZSBzb3J0ZWQqL1xuLyogYnkgcmFuaywgbWluaW1pemluZyB0aGUgbnVtYmVyIG9mIG1pc3NlcyB3aGVuIHJhbmdlIHNlYXJjaGluZy4qL1xuLyoqL1xuLyogQW1vbmcgY29weU1hcHMgd2l0aCB0aGUgc2FtZSBrZXlzIChhY2NvcmRpbmcgdG8ga2V5RVEpLCB0aGV5Ki9cbi8qIGNvbXBhcmUgYnkgYSBjb3JyZXNwb25kaW5nIGNvbXBhcmlzb24gb2YgdGhlaXIgdmFsdWVzLiBUaHVzLCBhcyovXG4vKiB3aXRoIHJlY29yZHMsIGZvciB0d28gY29weU1hcHMgWCBhbmQgWSwgaWYgYGNvbXBhcmVLZXlzKFgsWSkgPCovXG4vKiAwYCB0aGVuLCBiZWNhdXNlIHRoZXNlIHZhbHVlcyBvYmV5IHRoZSBhYm92ZSBpbnZhcmlhbnRzLCBub25lIG9mKi9cbi8qIHRoZSB2YWx1ZXMgaW4gWCBoYXZlIGEgbGF0ZXIgcmFuayB0aGFuIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlKi9cbi8qIG9mIFkuIFRodXMsIGBjb21wYXJlUmFuayhYLFkpIDw9IDBgLiBUT0RPIGltcGxlbWVudCovXG50aHJvdyBGYWlsIGBNYXAgY29tcGFyaXNvbiBub3QgeWV0IGltcGxlbWVudGVkOiAke2xlZnR9IHZzICR7cmlnaHR9YDtcbiB9XG5kZWZhdWx0OntcbnRocm93IEZhaWwgYHVuZXhwZWN0ZWQgdGFnICR7cShsZWZ0VGFnKX06ICR7bGVmdH1gO1xuIH19XG5cbiB9XG5kZWZhdWx0OntcbnRocm93IEZhaWwgYHVuZXhwZWN0ZWQgcGFzc1N0eWxlICR7cShsZWZ0U3R5bGUpfTogJHtsZWZ0fWA7XG4gfX1cblxuIH07JGjigI1fb25jZS5jb21wYXJlS2V5cyhjb21wYXJlS2V5cyk7XG5oYXJkZW4oY29tcGFyZUtleXMpO1xuXG5jb25zdCAgICAgICAga2V5TFQ9KGxlZnQscmlnaHQpPT5jb21wYXJlS2V5cyhsZWZ0LHJpZ2h0KTwwOyRo4oCNX29uY2Uua2V5TFQoa2V5TFQpO1xuaGFyZGVuKGtleUxUKTtcblxuY29uc3QgICAgICAgIGtleUxURT0obGVmdCxyaWdodCk9PmNvbXBhcmVLZXlzKGxlZnQscmlnaHQpPD0wOyRo4oCNX29uY2Uua2V5TFRFKGtleUxURSk7XG5oYXJkZW4oa2V5TFRFKTtcblxuY29uc3QgICAgICAgIGtleUVRPShsZWZ0LHJpZ2h0KT0+Y29tcGFyZUtleXMobGVmdCxyaWdodCk9PT0wOyRo4oCNX29uY2Uua2V5RVEoa2V5RVEpO1xuaGFyZGVuKGtleUVRKTtcblxuY29uc3QgICAgICAgIGtleUdURT0obGVmdCxyaWdodCk9PmNvbXBhcmVLZXlzKGxlZnQscmlnaHQpPj0wOyRo4oCNX29uY2Uua2V5R1RFKGtleUdURSk7XG5oYXJkZW4oa2V5R1RFKTtcblxuY29uc3QgICAgICAgIGtleUdUPShsZWZ0LHJpZ2h0KT0+Y29tcGFyZUtleXMobGVmdCxyaWdodCk+MDskaOKAjV9vbmNlLmtleUdUKGtleUdUKTtcbmhhcmRlbihrZXlHVCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiY29tcGFyZUtleXMiOlsiY29tcGFyZUtleXMiXSwia2V5TFQiOlsia2V5TFQiXSwia2V5TFRFIjpbImtleUxURSJdLCJrZXlFUSI6WyJrZXlFUSJdLCJrZXlHVEUiOlsia2V5R1RFIl0sImtleUdUIjpbImtleUdUIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEyL4qQOEwAADhMAACgAAABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMva2V5cy9jb3B5QmFnLmpzeyJpbXBvcnRzIjpbIi4uL3BhdHRlcm5zL3JhbmtPcmRlci5qcyIsIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJhc3NlcnRCYWdFbnRyaWVzIiwiYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzIiwiY2hlY2tCYWdFbnRyaWVzIiwiY29lcmNlVG9CYWdFbnRyaWVzIiwibWFrZUJhZ09mRW50cmllcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnRDaGVja2VyLG1ha2VUYWdnZWQscGFzc1N0eWxlT2YsY29tcGFyZUFudGlSYW5rLGlzUmFua1NvcnRlZCxtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCxzb3J0QnlSYW5rOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dLFtcIm1ha2VUYWdnZWRcIiwgWyRo4oCNX2EgPT4gKG1ha2VUYWdnZWQgPSAkaOKAjV9hKV1dLFtcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV1dXSxbXCIuLi9wYXR0ZXJucy9yYW5rT3JkZXIuanNcIiwgW1tcImNvbXBhcmVBbnRpUmFua1wiLCBbJGjigI1fYSA9PiAoY29tcGFyZUFudGlSYW5rID0gJGjigI1fYSldXSxbXCJpc1JhbmtTb3J0ZWRcIiwgWyRo4oCNX2EgPT4gKGlzUmFua1NvcnRlZCA9ICRo4oCNX2EpXV0sW1wibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0ID0gJGjigI1fYSldXSxbXCJzb3J0QnlSYW5rXCIsIFskaOKAjV9hID0+IChzb3J0QnlSYW5rID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cbi8qLyA8cmVmZXJlbmNlIHR5cGVzPVwic2VzXCIvPiovXG5cbmNvbnN0e2RldGFpbHM6WH09YXNzZXJ0O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1tULGJpZ2ludF1bXX0gYmFnRW50cmllc1xuICogQHBhcmFtIHtGdWxsQ29tcGFyZSB8IHVuZGVmaW5lZH0gZnVsbENvbXBhcmUgSWYgcHJvdmlkZWQgYW5kIGBiYWdFbnRyaWVzYCBpcyBhbHJlYWR5XG4gKiBrbm93biB0byBiZSBzb3J0ZWQgYnkgdGhpcyBgZnVsbENvbXBhcmVgLCB0aGVuIHdlIHNob3VsZCBnZXQgYSBtZW1vIGhpdFxuICogcmF0aGVyIHRoYW4gYSByZXNvcnRpbmcuIEhvd2V2ZXIsIGN1cnJlbnRseSwgd2Ugc3RpbGwgZW51bWVyYXRlIHRoZSBlbnRpcmVcbiAqIGFycmF5IGVhY2ggdGltZS5cbiAqXG4gKiBUT0RPOiBJZiBkb2luZyB0aGlzIHJlZHVudGFudGx5IHR1cm5zIG91dCB0byBiZSBleHBlbnNpdmUsIHdlXG4gKiBjb3VsZCBtZW1vaXplIHRoaXMgbm8tZHVwbGljYXRlLWtleXMgZmluZGluZyBhcyB3ZWxsLCBpbmRlcGVuZGVudFxuICogb2YgdGhlIGBmdWxsT3JkZXJgIHVzZSB0byByZWFjaCB0aGlzIGZpbmRpbmcuXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tOb0R1cGxpY2F0ZUtleXM9KGJhZ0VudHJpZXMsZnVsbENvbXBhcmUsY2hlY2spPT57XG4vKiBUaGlzIGZ1bGxPcmRlciBjb250YWlucyBoaXN0b3J5IGRlcGVuZGVudCBzdGF0ZS4gSXQgaXMgc3BlY2lmaWMqL1xuLyogdG8gdGhpcyBvbmUgY2FsbCBhbmQgZG9lcyBub3Qgc3Vydml2ZSBpdC4qL1xuLyogVE9ETyBPbmNlIGFsbCBvdXIgdG9vbGluZyBpcyByZWFkeSBmb3IgYCYmPWAsIHRoZSBmb2xsb3dpbmcqL1xuLyogbGluZSBzaG91bGQgYmUgcmV3cml0dGVuIHVzaW5nIGl0LiovXG5mdWxsQ29tcGFyZT1mdWxsQ29tcGFyZXx8bWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQoKS5hbnRpQ29tcGFyYXRvcjtcblxuLyogU2luY2UgdGhlIGtleSBpcyBtb3JlIHNpZ25pZmljYW50IHRoYW4gdGhlIHZhbHVlICh0aGUgY291bnQpLCovXG4vKiBzb3J0aW5nIGJ5IGZ1bGxPcmRlciBpcyBndWFyYW50ZWVkIHRvIG1ha2UgZHVwbGljYXRlIGtleXMqL1xuLyogYWRqYWNlbnQgaW5kZXBlbmRlbnQgb2YgdGhlaXIgY291bnRzLiovXG5iYWdFbnRyaWVzPXNvcnRCeVJhbmsoYmFnRW50cmllcyxmdWxsQ29tcGFyZSk7XG5jb25zdHtsZW5ndGh9PWJhZ0VudHJpZXM7XG5mb3IobGV0IGk9MTtpPGxlbmd0aDtpKz0xKXtcbmNvbnN0IGswPWJhZ0VudHJpZXNbaS0xXVswXTtcbmNvbnN0IGsxPWJhZ0VudHJpZXNbaV1bMF07XG5pZihmdWxsQ29tcGFyZShrMCxrMSk9PT0wKXtcbnJldHVybiBjaGVjayhmYWxzZSxYIGB2YWx1ZSBoYXMgZHVwbGljYXRlIGtleXM6ICR7azB9YCk7XG4gfVxuIH1cbnJldHVybiB0cnVlO1xuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7W1QsYmlnaW50XVtdfSBiYWdFbnRyaWVzXG4gKiBAcGFyYW0ge0Z1bGxDb21wYXJlPX0gZnVsbENvbXBhcmVcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5jb25zdCAgICAgICAgYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzPShiYWdFbnRyaWVzLGZ1bGxDb21wYXJlPXVuZGVmaW5lZCk9PntcbmNoZWNrTm9EdXBsaWNhdGVLZXlzKGJhZ0VudHJpZXMsZnVsbENvbXBhcmUsYXNzZXJ0Q2hlY2tlcik7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1tQYXNzYWJsZSxiaWdpbnRdW119IGJhZ0VudHJpZXNcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovJGjigI1fb25jZS5hc3NlcnROb0R1cGxpY2F0ZUtleXMoYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzKTtcbmNvbnN0ICAgICAgICBjaGVja0JhZ0VudHJpZXM9KGJhZ0VudHJpZXMsY2hlY2spPT57XG5pZihwYXNzU3R5bGVPZihiYWdFbnRyaWVzKSE9PSdjb3B5QXJyYXknKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgVGhlIGVudHJpZXMgb2YgYSBjb3B5QmFnIG11c3QgYmUgYSBjb3B5QXJyYXk6ICR7YmFnRW50cmllc31gKTtcblxuIH1cbmlmKCFpc1JhbmtTb3J0ZWQoYmFnRW50cmllcyxjb21wYXJlQW50aVJhbmspKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgVGhlIGVudHJpZXMgb2YgYSBjb3B5QmFnIG11c3QgYmUgc29ydGVkIGluIHJldmVyc2UgcmFuayBvcmRlcjogJHtiYWdFbnRyaWVzfWApO1xuXG4gfVxuZm9yKGNvbnN0IGVudHJ5IG9mIGJhZ0VudHJpZXMpe1xuaWYoXG5wYXNzU3R5bGVPZihlbnRyeSkhPT0nY29weUFycmF5J3x8XG5lbnRyeS5sZW5ndGghPT0yfHxcbnR5cGVvZiBlbnRyeVsxXSE9PSdiaWdpbnQnKVxue1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBFYWNoIGVudHJ5IG9mIGEgY29weUJhZyBtdXN0IGJlIHBhaXIgb2YgYSBrZXkgYW5kIGEgYmlnaW50IHJlcHJlc2VudGluZyBhIGNvdW50OiAke2VudHJ5fWApO1xuXG4gfVxuaWYoZW50cnlbMV08MSl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYEVhY2ggZW50cnkgb2YgYSBjb3B5QmFnIG11c3QgaGF2ZSBhIHBvc2l0aXZlIGNvdW50OiAke2VudHJ5fWApO1xuXG4gfVxuIH1cbnJldHVybiBjaGVja05vRHVwbGljYXRlS2V5cyhiYWdFbnRyaWVzLHVuZGVmaW5lZCxjaGVjayk7XG4gfTskaOKAjV9vbmNlLmNoZWNrQmFnRW50cmllcyhjaGVja0JhZ0VudHJpZXMpO1xuaGFyZGVuKGNoZWNrQmFnRW50cmllcyk7XG5cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLXJldHVybnMtY2hlY2sgLS0gZG9lc24ndCB1bmRlcnN0YW5kIGFzc2VydHMqL1xuLyoqXG4gKiBAcGFyYW0ge1tQYXNzYWJsZSxiaWdpbnRdW119IGJhZ0VudHJpZXNcbiAqIEByZXR1cm5zIHthc3NlcnRzIGJhZ0VudHJpZXMgaXMgW1Bhc3NhYmxlLGJpZ2ludF1bXX1cbiAqL1xuY29uc3QgICAgICAgIGFzc2VydEJhZ0VudHJpZXM9KGJhZ0VudHJpZXMpPT57XG5jaGVja0JhZ0VudHJpZXMoYmFnRW50cmllcyxhc3NlcnRDaGVja2VyKTtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0QmFnRW50cmllcyhhc3NlcnRCYWdFbnRyaWVzKTtcbmhhcmRlbihhc3NlcnRCYWdFbnRyaWVzKTtcblxuY29uc3QgICAgICAgIGNvZXJjZVRvQmFnRW50cmllcz0oYmFnRW50cmllc0xpc3QpPT57XG5jb25zdCBiYWdFbnRyaWVzPXNvcnRCeVJhbmsoYmFnRW50cmllc0xpc3QsY29tcGFyZUFudGlSYW5rKTtcbmFzc2VydEJhZ0VudHJpZXMoYmFnRW50cmllcyk7XG5yZXR1cm4gYmFnRW50cmllcztcbiB9OyRo4oCNX29uY2UuY29lcmNlVG9CYWdFbnRyaWVzKGNvZXJjZVRvQmFnRW50cmllcyk7XG5oYXJkZW4oY29lcmNlVG9CYWdFbnRyaWVzKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtJdGVyYWJsZTxbSywgYmlnaW50XT59IGJhZ0VudHJ5SXRlclxuICogQHJldHVybnMge0NvcHlCYWc8Sz59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlQmFnT2ZFbnRyaWVzPShiYWdFbnRyeUl0ZXIpPT5cbm1ha2VUYWdnZWQoJ2NvcHlCYWcnLGNvZXJjZVRvQmFnRW50cmllcyhiYWdFbnRyeUl0ZXIpKTskaOKAjV9vbmNlLm1ha2VCYWdPZkVudHJpZXMobWFrZUJhZ09mRW50cmllcyk7XG5oYXJkZW4obWFrZUJhZ09mRW50cmllcyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzIjpbImFzc2VydE5vRHVwbGljYXRlS2V5cyJdLCJjaGVja0JhZ0VudHJpZXMiOlsiY2hlY2tCYWdFbnRyaWVzIl0sImFzc2VydEJhZ0VudHJpZXMiOlsiYXNzZXJ0QmFnRW50cmllcyJdLCJjb2VyY2VUb0JhZ0VudHJpZXMiOlsiY29lcmNlVG9CYWdFbnRyaWVzIl0sIm1ha2VCYWdPZkVudHJpZXMiOlsibWFrZUJhZ09mRW50cmllcyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACOhI2Thw8AAIcPAAAoAAAAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL2tleXMvY29weVNldC5qc3siaW1wb3J0cyI6WyIuLi9wYXR0ZXJucy9yYW5rT3JkZXIuanMiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsiYXNzZXJ0RWxlbWVudHMiLCJhc3NlcnROb0R1cGxpY2F0ZXMiLCJjaGVja0VsZW1lbnRzIiwiY29lcmNlVG9FbGVtZW50cyIsIm1ha2VTZXRPZkVsZW1lbnRzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydENoZWNrZXIsbWFrZVRhZ2dlZCxwYXNzU3R5bGVPZixjb21wYXJlQW50aVJhbmssaXNSYW5rU29ydGVkLG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0LHNvcnRCeVJhbms7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV0sW1wibWFrZVRhZ2dlZFwiLCBbJGjigI1fYSA9PiAobWFrZVRhZ2dlZCA9ICRo4oCNX2EpXV0sW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXV1dLFtcIi4uL3BhdHRlcm5zL3JhbmtPcmRlci5qc1wiLCBbW1wiY29tcGFyZUFudGlSYW5rXCIsIFskaOKAjV9hID0+IChjb21wYXJlQW50aVJhbmsgPSAkaOKAjV9hKV1dLFtcImlzUmFua1NvcnRlZFwiLCBbJGjigI1fYSA9PiAoaXNSYW5rU29ydGVkID0gJGjigI1fYSldXSxbXCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdFwiLCBbJGjigI1fYSA9PiAobWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQgPSAkaOKAjV9hKV1dLFtcInNvcnRCeVJhbmtcIiwgWyRo4oCNX2EgPT4gKHNvcnRCeVJhbmsgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuLyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIi8+Ki9cblxuY29uc3R7ZGV0YWlsczpYfT1hc3NlcnQ7XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7VFtdfSBlbGVtZW50c1xuICogQHBhcmFtIHtGdWxsQ29tcGFyZSB8IHVuZGVmaW5lZH0gZnVsbENvbXBhcmUgSWYgcHJvdmlkZWQgYW5kIGBlbGVtZW50c2AgaXMgYWxyZWFkeSBrbm93blxuICogdG8gYmUgc29ydGVkIGJ5IHRoaXMgYGZ1bGxDb21wYXJlYCwgdGhlbiB3ZSBzaG91bGQgZ2V0IGEgbWVtbyBoaXQgcmF0aGVyXG4gKiB0aGFuIGEgcmVzb3J0aW5nLiBIb3dldmVyLCBjdXJyZW50bHksIHdlIHN0aWxsIGVudW1lcmF0ZSB0aGUgZW50aXJlIGFycmF5XG4gKiBlYWNoIHRpbWUuXG4gKlxuICogVE9ETzogSWYgZG9pbmcgdGhpcyByZWR1bnRhbnRseSB0dXJucyBvdXQgdG8gYmUgZXhwZW5zaXZlLCB3ZVxuICogY291bGQgbWVtb2l6ZSB0aGlzIG5vLWR1cGxpY2F0ZSBmaW5kaW5nIGFzIHdlbGwsIGluZGVwZW5kZW50XG4gKiBvZiB0aGUgYGZ1bGxPcmRlcmAgdXNlIHRvIHJlYWNoIHRoaXMgZmluZGluZy5cbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja05vRHVwbGljYXRlcz0oZWxlbWVudHMsZnVsbENvbXBhcmUsY2hlY2spPT57XG4vKiBUaGlzIGZ1bGxPcmRlciBjb250YWlucyBoaXN0b3J5IGRlcGVuZGVudCBzdGF0ZS4gSXQgaXMgc3BlY2lmaWMqL1xuLyogdG8gdGhpcyBvbmUgY2FsbCBhbmQgZG9lcyBub3Qgc3Vydml2ZSBpdC4qL1xuLyogVE9ETyBPbmNlIGFsbCBvdXIgdG9vbGluZyBpcyByZWFkeSBmb3IgYCYmPWAsIHRoZSBmb2xsb3dpbmcqL1xuLyogbGluZSBzaG91bGQgYmUgcmV3cml0dGVuIHVzaW5nIGl0LiovXG5mdWxsQ29tcGFyZT1mdWxsQ29tcGFyZXx8bWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQoKS5hbnRpQ29tcGFyYXRvcjtcblxuZWxlbWVudHM9c29ydEJ5UmFuayhlbGVtZW50cyxmdWxsQ29tcGFyZSk7XG5jb25zdHtsZW5ndGh9PWVsZW1lbnRzO1xuZm9yKGxldCBpPTE7aTxsZW5ndGg7aSs9MSl7XG5jb25zdCBrMD1lbGVtZW50c1tpLTFdO1xuY29uc3QgazE9ZWxlbWVudHNbaV07XG5pZihmdWxsQ29tcGFyZShrMCxrMSk9PT0wKXtcbnJldHVybiBjaGVjayhmYWxzZSxYIGB2YWx1ZSBoYXMgZHVwbGljYXRlczogJHtrMH1gKTtcbiB9XG4gfVxucmV0dXJuIHRydWU7XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUW119IGVsZW1lbnRzXG4gKiBAcGFyYW0ge0Z1bGxDb21wYXJlPX0gZnVsbENvbXBhcmVcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5jb25zdCAgICAgICAgYXNzZXJ0Tm9EdXBsaWNhdGVzPShlbGVtZW50cyxmdWxsQ29tcGFyZT11bmRlZmluZWQpPT57XG5jaGVja05vRHVwbGljYXRlcyhlbGVtZW50cyxmdWxsQ29tcGFyZSxhc3NlcnRDaGVja2VyKTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gZWxlbWVudHNcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovJGjigI1fb25jZS5hc3NlcnROb0R1cGxpY2F0ZXMoYXNzZXJ0Tm9EdXBsaWNhdGVzKTtcbmNvbnN0ICAgICAgICBjaGVja0VsZW1lbnRzPShlbGVtZW50cyxjaGVjayk9PntcbmlmKHBhc3NTdHlsZU9mKGVsZW1lbnRzKSE9PSdjb3B5QXJyYXknKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgVGhlIGtleXMgb2YgYSBjb3B5U2V0IG9yIGNvcHlNYXAgbXVzdCBiZSBhIGNvcHlBcnJheTogJHtlbGVtZW50c31gKTtcblxuIH1cbmlmKCFpc1JhbmtTb3J0ZWQoZWxlbWVudHMsY29tcGFyZUFudGlSYW5rKSl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYFRoZSBrZXlzIG9mIGEgY29weVNldCBvciBjb3B5TWFwIG11c3QgYmUgc29ydGVkIGluIHJldmVyc2UgcmFuayBvcmRlcjogJHtlbGVtZW50c31gKTtcblxuIH1cbnJldHVybiBjaGVja05vRHVwbGljYXRlcyhlbGVtZW50cyx1bmRlZmluZWQsY2hlY2spO1xuIH07JGjigI1fb25jZS5jaGVja0VsZW1lbnRzKGNoZWNrRWxlbWVudHMpO1xuaGFyZGVuKGNoZWNrRWxlbWVudHMpO1xuXG5jb25zdCAgICAgICAgYXNzZXJ0RWxlbWVudHM9KGVsZW1lbnRzKT0+e1xuY2hlY2tFbGVtZW50cyhlbGVtZW50cyxhc3NlcnRDaGVja2VyKTtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0RWxlbWVudHMoYXNzZXJ0RWxlbWVudHMpO1xuaGFyZGVuKGFzc2VydEVsZW1lbnRzKTtcblxuY29uc3QgICAgICAgIGNvZXJjZVRvRWxlbWVudHM9KGVsZW1lbnRzTGlzdCk9PntcbmNvbnN0IGVsZW1lbnRzPXNvcnRCeVJhbmsoZWxlbWVudHNMaXN0LGNvbXBhcmVBbnRpUmFuayk7XG5hc3NlcnRFbGVtZW50cyhlbGVtZW50cyk7XG5yZXR1cm4gZWxlbWVudHM7XG4gfTskaOKAjV9vbmNlLmNvZXJjZVRvRWxlbWVudHMoY29lcmNlVG9FbGVtZW50cyk7XG5oYXJkZW4oY29lcmNlVG9FbGVtZW50cyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7SXRlcmFibGU8Sz59IGVsZW1lbnRJdGVyXG4gKiBAcmV0dXJucyB7Q29weVNldDxLPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VTZXRPZkVsZW1lbnRzPShlbGVtZW50SXRlcik9PlxubWFrZVRhZ2dlZCgnY29weVNldCcsY29lcmNlVG9FbGVtZW50cyhlbGVtZW50SXRlcikpOyRo4oCNX29uY2UubWFrZVNldE9mRWxlbWVudHMobWFrZVNldE9mRWxlbWVudHMpO1xuaGFyZGVuKG1ha2VTZXRPZkVsZW1lbnRzKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhc3NlcnROb0R1cGxpY2F0ZXMiOlsiYXNzZXJ0Tm9EdXBsaWNhdGVzIl0sImNoZWNrRWxlbWVudHMiOlsiY2hlY2tFbGVtZW50cyJdLCJhc3NlcnRFbGVtZW50cyI6WyJhc3NlcnRFbGVtZW50cyJdLCJjb2VyY2VUb0VsZW1lbnRzIjpbImNvZXJjZVRvRWxlbWVudHMiXSwibWFrZVNldE9mRWxlbWVudHMiOlsibWFrZVNldE9mRWxlbWVudHMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAS3V5OBoiAAAaIgAANAAAAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9rZXlzL21lcmdlLWJhZy1vcGVyYXRvcnMuanN7ImltcG9ydHMiOlsiLi4vcGF0dGVybnMvcmFua09yZGVyLmpzIiwiLi9jb3B5QmFnLmpzIl0sImV4cG9ydHMiOlsiYmFnQ29tcGFyZSIsImJhZ0Rpc2pvaW50U3VidHJhY3QiLCJiYWdJbnRlcnNlY3Rpb24iLCJiYWdJc0Rpc2pvaW50IiwiYmFnSXNTdXBlcmJhZyIsImJhZ1VuaW9uIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydFJhbmtTb3J0ZWQsY29tcGFyZUFudGlSYW5rLG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0LHNvcnRCeVJhbmssYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzLG1ha2VCYWdPZkVudHJpZXM7JGjigI1faW1wb3J0cyhbW1wiLi4vcGF0dGVybnMvcmFua09yZGVyLmpzXCIsIFtbXCJhc3NlcnRSYW5rU29ydGVkXCIsIFskaOKAjV9hID0+IChhc3NlcnRSYW5rU29ydGVkID0gJGjigI1fYSldXSxbXCJjb21wYXJlQW50aVJhbmtcIiwgWyRo4oCNX2EgPT4gKGNvbXBhcmVBbnRpUmFuayA9ICRo4oCNX2EpXV0sW1wibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0ID0gJGjigI1fYSldXSxbXCJzb3J0QnlSYW5rXCIsIFskaOKAjV9hID0+IChzb3J0QnlSYW5rID0gJGjigI1fYSldXV1dLFtcIi4vY29weUJhZy5qc1wiLCBbW1wiYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzXCIsIFskaOKAjV9hID0+IChhc3NlcnROb0R1cGxpY2F0ZUtleXMgPSAkaOKAjV9hKV1dLFtcIm1ha2VCYWdPZkVudHJpZXNcIiwgWyRo4oCNX2EgPT4gKG1ha2VCYWdPZkVudHJpZXMgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuY29uc3R7cXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5cbi8qIEJhc2VkIG9uIG1lcmdlLXNldC1vcGVyYXRvcnMuanMsIGJ1dCBhbHRlcmVkIGZvciB0aGUgYmFnIHJlcHJlc2VudGF0aW9uLiovXG4vKiBUT0RPIHNoYXJlIG1vcmUgY29kZSB3aXRoIG1lcmdlLXNldC1vcGVyYXRvcnMuanMsIHJhdGhlciB0aGFuKi9cbi8qIGR1cGxpY2F0aW5nIHdpdGggY2hhbmdlcy4qL1xuXG4vKipcbiAqIEFzc2VydHMgdGhhdCBgYmFnRW50cmllc2AgaXMgYWxyZWFkeSByYW5rIHNvcnRlZCBieSBgcmFua0NvbXBhcmVgLCB3aGVyZVxuICogdGhlcmVcbiAqIG1heSBiZSBjb250aWd1b3VzIHJlZ2lvbnMgb2YgYmFnRW50cmllcyB3aG9zZSBrZXlzIGFyZSB0aWVkIGZvciB0aGUgc2FtZVxuICogcmFuay5cbiAqIFJldHVybnMgYW4gaXRlcmFibGUgdGhhdCB3aWxsIGVudW1lcmF0ZSBhbGwgdGhlIGJhZ0VudHJpZXMgaW4gb3JkZXJcbiAqIGFjY29yZGluZyB0byBgZnVsbE9yZGVyYCwgd2hpY2ggc2hvdWxkIGRpZmZlciBmcm9tIGByYW5rT3JkZXJgIG9ubHlcbiAqIGJ5IGJlaW5nIG1vcmUgcHJlY2lzZS5cbiAqXG4gKiBUaGlzIHNob3VsZCBiZSBlcXVpdmFsZW50IHRvIHJlc29ydGluZyB0aGUgZW50aXJlIGBiYWdFbnRyaWVzYCBhcnJheVxuICogYWNjb3JkaW5nXG4gKiB0byBgZnVsbE9yZGVyYC4gSG93ZXZlciwgaXQgb3B0aW1pemVzIGZvciB0aGUgY2FzZSB3aGVyZSB0aGVzZSBjb250aWd1b3VzXG4gKiBydW5zIHRoYXQgbmVlZCB0byBiZSByZXNvcnRlZCBhcmUgZWl0aGVyIGFic2VudCBvciBzbWFsbC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtbVCxiaWdpbnRdW119IGJhZ0VudHJpZXNcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IHJhbmtDb21wYXJlXG4gKiBAcGFyYW0ge0Z1bGxDb21wYXJlfSBmdWxsQ29tcGFyZVxuICogQHJldHVybnMge0l0ZXJhYmxlPFtULGJpZ2ludF0+fVxuICovXG5jb25zdCBiYWdXaW5kb3dSZXNvcnQ9KGJhZ0VudHJpZXMscmFua0NvbXBhcmUsZnVsbENvbXBhcmUpPT57XG5hc3NlcnRSYW5rU29ydGVkKGJhZ0VudHJpZXMscmFua0NvbXBhcmUpO1xuY29uc3R7bGVuZ3RofT1iYWdFbnRyaWVzO1xubGV0IGk9MDtcbmxldCBvcHRJbm5lckl0ZXJhdG9yO1xucmV0dXJuIGhhcmRlbih7XG5bU3ltYm9sLml0ZXJhdG9yXTooKT0+XG5oYXJkZW4oe1xubmV4dDooKT0+e1xuaWYob3B0SW5uZXJJdGVyYXRvcil7XG5jb25zdCByZXN1bHQ9b3B0SW5uZXJJdGVyYXRvci5uZXh0KCk7XG5pZihyZXN1bHQuZG9uZSl7XG5vcHRJbm5lckl0ZXJhdG9yPXVuZGVmaW5lZDtcbi8qIGZhbGwgdGhyb3VnaCovXG4gfWVsc2V7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbiB9XG5pZihpPGxlbmd0aCl7XG5jb25zdCBlbnRyeT1iYWdFbnRyaWVzW2ldO1xubGV0IGo9aSsxO1xud2hpbGUoXG5qPGxlbmd0aCYmXG5yYW5rQ29tcGFyZShlbnRyeVswXSxiYWdFbnRyaWVzW2pdWzBdKT09PTApXG57XG5qKz0xO1xuIH1cbmlmKGo9PT1pKzEpe1xuaT1qO1xucmV0dXJuIGhhcmRlbih7ZG9uZTpmYWxzZSx2YWx1ZTplbnRyeX0pO1xuIH1cbmNvbnN0IHNpbWlsYXJSdW49YmFnRW50cmllcy5zbGljZShpLGopO1xuaT1qO1xuY29uc3QgcmVzb3J0ZWQ9c29ydEJ5UmFuayhzaW1pbGFyUnVuLGZ1bGxDb21wYXJlKTtcbi8qIFByb3ZpZGluZyB0aGUgc2FtZSBgZnVsbENvbXBhcmVgIHNob3VsZCBjYXVzZSBhIG1lbW8gaGl0Ki9cbi8qIHdpdGhpbiBgYXNzZXJ0Tm9EdXBsaWNhdGVzYCBlbmFibGluZyBpdCB0byBhdm9pZCBhKi9cbi8qIHJlZHVuZGFudCByZXNvcnRpbmcuKi9cbmFzc2VydE5vRHVwbGljYXRlS2V5cyhyZXNvcnRlZCxmdWxsQ29tcGFyZSk7XG4vKiBUaGlzIGlzIHRoZSByYXcgSlMgYXJyYXkgaXRlcmF0b3Igd2hvc2UgYC5uZXh0KClgIG1ldGhvZCovXG4vKiBkb2VzIG5vdCBoYXJkZW4gdGhlIEl0ZXJhdG9yUmVzdWx0LCBpbiB2aW9sYXRpb24gb2Ygb3VyKi9cbi8qIGNvbnZlbnRpb25zLiBGaXhpbmcgdGhpcyBpcyBleHBlbnNpdmUgYW5kIEknbSBjb25maWRlbnQgdGhlKi9cbi8qIHVuZnJvemVuIHZhbHVlIGRvZXMgbm90IGVzY2FwZSB0aGlzIGZpbGUsIHNvIEknbSBsZWF2aW5nIHRoaXMqL1xuLyogYXMgaXMuKi9cbm9wdElubmVySXRlcmF0b3I9cmVzb3J0ZWRbU3ltYm9sLml0ZXJhdG9yXSgpO1xucmV0dXJuIG9wdElubmVySXRlcmF0b3IubmV4dCgpO1xuIH1lbHNle1xucmV0dXJuIGhhcmRlbih7ZG9uZTp0cnVlLHZhbHVlOltudWxsLDBuXX0pO1xuIH1cbiB9fSl9KTtcblxuXG4gfTtcblxuLyoqXG4gKiBSZXR1cm5zIGFuIGl0ZXJhYmxlIHdob3NlIGl0ZXJhdGlvbiByZXN1bHRzIGFyZSBba2V5LCB4Q291bnQsIHlDb3VudF0gdHVwbGVzXG4gKiByZXByZXNlbnRpbmcgdGhlIG5leHQga2V5IGluIHRoZSBsb2NhbCBmdWxsIG9yZGVyLCBhcyB3ZWxsIGFzIGhvdyBtYW55XG4gKiB0aW1lcyBpdCBvY2N1cnJlZCBpbiB0aGUgeCBpbnB1dCBpdGVyYXRvciBhbmQgdGhlIHkgaW5wdXQgaXRlcmF0b3IuXG4gKlxuICogRm9yIHNldHMsIHRoZXNlIGNvdW50cyBhcmUgYWx3YXlzIDAgb3IgMSwgYnV0IHRoaXMgcmVwcmVzZW50YXRpb25cbiAqIGdlbmVyYWxpemVzIG5pY2VseSBmb3IgYmFncy5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtbVCxiaWdpbnRdW119IHhiYWdFbnRyaWVzXG4gKiBAcGFyYW0ge1tULGJpZ2ludF1bXX0geWJhZ0VudHJpZXNcbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxbVCxiaWdpbnQsYmlnaW50XT59XG4gKi9cbmNvbnN0IG1lcmdlPSh4YmFnRW50cmllcyx5YmFnRW50cmllcyk9Pntcbi8qIFRoaXMgZnVsbE9yZGVyIGNvbnRhaW5zIGhpc3RvcnkgZGVwZW5kZW50IHN0YXRlLiBJdCBpcyBzcGVjaWZpYyovXG4vKiB0byB0aGlzIG9uZSBgbWVyZ2VgIGNhbGwgYW5kIGRvZXMgbm90IHN1cnZpdmUgaXQuKi9cbmNvbnN0IGZ1bGxDb21wYXJlPW1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KCkuYW50aUNvbXBhcmF0b3I7XG5cbmNvbnN0IHhzPWJhZ1dpbmRvd1Jlc29ydCh4YmFnRW50cmllcyxjb21wYXJlQW50aVJhbmssZnVsbENvbXBhcmUpO1xuY29uc3QgeXM9YmFnV2luZG93UmVzb3J0KHliYWdFbnRyaWVzLGNvbXBhcmVBbnRpUmFuayxmdWxsQ29tcGFyZSk7XG5yZXR1cm4gaGFyZGVuKHtcbltTeW1ib2wuaXRlcmF0b3JdOigpPT57XG4vKiBUaGVzZSBzaXggYGxldGAgdmFyaWFibGVzIGFyZSBidWZmZXJpbmcgb25lIGFoZWFkIGZyb20gdGhlIHVuZGVybHlpbmcqL1xuLyogaXRlcmF0b3JzLiBFYWNoIGl0ZXJhdGlvbiByZXBvcnRzIG9uZSBvciB0aGUgb3RoZXIgb3IgYm90aCwgYW5kKi9cbi8qIHRoZW4gcmVmaWxscyB0aGUgYnVmZmVycyBvZiB0aG9zZSBpdCBhZHZhbmNlZC4qL1xuLyoqIEB0eXBlIHtUfSAqL1xubGV0IHg7XG5sZXQgeGM7XG5sZXQgeERvbmU7XG4vKiogQHR5cGUge1R9ICovXG5sZXQgeTtcbmxldCB5YztcbmxldCB5RG9uZTtcblxuY29uc3QgeGk9eHNbU3ltYm9sLml0ZXJhdG9yXSgpO1xuY29uc3QgbmV4dFg9KCk9PntcbiF4RG9uZXx8RmFpbCBgSW50ZXJuYWw6IG5leHRYIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uY2UgZG9uZWA7XG4oe1xuZG9uZTp4RG9uZSxcbnZhbHVlOlt4LHhjXX09XG54aS5uZXh0KCkpO1xuIH07XG5uZXh0WCgpO1xuXG5jb25zdCB5aT15c1tTeW1ib2wuaXRlcmF0b3JdKCk7XG5jb25zdCBuZXh0WT0oKT0+e1xuIXlEb25lfHxGYWlsIGBJbnRlcm5hbDogbmV4dFkgc2hvdWxkIG5vdCBiZSBjYWxsZWQgb25jZSBkb25lYDtcbih7XG5kb25lOnlEb25lLFxudmFsdWU6W3kseWNdfT1cbnlpLm5leHQoKSk7XG4gfTtcbm5leHRZKCk7XG5cbnJldHVybiBoYXJkZW4oe1xubmV4dDooKT0+e1xuLyoqIEB0eXBlIHtib29sZWFufSAqL1xubGV0IGRvbmU9ZmFsc2U7XG4vKiogQHR5cGUge1tULGJpZ2ludCxiaWdpbnRdfSAqL1xubGV0IHZhbHVlO1xuaWYoeERvbmUmJnlEb25lKXtcbmRvbmU9dHJ1ZTtcbi8qIEB0cy1leHBlY3QtZXJyb3IgQmVjYXVzZSB0aGUgdGVybWluYXRpbmcgdmFsdWUgZG9lcyBub3QgbWF0dGVyKi9cbnZhbHVlPVtudWxsLDBuLDBuXTtcbiB9ZWxzZSBpZih4RG9uZSl7XG4vKiBvbmx5IHlzIGFyZSBsZWZ0Ki9cbnZhbHVlPVt5LDBuLHljXTtcbm5leHRZKCk7XG4gfWVsc2UgaWYoeURvbmUpe1xuLyogb25seSB4cyBhcmUgbGVmdCovXG52YWx1ZT1beCx4Yywwbl07XG5uZXh0WCgpO1xuIH1lbHNle1xuY29uc3QgY29tcD1mdWxsQ29tcGFyZSh4LHkpO1xuaWYoY29tcD09PTApe1xuLyogeCBhbmQgeSBhcmUgZXF1aXZhbGVudCwgc28gcmVwb3J0IGJvdGgqL1xudmFsdWU9W3gseGMseWNdO1xubmV4dFgoKTtcbm5leHRZKCk7XG4gfWVsc2UgaWYoY29tcDwwKXtcbi8qIHggaXMgZWFybGllciwgc28gcmVwb3J0IGl0Ki9cbnZhbHVlPVt4LHhjLDBuXTtcbm5leHRYKCk7XG4gfWVsc2V7XG4vKiB5IGlzIGVhcmxpZXIsIHNvIHJlcG9ydCBpdCovXG5jb21wPjB8fEZhaWwgYEludGVybmFsOiBVbmV4cGVjdGVkIGNvbXAgJHtxKGNvbXApfWA7XG52YWx1ZT1beSwwbix5Y107XG5uZXh0WSgpO1xuIH1cbiB9XG5yZXR1cm4gaGFyZGVuKHtkb25lLHZhbHVlfSk7XG4gfX0pO1xuXG4gfX0pO1xuXG4gfTtcbmhhcmRlbihtZXJnZSk7XG5cbi8qIFdlIHNob3VsZCBiZSBhYmxlIHRvIHVzZSB0aGlzIGZvciBpdGVySXNTdXBlcnNldCBhcyB3ZWxsLiovXG4vKiBUaGUgZ2VuZXJhbGl6YXRpb24gaXMgZnJlZS4qL1xuY29uc3QgYmFnSXRlcklzU3VwZXJiYWc9KHh5aSk9PntcbmZvcihjb25zdFtfbSx4Yyx5Y11vZiB4eWkpe1xuaWYoeGM8eWMpe1xuLyogc29tZXRoaW5nIGluIHkgaXMgbm90IGluIHgsIHNvIHggaXMgbm90IGEgc3VwZXJiYWcgb2YgeSovXG5yZXR1cm4gZmFsc2U7XG4gfVxuIH1cbnJldHVybiB0cnVlO1xuIH07XG5cbi8qIFdlIHNob3VsZCBiZSBhYmxlIHRvIHVzZSB0aGlzIGZvciBpdGVySXNEaXNqb2ludCBhcyB3ZWxsLiovXG4vKiBUaGUgY29kZSBpcyBpZGVudGljYWwuKi9cbmNvbnN0IGJhZ0l0ZXJJc0Rpc2pvaW50PSh4eWkpPT57XG5mb3IoY29uc3RbX20seGMseWNdb2YgeHlpKXtcbmlmKHhjPj0xbiYmeWM+PTFuKXtcbi8qIFNvbWV0aGluZyBpbiBib3RoLCBzbyBub3QgZGlzam9pbnQqL1xucmV0dXJuIGZhbHNlO1xuIH1cbiB9XG5yZXR1cm4gdHJ1ZTtcbiB9O1xuXG4vKiBXZSBzaG91bGQgYmUgYWJsZSB0byB1c2UgdGhpcyBmb3IgaXRlckNvbXBhcmUgYXMgd2VsbC4qL1xuLyogVGhlIGdlbmVyYWxpemF0aW9uIGlzIGZyZWUuKi9cbmNvbnN0IGJhZ0l0ZXJDb21wYXJlPSh4eWkpPT57XG5sZXQgbG9uZVk9ZmFsc2U7XG5sZXQgbG9uZVg9ZmFsc2U7XG5mb3IoY29uc3RbX20seGMseWNdb2YgeHlpKXtcbmlmKHhjPHljKXtcbi8qIHNvbWV0aGluZyBpbiB5IGlzIG5vdCBpbiB4LCBzbyB4IGlzIG5vdCBhIHN1cGVyYmFnIG9mIHkqL1xubG9uZVk9dHJ1ZTtcbiB9XG5pZih4Yz55Yyl7XG4vKiBzb21ldGhpbmcgaW4geCBpcyBub3QgaW4geSwgc28geSBpcyBub3QgYSBzdXBlcmJhZyBvZiB4Ki9cbmxvbmVYPXRydWU7XG4gfVxuaWYobG9uZVgmJmxvbmVZKXtcbnJldHVybiBOYU47XG4gfVxuIH1cbmlmKGxvbmVYKXtcbnJldHVybiAxO1xuIH1lbHNlIGlmKGxvbmVZKXtcbnJldHVybi0xO1xuIH1lbHNle1xuIWxvbmVYJiYhbG9uZVl8fFxuRmFpbCBgSW50ZXJuYWw6IFVuZXhwZWN0ZWQgbG9uZSBwYWlyICR7cShbbG9uZVgsbG9uZVldKX1gO1xucmV0dXJuIDA7XG4gfVxuIH07XG5cbmNvbnN0IGJhZ0l0ZXJVbmlvbj0oeHlpKT0+e1xuY29uc3QgcmVzdWx0PVtdO1xuZm9yKGNvbnN0W20seGMseWNdb2YgeHlpKXtcbnJlc3VsdC5wdXNoKFttLHhjK3ljXSk7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG5jb25zdCBiYWdJdGVySW50ZXJzZWN0aW9uPSh4eWkpPT57XG5jb25zdCByZXN1bHQ9W107XG5mb3IoY29uc3RbbSx4Yyx5Y11vZiB4eWkpe1xuY29uc3QgbWM9eGM8PXljP3hjOnljO1xucmVzdWx0LnB1c2goW20sbWNdKTtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbmNvbnN0IGJhZ0l0ZXJEaXNqb2ludFN1YnRyYWN0PSh4eWkpPT57XG5jb25zdCByZXN1bHQ9W107XG5mb3IoY29uc3RbbSx4Yyx5Y11vZiB4eWkpe1xuY29uc3QgbWM9eGMteWM7XG5tYz49MG58fEZhaWwgYHJpZ2h0IGVsZW1lbnQgJHttfSB3YXMgbm90IGluIGxlZnRgO1xuaWYobWM+PTFuKXtcbi8qIHRoZSB4IHdhcyBub3QgaW4geSovXG5yZXN1bHQucHVzaChbbSxtY10pO1xuIH1cbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbmNvbnN0IG1lcmdlaWZ5PShiYWdJdGVyT3ApPT4oeGJhZ0VudHJpZXMseWJhZ0VudHJpZXMpPT5cbmJhZ0l0ZXJPcChtZXJnZSh4YmFnRW50cmllcyx5YmFnRW50cmllcykpO1xuXG5jb25zdCBiYWdFbnRyaWVzSXNTdXBlcmJhZz1tZXJnZWlmeShiYWdJdGVySXNTdXBlcmJhZyk7XG5jb25zdCBiYWdFbnRyaWVzSXNEaXNqb2ludD1tZXJnZWlmeShiYWdJdGVySXNEaXNqb2ludCk7XG5jb25zdCBiYWdFbnRyaWVzQ29tcGFyZT1tZXJnZWlmeShiYWdJdGVyQ29tcGFyZSk7XG5jb25zdCBiYWdFbnRyaWVzVW5pb249bWVyZ2VpZnkoYmFnSXRlclVuaW9uKTtcbmNvbnN0IGJhZ0VudHJpZXNJbnRlcnNlY3Rpb249bWVyZ2VpZnkoYmFnSXRlckludGVyc2VjdGlvbik7XG5jb25zdCBiYWdFbnRyaWVzRGlzam9pbnRTdWJ0cmFjdD1tZXJnZWlmeShiYWdJdGVyRGlzam9pbnRTdWJ0cmFjdCk7XG5cbmNvbnN0IHJhd0JhZ2lmeT0oYmFnRW50cmllc09wKT0+KHhiYWcseWJhZyk9PlxuYmFnRW50cmllc09wKHhiYWcucGF5bG9hZCx5YmFnLnBheWxvYWQpO1xuXG5jb25zdCBiYWdpZnk9KGJhZ0VudHJpZXNPcCk9Pih4YmFnLHliYWcpPT5cbm1ha2VCYWdPZkVudHJpZXMoYmFnRW50cmllc09wKHhiYWcucGF5bG9hZCx5YmFnLnBheWxvYWQpKTtcblxuY29uc3QgICAgICAgIGJhZ0lzU3VwZXJiYWc9cmF3QmFnaWZ5KGJhZ0VudHJpZXNJc1N1cGVyYmFnKTskaOKAjV9vbmNlLmJhZ0lzU3VwZXJiYWcoYmFnSXNTdXBlcmJhZyk7XG5jb25zdCAgICAgICAgYmFnSXNEaXNqb2ludD1yYXdCYWdpZnkoYmFnRW50cmllc0lzRGlzam9pbnQpOyRo4oCNX29uY2UuYmFnSXNEaXNqb2ludChiYWdJc0Rpc2pvaW50KTtcbmNvbnN0ICAgICAgICBiYWdDb21wYXJlPXJhd0JhZ2lmeShiYWdFbnRyaWVzQ29tcGFyZSk7JGjigI1fb25jZS5iYWdDb21wYXJlKGJhZ0NvbXBhcmUpO1xuY29uc3QgICAgICAgIGJhZ1VuaW9uPWJhZ2lmeShiYWdFbnRyaWVzVW5pb24pOyRo4oCNX29uY2UuYmFnVW5pb24oYmFnVW5pb24pO1xuY29uc3QgICAgICAgIGJhZ0ludGVyc2VjdGlvbj1iYWdpZnkoYmFnRW50cmllc0ludGVyc2VjdGlvbik7JGjigI1fb25jZS5iYWdJbnRlcnNlY3Rpb24oYmFnSW50ZXJzZWN0aW9uKTtcbmNvbnN0ICAgICAgICBiYWdEaXNqb2ludFN1YnRyYWN0PWJhZ2lmeShiYWdFbnRyaWVzRGlzam9pbnRTdWJ0cmFjdCk7JGjigI1fb25jZS5iYWdEaXNqb2ludFN1YnRyYWN0KGJhZ0Rpc2pvaW50U3VidHJhY3QpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImJhZ0lzU3VwZXJiYWciOlsiYmFnSXNTdXBlcmJhZyJdLCJiYWdJc0Rpc2pvaW50IjpbImJhZ0lzRGlzam9pbnQiXSwiYmFnQ29tcGFyZSI6WyJiYWdDb21wYXJlIl0sImJhZ1VuaW9uIjpbImJhZ1VuaW9uIl0sImJhZ0ludGVyc2VjdGlvbiI6WyJiYWdJbnRlcnNlY3Rpb24iXSwiYmFnRGlzam9pbnRTdWJ0cmFjdCI6WyJiYWdEaXNqb2ludFN1YnRyYWN0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJTK3autJQAArSUAADQAAABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMva2V5cy9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzeyJpbXBvcnRzIjpbIi4uL3BhdHRlcm5zL3JhbmtPcmRlci5qcyIsIi4vY29weVNldC5qcyJdLCJleHBvcnRzIjpbImVsZW1lbnRzQ29tcGFyZSIsImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCIsImVsZW1lbnRzRGlzam9pbnRVbmlvbiIsImVsZW1lbnRzSW50ZXJzZWN0aW9uIiwiZWxlbWVudHNJc0Rpc2pvaW50IiwiZWxlbWVudHNJc1N1cGVyc2V0IiwiZWxlbWVudHNVbmlvbiIsInNldENvbXBhcmUiLCJzZXREaXNqb2ludFN1YnRyYWN0Iiwic2V0RGlzam9pbnRVbmlvbiIsInNldEludGVyc2VjdGlvbiIsInNldElzRGlzam9pbnQiLCJzZXRJc1N1cGVyc2V0Iiwic2V0VW5pb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0UmFua1NvcnRlZCxjb21wYXJlQW50aVJhbmssbWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQsc29ydEJ5UmFuayxhc3NlcnROb0R1cGxpY2F0ZXMsbWFrZVNldE9mRWxlbWVudHM7JGjigI1faW1wb3J0cyhbW1wiLi4vcGF0dGVybnMvcmFua09yZGVyLmpzXCIsIFtbXCJhc3NlcnRSYW5rU29ydGVkXCIsIFskaOKAjV9hID0+IChhc3NlcnRSYW5rU29ydGVkID0gJGjigI1fYSldXSxbXCJjb21wYXJlQW50aVJhbmtcIiwgWyRo4oCNX2EgPT4gKGNvbXBhcmVBbnRpUmFuayA9ICRo4oCNX2EpXV0sW1wibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0ID0gJGjigI1fYSldXSxbXCJzb3J0QnlSYW5rXCIsIFskaOKAjV9hID0+IChzb3J0QnlSYW5rID0gJGjigI1fYSldXV1dLFtcIi4vY29weVNldC5qc1wiLCBbW1wiYXNzZXJ0Tm9EdXBsaWNhdGVzXCIsIFskaOKAjV9hID0+IChhc3NlcnROb0R1cGxpY2F0ZXMgPSAkaOKAjV9hKV1dLFtcIm1ha2VTZXRPZkVsZW1lbnRzXCIsIFskaOKAjV9hID0+IChtYWtlU2V0T2ZFbGVtZW50cyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5jb25zdHtxdW90ZTpxLEZhaWx9PWFzc2VydDtcblxuLyoqXG4gKiBBc3NlcnRzIHRoYXQgYGVsZW1lbnRzYCBpcyBhbHJlYWR5IHJhbmsgc29ydGVkIGJ5IGByYW5rQ29tcGFyZWAsIHdoZXJlIHRoZXJlXG4gKiBtYXkgYmUgY29udGlndW91cyByZWdpb25zIG9mIGVsZW1lbnRzIHRpZWQgZm9yIHRoZSBzYW1lIHJhbmsuXG4gKiBSZXR1cm5zIGFuIGl0ZXJhYmxlIHRoYXQgd2lsbCBlbnVtZXJhdGUgYWxsIHRoZSBlbGVtZW50cyBpbiBvcmRlclxuICogYWNjb3JkaW5nIHRvIGBmdWxsT3JkZXJgLCB3aGljaCBzaG91bGQgZGlmZmVyIGZyb20gYHJhbmtPcmRlcmAgb25seVxuICogYnkgYmVpbmcgbW9yZSBwcmVjaXNlLlxuICpcbiAqIFRoaXMgc2hvdWxkIGJlIGVxdWl2YWxlbnQgdG8gcmVzb3J0aW5nIHRoZSBlbnRpcmUgYGVsZW1lbnRzYCBhcnJheSBhY2NvcmRpbmdcbiAqICB0byBgZnVsbE9yZGVyYC4gSG93ZXZlciwgaXQgb3B0aW1pemVzIGZvciB0aGUgY2FzZSB3aGVyZSB0aGVzZSBjb250aWd1b3VzXG4gKiBydW5zIHRoYXQgbmVlZCB0byBiZSByZXNvcnRlZCBhcmUgZWl0aGVyIGFic2VudCBvciBzbWFsbC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUW119IGVsZW1lbnRzXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSByYW5rQ29tcGFyZVxuICogQHBhcmFtIHtGdWxsQ29tcGFyZX0gZnVsbENvbXBhcmVcbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxUPn1cbiAqL1xuY29uc3Qgd2luZG93UmVzb3J0PShlbGVtZW50cyxyYW5rQ29tcGFyZSxmdWxsQ29tcGFyZSk9PntcbmFzc2VydFJhbmtTb3J0ZWQoZWxlbWVudHMscmFua0NvbXBhcmUpO1xuY29uc3R7bGVuZ3RofT1lbGVtZW50cztcbmxldCBpPTA7XG5sZXQgb3B0SW5uZXJJdGVyYXRvcjtcbnJldHVybiBoYXJkZW4oe1xuW1N5bWJvbC5pdGVyYXRvcl06KCk9PlxuaGFyZGVuKHtcbm5leHQ6KCk9PntcbmlmKG9wdElubmVySXRlcmF0b3Ipe1xuY29uc3QgcmVzdWx0PW9wdElubmVySXRlcmF0b3IubmV4dCgpO1xuaWYocmVzdWx0LmRvbmUpe1xub3B0SW5uZXJJdGVyYXRvcj11bmRlZmluZWQ7XG4vKiBmYWxsIHRocm91Z2gqL1xuIH1lbHNle1xucmV0dXJuIHJlc3VsdDtcbiB9XG4gfVxuaWYoaTxsZW5ndGgpe1xuY29uc3QgdmFsdWU9ZWxlbWVudHNbaV07XG5sZXQgaj1pKzE7XG53aGlsZShqPGxlbmd0aCYmcmFua0NvbXBhcmUodmFsdWUsZWxlbWVudHNbal0pPT09MCl7XG5qKz0xO1xuIH1cbmlmKGo9PT1pKzEpe1xuaT1qO1xucmV0dXJuIGhhcmRlbih7ZG9uZTpmYWxzZSx2YWx1ZX0pO1xuIH1cbmNvbnN0IHNpbWlsYXJSdW49ZWxlbWVudHMuc2xpY2UoaSxqKTtcbmk9ajtcbmNvbnN0IHJlc29ydGVkPXNvcnRCeVJhbmsoc2ltaWxhclJ1bixmdWxsQ29tcGFyZSk7XG4vKiBQcm92aWRpbmcgdGhlIHNhbWUgYGZ1bGxDb21wYXJlYCBzaG91bGQgY2F1c2UgYSBtZW1vIGhpdCovXG4vKiB3aXRoaW4gYGFzc2VydE5vRHVwbGljYXRlc2AgZW5hYmxpbmcgaXQgdG8gYXZvaWQgYSovXG4vKiByZWR1bmRhbnQgcmVzb3J0aW5nLiovXG5hc3NlcnROb0R1cGxpY2F0ZXMocmVzb3J0ZWQsZnVsbENvbXBhcmUpO1xuLyogVGhpcyBpcyB0aGUgcmF3IEpTIGFycmF5IGl0ZXJhdG9yIHdob3NlIGAubmV4dCgpYCBtZXRob2QqL1xuLyogZG9lcyBub3QgaGFyZGVuIHRoZSBJdGVyYXRvclJlc3VsdCwgaW4gdmlvbGF0aW9uIG9mIG91ciovXG4vKiBjb252ZW50aW9ucy4gRml4aW5nIHRoaXMgaXMgZXhwZW5zaXZlIGFuZCBJJ20gY29uZmlkZW50IHRoZSovXG4vKiB1bmZyb3plbiB2YWx1ZSBkb2VzIG5vdCBlc2NhcGUgdGhpcyBmaWxlLCBzbyBJJ20gbGVhdmluZyB0aGlzKi9cbi8qIGFzIGlzLiovXG5vcHRJbm5lckl0ZXJhdG9yPXJlc29ydGVkW1N5bWJvbC5pdGVyYXRvcl0oKTtcbnJldHVybiBvcHRJbm5lckl0ZXJhdG9yLm5leHQoKTtcbiB9ZWxzZXtcbnJldHVybiBoYXJkZW4oe2RvbmU6dHJ1ZSx2YWx1ZTpudWxsfSk7XG4gfVxuIH19KX0pO1xuXG5cbiB9O1xuXG4vKipcbiAqIFJldHVybnMgYW4gaXRlcmFibGUgd2hvc2UgaXRlcmF0aW9uIHJlc3VsdHMgYXJlIFtrZXksIHhDb3VudCwgeUNvdW50XSB0dXBsZXNcbiAqIHJlcHJlc2VudGluZyB0aGUgbmV4dCBrZXkgaW4gdGhlIGxvY2FsIGZ1bGwgb3JkZXIsIGFzIHdlbGwgYXMgaG93IG1hbnlcbiAqIHRpbWVzIGl0IG9jY3VycmVkIGluIHRoZSB4IGlucHV0IGl0ZXJhdG9yIGFuZCB0aGUgeSBpbnB1dCBpdGVyYXRvci5cbiAqXG4gKiBGb3Igc2V0cywgdGhlc2UgY291bnRzIGFyZSBhbHdheXMgMCBvciAxLCBidXQgdGhpcyByZXByZXNlbnRhdGlvblxuICogZ2VuZXJhbGl6ZXMgbmljZWx5IGZvciBiYWdzLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1RbXX0geGVsZW1lbnRzXG4gKiBAcGFyYW0ge1RbXX0geWVsZW1lbnRzXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8W1QsYmlnaW50LGJpZ2ludF0+fVxuICovXG5jb25zdCBtZXJnZT0oeGVsZW1lbnRzLHllbGVtZW50cyk9Pntcbi8qIFRoaXMgZnVsbE9yZGVyIGNvbnRhaW5zIGhpc3RvcnkgZGVwZW5kZW50IHN0YXRlLiBJdCBpcyBzcGVjaWZpYyovXG4vKiB0byB0aGlzIG9uZSBgbWVyZ2VgIGNhbGwgYW5kIGRvZXMgbm90IHN1cnZpdmUgaXQuKi9cbmNvbnN0IGZ1bGxDb21wYXJlPW1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KCkuYW50aUNvbXBhcmF0b3I7XG5cbmNvbnN0IHhzPXdpbmRvd1Jlc29ydCh4ZWxlbWVudHMsY29tcGFyZUFudGlSYW5rLGZ1bGxDb21wYXJlKTtcbmNvbnN0IHlzPXdpbmRvd1Jlc29ydCh5ZWxlbWVudHMsY29tcGFyZUFudGlSYW5rLGZ1bGxDb21wYXJlKTtcbnJldHVybiBoYXJkZW4oe1xuW1N5bWJvbC5pdGVyYXRvcl06KCk9Pntcbi8qIFRoZXNlIGZvdXIgYGxldGAgdmFyaWFibGVzIGFyZSBidWZmZXJpbmcgb25lIGFoZWFkIGZyb20gdGhlIHVuZGVybHlpbmcqL1xuLyogaXRlcmF0b3JzLiBFYWNoIGl0ZXJhdGlvbiByZXBvcnRzIG9uZSBvciB0aGUgb3RoZXIgb3IgYm90aCwgYW5kKi9cbi8qIHRoZW4gcmVmaWxscyB0aGUgYnVmZmVycyBvZiB0aG9zZSBpdCBhZHZhbmNlZC4qL1xuLyoqIEB0eXBlIHtUfSAqL1xubGV0IHg7XG5sZXQgeERvbmU7XG4vKiogQHR5cGUge1R9ICovXG5sZXQgeTtcbmxldCB5RG9uZTtcblxuY29uc3QgeGk9eHNbU3ltYm9sLml0ZXJhdG9yXSgpO1xuY29uc3QgbmV4dFg9KCk9PntcbiF4RG9uZXx8RmFpbCBgSW50ZXJuYWw6IG5leHRYIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uY2UgZG9uZWA7XG4oe2RvbmU6eERvbmUsdmFsdWU6eH09eGkubmV4dCgpKTtcbiB9O1xubmV4dFgoKTtcblxuY29uc3QgeWk9eXNbU3ltYm9sLml0ZXJhdG9yXSgpO1xuY29uc3QgbmV4dFk9KCk9PntcbiF5RG9uZXx8RmFpbCBgSW50ZXJuYWw6IG5leHRZIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uY2UgZG9uZWA7XG4oe2RvbmU6eURvbmUsdmFsdWU6eX09eWkubmV4dCgpKTtcbiB9O1xubmV4dFkoKTtcblxucmV0dXJuIGhhcmRlbih7XG5uZXh0OigpPT57XG4vKiogQHR5cGUge2Jvb2xlYW59ICovXG5sZXQgZG9uZT1mYWxzZTtcbi8qKiBAdHlwZSB7W1QsYmlnaW50LGJpZ2ludF19ICovXG5sZXQgdmFsdWU7XG5pZih4RG9uZSYmeURvbmUpe1xuZG9uZT10cnVlO1xuLyogQHRzLWV4cGVjdC1lcnJvciBCZWNhdXNlIHRoZSB0ZXJtaW5hdGluZyB2YWx1ZSBkb2VzIG5vdCBtYXR0ZXIqL1xudmFsdWU9W251bGwsMG4sMG5dO1xuIH1lbHNlIGlmKHhEb25lKXtcbi8qIG9ubHkgeXMgYXJlIGxlZnQqL1xudmFsdWU9W3ksMG4sMW5dO1xubmV4dFkoKTtcbiB9ZWxzZSBpZih5RG9uZSl7XG4vKiBvbmx5IHhzIGFyZSBsZWZ0Ki9cbnZhbHVlPVt4LDFuLDBuXTtcbm5leHRYKCk7XG4gfWVsc2V7XG5jb25zdCBjb21wPWZ1bGxDb21wYXJlKHgseSk7XG5pZihjb21wPT09MCl7XG4vKiB4IGFuZCB5IGFyZSBlcXVpdmFsZW50LCBzbyByZXBvcnQgYm90aCovXG52YWx1ZT1beCwxbiwxbl07XG5uZXh0WCgpO1xubmV4dFkoKTtcbiB9ZWxzZSBpZihjb21wPDApe1xuLyogeCBpcyBlYXJsaWVyLCBzbyByZXBvcnQgaXQqL1xudmFsdWU9W3gsMW4sMG5dO1xubmV4dFgoKTtcbiB9ZWxzZXtcbi8qIHkgaXMgZWFybGllciwgc28gcmVwb3J0IGl0Ki9cbmNvbXA+MHx8RmFpbCBgSW50ZXJuYWw6IFVuZXhwZWN0ZWQgY29tcCAke3EoY29tcCl9YDtcbnZhbHVlPVt5LDBuLDFuXTtcbm5leHRZKCk7XG4gfVxuIH1cbnJldHVybiBoYXJkZW4oe2RvbmUsdmFsdWV9KTtcbiB9fSk7XG5cbiB9fSk7XG5cbiB9O1xuaGFyZGVuKG1lcmdlKTtcblxuY29uc3QgaXRlcklzU3VwZXJzZXQ9KHh5aSk9PntcbmZvcihjb25zdFtfbSx4YyxfeWNdb2YgeHlpKXtcbmlmKHhjPT09MG4pe1xuLyogc29tZXRoaW5nIGluIHkgaXMgbm90IGluIHgsIHNvIHggaXMgbm90IGEgc3VwZXJzZXQgb2YgeSovXG5yZXR1cm4gZmFsc2U7XG4gfVxuIH1cbnJldHVybiB0cnVlO1xuIH07XG5cbmNvbnN0IGl0ZXJJc0Rpc2pvaW50PSh4eWkpPT57XG5mb3IoY29uc3RbX20seGMseWNdb2YgeHlpKXtcbmlmKHhjPj0xbiYmeWM+PTFuKXtcbi8qIFNvbWV0aGluZyBpbiBib3RoLCBzbyBub3QgZGlzam9pbnQqL1xucmV0dXJuIGZhbHNlO1xuIH1cbiB9XG5yZXR1cm4gdHJ1ZTtcbiB9O1xuXG5jb25zdCBpdGVyQ29tcGFyZT0oeHlpKT0+e1xubGV0IGxvbmVZPWZhbHNlO1xubGV0IGxvbmVYPWZhbHNlO1xuZm9yKGNvbnN0W19tLHhjLHljXW9mIHh5aSl7XG5pZih4Yz09PTBuKXtcbi8qIHNvbWV0aGluZyBpbiB5IGlzIG5vdCBpbiB4LCBzbyB4IGlzIG5vdCBhIHN1cGVyc2V0IG9mIHkqL1xubG9uZVk9dHJ1ZTtcbiB9XG5pZih5Yz09PTBuKXtcbi8qIHNvbWV0aGluZyBpbiB4IGlzIG5vdCBpbiB5LCBzbyB5IGlzIG5vdCBhIHN1cGVyc2V0IG9mIHgqL1xubG9uZVg9dHJ1ZTtcbiB9XG5pZihsb25lWCYmbG9uZVkpe1xucmV0dXJuIE5hTjtcbiB9XG4gfVxuaWYobG9uZVgpe1xucmV0dXJuIDE7XG4gfWVsc2UgaWYobG9uZVkpe1xucmV0dXJuLTE7XG4gfWVsc2V7XG4hbG9uZVgmJiFsb25lWXx8XG5GYWlsIGBJbnRlcm5hbDogVW5leHBlY3RlZCBsb25lIHBhaXIgJHtxKFtsb25lWCxsb25lWV0pfWA7XG5yZXR1cm4gMDtcbiB9XG4gfTtcblxuY29uc3QgaXRlclVuaW9uPSh4eWkpPT57XG5jb25zdCByZXN1bHQ9W107XG5mb3IoY29uc3RbbSx4Yyx5Y11vZiB4eWkpe1xuaWYoeGM+PTBuKXtcbnJlc3VsdC5wdXNoKG0pO1xuIH1lbHNle1xueWM+PTBufHxGYWlsIGBJbnRlcm5hbDogVW5leHBlY3RlZCBjb3VudCAke3EoeWMpfWA7XG4vKiBpZiB4IGFuZCB5IHdlcmUgYm90aCByZWFkeSwgdGhlbiB0aGV5IHdlcmUgZXF1aXZhbGVudCBhbmQqL1xuLyogYWJvdmUgY2xhdXNlIGFscmVhZHkgdG9vayBjYXJlIG9mIGl0LiBPdGhlcndpc2UgcHVzaCBoZXJlLiovXG5yZXN1bHQucHVzaChtKTtcbiB9XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG5jb25zdCBpdGVyRGlzam9pbnRVbmlvbj0oeHlpKT0+e1xuY29uc3QgcmVzdWx0PVtdO1xuZm9yKGNvbnN0W20seGMseWNdb2YgeHlpKXtcbnhjPT09MG58fHljPT09MG58fEZhaWwgYFNldHMgbXVzdCBub3QgaGF2ZSBjb21tb24gZWxlbWVudHM6ICR7bX1gO1xuaWYoeGM+PTFuKXtcbnJlc3VsdC5wdXNoKG0pO1xuIH1lbHNle1xueWM+PTFufHxGYWlsIGBJbnRlcm5hbDogVW5leHBlY3RlZCBjb3VudCAke3EoeWMpfWA7XG5yZXN1bHQucHVzaChtKTtcbiB9XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG5jb25zdCBpdGVySW50ZXJzZWN0aW9uPSh4eWkpPT57XG5jb25zdCByZXN1bHQ9W107XG5mb3IoY29uc3RbbSx4Yyx5Y11vZiB4eWkpe1xuaWYoeGM+PTFuJiZ5Yz49MW4pe1xuLyogSWYgdGhleSBhcmUgYm90aCBwcmVzZW50LCB0aGVuIHRoZXkgd2VyZSBlcXVpdmFsZW50Ki9cbnJlc3VsdC5wdXNoKG0pO1xuIH1cbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbmNvbnN0IGl0ZXJEaXNqb2ludFN1YnRyYWN0PSh4eWkpPT57XG5jb25zdCByZXN1bHQ9W107XG5mb3IoY29uc3RbbSx4Yyx5Y11vZiB4eWkpe1xueGM+PTFufHxGYWlsIGByaWdodCBlbGVtZW50ICR7bX0gd2FzIG5vdCBpbiBsZWZ0YDtcbmlmKHljPT09MG4pe1xuLyogdGhlIHggd2FzIG5vdCBpbiB5Ki9cbnJlc3VsdC5wdXNoKG0pO1xuIH1cbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbmNvbnN0IG1lcmdlaWZ5PShpdGVyT3ApPT4oeGVsZW1lbnRzLHllbGVtZW50cyk9PlxuaXRlck9wKG1lcmdlKHhlbGVtZW50cyx5ZWxlbWVudHMpKTtcblxuY29uc3QgICAgICAgIGVsZW1lbnRzSXNTdXBlcnNldD1tZXJnZWlmeShpdGVySXNTdXBlcnNldCk7JGjigI1fb25jZS5lbGVtZW50c0lzU3VwZXJzZXQoZWxlbWVudHNJc1N1cGVyc2V0KTtcbmNvbnN0ICAgICAgICBlbGVtZW50c0lzRGlzam9pbnQ9bWVyZ2VpZnkoaXRlcklzRGlzam9pbnQpOyRo4oCNX29uY2UuZWxlbWVudHNJc0Rpc2pvaW50KGVsZW1lbnRzSXNEaXNqb2ludCk7XG5jb25zdCAgICAgICAgZWxlbWVudHNDb21wYXJlPW1lcmdlaWZ5KGl0ZXJDb21wYXJlKTskaOKAjV9vbmNlLmVsZW1lbnRzQ29tcGFyZShlbGVtZW50c0NvbXBhcmUpO1xuY29uc3QgICAgICAgIGVsZW1lbnRzVW5pb249bWVyZ2VpZnkoaXRlclVuaW9uKTskaOKAjV9vbmNlLmVsZW1lbnRzVW5pb24oZWxlbWVudHNVbmlvbik7XG5jb25zdCAgICAgICAgZWxlbWVudHNEaXNqb2ludFVuaW9uPW1lcmdlaWZ5KGl0ZXJEaXNqb2ludFVuaW9uKTskaOKAjV9vbmNlLmVsZW1lbnRzRGlzam9pbnRVbmlvbihlbGVtZW50c0Rpc2pvaW50VW5pb24pO1xuY29uc3QgICAgICAgIGVsZW1lbnRzSW50ZXJzZWN0aW9uPW1lcmdlaWZ5KGl0ZXJJbnRlcnNlY3Rpb24pOyRo4oCNX29uY2UuZWxlbWVudHNJbnRlcnNlY3Rpb24oZWxlbWVudHNJbnRlcnNlY3Rpb24pO1xuY29uc3QgICAgICAgIGVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdD1tZXJnZWlmeShpdGVyRGlzam9pbnRTdWJ0cmFjdCk7JGjigI1fb25jZS5lbGVtZW50c0Rpc2pvaW50U3VidHJhY3QoZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0KTtcblxuY29uc3QgcmF3U2V0aWZ5PShlbGVtZW50c09wKT0+KHhzZXQseXNldCk9PlxuZWxlbWVudHNPcCh4c2V0LnBheWxvYWQseXNldC5wYXlsb2FkKTtcblxuY29uc3Qgc2V0aWZ5PShlbGVtZW50c09wKT0+KHhzZXQseXNldCk9PlxubWFrZVNldE9mRWxlbWVudHMoZWxlbWVudHNPcCh4c2V0LnBheWxvYWQseXNldC5wYXlsb2FkKSk7XG5cbmNvbnN0ICAgICAgICBzZXRJc1N1cGVyc2V0PXJhd1NldGlmeShlbGVtZW50c0lzU3VwZXJzZXQpOyRo4oCNX29uY2Uuc2V0SXNTdXBlcnNldChzZXRJc1N1cGVyc2V0KTtcbmNvbnN0ICAgICAgICBzZXRJc0Rpc2pvaW50PXJhd1NldGlmeShlbGVtZW50c0lzRGlzam9pbnQpOyRo4oCNX29uY2Uuc2V0SXNEaXNqb2ludChzZXRJc0Rpc2pvaW50KTtcbmNvbnN0ICAgICAgICBzZXRDb21wYXJlPXJhd1NldGlmeShlbGVtZW50c0NvbXBhcmUpOyRo4oCNX29uY2Uuc2V0Q29tcGFyZShzZXRDb21wYXJlKTtcbmNvbnN0ICAgICAgICBzZXRVbmlvbj1zZXRpZnkoZWxlbWVudHNVbmlvbik7JGjigI1fb25jZS5zZXRVbmlvbihzZXRVbmlvbik7XG5jb25zdCAgICAgICAgc2V0RGlzam9pbnRVbmlvbj1zZXRpZnkoZWxlbWVudHNEaXNqb2ludFVuaW9uKTskaOKAjV9vbmNlLnNldERpc2pvaW50VW5pb24oc2V0RGlzam9pbnRVbmlvbik7XG5jb25zdCAgICAgICAgc2V0SW50ZXJzZWN0aW9uPXNldGlmeShlbGVtZW50c0ludGVyc2VjdGlvbik7JGjigI1fb25jZS5zZXRJbnRlcnNlY3Rpb24oc2V0SW50ZXJzZWN0aW9uKTtcbmNvbnN0ICAgICAgICBzZXREaXNqb2ludFN1YnRyYWN0PXNldGlmeShlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QpOyRo4oCNX29uY2Uuc2V0RGlzam9pbnRTdWJ0cmFjdChzZXREaXNqb2ludFN1YnRyYWN0KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJlbGVtZW50c0lzU3VwZXJzZXQiOlsiZWxlbWVudHNJc1N1cGVyc2V0Il0sImVsZW1lbnRzSXNEaXNqb2ludCI6WyJlbGVtZW50c0lzRGlzam9pbnQiXSwiZWxlbWVudHNDb21wYXJlIjpbImVsZW1lbnRzQ29tcGFyZSJdLCJlbGVtZW50c1VuaW9uIjpbImVsZW1lbnRzVW5pb24iXSwiZWxlbWVudHNEaXNqb2ludFVuaW9uIjpbImVsZW1lbnRzRGlzam9pbnRVbmlvbiJdLCJlbGVtZW50c0ludGVyc2VjdGlvbiI6WyJlbGVtZW50c0ludGVyc2VjdGlvbiJdLCJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QiOlsiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0Il0sInNldElzU3VwZXJzZXQiOlsic2V0SXNTdXBlcnNldCJdLCJzZXRJc0Rpc2pvaW50IjpbInNldElzRGlzam9pbnQiXSwic2V0Q29tcGFyZSI6WyJzZXRDb21wYXJlIl0sInNldFVuaW9uIjpbInNldFVuaW9uIl0sInNldERpc2pvaW50VW5pb24iOlsic2V0RGlzam9pbnRVbmlvbiJdLCJzZXRJbnRlcnNlY3Rpb24iOlsic2V0SW50ZXJzZWN0aW9uIl0sInNldERpc2pvaW50U3VidHJhY3QiOlsic2V0RGlzam9pbnRTdWJ0cmFjdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADCCfN5CQsAAAkLAAAsAAAAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL2xlZ2FjeS9sZWdhY3lNYXAuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9hc3NlcnQiXSwiZXhwb3J0cyI6WyJtYWtlTGVnYWN5TWFwIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IHEsRmFpbDskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2Fzc2VydFwiLCBbW1wicVwiLCBbJGjigI1fYSA9PiAocSA9ICRo4oCNX2EpXV0sW1wiRmFpbFwiLCBbJGjigI1fYSA9PiAoRmFpbCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG4vKipcbiAqIFRoaXMgbW9kdWxlIGFuZCBpdHMgZnJhdGVybmFsIHNpYmxpbmcgbGVnYWN5V2Vha01hcCBleGlzdCBvbmx5IHRvXG4gKiBlYXNlIGEgdHJhbnNpdGlvbiB0byB0aGUgbW9kZXJuIGBzdG9yZWAgc3lzdGVtLCBhcmUgZGVwcmVjYXRlZCxcbiAqIGFuZCB3aWxsIGV2ZW50dWFsbHkgZGlzYXBwZWFyLiBUaGV5IGFyZSBuZWVkZWQgZm9yIG5vdyB0byBzdXBwb3J0XG4gKiBzb21lIG9mIHRoZSB1c2VzIG9mIHRoZSBvbGQgYmVoYXZpb3IgdGhhdCBhcmUgbm90IGNvbXBhdGlibGUgd2l0aFxuICogdGhlIG5ldy4gVGhlIGNvbnN0cmFpbnQgaW1wb3NlZCBieSB0aGUgbmV3IGlzIHRoYXQgb25seSBwYXNzYWJsZXMgY2FuXG4gKiBiZSB1c2VkIGFzIHZhbHVlcywgYW5kIG9ubHkga2V5cyAocm91Z2hseSwgc3RydWN0dXJlcywgYWthIGNvbXBhcmFibGVzKVxuICogY2FuIGJlIHVzZWQgYXMgdmFsdWVzLlxuICpcbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvcHVsbC8zNTY3XG4gKiBUT0RPIE9uY2UgdGhhdCBQUiBpcyBtZXJnZWQsIGxpbmsgdG8gdGhlIGRvY3VtZW50cyByYXRoZXIgdGhhbiB0aGUgUFJzLlxuICpcbiAqIEVhY2ggb2YgdGhlc2Ugbm9uLWNvbmZvcm1pbmcgdXNlcyBzaG91bGQgYmUgbWFya2VkIHdpdGggYVxuICogYGBganNcbiAqIC8vIExlZ2FjeSBiZWNhdXNlLi4uXG4gKiBgYGBcbiAqIGNvbW1lbnQgZXhwbGFpbmluZyB0aGUgcHJvYmxlbSBpbmhpYml0aW5nIGNvbnZlcnNpb24gdG8gdGhlIG5ld1xuICogc3lzdGVtLiBTb21lIG9mIHRoZXNlIHByb2JsZW1zIGFzIG9mIHRoaXMgd3JpdGluZzpcbiAqICAgICogQSBwcm9taXNlS2l0IHVzZWQgYXMgYSB2YWx1ZSwgZXZlbiB0aG91Z2ggYSBwcm9taXNlS2l0IGlzIG5vdFxuICogICAgICBhIHBhc3NhYmxlLiBTb2x1dGlvbnMgYXJlIHRvIG1ha2UgaXQgYSBwYXNzYWJsZSwgb3IgdG8gY29udmVydFxuICogICAgICB0aGUgY29udGFpbmVyIGJhY2sgdG8gYSBjb252ZW50aW9uYWwgSmF2YVNjcmlwdCBNYXAuXG4gKiAgICAqIEEgbXV0YWJsZSBhcnJheSB1c2VkIGFzIGEgdmFsdWUsIHRoYXQgaXMgc3Vic2VxdWVudGx5IG11dGF0ZWQuXG4gKiAgICAgIEZyZWV6aW5nIHRoZSBhcnJheSB3b3VsZG4ndCB3b3JrIG9mIGNvdXJzZSBiZWNhdXNlIGl0IHdvdWxkIGJyZWFrXG4gKiAgICAgIHRoZSBzdWJzZXF1ZW50IG11dGF0aW9uLiBVc2luZyBhIGZhciBvYmplY3Qgd3JhcHBpbmcgYW4gYXJyYXkgd291bGRcbiAqICAgICAgbGlrZWx5IHdvcmsgZmluZS5cbiAqXG4gKiBAZGVwcmVjYXRlZCBzd2l0Y2ggdG8gU2NhbGFyTWFwIGlmIHBvc3NpYmxlLCBNYXAgb3RoZXJ3aXNlXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAcGFyYW0ge3N0cmluZ30gW3RhZz0na2V5J10gLSB0YWcgZm9yIGRlYnVnZ2luZ1xuICogQHJldHVybnMge0xlZ2FjeU1hcDxLLFY+fVxuICovXG5jb25zdCAgICAgICAgbWFrZUxlZ2FjeU1hcD0odGFnPSdrZXknKT0+e1xuY29uc3QgbT1uZXcgTWFwKCk7XG5jb25zdCBhc3NlcnRLZXlEb2VzTm90RXhpc3Q9KGtleSk9PlxuIW0uaGFzKGtleSl8fEZhaWwgYCR7cSh0YWcpfSBhbHJlYWR5IHJlZ2lzdGVyZWQ6ICR7a2V5fWA7XG5jb25zdCBhc3NlcnRLZXlFeGlzdHM9KGtleSk9PlxubS5oYXMoa2V5KXx8RmFpbCBgJHtxKHRhZyl9IG5vdCBmb3VuZDogJHtrZXl9YDtcbnJldHVybiBoYXJkZW4oe1xuaGFzOihrZXkpPT57XG4vKiBDaGVjayBpZiBhIGtleSBleGlzdHMuIFRoZSBrZXkgY2FuIGJlIGFueSBKYXZhU2NyaXB0IHZhbHVlLCovXG4vKiB0aG91Z2ggdGhlIGFuc3dlciB3aWxsIGFsd2F5cyBiZSBmYWxzZSBmb3Iga2V5cyB0aGF0IGNhbm5vdCBiZSBmb3VuZCovXG4vKiBpbiB0aGlzIG1hcC4qL1xucmV0dXJuIG0uaGFzKGtleSk7XG4gfSxcbmluaXQ6KGtleSx2YWx1ZSk9PntcbmFzc2VydEtleURvZXNOb3RFeGlzdChrZXkpO1xubS5zZXQoa2V5LHZhbHVlKTtcbiB9LFxuZ2V0OihrZXkpPT57XG5hc3NlcnRLZXlFeGlzdHMoa2V5KTtcbnJldHVybiBtLmdldChrZXkpO1xuIH0sXG5zZXQ6KGtleSx2YWx1ZSk9PntcbmFzc2VydEtleUV4aXN0cyhrZXkpO1xubS5zZXQoa2V5LHZhbHVlKTtcbiB9LFxuZGVsZXRlOihrZXkpPT57XG5hc3NlcnRLZXlFeGlzdHMoa2V5KTtcbm0uZGVsZXRlKGtleSk7XG4gfSxcbmtleXM6KCk9Pm0ua2V5cygpLFxudmFsdWVzOigpPT5tLnZhbHVlcygpLFxuZW50cmllczooKT0+bS5lbnRyaWVzKCksXG5nZXRTaXplOigpPT5tLnNpemUsXG5jbGVhcjooKT0+bS5jbGVhcigpfSk7XG5cbiB9OyRo4oCNX29uY2UubWFrZUxlZ2FjeU1hcChtYWtlTGVnYWN5TWFwKTtcbmhhcmRlbihtYWtlTGVnYWN5TWFwKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlTGVnYWN5TWFwIjpbIm1ha2VMZWdhY3lNYXAiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAWsuWBq0GAACtBgAAMAAAAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9sZWdhY3kvbGVnYWN5V2Vha01hcC5qc3siaW1wb3J0cyI6WyIuLi90eXBlcy5qcyIsIkBhZ29yaWMvYXNzZXJ0Il0sImV4cG9ydHMiOlsibWFrZUxlZ2FjeVdlYWtNYXAiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgcSxGYWlsOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvYXNzZXJ0XCIsIFtbXCJxXCIsIFskaOKAjV9hID0+IChxID0gJGjigI1fYSldXSxbXCJGYWlsXCIsIFskaOKAjV9hID0+IChGYWlsID0gJGjigI1fYSldXV1dLFtcIi4uL3R5cGVzLmpzXCIsIFtdXV0pOyAgIFxuXG5cbi8qKlxuICogU2VlIGRvY2NvbW1lbnQgaW4gdGhlIGNsb3NlbHkgcmVsYXRlZCBgbGVnYWN5TWFwLmpzYCBtb2R1bGUuXG4gKlxuICogQGRlcHJlY2F0ZWQgc3dpdGNoIHRvIFNjYWxhcldlYWtNYXAgaWYgcG9zc2libGUsIFdlYWtNYXAgb3RoZXJ3aXNlXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAcGFyYW0ge3N0cmluZ30gW3RhZz0na2V5J10gLSB0YWcgZm9yIGRlYnVnZ2luZ1xuICogQHJldHVybnMge0xlZ2FjeVdlYWtNYXA8SyxWPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VMZWdhY3lXZWFrTWFwPSh0YWc9J2tleScpPT57XG4vKiogQHR5cGUge1dlYWtNYXA8SyAmIG9iamVjdCwgVj59ICovXG5jb25zdCB3bT1uZXcgV2Vha01hcCgpO1xuY29uc3QgYXNzZXJ0S2V5RG9lc05vdEV4aXN0PShrZXkpPT5cbiF3bS5oYXMoa2V5KXx8RmFpbCBgJHtxKHRhZyl9IGFscmVhZHkgcmVnaXN0ZXJlZDogJHtrZXl9YDtcbmNvbnN0IGFzc2VydEtleUV4aXN0cz0oa2V5KT0+XG53bS5oYXMoa2V5KXx8RmFpbCBgJHtxKHRhZyl9IG5vdCBmb3VuZDogJHtrZXl9YDtcbnJldHVybiBoYXJkZW4oe1xuaGFzOihrZXkpPT57XG4vKiBDaGVjayBpZiBhIGtleSBleGlzdHMuIFRoZSBrZXkgY2FuIGJlIGFueSBKYXZhU2NyaXB0IHZhbHVlLCovXG4vKiB0aG91Z2ggdGhlIGFuc3dlciB3aWxsIGFsd2F5cyBiZSBmYWxzZSBmb3Iga2V5cyB0aGF0IGNhbm5vdCBiZSBmb3VuZCovXG4vKiBpbiB0aGlzIG1hcC4qL1xucmV0dXJuIHdtLmhhcyhrZXkpO1xuIH0sXG5pbml0OihrZXksdmFsdWUpPT57XG5hc3NlcnRLZXlEb2VzTm90RXhpc3Qoa2V5KTtcbndtLnNldChrZXksdmFsdWUpO1xuIH0sXG5nZXQ6KGtleSk9PntcbmFzc2VydEtleUV4aXN0cyhrZXkpO1xuLyogSG93IHRvIHRlbGwgdHlwZXNjcmlwdCBJIGJlbGlldmUgdGhlIGBnZXRgIHdpbGwgc3VjY2VlZC4qL1xucmV0dXJuICgvKiogQHR5cGUge1Z9ICovd20uZ2V0KGtleSkpO1xuIH0sXG5zZXQ6KGtleSx2YWx1ZSk9PntcbmFzc2VydEtleUV4aXN0cyhrZXkpO1xud20uc2V0KGtleSx2YWx1ZSk7XG4gfSxcbmRlbGV0ZTooa2V5KT0+e1xuYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG53bS5kZWxldGUoa2V5KTtcbiB9fSk7XG5cbiB9OyRo4oCNX29uY2UubWFrZUxlZ2FjeVdlYWtNYXAobWFrZUxlZ2FjeVdlYWtNYXApO1xuaGFyZGVuKG1ha2VMZWdhY3lXZWFrTWFwKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlTGVnYWN5V2Vha01hcCI6WyJtYWtlTGVnYWN5V2Vha01hcCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACg/IAq0kAAANJAAAAzAAAAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL3BhdHRlcm5zL2VuY29kZVBhc3NhYmxlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL21hcnNoYWwiLCJAZW5kby9tYXJzaGFsL3NyYy9oZWxwZXJzL2Vycm9yLmpzIl0sImV4cG9ydHMiOlsiaXNFbmNvZGVkUmVtb3RhYmxlIiwibWFrZURlY29kZVBhc3NhYmxlIiwibWFrZUVuY29kZVBhc3NhYmxlIiwicGFzc1N0eWxlUHJlZml4ZXMiLCJyZWNvcmROYW1lcyIsInJlY29yZFZhbHVlcyIsInplcm9QYWQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgcGFzc1N0eWxlT2YsbmFtZUZvclBhc3NhYmxlU3ltYm9sLHBhc3NhYmxlU3ltYm9sRm9yTmFtZSxhc3NlcnRSZWNvcmQsZ2V0VGFnLG1ha2VUYWdnZWQsRXJyb3JIZWxwZXI7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXSxbXCJuYW1lRm9yUGFzc2FibGVTeW1ib2xcIiwgWyRo4oCNX2EgPT4gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9ICRo4oCNX2EpXV0sW1wicGFzc2FibGVTeW1ib2xGb3JOYW1lXCIsIFskaOKAjV9hID0+IChwYXNzYWJsZVN5bWJvbEZvck5hbWUgPSAkaOKAjV9hKV1dLFtcImFzc2VydFJlY29yZFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UmVjb3JkID0gJGjigI1fYSldXSxbXCJnZXRUYWdcIiwgWyRo4oCNX2EgPT4gKGdldFRhZyA9ICRo4oCNX2EpXV0sW1wibWFrZVRhZ2dlZFwiLCBbJGjigI1fYSA9PiAobWFrZVRhZ2dlZCA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsL3NyYy9oZWxwZXJzL2Vycm9yLmpzXCIsIFtbXCJFcnJvckhlbHBlclwiLCBbJGjigI1fYSA9PiAoRXJyb3JIZWxwZXIgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAYWdvcmljL2ludGVybmFsJykuUmVtb3RhYmxlfSBSZW1vdGFibGUgKi9cblxuY29uc3R7cXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5jb25zdHtmcm9tRW50cmllcyxpc309T2JqZWN0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcblxuLyoqXG4gKiBBc3N1bWluZyB0aGF0IGByZWNvcmRgIGlzIGEgQ29weVJlY29yZCwgd2UgaGF2ZSBvbmx5XG4gKiBzdHJpbmctbmFtZWQgb3duIHByb3BlcnRpZXMuIGByZWNvcmROYW1lc2AgcmV0dXJucyB0aG9zZSBuYW1lICpyZXZlcnNlKlxuICogc29ydGVkLCBiZWNhdXNlIHRoYXQncyBob3cgcmVjb3JkcyBhcmUgY29tcGFyZWQsIGVuY29kZWQsIGFuZCBzb3J0ZWQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7Q29weVJlY29yZDxUPn0gcmVjb3JkXG4gKiBAcmV0dXJucyB7c3RyaW5nW119XG4gKi9cbmNvbnN0ICAgICAgICByZWNvcmROYW1lcz0ocmVjb3JkKT0+XG4vKiBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xMjYwI2Rpc2N1c3Npb25fcjEwMDM2NTcyNDQqL1xuLyogY29tcGFyZXMgdHdvIHdheXMgb2YgcmV2ZXJzZSBzb3J0aW5nLCBhbmQgc2hvd3MgdGhhdCBgLnNvcnQoKS5yZXZlcnNlKClgKi9cbi8qIGlzIGN1cnJlbnRseSBmYXN0ZXIgb24gTW9kZGFibGUgWFMsIHdoaWxlIHRoZSBvdGhlciB3YXksKi9cbi8qIGAuc29ydChyZXZlcnNlQ29tcGFyYXRvcilgLCBpcyBmYXN0ZXIgb24gdjguIFdlIGN1cnJlbnRseSBjYXJlIG1vcmUgYWJvdXQqL1xuLyogWFMgcGVyZm9ybWFuY2UsIHNvIHdlIHJldmVyc2Ugc29ydCB1c2luZyBgLnNvcnQoKS5yZXZlcnNlKClgLiovXG5oYXJkZW4oLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9vd25LZXlzKHJlY29yZCkuc29ydCgpLnJldmVyc2UoKSk7JGjigI1fb25jZS5yZWNvcmROYW1lcyhyZWNvcmROYW1lcyk7XG5oYXJkZW4ocmVjb3JkTmFtZXMpO1xuXG4vKipcbiAqIEFzc3VtaW5nIHRoYXQgYHJlY29yZGAgaXMgYSBDb3B5UmVjb3JkIGFuZCBgbmFtZXNgIGlzIGByZWNvcmROYW1lcyhyZWNvcmQpYCxcbiAqIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBhcnJheSBvZiBwcm9wZXJ0eSB2YWx1ZXMuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7Q29weVJlY29yZDxUPn0gcmVjb3JkXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBuYW1lc1xuICogQHJldHVybnMge1RbXX1cbiAqL1xuY29uc3QgICAgICAgIHJlY29yZFZhbHVlcz0ocmVjb3JkLG5hbWVzKT0+XG5oYXJkZW4obmFtZXMubWFwKChuYW1lKT0+cmVjb3JkW25hbWVdKSk7JGjigI1fb25jZS5yZWNvcmRWYWx1ZXMocmVjb3JkVmFsdWVzKTtcbmhhcmRlbihyZWNvcmRWYWx1ZXMpO1xuXG5jb25zdCAgICAgICAgemVyb1BhZD0obixzaXplKT0+e1xuY29uc3QgblN0cj0gYCR7bn1gO1xuYXNzZXJ0KG5TdHIubGVuZ3RoPD1zaXplKTtcbmNvbnN0IHN0cj0gYDAwMDAwMDAwMDAwMDAwMDAwMDAwJHtuU3RyfWA7XG5jb25zdCByZXN1bHQ9c3RyLnN1YnN0cmluZyhzdHIubGVuZ3RoLXNpemUpO1xuYXNzZXJ0KHJlc3VsdC5sZW5ndGg9PT1zaXplKTtcbnJldHVybiByZXN1bHQ7XG4gfTskaOKAjV9vbmNlLnplcm9QYWQoemVyb1BhZCk7XG5oYXJkZW4oemVyb1BhZCk7XG5cbi8qIFRoaXMgaXMgdGhlIEphdmFTY3JpcHQgYW5hbG9nIHRvIGEgQyB1bmlvbjogYSB3YXkgdG8gbWFwIGJldHdlZW4gYSBmbG9hdCBhcyBhKi9cbi8qIG51bWJlciBhbmQgdGhlIGJpdHMgdGhhdCByZXByZXNlbnQgdGhlIGZsb2F0IGFzIGEgYnVmZmVyIGZ1bGwgb2YgYnl0ZXMuICBOb3RlKi9cbi8qIHRoYXQgdGhlIG11dGF0aW9uIG9mIHN0YXRpYyBzdGF0ZSBoZXJlIG1ha2VzIHRoaXMgaW52YWxpZCBKZXNzaWUgY29kZSwgYnV0Ki9cbi8qIGRvaW5nIGl0IHRoaXMgd2F5IHNhdmVzIHRoZSBudWdhdG9yeSBhbmQgZ3JhdHVpdG91cyBhbGxvY2F0aW9ucyB0aGF0IHdvdWxkKi9cbi8qIGhhcHBlbiBldmVyeSB0aW1lIHlvdSBkbyBhIGNvbnZlcnNpb24gLS0gYW5kIGluIHByYWN0aWNhbCB0ZXJtcyBpdCdzIHNhZmUqL1xuLyogYmVjYXVzZSB3ZSBwdXQgdGhlIHZhbHVlIGluIG9uZSBzaWRlIGFuZCB0aGVuIGltbWVkaWF0ZWx5IHRha2UgaXQgb3V0IHRoZSovXG4vKiBvdGhlcjsgdGhlcmUgaXMgbm8gYWN0dWFsIHN0YXRlIHJldGFpbmVkIGluIHRoZSBjbGFzc2ljIHNlbnNlIGFuZCB0aHVzIG5vKi9cbi8qIHJlLWVudHJhbmN5IGlzc3VlLiovXG5jb25zdCBhc051bWJlcj1uZXcgRmxvYXQ2NEFycmF5KDEpO1xuY29uc3QgYXNCaXRzPW5ldyBCaWdVaW50NjRBcnJheShhc051bWJlci5idWZmZXIpO1xuXG4vKiBKYXZhU2NyaXB0IG51bWJlcnMgYXJlIGVuY29kZWQgYnkgb3V0cHV0dGluZyB0aGUgYmFzZS0xNiovXG4vKiByZXByZXNlbnRhdGlvbiBvZiB0aGUgYmluYXJ5IHZhbHVlIG9mIHRoZSB1bmRlcmx5aW5nIElFRUUgZmxvYXRpbmcgcG9pbnQqL1xuLyogcmVwcmVzZW50YXRpb24uICBGb3IgbmVnYXRpdmUgdmFsdWVzLCBhbGwgYml0cyBvZiB0aGlzIHJlcHJlc2VudGF0aW9uIGFyZSovXG4vKiBjb21wbGVtZW50ZWQgcHJpb3IgdG8gdGhlIGJhc2UtMTYgY29udmVyc2lvbiwgd2hpbGUgZm9yIHBvc2l0aXZlIHZhbHVlcywgdGhlKi9cbi8qIHNpZ24gYml0IGlzIGNvbXBsZW1lbnRlZC4gIFRoaXMgZW5zdXJlcyBib3RoIHRoYXQgbmVnYXRpdmUgdmFsdWVzIHNvcnQgYmVmb3JlKi9cbi8qIHBvc2l0aXZlIHZhbHVlcyBhbmQgdGhhdCBuZWdhdGl2ZSB2YWx1ZXMgc29ydCBhY2NvcmRpbmcgdG8gdGhlaXIgbmVnYXRpdmUqL1xuLyogbWFnbml0dWRlIHJhdGhlciB0aGFuIHRoZWlyIHBvc2l0aXZlIG1hZ25pdHVkZS4gIFRoaXMgcmVzdWx0cyBpbiBhbiBBU0NJSSovXG4vKiBlbmNvZGluZyB3aG9zZSBsZXhpY29ncmFwaGljIHNvcnQgb3JkZXIgaXMgdGhlIHNhbWUgYXMgdGhlIG51bWVyaWMgc29ydCBvcmRlciovXG4vKiBvZiB0aGUgY29ycmVzcG9uZGluZyBudW1iZXJzLiovXG5cbi8qIFRPRE8gQ2hvb3NlIHRoZSBzYW1lIGNhbm9uaWNhbCBOYU4gZW5jb2RpbmcgdGhhdCBjb3NtV2FzbSBhbmQgZXdhc20gY2hvc2UuKi9cbmNvbnN0IENhbm9uaWNhbE5hTkJpdHM9J2ZmZjgwMDAwMDAwMDAwMDAnO1xuXG5jb25zdCBlbmNvZGVCaW5hcnk2ND0obik9Pntcbi8qIE5vcm1hbGl6ZSAtMCB0byAwIGFuZCBOYU4gdG8gYSBjYW5vbmljYWwgZW5jb2RpbmcqL1xuaWYoaXMobiwtMCkpe1xubj0wO1xuIH1lbHNlIGlmKGlzKG4sTmFOKSl7XG5yZXR1cm4gYGYke0Nhbm9uaWNhbE5hTkJpdHN9YDtcbiB9XG5hc051bWJlclswXT1uO1xubGV0IGJpdHM9YXNCaXRzWzBdO1xuaWYobjwwKXtcbmJpdHNePTB4ZmZmZmZmZmZmZmZmZmZmZm47XG4gfWVsc2V7XG5iaXRzXj0weDgwMDAwMDAwMDAwMDAwMDBuO1xuIH1cbnJldHVybiBgZiR7emVyb1BhZChiaXRzLnRvU3RyaW5nKDE2KSwxNil9YDtcbiB9O1xuXG5jb25zdCBkZWNvZGVCaW5hcnk2ND0oZW5jb2RlZCk9PntcbmVuY29kZWQuc3RhcnRzV2l0aCgnZicpfHxGYWlsIGBFbmNvZGVkIG51bWJlciBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG5sZXQgYml0cz1CaWdJbnQoIGAweCR7ZW5jb2RlZC5zdWJzdHJpbmcoMSl9YCk7XG5pZihlbmNvZGVkWzFdPCc4Jyl7XG5iaXRzXj0weGZmZmZmZmZmZmZmZmZmZmZuO1xuIH1lbHNle1xuYml0c149MHg4MDAwMDAwMDAwMDAwMDAwbjtcbiB9XG5hc0JpdHNbMF09Yml0cztcbmNvbnN0IHJlc3VsdD1hc051bWJlclswXTtcbiFpcyhyZXN1bHQsLTApfHxGYWlsIGBVbmV4cGVjdGVkIG5lZ2F0aXZlIHplcm86ICR7ZW5jb2RlZH1gO1xucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG4vKiBKYXZhU2NyaXB0IGJpZ2ludHMgYXJlIGVuY29kZWQgdXNpbmcgYSB2YXJpYW50IG9mIEVsaWFzIGRlbHRhIGNvZGluZywgd2l0aCBhbiovXG4vKiBpbml0aWFsIGNvbXBvbmVudCBmb3IgdGhlIGxlbmd0aCBvZiB0aGUgZGlnaXQgY291bnQgYXMgYSB1bmFyeSBzdHJpbmcsIGEqL1xuLyogc2Vjb25kIGNvbXBvbmVudCBmb3IgdGhlIGRlY2ltYWwgZGlnaXQgY291bnQsIGFuZCBhIHRoaXJkIGNvbXBvbmVudCBmb3IgdGhlKi9cbi8qIGRlY2ltYWwgZGlnaXRzIHByZWNlZGVkIGJ5IGEgZ3JhdHVpdG91cyBzZXBhcmF0aW5nIGNvbG9uLiovXG4vKiBUbyBlbnN1cmUgdGhhdCB0aGUgbGV4aWNvZ3JhcGhpYyBzb3J0IG9yZGVyIG9mIGVuY29kZWQgdmFsdWVzIG1hdGNoZXMgdGhlKi9cbi8qIG51bWVyaWMgc29ydCBvcmRlciBvZiB0aGUgY29ycmVzcG9uZGluZyBudW1iZXJzLCB0aGUgY2hhcmFjdGVycyBvZiB0aGUgdW5hcnkqL1xuLyogcHJlZml4IGFyZSBkaWZmZXJlbnQgZm9yIG5lZ2F0aXZlIHZhbHVlcyAodHlwZSBcIm5cIiBmb2xsb3dlZCBieSBhbnkgbnVtYmVyIG9mKi9cbi8qIFwiI1wicyBbd2hpY2ggc29ydCBiZWZvcmUgZGVjaW1hbCBkaWdpdHNdKSB2cy4gcG9zaXRpdmUgYW5kIHplcm8gdmFsdWVzICh0eXBlKi9cbi8qIFwicFwiIGZvbGxvd2VkIGJ5IGFueSBudW1iZXIgb2YgXCJ+XCJzIFt3aGljaCBzb3J0IGFmdGVyIGRlY2ltYWwgZGlnaXRzXSkgYW5kKi9cbi8qIGVhY2ggZGVjaW1hbCBkaWdpdCBvZiB0aGUgZW5jb2RpbmcgZm9yIGEgbmVnYXRpdmUgdmFsdWUgaXMgcmVwbGFjZWQgd2l0aCBpdHMqL1xuLyogdGVuJ3MgY29tcGxlbWVudCAoc28gdGhhdCBuZWdhdGl2ZSB2YWx1ZXMgb2YgdGhlIHNhbWUgc2NhbGUgc29ydCBieSovXG4vKiAqZGVzY2VuZGluZyogYWJzb2x1dGUgdmFsdWUpLiovXG5jb25zdCBlbmNvZGVCaWdJbnQ9KG4pPT57XG5jb25zdCBhYnM9bjwwbj8tbjpuO1xuY29uc3QgbkRpZ2l0cz1hYnMudG9TdHJpbmcoKS5sZW5ndGg7XG5jb25zdCBsRGlnaXRzPW5EaWdpdHMudG9TdHJpbmcoKS5sZW5ndGg7XG5pZihuPDBuKXtcbnJldHVybiBgbiR7XG4vKiBBIFwiI1wiIGZvciBlYWNoIGRpZ2l0IGJleW9uZCB0aGUgZmlyc3QqL1xuLyogaW4gdGhlIGRlY2ltYWwgKmNvdW50KiBvZiBkZWNpbWFsIGRpZ2l0cy4qL1xuJyMnLnJlcGVhdChsRGlnaXRzLTEpXG4gfSR7XG4vKiBUaGUgdGVuJ3MgY29tcGxlbWVudCBvZiB0aGUgY291bnQgb2YgZGlnaXRzLiovXG4oMTAqKmxEaWdpdHMtbkRpZ2l0cykudG9TdHJpbmcoKS5wYWRTdGFydChsRGlnaXRzLCcwJylcbiB9OiR7XG4vKiBUaGUgdGVuJ3MgY29tcGxlbWVudCBvZiB0aGUgZGlnaXRzLiovXG4oMTBuKipCaWdJbnQobkRpZ2l0cykrbikudG9TdHJpbmcoKS5wYWRTdGFydChuRGlnaXRzLCcwJylcbiB9YDtcbiB9ZWxzZXtcbnJldHVybiBgcCR7XG4vKiBBIFwiflwiIGZvciBlYWNoIGRpZ2l0IGJleW9uZCB0aGUgZmlyc3QqL1xuLyogaW4gdGhlIGRlY2ltYWwgKmNvdW50KiBvZiBkZWNpbWFsIGRpZ2l0cy4qL1xuJ34nLnJlcGVhdChsRGlnaXRzLTEpXG4gfSR7XG4vKiBUaGUgY291bnQgb2YgZGlnaXRzLiovXG5uRGlnaXRzXG4gfToke1xuLyogVGhlIGRpZ2l0cy4qL1xublxuIH1gO1xuIH1cbiB9O1xuXG5jb25zdCBkZWNvZGVCaWdJbnQ9KGVuY29kZWQpPT57XG5jb25zdCB0eXBlUHJlZml4PWVuY29kZWQuY2hhckF0KDApOy8qIGZhc3RlciB0aGFuIGVuY29kZWRbMF0qL1xubGV0IHJlbT1lbmNvZGVkLnNsaWNlKDEpO1xudHlwZVByZWZpeD09PSdwJ3x8XG50eXBlUHJlZml4PT09J24nfHxcbkZhaWwgYEVuY29kZWQgYmlnaW50IGV4cGVjdGVkOiAke2VuY29kZWR9YDtcblxuY29uc3QgbERpZ2l0cz1yZW0uc2VhcmNoKC9bMC05XS8pKzE7XG5sRGlnaXRzPj0xfHxGYWlsIGBEaWdpdCBjb3VudCBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG5yZW09cmVtLnNsaWNlKGxEaWdpdHMtMSk7XG5cbnJlbS5sZW5ndGg+PWxEaWdpdHN8fEZhaWwgYENvbXBsZXRlIGRpZ2l0IGNvdW50IGV4cGVjdGVkOiAke2VuY29kZWR9YDtcbmNvbnN0IHNuRGlnaXRzPXJlbS5zbGljZSgwLGxEaWdpdHMpO1xucmVtPXJlbS5zbGljZShsRGlnaXRzKTtcbi9eWzAtOV0rJC8udGVzdChzbkRpZ2l0cyl8fEZhaWwgYERlY2ltYWwgZGlnaXQgY291bnQgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xubGV0IG5EaWdpdHM9cGFyc2VJbnQoc25EaWdpdHMsMTApO1xuaWYodHlwZVByZWZpeD09PSduJyl7XG4vKiBUT0RPIEFzc2VydCB0byByZWplY3QgZm9yYmlkZGVuIGVuY29kaW5ncyovXG4vKiBsaWtlIFwibjA6XCIgYW5kIFwibjAwOuKAplwiIGFuZCBcIm45MTrigKZcIiB0aHJvdWdoIFwibjk5OuKAplwiPyovXG5uRGlnaXRzPTEwKipsRGlnaXRzLW5EaWdpdHM7XG4gfVxuXG5yZW0uc3RhcnRzV2l0aCgnOicpfHxGYWlsIGBTZXBhcmF0b3IgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xucmVtPXJlbS5zbGljZSgxKTtcbnJlbS5sZW5ndGg9PT1uRGlnaXRzfHxcbkZhaWwgYEZpeGVkLWxlbmd0aCBkaWdpdCBzZXF1ZW5jZSBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG5sZXQgbj1CaWdJbnQocmVtKTtcbmlmKHR5cGVQcmVmaXg9PT0nbicpe1xuLyogVE9ETyBBc3NlcnQgdG8gcmVqZWN0IGZvcmJpZGRlbiBlbmNvZGluZ3MqL1xuLyogbGlrZSBcIm45OjBcIiBhbmQgXCJuODowMFwiIGFuZCBcIm44OjkxXCIgdGhyb3VnaCBcIm44Ojk5XCI/Ki9cbm49LSgxMG4qKkJpZ0ludChuRGlnaXRzKS1uKTtcbiB9XG5cbnJldHVybiBuO1xuIH07XG5cbi8qIGAnXFx1MDAwMCdgIGlzIHRoZSB0ZXJtaW5hdG9yIGFmdGVyIGVsZW1lbnRzLiovXG4vKiBgJ1xcdTAwMDEnYCBpcyB0aGUgYmFja3NsYXNoLWxpa2UgZXNjYXBlIGNoYXJhY3RlciwgZm9yKi9cbi8qIGVzY2FwaW5nIGJvdGggb2YgdGhlc2UgY2hhcmFjdGVycy4qL1xuXG5jb25zdCBlbmNvZGVBcnJheT0oYXJyYXksZW5jb2RlUGFzc2FibGUpPT57XG5jb25zdCBjaGFycz1bJ1snXTtcbmZvcihjb25zdCBlbGVtZW50IG9mIGFycmF5KXtcbmNvbnN0IGVuYz1lbmNvZGVQYXNzYWJsZShlbGVtZW50KTtcbmZvcihjb25zdCBjIG9mIGVuYyl7XG5pZihjPT09J1xcdTAwMDAnfHxjPT09J1xcdTAwMDEnKXtcbmNoYXJzLnB1c2goJ1xcdTAwMDEnKTtcbiB9XG5jaGFycy5wdXNoKGMpO1xuIH1cbmNoYXJzLnB1c2goJ1xcdTAwMDAnKTtcbiB9XG5yZXR1cm4gY2hhcnMuam9pbignJyk7XG4gfTtcblxuY29uc3QgZGVjb2RlQXJyYXk9KGVuY29kZWQsZGVjb2RlUGFzc2FibGUpPT57XG5lbmNvZGVkLnN0YXJ0c1dpdGgoJ1snKXx8RmFpbCBgRW5jb2RlZCBhcnJheSBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG5jb25zdCBlbGVtZW50cz1bXTtcbmNvbnN0IGVsZW1DaGFycz1bXTtcbmZvcihsZXQgaT0xO2k8ZW5jb2RlZC5sZW5ndGg7aSs9MSl7XG5jb25zdCBjPWVuY29kZWRbaV07XG5pZihjPT09J1xcdTAwMDAnKXtcbmNvbnN0IGVuY29kZWRFbGVtZW50PWVsZW1DaGFycy5qb2luKCcnKTtcbmVsZW1DaGFycy5sZW5ndGg9MDtcbmNvbnN0IGVsZW1lbnQ9ZGVjb2RlUGFzc2FibGUoZW5jb2RlZEVsZW1lbnQpO1xuZWxlbWVudHMucHVzaChlbGVtZW50KTtcbiB9ZWxzZSBpZihjPT09J1xcdTAwMDEnKXtcbmkrPTE7XG5pPGVuY29kZWQubGVuZ3RofHxGYWlsIGB1bmV4cGVjdGVkIGVuZCBvZiBlbmNvZGluZyAke2VuY29kZWR9YDtcbmNvbnN0IGMyPWVuY29kZWRbaV07XG5jMj09PSdcXHUwMDAwJ3x8XG5jMj09PSdcXHUwMDAxJ3x8XG5GYWlsIGBVbmV4cGVjdGVkIGNoYXJhY3RlciBhZnRlciB1MDAwMSBlc2NhcGU6ICR7YzJ9YDtcbmVsZW1DaGFycy5wdXNoKGMyKTtcbiB9ZWxzZXtcbmVsZW1DaGFycy5wdXNoKGMpO1xuIH1cbiB9XG5lbGVtQ2hhcnMubGVuZ3RoPT09MHx8RmFpbCBgZW5jb2RpbmcgdGVybWluYXRlZCBlYXJseTogJHtlbmNvZGVkfWA7XG5yZXR1cm4gaGFyZGVuKGVsZW1lbnRzKTtcbiB9O1xuXG5jb25zdCBlbmNvZGVSZWNvcmQ9KHJlY29yZCxlbmNvZGVQYXNzYWJsZSk9PntcbmNvbnN0IG5hbWVzPXJlY29yZE5hbWVzKHJlY29yZCk7XG5jb25zdCB2YWx1ZXM9cmVjb3JkVmFsdWVzKHJlY29yZCxuYW1lcyk7XG5yZXR1cm4gYCgke2VuY29kZUFycmF5KGhhcmRlbihbbmFtZXMsdmFsdWVzXSksZW5jb2RlUGFzc2FibGUpfWA7XG4gfTtcblxuY29uc3QgZGVjb2RlUmVjb3JkPShlbmNvZGVkLGRlY29kZVBhc3NhYmxlKT0+e1xuYXNzZXJ0KGVuY29kZWQuc3RhcnRzV2l0aCgnKCcpKTtcbmNvbnN0IGtleXN2YWxzPWRlY29kZUFycmF5KGVuY29kZWQuc3Vic3RyaW5nKDEpLGRlY29kZVBhc3NhYmxlKTtcbmtleXN2YWxzLmxlbmd0aD09PTJ8fEZhaWwgYGV4cGVjdGVkIGtleXMsdmFsdWVzIHBhaXI6ICR7ZW5jb2RlZH1gO1xuY29uc3Rba2V5cyx2YWxzXT1rZXlzdmFscztcblxucGFzc1N0eWxlT2Yoa2V5cyk9PT0nY29weUFycmF5JyYmXG5wYXNzU3R5bGVPZih2YWxzKT09PSdjb3B5QXJyYXknJiZcbmtleXMubGVuZ3RoPT09dmFscy5sZW5ndGgmJlxua2V5cy5ldmVyeSgoa2V5KT0+dHlwZW9mIGtleT09PSdzdHJpbmcnKXx8XG5GYWlsIGBub3QgYSB2YWxpZCByZWNvcmQgZW5jb2Rpbmc6ICR7ZW5jb2RlZH1gO1xuY29uc3QgbWFwRW50cmllcz1rZXlzLm1hcCgoa2V5LGkpPT5ba2V5LHZhbHNbaV1dKTtcbmNvbnN0IHJlY29yZD1oYXJkZW4oZnJvbUVudHJpZXMobWFwRW50cmllcykpO1xuYXNzZXJ0UmVjb3JkKHJlY29yZCwnZGVjb2RlZCByZWNvcmQnKTtcbnJldHVybiByZWNvcmQ7XG4gfTtcblxuY29uc3QgZW5jb2RlVGFnZ2VkPSh0YWdnZWQsZW5jb2RlUGFzc2FibGUpPT5cbiBgOiR7ZW5jb2RlQXJyYXkoaGFyZGVuKFtnZXRUYWcodGFnZ2VkKSx0YWdnZWQucGF5bG9hZF0pLGVuY29kZVBhc3NhYmxlKX1gO1xuXG5jb25zdCBkZWNvZGVUYWdnZWQ9KGVuY29kZWQsZGVjb2RlUGFzc2FibGUpPT57XG5hc3NlcnQoZW5jb2RlZC5zdGFydHNXaXRoKCc6JykpO1xuY29uc3QgdGFncGF5bG9hZD1kZWNvZGVBcnJheShlbmNvZGVkLnN1YnN0cmluZygxKSxkZWNvZGVQYXNzYWJsZSk7XG50YWdwYXlsb2FkLmxlbmd0aD09PTJ8fEZhaWwgYGV4cGVjdGVkIHRhZyxwYXlsb2FkIHBhaXI6ICR7ZW5jb2RlZH1gO1xuY29uc3RbdGFnLHBheWxvYWRdPXRhZ3BheWxvYWQ7XG5wYXNzU3R5bGVPZih0YWcpPT09J3N0cmluZyd8fFxuRmFpbCBgbm90IGEgdmFsaWQgdGFnZ2VkIGVuY29kaW5nOiAke2VuY29kZWR9YDtcbnJldHVybiBtYWtlVGFnZ2VkKHRhZyxwYXlsb2FkKTtcbiB9O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEVuY29kZU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7KFxuICogICByZW1vdGFibGU6IFJlbW90YWJsZSxcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gc3RyaW5nLFxuICogKSA9PiBzdHJpbmd9IFtlbmNvZGVSZW1vdGFibGVdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgcHJvbWlzZTogUHJvbWlzZSxcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gc3RyaW5nLFxuICogKSA9PiBzdHJpbmd9IFtlbmNvZGVQcm9taXNlXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVycm9yOiBFcnJvcixcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gc3RyaW5nLFxuICogKSA9PiBzdHJpbmd9IFtlbmNvZGVFcnJvcl1cbiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7RW5jb2RlT3B0aW9uc30gW2VuY29kZU9wdGlvbnNdXG4gKiBAcmV0dXJucyB7KHBhc3NhYmxlOiBQYXNzYWJsZSkgPT4gc3RyaW5nfVxuICovXG4vKiBgeWFybiBsaW50YCBjb21wbGFpbnMgaGVyZSBidXQgbm90IGZvciBlcXVpdmFsZW50IGNvZGUgaW4gYWdvcmljLXNkay4qL1xuLyogQWxzbywgdnNjb2RlIGRvZXMgbm90IGNvbXBsYWluLiBIZW5jZSB3ZSdyZSB1c2luZyBhdC10cy1pZ25vcmUgcmF0aGVyIHRoYW4qL1xuLyogYXQtdHMtZXhwZWN0LWVycm9yLiBVc2luZyBhdC10cy1pZ25vcmUgc2hvdWxkIGFsc28gZ2VuZXJhdGUgYSBjb21wbGFpbnQqL1xuLyogdGhhdCB3ZSBzaG91bGQgYmUgdXNpbmcgYXQtZXhwZWN0LWVycm9yLCB3aGVyZSB3ZSB3b3VsZCBub3JtYWxseSBuZWVkKi9cbi8qIHRvIHN1cHByZXNzIHRoYXQgZXJyb3IgYXMgd2VsbC4gSG93ZXZlciwgcGVyaGFwcyB0aGF0IHNlY29uZCBlcnJvciBjdXJyZW50bHkqL1xuLyogaGFwcGVucyBvbmx5IGluIGFnb3JpYy1zZGssIGJ1dCBub3QgeWV0IGluIGVuZG8uIFRPRE8gZmlndXJlIG91dCBhbmQgZml4LiovXG4vKiBAIHRzLWlnbm9yZSovXG5jb25zdCAgICAgICAgbWFrZUVuY29kZVBhc3NhYmxlPSh7XG5lbmNvZGVSZW1vdGFibGU9KHJlbSxfKT0+RmFpbCBgcmVtb3RhYmxlIHVuZXhwZWN0ZWQ6ICR7cmVtfWAsXG5lbmNvZGVQcm9taXNlPShwcm9tLF8pPT5GYWlsIGBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7cHJvbX1gLFxuZW5jb2RlRXJyb3I9KGVycixfKT0+RmFpbCBgZXJyb3IgdW5leHBlY3RlZDogJHtlcnJ9YH09XG57fSk9PntcbmNvbnN0IGVuY29kZVBhc3NhYmxlPShwYXNzYWJsZSk9PntcbmlmKEVycm9ySGVscGVyLmNhbkJlVmFsaWQocGFzc2FibGUpKXtcbnJldHVybiBlbmNvZGVFcnJvcihwYXNzYWJsZSxlbmNvZGVQYXNzYWJsZSk7XG4gfVxuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHBhc3NhYmxlKTtcbnN3aXRjaChwYXNzU3R5bGUpe1xuY2FzZSdudWxsJzp7XG5yZXR1cm4ndic7XG4gfVxuY2FzZSd1bmRlZmluZWQnOntcbnJldHVybid6JztcbiB9XG5jYXNlJ251bWJlcic6e1xucmV0dXJuIGVuY29kZUJpbmFyeTY0KHBhc3NhYmxlKTtcbiB9XG5jYXNlJ3N0cmluZyc6e1xucmV0dXJuIGBzJHtwYXNzYWJsZX1gO1xuIH1cbmNhc2UnYm9vbGVhbic6e1xucmV0dXJuIGBiJHtwYXNzYWJsZX1gO1xuIH1cbmNhc2UnYmlnaW50Jzp7XG5yZXR1cm4gZW5jb2RlQmlnSW50KHBhc3NhYmxlKTtcbiB9XG5jYXNlJ3JlbW90YWJsZSc6e1xuY29uc3QgcmVzdWx0PWVuY29kZVJlbW90YWJsZShwYXNzYWJsZSxlbmNvZGVQYXNzYWJsZSk7XG5yZXN1bHQuc3RhcnRzV2l0aCgncicpfHxcbkZhaWwgYGludGVybmFsOiBSZW1vdGFibGUgZW5jb2RpbmcgbXVzdCBzdGFydCB3aXRoIFwiclwiOiAke3Jlc3VsdH1gO1xucmV0dXJuIHJlc3VsdDtcbiB9XG5jYXNlJ2Vycm9yJzp7XG5jb25zdCByZXN1bHQ9ZW5jb2RlRXJyb3IocGFzc2FibGUsZW5jb2RlUGFzc2FibGUpO1xucmVzdWx0LnN0YXJ0c1dpdGgoJyEnKXx8XG5GYWlsIGBpbnRlcm5hbDogRXJyb3IgZW5jb2RpbmcgbXVzdCBzdGFydCB3aXRoIFwiIVwiOiAke3Jlc3VsdH1gO1xucmV0dXJuIHJlc3VsdDtcbiB9XG5jYXNlJ3Byb21pc2UnOntcbmNvbnN0IHJlc3VsdD1lbmNvZGVQcm9taXNlKHBhc3NhYmxlLGVuY29kZVBhc3NhYmxlKTtcbnJlc3VsdC5zdGFydHNXaXRoKCc/Jyl8fFxuRmFpbCBgaW50ZXJuYWw6IFByb21pc2UgZW5jb2RpbmcgbXVzdCBzdGFydCB3aXRoIFwiP1wiOiAke3Jlc3VsdH1gO1xucmV0dXJuIHJlc3VsdDtcbiB9XG5jYXNlJ3N5bWJvbCc6e1xucmV0dXJuIGB5JHtuYW1lRm9yUGFzc2FibGVTeW1ib2wocGFzc2FibGUpfWA7XG4gfVxuY2FzZSdjb3B5QXJyYXknOntcbnJldHVybiBlbmNvZGVBcnJheShwYXNzYWJsZSxlbmNvZGVQYXNzYWJsZSk7XG4gfVxuY2FzZSdjb3B5UmVjb3JkJzp7XG5yZXR1cm4gZW5jb2RlUmVjb3JkKHBhc3NhYmxlLGVuY29kZVBhc3NhYmxlKTtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xucmV0dXJuIGVuY29kZVRhZ2dlZChwYXNzYWJsZSxlbmNvZGVQYXNzYWJsZSk7XG4gfVxuZGVmYXVsdDp7XG50aHJvdyBGYWlsIGBhICR7cShwYXNzU3R5bGUpfSBjYW5ub3QgYmUgdXNlZCBhcyBhIGNvbGxlY3Rpb24gcGFzc2FibGVgO1xuIH19XG5cbiB9O1xucmV0dXJuIGhhcmRlbihlbmNvZGVQYXNzYWJsZSk7XG4gfTskaOKAjV9vbmNlLm1ha2VFbmNvZGVQYXNzYWJsZShtYWtlRW5jb2RlUGFzc2FibGUpO1xuaGFyZGVuKG1ha2VFbmNvZGVQYXNzYWJsZSk7XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRGVjb2RlT3B0aW9uc1xuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRSZW1vdGFibGU6IHN0cmluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlOiBzdHJpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IFJlbW90YWJsZX0gW2RlY29kZVJlbW90YWJsZV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkUHJvbWlzZTogc3RyaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGU6IHN0cmluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gUHJvbWlzZX0gW2RlY29kZVByb21pc2VdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZEVycm9yOiBzdHJpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZTogc3RyaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiBFcnJvcn0gW2RlY29kZUVycm9yXVxuICovXG5cbi8qKlxuICogQHBhcmFtIHtEZWNvZGVPcHRpb25zfSBbZGVjb2RlT3B0aW9uc11cbiAqIEByZXR1cm5zIHsoZW5jb2RlZDogc3RyaW5nKSA9PiBQYXNzYWJsZX1cbiAqL1xuLyogYHlhcm4gbGludGAgY29tcGxhaW5zIGhlcmUgYnV0IG5vdCBmb3IgZXF1aXZhbGVudCBjb2RlIGluIGFnb3JpYy1zZGsuKi9cbi8qIEFsc28sIHZzY29kZSBkb2VzIG5vdCBjb21wbGFpbi4gSGVuY2Ugd2UncmUgdXNpbmcgYXQtdHMtaWdub3JlIHJhdGhlciB0aGFuKi9cbi8qIGF0LXRzLWV4cGVjdC1lcnJvci4gVXNpbmcgYXQtdHMtaWdub3JlIHNob3VsZCBhbHNvIGdlbmVyYXRlIGEgY29tcGxhaW50Ki9cbi8qIHRoYXQgd2Ugc2hvdWxkIGJlIHVzaW5nIGF0LWV4cGVjdC1lcnJvciwgd2hlcmUgd2Ugd291bGQgbm9ybWFsbHkgbmVlZCovXG4vKiB0byBzdXBwcmVzcyB0aGF0IGVycm9yIGFzIHdlbGwuIEhvd2V2ZXIsIHBlcmhhcHMgdGhhdCBzZWNvbmQgZXJyb3IgY3VycmVudGx5Ki9cbi8qIGhhcHBlbnMgb25seSBpbiBhZ29yaWMtc2RrLCBidXQgbm90IHlldCBpbiBlbmRvLiBUT0RPIGZpZ3VyZSBvdXQgYW5kIGZpeC4qL1xuLyogQCB0cy1pZ25vcmUqL1xuY29uc3QgICAgICAgIG1ha2VEZWNvZGVQYXNzYWJsZT0oe1xuZGVjb2RlUmVtb3RhYmxlPShyZW0sXyk9PkZhaWwgYHJlbW90YWJsZSB1bmV4cGVjdGVkOiAke3JlbX1gLFxuZGVjb2RlUHJvbWlzZT0ocHJvbSxfKT0+RmFpbCBgcHJvbWlzZSB1bmV4cGVjdGVkOiAke3Byb219YCxcbmRlY29kZUVycm9yPShlcnIsXyk9PkZhaWwgYGVycm9yIHVuZXhwZWN0ZWQ6ICR7ZXJyfWB9PVxue30pPT57XG5jb25zdCBkZWNvZGVQYXNzYWJsZT0oZW5jb2RlZCk9PntcbnN3aXRjaChlbmNvZGVkLmNoYXJBdCgwKSl7XG5jYXNlJ3YnOntcbnJldHVybiBudWxsO1xuIH1cbmNhc2Uneic6e1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG5jYXNlJ2YnOntcbnJldHVybiBkZWNvZGVCaW5hcnk2NChlbmNvZGVkKTtcbiB9XG5jYXNlJ3MnOntcbnJldHVybiBlbmNvZGVkLnN1YnN0cmluZygxKTtcbiB9XG5jYXNlJ2InOntcbnJldHVybiBlbmNvZGVkLnN1YnN0cmluZygxKSE9PSdmYWxzZSc7XG4gfVxuY2FzZSduJzpcbmNhc2UncCc6e1xucmV0dXJuIGRlY29kZUJpZ0ludChlbmNvZGVkKTtcbiB9XG5jYXNlJ3InOntcbnJldHVybiBkZWNvZGVSZW1vdGFibGUoZW5jb2RlZCxkZWNvZGVQYXNzYWJsZSk7XG4gfVxuY2FzZSc/Jzp7XG5yZXR1cm4gZGVjb2RlUHJvbWlzZShlbmNvZGVkLGRlY29kZVBhc3NhYmxlKTtcbiB9XG5jYXNlJyEnOntcbnJldHVybiBkZWNvZGVFcnJvcihlbmNvZGVkLGRlY29kZVBhc3NhYmxlKTtcbiB9XG5jYXNlJ3knOntcbnJldHVybiBwYXNzYWJsZVN5bWJvbEZvck5hbWUoZW5jb2RlZC5zdWJzdHJpbmcoMSkpO1xuIH1cbmNhc2UnWyc6e1xucmV0dXJuIGRlY29kZUFycmF5KGVuY29kZWQsZGVjb2RlUGFzc2FibGUpO1xuIH1cbmNhc2UnKCc6e1xucmV0dXJuIGRlY29kZVJlY29yZChlbmNvZGVkLGRlY29kZVBhc3NhYmxlKTtcbiB9XG5jYXNlJzonOntcbnJldHVybiBkZWNvZGVUYWdnZWQoZW5jb2RlZCxkZWNvZGVQYXNzYWJsZSk7XG4gfVxuZGVmYXVsdDp7XG50aHJvdyBGYWlsIGBpbnZhbGlkIGRhdGFiYXNlIGtleTogJHtlbmNvZGVkfWA7XG4gfX1cblxuIH07XG5yZXR1cm4gaGFyZGVuKGRlY29kZVBhc3NhYmxlKTtcbiB9OyRo4oCNX29uY2UubWFrZURlY29kZVBhc3NhYmxlKG1ha2VEZWNvZGVQYXNzYWJsZSk7XG5oYXJkZW4obWFrZURlY29kZVBhc3NhYmxlKTtcblxuY29uc3QgICAgICAgIGlzRW5jb2RlZFJlbW90YWJsZT0oZW5jb2RlZCk9PmVuY29kZWQuY2hhckF0KDApPT09J3InOyRo4oCNX29uY2UuaXNFbmNvZGVkUmVtb3RhYmxlKGlzRW5jb2RlZFJlbW90YWJsZSk7XG5oYXJkZW4oaXNFbmNvZGVkUmVtb3RhYmxlKTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKipcbiAqIEB0eXBlIHtSZWNvcmQ8UGFzc1N0eWxlLCBzdHJpbmc+fVxuICogVGhlIHNpbmdsZSBwcmVmaXggY2hhcmFjdGVycyB0byBiZSB1c2VkIGZvciBlYWNoIFBhc3NTdHlsZSBjYXRlZ29yeS5cbiAqIGBiaWdpbnRgIGlzIGEgdHdvIGNoYXJhY3RlciBzdHJpbmcgYmVjYXVzZSBlYWNoIG9mIHRob3NlIGNoYXJhY3RlcnNcbiAqIGluZGl2aWR1YWxseSBpcyBhIHZhbGlkIGJpZ2ludCBwcmVmaXguIGBuYCBmb3IgXCJuZWdhdGl2ZVwiIGFuZCBgcGAgZm9yXG4gKiBcInBvc2l0aXZlXCIuIFRoZSBvcmRlcmluZyBvZiB0aGVzZSBwcmVmaXhlcyBpcyB0aGUgc2FtZSBhcyB0aGVcbiAqIHJhbmtPcmRlcmluZyBvZiB0aGVpciByZXNwZWN0aXZlIFBhc3NTdHlsZXMuIFRoaXMgdGFibGUgaXMgaW1wb3J0ZWQgYnlcbiAqIHJhbmtPcmRlci5qcyBmb3IgdGhpcyBwdXJwb3NlLlxuICpcbiAqIEluIGFkZGl0aW9uLCBgfGAgaXMgdGhlIHJlbW90YWJsZS0+b3JkaW5hbCBtYXBwaW5nIHByZWZpeDpcbiAqIFRoaXMgaXMgbm90IHVzZWQgaW4gY292ZXJzIGJ1dCBpdCBpc1xuICogcmVzZXJ2ZWQgZnJvbSB0aGUgc2FtZSBzZXQgb2Ygc3RyaW5ncy4gTm90ZSB0aGF0IHRoZSBwcmVmaXggaXMgPiBhbnlcbiAqIHByZWZpeCB1c2VkIGJ5IGFueSBjb3ZlciBzbyB0aGF0IG9yZGluYWwgbWFwcGluZyBrZXlzIGFyZSBhbHdheXMgb3V0c2lkZVxuICogdGhlIHJhbmdlIG9mIHZhbGlkIGNvbGxlY3Rpb24gZW50cnkga2V5cy5cbiAqL1xuY29uc3QgICAgICAgIHBhc3NTdHlsZVByZWZpeGVzPWhhcmRlbih7XG5fX3Byb3RvX186bnVsbCxcbmVycm9yOichJyxcbmNvcHlSZWNvcmQ6JygnLFxudGFnZ2VkOic6JyxcbnByb21pc2U6Jz8nLFxuY29weUFycmF5OidbJyxcbmJvb2xlYW46J2InLFxubnVtYmVyOidmJyxcbmJpZ2ludDonbnAnLFxucmVtb3RhYmxlOidyJyxcbnN0cmluZzoncycsXG5udWxsOid2JyxcbnN5bWJvbDoneScsXG51bmRlZmluZWQ6J3onfSk7JGjigI1fb25jZS5wYXNzU3R5bGVQcmVmaXhlcyhwYXNzU3R5bGVQcmVmaXhlcyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicmVjb3JkTmFtZXMiOlsicmVjb3JkTmFtZXMiXSwicmVjb3JkVmFsdWVzIjpbInJlY29yZFZhbHVlcyJdLCJ6ZXJvUGFkIjpbInplcm9QYWQiXSwibWFrZUVuY29kZVBhc3NhYmxlIjpbIm1ha2VFbmNvZGVQYXNzYWJsZSJdLCJtYWtlRGVjb2RlUGFzc2FibGUiOlsibWFrZURlY29kZVBhc3NhYmxlIl0sImlzRW5jb2RlZFJlbW90YWJsZSI6WyJpc0VuY29kZWRSZW1vdGFibGUiXSwicGFzc1N0eWxlUHJlZml4ZXMiOlsicGFzc1N0eWxlUHJlZml4ZXMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAALzWfSUyAAAlMgAANAAAAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9wYXR0ZXJucy9pbnRlcmZhY2UtdG9vbHMuanN7ImltcG9ydHMiOlsiLi9wYXR0ZXJuTWF0Y2hlcnMuanMiLCJAYWdvcmljL2ludGVybmFsIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJkZWZlbmRQcm90b3R5cGUiLCJkZWZlbmRQcm90b3R5cGVLaXQiLCJkZWZpbmVIZWFwRmFyQ2xhc3MiLCJkZWZpbmVIZWFwRmFyQ2xhc3NLaXQiLCJpbml0RW1wdHkiLCJtYWtlSGVhcEZhckluc3RhbmNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEZhcixFLGxpc3REaWZmZXJlbmNlLG9iamVjdE1hcCxmaXQsTTskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWxcIiwgW1tcImxpc3REaWZmZXJlbmNlXCIsIFskaOKAjV9hID0+IChsaXN0RGlmZmVyZW5jZSA9ICRo4oCNX2EpXV0sW1wib2JqZWN0TWFwXCIsIFskaOKAjV9hID0+IChvYmplY3RNYXAgPSAkaOKAjV9hKV1dXV0sW1wiLi9wYXR0ZXJuTWF0Y2hlcnMuanNcIiwgW1tcImZpdFwiLCBbJGjigI1fYSA9PiAoZml0ID0gJGjigI1fYSldXSxbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuY29uc3R7cXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5jb25zdHthcHBseSxvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7ZGVmaW5lUHJvcGVydGllcyxzZWFsLGZyZWV6ZX09T2JqZWN0O1xuXG5jb25zdCBkZWZlbmRTeW5jQXJncz0oYXJncyxtZXRob2RHdWFyZCxsYWJlbCk9PntcbmNvbnN0e2FyZ0d1YXJkcyxvcHRpb25hbEFyZ0d1YXJkcyxyZXN0QXJnR3VhcmR9PW1ldGhvZEd1YXJkO1xuY29uc3QgcGFyYW1zUGF0dGVybj1NLnNwbGl0QXJyYXkoXG5hcmdHdWFyZHMsXG5vcHRpb25hbEFyZ0d1YXJkcyxcbnJlc3RBcmdHdWFyZCk7XG5cbmZpdChoYXJkZW4oYXJncykscGFyYW1zUGF0dGVybixsYWJlbCk7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge01ldGhvZH0gbWV0aG9kXG4gKiBAcGFyYW0ge01ldGhvZEd1YXJkfSBtZXRob2RHdWFyZFxuICogQHBhcmFtIHtzdHJpbmd9IGxhYmVsXG4gKiBAcmV0dXJucyB7TWV0aG9kfVxuICovXG5jb25zdCBkZWZlbmRTeW5jTWV0aG9kPShtZXRob2QsbWV0aG9kR3VhcmQsbGFiZWwpPT57XG5jb25zdHtyZXR1cm5HdWFyZH09bWV0aG9kR3VhcmQ7XG5jb25zdHtzeW5jTWV0aG9kfT17XG4vKiBOb3RlIHB1cnBvc2VmdWwgdXNlIG9mIGB0aGlzYCBhbmQgY29uY2lzZSBtZXRob2Qgc3ludGF4Ki9cbnN5bmNNZXRob2QoLi4uYXJncyl7XG5kZWZlbmRTeW5jQXJncyhoYXJkZW4oYXJncyksbWV0aG9kR3VhcmQsbGFiZWwpO1xuY29uc3QgcmVzdWx0PWFwcGx5KG1ldGhvZCx0aGlzLGFyZ3MpO1xuZml0KGhhcmRlbihyZXN1bHQpLHJldHVybkd1YXJkLCBgJHtsYWJlbH06IHJlc3VsdGApO1xucmV0dXJuIHJlc3VsdDtcbiB9fTtcblxucmV0dXJuIHN5bmNNZXRob2Q7XG4gfTtcblxuY29uc3QgaXNBd2FpdEFyZ0d1YXJkPShhcmdHdWFyZCk9PlxuYXJnR3VhcmQmJnR5cGVvZiBhcmdHdWFyZD09PSdvYmplY3QnJiZhcmdHdWFyZC5rbGFzcz09PSdhd2FpdEFyZyc7XG5cbmNvbnN0IGRlc3luYz0obWV0aG9kR3VhcmQpPT57XG5jb25zdHthcmdHdWFyZHMsb3B0aW9uYWxBcmdHdWFyZHM9W10scmVzdEFyZ0d1YXJkfT1tZXRob2RHdWFyZDtcbiFpc0F3YWl0QXJnR3VhcmQocmVzdEFyZ0d1YXJkKXx8XG5GYWlsIGBSZXN0IGFyZ3MgbWF5IG5vdCBiZSBhd2FpdGVkOiAke3Jlc3RBcmdHdWFyZH1gO1xuY29uc3QgcmF3QXJnR3VhcmRzPVsuLi5hcmdHdWFyZHMsLi4ub3B0aW9uYWxBcmdHdWFyZHNdO1xuXG5jb25zdCBhd2FpdEluZGV4ZXM9W107XG5mb3IobGV0IGk9MDtpPHJhd0FyZ0d1YXJkcy5sZW5ndGg7aSs9MSl7XG5jb25zdCBhcmdHdWFyZD1yYXdBcmdHdWFyZHNbaV07XG5pZihpc0F3YWl0QXJnR3VhcmQoYXJnR3VhcmQpKXtcbnJhd0FyZ0d1YXJkc1tpXT1hcmdHdWFyZC5hcmdHdWFyZDtcbmF3YWl0SW5kZXhlcy5wdXNoKGkpO1xuIH1cbiB9XG5yZXR1cm57XG5hd2FpdEluZGV4ZXMsXG5yYXdNZXRob2RHdWFyZDp7XG5hcmdHdWFyZHM6cmF3QXJnR3VhcmRzLnNsaWNlKDAsYXJnR3VhcmRzLmxlbmd0aCksXG5vcHRpb25hbEFyZ0d1YXJkczpyYXdBcmdHdWFyZHMuc2xpY2UoYXJnR3VhcmRzLmxlbmd0aCksXG5yZXN0QXJnR3VhcmR9fTtcblxuXG4gfTtcblxuY29uc3QgZGVmZW5kQXN5bmNNZXRob2Q9KG1ldGhvZCxtZXRob2RHdWFyZCxsYWJlbCk9PntcbmNvbnN0e3JldHVybkd1YXJkfT1tZXRob2RHdWFyZDtcbmNvbnN0e2F3YWl0SW5kZXhlcyxyYXdNZXRob2RHdWFyZH09ZGVzeW5jKG1ldGhvZEd1YXJkKTtcbmNvbnN0e2FzeW5jTWV0aG9kfT17XG4vKiBOb3RlIHB1cnBvc2VmdWwgdXNlIG9mIGB0aGlzYCBhbmQgY29uY2lzZSBtZXRob2Qgc3ludGF4Ki9cbmFzeW5jTWV0aG9kKC4uLmFyZ3Mpe1xuY29uc3QgYXdhaXRMaXN0PWF3YWl0SW5kZXhlcy5tYXAoKGkpPT5hcmdzW2ldKTtcbmNvbnN0IHA9UHJvbWlzZS5hbGwoYXdhaXRMaXN0KTtcbmNvbnN0IHJhd0FyZ3M9Wy4uLmFyZ3NdO1xuY29uc3QgcmVzdWx0UD1FLndoZW4ocCwoYXdhaXRlZEFyZ3MpPT57XG5mb3IobGV0IGo9MDtqPGF3YWl0SW5kZXhlcy5sZW5ndGg7ais9MSl7XG5yYXdBcmdzW2F3YWl0SW5kZXhlc1tqXV09YXdhaXRlZEFyZ3Nbal07XG4gfVxuZGVmZW5kU3luY0FyZ3MocmF3QXJncyxyYXdNZXRob2RHdWFyZCxsYWJlbCk7XG5yZXR1cm4gYXBwbHkobWV0aG9kLHRoaXMscmF3QXJncyk7XG4gfSk7XG5yZXR1cm4gRS53aGVuKHJlc3VsdFAsKHJlc3VsdCk9PntcbmZpdChoYXJkZW4ocmVzdWx0KSxyZXR1cm5HdWFyZCwgYCR7bGFiZWx9OiByZXN1bHRgKTtcbnJldHVybiByZXN1bHQ7XG4gfSk7XG4gfX07XG5cbnJldHVybiBhc3luY01ldGhvZDtcbiB9O1xuXG4vKipcbiAqXG4gKiBAcGFyYW0ge01ldGhvZH0gbWV0aG9kXG4gKiBAcGFyYW0ge01ldGhvZEd1YXJkfSBtZXRob2RHdWFyZFxuICogQHBhcmFtIHtzdHJpbmd9IGxhYmVsXG4gKi9cbmNvbnN0IGRlZmVuZE1ldGhvZD0obWV0aG9kLG1ldGhvZEd1YXJkLGxhYmVsKT0+e1xuY29uc3R7a2xhc3MsY2FsbEtpbmR9PW1ldGhvZEd1YXJkO1xuYXNzZXJ0KGtsYXNzPT09J21ldGhvZEd1YXJkJyk7XG5pZihjYWxsS2luZD09PSdzeW5jJyl7XG5yZXR1cm4gZGVmZW5kU3luY01ldGhvZChtZXRob2QsbWV0aG9kR3VhcmQsbGFiZWwpO1xuIH1lbHNle1xuYXNzZXJ0KGNhbGxLaW5kPT09J2FzeW5jJyk7XG5yZXR1cm4gZGVmZW5kQXN5bmNNZXRob2QobWV0aG9kLG1ldGhvZEd1YXJkLGxhYmVsKTtcbiB9XG4gfTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZFRhZ1xuICogQHBhcmFtIHtXZWFrTWFwfSBjb250ZXh0TWFwXG4gKiBAcGFyYW0ge0NhbGxhYmxlRnVuY3Rpb259IGJlaGF2aW9yTWV0aG9kXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFt0aGlzZnVsTWV0aG9kc11cbiAqIEBwYXJhbSB7TWV0aG9kR3VhcmR9IFttZXRob2RHdWFyZF1cbiAqL1xuY29uc3QgYmluZE1ldGhvZD0oXG5tZXRob2RUYWcsXG5jb250ZXh0TWFwLFxuYmVoYXZpb3JNZXRob2QsXG50aGlzZnVsTWV0aG9kcz1mYWxzZSxcbm1ldGhvZEd1YXJkPXVuZGVmaW5lZCk9Plxue1xuYXNzZXJ0LnR5cGVvZihiZWhhdmlvck1ldGhvZCwnZnVuY3Rpb24nKTtcblxuY29uc3QgZ2V0Q29udGV4dD0oc2VsZik9PntcbmNvbnN0IGNvbnRleHQ9Y29udGV4dE1hcC5nZXQoc2VsZik7XG5jb250ZXh0fHxcbkZhaWwgYCR7cShtZXRob2RUYWcpfSBtYXkgb25seSBiZSBhcHBsaWVkIHRvIGEgdmFsaWQgaW5zdGFuY2U6ICR7c2VsZn1gO1xucmV0dXJuIGNvbnRleHQ7XG4gfTtcblxuLyogVmlvbGF0aW5nIGFsbCBKZXNzaWUgcnVsZXMgdG8gY3JlYXRlIHJlcHJlc2VudGF0aXZlcyB0aGF0IGluaGVyaXQqL1xuLyogbWV0aG9kcyBmcm9tIGEgc2hhcmVkIHByb3RvdHlwZS4gVGhlIGJvdW5kIG1ldGhvZCB0aGVyZWZvcmUgbmVlZHMqL1xuLyogdG8gbWVudGlvbiBgdGhpc2AuIFdlIGRlZmluZSBpdCB1c2luZyBjb25jaXNlIG1ldGhvZCBzeW50YXgqL1xuLyogc28gdGhhdCBpdCB3aWxsIGJlIGB0aGlzYCBzZW5zaXRpdmUgYnV0IG5vdCBjb25zdHJ1Y3RhYmxlLiovXG4vKiovXG4vKiBXZSBub3JtYWxseSBjb25zaWRlciBgdGhpc2AgdW5zYWZlIGJlY2F1c2Ugb2YgdGhlIGhhemFyZCBvZiBhKi9cbi8qIG1ldGhvZCBvZiBvbmUgYWJzdHJhY3Rpb24gYmVpbmcgYXBwbGllZCB0byBhbiBpbnN0YW5jZSBvZiovXG4vKiBhbm90aGVyIGFic3RyYWN0aW9uLiBUbyBwcmV2ZW50IHRoYXQgYXR0YWNrLCB0aGUgYm91bmQgbWV0aG9kKi9cbi8qIGNoZWNrcyB0aGF0IGl0cyBgdGhpc2AgaXMgaW4gdGhlIG1hcCBpbiB3aGljaCBpdHMgcmVwcmVzZW50YXRpdmVzKi9cbi8qIGFyZSByZWdpc3RlcmVkLiovXG5sZXR7bWV0aG9kfT10aGlzZnVsTWV0aG9kcz9cbntcbm1ldGhvZCguLi5hcmdzKXtcbmNvbnN0IGNvbnRleHQ9Z2V0Q29udGV4dCh0aGlzKTtcbnJldHVybiBhcHBseShiZWhhdmlvck1ldGhvZCxjb250ZXh0LGFyZ3MpO1xuIH19OlxuXG57XG5tZXRob2QoLi4uYXJncyl7XG5jb25zdCBjb250ZXh0PWdldENvbnRleHQodGhpcyk7XG5yZXR1cm4gYXBwbHkoYmVoYXZpb3JNZXRob2QsbnVsbCxbY29udGV4dCwuLi5hcmdzXSk7XG4gfX07XG5cbmlmKG1ldGhvZEd1YXJkKXtcbm1ldGhvZD1kZWZlbmRNZXRob2QobWV0aG9kLG1ldGhvZEd1YXJkLG1ldGhvZFRhZyk7XG4gfVxuZGVmaW5lUHJvcGVydGllcyhtZXRob2Qse1xubmFtZTp7dmFsdWU6bWV0aG9kVGFnfSxcbmxlbmd0aDp7XG52YWx1ZTp0aGlzZnVsTWV0aG9kcz9iZWhhdmlvck1ldGhvZC5sZW5ndGg6YmVoYXZpb3JNZXRob2QubGVuZ3RoLTF9fSk7XG5cblxucmV0dXJuIG1ldGhvZDtcbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgQ2FsbGFibGVGdW5jdGlvbj59IFRcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEBwYXJhbSB7V2Vha01hcH0gY29udGV4dE1hcFxuICogQHBhcmFtIHtUfSBiZWhhdmlvck1ldGhvZHNcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3RoaXNmdWxNZXRob2RzXVxuICogQHBhcmFtIHtJbnRlcmZhY2VHdWFyZH0gW2ludGVyZmFjZUd1YXJkXVxuICogQHJldHVybnMge1QgJiBYaW1wb3J0KCdAZW5kby9ldmVudHVhbC1zZW5kJykuUmVtb3RhYmxlQnJhbmQ8e30sIFQ+fVxuICovXG5jb25zdCAgICAgICAgZGVmZW5kUHJvdG90eXBlPShcbnRhZyxcbmNvbnRleHRNYXAsXG5iZWhhdmlvck1ldGhvZHMsXG50aGlzZnVsTWV0aG9kcz1mYWxzZSxcbmludGVyZmFjZUd1YXJkPXVuZGVmaW5lZCk9Plxue1xuY29uc3QgcHJvdG90eXBlPXt9O1xuY29uc3QgbWV0aG9kTmFtZXM9b3duS2V5cyhiZWhhdmlvck1ldGhvZHMpLmZpbHRlcihcbi8qIEJ5IGlnbm9yaW5nIGFueSBtZXRob2QgbmFtZWQgXCJjb25zdHJ1Y3RvclwiLCB3ZSBjYW4gdXNlIGEqL1xuLyogY2xhc3MucHJvdG90eXBlIGFzIGEgYmVoYXZpb3JNZXRob2RzLiovXG4obmFtZSk9Pm5hbWUhPT0nY29uc3RydWN0b3InKTtcblxubGV0IG1ldGhvZEd1YXJkcztcbmlmKGludGVyZmFjZUd1YXJkKXtcbmNvbnN0e1xua2xhc3MsXG5pbnRlcmZhY2VOYW1lLFxubWV0aG9kR3VhcmRzOm1nLFxuc2xvcHB5PWZhbHNlfT1cbmludGVyZmFjZUd1YXJkO1xubWV0aG9kR3VhcmRzPW1nO1xuYXNzZXJ0LmVxdWFsKGtsYXNzLCdJbnRlcmZhY2UnKTtcbmFzc2VydC50eXBlb2YoaW50ZXJmYWNlTmFtZSwnc3RyaW5nJyk7XG57XG5jb25zdCBtZXRob2RHdWFyZE5hbWVzPW93bktleXMobWV0aG9kR3VhcmRzKTtcbmNvbnN0IHVuaW1wbGVtZW50ZWQ9bGlzdERpZmZlcmVuY2UobWV0aG9kR3VhcmROYW1lcyxtZXRob2ROYW1lcyk7XG51bmltcGxlbWVudGVkLmxlbmd0aD09PTB8fFxuRmFpbCBgbWV0aG9kcyAke3EodW5pbXBsZW1lbnRlZCl9IG5vdCBpbXBsZW1lbnRlZCBieSAke3EodGFnKX1gO1xuaWYoIXNsb3BweSl7XG5jb25zdCB1bmd1YXJkZWQ9bGlzdERpZmZlcmVuY2UobWV0aG9kTmFtZXMsbWV0aG9kR3VhcmROYW1lcyk7XG51bmd1YXJkZWQubGVuZ3RoPT09MHx8XG5GYWlsIGBtZXRob2RzICR7cSh1bmd1YXJkZWQpfSBub3QgZ3VhcmRlZCBieSAke3EoaW50ZXJmYWNlTmFtZSl9YDtcbiB9XG4gfVxuIH1cbmZvcihjb25zdCBwcm9wIG9mIG1ldGhvZE5hbWVzKXtcbnByb3RvdHlwZVtwcm9wXT1iaW5kTWV0aG9kKFxuIGBJbiAke3EocHJvcCl9IG1ldGhvZCBvZiAoJHt0YWd9KWAsXG5jb250ZXh0TWFwLFxuYmVoYXZpb3JNZXRob2RzW3Byb3BdLFxudGhpc2Z1bE1ldGhvZHMsXG4vKiBUT0RPIHNvbWUgdG9vbCBkb2VzIG5vdCB5ZXQgdW5kZXJzdGFuZCB0aGUgYD8uW2Agc3ludGF4Ki9cbm1ldGhvZEd1YXJkcyYmbWV0aG9kR3VhcmRzW3Byb3BdKTtcblxuIH1cbi8qIEB0cy1leHBlY3QtZXJyb3IgY291bGQgYmUgaW5zdGFudGlhdGVkIHdpdGggZGlmZmVyZW50IHN1YnR5cGUqL1xucmV0dXJuIEZhcih0YWcscHJvdG90eXBlKTtcbiB9OyRo4oCNX29uY2UuZGVmZW5kUHJvdG90eXBlKGRlZmVuZFByb3RvdHlwZSk7XG5oYXJkZW4oZGVmZW5kUHJvdG90eXBlKTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIFdlYWtNYXA+fSBjb250ZXh0TWFwS2l0XG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcgfCBzeW1ib2wsIENhbGxhYmxlRnVuY3Rpb24+Pn0gYmVoYXZpb3JNZXRob2RzS2l0XG4gKiBAcGFyYW0ge2Jvb2xlYW59IFt0aGlzZnVsTWV0aG9kc11cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgSW50ZXJmYWNlR3VhcmQ+fSBbaW50ZXJmYWNlR3VhcmRLaXRdXG4gKi9cbmNvbnN0ICAgICAgICBkZWZlbmRQcm90b3R5cGVLaXQ9KFxudGFnLFxuY29udGV4dE1hcEtpdCxcbmJlaGF2aW9yTWV0aG9kc0tpdCxcbnRoaXNmdWxNZXRob2RzPWZhbHNlLFxuaW50ZXJmYWNlR3VhcmRLaXQ9dW5kZWZpbmVkKT0+XG57XG5jb25zdCBmYWNldE5hbWVzPW93bktleXMoYmVoYXZpb3JNZXRob2RzS2l0KS5zb3J0KCk7XG5mYWNldE5hbWVzLmxlbmd0aD4xfHxGYWlsIGBBIG11bHRpLWZhY2V0IG9iamVjdCBtdXN0IGhhdmUgbXVsdGlwbGUgZmFjZXRzYDtcbmlmKGludGVyZmFjZUd1YXJkS2l0KXtcbmNvbnN0IGludGVyZmFjZU5hbWVzPW93bktleXMoaW50ZXJmYWNlR3VhcmRLaXQpO1xuY29uc3QgZXh0cmFJbnRlcmZhY2VOYW1lcz1saXN0RGlmZmVyZW5jZShmYWNldE5hbWVzLGludGVyZmFjZU5hbWVzKTtcbmV4dHJhSW50ZXJmYWNlTmFtZXMubGVuZ3RoPT09MHx8XG5GYWlsIGBJbnRlcmZhY2VzICR7cShleHRyYUludGVyZmFjZU5hbWVzKX0gbm90IGltcGxlbWVudGVkIGJ5ICR7cSh0YWcpfWA7XG5jb25zdCBleHRyYUZhY2V0TmFtZXM9bGlzdERpZmZlcmVuY2UoaW50ZXJmYWNlTmFtZXMsZmFjZXROYW1lcyk7XG5leHRyYUZhY2V0TmFtZXMubGVuZ3RoPT09MHx8XG5GYWlsIGBGYWNldHMgJHtxKGV4dHJhRmFjZXROYW1lcyl9IG9mICR7cSh0YWcpfSBub3QgZ3VhcmRlZCBieSBpbnRlcmZhY2VzYDtcbiB9XG5jb25zdCBjb250ZXh0TWFwTmFtZXM9b3duS2V5cyhjb250ZXh0TWFwS2l0KTtcbmNvbnN0IGV4dHJhQ29udGV4dE5hbWVzPWxpc3REaWZmZXJlbmNlKGZhY2V0TmFtZXMsY29udGV4dE1hcE5hbWVzKTtcbmV4dHJhQ29udGV4dE5hbWVzLmxlbmd0aD09PTB8fFxuRmFpbCBgQ29udGV4dHMgJHtxKGV4dHJhQ29udGV4dE5hbWVzKX0gbm90IGltcGxlbWVudGVkIGJ5ICR7cSh0YWcpfWA7XG5jb25zdCBleHRyYUZhY2V0TmFtZXM9bGlzdERpZmZlcmVuY2UoY29udGV4dE1hcE5hbWVzLGZhY2V0TmFtZXMpO1xuZXh0cmFGYWNldE5hbWVzLmxlbmd0aD09PTB8fFxuRmFpbCBgRmFjZXRzICR7cShleHRyYUZhY2V0TmFtZXMpfSBvZiAke3EodGFnKX0gbWlzc2luZyBjb250ZXh0c2A7XG5yZXR1cm4gb2JqZWN0TWFwKGJlaGF2aW9yTWV0aG9kc0tpdCwoYmVoYXZpb3JNZXRob2RzLGZhY2V0TmFtZSk9PlxuZGVmZW5kUHJvdG90eXBlKFxuIGAke3RhZ30gJHtmYWNldE5hbWV9YCxcbmNvbnRleHRNYXBLaXRbZmFjZXROYW1lXSxcbmJlaGF2aW9yTWV0aG9kcyxcbnRoaXNmdWxNZXRob2RzLFxuaW50ZXJmYWNlR3VhcmRLaXQmJmludGVyZmFjZUd1YXJkS2l0W2ZhY2V0TmFtZV0pKTtcblxuXG4gfTskaOKAjV9vbmNlLmRlZmVuZFByb3RvdHlwZUtpdChkZWZlbmRQcm90b3R5cGVLaXQpO1xuXG5jb25zdCBlbXB0eVJlY29yZD1oYXJkZW4oe30pO1xuXG4vKipcbiAqIFdoZW4gY2FsbGluZyBgZGVmaW5lRHVyYWJsZUtpbmRgIGFuZFxuICogaXRzIHNpYmxpbmdzLCB1c2VkIGFzIHRoZSBgaW5pdGAgZnVuY3Rpb24gYXJndW1lbnQgdG8gaW5kaWNhdGUgdGhhdCB0aGVcbiAqIHN0YXRlIHJlY29yZCBvZiB0aGUgKHZpcnR1YWwvZHVyYWJsZSkgaW5zdGFuY2VzIG9mIHRoZSBraW5kL2ZhckNsYXNzXG4gKiBzaG91bGQgYmUgZW1wdHksIGFuZCB0aGF0IHRoZSByZXR1cm5lZCBtYWtlciBmdW5jdGlvbiBzaG91bGQgaGF2ZSB6ZXJvXG4gKiBwYXJhbWV0ZXJzLlxuICpcbiAqIEByZXR1cm5zIHt7fX1cbiAqL1xuY29uc3QgICAgICAgIGluaXRFbXB0eT0oKT0+ZW1wdHlSZWNvcmQ7XG5cbi8qKlxuICogQHRlbXBsYXRlIFtTID0gYW55XVxuICogQHRlbXBsYXRlIFtUID0gYW55XVxuICogQHR5cGVkZWYge29iamVjdH0gQ29udGV4dFxuICogQHByb3BlcnR5IHtTfSBzdGF0ZVxuICogQHByb3BlcnR5IHtUfSBzZWxmXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgQSBhcmdzIHRvIGluaXRcbiAqIEB0ZW1wbGF0ZSBTIHN0YXRlIGZyb20gaW5pdFxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCBDYWxsYWJsZUZ1bmN0aW9uPn0gVCBtZXRob2RzXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gKiBAcGFyYW0ge2FueX0gaW50ZXJmYWNlR3VhcmRcbiAqIEBwYXJhbSB7KC4uLmFyZ3M6IEFbXSkgPT4gU30gaW5pdFxuICogQHBhcmFtIHtUICYgVGhpc1R5cGU8eyBzZWxmOiBULCBzdGF0ZTogUyB9Pn0gbWV0aG9kc1xuICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXVxuICogQHJldHVybnMgeyguLi5hcmdzOiBBW10pID0+IChUICYgWGltcG9ydCgnQGVuZG8vZXZlbnR1YWwtc2VuZCcpLlJlbW90YWJsZUJyYW5kPHt9LCBUPil9XG4gKi8kaOKAjV9vbmNlLmluaXRFbXB0eShpbml0RW1wdHkpO1xuY29uc3QgICAgICAgIGRlZmluZUhlYXBGYXJDbGFzcz0oXG50YWcsXG5pbnRlcmZhY2VHdWFyZCxcbmluaXQsXG5tZXRob2RzLFxub3B0aW9ucz11bmRlZmluZWQpPT5cbntcbi8qKiBAdHlwZSB7V2Vha01hcDxULENvbnRleHQ8UywgVD4+fSAqL1xuY29uc3QgY29udGV4dE1hcD1uZXcgV2Vha01hcCgpO1xuY29uc3QgcHJvdG90eXBlPWRlZmVuZFByb3RvdHlwZShcbnRhZyxcbmNvbnRleHRNYXAsXG5tZXRob2RzLFxudHJ1ZSxcbmludGVyZmFjZUd1YXJkKTtcblxuY29uc3QgbWFrZUluc3RhbmNlPSguLi5hcmdzKT0+e1xuLyogQmUgY2FyZWZ1bCBub3QgdG8gZnJlZXplIHRoZSBzdGF0ZSByZWNvcmQqL1xuY29uc3Qgc3RhdGU9c2VhbChpbml0KC4uLmFyZ3MpKTtcbi8qKiBAdHlwZSB7VH0gKi9cbi8qIEB0cy1leHBlY3QtZXJyb3IgY291bGQgYmUgaW5zdGFudGlhdGVkIHdpdGggZGlmZmVyZW50IHN1YnR5cGUqL1xuY29uc3Qgc2VsZj1oYXJkZW4oe19fcHJvdG9fXzpwcm90b3R5cGV9KTtcbi8qIEJlIGNhcmVmdWwgbm90IHRvIGZyZWV6ZSB0aGUgc3RhdGUgcmVjb3JkKi9cbi8qKiBAdHlwZSB7Q29udGV4dDxTLFQ+fSAqL1xuY29uc3QgY29udGV4dD1mcmVlemUoe3N0YXRlLHNlbGZ9KTtcbmNvbnRleHRNYXAuc2V0KHNlbGYsY29udGV4dCk7XG5pZihvcHRpb25zKXtcbmNvbnN0e2ZpbmlzaD11bmRlZmluZWR9PW9wdGlvbnM7XG5pZihmaW5pc2gpe1xuZmluaXNoKGNvbnRleHQpO1xuIH1cbiB9XG5yZXR1cm4gc2VsZjtcbiB9O1xuLyogQHRzLWV4cGVjdC1lcnJvciBjb3VsZCBiZSBpbnN0YW50aWF0ZWQgd2l0aCBkaWZmZXJlbnQgc3VidHlwZSovXG5yZXR1cm4gaGFyZGVuKG1ha2VJbnN0YW5jZSk7XG4gfTskaOKAjV9vbmNlLmRlZmluZUhlYXBGYXJDbGFzcyhkZWZpbmVIZWFwRmFyQ2xhc3MpO1xuaGFyZGVuKGRlZmluZUhlYXBGYXJDbGFzcyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEEgYXJncyB0byBpbml0XG4gKiBAdGVtcGxhdGUgUyBzdGF0ZSBmcm9tIGluaXRcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgQ2FsbGFibGVGdW5jdGlvbj4+fSBGIG1ldGhvZHNcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEBwYXJhbSB7YW55fSBpbnRlcmZhY2VHdWFyZEtpdFxuICogQHBhcmFtIHsoLi4uYXJnczogQVtdKSA9PiBTfSBpbml0XG4gKiBAcGFyYW0ge0YgJiBUaGlzVHlwZTx7IGZhY2V0czogRiwgc3RhdGU6IFMgfT4gfSBtZXRob2RzS2l0XG4gKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7KC4uLmFyZ3M6IEFbXSkgPT4gRn1cbiAqL1xuY29uc3QgICAgICAgIGRlZmluZUhlYXBGYXJDbGFzc0tpdD0oXG50YWcsXG5pbnRlcmZhY2VHdWFyZEtpdCxcbmluaXQsXG5tZXRob2RzS2l0LFxub3B0aW9ucz11bmRlZmluZWQpPT5cbntcbmNvbnN0IGNvbnRleHRNYXBLaXQ9b2JqZWN0TWFwKG1ldGhvZHNLaXQsKCk9Pm5ldyBXZWFrTWFwKCkpO1xuY29uc3QgcHJvdG90eXBlS2l0PWRlZmVuZFByb3RvdHlwZUtpdChcbnRhZyxcbmNvbnRleHRNYXBLaXQsXG5tZXRob2RzS2l0LFxudHJ1ZSxcbmludGVyZmFjZUd1YXJkS2l0KTtcblxuY29uc3QgbWFrZUluc3RhbmNlS2l0PSguLi5hcmdzKT0+e1xuLyogQmUgY2FyZWZ1bCBub3QgdG8gZnJlZXplIHRoZSBzdGF0ZSByZWNvcmQqL1xuY29uc3Qgc3RhdGU9c2VhbChpbml0KC4uLmFyZ3MpKTtcbi8qIERvbid0IGZyZWV6ZSBjb250ZXh0IHVudGlsIHdlIGFkZCBmYWNldHMqL1xuY29uc3QgY29udGV4dD17c3RhdGV9O1xuY29uc3QgZmFjZXRzPW9iamVjdE1hcChwcm90b3R5cGVLaXQsKHByb3RvdHlwZSxmYWNldE5hbWUpPT57XG5jb25zdCBzZWxmPWhhcmRlbih7X19wcm90b19fOnByb3RvdHlwZX0pO1xuY29udGV4dE1hcEtpdFtmYWNldE5hbWVdLnNldChzZWxmLGNvbnRleHQpO1xucmV0dXJuIHNlbGY7XG4gfSk7XG5jb250ZXh0LmZhY2V0cz1mYWNldHM7XG4vKiBCZSBjYXJlZnVsIG5vdCB0byBmcmVlemUgdGhlIHN0YXRlIHJlY29yZCovXG5mcmVlemUoY29udGV4dCk7XG5pZihvcHRpb25zKXtcbmNvbnN0e2ZpbmlzaD11bmRlZmluZWR9PW9wdGlvbnM7XG5pZihmaW5pc2gpe1xuZmluaXNoKGNvbnRleHQpO1xuIH1cbiB9XG5yZXR1cm4gZmFjZXRzO1xuIH07XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci10cy1leHBlY3QtZXJyb3IgLS0gZGlmZmVyZW50IHBlciBwYWNrYWdlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNDYyMCovXG4vKiBAdHMtaWdub3JlIHh4eCovXG5yZXR1cm4gaGFyZGVuKG1ha2VJbnN0YW5jZUtpdCk7XG4gfTskaOKAjV9vbmNlLmRlZmluZUhlYXBGYXJDbGFzc0tpdChkZWZpbmVIZWFwRmFyQ2xhc3NLaXQpO1xuaGFyZGVuKGRlZmluZUhlYXBGYXJDbGFzc0tpdCk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nLCBNZXRob2Q+fSBUXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gKiBAcGFyYW0ge0ludGVyZmFjZUd1YXJkIHwgdW5kZWZpbmVkfSBpbnRlcmZhY2VHdWFyZCBDQVZFQVQ6IHN0YXRpYyB0eXBpbmcgZG9lcyBub3QgeWV0IHN1cHBvcnQgYGNhbGxXaGVuYCB0cmFuc2Zvcm1hdGlvblxuICogQHBhcmFtIHtUfSBtZXRob2RzXG4gKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7VCAmIFhpbXBvcnQoJ0BlbmRvL2V2ZW50dWFsLXNlbmQnKS5SZW1vdGFibGVCcmFuZDx7fSwgVD59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlSGVhcEZhckluc3RhbmNlPShcbnRhZyxcbmludGVyZmFjZUd1YXJkLFxubWV0aG9kcyxcbm9wdGlvbnM9dW5kZWZpbmVkKT0+XG57XG5jb25zdCBtYWtlSW5zdGFuY2U9ZGVmaW5lSGVhcEZhckNsYXNzKFxudGFnLFxuaW50ZXJmYWNlR3VhcmQsXG5pbml0RW1wdHksXG5tZXRob2RzLFxub3B0aW9ucyk7XG5cbnJldHVybiBtYWtlSW5zdGFuY2UoKTtcbiB9OyRo4oCNX29uY2UubWFrZUhlYXBGYXJJbnN0YW5jZShtYWtlSGVhcEZhckluc3RhbmNlKTtcbmhhcmRlbihtYWtlSGVhcEZhckluc3RhbmNlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZlbmRQcm90b3R5cGUiOlsiZGVmZW5kUHJvdG90eXBlIl0sImRlZmVuZFByb3RvdHlwZUtpdCI6WyJkZWZlbmRQcm90b3R5cGVLaXQiXSwiaW5pdEVtcHR5IjpbImluaXRFbXB0eSJdLCJkZWZpbmVIZWFwRmFyQ2xhc3MiOlsiZGVmaW5lSGVhcEZhckNsYXNzIl0sImRlZmluZUhlYXBGYXJDbGFzc0tpdCI6WyJkZWZpbmVIZWFwRmFyQ2xhc3NLaXQiXSwibWFrZUhlYXBGYXJJbnN0YW5jZSI6WyJtYWtlSGVhcEZhckluc3RhbmNlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKJ1R3y1BwAAtQcAADMAAABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvcGF0dGVybnMvaW50ZXJuYWwtdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG4vKiBUT0RPKi9cbi8qIFRoZSBmb2xsb3dpbmcgY29tbWVudGVkIG91dCB0eXBlIHNob3VsZCBiZSBpbiB0aGlzIGZpbGUsIHNpbmNlIHRoZSovXG4vKiBgTWF0Y2hIZWxwZXJgIHR5cGUgaXMgcHVyZWx5IGludGVybmFsIHRvIHRoaXMgcGFja2FnZS4gSG93ZXZlciwqL1xuLyogaW4gb3JkZXIgdG8gZ2V0IHRoZSBnb3Zlcm5hbmNlIGFuZCBzb2xvIHBhY2thZ2VzIGJvdGggdG8gcGFzcyBsaW50LCovXG4vKiBJIG1vdmVkIHRoZSB0eXBlIGRlY2xhcmF0aW9uIGl0c2VsZiB0byB0eXBlcy5qcy4gU2VlIHRoZSBjb21tZW50cyB0aGVyZSovXG4vKiBhbmQgaW4gZXhwb3J0cy5qcyovXG5cbi8qIC8qKiovXG4vKiAqIEB0eXBlZGVmIHtvYmplY3R9IE1hdGNoSGVscGVyKi9cbi8qICogVGhpcyBmYWN0b3JzIG91dCBvbmx5IHRoZSBwYXJ0cyBzcGVjaWZpYyB0byBlYWNoIGtpbmQgb2YgTWF0Y2hlci4gSXQgaXMqL1xuLyogKiBlbmNhcHN1bGF0ZWQsIGFuZCBpdHMgbWV0aG9kcyBjYW4gbWFrZSB0aGUgc3RhdGVkIHVuY2hlY2tlciBhc3N1bXB0aW9ucyovXG4vKiAqIGVuZm9yY2VkIGJ5IHRoZSBjb21tb24gY2FsbGluZyBsb2dpYy4qL1xuLyogKiovXG4vKiAqIEBwcm9wZXJ0eSB7KGFsbGVnZWRQYXlsb2FkOiBQYXNzYWJsZSwqL1xuLyogKiAgICAgICAgICAgICBjaGVjazogQ2hlY2tlciovXG4vKiAqICkgPT4gYm9vbGVhbn0gY2hlY2tJc1dlbGxGb3JtZWQqL1xuLyogKiBBc3N1bWVzIHRoaXMgaXMgdGhlIHBheWxvYWQgb2YgYSBDb3B5VGFnZ2VkIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcqL1xuLyogKiBtYXRjaFRhZy4gSXMgdGhpcyBhIHZhbGlkIHBheWxvYWQgZm9yIGEgTWF0Y2hlciB3aXRoIHRoYXQgdGFnPyovXG4vKiAqKi9cbi8qICogQHByb3BlcnR5IHsoc3BlY2ltZW46IFBhc3NhYmxlLCovXG4vKiAqICAgICAgICAgICAgIG1hdGNoZXJQYXlsb2FkOiBQYXNzYWJsZSwqL1xuLyogKiAgICAgICAgICAgICBjaGVjazogQ2hlY2tlciovXG4vKiAqICkgPT4gYm9vbGVhbn0gY2hlY2tNYXRjaGVzKi9cbi8qICogQXNzdW1pbmcgYSB2YWxpZCBNYXRjaGVyIG9mIHRoaXMgdHlwZSB3aXRoIGBtYXRjaGVyUGF5bG9hZGAgYXMgaXRzKi9cbi8qICogcGF5bG9hZCwgZG9lcyB0aGlzIHNwZWNpbWVuIG1hdGNoIHRoYXQgTWF0Y2hlcj8qL1xuLyogKiovXG4vKiAqIEBwcm9wZXJ0eSB7KHBheWxvYWQ6IFBhc3NhYmxlKSA9PiBSYW5rQ292ZXJ9IGdldFJhbmtDb3ZlciovXG4vKiAqIEFzc3VtZXMgdGhpcyBpcyB0aGUgcGF5bG9hZCBvZiBhIENvcHlUYWdnZWQgd2l0aCB0aGUgY29ycmVzcG9uZGluZyovXG4vKiAqIG1hdGNoVGFnLiBSZXR1cm4gYSBSYW5rQ292ZXIgdG8gYm91bmQgZnJvbSBiZWxvdyBhbmQgYWJvdmUsKi9cbi8qICogaW4gcmFuayBvcmRlciwgYWxsIHBvc3NpYmxlIFBhc3NhYmxlcyB0aGF0IHdvdWxkIG1hdGNoIHRoaXMgTWF0Y2hlci4qL1xuLyogKiBUaGUgbGVmdCBlbGVtZW50IG11c3QgYmUgYmVmb3JlIG9yIHRoZSBzYW1lIHJhbmsgYXMgYW55IHBvc3NpYmxlKi9cbi8qICogbWF0Y2hpbmcgc3BlY2ltZW4uIFRoZSByaWdodCBlbGVtZW50IG11c3QgYmUgYWZ0ZXIgb3IgdGhlIHNhbWUqL1xuLyogKiByYW5rIGFzIGFueSBwb3NzaWJsZSBtYXRjaGluZyBzcGVjaW1lbi4qL1xuLyogKlgvKi9cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAGgQ69M3IAADNyAAANAAAAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanN7ImltcG9ydHMiOlsiLi4va2V5cy9jaGVja0tleS5qcyIsIi4uL2tleXMvY29tcGFyZUtleXMuanMiLCIuL2VuY29kZVBhc3NhYmxlLmpzIiwiLi9yYW5rT3JkZXIuanMiLCJAYWdvcmljL2Fzc2VydCIsIkBhZ29yaWMvaW50ZXJuYWwiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsiTSIsImFzc2VydEtleVBhdHRlcm4iLCJhc3NlcnRQYXR0ZXJuIiwiY2hlY2tNYXRjaGVzIiwiZGVmYXVsdExpbWl0cyIsImZpdCIsImdldFJhbmtDb3ZlciIsImlzS2V5UGF0dGVybiIsImlzUGF0dGVybiIsIm1hdGNoZXMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0Q2hlY2tlcixGYXIsZ2V0VGFnLG1ha2VUYWdnZWQscGFzc1N0eWxlT2YsaGFzT3duUHJvcGVydHlPZixuYW1lRm9yUGFzc2FibGVTeW1ib2wsaWRlbnRDaGVja2VyLGFwcGx5TGFiZWxpbmdFcnJvcixmcm9tVW5pcXVlRW50cmllcyxsaXN0RGlmZmVyZW5jZSxjb21wYXJlUmFuayxnZXRQYXNzU3R5bGVDb3ZlcixpbnRlcnNlY3RSYW5rQ292ZXJzLHVuaW9uUmFua0NvdmVycyxyZWNvcmROYW1lcyxyZWNvcmRWYWx1ZXMsa2V5RVEsa2V5R1Qsa2V5R1RFLGtleUxULGtleUxURSxhc3NlcnRLZXksY2hlY2tLZXksaXNLZXksY2hlY2tTY2FsYXJLZXksaXNTY2FsYXJLZXksY2hlY2tDb3B5U2V0LGNoZWNrQ29weU1hcCxjb3B5TWFwS2V5U2V0LGNoZWNrQ29weUJhZzskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXSxbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV0sW1wiZ2V0VGFnXCIsIFskaOKAjV9hID0+IChnZXRUYWcgPSAkaOKAjV9hKV1dLFtcIm1ha2VUYWdnZWRcIiwgWyRo4oCNX2EgPT4gKG1ha2VUYWdnZWQgPSAkaOKAjV9hKV1dLFtcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV0sW1wiaGFzT3duUHJvcGVydHlPZlwiLCBbJGjigI1fYSA9PiAoaGFzT3duUHJvcGVydHlPZiA9ICRo4oCNX2EpXV0sW1wibmFtZUZvclBhc3NhYmxlU3ltYm9sXCIsIFskaOKAjV9hID0+IChuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9hc3NlcnRcIiwgW1tcImlkZW50Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoaWRlbnRDaGVja2VyID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWxcIiwgW1tcImFwcGx5TGFiZWxpbmdFcnJvclwiLCBbJGjigI1fYSA9PiAoYXBwbHlMYWJlbGluZ0Vycm9yID0gJGjigI1fYSldXSxbXCJmcm9tVW5pcXVlRW50cmllc1wiLCBbJGjigI1fYSA9PiAoZnJvbVVuaXF1ZUVudHJpZXMgPSAkaOKAjV9hKV1dLFtcImxpc3REaWZmZXJlbmNlXCIsIFskaOKAjV9hID0+IChsaXN0RGlmZmVyZW5jZSA9ICRo4oCNX2EpXV1dXSxbXCIuL3JhbmtPcmRlci5qc1wiLCBbW1wiY29tcGFyZVJhbmtcIiwgWyRo4oCNX2EgPT4gKGNvbXBhcmVSYW5rID0gJGjigI1fYSldXSxbXCJnZXRQYXNzU3R5bGVDb3ZlclwiLCBbJGjigI1fYSA9PiAoZ2V0UGFzc1N0eWxlQ292ZXIgPSAkaOKAjV9hKV1dLFtcImludGVyc2VjdFJhbmtDb3ZlcnNcIiwgWyRo4oCNX2EgPT4gKGludGVyc2VjdFJhbmtDb3ZlcnMgPSAkaOKAjV9hKV1dLFtcInVuaW9uUmFua0NvdmVyc1wiLCBbJGjigI1fYSA9PiAodW5pb25SYW5rQ292ZXJzID0gJGjigI1fYSldXV1dLFtcIi4vZW5jb2RlUGFzc2FibGUuanNcIiwgW1tcInJlY29yZE5hbWVzXCIsIFskaOKAjV9hID0+IChyZWNvcmROYW1lcyA9ICRo4oCNX2EpXV0sW1wicmVjb3JkVmFsdWVzXCIsIFskaOKAjV9hID0+IChyZWNvcmRWYWx1ZXMgPSAkaOKAjV9hKV1dXV0sW1wiLi4va2V5cy9jb21wYXJlS2V5cy5qc1wiLCBbW1wia2V5RVFcIiwgWyRo4oCNX2EgPT4gKGtleUVRID0gJGjigI1fYSldXSxbXCJrZXlHVFwiLCBbJGjigI1fYSA9PiAoa2V5R1QgPSAkaOKAjV9hKV1dLFtcImtleUdURVwiLCBbJGjigI1fYSA9PiAoa2V5R1RFID0gJGjigI1fYSldXSxbXCJrZXlMVFwiLCBbJGjigI1fYSA9PiAoa2V5TFQgPSAkaOKAjV9hKV1dLFtcImtleUxURVwiLCBbJGjigI1fYSA9PiAoa2V5TFRFID0gJGjigI1fYSldXV1dLFtcIi4uL2tleXMvY2hlY2tLZXkuanNcIiwgW1tcImFzc2VydEtleVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0S2V5ID0gJGjigI1fYSldXSxbXCJjaGVja0tleVwiLCBbJGjigI1fYSA9PiAoY2hlY2tLZXkgPSAkaOKAjV9hKV1dLFtcImlzS2V5XCIsIFskaOKAjV9hID0+IChpc0tleSA9ICRo4oCNX2EpXV0sW1wiY2hlY2tTY2FsYXJLZXlcIiwgWyRo4oCNX2EgPT4gKGNoZWNrU2NhbGFyS2V5ID0gJGjigI1fYSldXSxbXCJpc1NjYWxhcktleVwiLCBbJGjigI1fYSA9PiAoaXNTY2FsYXJLZXkgPSAkaOKAjV9hKV1dLFtcImNoZWNrQ29weVNldFwiLCBbJGjigI1fYSA9PiAoY2hlY2tDb3B5U2V0ID0gJGjigI1fYSldXSxbXCJjaGVja0NvcHlNYXBcIiwgWyRo4oCNX2EgPT4gKGNoZWNrQ29weU1hcCA9ICRo4oCNX2EpXV0sW1wiY29weU1hcEtleVNldFwiLCBbJGjigI1fYSA9PiAoY29weU1hcEtleVNldCA9ICRo4oCNX2EpXV0sW1wiY2hlY2tDb3B5QmFnXCIsIFskaOKAjV9hID0+IChjaGVja0NvcHlCYWcgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG5jb25zdHtxdW90ZTpxLGRldGFpbHM6WCxGYWlsfT1hc3NlcnQ7XG5jb25zdHtlbnRyaWVzLHZhbHVlc309T2JqZWN0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcblxuLyoqIEB0eXBlIFdlYWtTZXQ8UGF0dGVybj4gKi9cbmNvbnN0IHBhdHRlcm5NZW1vPW5ldyBXZWFrU2V0KCk7XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIE1hdGNoIEhlbHBlcnMgSGVscGVycyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKiBGb3IgZm9yd2FyZCByZWZlcmVuY2VzIHRvIGBNYCAqL1xubGV0IE1NO1xuXG4vKipcbiAqIFRoZSBhY3R1YWwgZGVmYXVsdCB2YWx1ZXMgaGVyZSBhcmUsIGF0IHRoZSBwcmVzZW50IHRpbWUsIGZhaXJseVxuICogYXJiaXRyYXJ5IGNob2ljZXMgYW5kIG1heSBjaGFuZ2UgYmVmb3JlIHRoZXkgc2V0dGxlIGRvd24uIE9mIGNvdXJzZVxuICogYXQgc29tZSBwb2ludCB3ZSdsbCBuZWVkIHRvIHN0b3AgY2hhbmdpbmcgdGhlbS4gQnV0IHdlIHNob3VsZCBmaXJzdFxuICogc2VlIGhvdyBvdXIgc3lzdGVtIGhvbGRzIHVwIHdpdGggdGhlc2UgY2hvaWNlcy4gVGhlIG1haW4gY3JpdGVyaWFcbiAqIGlzIHRoYXQgdGhleSBiZSBiaWcgZW5vdWdoIHRoYXQgXCJub3JtYWxcIiBpbm5vY2VudCBwcm9ncmFtcyByYXJlbHlcbiAqIGVuY291bnRlciB0aGVzZSBsaW1pdHMuXG4gKlxuICogRXhwb3J0ZWQgcHJpbWFyaWx5IGZvciB0ZXN0aW5nLlxuICovXG5jb25zdCAgICAgICAgZGVmYXVsdExpbWl0cz1oYXJkZW4oe1xuZGVjaW1hbERpZ2l0c0xpbWl0OjEwMCxcbnN0cmluZ0xlbmd0aExpbWl0OjEwMF8wMDAsXG5zeW1ib2xOYW1lTGVuZ3RoTGltaXQ6MTAwLFxubnVtUHJvcGVydGllc0xpbWl0OjgwLFxucHJvcGVydHlOYW1lTGVuZ3RoTGltaXQ6MTAwLFxuYXJyYXlMZW5ndGhMaW1pdDoxMF8wMDAsXG5udW1TZXRFbGVtZW50c0xpbWl0OjEwXzAwMCxcbm51bVVuaXF1ZUJhZ0VsZW1lbnRzTGltaXQ6MTBfMDAwLFxubnVtTWFwRW50cmllc0xpbWl0OjUwMDB9KTtcblxuXG4vKipcbiAqIFVzZSB0aGUgcmVzdWx0IG9ubHkgdG8gZ2V0IHRoZSBsaW1pdHMgeW91IG5lZWQgYnkgZGVzdHJ1Y3R1cmluZy5cbiAqIFRodXMsIHRoZSByZXN1bHQgb25seSBuZWVkcyB0byBzdXBwb3J0IGRlc3RydWN0dXJpbmcuIFRoZSBjdXJyZW50XG4gKiBpbXBsZW1lbnRhdGlvbiB1c2VzIGluaGVyaXRhbmNlIGFzIGEgY2hlYXAgaGFjay5cbiAqXG4gKiBAcGFyYW0ge0xpbWl0c30gW2xpbWl0c11cbiAqIEByZXR1cm5zIHtBbGxMaW1pdHN9XG4gKi8kaOKAjV9vbmNlLmRlZmF1bHRMaW1pdHMoZGVmYXVsdExpbWl0cyk7XG5jb25zdCBsaW1pdD0obGltaXRzPXt9KT0+XG4vKiogQHR5cGUge0FsbExpbWl0c30gKi9oYXJkZW4oe19fcHJvdG9fXzpkZWZhdWx0TGltaXRzLC4uLmxpbWl0c30pO1xuXG5jb25zdCBjaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdD0oXG5wYXlsb2FkLFxubWFpblBheWxvYWRTaGFwZSxcbmNoZWNrLFxubGFiZWwpPT5cbntcbmFzc2VydChBcnJheS5pc0FycmF5KG1haW5QYXlsb2FkU2hhcGUpKTtcbmlmKCFBcnJheS5pc0FycmF5KHBheWxvYWQpKXtcbnJldHVybiBjaGVjayhmYWxzZSxYIGAke3EobGFiZWwpfSBwYXlsb2FkIG11c3QgYmUgYW4gYXJyYXk6ICR7cGF5bG9hZH1gKTtcbiB9XG5cbi8qIFdhcyB0aGUgZm9sbG93aW5nLCBidXQgaXRzIG92ZXJ1c2Ugb2YgcGF0dGVybnMgY2F1c2VkIGFuIGluZmluaXRlIHJlZ3Jlc3MqL1xuLyogY29uc3QgcGF5bG9hZExpbWl0U2hhcGUgPSBoYXJkZW4oKi9cbi8qIE0uc3BsaXQoKi9cbi8qIG1haW5QYXlsb2FkU2hhcGUsKi9cbi8qIE0ucGFydGlhbChoYXJkZW4oW00ucmVjb3JkT2YoTS5zdHJpbmcoKSwgTS5udW1iZXIoKSldKSwgaGFyZGVuKFtdKSksKi9cbi8qICksKi9cbi8qICk7Ki9cbi8qIHJldHVybiBjaGVja01hdGNoZXMocGF5bG9hZCwgcGF5bG9hZExpbWl0U2hhcGUsIGNoZWNrLCBsYWJlbCk7Ki9cblxuY29uc3QgbWFpbkxlbmd0aD1tYWluUGF5bG9hZFNoYXBlLmxlbmd0aDtcbmlmKCEocGF5bG9hZC5sZW5ndGg9PT1tYWluTGVuZ3RofHxwYXlsb2FkLmxlbmd0aD09PW1haW5MZW5ndGgrMSkpe1xucmV0dXJuIGNoZWNrKGZhbHNlLFggYCR7cShsYWJlbCl9IHBheWxvYWQgdW5leHBlY3RlZCBzaXplOiAke3BheWxvYWR9YCk7XG4gfVxuY29uc3QgbGltaXRzPXBheWxvYWRbbWFpbkxlbmd0aF07XG5wYXlsb2FkPWhhcmRlbihwYXlsb2FkLnNsaWNlKDAsbWFpbkxlbmd0aCkpO1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbmlmKCFjaGVja01hdGNoZXMocGF5bG9hZCxtYWluUGF5bG9hZFNoYXBlLGNoZWNrLGxhYmVsKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuaWYobGltaXRzPT09dW5kZWZpbmVkKXtcbnJldHVybiB0cnVlO1xuIH1cbnJldHVybihcbihwYXNzU3R5bGVPZihsaW1pdHMpPT09J2NvcHlSZWNvcmQnfHxcbmNoZWNrKGZhbHNlLFggYExpbWl0cyBtdXN0IGJlIGEgcmVjb3JkOiAke3EobGltaXRzKX1gKSkmJlxuZW50cmllcyhsaW1pdHMpLmV2ZXJ5KFxuKFtrZXksdmFsdWVdKT0+XG5wYXNzU3R5bGVPZih2YWx1ZSk9PT0nbnVtYmVyJ3x8XG5jaGVjayhmYWxzZSxYIGBWYWx1ZSBvZiBsaW1pdCAke3Eoa2V5KX0gYnV0IGJlIGEgbnVtYmVyOiAke3EodmFsdWUpfWApKSk7XG5cblxuIH07XG5cbmNvbnN0IGNoZWNrRGVjaW1hbERpZ2l0c0xpbWl0PShzcGVjaW1lbixkZWNpbWFsRGlnaXRzTGltaXQsY2hlY2spPT57XG5pZihcbk1hdGguZmxvb3IoTWF0aC5sb2cxMChNYXRoLmFicyhOdW1iZXIoc3BlY2ltZW4pKSkpKzE8PVxuZGVjaW1hbERpZ2l0c0xpbWl0KVxue1xucmV0dXJuIHRydWU7XG4gfVxucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBiaWdpbnQgJHtzcGVjaW1lbn0gbXVzdCBub3QgaGF2ZSBtb3JlIHRoYW4gJHtkZWNpbWFsRGlnaXRzTGltaXR9IGRpZ2l0c2ApO1xuXG4gfTtcblxuLyoqXG4gKiBAcmV0dXJucyB7UGF0dGVybktpdH1cbiAqL1xuY29uc3QgbWFrZVBhdHRlcm5LaXQ9KCk9Pntcbi8qKlxuICogSWYgdGhpcyBpcyBhIHJlY29nbml6ZWQgbWF0Y2ggdGFnLCByZXR1cm4gdGhlIE1hdGNoSGVscGVyLlxuICogT3RoZXJ3aXNlIHJlc3VsdCB1bmRlZmluZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICogQHJldHVybnMge01hdGNoSGVscGVyPX1cbiAqL1xuY29uc3QgbWF5YmVNYXRjaEhlbHBlcj0odGFnKT0+XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuSGVscGVyc0J5TWF0Y2hUYWdbdGFnXTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7c3RyaW5nfSBLaW5kXG4gKiBJdCBpcyBlaXRoZXIgYSBQYXNzU3R5bGUgb3RoZXIgdGhhbiAndGFnZ2VkJywgb3IsIGlmIHRoZSB1bmRlcmx5aW5nXG4gKiBQYXNzU3R5bGUgaXMgJ3RhZ2dlZCcsIHRoZW4gdGhlIGBnZXRUYWdgIHZhbHVlIGZvciB0YWdzIHRoYXQgYXJlXG4gKiByZWNvZ25pemVkIGF0IHRoZSBzdG9yZSBsZXZlbCBvZiBhYnN0cmFjdGlvbi4gRm9yIGVhY2ggb2YgdGhvc2VcbiAqIHRhZ3MsIGEgdGFnZ2VkIHJlY29yZCBvbmx5IGhhcyB0aGF0IGtpbmQgaWYgaXQgc2F0aXNmaWVzIHRoZSBpbnZhcmlhbnRzXG4gKiB0aGF0IHRoZSBzdG9yZSBsZXZlbCBhc3NvY2lhdGVzIHdpdGggdGhhdCBraW5kLlxuICovXG5cbi8qKlxuICogQHR5cGUge1dlYWtNYXA8Q29weVRhZ2dlZCwgS2luZD59XG4gKiBPbmx5IGZvciB0YWdnZWQgcmVjb3JkcyBvZiByZWNvZ25pemVkIGtpbmRzIHdob3NlIHN0b3JlLWxldmVsIGludmFyaWFudHNcbiAqIGhhdmUgYWxyZWFkeSBiZWVuIGNoZWNrZWQuXG4gKi9cbmNvbnN0IHRhZ01lbW89bmV3IFdlYWtNYXAoKTtcblxuLyoqXG4gKiBDaGVja3Mgb25seSByZWNvZ25pemVkIHRhZ3MsIGFuZCBvbmx5IGlmIHRoZSB0YWdnZWRcbiAqIHBhc3NlcyB0aGUgaW52YXJpYW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCByZWNvZ25pdGlvbi5cbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB0YWdnZWRcbiAqIEBwYXJhbSB7S2luZH0gdGFnXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tUYWdnZWQ9KHRhZ2dlZCx0YWcsY2hlY2spPT57XG5jb25zdCBtYXRjaEhlbHBlcj1tYXliZU1hdGNoSGVscGVyKHRhZyk7XG5pZihtYXRjaEhlbHBlcil7XG4vKiBCdXJpZWQgaGVyZSBpcyB0aGUgaW1wb3J0YW50IGNhc2UsIHdoZXJlIHdlIHByb2Nlc3MqL1xuLyogdGhlIHZhcmlvdXMgcGF0dGVybk5vZGVzKi9cbnJldHVybiBtYXRjaEhlbHBlci5jaGVja0lzV2VsbEZvcm1lZCh0YWdnZWQucGF5bG9hZCxjaGVjayk7XG4gfVxuc3dpdGNoKHRhZyl7XG5jYXNlJ2NvcHlTZXQnOntcbnJldHVybiBjaGVja0NvcHlTZXQodGFnZ2VkLGNoZWNrKTtcbiB9XG5jYXNlJ2NvcHlCYWcnOntcbnJldHVybiBjaGVja0NvcHlCYWcodGFnZ2VkLGNoZWNrKTtcbiB9XG5jYXNlJ2NvcHlNYXAnOntcbnJldHVybiBjaGVja0NvcHlNYXAodGFnZ2VkLGNoZWNrKTtcbiB9XG5kZWZhdWx0OntcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgY2Fubm90IGNoZWNrIHVucmVjb2duaXplZCB0YWcgJHtxKHRhZyl9OiAke3RhZ2dlZH1gKTtcblxuIH19XG5cbiB9O1xuXG4vKipcbiAqIFJldHVybnMgb25seSBhIHJlY29nbml6ZWQga2luZCwgYW5kIG9ubHkgaWYgdGhlIHNwZWNpbWVuIHBhc3NlcyB0aGVcbiAqIGludmFyaWFudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgcmVjb2duaXRpb24uXG4gKiBPdGhlcndpc2UsIGBjaGVjayhmYWxzZSwgLi4uKWAgYW5kIHJldHVybnMgdW5kZWZpbmVkXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge0tpbmQgfCB1bmRlZmluZWR9XG4gKi9cbmNvbnN0IGtpbmRPZj0oc3BlY2ltZW4sY2hlY2s9aWRlbnRDaGVja2VyKT0+e1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHNwZWNpbWVuKTtcbmlmKHBhc3NTdHlsZSE9PSd0YWdnZWQnKXtcbnJldHVybiBwYXNzU3R5bGU7XG4gfVxuLyogQXQgdGhpcyBwb2ludCB3ZSBrbm93IHRoYXQgc3BlY2ltZW4gaXMgYSB3ZWxsIGZvcm1lZCovXG4vKiBhcyBhIHRhZ2dlZCByZWNvcmQsIHdoaWNoIGlzIGRlZmluZWQgYXQgdGhlIG1hcnNoYWwgbGV2ZWwgb2YgYWJzdHJhY3Rpb24sKi9cbi8qIHNpbmNlIGBwYXNzU3R5bGVPZmAgY2hlY2tzIHRob3NlIGludmFyaWFudHMuKi9cbmlmKHRhZ01lbW8uaGFzKHNwZWNpbWVuKSl7XG5yZXR1cm4gdGFnTWVtby5nZXQoc3BlY2ltZW4pO1xuIH1cbmNvbnN0IHRhZz1nZXRUYWcoc3BlY2ltZW4pO1xuaWYoY2hlY2tUYWdnZWQoc3BlY2ltZW4sdGFnLGNoZWNrKSl7XG50YWdNZW1vLnNldChzcGVjaW1lbix0YWcpO1xucmV0dXJuIHRhZztcbiB9XG5pZihjaGVjayE9PWlkZW50Q2hlY2tlcil7XG5jaGVjayhmYWxzZSxYIGBjYW5ub3QgY2hlY2sgdW5yZWNvZ25pemVkIHRhZyAke3EodGFnKX1gKTtcbiB9XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH07XG5oYXJkZW4oa2luZE9mKTtcblxuLyoqXG4gKiBDaGVja3Mgb25seSByZWNvZ25pemVkIGtpbmRzLCBhbmQgb25seSBpZiB0aGUgc3BlY2ltZW5cbiAqIHBhc3NlcyB0aGUgaW52YXJpYW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCByZWNvZ25pdGlvbi5cbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBzcGVjaW1lblxuICogQHBhcmFtIHtLaW5kfSBraW5kXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tLaW5kPShzcGVjaW1lbixraW5kLGNoZWNrKT0+e1xuY29uc3QgcmVhbEtpbmQ9a2luZE9mKHNwZWNpbWVuLGNoZWNrKTtcbmlmKGtpbmQ9PT1yZWFsS2luZCl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5pZihjaGVjayE9PWlkZW50Q2hlY2tlcil7XG4vKiBxdW90aW5nIHdpdGhvdXQgcXVvdGVzKi9cbmNvbnN0IGRldGFpbHM9WChbIGAke3JlYWxLaW5kfSBgLGAgLSBNdXN0IGJlIGEgJHtraW5kfWBdLHNwZWNpbWVuKTtcbmNoZWNrKGZhbHNlLGRldGFpbHMpO1xuIH1cbnJldHVybiBmYWxzZTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHNwZWNpbWVuXG4gKiBAcGFyYW0ge0tleX0ga2V5QXNQYXR0ZXJuXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tBc0tleVBhdHQ9KHNwZWNpbWVuLGtleUFzUGF0dGVybixjaGVjayk9PntcbmlmKGtleUVRKHNwZWNpbWVuLGtleUFzUGF0dGVybikpe1xucmV0dXJuIHRydWU7XG4gfVxucmV0dXJuKFxuY2hlY2shPT1pZGVudENoZWNrZXImJlxuY2hlY2soZmFsc2UsWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGJlOiAke2tleUFzUGF0dGVybn1gKSk7XG5cbiB9O1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBpc1BhdHRlcm4gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiogQHR5cGUge0NoZWNrUGF0dGVybn0gKi9cbmNvbnN0IGNoZWNrUGF0dGVybj0ocGF0dCxjaGVjayk9PntcbmlmKGlzS2V5KHBhdHQpKXtcbi8qIEFsbCBrZXlzIGFyZSBwYXR0ZXJucy4gRm9yIHRoZXNlLCB0aGUga2V5TWVtbyB3aWxsIGRvLiovXG4vKiBBbGwgcHJpbWl0aXZlcyB0aGF0IGFyZSBwYXR0ZXJucyBhcmUgYWxzbyBrZXlzLCB3aGljaCB0aGlzKi9cbi8qIGFsc28gdGFrZXMgY2FyZSBvZiB3aXRob3V0IG1lbW8uIFRoZSByZXN0IG9mIG91ciBjaGVja2luZyBsb2dpYyovXG4vKiBpcyBvbmx5IGNvbmNlcm5lZCB3aXRoIG5vbi1rZXkgcGF0dGVybnMuKi9cbnJldHVybiB0cnVlO1xuIH1cbmlmKHBhdHRlcm5NZW1vLmhhcyhwYXR0KSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuY29uc3QgcmVzdWx0PWNoZWNrUGF0dGVybkludGVybmFsKHBhdHQsY2hlY2spO1xuaWYocmVzdWx0KXtcbnBhdHRlcm5NZW1vLmFkZChwYXR0KTtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gcGF0dCAtIGtub3duIG5vdCB0byBiZSBhIGtleSwgYW5kIHRoZXJlZm9yZSBrbm93blxuICogbm90IHRvIGJlIHByaW1pdGl2ZS5cbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja1BhdHRlcm5JbnRlcm5hbD0ocGF0dCxjaGVjayk9Pntcbi8qIFB1cnBvc2VseSBwYXJhbGxlbHMgY2hlY2tLZXkuIFRPRE8gcmV1c2UgbW9yZSBsb2dpYyBiZXR3ZWVuIHRoZW0uKi9cbi8qIE1vc3Qgb2YgdGhlIHRleHQgb2YgdGhlIHN3aXRjaCBiZWxvdyBub3QgZGVhbGluZyB3aXRoIG1hdGNoZXJzIGlzKi9cbi8qIGVzc2VudGlhbGx5IGlkZW50aWNhbC4qL1xuY29uc3QgY2hlY2tJdD0oY2hpbGQpPT5jaGVja1BhdHRlcm4oY2hpbGQsY2hlY2spO1xuXG5jb25zdCBraW5kPWtpbmRPZihwYXR0LGNoZWNrKTtcbnN3aXRjaChraW5kKXtcbmNhc2UgdW5kZWZpbmVkOntcbnJldHVybiBmYWxzZTtcbiB9XG5jYXNlJ2NvcHlSZWNvcmQnOntcbi8qIEEgY29weVJlY29yZCBpcyBhIHBhdHRlcm4gaWZmIGFsbCBpdHMgY2hpbGRyZW4gYXJlKi9cbi8qIHBhdHRlcm5zKi9cbnJldHVybiB2YWx1ZXMocGF0dCkuZXZlcnkoY2hlY2tJdCk7XG4gfVxuY2FzZSdjb3B5QXJyYXknOntcbi8qIEEgY29weUFycmF5IGlzIGEgcGF0dGVybiBpZmYgYWxsIGl0cyBjaGlsZHJlbiBhcmUqL1xuLyogcGF0dGVybnMqL1xucmV0dXJuIHBhdHQuZXZlcnkoY2hlY2tJdCk7XG4gfVxuY2FzZSdjb3B5TWFwJzp7XG4vKiBBIGNvcHlNYXAncyBrZXlzIGFyZSBrZXlzIGFuZCB0aGVyZWZvcmUgYWxyZWFkeSBrbm93biB0byBiZSovXG4vKiBwYXR0ZXJucy4qL1xuLyogQSBjb3B5TWFwIGlzIGEgcGF0dGVybiBpZiBpdHMgdmFsdWVzIGFyZSBwYXR0ZXJucy4qL1xucmV0dXJuIGNoZWNrUGF0dGVybihwYXR0LnZhbHVlcyxjaGVjayk7XG4gfVxuY2FzZSdlcnJvcic6XG5jYXNlJ3Byb21pc2UnOntcbnJldHVybiBjaGVjayhmYWxzZSxYIGBBICR7cShraW5kKX0gY2Fubm90IGJlIGEgcGF0dGVybmApO1xuIH1cbmRlZmF1bHQ6e1xuaWYobWF5YmVNYXRjaEhlbHBlcihraW5kKSE9PXVuZGVmaW5lZCl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYEEgcGFzc2FibGUgb2Yga2luZCAke3Eoa2luZCl9IGlzIG5vdCBhIHBhdHRlcm46ICR7cGF0dH1gKTtcblxuIH19XG5cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHBhdHRcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBpc1BhdHRlcm49KHBhdHQpPT5jaGVja1BhdHRlcm4ocGF0dCxpZGVudENoZWNrZXIpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGF0dGVybn0gcGF0dFxuICovXG5jb25zdCBhc3NlcnRQYXR0ZXJuPShwYXR0KT0+e1xuY2hlY2tQYXR0ZXJuKHBhdHQsYXNzZXJ0Q2hlY2tlcik7XG4gfTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gaXNLZXlQYXR0ZXJuIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqIEB0eXBlIHtDaGVja0tleVBhdHRlcm59ICovXG5jb25zdCBjaGVja0tleVBhdHRlcm49KHBhdHQsY2hlY2spPT57XG5pZihpc0tleShwYXR0KSl7XG4vKiBJbiBwcmluY2lwbGUsIGFsbCBrZXlzIGFyZSBwYXR0ZXJucywgYnV0IG9ubHkgc2NhbGFycyBhcmUgY3VycmVudGx5Ki9cbi8qIHN1cHBvcnRlZCBhcyBrZXlzLiovXG5yZXR1cm4gY2hlY2soaXNTY2FsYXJLZXkocGF0dCksWCBgbm9uLXNjYWxhciBrZXlzIGFyZSBub3QgeWV0IHN1cHBvcnRlZGApO1xuIH1cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5yZXR1cm4gY2hlY2tLZXlQYXR0ZXJuSW50ZXJuYWwocGF0dCxjaGVjayk7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBwYXR0XG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tLZXlQYXR0ZXJuSW50ZXJuYWw9KHBhdHQsY2hlY2spPT57XG4vKiBQdXJwb3NlbHkgcGFyYWxsZWxzIGNoZWNrS2V5LiBUT0RPIHJldXNlIG1vcmUgbG9naWMgYmV0d2VlbiB0aGVtLiovXG4vKiBNb3N0IG9mIHRoZSB0ZXh0IG9mIHRoZSBzd2l0Y2ggYmVsb3cgbm90IGRlYWxpbmcgd2l0aCBtYXRjaGVycyBpcyovXG4vKiBlc3NlbnRpYWxseSBpZGVudGljYWwuKi9cbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihwYXR0KTtcbnN3aXRjaChwYXNzU3R5bGUpe1xuY2FzZSdjb3B5UmVjb3JkJzpcbmNhc2UnY29weUFycmF5Jzp7XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgbm9uLXNjYWxhciBrZXlzIGFyZSBub3QgeWV0IHN1cHBvcnRlZGApO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5jb25zdCB0YWc9Z2V0VGFnKHBhdHQpO1xuY29uc3QgbWF0Y2hIZWxwZXI9bWF5YmVNYXRjaEhlbHBlcih0YWcpO1xuaWYobWF0Y2hIZWxwZXIhPT11bmRlZmluZWQpe1xuLyogVGhpcyBjaGVjayBndWFyYW50ZWVzIHRoZSBwYXlsb2FkIGludmFyaWFudHMgYXNzdW1lZCBieSB0aGUgb3RoZXIqL1xuLyogbWF0Y2hIZWxwZXIgbWV0aG9kcy4qL1xucmV0dXJuIG1hdGNoSGVscGVyLmNoZWNrS2V5UGF0dGVybihwYXR0LnBheWxvYWQsY2hlY2spO1xuIH1cbnN3aXRjaCh0YWcpe1xuY2FzZSdjb3B5U2V0JzpcbmNhc2UnY29weU1hcCc6e1xucmV0dXJuIGNoZWNrKGZhbHNlLFggYG5vbi1zY2FsYXIga2V5cyBhcmUgbm90IHlldCBzdXBwb3J0ZWRgKTtcbiB9XG5kZWZhdWx0OntcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgQSBwYXNzYWJsZSB0YWdnZWQgJHtxKHRhZyl9IGlzIG5vdCBhIGtleTogJHtwYXR0fWApO1xuXG4gfX1cblxuIH1cbmNhc2UnZXJyb3InOlxuY2FzZSdwcm9taXNlJzp7XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgQSAke3EocGFzc1N0eWxlKX0gY2Fubm90IGJlIGEgcGF0dGVybmApO1xuIH1cbmRlZmF1bHQ6e1xuLyogVW5leHBlY3RlZCB0YWdzIGFyZSBqdXN0IG5vbi1wYXR0ZXJucywgYnV0IGFuIHVuZXhwZWN0ZWQgcGFzc1N0eWxlKi9cbi8qIGlzIGFsd2F5cyBhbiBlcnJvci4qL1xudGhyb3cgRmFpbCBgdW5leHBlY3RlZCBwYXNzU3R5bGUgJHtxKHBhc3NTdHlsZSl9OiAke3BhdHR9YDtcbiB9fVxuXG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBwYXR0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgaXNLZXlQYXR0ZXJuPShwYXR0KT0+Y2hlY2tLZXlQYXR0ZXJuKHBhdHQsaWRlbnRDaGVja2VyKTtcblxuLyoqXG4gKiBAcGFyYW0ge1BhdHRlcm59IHBhdHRcbiAqL1xuY29uc3QgYXNzZXJ0S2V5UGF0dGVybj0ocGF0dCk9PntcbmNoZWNrS2V5UGF0dGVybihwYXR0LGFzc2VydENoZWNrZXIpO1xuIH07XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIG1hdGNoZXMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7UGF0dGVybn0gcGF0dGVyblxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBbbGFiZWxdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tNYXRjaGVzPShzcGVjaW1lbixwYXR0ZXJuLGNoZWNrLGxhYmVsPXVuZGVmaW5lZCk9PlxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbmFwcGx5TGFiZWxpbmdFcnJvcihjaGVja01hdGNoZXNJbnRlcm5hbCxbc3BlY2ltZW4scGF0dGVybixjaGVja10sbGFiZWwpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHNwZWNpbWVuXG4gKiBAcGFyYW0ge1BhdHRlcm59IHBhdHRcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja01hdGNoZXNJbnRlcm5hbD0oc3BlY2ltZW4scGF0dCxjaGVjayk9Pntcbi8qIFdvcnRoIGJlaW5nIGEgYml0IHZlcmJvc2UgYW5kIHJlcGV0aXRpdmUgaW4gb3JkZXIgdG8gb3B0aW1pemUqL1xuY29uc3QgcGF0dGVybktpbmQ9a2luZE9mKHBhdHQsY2hlY2spO1xuY29uc3Qgc3BlY2ltZW5LaW5kPWtpbmRPZihzcGVjaW1lbik7LyogbWF5IGJlIHVuZGVmaW5lZCovXG5zd2l0Y2gocGF0dGVybktpbmQpe1xuY2FzZSB1bmRlZmluZWQ6e1xucmV0dXJuIEZhaWwgYHBhdHRlcm4gZXhwZWN0ZWQ6ICR7cGF0dH1gO1xuIH1cbmNhc2UncHJvbWlzZSc6e1xucmV0dXJuIEZhaWwgYHByb21pc2VzIGNhbm5vdCBiZSBwYXR0ZXJuczogJHtwYXR0fWA7XG4gfVxuY2FzZSdlcnJvcic6e1xucmV0dXJuIEZhaWwgYGVycm9ycyBjYW5ub3QgYmUgcGF0dGVybnM6ICR7cGF0dH1gO1xuIH1cbmNhc2UndW5kZWZpbmVkJzpcbmNhc2UnbnVsbCc6XG5jYXNlJ2Jvb2xlYW4nOlxuY2FzZSdudW1iZXInOlxuY2FzZSdiaWdpbnQnOlxuY2FzZSdzdHJpbmcnOlxuY2FzZSdzeW1ib2wnOlxuY2FzZSdjb3B5U2V0JzpcbmNhc2UnY29weUJhZyc6XG5jYXNlJ3JlbW90YWJsZSc6e1xuLyogVGhlc2Uga2luZHMgYXJlIG5lY2Vzc2FyaWx5IGtleXMqL1xucmV0dXJuIGNoZWNrQXNLZXlQYXR0KHNwZWNpbWVuLHBhdHQsY2hlY2spO1xuIH1cbmNhc2UnY29weUFycmF5Jzp7XG5pZihpc0tleShwYXR0KSl7XG4vKiBUYWtlcyBjYXJlIG9mIHBhdHRlcm5zIHdoaWNoIGFyZSBrZXlzLCBzbyB0aGUgcmVzdCBvZiB0aGlzKi9cbi8qIGxvZ2ljIGNhbiBhc3N1bWUgcGF0dGVybnMgdGhhdCBhcmUgbm90IGtleXMuKi9cbnJldHVybiBjaGVja0FzS2V5UGF0dChzcGVjaW1lbixwYXR0LGNoZWNrKTtcbiB9XG5pZihzcGVjaW1lbktpbmQhPT0nY29weUFycmF5Jyl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYCR7c3BlY2ltZW59IC0gTXVzdCBiZSBhIGNvcHlBcnJheSB0byBtYXRjaCBhIGNvcHlBcnJheSBwYXR0ZXJuOiAke3BhdHR9YCk7XG5cbiB9XG5jb25zdHtsZW5ndGh9PXBhdHQ7XG5pZihzcGVjaW1lbi5sZW5ndGghPT1sZW5ndGgpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBBcnJheSAke3NwZWNpbWVufSAtIE11c3QgYmUgYXMgbG9uZyBhcyBjb3B5QXJyYXkgcGF0dGVybjogJHtwYXR0fWApO1xuXG4gfVxucmV0dXJuIHBhdHQuZXZlcnkoKHAsaSk9PmNoZWNrTWF0Y2hlcyhzcGVjaW1lbltpXSxwLGNoZWNrLGkpKTtcbiB9XG5jYXNlJ2NvcHlSZWNvcmQnOntcbmlmKGlzS2V5KHBhdHQpKXtcbi8qIFRha2VzIGNhcmUgb2YgcGF0dGVybnMgd2hpY2ggYXJlIGtleXMsIHNvIHRoZSByZXN0IG9mIHRoaXMqL1xuLyogbG9naWMgY2FuIGFzc3VtZSBwYXR0ZXJucyB0aGF0IGFyZSBub3Qga2V5cy4qL1xucmV0dXJuIGNoZWNrQXNLZXlQYXR0KHNwZWNpbWVuLHBhdHQsY2hlY2spO1xuIH1cbmlmKHNwZWNpbWVuS2luZCE9PSdjb3B5UmVjb3JkJyl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYCR7c3BlY2ltZW59IC0gTXVzdCBiZSBhIGNvcHlSZWNvcmQgdG8gbWF0Y2ggYSBjb3B5UmVjb3JkIHBhdHRlcm46ICR7cGF0dH1gKTtcblxuIH1cbi8qIFRPRE8gRGV0ZWN0IGFuZCBhY2N1bXVsYXRlIGRpZmZlcmVuY2UgaW4gb25lIHBhc3MuKi9cbi8qIFJhdGhlciB0aGFuIHVzaW5nIHR3byBjYWxscyB0byBgbGlzdERpZmZlcmVuY2VgIHRvIGRldGVjdCBhbmQqL1xuLyogcmVwb3J0IGlmIGFuZCBob3cgdGhlc2UgbGlzdHMgZGlmZmVyLCBzaW5jZSB0aGV5IGFyZSBhbHJlYWR5Ki9cbi8qIGluIHNvcnRlZCBvcmRlciwgd2Ugc2hvdWxkIGluc3RlYWQgdXNlIGFuIGFsZ29yaXRobSBsaWtlKi9cbi8qIGBpdGVyRGlzam9pbnRVbmlvbmAgZnJvbSBtZXJnZS1zb3J0LW9wZXJhdG9ycy5qcyovXG5jb25zdCBzcGVjaW1lbk5hbWVzPXJlY29yZE5hbWVzKHNwZWNpbWVuKTtcbmNvbnN0IHBhdHROYW1lcz1yZWNvcmROYW1lcyhwYXR0KTtcbmNvbnN0IG1pc3Npbmc9bGlzdERpZmZlcmVuY2UocGF0dE5hbWVzLHNwZWNpbWVuTmFtZXMpO1xuaWYobWlzc2luZy5sZW5ndGg+PTEpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGAke3NwZWNpbWVufSAtIE11c3QgaGF2ZSBtaXNzaW5nIHByb3BlcnRpZXMgJHtxKG1pc3NpbmcpfWApO1xuXG4gfVxuY29uc3QgdW5leHBlY3RlZD1saXN0RGlmZmVyZW5jZShzcGVjaW1lbk5hbWVzLHBhdHROYW1lcyk7XG5pZih1bmV4cGVjdGVkLmxlbmd0aD49MSl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYCR7c3BlY2ltZW59IC0gTXVzdCBub3QgaGF2ZSB1bmV4cGVjdGVkIHByb3BlcnRpZXM6ICR7cShcbnVuZXhwZWN0ZWQpXG4gfWApO1xuXG4gfVxuY29uc3Qgc3BlY2ltZW5WYWx1ZXM9cmVjb3JkVmFsdWVzKHNwZWNpbWVuLHNwZWNpbWVuTmFtZXMpO1xuY29uc3QgcGF0dFZhbHVlcz1yZWNvcmRWYWx1ZXMocGF0dCxwYXR0TmFtZXMpO1xucmV0dXJuIHBhdHROYW1lcy5ldmVyeSgobGFiZWwsaSk9PlxuY2hlY2tNYXRjaGVzKHNwZWNpbWVuVmFsdWVzW2ldLHBhdHRWYWx1ZXNbaV0sY2hlY2ssbGFiZWwpKTtcblxuIH1cbmNhc2UnY29weU1hcCc6e1xuaWYoaXNLZXkocGF0dCkpe1xuLyogVGFrZXMgY2FyZSBvZiBwYXR0ZXJucyB3aGljaCBhcmUga2V5cywgc28gdGhlIHJlc3Qgb2YgdGhpcyovXG4vKiBsb2dpYyBjYW4gYXNzdW1lIHBhdHRlcm5zIHRoYXQgYXJlIG5vdCBrZXlzLiovXG5yZXR1cm4gY2hlY2tBc0tleVBhdHQoc3BlY2ltZW4scGF0dCxjaGVjayk7XG4gfVxuaWYoc3BlY2ltZW5LaW5kIT09J2NvcHlNYXAnKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGJlIGEgY29weU1hcCB0byBtYXRjaCBhIGNvcHlNYXAgcGF0dGVybjogJHtwYXR0fWApO1xuXG4gfVxuY29uc3R7cGF5bG9hZDpwYXR0UGF5bG9hZH09cGF0dDtcbmNvbnN0e3BheWxvYWQ6c3BlY2ltZW5QYXlsb2FkfT1zcGVjaW1lbjtcbmNvbnN0IHBhdHRLZXlTZXQ9Y29weU1hcEtleVNldChwYXR0UGF5bG9hZCk7XG5jb25zdCBzcGVjaW1lbktleVNldD1jb3B5TWFwS2V5U2V0KHNwZWNpbWVuUGF5bG9hZCk7XG4vKiBDb21wYXJlIGtleXMgYXMgY29weVNldHMqL1xuaWYoIWNoZWNrTWF0Y2hlcyhzcGVjaW1lbktleVNldCxwYXR0S2V5U2V0LGNoZWNrKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuY29uc3QgcGF0dFZhbHVlcz1wYXR0UGF5bG9hZC52YWx1ZXM7XG5jb25zdCBzcGVjaW1lblZhbHVlcz1zcGVjaW1lblBheWxvYWQudmFsdWVzO1xuLyogY29tcGFyZSB2YWx1ZXMgYXMgY29weUFycmF5cyovXG5yZXR1cm4gY2hlY2tNYXRjaGVzKHNwZWNpbWVuVmFsdWVzLHBhdHRWYWx1ZXMsY2hlY2spO1xuIH1cbmRlZmF1bHQ6e1xuY29uc3QgbWF0Y2hIZWxwZXI9bWF5YmVNYXRjaEhlbHBlcihwYXR0ZXJuS2luZCk7XG5pZihtYXRjaEhlbHBlcil7XG5yZXR1cm4gbWF0Y2hIZWxwZXIuY2hlY2tNYXRjaGVzKHNwZWNpbWVuLHBhdHQucGF5bG9hZCxjaGVjayk7XG4gfVxudGhyb3cgRmFpbCBgaW50ZXJuYWw6IHNob3VsZCBoYXZlIHJlY29nbml6ZWQgJHtxKHBhdHRlcm5LaW5kKX0gYDtcbiB9fVxuXG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBzcGVjaW1lblxuICogQHBhcmFtIHtQYXR0ZXJufSBwYXR0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgbWF0Y2hlcz0oc3BlY2ltZW4scGF0dCk9PlxuY2hlY2tNYXRjaGVzKHNwZWNpbWVuLHBhdHQsaWRlbnRDaGVja2VyKTtcblxuLyoqXG4gKiBSZXR1cm5pbmcgbm9ybWFsbHkgaW5kaWNhdGVzIHN1Y2Nlc3MuIE1hdGNoIGZhaWx1cmUgaXMgaW5kaWNhdGVkIGJ5XG4gKiB0aHJvd2luZy5cbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBzcGVjaW1lblxuICogQHBhcmFtIHtQYXR0ZXJufSBwYXR0XG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IFtsYWJlbF1cbiAqL1xuY29uc3QgZml0PShzcGVjaW1lbixwYXR0LGxhYmVsPXVuZGVmaW5lZCk9PntcbmlmKGNoZWNrTWF0Y2hlcyhzcGVjaW1lbixwYXR0LGlkZW50Q2hlY2tlcixsYWJlbCkpe1xucmV0dXJuO1xuIH1cbi8qIHNob3VsZCBvbmx5IHRocm93Ki9cbmNoZWNrTWF0Y2hlcyhzcGVjaW1lbixwYXR0LGFzc2VydENoZWNrZXIsbGFiZWwpO1xuRmFpbCBgaW50ZXJuYWw6ICR7bGFiZWx9OiBpbmNvbnNpc3RlbnQgcGF0dGVybiBtYXRjaDogJHtxKHBhdHQpfWA7XG4gfTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gZ2V0UmFua0NvdmVyIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqIEB0eXBlIHtHZXRSYW5rQ292ZXJ9ICovXG5jb25zdCBnZXRSYW5rQ292ZXI9KHBhdHQsZW5jb2RlUGFzc2FibGUpPT57XG5pZihpc0tleShwYXR0KSl7XG5jb25zdCBlbmNvZGVkPWVuY29kZVBhc3NhYmxlKHBhdHQpO1xuaWYoZW5jb2RlZCE9PXVuZGVmaW5lZCl7XG5yZXR1cm5bZW5jb2RlZCwgYCR7ZW5jb2RlZH1+YF07XG4gfVxuIH1cbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihwYXR0KTtcbnN3aXRjaChwYXNzU3R5bGUpe1xuY2FzZSdjb3B5QXJyYXknOntcbi8qIFhYWCB0aGlzIGRvZXNuJ3QgZ2V0IGFsb25nIHdpdGggdGhlIHdvcmxkIG9mIGNvdmVyID09PSBwYWlyIG9mKi9cbi8qIHN0cmluZ3MuIEluIHRoZSBtZWFudGltZSwgZmFsbCB0aHJvdWdoIHRvIHRoZSBkZWZhdWx0IHdoaWNoKi9cbi8qIHJldHVybnMgYSBjb3ZlciB0aGF0IGNvdmVycyBhbGwgY29weUFycmF5cy4qL1xuLyoqL1xuLyogY29uc3QgcmFua0NvdmVycyA9IHBhdHQubWFwKHAgPT4gZ2V0UmFua0NvdmVyKHAsIGVuY29kZVBhc3NhYmxlKSk7Ki9cbi8qIHJldHVybiBoYXJkZW4oWyovXG4vKiByYW5rQ292ZXJzLm1hcCgoW2xlZnQsIF9yaWdodF0pID0+IGxlZnQpLCovXG4vKiByYW5rQ292ZXJzLm1hcCgoW19sZWZ0LCByaWdodF0pID0+IHJpZ2h0KSwqL1xuLyogXSk7Ki9cbmJyZWFrO1xuIH1cbmNhc2UnY29weVJlY29yZCc6e1xuLyogWFhYIHRoaXMgZG9lc24ndCBnZXQgYWxvbmcgd2l0aCB0aGUgd29ybGQgb2YgY292ZXIgPT09IHBhaXIgb2YqL1xuLyogc3RyaW5ncy4gSW4gdGhlIG1lYW50aW1lLCBmYWxsIHRocm91Z2ggdG8gdGhlIGRlZmF1bHQgd2hpY2gqL1xuLyogcmV0dXJucyBhIGNvdmVyIHRoYXQgY292ZXJzIGFsbCBjb3B5UmVjb3Jkcy4qL1xuLyoqL1xuLyogY29uc3QgcGF0dEtleXMgPSBvd25LZXlzKHBhdHQpOyovXG4vKiBjb25zdCBwYXR0RW50cmllcyA9IGhhcmRlbihwYXR0S2V5cy5tYXAoa2V5ID0+IFtrZXksIHBhdHRba2V5XV0pKTsqL1xuLyogY29uc3QgW2xlZnRFbnRyaWVzTGltaXQsIHJpZ2h0RW50cmllc0xpbWl0XSA9Ki9cbi8qIGdldFJhbmtDb3ZlcihwYXR0RW50cmllcyk7Ki9cbi8qIHJldHVybiBoYXJkZW4oWyovXG4vKiBmcm9tVW5pcXVlRW50cmllcyhsZWZ0RW50cmllc0xpbWl0KSwqL1xuLyogZnJvbVVuaXF1ZUVudHJpZXMocmlnaHRFbnRyaWVzTGltaXQpLCovXG4vKiBdKTsqL1xuYnJlYWs7XG4gfVxuY2FzZSd0YWdnZWQnOntcbmNvbnN0IHRhZz1nZXRUYWcocGF0dCk7XG5jb25zdCBtYXRjaEhlbHBlcj1tYXliZU1hdGNoSGVscGVyKHRhZyk7XG5pZihtYXRjaEhlbHBlcil7XG4vKiBCdXJpZWQgaGVyZSBpcyB0aGUgaW1wb3J0YW50IGNhc2UsIHdoZXJlIHdlIHByb2Nlc3MqL1xuLyogdGhlIHZhcmlvdXMgcGF0dGVybk5vZGVzKi9cbnJldHVybiBtYXRjaEhlbHBlci5nZXRSYW5rQ292ZXIocGF0dC5wYXlsb2FkLGVuY29kZVBhc3NhYmxlKTtcbiB9XG5zd2l0Y2godGFnKXtcbmNhc2UnY29weVNldCc6e1xuLyogWFhYIHRoaXMgZG9lc24ndCBnZXQgYWxvbmcgd2l0aCB0aGUgd29ybGQgb2YgY292ZXIgPT09IHBhaXIgb2YqL1xuLyogc3RyaW5ncy4gSW4gdGhlIG1lYW50aW1lLCBmYWxsIHRocm91Z2ggdG8gdGhlIGRlZmF1bHQgd2hpY2gqL1xuLyogcmV0dXJucyBhIGNvdmVyIHRoYXQgY292ZXJzIGFsbCBjb3B5U2V0cy4qL1xuLyoqL1xuLyogLy8gU2hvdWxkIGFscmVhZHkgYmUgdmFsaWRhdGVkIGJ5IGNoZWNrUGF0dGVybi4gQnV0IGJlY2F1c2UgdGhpcyovXG4vKiAvLyBpcyBhIGNoZWNrIHRoYXQgbWF5IGxvb3NlbiBvdmVyIHRpbWUsIHdlIGFsc28gYXNzZXJ0Ki9cbi8qIC8vIGV2ZXJ5d2hlcmUgd2Ugc3RpbGwgcmVseSBvbiB0aGUgcmVzdHJpY3Rpb24uKi9cbi8qIGBgYGpzKi9cbi8qIHBhdHQucGF5bG9hZC5sZW5ndGggPT09IDEgfHwqL1xuLyogRmFpbGBOb24tc2luZ2xldG9uIGNvcHlTZXRzIHdpdGggbWF0Y2hlciBub3QgeWV0IGltcGxlbWVudGVkOiAke3BhdHR9YDsqL1xuLyogYGBgKi9cbi8qKi9cbi8qIGNvbnN0IFtsZWZ0RWxlbWVudExpbWl0LCByaWdodEVsZW1lbnRMaW1pdF0gPSBnZXRSYW5rQ292ZXIoKi9cbi8qIHBhdHQucGF5bG9hZFswXSwqL1xuLyogKTsqL1xuLyogcmV0dXJuIGhhcmRlbihbKi9cbi8qIG1ha2VDb3B5U2V0KFtsZWZ0RWxlbWVudExpbWl0XSksKi9cbi8qIG1ha2VDb3B5U2V0KFtyaWdodEVsZW1lbnRMaW1pdF0pLCovXG4vKiBdKTsqL1xuYnJlYWs7XG4gfVxuY2FzZSdjb3B5TWFwJzp7XG4vKiBYWFggdGhpcyBkb2Vzbid0IGdldCBhbG9uZyB3aXRoIHRoZSB3b3JsZCBvZiBjb3ZlciA9PT0gcGFpciBvZiovXG4vKiBzdHJpbmdzLiBJbiB0aGUgbWVhbnRpbWUsIGZhbGwgdGhyb3VnaCB0byB0aGUgZGVmYXVsdCB3aGljaCovXG4vKiByZXR1cm5zIGEgY292ZXIgdGhhdCBjb3ZlcnMgYWxsIGNvcHlNYXBzLiovXG4vKiovXG4vKiAvLyBBIG1hdGNoaW5nIGNvcHlNYXAgbXVzdCBoYXZlIHRoZSBzYW1lIGtleXMsIG9yIGF0IG1vc3Qgb25lKi9cbi8qIC8vIG5vbi1rZXkga2V5IHBhdHRlcm4uIFRodXMgd2UgY2FuIGFzc3VtZSB0aGF0IHZhbHVlIHBvc2l0aW9ucyovXG4vKiAvLyBtYXRjaCAxLXRvLTEuKi9cbi8qIC8vKi9cbi8qIC8vIFRPRE8gSSBtYXkgYmUgb3Zlcmxvb2tpbmcgdGhhdCB0aGUgbGVzcyBwcmVjaXNlIHJhbmtPcmRlciovXG4vKiAvLyBlcXVpdmFsZW5jZSBjbGFzcyBtYXkgY2F1c2UgdmFsdWVzIHRvIGJlIG91dCBvZiBvcmRlciwqL1xuLyogLy8gbWFraW5nIHRoaXMgcmFua0NvdmVyIG5vdCBhY3R1YWxseSBjb3Zlci4gSW4gdGhhdCBjYXNlLCBmb3IqL1xuLyogLy8gYWxsIHRoZSB2YWx1ZXMgZm9yIGtleXMgYXQgdGhlIHNhbWUgcmFuaywgd2Ugc2hvdWxkIHVuaW9uIHRoZWlyKi9cbi8qIC8vIHJhbmsgY292ZXJzLiBUT0RPIFBPU1NJQkxFIFNJTEVOVCBDT1JSRUNUTkVTUyBCVUcqL1xuLyogLy8qL1xuLyogLy8gSWYgdGhpcyBpcyBhIGJ1ZywgaXQgcHJvYmFibHkgYWZmZWN0cyB0aGUgZ2V0UmFua0NvdmVyKi9cbi8qIC8vIGNhc2VzIG9mIG1hdGNoTFRFSGVscGVyIGFuZCBtYXRjaEdURUhlbHBlciBvbiBjb3B5TWFwIGFzKi9cbi8qIC8vIHdlbGwuIFNlZSBtYWtlQ29weU1hcCBmb3IgYW4gaWRlYSBvbiBmaXhpbmcqL1xuLyogLy8gdGhpcyBidWcuKi9cbi8qIGNvbnN0IFtsZWZ0UGF5bG9hZExpbWl0LCByaWdodFBheWxvYWRMaW1pdF0gPSBnZXRSYW5rQ292ZXIoKi9cbi8qIHBhdHQucGF5bG9hZCwqL1xuLyogZW5jb2RlUGFzc2FibGUsKi9cbi8qICk7Ki9cbi8qIHJldHVybiBoYXJkZW4oWyovXG4vKiBtYWtlVGFnZ2VkKCdjb3B5TWFwJywgbGVmdFBheWxvYWRMaW1pdCksKi9cbi8qIG1ha2VUYWdnZWQoJ2NvcHlNYXAnLCByaWdodFBheWxvYWRMaW1pdCksKi9cbi8qIF0pOyovXG5icmVhaztcbiB9XG5kZWZhdWx0OntcbmJyZWFrOy8qIGZhbGwgdGhyb3VnaCB0byBkZWZhdWx0Ki9cbiB9fVxuXG5icmVhazsvKiBmYWxsIHRocm91Z2ggdG8gZGVmYXVsdCovXG4gfVxuZGVmYXVsdDp7XG5icmVhazsvKiBmYWxsIHRocm91Z2ggdG8gZGVmYXVsdCovXG4gfX1cblxucmV0dXJuIGdldFBhc3NTdHlsZUNvdmVyKHBhc3NTdHlsZSk7XG4gfTtcblxuY29uc3QgYXJyYXlFdmVyeU1hdGNoUGF0dGVybj0oYXJyYXkscGF0dCxjaGVjayxsYWJlbFByZWZpeD0nJyk9PntcbmlmKGNoZWNrS2luZChwYXR0LCdtYXRjaDphbnknLGlkZW50Q2hlY2tlcikpe1xuLyogaWYgdGhlIHBhdHRlcm4gaXMgTS5hbnkoKSwgd2Uga25vdyBpdHMgdHJ1ZSovXG5yZXR1cm4gdHJ1ZTtcbiB9XG5yZXR1cm4gYXJyYXkuZXZlcnkoKGVsLGkpPT5cbmNoZWNrTWF0Y2hlcyhlbCxwYXR0LGNoZWNrLCBgJHtsYWJlbFByZWZpeH1bJHtpfV1gKSk7XG5cbiB9O1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBNYXRjaCBIZWxwZXJzIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hBbnlIZWxwZXI9RmFyKCdtYXRjaDphbnkgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KF9zcGVjaW1lbixfbWF0Y2hlclBheWxvYWQsX2NoZWNrKT0+dHJ1ZSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KG1hdGNoZXJQYXlsb2FkLGNoZWNrKT0+XG5tYXRjaGVyUGF5bG9hZD09PXVuZGVmaW5lZHx8XG5jaGVjayhmYWxzZSxYIGBtYXRjaDphbnkgcGF5bG9hZDogJHttYXRjaGVyUGF5bG9hZH0gLSBNdXN0IGJlIHVuZGVmaW5lZGApLFxuXG5nZXRSYW5rQ292ZXI6KF9tYXRjaFBheWxvYWQsX2VuY29kZVBhc3NhYmxlKT0+WycnLCd7J10sXG5cbmNoZWNrS2V5UGF0dGVybjooX21hdGNoZXJQYXlsb2FkLF9jaGVjayk9PnRydWV9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hBbmRIZWxwZXI9RmFyKCdtYXRjaDphbmQgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLHBhdHRzLGNoZWNrKT0+e1xucmV0dXJuIHBhdHRzLmV2ZXJ5KChwYXR0KT0+Y2hlY2tNYXRjaGVzKHNwZWNpbWVuLHBhdHQsY2hlY2spKTtcbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDooYWxsZWdlZFBhdHRzLGNoZWNrKT0+e1xuY29uc3QgY2hlY2tJdD0ocGF0dCk9PmNoZWNrUGF0dGVybihwYXR0LGNoZWNrKTtcbnJldHVybihcbihwYXNzU3R5bGVPZihhbGxlZ2VkUGF0dHMpPT09J2NvcHlBcnJheSd8fFxuY2hlY2soZmFsc2UsWCBgTmVlZHMgYXJyYXkgb2Ygc3ViLXBhdHRlcm5zOiAke2FsbGVnZWRQYXR0c31gKSkmJlxuYWxsZWdlZFBhdHRzLmV2ZXJ5KGNoZWNrSXQpKTtcblxuIH0sXG5cbmdldFJhbmtDb3ZlcjoocGF0dHMsZW5jb2RlUGFzc2FibGUpPT5cbmludGVyc2VjdFJhbmtDb3ZlcnMoXG5jb21wYXJlUmFuayxcbnBhdHRzLm1hcCgocCk9PmdldFJhbmtDb3ZlcihwLGVuY29kZVBhc3NhYmxlKSkpLFxuXG5cbmNoZWNrS2V5UGF0dGVybjoocGF0dHMsY2hlY2spPT57XG5yZXR1cm4gcGF0dHMuZXZlcnkoKHBhdHQpPT5jaGVja0tleVBhdHRlcm4ocGF0dCxjaGVjaykpO1xuIH19KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hPckhlbHBlcj1GYXIoJ21hdGNoOm9yIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixwYXR0cyxjaGVjayk9PntcbmNvbnN0e2xlbmd0aH09cGF0dHM7XG5pZihsZW5ndGg9PT0wKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgJHtzcGVjaW1lbn0gLSBubyBwYXR0ZXJuIGRpc2p1bmN0cyB0byBtYXRjaDogJHtwYXR0c31gKTtcblxuIH1cbmlmKFxucGF0dHMubGVuZ3RoPT09MiYmXG4hbWF0Y2hlcyhzcGVjaW1lbixwYXR0c1swXSkmJlxuY2hlY2tLaW5kKHBhdHRzWzBdLCdtYXRjaDpraW5kJyxpZGVudENoZWNrZXIpJiZcbnBhdHRzWzBdLnBheWxvYWQ9PT0ndW5kZWZpbmVkJylcbntcbi8qIFdvcnRoIHNwZWNpYWwgY2FzaW5nIHRoZSBvcHRpb25hbCBwYXR0ZXJuIGZvciovXG4vKiBiZXR0ZXIgZXJyb3IgbWVzc2FnZXMuKi9cbnJldHVybiBjaGVja01hdGNoZXMoc3BlY2ltZW4scGF0dHNbMV0sY2hlY2spO1xuIH1cbmlmKHBhdHRzLnNvbWUoKHBhdHQpPT5tYXRjaGVzKHNwZWNpbWVuLHBhdHQpKSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgJHtzcGVjaW1lbn0gLSBNdXN0IG1hdGNoIG9uZSBvZiAke3BhdHRzfWApO1xuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOm1hdGNoQW5kSGVscGVyLmNoZWNrSXNXZWxsRm9ybWVkLFxuXG5nZXRSYW5rQ292ZXI6KHBhdHRzLGVuY29kZVBhc3NhYmxlKT0+XG51bmlvblJhbmtDb3ZlcnMoXG5jb21wYXJlUmFuayxcbnBhdHRzLm1hcCgocCk9PmdldFJhbmtDb3ZlcihwLGVuY29kZVBhc3NhYmxlKSkpLFxuXG5cbmNoZWNrS2V5UGF0dGVybjoocGF0dHMsY2hlY2spPT57XG5yZXR1cm4gcGF0dHMuZXZlcnkoKHBhdHQpPT5jaGVja0tleVBhdHRlcm4ocGF0dCxjaGVjaykpO1xuIH19KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hOb3RIZWxwZXI9RmFyKCdtYXRjaDpub3QgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLHBhdHQsY2hlY2spPT57XG5pZihtYXRjaGVzKHNwZWNpbWVuLHBhdHQpKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGZhaWwgbmVnYXRlZCBwYXR0ZXJuOiAke3BhdHR9YCk7XG5cbiB9ZWxzZXtcbnJldHVybiB0cnVlO1xuIH1cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDpjaGVja1BhdHRlcm4sXG5cbmdldFJhbmtDb3ZlcjooX3BhdHQsX2VuY29kZVBhc3NhYmxlKT0+WycnLCd7J10sXG5cbmNoZWNrS2V5UGF0dGVybn0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaFNjYWxhckhlbHBlcj1GYXIoJ21hdGNoOnNjYWxhciBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4sX21hdGNoZXJQYXlsb2FkLGNoZWNrKT0+XG5jaGVja1NjYWxhcktleShzcGVjaW1lbixjaGVjayksXG5cbmNoZWNrSXNXZWxsRm9ybWVkOm1hdGNoQW55SGVscGVyLmNoZWNrSXNXZWxsRm9ybWVkLFxuXG5nZXRSYW5rQ292ZXI6KF9tYXRjaFBheWxvYWQsX2VuY29kZVBhc3NhYmxlKT0+WydhJywnen4nXSxcblxuY2hlY2tLZXlQYXR0ZXJuOihfbWF0Y2hlclBheWxvYWQsX2NoZWNrKT0+dHJ1ZX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaEtleUhlbHBlcj1GYXIoJ21hdGNoOmtleSBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4sX21hdGNoZXJQYXlsb2FkLGNoZWNrKT0+XG5jaGVja0tleShzcGVjaW1lbixjaGVjayksXG5cbmNoZWNrSXNXZWxsRm9ybWVkOm1hdGNoQW55SGVscGVyLmNoZWNrSXNXZWxsRm9ybWVkLFxuXG5nZXRSYW5rQ292ZXI6KF9tYXRjaFBheWxvYWQsX2VuY29kZVBhc3NhYmxlKT0+WydhJywnen4nXSxcblxuY2hlY2tLZXlQYXR0ZXJuOihfbWF0Y2hlclBheWxvYWQsX2NoZWNrKT0+dHJ1ZX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaFBhdHRlcm5IZWxwZXI9RmFyKCdtYXRjaDpwYXR0ZXJuIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixfbWF0Y2hlclBheWxvYWQsY2hlY2spPT5cbmNoZWNrUGF0dGVybihzcGVjaW1lbixjaGVjayksXG5cbmNoZWNrSXNXZWxsRm9ybWVkOm1hdGNoQW55SGVscGVyLmNoZWNrSXNXZWxsRm9ybWVkLFxuXG5nZXRSYW5rQ292ZXI6KF9tYXRjaFBheWxvYWQsX2VuY29kZVBhc3NhYmxlKT0+WydhJywnen4nXSxcblxuY2hlY2tLZXlQYXR0ZXJuOihfbWF0Y2hlclBheWxvYWQsX2NoZWNrKT0+dHJ1ZX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaEtpbmRIZWxwZXI9RmFyKCdtYXRjaDpraW5kIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOmNoZWNrS2luZCxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KGFsbGVnZWRLZXlLaW5kLGNoZWNrKT0+XG50eXBlb2YgYWxsZWdlZEtleUtpbmQ9PT0nc3RyaW5nJ3x8XG5jaGVjayhcbmZhbHNlLFxuWCBgbWF0Y2g6a2luZDogcGF5bG9hZDogJHthbGxlZ2VkS2V5S2luZH0gLSBBIGtpbmQgbmFtZSBtdXN0IGJlIGEgc3RyaW5nYCksXG5cblxuZ2V0UmFua0NvdmVyOihraW5kLF9lbmNvZGVQYXNzYWJsZSk9PntcbmxldCBzdHlsZTtcbnN3aXRjaChraW5kKXtcbmNhc2UnY29weVNldCc6XG5jYXNlJ2NvcHlNYXAnOntcbnN0eWxlPSd0YWdnZWQnO1xuYnJlYWs7XG4gfVxuZGVmYXVsdDp7XG5zdHlsZT1raW5kO1xuYnJlYWs7XG4gfX1cblxucmV0dXJuIGdldFBhc3NTdHlsZUNvdmVyKHN0eWxlKTtcbiB9LFxuXG5jaGVja0tleVBhdHRlcm46KGtpbmQsY2hlY2spPT57XG5zd2l0Y2goa2luZCl7XG5jYXNlJ2Jvb2xlYW4nOlxuY2FzZSdudW1iZXInOlxuY2FzZSdiaWdpbnQnOlxuY2FzZSdzdHJpbmcnOlxuY2FzZSdzeW1ib2wnOlxuY2FzZSdyZW1vdGFibGUnOlxuY2FzZSd1bmRlZmluZWQnOntcbnJldHVybiB0cnVlO1xuIH1cbmRlZmF1bHQ6e1xucmV0dXJuIGNoZWNrKGZhbHNlLFggYCR7a2luZH0ga2V5cyBhcmUgbm90IHN1cHBvcnRlZGApO1xuIH19XG5cbiB9fSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoQmlnaW50SGVscGVyPUZhcignbWF0Y2g6YmlnaW50IGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixbbGltaXRzPXVuZGVmaW5lZF0sY2hlY2spPT57XG5jb25zdHtkZWNpbWFsRGlnaXRzTGltaXR9PWxpbWl0KGxpbWl0cyk7XG5yZXR1cm4oXG5jaGVja0tpbmQoc3BlY2ltZW4sJ2JpZ2ludCcsY2hlY2spJiZcbmNoZWNrRGVjaW1hbERpZ2l0c0xpbWl0KHNwZWNpbWVuLGRlY2ltYWxEaWdpdHNMaW1pdCxjaGVjaykpO1xuXG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KHBheWxvYWQsY2hlY2spPT5cbmNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxucGF5bG9hZCxcbmhhcmRlbihbXSksXG5jaGVjayxcbidtYXRjaDpiaWdpbnQgcGF5bG9hZCcpLFxuXG5cbmdldFJhbmtDb3ZlcjooX21hdGNoUGF5bG9hZCxfZW5jb2RlUGFzc2FibGUpPT5cbmdldFBhc3NTdHlsZUNvdmVyKCdiaWdpbnQnKSxcblxuY2hlY2tLZXlQYXR0ZXJuOihfbWF0Y2hlclBheWxvYWQsX2NoZWNrKT0+dHJ1ZX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaE5hdEhlbHBlcj1GYXIoJ21hdGNoOm5hdCBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4sW2xpbWl0cz11bmRlZmluZWRdLGNoZWNrKT0+e1xuY29uc3R7ZGVjaW1hbERpZ2l0c0xpbWl0fT1saW1pdChsaW1pdHMpO1xucmV0dXJuKFxuY2hlY2tLaW5kKHNwZWNpbWVuLCdiaWdpbnQnLGNoZWNrKSYmXG5jaGVjayhzcGVjaW1lbj49MG4sWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGJlIG5vbi1uZWdhdGl2ZWApJiZcbmNoZWNrRGVjaW1hbERpZ2l0c0xpbWl0KHNwZWNpbWVuLGRlY2ltYWxEaWdpdHNMaW1pdCxjaGVjaykpO1xuXG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KHBheWxvYWQsY2hlY2spPT5cbmNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxucGF5bG9hZCxcbmhhcmRlbihbXSksXG5jaGVjayxcbidtYXRjaDpuYXQgcGF5bG9hZCcpLFxuXG5cbmdldFJhbmtDb3ZlcjooX21hdGNoUGF5bG9hZCxfZW5jb2RlUGFzc2FibGUpPT5cbi8qIFRPRE8gQ291bGQgYmUgbW9yZSBwcmVjaXNlKi9cbmdldFBhc3NTdHlsZUNvdmVyKCdiaWdpbnQnKSxcblxuY2hlY2tLZXlQYXR0ZXJuOihfbWF0Y2hlclBheWxvYWQsX2NoZWNrKT0+dHJ1ZX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaFN0cmluZ0hlbHBlcj1GYXIoJ21hdGNoOnN0cmluZyBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4sW2xpbWl0cz11bmRlZmluZWRdLGNoZWNrKT0+e1xuY29uc3R7c3RyaW5nTGVuZ3RoTGltaXR9PWxpbWl0KGxpbWl0cyk7XG5yZXR1cm4oXG5jaGVja0tpbmQoc3BlY2ltZW4sJ3N0cmluZycsY2hlY2spJiYoXG5zcGVjaW1lbi5sZW5ndGg8PXN0cmluZ0xlbmd0aExpbWl0fHxcbmNoZWNrKFxuZmFsc2UsXG5YIGBzdHJpbmcgJHtzcGVjaW1lbn0gbXVzdCBub3QgYmUgYmlnZ2VyIHRoYW4gJHtzdHJpbmdMZW5ndGhMaW1pdH1gKSkpO1xuXG5cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDoocGF5bG9hZCxjaGVjayk9PlxuY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG5wYXlsb2FkLFxuaGFyZGVuKFtdKSxcbmNoZWNrLFxuJ21hdGNoOnN0cmluZyBwYXlsb2FkJyksXG5cblxuZ2V0UmFua0NvdmVyOihfbWF0Y2hQYXlsb2FkLF9lbmNvZGVQYXNzYWJsZSk9PlxuZ2V0UGFzc1N0eWxlQ292ZXIoJ3N0cmluZycpLFxuXG5jaGVja0tleVBhdHRlcm46KF9tYXRjaGVyUGF5bG9hZCxfY2hlY2spPT50cnVlfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoU3ltYm9sSGVscGVyPUZhcignbWF0Y2g6c3ltYm9sIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixbbGltaXRzPXVuZGVmaW5lZF0sY2hlY2spPT57XG5jb25zdHtzeW1ib2xOYW1lTGVuZ3RoTGltaXR9PWxpbWl0KGxpbWl0cyk7XG5pZighY2hlY2tLaW5kKHNwZWNpbWVuLCdzeW1ib2wnLGNoZWNrKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuY29uc3Qgc3ltYm9sTmFtZT1uYW1lRm9yUGFzc2FibGVTeW1ib2woc3BlY2ltZW4pO1xuXG5pZih0eXBlb2Ygc3ltYm9sTmFtZSE9PSdzdHJpbmcnKXtcbnRocm93IEZhaWwgYGludGVybmFsOiBQYXNzYWJsZSBzeW1ib2wgJHtzcGVjaW1lbn0gbXVzdCBoYXZlIGEgcGFzc2FibGUgbmFtZWA7XG4gfVxucmV0dXJuIGNoZWNrKFxuc3ltYm9sTmFtZS5sZW5ndGg8PXN5bWJvbE5hbWVMZW5ndGhMaW1pdCxcblggYFN5bWJvbCBuYW1lICR7cShcbnN5bWJvbE5hbWUpXG4gfSBtdXN0IG5vdCBiZSBiaWdnZXIgdGhhbiAke3N5bWJvbE5hbWVMZW5ndGhMaW1pdH1gKTtcblxuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihwYXlsb2FkLGNoZWNrKT0+XG5jaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbnBheWxvYWQsXG5oYXJkZW4oW10pLFxuY2hlY2ssXG4nbWF0Y2g6YmlnaW50IHBheWxvYWQnKSxcblxuXG5nZXRSYW5rQ292ZXI6KF9tYXRjaFBheWxvYWQsX2VuY29kZVBhc3NhYmxlKT0+XG5nZXRQYXNzU3R5bGVDb3Zlcignc3ltYm9sJyksXG5cbmNoZWNrS2V5UGF0dGVybjooX21hdGNoZXJQYXlsb2FkLF9jaGVjayk9PnRydWV9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hSZW1vdGFibGVIZWxwZXI9RmFyKCdtYXRjaDpyZW1vdGFibGUgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLHJlbW90YWJsZURlc2MsY2hlY2spPT57XG4vKiBVbmZvcnR1bmF0ZSBkdXBsaWNhdGlvbiBvZiBjaGVja0tpbmQgbG9naWMsIGJ1dCBubyBiZXR0ZXIgY2hvaWNlcy4qL1xuaWYoY2hlY2tLaW5kKHNwZWNpbWVuLCdyZW1vdGFibGUnLGlkZW50Q2hlY2tlcikpe1xucmV0dXJuIHRydWU7XG4gfVxuaWYoY2hlY2s9PT1pZGVudENoZWNrZXIpe1xucmV0dXJuIGZhbHNlO1xuIH1cbmxldCBzcGVjaW1lbktpbmQ9cGFzc1N0eWxlT2Yoc3BlY2ltZW4pO1xuaWYoc3BlY2ltZW5LaW5kPT09J3RhZ2dlZCcpe1xuc3BlY2ltZW5LaW5kPWdldFRhZyhzcGVjaW1lbik7XG4gfVxuY29uc3R7bGFiZWx9PXJlbW90YWJsZURlc2M7XG5cbi8qIHF1b3Rpbmcgd2l0aG91dCBxdW90ZXMqL1xuY29uc3QgZGV0YWlscz1YKFxuWyBgJHtzcGVjaW1lbktpbmR9IGAsYCAtIE11c3QgYmUgYSByZW1vdGFibGUgKCR7bGFiZWx9KWBdLFxuc3BlY2ltZW4pO1xuXG5yZXR1cm4gY2hlY2soZmFsc2UsZGV0YWlscyk7XG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KGFsbGVnZWRSZW1vdGFibGVEZXNjLGNoZWNrKT0+XG5jaGVja01hdGNoZXMoXG5hbGxlZ2VkUmVtb3RhYmxlRGVzYyxcbmhhcmRlbih7bGFiZWw6TU0uc3RyaW5nKCl9KSxcbmNoZWNrLFxuJ21hdGNoOnJlbW90YWJsZSBwYXlsb2FkJyksXG5cblxuZ2V0UmFua0NvdmVyOihfcmVtb3RhYmxlRGVzYyxfZW5jb2RlUGFzc2FibGUpPT5cbmdldFBhc3NTdHlsZUNvdmVyKCdyZW1vdGFibGUnKSxcblxuY2hlY2tLZXlQYXR0ZXJuOihfcmVtb3RhYmxlRGVzYyxfY2hlY2spPT50cnVlfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoTFRFSGVscGVyPUZhcignbWF0Y2g6bHRlIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixyaWdodE9wZXJhbmQsY2hlY2spPT5cbmtleUxURShzcGVjaW1lbixyaWdodE9wZXJhbmQpfHxcbmNoZWNrKGZhbHNlLFggYCR7c3BlY2ltZW59IC0gTXVzdCBiZSA8PSAke3JpZ2h0T3BlcmFuZH1gKSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6Y2hlY2tLZXksXG5cbmdldFJhbmtDb3ZlcjoocmlnaHRPcGVyYW5kLGVuY29kZVBhc3NhYmxlKT0+e1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHJpZ2h0T3BlcmFuZCk7XG4vKiBUaGUgcHJlZmVyLWNvbnN0IG1ha2VzIG5vIHNlbnNlIHdoZW4gc29tZSBvZiB0aGUgdmFyaWFibGVzIG5lZWQqL1xuLyogdG8gYmUgYGxldGAqL1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdCovXG5sZXRbbGVmdEJvdW5kLHJpZ2h0Qm91bmRdPWdldFBhc3NTdHlsZUNvdmVyKHBhc3NTdHlsZSk7XG5jb25zdCBuZXdSaWdodEJvdW5kPSBgJHtlbmNvZGVQYXNzYWJsZShyaWdodE9wZXJhbmQpfX5gO1xuaWYobmV3UmlnaHRCb3VuZCE9PXVuZGVmaW5lZCl7XG5yaWdodEJvdW5kPW5ld1JpZ2h0Qm91bmQ7XG4gfVxucmV0dXJuW2xlZnRCb3VuZCxyaWdodEJvdW5kXTtcbiB9LFxuXG5jaGVja0tleVBhdHRlcm46KHJpZ2h0T3BlcmFuZCxjaGVjayk9PlxuY2hlY2tLZXlQYXR0ZXJuKHJpZ2h0T3BlcmFuZCxjaGVjayl9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hMVEhlbHBlcj1GYXIoJ21hdGNoOmx0IGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixyaWdodE9wZXJhbmQsY2hlY2spPT5cbmtleUxUKHNwZWNpbWVuLHJpZ2h0T3BlcmFuZCl8fFxuY2hlY2soZmFsc2UsWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGJlIDwgJHtyaWdodE9wZXJhbmR9YCksXG5cbmNoZWNrSXNXZWxsRm9ybWVkOmNoZWNrS2V5LFxuXG5nZXRSYW5rQ292ZXI6bWF0Y2hMVEVIZWxwZXIuZ2V0UmFua0NvdmVyLFxuXG5jaGVja0tleVBhdHRlcm46KHJpZ2h0T3BlcmFuZCxjaGVjayk9PlxuY2hlY2tLZXlQYXR0ZXJuKHJpZ2h0T3BlcmFuZCxjaGVjayl9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hHVEVIZWxwZXI9RmFyKCdtYXRjaDpndGUgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLHJpZ2h0T3BlcmFuZCxjaGVjayk9Plxua2V5R1RFKHNwZWNpbWVuLHJpZ2h0T3BlcmFuZCl8fFxuY2hlY2soZmFsc2UsWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGJlID49ICR7cmlnaHRPcGVyYW5kfWApLFxuXG5jaGVja0lzV2VsbEZvcm1lZDpjaGVja0tleSxcblxuZ2V0UmFua0NvdmVyOihyaWdodE9wZXJhbmQsZW5jb2RlUGFzc2FibGUpPT57XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YocmlnaHRPcGVyYW5kKTtcbi8qIFRoZSBwcmVmZXItY29uc3QgbWFrZXMgbm8gc2Vuc2Ugd2hlbiBzb21lIG9mIHRoZSB2YXJpYWJsZXMgbmVlZCovXG4vKiB0byBiZSBgbGV0YCovXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0Ki9cbmxldFtsZWZ0Qm91bmQscmlnaHRCb3VuZF09Z2V0UGFzc1N0eWxlQ292ZXIocGFzc1N0eWxlKTtcbmNvbnN0IG5ld0xlZnRCb3VuZD1lbmNvZGVQYXNzYWJsZShyaWdodE9wZXJhbmQpO1xuaWYobmV3TGVmdEJvdW5kIT09dW5kZWZpbmVkKXtcbmxlZnRCb3VuZD1uZXdMZWZ0Qm91bmQ7XG4gfVxucmV0dXJuW2xlZnRCb3VuZCxyaWdodEJvdW5kXTtcbiB9LFxuXG5jaGVja0tleVBhdHRlcm46KHJpZ2h0T3BlcmFuZCxjaGVjayk9PlxuY2hlY2tLZXlQYXR0ZXJuKHJpZ2h0T3BlcmFuZCxjaGVjayl9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hHVEhlbHBlcj1GYXIoJ21hdGNoOmd0IGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixyaWdodE9wZXJhbmQsY2hlY2spPT5cbmtleUdUKHNwZWNpbWVuLHJpZ2h0T3BlcmFuZCl8fFxuY2hlY2soZmFsc2UsWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGJlID4gJHtyaWdodE9wZXJhbmR9YCksXG5cbmNoZWNrSXNXZWxsRm9ybWVkOmNoZWNrS2V5LFxuXG5nZXRSYW5rQ292ZXI6bWF0Y2hHVEVIZWxwZXIuZ2V0UmFua0NvdmVyLFxuXG5jaGVja0tleVBhdHRlcm46KHJpZ2h0T3BlcmFuZCxjaGVjayk9PlxuY2hlY2tLZXlQYXR0ZXJuKHJpZ2h0T3BlcmFuZCxjaGVjayl9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hSZWNvcmRPZkhlbHBlcj1GYXIoJ21hdGNoOnJlY29yZE9mIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihcbnNwZWNpbWVuLFxuW2tleVBhdHQsdmFsdWVQYXR0LGxpbWl0cz11bmRlZmluZWRdLFxuY2hlY2spPT5cbntcbmNvbnN0e251bVByb3BlcnRpZXNMaW1pdCxwcm9wZXJ0eU5hbWVMZW5ndGhMaW1pdH09bGltaXQobGltaXRzKTtcbnJldHVybihcbmNoZWNrS2luZChzcGVjaW1lbiwnY29weVJlY29yZCcsY2hlY2spJiZcbmNoZWNrKFxub3duS2V5cyhzcGVjaW1lbikubGVuZ3RoPD1udW1Qcm9wZXJ0aWVzTGltaXQsXG5YIGBNdXN0IG5vdCBoYXZlIG1vcmUgdGhhbiAke3EoXG5udW1Qcm9wZXJ0aWVzTGltaXQpXG4gfSBwcm9wZXJ0aWVzOiAke3NwZWNpbWVufWApJiZcblxuZW50cmllcyhzcGVjaW1lbikuZXZlcnkoXG4oW2tleSx2YWx1ZV0pPT5cbmFwcGx5TGFiZWxpbmdFcnJvcihcbmNoZWNrLFxuW1xua2V5Lmxlbmd0aDw9cHJvcGVydHlOYW1lTGVuZ3RoTGltaXQsXG5YIGBQcm9wZXJ0eSBuYW1lIG11c3Qgbm90IGJlIGxvbmdlciB0aGFuICR7cShcbnByb3BlcnR5TmFtZUxlbmd0aExpbWl0KVxuIH1gXSxcblxua2V5KSYmXG5cbmNoZWNrTWF0Y2hlcyhcbmhhcmRlbihba2V5LHZhbHVlXSksXG5oYXJkZW4oW2tleVBhdHQsdmFsdWVQYXR0XSksXG5jaGVjayxcbmtleSkpKTtcblxuXG5cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDoocGF5bG9hZCxjaGVjayk9PlxuY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG5wYXlsb2FkLFxuaGFyZGVuKFtNTS5wYXR0ZXJuKCksTU0ucGF0dGVybigpXSksXG5jaGVjayxcbidtYXRjaDpyZWNvcmRPZiBwYXlsb2FkJyksXG5cblxuZ2V0UmFua0NvdmVyOihfZW50cnlQYXR0KT0+Z2V0UGFzc1N0eWxlQ292ZXIoJ2NvcHlSZWNvcmQnKSxcblxuY2hlY2tLZXlQYXR0ZXJuOihfZW50cnlQYXR0LGNoZWNrKT0+XG5jaGVjayhmYWxzZSxYIGBSZWNvcmRzIG5vdCB5ZXQgc3VwcG9ydGVkIGFzIGtleXNgKX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaEFycmF5T2ZIZWxwZXI9RmFyKCdtYXRjaDphcnJheU9mIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixbc3ViUGF0dCxsaW1pdHM9dW5kZWZpbmVkXSxjaGVjayk9PntcbmNvbnN0e2FycmF5TGVuZ3RoTGltaXR9PWxpbWl0KGxpbWl0cyk7XG5yZXR1cm4oXG5jaGVja0tpbmQoc3BlY2ltZW4sJ2NvcHlBcnJheScsY2hlY2spJiYoXG5zcGVjaW1lbi5sZW5ndGg8PWFycmF5TGVuZ3RoTGltaXR8fFxuY2hlY2soXG5mYWxzZSxcblggYEFycmF5IGxlbmd0aCAke3NwZWNpbWVuLmxlbmd0aH0gbXVzdCBiZSA8PSBsaW1pdCAke2FycmF5TGVuZ3RoTGltaXR9YCkpJiZcblxuYXJyYXlFdmVyeU1hdGNoUGF0dGVybihzcGVjaW1lbixzdWJQYXR0LGNoZWNrKSk7XG5cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDoocGF5bG9hZCxjaGVjayk9PlxuY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG5wYXlsb2FkLFxuaGFyZGVuKFtNTS5wYXR0ZXJuKCldKSxcbmNoZWNrLFxuJ21hdGNoOmFycmF5T2YgcGF5bG9hZCcpLFxuXG5cbmdldFJhbmtDb3ZlcjooKT0+Z2V0UGFzc1N0eWxlQ292ZXIoJ2NvcHlBcnJheScpLFxuXG5jaGVja0tleVBhdHRlcm46KF8sY2hlY2spPT5cbmNoZWNrKGZhbHNlLFggYEFycmF5cyBub3QgeWV0IHN1cHBvcnRlZCBhcyBrZXlzYCl9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hTZXRPZkhlbHBlcj1GYXIoJ21hdGNoOnNldE9mIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixba2V5UGF0dCxsaW1pdHM9dW5kZWZpbmVkXSxjaGVjayk9PntcbmNvbnN0e251bVNldEVsZW1lbnRzTGltaXR9PWxpbWl0KGxpbWl0cyk7XG5yZXR1cm4oXG5jaGVja0tpbmQoc3BlY2ltZW4sJ2NvcHlTZXQnLGNoZWNrKSYmXG5jaGVjayhcbnNwZWNpbWVuLnBheWxvYWQubGVuZ3RoPG51bVNldEVsZW1lbnRzTGltaXQsXG5YIGBTZXQgbXVzdCBub3QgaGF2ZSBtb3JlIHRoYW4gJHtxKG51bVNldEVsZW1lbnRzTGltaXQpfSBlbGVtZW50czogJHtcbnNwZWNpbWVuLnBheWxvYWQubGVuZ3RoXG4gfWApJiZcblxuYXJyYXlFdmVyeU1hdGNoUGF0dGVybihzcGVjaW1lbi5wYXlsb2FkLGtleVBhdHQsY2hlY2ssJ3NldCBlbGVtZW50cycpKTtcblxuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihwYXlsb2FkLGNoZWNrKT0+XG5jaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbnBheWxvYWQsXG5oYXJkZW4oW01NLnBhdHRlcm4oKV0pLFxuY2hlY2ssXG4nbWF0Y2g6c2V0T2YgcGF5bG9hZCcpLFxuXG5cbmdldFJhbmtDb3ZlcjooKT0+Z2V0UGFzc1N0eWxlQ292ZXIoJ3RhZ2dlZCcpLFxuXG5jaGVja0tleVBhdHRlcm46KF8sY2hlY2spPT5cbmNoZWNrKGZhbHNlLFggYENvcHlTZXRzIG5vdCB5ZXQgc3VwcG9ydGVkIGFzIGtleXNgKX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaEJhZ09mSGVscGVyPUZhcignbWF0Y2g6YmFnT2YgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KFxuc3BlY2ltZW4sXG5ba2V5UGF0dCxjb3VudFBhdHQsbGltaXRzPXVuZGVmaW5lZF0sXG5jaGVjayk9Plxue1xuY29uc3R7bnVtVW5pcXVlQmFnRWxlbWVudHNMaW1pdCxkZWNpbWFsRGlnaXRzTGltaXR9PWxpbWl0KGxpbWl0cyk7XG5yZXR1cm4oXG5jaGVja0tpbmQoc3BlY2ltZW4sJ2NvcHlCYWcnLGNoZWNrKSYmXG5jaGVjayhcbnNwZWNpbWVuLnBheWxvYWQubGVuZ3RoPD1udW1VbmlxdWVCYWdFbGVtZW50c0xpbWl0LFxuWCBgQmFnIG11c3Qgbm90IGhhdmUgbW9yZSB0aGFuICR7cShcbm51bVVuaXF1ZUJhZ0VsZW1lbnRzTGltaXQpXG4gfSB1bmlxdWUgZWxlbWVudHM6ICR7c3BlY2ltZW59YCkmJlxuXG5zcGVjaW1lbi5wYXlsb2FkLmV2ZXJ5KFxuKFtrZXksY291bnRdLGkpPT5cbmNoZWNrTWF0Y2hlcyhrZXksa2V5UGF0dCxjaGVjaywgYGJhZyBrZXlzWyR7aX1dYCkmJlxuYXBwbHlMYWJlbGluZ0Vycm9yKFxuY2hlY2tEZWNpbWFsRGlnaXRzTGltaXQsXG5bY291bnQsZGVjaW1hbERpZ2l0c0xpbWl0LGNoZWNrXSxcbiBgYmFnIGNvdW50c1ske2l9XWApJiZcblxuY2hlY2tNYXRjaGVzKGNvdW50LGNvdW50UGF0dCxjaGVjaywgYGJhZyBjb3VudHNbJHtpfV1gKSkpO1xuXG5cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDoocGF5bG9hZCxjaGVjayk9PlxuY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG5wYXlsb2FkLFxuaGFyZGVuKFtNTS5wYXR0ZXJuKCksTU0ucGF0dGVybigpXSksXG5jaGVjayxcbidtYXRjaDpiYWdPZiBwYXlsb2FkJyksXG5cblxuZ2V0UmFua0NvdmVyOigpPT5nZXRQYXNzU3R5bGVDb3ZlcigndGFnZ2VkJyksXG5cbmNoZWNrS2V5UGF0dGVybjooXyxjaGVjayk9PlxuY2hlY2soZmFsc2UsWCBgQ29weUJhZ3Mgbm90IHlldCBzdXBwb3J0ZWQgYXMga2V5c2ApfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoTWFwT2ZIZWxwZXI9RmFyKCdtYXRjaDptYXBPZiBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooXG5zcGVjaW1lbixcbltrZXlQYXR0LHZhbHVlUGF0dCxsaW1pdHM9dW5kZWZpbmVkXSxcbmNoZWNrKT0+XG57XG5jb25zdHtudW1NYXBFbnRyaWVzTGltaXR9PWxpbWl0KGxpbWl0cyk7XG5yZXR1cm4oXG5jaGVja0tpbmQoc3BlY2ltZW4sJ2NvcHlNYXAnLGNoZWNrKSYmXG5jaGVjayhcbnNwZWNpbWVuLnBheWxvYWQua2V5cy5sZW5ndGg8PW51bU1hcEVudHJpZXNMaW1pdCxcblggYENvcHlNYXAgbXVzdCBoYXZlIG5vIG1vcmUgdGhhbiAke3EoXG5udW1NYXBFbnRyaWVzTGltaXQpXG4gfSBlbnRyaWVzOiAke3NwZWNpbWVufWApJiZcblxuYXJyYXlFdmVyeU1hdGNoUGF0dGVybihcbnNwZWNpbWVuLnBheWxvYWQua2V5cyxcbmtleVBhdHQsXG5jaGVjayxcbidtYXAga2V5cycpJiZcblxuYXJyYXlFdmVyeU1hdGNoUGF0dGVybihcbnNwZWNpbWVuLnBheWxvYWQudmFsdWVzLFxudmFsdWVQYXR0LFxuY2hlY2ssXG4nbWFwIHZhbHVlcycpKTtcblxuXG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KHBheWxvYWQsY2hlY2spPT5cbmNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxucGF5bG9hZCxcbmhhcmRlbihbTU0ucGF0dGVybigpLE1NLnBhdHRlcm4oKV0pLFxuY2hlY2ssXG4nbWF0Y2g6bWFwT2YgcGF5bG9hZCcpLFxuXG5cbmdldFJhbmtDb3ZlcjooX2VudHJ5UGF0dCk9PmdldFBhc3NTdHlsZUNvdmVyKCd0YWdnZWQnKSxcblxuY2hlY2tLZXlQYXR0ZXJuOihfZW50cnlQYXR0LGNoZWNrKT0+XG5jaGVjayhmYWxzZSxYIGBDb3B5TWFwIG5vdCB5ZXQgc3VwcG9ydGVkIGFzIGtleXNgKX0pO1xuXG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBzcGVjaW1lblxuICogQHBhcmFtIHtQYXR0ZXJuW119IHJlcXVpcmVkUGF0dFxuICogQHBhcmFtIHtQYXR0ZXJuW119IG9wdGlvbmFsUGF0dFxuICogQHJldHVybnMge3tcbiAqICAgcmVxdWlyZWRTcGVjaW1lbjogUGFzc2FibGVbXSxcbiAqICAgb3B0aW9uYWxTcGVjaW1lbjogUGFzc2FibGVbXSxcbiAqICAgcmVzdFNwZWNpbWVuOiBQYXNzYWJsZVtdXG4gKiB9fVxuICovXG5jb25zdCBzcGxpdEFycmF5UGFydHM9KHNwZWNpbWVuLHJlcXVpcmVkUGF0dCxvcHRpb25hbFBhdHQpPT57XG5jb25zdCBudW1SZXF1aXJlZD1yZXF1aXJlZFBhdHQubGVuZ3RoO1xuY29uc3QgbnVtT3B0aW9uYWw9b3B0aW9uYWxQYXR0Lmxlbmd0aDtcbmNvbnN0IHJlcXVpcmVkU3BlY2ltZW49c3BlY2ltZW4uc2xpY2UoMCxudW1SZXF1aXJlZCk7XG5jb25zdCBvcHRpb25hbFNwZWNpbWVuPXNwZWNpbWVuLnNsaWNlKFxubnVtUmVxdWlyZWQsXG5udW1SZXF1aXJlZCtudW1PcHRpb25hbCk7XG5cbmNvbnN0IHJlc3RTcGVjaW1lbj1zcGVjaW1lbi5zbGljZShudW1SZXF1aXJlZCtudW1PcHRpb25hbCk7XG5yZXR1cm4gaGFyZGVuKHtyZXF1aXJlZFNwZWNpbWVuLG9wdGlvbmFsU3BlY2ltZW4scmVzdFNwZWNpbWVufSk7XG4gfTtcblxuLyoqXG4gKiBPcHRpb25hbCBzcGVjaW1lbiBlbGVtZW50cyB3aGljaCBhcmUgYHVuZGVmaW5lZGAgcGFzcyB1bmNvbmRpdGlvbmFsbHkuXG4gKiBXZSBlbmNvZGUgdGhpcyB3aXRoIHRoZSBgTS5vcmAgcGF0dGVybiBzbyBpdCBhbHNvIHByb2R1Y2VzIGEgZ29vZFxuICogY29tcHJlc3Npb24gZGlzdGluZ3Vpc2hpbmcgYHVuZGVmaW5lZGAgZnJvbSBhYnNlbmNlLlxuICpcbiAqIEBwYXJhbSB7UGF0dGVybltdfSBvcHRpb25hbFBhdHRcbiAqIEBwYXJhbSB7bnVtYmVyfSBsZW5ndGhcbiAqIEByZXR1cm5zIHtQYXR0ZXJuW119IFRoZSBwYXJ0aWFsUGF0dFxuICovXG5jb25zdCBhZGFwdEFycmF5UGF0dGVybj0ob3B0aW9uYWxQYXR0LGxlbmd0aCk9PlxuaGFyZGVuKG9wdGlvbmFsUGF0dC5zbGljZSgwLGxlbmd0aCkubWFwKChwYXR0KT0+TU0ub3B0KHBhdHQpKSk7XG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaFNwbGl0QXJyYXlIZWxwZXI9RmFyKCdtYXRjaDpzcGxpdEFycmF5IGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihcbnNwZWNpbWVuLFxuW3JlcXVpcmVkUGF0dCxvcHRpb25hbFBhdHQ9W10scmVzdFBhdHQ9TU0uYW55KCldLFxuY2hlY2spPT5cbntcbmlmKCFjaGVja0tpbmQoc3BlY2ltZW4sJ2NvcHlBcnJheScsY2hlY2spKXtcbnJldHVybiBmYWxzZTtcbiB9XG5jb25zdHtyZXF1aXJlZFNwZWNpbWVuLG9wdGlvbmFsU3BlY2ltZW4scmVzdFNwZWNpbWVufT1cbnNwbGl0QXJyYXlQYXJ0cyhzcGVjaW1lbixyZXF1aXJlZFBhdHQsb3B0aW9uYWxQYXR0KTtcbmNvbnN0IHBhcnRpYWxQYXR0PWFkYXB0QXJyYXlQYXR0ZXJuKFxub3B0aW9uYWxQYXR0LFxub3B0aW9uYWxTcGVjaW1lbi5sZW5ndGgpO1xuXG5sZXQgYXJnTnVtPTA7XG5yZXR1cm4oXG4ocmVxdWlyZWRTcGVjaW1lbi5sZW5ndGg9PT1yZXF1aXJlZFBhdHQubGVuZ3RofHxcbmNoZWNrKFxuZmFsc2UsXG5YIGBFeHBlY3RlZCBhdCBsZWFzdCAke3EoXG5yZXF1aXJlZFBhdHQubGVuZ3RoKVxuIH0gYXJndW1lbnRzOiAke3NwZWNpbWVufWApKSYmXG5cbnJlcXVpcmVkUGF0dC5ldmVyeSgocCxpKT0+XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGx1c3BsdXMqL1xuY2hlY2tNYXRjaGVzKHJlcXVpcmVkU3BlY2ltZW5baV0scCxjaGVjaywgYGFyZyAke2FyZ051bSsrfWApKSYmXG5cbnBhcnRpYWxQYXR0LmV2ZXJ5KChwLGkpPT5cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wbHVzcGx1cyovXG5jaGVja01hdGNoZXMob3B0aW9uYWxTcGVjaW1lbltpXSxwLGNoZWNrLCBgYXJnICR7YXJnTnVtKyt9P2ApKSYmXG5cbmNoZWNrTWF0Y2hlcyhyZXN0U3BlY2ltZW4scmVzdFBhdHQsY2hlY2ssJy4uLnJlc3QnKSk7XG5cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDooc3BsaXRBcnJheSxjaGVjayk9PntcbmlmKFxucGFzc1N0eWxlT2Yoc3BsaXRBcnJheSk9PT0nY29weUFycmF5JyYmKFxuc3BsaXRBcnJheS5sZW5ndGg+PTF8fHNwbGl0QXJyYXkubGVuZ3RoPD0zKSlcbntcbmNvbnN0W3JlcXVpcmVkUGF0dCxvcHRpb25hbFBhdHQ9dW5kZWZpbmVkLHJlc3RQYXR0PXVuZGVmaW5lZF09XG5zcGxpdEFycmF5O1xuaWYoXG5pc1BhdHRlcm4ocmVxdWlyZWRQYXR0KSYmXG5wYXNzU3R5bGVPZihyZXF1aXJlZFBhdHQpPT09J2NvcHlBcnJheScmJihcbm9wdGlvbmFsUGF0dD09PXVuZGVmaW5lZHx8XG5pc1BhdHRlcm4ob3B0aW9uYWxQYXR0KSYmXG5wYXNzU3R5bGVPZihvcHRpb25hbFBhdHQpPT09J2NvcHlBcnJheScpJiYoXG5yZXN0UGF0dD09PXVuZGVmaW5lZHx8aXNQYXR0ZXJuKHJlc3RQYXR0KSkpXG57XG5yZXR1cm4gdHJ1ZTtcbiB9XG4gfVxucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBNdXN0IGJlIGFuIGFycmF5IG9mIGEgcmVxdWlyZWRQYXR0IGFycmF5LCBhbiBvcHRpb25hbCBvcHRpb25hbFBhdHQgYXJyYXksIGFuZCBhbiBvcHRpb25hbCByZXN0UGF0dDogJHtxKFxuc3BsaXRBcnJheSlcbiB9YCk7XG5cbiB9LFxuXG5nZXRSYW5rQ292ZXI6KFtcbl9yZXF1aXJlZFBhdHQsXG5fb3B0aW9uYWxQYXR0PXVuZGVmaW5lZCxcbl9yZXN0UGF0dD11bmRlZmluZWRdKT0+XG5nZXRQYXNzU3R5bGVDb3ZlcignY29weUFycmF5JyksXG5cbmNoZWNrS2V5UGF0dGVybjooXG5bX3JlcXVpcmVkUGF0dCxfb3B0aW9uYWxQYXR0PXVuZGVmaW5lZCxfcmVzdFBhdHQ9dW5kZWZpbmVkXSxcbmNoZWNrKT0+XG5jaGVjayhmYWxzZSxYIGBjb3B5UmVjb3JkIG5vdCB5ZXQgc3VwcG9ydGVkIGFzIGtleXNgKX0pO1xuXG5cbi8qKlxuICogQHBhcmFtIHtDb3B5UmVjb3JkPFBhc3NhYmxlPn0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7Q29weVJlY29yZDxQYXR0ZXJuPn0gcmVxdWlyZWRQYXR0XG4gKiBAcGFyYW0ge0NvcHlSZWNvcmQ8UGF0dGVybj59IG9wdGlvbmFsUGF0dFxuICogQHJldHVybnMge3tcbiAqICAgcmVxdWlyZWRTcGVjaW1lbjogQ29weVJlY29yZDxQYXNzYWJsZT4sXG4gKiAgIG9wdGlvbmFsU3BlY2ltZW46IENvcHlSZWNvcmQ8UGFzc2FibGU+LFxuICogICByZXN0U3BlY2ltZW46IENvcHlSZWNvcmQ8UGFzc2FibGU+XG4gKiB9fVxuICovXG5jb25zdCBzcGxpdFJlY29yZFBhcnRzPShzcGVjaW1lbixyZXF1aXJlZFBhdHQsb3B0aW9uYWxQYXR0KT0+e1xuLyogTm90IGZyb3plbiEgTXV0YXRlZCBpbiBwbGFjZSovXG4vKiogQHR5cGUge1tzdHJpbmcsIFBhc3NhYmxlXVtdfSAqL1xuY29uc3QgcmVxdWlyZWRFbnRyaWVzPVtdO1xuLyoqIEB0eXBlIHtbc3RyaW5nLCBQYXNzYWJsZV1bXX0gKi9cbmNvbnN0IG9wdGlvbmFsRW50cmllcz1bXTtcbi8qKiBAdHlwZSB7W3N0cmluZywgUGFzc2FibGVdW119ICovXG5jb25zdCByZXN0RW50cmllcz1bXTtcbmZvcihjb25zdFtuYW1lLHZhbHVlXW9mIGVudHJpZXMoc3BlY2ltZW4pKXtcbmlmKGhhc093blByb3BlcnR5T2YocmVxdWlyZWRQYXR0LG5hbWUpKXtcbnJlcXVpcmVkRW50cmllcy5wdXNoKFtuYW1lLHZhbHVlXSk7XG4gfWVsc2UgaWYoaGFzT3duUHJvcGVydHlPZihvcHRpb25hbFBhdHQsbmFtZSkpe1xub3B0aW9uYWxFbnRyaWVzLnB1c2goW25hbWUsdmFsdWVdKTtcbiB9ZWxzZXtcbnJlc3RFbnRyaWVzLnB1c2goW25hbWUsdmFsdWVdKTtcbiB9XG4gfVxucmV0dXJuIGhhcmRlbih7XG5yZXF1aXJlZFNwZWNpbWVuOmZyb21VbmlxdWVFbnRyaWVzKHJlcXVpcmVkRW50cmllcyksXG5vcHRpb25hbFNwZWNpbWVuOmZyb21VbmlxdWVFbnRyaWVzKG9wdGlvbmFsRW50cmllcyksXG5yZXN0U3BlY2ltZW46ZnJvbVVuaXF1ZUVudHJpZXMocmVzdEVudHJpZXMpfSk7XG5cbiB9O1xuXG4vKipcbiAqIE9wdGlvbmFsIHNwZWNpbWVuIHZhbHVlcyB3aGljaCBhcmUgYHVuZGVmaW5lZGAgcGFzcyB1bmNvbmRpdGlvbmFsbHkuXG4gKiBXZSBlbmNvZGUgdGhpcyB3aXRoIHRoZSBgTS5vcmAgcGF0dGVybiBzbyBpdCBhbHNvIHByb2R1Y2VzIGEgZ29vZFxuICogY29tcHJlc3Npb24gZGlzdGluZ3Vpc2hpbmcgYHVuZGVmaW5lZGAgZnJvbSBhYnNlbmNlLlxuICpcbiAqIEBwYXJhbSB7Q29weVJlY29yZDxQYXR0ZXJuPn0gb3B0aW9uYWxQYXR0XG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBuYW1lc1xuICogQHJldHVybnMge0NvcHlSZWNvcmQ8UGF0dGVybj59IFRoZSBwYXJ0aWFsUGF0dFxuICovXG5jb25zdCBhZGFwdFJlY29yZFBhdHRlcm49KG9wdGlvbmFsUGF0dCxuYW1lcyk9PlxuZnJvbVVuaXF1ZUVudHJpZXMobmFtZXMubWFwKChuYW1lKT0+W25hbWUsTU0ub3B0KG9wdGlvbmFsUGF0dFtuYW1lXSldKSk7XG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaFNwbGl0UmVjb3JkSGVscGVyPUZhcignbWF0Y2g6c3BsaXRSZWNvcmQgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KFxuc3BlY2ltZW4sXG5bcmVxdWlyZWRQYXR0LG9wdGlvbmFsUGF0dD17fSxyZXN0UGF0dD1NTS5hbnkoKV0sXG5jaGVjayk9Plxue1xuaWYoIWNoZWNrS2luZChzcGVjaW1lbiwnY29weVJlY29yZCcsY2hlY2spKXtcbnJldHVybiBmYWxzZTtcbiB9XG5jb25zdHtyZXF1aXJlZFNwZWNpbWVuLG9wdGlvbmFsU3BlY2ltZW4scmVzdFNwZWNpbWVufT1cbnNwbGl0UmVjb3JkUGFydHMoc3BlY2ltZW4scmVxdWlyZWRQYXR0LG9wdGlvbmFsUGF0dCk7XG5cbmNvbnN0IHBhcnRpYWxOYW1lcz0vKiogQHR5cGUge3N0cmluZ1tdfSAqL293bktleXMob3B0aW9uYWxTcGVjaW1lbik7XG5jb25zdCBwYXJ0aWFsUGF0dD1hZGFwdFJlY29yZFBhdHRlcm4ob3B0aW9uYWxQYXR0LHBhcnRpYWxOYW1lcyk7XG5yZXR1cm4oXG5jaGVja01hdGNoZXMocmVxdWlyZWRTcGVjaW1lbixyZXF1aXJlZFBhdHQsY2hlY2spJiZcbnBhcnRpYWxOYW1lcy5ldmVyeSgobmFtZSk9PlxuY2hlY2tNYXRjaGVzKFxub3B0aW9uYWxTcGVjaW1lbltuYW1lXSxcbnBhcnRpYWxQYXR0W25hbWVdLFxuY2hlY2ssXG4gYCR7bmFtZX0/YCkpJiZcblxuXG5jaGVja01hdGNoZXMocmVzdFNwZWNpbWVuLHJlc3RQYXR0LGNoZWNrLCcuLi5yZXN0JykpO1xuXG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KHNwbGl0QXJyYXksY2hlY2spPT57XG5pZihcbnBhc3NTdHlsZU9mKHNwbGl0QXJyYXkpPT09J2NvcHlBcnJheScmJihcbnNwbGl0QXJyYXkubGVuZ3RoPj0xfHxzcGxpdEFycmF5Lmxlbmd0aDw9MykpXG57XG5jb25zdFtyZXF1aXJlZFBhdHQsb3B0aW9uYWxQYXR0PXVuZGVmaW5lZCxyZXN0UGF0dD11bmRlZmluZWRdPVxuc3BsaXRBcnJheTtcbmlmKFxuaXNQYXR0ZXJuKHJlcXVpcmVkUGF0dCkmJlxucGFzc1N0eWxlT2YocmVxdWlyZWRQYXR0KT09PSdjb3B5UmVjb3JkJyYmKFxub3B0aW9uYWxQYXR0PT09dW5kZWZpbmVkfHxcbmlzUGF0dGVybihvcHRpb25hbFBhdHQpJiZcbnBhc3NTdHlsZU9mKG9wdGlvbmFsUGF0dCk9PT0nY29weVJlY29yZCcpJiYoXG5yZXN0UGF0dD09PXVuZGVmaW5lZHx8aXNQYXR0ZXJuKHJlc3RQYXR0KSkpXG57XG5yZXR1cm4gdHJ1ZTtcbiB9XG4gfVxucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBNdXN0IGJlIGFuIGFycmF5IG9mIGEgcmVxdWlyZWRQYXR0IHJlY29yZCwgYW4gb3B0aW9uYWwgb3B0aW9uYWxQYXR0IHJlY29yZCwgYW5kIGFuIG9wdGlvbmFsIHJlc3RQYXR0OiAke3EoXG5zcGxpdEFycmF5KVxuIH1gKTtcblxuIH0sXG5cbmdldFJhbmtDb3ZlcjooW1xucmVxdWlyZWRQYXR0LFxuX29wdGlvbmFsUGF0dD11bmRlZmluZWQsXG5fcmVzdFBhdHQ9dW5kZWZpbmVkXSk9PlxuZ2V0UGFzc1N0eWxlQ292ZXIocGFzc1N0eWxlT2YocmVxdWlyZWRQYXR0KSksXG5cbmNoZWNrS2V5UGF0dGVybjooXG5bX3JlcXVpcmVkUGF0dCxfb3B0aW9uYWxQYXR0PXVuZGVmaW5lZCxfcmVzdFBhdHQ9dW5kZWZpbmVkXSxcbmNoZWNrKT0+XG5jaGVjayhmYWxzZSxYIGBjb3B5UmVjb3JkIG5vdCB5ZXQgc3VwcG9ydGVkIGFzIGtleXNgKX0pO1xuXG5cbi8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgTWF0Y2hIZWxwZXI+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+bWFrZU1ldGhvZEd1YXJkTWFrZXIoJ2FzeW5jJyxhcmdHdWFyZHMpLFxuXG5hd2FpdDooYXJnR3VhcmQpPT5tYWtlQXdhaXRBcmdHdWFyZChhcmdHdWFyZCl9KTtcblxuXG5yZXR1cm4gaGFyZGVuKHtcbmNoZWNrTWF0Y2hlcyxcbm1hdGNoZXMsXG5maXQsXG5hc3NlcnRQYXR0ZXJuLFxuaXNQYXR0ZXJuLFxuYXNzZXJ0S2V5UGF0dGVybixcbmlzS2V5UGF0dGVybixcbmdldFJhbmtDb3Zlcixcbk19KTtcblxuIH07XG5cbi8qIE9ubHkgaW5jbHVkZSB0aG9zZSB3aG9zZSBtZWFuaW5nIGlzIGluZGVwZW5kZW50IG9mIGFuIGltcHV0ZWQgc29ydCBvcmRlciovXG4vKiBvZiByZW1vdGFibGVzLCBvciBvZiBlbmNvZGluZyBvZiBwYXNzYWJsZSBhcyBzb3J0YWJsZSBzdHJpbmdzLiBUaHVzLCovXG4vKiBnZXRSYW5rQ292ZXIgaXMgb21pdHRlZC4gVG8gZ2V0IG9uZSwgeW91J2QgbmVlZCB0byBpbnN0YW50aWF0ZSovXG4vKiBgbWFrZVBhdHRlcm5LaXQoKWAgeW91cnNlbGYuIFNpbmNlIHRoZXJlIGFyZSBjdXJyZW50bHkgbm8gZXh0ZXJuYWwqL1xuLyogdXNlcyBvZiBgZ2V0UmFua0NvdmVyYCwgZm9yIGNsYXJpdHkgZHVyaW5nIGRldmVsb3BtZW50LCBgbWFrZVBhdHRlcm5LaXRgKi9cbi8qIGlzIG5vdCBjdXJyZW50bHkgZXhwb3J0ZWQuKi9cbmNvbnN0ICAgICAgIHtcbmNoZWNrTWF0Y2hlcyxcbm1hdGNoZXMsXG5maXQsXG5hc3NlcnRQYXR0ZXJuLFxuaXNQYXR0ZXJuLFxuYXNzZXJ0S2V5UGF0dGVybixcbmlzS2V5UGF0dGVybixcbmdldFJhbmtDb3Zlcixcbk19PVxubWFrZVBhdHRlcm5LaXQoKTskaOKAjV9vbmNlLmNoZWNrTWF0Y2hlcyhjaGVja01hdGNoZXMpOyRo4oCNX29uY2UubWF0Y2hlcyhtYXRjaGVzKTskaOKAjV9vbmNlLmZpdChmaXQpOyRo4oCNX29uY2UuYXNzZXJ0UGF0dGVybihhc3NlcnRQYXR0ZXJuKTskaOKAjV9vbmNlLmlzUGF0dGVybihpc1BhdHRlcm4pOyRo4oCNX29uY2UuYXNzZXJ0S2V5UGF0dGVybihhc3NlcnRLZXlQYXR0ZXJuKTskaOKAjV9vbmNlLmlzS2V5UGF0dGVybihpc0tleVBhdHRlcm4pOyRo4oCNX29uY2UuZ2V0UmFua0NvdmVyKGdldFJhbmtDb3Zlcik7JGjigI1fb25jZS5NKE0pO1xuXG5NTT1NO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZmF1bHRMaW1pdHMiOlsiZGVmYXVsdExpbWl0cyJdLCJjaGVja01hdGNoZXMiOlsiY2hlY2tNYXRjaGVzIl0sIm1hdGNoZXMiOlsibWF0Y2hlcyJdLCJmaXQiOlsiZml0Il0sImFzc2VydFBhdHRlcm4iOlsiYXNzZXJ0UGF0dGVybiJdLCJpc1BhdHRlcm4iOlsiaXNQYXR0ZXJuIl0sImFzc2VydEtleVBhdHRlcm4iOlsiYXNzZXJ0S2V5UGF0dGVybiJdLCJpc0tleVBhdHRlcm4iOlsiaXNLZXlQYXR0ZXJuIl0sImdldFJhbmtDb3ZlciI6WyJnZXRSYW5rQ292ZXIiXSwiTSI6WyJNIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHMpU07wPAAA8DwAAC4AAABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvcGF0dGVybnMvcmFua09yZGVyLmpzeyJpbXBvcnRzIjpbIi4vZW5jb2RlUGFzc2FibGUuanMiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsiRnVsbFJhbmtDb3ZlciIsImFzc2VydFJhbmtTb3J0ZWQiLCJjb21wYXJhdG9yTWlycm9ySW1hZ2UiLCJjb21wYXJlQW50aVJhbmsiLCJjb21wYXJlUmFuayIsImNvdmVyZWRFbnRyaWVzIiwiZ2V0SW5kZXhDb3ZlciIsImdldFBhc3NTdHlsZUNvdmVyIiwiaW50ZXJzZWN0UmFua0NvdmVycyIsImlzUmFua1NvcnRlZCIsIm1ha2VDb21wYXJhdG9yS2l0IiwibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQiLCJzb3J0QnlSYW5rIiwidW5pb25SYW5rQ292ZXJzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGdldFRhZyxuYW1lRm9yUGFzc2FibGVTeW1ib2wscGFzc1N0eWxlT2YscGFzc1N0eWxlUHJlZml4ZXMscmVjb3JkTmFtZXMscmVjb3JkVmFsdWVzOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcImdldFRhZ1wiLCBbJGjigI1fYSA9PiAoZ2V0VGFnID0gJGjigI1fYSldXSxbXCJuYW1lRm9yUGFzc2FibGVTeW1ib2xcIiwgWyRo4oCNX2EgPT4gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9ICRo4oCNX2EpXV0sW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXV1dLFtcIi4vZW5jb2RlUGFzc2FibGUuanNcIiwgW1tcInBhc3NTdHlsZVByZWZpeGVzXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVQcmVmaXhlcyA9ICRo4oCNX2EpXV0sW1wicmVjb3JkTmFtZXNcIiwgWyRo4oCNX2EgPT4gKHJlY29yZE5hbWVzID0gJGjigI1fYSldXSxbXCJyZWNvcmRWYWx1ZXNcIiwgWyRo4oCNX2EgPT4gKHJlY29yZFZhbHVlcyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuUGFzc1N0eWxlfSBQYXNzU3R5bGUgKi9cblxuY29uc3R7cXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5jb25zdHtlbnRyaWVzLGZyb21FbnRyaWVzLHNldFByb3RvdHlwZU9mLGlzfT1PYmplY3Q7XG5cbi8qKlxuICogVGhpcyBpcyB0aGUgZXF1YWxpdHkgY29tcGFyaXNvbiB1c2VkIGJ5IEphdmFTY3JpcHQncyBNYXAgYW5kIFNldFxuICogYWJzdHJhY3Rpb25zLCB3aGVyZSBOYU4gaXMgdGhlIHNhbWUgYXMgTmFOIGFuZCAtMCBpcyB0aGUgc2FtZSBhc1xuICogMC4gTWFyc2hhbCBzZXJpYWxpemVzIC0wIGFzIHplcm8sIHNvIHRoZSBzZW1hbnRpY3Mgb2Ygb3VyIGRpc3RyaWJ1dGVkXG4gKiBvYmplY3Qgc3lzdGVtIGRvZXMgbm90IGRpc3Rpbmd1aXNoIDAgZnJvbSAtMC5cbiAqXG4gKiBgc2FtZVZhbHVlWmVyb2AgaXMgdGhlIEVjbWFTY3JpcHQgc3BlYyBuYW1lIGZvciB0aGlzIGVxdWFsaXR5IGNvbXBhcmlzb24sXG4gKiBidXQgVE9ETyB3ZSBuZWVkIGEgYmV0dGVyIG5hbWUgZm9yIHRoZSBBUEkuXG4gKlxuICogQHBhcmFtIHthbnl9IHhcbiAqIEBwYXJhbSB7YW55fSB5XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3Qgc2FtZVZhbHVlWmVybz0oeCx5KT0+eD09PXl8fGlzKHgseSk7XG5cbmNvbnN0IHRyaXZpYWxDb21wYXJhdG9yPShsZWZ0LHJpZ2h0KT0+XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmVzdGVkLXRlcm5hcnkqL1xubGVmdDxyaWdodD8tMTpsZWZ0PT09cmlnaHQ/MDoxO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8UGFzc1N0eWxlLCB7IGluZGV4OiBudW1iZXIsIGNvdmVyOiBSYW5rQ292ZXIgfT59IFBhc3NTdHlsZVJhbmtzUmVjb3JkXG4gKi9cblxuY29uc3QgcGFzc1N0eWxlUmFua3M9LyoqIEB0eXBlIHtQYXNzU3R5bGVSYW5rc1JlY29yZH0gKi9cbmZyb21FbnRyaWVzKFxuZW50cmllcyhwYXNzU3R5bGVQcmVmaXhlcylcbi8qIFNvcnQgZW50cmllcyBieSBhc2NlbmRpbmcgcHJlZml4LiovLlxuc29ydCgoW19sZWZ0U3R5bGUsbGVmdFByZWZpeGVzXSxbX3JpZ2h0U3R5bGUscmlnaHRQcmVmaXhlc10pPT57XG5yZXR1cm4gdHJpdmlhbENvbXBhcmF0b3IobGVmdFByZWZpeGVzLHJpZ2h0UHJlZml4ZXMpO1xuIH0pLlxubWFwKChbcGFzc1N0eWxlLHByZWZpeGVzXSxpbmRleCk9Pntcbi8qIENvdmVyIGFsbCBzdHJpbmdzIHRoYXQgc3RhcnQgd2l0aCBhbnkgY2hhcmFjdGVyIGluIGBwcmVmaXhlc2AsKi9cbi8qIHZlcmlmeWluZyB0aGF0IGl0IGlzIHNvcnRlZCBzbyB0aGF0IGlzKi9cbi8qIGFsbCBzIHN1Y2ggdGhhdCBwcmVmaXhlcy5hdCgwKSDiiaQgcyA8IHN1Y2Nlc3NvcihwcmVmaXhlcy5hdCgtMSkpLiovXG5wcmVmaXhlcz09PVsuLi5wcmVmaXhlc10uc29ydCgpLmpvaW4oJycpfHxcbkZhaWwgYHVuc29ydGVkIHByZWZpeGVzIGZvciBwYXNzU3R5bGUgJHtxKHBhc3NTdHlsZSl9OiAke3EocHJlZml4ZXMpfWA7XG5jb25zdCBjb3Zlcj1bXG5wcmVmaXhlcy5jaGFyQXQoMCksXG5TdHJpbmcuZnJvbUNoYXJDb2RlKHByZWZpeGVzLmNoYXJDb2RlQXQocHJlZml4ZXMubGVuZ3RoLTEpKzEpXTtcblxucmV0dXJuW3Bhc3NTdHlsZSx7aW5kZXgsY292ZXJ9XTtcbiB9KSk7XG5cblxuc2V0UHJvdG90eXBlT2YocGFzc1N0eWxlUmFua3MsbnVsbCk7XG5oYXJkZW4ocGFzc1N0eWxlUmFua3MpO1xuXG4vKipcbiAqIEFzc29jaWF0ZSB3aXRoIGVhY2ggcGFzc1N0eWxlIGEgUmFua0NvdmVyIHRoYXQgbWF5IGJlIGFuIG92ZXJlc3RpbWF0ZSxcbiAqIGFuZCB3aG9zZSByZXN1bHRzIHRoZXJlZm9yZSBuZWVkIHRvIGJlIGZpbHRlcmVkIGRvd24uIEZvciBleGFtcGxlLCBiZWNhdXNlXG4gKiB0aGVyZSBpcyBub3QgYSBzbWFsbGVzdCBvciBiaWdnZXN0IGJpZ2ludCwgYm91bmQgaXQgYnkgYE5hTmAgKHRoZSBsYXN0IHBsYWNlXG4gKiBudW1iZXIpIGFuZCBgJydgICh0aGUgZW1wdHkgc3RyaW5nLCB3aGljaCBpcyB0aGUgZmlyc3QgcGxhY2Ugc3RyaW5nKS4gVGh1cyxcbiAqIGEgcmFuZ2UgcXVlcnkgdXNpbmcgdGhpcyByYW5nZSBtYXkgaW5jbHVkZSB0aGVzZSB2YWx1ZXMsIHdoaWNoIHdvdWxkIHRoZW5cbiAqIG5lZWQgdG8gYmUgZmlsdGVyZWQgb3V0LlxuICpcbiAqIEBwYXJhbSB7UGFzc1N0eWxlfSBwYXNzU3R5bGVcbiAqIEByZXR1cm5zIHtSYW5rQ292ZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBnZXRQYXNzU3R5bGVDb3Zlcj0ocGFzc1N0eWxlKT0+cGFzc1N0eWxlUmFua3NbcGFzc1N0eWxlXS5jb3ZlcjskaOKAjV9vbmNlLmdldFBhc3NTdHlsZUNvdmVyKGdldFBhc3NTdHlsZUNvdmVyKTtcbmhhcmRlbihnZXRQYXNzU3R5bGVDb3Zlcik7XG5cbi8qKlxuICogQHR5cGUge1dlYWtNYXA8UmFua0NvbXBhcmUsV2Vha1NldDxQYXNzYWJsZVtdPj59XG4gKi9cbmNvbnN0IG1lbW9PZlNvcnRlZD1uZXcgV2Vha01hcCgpO1xuXG4vKipcbiAqIEB0eXBlIHtXZWFrTWFwPFJhbmtDb21wYXJlLFJhbmtDb21wYXJlPn1cbiAqL1xuY29uc3QgY29tcGFyYXRvck1pcnJvckltYWdlcz1uZXcgV2Vha01hcCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmU9fSBjb21wYXJlUmVtb3RhYmxlc1xuICogQW4gb3B0aW9uIHRvIGNyZWF0ZSBhIGNvbXBhcmF0b3IgaW4gd2hpY2ggYW4gaW50ZXJuYWwgb3JkZXIgaXNcbiAqIGFzc2lnbmVkIHRvIHJlbW90YWJsZXMuIFRoaXMgZGVmYXVsdHMgdG8gYSBjb21wYXJhdG9yIHRoYXRcbiAqIGFsd2F5cyByZXR1cm5zIGAwYCwgbWVhbmluZyB0aGF0IGFsbCByZW1vdGFibGVzIGFyZSB0aWVkXG4gKiBmb3IgdGhlIHNhbWUgcmFuay5cbiAqIEByZXR1cm5zIHtSYW5rQ29tcGFyYXRvcktpdH1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VDb21wYXJhdG9yS2l0PShjb21wYXJlUmVtb3RhYmxlcz0oX3gsX3kpPT4wKT0+e1xuLyoqIEB0eXBlIHtSYW5rQ29tcGFyZX0gKi9cbmNvbnN0IGNvbXBhcmF0b3I9KGxlZnQscmlnaHQpPT57XG5pZihzYW1lVmFsdWVaZXJvKGxlZnQscmlnaHQpKXtcbnJldHVybiAwO1xuIH1cbmNvbnN0IGxlZnRTdHlsZT1wYXNzU3R5bGVPZihsZWZ0KTtcbmNvbnN0IHJpZ2h0U3R5bGU9cGFzc1N0eWxlT2YocmlnaHQpO1xuaWYobGVmdFN0eWxlIT09cmlnaHRTdHlsZSl7XG5yZXR1cm4gdHJpdmlhbENvbXBhcmF0b3IoXG5wYXNzU3R5bGVSYW5rc1tsZWZ0U3R5bGVdLmluZGV4LFxucGFzc1N0eWxlUmFua3NbcmlnaHRTdHlsZV0uaW5kZXgpO1xuXG4gfVxuc3dpdGNoKGxlZnRTdHlsZSl7XG5jYXNlJ3JlbW90YWJsZSc6e1xucmV0dXJuIGNvbXBhcmVSZW1vdGFibGVzKGxlZnQscmlnaHQpO1xuIH1cbmNhc2UndW5kZWZpbmVkJzpcbmNhc2UnbnVsbCc6XG5jYXNlJ2Vycm9yJzpcbmNhc2UncHJvbWlzZSc6e1xuLyogRm9yIGVhY2ggb2YgdGhlc2UgcGFzc1N0eWxlcywgYWxsIG1lbWJlcnMgb2YgdGhhdCBwYXNzU3R5bGUgYXJlIHRpZWQqL1xuLyogZm9yIHRoZSBzYW1lIHJhbmsuKi9cbnJldHVybiAwO1xuIH1cbmNhc2UnYm9vbGVhbic6XG5jYXNlJ2JpZ2ludCc6XG5jYXNlJ3N0cmluZyc6e1xuLyogV2l0aGluIGVhY2ggb2YgdGhlc2UgcGFzc1N0eWxlcywgdGhlIHJhbmsgb3JkZXJpbmcgYWdyZWVzIHdpdGgqL1xuLyogSmF2YVNjcmlwdCdzIHJlbGF0aW9uYWwgb3BlcmF0b3JzIGA8YCBhbmQgYD5gLiovXG5pZihsZWZ0PHJpZ2h0KXtcbnJldHVybi0xO1xuIH1lbHNle1xuYXNzZXJ0KGxlZnQ+cmlnaHQpO1xucmV0dXJuIDE7XG4gfVxuIH1cbmNhc2Unc3ltYm9sJzp7XG5yZXR1cm4gY29tcGFyYXRvcihcbm5hbWVGb3JQYXNzYWJsZVN5bWJvbChsZWZ0KSxcbm5hbWVGb3JQYXNzYWJsZVN5bWJvbChyaWdodCkpO1xuXG4gfVxuY2FzZSdudW1iZXInOntcbi8qIGBOYU5gJ3MgcmFuayBpcyBhZnRlciBhbGwgb3RoZXIgbnVtYmVycy4qL1xuaWYoTnVtYmVyLmlzTmFOKGxlZnQpKXtcbmFzc2VydCghTnVtYmVyLmlzTmFOKHJpZ2h0KSk7XG5yZXR1cm4gMTtcbiB9ZWxzZSBpZihOdW1iZXIuaXNOYU4ocmlnaHQpKXtcbnJldHVybi0xO1xuIH1cbi8qIFRoZSByYW5rIG9yZGVyaW5nIG9mIG5vbi1OYU4gbnVtYmVycyBhZ3JlZXMgd2l0aCBKYXZhU2NyaXB0J3MqL1xuLyogcmVsYXRpb25hbCBvcGVyYXRvcnMgJzwnIGFuZCAnPicuKi9cbmlmKGxlZnQ8cmlnaHQpe1xucmV0dXJuLTE7XG4gfWVsc2V7XG5hc3NlcnQobGVmdD5yaWdodCk7XG5yZXR1cm4gMTtcbiB9XG4gfVxuY2FzZSdjb3B5UmVjb3JkJzp7XG4vKiBMZXhpY29ncmFwaGljIGJ5IGludmVyc2Ugc29ydGVkIG9yZGVyIG9mIHByb3BlcnR5IG5hbWVzLCB0aGVuKi9cbi8qIGxleGljb2dyYXBoaWMgYnkgY29ycmVzcG9uZGluZyB2YWx1ZXMgaW4gdGhhdCBzYW1lIGludmVyc2UqL1xuLyogb3JkZXIgb2YgdGhlaXIgcHJvcGVydHkgbmFtZXMuIENvbXBhcmluZyBuYW1lcyBieSB0aGVtc2VsdmVzIGZpcnN0LCovXG4vKiBhbGwgcmVjb3JkcyB3aXRoIHRoZSBleGFjdCBzYW1lIHNldCBvZiBwcm9wZXJ0eSBuYW1lcyBzb3J0IG5leHQgdG8qL1xuLyogZWFjaCBvdGhlciBpbiBhIHJhbmstc29ydCBvZiBjb3B5UmVjb3Jkcy4qL1xuXG4vKiBUaGUgY29weVJlY29yZCBpbnZhcmlhbnRzIGVuZm9yY2VkIGJ5IHBhc3NTdHlsZU9mIGVuc3VyZSB0aGF0Ki9cbi8qIGFsbCB0aGUgcHJvcGVydHkgbmFtZXMgYXJlIHN0cmluZ3MuIFdlIG5lZWQgdGhlIHJldmVyc2Ugc29ydGVkIG9yZGVyKi9cbi8qIG9mIHRoZXNlIG5hbWVzLCB3aGljaCB3ZSB0aGVuIGNvbXBhcmUgbGV4aWNvZ3JhcGhpY2FsbHkuIFRoaXMgZW5zdXJlcyovXG4vKiB0aGF0IGlmIHRoZSBuYW1lcyBvZiByZWNvcmQgWCBhcmUgYSBzdWJzZXQgb2YgdGhlIG5hbWVzIG9mIHJlY29yZCBZLCovXG4vKiB0aGVuIHJlY29yZCBYIHdpbGwgaGF2ZSBhbiBlYXJsaWVyIHJhbmsgYW5kIHNvcnQgdG8gdGhlIGxlZnQgb2YgWS4qL1xuY29uc3QgbGVmdE5hbWVzPXJlY29yZE5hbWVzKGxlZnQpO1xuY29uc3QgcmlnaHROYW1lcz1yZWNvcmROYW1lcyhyaWdodCk7XG5cbmNvbnN0IHJlc3VsdD1jb21wYXJhdG9yKGxlZnROYW1lcyxyaWdodE5hbWVzKTtcbmlmKHJlc3VsdCE9PTApe1xucmV0dXJuIHJlc3VsdDtcbiB9XG5yZXR1cm4gY29tcGFyYXRvcihcbnJlY29yZFZhbHVlcyhsZWZ0LGxlZnROYW1lcyksXG5yZWNvcmRWYWx1ZXMocmlnaHQscmlnaHROYW1lcykpO1xuXG4gfVxuY2FzZSdjb3B5QXJyYXknOntcbi8qIExleGljb2dyYXBoaWMqL1xuY29uc3QgbGVuPU1hdGgubWluKGxlZnQubGVuZ3RoLHJpZ2h0Lmxlbmd0aCk7XG5mb3IobGV0IGk9MDtpPGxlbjtpKz0xKXtcbmNvbnN0IHJlc3VsdD1jb21wYXJhdG9yKGxlZnRbaV0scmlnaHRbaV0pO1xuaWYocmVzdWx0IT09MCl7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbiB9XG4vKiBJZiBhbGwgbWF0Y2hpbmcgZWxlbWVudHMgd2VyZSB0aWVkLCB0aGVuIGFjY29yZGluZyB0byB0aGVpciBsZW5ndGhzLiovXG4vKiBJZiBhcnJheSBYIGlzIGEgcHJlZml4IG9mIGFycmF5IFksIHRoZW4gWCBoYXMgYW4gZWFybGllciByYW5rIHRoYW4gWS4qL1xucmV0dXJuIGNvbXBhcmF0b3IobGVmdC5sZW5ndGgscmlnaHQubGVuZ3RoKTtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xuLyogTGV4aWNvZ3JhcGhpYyBieSBgW1N5bWJvbC50b1N0cmluZ1RhZ11gIHRoZW4gYC5wYXlsb2FkYC4qL1xuY29uc3QgbGFiZWxDb21wPWNvbXBhcmF0b3IoZ2V0VGFnKGxlZnQpLGdldFRhZyhyaWdodCkpO1xuaWYobGFiZWxDb21wIT09MCl7XG5yZXR1cm4gbGFiZWxDb21wO1xuIH1cbnJldHVybiBjb21wYXJhdG9yKGxlZnQucGF5bG9hZCxyaWdodC5wYXlsb2FkKTtcbiB9XG5kZWZhdWx0OntcbnRocm93IEZhaWwgYFVucmVjb2duaXplZCBwYXNzU3R5bGU6ICR7cShsZWZ0U3R5bGUpfWA7XG4gfX1cblxuIH07XG5cbi8qKiBAdHlwZSB7UmFua0NvbXBhcmV9ICovXG5jb25zdCBhbnRpQ29tcGFyYXRvcj0oeCx5KT0+Y29tcGFyYXRvcih5LHgpO1xuXG5tZW1vT2ZTb3J0ZWQuc2V0KGNvbXBhcmF0b3IsbmV3IFdlYWtTZXQoKSk7XG5tZW1vT2ZTb3J0ZWQuc2V0KGFudGlDb21wYXJhdG9yLG5ldyBXZWFrU2V0KCkpO1xuY29tcGFyYXRvck1pcnJvckltYWdlcy5zZXQoY29tcGFyYXRvcixhbnRpQ29tcGFyYXRvcik7XG5jb21wYXJhdG9yTWlycm9ySW1hZ2VzLnNldChhbnRpQ29tcGFyYXRvcixjb21wYXJhdG9yKTtcblxucmV0dXJuIGhhcmRlbih7Y29tcGFyYXRvcixhbnRpQ29tcGFyYXRvcn0pO1xuIH07XG4vKipcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmF0b3JcbiAqIEByZXR1cm5zIHtSYW5rQ29tcGFyZT19XG4gKi8kaOKAjV9vbmNlLm1ha2VDb21wYXJhdG9yS2l0KG1ha2VDb21wYXJhdG9yS2l0KTtcbmNvbnN0ICAgICAgICBjb21wYXJhdG9yTWlycm9ySW1hZ2U9KGNvbXBhcmF0b3IpPT5cbmNvbXBhcmF0b3JNaXJyb3JJbWFnZXMuZ2V0KGNvbXBhcmF0b3IpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gcGFzc2FibGVzXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqLyRo4oCNX29uY2UuY29tcGFyYXRvck1pcnJvckltYWdlKGNvbXBhcmF0b3JNaXJyb3JJbWFnZSk7XG5jb25zdCAgICAgICAgaXNSYW5rU29ydGVkPShwYXNzYWJsZXMsY29tcGFyZSk9PntcbmNvbnN0IHN1Yk1lbW9PZlNvcnRlZD1tZW1vT2ZTb3J0ZWQuZ2V0KGNvbXBhcmUpO1xuYXNzZXJ0KHN1Yk1lbW9PZlNvcnRlZCE9PXVuZGVmaW5lZCk7XG5pZihzdWJNZW1vT2ZTb3J0ZWQuaGFzKHBhc3NhYmxlcykpe1xucmV0dXJuIHRydWU7XG4gfVxuYXNzZXJ0KHBhc3NTdHlsZU9mKHBhc3NhYmxlcyk9PT0nY29weUFycmF5Jyk7XG5mb3IobGV0IGk9MTtpPHBhc3NhYmxlcy5sZW5ndGg7aSs9MSl7XG5pZihjb21wYXJlKHBhc3NhYmxlc1tpLTFdLHBhc3NhYmxlc1tpXSk+PTEpe1xucmV0dXJuIGZhbHNlO1xuIH1cbiB9XG5zdWJNZW1vT2ZTb3J0ZWQuYWRkKHBhc3NhYmxlcyk7XG5yZXR1cm4gdHJ1ZTtcbiB9OyRo4oCNX29uY2UuaXNSYW5rU29ydGVkKGlzUmFua1NvcnRlZCk7XG5oYXJkZW4oaXNSYW5rU29ydGVkKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IHNvcnRlZFxuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICovXG5jb25zdCAgICAgICAgYXNzZXJ0UmFua1NvcnRlZD0oc29ydGVkLGNvbXBhcmUpPT5cbmlzUmFua1NvcnRlZChzb3J0ZWQsY29tcGFyZSl8fFxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbkZhaWwgYE11c3QgYmUgcmFuayBzb3J0ZWQ6ICR7c29ydGVkfSB2cyAke3NvcnRCeVJhbmsoc29ydGVkLGNvbXBhcmUpfWA7JGjigI1fb25jZS5hc3NlcnRSYW5rU29ydGVkKGFzc2VydFJhbmtTb3J0ZWQpO1xuaGFyZGVuKGFzc2VydFJhbmtTb3J0ZWQpO1xuXG4vKipcbiAqIFRPRE8gU0VDVVJJVFkgQlVHOiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQyNjBcbiAqIHNvcnRCeVJhbmsgY3VycmVudGx5IHVzZXMgYEFycmF5LnByb3RvdHlwZS5zb3J0YCBkaXJlY3RseSwgYW5kXG4gKiBzbyBvbmx5IHdvcmtzIGNvcnJlY3RseSB3aGVuIGdpdmVuIGEgYGNvbXBhcmVgIGZ1bmN0aW9uIHRoYXQgY29uc2lkZXJzXG4gKiBgdW5kZWZpbmVkYCBzdHJpY3RseSBiaWdnZXIgKGA+YCkgdGhhbiBldmVyeXRoaW5nIGVsc2UuIFRoaXMgaXNcbiAqIGJlY2F1c2UgYEFycmF5LnByb3RvdHlwZS5zb3J0YCBiaXphcnJlbHkgbW92ZXMgYWxsIGB1bmRlZmluZWRgcyB0b1xuICogdGhlIGVuZCBvZiB0aGUgYXJyYXkgcmVnYXJkbGVzcywgd2l0aG91dCBjb25zdWx0aW5nIHRoZSBgY29tcGFyZWBcbiAqIGZ1bmN0aW9uLiBUaGlzIGlzIGEgZ2VudWluZSBidWcgZm9yIHVzIE5PVyBiZWNhdXNlIHNvbWV0aW1lcyB3ZSBzb3J0XG4gKiBpbiByZXZlcnNlIG9yZGVyIGJ5IHBhc3NpbmcgYSByZXZlcnNlZCByYW5rIGNvbXBhcmlzb24gZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHtJdGVyYWJsZTxQYXNzYWJsZT59IHBhc3NhYmxlc1xuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHJldHVybnMge1Bhc3NhYmxlW119XG4gKi9cbmNvbnN0ICAgICAgICBzb3J0QnlSYW5rPShwYXNzYWJsZXMsY29tcGFyZSk9PntcbmlmKEFycmF5LmlzQXJyYXkocGFzc2FibGVzKSl7XG5oYXJkZW4ocGFzc2FibGVzKTtcbi8qIENhbGxpbmcgaXNSYW5rU29ydGVkIGdpdmVzIGl0IGEgY2hhbmNlIHRvIGdldCBtZW1vaXplZCBmb3IqL1xuLyogdGhpcyBgY29tcGFyZWAgZnVuY3Rpb24gZXZlbiBpZiBpdCB3YXMgYWxyZWFkeSBtZW1vaXplZCBmb3IgYSBkaWZmZXJlbnQqL1xuLyogYGNvbXBhcmVgIGZ1bmN0aW9uLiovXG5pZihpc1JhbmtTb3J0ZWQocGFzc2FibGVzLGNvbXBhcmUpKXtcbnJldHVybiBwYXNzYWJsZXM7XG4gfVxuIH1cbmNvbnN0IHVuc29ydGVkPVsuLi5wYXNzYWJsZXNdO1xudW5zb3J0ZWQuZm9yRWFjaChoYXJkZW4pO1xuY29uc3Qgc29ydGVkPWhhcmRlbih1bnNvcnRlZC5zb3J0KGNvbXBhcmUpKTtcbmNvbnN0IHN1Yk1lbW9PZlNvcnRlZD1tZW1vT2ZTb3J0ZWQuZ2V0KGNvbXBhcmUpO1xuYXNzZXJ0KHN1Yk1lbW9PZlNvcnRlZCE9PXVuZGVmaW5lZCk7XG5zdWJNZW1vT2ZTb3J0ZWQuYWRkKHNvcnRlZCk7XG5yZXR1cm4gc29ydGVkO1xuIH07JGjigI1fb25jZS5zb3J0QnlSYW5rKHNvcnRCeVJhbmspO1xuaGFyZGVuKHNvcnRCeVJhbmspO1xuXG4vKipcbiAqIFNlZVxuICogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQmluYXJ5X3NlYXJjaF9hbGdvcml0aG0jUHJvY2VkdXJlX2Zvcl9maW5kaW5nX3RoZV9sZWZ0bW9zdF9lbGVtZW50XG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBzb3J0ZWRcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGtleVxuICogQHBhcmFtIHsoXCJsZWZ0TW9zdFwiIHwgXCJyaWdodE1vc3RcIik9fSBiaWFzXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5jb25zdCByYW5rU2VhcmNoPShzb3J0ZWQsY29tcGFyZSxrZXksYmlhcz0nbGVmdE1vc3QnKT0+e1xuYXNzZXJ0UmFua1NvcnRlZChzb3J0ZWQsY29tcGFyZSk7XG5sZXQgbGVmdD0wO1xubGV0IHJpZ2h0PXNvcnRlZC5sZW5ndGg7XG53aGlsZShsZWZ0PHJpZ2h0KXtcbmNvbnN0IG09TWF0aC5mbG9vcigobGVmdCtyaWdodCkvMik7XG5jb25zdCBjb21wPWNvbXBhcmUoc29ydGVkW21dLGtleSk7XG5pZihjb21wPD0tMXx8Y29tcD09PTAmJmJpYXM9PT0ncmlnaHRNb3N0Jyl7XG5sZWZ0PW0rMTtcbiB9ZWxzZXtcbmFzc2VydChjb21wPj0xfHxjb21wPT09MCYmYmlhcz09PSdsZWZ0TW9zdCcpO1xucmlnaHQ9bTtcbiB9XG4gfVxucmV0dXJuIGJpYXM9PT0nbGVmdE1vc3QnP2xlZnQ6cmlnaHQtMTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gc29ydGVkXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1JhbmtDb3Zlcn0gcmFua0NvdmVyXG4gKiBAcmV0dXJucyB7SW5kZXhDb3Zlcn1cbiAqL1xuY29uc3QgICAgICAgIGdldEluZGV4Q292ZXI9KHNvcnRlZCxjb21wYXJlLFtsZWZ0S2V5LHJpZ2h0S2V5XSk9PntcbmFzc2VydFJhbmtTb3J0ZWQoc29ydGVkLGNvbXBhcmUpO1xuY29uc3QgbGVmdEluZGV4PXJhbmtTZWFyY2goc29ydGVkLGNvbXBhcmUsbGVmdEtleSwnbGVmdE1vc3QnKTtcbmNvbnN0IHJpZ2h0SW5kZXg9cmFua1NlYXJjaChzb3J0ZWQsY29tcGFyZSxyaWdodEtleSwncmlnaHRNb3N0Jyk7XG5yZXR1cm5bbGVmdEluZGV4LHJpZ2h0SW5kZXhdO1xuIH07JGjigI1fb25jZS5nZXRJbmRleENvdmVyKGdldEluZGV4Q292ZXIpO1xuaGFyZGVuKGdldEluZGV4Q292ZXIpO1xuXG4vKiogQHR5cGUge1JhbmtDb3Zlcn0gKi9cbmNvbnN0ICAgICAgICBGdWxsUmFua0NvdmVyPWhhcmRlbihbJycsJ3snXSk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBzb3J0ZWRcbiAqIEBwYXJhbSB7SW5kZXhDb3Zlcn0gaW5kZXhDb3ZlclxuICogQHJldHVybnMge0l0ZXJhYmxlPFtudW1iZXIsIFBhc3NhYmxlXT59XG4gKi8kaOKAjV9vbmNlLkZ1bGxSYW5rQ292ZXIoRnVsbFJhbmtDb3Zlcik7XG5jb25zdCAgICAgICAgY292ZXJlZEVudHJpZXM9KHNvcnRlZCxbbGVmdEluZGV4LHJpZ2h0SW5kZXhdKT0+e1xuLyoqIEB0eXBlIHtJdGVyYWJsZTxbbnVtYmVyLCBQYXNzYWJsZV0+fSAqL1xuY29uc3QgaXRlcmFibGU9aGFyZGVuKHtcbltTeW1ib2wuaXRlcmF0b3JdOigpPT57XG5sZXQgaT1sZWZ0SW5kZXg7XG5yZXR1cm4gaGFyZGVuKHtcbm5leHQ6KCk9PntcbmlmKGk8PXJpZ2h0SW5kZXgpe1xuY29uc3QgZWxlbWVudD1zb3J0ZWRbaV07XG5pKz0xO1xucmV0dXJuIGhhcmRlbih7dmFsdWU6W2ksZWxlbWVudF0sZG9uZTpmYWxzZX0pO1xuIH1lbHNle1xucmV0dXJuIGhhcmRlbih7dmFsdWU6dW5kZWZpbmVkLGRvbmU6dHJ1ZX0pO1xuIH1cbiB9fSk7XG5cbiB9fSk7XG5cbnJldHVybiBpdGVyYWJsZTtcbiB9OyRo4oCNX29uY2UuY292ZXJlZEVudHJpZXMoY292ZXJlZEVudHJpZXMpO1xuaGFyZGVuKGNvdmVyZWRFbnRyaWVzKTtcblxuLyoqXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBhXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBiXG4gKiBAcmV0dXJucyB7UGFzc2FibGV9XG4gKi9cbmNvbnN0IG1heFJhbms9KGNvbXBhcmUsYSxiKT0+Y29tcGFyZShhLGIpPj0wP2E6YjtcblxuLyoqXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBhXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBiXG4gKiBAcmV0dXJucyB7UGFzc2FibGV9XG4gKi9cbmNvbnN0IG1pblJhbms9KGNvbXBhcmUsYSxiKT0+Y29tcGFyZShhLGIpPD0wP2E6YjtcblxuLyoqXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1JhbmtDb3ZlcltdfSBjb3ZlcnNcbiAqIEByZXR1cm5zIHtSYW5rQ292ZXJ9XG4gKi9cbmNvbnN0ICAgICAgICB1bmlvblJhbmtDb3ZlcnM9KGNvbXBhcmUsY292ZXJzKT0+e1xuLyoqXG4gKiBAcGFyYW0ge1JhbmtDb3Zlcn0gYVxuICogQHBhcmFtIHtSYW5rQ292ZXJ9IGJcbiAqIEByZXR1cm5zIHtSYW5rQ292ZXJ9XG4gKi9cbmNvbnN0IHVuaW9uUmFua0NvdmVyUGFpcj0oW2xlZnRBLHJpZ2h0QV0sW2xlZnRCLHJpZ2h0Ql0pPT5bXG5taW5SYW5rKGNvbXBhcmUsbGVmdEEsbGVmdEIpLFxubWF4UmFuayhjb21wYXJlLHJpZ2h0QSxyaWdodEIpXTtcblxucmV0dXJuIGNvdmVycy5yZWR1Y2UodW5pb25SYW5rQ292ZXJQYWlyLFsneycsJyddKTtcbiB9OyRo4oCNX29uY2UudW5pb25SYW5rQ292ZXJzKHVuaW9uUmFua0NvdmVycyk7XG5oYXJkZW4odW5pb25SYW5rQ292ZXJzKTtcblxuLyoqXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1JhbmtDb3ZlcltdfSBjb3ZlcnNcbiAqIEByZXR1cm5zIHtSYW5rQ292ZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBpbnRlcnNlY3RSYW5rQ292ZXJzPShjb21wYXJlLGNvdmVycyk9Pntcbi8qKlxuICogQHBhcmFtIHtSYW5rQ292ZXJ9IGFcbiAqIEBwYXJhbSB7UmFua0NvdmVyfSBiXG4gKiBAcmV0dXJucyB7UmFua0NvdmVyfVxuICovXG5jb25zdCBpbnRlcnNlY3RSYW5rQ292ZXJQYWlyPShbbGVmdEEscmlnaHRBXSxbbGVmdEIscmlnaHRCXSk9Pltcbm1heFJhbmsoY29tcGFyZSxsZWZ0QSxsZWZ0QiksXG5taW5SYW5rKGNvbXBhcmUscmlnaHRBLHJpZ2h0QildO1xuXG5yZXR1cm4gY292ZXJzLnJlZHVjZShpbnRlcnNlY3RSYW5rQ292ZXJQYWlyLFsnJywneyddKTtcbiB9OyRo4oCNX29uY2UuaW50ZXJzZWN0UmFua0NvdmVycyhpbnRlcnNlY3RSYW5rQ292ZXJzKTtcblxuY29uc3QgICAgICAge2NvbXBhcmF0b3I6Y29tcGFyZVJhbmssYW50aUNvbXBhcmF0b3I6Y29tcGFyZUFudGlSYW5rfT1cbm1ha2VDb21wYXJhdG9yS2l0KCk7XG5cbi8qKlxuICogQ3JlYXRlIGEgY29tcGFyYXRvciBraXQgaW4gd2hpY2ggcmVtb3RhYmxlcyBhcmUgZnVsbHkgb3JkZXJlZFxuICogYnkgdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgYXJlIGZpcnN0IHNlZW4gYnkgKnRoaXMqIGNvbXBhcmF0b3Iga2l0LlxuICogQkVXQVJFOiBUaGlzIGlzIG9ic2VydmFibGUgbXV0YWJsZSBzdGF0ZSwgc28gc3VjaCBhIGNvbXBhcmF0b3Iga2l0XG4gKiBzaG91bGQgbmV2ZXIgYmUgc2hhcmVkIGFtb25nIHN1YnN5c3RlbXMgdGhhdCBzaG91bGQgbm90IGJlIGFibGVcbiAqIHRvIGNvbW11bmljYXRlLlxuICpcbiAqIE5vdGUgdGhhdCB0aGlzIG9yZGVyIGRvZXMgbm90IG1lZXQgdGhlIHJlcXVpcmVtZW50cyBmb3Igc3RvcmVcbiAqIG9yZGVyaW5nLCBzaW5jZSBpdCBoYXMgbm8gbWVtb3J5IG9mIGRlbGV0ZWQga2V5cy5cbiAqXG4gKiBUaGVzZSBmdWxsIG9yZGVyIGNvbXBhcmF0b3Iga2l0IGlzIHN0cmljdGx5IG1vcmUgcHJlY2lzZSB0aGF0IHRoZVxuICogcmFuayBvcmRlciBjb21wYXJhdG9yIGtpdHMgYWJvdmUuIEFzIGEgcmVzdWx0LCBhbnkgYXJyYXkgd2hpY2ggaXNcbiAqIHNvcnRlZCBieSBzdWNoIGEgZnVsbCBvcmRlciB3aWxsIHBhc3MgdGhlIGlzUmFua1NvcnRlZCB0ZXN0IHdpdGhcbiAqIGEgY29ycmVzcG9uZGluZyByYW5rIG9yZGVyLlxuICpcbiAqIEFuIGFycmF5IHdoaWNoIGlzIHNvcnRlZCBieSBhICpmcmVzaCogZnVsbCBvcmRlciBjb21wYXJhdG9yLCBpLmUuLFxuICogb25lIHRoYXQgaGFzIG5vdCB5ZXQgc2VlbiBhbnkgcmVtb3RhYmxlcywgd2lsbCBvZiBjb3Vyc2UgcmVtYWluXG4gKiBzb3J0ZWQgYnkgYWNjb3JkaW5nIHRvICp0aGF0KiBmdWxsIG9yZGVyIGNvbXBhcmF0b3IuIEFuIGFycmF5ICpvZlxuICogc2NhbGFycyogc29ydGVkIGJ5IGEgZnJlc2ggZnVsbCBvcmRlciB3aWxsIHJlbWFpbiBzb3J0ZWQgZXZlblxuICogYWNjb3JkaW5nIHRvIGEgbmV3IGZyZXNoIGZ1bGwgb3JkZXIgY29tcGFyYXRvciwgc2luY2UgaXQgd2lsbCBzZWVcbiAqIHRoZSByZW1vdGFibGVzIGluIHRoZSBzYW1lIG9yZGVyIGFnYWluLiBVbmZvcnR1bmF0ZWx5LCB0aGlzIGlzXG4gKiBub3QgdHJ1ZSBvZiBhcnJheXMgb2YgcGFzc2FibGVzIGluIGdlbmVyYWwuXG4gKlxuICogQHBhcmFtIHtib29sZWFuPX0gbG9uZ0xpdmVkXG4gKiBAcmV0dXJucyB7RnVsbENvbXBhcmF0b3JLaXR9XG4gKi8kaOKAjV9vbmNlLmNvbXBhcmVSYW5rKGNvbXBhcmVSYW5rKTskaOKAjV9vbmNlLmNvbXBhcmVBbnRpUmFuayhjb21wYXJlQW50aVJhbmspO1xuY29uc3QgICAgICAgIG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0PShsb25nTGl2ZWQ9ZmFsc2UpPT57XG5sZXQgbnVtU2Vlbj0wO1xuLyogV2hlbiBkeW5hbWljYWxseSBjcmVhdGVkIHdpdGggc2hvcnQgbGlmZXRpbWVzICh0aGUgZGVmYXVsdCkgYSBXZWFrTWFwKi9cbi8qIHdvdWxkIHBlcmZvcm0gcG9vcmx5LCBhbmQgdGhlIGxlYWsgY3JlYXRlZCBieSBhIE1hcCBvbmx5IGxhc3RzIGFzIGxvbmcqL1xuLyogYXMgdGhlIE1hcC4qL1xuY29uc3QgTWFwQ29uc3RydWN0b3I9bG9uZ0xpdmVkP1dlYWtNYXA6TWFwO1xuY29uc3Qgc2Vlbj1uZXcgTWFwQ29uc3RydWN0b3IoKTtcbmNvbnN0IHRhZz0ocik9PntcbmlmKHNlZW4uaGFzKHIpKXtcbnJldHVybiBzZWVuLmdldChyKTtcbiB9XG5udW1TZWVuKz0xO1xuc2Vlbi5zZXQocixudW1TZWVuKTtcbnJldHVybiBudW1TZWVuO1xuIH07XG5jb25zdCBjb21wYXJlUmVtb3RhYmxlcz0oeCx5KT0+Y29tcGFyZVJhbmsodGFnKHgpLHRhZyh5KSk7XG5yZXR1cm4gbWFrZUNvbXBhcmF0b3JLaXQoY29tcGFyZVJlbW90YWJsZXMpO1xuIH07JGjigI1fb25jZS5tYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCk7XG5oYXJkZW4obWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImdldFBhc3NTdHlsZUNvdmVyIjpbImdldFBhc3NTdHlsZUNvdmVyIl0sIm1ha2VDb21wYXJhdG9yS2l0IjpbIm1ha2VDb21wYXJhdG9yS2l0Il0sImNvbXBhcmF0b3JNaXJyb3JJbWFnZSI6WyJjb21wYXJhdG9yTWlycm9ySW1hZ2UiXSwiaXNSYW5rU29ydGVkIjpbImlzUmFua1NvcnRlZCJdLCJhc3NlcnRSYW5rU29ydGVkIjpbImFzc2VydFJhbmtTb3J0ZWQiXSwic29ydEJ5UmFuayI6WyJzb3J0QnlSYW5rIl0sImdldEluZGV4Q292ZXIiOlsiZ2V0SW5kZXhDb3ZlciJdLCJGdWxsUmFua0NvdmVyIjpbIkZ1bGxSYW5rQ292ZXIiXSwiY292ZXJlZEVudHJpZXMiOlsiY292ZXJlZEVudHJpZXMiXSwidW5pb25SYW5rQ292ZXJzIjpbInVuaW9uUmFua0NvdmVycyJdLCJpbnRlcnNlY3RSYW5rQ292ZXJzIjpbImludGVyc2VjdFJhbmtDb3ZlcnMiXSwiY29tcGFyZVJhbmsiOlsiY29tcGFyZVJhbmsiXSwiY29tcGFyZUFudGlSYW5rIjpbImNvbXBhcmVBbnRpUmFuayJdLCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCI6WyJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA4EE4s9RUAAPUVAAAxAAAAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL3N0b3Jlcy9zY2FsYXJNYXBTdG9yZS5qc3siaW1wb3J0cyI6WyIuLi9rZXlzL2NoZWNrS2V5LmpzIiwiLi4vcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzIiwiLi4vcGF0dGVybnMvcmFua09yZGVyLmpzIiwiLi9zY2FsYXJXZWFrTWFwU3RvcmUuanMiLCIuL3N0b3JlLXV0aWxzLmpzIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbIm1ha2VNYXBTdG9yZU1ldGhvZHMiLCJtYWtlU2NhbGFyTWFwU3RvcmUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRmFyLGFzc2VydFBhc3NhYmxlLGZpbHRlckl0ZXJhYmxlLG1hcEl0ZXJhYmxlLGNvbXBhcmVSYW5rLGFzc2VydFNjYWxhcktleSxtYWtlQ29weU1hcCxtYXRjaGVzLGZpdCxhc3NlcnRQYXR0ZXJuLG1ha2VXZWFrTWFwU3RvcmVNZXRob2RzLG1ha2VDdXJyZW50S2V5c0tpdDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0UGFzc2FibGVcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhc3NhYmxlID0gJGjigI1fYSldXSxbXCJmaWx0ZXJJdGVyYWJsZVwiLCBbJGjigI1fYSA9PiAoZmlsdGVySXRlcmFibGUgPSAkaOKAjV9hKV1dLFtcIm1hcEl0ZXJhYmxlXCIsIFskaOKAjV9hID0+IChtYXBJdGVyYWJsZSA9ICRo4oCNX2EpXV1dXSxbXCIuLi9wYXR0ZXJucy9yYW5rT3JkZXIuanNcIiwgW1tcImNvbXBhcmVSYW5rXCIsIFskaOKAjV9hID0+IChjb21wYXJlUmFuayA9ICRo4oCNX2EpXV1dXSxbXCIuLi9rZXlzL2NoZWNrS2V5LmpzXCIsIFtbXCJhc3NlcnRTY2FsYXJLZXlcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFNjYWxhcktleSA9ICRo4oCNX2EpXV0sW1wibWFrZUNvcHlNYXBcIiwgWyRo4oCNX2EgPT4gKG1ha2VDb3B5TWFwID0gJGjigI1fYSldXV1dLFtcIi4uL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qc1wiLCBbW1wibWF0Y2hlc1wiLCBbJGjigI1fYSA9PiAobWF0Y2hlcyA9ICRo4oCNX2EpXV0sW1wiZml0XCIsIFskaOKAjV9hID0+IChmaXQgPSAkaOKAjV9hKV1dLFtcImFzc2VydFBhdHRlcm5cIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhdHRlcm4gPSAkaOKAjV9hKV1dXV0sW1wiLi9zY2FsYXJXZWFrTWFwU3RvcmUuanNcIiwgW1tcIm1ha2VXZWFrTWFwU3RvcmVNZXRob2RzXCIsIFskaOKAjV9hID0+IChtYWtlV2Vha01hcFN0b3JlTWV0aG9kcyA9ICRo4oCNX2EpXV1dXSxbXCIuL3N0b3JlLXV0aWxzLmpzXCIsIFtbXCJtYWtlQ3VycmVudEtleXNLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VDdXJyZW50S2V5c0tpdCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0e3F1b3RlOnF9PWFzc2VydDtcblxuLyoqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAcGFyYW0ge01hcDxLLFY+fSBqc21hcFxuICogQHBhcmFtIHsoazogSywgdjogVikgPT4gdm9pZH0gYXNzZXJ0S1ZPa1RvQWRkXG4gKiBAcGFyYW0geyhrOiBLLCB2OiBWKSA9PiB2b2lkfSBhc3NlcnRLVk9rVG9TZXRcbiAqIEBwYXJhbSB7KChrOiBLKSA9PiB2b2lkKT19IGFzc2VydEtleU9rVG9EZWxldGVcbiAqIEBwYXJhbSB7c3RyaW5nPX0gdGFnXG4gKiBAcmV0dXJucyB7TWFwU3RvcmU8SyxWPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VNYXBTdG9yZU1ldGhvZHM9KFxuanNtYXAsXG5hc3NlcnRLVk9rVG9BZGQsXG5hc3NlcnRLVk9rVG9TZXQsXG5hc3NlcnRLZXlPa1RvRGVsZXRlPXVuZGVmaW5lZCxcbnRhZz0na2V5Jyk9Plxue1xuY29uc3R7YXNzZXJ0VXBkYXRlT25BZGQsYXNzZXJ0VXBkYXRlT25EZWxldGUsaXRlcmFibGVLZXlzfT1cbm1ha2VDdXJyZW50S2V5c0tpdChcbigpPT5qc21hcC5rZXlzKCksXG4oayk9PmpzbWFwLmhhcyhrKSxcbmNvbXBhcmVSYW5rLFxuYXNzZXJ0S1ZPa1RvQWRkLFxuYXNzZXJ0S2V5T2tUb0RlbGV0ZSxcbnRhZyk7XG5cblxuLyoqXG4gKiBAcGFyYW0ge1BhdHRlcm49fSBrZXlQYXR0XG4gKiBAcGFyYW0ge1BhdHRlcm49fSB2YWx1ZVBhdHRcbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxLPn1cbiAqL1xuY29uc3Qga2V5cz0oa2V5UGF0dD11bmRlZmluZWQsdmFsdWVQYXR0PXVuZGVmaW5lZCk9PntcbmlmKGtleVBhdHQ9PT11bmRlZmluZWQmJnZhbHVlUGF0dD09PXVuZGVmaW5lZCl7XG5yZXR1cm4gaXRlcmFibGVLZXlzO1xuIH1cbmNvbnN0IGZpbHRlcj0oayk9PntcbmlmKGtleVBhdHQhPT11bmRlZmluZWQmJiFtYXRjaGVzKGssa2V5UGF0dCkpe1xucmV0dXJuIGZhbHNlO1xuIH1cbi8qIFVzZXMgdGhlIGN1cnJlbnQganNtYXAgdmFsdWUsIHNpbmNlIHRoZSBpdGVyYXRhdG9yIHN1cnZpdmVzIGAuc2V0YCovXG5pZih2YWx1ZVBhdHQhPT11bmRlZmluZWQmJiFtYXRjaGVzKGpzbWFwLmdldChrKSx2YWx1ZVBhdHQpKXtcbnJldHVybiBmYWxzZTtcbiB9XG5yZXR1cm4gdHJ1ZTtcbiB9O1xucmV0dXJuIGZpbHRlckl0ZXJhYmxlKGl0ZXJhYmxlS2V5cyxmaWx0ZXIpO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtQYXR0ZXJuPX0ga2V5UGF0dFxuICogQHBhcmFtIHtQYXR0ZXJuPX0gdmFsdWVQYXR0XG4gKiBAcmV0dXJucyB7SXRlcmFibGU8Vj59XG4gKi9cbmNvbnN0IHZhbHVlcz0oa2V5UGF0dD11bmRlZmluZWQsdmFsdWVQYXR0PXVuZGVmaW5lZCk9PlxubWFwSXRlcmFibGUoa2V5cyhrZXlQYXR0LHZhbHVlUGF0dCksKGspPT4vKiogQHR5cGUge1Z9ICovanNtYXAuZ2V0KGspKTtcblxuLyoqXG4gKiBAcGFyYW0ge1BhdHRlcm49fSBrZXlQYXR0XG4gKiBAcGFyYW0ge1BhdHRlcm49fSB2YWx1ZVBhdHRcbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxbSyxWXT59XG4gKi9cbmNvbnN0IGVudHJpZXM9KGtleVBhdHQ9dW5kZWZpbmVkLHZhbHVlUGF0dD11bmRlZmluZWQpPT5cbm1hcEl0ZXJhYmxlKGtleXMoa2V5UGF0dCx2YWx1ZVBhdHQpLChrKT0+W1xuayxcbi8qKiBAdHlwZSB7Vn0gKi9qc21hcC5nZXQoayldKTtcblxuXG5yZXR1cm4gaGFyZGVuKHtcbi4uLm1ha2VXZWFrTWFwU3RvcmVNZXRob2RzKFxuanNtYXAsXG4vKiogQHR5cGUgeyhrOiBLLCB2OiBWKSA9PiB2b2lkfSAqL2Fzc2VydFVwZGF0ZU9uQWRkLFxuYXNzZXJ0S1ZPa1RvU2V0LFxuYXNzZXJ0VXBkYXRlT25EZWxldGUsXG50YWcpLFxuXG5rZXlzLFxudmFsdWVzLFxuZW50cmllcyxcblxuc25hcHNob3Q6KGtleVBhdHQ9dW5kZWZpbmVkLHZhbHVlUGF0dD11bmRlZmluZWQpPT5cbm1ha2VDb3B5TWFwKGVudHJpZXMoa2V5UGF0dCx2YWx1ZVBhdHQpKSxcblxuZ2V0U2l6ZTooa2V5UGF0dD11bmRlZmluZWQsdmFsdWVQYXR0PXVuZGVmaW5lZCk9Plxua2V5UGF0dD09PXVuZGVmaW5lZCYmdmFsdWVQYXR0PT09dW5kZWZpbmVkP1xuanNtYXAuc2l6ZTpcblsuLi5rZXlzKGtleVBhdHQsdmFsdWVQYXR0KV0ubGVuZ3RoLFxuXG5jbGVhcjooa2V5UGF0dD11bmRlZmluZWQsdmFsdWVQYXR0PXVuZGVmaW5lZCk9PntcbmlmKGtleVBhdHQ9PT11bmRlZmluZWQmJnZhbHVlUGF0dD09PXVuZGVmaW5lZCl7XG5qc21hcC5jbGVhcigpO1xuIH1cbmZvcihjb25zdCBrZXkgb2Yga2V5cyhrZXlQYXR0LHZhbHVlUGF0dCkpe1xuanNtYXAuZGVsZXRlKGtleSk7XG4gfVxuIH19KTtcblxuIH07XG5cbi8qKlxuICogRGlzdGluZ3Vpc2hlcyBiZXR3ZWVuIGFkZGluZyBhIG5ldyBrZXkgKGluaXQpIGFuZCB1cGRhdGluZyBvclxuICogcmVmZXJlbmNpbmcgYSBrZXkgKGdldCwgc2V0LCBkZWxldGUpLlxuICpcbiAqIGBpbml0YCBpcyBvbmx5IGFsbG93ZWQgaWYgdGhlIGtleSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LiBgR2V0YCxcbiAqIGBzZXRgIGFuZCBgZGVsZXRlYCBhcmUgb25seSBhbGxvd2VkIGlmIHRoZSBrZXkgZG9lcyBhbHJlYWR5IGV4aXN0LlxuICpcbiAqIFRoaXMgaXMgYSAqc2NhbGFyKiBtYXAgaW4gdGhhdCB0aGUga2V5cyBjYW4gb25seSBiZSBhdG9taWMgdmFsdWVzLCBwcmltaXRpdmVzXG4gKiBvciByZW1vdGFibGVzLiBPdGhlciBzdG9yZU1hcHMgd2lsbCBhY2NlcHQsIGZvciBleGFtcGxlLCBjb3B5QXJyYXlzIGFuZFxuICogY29weVJlY29yZHMsIGFzIGtleXMgYW5kIGxvb2sgdGhlbSB1cCBiYXNlZCBvbiBlcXVhbGl0eSBvZiB0aGVpciBjb250ZW50cy5cbiAqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAcGFyYW0ge3N0cmluZ30gW3RhZz0na2V5J10gLSB0aGUgY29sdW1uIG5hbWUgZm9yIHRoZSBrZXlcbiAqIEBwYXJhbSB7U3RvcmVPcHRpb25zPX0gb3B0aW9uc1xuICogQHJldHVybnMge01hcFN0b3JlPEssVj59XG4gKi8kaOKAjV9vbmNlLm1ha2VNYXBTdG9yZU1ldGhvZHMobWFrZU1hcFN0b3JlTWV0aG9kcyk7XG5jb25zdCAgICAgICAgbWFrZVNjYWxhck1hcFN0b3JlPShcbnRhZz0na2V5JyxcbntrZXlTaGFwZT11bmRlZmluZWQsdmFsdWVTaGFwZT11bmRlZmluZWR9PXt9KT0+XG57XG5jb25zdCBqc21hcD1uZXcgTWFwKCk7XG5pZihrZXlTaGFwZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnRQYXR0ZXJuKGtleVNoYXBlKTtcbiB9XG5pZih2YWx1ZVNoYXBlIT09dW5kZWZpbmVkKXtcbmFzc2VydFBhdHRlcm4odmFsdWVTaGFwZSk7XG4gfVxuXG5jb25zdCBhc3NlcnRLVk9rVG9TZXQ9KF9rZXksdmFsdWUpPT57XG4vKiBUT0RPOiBKdXN0IGEgdHJhbnNpdGlvbiBrbHVkZ2UuIFJlbW92ZSB3aGVuIHBvc3NpYmxlLiovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNjA2Ki9cbmhhcmRlbih2YWx1ZSk7XG5cbmFzc2VydFBhc3NhYmxlKHZhbHVlKTtcbmlmKHZhbHVlU2hhcGUhPT11bmRlZmluZWQpe1xuZml0KHZhbHVlLHZhbHVlU2hhcGUsJ21hcFN0b3JlIHZhbHVlJyk7XG4gfVxuIH07XG5cbmNvbnN0IGFzc2VydEtWT2tUb0FkZD0oa2V5LHZhbHVlKT0+e1xuLyogVE9ETzogSnVzdCBhIHRyYW5zaXRpb24ga2x1ZGdlLiBSZW1vdmUgd2hlbiBwb3NzaWJsZS4qL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzYwNiovXG5oYXJkZW4oa2V5KTtcblxuYXNzZXJ0U2NhbGFyS2V5KGtleSk7XG5pZihrZXlTaGFwZSE9PXVuZGVmaW5lZCl7XG5maXQoa2V5LGtleVNoYXBlLCdtYXBTdG9yZSBrZXknKTtcbiB9XG5hc3NlcnRLVk9rVG9TZXQoa2V5LHZhbHVlKTtcbiB9O1xuXG5yZXR1cm4gRmFyKCBgc2NhbGFyIE1hcFN0b3JlIG9mICR7cSh0YWcpfWAse1xuLi4ubWFrZU1hcFN0b3JlTWV0aG9kcyhcbmpzbWFwLFxuYXNzZXJ0S1ZPa1RvQWRkLFxuYXNzZXJ0S1ZPa1RvU2V0LFxudW5kZWZpbmVkLFxudGFnKX0pO1xuXG5cbiB9OyRo4oCNX29uY2UubWFrZVNjYWxhck1hcFN0b3JlKG1ha2VTY2FsYXJNYXBTdG9yZSk7XG5oYXJkZW4obWFrZVNjYWxhck1hcFN0b3JlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlTWFwU3RvcmVNZXRob2RzIjpbIm1ha2VNYXBTdG9yZU1ldGhvZHMiXSwibWFrZVNjYWxhck1hcFN0b3JlIjpbIm1ha2VTY2FsYXJNYXBTdG9yZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA2fzG+aw8AAGsPAAAxAAAAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL3N0b3Jlcy9zY2FsYXJTZXRTdG9yZS5qc3siaW1wb3J0cyI6WyIuLi9rZXlzL2NoZWNrS2V5LmpzIiwiLi4vcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzIiwiLi4vcGF0dGVybnMvcmFua09yZGVyLmpzIiwiLi9zY2FsYXJXZWFrU2V0U3RvcmUuanMiLCIuL3N0b3JlLXV0aWxzLmpzIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbIm1ha2VTY2FsYXJTZXRTdG9yZSIsIm1ha2VTZXRTdG9yZU1ldGhvZHMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRmFyLGZpbHRlckl0ZXJhYmxlLGNvbXBhcmVSYW5rLGFzc2VydFNjYWxhcktleSxtYWtlQ29weVNldCxtYXRjaGVzLGZpdCxhc3NlcnRQYXR0ZXJuLG1ha2VXZWFrU2V0U3RvcmVNZXRob2RzLG1ha2VDdXJyZW50S2V5c0tpdDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV0sW1wiZmlsdGVySXRlcmFibGVcIiwgWyRo4oCNX2EgPT4gKGZpbHRlckl0ZXJhYmxlID0gJGjigI1fYSldXV1dLFtcIi4uL3BhdHRlcm5zL3JhbmtPcmRlci5qc1wiLCBbW1wiY29tcGFyZVJhbmtcIiwgWyRo4oCNX2EgPT4gKGNvbXBhcmVSYW5rID0gJGjigI1fYSldXV1dLFtcIi4uL2tleXMvY2hlY2tLZXkuanNcIiwgW1tcImFzc2VydFNjYWxhcktleVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0U2NhbGFyS2V5ID0gJGjigI1fYSldXSxbXCJtYWtlQ29weVNldFwiLCBbJGjigI1fYSA9PiAobWFrZUNvcHlTZXQgPSAkaOKAjV9hKV1dXV0sW1wiLi4vcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzXCIsIFtbXCJtYXRjaGVzXCIsIFskaOKAjV9hID0+IChtYXRjaGVzID0gJGjigI1fYSldXSxbXCJmaXRcIiwgWyRo4oCNX2EgPT4gKGZpdCA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0UGF0dGVyblwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGF0dGVybiA9ICRo4oCNX2EpXV1dXSxbXCIuL3NjYWxhcldlYWtTZXRTdG9yZS5qc1wiLCBbW1wibWFrZVdlYWtTZXRTdG9yZU1ldGhvZHNcIiwgWyRo4oCNX2EgPT4gKG1ha2VXZWFrU2V0U3RvcmVNZXRob2RzID0gJGjigI1fYSldXV1dLFtcIi4vc3RvcmUtdXRpbHMuanNcIiwgW1tcIm1ha2VDdXJyZW50S2V5c0tpdFwiLCBbJGjigI1fYSA9PiAobWFrZUN1cnJlbnRLZXlzS2l0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5jb25zdHtxdW90ZTpxfT1hc3NlcnQ7XG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7U2V0PEs+fSBqc3NldFxuICogQHBhcmFtIHsoazogSykgPT4gdm9pZH0gYXNzZXJ0S2V5T2tUb0FkZFxuICogQHBhcmFtIHsoKGs6IEspID0+IHZvaWQpPX0gYXNzZXJ0S2V5T2tUb0RlbGV0ZVxuICogQHBhcmFtIHtzdHJpbmc9fSBrZXlOYW1lXG4gKiBAcmV0dXJucyB7U2V0U3RvcmU8Sz59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlU2V0U3RvcmVNZXRob2RzPShcbmpzc2V0LFxuYXNzZXJ0S2V5T2tUb0FkZCxcbmFzc2VydEtleU9rVG9EZWxldGU9dW5kZWZpbmVkLFxua2V5TmFtZT0na2V5Jyk9Plxue1xuY29uc3R7YXNzZXJ0VXBkYXRlT25BZGQsYXNzZXJ0VXBkYXRlT25EZWxldGUsaXRlcmFibGVLZXlzfT1cbm1ha2VDdXJyZW50S2V5c0tpdChcbigpPT5qc3NldC5rZXlzKCksXG4oayk9Pmpzc2V0LmhhcyhrKSxcbmNvbXBhcmVSYW5rLFxuYXNzZXJ0S2V5T2tUb0FkZCxcbmFzc2VydEtleU9rVG9EZWxldGUsXG5rZXlOYW1lKTtcblxuXG4vKipcbiAqIEBwYXJhbSB7UGF0dGVybj19IGtleVBhdHRcbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxLPn1cbiAqL1xuY29uc3Qga2V5cz0oa2V5UGF0dD11bmRlZmluZWQpPT5cbmtleVBhdHQ9PT11bmRlZmluZWQ/XG5pdGVyYWJsZUtleXM6XG5maWx0ZXJJdGVyYWJsZShpdGVyYWJsZUtleXMsKGspPT5tYXRjaGVzKGssa2V5UGF0dCkpO1xuXG5yZXR1cm4gaGFyZGVuKHtcbi4uLm1ha2VXZWFrU2V0U3RvcmVNZXRob2RzKFxuanNzZXQsXG5hc3NlcnRVcGRhdGVPbkFkZCxcbmFzc2VydFVwZGF0ZU9uRGVsZXRlLFxua2V5TmFtZSksXG5cblxua2V5cyxcblxudmFsdWVzOmtleXMsXG5cbnNuYXBzaG90OihrZXlQYXR0PXVuZGVmaW5lZCk9Pm1ha2VDb3B5U2V0KGtleXMoa2V5UGF0dCkpLFxuXG5nZXRTaXplOihrZXlQYXR0PXVuZGVmaW5lZCk9Plxua2V5UGF0dD09PXVuZGVmaW5lZD9qc3NldC5zaXplOlsuLi5rZXlzKGtleVBhdHQpXS5sZW5ndGgsXG5cbmNsZWFyOihrZXlQYXR0PXVuZGVmaW5lZCk9PntcbmlmKGtleVBhdHQ9PT11bmRlZmluZWQpe1xuanNzZXQuY2xlYXIoKTtcbiB9XG5mb3IoY29uc3Qga2V5IG9mIGtleXMoa2V5UGF0dCkpe1xuanNzZXQuZGVsZXRlKGtleSk7XG4gfVxuIH19KTtcblxuIH07XG5cbi8qKlxuICogRGlzdGluZ3Vpc2hlcyBiZXR3ZWVuIGFkZGluZyBhIG5ldyBrZXkgKGluaXQpIGFuZCB1cGRhdGluZyBvclxuICogcmVmZXJlbmNpbmcgYSBrZXkgKGdldCwgc2V0LCBkZWxldGUpLlxuICpcbiAqIGBpbml0YCBpcyBvbmx5IGFsbG93ZWQgaWYgdGhlIGtleSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LiBgR2V0YCxcbiAqIGBzZXRgIGFuZCBgZGVsZXRlYCBhcmUgb25seSBhbGxvd2VkIGlmIHRoZSBrZXkgZG9lcyBhbHJlYWR5IGV4aXN0LlxuICpcbiAqIFRoaXMgaXMgYSAqc2NhbGFyKiBzZXQgaW4gdGhhdCB0aGUga2V5cyBjYW4gb25seSBiZSBhdG9taWMgdmFsdWVzLCBwcmltaXRpdmVzXG4gKiBvciByZW1vdGFibGVzLiBPdGhlciBzdG9yZVNldHMgd2lsbCBhY2NlcHQsIGZvciBleGFtcGxlLCBjb3B5QXJyYXlzIGFuZFxuICogY29weVJlY29yZHMsIGFzIGtleXMgYW5kIGxvb2sgdGhlbSB1cCBiYXNlZCBvbiBlcXVhbGl0eSBvZiB0aGVpciBjb250ZW50cy5cbiAqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtzdHJpbmd9IFt0YWc9J2tleSddIC0gdGFnIGZvciBkZWJ1Z2dpbmdcbiAqIEBwYXJhbSB7U3RvcmVPcHRpb25zPX0gb3B0aW9uc1xuICogQHJldHVybnMge1NldFN0b3JlPEs+fVxuICovJGjigI1fb25jZS5tYWtlU2V0U3RvcmVNZXRob2RzKG1ha2VTZXRTdG9yZU1ldGhvZHMpO1xuY29uc3QgICAgICAgIG1ha2VTY2FsYXJTZXRTdG9yZT0oXG50YWc9J2tleScsXG57a2V5U2hhcGU9dW5kZWZpbmVkfT17fSk9Plxue1xuY29uc3QganNzZXQ9bmV3IFNldCgpO1xuaWYoa2V5U2hhcGUhPT11bmRlZmluZWQpe1xuYXNzZXJ0UGF0dGVybihrZXlTaGFwZSk7XG4gfVxuXG5jb25zdCBhc3NlcnRLZXlPa1RvQWRkPShrZXkpPT57XG4vKiBUT0RPOiBKdXN0IGEgdHJhbnNpdGlvbiBrbHVkZ2UuIFJlbW92ZSB3aGVuIHBvc3NpYmxlLiovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNjA2Ki9cbmhhcmRlbihrZXkpO1xuXG5hc3NlcnRTY2FsYXJLZXkoa2V5KTtcbmlmKGtleVNoYXBlIT09dW5kZWZpbmVkKXtcbmZpdChrZXksa2V5U2hhcGUsJ3NldFN0b3JlIGtleScpO1xuIH1cbiB9O1xuXG5yZXR1cm4gRmFyKCBgc2NhbGFyIFNldFN0b3JlIG9mICR7cSh0YWcpfWAse1xuLi4ubWFrZVNldFN0b3JlTWV0aG9kcyhqc3NldCxhc3NlcnRLZXlPa1RvQWRkLHVuZGVmaW5lZCx0YWcpfSk7XG5cbiB9OyRo4oCNX29uY2UubWFrZVNjYWxhclNldFN0b3JlKG1ha2VTY2FsYXJTZXRTdG9yZSk7XG5oYXJkZW4obWFrZVNjYWxhclNldFN0b3JlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlU2V0U3RvcmVNZXRob2RzIjpbIm1ha2VTZXRTdG9yZU1ldGhvZHMiXSwibWFrZVNjYWxhclNldFN0b3JlIjpbIm1ha2VTY2FsYXJTZXRTdG9yZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACQcw0zsRIAALESAAA1AAAAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL3N0b3Jlcy9zY2FsYXJXZWFrTWFwU3RvcmUuanN7ImltcG9ydHMiOlsiLi4va2V5cy9jaGVja0tleS5qcyIsIi4uL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qcyIsIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIiwibWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRmFyLGFzc2VydFBhc3NhYmxlLHBhc3NTdHlsZU9mLGdldENvcHlNYXBFbnRyaWVzLGlzQ29weU1hcCxmaXQsYXNzZXJ0UGF0dGVybjskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0UGFzc2FibGVcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhc3NhYmxlID0gJGjigI1fYSldXSxbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dXV0sW1wiLi4va2V5cy9jaGVja0tleS5qc1wiLCBbW1wiZ2V0Q29weU1hcEVudHJpZXNcIiwgWyRo4oCNX2EgPT4gKGdldENvcHlNYXBFbnRyaWVzID0gJGjigI1fYSldXSxbXCJpc0NvcHlNYXBcIiwgWyRo4oCNX2EgPT4gKGlzQ29weU1hcCA9ICRo4oCNX2EpXV1dXSxbXCIuLi9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanNcIiwgW1tcImZpdFwiLCBbJGjigI1fYSA9PiAoZml0ID0gJGjigI1fYSldXSxbXCJhc3NlcnRQYXR0ZXJuXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXR0ZXJuID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5jb25zdHtxdW90ZTpxLEZhaWx9PWFzc2VydDtcblxuLyoqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAcGFyYW0ge1dlYWtNYXA8SyAmIG9iamVjdCwgVj59IGpzbWFwXG4gKiBAcGFyYW0geyhrOiBLLCB2OiBWKSA9PiB2b2lkfSBhc3NlcnRLVk9rVG9BZGRcbiAqIEBwYXJhbSB7KGs6IEssIHY6IFYpID0+IHZvaWR9IGFzc2VydEtWT2tUb1NldFxuICogQHBhcmFtIHsoKGs6IEspID0+IHZvaWQpPX0gYXNzZXJ0S2V5T2tUb0RlbGV0ZVxuICogQHBhcmFtIHtzdHJpbmc9fSBrZXlOYW1lXG4gKiBAcmV0dXJucyB7V2Vha01hcFN0b3JlPEssVj59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlV2Vha01hcFN0b3JlTWV0aG9kcz0oXG5qc21hcCxcbmFzc2VydEtWT2tUb0FkZCxcbmFzc2VydEtWT2tUb1NldCxcbmFzc2VydEtleU9rVG9EZWxldGU9dW5kZWZpbmVkLFxua2V5TmFtZT0na2V5Jyk9Plxue1xuY29uc3QgYXNzZXJ0S2V5RG9lc05vdEV4aXN0PShrZXkpPT5cbiFqc21hcC5oYXMoa2V5KXx8RmFpbCBgJHtxKGtleU5hbWUpfSBhbHJlYWR5IHJlZ2lzdGVyZWQ6ICR7a2V5fWA7XG5cbmNvbnN0IGFzc2VydEtleUV4aXN0cz0oa2V5KT0+XG5qc21hcC5oYXMoa2V5KXx8RmFpbCBgJHtxKGtleU5hbWUpfSBub3QgZm91bmQ6ICR7a2V5fWA7XG5cbnJldHVybiBoYXJkZW4oe1xuaGFzOihrZXkpPT57XG4vKiBDaGVjayBpZiBhIGtleSBleGlzdHMuIFRoZSBrZXkgY2FuIGJlIGFueSBKYXZhU2NyaXB0IHZhbHVlLCovXG4vKiB0aG91Z2ggdGhlIGFuc3dlciB3aWxsIGFsd2F5cyBiZSBmYWxzZSBmb3Iga2V5cyB0aGF0IGNhbm5vdCBiZSBmb3VuZCovXG4vKiBpbiB0aGlzIG1hcC4qL1xucmV0dXJuIGpzbWFwLmhhcyhrZXkpO1xuIH0sXG5nZXQ6KGtleSk9PntcbmFzc2VydEtleUV4aXN0cyhrZXkpO1xuLyogSG93IHRvIHRlbGwgdHlwZXNjcmlwdCBJIGJlbGlldmUgdGhlIGBnZXRgIHdpbGwgc3VjY2VlZC4qL1xucmV0dXJuICgvKiogQHR5cGUge1Z9ICovanNtYXAuZ2V0KGtleSkpO1xuIH0sXG5cbmluaXQ6KGtleSx2YWx1ZSk9PntcbmFzc2VydEtleURvZXNOb3RFeGlzdChrZXkpO1xuYXNzZXJ0S1ZPa1RvQWRkKGtleSx2YWx1ZSk7XG5qc21hcC5zZXQoa2V5LHZhbHVlKTtcbiB9LFxuc2V0OihrZXksdmFsdWUpPT57XG5hc3NlcnRLZXlFeGlzdHMoa2V5KTtcbmFzc2VydEtWT2tUb1NldChrZXksdmFsdWUpO1xuanNtYXAuc2V0KGtleSx2YWx1ZSk7XG4gfSxcbmRlbGV0ZTooa2V5KT0+e1xuYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG5pZihhc3NlcnRLZXlPa1RvRGVsZXRlIT09dW5kZWZpbmVkKXtcbmFzc2VydEtleU9rVG9EZWxldGUoa2V5KTtcbiB9XG5qc21hcC5kZWxldGUoa2V5KTtcbiB9LFxuXG5hZGRBbGw6KGVudHJpZXMpPT57XG5pZihpc0NvcHlNYXAoZW50cmllcykpe1xuZW50cmllcz1nZXRDb3B5TWFwRW50cmllcyhlbnRyaWVzKTtcbiB9XG5mb3IoY29uc3Rba2V5LHZhbHVlXW9mIGVudHJpZXMpe1xuLyogRG9uJ3QgYXNzZXJ0IHRoYXQgdGhlIGtleSBlaXRoZXIgZG9lcyBvciBkb2VzIG5vdCBleGlzdC4qL1xuYXNzZXJ0S1ZPa1RvQWRkKGtleSx2YWx1ZSk7XG5qc21hcC5zZXQoa2V5LHZhbHVlKTtcbiB9XG4gfX0pO1xuXG4gfTtcblxuLyoqXG4gKiBUaGlzIGlzIGEgKnNjYWxhciogbWFwU3RvcmUgaW4gdGhhdCB0aGUga2V5cyBjYW4gb25seSBiZSBhdG9taWMgdmFsdWVzOlxuICogcHJpbWl0aXZlcyBvciByZW1vdGFibGVzLlxuICogT3RoZXIgbWFwU3RvcmVzIHdpbGwgYWNjZXB0LCBmb3IgZXhhbXBsZSwgY29weUFycmF5cyBhbmRcbiAqIGNvcHlSZWNvcmRzIGFzIGtleXMgYW5kIGxvb2sgdGhlbSB1cCBiYXNlZCBvbiBlcXVhbGl0eSBvZiB0aGVpciBjb250ZW50cy5cbiAqXG4gKiBUT0RPIEZvciBub3csIHRoaXMgc2NhbGFyV2Vha01hcCBhY2NlcHRzIG9ubHkgcmVtb3RhYmxlcywgcmVmbGVjdGluZyB0aGVcbiAqIGNvbnN0cmFpbnRzIG9mIHRoZSB1bmRlcmx5aW5nIEphdmFTY3JpcHQgV2Vha01hcCBpdCB1c2VzIGludGVybmFsbHkuIEJ1dFxuICogaXQgc2hvdWxkIGFjY2VwdCB0aGUgcHJpbWl0aXZlcyBhcyB3ZWxsLCBzdG9yaW5nIHRoZW0gaW4gYSBzZXBhcmF0ZSBpbnRlcm5hbFxuICogbWFwLiBXaGF0IG1ha2VzIGl0IFwid2Vha1wiIGlzIHRoYXQgaXQgcHJvdmlkZXMgbm8gQVBJIGZvciBlbnVtZXJhdGluZyB3aGF0J3NcbiAqIHRoZXJlLiBUaG91Z2ggbm90ZSB0aGF0IHRoaXMgd291bGQgb25seSBlbmFibGVzIGNvbGxlY3Rpb24gb2YgdGhlXG4gKiByZW1vdGFibGVzLCBzaW5jZSB0aGUgb3RoZXIgcHJpbWl0aXZlcyBtYXkgYWx3YXlzIHJlYXBwZWFyLlxuICpcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdGFnPSdrZXknXSAtIHRhZyBmb3IgZGVidWdnaW5nXG4gKiBAcGFyYW0ge1N0b3JlT3B0aW9ucz19IG9wdGlvbnNcbiAqIEByZXR1cm5zIHtXZWFrTWFwU3RvcmU8SyxWPn1cbiAqLyRo4oCNX29uY2UubWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMobWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMpO1xuY29uc3QgICAgICAgIG1ha2VTY2FsYXJXZWFrTWFwU3RvcmU9KFxudGFnPSdrZXknLFxue2xvbmdMaXZlZD10cnVlLGtleVNoYXBlPXVuZGVmaW5lZCx2YWx1ZVNoYXBlPXVuZGVmaW5lZH09e30pPT5cbntcbmNvbnN0IGpzbWFwPW5ldyhsb25nTGl2ZWQ/V2Vha01hcDpNYXApKCk7XG5pZihrZXlTaGFwZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnRQYXR0ZXJuKGtleVNoYXBlKTtcbiB9XG5pZih2YWx1ZVNoYXBlIT09dW5kZWZpbmVkKXtcbmFzc2VydFBhdHRlcm4odmFsdWVTaGFwZSk7XG4gfVxuXG5jb25zdCBhc3NlcnRLVk9rVG9TZXQ9KF9rZXksdmFsdWUpPT57XG4vKiBUT0RPOiBKdXN0IGEgdHJhbnNpdGlvbiBrbHVkZ2UuIFJlbW92ZSB3aGVuIHBvc3NpYmxlLiovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNjA2Ki9cbmhhcmRlbih2YWx1ZSk7XG5cbmFzc2VydFBhc3NhYmxlKHZhbHVlKTtcbmlmKHZhbHVlU2hhcGUhPT11bmRlZmluZWQpe1xuZml0KHZhbHVlLHZhbHVlU2hhcGUsJ3dlYWtNYXBTdG9yZSB2YWx1ZScpO1xuIH1cbiB9O1xuXG5jb25zdCBhc3NlcnRLVk9rVG9BZGQ9KGtleSx2YWx1ZSk9Pntcbi8qIFRPRE86IEp1c3QgYSB0cmFuc2l0aW9uIGtsdWRnZS4gUmVtb3ZlIHdoZW4gcG9zc2libGUuKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM2MDYqL1xuaGFyZGVuKGtleSk7XG5wYXNzU3R5bGVPZihrZXkpPT09J3JlbW90YWJsZSd8fFxuRmFpbCBgT25seSByZW1vdGFibGVzIGNhbiBiZSBrZXlzIG9mIHNjYWxhciBXZWFrTWFwU3RvcmVzOiAke2tleX1gO1xuaWYoa2V5U2hhcGUhPT11bmRlZmluZWQpe1xuZml0KGtleSxrZXlTaGFwZSwnd2Vha01hcFN0b3JlIGtleScpO1xuIH1cbmFzc2VydEtWT2tUb1NldChrZXksdmFsdWUpO1xuIH07XG5cbnJldHVybiBGYXIoIGBzY2FsYXIgV2Vha01hcFN0b3JlIG9mICR7cSh0YWcpfWAse1xuLi4ubWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMoXG5qc21hcCxcbmFzc2VydEtWT2tUb0FkZCxcbmFzc2VydEtWT2tUb1NldCxcbnVuZGVmaW5lZCxcbnRhZyl9KTtcblxuXG4gfTskaOKAjV9vbmNlLm1ha2VTY2FsYXJXZWFrTWFwU3RvcmUobWFrZVNjYWxhcldlYWtNYXBTdG9yZSk7XG5oYXJkZW4obWFrZVNjYWxhcldlYWtNYXBTdG9yZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMiOlsibWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMiXSwibWFrZVNjYWxhcldlYWtNYXBTdG9yZSI6WyJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMtVOkJdDgAAXQ4AADUAAABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvc3RvcmVzL3NjYWxhcldlYWtTZXRTdG9yZS5qc3siaW1wb3J0cyI6WyIuLi9rZXlzL2NoZWNrS2V5LmpzIiwiLi4vcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmUiLCJtYWtlV2Vha1NldFN0b3JlTWV0aG9kcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBGYXIscGFzc1N0eWxlT2YsZ2V0Q29weVNldEtleXMsaXNDb3B5U2V0LGZpdCxhc3NlcnRQYXR0ZXJuOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXSxbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dXV0sW1wiLi4va2V5cy9jaGVja0tleS5qc1wiLCBbW1wiZ2V0Q29weVNldEtleXNcIiwgWyRo4oCNX2EgPT4gKGdldENvcHlTZXRLZXlzID0gJGjigI1fYSldXSxbXCJpc0NvcHlTZXRcIiwgWyRo4oCNX2EgPT4gKGlzQ29weVNldCA9ICRo4oCNX2EpXV1dXSxbXCIuLi9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanNcIiwgW1tcImZpdFwiLCBbJGjigI1fYSA9PiAoZml0ID0gJGjigI1fYSldXSxbXCJhc3NlcnRQYXR0ZXJuXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXR0ZXJuID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5jb25zdHtxdW90ZTpxLEZhaWx9PWFzc2VydDtcblxuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtXZWFrU2V0PEsgJiBvYmplY3Q+fSBqc3NldFxuICogQHBhcmFtIHsoazogSykgPT4gdm9pZH0gYXNzZXJ0S2V5T2tUb0FkZFxuICogQHBhcmFtIHsoKGs6IEspID0+IHZvaWQpPX0gYXNzZXJ0S2V5T2tUb0RlbGV0ZVxuICogQHBhcmFtIHtzdHJpbmc9fSBrZXlOYW1lXG4gKiBAcmV0dXJucyB7V2Vha1NldFN0b3JlPEs+fVxuICovXG5jb25zdCAgICAgICAgbWFrZVdlYWtTZXRTdG9yZU1ldGhvZHM9KFxuanNzZXQsXG5hc3NlcnRLZXlPa1RvQWRkLFxuYXNzZXJ0S2V5T2tUb0RlbGV0ZT11bmRlZmluZWQsXG5rZXlOYW1lPSdrZXknKT0+XG57XG5jb25zdCBhc3NlcnRLZXlFeGlzdHM9KGtleSk9PlxuanNzZXQuaGFzKGtleSl8fEZhaWwgYCR7cShrZXlOYW1lKX0gbm90IGZvdW5kOiAke2tleX1gO1xuXG5yZXR1cm4gaGFyZGVuKHtcbmhhczooa2V5KT0+e1xuLyogQ2hlY2sgaWYgYSBrZXkgZXhpc3RzLiBUaGUga2V5IGNhbiBiZSBhbnkgSmF2YVNjcmlwdCB2YWx1ZSwqL1xuLyogdGhvdWdoIHRoZSBhbnN3ZXIgd2lsbCBhbHdheXMgYmUgZmFsc2UgZm9yIGtleXMgdGhhdCBjYW5ub3QgYmUgZm91bmQqL1xuLyogaW4gdGhpcyBzZXQuKi9cbnJldHVybiBqc3NldC5oYXMoa2V5KTtcbiB9LFxuXG5hZGQ6KGtleSk9PntcbmFzc2VydEtleU9rVG9BZGQoa2V5KTtcbmpzc2V0LmFkZChrZXkpO1xuIH0sXG5kZWxldGU6KGtleSk9PntcbmFzc2VydEtleUV4aXN0cyhrZXkpO1xuaWYoYXNzZXJ0S2V5T2tUb0RlbGV0ZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnRLZXlPa1RvRGVsZXRlKGtleSk7XG4gfVxuanNzZXQuZGVsZXRlKGtleSk7XG4gfSxcblxuYWRkQWxsOihrZXlzKT0+e1xuaWYoaXNDb3B5U2V0KGtleXMpKXtcbmtleXM9Z2V0Q29weVNldEtleXMoa2V5cyk7XG4gfVxuZm9yKGNvbnN0IGtleSBvZiBrZXlzKXtcbmFzc2VydEtleU9rVG9BZGQoa2V5KTtcbmpzc2V0LmFkZChrZXkpO1xuIH1cbiB9fSk7XG5cbiB9O1xuXG4vKipcbiAqIFRoaXMgaXMgYSAqc2NhbGFyKiBzZXQgaW4gdGhhdCB0aGUga2V5cyBjYW4gb25seSBiZSBhdG9taWMgdmFsdWVzLCBwcmltaXRpdmVzXG4gKiBvciByZW1vdGFibGVzLiBPdGhlciBzdG9yZVNldHMgd2lsbCBhY2NlcHQsIGZvciBleGFtcGxlLCBjb3B5QXJyYXlzIGFuZFxuICogY29weVJlY29yZHMsIGFzIGtleXMgYW5kIGxvb2sgdGhlbSB1cCBiYXNlZCBvbiBlcXVhbGl0eSBvZiB0aGVpciBjb250ZW50cy5cbiAqXG4gKiBUT0RPIEZvciBub3csIHRoaXMgc2NhbGFyV2Vha1NldCBhY2NlcHRzIG9ubHkgcmVtb3RhYmxlcywgcmVmbGVjdGluZyB0aGVcbiAqIGNvbnN0cmFpbnRzIG9mIHRoZSB1bmRlcmx5aW5nIEphdmFTY3JpcHQgV2Vha1NldCBpdCB1c2VzIGludGVybmFsbHkuIEJ1dFxuICogaXQgc2hvdWxkIGFjY2VwdCB0aGUgcHJpbWl0aXZlcyBhcyB3ZWxsLCBzdG9yaW5nIHRoZW0gaW4gYSBzZXBhcmF0ZSBpbnRlcm5hbFxuICogc2V0LiBXaGF0IG1ha2VzIGl0IFwid2Vha1wiIGlzIHRoYXQgaXQgcHJvdmlkZXMgbm8gQVBJIGZvciBlbnVtZXJhdGluZyB3aGF0J3NcbiAqIHRoZXJlLiBUaG91Z2ggbm90ZSB0aGF0IHRoaXMgd291bGQgb25seSBlbmFibGVzIGNvbGxlY3Rpb24gb2YgdGhlXG4gKiByZW1vdGFibGVzLCBzaW5jZSB0aGUgb3RoZXIgcHJpbWl0aXZlcyBtYXkgYWx3YXlzIGFwcGVhci5cbiAqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtzdHJpbmd9IFt0YWc9J2tleSddIC0gdGFnIGZvciBkZWJ1Z2dpbmdcbiAqIEBwYXJhbSB7U3RvcmVPcHRpb25zPX0gb3B0aW9uc1xuICogQHJldHVybnMge1dlYWtTZXRTdG9yZTxLPn1cbiAqLyRo4oCNX29uY2UubWFrZVdlYWtTZXRTdG9yZU1ldGhvZHMobWFrZVdlYWtTZXRTdG9yZU1ldGhvZHMpO1xuY29uc3QgICAgICAgIG1ha2VTY2FsYXJXZWFrU2V0U3RvcmU9KFxudGFnPSdrZXknLFxue2xvbmdMaXZlZD10cnVlLGtleVNoYXBlPXVuZGVmaW5lZH09e30pPT5cbntcbmNvbnN0IGpzc2V0PW5ldyhsb25nTGl2ZWQ/V2Vha1NldDpTZXQpKCk7XG5pZihrZXlTaGFwZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnRQYXR0ZXJuKGtleVNoYXBlKTtcbiB9XG5cbmNvbnN0IGFzc2VydEtleU9rVG9BZGQ9KGtleSk9Pntcbi8qIFRPRE86IEp1c3QgYSB0cmFuc2l0aW9uIGtsdWRnZS4gUmVtb3ZlIHdoZW4gcG9zc2libGUuKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM2MDYqL1xuaGFyZGVuKGtleSk7XG5wYXNzU3R5bGVPZihrZXkpPT09J3JlbW90YWJsZSd8fFxuRmFpbCBgT25seSByZW1vdGFibGVzIGNhbiBiZSBrZXlzIG9mIHNjYWxhciBXZWFrU3RvcmVzOiAke2tleX1gO1xuaWYoa2V5U2hhcGUhPT11bmRlZmluZWQpe1xuZml0KGtleSxrZXlTaGFwZSwnd2Vha1NldFN0b3JlIGtleScpO1xuIH1cbiB9O1xuXG5yZXR1cm4gRmFyKCBgc2NhbGFyIFdlYWtTZXRTdG9yZSBvZiAke3EodGFnKX1gLHtcbi4uLm1ha2VXZWFrU2V0U3RvcmVNZXRob2RzKGpzc2V0LGFzc2VydEtleU9rVG9BZGQsdW5kZWZpbmVkLHRhZyl9KTtcblxuIH07JGjigI1fb25jZS5tYWtlU2NhbGFyV2Vha1NldFN0b3JlKG1ha2VTY2FsYXJXZWFrU2V0U3RvcmUpO1xuaGFyZGVuKG1ha2VTY2FsYXJXZWFrU2V0U3RvcmUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VXZWFrU2V0U3RvcmVNZXRob2RzIjpbIm1ha2VXZWFrU2V0U3RvcmVNZXRob2RzIl0sIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmUiOlsibWFrZVNjYWxhcldlYWtTZXRTdG9yZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAqUK3IPBMAADwTAAAuAAAAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL3N0b3Jlcy9zdG9yZS11dGlscy5qc3siaW1wb3J0cyI6WyJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsibWFrZUF0b21pY1Byb3ZpZGVyIiwibWFrZUN1cnJlbnRLZXlzS2l0IiwicHJvdmlkZUxhenkiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRmFyOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXV1dXSk7ICAgXG5cbmNvbnN0e2RldGFpbHM6WCxxdW90ZTpxfT1hc3NlcnQ7XG5cbi8qKlxuICogQHRlbXBsYXRlIEssVlxuICogQHR5cGVkZWYge29iamVjdH0gQ3VycmVudEtleXNLaXRcbiAqIEBwcm9wZXJ0eSB7KGs6IEssIHY/OiBWKSA9PiB2b2lkfSBhc3NlcnRVcGRhdGVPbkFkZFxuICogQHByb3BlcnR5IHsoazogSykgPT4gdm9pZH0gYXNzZXJ0VXBkYXRlT25EZWxldGVcbiAqIEBwcm9wZXJ0eSB7SXRlcmFibGU8Sz59IGl0ZXJhYmxlS2V5c1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIEssVlxuICogQHBhcmFtIHsoKSA9PiBJdGVyYWJsZTxLPn0gZ2V0UmF3S2V5c1xuICogQHBhcmFtIHsoazogSykgPT4gYm9vbGVhbn0gY2hlY2tIYXNcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEBwYXJhbSB7KGs6IEssIHY/OiBWKSA9PiB2b2lkfSBhc3NlcnRPa1RvQWRkXG4gKiBAcGFyYW0geygoazogSykgPT4gdm9pZCk9fSBhc3NlcnRPa1RvRGVsZXRlXG4gKiBAcGFyYW0ge3N0cmluZz19IGtleU5hbWVcbiAqIEByZXR1cm5zIHtDdXJyZW50S2V5c0tpdDxLLFY+fVxuICovXG5jb25zdCAgICAgICAgbWFrZUN1cnJlbnRLZXlzS2l0PShcbmdldFJhd0tleXMsXG5jaGVja0hhcyxcbmNvbXBhcmUsXG5hc3NlcnRPa1RvQWRkLFxuYXNzZXJ0T2tUb0RlbGV0ZT11bmRlZmluZWQsXG5rZXlOYW1lPSdrZXknKT0+XG57XG5sZXQgdXBkYXRlQ291bnQ9MDtcbmxldCBzb3J0ZWRLZXlzTWVtbztcblxuY29uc3QgYXNzZXJ0VXBkYXRlT25BZGQ9KGssdj11bmRlZmluZWQpPT57XG5hc3NlcnRPa1RvQWRkKGssdik7XG51cGRhdGVDb3VudCs9MTtcbnNvcnRlZEtleXNNZW1vPXVuZGVmaW5lZDtcbiB9O1xuXG5jb25zdCBhc3NlcnRVcGRhdGVPbkRlbGV0ZT0oayk9PmFzc2VydE9rVG9EZWxldGUmJmFzc2VydE9rVG9EZWxldGUoayk7XG5cbmNvbnN0IGdldFNvcnRlZEtleXM9KCk9PntcbmlmKHNvcnRlZEtleXNNZW1vPT09dW5kZWZpbmVkKXtcbnNvcnRlZEtleXNNZW1vPWhhcmRlbihbLi4uZ2V0UmF3S2V5cygpXS5zb3J0KGNvbXBhcmUpKTtcbiB9XG5yZXR1cm4gc29ydGVkS2V5c01lbW87XG4gfTtcblxuY29uc3QgaXRlcmFibGVLZXlzPUZhcignSXRlcmFibGUgb2Yga2V5cycse1xuW1N5bWJvbC5pdGVyYXRvcl06KCk9PntcbmNvbnN0IGdlbmVyYXRpb249dXBkYXRlQ291bnQ7XG5nZXRTb3J0ZWRLZXlzKCk7XG5jb25zdCBsZW49c29ydGVkS2V5c01lbW8ubGVuZ3RoO1xubGV0IGk9MDtcbnJldHVybiBGYXIoJ0l0ZXJhdG9yIG9mIGtleXMnLHtcbm5leHQ6KCk9PntcbmFzc2VydC5lcXVhbChcbmdlbmVyYXRpb24sXG51cGRhdGVDb3VudCxcblggYFN0b3JlICR7cShrZXlOYW1lKX0gY3Vyc29yIHN0YWxlYCk7XG5cbi8qIElmIHRoZXkncmUgZXF1YWwsIHRoZW4gdGhlIHNvcnRlZEtleU1lbW8gaXMgdGhlIHNhbWUgb25lKi9cbi8qIHdlIHN0YXJ0ZWQgd2l0aC4qL1xuZm9yKDs7KXtcbmlmKGk8bGVuKXtcbmNvbnN0IHZhbHVlPXNvcnRlZEtleXNNZW1vW2ldO1xuaSs9MTtcbmlmKGNoZWNrSGFzKHZhbHVlKSl7XG5yZXR1cm4gaGFyZGVuKHtkb25lOmZhbHNlLHZhbHVlfSk7XG4gfVxuIH1lbHNle1xucmV0dXJuIGhhcmRlbih7ZG9uZTp0cnVlLHZhbHVlOnVuZGVmaW5lZH0pO1xuIH1cbiB9XG4gfX0pO1xuXG4gfX0pO1xuXG5cbnJldHVybiBoYXJkZW4oe1xuYXNzZXJ0VXBkYXRlT25BZGQsXG5hc3NlcnRVcGRhdGVPbkRlbGV0ZSxcbml0ZXJhYmxlS2V5c30pO1xuXG4gfTskaOKAjV9vbmNlLm1ha2VDdXJyZW50S2V5c0tpdChtYWtlQ3VycmVudEtleXNLaXQpO1xuaGFyZGVuKG1ha2VDdXJyZW50S2V5c0tpdCk7XG5cbi8qKlxuICogQ2FsbCBgcHJvdmlkZUxhenlgIHRvIGdldCBvciBtYWtlIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGtleS5cbiAqIElmIHRoZXJlIGFscmVhZHkgaXMgb25lLCByZXR1cm4gdGhhdC4gT3RoZXJ3aXNlLFxuICogY2FsbCBgbWFrZVZhbHVlKGtleSlgLCByZW1lbWJlciBpdCBhcyB0aGUgdmFsdWUgZm9yXG4gKiB0aGF0IGtleSwgYW5kIHJldHVybiBpdC5cbiAqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAcGFyYW0ge1dlYWtNYXBTdG9yZTxLLFY+fSBtYXBTdG9yZVxuICogQHBhcmFtIHtLfSBrZXlcbiAqIEBwYXJhbSB7KGtleTogSykgPT4gVn0gbWFrZVZhbHVlXG4gKiBAcmV0dXJucyB7Vn1cbiAqL1xuY29uc3QgICAgICAgIHByb3ZpZGVMYXp5PShtYXBTdG9yZSxrZXksbWFrZVZhbHVlKT0+e1xuaWYoIW1hcFN0b3JlLmhhcyhrZXkpKXtcbm1hcFN0b3JlLmluaXQoa2V5LG1ha2VWYWx1ZShrZXkpKTtcbiB9XG5yZXR1cm4gbWFwU3RvcmUuZ2V0KGtleSk7XG4gfTskaOKAjV9vbmNlLnByb3ZpZGVMYXp5KHByb3ZpZGVMYXp5KTtcbmhhcmRlbihwcm92aWRlTGF6eSk7XG5cbi8qKlxuICogSGVscGVyIGZvciB1c2UgY2FzZXMgaW4gd2hpY2ggdGhlIG1ha2VyIGZ1bmN0aW9uIGlzIGFzeW5jLlxuICogRm9yIHR3byBwcm92aWRlTGF6eSBjYWxscyB3aXRoIHRoZSBzYW1lIGtleSwgb25lIG1heSBiZSBtYWtpbmcgd2hlbiB0aGVcbiAqIG90aGVyIGNhbGwgc3RhcnRzIGFuZCBpdCB3b3VsZCBtYWtlIGFnYWluLlxuICogKFRoZW4gdGhlcmUnZCBiZSBhIGNvbGxpc2lvbiB3aGVuIHRoZSBzZWNvbmQgdHJpZXMgdG8gc3RvcmVcbiAqIHRoZSBrZXkuKSBUaGlzIHByZXZlbnRzIHRoYXQgcmFjZSBjb25kaXRpb24gYnkgaW1tZWRpYXRlbHkgc3RvcmluZyBhIFByb21pc2VcbiAqIGZvciB0aGUgbWFrZXIgaW4gYW4gZXBoZW1lcmFsIHN0b3JlLlxuICpcbiAqIFdoZW4gdGhlIGBzdG9yZWAgYXJndW1lbnQgaXMgZHVyYWJsZSBzdG9yYWdlLCBub3RlIHRoYXQgaXQncyBwb3NzaWJsZSBmb3JcbiAqIHRlcm1pbmF0aW9uIHRvIGhhcHBlbiBhZnRlciB0aGUgbWFrZSBjb21wbGV0ZXMgYW5kIGJlZm9yZSBpdCByZWFjaGVzIGR1cmFibGVcbiAqIHN0b3JhZ2UuXG4gKlxuICogQHRlbXBsYXRlIEtcbiAqIEB0ZW1wbGF0ZSBWXG4gKiBAcGFyYW0ge1dlYWtNYXBTdG9yZTxLLCBWPn0gc3RvcmVcbiAqL1xuY29uc3QgICAgICAgIG1ha2VBdG9taWNQcm92aWRlcj0oc3RvcmUpPT57XG4vKiogQHR5cGUge01hcDxLLCBQcm9taXNlPFY+Pn0gKi9cbmNvbnN0IHBlbmRpbmc9bmV3IE1hcCgpO1xuXG4vKipcbiAqIENhbGwgYHByb3ZpZGVBc3luY2AgdG8gZ2V0IG9yIG1ha2UgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5LFxuICogd2hlbiB0aGUgbWFrZXIgaXMgYXN5bmNocm9ub3VzLlxuICogSWYgdGhlcmUgYWxyZWFkeSBpcyBvbmUsIHJldHVybiB0aGF0LiBPdGhlcndpc2UsXG4gKiBjYWxsIGBtYWtlVmFsdWUoa2V5KWAsIHJlbWVtYmVyIGl0IGFzIHRoZSB2YWx1ZSBmb3JcbiAqIHRoYXQga2V5LCBhbmQgcmV0dXJuIGl0LlxuICpcbiAqIEBwYXJhbSB7S30ga2V5XG4gKiBAcGFyYW0geyhrZXk6IEspID0+IFByb21pc2U8Vj59IG1ha2VWYWx1ZSBtYWtlIHRoZSB2YWx1ZSBmb3IgdGhlIHN0b3JlXG4gKiBpZiBpdCBoYXNuJ3QgYmVlbiBtYWRlIHlldCBvciB0aGUgbGFzdCBtYWtlIGZhaWxlZFxuICogQHBhcmFtIHsoa2V5OiBLLCB2YWx1ZTogVikgPT4gUHJvbWlzZTx2b2lkPn0gW2ZpbmlzaFZhbHVlXSBydW5zIGV4YWN0bHlcbiAqIG9uY2UgYWZ0ZXIgYSBuZXcgdmFsdWUgaXMgYWRkZWQgdG8gdGhlIHN0b3JlXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxWPn1cbiAqL1xuY29uc3QgcHJvdmlkZUFzeW5jPShrZXksbWFrZVZhbHVlLGZpbmlzaFZhbHVlKT0+e1xuaWYoc3RvcmUuaGFzKGtleSkpe1xucmV0dXJuIFByb21pc2UucmVzb2x2ZShzdG9yZS5nZXQoa2V5KSk7XG4gfVxuaWYoIXBlbmRpbmcuaGFzKGtleSkpe1xuY29uc3QgdmFsUD1tYWtlVmFsdWUoa2V5KS5cbnRoZW4oKHYpPT57XG5zdG9yZS5pbml0KGtleSx2KTtcbnJldHVybiB2O1xuIH0pLlxudGhlbigodik9PntcbmlmKGZpbmlzaFZhbHVlKXtcbnJldHVybiBmaW5pc2hWYWx1ZShrZXksdikudGhlbigoKT0+dik7XG4gfVxucmV0dXJuIHY7XG4gfSkuXG5maW5hbGx5KCgpPT57XG5wZW5kaW5nLmRlbGV0ZShrZXkpO1xuIH0pO1xucGVuZGluZy5zZXQoa2V5LHZhbFApO1xuIH1cbmNvbnN0IHZhbFA9cGVuZGluZy5nZXQoa2V5KTtcbmFzc2VydCh2YWxQKTtcbnJldHVybiB2YWxQO1xuIH07XG5cbnJldHVybiBoYXJkZW4oe3Byb3ZpZGVBc3luY30pO1xuIH07JGjigI1fb25jZS5tYWtlQXRvbWljUHJvdmlkZXIobWFrZUF0b21pY1Byb3ZpZGVyKTtcbmhhcmRlbihtYWtlQXRvbWljUHJvdmlkZXIpO1xuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHRlbXBsYXRlIFZcbiAqIEB0eXBlZGVmIHtSZXR1cm5UeXBlPHR5cGVvZiBtYWtlQXRvbWljUHJvdmlkZXI8SywgVj4+fSBBdG9taWNQcm92aWRlcjxLLCBWPlxuICovXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUN1cnJlbnRLZXlzS2l0IjpbIm1ha2VDdXJyZW50S2V5c0tpdCJdLCJwcm92aWRlTGF6eSI6WyJwcm92aWRlTGF6eSJdLCJtYWtlQXRvbWljUHJvdmlkZXIiOlsibWFrZUF0b21pY1Byb3ZpZGVyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANMBGDlcfgAAXH4AACEAAABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLlBhc3NTdHlsZX0gUGFzc1N0eWxlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5Db3B5VGFnZ2VkfSBDb3B5VGFnZ2VkICovXG4vKiogQHRlbXBsYXRlIFQgQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5Db3B5UmVjb3JkPFQ+fSBDb3B5UmVjb3JkICovXG4vKiogQHRlbXBsYXRlIFQgQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5Db3B5QXJyYXk8VD59IENvcHlBcnJheSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuQ2hlY2tlcn0gQ2hlY2tlciAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtQYXNzYWJsZX0gS2V5XG4gKiBLZXlzIGFyZSBwYXNzLWJ5LWNvcHkgc3RydWN0dXJlcyAoQ29weUFycmF5LCBDb3B5UmVjb3JkLFxuICogQ29weVNldCwgQ29weUJhZywgQ29weU1hcCkgdGhhdCBlbmQgaW4gZWl0aGVyIHBhc3NhYmxlIHByaW1pdGl2ZSBkYXRhIG9yXG4gKiBSZW1vdGFibGVzIChGYXIgb2JqZWN0cyBvciB0aGVpciByZW1vdGUgcHJlc2VuY2VzLikgS2V5cyBhcmUgc28gbmFtZWRcbiAqIGJlY2F1c2UgdGhleSBjYW4gYmUgdXNlZCBhcyBrZXlzIGluIE1hcFN0b3JlcyBhbmQgQ29weU1hcHMsIGFzIHdlbGwgYXNcbiAqIHRoZSBlbGVtZW50cyBvZiBDb3B5U2V0cyBhbmQgQ29weUJhZ3MuXG4gKlxuICogS2V5cyBjYW5ub3QgY29udGFpbiBwcm9taXNlcyBvciBlcnJvcnMsIGFzIHRoZXNlIGRvIG5vdCBoYXZlIGEgdXNlZnVsXG4gKiBkaXN0cmlidXRlZCBlcXVhbGl0eSBzZW1hbnRpY3MuIEtleXMgYWxzbyBjYW5ub3QgY29udGFpbiBhbnkgQ29weVRhZ2dlZFxuICogZXhjZXB0IGZvciB0aG9zZSByZWNvZ25pemVkIGFzIENvcHlTZXRzLCBDb3B5QmFncywgYW5kIENvcHlNYXBzLlxuICpcbiAqIEJlIGF3YXJlIHRoYXQgd2UgbWF5IHJlY29nbml6ZSBtb3JlIENvcHlUYWdnZWRzIG92ZXIgdGltZSwgaW5jbHVkaW5nXG4gKiBDb3B5VGFnZ2VkcyByZWNvZ25pemVkIGFzIGtleXMuXG4gKlxuICogRGlzdHJpYnV0ZWQgZXF1YWxpdHkgaXMgbG9jYXRpb24gaW5kZXBlbmRlbnQuXG4gKiBUaGUgc2FtZSB0d28ga2V5cywgcGFzc2VkIHRvIGFub3RoZXIgbG9jYXRpb24sIHdpbGwgYmUgYGtleUVRYCB0aGVyZSBpZmZcbiAqIHRoZXkgYXJlIGBrZXlFUWAgaGVyZS4gKGBrZXlFUWAgdGVzdHMgZXF1YWxpdHkgYWNjb3JkaW5nIHRvIHRoZVxuICoga2V5IGRpc3RyaWJ1dGVkIGVxdWFsaXR5IHNlbWFudGljcy4pXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7UGFzc2FibGV9IFBhdHRlcm5cbiAqIFBhdHRlcm5zIGFyZSBwYXNzLWJ5LWNvcHkgc3RydWN0dXJlcyAoQ29weUFycmF5LCBDb3B5UmVjb3JkLFxuICogQ29weVNldCwgQ29weUJhZywgQ29weU1hcCkgdGhhdCBlbmQgaW4gZWl0aGVyIEtleXMgb3IgTWF0Y2hlcnMuIEVhY2ggcGF0dGVyblxuICogYWN0cyBhcyBhIGRlY2xhcmF0aXZlIHBhc3NhYmxlIHByZWRpY2F0ZSBvdmVyIHBhc3NhYmxlcywgd2hlcmUgZWFjaCBwYXNzYWJsZVxuICogZWl0aGVyIHBhc3NlcyBhIGdpdmVuIHBhdHRlcm4sIG9yIGRvZXMgbm90LiBFdmVyeSBrZXkgaXMgYWxzbyBhIHBhdHRlcm4uXG4gKiBVc2VkIGFzIGEgcGF0dGVybiwgYSBrZXkgbWF0Y2hlcyBvbmx5IFwiaXRzZWxmXCIsIGkuZS4sIGtleXMgdGhhdCBhcmVcbiAqIGBrZXlFUWAgdG8gaXQsIHRoYXQgaXMsIGVxdWFsIGFjY29yZGluZyB0byB0aGVcbiAqIGtleSBkaXN0cmlidXRlZCBlcXVhbGl0eSBzZW1hbnRpY3MuXG4gKlxuICogUGF0dGVybnMgY2Fubm90IGNvbnRhaW4gcHJvbWlzZXMgb3IgZXJyb3JzLCBhcyB0aGVzZSBkb1xuICogbm90IGhhdmUgYSB1c2VmdWwgZGlzdHJpYnV0ZWQgZXF1YWxpdHkgb3IgbWF0Y2hpbmcgc2VtYW50aWNzLiBMaWtld2lzZSxcbiAqIG5vIHBhdHRlcm4gY2FuIGRpc3Rpbmd1aXNoIGFtb25nIHByb21pc2VzLCBvciBkaXN0aW5ndWlzaCBhbW9uZyBlcnJvcnMuXG4gKiBQYXR0ZXJucyBhbHNvIGNhbm5vdCBjb250YWluIGFueSBDb3B5VGFnZ2VkcyBleGNlcHQgZm9yIHRob3NlIHJlY29nbml6ZWQgYXNcbiAqIENvcHlTZXRzLCBDb3B5QmFncywgQ29weU1hcHMsIG9yIE1hdGNoZXJzLlxuICpcbiAqIEJlIGF3YXJlIHRoYXQgd2UgbWF5IHJlY29nbml6ZSBtb3JlIENvcHlUYWdnZWRzIG92ZXIgdGltZSwgaW5jbHVkaW5nXG4gKiBDb3B5VGFnZ2VkcyByZWNvZ25pemVkIGFzIHBhdHRlcm5zLlxuICpcbiAqIFdoZXRoZXIgYSBwYXNzYWJsZSBtYXRjaGVzIGEgZ2l2ZW4gcGF0dGVybiBpcyBsb2NhdGlvbiBpbmRlcGVuZGVudC5cbiAqIEZvciBhIHBhc3NhYmxlIGFuZCBhIHBhdHRlcm4sIGJvdGggcGFzc2VkIHRvIGFub3RoZXIgbG9jYXRpb24sIHRoZSBwYXNzYWJsZVxuICogd2lsbCBtYXRjaCB0aGUgcGF0dGVybiB0aGVyZSBpZmYgdGhlIHBhc3NhYmxlIG1hdGNoZXMgdGhhdCBwYXR0ZXJuIGhlcmUuXG4gKlxuICogUGF0dGVybnMgYXJlIG9mdGVuIHVzZWQgaW4gYSB0eXBlLWxpa2UgbWFubmVyLCB0byByZXByZXNlbnQgdGhlIGNhdGVnb3J5XG4gKiBvZiBwYXNzYWJsZXMgdGhhdCBhcmUgaW50ZW5kZWQqIHRvIG1hdGNoIHRoYXQgcGF0dGVybi4gVG8ga2VlcCB0aGlzXG4gKiBkaXN0aW5jdGlvbiBjbGVhciwgd2Ugb2Z0ZW4gdXNlIHRoZSBzdWZmaXggXCJTaGFwZVwiIHJhdGhlciB0aGFuIFwiUGF0dGVyblwiXG4gKiB0byBhdm9pZCB0aGUgbGV2ZWxzIGNvbmZ1c2lvbiB3aGVuIHRoZSBwYXR0ZXJuIGl0c2VsZiByZXByZXNlbnRzXG4gKiBzb21lIGNhdGVnb3J5IG9mIHBhdHRlcm4uIEZvciBleGFtcGxlLCBhbiBcIkFtb3VudFNoYXBlXCIgcmVwcmVzZW50cyB0aGVcbiAqIGNhdGVnb3J5IG9mIEFtb3VudHMuIEFuZCBcIkFtb3VudFBhdHRlcm5TaGFwZVwiIHJlcHJlc2VudHMgdGhlXG4gKiBjYXRlZ29yeSBvZiBwYXR0ZXJucyBvdmVyIEFtb3VudHMuXG4gKlxuICogKiBJIHNheSBcImludGVuZGVkXCIgYWJvdmUgYmVjYXVzZSBQYXR0ZXJucywgaW4gb3JkZXIgdG8gYmUgZGVjbGFyYXRpdmVcbiAqIGFuZCBwYXNzYWJsZSwgY2Fubm90IGhhdmUgdGhlIGdlbmVyYWxpdHkgb2YgcHJlZGljYXRlcyB3cml0dGVuIGluIGFcbiAqIFR1cmluZy11bml2ZXJzYWwgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UuIFJhdGhlciwgdG8gcmVwcmVzZW50IHRoZSBjYXRlZ29yeSBvZlxuICogdGhpbmdzIGludGVuZGVkIHRvIGJlIGEgRm9vLCBhIEZvb1NoYXBlIHNob3VsZCByZWxpYWJseVxuICogYWNjZXB0IGFsbCBGb29zIGFuZCByZWplY3Qgb25seSBub24tRm9vcy4gSG93ZXZlciwgYSBGb29TaGFwZSBtYXkgYWxzbyBhY2NlcHRcbiAqIG5vbi1Gb29zIHRoYXQgXCJsb29rIGxpa2VcIiBvciBoYXZlIFwidGhlIHNhbWUgc2hhcGUgYXNcIiBnZW51aW5lIEZvb3MuIFRvIHdyaXRlXG4gKiBhcyBhY2N1cmF0ZSBwcmVkaWNhdGUsIGZvciB1c2UsIGZvciBleGFtcGxlLCBmb3IgaW5wdXQgdmFsaWRhdGlvbiwgd291bGRcbiAqIG5lZWQgdG8gc3VwcGxlbWVudCB0aGUgcGF0dGVybiBjaGVjayB3aXRoIGNvZGUgdG8gY2hlY2sgZm9yIHRoZSByZXNpZHVhbFxuICogY2FzZXMuXG4gKiBXZSBob3BlIHRoZSBcIlNoYXBlXCIgbWV0YXBob3IgaGVscHMgcmVtaW5kIHVzIG9mIHRoaXMgdHlwZS1saWtlIGltcHJlY2lzaW9uXG4gKiBvZiBwYXR0ZXJucy5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAdHlwZWRlZiB7Q29weVRhZ2dlZH0gQ29weVNldFxuICovXG5cbi8qIFRPRE8gcGFyYW1ldGVyaXplIENvcHlUYWdnZWQgc28gdGhpcyBjYW4gaW5jbHVkZSBpdCovXG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAdHlwZWRlZiB7e1xuICogICBbU3ltYm9sLnRvU3RyaW5nVGFnXTogc3RyaW5nO1xuICogICBwYXlsb2FkOiBBcnJheTxbSywgYmlnaW50XT47XG4gKiB9fSBDb3B5QmFnXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAdHlwZWRlZiB7Q29weVRhZ2dlZH0gQ29weU1hcFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge0NvcHlUYWdnZWR9IE1hdGNoZXJcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN0b3JlT3B0aW9uc1xuICogT2YgdGhlIGRpbWVuc2lvbnMgb24gd2hpY2ggS2V5ZWRTdG9yZXMgY2FuIGRpZmZlciwgd2Ugb25seSByZXByZXNlbnQgYSBmZXdcbiAqIG9mIHRoZW0gYXMgc3RhbmRhcmQgb3B0aW9ucy4gQSBnaXZlbiBzdG9yZSBtYWtlciBzaG91bGQgZG9jdW1lbnQgd2hpY2hcbiAqIG9wdGlvbnMgaXQgc3VwcG9ydHMsIGFzIHdlbGwgYXMgaXRzIHBvc2l0aW9ucyBvbiBkaW1lbnNpb25zIGZvciB3aGljaCBpdFxuICogZG9lcyBub3Qgc3VwcG9ydCBvcHRpb25zLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbbG9uZ0xpdmVkPXRydWVdIFdoaWNoIHdheSB0byBvcHRpbWl6ZSBhIHdlYWsgc3RvcmUuIFRydWUgbWVhbnNcbiAqIHRoYXQgd2UgZXhwZWN0IHRoaXMgd2VhayBzdG9yZSB0byBvdXRsaXZlIG1vc3Qgb2YgaXRzIGtleXMsIGluIHdoaWNoXG4gKiBjYXNlIHdlIGludGVybmFsbHkgbWF5IHVzZSBhIEphdmFTY3JpcHQgYFdlYWtNYXBgLiBPdGhlcndpc2Ugd2UgaW50ZXJuYWxseVxuICogbWF5IHVzZSBhIEphdmFTY3JpcHQgYE1hcGAuXG4gKiBEZWZhdWx0cyB0byB0cnVlLCBzbyBwbGVhc2UgbWFyayBzaG9ydCBsaXZlZCBzdG9yZXMgZXhwbGljaXRseS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2R1cmFibGU9ZmFsc2VdICBUaGUgY29udGVudHMgb2YgdGhpcyBzdG9yZSBzdXJ2aXZlIHRlcm1pbmF0aW9uXG4gKiAgIG9mIGl0cyBjb250YWluaW5nIHByb2Nlc3MsIGFsbG93aW5nIGZvciByZXN0YXJ0IG9yIHVwZ3JhZGUgYnV0IGF0IHRoZSBjb3N0XG4gKiAgIG9mIGZvcmJpZGRpbmcgc3RvcmFnZSBvZiByZWZlcmVuY2VzIHRvIGVwaGVtZXJhbCBkYXRhLiAgRGVmYXVsdHMgdG8gZmFsc2UuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtmYWtlRHVyYWJsZT1mYWxzZV0gIFRoaXMgc3RvcmUgcHJldGVuZHMgdG8gYmUgYSBkdXJhYmxlIHN0b3JlXG4gKiAgIGJ1dCBkb2VzIG5vdCBlbmZvcmNlIHRoYXQgdGhlIHRoaW5ncyBzdG9yZWQgaW4gaXQgYWN0dWFsbHkgYmUgdGhlbXNlbHZlc1xuICogICBkdXJhYmxlICh3aGVyZWFzIGFuIGFjdHVhbCBkdXJhYmxlIHN0b3JlIHdvdWxkIGZvcmJpZCBzdG9yYWdlIG9mIHN1Y2hcbiAqICAgaXRlbXMpLiAgVGhpcyBpcyBpbiBzZXJ2aWNlIG9mIGFsbG93aW5nIGluY3JlbWVudGFsIHRyYW5zaXRpb24gdG8gdXNlIG9mXG4gKiAgIGR1cmFibGUgc3RvcmVzLCB0byBlbmFibGUgbm9ybWFsIG9wZXJhdGlvbiBhbmQgdGVzdGluZyB3aGVuIHNvbWUgc3R1ZmZcbiAqICAgaW50ZW5kZWQgdG8gZXZlbnR1YWxseSBiZSBkdXJhYmxlIGhhcyBub3QgeWV0IGJlZW4gbWFkZSBkdXJhYmxlLiAgQSBzdG9yZVxuICogICBtYXJrZWQgYXMgZmFrZUR1cmFibGUgd2lsbCBhcHBlYXIgdG8gb3BlcmF0ZSBub3JtYWxseSBidXQgYW55IGF0dGVtcHQgdG9cbiAqICAgdXBncmFkZSBpdHMgY29udGFpbmluZyB2YXQgd2lsbCBmYWlsIHdpdGggYW4gZXJyb3IuXG4gKiBAcHJvcGVydHkge1BhdHRlcm49fSBrZXlTaGFwZVxuICogQHByb3BlcnR5IHtQYXR0ZXJuPX0gdmFsdWVTaGFwZVxuICovXG5cbi8qKlxuICogTW9zdCBzdG9yZSBtZXRob2RzIGFyZSBpbiBvbmUgb2YgdGhyZWUgY2F0ZWdvcmllc1xuICogICAqIGxvb2t1cCBtZXRob2RzIChgaGFzYCxgZ2V0YClcbiAqICAgKiB1cGRhdGUgbWV0aG9kcyAoYGFkZGAsYGluaXRgLGBzZXRgLGBkZWxldGVgLGBhZGRBbGxgKVxuICogICAqIHF1ZXJ5IG1ldGhvZHMgKGBzbmFwc2hvdGAsYGtleXNgLGB2YWx1ZXNgLGBlbnRyaWVzYCxgZ2V0U2l6ZWApXG4gKiAgICogcXVlcnktdXBkYXRlIG1ldGhvZHMgKGBjbGVhcmApXG4gKlxuICogV2Vha1N0b3JlcyBoYXZlIHRoZSBsb29rdXAgYW5kIHVwZGF0ZSBtZXRob2RzIGJ1dCBub3QgdGhlIHF1ZXJ5XG4gKiBvciBxdWVyeS11cGRhdGUgbWV0aG9kcy5cbiAqIE5vbi13ZWFrIFN0b3JlcyBhcmUgbGlrZSB0aGVpciBjb3JyZXNwb25kaW5nIFdlYWtTdG9yZSwgYnV0IHdpdGggdGhlXG4gKiBhZGRpdGlvbmFsIHF1ZXJ5IGFuZCBxdWVyeS11cGRhdGUgbWV0aG9kcy5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBXZWFrU2V0U3RvcmVcbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gYm9vbGVhbn0gaGFzXG4gKiBDaGVjayBpZiBhIGtleSBleGlzdHMuIFRoZSBrZXkgY2FuIGJlIGFueSBKYXZhU2NyaXB0IHZhbHVlLCB0aG91Z2ggdGhlXG4gKiBhbnN3ZXIgd2lsbCBhbHdheXMgYmUgZmFsc2UgZm9yIGtleXMgdGhhdCBjYW5ub3QgYmUgZm91bmQgaW4gdGhpcyBzdG9yZS5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gdm9pZH0gYWRkXG4gKiBBZGQgdGhlIGtleSB0byB0aGUgc2V0IGlmIGl0IGlzIG5vdCBhbHJlYWR5IHRoZXJlLiBEbyBub3RoaW5nIHNpbGVudGx5IGlmXG4gKiBhbHJlYWR5IHRoZXJlLlxuICogVGhlIGtleSBtdXN0IGJlIG9uZSBhbGxvd2VkIGJ5IHRoaXMgc3RvcmUuIEZvciBleGFtcGxlIGEgc2NhbGFyIHN0b3JlIG9ubHlcbiAqIGFsbG93cyBwcmltaXRpdmVzIGFuZCByZW1vdGFibGVzLlxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiB2b2lkfSBkZWxldGVcbiAqIFJlbW92ZSB0aGUga2V5LiBUaHJvd3MgaWYgbm90IGZvdW5kLlxuICogQHByb3BlcnR5IHsoa2V5czogQ29weVNldDxLPiB8IEl0ZXJhYmxlPEs+KSA9PiB2b2lkfSBhZGRBbGxcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTZXRTdG9yZVxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiBib29sZWFufSBoYXNcbiAqIENoZWNrIGlmIGEga2V5IGV4aXN0cy4gVGhlIGtleSBjYW4gYmUgYW55IEphdmFTY3JpcHQgdmFsdWUsIHRob3VnaCB0aGVcbiAqIGFuc3dlciB3aWxsIGFsd2F5cyBiZSBmYWxzZSBmb3Iga2V5cyB0aGF0IGNhbm5vdCBiZSBmb3VuZCBpbiB0aGlzIHN0b3JlLlxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiB2b2lkfSBhZGRcbiAqIEFkZCB0aGUga2V5IHRvIHRoZSBzZXQgaWYgaXQgaXMgbm90IGFscmVhZHkgdGhlcmUuIERvIG5vdGhpbmcgc2lsZW50bHkgaWZcbiAqIGFscmVhZHkgdGhlcmUuXG4gKiBUaGUga2V5IG11c3QgYmUgb25lIGFsbG93ZWQgYnkgdGhpcyBzdG9yZS4gRm9yIGV4YW1wbGUgYSBzY2FsYXIgc3RvcmUgb25seVxuICogYWxsb3dzIHByaW1pdGl2ZXMgYW5kIHJlbW90YWJsZXMuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IHZvaWR9IGRlbGV0ZVxuICogUmVtb3ZlIHRoZSBrZXkuIFRocm93cyBpZiBub3QgZm91bmQuXG4gKiBAcHJvcGVydHkgeyhrZXlzOiBDb3B5U2V0PEs+IHwgSXRlcmFibGU8Sz4pID0+IHZvaWR9IGFkZEFsbFxuICogQHByb3BlcnR5IHsoa2V5UGF0dD86IFBhdHRlcm4pID0+IEl0ZXJhYmxlPEs+fSBrZXlzXG4gKiBAcHJvcGVydHkgeyhrZXlQYXR0PzogUGF0dGVybikgPT4gSXRlcmFibGU8Sz59IHZhbHVlc1xuICogQHByb3BlcnR5IHsoa2V5UGF0dD86IFBhdHRlcm4pID0+IENvcHlTZXQ8Sz59IHNuYXBzaG90XG4gKiBAcHJvcGVydHkgeyhrZXlQYXR0PzogUGF0dGVybikgPT4gbnVtYmVyfSBnZXRTaXplXG4gKiBAcHJvcGVydHkgeyhrZXlQYXR0PzogUGF0dGVybikgPT4gdm9pZH0gY2xlYXJcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFdlYWtNYXBTdG9yZVxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiBib29sZWFufSBoYXNcbiAqIENoZWNrIGlmIGEga2V5IGV4aXN0cy4gVGhlIGtleSBjYW4gYmUgYW55IEphdmFTY3JpcHQgdmFsdWUsIHRob3VnaCB0aGVcbiAqIGFuc3dlciB3aWxsIGFsd2F5cyBiZSBmYWxzZSBmb3Iga2V5cyB0aGF0IGNhbm5vdCBiZSBmb3VuZCBpbiB0aGlzIHN0b3JlLlxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiBWfSBnZXRcbiAqIFJldHVybiBhIHZhbHVlIGZvciB0aGUga2V5LiBUaHJvd3MgaWYgbm90IGZvdW5kLlxuICogQHByb3BlcnR5IHsoa2V5OiBLLCB2YWx1ZTogVikgPT4gdm9pZH0gaW5pdFxuICogSW5pdGlhbGl6ZSB0aGUga2V5IG9ubHkgaWYgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0LlxuICogVGhlIGtleSBtdXN0IGJlIG9uZSBhbGxvd2VkIGJ5IHRoaXMgc3RvcmUuIEZvciBleGFtcGxlIGEgc2NhbGFyIHN0b3JlIG9ubHlcbiAqIGFsbG93cyBwcmltaXRpdmVzIGFuZCByZW1vdGFibGVzLlxuICogQHByb3BlcnR5IHsoa2V5OiBLLCB2YWx1ZTogVikgPT4gdm9pZH0gc2V0XG4gKiBTZXQgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gdm9pZH0gZGVsZXRlXG4gKiBSZW1vdmUgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGVudHJpZXM6IENvcHlNYXA8SyxWPiB8IEl0ZXJhYmxlPFtLLFZdPikgPT4gdm9pZH0gYWRkQWxsXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBNYXBTdG9yZVxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiBib29sZWFufSBoYXNcbiAqIENoZWNrIGlmIGEga2V5IGV4aXN0cy4gVGhlIGtleSBjYW4gYmUgYW55IEphdmFTY3JpcHQgdmFsdWUsIHRob3VnaCB0aGVcbiAqIGFuc3dlciB3aWxsIGFsd2F5cyBiZSBmYWxzZSBmb3Iga2V5cyB0aGF0IGNhbm5vdCBiZSBmb3VuZCBpbiB0aGlzIG1hcFxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiBWfSBnZXRcbiAqIFJldHVybiBhIHZhbHVlIGZvciB0aGUga2V5LiBUaHJvd3MgaWYgbm90IGZvdW5kLlxuICogQHByb3BlcnR5IHsoa2V5OiBLLCB2YWx1ZTogVikgPT4gdm9pZH0gaW5pdFxuICogSW5pdGlhbGl6ZSB0aGUga2V5IG9ubHkgaWYgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0LlxuICogVGhlIGtleSBtdXN0IGJlIG9uZSBhbGxvd2VkIGJ5IHRoaXMgc3RvcmUuIEZvciBleGFtcGxlIGEgc2NhbGFyIHN0b3JlIG9ubHlcbiAqIGFsbG93cyBwcmltaXRpdmVzIGFuZCByZW1vdGFibGVzLlxuICogQHByb3BlcnR5IHsoa2V5OiBLLCB2YWx1ZTogVikgPT4gdm9pZH0gc2V0XG4gKiBTZXQgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gdm9pZH0gZGVsZXRlXG4gKiBSZW1vdmUgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGVudHJpZXM6IENvcHlNYXA8SyxWPiB8IEl0ZXJhYmxlPFtLLFZdPikgPT4gdm9pZH0gYWRkQWxsXG4gKiBAcHJvcGVydHkgeyhrZXlQYXR0PzogUGF0dGVybiwgdmFsdWVQYXR0PzogUGF0dGVybikgPT4gSXRlcmFibGU8Sz59IGtleXNcbiAqIEBwcm9wZXJ0eSB7KGtleVBhdHQ/OiBQYXR0ZXJuLCB2YWx1ZVBhdHQ/OiBQYXR0ZXJuKSA9PiBJdGVyYWJsZTxWPn0gdmFsdWVzXG4gKiBAcHJvcGVydHkgeyhcbiAqICAga2V5UGF0dD86IFBhdHRlcm4sXG4gKiAgIHZhbHVlUGF0dD86IFBhdHRlcm5cbiAqICkgPT4gSXRlcmFibGU8W0ssVl0+fSBlbnRyaWVzXG4gKiBAcHJvcGVydHkgeyhrZXlQYXR0PzogUGF0dGVybiwgdmFsdWVQYXR0PzogUGF0dGVybikgPT4gQ29weU1hcDxLLFY+fSBzbmFwc2hvdFxuICogQHByb3BlcnR5IHsoa2V5UGF0dD86IFBhdHRlcm4sIHZhbHVlUGF0dD86IFBhdHRlcm4pID0+IG51bWJlcn0gZ2V0U2l6ZVxuICogQHByb3BlcnR5IHsoa2V5UGF0dD86IFBhdHRlcm4sIHZhbHVlUGF0dD86IFBhdHRlcm4pID0+IHZvaWR9IGNsZWFyXG4gKi9cblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBEZXByZWNhdGVkIExlZ2FjeSAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEB0eXBlZGVmIHtXZWFrTWFwU3RvcmU8SyxWPn0gV2Vha1N0b3JlXG4gKiBEZXByZWNhdGVkIHR5cGUgbmFtZSBgV2Vha1N0b3JlYC4gVXNlIGBXZWFrTWFwU3RvcmVgIGluc3RlYWQuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAdHlwZWRlZiB7TWFwU3RvcmU8SyxWPn0gU3RvcmVcbiAqIERlcHJlY2F0ZWQgdHlwZSBuYW1lIGBTdG9yZWAuIFVzZSBgTWFwU3RvcmVgIGluc3RlYWQuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBMZWdhY3lXZWFrTWFwXG4gKiBMZWdhY3lXZWFrTWFwIGlzIGRlcHJlY2F0ZWQuIFVzZSBXZWFrTWFwU3RvcmUgaW5zdGVhZC5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gYm9vbGVhbn0gaGFzXG4gKiBDaGVjayBpZiBhIGtleSBleGlzdHNcbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gVn0gZ2V0XG4gKiBSZXR1cm4gYSB2YWx1ZSBmb3IgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSywgdmFsdWU6IFYpID0+IHZvaWR9IGluaXRcbiAqIEluaXRpYWxpemUgdGhlIGtleSBvbmx5IGlmIGl0XG4gKiBkb2Vzbid0IGFscmVhZHkgZXhpc3RcbiAqIEBwcm9wZXJ0eSB7KGtleTogSywgdmFsdWU6IFYpID0+IHZvaWR9IHNldFxuICogU2V0IHRoZSBrZXkuIFRocm93cyBpZiBub3QgZm91bmQuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IHZvaWR9IGRlbGV0ZVxuICogUmVtb3ZlIHRoZSBrZXkuIFRocm93cyBpZiBub3QgZm91bmQuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBMZWdhY3lNYXBcbiAqIExlZ2FjeVdlYWtNYXAgaXMgZGVwcmVjYXRlZC4gVXNlIFdlYWtNYXBTdG9yZSBpbnN0ZWFkLlxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiBib29sZWFufSBoYXNcbiAqIENoZWNrIGlmIGEga2V5IGV4aXN0c1xuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiBWfSBnZXRcbiAqIFJldHVybiBhIHZhbHVlIGZvciB0aGUga2V5LiBUaHJvd3MgaWYgbm90IGZvdW5kLlxuICogQHByb3BlcnR5IHsoa2V5OiBLLCB2YWx1ZTogVikgPT4gdm9pZH0gaW5pdFxuICogSW5pdGlhbGl6ZSB0aGUga2V5IG9ubHkgaWYgaXRcbiAqIGRvZXNuJ3QgYWxyZWFkeSBleGlzdFxuICogQHByb3BlcnR5IHsoa2V5OiBLLCB2YWx1ZTogVikgPT4gdm9pZH0gc2V0XG4gKiBTZXQgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gdm9pZH0gZGVsZXRlXG4gKiBSZW1vdmUgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gSXRlcmFibGU8Sz59IGtleXNcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gSXRlcmFibGU8Vj59IHZhbHVlc1xuICogQHByb3BlcnR5IHsoKSA9PiBJdGVyYWJsZTxbSyxWXT59IGVudHJpZXNcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gbnVtYmVyfSBnZXRTaXplXG4gKiBAcHJvcGVydHkgeygpID0+IHZvaWR9IGNsZWFyXG4gKi9cblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKipcbiAqIEB0eXBlZGVmIHstMSB8IDAgfCAxfSBSYW5rQ29tcGFyaXNvblxuICogVGhlIHJlc3VsdCBvZiBhIGBSYW5rQ29tcGFyZWAgZnVuY3Rpb24gdGhhdCBkZWZpbmVzIGEgcmFuay1vcmRlciwgaS5lLixcbiAqIGEgdG90YWwgcHJlb3JkZXIgaW4gd2hpY2ggZGlmZmVyZW50IGVsZW1lbnRzIGFyZSBhbHdheXMgY29tcGFyYWJsZSBidXRcbiAqIGNhbiBiZSB0aWVkIGZvciB0aGUgc2FtZSByYW5rLiBTZWUgYFJhbmtDb21wYXJlYC5cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBSYW5rQ29tcGFyZVxuICogUmV0dXJucyBgLTFgLCBgMGAsIG9yIGAxYCBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgcmFuayBvZiBgbGVmdGBcbiAqIGlzIGJlZm9yZSwgdGllZC13aXRoLCBvciBhZnRlciB0aGUgcmFuayBvZiBgcmlnaHRgLlxuICpcbiAqIFRoaXMgY29tcGFyaXNvbiBmdW5jdGlvbiBpcyB2YWxpZCBhcyBhcmd1bWVudCB0b1xuICogYEFycmF5LnByb3RvdHlwZS5zb3J0YC4gVGhpcyBpcyBzb21ldGltZXMgZGVzY3JpYmVkIGFzIGEgXCJ0b3RhbCBvcmRlclwiXG4gKiBidXQsIGRlcGVuZGluZyBvbiB5b3VyIGRlZmluaXRpb25zLCB0aGlzIGlzIHRlY2huaWNhbGx5IGluY29ycmVjdCBiZWNhdXNlXG4gKiBpdCBtYXkgcmV0dXJuIGAwYCB0byBpbmRpY2F0ZSB0aGF0IHR3byBkaXN0aW5ndWlzaGFibGUgZWxlbWVudHMgc3VjaCBhc1xuICogYC0wYCBhbmQgYDBgIGFyZSB0aWVkIChpLmUuLCBhcmUgaW4gdGhlIHNhbWUgZXF1aXZhbGVuY2UgY2xhc3NcbiAqIGZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBvcmRlcmluZykuIElmIGVhY2ggc3VjaCBlcXVpdmFsZW5jZSBjbGFzcyBpc1xuICogYSAqcmFuayogYW5kIHJhbmtzIGFyZSBkaXNqb2ludCwgdGhlbiB0aGlzIFwicmFuayBvcmRlclwiIGlzIGFcbiAqIHRydWUgdG90YWwgb3JkZXIgb3ZlciB0aGVzZSByYW5rcy4gSW4gbWF0aGVtYXRpY3MgdGhpcyBnb2VzIGJ5IHNldmVyYWxcbiAqIG90aGVyIG5hbWVzIHN1Y2ggYXMgXCJ0b3RhbCBwcmVvcmRlclwiLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gZXN0YWJsaXNoZXMgYSB0b3RhbCByYW5rIG9yZGVyIG92ZXIgYWxsIHBhc3NhYmxlcy5cbiAqIFRvIGRvIHNvIGl0IG1ha2VzIGFyYml0cmFyeSBjaG9pY2VzLCBzdWNoIGFzIHRoYXQgYWxsIHN0cmluZ3NcbiAqIGFyZSBhZnRlciBhbGwgbnVtYmVycy4gVGh1cywgdGhpcyBvcmRlciBpcyBub3QgaW50ZW5kZWQgdG8gYmVcbiAqIHVzZWQgZGlyZWN0bHkgYXMgYSBjb21wYXJpc29uIHdpdGggdXNlZnVsIHNlbWFudGljcy4gSG93ZXZlciwgaXQgbXVzdCBiZVxuICogY2xvc2VseSBlbm91Z2ggcmVsYXRlZCB0byBzdWNoIGNvbXBhcmlzb25zIHRvIGFpZCBpbiBpbXBsZW1lbnRpbmdcbiAqIGxvb2t1cHMgYmFzZWQgb24gdGhvc2UgY29tcGFyaXNvbnMuIEZvciBleGFtcGxlLCBpbiBvcmRlciB0byBnZXQgYSB0b3RhbFxuICogb3JkZXIgYW1vbmcgcmFua3MsIHdlIHB1dCBgTmFOYCBhZnRlciBhbGwgb3RoZXIgSmF2YVNjcmlwdCBcIm51bWJlclwiIHZhbHVlc1xuICogKGkuZS4sIElFRUUgNzU0IGZsb2F0aW5nLXBvaW50IHZhbHVlcykuIEJ1dCBvdGhlcndpc2UsIHdlIHJhbmsgSmF2YVNjcmlwdFxuICogbnVtYmVycyBieSBzaWduZWQgbWFnbml0dWRlLCB3aXRoIGAwYCBhbmQgYC0wYCB0aWVkLiBBIHNlbWFudGljYWxseSB1c2VmdWxcbiAqIG9yZGVyaW5nIHdvdWxkIGFsc28gY29tcGFyZSBtYWduaXR1ZGVzLCBhbmQgc28gYWdyZWUgd2l0aCB0aGUgcmFuayBvcmRlcmluZ1xuICogb2YgYWxsIHZhbHVlcyBvdGhlciB0aGFuIGBOYU5gLiBBbiBhcnJheSBzb3J0ZWQgYnkgcmFuayB3b3VsZCBlbmFibGUgcmFuZ2VcbiAqIHF1ZXJpZXMgYnkgbWFnbml0dWRlLlxuICogQHBhcmFtIHtQYXNzYWJsZX0gbGVmdFxuICogQHBhcmFtIHtQYXNzYWJsZX0gcmlnaHRcbiAqIEByZXR1cm5zIHtSYW5rQ29tcGFyaXNvbn1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSYW5rQ29tcGFyZX0gRnVsbENvbXBhcmVcbiAqIEEgYEZ1bGxDb21wYXJlYCBmdW5jdGlvbiBzYXRpc2ZpZXMgYWxsIHRoZSBpbnZhcmlhbnRzIHN0YXRlZCBiZWxvdyBmb3JcbiAqIGBSYW5rQ29tcGFyZWAncyByZWxhdGlvbiB3aXRoIEtleUNvbXBhcmUuXG4gKiBJbiBhZGRpdGlvbiwgaXRzIGVxdWFsaXR5IGlzIGFzIHByZWNpc2UgYXMgdGhlIGBLZXlDb21wYXJlYFxuICogY29tcGFyaXNvbiBkZWZpbmVkIGJlbG93LCBpbiB0aGF0LCBmb3IgYWxsIEtleXMgYHhgIGFuZCBgeWAsXG4gKiBgRnVsbENvbXBhcmUoeCwgeSkgPT09IDBgIGlmZiBgS2V5Q29tcGFyZSh4LCB5KSA9PT0gMGAuXG4gKlxuICogRm9yIG5vbi1rZXlzIGEgYEZ1bGxDb21wYXJlYCBzaG91bGQgYmUgZXhhY3RseSBhcyBpbXByZWNpc2UgYXNcbiAqIGBSYW5rQ29tcGFyZWAuIEZvciBleGFtcGxlLCBib3RoIHdpbGwgdHJlYXQgYWxsIGVycm9ycyBhcyBpbiB0aGUgc2FtZVxuICogZXF1aXZhbGVuY2UgY2xhc3MuIEJvdGggd2lsbCB0cmVhdCBhbGwgcHJvbWlzZXMgYXMgaW4gdGhlIHNhbWVcbiAqIGVxdWl2YWxlbmNlIGNsYXNzLiBCb3RoIHdpbGwgb3JkZXIgdGFnZ2VkcyB0aGUgc2FtZSB3YXksIHdoaWNoIGlzIGFkbWl0dGVkbHlcbiAqIHdlaXJkLCBhcyBzb21lIHRhZ2dlZHMgd2lsbCBiZSBjb25zaWRlcmVkIGtleXMgYW5kIG90aGVyIHRhZ2dlZHMgd2lsbCBiZVxuICogY29uc2lkZXJlZCBub24ta2V5cy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFJhbmtDb21wYXJhdG9yS2l0XG4gKiBAcHJvcGVydHkge1JhbmtDb21wYXJlfSBjb21wYXJhdG9yXG4gKiBAcHJvcGVydHkge1JhbmtDb21wYXJlfSBhbnRpQ29tcGFyYXRvclxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRnVsbENvbXBhcmF0b3JLaXRcbiAqIEBwcm9wZXJ0eSB7RnVsbENvbXBhcmV9IGNvbXBhcmF0b3JcbiAqIEBwcm9wZXJ0eSB7RnVsbENvbXBhcmV9IGFudGlDb21wYXJhdG9yXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7LTEgfCAwIHwgMSB8IE5hTn0gS2V5Q29tcGFyaXNvblxuICogVGhlIHJlc3VsdCBvZiBhIGBLZXlDb21wYXJlYCBmdW5jdGlvbiB0aGF0IGRlZmluZXMgYSBtZWFuaW5nZnVsXG4gKiBhbmQgbWVhbmluZ2Z1bGx5IHByZWNpc2UgcGFydGlhbCBvcmRlciBvZiBgS2V5YCB2YWx1ZXMuIFNlZSBgS2V5Q29tcGFyZWAuXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgS2V5Q29tcGFyZVxuICogYGNvbXBhcmVLZXlzYCBpbXBsZW1lbnRzIGEgcGFydGlhbCBvcmRlciBvdmVyIGtleXMuIEFzIHdpdGggdGhlXG4gKiByYW5rIG9yZGVyaW5nIHByb2R1Y2VkIGJ5IGBjb21wYXJlUmFua2AsIC0xLCAwLCBhbmQgMSBtZWFuXG4gKiBcImxlc3MgdGhhblwiLCBcImVxdWl2YWxlbnQgdG9cIiwgYW5kIFwiZ3JlYXRlciB0aGFuXCIgcmVzcGVjdGl2ZWx5LlxuICogTmFOIG1lYW5zIFwiaW5jb21wYXJhYmxlXCIgLS0tIHRoZSBmaXJzdCBrZXkgaXMgbm90IGxlc3MsIGVxdWl2YWxlbnQsXG4gKiBvciBncmVhdGVyIHRoYW4gdGhlIHNlY29uZC4gRm9yIGV4YW1wbGUsIHN1YnNldHMgb3ZlciBzZXRzIGlzXG4gKiBhIHBhcnRpYWwgb3JkZXIuXG4gKlxuICogQnkgdXNpbmcgTmFOIGZvciBcImluY29tcGFyYWJsZVwiLCB0aGUgbm9ybWFsIGVxdWl2YWxlbmNlIGZvciB1c2luZ1xuICogdGhlIHJldHVybiB2YWx1ZSBpbiBhIGNvbXBhcmlzb24gaXMgcHJlc2VydmVkLlxuICogYGNvbXBhcmVLZXlzKGxlZnQsIHJpZ2h0KSA+PSAwYCBpZmYgYGxlZnRgIGlzIGdyZWF0ZXIgdGhhbiBvclxuICogZXF1aXZhbGVudCB0byBgcmlnaHRgIGluIHRoZSBwYXJ0aWFsIG9yZGVyaW5nLlxuICpcbiAqIEtleSBvcmRlciAoYSBwYXJ0aWFsIG9yZGVyKSBhbmQgcmFuayBvcmRlciAoYSB0b3RhbCBwcmVvcmRlcikgYXJlXG4gKiBjby1kZXNpZ25lZCBzbyB0aGF0IHdlIHN0b3JlIHBhc3NhYmxlcyBpbiByYW5rIG9yZGVyIGFuZCBpbmRleCBpbnRvIHRoZW1cbiAqIHdpdGgga2V5cyBmb3Iga2V5LWJhc2VkIHF1ZXJpZXMuIFRvIGtlZXAgdGhlc2UgZGlzdGluY3QsIHdoZW4gc3BlYWtpbmdcbiAqIGluZm9ybWFsbHkgYWJvdXQgcmFuaywgd2UgdGFsayBhYm91dCBcImVhcmxpZXJcIiBhbmQgXCJsYXRlclwiLiBXaGVuIHNwZWFraW5nXG4gKiBpbmZvcm1hbGx5IGFib3V0IGtleXMsIHdlIHRhbGsgYWJvdXQgXCJzbWFsbGVyXCIgYW5kIFwiYmlnZ2VyXCIuXG4gKlxuICogSW4gYm90aCBvcmRlcnMsIHRoZSByZXR1cm4tMCBjYXNlIGRlZmluZXNcbiAqIGFuIGVxdWl2YWxlbmNlIGNsYXNzLCBpLmUuLCB0aG9zZSB0aGF0IGFyZSB0aWVkIGZvciB0aGUgc2FtZSBwbGFjZSBpbiB0aGVcbiAqIG9yZGVyLiBUaGUgZ2xvYmFsIGludmFyaWFudCB0aGF0IHdlIG5lZWQgYmV0d2VlbiB0aGUgdHdvIG9yZGVycyBpcyB0aGF0IHRoZVxuICoga2V5IG9yZGVyIGVxdWl2YWxlbmNlIGNsYXNzIGlzIGFsd2F5cyBhdCBsZWFzdCBhcyBwcmVjaXNlIGFzIHRoZVxuICogcmFuayBvcmRlciBlcXVpdmFsZW5jZSBjbGFzcy4gSU9XLCBpZiBgY29tcGFyZUtleXMoWCxZKSA9PT0gMGAgdGhlblxuICogYGNvbXBhcmVSYW5rKFgsWSkgPT09IDBgLiBCdXQgbm90IHZpY2UgdmVyc2EuIEZvciBleGFtcGxlLCB0d28gZGlmZmVyZW50XG4gKiByZW1vdGFibGVzIGFyZSB0aGUgc2FtZSByYW5rIGJ1dCBpbmNvbXBhcmFibGUgYXMga2V5cy5cbiAqXG4gKiBBIGZ1cnRoZXIgaW52YXJpYW50IGlzIGlmIGBjb21wYXJlS2V5cyhYLFkpIDwgMGAgdGhlblxuICogYGNvbXBhcmVSYW5rKFgsWSkgPCAwYCwgaS5lLiwgaWYgWCBpcyBzbWFsbGVyIHRoYW4gWSBpbiBrZXkgb3JkZXIsIHRoZW4gWFxuICogbXVzdCBiZSBlYXJsaWVyIHRoYW4gWSBpbiByYW5rIG9yZGVyLiBCdXQgbm90IHZpY2UgdmVyc2EuXG4gKiBYIGNhbiBiZSBlcXVpdmFsZW50IHRvIG9yIGVhcmxpZXIgdGhhbiBZIGluIHJhbmsgb3JkZXIgYW5kIHN0aWxsIGJlXG4gKiBpbmNvbXBhcmFibGUgd2l0aCBZIGluIGtleSBvcmRlci4gRm9yIGV4YW1wbGUsIHRoZSByZWNvcmQgYHtiOiAzLCBhOiA1fWAgaXNcbiAqIGVhcmxpZXIgdGhhbiB0aGUgcmVjb3JkIGB7YjogNSwgYTogM31gIGluIHJhbmsgb3JkZXIgYnV0IHRoZXkgYXJlXG4gKiBpbmNvbXBhcmFibGUgYXMga2V5cy4gQW5kIHR3byBkaXN0aW5jdCByZW1vdGFibGVzIHN1Y2ggYXMgYEZhcignWCcsIHt9KWAgYW5kXG4gKiBgRmFyKCdZJywge30pYCBhcmUgZXF1aXZhbGVudCBpbiByYW5rIG9yZGVyIGJ1dCBpbmNvbXBhcmFibGUgYXMga2V5cy5cbiAqXG4gKiBUaGlzIGxldHMgdXMgdHJhbnNsYXRlIGEgcmFuZ2Ugc2VhcmNoIG92ZXIgdGhlXG4gKiBwYXJ0aWFsIGtleSBvcmRlciBpbnRvIGEgcmFuZ2Ugc2VhcmNoIG92ZXIgcmFuayBvcmRlciBmb2xsb3dlZCBieSBmaWx0ZXJpbmdcbiAqIG91dCB0aG9zZSB0aGF0IGRvbid0IG1hdGNoLiBUbyBnZXQgdGhpcyBlZmZlY3QsIHdlIHN0b3JlIHRoZSBlbGVtZW50cyBvZlxuICogYSBzZXQgaW4gYW4gYXJyYXkgc29ydGVkIGluIHJldmVyc2UgcmFuayBvcmRlciwgZnJvbSBsYXRlciB0byBlYXJsaWVyLlxuICogQ29tYmluZWQgd2l0aCBvdXIgbGV4aWNvZ3JhcGhpYyBjb21wYXJpc29uIG9mIGFycmF5cywgaWYgc2V0IFggaXMgYSBzdWJzZXRcbiAqIG9mIHNldCBZIHRoZW4gdGhlIGFycmF5IHJlcHJlc2VudGluZyBzZXQgWCB3aWxsIGJlIGFuIGVhcmxpZXIgcmFuayB0aGF0IHRoZVxuICogYXJyYXkgcmVwcmVzZW50aW5nIHNldCBZLlxuICpcbiAqIEBwYXJhbSB7S2V5fSBsZWZ0XG4gKiBAcGFyYW0ge0tleX0gcmlnaHRcbiAqIEByZXR1cm5zIHtLZXlDb21wYXJpc29ufVxuICovXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLyBTaG91bGQgYmUgaW50ZXJuYWwgb25seSB0eXBlcyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7W3N0cmluZywgc3RyaW5nXX0gUmFua0NvdmVyXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7W251bWJlciwgbnVtYmVyXX0gSW5kZXhDb3ZlclxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEdldFBhc3NTdHlsZUNvdmVyXG4gKiBBc3NvY2lhdGUgd2l0aCBlYWNoIHBhc3NTdHlsZSBhIFJhbmtDb3ZlciB0aGF0IG1heSBiZSBhbiBvdmVyZXN0aW1hdGUsXG4gKiBhbmQgd2hvc2UgcmVzdWx0cyB0aGVyZWZvcmUgbmVlZCB0byBiZSBmaWx0ZXJlZCBkb3duLiBGb3IgZXhhbXBsZSwgYmVjYXVzZVxuICogdGhlcmUgaXMgbm90IGEgc21hbGxlc3Qgb3IgYmlnZ2VzdCBiaWdpbnQsIGJvdW5kIGl0IGJ5IGBOYU5gICh0aGUgbGFzdCBwbGFjZVxuICogbnVtYmVyKSBhbmQgYCcnYCAodGhlIGVtcHR5IHN0cmluZywgd2hpY2ggaXMgdGhlIGZpcnN0IHBsYWNlIHN0cmluZykuIFRodXMsXG4gKiBhIHJhbmdlIHF1ZXJ5IHVzaW5nIHRoaXMgcmFuZ2UgbWF5IGluY2x1ZGUgdGhlc2UgdmFsdWVzLCB3aGljaCB3b3VsZCB0aGVuXG4gKiBuZWVkIHRvIGJlIGZpbHRlcmVkIG91dC5cbiAqIEBwYXJhbSB7UGFzc1N0eWxlfSBwYXNzU3R5bGVcbiAqIEByZXR1cm5zIHtSYW5rQ292ZXJ9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgR2V0SW5kZXhDb3ZlclxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBzb3J0ZWRcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEBwYXJhbSB7UmFua0NvdmVyfSByYW5rQ292ZXJcbiAqIEByZXR1cm5zIHtJbmRleENvdmVyfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIENvdmVyZWRFbnRyaWVzXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IHNvcnRlZFxuICogQHBhcmFtIHtJbmRleENvdmVyfSBpbmRleENvdmVyXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8W251bWJlciwgUGFzc2FibGVdPn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBDaGVja1BhdHRlcm5cbiAqIEBwYXJhbSB7UGFzc2FibGV9IGFsbGVnZWRQYXR0ZXJuXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBDaGVja0tleVBhdHRlcm5cbiAqIEBwYXJhbSB7UGFzc2FibGV9IGFsbGVnZWRQYXR0ZXJuXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBLZXlUb0RCS2V5XG4gKiBJZiB0aGlzIGtleSBjYW4gYmUgZW5jb2RlZCBhcyBhIERCS2V5IHN0cmluZyB3aGljaCBzb3J0cyBjb3JyZWN0bHksXG4gKiByZXR1cm4gdGhhdCBzdHJpbmcuIEVsc2UgcmV0dXJuIGB1bmRlZmluZWRgLiBGb3IgZXhhbXBsZSwgYSBzY2FsYXItb25seVxuICogZW5jb2RlUGFzc2FibGUgd291bGQgcmV0dXJuIGB1bmRlZmluZWRgIGZvciBhbGwgbm9uLXNjYWxhciBrZXlzLlxuICogQHBhcmFtIHtQYXNzYWJsZX0ga2V5XG4gKiBAcmV0dXJucyB7c3RyaW5nPX1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBHZXRSYW5rQ292ZXJcbiAqIEBwYXJhbSB7UGF0dGVybn0gcGF0dGVyblxuICogQHBhcmFtIHtLZXlUb0RCS2V5fSBlbmNvZGVQYXNzYWJsZVxuICogQHJldHVybnMge1JhbmtDb3Zlcn1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEFsbExpbWl0c1xuICogQHByb3BlcnR5IHtudW1iZXJ9IGRlY2ltYWxEaWdpdHNMaW1pdFxuICogQHByb3BlcnR5IHtudW1iZXJ9IHN0cmluZ0xlbmd0aExpbWl0XG4gKiBAcHJvcGVydHkge251bWJlcn0gc3ltYm9sTmFtZUxlbmd0aExpbWl0XG4gKiBAcHJvcGVydHkge251bWJlcn0gbnVtUHJvcGVydGllc0xpbWl0XG4gKiBAcHJvcGVydHkge251bWJlcn0gcHJvcGVydHlOYW1lTGVuZ3RoTGltaXRcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBhcnJheUxlbmd0aExpbWl0XG4gKiBAcHJvcGVydHkge251bWJlcn0gbnVtU2V0RWxlbWVudHNMaW1pdFxuICogQHByb3BlcnR5IHtudW1iZXJ9IG51bVVuaXF1ZUJhZ0VsZW1lbnRzTGltaXRcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBudW1NYXBFbnRyaWVzTGltaXRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtQYXJ0aWFsPEFsbExpbWl0cz59IExpbWl0c1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gTWF0Y2hlck5hbWVzcGFjZVxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gTWF0Y2hlcn0gYW55XG4gKiBNYXRjaGVzIGFueSBwYXNzYWJsZS5cbiAqXG4gKiBAcHJvcGVydHkgeyguLi5wYXR0czogUGF0dGVybltdKSA9PiBNYXRjaGVyfSBhbmRcbiAqIE1hdGNoZXMgYWdhaW5zdCB0aGUgaW50ZXJzZWN0aW9uIG9mIGFsbCBzdWItcGF0dGVybnMuXG4gKlxuICogQHByb3BlcnR5IHsoLi4ucGF0dHM6IFBhdHRlcm5bXSkgPT4gTWF0Y2hlcn0gb3JcbiAqIE1hdGNoZXMgYWdhaW5zdCB0aGUgdW5pb24gb2YgYWxsIHN1Yi1wYXR0ZXJuc1xuICogKHJlcXVpcmluZyBhIG1hdGNoIGFnYWluc3QgYXQgbGVhc3Qgb25lKS5cbiAqXG4gKiBAcHJvcGVydHkgeyhzdWJQYXR0OiBQYXR0ZXJuKSA9PiBNYXRjaGVyfSBub3RcbiAqIE1hdGNoZXMgYWdhaW5zdCB0aGUgbmVnYXRpb24gb2YgdGhlIHN1Yi1wYXR0ZXJuLlxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gTWF0Y2hlcn0gc2NhbGFyXG4gKiBNYXRjaGVzIGEgcHJpbWl0aXZlIHZhbHVlIG9yIFJlbW90YWJsZS5cbiAqIEFsbCBzY2FsYXJzIGFyZSBrZXlzLlxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gTWF0Y2hlcn0ga2V5XG4gKiBNYXRjaGVzIGFueSB2YWx1ZSB0aGF0IGNhbiBiZSBhIGtleSBpbiBhIENvcHlNYXBcbiAqIG9yIGEgdmFsdWUgaW4gYSBDb3B5U2V0IG9yIENvcHlCYWcuXG4gKiBBbGwga2V5cyBhcmUgYWxzbyB2YWxpZCBQYXR0ZXJucyB0aGF0IG1hdGNoIG9ubHkgdGhlbXNlbHZlcy5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IE1hdGNoZXJ9IHBhdHRlcm5cbiAqIE1hdGNoZXMgYW55IFBhdHRlcm4gdGhhdCBjYW4gYmUgdXNlZCB0byBjaGFyYWN0ZXJpemUgcGFzc2FibGVzLlxuICogQSBwYXR0ZXJuIGNhbm5vdCBjb250YWluIGVycm9ycyBvciBwcm9taXNlcyxcbiAqIGFzIHRoZXNlIGFyZSBub3Qgc3RhYmxlIGVub3VnaCB0byB1c2VmdWxseSBtYXRjaC5cbiAqXG4gKiBAcHJvcGVydHkgeyhraW5kOiBzdHJpbmcpID0+IE1hdGNoZXJ9IGtpbmRcbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IE1hdGNoZXJ9IGJvb2xlYW5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IE1hdGNoZXJ9IG51bWJlclxuICogTWF0Y2hlcyBhbnkgZmxvYXRpbmcgcG9pbnQgbnVtYmVyLlxuICpcbiAqIEBwcm9wZXJ0eSB7KGxpbWl0cz86IExpbWl0cykgPT4gTWF0Y2hlcn0gYmlnaW50XG4gKlxuICogQHByb3BlcnR5IHsobGltaXRzPzogTGltaXRzKSA9PiBNYXRjaGVyfSBuYXRcbiAqIE1hdGNoZXMgYW55IG5vbi1uZWdhdGl2ZSBiaWdpbnQgb3JcbiAqIFwic2FmZVwiIChubyBncmVhdGVyIHRoYW4gMioqNTMgLSAxKSBub24tbmVnYXRpdmUgaW50ZWdyYWwgbnVtYmVyLFxuICogc3ViamVjdCB0byBsaW1pdHMuXG4gKlxuICogQHByb3BlcnR5IHsobGltaXRzPzogTGltaXRzKSA9PiBNYXRjaGVyfSBzdHJpbmdcbiAqXG4gKiBAcHJvcGVydHkgeyhsaW1pdHM/OiBMaW1pdHMpID0+IE1hdGNoZXJ9IHN5bWJvbFxuICogTWF0Y2hlcyBhbnkgcmVnaXN0ZXJlZCBvciB3ZWxsLWtub3duIHN5bWJvbCxcbiAqIHN1YmplY3QgdG8gbGltaXRzLlxuICpcbiAqIEBwcm9wZXJ0eSB7KGxpbWl0cz86IExpbWl0cykgPT4gTWF0Y2hlcn0gcmVjb3JkXG4gKiBNYXRjaGVzIGFueSBDb3B5UmVjb3JkLCBzdWJqZWN0IHRvIGxpbWl0cy5cbiAqXG4gKiBAcHJvcGVydHkgeyhsaW1pdHM/OiBMaW1pdHMpID0+IE1hdGNoZXJ9IGFycmF5XG4gKiBNYXRjaGVzIGFueSBDb3B5QXJyYXksIHN1YmplY3QgdG8gbGltaXRzLlxuICpcbiAqIEBwcm9wZXJ0eSB7KGxpbWl0cz86IExpbWl0cykgPT4gTWF0Y2hlcn0gc2V0XG4gKiBNYXRjaGVzIGFueSBDb3B5U2V0LCBzdWJqZWN0IHRvIGxpbWl0cy5cbiAqXG4gKiBAcHJvcGVydHkgeyhsaW1pdHM/OiBMaW1pdHMpID0+IE1hdGNoZXJ9IGJhZ1xuICogTWF0Y2hlcyBhbnkgQ29weUJhZywgc3ViamVjdCB0byBsaW1pdHMuXG4gKlxuICogQHByb3BlcnR5IHsobGltaXRzPzogTGltaXRzKSA9PiBNYXRjaGVyfSBtYXBcbiAqIE1hdGNoZXMgYW55IENvcHlNYXAsIHN1YmplY3QgdG8gbGltaXRzLlxuICpcbiAqIEBwcm9wZXJ0eSB7KGxhYmVsPzogc3RyaW5nKSA9PiBNYXRjaGVyfSByZW1vdGFibGVcbiAqIE1hdGNoZXMgYSBmYXIgb2JqZWN0IG9yIGl0cyByZW1vdGUgcHJlc2VuY2UuXG4gKiBUaGUgb3B0aW9uYWwgYGxhYmVsYCBpcyBwdXJlbHkgZm9yIGRpYWdub3N0aWMgcHVycG9zZXMgYW5kIGRvZXMgbm90XG4gKiBhZGQgYW55IGNvbnN0cmFpbnRzLlxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gTWF0Y2hlcn0gZXJyb3JcbiAqIE1hdGNoZXMgYW55IGVycm9yIG9iamVjdC5cbiAqIEVycm9yIG9iamVjdHMgYXJlIHBhc3NhYmxlLCBidXQgYXJlIG5laXRoZXIga2V5cyBub3Igc3ltYm9scy5cbiAqIFRoZXkgZG8gbm90IGhhdmUgYSB1c2VmdWwgaWRlbnRpdHkuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBNYXRjaGVyfSBwcm9taXNlXG4gKiBNYXRjaGVzIGFueSBwcm9taXNlIG9iamVjdC5cbiAqIFByb21pc2VzIGFyZSBwYXNzYWJsZSwgYnV0IGFyZSBuZWl0aGVyIGtleXMgbm9yIHN5bWJvbHMuXG4gKiBUaGV5IGRvIG5vdCBoYXZlIGEgdXNlZnVsIGlkZW50aXR5LlxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gTWF0Y2hlcn0gdW5kZWZpbmVkXG4gKiBNYXRjaGVzIHRoZSBleGFjdCB2YWx1ZSBgdW5kZWZpbmVkYC5cbiAqIEFsbCBrZXlzIGluY2x1ZGluZyBgdW5kZWZpbmVkYCBhcmUgYWxyZWFkeSB2YWxpZCBwYXR0ZXJucyBhbmRcbiAqIHNvIGNhbiB2YWxpZGx5IHJlcHJlc2VudCB0aGVtc2VsdmVzLlxuICogQnV0IG9wdGlvbmFsIHBhdHRlcm4gYXJndW1lbnRzIGAocGF0dGVybiA9IHVuZGVmaW5lZCkgPT4gLi4uYFxuICogY2Fubm90IGRpc3Rpbmd1aXNoIGJldHdlZW4gYHVuZGVmaW5lZGAgcGFzc2VkIGFzIGEgcGF0dGVybiB2cy5cbiAqIG9taXNzaW9uIG9mIHRoZSBhcmd1bWVudCwgYW5kIGludGVycHJldCB0aGUgZm9ybWVyIGFzIHRoZSBsYXR0ZXIuXG4gKiBUaHVzLCB3aGVuIGEgcGFzc2VkIHBhdHRlcm4gZG9lcyBub3QgYWxzbyBuZWVkIHRvIGJlIGEga2V5LFxuICogd2UgcmVjb21tZW5kIHBhc3NpbmcgYE0udW5kZWZpbmVkKClgIGluc3RlYWQgb2YgYHVuZGVmaW5lZGAuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBudWxsfSBudWxsXG4gKlxuICogQHByb3BlcnR5IHsocmlnaHRPcGVyYW5kIDpLZXkpID0+IE1hdGNoZXJ9IGx0XG4gKiBNYXRjaGVzIGFueSB2YWx1ZSB0aGF0IGNvbXBhcmVLZXlzIHJlcG9ydHMgYXMgbGVzcyB0aGFuIHJpZ2h0T3BlcmFuZC5cbiAqXG4gKiBAcHJvcGVydHkgeyhyaWdodE9wZXJhbmQgOktleSkgPT4gTWF0Y2hlcn0gbHRlXG4gKiBNYXRjaGVzIGFueSB2YWx1ZSB0aGF0IGNvbXBhcmVLZXlzIHJlcG9ydHMgYXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvXG4gKiByaWdodE9wZXJhbmQuXG4gKlxuICogQHByb3BlcnR5IHsoa2V5IDpLZXkpID0+IE1hdGNoZXJ9IGVxXG4gKiBNYXRjaGVzIGFueSB2YWx1ZSB0aGF0IGlzIGVxdWFsIHRvIGtleS5cbiAqXG4gKiBAcHJvcGVydHkgeyhrZXkgOktleSkgPT4gTWF0Y2hlcn0gbmVxXG4gKiBNYXRjaGVzIGFueSB2YWx1ZSB0aGF0IGlzIG5vdCBlcXVhbCB0byBrZXkuXG4gKlxuICogQHByb3BlcnR5IHsocmlnaHRPcGVyYW5kIDpLZXkpID0+IE1hdGNoZXJ9IGd0ZVxuICogTWF0Y2hlcyBhbnkgdmFsdWUgdGhhdCBjb21wYXJlS2V5cyByZXBvcnRzIGFzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbFxuICogdG8gcmlnaHRPcGVyYW5kLlxuICpcbiAqIEBwcm9wZXJ0eSB7KHJpZ2h0T3BlcmFuZCA6S2V5KSA9PiBNYXRjaGVyfSBndFxuICogTWF0Y2hlcyBpZiA+IHRoZSByaWdodCBvcGVyYW5kIGJ5IGNvbXBhcmVLZXlzXG4gKiBNYXRjaGVzIGFueSB2YWx1ZSB0aGF0IGNvbXBhcmVLZXlzIHJlcG9ydHMgYXMgZ3JlYXRlciB0aGFuXG4gKiByaWdodE9wZXJhbmQuXG4gKlxuICogQHByb3BlcnR5IHsoc3ViUGF0dD86IFBhdHRlcm4sIGxpbWl0cz86IExpbWl0cykgPT4gTWF0Y2hlcn0gYXJyYXlPZlxuICogTWF0Y2hlcyBhbnkgQ29weUFycmF5IHdob3NlIGVsZW1lbnRzIGFyZSBhbGwgbWF0Y2hlZCBieSBzdWJQYXR0XG4gKiBpZiBkZWZpbmVkLCBzdWJqZWN0IHRvIGxpbWl0cy5cbiAqXG4gKiBAcHJvcGVydHkgeyhrZXlQYXR0PzogUGF0dGVybixcbiAqICAgICAgICAgICAgIHZhbHVlUGF0dD86IFBhdHRlcm4sXG4gKiAgICAgICAgICAgICBsaW1pdHM/OiBMaW1pdHNcbiAqICkgPT4gTWF0Y2hlcn0gcmVjb3JkT2ZcbiAqIE1hdGNoZXMgYW55IENvcHlSZWNvcmQgd2hvc2Uga2V5cyBhcmUgYWxsIG1hdGNoZWQgYnkga2V5UGF0dFxuICogaWYgZGVmaW5lZCBhbmQgdmFsdWVzIGFyZSBhbGwgbWF0Y2hlZCBieSB2YWx1ZVBhdHQgaWYgZGVmaW5lZCxcbiAqIHN1YmplY3QgdG8gbGltaXRzLlxuICpcbiAqIEBwcm9wZXJ0eSB7KGtleVBhdHQ/OiBQYXR0ZXJuLCBsaW1pdHM/OiBMaW1pdHMpID0+IE1hdGNoZXJ9IHNldE9mXG4gKiBNYXRjaGVzIGFueSBDb3B5U2V0IHdob3NlIGVsZW1lbnRzIGFyZSBhbGwgbWF0Y2hlZCBieSBzdWJQYXR0XG4gKiBpZiBkZWZpbmVkLCBzdWJqZWN0IHRvIGxpbWl0cy5cbiAqXG4gKiBAcHJvcGVydHkgeyhrZXlQYXR0PzogUGF0dGVybixcbiAqICAgICAgICAgICAgIGNvdW50UGF0dD86IFBhdHRlcm4sXG4gKiAgICAgICAgICAgICBsaW1pdHM/OiBMaW1pdHNcbiAqICkgPT4gTWF0Y2hlcn0gYmFnT2ZcbiAqIE1hdGNoZXMgYW55IENvcHlCYWcgd2hvc2UgZWxlbWVudHMgYXJlIGFsbCBtYXRjaGVkIGJ5IGtleVBhdHRcbiAqIGlmIGRlZmluZWQgYW5kIHRoZSBjYXJkaW5hbGl0eSBvZiBlYWNoIGlzIG1hdGNoZWQgYnkgY291bnRQYXR0XG4gKiBpZiBkZWZpbmVkLCBzdWJqZWN0IHRvIGxpbWl0cy5cbiAqIGNvdW50UGF0dCBpcyBleHBlY3RlZCB0byByYXJlbHkgYmUgdXNlZnVsLFxuICogYnV0IGlzIHByb3ZpZGVkIHRvIG1pbmltaXplIHN1cnByaXNlLlxuICpcbiAqIEBwcm9wZXJ0eSB7KGtleVBhdHQ/OiBQYXR0ZXJuLFxuICogICAgICAgICAgICAgdmFsdWVQYXR0PzogUGF0dGVybixcbiAqICAgICAgICAgICAgIGxpbWl0cz86IExpbWl0c1xuICogKSA9PiBNYXRjaGVyfSBtYXBPZlxuICogTWF0Y2hlcyBhbnkgQ29weU1hcCB3aG9zZSBrZXlzIGFyZSBhbGwgbWF0Y2hlZCBieSBrZXlQYXR0IGlmIGRlZmluZWRcbiAqIGFuZCB2YWx1ZXMgYXJlIGFsbCBtYXRjaGVkIGJ5IHZhbHVlUGF0dCBpZiBkZWZpbmVkLFxuICogc3ViamVjdCB0byBsaW1pdHMuXG4gKlxuICogQHByb3BlcnR5IHsocmVxdWlyZWQ6IFBhdHRlcm5bXSxcbiAqICAgICAgICAgICAgIG9wdGlvbmFsPzogUGF0dGVybltdLFxuICogICAgICAgICAgICAgcmVzdD86IFBhdHRlcm4sXG4gKiApID0+IE1hdGNoZXJ9IHNwbGl0QXJyYXlcbiAqIE1hdGNoZXMgYW55IGFycmF5IC0tLSB0eXBpY2FsbHkgYW4gYXJndW1lbnRzIGxpc3QgLS0tIGNvbnNpc3Rpbmcgb2ZcbiAqICAgLSBhbiBpbml0aWFsIHBvcnRpb24gbWF0Y2hlZCBieSByZXF1aXJlZCwgYW5kXG4gKiAgIC0gYSBtaWRkbGUgcG9ydGlvbiBvZiBsZW5ndGggdXAgdG8gdGhlIGxlbmd0aCBvZiBvcHRpb25hbCB0aGF0IGlzXG4gKiAgICAgbWF0Y2hlZCBieSB0aGUgZXF1YWwtbGVuZ3RoIHByZWZpeCBvZiBvcHRpb25hbCBpZiBvcHRpb25hbCBpc1xuICogICAgIGRlZmluZWQsIGFuZFxuICogICAtIGEgcmVtYWluZGVyIHRoYXQgaXMgbWF0Y2hlZCBieSByZXN0IGlmIHJlc3QgaXMgZGVmaW5lZC5cbiAqIFRoZSBhcnJheSBtdXN0IGJlIGF0IGxlYXN0IGFzIGxvbmcgYXMgdGhlIHJlcXVpcmVkIHBhdHRlcm4sXG4gKiBidXQgaXRzIHJlbWFpbmRlciBjYW4gYmUgYXJiaXRyYXJpbHkgc2hvcnQuXG4gKiBBbnkgYXJyYXkgZWxlbWVudHMgYmV5b25kIHRoZSBzdW1tZWQgbGVuZ3RoIG9mIHJlcXVpcmVkIGFuZCBvcHRpb25hbFxuICogYXJlIGNvbGxlY3RlZCBhbmQgbWF0Y2hlZCBhZ2FpbnN0IHRoZSByZXN0IHBhdHRlcm4uXG4gKlxuICogQHByb3BlcnR5IHsocmVxdWlyZWQ6IENvcHlSZWNvcmQ8UGF0dGVybj4sXG4gKiAgICAgICAgICAgICBvcHRpb25hbD86IENvcHlSZWNvcmQ8UGF0dGVybj4sXG4gKiAgICAgICAgICAgICByZXN0PzogUGF0dGVybixcbiAqICkgPT4gTWF0Y2hlcn0gc3BsaXRSZWNvcmRcbiAqIE1hdGNoZXMgYW55IENvcHlSZWNvcmQgdGhhdCBjYW4gYmUgc3BsaXQgaW50byBjb21wb25lbnQgQ29weVJlY29yZHNcbiAqIGFzIGZvbGxvd3M6XG4gKiAgIC0gYWxsIHByb3BlcnRpZXMgY29ycmVzcG9uZGluZyB3aXRoIGEgcHJvcGVydHkgb2YgcmVxdWlyZWRcbiAqICAgLSBhbGwgcHJvcGVydGllcyBjb3JyZXNwb25kaW5nIHdpdGggYSBwcm9wZXJ0eSBvZiBvcHRpb25hbFxuICogICAgIGJ1dCBub3QgY29ycmVzcG9uZGluZyB3aXRoIGEgcHJvcGVydHkgb2YgcmVxdWlyZWRcbiAqICAgLSBhbGwgb3RoZXIgcHJvcGVydGllc1xuICogd2hlcmUgdGhlIGZpcnN0IGNvbXBvbmVudCBpcyBtYXRjaGVkIGJ5IHRoZSByZXF1aXJlZCBwYXR0ZXJuLFxuICogdGhlIHNlY29uZCBjb21wb25lbnQgaXMgbWF0Y2hlZCBieSB0aGUgc3Vic2V0IG9mIHRoZSBvcHRpb25hbCBwYXR0ZXJuXG4gKiBjb3JyZXNwb25kaW5nIHdpdGggaXRzIHByb3BlcnRpZXMgaWYgb3B0aW9uYWwgaXMgZGVmaW5lZCwgYW5kXG4gKiB0aGUgdGhpcmQgY29tcG9uZW50IGlzIG1hdGNoZWQgYnkgdGhlIHJlc3QgcGF0dGVybiBpZiBkZWZpbmVkLlxuICogVGhlIENvcHlSZWNvcmQgbXVzdCBoYXZlIGFsbCBwcm9wZXJ0aWVzIHRoYXQgYXBwZWFyIG9uIHRoZSByZXF1aXJlZFxuICogcGF0dGVybiwgYnV0IG1heSBvbWl0IHByb3BlcnRpZXMgdGhhdCBhcHBlYXIgb24gdGhlIG9wdGlvbmFsIHBhdHRlcm4uXG4gKlxuICogQHByb3BlcnR5IHsocmVxdWlyZWQ6IENvcHlSZWNvcmQ8Kj4gfCBDb3B5QXJyYXk8Kj4sXG4gKiAgICAgICAgICAgICByZXN0PzogUGF0dGVybixcbiAqICkgPT4gTWF0Y2hlcn0gc3BsaXRcbiAqIERlcHJlY2F0ZWQuIFVzZSBgTS5zcGxpdEFycmF5YCBvciBgTS5zcGxpdFJlY29yZGAgaW5zdGVhZC5cbiAqIEFuIGFycmF5IG9yIHJlY29yZCBpcyBzcGxpdCBpbnRvIHRoZSBmaXJzdCBwYXJ0IHRoYXQgbWF0Y2hlcyB0aGVcbiAqIGJhc2UgcGF0dGVybiwgYW5kIHRoZSByZW1haW5kZXIsIHdoaWNoIG1hdGNoZXMgYWdhaW5zdCB0aGUgb3B0aW9uYWxcbiAqIHJlc3QgcGF0dGVybiBpZiBwcmVzZW50LlxuICpcbiAqIEBwcm9wZXJ0eSB7KGJhc2U6IENvcHlSZWNvcmQ8Kj4gfCBDb3B5QXJyYXk8Kj4sXG4gKiAgICAgICAgICAgICByZXN0PzogUGF0dGVybixcbiAqICkgPT4gTWF0Y2hlcn0gcGFydGlhbFxuICogRGVwcmVjYXRlZC4gVXNlIGBNLnNwbGl0QXJyYXlgIG9yIGBNLnNwbGl0UmVjb3JkYCBpbnN0ZWFkLlxuICogQW4gYXJyYXkgb3IgcmVjb3JkIGlzIHNwbGl0IGludG8gdGhlIGZpcnN0IHBhcnQgdGhhdCBtYXRjaGVzIHRoZVxuICogYmFzZSBwYXR0ZXJuLCBhbmQgdGhlIHJlbWFpbmRlciwgd2hpY2ggbWF0Y2hlcyBhZ2FpbnN0IHRoZSBvcHRpb25hbFxuICogcmVzdCBwYXR0ZXJuIGlmIHByZXNlbnQuXG4gKiBgTS5wYXJ0aWFsYCBkaWZmZXJzIGZyb20gYE0uc3BsaXRgIGluIHRoZSBoYW5kbGluZyBvZiBkYXRhIHRoYXQgaXNcbiAqIGRlc2NyaWJlZCBpbiB0aGUgYmFzZSBwYXR0ZXJuIGJ1dCBhYnNlbnQgaW4gYSBwcm92aWRlZCBzcGVjaW1lbjpcbiAqICAgLSBGb3IgYSBDb3B5UmVjb3JkLCBgTS5wYXJ0aWFsYCBpZ25vcmVzIHByb3BlcnRpZXMgb2YgdGhlIGJhc2VcbiAqICAgICBwYXR0ZXJuIHRoYXQgYXJlIG5vdCBwcmVzZW50IG9uIHRoZSBzcGVjaW1lbi5cbiAqICAgLSBGb3IgYSBDb3B5QXJyYXksIGBNLnBhcnRpYWxgIGlnbm9yZXMgZWxlbWVudHMgb2YgdGhlIGJhc2VcbiAqICAgICBwYXR0ZXJuIGF0IGluZGljZXMgYmV5b25kIHRoZSBtYXhpbXVtIGluZGV4IG9mIHRoZSBzcGVjaW1lbi5cbiAqXG4gKiBAcHJvcGVydHkgeyh0OiBQYXR0ZXJuKSA9PiBQYXR0ZXJufSBlcmVmXG4gKiBNYXRjaGVzIGFueSBwcm9taXNlIG9iamVjdCBvciBwYXNzYWJsZSBub24tcHJvbWlzZSB0aGF0IG1hdGNoZXMgdGhlXG4gKiBzdWItcGF0dGVybi5cbiAqIE5vdGUgdGhhdCB2YWxpZGF0aW9uIGlzIGltbWVkaWF0ZSwgc28gKHVubGlrZSB0aGUgVHlwZVNjcmlwdCBFUmVmPFQ+XG4gKiB0eXBlKSBgTS5lcmVmYCBtYXRjaGVzIGEgcHJvbWlzZSBvYmplY3Qgd2hvc2UgZnVsZmlsbG1lbnQgdmFsdWUgaXNcbiAqIF9ub3RfIG1hdGNoZWQgYnkgdGhlIHN1Yi1wYXR0ZXJuLlxuICogRm9yIGRlc2NyaWJpbmcgYSB0b3AtbGV2ZWwgcGFyYW1ldGVyLFxuICogYE0uY2FsbFdoZW4oLi4uLCBNLmF3YWl0KHApLCAuLi4pYCBpcyBwcm9iYWJseSBtb3JlIGFwcHJvcHJpYXRlIHRoYW5cbiAqIGBNLmNhbGwoLi4uLCBNLmVyZWYocCksIC4uLilgLlxuICpcbiAqIEBwcm9wZXJ0eSB7KHQ6IFBhdHRlcm4pID0+IFBhdHRlcm59IG9wdFxuICogTWF0Y2hlcyBhIHZhbHVlIG1hdGNoZWQgYnkgdGhlIHN1Yi1wYXR0ZXJuIG9yIHRoZSBleGFjdCB2YWx1ZVxuICogYHVuZGVmaW5lZGAuXG4gKlxuICogQHByb3BlcnR5IHs8TSBleHRlbmRzIFJlY29yZDxhbnksIGFueT4+KGludGVyZmFjZU5hbWU6IHN0cmluZyxcbiAqICAgICAgICAgICAgIG1ldGhvZEd1YXJkczogTSxcbiAqICAgICAgICAgICAgIG9wdGlvbnM/OiB7c2xvcHB5PzogYm9vbGVhbn1cbiAqICkgPT4gSW50ZXJmYWNlR3VhcmR9IGludGVyZmFjZVxuICpcbiAqIEBwcm9wZXJ0eSB7KC4uLmFyZ0d1YXJkczogQXJnR3VhcmRbXSkgPT4gTWV0aG9kR3VhcmRNYWtlcn0gY2FsbFxuICpcbiAqIEBwcm9wZXJ0eSB7KC4uLmFyZ0d1YXJkczogQXJnR3VhcmRbXSkgPT4gTWV0aG9kR3VhcmRNYWtlcn0gY2FsbFdoZW5cbiAqXG4gKiBAcHJvcGVydHkgeyhhcmdHdWFyZDogQXJnR3VhcmQpID0+IEFyZ0d1YXJkfSBhd2FpdFxuICovXG5cbi8qKiBAdHlwZWRlZiB7KC4uLmFyZ3M6IGFueVtdKSA9PiBhbnl9IE1ldGhvZCAqL1xuXG4vKiBUT0RPIHBhcmFtZXRlcml6ZSB0aGlzIHRvIG1hdGNoIHRoZSBiZWhhdmlvciBvYmplY3QgaXQgZ3VhcmRzKi9cbi8qKlxuICogQHR5cGVkZWYge3tcbiAqIGtsYXNzOiAnSW50ZXJmYWNlJyxcbiAqIGludGVyZmFjZU5hbWU6IHN0cmluZyxcbiAqIG1ldGhvZEd1YXJkczogUmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgTWV0aG9kR3VhcmQ+XG4gKiBzbG9wcHk/OiBib29sZWFuXG4gKiB9fSBJbnRlcmZhY2VHdWFyZFxuICovXG5cbi8qKiBAdHlwZWRlZiB7YW55fSBNZXRob2RHdWFyZE1ha2VyXG4gKiBhIHBhcmFtZXRlciBsaXN0IGxpa2UgZm9vKGEsIGIsIGMgPSBkLCDigKZlKSA9PiBmIHNob3VsZCBiZSBndWFyZGVkIGJ5XG4gKiBzb21ldGhpbmcgbGlrZVxuICogZm9vOiBNLmNhbGwoQVNoYXBlLCBCU2hhcGUpLm9wdGlvbmFsKENTaGFwZSkucmVzdChFU2hhcGUpLnJldHVybnMoRlNoYXBlKVxuICogb3B0aW9uYWwgaXMgZm9yIG9wdGlvbmFsICg9KSBwYXJhbXMuIHJlc3QgaXMgZm9yIOKApiAodmFyYXJncykgcGFyYW1zXG4gKi9cblxuLyoqIEB0eXBlZGVmIHt7IGtsYXNzOiAnbWV0aG9kR3VhcmQnLCBjYWxsS2luZDogJ3N5bmMnIHwgJ2FzeW5jJywgcmV0dXJuR3VhcmQ6IHVua25vd24gfX0gTWV0aG9kR3VhcmQgKi9cbi8qKiBAdHlwZWRlZiB7YW55fSBBcmdHdWFyZCAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBhdHRlcm5LaXRcbiAqIEBwcm9wZXJ0eSB7KHNwZWNpbWVuOiBQYXNzYWJsZSxcbiAqICAgICAgICAgICAgIHBhdHQ6IFBhc3NhYmxlLFxuICogICAgICAgICAgICAgY2hlY2s6IENoZWNrZXIsXG4gKiAgICAgICAgICAgICBsYWJlbD86IHN0cmluZ3xudW1iZXJcbiAqICkgPT4gYm9vbGVhbn0gY2hlY2tNYXRjaGVzXG4gKiBAcHJvcGVydHkgeyhzcGVjaW1lbjogUGFzc2FibGUsIHBhdHQ6IFBhdHRlcm4pID0+IGJvb2xlYW59IG1hdGNoZXNcbiAqIEBwcm9wZXJ0eSB7KHNwZWNpbWVuOiBQYXNzYWJsZSwgcGF0dDogUGF0dGVybiwgbGFiZWw/OiBzdHJpbmd8bnVtYmVyKSA9PiB2b2lkfSBmaXRcbiAqIEBwcm9wZXJ0eSB7KHBhdHQ6IFBhdHRlcm4pID0+IHZvaWR9IGFzc2VydFBhdHRlcm5cbiAqIEBwcm9wZXJ0eSB7KHBhdHQ6IFBhc3NhYmxlKSA9PiBib29sZWFufSBpc1BhdHRlcm5cbiAqIEBwcm9wZXJ0eSB7KHBhdHQ6IFBhdHRlcm4pID0+IHZvaWR9IGFzc2VydEtleVBhdHRlcm5cbiAqIEBwcm9wZXJ0eSB7KHBhdHQ6IFBhc3NhYmxlKSA9PiBib29sZWFufSBpc0tleVBhdHRlcm5cbiAqIEBwcm9wZXJ0eSB7R2V0UmFua0NvdmVyfSBnZXRSYW5rQ292ZXJcbiAqIEBwcm9wZXJ0eSB7TWF0Y2hlck5hbWVzcGFjZX0gTVxuICovXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyogVE9ETyovXG4vKiBUaGUgZm9sbG93aW5nIHR5cGUgc2hvdWxkIGJlIGluIGludGVybmFsLXR5cGVzLmpzLCBzaW5jZSB0aGUqL1xuLyogYE1hdGNoSGVscGVyYCB0eXBlIGlzIHB1cmVseSBpbnRlcm5hbCB0byB0aGlzIHBhY2thZ2UuIEhvd2V2ZXIsKi9cbi8qIGluIG9yZGVyIHRvIGdldCB0aGUgZ292ZXJuYW5jZSBhbmQgc29sbyBwYWNrYWdlcyBib3RoIHRvIHBhc3MgbGludCwqL1xuLyogSSBtb3ZlZCB0aGUgdHlwZSBkZWNsYXJhdGlvbiBpdHNlbGYgdG8gdHlwZXMuanMuIFNlZSB0aGUgY29tbWVudHMgaW4qL1xuLyogaW4gaW50ZXJuYWwtdHlwZXMuanMgYW5kIGV4cG9ydHMuanMqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IE1hdGNoSGVscGVyXG4gKiBUaGlzIGZhY3RvcnMgb3V0IG9ubHkgdGhlIHBhcnRzIHNwZWNpZmljIHRvIGVhY2gga2luZCBvZiBNYXRjaGVyLiBJdCBpc1xuICogZW5jYXBzdWxhdGVkLCBhbmQgaXRzIG1ldGhvZHMgY2FuIG1ha2UgdGhlIHN0YXRlZCB1bmNoZWNrZXIgYXNzdW1wdGlvbnNcbiAqIGVuZm9yY2VkIGJ5IHRoZSBjb21tb24gY2FsbGluZyBsb2dpYy5cbiAqXG4gKiBAcHJvcGVydHkgeyhhbGxlZ2VkUGF5bG9hZDogUGFzc2FibGUsXG4gKiAgICAgICAgICAgICBjaGVjazogQ2hlY2tlclxuICogKSA9PiBib29sZWFufSBjaGVja0lzV2VsbEZvcm1lZFxuICogQXNzdW1lcyB0aGlzIGlzIHRoZSBwYXlsb2FkIG9mIGEgQ29weVRhZ2dlZCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nXG4gKiBtYXRjaFRhZy4gSXMgdGhpcyBhIHZhbGlkIHBheWxvYWQgZm9yIGEgTWF0Y2hlciB3aXRoIHRoYXQgdGFnP1xuICpcbiAqIEBwcm9wZXJ0eSB7KHNwZWNpbWVuOiBQYXNzYWJsZSxcbiAqICAgICAgICAgICAgIG1hdGNoZXJQYXlsb2FkOiBQYXNzYWJsZSxcbiAqICAgICAgICAgICAgIGNoZWNrOiBDaGVja2VyLFxuICogKSA9PiBib29sZWFufSBjaGVja01hdGNoZXNcbiAqIEFzc3VtaW5nIGEgdmFsaWQgTWF0Y2hlciBvZiB0aGlzIHR5cGUgd2l0aCBgbWF0Y2hlclBheWxvYWRgIGFzIGl0c1xuICogcGF5bG9hZCwgZG9lcyB0aGlzIHNwZWNpbWVuIG1hdGNoIHRoYXQgTWF0Y2hlcj9cbiAqXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgcGF5bG9hZDogUGFzc2FibGUsXG4gKiAgIGVuY29kZVBhc3NhYmxlOiBLZXlUb0RCS2V5XG4gKiApID0+IFJhbmtDb3Zlcn0gZ2V0UmFua0NvdmVyXG4gKiBBc3N1bWVzIHRoaXMgaXMgdGhlIHBheWxvYWQgb2YgYSBDb3B5VGFnZ2VkIHdpdGggdGhlIGNvcnJlc3BvbmRpbmdcbiAqIG1hdGNoVGFnLiBSZXR1cm4gYSBSYW5rQ292ZXIgdG8gYm91bmQgZnJvbSBiZWxvdyBhbmQgYWJvdmUsXG4gKiBpbiByYW5rIG9yZGVyLCBhbGwgcG9zc2libGUgUGFzc2FibGVzIHRoYXQgd291bGQgbWF0Y2ggdGhpcyBNYXRjaGVyLlxuICogVGhlIGxlZnQgZWxlbWVudCBtdXN0IGJlIGJlZm9yZSBvciB0aGUgc2FtZSByYW5rIGFzIGFueSBwb3NzaWJsZVxuICogbWF0Y2hpbmcgc3BlY2ltZW4uIFRoZSByaWdodCBlbGVtZW50IG11c3QgYmUgYWZ0ZXIgb3IgdGhlIHNhbWVcbiAqIHJhbmsgYXMgYW55IHBvc3NpYmxlIG1hdGNoaW5nIHNwZWNpbWVuLlxuICpcbiAqIEBwcm9wZXJ0eSB7KGFsbGVnZWRQYXR0ZXJuOiBQYXNzYWJsZSxcbiAqICAgICAgICAgICAgIGNoZWNrOiBDaGVja2VyXG4gKiApID0+IGJvb2xlYW59IGNoZWNrS2V5UGF0dGVyblxuICogQXNzdW1lcyB0aGlzIGlzIHRoZSBwYXlsb2FkIG9mIGEgQ29weVRhZ2dlZCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nXG4gKiBtYXRjaFRhZy4gSXMgdGhpcyBhIHZhbGlkIHBhdHRlcm4gZm9yIHVzZSBhcyBhIHF1ZXJ5IGtleSBvciBrZXkgc2hhcGU/XG4gKi9cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAP7X12VIBAABSAQAAKAAAAEBhZ29yaWMvc3dpbmdzZXQtdmF0LXYwLjMwLjIvZXhwb3J0ZWQuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKi8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vc3JjL3ZhdHMvdGltZXIvdHlwZXNcIi8+Ki9cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA314sitcGAADXBgAAOQAAAEBhZ29yaWMvc3dpbmdzZXQtdmF0LXYwLjMwLjIvc3JjL3ZhdHMvdGltZXIvdHlwZUd1YXJkcy5qc3siaW1wb3J0cyI6WyJAYWdvcmljL3N0b3JlIl0sImV4cG9ydHMiOlsiUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUiLCJSZWxhdGl2ZVRpbWVTaGFwZSIsIlJlbGF0aXZlVGltZVZhbHVlU2hhcGUiLCJUaW1lckJyYW5kU2hhcGUiLCJUaW1lc3RhbXBSZWNvcmRTaGFwZSIsIlRpbWVzdGFtcFNoYXBlIiwiVGltZXN0YW1wVmFsdWVTaGFwZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBNOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIk1cIiwgWyRo4oCNX2EgPT4gKE0gPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuY29uc3QgICAgICAgIFRpbWVyQnJhbmRTaGFwZT1NLnJlbW90YWJsZSgpOyRo4oCNX29uY2UuVGltZXJCcmFuZFNoYXBlKFRpbWVyQnJhbmRTaGFwZSk7XG5jb25zdCAgICAgICAgVGltZXN0YW1wVmFsdWVTaGFwZT1NLm5hdCgpOyRo4oCNX29uY2UuVGltZXN0YW1wVmFsdWVTaGFwZShUaW1lc3RhbXBWYWx1ZVNoYXBlKTtcbmNvbnN0ICAgICAgICBSZWxhdGl2ZVRpbWVWYWx1ZVNoYXBlPU0ubmF0KCk7LyogU2hvdWxkIHdlIGFsbG93IG5lZ2F0aXZlcz8qLyRo4oCNX29uY2UuUmVsYXRpdmVUaW1lVmFsdWVTaGFwZShSZWxhdGl2ZVRpbWVWYWx1ZVNoYXBlKTtcblxuY29uc3QgICAgICAgIFRpbWVzdGFtcFJlY29yZFNoYXBlPWhhcmRlbih7XG50aW1lckJyYW5kOlRpbWVyQnJhbmRTaGFwZSxcbmFic1ZhbHVlOlRpbWVzdGFtcFZhbHVlU2hhcGV9KTskaOKAjV9vbmNlLlRpbWVzdGFtcFJlY29yZFNoYXBlKFRpbWVzdGFtcFJlY29yZFNoYXBlKTtcblxuXG5jb25zdCAgICAgICAgUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGU9aGFyZGVuKHtcbnRpbWVyQnJhbmQ6VGltZXJCcmFuZFNoYXBlLFxucmVsVmFsdWU6UmVsYXRpdmVUaW1lVmFsdWVTaGFwZX0pOyRo4oCNX29uY2UuUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUoUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUpO1xuXG5cbmNvbnN0ICAgICAgICBUaW1lc3RhbXBTaGFwZT1NLm9yKFRpbWVzdGFtcFJlY29yZFNoYXBlLFRpbWVzdGFtcFZhbHVlU2hhcGUpOyRo4oCNX29uY2UuVGltZXN0YW1wU2hhcGUoVGltZXN0YW1wU2hhcGUpO1xuY29uc3QgICAgICAgIFJlbGF0aXZlVGltZVNoYXBlPU0ub3IoXG5SZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSxcblJlbGF0aXZlVGltZVZhbHVlU2hhcGUpOyRo4oCNX29uY2UuUmVsYXRpdmVUaW1lU2hhcGUoUmVsYXRpdmVUaW1lU2hhcGUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlRpbWVyQnJhbmRTaGFwZSI6WyJUaW1lckJyYW5kU2hhcGUiXSwiVGltZXN0YW1wVmFsdWVTaGFwZSI6WyJUaW1lc3RhbXBWYWx1ZVNoYXBlIl0sIlJlbGF0aXZlVGltZVZhbHVlU2hhcGUiOlsiUmVsYXRpdmVUaW1lVmFsdWVTaGFwZSJdLCJUaW1lc3RhbXBSZWNvcmRTaGFwZSI6WyJUaW1lc3RhbXBSZWNvcmRTaGFwZSJdLCJSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSI6WyJSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSJdLCJUaW1lc3RhbXBTaGFwZSI6WyJUaW1lc3RhbXBTaGFwZSJdLCJSZWxhdGl2ZVRpbWVTaGFwZSI6WyJSZWxhdGl2ZVRpbWVTaGFwZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB3iGo/SCMAAEgjAAAuAAAAQGFnb3JpYy92YXQtZGF0YS12MC40LjMvc3JjL2Zhci1jbGFzcy11dGlscy5qc3siaW1wb3J0cyI6WyIuL2tpbmQtdXRpbHMuanMiLCIuL3ZhdC1kYXRhLWJpbmRpbmdzLmpzIiwiQGFnb3JpYy9zdG9yZSJdLCJleHBvcnRzIjpbImRlZmluZUR1cmFibGVGYXJDbGFzcyIsImRlZmluZUR1cmFibGVGYXJDbGFzc0tpdCIsImRlZmluZVZpcnR1YWxGYXJDbGFzcyIsImRlZmluZVZpcnR1YWxGYXJDbGFzc0tpdCIsInZpdmlmeUZhckNsYXNzIiwidml2aWZ5RmFyQ2xhc3NLaXQiLCJ2aXZpZnlGYXJJbnN0YW5jZSIsInZpdmlmeVNpbmdsZXRvbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBpbml0RW1wdHkscHJvdmlkZUtpbmRIYW5kbGUsZGVmaW5lS2luZCxkZWZpbmVLaW5kTXVsdGksZGVmaW5lRHVyYWJsZUtpbmQsZGVmaW5lRHVyYWJsZUtpbmRNdWx0aSxwcm92aWRlOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvc3RvcmVcIiwgW1tcImluaXRFbXB0eVwiLCBbJGjigI1fYSA9PiAoaW5pdEVtcHR5ID0gJGjigI1fYSldXV1dLFtcIi4va2luZC11dGlscy5qc1wiLCBbW1wicHJvdmlkZUtpbmRIYW5kbGVcIiwgWyRo4oCNX2EgPT4gKHByb3ZpZGVLaW5kSGFuZGxlID0gJGjigI1fYSldXV1dLFtcIi4vdmF0LWRhdGEtYmluZGluZ3MuanNcIiwgW1tcImRlZmluZUtpbmRcIiwgWyRo4oCNX2EgPT4gKGRlZmluZUtpbmQgPSAkaOKAjV9hKV1dLFtcImRlZmluZUtpbmRNdWx0aVwiLCBbJGjigI1fYSA9PiAoZGVmaW5lS2luZE11bHRpID0gJGjigI1fYSldXSxbXCJkZWZpbmVEdXJhYmxlS2luZFwiLCBbJGjigI1fYSA9PiAoZGVmaW5lRHVyYWJsZUtpbmQgPSAkaOKAjV9hKV1dLFtcImRlZmluZUR1cmFibGVLaW5kTXVsdGlcIiwgWyRo4oCNX2EgPT4gKGRlZmluZUR1cmFibGVLaW5kTXVsdGkgPSAkaOKAjV9hKV1dLFtcInByb3ZpZGVcIiwgWyRo4oCNX2EgPT4gKHByb3ZpZGUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0ZW1wbGF0ZSBMLFIgQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL2V2ZW50dWFsLXNlbmQnKS5SZW1vdGFibGVCcmFuZDxMLCBSPn0gUmVtb3RhYmxlQnJhbmQgKi9cbi8qKiBAdGVtcGxhdGUgVCBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vZXZlbnR1YWwtc2VuZCcpLkVSZWY8VD59IEVSZWYgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkJhZ2dhZ2V9IEJhZ2dhZ2UgKi9cbi8qKiBAdGVtcGxhdGUgVCBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkRlZmluZUtpbmRPcHRpb25zPFQ+fSBEZWZpbmVLaW5kT3B0aW9ucyAqL1xuLyoqIEB0ZW1wbGF0ZSBUIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuS2luZEZhY2V0PFQ+fSBLaW5kRmFjZXQgKi9cbi8qKiBAdGVtcGxhdGUgVCBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLktpbmRGYWNldHM8VD59IEtpbmRGYWNldHMgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkR1cmFibGVLaW5kSGFuZGxlfSBEdXJhYmxlS2luZEhhbmRsZSAqL1xuXG4vKiBUT0RPIGludGVyZmFjZUd1YXJkIHR5cGUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy82MjA2Ki9cbi8qKlxuICogQHRlbXBsYXRlIHsoLi4uYXJnczogYW55KSA9PiBhbnl9IEkgaW5pdCBzdGF0ZSBmdW5jdGlvblxuICogQHRlbXBsYXRlIFQgYmVoYXZpb3JcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEBwYXJhbSB7YW55fSBpbnRlcmZhY2VHdWFyZFxuICogQHBhcmFtIHtJfSBpbml0XG4gKiBAcGFyYW0ge1QgJiBUaGlzVHlwZTx7IHNlbGY6IFQsIHN0YXRlOiBSZXR1cm5UeXBlPEk+IH0+fSBtZXRob2RzXG4gKiBAcGFyYW0ge0RlZmluZUtpbmRPcHRpb25zPHsgc2VsZjogVCwgc3RhdGU6IFJldHVyblR5cGU8ST4gfT59IFtvcHRpb25zXVxuICogQHJldHVybnMgeyguLi5hcmdzOiBQYXJhbWV0ZXJzPEk+KSA9PiAoVCAmIFJlbW90YWJsZUJyYW5kPHt9LCBUPil9XG4gKi9cbmNvbnN0ICAgICAgICBkZWZpbmVWaXJ0dWFsRmFyQ2xhc3M9KFxudGFnLFxuaW50ZXJmYWNlR3VhcmQsXG5pbml0LFxubWV0aG9kcyxcbm9wdGlvbnMpPT5cblxuLyogQHRzLWV4cGVjdC1lcnJvciBUaGUgdXNlIG9mIGB0aGlzZnVsTWV0aG9kc2AgdG8gY2hhbmdlKi9cbi8qIHRoZSBhcHByb3ByaWF0ZSBzdGF0aWMgdHlwZSBpcyB0aGUgd2hvbGUgcG9pbnQgb2YgdGhpcyBtZXRob2QuKi9cbmRlZmluZUtpbmQodGFnLGluaXQsbWV0aG9kcyx7XG4uLi5vcHRpb25zLFxudGhpc2Z1bE1ldGhvZHM6dHJ1ZSxcbmludGVyZmFjZUd1YXJkfSk7JGjigI1fb25jZS5kZWZpbmVWaXJ0dWFsRmFyQ2xhc3MoZGVmaW5lVmlydHVhbEZhckNsYXNzKTtcblxuaGFyZGVuKGRlZmluZVZpcnR1YWxGYXJDbGFzcyk7XG5cbi8qIFRPRE8gaW50ZXJmYWNlR3VhcmQgdHlwZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzYyMDYqL1xuLyoqXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiBhbnkpID0+IGFueX0gSSBpbml0IHN0YXRlIGZ1bmN0aW9uXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcgfCBzeW1ib2wsIENhbGxhYmxlRnVuY3Rpb24+Pn0gVCBmYWNldHNcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEBwYXJhbSB7YW55fSBpbnRlcmZhY2VHdWFyZEtpdFxuICogQHBhcmFtIHtJfSBpbml0XG4gKiBAcGFyYW0ge1QgJiBUaGlzVHlwZTx7IGZhY2V0czogVCwgc3RhdGU6IFJldHVyblR5cGU8ST4gfT4gfSBmYWNldHNcbiAqIEBwYXJhbSB7RGVmaW5lS2luZE9wdGlvbnM8eyBmYWNldHM6IFQsIHN0YXRlOiBSZXR1cm5UeXBlPEk+IH0+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHsoLi4uYXJnczogUGFyYW1ldGVyczxJPikgPT4gKFQgJiBSZW1vdGFibGVCcmFuZDx7fSwgVD4pfVxuICovXG5jb25zdCAgICAgICAgZGVmaW5lVmlydHVhbEZhckNsYXNzS2l0PShcbnRhZyxcbmludGVyZmFjZUd1YXJkS2l0LFxuaW5pdCxcbmZhY2V0cyxcbm9wdGlvbnMpPT5cblxuLyogQHRzLWV4cGVjdC1lcnJvciBUaGUgdXNlIG9mIGB0aGlzZnVsTWV0aG9kc2AgdG8gY2hhbmdlKi9cbi8qIHRoZSBhcHByb3ByaWF0ZSBzdGF0aWMgdHlwZSBpcyB0aGUgd2hvbGUgcG9pbnQgb2YgdGhpcyBtZXRob2QuKi9cbmRlZmluZUtpbmRNdWx0aSh0YWcsaW5pdCxmYWNldHMse1xuLi4ub3B0aW9ucyxcbnRoaXNmdWxNZXRob2RzOnRydWUsXG5pbnRlcmZhY2VHdWFyZDppbnRlcmZhY2VHdWFyZEtpdH0pOyRo4oCNX29uY2UuZGVmaW5lVmlydHVhbEZhckNsYXNzS2l0KGRlZmluZVZpcnR1YWxGYXJDbGFzc0tpdCk7XG5cbmhhcmRlbihkZWZpbmVWaXJ0dWFsRmFyQ2xhc3NLaXQpO1xuXG4vKiBUT0RPIGludGVyZmFjZUd1YXJkIHR5cGUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy82MjA2Ki9cbi8qKlxuICogQHRlbXBsYXRlIHsoLi4uYXJnczogYW55KSA9PiBhbnl9IEkgaW5pdCBzdGF0ZSBmdW5jdGlvblxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCBDYWxsYWJsZUZ1bmN0aW9uPn0gVCBtZXRob2RzXG4gKiBAcGFyYW0ge0R1cmFibGVLaW5kSGFuZGxlfSBraW5kSGFuZGxlXG4gKiBAcGFyYW0ge2FueX0gaW50ZXJmYWNlR3VhcmRcbiAqIEBwYXJhbSB7SX0gaW5pdFxuICogQHBhcmFtIHtUICYgVGhpc1R5cGU8eyBzZWxmOiBULCBzdGF0ZTogUmV0dXJuVHlwZTxJPiB9Pn0gbWV0aG9kc1xuICogQHBhcmFtIHtEZWZpbmVLaW5kT3B0aW9uczx7IHNlbGY6IFQsIHN0YXRlOiBSZXR1cm5UeXBlPEk+IH0+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHsoLi4uYXJnczogUGFyYW1ldGVyczxJPikgPT4gKFQgJiBSZW1vdGFibGVCcmFuZDx7fSwgVD4pfVxuICovXG5jb25zdCAgICAgICAgZGVmaW5lRHVyYWJsZUZhckNsYXNzPShcbmtpbmRIYW5kbGUsXG5pbnRlcmZhY2VHdWFyZCxcbmluaXQsXG5tZXRob2RzLFxub3B0aW9ucyk9PlxuXG4vKiBAdHMtZXhwZWN0LWVycm9yIFRoZSB1c2Ugb2YgYHRoaXNmdWxNZXRob2RzYCB0byBjaGFuZ2UqL1xuLyogdGhlIGFwcHJvcHJpYXRlIHN0YXRpYyB0eXBlIGlzIHRoZSB3aG9sZSBwb2ludCBvZiB0aGlzIG1ldGhvZC4qL1xuZGVmaW5lRHVyYWJsZUtpbmQoa2luZEhhbmRsZSxpbml0LG1ldGhvZHMse1xuLi4ub3B0aW9ucyxcbnRoaXNmdWxNZXRob2RzOnRydWUsXG5pbnRlcmZhY2VHdWFyZH0pOyRo4oCNX29uY2UuZGVmaW5lRHVyYWJsZUZhckNsYXNzKGRlZmluZUR1cmFibGVGYXJDbGFzcyk7XG5cbmhhcmRlbihkZWZpbmVEdXJhYmxlRmFyQ2xhc3MpO1xuXG4vKiBUT0RPIGludGVyZmFjZUd1YXJkIHR5cGUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy82MjA2Ki9cbi8qKlxuICogQHRlbXBsYXRlIHsoLi4uYXJnczogYW55KSA9PiBhbnl9IEkgaW5pdCBzdGF0ZSBmdW5jdGlvblxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCBDYWxsYWJsZUZ1bmN0aW9uPj59IFQgZmFjZXRzXG4gKiBAcGFyYW0ge0R1cmFibGVLaW5kSGFuZGxlfSBraW5kSGFuZGxlXG4gKiBAcGFyYW0ge2FueX0gaW50ZXJmYWNlR3VhcmRLaXRcbiAqIEBwYXJhbSB7SX0gaW5pdFxuICogQHBhcmFtIHtUICYgVGhpc1R5cGU8eyBmYWNldHM6IFQsIHN0YXRlOiBSZXR1cm5UeXBlPEk+fT4gfSBmYWNldHNcbiAqIEBwYXJhbSB7RGVmaW5lS2luZE9wdGlvbnM8eyBmYWNldHM6IFQsIHN0YXRlOiBSZXR1cm5UeXBlPEk+fT59IFtvcHRpb25zXVxuICogQHJldHVybnMgeyguLi5hcmdzOiBQYXJhbWV0ZXJzPEk+KSA9PiAoVCAmIFJlbW90YWJsZUJyYW5kPHt9LCBUPil9XG4gKi9cbmNvbnN0ICAgICAgICBkZWZpbmVEdXJhYmxlRmFyQ2xhc3NLaXQ9KFxua2luZEhhbmRsZSxcbmludGVyZmFjZUd1YXJkS2l0LFxuaW5pdCxcbmZhY2V0cyxcbm9wdGlvbnMpPT5cblxuLyogQHRzLWV4cGVjdC1lcnJvciBUaGUgdXNlIG9mIGB0aGlzZnVsTWV0aG9kc2AgdG8gY2hhbmdlKi9cbi8qIHRoZSBhcHByb3ByaWF0ZSBzdGF0aWMgdHlwZSBpcyB0aGUgd2hvbGUgcG9pbnQgb2YgdGhpcyBtZXRob2QuKi9cbmRlZmluZUR1cmFibGVLaW5kTXVsdGkoa2luZEhhbmRsZSxpbml0LGZhY2V0cyx7XG4uLi5vcHRpb25zLFxudGhpc2Z1bE1ldGhvZHM6dHJ1ZSxcbmludGVyZmFjZUd1YXJkOmludGVyZmFjZUd1YXJkS2l0fSk7JGjigI1fb25jZS5kZWZpbmVEdXJhYmxlRmFyQ2xhc3NLaXQoZGVmaW5lRHVyYWJsZUZhckNsYXNzS2l0KTtcblxuaGFyZGVuKGRlZmluZUR1cmFibGVGYXJDbGFzc0tpdCk7XG5cbi8qIFRPRE8gaW50ZXJmYWNlR3VhcmQgdHlwZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzYyMDYqL1xuLyoqXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiBhbnkpID0+IGFueX0gSSBpbml0IHN0YXRlIGZ1bmN0aW9uXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcgfCBzeW1ib2wsIENhbGxhYmxlRnVuY3Rpb24+fSBUIG1ldGhvZHNcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IGtpbmROYW1lXG4gKiBAcGFyYW0ge2FueX0gaW50ZXJmYWNlR3VhcmRcbiAqIEBwYXJhbSB7SX0gaW5pdFxuICogQHBhcmFtIHtUICYgVGhpc1R5cGU8eyBzZWxmOiBULCBzdGF0ZTogUmV0dXJuVHlwZTxJPiB9Pn0gbWV0aG9kc1xuICogQHBhcmFtIHtEZWZpbmVLaW5kT3B0aW9uczx7IHNlbGY6IFQsIHN0YXRlOiBSZXR1cm5UeXBlPEk+IH0+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHsoLi4uYXJnczogUGFyYW1ldGVyczxJPikgPT4gKFQgJiBSZW1vdGFibGVCcmFuZDx7fSwgVD4pfVxuICovXG5jb25zdCAgICAgICAgdml2aWZ5RmFyQ2xhc3M9KFxuYmFnZ2FnZSxcbmtpbmROYW1lLFxuaW50ZXJmYWNlR3VhcmQsXG5pbml0LFxubWV0aG9kcyxcbm9wdGlvbnM9dW5kZWZpbmVkKT0+XG5cbmRlZmluZUR1cmFibGVGYXJDbGFzcyhcbnByb3ZpZGVLaW5kSGFuZGxlKGJhZ2dhZ2Usa2luZE5hbWUpLFxuaW50ZXJmYWNlR3VhcmQsXG5pbml0LFxubWV0aG9kcyxcbm9wdGlvbnMpOyRo4oCNX29uY2Uudml2aWZ5RmFyQ2xhc3Modml2aWZ5RmFyQ2xhc3MpO1xuXG5oYXJkZW4odml2aWZ5RmFyQ2xhc3MpO1xuXG4vKiBUT0RPIGludGVyZmFjZUd1YXJkIHR5cGUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy82MjA2Ki9cbi8qKlxuICogQHRlbXBsYXRlIHsoLi4uYXJnczogYW55KSA9PiBhbnl9IEkgaW5pdCBzdGF0ZSBmdW5jdGlvblxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCBDYWxsYWJsZUZ1bmN0aW9uPj59IFQgZmFjZXRzXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBraW5kTmFtZVxuICogQHBhcmFtIHthbnl9IGludGVyZmFjZUd1YXJkS2l0XG4gKiBAcGFyYW0ge0l9IGluaXRcbiAqIEBwYXJhbSB7VCAmIFRoaXNUeXBlPHsgZmFjZXRzOiBULCBzdGF0ZTogUmV0dXJuVHlwZTxJPiB9PiB9IGZhY2V0c1xuICogQHBhcmFtIHtEZWZpbmVLaW5kT3B0aW9uczx7IGZhY2V0czogVCwgc3RhdGU6IFJldHVyblR5cGU8ST4gfT59IFtvcHRpb25zXVxuICogQHJldHVybnMgeyguLi5hcmdzOiBQYXJhbWV0ZXJzPEk+KSA9PiAoVCAmIFJlbW90YWJsZUJyYW5kPHt9LCBUPil9XG4gKi9cbmNvbnN0ICAgICAgICB2aXZpZnlGYXJDbGFzc0tpdD0oXG5iYWdnYWdlLFxua2luZE5hbWUsXG5pbnRlcmZhY2VHdWFyZEtpdCxcbmluaXQsXG5mYWNldHMsXG5vcHRpb25zPXVuZGVmaW5lZCk9PlxuXG5kZWZpbmVEdXJhYmxlRmFyQ2xhc3NLaXQoXG5wcm92aWRlS2luZEhhbmRsZShiYWdnYWdlLGtpbmROYW1lKSxcbmludGVyZmFjZUd1YXJkS2l0LFxuaW5pdCxcbmZhY2V0cyxcbm9wdGlvbnMpOyRo4oCNX29uY2Uudml2aWZ5RmFyQ2xhc3NLaXQodml2aWZ5RmFyQ2xhc3NLaXQpO1xuXG5oYXJkZW4odml2aWZ5RmFyQ2xhc3NLaXQpO1xuXG4vKiBUT0RPIGludGVyZmFjZUd1YXJkIHR5cGUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy82MjA2Ki9cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgQ2FsbGFibGVGdW5jdGlvbj59IE0gbWV0aG9kc1xuICogQHBhcmFtIHtCYWdnYWdlfSBiYWdnYWdlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2luZE5hbWVcbiAqIEBwYXJhbSB7YW55fSBpbnRlcmZhY2VHdWFyZFxuICogQHBhcmFtIHtNfSBtZXRob2RzXG4gKiBAcGFyYW0ge0RlZmluZUtpbmRPcHRpb25zPHsgc2VsZjogTSB9Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7VCAmIFJlbW90YWJsZUJyYW5kPHt9LCBUPn1cbiAqL1xuY29uc3QgICAgICAgIHZpdmlmeUZhckluc3RhbmNlPShcbmJhZ2dhZ2UsXG5raW5kTmFtZSxcbmludGVyZmFjZUd1YXJkLFxubWV0aG9kcyxcbm9wdGlvbnM9dW5kZWZpbmVkKT0+XG57XG5jb25zdCBtYWtlU2luZ2xldG9uPXZpdmlmeUZhckNsYXNzKFxuYmFnZ2FnZSxcbmtpbmROYW1lLFxuaW50ZXJmYWNlR3VhcmQsXG5pbml0RW1wdHksXG5tZXRob2RzLFxub3B0aW9ucyk7XG5cblxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItdHMtZXhwZWN0LWVycm9yIC0tIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNDYyMCovXG4vKiBAdHMtaWdub3JlIGNvdWxkIGJlIGluc3RhbnRpYXRlZCB3aXRoIGFuIGFyYml0cmFyeSB0eXBlKi9cbnJldHVybiBwcm92aWRlKGJhZ2dhZ2UsIGB0aGVfJHtraW5kTmFtZX1gLCgpPT5tYWtlU2luZ2xldG9uKCkpO1xuIH07JGjigI1fb25jZS52aXZpZnlGYXJJbnN0YW5jZSh2aXZpZnlGYXJJbnN0YW5jZSk7XG5oYXJkZW4odml2aWZ5RmFySW5zdGFuY2UpO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSB2aXZpZnlGYXJJbnN0YW5jZSBpbnN0ZWFkLlxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCBDYWxsYWJsZUZ1bmN0aW9uPn0gVCBtZXRob2RzXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBraW5kTmFtZVxuICogQHBhcmFtIHtUfSBtZXRob2RzXG4gKiBAcGFyYW0ge0RlZmluZUtpbmRPcHRpb25zPHsgc2VsZjogVCB9Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7VCAmIFJlbW90YWJsZUJyYW5kPHt9LCBUPn1cbiAqL1xuY29uc3QgICAgICAgIHZpdmlmeVNpbmdsZXRvbj0oXG5iYWdnYWdlLFxua2luZE5hbWUsXG5tZXRob2RzLFxub3B0aW9ucz11bmRlZmluZWQpPT5cbnZpdmlmeUZhckluc3RhbmNlKGJhZ2dhZ2Usa2luZE5hbWUsdW5kZWZpbmVkLG1ldGhvZHMsb3B0aW9ucyk7JGjigI1fb25jZS52aXZpZnlTaW5nbGV0b24odml2aWZ5U2luZ2xldG9uKTtcbmhhcmRlbih2aXZpZnlTaW5nbGV0b24pO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZmluZVZpcnR1YWxGYXJDbGFzcyI6WyJkZWZpbmVWaXJ0dWFsRmFyQ2xhc3MiXSwiZGVmaW5lVmlydHVhbEZhckNsYXNzS2l0IjpbImRlZmluZVZpcnR1YWxGYXJDbGFzc0tpdCJdLCJkZWZpbmVEdXJhYmxlRmFyQ2xhc3MiOlsiZGVmaW5lRHVyYWJsZUZhckNsYXNzIl0sImRlZmluZUR1cmFibGVGYXJDbGFzc0tpdCI6WyJkZWZpbmVEdXJhYmxlRmFyQ2xhc3NLaXQiXSwidml2aWZ5RmFyQ2xhc3MiOlsidml2aWZ5RmFyQ2xhc3MiXSwidml2aWZ5RmFyQ2xhc3NLaXQiOlsidml2aWZ5RmFyQ2xhc3NLaXQiXSwidml2aWZ5RmFySW5zdGFuY2UiOlsidml2aWZ5RmFySW5zdGFuY2UiXSwidml2aWZ5U2luZ2xldG9uIjpbInZpdmlmeVNpbmdsZXRvbiJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACPyzk/PQYAAD0GAAAkAAAAQGFnb3JpYy92YXQtZGF0YS12MC40LjMvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vZmFyLWNsYXNzLXV0aWxzLmpzIiwiLi9raW5kLXV0aWxzLmpzIiwiLi92YXQtZGF0YS1iaW5kaW5ncy5qcyJdLCJleHBvcnRzIjpbImRlZmluZUR1cmFibGVGYXJDbGFzcyIsImRlZmluZUR1cmFibGVGYXJDbGFzc0tpdCIsImRlZmluZVZpcnR1YWxGYXJDbGFzcyIsImRlZmluZVZpcnR1YWxGYXJDbGFzc0tpdCIsInZpdmlmeUZhckNsYXNzIiwidml2aWZ5RmFyQ2xhc3NLaXQiLCJ2aXZpZnlGYXJJbnN0YW5jZSIsInZpdmlmeVNpbmdsZXRvbiJdLCJyZWV4cG9ydHMiOlsiLi9raW5kLXV0aWxzLmpzIiwiLi92YXQtZGF0YS1iaW5kaW5ncy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vdmF0LWRhdGEtYmluZGluZ3MuanNcIiwgW11dLFtcIi4va2luZC11dGlscy5qc1wiLCBbXV0sW1wiLi9mYXItY2xhc3MtdXRpbHMuanNcIiwgW1tcImRlZmluZVZpcnR1YWxGYXJDbGFzc1wiLCBbJGjigI1fbGl2ZVtcImRlZmluZVZpcnR1YWxGYXJDbGFzc1wiXV1dLFtcImRlZmluZVZpcnR1YWxGYXJDbGFzc0tpdFwiLCBbJGjigI1fbGl2ZVtcImRlZmluZVZpcnR1YWxGYXJDbGFzc0tpdFwiXV1dLFtcImRlZmluZUR1cmFibGVGYXJDbGFzc1wiLCBbJGjigI1fbGl2ZVtcImRlZmluZUR1cmFibGVGYXJDbGFzc1wiXV1dLFtcImRlZmluZUR1cmFibGVGYXJDbGFzc0tpdFwiLCBbJGjigI1fbGl2ZVtcImRlZmluZUR1cmFibGVGYXJDbGFzc0tpdFwiXV1dLFtcInZpdmlmeUZhckNsYXNzXCIsIFskaOKAjV9saXZlW1widml2aWZ5RmFyQ2xhc3NcIl1dXSxbXCJ2aXZpZnlGYXJDbGFzc0tpdFwiLCBbJGjigI1fbGl2ZVtcInZpdmlmeUZhckNsYXNzS2l0XCJdXV0sW1widml2aWZ5RmFySW5zdGFuY2VcIiwgWyRo4oCNX2xpdmVbXCJ2aXZpZnlGYXJJbnN0YW5jZVwiXV1dLFtcInZpdmlmeVNpbmdsZXRvblwiLCBbJGjigI1fbGl2ZVtcInZpdmlmeVNpbmdsZXRvblwiXV1dXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6eyJkZWZpbmVWaXJ0dWFsRmFyQ2xhc3MiOlsiZGVmaW5lVmlydHVhbEZhckNsYXNzIixmYWxzZV0sImRlZmluZVZpcnR1YWxGYXJDbGFzc0tpdCI6WyJkZWZpbmVWaXJ0dWFsRmFyQ2xhc3NLaXQiLGZhbHNlXSwiZGVmaW5lRHVyYWJsZUZhckNsYXNzIjpbImRlZmluZUR1cmFibGVGYXJDbGFzcyIsZmFsc2VdLCJkZWZpbmVEdXJhYmxlRmFyQ2xhc3NLaXQiOlsiZGVmaW5lRHVyYWJsZUZhckNsYXNzS2l0IixmYWxzZV0sInZpdmlmeUZhckNsYXNzIjpbInZpdmlmeUZhckNsYXNzIixmYWxzZV0sInZpdmlmeUZhckNsYXNzS2l0IjpbInZpdmlmeUZhckNsYXNzS2l0IixmYWxzZV0sInZpdmlmeUZhckluc3RhbmNlIjpbInZpdmlmeUZhckluc3RhbmNlIixmYWxzZV0sInZpdmlmeVNpbmdsZXRvbiI6WyJ2aXZpZnlTaW5nbGV0b24iLGZhbHNlXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAI8gotDQJAAA0CQAAKQAAAEBhZ29yaWMvdmF0LWRhdGEtdjAuNC4zL3NyYy9raW5kLXV0aWxzLmpzeyJpbXBvcnRzIjpbIi4vdmF0LWRhdGEtYmluZGluZ3MuanMiXSwiZXhwb3J0cyI6WyJpZ25vcmVDb250ZXh0IiwicHJvdmlkZUtpbmRIYW5kbGUiLCJ2aXZpZnlLaW5kIiwidml2aWZ5S2luZE11bHRpIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IHByb3ZpZGUsZGVmaW5lRHVyYWJsZUtpbmQsZGVmaW5lRHVyYWJsZUtpbmRNdWx0aSxtYWtlS2luZEhhbmRsZTskaOKAjV9pbXBvcnRzKFtbXCIuL3ZhdC1kYXRhLWJpbmRpbmdzLmpzXCIsIFtbXCJwcm92aWRlXCIsIFskaOKAjV9hID0+IChwcm92aWRlID0gJGjigI1fYSldXSxbXCJkZWZpbmVEdXJhYmxlS2luZFwiLCBbJGjigI1fYSA9PiAoZGVmaW5lRHVyYWJsZUtpbmQgPSAkaOKAjV9hKV1dLFtcImRlZmluZUR1cmFibGVLaW5kTXVsdGlcIiwgWyRo4oCNX2EgPT4gKGRlZmluZUR1cmFibGVLaW5kTXVsdGkgPSAkaOKAjV9hKV1dLFtcIm1ha2VLaW5kSGFuZGxlXCIsIFskaOKAjV9hID0+IChtYWtlS2luZEhhbmRsZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQmFnZ2FnZX0gQmFnZ2FnZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuRHVyYWJsZUtpbmRIYW5kbGV9IER1cmFibGVLaW5kSGFuZGxlICovXG5cbi8qKlxuICogTWFrZSBhIHZlcnNpb24gb2YgdGhlIGFyZ3VtZW50IGZ1bmN0aW9uIHRoYXQgdGFrZXMgYSBraW5kIGNvbnRleHQgYnV0XG4gKiBpZ25vcmVzIGl0LlxuICpcbiAqIEB0eXBlIHs8VCBleHRlbmRzIEZ1bmN0aW9uPihmbjogVCkgPT4gWGltcG9ydCgnLi90eXBlcy5qcycpLlBsdXNDb250ZXh0PG5ldmVyLCBUPn1cbiAqL1xuY29uc3QgICAgICAgIGlnbm9yZUNvbnRleHQ9XG4oZm4pPT5cbihfY29udGV4dCwuLi5hcmdzKT0+XG5mbiguLi5hcmdzKTskaOKAjV9vbmNlLmlnbm9yZUNvbnRleHQoaWdub3JlQ29udGV4dCk7XG5oYXJkZW4oaWdub3JlQ29udGV4dCk7XG5cbi8qKlxuICogQHBhcmFtIHtCYWdnYWdlfSBiYWdnYWdlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2luZE5hbWVcbiAqIEByZXR1cm5zIHtEdXJhYmxlS2luZEhhbmRsZX1cbiAqL1xuY29uc3QgICAgICAgIHByb3ZpZGVLaW5kSGFuZGxlPShiYWdnYWdlLGtpbmROYW1lKT0+XG5wcm92aWRlKGJhZ2dhZ2UsIGAke2tpbmROYW1lfV9raW5kSGFuZGxlYCwoKT0+bWFrZUtpbmRIYW5kbGUoa2luZE5hbWUpKTskaOKAjV9vbmNlLnByb3ZpZGVLaW5kSGFuZGxlKHByb3ZpZGVLaW5kSGFuZGxlKTtcbmhhcmRlbihwcm92aWRlS2luZEhhbmRsZSk7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIHZpdmlmeUZhckNsYXNzIGluc3RlYWRcbiAqIEB0eXBlIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuVml2aWZ5S2luZH1cbiAqL1xuY29uc3QgICAgICAgIHZpdmlmeUtpbmQ9KFxuYmFnZ2FnZSxcbmtpbmROYW1lLFxuaW5pdCxcbmJlaGF2aW9yLFxub3B0aW9ucz11bmRlZmluZWQpPT5cblxuZGVmaW5lRHVyYWJsZUtpbmQoXG5wcm92aWRlS2luZEhhbmRsZShiYWdnYWdlLGtpbmROYW1lKSxcbmluaXQsXG5iZWhhdmlvcixcbm9wdGlvbnMpOyRo4oCNX29uY2Uudml2aWZ5S2luZCh2aXZpZnlLaW5kKTtcblxuaGFyZGVuKHZpdmlmeUtpbmQpO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSB2aXZpZnlGYXJDbGFzc0tpdCBpbnN0ZWFkXG4gKiBAdHlwZSB7WGltcG9ydCgnLi90eXBlcy5qcycpLlZpdmlmeUtpbmRNdWx0aX1cbiAqL1xuY29uc3QgICAgICAgIHZpdmlmeUtpbmRNdWx0aT0oXG5iYWdnYWdlLFxua2luZE5hbWUsXG5pbml0LFxuYmVoYXZpb3IsXG5vcHRpb25zPXVuZGVmaW5lZCk9PlxuXG5kZWZpbmVEdXJhYmxlS2luZE11bHRpKFxucHJvdmlkZUtpbmRIYW5kbGUoYmFnZ2FnZSxraW5kTmFtZSksXG5pbml0LFxuYmVoYXZpb3IsXG5vcHRpb25zKTskaOKAjV9vbmNlLnZpdmlmeUtpbmRNdWx0aSh2aXZpZnlLaW5kTXVsdGkpO1xuXG5oYXJkZW4odml2aWZ5S2luZE11bHRpKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpZ25vcmVDb250ZXh0IjpbImlnbm9yZUNvbnRleHQiXSwicHJvdmlkZUtpbmRIYW5kbGUiOlsicHJvdmlkZUtpbmRIYW5kbGUiXSwidml2aWZ5S2luZCI6WyJ2aXZpZnlLaW5kIl0sInZpdmlmeUtpbmRNdWx0aSI6WyJ2aXZpZnlLaW5kTXVsdGkiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAArcdmbcocAADKHAAAMAAAAEBhZ29yaWMvdmF0LWRhdGEtdjAuNC4zL3NyYy92YXQtZGF0YS1iaW5kaW5ncy5qc3siaW1wb3J0cyI6WyJAYWdvcmljL2Fzc2VydCIsIkBhZ29yaWMvc3RvcmUiXSwiZXhwb3J0cyI6WyJNIiwiY2FuQmVEdXJhYmxlIiwiZGVmaW5lRHVyYWJsZUtpbmQiLCJkZWZpbmVEdXJhYmxlS2luZE11bHRpIiwiZGVmaW5lS2luZCIsImRlZmluZUtpbmRNdWx0aSIsIm1ha2VLaW5kSGFuZGxlIiwibWFrZVNjYWxhckJpZ01hcFN0b3JlIiwibWFrZVNjYWxhckJpZ1NldFN0b3JlIiwibWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSIsIm1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUiLCJtYWtlU2NhbGFyTWFwU3RvcmUiLCJtYWtlU2NhbGFyU2V0U3RvcmUiLCJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIiwibWFrZVNjYWxhcldlYWtTZXRTdG9yZSIsInBhcnRpYWxBc3NpZ24iLCJwaWNrRmFjZXQiLCJwcm92aWRlIiwicHJvdmlkZUR1cmFibGVNYXBTdG9yZSIsInByb3ZpZGVEdXJhYmxlU2V0U3RvcmUiLCJwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSIsInByb3ZpZGVQcm9taXNlV2F0Y2hlciIsIndhdGNoUHJvbWlzZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnQsTSxtYWtlU2NhbGFyTWFwU3RvcmUsbWFrZVNjYWxhcldlYWtNYXBTdG9yZSxtYWtlU2NhbGFyU2V0U3RvcmUsbWFrZVNjYWxhcldlYWtTZXRTdG9yZSxwcm92aWRlTGF6eTskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2Fzc2VydFwiLCBbW1wiYXNzZXJ0XCIsIFskaOKAjV9hID0+IChhc3NlcnQgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiTVwiLCBbJGjigI1fYSA9PiAoTSA9ICRo4oCNX2EpLCRo4oCNX2xpdmVbXCJNXCJdXV0sW1wibWFrZVNjYWxhck1hcFN0b3JlXCIsIFskaOKAjV9hID0+IChtYWtlU2NhbGFyTWFwU3RvcmUgPSAkaOKAjV9hKSwkaOKAjV9saXZlW1wibWFrZVNjYWxhck1hcFN0b3JlXCJdXV0sW1wibWFrZVNjYWxhcldlYWtNYXBTdG9yZVwiLCBbJGjigI1fYSA9PiAobWFrZVNjYWxhcldlYWtNYXBTdG9yZSA9ICRo4oCNX2EpLCRo4oCNX2xpdmVbXCJtYWtlU2NhbGFyV2Vha01hcFN0b3JlXCJdXV0sW1wibWFrZVNjYWxhclNldFN0b3JlXCIsIFskaOKAjV9hID0+IChtYWtlU2NhbGFyU2V0U3RvcmUgPSAkaOKAjV9hKSwkaOKAjV9saXZlW1wibWFrZVNjYWxhclNldFN0b3JlXCJdXV0sW1wibWFrZVNjYWxhcldlYWtTZXRTdG9yZVwiLCBbJGjigI1fYSA9PiAobWFrZVNjYWxhcldlYWtTZXRTdG9yZSA9ICRo4oCNX2EpLCRo4oCNX2xpdmVbXCJtYWtlU2NhbGFyV2Vha1NldFN0b3JlXCJdXV0sW1wicHJvdmlkZUxhenlcIiwgWyRo4oCNX2EgPT4gKHByb3ZpZGVMYXp5ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZSB7WGltcG9ydCgnLi90eXBlcycpLlZhdERhdGF9ICovXG5sZXQgVmF0RGF0YUdsb2JhbDtcbmlmKCdWYXREYXRhJ2luIGdsb2JhbFRoaXMpe1xuYXNzZXJ0KGdsb2JhbFRoaXMuVmF0RGF0YSwnVmF0RGF0YSBkZWZpbmVkIGluIGdsb2JhbCBhcyBudWxsIG9yIHVuZGVmaW5lZCcpO1xuVmF0RGF0YUdsb2JhbD1nbG9iYWxUaGlzLlZhdERhdGE7XG4gfWVsc2V7XG4vKiBYWFggdGhpcyBtb2R1bGUgaGFzIGJlZW4ga25vd24gdG8gZ2V0IGltcG9ydGVkICh0cmFuc2l0aXZlbHkpIGluIGNhc2VzIHRoYXQqL1xuLyogbmV2ZXIgdXNlIGl0IHNvIHdlIG1ha2UgYSB2ZXJzaW9uIHRoYXQgd2lsbCBzYXRpc2Z5IG1vZHVsZSByZXNvbHV0aW9uIGJ1dCovXG4vKiBmYWlsIGF0IHJ1bnRpbWUuKi9cbmNvbnN0IHVudmFpbGFibGU9KCk9PmFzc2VydC5mYWlsKCdWYXREYXRhIHVuYXZhaWxhYmxlJyk7XG5WYXREYXRhR2xvYmFsPXtcbmRlZmluZUtpbmQ6dW52YWlsYWJsZSxcbmRlZmluZUtpbmRNdWx0aTp1bnZhaWxhYmxlLFxuZGVmaW5lRHVyYWJsZUtpbmQ6dW52YWlsYWJsZSxcbmRlZmluZUR1cmFibGVLaW5kTXVsdGk6dW52YWlsYWJsZSxcbm1ha2VLaW5kSGFuZGxlOnVudmFpbGFibGUsXG5wcm92aWRlUHJvbWlzZVdhdGNoZXI6dW52YWlsYWJsZSxcbndhdGNoUHJvbWlzZTp1bnZhaWxhYmxlLFxubWFrZVNjYWxhckJpZ01hcFN0b3JlOnVudmFpbGFibGUsXG5tYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlOnVudmFpbGFibGUsXG5tYWtlU2NhbGFyQmlnU2V0U3RvcmU6dW52YWlsYWJsZSxcbm1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmU6dW52YWlsYWJsZSxcbmNhbkJlRHVyYWJsZTp1bnZhaWxhYmxlfTtcblxuIH1cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgRmFyQ2xhc3Nlcy9GYXJJbnN0YW5jZXMgaW5zdGVhZCBvZiBraW5kc1xuICovXG5jb25zdCAgICAgICB7XG5kZWZpbmVLaW5kLFxuZGVmaW5lS2luZE11bHRpLFxuZGVmaW5lRHVyYWJsZUtpbmQsXG5kZWZpbmVEdXJhYmxlS2luZE11bHRpfT1cblZhdERhdGFHbG9iYWw7JGjigI1fb25jZS5kZWZpbmVLaW5kKGRlZmluZUtpbmQpOyRo4oCNX29uY2UuZGVmaW5lS2luZE11bHRpKGRlZmluZUtpbmRNdWx0aSk7JGjigI1fb25jZS5kZWZpbmVEdXJhYmxlS2luZChkZWZpbmVEdXJhYmxlS2luZCk7JGjigI1fb25jZS5kZWZpbmVEdXJhYmxlS2luZE11bHRpKGRlZmluZUR1cmFibGVLaW5kTXVsdGkpO1xuXG5jb25zdCAgICAgICB7XG5tYWtlS2luZEhhbmRsZSxcbnByb3ZpZGVQcm9taXNlV2F0Y2hlcixcbndhdGNoUHJvbWlzZSxcbm1ha2VTY2FsYXJCaWdNYXBTdG9yZSxcbm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUsXG5tYWtlU2NhbGFyQmlnU2V0U3RvcmUsXG5tYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlLFxuY2FuQmVEdXJhYmxlfT1cblZhdERhdGFHbG9iYWw7XG5cbi8qKlxuICogV2hlbiBtYWtpbmcgYSBtdWx0aS1mYWNldCBraW5kLCBpdCdzIGNvbW1vbiB0byBwaWNrIG9uZSBmYWNldCB0byBleHBvc2UuIEUuZy4sXG4gKlxuICogICAgIGNvbnN0IG1ha2VGb28gPSAoYSwgYiwgYywgZCkgPT4gbWFrZUZvb0Jhc2UoYSwgYiwgYywgZCkuc2VsZjtcbiAqXG4gKiBUaGlzIGhlbHBlciByZWR1Y2VzIHRoZSBkdXBsaWNhdGlvbjpcbiAqXG4gKiAgICAgY29uc3QgbWFrZUZvbyA9IHBpY2tGYWNldChtYWtlRm9vQmFzZSwgJ3NlbGYnKTtcbiAqXG4gKiBAdHlwZSB7WGltcG9ydCgnLi90eXBlcycpLlBpY2tGYWNldH1cbiAqLyRo4oCNX29uY2UubWFrZUtpbmRIYW5kbGUobWFrZUtpbmRIYW5kbGUpOyRo4oCNX29uY2UucHJvdmlkZVByb21pc2VXYXRjaGVyKHByb3ZpZGVQcm9taXNlV2F0Y2hlcik7JGjigI1fb25jZS53YXRjaFByb21pc2Uod2F0Y2hQcm9taXNlKTskaOKAjV9vbmNlLm1ha2VTY2FsYXJCaWdNYXBTdG9yZShtYWtlU2NhbGFyQmlnTWFwU3RvcmUpOyRo4oCNX29uY2UubWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZShtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlKTskaOKAjV9vbmNlLm1ha2VTY2FsYXJCaWdTZXRTdG9yZShtYWtlU2NhbGFyQmlnU2V0U3RvcmUpOyRo4oCNX29uY2UubWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZShtYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlKTskaOKAjV9vbmNlLmNhbkJlRHVyYWJsZShjYW5CZUR1cmFibGUpO1xuY29uc3QgICAgICAgIHBpY2tGYWNldD1cbihtYWtlcixmYWNldE5hbWUpPT5cbiguLi5hcmdzKT0+XG5tYWtlciguLi5hcmdzKVtmYWNldE5hbWVdOyRo4oCNX29uY2UucGlja0ZhY2V0KHBpY2tGYWNldCk7XG5oYXJkZW4ocGlja0ZhY2V0KTtcblxuLyoqXG4gKiBBc3NpZ24gdGhlIHZhbHVlcyBvZiBhbGwgb2YgdGhlIGVudW1lcmFibGUgb3duIHByb3BlcnRpZXMgZnJvbSB0aGUgc291cmNlXG4gKiBvYmplY3QgdG8gdGhlaXIga2V5cyBpbiB0aGUgdGFyZ2V0IG9iamVjdC5cbiAqXG4gKiBAdGVtcGxhdGUge3t9fSBUXG4gKiBAcGFyYW0ge1R9IHRhcmdldFxuICogQHBhcmFtIHtQYXJ0aWFsPFQ+fSBzb3VyY2VcbiAqL1xuY29uc3QgICAgICAgIHBhcnRpYWxBc3NpZ249KHRhcmdldCxzb3VyY2UpPT57XG5PYmplY3QuYXNzaWduKHRhcmdldCxzb3VyY2UpO1xuIH07JGjigI1fb25jZS5wYXJ0aWFsQXNzaWduKHBhcnRpYWxBc3NpZ24pO1xuaGFyZGVuKHBhcnRpYWxBc3NpZ24pO1xuXG4vKipcbiAqIFVubGlrZSBgcHJvdmlkZUxhenlgLCBgcHJvdmlkZWAgc2hvdWxkIGJlIGNhbGxlZCBhdCBtb3N0IG9uY2VcbiAqIHdpdGhpbiBhbnkgdmF0IGluY2FybmF0aW9uIHdpdGggYSBnaXZlbiBgYmFnZ2FnZWAsYGtleWAgcGFpci5cbiAqXG4gKiBgcHJvdmlkZWAgc2hvdWxkIG9ubHkgdG8gYmUgdXNlZCB0byBwb3B1bGF0ZSBiYWdnYWdlLFxuICogd2hlcmUgdGhlIHRvdGFsIG51bWJlciBvZiBjYWxscyB0byBgcHJvdmlkZWAgbXVzdCBiZVxuICogbG93IGNhcmRpbmFsaXR5LCBzaW5jZSB3ZSBrZWVwIHRoZSBib29ra2VlcGluZyB0byBkZXRlY3QgY29sbGlzaW9uc1xuICogaW4gbm9ybWFsIGxhbmd1YWdlLWhlYXAgbWVtb3J5LiBBbGwgdGhlIG90aGVyIGJhZ2dhZ2Utb3JpZW50ZWRcbiAqIGBwcm92aWRlKmAgYW5kIGB2aXZpZnkqYCBmdW5jdGlvbnMgY2FsbCBgcHJvdmlkZWAsXG4gKiBhbmQgc28gaW1wb3NlIHRoZSBzYW1lIGNvbnN0cmFpbnRzLiBUaGlzIGlzIGNvbnNpc3RlbnQgd2l0aFxuICogb3VyIGV4cGVjdGVkIGR1cmFiaWxpdHkgcGF0dGVybnM6IFdoYXQgd2Ugc3RvcmUgaW4gYmFnZ2FnZSBhcmVcbiAqICAgICoga2luZEhhbmRsZXMsIHdoaWNoIGFyZSBwZXIga2luZCwgd2hpY2ggbXVzdCBiZSBsb3cgY2FyZGluYWxpdHlcbiAqICAgICogZGF0YSBcInZhcmlhYmxlc1wiIGZvciByZWVzdGFibGlzaGluZyB0aGUgbGV4aWNhbCBzY29wZSwgZXNwZWNpYWxseVxuICogICAgICBvZiBzaW5nbGV0b25zXG4gKiAgICAqIG5hbWVkIG5vbi1iYWdnYWdlIGNvbGxlY3Rpb25zIGF0IHRoZSBsZWF2ZXMgb2YgdGhlIGJhZ2dhZ2UgdHJlZS5cbiAqXG4gKiBXaGF0IGlzIGV4cGVjdGVkIHRvIGJlIGhpZ2ggY2FyZGluYWxpdHkgYXJlIHRoZSBpbnN0YW5jZXMgb2YgdGhlIGtpbmRzLFxuICogYW5kIHRoZSBtZW1iZXJzIG9mIHRoZSBub24tYmFnZ2dhZ2UgY29sbGVjdGlvbnMuXG4gKlxuICogVE9ETyBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvcHVsbC81ODc1IDpcbiAqIEltcGxlbWVudCBkZXZlbG9wbWVudC10aW1lIGluc3RydW1lbnRhdGlvbiB0byBkZXRlY3Qgd2hlblxuICogYHByb3ZpZGVgIHZpb2xhdGVzIHRoZSBhYm92ZSBwcmVzY3JpcHRpb24sIGFuZCBpcyBjYWxsZWQgbW9yZVxuICogdGhhbiBvbmUgaW4gdGhlIHNhbWUgdmF0IGluY2FybmF0aW9uIHdpdGggdGhlIHNhbWVcbiAqIGJhZ2dhZ2Usa2V5IHBhaXIuXG4gKlxuICogQHRlbXBsYXRlIEssVlxuICogQHBhcmFtIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtLfSBrZXlcbiAqIEBwYXJhbSB7KGtleTogSykgPT4gVn0gbWFrZVZhbHVlXG4gKiBAcmV0dXJucyB7Vn1cbiAqL1xuY29uc3QgICAgICAgIHByb3ZpZGU9cHJvdmlkZUxhenk7JGjigI1fb25jZS5wcm92aWRlKHByb3ZpZGUpO1xuXG5jb25zdCAgICAgICAgcHJvdmlkZUR1cmFibGVNYXBTdG9yZT0oYmFnZ2FnZSxuYW1lKT0+XG5wcm92aWRlKGJhZ2dhZ2UsbmFtZSwoKT0+bWFrZVNjYWxhckJpZ01hcFN0b3JlKG5hbWUse2R1cmFibGU6dHJ1ZX0pKTskaOKAjV9vbmNlLnByb3ZpZGVEdXJhYmxlTWFwU3RvcmUocHJvdmlkZUR1cmFibGVNYXBTdG9yZSk7XG5oYXJkZW4ocHJvdmlkZUR1cmFibGVNYXBTdG9yZSk7XG5cbmNvbnN0ICAgICAgICBwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZT0oYmFnZ2FnZSxuYW1lKT0+XG5wcm92aWRlKGJhZ2dhZ2UsbmFtZSwoKT0+XG5tYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlKG5hbWUse2R1cmFibGU6dHJ1ZX0pKTskaOKAjV9vbmNlLnByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlKHByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlKTtcblxuaGFyZGVuKHByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlKTtcblxuY29uc3QgICAgICAgIHByb3ZpZGVEdXJhYmxlU2V0U3RvcmU9KGJhZ2dhZ2UsbmFtZSk9PlxucHJvdmlkZShiYWdnYWdlLG5hbWUsKCk9Pm1ha2VTY2FsYXJCaWdTZXRTdG9yZShuYW1lLHtkdXJhYmxlOnRydWV9KSk7JGjigI1fb25jZS5wcm92aWRlRHVyYWJsZVNldFN0b3JlKHByb3ZpZGVEdXJhYmxlU2V0U3RvcmUpO1xuaGFyZGVuKHByb3ZpZGVEdXJhYmxlU2V0U3RvcmUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7Ik0iOlsiTSIsZmFsc2VdLCJtYWtlU2NhbGFyTWFwU3RvcmUiOlsibWFrZVNjYWxhck1hcFN0b3JlIixmYWxzZV0sIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmUiOlsibWFrZVNjYWxhcldlYWtNYXBTdG9yZSIsZmFsc2VdLCJtYWtlU2NhbGFyU2V0U3RvcmUiOlsibWFrZVNjYWxhclNldFN0b3JlIixmYWxzZV0sIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmUiOlsibWFrZVNjYWxhcldlYWtTZXRTdG9yZSIsZmFsc2VdfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZmluZUtpbmQiOlsiZGVmaW5lS2luZCJdLCJkZWZpbmVLaW5kTXVsdGkiOlsiZGVmaW5lS2luZE11bHRpIl0sImRlZmluZUR1cmFibGVLaW5kIjpbImRlZmluZUR1cmFibGVLaW5kIl0sImRlZmluZUR1cmFibGVLaW5kTXVsdGkiOlsiZGVmaW5lRHVyYWJsZUtpbmRNdWx0aSJdLCJtYWtlS2luZEhhbmRsZSI6WyJtYWtlS2luZEhhbmRsZSJdLCJwcm92aWRlUHJvbWlzZVdhdGNoZXIiOlsicHJvdmlkZVByb21pc2VXYXRjaGVyIl0sIndhdGNoUHJvbWlzZSI6WyJ3YXRjaFByb21pc2UiXSwibWFrZVNjYWxhckJpZ01hcFN0b3JlIjpbIm1ha2VTY2FsYXJCaWdNYXBTdG9yZSJdLCJtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlIjpbIm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUiXSwibWFrZVNjYWxhckJpZ1NldFN0b3JlIjpbIm1ha2VTY2FsYXJCaWdTZXRTdG9yZSJdLCJtYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlIjpbIm1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUiXSwiY2FuQmVEdXJhYmxlIjpbImNhbkJlRHVyYWJsZSJdLCJwaWNrRmFjZXQiOlsicGlja0ZhY2V0Il0sInBhcnRpYWxBc3NpZ24iOlsicGFydGlhbEFzc2lnbiJdLCJwcm92aWRlIjpbInByb3ZpZGUiXSwicHJvdmlkZUR1cmFibGVNYXBTdG9yZSI6WyJwcm92aWRlRHVyYWJsZU1hcFN0b3JlIl0sInByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlIjpbInByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlIl0sInByb3ZpZGVEdXJhYmxlU2V0U3RvcmUiOlsicHJvdmlkZUR1cmFibGVTZXRTdG9yZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB8VWrpmwMAAJsDAAAfAAAAQGFnb3JpYy96b2UtdjAuMjUuMy9leHBvcnRlZC5qc3siaW1wb3J0cyI6WyIuL3NyYy9jb250cmFjdEZhY2V0L3R5cGVzLmpzIiwiLi9zcmMvY29udHJhY3RTdXBwb3J0L3R5cGVzLmpzIiwiLi9zcmMvY29udHJhY3RzL2V4cG9ydGVkLmpzIiwiLi9zcmMvdHlwZXMuanMiLCIuL3NyYy96b2VTZXJ2aWNlL3R5cGVzLmpzIiwiLi90b29scy90eXBlcy5qcyIsIkBhZ29yaWMvZXJ0cC9leHBvcnRlZC5qcyIsIkBhZ29yaWMvbm90aWZpZXIvZXhwb3J0ZWQuanMiLCJAYWdvcmljL3N0b3JlL2V4cG9ydGVkLmpzIiwiQGFnb3JpYy9zd2luZ3NldC12YXQvZXhwb3J0ZWQuanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9zcmMvY29udHJhY3RGYWNldC90eXBlcy5qc1wiLCBbXV0sW1wiLi9zcmMvem9lU2VydmljZS90eXBlcy5qc1wiLCBbXV0sW1wiLi9zcmMvY29udHJhY3RTdXBwb3J0L3R5cGVzLmpzXCIsIFtdXSxbXCIuL3NyYy9jb250cmFjdHMvZXhwb3J0ZWQuanNcIiwgW11dLFtcIi4vc3JjL3R5cGVzLmpzXCIsIFtdXSxbXCIuL3Rvb2xzL3R5cGVzLmpzXCIsIFtdXSxbXCJAYWdvcmljL25vdGlmaWVyL2V4cG9ydGVkLmpzXCIsIFtdXSxbXCJAYWdvcmljL2VydHAvZXhwb3J0ZWQuanNcIiwgW11dLFtcIkBhZ29yaWMvc3RvcmUvZXhwb3J0ZWQuanNcIiwgW11dLFtcIkBhZ29yaWMvc3dpbmdzZXQtdmF0L2V4cG9ydGVkLmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACGw0MSYyUAAGMlAAAuAAAAQGFnb3JpYy96b2UtdjAuMjUuMy9zcmMvY29udHJhY3RGYWNldC90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qLyA8cmVmZXJlbmNlIHR5cGVzPVwic2VzXCIvPiovXG5cbi8qIFhYWCBjYW4gYmUgdGlnaHRlciB0aGFuICdhbnknKi9cbi8qKlxuICogQHR5cGVkZWYge2FueX0gQ29tcGxldGlvblxuICogQW55IHBhc3NhYmxlIG5vbi10aGVuYWJsZS4gT2Z0ZW4gYW4gZXhwbGFuYXRvcnkgc3RyaW5nLlxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFpDRk1ha2VFbXB0eVNlYXRLaXRcbiAqIEBwYXJhbSB7RXhpdFJ1bGU9fSBleGl0XG4gKiBAcmV0dXJucyB7WmNmU2VhdEtpdH1cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7b2JqZWN0fSBbQ1Q9UmVjb3JkPHN0cmluZywgdW5rbm93bj5dIENvbnRyYWN0J3MgY3VzdG9tIHRlcm1zXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBaQ0YgWm9lIENvbnRyYWN0IEZhY2V0XG4gKlxuICogVGhlIFpvZSBpbnRlcmZhY2Ugc3BlY2lmaWMgdG8gYSBjb250cmFjdCBpbnN0YW5jZS4gVGhlIFpvZSBDb250cmFjdFxuICogRmFjZXQgaXMgYW4gQVBJIG9iamVjdCB1c2VkIGJ5IHJ1bm5pbmcgY29udHJhY3QgaW5zdGFuY2VzIHRvIGFjY2Vzc1xuICogdGhlIFpvZSBzdGF0ZSBmb3IgdGhhdCBpbnN0YW5jZS4gVGhlIFpvZSBDb250cmFjdCBGYWNldCBpcyBhY2Nlc3NlZFxuICogc3luY2hyb25vdXNseSBmcm9tIHdpdGhpbiB0aGUgY29udHJhY3QsIGFuZCB1c3VhbGx5IGlzIHJlZmVycmVkIHRvXG4gKiBpbiBjb2RlIGFzIHpjZi5cbiAqXG4gKiBAcHJvcGVydHkge1JlYWxsb2NhdGV9IHJlYWxsb2NhdGUgLSByZWFsbG9jYXRlIGFtb3VudHMgYW1vbmcgc2VhdHMuXG4gKiBEZXByZWNhdGVkOiBVc2UgYXRvbWljUmVhcnJhbmdlIGluc3RlYWQuXG4gKiBAcHJvcGVydHkgeyhrZXl3b3JkOiBLZXl3b3JkKSA9PiB2b2lkfSBhc3NlcnRVbmlxdWVLZXl3b3JkIC0gY2hlY2tcbiAqIHdoZXRoZXIgYSBrZXl3b3JkIGlzIHZhbGlkIGFuZCB1bmlxdWUgYW5kIGNvdWxkIGJlIGFkZGVkIGluXG4gKiBgc2F2ZUlzc3VlcmBcbiAqIEBwcm9wZXJ0eSB7U2F2ZUlzc3Vlcn0gc2F2ZUlzc3VlciAtIHNhdmUgYW4gaXNzdWVyIHRvIFpDRiBhbmQgWm9lXG4gKiBhbmQgZ2V0IHRoZSBBbW91bnRNYXRoIGFuZCBicmFuZCBzeW5jaHJvbm91c2x5IGFjY2Vzc2libGUgYWZ0ZXJcbiAqIHNhdmluZ1xuICogQHByb3BlcnR5IHtNYWtlSW52aXRhdGlvbn0gbWFrZUludml0YXRpb25cbiAqIEBwcm9wZXJ0eSB7KGNvbXBsZXRpb246IENvbXBsZXRpb24pID0+IHZvaWR9IHNodXRkb3duXG4gKiBAcHJvcGVydHkge1NodXRkb3duV2l0aEZhaWx1cmV9IHNodXRkb3duV2l0aEZhaWx1cmVcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gRVJlZjxab2VTZXJ2aWNlPn0gZ2V0Wm9lU2VydmljZVxuICogQHByb3BlcnR5IHsoKSA9PiBJc3N1ZXI8J3NldCc+fSBnZXRJbnZpdGF0aW9uSXNzdWVyXG4gKiBAcHJvcGVydHkgeygpID0+IFN0YW5kYXJkVGVybXMgJiBDVH0gZ2V0VGVybXNcbiAqIEBwcm9wZXJ0eSB7PEsgZXh0ZW5kcyBBc3NldEtpbmQ+KGlzc3VlcjogSXNzdWVyPEs+KSA9PiBCcmFuZDxLPn0gZ2V0QnJhbmRGb3JJc3N1ZXJcbiAqIEBwcm9wZXJ0eSB7PEsgZXh0ZW5kcyBBc3NldEtpbmQ+KGJyYW5kOiBCcmFuZDxLPikgPT4gSXNzdWVyPEs+fSBnZXRJc3N1ZXJGb3JCcmFuZFxuICogQHByb3BlcnR5IHtHZXRBc3NldEtpbmRCeUJyYW5kfSBnZXRBc3NldEtpbmRcbiAqIEBwcm9wZXJ0eSB7PEsgZXh0ZW5kcyBBc3NldEtpbmQgPSAnbmF0Jz4oa2V5d29yZDogS2V5d29yZCwgYXNzZXRLaW5kPzogSywgZGlzcGxheUluZm8/OiBBZGRpdGlvbmFsRGlzcGxheUluZm8pID0+IFByb21pc2U8WkNGTWludDxLPj59IG1ha2VaQ0ZNaW50XG4gKiBAcHJvcGVydHkge1pDRlJlZ2lzdGVyRmVlTWludH0gcmVnaXN0ZXJGZWVNaW50XG4gKiBAcHJvcGVydHkge1pDRk1ha2VFbXB0eVNlYXRLaXR9IG1ha2VFbXB0eVNlYXRLaXRcbiAqIEBwcm9wZXJ0eSB7U2V0VGVzdEppZ30gc2V0VGVzdEppZ1xuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPHZvaWQ+fSBzdG9wQWNjZXB0aW5nT2ZmZXJzXG4gKiBAcHJvcGVydHkgeyhzdHJpbmdzOiBBcnJheTxzdHJpbmc+KSA9PiB2b2lkfSBzZXRPZmZlckZpbHRlclxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPEFycmF5PHN0cmluZz4+fSBnZXRPZmZlckZpbHRlclxuICogQHByb3BlcnR5IHsoKSA9PiBJbnN0YW5jZX0gZ2V0SW5zdGFuY2VcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoc2VhdDE6IFpDRlNlYXQsIHNlYXQyOiBaQ0ZTZWF0LCAuLi5zZWF0UmVzdDpcbiAqIEFycmF5PFpDRlNlYXQ+KSA9PiB2b2lkfSBSZWFsbG9jYXRlXG4gKlxuICogVGhlIGNvbnRyYWN0IGNhbiByZWFsbG9jYXRlIG92ZXIgc2VhdHMsIHdoaWNoIGNvbW1pdHMgdGhlIHN0YWdlZFxuICogYWxsb2NhdGlvbiBmb3IgZWFjaCBzZWF0LiBPbiBjb21taXQsIHRoZSBzdGFnZWQgYWxsb2NhdGlvbiBiZWNvbWVzXG4gKiB0aGUgY3VycmVudCBhbGxvY2F0aW9uIGFuZCB0aGUgc3RhZ2VkIGFsbG9jYXRpb24gaXMgZGVsZXRlZC5cbiAqXG4gKiBUaGUgcmVhbGxvY2F0aW9uIHdpbGwgb25seSBzdWNjZWVkIGlmIHRoZSByZWFsbG9jYXRpb24gMSkgY29uc2VydmVzXG4gKiByaWdodHMgKHRoZSBhbW91bnRzIHNwZWNpZmllZCBoYXZlIHRoZSBzYW1lIHRvdGFsIHZhbHVlIGFzIHRoZVxuICogY3VycmVudCB0b3RhbCBhbW91bnQpLCBhbmQgMikgaXMgJ29mZmVyLXNhZmUnIGZvciBhbGwgcGFydGllc1xuICogaW52b2x2ZWQuIEFsbCBzZWF0cyB0aGF0IGhhdmUgc3RhZ2VkIGFsbG9jYXRpb25zIG11c3QgYmUgaW5jbHVkZWRcbiAqIGFzIGFyZ3VtZW50cyB0byBgcmVhbGxvY2F0ZWAsIG9yIGFuIGVycm9yIGlzIHRocm93bi4gQWRkaXRpb25hbGx5LFxuICogYW4gZXJyb3IgaXMgdGhyb3duIGlmIGFueSBzZWF0cyBpbmNsdWRlZCBpbiBgcmVhbGxvY2F0ZWAgZG8gbm90XG4gKiBoYXZlIGEgc3RhZ2VkIGFsbG9jYXRpb24uXG4gKlxuICogVGhlIHJlYWxsb2NhdGlvbiBpcyBwYXJ0aWFsLCBtZWFuaW5nIHRoYXQgaXQgYXBwbGllcyBvbmx5IHRvIHRoZVxuICogc2VhdHMgcGFzc2VkIGluIGFzIGFyZ3VtZW50cy4gQnkgaW5kdWN0aW9uLCBpZiByaWdodHMgY29uc2VydmF0aW9uXG4gKiBhbmQgb2ZmZXIgc2FmZXR5IGhvbGQgYmVmb3JlLCB0aGV5IHdpbGwgaG9sZCBhZnRlciBhIHNhZmVcbiAqIHJlYWxsb2NhdGlvbiwgZXZlbiB0aG91Z2ggd2Ugb25seSByZS12YWxpZGF0ZSBmb3IgdGhlIHNlYXRzIHdob3NlXG4gKiBhbGxvY2F0aW9ucyB3aWxsIGNoYW5nZS4gU2luY2UgcmlnaHRzIGFyZSBjb25zZXJ2ZWQgZm9yIHRoZSBjaGFuZ2UsXG4gKiBvdmVyYWxsIHJpZ2h0cyB3aWxsIGJlIHVuY2hhbmdlZCwgYW5kIGEgcmVhbGxvY2F0aW9uIGNhbiBvbmx5XG4gKiBlZmZlY3Qgb2ZmZXIgc2FmZXR5IGZvciBzZWF0cyB3aG9zZSBhbGxvY2F0aW9ucyBjaGFuZ2UuXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgU2F2ZUlzc3VlclxuICpcbiAqIEluZm9ybXMgWm9lIGFib3V0IGFuIGlzc3VlciBhbmQgcmV0dXJucyBhIHByb21pc2UgZm9yIGFja25vd2xlZGdpbmdcbiAqIHdoZW4gdGhlIGlzc3VlciBpcyBhZGRlZCBhbmQgcmVhZHkuXG4gKlxuICogQHBhcmFtIHtFUmVmPElzc3Vlcj59IGlzc3VlclAgUHJvbWlzZSBmb3IgaXNzdWVyXG4gKiBAcGFyYW0ge0tleXdvcmR9IGtleXdvcmQgS2V5d29yZCBmb3IgYWRkZWQgaXNzdWVyXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxJc3N1ZXJSZWNvcmQ8Kj4+fSBJc3N1ZXIgaXMgYWRkZWQgYW5kIHJlYWR5XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7PFJlc3VsdD4oXG4gKiAgIG9mZmVySGFuZGxlcjogT2ZmZXJIYW5kbGVyPFJlc3VsdD4sXG4gKiAgIGRlc2NyaXB0aW9uOiBzdHJpbmcsXG4gKiAgIGN1c3RvbVByb3BlcnRpZXM/OiBvYmplY3QsXG4gKiAgIHByb3Bvc2FsU2hhcGU/OiBQYXR0ZXJuLFxuICogKSA9PiBQcm9taXNlPEludml0YXRpb248QXdhaXRlZDxSZXN1bHQ+Pj5cbiAqIH0gTWFrZUludml0YXRpb25cbiAqXG4gKiBNYWtlIGEgY3JlZGlibGUgWm9lIGludml0YXRpb24gZm9yIGEgcGFydGljdWxhciBzbWFydCBjb250cmFjdFxuICogaW5kaWNhdGVkIGJ5IHRoZSBgaW5zdGFuY2VgIGluIHRoZSBkZXRhaWxzIG9mIHRoZSBpbnZpdGF0aW9uLiBab2VcbiAqIGFsc28gcHV0cyB0aGUgYGluc3RhbGxhdGlvbmAgYW5kIGEgdW5pcXVlIGBoYW5kbGVgIGluIHRoZSBkZXRhaWxzXG4gKiBvZiB0aGUgaW52aXRhdGlvbi4gVGhlIGNvbnRyYWN0IG11c3QgcHJvdmlkZSBhIGBkZXNjcmlwdGlvbmAgZm9yXG4gKiB0aGUgaW52aXRhdGlvbiBhbmQgc2hvdWxkIGluY2x1ZGUgd2hhdGV2ZXIgaW5mb3JtYXRpb24gaXMgbmVjZXNzYXJ5XG4gKiBmb3IgYSBwb3RlbnRpYWwgYnV5ZXIgb2YgdGhlIGludml0YXRpb24gdG8ga25vdyB3aGF0IHRoZXkgYXJlXG4gKiBnZXR0aW5nIGluIHRoZSBgY3VzdG9tUHJvcGVydGllc2AuIGBjdXN0b21Qcm9wZXJ0aWVzYCB3aWxsIGJlXG4gKiBwbGFjZWQgaW4gdGhlIGRldGFpbHMgb2YgdGhlIGludml0YXRpb24uXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgWkNGUmVnaXN0ZXJGZWVNaW50XG4gKiBAcGFyYW0ge0tleXdvcmR9IGtleXdvcmRcbiAqIEBwYXJhbSB7RmVlTWludEFjY2Vzc30gYWxsZWdlZEZlZU1pbnRBY2Nlc3MgLSBhbiBvYmplY3QgdGhhdFxuICogcHVycG9ydHMgdG8gYmUgdGhlIG9iamVjdCB0aGF0IGdyYW50cyBhY2Nlc3MgdG8gdGhlIGZlZSBtaW50XG4gKiBAcmV0dXJucyB7UHJvbWlzZTxaQ0ZNaW50PCduYXQnPj59XG4gKi9cblxuLyoqXG4gKiBQcm92aWRlIGEgamlnIG9iamVjdCBmb3IgdGVzdGluZyBwdXJwb3NlcyBvbmx5LlxuICpcbiAqIFRoZSBjb250cmFjdCBjb2RlIHByb3ZpZGVzIGEgY2FsbGJhY2sgd2hvc2UgcmV0dXJuIHJlc3VsdCB3aWxsXG4gKiBiZSBtYWRlIGF2YWlsYWJsZSB0byB0aGUgdGVzdCB0aGF0IHN0YXJ0ZWQgdGhpcyBjb250cmFjdC4gVGhlXG4gKiBzdXBwbGllZCBjYWxsYmFjayB3aWxsIG9ubHkgYmUgY2FsbGVkIGluIGEgdGVzdGluZyBjb250ZXh0LFxuICogbmV2ZXIgaW4gcHJvZHVjdGlvbjsgaS5lLiwgaXQgaXMgb25seSBjYWxsZWQgaWYgYHRlc3RKaWdTZXR0ZXJgXG4gKiB3YXMgc3VwcGxpZWQuXG4gKlxuICogSWYgbm8sIGB0ZXN0Rm5gIGlzIHN1cHBsaWVkLCB0aGVuIGFuIGVtcHR5IGppZyB3aWxsIGJlIHVzZWQuXG4gKiBBbiBhZGRpdGlvbmFsIGB6Y2ZgIHByb3BlcnR5IHNldCB0byB0aGUgY3VycmVudCBDb250cmFjdEZhY2V0XG4gKiB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSByZXR1cm5lZCBqaWcgb2JqZWN0IChvdmVycmlkaW5nIGFueVxuICogcHJvdmlkZWQgYnkgdGhlIGB0ZXN0Rm5gKS5cbiAqXG4gKiBAY2FsbGJhY2sgU2V0VGVzdEppZ1xuICogQHBhcmFtIHsoKSA9PiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gdGVzdEZuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBaQ0ZNaW50TWludEdhaW5zXG4gKiBAcGFyYW0ge0Ftb3VudEtleXdvcmRSZWNvcmR9IGdhaW5zXG4gKiBAcGFyYW0ge1pDRlNlYXQ9fSB6Y2ZTZWF0XG4gKiBAcmV0dXJucyB7WkNGU2VhdH1cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBaQ0ZNaW50XG4gKiBAcHJvcGVydHkgeygpID0+IElzc3VlclJlY29yZDxLPn0gZ2V0SXNzdWVyUmVjb3JkXG4gKiBAcHJvcGVydHkge1pDRk1pbnRNaW50R2FpbnN9IG1pbnRHYWluc1xuICogQWxsIHRoZSBhbW91bnRzIGluIGdhaW5zIG11c3QgYmUgb2YgdGhpcyBaQ0ZNaW50J3MgYnJhbmQuXG4gKiBUaGUgZ2FpbnMnIGtleXdvcmRzIGFyZSBpbiB0aGUgbmFtZXNwYWNlIG9mIHRoYXQgc2VhdC5cbiAqIEFkZCB0aGUgZ2FpbnMgdG8gdGhhdCBzZWF0J3MgYWxsb2NhdGlvbi5cbiAqIFRoZSByZXN1bHRpbmcgc3RhdGUgbXVzdCBiZSBvZmZlciBzYWZlLiAoQ3VycmVudGx5LCBpbmNyZWFzaW5nIGFzc2V0cyBjYW5cbiAqIG5ldmVyIHZpb2xhdGUgb2ZmZXIgc2FmZXR5IGFueXdheS4pXG4gKlxuICogTWludCB0aGF0IGFtb3VudCBvZiBhc3NldHMgaW50byB0aGUgcG9vbGVkIHB1cnNlLlxuICogSWYgYSBzZWF0IGlzIHByb3ZpZGVkLCBpdCBpcyByZXR1cm5lZC4gT3RoZXJ3aXNlIGEgbmV3IHNlYXQgaXNcbiAqIHJldHVybmVkLlxuICogVE9ETyB1bmltcGxlbWVudGVkXG4gKiBUaGlzIGNyZWF0aW9uLW9uLWRlbWFuZCBpcyBub3QgeWV0IGltcGxlbWVudGVkLlxuICpcbiAqIEBwcm9wZXJ0eSB7KGxvc3NlczogQW1vdW50S2V5d29yZFJlY29yZCxcbiAqICAgICAgICAgICAgIHpjZlNlYXQ6IFpDRlNlYXQsXG4gKiAgICAgICAgICAgICkgPT4gdm9pZH0gYnVybkxvc3Nlc1xuICogQWxsIHRoZSBhbW91bnRzIGluIGxvc3NlcyBtdXN0IGJlIG9mIHRoaXMgWkNGTWludCdzIGJyYW5kLlxuICogVGhlIGxvc3Nlcycga2V5d29yZHMgYXJlIGluIHRoZSBuYW1lc3BhY2Ugb2YgdGhhdCBzZWF0LlxuICogU3VidHJhY3QgbG9zc2VzIGZyb20gdGhhdCBzZWF0J3MgYWxsb2NhdGlvbi5cbiAqIFRoZSByZXN1bHRpbmcgc3RhdGUgbXVzdCBiZSBvZmZlciBzYWZlLlxuICpcbiAqIEJ1cm4gdGhhdCBhbW91bnQgb2YgYXNzZXRzIGZyb20gdGhlIHBvb2xlZCBwdXJzZS5cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBaQ0ZTZWF0RmFpbFxuICpcbiAqIGZhaWwgY2FsbGVkIHdpdGggdGhlIHJlYXNvbiBmb3IgdGhpcyBmYWlsdXJlLCB3aGVyZSByZWFzb24gaXNcbiAqIG5vcm1hbGx5IGFuIGluc3RhbmNlb2YgRXJyb3IuXG4gKiBAcGFyYW0ge0Vycm9yfSByZWFzb25cbiAqIEByZXR1cm5zIHtFcnJvcn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBaQ0ZHZXRBbW91bnRBbGxvY2F0ZWRcbiAqIFRoZSBicmFuZCBpcyB1c2VkIGZvciBmaWxsaW5nIGluIGFuIGVtcHR5IGFtb3VudCBpZiB0aGUgYGtleXdvcmRgXG4gKiBpcyBub3QgcHJlc2VudCBpbiB0aGUgYWxsb2NhdGlvblxuICogQHBhcmFtIHtLZXl3b3JkfSBrZXl3b3JkXG4gKiBAcGFyYW0ge0JyYW5kPX0gYnJhbmRcbiAqIEByZXR1cm5zIHtBbW91bnQ8YW55Pn1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFpDRlNlYXRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gdm9pZH0gZXhpdFxuICogQHByb3BlcnR5IHtaQ0ZTZWF0RmFpbH0gZmFpbFxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPFN1YnNjcmliZXI8QWxsb2NhdGlvbj4+fSBnZXRTdWJzY3JpYmVyXG4gKiBAcHJvcGVydHkgeygpID0+IGJvb2xlYW59IGhhc0V4aXRlZFxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9wb3NhbFJlY29yZH0gZ2V0UHJvcG9zYWxcbiAqIEBwcm9wZXJ0eSB7WkNGR2V0QW1vdW50QWxsb2NhdGVkfSBnZXRBbW91bnRBbGxvY2F0ZWRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gQWxsb2NhdGlvbn0gZ2V0Q3VycmVudEFsbG9jYXRpb25cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gQWxsb2NhdGlvbn0gZ2V0U3RhZ2VkQWxsb2NhdGlvblxuICogRGVwcmVjYXRlZDogVXNlIGF0b21pY1JlYXJyYW5nZSBpbnN0ZWFkXG4gKiBAcHJvcGVydHkgeygpID0+IGJvb2xlYW59IGhhc1N0YWdlZEFsbG9jYXRpb25cbiAqIERlcHJlY2F0ZWQ6IFVzZSBhdG9taWNSZWFycmFuZ2UgaW5zdGVhZFxuICogQHByb3BlcnR5IHsobmV3QWxsb2NhdGlvbjogQWxsb2NhdGlvbikgPT4gYm9vbGVhbn0gaXNPZmZlclNhZmVcbiAqIEBwcm9wZXJ0eSB7KGFtb3VudEtleXdvcmRSZWNvcmQ6IEFtb3VudEtleXdvcmRSZWNvcmQpID0+IEFtb3VudEtleXdvcmRSZWNvcmR9IGluY3JlbWVudEJ5XG4gKiBEZXByZWNhdGVkOiBVc2UgYXRvbWljUmVhcnJhbmdlIGluc3RlYWRcbiAqIEBwcm9wZXJ0eSB7KGFtb3VudEtleXdvcmRSZWNvcmQ6IEFtb3VudEtleXdvcmRSZWNvcmQpID0+IEFtb3VudEtleXdvcmRSZWNvcmR9IGRlY3JlbWVudEJ5XG4gKiBEZXByZWNhdGVkOiBVc2UgYXRvbWljUmVhcnJhbmdlIGluc3RlYWRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gdm9pZH0gY2xlYXJcbiAqIERlcHJlY2F0ZWQ6IFVzZSBhdG9taWNSZWFycmFuZ2UgaW5zdGVhZFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge3sgemNmU2VhdDogWkNGU2VhdCwgdXNlclNlYXQ6IEVSZWY8VXNlclNlYXQ+fX0gWmNmU2VhdEtpdFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtvYmplY3R9IE9SIE9mZmVyIHJlc3VsdHNcbiAqIEB0eXBlZGVmIHsoc2VhdDogWkNGU2VhdCwgb2ZmZXJBcmdzPzogb2JqZWN0KSA9PiBPUn0gSGFuZGxlT2ZmZXJcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7b2JqZWN0fSBbT1I9dW5rbm93bl0gT2ZmZXIgcmVzdWx0c1xuICogQHR5cGVkZWYge0hhbmRsZU9mZmVyPE9SPiB8IHsgaGFuZGxlOiBIYW5kbGVPZmZlcjxPUj4gfX0gT2ZmZXJIYW5kbGVyXG4gKi9cblxuLyoqXG4gKiBBUEkgZm9yIGEgY29udHJhY3Qgc3RhcnQgZnVuY3Rpb24uXG4gKlxuICogQ0FWRUFUOiBhc3N1bWVzIHN5bmNocm9ub3VzXG4gKlxuICogQGRlcHJlY2F0ZWQgZGVmaW5lIGZ1bmN0aW9uIHNpZ25hdHVyZSBkaXJlY3RseVxuICpcbiAqIEB0ZW1wbGF0ZSB7b2JqZWN0fSBbUEY9YW55XSBQdWJsaWMgZmFjZXRcbiAqIEB0ZW1wbGF0ZSB7b2JqZWN0fSBbQ0Y9YW55XSBDcmVhdG9yIGZhY2V0XG4gKiBAdGVtcGxhdGUge29iamVjdH0gW0NUPWFueV0gQ3VzdG9tIHRlcm1zXG4gKiBAdGVtcGxhdGUge29iamVjdH0gW1BBPWFueV0gUHJpdmF0ZSBhcmdzXG4gKiBAY2FsbGJhY2sgQ29udHJhY3RTdGFydEZuXG4gKiBAcGFyYW0ge1pDRjxDVD59IHpjZlxuICogQHBhcmFtIHtQQX0gcHJpdmF0ZUFyZ3NcbiAqIEByZXR1cm5zIHtDb250cmFjdFN0YXJ0Rm5SZXN1bHQ8UEYsIENGPn1cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBQRiBQdWJsaWMgZmFjZXRcbiAqIEB0ZW1wbGF0ZSBDRiBDcmVhdG9yIGZhY2V0XG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBDb250cmFjdFN0YXJ0Rm5SZXN1bHRcbiAqIEBwcm9wZXJ0eSB7UEZ9IHB1YmxpY0ZhY2V0XG4gKiBAcHJvcGVydHkge0NGfSBjcmVhdG9yRmFjZXRcbiAqIEBwcm9wZXJ0eSB7UHJvbWlzZTxJbnZpdGF0aW9uPj19IFtjcmVhdG9ySW52aXRhdGlvbl1cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBTXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vem9lU2VydmljZS91dGlscycpLkNvbnRyYWN0T2Y8Uz59IENvbnRyYWN0T2ZcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi96b2VTZXJ2aWNlL3V0aWxzJykuQWRtaW5GYWNldH0gQWRtaW5GYWNldFxuICovXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMruLwmmCwAApgsAADAAAABAYWdvcmljL3pvZS12MC4yNS4zL3NyYy9jb250cmFjdFN1cHBvcnQvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFNlYXRHYWluc0xvc3Nlc1JlY29yZFxuICogQHByb3BlcnR5IHtaQ0ZTZWF0fSBzZWF0XG4gKiBAcHJvcGVydHkge0Ftb3VudEtleXdvcmRSZWNvcmR9IGdhaW5zIC0gd2hhdCB0aGUgc2VhdCB3aWxsXG4gKiBnYWluIGFzIGEgcmVzdWx0IG9mIHRoaXMgdHJhZGVcbiAqIEBwcm9wZXJ0eSB7QW1vdW50S2V5d29yZFJlY29yZD19IGxvc3NlcyAtIHdoYXQgdGhlIHNlYXQgd2lsbFxuICogZ2l2ZSB1cCBhcyBhIHJlc3VsdCBvZiB0aGlzIHRyYWRlLiBMb3NzZXMgaXMgb3B0aW9uYWwsIGJ1dCBjYW5cbiAqIG9ubHkgYmUgb21pdHRlZCBpZiB0aGUga2V5d29yZHMgZm9yIGJvdGggc2VhdHMgYXJlIHRoZSBzYW1lLlxuICogSWYgbG9zc2VzIGlzIG5vdCBkZWZpbmVkLCB0aGUgZ2FpbnMgb2YgdGhlIG90aGVyIHNlYXQgaXNcbiAqIHN1YnRyYWN0ZWQuXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgU3dhcFxuICogSWYgdHdvIHNlYXRzIGNhbiBzYXRpc2Z5IGVhY2ggb3RoZXIncyB3YW50cywgdHJhZGUgZW5vdWdoIHRvXG4gKiBzYXRpc2Z5IHRoZSB3YW50cyBvZiBib3RoIHNlYXRzIGFuZCBleGl0IGJvdGggc2VhdHMuXG4gKlxuICogVGhlIHN1cnBsdXMgcmVtYWlucyB3aXRoIHRoZSBvcmlnaW5hbCBzZWF0LiBGb3IgZXhhbXBsZSBpZiBzZWF0IEFcbiAqIGdpdmVzIDUgbW9vbGEgYW5kIHNlYXQgQiBvbmx5IHdhbnRzIDMgbW9vbGEsIHNlYXQgQSByZXRhaW5zIDJcbiAqIG1vb2xhLlxuICpcbiAqIElmIHRoZSBzd2FwIGZhaWxzLCBubyBhc3NldHMgYXJlIHRyYW5zZmVycmVkLCBib3RoIHNlYXRzIHdpbGwgZmFpbCxcbiAqIGFuZCB0aGUgZnVuY3Rpb24gdGhyb3dzLlxuICpcbiAqIFRoZSBrZXl3b3JkcyBmb3IgYm90aCBzZWF0cyBtdXN0IG1hdGNoLlxuICpcbiAqIEBwYXJhbSB7WkNGfSB6Y2ZcbiAqIEBwYXJhbSB7WkNGU2VhdH0gbGVmdFNlYXRcbiAqIEBwYXJhbSB7WkNGU2VhdH0gcmlnaHRTZWF0XG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFN3YXBFeGFjdFxuICpcbiAqIFN3YXAgc3VjaCB0aGF0IGJvdGggc2VhdHMgZ2FpbiB3aGF0IHRoZXkgd2FudCBhbmQgbG9zZSBldmVyeXRoaW5nXG4gKiB0aGF0IHRoZXkgZ2F2ZS4gT25seSBnb29kIGZvciBleGFjdCBhbmQgZW50aXJlIHN3YXBzIHdoZXJlIGVhY2hcbiAqIHNlYXQgd2FudHMgZXZlcnl0aGluZyB0aGF0IHRoZSBvdGhlciBzZWF0IGhhcy4gVGhlIGJlbmVmaXQgb2YgdXNpbmdcbiAqIHRoaXMgbWV0aG9kIGlzIHRoYXQgdGhlIGtleXdvcmRzIG9mIGVhY2ggc2VhdCBkbyBub3QgbWF0dGVyLlxuICpcbiAqIElmIHRoZSBzd2FwIGZhaWxzLCBubyBhc3NldHMgYXJlIHRyYW5zZmVycmVkLCBib3RoIHNlYXRzIHdpbGwgZmFpbCxcbiAqIGFuZCB0aGUgZnVuY3Rpb24gdGhyb3dzLlxuICpcbiAqIEBwYXJhbSB7WkNGfSB6Y2ZcbiAqIEBwYXJhbSB7WkNGU2VhdH0gbGVmdFNlYXRcbiAqIEBwYXJhbSB7WkNGU2VhdH0gcmlnaHRTZWF0XG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1JlY29yZDxLZXl3b3JkLEtleXdvcmQ+fSBLZXl3b3JkS2V5d29yZFJlY29yZFxuICpcbiAqIEEgbWFwcGluZyBvZiBrZXl3b3JkcyB0byBrZXl3b3Jkcy5cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBSZXZlcnNlXG4gKlxuICogR2l2ZW4gYSBtYXBwaW5nIG9mIGtleXdvcmRzIHRvIGtleXdvcmRzLCBpbnZlcnQgdGhlIGtleXMgYW5kXG4gKiB2YWx1ZXMuIFRoaXMgaXMgdXNlZCB0byBtYXAgdGhlIG9mZmVycyBtYWRlIHRvIGFub3RoZXIgY29udHJhY3RcbiAqIGJhY2sgdG8gdGhlIGtleXdvcmRzIHVzZWQgaW4gdGhlIGZpcnN0IGNvbnRyYWN0LlxuICogQHBhcmFtIHtLZXl3b3JkS2V5d29yZFJlY29yZD19IGtleXdvcmRSZWNvcmRcbiAqIEByZXR1cm5zIHtLZXl3b3JkS2V5d29yZFJlY29yZCB9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgTWFwS2V5d29yZHNcbiAqXG4gKiBSZW1hcCB0aGUga2V5d29yZHMgb2YgYW4gYW1vdW50S2V5d29yZFJlY29yZCwgaXNzdWVyS2V5d29yZFJlY29yZCwgb3IgYVxuICogUGF5bWVudFBLZXl3b3JkUmVjb3JkIGFjY29yZGluZyB0byBhIG1hcHBpbmcuIFRoaXMgaXMgdXNlZCB0byByZW1hcFxuICogZnJvbSBrZXl3b3JkcyB1c2VkIGluIGNvbnRyYWN0QSB0byBrZXl3b3JkcyB1c2VkIGluIGNvbnRyYWN0QiBhbmRcbiAqIHZpY2UgdmVyc2EgaW4gYG9mZmVyVG9gXG4gKlxuICogQHBhcmFtIHtBbW91bnRLZXl3b3JkUmVjb3JkIHwgUGF5bWVudFBLZXl3b3JkUmVjb3JkIHwgSXNzdWVyS2V5d29yZFJlY29yZCB8IHVuZGVmaW5lZCB9IGtleXdvcmRSZWNvcmRcbiAqIEBwYXJhbSB7S2V5d29yZEtleXdvcmRSZWNvcmR9IGtleXdvcmRNYXBwaW5nXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBSYXRpb1xuICogQHByb3BlcnR5IHtBbW91bnQ8J25hdCc+fSBudW1lcmF0b3JcbiAqIEBwcm9wZXJ0eSB7QW1vdW50PCduYXQnPn0gZGVub21pbmF0b3JcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBTY2FsZUFtb3VudFxuICogQHBhcmFtIHtBbW91bnR9IGFtb3VudFxuICogQHBhcmFtIHtSYXRpb30gcmF0aW9cbiAqIEByZXR1cm5zIHtBbW91bnQ8J25hdCc+fVxuICovXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKnQ3z1CBwAAQgcAADUAAABAYWdvcmljL3pvZS12MC4yNS4zL3NyYy9jb250cmFjdHMvY2FsbFNwcmVhZC90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qKlxuICogQHR5cGVkZWYgeydsb25nJyB8ICdzaG9ydCd9IFBvc2l0aW9uS2luZFxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIE1ha2VPcHRpb25JbnZpdGF0aW9uXG4gKiBAcGFyYW0ge1Bvc2l0aW9uS2luZH0gcG9zaXRpb25LaW5kXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxJbnZpdGF0aW9uPn1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBheW9mZkhhbmRsZXJcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gdm9pZH0gc2NoZWR1bGVQYXlvZmZzXG4gKiBAcHJvcGVydHkgIHtNYWtlT3B0aW9uSW52aXRhdGlvbn0gbWFrZU9wdGlvbkludml0YXRpb25cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IENhbGN1bGF0ZVNoYXJlc1JldHVyblxuICogUmV0dXJuIHZhbHVlIGZyb20gY2FsY3VsYXRlU2hhcmVzLCB3aGljaCByZXByZXNlbnRzIHRoZSBwb3J0aW9ucyBhc3NpZ25lZCB0b1xuICogdGhlIGxvbmcgYW5kIHNob3J0IHNpZGUgb2YgYSB0cmFuc2FjdGlvbi4gVGhlc2Ugd2lsbCBiZSB0d28gbm9uLW5lZ2F0aXZlXG4gKiBpbnRlZ2VycyB0aGF0IHN1bSB0byAxMDAuXG4gKiBAcHJvcGVydHkge1JhdGlvfSBsb25nU2hhcmVcbiAqIEBwcm9wZXJ0eSB7UmF0aW99IHNob3J0U2hhcmVcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBDYWxjdWxhdGVTaGFyZXNcbiAqIGNhbGN1bGF0ZSB0aGUgcG9ydGlvbiAoYXMgYSBwZXJjZW50YWdlKSBvZiB0aGUgY29sbGF0ZXJhbCB0aGF0IHNob3VsZCBiZVxuICogYWxsb2NhdGVkIHRvIHRoZSBsb25nIHNpZGUgb2YgYSBjYWxsIHNwcmVhZCBjb250cmFjdC4gcHJpY2UgZ2l2ZXMgdGhlIHZhbHVlXG4gKiBvZiB0aGUgdW5kZXJseWluZyBhc3NldCBhdCBjbG9zaW5nIHRoYXQgZGV0ZXJtaW5lcyB0aGUgcGF5b3V0cyB0byB0aGUgcGFydGllc1xuICpcbiAqIGlmIHByaWNlIDw9IHN0cmlrZVByaWNlMSwgcmV0dXJuIFJhdGlvIHJlcHJlc2VudGluZyAwXG4gKiBpZiBwcmljZSA+PSBzdHJpa2VQcmljZTIsIHJldHVybiBSYXRpbyByZXByZXNlbnRpbmcgMS5cbiAqIE90aGVyd2lzZSByZXR1cm4gbG9uZ1NoYXJlIGFuZCBzaG9ydFNoYXJlIHJlcHJlc2VudGluZyByYXRpb3MgYmV0d2VlbiAwJSBhbmRcbiAqIDEwMCUgcmVmbGVjdGluZyB0aGUgcG9zaXRpb24gb2YgdGhlIHByaWNlIGluIHRoZSByYW5nZSBmcm9tIHN0cmlrZVByaWNlMSB0b1xuICogc3RyaWtlUHJpY2UyLlxuICogQHBhcmFtIHtCcmFuZH0gY29sbGF0ZXJhbEJyYW5kXG4gKiBAcGFyYW0ge0Ftb3VudDwnbmF0Jz59IHByaWNlXG4gKiBAcGFyYW0ge0Ftb3VudDwnbmF0Jz59IHN0cmlrZVByaWNlMVxuICogQHBhcmFtIHtBbW91bnQ8J25hdCc+fSBzdHJpa2VQcmljZTJcbiAqIEByZXR1cm5zIHtDYWxjdWxhdGVTaGFyZXNSZXR1cm59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgTWFrZTEwMFBlcmNlbnRcbiAqIEBwYXJhbSB7QnJhbmR9IGJyYW5kXG4gKiBAcmV0dXJucyB7UmF0aW99XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgTWFrZTBQZXJjZW50XG4gKiBAcGFyYW0ge0JyYW5kfSBicmFuZFxuICogQHJldHVybnMge1JhdGlvfVxuICovXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANxeljujAQAAowEAAC0AAABAYWdvcmljL3pvZS12MC4yNS4zL3NyYy9jb250cmFjdHMvZXhwb3J0ZWQuanN7ImltcG9ydHMiOlsiLi9jYWxsU3ByZWFkL3R5cGVzLmpzIiwiLi9sb2FuL3R5cGVzLmpzIiwiLi90eXBlcy5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3R5cGVzLmpzXCIsIFtdXSxbXCIuL2xvYW4vdHlwZXMuanNcIiwgW11dLFtcIi4vY2FsbFNwcmVhZC90eXBlcy5qc1wiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAqRqTYLgZAAC4GQAALwAAAEBhZ29yaWMvem9lLXYwLjI1LjMvc3JjL2NvbnRyYWN0cy9sb2FuL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyoqXG4gKiBAdHlwZWRlZiB7Tm90aWZpZXI8VGltZXN0YW1wPn0gUGVyaW9kTm90aWZpZXJcbiAqXG4gKiAgVGhlIE5vdGlmaWVyIHRoYXQgcHJvdmlkZXMgbm90aWZpY2F0aW9ucyB0aGF0IHBlcmlvZHMgaGF2ZSBwYXNzZWQuXG4gKiAgU2luY2Ugbm90aWZpZXJzIGNhbid0IGJlIHJlbGllZCBvbiB0byBwcm9kdWNlIGFuIG91dHB1dCBldmVyeSB0aW1lXG4gKiAgdGhleSBzaG91bGQsIHdlJ2xsIHRyYWNrIHRoZSB0aW1lIG9mIGxhc3QgcGF5bWVudCwgYW5kIGNhdGNoIHVwIGlmXG4gKiAgYW55IHRpbWVzIGhhdmUgYmVlbiBtaXNzZWQuIENvbXBvdW5kIGludGVyZXN0IHdpbGwgYmUgY2FsY3VsYXRlZFxuICogIHVzaW5nIHRoZSBpbnRlcmVzdFJhdGUuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7SW5zdGFuY2V9IEF1dG9zd2FwSW5zdGFuY2VcbiAqICAgVGhlIHJ1bm5pbmcgY29udHJhY3QgaW5zdGFuY2UgZm9yIGFuIEF1dG9zd2FwIG9yIGNvbnN0YW50IHByb2R1Y3RcbiAqICAgQU1NIGluc3RhbGxhdGlvbi4gIFRoZSBwdWJsaWNGYWNldCBmcm9tIHRoZSBBdXRvc3dhcFxuICogICBpbnN0YW5jZSBpcyB1c2VkIGZvciBwcm9kdWNpbmcgYW4gaW52aXRhdGlvbiB0byBzZWxsIHRoZVxuICogICBjb2xsYXRlcmFsIG9uIGxpcXVpZGF0aW9uLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgTG9hblRlcm1zXG4gKlxuICogQHByb3BlcnR5IHtSYXRpb30gbW1yIC0gTWFpbnRlbmFuY2UgTWFyZ2luIFJlcXVpcmVtZW50LCBhIFJhdGlvIHJlY29yZC5cbiAqIERlZmF1bHQgaXMgMTUwJVxuICpcbiAqIEBwcm9wZXJ0eSB7QXV0b3N3YXBJbnN0YW5jZX0gYXV0b3N3YXBJbnN0YW5jZVxuICpcbiAqIEBwcm9wZXJ0eSB7UHJpY2VBdXRob3JpdHl9IHByaWNlQXV0aG9yaXR5XG4gKlxuICogICBVc2VkIGZvciBnZXR0aW5nIHRoZSBjdXJyZW50IHZhbHVlIG9mIGNvbGxhdGVyYWwgYW5kIHNldHRpbmdcbiAqICAgbGlxdWlkYXRpb24gdHJpZ2dlcnMuXG4gKlxuICogQHByb3BlcnR5IHtQZXJpb2ROb3RpZmllcn0gcGVyaW9kTm90aWZpZXJcbiAqXG4gKiBAcHJvcGVydHkge1JhdGlvfSBpbnRlcmVzdFJhdGVcbiAqICAgVGhlIHJhdGUgaW4gYmFzaXMgcG9pbnRzIHRoYXQgd2lsbCBiZSBtdWx0aXBsaWVkIHdpdGggdGhlIGRlYnQgb25cbiAqICAgZXZlcnkgcGVyaW9kIHRvIGNvbXBvdW5kIGludGVyZXN0LlxuICpcbiAqIEBwcm9wZXJ0eSB7UmVsYXRpdmVUaW1lfSBpbnRlcmVzdFBlcmlvZFxuICpcbiAqIEBwcm9wZXJ0eSB7QnJhbmR9IGxvYW5CcmFuZFxuICogQHByb3BlcnR5IHtCcmFuZH0gY29sbGF0ZXJhbEJyYW5kXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBMZW5kZXJTZWF0UHJvcGVydHlcbiAqIEBwcm9wZXJ0eSB7WkNGU2VhdH0gbGVuZGVyU2VhdFxuICpcbiAqICAgVGhlIFpDRlNlYXQgcmVwcmVzZW50aW5nIHRoZSBsZW5kZXIncyBwb3NpdGlvbiBpbiB0aGUgY29udHJhY3QuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7TG9hblRlcm1zICYgTGVuZGVyU2VhdFByb3BlcnR5fSBMb2FuQ29uZmlnV2l0aExlbmRlclxuICpcbiAqIFRoZSBsb2FuIG5vdyBoYXMgYSBsZW5kZXJTZWF0LCB3aGljaCBpcyBhZGRlZCB0byB0aGUgY29uZmlnLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgQm9ycm93ZXJDb25maWdQcm9wZXJ0aWVzXG4gKlxuICogQHByb3BlcnR5IHtaQ0ZTZWF0fSBjb2xsYXRlcmFsU2VhdFxuICpcbiAqICAgVGhlIFpDRlNlYXQgaG9sZGluZyB0aGUgY29sbGF0ZXJhbCBpbiBlc2Nyb3cgYWZ0ZXIgdGhlIGJvcnJvd2VyXG4gKiAgIGVzY3Jvd3MgaXRcbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IEFtb3VudH0gZ2V0RGVidFxuICpcbiAqICAgQSBmdW5jdGlvbiB0byBnZXQgdGhlIGN1cnJlbnQgZGVidFxuICpcbiAqIEBwcm9wZXJ0eSB7UHJvbWlzZVJlY29yZDxQcmljZVF1b3RlPn0gbGlxdWlkYXRpb25Qcm9taXNlS2l0XG4gKlxuICogICBQcm9taXNlS2l0IHRoYXQgaW5jbHVkZXMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYSBQcmljZVF1b3RlXG4gKiAgIHdoZW4gbGlxdWlkYXRpb24gaXMgdHJpZ2dlcmVkXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBCb3Jyb3dlckNvbmZpZ1Byb3BlcnRpZXNNaW51c0RlYnRcbiAqXG4gKiBAcHJvcGVydHkge1pDRlNlYXR9IGNvbGxhdGVyYWxTZWF0XG4gKlxuICogICBUaGUgWkNGU2VhdCBob2xkaW5nIHRoZSBjb2xsYXRlcmFsIGluIGVzY3JvdyBhZnRlciB0aGUgYm9ycm93ZXJcbiAqICAgZXNjcm93cyBpdFxuICpcbiAqIEBwcm9wZXJ0eSB7UHJvbWlzZVJlY29yZDxQcmljZVF1b3RlPn0gbGlxdWlkYXRpb25Qcm9taXNlS2l0XG4gKlxuICogICBQcm9taXNlS2l0IHRoYXQgaW5jbHVkZXMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYSBQcmljZVF1b3RlXG4gKiAgIHdoZW4gbGlxdWlkYXRpb24gaXMgdHJpZ2dlcmVkXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7TG9hbkNvbmZpZ1dpdGhMZW5kZXIgJiBCb3Jyb3dlckNvbmZpZ1Byb3BlcnRpZXMgfSBMb2FuQ29uZmlnV2l0aEJvcnJvd2VyXG4gKlxuICogVGhlIGxvYW4gaGFzIGEgbGVuZGVyLCBhIGJvcnJvd2VyLCBhbmQgY29sbGF0ZXJhbCBlc2Nyb3dlZC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtMb2FuQ29uZmlnV2l0aExlbmRlciAmIEJvcnJvd2VyQ29uZmlnUHJvcGVydGllc01pbnVzRGVidFxuICogfSBMb2FuQ29uZmlnV2l0aEJvcnJvd2VyTWludXNEZWJ0XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgU2NoZWR1bGVMaXF1aWRhdGlvblxuICogQHBhcmFtIHtaQ0Z9IHpjZlxuICogQHBhcmFtIHtMb2FuQ29uZmlnV2l0aEJvcnJvd2VyfSBjb25maWdcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBNYWtlTGVuZEludml0YXRpb25cbiAqIEBwYXJhbSB7WkNGfSB6Y2ZcbiAqIEBwYXJhbSB7TG9hblRlcm1zfSBjb25maWdcbiAqIEByZXR1cm5zIHtQcm9taXNlPEludml0YXRpb24+fSBsZW5kSW52aXRhdGlvblxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIE1ha2VCb3Jyb3dJbnZpdGF0aW9uXG4gKiBAcGFyYW0ge1pDRn0gemNmXG4gKiBAcGFyYW0ge0xvYW5Db25maWdXaXRoTGVuZGVyfSBjb25maWdcbiAqIEByZXR1cm5zIHtQcm9taXNlPEludml0YXRpb24+fSBib3Jyb3dJbnZpdGF0aW9uXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgTWFrZUNsb3NlTG9hbkludml0YXRpb25cbiAqIEBwYXJhbSB7WkNGfSB6Y2ZcbiAqIEBwYXJhbSB7TG9hbkNvbmZpZ1dpdGhCb3Jyb3dlcn0gY29uZmlnXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxJbnZpdGF0aW9uPn0gY2xvc2VMb2FuSW52aXRhdGlvblxuICovXG5cbi8qKlxuICogQWxsb3dzIGhvbGRlciB0byBhZGQgY29sbGF0ZXJhbCB0byB0aGUgY29udHJhY3QuIEV4aXRzIHRoZSBzZWF0XG4gKiBhZnRlciBhZGRpbmcuXG4gKlxuICogQGNhbGxiYWNrIE1ha2VBZGRDb2xsYXRlcmFsSW52aXRhdGlvblxuICogQHBhcmFtIHtaQ0Z9IHpjZlxuICogQHBhcmFtIHtMb2FuQ29uZmlnV2l0aEJvcnJvd2VyfSBjb25maWdcbiAqIEByZXR1cm5zIHtQcm9taXNlPEludml0YXRpb24+fSBhZGRDb2xsYXRlcmFsSW52aXRhdGlvblxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIExpcXVpZGF0ZVxuICogQHBhcmFtIHtaQ0Z9IHpjZlxuICogQHBhcmFtIHtMb2FuQ29uZmlnV2l0aEJvcnJvd2VyfSBjb25maWdcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIE1ha2VEZWJ0Q2FsY3VsYXRvclxuICogQHBhcmFtIHtEZWJ0Q2FsY3VsYXRvckNvbmZpZ30gZGVidENhbGN1bGF0b3JDb25maWdcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBDYWxjSW50ZXJlc3RGblxuICogQHBhcmFtIHtBbW91bnR9IG9sZERlYnRcbiAqIEBwYXJhbSB7UmF0aW99IGludGVyZXN0UmF0ZVxuICogQHJldHVybnMge0Ftb3VudH0gaW50ZXJlc3RcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IERlYnRDYWxjdWxhdG9yQ29uZmlnXG4gKiBAcHJvcGVydHkge0NhbGNJbnRlcmVzdEZufSBjYWxjSW50ZXJlc3RGblxuICpcbiAqICAgQSBmdW5jdGlvbiB0byBjYWxjdWxhdGUgdGhlIGludGVyZXN0LCBnaXZlbiB0aGUgZGVidCB2YWx1ZSBhbmQgYW5cbiAqICAgaW50ZXJlc3QgcmF0ZSBpbiBiYXNpcyBwb2ludHMuXG4gKlxuICogQHByb3BlcnR5IHtBbW91bnR9IG9yaWdpbmFsRGVidFxuICpcbiAqICAgVGhlIGRlYnQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBsb2FuLCBpbiBMb2FuIGJyYW5kXG4gKlxuICogQHByb3BlcnR5IHtQZXJpb2ROb3RpZmllcn0gcGVyaW9kTm90aWZpZXJcbiAqXG4gKiAgIFRoZSBBc3luY0l0ZXJhYmxlIHRvIG5vdGlmeSB3aGVuIGEgcGVyaW9kIGhhcyBvY2N1cnJlZFxuICpcbiAqIEBwcm9wZXJ0eSB7UmF0aW99IGludGVyZXN0UmF0ZVxuICogQHByb3BlcnR5IHtSZWxhdGl2ZVRpbWV9IGludGVyZXN0UGVyaW9kXG4gKlxuICogIHRoZSBwZXJpb2QgYXQgd2hpY2ggdGhlIG91dHN0YW5kaW5nIGRlYnQgaW5jcmVhc2VzIGJ5IHRoZSBpbnRlcmVzdFJhdGVcbiAqXG4gKiBAcHJvcGVydHkge1pDRn0gemNmXG4gKlxuICogQHByb3BlcnR5IHtMb2FuQ29uZmlnV2l0aEJvcnJvd2VyTWludXNEZWJ0fSBjb25maWdNaW51c0dldERlYnRcbiAqIEBwcm9wZXJ0eSB7VGltZXN0YW1wfSBiYXNldGltZSBUaGUgc3RhcnRpbmcgcG9pbnQgZnJvbSB3aGljaCB0byBjYWxjdWxhdGVcbiAqIGludGVyZXN0LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQ29uZmlnTWludXNHZXREZWJ0XG4gKiBAcHJvcGVydHkge1pDRlNlYXR9IGNvbGxhdGVyYWxTZWF0XG4gKiBAcHJvcGVydHkge1Byb21pc2VSZWNvcmQ8YW55Pn0gbGlxdWlkYXRpb25Qcm9taXNlS2l0XG4gKiBAcHJvcGVydHkge2JpZ2ludH0gW21tcl1cbiAqIEBwcm9wZXJ0eSB7SGFuZGxlPCdJbnN0YW5jZSc+fSBhdXRvc3dhcEluc3RhbmNlXG4gKiBAcHJvcGVydHkge1ByaWNlQXV0aG9yaXR5fSBwcmljZUF1dGhvcml0eVxuICogQHByb3BlcnR5IHtQZXJpb2ROb3RpZmllcn0gcGVyaW9kTm90aWZpZXJcbiAqIEBwcm9wZXJ0eSB7YmlnaW50fSBpbnRlcmVzdFJhdGVcbiAqIEBwcm9wZXJ0eSB7UmVsYXRpdmVUaW1lfSBpbnRlcmVzdFBlcmlvZFxuICogQHByb3BlcnR5IHtaQ0ZTZWF0fSBsZW5kZXJTZWF0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBCb3Jyb3dGYWNldFxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxJbnZpdGF0aW9uPn0gbWFrZUNsb3NlTG9hbkludml0YXRpb25cbiAqXG4gKiBNYWtlIGFuIGludml0YXRpb24gdG8gY2xvc2UgdGhlIGxvYW4gYnkgcmVwYXlpbmcgdGhlIGRlYnRcbiAqICAgKGluY2x1ZGluZyBpbnRlcmVzdCkuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPEludml0YXRpb24+fSBtYWtlQWRkQ29sbGF0ZXJhbEludml0YXRpb25cbiAqXG4gKiBNYWtlIGFuIGludml0YXRpb24gdG8gYWRkIGNvbGxhdGVyYWwgdG8gcHJvdGVjdCBhZ2FpbnN0IGxpcXVpZGF0aW9uXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPFByaWNlUXVvdGU+fSBnZXRMaXF1aWRhdGlvblByb21pc2VcbiAqXG4gKiBHZXQgYSBwcm9taXNlIGZvciBhIHByaWNlUXVvdGUgdGhhdCB3aWxsIHJlc29sdmUgaWYgbGlxdWlkYXRpb25cbiAqIG9jY3Vycy4gVGhlIHByaWNlUXVvdGUgaXMgZm9yIHRoZSB2YWx1ZSBvZiB0aGUgY29sbGF0ZXJhbCB0aGF0XG4gKiB0cmlnZ2VyZWQgdGhlIGxpcXVpZGF0aW9uLiBUaGlzIG1heSBiZSBsb3dlciB0aGFuIGV4cGVjdGVkIGlmIHRoZVxuICogcHJpY2UgaXMgbW92aW5nIHF1aWNrbHkuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBUaW1lc3RhbXB9IGdldExhc3RDYWxjdWxhdGlvblRpbWVzdGFtcFxuICpcbiAqIEdldCB0aGUgdGltZXN0YW1wIGF0IHdoaWNoIHRoZSBkZWJ0IHdhcyBtb3N0IHJlY2VudGx5IHJlY2FsY3VsYXRlZC5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IE5vdGlmaWVyPEFtb3VudD59IGdldERlYnROb3RpZmllclxuICpcbiAqIEdldCBhIE5vdGlmaWVyIHRoYXQgd2lsbCBiZSB1cGRhdGVkIHdoZW4gdGhlIGN1cnJlbnQgZGVidCAoYW4gQW1vdW50IHdpdGggdGhlIExvYW5cbiAqIEJyYW5kKSBjaGFuZ2VzLiBUaGlzIHdpbGwgaW5jcmVhc2UgYXMgaW50ZXJlc3QgaXMgYWRkZWQuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBBbW91bnR9IGdldFJlY2VudENvbGxhdGVyYWxBbW91bnRcbiAqXG4gKiBHZXQgYSByZWNlbnQgcmVwb3J0IG9mIHRoZSBhbW91bnQgb2YgY29sbGF0ZXJhbCBpbiB0aGUgbG9hblxuICovXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALZQ7U+9CwAAvQsAACoAAABAYWdvcmljL3pvZS12MC4yNS4zL3NyYy9jb250cmFjdHMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFNlbGxJdGVtc1B1YmxpY0ZhY2V0XG4gKiBAcHJvcGVydHkgeygpID0+IElzc3Vlcn0gZ2V0SXRlbXNJc3N1ZXJcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gQW1vdW50fSBnZXRBdmFpbGFibGVJdGVtc1xuICpcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFNlbGxJdGVtc0NyZWF0b3JPbmx5XG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8SW52aXRhdGlvbj59IG1ha2VCdXllckludml0YXRpb25cbiAqXG4gKiBAdHlwZWRlZiB7U2VsbEl0ZW1zUHVibGljRmFjZXQgJiBTZWxsSXRlbXNDcmVhdG9yT25seX0gU2VsbEl0ZW1zQ3JlYXRvckZhY2V0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTZWxsSXRlbXNQYXJhbWV0ZXJzXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsIGFueT59IGN1c3RvbVZhbHVlUHJvcGVydGllc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IGNvdW50XG4gKiBAcHJvcGVydHkge0lzc3Vlcn0gbW9uZXlJc3N1ZXJcbiAqIEBwcm9wZXJ0eSB7SW5zdGFsbGF0aW9ufSBzZWxsSXRlbXNJbnN0YWxsYXRpb25cbiAqIEBwcm9wZXJ0eSB7QW1vdW50fSBwcmljZVBlckl0ZW1cbiAqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTZWxsSXRlbXNSZXN1bHRcbiAqIEBwcm9wZXJ0eSB7VXNlclNlYXR9IHNlbGxJdGVtc0NyZWF0b3JTZWF0XG4gKiBAcHJvcGVydHkge1NlbGxJdGVtc0NyZWF0b3JGYWNldH0gc2VsbEl0ZW1zQ3JlYXRvckZhY2V0XG4gKiBAcHJvcGVydHkge0luc3RhbmNlfSBzZWxsSXRlbXNJbnN0YW5jZVxuICogQHByb3BlcnR5IHtTZWxsSXRlbXNQdWJsaWNGYWNldH0gc2VsbEl0ZW1zUHVibGljRmFjZXRcbiAqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBNaW50QW5kU2VsbE5GVENyZWF0b3JGYWNldFxuICogQHByb3BlcnR5IHsoc2VsbFBhcmFtczogU2VsbEl0ZW1zUGFyYW1ldGVycykgPT4gUHJvbWlzZTxTZWxsSXRlbXNSZXN1bHQ+fSBzZWxsVG9rZW5zXG4gKiBAcHJvcGVydHkgeygpID0+IElzc3Vlcn0gZ2V0SXNzdWVyXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBBdXRvbWF0aWNSZWZ1bmRQdWJsaWNGYWNldFxuICogQHByb3BlcnR5IHsoKSA9PiBiaWdpbnR9IGdldE9mZmVyc0NvdW50XG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8SW52aXRhdGlvbj59IG1ha2VJbnZpdGF0aW9uXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBBdXRvc3dhcFB1YmxpY0ZhY2V0XG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8SW52aXRhdGlvbj59IG1ha2VTd2FwSW52aXRhdGlvbiBzeW5vbnltIGZvclxuICogbWFrZVN3YXBJbkludml0YXRpb25cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxJbnZpdGF0aW9uPn0gbWFrZVN3YXBJbkludml0YXRpb24gbWFrZSBhbiBpbnZpdGF0aW9uXG4gKiB0aGF0IGFsbG93cyBvbmUgdG8gZG8gYSBzd2FwIGluIHdoaWNoIHRoZSBJbiBhbW91bnQgaXMgc3BlY2lmaWVkIGFuZCB0aGUgT3V0XG4gKiBhbW91bnQgaXMgY2FsY3VsYXRlZFxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPEludml0YXRpb24+fSBtYWtlU3dhcE91dEludml0YXRpb24gbWFrZSBhbiBpbnZpdGF0aW9uXG4gKiB0aGF0IGFsbG93cyBvbmUgdG8gZG8gYSBzd2FwIGluIHdoaWNoIHRoZSBPdXQgYW1vdW50IGlzIHNwZWNpZmllZCBhbmQgdGhlIEluXG4gKiBhbW91bnQgaXMgY2FsY3VsYXRlZFxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPEludml0YXRpb24+fSBtYWtlQWRkTGlxdWlkaXR5SW52aXRhdGlvbiBtYWtlIGFuXG4gKiBpbnZpdGF0aW9uIHRoYXQgYWxsb3dzIG9uZSB0byBhZGQgbGlxdWlkaXR5IHRvIHRoZSBwb29sLlxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPEludml0YXRpb24+fSBtYWtlUmVtb3ZlTGlxdWlkaXR5SW52aXRhdGlvbiBtYWtlIGFuXG4gKiBpbnZpdGF0aW9uIHRoYXQgYWxsb3dzIG9uZSB0byByZW1vdmUgbGlxdWlkaXR5IGZyb20gdGhlIHBvb2wuXG4gKiBAcHJvcGVydHkgeygpID0+IElzc3Vlcn0gZ2V0TGlxdWlkaXR5SXNzdWVyXG4gKiBAcHJvcGVydHkgeygpID0+IGJpZ2ludH0gZ2V0TGlxdWlkaXR5U3VwcGx5IGdldCB0aGUgY3VycmVudCB2YWx1ZSBvZlxuICogbGlxdWlkaXR5IGhlbGQgYnkgaW52ZXN0b3JzLlxuICogQHByb3BlcnR5IHsoYW1vdW50SW46IEFtb3VudCwgYnJhbmRPdXQ6IEJyYW5kKSA9PiBBbW91bnR9IGdldElucHV0UHJpY2VcbiAqIGNhbGN1bGF0ZSB0aGUgYW1vdW50IG9mIGJyYW5kT3V0IHRoYXQgd2lsbCBiZSByZXR1cm5lZCBpZiB0aGUgYW1vdW50SW4gaXNcbiAqIG9mZmVyZWQgdXNpbmcgbWFrZVN3YXBJbkludml0YXRpb24gYXQgdGhlIGN1cnJlbnQgcHJpY2UuXG4gKiBAcHJvcGVydHkgeyhhbW91bnRPdXQ6IEFtb3VudCwgYnJhbmRJbjogQnJhbmQpID0+IEFtb3VudH0gZ2V0T3V0cHV0UHJpY2VcbiAqIGNhbGN1bGF0ZSB0aGUgYW1vdW50IG9mIGJyYW5kSW4gdGhhdCBpcyByZXF1aXJlZCBpbiBvcmRlciB0byBnZXQgYW1vdW50T3V0XG4gKiB1c2luZyBtYWtlU3dhcE91dEludml0YXRpb24gYXQgdGhlIGN1cnJlbnQgcHJpY2VcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUmVjb3JkPHN0cmluZywgQW1vdW50Pn0gZ2V0UG9vbEFsbG9jYXRpb24gZ2V0IGFuXG4gKiBBbW91bnRLZXl3b3JkUmVjb3JkIHNob3dpbmcgdGhlIGN1cnJlbnQgYmFsYW5jZXMgaW4gdGhlIHBvb2wuXG4gKi9cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAHMasYdtBAADbQQAAJQAAAEBhZ29yaWMvem9lLXYwLjI1LjMvc3JjL3R5cGVHdWFyZHMuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9lcnRwIiwiQGFnb3JpYy9ub3RpZmllciIsIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL3N3aW5nc2V0LXZhdC9zcmMvdmF0cy90aW1lci90eXBlR3VhcmRzLmpzIl0sImV4cG9ydHMiOlsiQWRtaW5GYWNldEkiLCJBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUiLCJBbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZFNoYXBlIiwiQnJhbmRLZXl3b3JkUmVjb3JkU2hhcGUiLCJCdW5kbGVDYXBTaGFwZSIsIkJ1bmRsZVNoYXBlIiwiRXhpdE9iamVjdEkiLCJFeGl0T2JqZWN0U2hhcGUiLCJGdWxsUHJvcG9zYWxTaGFwZSIsIkhhbmRsZUkiLCJIYW5kbGVPZmZlckkiLCJJbnN0YWxsYXRpb25TaGFwZSIsIkluc3RhbmNlQWRtaW5JIiwiSW5zdGFuY2VBZG1pblNoYXBlIiwiSW5zdGFuY2VIYW5kbGVTaGFwZSIsIkluc3RhbmNlUmVjb3JkU2hhcGUiLCJJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VySUtpdCIsIkludml0YXRpb25FbGVtZW50U2hhcGUiLCJJbnZpdGF0aW9uSGFuZGxlU2hhcGUiLCJJbnZpdGF0aW9uU2hhcGUiLCJJc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGUiLCJJc3N1ZXJQS2V5d29yZFJlY29yZFNoYXBlIiwiSXNzdWVyUmVjb3JkU2hhcGUiLCJLZXl3b3JkU2hhcGUiLCJPZmZlckhhbmRsZXJJIiwiUGF5bWVudEtleXdvcmRSZWNvcmRTaGFwZSIsIlBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlIiwiUHJvcG9zYWxTaGFwZSIsIlNlYXREYXRhU2hhcGUiLCJTZWF0SGFuZGxlQWxsb2NhdGlvbnNTaGFwZSIsIlNlYXRTaGFwZSIsIlRlcm1zU2hhcGUiLCJUaW1lclNoYXBlIiwiWmNmTWludEkiLCJab2VNaW50SSIsIlpvZU1pbnRTaGFwZSIsIlpvZVNlcnZpY2VJS2l0IiwiWm9lU3RvcmFnZU1hbmFnZXJJS2l0IiwiaXNBZnRlckRlYWRsaW5lRXhpdFJ1bGUiLCJpc09uRGVtYW5kRXhpdFJ1bGUiLCJpc1dhaXZlZEV4aXRSdWxlIiwibWFrZUhhbmRsZVNoYXBlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEFtb3VudFNoYXBlLEFzc2V0S2luZFNoYXBlLERpc3BsYXlJbmZvU2hhcGUsSXNzdWVyU2hhcGUsQnJhbmRTaGFwZSxQYXltZW50U2hhcGUsTSxUaW1lc3RhbXBWYWx1ZVNoYXBlLFN1YnNjcmliZXJTaGFwZTskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2VydHBcIiwgW1tcIkFtb3VudFNoYXBlXCIsIFskaOKAjV9hID0+IChBbW91bnRTaGFwZSA9ICRo4oCNX2EpXV0sW1wiQXNzZXRLaW5kU2hhcGVcIiwgWyRo4oCNX2EgPT4gKEFzc2V0S2luZFNoYXBlID0gJGjigI1fYSldXSxbXCJEaXNwbGF5SW5mb1NoYXBlXCIsIFskaOKAjV9hID0+IChEaXNwbGF5SW5mb1NoYXBlID0gJGjigI1fYSldXSxbXCJJc3N1ZXJTaGFwZVwiLCBbJGjigI1fYSA9PiAoSXNzdWVyU2hhcGUgPSAkaOKAjV9hKV1dLFtcIkJyYW5kU2hhcGVcIiwgWyRo4oCNX2EgPT4gKEJyYW5kU2hhcGUgPSAkaOKAjV9hKV1dLFtcIlBheW1lbnRTaGFwZVwiLCBbJGjigI1fYSA9PiAoUGF5bWVudFNoYXBlID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIk1cIiwgWyRo4oCNX2EgPT4gKE0gPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zd2luZ3NldC12YXQvc3JjL3ZhdHMvdGltZXIvdHlwZUd1YXJkcy5qc1wiLCBbW1wiVGltZXN0YW1wVmFsdWVTaGFwZVwiLCBbJGjigI1fYSA9PiAoVGltZXN0YW1wVmFsdWVTaGFwZSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL25vdGlmaWVyXCIsIFtbXCJTdWJzY3JpYmVyU2hhcGVcIiwgWyRo4oCNX2EgPT4gKFN1YnNjcmliZXJTaGFwZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qIGtleXdvcmRzIGhhdmUgYW4gaW5pdGlhbCBjYXAqL1xuY29uc3QgICAgICAgIEtleXdvcmRTaGFwZT1NLnN0cmluZygpOyRo4oCNX29uY2UuS2V5d29yZFNoYXBlKEtleXdvcmRTaGFwZSk7XG5cbmNvbnN0ICAgICAgICBJbnZpdGF0aW9uSGFuZGxlU2hhcGU9TS5yZW1vdGFibGUoJ0ludml0YXRpb25IYW5kbGUnKTskaOKAjV9vbmNlLkludml0YXRpb25IYW5kbGVTaGFwZShJbnZpdGF0aW9uSGFuZGxlU2hhcGUpO1xuY29uc3QgICAgICAgIEludml0YXRpb25TaGFwZT1NLnJlbW90YWJsZSgnSW52aXRhdGlvbicpOyRo4oCNX29uY2UuSW52aXRhdGlvblNoYXBlKEludml0YXRpb25TaGFwZSk7XG5jb25zdCAgICAgICAgSW5zdGFuY2VIYW5kbGVTaGFwZT1NLnJlbW90YWJsZSgnSW5zdGFuY2VIYW5kbGUnKTskaOKAjV9vbmNlLkluc3RhbmNlSGFuZGxlU2hhcGUoSW5zdGFuY2VIYW5kbGVTaGFwZSk7XG5jb25zdCAgICAgICAgSW5zdGFsbGF0aW9uU2hhcGU9TS5yZW1vdGFibGUoJ0luc3RhbGxhdGlvbicpOyRo4oCNX29uY2UuSW5zdGFsbGF0aW9uU2hhcGUoSW5zdGFsbGF0aW9uU2hhcGUpO1xuY29uc3QgICAgICAgIFNlYXRTaGFwZT1NLnJlbW90YWJsZSgnU2VhdCcpOyRo4oCNX29uY2UuU2VhdFNoYXBlKFNlYXRTaGFwZSk7XG5cbmNvbnN0ICAgICAgICBBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGU9TS5yZWNvcmRPZihLZXl3b3JkU2hhcGUsQW1vdW50U2hhcGUpOyRo4oCNX29uY2UuQW1vdW50S2V5d29yZFJlY29yZFNoYXBlKEFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSk7XG5jb25zdCAgICAgICAgQW1vdW50UGF0dGVybktleXdvcmRSZWNvcmRTaGFwZT1NLnJlY29yZE9mKFxuS2V5d29yZFNoYXBlLFxuTS5wYXR0ZXJuKCkpOyRo4oCNX29uY2UuQW1vdW50UGF0dGVybktleXdvcmRSZWNvcmRTaGFwZShBbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZFNoYXBlKTtcblxuY29uc3QgICAgICAgIFBheW1lbnRLZXl3b3JkUmVjb3JkU2hhcGU9TS5yZWNvcmRPZihLZXl3b3JkU2hhcGUsUGF5bWVudFNoYXBlKTskaOKAjV9vbmNlLlBheW1lbnRLZXl3b3JkUmVjb3JkU2hhcGUoUGF5bWVudEtleXdvcmRSZWNvcmRTaGFwZSk7XG5jb25zdCAgICAgICAgUGF5bWVudFBLZXl3b3JkUmVjb3JkU2hhcGU9TS5yZWNvcmRPZihcbktleXdvcmRTaGFwZSxcbk0uZXJlZihQYXltZW50U2hhcGUpKTskaOKAjV9vbmNlLlBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlKFBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlKTtcblxuY29uc3QgICAgICAgIElzc3VlcktleXdvcmRSZWNvcmRTaGFwZT1NLnJlY29yZE9mKEtleXdvcmRTaGFwZSxJc3N1ZXJTaGFwZSk7JGjigI1fb25jZS5Jc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGUoSXNzdWVyS2V5d29yZFJlY29yZFNoYXBlKTtcbmNvbnN0ICAgICAgICBJc3N1ZXJQS2V5d29yZFJlY29yZFNoYXBlPU0ucmVjb3JkT2YoXG5LZXl3b3JkU2hhcGUsXG5NLmVyZWYoSXNzdWVyU2hhcGUpKTskaOKAjV9vbmNlLklzc3VlclBLZXl3b3JkUmVjb3JkU2hhcGUoSXNzdWVyUEtleXdvcmRSZWNvcmRTaGFwZSk7XG5cbmNvbnN0ICAgICAgICBCcmFuZEtleXdvcmRSZWNvcmRTaGFwZT1NLnJlY29yZE9mKEtleXdvcmRTaGFwZSxCcmFuZFNoYXBlKTskaOKAjV9vbmNlLkJyYW5kS2V5d29yZFJlY29yZFNoYXBlKEJyYW5kS2V5d29yZFJlY29yZFNoYXBlKTtcblxuY29uc3QgICAgICAgIElzc3VlclJlY29yZFNoYXBlPU0uc3BsaXRSZWNvcmQoXG57XG5icmFuZDpCcmFuZFNoYXBlLFxuaXNzdWVyOklzc3VlclNoYXBlLFxuYXNzZXRLaW5kOkFzc2V0S2luZFNoYXBlfSxcblxue2Rpc3BsYXlJbmZvOkRpc3BsYXlJbmZvU2hhcGV9KTskaOKAjV9vbmNlLklzc3VlclJlY29yZFNoYXBlKElzc3VlclJlY29yZFNoYXBlKTtcblxuXG5jb25zdCAgICAgICAgVGVybXNTaGFwZT1oYXJkZW4oe1xuaXNzdWVyczpJc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGUsXG5icmFuZHM6QnJhbmRLZXl3b3JkUmVjb3JkU2hhcGV9KTskaOKAjV9vbmNlLlRlcm1zU2hhcGUoVGVybXNTaGFwZSk7XG5cblxuY29uc3QgICAgICAgIEluc3RhbmNlUmVjb3JkU2hhcGU9aGFyZGVuKHtcbmluc3RhbGxhdGlvbjpJbnN0YWxsYXRpb25TaGFwZSxcbmluc3RhbmNlOkluc3RhbmNlSGFuZGxlU2hhcGUsXG50ZXJtczpNLnNwbGl0UmVjb3JkKFRlcm1zU2hhcGUpfSk7JGjigI1fb25jZS5JbnN0YW5jZVJlY29yZFNoYXBlKEluc3RhbmNlUmVjb3JkU2hhcGUpO1xuXG5cbmNvbnN0ICAgICAgICBIYW5kbGVJPU0uaW50ZXJmYWNlKCdIYW5kbGUnLHt9KTskaOKAjV9vbmNlLkhhbmRsZUkoSGFuZGxlSSk7XG5cbmNvbnN0ICAgICAgICBtYWtlSGFuZGxlU2hhcGU9KG5hbWUpPT5NLnJlbW90YWJsZSggYCR7bmFtZX1IYW5kbGVgKTskaOKAjV9vbmNlLm1ha2VIYW5kbGVTaGFwZShtYWtlSGFuZGxlU2hhcGUpO1xuY29uc3QgICAgICAgIFRpbWVyU2hhcGU9bWFrZUhhbmRsZVNoYXBlKCd0aW1lcicpO1xuXG4vKipcbiAqIEFmdGVyIGRlZmF1bHRzIGFyZSBmaWxsZWQgaW5cbiAqXG4gKiBAc2VlIHtQcm9wb3NhbFJlY29yZH0gdHlwZVxuICovJGjigI1fb25jZS5UaW1lclNoYXBlKFRpbWVyU2hhcGUpO1xuY29uc3QgICAgICAgIEZ1bGxQcm9wb3NhbFNoYXBlPWhhcmRlbih7XG53YW50OkFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkU2hhcGUsXG5naXZlOkFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSxcbi8qIFRvIGFjY2VwdCBvbmx5IG9uZSwgd2UgY291bGQgdXNlIE0ub3IgcmF0aGVyIHRoYW4gTS5zcGxpdFJlY29yZCwqL1xuLyogYnV0IHRoZSBlcnJvciBtZXNzYWdlcyB3b3VsZCBoYXZlIGJlZW4gd29yc2UuIFJhdGhlciwqL1xuLyogY2xlYW5Qcm9wb3NhbCdzIGFzc2VydEV4aXQgY2hlY2tzIHRoYXQgdGhlcmUncyBleGFjdGx5IG9uZS4qL1xuZXhpdDpNLnNwbGl0UmVjb3JkKFxue30sXG57XG5vbkRlbWFuZDpudWxsLFxud2FpdmVkOm51bGwsXG5hZnRlckRlYWRsaW5lOntcbnRpbWVyOk0uZXJlZihUaW1lclNoYXBlKSxcbmRlYWRsaW5lOlRpbWVzdGFtcFZhbHVlU2hhcGV9fSxcblxuXG57fSl9KTtcblxuXG4vKiogQHNlZSB7UHJvcG9zYWx9IHR5cGUgKi8kaOKAjV9vbmNlLkZ1bGxQcm9wb3NhbFNoYXBlKEZ1bGxQcm9wb3NhbFNoYXBlKTtcbmNvbnN0ICAgICAgICBQcm9wb3NhbFNoYXBlPU0uc3BsaXRSZWNvcmQoe30sRnVsbFByb3Bvc2FsU2hhcGUse30pOyRo4oCNX29uY2UuUHJvcG9zYWxTaGFwZShQcm9wb3NhbFNoYXBlKTtcblxuY29uc3QgICAgICAgIGlzT25EZW1hbmRFeGl0UnVsZT0oZXhpdCk9PntcbmNvbnN0W2V4aXRLZXldPU9iamVjdC5rZXlzKGV4aXQpO1xucmV0dXJuIGV4aXRLZXk9PT0nb25EZW1hbmQnO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtFeGl0UnVsZX0gZXhpdFxuICogQHJldHVybnMge2V4aXQgaXMgV2FpdmVkRXhpdFJ1bGV9XG4gKi8kaOKAjV9vbmNlLmlzT25EZW1hbmRFeGl0UnVsZShpc09uRGVtYW5kRXhpdFJ1bGUpO1xuY29uc3QgICAgICAgIGlzV2FpdmVkRXhpdFJ1bGU9KGV4aXQpPT57XG5jb25zdFtleGl0S2V5XT1PYmplY3Qua2V5cyhleGl0KTtcbnJldHVybiBleGl0S2V5PT09J3dhaXZlZCc7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge0V4aXRSdWxlfSBleGl0XG4gKiBAcmV0dXJucyB7ZXhpdCBpcyBBZnRlckRlYWRsaW5lRXhpdFJ1bGV9XG4gKi8kaOKAjV9vbmNlLmlzV2FpdmVkRXhpdFJ1bGUoaXNXYWl2ZWRFeGl0UnVsZSk7XG5jb25zdCAgICAgICAgaXNBZnRlckRlYWRsaW5lRXhpdFJ1bGU9KGV4aXQpPT57XG5jb25zdFtleGl0S2V5XT1PYmplY3Qua2V5cyhleGl0KTtcbnJldHVybiBleGl0S2V5PT09J2FmdGVyRGVhZGxpbmUnO1xuIH07JGjigI1fb25jZS5pc0FmdGVyRGVhZGxpbmVFeGl0UnVsZShpc0FmdGVyRGVhZGxpbmVFeGl0UnVsZSk7XG5cbmNvbnN0ICAgICAgICBJbnZpdGF0aW9uRWxlbWVudFNoYXBlPU0uc3BsaXRSZWNvcmQoe1xuZGVzY3JpcHRpb246TS5zdHJpbmcoKSxcbmhhbmRsZTpJbnZpdGF0aW9uSGFuZGxlU2hhcGUsXG5pbnN0YW5jZTpJbnN0YW5jZUhhbmRsZVNoYXBlLFxuaW5zdGFsbGF0aW9uOkluc3RhbGxhdGlvblNoYXBlfSk7JGjigI1fb25jZS5JbnZpdGF0aW9uRWxlbWVudFNoYXBlKEludml0YXRpb25FbGVtZW50U2hhcGUpO1xuXG5cbmNvbnN0ICAgICAgICBPZmZlckhhbmRsZXJJPU0uaW50ZXJmYWNlKCdPZmZlckhhbmRsZXInLHtcbmhhbmRsZTpNLmNhbGwoU2VhdFNoYXBlKS5vcHRpb25hbChNLmFueSgpKS5yZXR1cm5zKE0uc3RyaW5nKCkpfSk7JGjigI1fb25jZS5PZmZlckhhbmRsZXJJKE9mZmVySGFuZGxlckkpO1xuXG5cbmNvbnN0ICAgICAgICBTZWF0SGFuZGxlQWxsb2NhdGlvbnNTaGFwZT1NLmFycmF5T2YoXG5oYXJkZW4oe1xuc2VhdEhhbmRsZTpTZWF0U2hhcGUsXG5hbGxvY2F0aW9uOkFtb3VudEtleXdvcmRSZWNvcmRTaGFwZX0pKTskaOKAjV9vbmNlLlNlYXRIYW5kbGVBbGxvY2F0aW9uc1NoYXBlKFNlYXRIYW5kbGVBbGxvY2F0aW9uc1NoYXBlKTtcblxuXG5cbmNvbnN0ICAgICAgICBab2VNaW50U2hhcGU9TS5yZW1vdGFibGUoJ1pvZU1pbnQnKTskaOKAjV9vbmNlLlpvZU1pbnRTaGFwZShab2VNaW50U2hhcGUpO1xuY29uc3QgICAgICAgIFpvZU1pbnRJPU0uaW50ZXJmYWNlKCdab2VNaW50Jyx7XG5nZXRJc3N1ZXJSZWNvcmQ6TS5jYWxsKCkucmV0dXJucyhJc3N1ZXJSZWNvcmRTaGFwZSksXG5taW50QW5kRXNjcm93Ok0uY2FsbChBbW91bnRTaGFwZSkucmV0dXJucygpLFxud2l0aGRyYXdBbmRCdXJuOk0uY2FsbChBbW91bnRTaGFwZSkucmV0dXJucygpfSk7JGjigI1fb25jZS5ab2VNaW50SShab2VNaW50SSk7XG5cblxuY29uc3QgICAgICAgIFpjZk1pbnRJPU0uaW50ZXJmYWNlKCdaY2ZNaW50Jyx7XG5nZXRJc3N1ZXJSZWNvcmQ6TS5jYWxsKCkucmV0dXJucyhJc3N1ZXJSZWNvcmRTaGFwZSksXG5taW50R2FpbnM6TS5jYWxsKEFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSxNLnJlbW90YWJsZSgnemNmU2VhdCcpKS5yZXR1cm5zKCksXG5idXJuTG9zc2VzOk0uY2FsbChcbkFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSxcbk0ucmVtb3RhYmxlKCd6Y2ZTZWF0JykpLlxucmV0dXJucygpfSk7JGjigI1fb25jZS5aY2ZNaW50SShaY2ZNaW50SSk7XG5cblxuY29uc3QgICAgICAgIEV4aXRPYmplY3RJPU0uaW50ZXJmYWNlKCdFeGl0IE9iamVjdCcse1xuZXhpdDpNLmNhbGwoKS5yZXR1cm5zKCl9KTskaOKAjV9vbmNlLkV4aXRPYmplY3RJKEV4aXRPYmplY3RJKTtcblxuXG5jb25zdCAgICAgICAgRXhpdE9iamVjdFNoYXBlPU0ucmVtb3RhYmxlKCdFeGl0T2JqJyk7JGjigI1fb25jZS5FeGl0T2JqZWN0U2hhcGUoRXhpdE9iamVjdFNoYXBlKTtcbmNvbnN0ICAgICAgICBJbnN0YW5jZUFkbWluU2hhcGU9TS5yZW1vdGFibGUoJ0luc3RhbmNlQWRtaW4nKTskaOKAjV9vbmNlLkluc3RhbmNlQWRtaW5TaGFwZShJbnN0YW5jZUFkbWluU2hhcGUpO1xuY29uc3QgICAgICAgIEluc3RhbmNlQWRtaW5JPU0uaW50ZXJmYWNlKCdJbnN0YW5jZUFkbWluJyx7XG5tYWtlSW52aXRhdGlvbjpNLmNhbGwoSW52aXRhdGlvbkhhbmRsZVNoYXBlLE0uc3RyaW5nKCkpLlxub3B0aW9uYWwoTS5yZWNvcmQoKSxNLnBhdHRlcm4oKSkuXG5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbnNhdmVJc3N1ZXI6TS5jYWxsV2hlbihNLmF3YWl0KElzc3VlclNoYXBlKSxLZXl3b3JkU2hhcGUpLnJldHVybnMoXG5Jc3N1ZXJSZWNvcmRTaGFwZSksXG5cbm1ha2VOb0VzY3Jvd1NlYXQ6TS5jYWxsKFxuQW1vdW50S2V5d29yZFJlY29yZFNoYXBlLFxuUHJvcG9zYWxTaGFwZSxcbkV4aXRPYmplY3RTaGFwZSxcblNlYXRTaGFwZSkuXG5yZXR1cm5zKFNlYXRTaGFwZSksXG5leGl0QWxsU2VhdHM6TS5jYWxsKE0uYW55KCkpLnJldHVybnMoKSxcbmZhaWxBbGxTZWF0czpNLmNhbGwoTS5hbnkoKSkucmV0dXJucygpLFxuZXhpdFNlYXQ6TS5jYWxsKFNlYXRTaGFwZSxNLmFueSgpKS5yZXR1cm5zKCksXG5mYWlsU2VhdDpNLmNhbGwoU2VhdFNoYXBlLE0uYW55KCkpLnJldHVybnMoKSxcbm1ha2Vab2VNaW50Ok0uY2FsbChLZXl3b3JkU2hhcGUpLlxub3B0aW9uYWwoXG5Bc3NldEtpbmRTaGFwZSxcbkRpc3BsYXlJbmZvU2hhcGUsXG5NLnNwbGl0UmVjb3JkKGhhcmRlbih7fSksaGFyZGVuKHtlbGVtZW50U2hhcGU6TS5wYXR0ZXJuKCl9KSkpLlxuXG5yZXR1cm5zKE0ucmVtb3RhYmxlKCd6b2VNaW50JykpLFxucmVnaXN0ZXJGZWVNaW50Ok0uY2FsbChLZXl3b3JkU2hhcGUsTS5yZW1vdGFibGUoJ2ZlZU1pbnRBY2Nlc3MnKSkucmV0dXJucyhcbk0ucmVtb3RhYmxlKCdmZWVNaW50JykpLFxuXG5yZXBsYWNlQWxsb2NhdGlvbnM6TS5jYWxsKFNlYXRIYW5kbGVBbGxvY2F0aW9uc1NoYXBlKS5yZXR1cm5zKCksXG5zdG9wQWNjZXB0aW5nT2ZmZXJzOk0uY2FsbCgpLnJldHVybnMoKSxcbnNldE9mZmVyRmlsdGVyOk0uY2FsbChNLmFycmF5T2YoTS5zdHJpbmcoKSkpLnJldHVybnMoKSxcbmdldE9mZmVyRmlsdGVyOk0uY2FsbCgpLnJldHVybnMoTS5hcnJheU9mKE0uc3RyaW5nKCkpKSxcbmdldEV4aXRTdWJzY3JpYmVyOk0uY2FsbChTZWF0U2hhcGUpLnJldHVybnMoU3Vic2NyaWJlclNoYXBlKSxcbmlzQmxvY2tlZDpNLmNhbGwoTS5zdHJpbmcoKSkucmV0dXJucyhNLmJvb2xlYW4oKSl9KTskaOKAjV9vbmNlLkluc3RhbmNlQWRtaW5JKEluc3RhbmNlQWRtaW5JKTtcblxuXG5jb25zdCAgICAgICAgSW5zdGFuY2VTdG9yYWdlTWFuYWdlcklLaXQ9aGFyZGVuKHtcbmluc3RhbmNlU3RvcmFnZU1hbmFnZXI6TS5pbnRlcmZhY2UoJ0luc3RhbmNlU3RvcmFnZU1hbmFnZXInLHtcbmdldFRlcm1zOk0uY2FsbCgpLnJldHVybnMoTS5zcGxpdFJlY29yZChUZXJtc1NoYXBlKSksXG5nZXRJc3N1ZXJzOk0uY2FsbCgpLnJldHVybnMoSXNzdWVyS2V5d29yZFJlY29yZFNoYXBlKSxcbmdldEJyYW5kczpNLmNhbGwoKS5yZXR1cm5zKEJyYW5kS2V5d29yZFJlY29yZFNoYXBlKSxcbmdldEluc3RhbGxhdGlvbkZvckluc3RhbmNlOk0uY2FsbCgpLnJldHVybnMoSW5zdGFsbGF0aW9uU2hhcGUpLFxuZ2V0SW52aXRhdGlvbklzc3VlcjpNLmNhbGwoKS5yZXR1cm5zKElzc3VlclNoYXBlKSxcblxuc2F2ZUlzc3VlcjpNLmNhbGwoSXNzdWVyU2hhcGUsS2V5d29yZFNoYXBlKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbm1ha2Vab2VNaW50Ok0uY2FsbChLZXl3b3JkU2hhcGUpLlxub3B0aW9uYWwoXG5Bc3NldEtpbmRTaGFwZSxcbkRpc3BsYXlJbmZvU2hhcGUsXG5NLnNwbGl0UmVjb3JkKGhhcmRlbih7fSksaGFyZGVuKHtlbGVtZW50U2hhcGU6TS5wYXR0ZXJuKCl9KSkpLlxuXG5yZXR1cm5zKE0uZXJlZihab2VNaW50U2hhcGUpKSxcbnJlZ2lzdGVyRmVlTWludDpNLmNhbGwoS2V5d29yZFNoYXBlLE0ucmVtb3RhYmxlKCdmZWVNaW50QWNjZXNzJykpLnJldHVybnMoXG5NLnJlbW90YWJsZSgnZmVlTWludCcpKSxcblxuZ2V0SW5zdGFuY2VSZWNvcmQ6TS5jYWxsKCkucmV0dXJucyhJbnN0YW5jZVJlY29yZFNoYXBlKSxcbmdldElzc3VlclJlY29yZHM6TS5jYWxsKCkucmV0dXJucyhNLmFycmF5T2YoSXNzdWVyUmVjb3JkU2hhcGUpKSxcbmdldFdpdGhkcmF3RmFjZXQ6TS5jYWxsKCkucmV0dXJucyhNLnJlbW90YWJsZSgnV2l0aGRyYXdGYWNldCcpKSxcbmluaXRJbnN0YW5jZUFkbWluOk0uY2FsbChcbkluc3RhbmNlSGFuZGxlU2hhcGUsXG5NLnJlbW90YWJsZSgnaW5zdGFuY2VBZG1pbicpKS5cbnJldHVybnMoTS5wcm9taXNlKCkpLFxuZGVsZXRlSW5zdGFuY2VBZG1pbjpNLmNhbGwoSW5zdGFuY2VBZG1pbkkpLnJldHVybnMoKSxcbm1ha2VJbnZpdGF0aW9uOk0uY2FsbChJbnZpdGF0aW9uSGFuZGxlU2hhcGUsTS5zdHJpbmcoKSkuXG5vcHRpb25hbChNLnJlY29yZCgpLE0ucGF0dGVybigpKS5cbnJldHVybnMoTS5wcm9taXNlKCkpLFxuZ2V0Um9vdDpNLmNhbGwoKS5yZXR1cm5zKE0uYW55KCkpLFxuZ2V0QWRtaW5Ob2RlOk0uY2FsbCgpLnJldHVybnMoTS5yZW1vdGFibGUoJ2FkbWluTm9kZScpKX0pLFxuXG53aXRoZHJhd0ZhY2V0Ok0uaW50ZXJmYWNlKCdXaXRoZHJhd0ZhY2V0Jyx7XG53aXRoZHJhd1BheW1lbnRzOk0uY2FsbChBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUpLnJldHVybnMoXG5QYXltZW50UEtleXdvcmRSZWNvcmRTaGFwZSl9KX0pOyRo4oCNX29uY2UuSW5zdGFuY2VTdG9yYWdlTWFuYWdlcklLaXQoSW5zdGFuY2VTdG9yYWdlTWFuYWdlcklLaXQpO1xuXG5cblxuXG5jb25zdCAgICAgICAgQnVuZGxlQ2FwU2hhcGU9TS5yZW1vdGFibGUoJ2J1bmRsZUNhcCcpOyRo4oCNX29uY2UuQnVuZGxlQ2FwU2hhcGUoQnVuZGxlQ2FwU2hhcGUpO1xuY29uc3QgICAgICAgIEJ1bmRsZVNoYXBlPU0uYW5kKFxuTS5zcGxpdFJlY29yZCh7bW9kdWxlRm9ybWF0Ok0uYW55KCl9KSxcbk0ucmVjb3JkT2YoTS5zdHJpbmcoKSxNLnN0cmluZyh7c3RyaW5nTGVuZ3RoTGltaXQ6SW5maW5pdHl9KSkpOyRo4oCNX29uY2UuQnVuZGxlU2hhcGUoQnVuZGxlU2hhcGUpO1xuXG5cbmNvbnN0ICAgICAgICBab2VTdG9yYWdlTWFuYWdlcklLaXQ9aGFyZGVuKHtcbnpvZVNlcnZpY2VEYXRhQWNjZXNzOk0uaW50ZXJmYWNlKCdab2VTZXJ2aWNlIGRhdGFBY2Nlc3MnLHtcbmdldFRlcm1zOk0uY2FsbChJbnN0YW5jZUhhbmRsZVNoYXBlKS5yZXR1cm5zKE0uc3BsaXRSZWNvcmQoVGVybXNTaGFwZSkpLFxuZ2V0SXNzdWVyczpNLmNhbGwoSW5zdGFuY2VIYW5kbGVTaGFwZSkucmV0dXJucyhJc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGUpLFxuZ2V0QnJhbmRzOk0uY2FsbChJbnN0YW5jZUhhbmRsZVNoYXBlKS5yZXR1cm5zKEJyYW5kS2V5d29yZFJlY29yZFNoYXBlKSxcbmdldEluc3RhbGxhdGlvbkZvckluc3RhbmNlOk0uY2FsbChJbnN0YW5jZUhhbmRsZVNoYXBlKS5yZXR1cm5zKFxuTS5lcmVmKE0ucmVtb3RhYmxlKCdJbnN0YWxsYXRpb24nKSkpLFxuXG5nZXRJbnZpdGF0aW9uSXNzdWVyOk0uY2FsbCgpLnJldHVybnMoSXNzdWVyU2hhcGUpLFxuXG5nZXRCdW5kbGVJREZyb21JbnN0YWxsYXRpb246TS5jYWxsKEluc3RhbGxhdGlvblNoYXBlKS5yZXR1cm5zKFxuTS5lcmVmKE0uc3RyaW5nKCkpKSxcblxuaW5zdGFsbEJ1bmRsZTpNLmNhbGwoTS5vcihJbnN0YW5jZUhhbmRsZVNoYXBlLEJ1bmRsZVNoYXBlKSkucmV0dXJucyhcbk0ucHJvbWlzZSgpKSxcblxuaW5zdGFsbEJ1bmRsZUlEOk0uY2FsbChNLnN0cmluZygpKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcblxuZ2V0UHVibGljRmFjZXQ6TS5jYWxsKEluc3RhbmNlSGFuZGxlU2hhcGUpLnJldHVybnMoXG5NLmVyZWYoTS5yZW1vdGFibGUoJ1B1YmxpY0ZhY2V0JykpKSxcblxuZ2V0T2ZmZXJGaWx0ZXI6TS5jYWxsKEluc3RhbmNlSGFuZGxlU2hhcGUpLnJldHVybnMoTS5hcnJheU9mKE0uc3RyaW5nKCkpKSxcbnNldE9mZmVyRmlsdGVyOk0uY2FsbChcbkluc3RhbmNlSGFuZGxlU2hhcGUsXG5NLmFycmF5T2YoTS5zdHJpbmcoKSkpLlxucmV0dXJucygpLFxuZ2V0UHJvcG9zYWxTaGFwZUZvckludml0YXRpb246TS5jYWxsKEludml0YXRpb25IYW5kbGVTaGFwZSkucmV0dXJucyhcbk0ub3B0KE0ucGF0dGVybigpKSl9KSxcblxuXG5tYWtlT2ZmZXJBY2Nlc3M6TS5pbnRlcmZhY2UoJ1pvZVN0b3JhZ2UgbWFrZU9mZmVyIGFjY2Vzcycse1xuZ2V0QXNzZXRLaW5kQnlCcmFuZDpNLmNhbGwoQnJhbmRTaGFwZSkucmV0dXJucyhBc3NldEtpbmRTaGFwZSksXG5nZXRJbnN0YW5jZUFkbWluOk0uY2FsbChJbnN0YW5jZUhhbmRsZVNoYXBlKS5yZXR1cm5zKFxuTS5yZW1vdGFibGUoJ2luc3RhbmNlQWRtaW4nKSksXG5cbmdldFByb3Bvc2FsU2hhcGVGb3JJbnZpdGF0aW9uOk0uY2FsbChJbnZpdGF0aW9uSGFuZGxlU2hhcGUpLnJldHVybnMoXG5NLm9wdChNLnBhdHRlcm4oKSkpLFxuXG5nZXRJbnZpdGF0aW9uSXNzdWVyOk0uY2FsbCgpLnJldHVybnMoSXNzdWVyU2hhcGUpLFxuZGVwb3NpdFBheW1lbnRzOk0uY2FsbChQcm9wb3NhbFNoYXBlLFBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlKS5yZXR1cm5zKFxuTS5wcm9taXNlKCkpfSksXG5cblxuc3RhcnRJbnN0YW5jZUFjY2VzczpNLmludGVyZmFjZSgnWm9lU3RvcmFnZSBzdGFydEluc3RhbmNlIGFjY2Vzcycse1xubWFrZVpvZUluc3RhbmNlU3RvcmFnZU1hbmFnZXI6TS5jYWxsKFxuTS5hbnkoKSxcbkluc3RhbGxhdGlvblNoYXBlLFxuTS5hbnkoKSxcbklzc3VlclBLZXl3b3JkUmVjb3JkU2hhcGUsXG5NLm9yKEluc3RhbmNlSGFuZGxlU2hhcGUsQnVuZGxlU2hhcGUpLFxuTS5vcihCdW5kbGVDYXBTaGFwZSxCdW5kbGVTaGFwZSkpLlxucmV0dXJucyhNLnByb21pc2UoKSksXG51bndyYXBJbnN0YWxsYXRpb246TS5jYWxsV2hlbihNLmVyZWYoSW5zdGFsbGF0aW9uU2hhcGUpKS5yZXR1cm5zKE0uYW55KCkpfSksXG5cbmludml0YXRpb25Jc3N1ZXJBY2Nlc3M6TS5pbnRlcmZhY2UoJ1pvZVN0b3JhZ2UgaW52aXRhdGlvbklzc3Vlcicse1xuZ2V0SW52aXRhdGlvbklzc3VlcjpNLmNhbGwoKS5yZXR1cm5zKElzc3VlclNoYXBlKX0pfSk7JGjigI1fb25jZS5ab2VTdG9yYWdlTWFuYWdlcklLaXQoWm9lU3RvcmFnZU1hbmFnZXJJS2l0KTtcblxuXG5cbmNvbnN0ICAgICAgICBab2VTZXJ2aWNlSUtpdD1oYXJkZW4oe1xuem9lU2VydmljZTpNLmludGVyZmFjZSgnWm9lU2VydmljZScse1xuaW5zdGFsbDpNLmNhbGwoTS5hbnkoKSkucmV0dXJucyhNLnByb21pc2UoKSksXG5pbnN0YWxsQnVuZGxlSUQ6TS5jYWxsKE0uc3RyaW5nKCkpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuc3RhcnRJbnN0YW5jZTpNLmNhbGwoTS5lcmVmKEluc3RhbGxhdGlvblNoYXBlKSkuXG5vcHRpb25hbChJc3N1ZXJQS2V5d29yZFJlY29yZFNoYXBlLE0uYW55KCksTS5hbnkoKSkuXG5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbm9mZmVyOk0uY2FsbChNLmVyZWYoSW52aXRhdGlvblNoYXBlKSkuXG5vcHRpb25hbChQcm9wb3NhbFNoYXBlLFBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlLE0uYW55KCkpLlxucmV0dXJucyhNLnByb21pc2UoKSksXG5zZXRPZmZlckZpbHRlcjpNLmNhbGwoXG5JbnN0YW5jZUhhbmRsZVNoYXBlLFxuTS5hcnJheU9mKE0uc3RyaW5nKCkpKS5cbnJldHVybnMoKSxcblxuZ2V0T2ZmZXJGaWx0ZXI6TS5jYWxsV2hlbihNLmF3YWl0KEluc3RhbmNlSGFuZGxlU2hhcGUpKS5yZXR1cm5zKFxuTS5hcnJheU9mKE0uc3RyaW5nKCkpKSxcblxuZ2V0SW52aXRhdGlvbklzc3VlcjpNLmNhbGwoKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbmdldEZlZUlzc3VlcjpNLmNhbGwoKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbmdldEJyYW5kczpNLmNhbGxXaGVuKE0uYXdhaXQoSW5zdGFuY2VIYW5kbGVTaGFwZSkpLnJldHVybnMoXG5CcmFuZEtleXdvcmRSZWNvcmRTaGFwZSksXG5cbmdldElzc3VlcnM6TS5jYWxsV2hlbihNLmF3YWl0KEluc3RhbmNlSGFuZGxlU2hhcGUpKS5yZXR1cm5zKFxuSXNzdWVyS2V5d29yZFJlY29yZFNoYXBlKSxcblxuZ2V0UHVibGljRmFjZXQ6TS5jYWxsV2hlbihNLmF3YWl0KEluc3RhbmNlSGFuZGxlU2hhcGUpKS5yZXR1cm5zKFxuTS5yZW1vdGFibGUoJ1B1YmxpY0ZhY2V0JykpLFxuXG5nZXRUZXJtczpNLmNhbGxXaGVuKE0uYXdhaXQoSW5zdGFuY2VIYW5kbGVTaGFwZSkpLnJldHVybnMoTS5hbnkoKSksXG5nZXRJbnN0YWxsYXRpb25Gb3JJbnN0YW5jZTpNLmNhbGxXaGVuKFxuTS5hd2FpdChJbnN0YW5jZUhhbmRsZVNoYXBlKSkuXG5yZXR1cm5zKE0uZXJlZihNLnJlbW90YWJsZSgnSW5zdGFsbGF0aW9uJykpKSxcbmdldEJ1bmRsZUlERnJvbUluc3RhbGxhdGlvbjpNLmNhbGwoSW5zdGFsbGF0aW9uU2hhcGUpLnJldHVybnMoXG5NLmVyZWYoTS5zdHJpbmcoKSkpLFxuXG5cbmdldEluc3RhbGxhdGlvbjpNLmNhbGwoTS5lcmVmKEludml0YXRpb25TaGFwZSkpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuZ2V0SW5zdGFuY2U6TS5jYWxsKE0uZXJlZihJbnZpdGF0aW9uU2hhcGUpKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbmdldENvbmZpZ3VyYXRpb246TS5jYWxsKCkucmV0dXJucyh7XG5mZWVJc3N1ZXJDb25maWc6e1xubmFtZTpNLnN0cmluZygpLFxuYXNzZXRLaW5kOiduYXQnLFxuZGlzcGxheUluZm86RGlzcGxheUluZm9TaGFwZX19KSxcblxuXG5nZXRJbnZpdGF0aW9uRGV0YWlsczpNLmNhbGwoTS5lcmVmKEludml0YXRpb25TaGFwZSkpLnJldHVybnMoTS5hbnkoKSksXG5nZXRQcm9wb3NhbFNoYXBlRm9ySW52aXRhdGlvbjpNLmNhbGwoSW52aXRhdGlvbkhhbmRsZVNoYXBlKS5yZXR1cm5zKFxuTS5vcHQoUHJvcG9zYWxTaGFwZSkpfSksXG5cblxuZmVlTWludEFjY2Vzc1JldHJpZXZlcjpNLmludGVyZmFjZSgnRmVlTWludEFjY2Vzc1JldHJpZXZlcicse1xuZ2V0Ok0uY2FsbCgpLnJldHVybnMoTS5hbnkoKSl9KX0pOyRo4oCNX29uY2UuWm9lU2VydmljZUlLaXQoWm9lU2VydmljZUlLaXQpO1xuXG5cblxuY29uc3QgICAgICAgIEFkbWluRmFjZXRJPU0uaW50ZXJmYWNlKCdaY2ZBZG1pbkZhY2V0Jyx7XG5nZXRWYXRTaHV0ZG93blByb21pc2U6TS5jYWxsKCkucmV0dXJucyhNLnByb21pc2UoKSksXG5yZXN0YXJ0Q29udHJhY3Q6TS5jYWxsKCkub3B0aW9uYWwoTS5hbnkoKSkucmV0dXJucyhNLnByb21pc2UoKSksXG51cGdyYWRlQ29udHJhY3Q6TS5jYWxsKE0uc3RyaW5nKCkpLm9wdGlvbmFsKE0uYW55KCkpLnJldHVybnMoTS5wcm9taXNlKCkpfSk7JGjigI1fb25jZS5BZG1pbkZhY2V0SShBZG1pbkZhY2V0SSk7XG5cblxuY29uc3QgICAgICAgIFNlYXREYXRhU2hhcGU9aGFyZGVuKHtcbnByb3Bvc2FsOlByb3Bvc2FsU2hhcGUsXG5pbml0aWFsQWxsb2NhdGlvbjpBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUsXG5zZWF0SGFuZGxlOlNlYXRTaGFwZX0pOyRo4oCNX29uY2UuU2VhdERhdGFTaGFwZShTZWF0RGF0YVNoYXBlKTtcblxuXG5jb25zdCAgICAgICAgSGFuZGxlT2ZmZXJJPU0uaW50ZXJmYWNlKCdIYW5kbGVPZmZlcicse1xuaGFuZGxlT2ZmZXI6TS5jYWxsKEludml0YXRpb25IYW5kbGVTaGFwZSxTZWF0RGF0YVNoYXBlKS5yZXR1cm5zKHtcbm9mZmVyUmVzdWx0UHJvbWlzZTpNLnByb21pc2UoKSxcbmV4aXRPYmo6RXhpdE9iamVjdEl9KX0pOyRo4oCNX29uY2UuSGFuZGxlT2ZmZXJJKEhhbmRsZU9mZmVySSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiS2V5d29yZFNoYXBlIjpbIktleXdvcmRTaGFwZSJdLCJJbnZpdGF0aW9uSGFuZGxlU2hhcGUiOlsiSW52aXRhdGlvbkhhbmRsZVNoYXBlIl0sIkludml0YXRpb25TaGFwZSI6WyJJbnZpdGF0aW9uU2hhcGUiXSwiSW5zdGFuY2VIYW5kbGVTaGFwZSI6WyJJbnN0YW5jZUhhbmRsZVNoYXBlIl0sIkluc3RhbGxhdGlvblNoYXBlIjpbIkluc3RhbGxhdGlvblNoYXBlIl0sIlNlYXRTaGFwZSI6WyJTZWF0U2hhcGUiXSwiQW1vdW50S2V5d29yZFJlY29yZFNoYXBlIjpbIkFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSJdLCJBbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZFNoYXBlIjpbIkFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkU2hhcGUiXSwiUGF5bWVudEtleXdvcmRSZWNvcmRTaGFwZSI6WyJQYXltZW50S2V5d29yZFJlY29yZFNoYXBlIl0sIlBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlIjpbIlBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlIl0sIklzc3VlcktleXdvcmRSZWNvcmRTaGFwZSI6WyJJc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGUiXSwiSXNzdWVyUEtleXdvcmRSZWNvcmRTaGFwZSI6WyJJc3N1ZXJQS2V5d29yZFJlY29yZFNoYXBlIl0sIkJyYW5kS2V5d29yZFJlY29yZFNoYXBlIjpbIkJyYW5kS2V5d29yZFJlY29yZFNoYXBlIl0sIklzc3VlclJlY29yZFNoYXBlIjpbIklzc3VlclJlY29yZFNoYXBlIl0sIlRlcm1zU2hhcGUiOlsiVGVybXNTaGFwZSJdLCJJbnN0YW5jZVJlY29yZFNoYXBlIjpbIkluc3RhbmNlUmVjb3JkU2hhcGUiXSwiSGFuZGxlSSI6WyJIYW5kbGVJIl0sIm1ha2VIYW5kbGVTaGFwZSI6WyJtYWtlSGFuZGxlU2hhcGUiXSwiVGltZXJTaGFwZSI6WyJUaW1lclNoYXBlIl0sIkZ1bGxQcm9wb3NhbFNoYXBlIjpbIkZ1bGxQcm9wb3NhbFNoYXBlIl0sIlByb3Bvc2FsU2hhcGUiOlsiUHJvcG9zYWxTaGFwZSJdLCJpc09uRGVtYW5kRXhpdFJ1bGUiOlsiaXNPbkRlbWFuZEV4aXRSdWxlIl0sImlzV2FpdmVkRXhpdFJ1bGUiOlsiaXNXYWl2ZWRFeGl0UnVsZSJdLCJpc0FmdGVyRGVhZGxpbmVFeGl0UnVsZSI6WyJpc0FmdGVyRGVhZGxpbmVFeGl0UnVsZSJdLCJJbnZpdGF0aW9uRWxlbWVudFNoYXBlIjpbIkludml0YXRpb25FbGVtZW50U2hhcGUiXSwiT2ZmZXJIYW5kbGVySSI6WyJPZmZlckhhbmRsZXJJIl0sIlNlYXRIYW5kbGVBbGxvY2F0aW9uc1NoYXBlIjpbIlNlYXRIYW5kbGVBbGxvY2F0aW9uc1NoYXBlIl0sIlpvZU1pbnRTaGFwZSI6WyJab2VNaW50U2hhcGUiXSwiWm9lTWludEkiOlsiWm9lTWludEkiXSwiWmNmTWludEkiOlsiWmNmTWludEkiXSwiRXhpdE9iamVjdEkiOlsiRXhpdE9iamVjdEkiXSwiRXhpdE9iamVjdFNoYXBlIjpbIkV4aXRPYmplY3RTaGFwZSJdLCJJbnN0YW5jZUFkbWluU2hhcGUiOlsiSW5zdGFuY2VBZG1pblNoYXBlIl0sIkluc3RhbmNlQWRtaW5JIjpbIkluc3RhbmNlQWRtaW5JIl0sIkluc3RhbmNlU3RvcmFnZU1hbmFnZXJJS2l0IjpbIkluc3RhbmNlU3RvcmFnZU1hbmFnZXJJS2l0Il0sIkJ1bmRsZUNhcFNoYXBlIjpbIkJ1bmRsZUNhcFNoYXBlIl0sIkJ1bmRsZVNoYXBlIjpbIkJ1bmRsZVNoYXBlIl0sIlpvZVN0b3JhZ2VNYW5hZ2VySUtpdCI6WyJab2VTdG9yYWdlTWFuYWdlcklLaXQiXSwiWm9lU2VydmljZUlLaXQiOlsiWm9lU2VydmljZUlLaXQiXSwiQWRtaW5GYWNldEkiOlsiQWRtaW5GYWNldEkiXSwiU2VhdERhdGFTaGFwZSI6WyJTZWF0RGF0YVNoYXBlIl0sIkhhbmRsZU9mZmVySSI6WyJIYW5kbGVPZmZlckkiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAfqSfx2sHAABrBwAAIAAAAEBhZ29yaWMvem9lLXYwLjI1LjMvc3JjL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIi8+Ki9cblxuLyoqXG4gKiBAdGVtcGxhdGUge3N0cmluZ30gSCAtIHRoZSBuYW1lIG9mIHRoZSBoYW5kbGVcbiAqIEB0eXBlZGVmIHtIICYgWGltcG9ydChcIkBlbmRvL21hcnNoYWxcIikuUmVtb3RhYmxlfSBIYW5kbGUgQSB0eXBlIGNvbnN0cnVjdG9yIGZvciBhbiBvcGFxdWUgdHlwZVxuICogaWRlbnRpZmllZCBieSB0aGUgSCBzdHJpbmcuIFRoaXMgdXNlcyBhbiBpbnRlcnNlY3Rpb24gdHlwZVxuICogKCdNeUhhbmRsZScgJiB7fSkgdG8gdGFnIHRoZSBoYW5kbGUncyB0eXBlIGV2ZW4gdGhvdWdoIHRoZSBhY3R1YWxcbiAqIHZhbHVlIGlzIGp1c3QgYW4gZW1wdHkgb2JqZWN0LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge3N0cmluZ30gS2V5d29yZFxuICogQHR5cGVkZWYge0hhbmRsZTwnSW52aXRhdGlvbic+fSBJbnZpdGF0aW9uSGFuZGxlIC0gYW4gb3BhcXVlIGhhbmRsZSBmb3IgYW4gaW52aXRhdGlvblxuICogQHR5cGVkZWYge1JlY29yZDxLZXl3b3JkLCBJc3N1ZXI8YW55Pj59IElzc3VlcktleXdvcmRSZWNvcmRcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8S2V5d29yZCwgRVJlZjxJc3N1ZXI8YW55Pj4+fSBJc3N1ZXJQS2V5d29yZFJlY29yZFxuICogQHR5cGVkZWYge1JlY29yZDxLZXl3b3JkLCBCcmFuZDxhbnk+Pn0gQnJhbmRLZXl3b3JkUmVjb3JkXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTdGFuZGFyZFRlcm1zXG4gKiBAcHJvcGVydHkge0lzc3VlcktleXdvcmRSZWNvcmR9IGlzc3VlcnMgLSByZWNvcmQgd2l0aFxuICoga2V5d29yZHMga2V5cywgaXNzdWVyIHZhbHVlc1xuICogQHByb3BlcnR5IHtCcmFuZEtleXdvcmRSZWNvcmR9IGJyYW5kcyAtIHJlY29yZCB3aXRoIGtleXdvcmRzXG4gKiBrZXlzLCBicmFuZCB2YWx1ZXNcbiAqXG4gKiBAdHlwZWRlZiB7U3RhbmRhcmRUZXJtcyAmIFJlY29yZDxzdHJpbmcsIGFueT59IEFueVRlcm1zXG4gKlxuICogQHR5cGVkZWYge29iamVjdH0gSW5zdGFuY2VSZWNvcmRcbiAqIEBwcm9wZXJ0eSB7SW5zdGFsbGF0aW9ufSBpbnN0YWxsYXRpb25cbiAqIEBwcm9wZXJ0eSB7WGltcG9ydChcIi4vem9lU2VydmljZS91dGlscy5qc1wiKS5JbnN0YW5jZTxhbnk+fSBpbnN0YW5jZVxuICogQHByb3BlcnR5IHtBbnlUZXJtc30gdGVybXMgLSBjb250cmFjdCBwYXJhbWV0ZXJzXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHR5cGVkZWYge29iamVjdH0gSXNzdWVyUmVjb3JkXG4gKiBAcHJvcGVydHkge0JyYW5kPEs+fSBicmFuZFxuICogQHByb3BlcnR5IHtJc3N1ZXI8Sz59IGlzc3VlclxuICogQHByb3BlcnR5IHtLfSBhc3NldEtpbmRcbiAqIEBwcm9wZXJ0eSB7RGlzcGxheUluZm88Sz59IFtkaXNwbGF5SW5mb11cbiAqXG4gKiBAdHlwZWRlZiB7QW1vdW50S2V5d29yZFJlY29yZH0gQWxsb2NhdGlvblxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtvYmplY3R9IFtSPXVua25vd25dIE9mZmVyIHJlc3VsdFxuICogQHRlbXBsYXRlIHtvYmplY3R9IFtBPW5ldmVyXSBPZmZlciBhcmdzXG4gKiBAdHlwZWRlZiB7UGF5bWVudDwnc2V0Jz59IEludml0YXRpb25cbiAqL1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA+/rD3gi4AAIIuAAArAAAAQGFnb3JpYy96b2UtdjAuMjUuMy9zcmMvem9lU2VydmljZS90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qLyA8cmVmZXJlbmNlIHR5cGVzPVwic2VzXCIvPiovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gWm9lU2VydmljZVxuICpcbiAqIFpvZSBwcm92aWRlcyBhIGZyYW1ld29yayBmb3IgZGVwbG95aW5nIGFuZCB3b3JraW5nIHdpdGggc21hcnRcbiAqIGNvbnRyYWN0cy4gSXQgaXMgYWNjZXNzZWQgYXMgYSBsb25nLWxpdmVkIGFuZCB3ZWxsLXRydXN0ZWQgc2VydmljZVxuICogdGhhdCBlbmZvcmNlcyBvZmZlciBzYWZldHkgZm9yIHRoZSBjb250cmFjdHMgdGhhdCB1c2UgaXQuIFpvZSBoYXMgYVxuICogc2luZ2xlIGBpbnZpdGF0aW9uSXNzdWVyYCBmb3IgdGhlIGVudGlyZXR5IG9mIGl0cyBsaWZldGltZS4gQnlcbiAqIGhhdmluZyBhIHJlZmVyZW5jZSB0byBab2UsIGEgdXNlciBjYW4gZ2V0IHRoZSBgaW52aXRhdGlvbklzc3VlcmBcbiAqIGFuZCB0aHVzIHZhbGlkYXRlIGFueSBgaW52aXRhdGlvbmAgdGhleSByZWNlaXZlIGZyb20gc29tZW9uZSBlbHNlLlxuICpcbiAqIFpvZSBoYXMgdHdvIGRpZmZlcmVudCBmYWNldHM6IHRoZSBwdWJsaWMgWm9lIHNlcnZpY2UgYW5kIHRoZVxuICogY29udHJhY3QgZmFjZXQgKFpDRikuIEVhY2ggY29udHJhY3QgaW5zdGFuY2UgaGFzIGEgY29weSBvZiBaQ0ZcbiAqIHdpdGhpbiBpdHMgdmF0LiBUaGUgY29udHJhY3QgYW5kIFpDRiBuZXZlciBoYXZlIGRpcmVjdCBhY2Nlc3MgdG9cbiAqIHRoZSB1c2VycycgcGF5bWVudHMgb3IgdGhlIFpvZSBwdXJzZXMuXG4gKlxuICogQHByb3BlcnR5IHtHZXRJbnZpdGF0aW9uSXNzdWVyfSBnZXRJbnZpdGF0aW9uSXNzdWVyXG4gKlxuICogWm9lIGhhcyBhIHNpbmdsZSBgaW52aXRhdGlvbklzc3VlcmAgZm9yIHRoZSBlbnRpcmV0eSBvZiBpdHNcbiAqIGxpZmV0aW1lLiBCeSBoYXZpbmcgYSByZWZlcmVuY2UgdG8gWm9lLCBhIHVzZXIgY2FuIGdldCB0aGVcbiAqIGBpbnZpdGF0aW9uSXNzdWVyYCBhbmQgdGh1cyB2YWxpZGF0ZSBhbnkgYGludml0YXRpb25gIHRoZXkgcmVjZWl2ZVxuICogZnJvbSBzb21lb25lIGVsc2UuIFRoZSBtaW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgaW52aXRhdGlvbklzc3VlclxuICogY3JlYXRlcyB0aGUgRVJUUCBwYXltZW50cyB0aGF0IHJlcHJlc2VudCB0aGUgcmlnaHQgdG8gaW50ZXJhY3Qgd2l0aFxuICogYSBzbWFydCBjb250cmFjdCBpbiBwYXJ0aWN1bGFyIHdheXMuXG4gKlxuICogQHByb3BlcnR5IHtJbnN0YWxsQnVuZGxlfSBpbnN0YWxsXG4gKiBAcHJvcGVydHkge0luc3RhbGxCdW5kbGVJRH0gaW5zdGFsbEJ1bmRsZUlEXG4gKiBAcHJvcGVydHkge1hpbXBvcnQoJy4vdXRpbHMnKS5TdGFydEluc3RhbmNlfSBzdGFydEluc3RhbmNlXG4gKiBAcHJvcGVydHkge09mZmVyfSBvZmZlclxuICogQHByb3BlcnR5IHtYaW1wb3J0KCcuL3V0aWxzJykuR2V0UHVibGljRmFjZXR9IGdldFB1YmxpY0ZhY2V0XG4gKiBAcHJvcGVydHkge0dldElzc3VlcnN9IGdldElzc3VlcnNcbiAqIEBwcm9wZXJ0eSB7R2V0QnJhbmRzfSBnZXRCcmFuZHNcbiAqIEBwcm9wZXJ0eSB7WGltcG9ydCgnLi91dGlscycpLkdldFRlcm1zfSBnZXRUZXJtc1xuICogQHByb3BlcnR5IHtHZXRPZmZlckZpbHRlcn0gZ2V0T2ZmZXJGaWx0ZXJcbiAqIEBwcm9wZXJ0eSB7U2V0T2ZmZXJGaWx0ZXJ9IHNldE9mZmVyRmlsdGVyXG4gKiBAcHJvcGVydHkge0dldEluc3RhbGxhdGlvbkZvckluc3RhbmNlfSBnZXRJbnN0YWxsYXRpb25Gb3JJbnN0YW5jZVxuICogQHByb3BlcnR5IHtHZXRJbnN0YW5jZX0gZ2V0SW5zdGFuY2VcbiAqIEBwcm9wZXJ0eSB7R2V0SW5zdGFsbGF0aW9ufSBnZXRJbnN0YWxsYXRpb25cbiAqIEBwcm9wZXJ0eSB7R2V0SW52aXRhdGlvbkRldGFpbHN9IGdldEludml0YXRpb25EZXRhaWxzXG4gKiBSZXR1cm4gYW4gb2JqZWN0IHdpdGggdGhlIGluc3RhbmNlLCBpbnN0YWxsYXRpb24sIGRlc2NyaXB0aW9uLCBpbnZpdGF0aW9uXG4gKiBoYW5kbGUsIGFuZCBhbnkgY3VzdG9tIHByb3BlcnRpZXMgc3BlY2lmaWMgdG8gdGhlIGNvbnRyYWN0LlxuICogQHByb3BlcnR5IHtHZXRGZWVJc3N1ZXJ9IGdldEZlZUlzc3VlclxuICogQHByb3BlcnR5IHtHZXRDb25maWd1cmF0aW9ufSBnZXRDb25maWd1cmF0aW9uXG4gKiBAcHJvcGVydHkge0dldEJ1bmRsZUlERnJvbUluc3RhbGxhdGlvbn0gZ2V0QnVuZGxlSURGcm9tSW5zdGFsbGF0aW9uXG4gKiBAcHJvcGVydHkgeyhpbnZpdGF0aW9uSGFuZGxlOiBJbnZpdGF0aW9uSGFuZGxlKSA9PiBQYXR0ZXJuIHwgdW5kZWZpbmVkfSBnZXRQcm9wb3NhbFNoYXBlRm9ySW52aXRhdGlvblxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEdldEludml0YXRpb25Jc3N1ZXJcbiAqIEByZXR1cm5zIHtQcm9taXNlPElzc3Vlcjwnc2V0Jz4+fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEdldEZlZUlzc3VlclxuICogQHJldHVybnMge1Byb21pc2U8SXNzdWVyPCduYXQnPj59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgR2V0Q29uZmlndXJhdGlvblxuICogQHJldHVybnMge3tcbiAqICAgZmVlSXNzdWVyQ29uZmlnOiBGZWVJc3N1ZXJDb25maWcsXG4gKiB9fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEdldElzc3VlcnNcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi91dGlscycpLkluc3RhbmNlPGFueT59IGluc3RhbmNlXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxJc3N1ZXJLZXl3b3JkUmVjb3JkPn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBHZXRCcmFuZHNcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi91dGlscycpLkluc3RhbmNlPGFueT59IGluc3RhbmNlXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxCcmFuZEtleXdvcmRSZWNvcmQ+fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEdldE9mZmVyRmlsdGVyXG4gKiBAcGFyYW0ge1hpbXBvcnQoJy4vdXRpbHMnKS5JbnN0YW5jZTxhbnk+fSBpbnN0YW5jZVxuICogQHJldHVybnMge3N0cmluZ1tdfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFNldE9mZmVyRmlsdGVyXG4gKiBAcGFyYW0ge0luc3RhbmNlfSBpbnN0YW5jZVxuICogQHBhcmFtIHtzdHJpbmdbXX0gc3RyaW5nc1xuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEdldEluc3RhbGxhdGlvbkZvckluc3RhbmNlXG4gKiBAcGFyYW0ge1hpbXBvcnQoJy4vdXRpbHMnKS5JbnN0YW5jZTxhbnk+fSBpbnN0YW5jZVxuICogQHJldHVybnMge1Byb21pc2U8SW5zdGFsbGF0aW9uPn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBHZXRJbnN0YW5jZVxuICogQHBhcmFtIHtFUmVmPEludml0YXRpb24+fSBpbnZpdGF0aW9uXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxYaW1wb3J0KCcuL3V0aWxzJykuSW5zdGFuY2U8YW55Pj59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgR2V0SW5zdGFsbGF0aW9uXG4gKiBAcGFyYW0ge0VSZWY8SW52aXRhdGlvbj59IGludml0YXRpb25cbiAqIEByZXR1cm5zIHtQcm9taXNlPEluc3RhbGxhdGlvbj59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgR2V0SW52aXRhdGlvbkRldGFpbHNcbiAqIEBwYXJhbSB7RVJlZjxJbnZpdGF0aW9uPn0gaW52aXRhdGlvblxuICogQHJldHVybnMge1Byb21pc2U8SW52aXRhdGlvbkRldGFpbHM+fVxuICovXG5cbi8qIFRPRE8gcmVtb3ZlIHN1cHBvcnQgZm9yIHNvdXJjZSBidW5kbGVzLCBsZWF2aW5nIG9ubHkgc3VwcG9ydCBmb3IgaGFzaCBidW5kbGVzLiovXG4vKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQ1NjUqL1xuLyoqXG4gKiBAY2FsbGJhY2sgSW5zdGFsbEJ1bmRsZVxuICpcbiAqIENyZWF0ZSBhbiBpbnN0YWxsYXRpb24gYnkgc2FmZWx5IGV2YWx1YXRpbmcgdGhlIGNvZGUgYW5kXG4gKiByZWdpc3RlcmluZyBpdCB3aXRoIFpvZS4gUmV0dXJucyBhbiBpbnN0YWxsYXRpb24uXG4gKlxuICogQHBhcmFtIHtCdW5kbGUgfCBTb3VyY2VCdW5kbGV9IGJ1bmRsZVxuICogQHJldHVybnMge1Byb21pc2U8SW5zdGFsbGF0aW9uPn1cbiAqL1xuXG4vKiBUT0RPIGNvbnNvbGlkYXRlIGluc3RhbGxCdW5kbGVJRCBpbnRvIGluc3RhbGwuKi9cbi8qIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNDk3NCovXG4vKipcbiAqIEBjYWxsYmFjayBJbnN0YWxsQnVuZGxlSURcbiAqXG4gKiBDcmVhdGUgYW4gaW5zdGFsbGF0aW9uIGZyb20gYSBCdW5kbGUgSUQuIFJldHVybnMgYW4gaW5zdGFsbGF0aW9uLlxuICpcbiAqIEBwYXJhbSB7QnVuZGxlSUR9IGJ1bmRsZUlEXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxJbnN0YWxsYXRpb24+fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEdldEJ1bmRsZUlERnJvbUluc3RhbGxhdGlvblxuICpcbiAqIFZlcmlmeSB0aGF0IGFuIGFsbGVnZWQgSW5zdGFsbGF0aW9uIGlzIHJlYWwsIGFuZCByZXR1cm4gdGhlIEJ1bmRsZSBJRCBpdFxuICogd2lsbCB1c2UgZm9yIGNvbnRyYWN0IGNvZGUuXG4gKlxuICogQHBhcmFtIHtFUmVmPEluc3RhbGxhdGlvbj59IGFsbGVnZWRJbnN0YWxsYXRpb25cbiAqIEByZXR1cm5zIHtQcm9taXNlPEJ1bmRsZUlEPn1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHs8QXJncywgUmVzdWx0PihcbiAqICAgaW52aXRhdGlvbjogRVJlZjxJbnZpdGF0aW9uPFJlc3VsdCwgQXJncz4+LFxuICogICBwcm9wb3NhbD86IFByb3Bvc2FsLFxuICogICBwYXltZW50S2V5d29yZFJlY29yZD86IFBheW1lbnRQS2V5d29yZFJlY29yZCxcbiAqICAgb2ZmZXJBcmdzPzogQXJncyxcbiAqICAgKSA9PiBQcm9taXNlPFVzZXJTZWF0PFJlc3VsdD4+XG4gKiB9IE9mZmVyXG4gKlxuICogVG8gcmVkZWVtIGFuIGludml0YXRpb24sIHRoZSB1c2VyIG5vcm1hbGx5IHByb3ZpZGVzIGEgcHJvcG9zYWwgKHRoZWlyXG4gKiBydWxlcyBmb3IgdGhlIG9mZmVyKSBhcyB3ZWxsIGFzIHBheW1lbnRzIHRvIGJlIGVzY3Jvd2VkIGJ5IFpvZS4gIElmXG4gKiBlaXRoZXIgdGhlIHByb3Bvc2FsIG9yIHBheW1lbnRzIHdvdWxkIGJlIGVtcHR5LCBpbmRpY2F0ZSB0aGlzIGJ5XG4gKiBvbWl0dGluZyB0aGF0IGFyZ3VtZW50IG9yIHBhc3NpbmcgdW5kZWZpbmVkLCByYXRoZXIgdGhhbiBwYXNzaW5nIGFuXG4gKiBlbXB0eSByZWNvcmQuXG4gKlxuICogVGhlIHByb3Bvc2FsIGhhcyB0aHJlZSBwYXJ0czogYHdhbnRgIGFuZCBgZ2l2ZWAgYXJlIHVzZWQgYnkgWm9lIHRvXG4gKiBlbmZvcmNlIG9mZmVyIHNhZmV0eSwgYW5kIGBleGl0YCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIHBhcnRpY3VsYXJcbiAqIHBheW91dC1saXZlbmVzcyBwb2xpY3kgdGhhdCBab2UgY2FuIGd1YXJhbnRlZS4gYHdhbnRgIGFuZCBgZ2l2ZWBcbiAqIGFyZSBvYmplY3RzIHdpdGgga2V5d29yZHMgYXMga2V5cyBhbmQgYW1vdW50cyBhcyB2YWx1ZXMuXG4gKiBgcGF5bWVudEtleXdvcmRSZWNvcmRgIGlzIGEgcmVjb3JkIHdpdGgga2V5d29yZHMgYXMga2V5cywgYW5kIHRoZVxuICogdmFsdWVzIGFyZSB0aGUgYWN0dWFsIHBheW1lbnRzIHRvIGJlIGVzY3Jvd2VkLiBBIHBheW1lbnQgaXNcbiAqIGV4cGVjdGVkIGZvciBldmVyeSBydWxlIHVuZGVyIGBnaXZlYC5cbiAqL1xuXG4vKipcbiAqIFpvZSB1c2VzIHNlYXRzIHRvIGFjY2VzcyBvciBtYW5pcHVsYXRlIG9mZmVycy4gVGhleSBsZXQgY29udHJhY3RzIGFuZCB1c2Vyc1xuICogaW50ZXJhY3Qgd2l0aCB0aGVtLiBab2UgaGFzIHR3byBraW5kcyBvZiBzZWF0cy4gWkNGU2VhdHMgYXJlIHVzZWQgd2l0aGluXG4gKiBjb250cmFjdHMgYW5kIHdpdGggemNmIG1ldGhvZHMuIFVzZXJTZWF0cyByZXByZXNlbnQgb2ZmZXJzIGV4dGVybmFsIHRvIFpvZVxuICogYW5kIHRoZSBjb250cmFjdC4gVGhlIHBhcnR5IHdobyBleGVyY2lzZXMgYW4gaW52aXRhdGlvbiBhbmQgc2VuZHMgdGhlIG9mZmVyKClcbiAqIG1lc3NhZ2UgdG8gWm9lIGdldHMgYSBVc2VyU2VhdCB0aGF0IGNhbiBjaGVjayBwYXlvdXRzJyBzdGF0dXMgb3IgcmV0cmlldmUgdGhlXG4gKiByZXN1bHQgb2YgcHJvY2Vzc2luZyB0aGUgb2ZmZXIgaW4gdGhlIGNvbnRyYWN0LiBUaGlzIHZhcmllcywgYnV0IGV4YW1wbGVzIGFyZVxuICogYSBzdHJpbmcgYW5kIGFuIGludml0YXRpb24gZm9yIGFub3RoZXIgc2VhdC5cbiAqXG4gKiBBbHNvLCBhIFVzZXJTZWF0IGNhbiBiZSBoYW5kZWQgdG8gYW4gYWdlbnQgb3V0c2lkZSBab2UgYW5kIHRoZSBjb250cmFjdCxcbiAqIGxldHRpbmcgdGhlbSBxdWVyeSBvciBtb25pdG9yIHRoZSBjdXJyZW50IHN0YXRlLCBhY2Nlc3MgdGhlIHBheW91dHMgYW5kXG4gKiByZXN1bHQsIGFuZCwgaWYgaXQncyBhbGxvd2VkIGZvciB0aGlzIHNlYXQsIGNhbGwgdHJ5RXhpdCgpLlxuICpcbiAqIFNpbmNlIGFueW9uZSBjYW4gYXR0ZW1wdCB0byBleGl0IHRoZSBzZWF0IGlmIHRoZXkgaGF2ZSBhIHJlZmVyZW5jZSB0byBpdCwgeW91XG4gKiBzaG91bGQgb25seSBzaGFyZSBhIFVzZXJTZWF0IHdpdGggdHJ1c3RlZCBwYXJ0aWVzLlxuICpcbiAqIFVzZXJTZWF0IGluY2x1ZGVzIHF1ZXJpZXMgZm9yIHRoZSBhc3NvY2lhdGVkIG9mZmVyJ3MgY3VycmVudCBzdGF0ZSBhbmQgYW5cbiAqIG9wZXJhdGlvbiB0byByZXF1ZXN0IHRoYXQgdGhlIG9mZmVyIGV4aXQsIGFzIGZvbGxvd3M6XG4gKlxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kb2NzLmFnb3JpYy5jb20vem9lL2FwaS96b2UuaHRtbCN1c2Vyc2VhdC1vYmplY3R9fVxuICogQHRlbXBsYXRlIHtvYmplY3R9IFtPUj11bmtub3duXVxuICogQHR5cGVkZWYge29iamVjdH0gVXNlclNlYXRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxQcm9wb3NhbFJlY29yZD59IGdldFByb3Bvc2FsXG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8UGF5bWVudFBLZXl3b3JkUmVjb3JkPn0gZ2V0UGF5b3V0c1xuICogcmV0dXJucyBhIHByb21pc2UgZm9yIGEgS2V5d29yZFBheW1lbnRSZWNvcmQgY29udGFpbmluZyBhbGwgdGhlIHBheW91dHMgZnJvbVxuICogdGhpcyBzZWF0LiBUaGUgcHJvbWlzZSB3aWxsIHJlc29sdmUgYWZ0ZXIgdGhlIHNlYXQgaGFzIGV4aXRlZC5cbiAqIEBwcm9wZXJ0eSB7KGtleXdvcmQ6IEtleXdvcmQpID0+IFByb21pc2U8UGF5bWVudDxhbnk+Pn0gZ2V0UGF5b3V0XG4gKiByZXR1cm5zIGEgcHJvbWlzZSBmb3IgdGhlIFBheW1lbnQgY29ycmVzcG9uZGluZyB0byB0aGUgaW5kaWNhdGVkIGtleXdvcmQuXG4gKiBUaGUgcHJvbWlzZSB3aWxsIHJlc29sdmUgYWZ0ZXIgdGhlIHNlYXQgaGFzIGV4aXRlZC5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxPUj59IGdldE9mZmVyUmVzdWx0XG4gKiBAcHJvcGVydHkgeygpID0+IHZvaWR9IFt0cnlFeGl0XVxuICogTm90ZTogT25seSB3b3JrcyBpZiB0aGUgc2VhdCdzIGBwcm9wb3NhbGAgaGFzIGFuIGBPbkRlbWFuZGAgYGV4aXRgIGNsYXVzZS4gWm9lJ3NcbiAqIG9mZmVyLXNhZmV0eSBndWFyYW50ZWUgYXBwbGllcyBubyBtYXR0ZXIgaG93IGEgc2VhdCdzIGludGVyYWN0aW9uIHdpdGggYVxuICogY29udHJhY3QgZW5kcy4gVW5kZXIgbm9ybWFsIGNpcmN1bXN0YW5jZXMsIHRoZSBwYXJ0aWNpcGFudCBtaWdodCBiZSBhYmxlIHRvXG4gKiBjYWxsIGB0cnlFeGl0KClgLCBvciB0aGUgY29udHJhY3QgbWlnaHQgZG8gc29tZXRoaW5nIGV4cGxpY2l0bHkuIE9uIGV4aXRpbmcsXG4gKiB0aGUgc2VhdCBob2xkZXIgZ2V0cyBpdHMgY3VycmVudCBgYWxsb2NhdGlvbmAgYW5kIHRoZSBgc2VhdGAgY2FuIG5vIGxvbmdlclxuICogaW50ZXJhY3Qgd2l0aCB0aGUgY29udHJhY3QuXG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8Ym9vbGVhbj59IGhhc0V4aXRlZFxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBzZWF0IGhhcyBleGl0ZWQsIGZhbHNlIGlmIGl0IGlzIHN0aWxsIGFjdGl2ZS5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTwwfDE+fSBudW1XYW50c1NhdGlzZmllZCByZXR1cm5zIDEgaWYgdGhlIHByb3Bvc2FsJ3NcbiAqIHdhbnQgY2xhdXNlIHdhcyBzYXRpc2ZpZWQgYnkgdGhlIGZpbmFsIGFsbG9jYXRpb24sIG90aGVyd2lzZSAwLiBUaGlzIGlzXG4gKiBudW1lcmljIHRvIHN1cHBvcnQgYSBwbGFubmVkIGVuaGFuY2VtZW50IGNhbGxlZCBcIm11bHRpcGxlc1wiIHdoaWNoIHdpbGwgYWxsb3dcbiAqIHRoZSByZXR1cm4gdmFsdWUgdG8gYmUgYW55IG5vbi1uZWdhdGl2ZSBudW1iZXIuIFRoZSBwcm9taXNlIHdpbGwgcmVzb2x2ZVxuICogYWZ0ZXIgdGhlIHNlYXQgaGFzIGV4aXRlZC5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxBbGxvY2F0aW9uPn0gZ2V0RmluYWxBbGxvY2F0aW9uXG4gKiByZXR1cm4gYSBwcm9taXNlIGZvciB0aGUgZmluYWwgYWxsb2NhdGlvbi4gVGhlIHByb21pc2Ugd2lsbCByZXNvbHZlIGFmdGVyIHRoZVxuICogc2VhdCBoYXMgZXhpdGVkLlxuICogQHByb3BlcnR5IHsoKSA9PiBTdWJzY3JpYmVyPGFueT59IGdldEV4aXRTdWJzY3JpYmVyIHJldHVybnMgYSBzdWJzY3JpYmVyIHRoYXRcbiAqIHdpbGwgYmUgbm90aWZpZWQgd2hlbiB0aGUgc2VhdCBoYXMgZXhpdGVkIG9yIGZhaWxlZC5cbiAqL1xuXG4vKipcbiAqXG4gKiBAdHlwZWRlZiB7UGFydGlhbDxQcm9wb3NhbFJlY29yZD59IFByb3Bvc2FsXG4gKlxuICogQHR5cGVkZWYge3tnaXZlOiBBbW91bnRLZXl3b3JkUmVjb3JkLFxuICogICAgICAgICAgICB3YW50OiBBbW91bnRLZXl3b3JkUmVjb3JkLFxuICogICAgICAgICAgICBleGl0OiBFeGl0UnVsZVxuICogICAgICAgICAgIH19IFByb3Bvc2FsUmVjb3JkXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7UmVjb3JkPEtleXdvcmQsIEFtb3VudDxhbnk+Pn0gQW1vdW50S2V5d29yZFJlY29yZFxuICpcbiAqIFRoZSBrZXlzIGFyZSBrZXl3b3JkcywgYW5kIHRoZSB2YWx1ZXMgYXJlIGFtb3VudHMuIEZvciBleGFtcGxlOlxuICogeyBBc3NldDogQW1vdW50TWF0aC5tYWtlKGFzc2V0QnJhbmQsIDVuKSwgUHJpY2U6XG4gKiBBbW91bnRNYXRoLm1ha2UocHJpY2VCcmFuZCwgOW4pIH1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFdha2VyXG4gKiBAcHJvcGVydHkgeygpID0+IHZvaWR9IHdha2VcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtUaW1lc3RhbXB9IERlYWRsaW5lXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBUaW1lclxuICogQHByb3BlcnR5IHsoZGVhZGxpbmU6IERlYWRsaW5lLCB3YWtlclA6IEVSZWY8V2FrZXI+KSA9PiB2b2lkfSBzZXRXYWtldXBcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IE9uRGVtYW5kRXhpdFJ1bGVcbiAqIEBwcm9wZXJ0eSB7bnVsbH0gb25EZW1hbmRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFdhaXZlZEV4aXRSdWxlXG4gKiBAcHJvcGVydHkge251bGx9IHdhaXZlZFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQWZ0ZXJEZWFkbGluZUV4aXRSdWxlXG4gKiBAcHJvcGVydHkge3t0aW1lcjpUaW1lciwgZGVhZGxpbmU6RGVhZGxpbmV9fSBhZnRlckRlYWRsaW5lXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T25EZW1hbmRFeGl0UnVsZSB8IFdhaXZlZEV4aXRSdWxlIHwgQWZ0ZXJEZWFkbGluZUV4aXRSdWxlfSBFeGl0UnVsZVxuICpcbiAqIFRoZSBwb3NzaWJsZSBrZXlzIGFyZSAnd2FpdmVkJywgJ29uRGVtYW5kJywgYW5kICdhZnRlckRlYWRsaW5lJy5cbiAqIGB0aW1lcmAgYW5kIGBkZWFkbGluZWAgb25seSBhcmUgdXNlZCBmb3IgdGhlIGBhZnRlckRlYWRsaW5lYCBrZXkuXG4gKiBUaGUgcG9zc2libGUgcmVjb3JkcyBhcmU6XG4gKiBgeyB3YWl2ZWQ6IG51bGwgfWBcbiAqIGB7IG9uRGVtYW5kOiBudWxsIH1gXG4gKiBgeyBhZnRlckRlYWRsaW5lOiB7IHRpbWVyIDpUaW1lcjxEZWFkbGluZT4sIGRlYWRsaW5lIDpEZWFkbGluZSB9IH1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3V0aWxzJykuSW5zdGFuY2U8YW55Pn0gSW5zdGFuY2VcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFZhdEFkbWluU3ZjXG4gKiBAcHJvcGVydHkgeyhpZDogQnVuZGxlSUQpID0+IEVSZWY8WGltcG9ydCgnQGFnb3JpYy9zd2luZ3NldC12YXQnKS5CdW5kbGVDYXA+fSB3YWl0Rm9yQnVuZGxlQ2FwXG4gKiBAcHJvcGVydHkgeyhpZDogQnVuZGxlSUQpID0+IEVSZWY8WGltcG9ydCgnQGFnb3JpYy9zd2luZ3NldC12YXQnKS5CdW5kbGVDYXA+fSBnZXRCdW5kbGVDYXBcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZykgPT4gRVJlZjxYaW1wb3J0KCdAYWdvcmljL3N3aW5nc2V0LXZhdCcpLkJ1bmRsZUNhcD59IGdldE5hbWVkQnVuZGxlQ2FwXG4gKiBAcHJvcGVydHkgeyhidW5kbGVDYXA6IFhpbXBvcnQoJ0BhZ29yaWMvc3dpbmdzZXQtdmF0JykuQnVuZGxlQ2FwLCBvcHRpb25zPzogUmVjb3JkPHN0cmluZywgYW55PikgPT4gRVJlZjxSb290QW5kQWRtaW5Ob2RlPn0gY3JlYXRlVmF0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7e2J1bmRsZUNhcDogWGltcG9ydCgnQGFnb3JpYy9zd2luZ3NldC12YXQnKS5CdW5kbGVDYXAgfSB8IHtuYW1lOiBzdHJpbmd9IHwge2lkOiBCdW5kbGVJRH19IFpDRlNwZWNcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBTb3VyY2VCdW5kbGVcbiAqIE9wYXF1ZSB0eXBlIGZvciBhIEpTT05hYmxlIHNvdXJjZSBidW5kbGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8S2V5d29yZCxFUmVmPFBheW1lbnQ8YW55Pj4+fSBQYXltZW50UEtleXdvcmRSZWNvcmRcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8S2V5d29yZCxQYXltZW50PGFueT4+fSBQYXltZW50S2V5d29yZFJlY29yZFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU3RhbmRhcmRJbnZpdGF0aW9uRGV0YWlsc1xuICogQHByb3BlcnR5IHtJbnN0YWxsYXRpb259IGluc3RhbGxhdGlvblxuICogQHByb3BlcnR5IHtYaW1wb3J0KCcuL3V0aWxzJykuSW5zdGFuY2U8YW55Pn0gaW5zdGFuY2VcbiAqIEBwcm9wZXJ0eSB7SW52aXRhdGlvbkhhbmRsZX0gaGFuZGxlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGVzY3JpcHRpb25cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtTdGFuZGFyZEludml0YXRpb25EZXRhaWxzICYgUmVjb3JkPHN0cmluZywgYW55Pn0gSW52aXRhdGlvbkRldGFpbHNcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBbU0Y9YW55XSBjb250cmFjdCBzdGFydCBmdW5jdGlvblxuICogQHR5cGVkZWYge1hpbXBvcnQoJy4vdXRpbHMnKS5JbnN0YWxsYXRpb248U0Y+fSBJbnN0YWxsYXRpb25cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7SW5zdGFsbGF0aW9ufSBJXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnLi91dGlscycpLkluc3RhbGxhdGlvblN0YXJ0PEk+fSBJbnN0YWxsYXRpb25TdGFydFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRmVlSXNzdWVyQ29uZmlnXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZVxuICogQHByb3BlcnR5IHtBc3NldEtpbmR9IGFzc2V0S2luZFxuICogQHByb3BlcnR5IHtEaXNwbGF5SW5mb30gZGlzcGxheUluZm9cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFpvZUZlZXNDb25maWdcbiAqIEBwcm9wZXJ0eSB7TmF0VmFsdWV9IGdldFB1YmxpY0ZhY2V0RmVlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7SGFuZGxlPCdmZWVNaW50QWNjZXNzJz59IEZlZU1pbnRBY2Nlc3NcbiAqL1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC/lfXyqRQAAKkUAAAiAAAAQGFnb3JpYy96b2UtdjAuMjUuMy90b29scy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUHJpY2VRdW90ZVxuICogQHByb3BlcnR5IHtBbW91bnQ8J3NldCc+fSBxdW90ZUFtb3VudFxuICogQW1vdW50IHdob3NlIHZhbHVlIGlzIGEgUHJpY2VRdW90ZVZhbHVlXG4gKiBAcHJvcGVydHkge0VSZWY8UGF5bWVudDwnc2V0Jz4+fSBxdW90ZVBheW1lbnRcbiAqIFRoZSBgcXVvdGVBbW91bnRgIHdyYXBwZWQgYXMgYSBwYXltZW50XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7W1ByaWNlRGVzY3JpcHRpb25dfSBQcmljZVF1b3RlVmFsdWVcbiAqIEEgc2luZ2xlLXZhbHVlZCBzZXQgb2YgUHJpY2VEZXNjcmlwdGlvbnMuICBUaGlzIGlzIHRoZSBgdmFsdWVgIGluXG4gKiBQcmljZVF1b3RlLnF1b3RlQW1vdW50IChgeyBicmFuZCwgdmFsdWU6IFByaWNlUXVvdGVWYWx1ZSB9YCkuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQcmljZURlc2NyaXB0aW9uXG4gKiBBIGRlc2NyaXB0aW9uIG9mIGEgc2luZ2xlIHF1b3RlXG4gKiBAcHJvcGVydHkge0Ftb3VudH0gYW1vdW50SW5cbiAqIFRoZSBhbW91bnQgc3VwcGxpZWQgdG8gYSB0cmFkZVxuICogQHByb3BlcnR5IHtBbW91bnR9IGFtb3VudE91dFxuICogVGhlIHF1b3RlZCByZXN1bHQgb2YgdHJhZGluZyBgYW1vdW50SW5gXG4gKiBAcHJvcGVydHkge1RpbWVyU2VydmljZX0gdGltZXJcbiAqIFRoZSBzZXJ2aWNlIHRoYXQgZ2F2ZSB0aGUgYHRpbWVzdGFtcGBcbiAqIEBwcm9wZXJ0eSB7VGltZXN0YW1wfSB0aW1lc3RhbXBcbiAqIEEgdGltZXN0YW1wIGFjY29yZGluZyB0byBgdGltZXJgIGZvciB0aGUgcXVvdGVcbiAqIEBwcm9wZXJ0eSB7YW55PX0gY29uZGl0aW9uc1xuICogQWRkaXRpb25hbCBjb25kaXRpb25zIGZvciB0aGUgcXVvdGVcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBQcmljZVF1b3RlQ3JlYXRlXG4gKiBAcGFyYW0ge1ByaWNlUXVlcnl9IHByaWNlUXVlcnlcbiAqIEByZXR1cm5zIHtFUmVmPFByaWNlUXVvdGU+IHwgdW5kZWZpbmVkfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFByaWNlUXVvdGVUcmlnZ2VyXG4gKiBAcGFyYW0ge1ByaWNlUXVvdGVDcmVhdGV9IGNyZWF0ZVF1b3RlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQcmljZUF1dGhvcml0eUFkbWluXG4gKiBAcHJvcGVydHkgeyhjcmVhdGVRdW90ZTogUHJpY2VRdW90ZUNyZWF0ZSkgPT4gUHJvbWlzZTx2b2lkPn0gZmlyZVRyaWdnZXJzXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQcmljZUF1dGhvcml0eUtpdFxuICogQHByb3BlcnR5IHtQcmljZUF1dGhvcml0eX0gcHJpY2VBdXRob3JpdHlcbiAqIEBwcm9wZXJ0eSB7UHJpY2VBdXRob3JpdHlBZG1pbn0gYWRtaW5GYWNldFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gTXV0YWJsZVF1b3RlXG4gKiBAcHJvcGVydHkgeyhyZWFzb24/OiBhbnkpID0+IHZvaWR9IGNhbmNlbFxuICogQHByb3BlcnR5IHsoYW1vdW50SW46IEFtb3VudDwnbmF0Jz4sIGFtb3VudE91dDogQW1vdW50PCduYXQnPikgPT4gdm9pZH0gdXBkYXRlTGV2ZWxcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gRVJlZjxQcmljZVF1b3RlPn0gZ2V0UHJvbWlzZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUHJpY2VBdXRob3JpdHlcbiAqIEFuIG9iamVjdCB0aGF0IG1pbnRzIFByaWNlUXVvdGVzIGFuZCBoYW5kbGVzXG4gKiB0cmlnZ2VycyBhbmQgbm90aWZpZXJzIGZvciBjaGFuZ2VzIGluIHRoZSBwcmljZVxuICpcbiAqIEBwcm9wZXJ0eSB7KGJyYW5kSW46IEJyYW5kLCBicmFuZE91dDogQnJhbmQpID0+IEVSZWY8SXNzdWVyPCdzZXQnPj59IGdldFF1b3RlSXNzdWVyXG4gKiBHZXQgdGhlIEVSVFAgaXNzdWVyIG9mIFByaWNlUXVvdGVzIGZvciBhIGdpdmVuIGJyYW5kSW4vYnJhbmRPdXQgcGFpclxuICpcbiAqIEBwcm9wZXJ0eSB7KGJyYW5kSW46IEJyYW5kLFxuICogICAgICAgICAgICAgYnJhbmRPdXQ6IEJyYW5kXG4gKiApID0+IEVSZWY8VGltZXJTZXJ2aWNlPn0gZ2V0VGltZXJTZXJ2aWNlXG4gKiBHZXQgdGhlIHRpbWVyIHVzZWQgaW4gUHJpY2VRdW90ZXMgZm9yIGEgZ2l2ZW4gYnJhbmRJbi9icmFuZE91dCBwYWlyXG4gKlxuICogQHByb3BlcnR5IHsoYW1vdW50SW46IEFtb3VudDwnbmF0Jz4sXG4gKiAgICAgICAgICAgICBicmFuZE91dDogQnJhbmQ8J25hdCc+XG4gKiAgICAgICAgICAgICkgPT4gRVJlZjxOb3RpZmllcjxQcmljZVF1b3RlPj59IG1ha2VRdW90ZU5vdGlmaWVyXG4gKiBCZSBub3RpZmllZCBvZiB0aGUgbGF0ZXN0IFByaWNlUXVvdGVzIGZvciBhIGdpdmVuXG4gKiBgYW1vdW50SW5gLiAgVGhlIHJhdGUgYXQgd2hpY2ggdGhlc2UgYXJlIGlzc3VlZCBtYXkgYmUgdmVyeSBkaWZmZXJlbnQgYmV0d2VlblxuICogYHByaWNlQXV0aG9yaXRpZXNgLlxuICpcbiAqIEBwcm9wZXJ0eSB7KGRlYWRsaW5lOiBUaW1lc3RhbXAsXG4gKiAgICAgICAgICAgICBhbW91bnRJbjogQW1vdW50PCduYXQnPixcbiAqICAgICAgICAgICAgIGJyYW5kT3V0OiBCcmFuZDwnbmF0Jz5cbiAqICkgPT4gUHJvbWlzZTxQcmljZVF1b3RlPn0gcXVvdGVBdFRpbWVcbiAqIFJlc29sdmVzIGFmdGVyIGBkZWFkbGluZWAgcGFzc2VzIG9uIHRoZVxuICogcHJpY2VBdXRob3JpdHkncyB0aW1lclNlcnZpY2Ugd2l0aCB0aGUgcHJpY2UgcXVvdGUgb2YgYGFtb3VudEluYCBhdCB0aGF0IHRpbWVcbiAqXG4gKiBAcHJvcGVydHkgeyhhbW91bnRJbjogQW1vdW50PCduYXQnPixcbiAqICAgICAgICAgICAgIGJyYW5kT3V0OiBCcmFuZDwnbmF0Jz5cbiAqICkgPT4gUHJvbWlzZTxQcmljZVF1b3RlPn0gcXVvdGVHaXZlblxuICogR2V0IGEgcXVvdGUgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGFtb3VudEluXG4gKlxuICogQHByb3BlcnR5IHsoYnJhbmRJbjogQnJhbmQ8J25hdCc+LFxuICogICAgICAgICAgICAgYW1vdW50T3V0OiBBbW91bnQ8J25hdCc+KSA9PiBQcm9taXNlPFByaWNlUXVvdGU+fSBxdW90ZVdhbnRlZFxuICogR2V0IGEgcXVvdGUgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGFtb3VudE91dFxuICpcbiAqIEBwcm9wZXJ0eSB7KGFtb3VudEluOiBBbW91bnQ8J25hdCc+LFxuICogICAgICAgICAgICAgYW1vdW50T3V0TGltaXQ6IEFtb3VudDwnbmF0Jz5cbiAqICkgPT4gUHJvbWlzZTxQcmljZVF1b3RlPn0gcXVvdGVXaGVuR1RcbiAqIFJlc29sdmUgd2hlbiBhIHByaWNlIHF1b3RlIG9mIGBhbW91bnRJbmAgZXhjZWVkcyBgYW1vdW50T3V0TGltaXRgXG4gKlxuICogQHByb3BlcnR5IHsoYW1vdW50SW46IEFtb3VudDwnbmF0Jz4sXG4gKiAgICAgICAgICAgICBhbW91bnRPdXRMaW1pdDogQW1vdW50PCduYXQnPlxuICogKSA9PiBQcm9taXNlPFByaWNlUXVvdGU+fSBxdW90ZVdoZW5HVEVcbiAqIFJlc29sdmUgd2hlbiBhIHByaWNlIHF1b3RlIG9mIGBhbW91bnRJbmAgcmVhY2hlcyBvciBleGNlZWRzIGBhbW91bnRPdXRMaW1pdGBcbiAqXG4gKiBAcHJvcGVydHkgeyhhbW91bnRJbjogQW1vdW50LFxuICogICAgICAgICAgICAgYW1vdW50T3V0TGltaXQ6IEFtb3VudFxuICogKSA9PiBQcm9taXNlPFByaWNlUXVvdGU+fSBxdW90ZVdoZW5MVEVcbiAqIFJlc29sdmUgd2hlbiBhIHByaWNlIHF1b3RlIG9mIGBhbW91bnRJbmAgcmVhY2hlcyBvciBkcm9wcyBiZWxvd1xuICogYGFtb3VudE91dExpbWl0YFxuICpcbiAqIEBwcm9wZXJ0eSB7KGFtb3VudEluOiBBbW91bnQsXG4gKiAgICAgICAgICAgICBhbW91bnRPdXRMaW1pdDogQW1vdW50XG4gKiApID0+IFByb21pc2U8UHJpY2VRdW90ZT59IHF1b3RlV2hlbkxUXG4gKiBSZXNvbHZlIHdoZW4gdGhlIHByaWNlIHF1b3RlIG9mIGBhbW91bnRJbmAgZHJvcHMgYmVsb3cgYGFtb3VudE91dExpbWl0YFxuICpcbiAqIEBwcm9wZXJ0eSB7KGFtb3VudEluOiBBbW91bnQsXG4gKiAgICAgICAgICAgICBhbW91bnRPdXRMaW1pdDogQW1vdW50XG4gKiApID0+IEVSZWY8TXV0YWJsZVF1b3RlPn0gbXV0YWJsZVF1b3RlV2hlbkdUXG4gKiBSZXNvbHZlIHdoZW4gYSBwcmljZSBxdW90ZSBvZiBgYW1vdW50SW5gIGV4Y2VlZHMgYGFtb3VudE91dExpbWl0YFxuICpcbiAqIEBwcm9wZXJ0eSB7KGFtb3VudEluOiBBbW91bnQsXG4gKiAgICAgICAgICAgICBhbW91bnRPdXRMaW1pdDogQW1vdW50XG4gKiApID0+IEVSZWY8TXV0YWJsZVF1b3RlPn0gbXV0YWJsZVF1b3RlV2hlbkdURVxuICogUmVzb2x2ZSB3aGVuIGEgcHJpY2UgcXVvdGUgb2YgYGFtb3VudEluYCByZWFjaGVzIG9yIGV4Y2VlZHNcbiAqIGBhbW91bnRPdXRMaW1pdGBcbiAqXG4gKiBAcHJvcGVydHkgeyhhbW91bnRJbjogQW1vdW50LFxuICogICAgICAgICAgICAgYW1vdW50T3V0TGltaXQ6IEFtb3VudFxuICogKSA9PiBFUmVmPE11dGFibGVRdW90ZT59IG11dGFibGVRdW90ZVdoZW5MVEVcbiAqIFJlc29sdmUgd2hlbiBhIHByaWNlIHF1b3RlIG9mIGBhbW91bnRJbmAgcmVhY2hlcyBvciBkcm9wcyBiZWxvd1xuICogYGFtb3VudE91dExpbWl0YFxuICpcbiAqIEBwcm9wZXJ0eSB7KGFtb3VudEluOiBBbW91bnQsXG4gKiAgICAgICAgICAgICBhbW91bnRPdXRMaW1pdDogQW1vdW50XG4gKiApID0+IEVSZWY8TXV0YWJsZVF1b3RlPn0gbXV0YWJsZVF1b3RlV2hlbkxUXG4gKiBSZXNvbHZlIHdoZW4gdGhlIHByaWNlIHF1b3RlIG9mIGBhbW91bnRJbmAgZHJvcHMgYmVsb3cgYGFtb3VudE91dExpbWl0YFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyhhbW91bnQ6IEFtb3VudDwnbmF0Jz4pID0+IEFtb3VudDwnbmF0Jz59IFByaWNlQ2FsY3VsYXRvclxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFByaWNlUXVlcnlcbiAqIEBwYXJhbSB7UHJpY2VDYWxjdWxhdG9yfSBjYWxjQW1vdW50SW5cbiAqIEBwYXJhbSB7UHJpY2VDYWxjdWxhdG9yfSBjYWxjQW1vdW50T3V0XG4gKiBAcmV0dXJucyB7eyBhbW91bnRJbjogQW1vdW50PCduYXQnPiwgYW1vdW50T3V0OiBBbW91bnQ8J25hdCc+LCB0aW1lc3RhbXA/OiBUaW1lc3RhbXAgfT19XG4gKi9cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA+g/tX+sRAADrEQAAJAAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTYuOC9zcmMvRS5qc3siaW1wb3J0cyI6WyIuL3RyYWNrLXR1cm5zLmpzIl0sImV4cG9ydHMiOlsiZGVmYXVsdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCB0cmFja1R1cm5zOyRo4oCNX2ltcG9ydHMoW1tcIi4vdHJhY2stdHVybnMuanNcIiwgW1tcInRyYWNrVHVybnNcIiwgWyRo4oCNX2EgPT4gKHRyYWNrVHVybnMgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG4vKi8gPHJlZmVyZW5jZSBwYXRoPVwiaW5kZXguZC50c1wiIC8+Ki9cblxuY29uc3R7ZGV0YWlsczpYLHF1b3RlOnF9PWFzc2VydDtcblxuLyoqIEB0eXBlIHtQcm94eUhhbmRsZXI8YW55Pn0gKi9cbmNvbnN0IGJhc2VGcmVlemFibGVQcm94eUhhbmRsZXI9e1xuc2V0KF90YXJnZXQsX3Byb3AsX3ZhbHVlKXtcbnJldHVybiBmYWxzZTtcbiB9LFxuaXNFeHRlbnNpYmxlKF90YXJnZXQpe1xucmV0dXJuIGZhbHNlO1xuIH0sXG5zZXRQcm90b3R5cGVPZihfdGFyZ2V0LF92YWx1ZSl7XG5yZXR1cm4gZmFsc2U7XG4gfSxcbmRlbGV0ZVByb3BlcnR5KF90YXJnZXQsX3Byb3Ape1xucmV0dXJuIGZhbHNlO1xuIH19O1xuXG5cbi8qIEUgUHJveHkgaGFuZGxlcnMgcHJldGVuZCB0aGF0IGFueSBwcm9wZXJ0eSBleGlzdHMgb24gdGhlIHRhcmdldCBhbmQgcmV0dXJucyovXG4vKiBhIGZ1bmN0aW9uIGZvciB0aGVpciB2YWx1ZS4gV2hpbGUgdGhpcyBmdW5jdGlvbiBpcyBcImJvdW5kXCIgYnkgY29udGV4dCwgaXQgaXMqL1xuLyogbWVhbnQgdG8gYmUgY2FsbGVkIGFzIGEgbWV0aG9kLiBGb3IgdGhhdCByZWFzb24sIHRoZSByZXR1cm5lZCBmdW5jdGlvbiovXG4vKiBpbmNsdWRlcyBhIGNoZWNrIHRoYXQgdGhlIGB0aGlzYCBhcmd1bWVudCBjb3JyZXNwb25kcyB0byB0aGUgaW5pdGlhbCovXG4vKiByZWNlaXZlciB3aGVuIHRoZSBmdW5jdGlvbiB3YXMgcmV0cmlldmVkLiovXG4vKiBFIFByb3h5IGhhbmRsZXJzIGFsc28gZm9yd2FyZCBkaXJlY3QgY2FsbHMgdG8gdGhlIHRhcmdldCBpbiBjYXNlIHRoZSByZW1vdGUqL1xuLyogaXMgYSBmdW5jdGlvbiBpbnN0ZWFkIG9mIGFuIG9iamVjdC4gTm8gc3VjaCByZWNlaXZlciBjaGVja3MgYXJlIG5lY2Vzc2FyeSBpbiovXG4vKiB0aGF0IGNhc2UuKi9cblxuLyoqXG4gKiBBIFByb3h5IGhhbmRsZXIgZm9yIEUoeCkuXG4gKlxuICogQHBhcmFtIHsqfSB4IEFueSB2YWx1ZSBwYXNzZWQgdG8gRSh4KVxuICogQHBhcmFtIHtYaW1wb3J0KCcuL2luZGV4JykuSGFuZGxlZFByb21pc2VDb25zdHJ1Y3Rvcn0gSGFuZGxlZFByb21pc2VcbiAqIEByZXR1cm5zIHtQcm94eUhhbmRsZXJ9IHRoZSBQcm94eSBoYW5kbGVyXG4gKi9cbmZ1bmN0aW9uIEVQcm94eUhhbmRsZXIoeCxIYW5kbGVkUHJvbWlzZSl7XG5yZXR1cm4gaGFyZGVuKHtcbi4uLmJhc2VGcmVlemFibGVQcm94eUhhbmRsZXIsXG5nZXQoX3RhcmdldCxwLHJlY2VpdmVyKXtcbnJldHVybiBoYXJkZW4oXG57XG4vKiBUaGlzIGZ1bmN0aW9uIHB1cnBvc2VseSBjaGVja3MgdGhlIGB0aGlzYCB2YWx1ZSAoc2VlIGFib3ZlKSovXG4vKiBJbiBvcmRlciB0byBiZSBgdGhpc2Agc2Vuc2l0aXZlIGl0IGlzIGRlZmluZWQgdXNpbmcgY29uY2lzZSBtZXRob2QqL1xuLyogc3ludGF4IHJhdGhlciB0aGFuIGFzIGFuIGFycm93IGZ1bmN0aW9uLiBUbyBlbnN1cmUgdGhlIGZ1bmN0aW9uKi9cbi8qIGlzIG5vdCBjb25zdHJ1Y3RhYmxlLCBpdCBhbHNvIGF2b2lkcyB0aGUgYGZ1bmN0aW9uYCBzeW50YXguKi9cbltwXSguLi5hcmdzKXtcbmlmKHRoaXMhPT1yZWNlaXZlcil7XG4vKiBSZWplY3QgdGhlIGFzeW5jIGZ1bmN0aW9uIGNhbGwqL1xucmV0dXJuIEhhbmRsZWRQcm9taXNlLnJlamVjdChcbmFzc2VydC5lcnJvcihcblggYFVuZXhwZWN0ZWQgcmVjZWl2ZXIgZm9yIFwiJHtwfVwiIG1ldGhvZCBvZiBFKCR7cSh4KX0pYCkpO1xuXG5cbiB9XG5cbnJldHVybiBIYW5kbGVkUHJvbWlzZS5hcHBseU1ldGhvZCh4LHAsYXJncyk7XG4gfVxuLyogQHRzLWV4cGVjdC1lcnJvciBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzUwMzE5Ki99W1xucF0pO1xuXG4gfSxcbmFwcGx5KF90YXJnZXQsX3RoaXNBcmcsYXJnQXJyYXk9W10pe1xucmV0dXJuIEhhbmRsZWRQcm9taXNlLmFwcGx5RnVuY3Rpb24oeCxhcmdBcnJheSk7XG4gfSxcbmhhcyhfdGFyZ2V0LF9wKXtcbi8qIFdlIGp1c3QgcHJldGVuZCBldmVyeXRoaW5nIGV4aXN0cy4qL1xucmV0dXJuIHRydWU7XG4gfX0pO1xuXG4gfVxuXG4vKipcbiAqIEEgUHJveHkgaGFuZGxlciBmb3IgRS5zZW5kT25seSh4KVxuICogSXQgaXMgYSB2YXJpYW50IG9uIHRoZSBFKHgpIFByb3h5IGhhbmRsZXIuXG4gKlxuICogQHBhcmFtIHsqfSB4IEFueSB2YWx1ZSBwYXNzZWQgdG8gRS5zZW5kT25seSh4KVxuICogQHBhcmFtIHtYaW1wb3J0KCcuL2luZGV4JykuSGFuZGxlZFByb21pc2VDb25zdHJ1Y3Rvcn0gSGFuZGxlZFByb21pc2VcbiAqIEByZXR1cm5zIHtQcm94eUhhbmRsZXJ9IHRoZSBQcm94eSBoYW5kbGVyXG4gKi9cbmZ1bmN0aW9uIEVzZW5kT25seVByb3h5SGFuZGxlcih4LEhhbmRsZWRQcm9taXNlKXtcbnJldHVybiBoYXJkZW4oe1xuLi4uYmFzZUZyZWV6YWJsZVByb3h5SGFuZGxlcixcbmdldChfdGFyZ2V0LHAscmVjZWl2ZXIpe1xucmV0dXJuIGhhcmRlbihcbntcbi8qIFRoaXMgZnVuY3Rpb24gcHVycG9zZWx5IGNoZWNrcyB0aGUgYHRoaXNgIHZhbHVlIChzZWUgYWJvdmUpKi9cbi8qIEluIG9yZGVyIHRvIGJlIGB0aGlzYCBzZW5zaXRpdmUgaXQgaXMgZGVmaW5lZCB1c2luZyBjb25jaXNlIG1ldGhvZCovXG4vKiBzeW50YXggcmF0aGVyIHRoYW4gYXMgYW4gYXJyb3cgZnVuY3Rpb24uIFRvIGVuc3VyZSB0aGUgZnVuY3Rpb24qL1xuLyogaXMgbm90IGNvbnN0cnVjdGFibGUsIGl0IGFsc28gYXZvaWRzIHRoZSBgZnVuY3Rpb25gIHN5bnRheC4qL1xuW3BdKC4uLmFyZ3Mpe1xuLyogVGhyb3cgc2luY2UgdGhlIGZ1bmN0aW9uIHJldHVybnMgbm90aGluZyovXG5hc3NlcnQuZXF1YWwoXG50aGlzLFxucmVjZWl2ZXIsXG5YIGBVbmV4cGVjdGVkIHJlY2VpdmVyIGZvciBcIiR7cH1cIiBtZXRob2Qgb2YgRS5zZW5kT25seSgke3EoeCl9KWApO1xuXG5IYW5kbGVkUHJvbWlzZS5hcHBseU1ldGhvZFNlbmRPbmx5KHgscCxhcmdzKTtcbnJldHVybiB1bmRlZmluZWQ7XG4gfVxuLyogQHRzLWV4cGVjdC1lcnJvciBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzUwMzE5Ki99W1xucF0pO1xuXG4gfSxcbmFwcGx5KF90YXJnZXQsX3RoaXNBcmcsYXJnc0FycmF5PVtdKXtcbkhhbmRsZWRQcm9taXNlLmFwcGx5RnVuY3Rpb25TZW5kT25seSh4LGFyZ3NBcnJheSk7XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH0sXG5oYXMoX3RhcmdldCxfcCl7XG4vKiBXZSBqdXN0IHByZXRlbmQgdGhhdCBldmVyeXRoaW5nIGV4aXN0cy4qL1xucmV0dXJuIHRydWU7XG4gfX0pO1xuXG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi9pbmRleCcpLkhhbmRsZWRQcm9taXNlQ29uc3RydWN0b3J9IEhhbmRsZWRQcm9taXNlXG4gKiBAcmV0dXJucyB7WGltcG9ydCgnLi9pbmRleCcpLkVQcm94eX1cbiAqL1xuZnVuY3Rpb24gICAgICAgICAgICAgICAgbWFrZUUoSGFuZGxlZFByb21pc2Upe1xuZnVuY3Rpb24gRSh4KXtcbmNvbnN0IGhhbmRsZXI9RVByb3h5SGFuZGxlcih4LEhhbmRsZWRQcm9taXNlKTtcbnJldHVybiBoYXJkZW4obmV3IFByb3h5KCgpPT57IH0saGFuZGxlcikpO1xuIH1cblxuY29uc3QgbWFrZUVHZXR0ZXJQcm94eT0oeCk9PlxubmV3IFByb3h5KE9iamVjdC5jcmVhdGUobnVsbCkse1xuLi4uYmFzZUZyZWV6YWJsZVByb3h5SGFuZGxlcixcbmhhcyhfdGFyZ2V0LF9wcm9wKXtcbnJldHVybiB0cnVlO1xuIH0sXG5nZXQoX3RhcmdldCxwcm9wKXtcbnJldHVybiBIYW5kbGVkUHJvbWlzZS5nZXQoeCxwcm9wKTtcbiB9fSk7XG5cblxuRS5nZXQ9bWFrZUVHZXR0ZXJQcm94eTtcbkUucmVzb2x2ZT1IYW5kbGVkUHJvbWlzZS5yZXNvbHZlO1xuRS5zZW5kT25seT0oeCk9PntcbmNvbnN0IGhhbmRsZXI9RXNlbmRPbmx5UHJveHlIYW5kbGVyKHgsSGFuZGxlZFByb21pc2UpO1xucmV0dXJuIGhhcmRlbihuZXcgUHJveHkoKCk9PnsgfSxoYW5kbGVyKSk7XG4gfTtcblxuRS53aGVuPSh4LG9uZnVsZmlsbGVkLG9ucmVqZWN0ZWQpPT57XG5jb25zdFtvbnN1Y2Nlc3Msb25mYWlsdXJlXT10cmFja1R1cm5zKFtvbmZ1bGZpbGxlZCxvbnJlamVjdGVkXSk7XG5yZXR1cm4gSGFuZGxlZFByb21pc2UucmVzb2x2ZSh4KS50aGVuKG9uc3VjY2VzcyxvbmZhaWx1cmUpO1xuIH07XG5cbnJldHVybiBoYXJkZW4oRSk7XG4gfSRo4oCNX29uY2UuZGVmYXVsdCggICAgIG1ha2VFKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZhdWx0IjpbImRlZmF1bHQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAotScywoCAAAKAgAAKgAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTYuOC9zcmMvbm8tc2hpbS5qc3siaW1wb3J0cyI6WyIuL0UuanMiXSwiZXhwb3J0cyI6WyJFIiwiSGFuZGxlZFByb21pc2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgbWFrZUU7JGjigI1faW1wb3J0cyhbW1wiLi9FLmpzXCIsIFtbXCJkZWZhdWx0XCIsIFskaOKAjV9hID0+IChtYWtlRSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cbmNvbnN0IGhwPUhhbmRsZWRQcm9taXNlOyRo4oCNX29uY2UuaHAoaHApO1xuY29uc3QgICAgICAgIEU9bWFrZUUoSGFuZGxlZFByb21pc2UpOyRo4oCNX29uY2UuRShFKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJIYW5kbGVkUHJvbWlzZSI6WyJocCJdLCJFIjpbIkUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA4rOx3dgPAADYDwAALgAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTYuOC9zcmMvdHJhY2stdHVybnMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbInRyYWNrVHVybnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBnbG9iYWwgZ2xvYmFsVGhpcyAqL1xuLyogQHRzLW5vY2hlY2sqL1xuXG4vKiBOT1RFOiBXZSBjYW4ndCBpbXBvcnQgdGhlc2UgYmVjYXVzZSB0aGV5J3JlIG5vdCBpbiBzY29wZSBiZWZvcmUgbG9ja2Rvd24uKi9cbi8qIGltcG9ydCB7IGFzc2VydCwgZGV0YWlscyBhcyBYLCBGYWlsIH0gZnJvbSAnQGFnb3JpYy9hc3NlcnQnOyovXG5cbi8qIFdBUk5JTkc6IEdsb2JhbCBNdXRhYmxlIFN0YXRlISovXG4vKiBUaGlzIHN0YXRlIGlzIGNvbW11bmljYXRlZCB0byBgYXNzZXJ0YCB0aGF0IG1ha2VzIGl0IGF2YWlsYWJsZSB0byB0aGUqL1xuLyogY2F1c2FsIGNvbnNvbGUsIHdoaWNoIGFmZmVjdHMgdGhlIGNvbnNvbGUgbG9nIG91dHB1dC4gTm9ybWFsbHkgd2UqL1xuLyogcmVnYXJkIHRoZSBhYmlsaXR5IHRvIHNlZSBjb25zb2xlIGxvZyBvdXRwdXQgYXMgYSBtZXRhLWxldmVsIHByaXZpbGVnZSovXG4vKiBhbmFsb2dvdXMgdG8gdGhlIGFiaWxpdHkgdG8gZGVidWcuIEFzaWRlIGZyb20gdGhhdCwgdGhpcyBtb2R1bGUgc2hvdWxkKi9cbi8qIG5vdCBoYXZlIGFueSBvYnNlcnZhYmx5IG11dGFibGUgc3RhdGUuKi9cblxubGV0IGhpZGRlblByaW9yRXJyb3I7XG5sZXQgaGlkZGVuQ3VycmVudFR1cm49MDtcbmxldCBoaWRkZW5DdXJyZW50RXZlbnQ9MDtcblxuLyogVE9ETyBVc2UgZW52aXJvbm1lbnQtb3B0aW9ucy5qcyBjdXJyZW50bHkgaW4gc2VzL3NyYyBhZnRlciBmYWN0b3JpbmcgaXQgb3V0Ki9cbi8qIHRvIGEgbmV3IHBhY2thZ2UuKi9cbmNvbnN0IGVudj0oZ2xvYmFsVGhpcy5wcm9jZXNzfHx7fSkuZW52fHx7fTtcblxuLyogVHVybiBvbiBpZiB5b3Ugc2VlbSB0byBiZSBsb3NpbmcgZXJyb3IgbG9nZ2luZyBhdCB0aGUgdG9wIG9mIHRoZSBldmVudCBsb29wKi9cbmNvbnN0IFZFUkJPU0U9KGVudi5ERUJVR3x8JycpLnNwbGl0KCc6JykuaW5jbHVkZXMoJ3RyYWNrLXR1cm5zJyk7XG5cbi8qIFRyYWNrLXR1cm5zIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQgYW5kIGNhbiBiZSBlbmFibGVkIGJ5IGFuIGVudmlyb25tZW50Ki9cbi8qIG9wdGlvbi4gV2UgaW50ZW5kIHRvIGNoYW5nZSB0aGUgZGVmYXVsdCBhZnRlciB2ZXJpZnlpbmcgdGhhdCBoYXZpbmcqL1xuLyogdGhlIGZlYXR1cmUgZW5hYmxlZCBpbiBwcm9kdWN0aW9uIGRvZXMgbm90IGNhdXNlIG1lbW9yeSB0byBsZWFrLiovXG5jb25zdCBFTkFCTEVEPWVudi5UUkFDS19UVVJOUz09PSdlbmFibGVkJztcblxuLyogV2UgaG9pc3QgdGhlc2UgZnVuY3Rpb25zIG91dCBvZiB0cmFja1R1cm5zKCkgdG8gZGlzY291cmFnZSB0aGUqL1xuLyogY2xvc3VyZXMgZnJvbSBob2xkaW5nIG9udG8gJ2FyZ3MnIG9yICdmdW5jJyBsb25nZXIgdGhhbiBuZWNlc3NhcnksKi9cbi8qIHdoaWNoIHdlJ3ZlIHNlZW4gY2F1c2UgSGFuZGxlZFByb21pc2UgYXJndW1lbnRzIHRvIGJlIHJldGFpbmVkIGZvciovXG4vKiBhIHN1cnByaXNpbmdseSBsb25nIHRpbWUuKi9cblxuY29uc3QgYWRkUmVqZWN0aW9uTm90ZT0oZGV0YWlsc05vdGUpPT4ocmVhc29uKT0+e1xuaWYocmVhc29uIGluc3RhbmNlb2YgRXJyb3Ipe1xuYXNzZXJ0Lm5vdGUocmVhc29uLGRldGFpbHNOb3RlKTtcbiB9XG5pZihWRVJCT1NFKXtcbmNvbnNvbGUubG9nKCdSRUpFQ1RFRCBhdCB0b3Agb2YgZXZlbnQgbG9vcCcscmVhc29uKTtcbiB9XG4gfTtcblxuY29uc3Qgd3JhcEZ1bmN0aW9uPShmdW5jLHNlbmRpbmdFcnJvcixYKT0+KC4uLmFyZ3MpPT57XG5oaWRkZW5QcmlvckVycm9yPXNlbmRpbmdFcnJvcjtcbmhpZGRlbkN1cnJlbnRUdXJuKz0xO1xuaGlkZGVuQ3VycmVudEV2ZW50PTA7XG50cnl7XG5sZXQgcmVzdWx0O1xudHJ5e1xucmVzdWx0PWZ1bmMoLi4uYXJncyk7XG4gfWNhdGNoKGVycil7XG5pZihlcnIgaW5zdGFuY2VvZiBFcnJvcil7XG5hc3NlcnQubm90ZShcbmVycixcblggYFRocm93biBmcm9tOiAke2hpZGRlblByaW9yRXJyb3J9OiR7aGlkZGVuQ3VycmVudFR1cm59LiR7aGlkZGVuQ3VycmVudEV2ZW50fWApO1xuXG4gfVxuaWYoVkVSQk9TRSl7XG5jb25zb2xlLmxvZygnVEhST1dOIHRvIHRvcCBvZiBldmVudCBsb29wJyxlcnIpO1xuIH1cbnRocm93IGVycjtcbiB9XG4vKiBNdXN0IGNhcHR1cmUgdGhpcyBub3csIG5vdCB3aGVuIHRoZSBjYXRjaCB0cmlnZ2Vycy4qL1xuY29uc3QgZGV0YWlsc05vdGU9WCBgUmVqZWN0aW9uIGZyb206ICR7aGlkZGVuUHJpb3JFcnJvcn06JHtoaWRkZW5DdXJyZW50VHVybn0uJHtoaWRkZW5DdXJyZW50RXZlbnR9YDtcblByb21pc2UucmVzb2x2ZShyZXN1bHQpLmNhdGNoKGFkZFJlamVjdGlvbk5vdGUoZGV0YWlsc05vdGUpKTtcbnJldHVybiBoYXJkZW4ocmVzdWx0KTtcbiB9ZmluYWxseXtcbmhpZGRlblByaW9yRXJyb3I9dW5kZWZpbmVkO1xuIH1cbiB9O1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkpIHwgdW5kZWZpbmVkfSBUdXJuU3RhcnRlckZuXG4gKiBBbiBvcHRpb25hbCBmdW5jdGlvbiB0aGF0IGlzIG5vdCB0aGlzLXNlbnNpdGl2ZSwgZXhwZWN0ZWQgdG8gYmUgY2FsbGVkIGF0XG4gKiBib3R0b20gb2Ygc3RhY2sgdG8gc3RhcnQgYSBuZXcgdHVybi5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7VHVyblN0YXJ0ZXJGbltdfSBUXG4gKiBHaXZlbiBhIGxpc3Qgb2YgYFR1cm5TdGFydGVyRm5gcywgcmV0dXJucyBhIGxpc3Qgb2YgYFR1cm5TdGFydGVyRm5gcyB3aG9zZVxuICogYHRoaXNgLWZyZWUgY2FsbCBiZWhhdmlvcnMgYXJlIG5vdCBvYnNlcnZhYmx5IGRpZmZlcmVudCB0byB0aG9zZSB0aGF0XG4gKiBjYW5ub3Qgc2VlIGNvbnNvbGUgb3V0cHV0LiBUaGUgb25seSBwdXJwb3NlIGlzIHRvIGNhdXNlIGFkZGl0aW9uYWxcbiAqIGluZm9ybWF0aW9uIHRvIGFwcGVhciBvbiB0aGUgY29uc29sZS5cbiAqXG4gKiBUaGUgY2FsbCB0byBgdHJhY2tUdXJuc2AgaXMgaXRzZWxmIGEgc2VuZGluZyBldmVudCwgdGhhdCBvY2N1cnMgaW4gc29tZSBjYWxsXG4gKiBzdGFjayBpbiBzb21lIHR1cm4gbnVtYmVyIGF0IHNvbWUgZXZlbnQgbnVtYmVyIHdpdGhpbiB0aGF0IHR1cm4uIEVhY2ggY2FsbFxuICogdG8gYW55IG9mIHRoZSByZXR1cm5lZCBgVHVyblN0YXJ0Rm5gcyBpcyBhIHJlY2VpdmluZyBldmVudCB0aGF0IGJlZ2lucyBhIG5ld1xuICogdHVybi4gVGhpcyBzZW5kaW5nIGV2ZW50IGNhdXNlZCBlYWNoIG9mIHRob3NlIHJlY2VpdmluZyBldmVudHMuXG4gKlxuICogQHBhcmFtIHtUfSBmdW5jc1xuICogQHJldHVybnMge1R9XG4gKi9cbmNvbnN0ICAgICAgICB0cmFja1R1cm5zPShmdW5jcyk9PntcbmlmKCFFTkFCTEVEfHx0eXBlb2YgZ2xvYmFsVGhpcz09PSd1bmRlZmluZWQnfHwhZ2xvYmFsVGhpcy5hc3NlcnQpe1xucmV0dXJuIGZ1bmNzO1xuIH1cbmNvbnN0e2RldGFpbHM6WH09YXNzZXJ0O1xuXG5oaWRkZW5DdXJyZW50RXZlbnQrPTE7XG5jb25zdCBzZW5kaW5nRXJyb3I9bmV3IEVycm9yKFxuIGBFdmVudDogJHtoaWRkZW5DdXJyZW50VHVybn0uJHtoaWRkZW5DdXJyZW50RXZlbnR9YCk7XG5cbmlmKGhpZGRlblByaW9yRXJyb3IhPT11bmRlZmluZWQpe1xuYXNzZXJ0Lm5vdGUoc2VuZGluZ0Vycm9yLFggYENhdXNlZCBieTogJHtoaWRkZW5QcmlvckVycm9yfWApO1xuIH1cblxucmV0dXJuIGZ1bmNzLm1hcCgoZnVuYyk9PmZ1bmMmJndyYXBGdW5jdGlvbihmdW5jLHNlbmRpbmdFcnJvcixYKSk7XG4gfTskaOKAjV9vbmNlLnRyYWNrVHVybnModHJhY2tUdXJucyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsidHJhY2tUdXJucyI6WyJ0cmFja1R1cm5zIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAD7lgF62AgAAtgIAAB4AAABAZW5kby9mYXItdjAuMi4xNC9zcmMvaW5kZXguanN7ImltcG9ydHMiOlsiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJFIiwiRmFyIiwiZ2V0SW50ZXJmYWNlT2YiLCJwYXNzU3R5bGVPZiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIiwgWyRo4oCNX2xpdmVbXCJFXCJdXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJGYXJcIiwgWyRo4oCNX2xpdmVbXCJGYXJcIl1dXSxbXCJnZXRJbnRlcmZhY2VPZlwiLCBbJGjigI1fbGl2ZVtcImdldEludGVyZmFjZU9mXCJdXV0sW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2xpdmVbXCJwYXNzU3R5bGVPZlwiXV1dXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6eyJFIjpbIkUiLGZhbHNlXSwiRmFyIjpbIkZhciIsZmFsc2VdLCJnZXRJbnRlcmZhY2VPZiI6WyJnZXRJbnRlcmZhY2VPZiIsZmFsc2VdLCJwYXNzU3R5bGVPZiI6WyJwYXNzU3R5bGVPZiIsZmFsc2VdfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACE1ofwvxAAAL8QAAAdAAAAQGVuZG8vbWFyc2hhbC12MC44LjEvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzIiwiLi9zcmMvZW5jb2RlVG9DYXBEYXRhLmpzIiwiLi9zcmMvaGVscGVycy9lcnJvci5qcyIsIi4vc3JjL2hlbHBlcnMvaXRlci1oZWxwZXJzLmpzIiwiLi9zcmMvaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vc3JjL2hlbHBlcnMvcmVtb3RhYmxlLmpzIiwiLi9zcmMvaGVscGVycy9zeW1ib2wuanMiLCIuL3NyYy9tYWtlLWZhci5qcyIsIi4vc3JjL21ha2VUYWdnZWQuanMiLCIuL3NyYy9tYXJzaGFsLWp1c3Rpbi5qcyIsIi4vc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzIiwiLi9zcmMvbWFyc2hhbC5qcyIsIi4vc3JjL3Bhc3NTdHlsZU9mLmpzIiwiLi9zcmMvdHlwZUd1YXJkcy5qcyIsIi4vc3JjL3R5cGVzLmpzIl0sImV4cG9ydHMiOlsiRmFyIiwiUEFTU19TVFlMRSIsIlFDTEFTUyIsIlJlbW90YWJsZSIsIlRvRmFyRnVuY3Rpb24iLCJhc3NlcnRDaGVja2VyIiwiYXNzZXJ0Q29weUFycmF5IiwiYXNzZXJ0UGFzc2FibGUiLCJhc3NlcnRSZWNvcmQiLCJhc3NlcnRSZW1vdGFibGUiLCJkZWNvZGVUb0p1c3RpbiIsImRlZXBseUZ1bGZpbGxlZCIsImZpbHRlckl0ZXJhYmxlIiwiZ2V0RXJyb3JDb25zdHJ1Y3RvciIsImdldEludGVyZmFjZU9mIiwiZ2V0VGFnIiwiaGFzT3duUHJvcGVydHlPZiIsImlzQ29weUFycmF5IiwiaXNPYmplY3QiLCJpc1JlY29yZCIsImlzUmVtb3RhYmxlIiwibWFrZU1hcnNoYWwiLCJtYWtlVGFnZ2VkIiwibWFwSXRlcmFibGUiLCJuYW1lRm9yUGFzc2FibGVTeW1ib2wiLCJwYXJzZSIsInBhc3NTdHlsZU9mIiwicGFzc2FibGVTeW1ib2xGb3JOYW1lIiwic3RyaW5naWZ5IiwidG9QYXNzYWJsZUVycm9yIl0sInJlZXhwb3J0cyI6WyIuL3NyYy90eXBlcy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vc3JjL2hlbHBlcnMvaXRlci1oZWxwZXJzLmpzXCIsIFtbXCJtYXBJdGVyYWJsZVwiLCBbJGjigI1fbGl2ZVtcIm1hcEl0ZXJhYmxlXCJdXV0sW1wiZmlsdGVySXRlcmFibGVcIiwgWyRo4oCNX2xpdmVbXCJmaWx0ZXJJdGVyYWJsZVwiXV1dXV0sW1wiLi9zcmMvaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiUEFTU19TVFlMRVwiLCBbJGjigI1fbGl2ZVtcIlBBU1NfU1RZTEVcIl1dXSxbXCJpc09iamVjdFwiLCBbJGjigI1fbGl2ZVtcImlzT2JqZWN0XCJdXV0sW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fbGl2ZVtcImFzc2VydENoZWNrZXJcIl1dXSxbXCJnZXRUYWdcIiwgWyRo4oCNX2xpdmVbXCJnZXRUYWdcIl1dXSxbXCJoYXNPd25Qcm9wZXJ0eU9mXCIsIFskaOKAjV9saXZlW1wiaGFzT3duUHJvcGVydHlPZlwiXV1dXV0sW1wiLi9zcmMvaGVscGVycy9lcnJvci5qc1wiLCBbW1wiZ2V0RXJyb3JDb25zdHJ1Y3RvclwiLCBbJGjigI1fbGl2ZVtcImdldEVycm9yQ29uc3RydWN0b3JcIl1dXSxbXCJ0b1Bhc3NhYmxlRXJyb3JcIiwgWyRo4oCNX2xpdmVbXCJ0b1Bhc3NhYmxlRXJyb3JcIl1dXV1dLFtcIi4vc3JjL2hlbHBlcnMvcmVtb3RhYmxlLmpzXCIsIFtbXCJnZXRJbnRlcmZhY2VPZlwiLCBbJGjigI1fbGl2ZVtcImdldEludGVyZmFjZU9mXCJdXV1dXSxbXCIuL3NyYy9oZWxwZXJzL3N5bWJvbC5qc1wiLCBbW1wibmFtZUZvclBhc3NhYmxlU3ltYm9sXCIsIFskaOKAjV9saXZlW1wibmFtZUZvclBhc3NhYmxlU3ltYm9sXCJdXV0sW1wicGFzc2FibGVTeW1ib2xGb3JOYW1lXCIsIFskaOKAjV9saXZlW1wicGFzc2FibGVTeW1ib2xGb3JOYW1lXCJdXV1dXSxbXCIuL3NyYy9wYXNzU3R5bGVPZi5qc1wiLCBbW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2xpdmVbXCJwYXNzU3R5bGVPZlwiXV1dLFtcImFzc2VydFBhc3NhYmxlXCIsIFskaOKAjV9saXZlW1wiYXNzZXJ0UGFzc2FibGVcIl1dXV1dLFtcIi4vc3JjL2RlZXBseUZ1bGZpbGxlZC5qc1wiLCBbW1wiZGVlcGx5RnVsZmlsbGVkXCIsIFskaOKAjV9saXZlW1wiZGVlcGx5RnVsZmlsbGVkXCJdXV1dXSxbXCIuL3NyYy9tYWtlVGFnZ2VkLmpzXCIsIFtbXCJtYWtlVGFnZ2VkXCIsIFskaOKAjV9saXZlW1wibWFrZVRhZ2dlZFwiXV1dXV0sW1wiLi9zcmMvbWFrZS1mYXIuanNcIiwgW1tcIlJlbW90YWJsZVwiLCBbJGjigI1fbGl2ZVtcIlJlbW90YWJsZVwiXV1dLFtcIkZhclwiLCBbJGjigI1fbGl2ZVtcIkZhclwiXV1dLFtcIlRvRmFyRnVuY3Rpb25cIiwgWyRo4oCNX2xpdmVbXCJUb0ZhckZ1bmN0aW9uXCJdXV1dXSxbXCIuL3NyYy9lbmNvZGVUb0NhcERhdGEuanNcIiwgW1tcIlFDTEFTU1wiLCBbJGjigI1fbGl2ZVtcIlFDTEFTU1wiXV1dXV0sW1wiLi9zcmMvbWFyc2hhbC5qc1wiLCBbW1wibWFrZU1hcnNoYWxcIiwgWyRo4oCNX2xpdmVbXCJtYWtlTWFyc2hhbFwiXV1dXV0sW1wiLi9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanNcIiwgW1tcInN0cmluZ2lmeVwiLCBbJGjigI1fbGl2ZVtcInN0cmluZ2lmeVwiXV1dLFtcInBhcnNlXCIsIFskaOKAjV9saXZlW1wicGFyc2VcIl1dXV1dLFtcIi4vc3JjL21hcnNoYWwtanVzdGluLmpzXCIsIFtbXCJkZWNvZGVUb0p1c3RpblwiLCBbJGjigI1fbGl2ZVtcImRlY29kZVRvSnVzdGluXCJdXV1dXSxbXCIuL3NyYy90eXBlR3VhcmRzLmpzXCIsIFtbXCJhc3NlcnRSZWNvcmRcIiwgWyRo4oCNX2xpdmVbXCJhc3NlcnRSZWNvcmRcIl1dXSxbXCJhc3NlcnRDb3B5QXJyYXlcIiwgWyRo4oCNX2xpdmVbXCJhc3NlcnRDb3B5QXJyYXlcIl1dXSxbXCJhc3NlcnRSZW1vdGFibGVcIiwgWyRo4oCNX2xpdmVbXCJhc3NlcnRSZW1vdGFibGVcIl1dXSxbXCJpc1JlbW90YWJsZVwiLCBbJGjigI1fbGl2ZVtcImlzUmVtb3RhYmxlXCJdXV0sW1wiaXNSZWNvcmRcIiwgWyRo4oCNX2xpdmVbXCJpc1JlY29yZFwiXV1dLFtcImlzQ29weUFycmF5XCIsIFskaOKAjV9saXZlW1wiaXNDb3B5QXJyYXlcIl1dXV1dLFtcIi4vc3JjL3R5cGVzLmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7Im1hcEl0ZXJhYmxlIjpbIm1hcEl0ZXJhYmxlIixmYWxzZV0sImZpbHRlckl0ZXJhYmxlIjpbImZpbHRlckl0ZXJhYmxlIixmYWxzZV0sIlBBU1NfU1RZTEUiOlsiUEFTU19TVFlMRSIsZmFsc2VdLCJpc09iamVjdCI6WyJpc09iamVjdCIsZmFsc2VdLCJhc3NlcnRDaGVja2VyIjpbImFzc2VydENoZWNrZXIiLGZhbHNlXSwiZ2V0VGFnIjpbImdldFRhZyIsZmFsc2VdLCJoYXNPd25Qcm9wZXJ0eU9mIjpbImhhc093blByb3BlcnR5T2YiLGZhbHNlXSwiZ2V0RXJyb3JDb25zdHJ1Y3RvciI6WyJnZXRFcnJvckNvbnN0cnVjdG9yIixmYWxzZV0sInRvUGFzc2FibGVFcnJvciI6WyJ0b1Bhc3NhYmxlRXJyb3IiLGZhbHNlXSwiZ2V0SW50ZXJmYWNlT2YiOlsiZ2V0SW50ZXJmYWNlT2YiLGZhbHNlXSwibmFtZUZvclBhc3NhYmxlU3ltYm9sIjpbIm5hbWVGb3JQYXNzYWJsZVN5bWJvbCIsZmFsc2VdLCJwYXNzYWJsZVN5bWJvbEZvck5hbWUiOlsicGFzc2FibGVTeW1ib2xGb3JOYW1lIixmYWxzZV0sInBhc3NTdHlsZU9mIjpbInBhc3NTdHlsZU9mIixmYWxzZV0sImFzc2VydFBhc3NhYmxlIjpbImFzc2VydFBhc3NhYmxlIixmYWxzZV0sImRlZXBseUZ1bGZpbGxlZCI6WyJkZWVwbHlGdWxmaWxsZWQiLGZhbHNlXSwibWFrZVRhZ2dlZCI6WyJtYWtlVGFnZ2VkIixmYWxzZV0sIlJlbW90YWJsZSI6WyJSZW1vdGFibGUiLGZhbHNlXSwiRmFyIjpbIkZhciIsZmFsc2VdLCJUb0ZhckZ1bmN0aW9uIjpbIlRvRmFyRnVuY3Rpb24iLGZhbHNlXSwiUUNMQVNTIjpbIlFDTEFTUyIsZmFsc2VdLCJtYWtlTWFyc2hhbCI6WyJtYWtlTWFyc2hhbCIsZmFsc2VdLCJzdHJpbmdpZnkiOlsic3RyaW5naWZ5IixmYWxzZV0sInBhcnNlIjpbInBhcnNlIixmYWxzZV0sImRlY29kZVRvSnVzdGluIjpbImRlY29kZVRvSnVzdGluIixmYWxzZV0sImFzc2VydFJlY29yZCI6WyJhc3NlcnRSZWNvcmQiLGZhbHNlXSwiYXNzZXJ0Q29weUFycmF5IjpbImFzc2VydENvcHlBcnJheSIsZmFsc2VdLCJhc3NlcnRSZW1vdGFibGUiOlsiYXNzZXJ0UmVtb3RhYmxlIixmYWxzZV0sImlzUmVtb3RhYmxlIjpbImlzUmVtb3RhYmxlIixmYWxzZV0sImlzUmVjb3JkIjpbImlzUmVjb3JkIixmYWxzZV0sImlzQ29weUFycmF5IjpbImlzQ29weUFycmF5IixmYWxzZV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKo0/YJCDAAAQgwAACsAAABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzeyJpbXBvcnRzIjpbIi4vaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vbWFrZVRhZ2dlZC5qcyIsIi4vcGFzc1N0eWxlT2YuanMiLCJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vcHJvbWlzZS1raXQiXSwiZXhwb3J0cyI6WyJkZWVwbHlGdWxmaWxsZWQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRSxpc1Byb21pc2UsZ2V0VGFnLGlzT2JqZWN0LG1ha2VUYWdnZWQscGFzc1N0eWxlT2Y7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wiaXNQcm9taXNlXCIsIFskaOKAjV9hID0+IChpc1Byb21pc2UgPSAkaOKAjV9hKV1dXV0sW1wiLi9oZWxwZXJzL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJnZXRUYWdcIiwgWyRo4oCNX2EgPT4gKGdldFRhZyA9ICRo4oCNX2EpXV0sW1wiaXNPYmplY3RcIiwgWyRo4oCNX2EgPT4gKGlzT2JqZWN0ID0gJGjigI1fYSldXV1dLFtcIi4vbWFrZVRhZ2dlZC5qc1wiLCBbW1wibWFrZVRhZ2dlZFwiLCBbJGjigI1fYSA9PiAobWFrZVRhZ2dlZCA9ICRo4oCNX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZU9mLmpzXCIsIFtbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlBhc3NhYmxlfSBQYXNzYWJsZSAqL1xuLyoqIEB0ZW1wbGF0ZSBUIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9ldmVudHVhbC1zZW5kJykuRVJlZjxUPn0gRVJlZiAqL1xuXG5jb25zdHtkZXRhaWxzOlgscXVvdGU6cX09YXNzZXJ0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2Zyb21FbnRyaWVzfT1PYmplY3Q7XG5cbi8qKlxuICogR2l2ZW4gYSBQYXNzYWJsZSBgdmFsYCB3aG9zZSBwYXNzLWJ5LWNvcHkgc3RydWN0dXJlIG1heSBjb250YWluIGxlYWZcbiAqIHByb21pc2VzLCByZXR1cm4gZWl0aGVyIGEgcmVwbGFjZW1lbnQgUGFzc2FibGUsIG9yIGEgcHJvbWlzZSBmb3IgdGhhdFxuICogcmVwbGFjZW1lbnQsIHdoZXJlIHRoYXQgcmVwbGFjZW1lbnQgaXMgKmRlZXBseSBmdWxmaWxsZWQqLCBpLmUuLCBpdHNcbiAqIHBhc3MtYnktY29weSBzdHJ1Y3R1cmUgZG9lcyBub3QgY29udGFpbiBhbnkgcHJvbWlzZXMuXG4gKlxuICogVGhpcyBpcyBhIGRlZXAgZm9ybSBvZiBgUHJvbWlzZS5hbGxgIHNwZWNpYWxpemVkIGZvciBQYXNzYWJsZXMuIEZvciBlYWNoXG4gKiBlbmNvdW50ZXJlZCBwcm9taXNlLCByZXBsYWNlIGl0IHdpdGggdGhlIGRlZXBseSBmdWxmaWxsZWQgZm9ybSBvZlxuICogaXRzIGZ1bGZpbGxtZW50LlxuICogSWYgYW55IG9mIHRoZSBwcm9taXNlcyByZWplY3QsIHRoZW4gdGhlIHByb21pc2UgZm9yIHRoZSByZXBsYWNlbWVudFxuICogcmVqZWN0cy4gSWYgYW55IG9mIHRoZSBwcm9taXNlcyBuZXZlciBzZXR0bGUsIHRoZW4gdGhlIHByb21pc2UgZm9yXG4gKiB0aGUgcmVwbGFjZW1lbnQgbmV2ZXIgc2V0dGxlcy5cbiAqXG4gKiBJZiBgdmFsYCBvciBpdHMgcGFydHMgYXJlIG5vbi1rZXkgcGFzc2FibGVzICpiZWNhdXNlKiB0aGV5IGNvbnRhaW5zXG4gKiBwcm9taXNlcywgdGhlIGRlZXBseSBmdWxmaWxsZWQgZm9ybXMgb2YgdmFsIG9yIGl0cyBwYXJ0cyBtYXkgYmUga2V5cy4gVGhpc1xuICogaXMgZm9yIHRoZSBoaWdoZXIgXCJzdG9yZVwiIGxldmVsIG9mIGFic3RyYWN0aW9uIHRvIGRldGVybWluZSwgYmVjYXVzZSBpdFxuICogZGVmaW5lcyB0aGUgXCJrZXlcIiBub3Rpb24gaW4gcXVlc3Rpb24uXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdmFsXG4gKiBAcmV0dXJucyB7RVJlZjxQYXNzYWJsZT59XG4gKi9cbmNvbnN0ICAgICAgICBkZWVwbHlGdWxmaWxsZWQ9KHZhbCk9PntcbmlmKCFpc09iamVjdCh2YWwpKXtcbnJldHVybiB2YWw7XG4gfVxuaWYoaXNQcm9taXNlKHZhbCkpe1xucmV0dXJuIEUud2hlbih2YWwsKG5vbnApPT5kZWVwbHlGdWxmaWxsZWQobm9ucCkpO1xuIH1cbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZih2YWwpO1xuc3dpdGNoKHBhc3NTdHlsZSl7XG5jYXNlJ2NvcHlSZWNvcmQnOntcbmNvbnN0IG5hbWVzPW93bktleXModmFsKTtcbmNvbnN0IHZhbFBzPW5hbWVzLm1hcCgobmFtZSk9PmRlZXBseUZ1bGZpbGxlZCh2YWxbbmFtZV0pKTtcbnJldHVybiBFLndoZW4oUHJvbWlzZS5hbGwodmFsUHMpLCh2YWxzKT0+XG5oYXJkZW4oZnJvbUVudHJpZXModmFscy5tYXAoKGMsaSk9PltuYW1lc1tpXSxjXSkpKSk7XG5cbiB9XG5jYXNlJ2NvcHlBcnJheSc6e1xuY29uc3QgdmFsUHM9dmFsLm1hcCgocCk9PmRlZXBseUZ1bGZpbGxlZChwKSk7XG5yZXR1cm4gRS53aGVuKFByb21pc2UuYWxsKHZhbFBzKSwodmFscyk9PmhhcmRlbih2YWxzKSk7XG4gfVxuY2FzZSd0YWdnZWQnOntcbmNvbnN0IHRhZz1nZXRUYWcodmFsKTtcbnJldHVybiBFLndoZW4oZGVlcGx5RnVsZmlsbGVkKHZhbC5wYXlsb2FkKSwocGF5bG9hZCk9PlxubWFrZVRhZ2dlZCh0YWcscGF5bG9hZCkpO1xuXG4gfVxuY2FzZSdyZW1vdGFibGUnOntcbnJldHVybiB2YWw7XG4gfVxuY2FzZSdlcnJvcic6e1xucmV0dXJuIHZhbDtcbiB9XG5jYXNlJ3Byb21pc2UnOntcbnJldHVybiBFLndoZW4odmFsLChub25wKT0+ZGVlcGx5RnVsZmlsbGVkKG5vbnApKTtcbiB9XG5kZWZhdWx0OntcbmFzc2VydC5mYWlsKFggYFVuZXhwZWN0ZWQgcGFzc1N0eWxlICR7cShwYXNzU3R5bGUpfWAsVHlwZUVycm9yKTtcbiB9fVxuXG4gfTskaOKAjV9vbmNlLmRlZXBseUZ1bGZpbGxlZChkZWVwbHlGdWxmaWxsZWQpO1xuaGFyZGVuKGRlZXBseUZ1bGZpbGxlZCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVlcGx5RnVsZmlsbGVkIjpbImRlZXBseUZ1bGZpbGxlZCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAwwIZwCkAAAApAAAArAAAAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL2VuY29kZVRvQ2FwRGF0YS5qc3siaW1wb3J0cyI6WyIuL2hlbHBlcnMvZXJyb3IuanMiLCIuL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanMiLCIuL2hlbHBlcnMvc3ltYm9sLmpzIiwiLi9tYWtlVGFnZ2VkLmpzIiwiLi9wYXNzU3R5bGVPZi5qcyJdLCJleHBvcnRzIjpbIlFDTEFTUyIsIm1ha2VEZWNvZGVGcm9tQ2FwRGF0YSIsIm1ha2VFbmNvZGVUb0NhcERhdGEiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgcGFzc1N0eWxlT2YsRXJyb3JIZWxwZXIsbWFrZVRhZ2dlZCxpc09iamVjdCxnZXRUYWcsaGFzT3duUHJvcGVydHlPZixhc3NlcnRQYXNzYWJsZVN5bWJvbCxuYW1lRm9yUGFzc2FibGVTeW1ib2wscGFzc2FibGVTeW1ib2xGb3JOYW1lOyRo4oCNX2ltcG9ydHMoW1tcIi4vcGFzc1N0eWxlT2YuanNcIiwgW1tcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvZXJyb3IuanNcIiwgW1tcIkVycm9ySGVscGVyXCIsIFskaOKAjV9hID0+IChFcnJvckhlbHBlciA9ICRo4oCNX2EpXV1dXSxbXCIuL21ha2VUYWdnZWQuanNcIiwgW1tcIm1ha2VUYWdnZWRcIiwgWyRo4oCNX2EgPT4gKG1ha2VUYWdnZWQgPSAkaOKAjV9hKV1dXV0sW1wiLi9oZWxwZXJzL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJpc09iamVjdFwiLCBbJGjigI1fYSA9PiAoaXNPYmplY3QgPSAkaOKAjV9hKV1dLFtcImdldFRhZ1wiLCBbJGjigI1fYSA9PiAoZ2V0VGFnID0gJGjigI1fYSldXSxbXCJoYXNPd25Qcm9wZXJ0eU9mXCIsIFskaOKAjV9hID0+IChoYXNPd25Qcm9wZXJ0eU9mID0gJGjigI1fYSldXV1dLFtcIi4vaGVscGVycy9zeW1ib2wuanNcIiwgW1tcImFzc2VydFBhc3NhYmxlU3ltYm9sXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXNzYWJsZVN5bWJvbCA9ICRo4oCNX2EpXV0sW1wibmFtZUZvclBhc3NhYmxlU3ltYm9sXCIsIFskaOKAjV9hID0+IChuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSAkaOKAjV9hKV1dLFtcInBhc3NhYmxlU3ltYm9sRm9yTmFtZVwiLCBbJGjigI1fYSA9PiAocGFzc2FibGVTeW1ib2xGb3JOYW1lID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkVuY29kaW5nfSBFbmNvZGluZyAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUmVtb3RhYmxlfSBSZW1vdGFibGUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkVuY29kaW5nVW5pb259IEVuY29kaW5nVW5pb24gKi9cblxuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2lzQXJyYXl9PUFycmF5O1xuY29uc3R7XG5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzLFxuZGVmaW5lUHJvcGVydGllcyxcbmlzLFxuZW50cmllcyxcbmZyb21FbnRyaWVzLFxuZnJlZXplfT1cbk9iamVjdDtcbmNvbnN0e2RldGFpbHM6WCxGYWlsLHF1b3RlOnF9PWFzc2VydDtcblxuLyoqXG4gKiBTcGVjaWFsIHByb3BlcnR5IG5hbWUgdGhhdCBpbmRpY2F0ZXMgYW4gZW5jb2RpbmcgdGhhdCBuZWVkcyBzcGVjaWFsXG4gKiBkZWNvZGluZy5cbiAqL1xuY29uc3QgUUNMQVNTPSdAcWNsYXNzJzskaOKAjV9vbmNlLlFDTEFTUyhRQ0xBU1MpO1xuXG5cbi8qKlxuICogQHBhcmFtIHtFbmNvZGluZ30gZW5jb2RlZFxuICogQHJldHVybnMge2VuY29kZWQgaXMgRW5jb2RpbmdVbmlvbn1cbiAqL1xuY29uc3QgaGFzUUNsYXNzPShlbmNvZGVkKT0+aGFzT3duUHJvcGVydHlPZihlbmNvZGVkLFFDTEFTUyk7XG5cbi8qKlxuICogQHBhcmFtIHtFbmNvZGluZ30gZW5jb2RlZFxuICogQHBhcmFtIHtzdHJpbmd9IHFjbGFzc1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IHFjbGFzc01hdGNoZXM9KGVuY29kZWQscWNsYXNzKT0+XG5pc09iamVjdChlbmNvZGVkKSYmXG4haXNBcnJheShlbmNvZGVkKSYmXG5oYXNRQ2xhc3MoZW5jb2RlZCkmJlxuZW5jb2RlZFtRQ0xBU1NdPT09cWNsYXNzO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEVuY29kZVRvQ2FwRGF0YU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7KFxuICogICByZW1vdGFibGU6IFJlbW90YWJsZSxcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gRW5jb2RpbmdcbiAqICkgPT4gRW5jb2Rpbmd9IFtlbmNvZGVSZW1vdGFibGVUb0NhcERhdGFdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgcHJvbWlzZTogUHJvbWlzZSxcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gRW5jb2RpbmdcbiAqICkgPT4gRW5jb2Rpbmd9IFtlbmNvZGVQcm9taXNlVG9DYXBEYXRhXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVycm9yOiBFcnJvcixcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gRW5jb2RpbmdcbiAqICkgPT4gRW5jb2Rpbmd9IFtlbmNvZGVFcnJvclRvQ2FwRGF0YV1cbiAqL1xuXG5jb25zdCBkb250RW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhPShyZW0pPT5GYWlsIGByZW1vdGFibGUgdW5leHBlY3RlZDogJHtyZW19YDtcblxuY29uc3QgZG9udEVuY29kZVByb21pc2VUb0NhcERhdGE9KHByb20pPT5GYWlsIGBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7cHJvbX1gO1xuXG5jb25zdCBkb250RW5jb2RlRXJyb3JUb0NhcERhdGE9KGVycik9PkZhaWwgYGVycm9yIG9iamVjdCB1bmV4cGVjdGVkOiAke2Vycn1gO1xuXG4vKipcbiAqIEBwYXJhbSB7RW5jb2RlVG9DYXBEYXRhT3B0aW9uc30gZW5jb2RlT3B0aW9uc1xuICogQHJldHVybnMgeyhwYXNzYWJsZTogUGFzc2FibGUpID0+IEVuY29kaW5nfVxuICovXG5jb25zdCAgICAgICAgbWFrZUVuY29kZVRvQ2FwRGF0YT0oe1xuZW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhPWRvbnRFbmNvZGVSZW1vdGFibGVUb0NhcERhdGEsXG5lbmNvZGVQcm9taXNlVG9DYXBEYXRhPWRvbnRFbmNvZGVQcm9taXNlVG9DYXBEYXRhLFxuZW5jb2RlRXJyb3JUb0NhcERhdGE9ZG9udEVuY29kZUVycm9yVG9DYXBEYXRhfT1cbnt9KT0+e1xuLyoqXG4gKiBNdXN0IGVuY29kZSBgdmFsYCBpbnRvIHBsYWluIEpTT04gZGF0YSAqY2Fub25pY2FsbHkqLCBzdWNoIHRoYXRcbiAqIGBKU09OLnN0cmluZ2lmeShlbmNvZGUodjEpKSA9PT0gSlNPTi5zdHJpbmdpZnkoZW5jb2RlKHYxKSlgLiBGb3IgbW9zdFxuICogZW5jb2RpbmdzLCB0aGUgb3JkZXIgb2YgcHJvcGVydGllcyBvZiBlYWNoIG5vZGUgb2YgdGhlIG91dHB1dFxuICogc3RydWN0dXJlIGlzIGRldGVybWluZWQgYnkgdGhlIGFsZ29yaXRobSBiZWxvdyB3aXRob3V0IHNwZWNpYWxcbiAqIGFycmFuZ2VtZW50LCB1c3VhbGx5IGJ5IGJlaW5nIGV4cHJlc3NlZCBkaXJlY3RseSBhcyBhbiBvYmplY3QgbGl0ZXJhbC5cbiAqIFRoZSBleGNlcHRpb24gaXMgY29weVJlY29yZHMsIHdob3NlIG5hdHVyYWwgZW51bWVyYXRpb24gb3JkZXJcbiAqIGNhbiBkaWZmZXIgYmV0d2VlbiBjb3B5UmVjb3JkcyB0aGF0IG91ciBkaXN0cmlidXRlZCBvYmplY3Qgc2VtYW50aWNzXG4gKiBjb25zaWRlcnMgdG8gYmUgZXF1aXZhbGVudC5cbiAqIFNpbmNlLCBmb3IgZWFjaCBjb3B5UmVjb3JkLCB3ZSBvbmx5IGFjY2VwdCBzdHJpbmcgcHJvcGVydHkgbmFtZXMsXG4gKiBub3Qgc3ltYm9scywgd2UgY2FuIGNhbm9uaWNhbGx5IHNvcnQgdGhlIG5hbWVzIGZpcnN0LlxuICogSlNPTi5zdHJpbmdpZnkgd2lsbCB0aGVuIHZpc2l0IHRoZXNlIGluIHRoYXQgc29ydGVkIG9yZGVyLlxuICpcbiAqIEVuY29kaW5nIHdpdGggYSBjYW5vbmljYWwtSlNPTiBlbmNvZGVyIHdvdWxkIGFsc28gc29sdmUgdGhpcyBjYW5vbmljYWxuZXNzXG4gKiBwcm9ibGVtIGluIGEgbW9yZSBtb2R1bGFyIGFuZCBlbmNhcHN1bGF0ZWQgbWFubmVyLiBOb3RlIHRoYXQgdGhlXG4gKiBhY3R1YWwgb3JkZXIgcHJvZHVjZWQgaGVyZSwgdGhvdWdoIGl0IGFncmVlcyB3aXRoIGNhbm9uaWNhbC1KU09OIG9uXG4gKiBjb3B5UmVjb3JkIHByb3BlcnR5IG9yZGVyaW5nLCBkaWZmZXJzIGZyb20gY2Fub25pY2FsLUpTT04gYXMgYSB3aG9sZVxuICogaW4gdGhhdCB0aGUgb3RoZXIgcmVjb3JkIHByb3BlcnRpZXMgYXJlIHZpc2l0ZWQgaW4gdGhlIG9yZGVyIGluIHdoaWNoXG4gKiB0aGV5IGFyZSBsaXRlcmFsbHkgd3JpdHRlbiBiZWxvdy4gVE9ETyBwZXJoYXBzIHdlIHNob3VsZCBpbmRlZWQgc3dpdGNoXG4gKiB0byBhIGNhbm9uaWNhbCBKU09OIGVuY29kZXIsIGFuZCBub3QgZGVsaWNhdGV0bHkgZGVwZW5kIG9uIHRoZSBvcmRlclxuICogaW4gd2hpY2ggdGhlc2Ugb2JqZWN0IGxpdGVyYWxzIGFyZSB3cml0dGVuLlxuICpcbiAqIFJlYWRlcnMgbXVzdCBub3QgY2FyZSBhYm91dCB0aGlzIG9yZGVyIGFueXdheS4gV2UgaW1wb3NlIHRoaXMgcmVxdWlyZW1lbnRcbiAqIG1haW5seSB0byByZWR1Y2Ugbm9uLWRldGVybWluaXNtIGV4cG9zZWQgb3V0c2lkZSBhIHZhdC5cbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBwYXNzYWJsZVxuICogQHJldHVybnMge0VuY29kaW5nfSBleGNlcHQgdGhhdCBgZW5jb2RlVG9DYXBEYXRhYCBkb2VzIG5vdCBnZW5lcmFsbHlcbiAqIGBoYXJkZW5gIHRoaXMgcmVzdWx0IGJlZm9yZSByZXR1cm5pbmcuIFJhdGhlciwgYGVuY29kZVRvQ2FwRGF0YWAgaXMgbm90XG4gKiBkaXJlY3RseSBleHBvc2VkLlxuICogV2hhdCdzIGV4cG9zZWQgaW5zdGVhZCBpcyBhIHdyYXBwZXIgdGhhdCBmcmVlemVzIHRoZSBvdXRwdXQgYmVmb3JlXG4gKiByZXR1cm5pbmcuIElmIHRoaXMgdHVybnMgb3V0IHRvIGltcGVkZSBzdGF0aWMgYW5hbHlzaXMgZm9yIGBoYXJkZW5gIHNhZmV0eSxcbiAqIHdlIGNhbiBhbHdheXMgcHV0IHRoZSAobm93IHJlZHVuZGFudCkgaGFyZGVucyBiYWNrIGluLiBUaGV5IGRvbid0IGh1cnQuXG4gKi9cbmNvbnN0IGVuY29kZVRvQ2FwRGF0YVJlY3VyPShwYXNzYWJsZSk9Pntcbi8qIEZpcnN0IHdlIGhhbmRsZSBhbGwgcHJpbWl0aXZlcy4gU29tZSBjYW4gYmUgcmVwcmVzZW50ZWQgZGlyZWN0bHkgYXMqL1xuLyogSlNPTiwgYW5kIHNvbWUgbXVzdCBiZSBlbmNvZGVkIGFzIFtRQ0xBU1NdIGNvbXBvc2l0ZXMuKi9cbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihwYXNzYWJsZSk7XG5zd2l0Y2gocGFzc1N0eWxlKXtcbmNhc2UnbnVsbCc6e1xucmV0dXJuIG51bGw7XG4gfVxuY2FzZSd1bmRlZmluZWQnOntcbnJldHVybntbUUNMQVNTXTondW5kZWZpbmVkJ307XG4gfVxuY2FzZSdzdHJpbmcnOlxuY2FzZSdib29sZWFuJzp7XG5yZXR1cm4gcGFzc2FibGU7XG4gfVxuY2FzZSdudW1iZXInOntcbmlmKE51bWJlci5pc05hTihwYXNzYWJsZSkpe1xucmV0dXJue1tRQ0xBU1NdOidOYU4nfTtcbiB9XG5pZihpcyhwYXNzYWJsZSwtMCkpe1xucmV0dXJuIDA7XG4gfVxuaWYocGFzc2FibGU9PT1JbmZpbml0eSl7XG5yZXR1cm57W1FDTEFTU106J0luZmluaXR5J307XG4gfVxuaWYocGFzc2FibGU9PT0tSW5maW5pdHkpe1xucmV0dXJue1tRQ0xBU1NdOictSW5maW5pdHknfTtcbiB9XG5yZXR1cm4gcGFzc2FibGU7XG4gfVxuY2FzZSdiaWdpbnQnOntcbnJldHVybntcbltRQ0xBU1NdOidiaWdpbnQnLFxuZGlnaXRzOlN0cmluZyhwYXNzYWJsZSl9O1xuXG4gfVxuY2FzZSdzeW1ib2wnOntcbmFzc2VydFBhc3NhYmxlU3ltYm9sKHBhc3NhYmxlKTtcbmNvbnN0IG5hbWU9LyoqIEB0eXBlIHtzdHJpbmd9ICovbmFtZUZvclBhc3NhYmxlU3ltYm9sKHBhc3NhYmxlKTtcbnJldHVybntcbltRQ0xBU1NdOidzeW1ib2wnLFxubmFtZX07XG5cbiB9XG5jYXNlJ2NvcHlSZWNvcmQnOntcbmlmKGhhc093blByb3BlcnR5T2YocGFzc2FibGUsUUNMQVNTKSl7XG4vKiBIaWxiZXJ0IGhvdGVsKi9cbmNvbnN0e1tRQ0xBU1NdOnFjbGFzc1ZhbHVlLC4uLnJlc3R9PXBhc3NhYmxlO1xuLyoqIEB0eXBlIHtFbmNvZGluZ30gKi9cbmNvbnN0IHJlc3VsdD17XG5bUUNMQVNTXTonaGlsYmVydCcsXG5vcmlnaW5hbDplbmNvZGVUb0NhcERhdGFSZWN1cihxY2xhc3NWYWx1ZSl9O1xuXG5pZihvd25LZXlzKHJlc3QpLmxlbmd0aD49MSl7XG4vKiBXZSBoYXJkZW4gdGhlIGVudGlyZSBjYXBEYXRhIGVuY29kaW5nIGJlZm9yZSB3ZSByZXR1cm4gaXQuKi9cbi8qIGBlbmNvZGVUb0NhcERhdGFgIHJlcXVpcmVzIHRoYXQgaXRzIGlucHV0IGJlIFBhc3NhYmxlLCBhbmQqL1xuLyogdGhlcmVmb3JlIGhhcmRlbmVkLiovXG4vKiBUaGUgYGZyZWV6ZWAgaGVyZSBpcyBuZWVkZWQgYW55d2F5LCBiZWNhdXNlIHRoZSBgcmVzdGAgaXMqL1xuLyogZnJlc2hseSBjb25zdHJ1Y3RlZCBieSB0aGUgYC4uLmAgYWJvdmUsIGFuZCB3ZSdyZSB1c2luZyBpdCovXG4vKiBhcyBpbXB1dCBpbiBhbm90aGVyIGNhbGwgdG8gYGVuY29kZVRvQ2FwRGF0YWAuKi9cbnJlc3VsdC5yZXN0PWVuY29kZVRvQ2FwRGF0YVJlY3VyKGZyZWV6ZShyZXN0KSk7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9XG4vKiBDdXJyZW50bHkgY29weVJlY29yZCBhbGxvd3Mgb25seSBzdHJpbmcga2V5cyBzbyB0aGlzIHdpbGwqL1xuLyogd29yay4gSWYgd2UgYWxsb3cgc29ydGFibGUgc3ltYm9sIGtleXMsIHRoaXMgd2lsbCBuZWVkIHRvKi9cbi8qIGJlY29tZSBtb3JlIGludGVyZXN0aW5nLiovXG5jb25zdCBuYW1lcz1vd25LZXlzKHBhc3NhYmxlKS5zb3J0KCk7XG5yZXR1cm4gZnJvbUVudHJpZXMoXG5uYW1lcy5tYXAoKG5hbWUpPT5bbmFtZSxlbmNvZGVUb0NhcERhdGFSZWN1cihwYXNzYWJsZVtuYW1lXSldKSk7XG5cbiB9XG5jYXNlJ2NvcHlBcnJheSc6e1xucmV0dXJuIHBhc3NhYmxlLm1hcChlbmNvZGVUb0NhcERhdGFSZWN1cik7XG4gfVxuY2FzZSd0YWdnZWQnOntcbnJldHVybntcbltRQ0xBU1NdOid0YWdnZWQnLFxudGFnOmdldFRhZyhwYXNzYWJsZSksXG5wYXlsb2FkOmVuY29kZVRvQ2FwRGF0YVJlY3VyKHBhc3NhYmxlLnBheWxvYWQpfTtcblxuIH1cbmNhc2UncmVtb3RhYmxlJzp7XG5jb25zdCBlbmNvZGVkPWVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YShcbnBhc3NhYmxlLFxuZW5jb2RlVG9DYXBEYXRhUmVjdXIpO1xuXG5pZihxY2xhc3NNYXRjaGVzKGVuY29kZWQsJ3Nsb3QnKSl7XG5yZXR1cm4gZW5jb2RlZDtcbiB9XG4vKiBgdGhyb3dgIGlzIG5vb3Agc2luY2UgYEZhaWxgIHRocm93cy4gQnV0IGxpbnRlciBjb25mdXNlZCovXG50aHJvdyBGYWlsIGBpbnRlcm5hbDogUmVtb3RhYmxlIGVuY29kaW5nIG11c3QgYmUgYW4gb2JqZWN0IHdpdGggJHtxKFxuUUNMQVNTKVxuIH0gJHtxKCdzbG90Jyl9OiAke2VuY29kZWR9YDtcbiB9XG5jYXNlJ3Byb21pc2UnOntcbmNvbnN0IGVuY29kZWQ9ZW5jb2RlUHJvbWlzZVRvQ2FwRGF0YShwYXNzYWJsZSxlbmNvZGVUb0NhcERhdGFSZWN1cik7XG5pZihxY2xhc3NNYXRjaGVzKGVuY29kZWQsJ3Nsb3QnKSl7XG5yZXR1cm4gZW5jb2RlZDtcbiB9XG50aHJvdyBGYWlsIGBpbnRlcm5hbDogUHJvbWlzZSBlbmNvZGluZyBtdXN0IGJlIGFuIG9iamVjdCB3aXRoICR7cShcblFDTEFTUyxcbidzbG90JylcbiB9OiAke2VuY29kZWR9YDtcbiB9XG5jYXNlJ2Vycm9yJzp7XG5jb25zdCBlbmNvZGVkPWVuY29kZUVycm9yVG9DYXBEYXRhKHBhc3NhYmxlLGVuY29kZVRvQ2FwRGF0YVJlY3VyKTtcbmlmKHFjbGFzc01hdGNoZXMoZW5jb2RlZCwnZXJyb3InKSl7XG5yZXR1cm4gZW5jb2RlZDtcbiB9XG50aHJvdyBGYWlsIGBpbnRlcm5hbDogRXJyb3IgZW5jb2RpbmcgbXVzdCBiZSBhbiBvYmplY3Qgd2l0aCAke3EoXG5RQ0xBU1MsXG4nZXJyb3InKVxuIH06ICR7ZW5jb2RlZH1gO1xuIH1cbmRlZmF1bHQ6e1xuYXNzZXJ0LmZhaWwoXG5YIGBpbnRlcm5hbDogVW5yZWNvZ25pemVkIHBhc3NTdHlsZSAke3EocGFzc1N0eWxlKX1gLFxuVHlwZUVycm9yKTtcblxuIH19XG5cbiB9O1xuY29uc3QgZW5jb2RlVG9DYXBEYXRhPShwYXNzYWJsZSk9PntcbmlmKEVycm9ySGVscGVyLmNhbkJlVmFsaWQocGFzc2FibGUpKXtcbi8qIFdlIHB1bGwgb3V0IHRoaXMgc3BlY2lhbCBjYXNlIHRvIGFjY29tbW9kYXRlIGVycm9ycyB0aGF0IGFyZSBub3QqL1xuLyogdmFsaWQgUGFzc2FibGVzLiBGb3IgZXhhbXBsZSwgYmVjYXVzZSB0aGV5J3JlIG5vdCBmcm96ZW4uKi9cbi8qIFRoZSBzcGVjaWFsIGNhc2UgY2FuIG9ubHkgZXZlciBhcHBseSBhdCB0aGUgcm9vdCwgYW5kIHRoZXJlZm9yZSovXG4vKiBvdXRzaWRlIHRoZSByZWN1cnNpb24sIHNpbmNlIGFuIGVycm9yIGNvdWxkIG9ubHkgYmUgZGVlcGVyIGluKi9cbi8qIGEgcGFzc2FibGUgc3RydWN0dXJlIGlmIGl0IHdlcmUgcGFzc2FibGUuKi9cbi8qKi9cbi8qIFdlIHB1bGwgb3V0IHRoaXMgc3BlY2lhbCBjYXNlIGJlY2F1c2UsIGZvciB0aGVzZSBlcnJvcnMsIHdlJ3JlIG11Y2gqL1xuLyogbW9yZSBpbnRlcmVzdGVkIGluIHJlcG9ydGluZyB3aGF0ZXZlciBkaWFnbm9zdGljIGluZm9ybWF0aW9uIHRoZXkqL1xuLyogY2FycnkgdGhhbiB3ZSBhcmUgYWJvdXQgcmVwb3J0aW5nIHByb2JsZW1zIGVuY291bnRlcmVkIGluIHJlcG9ydGluZyovXG4vKiB0aGlzIGluZm9ybWF0aW9uLiovXG5yZXR1cm4gaGFyZGVuKGVuY29kZUVycm9yVG9DYXBEYXRhKHBhc3NhYmxlLGVuY29kZVRvQ2FwRGF0YVJlY3VyKSk7XG4gfVxucmV0dXJuIGhhcmRlbihlbmNvZGVUb0NhcERhdGFSZWN1cihwYXNzYWJsZSkpO1xuIH07XG5yZXR1cm4gaGFyZGVuKGVuY29kZVRvQ2FwRGF0YSk7XG4gfTskaOKAjV9vbmNlLm1ha2VFbmNvZGVUb0NhcERhdGEobWFrZUVuY29kZVRvQ2FwRGF0YSk7XG5oYXJkZW4obWFrZUVuY29kZVRvQ2FwRGF0YSk7XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRGVjb2RlT3B0aW9uc1xuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRSZW1vdGFibGU6IEVuY29kaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGU6IEVuY29kaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiAoUHJvbWlzZXxSZW1vdGFibGUpfSBbZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGFdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZFByb21pc2U6IEVuY29kaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGU6IEVuY29kaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiAoUHJvbWlzZXxSZW1vdGFibGUpfSBbZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRFcnJvcjogRW5jb2RpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZTogRW5jb2RpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IEVycm9yfSBbZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YV1cbiAqL1xuXG5jb25zdCBkb250RGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGE9KHNsb3RFbmNvZGluZyk9PlxuRmFpbCBgcmVtb3RhYmxlIG9yIHByb21pc2UgdW5leHBlY3RlZDogJHtzbG90RW5jb2Rpbmd9YDtcbmNvbnN0IGRvbnREZWNvZGVFcnJvckZyb21DYXBEYXRhPShlcnJvckVuY29kaW5nKT0+XG5GYWlsIGBlcnJvciB1bmV4cGVjdGVkOiAke2Vycm9yRW5jb2Rpbmd9YDtcblxuLyoqXG4gKiBUaGUgY3VycmVudCBlbmNvZGluZyBkb2VzIG5vdCBnaXZlIHRoZSBkZWNvZGVyIGVub3VnaCBpbnRvIHRvIGRpc3Rpbmd1aXNoXG4gKiB3aGV0aGVyIGEgc2xvdCByZXByZXNlbnRzIGEgcHJvbWlzZSBvciBhIHJlbW90YWJsZS4gQXMgYW4gaW1wbGVtZW50YXRpb25cbiAqIHJlc3RyaWN0aW9uIHVudGlsIHRoaXMgaXMgZml4ZWQsIGlmIGVpdGhlciBpcyBwcm92aWRlZCwgYm90aCBtdXN0IGJlXG4gKiBwcm92aWRlZCBhbmQgdGhleSBtdXN0IGJlIHRoZSBzYW1lLlxuICpcbiAqIFRoaXMgc2VlbXMgbGlrZSB0aGUgYmVzdCBzdGFydGluZyBwb2ludCB0byBpbmNyZW1lbnRhbGx5IGV2b2x2ZSB0byBhblxuICogQVBJIHdoZXJlIHRoZXNlIGNhbiByZWxpYWJseSBkaWZmZXIuXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80MzM0XG4gKlxuICogQHBhcmFtIHtEZWNvZGVPcHRpb25zfSBkZWNvZGVPcHRpb25zXG4gKiBAcmV0dXJucyB7KGVuY29kZWQ6IEVuY29kaW5nKSA9PiBQYXNzYWJsZX1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VEZWNvZGVGcm9tQ2FwRGF0YT0oe1xuZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGE9ZG9udERlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhLFxuZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhPWRvbnREZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YSxcbmRlY29kZUVycm9yRnJvbUNhcERhdGE9ZG9udERlY29kZUVycm9yRnJvbUNhcERhdGF9PVxue30pPT57XG5kZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YT09PWRlY29kZVByb21pc2VGcm9tQ2FwRGF0YXx8XG5GYWlsIGBBbiBpbXBsZW1lbnRhdGlvbiByZXN0cmljdGlvbiBmb3Igbm93OiBJZiBlaXRoZXIgZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGEgb3IgZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhIGlzIHByb3ZpZGVkLCBib3RoIG11c3QgYmUgcHJvdmlkZWQgYW5kIHRoZXkgbXVzdCBiZSB0aGUgc2FtZTogJHtxKFxuZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGEpXG4gfSB2cyAke3EoZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhKX1gO1xuXG4vKipcbiAqIGBkZWNvZGVGcm9tQ2FwRGF0YWAgbWF5IHJlbHkgb24gYGpzb25FbmNvZGVkYCBiZWluZyB0aGUgcmVzdWx0IG9mIGFcbiAqIHBsYWluIGNhbGwgdG8gSlNPTi5wYXJzZS4gSG93ZXZlciwgaXQgKmNhbm5vdCogcmVseSBvbiBganNvbkVuY29kZWRgXG4gKiBoYXZpbmcgYmVlbiBwcm9kdWNlZCBieSBKU09OLnN0cmluZ2lmeSBvbiB0aGUgb3V0cHV0IG9mIGBlbmNvZGVUb0NhcERhdGFgXG4gKiBhYm92ZSwgaS5lLiwgYGRlY29kZUZyb21DYXBEYXRhYCBjYW5ub3QgcmVseSBvbiBganNvbkVuY29kZWRgIGJlaW5nIGFcbiAqIHZhbGlkIG1hcnNoYWxsZWQgcmVwcmVzZW50YXRpb24uIFJhdGhlciwgYGRlY29kZUZyb21DYXBEYXRhYCBtdXN0XG4gKiB2YWxpZGF0ZSB0aGF0LlxuICpcbiAqIEBwYXJhbSB7RW5jb2Rpbmd9IGpzb25FbmNvZGVkIG11c3QgYmUgaGFyZGVuZWRcbiAqL1xuY29uc3QgZGVjb2RlRnJvbUNhcERhdGE9KGpzb25FbmNvZGVkKT0+e1xuaWYoIWlzT2JqZWN0KGpzb25FbmNvZGVkKSl7XG4vKiBwcmltaXRpdmVzIHBhc3MgdGhyb3VnaCovXG5yZXR1cm4ganNvbkVuY29kZWQ7XG4gfVxuaWYoaXNBcnJheShqc29uRW5jb2RlZCkpe1xucmV0dXJuIGpzb25FbmNvZGVkLm1hcCgoZW5jb2RlZFZhbCk9PmRlY29kZUZyb21DYXBEYXRhKGVuY29kZWRWYWwpKTtcbiB9ZWxzZSBpZihoYXNRQ2xhc3MoanNvbkVuY29kZWQpKXtcbmNvbnN0IHFjbGFzcz1qc29uRW5jb2RlZFtRQ0xBU1NdO1xuYXNzZXJ0LnR5cGVvZihcbnFjbGFzcyxcbidzdHJpbmcnLFxuWCBgaW52YWxpZCAke3EoUUNMQVNTKX0gdHlwZW9mICR7cSh0eXBlb2YgcWNsYXNzKX1gKTtcblxuc3dpdGNoKHFjbGFzcyl7XG4vKiBFbmNvZGluZyBvZiBwcmltaXRpdmVzIG5vdCBoYW5kbGVkIGJ5IEpTT04qL1xuY2FzZSd1bmRlZmluZWQnOntcbnJldHVybiB1bmRlZmluZWQ7XG4gfVxuY2FzZSdOYU4nOntcbnJldHVybiBOYU47XG4gfVxuY2FzZSdJbmZpbml0eSc6e1xucmV0dXJuIEluZmluaXR5O1xuIH1cbmNhc2UnLUluZmluaXR5Jzp7XG5yZXR1cm4tSW5maW5pdHk7XG4gfVxuY2FzZSdiaWdpbnQnOntcbi8qIFVzaW5nIEB0cy1pZ25vcmUgcmF0aGVyIHRoYW4gQHRzLWV4cGVjdC1lcnJvciBiZWxvdyBiZWNhdXNlKi9cbi8qIHdpdGggQHRzLWV4cGVjdC1lcnJvciBJIGdldCBhIHJlZCB1bmRlcmxpbmUgaW4gdnNjb2RlLCBidXQqL1xuLyogd2l0aG91dCBpdCBJIGdldCBlcnJvcnMgZnJvbSBgeWFybiBsaW50YC4qL1xuLyogQHRzLWlnbm9yZSBpbmFkZXF1YXRlIHR5cGUgaW5mZXJlbmNlKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xMjU5I2Rpc2N1c3Npb25fcjk1NDU2MTkwMSovXG5jb25zdHtkaWdpdHN9PWpzb25FbmNvZGVkO1xuYXNzZXJ0LnR5cGVvZihcbmRpZ2l0cyxcbidzdHJpbmcnLFxuWCBgaW52YWxpZCBkaWdpdHMgdHlwZW9mICR7cSh0eXBlb2YgZGlnaXRzKX1gKTtcblxucmV0dXJuIEJpZ0ludChkaWdpdHMpO1xuIH1cbmNhc2UnQEBhc3luY0l0ZXJhdG9yJzp7XG4vKiBEZXByZWNhdGVkIHFjbGFzcy4gVE9ETyBtYWtlIGNvbmRpdGlvbmFsKi9cbi8qIG9uIGVudmlyb25tZW50IHZhcmlhYmxlLiBFdmVudHVhbGx5IHJlbW92ZSwgYnV0IGFmdGVyIGNvbmZpZGVudCovXG4vKiB0aGF0IHRoZXJlIGFyZSBubyBtb3JlIHN1cHBvcnRlZCBzZW5kZXJzLiovXG4vKiovXG4vKiBVc2luZyBAdHMtaWdub3JlIHJhdGhlciB0aGFuIEB0cy1leHBlY3QtZXJyb3IgYmVsb3cgYmVjYXVzZSovXG4vKiB3aXRoIEB0cy1leHBlY3QtZXJyb3IgSSBnZXQgYSByZWQgdW5kZXJsaW5lIGluIHZzY29kZSwgYnV0Ki9cbi8qIHdpdGhvdXQgaXQgSSBnZXQgZXJyb3JzIGZyb20gYHlhcm4gbGludGAuKi9cbi8qIEB0cy1pZ25vcmUgaW5hZGVxdWF0ZSB0eXBlIGluZmVyZW5jZSovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTI1OSNkaXNjdXNzaW9uX3I5NTQ1NjE5MDEqL1xucmV0dXJuIFN5bWJvbC5hc3luY0l0ZXJhdG9yO1xuIH1cbmNhc2Unc3ltYm9sJzp7XG4vKiBVc2luZyBAdHMtaWdub3JlIHJhdGhlciB0aGFuIEB0cy1leHBlY3QtZXJyb3IgYmVsb3cgYmVjYXVzZSovXG4vKiB3aXRoIEB0cy1leHBlY3QtZXJyb3IgSSBnZXQgYSByZWQgdW5kZXJsaW5lIGluIHZzY29kZSwgYnV0Ki9cbi8qIHdpdGhvdXQgaXQgSSBnZXQgZXJyb3JzIGZyb20gYHlhcm4gbGludGAuKi9cbi8qIEB0cy1pZ25vcmUgaW5hZGVxdWF0ZSB0eXBlIGluZmVyZW5jZSovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTI1OSNkaXNjdXNzaW9uX3I5NTQ1NjE5MDEqL1xuY29uc3R7bmFtZX09anNvbkVuY29kZWQ7XG5yZXR1cm4gcGFzc2FibGVTeW1ib2xGb3JOYW1lKG5hbWUpO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG4vKiBVc2luZyBAdHMtaWdub3JlIHJhdGhlciB0aGFuIEB0cy1leHBlY3QtZXJyb3IgYmVsb3cgYmVjYXVzZSovXG4vKiB3aXRoIEB0cy1leHBlY3QtZXJyb3IgSSBnZXQgYSByZWQgdW5kZXJsaW5lIGluIHZzY29kZSwgYnV0Ki9cbi8qIHdpdGhvdXQgaXQgSSBnZXQgZXJyb3JzIGZyb20gYHlhcm4gbGludGAuKi9cbi8qIEB0cy1pZ25vcmUgaW5hZGVxdWF0ZSB0eXBlIGluZmVyZW5jZSovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTI1OSNkaXNjdXNzaW9uX3I5NTQ1NjE5MDEqL1xuY29uc3R7dGFnLHBheWxvYWR9PWpzb25FbmNvZGVkO1xucmV0dXJuIG1ha2VUYWdnZWQodGFnLGRlY29kZUZyb21DYXBEYXRhKHBheWxvYWQpKTtcbiB9XG5jYXNlJ3Nsb3QnOntcbi8qIFNlZSBub3RlIGFib3ZlIGFib3V0IGhvdyB0aGUgY3VycmVudCBlbmNvZGluZyBjYW5ub3QgcmVsaWFibHkqL1xuLyogZGlzdGluZ3Vpc2ggd2hpY2ggd2Ugc2hvdWxkIGNhbGwsIHNvIGluIHRoZSBub24tZGVmYXVsdCBjYXNlKi9cbi8qIGJvdGggbXVzdCBiZSB0aGUgc2FtZSBhbmQgaXQgZG9lc24ndCBtYXR0ZXIgd2hpY2ggd2UgY2FsbC4qL1xuY29uc3QgZGVjb2RlZD1kZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YShcbmpzb25FbmNvZGVkLFxuZGVjb2RlRnJvbUNhcERhdGEpO1xuXG4vKiBCRVdBUkU6IGNhcGRhdGEgZG9lcyBub3QgY2hlY2sgdGhhdCBgZGVjb2RlZGAgaXMqL1xuLyogYSBwcm9taXNlIG9yIGEgcmVtb3RhYmxlLCBzaW5jZSB0aGF0IHdvdWxkIGJyZWFrIHNvbWUqL1xuLyogY2FwZGF0YSBjbGllbnRzLiBXZSBhcmUgZGVwcmVjYXRpbmcgY2FwZGF0YSwgYW5kIHRoZXNlIGNsaWVudHMqL1xuLyogd2lsbCBuZWVkIHRvIHVwZGF0ZSBiZWZvcmUgc3dpdGNoaW5nIHRvIHNtYWxsY2Fwcy4qL1xucmV0dXJuIGRlY29kZWQ7XG4gfVxuY2FzZSdlcnJvcic6e1xuY29uc3QgZGVjb2RlZD1kZWNvZGVFcnJvckZyb21DYXBEYXRhKFxuanNvbkVuY29kZWQsXG5kZWNvZGVGcm9tQ2FwRGF0YSk7XG5cbmlmKHBhc3NTdHlsZU9mKGRlY29kZWQpPT09J2Vycm9yJyl7XG5yZXR1cm4gZGVjb2RlZDtcbiB9XG50aHJvdyBGYWlsIGBpbnRlcm5hbDogZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YSBvcHRpb24gbXVzdCByZXR1cm4gYW4gZXJyb3I6ICR7ZGVjb2RlZH1gO1xuIH1cbmNhc2UnaGlsYmVydCc6e1xuLyogVXNpbmcgQHRzLWlnbm9yZSByYXRoZXIgdGhhbiBAdHMtZXhwZWN0LWVycm9yIGJlbG93IGJlY2F1c2UqL1xuLyogd2l0aCBAdHMtZXhwZWN0LWVycm9yIEkgZ2V0IGEgcmVkIHVuZGVybGluZSBpbiB2c2NvZGUsIGJ1dCovXG4vKiB3aXRob3V0IGl0IEkgZ2V0IGVycm9ycyBmcm9tIGB5YXJuIGxpbnRgLiovXG4vKiBAdHMtaWdub3JlIGluYWRlcXVhdGUgdHlwZSBpbmZlcmVuY2UqL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzEyNTkjZGlzY3Vzc2lvbl9yOTU0NTYxOTAxKi9cbmNvbnN0e29yaWdpbmFsLHJlc3R9PWpzb25FbmNvZGVkO1xuaGFzT3duUHJvcGVydHlPZihqc29uRW5jb2RlZCwnb3JpZ2luYWwnKXx8XG5GYWlsIGBJbnZhbGlkIEhpbGJlcnQgSG90ZWwgZW5jb2RpbmcgJHtqc29uRW5jb2RlZH1gO1xuLyogRG9uJ3QgaGFyZGVuIHNpbmNlIHdlJ3JlIG5vdCBkb25lIG11dGF0aW5nIGl0Ki9cbmNvbnN0IHJlc3VsdD17W1FDTEFTU106ZGVjb2RlRnJvbUNhcERhdGEob3JpZ2luYWwpfTtcbmlmKGhhc093blByb3BlcnR5T2YoanNvbkVuY29kZWQsJ3Jlc3QnKSl7XG5jb25zdCBpc05vbkVtcHR5T2JqZWN0PVxudHlwZW9mIHJlc3Q9PT0nb2JqZWN0JyYmXG5yZXN0IT09bnVsbCYmXG5vd25LZXlzKHJlc3QpLmxlbmd0aD49MTtcbmlzTm9uRW1wdHlPYmplY3R8fFxuRmFpbCBgUmVzdCBlbmNvZGluZyBtdXN0IGJlIGEgbm9uLWVtcHR5IG9iamVjdDogJHtyZXN0fWA7XG5jb25zdCByZXN0T2JqPWRlY29kZUZyb21DYXBEYXRhKHJlc3QpO1xuLyogVE9ETyByZWFsbHkgc2hvdWxkIGFzc2VydCB0aGF0IGBwYXNzU3R5bGVPZihyZXN0KWAgaXMqL1xuLyogYCdjb3B5UmVjb3JkJ2AgYnV0IHdlJ2QgaGF2ZSB0byBoYXJkZW4gaXQgYW5kIGl0IGlzIHRvbyovXG4vKiBlYXJseSB0byBkbyB0aGF0LiovXG4haGFzT3duUHJvcGVydHlPZihyZXN0T2JqLFFDTEFTUyl8fFxuRmFpbCBgUmVzdCBtdXN0IG5vdCBjb250YWluIGl0cyBvd24gZGVmaW5pdGlvbiBvZiAke3EoUUNMQVNTKX1gO1xuZGVmaW5lUHJvcGVydGllcyhyZXN1bHQsZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhyZXN0T2JqKSk7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9XG4vKiBAdHMtZXhwZWN0LWVycm9yIFRoaXMgaXMgdGhlIGVycm9yIGNhc2Ugd2UncmUgdGVzdGluZyBmb3IqL1xuY2FzZSdpYmlkJzp7XG50aHJvdyBGYWlsIGBUaGUgY2FwRGF0YSBwcm90b2NvbCBubyBsb25nZXIgc3VwcG9ydHMgJHtxKFFDTEFTUyl9ICR7cShcbnFjbGFzcylcbiB9YDtcbiB9XG5kZWZhdWx0OntcbmFzc2VydC5mYWlsKFggYHVucmVjb2duaXplZCAke3EoUUNMQVNTKX0gJHtxKHFjbGFzcyl9YCxUeXBlRXJyb3IpO1xuIH19XG5cbiB9ZWxzZXtcbmFzc2VydCh0eXBlb2YganNvbkVuY29kZWQ9PT0nb2JqZWN0JyYmanNvbkVuY29kZWQhPT1udWxsKTtcbmNvbnN0IGRlY29kZUVudHJ5PShbbmFtZSxlbmNvZGVkVmFsXSk9PntcbnR5cGVvZiBuYW1lPT09J3N0cmluZyd8fFxuRmFpbCBgUHJvcGVydHkgJHtxKG5hbWUpfSBvZiAke2pzb25FbmNvZGVkfSBtdXN0IGJlIGEgc3RyaW5nYDtcbnJldHVybltuYW1lLGRlY29kZUZyb21DYXBEYXRhKGVuY29kZWRWYWwpXTtcbiB9O1xuY29uc3QgZGVjb2RlZEVudHJpZXM9ZW50cmllcyhqc29uRW5jb2RlZCkubWFwKGRlY29kZUVudHJ5KTtcbnJldHVybiBmcm9tRW50cmllcyhkZWNvZGVkRW50cmllcyk7XG4gfVxuIH07XG5yZXR1cm4gaGFyZGVuKGRlY29kZUZyb21DYXBEYXRhKTtcbiB9OyRo4oCNX29uY2UubWFrZURlY29kZUZyb21DYXBEYXRhKG1ha2VEZWNvZGVGcm9tQ2FwRGF0YSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiUUNMQVNTIjpbIlFDTEFTUyJdLCJtYWtlRW5jb2RlVG9DYXBEYXRhIjpbIm1ha2VFbmNvZGVUb0NhcERhdGEiXSwibWFrZURlY29kZUZyb21DYXBEYXRhIjpbIm1ha2VEZWNvZGVGcm9tQ2FwRGF0YSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADAGgwheT0AAHk9AAAtAAAAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL2VuY29kZVRvU21hbGxjYXBzLmpzeyJpbXBvcnRzIjpbIi4vaGVscGVycy9lcnJvci5qcyIsIi4vaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vaGVscGVycy9zeW1ib2wuanMiLCIuL21ha2VUYWdnZWQuanMiLCIuL3Bhc3NTdHlsZU9mLmpzIl0sImV4cG9ydHMiOlsibWFrZURlY29kZUZyb21TbWFsbGNhcHMiLCJtYWtlRW5jb2RlVG9TbWFsbGNhcHMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgcGFzc1N0eWxlT2YsRXJyb3JIZWxwZXIsbWFrZVRhZ2dlZCxnZXRUYWcsaGFzT3duUHJvcGVydHlPZixhc3NlcnRQYXNzYWJsZVN5bWJvbCxuYW1lRm9yUGFzc2FibGVTeW1ib2wscGFzc2FibGVTeW1ib2xGb3JOYW1lOyRo4oCNX2ltcG9ydHMoW1tcIi4vcGFzc1N0eWxlT2YuanNcIiwgW1tcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvZXJyb3IuanNcIiwgW1tcIkVycm9ySGVscGVyXCIsIFskaOKAjV9hID0+IChFcnJvckhlbHBlciA9ICRo4oCNX2EpXV1dXSxbXCIuL21ha2VUYWdnZWQuanNcIiwgW1tcIm1ha2VUYWdnZWRcIiwgWyRo4oCNX2EgPT4gKG1ha2VUYWdnZWQgPSAkaOKAjV9hKV1dXV0sW1wiLi9oZWxwZXJzL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJnZXRUYWdcIiwgWyRo4oCNX2EgPT4gKGdldFRhZyA9ICRo4oCNX2EpXV0sW1wiaGFzT3duUHJvcGVydHlPZlwiLCBbJGjigI1fYSA9PiAoaGFzT3duUHJvcGVydHlPZiA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvc3ltYm9sLmpzXCIsIFtbXCJhc3NlcnRQYXNzYWJsZVN5bWJvbFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGFzc2FibGVTeW1ib2wgPSAkaOKAjV9hKV1dLFtcIm5hbWVGb3JQYXNzYWJsZVN5bWJvbFwiLCBbJGjigI1fYSA9PiAobmFtZUZvclBhc3NhYmxlU3ltYm9sID0gJGjigI1fYSldXSxbXCJwYXNzYWJsZVN5bWJvbEZvck5hbWVcIiwgWyRo4oCNX2EgPT4gKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlBhc3NhYmxlfSBQYXNzYWJsZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUmVtb3RhYmxlfSBSZW1vdGFibGUgKi9cbi8qIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuU21hbGxjYXBzRW5jb2Rpbmd9IFNtYWxsY2Fwc0VuY29kaW5nICpYLyovXG4vKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlNtYWxsY2Fwc0VuY29kaW5nVW5pb259IFNtYWxsY2Fwc0VuY29kaW5nVW5pb24gKlgvKi9cbi8qKiBAdHlwZWRlZiB7YW55fSBTbWFsbGNhcHNFbmNvZGluZyAqL1xuLyoqIEB0eXBlZGVmIHthbnl9IFNtYWxsY2Fwc0VuY29kaW5nVW5pb24gKi9cblxuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2lzQXJyYXl9PUFycmF5O1xuY29uc3R7aXMsZW50cmllcyxmcm9tRW50cmllc309T2JqZWN0O1xuY29uc3R7ZGV0YWlsczpYLEZhaWwscXVvdGU6cX09YXNzZXJ0O1xuXG5jb25zdCBCQU5HPSchJy5jaGFyQ29kZUF0KDApO1xuY29uc3QgREFTSD0nLScuY2hhckNvZGVBdCgwKTtcblxuLyoqXG4gKiBBbiBgZW5jb2RlVG9TbWFsbGNhcHNgIGZ1bmN0aW9uIHRha2VzIGEgcGFzc2FibGUgYW5kIHJldHVybnMgYVxuICogSlNPTi1yZXByZXNlbnRhYmxlIG9iamVjdCAoaS5lLiwgcm91bmQtdHJpcHBpbmcgaXQgdGhyb3VnaFxuICogYEpTT04uc3RyaW5naWZ5YCBhbmQgYEpTT04ucGFyc2VgIHdpdGggbm8gcmVwbGFjZXJzIG9yIHJldml2ZXJzXG4gKiByZXR1cm5zIGFuIGVxdWl2YWxlbnQgc3RydWN0dXJlIGV4Y2VwdCBmb3Igb2JqZWN0IGlkZW50aXR5KS5cbiAqIFdlIGNhbGwgdGhpcyByZXByZXNlbnRhdGlvbiBhIFNtYWxsY2FwcyBFbmNvZGluZy5cbiAqXG4gKiBBIGBkZWNvZGVGcm9tU21hbGxjYXBzYCBmdW5jdGlvbiB0YWtlcyBhcyBhcmd1bWVudCB3aGF0IGl0XG4gKiAqYXNzdW1lcyogaXMgdGhlIHJlc3VsdCBvZiBhIHBsYWluIGBKU09OLnBhcnNlYCB3aXRoIG5vIHJlc29sdmVyLiBJdCB0aGVuXG4gKiBtdXN0IHZhbGlkYXRlIHRoYXQgaXQgaXMgYSB2YWxpZCBTbWFsbGNhcHMgRW5jb2RpbmcsIGFuZCBpZiBpdCBpcyxcbiAqIHJldHVybiBhIGNvcnJlc3BvbmRpbmcgcGFzc2FibGUuXG4gKlxuICogU21hbGxjYXBzIGNvbnNpZGVycyB0aGUgY2hhcmFjdGVycyBiZXR3ZWVuIGAhYCAoYXNjaWkgY29kZSAzMywgQkFORylcbiAqIGFuZCBgLWAgKGFzY2lpIGNvZGUgNDUsIERBU0gpIHRvIGJlIHNwZWNpYWwgcHJlZml4ZXMgYWxsb3dpbmdcbiAqIHJlcHJlc2VudGF0aW9uIG9mIEpTT04taW5jb21wYXRpYmxlIGRhdGEgdXNpbmcgc3RyaW5ncy5cbiAqIFRoZXNlIGNoYXJhY3RlcnMsIGluIG9yZGVyLCBhcmUgYCFcIiMkJSYnKCkqKywtYFxuICogT2YgdGhlc2UsIHNtYWxsY2FwcyBjdXJyZW50bHkgdXNlcyB0aGUgZm9sbG93aW5nOlxuICpcbiAqICAqIGAhYCAtIGVzY2FwZWQgc3RyaW5nXG4gKiAgKiBgK2AgLSBub24tbmVnYXRpdmUgYmlnaW50XG4gKiAgKiBgLWAgLSBuZWdhdGl2ZSBiaWdpbnRcbiAqICAqIGAjYCAtIG1hbmlmZXN0IGNvbnN0YW50XG4gKiAgKiBgJWAgLSBzeW1ib2xcbiAqICAqIGAkYCAtIHJlbW90YWJsZVxuICogICogYCZgIC0gcHJvbWlzZVxuICpcbiAqIEFsbCBvdGhlciBzcGVjaWFsIGNoYXJhY3RlcnMgKGBcIicoKSosYCkgYXJlIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlLlxuICpcbiAqIFRoZSBtYW5pZmVzdCBjb25zdGFudHMgdGhhdCBzbWFsbGNhcHMgY3VycmVudGx5IHVzZXMgZm9yIHZhbHVlczpcbiAqICAqIGAjdW5kZWZpbmVkYFxuICogICogYCNOYU5gXG4gKiAgKiBgI0luZmluaXR5YFxuICogICogYCMtSW5maW5pdHlgXG4gKlxuICogYW5kIGZvciBwcm9wZXJ0eSBuYW1lcyBhbmFsb2dvdXMgdG8gY2FwZGF0YSBAcWNsYXNzOlxuICogICogYCN0YWdgXG4gKiAgKiBgI2Vycm9yYFxuICpcbiAqIEFsbCBvdGhlciBlbmNvZGVkIHN0cmluZ3MgYmVnaW5uaW5nIHdpdGggYCNgIGFyZSByZXNlcnZlZCBmb3JcbiAqIGZ1dHVyZSB1c2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGVuY29kZWRTdHJcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBzdGFydHNTcGVjaWFsPShlbmNvZGVkU3RyKT0+e1xuaWYoZW5jb2RlZFN0cj09PScnKXtcbnJldHVybiBmYWxzZTtcbiB9XG4vKiBjaGFyQ29kZUF0KDApIGFuZCBudW1iZXIgY29tcGFyZSBpcyBhIGJpdCBmYXN0ZXIuKi9cbmNvbnN0IGNvZGU9ZW5jb2RlZFN0ci5jaGFyQ29kZUF0KDApO1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHlvZGEqL1xucmV0dXJuIEJBTkc8PWNvZGUmJmNvZGU8PURBU0g7XG4gfTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBFbmNvZGVUb1NtYWxsY2Fwc09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7KFxuICogICByZW1vdGFibGU6IFJlbW90YWJsZSxcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gU21hbGxjYXBzRW5jb2RpbmdcbiAqICkgPT4gU21hbGxjYXBzRW5jb2Rpbmd9IFtlbmNvZGVSZW1vdGFibGVUb1NtYWxsY2Fwc11cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBwcm9taXNlOiBQcm9taXNlLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBTbWFsbGNhcHNFbmNvZGluZ1xuICogKSA9PiBTbWFsbGNhcHNFbmNvZGluZ30gW2VuY29kZVByb21pc2VUb1NtYWxsY2Fwc11cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlcnJvcjogRXJyb3IsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IFNtYWxsY2Fwc0VuY29kaW5nXG4gKiApID0+IFNtYWxsY2Fwc0VuY29kaW5nfSBbZW5jb2RlRXJyb3JUb1NtYWxsY2Fwc11cbiAqL1xuXG5jb25zdCBkb250RW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHM9KHJlbSk9PlxuRmFpbCBgcmVtb3RhYmxlIHVuZXhwZWN0ZWQ6ICR7cmVtfWA7XG5cbmNvbnN0IGRvbnRFbmNvZGVQcm9taXNlVG9TbWFsbGNhcHM9KHByb20pPT5GYWlsIGBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7cHJvbX1gO1xuXG5jb25zdCBkb250RW5jb2RlRXJyb3JUb1NtYWxsY2Fwcz0oZXJyKT0+XG5GYWlsIGBlcnJvciBvYmplY3QgdW5leHBlY3RlZDogJHtxKGVycil9YDtcblxuLyoqXG4gKiBAcGFyYW0ge0VuY29kZVRvU21hbGxjYXBzT3B0aW9uc30gZW5jb2RlT3B0aW9uc1xuICogQHJldHVybnMgeyhwYXNzYWJsZTogUGFzc2FibGUpID0+IFNtYWxsY2Fwc0VuY29kaW5nfVxuICovXG5jb25zdCAgICAgICAgbWFrZUVuY29kZVRvU21hbGxjYXBzPSh7XG5lbmNvZGVSZW1vdGFibGVUb1NtYWxsY2Fwcz1kb250RW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHMsXG5lbmNvZGVQcm9taXNlVG9TbWFsbGNhcHM9ZG9udEVuY29kZVByb21pc2VUb1NtYWxsY2FwcyxcbmVuY29kZUVycm9yVG9TbWFsbGNhcHM9ZG9udEVuY29kZUVycm9yVG9TbWFsbGNhcHN9PVxue30pPT57XG4vKipcbiAqIE11c3QgZW5jb2RlIGB2YWxgIGludG8gcGxhaW4gSlNPTiBkYXRhICpjYW5vbmljYWxseSosIHN1Y2ggdGhhdFxuICogYEpTT04uc3RyaW5naWZ5KGVuY29kZSh2MSkpID09PSBKU09OLnN0cmluZ2lmeShlbmNvZGUodjEpKWAuIEZvciBtb3N0XG4gKiBlbmNvZGluZ3MsIHRoZSBvcmRlciBvZiBwcm9wZXJ0aWVzIG9mIGVhY2ggbm9kZSBvZiB0aGUgb3V0cHV0XG4gKiBzdHJ1Y3R1cmUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgYWxnb3JpdGhtIGJlbG93IHdpdGhvdXQgc3BlY2lhbFxuICogYXJyYW5nZW1lbnQsIHVzdWFsbHkgYnkgYmVpbmcgZXhwcmVzc2VkIGRpcmVjdGx5IGFzIGFuIG9iamVjdCBsaXRlcmFsLlxuICogVGhlIGV4Y2VwdGlvbiBpcyBjb3B5UmVjb3Jkcywgd2hvc2UgbmF0dXJhbCBlbnVtZXJhdGlvbiBvcmRlclxuICogY2FuIGRpZmZlciBiZXR3ZWVuIGNvcHlSZWNvcmRzIHRoYXQgb3VyIGRpc3RyaWJ1dGVkIG9iamVjdCBzZW1hbnRpY3NcbiAqIGNvbnNpZGVycyB0byBiZSBlcXVpdmFsZW50LlxuICogU2luY2UsIGZvciBlYWNoIGNvcHlSZWNvcmQsIHdlIG9ubHkgYWNjZXB0IHN0cmluZyBwcm9wZXJ0eSBuYW1lcyxcbiAqIG5vdCBzeW1ib2xzLCB3ZSBjYW4gY2Fub25pY2FsbHkgc29ydCB0aGUgbmFtZXMgZmlyc3QuXG4gKiBKU09OLnN0cmluZ2lmeSB3aWxsIHRoZW4gdmlzaXQgdGhlc2UgaW4gdGhhdCBzb3J0ZWQgb3JkZXIuXG4gKlxuICogU21hbGxjYXBzRW5jb2Rpbmcgd2l0aCBhIGNhbm9uaWNhbC1KU09OIGVuY29kZXIgd291bGQgYWxzbyBzb2x2ZVxuICogdGhpcyBjYW5vbmljYWxuZXNzXG4gKiBwcm9ibGVtIGluIGEgbW9yZSBtb2R1bGFyIGFuZCBlbmNhcHN1bGF0ZWQgbWFubmVyLiBOb3RlIHRoYXQgdGhlXG4gKiBhY3R1YWwgb3JkZXIgcHJvZHVjZWQgaGVyZSwgdGhvdWdoIGl0IGFncmVlcyB3aXRoIGNhbm9uaWNhbC1KU09OIG9uXG4gKiBjb3B5UmVjb3JkIHByb3BlcnR5IG9yZGVyaW5nLCBkaWZmZXJzIGZyb20gY2Fub25pY2FsLUpTT04gYXMgYSB3aG9sZVxuICogaW4gdGhhdCB0aGUgb3RoZXIgcmVjb3JkIHByb3BlcnRpZXMgYXJlIHZpc2l0ZWQgaW4gdGhlIG9yZGVyIGluIHdoaWNoXG4gKiB0aGV5IGFyZSBsaXRlcmFsbHkgd3JpdHRlbiBiZWxvdy4gVE9ETyBwZXJoYXBzIHdlIHNob3VsZCBpbmRlZWQgc3dpdGNoXG4gKiB0byBhIGNhbm9uaWNhbCBKU09OIGVuY29kZXIsIGFuZCBub3QgZGVsaWNhdGV0bHkgZGVwZW5kIG9uIHRoZSBvcmRlclxuICogaW4gd2hpY2ggdGhlc2Ugb2JqZWN0IGxpdGVyYWxzIGFyZSB3cml0dGVuLlxuICpcbiAqIFJlYWRlcnMgbXVzdCBub3QgY2FyZSBhYm91dCB0aGlzIG9yZGVyIGFueXdheS4gV2UgaW1wb3NlIHRoaXMgcmVxdWlyZW1lbnRcbiAqIG1haW5seSB0byByZWR1Y2Ugbm9uLWRldGVybWluaXNtIGV4cG9zZWQgb3V0c2lkZSBhIHZhdC5cbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBwYXNzYWJsZVxuICogQHJldHVybnMge1NtYWxsY2Fwc0VuY29kaW5nfSBleGNlcHQgdGhhdCBgZW5jb2RlVG9TbWFsbGNhcHNgIGRvZXMgbm90IGdlbmVyYWxseVxuICogYGhhcmRlbmAgdGhpcyByZXN1bHQgYmVmb3JlIHJldHVybmluZy4gUmF0aGVyLCBgZW5jb2RlVG9TbWFsbGNhcHNgIGlzIG5vdFxuICogZGlyZWN0bHkgZXhwb3NlZC5cbiAqIFdoYXQncyBleHBvc2VkIGluc3RlYWQgaXMgYSB3cmFwcGVyIHRoYXQgZnJlZXplcyB0aGUgb3V0cHV0IGJlZm9yZVxuICogcmV0dXJuaW5nLiBJZiB0aGlzIHR1cm5zIG91dCB0byBpbXBlZGUgc3RhdGljIGFuYWx5c2lzIGZvciBgaGFyZGVuYCBzYWZldHksXG4gKiB3ZSBjYW4gYWx3YXlzIHB1dCB0aGUgKG5vdyByZWR1bmRhbnQpIGhhcmRlbnMgYmFjayBpbi4gVGhleSBkb24ndCBodXJ0LlxuICovXG5jb25zdCBlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyPShwYXNzYWJsZSk9Pntcbi8qIEZpcnN0IHdlIGhhbmRsZSBhbGwgcHJpbWl0aXZlcy4gU29tZSBjYW4gYmUgcmVwcmVzZW50ZWQgZGlyZWN0bHkgYXMqL1xuLyogSlNPTiwgYW5kIHNvbWUgbXVzdCBiZSBlbmNvZGVkIGludG8gc21hbGxjYXBzIHN0cmluZ3MuKi9cbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihwYXNzYWJsZSk7XG5zd2l0Y2gocGFzc1N0eWxlKXtcbmNhc2UnbnVsbCc6XG5jYXNlJ2Jvb2xlYW4nOntcbi8qIHBhc3MgdGhyb3VnaCB0byBKU09OKi9cbnJldHVybiBwYXNzYWJsZTtcbiB9XG5jYXNlJ3N0cmluZyc6e1xuaWYoc3RhcnRzU3BlY2lhbChwYXNzYWJsZSkpe1xuLyogU3RyaW5ncyB0aGF0IHN0YXJ0IHdpdGggYSBzcGVjaWFsIGNoYXIgYXJlIHF1b3RlZCB3aXRoIGAhYC4qL1xuLyogU2luY2UgYCFgIGlzIGl0c2VsZiBhIHNwZWNpYWwgY2hhcmFjdGVyLCB0aGlzIHRyaXZpYWxseSBkb2VzKi9cbi8qIHRoZSBIaWxiZXJ0IGhvdGVsLiBBbHNvLCBzaW5jZSB0aGUgc3BlY2lhbCBjaGFyYWN0ZXJzIGFyZSovXG4vKiBhIGNvbnRpbnVvdXMgc3VicmFuZ2Ugb2YgYXNjaWksIHRoaXMgcXVvdGluZyBpcyBzb3J0LW9yZGVyKi9cbi8qIHByZXNlcnZpbmcuKi9cbnJldHVybiBgISR7cGFzc2FibGV9YDtcbiB9XG4vKiBBbGwgb3RoZXIgc3RyaW5ncyBwYXNzIHRocm91Z2ggdG8gSlNPTiovXG5yZXR1cm4gcGFzc2FibGU7XG4gfVxuY2FzZSdzeW1ib2wnOntcbi8qIEF0IHRoZSBzbWFsbGNhcHMgbGV2ZWwsIHdlIHByZWZpeCBzeW1ib2wgbmFtZXMgd2l0aCBgJWAuKi9cbi8qIEJ5IFwic3ltYm9sIG5hbWVcIiwgd2UgbWVhbiBhY2NvcmRpbmcgdG8gYG5hbWVGb3JQYXNzYWJsZVN5bWJvbGAqL1xuLyogd2hpY2ggZG9lcyBzb21lIGZ1cnRoZXIgZXNjYXBpbmcuIFNlZSBjb21tZW50IG9uIHRoYXQgZnVuY3Rpb24uKi9cbmFzc2VydFBhc3NhYmxlU3ltYm9sKHBhc3NhYmxlKTtcbmNvbnN0IG5hbWU9LyoqIEB0eXBlIHtzdHJpbmd9ICovbmFtZUZvclBhc3NhYmxlU3ltYm9sKHBhc3NhYmxlKTtcbnJldHVybiBgJSR7bmFtZX1gO1xuIH1cbmNhc2UndW5kZWZpbmVkJzp7XG5yZXR1cm4nI3VuZGVmaW5lZCc7XG4gfVxuY2FzZSdudW1iZXInOntcbmlmKE51bWJlci5pc05hTihwYXNzYWJsZSkpe1xucmV0dXJuJyNOYU4nO1xuIH1cbmlmKGlzKHBhc3NhYmxlLC0wKSl7XG5yZXR1cm4gMDtcbiB9XG5pZihwYXNzYWJsZT09PUluZmluaXR5KXtcbnJldHVybicjSW5maW5pdHknO1xuIH1cbmlmKHBhc3NhYmxlPT09LUluZmluaXR5KXtcbnJldHVybicjLUluZmluaXR5JztcbiB9XG4vKiBBbGwgb3RoZXIgbnVtYmVycyBwYXNzIHRocm91Z2ggdG8gSlNPTiovXG5yZXR1cm4gcGFzc2FibGU7XG4gfVxuY2FzZSdiaWdpbnQnOntcbmNvbnN0IHN0cj1TdHJpbmcocGFzc2FibGUpO1xucmV0dXJuIHBhc3NhYmxlPDBuP3N0cjogYCske3N0cn1gO1xuIH1cbmNhc2UnY29weVJlY29yZCc6e1xuLyogQ3VycmVudGx5IGNvcHlSZWNvcmQgYWxsb3dzIG9ubHkgc3RyaW5nIGtleXMgc28gdGhpcyB3aWxsKi9cbi8qIHdvcmsuIElmIHdlIGFsbG93IHNvcnRhYmxlIHN5bWJvbCBrZXlzLCB0aGlzIHdpbGwgbmVlZCB0byovXG4vKiBiZWNvbWUgbW9yZSBpbnRlcmVzdGluZy4qL1xuY29uc3QgbmFtZXM9b3duS2V5cyhwYXNzYWJsZSkuc29ydCgpO1xucmV0dXJuIGZyb21FbnRyaWVzKFxubmFtZXMubWFwKChuYW1lKT0+W1xuZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihuYW1lKSxcbmVuY29kZVRvU21hbGxjYXBzUmVjdXIocGFzc2FibGVbbmFtZV0pXSkpO1xuXG5cbiB9XG5jYXNlJ2NvcHlBcnJheSc6e1xucmV0dXJuIHBhc3NhYmxlLm1hcChlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKTtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xucmV0dXJue1xuJyN0YWcnOmVuY29kZVRvU21hbGxjYXBzUmVjdXIoZ2V0VGFnKHBhc3NhYmxlKSksXG5wYXlsb2FkOmVuY29kZVRvU21hbGxjYXBzUmVjdXIocGFzc2FibGUucGF5bG9hZCl9O1xuXG4gfVxuY2FzZSdyZW1vdGFibGUnOntcbmNvbnN0IHJlc3VsdD1lbmNvZGVSZW1vdGFibGVUb1NtYWxsY2FwcyhcbnBhc3NhYmxlLFxuZW5jb2RlVG9TbWFsbGNhcHNSZWN1cik7XG5cbmlmKHR5cGVvZiByZXN1bHQ9PT0nc3RyaW5nJyYmcmVzdWx0LnN0YXJ0c1dpdGgoJyQnKSl7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbi8qIGB0aHJvd2AgaXMgbm9vcCBzaW5jZSBgRmFpbGAgdGhyb3dzLiBCdXQgbGludGVyIGNvbmZ1c2VkKi9cbnRocm93IEZhaWwgYGludGVybmFsOiBSZW1vdGFibGUgZW5jb2RpbmcgbXVzdCBzdGFydCB3aXRoIFwiJFwiOiAke3Jlc3VsdH1gO1xuIH1cbmNhc2UncHJvbWlzZSc6e1xuY29uc3QgcmVzdWx0PWVuY29kZVByb21pc2VUb1NtYWxsY2FwcyhcbnBhc3NhYmxlLFxuZW5jb2RlVG9TbWFsbGNhcHNSZWN1cik7XG5cbmlmKHR5cGVvZiByZXN1bHQ9PT0nc3RyaW5nJyYmcmVzdWx0LnN0YXJ0c1dpdGgoJyYnKSl7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbnRocm93IEZhaWwgYGludGVybmFsOiBQcm9taXNlIGVuY29kaW5nIG11c3Qgc3RhcnQgd2l0aCBcIiZcIjogJHtyZXN1bHR9YDtcbiB9XG5jYXNlJ2Vycm9yJzp7XG5jb25zdCByZXN1bHQ9ZW5jb2RlRXJyb3JUb1NtYWxsY2FwcyhwYXNzYWJsZSxlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKTtcbmlmKHR5cGVvZiByZXN1bHQ9PT0nb2JqZWN0JyYmaGFzT3duUHJvcGVydHlPZihyZXN1bHQsJyNlcnJvcicpKXtcbmNvbnN0IG1lc3NhZ2U9cmVzdWx0WycjZXJyb3InXTtcbmlmKFxudHlwZW9mIG1lc3NhZ2U9PT0nc3RyaW5nJyYmKFxuLyogY2hlY2sgdGhhdCBpdCBkZWNvZGVzIHRvIGEgc3RyaW5nKi9cbiFzdGFydHNTcGVjaWFsKG1lc3NhZ2UpfHxtZXNzYWdlLnN0YXJ0c1dpdGgoJyEnKSkpXG57XG5yZXR1cm4gcmVzdWx0O1xuIH1cbkZhaWwgYGludGVybmFsOiBFcnJvciBlbmNvZGluZyBtdXN0IGhhdmUgc3RyaW5nIG1lc3NhZ2U6ICR7cShcbm1lc3NhZ2UpXG4gfWA7XG4gfVxudGhyb3cgRmFpbCBgaW50ZXJuYWw6IEVycm9yIGVuY29kaW5nIG11c3QgaGF2ZSBcIiNlcnJvclwiIHByb3BlcnR5OiAke3EoXG5yZXN1bHQpXG4gfWA7XG4gfVxuZGVmYXVsdDp7XG5hc3NlcnQuZmFpbChcblggYGludGVybmFsOiBVbnJlY29nbml6ZWQgcGFzc1N0eWxlICR7cShwYXNzU3R5bGUpfWAsXG5UeXBlRXJyb3IpO1xuXG4gfX1cblxuIH07XG5jb25zdCBlbmNvZGVUb1NtYWxsY2Fwcz0ocGFzc2FibGUpPT57XG5pZihFcnJvckhlbHBlci5jYW5CZVZhbGlkKHBhc3NhYmxlKSl7XG4vKiBXZSBwdWxsIG91dCB0aGlzIHNwZWNpYWwgY2FzZSB0byBhY2NvbW1vZGF0ZSBlcnJvcnMgdGhhdCBhcmUgbm90Ki9cbi8qIHZhbGlkIFBhc3NhYmxlcy4gRm9yIGV4YW1wbGUsIGJlY2F1c2UgdGhleSdyZSBub3QgZnJvemVuLiovXG4vKiBUaGUgc3BlY2lhbCBjYXNlIGNhbiBvbmx5IGV2ZXIgYXBwbHkgYXQgdGhlIHJvb3QsIGFuZCB0aGVyZWZvcmUqL1xuLyogb3V0c2lkZSB0aGUgcmVjdXJzaW9uLCBzaW5jZSBhbiBlcnJvciBjb3VsZCBvbmx5IGJlIGRlZXBlciBpbiovXG4vKiBhIHBhc3NhYmxlIHN0cnVjdHVyZSBpZiBpdCB3ZXJlIHBhc3NhYmxlLiovXG4vKiovXG4vKiBXZSBwdWxsIG91dCB0aGlzIHNwZWNpYWwgY2FzZSBiZWNhdXNlLCBmb3IgdGhlc2UgZXJyb3JzLCB3ZSdyZSBtdWNoKi9cbi8qIG1vcmUgaW50ZXJlc3RlZCBpbiByZXBvcnRpbmcgd2hhdGV2ZXIgZGlhZ25vc3RpYyBpbmZvcm1hdGlvbiB0aGV5Ki9cbi8qIGNhcnJ5IHRoYW4gd2UgYXJlIGFib3V0IHJlcG9ydGluZyBwcm9ibGVtcyBlbmNvdW50ZXJlZCBpbiByZXBvcnRpbmcqL1xuLyogdGhpcyBpbmZvcm1hdGlvbi4qL1xuY29uc3QgcmVzdWx0PWhhcmRlbihcbmVuY29kZUVycm9yVG9TbWFsbGNhcHMocGFzc2FibGUsZW5jb2RlVG9TbWFsbGNhcHNSZWN1cikpO1xuXG5pZih0eXBlb2YgcmVzdWx0PT09J29iamVjdCcmJmhhc093blByb3BlcnR5T2YocmVzdWx0LCcjZXJyb3InKSl7XG5jb25zdCBtZXNzYWdlPXJlc3VsdFsnI2Vycm9yJ107XG5pZihcbnR5cGVvZiBtZXNzYWdlPT09J3N0cmluZycmJihcbi8qIGNoZWNrIHRoYXQgaXQgZGVjb2RlcyB0byBhIHN0cmluZyovXG4hc3RhcnRzU3BlY2lhbChtZXNzYWdlKXx8bWVzc2FnZS5zdGFydHNXaXRoKCchJykpKVxue1xucmV0dXJuIHJlc3VsdDtcbiB9XG5GYWlsIGBpbnRlcm5hbDogRXJyb3IgZW5jb2RpbmcgbXVzdCBzdHJpbmcgbWVzc2FnZTogJHtxKG1lc3NhZ2UpfWA7XG4gfVxuRmFpbCBgaW50ZXJuYWw6IEVycm9yIGVuY29kaW5nIG11c3QgaGF2ZSBcIiNlcnJvclwiIHByb3BlcnR5OiAke3EocmVzdWx0KX1gO1xuIH1cbnJldHVybiBoYXJkZW4oZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihwYXNzYWJsZSkpO1xuIH07XG5yZXR1cm4gaGFyZGVuKGVuY29kZVRvU21hbGxjYXBzKTtcbiB9OyRo4oCNX29uY2UubWFrZUVuY29kZVRvU21hbGxjYXBzKG1ha2VFbmNvZGVUb1NtYWxsY2Fwcyk7XG5oYXJkZW4obWFrZUVuY29kZVRvU21hbGxjYXBzKTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBEZWNvZGVGcm9tU21hbGxjYXBzT3B0aW9uc1xuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRSZW1vdGFibGU6IFNtYWxsY2Fwc0VuY29kaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGUgOlNtYWxsY2Fwc0VuY29kaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiBSZW1vdGFibGV9IFtkZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRQcm9taXNlOiBTbWFsbGNhcHNFbmNvZGluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlIDpTbWFsbGNhcHNFbmNvZGluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gUHJvbWlzZX0gW2RlY29kZVByb21pc2VGcm9tU21hbGxjYXBzXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRFcnJvcjogU21hbGxjYXBzRW5jb2RpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZSA6U21hbGxjYXBzRW5jb2RpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IEVycm9yfSBbZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzXVxuICovXG5cbmNvbnN0IGRvbnREZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzPShlbmNvZGluZyk9PlxuRmFpbCBgcmVtb3RhYmxlIHVuZXhwZWN0ZWQ6ICR7ZW5jb2Rpbmd9YDtcbmNvbnN0IGRvbnREZWNvZGVQcm9taXNlRnJvbVNtYWxsY2Fwcz0oZW5jb2RpbmcpPT5cbkZhaWwgYHByb21pc2UgdW5leHBlY3RlZDogJHtlbmNvZGluZ31gO1xuY29uc3QgZG9udERlY29kZUVycm9yRnJvbVNtYWxsY2Fwcz0oZW5jb2RpbmcpPT5cbkZhaWwgYGVycm9yIHVuZXhwZWN0ZWQ6ICR7cShlbmNvZGluZyl9YDtcblxuLyoqXG4gKiBAcGFyYW0ge0RlY29kZUZyb21TbWFsbGNhcHNPcHRpb25zfSBkZWNvZGVPcHRpb25zXG4gKiBAcmV0dXJucyB7KGVuY29kZWQ6IFNtYWxsY2Fwc0VuY29kaW5nKSA9PiBQYXNzYWJsZX1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VEZWNvZGVGcm9tU21hbGxjYXBzPSh7XG5kZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzPWRvbnREZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzLFxuZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHM9ZG9udERlY29kZVByb21pc2VGcm9tU21hbGxjYXBzLFxuZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzPWRvbnREZWNvZGVFcnJvckZyb21TbWFsbGNhcHN9PVxue30pPT57XG4vKipcbiAqIGBkZWNvZGVGcm9tU21hbGxjYXBzYCBtYXkgcmVseSBvbiBgZW5jb2RpbmdgIGJlaW5nIHRoZSByZXN1bHQgb2YgYVxuICogcGxhaW4gY2FsbCB0byBKU09OLnBhcnNlLiBIb3dldmVyLCBpdCAqY2Fubm90KiByZWx5IG9uIGBlbmNvZGluZ2BcbiAqIGhhdmluZyBiZWVuIHByb2R1Y2VkIGJ5IEpTT04uc3RyaW5naWZ5IG9uIHRoZSBvdXRwdXQgb2YgYGVuY29kZVRvU21hbGxjYXBzYFxuICogYWJvdmUsIGkuZS4sIGBkZWNvZGVGcm9tU21hbGxjYXBzYCBjYW5ub3QgcmVseSBvbiBgZW5jb2RpbmdgIGJlaW5nIGFcbiAqIHZhbGlkIG1hcnNoYWxsZWQgcmVwcmVzZW50YXRpb24uIFJhdGhlciwgYGRlY29kZUZyb21TbWFsbGNhcHNgIG11c3RcbiAqIHZhbGlkYXRlIHRoYXQuXG4gKlxuICogQHBhcmFtIHtTbWFsbGNhcHNFbmNvZGluZ30gZW5jb2RpbmcgbXVzdCBiZSBoYXJkZW5lZFxuICovXG5jb25zdCBkZWNvZGVGcm9tU21hbGxjYXBzPShlbmNvZGluZyk9PntcbnN3aXRjaCh0eXBlb2YgZW5jb2Rpbmcpe1xuY2FzZSdib29sZWFuJzpcbmNhc2UnbnVtYmVyJzp7XG5yZXR1cm4gZW5jb2Rpbmc7XG4gfVxuY2FzZSdzdHJpbmcnOntcbmlmKCFzdGFydHNTcGVjaWFsKGVuY29kaW5nKSl7XG5yZXR1cm4gZW5jb2Rpbmc7XG4gfVxuY29uc3QgYz1lbmNvZGluZy5jaGFyQXQoMCk7XG5zd2l0Y2goYyl7XG5jYXNlJyEnOntcbi8qIHVuLWhpbGJlcnQtaWZ5IHRoZSBzdHJpbmcqL1xucmV0dXJuIGVuY29kaW5nLnNsaWNlKDEpO1xuIH1cbmNhc2UnJSc6e1xucmV0dXJuIHBhc3NhYmxlU3ltYm9sRm9yTmFtZShlbmNvZGluZy5zbGljZSgxKSk7XG4gfVxuY2FzZScjJzp7XG5zd2l0Y2goZW5jb2Rpbmcpe1xuY2FzZScjdW5kZWZpbmVkJzp7XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cbmNhc2UnI05hTic6e1xucmV0dXJuIE5hTjtcbiB9XG5jYXNlJyNJbmZpbml0eSc6e1xucmV0dXJuIEluZmluaXR5O1xuIH1cbmNhc2UnIy1JbmZpbml0eSc6e1xucmV0dXJuLUluZmluaXR5O1xuIH1cbmRlZmF1bHQ6e1xuYXNzZXJ0LmZhaWwoWCBgdW5rbm93biBjb25zdGFudCBcIiR7cShlbmNvZGluZyl9XCJgLFR5cGVFcnJvcik7XG4gfX1cblxuIH1cbmNhc2UnKyc6e1xucmV0dXJuIEJpZ0ludChlbmNvZGluZy5zbGljZSgxKSk7XG4gfVxuY2FzZSctJzp7XG5yZXR1cm4gQmlnSW50KGVuY29kaW5nKTtcbiB9XG5jYXNlJyQnOntcbmNvbnN0IHJlc3VsdD1kZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzKFxuZW5jb2RpbmcsXG5kZWNvZGVGcm9tU21hbGxjYXBzKTtcblxuaWYocGFzc1N0eWxlT2YocmVzdWx0KSE9PSdyZW1vdGFibGUnKXtcbkZhaWwgYGludGVybmFsOiBkZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzIG9wdGlvbiBtdXN0IHJldHVybiBhIHJlbW90YWJsZTogJHtyZXN1bHR9YDtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH1cbmNhc2UnJic6e1xuY29uc3QgcmVzdWx0PWRlY29kZVByb21pc2VGcm9tU21hbGxjYXBzKFxuZW5jb2RpbmcsXG5kZWNvZGVGcm9tU21hbGxjYXBzKTtcblxuaWYocGFzc1N0eWxlT2YocmVzdWx0KSE9PSdwcm9taXNlJyl7XG5GYWlsIGBpbnRlcm5hbDogZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHMgb3B0aW9uIG11c3QgcmV0dXJuIGEgcHJvbWlzZTogJHtyZXN1bHR9YDtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH1cbmRlZmF1bHQ6e1xudGhyb3cgRmFpbCBgU3BlY2lhbCBjaGFyICR7cShcbmMpXG4gfSByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZTogJHtlbmNvZGluZ31gO1xuIH19XG5cbiB9XG5jYXNlJ29iamVjdCc6e1xuaWYoZW5jb2Rpbmc9PT1udWxsKXtcbnJldHVybiBlbmNvZGluZztcbiB9XG5cbmlmKGlzQXJyYXkoZW5jb2RpbmcpKXtcbnJldHVybiBlbmNvZGluZy5tYXAoKHZhbCk9PmRlY29kZUZyb21TbWFsbGNhcHModmFsKSk7XG4gfVxuXG5pZihoYXNPd25Qcm9wZXJ0eU9mKGVuY29kaW5nLCcjdGFnJykpe1xuY29uc3R7JyN0YWcnOnRhZyxwYXlsb2FkLC4uLnJlc3R9PWVuY29kaW5nO1xudHlwZW9mIHRhZz09PSdzdHJpbmcnfHxcbkZhaWwgYFZhbHVlIG9mIFwiI3RhZ1wiLCB0aGUgdGFnLCBtdXN0IGJlIGEgc3RyaW5nOiAke2VuY29kaW5nfWA7XG5vd25LZXlzKHJlc3QpLmxlbmd0aD09PTB8fFxuRmFpbCBgI3RhZyByZWNvcmQgdW5leHBlY3RlZCBwcm9wZXJ0aWVzOiAke3Eob3duS2V5cyhyZXN0KSl9YDtcbnJldHVybiBtYWtlVGFnZ2VkKFxuZGVjb2RlRnJvbVNtYWxsY2Fwcyh0YWcpLFxuZGVjb2RlRnJvbVNtYWxsY2FwcyhwYXlsb2FkKSk7XG5cbiB9XG5cbmlmKGhhc093blByb3BlcnR5T2YoZW5jb2RpbmcsJyNlcnJvcicpKXtcbmNvbnN0IHJlc3VsdD1kZWNvZGVFcnJvckZyb21TbWFsbGNhcHMoXG5lbmNvZGluZyxcbmRlY29kZUZyb21TbWFsbGNhcHMpO1xuXG5wYXNzU3R5bGVPZihyZXN1bHQpPT09J2Vycm9yJ3x8XG5GYWlsIGBpbnRlcm5hbDogZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzIG9wdGlvbiBtdXN0IHJldHVybiBhbiBlcnJvcjogJHtyZXN1bHR9YDtcbnJldHVybiByZXN1bHQ7XG4gfVxuXG5jb25zdCBkZWNvZGVFbnRyeT0oW2VuY29kZWROYW1lLGVuY29kZWRWYWxdKT0+e1xudHlwZW9mIGVuY29kZWROYW1lPT09J3N0cmluZyd8fFxuRmFpbCBgUHJvcGVydHkgbmFtZSAke3EoXG5lbmNvZGVkTmFtZSlcbiB9IG9mICR7ZW5jb2Rpbmd9IG11c3QgYmUgYSBzdHJpbmdgO1xuIWVuY29kZWROYW1lLnN0YXJ0c1dpdGgoJyMnKXx8XG5GYWlsIGBVbnJlY29nbml6ZWQgcmVjb3JkIHR5cGUgJHtxKGVuY29kZWROYW1lKX06ICR7ZW5jb2Rpbmd9YDtcbmNvbnN0IG5hbWU9ZGVjb2RlRnJvbVNtYWxsY2FwcyhlbmNvZGVkTmFtZSk7XG50eXBlb2YgbmFtZT09PSdzdHJpbmcnfHxcbkZhaWwgYERlY29kZWQgcHJvcGVydHkgbmFtZSAke25hbWV9IGZyb20gJHtlbmNvZGluZ30gbXVzdCBiZSBhIHN0cmluZ2A7XG5yZXR1cm5bbmFtZSxkZWNvZGVGcm9tU21hbGxjYXBzKGVuY29kZWRWYWwpXTtcbiB9O1xuY29uc3QgZGVjb2RlZEVudHJpZXM9ZW50cmllcyhlbmNvZGluZykubWFwKGRlY29kZUVudHJ5KTtcbnJldHVybiBmcm9tRW50cmllcyhkZWNvZGVkRW50cmllcyk7XG4gfVxuZGVmYXVsdDp7XG5hc3NlcnQuZmFpbChcblggYGludGVybmFsOiB1bnJlY29nbml6ZWQgSlNPTiB0eXBlb2YgJHtxKFxudHlwZW9mIGVuY29kaW5nKVxuIH06ICR7ZW5jb2Rpbmd9YCxcblR5cGVFcnJvcik7XG5cbiB9fVxuXG4gfTtcbnJldHVybiBoYXJkZW4oZGVjb2RlRnJvbVNtYWxsY2Fwcyk7XG4gfTskaOKAjV9vbmNlLm1ha2VEZWNvZGVGcm9tU21hbGxjYXBzKG1ha2VEZWNvZGVGcm9tU21hbGxjYXBzKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlRW5jb2RlVG9TbWFsbGNhcHMiOlsibWFrZUVuY29kZVRvU21hbGxjYXBzIl0sIm1ha2VEZWNvZGVGcm9tU21hbGxjYXBzIjpbIm1ha2VEZWNvZGVGcm9tU21hbGxjYXBzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKbKF2ToBgAA6AYAAC0AAABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvaGVscGVycy9jb3B5QXJyYXkuanN7ImltcG9ydHMiOlsiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbIkNvcHlBcnJheUhlbHBlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnRDaGVja2VyLGNoZWNrTm9ybWFsUHJvcGVydHk7JGjigI1faW1wb3J0cyhbW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV0sW1wiY2hlY2tOb3JtYWxQcm9wZXJ0eVwiLCBbJGjigI1fYSA9PiAoY2hlY2tOb3JtYWxQcm9wZXJ0eSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cbmNvbnN0e2RldGFpbHM6WH09YXNzZXJ0O1xuY29uc3R7Z2V0UHJvdG90eXBlT2Z9PU9iamVjdDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtpc0FycmF5LHByb3RvdHlwZTphcnJheVByb3RvdHlwZX09QXJyYXk7XG5cbi8qKlxuICpcbiAqIEB0eXBlIHtYaW1wb3J0KCcuL2ludGVybmFsLXR5cGVzLmpzJykuUGFzc1N0eWxlSGVscGVyfVxuICovXG5jb25zdCAgICAgICAgQ29weUFycmF5SGVscGVyPWhhcmRlbih7XG5zdHlsZU5hbWU6J2NvcHlBcnJheScsXG5cbmNhbkJlVmFsaWQ6KGNhbmRpZGF0ZSxjaGVjayk9PlxuaXNBcnJheShjYW5kaWRhdGUpfHxcbiEhY2hlY2smJmNoZWNrKGZhbHNlLFggYEFycmF5IGV4cGVjdGVkOiAke2NhbmRpZGF0ZX1gKSxcblxuYXNzZXJ0VmFsaWQ6KGNhbmRpZGF0ZSxwYXNzU3R5bGVPZlJlY3VyKT0+e1xuQ29weUFycmF5SGVscGVyLmNhbkJlVmFsaWQoY2FuZGlkYXRlLGFzc2VydENoZWNrZXIpO1xuZ2V0UHJvdG90eXBlT2YoY2FuZGlkYXRlKT09PWFycmF5UHJvdG90eXBlfHxcbmFzc2VydC5mYWlsKFggYE1hbGZvcm1lZCBhcnJheTogJHtjYW5kaWRhdGV9YCxUeXBlRXJyb3IpO1xuLyogU2luY2Ugd2UncmUgYWxyZWFkeSBlbnN1cmVkIGNhbmRpZGF0ZSBpcyBhbiBhcnJheSwgaXQgc2hvdWxkIG5vdCBiZSovXG4vKiBwb3NzaWJsZSBmb3IgdGhlIGZvbGxvd2luZyB0ZXN0IHRvIGZhaWwqL1xuY2hlY2tOb3JtYWxQcm9wZXJ0eShjYW5kaWRhdGUsJ2xlbmd0aCcsZmFsc2UsYXNzZXJ0Q2hlY2tlcik7XG5jb25zdCBsZW49Y2FuZGlkYXRlLmxlbmd0aDtcbmZvcihsZXQgaT0wO2k8bGVuO2krPTEpe1xuY2hlY2tOb3JtYWxQcm9wZXJ0eShjYW5kaWRhdGUsaSx0cnVlLGFzc2VydENoZWNrZXIpO1xuIH1cbi8qICsxIGZvciB0aGUgJ2xlbmd0aCcgcHJvcGVydHkgaXRzZWxmLiovXG5vd25LZXlzKGNhbmRpZGF0ZSkubGVuZ3RoPT09bGVuKzF8fFxuYXNzZXJ0LmZhaWwoWCBgQXJyYXlzIG11c3Qgbm90IGhhdmUgbm9uLWluZGV4ZXM6ICR7Y2FuZGlkYXRlfWAsVHlwZUVycm9yKTtcbi8qIFJlY3Vyc2l2ZWx5IHZhbGlkYXRlIHRoYXQgZWFjaCBtZW1iZXIgaXMgcGFzc2FibGUuKi9cbmNhbmRpZGF0ZS5ldmVyeSgodik9PiEhcGFzc1N0eWxlT2ZSZWN1cih2KSk7XG4gfX0pOyRo4oCNX29uY2UuQ29weUFycmF5SGVscGVyKENvcHlBcnJheUhlbHBlcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQ29weUFycmF5SGVscGVyIjpbIkNvcHlBcnJheUhlbHBlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACThwVh0wcAANMHAAAuAAAAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL2hlbHBlcnMvY29weVJlY29yZC5qc3siaW1wb3J0cyI6WyIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiQ29weVJlY29yZEhlbHBlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnRDaGVja2VyLGNhbkJlTWV0aG9kLGNoZWNrTm9ybWFsUHJvcGVydHk7JGjigI1faW1wb3J0cyhbW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV0sW1wiY2FuQmVNZXRob2RcIiwgWyRo4oCNX2EgPT4gKGNhbkJlTWV0aG9kID0gJGjigI1fYSldXSxbXCJjaGVja05vcm1hbFByb3BlcnR5XCIsIFskaOKAjV9hID0+IChjaGVja05vcm1hbFByb3BlcnR5ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5jb25zdHtkZXRhaWxzOlh9PWFzc2VydDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtnZXRQcm90b3R5cGVPZix2YWx1ZXMscHJvdG90eXBlOm9iamVjdFByb3RvdHlwZX09T2JqZWN0O1xuXG4vKipcbiAqXG4gKiBAdHlwZSB7WGltcG9ydCgnLi9pbnRlcm5hbC10eXBlcy5qcycpLlBhc3NTdHlsZUhlbHBlcn1cbiAqL1xuY29uc3QgICAgICAgIENvcHlSZWNvcmRIZWxwZXI9aGFyZGVuKHtcbnN0eWxlTmFtZTonY29weVJlY29yZCcsXG5cbmNhbkJlVmFsaWQ6KGNhbmRpZGF0ZSxjaGVjayk9PntcbmNvbnN0IHJlamVjdD0hIWNoZWNrJiYoKGRldGFpbHMpPT5jaGVjayhmYWxzZSxkZXRhaWxzKSk7XG5pZihnZXRQcm90b3R5cGVPZihjYW5kaWRhdGUpIT09b2JqZWN0UHJvdG90eXBlKXtcbnJldHVybihcbnJlamVjdCYmXG5yZWplY3QoWCBgUmVjb3JkcyBtdXN0IGluaGVyaXQgZnJvbSBPYmplY3QucHJvdG90eXBlOiAke2NhbmRpZGF0ZX1gKSk7XG5cbiB9XG5cbmZvcihjb25zdCBrZXkgb2Ygb3duS2V5cyhjYW5kaWRhdGUpKXtcbmNvbnN0IHZhbGlkPVxuKHR5cGVvZiBrZXk9PT0nc3RyaW5nJ3x8XG4hIXJlamVjdCYmXG5yZWplY3QoXG5YIGBSZWNvcmRzIGNhbiBvbmx5IGhhdmUgc3RyaW5nLW5hbWVkIHByb3BlcnRpZXM6ICR7Y2FuZGlkYXRlfWApKSYmKFxuXG4hY2FuQmVNZXRob2QoY2FuZGlkYXRlW2tleV0pfHxcbiEhcmVqZWN0JiZcbnJlamVjdChcbi8qIFRPRE86IFVwZGF0ZSBtZXNzYWdlIG5vdyB0aGF0IHRoZXJlIGlzIG5vIHN1Y2ggdGhpbmcgYXMgXCJpbXBsaWNpdCBSZW1vdGFibGVcIi4qL1xuWCBgUmVjb3JkcyBjYW5ub3QgY29udGFpbiBub24tZmFyIGZ1bmN0aW9ucyBiZWNhdXNlIHRoZXkgbWF5IGJlIG1ldGhvZHMgb2YgYW4gaW1wbGljaXQgUmVtb3RhYmxlOiAke2NhbmRpZGF0ZX1gKSk7XG5cbmlmKCF2YWxpZCl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuIH1cbnJldHVybiB0cnVlO1xuIH0sXG5cbmFzc2VydFZhbGlkOihjYW5kaWRhdGUscGFzc1N0eWxlT2ZSZWN1cik9PntcbkNvcHlSZWNvcmRIZWxwZXIuY2FuQmVWYWxpZChjYW5kaWRhdGUsYXNzZXJ0Q2hlY2tlcik7XG5mb3IoY29uc3QgbmFtZSBvZiBvd25LZXlzKGNhbmRpZGF0ZSkpe1xuY2hlY2tOb3JtYWxQcm9wZXJ0eShjYW5kaWRhdGUsbmFtZSx0cnVlLGFzc2VydENoZWNrZXIpO1xuIH1cbi8qIFJlY3Vyc2l2ZWx5IHZhbGlkYXRlIHRoYXQgZWFjaCBtZW1iZXIgaXMgcGFzc2FibGUuKi9cbnZhbHVlcyhjYW5kaWRhdGUpLmV2ZXJ5KCh2KT0+ISFwYXNzU3R5bGVPZlJlY3VyKHYpKTtcbiB9fSk7JGjigI1fb25jZS5Db3B5UmVjb3JkSGVscGVyKENvcHlSZWNvcmRIZWxwZXIpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkNvcHlSZWNvcmRIZWxwZXIiOlsiQ29weVJlY29yZEhlbHBlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAMmaTaYBEAAGARAAApAAAAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL2hlbHBlcnMvZXJyb3IuanN7ImltcG9ydHMiOlsiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbIkVycm9ySGVscGVyIiwiZ2V0RXJyb3JDb25zdHJ1Y3RvciIsInRvUGFzc2FibGVFcnJvciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnRDaGVja2VyOyRo4oCNX2ltcG9ydHMoW1tcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vaW50ZXJuYWwtdHlwZXMuanMnKS5QYXNzU3R5bGVIZWxwZXJ9IFBhc3NTdHlsZUhlbHBlciAqL1xuXG5jb25zdHtkZXRhaWxzOlh9PWFzc2VydDtcbmNvbnN0e2dldFByb3RvdHlwZU9mLGdldE93blByb3BlcnR5RGVzY3JpcHRvcnN9PU9iamVjdDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5cbi8qIFRPRE86IE1haW50ZW5hbmNlIGhhemFyZDogQ29vcmRpbmF0ZSB3aXRoIHRoZSBsaXN0IG9mIGVycm9ycyBpbiB0aGUgU0VTKi9cbi8qIHdoaWxlbGlzdC4gQ3VycmVudGx5LCBib3RoIG9taXQgQWdncmVnYXRlRXJyb3IsIHdoaWNoIGlzIG5vdyBzdGFuZGFyZC4gQm90aCovXG4vKiBtdXN0IGV2ZW50dWFsbHkgaW5jbHVkZSBpdC4qL1xuY29uc3QgZXJyb3JDb25zdHJ1Y3RvcnM9bmV3IE1hcChbXG5bJ0Vycm9yJyxFcnJvcl0sXG5bJ0V2YWxFcnJvcicsRXZhbEVycm9yXSxcblsnUmFuZ2VFcnJvcicsUmFuZ2VFcnJvcl0sXG5bJ1JlZmVyZW5jZUVycm9yJyxSZWZlcmVuY2VFcnJvcl0sXG5bJ1N5bnRheEVycm9yJyxTeW50YXhFcnJvcl0sXG5bJ1R5cGVFcnJvcicsVHlwZUVycm9yXSxcblsnVVJJRXJyb3InLFVSSUVycm9yXV0pO1xuXG5cbmNvbnN0ICAgICAgICBnZXRFcnJvckNvbnN0cnVjdG9yPShuYW1lKT0+ZXJyb3JDb25zdHJ1Y3RvcnMuZ2V0KG5hbWUpOyRo4oCNX29uY2UuZ2V0RXJyb3JDb25zdHJ1Y3RvcihnZXRFcnJvckNvbnN0cnVjdG9yKTtcbmhhcmRlbihnZXRFcnJvckNvbnN0cnVjdG9yKTtcblxuLyoqXG4gKiBWYWxpZGF0aW5nIGVycm9yIG9iamVjdHMgYXJlIHBhc3NhYmxlIHJhaXNlcyBhIHRlbnNpb24gYmV0d2VlbiBzZWN1cml0eVxuICogdnMgcHJlc2VydmluZyBkaWFnbm9zdGljIGluZm9ybWF0aW9uLiBGb3IgZXJyb3JzLCB3ZSBuZWVkIHRvIHJlbWVtYmVyXG4gKiB0aGUgZXJyb3IgaXRzZWxmIGV4aXN0cyB0byBoZWxwIHVzIGRpYWdub3NlIGEgYnVnIHRoYXQncyBsaWtlbHkgbW9yZVxuICogcHJlc3NpbmcgdGhhbiBhIHZhbGlkaXR5IGJ1ZyBpbiB0aGUgZXJyb3IgaXRzZWxmLiBUaHVzLCB3aGVuZXZlciBpdCBpcyBzYWZlXG4gKiB0byBkbyBzbywgd2UgcHJlZmVyIHRvIGxldCB0aGUgZXJyb3IgdGVzdCBzdWNjZWVkIGFuZCB0byBjb3VjaCB0aGVzZVxuICogY29tcGxhaW50cyBhcyBub3RlcyBvbiB0aGUgZXJyb3IuXG4gKlxuICogVG8gcmVzb2x2ZSB0aGlzLCBzdWNoIGEgbWFsZm9ybWVkIGVycm9yIG9iamVjdCB3aWxsIHN0aWxsIHBhc3NcbiAqIGBjYW5CZVZhbGlkYCBzbyBtYXJzaGFsIGNhbiB1c2UgdGhpcyBmb3IgdG9wIGxldmVsIGVycm9yIHRvIHJlcG9ydCBmcm9tLFxuICogZXZlbiBpZiBpdCB3b3VsZCBub3QgYWN0dWFsbHkgdmFsaWRhdGUuXG4gKiBJbnN0ZWFkLCB0aGUgZGlhZ25vc3RpY3MgdGhhdCBgYXNzZXJ0RXJyb3JgIHdvdWxkIGhhdmUgcmVwb3J0ZWQgYXJlXG4gKiBhdHRhY2hlZCBhcyBub3RlcyB0byB0aGUgbWFsZm9ybWVkIGVycm9yLiBUaHVzLCBhIG1hbGZvcm1lZFxuICogZXJyb3IgaXMgcGFzc2FibGUgYnkgaXRzZWxmLCBidXQgbm90IGFzIHBhcnQgb2YgYSBwYXNzYWJsZSBzdHJ1Y3R1cmUuXG4gKlxuICogQHR5cGUge1Bhc3NTdHlsZUhlbHBlcn1cbiAqL1xuY29uc3QgICAgICAgIEVycm9ySGVscGVyPWhhcmRlbih7XG5zdHlsZU5hbWU6J2Vycm9yJyxcblxuY2FuQmVWYWxpZDooY2FuZGlkYXRlLGNoZWNrKT0+e1xuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpKTtcbi8qIFRPRE86IE5lZWQgYSBiZXR0ZXIgdGVzdCB0aGFuIGluc3RhbmNlb2YqL1xuaWYoIShjYW5kaWRhdGUgaW5zdGFuY2VvZiBFcnJvcikpe1xucmV0dXJuIHJlamVjdCYmcmVqZWN0KFggYEVycm9yIGV4cGVjdGVkOiAke2NhbmRpZGF0ZX1gKTtcbiB9XG5jb25zdCBwcm90bz1nZXRQcm90b3R5cGVPZihjYW5kaWRhdGUpO1xuY29uc3R7bmFtZX09cHJvdG87XG5jb25zdCBFQz1nZXRFcnJvckNvbnN0cnVjdG9yKG5hbWUpO1xuaWYoIUVDfHxFQy5wcm90b3R5cGUhPT1wcm90byl7XG5jb25zdCBub3RlPVggYEVycm9ycyBtdXN0IGluaGVyaXQgZnJvbSBhbiBlcnJvciBjbGFzcyAucHJvdG90eXBlICR7Y2FuZGlkYXRlfWA7XG4vKiBPbmx5IHRlcm1pbmF0ZSBpZiBjaGVjayB0aHJvd3MqL1xucmVqZWN0JiZyZWplY3Qobm90ZSk7XG5hc3NlcnQubm90ZShjYW5kaWRhdGUsbm90ZSk7XG4gfVxuXG5jb25zdHtcbi8qIE11c3QgYWxsb3cgYGNhdXNlYCwgYGVycm9yc2AqL1xubWVzc2FnZTptRGVzYyxcbi8qIEFsbG93IGJ1dCBpZ25vcmUgb25seSBleHRyYW5lb3VzIG93biBgc3RhY2tgIHByb3BlcnR5LiovXG5zdGFjazpfb3B0U3RhY2tEZXNjLFxuLi4ucmVzdERlc2NzfT1cbmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoY2FuZGlkYXRlKTtcbmlmKG93bktleXMocmVzdERlc2NzKS5sZW5ndGg+PTEpe1xuY29uc3Qgbm90ZT1YIGBQYXNzZWQgRXJyb3IgaGFzIGV4dHJhIHVucGFzc2VkIHByb3BlcnRpZXMgJHtyZXN0RGVzY3N9YDtcbi8qIE9ubHkgdGVybWluYXRlIGlmIGNoZWNrIHRocm93cyovXG5yZWplY3QmJnJlamVjdChub3RlKTtcbmFzc2VydC5ub3RlKGNhbmRpZGF0ZSxub3RlKTtcbiB9XG5pZihtRGVzYyl7XG5pZih0eXBlb2YgbURlc2MudmFsdWUhPT0nc3RyaW5nJyl7XG5jb25zdCBub3RlPVggYFBhc3NlZCBFcnJvciBcIm1lc3NhZ2VcIiAke21EZXNjfSBtdXN0IGJlIGEgc3RyaW5nLXZhbHVlZCBkYXRhIHByb3BlcnR5LmA7XG4vKiBPbmx5IHRlcm1pbmF0ZSBpZiBjaGVjayB0aHJvd3MqL1xucmVqZWN0JiZyZWplY3Qobm90ZSk7XG5hc3NlcnQubm90ZShjYW5kaWRhdGUsbm90ZSk7XG4gfVxuaWYobURlc2MuZW51bWVyYWJsZSl7XG5jb25zdCBub3RlPVggYFBhc3NlZCBFcnJvciBcIm1lc3NhZ2VcIiAke21EZXNjfSBtdXN0IG5vdCBiZSBlbnVtZXJhYmxlYDtcbi8qIE9ubHkgdGVybWluYXRlIGlmIGNoZWNrIHRocm93cyovXG5yZWplY3QmJnJlamVjdChub3RlKTtcbmFzc2VydC5ub3RlKGNhbmRpZGF0ZSxub3RlKTtcbiB9XG4gfVxucmV0dXJuIHRydWU7XG4gfSxcblxuYXNzZXJ0VmFsaWQ6KGNhbmRpZGF0ZSk9PntcbkVycm9ySGVscGVyLmNhbkJlVmFsaWQoY2FuZGlkYXRlLGFzc2VydENoZWNrZXIpO1xuIH19KTtcblxuXG4vKipcbiAqIFJldHVybiBhIG5ldyBwYXNzYWJsZSBlcnJvciB0aGF0IHByb3BhZ2F0ZXMgdGhlIGRpYWdub3N0aWMgaW5mbyBvZiB0aGVcbiAqIG9yaWdpbmFsLCBhbmQgaXMgbGlua2VkIHRvIHRoZSBvcmlnaW5hbCBhcyBhIG5vdGUuXG4gKlxuICogQHBhcmFtIHtFcnJvcn0gZXJyXG4gKiBAcmV0dXJucyB7RXJyb3J9XG4gKi8kaOKAjV9vbmNlLkVycm9ySGVscGVyKEVycm9ySGVscGVyKTtcbmNvbnN0ICAgICAgICB0b1Bhc3NhYmxlRXJyb3I9KGVycik9PntcbmNvbnN0e25hbWUsbWVzc2FnZX09ZXJyO1xuXG5jb25zdCBFQz1nZXRFcnJvckNvbnN0cnVjdG9yKCBgJHtuYW1lfWApfHxFcnJvcjtcbmNvbnN0IG5ld0Vycm9yPWhhcmRlbihuZXcgRUMoIGAke21lc3NhZ2V9YCkpO1xuLyogRXZlbiB0aGUgY2xlYW5lZCB1cCBlcnJvciBjb3B5LCBpZiBzZW50IHRvIHRoZSBjb25zb2xlLCBzaG91bGQqL1xuLyogY2F1c2UgaGlkZGVuIGRpYWdub3N0aWMgaW5mb3JtYXRpb24gb2YgdGhlIG9yaWdpbmFsIGVycm9yKi9cbi8qIHRvIGJlIGxvZ2dlZC4qL1xuYXNzZXJ0Lm5vdGUobmV3RXJyb3IsWCBgY29waWVkIGZyb20gZXJyb3IgJHtlcnJ9YCk7XG5yZXR1cm4gbmV3RXJyb3I7XG4gfTskaOKAjV9vbmNlLnRvUGFzc2FibGVFcnJvcih0b1Bhc3NhYmxlRXJyb3IpO1xuaGFyZGVuKHRvUGFzc2FibGVFcnJvcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZ2V0RXJyb3JDb25zdHJ1Y3RvciI6WyJnZXRFcnJvckNvbnN0cnVjdG9yIl0sIkVycm9ySGVscGVyIjpbIkVycm9ySGVscGVyIl0sInRvUGFzc2FibGVFcnJvciI6WyJ0b1Bhc3NhYmxlRXJyb3IiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA0TG62UYIAABGCAAAMAAAAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9oZWxwZXJzL2l0ZXItaGVscGVycy5qc3siaW1wb3J0cyI6WyIuLi9tYWtlLWZhci5qcyJdLCJleHBvcnRzIjpbImZpbHRlckl0ZXJhYmxlIiwibWFwSXRlcmFibGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRmFyOyRo4oCNX2ltcG9ydHMoW1tcIi4uL21ha2UtZmFyLmpzXCIsIFtbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuLyoqXG4gKiBUaGUgcmVzdWx0IGl0ZXJhdG9yIGhhcyBhcyBtYW55IGVsZW1lbnRzIGFzIHRoZSBgYmFzZUl0ZXJhdG9yYCBhbmRcbiAqIGhhdmUgdGhlIHNhbWUgdGVybWluYXRpb24gLS0gdGhlIHNhbWUgY29tcGxldGlvbiB2YWx1ZSBvciBmYWlsdXJlXG4gKiByZWFzb24uIEJ1dCB0aGUgbm9uLWZpbmFsIHZhbHVlcyBhcmUgdGhlIGNvcnJlc3BvbmRpbmcgbm9uLWZpbmFsXG4gKiB2YWx1ZXMgZnJvbSBgYmFzZUl0ZXJhdG9yYCBhcyB0cmFuc2Zvcm1lZCBieSBgZnVuY2AuXG4gKlxuICogQHRlbXBsYXRlIFQsVVxuICogQHBhcmFtIHtJdGVyYWJsZTxUPn0gYmFzZUl0ZXJhYmxlXG4gKiBAcGFyYW0geyh2YWx1ZTogVCkgPT4gVX0gZnVuY1xuICogQHJldHVybnMge0l0ZXJhYmxlPFU+fVxuICovXG5jb25zdCAgICAgICAgbWFwSXRlcmFibGU9KGJhc2VJdGVyYWJsZSxmdW5jKT0+XG4vKiogQHR5cGUge0l0ZXJhYmxlPFU+fSAqL1xuRmFyKCdtYXBwZWQgaXRlcmFibGUnLHtcbltTeW1ib2wuaXRlcmF0b3JdOigpPT57XG5jb25zdCBiYXNlSXRlcmF0b3I9YmFzZUl0ZXJhYmxlW1N5bWJvbC5pdGVyYXRvcl0oKTtcbnJldHVybiBGYXIoJ21hcHBlZCBpdGVyYXRvcicse1xubmV4dDooKT0+e1xuY29uc3R7dmFsdWU6YmFzZVZhbHVlLGRvbmV9PWJhc2VJdGVyYXRvci5uZXh0KCk7XG5jb25zdCB2YWx1ZT1kb25lP2Jhc2VWYWx1ZTpmdW5jKGJhc2VWYWx1ZSk7XG5yZXR1cm4gaGFyZGVuKHt2YWx1ZSxkb25lfSk7XG4gfX0pO1xuXG4gfX0pOyRo4oCNX29uY2UubWFwSXRlcmFibGUobWFwSXRlcmFibGUpO1xuXG5oYXJkZW4obWFwSXRlcmFibGUpO1xuXG4vKipcbiAqIFRoZSByZXN1bHQgaXRlcmF0b3IgaGFzIGEgc3Vic2V0IG9mIHRoZSBub24tZmluYWwgdmFsdWVzIGZyb20gdGhlXG4gKiBgYmFzZUl0ZXJhdG9yYCAtLS0gdGhvc2UgZm9yIHdoaWNoIGBwcmVkKHZhbHVlKWAgd2FzIHRydXRoeS4gVGhlIHJlc3VsdFxuICogaGFzIHRoZSBzYW1lIHRlcm1pbmF0aW9uIGFzIHRoZSBgYmFzZUl0ZXJhdG9yYCAtLSB0aGUgc2FtZSBjb21wbGV0aW9uIHZhbHVlXG4gKiBvciBmYWlsdXJlIHJlYXNvbi5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxUPn0gYmFzZUl0ZXJhYmxlXG4gKiBAcGFyYW0geyh2YWx1ZTogVCkgPT4gYm9vbGVhbn0gcHJlZFxuICogQHJldHVybnMge0l0ZXJhYmxlPFQ+fVxuICovXG5jb25zdCAgICAgICAgZmlsdGVySXRlcmFibGU9KGJhc2VJdGVyYWJsZSxwcmVkKT0+XG4vKiogQHR5cGUge0l0ZXJhYmxlPFU+fSAqL1xuRmFyKCdmaWx0ZXJlZCBpdGVyYWJsZScse1xuW1N5bWJvbC5pdGVyYXRvcl06KCk9PntcbmNvbnN0IGJhc2VJdGVyYXRvcj1iYXNlSXRlcmFibGVbU3ltYm9sLml0ZXJhdG9yXSgpO1xucmV0dXJuIEZhcignZmlsdGVyZWQgaXRlcmF0b3InLHtcbm5leHQ6KCk9PntcbmZvcig7Oyl7XG5jb25zdCByZXN1bHQ9YmFzZUl0ZXJhdG9yLm5leHQoKTtcbmNvbnN0e3ZhbHVlLGRvbmV9PXJlc3VsdDtcbmlmKGRvbmV8fHByZWQodmFsdWUpKXtcbnJldHVybiByZXN1bHQ7XG4gfVxuIH1cbiB9fSk7XG5cbiB9fSk7JGjigI1fb25jZS5maWx0ZXJJdGVyYWJsZShmaWx0ZXJJdGVyYWJsZSk7XG5cbmhhcmRlbihmaWx0ZXJJdGVyYWJsZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFwSXRlcmFibGUiOlsibWFwSXRlcmFibGUiXSwiZmlsdGVySXRlcmFibGUiOlsiZmlsdGVySXRlcmFibGUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAADALqJ/QZAAD0GQAANQAAAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9oZWxwZXJzL3Bhc3NTdHlsZS1oZWxwZXJzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJQQVNTX1NUWUxFIiwiYXNzZXJ0Q2hlY2tlciIsImNhbkJlTWV0aG9kIiwiY2hlY2tGdW5jdGlvblRhZ1JlY29yZCIsImNoZWNrTm9ybWFsUHJvcGVydHkiLCJjaGVja1Bhc3NTdHlsZSIsImNoZWNrVGFnUmVjb3JkIiwiZ2V0VGFnIiwiaGFzT3duUHJvcGVydHlPZiIsImlzT2JqZWN0IiwiaXNUeXBlZEFycmF5Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQHRzLWNoZWNrKi9cblxuLyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIi8+Ki9cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcy5qcycpLkNoZWNrZXJ9IENoZWNrZXIgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMuanMnKS5QYXNzU3R5bGV9IFBhc3NTdHlsZSAqL1xuXG5jb25zdHtkZXRhaWxzOlgscXVvdGU6cX09YXNzZXJ0O1xuY29uc3R7aXNBcnJheX09QXJyYXk7XG5jb25zdHtwcm90b3R5cGU6ZnVuY3Rpb25Qcm90b3R5cGV9PUZ1bmN0aW9uO1xuY29uc3R7XG5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsXG5nZXRQcm90b3R5cGVPZixcbmhhc093blByb3BlcnR5Om9iamVjdEhhc093blByb3BlcnR5LFxuaXNGcm96ZW4sXG5wcm90b3R5cGU6b2JqZWN0UHJvdG90eXBlfT1cbk9iamVjdDtcbmNvbnN0e2FwcGx5fT1SZWZsZWN0O1xuY29uc3R7dG9TdHJpbmdUYWc6dG9TdHJpbmdUYWdTeW1ib2x9PVN5bWJvbDtcblxuY29uc3QgdHlwZWRBcnJheVByb3RvdHlwZT1nZXRQcm90b3R5cGVPZihVaW50OEFycmF5LnByb3RvdHlwZSk7XG5jb25zdCB0eXBlZEFycmF5VG9TdHJpbmdUYWdEZXNjPWdldE93blByb3BlcnR5RGVzY3JpcHRvcihcbnR5cGVkQXJyYXlQcm90b3R5cGUsXG50b1N0cmluZ1RhZ1N5bWJvbCk7XG5cbmFzc2VydCh0eXBlZEFycmF5VG9TdHJpbmdUYWdEZXNjKTtcbmNvbnN0IGdldFR5cGVkQXJyYXlUb1N0cmluZ1RhZz10eXBlZEFycmF5VG9TdHJpbmdUYWdEZXNjLmdldDtcbmFzc2VydCh0eXBlb2YgZ2V0VHlwZWRBcnJheVRvU3RyaW5nVGFnPT09J2Z1bmN0aW9uJyk7XG5cbmNvbnN0ICAgICAgICBoYXNPd25Qcm9wZXJ0eU9mPShvYmoscHJvcCk9PlxuYXBwbHkob2JqZWN0SGFzT3duUHJvcGVydHksb2JqLFtwcm9wXSk7JGjigI1fb25jZS5oYXNPd25Qcm9wZXJ0eU9mKGhhc093blByb3BlcnR5T2YpO1xuaGFyZGVuKGhhc093blByb3BlcnR5T2YpO1xuXG5jb25zdCAgICAgICAgaXNPYmplY3Q9KHZhbCk9Pk9iamVjdCh2YWwpPT09dmFsOyRo4oCNX29uY2UuaXNPYmplY3QoaXNPYmplY3QpO1xuaGFyZGVuKGlzT2JqZWN0KTtcblxuLyoqXG4gKiBEdXBsaWNhdGVzIHBhY2thZ2VzL3Nlcy9zcmMvbWFrZS1oYXJkZW5lci5qcyB0byBhdm9pZCBhIGRlcGVuZGVuY3kuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBvYmplY3RcbiAqL1xuY29uc3QgICAgICAgIGlzVHlwZWRBcnJheT0ob2JqZWN0KT0+e1xuLyogVGhlIG9iamVjdCBtdXN0IHBhc3MgYSBicmFuZCBjaGVjayBvciB0b1N0cmluZ1RhZyB3aWxsIHJldHVybiB1bmRlZmluZWQuKi9cbmNvbnN0IHRhZz1hcHBseShnZXRUeXBlZEFycmF5VG9TdHJpbmdUYWcsb2JqZWN0LFtdKTtcbnJldHVybiB0YWchPT11bmRlZmluZWQ7XG4gfTskaOKAjV9vbmNlLmlzVHlwZWRBcnJheShpc1R5cGVkQXJyYXkpO1xuaGFyZGVuKGlzVHlwZWRBcnJheSk7XG5cbmNvbnN0ICAgICAgICBQQVNTX1NUWUxFPVN5bWJvbC5mb3IoJ3Bhc3NTdHlsZScpO1xuXG4vKipcbiAqIEZvciBhIGZ1bmN0aW9uIHRvIGJlIGEgdmFsaWQgbWV0aG9kLCBpdCBtdXN0IG5vdCBiZSBwYXNzYWJsZS5cbiAqIE90aGVyd2lzZSwgd2UgcmlzayBjb25mdXNpbmcgcGFzcy1ieS1jb3B5IGRhdGEgY2FycnlpbmdcbiAqIGZhciBmdW5jdGlvbnMgd2l0aCBhdHRlbXB0cyBhdCBmYXIgb2JqZWN0cyB3aXRoIG1ldGhvZHMuXG4gKlxuICogVE9ETyBIQVpBUkQgQmVjYXVzZSB3ZSBjaGVjayB0aGlzIG9uIHRoZSB3YXkgdG8gaGFyZGVuaW5nIGEgcmVtb3RhYmxlLFxuICogd2UgY2Fubm90IHlldCBjaGVjayB0aGF0IGBmdW5jYCBpcyBoYXJkZW5lZC4gSG93ZXZlciwgd2l0aG91dFxuICogZG9pbmcgc28sIGl0J3MgaW5oZXJpdGFuY2UgbWlnaHQgY2hhbmdlIGFmdGVyIHRoZSBgUEFTU19TVFlMRWBcbiAqIGNoZWNrIGJlbG93LlxuICpcbiAqIEBwYXJhbSB7YW55fSBmdW5jXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqLyRo4oCNX29uY2UuUEFTU19TVFlMRShQQVNTX1NUWUxFKTtcbmNvbnN0ICAgICAgICBjYW5CZU1ldGhvZD0oZnVuYyk9PlxudHlwZW9mIGZ1bmM9PT0nZnVuY3Rpb24nJiYhKFBBU1NfU1RZTEUgaW4gZnVuYyk7JGjigI1fb25jZS5jYW5CZU1ldGhvZChjYW5CZU1ldGhvZCk7XG5oYXJkZW4oY2FuQmVNZXRob2QpO1xuXG4vKipcbiAqIEJlbG93IHdlIGhhdmUgYSBzZXJpZXMgb2YgcHJlZGljYXRlIGZ1bmN0aW9ucyBhbmQgdGhlaXIgKGN1cnJpZWQpIGFzc2VydGlvblxuICogZnVuY3Rpb25zLiBUaGUgc2VtYW50aWNzIG9mIHRoZSBhc3NlcnRpb24gZnVuY3Rpb24gaXMganVzdCB0byBhc3NlcnQgdGhhdFxuICogdGhlIGNvcnJlc3BvbmRpbmcgcHJlZGljYXRlIGZ1bmN0aW9uIHdvdWxkIGhhdmUgcmV0dXJuZWQgdHJ1ZS4gQnV0IGl0XG4gKiByZXByb2R1Y2VzIHRoZSBpbnRlcm5hbCB0ZXN0cyBzbyBmYWlsdXJlcyBjYW4gZ2l2ZSBhIGJldHRlciBlcnJvciBtZXNzYWdlLlxuICpcbiAqIEB0eXBlIHtDaGVja2VyfVxuICovXG5jb25zdCAgICAgICAgYXNzZXJ0Q2hlY2tlcj0oY29uZCxkZXRhaWxzKT0+e1xuYXNzZXJ0KGNvbmQsZGV0YWlscyk7XG5yZXR1cm4gdHJ1ZTtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0Q2hlY2tlcihhc3NlcnRDaGVja2VyKTtcbmhhcmRlbihhc3NlcnRDaGVja2VyKTtcblxuLyoqXG4gKiBDaGVja3MgZm9yIHRoZSBwcmVzZW5jZSBhbmQgZW51bWVyYWJpbGl0eSBvZiBhbiBvd24gZGF0YSBwcm9wZXJ0eS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gY2FuZGlkYXRlXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ8c3ltYm9sfSBwcm9wZXJ0eU5hbWVcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gc2hvdWxkQmVFbnVtZXJhYmxlXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgY2hlY2tOb3JtYWxQcm9wZXJ0eT0oXG5jYW5kaWRhdGUsXG5wcm9wZXJ0eU5hbWUsXG5zaG91bGRCZUVudW1lcmFibGUsXG5jaGVjayk9Plxue1xuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpKTtcbmNvbnN0IGRlc2M9Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGNhbmRpZGF0ZSxwcm9wZXJ0eU5hbWUpO1xuaWYoZGVzYz09PXVuZGVmaW5lZCl7XG5yZXR1cm4oXG5yZWplY3QmJnJlamVjdChYIGAke3EocHJvcGVydHlOYW1lKX0gcHJvcGVydHkgZXhwZWN0ZWQ6ICR7Y2FuZGlkYXRlfWApKTtcblxuIH1cbnJldHVybihcbihoYXNPd25Qcm9wZXJ0eU9mKGRlc2MsJ3ZhbHVlJyl8fFxucmVqZWN0JiZcbnJlamVjdChcblggYCR7cShwcm9wZXJ0eU5hbWUpfSBtdXN0IG5vdCBiZSBhbiBhY2Nlc3NvciBwcm9wZXJ0eTogJHtjYW5kaWRhdGV9YCkpJiYoXG5cbnNob3VsZEJlRW51bWVyYWJsZT9cbmRlc2MuZW51bWVyYWJsZXx8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgJHtxKHByb3BlcnR5TmFtZSl9IG11c3QgYmUgYW4gZW51bWVyYWJsZSBwcm9wZXJ0eTogJHtjYW5kaWRhdGV9YCk6XG5cbiFkZXNjLmVudW1lcmFibGV8fFxucmVqZWN0JiZcbnJlamVjdChcblggYCR7cShcbnByb3BlcnR5TmFtZSlcbiB9IG11c3Qgbm90IGJlIGFuIGVudW1lcmFibGUgcHJvcGVydHk6ICR7Y2FuZGlkYXRlfWApKSk7XG5cblxuIH07JGjigI1fb25jZS5jaGVja05vcm1hbFByb3BlcnR5KGNoZWNrTm9ybWFsUHJvcGVydHkpO1xuaGFyZGVuKGNoZWNrTm9ybWFsUHJvcGVydHkpO1xuXG5jb25zdCAgICAgICAgZ2V0VGFnPSh0YWdSZWNvcmQpPT50YWdSZWNvcmRbU3ltYm9sLnRvU3RyaW5nVGFnXTskaOKAjV9vbmNlLmdldFRhZyhnZXRUYWcpO1xuaGFyZGVuKGdldFRhZyk7XG5cbmNvbnN0ICAgICAgICBjaGVja1Bhc3NTdHlsZT0ob2JqLGV4cGVjdGVkUGFzc1N0eWxlLGNoZWNrKT0+e1xuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpKTtcbmNvbnN0IGFjdHVhbD1vYmpbUEFTU19TVFlMRV07XG5yZXR1cm4oXG5hY3R1YWw9PT1leHBlY3RlZFBhc3NTdHlsZXx8XG5yZWplY3QmJlxucmVqZWN0KFggYEV4cGVjdGVkICR7cShleHBlY3RlZFBhc3NTdHlsZSl9LCBub3QgJHtxKGFjdHVhbCl9OiAke29ian1gKSk7XG5cbiB9OyRo4oCNX29uY2UuY2hlY2tQYXNzU3R5bGUoY2hlY2tQYXNzU3R5bGUpO1xuaGFyZGVuKGNoZWNrUGFzc1N0eWxlKTtcblxuY29uc3QgbWFrZUNoZWNrVGFnUmVjb3JkPShjaGVja1Byb3RvKT0+e1xuLyoqXG4gKiBAcGFyYW0ge3sgW1BBU1NfU1RZTEVdOiBzdHJpbmcgfX0gdGFnUmVjb3JkXG4gKiBAcGFyYW0ge1Bhc3NTdHlsZX0gcGFzc1N0eWxlXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja1RhZ1JlY29yZD0odGFnUmVjb3JkLHBhc3NTdHlsZSxjaGVjayk9PntcbmNvbnN0IHJlamVjdD0hIWNoZWNrJiYoKGRldGFpbHMpPT5jaGVjayhmYWxzZSxkZXRhaWxzKSk7XG5yZXR1cm4oXG4oaXNPYmplY3QodGFnUmVjb3JkKXx8XG5yZWplY3QmJlxucmVqZWN0KFggYEEgbm9uLW9iamVjdCBjYW5ub3QgYmUgYSB0YWdSZWNvcmQ6ICR7dGFnUmVjb3JkfWApKSYmKFxuaXNGcm96ZW4odGFnUmVjb3JkKXx8XG5yZWplY3QmJnJlamVjdChYIGBBIHRhZ1JlY29yZCBtdXN0IGJlIGZyb3plbjogJHt0YWdSZWNvcmR9YCkpJiYoXG4haXNBcnJheSh0YWdSZWNvcmQpfHxcbnJlamVjdCYmcmVqZWN0KFggYEFuIGFycmF5IGNhbm5vdCBiZSBhIHRhZ1JlY29yZDogJHt0YWdSZWNvcmR9YCkpJiZcbmNoZWNrTm9ybWFsUHJvcGVydHkodGFnUmVjb3JkLFBBU1NfU1RZTEUsZmFsc2UsY2hlY2spJiZcbmNoZWNrUGFzc1N0eWxlKHRhZ1JlY29yZCxwYXNzU3R5bGUsY2hlY2spJiZcbmNoZWNrTm9ybWFsUHJvcGVydHkodGFnUmVjb3JkLFN5bWJvbC50b1N0cmluZ1RhZyxmYWxzZSxjaGVjaykmJihcbnR5cGVvZiBnZXRUYWcodGFnUmVjb3JkKT09PSdzdHJpbmcnfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGBBIFtTeW1ib2wudG9TdHJpbmdUYWddLW5hbWVkIHByb3BlcnR5IG11c3QgYmUgYSBzdHJpbmc6ICR7dGFnUmVjb3JkfWApKSYmXG5cbmNoZWNrUHJvdG8odGFnUmVjb3JkLGdldFByb3RvdHlwZU9mKHRhZ1JlY29yZCksY2hlY2spKTtcblxuIH07XG5yZXR1cm4gaGFyZGVuKGNoZWNrVGFnUmVjb3JkKTtcbiB9O1xuXG5jb25zdCAgICAgICAgY2hlY2tUYWdSZWNvcmQ9bWFrZUNoZWNrVGFnUmVjb3JkKFxuKHZhbCxwcm90byxjaGVjayk9PlxucHJvdG89PT1vYmplY3RQcm90b3R5cGV8fFxuISFjaGVjayYmXG5jaGVjayhmYWxzZSxYIGBBIHRhZ1JlY29yZCBtdXN0IGluaGVyaXQgZnJvbSBPYmplY3QucHJvdG90eXBlOiAke3ZhbH1gKSk7JGjigI1fb25jZS5jaGVja1RhZ1JlY29yZChjaGVja1RhZ1JlY29yZCk7XG5cbmhhcmRlbihjaGVja1RhZ1JlY29yZCk7XG5cbmNvbnN0ICAgICAgICBjaGVja0Z1bmN0aW9uVGFnUmVjb3JkPW1ha2VDaGVja1RhZ1JlY29yZChcbih2YWwscHJvdG8sY2hlY2spPT5cbnByb3RvPT09ZnVuY3Rpb25Qcm90b3R5cGV8fFxucHJvdG8hPT1udWxsJiZnZXRQcm90b3R5cGVPZihwcm90byk9PT1mdW5jdGlvblByb3RvdHlwZXx8XG4hIWNoZWNrJiZcbmNoZWNrKFxuZmFsc2UsXG5YIGBGb3IgZnVuY3Rpb25zLCBhIHRhZ1JlY29yZCBtdXN0IGluaGVyaXQgZnJvbSBGdW5jdGlvbi5wcm90b3R5cGU6ICR7dmFsfWApKTskaOKAjV9vbmNlLmNoZWNrRnVuY3Rpb25UYWdSZWNvcmQoY2hlY2tGdW5jdGlvblRhZ1JlY29yZCk7XG5cblxuaGFyZGVuKGNoZWNrRnVuY3Rpb25UYWdSZWNvcmQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Imhhc093blByb3BlcnR5T2YiOlsiaGFzT3duUHJvcGVydHlPZiJdLCJpc09iamVjdCI6WyJpc09iamVjdCJdLCJpc1R5cGVkQXJyYXkiOlsiaXNUeXBlZEFycmF5Il0sIlBBU1NfU1RZTEUiOlsiUEFTU19TVFlMRSJdLCJjYW5CZU1ldGhvZCI6WyJjYW5CZU1ldGhvZCJdLCJhc3NlcnRDaGVja2VyIjpbImFzc2VydENoZWNrZXIiXSwiY2hlY2tOb3JtYWxQcm9wZXJ0eSI6WyJjaGVja05vcm1hbFByb3BlcnR5Il0sImdldFRhZyI6WyJnZXRUYWciXSwiY2hlY2tQYXNzU3R5bGUiOlsiY2hlY2tQYXNzU3R5bGUiXSwiY2hlY2tUYWdSZWNvcmQiOlsiY2hlY2tUYWdSZWNvcmQiXSwiY2hlY2tGdW5jdGlvblRhZ1JlY29yZCI6WyJjaGVja0Z1bmN0aW9uVGFnUmVjb3JkIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAATybD72HwAA9h8AAC0AAABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvaGVscGVycy9yZW1vdGFibGUuanN7ImltcG9ydHMiOlsiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbIlJlbW90YWJsZUhlbHBlciIsImFzc2VydElmYWNlIiwiZ2V0SW50ZXJmYWNlT2YiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0Q2hlY2tlcixjYW5CZU1ldGhvZCxoYXNPd25Qcm9wZXJ0eU9mLFBBU1NfU1RZTEUsY2hlY2tUYWdSZWNvcmQsY2hlY2tGdW5jdGlvblRhZ1JlY29yZCxpc09iamVjdCxnZXRUYWc7JGjigI1faW1wb3J0cyhbW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV0sW1wiY2FuQmVNZXRob2RcIiwgWyRo4oCNX2EgPT4gKGNhbkJlTWV0aG9kID0gJGjigI1fYSldXSxbXCJoYXNPd25Qcm9wZXJ0eU9mXCIsIFskaOKAjV9hID0+IChoYXNPd25Qcm9wZXJ0eU9mID0gJGjigI1fYSldXSxbXCJQQVNTX1NUWUxFXCIsIFskaOKAjV9hID0+IChQQVNTX1NUWUxFID0gJGjigI1fYSldXSxbXCJjaGVja1RhZ1JlY29yZFwiLCBbJGjigI1fYSA9PiAoY2hlY2tUYWdSZWNvcmQgPSAkaOKAjV9hKV1dLFtcImNoZWNrRnVuY3Rpb25UYWdSZWNvcmRcIiwgWyRo4oCNX2EgPT4gKGNoZWNrRnVuY3Rpb25UYWdSZWNvcmQgPSAkaOKAjV9hKV1dLFtcImlzT2JqZWN0XCIsIFskaOKAjV9hID0+IChpc09iamVjdCA9ICRo4oCNX2EpXV0sW1wiZ2V0VGFnXCIsIFskaOKAjV9hID0+IChnZXRUYWcgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzLmpzJykuQ2hlY2tlcn0gQ2hlY2tlciAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcy5qcycpLkludGVyZmFjZVNwZWN9IEludGVyZmFjZVNwZWMgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMuanMnKS5NYXJzaGFsR2V0SW50ZXJmYWNlT2Z9IE1hcnNoYWxHZXRJbnRlcmZhY2VPZiAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL2ludGVybmFsLXR5cGVzLmpzJykuUGFzc1N0eWxlSGVscGVyfSBQYXNzU3R5bGVIZWxwZXIgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMuanMnKS5SZW1vdGFibGV9IFJlbW90YWJsZSAqL1xuXG5jb25zdHtkZXRhaWxzOlgsRmFpbCxxdW90ZTpxfT1hc3NlcnQ7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7aXNBcnJheX09QXJyYXk7XG5jb25zdHtcbmdldFByb3RvdHlwZU9mLFxuaXNGcm96ZW4sXG5wcm90b3R5cGU6b2JqZWN0UHJvdG90eXBlLFxuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yc309XG5PYmplY3Q7XG5cbi8qKlxuICogQHBhcmFtIHtJbnRlcmZhY2VTcGVjfSBpZmFjZVxuICogQHBhcmFtIHtDaGVja2VyfSBbY2hlY2tdXG4gKi9cbmNvbnN0IGNoZWNrSWZhY2U9KGlmYWNlLGNoZWNrKT0+e1xuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpKTtcbnJldHVybihcbi8qIFRPRE8gb3RoZXIgcG9zc2libGUgaWZhY2VzLCBvbmNlIHdlIGhhdmUgdGhpcmQgcGFydHkgdmVyYWNpdHkqL1xuKHR5cGVvZiBpZmFjZT09PSdzdHJpbmcnfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGBGb3Igbm93LCBpbnRlcmZhY2UgJHtpZmFjZX0gbXVzdCBiZSBhIHN0cmluZzsgdW5pbXBsZW1lbnRlZGApKSYmKFxuXG5pZmFjZT09PSdSZW1vdGFibGUnfHxcbmlmYWNlLnN0YXJ0c1dpdGgoJ0FsbGVnZWQ6ICcpfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGBGb3Igbm93LCBpZmFjZSAke3EoXG5pZmFjZSlcbiB9IG11c3QgYmUgXCJSZW1vdGFibGVcIiBvciBiZWdpbiB3aXRoIFwiQWxsZWdlZDogXCI7IHVuaW1wbGVtZW50ZWRgKSkpO1xuXG5cbiB9O1xuXG4vKipcbiAqIEFuIGBpZmFjZWAgbXVzdCBiZSBwdXJlLiBSaWdodCBub3cgaXQgbXVzdCBiZSBhIHN0cmluZywgd2hpY2ggaXMgcHVyZS5cbiAqIExhdGVyIHdlIGV4cGVjdCB0byBpbmNsdWRlIHNvbWUgb3RoZXIgdmFsdWVzIHRoYXQgcXVhbGlmeSBhcyBgUHVyZURhdGFgLFxuICogd2hpY2ggaXMgYSBwYXNzLWJ5LWNvcHkgc3VwZXJzdHJ1Y3R1cmUgZW5kaW5nIG9ubHkgaW4gcHJpbWl0aXZlcyBvclxuICogZW1wdHkgcGFzcy1ieS1jb3B5IGNvbXBvc2l0ZXMuIE5vIHJlbW90YWJsZXMsIHByb21pc2VzLCBvciBlcnJvcnMuXG4gKiBXZSAqYXNzdW1lKiBmb3Igbm93IHRoYXQgdGhlIHBhc3MtYnktY29weSBzdXBlcnN0cnVjdHVyZSBjb250YWlucyBub1xuICogcHJveGllcy5cbiAqXG4gKiBAcGFyYW0ge0ludGVyZmFjZVNwZWN9IGlmYWNlXG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRJZmFjZT0oaWZhY2UpPT5jaGVja0lmYWNlKGlmYWNlLGFzc2VydENoZWNrZXIpOyRo4oCNX29uY2UuYXNzZXJ0SWZhY2UoYXNzZXJ0SWZhY2UpO1xuaGFyZGVuKGFzc2VydElmYWNlKTtcblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdCB8IEZ1bmN0aW9ufSBvcmlnaW5hbFxuICogQHBhcmFtIHtDaGVja2VyfSBbY2hlY2tdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tSZW1vdGFibGVQcm90b09mPShvcmlnaW5hbCxjaGVjayk9PntcbmNvbnN0IHJlamVjdD0hIWNoZWNrJiYoKGRldGFpbHMpPT5jaGVjayhmYWxzZSxkZXRhaWxzKSk7XG5pc09iamVjdChvcmlnaW5hbCl8fFxuRmFpbCBgUmVtb3RhYmxlcyBtdXN0IGJlIG9iamVjdHMgb3IgZnVuY3Rpb25zOiAke29yaWdpbmFsfWA7XG5cbi8qIEEgdmFsaWQgcmVtb3RhYmxlIG9iamVjdCBtdXN0IGluaGVyaXQgZnJvbSBhIFwidGFnIHJlY29yZFwiIC0tIGEqL1xuLyogcGxhaW4tb2JqZWN0IHByb3RvdHlwZSBjb25zaXN0aW5nIG9mIG9ubHkqL1xuLyogYSBgUEFTU19TVFlMRWAgcHJvcGVydHkgd2l0aCB2YWx1ZSBcInJlbW90YWJsZVwiIGFuZCBhIHN1aXRhYmxlIGBTeW1ib2wudG9TdHJpbmdUYWdgKi9cbi8qIHByb3BlcnR5LiBUaGUgcmVtb3RhYmxlIGNvdWxkIGluaGVyaXQgZGlyZWN0bHkgZnJvbSBzdWNoIGEgdGFnIHJlY29yZCwgb3IqL1xuLyogaXQgY291bGQgaW5oZXJpdCBmcm9tIGFub3RoZXIgdmFsaWQgcmVtb3RhYmxlLCB0aGF0IHRoZXJlZm9yZSBpdHNlbGYqL1xuLyogaW5oZXJpdHMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBmcm9tIHN1Y2ggYSB0YWcgcmVjb3JkLiovXG4vKiovXG4vKiBUT0RPOiBJdCB3b3VsZCBiZSBuaWNlIHRvIHR5cGVkZWYgdGhpcyBzaGFwZSwgYnV0IHdlIGNhbid0IGRlY2xhcmUgYSB0eXBlKi9cbi8qIHdpdGggUEFTU19TVFlMRSBmcm9tIEpTRG9jLiovXG4vKiovXG4vKiBAdHlwZSB7eyBbUEFTU19TVFlMRV06IHN0cmluZywqL1xuLyogW1N5bWJvbC50b1N0cmluZ1RhZ106IHN0cmluZywqL1xuLyogfX0qL1xuLyoqL1xuY29uc3QgcHJvdG89Z2V0UHJvdG90eXBlT2Yob3JpZ2luYWwpO1xuaWYocHJvdG89PT1vYmplY3RQcm90b3R5cGV8fHByb3RvPT09bnVsbCl7XG5yZXR1cm4oXG5yZWplY3QmJlxucmVqZWN0KFggYFJlbW90YWJsZXMgbXVzdCBiZSBleHBsaWNpdGx5IGRlY2xhcmVkOiAke3Eob3JpZ2luYWwpfWApKTtcblxuIH1cblxuaWYodHlwZW9mIG9yaWdpbmFsPT09J29iamVjdCcpe1xuY29uc3QgcHJvdG9Qcm90bz1nZXRQcm90b3R5cGVPZihwcm90byk7XG5pZihwcm90b1Byb3RvIT09b2JqZWN0UHJvdG90eXBlJiZwcm90b1Byb3RvIT09bnVsbCl7XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xucmV0dXJuIGNoZWNrUmVtb3RhYmxlKHByb3RvLGNoZWNrKTtcbiB9XG5pZighY2hlY2tUYWdSZWNvcmQocHJvdG8sJ3JlbW90YWJsZScsY2hlY2spKXtcbnJldHVybiBmYWxzZTtcbiB9XG4gfWVsc2UgaWYodHlwZW9mIG9yaWdpbmFsPT09J2Z1bmN0aW9uJyl7XG5pZighY2hlY2tGdW5jdGlvblRhZ1JlY29yZChwcm90bywncmVtb3RhYmxlJyxjaGVjaykpe1xucmV0dXJuIGZhbHNlO1xuIH1cbiB9XG5cbi8qIFR5cGVjYXN0cyBuZWVkZWQgZHVlIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvMTg2MyovXG5jb25zdCBwYXNzU3R5bGVLZXk9LyoqIEB0eXBlIHt1bmtub3dufSAqL1BBU1NfU1RZTEU7XG5jb25zdCB0YWdLZXk9LyoqIEB0eXBlIHt1bmtub3dufSAqL1N5bWJvbC50b1N0cmluZ1RhZztcbmNvbnN0e1xuLyogY2hlY2tUYWdSZWNvcmQgYWxyZWFkeSB2ZXJpZmllZCBQQVNTX1NUWUxFIGFuZCBTeW1ib2wudG9TdHJpbmdUYWcgb3duIGRhdGEgcHJvcGVydGllcy4qL1xuWy8qKiBAdHlwZSB7c3RyaW5nfSAqL3Bhc3NTdHlsZUtleV06X3Bhc3NTdHlsZURlc2MsXG5bLyoqIEB0eXBlIHtzdHJpbmd9ICovdGFnS2V5XTp7dmFsdWU6aWZhY2V9LFxuLi4ucmVzdERlc2NzfT1cbmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMocHJvdG8pO1xuXG5yZXR1cm4oXG4ob3duS2V5cyhyZXN0RGVzY3MpLmxlbmd0aD09PTB8fFxucmVqZWN0JiZcbnJlamVjdChcblggYFVuZXhwZWN0ZWQgcHJvcGVydGllcyBvbiBSZW1vdGFibGUgUHJvdG8gJHtvd25LZXlzKHJlc3REZXNjcyl9YCkpJiZcblxuY2hlY2tJZmFjZShpZmFjZSxjaGVjaykpO1xuXG4gfTtcblxuLyoqXG4gKiBLZWVwIGEgd2VhayBzZXQgb2YgY29uZmlybWVkIHJlbW90YWJsZXMgZm9yIG1hcnNoYWwgcGVyZm9ybWFuY2VcbiAqICh3aXRob3V0IHdoaWNoIHdlIHdvdWxkIGluY3VyIGEgcmVkdW5kYW50IHZlcmlmaWNhdGlvbiBpblxuICogZ2V0SW50ZXJmYWNlT2YpLlxuICogV2UgZG9uJ3QgcmVtZW1iZXIgcmVqZWN0aW9ucyBiZWNhdXNlIHRoZXkgYXJlIHBvc3NpYmxlIHRvIGNvcnJlY3RcbiAqIHdpdGggZS5nLiBgaGFyZGVuYC5cbiAqXG4gKiBAdHlwZSB7V2Vha1NldDxSZW1vdGFibGU+fVxuICovXG5jb25zdCBjb25maXJtZWRSZW1vdGFibGVzPW5ldyBXZWFrU2V0KCk7XG5cbi8qKlxuICogQHBhcmFtIHtSZW1vdGFibGV9IHZhbFxuICogQHBhcmFtIHtDaGVja2VyfSBbY2hlY2tdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tSZW1vdGFibGU9KHZhbCxjaGVjayk9PntcbmlmKGNvbmZpcm1lZFJlbW90YWJsZXMuaGFzKHZhbCkpe1xucmV0dXJuIHRydWU7XG4gfVxuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpKTtcbmlmKCFpc0Zyb3plbih2YWwpKXtcbnJldHVybiByZWplY3QmJnJlamVjdChYIGBjYW5ub3Qgc2VyaWFsaXplIG5vbi1mcm96ZW4gb2JqZWN0cyBsaWtlICR7dmFsfWApO1xuIH1cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5pZighUmVtb3RhYmxlSGVscGVyLmNhbkJlVmFsaWQodmFsLGNoZWNrKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuY29uc3QgcmVzdWx0PWNoZWNrUmVtb3RhYmxlUHJvdG9PZih2YWwsY2hlY2spO1xuaWYocmVzdWx0KXtcbmNvbmZpcm1lZFJlbW90YWJsZXMuYWRkKHZhbCk7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG4vKiogQHR5cGUge01hcnNoYWxHZXRJbnRlcmZhY2VPZn0gKi9cbmNvbnN0ICAgICAgICBnZXRJbnRlcmZhY2VPZj0odmFsKT0+e1xuaWYoXG4haXNPYmplY3QodmFsKXx8XG52YWxbUEFTU19TVFlMRV0hPT0ncmVtb3RhYmxlJ3x8XG4hY2hlY2tSZW1vdGFibGUodmFsKSlcbntcbnJldHVybiB1bmRlZmluZWQ7XG4gfVxucmV0dXJuIGdldFRhZyh2YWwpO1xuIH07JGjigI1fb25jZS5nZXRJbnRlcmZhY2VPZihnZXRJbnRlcmZhY2VPZik7XG5oYXJkZW4oZ2V0SW50ZXJmYWNlT2YpO1xuXG4vKipcbiAqXG4gKiBAdHlwZSB7UGFzc1N0eWxlSGVscGVyfVxuICovXG5jb25zdCAgICAgICAgUmVtb3RhYmxlSGVscGVyPWhhcmRlbih7XG5zdHlsZU5hbWU6J3JlbW90YWJsZScsXG5cbmNhbkJlVmFsaWQ6KGNhbmRpZGF0ZSxjaGVjayk9PntcbmNvbnN0IHJlamVjdD0hIWNoZWNrJiYoKGRldGFpbHMpPT5jaGVjayhmYWxzZSxkZXRhaWxzKSk7XG5pZighaXNPYmplY3QoY2FuZGlkYXRlKSl7XG5yZXR1cm4oXG5yZWplY3QmJlxucmVqZWN0KFggYGNhbm5vdCBzZXJpYWxpemUgbm9uLW9iamVjdHMgYXMgUmVtb3RhYmxlICR7Y2FuZGlkYXRlfWApKTtcblxuIH1lbHNlIGlmKGlzQXJyYXkoY2FuZGlkYXRlKSl7XG5yZXR1cm4oXG5yZWplY3QmJnJlamVjdChYIGBjYW5ub3Qgc2VyaWFsaXplIGFycmF5cyBhcyBSZW1vdGFibGUgJHtjYW5kaWRhdGV9YCkpO1xuXG4gfVxuXG5jb25zdCBkZXNjcz1nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKGNhbmRpZGF0ZSk7XG5pZih0eXBlb2YgY2FuZGlkYXRlPT09J29iamVjdCcpe1xuLyogRXZlcnkgb3duIHByb3BlcnR5IChyZWdhcmRsZXNzIG9mIGVudW1lcmFiaWxpdHkpKi9cbi8qIG11c3QgaGF2ZSBhIGZ1bmN0aW9uIHZhbHVlLiovXG5jb25zdCBrZXlzPW93bktleXMoZGVzY3MpO1xucmV0dXJuIGtleXMuZXZlcnkoKGtleSk9PntcbnJldHVybihcbi8qIFR5cGVjYXN0IG5lZWRlZCBkdWUgdG8gaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy8xODYzKi9cbihoYXNPd25Qcm9wZXJ0eU9mKGRlc2NzWy8qKiBAdHlwZSB7c3RyaW5nfSAqL2tleV0sJ3ZhbHVlJyl8fFxucmVqZWN0JiZcbnJlamVjdChcblggYGNhbm5vdCBzZXJpYWxpemUgUmVtb3RhYmxlcyB3aXRoIGFjY2Vzc29ycyBsaWtlICR7cShcblN0cmluZyhrZXkpKVxuIH0gaW4gJHtjYW5kaWRhdGV9YCkpJiYoXG5cbmNhbkJlTWV0aG9kKGNhbmRpZGF0ZVtrZXldKXx8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgY2Fubm90IHNlcmlhbGl6ZSBSZW1vdGFibGVzIHdpdGggbm9uLW1ldGhvZHMgbGlrZSAke3EoXG5TdHJpbmcoa2V5KSlcbiB9IGluICR7Y2FuZGlkYXRlfWApKSYmKFxuXG5rZXkhPT1QQVNTX1NUWUxFfHxcbnJlamVjdCYmXG5yZWplY3QoWCBgQSBwYXNzLWJ5LXJlbW90ZSBjYW5ub3Qgc2hhZG93ICR7cShQQVNTX1NUWUxFKX1gKSkpO1xuXG4gfSk7XG4gfWVsc2UgaWYodHlwZW9mIGNhbmRpZGF0ZT09PSdmdW5jdGlvbicpe1xuLyogRmFyIGZ1bmN0aW9ucyBjYW5ub3QgYmUgbWV0aG9kcywgYW5kIGNhbm5vdCBoYXZlIG1ldGhvZHMuKi9cbi8qIFRoZXkgbXVzdCBoYXZlIGV4YWN0bHkgZXhwZWN0ZWQgYC5uYW1lYCBhbmQgYC5sZW5ndGhgIHByb3BlcnRpZXMqL1xuY29uc3R7bmFtZTpuYW1lRGVzYyxsZW5ndGg6bGVuZ3RoRGVzYywuLi5yZXN0RGVzY3N9PWRlc2NzO1xuY29uc3QgcmVzdEtleXM9b3duS2V5cyhyZXN0RGVzY3MpO1xucmV0dXJuKFxuKG5hbWVEZXNjJiZ0eXBlb2YgbmFtZURlc2MudmFsdWU9PT0nc3RyaW5nJ3x8XG5yZWplY3QmJlxucmVqZWN0KFggYEZhciBmdW5jdGlvbiBuYW1lIG11c3QgYmUgYSBzdHJpbmcsIGluICR7Y2FuZGlkYXRlfWApKSYmKFxubGVuZ3RoRGVzYyYmdHlwZW9mIGxlbmd0aERlc2MudmFsdWU9PT0nbnVtYmVyJ3x8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgRmFyIGZ1bmN0aW9uIGxlbmd0aCBtdXN0IGJlIGEgbnVtYmVyLCBpbiAke2NhbmRpZGF0ZX1gKSkmJihcblxucmVzdEtleXMubGVuZ3RoPT09MHx8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgRmFyIGZ1bmN0aW9ucyB1bmV4cGVjdGVkIHByb3BlcnRpZXMgYmVzaWRlcyAubmFtZSBhbmQgLmxlbmd0aCAke3Jlc3RLZXlzfWApKSk7XG5cblxuIH1lbHNle1xucmV0dXJuIHJlamVjdCYmcmVqZWN0KFggYHVucmVjb2duaXplZCB0eXBlb2YgJHtjYW5kaWRhdGV9YCk7XG4gfVxuIH0sXG5cbmFzc2VydFZhbGlkOihjYW5kaWRhdGUpPT5jaGVja1JlbW90YWJsZShjYW5kaWRhdGUsYXNzZXJ0Q2hlY2tlciksXG5cbmV2ZXJ5OihfcGFzc2FibGUsX2ZuKT0+dHJ1ZX0pOyRo4oCNX29uY2UuUmVtb3RhYmxlSGVscGVyKFJlbW90YWJsZUhlbHBlcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYXNzZXJ0SWZhY2UiOlsiYXNzZXJ0SWZhY2UiXSwiZ2V0SW50ZXJmYWNlT2YiOlsiZ2V0SW50ZXJmYWNlT2YiXSwiUmVtb3RhYmxlSGVscGVyIjpbIlJlbW90YWJsZUhlbHBlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAUxqrBig8AAIoPAAAwAAAAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL2hlbHBlcnMvc2FmZS1wcm9taXNlLmpzeyJpbXBvcnRzIjpbIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiLCJAZW5kby9wcm9taXNlLWtpdCJdLCJleHBvcnRzIjpbImFzc2VydFNhZmVQcm9taXNlIiwiaXNTYWZlUHJvbWlzZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBpc1Byb21pc2UsYXNzZXJ0Q2hlY2tlcixoYXNPd25Qcm9wZXJ0eU9mOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJpc1Byb21pc2VcIiwgWyRo4oCNX2EgPT4gKGlzUHJvbWlzZSA9ICRo4oCNX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXSxbXCJoYXNPd25Qcm9wZXJ0eU9mXCIsIFskaOKAjV9hID0+IChoYXNPd25Qcm9wZXJ0eU9mID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzLmpzJykuQ2hlY2tlcn0gQ2hlY2tlciAqL1xuXG5jb25zdHtkZXRhaWxzOlgscXVvdGU6cX09YXNzZXJ0O1xuY29uc3R7aXNGcm96ZW4sZ2V0UHJvdG90eXBlT2Z9PU9iamVjdDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5cbi8qKlxuICogQHBhcmFtIHtQcm9taXNlfSBwciBUaGUgdmFsdWUgdG8gZXhhbWluZVxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge3ByIGlzIFByb21pc2V9IFdoZXRoZXIgaXQgaXMgYSBzYWZlIHByb21pc2VcbiAqL1xuY29uc3QgY2hlY2tQcm9taXNlT3duS2V5cz0ocHIsY2hlY2spPT57XG5jb25zdCByZWplY3Q9KGRldGFpbHMpPT5jaGVjayhmYWxzZSxkZXRhaWxzKTtcbmNvbnN0IGtleXM9b3duS2V5cyhwcik7XG5cbmlmKGtleXMubGVuZ3RoPT09MCl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5cbmNvbnN0IHVua25vd25LZXlzPWtleXMuZmlsdGVyKFxuKGtleSk9PnR5cGVvZiBrZXkhPT0nc3ltYm9sJ3x8IWhhc093blByb3BlcnR5T2YoUHJvbWlzZS5wcm90b3R5cGUsa2V5KSk7XG5cblxuaWYodW5rbm93bktleXMubGVuZ3RoIT09MCl7XG5yZXR1cm4gcmVqZWN0KFxuWCBgJHtwcn0gLSBNdXN0IG5vdCBoYXZlIGFueSBvd24gcHJvcGVydGllczogJHtxKHVua25vd25LZXlzKX1gKTtcblxuIH1cblxuLyoqXG4gKiBBdCB0aGUgdGltZSBvZiB0aGlzIHdyaXRpbmcsIE5vZGUncyBhc3luY19ob29rcyBjb250YWlucyB0aGVcbiAqIGZvbGxvd2luZyBjb2RlLCB3aGljaCB3ZSBjYW4gYWxzbyBzYWZlbHkgdG9sZXJhdGVcbiAqXG4gKiBgYGBqc1xuICogZnVuY3Rpb24gZGVzdHJveVRyYWNraW5nKHByb21pc2UsIHBhcmVudCkge1xuICogdHJhY2tQcm9taXNlKHByb21pc2UsIHBhcmVudCk7XG4gKiAgIGNvbnN0IGFzeW5jSWQgPSBwcm9taXNlW2FzeW5jX2lkX3N5bWJvbF07XG4gKiAgIGNvbnN0IGRlc3Ryb3llZCA9IHsgZGVzdHJveWVkOiBmYWxzZSB9O1xuICogICBwcm9taXNlW2Rlc3Ryb3llZFN5bWJvbF0gPSBkZXN0cm95ZWQ7XG4gKiAgIHJlZ2lzdGVyRGVzdHJveUhvb2socHJvbWlzZSwgYXN5bmNJZCwgZGVzdHJveWVkKTtcbiAqIH1cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfHN5bWJvbH0ga2V5XG4gKi9cbmNvbnN0IGNoZWNrU2FmZUFzeW5jSG9va3NLZXk9KGtleSk9PntcbmNvbnN0IHZhbD1wcltrZXldO1xuaWYodmFsPT09dW5kZWZpbmVkfHx0eXBlb2YgdmFsPT09J251bWJlcicpe1xucmV0dXJuIHRydWU7XG4gfVxuaWYoXG50eXBlb2YgdmFsPT09J29iamVjdCcmJlxudmFsIT09bnVsbCYmXG5pc0Zyb3plbih2YWwpJiZcbmdldFByb3RvdHlwZU9mKHZhbCk9PT1PYmplY3QucHJvdG90eXBlKVxue1xuY29uc3Qgc3ViS2V5cz1vd25LZXlzKHZhbCk7XG5pZihzdWJLZXlzLmxlbmd0aD09PTApe1xucmV0dXJuIHRydWU7XG4gfVxuXG5pZihcbnN1YktleXMubGVuZ3RoPT09MSYmXG5zdWJLZXlzWzBdPT09J2Rlc3Ryb3llZCcmJlxudmFsLmRlc3Ryb3llZD09PWZhbHNlKVxue1xucmV0dXJuIHRydWU7XG4gfVxuIH1cbnJldHVybiByZWplY3QoXG5YIGBVbmV4cGVjdGVkIE5vZGUgYXN5bmNfaG9va3MgYWRkaXRpb25zIHRvIHByb21pc2U6ICR7cHJ9LiR7cShcblN0cmluZyhrZXkpKVxuIH0gaXMgJHt2YWx9YCk7XG5cbiB9O1xuXG5yZXR1cm4ga2V5cy5ldmVyeShjaGVja1NhZmVBc3luY0hvb2tzS2V5KTtcbiB9O1xuXG4vKipcbiAqIFVuZGVyIEhhcmRlbmVkIEpTIGEgcHJvbWlzZSBpcyBcInNhZmVcIiBpZiBpdHMgYHRoZW5gIG1ldGhvZCBjYW4gYmUgY2FsbGVkXG4gKiBzeW5jaHJvbm91c2x5IHdpdGhvdXQgZ2l2aW5nIHRoZSBwcm9taXNlIGFuIG9wcG9ydHVuaXR5IGZvciBhXG4gKiByZWVudHJhbmN5IGF0dGFjayBkdXJpbmcgdGhhdCBjYWxsLlxuICpcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvOVxuICogcmFpc2VzIHRoZSBpc3N1ZSBvZiB0ZXN0aW5nIHRoYXQgYSBzcGVjaW1lbiBpcyBhIHNhZmUgcHJvbWlzZVxuICogc3VjaCB0aGF0IHRoZSB0ZXN0IGFsc28gZG9lcyBub3QgZ2l2ZSB0aGUgc3BlY2ltZW4gYVxuICogcmVlbnRyYW5jeSBvcHBvcnR1bml0eS4gVGhhdCBpcyB3ZWxsIGJleW9uZCB0aGUgYW1iaXRpb24gaGVyZS5cbiAqIFRPRE8gVGhvdWdoIGlmIHdlIGZpZ3VyZSBvdXQgYSBuaWNlIHNvbHV0aW9uLCBpdCBtaWdodCBiZSBnb29kIHRvXG4gKiB1c2UgaXQgaGVyZSBhcyB3ZWxsLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gcHIgVGhlIHZhbHVlIHRvIGV4YW1pbmVcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtwciBpcyBQcm9taXNlfSBXaGV0aGVyIGl0IGlzIGEgc2FmZSBwcm9taXNlXG4gKi9cbmNvbnN0IGNoZWNrU2FmZVByb21pc2U9KHByLGNoZWNrKT0+e1xuY29uc3QgcmVqZWN0PShkZXRhaWxzKT0+Y2hlY2soZmFsc2UsZGV0YWlscyk7XG5yZXR1cm4oXG4oaXNGcm96ZW4ocHIpfHxyZWplY3QoWCBgJHtwcn0gLSBNdXN0IGJlIGZyb3plbmApKSYmKFxuaXNQcm9taXNlKHByKXx8cmVqZWN0KFggYCR7cHJ9IC0gTXVzdCBiZSBhIHByb21pc2VgKSkmJihcbmdldFByb3RvdHlwZU9mKHByKT09PVByb21pc2UucHJvdG90eXBlfHxcbnJlamVjdChcblggYCR7cHJ9IC0gTXVzdCBpbmhlcml0IGZyb20gUHJvbWlzZS5wcm90b3R5cGU6ICR7cShcbmdldFByb3RvdHlwZU9mKHByKSlcbiB9YCkpJiZcblxuY2hlY2tQcm9taXNlT3duS2V5cygvKiogQHR5cGUge1Byb21pc2V9ICovcHIsY2hlY2spKTtcblxuIH07XG5oYXJkZW4oY2hlY2tTYWZlUHJvbWlzZSk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIHRoZSBhcmd1bWVudCBpcyBhIFByb21pc2UuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBwciBUaGUgdmFsdWUgdG8gZXhhbWluZVxuICogQHJldHVybnMge3ByIGlzIFByb21pc2V9IFdoZXRoZXIgaXQgaXMgYSBwcm9taXNlXG4gKi9cbmNvbnN0ICAgICAgICBpc1NhZmVQcm9taXNlPShwcik9PmNoZWNrU2FmZVByb21pc2UocHIsKHgpPT54KTskaOKAjV9vbmNlLmlzU2FmZVByb21pc2UoaXNTYWZlUHJvbWlzZSk7XG5oYXJkZW4oaXNTYWZlUHJvbWlzZSk7XG5cbmNvbnN0ICAgICAgICBhc3NlcnRTYWZlUHJvbWlzZT0ocHIpPT5jaGVja1NhZmVQcm9taXNlKHByLGFzc2VydENoZWNrZXIpOyRo4oCNX29uY2UuYXNzZXJ0U2FmZVByb21pc2UoYXNzZXJ0U2FmZVByb21pc2UpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzU2FmZVByb21pc2UiOlsiaXNTYWZlUHJvbWlzZSJdLCJhc3NlcnRTYWZlUHJvbWlzZSI6WyJhc3NlcnRTYWZlUHJvbWlzZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABlE/1ouRIAALkSAAAqAAAAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL2hlbHBlcnMvc3ltYm9sLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJBdEF0UHJlZml4UGF0dGVybiIsImFzc2VydFBhc3NhYmxlU3ltYm9sIiwiaXNQYXNzYWJsZVN5bWJvbCIsIm5hbWVGb3JQYXNzYWJsZVN5bWJvbCIsInBhc3NhYmxlU3ltYm9sRm9yTmFtZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEB0cy1jaGVjayovXG5cbmNvbnN0e0ZhaWwscXVvdGU6cX09YXNzZXJ0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcblxuLyoqXG4gKiBUaGUgd2VsbCBrbm93biBzeW1ib2xzIGFyZSBzdGF0aWMgc3ltYm9sIHZhbHVlcyBvbiB0aGUgYFN5bWJvbGAgY29uc3RydWN0b3IuXG4gKi9cbmNvbnN0IHdlbGxLbm93blN5bWJvbE5hbWVzPW5ldyBNYXAoXG5vd25LZXlzKFN5bWJvbCkuXG5maWx0ZXIoXG4obmFtZSk9PnR5cGVvZiBuYW1lPT09J3N0cmluZycmJnR5cGVvZiBTeW1ib2xbbmFtZV09PT0nc3ltYm9sJykuXG5cbmZpbHRlcigobmFtZSk9Pntcbi8qIEB0cy1leHBlY3QtZXJyb3IgSXQgZG9lc24ndCBrbm93IG5hbWUgY2Fubm90IGJlIGEgc3ltYm9sKi9cbiFuYW1lLnN0YXJ0c1dpdGgoJ0BAJyl8fFxuRmFpbCBgRGlkIG5vdCBleHBlY3QgU3ltYm9sIHRvIGhhdmUgYSBzeW1ib2wtdmFsdWVkIHByb3BlcnR5IG5hbWUgc3RhcnRpbmcgd2l0aCBcIkBAXCIgJHtxKFxubmFtZSlcbiB9YDtcbnJldHVybiB0cnVlO1xuIH0pXG4vKiBAdHMtaWdub3JlIEl0IGRvZXNuJ3Qga25vdyBuYW1lIGNhbm5vdCBiZSBhIHN5bWJvbCovLlxubWFwKChuYW1lKT0+W1N5bWJvbFtuYW1lXSwgYEBAJHtuYW1lfWBdKSk7XG5cblxuLyoqXG4gKiBUaGUgcGFzc2FibGUgc3ltYm9scyBhcmUgdGhlIHdlbGwga25vd24gc3ltYm9scyAodGhlIHN5bWJvbCB2YWx1ZXNcbiAqIG9mIHN0YXRpYyBwcm9wZXJ0aWVzIG9mIHRoZSBgU3ltYm9sYCBjb25zdHJ1Y3RvcikgYW5kIHRoZSByZWdpc3RlcmVkXG4gKiBzeW1ib2xzLlxuICpcbiAqIEBwYXJhbSB7YW55fSBzeW1cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgaXNQYXNzYWJsZVN5bWJvbD0oc3ltKT0+XG50eXBlb2Ygc3ltPT09J3N5bWJvbCcmJihcbnR5cGVvZiBTeW1ib2wua2V5Rm9yKHN5bSk9PT0nc3RyaW5nJ3x8d2VsbEtub3duU3ltYm9sTmFtZXMuaGFzKHN5bSkpOyRo4oCNX29uY2UuaXNQYXNzYWJsZVN5bWJvbChpc1Bhc3NhYmxlU3ltYm9sKTtcbmhhcmRlbihpc1Bhc3NhYmxlU3ltYm9sKTtcblxuY29uc3QgICAgICAgIGFzc2VydFBhc3NhYmxlU3ltYm9sPShzeW0pPT5cbmlzUGFzc2FibGVTeW1ib2woc3ltKXx8XG5GYWlsIGBPbmx5IHJlZ2lzdGVyZWQgc3ltYm9scyBvciB3ZWxsLWtub3duIHN5bWJvbHMgYXJlIHBhc3NhYmxlOiAke3Eoc3ltKX1gOyRo4oCNX29uY2UuYXNzZXJ0UGFzc2FibGVTeW1ib2woYXNzZXJ0UGFzc2FibGVTeW1ib2wpO1xuaGFyZGVuKGFzc2VydFBhc3NhYmxlU3ltYm9sKTtcblxuLyoqXG4gKiBJZiBgc3ltYCBpcyBhIHBhc3NhYmxlIHN5bWJvbCwgcmV0dXJuIGEgc3RyaW5nIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGlzXG4gKiBzeW1ib2wuIElmIGBzeW1gIGlzIGEgbm9uLXBhc3NhYmxlIHN5bWJvbCwgcmV0dXJuIGB1bmRlZmluZWRgLlxuICpcbiAqIFRoZSBwYXNzYWJsZSBzeW1ib2xzIGFyZSB0aGUgd2VsbCBrbm93biBzeW1ib2xzICh0aGUgc3ltYm9sIHZhbHVlc1xuICogb2Ygc3RhdGljIHByb3BlcnRpZXMgb2YgdGhlIGBTeW1ib2xgIGNvbnN0cnVjdG9yKSBhbmQgdGhlIHJlZ2lzdGVyZWRcbiAqIHN5bWJvbHMuIFNpbmNlIHRoZSByZWdpc3RyYXRpb24gc3RyaW5nIG9mIGEgcmVnaXN0ZXJlZCBzeW1ib2wgY2FuIGJlIGFueVxuICogc3RyaW5nLCBpZiB3ZSBzaW1wbHkgdXNlZCB0aGF0IHRvIGlkZW50aWZ5IHRob3NlIHN5bWJvbHMsIHRoZXJlIHdvdWxkIG5vdFxuICogYmUgYW55IHJlbWFpbmluZyBzdHJpbmdzIGxlZnQgb3ZlciB0byBpZGVudGlmeSB0aGUgd2VsbC1rbm93biBzeW1ib2xzLlxuICogSW5zdGVhZCwgd2UgcmVzZXJ2ZSBzdHJpbmdzIGJlZ2lubmluZyB3aXRoIGBcIkBAXCJgIGZvciBwdXJwb3NlcyBvZiB0aGlzXG4gKiBlbmNvZGluZy4gV2UgaWRlbnRpZnkgYSB3ZWxsIGtub3duIHN5bWJvbCBzdWNoIGFzIGBTeW1ib2wuaXRlcmF0b3JgXG4gKiBieSBwcmVmaXhpbmcgdGhlIHByb3BlcnR5IG5hbWUgd2l0aCBgXCJAQFwiYCwgc3VjaCBhcyBgXCJAQGl0ZXJhdG9yXCJgLlxuICogRm9yIHJlZ2lzdGVyZWQgc3ltYm9scyB3aG9zZSBuYW1lIGhhcHBlbnMgdG8gYmVnaW4gd2l0aCBgXCJAQFwiYCwgc3VjaFxuICogYXMgYFN5bWJvbC5mb3IoJ0BAaXRlcmF0b3InKWAgb3IgYFN5bWJvbC5mb3IoJ0BAZm9vJylgLCB3ZSBpZGVudGlmeVxuICogdGhlbSBieSBwcmVmaXhpbmcgdGhlbSB3aXRoIGFuIGV4dHJhIGBcIkBAXCJgLCBzdWNoIGFzXG4gKiBgXCJAQEBAaXRlcmF0b3JcImAgb3IgYFwiQEBAQGZvb1wiYC4gKFRoaXMgaXMgdGhlIEhpbGJlcnQgSG90ZWwgZW5jb2RpbmdcbiAqIHRlY2huaXF1ZS4pXG4gKlxuICogQHBhcmFtIHtzeW1ib2x9IHN5bVxuICogQHJldHVybnMge3N0cmluZz19XG4gKi9cbmNvbnN0ICAgICAgICBuYW1lRm9yUGFzc2FibGVTeW1ib2w9KHN5bSk9PntcbmNvbnN0IG5hbWU9U3ltYm9sLmtleUZvcihzeW0pO1xuaWYobmFtZT09PXVuZGVmaW5lZCl7XG5yZXR1cm4gd2VsbEtub3duU3ltYm9sTmFtZXMuZ2V0KHN5bSk7XG4gfVxuaWYobmFtZS5zdGFydHNXaXRoKCdAQCcpKXtcbnJldHVybiBgQEAke25hbWV9YDtcbiB9XG5yZXR1cm4gbmFtZTtcbiB9OyRo4oCNX29uY2UubmFtZUZvclBhc3NhYmxlU3ltYm9sKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCk7XG5oYXJkZW4obmFtZUZvclBhc3NhYmxlU3ltYm9sKTtcblxuY29uc3QgICAgICAgIEF0QXRQcmVmaXhQYXR0ZXJuPS9eQEAoLiopJC87JGjigI1fb25jZS5BdEF0UHJlZml4UGF0dGVybihBdEF0UHJlZml4UGF0dGVybik7XG5oYXJkZW4oQXRBdFByZWZpeFBhdHRlcm4pO1xuXG4vKipcbiAqIElmIGBuYW1lYCBpcyBhIHN0cmluZyB0aGF0IGNvdWxkIGhhdmUgYmVlbiBwcm9kdWNlZCBieVxuICogYG5hbWVGb3JQYXNzYWJsZVN5bWJvbGAsIHJldHVybiB0aGUgc3ltYm9sIGFyZ3VtZW50IGl0IHdhcyBwcm9kdWNlZCB0b1xuICogcmVwcmVzZW50LlxuICpcbiAqICAgIElmIGBuYW1lYCBkb2VzIG5vdCBiZWdpbiB3aXRoIGBcIkBAXCJgLCB0aGVuIGp1c3QgdGhlIGNvcnJlc3BvbmRpbmdcbiAqICAgICAgcmVnaXN0ZXJlZCBzeW1ib2wsIGBTeW1ib2wuZm9yKG5hbWUpYC5cbiAqICAgIElmIGBuYW1lYCBpcyBgXCJAQFwiYCBmb2xsb3dlZCBieSBhIHdlbGwga25vd24gc3ltYm9sJ3MgcHJvcGVydHkgbmFtZSBvblxuICogICAgICBgU3ltYm9sYCBzdWNoIGBcIkBAaXRlcmF0b3JcIiwgcmV0dXJuIHRoYXQgd2VsbCBrbm93biBzeW1ib2wgc3VjaCBhc1xuICogICAgICBgU3ltYm9sLml0ZXJhdG9yYFxuICogICAgSWYgYG5hbWVgIGJlZ2lucyB3aXRoIGBcIkBAQEBcImAgaXQgZW5jb2RlcyB0aGUgcmVnaXN0ZXJlZCBzeW1ib2wgd2hvc2VcbiAqICAgICAgbmFtZSBiZWdpbnMgd2l0aCBgXCJAQFwiYCBpbnN0ZWFkLlxuICogICAgT3RoZXJ3aXNlLCBpZiBuYW1lIGJlZ2lucyB3aXRoIGBcIkBAXCJgIGl0IG1heSBlbmNvZGUgYSByZWdpc3RlcmVkIHN5bWJvbFxuICogICAgICBmcm9tIGEgZnV0dXJlIHZlcnNpb24gb2YgSmF2YVNjcmlwdCwgYnV0IGl0IGlzIG5vdCBvbmUgd2UgY2FuIGRlY29kZVxuICogICAgICB5ZXQsIHNvIHRocm93LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcmV0dXJucyB7c3ltYm9sPX1cbiAqL1xuY29uc3QgICAgICAgIHBhc3NhYmxlU3ltYm9sRm9yTmFtZT0obmFtZSk9PntcbmlmKHR5cGVvZiBuYW1lIT09J3N0cmluZycpe1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG5jb25zdCBtYXRjaD1BdEF0UHJlZml4UGF0dGVybi5leGVjKG5hbWUpO1xuaWYobWF0Y2gpe1xuY29uc3Qgc3VmZml4PW1hdGNoWzFdO1xuaWYoc3VmZml4LnN0YXJ0c1dpdGgoJ0BAJykpe1xucmV0dXJuIFN5bWJvbC5mb3Ioc3VmZml4KTtcbiB9ZWxzZXtcbmNvbnN0IHN5bT1TeW1ib2xbc3VmZml4XTtcbmlmKHR5cGVvZiBzeW09PT0nc3ltYm9sJyl7XG5yZXR1cm4gc3ltO1xuIH1cbkZhaWwgYFJlc2VydmVkIGZvciB3ZWxsIGtub3duIHN5bWJvbCAke3Eoc3VmZml4KX06ICR7cShuYW1lKX1gO1xuIH1cbiB9XG5yZXR1cm4gU3ltYm9sLmZvcihuYW1lKTtcbiB9OyRo4oCNX29uY2UucGFzc2FibGVTeW1ib2xGb3JOYW1lKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSk7XG5oYXJkZW4ocGFzc2FibGVTeW1ib2xGb3JOYW1lKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc1Bhc3NhYmxlU3ltYm9sIjpbImlzUGFzc2FibGVTeW1ib2wiXSwiYXNzZXJ0UGFzc2FibGVTeW1ib2wiOlsiYXNzZXJ0UGFzc2FibGVTeW1ib2wiXSwibmFtZUZvclBhc3NhYmxlU3ltYm9sIjpbIm5hbWVGb3JQYXNzYWJsZVN5bWJvbCJdLCJBdEF0UHJlZml4UGF0dGVybiI6WyJBdEF0UHJlZml4UGF0dGVybiJdLCJwYXNzYWJsZVN5bWJvbEZvck5hbWUiOlsicGFzc2FibGVTeW1ib2xGb3JOYW1lIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAq0udbgBwAA4AcAACoAAABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvaGVscGVycy90YWdnZWQuanN7ImltcG9ydHMiOlsiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbIlRhZ2dlZEhlbHBlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnRDaGVja2VyLGNoZWNrVGFnUmVjb3JkLFBBU1NfU1RZTEUsY2hlY2tOb3JtYWxQcm9wZXJ0eSxjaGVja1Bhc3NTdHlsZTskaOKAjV9pbXBvcnRzKFtbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXSxbXCJjaGVja1RhZ1JlY29yZFwiLCBbJGjigI1fYSA9PiAoY2hlY2tUYWdSZWNvcmQgPSAkaOKAjV9hKV1dLFtcIlBBU1NfU1RZTEVcIiwgWyRo4oCNX2EgPT4gKFBBU1NfU1RZTEUgPSAkaOKAjV9hKV1dLFtcImNoZWNrTm9ybWFsUHJvcGVydHlcIiwgWyRo4oCNX2EgPT4gKGNoZWNrTm9ybWFsUHJvcGVydHkgPSAkaOKAjV9hKV1dLFtcImNoZWNrUGFzc1N0eWxlXCIsIFskaOKAjV9hID0+IChjaGVja1Bhc3NTdHlsZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0e0ZhaWx9PWFzc2VydDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzfT1PYmplY3Q7XG5cbi8qKlxuICpcbiAqIEB0eXBlIHtYaW1wb3J0KCcuL2ludGVybmFsLXR5cGVzLmpzJykuUGFzc1N0eWxlSGVscGVyfVxuICovXG5jb25zdCAgICAgICAgVGFnZ2VkSGVscGVyPWhhcmRlbih7XG5zdHlsZU5hbWU6J3RhZ2dlZCcsXG5cbmNhbkJlVmFsaWQ6KGNhbmRpZGF0ZSxjaGVjayk9PmNoZWNrUGFzc1N0eWxlKGNhbmRpZGF0ZSwndGFnZ2VkJyxjaGVjayksXG5cbmFzc2VydFZhbGlkOihjYW5kaWRhdGUscGFzc1N0eWxlT2ZSZWN1cik9PntcbmNoZWNrVGFnUmVjb3JkKGNhbmRpZGF0ZSwndGFnZ2VkJyxhc3NlcnRDaGVja2VyKTtcblxuLyogVHlwZWNhc3RzIG5lZWRlZCBkdWUgdG8gaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy8xODYzKi9cbmNvbnN0IHBhc3NTdHlsZUtleT0vKiogQHR5cGUge3Vua25vd259ICovUEFTU19TVFlMRTtcbmNvbnN0IHRhZ0tleT0vKiogQHR5cGUge3Vua25vd259ICovU3ltYm9sLnRvU3RyaW5nVGFnO1xuY29uc3R7XG4vKiBjaGVja1RhZ1JlY29yZCBhbHJlYWR5IHZlcmlmaWVkIFBBU1NfU1RZTEUgYW5kIFN5bWJvbC50b1N0cmluZ1RhZyBvd24gZGF0YSBwcm9wZXJ0aWVzLiovXG5bLyoqIEB0eXBlIHtzdHJpbmd9ICovcGFzc1N0eWxlS2V5XTpfcGFzc1N0eWxlRGVzYyxcblsvKiogQHR5cGUge3N0cmluZ30gKi90YWdLZXldOl9sYWJlbERlc2MsXG5wYXlsb2FkOl9wYXlsb2FkRGVzYywvKiB2YWx1ZSBjaGVja2VkIGJ5IHJlY3Vyc2l2ZSB3YWxrIGF0IHRoZSBlbmQqL1xuLi4ucmVzdERlc2NzfT1cbmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoY2FuZGlkYXRlKTtcbm93bktleXMocmVzdERlc2NzKS5sZW5ndGg9PT0wfHxcbkZhaWwgYFVuZXhwZWN0ZWQgcHJvcGVydGllcyBvbiB0YWdnZWQgcmVjb3JkICR7b3duS2V5cyhyZXN0RGVzY3MpfWA7XG5cbmNoZWNrTm9ybWFsUHJvcGVydHkoY2FuZGlkYXRlLCdwYXlsb2FkJyx0cnVlLGFzc2VydENoZWNrZXIpO1xuXG4vKiBSZWN1cnNpdmVseSB2YWxpZGF0ZSB0aGF0IGVhY2ggbWVtYmVyIGlzIHBhc3NhYmxlLiovXG5wYXNzU3R5bGVPZlJlY3VyKGNhbmRpZGF0ZS5wYXlsb2FkKTtcbiB9fSk7JGjigI1fb25jZS5UYWdnZWRIZWxwZXIoVGFnZ2VkSGVscGVyKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJUYWdnZWRIZWxwZXIiOlsiVGFnZ2VkSGVscGVyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAABGaO1D0GAAA9BgAACQAAABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvbWFrZS1mYXIuanN7ImltcG9ydHMiOlsiLi9oZWxwZXJzL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9oZWxwZXJzL3JlbW90YWJsZS5qcyJdLCJleHBvcnRzIjpbIkZhciIsIlJlbW90YWJsZSIsIlRvRmFyRnVuY3Rpb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0Q2hlY2tlcixQQVNTX1NUWUxFLGFzc2VydElmYWNlLGdldEludGVyZmFjZU9mLFJlbW90YWJsZUhlbHBlcjskaOKAjV9pbXBvcnRzKFtbXCIuL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dLFtcIlBBU1NfU1RZTEVcIiwgWyRo4oCNX2EgPT4gKFBBU1NfU1RZTEUgPSAkaOKAjV9hKV1dXV0sW1wiLi9oZWxwZXJzL3JlbW90YWJsZS5qc1wiLCBbW1wiYXNzZXJ0SWZhY2VcIiwgWyRo4oCNX2EgPT4gKGFzc2VydElmYWNlID0gJGjigI1fYSldXSxbXCJnZXRJbnRlcmZhY2VPZlwiLCBbJGjigI1fYSA9PiAoZ2V0SW50ZXJmYWNlT2YgPSAkaOKAjV9hKV1dLFtcIlJlbW90YWJsZUhlbHBlclwiLCBbJGjigI1fYSA9PiAoUmVtb3RhYmxlSGVscGVyID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkludGVyZmFjZVNwZWN9IEludGVyZmFjZVNwZWMgKi9cbi8qKiBAdGVtcGxhdGUgTCxSIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9ldmVudHVhbC1zZW5kJykuUmVtb3RhYmxlQnJhbmQ8TCwgUj59IFJlbW90YWJsZUJyYW5kICovXG5cbmNvbnN0e3F1b3RlOnEsRmFpbH09YXNzZXJ0O1xuXG5jb25zdHtwcm90b3R5cGU6ZnVuY3Rpb25Qcm90b3R5cGV9PUZ1bmN0aW9uO1xuY29uc3R7XG5nZXRQcm90b3R5cGVPZixcbnNldFByb3RvdHlwZU9mLFxuY3JlYXRlLFxuaXNGcm96ZW4sXG5wcm90b3R5cGU6b2JqZWN0UHJvdG90eXBlfT1cbk9iamVjdDtcblxuLyoqXG4gKiBOb3cgdGhhdCB0aGUgcmVtb3RhYmxlUHJvdG8gZG9lcyBub3QgcHJvdmlkZSBpdHMgb3duIGB0b1N0cmluZ2AgbWV0aG9kLFxuICogZW5zdXJlIGl0IGFsd2F5cyBpbmhlcml0cyBmcm9tIHNvbWV0aGluZy4gVGhlIG9yaWdpbmFsIHByb3RvdHlwZSBvZlxuICogYHJlbW90YWJsZWAgaWYgdGhlcmUgd2FzIG9uZSwgb3IgYE9iamVjdC5wcm90b3R5cGVgIG90aGVyd2lzZS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcmVtb3RhYmxlXG4gKiBAcGFyYW0ge0ludGVyZmFjZVNwZWN9IGlmYWNlXG4gKiBAcmV0dXJucyB7T2JqZWN0fVxuICovXG5jb25zdCBtYWtlUmVtb3RhYmxlUHJvdG89KHJlbW90YWJsZSxpZmFjZSk9PntcbmxldCBvbGRQcm90bz1nZXRQcm90b3R5cGVPZihyZW1vdGFibGUpO1xuaWYodHlwZW9mIHJlbW90YWJsZT09PSdvYmplY3QnKXtcbmlmKG9sZFByb3RvPT09bnVsbCl7XG5vbGRQcm90bz1vYmplY3RQcm90b3R5cGU7XG4gfVxub2xkUHJvdG89PT1vYmplY3RQcm90b3R5cGV8fFxuRmFpbCBgRm9yIG5vdywgcmVtb3RhYmxlcyBjYW5ub3QgaW5oZXJpdCBmcm9tIGFueXRoaW5nIHVudXN1YWwsIGluICR7cmVtb3RhYmxlfWA7XG4gfWVsc2UgaWYodHlwZW9mIHJlbW90YWJsZT09PSdmdW5jdGlvbicpe1xub2xkUHJvdG8hPT1udWxsfHxcbkZhaWwgYE9yaWdpbmFsIGZ1bmN0aW9uIG11c3Qgbm90IGluaGVyaXQgZnJvbSBudWxsOiAke3JlbW90YWJsZX1gO1xub2xkUHJvdG89PT1mdW5jdGlvblByb3RvdHlwZXx8XG5nZXRQcm90b3R5cGVPZihvbGRQcm90byk9PT1mdW5jdGlvblByb3RvdHlwZXx8XG5GYWlsIGBGYXIgZnVuY3Rpb25zIG11c3Qgb3JpZ2luYWxseSBpbmhlcml0IGZyb20gRnVuY3Rpb24ucHJvdG90eXBlLCBpbiAke3JlbW90YWJsZX1gO1xuIH1lbHNle1xuRmFpbCBgdW5yZWNvZ25pemVkIHR5cGVvZiAke3JlbW90YWJsZX1gO1xuIH1cbnJldHVybiBoYXJkZW4oXG5jcmVhdGUob2xkUHJvdG8se1xuW1BBU1NfU1RZTEVdOnt2YWx1ZToncmVtb3RhYmxlJ30sXG5bU3ltYm9sLnRvU3RyaW5nVGFnXTp7dmFsdWU6aWZhY2V9fSkpO1xuXG5cbiB9O1xuXG5jb25zdCBhc3NlcnRDYW5CZVJlbW90YWJsZT0oY2FuZGlkYXRlKT0+XG5SZW1vdGFibGVIZWxwZXIuY2FuQmVWYWxpZChjYW5kaWRhdGUsYXNzZXJ0Q2hlY2tlcik7XG5cbi8qKlxuICogQ3JlYXRlIGFuZCByZWdpc3RlciBhIFJlbW90YWJsZS4gIEFmdGVyIHRoaXMsIGdldEludGVyZmFjZU9mKHJlbW90YWJsZSlcbiAqIHJldHVybnMgaWZhY2UuXG4gKlxuICogLy8gaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy84MDRcbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJbnRlcmZhY2VTcGVjfSBbaWZhY2U9J1JlbW90YWJsZSddIFRoZSBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbiBmb3JcbiAqIHRoZSByZW1vdGFibGUuIEZvciBub3csIGEgc3RyaW5nIGlmYWNlIG11c3QgYmUgXCJSZW1vdGFibGVcIiBvciBiZWdpbiB3aXRoXG4gKiBcIkFsbGVnZWQ6IFwiLCB0byBzZXJ2ZSBhcyB0aGUgYWxsZWdlZCBuYW1lLiBNb3JlIGdlbmVyYWwgaWZhY2VzIGFyZSBub3QgeWV0XG4gKiBpbXBsZW1lbnRlZC4gVGhpcyBpcyB0ZW1wb3JhcnkuIFdlIGluY2x1ZGUgdGhlXG4gKiBcIkFsbGVnZWRcIiBhcyBhIHJlbWluZGVyIHRoYXQgd2UgZG8gbm90IHlldCBoYXZlIFN3aW5nU2V0IG9yIENvbW1zIFZhdFxuICogc3VwcG9ydCBmb3IgZW5zdXJpbmcgdGhpcyBpcyBhY2NvcmRpbmcgdG8gdGhlIHZhdCBob3N0aW5nIHRoZSBvYmplY3QuXG4gKiBDdXJyZW50bHksIEFsaWNlIGNhbiB0ZWxsIEJvYiBhYm91dCBDYXJvbCwgd2hlcmUgVmF0QSAob24gQWxpY2UncyBiZWhhbGYpXG4gKiBtaXNyZXByZXNlbnRzIENhcm9sJ3MgYGlmYWNlYC4gVmF0QiBhbmQgdGhlcmVmb3JlIEJvYiB3aWxsIHRoZW4gc2VlXG4gKiBDYXJvbCdzIGBpZmFjZWAgYXMgbWlzcmVwcmVzZW50ZWQgYnkgVmF0QS5cbiAqIEBwYXJhbSB7dW5kZWZpbmVkfSBbcHJvcHM9dW5kZWZpbmVkXSBDdXJyZW50bHkgbWF5IG9ubHkgYmUgdW5kZWZpbmVkLlxuICogVGhhdCBwbGFuIGlzIHRoYXQgb3duLXByb3BlcnRpZXMgYXJlIGNvcGllZCB0byB0aGUgcmVtb3RhYmxlXG4gKiBAcGFyYW0ge1R9IFtyZW1vdGFibGU9e31dIFRoZSBvYmplY3QgdXNlZCBhcyB0aGUgcmVtb3RhYmxlXG4gKiBAcmV0dXJucyB7VCAmIFJlbW90YWJsZUJyYW5kPHt9LCBUPn0gcmVtb3RhYmxlLCBtb2RpZmllZCBmb3IgZGVidWdnYWJpbGl0eVxuICovXG5jb25zdCAgICAgICAgUmVtb3RhYmxlPShcbmlmYWNlPSdSZW1vdGFibGUnLFxucHJvcHM9dW5kZWZpbmVkLFxucmVtb3RhYmxlPS8qKiBAdHlwZSB7VH0gKi97fSk9Plxue1xuYXNzZXJ0SWZhY2UoaWZhY2UpO1xuYXNzZXJ0KGlmYWNlKTtcbi8qIFRPRE86IFdoZW4gaWZhY2UgaXMgcmljaGVyIHRoYW4ganVzdCBzdHJpbmcsIHdlIG5lZWQgdG8gZ2V0IHRoZSBhbGxlZ2VkTmFtZSovXG4vKiBpbiBhIGRpZmZlcmVudCB3YXkuKi9cbnByb3BzPT09dW5kZWZpbmVkfHxGYWlsIGBSZW1vdGFibGUgcHJvcHMgbm90IHlldCBpbXBsZW1lbnRlZCAke3Byb3BzfWA7XG5cbi8qIEZhaWwgZmFzdDogY2hlY2sgdGhhdCB0aGUgdW5tb2RpZmllZCBvYmplY3QgaXMgYWJsZSB0byBiZWNvbWUgYSBSZW1vdGFibGUuKi9cbmFzc2VydENhbkJlUmVtb3RhYmxlKHJlbW90YWJsZSk7XG5cbi8qIEVuc3VyZSB0aGF0IHRoZSByZW1vdGFibGUgaXNuJ3QgYWxyZWFkeSBtYXJrZWQuKi9cbiEoUEFTU19TVFlMRSBpbiByZW1vdGFibGUpfHxcbkZhaWwgYFJlbW90YWJsZSAke3JlbW90YWJsZX0gaXMgYWxyZWFkeSBtYXJrZWQgYXMgYSAke3EoXG5yZW1vdGFibGVbUEFTU19TVFlMRV0pXG4gfWA7XG4vKiBFbnN1cmUgdGhhdCB0aGUgcmVtb3RhYmxlIGlzbid0IGFscmVhZHkgZnJvemVuLiovXG4haXNGcm96ZW4ocmVtb3RhYmxlKXx8RmFpbCBgUmVtb3RhYmxlICR7cmVtb3RhYmxlfSBpcyBhbHJlYWR5IGZyb3plbmA7XG5jb25zdCByZW1vdGFibGVQcm90bz1tYWtlUmVtb3RhYmxlUHJvdG8ocmVtb3RhYmxlLGlmYWNlKTtcblxuLyogVGFrZSBhIHN0YXRpYyBjb3B5IG9mIHRoZSBlbnVtZXJhYmxlIG93biBwcm9wZXJ0aWVzIGFzIGRhdGEgcHJvcGVydGllcy4qL1xuLyogY29uc3QgcHJvcERlc2NzID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyh7IC4uLnByb3BzIH0pOyovXG5jb25zdCBtdXRhdGVIYXJkZW5BbmRDaGVjaz0odGFyZ2V0KT0+e1xuLyogZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BEZXNjcyk7Ki9cbnNldFByb3RvdHlwZU9mKHRhcmdldCxyZW1vdGFibGVQcm90byk7XG5oYXJkZW4odGFyZ2V0KTtcbmFzc2VydENhbkJlUmVtb3RhYmxlKHRhcmdldCk7XG4gfTtcblxuLyogRmFpbCBmYXN0OiBjaGVjayBhIGZyZXNoIHJlbW90YWJsZSB0byBzZWUgaWYgb3VyIHJ1bGVzIGZpdC4qL1xubXV0YXRlSGFyZGVuQW5kQ2hlY2soe30pO1xuXG4vKiBBY3R1YWxseSBmaW5pc2ggdGhlIG5ldyByZW1vdGFibGUuKi9cbm11dGF0ZUhhcmRlbkFuZENoZWNrKHJlbW90YWJsZSk7XG5cbi8qIENPTU1JVFRFRCEqL1xuLyogV2UncmUgY29tbWl0dGVkLCBzbyBrZWVwIHRoZSBpbnRlcmZhY2UgZm9yIGZ1dHVyZSByZWZlcmVuY2UuKi9cbmFzc2VydChpZmFjZSE9PXVuZGVmaW5lZCk7LyogVG8gbWFrZSBUeXBlU2NyaXB0IGhhcHB5Ki9cbnJldHVybiAoLyoqIEB0eXBlIHtUICYgUmVtb3RhYmxlQnJhbmQ8e30sIFQ+fSAqL3JlbW90YWJsZSk7XG4gfTskaOKAjV9vbmNlLlJlbW90YWJsZShSZW1vdGFibGUpO1xuaGFyZGVuKFJlbW90YWJsZSk7XG5cbi8qKlxuICogQSBjb25jaXNlIGNvbnZlbmllbmNlIGZvciB0aGUgbW9zdCBjb21tb24gYFJlbW90YWJsZWAgdXNlLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge3N0cmluZ30gZmFyTmFtZSBUaGlzIG5hbWUgd2lsbCBiZSBwcmVwZW5kZWQgd2l0aCBgQWxsZWdlZDogYFxuICogZm9yIG5vdyB0byBmb3JtIHRoZSBgUmVtb3RhYmxlYCBgaWZhY2VgIGFyZ3VtZW50LlxuICogQHBhcmFtIHtUfSBbcmVtb3RhYmxlPXt9XSBUaGUgb2JqZWN0IHVzZWQgYXMgdGhlIHJlbW90YWJsZVxuICovXG5jb25zdCAgICAgICAgRmFyPShmYXJOYW1lLHJlbW90YWJsZT11bmRlZmluZWQpPT57XG5jb25zdCByPXJlbW90YWJsZT09PXVuZGVmaW5lZD8vKiogQHR5cGUge1R9ICove306cmVtb3RhYmxlO1xucmV0dXJuIFJlbW90YWJsZSggYEFsbGVnZWQ6ICR7ZmFyTmFtZX1gLHVuZGVmaW5lZCxyKTtcbiB9OyRo4oCNX29uY2UuRmFyKEZhcik7XG5oYXJkZW4oRmFyKTtcblxuLyoqXG4gKiBDb2VyY2UgYGZ1bmNgIHRvIGEgZmFyIGZ1bmN0aW9uIHRoYXQgcHJlc2VydmVzIGl0cyBjYWxsIGJlaGF2aW9yLlxuICogSWYgaXQgaXMgYWxyZWFkeSBhIGZhciBmdW5jdGlvbiwgcmV0dXJuIGl0LiBPdGhlcndpc2UgbWFrZSBhbmQgcmV0dXJuIGFcbiAqIG5ldyBmYXIgZnVuY3Rpb24gdGhhdCB3cmFwcyBgZnVuY2AgYW5kIGZvcndhcmRzIGNhbGxzIHRvIGl0LiBUaGlzXG4gKiB3b3JrcyBldmVuIGlmIGBmdW5jYCBpcyBhbHJlYWR5IGZyb3plbi4gYFRvRmFyRnVuY3Rpb25gIGlzIHRvIGJlIHVzZWRcbiAqIHdoZW4gdGhlIGZ1bmN0aW9uIGNvbWVzIGZyb20gZWxzZXdoZXJlIHVuZGVyIGxlc3MgY29udHJvbC4gRm9yIGZ1bmN0aW9uc1xuICogeW91IGF1dGhvciBpbiBwbGFjZSwgYmV0dGVyIHRvIHVzZSBgRmFyYCBvbiB0aGVpciBmdW5jdGlvbiBsaXRlcmFsIGRpcmVjdGx5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmYXJOYW1lIHRvIGJlIHVzZWQgb25seSBpZiBgZnVuY2AgaXMgbm90IGFscmVhZHkgYVxuICogZmFyIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsoLi4uYXJnczogYW55W10pID0+IGFueX0gZnVuY1xuICovXG5jb25zdCAgICAgICAgVG9GYXJGdW5jdGlvbj0oZmFyTmFtZSxmdW5jKT0+e1xuaWYoZ2V0SW50ZXJmYWNlT2YoZnVuYykhPT11bmRlZmluZWQpe1xucmV0dXJuIGZ1bmM7XG4gfVxucmV0dXJuIEZhcihmYXJOYW1lLCguLi5hcmdzKT0+ZnVuYyguLi5hcmdzKSk7XG4gfTskaOKAjV9vbmNlLlRvRmFyRnVuY3Rpb24oVG9GYXJGdW5jdGlvbik7XG5oYXJkZW4oVG9GYXJGdW5jdGlvbik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiUmVtb3RhYmxlIjpbIlJlbW90YWJsZSJdLCJGYXIiOlsiRmFyIl0sIlRvRmFyRnVuY3Rpb24iOlsiVG9GYXJGdW5jdGlvbiJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABb8wNnKQQAACkEAAAmAAAAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL21ha2VUYWdnZWQuanN7ImltcG9ydHMiOlsiLi9oZWxwZXJzL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9wYXNzU3R5bGVPZi5qcyJdLCJleHBvcnRzIjpbIm1ha2VUYWdnZWQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgUEFTU19TVFlMRSxhc3NlcnRQYXNzYWJsZTskaOKAjV9pbXBvcnRzKFtbXCIuL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcIlBBU1NfU1RZTEVcIiwgWyRo4oCNX2EgPT4gKFBBU1NfU1RZTEUgPSAkaOKAjV9hKV1dXV0sW1wiLi9wYXNzU3R5bGVPZi5qc1wiLCBbW1wiYXNzZXJ0UGFzc2FibGVcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhc3NhYmxlID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5jb25zdHtjcmVhdGUscHJvdG90eXBlOm9iamVjdFByb3RvdHlwZX09T2JqZWN0O1xuY29uc3R7ZGV0YWlsczpYfT1hc3NlcnQ7XG5cbmNvbnN0ICAgICAgICBtYWtlVGFnZ2VkPSh0YWcscGF5bG9hZCk9PntcbmFzc2VydC50eXBlb2YoXG50YWcsXG4nc3RyaW5nJyxcblggYFRoZSB0YWcgb2YgYSB0YWdnZWQgcmVjb3JkIG11c3QgYmUgYSBzdHJpbmc6ICR7dGFnfWApO1xuXG5hc3NlcnRQYXNzYWJsZShoYXJkZW4ocGF5bG9hZCkpO1xucmV0dXJuIGhhcmRlbihcbmNyZWF0ZShvYmplY3RQcm90b3R5cGUse1xuW1BBU1NfU1RZTEVdOnt2YWx1ZTondGFnZ2VkJ30sXG5bU3ltYm9sLnRvU3RyaW5nVGFnXTp7dmFsdWU6dGFnfSxcbnBheWxvYWQ6e3ZhbHVlOnBheWxvYWQsZW51bWVyYWJsZTp0cnVlfX0pKTtcblxuXG4gfTskaOKAjV9vbmNlLm1ha2VUYWdnZWQobWFrZVRhZ2dlZCk7XG5oYXJkZW4obWFrZVRhZ2dlZCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVRhZ2dlZCI6WyJtYWtlVGFnZ2VkIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANAlDou8KAAAvCgAACoAAABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvbWFyc2hhbC1qdXN0aW4uanN7ImltcG9ydHMiOlsiLi9lbmNvZGVUb0NhcERhdGEuanMiLCIuL2hlbHBlcnMvZXJyb3IuanMiLCIuL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanMiLCIuL2hlbHBlcnMvc3ltYm9sLmpzIiwiQGVuZG8vbmF0Il0sImV4cG9ydHMiOlsiZGVjb2RlVG9KdXN0aW4iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgTmF0LFFDTEFTUyxnZXRFcnJvckNvbnN0cnVjdG9yLGlzT2JqZWN0LEF0QXRQcmVmaXhQYXR0ZXJuLHBhc3NhYmxlU3ltYm9sRm9yTmFtZTskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9uYXRcIiwgW1tcIk5hdFwiLCBbJGjigI1fYSA9PiAoTmF0ID0gJGjigI1fYSldXV1dLFtcIi4vZW5jb2RlVG9DYXBEYXRhLmpzXCIsIFtbXCJRQ0xBU1NcIiwgWyRo4oCNX2EgPT4gKFFDTEFTUyA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvZXJyb3IuanNcIiwgW1tcImdldEVycm9yQ29uc3RydWN0b3JcIiwgWyRo4oCNX2EgPT4gKGdldEVycm9yQ29uc3RydWN0b3IgPSAkaOKAjV9hKV1dXV0sW1wiLi9oZWxwZXJzL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJpc09iamVjdFwiLCBbJGjigI1fYSA9PiAoaXNPYmplY3QgPSAkaOKAjV9hKV1dXV0sW1wiLi9oZWxwZXJzL3N5bWJvbC5qc1wiLCBbW1wiQXRBdFByZWZpeFBhdHRlcm5cIiwgWyRo4oCNX2EgPT4gKEF0QXRQcmVmaXhQYXR0ZXJuID0gJGjigI1fYSldXSxbXCJwYXNzYWJsZVN5bWJvbEZvck5hbWVcIiwgWyRo4oCNX2EgPT4gKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5FbmNvZGluZ30gRW5jb2RpbmcgKi9cblxuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2lzQXJyYXl9PUFycmF5O1xuY29uc3R7c3RyaW5naWZ5OnF1b3RlfT1KU09OO1xuY29uc3R7cXVvdGU6cSxkZXRhaWxzOlgsRmFpbH09YXNzZXJ0O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEluZGVudGVyXG4gKiBAcHJvcGVydHkgeyhvcGVuQnJhY2tldDogc3RyaW5nKSA9PiBudW1iZXJ9IG9wZW5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gbnVtYmVyfSBsaW5lXG4gKiBAcHJvcGVydHkgeyh0b2tlbjogc3RyaW5nKSA9PiBudW1iZXJ9IG5leHRcbiAqIEBwcm9wZXJ0eSB7KGNsb3NlQnJhY2tldDogc3RyaW5nKSA9PiBudW1iZXJ9IGNsb3NlXG4gKiBAcHJvcGVydHkgeygpID0+IHN0cmluZ30gZG9uZVxuICovXG5cbi8qKlxuICogR2VuZXJvdXMgd2hpdGVzcGFjZSBmb3IgcmVhZGFiaWxpdHlcbiAqXG4gKiBAcmV0dXJucyB7SW5kZW50ZXJ9XG4gKi9cbmNvbnN0IG1ha2VZZXNJbmRlbnRlcj0oKT0+e1xuY29uc3Qgc3RyaW5ncz1bXTtcbmxldCBsZXZlbD0wO1xubGV0IG5lZWRTcGFjZT1mYWxzZTtcbmNvbnN0IGxpbmU9KCk9Pntcbm5lZWRTcGFjZT1mYWxzZTtcbnJldHVybiBzdHJpbmdzLnB1c2goJ1xcbicsJyAgJy5yZXBlYXQobGV2ZWwpKTtcbiB9O1xucmV0dXJuIGhhcmRlbih7XG5vcGVuOihvcGVuQnJhY2tldCk9PntcbmxldmVsKz0xO1xuaWYobmVlZFNwYWNlKXtcbnN0cmluZ3MucHVzaCgnICcpO1xuIH1cbm5lZWRTcGFjZT1mYWxzZTtcbnJldHVybiBzdHJpbmdzLnB1c2gob3BlbkJyYWNrZXQpO1xuIH0sXG5saW5lLFxubmV4dDoodG9rZW4pPT57XG5pZihuZWVkU3BhY2UmJnRva2VuIT09JywnKXtcbnN0cmluZ3MucHVzaCgnICcpO1xuIH1cbm5lZWRTcGFjZT10cnVlO1xucmV0dXJuIHN0cmluZ3MucHVzaCh0b2tlbik7XG4gfSxcbmNsb3NlOihjbG9zZUJyYWNrZXQpPT57XG5hc3NlcnQobGV2ZWw+PTEpO1xubGV2ZWwtPTE7XG5saW5lKCk7XG5yZXR1cm4gc3RyaW5ncy5wdXNoKGNsb3NlQnJhY2tldCk7XG4gfSxcbmRvbmU6KCk9PntcbmFzc2VydC5lcXVhbChsZXZlbCwwKTtcbnJldHVybiBzdHJpbmdzLmpvaW4oJycpO1xuIH19KTtcblxuIH07XG5cbi8qKlxuICogSWYgdGhlIGxhc3QgY2hhcmFjdGVyIG9mIG9uZSB0b2tlbiB0b2dldGhlciB3aXRoIHRoZSBmaXJzdCBjaGFyYWN0ZXJcbiAqIG9mIHRoZSBuZXh0IHRva2VuIG1hdGNoZXMgdGhpcyBwYXR0ZXJuLCB0aGVuIHRoZSB0d28gdG9rZW5zIG11c3QgYmVcbiAqIHNlcGFyYXRlZCBieSB3aGl0ZXNwYWNlIHRvIHByZXNlcnZlIHRoZWlyIG1lYW5pbmcuIE90aGVyd2lzZSB0aGVcbiAqIHdoaXRlc3BhY2UgaW4gdW5uZWNlc3NhcnkuXG4gKlxuICogVGhlIGA8IWAgYW5kIGAtPmAgY2FzZXMgcHJldmVudCB0aGUgYWNjaWRlbnRhbCBmb3JtYXRpb24gb2YgYW5cbiAqIGh0bWwtbGlrZSBjb21tZW50LiBJIGRvbid0IHRoaW5rIHRoZSBkb3VibGUgYW5nbGUgYnJhY2tldHMgYXJlIGFjdHVhbGx5XG4gKiBuZWVkZWQgYnV0IEkgaGF2ZW4ndCB0aG91Z2h0IGFib3V0IGl0IGVub3VnaCB0byByZW1vdmUgdGhlbS5cbiAqL1xuY29uc3QgYmFkUGFpclBhdHRlcm49L14oPzpcXHdcXHd8PDx8Pj58XFwrXFwrfC0tfDwhfC0+KSQvO1xuXG4vKipcbiAqIE1pbmltdW0gd2hpdGVzcGFjZSBuZWVkZWQgdG8gcHJlc2V2ZSBtZWFuaW5nLlxuICpcbiAqIEByZXR1cm5zIHtJbmRlbnRlcn1cbiAqL1xuY29uc3QgbWFrZU5vSW5kZW50ZXI9KCk9PntcbmNvbnN0IHN0cmluZ3M9W107XG5yZXR1cm4gaGFyZGVuKHtcbm9wZW46KG9wZW5CcmFja2V0KT0+c3RyaW5ncy5wdXNoKG9wZW5CcmFja2V0KSxcbmxpbmU6KCk9PnN0cmluZ3MubGVuZ3RoLFxubmV4dDoodG9rZW4pPT57XG5pZihzdHJpbmdzLmxlbmd0aD49MSl7XG5jb25zdCBsYXN0PXN0cmluZ3Nbc3RyaW5ncy5sZW5ndGgtMV07XG5pZihsYXN0Lmxlbmd0aD49MSYmdG9rZW4ubGVuZ3RoPj0xKXtcbmNvbnN0IHBhaXI9IGAke2xhc3RbbGFzdC5sZW5ndGgtMV19JHt0b2tlblswXX1gO1xuaWYoYmFkUGFpclBhdHRlcm4udGVzdChwYWlyKSl7XG5zdHJpbmdzLnB1c2goJyAnKTtcbiB9XG4gfVxuIH1cbnJldHVybiBzdHJpbmdzLnB1c2godG9rZW4pO1xuIH0sXG5jbG9zZTooY2xvc2VCcmFja2V0KT0+e1xuaWYoc3RyaW5ncy5sZW5ndGg+PTEmJnN0cmluZ3Nbc3RyaW5ncy5sZW5ndGgtMV09PT0nLCcpe1xuc3RyaW5ncy5wb3AoKTtcbiB9XG5yZXR1cm4gc3RyaW5ncy5wdXNoKGNsb3NlQnJhY2tldCk7XG4gfSxcbmRvbmU6KCk9PnN0cmluZ3Muam9pbignJyl9KTtcblxuIH07XG5cbmNvbnN0IGlkZW50UGF0dGVybj0vXlthLXpBLVpdXFx3KiQvO1xuXG4vKipcbiAqIEBwYXJhbSB7RW5jb2Rpbmd9IGVuY29kaW5nXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBzaG91bGRJbmRlbnRcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IGRlY29kZVRvSnVzdGluPShlbmNvZGluZyxzaG91bGRJbmRlbnQ9ZmFsc2UpPT57XG4vKipcbiAqIFRoZSBmaXJzdCBwYXNzIGRvZXMgc29tZSBpbnB1dCB2YWxpZGF0aW9uLlxuICogSXRzIGNvbnRyb2wgZmxvdyBzaG91bGQgbWlycm9yIGByZWN1cmAgYXMgY2xvc2VseSBhcyBwb3NzaWJsZVxuICogYW5kIHRoZSB0d28gc2hvdWxkIGJlIG1haW50YWluZWQgdG9nZXRoZXIuIFRoZXkgbXVzdCB2aXNpdCBldmVyeXRoaW5nXG4gKiBpbiB0aGUgc2FtZSBvcmRlci5cbiAqXG4gKiBUT0RPIG5vdyB0aGF0IGliaWRzIGFyZSBnb25lLCB3ZSBzaG91bGQgZm9sZCB0aGlzIGJhY2sgdG9nZXRoZXIgaW50b1xuICogb25lIHZhbGlkYXRpbmcgcGFzcy5cbiAqXG4gKiBAcGFyYW0ge0VuY29kaW5nfSByYXdUcmVlXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuY29uc3QgcHJlcGFyZT0ocmF3VHJlZSk9PntcbmlmKCFpc09iamVjdChyYXdUcmVlKSl7XG5yZXR1cm47XG4gfVxuLyogQXNzZXJ0aW9ucyBvZiB0aGUgYWJvdmUgdG8gbmFycm93IHRoZSB0eXBlLiovXG5hc3NlcnQudHlwZW9mKHJhd1RyZWUsJ29iamVjdCcpO1xuYXNzZXJ0KHJhd1RyZWUhPT1udWxsKTtcbmlmKFFDTEFTUyBpbiByYXdUcmVlKXtcbmNvbnN0IHFjbGFzcz1yYXdUcmVlW1FDTEFTU107XG5hc3NlcnQudHlwZW9mKFxucWNsYXNzLFxuJ3N0cmluZycsXG5YIGBpbnZhbGlkIHFjbGFzcyB0eXBlb2YgJHtxKHR5cGVvZiBxY2xhc3MpfWApO1xuXG5hc3NlcnQoIWlzQXJyYXkocmF3VHJlZSkpO1xuc3dpdGNoKHJhd1RyZWVbJ0BxY2xhc3MnXSl7XG5jYXNlJ3VuZGVmaW5lZCc6XG5jYXNlJ05hTic6XG5jYXNlJ0luZmluaXR5JzpcbmNhc2UnLUluZmluaXR5Jzp7XG5yZXR1cm47XG4gfVxuY2FzZSdiaWdpbnQnOntcbmNvbnN0e2RpZ2l0c309cmF3VHJlZTtcbmFzc2VydC50eXBlb2YoXG5kaWdpdHMsXG4nc3RyaW5nJyxcblggYGludmFsaWQgZGlnaXRzIHR5cGVvZiAke3EodHlwZW9mIGRpZ2l0cyl9YCk7XG5cbnJldHVybjtcbiB9XG5jYXNlJ0BAYXN5bmNJdGVyYXRvcic6e1xucmV0dXJuO1xuIH1cbmNhc2Unc3ltYm9sJzp7XG5jb25zdHtuYW1lfT1yYXdUcmVlO1xuY29uc3Qgc3ltPXBhc3NhYmxlU3ltYm9sRm9yTmFtZShuYW1lKTtcbmFzc2VydC50eXBlb2Yoc3ltLCdzeW1ib2wnKTtcbnJldHVybjtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xuY29uc3R7dGFnLHBheWxvYWR9PXJhd1RyZWU7XG5hc3NlcnQudHlwZW9mKHRhZywnc3RyaW5nJyk7XG5wcmVwYXJlKHBheWxvYWQpO1xucmV0dXJuO1xuIH1cbmNhc2Unc2xvdCc6e1xuY29uc3R7aW5kZXgsaWZhY2V9PXJhd1RyZWU7XG5hc3NlcnQudHlwZW9mKGluZGV4LCdudW1iZXInKTtcbk5hdChpbmRleCk7XG5pZihpZmFjZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnQudHlwZW9mKGlmYWNlLCdzdHJpbmcnKTtcbiB9XG5yZXR1cm47XG4gfVxuY2FzZSdoaWxiZXJ0Jzp7XG5jb25zdHtvcmlnaW5hbCxyZXN0fT1yYXdUcmVlO1xuJ29yaWdpbmFsJ2luIHJhd1RyZWV8fFxuRmFpbCBgSW52YWxpZCBIaWxiZXJ0IEhvdGVsIGVuY29kaW5nICR7cmF3VHJlZX1gO1xucHJlcGFyZShvcmlnaW5hbCk7XG5pZigncmVzdCdpbiByYXdUcmVlKXtcbmFzc2VydC50eXBlb2YoXG5yZXN0LFxuJ29iamVjdCcsXG5YIGBSZXN0ICR7cmVzdH0gZW5jb2RpbmcgbXVzdCBiZSBhbiBvYmplY3RgKTtcblxuaWYocmVzdD09PW51bGwpe1xudGhyb3cgRmFpbCBgUmVzdCAke3Jlc3R9IGVuY29kaW5nIG11c3Qgbm90IGJlIG51bGxgO1xuIH1cbiFpc0FycmF5KHJlc3QpfHxGYWlsIGBSZXN0ICR7cmVzdH0gZW5jb2RpbmcgbXVzdCBub3QgYmUgYW4gYXJyYXlgO1xuIShRQ0xBU1MgaW4gcmVzdCl8fFxuRmFpbCBgUmVzdCBlbmNvZGluZyAke3Jlc3R9IG11c3Qgbm90IGNvbnRhaW4gJHtxKFFDTEFTUyl9YDtcbmNvbnN0IG5hbWVzPW93bktleXMocmVzdCk7XG5mb3IoY29uc3QgbmFtZSBvZiBuYW1lcyl7XG5hc3NlcnQudHlwZW9mKFxubmFtZSxcbidzdHJpbmcnLFxuWCBgUHJvcGVydHkgbmFtZSAke25hbWV9IG9mICR7cmF3VHJlZX0gbXVzdCBiZSBhIHN0cmluZ2ApO1xuXG5wcmVwYXJlKHJlc3RbbmFtZV0pO1xuIH1cbiB9XG5yZXR1cm47XG4gfVxuY2FzZSdlcnJvcic6e1xuY29uc3R7bmFtZSxtZXNzYWdlfT1yYXdUcmVlO1xuYXNzZXJ0LnR5cGVvZihcbm5hbWUsXG4nc3RyaW5nJyxcblggYGludmFsaWQgZXJyb3IgbmFtZSB0eXBlb2YgJHtxKHR5cGVvZiBuYW1lKX1gKTtcblxuZ2V0RXJyb3JDb25zdHJ1Y3RvcihuYW1lKSE9PXVuZGVmaW5lZHx8XG5GYWlsIGBNdXN0IGJlIHRoZSBuYW1lIG9mIGFuIEVycm9yIGNvbnN0cnVjdG9yICR7bmFtZX1gO1xuYXNzZXJ0LnR5cGVvZihcbm1lc3NhZ2UsXG4nc3RyaW5nJyxcblggYGludmFsaWQgZXJyb3IgbWVzc2FnZSB0eXBlb2YgJHtxKHR5cGVvZiBtZXNzYWdlKX1gKTtcblxucmV0dXJuO1xuIH1cblxuZGVmYXVsdDp7XG5hc3NlcnQuZmFpbChYIGB1bnJlY29nbml6ZWQgJHtxKFFDTEFTUyl9ICR7cShxY2xhc3MpfWAsVHlwZUVycm9yKTtcbiB9fVxuXG4gfWVsc2UgaWYoaXNBcnJheShyYXdUcmVlKSl7XG5jb25zdHtsZW5ndGh9PXJhd1RyZWU7XG5mb3IobGV0IGk9MDtpPGxlbmd0aDtpKz0xKXtcbnByZXBhcmUocmF3VHJlZVtpXSk7XG4gfVxuIH1lbHNle1xuY29uc3QgbmFtZXM9b3duS2V5cyhyYXdUcmVlKTtcbmZvcihjb25zdCBuYW1lIG9mIG5hbWVzKXtcbmFzc2VydC50eXBlb2YoXG5uYW1lLFxuJ3N0cmluZycsXG5YIGBQcm9wZXJ0eSBuYW1lICR7bmFtZX0gb2YgJHtyYXdUcmVlfSBtdXN0IGJlIGEgc3RyaW5nYCk7XG5cbnByZXBhcmUocmF3VHJlZVtuYW1lXSk7XG4gfVxuIH1cbiB9O1xuXG5jb25zdCBtYWtlSW5kZW50ZXI9c2hvdWxkSW5kZW50P21ha2VZZXNJbmRlbnRlcjptYWtlTm9JbmRlbnRlcjtcbmNvbnN0IG91dD1tYWtlSW5kZW50ZXIoKTtcblxuLyoqXG4gKiBUaGlzIGlzIHRoZSBzZWNvbmQgcGFzcyByZWN1cnNpb24gYWZ0ZXIgdGhlIGZpcnN0IHBhc3MgYHByZXBhcmVgLlxuICogVGhlIGZpcnN0IHBhc3MgZGlkIHNvbWUgaW5wdXQgdmFsaWRhdGlvbiBzb1xuICogaGVyZSB3ZSBjYW4gc2FmZWx5IGFzc3VtZSBldmVyeXRoaW5nIHRob3NlIHRoaW5ncyBhcmUgdmFsaWRhdGVkLlxuICpcbiAqIEBwYXJhbSB7RW5jb2Rpbmd9IHJhd1RyZWVcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmNvbnN0IGRlY29kZT0ocmF3VHJlZSk9Pntcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5yZXR1cm4gcmVjdXIocmF3VHJlZSk7XG4gfTtcblxuY29uc3QgZGVjb2RlUHJvcGVydHk9KG5hbWUsdmFsdWUpPT57XG5vdXQubGluZSgpO1xuaWYobmFtZT09PSdfX3Byb3RvX18nKXtcbi8qIEphdmFTY3JpcHQgaW50ZXJwcmV0cyBge19fcHJvdG9fXzogeCwgLi4ufWAqL1xuLyogYXMgbWFraW5nIGFuIG9iamVjdCBpbmhlcml0aW5nIGZyb20gYHhgLCB3aGVyZWFzKi9cbi8qIGluIEpTT04gaXQgaXMgc2ltcGx5IGEgcHJvcGVydHkgbmFtZS4gUHJlc2VydmUgdGhlKi9cbi8qIEpTT04gbWVhbmluZy4qL1xub3V0Lm5leHQoIGBbXCJfX3Byb3RvX19cIl06YCk7XG4gfWVsc2UgaWYoaWRlbnRQYXR0ZXJuLnRlc3QobmFtZSkpe1xub3V0Lm5leHQoIGAke25hbWV9OmApO1xuIH1lbHNle1xub3V0Lm5leHQoIGAke3F1b3RlKG5hbWUpfTpgKTtcbiB9XG5kZWNvZGUodmFsdWUpO1xub3V0Lm5leHQoJywnKTtcbiB9O1xuXG4vKipcbiAqIE1vZGVsZWQgYWZ0ZXIgYGZ1bGxSZXZpdmVgIGluIG1hcnNoYWwuanNcbiAqXG4gKiBAcGFyYW0ge0VuY29kaW5nfSByYXdUcmVlXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5jb25zdCByZWN1cj0ocmF3VHJlZSk9PntcbmlmKCFpc09iamVjdChyYXdUcmVlKSl7XG4vKiBwcmltaXRpdmVzIGdldCBxdW90ZWQqL1xucmV0dXJuIG91dC5uZXh0KHF1b3RlKHJhd1RyZWUpKTtcbiB9XG4vKiBBc3NlcnRpb25zIG9mIHRoZSBhYm92ZSB0byBuYXJyb3cgdGhlIHR5cGUuKi9cbmFzc2VydC50eXBlb2YocmF3VHJlZSwnb2JqZWN0Jyk7XG5hc3NlcnQocmF3VHJlZSE9PW51bGwpO1xuaWYoUUNMQVNTIGluIHJhd1RyZWUpe1xuY29uc3QgcWNsYXNzPXJhd1RyZWVbUUNMQVNTXTtcbmFzc2VydC50eXBlb2YocWNsYXNzLCdzdHJpbmcnKTtcbmFzc2VydCghaXNBcnJheShyYXdUcmVlKSk7XG4vKiBTd2l0Y2hpbmcgb24gYGVuY29kZWRbUUNMQVNTXWAgKG9yIGFueXRoaW5nIGxlc3MgZGlyZWN0LCBsaWtlKi9cbi8qIGBxY2xhc3NgKSBkb2VzIG5vdCBkaXNjcmltaW5hdGUgcmF3VHJlZSBpbiB0eXBlc2NyaXB0QDQuMi4zIGFuZCovXG4vKiBlYXJsaWVyLiovXG5zd2l0Y2gocmF3VHJlZVsnQHFjbGFzcyddKXtcbi8qIEVuY29kaW5nIG9mIHByaW1pdGl2ZXMgbm90IGhhbmRsZWQgYnkgSlNPTiovXG5jYXNlJ3VuZGVmaW5lZCc6XG5jYXNlJ05hTic6XG5jYXNlJ0luZmluaXR5JzpcbmNhc2UnLUluZmluaXR5Jzp7XG4vKiBUaGVpciBxY2xhc3MgaXMgdGhlaXIgZXhwcmVzc2lvbiBzb3VyY2UuKi9cbnJldHVybiBvdXQubmV4dChxY2xhc3MpO1xuIH1cbmNhc2UnYmlnaW50Jzp7XG5jb25zdHtkaWdpdHN9PXJhd1RyZWU7XG5yZXR1cm4gb3V0Lm5leHQoIGAke0JpZ0ludChkaWdpdHMpfW5gKTtcbiB9XG5jYXNlJ0BAYXN5bmNJdGVyYXRvcic6e1xuLyogVE9ETyBkZXByZWNhdGVkLiBFdmVudHVhbGx5IHJlbW92ZS4qL1xucmV0dXJuIG91dC5uZXh0KCdTeW1ib2wuYXN5bmNJdGVyYXRvcicpO1xuIH1cbmNhc2Unc3ltYm9sJzp7XG5jb25zdHtuYW1lfT1yYXdUcmVlO1xuY29uc3Qgc3ltPXBhc3NhYmxlU3ltYm9sRm9yTmFtZShuYW1lKTtcbmFzc2VydC50eXBlb2Yoc3ltLCdzeW1ib2wnKTtcbmNvbnN0IHJlZ2lzdGVyZWROYW1lPVN5bWJvbC5rZXlGb3Ioc3ltKTtcbmlmKHJlZ2lzdGVyZWROYW1lPT09dW5kZWZpbmVkKXtcbmNvbnN0IG1hdGNoPUF0QXRQcmVmaXhQYXR0ZXJuLmV4ZWMobmFtZSk7XG5hc3NlcnQobWF0Y2ghPT1udWxsKTtcbmNvbnN0IHN1ZmZpeD1tYXRjaFsxXTtcbmFzc2VydChTeW1ib2xbc3VmZml4XT09PXN5bSk7XG5hc3NlcnQoaWRlbnRQYXR0ZXJuLnRlc3Qoc3VmZml4KSk7XG5yZXR1cm4gb3V0Lm5leHQoIGBTeW1ib2wuJHtzdWZmaXh9YCk7XG4gfVxucmV0dXJuIG91dC5uZXh0KCBgU3ltYm9sLmZvcigke3F1b3RlKHJlZ2lzdGVyZWROYW1lKX0pYCk7XG4gfVxuY2FzZSd0YWdnZWQnOntcbmNvbnN0e3RhZyxwYXlsb2FkfT1yYXdUcmVlO1xub3V0Lm5leHQoIGBtYWtlVGFnZ2VkKCR7cXVvdGUodGFnKX0sYCk7XG5kZWNvZGUocGF5bG9hZCk7XG5yZXR1cm4gb3V0Lm5leHQoJyknKTtcbiB9XG5cbmNhc2Unc2xvdCc6e1xubGV0e2luZGV4LGlmYWNlfT1yYXdUcmVlO1xuaW5kZXg9TnVtYmVyKE5hdChpbmRleCkpO1xuaWYoaWZhY2U9PT11bmRlZmluZWQpe1xucmV0dXJuIG91dC5uZXh0KCBgc2xvdCgke2luZGV4fSlgKTtcbiB9ZWxzZXtcbmlmYWNlPXF1b3RlKGlmYWNlKTtcbnJldHVybiBvdXQubmV4dCggYHNsb3QoJHtpbmRleH0sJHtpZmFjZX0pYCk7XG4gfVxuIH1cblxuY2FzZSdoaWxiZXJ0Jzp7XG5jb25zdHtvcmlnaW5hbCxyZXN0fT1yYXdUcmVlO1xub3V0Lm9wZW4oJ3snKTtcbmRlY29kZVByb3BlcnR5KFFDTEFTUyxvcmlnaW5hbCk7XG5pZigncmVzdCdpbiByYXdUcmVlKXtcbmFzc2VydC50eXBlb2YocmVzdCwnb2JqZWN0Jyk7XG5hc3NlcnQocmVzdCE9PW51bGwpO1xuY29uc3QgbmFtZXM9b3duS2V5cyhyZXN0KTtcbmZvcihjb25zdCBuYW1lIG9mIG5hbWVzKXtcbmFzc2VydC50eXBlb2YoXG5uYW1lLFxuJ3N0cmluZycsXG5YIGBQcm9wZXJ0eSBuYW1lICR7bmFtZX0gb2YgJHtyZXN0fSBtdXN0IGJlIGEgc3RyaW5nYCk7XG5cbmRlY29kZVByb3BlcnR5KG5hbWUscmVzdFtuYW1lXSk7XG4gfVxuIH1cbnJldHVybiBvdXQuY2xvc2UoJ30nKTtcbiB9XG5cbmNhc2UnZXJyb3InOntcbmNvbnN0e25hbWUsbWVzc2FnZX09cmF3VHJlZTtcbnJldHVybiBvdXQubmV4dCggYCR7bmFtZX0oJHtxdW90ZShtZXNzYWdlKX0pYCk7XG4gfVxuXG5kZWZhdWx0OntcbmFzc2VydC5mYWlsKFggYHVucmVjb2duaXplZCAke3EoUUNMQVNTKX0gJHtxKHFjbGFzcyl9YCxUeXBlRXJyb3IpO1xuIH19XG5cbiB9ZWxzZSBpZihpc0FycmF5KHJhd1RyZWUpKXtcbmNvbnN0e2xlbmd0aH09cmF3VHJlZTtcbmlmKGxlbmd0aD09PTApe1xucmV0dXJuIG91dC5uZXh0KCdbXScpO1xuIH1lbHNle1xub3V0Lm9wZW4oJ1snKTtcbmZvcihsZXQgaT0wO2k8bGVuZ3RoO2krPTEpe1xub3V0LmxpbmUoKTtcbmRlY29kZShyYXdUcmVlW2ldKTtcbm91dC5uZXh0KCcsJyk7XG4gfVxucmV0dXJuIG91dC5jbG9zZSgnXScpO1xuIH1cbiB9ZWxzZXtcbi8qIHJhd1RyZWUgaXMgYW4gYEVuY29kaW5nUmVjb3JkYCB3aGljaCBvbmx5IGhhcyBzdHJpbmcga2V5cywqL1xuLyogYnV0IHNpbmNlIG93bktleXMgaXMgbm90IGdlbmVyaWMsIGl0IGNhbid0IHByb3BhZ2F0ZSB0aGF0Ki9cbmNvbnN0IG5hbWVzPS8qKiBAdHlwZSB7c3RyaW5nW119ICovb3duS2V5cyhyYXdUcmVlKTtcbmlmKG5hbWVzLmxlbmd0aD09PTApe1xucmV0dXJuIG91dC5uZXh0KCd7fScpO1xuIH1lbHNle1xub3V0Lm9wZW4oJ3snKTtcbmZvcihjb25zdCBuYW1lIG9mIG5hbWVzKXtcbmRlY29kZVByb3BlcnR5KG5hbWUscmF3VHJlZVtuYW1lXSk7XG4gfVxucmV0dXJuIG91dC5jbG9zZSgnfScpO1xuIH1cbiB9XG4gfTtcbnByZXBhcmUoZW5jb2RpbmcpO1xuZGVjb2RlKGVuY29kaW5nKTtcbnJldHVybiBvdXQuZG9uZSgpO1xuIH07JGjigI1fb25jZS5kZWNvZGVUb0p1c3RpbihkZWNvZGVUb0p1c3Rpbik7XG5oYXJkZW4oZGVjb2RlVG9KdXN0aW4pO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlY29kZVRvSnVzdGluIjpbImRlY29kZVRvSnVzdGluIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADLXk0XDBgAAwwYAAC0AAABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanN7ImltcG9ydHMiOlsiLi9tYXJzaGFsLmpzIl0sImV4cG9ydHMiOlsicGFyc2UiLCJzdHJpbmdpZnkiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgbWFrZU1hcnNoYWw7JGjigI1faW1wb3J0cyhbW1wiLi9tYXJzaGFsLmpzXCIsIFtbXCJtYWtlTWFyc2hhbFwiLCBbJGjigI1fYSA9PiAobWFrZU1hcnNoYWwgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUGFzc2FibGV9IFBhc3NhYmxlICovXG5cbmNvbnN0e0ZhaWx9PWFzc2VydDtcblxuLyoqIEB0eXBlIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQ29udmVydFZhbFRvU2xvdDxhbnk+fSAqL1xuY29uc3QgZG9Ob3RDb252ZXJ0VmFsVG9TbG90PSh2YWwpPT5cbkZhaWwgYE1hcnNoYWwncyBzdHJpbmdpZnkgcmVqZWN0cyBwcmVzZW5jZXMgYW5kIHByb21pc2VzICR7dmFsfWA7XG5cbi8qKiBAdHlwZSB7WGltcG9ydCgnLi90eXBlcy5qcycpLkNvbnZlcnRTbG90VG9WYWw8YW55Pn0gKi9cbmNvbnN0IGRvTm90Q29udmVydFNsb3RUb1ZhbD0oc2xvdCxfaWZhY2UpPT5cbkZhaWwgYE1hcnNoYWwncyBwYXJzZSBtdXN0IG5vdCBlbmNvZGUgYW55IHNsb3RzICR7c2xvdH1gO1xuXG5jb25zdCBiYWRBcnJheUhhbmRsZXI9aGFyZGVuKHtcbmdldDooX3RhcmdldCxuYW1lLF9yZWNlaXZlcik9PntcbmlmKG5hbWU9PT0nbGVuZ3RoJyl7XG5yZXR1cm4gMDtcbiB9XG4vKiBgdGhyb3dgIGlzIG5vb3Agc2luY2UgYEZhaWxgIHRocm93cy4gQnV0IGxpbnRlciBjb25mdXNlZCovXG50aHJvdyBGYWlsIGBNYXJzaGFsJ3MgcGFyc2UgbXVzdCBub3QgZW5jb2RlIGFueSBzbG90IHBvc2l0aW9ucyAke25hbWV9YDtcbiB9fSk7XG5cblxuY29uc3QgYmFkQXJyYXk9aGFyZGVuKG5ldyBQcm94eShoYXJkZW4oW10pLGJhZEFycmF5SGFuZGxlcikpO1xuXG5jb25zdHtzZXJpYWxpemUsdW5zZXJpYWxpemV9PW1ha2VNYXJzaGFsKFxuZG9Ob3RDb252ZXJ0VmFsVG9TbG90LFxuZG9Ob3RDb252ZXJ0U2xvdFRvVmFsLFxue1xuZXJyb3JUYWdnaW5nOidvZmYnLFxuLyogVE9ETyBmaXggdGVzdHMgdG8gd29ya3Mgd2l0aCBzbWFsbGNhcHMuKi9cbnNlcmlhbGl6ZUJvZHlGb3JtYXQ6J2NhcGRhdGEnfSk7XG5cblxuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHZhbFxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3Qgc3RyaW5naWZ5PSh2YWwpPT5zZXJpYWxpemUodmFsKS5ib2R5OyRo4oCNX29uY2Uuc3RyaW5naWZ5KHN0cmluZ2lmeSk7XG5oYXJkZW4oc3RyaW5naWZ5KTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gKiBAcmV0dXJucyB7UGFzc2FibGV9XG4gKi9cbmNvbnN0IHBhcnNlPShzdHIpPT5cbnVuc2VyaWFsaXplKFxuaGFyZGVuKHtcbmJvZHk6c3RyLFxuc2xvdHM6YmFkQXJyYXl9KSk7JGjigI1fb25jZS5wYXJzZShwYXJzZSk7XG5cblxuaGFyZGVuKHBhcnNlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJzdHJpbmdpZnkiOlsic3RyaW5naWZ5Il0sInBhcnNlIjpbInBhcnNlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGnf3flVMgAAVTIAACMAAABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvbWFyc2hhbC5qc3siaW1wb3J0cyI6WyIuL2VuY29kZVRvQ2FwRGF0YS5qcyIsIi4vZW5jb2RlVG9TbWFsbGNhcHMuanMiLCIuL2hlbHBlcnMvZXJyb3IuanMiLCIuL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanMiLCIuL2hlbHBlcnMvcmVtb3RhYmxlLmpzIiwiLi9wYXNzU3R5bGVPZi5qcyIsIkBlbmRvL25hdCJdLCJleHBvcnRzIjpbIm1ha2VNYXJzaGFsIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IE5hdCxhc3NlcnRQYXNzYWJsZSxnZXRJbnRlcmZhY2VPZixnZXRFcnJvckNvbnN0cnVjdG9yLFFDTEFTUyxtYWtlRW5jb2RlVG9DYXBEYXRhLG1ha2VEZWNvZGVGcm9tQ2FwRGF0YSxtYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyxtYWtlRW5jb2RlVG9TbWFsbGNhcHMsaGFzT3duUHJvcGVydHlPZjskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9uYXRcIiwgW1tcIk5hdFwiLCBbJGjigI1fYSA9PiAoTmF0ID0gJGjigI1fYSldXV1dLFtcIi4vcGFzc1N0eWxlT2YuanNcIiwgW1tcImFzc2VydFBhc3NhYmxlXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXNzYWJsZSA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvcmVtb3RhYmxlLmpzXCIsIFtbXCJnZXRJbnRlcmZhY2VPZlwiLCBbJGjigI1fYSA9PiAoZ2V0SW50ZXJmYWNlT2YgPSAkaOKAjV9hKV1dXV0sW1wiLi9oZWxwZXJzL2Vycm9yLmpzXCIsIFtbXCJnZXRFcnJvckNvbnN0cnVjdG9yXCIsIFskaOKAjV9hID0+IChnZXRFcnJvckNvbnN0cnVjdG9yID0gJGjigI1fYSldXV1dLFtcIi4vZW5jb2RlVG9DYXBEYXRhLmpzXCIsIFtbXCJRQ0xBU1NcIiwgWyRo4oCNX2EgPT4gKFFDTEFTUyA9ICRo4oCNX2EpXV0sW1wibWFrZUVuY29kZVRvQ2FwRGF0YVwiLCBbJGjigI1fYSA9PiAobWFrZUVuY29kZVRvQ2FwRGF0YSA9ICRo4oCNX2EpXV0sW1wibWFrZURlY29kZUZyb21DYXBEYXRhXCIsIFskaOKAjV9hID0+IChtYWtlRGVjb2RlRnJvbUNhcERhdGEgPSAkaOKAjV9hKV1dXV0sW1wiLi9lbmNvZGVUb1NtYWxsY2Fwcy5qc1wiLCBbW1wibWFrZURlY29kZUZyb21TbWFsbGNhcHNcIiwgWyRo4oCNX2EgPT4gKG1ha2VEZWNvZGVGcm9tU21hbGxjYXBzID0gJGjigI1fYSldXSxbXCJtYWtlRW5jb2RlVG9TbWFsbGNhcHNcIiwgWyRo4oCNX2EgPT4gKG1ha2VFbmNvZGVUb1NtYWxsY2FwcyA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImhhc093blByb3BlcnR5T2ZcIiwgWyRo4oCNX2EgPT4gKGhhc093blByb3BlcnR5T2YgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuTWFrZU1hcnNoYWxPcHRpb25zfSBNYWtlTWFyc2hhbE9wdGlvbnMgKi9cbi8qKiBAdGVtcGxhdGUgU2xvdCBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkNvbnZlcnRTbG90VG9WYWw8U2xvdD59IENvbnZlcnRTbG90VG9WYWwgKi9cbi8qKiBAdGVtcGxhdGUgU2xvdCBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkNvbnZlcnRWYWxUb1Nsb3Q8U2xvdD59IENvbnZlcnRWYWxUb1Nsb3QgKi9cbi8qKiBAdGVtcGxhdGUgU2xvdCBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlNlcmlhbGl6ZTxTbG90Pn0gU2VyaWFsaXplICovXG4vKiogQHRlbXBsYXRlIFNsb3QgQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5VbnNlcmlhbGl6ZTxTbG90Pn0gVW5zZXJpYWxpemUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlBhc3NhYmxlfSBQYXNzYWJsZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuSW50ZXJmYWNlU3BlY30gSW50ZXJmYWNlU3BlYyAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuRW5jb2Rpbmd9IEVuY29kaW5nICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5SZW1vdGFibGV9IFJlbW90YWJsZSAqL1xuXG5jb25zdHtpc0FycmF5fT1BcnJheTtcbmNvbnN0e2RldGFpbHM6WCxGYWlsLHF1b3RlOnF9PWFzc2VydDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5cbi8qKiBAdHlwZSB7Q29udmVydFZhbFRvU2xvdDxhbnk+fSAqL1xuY29uc3QgZGVmYXVsdFZhbFRvU2xvdEZuPSh4KT0+eDtcbi8qKiBAdHlwZSB7Q29udmVydFNsb3RUb1ZhbDxhbnk+fSAqL1xuY29uc3QgZGVmYXVsdFNsb3RUb1ZhbEZuPSh4LF8pPT54O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBTbG90XG4gKiBAcGFyYW0ge0NvbnZlcnRWYWxUb1Nsb3Q8U2xvdD59IFtjb252ZXJ0VmFsVG9TbG90XVxuICogQHBhcmFtIHtDb252ZXJ0U2xvdFRvVmFsPFNsb3Q+fSBbY29udmVydFNsb3RUb1ZhbF1cbiAqIEBwYXJhbSB7TWFrZU1hcnNoYWxPcHRpb25zfSBvcHRpb25zXG4gKi9cbmNvbnN0ICAgICAgICBtYWtlTWFyc2hhbD0oXG5jb252ZXJ0VmFsVG9TbG90PWRlZmF1bHRWYWxUb1Nsb3RGbixcbmNvbnZlcnRTbG90VG9WYWw9ZGVmYXVsdFNsb3RUb1ZhbEZuLFxue1xuZXJyb3JUYWdnaW5nPSdvbicsXG5tYXJzaGFsTmFtZT0nYW5vbi1tYXJzaGFsJyxcbi8qIFRPRE8gVGVtcG9yYXJ5IGhhY2suKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzI3ODAqL1xuZXJyb3JJZE51bT0xMDAwMCxcbi8qIFdlIHByZWZlciB0aGF0IHRoZSBjYWxsZXIgaW5zdGVhZCBsb2cgdG8gc29tZXdoZXJlIGhpZGRlbiovXG4vKiB0byBiZSByZXZlYWxlZCB3aGVuIGNvcnJlbGF0aW5nIHdpdGggdGhlIHJlY2VpdmVkIGVycm9yLiovXG5tYXJzaGFsU2F2ZUVycm9yPShlcnIpPT5cbmNvbnNvbGUubG9nKCdUZW1wb3JhcnkgbG9nZ2luZyBvZiBzZW50IGVycm9yJyxlcnIpLFxuLyogRGVmYXVsdCB0byAnY2FwZGF0YScgYmVjYXVzZSBpdCB3YXMgaW1wbGVtZW50ZWQgZmlyc3QuKi9cbi8qIFNvbWV0aW1lcywgb250b2dlbnkgZG9lcyByZWNhcGl0dWxhdGUgcGh5bG9nZW55IDspKi9cbnNlcmlhbGl6ZUJvZHlGb3JtYXQ9J2NhcGRhdGEnfT1cbnt9KT0+XG57XG5hc3NlcnQudHlwZW9mKG1hcnNoYWxOYW1lLCdzdHJpbmcnKTtcbmVycm9yVGFnZ2luZz09PSdvbid8fFxuZXJyb3JUYWdnaW5nPT09J29mZid8fFxuRmFpbCBgVGhlIGVycm9yVGFnZ2luZyBvcHRpb24gY2FuIG9ubHkgYmUgXCJvblwiIG9yIFwib2ZmXCIgJHtlcnJvclRhZ2dpbmd9YDtcbmNvbnN0IG5leHRFcnJvcklkPSgpPT57XG5lcnJvcklkTnVtKz0xO1xucmV0dXJuIGBlcnJvcjoke21hcnNoYWxOYW1lfSMke2Vycm9ySWROdW19YDtcbiB9O1xuXG4vKipcbiAqIEB0eXBlIHtTZXJpYWxpemU8U2xvdD59XG4gKi9cbmNvbnN0IHNlcmlhbGl6ZT0ocm9vdCk9PntcbmNvbnN0IHNsb3RzPVtdO1xuLyogbWFwcyB2YWwgKHByb21pc2Ugb3IgcmVtb3RhYmxlKSB0byBpbmRleCBvZiBzbG90c1tdKi9cbmNvbnN0IHNsb3RNYXA9bmV3IE1hcCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7UmVtb3RhYmxlIHwgUHJvbWlzZX0gcGFzc2FibGVcbiAqIEByZXR1cm5zIHt7aW5kZXg6IG51bWJlciwgcmVwZWF0OiBib29sZWFufX1cbiAqL1xuY29uc3QgZW5jb2RlU2xvdENvbW1vbj0ocGFzc2FibGUpPT57XG5sZXQgaW5kZXg9c2xvdE1hcC5nZXQocGFzc2FibGUpO1xuaWYoaW5kZXghPT11bmRlZmluZWQpe1xuLyogVE9ETyBhc3NlcnQgdGhhdCBpdCdzIHRoZSBzYW1lIGlmYWNlIGFzIGJlZm9yZSovXG5hc3NlcnQudHlwZW9mKGluZGV4LCdudW1iZXInKTtcbnJldHVybiBoYXJkZW4oe2luZGV4LHJlcGVhdDp0cnVlfSk7XG4gfVxuXG5pbmRleD1zbG90cy5sZW5ndGg7XG5jb25zdCBzbG90PWNvbnZlcnRWYWxUb1Nsb3QocGFzc2FibGUpO1xuc2xvdHMucHVzaChzbG90KTtcbnNsb3RNYXAuc2V0KHBhc3NhYmxlLGluZGV4KTtcbnJldHVybiBoYXJkZW4oe2luZGV4LHJlcGVhdDpmYWxzZX0pO1xuIH07XG5cbi8qKlxuICogRXZlbiBpZiBhbiBFcnJvciBpcyBub3QgYWN0dWFsbHkgcGFzc2FibGUsIHdlJ2QgcmF0aGVyIHNlbmRcbiAqIGl0IGFueXdheSBiZWNhdXNlIHRoZSBkaWFnbm9zdGljIGluZm8gY2FycmllZCBieSB0aGUgZXJyb3JcbiAqIGlzIG1vcmUgdmFsdWFibGUgdGhhbiBkaWFnbm9zaW5nIHdoeSB0aGUgZXJyb3IgaXNuJ3RcbiAqIHBhc3NhYmxlLiBTZWUgY29tbWVudHMgaW4gRXJyb3JIZWxwZXIuXG4gKlxuICogQHBhcmFtIHtFcnJvcn0gZXJyXG4gKiBAcGFyYW0geyhwOiBQYXNzYWJsZSkgPT4gdW5rbm93bn0gZW5jb2RlUmVjdXJcbiAqIEByZXR1cm5zIHt7ZXJyb3JJZD86IHN0cmluZywgbWVzc2FnZTogc3RyaW5nLCBuYW1lOiBzdHJpbmd9fVxuICovXG5jb25zdCBlbmNvZGVFcnJvckNvbW1vbj0oZXJyLGVuY29kZVJlY3VyKT0+e1xuY29uc3QgbWVzc2FnZT1lbmNvZGVSZWN1ciggYCR7ZXJyLm1lc3NhZ2V9YCk7XG5hc3NlcnQudHlwZW9mKG1lc3NhZ2UsJ3N0cmluZycpO1xuY29uc3QgbmFtZT1lbmNvZGVSZWN1ciggYCR7ZXJyLm5hbWV9YCk7XG5hc3NlcnQudHlwZW9mKG5hbWUsJ3N0cmluZycpO1xuLyogTXVzdCBlbmNvZGUgYGNhdXNlYCwgYGVycm9yc2AuKi9cbi8qIG5lc3RlZCBub24tcGFzc2FibGUgZXJyb3JzIG11c3QgYmUgb2sgZnJvbSBoZXJlLiovXG5pZihlcnJvclRhZ2dpbmc9PT0nb24nKXtcbi8qIFdlIGRlbGliZXJhdGVseSBkbyBub3Qgc2hhcmUgdGhlIHN0YWNrLCBidXQgaXQgd291bGQqL1xuLyogYmUgdXNlZnVsIHRvIGxvZyB0aGUgc3RhY2sgbG9jYWxseSBzbyBzb21lb25lIHdobyBoYXMqL1xuLyogcHJpdmlsZWdlZCBhY2Nlc3MgdG8gdGhlIHRocm93aW5nIFZhdCBjYW4gY29ycmVsYXRlKi9cbi8qIHRoZSBwcm9ibGVtIHdpdGggdGhlIHJlbW90ZSBWYXQgdGhhdCBnZXRzIHRoaXMqL1xuLyogc3VtbWFyeS4gSWYgd2UgZG8gdGhhdCwgd2UgY291bGQgYWxsb2NhdGUgc29tZSByYW5kb20qL1xuLyogaWRlbnRpZmllciBhbmQgaW5jbHVkZSBpdCBpbiB0aGUgbWVzc2FnZSwgdG8gaGVscCovXG4vKiB3aXRoIHRoZSBjb3JyZWxhdGlvbi4qL1xuY29uc3QgZXJyb3JJZD1lbmNvZGVSZWN1cihuZXh0RXJyb3JJZCgpKTtcbmFzc2VydC50eXBlb2YoZXJyb3JJZCwnc3RyaW5nJyk7XG5hc3NlcnQubm90ZShlcnIsWCBgU2VudCBhcyAke2Vycm9ySWR9YCk7XG5tYXJzaGFsU2F2ZUVycm9yKGVycik7XG5yZXR1cm4gaGFyZGVuKHtlcnJvcklkLG1lc3NhZ2UsbmFtZX0pO1xuIH1lbHNle1xucmV0dXJuIGhhcmRlbih7bWVzc2FnZSxuYW1lfSk7XG4gfVxuIH07XG5cbmlmKHNlcmlhbGl6ZUJvZHlGb3JtYXQ9PT0nY2FwZGF0YScpe1xuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBwYXNzYWJsZVxuICogQHBhcmFtIHtJbnRlcmZhY2VTcGVjfSBbaWZhY2VdXG4gKiBAcmV0dXJucyB7RW5jb2Rpbmd9XG4gKi9cbmNvbnN0IGVuY29kZVNsb3RUb0NhcERhdGE9KHBhc3NhYmxlLGlmYWNlPXVuZGVmaW5lZCk9PntcbmNvbnN0e2luZGV4LHJlcGVhdH09ZW5jb2RlU2xvdENvbW1vbihwYXNzYWJsZSk7XG5cbmlmKHJlcGVhdD09PXRydWV8fGlmYWNlPT09dW5kZWZpbmVkKXtcbnJldHVybiBoYXJkZW4oe1tRQ0xBU1NdOidzbG90JyxpbmRleH0pO1xuIH1lbHNle1xucmV0dXJuIGhhcmRlbih7W1FDTEFTU106J3Nsb3QnLGlmYWNlLGluZGV4fSk7XG4gfVxuIH07XG5cbmNvbnN0IGVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YT0odmFsLF9lbmNvZGVSZWN1cik9PlxuZW5jb2RlU2xvdFRvQ2FwRGF0YSh2YWwsZ2V0SW50ZXJmYWNlT2YodmFsKSk7XG5cbmNvbnN0IGVuY29kZVByb21pc2VUb0NhcERhdGE9KHByb21pc2UsX2VuY29kZVJlY3VyKT0+XG5lbmNvZGVTbG90VG9DYXBEYXRhKHByb21pc2UpO1xuXG4vKipcbiAqIEV2ZW4gaWYgYW4gRXJyb3IgaXMgbm90IGFjdHVhbGx5IHBhc3NhYmxlLCB3ZSdkIHJhdGhlciBzZW5kXG4gKiBpdCBhbnl3YXkgYmVjYXVzZSB0aGUgZGlhZ25vc3RpYyBpbmZvIGNhcnJpZWQgYnkgdGhlIGVycm9yXG4gKiBpcyBtb3JlIHZhbHVhYmxlIHRoYW4gZGlhZ25vc2luZyB3aHkgdGhlIGVycm9yIGlzbid0XG4gKiBwYXNzYWJsZS4gU2VlIGNvbW1lbnRzIGluIEVycm9ySGVscGVyLlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IGVyclxuICogQHBhcmFtIHsocDogUGFzc2FibGUpID0+IEVuY29kaW5nfSBlbmNvZGVSZWN1clxuICogQHJldHVybnMge0VuY29kaW5nfVxuICovXG5jb25zdCBlbmNvZGVFcnJvclRvQ2FwRGF0YT0oZXJyLGVuY29kZVJlY3VyKT0+e1xuY29uc3QgZXJyRGF0YT1lbmNvZGVFcnJvckNvbW1vbihlcnIsZW5jb2RlUmVjdXIpO1xucmV0dXJuIGhhcmRlbih7W1FDTEFTU106J2Vycm9yJywuLi5lcnJEYXRhfSk7XG4gfTtcblxuY29uc3QgZW5jb2RlVG9DYXBEYXRhPW1ha2VFbmNvZGVUb0NhcERhdGEoe1xuZW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhLFxuZW5jb2RlUHJvbWlzZVRvQ2FwRGF0YSxcbmVuY29kZUVycm9yVG9DYXBEYXRhfSk7XG5cblxuY29uc3QgZW5jb2RlZD1lbmNvZGVUb0NhcERhdGEocm9vdCk7XG5jb25zdCBib2R5PUpTT04uc3RyaW5naWZ5KGVuY29kZWQpO1xucmV0dXJuIGhhcmRlbih7XG5ib2R5LFxuc2xvdHN9KTtcblxuIH1lbHNlIGlmKHNlcmlhbGl6ZUJvZHlGb3JtYXQ9PT0nc21hbGxjYXBzJyl7XG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcmVmaXhcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHBhc3NhYmxlXG4gKiBAcGFyYW0ge0ludGVyZmFjZVNwZWN9IFtpZmFjZV1cbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IGVuY29kZVNsb3RUb1NtYWxsY2Fwcz0ocHJlZml4LHBhc3NhYmxlLGlmYWNlPXVuZGVmaW5lZCk9PntcbmNvbnN0e2luZGV4LHJlcGVhdH09ZW5jb2RlU2xvdENvbW1vbihwYXNzYWJsZSk7XG5cbi8qIFRPRE8gZXhwbG9yZSByZW1vdmluZyB0aGlzIHNwZWNpYWwgY2FzZSovXG5pZihyZXBlYXQ9PT10cnVlfHxpZmFjZT09PXVuZGVmaW5lZCl7XG5yZXR1cm4gYCR7cHJlZml4fSR7aW5kZXh9YDtcbiB9XG5yZXR1cm4gYCR7cHJlZml4fSR7aW5kZXh9LiR7aWZhY2V9YDtcbiB9O1xuXG5jb25zdCBlbmNvZGVSZW1vdGFibGVUb1NtYWxsY2Fwcz0ocmVtb3RhYmxlLF9lbmNvZGVSZWN1cik9PlxuZW5jb2RlU2xvdFRvU21hbGxjYXBzKCckJyxyZW1vdGFibGUsZ2V0SW50ZXJmYWNlT2YocmVtb3RhYmxlKSk7XG5cbmNvbnN0IGVuY29kZVByb21pc2VUb1NtYWxsY2Fwcz0ocHJvbWlzZSxfZW5jb2RlUmVjdXIpPT5cbmVuY29kZVNsb3RUb1NtYWxsY2FwcygnJicscHJvbWlzZSk7XG5cbmNvbnN0IGVuY29kZUVycm9yVG9TbWFsbGNhcHM9KGVycixlbmNvZGVSZWN1cik9PntcbmNvbnN0IGVyckRhdGE9ZW5jb2RlRXJyb3JDb21tb24oZXJyLGVuY29kZVJlY3VyKTtcbmNvbnN0e21lc3NhZ2UsLi4ucmVzdH09ZXJyRGF0YTtcbnJldHVybiBoYXJkZW4oeycjZXJyb3InOm1lc3NhZ2UsLi4ucmVzdH0pO1xuIH07XG5cbmNvbnN0IGVuY29kZVRvU21hbGxjYXBzPW1ha2VFbmNvZGVUb1NtYWxsY2Fwcyh7XG5lbmNvZGVSZW1vdGFibGVUb1NtYWxsY2FwcyxcbmVuY29kZVByb21pc2VUb1NtYWxsY2FwcyxcbmVuY29kZUVycm9yVG9TbWFsbGNhcHN9KTtcblxuXG5jb25zdCBlbmNvZGVkPWVuY29kZVRvU21hbGxjYXBzKHJvb3QpO1xuY29uc3Qgc21hbGxjYXBzQm9keT1KU09OLnN0cmluZ2lmeShlbmNvZGVkKTtcbnJldHVybiBoYXJkZW4oe1xuLyogVmFsaWQgSlNPTiBjYW5ub3QgYmVnaW4gd2l0aCBhICcjJywgc28gdGhpcyBpcyBhIHZhbGlkIHNpZ25hbCovXG4vKiBpbmRpY2F0aW5nIHNtYWxsY2FwcyBmb3JtYXQuKi9cbmJvZHk6IGAjJHtzbWFsbGNhcHNCb2R5fWAsXG5zbG90c30pO1xuXG4gfWVsc2V7XG4vKiBUaGUgYHRocm93YCBpcyBhIG5vb3Agc2luY2UgYEZhaWxgIHRocm93cy4gQWRkZWQgZm9yIGNvbmZ1c2VkIGxpbnRlcnMuKi9cbnRocm93IEZhaWwgYFVucmVjb2duaXplZCBzZXJpYWxpemVCb2R5Rm9ybWF0OiAke3Eoc2VyaWFsaXplQm9keUZvcm1hdCl9YDtcbiB9XG4gfTtcblxuY29uc3QgbWFrZUZ1bGxSZXZpdmU9KHNsb3RzKT0+e1xuLyoqIEB0eXBlIHtNYXA8bnVtYmVyLCBQYXNzYWJsZT59ICovXG5jb25zdCB2YWxNYXA9bmV3IE1hcCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7e2lmYWNlPzogc3RyaW5nLCBpbmRleDogbnVtYmVyfX0gc2xvdERhdGFcbiAqIEByZXR1cm5zIHtSZW1vdGFibGUgfCBQcm9taXNlfVxuICovXG5jb25zdCBkZWNvZGVTbG90Q29tbW9uPShzbG90RGF0YSk9PntcbmNvbnN0e2lmYWNlPXVuZGVmaW5lZCxpbmRleCwuLi5yZXN0fT1zbG90RGF0YTtcbm93bktleXMocmVzdCkubGVuZ3RoPT09MHx8XG5GYWlsIGB1bmV4cGVjdGVkIGVuY29kZWQgc2xvdCBwcm9wZXJ0aWVzICR7cShvd25LZXlzKHJlc3QpKX1gO1xuaWYodmFsTWFwLmhhcyhpbmRleCkpe1xucmV0dXJuIHZhbE1hcC5nZXQoaW5kZXgpO1xuIH1cbi8qIFRPRE8gU0VDVVJJVFkgSEFaQVJEOiBtdXN0IGVuZm9jZSB0aGF0IHJlbW90YWJsZSB2cyBwcm9taXNlKi9cbi8qIGlzIGFjY29yZGluZyB0byB0aGUgZW5jb2RlZCBzdHJpbmcuKi9cbmNvbnN0IHNsb3Q9c2xvdHNbTnVtYmVyKE5hdChpbmRleCkpXTtcbmNvbnN0IHZhbD1jb252ZXJ0U2xvdFRvVmFsKHNsb3QsaWZhY2UpO1xudmFsTWFwLnNldChpbmRleCx2YWwpO1xucmV0dXJuIHZhbDtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7e2Vycm9ySWQ/OiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZywgbmFtZTogc3RyaW5nfX0gZXJyRGF0YVxuICogQHBhcmFtIHsoZTogdW5rbm93bikgPT4gUGFzc2FibGV9IGRlY29kZVJlY3VyXG4gKiBAcmV0dXJucyB7RXJyb3J9XG4gKi9cbmNvbnN0IGRlY29kZUVycm9yQ29tbW9uPShlcnJEYXRhLGRlY29kZVJlY3VyKT0+e1xuY29uc3R7ZXJyb3JJZD11bmRlZmluZWQsbWVzc2FnZSxuYW1lLC4uLnJlc3R9PWVyckRhdGE7XG5vd25LZXlzKHJlc3QpLmxlbmd0aD09PTB8fFxuRmFpbCBgdW5leHBlY3RlZCBlbmNvZGVkIGVycm9yIHByb3BlcnRpZXMgJHtxKG93bktleXMocmVzdCkpfWA7XG4vKiBUT0RPIE11c3QgZGVjb2RlIGBjYXVzZWAgYW5kIGBlcnJvcnNgIHByb3BlcnRpZXMqL1xuLyogY2FwRGF0YSBkb2VzIG5vdCB0cmFuc2Zvcm0gc3RyaW5ncy4gVGhlIGNhbGxzIHRvIGBkZWNvZGVSZWN1cmAqL1xuLyogYXJlIGZvciByZXVzZSBieSBvdGhlciBlbmNvZGluZ3MgdGhhdCBkbywgc3VjaCBhcyBzbWFsbGNhcHMuKi9cbmNvbnN0IGROYW1lPWRlY29kZVJlY3VyKG5hbWUpO1xuY29uc3QgZE1lc3NhZ2U9ZGVjb2RlUmVjdXIobWVzc2FnZSk7XG5jb25zdCBkRXJyb3JJZD1lcnJvcklkJiZkZWNvZGVSZWN1cihlcnJvcklkKTtcbnR5cGVvZiBkTmFtZT09PSdzdHJpbmcnfHxcbkZhaWwgYGludmFsaWQgZXJyb3IgbmFtZSB0eXBlb2YgJHtxKHR5cGVvZiBkTmFtZSl9YDtcbnR5cGVvZiBkTWVzc2FnZT09PSdzdHJpbmcnfHxcbkZhaWwgYGludmFsaWQgZXJyb3IgbWVzc2FnZSB0eXBlb2YgJHtxKHR5cGVvZiBkTWVzc2FnZSl9YDtcbmNvbnN0IEVDPWdldEVycm9yQ29uc3RydWN0b3IoZE5hbWUpfHxFcnJvcjtcbi8qIGVycm9ySWQgaXMgYSBsYXRlIGFkZGl0aW9uIHNvIGJlIHRvbGVyYW50IG9mIGl0cyBhYnNlbmNlLiovXG5jb25zdCBlcnJvck5hbWU9XG5kRXJyb3JJZD09PXVuZGVmaW5lZD9cbiBgUmVtb3RlJHtFQy5uYW1lfWA6XG4gYFJlbW90ZSR7RUMubmFtZX0oJHtkRXJyb3JJZH0pYDtcbmNvbnN0IGVycm9yPWFzc2VydC5lcnJvcihkTWVzc2FnZSxFQyx7ZXJyb3JOYW1lfSk7XG5yZXR1cm4gaGFyZGVuKGVycm9yKTtcbiB9O1xuXG4vKiBUaGUgY3VycmVudCBlbmNvZGluZyBkb2VzIG5vdCBnaXZlIHRoZSBkZWNvZGVyIGVub3VnaCBpbnRvIHRvIGRpc3Rpbmd1aXNoKi9cbi8qIHdoZXRoZXIgYSBzbG90IHJlcHJlc2VudHMgYSBwcm9taXNlIG9yIGEgcmVtb3RhYmxlLiBBcyBhbiBpbXBsZW1lbnRhdGlvbiovXG4vKiByZXN0cmljdGlvbiB1bnRpbCB0aGlzIGlzIGZpeGVkLCBpZiBlaXRoZXIgaXMgcHJvdmlkZWQsIGJvdGggbXVzdCBiZSovXG4vKiBwcm92aWRlZCBhbmQgdGhleSBtdXN0IGJlIHRoZSBzYW1lLiovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80MzM0Ki9cbmNvbnN0IGRlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhPShyYXdUcmVlLF9kZWNvZGVSZWN1cik9PntcbmNvbnN0e1tRQ0xBU1NdOl8sLi4uc2xvdERhdGF9PXJhd1RyZWU7XG5yZXR1cm4gZGVjb2RlU2xvdENvbW1vbihzbG90RGF0YSk7XG4gfTtcblxuY29uc3QgZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YT0ocmF3VHJlZSxkZWNvZGVSZWN1cik9PntcbmNvbnN0e1tRQ0xBU1NdOl8sLi4uZXJyRGF0YX09cmF3VHJlZTtcbnJldHVybiBkZWNvZGVFcnJvckNvbW1vbihlcnJEYXRhLGRlY29kZVJlY3VyKTtcbiB9O1xuXG5jb25zdCByZXZpdmVGcm9tQ2FwRGF0YT1tYWtlRGVjb2RlRnJvbUNhcERhdGEoe1xuZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGE6ZGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGEsXG5kZWNvZGVQcm9taXNlRnJvbUNhcERhdGE6ZGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGEsXG5kZWNvZGVFcnJvckZyb21DYXBEYXRhfSk7XG5cblxuY29uc3QgbWFrZURlY29kZVNsb3RGcm9tU21hbGxjYXBzPShwcmVmaXgpPT57XG5yZXR1cm4oc3RyaW5nRW5jb2RpbmcsX2RlY29kZVJlY3VyKT0+e1xuYXNzZXJ0KHN0cmluZ0VuY29kaW5nLnN0YXJ0c1dpdGgocHJlZml4KSk7XG4vKiBzbG90czogJHNsb3RJbmRleC5pZmFjZSBvciAkc2xvdEluZGV4Ki9cbmNvbnN0IGk9c3RyaW5nRW5jb2RpbmcuaW5kZXhPZignLicpO1xuY29uc3QgaW5kZXg9TnVtYmVyKHN0cmluZ0VuY29kaW5nLnNsaWNlKDEsaTwwP3VuZGVmaW5lZDppKSk7XG4vKiBpIDwgMCBtZWFucyB0aGVyZSB3YXMgbm8gaWZhY2UgaW5jbHVkZWQuKi9cbmNvbnN0IGlmYWNlPWk8MD91bmRlZmluZWQ6c3RyaW5nRW5jb2Rpbmcuc2xpY2UoaSsxKTtcbnJldHVybiBkZWNvZGVTbG90Q29tbW9uKHtpZmFjZSxpbmRleH0pO1xuIH07XG4gfTtcbmNvbnN0IGRlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHM9bWFrZURlY29kZVNsb3RGcm9tU21hbGxjYXBzKCckJyk7XG5jb25zdCBkZWNvZGVQcm9taXNlRnJvbVNtYWxsY2Fwcz1tYWtlRGVjb2RlU2xvdEZyb21TbWFsbGNhcHMoJyYnKTtcblxuY29uc3QgZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzPShlbmNvZGluZyxkZWNvZGVSZWN1cik9PntcbmNvbnN0eycjZXJyb3InOm1lc3NhZ2UsLi4ucmVzdEVyckRhdGF9PWVuY29kaW5nO1xuIWhhc093blByb3BlcnR5T2YocmVzdEVyckRhdGEsJ21lc3NhZ2UnKXx8XG5GYWlsIGB1bmV4cGVjdGVkIGVuY29kZWQgZXJyb3IgcHJvcGVydHkgJHtxKCdtZXNzYWdlJyl9YDtcbnJldHVybiBkZWNvZGVFcnJvckNvbW1vbih7bWVzc2FnZSwuLi5yZXN0RXJyRGF0YX0sZGVjb2RlUmVjdXIpO1xuIH07XG5cbmNvbnN0IHJldml2ZUZyb21TbWFsbGNhcHM9bWFrZURlY29kZUZyb21TbWFsbGNhcHMoe1xuZGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2FwcyxcbmRlY29kZVByb21pc2VGcm9tU21hbGxjYXBzLFxuZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzfSk7XG5cblxucmV0dXJuIGhhcmRlbih7cmV2aXZlRnJvbUNhcERhdGEscmV2aXZlRnJvbVNtYWxsY2Fwc30pO1xuIH07XG5cbi8qKlxuICogQHR5cGUge1Vuc2VyaWFsaXplPFNsb3Q+fVxuICovXG5jb25zdCB1bnNlcmlhbGl6ZT0oZGF0YSk9PntcbmNvbnN0e2JvZHksc2xvdHN9PWRhdGE7XG50eXBlb2YgYm9keT09PSdzdHJpbmcnfHxcbkZhaWwgYHVuc2VyaWFsaXplKCkgZ2l2ZW4gbm9uLWNhcGRhdGEgKC5ib2R5IGlzICR7Ym9keX0sIG5vdCBzdHJpbmcpYDtcbmlzQXJyYXkoZGF0YS5zbG90cyl8fFxuRmFpbCBgdW5zZXJpYWxpemUoKSBnaXZlbiBub24tY2FwZGF0YSAoLnNsb3RzIGFyZSBub3QgQXJyYXkpYDtcbmNvbnN0e3Jldml2ZUZyb21DYXBEYXRhLHJldml2ZUZyb21TbWFsbGNhcHN9PW1ha2VGdWxsUmV2aXZlKHNsb3RzKTtcbmxldCByZXN1bHQ7XG4vKiBKU09OIGNhbm5vdCBiZWdpbiB3aXRoIGEgJyMnLCBzbyB0aGlzIGlzIGFuIHVuYW1iaWd1b3VzIHNpZ25hbC4qL1xuaWYoYm9keS5zdGFydHNXaXRoKCcjJykpe1xuY29uc3Qgc21hbGxjYXBzQm9keT1ib2R5LnNsaWNlKDEpO1xuY29uc3QgZW5jb2Rpbmc9aGFyZGVuKEpTT04ucGFyc2Uoc21hbGxjYXBzQm9keSkpO1xucmVzdWx0PWhhcmRlbihyZXZpdmVGcm9tU21hbGxjYXBzKGVuY29kaW5nKSk7XG4gfWVsc2V7XG5jb25zdCByYXdUcmVlPWhhcmRlbihKU09OLnBhcnNlKGJvZHkpKTtcbnJlc3VsdD1oYXJkZW4ocmV2aXZlRnJvbUNhcERhdGEocmF3VHJlZSkpO1xuIH1cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQzMzcqL1xuLyogd2hpY2ggc2hvdWxkIGJlIGNvbnNpZGVyZWQgZml4ZWQgb25jZSB3ZSd2ZSBjb21wbGV0ZWQgdGhlIHN3aXRjaCovXG4vKiB0byBzbWFsbGNhcHMuKi9cbmFzc2VydFBhc3NhYmxlKHJlc3VsdCk7XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbnJldHVybiBoYXJkZW4oe1xuc2VyaWFsaXplLFxudW5zZXJpYWxpemV9KTtcblxuIH07JGjigI1fb25jZS5tYWtlTWFyc2hhbChtYWtlTWFyc2hhbCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZU1hcnNoYWwiOlsibWFrZU1hcnNoYWwiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAQWezeQIcAAACHAAAJwAAAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9wYXNzU3R5bGVPZi5qc3siaW1wb3J0cyI6WyIuL2hlbHBlcnMvY29weUFycmF5LmpzIiwiLi9oZWxwZXJzL2NvcHlSZWNvcmQuanMiLCIuL2hlbHBlcnMvZXJyb3IuanMiLCIuL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanMiLCIuL2hlbHBlcnMvcmVtb3RhYmxlLmpzIiwiLi9oZWxwZXJzL3NhZmUtcHJvbWlzZS5qcyIsIi4vaGVscGVycy9zeW1ib2wuanMiLCIuL2hlbHBlcnMvdGFnZ2VkLmpzIiwiQGVuZG8vcHJvbWlzZS1raXQiXSwiZXhwb3J0cyI6WyJhc3NlcnRQYXNzYWJsZSIsInBhc3NTdHlsZU9mIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGlzUHJvbWlzZSxpc09iamVjdCxpc1R5cGVkQXJyYXksUEFTU19TVFlMRSxDb3B5QXJyYXlIZWxwZXIsQ29weVJlY29yZEhlbHBlcixUYWdnZWRIZWxwZXIsRXJyb3JIZWxwZXIsUmVtb3RhYmxlSGVscGVyLGFzc2VydFBhc3NhYmxlU3ltYm9sLGFzc2VydFNhZmVQcm9taXNlOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJpc1Byb21pc2VcIiwgWyRo4oCNX2EgPT4gKGlzUHJvbWlzZSA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImlzT2JqZWN0XCIsIFskaOKAjV9hID0+IChpc09iamVjdCA9ICRo4oCNX2EpXV0sW1wiaXNUeXBlZEFycmF5XCIsIFskaOKAjV9hID0+IChpc1R5cGVkQXJyYXkgPSAkaOKAjV9hKV1dLFtcIlBBU1NfU1RZTEVcIiwgWyRo4oCNX2EgPT4gKFBBU1NfU1RZTEUgPSAkaOKAjV9hKV1dXV0sW1wiLi9oZWxwZXJzL2NvcHlBcnJheS5qc1wiLCBbW1wiQ29weUFycmF5SGVscGVyXCIsIFskaOKAjV9hID0+IChDb3B5QXJyYXlIZWxwZXIgPSAkaOKAjV9hKV1dXV0sW1wiLi9oZWxwZXJzL2NvcHlSZWNvcmQuanNcIiwgW1tcIkNvcHlSZWNvcmRIZWxwZXJcIiwgWyRo4oCNX2EgPT4gKENvcHlSZWNvcmRIZWxwZXIgPSAkaOKAjV9hKV1dXV0sW1wiLi9oZWxwZXJzL3RhZ2dlZC5qc1wiLCBbW1wiVGFnZ2VkSGVscGVyXCIsIFskaOKAjV9hID0+IChUYWdnZWRIZWxwZXIgPSAkaOKAjV9hKV1dXV0sW1wiLi9oZWxwZXJzL2Vycm9yLmpzXCIsIFtbXCJFcnJvckhlbHBlclwiLCBbJGjigI1fYSA9PiAoRXJyb3JIZWxwZXIgPSAkaOKAjV9hKV1dXV0sW1wiLi9oZWxwZXJzL3JlbW90YWJsZS5qc1wiLCBbW1wiUmVtb3RhYmxlSGVscGVyXCIsIFskaOKAjV9hID0+IChSZW1vdGFibGVIZWxwZXIgPSAkaOKAjV9hKV1dXV0sW1wiLi9oZWxwZXJzL3N5bWJvbC5qc1wiLCBbW1wiYXNzZXJ0UGFzc2FibGVTeW1ib2xcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhc3NhYmxlU3ltYm9sID0gJGjigI1fYSldXV1dLFtcIi4vaGVscGVycy9zYWZlLXByb21pc2UuanNcIiwgW1tcImFzc2VydFNhZmVQcm9taXNlXCIsIFskaOKAjV9hID0+IChhc3NlcnRTYWZlUHJvbWlzZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vaGVscGVycy9pbnRlcm5hbC10eXBlcy5qcycpLlBhc3NTdHlsZUhlbHBlcn0gUGFzc1N0eWxlSGVscGVyICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlBhc3NTdHlsZX0gUGFzc1N0eWxlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5QYXNzU3R5bGVPZn0gUGFzc1N0eWxlT2YgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlByaW1pdGl2ZVN0eWxlfSBQcmltaXRpdmVTdHlsZSAqL1xuXG4vKiogQHR5cGVkZWYge0V4Y2x1ZGU8UGFzc1N0eWxlLCBQcmltaXRpdmVTdHlsZSB8IFwicHJvbWlzZVwiPn0gSGVscGVyUGFzc1N0eWxlICovXG5cbmNvbnN0e2RldGFpbHM6WCxGYWlsLHF1b3RlOnF9PWFzc2VydDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtpc0Zyb3plbn09T2JqZWN0O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc1N0eWxlSGVscGVyW119IHBhc3NTdHlsZUhlbHBlcnNcbiAqIEByZXR1cm5zIHtSZWNvcmQ8SGVscGVyUGFzc1N0eWxlLCBQYXNzU3R5bGVIZWxwZXI+IH1cbiAqL1xuXG5jb25zdCBtYWtlSGVscGVyVGFibGU9KHBhc3NTdHlsZUhlbHBlcnMpPT57XG4vKiogQHR5cGUge1JlY29yZDxIZWxwZXJQYXNzU3R5bGUsIGFueT4gJiB7X19wcm90b19fOiBudWxsfX0gKi9cbmNvbnN0IEhlbHBlclRhYmxlPXtcbl9fcHJvdG9fXzpudWxsLFxuY29weUFycmF5OnVuZGVmaW5lZCxcbmNvcHlSZWNvcmQ6dW5kZWZpbmVkLFxudGFnZ2VkOnVuZGVmaW5lZCxcbmVycm9yOnVuZGVmaW5lZCxcbnJlbW90YWJsZTp1bmRlZmluZWR9O1xuXG5mb3IoY29uc3QgaGVscGVyIG9mIHBhc3NTdHlsZUhlbHBlcnMpe1xuY29uc3R7c3R5bGVOYW1lfT1oZWxwZXI7XG5zdHlsZU5hbWUgaW4gSGVscGVyVGFibGV8fEZhaWwgYFVucmVjb2duaXplZCBoZWxwZXI6ICR7cShzdHlsZU5hbWUpfWA7XG5IZWxwZXJUYWJsZVtzdHlsZU5hbWVdPT09dW5kZWZpbmVkfHxcbkZhaWwgYGNvbmZsaWN0aW5nIGhlbHBlcnMgZm9yICR7cShzdHlsZU5hbWUpfWA7XG5IZWxwZXJUYWJsZVtzdHlsZU5hbWVdPWhlbHBlcjtcbiB9XG5mb3IoY29uc3Qgc3R5bGVOYW1lIG9mIG93bktleXMoSGVscGVyVGFibGUpKXtcbkhlbHBlclRhYmxlW3N0eWxlTmFtZV0hPT11bmRlZmluZWR8fFxuRmFpbCBgbWlzc2luZyBoZWxwZXIgZm9yICR7cShzdHlsZU5hbWUpfWA7XG4gfVxuXG5yZXR1cm4gaGFyZGVuKEhlbHBlclRhYmxlKTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc1N0eWxlSGVscGVyW119IHBhc3NTdHlsZUhlbHBlcnMgVGhlIHBhc3NTdHlsZUhlbHBlcnMgdG8gcmVnaXN0ZXIsXG4gKiBpbiBwcmlvcml0eSBvcmRlci5cbiAqIE5PVEUgVGhlc2UgbXVzdCBhbGwgYmUgXCJ0cnVzdGVkXCIsXG4gKiBjb21wbGV0ZSwgYW5kIG5vbi1jb2xsaWRpbmcuIGBtYWtlUGFzc1N0eWxlT2ZgIG1heSAqYXNzdW1lKiB0aGF0IGVhY2ggaGVscGVyXG4gKiBkb2VzIHdoYXQgaXQgaXMgc3VwcG9zZWQgdG8gZG8uIGBtYWtlUGFzc1N0eWxlT2ZgIGlzIG5vdCB0cnlpbmcgdG8gZGVmZW5kXG4gKiBpdHNlbGYgYWdhaW5zdCBtYWxpY2lvdXMgaGVscGVycywgdGhvdWdoIGl0IGRvZXMgZGVmZW5kIGFnYWluc3Qgc29tZVxuICogYWNjaWRlbnRzLlxuICogQHJldHVybnMge1Bhc3NTdHlsZU9mfVxuICovXG5jb25zdCBtYWtlUGFzc1N0eWxlT2Y9KHBhc3NTdHlsZUhlbHBlcnMpPT57XG5jb25zdCBIZWxwZXJUYWJsZT1tYWtlSGVscGVyVGFibGUocGFzc1N0eWxlSGVscGVycyk7XG5jb25zdCByZW1vdGFibGVIZWxwZXI9SGVscGVyVGFibGUucmVtb3RhYmxlO1xuXG4vKipcbiAqIFB1cmVseSBmb3IgcGVyZm9ybWFuY2UuIEhvd2V2ZXIgaXQgaXMgbXV0YWJsZSBzdGF0aWMgc3RhdGUsIGFuZFxuICogaXQgZG9lcyBoYXZlIHNvbWUgb2JzZXJ2YWJpbGl0eSBvbiBwcm94aWVzLiBUT0RPIG5lZWQgdG8gYXNzZXNzXG4gKiB3aGV0aGVyIHRoaXMgY3JlYXRlcyBhIHN0YXRpYyBjb21tdW5pY2F0aW9ucyBjaGFubmVsLlxuICpcbiAqIHBhc3NTdHlsZU9mIGRvZXMgYSBmdWxsIHJlY3Vyc2l2ZSB3YWxrIG9mIHBhc3MtYnktY29weVxuICogc3RydWN0dXJlcywgaW4gb3JkZXIgdG8gdmFsaWRhdGUgdGhhdCB0aGV5IGFyZSBhY3ljbGljLiBJbiBhZGRpdGlvblxuICogaXQgaXMgdXNlZCBieSBvdGhlciBhbGdvcml0aG1zIHRvIHJlY3Vyc2l2ZWx5IHdhbGsgdGhlc2UgcGFzcy1ieS1jb3B5XG4gKiBzdHJ1Y3R1cmVzLCBzbyB3aXRob3V0IHRoaXMgY2FjaGUsIHRoZXNlIGFsZ29yaXRobXMgY291bGQgYmVcbiAqIE8oTioqMikgb3Igd29yc2UuXG4gKlxuICogQHR5cGUge1dlYWtNYXA8UGFzc2FibGUsIFBhc3NTdHlsZT59XG4gKi9cbmNvbnN0IHBhc3NTdHlsZU1lbW89bmV3IFdlYWtNYXAoKTtcblxuLyoqXG4gKiBAdHlwZSB7UGFzc1N0eWxlT2Z9XG4gKi9cbmNvbnN0IHBhc3NTdHlsZU9mPShwYXNzYWJsZSk9Pntcbi8qIEV2ZW4gd2hlbiBhIFdlYWtTZXQgaXMgY29ycmVjdCwgd2hlbiB0aGUgc2V0IGhhcyBhIHNob3J0ZXIgbGlmZXRpbWUqL1xuLyogdGhhbiBpdHMga2V5cywgd2UgcHJlZmVyIGEgU2V0IGR1ZSB0byBleHBlY3RlZCBpbXBsZW1lbnRhdGlvbiovXG4vKiB0cmFkZW9mZnMuKi9cbmNvbnN0IGluUHJvZ3Jlc3M9bmV3IFNldCgpO1xuXG4vKipcbiAqIEB0eXBlIHtQYXNzU3R5bGVPZn1cbiAqL1xuY29uc3QgcGFzc1N0eWxlT2ZSZWN1cj0oaW5uZXIpPT57XG5jb25zdCBpbm5lcklzT2JqZWN0PWlzT2JqZWN0KGlubmVyKTtcbmlmKGlubmVySXNPYmplY3Qpe1xuaWYocGFzc1N0eWxlTWVtby5oYXMoaW5uZXIpKXtcbi8qIEB0cy1pZ25vcmUgVHlwZVNjcmlwdCBkb2Vzbid0IGtub3cgdGhhdCBgZ2V0YCBhZnRlciBgaGFzYCBpcyBzYWZlKi9cbnJldHVybiBwYXNzU3R5bGVNZW1vLmdldChpbm5lcik7XG4gfVxuIWluUHJvZ3Jlc3MuaGFzKGlubmVyKXx8XG5GYWlsIGBQYXNzLWJ5LWNvcHkgZGF0YSBjYW5ub3QgYmUgY3ljbGljICR7aW5uZXJ9YDtcbmluUHJvZ3Jlc3MuYWRkKGlubmVyKTtcbiB9XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mSW50ZXJuYWwoaW5uZXIpO1xuaWYoaW5uZXJJc09iamVjdCl7XG5wYXNzU3R5bGVNZW1vLnNldChpbm5lcixwYXNzU3R5bGUpO1xuaW5Qcm9ncmVzcy5kZWxldGUoaW5uZXIpO1xuIH1cbnJldHVybiBwYXNzU3R5bGU7XG4gfTtcblxuLyoqXG4gKiBAdHlwZSB7UGFzc1N0eWxlT2Z9XG4gKi9cbmNvbnN0IHBhc3NTdHlsZU9mSW50ZXJuYWw9KGlubmVyKT0+e1xuY29uc3QgdHlwZXN0cj10eXBlb2YgaW5uZXI7XG5zd2l0Y2godHlwZXN0cil7XG5jYXNlJ3VuZGVmaW5lZCc6XG5jYXNlJ3N0cmluZyc6XG5jYXNlJ2Jvb2xlYW4nOlxuY2FzZSdudW1iZXInOlxuY2FzZSdiaWdpbnQnOntcbnJldHVybiB0eXBlc3RyO1xuIH1cbmNhc2Unc3ltYm9sJzp7XG5hc3NlcnRQYXNzYWJsZVN5bWJvbChpbm5lcik7XG5yZXR1cm4nc3ltYm9sJztcbiB9XG5jYXNlJ29iamVjdCc6e1xuaWYoaW5uZXI9PT1udWxsKXtcbnJldHVybidudWxsJztcbiB9XG5pZighaXNGcm96ZW4oaW5uZXIpKXtcbmFzc2VydC5mYWlsKFxuLyogVHlwZWRBcnJheXMgZ2V0IHNwZWNpYWwgdHJlYXRtZW50IGluIGhhcmRlbigpKi9cbi8qIGFuZCBhIGNvcnJlc3BvbmRpbmcgc3BlY2lhbCBlcnJvciBtZXNzYWdlIGhlcmUuKi9cbmlzVHlwZWRBcnJheShpbm5lcik/XG5YIGBDYW5ub3QgcGFzcyBtdXRhYmxlIHR5cGVkIGFycmF5cyBsaWtlICR7aW5uZXJ9LmA6XG5YIGBDYW5ub3QgcGFzcyBub24tZnJvemVuIG9iamVjdHMgbGlrZSAke2lubmVyfS4gVXNlIGhhcmRlbigpYCk7XG5cbiB9XG5pZihpc1Byb21pc2UoaW5uZXIpKXtcbmFzc2VydFNhZmVQcm9taXNlKGlubmVyKTtcbnJldHVybidwcm9taXNlJztcbiB9XG50eXBlb2YgaW5uZXIudGhlbiE9PSdmdW5jdGlvbid8fFxuRmFpbCBgQ2Fubm90IHBhc3Mgbm9uLXByb21pc2UgdGhlbmFibGVzYDtcbmNvbnN0IHBhc3NTdHlsZVRhZz1pbm5lcltQQVNTX1NUWUxFXTtcbmlmKHBhc3NTdHlsZVRhZyE9PXVuZGVmaW5lZCl7XG5hc3NlcnQudHlwZW9mKHBhc3NTdHlsZVRhZywnc3RyaW5nJyk7XG5jb25zdCBoZWxwZXI9SGVscGVyVGFibGVbcGFzc1N0eWxlVGFnXTtcbmhlbHBlciE9PXVuZGVmaW5lZHx8XG5GYWlsIGBVbnJlY29nbml6ZWQgUGFzc1N0eWxlOiAke3EocGFzc1N0eWxlVGFnKX1gO1xuaGVscGVyLmFzc2VydFZhbGlkKGlubmVyLHBhc3NTdHlsZU9mUmVjdXIpO1xucmV0dXJuICgvKiogQHR5cGUge1Bhc3NTdHlsZX0gKi9wYXNzU3R5bGVUYWcpO1xuIH1cbmZvcihjb25zdCBoZWxwZXIgb2YgcGFzc1N0eWxlSGVscGVycyl7XG5pZihoZWxwZXIuY2FuQmVWYWxpZChpbm5lcikpe1xuaGVscGVyLmFzc2VydFZhbGlkKGlubmVyLHBhc3NTdHlsZU9mUmVjdXIpO1xucmV0dXJuIGhlbHBlci5zdHlsZU5hbWU7XG4gfVxuIH1cbnJlbW90YWJsZUhlbHBlci5hc3NlcnRWYWxpZChpbm5lcixwYXNzU3R5bGVPZlJlY3VyKTtcbnJldHVybidyZW1vdGFibGUnO1xuIH1cbmNhc2UnZnVuY3Rpb24nOntcbmlzRnJvemVuKGlubmVyKXx8XG5GYWlsIGBDYW5ub3QgcGFzcyBub24tZnJvemVuIG9iamVjdHMgbGlrZSAke2lubmVyfS4gVXNlIGhhcmRlbigpYDtcbnR5cGVvZiBpbm5lci50aGVuIT09J2Z1bmN0aW9uJ3x8XG5GYWlsIGBDYW5ub3QgcGFzcyBub24tcHJvbWlzZSB0aGVuYWJsZXNgO1xucmVtb3RhYmxlSGVscGVyLmFzc2VydFZhbGlkKGlubmVyLHBhc3NTdHlsZU9mUmVjdXIpO1xucmV0dXJuJ3JlbW90YWJsZSc7XG4gfVxuZGVmYXVsdDp7XG5hc3NlcnQuZmFpbChYIGBVbnJlY29nbml6ZWQgdHlwZW9mICR7cSh0eXBlc3RyKX1gLFR5cGVFcnJvcik7XG4gfX1cblxuIH07XG5cbnJldHVybiBwYXNzU3R5bGVPZlJlY3VyKHBhc3NhYmxlKTtcbiB9O1xucmV0dXJuIGhhcmRlbihwYXNzU3R5bGVPZik7XG4gfTtcblxuY29uc3QgICAgICAgIHBhc3NTdHlsZU9mPW1ha2VQYXNzU3R5bGVPZihbXG5Db3B5QXJyYXlIZWxwZXIsXG5Db3B5UmVjb3JkSGVscGVyLFxuVGFnZ2VkSGVscGVyLFxuRXJyb3JIZWxwZXIsXG5SZW1vdGFibGVIZWxwZXJdKTskaOKAjV9vbmNlLnBhc3NTdHlsZU9mKHBhc3NTdHlsZU9mKTtcblxuXG5jb25zdCAgICAgICAgYXNzZXJ0UGFzc2FibGU9KHZhbCk9PntcbnBhc3NTdHlsZU9mKHZhbCk7LyogdGhyb3dzIGlmIHZhbCBpcyBub3QgYSBwYXNzYWJsZSovXG4gfTskaOKAjV9vbmNlLmFzc2VydFBhc3NhYmxlKGFzc2VydFBhc3NhYmxlKTtcbmhhcmRlbihhc3NlcnRQYXNzYWJsZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicGFzc1N0eWxlT2YiOlsicGFzc1N0eWxlT2YiXSwiYXNzZXJ0UGFzc2FibGUiOlsiYXNzZXJ0UGFzc2FibGUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAgjnZkwMNAAADDQAAJgAAAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy90eXBlR3VhcmRzLmpzeyJpbXBvcnRzIjpbIi4vcGFzc1N0eWxlT2YuanMiXSwiZXhwb3J0cyI6WyJhc3NlcnRDb3B5QXJyYXkiLCJhc3NlcnRSZWNvcmQiLCJhc3NlcnRSZW1vdGFibGUiLCJpc0NvcHlBcnJheSIsImlzUmVjb3JkIiwiaXNSZW1vdGFibGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgcGFzc1N0eWxlT2Y7JGjigI1faW1wb3J0cyhbW1wiLi9wYXNzU3R5bGVPZi5qc1wiLCBbW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cbi8qKiBAdGVtcGxhdGUgVCBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkNvcHlBcnJheTxUPn0gQ29weUFycmF5ICovXG4vKiogQHRlbXBsYXRlIFQgQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5Db3B5UmVjb3JkPFQ+fSBDb3B5UmVjb3JkICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5SZW1vdGFibGV9IFJlbW90YWJsZSAqL1xuXG5jb25zdHtGYWlsLHF1b3RlOnF9PWFzc2VydDtcblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIHRoZSBhcmd1bWVudCBpcyBhIHBhc3MtYnktY29weSBhcnJheSwgQUtBIGEgXCJjb3B5QXJyYXlcIlxuICogaW4gQGVuZG8vbWFyc2hhbCB0ZXJtc1xuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGFycmF5XG4gKiBAcmV0dXJucyB7YXJyYXkgaXMgQ29weUFycmF5PGFueT59XG4gKi9cbmNvbnN0IGlzQ29weUFycmF5PShhcnJheSk9PnBhc3NTdHlsZU9mKGFycmF5KT09PSdjb3B5QXJyYXknOyRo4oCNX29uY2UuaXNDb3B5QXJyYXkoaXNDb3B5QXJyYXkpO1xuaGFyZGVuKGlzQ29weUFycmF5KTtcblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIHRoZSBhcmd1bWVudCBpcyBhIHBhc3MtYnktY29weSByZWNvcmQsIEFLQSBhXG4gKiBcImNvcHlSZWNvcmRcIiBpbiBAZW5kby9tYXJzaGFsIHRlcm1zXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gcmVjb3JkXG4gKiBAcmV0dXJucyB7cmVjb3JkIGlzIENvcHlSZWNvcmQ8YW55Pn1cbiAqL1xuY29uc3QgaXNSZWNvcmQ9KHJlY29yZCk9PnBhc3NTdHlsZU9mKHJlY29yZCk9PT0nY29weVJlY29yZCc7JGjigI1fb25jZS5pc1JlY29yZChpc1JlY29yZCk7XG5oYXJkZW4oaXNSZWNvcmQpO1xuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgdGhlIGFyZ3VtZW50IGlzIGEgcmVtb3RhYmxlLlxuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHJlbW90YWJsZVxuICogQHJldHVybnMge3JlbW90YWJsZSBpcyBSZW1vdGFibGV9XG4gKi9cbmNvbnN0IGlzUmVtb3RhYmxlPShyZW1vdGFibGUpPT5wYXNzU3R5bGVPZihyZW1vdGFibGUpPT09J3JlbW90YWJsZSc7JGjigI1fb25jZS5pc1JlbW90YWJsZShpc1JlbW90YWJsZSk7XG5oYXJkZW4oaXNSZW1vdGFibGUpO1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRBcnJheVxuICogQHBhcmFtIHtQYXNzYWJsZX0gYXJyYXlcbiAqIEBwYXJhbSB7c3RyaW5nPX0gb3B0TmFtZU9mQXJyYXlcbiAqIEByZXR1cm5zIHthc3NlcnRzIGFycmF5IGlzIENvcHlBcnJheTxhbnk+fVxuICovXG5cbi8qKiBAdHlwZSB7QXNzZXJ0QXJyYXl9ICovXG5jb25zdCBhc3NlcnRDb3B5QXJyYXk9KGFycmF5LG9wdE5hbWVPZkFycmF5PSdBbGxlZ2VkIGFycmF5Jyk9PntcbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihhcnJheSk7XG5wYXNzU3R5bGU9PT0nY29weUFycmF5J3x8XG5GYWlsIGAke3Eob3B0TmFtZU9mQXJyYXkpfSAke2FycmF5fSBtdXN0IGJlIGEgcGFzcy1ieS1jb3B5IGFycmF5LCBub3QgJHtxKFxucGFzc1N0eWxlKVxuIH1gO1xuIH07JGjigI1fb25jZS5hc3NlcnRDb3B5QXJyYXkoYXNzZXJ0Q29weUFycmF5KTtcbmhhcmRlbihhc3NlcnRDb3B5QXJyYXkpO1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRSZWNvcmRcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHJlY29yZFxuICogQHBhcmFtIHtzdHJpbmc9fSBvcHROYW1lT2ZSZWNvcmRcbiAqIEByZXR1cm5zIHthc3NlcnRzIHJlY29yZCBpcyBDb3B5UmVjb3JkPGFueT59XG4gKi9cblxuLyoqIEB0eXBlIHtBc3NlcnRSZWNvcmR9ICovXG5jb25zdCBhc3NlcnRSZWNvcmQ9KHJlY29yZCxvcHROYW1lT2ZSZWNvcmQ9J0FsbGVnZWQgcmVjb3JkJyk9PntcbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihyZWNvcmQpO1xucGFzc1N0eWxlPT09J2NvcHlSZWNvcmQnfHxcbkZhaWwgYCR7cShvcHROYW1lT2ZSZWNvcmQpfSAke3JlY29yZH0gbXVzdCBiZSBhIHBhc3MtYnktY29weSByZWNvcmQsIG5vdCAke3EoXG5wYXNzU3R5bGUpXG4gfWA7XG4gfTskaOKAjV9vbmNlLmFzc2VydFJlY29yZChhc3NlcnRSZWNvcmQpO1xuaGFyZGVuKGFzc2VydFJlY29yZCk7XG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydFJlbW90YWJsZVxuICogQHBhcmFtIHtQYXNzYWJsZX0gcmVtb3RhYmxlXG4gKiBAcGFyYW0ge3N0cmluZz19IG9wdE5hbWVPZlJlbW90YWJsZVxuICogQHJldHVybnMge2Fzc2VydHMgcmVtb3RhYmxlIGlzIFJlbW90YWJsZX1cbiAqL1xuXG4vKiogQHR5cGUge0Fzc2VydFJlbW90YWJsZX0gKi9cbmNvbnN0IGFzc2VydFJlbW90YWJsZT0oXG5yZW1vdGFibGUsXG5vcHROYW1lT2ZSZW1vdGFibGU9J0FsbGVnZWQgcmVtb3RhYmxlJyk9Plxue1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHJlbW90YWJsZSk7XG5wYXNzU3R5bGU9PT0ncmVtb3RhYmxlJ3x8XG5GYWlsIGAke3Eob3B0TmFtZU9mUmVtb3RhYmxlKX0gJHtyZW1vdGFibGV9IG11c3QgYmUgYSByZW1vdGFibGUsIG5vdCAke3EoXG5wYXNzU3R5bGUpXG4gfWA7XG4gfTskaOKAjV9vbmNlLmFzc2VydFJlbW90YWJsZShhc3NlcnRSZW1vdGFibGUpO1xuaGFyZGVuKGFzc2VydFJlbW90YWJsZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNDb3B5QXJyYXkiOlsiaXNDb3B5QXJyYXkiXSwiaXNSZWNvcmQiOlsiaXNSZWNvcmQiXSwiaXNSZW1vdGFibGUiOlsiaXNSZW1vdGFibGUiXSwiYXNzZXJ0Q29weUFycmF5IjpbImFzc2VydENvcHlBcnJheSJdLCJhc3NlcnRSZWNvcmQiOlsiYXNzZXJ0UmVjb3JkIl0sImFzc2VydFJlbW90YWJsZSI6WyJhc3NlcnRSZW1vdGFibGUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAu1cO9x8BAAAfAQAAIQAAAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAD/CipPugsAALoLAAAeAAAAQGVuZG8vbmF0LXY0LjEuMjMvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJOYXQiLCJpc05hdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShpc05hdCwgJ25hbWUnLCB7dmFsdWU6IFwiaXNOYXRcIn0pOyRo4oCNX29uY2UuaXNOYXQoaXNOYXQpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShOYXQsICduYW1lJywge3ZhbHVlOiBcIk5hdFwifSk7JGjigI1fb25jZS5OYXQoTmF0KTsgICAvKiBDb3B5cmlnaHQgKEMpIDIwMTEgR29vZ2xlIEluYy4qL1xuLyogQ29weXJpZ2h0IChDKSAyMDE4IEFnb3JpYyovXG4vKiovXG4vKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOyovXG4vKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuKi9cbi8qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCovXG4vKiovXG4vKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAqL1xuLyoqL1xuLyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSovXG4vKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsKi9cbi8qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiovXG4vKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kKi9cbi8qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiovXG5cbi8qIEB0cy1jaGVjayovXG5cbi8qKlxuICogSXMgYGFsbGVnZWROdW1gIGEgbnVtYmVyIGluIHRoZSBbY29udGlndW91cyByYW5nZSBvZiBleGFjdGx5IGFuZFxuICogdW5hbWJpZ3VvdXNseVxuICogcmVwcmVzZW50YWJsZV0oaHR0cHM6Ly9lc2Rpc2N1c3Mub3JnL3RvcGljL21vcmUtbnVtZXJpYy1jb25zdGFudHMtcGxlYXNlLWVzcGVjaWFsbHktZXBzaWxvbiNjb250ZW50LTE0KVxuICogIG5hdHVyYWwgbnVtYmVycyAobm9uLW5lZ2F0aXZlIGludGVnZXJzKT9cbiAqXG4gKiBUbyBxdWFsaWZ5IGBhbGxlZ2VkTnVtYCBtdXN0IGVpdGhlciBiZSBhXG4gKiBub24tbmVnYXRpdmUgYGJpZ2ludGAsIG9yIGEgbm9uLW5lZ2F0aXZlIGBudW1iZXJgIHJlcHJlc2VudGluZyBhbiBpbnRlZ2VyXG4gKiB3aXRoaW4gcmFuZ2Ugb2YgW2ludGVnZXJzIHNhZmVseSByZXByZXNlbnRhYmxlIGluXG4gKiBmbG9hdGluZyBwb2ludF0oaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1udW1iZXIuaXNzYWZlaW50ZWdlcikuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBhbGxlZ2VkTnVtXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNOYXQoYWxsZWdlZE51bSl7XG5pZih0eXBlb2YgYWxsZWdlZE51bT09PSdiaWdpbnQnKXtcbnJldHVybiBhbGxlZ2VkTnVtPj0wO1xuIH1cbmlmKHR5cGVvZiBhbGxlZ2VkTnVtIT09J251bWJlcicpe1xucmV0dXJuIGZhbHNlO1xuIH1cblxucmV0dXJuIE51bWJlci5pc1NhZmVJbnRlZ2VyKGFsbGVnZWROdW0pJiZhbGxlZ2VkTnVtPj0wO1xuIH1cblxuLyoqXG4gKiBJZiBgYWxsZWdlZE51bWJlcmAgcGFzc2VzIHRoZSBgaXNOYXRgIHRlc3QsIHRoZW4gcmV0dXJuIGl0IGFzIGEgYmlnaW50LlxuICogT3RoZXJ3aXNlIHRocm93IGFuIGFwcHJvcHJpYXRlIGVycm9yLlxuICpcbiAqIElmIGBhbGxlZ2VkTnVtYCBpcyBuZWl0aGVyIGEgYmlnaW50IG5vciBhIG51bWJlciwgYE5hdGAgdGhyb3dzIGEgYFR5cGVFcnJvcmAuXG4gKiBPdGhlcndpc2UsIGlmIGl0IGlzIG5vdCBhIFtzYWZlbHlcbiAqIHJlcHJlc2VudGFibGVdKGh0dHBzOi8vZXNkaXNjdXNzLm9yZy90b3BpYy9tb3JlLW51bWVyaWMtY29uc3RhbnRzLXBsZWFzZS1lc3BlY2lhbGx5LWVwc2lsb24jY29udGVudC0xNClcbiAqIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyLCBgTmF0YCB0aHJvd3MgYSBgUmFuZ2VFcnJvcmAuXG4gKiBPdGhlcndpc2UsIGl0IGlzIGNvbnZlcnRlZCB0byBhIGJpZ2ludCBpZiBuZWNlc3NhcnkgYW5kIHJldHVybmVkLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gYWxsZWdlZE51bVxuICogQHJldHVybnMge2JpZ2ludH1cbiAqL1xuZnVuY3Rpb24gTmF0KGFsbGVnZWROdW0pe1xuaWYodHlwZW9mIGFsbGVnZWROdW09PT0nYmlnaW50Jyl7XG5pZihhbGxlZ2VkTnVtPDApe1xudGhyb3cgbmV3IFJhbmdlRXJyb3IoIGAke2FsbGVnZWROdW19IGlzIG5lZ2F0aXZlYCk7XG4gfVxucmV0dXJuIGFsbGVnZWROdW07XG4gfVxuXG5pZih0eXBlb2YgYWxsZWdlZE51bT09PSdudW1iZXInKXtcbmlmKCFOdW1iZXIuaXNTYWZlSW50ZWdlcihhbGxlZ2VkTnVtKSl7XG50aHJvdyBuZXcgUmFuZ2VFcnJvciggYCR7YWxsZWdlZE51bX0gbm90IGEgc2FmZSBpbnRlZ2VyYCk7XG4gfVxuaWYoYWxsZWdlZE51bTwwKXtcbnRocm93IG5ldyBSYW5nZUVycm9yKCBgJHthbGxlZ2VkTnVtfSBpcyBuZWdhdGl2ZWApO1xuIH1cbnJldHVybiBCaWdJbnQoYWxsZWdlZE51bSk7XG4gfVxuXG50aHJvdyBuZXcgVHlwZUVycm9yKFxuIGAke2FsbGVnZWROdW19IGlzIGEgJHt0eXBlb2YgYWxsZWdlZE51bX0gYnV0IG11c3QgYmUgYSBiaWdpbnQgb3IgYSBudW1iZXJgKTtcblxuIH1cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc05hdCI6WyJpc05hdCJdLCJOYXQiOlsiTmF0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEdvKsdbCQAAWwkAACIAAABAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vc3JjL2lzLXByb21pc2UuanMiLCIuL3NyYy9tZW1vLXJhY2UuanMiLCIuL3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qcyIsIi4vc3JjL3R5cGVzLmpzIl0sImV4cG9ydHMiOlsibWFrZVByb21pc2VLaXQiLCJyYWNlUHJvbWlzZXMiXSwicmVleHBvcnRzIjpbIi4vc3JjL2lzLXByb21pc2UuanMiLCIuL3NyYy90eXBlcy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQsbWVtb1JhY2U7JGjigI1faW1wb3J0cyhbW1wiLi9zcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanNcIiwgW1tcIm1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdFwiLCBbJGjigI1fYSA9PiAobWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0ID0gJGjigI1fYSldXV1dLFtcIi4vc3JjL21lbW8tcmFjZS5qc1wiLCBbW1wibWVtb1JhY2VcIiwgWyRo4oCNX2EgPT4gKG1lbW9SYWNlID0gJGjigI1fYSldXV1dLFtcIi4vc3JjL2lzLXByb21pc2UuanNcIiwgW11dLFtcIi4vc3JjL3R5cGVzLmpzXCIsIFtdXV0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShtYWtlUHJvbWlzZUtpdCwgJ25hbWUnLCB7dmFsdWU6IFwibWFrZVByb21pc2VLaXRcIn0pOyRo4oCNX29uY2UubWFrZVByb21pc2VLaXQobWFrZVByb21pc2VLaXQpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShyYWNlUHJvbWlzZXMsICduYW1lJywge3ZhbHVlOiBcInJhY2VQcm9taXNlc1wifSk7JGjigI1fb25jZS5yYWNlUHJvbWlzZXMocmFjZVByb21pc2VzKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlIHtQcm9taXNlQ29uc3RydWN0b3J9ICovXG5jb25zdCBCZXN0UGlwZWxpbmFibGVQcm9taXNlPWdsb2JhbFRoaXMuSGFuZGxlZFByb21pc2V8fFByb21pc2U7XG5cbi8qKlxuICogbWFrZVByb21pc2VLaXQoKSBidWlsZHMgYSBQcm9taXNlIG9iamVjdCwgYW5kIHJldHVybnMgYSByZWNvcmRcbiAqIGNvbnRhaW5pbmcgdGhlIHByb21pc2UgaXRzZWxmLCBhcyB3ZWxsIGFzIHNlcGFyYXRlIGZhY2V0cyBmb3IgcmVzb2x2aW5nXG4gKiBhbmQgcmVqZWN0aW5nIGl0LlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcmV0dXJucyB7WGltcG9ydCgnLi9zcmMvdHlwZXMuanMnKS5Qcm9taXNlS2l0PFQ+fVxuICovXG5mdW5jdGlvbiAgICAgICAgbWFrZVByb21pc2VLaXQoKXtcbmNvbnN0e3Jlc29sdmUscmVqZWN0LGV4ZWN1dG9yfT1tYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQoKTtcblxuY29uc3QgcHJvbWlzZT1uZXcgQmVzdFBpcGVsaW5hYmxlUHJvbWlzZShleGVjdXRvcik7XG5cbnJldHVybiBoYXJkZW4oe3Byb21pc2UscmVzb2x2ZSxyZWplY3R9KTtcbiB9XG5oYXJkZW4obWFrZVByb21pc2VLaXQpO1xuXG4vKiBOQjogQW5vdGhlciBpbXBsZW1lbnRhdGlvbiBmb3IgUHJvbWlzZS5yYWNlIHdvdWxkIGJlIHRvIHVzZSB0aGUgcmVsZWFzaW5nIGV4ZWN1dG9yLCovXG4vKiBIb3dldmVyIHdoaWxlIGl0IHdvdWxkIG5vIGxvbmdlciBsZWFrIHRoZSByYWNlZCBwcm9taXNlIG9iamVjdHMgdGhlbXNlbHZlcywgaXQgd291bGQqL1xuLyogc3RpbGwgbGVhayByZWFjdGlvbnMgb24gdGhlIG5vbi1yZXNvbHZlZCBwcm9taXNlcyBjb250ZW5kaW5nIGZvciB0aGUgcmFjZS4qL1xuXG4vKipcbiAqIENyZWF0ZXMgYSBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgb3IgcmVqZWN0ZWQgd2hlbiBhbnkgb2YgdGhlIHByb3ZpZGVkIFByb21pc2VzIGFyZSByZXNvbHZlZFxuICogb3IgcmVqZWN0ZWQuXG4gKlxuICogVW5saWtlIGBQcm9taXNlLnJhY2VgIGl0IGNsZWFucyB1cCBhZnRlciBpdHNlbGYgc28gYSBub24tcmVzb2x2ZWQgdmFsdWUgZG9lc24ndCBob2xkIG9udG9cbiAqIHRoZSByZXN1bHQgcHJvbWlzZS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxUPn0gdmFsdWVzIEFuIGl0ZXJhYmxlIG9mIFByb21pc2VzLlxuICogQHJldHVybnMge1Byb21pc2U8QXdhaXRlZDxUPj59IEEgbmV3IFByb21pc2UuXG4gKi9cbmZ1bmN0aW9uICAgICAgICByYWNlUHJvbWlzZXModmFsdWVzKXtcbnJldHVybiBoYXJkZW4obWVtb1JhY2UuY2FsbChCZXN0UGlwZWxpbmFibGVQcm9taXNlLHZhbHVlcykpO1xuIH1cbmhhcmRlbihyYWNlUHJvbWlzZXMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VQcm9taXNlS2l0IjpbIm1ha2VQcm9taXNlS2l0Il0sInJhY2VQcm9taXNlcyI6WyJyYWNlUHJvbWlzZXMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAl4jgW8oCAADKAgAAKwAAAEBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIvc3JjL2lzLXByb21pc2UuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImlzUHJvbWlzZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShpc1Byb21pc2UsICduYW1lJywge3ZhbHVlOiBcImlzUHJvbWlzZVwifSk7JGjigI1fb25jZS5pc1Byb21pc2UoaXNQcm9taXNlKTsgICAvKipcbiAqIERldGVybWluZSBpZiB0aGUgYXJndW1lbnQgaXMgYSBQcm9taXNlLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gbWF5YmVQcm9taXNlIFRoZSB2YWx1ZSB0byBleGFtaW5lXG4gKiBAcmV0dXJucyB7bWF5YmVQcm9taXNlIGlzIFByb21pc2V9IFdoZXRoZXIgaXQgaXMgYSBwcm9taXNlXG4gKi9cbmZ1bmN0aW9uICAgICAgICBpc1Byb21pc2UobWF5YmVQcm9taXNlKXtcbnJldHVybiBQcm9taXNlLnJlc29sdmUobWF5YmVQcm9taXNlKT09PW1heWJlUHJvbWlzZTtcbiB9XG5oYXJkZW4oaXNQcm9taXNlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc1Byb21pc2UiOlsiaXNQcm9taXNlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAIQRv9OpEgAAqRIAACoAAABAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyL3NyYy9tZW1vLXJhY2UuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIm1lbW9SYWNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogSW5pdGlhbCB2ZXJzaW9uIGF1dGhvcmVkIGJ5IEJyaWFuIEtpbTpcbmh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9pc3N1ZXMvMTc0NjkjaXNzdWVjb21tZW50LTY4NTIxNjc3N1xuIFRoaXMgaXMgZnJlZSBhbmQgdW5lbmN1bWJlcmVkIHNvZnR3YXJlIHJlbGVhc2VkIGludG8gdGhlIHB1YmxpYyBkb21haW4uXG4gQW55b25lIGlzIGZyZWUgdG8gY29weSwgbW9kaWZ5LCBwdWJsaXNoLCB1c2UsIGNvbXBpbGUsIHNlbGwsIG9yXG5kaXN0cmlidXRlIHRoaXMgc29mdHdhcmUsIGVpdGhlciBpbiBzb3VyY2UgY29kZSBmb3JtIG9yIGFzIGEgY29tcGlsZWRcbmJpbmFyeSwgZm9yIGFueSBwdXJwb3NlLCBjb21tZXJjaWFsIG9yIG5vbi1jb21tZXJjaWFsLCBhbmQgYnkgYW55XG5tZWFucy5cbiBJbiBqdXJpc2RpY3Rpb25zIHRoYXQgcmVjb2duaXplIGNvcHlyaWdodCBsYXdzLCB0aGUgYXV0aG9yIG9yIGF1dGhvcnNcbm9mIHRoaXMgc29mdHdhcmUgZGVkaWNhdGUgYW55IGFuZCBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoZVxuc29mdHdhcmUgdG8gdGhlIHB1YmxpYyBkb21haW4uIFdlIG1ha2UgdGhpcyBkZWRpY2F0aW9uIGZvciB0aGUgYmVuZWZpdFxub2YgdGhlIHB1YmxpYyBhdCBsYXJnZSBhbmQgdG8gdGhlIGRldHJpbWVudCBvZiBvdXIgaGVpcnMgYW5kXG5zdWNjZXNzb3JzLiBXZSBpbnRlbmQgdGhpcyBkZWRpY2F0aW9uIHRvIGJlIGFuIG92ZXJ0IGFjdCBvZlxucmVsaW5xdWlzaG1lbnQgaW4gcGVycGV0dWl0eSBvZiBhbGwgcHJlc2VudCBhbmQgZnV0dXJlIHJpZ2h0cyB0byB0aGlzXG5zb2Z0d2FyZSB1bmRlciBjb3B5cmlnaHQgbGF3LlxuIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsXG5FWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbk1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC5cbklOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SXG5PVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSxcbkFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUlxuT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBwbGVhc2UgcmVmZXIgdG8gPGh0dHA6Ly91bmxpY2Vuc2Uub3JnLz5cbiovXG5cblxuXG5cblxuXG5cbmNvbnN0IGlzT2JqZWN0PSh2YWx1ZSk9Pk9iamVjdCh2YWx1ZSk9PT12YWx1ZTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgW1Q9YW55XVxuICogQHR5cGVkZWYge29iamVjdH0gRGVmZXJyZWRcbiAqIEBwcm9wZXJ0eSB7KHZhbHVlPzogWGltcG9ydChcIi4vdHlwZXMuanNcIikuRVJlZjxUPiApID0+IHZvaWR9IHJlc29sdmVcbiAqIEBwcm9wZXJ0eSB7KGVycj86IGFueSApID0+IHZvaWR9IHJlamVjdFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyBuZXZlclxuICogIHwge3NldHRsZWQ6IGZhbHNlLCBkZWZlcnJlZHM6IFNldDxEZWZlcnJlZD59XG4gKiAgfCB7c2V0dGxlZDogdHJ1ZSwgZGVmZXJyZWRzPzogdW5kZWZpbmVkfVxuICogfSBQcm9taXNlTWVtb1JlY29yZFxuICovXG5cbi8qIEtleXMgYXJlIHRoZSB2YWx1ZXMgcGFzc2VkIHRvIHJhY2UsIHZhbHVlcyBhcmUgYSByZWNvcmQgb2YgZGF0YSBjb250YWluaW5nIGEqL1xuLyogc2V0IG9mIGRlZmVycmVkcyBhbmQgd2hldGhlciB0aGUgdmFsdWUgaGFzIHNldHRsZWQuKi9cbi8qKiBAdHlwZSB7V2Vha01hcDxvYmplY3QsIFByb21pc2VNZW1vUmVjb3JkPn0gKi9cbmNvbnN0IGtub3duUHJvbWlzZXM9bmV3IFdlYWtNYXAoKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Byb21pc2VNZW1vUmVjb3JkIHwgdW5kZWZpbmVkfSByZWNvcmRcbiAqIEByZXR1cm5zIHtTZXQ8RGVmZXJyZWQ+fVxuICovXG5jb25zdCBtYXJrU2V0dGxlZD0ocmVjb3JkKT0+e1xuaWYoIXJlY29yZHx8cmVjb3JkLnNldHRsZWQpe1xucmV0dXJuIG5ldyBTZXQoKTtcbiB9XG5cbmNvbnN0e2RlZmVycmVkc309cmVjb3JkO1xuT2JqZWN0LmFzc2lnbihyZWNvcmQse1xuZGVmZXJyZWRzOnVuZGVmaW5lZCxcbnNldHRsZWQ6dHJ1ZX0pO1xuXG5PYmplY3QuZnJlZXplKHJlY29yZCk7XG5yZXR1cm4gZGVmZXJyZWRzO1xuIH07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7YW55fSB2YWx1ZVxuICogQHJldHVybnMge1Byb21pc2VNZW1vUmVjb3JkfVxuICovXG5jb25zdCBnZXRNZW1vUmVjb3JkPSh2YWx1ZSk9PntcbmlmKCFpc09iamVjdCh2YWx1ZSkpe1xuLyogSWYgdGhlIGNvbnRlbmRlciBpcyBhIHByaW1pdGl2ZSwgYXR0ZW1wdGluZyB0byB1c2UgaXQgYXMgYSBrZXkgaW4gdGhlKi9cbi8qIHdlYWttYXAgd291bGQgdGhyb3cgYW4gZXJyb3IuIEx1Y2tpbHksIGl0IGlzIHNhZmUgdG8gY2FsbCovXG4vKiBgUHJvbWlzZS5yZXNvbHZlKGNvbnRlbmRlcikudGhlbmAgb24gYSBwcmltaXRpdmUgdmFsdWUgbXVsdGlwbGUgdGltZXMqL1xuLyogYmVjYXVzZSB0aGUgcHJvbWlzZSBmdWxmaWxscyBpbW1lZGlhdGVseS4gU28gd2UgZmFrZSBhIHNldHRsZWQgcmVjb3JkLiovXG5yZXR1cm4gaGFyZGVuKHtzZXR0bGVkOnRydWV9KTtcbiB9XG5cbmxldCByZWNvcmQ9a25vd25Qcm9taXNlcy5nZXQodmFsdWUpO1xuXG5pZighcmVjb3JkKXtcbnJlY29yZD17ZGVmZXJyZWRzOm5ldyBTZXQoKSxzZXR0bGVkOmZhbHNlfTtcbmtub3duUHJvbWlzZXMuc2V0KHZhbHVlLHJlY29yZCk7XG4vKiBUaGlzIGNhbGwgdG8gYHRoZW5gIGhhcHBlbnMgb25jZSBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSB2YWx1ZS4qL1xuUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuKFxuKHZhbCk9PntcbmZvcihjb25zdHtyZXNvbHZlfW9mIG1hcmtTZXR0bGVkKHJlY29yZCkpe1xucmVzb2x2ZSh2YWwpO1xuIH1cbiB9LFxuKGVycik9PntcbmZvcihjb25zdHtyZWplY3R9b2YgbWFya1NldHRsZWQocmVjb3JkKSl7XG5yZWplY3QoZXJyKTtcbiB9XG4gfSk7XG5cbiB9XG5yZXR1cm4gcmVjb3JkO1xuIH07XG5cbmNvbnN0e3JhY2V9PXtcbi8qKlxuICogQ3JlYXRlcyBhIFByb21pc2UgdGhhdCBpcyByZXNvbHZlZCBvciByZWplY3RlZCB3aGVuIGFueSBvZiB0aGUgcHJvdmlkZWQgUHJvbWlzZXMgYXJlIHJlc29sdmVkXG4gKiBvciByZWplY3RlZC5cbiAqXG4gKiBVbmxpa2UgYFByb21pc2UucmFjZWAgaXQgY2xlYW5zIHVwIGFmdGVyIGl0c2VsZiBzbyBhIG5vbi1yZXNvbHZlZCB2YWx1ZSBkb2Vzbid0IGhvbGQgb250b1xuICogdGhlIHJlc3VsdCBwcm9taXNlLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdGVtcGxhdGUge1Byb21pc2VDb25zdHJ1Y3Rvcn0gW1A9UHJvbWlzZUNvbnN0cnVjdG9yXVxuICogQHRoaXMge1B9XG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFQ+fSB2YWx1ZXMgQW4gaXRlcmFibGUgb2YgUHJvbWlzZXMuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxBd2FpdGVkPFQ+Pn0gQSBuZXcgUHJvbWlzZS5cbiAqL1xucmFjZSh2YWx1ZXMpe1xubGV0IGRlZmVycmVkO1xuLyoqIEB0eXBlIHtUW119ICovXG5jb25zdCBjYWNoZWRWYWx1ZXM9W107XG5jb25zdCBDPXRoaXM7XG5jb25zdCByZXN1bHQ9bmV3IEMoKHJlc29sdmUscmVqZWN0KT0+e1xuZGVmZXJyZWQ9e3Jlc29sdmUscmVqZWN0fTtcbmZvcihjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpe1xuY2FjaGVkVmFsdWVzLnB1c2godmFsdWUpO1xuY29uc3R7c2V0dGxlZCxkZWZlcnJlZHN9PWdldE1lbW9SZWNvcmQodmFsdWUpO1xuaWYoc2V0dGxlZCl7XG4vKiBJZiB0aGUgY29udGVuZGVyIGlzIHNldHRsZWQgKGluY2x1ZGluZyBwcmltaXRpdmVzKSwgaXQgaXMgc2FmZSovXG4vKiB0byBjYWxsIGBQcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW5gIG9uIGl0LiovXG5DLnJlc29sdmUodmFsdWUpLnRoZW4ocmVzb2x2ZSxyZWplY3QpO1xuIH1lbHNle1xuZGVmZXJyZWRzLmFkZChkZWZlcnJlZCk7XG4gfVxuIH1cbiB9KTtcblxuLyogVGhlIGZpbmFsbHkgY2FsbGJhY2sgZXhlY3V0ZXMgd2hlbiBhbnkgdmFsdWUgc2V0dGxlcywgcHJldmVudGluZyBhbnkgb2YqL1xuLyogdGhlIHVucmVzb2x2ZWQgdmFsdWVzIGZyb20gcmV0YWluaW5nIGEgcmVmZXJlbmNlIHRvIHRoZSByZXNvbHZlZCB2YWx1ZS4qL1xucmV0dXJuIHJlc3VsdC5maW5hbGx5KCgpPT57XG5mb3IoY29uc3QgdmFsdWUgb2YgY2FjaGVkVmFsdWVzKXtcbmNvbnN0e2RlZmVycmVkc309Z2V0TWVtb1JlY29yZCh2YWx1ZSk7XG5pZihkZWZlcnJlZHMpe1xuZGVmZXJyZWRzLmRlbGV0ZShkZWZlcnJlZCk7XG4gfVxuIH1cbiB9KTtcbiB9fTskaOKAjV9vbmNlLnJhY2UocmFjZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWVtb1JhY2UiOlsicmFjZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB0DAyPVAcAAFQHAAA1AAAAQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41Mi9zcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIm1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qLyA8cmVmZXJlbmNlIHR5cGVzPVwic2VzXCIvPiovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBjYWxsYmFjayBQcm9taXNlRXhlY3V0b3IgVGhlIHByb21pc2UgZXhlY3V0b3JcbiAqIEBwYXJhbSB7KHZhbHVlOiBYaW1wb3J0KCcuL3R5cGVzLmpzJykuRVJlZjxUPikgPT4gdm9pZH0gcmVzb2x2ZVxuICogQHBhcmFtIHsocmVhc29uOiBhbnkpID0+IHZvaWR9IHJlamVjdFxuICovXG5cbi8qKlxuICogbWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KCkgYnVpbGRzIHJlc29sdmUvcmVqZWN0IGZ1bmN0aW9ucyB3aGljaCBkcm9wIHJlZmVyZW5jZXNcbiAqIHRvIHRoZSByZXNvbHZlL3JlamVjdCBmdW5jdGlvbnMgZ2F0aGVyZWQgZnJvbSBhbiBleGVjdXRvciB0byBiZSB1c2VkIHdpdGggYVxuICogcHJvbWlzZSBjb25zdHJ1Y3Rvci5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHJldHVybnMge1BpY2s8WGltcG9ydCgnLi90eXBlcy5qcycpLlByb21pc2VLaXQ8VD4sICdyZXNvbHZlJyB8ICdyZWplY3QnPiAmIHsgZXhlY3V0b3I6IFByb21pc2VFeGVjdXRvcjxUPn19XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQ9KCk9Pntcbi8qKiBAdHlwZSB7bnVsbCB8IHVuZGVmaW5lZCB8ICgodmFsdWU6IFhpbXBvcnQoJy4vdHlwZXMuanMnKS5FUmVmPFQ+KSA9PiB2b2lkKX0gKi9cbmxldCBpbnRlcm5hbFJlc29sdmU7XG4vKiogQHR5cGUge251bGwgfCB1bmRlZmluZWQgfCAoKHJlYXNvbjogdW5rbm93bikgPT4gdm9pZCl9ICovXG5sZXQgaW50ZXJuYWxSZWplY3Q7XG5cbi8qKiBAcGFyYW0ge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5FUmVmPFQ+fSB2YWx1ZSAqL1xuY29uc3QgcmVzb2x2ZT0odmFsdWUpPT57XG5pZihpbnRlcm5hbFJlc29sdmUpe1xuaW50ZXJuYWxSZXNvbHZlKHZhbHVlKTtcbmludGVybmFsUmVzb2x2ZT1udWxsO1xuaW50ZXJuYWxSZWplY3Q9bnVsbDtcbiB9ZWxzZXtcbmFzc2VydChpbnRlcm5hbFJlc29sdmU9PT1udWxsKTtcbiB9XG4gfTtcblxuLyoqIEBwYXJhbSB7dW5rbm93bn0gcmVhc29uICovXG5jb25zdCByZWplY3Q9KHJlYXNvbik9PntcbmlmKGludGVybmFsUmVqZWN0KXtcbmludGVybmFsUmVqZWN0KHJlYXNvbik7XG5pbnRlcm5hbFJlc29sdmU9bnVsbDtcbmludGVybmFsUmVqZWN0PW51bGw7XG4gfWVsc2V7XG5hc3NlcnQoaW50ZXJuYWxSZWplY3Q9PT1udWxsKTtcbiB9XG4gfTtcblxuY29uc3QgZXhlY3V0b3I9KHJlcyxyZWopPT57XG5hc3NlcnQoaW50ZXJuYWxSZXNvbHZlPT09dW5kZWZpbmVkJiZpbnRlcm5hbFJlamVjdD09PXVuZGVmaW5lZCk7XG5pbnRlcm5hbFJlc29sdmU9cmVzO1xuaW50ZXJuYWxSZWplY3Q9cmVqO1xuIH07XG5cbnJldHVybiBoYXJkZW4oe3Jlc29sdmUscmVqZWN0LGV4ZWN1dG9yfSk7XG4gfTskaOKAjV9vbmNlLm1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdChtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQpO1xuaGFyZGVuKG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0IjpbIm1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC7Vw73HwEAAB8BAAAmAAAAQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41Mi9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAQIeAwoAAAAAAAAAAACRR/zTpeAAAKXgAAAUAAAAAAAAAAAAAACkgQAAAABjb21wYXJ0bWVudC1tYXAuanNvblBLAQIeAwoAAAAAAAAAAAAB7dpgGgsAABoLAAAjAAAAAAAAAAAAAACkgdfgAABAYWdvcmljL2Fzc2VydC12MC41LjEvc3JjL2Fzc2VydC5qc1BLAQIeAwoAAAAAAAAAAADib06ZOC8AADgvAAAiAAAAAAAAAAAAAACkgTLsAABAYWdvcmljL2Fzc2VydC12MC41LjEvc3JjL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAAF3N7g5XAQAAVwEAACAAAAAAAAAAAAAAAKSBqhsBAEBhZ29yaWMvZXJ0cC12MC4xNS4zL2V4cG9ydGVkLmpzUEsBAh4DCgAAAAAAAAAAADjC3enZNgAA2TYAACYAAAAAAAAAAAAAAKSBPx0BAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy9hbW91bnRNYXRoLmpzUEsBAh4DCgAAAAAAAAAAAI7m3xykBQAApAUAACcAAAAAAAAAAAAAAKSBXFQBAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy9kaXNwbGF5SW5mby5qc1BLAQIeAwoAAAAAAAAAAADJvSw40wEAANMBAAAhAAAAAAAAAAAAAACkgUVaAQBAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAA2lh63DMbAAAzGwAAJQAAAAAAAAAAAAAApIFXXAEAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL2lzc3VlcktpdC5qc1BLAQIeAwoAAAAAAAAAAAApLuyRjAUAAIwFAAA6AAAAAAAAAAAAAACkgc13AQBAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvbWF0aEhlbHBlcnMvY29weUJhZ01hdGhIZWxwZXJzLmpzUEsBAh4DCgAAAAAAAAAAAOWIulyZBQAAmQUAADoAAAAAAAAAAAAAAKSBsX0BAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy9tYXRoSGVscGVycy9jb3B5U2V0TWF0aEhlbHBlcnMuanNQSwECHgMKAAAAAAAAAAAATxBrABMGAAATBgAANgAAAAAAAAAAAAAApIGigwEAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL21hdGhIZWxwZXJzL25hdE1hdGhIZWxwZXJzLmpzUEsBAh4DCgAAAAAAAAAAAJGAua5/BwAAfwcAADYAAAAAAAAAAAAAAKSBCYoBAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy9tYXRoSGVscGVycy9zZXRNYXRoSGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAAAEVD8rgQQAAIEEAAAjAAAAAAAAAAAAAACkgdyRAQBAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvcGF5bWVudC5qc1BLAQIeAwoAAAAAAAAAAACpSD8cnDwAAJw8AAApAAAAAAAAAAAAAACkgZ6WAQBAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvcGF5bWVudExlZGdlci5qc1BLAQIeAwoAAAAAAAAAAAA1TYq52w4AANsOAAAhAAAAAAAAAAAAAACkgYHTAQBAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvcHVyc2UuanNQSwECHgMKAAAAAAAAAAAA3ts1pfsFAAD7BQAALQAAAAAAAAAAAAAApIGb4gEAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL3RyYW5zaWVudE5vdGlmaWVyLmpzUEsBAh4DCgAAAAAAAAAAAF6JbmdpJwAAaScAACYAAAAAAAAAAAAAAKSB4egBAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy90eXBlR3VhcmRzLmpzUEsBAh4DCgAAAAAAAAAAACuDcfvpQgAA6UIAACkAAAAAAAAAAAAAAKSBjhACAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy90eXBlcy1hbWJpZW50LmpzUEsBAh4DCgAAAAAAAAAAAF3N7g5XAQAAVwEAACUAAAAAAAAAAAAAAKSBvlMCAEBhZ29yaWMvZ292ZXJuYW5jZS12MC45LjEvZXhwb3J0ZWQuanNQSwECHgMKAAAAAAAAAAAAT1Jlay9cAAAvXAAALgAAAAAAAAAAAAAApIFYVQIAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjkuMS9zcmMvdHlwZXMtYW1iaWVudC5qc1BLAQIeAwoAAAAAAAAAAAAO61XYMhIAADISAAA6AAAAAAAAAAAAAACkgdOxAgBAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjEvc3JjL2Vjb25Db21taXR0ZWVDaGFydGVyLmpzUEsBAh4DCgAAAAAAAAAAADZnyOF4BAAAeAQAACUAAAAAAAAAAAAAAKSBXcQCAEBhZ29yaWMvaW50ZXJuYWwtdjAuMi4xL3NyYy9jb25maWcuanNQSwECHgMKAAAAAAAAAAAAr/QmyH0BAAB9AQAAJAAAAAAAAAAAAAAApIEYyQIAQGFnb3JpYy9pbnRlcm5hbC12MC4yLjEvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAGM+OswjNwAAIzcAACQAAAAAAAAAAAAAAKSB18oCAEBhZ29yaWMvaW50ZXJuYWwtdjAuMi4xL3NyYy91dGlscy5qc1BLAQIeAwoAAAAAAAAAAABS8904iAsAAIgLAAAiAAAAAAAAAAAAAACkgTwCAwBAYWdvcmljL25hdC12NC4xLjAvZGlzdC9uYXQuZXNtLmpzUEsBAh4DCgAAAAAAAAAAAF3N7g5XAQAAVwEAACMAAAAAAAAAAAAAAKSBBA4DAEBhZ29yaWMvbm90aWZpZXItdjAuNS4xL2V4cG9ydGVkLmpzUEsBAh4DCgAAAAAAAAAAAHdLPiOjHQAAox0AADMAAAAAAAAAAAAAAKSBnA8DAEBhZ29yaWMvbm90aWZpZXItdjAuNS4xL3NyYy9hc3luY0l0ZXJhYmxlQWRhcHRvci5qc1BLAQIeAwoAAAAAAAAAAADPkEiLAAsAAAALAAAkAAAAAAAAAAAAAACkgZAtAwBAYWdvcmljL25vdGlmaWVyLXYwLjUuMS9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAOa9HeEAqAABAKgAAJwAAAAAAAAAAAAAApIHSOAMAQGFnb3JpYy9ub3RpZmllci12MC41LjEvc3JjL25vdGlmaWVyLmpzUEsBAh4DCgAAAAAAAAAAANSDfdX2MgAA9jIAACoAAAAAAAAAAAAAAKSBV2MDAEBhZ29yaWMvbm90aWZpZXItdjAuNS4xL3NyYy9wdWJsaXNoLWtpdC5qc1BLAQIeAwoAAAAAAAAAAABWCIVmvx4AAL8eAAAnAAAAAAAAAAAAAACkgZWWAwBAYWdvcmljL25vdGlmaWVyLXYwLjUuMS9zcmMvc3RvcmVzdWIuanNQSwECHgMKAAAAAAAAAAAA0bxMuTkMAAA5DAAAKQAAAAAAAAAAAAAApIGZtQMAQGFnb3JpYy9ub3RpZmllci12MC41LjEvc3JjL3N1YnNjcmliZXIuanNQSwECHgMKAAAAAAAAAAAA+cQ1iP0nAAD9JwAALAAAAAAAAAAAAAAApIEZwgMAQGFnb3JpYy9ub3RpZmllci12MC41LjEvc3JjL3R5cGVzLWFtYmllbnQuanNQSwECHgMKAAAAAAAAAAAA1tYqM5UBAACVAQAAIAAAAAAAAAAAAAAApIFg6gMAQGFnb3JpYy9zdG9yZS12MC44LjMvZXhwb3J0ZWQuanNQSwECHgMKAAAAAAAAAAAATlVGlJ4iAACeIgAAIQAAAAAAAAAAAAAApIEz7AMAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAACEE+ZSCQwAAgkMAACkAAAAAAAAAAAAAAKSBEA8EAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9rZXlzL2NoZWNrS2V5LmpzUEsBAh4DCgAAAAAAAAAAADRody3KGgAAyhoAACwAAAAAAAAAAAAAAKSB2VIEAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9rZXlzL2NvbXBhcmVLZXlzLmpzUEsBAh4DCgAAAAAAAAAAAEyL4qQOEwAADhMAACgAAAAAAAAAAAAAAKSB7W0EAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9rZXlzL2NvcHlCYWcuanNQSwECHgMKAAAAAAAAAAAAjoSNk4cPAACHDwAAKAAAAAAAAAAAAAAApIFBgQQAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL2tleXMvY29weVNldC5qc1BLAQIeAwoAAAAAAAAAAABLdXk4GiIAABoiAAA0AAAAAAAAAAAAAACkgQ6RBABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMva2V5cy9tZXJnZS1iYWctb3BlcmF0b3JzLmpzUEsBAh4DCgAAAAAAAAAAAJTK3autJQAArSUAADQAAAAAAAAAAAAAAKSBerMEAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanNQSwECHgMKAAAAAAAAAAAAwgnzeQkLAAAJCwAALAAAAAAAAAAAAAAApIF52QQAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL2xlZ2FjeS9sZWdhY3lNYXAuanNQSwECHgMKAAAAAAAAAAAAWsuWBq0GAACtBgAAMAAAAAAAAAAAAAAApIHM5AQAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL2xlZ2FjeS9sZWdhY3lXZWFrTWFwLmpzUEsBAh4DCgAAAAAAAAAAAKD8gCrSQAAA0kAAADMAAAAAAAAAAAAAAKSBx+sEAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9wYXR0ZXJucy9lbmNvZGVQYXNzYWJsZS5qc1BLAQIeAwoAAAAAAAAAAAAAvNZ9JTIAACUyAAA0AAAAAAAAAAAAAACkgeosBQBAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvcGF0dGVybnMvaW50ZXJmYWNlLXRvb2xzLmpzUEsBAh4DCgAAAAAAAAAAAKJ1R3y1BwAAtQcAADMAAAAAAAAAAAAAAKSBYV8FAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9wYXR0ZXJucy9pbnRlcm5hbC10eXBlcy5qc1BLAQIeAwoAAAAAAAAAAAAaBDr0zcgAAM3IAAA0AAAAAAAAAAAAAACkgWdnBQBAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzUEsBAh4DCgAAAAAAAAAAAHMpU07wPAAA8DwAAC4AAAAAAAAAAAAAAKSBhjAGAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9wYXR0ZXJucy9yYW5rT3JkZXIuanNQSwECHgMKAAAAAAAAAAAAOBBOLPUVAAD1FQAAMQAAAAAAAAAAAAAApIHCbQYAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL3N0b3Jlcy9zY2FsYXJNYXBTdG9yZS5qc1BLAQIeAwoAAAAAAAAAAAA2fzG+aw8AAGsPAAAxAAAAAAAAAAAAAACkgQaEBgBAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvc3RvcmVzL3NjYWxhclNldFN0b3JlLmpzUEsBAh4DCgAAAAAAAAAAAJBzDTOxEgAAsRIAADUAAAAAAAAAAAAAAKSBwJMGAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9zdG9yZXMvc2NhbGFyV2Vha01hcFN0b3JlLmpzUEsBAh4DCgAAAAAAAAAAAMtVOkJdDgAAXQ4AADUAAAAAAAAAAAAAAKSBxKYGAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9zdG9yZXMvc2NhbGFyV2Vha1NldFN0b3JlLmpzUEsBAh4DCgAAAAAAAAAAACpQrcg8EwAAPBMAAC4AAAAAAAAAAAAAAKSBdLUGAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9zdG9yZXMvc3RvcmUtdXRpbHMuanNQSwECHgMKAAAAAAAAAAAA0wEYOVx+AABcfgAAIQAAAAAAAAAAAAAApIH8yAYAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAAD+19dlSAQAAUgEAACgAAAAAAAAAAAAAAKSBl0cHAEBhZ29yaWMvc3dpbmdzZXQtdmF0LXYwLjMwLjIvZXhwb3J0ZWQuanNQSwECHgMKAAAAAAAAAAAA314sitcGAADXBgAAOQAAAAAAAAAAAAAApIEvSQcAQGFnb3JpYy9zd2luZ3NldC12YXQtdjAuMzAuMi9zcmMvdmF0cy90aW1lci90eXBlR3VhcmRzLmpzUEsBAh4DCgAAAAAAAAAAAHeIaj9IIwAASCMAAC4AAAAAAAAAAAAAAKSBXVAHAEBhZ29yaWMvdmF0LWRhdGEtdjAuNC4zL3NyYy9mYXItY2xhc3MtdXRpbHMuanNQSwECHgMKAAAAAAAAAAAAj8s5Pz0GAAA9BgAAJAAAAAAAAAAAAAAApIHxcwcAQGFnb3JpYy92YXQtZGF0YS12MC40LjMvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAACPIKLQ0CQAANAkAACkAAAAAAAAAAAAAAKSBcHoHAEBhZ29yaWMvdmF0LWRhdGEtdjAuNC4zL3NyYy9raW5kLXV0aWxzLmpzUEsBAh4DCgAAAAAAAAAAAK3HZm3KHAAAyhwAADAAAAAAAAAAAAAAAKSB64MHAEBhZ29yaWMvdmF0LWRhdGEtdjAuNC4zL3NyYy92YXQtZGF0YS1iaW5kaW5ncy5qc1BLAQIeAwoAAAAAAAAAAAB8VWrpmwMAAJsDAAAfAAAAAAAAAAAAAACkgQOhBwBAYWdvcmljL3pvZS12MC4yNS4zL2V4cG9ydGVkLmpzUEsBAh4DCgAAAAAAAAAAAIbDQxJjJQAAYyUAAC4AAAAAAAAAAAAAAKSB26QHAEBhZ29yaWMvem9lLXYwLjI1LjMvc3JjL2NvbnRyYWN0RmFjZXQvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAAyu4vCaYLAACmCwAAMAAAAAAAAAAAAAAApIGKygcAQGFnb3JpYy96b2UtdjAuMjUuMy9zcmMvY29udHJhY3RTdXBwb3J0L3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAAKnQ3z1CBwAAQgcAADUAAAAAAAAAAAAAAKSBftYHAEBhZ29yaWMvem9lLXYwLjI1LjMvc3JjL2NvbnRyYWN0cy9jYWxsU3ByZWFkL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAANxeljujAQAAowEAAC0AAAAAAAAAAAAAAKSBE94HAEBhZ29yaWMvem9lLXYwLjI1LjMvc3JjL2NvbnRyYWN0cy9leHBvcnRlZC5qc1BLAQIeAwoAAAAAAAAAAACpGpNguBkAALgZAAAvAAAAAAAAAAAAAACkgQHgBwBAYWdvcmljL3pvZS12MC4yNS4zL3NyYy9jb250cmFjdHMvbG9hbi90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAAC2UO1PvQsAAL0LAAAqAAAAAAAAAAAAAACkgQb6BwBAYWdvcmljL3pvZS12MC4yNS4zL3NyYy9jb250cmFjdHMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAAHMasYdtBAADbQQAAJQAAAAAAAAAAAAAApIELBggAQGFnb3JpYy96b2UtdjAuMjUuMy9zcmMvdHlwZUd1YXJkcy5qc1BLAQIeAwoAAAAAAAAAAAB+pJ/HawcAAGsHAAAgAAAAAAAAAAAAAACkgSlICABAYWdvcmljL3pvZS12MC4yNS4zL3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAAA+/rD3gi4AAIIuAAArAAAAAAAAAAAAAACkgdJPCABAYWdvcmljL3pvZS12MC4yNS4zL3NyYy96b2VTZXJ2aWNlL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAAL+V9fKpFAAAqRQAACIAAAAAAAAAAAAAAKSBnX4IAEBhZ29yaWMvem9lLXYwLjI1LjMvdG9vbHMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAA+g/tX+sRAADrEQAAJAAAAAAAAAAAAAAApIGGkwgAQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNi44L3NyYy9FLmpzUEsBAh4DCgAAAAAAAAAAAKLUnMsKAgAACgIAACoAAAAAAAAAAAAAAKSBs6UIAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTYuOC9zcmMvbm8tc2hpbS5qc1BLAQIeAwoAAAAAAAAAAADis7Hd2A8AANgPAAAuAAAAAAAAAAAAAACkgQWoCABAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE2Ljgvc3JjL3RyYWNrLXR1cm5zLmpzUEsBAh4DCgAAAAAAAAAAAD7lgF62AgAAtgIAAB4AAAAAAAAAAAAAAKSBKbgIAEBlbmRvL2Zhci12MC4yLjE0L3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAACE1ofwvxAAAL8QAAAdAAAAAAAAAAAAAACkgRu7CABAZW5kby9tYXJzaGFsLXYwLjguMS9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAACqNP2CQgwAAEIMAAArAAAAAAAAAAAAAACkgRXMCABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzUEsBAh4DCgAAAAAAAAAAADDAhnAKQAAACkAAACsAAAAAAAAAAAAAAKSBoNgIAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9lbmNvZGVUb0NhcERhdGEuanNQSwECHgMKAAAAAAAAAAAAwBoMIXk9AAB5PQAALQAAAAAAAAAAAAAApIHzGAkAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL2VuY29kZVRvU21hbGxjYXBzLmpzUEsBAh4DCgAAAAAAAAAAAKbKF2ToBgAA6AYAAC0AAAAAAAAAAAAAAKSBt1YJAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9oZWxwZXJzL2NvcHlBcnJheS5qc1BLAQIeAwoAAAAAAAAAAACThwVh0wcAANMHAAAuAAAAAAAAAAAAAACkgepdCQBAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvaGVscGVycy9jb3B5UmVjb3JkLmpzUEsBAh4DCgAAAAAAAAAAAAyZpNpgEQAAYBEAACkAAAAAAAAAAAAAAKSBCWYJAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9oZWxwZXJzL2Vycm9yLmpzUEsBAh4DCgAAAAAAAAAAANExutlGCAAARggAADAAAAAAAAAAAAAAAKSBsHcJAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9oZWxwZXJzL2l0ZXItaGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAAAMAuon9BkAAPQZAAA1AAAAAAAAAAAAAACkgUSACQBAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAAAE8mw+9h8AAPYfAAAtAAAAAAAAAAAAAACkgYuaCQBAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvaGVscGVycy9yZW1vdGFibGUuanNQSwECHgMKAAAAAAAAAAAAFMaqwYoPAACKDwAAMAAAAAAAAAAAAAAApIHMugkAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL2hlbHBlcnMvc2FmZS1wcm9taXNlLmpzUEsBAh4DCgAAAAAAAAAAAGUT/Wi5EgAAuRIAACoAAAAAAAAAAAAAAKSBpMoJAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9oZWxwZXJzL3N5bWJvbC5qc1BLAQIeAwoAAAAAAAAAAAAKtLnW4AcAAOAHAAAqAAAAAAAAAAAAAACkgaXdCQBAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvaGVscGVycy90YWdnZWQuanNQSwECHgMKAAAAAAAAAAAAEZo7UPQYAAD0GAAAJAAAAAAAAAAAAAAApIHN5QkAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL21ha2UtZmFyLmpzUEsBAh4DCgAAAAAAAAAAAFvzA2cpBAAAKQQAACYAAAAAAAAAAAAAAKSBA/8JAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9tYWtlVGFnZ2VkLmpzUEsBAh4DCgAAAAAAAAAAANAlDou8KAAAvCgAACoAAAAAAAAAAAAAAKSBcAMKAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9tYXJzaGFsLWp1c3Rpbi5qc1BLAQIeAwoAAAAAAAAAAAAy15NFwwYAAMMGAAAtAAAAAAAAAAAAAACkgXQsCgBAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanNQSwECHgMKAAAAAAAAAAAAad/d+VUyAABVMgAAIwAAAAAAAAAAAAAApIGCMwoAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL21hcnNoYWwuanNQSwECHgMKAAAAAAAAAAAAQWezeQIcAAACHAAAJwAAAAAAAAAAAAAApIEYZgoAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL3Bhc3NTdHlsZU9mLmpzUEsBAh4DCgAAAAAAAAAAAII52ZMDDQAAAw0AACYAAAAAAAAAAAAAAKSBX4IKAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy90eXBlR3VhcmRzLmpzUEsBAh4DCgAAAAAAAAAAALtXDvcfAQAAHwEAACEAAAAAAAAAAAAAAKSBpo8KAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAAD/CipPugsAALoLAAAeAAAAAAAAAAAAAACkgQSRCgBAZW5kby9uYXQtdjQuMS4yMy9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAR28qx1sJAABbCQAAIgAAAAAAAAAAAAAApIH6nAoAQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41Mi9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAACXiOBbygIAAMoCAAArAAAAAAAAAAAAAACkgZWmCgBAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyL3NyYy9pcy1wcm9taXNlLmpzUEsBAh4DCgAAAAAAAAAAAIQRv9OpEgAAqRIAACoAAAAAAAAAAAAAAKSBqKkKAEBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIvc3JjL21lbW8tcmFjZS5qc1BLAQIeAwoAAAAAAAAAAAB0DAyPVAcAAFQHAAA1AAAAAAAAAAAAAACkgZm8CgBAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyL3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qc1BLAQIeAwoAAAAAAAAAAAC7Vw73HwEAAB8BAAAmAAAAAAAAAAAAAACkgUDECgBAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyL3NyYy90eXBlcy5qc1BLBQYAAAAAZgBmABkjAACjxQoAAAA=","endoZipBase64Sha512":"ada3baff66b0b79c9d3bc7e36a72db73cbd60e4cf5884f22632d0925950774927fa890975f9fd71701ee376881102de662d26ff66886ff3f80ce729565b3f62b"};
|
|
1
|
+
export default {"moduleFormat":"endoZipBase64","endoZipBase64":"UEsDBAoAAAAAAAAAAAA7GAQQpeAAAKXgAAAUAAAAY29tcGFydG1lbnQtbWFwLmpzb257CiAgImVudHJ5IjogewogICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMSIsCiAgICAibW9kdWxlIjogIi4vc3JjL2Vjb25Db21taXR0ZWVDaGFydGVyLmpzIgogIH0sCiAgImNvbXBhcnRtZW50cyI6IHsKICAgICJAYWdvcmljL2Fzc2VydC12MC41LjEiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvYXNzZXJ0IiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvYXNzZXJ0LXYwLjUuMSIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL2Fzc2VydC12MC41LjEiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9pbnRlci1wcm90b2NvbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9hc3NlcnQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2Fzc2VydC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjcyMjI2ZGYxOWEwYzViYWEzNGU1NzQ5ZGEwMDllYjI3ZTZiYzEyMTFiNWZhMzY3YjBhYWM4N2Y3M2QzMWJhODdjYWMwMDM5NjM0ZjA2MjNjMjliMGIzZDcyYWU2MWQ5NjBjMzllM2ZjMzQ3ZWY3ZmFhODAzZDVmYTc4OGU0N2IxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImE2MmQ4N2ZiMDNhYjc4MTY0YzM0MWZhYTJmNmZjYjZlZTg3M2ZlY2RmMmM3MDA0MjQ4YjM5MzU3MDYxMDJjOWM2ODZjMTJmNTQyYjQyMDdhNzk1OThkMmUyMDVlZjVkYzJiN2YwZjRkZDVmYzBjYmFhMDBmZTdhNDNmNWQwYWU5IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL2VydHAtdjAuMTUuMyI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy9lcnRwIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvZXJ0cC12MC4xNS4zIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvZXJ0cC12MC4xNS4zIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvYXNzZXJ0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvYXNzZXJ0LXYwLjUuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2Fzc2VydC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVyLXByb3RvY29sIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbmF0LXY0LjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZGlzdC9uYXQuZXNtLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC41LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N0b3JlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3RvcmUtdjAuOC4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zdG9yZS9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjguMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZXhwb3J0ZWQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zd2luZ3NldC12YXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zd2luZ3NldC12YXQtdjAuMzAuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdmF0LWRhdGEiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy92YXQtZGF0YS12MC40LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTYuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZmFyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Zhci12MC4yLjE0IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYwLjguMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41MiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiLi9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJleHBvcnRlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjg5YTUyMGNiZjFmMWRkMDVkZjI1YzdhZjFiYWFiMTc5ZDk4OWFhMmRjYjNmZDdiZjc0YmZkZTI1OTJiMzMzODY0MmNjZWM1N2ZjM2IzYzRmMTg2NWE3YmUzMWVjMjRiZTZkNTg1OTdmYWQwZTY3NmZlMjc3MWJjOTU1ODM0MDhhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2Ftb3VudE1hdGguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2Ftb3VudE1hdGguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjYzRkN2QwMGYwNGZhYmYyNmRlMWIwNWFmMThiY2E5NzlhZDVjMjY0ZDJhNjUxMjc5ZmY0Yjg0ZTY4ODE4OTcwMDljYTQyOWZjYjAwMGI2MTU1MmZjOGRjYmFiNTQzNzQzMjYyNTcyNTRjNzRmNGFkMzZkYzI2YmE2Y2FkMTAxNSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9kaXNwbGF5SW5mby5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZGlzcGxheUluZm8uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyYjE0Mjc1Y2I3ZGNhYmI0NDk2ZTBmMDIyYjZjOTc5NWQ3NTgzM2ViODkzYzQ4MDMwZWFmNTZhZmEzOWMzODMxZWNkZjQ1OTA0YTY2MmQ5MmJlYTk3MjMyZDMyNDZkZjMwNzY5ZjI5NzFiMjFiMjYwMmM2YjgyYWZiMjY0ZTUwZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlYmVhNzRhZWYwMDgzZTVlMjNkZjEyZDkyM2Q4MWZkZmJmMWJkZjhkZDYxZjhlMzJhYzg1OGFiY2UzODFmMjMzZDFjNTRkOWU2YjE3MTRhMjliY2JhOTYxOWQ0OGJiOWE2MDcxOGVjZjYwZTA4NTFhYTIxMzI1MzZhMDIzYmNhYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pc3N1ZXJLaXQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2lzc3VlcktpdC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjdiY2YyMGNlYWRiMzU4ODMzMTVjMzdiYzY3YTdhYjA0MGQ5NzZmNGY2N2ExMTA2MTUxOWM2MzIxYmM4ZjdhM2RkNGEzMTkzZTYwOTAyZjYyMDJmMTcxZWQ5NmE3NjU5OTRiZjQ2YTI3YWQ0MTVjNDZkN2IyNWQ5MzRiNTAyM2U1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hdGhIZWxwZXJzL2NvcHlCYWdNYXRoSGVscGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWF0aEhlbHBlcnMvY29weUJhZ01hdGhIZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNWExNTJkNzMwNDhmMTQyYTFlOThhOWI0MDNhMjk4MmE0NjJkY2FiZDI2ODZmNzFlZmU0OGY5MGM3YTE3NzU2MDk3YzE5NTE5MTIzMmUzNzcwOWNhNjdiMjdkZWQ5OGQ4YjcyNTlhMmVhZmM4NDU5MGM4M2ZiOGNkODYxNTcyZWMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWF0aEhlbHBlcnMvY29weVNldE1hdGhIZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXRoSGVscGVycy9jb3B5U2V0TWF0aEhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2ZjBhODBhYzMzYTdjYTNkYzQ1ZjU2YTYzODgzMmI0MzUzNzhmYmQxMmQ2NTY2NjRjZGYxNzk0MzU2YjcwMWNiNDMxMDY3YmJiNTQzZGYzZTQ4YjIzMDMzYjFlNDE0MjY3YWEyZmJjZTUwYTBjMjAyYjlmNjZjM2ZkYjNlZDg5YiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYXRoSGVscGVycy9uYXRNYXRoSGVscGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWF0aEhlbHBlcnMvbmF0TWF0aEhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1OWU5MWU4NzU5MmVjZmY5ZjE0NWRmNTI1MTg2OTI0ODU4YWQ3OWQyNjQxNWZhZDdiNWI3MjU5Njk4YWU3ZGM1MTUzNzZhY2RkOWM1NjRkZWVjZTVhMmExYTdhZDI4YjFkYjhlNTJjMDJiOWFiMDliYzAxYTQyM2M0ZWYxNWI5YiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYXRoSGVscGVycy9zZXRNYXRoSGVscGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWF0aEhlbHBlcnMvc2V0TWF0aEhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhNjE5NmQ3N2ViZDQwMzUyNmM0ZGE4NTM2ZWVlYzM2YTExMGEzMDQzOGEwMTk4MjE5MWQ3ZWYxNjQ3NjdhZWQ3OWM2YzhjNWRiZDYzZjdkNzM4NDk5NWY5ZmZjMDZhZTgzYmJkMTg3N2FjNGI1YzFmNzAzYzIxNTcxMzIxMGJkMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXltZW50LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXltZW50LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTZkMWQ2MzRhNTZmOTdhZDNkMTAzYTQ4N2U3ZDk4OTFlNmE5MmJjMDZlYmRmZGU1NTEyMWI2NzA3ZTBjOTA5ZGQ1YWU2OGI1M2JhZTM0MDkxMmU2ZGM3YzhiNWM2MDEwZDY3MTkwZjg4MzM0MjkwNmE4YTA5ZTY1OWUzNDMyNDgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGF5bWVudExlZGdlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGF5bWVudExlZGdlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNmMzI3OThhYzVlMjU1ODdhZTY5MmI4NTAwNjYxYTkzNzYyMjIxZmYyMDhhY2E5MGE5ZDJkYmVmMjJkMTVhMjJlNGYwMmY4YjNlNDJkZjlhYjE3MGMwNDFmYTU5YjkzYTZiOTc4Mjg3NWM5MjY5MDZkZDAzYTdiNzhlYjYzNWNiIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3B1cnNlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wdXJzZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjAzOTMyZDg3NzZmZjk2MTU1ZDYzMTRhMGE4YjY5YzQ4YTQ4NWI0NmExZTVmN2NiNjE0ZDQ0Y2VlNzRmYTI0YTNjYWRkZWVlMjdkYTY2ODBkN2MzYTljNmRlNDBkNDg0MDE4YTgzOTMyYWUzY2Y1ODU1MzgzZjAxYjE1MDExOGQyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3RyYW5zaWVudE5vdGlmaWVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90cmFuc2llbnROb3RpZmllci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjc4ZTljZjZkMTkwMTNkYzQ0YTk3Mzg3Zjk2NDczYjBlZWY0YzM3MzNmZDg1OTJjM2UwNzZjYjVmZGY2YzBhZWQ4MTFlZDNmZmM4YzczMTQwZjcxMjNkNWNjYmUyNDVkY2EyYzE3NTU3YTNhYjlmZGE1NTAwNGJiMGVhNGEyOGI2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVHdWFyZHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVHdWFyZHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYmVjNDg1OGNmN2M5YjUyN2MxN2Y4NDE5NTkxZTBhOTQ4ZjYxYzU2OTI4ZjU2ZjgzYWZlMWViOWQ5ODJiYjgxYWMzNTIzZTRhMTg5NmZiMzdiM2NiM2JmMDJkNGU5ZWViY2NmYTQxZmRhYmFkM2Q3NzU0MTQxOTBjOTU1ZmNiMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy1hbWJpZW50LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy1hbWJpZW50LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiN2YyMDZmYzZkZGNlMTAzNmM1ZWE2NTE2YWQyMWU5MmUzZmZlNzFhYjU1Zjg3Y2NiMjY0ZGRlYzNlNGQwNTI1YTFlYjI5M2MzN2FkMTdjOTJmYzc3ZTEwMjk0ODcwYjlkNTkyMjRmODBkM2MzNmU4OWNiMzBiZTYxZjlkMGM4N2MiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvZ292ZXJuYW5jZS12MC45LjEiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvZ292ZXJuYW5jZSIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL2dvdmVybmFuY2UtdjAuOS4xIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvZ292ZXJuYW5jZS12MC45LjEiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9hc3NlcnQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9hc3NlcnQtdjAuNS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvYXNzZXJ0LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvZXJ0cCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2VydHAtdjAuMTUuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlcm5hbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjIuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbmF0LXY0LjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZGlzdC9uYXQuZXNtLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC41LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N0b3JlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3RvcmUtdjAuOC4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zd2luZ3NldC12YXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zd2luZ3NldC12YXQtdjAuMzAuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdmF0LWRhdGEiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy92YXQtZGF0YS12MC40LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3ZhdHMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy92YXRzLXYwLjEzLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvem9lIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvem9lLXYwLjI1LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy96b2VTZXJ2aWNlL3pvZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jYXB0cCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jYXB0cC12Mi4wLjE4IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE2LjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ZhciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9mYXItdjAuMi4xNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MC44LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vZXhwb3J0ZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiZXhwb3J0ZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4OWE1MjBjYmYxZjFkZDA1ZGYyNWM3YWYxYmFhYjE3OWQ5ODlhYTJkY2IzZmQ3YmY3NGJmZGUyNTkyYjMzMzg2NDJjY2VjNTdmYzNiM2M0ZjE4NjVhN2JlMzFlYzI0YmU2ZDU4NTk3ZmFkMGU2NzZmZTI3NzFiYzk1NTgzNDA4YSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy1hbWJpZW50LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy1hbWJpZW50LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYzFmNWU2ODllMjc2MjM4ZWM2NTE5OGEwMzllYTZkN2FhNGZjNjJmMTZkYmY3Yzc0YzA5Yjk4Yjg2ZmUwM2IwZTk2MDI2ZTk4ODZlZDAxOGZkN2U5ODQ4ZWE2OWE0M2VmYTZlNmQ0N2FkNDhkOGJjMTkyYTA5NTU4NWQ1NTJkZmQiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMSI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbCIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjEiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvYXNzZXJ0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvYXNzZXJ0LXYwLjUuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2Fzc2VydC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2VydHAiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9lcnRwLXYwLjE1LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2dvdmVybmFuY2UiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjkuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvZ292ZXJuYW5jZS9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2dvdmVybmFuY2UtdjAuOS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9leHBvcnRlZC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVyLXByb3RvY29sIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXJuYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4yLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25hdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25hdC12NC4xLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2Rpc3QvbmF0LmVzbS5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zdG9yZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjguMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3dpbmdzZXQtdmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3dpbmdzZXQtdmF0LXYwLjMwLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N3aW5nc2V0LXZhdC9zcmMvdmF0cy90aW1lci90eXBlR3VhcmRzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3dpbmdzZXQtdmF0LXYwLjMwLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy92YXRzL3RpbWVyL3R5cGVHdWFyZHMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy92YXQtZGF0YSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3ZhdC1kYXRhLXYwLjQuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdmF0cyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3ZhdHMtdjAuMTMuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy96b2UiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy96b2UtdjAuMjUuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL3pvZVNlcnZpY2Uvem9lLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvem9lL2V4cG9ydGVkLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvem9lLXYwLjI1LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2V4cG9ydGVkLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvem9lL3NyYy9jb250cmFjdHMvZXhwb3J0ZWQuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy96b2UtdjAuMjUuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2NvbnRyYWN0cy9leHBvcnRlZC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3pvZS9zcmMvdHlwZUd1YXJkcy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3pvZS12MC4yNS4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvdHlwZUd1YXJkcy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9idW5kbGUtc291cmNlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2J1bmRsZS1zb3VyY2UtdjIuNC4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYnVuZGxlLXNvdXJjZS9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9idW5kbGUtc291cmNlLXYyLjQuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZXhwb3J0ZWQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYnVuZGxlLXNvdXJjZS9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYnVuZGxlLXNvdXJjZS12Mi40LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jYXB0cCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jYXB0cC12Mi4wLjE4IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE2LjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ZhciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9mYXItdjAuMi4xNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MC44LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjQuMS4yMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY0LjEuMjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41MiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3NoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41MiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lY29uQ29tbWl0dGVlQ2hhcnRlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZWNvbkNvbW1pdHRlZUNoYXJ0ZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4OTM5YzdiZjM5ZTBlOTg4NTI1MDlmNjJlODM0YjkyMWY2ZTdjMDU4Mzg5M2M3YzY3MTc2YWIxNmQ3OGZjZjZhZTg4ZDIyODVlNjVhZDY5YjQ0OGFkZGJmYWJiMjczZTMyODY0NDU2NDI5ZTI4NGFmMTkyYTNiMDBhYjczNDQ3NCIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy9pbnRlcm5hbC12MC4yLjEiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvaW50ZXJuYWwiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4yLjEiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4yLjEiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9pbnRlci1wcm90b2NvbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTYuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYwLjguMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41MiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29uZmlnLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb25maWcuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxZTRjZWYxMDVhNTdhYmI5OGJiOGM5ZDNiNDhlZTYwZDY3ZTJlMWZjODYwNmRhNmJkOWVmZGJkODI2ZmYwNWEyNmUwZmY2M2U0MTUwNzNhNzM2MjkxZTVlYzVkMWQ1MjFmMDNjODExODlhNjljYWMwZDUzZjhhYmZjMzY3NGQyMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxNTg0NDgxZjk4YzYxMzhkMGRjMmU5ZGY0MmVmNzE5MThjZTQ4ODMzNzQxMDVjMzk1ZWQ2NjNjMzBkOWMzOTg3NTNkMDliYmIyMTliZTA5OWZhMWFhYTAwOTUwZTkwMTg5MzdkMGM0NmJkOGJkODkyNDE1MWRhYTQ0MTgxNWNkZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy91dGlscy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdXRpbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2OGE5OGNlNzA4OGM4YTUwYmZlYzM4YjFlMmM0NDZmNTcwYmM1NjU5MmRkMDExNDI3NDhkNzIwZGFlZGExNWY2NzI5Y2E1YmVhYThhMWQ5OGNiMjJiMmU3NDhiZTU3YmUxODQyM2VkNGE2ZGM0Y2U3YjVjYmJjNDAxYzIzMmEzMyIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy9uYXQtdjQuMS4wIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL25hdCIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL25hdC12NC4xLjAiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy9uYXQtdjQuMS4wIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9kaXN0L25hdC5lc20uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiZGlzdC9uYXQuZXNtLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNjJjZTRmYjYxN2U1NDhhMjRiZTQwNzQyNDFhNDNmZDlkMjNmNTc5OTE0MDEzMjc0ZTA2NjA3OTc0ZGI4YWMwMTAyYjkzNzgwODIxYmJmNmQ0OTRjOTVhZGM1NGNhMjE0N2IxMjU4NWFkODk2MmIzMDQ5ZjQyOGMxZDk5YTIwMmUiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvbm90aWZpZXItdjAuNS4xIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL25vdGlmaWVyIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvbm90aWZpZXItdjAuNS4xIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvbm90aWZpZXItdjAuNS4xIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvYXNzZXJ0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvYXNzZXJ0LXYwLjUuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2Fzc2VydC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVyLXByb3RvY29sIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXJuYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4yLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N0b3JlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3RvcmUtdjAuOC4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zd2luZy1zdG9yZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N3aW5nLXN0b3JlLXYwLjguMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL3N3aW5nU3RvcmUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zd2luZ3NldC12YXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zd2luZ3NldC12YXQtdjAuMzAuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdmF0LWRhdGEiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy92YXQtZGF0YS12MC40LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTYuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYwLjguMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41MiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiLi9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJleHBvcnRlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjg5YTUyMGNiZjFmMWRkMDVkZjI1YzdhZjFiYWFiMTc5ZDk4OWFhMmRjYjNmZDdiZjc0YmZkZTI1OTJiMzMzODY0MmNjZWM1N2ZjM2IzYzRmMTg2NWE3YmUzMWVjMjRiZTZkNTg1OTdmYWQwZTY3NmZlMjc3MWJjOTU1ODM0MDhhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9hc3luY0l0ZXJhYmxlQWRhcHRvci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImFlOGFhZmRiMjQzYzc5MWQwZGUxOWQ0MDhiOGVmNGZjOTgwZDBhMjA5YjE4YTdjZjNiYjQxODdmOGNmODg3ZmYzZTdhZjcxYjIzOGFhZGI2MTU0NzBmMTZmYjk2NWU5MjUzMDIyMzVjNWQxOTcwYWEwNTY5NzdmNzRiNDcyNTA0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImUwNGE4MDI0OTY3MGY1OGY1YWEzYzFlZDY2ZmU0NWM4NDA2ZTQwZmFiZjdmN2Y0ZDA1MDFkYzE3OWQzY2M0MmU1ZDk2Y2RlMmM3NzhhNDg3NzZjOGQxMjI4MDc5NGI5MmJjNjI1MzdmN2IxMDczYzY5MjE3NzYyOWFlNDhlMmEyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL25vdGlmaWVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9ub3RpZmllci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImI0ODgwZmJmYmIxMTk3MGI5YTM1MTc0NGJkNWY0Yzc2NzEyZDNmZmU5OGI0Mzk1NTE3YTcyOWYxYjk0MGE4OWVlMmIzNTJlNzJkZGIwOWY0NTk2ZjA1NWM3YWFiZjk5Njk4ODdkNDljMWZjY2ZkZjc4OThmNWU0YWI4ZDY3ZGU5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3B1Ymxpc2gta2l0LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wdWJsaXNoLWtpdC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjU5NmU1MjIzZGFkMDUyMGMwMDNhMTlkODJhMTBkNmI0OWJmNzYwYzI5NDU5M2VhNDVjOGJhZGMzODZlYmEzMmVkMDZjMTBlMmJjNWI3YTU3NzEwNjBkNTFmMzVmMmQxYjUwZjM3MjZlYjZmNmM1YjBkMTJmNmIzZjdhMjFkZWNmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0b3Jlc3ViLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdG9yZXN1Yi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImY2ZDgyODZmZWUzMWI1MDYyNjkyMGFlMmI0ODk1YTkzMTQ2OGQwMGMxMzAzYWU2ZGE1YWUxZGE3N2MyOTIwYmQxYTM0NGE4MzcxN2M4YzFkNjY3YzU5MzU4NmFlYzM4N2JiMGE1NDgzOGM5ZjdiODUxZjRlZjNlMjVlZjFlYjkxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N1YnNjcmliZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N1YnNjcmliZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjZWVhMjk5NGFhYTM1OGUxZWJmMjNjZTYwNjcwYTI4NDBmOTMwYTQ1NWM2MjI4MWI2ZjY5Y2Q1MjVlMDFjYTc4NzdlZmIxOTQyZjZjMTYwZjM4OTUwOTEyMjBjM2M1Y2E5MzhjODU1OWQzMTNlNWNhOGFmNDI5NmI0ZjI0MjZlMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy1hbWJpZW50LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy1hbWJpZW50LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMmU4ZmQ5NTU5OWI3NjEyMTYxNTYzYzQ1MTExMjViMTg3MzE2NTdkODU3NDVhMDE2NTJmNmY0YWUxY2I3YmVkOGQyM2RkODFjYjU4MzNiOWQxODhjZWJkMjJiYWE0YzU1ZGIwNTk5MTJhODMzZjBkOTIzYmY1ZGM1MTA2ZDRjYTEiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvc3RvcmUtdjAuOC4zIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL3N0b3JlIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvc3RvcmUtdjAuOC4zIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvc3RvcmUtdjAuOC4zIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvYXNzZXJ0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvYXNzZXJ0LXYwLjUuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2Fzc2VydC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVyLXByb3RvY29sIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXJuYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4yLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTYuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYwLjguMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbC9zcmMvaGVscGVycy9lcnJvci5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYwLjguMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2hlbHBlcnMvZXJyb3IuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41MiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGZhc3QtY2hlY2svYXZhIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBmYXN0LWNoZWNrL2F2YS12MS4wLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2xpYi9lc20vYXZhLWZhc3QtY2hlY2suanMiCiAgICAgICAgfSwKICAgICAgICAiQGZhc3QtY2hlY2svYXZhL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZmFzdC1jaGVjay9hdmEtdjEuMC4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiLi9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJleHBvcnRlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImYyOWZlMzUzMDVmODA3ZGEyMzVmMDY4OGQzYjY1ZTM1MTAzOGRmYjU3NDBjZjcyODFjMjBjNDUzODI1ZjgzYTA2Njc3Njk2ZDNiZTJjMDE4NGJmMmQyNTA4MWEwOGI5MjkwZGVlYzY5YTM5Zjg4NjI5MDAxN2NjODJiYjA0YzZlIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImUxYWVhZmU1MzFiYTk1NzAxNThhMzhhNWNmZjk5YzJkZmExZjg5MzAyYTFkYzJjNjE1YTBiNWZmMjlkZDgzMmJiNTk0MmNiMjQwZDAyNTQzYTYzNjIyZTQ5ZTk2OThiNzk2N2RlZGU1NDljZjRhNmYxNWZiODkyMDA4NjVjYzk4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tleXMvY2hlY2tLZXkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMvY2hlY2tLZXkuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0YzhjZmU1OGNlOTdiYTY1YWQwZjhiZDdiMDdjMTcxZDQ1NzAyM2RiZDYwNTMyMTI1NWVmZmRiNDdiYzVkMDAxZTE3ZDE2MTFiYzczOWZlZmFhNjYxNGI1MDA1NGJkOTgxOWI3N2QyNzc4MjA2NDFiMmU3MTY2ZTdkNTFlYjg2NyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9rZXlzL2NvbXBhcmVLZXlzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9rZXlzL2NvbXBhcmVLZXlzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYzYwZDk5ZGM1NTQyM2RkN2ZjNGM5NWUzYTdiNjFjMmIxZGYyMzgwMTdkMDk0NDQ3ODNjZmU1MDI5NzFmNTcxODdkYmI5MDEwMTNlNTUwOTFlMWEzMGVmNzdmMjBiYjFmZWYwNGNiZDkyZmViMmQzZjYyZDIzOGJhMjU5NTU0Y2IiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMva2V5cy9jb3B5QmFnLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9rZXlzL2NvcHlCYWcuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlMmE0ZjZiMWQ0YTI4ZGZkYmYwOTlhYWE2ZTIyYzBiMjczZTExYzAwNDMyN2IzZjExMmQ4Mjk3NzA3NmM3ZWQwY2Y0N2RmMDE0ZWU1MDIzNTNhNjVlNjgyNTRmMzhiYjFlYTUyNGRkZjYzZmQ0NTUwYzBjZjQ5N2MyNmRkMmMxOSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9rZXlzL2NvcHlTZXQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMvY29weVNldC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjhhODFiOGQxNjdhOWQ4ZWFiOWQxYzk0Nzk0Y2UwNTExOTI3ZTg3YjlkNjJjZDEwZTBhOTk3Y2VmODNiMzcyODAzODE5NDZmNDMwYzc4MmUxODYyNGRiN2ZkYjE0ZmVmMDUwMDc2MDdlNmQ5MTM3MzNjMGZlNjcyNTBiY2Q4NzczIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMva2V5cy9tZXJnZS1iYWctb3BlcmF0b3JzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNmJiZjk3NDJjZWY0NTc1ZjUxZmUyNDgwYTU5ZTQ1YzYyOTMxNjgwOWE4NzdkZTMwZGM1YjM1YjEwZjEwNTViNjFiMTQ1YzM2MmU2Yjg0MTJjZWVkYWIxNTI4OTI4M2YwN2FhNmZjZDg5NjVlMmJiMGRmZjlhNGYwYzE5NjFkZDUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMva2V5cy9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1NTNiODg1ODc0MmM0MmU2NDgzYzRmYWU3ZTk0N2Y3YWZkYjFlZGY2YjQwMGU4MjE1ZmNhMWQ0NzFmNDFmZDMyZTliNDljYTdiMTE0ZmU5OWRkMWQ1NmI2OTRiMjhmZDBkOTg5MTYzYzIyN2ZkNzllZjMwYWNlMzA4YmE1MzcwMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9sZWdhY3kvbGVnYWN5TWFwLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9sZWdhY3kvbGVnYWN5TWFwLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZThkYmFiYTFhOGE2M2FjMGYwMDE0YzFiNDhmNTZjZDM0MjE2YWYzMzRjM2ZlODI4M2Y2MzM4YzlhNjdmZWY0ODQyODA5ZDkwMTMyNmE5ZWFmMDVhZDY4NGY0YTRiMDM3YjUzZTNhOTBmOGJiMGE4YmRkNTg3MjJiMGYwMTAzYjYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbGVnYWN5L2xlZ2FjeVdlYWtNYXAuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2xlZ2FjeS9sZWdhY3lXZWFrTWFwLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNjRmYTEwNTY5Mjc3Y2Y2NzMzOTA3ZmRiMjQ1ZTliZWYyMmE4ZmU3ZTc5Y2EwNWJlZGY3ZDU4YjllYzU1MjZjMzhjMWE5MGUzZDgyYWRiZWJkY2M5NTExZGY5ODM0YzEzMGRlZmNkM2RkOWQyMGYxNDJhMDY2YjBmMjNlOGVjYmMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGF0dGVybnMvZW5jb2RlUGFzc2FibGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BhdHRlcm5zL2VuY29kZVBhc3NhYmxlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2NmZGJlMjgwZmY0ZDVhZTMzMzliMmQ5OTg2NjhiNjc3NDE2MjU4MTQ2N2RjOWE1YzRjYmFjMGI1MjQyN2U0OWJjMzM0ZTljY2E0MzkyZDgzMzFmMWZkNDIwMGQ4MzRjMzFjMDUyZTVlN2RlOGEzZjlmMDYwYzJmYmI3NDA4YzQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGF0dGVybnMvaW50ZXJmYWNlLXRvb2xzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXR0ZXJucy9pbnRlcmZhY2UtdG9vbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxYTgxNzJlMmFmZjViY2VlZTQ4YTBmZGMxZDYyZmRhMzk5NGZkNmQyOGM5ZGFlNmY3NjQ4NWQxYzFiMTk2N2NlNGQyYTAxOTQzMzFkMzU1ZDM5NzdhMDE1NGViYWY2ZjRlNWJkODJjOGIwOGFiNWQ1NWRhNGQyMGEwNWUzZjdhMiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXR0ZXJucy9pbnRlcm5hbC10eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGF0dGVybnMvaW50ZXJuYWwtdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0MzVkMjY4NWExY2Y2MDliZWU1OTAzYjIyMTZhZWUzN2M4MDdmZTRlMWFjYzUyOWZmZWVjNWYyNTI5NjI4NGYyZGVmNTY2MTZkZTczNmJiMmQ1NGIxZjY1MzE2ZmI3YzU5ZDJiYzk4NjZhYzJiNTYzM2JlMDJhYTM3ZTI5MzNkMiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImMwY2VhYzBjYTk1ZjNjZWU5NDEyYjYzNWUwZThlZjFlN2JlNzYyZjdkZWEyMTNjNDA0ZjQ1ZWVmNGQ1MDAyNWMxOWE4MWY4YjUxZjEyOGZkZjQ0NDY2YTlkZTViYWViZTQzMTkwM2IxZGI3NjI5ZjZhMWY3ODdhMzc0MzhmNWNiIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BhdHRlcm5zL3JhbmtPcmRlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGF0dGVybnMvcmFua09yZGVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDNkZmRkMDJiNGRkMmJlZjE1ZTk3YmU3NmNkYmUyZWM4N2EzNzM2ZGRkNDNmNzU3Mjk1ZjNlN2QwZGE1YmJiZGFkMjAyMGE3OWY0YzkwMDEyMWJhZDljYjU5ZmNlZDdhMzZjMjUzZWU3MWU5MGIxODMzMGMzMGI2MTYzMWFlYmYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RvcmVzL3NjYWxhck1hcFN0b3JlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdG9yZXMvc2NhbGFyTWFwU3RvcmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjZGI3MzdmZGNjOWRkMzBiNTYyMjI2OGRkMmNkMDU0NTQ5MTFhYmVkMDU4YThhZjRkYzUxYzRmYTU0M2EyN2MyNWM4NTAxMjBjNmVmZTY1ZTQxYWM3NTFjNTg1NGVkOGYxNzhkOTNiMjY0ZGJjOTU3ZTJiNmUxMDkzZjFhMWVhNyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdG9yZXMvc2NhbGFyU2V0U3RvcmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0b3Jlcy9zY2FsYXJTZXRTdG9yZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjFlODY1MWUxZWNjZDJiYjcxOTE0NDM1MWU0NDgwZWM1ZmY3NWE3ZjgyMDQxNmExZDQ3ZGYzNWMzMWIzZTVhNTBmZmIyMDRhNDE5OWNlY2I1NmQ5MTBjN2VlOTkzMjc1NTY2MDE1MmYxNThhNGEwZmJjYjc3OTZiY2JkOWYzNzg4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0b3Jlcy9zY2FsYXJXZWFrTWFwU3RvcmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0b3Jlcy9zY2FsYXJXZWFrTWFwU3RvcmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyZGU5ODg3NWRiNzBkOGMyZGQxOGYzMDk4YTQ4NWZkOGMxZTI2OWQ2ZTFkNDY5NjQ1YzRiNTI2MTBlYTY4N2JmMDQ1OWFhYzZjMzA3NDRhNjU0ZjY5MTJmMzk4OGQzMThiMWI4NzM3ZDc3NDBmY2IzYTY2ZmQzMDgwNzdhZmU3YSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdG9yZXMvc2NhbGFyV2Vha1NldFN0b3JlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdG9yZXMvc2NhbGFyV2Vha1NldFN0b3JlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYmI1NDA3OGNhMGNlMTA4MTE1NWUxMjU4MGFlYTUzZGQyNzU0MzRlNmYxODkwMWQ2MWJlNTc4ZDRmMDg4MmQ5NTIwYzJiN2U0NWViZjUwMmI3NDhkZWU4MDVhODBhMjEzZGM3ODczMzgwZGIxN2FiZTJkNjY2MTA5ZGFjMGU4YjQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RvcmVzL3N0b3JlLXV0aWxzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdG9yZXMvc3RvcmUtdXRpbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4OTZhMTExNWQzMjI0ODU0MjlmODhjNmQ1MDIxM2FmNDgwNGExODZlODIzNDFiY2NkMDdjYWEzYTVlMzBkYWYxNTA2MDIzODc1ZjMxYmZiYmU2YWU4OTJhNWMyY2E3YmEwOTY2NDRjZDNjMzM5MjJkNzljZTQxMTEyYjRlZDgwYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyNmMwMDZiYmU1NTE3ZDM5Y2Q1YzlmMzhhYTRhN2M2YTI3ZDFjNGFlOTAxMTA2NDU2NjBkMDhhMDUxM2NkNGMyY2Q0ZjgyOTMwNDViYzg5NmQ5Y2NkN2RkODI0OTZhNjgxODNmNGFiYmU0ZmNjYjRmZDA2OGE0YmMzMDZkMTJjZiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy9zd2luZ3NldC12YXQtdjAuMzAuMiI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy9zd2luZ3NldC12YXQiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy9zd2luZ3NldC12YXQtdjAuMzAuMiIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL3N3aW5nc2V0LXZhdC12MC4zMC4yIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvYXNzZXJ0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvYXNzZXJ0LXYwLjUuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2Fzc2VydC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVyLXByb3RvY29sIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXJuYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4yLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25hdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25hdC12NC4xLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2Rpc3QvbmF0LmVzbS5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zdG9yZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjguMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3dpbmctc3RvcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zd2luZy1zdG9yZS12MC44LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9zd2luZ1N0b3JlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdmF0LWRhdGEiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy92YXQtZGF0YS12MC40LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3hzbmFwIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMveHNuYXAtdjAuMTMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Jhc2U2NCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9iYXNlNjQtdjAuMi4yOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYmFzZTY0L2F0b2IuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYmFzZTY0LXYwLjIuMjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2F0b2IuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYmFzZTY0L2J0b2EuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYmFzZTY0LXYwLjIuMjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2J0b2EuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYmFzZTY0L2RlY29kZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9iYXNlNjQtdjAuMi4yOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZGVjb2RlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Jhc2U2NC9lbmNvZGUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYmFzZTY0LXYwLjIuMjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2VuY29kZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9iYXNlNjQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Jhc2U2NC12MC4yLjI4IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYmFzZTY0L3NoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYmFzZTY0LXYwLjIuMjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYnVuZGxlLXNvdXJjZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9idW5kbGUtc291cmNlLXYyLjQuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2J1bmRsZS1zb3VyY2UvZXhwb3J0ZWQuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYnVuZGxlLXNvdXJjZS12Mi40LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2V4cG9ydGVkLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2J1bmRsZS1zb3VyY2UvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2J1bmRsZS1zb3VyY2UtdjIuNC4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY2FwdHAiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY2FwdHAtdjIuMC4xOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NoZWNrLWJ1bmRsZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jaGVjay1idW5kbGUtdjAuMi4xNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY2hlY2stYnVuZGxlL2xpdGUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY2hlY2stYnVuZGxlLXYwLjIuMTQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2xpdGUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY2hlY2stYnVuZGxlL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jaGVjay1idW5kbGUtdjAuMi4xNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIvYXJjaGl2ZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9hcmNoaXZlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci9idW5kbGUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjguMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vYnVuZGxlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci9pbXBvcnQtYXJjaGl2ZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbXBvcnQtYXJjaGl2ZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIvaW1wb3J0LmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MC44LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2ltcG9ydC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIvbm9kZS1wb3dlcnMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjguMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vbm9kZS1wb3dlcnMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE2LjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ltcG9ydC1idW5kbGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vaW1wb3J0LWJ1bmRsZS12MC4zLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9pbml0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2luaXQtdjAuNS41MiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vaW5pdC9kZWJ1Zy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9pbml0LXYwLjUuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2RlYnVnLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2luaXQvbGVnYWN5LmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2luaXQtdjAuNS41MiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vbGVnYWN5LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2luaXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2luaXQtdjAuNS41MiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2luaXQvcHJlLWJ1bmRsZS1zb3VyY2UuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vaW5pdC12MC41LjUyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wcmUtYnVuZGxlLXNvdXJjZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9pbml0L3ByZS1yZW1vdGluZy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9pbml0LXYwLjUuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3ByZS1yZW1vdGluZy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9pbml0L3ByZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9pbml0LXYwLjUuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3ByZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjAuOC4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY0LjEuMjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NC4xLjIzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41MiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vc2VzLWF2YSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9zZXMtYXZhLXYwLjIuMzYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Nlcy1hdmEvZXhwb3J0ZWQuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vc2VzLWF2YS12MC4yLjM2IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9leHBvcnRlZC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9zZXMtYXZhL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9zZXMtYXZhLXYwLjIuMzYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby96aXAiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vemlwLXYwLjIuMjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3ppcC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vemlwLXYwLjIuMjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby96aXAvcmVhZGVyLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3ppcC12MC4yLjI4IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9yZWFkZXIuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vemlwL3dyaXRlci5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby96aXAtdjAuMi4yOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vd3JpdGVyLmpzIgogICAgICAgIH0sCiAgICAgICAgImFueWxvZ2dlciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJhbnlsb2dnZXItdjAuMjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vYW55bG9nZ2VyLmpzIgogICAgICAgIH0sCiAgICAgICAgImF2YSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJhdmEtdjUuMC4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9lbnRyeXBvaW50cy9tYWluLm1qcyIKICAgICAgICB9LAogICAgICAgICJhdmEvZXNsaW50LXBsdWdpbi1oZWxwZXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiYXZhLXY1LjAuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZW50cnlwb2ludHMvZXNsaW50LXBsdWdpbi1oZWxwZXIuY2pzIgogICAgICAgIH0sCiAgICAgICAgImF2YS9wbHVnaW4iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiYXZhLXY1LjAuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZW50cnlwb2ludHMvcGx1Z2luLm1qcyIKICAgICAgICB9LAogICAgICAgICJpbXBvcnQtbWV0YS1yZXNvbHZlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogImltcG9ydC1tZXRhLXJlc29sdmUtdjEuMS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJtaWNyb3RpbWUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAibWljcm90aW1lLXYzLjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXgiCiAgICAgICAgfSwKICAgICAgICAic2VtdmVyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlbXZlci12Ni4zLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NlbXZlci5qcyIKICAgICAgICB9LAogICAgICAgICIuL2V4cG9ydGVkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImV4cG9ydGVkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMTNmYzY2YTlmMGFhN2YwZTBmYzVkNGFkMDQ3NGZlNThiMTRkOWQ0N2ViMDU4ODQ0MjFjYWE4NGZiZGM2MjZjMWZjYTZkYTA4M2MxNTVhZWU0YjJiNGE2ZjRjN2QwNjJlZjU0ZTNkZDdlNWEyNzEwNjBiNmZmNmNmYTM3MDQ5MmUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdmF0cy90aW1lci90eXBlR3VhcmRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy92YXRzL3RpbWVyL3R5cGVHdWFyZHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyZjQxMDg3Y2ZkZjllN2U0ZjIzODBhOTM2ZmQ1NTVmYmQ2ZmRjNTAwZTgyNzY3MzUzNDc1MDkxNTdiYjAxMDAwOTg3YmU0OGQ1YzNmM2I0ZTMzODVhYzhhZGVjMDhjMTdhOTNjZDBmY2IwYzBkMzI2ZjhiODgwNWUwMDI1OWFjNyIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy92YXQtZGF0YS12MC40LjMiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvdmF0LWRhdGEiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy92YXQtZGF0YS12MC40LjMiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy92YXQtZGF0YS12MC40LjMiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9hc3NlcnQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9hc3NlcnQtdjAuNS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvYXNzZXJ0LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlcm5hbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjIuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3RvcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC44LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9mYXItY2xhc3MtdXRpbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2Zhci1jbGFzcy11dGlscy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImZlMWU0ZDFmZTNhNzJkNWI1YzllNzU1OTRhMDk5YmMzOGIyNjgxNmQyOGYxMGM0ZDliMWI0MDhmMjE0ZThhNmY5OTU2NmQxZjE4YmY4MDhmMDhlMDBkYjNiNDk5NTcwMDNmYjg0MjhkNTUxZmQyNGNlZjJiODYwYjI4ZTZjN2E0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImYwNGNjNDE2OTVmN2QyZDJkZTFhZTY5M2E1M2M4OTk0ZTUxZWExYTFhMjNlOGY4YjEyMDFjNzQ1MDljNTgyNWI0NDMzNGYyNWNhOTdiMDQ4OWI3MzgzZTQyNmZkM2I3YWU0ODVmMmNhMWI0YzE0MzNiMTViN2FkNDM2ZTY2N2U4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tpbmQtdXRpbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tpbmQtdXRpbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIwMDU5YWE1YTQ3NTg4ZDAwZTVkODUwMzg0MjdkOTM4NjhjMzg2OGEyZjJjNjA1MGNkYThhZDg4M2QzNDU2NDk4Nzc2ZjQ0ZTQwY2JiNmViZDI2MTkzNjEyZmQ2YWQ3ODc5YjgxMjAwMWUzZTUzMjM1ZWFjNmY1NjJiNTY1ZGU2YSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy92YXQtZGF0YS1iaW5kaW5ncy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdmF0LWRhdGEtYmluZGluZ3MuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyYTYwMmE5YTJkOTI3YmYxODViN2M5M2Y0NjViMTdjMzk1NDVmNTkyODBlNTU4YjBkNGVjMzFlYzRjYjZlYTQxMDA1MTc5YTlmNTg2ODk5NzVhNDM5ZjkxOWU0MzU2MDJiYTUwNTI4ODVjMzZlYTVlMjk4ZTcwMzU4NGQwYWRlNiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy96b2UtdjAuMjUuMyI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy96b2UiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy96b2UtdjAuMjUuMyIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL3pvZS12MC4yNS4zIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvYXNzZXJ0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvYXNzZXJ0LXYwLjUuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2Fzc2VydC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2VydHAiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9lcnRwLXYwLjE1LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2VydHAvZXhwb3J0ZWQuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9lcnRwLXYwLjE1LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2V4cG9ydGVkLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlcm5hbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjIuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbmF0LXY0LjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZGlzdC9uYXQuZXNtLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC41LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyL2V4cG9ydGVkLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9leHBvcnRlZC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N0b3JlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3RvcmUtdjAuOC4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zdG9yZS9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjguMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZXhwb3J0ZWQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zd2luZ3NldC12YXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zd2luZ3NldC12YXQtdjAuMzAuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3dpbmdzZXQtdmF0L2V4cG9ydGVkLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3dpbmdzZXQtdmF0LXYwLjMwLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2V4cG9ydGVkLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3dpbmdzZXQtdmF0L3NyYy92YXRzL3RpbWVyL3R5cGVHdWFyZHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zd2luZ3NldC12YXQtdjAuMzAuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL3ZhdHMvdGltZXIvdHlwZUd1YXJkcy5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3ZhdC1kYXRhIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvdmF0LWRhdGEtdjAuNC4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy92YXRzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvdmF0cy12MC4xMy4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9idW5kbGUtc291cmNlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2J1bmRsZS1zb3VyY2UtdjIuNC4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYnVuZGxlLXNvdXJjZS9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9idW5kbGUtc291cmNlLXYyLjQuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZXhwb3J0ZWQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYnVuZGxlLXNvdXJjZS9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYnVuZGxlLXNvdXJjZS12Mi40LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTYuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZmFyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Zhci12MC4yLjE0IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vaW1wb3J0LWJ1bmRsZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9pbXBvcnQtYnVuZGxlLXYwLjMuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MC44LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vZXhwb3J0ZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiZXhwb3J0ZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmZDI1NTE2NmUyNDhkODMwOTdkZjg4MTc2YmE4YjI1YTU5YzBjYjI4OTIwY2U2YmM0YjhlNWZiMGJlNGI0MzY5MzYxYjQwZWQ1YWJkMzk1NDQxOTE2ZWRiZDQzMGI3MDFlYjlkZmRkY2QxMWEzNWRmOWJlNDE4OWQ1YjYwOTlmMiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdEZhY2V0L3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdEZhY2V0L3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYzc5NGFlMTg2YTZhNjE1YzVhNTM3Njg5YzU1MzZmNmNlMjgxMjUxMGQ4NWRhYTE2YTA3Mzg0NGMzZmEzZTUwMWU5OGIwNWQ4YTljYmUxODRmYzgzZjExZTZiY2NiYzJkYjFjMTYyM2IxMDZkYzNkM2EzNjI3ZjJlN2E2ODY0NTQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RTdXBwb3J0L3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdFN1cHBvcnQvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIwMTJmOTRhMDAyZjEwYzhhZWNjNWViZmFiYzViMjExYWZhN2Q2NWY1MGMyYWNhZDY4NDIyZGFjMTFkOWVkMjg4MGMzZGVjYTMwNDJkNDJjMzVjYmY4MzZkYWM0NjQ3N2U0ZTk3ZGU5ODVmMDY0ZjJjYTgyMjBiYWU5ZDdjNWYxNCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdHMvY2FsbFNwcmVhZC90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RzL2NhbGxTcHJlYWQvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiNTc1MDAwMjk1Yzk1MzkzN2YxMGZiNWUzODNjODQzYmM3MTY0YTQ5MDc1YzUzZTE5Y2JhNDQ1YzFmZDVlNDFmZWEzMmQxYzI3NWFmNTRjNGNhZDFjNDlmNGE3NzE2YTljODU0MDYxMjY3YmY3MGQ1NzRlYmNhZWQ4ZDFjOTJiYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdHMvZXhwb3J0ZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0cy9leHBvcnRlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImM0NjUxOGZkZjFjODVhMzljZjBmNTdkZTFlMWJhNmE3N2FjMTY3ZTMyYTg0YTVlMjg3OGQxY2I5NWMyMTA4NzkyYjBmMThkYWJhZTZmZDA0ZTI0NWZiY2IwZDRkYTg3YTUwMmE5YmY3YzA3ZTkyZjBkMDgyZTI4MzhhYTlhOGM4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0cy9sb2FuL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdHMvbG9hbi90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjJjNjU3NDJlNWI4YmE3NjM4ZTU4ZGVjYjIyNmUwZTk2YjVmYzAxOWNlYzQ5YWM1YmQ3MTdmNGExMjM3NjljZDdlNTgxNGEwNDJlOTc4ODMxYWVkMzRlZjc2ZmNkNmNhMDNmNzljMjU4ZWNiNjY0MzA3MWJjYWVmNGQ2MTQ4YWMzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0cy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RzL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODFkNDI5YTA4OWNhNWFjMzM1ZjZhOTBkMjFiNTMxOGZkZTg4NGE5ZDIzNDU1MzM0Y2U1YjAxZWNmOTljZTA5Nzk4OThhYTQ3ZTBjMmQzN2I2YzhmMjQxMmQ4M2Q0ZDkzMDk5MWIwMmUwNTBhMzJiYzg5NzM2NDgwYTE0NDg3MTAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZUd1YXJkcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZUd1YXJkcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjM1OGJhZTNmNGM2MTdlYzE1YTBjYmYzYmZmM2YxMmUxZWJmNDI1OGI3YmVmYWEzMGEyNDY5ZTI4YzMxOGExNTdmMjVkNjAzMTFiMTFjMDMwNzc2YmQ5ZGI1MmNjZmVmYTYyYjdkN2FiYjAwNmRhYzY3NzY2NGQ5MzliMTEwZjEwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjg3ODdmNDc3NGFlYmMxOGQ2Njk1ZTQxMmU4ZDg2ZmQ4YjUxMDE3ZGEwODE4MGQxYThjNWVhMTY4NDY0MTE2ZjM4YjI4NDBkZjYzNjU4ZjFhNTIwODI5YzE1Y2FiN2ZjYjRjZGY5OTc4ZTdlYjg5MWVjNjQzYzBlYzFiN2E0ZTYyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3pvZVNlcnZpY2UvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3pvZVNlcnZpY2UvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3OTQwOWY0YWRkYWEzYzBkMWFkNWRmM2E5N2I3Njc1YTI3Y2YxN2Y3NTE5NDVjN2EwOTNmZmNiOWJjNGVhMzk3NjIxYTExZGY4MDEwNjMwNzU5NmY4ZGRhZTc4NTI4ZDU0MWIwNWI3MTk5NTUwNzg0OGIzMjIzZWIzMDUwNGIzNyIKICAgICAgICB9LAogICAgICAgICIuL3Rvb2xzL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInRvb2xzL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTIyOGEzYjRiNjE2ZjU5YjYwMzI2ZGE0MjA1ODExOWI2MWJhYmRiOGIzMTE2NjUxZmQ3YjJjNjY5MjA2Y2IxOWRmZThhY2IyYzYxZGQ1ZDg4ZDY1OTVhOTQ0N2U4M2FlYzZkOTkxMjQzZDU2ODVkZDRhNDViMTM1ZWFmNGQyZGUiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTYuOCI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZCIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE2LjgiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNi44IiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvRS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvRS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImY1NWZjODk5MzQzNjFiZGYyNTJhMTA0Y2Q2ZmI0ZmE3YmE5NGVkMjdlOTEyZGFiZTRiZmUyN2FmYzQwNjIxNTQ1NzExNjk3N2Q2ODY5ODdkMDYyMWI1NzhlZDExZjgwMTFiYTYyM2U4N2UwMDEwYmUxMWZiYWFiZDE1YWU0ZDM5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL25vLXNoaW0uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL25vLXNoaW0uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4YzY4NTNiYTFlNTQ2ZWZlYzg1YjJmNjhjOTM1OGQxNzQ3OWFjYWM5M2ZkYTllZTA0NGUyZmU4MDA2MDdlMWE2YjYzMzMwNmM1OTdmOTI5ZmRhYzhmNTRhY2RmZTY0YWJkYjUxYjUzMDQ0ZDJkMDhiYWQ5MGEyZGQ2ZWExNzgwMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90cmFjay10dXJucy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHJhY2stdHVybnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1MjJhYjA3NGY1MTYwM2FiZDA2ZTNiMTk2ZmVhYjFjYzE4MjZiMWEyNjM3OGQwMjViYmIzZGQyNWFlNjY0NDMwOTE1NTM4ZjBhNThhZjZiZDI5N2Y1MWJiMWYzZTBhNjJjMzcwN2FkZTMzN2I5ZmI2YmZkOGE4ZmEzMDg0YTFkNCIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vZmFyLXYwLjIuMTQiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL2ZhciIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9mYXItdjAuMi4xNCIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9mYXItdjAuMi4xNCIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2ludGVyLXByb3RvY29sIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNi44IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbm8tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjAuOC4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyODY4ZDgzYTU1YTYzZDE2YmI1NDA3YjIzODc3NThhMTI2NmI1NmNjNThlNGFjZmFjOGE2ZTEyYTAzNWY1ODllYjczZjFiYTIzMWRhZDEzZDVjNjVjZTQ4ZWViMmQ2MjYyODE0MjExODQyZGYzOTFjYmM0NGJlYmM2ZTAwMGMyMiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vbWFyc2hhbC12MC44LjEiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL21hcnNoYWwiLAogICAgICAibGFiZWwiOiAiQGVuZG8vbWFyc2hhbC12MC44LjEiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vbWFyc2hhbC12MC44LjEiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9pbnRlci1wcm90b2NvbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTYuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NC4xLjIzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjQuMS4yMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkOWNlZjM2YTIxNzE1MDA4YWJhNWU5Mjk2NTNmMjcyMDhjNjZiYjc5OGY0MGNiNmQzMzJkZmU0MzlkZGFjYWRjNTYyMmQ1YzAwOGY3NjU3MjQyMTcxMjA5NjdjYmU5MjQ4MGZmMzU2NmYxZDkyYzIxZGI4Y2E2ZjhlMGY5ZGYyMSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9kZWVwbHlGdWxmaWxsZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2RlZXBseUZ1bGZpbGxlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQzOGEwMmJkZGY2ZWRhNWY4OWRjMTc5MjQ5M2JlZjMwNWQwYzg2OTlmYTVjZDFhNWQ0ZWZkOTgzNmZjNGU5ZjVlYjJkZGQ4NmYxM2NjMWI0NjcxNDQyM2U4ZjhhNTlkYTJlMDAzZDM4MmU1ZTg1YTBiNzM3OWY3YWMxYjNjMGI5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2VuY29kZVRvQ2FwRGF0YS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZW5jb2RlVG9DYXBEYXRhLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODIzY2U5ZjYwMTFkMjUxMTRhZmZkZGM3ZmNjYzI5NzdlYmMxNTM0NzA3MGY2MjNlZGNlNTY0NzM2NDdjYjA5NGZjYjE3ZGI4MzBlNjk0ODNhNjE3ZjFmM2JhN2RjMWEzZDk1OGM5OThhMTcyYjY4MDExYzYzNGRiMjFlY2E1YTQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZW5jb2RlVG9TbWFsbGNhcHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2VuY29kZVRvU21hbGxjYXBzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNWI4NWRiZTRjZDU5N2RiMjg1YWFkNTI0ZTIxNGNjOWE5MzY1MWRmM2Q4Nzg5MDBlY2NhNjk4N2M5MDFmNjg1MTg3ZWM1YTllMjYxZjg3YzYxMWVlYjdmYWJjODU1MzYzMjk1MzA2ZTliNTNmMWQ5N2Y0ZjZiMDJlNGJiZDMzZTgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaGVscGVycy9jb3B5QXJyYXkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2hlbHBlcnMvY29weUFycmF5LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZjJlZDM5MzhmMWVjMTgwOTYxZjk2MTFkODMzNDI2N2IyODlmOWY3YWMyMTdkYTU1NjE5MGU3NTdkODVlYzhjNWZiOTgxYzg1YzU1ZWQ2N2E2ODZiZjVmYTUyMDUzMDZhY2U1NzY5YTkyZThmN2FlZjE4ZjUxYTUwMDNjMTRkNGUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaGVscGVycy9jb3B5UmVjb3JkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9oZWxwZXJzL2NvcHlSZWNvcmQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxMjdiYmRlNjlhNjg1ODY2NzZhNTExMmY1NDJlNzk3ZjU4MDNkZmFkNTgyYTY2ZTBjZDYxNDU5ODg0OTU0MzkzOGYxYTg5MWI2OGU0NTk4MWQxMjIyMjg1NThhNmQwOWI2N2VhYWE0ZWYyYmMzMGJiMjhiNzgwZTgxYWY2MTI1ZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9oZWxwZXJzL2Vycm9yLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9oZWxwZXJzL2Vycm9yLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODFmZmE4OGE2NjFiY2Q5MTc0OWMxYjRkZjVlYThmMmE3ZjhjNTM0OGI3ZDg0ZWFiMzNjNDA2ZDU2NjkyNmViOGNkNjVkNDYwZjIxMDg5ZmZlZmE5MzRjZDc0NTBhNzgzNjAyNzc0YWM3MGU2NTNhNDE1MTkxZDFiMzE2YTk1YmIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaGVscGVycy9pdGVyLWhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2hlbHBlcnMvaXRlci1oZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMmQxMTFmMWI2YzE4OWU1MjBhY2UzNWVkOGUwYmJhNmFhNmQyMDdlZTg3ODFmNmE3Njk4ODEzZDU2MWM3ZWM5YWRmYTJjY2JmNGY4ZmE1MjE3NzVlZDJhMjEwYzQ0N2UwMTc0YjdhMzZlOGZmYmQwZjBlYzc3NzI3Y2RkMWM4MjAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjc0ZTIwNjI2MzAyNzZmZWIzNTFkMWNkNDM3MzI0MzIwZWRkMDliOWUzYjI3N2I1Mjc4Nzc5ZTUxN2M5NWYwNjhmNmZjMzEzOGFhODI3OTA4MjBhOGZkMzg5OTA3NTNjNmUyZDJlNDQ2NTlkZDhlMjJlM2UzODEyYTU4YzczNGQyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2hlbHBlcnMvcmVtb3RhYmxlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9oZWxwZXJzL3JlbW90YWJsZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjBjYjUzMmNiZTMyNmY4NmViNGNjZDM1Mjk5MTJiYWU1NTQ5MjI0OGE0NTU4OWE4MDcwNzJjNWMzODRiZjQ3NGM0ZDZlMTkwZGE0MzNmNTZiYmIyMGNhNjM2ZDYyNmI2YzBhY2E0NTc2NmRjYjJlMWQ2Nzk5ZWE5NDU5NTU4NjA5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2hlbHBlcnMvc2FmZS1wcm9taXNlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9oZWxwZXJzL3NhZmUtcHJvbWlzZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImRhOTIzYzc4ODFkZTYwMTEwY2FhOTNlNmRmOWQwZDRmNzViZDUwZjkwYjM1YzgyM2JmM2ZhOGU1MTc3MDkyZTNjNzEyNzlmOTNkZGYyNTExNjYyZTQ5NjNiZWM3MmM0ZTk1OGE1MjI0YjJmNzY3ZDQxZTRjZGMxYzBiYjVkMTg2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2hlbHBlcnMvc3ltYm9sLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9oZWxwZXJzL3N5bWJvbC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImJjZjE3NzYxMmZkNzJlY2EwZTNlNWNjZTE4OTRjZDRiODQwYWRjMzQ0NTgwODk3Zjk3MDYyZDI3OGYwNTRjN2I3MzA0NWY1NDRiODM3ZDQ0YTM4YTc4NWE5ODIzZjU2MTdlYWEzMDg3ODJiOWMyYWZiMTgwZTMwZTAwNTk5MzNmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2hlbHBlcnMvdGFnZ2VkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9oZWxwZXJzL3RhZ2dlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjA1OTBmMzJkYTNlZjNjMzU2NjI0MDEyMGY1NjJmNTZmMDJhN2E0NWE3ZDJjOGZhMDFkNmYyNmE0MWE1NzFkNWQzYzU0ODEzMWYwOTExZGFiNmM1NWYzNTY3M2I2MmRhOTQ4MmQ0OTFkM2NjYzIwNDAwYWY2NmNhMmEyM2JmNmI5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21ha2UtZmFyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYWtlLWZhci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjBkMjlhNjhmZDJkNDk3MTc1NmRjYWQzNDdhYTViZjEyNGQyZDdmNGNmYmY3ZWI1NWMyM2M5NjQ5ODA0YWRjMjE4YWUzMDgwY2QxMjQwY2MzYWYxZjdmYzA0ZjVjMzA2MjI0MDZhNWMxYzFmMWY3MDg0ZDI3ZGQyZTU5OTZiZjUzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21ha2VUYWdnZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21ha2VUYWdnZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzMGJlNmFhMjdhMGE2YjEyZDg2Njc4NTkxMDE4ZDEyZTljODgxYTc0ZmVkM2RkY2UxZTc3MzNlMjk5ODM1NjYwMDUyZGQ0MmQ5NmY2NWE0YmQ1NjZiMmExZmU4ZTJhZWY1ZWQ1M2ZiNDkwNTBiNzk5NDU5Yjc0NmQ0Njc1MjYwZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYXJzaGFsLWp1c3Rpbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFyc2hhbC1qdXN0aW4uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzNzNiYzExMDFhNWQxZTE4NjM4YzY5NGZlYTZlMDdlMTJmMDAxYzZiNDQ3YWQzMTBhNWYxMWQ2M2ZlNThiMTU5NDgzN2I5ZDQ5YTc4ZjNkMmFjM2M5OThlMDg0ZDk3ZTcwM2EzMmUwOWIyNjZkYzVjMjkyYzYyZGQzY2NlNWU0OCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYXJzaGFsLXN0cmluZ2lmeS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFyc2hhbC1zdHJpbmdpZnkuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4NWQ2MzZhY2Y4OWUzYzBkMDg3Y2YxNTRiZDQzNDc2ZDk4NjBmZmM1MmQ3OWYxYzI5ZmQzYzg2ZWNiZTg2MGRmNmJjNjIyOGE0M2NhMzhhM2Q3NmQ5N2QxNTUwOTRhODk3Njk5Y2Q0ZjdhYTRkMmM1ZWIyZTIyYTY3ZTVkMmRhNyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYXJzaGFsLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXJzaGFsLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMzRjYTBlMWRhNWY0ZjgzZmJmY2Q1OWIzYjdhODhiZWRkNTk1OGNlYTZmNmMzYzgyN2U3NzQ5ZTFlMzFhOTE2MzA2Yzg4ZmM3MThlMmNkNDYwMjRiNGNlMTVmM2M3YTQxY2FjZmVmZGFhMDllMzQzZWYyOTJiYmE2NDkyMmQ1ODciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGFzc1N0eWxlT2YuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3Bhc3NTdHlsZU9mLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTFmMGRmZDVlOTkzNzY2MmMyN2UxOTRhYzU5YTk4Y2VlMjJkNGQ5ODhkYWM1MThmOGI2YzY5YjYyMmFhMWY4NTYxNTZlYjc2ZTE0YmMzYzQzZmVhM2QwZDE4YjhiZTlhN2JkY2NlNzk0NjBkNThlOTM2MGQxNTYxOGJkMWQxZWEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZUd1YXJkcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZUd1YXJkcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImI1ODM5N2U4NmI0NjBjMGQ2MmQ3ODk4ZjljMzhhOTAzNDljMTJmYmI0NmQzY2ExMmQwZTgzZjg2YzM4ZTg2MDg5Njc4M2EyN2IzMzRhMzE0ODhlYzRkZmRjYjVjYjBkYWI0YzVhNTg5M2U0NDFjNzEwODhjMTliYTQ0MTczMzI4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjU2N2VmMWIxYjE2MmQwMjhhZDQ5MzgyOGNlM2VkNDUwOTM4ZDBiZmZkNGY4Y2VlMWQ3NjE4ZDU5OTcwOWFjZmM0YjkyNWUwMzc5NWU4NjFkN2RiYjliODlmMDE0N2VlYzJiMjFmMTk0NGY3YTkyOTcwMzU1NTAyNWY4NjI4N2U2IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9uYXQtdjQuMS4yMyI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vbmF0IiwKICAgICAgImxhYmVsIjogIkBlbmRvL25hdC12NC4xLjIzIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL25hdC12NC4xLjIzIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNWNkNjc5Mjg3NTAwMWRlZGRhNTUxY2U5MjRlZjFhM2UyZDA2M2Q1Zjc3NmZjM2FkZjQ3NDJkMzM2MjJkNDUxYzU0NTUzNDY2ZWM4ZGY0MjhlMWU3M2JiMGQyNzQyMzIxNmU0MzlhYjE2ODUzNDk4M2E4OGU5MzhlOTRkOTFmMzQiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL3Byb21pc2Uta2l0IiwKICAgICAgImxhYmVsIjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41MiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2ludGVyLXByb3RvY29sIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgInNlcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJzZXMtdjAuMTguMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAic2VzL2xvY2tkb3duIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MC4xOC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJzZXMvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MC4xOC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjkyZmY5OGQ1MmVkZGYzOThjZjk2YWNiMTA1OWJlZDAyN2Y0ODZlNWJkZDcxYzA1NzZiMjhhZmEyMTE5ZGE2Yjg0MWMzODlkMDJiMzMxMDdkOGFiYTBhZWU0OTI1ZTYzZmI3YzM1OGE2YTQ1ZmE0YWMxYWU3NzY1ODAyMDU2YWIzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2lzLXByb21pc2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2lzLXByb21pc2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlYWZhYjE5Y2I5ZDczMjM3YmI2YzVmNTY4ZTU3ODY3NTFhN2FlZWY5NjYzZjJhMzBjNGI4ZjQ2NWUyMDEzOWYzZGEzNDZlYjJlNDEwMzg2ZjJkOTkyOWRmMzNjNTBmYThmMjQzNzMzZDc0ZjhiMGNmYzljOGI5ZjMxOGM0YWMwZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tZW1vLXJhY2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21lbW8tcmFjZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjZlZGI2ZThhZjFjYzkxYzY2MzJhYjI2ZTU4NjkwOGM5N2NhNmYyNmM5N2VhZTEzNjZjMGYwNTc3OTc5MTEzYjE1YzViYTRiMzQzZDUxOWE5ZWQwNWRjZmMyMTA3OTAxNDhkN2E3YzY5ZDllNjYyNDQ2N2I2NTlkMGM2ZTI5MTMzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImNjODNhM2EzZTk2ZTZjNTlmMTllZWY1OWY3ZTQxN2RiNzViZjFlNmQxZGM3NmFhZGRkMmJlNDYzZTVmNGU0NzkyOWNjMWNiYjMzZjkxY2FiODZjMTc5NGY1Zjg0MDNiYzQ3ZTMzZTI2ZDExODYwM2M3ZDA1MjgxZjQ1MTdhNGFjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjU2N2VmMWIxYjE2MmQwMjhhZDQ5MzgyOGNlM2VkNDUwOTM4ZDBiZmZkNGY4Y2VlMWQ3NjE4ZDU5OTcwOWFjZmM0YjkyNWUwMzc5NWU4NjFkN2RiYjliODlmMDE0N2VlYzJiMjFmMTk0NGY3YTkyOTcwMzU1NTAyNWY4NjI4N2U2IgogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfVBLAwQKAAAAAAAAAAAAAe3aYBoLAAAaCwAAIwAAAEBhZ29yaWMvYXNzZXJ0LXYwLjUuMS9zcmMvYXNzZXJ0LmpzeyJpbXBvcnRzIjpbIi4vdHlwZXMuanMiXSwiZXhwb3J0cyI6WyJGYWlsIiwiTm9uTnVsbGlzaCIsImFuIiwiYXNzZXJ0IiwiZGV0YWlscyIsImlkZW50Q2hlY2tlciIsIm1ha2VBc3NlcnQiLCJxIiwicXVvdGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3R5cGVzLmpzXCIsIFtdXV0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShhbiwgJ25hbWUnLCB7dmFsdWU6IFwiYW5cIn0pOyRo4oCNX29uY2UuYW4oYW4pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuQ2hlY2tlcn0gQ2hlY2tlciAqL1xuXG5jb25zdHtmcmVlemV9PU9iamVjdDtcblxuLyoqIEB0eXBlIHtBc3NlcnR9ICovXG5jb25zdCBnbG9iYWxBc3NlcnQ9Z2xvYmFsVGhpcy5hc3NlcnQ7JGjigI1fb25jZS5nbG9iYWxBc3NlcnQoZ2xvYmFsQXNzZXJ0KTtcblxuaWYoZ2xvYmFsQXNzZXJ0PT09dW5kZWZpbmVkKXtcbnRocm93IG5ldyBFcnJvcihcbiBgQ2Fubm90IGluaXRpYWxpemUgQGFnb3JpYy9hc3NlcnQsIG1pc3NpbmcgZ2xvYmFsVGhpcy5hc3NlcnQsIGltcG9ydCAnc2VzJyBiZWZvcmUgJ0BhZ29yaWMvYXNzZXJ0J2ApO1xuXG4gfVxuXG5jb25zdCBtaXNzaW5nPVtcbidmYWlsJyxcbidlcXVhbCcsXG4ndHlwZW9mJyxcbidzdHJpbmcnLFxuJ25vdGUnLFxuJ2RldGFpbHMnLFxuJ0ZhaWwnLFxuJ3F1b3RlJyxcbidtYWtlQXNzZXJ0J10uXG5maWx0ZXIoKG5hbWUpPT5nbG9iYWxBc3NlcnRbbmFtZV09PT11bmRlZmluZWQpO1xuaWYobWlzc2luZy5sZW5ndGg+MCl7XG50aHJvdyBuZXcgRXJyb3IoXG4gYENhbm5vdCBpbml0aWFsaXplIEBhZ29yaWMvYXNzZXJ0LCBtaXNzaW5nIGdsb2JhbFRoaXMuYXNzZXJ0IG1ldGhvZHMgJHttaXNzaW5nLmpvaW4oXG4nLCAnKVxuIH1gKTtcblxuIH1cblxuY29uc3R7ZGV0YWlscyxGYWlsLHF1b3RlLG1ha2VBc3NlcnR9PWdsb2JhbEFzc2VydDskaOKAjV9vbmNlLmRldGFpbHMoZGV0YWlscyk7JGjigI1fb25jZS5GYWlsKEZhaWwpOyRo4oCNX29uY2UucXVvdGUocXVvdGUpOyRo4oCNX29uY2UubWFrZUFzc2VydChtYWtlQXNzZXJ0KTtcblxuXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7VCB8IG51bGwgfCB1bmRlZmluZWR9IHZhbFxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHREZXRhaWxzXVxuICogQHJldHVybnMge1R9XG4gKi9cbmNvbnN0ICAgICAgICBOb25OdWxsaXNoPSh2YWwsb3B0RGV0YWlscz0gYHVuZXhwZWN0ZWQgJHtxdW90ZSh2YWwpfWApPT57XG5pZih2YWwhPW51bGwpe1xuLyogVGhpcyBgIT0gbnVsbGAgaWRpb20gY2hlY2tzIHRoYXQgYHZhbGAgaXMgbmVpdGhlciBgbnVsbGAgbm9yIGB1bmRlZmluZWRgLiovXG5yZXR1cm4gdmFsO1xuIH1cbmFzc2VydC5mYWlsKG9wdERldGFpbHMpO1xuIH07JGjigI1fb25jZS5Ob25OdWxsaXNoKE5vbk51bGxpc2gpO1xuaGFyZGVuKE5vbk51bGxpc2gpO1xuXG4vKipcbiAqIFByZXBlbmQgdGhlIGNvcnJlY3QgaW5kZWZpbml0ZSBhcnRpY2xlIG9udG8gYSBub3VuLCB0eXBpY2FsbHkgYSB0eXBlb2YgcmVzdWx0XG4gKiBlLmcuLCBcImFuIE9iamVjdFwiIHZzLiBcImEgTnVtYmVyXCJcbiAqXG4gKiBAZGVwcmVjYXRlZFxuICogQHBhcmFtIHtzdHJpbmd9IHN0ciBUaGUgbm91biB0byBwcmVwZW5kXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgbm91biBwcmVwZW5kZWQgd2l0aCBhL2FuXG4gKi9cbmZ1bmN0aW9uIGFuKHN0cil7XG5zdHI9IGAke3N0cn1gO1xuaWYoc3RyLmxlbmd0aD49MSYmJ2FlaW91QUVJT1UnLmluY2x1ZGVzKHN0clswXSkpe1xucmV0dXJuIGBhbiAke3N0cn1gO1xuIH1cbnJldHVybiBgYSAke3N0cn1gO1xuIH1cbmZyZWV6ZShhbik7XG5cblxuLyoqXG4gKiBJbiB0aGUgYGFzc2VydEZvb2AvYGlzRm9vYC9gY2hlY2tGb29gIHBhdHRlcm4sIGBjaGVja0Zvb2AgaGFzIGEgYGNoZWNrYFxuICogcGFyYW1ldGVyIG9mIHR5cGUgYENoZWNrZXJgLiBgYXNzZXJ0Rm9vYCBjYWxscyBgY2hlY2tGb29gIHBhc3Nlc1xuICogYGFzc2VydENoZWNrZXJgIGFzIHRoZSBgY2hlY2tgIGFyZ3VtZW50LiBgaXNGb29gIHBhc3NlcyBgaWRlbnRDaGVja2VyYFxuICogYXMgdGhlIGBjaGVja2AgYXJndW1lbnQuIGBpZGVudENoZWNrZXJgIGFjdHMgcHJlY2lzZWx5IGxpa2UgYW5cbiAqIGlkZW50aXR5IGZ1bmN0aW9uLCBidXQgaXMgdHlwZWQgYXMgYSBgQ2hlY2tlcmAgdG8gaW5kaWNhdGUgaXRzXG4gKiBpbnRlbmRlZCB1c2UuXG4gKlxuICogQHR5cGUge0NoZWNrZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBpZGVudENoZWNrZXI9KGNvbmQsX2RldGFpbHMpPT5jb25kOyRo4oCNX29uY2UuaWRlbnRDaGVja2VyKGlkZW50Q2hlY2tlcik7XG5oYXJkZW4oaWRlbnRDaGVja2VyKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhc3NlcnQiOlsiZ2xvYmFsQXNzZXJ0Il0sImRldGFpbHMiOlsiZGV0YWlscyJdLCJGYWlsIjpbIkZhaWwiXSwicXVvdGUiOlsicXVvdGUiXSwicSI6WyJxdW90ZSJdLCJtYWtlQXNzZXJ0IjpbIm1ha2VBc3NlcnQiXSwiYW4iOlsiYW4iXSwiTm9uTnVsbGlzaCI6WyJOb25OdWxsaXNoIl0sImlkZW50Q2hlY2tlciI6WyJpZGVudENoZWNrZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA4m9OmTgvAAA4LwAAIgAAAEBhZ29yaWMvYXNzZXJ0LXYwLjUuMS9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBAdHMtY2hlY2sqL1xuLyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIi8+Ki9cblxuLyogQmFzZWQgb24qL1xuLyogaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9TRVMtc2hpbS9ibG9iL21hc3Rlci9wYWNrYWdlcy9zZXMvc3JjL2Vycm9yL3R5cGVzLmpzKi9cbi8qIENvb3JkaW5hdGUgZWRpdHMgdW50aWwgd2UgcmVmYWN0b3IgdG8gYXZvaWQgdGhpcyBkdXBsaWNhdGlvbiovXG4vKiBBdCBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzI3NzQqL1xuLyogaXMgYSByZWNvcmQgb2YgYSBmYWlsZWQgYXR0ZW1wdCB0byByZW1vdmUgdGhpcyBkdXBsaWNhdGlvbi4qL1xuXG4vKipcbiAqIEBjYWxsYmFjayBCYXNlQXNzZXJ0XG4gKiBUaGUgYGFzc2VydGAgZnVuY3Rpb24gaXRzZWxmLlxuICpcbiAqIEBwYXJhbSB7Kn0gZmxhZyBUaGUgdHJ1dGh5L2ZhbHN5IHZhbHVlXG4gKiBAcGFyYW0ge0RldGFpbHM9fSBvcHREZXRhaWxzIFRoZSBkZXRhaWxzIHRvIHRocm93XG4gKiBAcGFyYW0ge0Vycm9yQ29uc3RydWN0b3I9fSBFcnJvckNvbnN0cnVjdG9yIEFuIG9wdGlvbmFsIGFsdGVybmF0ZSBlcnJvclxuICogY29uc3RydWN0b3IgdG8gdXNlLlxuICogQHJldHVybnMge2Fzc2VydHMgZmxhZ31cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEFzc2VydE1ha2VFcnJvck9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nPX0gZXJyb3JOYW1lXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0TWFrZUVycm9yXG4gKlxuICogVGhlIGBhc3NlcnQuZXJyb3JgIG1ldGhvZCwgcmVjb3JkaW5nIGRldGFpbHMgZm9yIHRoZSBjb25zb2xlLlxuICpcbiAqIFRoZSBvcHRpb25hbCBgb3B0RGV0YWlsc2AgY2FuIGJlIGEgc3RyaW5nLlxuICogQHBhcmFtIHtEZXRhaWxzPX0gb3B0RGV0YWlscyBUaGUgZGV0YWlscyBvZiB3aGF0IHdhcyBhc3NlcnRlZFxuICogQHBhcmFtIHtFcnJvckNvbnN0cnVjdG9yPX0gRXJyb3JDb25zdHJ1Y3RvciBBbiBvcHRpb25hbCBhbHRlcm5hdGUgZXJyb3JcbiAqIGNvbnN0cnVjdG9yIHRvIHVzZS5cbiAqIEBwYXJhbSB7QXNzZXJ0TWFrZUVycm9yT3B0aW9ucz19IG9wdGlvbnNcbiAqIEByZXR1cm5zIHtFcnJvcn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRGYWlsXG4gKlxuICogVGhlIGBhc3NlcnQuZmFpbGAgbWV0aG9kLlxuICpcbiAqIEZhaWwgYW4gYXNzZXJ0aW9uLCByZWNvcmRpbmcgZGV0YWlscyB0byB0aGUgY29uc29sZSBhbmRcbiAqIHJhaXNpbmcgYW4gZXhjZXB0aW9uIHdpdGgganVzdCB0eXBlIGluZm9ybWF0aW9uLlxuICpcbiAqIFRoZSBvcHRpb25hbCBgb3B0RGV0YWlsc2AgY2FuIGJlIGEgc3RyaW5nIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICogd2l0aCB0aGUgbm9kZWpzIGFzc2VydGlvbiBsaWJyYXJ5LlxuICogQHBhcmFtIHtEZXRhaWxzPX0gb3B0RGV0YWlscyBUaGUgZGV0YWlscyBvZiB3aGF0IHdhcyBhc3NlcnRlZFxuICogQHBhcmFtIHtFcnJvckNvbnN0cnVjdG9yPX0gRXJyb3JDb25zdHJ1Y3RvciBBbiBvcHRpb25hbCBhbHRlcm5hdGUgZXJyb3JcbiAqIGNvbnN0cnVjdG9yIHRvIHVzZS5cbiAqIEByZXR1cm5zIHtuZXZlcn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRFcXVhbFxuICogVGhlIGBhc3NlcnQuZXF1YWxgIG1ldGhvZFxuICpcbiAqIEFzc2VydCB0aGF0IHR3byB2YWx1ZXMgbXVzdCBiZSBgT2JqZWN0LmlzYC5cbiAqIEBwYXJhbSB7Kn0gYWN0dWFsIFRoZSB2YWx1ZSB3ZSByZWNlaXZlZFxuICogQHBhcmFtIHsqfSBleHBlY3RlZCBXaGF0IHdlIHdhbnRlZFxuICogQHBhcmFtIHtEZXRhaWxzPX0gb3B0RGV0YWlscyBUaGUgZGV0YWlscyB0byB0aHJvd1xuICogQHBhcmFtIHtFcnJvckNvbnN0cnVjdG9yPX0gRXJyb3JDb25zdHJ1Y3RvciBBbiBvcHRpb25hbCBhbHRlcm5hdGUgZXJyb3JcbiAqIGNvbnN0cnVjdG9yIHRvIHVzZS5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5cbi8qIFR5cGUgYWxsIHRoZSBvdmVybG9hZHMgb2YgdGhlIGFzc2VydFR5cGVvZiBmdW5jdGlvbi4qL1xuLyogVGhlcmUgbWF5IGV2ZW50dWFsbHkgYmUgYSBiZXR0ZXIgd2F5IHRvIGRvIHRoaXMsIGJ1dCovXG4vKiB0aGVtcyB0aGUgYnJlYWtzIHdpdGggVHlwZXNjcmlwdCA0LjAuKi9cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydFR5cGVvZkJpZ2ludFxuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcGFyYW0geydiaWdpbnQnfSB0eXBlbmFtZVxuICogQHBhcmFtIHtEZXRhaWxzPX0gb3B0RGV0YWlsc1xuICogQHJldHVybnMge2Fzc2VydHMgc3BlY2ltZW4gaXMgYmlnaW50fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydFR5cGVvZkJvb2xlYW5cbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHBhcmFtIHsnYm9vbGVhbid9IHR5cGVuYW1lXG4gKiBAcGFyYW0ge0RldGFpbHM9fSBvcHREZXRhaWxzXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzcGVjaW1lbiBpcyBib29sZWFufVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydFR5cGVvZkZ1bmN0aW9uXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7J2Z1bmN0aW9uJ30gdHlwZW5hbWVcbiAqIEBwYXJhbSB7RGV0YWlscz19IG9wdERldGFpbHNcbiAqIEByZXR1cm5zIHthc3NlcnRzIHNwZWNpbWVuIGlzIEZ1bmN0aW9ufVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydFR5cGVvZk51bWJlclxuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcGFyYW0geydudW1iZXInfSB0eXBlbmFtZVxuICogQHBhcmFtIHtEZXRhaWxzPX0gb3B0RGV0YWlsc1xuICogQHJldHVybnMge2Fzc2VydHMgc3BlY2ltZW4gaXMgbnVtYmVyfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydFR5cGVvZk9iamVjdFxuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcGFyYW0geydvYmplY3QnfSB0eXBlbmFtZVxuICogQHBhcmFtIHtEZXRhaWxzPX0gb3B0RGV0YWlsc1xuICogQHJldHVybnMge2Fzc2VydHMgc3BlY2ltZW4gaXMgUmVjb3JkPGFueSwgYW55PiB8IG51bGx9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0VHlwZW9mU3RyaW5nXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7J3N0cmluZyd9IHR5cGVuYW1lXG4gKiBAcGFyYW0ge0RldGFpbHM9fSBvcHREZXRhaWxzXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzcGVjaW1lbiBpcyBzdHJpbmd9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0VHlwZW9mU3ltYm9sXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7J3N5bWJvbCd9IHR5cGVuYW1lXG4gKiBAcGFyYW0ge0RldGFpbHM9fSBvcHREZXRhaWxzXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzcGVjaW1lbiBpcyBzeW1ib2x9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0VHlwZW9mVW5kZWZpbmVkXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7J3VuZGVmaW5lZCd9IHR5cGVuYW1lXG4gKiBAcGFyYW0ge0RldGFpbHM9fSBvcHREZXRhaWxzXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzcGVjaW1lbiBpcyB1bmRlZmluZWR9XG4gKi9cblxuLyoqXG4gKiBUaGUgYGFzc2VydC50eXBlb2ZgIG1ldGhvZFxuICpcbiAqIEB0eXBlZGVmIHtBc3NlcnRUeXBlb2ZCaWdpbnQgJiBBc3NlcnRUeXBlb2ZCb29sZWFuICYgQXNzZXJ0VHlwZW9mRnVuY3Rpb24gJiBBc3NlcnRUeXBlb2ZOdW1iZXIgJiBBc3NlcnRUeXBlb2ZPYmplY3QgJiBBc3NlcnRUeXBlb2ZTdHJpbmcgJiBBc3NlcnRUeXBlb2ZTeW1ib2wgJiBBc3NlcnRUeXBlb2ZVbmRlZmluZWR9IEFzc2VydFR5cGVvZlxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydFN0cmluZ1xuICogVGhlIGBhc3NlcnQuc3RyaW5nYCBtZXRob2QuXG4gKlxuICogYGFzc2VydC5zdHJpbmcodilgIGlzIGVxdWl2YWxlbnQgdG8gYGFzc2VydC50eXBlb2YodiwgJ3N0cmluZycpYC4gV2VcbiAqIHNwZWNpYWwgY2FzZSB0aGlzIG9uZSBiZWNhdXNlIGl0IGlzIHRoZSBtb3N0IGZyZXF1ZW50bHkgdXNlZC5cbiAqXG4gKiBBc3NlcnQgYW4gZXhwZWN0ZWQgdHlwZW9mIHJlc3VsdC5cbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lbiBUaGUgdmFsdWUgdG8gZ2V0IHRoZSB0eXBlb2ZcbiAqIEBwYXJhbSB7RGV0YWlscz19IG9wdERldGFpbHMgVGhlIGRldGFpbHMgdG8gdGhyb3dcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnROb3RlXG4gKiBUaGUgYGFzc2VydC5ub3RlYCBtZXRob2QuXG4gKlxuICogQW5ub3RhdGUgdGhpcyBlcnJvciB3aXRoIHRoZXNlIGRldGFpbHMsIHBvdGVudGlhbGx5IHRvIGJlIHVzZWQgYnkgYW5cbiAqIGF1Z21lbnRlZCBjb25zb2xlLCBsaWtlIHRoZSBjYXVzYWwgY29uc29sZSBvZiBgY29uc29sZS5qc2AsIHRvXG4gKiBwcm92aWRlIGV4dHJhIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCBsb2dnZWQgZXJyb3JzLlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IGVycm9yXG4gKiBAcGFyYW0ge0RldGFpbHN9IGRldGFpbHNOb3RlXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQHR5cGVkZWYge3t9fSBEZXRhaWxzVG9rZW5cbiAqIEEgY2FsbCB0byB0aGUgYGRldGFpbHNgIHRlbXBsYXRlIGxpdGVyYWwgbWFrZXMgYW5kIHJldHVybnMgYSBmcmVzaCBkZXRhaWxzXG4gKiB0b2tlbiwgd2hpY2ggaXMgYSBmcm96ZW4gZW1wdHkgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgYXJndW1lbnRzIG9mIHRoYXRcbiAqIGBkZXRhaWxzYCB0ZW1wbGF0ZSBsaXRlcmFsIGV4cHJlc3Npb24uXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7c3RyaW5nIHwgRGV0YWlsc1Rva2VufSBEZXRhaWxzXG4gKiBFaXRoZXIgYSBwbGFpbiBzdHJpbmcsIG9yIG1hZGUgYnkgdGhlIGBkZXRhaWxzYCB0ZW1wbGF0ZSBsaXRlcmFsIHRhZy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN0cmluZ2FibGVQYXlsb2FkXG4gKiBIb2xkcyB0aGUgcGF5bG9hZCBwYXNzZWQgdG8gcXVvdGUgc28gdGhhdCBpdHMgcHJpbnRlZCBmb3JtIGlzIHZpc2libGUuXG4gKiBAcHJvcGVydHkgeygpID0+IHN0cmluZ30gdG9TdHJpbmcgSG93IHRvIHByaW50IHRoZSBwYXlsb2FkXG4gKi9cblxuLyoqXG4gKiBUbyBcImRlY2xhc3NpZnlcIiBhbmQgcXVvdGUgYSBzdWJzdGl0dXRpb24gdmFsdWUgdXNlZCBpbiBhXG4gKiBkZXRhaWxzYC4uLmAgdGVtcGxhdGUgbGl0ZXJhbCwgZW5jbG9zZSB0aGF0IHN1YnN0aXR1dGlvbiBleHByZXNzaW9uXG4gKiBpbiBhIGNhbGwgdG8gYHF1b3RlYC4gVGhpcyBzdGF0ZXMgdGhhdCB0aGUgYXJndW1lbnQgc2hvdWxkIGFwcGVhciBxdW90ZWRcbiAqIChhcyBpZiB3aXRoIGBKU09OLnN0cmluZ2lmeWApLCBpbiB0aGUgZXJyb3IgbWVzc2FnZSBvZiB0aGUgdGhyb3duIGVycm9yLiBUaGVcbiAqIHBheWxvYWQgaXRzZWxmIGlzIHN0aWxsIHBhc3NlZCB1bnF1b3RlZCB0byB0aGUgY29uc29sZSBhcyBpdCB3b3VsZCBiZVxuICogd2l0aG91dCBgcXVvdGVgLlxuICpcbiAqIFN0YXJ0aW5nIGZyb20gdGhlIGV4YW1wbGUgaW4gdGhlIGBkZXRhaWxzYCBjb21tZW50LCBzYXkgaW5zdGVhZCB0aGF0IHRoZVxuICogY29sb3IgdGhlIHNreSBpcyBzdXBwb3NlZCB0byBiZSBpcyBhbHNvIGNvbXB1dGVkLiBTYXkgdGhhdCB3ZSBzdGlsbCBkb24ndFxuICogd2FudCB0byByZXZlYWwgdGhlIHNreSdzIGFjdHVhbCBjb2xvciwgYnV0IHdlIGRvIHdhbnQgdGhlIHRocm93biBlcnJvcidzXG4gKiBtZXNzYWdlIHRvIHJldmVhbCB3aGF0IGNvbG9yIHRoZSBza3kgd2FzIHN1cHBvc2VkIHRvIGJlOlxuICogYGBganNcbiAqIGFzc2VydC5lcXVhbChcbiAqICAgc2t5LmNvbG9yLFxuICogICBjb2xvcixcbiAqICAgZGV0YWlsc2Ake3NreS5jb2xvcn0gc2hvdWxkIGJlICR7cXVvdGUoY29sb3IpfWAsXG4gKiApO1xuICogYGBgXG4gKlxuICogVGhlIG5vcm1hbCBjb252ZW50aW9uIGlzIHRvIGxvY2FsbHkgcmVuYW1lIGBxdW90ZWAgdG8gYHFgIGFuZFxuICogYGRldGFpbHNgIHRvIGBYYFxuICogYGBganNcbiAqIGNvbnN0IHsgZGV0YWlsczogWCwgcXVvdGU6IHEgfSA9IGFzc2VydDtcbiAqIGBgYFxuICogc28gdGhlIGFib3ZlIGV4YW1wbGUgd291bGQgdGhlbiBiZVxuICogYGBganNcbiAqIGFzc2VydC5lcXVhbChcbiAqICAgc2t5LmNvbG9yLFxuICogICBjb2xvcixcbiAqICAgWGAke3NreS5jb2xvcn0gc2hvdWxkIGJlICR7cShjb2xvcil9YCxcbiAqICk7XG4gKiBgYGBcbiAqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0UXVvdGVcbiAqIEBwYXJhbSB7Kn0gcGF5bG9hZCBXaGF0IHRvIGRlY2xhc3NpZnlcbiAqIEBwYXJhbSB7KHN0cmluZ3xudW1iZXIpPX0gc3BhY2VzXG4gKiBAcmV0dXJucyB7U3RyaW5nYWJsZVBheWxvYWR9IFRoZSBkZWNsYXNzaWZpZWQgcGF5bG9hZFxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFJhaXNlXG4gKlxuICogVG8gbWFrZSBhbiBgYXNzZXJ0YCB3aGljaCB0ZXJtaW5hdGVzIHNvbWUgbGFyZ2VyIHVuaXQgb2YgY29tcHV0YXRpb25cbiAqIGxpa2UgYSB0cmFuc2FjdGlvbiwgdmF0LCBvciBwcm9jZXNzLCBjYWxsIGBtYWtlQXNzZXJ0YCB3aXRoIGEgYFJhaXNlYFxuICogY2FsbGJhY2ssIHdoZXJlIHRoYXQgY2FsbGJhY2sgYWN0dWFsbHkgcGVyZm9ybXMgdGhhdCBsYXJnZXIgdGVybWluYXRpb24uXG4gKiBJZiBwb3NzaWJsZSwgdGhlIGNhbGxiYWNrIHNob3VsZCBhbHNvIHJlcG9ydCBpdHMgYHJlYXNvbmAgcGFyYW1ldGVyIGFzXG4gKiB0aGUgYWxsZWdlZCByZWFzb24gZm9yIHRoZSB0ZXJtaW5hdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSByZWFzb25cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBNYWtlQXNzZXJ0XG4gKlxuICogTWFrZXMgYW5kIHJldHVybnMgYW4gYGFzc2VydGAgZnVuY3Rpb24gb2JqZWN0IHRoYXQgc2hhcmVzIHRoZSBib29ra2VlcGluZ1xuICogc3RhdGUgZGVmaW5lZCBieSB0aGlzIG1vZHVsZSB3aXRoIG90aGVyIGBhc3NlcnRgIGZ1bmN0aW9uIG9iamVjdHMgbWFkZSBieVxuICogYG1ha2VBc3NlcnRgLiBUaGlzIHN0YXRlIGlzIHBlci1tb2R1bGUtaW5zdGFuY2UgYW5kIGlzIGV4cG9zZWQgYnkgdGhlXG4gKiBgbG9nZ2VkRXJyb3JIYW5kbGVyYCBhYm92ZS4gV2UgcmVmZXIgdG8gYGFzc2VydGAgYXMgYSBcImZ1bmN0aW9uIG9iamVjdFwiXG4gKiBiZWNhdXNlIGl0IGNhbiBiZSBjYWxsZWQgZGlyZWN0bHkgYXMgYSBmdW5jdGlvbiwgYnV0IGFsc28gaGFzIG1ldGhvZHMgdGhhdFxuICogY2FuIGJlIGNhbGxlZC5cbiAqXG4gKiBJZiBgb3B0UmFpc2VgIGlzIHByb3ZpZGVkLCB0aGUgcmV0dXJuZWQgYGFzc2VydGAgZnVuY3Rpb24gb2JqZWN0IHdpbGwgY2FsbFxuICogYG9wdFJhaXNlKHJlYXNvbilgIGJlZm9yZSB0aHJvd2luZyB0aGUgZXJyb3IuIFRoaXMgZW5hYmxlcyBgb3B0UmFpc2VgIHRvXG4gKiBlbmdhZ2UgaW4gZXZlbiBtb3JlIHZpb2xlbnQgdGVybWluYXRpb24gYmVoYXZpb3IsIGxpa2UgdGVybWluYXRpbmcgdGhlIHZhdCxcbiAqIHRoYXQgcHJldmVudHMgZXhlY3V0aW9uIGZyb20gcmVhY2hpbmcgdGhlIGZvbGxvd2luZyB0aHJvdy4gSG93ZXZlciwgaWZcbiAqIGBvcHRSYWlzZWAgcmV0dXJucyBub3JtYWxseSwgd2hpY2ggd291bGQgYmUgdW51c3VhbCwgdGhlIHRocm93IGZvbGxvd2luZ1xuICogYG9wdFJhaXNlKHJlYXNvbilgIHdvdWxkIHN0aWxsIGhhcHBlbi5cbiAqXG4gKiBAcGFyYW0ge1JhaXNlPX0gb3B0UmFpc2VcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IHVucmVkYWN0ZWRcbiAqIEByZXR1cm5zIHtBc3NlcnR9XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KHRlbXBsYXRlOiBUZW1wbGF0ZVN0cmluZ3NBcnJheSB8IHN0cmluZ1tdLCAuLi5hcmdzOiBhbnkpID0+IERldGFpbHNUb2tlbn0gRGV0YWlsc1RhZ1xuICpcbiAqIFVzZSB0aGUgYGRldGFpbHNgIGZ1bmN0aW9uIGFzIGEgdGVtcGxhdGUgbGl0ZXJhbCB0YWcgdG8gY3JlYXRlXG4gKiBpbmZvcm1hdGl2ZSBlcnJvciBtZXNzYWdlcy4gVGhlIGFzc2VydGlvbiBmdW5jdGlvbnMgdGFrZSBzdWNoIG1lc3NhZ2VzXG4gKiBhcyBvcHRpb25hbCBhcmd1bWVudHM6XG4gKiBgYGBqc1xuICogYXNzZXJ0KHNreS5pc0JsdWUoKSwgZGV0YWlsc2Ake3NreS5jb2xvcn0gc2hvdWxkIGJlIFwiYmx1ZVwiYCk7XG4gKiBgYGBcbiAqIFRoZSBkZXRhaWxzIHRlbXBsYXRlIHRhZyByZXR1cm5zIGEgYERldGFpbHNUb2tlbmAgb2JqZWN0IHRoYXQgY2FuIHByaW50XG4gKiBpdHNlbGYgd2l0aCB0aGUgZm9ybWF0dGVkIG1lc3NhZ2UgaW4gdHdvIHdheXMuXG4gKiBJdCB3aWxsIHJlcG9ydCB0aGUgcmVhbCBkZXRhaWxzIHRvXG4gKiB0aGUgY29uc29sZSBidXQgaW5jbHVkZSBvbmx5IHRoZSB0eXBlb2YgaW5mb3JtYXRpb24gaW4gdGhlIHRocm93biBlcnJvclxuICogdG8gcHJldmVudCByZXZlYWxpbmcgc2VjcmV0cyB1cCB0aGUgZXhjZXB0aW9uYWwgcGF0aC4gSW4gdGhlIGV4YW1wbGVcbiAqIGFib3ZlLCB0aGUgdGhyb3duIGVycm9yIG1heSByZXZlYWwgb25seSB0aGF0IGBza3kuY29sb3JgIGlzIGEgc3RyaW5nLFxuICogd2hlcmVhcyB0aGUgc2FtZSBkaWFnbm9zdGljIHByaW50ZWQgdG8gdGhlIGNvbnNvbGUgcmV2ZWFscyB0aGF0IHRoZVxuICogc2t5IHdhcyBncmVlbi5cbiAqXG4gKiBUaGUgYHJhd2AgbWVtYmVyIG9mIGEgYHRlbXBsYXRlYCBpcyBpZ25vcmVkLCBzbyBhIHNpbXBsZVxuICogYHN0cmluZ1tdYCBjYW4gYWxzbyBiZSB1c2VkIGFzIGEgdGVtcGxhdGUuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KHRlbXBsYXRlOiBUZW1wbGF0ZVN0cmluZ3NBcnJheSB8IHN0cmluZ1tdLCAuLi5hcmdzOiBhbnkpID0+IG5ldmVyfSBGYWlsVGFnXG4gKiBUaGUgYEZhaWxgIHRhbXBsYXRlIHRhZyBzdXBwb3J0cyByZXBsYWNpbmcgcGF0dGVybnMgbGlrZVxuICogYGBganNcbiAqIGFzc2VydChjb25kLCBYYC4uLmNvbXBsYWludC4uLmApO1xuICogYGBgXG4gKiBvclxuICogYGBganNcbiAqIGNvbmQgfHwgYXNzZXJ0LmZhaWwoWGAuLi5jb21wbGFpbnQuLi5gKTtcbiAqIGBgYFxuICogd2l0aCBwYXR0ZXJucyBsaWtlXG4gKiBgYGBqc1xuICogY29uZCB8fCBGYWlsYC4uLmNvbXBsYWludC4uLmA7XG4gKiBgYGBcbiAqXG4gKiBIb3dldmVyLCBkdWUgdG8gW3dlYWtuZXNzIGluIGN1cnJlbnRcbiAqIFR5cGVTY3JpcHRdKGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvNTE0MjYpLCB0aGUgYHx8YFxuICogcGF0dGVybnMgYXJlIG5vdCBhcyBwb3dlcmZ1bCBhcyB0aGUgYGFzc2VydCguLi4pYCBjYWxsIGF0IGVuYWJsaW5nIHN0YXRpY1xuICogcmVhc29uaW5nLiBPZiB0aGUgYHx8YCwgYWdhaW4gZHVlIHRvIHdlYWtuZXNzZXMgaW4gY3VycmVudCBUeXBlU2NyaXB0LFxuICogdGhlXG4gKiBgYGBqc1xuICogY29uZCB8fCBGYWlsYC4uLmNvbXBsYWludC4uLmBcbiAqIGBgYFxuICogcGF0dGVybiBpcyBub3QgYXMgcG93ZXJmdWwgYXMgdGhlXG4gKiBgYGBqc1xuICogY29uZCB8fCBhc3NlcnQuZmFpbChYYC4uLmNvbXBsYWludC4uLmApO1xuICogYGBgXG4gKiBhdCBlbmFibGluZyBzdGF0aWMgcmVzb25pbmcuIERlc3BpdGUgdGhlc2UgcHJvYmxlbXMsIHdlIGRvIG5vdCB3YW50IHRvXG4gKiByZXR1cm4gdG8gdGhlXG4gKiBgYGBqc1xuICogYXNzZXJ0KGNvbmQsIFhgLi4uY29tcGxhaW50Li4uYClcbiAqIGBgYFxuICogc3R5bGUgYmVjYXVzZSBvZiB0aGUgc3Vic3RhbnRpYWwgb3ZlcmhlYWQgaW5cbiAqIGV2YWx1YXRpbmcgdGhlIGBYYCB0ZW1wbGF0ZSBpbiB0aGUgdHlwaWNhbCBgdHJ1ZWAgY2FzZSB3aGVyZSBpdCBpcyBub3RcbiAqIG5lZWRlZC4gQW5kIHdlIGRvIG5vdCB3YW50IHRvIHJldHVybiB0byB0aGVcbiAqIGBgYGpzXG4gKiBhc3NlcnQuZmFpbChYYC4uLmNvbXBsYWludC4uLmApYFxuICogYGBgXG4gKiBiZWNhdXNlIG9mIHRoZSB2ZXJib3NpdHkgYW5kIGxvc3Mgb2YgcmVhZGFiaWxpdHkuIEluc3RlYWQsIHVudGlsL3VubGVzc1xuICogaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy81MTQyNiBpcyBmaXhlZCwgZm9yIHRob3NlXG4gKiBuZXctc3R5bGUgYXNzZXJ0aW9ucyB3aGVyZSB0aGlzIGxvc3Mgb2Ygc3RhdGljIHJlYXNvbmluZyBpcyBhIHByb2JsZW0sXG4gKiBpbnN0ZWFkIGV4cHJlc3MgdGhlIGFzc2VydGlvbiBhc1xuICogYGBganNcbiAqICAgaWYgKCFjb25kKSB7XG4gKiAgICAgRmFpbGAuLi5jb21wbGFpbnQuLi5gO1xuICogICB9XG4gKiBgYGBcbiAqIG9yLCBpZiBuZWVkZWQsXG4gKiBgYGBqc1xuICogICBpZiAoIWNvbmQpIHtcbiAqICAgICAvLyBgdGhyb3dgIGlzIG5vb3Agc2luY2UgYEZhaWxgIHRocm93cy4gQnV0IGxpbnRlciBjb25mdXNlZFxuICogICAgIHRocm93IEZhaWxgLi4uY29tcGxhaW50Li4uYDtcbiAqICAgfVxuICogYGBgXG4gKiBUaGlzIGF2b2lkIHRoZSBUeXBlU2NyaXB0IGJ1Z3MgdGhhdCBjYXVzZSB0aGUgbG9zcyBvZiBzdGF0aWMgcmVhc29uaW5nLFxuICogYnV0IHdpdGggbm8gbG9zcyBvZiBlZmZpY2llbmN5IGFuZCBsaXR0bGUgbG9zcyBvZiByZWFkYWJpbGl0eS5cbiAqL1xuXG4vKipcbiAqIGFzc2VydCB0aGF0IGV4cHIgaXMgdHJ1dGh5LCB3aXRoIGFuIG9wdGlvbmFsIGRldGFpbHMgdG8gZGVzY3JpYmVcbiAqIHRoZSBhc3NlcnRpb24uIEl0IGlzIGEgdGFnZ2VkIHRlbXBsYXRlIGxpdGVyYWwgbGlrZVxuICogYGBganNcbiAqIGFzc2VydChleHByLCBkZXRhaWxzYC4uLi5gKTtgXG4gKiBgYGBcbiAqXG4gKiBUaGUgbGl0ZXJhbCBwb3J0aW9ucyBvZiB0aGUgdGVtcGxhdGUgYXJlIGFzc3VtZWQgbm9uLXNlbnNpdGl2ZSwgYXNcbiAqIGFyZSB0aGUgYHR5cGVvZmAgdHlwZXMgb2YgdGhlIHN1YnN0aXR1dGlvbiB2YWx1ZXMuIFRoZXNlIGFyZVxuICogYXNzZW1ibGVkIGludG8gdGhlIHRocm93biBlcnJvciBtZXNzYWdlLiBUaGUgYWN0dWFsIGNvbnRlbnRzIG9mIHRoZVxuICogc3Vic3RpdHV0aW9uIHZhbHVlcyBhcmUgYXNzdW1lZCBzZW5zaXRpdmUsIHRvIGJlIHJldmVhbGVkIHRvXG4gKiB0aGUgY29uc29sZSBvbmx5LiBXZSBhc3N1bWUgb25seSB0aGUgdmlydHVhbCBwbGF0Zm9ybSdzIG93bmVyIGNhbiByZWFkXG4gKiB3aGF0IGlzIHdyaXR0ZW4gdG8gdGhlIGNvbnNvbGUsIHdoZXJlIHRoZSBvd25lciBpcyBpbiBhIHByaXZpbGVnZWRcbiAqIHBvc2l0aW9uIG92ZXIgY29tcHV0YXRpb24gcnVubmluZyBvbiB0aGF0IHBsYXRmb3JtLlxuICpcbiAqIFRoZSBvcHRpb25hbCBgb3B0RGV0YWlsc2AgY2FuIGJlIGEgc3RyaW5nIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICogd2l0aCB0aGUgbm9kZWpzIGFzc2VydGlvbiBsaWJyYXJ5LlxuICpcbiAqIEB0eXBlZGVmIHsgQmFzZUFzc2VydCAmIHtcbiAqICAgdHlwZW9mOiBBc3NlcnRUeXBlb2YsXG4gKiAgIGVycm9yOiBBc3NlcnRNYWtlRXJyb3IsXG4gKiAgIGZhaWw6IEFzc2VydEZhaWwsXG4gKiAgIGVxdWFsOiBBc3NlcnRFcXVhbCxcbiAqICAgc3RyaW5nOiBBc3NlcnRTdHJpbmcsXG4gKiAgIG5vdGU6IEFzc2VydE5vdGUsXG4gKiAgIGRldGFpbHM6IERldGFpbHNUYWcsXG4gKiAgIEZhaWw6IEZhaWxUYWcsXG4gKiAgIHF1b3RlOiBBc3NlcnRRdW90ZSxcbiAqICAgbWFrZUFzc2VydDogTWFrZUFzc2VydCxcbiAqIH0gfSBBc3NlcnRcbiAqL1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABdze4OVwEAAFcBAAAgAAAAQGFnb3JpYy9lcnRwLXYwLjE1LjMvZXhwb3J0ZWQuanN7ImltcG9ydHMiOlsiLi9zcmMvdHlwZXMtYW1iaWVudC5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3NyYy90eXBlcy1hbWJpZW50LmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA4wt3p2TYAANk2AAAmAAAAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL2Ftb3VudE1hdGguanN7ImltcG9ydHMiOlsiLi9tYXRoSGVscGVycy9jb3B5QmFnTWF0aEhlbHBlcnMuanMiLCIuL21hdGhIZWxwZXJzL2NvcHlTZXRNYXRoSGVscGVycy5qcyIsIi4vbWF0aEhlbHBlcnMvbmF0TWF0aEhlbHBlcnMuanMiLCIuL21hdGhIZWxwZXJzL3NldE1hdGhIZWxwZXJzLmpzIiwiQGFnb3JpYy9zdG9yZSIsIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJBbW91bnRNYXRoIiwiQXNzZXRLaW5kIiwiYXNzZXJ0QXNzZXRLaW5kIiwiYXNzZXJ0VmFsdWVHZXRIZWxwZXJzIiwiZ2V0QXNzZXRLaW5kIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IHBhc3NTdHlsZU9mLGFzc2VydFJlbW90YWJsZSxhc3NlcnRSZWNvcmQsTSxtYXRjaGVzLG5hdE1hdGhIZWxwZXJzLHNldE1hdGhIZWxwZXJzLGNvcHlTZXRNYXRoSGVscGVycyxjb3B5QmFnTWF0aEhlbHBlcnM7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXSxbXCJhc3NlcnRSZW1vdGFibGVcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFJlbW90YWJsZSA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0UmVjb3JkXCIsIFskaOKAjV9hID0+IChhc3NlcnRSZWNvcmQgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiTVwiLCBbJGjigI1fYSA9PiAoTSA9ICRo4oCNX2EpXV0sW1wibWF0Y2hlc1wiLCBbJGjigI1fYSA9PiAobWF0Y2hlcyA9ICRo4oCNX2EpXV1dXSxbXCIuL21hdGhIZWxwZXJzL25hdE1hdGhIZWxwZXJzLmpzXCIsIFtbXCJuYXRNYXRoSGVscGVyc1wiLCBbJGjigI1fYSA9PiAobmF0TWF0aEhlbHBlcnMgPSAkaOKAjV9hKV1dXV0sW1wiLi9tYXRoSGVscGVycy9zZXRNYXRoSGVscGVycy5qc1wiLCBbW1wic2V0TWF0aEhlbHBlcnNcIiwgWyRo4oCNX2EgPT4gKHNldE1hdGhIZWxwZXJzID0gJGjigI1fYSldXV1dLFtcIi4vbWF0aEhlbHBlcnMvY29weVNldE1hdGhIZWxwZXJzLmpzXCIsIFtbXCJjb3B5U2V0TWF0aEhlbHBlcnNcIiwgWyRo4oCNX2EgPT4gKGNvcHlTZXRNYXRoSGVscGVycyA9ICRo4oCNX2EpXV1dXSxbXCIuL21hdGhIZWxwZXJzL2NvcHlCYWdNYXRoSGVscGVycy5qc1wiLCBbW1wiY29weUJhZ01hdGhIZWxwZXJzXCIsIFskaOKAjV9hID0+IChjb3B5QmFnTWF0aEhlbHBlcnMgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuY29uc3R7cXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5cbi8qKlxuICogQ29uc3RhbnRzIGZvciB0aGUga2luZHMgb2YgYXNzZXRzIHdlIHN1cHBvcnQuXG4gKlxuICogQHR5cGUge3sgTkFUOiAnbmF0JywgU0VUOiAnc2V0JywgQ09QWV9TRVQ6ICdjb3B5U2V0JywgQ09QWV9CQUc6ICdjb3B5QmFnJyB9fVxuICovXG5jb25zdCBBc3NldEtpbmQ9aGFyZGVuKHtcbk5BVDonbmF0JyxcblNFVDonc2V0JyxcbkNPUFlfU0VUOidjb3B5U2V0JyxcbkNPUFlfQkFHOidjb3B5QmFnJ30pOyRo4oCNX29uY2UuQXNzZXRLaW5kKEFzc2V0S2luZCk7XG5cbmNvbnN0IGFzc2V0S2luZE5hbWVzPWhhcmRlbihPYmplY3QudmFsdWVzKEFzc2V0S2luZCkuc29ydCgpKTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHtBc3NldEtpbmR9IGFsbGVnZWRBS1xuICovXG5jb25zdCBhc3NlcnRBc3NldEtpbmQ9KGFsbGVnZWRBSyk9PntcbmFzc2V0S2luZE5hbWVzLmluY2x1ZGVzKGFsbGVnZWRBSyl8fFxuRmFpbCBgVGhlIGFzc2V0S2luZCAke2FsbGVnZWRBS30gbXVzdCBiZSBvbmUgb2YgJHtxKGFzc2V0S2luZE5hbWVzKX1gO1xuIH07JGjigI1fb25jZS5hc3NlcnRBc3NldEtpbmQoYXNzZXJ0QXNzZXRLaW5kKTtcbmhhcmRlbihhc3NlcnRBc3NldEtpbmQpO1xuXG4vKipcbiAqIEFtb3VudHMgZGVzY3JpYmUgZGlnaXRhbCBhc3NldHMuIEZyb20gYW4gYW1vdW50LCB5b3UgY2FuIGxlYXJuIHRoZVxuICogYnJhbmQgb2YgZGlnaXRhbCBhc3NldCBhcyB3ZWxsIGFzIFwiaG93IG11Y2hcIiBvciBcImhvdyBtYW55XCIuIEFtb3VudHNcbiAqIGhhdmUgdHdvIHBhcnRzOiBhIGJyYW5kIChsb29zZWx5IHNwZWFraW5nLCB0aGUgdHlwZSBvZiBkaWdpdGFsXG4gKiBhc3NldCkgYW5kIHRoZSB2YWx1ZSAodGhlIGFuc3dlciB0byBcImhvdyBtdWNoXCIpLiBGb3IgZXhhbXBsZSwgaW5cbiAqIHRoZSBwaHJhc2UgXCI1IGJ1Y2tzXCIsIFwiYnVja3NcIiB0YWtlcyB0aGUgcm9sZSBvZiB0aGUgYnJhbmQgYW5kIHRoZVxuICogdmFsdWUgaXMgNS4gQW1vdW50cyBjYW4gZGVzY3JpYmUgZnVuZ2libGUgYW5kIG5vbi1mdW5naWJsZSBkaWdpdGFsXG4gKiBhc3NldHMuIEFtb3VudHMgYXJlIHBhc3MtYnktY29weSBhbmQgY2FuIGJlIG1hZGUgYnkgYW5kIHNlbnQgdG9cbiAqIGFueW9uZS5cbiAqXG4gKiBUaGUgaXNzdWVyIGlzIHRoZSBhdXRob3JpdGF0aXZlIHNvdXJjZSBvZiB0aGUgYW1vdW50IGluIHBheW1lbnRzXG4gKiBhbmQgcHVyc2VzLiBUaGUgaXNzdWVyIG11c3QgYmUgYWJsZSB0byBkbyB0aGluZ3Mgc3VjaCBhcyBhZGRcbiAqIGRpZ2l0YWwgYXNzZXRzIHRvIGEgcHVyc2UgYW5kIHdpdGhkcmF3IGRpZ2l0YWwgYXNzZXRzIGZyb20gYSBwdXJzZS5cbiAqIFRvIGRvIHNvLCBpdCBtdXN0IGtub3cgaG93IHRvIGFkZCBhbmQgc3VidHJhY3QgZGlnaXRhbCBhc3NldHMuXG4gKiBSYXRoZXIgdGhhbiBoYXJkLWNvZGluZyBhIHBhcnRpY3VsYXIgc29sdXRpb24sIHdlIGNob3NlIHRvXG4gKiBwYXJhbWV0ZXJpemUgdGhlIGlzc3VlciB3aXRoIGEgY29sbGVjdGlvbiBvZiBwb2x5bW9ycGhpYyBmdW5jdGlvbnMsXG4gKiB3aGljaCB3ZSBjYWxsIGBBbW91bnRNYXRoYC4gVGhlc2UgbWF0aCBmdW5jdGlvbnMgaW5jbHVkZSBjb25jZXB0c1xuICogbGlrZSBhZGRpdGlvbiwgc3VidHJhY3Rpb24sIGFuZCBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8uXG4gKlxuICogV2UgYWxzbyB3YW50IHRvIG1ha2Ugc3VyZSB0aGVyZSBpcyBubyBjb25mdXNpb24gYXMgdG8gd2hhdCBraW5kIG9mXG4gKiBhc3NldCB3ZSBhcmUgdXNpbmcuIFRodXMsIEFtb3VudE1hdGggaW5jbHVkZXMgY2hlY2tzIG9mIHRoZVxuICogYGJyYW5kYCwgdGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgdHlwZSBvZiBkaWdpdGFsIGFzc2V0LiBJZlxuICogdGhlIHdyb25nIGJyYW5kIGlzIHVzZWQgaW4gQW1vdW50TWF0aCwgYW4gZXJyb3IgaXMgdGhyb3duIGFuZCB0aGVcbiAqIG9wZXJhdGlvbiBkb2VzIG5vdCBzdWNjZWVkLlxuICpcbiAqIEFtb3VudE1hdGggdXNlcyBtYXRoSGVscGVycyB0byBkbyBtb3N0IG9mIHRoZSB3b3JrLCBidXQgdGhlbiBhZGRzXG4gKiB0aGUgYnJhbmQgdG8gdGhlIHJlc3VsdC4gVGhlIGZ1bmN0aW9uIGB2YWx1ZWAgZ2V0cyB0aGUgdmFsdWUgZnJvbVxuICogdGhlIGFtb3VudCBieSByZW1vdmluZyB0aGUgYnJhbmQgKGFtb3VudCAtPiB2YWx1ZSksIGFuZCB0aGVcbiAqIGZ1bmN0aW9uIGBtYWtlYCBhZGRzIHRoZSBicmFuZCB0byBwcm9kdWNlIGFuIGFtb3VudCAodmFsdWUgLT5cbiAqIGFtb3VudCkuIFRoZSBmdW5jdGlvbiBgY29lcmNlYCB0YWtlcyBhbiBhbW91bnQgYW5kIGNoZWNrcyBpdCxcbiAqIHJldHVybmluZyBhbiBhbW91bnQgKGFtb3VudCAtPiBhbW91bnQpLlxuICpcbiAqIEVhY2ggaXNzdWVyIG9mIGRpZ2l0YWwgYXNzZXRzIGhhcyBhbiBhc3NvY2lhdGVkIGJyYW5kIGluIGFcbiAqIG9uZS10by1vbmUgbWFwcGluZy4gSW4gdW50cnVzdGVkIGNvbnRleHRzLCBzdWNoIGFzIGluIGFuYWx5emluZ1xuICogcGF5bWVudHMgYW5kIGFtb3VudHMsIHdlIGNhbiBnZXQgdGhlIGJyYW5kIGFuZCBmaW5kIHRoZSBpc3N1ZXJcbiAqIHdoaWNoIG1hdGNoZXMgdGhlIGJyYW5kLiBUaGUgaXNzdWVyIGFuZCB0aGUgYnJhbmQgbXV0dWFsbHkgdmFsaWRhdGVcbiAqIGVhY2ggb3RoZXIuXG4gKi9cblxuY29uc3QgaGVscGVycz17XG5uYXQ6bmF0TWF0aEhlbHBlcnMsXG5zZXQ6c2V0TWF0aEhlbHBlcnMsXG5jb3B5U2V0OmNvcHlTZXRNYXRoSGVscGVycyxcbmNvcHlCYWc6Y29weUJhZ01hdGhIZWxwZXJzfTtcblxuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QW1vdW50VmFsdWV9IFZcbiAqIEB0eXBlIHsodmFsdWU6IFYpID0+IEFzc2V0S2luZEZvclZhbHVlPFY+fVxuICovXG5jb25zdCBhc3NlcnRWYWx1ZUdldEFzc2V0S2luZD0odmFsdWUpPT57XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YodmFsdWUpO1xuaWYocGFzc1N0eWxlPT09J2JpZ2ludCcpe1xuLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0Ki9cbnJldHVybiduYXQnO1xuIH1cbmlmKHBhc3NTdHlsZT09PSdjb3B5QXJyYXknKXtcbi8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCovXG5yZXR1cm4nc2V0JztcbiB9XG5pZihtYXRjaGVzKHZhbHVlLE0uc2V0KCkpKXtcbi8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCovXG5yZXR1cm4nY29weVNldCc7XG4gfVxuaWYobWF0Y2hlcyh2YWx1ZSxNLmJhZygpKSl7XG4vKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xucmV0dXJuJ2NvcHlCYWcnO1xuIH1cbi8qIFRPRE8gVGhpcyBpc24ndCBxdWl0ZSB0aGUgcmlnaHQgZXJyb3IgbWVzc2FnZSwgaW4gY2FzZSB2YWx1ZVBhc3NTdHlsZSovXG4vKiBpcyAndGFnZ2VkJy4gV2Ugd291bGQgbmVlZCB0byBkaXN0aW5ndWlzaCB3aGF0IGtpbmQgb2YgdGFnZ2VkKi9cbi8qIG9iamVjdCBpdCBpcy4qL1xuLyogQWxzbywgdGhpcyBraW5kIG9mIG1hbnVhbCBsaXN0aW5nIGlzIGEgbWFpbnRlbmFuY2UgaGF6YXJkIHdlKi9cbi8qIChUT0RPKSB3aWxsIGVuY291bnRlciB3aGVuIHdlIGV4dGVuZCB0aGUgbWF0aCBoZWxwZXJzIGZ1cnRoZXIuKi9cbnRocm93IEZhaWwgYHZhbHVlICR7dmFsdWV9IG11c3QgYmUgYSBiaWdpbnQsIGNvcHlTZXQsIGNvcHlCYWcsIG9yIGFuIGFycmF5LCBub3QgJHtxKFxucGFzc1N0eWxlKVxuIH1gO1xuIH07XG5cbi8qKlxuICpcbiAqIEFzc2VydHMgdGhhdCB2YWx1ZSBpcyBhIHZhbGlkIEFtb3VudE1hdGggYW5kIHJldHVybnMgdGhlIGFwcHJvcHJpYXRlIGhlbHBlcnMuXG4gKlxuICogTWFkZSBhdmFpbGFibGUgb25seSBmb3IgdGVzdGluZywgYnV0IGl0IGlzIGhhcm1sZXNzIGZvciBvdGhlciB1c2VzLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QW1vdW50VmFsdWV9IFZcbiAqIEBwYXJhbSB7Vn0gdmFsdWVcbiAqIEByZXR1cm5zIHtNYXRoSGVscGVyczxWPn1cbiAqL1xuY29uc3QgICAgICAgIGFzc2VydFZhbHVlR2V0SGVscGVycz0odmFsdWUpPT5cbi8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCovXG5oZWxwZXJzW2Fzc2VydFZhbHVlR2V0QXNzZXRLaW5kKHZhbHVlKV07XG5cbi8qKiBAdHlwZSB7KGFsbGVnZWRCcmFuZDogQnJhbmQsIGJyYW5kPzogQnJhbmQpID0+IHZvaWR9ICovJGjigI1fb25jZS5hc3NlcnRWYWx1ZUdldEhlbHBlcnMoYXNzZXJ0VmFsdWVHZXRIZWxwZXJzKTtcbmNvbnN0IG9wdGlvbmFsQnJhbmRDaGVjaz0oYWxsZWdlZEJyYW5kLGJyYW5kKT0+e1xuaWYoYnJhbmQhPT11bmRlZmluZWQpe1xuYXNzZXJ0UmVtb3RhYmxlKGJyYW5kLCdicmFuZCcpO1xuYWxsZWdlZEJyYW5kPT09YnJhbmR8fFxuRmFpbCBgYW1vdW50J3MgYnJhbmQgJHtxKGFsbGVnZWRCcmFuZCl9IGRpZCBub3QgbWF0Y2ggZXhwZWN0ZWQgYnJhbmQgJHtxKFxuYnJhbmQpXG4gfWA7XG4gfVxuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEBwYXJhbSB7QW1vdW50PEs+fSBsZWZ0QW1vdW50XG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gcmlnaHRBbW91bnRcbiAqIEBwYXJhbSB7QnJhbmQ8Sz4gfCB1bmRlZmluZWR9IGJyYW5kXG4gKiBAcmV0dXJucyB7TWF0aEhlbHBlcnM8Kj59XG4gKi9cbmNvbnN0IGNoZWNrTFJBbmRHZXRIZWxwZXJzPShsZWZ0QW1vdW50LHJpZ2h0QW1vdW50LGJyYW5kPXVuZGVmaW5lZCk9PntcbmFzc2VydFJlY29yZChsZWZ0QW1vdW50LCdsZWZ0QW1vdW50Jyk7XG5hc3NlcnRSZWNvcmQocmlnaHRBbW91bnQsJ3JpZ2h0QW1vdW50Jyk7XG5jb25zdHt2YWx1ZTpsZWZ0VmFsdWUsYnJhbmQ6bGVmdEJyYW5kfT1sZWZ0QW1vdW50O1xuY29uc3R7dmFsdWU6cmlnaHRWYWx1ZSxicmFuZDpyaWdodEJyYW5kfT1yaWdodEFtb3VudDtcbmFzc2VydFJlbW90YWJsZShsZWZ0QnJhbmQsJ2xlZnRCcmFuZCcpO1xuYXNzZXJ0UmVtb3RhYmxlKHJpZ2h0QnJhbmQsJ3JpZ2h0QnJhbmQnKTtcbm9wdGlvbmFsQnJhbmRDaGVjayhsZWZ0QnJhbmQsYnJhbmQpO1xub3B0aW9uYWxCcmFuZENoZWNrKHJpZ2h0QnJhbmQsYnJhbmQpO1xubGVmdEJyYW5kPT09cmlnaHRCcmFuZHx8XG5GYWlsIGBCcmFuZHMgaW4gbGVmdCAke3EobGVmdEJyYW5kKX0gYW5kIHJpZ2h0ICR7cShcbnJpZ2h0QnJhbmQpXG4gfSBzaG91bGQgbWF0Y2ggYnV0IGRvIG5vdGA7XG5jb25zdCBsZWZ0SGVscGVycz1hc3NlcnRWYWx1ZUdldEhlbHBlcnMobGVmdFZhbHVlKTtcbmNvbnN0IHJpZ2h0SGVscGVycz1hc3NlcnRWYWx1ZUdldEhlbHBlcnMocmlnaHRWYWx1ZSk7XG5sZWZ0SGVscGVycz09PXJpZ2h0SGVscGVyc3x8XG5GYWlsIGBUaGUgbGVmdCAke2xlZnRBbW91bnR9IGFuZCByaWdodCBhbW91bnQgJHtyaWdodEFtb3VudH0gaGFkIGRpZmZlcmVudCBhc3NldEtpbmRzYDtcbnJldHVybiBsZWZ0SGVscGVycztcbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge01hdGhIZWxwZXJzPEFzc2V0VmFsdWVGb3JLaW5kPEs+Pn0gaFxuICogQHBhcmFtIHtBbW91bnQ8Sz59IGxlZnRBbW91bnRcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSByaWdodEFtb3VudFxuICogQHJldHVybnMge1tLLCBLXX1cbiAqL1xuY29uc3QgY29lcmNlTFI9KGgsbGVmdEFtb3VudCxyaWdodEFtb3VudCk9Pntcbi8qIEB0cy1leHBlY3QtZXJyb3IgY291bGQgYmUgYXJiaXRyYXJ5IHN1YnR5cGUqL1xucmV0dXJuW2guZG9Db2VyY2UobGVmdEFtb3VudC52YWx1ZSksaC5kb0NvZXJjZShyaWdodEFtb3VudC52YWx1ZSldO1xuIH07XG5cbi8qKlxuICogTG9naWMgZm9yIG1hbmlwdWxhdGluZyBhbW91bnRzLlxuICpcbiAqIEFtb3VudHMgYXJlIHRoZSBjYW5vbmljYWwgZGVzY3JpcHRpb24gb2YgdHJhZGFibGUgZ29vZHMuIFRoZXkgYXJlIG1hbmlwdWxhdGVkXG4gKiBieSBpc3N1ZXJzIGFuZCBtaW50cywgYW5kIHJlcHJlc2VudCB0aGUgZ29vZHMgYW5kIGN1cnJlbmN5IGNhcnJpZWQgYnkgcHVyc2VzXG4gKiBhbmRcbiAqIHBheW1lbnRzLiBUaGV5IGNhbiBiZSB1c2VkIHRvIHJlcHJlc2VudCB0aGluZ3MgbGlrZSBjdXJyZW5jeSwgc3RvY2ssIGFuZCB0aGVcbiAqIGFic3RyYWN0IHJpZ2h0IHRvIHBhcnRpY2lwYXRlIGluIGEgcGFydGljdWxhciBleGNoYW5nZS5cbiAqL1xuY29uc3QgQW1vdW50TWF0aD17XG4vKipcbiAqIE1ha2UgYW4gYW1vdW50IGZyb20gYSB2YWx1ZSBieSBhZGRpbmcgdGhlIGJyYW5kLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAcGFyYW0ge0JyYW5kPEs+fSBicmFuZFxuICogQHBhcmFtIHtBc3NldFZhbHVlRm9yS2luZDxLPn0gYWxsZWdlZFZhbHVlXG4gKiBAcmV0dXJucyB7QW1vdW50PEs+fVxuICovXG4vKiBhbGxlZ2VkVmFsdWUgaGFzIGEgY29uZGl0aW9uYWwgZXhwcmVzc2lvbiBmb3IgdHlwZSB3aWRlbmluZywgdG8gcHJldmVudCBWIGJlaW5nIGJvdW5kIHRvIGEgYSBsaXRlcmFsIGxpa2UgMW4qL1xubWFrZTooYnJhbmQsYWxsZWdlZFZhbHVlKT0+e1xuYXNzZXJ0UmVtb3RhYmxlKGJyYW5kLCdicmFuZCcpO1xuY29uc3QgaD1hc3NlcnRWYWx1ZUdldEhlbHBlcnMoYWxsZWdlZFZhbHVlKTtcbmNvbnN0IHZhbHVlPWguZG9Db2VyY2UoYWxsZWdlZFZhbHVlKTtcbnJldHVybiBoYXJkZW4oe2JyYW5kLHZhbHVlfSk7XG4gfSxcbi8qKlxuICogTWFrZSBzdXJlIHRoaXMgYW1vdW50IGlzIHZhbGlkIGVub3VnaCwgYW5kIHJldHVybiBhIGNvcnJlc3BvbmRpbmdcbiAqIHZhbGlkIGFtb3VudCBpZiBzby5cbiAqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHBhcmFtIHtCcmFuZDxLPn0gYnJhbmRcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSBhbGxlZ2VkQW1vdW50XG4gKiBAcmV0dXJucyB7QW1vdW50PEs+fVxuICovXG5jb2VyY2U6KGJyYW5kLGFsbGVnZWRBbW91bnQpPT57XG5hc3NlcnRSZW1vdGFibGUoYnJhbmQsJ2JyYW5kJyk7XG5hc3NlcnRSZWNvcmQoYWxsZWdlZEFtb3VudCwnYW1vdW50Jyk7XG5jb25zdHticmFuZDphbGxlZ2VkQnJhbmQsdmFsdWU6YWxsZWdlZFZhbHVlfT1hbGxlZ2VkQW1vdW50O1xuYnJhbmQ9PT1hbGxlZ2VkQnJhbmR8fFxuRmFpbCBgVGhlIGJyYW5kIGluIHRoZSBhbGxlZ2VkQW1vdW50ICR7YWxsZWdlZEFtb3VudH0gaW4gJ2NvZXJjZScgZGlkbid0IG1hdGNoIHRoZSBzcGVjaWZpZWQgYnJhbmQgJHticmFuZH0uYDtcbi8qIFdpbGwgdGhyb3cgb24gaW5hcHByb3ByaWF0ZSB2YWx1ZSovXG5yZXR1cm4gQW1vdW50TWF0aC5tYWtlKGJyYW5kLGFsbGVnZWRWYWx1ZSk7XG4gfSxcbi8qKlxuICogRXh0cmFjdCBhbmQgcmV0dXJuIHRoZSB2YWx1ZS5cbiAqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHBhcmFtIHtCcmFuZDxLPn0gYnJhbmRcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSBhbW91bnRcbiAqIEByZXR1cm5zIHtBc3NldFZhbHVlRm9yS2luZDxLPn1cbiAqL1xuZ2V0VmFsdWU6KGJyYW5kLGFtb3VudCk9PkFtb3VudE1hdGguY29lcmNlKGJyYW5kLGFtb3VudCkudmFsdWUsXG4vKipcbiAqIFJldHVybiB0aGUgYW1vdW50IHJlcHJlc2VudGluZyBhbiBlbXB0eSBhbW91bnQuIFRoaXMgaXMgdGhlXG4gKiBpZGVudGl0eSBlbGVtZW50IGZvciBNYXRoSGVscGVycy5hZGQgYW5kIE1hdEhlbHBlcnMuc3VidHJhY3QuXG4gKlxuICogQHR5cGUge3tcbiAqICAgKGJyYW5kOiBCcmFuZCk6IEFtb3VudDwnbmF0Jz47XG4gKiAgIDxLIGV4dGVuZHMgQXNzZXRLaW5kPihicmFuZDogQnJhbmQsIGFzc2V0S2luZDogSyk6IEFtb3VudDxLPjtcbiAqIH19XG4gKi9cbm1ha2VFbXB0eTooYnJhbmQsYXNzZXRLaW5kPS8qKiBAdHlwZSB7Y29uc3R9ICovJ25hdCcpPT57XG5hc3NlcnRSZW1vdGFibGUoYnJhbmQsJ2JyYW5kJyk7XG5hc3NlcnRBc3NldEtpbmQoYXNzZXRLaW5kKTtcbmNvbnN0IHZhbHVlPWhlbHBlcnNbYXNzZXRLaW5kXS5kb01ha2VFbXB0eSgpO1xucmV0dXJuIGhhcmRlbih7YnJhbmQsdmFsdWV9KTtcbiB9LFxuLyoqXG4gKiBSZXR1cm4gdGhlIGFtb3VudCByZXByZXNlbnRpbmcgYW4gZW1wdHkgYW1vdW50LCB1c2luZyBhbm90aGVyXG4gKiBhbW91bnQgYXMgdGhlIHRlbXBsYXRlIGZvciB0aGUgYnJhbmQgYW5kIGFzc2V0S2luZC5cbiAqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQHBhcmFtIHtBbW91bnQ8Sz59IGFtb3VudFxuICogQHJldHVybnMge0Ftb3VudDxLPn1cbiAqL1xubWFrZUVtcHR5RnJvbUFtb3VudDooYW1vdW50KT0+e1xuYXNzZXJ0UmVjb3JkKGFtb3VudCwnYW1vdW50Jyk7XG5jb25zdHticmFuZCx2YWx1ZX09YW1vdW50O1xuLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0Ki9cbmNvbnN0IGFzc2V0S2luZD1hc3NlcnRWYWx1ZUdldEFzc2V0S2luZCh2YWx1ZSk7XG4vKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QgKGlnbm9yZSBiL2MgZXJyb3JpbmcgaW4gQ0kgYnV0IG5vdCBteSBJREUpKi9cbnJldHVybiBBbW91bnRNYXRoLm1ha2VFbXB0eShicmFuZCxhc3NldEtpbmQpO1xuIH0sXG4vKipcbiAqIFJldHVybiB0cnVlIGlmIHRoZSBBbW91bnQgaXMgZW1wdHkuIE90aGVyd2lzZSBmYWxzZS5cbiAqXG4gKiBAcGFyYW0ge0Ftb3VudH0gYW1vdW50XG4gKiBAcGFyYW0ge0JyYW5kPX0gYnJhbmRcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5pc0VtcHR5OihhbW91bnQsYnJhbmQ9dW5kZWZpbmVkKT0+e1xuYXNzZXJ0UmVjb3JkKGFtb3VudCwnYW1vdW50Jyk7XG5jb25zdHticmFuZDphbGxlZ2VkQnJhbmQsdmFsdWV9PWFtb3VudDtcbmFzc2VydFJlbW90YWJsZShhbGxlZ2VkQnJhbmQsJ2JyYW5kJyk7XG5vcHRpb25hbEJyYW5kQ2hlY2soYWxsZWdlZEJyYW5kLGJyYW5kKTtcbmNvbnN0IGg9YXNzZXJ0VmFsdWVHZXRIZWxwZXJzKHZhbHVlKTtcbnJldHVybiBoLmRvSXNFbXB0eShoLmRvQ29lcmNlKHZhbHVlKSk7XG4gfSxcbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBsZWZ0QW1vdW50IGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGVcbiAqIHJpZ2h0QW1vdW50LiBGb3Igbm9uLXNjYWxhcnMsIFwiZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvXCIgZGVwZW5kc1xuICogb24gdGhlIGtpbmQgb2YgYW1vdW50LCBhcyBkZWZpbmVkIGJ5IHRoZSBNYXRoSGVscGVycy4gRm9yIGV4YW1wbGUsXG4gKiB3aGV0aGVyIHJlY3RhbmdsZSBBIGlzIGdyZWF0ZXIgdGhhbiByZWN0YW5nbGUgQiBkZXBlbmRzIG9uIHdoZXRoZXIgcmVjdGFuZ2xlXG4gKiBBIGluY2x1ZGVzIHJlY3RhbmdsZSBCIGFzIGRlZmluZWQgYnkgdGhlIGxvZ2ljIGluIE1hdGhIZWxwZXJzLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gbGVmdEFtb3VudFxuICogQHBhcmFtIHtBbW91bnQ8Sz59IHJpZ2h0QW1vdW50XG4gKiBAcGFyYW0ge0JyYW5kPEs+PX0gYnJhbmRcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5pc0dURToobGVmdEFtb3VudCxyaWdodEFtb3VudCxicmFuZD11bmRlZmluZWQpPT57XG5jb25zdCBoPWNoZWNrTFJBbmRHZXRIZWxwZXJzKGxlZnRBbW91bnQscmlnaHRBbW91bnQsYnJhbmQpO1xucmV0dXJuIGguZG9Jc0dURSguLi5jb2VyY2VMUihoLGxlZnRBbW91bnQscmlnaHRBbW91bnQpKTtcbiB9LFxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIGxlZnRBbW91bnQgZXF1YWxzIHRoZSByaWdodEFtb3VudC4gV2UgYXNzdW1lXG4gKiB0aGF0IGlmIGlzR1RFIGlzIHRydWUgaW4gYm90aCBkaXJlY3Rpb25zLCBpc0VxdWFsIGlzIGFsc28gdHJ1ZVxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gbGVmdEFtb3VudFxuICogQHBhcmFtIHtBbW91bnQ8Sz59IHJpZ2h0QW1vdW50XG4gKiBAcGFyYW0ge0JyYW5kPEs+PX0gYnJhbmRcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5pc0VxdWFsOihsZWZ0QW1vdW50LHJpZ2h0QW1vdW50LGJyYW5kPXVuZGVmaW5lZCk9PntcbmNvbnN0IGg9Y2hlY2tMUkFuZEdldEhlbHBlcnMobGVmdEFtb3VudCxyaWdodEFtb3VudCxicmFuZCk7XG5yZXR1cm4gaC5kb0lzRXF1YWwoLi4uY29lcmNlTFIoaCxsZWZ0QW1vdW50LHJpZ2h0QW1vdW50KSk7XG4gfSxcbi8qKlxuICogUmV0dXJucyBhIG5ldyBhbW91bnQgdGhhdCBpcyB0aGUgdW5pb24gb2YgYm90aCBsZWZ0QW1vdW50IGFuZCByaWdodEFtb3VudC5cbiAqXG4gKiBGb3IgZnVuZ2libGUgYW1vdW50IHRoaXMgbWVhbnMgYWRkaW5nIHRoZSB2YWx1ZXMuIEZvciBvdGhlciBraW5kcyBvZlxuICogYW1vdW50LCBpdCB1c3VhbGx5IG1lYW5zIGluY2x1ZGluZyBhbGwgb2YgdGhlIGVsZW1lbnRzIGZyb20gYm90aFxuICogbGVmdCBhbmQgcmlnaHQuXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEBwYXJhbSB7QW1vdW50PEs+fSBsZWZ0QW1vdW50XG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gcmlnaHRBbW91bnRcbiAqIEBwYXJhbSB7QnJhbmQ8Sz49fSBicmFuZFxuICogQHJldHVybnMge0Ftb3VudDxLPn1cbiAqL1xuYWRkOihsZWZ0QW1vdW50LHJpZ2h0QW1vdW50LGJyYW5kPXVuZGVmaW5lZCk9PntcbmNvbnN0IGg9Y2hlY2tMUkFuZEdldEhlbHBlcnMobGVmdEFtb3VudCxyaWdodEFtb3VudCxicmFuZCk7XG5jb25zdCB2YWx1ZT1oLmRvQWRkKC4uLmNvZXJjZUxSKGgsbGVmdEFtb3VudCxyaWdodEFtb3VudCkpO1xucmV0dXJuIGhhcmRlbih7YnJhbmQ6bGVmdEFtb3VudC5icmFuZCx2YWx1ZX0pO1xuIH0sXG4vKipcbiAqIFJldHVybnMgYSBuZXcgYW1vdW50IHRoYXQgaXMgdGhlIGxlZnRBbW91bnQgbWludXMgdGhlIHJpZ2h0QW1vdW50XG4gKiAoaS5lLiBldmVyeXRoaW5nIGluIHRoZSBsZWZ0QW1vdW50IHRoYXQgaXMgbm90IGluIHRoZVxuICogcmlnaHRBbW91bnQpLiBJZiBsZWZ0QW1vdW50IGRvZXNuJ3QgaW5jbHVkZSByaWdodEFtb3VudFxuICogKHN1YnRyYWN0aW9uIHJlc3VsdHMgaW4gYSBuZWdhdGl2ZSksIHRocm93ICBhbiBlcnJvci4gQmVjYXVzZSB0aGVcbiAqIGxlZnQgYW1vdW50IG11c3QgaW5jbHVkZSB0aGUgcmlnaHQgYW1vdW50LCB0aGlzIGlzIE5PVCBlcXVpdmFsZW50XG4gKiB0byBzZXQgc3VidHJhY3Rpb24uXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEBwYXJhbSB7QW1vdW50PEs+fSBsZWZ0QW1vdW50XG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gcmlnaHRBbW91bnRcbiAqIEBwYXJhbSB7QnJhbmQ8Sz49fSBicmFuZFxuICogQHJldHVybnMge0Ftb3VudDxLPn1cbiAqL1xuc3VidHJhY3Q6KGxlZnRBbW91bnQscmlnaHRBbW91bnQsYnJhbmQ9dW5kZWZpbmVkKT0+e1xuY29uc3QgaD1jaGVja0xSQW5kR2V0SGVscGVycyhsZWZ0QW1vdW50LHJpZ2h0QW1vdW50LGJyYW5kKTtcbmNvbnN0IHZhbHVlPWguZG9TdWJ0cmFjdCguLi5jb2VyY2VMUihoLGxlZnRBbW91bnQscmlnaHRBbW91bnQpKTtcbnJldHVybiBoYXJkZW4oe2JyYW5kOmxlZnRBbW91bnQuYnJhbmQsdmFsdWV9KTtcbiB9LFxuLyoqXG4gKiBSZXR1cm5zIHRoZSBtaW4gdmFsdWUgYmV0d2VlbiB4IGFuZCB5IHVzaW5nIGlzR1RFXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEBwYXJhbSB7QW1vdW50PEs+fSB4XG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0geVxuICogQHBhcmFtIHtCcmFuZDxLPj19IGJyYW5kXG4gKiBAcmV0dXJucyB7QW1vdW50PEs+fVxuICovXG5taW46KHgseSxicmFuZD11bmRlZmluZWQpPT5BbW91bnRNYXRoLmlzR1RFKHgseSxicmFuZCk/eTp4LFxuLyoqXG4gKiBSZXR1cm5zIHRoZSBtYXggdmFsdWUgYmV0d2VlbiB4IGFuZCB5IHVzaW5nIGlzR1RFXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEBwYXJhbSB7QW1vdW50PEs+fSB4XG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0geVxuICogQHBhcmFtIHtCcmFuZDxLPj19IGJyYW5kXG4gKiBAcmV0dXJucyB7QW1vdW50PEs+fVxuICovXG5tYXg6KHgseSxicmFuZD11bmRlZmluZWQpPT5BbW91bnRNYXRoLmlzR1RFKHgseSxicmFuZCk/eDp5fTskaOKAjV9vbmNlLkFtb3VudE1hdGgoQW1vdW50TWF0aCk7XG5cbmhhcmRlbihBbW91bnRNYXRoKTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHtBbW91bnR9IGFtb3VudFxuICovXG5jb25zdCBnZXRBc3NldEtpbmQ9KGFtb3VudCk9PntcbmFzc2VydFJlY29yZChhbW91bnQsJ2Ftb3VudCcpO1xuY29uc3R7dmFsdWV9PWFtb3VudDtcbi8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCAoaWdub3JlIGIvYyBlcnJvcmluZyBpbiBDSSBidXQgbm90IG15IElERSkqL1xucmV0dXJuIGFzc2VydFZhbHVlR2V0QXNzZXRLaW5kKHZhbHVlKTtcbiB9OyRo4oCNX29uY2UuZ2V0QXNzZXRLaW5kKGdldEFzc2V0S2luZCk7XG5oYXJkZW4oZ2V0QXNzZXRLaW5kKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJBc3NldEtpbmQiOlsiQXNzZXRLaW5kIl0sImFzc2VydEFzc2V0S2luZCI6WyJhc3NlcnRBc3NldEtpbmQiXSwiQW1vdW50TWF0aCI6WyJBbW91bnRNYXRoIl0sImdldEFzc2V0S2luZCI6WyJnZXRBc3NldEtpbmQiXSwiYXNzZXJ0VmFsdWVHZXRIZWxwZXJzIjpbImFzc2VydFZhbHVlR2V0SGVscGVycyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACO5t8cpAUAAKQFAAAnAAAAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL2Rpc3BsYXlJbmZvLmpzeyJpbXBvcnRzIjpbIi4vdHlwZUd1YXJkcy5qcyIsIkBhZ29yaWMvYXNzZXJ0IiwiQGFnb3JpYy9zdG9yZSJdLCJleHBvcnRzIjpbImNvZXJjZURpc3BsYXlJbmZvIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEZhaWwsZml0LERpc3BsYXlJbmZvU2hhcGU7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9hc3NlcnRcIiwgW1tcIkZhaWxcIiwgWyRo4oCNX2EgPT4gKEZhaWwgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiZml0XCIsIFskaOKAjV9hID0+IChmaXQgPSAkaOKAjV9hKV1dXV0sW1wiLi90eXBlR3VhcmRzLmpzXCIsIFtbXCJEaXNwbGF5SW5mb1NoYXBlXCIsIFskaOKAjV9hID0+IChEaXNwbGF5SW5mb1NoYXBlID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cbi8qKlxuICogQHBhcmFtIHtBZGRpdGlvbmFsRGlzcGxheUluZm99IGFsbGVnZWREaXNwbGF5SW5mb1xuICogQHBhcmFtIHtBc3NldEtpbmR9IGFzc2V0S2luZFxuICogQHJldHVybnMge0Rpc3BsYXlJbmZvfVxuICovXG5jb25zdCAgICAgICAgY29lcmNlRGlzcGxheUluZm89KGFsbGVnZWREaXNwbGF5SW5mbyxhc3NldEtpbmQpPT57XG5maXQoYWxsZWdlZERpc3BsYXlJbmZvLERpc3BsYXlJbmZvU2hhcGUsJ2Rpc3BsYXlJbmZvJyk7XG5cbmlmKGFsbGVnZWREaXNwbGF5SW5mby5hc3NldEtpbmQhPT11bmRlZmluZWQpe1xuYWxsZWdlZERpc3BsYXlJbmZvLmFzc2V0S2luZD09PWFzc2V0S2luZHx8XG5GYWlsIGBkaXNwbGF5SW5mby5hc3NldEtpbmQgd2FzIHByZXNlbnQgKCR7YWxsZWdlZERpc3BsYXlJbmZvLmFzc2V0S2luZH0pIGFuZCBkaWQgbm90IG1hdGNoIHRoZSBhc3NldEtpbmQgYXJndW1lbnQgKCR7YXNzZXRLaW5kfSlgO1xuIH1cbmNvbnN0IGRpc3BsYXlJbmZvPWhhcmRlbih7Li4uYWxsZWdlZERpc3BsYXlJbmZvLGFzc2V0S2luZH0pO1xuXG5pZihkaXNwbGF5SW5mby5kZWNpbWFsUGxhY2VzIT09dW5kZWZpbmVkKXtcbk51bWJlci5pc1NhZmVJbnRlZ2VyKGRpc3BsYXlJbmZvLmRlY2ltYWxQbGFjZXMpfHxcbkZhaWwgYGRlY2ltYWxQbGFjZXMgJHtkaXNwbGF5SW5mby5kZWNpbWFsUGxhY2VzfSBpcyBub3QgYSBzYWZlIGludGVnZXJgO1xuIH1cblxucmV0dXJuIGRpc3BsYXlJbmZvO1xuIH07JGjigI1fb25jZS5jb2VyY2VEaXNwbGF5SW5mbyhjb2VyY2VEaXNwbGF5SW5mbyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiY29lcmNlRGlzcGxheUluZm8iOlsiY29lcmNlRGlzcGxheUluZm8iXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAyb0sONMBAADTAQAAIQAAAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy9pbmRleC5qc3siaW1wb3J0cyI6WyIuL2Ftb3VudE1hdGguanMiLCIuL2lzc3VlcktpdC5qcyIsIi4vdHlwZUd1YXJkcy5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIi4vYW1vdW50TWF0aC5qcyIsIi4vaXNzdWVyS2l0LmpzIiwiLi90eXBlR3VhcmRzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9hbW91bnRNYXRoLmpzXCIsIFtdXSxbXCIuL2lzc3VlcktpdC5qc1wiLCBbXV0sW1wiLi90eXBlR3VhcmRzLmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADaWHrcMxsAADMbAAAlAAAAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL2lzc3VlcktpdC5qc3siaW1wb3J0cyI6WyIuL2Ftb3VudE1hdGguanMiLCIuL2Rpc3BsYXlJbmZvLmpzIiwiLi9wYXltZW50TGVkZ2VyLmpzIiwiLi90eXBlcy1hbWJpZW50LmpzIiwiQGFnb3JpYy9hc3NlcnQiLCJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy92YXQtZGF0YSJdLCJleHBvcnRzIjpbIm1ha2VEdXJhYmxlSXNzdWVyS2l0IiwibWFrZUlzc3VlcktpdCIsInZpdmlmeUlzc3VlcktpdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnQsYXNzZXJ0UGF0dGVybixtYWtlU2NhbGFyQmlnTWFwU3RvcmUsQXNzZXRLaW5kLGFzc2VydEFzc2V0S2luZCxjb2VyY2VEaXNwbGF5SW5mbyx2aXZpZnlQYXltZW50TGVkZ2VyOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvYXNzZXJ0XCIsIFtbXCJhc3NlcnRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJhc3NlcnRQYXR0ZXJuXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXR0ZXJuID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcIm1ha2VTY2FsYXJCaWdNYXBTdG9yZVwiLCBbJGjigI1fYSA9PiAobWFrZVNjYWxhckJpZ01hcFN0b3JlID0gJGjigI1fYSldXV1dLFtcIi4vYW1vdW50TWF0aC5qc1wiLCBbW1wiQXNzZXRLaW5kXCIsIFskaOKAjV9hID0+IChBc3NldEtpbmQgPSAkaOKAjV9hKV1dLFtcImFzc2VydEFzc2V0S2luZFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0QXNzZXRLaW5kID0gJGjigI1fYSldXV1dLFtcIi4vZGlzcGxheUluZm8uanNcIiwgW1tcImNvZXJjZURpc3BsYXlJbmZvXCIsIFskaOKAjV9hID0+IChjb2VyY2VEaXNwbGF5SW5mbyA9ICRo4oCNX2EpXV1dXSxbXCIuL3BheW1lbnRMZWRnZXIuanNcIiwgW1tcInZpdmlmeVBheW1lbnRMZWRnZXJcIiwgWyRo4oCNX2EgPT4gKHZpdmlmeVBheW1lbnRMZWRnZXIgPSAkaOKAjV9hKV1dXV0sW1wiLi90eXBlcy1hbWJpZW50LmpzXCIsIFtdXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGFnb3JpYy92YXQtZGF0YScpLkJhZ2dhZ2V9IEJhZ2dhZ2UgKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQHBhcmFtIHtCYWdnYWdlfSBpc3N1ZXJCYWdnYWdlXG4gKiBAcGFyYW0ge1NodXRkb3duV2l0aEZhaWx1cmU9fSBvcHRTaHV0ZG93bldpdGhGYWlsdXJlIElmIHRoaXMgaXNzdWVyIGZhaWxzXG4gKiBpbiB0aGUgbWlkZGxlIG9mIGFuIGF0b21pYyBhY3Rpb24gKHdoaWNoIGJ0dyBzaG91bGQgbmV2ZXIgaGFwcGVuKSwgaXRcbiAqIHBvdGVudGlhbGx5IGxlYXZlcyBpdHMgbGVkZ2VyIGluIGEgY29ycnVwdGVkIHN0YXRlLiBJZiB0aGlzIGZ1bmN0aW9uIHdhc1xuICogcHJvdmlkZWQsIHRoZW4gdGhlIGZhaWxlZCBhdG9taWMgYWN0aW9uIHdpbGwgY2FsbCBpdCwgc28gdGhhdCBzb21lXG4gKiBsYXJnZXIgdW5pdCBvZiBjb21wdXRhdGlvbiwgbGlrZSB0aGUgZW5jbG9zaW5nIHZhdCwgY2FuIGJlIHNodXRkb3duXG4gKiBiZWZvcmUgYW55dGhpbmcgZWxzZSBpcyBjb3JydXB0ZWQgYnkgdGhhdCBjb3JydXB0ZWQgc3RhdGUuXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNDM0XG4gKiBAcmV0dXJucyB7SXNzdWVyS2l0PEs+fVxuICovXG5jb25zdCAgICAgICAgdml2aWZ5SXNzdWVyS2l0PShcbmlzc3VlckJhZ2dhZ2UsXG5vcHRTaHV0ZG93bldpdGhGYWlsdXJlPXVuZGVmaW5lZCk9Plxue1xuY29uc3QgbmFtZT1pc3N1ZXJCYWdnYWdlLmdldCgnbmFtZScpO1xuLyoqIEB0eXBlIHtLfSAqL1xuY29uc3QgYXNzZXRLaW5kPWlzc3VlckJhZ2dhZ2UuZ2V0KCdhc3NldEtpbmQnKTtcbmNvbnN0IGRpc3BsYXlJbmZvPWlzc3VlckJhZ2dhZ2UuZ2V0KCdkaXNwbGF5SW5mbycpO1xuY29uc3QgZWxlbWVudFNoYXBlPWlzc3VlckJhZ2dhZ2UuZ2V0KCdlbGVtZW50U2hhcGUnKTtcbmFzc2VydC50eXBlb2YobmFtZSwnc3RyaW5nJyk7XG5hc3NlcnRBc3NldEtpbmQoYXNzZXRLaW5kKTtcblxuLyogQWRkIGFzc2V0S2luZCB0byBkaXNwbGF5SW5mbywgb3Igb3ZlcnJpZGUgaWYgcHJlc2VudCovXG5jb25zdCBjbGVhbkRpc3BsYXlJbmZvPWNvZXJjZURpc3BsYXlJbmZvKGRpc3BsYXlJbmZvLGFzc2V0S2luZCk7XG5pZihvcHRTaHV0ZG93bldpdGhGYWlsdXJlIT09dW5kZWZpbmVkKXtcbmFzc2VydC50eXBlb2Yob3B0U2h1dGRvd25XaXRoRmFpbHVyZSwnZnVuY3Rpb24nKTtcbiB9XG5cbmlmKGVsZW1lbnRTaGFwZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnRQYXR0ZXJuKGVsZW1lbnRTaGFwZSk7XG4gfVxuXG4vKiBBdHRlbnVhdGUgdGhlIHBvd2VyZnVsIGF1dGhvcml0eSB0byBtaW50IGFuZCBjaGFuZ2UgYmFsYW5jZXMqL1xuLyoqIEB0eXBlIHtQYXltZW50TGVkZ2VyPEs+fSAqL1xuLyogQHRzLWV4cGVjdC1lcnJvciBjb3VsZCBiZSBpbnN0YW50aWF0ZWQgd2l0aCBkaWZmZXJlbnQgc3VidHlwZSBvZiBBc3NldEtpbmQqL1xuY29uc3R7aXNzdWVyLG1pbnQsYnJhbmR9PXZpdmlmeVBheW1lbnRMZWRnZXIoXG5pc3N1ZXJCYWdnYWdlLFxubmFtZSxcbmFzc2V0S2luZCxcbmNsZWFuRGlzcGxheUluZm8sXG5lbGVtZW50U2hhcGUsXG5vcHRTaHV0ZG93bldpdGhGYWlsdXJlKTtcblxuXG5yZXR1cm4gaGFyZGVuKHtcbmJyYW5kLFxuaXNzdWVyLFxubWludCxcbmRpc3BsYXlJbmZvOmNsZWFuRGlzcGxheUluZm99KTtcblxuIH07JGjigI1fb25jZS52aXZpZnlJc3N1ZXJLaXQodml2aWZ5SXNzdWVyS2l0KTtcbmhhcmRlbih2aXZpZnlJc3N1ZXJLaXQpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBUaGUgbmFtZSBiZWNvbWVzIHBhcnQgb2YgdGhlIGJyYW5kIGluIGFzc2V0IGRlc2NyaXB0aW9ucy5cbiAqIFRoZSBuYW1lIGlzIHVzZWZ1bCBmb3IgZGVidWdnaW5nIGFuZCBkb3VibGUtY2hlY2tpbmdcbiAqIGFzc3VtcHRpb25zLCBidXQgc2hvdWxkIG5vdCBiZSB0cnVzdGVkIHdydCBhbnkgZXh0ZXJuYWwgbmFtZXNwYWNlLlxuICogRm9yIGV4YW1wbGUsIGFueW9uZSBjb3VsZCBjcmVhdGUgYSBuZXcgaXNzdWVyIGtpdCB3aXRoIG5hbWUgJ0JUQycsIGJ1dFxuICogaXQgaXMgbm90IGJpdGNvaW4gb3IgZXZlbiByZWxhdGVkLiBJdCBpcyBvbmx5IHRoZSBuYW1lIGFjY29yZGluZ1xuICogdG8gdGhhdCBpc3N1ZXIgYW5kIGJyYW5kLlxuICpcbiAqIFRoZSBhc3NldEtpbmQgd2lsbCBiZSB1c2VkIHRvIGltcG9ydCBhIHNwZWNpZmljIG1hdGhIZWxwZXJzXG4gKiBmcm9tIHRoZSBtYXRoSGVscGVycyBsaWJyYXJ5LiBGb3IgZXhhbXBsZSwgbmF0TWF0aEhlbHBlcnMsIHRoZVxuICogZGVmYXVsdCwgaXMgdXNlZCBmb3IgYmFzaWMgZnVuZ2libGUgdG9rZW5zLlxuICpcbiAqICBgZGlzcGxheUluZm9gIGdpdmVzIGluZm9ybWF0aW9uIHRvIHRoZSBVSSBvbiBob3cgdG8gZGlzcGxheSB0aGUgYW1vdW50LlxuICpcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gaXNzdWVyQmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7S30gW2Fzc2V0S2luZD1Bc3NldEtpbmQuTkFUXVxuICogQHBhcmFtIHtBZGRpdGlvbmFsRGlzcGxheUluZm99IFtkaXNwbGF5SW5mbz17fV1cbiAqIEBwYXJhbSB7U2h1dGRvd25XaXRoRmFpbHVyZT19IG9wdFNodXRkb3duV2l0aEZhaWx1cmUgSWYgdGhpcyBpc3N1ZXIgZmFpbHNcbiAqIGluIHRoZSBtaWRkbGUgb2YgYW4gYXRvbWljIGFjdGlvbiAod2hpY2ggYnR3IHNob3VsZCBuZXZlciBoYXBwZW4pLCBpdFxuICogcG90ZW50aWFsbHkgbGVhdmVzIGl0cyBsZWRnZXIgaW4gYSBjb3JydXB0ZWQgc3RhdGUuIElmIHRoaXMgZnVuY3Rpb24gd2FzXG4gKiBwcm92aWRlZCwgdGhlbiB0aGUgZmFpbGVkIGF0b21pYyBhY3Rpb24gd2lsbCBjYWxsIGl0LCBzbyB0aGF0IHNvbWVcbiAqIGxhcmdlciB1bml0IG9mIGNvbXB1dGF0aW9uLCBsaWtlIHRoZSBlbmNsb3NpbmcgdmF0LCBjYW4gYmUgc2h1dGRvd25cbiAqIGJlZm9yZSBhbnl0aGluZyBlbHNlIGlzIGNvcnJ1cHRlZCBieSB0aGF0IGNvcnJ1cHRlZCBzdGF0ZS5cbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM0MzRcbiAqIEBwYXJhbSB7UGFydGlhbDx7ZWxlbWVudFNoYXBlOiBQYXR0ZXJufT59IFtvcHRpb25zXVxuICogQHJldHVybnMge0lzc3VlcktpdDxLPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VEdXJhYmxlSXNzdWVyS2l0PShcbmlzc3VlckJhZ2dhZ2UsXG5uYW1lLFxuLyogQHRzLWV4cGVjdC1lcnJvciBLIGNvdWxkIGJlIGluc3RhbnRpYXRlZCB3aXRoIGEgZGlmZmVyZW50IHN1YnR5cGUgb2YgQXNzZXRLaW5kKi9cbmFzc2V0S2luZD1Bc3NldEtpbmQuTkFULFxuZGlzcGxheUluZm89aGFyZGVuKHt9KSxcbm9wdFNodXRkb3duV2l0aEZhaWx1cmU9dW5kZWZpbmVkLFxue2VsZW1lbnRTaGFwZT11bmRlZmluZWR9PXt9KT0+XG57XG5pc3N1ZXJCYWdnYWdlLmluaXQoJ25hbWUnLG5hbWUpO1xuaXNzdWVyQmFnZ2FnZS5pbml0KCdhc3NldEtpbmQnLGFzc2V0S2luZCk7XG5pc3N1ZXJCYWdnYWdlLmluaXQoJ2Rpc3BsYXlJbmZvJyxkaXNwbGF5SW5mbyk7XG5pc3N1ZXJCYWdnYWdlLmluaXQoJ2VsZW1lbnRTaGFwZScsZWxlbWVudFNoYXBlKTtcbnJldHVybiB2aXZpZnlJc3N1ZXJLaXQoaXNzdWVyQmFnZ2FnZSxvcHRTaHV0ZG93bldpdGhGYWlsdXJlKTtcbiB9OyRo4oCNX29uY2UubWFrZUR1cmFibGVJc3N1ZXJLaXQobWFrZUR1cmFibGVJc3N1ZXJLaXQpO1xuaGFyZGVuKG1ha2VEdXJhYmxlSXNzdWVyS2l0KTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9J25hdCddXG4gKiBUaGUgbmFtZSBiZWNvbWVzIHBhcnQgb2YgdGhlIGJyYW5kIGluIGFzc2V0IGRlc2NyaXB0aW9ucy5cbiAqIFRoZSBuYW1lIGlzIHVzZWZ1bCBmb3IgZGVidWdnaW5nIGFuZCBkb3VibGUtY2hlY2tpbmdcbiAqIGFzc3VtcHRpb25zLCBidXQgc2hvdWxkIG5vdCBiZSB0cnVzdGVkIHdydCBhbnkgZXh0ZXJuYWwgbmFtZXNwYWNlLlxuICogRm9yIGV4YW1wbGUsIGFueW9uZSBjb3VsZCBjcmVhdGUgYSBuZXcgaXNzdWVyIGtpdCB3aXRoIG5hbWUgJ0JUQycsIGJ1dFxuICogaXQgaXMgbm90IGJpdGNvaW4gb3IgZXZlbiByZWxhdGVkLiBJdCBpcyBvbmx5IHRoZSBuYW1lIGFjY29yZGluZ1xuICogdG8gdGhhdCBpc3N1ZXIgYW5kIGJyYW5kLlxuICpcbiAqIFRoZSBhc3NldEtpbmQgd2lsbCBiZSB1c2VkIHRvIGltcG9ydCBhIHNwZWNpZmljIG1hdGhIZWxwZXJzXG4gKiBmcm9tIHRoZSBtYXRoSGVscGVycyBsaWJyYXJ5LiBGb3IgZXhhbXBsZSwgbmF0TWF0aEhlbHBlcnMsIHRoZVxuICogZGVmYXVsdCwgaXMgdXNlZCBmb3IgYmFzaWMgZnVuZ2libGUgdG9rZW5zLlxuICpcbiAqICBgZGlzcGxheUluZm9gIGdpdmVzIGluZm9ybWF0aW9uIHRvIHRoZSBVSSBvbiBob3cgdG8gZGlzcGxheSB0aGUgYW1vdW50LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge0t9IFthc3NldEtpbmQ9J25hdCddXG4gKiBAcGFyYW0ge0FkZGl0aW9uYWxEaXNwbGF5SW5mb30gW2Rpc3BsYXlJbmZvPXt9XVxuICogQHBhcmFtIHtTaHV0ZG93bldpdGhGYWlsdXJlPX0gb3B0U2h1dGRvd25XaXRoRmFpbHVyZSBJZiB0aGlzIGlzc3VlciBmYWlsc1xuICogaW4gdGhlIG1pZGRsZSBvZiBhbiBhdG9taWMgYWN0aW9uICh3aGljaCBidHcgc2hvdWxkIG5ldmVyIGhhcHBlbiksIGl0XG4gKiBwb3RlbnRpYWxseSBsZWF2ZXMgaXRzIGxlZGdlciBpbiBhIGNvcnJ1cHRlZCBzdGF0ZS4gSWYgdGhpcyBmdW5jdGlvbiB3YXNcbiAqIHByb3ZpZGVkLCB0aGVuIHRoZSBmYWlsZWQgYXRvbWljIGFjdGlvbiB3aWxsIGNhbGwgaXQsIHNvIHRoYXQgc29tZVxuICogbGFyZ2VyIHVuaXQgb2YgY29tcHV0YXRpb24sIGxpa2UgdGhlIGVuY2xvc2luZyB2YXQsIGNhbiBiZSBzaHV0ZG93blxuICogYmVmb3JlIGFueXRoaW5nIGVsc2UgaXMgY29ycnVwdGVkIGJ5IHRoYXQgY29ycnVwdGVkIHN0YXRlLlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzQzNFxuICogQHBhcmFtIHtQYXJ0aWFsPHtlbGVtZW50U2hhcGU6IFBhdHRlcm59Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7SXNzdWVyS2l0PEs+fVxuICovXG5jb25zdCAgICAgICAgbWFrZUlzc3VlcktpdD0oXG5uYW1lLFxuLyogQHRzLWV4cGVjdC1lcnJvciBLIGNvdWxkIGJlIGluc3RhbnRpYXRlZCB3aXRoIGEgZGlmZmVyZW50IHN1YnR5cGUgb2YgQXNzZXRLaW5kKi9cbmFzc2V0S2luZD1Bc3NldEtpbmQuTkFULFxuZGlzcGxheUluZm89aGFyZGVuKHt9KSxcbm9wdFNodXRkb3duV2l0aEZhaWx1cmU9dW5kZWZpbmVkLFxue2VsZW1lbnRTaGFwZT11bmRlZmluZWR9PXt9KT0+XG5cbm1ha2VEdXJhYmxlSXNzdWVyS2l0KFxubWFrZVNjYWxhckJpZ01hcFN0b3JlKCdkcm9wcGVkIGlzc3VlciBraXQnLHtkdXJhYmxlOnRydWV9KSxcbm5hbWUsXG5hc3NldEtpbmQsXG5kaXNwbGF5SW5mbyxcbm9wdFNodXRkb3duV2l0aEZhaWx1cmUsXG57ZWxlbWVudFNoYXBlfSk7JGjigI1fb25jZS5tYWtlSXNzdWVyS2l0KG1ha2VJc3N1ZXJLaXQpO1xuXG5oYXJkZW4obWFrZUlzc3VlcktpdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsidml2aWZ5SXNzdWVyS2l0IjpbInZpdmlmeUlzc3VlcktpdCJdLCJtYWtlRHVyYWJsZUlzc3VlcktpdCI6WyJtYWtlRHVyYWJsZUlzc3VlcktpdCJdLCJtYWtlSXNzdWVyS2l0IjpbIm1ha2VJc3N1ZXJLaXQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAKS7skYwFAACMBQAAOgAAAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy9tYXRoSGVscGVycy9jb3B5QmFnTWF0aEhlbHBlcnMuanN7ImltcG9ydHMiOlsiLi4vdHlwZXMtYW1iaWVudC5qcyIsIkBhZ29yaWMvc3RvcmUiXSwiZXhwb3J0cyI6WyJjb3B5QmFnTWF0aEhlbHBlcnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQga2V5RVEsbWFrZUNvcHlCYWcsZml0LE0sZ2V0Q29weUJhZ0VudHJpZXMsYmFnSXNTdXBlcmJhZyxiYWdVbmlvbixiYWdEaXNqb2ludFN1YnRyYWN0OyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvc3RvcmVcIiwgW1tcImtleUVRXCIsIFskaOKAjV9hID0+IChrZXlFUSA9ICRo4oCNX2EpXV0sW1wibWFrZUNvcHlCYWdcIiwgWyRo4oCNX2EgPT4gKG1ha2VDb3B5QmFnID0gJGjigI1fYSldXSxbXCJmaXRcIiwgWyRo4oCNX2EgPT4gKGZpdCA9ICRo4oCNX2EpXV0sW1wiTVwiLCBbJGjigI1fYSA9PiAoTSA9ICRo4oCNX2EpXV0sW1wiZ2V0Q29weUJhZ0VudHJpZXNcIiwgWyRo4oCNX2EgPT4gKGdldENvcHlCYWdFbnRyaWVzID0gJGjigI1fYSldXSxbXCJiYWdJc1N1cGVyYmFnXCIsIFskaOKAjV9hID0+IChiYWdJc1N1cGVyYmFnID0gJGjigI1fYSldXSxbXCJiYWdVbmlvblwiLCBbJGjigI1fYSA9PiAoYmFnVW5pb24gPSAkaOKAjV9hKV1dLFtcImJhZ0Rpc2pvaW50U3VidHJhY3RcIiwgWyRo4oCNX2EgPT4gKGJhZ0Rpc2pvaW50U3VidHJhY3QgPSAkaOKAjV9hKV1dXV0sW1wiLi4vdHlwZXMtYW1iaWVudC5qc1wiLCBbXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGUge0NvcHlCYWdWYWx1ZX0gKi9cbmNvbnN0IGVtcHR5PW1ha2VDb3B5QmFnKFtdKTtcblxuLyoqXG4gKiBAdHlwZSB7TWF0aEhlbHBlcnM8Q29weUJhZ1ZhbHVlPn1cbiAqL1xuY29uc3QgICAgICAgIGNvcHlCYWdNYXRoSGVscGVycz1oYXJkZW4oe1xuZG9Db2VyY2U6KGJhZyk9PntcbmZpdChiYWcsTS5iYWcoKSwnYmFnIG9mIGFtb3VudCcpO1xucmV0dXJuIGJhZztcbiB9LFxuZG9NYWtlRW1wdHk6KCk9PmVtcHR5LFxuZG9Jc0VtcHR5OihiYWcpPT5nZXRDb3B5QmFnRW50cmllcyhiYWcpLmxlbmd0aD09PTAsXG5kb0lzR1RFOmJhZ0lzU3VwZXJiYWcsXG5kb0lzRXF1YWw6a2V5RVEsXG5kb0FkZDpiYWdVbmlvbixcbmRvU3VidHJhY3Q6YmFnRGlzam9pbnRTdWJ0cmFjdH0pOyRo4oCNX29uY2UuY29weUJhZ01hdGhIZWxwZXJzKGNvcHlCYWdNYXRoSGVscGVycyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiY29weUJhZ01hdGhIZWxwZXJzIjpbImNvcHlCYWdNYXRoSGVscGVycyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADliLpcmQUAAJkFAAA6AAAAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL21hdGhIZWxwZXJzL2NvcHlTZXRNYXRoSGVscGVycy5qc3siaW1wb3J0cyI6WyIuLi90eXBlcy1hbWJpZW50LmpzIiwiQGFnb3JpYy9zdG9yZSJdLCJleHBvcnRzIjpbImNvcHlTZXRNYXRoSGVscGVycyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBrZXlFUSxtYWtlQ29weVNldCxmaXQsTSxnZXRDb3B5U2V0S2V5cyxzZXRJc1N1cGVyc2V0LHNldERpc2pvaW50VW5pb24sc2V0RGlzam9pbnRTdWJ0cmFjdDskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJrZXlFUVwiLCBbJGjigI1fYSA9PiAoa2V5RVEgPSAkaOKAjV9hKV1dLFtcIm1ha2VDb3B5U2V0XCIsIFskaOKAjV9hID0+IChtYWtlQ29weVNldCA9ICRo4oCNX2EpXV0sW1wiZml0XCIsIFskaOKAjV9hID0+IChmaXQgPSAkaOKAjV9hKV1dLFtcIk1cIiwgWyRo4oCNX2EgPT4gKE0gPSAkaOKAjV9hKV1dLFtcImdldENvcHlTZXRLZXlzXCIsIFskaOKAjV9hID0+IChnZXRDb3B5U2V0S2V5cyA9ICRo4oCNX2EpXV0sW1wic2V0SXNTdXBlcnNldFwiLCBbJGjigI1fYSA9PiAoc2V0SXNTdXBlcnNldCA9ICRo4oCNX2EpXV0sW1wic2V0RGlzam9pbnRVbmlvblwiLCBbJGjigI1fYSA9PiAoc2V0RGlzam9pbnRVbmlvbiA9ICRo4oCNX2EpXV0sW1wic2V0RGlzam9pbnRTdWJ0cmFjdFwiLCBbJGjigI1fYSA9PiAoc2V0RGlzam9pbnRTdWJ0cmFjdCA9ICRo4oCNX2EpXV1dXSxbXCIuLi90eXBlcy1hbWJpZW50LmpzXCIsIFtdXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZSB7Q29weVNldFZhbHVlfSAqL1xuY29uc3QgZW1wdHk9bWFrZUNvcHlTZXQoW10pO1xuXG4vKipcbiAqIEB0eXBlIHtDb3B5U2V0TWF0aEhlbHBlcnN9XG4gKi9cbmNvbnN0ICAgICAgICBjb3B5U2V0TWF0aEhlbHBlcnM9aGFyZGVuKHtcbmRvQ29lcmNlOihzZXQpPT57XG5maXQoc2V0LE0uc2V0KCksJ3NldCBvZiBhbW91bnQnKTtcbnJldHVybiBzZXQ7XG4gfSxcbmRvTWFrZUVtcHR5OigpPT5lbXB0eSxcbmRvSXNFbXB0eTooc2V0KT0+Z2V0Q29weVNldEtleXMoc2V0KS5sZW5ndGg9PT0wLFxuZG9Jc0dURTpzZXRJc1N1cGVyc2V0LFxuZG9Jc0VxdWFsOmtleUVRLFxuZG9BZGQ6c2V0RGlzam9pbnRVbmlvbixcbmRvU3VidHJhY3Q6c2V0RGlzam9pbnRTdWJ0cmFjdH0pOyRo4oCNX29uY2UuY29weVNldE1hdGhIZWxwZXJzKGNvcHlTZXRNYXRoSGVscGVycyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiY29weVNldE1hdGhIZWxwZXJzIjpbImNvcHlTZXRNYXRoSGVscGVycyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABPEGsAEwYAABMGAAA2AAAAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL21hdGhIZWxwZXJzL25hdE1hdGhIZWxwZXJzLmpzeyJpbXBvcnRzIjpbIi4uL3R5cGVzLWFtYmllbnQuanMiLCJAYWdvcmljL25hdCJdLCJleHBvcnRzIjpbIm5hdE1hdGhIZWxwZXJzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IE5hdCxpc05hdDskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL25hdFwiLCBbW1wiTmF0XCIsIFskaOKAjV9hID0+IChOYXQgPSAkaOKAjV9hKV1dLFtcImlzTmF0XCIsIFskaOKAjV9hID0+IChpc05hdCA9ICRo4oCNX2EpXV1dXSxbXCIuLi90eXBlcy1hbWJpZW50LmpzXCIsIFtdXV0pOyAgIFxuXG5cblxuY29uc3R7RmFpbH09YXNzZXJ0O1xuY29uc3QgZW1wdHk9MG47XG5cbi8qKlxuICogRnVuZ2libGUgZGlnaXRhbCBhc3NldHMgdXNlIHRoZSBuYXRNYXRoSGVscGVycyB0byBtYW5hZ2UgYmFsYW5jZXMgLVxuICogdGhlIG9wZXJhdGlvbnMgYXJlIG1lcmVseSBhcml0aG1ldGljIG9uIG5hdHVyYWwsIG5vbi1uZWdhdGl2ZVxuICogbnVtYmVycy5cbiAqXG4gKiBOYXR1cmFsIG51bWJlcnMgYXJlIHVzZWQgZm9yIGZ1bmdpYmxlIGVyaWdodHMgc3VjaCBhcyBtb25leSBiZWNhdXNlXG4gKiByb3VuZGluZyBpc3N1ZXMgbWFrZSBmbG9hdHMgcHJvYmxlbWF0aWMuIEFsbCBvcGVyYXRpb25zIHNob3VsZCBiZVxuICogZG9uZSB3aXRoIHRoZSBzbWFsbGVzdCB3aG9sZSB1bml0IHN1Y2ggdGhhdCB0aGUgTmF0TWF0aEhlbHBlcnMgbmV2ZXJcbiAqIGRlYWxzIHdpdGggZnJhY3Rpb25hbCBwYXJ0cy5cbiAqXG4gKiBAdHlwZSB7TWF0aEhlbHBlcnM8TmF0VmFsdWU+fVxuICovXG5jb25zdCAgICAgICAgbmF0TWF0aEhlbHBlcnM9aGFyZGVuKHtcbmRvQ29lcmNlOihuYXQpPT57XG4vKiBUT0RPOiB0aWdodGVuIHRoZSBkZWZpbml0aW9uIG9mIE5hdCBpbiBAYWdvcmljL25hdCB0byB0aHJvdyBvbiBgbnVtYmVyYCovXG5hc3NlcnQudHlwZW9mKG5hdCwnYmlnaW50Jyk7XG5pc05hdChuYXQpfHxGYWlsIGB2YWx1ZSAke25hdH0gbXVzdCBiZSBhIG5hdHVyYWwgbnVtYmVyYDtcbnJldHVybiBOYXQobmF0KTtcbiB9LFxuZG9NYWtlRW1wdHk6KCk9PmVtcHR5LFxuZG9Jc0VtcHR5OihuYXQpPT5uYXQ9PT1lbXB0eSxcbmRvSXNHVEU6KGxlZnQscmlnaHQpPT5sZWZ0Pj1yaWdodCxcbmRvSXNFcXVhbDoobGVmdCxyaWdodCk9PmxlZnQ9PT1yaWdodCxcbi8qIEJpZ0ludHMgZG9uJ3Qgb2JzZXJ2YWJseSBvdmVyZmxvdyovXG5kb0FkZDoobGVmdCxyaWdodCk9PmxlZnQrcmlnaHQsXG5kb1N1YnRyYWN0OihsZWZ0LHJpZ2h0KT0+TmF0KGxlZnQtcmlnaHQpfSk7JGjigI1fb25jZS5uYXRNYXRoSGVscGVycyhuYXRNYXRoSGVscGVycyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibmF0TWF0aEhlbHBlcnMiOlsibmF0TWF0aEhlbHBlcnMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAkYC5rn8HAAB/BwAANgAAAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy9tYXRoSGVscGVycy9zZXRNYXRoSGVscGVycy5qc3siaW1wb3J0cyI6WyIuLi90eXBlcy1hbWJpZW50LmpzIiwiQGFnb3JpYy9zdG9yZSIsIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJzZXRNYXRoSGVscGVycyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBwYXNzU3R5bGVPZixhc3NlcnRLZXksZWxlbWVudHNJc1N1cGVyc2V0LGVsZW1lbnRzRGlzam9pbnRVbmlvbixlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QsY29lcmNlVG9FbGVtZW50cyxlbGVtZW50c0NvbXBhcmU7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcImFzc2VydEtleVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0S2V5ID0gJGjigI1fYSldXSxbXCJlbGVtZW50c0lzU3VwZXJzZXRcIiwgWyRo4oCNX2EgPT4gKGVsZW1lbnRzSXNTdXBlcnNldCA9ICRo4oCNX2EpXV0sW1wiZWxlbWVudHNEaXNqb2ludFVuaW9uXCIsIFskaOKAjV9hID0+IChlbGVtZW50c0Rpc2pvaW50VW5pb24gPSAkaOKAjV9hKV1dLFtcImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdFwiLCBbJGjigI1fYSA9PiAoZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0ID0gJGjigI1fYSldXSxbXCJjb2VyY2VUb0VsZW1lbnRzXCIsIFskaOKAjV9hID0+IChjb2VyY2VUb0VsZW1lbnRzID0gJGjigI1fYSldXSxbXCJlbGVtZW50c0NvbXBhcmVcIiwgWyRo4oCNX2EgPT4gKGVsZW1lbnRzQ29tcGFyZSA9ICRo4oCNX2EpXV1dXSxbXCIuLi90eXBlcy1hbWJpZW50LmpzXCIsIFtdXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG4vKiBPcGVyYXRpb25zIGZvciBhcnJheXMgd2l0aCB1bmlxdWUgb2JqZWN0cyBpZGVudGlmeWluZyBhbmQgcHJvdmlkaW5nKi9cbi8qIGluZm9ybWF0aW9uIGFib3V0IGRpZ2l0YWwgYXNzZXRzLiBVc2VkIGZvciBab2UgaW52aXRlcy4qL1xuLyoqIEB0eXBlIHtTZXRWYWx1ZX0gKi9cbmNvbnN0IGVtcHR5PWhhcmRlbihbXSk7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgUmVwbGFjZSBhcnJheS1iYXNlZCBTZXRNYXRoIHdpdGggQ29weVNldC1iYXNlZCBDb3B5U2V0TWF0aFxuICogQHR5cGUge1NldE1hdGhIZWxwZXJzfVxuICovXG5jb25zdCAgICAgICAgc2V0TWF0aEhlbHBlcnM9aGFyZGVuKHtcbmRvQ29lcmNlOihsaXN0KT0+e1xubGlzdD1jb2VyY2VUb0VsZW1lbnRzKGxpc3QpO1xuLyogQXNzZXJ0IHRoYXQgbGlzdCBjb250YWlucyBvbmx5Ki9cbi8qICogcGFzcy1ieS1jb3B5IHByaW1pdGl2ZXMsKi9cbi8qICogcGFzcy1ieS1jb3B5IGNvbnRhaW5lcnMgY29udGFpbmluZyBrZXlzLCovXG4vKiAqIHJlbW90YWJsZXMuKi9cbmFzc2VydEtleShsaXN0KTtcbnJldHVybiBsaXN0O1xuIH0sXG5kb01ha2VFbXB0eTooKT0+ZW1wdHksXG5kb0lzRW1wdHk6KGxpc3QpPT5wYXNzU3R5bGVPZihsaXN0KT09PSdjb3B5QXJyYXknJiZsaXN0Lmxlbmd0aD09PTAsXG5kb0lzR1RFOmVsZW1lbnRzSXNTdXBlcnNldCxcbmRvSXNFcXVhbDooeCx5KT0+ZWxlbWVudHNDb21wYXJlKHgseSk9PT0wLFxuZG9BZGQ6ZWxlbWVudHNEaXNqb2ludFVuaW9uLFxuZG9TdWJ0cmFjdDplbGVtZW50c0Rpc2pvaW50U3VidHJhY3R9KTskaOKAjV9vbmNlLnNldE1hdGhIZWxwZXJzKHNldE1hdGhIZWxwZXJzKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJzZXRNYXRoSGVscGVycyI6WyJzZXRNYXRoSGVscGVycyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAEVD8rgQQAAIEEAAAjAAAAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL3BheW1lbnQuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvdmF0LWRhdGEiXSwiZXhwb3J0cyI6WyJ2aXZpZnlQYXltZW50S2luZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBpbml0RW1wdHksdml2aWZ5RmFyQ2xhc3M7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiaW5pdEVtcHR5XCIsIFskaOKAjV9hID0+IChpbml0RW1wdHkgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1widml2aWZ5RmFyQ2xhc3NcIiwgWyRo4oCNX2EgPT4gKHZpdmlmeUZhckNsYXNzID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAYWdvcmljL3ZhdC1kYXRhJykuQmFnZ2FnZX0gQmFnZ2FnZSAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGlzc3VlckJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge0JyYW5kPEs+fSBicmFuZFxuICogQHBhcmFtIHtJbnRlcmZhY2VHdWFyZH0gUGF5bWVudElcbiAqIEByZXR1cm5zIHsoKSA9PiBQYXltZW50PEs+fVxuICovXG5jb25zdCAgICAgICAgdml2aWZ5UGF5bWVudEtpbmQ9KGlzc3VlckJhZ2dhZ2UsbmFtZSxicmFuZCxQYXltZW50SSk9PntcbmNvbnN0IG1ha2VQYXltZW50PXZpdmlmeUZhckNsYXNzKFxuaXNzdWVyQmFnZ2FnZSxcbiBgJHtuYW1lfSBwYXltZW50YCxcblBheW1lbnRJLFxuaW5pdEVtcHR5LFxue1xuZ2V0QWxsZWdlZEJyYW5kKCl7XG5yZXR1cm4gYnJhbmQ7XG4gfX0pO1xuXG5cbnJldHVybiBtYWtlUGF5bWVudDtcbiB9OyRo4oCNX29uY2Uudml2aWZ5UGF5bWVudEtpbmQodml2aWZ5UGF5bWVudEtpbmQpO1xuaGFyZGVuKHZpdmlmeVBheW1lbnRLaW5kKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJ2aXZpZnlQYXltZW50S2luZCI6WyJ2aXZpZnlQYXltZW50S2luZCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACpSD8cnDwAAJw8AAApAAAAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL3BheW1lbnRMZWRnZXIuanN7ImltcG9ydHMiOlsiLi9hbW91bnRNYXRoLmpzIiwiLi9wYXltZW50LmpzIiwiLi9wdXJzZS5qcyIsIi4vdHlwZUd1YXJkcy5qcyIsIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL3N0b3JlL2V4cG9ydGVkLmpzIiwiQGFnb3JpYy92YXQtZGF0YSIsIkBlbmRvL21hcnNoYWwiLCJAZW5kby9wcm9taXNlLWtpdCJdLCJleHBvcnRzIjpbInZpdmlmeVBheW1lbnRMZWRnZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgaXNQcm9taXNlLGFzc2VydENvcHlBcnJheSxmaXQsTSxwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSx2aXZpZnlGYXJJbnN0YW5jZSxBbW91bnRNYXRoLHZpdmlmeVBheW1lbnRLaW5kLHZpdmlmeVB1cnNlS2luZCxCcmFuZEksbWFrZUlzc3VlckludGVyZmFjZXM7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcImlzUHJvbWlzZVwiLCBbJGjigI1fYSA9PiAoaXNQcm9taXNlID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcImFzc2VydENvcHlBcnJheVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q29weUFycmF5ID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcImZpdFwiLCBbJGjigI1fYSA9PiAoZml0ID0gJGjigI1fYSldXSxbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcInByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlXCIsIFskaOKAjV9hID0+IChwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSA9ICRo4oCNX2EpXV0sW1widml2aWZ5RmFySW5zdGFuY2VcIiwgWyRo4oCNX2EgPT4gKHZpdmlmeUZhckluc3RhbmNlID0gJGjigI1fYSldXV1dLFtcIi4vYW1vdW50TWF0aC5qc1wiLCBbW1wiQW1vdW50TWF0aFwiLCBbJGjigI1fYSA9PiAoQW1vdW50TWF0aCA9ICRo4oCNX2EpXV1dXSxbXCIuL3BheW1lbnQuanNcIiwgW1tcInZpdmlmeVBheW1lbnRLaW5kXCIsIFskaOKAjV9hID0+ICh2aXZpZnlQYXltZW50S2luZCA9ICRo4oCNX2EpXV1dXSxbXCIuL3B1cnNlLmpzXCIsIFtbXCJ2aXZpZnlQdXJzZUtpbmRcIiwgWyRo4oCNX2EgPT4gKHZpdmlmeVB1cnNlS2luZCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlL2V4cG9ydGVkLmpzXCIsIFtdXSxbXCIuL3R5cGVHdWFyZHMuanNcIiwgW1tcIkJyYW5kSVwiLCBbJGjigI1fYSA9PiAoQnJhbmRJID0gJGjigI1fYSldXSxbXCJtYWtlSXNzdWVySW50ZXJmYWNlc1wiLCBbJGjigI1fYSA9PiAobWFrZUlzc3VlckludGVyZmFjZXMgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BhZ29yaWMvdmF0LWRhdGEnKS5CYWdnYWdlfSBCYWdnYWdlICovXG5cbmNvbnN0e2RldGFpbHM6WCxxdW90ZTpxLEZhaWx9PWFzc2VydDtcblxuY29uc3QgYW1vdW50U2hhcGVGcm9tRWxlbWVudFNoYXBlPShicmFuZCxhc3NldEtpbmQsZWxlbWVudFNoYXBlKT0+e1xubGV0IHZhbHVlU2hhcGU7XG5zd2l0Y2goYXNzZXRLaW5kKXtcbmNhc2UnbmF0Jzp7XG52YWx1ZVNoYXBlPU0ubmF0KCk7XG5lbGVtZW50U2hhcGU9PT11bmRlZmluZWR8fFxuRmFpbCBgRnVuZ2libGUgYXNzZXRzIGNhbm5vdCBoYXZlIGFuIGVsZW1lbnRTaGFwZTogJHtxKGVsZW1lbnRTaGFwZSl9YDtcbmJyZWFrO1xuIH1cbmNhc2Unc2V0Jzp7XG5pZihlbGVtZW50U2hhcGU9PT11bmRlZmluZWQpe1xudmFsdWVTaGFwZT1NLmFycmF5T2YoTS5rZXkoKSk7XG4gfWVsc2V7XG52YWx1ZVNoYXBlPU0uYXJyYXlPZihNLmFuZChNLmtleSgpLGVsZW1lbnRTaGFwZSkpO1xuIH1cbmJyZWFrO1xuIH1cbmNhc2UnY29weVNldCc6e1xuaWYoZWxlbWVudFNoYXBlPT09dW5kZWZpbmVkKXtcbnZhbHVlU2hhcGU9TS5zZXQoKTtcbiB9ZWxzZXtcbnZhbHVlU2hhcGU9TS5zZXRPZihlbGVtZW50U2hhcGUpO1xuIH1cbmJyZWFrO1xuIH1cbmNhc2UnY29weUJhZyc6e1xuaWYoZWxlbWVudFNoYXBlPT09dW5kZWZpbmVkKXtcbnZhbHVlU2hhcGU9TS5iYWcoKTtcbiB9ZWxzZXtcbnZhbHVlU2hhcGU9TS5iYWdPZihlbGVtZW50U2hhcGUpO1xuIH1cbmJyZWFrO1xuIH1cbmRlZmF1bHQ6e1xuRmFpbCBgdW5leHBlY3RlZCBhc3NldCBraW5kICR7cShhc3NldEtpbmQpfWA7XG4gfX1cblxuXG5jb25zdCBhbW91bnRTaGFwZT1oYXJkZW4oe1xuYnJhbmQsLyogbWF0Y2hlcyBvbmx5IHRoaXMgZXhhY3QgYnJhbmQqL1xudmFsdWU6dmFsdWVTaGFwZX0pO1xuXG5yZXR1cm4gYW1vdW50U2hhcGU7XG4gfTtcblxuLyoqXG4gKiBNYWtlIHRoZSBwYXltZW50TGVkZ2VyLCB0aGUgc291cmNlIG9mIHRydXRoIGZvciB0aGUgYmFsYW5jZXMgb2ZcbiAqIHBheW1lbnRzLiBBbGwgbWludGluZyBhbmQgdHJhbnNmZXIgYXV0aG9yaXR5IG9yaWdpbmF0ZXMgaGVyZS5cbiAqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQHBhcmFtIHtCYWdnYWdlfSBpc3N1ZXJCYWdnYWdlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtLfSBhc3NldEtpbmRcbiAqIEBwYXJhbSB7RGlzcGxheUluZm88Sz59IGRpc3BsYXlJbmZvXG4gKiBAcGFyYW0ge1BhdHRlcm59IGVsZW1lbnRTaGFwZVxuICogQHBhcmFtIHtTaHV0ZG93bldpdGhGYWlsdXJlPX0gb3B0U2h1dGRvd25XaXRoRmFpbHVyZVxuICogQHJldHVybnMge1BheW1lbnRMZWRnZXI8Sz59XG4gKi9cbmNvbnN0ICAgICAgICB2aXZpZnlQYXltZW50TGVkZ2VyPShcbmlzc3VlckJhZ2dhZ2UsXG5uYW1lLFxuYXNzZXRLaW5kLFxuZGlzcGxheUluZm8sXG5lbGVtZW50U2hhcGUsXG5vcHRTaHV0ZG93bldpdGhGYWlsdXJlPXVuZGVmaW5lZCk9Plxue1xuLyoqIEB0eXBlIHtCcmFuZDxLPn0gKi9cbmNvbnN0IGJyYW5kPXZpdmlmeUZhckluc3RhbmNlKGlzc3VlckJhZ2dhZ2UsIGAke25hbWV9IGJyYW5kYCxCcmFuZEkse1xuaXNNeUlzc3VlcihhbGxlZ2VkSXNzdWVyKXtcbi8qIEJyYW5kSSBkZWxheXMgY2FsbGluZyB0aGlzIG1ldGhvZCB1bnRpbCBgYWxsZWdlZElzc3VlcmAgaXMgYSBSZW1vdGFibGUqL1xucmV0dXJuIGFsbGVnZWRJc3N1ZXI9PT1pc3N1ZXI7XG4gfSxcbmdldEFsbGVnZWROYW1lKCl7XG5yZXR1cm4gbmFtZTtcbiB9LFxuLyogR2l2ZSBpbmZvcm1hdGlvbiB0byBVSSBvbiBob3cgdG8gZGlzcGxheSB0aGUgYW1vdW50LiovXG5nZXREaXNwbGF5SW5mbygpe1xucmV0dXJuIGRpc3BsYXlJbmZvO1xuIH0sXG5nZXRBbW91bnRTaGFwZSgpe1xucmV0dXJuIGFtb3VudFNoYXBlO1xuIH19KTtcblxuXG5jb25zdCBlbXB0eUFtb3VudD1BbW91bnRNYXRoLm1ha2VFbXB0eShicmFuZCxhc3NldEtpbmQpO1xuY29uc3QgYW1vdW50U2hhcGU9YW1vdW50U2hhcGVGcm9tRWxlbWVudFNoYXBlKFxuYnJhbmQsXG5hc3NldEtpbmQsXG5lbGVtZW50U2hhcGUpO1xuXG5cbmNvbnN0e0lzc3VlckksTWludEksUGF5bWVudEksUHVyc2VJS2l0fT1tYWtlSXNzdWVySW50ZXJmYWNlcyhcbmJyYW5kLFxuYXNzZXRLaW5kLFxuYW1vdW50U2hhcGUpO1xuXG5cbmNvbnN0IG1ha2VQYXltZW50PXZpdmlmeVBheW1lbnRLaW5kKGlzc3VlckJhZ2dhZ2UsbmFtZSxicmFuZCxQYXltZW50SSk7XG5cbi8qKiBAdHlwZSB7U2h1dGRvd25XaXRoRmFpbHVyZX0gKi9cbmNvbnN0IHNodXRkb3duTGVkZ2VyV2l0aEZhaWx1cmU9KHJlYXNvbik9Pntcbi8qIFRPRE8gVGhpcyBzaG91bGQgYWxzbyBkZXN0cm95IGxlZGdlciBzdGF0ZS4qL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzQzNCovXG5pZihvcHRTaHV0ZG93bldpdGhGYWlsdXJlIT09dW5kZWZpbmVkKXtcbnRyeXtcbm9wdFNodXRkb3duV2l0aEZhaWx1cmUocmVhc29uKTtcbiB9Y2F0Y2goZXJySW5TaHV0ZG93bil7XG5hc3NlcnQubm90ZShlcnJJblNodXRkb3duLFggYENhdXNlZCBieTogJHtyZWFzb259YCk7XG50aHJvdyBlcnJJblNodXRkb3duO1xuIH1cbiB9XG50aHJvdyByZWFzb247XG4gfTtcblxuLyoqIEB0eXBlIHtXZWFrTWFwU3RvcmU8UGF5bWVudCwgQW1vdW50Pn0gKi9cbmNvbnN0IHBheW1lbnRMZWRnZXI9cHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUoXG5pc3N1ZXJCYWdnYWdlLFxuJ3BheW1lbnRMZWRnZXInKTtcblxuXG4vKipcbiAqIEEgd2l0aGRyYXduIGxpdmUgcGF5bWVudCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIHJlY292ZXJ5IHNldCBvZlxuICogdGhlIHB1cnNlIGl0IHdhcyB3aXRoZHJhd24gZnJvbS4gTGV0J3MgY2FsbCB0aGVzZSBcInJlY292ZXJhYmxlXCJcbiAqIHBheW1lbnRzLiBBbGwgcmVjb3ZlcmFibGUgcGF5bWVudHMgYXJlIGxpdmUsIGJ1dCBub3QgYWxsIGxpdmVcbiAqIHBheW1lbnRzIGFyZSByZWNvdmVyYWJsZS4gV2UgZG8gdGhlIGJvb2trZWVwaW5nIGZvciBwYXltZW50IHJlY292ZXJ5XG4gKiB3aXRoIHRoaXMgd2Vha21hcCBmcm9tIHJlY292ZXJhYmxlIHBheW1lbnRzIHRvIHRoZSByZWNvdmVyeSBzZXQgdGhleSBhcmVcbiAqIGluLlxuICogQSBidW5jaCBvZiBpbnRlcmVzdGluZyBpbnZhcmlhbnRzIGhlcmU6XG4gKiAgICAqIEV2ZXJ5IHBheW1lbnQgdGhhdCBpcyBhIGtleSBpbiB0aGUgb3V0ZXIgYHBheW1lbnRSZWNvdmVyeVNldHNgXG4gKiAgICAgIHdlYWtNYXAgaXMgYWxzbyBpbiB0aGUgcmVjb3Zlcnkgc2V0IGluZGV4ZWQgYnkgdGhhdCBwYXltZW50LlxuICogICAgKiBJbXBsaWVkIGJ5IHRoZSBhYm92ZSBidXQgd29ydGggc3RhdGluZzogdGhlIHBheW1lbnQgaXMgb25seVxuICogICAgICBpbiBhdCBtb3N0IG9uZSByZWNvdmVyeSBzZXQuXG4gKiAgICAqIEEgcmVjb3Zlcnkgc2V0IG9ubHkgY29udGFpbnMgc3VjaCBwYXltZW50cy5cbiAqICAgICogRXZlcnkgcHVyc2UgaXMgYXNzb2NpYXRlZCB3aXRoIGV4YWN0bHkgb25lIHJlY292ZXJ5IHNldCB1bmlxdWUgdG9cbiAqICAgICAgaXQuXG4gKiAgICAqIEEgcHVyc2UncyByZWNvdmVyeSBzZXQgb25seSBjb250YWlucyBwYXltZW50cyB3aXRoZHJhd24gZnJvbVxuICogICAgICB0aGF0IHB1cnNlIGFuZCBub3QgeWV0IGNvbnN1bWVkLlxuICpcbiAqIEB0eXBlIHtXZWFrTWFwU3RvcmU8UGF5bWVudCwgU2V0U3RvcmU8UGF5bWVudD4+fVxuICovXG5jb25zdCBwYXltZW50UmVjb3ZlcnlTZXRzPXByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlKFxuaXNzdWVyQmFnZ2FnZSxcbidwYXltZW50UmVjb3ZlcnlTZXRzJyk7XG5cblxuLyoqXG4gKiBUbyBtYWludGFpbiB0aGUgaW52YXJpYW50cyBsaXN0ZWQgaW4gdGhlIGBwYXltZW50UmVjb3ZlcnlTZXRzYCBjb21tZW50LFxuICogYGluaXRQYXltZW50YCBzaG91bGQgY29udGFpbiB0aGUgb25seVxuICogY2FsbCB0byBgcGF5bWVudExlZGdlci5pbml0YC5cbiAqXG4gKiBAcGFyYW0ge1BheW1lbnR9IHBheW1lbnRcbiAqIEBwYXJhbSB7QW1vdW50fSBhbW91bnRcbiAqIEBwYXJhbSB7U2V0U3RvcmU8UGF5bWVudD59IFtvcHRSZWNvdmVyeVNldF1cbiAqL1xuY29uc3QgaW5pdFBheW1lbnQ9KHBheW1lbnQsYW1vdW50LG9wdFJlY292ZXJ5U2V0PXVuZGVmaW5lZCk9PntcbmlmKG9wdFJlY292ZXJ5U2V0IT09dW5kZWZpbmVkKXtcbm9wdFJlY292ZXJ5U2V0LmFkZChwYXltZW50KTtcbnBheW1lbnRSZWNvdmVyeVNldHMuaW5pdChwYXltZW50LG9wdFJlY292ZXJ5U2V0KTtcbiB9XG5wYXltZW50TGVkZ2VyLmluaXQocGF5bWVudCxhbW91bnQpO1xuIH07XG5cbi8qKlxuICogVG8gbWFpbnRhaW4gdGhlIGludmFyaWFudHMgbGlzdGVkIGluIHRoZSBgcGF5bWVudFJlY292ZXJ5U2V0c2AgY29tbWVudCxcbiAqIGBkZWxldGVQYXltZW50YCBzaG91bGQgY29udGFpbiB0aGUgb25seVxuICogY2FsbCB0byBgcGF5bWVudExlZGdlci5kZWxldGVgLlxuICpcbiAqIEBwYXJhbSB7UGF5bWVudH0gcGF5bWVudFxuICovXG5jb25zdCBkZWxldGVQYXltZW50PShwYXltZW50KT0+e1xucGF5bWVudExlZGdlci5kZWxldGUocGF5bWVudCk7XG5pZihwYXltZW50UmVjb3ZlcnlTZXRzLmhhcyhwYXltZW50KSl7XG5jb25zdCByZWNvdmVyeVNldD1wYXltZW50UmVjb3ZlcnlTZXRzLmdldChwYXltZW50KTtcbnBheW1lbnRSZWNvdmVyeVNldHMuZGVsZXRlKHBheW1lbnQpO1xucmVjb3ZlcnlTZXQuZGVsZXRlKHBheW1lbnQpO1xuIH1cbiB9O1xuXG4vKiogQHR5cGUgeyhsZWZ0OiBBbW91bnQsIHJpZ2h0OiBBbW91bnQpID0+IEFtb3VudCB9ICovXG5jb25zdCBhZGQ9KGxlZnQscmlnaHQpPT5BbW91bnRNYXRoLmFkZChsZWZ0LHJpZ2h0LGJyYW5kKTtcbi8qKiBAdHlwZSB7KGxlZnQ6IEFtb3VudCwgcmlnaHQ6IEFtb3VudCkgPT4gQW1vdW50IH0gKi9cbmNvbnN0IHN1YnRyYWN0PShsZWZ0LHJpZ2h0KT0+QW1vdW50TWF0aC5zdWJ0cmFjdChsZWZ0LHJpZ2h0LGJyYW5kKTtcbi8qKiBAdHlwZSB7KGFsbGVnZWRBbW91bnQ6IEFtb3VudCkgPT4gQW1vdW50fSAqL1xuY29uc3QgY29lcmNlPShhbGxlZ2VkQW1vdW50KT0+QW1vdW50TWF0aC5jb2VyY2UoYnJhbmQsYWxsZWdlZEFtb3VudCk7XG4vKiogQHR5cGUgeyhsZWZ0OiBBbW91bnQsIHJpZ2h0OiBBbW91bnQpID0+IGJvb2xlYW4gfSAqL1xuY29uc3QgaXNFcXVhbD0obGVmdCxyaWdodCk9PkFtb3VudE1hdGguaXNFcXVhbChsZWZ0LHJpZ2h0LGJyYW5kKTtcblxuLyoqXG4gKiBNZXRob2RzIGxpa2UgZGVwb3NpdCgpIGhhdmUgYW4gb3B0aW9uYWwgc2Vjb25kIHBhcmFtZXRlclxuICogYG9wdEFtb3VudFNoYXBlYFxuICogd2hpY2gsIGlmIHByZXNlbnQsIGlzIHN1cHBvc2VkIHRvIG1hdGNoIHRoZSBiYWxhbmNlIG9mIHRoZVxuICogcGF5bWVudC4gVGhpcyBoZWxwZXIgZnVuY3Rpb24gZG9lcyB0aGF0IGNoZWNrLlxuICpcbiAqIE5vdGU6IGBvcHRBbW91bnRTaGFwZWAgaXMgdXNlci1zdXBwbGllZCB3aXRoIG5vIHByZXZpb3VzIHZhbGlkYXRpb24uXG4gKlxuICogQHBhcmFtIHtBbW91bnR9IHBheW1lbnRCYWxhbmNlXG4gKiBAcGFyYW0ge1BhdHRlcm49fSBvcHRBbW91bnRTaGFwZVxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmNvbnN0IGFzc2VydEFtb3VudENvbnNpc3RlbnQ9KHBheW1lbnRCYWxhbmNlLG9wdEFtb3VudFNoYXBlKT0+e1xuaWYob3B0QW1vdW50U2hhcGUhPT11bmRlZmluZWQpe1xuZml0KHBheW1lbnRCYWxhbmNlLG9wdEFtb3VudFNoYXBlLCdhbW91bnQnKTtcbiB9XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1BheW1lbnR9IHBheW1lbnRcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5jb25zdCBhc3NlcnRMaXZlUGF5bWVudD0ocGF5bWVudCk9PntcbnBheW1lbnRMZWRnZXIuaGFzKHBheW1lbnQpfHxcbkZhaWwgYCR7cGF5bWVudH0gd2FzIG5vdCBhIGxpdmUgcGF5bWVudCBmb3IgYnJhbmQgJHtxKFxuYnJhbmQpXG4gfS4gSXQgY291bGQgYmUgYSB1c2VkLXVwIHBheW1lbnQsIGEgcGF5bWVudCBmb3IgYW5vdGhlciBicmFuZCwgb3IgaXQgbWlnaHQgbm90IGJlIGEgcGF5bWVudCBhdCBhbGwuYDtcbiB9O1xuXG4vKipcbiAqIFJlYWxsb2NhdGUgYXNzZXRzIGZyb20gdGhlIGBwYXltZW50c2AgcGFzc2VkIGluIHRvIG5ldyBwYXltZW50c1xuICogY3JlYXRlZCBhbmQgcmV0dXJuZWQsIHdpdGggYmFsYW5jZXMgZnJvbSBgbmV3UGF5bWVudEJhbGFuY2VzYC5cbiAqIEVuZm9yY2VzIHRoYXQgdG90YWwgYXNzZXRzIGFyZSBjb25zZXJ2ZWQuXG4gKlxuICogTm90ZSB0aGF0IHRoaXMgaXMgbm90IHRoZSBvbmx5IG9wZXJhdGlvbiB0aGF0IG1vdmVzIGFzc2V0cy5cbiAqIGBwdXJzZS5kZXBvc2l0YCBhbmQgYHB1cnNlLndpdGhkcmF3YCBtb3ZlIGFzc2V0cyBiZXR3ZWVuIGEgcHVyc2UgYW5kXG4gKiBhIHBheW1lbnQsIGFuZCBzbyBtdXN0IGFsc28gZW5mb3JjZSBjb25zZXJ2YXRpb24gdGhlcmUuXG4gKlxuICogQHBhcmFtIHtQYXltZW50W119IHBheW1lbnRzXG4gKiBAcGFyYW0ge0Ftb3VudFtdfSBuZXdQYXltZW50QmFsYW5jZXNcbiAqIEByZXR1cm5zIHtQYXltZW50W119XG4gKi9cbmNvbnN0IG1vdmVBc3NldHM9KHBheW1lbnRzLG5ld1BheW1lbnRCYWxhbmNlcyk9PntcbmFzc2VydENvcHlBcnJheShwYXltZW50cywncGF5bWVudHMnKTtcbmFzc2VydENvcHlBcnJheShuZXdQYXltZW50QmFsYW5jZXMsJ25ld1BheW1lbnRCYWxhbmNlcycpO1xuXG4vKiBUaGVyZSBtYXkgYmUgemVybywgb25lLCBvciBtYW55IHBheW1lbnRzIGFzIGlucHV0IHRvKi9cbi8qIG1vdmVBc3NldHMuIFdlIHdhbnQgdG8gcHJvdGVjdCBhZ2FpbnN0IHNvbWVvbmUgcGFzc2luZyBpbiovXG4vKiB3aGF0IGFwcGVhcnMgdG8gYmUgbXVsdGlwbGUgcGF5bWVudHMgdGhhdCB0dXJuIG91dCB0byBhY3R1YWxseSovXG4vKiBiZSB0aGUgc2FtZSBwYXltZW50IChhbiBhbGlhc2luZyBpc3N1ZSkuIFRoZSBgY29tYmluZWAgbWV0aG9kKi9cbi8qIGxlZ2l0aW1hdGVseSBuZWVkcyB0byB0YWtlIGluIG11bHRpcGxlIHBheW1lbnRzLCBidXQgd2UgZG9uJ3QqL1xuLyogbmVlZCB0byBwYXkgdGhlIGNvc3RzIG9mIHByb3RlY3RpbmcgYWdhaW5zdCBhbGlhc2luZyBmb3IgdGhlKi9cbi8qIG90aGVyIHVzZXMuKi9cblxuaWYocGF5bWVudHMubGVuZ3RoPjEpe1xuY29uc3QgYW50aUFsaWFzaW5nU3RvcmU9bmV3IFNldCgpO1xucGF5bWVudHMuZm9yRWFjaCgocGF5bWVudCk9PntcbiFhbnRpQWxpYXNpbmdTdG9yZS5oYXMocGF5bWVudCl8fFxuRmFpbCBgc2FtZSBwYXltZW50ICR7cGF5bWVudH0gc2VlbiB0d2ljZWA7XG5hbnRpQWxpYXNpbmdTdG9yZS5hZGQocGF5bWVudCk7XG4gfSk7XG4gfVxuXG5jb25zdCB0b3RhbD1wYXltZW50cy5tYXAocGF5bWVudExlZGdlci5nZXQpLnJlZHVjZShhZGQsZW1wdHlBbW91bnQpO1xuXG5jb25zdCBuZXdUb3RhbD1uZXdQYXltZW50QmFsYW5jZXMucmVkdWNlKGFkZCxlbXB0eUFtb3VudCk7XG5cbi8qIEludmFyaWFudCBjaGVjayovXG5pc0VxdWFsKHRvdGFsLG5ld1RvdGFsKXx8XG5GYWlsIGByaWdodHMgd2VyZSBub3QgY29uc2VydmVkOiAke3RvdGFsfSB2cyAke25ld1RvdGFsfWA7XG5cbmxldCBuZXdQYXltZW50cztcbnRyeXtcbi8qIENPTU1JVCBQT0lOVCovXG5wYXltZW50cy5mb3JFYWNoKChwYXltZW50KT0+ZGVsZXRlUGF5bWVudChwYXltZW50KSk7XG5cbm5ld1BheW1lbnRzPW5ld1BheW1lbnRCYWxhbmNlcy5tYXAoKGJhbGFuY2UpPT57XG5jb25zdCBuZXdQYXltZW50PW1ha2VQYXltZW50KCk7XG5pbml0UGF5bWVudChuZXdQYXltZW50LGJhbGFuY2UsdW5kZWZpbmVkKTtcbnJldHVybiBuZXdQYXltZW50O1xuIH0pO1xuIH1jYXRjaChlcnIpe1xuc2h1dGRvd25MZWRnZXJXaXRoRmFpbHVyZShlcnIpO1xudGhyb3cgZXJyO1xuIH1cbnJldHVybiBoYXJkZW4obmV3UGF5bWVudHMpO1xuIH07XG5cbi8qKlxuICogVXNlZCBieSB0aGUgcHVyc2UgY29kZSB0byBpbXBsZW1lbnQgcHVyc2UuZGVwb3NpdFxuICpcbiAqIEBwYXJhbSB7QW1vdW50fSBjdXJyZW50QmFsYW5jZSAtIHRoZSBjdXJyZW50IGJhbGFuY2Ugb2YgdGhlIHB1cnNlXG4gKiBiZWZvcmUgYSBkZXBvc2l0XG4gKiBAcGFyYW0geyhuZXdQdXJzZUJhbGFuY2U6IEFtb3VudCkgPT4gdm9pZH0gdXBkYXRlUHVyc2VCYWxhbmNlIC1cbiAqIGNvbW1pdCB0aGUgcHVyc2UgYmFsYW5jZVxuICogQHBhcmFtIHtQYXltZW50fSBzcmNQYXltZW50XG4gKiBAcGFyYW0ge1BhdHRlcm49fSBvcHRBbW91bnRTaGFwZVxuICogQHJldHVybnMge0Ftb3VudH1cbiAqL1xuY29uc3QgZGVwb3NpdEludGVybmFsPShcbmN1cnJlbnRCYWxhbmNlLFxudXBkYXRlUHVyc2VCYWxhbmNlLFxuc3JjUGF5bWVudCxcbm9wdEFtb3VudFNoYXBlPXVuZGVmaW5lZCk9Plxue1xuYXNzZXJ0KFxuIWlzUHJvbWlzZShzcmNQYXltZW50KSxcbiBgZGVwb3NpdCBkb2VzIG5vdCBhY2NlcHQgcHJvbWlzZXMgYXMgZmlyc3QgYXJndW1lbnQuIEluc3RlYWQgb2YgcGFzc2luZyB0aGUgcHJvbWlzZSAoZGVwb3NpdChwYXltZW50UHJvbWlzZSkpLCBjb25zaWRlciB1bndyYXBwaW5nIHRoZSBwcm9taXNlIGZpcnN0OiBFLndoZW4ocGF5bWVudFByb21pc2UsIChhY3R1YWxQYXltZW50ID0+IGRlcG9zaXQoYWN0dWFsUGF5bWVudCkpYCxcblR5cGVFcnJvcik7XG5cbmFzc2VydExpdmVQYXltZW50KHNyY1BheW1lbnQpO1xuY29uc3Qgc3JjUGF5bWVudEJhbGFuY2U9cGF5bWVudExlZGdlci5nZXQoc3JjUGF5bWVudCk7XG5hc3NlcnRBbW91bnRDb25zaXN0ZW50KHNyY1BheW1lbnRCYWxhbmNlLG9wdEFtb3VudFNoYXBlKTtcbmNvbnN0IG5ld1B1cnNlQmFsYW5jZT1hZGQoc3JjUGF5bWVudEJhbGFuY2UsY3VycmVudEJhbGFuY2UpO1xudHJ5e1xuLyogQ09NTUlUIFBPSU5UKi9cbi8qIE1vdmUgdGhlIGFzc2V0cyBpbiBgc3JjUGF5bWVudGAgaW50byB0aGlzIHB1cnNlLCB1c2luZyB1cCB0aGUqL1xuLyogc291cmNlIHBheW1lbnQsIHN1Y2ggdGhhdCB0b3RhbCBhc3NldHMgYXJlIGNvbnNlcnZlZC4qL1xuZGVsZXRlUGF5bWVudChzcmNQYXltZW50KTtcbnVwZGF0ZVB1cnNlQmFsYW5jZShuZXdQdXJzZUJhbGFuY2UpO1xuIH1jYXRjaChlcnIpe1xuc2h1dGRvd25MZWRnZXJXaXRoRmFpbHVyZShlcnIpO1xudGhyb3cgZXJyO1xuIH1cbnJldHVybiBzcmNQYXltZW50QmFsYW5jZTtcbiB9O1xuXG4vKipcbiAqIFVzZWQgYnkgdGhlIHB1cnNlIGNvZGUgdG8gaW1wbGVtZW50IHB1cnNlLndpdGhkcmF3XG4gKlxuICogQHBhcmFtIHtBbW91bnR9IGN1cnJlbnRCYWxhbmNlIC0gdGhlIGN1cnJlbnQgYmFsYW5jZSBvZiB0aGUgcHVyc2VcbiAqIGJlZm9yZSBhIHdpdGhkcmF3YWxcbiAqIEBwYXJhbSB7KG5ld1B1cnNlQmFsYW5jZTogQW1vdW50KSA9PiB2b2lkfSB1cGRhdGVQdXJzZUJhbGFuY2UgLVxuICogY29tbWl0IHRoZSBwdXJzZSBiYWxhbmNlXG4gKiBAcGFyYW0ge0Ftb3VudH0gYW1vdW50IC0gdGhlIGFtb3VudCB0byBiZSB3aXRoZHJhd25cbiAqIEBwYXJhbSB7U2V0U3RvcmU8UGF5bWVudD59IHJlY292ZXJ5U2V0XG4gKiBAcmV0dXJucyB7UGF5bWVudH1cbiAqL1xuY29uc3Qgd2l0aGRyYXdJbnRlcm5hbD0oXG5jdXJyZW50QmFsYW5jZSxcbnVwZGF0ZVB1cnNlQmFsYW5jZSxcbmFtb3VudCxcbnJlY292ZXJ5U2V0KT0+XG57XG5hbW91bnQ9Y29lcmNlKGFtb3VudCk7XG5BbW91bnRNYXRoLmlzR1RFKGN1cnJlbnRCYWxhbmNlLGFtb3VudCl8fFxuRmFpbCBgV2l0aGRyYXdhbCBvZiAke2Ftb3VudH0gZmFpbGVkIGJlY2F1c2UgdGhlIHB1cnNlIG9ubHkgY29udGFpbmVkICR7Y3VycmVudEJhbGFuY2V9YDtcbmNvbnN0IG5ld1B1cnNlQmFsYW5jZT1zdWJ0cmFjdChjdXJyZW50QmFsYW5jZSxhbW91bnQpO1xuXG5jb25zdCBwYXltZW50PW1ha2VQYXltZW50KCk7XG50cnl7XG4vKiBDT01NSVQgUE9JTlQgTW92ZSB0aGUgd2l0aGRyYXduIGFzc2V0cyBmcm9tIHRoaXMgcHVyc2UgaW50byovXG4vKiBwYXltZW50LiBUb3RhbCBhc3NldHMgbXVzdCByZW1haW4gY29uc2VydmVkLiovXG51cGRhdGVQdXJzZUJhbGFuY2UobmV3UHVyc2VCYWxhbmNlKTtcbmluaXRQYXltZW50KHBheW1lbnQsYW1vdW50LHJlY292ZXJ5U2V0KTtcbiB9Y2F0Y2goZXJyKXtcbnNodXRkb3duTGVkZ2VyV2l0aEZhaWx1cmUoZXJyKTtcbnRocm93IGVycjtcbiB9XG5yZXR1cm4gcGF5bWVudDtcbiB9O1xuXG5jb25zdCBtYWtlRW1wdHlQdXJzZT12aXZpZnlQdXJzZUtpbmQoXG5pc3N1ZXJCYWdnYWdlLFxubmFtZSxcbmFzc2V0S2luZCxcbmJyYW5kLFxuUHVyc2VJS2l0LFxuaGFyZGVuKHtcbmRlcG9zaXRJbnRlcm5hbCxcbndpdGhkcmF3SW50ZXJuYWx9KSk7XG5cblxuXG4vKiogQHR5cGUge0lzc3VlcjxLPn0gKi9cbmNvbnN0IGlzc3Vlcj12aXZpZnlGYXJJbnN0YW5jZShpc3N1ZXJCYWdnYWdlLCBgJHtuYW1lfSBpc3N1ZXJgLElzc3Vlckkse1xuZ2V0QnJhbmQoKXtcbnJldHVybiBicmFuZDtcbiB9LFxuZ2V0QWxsZWdlZE5hbWUoKXtcbnJldHVybiBuYW1lO1xuIH0sXG5nZXRBc3NldEtpbmQoKXtcbnJldHVybiBhc3NldEtpbmQ7XG4gfSxcbmdldERpc3BsYXlJbmZvKCl7XG5yZXR1cm4gZGlzcGxheUluZm87XG4gfSxcbm1ha2VFbXB0eVB1cnNlKCl7XG5yZXR1cm4gbWFrZUVtcHR5UHVyc2UoKTtcbiB9LFxuaXNMaXZlKHBheW1lbnQpe1xuLyogSXNzdWVySSBkZWxheXMgY2FsbGluZyB0aGlzIG1ldGhvZCB1bnRpbCBgcGF5bWVudGAgaXMgYSBSZW1vdGFibGUqL1xucmV0dXJuIHBheW1lbnRMZWRnZXIuaGFzKHBheW1lbnQpO1xuIH0sXG5nZXRBbW91bnRPZihwYXltZW50KXtcbi8qIElzc3VlckkgZGVsYXlzIGNhbGxpbmcgdGhpcyBtZXRob2QgdW50aWwgYHBheW1lbnRgIGlzIGEgUmVtb3RhYmxlKi9cbmFzc2VydExpdmVQYXltZW50KHBheW1lbnQpO1xucmV0dXJuIHBheW1lbnRMZWRnZXIuZ2V0KHBheW1lbnQpO1xuIH0sXG5cbmJ1cm4ocGF5bWVudCxvcHRBbW91bnRTaGFwZT11bmRlZmluZWQpe1xuLyogSXNzdWVySSBkZWxheXMgY2FsbGluZyB0aGlzIG1ldGhvZCB1bnRpbCBgcGF5bWVudGAgaXMgYSBSZW1vdGFibGUqL1xuYXNzZXJ0TGl2ZVBheW1lbnQocGF5bWVudCk7XG5jb25zdCBwYXltZW50QmFsYW5jZT1wYXltZW50TGVkZ2VyLmdldChwYXltZW50KTtcbmFzc2VydEFtb3VudENvbnNpc3RlbnQocGF5bWVudEJhbGFuY2Usb3B0QW1vdW50U2hhcGUpO1xudHJ5e1xuLyogQ09NTUlUIFBPSU5ULiovXG5kZWxldGVQYXltZW50KHBheW1lbnQpO1xuIH1jYXRjaChlcnIpe1xuc2h1dGRvd25MZWRnZXJXaXRoRmFpbHVyZShlcnIpO1xudGhyb3cgZXJyO1xuIH1cbnJldHVybiBwYXltZW50QmFsYW5jZTtcbiB9LFxuY2xhaW0oc3JjUGF5bWVudCxvcHRBbW91bnRTaGFwZT11bmRlZmluZWQpe1xuLyogSXNzdWVySSBkZWxheXMgY2FsbGluZyB0aGlzIG1ldGhvZCB1bnRpbCBgc3JjUGF5bWVudGAgaXMgYSBSZW1vdGFibGUqL1xuYXNzZXJ0TGl2ZVBheW1lbnQoc3JjUGF5bWVudCk7XG5jb25zdCBzcmNQYXltZW50QmFsYW5jZT1wYXltZW50TGVkZ2VyLmdldChzcmNQYXltZW50KTtcbmFzc2VydEFtb3VudENvbnNpc3RlbnQoc3JjUGF5bWVudEJhbGFuY2Usb3B0QW1vdW50U2hhcGUpO1xuLyogTm90ZSBDT01NSVQgUE9JTlQgd2l0aGluIG1vdmVBc3NldHMuKi9cbmNvbnN0W3BheW1lbnRdPW1vdmVBc3NldHMoXG5oYXJkZW4oW3NyY1BheW1lbnRdKSxcbmhhcmRlbihbc3JjUGF5bWVudEJhbGFuY2VdKSk7XG5cbnJldHVybiBwYXltZW50O1xuIH0sXG5jb21iaW5lKGZyb21QYXltZW50c1BBcnJheSxvcHRUb3RhbEFtb3VudD11bmRlZmluZWQpe1xuLyogSXNzdWVySSBkb2VzICpub3QqIGRlbGF5IGNhbGxpbmcgYGNvbWJpbmVgLCBidXQgcmF0aGVyIGxlYXZlcyBpdCovXG4vKiB0byBgY29tYmluZWAgdG8gZGVsYXkgZnVydGhlciBwcm9jZXNzaW5nIHVudGlsIGFsbCB0aGUgZWxlbWVudHMgb2YqL1xuLyogYGZyb21QYXltZW50c1BBcnJheWAgaGF2ZSBmdWxmaWxsZWQuKi9cblxuLyogUGF5bWVudHMgaW4gYGZyb21QYXltZW50c1BBcnJheWAgbXVzdCBiZSBkaXN0aW5jdC4gQWxpYXMqL1xuLyogY2hlY2tpbmcgaXMgZGVsZWdhdGVkIHRvIHRoZSBgbW92ZUFzc2V0c2AgZnVuY3Rpb24uKi9cbnJldHVybiBQcm9taXNlLmFsbChmcm9tUGF5bWVudHNQQXJyYXkpLnRoZW4oKGZyb21QYXltZW50c0FycmF5KT0+e1xuZnJvbVBheW1lbnRzQXJyYXkuZXZlcnkoYXNzZXJ0TGl2ZVBheW1lbnQpO1xuY29uc3QgdG90YWxQYXltZW50c0JhbGFuY2U9ZnJvbVBheW1lbnRzQXJyYXkuXG5tYXAocGF5bWVudExlZGdlci5nZXQpLlxucmVkdWNlKGFkZCxlbXB0eUFtb3VudCk7XG5hc3NlcnRBbW91bnRDb25zaXN0ZW50KHRvdGFsUGF5bWVudHNCYWxhbmNlLG9wdFRvdGFsQW1vdW50KTtcbi8qIE5vdGUgQ09NTUlUIFBPSU5UIHdpdGhpbiBtb3ZlQXNzZXRzLiovXG5jb25zdFtwYXltZW50XT1tb3ZlQXNzZXRzKFxuaGFyZGVuKGZyb21QYXltZW50c0FycmF5KSxcbmhhcmRlbihbdG90YWxQYXltZW50c0JhbGFuY2VdKSk7XG5cbnJldHVybiBwYXltZW50O1xuIH0pO1xuIH0sXG5zcGxpdChzcmNQYXltZW50LHBheW1lbnRBbW91bnRBKXtcbi8qIElzc3VlckkgZGVsYXlzIGNhbGxpbmcgdGhpcyBtZXRob2QgdW50aWwgYHNyY1BheW1lbnRgIGlzIGEgUmVtb3RhYmxlKi9cbnBheW1lbnRBbW91bnRBPWNvZXJjZShwYXltZW50QW1vdW50QSk7XG5hc3NlcnRMaXZlUGF5bWVudChzcmNQYXltZW50KTtcbmNvbnN0IHNyY1BheW1lbnRCYWxhbmNlPXBheW1lbnRMZWRnZXIuZ2V0KHNyY1BheW1lbnQpO1xuY29uc3QgcGF5bWVudEFtb3VudEI9c3VidHJhY3Qoc3JjUGF5bWVudEJhbGFuY2UscGF5bWVudEFtb3VudEEpO1xuLyogTm90ZSBDT01NSVQgUE9JTlQgd2l0aGluIG1vdmVBc3NldHMuKi9cbmNvbnN0IG5ld1BheW1lbnRzPW1vdmVBc3NldHMoXG5oYXJkZW4oW3NyY1BheW1lbnRdKSxcbmhhcmRlbihbcGF5bWVudEFtb3VudEEscGF5bWVudEFtb3VudEJdKSk7XG5cbnJldHVybiBuZXdQYXltZW50cztcbiB9LFxuc3BsaXRNYW55KHNyY1BheW1lbnQsYW1vdW50cyl7XG4vKiBJc3N1ZXJJIGRlbGF5cyBjYWxsaW5nIHRoaXMgbWV0aG9kIHVudGlsIGBzcmNQYXltZW50YCBpcyBhIFJlbW90YWJsZSovXG5hc3NlcnRMaXZlUGF5bWVudChzcmNQYXltZW50KTtcbmFzc2VydENvcHlBcnJheShhbW91bnRzLCdhbW91bnRzJyk7XG5hbW91bnRzPWFtb3VudHMubWFwKGNvZXJjZSk7XG4vKiBOb3RlIENPTU1JVCBQT0lOVCB3aXRoaW4gbW92ZUFzc2V0cy4qL1xuY29uc3QgbmV3UGF5bWVudHM9bW92ZUFzc2V0cyhoYXJkZW4oW3NyY1BheW1lbnRdKSxoYXJkZW4oYW1vdW50cykpO1xucmV0dXJuIG5ld1BheW1lbnRzO1xuIH19KTtcblxuXG4vKiogQHR5cGUge01pbnQ8Sz59ICovXG5jb25zdCBtaW50PXZpdmlmeUZhckluc3RhbmNlKGlzc3VlckJhZ2dhZ2UsIGAke25hbWV9IG1pbnRgLE1pbnRJLHtcbmdldElzc3Vlcigpe1xucmV0dXJuIGlzc3VlcjtcbiB9LFxubWludFBheW1lbnQobmV3QW1vdW50KXtcbm5ld0Ftb3VudD1jb2VyY2UobmV3QW1vdW50KTtcbmZpdChuZXdBbW91bnQsYW1vdW50U2hhcGUsJ21pbnRlZCBhbW91bnQnKTtcbmNvbnN0IHBheW1lbnQ9bWFrZVBheW1lbnQoKTtcbmluaXRQYXltZW50KHBheW1lbnQsbmV3QW1vdW50LHVuZGVmaW5lZCk7XG5yZXR1cm4gcGF5bWVudDtcbiB9fSk7XG5cblxuY29uc3QgaXNzdWVyS2l0PWhhcmRlbih7aXNzdWVyLG1pbnQsYnJhbmR9KTtcbnJldHVybiBpc3N1ZXJLaXQ7XG4gfTskaOKAjV9vbmNlLnZpdmlmeVBheW1lbnRMZWRnZXIodml2aWZ5UGF5bWVudExlZGdlcik7XG5oYXJkZW4odml2aWZ5UGF5bWVudExlZGdlcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsidml2aWZ5UGF5bWVudExlZGdlciI6WyJ2aXZpZnlQYXltZW50TGVkZ2VyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADVNirnbDgAA2w4AACEAAABAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvcHVyc2UuanN7ImltcG9ydHMiOlsiLi9hbW91bnRNYXRoLmpzIiwiLi90cmFuc2llbnROb3RpZmllci5qcyIsIkBhZ29yaWMvdmF0LWRhdGEiXSwiZXhwb3J0cyI6WyJ2aXZpZnlQdXJzZUtpbmQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgdml2aWZ5RmFyQ2xhc3NLaXQsbWFrZVNjYWxhckJpZ1NldFN0b3JlLEFtb3VudE1hdGgsbWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0OyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcInZpdmlmeUZhckNsYXNzS2l0XCIsIFskaOKAjV9hID0+ICh2aXZpZnlGYXJDbGFzc0tpdCA9ICRo4oCNX2EpXV0sW1wibWFrZVNjYWxhckJpZ1NldFN0b3JlXCIsIFskaOKAjV9hID0+IChtYWtlU2NhbGFyQmlnU2V0U3RvcmUgPSAkaOKAjV9hKV1dXV0sW1wiLi9hbW91bnRNYXRoLmpzXCIsIFtbXCJBbW91bnRNYXRoXCIsIFskaOKAjV9hID0+IChBbW91bnRNYXRoID0gJGjigI1fYSldXV1dLFtcIi4vdHJhbnNpZW50Tm90aWZpZXIuanNcIiwgW1tcIm1ha2VUcmFuc2llbnROb3RpZmllcktpdFwiLCBbJGjigI1fYSA9PiAobWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5jb25zdHtGYWlsfT1hc3NlcnQ7XG5cbmNvbnN0ICAgICAgICB2aXZpZnlQdXJzZUtpbmQ9KFxuaXNzdWVyQmFnZ2FnZSxcbm5hbWUsXG5hc3NldEtpbmQsXG5icmFuZCxcblB1cnNlSUtpdCxcbnB1cnNlTWV0aG9kcyk9Plxue1xuLyogTm90ZTogVmlydHVhbCBmb3IgaGlnaCBjYXJkaW5hbGl0eSwgYnV0ICpub3QqIGR1cmFibGUsIGFuZCBzbyovXG4vKiBicm9rZW4gYWNyb3NzIGFuIHVwZ3JhZGUuKi9cbmNvbnN0e3Byb3ZpZGVOb3RpZmllcix1cGRhdGU6dXBkYXRlQmFsYW5jZX09bWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0KCk7XG5cbmNvbnN0IHVwZGF0ZVB1cnNlQmFsYW5jZT0oc3RhdGUsbmV3UHVyc2VCYWxhbmNlLHB1cnNlKT0+e1xuc3RhdGUuY3VycmVudEJhbGFuY2U9bmV3UHVyc2VCYWxhbmNlO1xudXBkYXRlQmFsYW5jZShwdXJzZSxwdXJzZS5nZXRDdXJyZW50QW1vdW50KCkpO1xuIH07XG5cbi8qIC0gVGhpcyBraW5kIGlzIGEgcGFpciBvZiBwdXJzZSBhbmQgZGVwb3NpdEZhY2V0IHRoYXQgaGF2ZSBhIDE6MSovXG4vKiBjb3JyZXNwb25kZW5jZS4qL1xuLyogLSBUaGV5IGFyZSB2aXJ0dWFsaXplZCB0b2dldGhlciB0byBzaGFyZSBhIHNpbmdsZSBzdGF0ZSByZWNvcmQuKi9cbi8qIC0gQW4gYWx0ZXJuYXRpdmUgZGVzaWduIGNvbnNpZGVyZWQgd2FzIHRvIGhhdmUgdGhpcyByZXR1cm4gYSBQdXJzZSBhbG9uZSovXG4vKiB0aGF0IGNyZWF0ZWQgZGVwb3NpdEZhY2V0IGFzIG5lZWRlZC4gQnV0IHRoaXMgYXBwcm9hY2ggZW5zdXJlcyBhIGNvbnN0YW50Ki9cbi8qIGlkZW50aXR5IGZvciB0aGUgZmFjZXQgYW5kIGV4ZXJjaXNlcyB0aGUgbXVsdGktZmFjZXRlZCBvYmplY3Qgc3R5bGUuKi9cbmNvbnN0e2RlcG9zaXRJbnRlcm5hbCx3aXRoZHJhd0ludGVybmFsfT1wdXJzZU1ldGhvZHM7XG5jb25zdCBtYWtlUHVyc2VLaXQ9dml2aWZ5RmFyQ2xhc3NLaXQoXG5pc3N1ZXJCYWdnYWdlLFxuIGAke25hbWV9IFB1cnNlYCxcblB1cnNlSUtpdCxcbigpPT57XG5jb25zdCBjdXJyZW50QmFsYW5jZT1BbW91bnRNYXRoLm1ha2VFbXB0eShicmFuZCxhc3NldEtpbmQpO1xuXG4vKiogQHR5cGUge1NldFN0b3JlPFBheW1lbnQ+fSAqL1xuY29uc3QgcmVjb3ZlcnlTZXQ9bWFrZVNjYWxhckJpZ1NldFN0b3JlKCdyZWNvdmVyeSBzZXQnLHtcbmR1cmFibGU6dHJ1ZX0pO1xuXG5cbnJldHVybntcbmN1cnJlbnRCYWxhbmNlLFxucmVjb3ZlcnlTZXR9O1xuXG4gfSxcbntcbnB1cnNlOntcbmRlcG9zaXQoc3JjUGF5bWVudCxvcHRBbW91bnRTaGFwZT11bmRlZmluZWQpe1xuLyogUHVyc2VJIGRvZXMgKm5vdCogZGVsYXkgYGRlcG9zaXRgIHVudGlsIGBzcmNQYXltZW50YCBpcyBmdWxmdWxsZWQuKi9cbi8qIFNlZSB0aGUgY29tbWVudHMgb24gUHVyc2VJLmRlcG9zaXQgaW4gdHlwZUd1YXJkcy5qcyovXG5jb25zdHtzdGF0ZX09dGhpcztcbi8qIE5vdGUgQ09NTUlUIFBPSU5UIHdpdGhpbiBkZXBvc2l0LiovXG5yZXR1cm4gZGVwb3NpdEludGVybmFsKFxuc3RhdGUuY3VycmVudEJhbGFuY2UsXG4obmV3UHVyc2VCYWxhbmNlKT0+XG51cGRhdGVQdXJzZUJhbGFuY2Uoc3RhdGUsbmV3UHVyc2VCYWxhbmNlLHRoaXMuZmFjZXRzLnB1cnNlKSxcbnNyY1BheW1lbnQsXG5vcHRBbW91bnRTaGFwZSxcbnN0YXRlLnJlY292ZXJ5U2V0KTtcblxuIH0sXG53aXRoZHJhdyhhbW91bnQpe1xuY29uc3R7c3RhdGV9PXRoaXM7XG4vKiBOb3RlIENPTU1JVCBQT0lOVCB3aXRoaW4gd2l0aGRyYXcuKi9cbnJldHVybiB3aXRoZHJhd0ludGVybmFsKFxuc3RhdGUuY3VycmVudEJhbGFuY2UsXG4obmV3UHVyc2VCYWxhbmNlKT0+XG51cGRhdGVQdXJzZUJhbGFuY2Uoc3RhdGUsbmV3UHVyc2VCYWxhbmNlLHRoaXMuZmFjZXRzLnB1cnNlKSxcbmFtb3VudCxcbnN0YXRlLnJlY292ZXJ5U2V0KTtcblxuIH0sXG5nZXRDdXJyZW50QW1vdW50KCl7XG5yZXR1cm4gdGhpcy5zdGF0ZS5jdXJyZW50QmFsYW5jZTtcbiB9LFxuZ2V0Q3VycmVudEFtb3VudE5vdGlmaWVyKCl7XG5yZXR1cm4gcHJvdmlkZU5vdGlmaWVyKHRoaXMuZmFjZXRzLnB1cnNlKTtcbiB9LFxuZ2V0QWxsZWdlZEJyYW5kKCl7XG5yZXR1cm4gYnJhbmQ7XG4gfSxcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5nZXREZXBvc2l0RmFjZXQoKXtcbnJldHVybiB0aGlzLmZhY2V0cy5kZXBvc2l0RmFjZXQ7XG4gfSxcblxuZ2V0UmVjb3ZlcnlTZXQoKXtcbnJldHVybiB0aGlzLnN0YXRlLnJlY292ZXJ5U2V0LnNuYXBzaG90KCk7XG4gfSxcbnJlY292ZXJBbGwoKXtcbmNvbnN0e3N0YXRlLGZhY2V0c309dGhpcztcbmxldCBhbW91bnQ9QW1vdW50TWF0aC5tYWtlRW1wdHkoYnJhbmQsYXNzZXRLaW5kKTtcbmZvcihjb25zdCBwYXltZW50IG9mIHN0YXRlLnJlY292ZXJ5U2V0LmtleXMoKSl7XG4vKiBUaGlzIGRvZXMgY2F1c2UgZGVsZXRpb25zIGZyb20gdGhlIHNldCB3aGlsZSBpdGVyYXRpbmcsKi9cbi8qIGJ1dCB0aGlzIHNwZWNpYWwgY2FzZSBpcyBhbGxvd2VkLiovXG5jb25zdCBkZWx0YT1mYWNldHMucHVyc2UuZGVwb3NpdChwYXltZW50KTtcbmFtb3VudD1BbW91bnRNYXRoLmFkZChhbW91bnQsZGVsdGEsYnJhbmQpO1xuIH1cbnN0YXRlLnJlY292ZXJ5U2V0LmdldFNpemUoKT09PTB8fFxuRmFpbCBgaW50ZXJuYWw6IFJlbWFpbmluZyB1bnJlY292ZXJlZCBwYXltZW50czogJHtmYWNldHMucHVyc2UuZ2V0UmVjb3ZlcnlTZXQoKX1gO1xucmV0dXJuIGFtb3VudDtcbiB9fSxcblxuZGVwb3NpdEZhY2V0OntcbnJlY2VpdmUoLi4uYXJncyl7XG5yZXR1cm4gdGhpcy5mYWNldHMucHVyc2UuZGVwb3NpdCguLi5hcmdzKTtcbiB9fX0pO1xuXG5cblxucmV0dXJuKCk9Pm1ha2VQdXJzZUtpdCgpLnB1cnNlO1xuIH07JGjigI1fb25jZS52aXZpZnlQdXJzZUtpbmQodml2aWZ5UHVyc2VLaW5kKTtcbmhhcmRlbih2aXZpZnlQdXJzZUtpbmQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InZpdmlmeVB1cnNlS2luZCI6WyJ2aXZpZnlQdXJzZUtpbmQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA3ts1pfsFAAD7BQAALQAAAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy90cmFuc2llbnROb3RpZmllci5qc3siaW1wb3J0cyI6WyJAYWdvcmljL25vdGlmaWVyIiwiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvdmF0LWRhdGEiXSwiZXhwb3J0cyI6WyJtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgbWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSxwcm92aWRlTGF6eSxtYWtlTm90aWZpZXJLaXQ7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1wibWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZVwiLCBbJGjigI1fYSA9PiAobWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJwcm92aWRlTGF6eVwiLCBbJGjigI1fYSA9PiAocHJvdmlkZUxhenkgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9ub3RpZmllclwiLCBbW1wibWFrZU5vdGlmaWVyS2l0XCIsIFskaOKAjV9hID0+IChtYWtlTm90aWZpZXJLaXQgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cbi8qIE5vdGU6IFZpcnR1YWwgZm9yIGhpZ2ggY2FyZGluYWxpdHksIGJ1dCAqbm90KiBkdXJhYmxlLCBhbmQgc28qL1xuLyogYnJva2VuIGFjcm9zcyBhbiB1cGdyYWRlLiovXG5jb25zdCAgICAgICAgbWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0PSgpPT57XG4vKiogQHR5cGUge1dlYWtNYXBTdG9yZTxQdXJzZSwgTm90aWZpZXJSZWNvcmQ8YW55Pj59ICovXG5jb25zdCB0cmFuc2llbnROb3RpZmVyS2l0cz1tYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlKFxuJ3RyYW5zaWVudE5vdGlmZXJLaXRzJyk7XG5cblxuY29uc3QgcHJvdmlkZU5vdGlmaWVyS2l0PShrZXkpPT5cbnByb3ZpZGVMYXp5KHRyYW5zaWVudE5vdGlmZXJLaXRzLGtleSwoKT0+XG5tYWtlTm90aWZpZXJLaXQoa2V5LmdldEN1cnJlbnRBbW91bnQoKSkpO1xuXG5cbmNvbnN0IHByb3ZpZGVOb3RpZmllcj0oa2V5KT0+cHJvdmlkZU5vdGlmaWVyS2l0KGtleSkubm90aWZpZXI7XG5jb25zdCB1cGRhdGU9KGtleSxuZXdWYWx1ZSk9PntcbmlmKHRyYW5zaWVudE5vdGlmZXJLaXRzLmhhcyhrZXkpKXtcbmNvbnN0e3VwZGF0ZXJ9PXRyYW5zaWVudE5vdGlmZXJLaXRzLmdldChrZXkpO1xudXBkYXRlci51cGRhdGVTdGF0ZShuZXdWYWx1ZSk7XG4gfVxuIH07XG5cbnJldHVybntwcm92aWRlTm90aWZpZXIsdXBkYXRlfTtcbiB9OyRo4oCNX29uY2UubWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0KG1ha2VUcmFuc2llbnROb3RpZmllcktpdCk7XG5oYXJkZW4obWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQiOlsibWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAF6JbmdpJwAAaScAACYAAABAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvdHlwZUd1YXJkcy5qc3siaW1wb3J0cyI6WyJAYWdvcmljL3N0b3JlIl0sImV4cG9ydHMiOlsiQW1vdW50U2hhcGUiLCJBc3NldEtpbmRTaGFwZSIsIkJyYW5kSSIsIkJyYW5kU2hhcGUiLCJEZXBvc2l0RmFjZXRTaGFwZSIsIkRpc3BsYXlJbmZvU2hhcGUiLCJJc3N1ZXJLaXRTaGFwZSIsIklzc3VlclNoYXBlIiwiTUFYX0FCU09MVVRFX0RFQ0lNQUxfUExBQ0VTIiwiTWludFNoYXBlIiwiUGF5bWVudFNoYXBlIiwiUHVyc2VTaGFwZSIsImlzQ29weUJhZ1ZhbHVlIiwiaXNDb3B5U2V0VmFsdWUiLCJpc05hdFZhbHVlIiwiaXNTZXRWYWx1ZSIsIm1ha2VJc3N1ZXJJbnRlcmZhY2VzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IE0sbWF0Y2hlczskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXSxbXCJtYXRjaGVzXCIsIFskaOKAjV9hID0+IChtYXRjaGVzID0gJGjigI1fYSldXV1dXSk7ICAgXG5cbmNvbnN0ICAgICAgICBCcmFuZFNoYXBlPU0ucmVtb3RhYmxlKCdCcmFuZCcpOyRo4oCNX29uY2UuQnJhbmRTaGFwZShCcmFuZFNoYXBlKTtcbmNvbnN0ICAgICAgICBJc3N1ZXJTaGFwZT1NLnJlbW90YWJsZSgnSXNzdWVyJyk7JGjigI1fb25jZS5Jc3N1ZXJTaGFwZShJc3N1ZXJTaGFwZSk7XG5jb25zdCAgICAgICAgUGF5bWVudFNoYXBlPU0ucmVtb3RhYmxlKCdQYXltZW50Jyk7JGjigI1fb25jZS5QYXltZW50U2hhcGUoUGF5bWVudFNoYXBlKTtcbmNvbnN0ICAgICAgICBQdXJzZVNoYXBlPU0ucmVtb3RhYmxlKCdQdXJzZScpOyRo4oCNX29uY2UuUHVyc2VTaGFwZShQdXJzZVNoYXBlKTtcbmNvbnN0ICAgICAgICBEZXBvc2l0RmFjZXRTaGFwZT1NLnJlbW90YWJsZSgnRGVwb3NpdEZhY2V0Jyk7JGjigI1fb25jZS5EZXBvc2l0RmFjZXRTaGFwZShEZXBvc2l0RmFjZXRTaGFwZSk7XG5jb25zdCBOb3RpZmllclNoYXBlPU0ucmVtb3RhYmxlKCdOb3RpZmllcicpO1xuY29uc3QgICAgICAgIE1pbnRTaGFwZT1NLnJlbW90YWJsZSgnTWludCcpO1xuXG4vKipcbiAqIFdoZW4gdGhlIEFtb3VudFZhbHVlIG9mIGFuIEFtb3VudCBmaXRzIHRoZSBOYXRWYWx1ZVNoYXBlLCBpLmUuLCB3aGVuIGl0IGlzXG4gKiBhIG5vbi1uZWdhdGl2ZSBiaWdpbnQsIHRoZW4gaXQgcmVwcmVzZW50cyB0aGF0IG1hbnkgdW5pdHMgb2YgdGhlXG4gKiBmdW5naWJsZSBhc3NldCByZXByZXNlbnRlZCBieSB0aGF0IGFtb3VudC4gVGhlIGJyYW5kIG9mIHRoYXQgYW1vdW50XG4gKiBzaG91bGQgaW5kZWVkIHJlcHJlc2VudCBhIGtpbmQgb2YgYXNzZXQgY29uc2lzdGluZyBvZiBhIGNvdW50YWJsZVxuICogc2V0IG9mIGZ1bmdpYmxlIHVuaXRzLlxuICovJGjigI1fb25jZS5NaW50U2hhcGUoTWludFNoYXBlKTtcbmNvbnN0IE5hdFZhbHVlU2hhcGU9TS5uYXQoKTtcblxuLyoqXG4gKiBXaGVuIHRoZSBBbW91bnRWYWx1ZSBvZiBhbiBBbW91bnQgZml0cyB0aGUgQ29weVNldFZhbHVlU2hhcGUsIGkuZS4sIHdoZW4gaXRcbiAqIGlzIGEgQ29weVNldCwgdGhlbiBpdCByZXByZXNlbnRzIHRoZSBzZXQgb2YgdGhvc2VcbiAqIGtleXMsIHdoZXJlIGVhY2gga2V5IHJlcHJlc2VudHMgc29tZSBpbmRpdmlkdWFsIG5vbi1mdW5naWJsZVxuICogaXRlbSwgbGlrZSBhIGNvbmNlcnQgdGlja2V0LCBmcm9tIHRoZSBub24tZnVuZ2libGUgYXNzZXQgY2xhc3NcbiAqIHJlcHJlc2VudGVkIGJ5IHRoYXQgYW1vdW50J3MgYnJhbmQuIFRoZSBhbW91bnQgaXRzZWxmIHJlcHJlc2VudHNcbiAqIHRoZSBzZXQgb2YgdGhlc2UgaXRlbXMsIGFzIG9wcG9zZWQgdG8gYW55IG9mIHRoZSBvdGhlciBpdGVtc1xuICogZnJvbSB0aGUgc2FtZSBhc3NldCBjbGFzcy5cbiAqXG4gKiBJZiBhIGdpdmVuIHZhbHVlIGNsYXNzIHJlcHJlc2VudHMgY29uY2VydCB0aWNrZXRzLCBpdCBzZWVtcyBiaXphcnJlXG4gKiB0aGF0IHdlIGNhbiBmb3JtIGFtb3VudHMgb2YgYW55IGtleS4gVGhlIGhhcmQgY29uc3RyYWludCBpcyB0aGF0XG4gKiB0aGUgY29kZSB0aGF0IGhvbGRzIHRoZSBtaW50IGZvciB0aGF0IGFzc2V0IGNsYXNzLS0tdGhlIG9uZSBhc3NvY2lhdGVkXG4gKiB3aXRoIHRoYXQgYnJhbmQsIG9ubHkgbWludHMgdGhlIGl0ZW1zIHJlcHJlc2VudGluZyB0aGUgcmVhbCB1bml0c1xuICogb2YgdGhhdCBhc3NldCBjbGFzcyBhcyBkZWZpbmVkIGJ5IGl0LiBBbnlvbmUgZWxzZSBjYW4gcHV0IHRvZ2V0aGVyXG4gKiBhbiBhbW91bnQgZXhwcmVzc2luZywgZm9yIGV4YW1wbGUsIHRoYXQgdGhleSBcIndhbnRcIiBzb21lIGl0ZW1zIHRoYXRcbiAqIHdpbGwgbmV2ZXIgYmUgbWludGVkLiBUaGF0IHdhbnQgd2lsbCBuZXZlciBiZSBzYXRpc2ZpZWQuXG4gKiBcIllvdSBjYW4ndCBhbHdheXMgZ2V0Li4uXCJcbiAqL1xuY29uc3QgQ29weVNldFZhbHVlU2hhcGU9TS5zZXQoKTtcblxuLyoqXG4gKiBXaGVuIHRoZSBBbW91bnRWYWx1ZSBvZiBhbiBBbW91bnQgZml0cyB0aGUgU2V0VmFsdWVTaGFwZSwgaS5lLiwgd2hlbiBpdFxuICogaXMgYSBDb3B5QXJyYXkgb2YgcGFzc2FibGUgS2V5cy4gVGhpcyByZXByZXNlbnRhdGlvbiBpcyBkZXByZWNhdGVkLlxuICpcbiAqIEBkZXByZWNhdGVkIFBsZWFzZSBjaGFuZ2UgZnJvbSB1c2luZyBhcnJheS1iYXNlZCBTZXRWYWx1ZXMgdG8gQ29weVNldC1iYXNlZFxuICogQ29weVNldFZhbHVlcy5cbiAqL1xuY29uc3QgU2V0VmFsdWVTaGFwZT1NLmFycmF5T2YoTS5rZXkoKSk7XG5cbi8qKlxuICogV2hlbiB0aGUgQW1vdW50VmFsdWUgb2YgYW4gQW1vdW50IGZpdHMgdGhlIENvcHlCYWdWYWx1ZVNoYXBlLCBpLmUuLCB3aGVuIGl0XG4gKiBpcyBhIENvcHlCYWcsIHRoZW4gaXQgcmVwcmVzZW50cyB0aGUgYmFnIChtdWx0aXNldCkgb2YgdGhvc2VcbiAqIGtleXMsIHdoZXJlIGVhY2gga2V5IHJlcHJlc2VudHMgc29tZSBpbmRpdmlkdWFsIHNlbWktZnVuZ2libGVcbiAqIGl0ZW0sIGxpa2UgYSBjb25jZXJ0IHRpY2tldCwgZnJvbSB0aGUgc2VtaS1mdW5naWJsZSBhc3NldCBjbGFzc1xuICogcmVwcmVzZW50ZWQgYnkgdGhhdCBhbW91bnQncyBicmFuZC4gVGhlIG51bWJlciBvZiB0aW1lcyB0aGF0IGtleVxuICogYXBwZWFycyBpbiB0aGUgYmFnIGlzIHRoZSBudW1iZXIgb2YgZnVuZ2libGUgdW5pdHMgb2YgdGhhdCBrZXkuXG4gKiBUaGUgYW1vdW50IGl0c2VsZiByZXByZXNlbnRzXG4gKiB0aGUgYmFnIG9mIHRoZXNlIGl0ZW1zLCBhcyBvcHBvc2VkIHRvIGFueSBvZiB0aGUgb3RoZXIgaXRlbXNcbiAqIGZyb20gdGhlIHNhbWUgYXNzZXQgY2xhc3MuXG4gKlxuICogSWYgYSBnaXZlbiB2YWx1ZSBjbGFzcyByZXByZXNlbnRzIGNvbmNlcnQgdGlja2V0cywgaXQgc2VlbXMgYml6YXJyZVxuICogdGhhdCB3ZSBjYW4gZm9ybSBhbW91bnRzIG9mIGFueSBrZXkuIFRoZSBoYXJkIGNvbnN0cmFpbnQgaXMgdGhhdFxuICogdGhlIGNvZGUgdGhhdCBob2xkcyB0aGUgbWludCBmb3IgdGhhdCBhc3NldCBjbGFzcy0tLXRoZSBvbmUgYXNzb2NpYXRlZFxuICogd2l0aCB0aGF0IGJyYW5kLCBvbmx5IG1pbnRzIHRoZSBpdGVtcyByZXByZXNlbnRpbmcgdGhlIHJlYWwgdW5pdHNcbiAqIG9mIHRoYXQgYXNzZXQgY2xhc3MgYXMgZGVmaW5lZCBieSBpdC4gQW55b25lIGVsc2UgY2FuIHB1dCB0b2dldGhlclxuICogYW4gYW1vdW50IGV4cHJlc3NpbmcsIGZvciBleGFtcGxlLCB0aGF0IHRoZXkgXCJ3YW50XCIgc29tZSBpdGVtcyB0aGF0XG4gKiB3aWxsIG5ldmVyIGJlIG1pbnRlZC4gVGhhdCB3YW50IHdpbGwgbmV2ZXIgYmUgc2F0aXNmaWVkLlxuICogXCJZb3UgY2FuJ3QgYWx3YXlzIGdldC4uLlwiXG4gKi9cbmNvbnN0IENvcHlCYWdWYWx1ZVNoYXBlPU0uYmFnKCk7XG5cbmNvbnN0IEFtb3VudFZhbHVlU2hhcGU9TS5vcihcbk5hdFZhbHVlU2hhcGUsXG5Db3B5U2V0VmFsdWVTaGFwZSxcblNldFZhbHVlU2hhcGUsXG5Db3B5QmFnVmFsdWVTaGFwZSk7XG5cblxuY29uc3QgICAgICAgIEFtb3VudFNoYXBlPWhhcmRlbih7XG5icmFuZDpCcmFuZFNoYXBlLFxudmFsdWU6QW1vdW50VmFsdWVTaGFwZX0pO1xuXG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHZhbHVlIGlzIGEgTmF0IGJpZ2ludC5cbiAqXG4gKiBAcGFyYW0ge0Ftb3VudFZhbHVlfSB2YWx1ZVxuICogQHJldHVybnMge3ZhbHVlIGlzIFhpbXBvcnQoJy4vdHlwZXMuanMnKS5OYXRWYWx1ZX1cbiAqLyRo4oCNX29uY2UuQW1vdW50U2hhcGUoQW1vdW50U2hhcGUpO1xuY29uc3QgICAgICAgIGlzTmF0VmFsdWU9KHZhbHVlKT0+bWF0Y2hlcyh2YWx1ZSxOYXRWYWx1ZVNoYXBlKTskaOKAjV9vbmNlLmlzTmF0VmFsdWUoaXNOYXRWYWx1ZSk7XG5oYXJkZW4oaXNOYXRWYWx1ZSk7XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHZhbHVlIGlzIGEgQ29weVNldFxuICpcbiAqIEBwYXJhbSB7QW1vdW50VmFsdWV9IHZhbHVlXG4gKiBAcmV0dXJucyB7dmFsdWUgaXMgQ29weVNldFZhbHVlfVxuICovXG5jb25zdCAgICAgICAgaXNDb3B5U2V0VmFsdWU9KHZhbHVlKT0+bWF0Y2hlcyh2YWx1ZSxDb3B5U2V0VmFsdWVTaGFwZSk7JGjigI1fb25jZS5pc0NvcHlTZXRWYWx1ZShpc0NvcHlTZXRWYWx1ZSk7XG5oYXJkZW4oaXNDb3B5U2V0VmFsdWUpO1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB2YWx1ZSBpcyBhIHBhc3MgYnkgY29weSBhcnJheSBzdHJ1Y3R1cmUuIERvZXMgbm90XG4gKiBjaGVjayBmb3IgZHVwbGljYXRlcy4gVG8gY2hlY2sgZm9yIGR1cGxpY2F0ZXMsIHVzZSBzZXRNYXRoSGVscGVycy5jb2VyY2UuXG4gKlxuICogQGRlcHJlY2F0ZWQgUGxlYXNlIGNoYW5nZSBmcm9tIHVzaW5nIGFycmF5LWJhc2VkIFNldFZhbHVlcyB0byBDb3B5U2V0LWJhc2VkXG4gKiBDb3B5U2V0VmFsdWVzLlxuICogQHBhcmFtIHtBbW91bnRWYWx1ZX0gdmFsdWVcbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBTZXRWYWx1ZX1cbiAqL1xuY29uc3QgICAgICAgIGlzU2V0VmFsdWU9KHZhbHVlKT0+bWF0Y2hlcyh2YWx1ZSxTZXRWYWx1ZVNoYXBlKTskaOKAjV9vbmNlLmlzU2V0VmFsdWUoaXNTZXRWYWx1ZSk7XG5oYXJkZW4oaXNTZXRWYWx1ZSk7XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHZhbHVlIGlzIGEgQ29weUJhZ1xuICpcbiAqIEBwYXJhbSB7QW1vdW50VmFsdWV9IHZhbHVlXG4gKiBAcmV0dXJucyB7dmFsdWUgaXMgQ29weUJhZ1ZhbHVlfVxuICovXG5jb25zdCAgICAgICAgaXNDb3B5QmFnVmFsdWU9KHZhbHVlKT0+bWF0Y2hlcyh2YWx1ZSxDb3B5QmFnVmFsdWVTaGFwZSk7JGjigI1fb25jZS5pc0NvcHlCYWdWYWx1ZShpc0NvcHlCYWdWYWx1ZSk7XG5oYXJkZW4oaXNDb3B5QmFnVmFsdWUpO1xuXG4vKiBPbmUgR09PR09MdGggc2hvdWxkIGJlIGVub3VnaCBkZWNpbWFsIHBsYWNlcyBmb3IgYW55Ym9keS4qL1xuY29uc3QgICAgICAgIE1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUz0xMDA7JGjigI1fb25jZS5NQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVMoTUFYX0FCU09MVVRFX0RFQ0lNQUxfUExBQ0VTKTtcblxuY29uc3QgICAgICAgIEFzc2V0S2luZFNoYXBlPU0ub3IoJ25hdCcsJ3NldCcsJ2NvcHlTZXQnLCdjb3B5QmFnJyk7JGjigI1fb25jZS5Bc3NldEtpbmRTaGFwZShBc3NldEtpbmRTaGFwZSk7XG5cbmNvbnN0ICAgICAgICBEaXNwbGF5SW5mb1NoYXBlPU0uc3BsaXRSZWNvcmQoXG57fSxcbntcbmRlY2ltYWxQbGFjZXM6TS5hbmQoXG5NLmd0ZSgtTUFYX0FCU09MVVRFX0RFQ0lNQUxfUExBQ0VTKSxcbk0ubHRlKE1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUykpLFxuXG5hc3NldEtpbmQ6QXNzZXRLaW5kU2hhcGV9LFxuXG57XG4vKiBJbmNsdWRpbmcgdGhpcyBlbXB0eSBgcmVzdGAgZW5zdXJlcyB0aGF0IHRoZXJlIGFyZSBubyBvdGhlciovXG4vKiBwcm9wZXJ0aWVzIGJleW9uZCB0aG9zZSBpbiB0aGUgYGJhc2VgIHJlY29yZC4qL30pOyRo4oCNX29uY2UuRGlzcGxheUluZm9TaGFwZShEaXNwbGF5SW5mb1NoYXBlKTtcblxuXG5cbmNvbnN0ICAgICAgICBJc3N1ZXJLaXRTaGFwZT1oYXJkZW4oe1xuYnJhbmQ6QnJhbmRTaGFwZSxcbm1pbnQ6TWludFNoYXBlLFxuaXNzdWVyOklzc3VlclNoYXBlLFxuZGlzcGxheUluZm86RGlzcGxheUluZm9TaGFwZX0pO1xuXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBJbnRlcmZhY2VzIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi8kaOKAjV9vbmNlLklzc3VlcktpdFNoYXBlKElzc3VlcktpdFNoYXBlKTtcblxuY29uc3QgICAgICAgIEJyYW5kST1NLmludGVyZmFjZSgnQnJhbmQnLHtcbmlzTXlJc3N1ZXI6TS5jYWxsV2hlbihNLmF3YWl0KElzc3VlclNoYXBlKSkucmV0dXJucyhNLmJvb2xlYW4oKSksXG5nZXRBbGxlZ2VkTmFtZTpNLmNhbGwoKS5yZXR1cm5zKE0uc3RyaW5nKCkpLFxuZ2V0RGlzcGxheUluZm86TS5jYWxsKCkucmV0dXJucyhEaXNwbGF5SW5mb1NoYXBlKSxcbmdldEFtb3VudFNoYXBlOk0uY2FsbCgpLnJldHVybnMoTS5wYXR0ZXJuKCkpfSk7XG5cblxuLyoqXG4gKiBAcGFyYW0ge1BhdHRlcm59IFticmFuZFNoYXBlXVxuICogQHBhcmFtIHtQYXR0ZXJufSBbYXNzZXRLaW5kU2hhcGVdXG4gKiBAcGFyYW0ge1BhdHRlcm59IFthbW91bnRTaGFwZV1cbiAqLyRo4oCNX29uY2UuQnJhbmRJKEJyYW5kSSk7XG5jb25zdCAgICAgICAgbWFrZUlzc3VlckludGVyZmFjZXM9KFxuYnJhbmRTaGFwZT1CcmFuZFNoYXBlLFxuYXNzZXRLaW5kU2hhcGU9QXNzZXRLaW5kU2hhcGUsXG5hbW91bnRTaGFwZT1BbW91bnRTaGFwZSk9Plxue1xuY29uc3QgSXNzdWVyST1NLmludGVyZmFjZSgnSXNzdWVyJyx7XG5nZXRCcmFuZDpNLmNhbGwoKS5yZXR1cm5zKGJyYW5kU2hhcGUpLFxuZ2V0QWxsZWdlZE5hbWU6TS5jYWxsKCkucmV0dXJucyhNLnN0cmluZygpKSxcbmdldEFzc2V0S2luZDpNLmNhbGwoKS5yZXR1cm5zKGFzc2V0S2luZFNoYXBlKSxcbmdldERpc3BsYXlJbmZvOk0uY2FsbCgpLnJldHVybnMoRGlzcGxheUluZm9TaGFwZSksXG5tYWtlRW1wdHlQdXJzZTpNLmNhbGwoKS5yZXR1cm5zKFB1cnNlU2hhcGUpLFxuXG5pc0xpdmU6TS5jYWxsV2hlbihNLmF3YWl0KFBheW1lbnRTaGFwZSkpLnJldHVybnMoTS5ib29sZWFuKCkpLFxuZ2V0QW1vdW50T2Y6TS5jYWxsV2hlbihNLmF3YWl0KFBheW1lbnRTaGFwZSkpLnJldHVybnMoYW1vdW50U2hhcGUpLFxuYnVybjpNLmNhbGxXaGVuKE0uYXdhaXQoUGF5bWVudFNoYXBlKSkuXG5vcHRpb25hbChNLnBhdHRlcm4oKSkuXG5yZXR1cm5zKGFtb3VudFNoYXBlKSxcbmNsYWltOk0uY2FsbFdoZW4oTS5hd2FpdChQYXltZW50U2hhcGUpKS5cbm9wdGlvbmFsKE0ucGF0dGVybigpKS5cbnJldHVybnMoUGF5bWVudFNoYXBlKSxcbmNvbWJpbmU6TS5jYWxsKE0uYXJyYXlPZihNLmVyZWYoUGF5bWVudFNoYXBlKSkpLlxub3B0aW9uYWwoYW1vdW50U2hhcGUpLlxucmV0dXJucyhNLmVyZWYoUGF5bWVudFNoYXBlKSksXG5zcGxpdDpNLmNhbGxXaGVuKE0uYXdhaXQoUGF5bWVudFNoYXBlKSxhbW91bnRTaGFwZSkucmV0dXJucyhcbk0uYXJyYXlPZihQYXltZW50U2hhcGUpKSxcblxuc3BsaXRNYW55Ok0uY2FsbFdoZW4oXG5NLmF3YWl0KFBheW1lbnRTaGFwZSksXG5NLmFycmF5T2YoYW1vdW50U2hhcGUpKS5cbnJldHVybnMoTS5hcnJheU9mKFBheW1lbnRTaGFwZSkpfSk7XG5cblxuY29uc3QgTWludEk9TS5pbnRlcmZhY2UoJ01pbnQnLHtcbmdldElzc3VlcjpNLmNhbGwoKS5yZXR1cm5zKElzc3VlclNoYXBlKSxcbm1pbnRQYXltZW50Ok0uY2FsbChhbW91bnRTaGFwZSkucmV0dXJucyhQYXltZW50U2hhcGUpfSk7XG5cblxuY29uc3QgUGF5bWVudEk9TS5pbnRlcmZhY2UoJ1BheW1lbnQnLHtcbmdldEFsbGVnZWRCcmFuZDpNLmNhbGwoKS5yZXR1cm5zKGJyYW5kU2hhcGUpfSk7XG5cblxuY29uc3QgUHVyc2VJPU0uaW50ZXJmYWNlKCdQdXJzZScse1xuZ2V0QWxsZWdlZEJyYW5kOk0uY2FsbCgpLnJldHVybnMoYnJhbmRTaGFwZSksXG5nZXRDdXJyZW50QW1vdW50Ok0uY2FsbCgpLnJldHVybnMoYW1vdW50U2hhcGUpLFxuZ2V0Q3VycmVudEFtb3VudE5vdGlmaWVyOk0uY2FsbCgpLnJldHVybnMoTm90aWZpZXJTaGFwZSksXG4vKiBQdXJzZUkgZG9lcyAqbm90KiBkZWxheSBgZGVwb3NpdGAgdW50aWwgYHNyY1BheW1lbnRgIGlzIGZ1bGZ1bGxlZC4qL1xuLyogUmF0aGVyLCB0aGUgc2VtYW50aWNzIG9mIGBkZXBvc2l0YCByZXF1aXJlIGl0IHRvIHByb3ZpZGUgaXRzKi9cbi8qIGNhbGxlcnMgd2l0aCBhIHN0cm9uZyBndWFyYW50ZWUgdGhhdCBgZGVwb3NpdGAgbWVzc2FnZXMgYXJlKi9cbi8qIHByb2Nlc3NlZCB3aXRob3V0IGZ1cnRoZXIgZGVsYXkgaW4gdGhlIG9yZGVyIHRoZXkgYXJyaXZlLiovXG4vKiBQdXJzZUkgdGhlcmVmb3JlIHJlcXVpcmVzIHRoYXQgdGhlIGBzcmNQYXltZW50YCBhcmd1bWVudCBhbHJlYWR5Ki9cbi8qIGJlIGEgcmVtb3RhYmxlLCBub3QgYSBwcm9taXNlLiovXG4vKiBQdXJzZUkgb25seSBjYWxscyB0aGlzIHJhdyBtZXRob2QgYWZ0ZXIgdmFsaWRhdGluZyB0aGF0Ki9cbi8qIGBzcmNQYXltZW50YCBpcyBhIHJlbW90YWJsZSwgbGVhdmluZyBpdCovXG4vKiB0byB0aGlzIHJhdyBtZXRob2QgdG8gdmFsaWRhdGUgdGhhdCB0aGlzIHJlbW90YWJsZSBpcyBhY3R1YWxseSovXG4vKiBhIGxpdmUgcGF5bWVudCBvZiB0aGUgY29ycmVjdCBicmFuZCB3aXRoIHN1ZmZpY2llbnQgZnVuZHMuKi9cbmRlcG9zaXQ6TS5jYWxsKFBheW1lbnRTaGFwZSkub3B0aW9uYWwoTS5wYXR0ZXJuKCkpLnJldHVybnMoYW1vdW50U2hhcGUpLFxuZ2V0RGVwb3NpdEZhY2V0Ok0uY2FsbCgpLnJldHVybnMoRGVwb3NpdEZhY2V0U2hhcGUpLFxud2l0aGRyYXc6TS5jYWxsKGFtb3VudFNoYXBlKS5yZXR1cm5zKFBheW1lbnRTaGFwZSksXG5nZXRSZWNvdmVyeVNldDpNLmNhbGwoKS5yZXR1cm5zKE0uc2V0T2YoUGF5bWVudFNoYXBlKSksXG5yZWNvdmVyQWxsOk0uY2FsbCgpLnJldHVybnMoYW1vdW50U2hhcGUpfSk7XG5cblxuY29uc3QgRGVwb3NpdEZhY2V0ST1NLmludGVyZmFjZSgnRGVwb3NpdEZhY2V0Jyx7XG5yZWNlaXZlOlB1cnNlSS5tZXRob2RHdWFyZHMuZGVwb3NpdH0pO1xuXG5cbmNvbnN0IFB1cnNlSUtpdD1oYXJkZW4oe1xucHVyc2U6UHVyc2VJLFxuZGVwb3NpdEZhY2V0OkRlcG9zaXRGYWNldEl9KTtcblxuXG5yZXR1cm4gaGFyZGVuKHtcbklzc3VlckksXG5NaW50SSxcblBheW1lbnRJLFxuUHVyc2VJS2l0fSk7XG5cbiB9OyRo4oCNX29uY2UubWFrZUlzc3VlckludGVyZmFjZXMobWFrZUlzc3VlckludGVyZmFjZXMpO1xuaGFyZGVuKG1ha2VJc3N1ZXJJbnRlcmZhY2VzKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJCcmFuZFNoYXBlIjpbIkJyYW5kU2hhcGUiXSwiSXNzdWVyU2hhcGUiOlsiSXNzdWVyU2hhcGUiXSwiUGF5bWVudFNoYXBlIjpbIlBheW1lbnRTaGFwZSJdLCJQdXJzZVNoYXBlIjpbIlB1cnNlU2hhcGUiXSwiRGVwb3NpdEZhY2V0U2hhcGUiOlsiRGVwb3NpdEZhY2V0U2hhcGUiXSwiTWludFNoYXBlIjpbIk1pbnRTaGFwZSJdLCJBbW91bnRTaGFwZSI6WyJBbW91bnRTaGFwZSJdLCJpc05hdFZhbHVlIjpbImlzTmF0VmFsdWUiXSwiaXNDb3B5U2V0VmFsdWUiOlsiaXNDb3B5U2V0VmFsdWUiXSwiaXNTZXRWYWx1ZSI6WyJpc1NldFZhbHVlIl0sImlzQ29weUJhZ1ZhbHVlIjpbImlzQ29weUJhZ1ZhbHVlIl0sIk1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUyI6WyJNQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVMiXSwiQXNzZXRLaW5kU2hhcGUiOlsiQXNzZXRLaW5kU2hhcGUiXSwiRGlzcGxheUluZm9TaGFwZSI6WyJEaXNwbGF5SW5mb1NoYXBlIl0sIklzc3VlcktpdFNoYXBlIjpbIklzc3VlcktpdFNoYXBlIl0sIkJyYW5kSSI6WyJCcmFuZEkiXSwibWFrZUlzc3VlckludGVyZmFjZXMiOlsibWFrZUlzc3VlckludGVyZmFjZXMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAK4Nx++lCAADpQgAAKQAAAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy90eXBlcy1hbWJpZW50LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIi8+Ki9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHR5cGVkZWYge29iamVjdH0gQW1vdW50XG4gKiBBbW91bnRzIGFyZSBkZXNjcmlwdGlvbnMgb2YgZGlnaXRhbCBhc3NldHMsIGFuc3dlcmluZyB0aGUgcXVlc3Rpb25zXG4gKiBcImhvdyBtdWNoXCIgYW5kIFwib2Ygd2hhdCBraW5kXCIuIEFtb3VudHMgYXJlIHZhbHVlcyBsYWJlbGVkIHdpdGggYSBicmFuZC5cbiAqIEFtb3VudE1hdGggZXhlY3V0ZXMgdGhlIGxvZ2ljIG9mIGhvdyBhbW91bnRzIGFyZSBjaGFuZ2VkIHdoZW4gZGlnaXRhbFxuICogYXNzZXRzIGFyZSBtZXJnZWQsIHNlcGFyYXRlZCwgb3Igb3RoZXJ3aXNlIG1hbmlwdWxhdGVkLiBGb3JcbiAqIGV4YW1wbGUsIGEgZGVwb3NpdCBvZiAyIGJ1Y2tzIGludG8gYSBwdXJzZSB0aGF0IGFscmVhZHkgaGFzIDMgYnVja3NcbiAqIGdpdmVzIGEgbmV3IHB1cnNlIGJhbGFuY2Ugb2YgNSBidWNrcy4gQW4gZW1wdHkgcHVyc2UgaGFzIDAgYnVja3MuIEFtb3VudE1hdGhcbiAqIHJlbGllcyBoZWF2aWx5IG9uIHBvbHltb3JwaGljIE1hdGhIZWxwZXJzLCB3aGljaCBtYW5pcHVsYXRlIHRoZSB1bmJyYW5kZWRcbiAqIHBvcnRpb24uXG4gKlxuICogQHByb3BlcnR5IHtCcmFuZDxLPn0gYnJhbmRcbiAqIEBwcm9wZXJ0eSB7QXNzZXRWYWx1ZUZvcktpbmQ8Sz59IHZhbHVlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7TmF0VmFsdWUgfCBTZXRWYWx1ZSB8IENvcHlTZXRWYWx1ZSB8IENvcHlCYWdWYWx1ZX0gQW1vdW50VmFsdWVcbiAqIEFuIGBBbW91bnRWYWx1ZWAgZGVzY3JpYmVzIGEgc2V0IG9yIHF1YW50aXR5IG9mIGFzc2V0cyB0aGF0IGNhbiBiZSBvd25lZCBvclxuICogc2hhcmVkLlxuICpcbiAqIEEgZnVuZ2libGUgYEFtb3VudFZhbHVlYCB1c2VzIGEgbm9uLW5lZ2F0aXZlIGJpZ2ludCB0byByZXByZXNlbnQgYSBxdWFudGl0eVxuICogb2YgdGhhdCBtYW55IGFzc2V0cy5cbiAqXG4gKiBBIG5vbi1mdW5naWJsZSBgQW1vdW50VmFsdWVgIHVzZXMgYW4gYXJyYXkgb3IgQ29weVNldCBvZiBgS2V5YHMgdG8gcmVwcmVzZW50XG4gKiBhIHNldCBvZiB3aGF0ZXZlciBhc3NldCBlYWNoIGtleSByZXByZXNlbnRzLiBBIGBLZXlgIGlzIGEgcGFzc2FibGUgdmFsdWVcbiAqIHRoYXQgY2FuIGJlIHVzZWQgYXMgYW4gZWxlbWVudCBpbiBhIHNldCAoU2V0U3RvcmUgb3IgQ29weVNldCkgb3IgYXMgdGhlXG4gKiBrZXkgaW4gYSBtYXAgKE1hcFN0b3JlIG9yIENvcHlNYXApLlxuICpcbiAqIGBTZXRWYWx1ZWAgaXMgZm9yIHRoZSBkZXByZWNhdGVkIHNldCByZXByZXNlbnRhdGlvbiwgdXNpbmcgYW4gYXJyYXkgZGlyZWN0bHlcbiAqIHRvIHJlcHJlc2VudCB0aGUgYXJyYXkgb2YgaXRzIGVsZW1lbnRzLiBgQ29weVNldFZhbHVlYCBpcyB0aGUgcHJvcGVyXG4gKiByZXByZXNlbnRhdGlvbiB1c2luZyBhIENvcHlTZXQuXG4gKlxuICogQSBzZW1pLWZ1bmdpYmxlIGBDb3B5QmFnVmFsdWVgIGlzIHJlcHJlc2VudGVkIGFzIGFcbiAqIGBDb3B5QmFnYCBvZiBgS2V5YCBvYmplY3RzLiBcIkJhZ1wiIGlzIHN5bm9ueW1vdXMgd2l0aCBNdWx0aVNldCwgd2hlcmUgYW5cbiAqIGVsZW1lbnQgb2YgYSBiYWcgY2FuIGJlIHByZXNlbnQgb25jZSBvciBtb3JlIHRpbWVzLCBpLmUuLCBzb21lIHBvc2l0aXZlXG4gKiBiaWdpbnQgbnVtYmVyIG9mIHRpbWVzLCByZXByZXNlbnRpbmcgdGhhdCBxdWFudGl0eSBvZiB0aGUgYXNzZXQgcmVwcmVzZW50ZWRcbiAqIGJ5IHRoYXQga2V5LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyduYXQnIHwgJ3NldCcgfCAnY29weVNldCcgfCAnY29weUJhZycgfSBBc3NldEtpbmRcbiAqXG4gKiBTZWUgZG9jLWNvbW1lbnQgZm9yIGBBbW91bnRWYWx1ZWAuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQHR5cGVkZWYge0sgZXh0ZW5kcyAnbmF0JyA/IE5hdFZhbHVlIDpcbiAqIEsgZXh0ZW5kcyAnc2V0JyA/IFNldFZhbHVlIDpcbiAqIEsgZXh0ZW5kcyAnY29weVNldCcgPyBDb3B5U2V0VmFsdWU6XG4gKiBLIGV4dGVuZHMgJ2NvcHlCYWcnID8gQ29weUJhZ1ZhbHVlIDpcbiAqIG5ldmVyXG4gKiB9IEFzc2V0VmFsdWVGb3JLaW5kXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Ftb3VudFZhbHVlfSBWXG4gKiBAdHlwZWRlZiB7ViBleHRlbmRzIE5hdFZhbHVlID8gJ25hdCcgOlxuICogIFYgZXh0ZW5kcyBTZXRWYWx1ZSA/ICdzZXQnIDpcbiAqICBWIGV4dGVuZHMgQ29weVNldFZhbHVlID8gJ2NvcHlTZXQnIDpcbiAqICBWIGV4dGVuZHMgQ29weUJhZ1ZhbHVlID8gJ2NvcHlCYWcnIDpcbiAqICBuZXZlcn0gQXNzZXRLaW5kRm9yVmFsdWVcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBEaXNwbGF5SW5mb1xuICogQHByb3BlcnR5IHtudW1iZXI9fSBkZWNpbWFsUGxhY2VzIFRlbGxzIHRoZSBkaXNwbGF5IHNvZnR3YXJlIGhvd1xuICogICBtYW55IGRlY2ltYWwgcGxhY2VzIHRvIG1vdmUgdGhlIGRlY2ltYWwgb3ZlciB0byB0aGUgbGVmdCwgb3IgaW5cbiAqICAgb3RoZXIgd29yZHMsIHdoaWNoIHBvc2l0aW9uIGNvcnJlc3BvbmRzIHRvIHdob2xlIG51bWJlcnMuIFdlXG4gKiAgIHJlcXVpcmUgZnVuZ2libGUgZGlnaXRhbCBhc3NldHMgdG8gYmUgcmVwcmVzZW50ZWQgaW4gaW50ZWdlcnMsIGluXG4gKiAgIHRoZSBzbWFsbGVzdCB1bml0IChpLmUuIFVTRCBtaWdodCBiZSByZXByZXNlbnRlZCBpbiBtaWxsLCBhXG4gKiAgIHRob3VzYW5kdGggb2YgYSBkb2xsYXIuIEluIHRoYXQgY2FzZSwgYGRlY2ltYWxQbGFjZXNgIHdvdWxkIGJlXG4gKiAgIDMuKSBUaGlzIHByb3BlcnR5IGlzIG9wdGlvbmFsLCBhbmQgZm9yIG5vbi1mdW5naWJsZSBkaWdpdGFsXG4gKiAgIGFzc2V0cywgc2hvdWxkIG5vdCBiZSBzcGVjaWZpZWQuIFRoZSBkZWNpbWFsUGxhY2VzIHByb3BlcnR5XG4gKiAgIHNob3VsZCBiZSB1c2VkIGZvciAqZGlzcGxheSBwdXJwb3NlcyBvbmx5Ki4gQW55IG90aGVyIHVzZSBpcyBhblxuICogICBhbnRpLXBhdHRlcm4uXG4gKiBAcHJvcGVydHkge0t9IGFzc2V0S2luZCAtIHRoZSBraW5kIG9mIGFzc2V0LCBlaXRoZXJcbiAqICAgQXNzZXRLaW5kLk5BVCAoZnVuZ2libGUpIG9yXG4gKiAgIEFzc2V0S2luZC5TRVQgb3IgQXNzZXRLaW5kLkNPUFlfU0VUIChub24tZnVuZ2libGUpXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHR5cGVkZWYge29iamVjdH0gQnJhbmRcbiAqIFRoZSBicmFuZCBpZGVudGlmaWVzIHRoZSBraW5kIG9mIGlzc3VlciwgYW5kIGhhcyBhIGZ1bmN0aW9uIHRvIGdldCB0aGVcbiAqIGFsbGVnZWQgbmFtZSBmb3IgdGhlIGtpbmQgb2YgYXNzZXQgZGVzY3JpYmVkLiBUaGUgYWxsZWdlZCBuYW1lIChzdWNoXG4gKiBhcyAnQlRDJyBvciAnbW9vbGEnKSBpcyBwcm92aWRlZCBieSB0aGUgbWFrZXIgb2YgdGhlIGlzc3VlciBhbmQgc2hvdWxkXG4gKiBub3QgYmUgdHJ1c3RlZCBhcyBhY2N1cmF0ZS5cbiAqXG4gKiBFdmVyeSBhbW91bnQgY3JlYXRlZCBieSBhIHBhcnRpY3VsYXIgQW1vdW50TWF0aCB3aWxsIHNoYXJlIHRoZSBzYW1lIGJyYW5kLFxuICogYnV0IHJlY2lwaWVudHMgY2Fubm90IHJlbHkgb24gdGhlIGJyYW5kIHRvIHZlcmlmeSB0aGF0IGEgcHVycG9ydGVkIGFtb3VudFxuICogcmVwcmVzZW50cyB0aGUgaXNzdWVyIHRoZXkgaW50ZW5kZWQsIHNpbmNlIHRoZSBzYW1lIGJyYW5kIGNhbiBiZSByZXVzZWQgYnlcbiAqIGEgbWlzYmVoYXZpbmcgaXNzdWVyLlxuICpcbiAqIEBwcm9wZXJ0eSB7KGFsbGVnZWRJc3N1ZXI6IEVSZWY8SXNzdWVyPikgPT4gUHJvbWlzZTxib29sZWFuPn0gaXNNeUlzc3VlclxuICogU2hvdWxkIGJlIHVzZWQgd2l0aCBgaXNzdWVyLmdldEJyYW5kYCB0byBlbnN1cmUgYW4gaXNzdWVyIGFuZCBicmFuZCBtYXRjaC5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gc3RyaW5nfSBnZXRBbGxlZ2VkTmFtZVxuICogQHByb3BlcnR5IHsoKSA9PiBEaXNwbGF5SW5mbzxLPn0gZ2V0RGlzcGxheUluZm9cbiAqIEdpdmUgaW5mb3JtYXRpb24gdG8gVUkgb24gaG93IHRvIGRpc3BsYXkgdGhlIGFtb3VudC5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUGF0dGVybn0gZ2V0QW1vdW50U2hhcGVcbiAqL1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gSXNzdWVyIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQGNhbGxiYWNrIElzc3VlcklzTGl2ZVxuICpcbiAqIFJldHVybiB0cnVlIGlmIHRoZSBwYXltZW50IGNvbnRpbnVlcyB0byBleGlzdC5cbiAqXG4gKiBJZiB0aGUgcGF5bWVudCBpcyBhIHByb21pc2UsIHRoZSBvcGVyYXRpb24gd2lsbCBwcm9jZWVkIHVwb25cbiAqIHJlc29sdXRpb24uXG4gKlxuICogQHBhcmFtIHtFUmVmPFBheW1lbnQ+fSBwYXltZW50XG4gKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn1cbiAqL1xuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQGNhbGxiYWNrIElzc3VlckdldEFtb3VudE9mXG4gKlxuICogR2V0IHRoZSBhbW91bnQgb2YgZGlnaXRhbCBhc3NldHMgaW4gdGhlIHBheW1lbnQuIEJlY2F1c2UgdGhlXG4gKiBwYXltZW50IGlzIG5vdCB0cnVzdGVkLCB3ZSBjYW5ub3QgY2FsbCBhIG1ldGhvZCBvbiBpdCBkaXJlY3RseSwgYW5kXG4gKiBtdXN0IHVzZSB0aGUgaXNzdWVyIGluc3RlYWQuXG4gKlxuICogSWYgdGhlIHBheW1lbnQgaXMgYSBwcm9taXNlLCB0aGUgb3BlcmF0aW9uIHdpbGwgcHJvY2VlZCB1cG9uXG4gKiByZXNvbHV0aW9uLlxuICpcbiAqIEBwYXJhbSB7RVJlZjxQYXltZW50Pn0gcGF5bWVudFxuICogQHJldHVybnMge1Byb21pc2U8QW1vdW50PEs+Pn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBJc3N1ZXJCdXJuXG4gKlxuICogQnVybiBhbGwgb2YgdGhlIGRpZ2l0YWwgYXNzZXRzIGluIHRoZVxuICogcGF5bWVudC4gYG9wdEFtb3VudGAgaXMgb3B0aW9uYWwuIElmIGBvcHRBbW91bnRgIGlzIHByZXNlbnQsIHRoZVxuICogY29kZSB3aWxsIGluc2lzdCB0aGF0IHRoZSBhbW91bnQgb2YgdGhlIGRpZ2l0YWwgYXNzZXRzIGluIHRoZVxuICogcGF5bWVudCBpcyBlcXVhbCB0byBgb3B0QW1vdW50YCwgdG8gcHJldmVudCBzZW5kaW5nIHRoZSB3cm9uZ1xuICogcGF5bWVudCBhbmQgb3RoZXIgY29uZnVzaW9uLlxuICpcbiAqIElmIHRoZSBwYXltZW50IGlzIGEgcHJvbWlzZSwgdGhlIG9wZXJhdGlvbiB3aWxsIHByb2NlZWQgdXBvblxuICogcmVzb2x1dGlvbi5cbiAqXG4gKiBAcGFyYW0ge0VSZWY8UGF5bWVudD59IHBheW1lbnRcbiAqIEBwYXJhbSB7UGF0dGVybj19IG9wdEFtb3VudFNoYXBlXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxBbW91bnQ+fVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBjYWxsYmFjayBJc3N1ZXJDbGFpbVxuICpcbiAqIFRyYW5zZmVyIGFsbCBkaWdpdGFsIGFzc2V0cyBmcm9tIHRoZSBwYXltZW50IHRvIGEgbmV3IHBheW1lbnQgYW5kXG4gKiBkZWxldGUgdGhlIG9yaWdpbmFsLiBgb3B0QW1vdW50YCBpcyBvcHRpb25hbC4gSWYgYG9wdEFtb3VudGAgaXNcbiAqIHByZXNlbnQsIHRoZSBjb2RlIHdpbGwgaW5zaXN0IHRoYXQgdGhlIGFtb3VudCBvZiBkaWdpdGFsIGFzc2V0cyBpblxuICogdGhlIHBheW1lbnQgaXMgZXF1YWwgdG8gYG9wdEFtb3VudGAsIHRvIHByZXZlbnQgc2VuZGluZyB0aGUgd3JvbmdcbiAqIHBheW1lbnQgYW5kIG90aGVyIGNvbmZ1c2lvbi5cbiAqXG4gKiBJZiB0aGUgcGF5bWVudCBpcyBhIHByb21pc2UsIHRoZSBvcGVyYXRpb24gd2lsbCBwcm9jZWVkIHVwb25cbiAqIHJlc29sdXRpb24uXG4gKlxuICogQHBhcmFtIHtFUmVmPFBheW1lbnQ8Sz4+fSBwYXltZW50XG4gKiBAcGFyYW0ge1BhdHRlcm49fSBvcHRBbW91bnRTaGFwZVxuICogQHJldHVybnMge1Byb21pc2U8UGF5bWVudDxLPj59XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQGNhbGxiYWNrIElzc3VlckNvbWJpbmVcbiAqXG4gKiBDb21iaW5lIG11bHRpcGxlIHBheW1lbnRzIGludG8gb25lIHBheW1lbnQuXG4gKlxuICogSWYgYW55IG9mIHRoZSBwYXltZW50cyBpcyBhIHByb21pc2UsIHRoZSBvcGVyYXRpb24gd2lsbCBwcm9jZWVkXG4gKiB1cG9uIHJlc29sdXRpb24uXG4gKlxuICogQHBhcmFtIHtFUmVmPFBheW1lbnQ8Sz4+W119IHBheW1lbnRzQXJyYXlcbiAqIEBwYXJhbSB7QW1vdW50PEs+PX0gb3B0VG90YWxBbW91bnRcbiAqIEByZXR1cm5zIHtQcm9taXNlPFBheW1lbnQ8Sz4+fVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBjYWxsYmFjayBJc3N1ZXJTcGxpdFxuICpcbiAqIFNwbGl0IGEgc2luZ2xlIHBheW1lbnQgaW50byB0d28gcGF5bWVudHMsXG4gKiBBIGFuZCBCLCBhY2NvcmRpbmcgdG8gdGhlIHBheW1lbnRBbW91bnRBIHBhc3NlZCBpbi5cbiAqXG4gKiBJZiB0aGUgcGF5bWVudCBpcyBhIHByb21pc2UsIHRoZSBvcGVyYXRpb24gd2lsbCBwcm9jZWVkIHVwb25cbiAqIHJlc29sdXRpb24uXG4gKlxuICogQHBhcmFtIHtFUmVmPFBheW1lbnQ8Sz4+fSBwYXltZW50XG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gcGF5bWVudEFtb3VudEFcbiAqIEByZXR1cm5zIHtQcm9taXNlPFBheW1lbnQ8Sz5bXT59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgSXNzdWVyU3BsaXRNYW55XG4gKlxuICogU3BsaXQgYSBzaW5nbGUgcGF5bWVudCBpbnRvIG1hbnkgcGF5bWVudHMsIGFjY29yZGluZyB0byB0aGUgYW1vdW50c1xuICogcGFzc2VkIGluLlxuICpcbiAqIElmIHRoZSBwYXltZW50IGlzIGEgcHJvbWlzZSwgdGhlIG9wZXJhdGlvbiB3aWxsIHByb2NlZWQgdXBvblxuICogcmVzb2x1dGlvbi5cbiAqXG4gKiBAcGFyYW0ge0VSZWY8UGF5bWVudD59IHBheW1lbnRcbiAqIEBwYXJhbSB7QW1vdW50W119IGFtb3VudHNcbiAqIEByZXR1cm5zIHtQcm9taXNlPFBheW1lbnRbXT59XG4gKlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IElzc3VlclxuICpcbiAqIFRoZSBpc3N1ZXIgY2Fubm90IG1pbnQgYSBuZXcgYW1vdW50LCBidXQgaXQgY2FuIGNyZWF0ZSBlbXB0eSBwdXJzZXNcbiAqIGFuZCBwYXltZW50cy4gVGhlIGlzc3VlciBjYW4gYWxzbyB0cmFuc2Zvcm0gcGF5bWVudHMgKHNwbGl0dGluZ1xuICogcGF5bWVudHMsIGNvbWJpbmluZyBwYXltZW50cywgYnVybmluZyBwYXltZW50cywgYW5kIGNsYWltaW5nXG4gKiBwYXltZW50cyBleGNsdXNpdmVseSkuIFRoZSBpc3N1ZXIgc2hvdWxkIGJlIGdvdHRlbiBmcm9tIGEgdHJ1c3RlZFxuICogc291cmNlIGFuZCB0aGVuIHJlbGllZCB1cG9uIGFzIHRoZSBkZWNpZGVyIG9mIHdoZXRoZXIgYW4gdW50cnVzdGVkXG4gKiBwYXltZW50IGlzIHZhbGlkLlxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gQnJhbmQ8Sz59IGdldEJyYW5kIEdldCB0aGUgQnJhbmQgZm9yIHRoaXMgSXNzdWVyLiBUaGVcbiAqIEJyYW5kIGluZGljYXRlcyB0aGUgdHlwZSBvZiBkaWdpdGFsIGFzc2V0IGFuZCBpcyBzaGFyZWQgYnkgdGhlXG4gKiBtaW50LCB0aGUgaXNzdWVyLCBhbmQgYW55IHB1cnNlcyBhbmQgcGF5bWVudHMgb2YgdGhpcyBwYXJ0aWN1bGFyXG4gKiBraW5kLiBUaGUgYnJhbmQgaXMgbm90IGNsb3NlbHkgaGVsZCwgc28gdGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlXG4gKiB0cnVzdGVkIHRvIGlkZW50aWZ5IGFuIGlzc3VlciBhbG9uZS4gRmFrZSBkaWdpdGFsIGFzc2V0cyBhbmQgYW1vdW50XG4gKiBjYW4gdXNlIGFub3RoZXIgaXNzdWVyJ3MgYnJhbmQuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBzdHJpbmd9IGdldEFsbGVnZWROYW1lIEdldCB0aGUgYWxsZWdlZE5hbWUgZm9yXG4gKiB0aGlzIG1pbnQvaXNzdWVyXG4gKiBAcHJvcGVydHkgeygpID0+IEFzc2V0S2luZH0gZ2V0QXNzZXRLaW5kIEdldCB0aGUga2luZCBvZlxuICogTWF0aEhlbHBlcnMgdXNlZCBieSB0aGlzIElzc3Vlci5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gRGlzcGxheUluZm99IGdldERpc3BsYXlJbmZvIEdpdmUgaW5mb3JtYXRpb24gdG8gVUlcbiAqICBvbiBob3cgdG8gZGlzcGxheSBhbW91bnRzIGZvciB0aGlzIGlzc3Vlci5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHVyc2U8Sz59IG1ha2VFbXB0eVB1cnNlIE1ha2UgYW4gZW1wdHkgcHVyc2Ugb2YgdGhpc1xuICogYnJhbmQuXG4gKiBAcHJvcGVydHkge0lzc3VlcklzTGl2ZX0gaXNMaXZlXG4gKiBAcHJvcGVydHkge0lzc3VlckdldEFtb3VudE9mPEs+fSBnZXRBbW91bnRPZlxuICogQHByb3BlcnR5IHtJc3N1ZXJCdXJufSBidXJuXG4gKiBAcHJvcGVydHkge0lzc3VlckNsYWltPEs+fSBjbGFpbVxuICogQHByb3BlcnR5IHtJc3N1ZXJDb21iaW5lPEs+fSBjb21iaW5lXG4gKiBAcHJvcGVydHkge0lzc3VlclNwbGl0PEs+fSBzcGxpdFxuICogQHByb3BlcnR5IHtJc3N1ZXJTcGxpdE1hbnl9IHNwbGl0TWFueVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBheW1lbnRMZWRnZXJcbiAqIEBwcm9wZXJ0eSB7TWludDxLPn0gbWludFxuICogQHByb3BlcnR5IHtJc3N1ZXI8Sz59IGlzc3VlclxuICogQHByb3BlcnR5IHtCcmFuZDxLPn0gYnJhbmRcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBJc3N1ZXJLaXRcbiAqIEBwcm9wZXJ0eSB7TWludDxLPn0gbWludFxuICogQHByb3BlcnR5IHtJc3N1ZXI8Sz59IGlzc3VlclxuICogQHByb3BlcnR5IHtCcmFuZDxLPn0gYnJhbmRcbiAqIEBwcm9wZXJ0eSB7RGlzcGxheUluZm99IGRpc3BsYXlJbmZvXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBBZGRpdGlvbmFsRGlzcGxheUluZm9cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcj19IGRlY2ltYWxQbGFjZXMgVGVsbHMgdGhlIGRpc3BsYXkgc29mdHdhcmUgaG93XG4gKiAgIG1hbnkgZGVjaW1hbCBwbGFjZXMgdG8gbW92ZSB0aGUgZGVjaW1hbCBvdmVyIHRvIHRoZSBsZWZ0LCBvciBpblxuICogICBvdGhlciB3b3Jkcywgd2hpY2ggcG9zaXRpb24gY29ycmVzcG9uZHMgdG8gd2hvbGUgbnVtYmVycy4gV2VcbiAqICAgcmVxdWlyZSBmdW5naWJsZSBkaWdpdGFsIGFzc2V0cyB0byBiZSByZXByZXNlbnRlZCBpbiBpbnRlZ2VycywgaW5cbiAqICAgdGhlIHNtYWxsZXN0IHVuaXQgKGkuZS4gVVNEIG1pZ2h0IGJlIHJlcHJlc2VudGVkIGluIG1pbGwsIGFcbiAqICAgdGhvdXNhbmR0aCBvZiBhIGRvbGxhci4gSW4gdGhhdCBjYXNlLCBgZGVjaW1hbFBsYWNlc2Agd291bGQgYmVcbiAqICAgMy4pIFRoaXMgcHJvcGVydHkgaXMgb3B0aW9uYWwsIGFuZCBmb3Igbm9uLWZ1bmdpYmxlIGRpZ2l0YWxcbiAqICAgYXNzZXRzLCBzaG91bGQgbm90IGJlIHNwZWNpZmllZC4gVGhlIGRlY2ltYWxQbGFjZXMgcHJvcGVydHlcbiAqICAgc2hvdWxkIGJlIHVzZWQgZm9yICpkaXNwbGF5IHB1cnBvc2VzIG9ubHkqLiBBbnkgb3RoZXIgdXNlIGlzIGFuXG4gKiAgIGFudGktcGF0dGVybi5cbiAqIEBwcm9wZXJ0eSB7QXNzZXRLaW5kPX0gYXNzZXRLaW5kXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgU2h1dGRvd25XaXRoRmFpbHVyZVxuICogQ2FsbGVkIHRvIHNodXQgc29tZXRoaW5nIGRvd24gYmVjYXVzZSBzb21ldGhpbmcgd2VudCB3cm9uZywgd2hlcmUgdGhlIHJlYXNvblxuICogaXMgc3VwcG9zZWQgdG8gYmUgYW4gRXJyb3IgdGhhdCBkZXNjcmliZXMgd2hhdCB3ZW50IHdyb25nLiBTb21lIHZhbGlkXG4gKiBpbXBsZW1lbnRhdGlvbnMgb2YgYFNodXRkb3duV2l0aEZhaWx1cmVgIHdpbGwgbmV2ZXIgcmV0dXJuLCBlaXRoZXJcbiAqIGJlY2F1c2UgdGhleSB0aHJvdyBvciBiZWNhdXNlIHRoZXkgaW1tZWRpYXRlbHkgc2h1dGRvd24gdGhlIGVuY2xvc2luZyB1bml0XG4gKiBvZiBjb21wdXRhdGlvbi4gSG93ZXZlciwgdGhleSBhbHNvIG1pZ2h0IHJldHVybiwgc28gdGhlIGNhbGxlciBzaG91bGRcbiAqIGZvbGxvdyB0aGlzIGNhbGwgYnkgdGhlaXIgb3duIGRlZmVuc2l2ZSBgdGhyb3cgcmVhc29uO2AgaWYgYXBwcm9wcmlhdGUuXG4gKlxuICogQHBhcmFtIHtFcnJvcn0gcmVhc29uXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBNaW50XG4gKiBIb2xkaW5nIGEgTWludCBjYXJyaWVzIHRoZSByaWdodCB0byBpc3N1ZSBuZXcgZGlnaXRhbCBhc3NldHMuIFRoZXNlXG4gKiBhc3NldHMgYWxsIGhhdmUgdGhlIHNhbWUga2luZCwgd2hpY2ggaXMgY2FsbGVkIGEgQnJhbmQuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBJc3N1ZXI8Sz59IGdldElzc3VlciBHZXRzIHRoZSBJc3N1ZXIgZm9yIHRoaXMgbWludC5cbiAqIEBwcm9wZXJ0eSB7KG5ld0Ftb3VudDogQW1vdW50PEs+KSA9PiBQYXltZW50PEs+fSBtaW50UGF5bWVudFxuICogQ3JlYXRlcyBhIG5ldyBQYXltZW50IGNvbnRhaW5pbmcgbmV3bHkgbWludGVkIGFtb3VudC5cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBEZXBvc2l0RmFjZXRSZWNlaXZlXG4gKiBAcGFyYW0ge1BheW1lbnR9IHBheW1lbnRcbiAqIEBwYXJhbSB7UGF0dGVybj19IG9wdEFtb3VudFNoYXBlXG4gKiBAcmV0dXJucyB7QW1vdW50fVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRGVwb3NpdEZhY2V0XG4gKiBAcHJvcGVydHkge0RlcG9zaXRGYWNldFJlY2VpdmV9IHJlY2VpdmVcbiAqIERlcG9zaXQgYWxsIHRoZSBjb250ZW50cyBvZiBwYXltZW50IGludG8gdGhlIHB1cnNlIHRoYXQgbWFkZSB0aGlzIGZhY2V0LFxuICogcmV0dXJuaW5nIHRoZSBhbW91bnQuIElmIHRoZSBvcHRpb25hbCBhcmd1bWVudCBgb3B0QW1vdW50YCBkb2VzIG5vdCBlcXVhbCB0aGVcbiAqIGFtb3VudCBvZiBkaWdpdGFsIGFzc2V0cyBpbiB0aGUgcGF5bWVudCwgdGhyb3cgYW4gZXJyb3IuXG4gKlxuICogSWYgcGF5bWVudCBpcyBhIHByb21pc2UsIHRocm93IGFuIGVycm9yLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBjYWxsYmFjayBQdXJzZURlcG9zaXRcbiAqIEBwYXJhbSB7UGF5bWVudDxLPn0gcGF5bWVudFxuICogQHBhcmFtIHtQYXR0ZXJuPX0gb3B0QW1vdW50U2hhcGVcbiAqIEByZXR1cm5zIHtBbW91bnQ8Sz59XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHR5cGVkZWYge29iamVjdH0gUHVyc2VcbiAqIFB1cnNlcyBob2xkIGFtb3VudCBvZiBkaWdpdGFsIGFzc2V0cyBvZiB0aGUgc2FtZSBicmFuZCwgYnV0IHVubGlrZSBQYXltZW50cyxcbiAqIHRoZXkgYXJlIG5vdCBtZWFudCB0byBiZSBzZW50IHRvIG90aGVycy4gVG8gdHJhbnNmZXIgZGlnaXRhbCBhc3NldHMsIGFcbiAqIFBheW1lbnQgc2hvdWxkIGJlIHdpdGhkcmF3biBmcm9tIGEgUHVyc2UuIFRoZSBhbW91bnQgb2YgZGlnaXRhbFxuICogYXNzZXRzIGluIGEgcHVyc2UgY2FuIGNoYW5nZSB0aHJvdWdoIHRoZSBhY3Rpb24gb2YgZGVwb3NpdCgpIGFuZCB3aXRoZHJhdygpLlxuICpcbiAqIFRoZSBwcmltYXJ5IHVzZSBmb3IgUHVyc2VzIGFuZCBQYXltZW50cyBpcyBmb3IgY3VycmVuY3ktbGlrZSBhbmQgZ29vZHMtbGlrZVxuICogZGlnaXRhbCBhc3NldHMsIGJ1dCB0aGV5IGNhbiBhbHNvIGJlIHVzZWQgdG8gcmVwcmVzZW50IG90aGVyIGtpbmRzIG9mIHJpZ2h0cyxcbiAqIHN1Y2ggYXMgdGhlIHJpZ2h0IHRvIHBhcnRpY2lwYXRlIGluIGEgcGFydGljdWxhciBjb250cmFjdC5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IEJyYW5kPEs+fSBnZXRBbGxlZ2VkQnJhbmQgR2V0IHRoZSBhbGxlZ2VkIEJyYW5kIGZvciB0aGlzIFB1cnNlXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBBbW91bnQ8Sz59IGdldEN1cnJlbnRBbW91bnRcbiAqIEdldCB0aGUgYW1vdW50IGNvbnRhaW5lZCBpbiB0aGlzIHB1cnNlLlxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gTm90aWZpZXI8QW1vdW50PEs+Pn0gZ2V0Q3VycmVudEFtb3VudE5vdGlmaWVyXG4gKiBHZXQgYSBsb3NzeSBub3RpZmllciBmb3IgY2hhbmdlcyB0byB0aGlzIHB1cnNlJ3MgYmFsYW5jZS5cbiAqXG4gKiBAcHJvcGVydHkge1B1cnNlRGVwb3NpdDxLPn0gZGVwb3NpdFxuICogRGVwb3NpdCBhbGwgdGhlIGNvbnRlbnRzIG9mIHBheW1lbnQgaW50byB0aGlzIHB1cnNlLCByZXR1cm5pbmcgdGhlXG4gKiBhbW91bnQuIElmIHRoZSBvcHRpb25hbCBhcmd1bWVudCBgb3B0QW1vdW50YCBkb2VzIG5vdCBlcXVhbCB0aGVcbiAqIGFtb3VudCBvZiBkaWdpdGFsIGFzc2V0cyBpbiB0aGUgcGF5bWVudCwgdGhyb3cgYW4gZXJyb3IuXG4gKlxuICogSWYgcGF5bWVudCBpcyBhIHByb21pc2UsIHRocm93IGFuIGVycm9yLlxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gRGVwb3NpdEZhY2V0fSBnZXREZXBvc2l0RmFjZXRcbiAqIFJldHVybiBhbiBvYmplY3Qgd2hvc2UgYHJlY2VpdmVgIG1ldGhvZCBkZXBvc2l0cyB0byB0aGUgY3VycmVudCBQdXJzZS5cbiAqXG4gKiBAcHJvcGVydHkgeyhhbW91bnQ6IEFtb3VudDxLPikgPT4gUGF5bWVudDxLPn0gd2l0aGRyYXdcbiAqIFdpdGhkcmF3IGFtb3VudCBmcm9tIHRoaXMgcHVyc2UgaW50byBhIG5ldyBQYXltZW50LlxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gQ29weVNldDxQYXltZW50PEs+Pn0gZ2V0UmVjb3ZlcnlTZXRcbiAqIFRoZSBzZXQgb2YgcGF5bWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcHVyc2UgdGhhdCBhcmUgc3RpbGwgbGl2ZS4gVGhlc2VcbiAqIGFyZSB0aGUgcGF5bWVudHMgdGhhdCBjYW4gc3RpbGwgYmUgcmVjb3ZlcmVkIGluIGVtZXJnZW5jaWVzIGJ5LCBmb3IgZXhhbXBsZSxcbiAqIGRlcG9zaXRpbmcgaW50byB0aGlzIHB1cnNlLiBTdWNoIGEgZGVwb3NpdCBhY3Rpb24gaXMgbGlrZSBjYW5jZWxpbmcgYW5cbiAqIG91dHN0YW5kaW5nIGNoZWNrIGJlY2F1c2UgeW91J3JlIHRpcmVkIG9mIHdhaXRpbmcgZm9yIGl0LiBPbmNlIHlvdXJcbiAqIGNhbmNlbGxhdGlvbiBpcyBhY2tub3dsZWRnZWQsIHlvdSBjYW4gc3BlbmQgdGhlIGFzc2V0cyBhdCBzdGFrZSBvbiBvdGhlclxuICogdGhpbmdzLiBBZnRlcndhcmRzLCBpZiB0aGUgcmVjaXBpZW50IG9mIHRoZSBvcmlnaW5hbCBjaGVjayBmaW5hbGx5IGdldHNcbiAqIGFyb3VuZCB0byBkZXBvc2l0aW5nIGl0LCB0aGVpciBkZXBvc2l0IGZhaWxzLlxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gQW1vdW50PEs+fSByZWNvdmVyQWxsXG4gKiBGb3IgdXNlIGluIGVtZXJnZW5jaWVzLCBzdWNoIGFzIGNvbWluZyBiYWNrIGZyb20gYSB0cmF1bWF0aWMgY3Jhc2ggYW5kXG4gKiB1cGdyYWRlLiBUaGlzIGRlcG9zaXRzIGFsbCB0aGUgcGF5bWVudHMgaW4gdGhpcyBwdXJzZSdzIHJlY292ZXJ5IHNldFxuICogaW50byB0aGUgcHVyc2UgaXRzZWxmLCByZXR1cm5pbmcgdGhlIHRvdGFsIGFtb3VudCBvZiBhc3NldHMgcmVjb3ZlcmVkLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBheW1lbnRcbiAqIFBheW1lbnRzIGhvbGQgYW1vdW50IG9mIGRpZ2l0YWwgYXNzZXRzIG9mIHRoZSBzYW1lIGJyYW5kIGluIHRyYW5zaXQuIFBheW1lbnRzXG4gKiBjYW4gYmUgZGVwb3NpdGVkIGluIHB1cnNlcywgc3BsaXQgaW50byBtdWx0aXBsZSBwYXltZW50cywgY29tYmluZWQsIGFuZFxuICogY2xhaW1lZCAoZ2V0dGluZyBhbiBleGNsdXNpdmUgcGF5bWVudCkuIFBheW1lbnRzIGFyZSBsaW5lYXIsIG1lYW5pbmdcbiAqIHRoYXQgZWl0aGVyIGEgcGF5bWVudCBoYXMgdGhlIHNhbWUgYW1vdW50IG9mIGRpZ2l0YWwgYXNzZXRzIGl0XG4gKiBzdGFydGVkIHdpdGgsIG9yIGl0IGlzIHVzZWQgdXAgZW50aXJlbHkuIEl0IGlzIGltcG9zc2libGUgdG8gcGFydGlhbGx5IHVzZSBhXG4gKiBwYXltZW50LlxuICpcbiAqIFBheW1lbnRzIGFyZSBvZnRlbiByZWNlaXZlZCBmcm9tIG90aGVyIGFjdG9ycyBhbmQgdGhlcmVmb3JlIHNob3VsZFxuICogbm90IGJlIHRydXN0ZWQgdGhlbXNlbHZlcy4gVG8gZ2V0IHRoZSBhbW91bnQgb2YgZGlnaXRhbCBhc3NldHMgaW4gYSBwYXltZW50LFxuICogdXNlIHRoZSB0cnVzdGVkIGlzc3VlcjogaXNzdWVyLmdldEFtb3VudE9mKHBheW1lbnQpLFxuICpcbiAqIFBheW1lbnRzIGNhbiBiZSBjb252ZXJ0ZWQgdG8gUHVyc2VzIGJ5IGdldHRpbmcgYSB0cnVzdGVkIGlzc3VlciBhbmRcbiAqIGNhbGxpbmcgYGlzc3Vlci5tYWtlRW1wdHlQdXJzZSgpYCB0byBjcmVhdGUgYSBwdXJzZSwgdGhlblxuICogYHB1cnNlLmRlcG9zaXQocGF5bWVudClgLlxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gQnJhbmQ8Sz59IGdldEFsbGVnZWRCcmFuZFxuICogR2V0IHRoZSBhbGxlZ2VkQnJhbmQsIGluZGljYXRpbmcgdGhlIHR5cGUgb2YgZGlnaXRhbCBhc3NldCB0aGlzXG4gKiBwYXltZW50IHB1cnBvcnRzIHRvIGJlLCBhbmQgd2hpY2ggaXNzdWVyIHRvIHVzZS4gQmVjYXVzZSBwYXltZW50c1xuICogYXJlIG5vdCB0cnVzdGVkLCBhbnkgbWV0aG9kIGNhbGxzIG9uIHBheW1lbnRzIHNob3VsZCBiZSB0cmVhdGVkXG4gKiB3aXRoIHN1c3BpY2lvbiBhbmQgdmVyaWZpZWQgZWxzZXdoZXJlLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBbW91bnRWYWx1ZX0gVlxuICogQHR5cGVkZWYge29iamVjdH0gTWF0aEhlbHBlcnNcbiAqIEFsbCBvZiB0aGUgZGlmZmVyZW5jZSBpbiBob3cgZGlnaXRhbCBhc3NldCBhbW91bnQgYXJlIG1hbmlwdWxhdGVkIGNhbiBiZVxuICogcmVkdWNlZCB0byB0aGUgYmVoYXZpb3Igb2YgdGhlIG1hdGggb24gdmFsdWVzLiBXZSBleHRyYWN0IHRoaXNcbiAqIGN1c3RvbSBsb2dpYyBpbnRvIG1hdGhIZWxwZXJzLiBNYXRoSGVscGVycyBhcmUgYWJvdXQgdmFsdWVcbiAqIGFyaXRobWV0aWMsIHdoZXJlYXMgQW1vdW50TWF0aCBpcyBhYm91dCBhbW91bnRzLCB3aGljaCBhcmUgdGhlXG4gKiB2YWx1ZXMgbGFiZWxlZCB3aXRoIGEgYnJhbmQuIEFtb3VudE1hdGggdXNlIG1hdGhIZWxwZXJzIHRvIGRvIHRoZWlyIHZhbHVlXG4gKiBhcml0aG1ldGljLCBhbmQgdGhlbiBicmFuZCB0aGUgcmVzdWx0cywgbWFraW5nIGEgbmV3IGFtb3VudC5cbiAqXG4gKiBUaGUgTWF0aEhlbHBlcnMgYXJlIGRlc2lnbmVkIHRvIGJlIGNhbGxlZCBvbmx5IGZyb20gQW1vdW50TWF0aCwgYW5kIHNvXG4gKiBhbGwgbWV0aG9kcyBidXQgY29lcmNlIGNhbiBhc3N1bWUgdGhlaXIgaW5wdXRzIGFyZSB2YWxpZC4gVGhleSBvbmx5XG4gKiBuZWVkIHRvIGRvIG91dHB1dCB2YWxpZGF0aW9uLCBhbmQgb25seSB3aGVuIHRoZXJlIGlzIGEgcG9zc2liaWxpdHkgb2ZcbiAqIGludmFsaWQgb3V0cHV0LlxuICpcbiAqIEBwcm9wZXJ0eSB7KGFsbGVnZWRWYWx1ZTogVikgPT4gVn0gZG9Db2VyY2VcbiAqIENoZWNrIHRoZSBraW5kIG9mIHRoaXMgdmFsdWUgYW5kIHRocm93IGlmIGl0IGlzIG5vdCB0aGVcbiAqIGV4cGVjdGVkIGtpbmQuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBWfSBkb01ha2VFbXB0eVxuICogR2V0IHRoZSByZXByZXNlbnRhdGlvbiBmb3IgdGhlIGlkZW50aXR5IGVsZW1lbnQgKG9mdGVuIDAgb3IgYW5cbiAqIGVtcHR5IGFycmF5KVxuICpcbiAqIEBwcm9wZXJ0eSB7KHZhbHVlOiBWKSA9PiBib29sZWFufSBkb0lzRW1wdHlcbiAqIElzIHRoZSB2YWx1ZSB0aGUgaWRlbnRpdHkgZWxlbWVudD9cbiAqXG4gKiBAcHJvcGVydHkgeyhsZWZ0OiBWLCByaWdodDogVikgPT4gYm9vbGVhbn0gZG9Jc0dURVxuICogSXMgdGhlIGxlZnQgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSByaWdodD9cbiAqXG4gKiBAcHJvcGVydHkgeyhsZWZ0OiBWLCByaWdodDogVikgPT4gYm9vbGVhbn0gZG9Jc0VxdWFsXG4gKiBEb2VzIGxlZnQgZXF1YWwgcmlnaHQ/XG4gKlxuICogQHByb3BlcnR5IHsobGVmdDogViwgcmlnaHQ6IFYpID0+IFZ9IGRvQWRkXG4gKiBSZXR1cm4gdGhlIGxlZnQgY29tYmluZWQgd2l0aCB0aGUgcmlnaHQuXG4gKlxuICogQHByb3BlcnR5IHsobGVmdDogViwgcmlnaHQ6IFYpID0+IFZ9IGRvU3VidHJhY3RcbiAqIFJldHVybiB3aGF0IHJlbWFpbnMgYWZ0ZXIgcmVtb3ZpbmcgdGhlIHJpZ2h0IGZyb20gdGhlIGxlZnQuIElmXG4gKiBzb21ldGhpbmcgaW4gdGhlIHJpZ2h0IHdhcyBub3QgaW4gdGhlIGxlZnQsIHdlIHRocm93IGFuIGVycm9yLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge2JpZ2ludH0gTmF0VmFsdWVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtNYXRoSGVscGVyczxOYXRWYWx1ZT59IE5hdE1hdGhIZWxwZXJzXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7QXJyYXk8S2V5Pn0gU2V0VmFsdWVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtNYXRoSGVscGVyczxTZXRWYWx1ZT59IFNldE1hdGhIZWxwZXJzXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7Q29weVNldDxLZXk+fSBDb3B5U2V0VmFsdWVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtNYXRoSGVscGVyczxDb3B5U2V0VmFsdWU+fSBDb3B5U2V0TWF0aEhlbHBlcnNcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtDb3B5QmFnPEtleT59IENvcHlCYWdWYWx1ZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge01hdGhIZWxwZXJzPENvcHlCYWdWYWx1ZT59IENvcHlCYWdNYXRoSGVscGVyc1xuICovXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAF3N7g5XAQAAVwEAACUAAABAYWdvcmljL2dvdmVybmFuY2UtdjAuOS4xL2V4cG9ydGVkLmpzeyJpbXBvcnRzIjpbIi4vc3JjL3R5cGVzLWFtYmllbnQuanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9zcmMvdHlwZXMtYW1iaWVudC5qc1wiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAT1Jlay9cAAAvXAAALgAAAEBhZ29yaWMvZ292ZXJuYW5jZS12MC45LjEvc3JjL3R5cGVzLWFtYmllbnQuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKipcbiAqIEB0eXBlZGVmIHsgJ3VucmFua2VkJyB8ICdvcmRlcicgfCAncGx1cmFsaXR5JyB9IENob2ljZU1ldGhvZFxuICogKiBVTlJBTktFRDogXCJ1bnJhbmtlZCB2b3RpbmdcIiBtZWFucyB0aGF0IHRoZSB2b3RlciBzcGVjaWZpZXMgc29tZSBudW1iZXIgb2ZcbiAqICAgIHBvc2l0aW9ucywgYW5kIGlzIGVuZG9yc2luZyB0aGVtIGVxdWFsbHkuXG4gKiAqIE9SREVSOiBUaGUgdm90ZXIgYXNzaWducyBvcmRpbmFsIG51bWJlcnMgdG8gc29tZSBvZiB0aGUgcG9zaXRpb25zLiBUaGVcbiAqICAgIHBvc2l0aW9ucyB3aWxsIGJlIHRyZWF0ZWQgYXMgYW4gb3JkZXJlZCBsaXN0IHdpdGggbm8gZ2Fwcy5cbiAqXG4gKiBXaGVuIHZvdGVycyBhcmUgbGltaXRlZCB0byBjaG9vc2luZyBhIHNpbmdsZSBjYW5kaWRhdGUsIGVpdGhlciBVTlJBTktFRCBvclxuICogT1JERVIgd291bGQgd29yay4gVU5SQU5LRUQgaGFzIGEgc2ltcGxlciByZXByZXNlbnRhdGlvbiBzbyB3ZSB1c2UgdGhhdC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsgJ3BhcmFtX2NoYW5nZScgfCAnZWxlY3Rpb24nIHwgJ3N1cnZleScgfCAnYXBpX2ludm9jYXRpb24nIHxcbiAqICAgJ29mZmVyX2ZpbHRlcicgfSBFbGVjdGlvblR5cGVcbiAqIHBhcmFtX2NoYW5nZSBpcyB2ZXJ5IHNwZWNpZmljLiBTdXJ2ZXkgbWVhbnMgbXVsdGlwbGUgYW5zd2VycyBhcmUgcG9zc2libGUsXG4gKiBFbGVjdGlvbiBtZWFucyBzb21lIGNhbmRpZGF0ZXMgYXJlIGdvaW5nIHRvIFwid2luXCIuIEl0J3Mgbm90IGNsZWFyIHRoZXNlIGFyZVxuICogb3J0aG9nb25hbC4gVGhlIGltcG9ydGFudCBkaXN0aW5jdGlvbiBpcyB0aGF0IHBhcmFtX2NoYW5nZSBoYXMgYSBzdHJ1Y3R1cmVkXG4gKiBpc3N1ZSwgd2hpbGUgdGhlIG90aGVycyBoYXZlIGEgaXNzdWUgcHJlc2VudGVkIGFzIGEgc3RyaW5nLlxuICovXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi9jb25zdGFudHMuanMnKS5QYXJhbVR5cGV9IFBhcmFtVHlwZSAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsgJ21ham9yaXR5JyB8ICdhbGwnIHwgJ25vX3F1b3J1bScgfSBRdW9ydW1SdWxlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTaW1wbGVJc3N1ZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRleHRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsgQW1vdW50IHwgQnJhbmQgfCBJbnN0YWxsYXRpb24gfCBJbnN0YW5jZSB8IGJpZ2ludCB8XG4gKiAgIFJhdGlvIHwgc3RyaW5nIHwgdW5rbm93biB9IFBhcmFtVmFsdWVcbiAqL1xuXG4vKiBYWFggYmV0dGVyIHRvIHVzZSB0aGUgbWFuaWZlc3QgY29uc3RhbnQgUGFyYW1UeXBlcyovXG4vKiBidXQgaW1wb3J0aW5nIHRoYXQgaGVyZSB0dXJucyB0aGlzIGZpbGUgaW50byBhIG1vZHVsZSwqL1xuLyogYnJlYWtpbmcgdGhlIGFtYmllbnQgdHlwaW5nKi9cbi8qKlxuICogQHRlbXBsYXRlIHtQYXJhbVR5cGV9IFRcbiAqIEB0eXBlZGVmIHtUIGV4dGVuZHMgJ2Ftb3VudCcgPyBBbW91bnQgOlxuICogVCBleHRlbmRzICdicmFuZCcgPyBCcmFuZCA6XG4gKiBUIGV4dGVuZHMgJ2luc3RhbGxhdGlvbicgPyBJbnN0YWxsYXRpb246XG4gKiBUIGV4dGVuZHMgJ2luc3RhbmNlJyA/IEluc3RhbmNlIDpcbiAqIFQgZXh0ZW5kcyAnaW52aXRhdGlvbicgPyBBbW91bnQgOiAvLyBYWFggdGhpcyBpcyB0aGUgZ2V0dGVyIHZhbHVlIGJ1dCBub3QgdGhlIHNldHRlclxuICogVCBleHRlbmRzICduYXQnID8gYmlnaW50IDpcbiAqIFQgZXh0ZW5kcyAncmF0aW8nID8gUmF0aW8gOlxuICogVCBleHRlbmRzICdzdHJpbmcnID8gc3RyaW5nIDpcbiAqIFQgZXh0ZW5kcyAndW5rbm93bicgPyB1bmtub3duIDpcbiAqIG5ldmVyXG4gKiB9IFBhcmFtVmFsdWVGb3JUeXBlXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge1BhcmFtVHlwZX0gW1Q9UGFyYW1UeXBlXVxuICogQHR5cGVkZWYge3sgdHlwZTogVCwgdmFsdWU6IFBhcmFtVmFsdWVGb3JUeXBlPFQ+IH19IFBhcmFtVmFsdWVUeXBlZDxUPlxuICovXG5cbi8qKlxuICogVGVybXMgYSBjb250cmFjdCBtdXN0IHByb3ZpZGUgaW4gb3JkZXIgdG8gYmUgZ292ZXJuZWQuXG4gKlxuICogQHRlbXBsYXRlIHtYaW1wb3J0KCcuL2NvbnRyYWN0R292ZXJuYW5jZS90eXBlZFBhcmFtTWFuYWdlci5qcycpLlBhcmFtVHlwZXNNYXB9IFQgR292ZXJuZWQgcGFyYW1ldGVycyBvZiBjb250cmFjdFxuICogQHR5cGVkZWYge3tcbiAqICAgZWxlY3Rpb25NYW5hZ2VyOiBYaW1wb3J0KCdAYWdvcmljL3pvZS9zcmMvem9lU2VydmljZS91dGlscy5qcycpLkluc3RhbmNlPFhpbXBvcnQoJy4vY29udHJhY3RHb3Zlcm5vcicpLnN0YXJ0PixcbiAqICAgZ292ZXJuZWRQYXJhbXM6IFhpbXBvcnQoJy4vY29udHJhY3RHb3Zlcm5hbmNlL3R5cGVkUGFyYW1NYW5hZ2VyLmpzJykuUGFyYW1SZWNvcmRzRnJvbVR5cGVzPFQgJiB7XG4gKiAgICAgRWxlY3RvcmF0ZTogJ2ludml0YXRpb24nXG4gKiAgIH0+XG4gKiB9fSBHb3Zlcm5hbmNlVGVybXM8VD5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsgU2ltcGxlSXNzdWUgfCBQYXJhbUNoYW5nZUlzc3VlPHVua25vd24+IHwgQXBpSW52b2NhdGlvbklzc3VlIHxcbiAqICAgT2ZmZXJGaWx0ZXJJc3N1ZSB9IElzc3VlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBRdWVzdGlvblRlcm1zIC0gUXVlc3Rpb25TcGVjIHBsdXMgdGhlIEVsZWN0b3JhdGUgSW5zdGFuY2UgYW5kXG4gKiAgIGEgbnVtZXJpY2FsIHRocmVzaG9sZCBmb3IgdGhlIHF1b3J1bS4gKFRoZSB2b3RlQ291bnRlciBkb2Vzbid0IGtub3cgdGhlXG4gKiAgIHNpemUgb2YgdGhlIGVsZWN0b3JhdGUsIHNvIHRoZSBFbGVjdG9yYXRlIGhhcyB0byBzYXkgd2hhdCBsaW1pdCB0byBlbmZvcmNlLilcbiAqIEBwcm9wZXJ0eSB7UXVlc3Rpb25TcGVjfSBxdWVzdGlvblNwZWNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBxdW9ydW1UaHJlc2hvbGRcbiAqIEBwcm9wZXJ0eSB7SW5zdGFuY2V9IGVsZWN0b3JhdGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFRleHRQb3NpdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRleHRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsgVGV4dFBvc2l0aW9uIHwgQ2hhbmdlUGFyYW1zUG9zaXRpb24gfCBOb0NoYW5nZVBhcmFtc1Bvc2l0aW9uIHwgSW52b2tlQXBpUG9zaXRpb24gfCBEb250SW52b2tlQXBpUG9zaXRpb24gfFxuICogICAgT2ZmZXJGaWx0ZXJQb3NpdGlvbiB8IE5vQ2hhbmdlT2ZmZXJGaWx0ZXJQb3NpdGlvbiB8IEludm9rZUFwaVBvc2l0aW9uIH0gUG9zaXRpb25cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHt7IHF1ZXN0aW9uOiBIYW5kbGU8J1F1ZXN0aW9uJz4gfSAmIChcbiAqICAgeyBvdXRjb21lOiAnd2luJywgcG9zaXRpb246IFBvc2l0aW9uIH0gfFxuICogICB7IG91dGNvbWU6ICdmYWlsJywgcmVhc29uOiAnTm8gcXVvcnVtJyB9XG4gKiApfSBPdXRjb21lUmVjb3JkXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7eyBxdWVzdGlvbjogSGFuZGxlPCdRdWVzdGlvbic+IH0gJiAoXG4gKiAgeyBvdXRjb21lOiAnd2luJywgcG9zaXRpb25zOiBQb3NpdGlvbltdIH0gfFxuICogIHsgb3V0Y29tZTogJ2ZhaWwnLCByZWFzb246ICdObyBxdW9ydW0nIH1cbiAqICl9IE11bHRpT3V0Y29tZVJlY29yZFxuICovXG5cbi8qKlxuICogU3BlY2lmaWNhdGlvbiB3aGVuIHJlcXVlc3RpbmcgY3JlYXRpb24gb2YgYSBRdWVzdGlvblxuICpcbiAqIEB0ZW1wbGF0ZSB7SXNzdWV9IFtJPUlzc3VlXVxuICogQHR5cGVkZWYge29iamVjdH0gUXVlc3Rpb25TcGVjXG4gKiBAcHJvcGVydHkge0Nob2ljZU1ldGhvZH0gbWV0aG9kXG4gKiBAcHJvcGVydHkge0l9IGlzc3VlXG4gKiBAcHJvcGVydHkge1Bvc2l0aW9uW119IHBvc2l0aW9uc1xuICogQHByb3BlcnR5IHtFbGVjdGlvblR5cGV9IGVsZWN0aW9uVHlwZVxuICogQHByb3BlcnR5IHtudW1iZXJ9IG1heENob2ljZXNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBtYXhXaW5uZXJzXG4gKiBAcHJvcGVydHkge0Nsb3NpbmdSdWxlfSBjbG9zaW5nUnVsZVxuICogQHByb3BlcnR5IHtRdW9ydW1SdWxlfSBxdW9ydW1SdWxlXG4gKiBAcHJvcGVydHkge1Bvc2l0aW9ufSB0aWVPdXRjb21lXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBRdWVzdGlvbkRldGFpbHNFeHRyYVByb3BlcnRpZXNcbiAqIEBwcm9wZXJ0eSB7SW5zdGFuY2V9IGNvdW50ZXJJbnN0YW5jZSAtIGluc3RhbmNlIG9mIHRoZSBWb3RlQ291bnRlclxuICogQHByb3BlcnR5IHtIYW5kbGU8J1F1ZXN0aW9uJz59IHF1ZXN0aW9uSGFuZGxlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7UXVlc3Rpb25TcGVjICYgUXVlc3Rpb25EZXRhaWxzRXh0cmFQcm9wZXJ0aWVzfSBRdWVzdGlvbkRldGFpbHNcbiAqICAgIGNvbXBsZXRlIHF1ZXN0aW9uIGRldGFpbHM6IHF1ZXN0aW9uU3BlYyBwbHVzIGNvdW50ZXIgYW5kIHF1ZXN0aW9uSGFuZGxlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBHb3Zlcm5hbmNlUGFpclxuICogQHByb3BlcnR5IHtJbnN0YW5jZX0gZ292ZXJub3JcbiAqIEBwcm9wZXJ0eSB7SW5zdGFuY2V9IGdvdmVybmVkXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBRdWVzdGlvblxuICogQHByb3BlcnR5IHsoKSA9PiBJbnN0YW5jZX0gZ2V0Vm90ZUNvdW50ZXJcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUXVlc3Rpb25EZXRhaWxzfSBnZXREZXRhaWxzXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBDb21wbGV0ZVVucmFua2VkUXVlc3Rpb25cbiAqIEBwcm9wZXJ0eSB7SGFuZGxlPCdRdWVzdGlvbic+fSBxdWVzdGlvbkhhbmRsZVxuICogQHByb3BlcnR5IHtQb3NpdGlvbltdfSBjaG9zZW4gLSBhIGxpc3Qgb2YgZXF1YWwtd2VpZ2h0IHByZWZlcnJlZCBwb3NpdGlvbnNcbiAqL1xuXG4vKiBub3QgeWV0IGluIHVzZSovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IENvbXBsZXRlV2VpZ2h0ZWRCYWxsb3RcbiAqIEBwcm9wZXJ0eSB7SGFuZGxlPCdRdWVzdGlvbic+fSBxdWVzdGlvbkhhbmRsZVxuICogQHByb3BlcnR5IHtbUG9zaXRpb24sYmlnaW50XVtdfSB3ZWlnaHRlZCAtIGxpc3Qgb2YgcG9zaXRpb25zIHdpdGhcbiAqICAgd2VpZ2h0cy4gVm90ZUNvdW50ZXIgbWF5IGxpbWl0IHdlaWdodHMgdG8gYSByYW5nZSBvciByZXF1aXJlIHVuaXF1ZW5lc3MuXG4gKi9cblxuLyogbm90IHlldCBpbiB1c2UqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBDb21wbGV0ZU9yZGVyZWRCYWxsb3RcbiAqIEBwcm9wZXJ0eSB7SGFuZGxlPCdRdWVzdGlvbic+fSBxdWVzdGlvbkhhbmRsZVxuICogQHByb3BlcnR5IHtQb3NpdGlvbltdfSBvcmRlcmVkIC0gb3JkZXJlZCBsaXN0IG9mIHBvc2l0aW9uIGZyb20gbW9zdCBwcmVmZXJyZWRcbiAqICAgdG8gbGVhc3QgcHJlZmVycmVkXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQb3NpdGlvbkNvdW50XG4gKiBAcHJvcGVydHkge1Bvc2l0aW9ufSBwb3NpdGlvblxuICogQHByb3BlcnR5IHtiaWdpbnR9IHRvdGFsXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBWb3RlU3RhdGlzdGljc1xuICogQHByb3BlcnR5IHtiaWdpbnR9IHNwb2lsZWRcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB2b3Rlc1xuICogQHByb3BlcnR5IHtQb3NpdGlvbkNvdW50W119IHJlc3VsdHNcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFF1b3J1bUNvdW50ZXJcbiAqIEBwcm9wZXJ0eSB7KHN0YXRzOiBWb3RlU3RhdGlzdGljcykgPT4gYm9vbGVhbn0gY2hlY2tcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBCdWlsZFF1ZXN0aW9uXG4gKiBAcGFyYW0ge1F1ZXN0aW9uU3BlY30gcXVlc3Rpb25TcGVjXG4gKiBAcGFyYW0ge0luc3RhbmNlfSBpbnN0YW5jZSAtIHZvdGVDb3VudGVyIGluc3RhbmNlXG4gKiBAcmV0dXJucyB7UXVlc3Rpb259XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBWb3RlQ291bnRlckNyZWF0b3JGYWNldCAtIGEgZmFjZXQgdGhhdCB0aGUgRWxlY3RvcmF0ZSBzaG91bGRcbiAqICAgaG9sZCB0aWdodGx5LiBzdWJtaXRWb3RlKCkgaXMgdGhlIGNvcmUgY2FwYWJpbGl0eSB0aGF0IGFsbG93cyB0aGUgaG9sZGVyIHRvXG4gKiAgIHNwZWNpZnkgdGhlIGlkZW50aXR5IGFuZCBjaG9pY2Ugb2YgYSB2b3Rlci4gVGhlIHZvdGVDb3VudGVyIGlzIG1ha2luZyB0aGF0XG4gKiAgIGF2YWlsYWJsZSB0byB0aGUgRWxlY3RvcmF0ZSwgd2hpY2ggc2hvdWxkIHdyYXAgYW5kIGF0dGVudWF0ZSBpdCBzbyBlYWNoXG4gKiAgIHZvdGVyIGdldHMgb25seSB0aGUgYWJpbGl0eSB0byBjYXN0IHRoZWlyIG93biB2b3RlIGF0IGEgd2VpZ2h0IHNwZWNpZmllZCBieVxuICogICB0aGUgZWxlY3RvcmF0ZS5cbiAqIEBwcm9wZXJ0eSB7U3VibWl0Vm90ZX0gc3VibWl0Vm90ZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gVm90ZUNvdW50ZXJQdWJsaWNGYWNldFxuICogQHByb3BlcnR5IHsoKSA9PiBib29sZWFufSBpc09wZW5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUXVlc3Rpb259IGdldFF1ZXN0aW9uXG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8UG9zaXRpb24+fSBnZXRPdXRjb21lXG4gKiBAcHJvcGVydHkgeygpID0+IFF1ZXN0aW9uRGV0YWlsc30gZ2V0RGV0YWlsc1xuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPFZvdGVTdGF0aXN0aWNzPn0gZ2V0U3RhdHNcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IE11bHRpVm90ZUNvdW50ZXJQdWJsaWNGYWNldFxuICogQHByb3BlcnR5IHsoKSA9PiBib29sZWFufSBpc09wZW5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUXVlc3Rpb259IGdldFF1ZXN0aW9uXG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8UG9zaXRpb25bXT59IGdldE91dGNvbWVcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUXVlc3Rpb25EZXRhaWxzfSBnZXREZXRhaWxzXG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8Vm90ZVN0YXRpc3RpY3M+fSBnZXRTdGF0c1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gVm90ZUNvdW50ZXJDbG9zZUZhY2V0XG4gKiAgIFRFU1QgT05MWTogU2hvdWxkIG5vdCBiZSBhbGxvd2VkIHRvIGVzY2FwZSBmcm9tIGNvbnRyYWN0c1xuICogQHByb3BlcnR5IHsoKSA9PiB2b2lkfSBjbG9zZVZvdGluZ1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gVm90ZUNvdW50ZXJGYWNldHNcbiAqIEBwcm9wZXJ0eSB7Vm90ZUNvdW50ZXJQdWJsaWNGYWNldH0gcHVibGljRmFjZXRcbiAqIEBwcm9wZXJ0eSB7Vm90ZUNvdW50ZXJDcmVhdG9yRmFjZXR9IGNyZWF0b3JGYWNldFxuICogQHByb3BlcnR5IHtWb3RlQ291bnRlckNsb3NlRmFjZXR9IGNsb3NlRmFjZXRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IE11bHRpVm90ZUNvdW50ZXJGYWNldHNcbiAqIEBwcm9wZXJ0eSB7TXVsdGlWb3RlQ291bnRlclB1YmxpY0ZhY2V0fSBwdWJsaWNGYWNldFxuICogQHByb3BlcnR5IHtWb3RlQ291bnRlckNyZWF0b3JGYWNldH0gY3JlYXRvckZhY2V0XG4gKiBAcHJvcGVydHkge1ZvdGVDb3VudGVyQ2xvc2VGYWNldH0gY2xvc2VGYWNldFxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEJ1aWxkVm90ZUNvdW50ZXJcbiAqIEBwYXJhbSB7UXVlc3Rpb25TcGVjfSBxdWVzdGlvblNwZWNcbiAqIEBwYXJhbSB7YmlnaW50fSB0aHJlc2hvbGQgLSBxdWVzdGlvblNwZWMgaW5jbHVkZXMgcXVvcnVtUnVsZTsgdGhlIGVsZWN0b3JhdGVcbiAqICAgIGNvbnZlcnRzIHRoYXQgdG8gYSBudW1iZXIgdGhhdCB0aGUgY291bnRlciBjYW4gZW5mb3JjZS5cbiAqIEBwYXJhbSB7SW5zdGFuY2V9IGluc3RhbmNlXG4gKiBAcGFyYW0ge0VSZWY8UHVibGlzaGVyPE91dGNvbWVSZWNvcmQ+Pn0gcHVibGlzaGVyXG4gKiBAcmV0dXJucyB7Vm90ZUNvdW50ZXJGYWNldHN9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQnVpbGRNdWx0aVZvdGVDb3VudGVyXG4gKiBAcGFyYW0ge1F1ZXN0aW9uU3BlY30gcXVlc3Rpb25TcGVjXG4gKiBAcGFyYW0ge2JpZ2ludH0gdGhyZXNob2xkIC0gcXVlc3Rpb25TcGVjIGluY2x1ZGVzIHF1b3J1bVJ1bGU7IHRoZSBlbGVjdG9yYXRlXG4gKiAgICBjb252ZXJ0cyB0aGF0IHRvIGEgbnVtYmVyIHRoYXQgdGhlIGNvdW50ZXIgY2FuIGVuZm9yY2UuXG4gKiBAcGFyYW0ge0luc3RhbmNlfSBpbnN0YW5jZVxuICogQHBhcmFtIHtFUmVmPFB1Ymxpc2hlcjxNdWx0aU91dGNvbWVSZWNvcmQ+Pn0gcHVibGlzaGVyXG4gKiBAcmV0dXJucyB7TXVsdGlWb3RlQ291bnRlckZhY2V0c31cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IENvbXBsZXRlZEJhbGxldFxuICogQHByb3BlcnR5IHtQb3NpdGlvbn0gY2hvc2VuXG4gKiBAcHJvcGVydHkge2JpZ2ludH0gc2hhcmVzXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgU3VibWl0Vm90ZVxuICogQHBhcmFtIHtIYW5kbGU8J1ZvdGVyJz59IHZvdGVySGFuZGxlXG4gKiBAcGFyYW0ge1Bvc2l0aW9uW119IGNob3NlblBvc2l0aW9uc1xuICogQHBhcmFtIHtiaWdpbnQ9fSB3ZWlnaHRcbiAqIEByZXR1cm5zIHtDb21wbGV0ZWRCYWxsZXR9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgR2V0T3BlblF1ZXN0aW9uc1xuICogQHJldHVybnMge1Byb21pc2U8SGFuZGxlPCdRdWVzdGlvbic+W10+fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEdldFF1ZXN0aW9uXG4gKiBAcGFyYW0ge0hhbmRsZTwnUXVlc3Rpb24nPn0gaFxuICogQHJldHVybnMge1Byb21pc2U8UXVlc3Rpb24+fVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRWxlY3RvcmF0ZVB1YmxpY1xuICogQHByb3BlcnR5IHsoKSA9PiBTdWJzY3JpYmVyPFF1ZXN0aW9uRGV0YWlscz59IGdldFF1ZXN0aW9uU3Vic2NyaWJlclxuICogQHByb3BlcnR5IHtHZXRPcGVuUXVlc3Rpb25zfSBnZXRPcGVuUXVlc3Rpb25zLFxuICogQHByb3BlcnR5IHsoKSA9PiBJbnN0YW5jZX0gZ2V0SW5zdGFuY2VcbiAqIEBwcm9wZXJ0eSB7R2V0UXVlc3Rpb259IGdldFF1ZXN0aW9uXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7IEVsZWN0b3JhdGVQdWJsaWMgJiB7bWFrZVZvdGVySW52aXRhdGlvbjogKCkgPT4gRVJlZjxJbnZpdGF0aW9uPn0gfSBDbGFpbXNFbGVjdG9yYXRlUHVibGljXG4gKiBAdHlwZWRlZiB7IEVsZWN0b3JhdGVQdWJsaWMgJiB7Z2V0TmFtZTogKCkgPT4gc3RyaW5nfSB9IENvbW1pdHRlZUVsZWN0b3JhdGVQdWJsaWNcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBvc2VyRmFjZXRcbiAqIEBwcm9wZXJ0eSB7QWRkUXVlc3Rpb259IGFkZFF1ZXN0aW9uXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBFbGVjdG9yYXRlQ3JlYXRvckZhY2V0XG4gKiBAcHJvcGVydHkge0FkZFF1ZXN0aW9ufSBhZGRRdWVzdGlvbiBjYW4gYmUgdXNlZCBkaXJlY3RseSB3aGVuIHRoZSBjcmVhdG9yIGRvZXNuJ3QgbmVlZCBhbnlcbiAqICByZWFzc3VyYW5jZS4gV2hlbiBzb21lb25lIG5lZWRzIHRvIGNvbm5lY3QgYWRkUXVlc3Rpb24gdG8gdGhlIEVsZWN0b3JhdGVcbiAqICBpbnN0YW5jZSwgZ2V0UG9zZXJJbnZpdGF0aW9uKCkgbGV0cyB0aGVtIGdldCBhZGRRdWVzdGlvbiB3aXRoIGFzc3VyYW5jZS5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxJbnZpdGF0aW9uPn0gZ2V0UG9zZXJJbnZpdGF0aW9uXG4gKiBAcHJvcGVydHkgeygpID0+IFN1YnNjcmliZXI8UXVlc3Rpb25EZXRhaWxzPn0gZ2V0UXVlc3Rpb25TdWJzY3JpYmVyXG4gKiBAcHJvcGVydHkgeygpID0+IEVsZWN0b3JhdGVQdWJsaWN9IGdldFB1YmxpY0ZhY2V0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBHZXRWb3Rlckludml0YXRpb25zXG4gKiBAcHJvcGVydHkgeygpID0+IEludml0YXRpb25bXX0gZ2V0Vm90ZXJJbnZpdGF0aW9uc1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gVm90ZXJGYWNldCAtIGEgZmFjZXQgdGhhdCB0aGUgRWxlY3RvcmF0ZSBzaG91bGQgaG9sZFxuICogICB0aWdodGx5LiBJdCBhbGxvd3Mgc3BlY2lmaWNhdGlvbiBvZiB0aGUgdm90ZSdzIHdlaWdodCwgc28gdGhlIEVsZWN0b3JhdGVcbiAqICAgc2hvdWxkIGRpc3RyaWJ1dGUgYW4gYXR0ZW51YXRlZCB3cmFwcGVyIHRoYXQgZG9lc24ndCBtYWtlIHRoYXQgYXZhaWxhYmxlIVxuICogQHByb3BlcnR5IHtTdWJtaXRWb3RlfSBzdWJtaXRWb3RlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBDbG9zaW5nUnVsZVxuICogQHByb3BlcnR5IHtFUmVmPFRpbWVyPn0gdGltZXJcbiAqIEBwcm9wZXJ0eSB7VGltZXN0YW1wfSBkZWFkbGluZVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIENsb3NlVm90aW5nXG4gKiBAcGFyYW0ge0Nsb3NpbmdSdWxlfSBjbG9zaW5nUnVsZVxuICogQHBhcmFtIHsoKSA9PiB2b2lkfSBjbG9zZVZvdGluZ1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQWRkUXVlc3Rpb25SZXR1cm5cbiAqIEBwcm9wZXJ0eSB7Vm90ZUNvdW50ZXJQdWJsaWNGYWNldH0gcHVibGljRmFjZXRcbiAqIEBwcm9wZXJ0eSB7Vm90ZUNvdW50ZXJDcmVhdG9yRmFjZXR9IGNyZWF0b3JGYWNldFxuICogQHByb3BlcnR5IHtYaW1wb3J0KCdAYWdvcmljL3pvZS9zcmMvem9lU2VydmljZS91dGlscy5qcycpLkluc3RhbmNlPHR5cGVvZiBYaW1wb3J0KCcuL2JpbmFyeVZvdGVDb3VudGVyLmpzJykuc3RhcnQ+fSBpbnN0YW5jZVxuICogQHByb3BlcnR5IHtUaW1lc3RhbXB9IGRlYWRsaW5lXG4gKiBAcHJvcGVydHkge0hhbmRsZTwnUXVlc3Rpb24nPn0gcXVlc3Rpb25IYW5kbGVcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBBZGRRdWVzdGlvblxuICogQHBhcmFtIHtFUmVmPEluc3RhbGxhdGlvbj59IHZvdGVDb3VudGVyXG4gKiBAcGFyYW0ge1F1ZXN0aW9uU3BlY30gcXVlc3Rpb25TcGVjXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxBZGRRdWVzdGlvblJldHVybj59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQ3JlYXRlUXVlc3Rpb25cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIgdG8gY2hhbmdlXG4gKiBAcGFyYW0ge1BhcmFtVmFsdWV9IHByb3Bvc2VkVmFsdWUgLSB0aGUgcHJvcG9zZWQgdmFsdWUgZm9yIHRoZSBuYW1lZFxuICogICBwYXJhbWV0ZXJcbiAqIEBwYXJhbSB7SW5zdGFsbGF0aW9ufSB2b3RlQ291bnRlckluc3RhbGxhdGlvbiAtIHRoZSB2b3RlQ291bnRlciB0b1xuICogICBpbnN0YW50aWF0ZSB0byBjb3VudCB2b3Rlcy4gRXhwZWN0ZWQgdG8gYmUgYSBiaW5hcnlWb3RlQ291bnRlci4gT3RoZXJcbiAqICAgdm90ZUNvdW50ZXJzIG1pZ2h0IGJlIGFkZGVkIGhlcmUsIG9yIG1pZ2h0IHJlcXVpcmUgc2VwYXJhdGUgZ292ZXJub3JzLlxuICogICB1bmRlciBtYW5hZ2VtZW50IHNvIHVzZXJzIGNhbiB0cmFjZSBpdCBiYWNrIGFuZCBzZWUgdGhhdCBpdCB3b3VsZCB1c2VcbiAqICAgdGhpcyBlbGVjdGlvbk1hbmFnZXIgdG8gbWFuYWdlIHBhcmFtZXRlcnNcbiAqIEBwYXJhbSB7SW5zdGFuY2V9IGNvbnRyYWN0SW5zdGFuY2UgLSBpbmNsdWRlIHRoZSBpbnN0YW5jZSBvZiB0aGUgY29udHJhY3RcbiAqIEBwYXJhbSB7Q2xvc2luZ1J1bGV9IGNsb3NpbmdSdWxlIC0gZGVhZGxpbmUgYW5kIHRpbWVyIGZvciBjbG9zaW5nIHZvdGluZ1xuICogQHJldHVybnMge1Byb21pc2U8UXVlc3Rpb25EZXRhaWxzPn1cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBbUD1TdGFuZGFyZFBhcmFtUGF0aF0gcGF0aCBmb3IgYSBwYXJhbU1hbmFnZXJSZXRyaWV2ZXJcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBhcmFtQ2hhbmdlSXNzdWVcbiAqIEBwcm9wZXJ0eSB7UGFyYW1DaGFuZ2VzU3BlYzxQPn0gc3BlY1xuICogQHByb3BlcnR5IHtYaW1wb3J0KCdAYWdvcmljL3pvZS9zcmMvem9lU2VydmljZS91dGlscy5qcycpLkluc3RhbmNlPCh6Y2Y6IFpDRjxHb3Zlcm5hbmNlVGVybXM8e30+PikgPT4ge30+fSBjb250cmFjdFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQXBpSW52b2NhdGlvbklzc3VlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYXBpTWV0aG9kTmFtZVxuICogQHByb3BlcnR5IHt1bmtub3duW119IG1ldGhvZEFyZ3NcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IE9mZmVyRmlsdGVySXNzdWVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IHN0cmluZ3NcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBhcmFtQ2hhbmdlUG9zaXRpb25zXG4gKiBAcHJvcGVydHkge0NoYW5nZVBhcmFtc1Bvc2l0aW9ufSBwb3NpdGl2ZVxuICogQHByb3BlcnR5IHtOb0NoYW5nZVBhcmFtc1Bvc2l0aW9ufSBuZWdhdGl2ZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUGFyYW1DaGFuZ2VJc3N1ZURldGFpbHNcbiAqICAgIGRldGFpbHMgZm9yIGEgcXVlc3Rpb24gdGhhdCBjYW4gY2hhbmdlIGEgY29udHJhY3QgcGFyYW1ldGVyXG4gKiBAcHJvcGVydHkge0Nob2ljZU1ldGhvZH0gbWV0aG9kXG4gKiBAcHJvcGVydHkge1BhcmFtQ2hhbmdlSXNzdWU8dW5rbm93bj59IGlzc3VlXG4gKiBAcHJvcGVydHkge1BhcmFtQ2hhbmdlUG9zaXRpb25zfSBwb3NpdGlvbnNcbiAqIEBwcm9wZXJ0eSB7RWxlY3Rpb25UeXBlfSBlbGVjdGlvblR5cGVcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBtYXhDaG9pY2VzXG4gKiBAcHJvcGVydHkge0Nsb3NpbmdSdWxlfSBjbG9zaW5nUnVsZVxuICogQHByb3BlcnR5IHtRdW9ydW1SdWxlfSBxdW9ydW1SdWxlXG4gKiBAcHJvcGVydHkge05vQ2hhbmdlUGFyYW1zUG9zaXRpb259IHRpZU91dGNvbWVcbiAqIEBwcm9wZXJ0eSB7SW5zdGFuY2V9IGNvdW50ZXJJbnN0YW5jZSAtIGluc3RhbmNlIG9mIHRoZSBWb3RlQ291bnRlclxuICogQHByb3BlcnR5IHtIYW5kbGU8J1F1ZXN0aW9uJz59IHF1ZXN0aW9uSGFuZGxlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7UmVjb3JkPEtleXdvcmQsIFBhcmFtVmFsdWVUeXBlZD59IFBhcmFtU3RhdGVSZWNvcmQgYSBSZWNvcmQgY29udGFpbmluZ1xuICogICBrZXl3b3JkIHBhaXJzIHdpdGggZGVzY3JpcHRpb25zIG9mIHBhcmFtZXRlcnMgdW5kZXIgZ292ZXJuYW5jZS5cbiAqL1xuXG4vKiogQHR5cGVkZWYge3tjdXJyZW50OiBQYXJhbVN0YXRlUmVjb3JkfX0gR292ZXJuYW5jZVN1YnNjcmlwdGlvblN0YXRlICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUGFyYW1NYW5hZ2VyQmFzZSBUaGUgYmFzZSBwYXJhbU1hbmFnZXIgd2l0aCB0eXBlZCBnZXR0ZXJzXG4gKiBAcHJvcGVydHkgeygpID0+IFBhcmFtU3RhdGVSZWNvcmR9IGdldFBhcmFtc1xuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nKSA9PiBBbW91bnR9IGdldEFtb3VudFxuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nKSA9PiBCcmFuZH0gZ2V0QnJhbmRcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZykgPT4gSW5zdGFuY2V9IGdldEluc3RhbmNlXG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcpID0+IEluc3RhbGxhdGlvbn0gZ2V0SW5zdGFsbGF0aW9uXG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcpID0+IEFtb3VudDwnc2V0Jz59IGdldEludml0YXRpb25BbW91bnRcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZykgPT4gYmlnaW50fSBnZXROYXRcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZykgPT4gUmF0aW99IGdldFJhdGlvXG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcpID0+IHN0cmluZ30gZ2V0U3RyaW5nXG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcpID0+IGFueX0gZ2V0VW5rbm93blxuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nLCBwcm9wb3NlZFZhbHVlOiBQYXJhbVZhbHVlKSA9PiBQYXJhbVZhbHVlfSBnZXRWaXNpYmxlVmFsdWUgLSBmb3JcbiAqICAgbW9zdCB0eXBlcywgdGhlIHZpc2libGUgdmFsdWUgaXMgdGhlIHNhbWUgYXMgcHJvcG9zZWRWYWx1ZS4gRm9yIEludml0YXRpb25zXG4gKiAgIHRoZSB2aXNpYmxlIHZhbHVlIGlzIHRoZSBhbW91bnQgb2YgdGhlIGludml0YXRpb24uXG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcpID0+IFByb21pc2U8SW52aXRhdGlvbj59IGdldEludGVybmFsUGFyYW1WYWx1ZVxuICogQHByb3BlcnR5IHsoKSA9PiBTdG9yZWRTdWJzY3JpcHRpb248R292ZXJuYW5jZVN1YnNjcmlwdGlvblN0YXRlPn0gZ2V0U3Vic2NyaXB0aW9uXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgVXBkYXRlUGFyYW1zXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsUGFyYW1WYWx1ZT59IHBhcmFtQ2hhbmdlc1xuICovXG5cbi8qKlxuICogVGhlc2UgYXJlIHR5cGVkIGBhbnlgIGJlY2F1c2UgdGhlIGJ1aWxkZXIgcGF0dGVybiBvZiBwYXJhbU1hbmFnZXIgbWFrZXMgaXQgdmVyeVxuICogY29tcGxpY2F0ZWQgZm9yIHRoZSB0eXBlIHN5c3RlbSB0byBrbm93IHRoZSBzZXQgb2YgcGFyYW0tc3BlY2lmaWMgZnVuY3Rpb25zXG4gKiByZXR1cm5lZCBieSBgLmJ1aWxkKClgLiBJbnN0ZWFkIHdlIGxldCBwYXJhbU1hbmFnZXIgY3JlYXRlIHRoZSBkZXNpcmVkIG1ldGhvZHNcbiAqIGFuZCB1c2UgdHlwZWRQYXJhbU1hbmFnZXIgdG8gY3JlYXRlIGEgdmVyc2lvbiB0aGF0IGluY2x1ZGVzIHRoZSBzdGF0aWMgdHlwZXMuXG4gKlxuICogQHR5cGVkZWYge1JlY29yZDxzdHJpbmcsIGFueT59IFBhcmFtTWFuYWdlckdldHRlcnNBbmRVcGRhdGVyc1xuICogQHR5cGVkZWYge1BhcmFtTWFuYWdlckJhc2UgJiBQYXJhbU1hbmFnZXJHZXR0ZXJzQW5kVXBkYXRlcnMgJiB7dXBkYXRlUGFyYW1zOiBVcGRhdGVQYXJhbXN9fSBBbnlQYXJhbU1hbmFnZXJcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT59IFBhcmFtZXRlck5hbWVMaXN0XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0UGFyYW1NYW5hZ2VyVHlwZVxuICogQHBhcmFtIHtQYXJhbVR5cGV9IHR5cGVcbiAqIEBwYXJhbSB7UGFyYW1WYWx1ZX0gdmFsdWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQnVpbGRQYXJhbU1hbmFnZXIgLSBQYXJhbU1hbmFnZXIgaXMgYSBmYWNpbGl0eSB0aGF0IGdvdmVybmVkXG4gKiAgIGNvbnRyYWN0cyBjYW4gdXNlIHRvIG1hbmFnZSB0aGVpciB2aXNpYmxlIHN0YXRlIGluIGEgd2F5IHRoYXQgYWxsb3dzIHRoZVxuICogICBDb250cmFjdEdvdmVybm9yIHRvIHVwZGF0ZSB2YWx1ZXMgdXNpbmcgZ292ZXJuYW5jZS4gV2hlbiBwYXJhbU1hbmFnZXIgaXNcbiAqICAgaW5zdGFudGlhdGVkIGluc2lkZSB0aGUgY29udHJhY3QsIHRoZSBjb250cmFjdCBoYXMgc3luY2hyb25vdXMgYWNjZXNzIHRvXG4gKiAgIHRoZSB2YWx1ZXMsIGFuZCBjbGllbnRzIG9mIHRoZSBjb250cmFjdCBjYW4gdmVyaWZ5IHRoYXQgYSBDb250cmFjdEdvdmVybm9yXG4gKiAgIGNhbiBjaGFuZ2UgdGhlIHZhbHVlcyBpbiBhIGxlZ2libGUgd2F5LlxuICogQHBhcmFtIHtJdGVyYWJsZTxQYXJhbVZhbHVlVHlwZWQ+fSBwYXJhbURlc2NyaXB0aW9uc1xuICogQHJldHVybnMge0FueVBhcmFtTWFuYWdlcn1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IENoYW5nZVBhcmFtc1Bvc2l0aW9uXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsUGFyYW1WYWx1ZT59IGNoYW5nZXMgb25lIG9yIG1vcmUgY2hhbmdlcyB0byBwYXJhbWV0ZXJzXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBPZmZlckZpbHRlclBvc2l0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBzdHJpbmdzXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBOb0NoYW5nZU9mZmVyRmlsdGVyUG9zaXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IGRvbnRVcGRhdGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEludm9rZUFwaVBvc2l0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYXBpTWV0aG9kTmFtZVxuICogQHByb3BlcnR5IHt1bmtub3duW119IG1ldGhvZEFyZ3NcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IERvbnRJbnZva2VBcGlQb3NpdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRvbnRJbnZva2VcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IE5vQ2hhbmdlUGFyYW1zUG9zaXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IG5vQ2hhbmdlIFBhcmFtZXRlcnMgaW4gdGhlIHByb3Bvc2FsIHRoYXQgdGhpcyBwb3NpdGlvblxuICogICBpcyBvcHBvc2VkIHRvXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBHb3Zlcm5vclxuICogQHByb3BlcnR5IHtDcmVhdGVRdWVzdGlvbn0gY3JlYXRlUXVlc3Rpb25cbiAqL1xuXG4vKiogQHR5cGVkZWYge3sgW21ldGhvZE5hbWU6IHN0cmluZ106ICguLi5hcmdzOiBhbnkpID0+IHVua25vd24gfX0gR292ZXJuZWRBcGlzICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHt7fX0gQ0ZcbiAqIEB0eXBlZGVmIHtHb3Zlcm5lZENyZWF0b3JGYWNldDxDRj4gJiB7XG4gKiBnZXRHb3Zlcm5lZEFwaXM6ICgpID0+IEVSZWY8R292ZXJuZWRBcGlzPjtcbiAqIGdldEdvdmVybmVkQXBpTmFtZXM6ICgpID0+IChzdHJpbmcgfCBzeW1ib2wpW107XG4gKiBzZXRPZmZlckZpbHRlcjogKHN0cmluZ3M6IHN0cmluZ1tdKSA9PiB2b2lkO1xuICogfX0gR292ZXJub3JGYWNldFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gR292ZXJub3JQdWJsaWNcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxJbnN0YW5jZT59IGdldEVsZWN0b3JhdGVcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gSW5zdGFuY2V9IGdldEdvdmVybmVkQ29udHJhY3RcbiAqIEBwcm9wZXJ0eSB7KHZvdGVDb3VudGVyOiBJbnN0YW5jZSkgPT4gUHJvbWlzZTxib29sZWFuPn0gdmFsaWRhdGVWb3RlQ291bnRlclxuICogQHByb3BlcnR5IHsocmVnUDogRVJlZjxJbnN0YW5jZT4pID0+IFByb21pc2U8Ym9vbGVhbj59IHZhbGlkYXRlRWxlY3RvcmF0ZVxuICogQHByb3BlcnR5IHsoY2xvc2luZ1J1bGU6IENsb3NpbmdSdWxlKSA9PiBib29sZWFufSB2YWxpZGF0ZVRpbWVyXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQYXJhbUtleSBpZGVudGlmaWVyIGZvciBhIHBhcmFtTWFuYWdlciB3aXRoaW4gYSBjb250cmFjdFxuICogQHByb3BlcnR5IHtzdHJpbmd9IGtleVxuICovXG5cbi8qKlxuICogRGVzY3JpcHRpb24gb2YgYSBzZXQgb2YgY29vcmRpbmF0ZWQgY2hhbmdlcyBmb3IgYSBQYXJhbU1hbmFnZXJcbiAqXG4gKiBAdGVtcGxhdGUgUCBwYXRoIGZvciBhIHBhcmFtTWFuYWdlclJldHJpZXZlclxuICogQHR5cGVkZWYge29iamVjdH0gUGFyYW1DaGFuZ2VzU3BlYzxQPlxuICogQHByb3BlcnR5IHtQfSBwYXJhbVBhdGhcbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgUGFyYW1WYWx1ZT59IGNoYW5nZXMgb25lIG9yIG1vcmUgY2hhbmdlcyB0byBwYXJhbWV0ZXJzXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBDb250cmFjdEdvdmVybmFuY2VWb3RlUmVzdWx0XG4gKiBAcHJvcGVydHkge0luc3RhbmNlfSBpbnN0YW5jZSAtIGluc3RhbmNlIG9mIHRoZSBWb3RlQ291bnRlclxuICogQHByb3BlcnR5IHtFUmVmPFF1ZXN0aW9uRGV0YWlscz59IGRldGFpbHNcbiAqIEBwcm9wZXJ0eSB7UHJvbWlzZTxQYXJhbVZhbHVlPn0gb3V0Y29tZU9mVXBkYXRlIC0gQSBwcm9taXNlIGZvciB0aGUgcmVzdWx0XG4gKiAgICBvZiB1cGRhdGluZyB0aGUgcGFyYW1ldGVyIHZhbHVlLiBQcmltYXJpbHkgdXNlZnVsIGZvciBpdHMgYmVoYXZpb3Igb25cbiAqICAgIHJlamVjdGlvbi5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7e319IENGXG4gKiBAdHlwZWRlZiB7Q0Z9IExpbWl0ZWRDcmVhdG9yRmFjZXRcbiAqXG4gKiBUaGUgY3JlYXRvckZhY2V0IGZvciB0aGUgZ292ZXJuZWQgY29udHJhY3QgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byB0aGVcbiAqIHJlc3BvbnNpYmxlIHBhcnR5LiBJdCBkb2VzIG5vdCBoYXZlIGFjY2VzcyB0byB0aGUgcGFyYW1NYW5hZ2VyLlxuICogQHByb3BlcnR5IHsoKSA9PiBJbnN0YW5jZX0gZ2V0Q29udHJhY3RHb3Zlcm5vclxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHt7fX0gUEYgUHVibGljIGZhY2V0IG9mIGdvdmVybmVkIGNvbnRyYWN0XG4gKiBAdGVtcGxhdGUge3t9fSBDRiBDcmVhdG9yIGZhY2V0IG9mIGdvdmVybmVkIGNvbnRyYWN0XG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBHb3Zlcm5lZENvbnRyYWN0RmFjZXRBY2Nlc3NcbiAqIEBwcm9wZXJ0eSB7Vm90ZU9uUGFyYW1DaGFuZ2VzfSB2b3RlT25QYXJhbUNoYW5nZXNcbiAqIEBwcm9wZXJ0eSB7Vm90ZU9uQXBpSW52b2NhdGlvbn0gdm90ZU9uQXBpSW52b2NhdGlvblxuICogQHByb3BlcnR5IHtWb3RlT25PZmZlckZpbHRlcn0gdm90ZU9uT2ZmZXJGaWx0ZXJcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxMaW1pdGVkQ3JlYXRvckZhY2V0PENGPj59IGdldENyZWF0b3JGYWNldCAtIGNyZWF0b3JcbiAqICAgZmFjZXQgb2YgdGhlIGdvdmVybmVkIGNvbnRyYWN0LCB3aXRob3V0IHRoZSB0aWdodGx5IGhlbGQgYWJpbGl0eSB0byBjaGFuZ2VcbiAqICAgcGFyYW0gdmFsdWVzLlxuICogQHByb3BlcnR5IHsocG9zZXJJbnZpdGF0aW9uOiBJbnZpdGF0aW9uKSA9PiBQcm9taXNlPHZvaWQ+fSByZXBsYWNlRWxlY3RvcmF0ZVxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPEFkbWluRmFjZXQ+fSBnZXRBZG1pbkZhY2V0XG4gKiBAcHJvcGVydHkgeygpID0+IEdvdmVybmVkUHVibGljRmFjZXQ8UEY+fSBnZXRQdWJsaWNGYWNldCAtIHB1YmxpYyBmYWNldCBvZiB0aGUgZ292ZXJuZWQgY29udHJhY3RcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gSW5zdGFuY2V9IGdldEluc3RhbmNlIC0gaW5zdGFuY2Ugb2YgdGhlIGdvdmVybmVkXG4gKiAgIGNvbnRyYWN0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBHb3Zlcm5lZFB1YmxpY0ZhY2V0TWV0aG9kc1xuICogQHByb3BlcnR5IHsoKSA9PiBTdG9yZWRTdWJzY3JpcHRpb248R292ZXJuYW5jZVN1YnNjcmlwdGlvblN0YXRlPn0gZ2V0U3Vic2NyaXB0aW9uXG4gKiBAcHJvcGVydHkgeygpID0+IEluc3RhbmNlfSBnZXRDb250cmFjdEdvdmVybm9yXG4gKiBAcHJvcGVydHkgeygpID0+IFBhcmFtU3RhdGVSZWNvcmR9IGdldEdvdmVybmVkUGFyYW1zIC0gZ2V0IGRlc2NyaXB0aW9ucyBvZlxuICogICBhbGwgdGhlIGdvdmVybmVkIHBhcmFtZXRlcnNcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZykgPT4gQW1vdW50fSBnZXRBbW91bnRcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZykgPT4gQnJhbmR9IGdldEJyYW5kXG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcpID0+IEluc3RhbmNlfSBnZXRJbnN0YW5jZVxuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nKSA9PiBJbnN0YWxsYXRpb259IGdldEluc3RhbGxhdGlvblxuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nKSA9PiBBbW91bnR9IGdldEludml0YXRpb25BbW91bnRcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZykgPT4gYmlnaW50fSBnZXROYXRcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZykgPT4gUmF0aW99IGdldFJhdGlvXG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcpID0+IHN0cmluZ30gZ2V0U3RyaW5nXG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcpID0+IGFueX0gZ2V0VW5rbm93blxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtvYmplY3R9IFBGIFB1YmxpYyBmYWNldFxuICogQHR5cGVkZWYge1BGICYgR292ZXJuZWRQdWJsaWNGYWNldE1ldGhvZHN9IEdvdmVybmVkUHVibGljRmFjZXRcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7e319IENGIGNyZWF0b3IgZmFjZXRcbiAqIEB0eXBlZGVmIEdvdmVybmVkQ3JlYXRvckZhY2V0XG4gKiBAcHJvcGVydHkgeygpID0+IFBhcmFtTWFuYWdlclJldHJpZXZlcn0gZ2V0UGFyYW1NZ3JSZXRyaWV2ZXIgLSBhbGxvd3MgYWNjZXNzaW5nXG4gKiAgIGFuZCB1cGRhdGluZyBnb3Zlcm5lZCBwYXJhbWV0ZXJzLiBTaG91bGQgb25seSBiZSBkaXJlY3RseSBhY2Nlc3NpYmxlIHRvIHRoZVxuICogICBjb250cmFjdEdvdmVybm9yXG4gKiBAcHJvcGVydHkgeygpID0+IExpbWl0ZWRDcmVhdG9yRmFjZXQ8Q0Y+fSBnZXRMaW1pdGVkQ3JlYXRvckZhY2V0IC0gdGhlIGNyZWF0b3JcbiAqICAgZmFjZXQgb2YgdGhlIGdvdmVybmVkIGNvbnRyYWN0LiBEb2Vzbid0IHByb3ZpZGUgYWNjZXNzIHRvIGFueSBnb3Zlcm5hbmNlXG4gKiAgIGZ1bmN0aW9uYWxpdHlcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZykgPT4gUHJvbWlzZTxJbnZpdGF0aW9uPn0gZ2V0SW52aXRhdGlvblxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFdyYXBQdWJsaWNGYWNldFxuICogQHBhcmFtIHtUfSBvcmlnaW5hbFB1YmxpY0ZhY2V0XG4gKiBAcmV0dXJucyB7VCAmIEdvdmVybmVkUHVibGljRmFjZXR9XG4gKiBAdGVtcGxhdGUgVFxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFdyYXBDcmVhdG9yRmFjZXRcbiAqIEBwYXJhbSB7VH0gb3JpZ2luYWxDcmVhdG9yRmFjZXRcbiAqIEByZXR1cm5zIHtHb3Zlcm5lZENyZWF0b3JGYWNldDxUPn1cbiAqIEB0ZW1wbGF0ZSBUXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7e2tleTogc3RyaW5nfX0gU3RhbmRhcmRQYXJhbVBhdGhcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBhcmFtTWFuYWdlclJldHJpZXZlclxuICogQHByb3BlcnR5IHsocGFyYW1LZXk/OiBQYXJhbUtleSkgPT4gQW55UGFyYW1NYW5hZ2VyfSBnZXRcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBbUD1TdGFuZGFyZFBhcmFtUGF0aF1cbiAqXG4gKiBAY2FsbGJhY2sgVm90ZU9uUGFyYW1DaGFuZ2VzXG4gKiBAcGFyYW0ge0luc3RhbGxhdGlvbn0gdm90ZUNvdW50ZXJJbnN0YWxsYXRpb25cbiAqIEBwYXJhbSB7VGltZXN0YW1wfSBkZWFkbGluZVxuICogQHBhcmFtIHtQYXJhbUNoYW5nZXNTcGVjPFA+fSBwYXJhbVNwZWNcbiAqIEByZXR1cm5zIHtDb250cmFjdEdvdmVybmFuY2VWb3RlUmVzdWx0fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFZvdGVPbkFwaUludm9jYXRpb25cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcGlNZXRob2ROYW1lXG4gKiBAcGFyYW0ge3Vua25vd25bXX0gbWV0aG9kQXJnc1xuICogQHBhcmFtIHtJbnN0YWxsYXRpb259IHZvdGVDb3VudGVySW5zdGFsbGF0aW9uXG4gKiBAcGFyYW0ge1RpbWVzdGFtcH0gZGVhZGxpbmVcbiAqIEByZXR1cm5zIHtDb250cmFjdEdvdmVybmFuY2VWb3RlUmVzdWx0fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFZvdGVPbk9mZmVyRmlsdGVyXG4gKiBAcGFyYW0ge0luc3RhbGxhdGlvbn0gdm90ZUNvdW50ZXJJbnN0YWxsYXRpb25cbiAqIEBwYXJhbSB7VGltZXN0YW1wfSBkZWFkbGluZVxuICogQHBhcmFtIHtzdHJpbmdbXX0gc3RyaW5nc1xuICogQHJldHVybnMge0NvbnRyYWN0R292ZXJuYW5jZVZvdGVSZXN1bHR9XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQYXJhbUdvdmVybm9yXG4gKiBAcHJvcGVydHkge1ZvdGVPblBhcmFtQ2hhbmdlc30gdm90ZU9uUGFyYW1DaGFuZ2VzXG4gKiBAcHJvcGVydHkge0NyZWF0ZWRRdWVzdGlvbn0gY3JlYXRlZFF1ZXN0aW9uXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBBcGlHb3Zlcm5vclxuICogQHByb3BlcnR5IHtWb3RlT25BcGlJbnZvY2F0aW9ufSB2b3RlT25BcGlJbnZvY2F0aW9uXG4gKiBAcHJvcGVydHkge0NyZWF0ZWRRdWVzdGlvbn0gY3JlYXRlZFF1ZXN0aW9uXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBGaWx0ZXJHb3Zlcm5vclxuICogQHByb3BlcnR5IHtWb3RlT25PZmZlckZpbHRlcn0gdm90ZU9uRmlsdGVyXG4gKiBAcHJvcGVydHkge0NyZWF0ZWRRdWVzdGlvbn0gY3JlYXRlZEZpbHRlclF1ZXN0aW9uXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgU2V0dXBHb3Zlcm5hbmNlXG4gKiBAcGFyYW0ge0VSZWY8Wm9lU2VydmljZT59IHpvZVxuICogQHBhcmFtIHtFUmVmPFBhcmFtTWFuYWdlclJldHJpZXZlcj59IHBhcmFtTWFuYWdlclJldHJpZXZlclxuICogQHBhcmFtIHtJbnN0YW5jZX0gY29udHJhY3RJbnN0YW5jZVxuICogQHBhcmFtIHtUaW1lclNlcnZpY2V9IHRpbWVyXG4gKiBAcGFyYW0geygpID0+IFByb21pc2U8UG9zZXJGYWNldD59IGdldFVwZGF0ZWRQb3NlckZhY2V0XG4gKiBAcmV0dXJucyB7UGFyYW1Hb3Zlcm5vcn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBDcmVhdGVkUXVlc3Rpb25cbiAqICAgV2FzIHRoaXMgcXVlc3Rpb24gY3JlYXRlZCBieSB0aGlzIENvbnRyYWN0R292ZXJub3I/XG4gKiBAcGFyYW0ge0luc3RhbmNlfSBxdWVzdGlvbkluc3RhbmNlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBQb3NpdGlvbkluY2x1ZGVkXG4gKiBAcGFyYW0ge1Bvc2l0aW9uW119IHBvc2l0aW9uc1xuICogQHBhcmFtIHtQb3NpdGlvbn0gcG9zaXRpb25cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gR292ZXJuZWRDb250cmFjdFRlcm1zXG4gKiBAcHJvcGVydHkge1RpbWVyU2VydmljZX0gdGltZXJcbiAqIEBwcm9wZXJ0eSB7SXNzdWVyS2V5d29yZFJlY29yZH0gaXNzdWVyS2V5d29yZFJlY29yZFxuICogQHByb3BlcnR5IHtvYmplY3R9IHByaXZhdGVBcmdzXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0Q29udHJhY3RHb3Zlcm5hbmNlXG4gKlxuICogQHBhcmFtIHtFUmVmPFpvZVNlcnZpY2U+fSB6b2VcbiAqIEBwYXJhbSB7WGltcG9ydCgnQGFnb3JpYy96b2Uvc3JjL3pvZVNlcnZpY2UvdXRpbHMuanMnKS5JbnN0YW5jZTwoemNmOiBaQ0Y8R292ZXJuYW5jZVRlcm1zPHt9Pj4pID0+IHt9Pn0gYWxsZWdlZEdvdmVybmVkXG4gKiBAcGFyYW0ge0luc3RhbmNlfSBhbGxlZ2VkR292ZXJub3JcbiAqIEBwYXJhbSB7SW5zdGFsbGF0aW9uPFhpbXBvcnQoJ0BhZ29yaWMvZ292ZXJuYW5jZS9zcmMvY29udHJhY3RHb3Zlcm5vcicpLnN0YXJ0Pn0gY29udHJhY3RHb3Zlcm5vckluc3RhbGxhdGlvblxuICogQHJldHVybnMge1Byb21pc2U8R292ZXJuYW5jZVBhaXI+fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydENvbnRyYWN0RWxlY3RvcmF0ZSAtIGFzc2VydCB0aGF0IHRoZSBjb250cmFjdCB1c2VzIHRoZVxuICogICBlbGVjdG9yYXRlXG4gKlxuICogQHBhcmFtIHtFUmVmPFpvZVNlcnZpY2U+fSB6b2VcbiAqIEBwYXJhbSB7SW5zdGFuY2V9IGFsbGVnZWRHb3Zlcm5vclxuICogQHBhcmFtIHtJbnN0YW5jZX0gYWxsZWdlZEVsZWN0b3JhdGVcbiAqL1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAO61XYMhIAADISAAA6AAAAQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xL3NyYy9lY29uQ29tbWl0dGVlQ2hhcnRlci5qc3siaW1wb3J0cyI6WyJAYWdvcmljL2dvdmVybmFuY2UvZXhwb3J0ZWQuanMiLCJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy9zd2luZ3NldC12YXQvc3JjL3ZhdHMvdGltZXIvdHlwZUd1YXJkcy5qcyIsIkBhZ29yaWMvem9lL2V4cG9ydGVkLmpzIiwiQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0cy9leHBvcnRlZC5qcyIsIkBhZ29yaWMvem9lL3NyYy90eXBlR3VhcmRzLmpzIiwiQGVuZG8vZmFyIl0sImV4cG9ydHMiOlsiSU5WSVRBVElPTl9NQUtFUlNfREVTQyIsInN0YXJ0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IG1ha2VTY2FsYXJNYXBTdG9yZSxNLG1ha2VIZWFwRmFySW5zdGFuY2UsZml0LEluc3RhbmNlSGFuZGxlU2hhcGUsVGltZXN0YW1wU2hhcGUsRTskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2dvdmVybmFuY2UvZXhwb3J0ZWQuanNcIiwgW11dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIm1ha2VTY2FsYXJNYXBTdG9yZVwiLCBbJGjigI1fYSA9PiAobWFrZVNjYWxhck1hcFN0b3JlID0gJGjigI1fYSldXSxbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXSxbXCJtYWtlSGVhcEZhckluc3RhbmNlXCIsIFskaOKAjV9hID0+IChtYWtlSGVhcEZhckluc3RhbmNlID0gJGjigI1fYSldXSxbXCJmaXRcIiwgWyRo4oCNX2EgPT4gKGZpdCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3pvZS9leHBvcnRlZC5qc1wiLCBbXV0sW1wiQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0cy9leHBvcnRlZC5qc1wiLCBbXV0sW1wiQGFnb3JpYy96b2Uvc3JjL3R5cGVHdWFyZHMuanNcIiwgW1tcIkluc3RhbmNlSGFuZGxlU2hhcGVcIiwgWyRo4oCNX2EgPT4gKEluc3RhbmNlSGFuZGxlU2hhcGUgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zd2luZ3NldC12YXQvc3JjL3ZhdHMvdGltZXIvdHlwZUd1YXJkcy5qc1wiLCBbW1wiVGltZXN0YW1wU2hhcGVcIiwgWyRo4oCNX2EgPT4gKFRpbWVzdGFtcFNoYXBlID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBmaWxlXG4gKlxuICogVGhpcyBjb250cmFjdCBtYWtlcyBpdCBwb3NzaWJsZSBmb3IgdGhvc2Ugd2hvIGdvdmVybiBjb250cmFjdHMgdG8gY2FsbCBmb3JcbiAqIHZvdGVzIG9uIGNoYW5nZXMuIEEgbW9yZSBjb21wbGV0ZSBpbXBsZW1lbnRhdGlvbiB3b3VsZCB2YWxpZGF0ZSBwYXJhbWV0ZXJzLFxuICogY29uc3RyYWluIGRlYWRsaW5lcyBhbmQgcG9zc2libHkgc3BsaXQgdGhlIGFiaWxpdHkgdG8gY2FsbCBmb3Igdm90ZXMgaW50b1xuICogc2VwYXJhdGUgY2FwYWJpbGl0aWVzIGZvciBmaW5lciBncmFpbiBlbmNhcHN1bGF0aW9uLlxuICovXG5cbmNvbnN0ICAgICAgICBJTlZJVEFUSU9OX01BS0VSU19ERVNDPSdjaGFydGVyIG1lbWJlciBpbnZpdGF0aW9uJztcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQYXJhbUNoYW5nZXNPZmZlckFyZ3NcbiAqIEBwcm9wZXJ0eSB7YmlnaW50fSBkZWFkbGluZVxuICogQHByb3BlcnR5IHtJbnN0YW5jZX0gaW5zdGFuY2VcbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59IHBhcmFtc1xuICogQHByb3BlcnR5IHt7cGFyYW1QYXRoOiB7IGtleTogc3RyaW5nIH19fSBbcGF0aF1cbiAqLyRo4oCNX29uY2UuSU5WSVRBVElPTl9NQUtFUlNfREVTQyhJTlZJVEFUSU9OX01BS0VSU19ERVNDKTtcbmNvbnN0IFBhcmFtQ2hhbmdlc09mZmVyQXJnc1NoYXBlPWhhcmRlbihcbk0uc3BsaXQoXG57XG5kZWFkbGluZTpUaW1lc3RhbXBTaGFwZSxcbmluc3RhbmNlOkluc3RhbmNlSGFuZGxlU2hhcGUsXG5wYXJhbXM6TS5yZWNvcmRPZihNLnN0cmluZygpLE0uYW55KCkpfSxcblxuTS5wYXJ0aWFsKHtcbnBhdGg6e3BhcmFtUGF0aDp7a2V5Ok0uYW55KCl9fX0pKSk7XG5cblxuXG5cbi8qKlxuICogQHBhcmFtIHtaQ0Y8e2JpbmFyeVZvdGVDb3VudGVySW5zdGFsbGF0aW9uOkluc3RhbGxhdGlvbn0+fSB6Y2ZcbiAqL1xuY29uc3QgICAgICAgIHN0YXJ0PWFzeW5jKHpjZik9PntcbmNvbnN0e2JpbmFyeVZvdGVDb3VudGVySW5zdGFsbGF0aW9uOmNvdW50ZXJ9PXpjZi5nZXRUZXJtcygpO1xuLyoqIEB0eXBlIHtNYXBTdG9yZTxJbnN0YW5jZSxHb3Zlcm5lZENvbnRyYWN0RmFjZXRBY2Nlc3M8e30se30+Pn0gKi9cbmNvbnN0IGluc3RhbmNlVG9Hb3Zlcm5vcj1tYWtlU2NhbGFyTWFwU3RvcmUoKTtcblxuY29uc3QgbWFrZVBhcmFtSW52aXRhdGlvbj0oKT0+e1xuLyoqXG4gKiBAcGFyYW0ge1pDRlNlYXR9IHNlYXRcbiAqIEBwYXJhbSB7UGFyYW1DaGFuZ2VzT2ZmZXJBcmdzfSBhcmdzXG4gKi9cbmNvbnN0IHZvdGVPblBhcmFtQ2hhbmdlcz0oc2VhdCxhcmdzKT0+e1xuZml0KGFyZ3MsUGFyYW1DaGFuZ2VzT2ZmZXJBcmdzU2hhcGUpO1xuc2VhdC5leGl0KCk7XG5cbmNvbnN0e1xucGFyYW1zLFxuaW5zdGFuY2UsXG5kZWFkbGluZSxcbnBhdGg9e3BhcmFtUGF0aDp7a2V5Oidnb3Zlcm5lZEFwaSd9fX09XG5hcmdzO1xuY29uc3QgZ292ZXJub3I9aW5zdGFuY2VUb0dvdmVybm9yLmdldChpbnN0YW5jZSk7XG5yZXR1cm4gRShnb3Zlcm5vcikudm90ZU9uUGFyYW1DaGFuZ2VzKGNvdW50ZXIsZGVhZGxpbmUse1xuLi4ucGF0aCxcbmNoYW5nZXM6cGFyYW1zfSk7XG5cbiB9O1xuXG5yZXR1cm4gemNmLm1ha2VJbnZpdGF0aW9uKHZvdGVPblBhcmFtQ2hhbmdlcywndm90ZSBvbiBwYXJhbSBjaGFuZ2VzJyk7XG4gfTtcblxuY29uc3QgbWFrZU9mZmVyRmlsdGVySW52aXRhdGlvbj0oaW5zdGFuY2Usc3RyaW5ncyxkZWFkbGluZSk9PntcbmNvbnN0IHZvdGVPbk9mZmVyRmlsdGVySGFuZGxlcj0oc2VhdCk9PntcbnNlYXQuZXhpdCgpO1xuXG5jb25zdCBnb3Zlcm5vcj1pbnN0YW5jZVRvR292ZXJub3IuZ2V0KGluc3RhbmNlKTtcbnJldHVybiBFKGdvdmVybm9yKS52b3RlT25PZmZlckZpbHRlcihjb3VudGVyLGRlYWRsaW5lLHN0cmluZ3MpO1xuIH07XG5cbnJldHVybiB6Y2YubWFrZUludml0YXRpb24odm90ZU9uT2ZmZXJGaWx0ZXJIYW5kbGVyLCd2b3RlIG9uIG9mZmVyIGZpbHRlcicpO1xuIH07XG5cbmNvbnN0IE1ha2VyST1NLmludGVyZmFjZSgnQ2hhcnRlciBJbnZpdGF0aW9uTWFrZXJzJyx7XG5Wb3RlT25QYXJhbUNoYW5nZTpNLmNhbGwoKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcblZvdGVPblBhdXNlT2ZmZXJzOk0uY2FsbChcbkluc3RhbmNlSGFuZGxlU2hhcGUsXG5NLmFycmF5T2YoTS5zdHJpbmcoKSksXG5UaW1lc3RhbXBTaGFwZSkuXG5yZXR1cm5zKE0ucHJvbWlzZSgpKX0pO1xuXG5jb25zdCBpbnZpdGF0aW9uTWFrZXJzPW1ha2VIZWFwRmFySW5zdGFuY2UoXG4nQ2hhcnRlciBJbnZpdGF0aW9uIE1ha2VycycsXG5NYWtlckksXG57XG5Wb3RlT25QYXJhbUNoYW5nZTptYWtlUGFyYW1JbnZpdGF0aW9uLFxuVm90ZU9uUGF1c2VPZmZlcnM6bWFrZU9mZmVyRmlsdGVySW52aXRhdGlvbn0pO1xuXG5cblxuY29uc3QgY2hhcnRlck1lbWJlckhhbmRsZXI9KHNlYXQpPT57XG5zZWF0LmV4aXQoKTtcbnJldHVybiBoYXJkZW4oe2ludml0YXRpb25NYWtlcnN9KTtcbiB9O1xuXG5jb25zdCBjaGFydGVyQ3JlYXRvckk9TS5pbnRlcmZhY2UoJ0NoYXJ0ZXIgY3JlYXRvckZhY2V0Jyx7XG5hZGRJbnN0YW5jZTpNLmNhbGwoSW5zdGFuY2VIYW5kbGVTaGFwZSxNLmFueSgpKS5cbm9wdGlvbmFsKE0uc3RyaW5nKCkpLlxucmV0dXJucygpLFxubWFrZUNoYXJ0ZXJNZW1iZXJJbnZpdGF0aW9uOk0uY2FsbCgpLnJldHVybnMoTS5wcm9taXNlKCkpfSk7XG5cblxuY29uc3QgY3JlYXRvckZhY2V0PW1ha2VIZWFwRmFySW5zdGFuY2UoXG4nQ2hhcnRlciBjcmVhdG9yRmFjZXQnLFxuY2hhcnRlckNyZWF0b3JJLFxue1xuLyoqXG4gKiBAcGFyYW0ge0luc3RhbmNlfSBnb3Zlcm5lZEluc3RhbmNlXG4gKiBAcGFyYW0ge0dvdmVybmVkQ29udHJhY3RGYWNldEFjY2Vzczx7fSx7fT59IGdvdmVybm9yRmFjZXRcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbGFiZWxdIGZvciBkaWFnbm9zdGljIHVzZSBvbmx5XG4gKi9cbmFkZEluc3RhbmNlOihnb3Zlcm5lZEluc3RhbmNlLGdvdmVybm9yRmFjZXQsbGFiZWwpPT57XG5jb25zb2xlLmxvZygnY2hhcnRlcjogYWRkaW5nIGluc3RhbmNlJyxsYWJlbCk7XG5pbnN0YW5jZVRvR292ZXJub3IuaW5pdChnb3Zlcm5lZEluc3RhbmNlLGdvdmVybm9yRmFjZXQpO1xuIH0sXG5tYWtlQ2hhcnRlck1lbWJlckludml0YXRpb246KCk9PlxuemNmLm1ha2VJbnZpdGF0aW9uKGNoYXJ0ZXJNZW1iZXJIYW5kbGVyLElOVklUQVRJT05fTUFLRVJTX0RFU0MpfSk7XG5cblxuXG5yZXR1cm4gaGFyZGVuKHtjcmVhdG9yRmFjZXR9KTtcbiB9OyRo4oCNX29uY2Uuc3RhcnQoc3RhcnQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IklOVklUQVRJT05fTUFLRVJTX0RFU0MiOlsiSU5WSVRBVElPTl9NQUtFUlNfREVTQyJdLCJzdGFydCI6WyJzdGFydCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA2Z8jheAQAAHgEAAAlAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4yLjEvc3JjL2NvbmZpZy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiQnJpZGdlSWQiLCJXYWxsZXROYW1lIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQHRzLWNoZWNrKi9cbi8qKiBAZmlsZVxuICpcbiAqIFNvbWUgb2YgdGhpcyBjb25maWcgaW5mbyBtYXkgbWFrZSBtb3JlIHNlbnNlIGluIGEgcGFydGljdWxhciBwYWNrYWdlLiBIb3dldmVyXG4gKiBkdWUgdG8gaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80NjIwIGFuZCBvdXIgbGF4IHBhY2thZ2VcbiAqIGRlcGVuZGVuY3kgZ3JhcGgsIHNvbWV0aW1lcyByYXRpb25hbCBwbGFjZW1lbnRzIGNhdXNlIHR5cGUgcmVzb2x1dGlvbiBlcnJvcnMuXG4gKlxuICogU28gYXMgYSB3b3JrLWFyb3VuZCBzb21lIGNvbnN0YW50cyB0aGF0IG5lZWQgYWNjZXNzIGZyb20gbW9yZSB0aGFuIG9uZSBwYWNrYWdlIGFyZSBwbGFjZWQgaGVyZS5cbiAqL1xuXG4vKipcbiAqIEV2ZW50IHNvdXJjZSBpZHMgdXNlZCBieSB0aGUgYnJpZGdlIGRldmljZS5cbiAqL1xuY29uc3QgICAgICAgIEJyaWRnZUlkPXtcbkJBTks6J2JhbmsnLFxuQ09SRTonY29yZScsXG5ESUJDOidkaWJjJyxcblNUT1JBR0U6J3N0b3JhZ2UnLFxuUFJPVklTSU9OOidwcm92aXNpb24nLFxuUFJPVklTSU9OX1NNQVJUX1dBTExFVDoncHJvdmlzaW9uV2FsbGV0JyxcbldBTExFVDond2FsbGV0J307JGjigI1fb25jZS5CcmlkZ2VJZChCcmlkZ2VJZCk7XG5cbmhhcmRlbihCcmlkZ2VJZCk7XG5cbmNvbnN0ICAgICAgICBXYWxsZXROYW1lPXtcbmRlcG9zaXRGYWNldDonZGVwb3NpdEZhY2V0J307JGjigI1fb25jZS5XYWxsZXROYW1lKFdhbGxldE5hbWUpO1xuXG5oYXJkZW4oV2FsbGV0TmFtZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQnJpZGdlSWQiOlsiQnJpZGdlSWQiXSwiV2FsbGV0TmFtZSI6WyJXYWxsZXROYW1lIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAK/0Jsh9AQAAfQEAACQAAABAYWdvcmljL2ludGVybmFsLXYwLjIuMS9zcmMvaW5kZXguanN7ImltcG9ydHMiOlsiLi9jb25maWcuanMiLCIuL3V0aWxzLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9jb25maWcuanMiLCIuL3V0aWxzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi91dGlscy5qc1wiLCBbXV0sW1wiLi9jb25maWcuanNcIiwgW11dXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGM+OswjNwAAIzcAACQAAABAYWdvcmljL2ludGVybmFsLXYwLjIuMS9zcmMvdXRpbHMuanN7ImltcG9ydHMiOlsiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL21hcnNoYWwiLCJAZW5kby9wcm9taXNlLWtpdCJdLCJleHBvcnRzIjpbIlByb21pc2VBbGxPckVycm9ycyIsImFnZ3JlZ2F0ZVRyeUZpbmFsbHkiLCJhcHBseUxhYmVsaW5nRXJyb3IiLCJhc3NlcnRBbGxEZWZpbmVkIiwiYmluZEFsbE1ldGhvZHMiLCJkZWVwbHlGdWxmaWxsZWRPYmplY3QiLCJmcm9tVW5pcXVlRW50cmllcyIsImZzU3RyZWFtUmVhZHkiLCJnZXRNZXRob2ROYW1lcyIsImxpc3REaWZmZXJlbmNlIiwibWFrZUFnZ3JlZ2F0ZUVycm9yIiwibWFrZU1lYXN1cmVTZWNvbmRzIiwib2JqZWN0TWFwIiwidGhyb3dMYWJlbGVkIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEUsZGVlcGx5RnVsZmlsbGVkLGlzT2JqZWN0LGlzUHJvbWlzZTskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcImRlZXBseUZ1bGZpbGxlZFwiLCBbJGjigI1fYSA9PiAoZGVlcGx5RnVsZmlsbGVkID0gJGjigI1fYSldXSxbXCJpc09iamVjdFwiLCBbJGjigI1fYSA9PiAoaXNPYmplY3QgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcImlzUHJvbWlzZVwiLCBbJGjigI1fYSA9PiAoaXNQcm9taXNlID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vbWFyc2hhbC9zcmMvdHlwZXMnKS5SZW1vdGFibGV9IFJlbW90YWJsZSAqL1xuXG5jb25zdHtcbmdldFByb3RvdHlwZU9mLFxuY3JlYXRlLFxuZW50cmllcyxcbmZyb21FbnRyaWVzLFxuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yc309XG5PYmplY3Q7XG5jb25zdHtvd25LZXlzLGFwcGx5fT1SZWZsZWN0O1xuXG5jb25zdHtkZXRhaWxzOlgscXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5cbi8qKlxuICogVGhyb3dzIGlmIG11bHRpcGxlIGVudHJpZXMgdXNlIHRoZSBzYW1lIHByb3BlcnR5IG5hbWUuIE90aGVyd2lzZSBhY3RzXG4gKiBsaWtlIGBPYmplY3QuZnJvbUVudHJpZXNgIGJ1dCBoYXJkZW5zIHRoZSByZXN1bHQuXG4gKiBVc2UgaXQgdG8gcHJvdGVjdCBmcm9tIHByb3BlcnR5IG5hbWVzIGNvbXB1dGVkIGZyb20gdXNlci1wcm92aWRlZCBkYXRhLlxuICpcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEBwYXJhbSB7SXRlcmFibGU8W0ssVl0+fSBhbGxFbnRyaWVzXG4gKiBAcmV0dXJucyB7e1trOiBLXTogVn19XG4gKi9cbmNvbnN0ICAgICAgICBmcm9tVW5pcXVlRW50cmllcz0oYWxsRW50cmllcyk9PntcbmNvbnN0IGVudHJpZXNBcnJheT1bLi4uYWxsRW50cmllc107XG5jb25zdCByZXN1bHQ9aGFyZGVuKGZyb21FbnRyaWVzKGVudHJpZXNBcnJheSkpO1xuaWYob3duS2V5cyhyZXN1bHQpLmxlbmd0aD09PWVudHJpZXNBcnJheS5sZW5ndGgpe1xucmV0dXJuIHJlc3VsdDtcbiB9XG5jb25zdCBuYW1lcz1uZXcgU2V0KCk7XG5mb3IoY29uc3RbbmFtZSxfXW9mIGVudHJpZXNBcnJheSl7XG5pZihuYW1lcy5oYXMobmFtZSkpe1xuRmFpbCBgY29sbGlzaW9uIG9uIHByb3BlcnR5IG5hbWUgJHtxKG5hbWUpfTogJHtlbnRyaWVzQXJyYXl9YDtcbiB9XG5uYW1lcy5hZGQobmFtZSk7XG4gfVxudGhyb3cgRmFpbCBgaW50ZXJuYWw6IGZhaWxlZCB0byBjcmVhdGUgb2JqZWN0IGZyb20gdW5pcXVlIGVudHJpZXNgO1xuIH07JGjigI1fb25jZS5mcm9tVW5pcXVlRW50cmllcyhmcm9tVW5pcXVlRW50cmllcyk7XG5oYXJkZW4oZnJvbVVuaXF1ZUVudHJpZXMpO1xuXG4vKipcbiAqIEJ5IGFuYWxvZ3kgd2l0aCBob3cgYEFycmF5LnByb3RvdHlwZS5tYXBgIHdpbGwgbWFwIHRoZSBlbGVtZW50cyBvZlxuICogYW4gYXJyYXkgdG8gdHJhbnNmb3JtZWQgZWxlbWVudHMgb2YgYW4gYXJyYXkgb2YgdGhlIHNhbWUgc2hhcGUsXG4gKiBgb2JqZWN0TWFwYCB3aWxsIGRvIGxpa2V3aXNlIGZvciB0aGUgc3RyaW5nLW5hbWVkIG93biBlbnVtZXJhYmxlXG4gKiBwcm9wZXJ0aWVzIG9mIGFuIG9iamVjdC5cbiAqXG4gKiBUeXBpY2FsIHVzYWdlIGFwcGxpZXMgYG9iamVjdE1hcGAgdG8gYSBDb3B5UmVjb3JkLCBpLmUuLFxuICogYW4gb2JqZWN0IGZvciB3aGljaCBgcGFzc1N0eWxlT2Yob3JpZ2luYWwpID09PSAnY29weVJlY29yZCdgLiBGb3IgdGhlc2UsXG4gKiBub25lIG9mIHRoZSBmb2xsb3dpbmcgZWRnZSBjYXNlcyBhcmlzZS4gVGhlIHJlc3VsdCB3aWxsIGJlIGEgQ29weVJlY29yZFxuICogd2l0aCBleGFjdGx5IHRoZSBzYW1lIHByb3BlcnR5IG5hbWVzLCB3aG9zZSB2YWx1ZXMgYXJlIHRoZSBtYXBwZWQgZm9ybSBvZlxuICogdGhlIG9yaWdpbmFsJ3MgdmFsdWVzLlxuICpcbiAqIFdoZW4gdGhlIG9yaWdpbmFsIGlzIG5vdCBhIENvcHlSZWNvcmQsIHNvbWUgZWRnZSBjYXNlcyB0byBiZSBhd2FyZSBvZlxuICogICAgKiBObyBtYXR0ZXIgaG93IG11dGFibGUgdGhlIG9yaWdpbmFsIG9iamVjdCwgdGhlIHJldHVybmVkIG9iamVjdCBpc1xuICogICAgICBoYXJkZW5lZC5cbiAqICAgICogT25seSB0aGUgc3RyaW5nLW5hbWVkIGVudW1lcmFibGUgb3duIHByb3BlcnRpZXMgb2YgdGhlIG9yaWdpbmFsXG4gKiAgICAgIGFyZSBtYXBwZWQuIEFsbCBvdGhlciBwcm9wZXJ0aWVzIGFyZSBpZ25vcmVkLlxuICogICAgKiBJZiBhbnkgb2YgdGhlIG9yaWdpbmFsIHByb3BlcnRpZXMgd2VyZSBhY2Nlc3NvcnMsIGBPYmplY3QuZW50cmllc2BcbiAqICAgICAgd2lsbCBjYXVzZSBpdHMgYGdldHRlcmAgdG8gYmUgY2FsbGVkIGFuZCB3aWxsIHVzZSB0aGUgcmVzdWx0aW5nXG4gKiAgICAgIHZhbHVlLlxuICogICAgKiBObyBtYXR0ZXIgd2hldGhlciB0aGUgb3JpZ2luYWwgcHJvcGVydHkgd2FzIGFuIGFjY2Vzc29yLCB3cml0YWJsZSxcbiAqICAgICAgb3IgY29uZmlndXJhYmxlLCBhbGwgdGhlIHByb3BlcnRpZXMgb2YgdGhlIHJldHVybmVkIG9iamVjdCB3aWxsIGJlXG4gKiAgICAgIG5vbi13cml0YWJsZSwgbm9uLWNvbmZpZ3VyYWJsZSwgZGF0YSBwcm9wZXJ0aWVzLlxuICogICAgKiBObyBtYXR0ZXIgd2hhdCB0aGUgb3JpZ2luYWwgb2JqZWN0IG1heSBoYXZlIGluaGVyaXRlZCBmcm9tLCBhbmRcbiAqICAgICAgbm8gbWF0dGVyIHdoZXRoZXIgaXQgd2FzIGEgc3BlY2lhbCBraW5kIG9mIG9iamVjdCBzdWNoIGFzIGFuIGFycmF5LFxuICogICAgICB0aGUgcmV0dXJuZWQgb2JqZWN0IHdpbGwgYWx3YXlzIGJlIGEgcGxhaW4gb2JqZWN0IGluaGVyaXRpbmcgZGlyZWN0bHlcbiAqICAgICAgZnJvbSBgT2JqZWN0LnByb3RvdHlwZWAgYW5kIHdob3NlIHN0YXRlIGlzIG9ubHkgdGhlc2UgbmV3IG1hcHBlZFxuICogICAgICBvd24gcHJvcGVydGllcy5cbiAqXG4gKiBXaXRoIHRoZXNlIGRpZmZlcmVuY2VzLCBldmVuIGlmIHRoZSBvcmlnaW5hbCBvYmplY3Qgd2FzIG5vdCBhIENvcHlSZWNvcmQsXG4gKiBpZiBhbGwgdGhlIG1hcHBlZCB2YWx1ZXMgYXJlIFBhc3NhYmxlLCB0aGVuIHRoZSByZXR1cm5lZCBvYmplY3Qgd2lsbCBiZVxuICogYSBDb3B5UmVjb3JkLlxuICpcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gT1xuICogQHBhcmFtIHtPfSBvcmlnaW5hbFxuICogQHRlbXBsYXRlIFIgbWFwIHJlc3VsdFxuICogQHBhcmFtIHsodmFsdWU6IE9ba2V5b2YgT10sIGtleToga2V5b2YgTykgPT4gUn0gbWFwRm5cbiAqIEByZXR1cm5zIHt7IFtQIGluIGtleW9mIE9dOiBSfX1cbiAqL1xuY29uc3QgICAgICAgIG9iamVjdE1hcD0ob3JpZ2luYWwsbWFwRm4pPT57XG5jb25zdCBlbnRzPWVudHJpZXMob3JpZ2luYWwpO1xuY29uc3QgbWFwRW50cz1lbnRzLm1hcCgoW2ssdl0pPT5bayxtYXBGbih2LGspXSk7XG5yZXR1cm4gaGFyZGVuKGZyb21FbnRyaWVzKG1hcEVudHMpKTtcbiB9OyRo4oCNX29uY2Uub2JqZWN0TWFwKG9iamVjdE1hcCk7XG5oYXJkZW4ob2JqZWN0TWFwKTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHtBcnJheTxzdHJpbmcgfCBzeW1ib2w+fSBsZWZ0TmFtZXNcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nIHwgc3ltYm9sPn0gcmlnaHROYW1lc1xuICovXG5jb25zdCAgICAgICAgbGlzdERpZmZlcmVuY2U9KGxlZnROYW1lcyxyaWdodE5hbWVzKT0+e1xuY29uc3QgcmlnaHRTZXQ9bmV3IFNldChyaWdodE5hbWVzKTtcbnJldHVybiBsZWZ0TmFtZXMuZmlsdGVyKChuYW1lKT0+IXJpZ2h0U2V0LmhhcyhuYW1lKSk7XG4gfTskaOKAjV9vbmNlLmxpc3REaWZmZXJlbmNlKGxpc3REaWZmZXJlbmNlKTtcbmhhcmRlbihsaXN0RGlmZmVyZW5jZSk7XG5cbi8qKlxuICogQHBhcmFtIHtFcnJvcn0gaW5uZXJFcnJcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gbGFiZWxcbiAqIEBwYXJhbSB7RXJyb3JDb25zdHJ1Y3Rvcj19IEVycm9yQ29uc3RydWN0b3JcbiAqIEByZXR1cm5zIHtuZXZlcn1cbiAqL1xuY29uc3QgICAgICAgIHRocm93TGFiZWxlZD0oaW5uZXJFcnIsbGFiZWwsRXJyb3JDb25zdHJ1Y3Rvcj11bmRlZmluZWQpPT57XG5pZih0eXBlb2YgbGFiZWw9PT0nbnVtYmVyJyl7XG5sYWJlbD0gYFske2xhYmVsfV1gO1xuIH1cbmNvbnN0IG91dGVyRXJyPWFzc2VydC5lcnJvcihcbiBgJHtsYWJlbH06ICR7aW5uZXJFcnIubWVzc2FnZX1gLFxuRXJyb3JDb25zdHJ1Y3Rvcik7XG5cbmFzc2VydC5ub3RlKG91dGVyRXJyLFggYENhdXNlZCBieSAke2lubmVyRXJyfWApO1xudGhyb3cgb3V0ZXJFcnI7XG4gfTskaOKAjV9vbmNlLnRocm93TGFiZWxlZCh0aHJvd0xhYmVsZWQpO1xuaGFyZGVuKHRocm93TGFiZWxlZCk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEEsUlxuICogQHBhcmFtIHsoLi4uYXJnczogQVtdKSA9PiBSfSBmdW5jXG4gKiBAcGFyYW0ge0FbXX0gYXJnc1xuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBbbGFiZWxdXG4gKiBAcmV0dXJucyB7Un1cbiAqL1xuY29uc3QgICAgICAgIGFwcGx5TGFiZWxpbmdFcnJvcj0oZnVuYyxhcmdzLGxhYmVsPXVuZGVmaW5lZCk9PntcbmlmKGxhYmVsPT09dW5kZWZpbmVkKXtcbnJldHVybiBmdW5jKC4uLmFyZ3MpO1xuIH1cbmxldCByZXN1bHQ7XG50cnl7XG5yZXN1bHQ9ZnVuYyguLi5hcmdzKTtcbiB9Y2F0Y2goZXJyKXtcbnRocm93TGFiZWxlZChlcnIsbGFiZWwpO1xuIH1cbmlmKGlzUHJvbWlzZShyZXN1bHQpKXtcbi8qIEB0cy1leHBlY3QtZXJyb3IgSWYgcmVzdWx0IGlzIGEgcmVqZWN0ZWQgcHJvbWlzZSwgdGhpcyB3aWxsKi9cbi8qIHJldHVybiBhIHByb21pc2Ugd2l0aCBhIGRpZmZlcmVudCByZWplY3Rpb24gcmVhc29uLiBCdXQgdGhpcyovXG4vKiBjb25mdXNlcyBUeXBlU2NyaXB0IGJlY2F1c2UgaXQgdHlwZXMgdGhhdCBjYXNlIGFzIGBQcm9taXNlPG5ldmVyPmAqL1xuLyogd2hpY2ggaXMgY29vbCBmb3IgYSBwcm9taXNlIHRoYXQgd2lsbCBuZXZlciBmdWxmbGwuKi9cbi8qIEJ1dCBUeXBlU2NyaXB0IGRvZXNuJ3QgdW5kZXJzdGFuZCB0aGF0IHRoaXMgd2lsbCBvbmx5IGhhcHBlbiovXG4vKiB3aGVuIGByZXN1bHRgIHdhcyBhIHJlamVjdGVkIHByb21pc2UuIEluIG9ubHkgdGhpcyBjYXNlIGBSYCovXG4vKiBzaG91bGQgYWxyZWFkeSBhbGxvdyBgUHJvbWlzZTxuZXZlcj5gIGFzIGEgc3VidHlwZS4qL1xucmV0dXJuIEUud2hlbihyZXN1bHQsdW5kZWZpbmVkLChyZWFzb24pPT50aHJvd0xhYmVsZWQocmVhc29uLGxhYmVsKSk7XG4gfWVsc2V7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbiB9OyRo4oCNX29uY2UuYXBwbHlMYWJlbGluZ0Vycm9yKGFwcGx5TGFiZWxpbmdFcnJvcik7XG5oYXJkZW4oYXBwbHlMYWJlbGluZ0Vycm9yKTtcblxuLyoqXG4gKiBQcmlvcml0aXplIHN5bWJvbHMgYXMgZWFybGllciB0aGFuIHN0cmluZ3MuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8c3ltYm9sfSBhXG4gKiBAcGFyYW0ge3N0cmluZ3xzeW1ib2x9IGJcbiAqIEByZXR1cm5zIHstMSB8IDAgfCAxfVxuICovXG5jb25zdCBjb21wYXJlU3RyaW5naWZpZWQ9KGEsYik9PntcbmlmKHR5cGVvZiBhPT09dHlwZW9mIGIpe1xuY29uc3QgbGVmdD1TdHJpbmcoYSk7XG5jb25zdCByaWdodD1TdHJpbmcoYik7XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmVzdGVkLXRlcm5hcnkqL1xucmV0dXJuIGxlZnQ8cmlnaHQ/LTE6bGVmdD5yaWdodD8xOjA7XG4gfVxuaWYodHlwZW9mIGE9PT0nc3ltYm9sJyl7XG5hc3NlcnQodHlwZW9mIGI9PT0nc3RyaW5nJyk7XG5yZXR1cm4tMTtcbiB9XG5hc3NlcnQodHlwZW9mIGE9PT0nc3RyaW5nJyk7XG5hc3NlcnQodHlwZW9mIGI9PT0nc3ltYm9sJyk7XG5yZXR1cm4gMTtcbiB9O1xuXG4vKipcbiAqIFRPRE8gQ29uc29saWRhdGUgd2l0aCB0aGUgYGdldE1ldGhvZE5hbWVzYCBpbiBgQGVuZG8vZXZlbnR1YWwtc2VuZGBcbiAqXG4gKiBAcGFyYW0ge2FueX0gdmFsXG4gKiBAcmV0dXJucyB7KHN0cmluZ3xzeW1ib2wpW119XG4gKi9cbmNvbnN0ICAgICAgICBnZXRNZXRob2ROYW1lcz0odmFsKT0+e1xubGV0IGxheWVyPXZhbDtcbmNvbnN0IG5hbWVzPW5ldyBTZXQoKTsvKiBTZXQgdG8gZGVkdXBsaWNhdGUqL1xud2hpbGUobGF5ZXIhPT1udWxsJiZsYXllciE9PU9iamVjdC5wcm90b3R5cGUpe1xuLyogYmUgdG9sZXJhbnQgb2Ygbm9uLW9iamVjdHMqL1xuY29uc3QgZGVzY3M9Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhsYXllcik7XG5mb3IoY29uc3QgbmFtZSBvZiBvd25LZXlzKGRlc2NzKSl7XG4vKiBJbiBjYXNlIGEgbWV0aG9kIGlzIG92ZXJyaWRkZW4gYnkgYSBub24tbWV0aG9kLCovXG4vKiB0ZXN0IGB2YWxbbmFtZV1gIHJhdGhlciB0aGFuIGBsYXllcltuYW1lXWAqL1xuaWYodHlwZW9mIHZhbFtuYW1lXT09PSdmdW5jdGlvbicpe1xubmFtZXMuYWRkKG5hbWUpO1xuIH1cbiB9XG5pZighaXNPYmplY3QodmFsKSl7XG5icmVhaztcbiB9XG5sYXllcj1nZXRQcm90b3R5cGVPZihsYXllcik7XG4gfVxucmV0dXJuIGhhcmRlbihbLi4ubmFtZXNdLnNvcnQoY29tcGFyZVN0cmluZ2lmaWVkKSk7XG4gfTskaOKAjV9vbmNlLmdldE1ldGhvZE5hbWVzKGdldE1ldGhvZE5hbWVzKTtcbmhhcmRlbihnZXRNZXRob2ROYW1lcyk7XG5cbi8qKlxuICogVE9ETyBUaGlzIGZ1bmN0aW9uIGV4aXN0cyBvbmx5IHRvIGVhc2UgdGhlXG4gKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvcHVsbC81OTcwIHRyYW5zaXRpb24sIGZyb20gYWxsIG1ldGhvZHNcbiAqIGJlaW5nIG93biBwcm9wZXJ0aWVzIHRvIG1ldGhvZHMgYmVpbmcgaW5oZXJpdGVkIGZyb20gYSBjb21tb24gcHJvdG90eXBlLlxuICogVGhpcyB0cmFuc2l0aW9uIGJyZWFrcyB0d28gcGF0dGVybnMgdXNlZCBpbiBwcmlvciBjb2RlOiBhdXRvYmluZGluZyxcbiAqIGFuZCBlbnVtZXJhdGluZyBtZXRob2RzIGJ5IGVudW1lcmF0aW5nIG93biBwcm9wZXJ0aWVzLiBGb3IgYm90aCwgdGhlXG4gKiBwcmVmZXJyZWQgcmVwYWlycyBhcmVcbiAqICAgICogYXV0b2JpbmRpbmc6IFJlcGxhY2UsIGZvciBleGFtcGxlLFxuICogICAgICBgZm9vKG9iai5tZXRob2QpYCB3aXRoIGBmb28oYXJnID0+IGBvYmoubWV0aG9kKGFyZykpYC4gSU9XLCBzdG9wIHJlbHlpbmdcbiAqICAgICAgb24gZXhwcmVzc2lvbnMgbGlrZSBgb2JqLm1ldGhvZGAgdG8gZXh0cmFjdCBhIG1ldGhvZCBzdGlsbCBib3VuZCB0byB0aGVcbiAqICAgICAgc3RhdGUgb2YgYG9iamAgYmVjYXVzZSwgZm9yIHZpcnR1YWwgYW5kIGR1cmFibGUgb2JqZWN0cyxcbiAqICAgICAgdGhleSBubyBsb25nZXIgd2lsbCBhZnRlciAjNTk3MC5cbiAqICAgICogbWV0aG9kIGVudW1lcmF0aW9uOiBSZXBsYWNlLCBmb3IgZXhhbXBsZVxuICogICAgICBgUmVmbGVjdC5vd25LZXlzKG9iailgIHdpdGggYGdldE1ldGhvZE5hbWVzKG9iailgLlxuICpcbiAqIE9uY2UgYWxsIHByb2JsZW1hdGljIGNhc2VzIGhhdmUgYmVlbiBjb252ZXJ0ZWQgaW4gdGhpcyBtYW5uZXIsIHRoaXNcbiAqIGBiaW5kQWxsTWV0aG9kc2AgaGFjayBjYW4gYW5kIFRPRE8gc2hvdWxkIGJlIGRlbGV0ZWQuIEhvd2V2ZXIsIHdlIGN1cnJlbnRseVxuICogaGF2ZSBubyByZWxpYWJsZSBzdGF0aWMgd2F5IHRvIHRyYWNrIGRvd24gYW5kIGZpeCBhbGwgYXV0b2JpbmRpbmcgc2l0ZXMuXG4gKiBGb3IgdGhvc2Ugb2JqZWN0cyB0aGF0IGhhdmUgbm90IHlldCBiZWVuIGZ1bGx5IHJlcGFpcmVkIGJ5IHRoZSBhYm92ZSB0d29cbiAqIHRlY2huaXF1ZXMsIGBiaW5kQWxsTWV0aG9kc2AgY3JlYXRlcyBhbiBvYmplY3QgdGhhdCBhY3RzIG11Y2ggbGlrZSB0aGVcbiAqIHByZS0jNTk3MCBvYmplY3RzLCB3aXRoIGFsbCB0aGVpciBtZXRob2RzIGFzIGluc3RhbmNlLWJvdW5kIG93biBwcm9wZXJ0aWVzLlxuICogSXQgZG9lcyB0aGlzIGJ5IG1ha2luZyBhIG5ldyBvYmplY3QgaW5oZXJpdGluZyBmcm9tIGBvYmpgIHdoZXJlIHRoZSBuZXdcbiAqIG9iamVjdCBoYXMgYm91bmQgb3duIG1ldGhvZHMgb3ZlcnJpZGRpbmcgYWxsIHRoZSBtZXRob2RzIGl0IHdvdWxkIGhhdmVcbiAqIGluaGVyaXRlZCBmcm9tIGBvYmpgLlxuICpcbiAqIEBwYXJhbSB7UmVtb3RhYmxlfSBvYmpcbiAqIEByZXR1cm5zIHtSZW1vdGFibGV9XG4gKi9cbmNvbnN0ICAgICAgICBiaW5kQWxsTWV0aG9kcz0ob2JqKT0+XG5oYXJkZW4oXG5jcmVhdGUoXG5vYmosXG5mcm9tRW50cmllcyhcbmdldE1ldGhvZE5hbWVzKG9iaikubWFwKChuYW1lKT0+W1xubmFtZSxcbntcbnZhbHVlOigvKiogQHR5cGUge3Vua25vd25bXX0gKi8uLi5hcmdzKT0+XG5hcHBseShvYmpbbmFtZV0sb2JqLGFyZ3MpLFxuZW51bWVyYWJsZTp0cnVlfV0pKSkpOyRo4oCNX29uY2UuYmluZEFsbE1ldGhvZHMoYmluZEFsbE1ldGhvZHMpO1xuXG5cblxuXG5cbmhhcmRlbihiaW5kQWxsTWV0aG9kcyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHt7fX0gVFxuICogQHR5cGVkZWYge3sgW0sgaW4ga2V5b2YgVF06IERlZXBseUF3YWl0ZWQ8VFtLXT4gfX0gRGVlcGx5QXdhaXRlZE9iamVjdFxuICovXG5cbi8qKlxuICogQ2F2ZWF0czpcbiAqIC0gZG9lc24ndCByZWN1ciB3aXRoaW4gUHJvbWlzZSByZXN1bHRzXG4gKiAtIHJlc3VsdGluZyB0eXBlIGhhcyB3cmFwcGVyIGluIGl0cyBuYW1lXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtUIGV4dGVuZHMgUHJvbWlzZUxpa2U8YW55PiA/IEF3YWl0ZWQ8VD4gOiBUIGV4dGVuZHMge30gPyBEZWVwbHlBd2FpdGVkT2JqZWN0PFQ+IDogQXdhaXRlZDxUPn0gRGVlcGx5QXdhaXRlZFxuICovXG5cbi8qKlxuICogQSBtb3JlIGNvbnN0cmFpbmVkIHZlcnNpb24gb2Yge2RlZXBseUZ1bGZpbGxlZH0gZm9yIHR5cGUgc2FmZXR5IHVudGlsIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9pc3N1ZXMvMTI1N1xuICogVXNlZnVsIGluIHN0YXJ0aW5nIGNvbnRyYWN0cyB0aGF0IG5lZWQgYWxsIHRlcm1zIHRvIGJlIGZ1bGZpbGxlZCBpbiBvcmRlciB0byBiZSBkdXJhYmxlLlxuICpcbiAqIEB0eXBlIHs8VCBleHRlbmRzIHt9Pih1bmZ1bGZpbGxlZFRlcm1zOiBUKSA9PiBYaW1wb3J0KCdAZW5kby9ldmVudHVhbC1zZW5kJykuRVJlZjxEZWVwbHlBd2FpdGVkPFQ+Pn1cbiAqL1xuY29uc3QgICAgICAgIGRlZXBseUZ1bGZpbGxlZE9iamVjdD0ob2JqKT0+e1xuYXNzZXJ0KGlzT2JqZWN0KG9iaiksJ3BhcmFtIG11c3QgYmUgYW4gb2JqZWN0Jyk7XG5yZXR1cm4gZGVlcGx5RnVsZmlsbGVkKG9iaik7XG4gfTtcblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCB1c2VzIGEgbWlsbGlzZWNvbmQtYmFzZWQgdGltZS1zaW5jZS1lcG9jaCBjYXBhYmlsaXR5XG4gKiAoc3VjaCBhcyBgcGVyZm9ybWFuY2Uubm93YCkgdG8gbWVhc3VyZSBleGVjdXRpb24gdGltZSBvZiBhbiBhc3luYyBmdW5jdGlvblxuICogYW5kIHJlcG9ydCB0aGUgcmVzdWx0IGluIHNlY29uZHMgdG8gbWF0Y2ggb3VyIHRlbGVtZXRyeSBzdGFuZGFyZC5cbiAqXG4gKiBAcGFyYW0ge3R5cGVvZiBYaW1wb3J0KCdwZXJmX2hvb2tzJykucGVyZm9ybWFuY2Uubm93fSBjdXJyZW50VGltZU1pbGxpc2VjXG4gKiBAcmV0dXJucyB7PFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KSA9PiBQcm9taXNlPHsgcmVzdWx0OiBULCBkdXJhdGlvbjogbnVtYmVyIH0+fVxuICovJGjigI1fb25jZS5kZWVwbHlGdWxmaWxsZWRPYmplY3QoZGVlcGx5RnVsZmlsbGVkT2JqZWN0KTtcbmNvbnN0ICAgICAgICBtYWtlTWVhc3VyZVNlY29uZHM9KGN1cnJlbnRUaW1lTWlsbGlzZWMpPT57XG4vKiogQHBhcmFtIHsoKSA9PiBhbnl9IGZuICovXG5jb25zdCBtZWFzdXJlU2Vjb25kcz1hc3luYyhmbik9PntcbmNvbnN0IHQwPWN1cnJlbnRUaW1lTWlsbGlzZWMoKTtcbmNvbnN0IHJlc3VsdD1hd2FpdCBmbigpO1xuY29uc3QgZHVyYXRpb25NaWxsaXNlYz1jdXJyZW50VGltZU1pbGxpc2VjKCktdDA7XG5yZXR1cm57cmVzdWx0LGR1cmF0aW9uOmR1cmF0aW9uTWlsbGlzZWMvMTAwMH07XG4gfTtcbnJldHVybiBtZWFzdXJlU2Vjb25kcztcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7RXJyb3JbXX0gZXJyb3JzXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdXG4gKi8kaOKAjV9vbmNlLm1ha2VNZWFzdXJlU2Vjb25kcyhtYWtlTWVhc3VyZVNlY29uZHMpO1xuY29uc3QgICAgICAgIG1ha2VBZ2dyZWdhdGVFcnJvcj0oZXJyb3JzLG1lc3NhZ2UpPT57XG5jb25zdCBlcnI9bmV3IEVycm9yKG1lc3NhZ2UpO1xuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZXJyLHtcbm5hbWU6e1xudmFsdWU6J0FnZ3JlZ2F0ZUVycm9yJ30sXG5cbmVycm9yczp7XG52YWx1ZTplcnJvcnN9fSk7XG5cblxucmV0dXJuIGVycjtcbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge3JlYWRvbmx5IChUIHwgUHJvbWlzZUxpa2U8VD4pW119IHZhbHVlc1xuICogQHJldHVybnMge1Byb21pc2U8VFtdPn1cbiAqLyRo4oCNX29uY2UubWFrZUFnZ3JlZ2F0ZUVycm9yKG1ha2VBZ2dyZWdhdGVFcnJvcik7XG5jb25zdCAgICAgICAgUHJvbWlzZUFsbE9yRXJyb3JzPWFzeW5jKHZhbHVlcyk9PntcbnJldHVybiBQcm9taXNlLmFsbFNldHRsZWQodmFsdWVzKS50aGVuKChyZXN1bHRzKT0+e1xuY29uc3QgZXJyb3JzPS8qKiBAdHlwZSB7UHJvbWlzZVJlamVjdGVkUmVzdWx0W119ICovXG5yZXN1bHRzLmZpbHRlcigoe3N0YXR1c30pPT5zdGF0dXM9PT0ncmVqZWN0ZWQnKS5cbm1hcCgocmVzdWx0KT0+cmVzdWx0LnJlYXNvbik7XG5pZighZXJyb3JzLmxlbmd0aCl7XG5yZXR1cm4gKC8qKiBAdHlwZSB7UHJvbWlzZUZ1bGZpbGxlZFJlc3VsdDxUPltdfSAqL3Jlc3VsdHMubWFwKFxuKHJlc3VsdCk9PnJlc3VsdC52YWx1ZSkpO1xuXG4gfWVsc2UgaWYoZXJyb3JzLmxlbmd0aD09PTEpe1xudGhyb3cgZXJyb3JzWzBdO1xuIH1lbHNle1xudGhyb3cgbWFrZUFnZ3JlZ2F0ZUVycm9yKGVycm9ycyk7XG4gfVxuIH0pO1xuIH07XG5cbi8qKlxuICogQHR5cGUgezxUPihcbiAqICAgdHJpZXI6ICgpID0+IFByb21pc2U8VD4sXG4gKiAgZmluYWxpemVyOiAoZXJyb3I/OiB1bmtub3duKSA9PiBQcm9taXNlPHZvaWQ+LFxuICogKSA9PiBQcm9taXNlPFQ+fVxuICovJGjigI1fb25jZS5Qcm9taXNlQWxsT3JFcnJvcnMoUHJvbWlzZUFsbE9yRXJyb3JzKTtjb25zdCBhZ2dyZWdhdGVUcnlGaW5hbGx5PWFzeW5jKHRyaWVyLGZpbmFsaXplcik9PlxudHJpZXIoKS50aGVuKFxuYXN5bmMocmVzdWx0KT0+ZmluYWxpemVyKCkudGhlbigoKT0+cmVzdWx0KSxcbmFzeW5jKHRyeUVycm9yKT0+XG5maW5hbGl6ZXIodHJ5RXJyb3IpLlxudGhlbihcbigpPT50cnlFcnJvcixcbihmaW5hbGl6ZUVycm9yKT0+bWFrZUFnZ3JlZ2F0ZUVycm9yKFt0cnlFcnJvcixmaW5hbGl6ZUVycm9yXSkpLlxuXG50aGVuKChlcnJvcik9PlByb21pc2UucmVqZWN0KGVycm9yKSkpO1xuXG5cbi8qKlxuICogQHBhcmFtIHtYaW1wb3J0KFwiZnNcIikuUmVhZFN0cmVhbSB8IFhpbXBvcnQoXCJmc1wiKS5Xcml0ZVN0cmVhbX0gc3RyZWFtXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAqLyRo4oCNX29uY2UuYWdncmVnYXRlVHJ5RmluYWxseShhZ2dyZWdhdGVUcnlGaW5hbGx5KTtcbmNvbnN0ICAgICAgICBmc1N0cmVhbVJlYWR5PShzdHJlYW0pPT5cbm5ldyBQcm9taXNlKChyZXNvbHZlLHJlamVjdCk9PntcbmlmKHN0cmVhbS5kZXN0cm95ZWQpe1xucmVqZWN0KG5ldyBFcnJvcignU3RyZWFtIGFscmVhZHkgZGVzdHJveWVkJykpO1xucmV0dXJuO1xuIH1cblxuaWYoIXN0cmVhbS5wZW5kaW5nKXtcbnJlc29sdmUoKTtcbnJldHVybjtcbiB9XG5cbmNvbnN0IG9uUmVhZHk9KCk9PntcbmNsZWFudXAoKTsvKiBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbnJlc29sdmUoKTtcbiB9O1xuXG4vKiogQHBhcmFtIHtFcnJvcn0gZXJyICovXG5jb25zdCBvbkVycm9yPShlcnIpPT57XG5jbGVhbnVwKCk7LyogZXNsaW50LWRpc2FibGUtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5yZWplY3QoZXJyKTtcbiB9O1xuXG5jb25zdCBjbGVhbnVwPSgpPT57XG5zdHJlYW0ub2ZmKCdyZWFkeScsb25SZWFkeSk7XG5zdHJlYW0ub2ZmKCdlcnJvcicsb25FcnJvcik7XG4gfTtcblxuc3RyZWFtLm9uKCdyZWFkeScsb25SZWFkeSk7XG5zdHJlYW0ub24oJ2Vycm9yJyxvbkVycm9yKTtcbiB9KTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBUXG4gKiBAdHlwZWRlZiB7e1tQIGluIGtleW9mIFRdOiBFeGNsdWRlPFRbUF0sIHVuZGVmaW5lZD47fX0gQWxsRGVmaW5lZFxuICovXG5cbi8qKlxuICogQ29uY2lzZSB3YXkgdG8gY2hlY2sgdmFsdWVzIGFyZSBhdmFpbGFibGUgZnJvbSBvYmplY3QgbGl0ZXJhbCBzaG9ydGhhbmQuXG4gKiBUaHJvd3MgZXJyb3IgbWVzc2FnZSB0byBzcGVjaWZ5IHRoZSBtaXNzaW5nIHZhbHVlcy5cbiAqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBUXG4gKiBAcGFyYW0ge1R9IG9ialxuICogQHRocm93cyBpZiBhbnkgdmFsdWUgaW4gdGhlIG9iamVjdCBlbnRyaWVzIGlzIG5vdCBkZWZpbmVkXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBvYmogaXMgQWxsRGVmaW5lZDxUPn1cbiAqLyRo4oCNX29uY2UuZnNTdHJlYW1SZWFkeShmc1N0cmVhbVJlYWR5KTtcblxuY29uc3QgICAgICAgIGFzc2VydEFsbERlZmluZWQ9KG9iaik9PntcbmNvbnN0IG1pc3Npbmc9W107XG5mb3IoY29uc3Rba2V5LHZhbF1vZiBPYmplY3QuZW50cmllcyhvYmopKXtcbmlmKHZhbD09PXVuZGVmaW5lZCl7XG5taXNzaW5nLnB1c2goa2V5KTtcbiB9XG4gfVxuaWYobWlzc2luZy5sZW5ndGg+MCl7XG5GYWlsIGBtaXNzaW5nICR7cShtaXNzaW5nKX1gO1xuIH1cbiB9OyRo4oCNX29uY2UuYXNzZXJ0QWxsRGVmaW5lZChhc3NlcnRBbGxEZWZpbmVkKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJmcm9tVW5pcXVlRW50cmllcyI6WyJmcm9tVW5pcXVlRW50cmllcyJdLCJvYmplY3RNYXAiOlsib2JqZWN0TWFwIl0sImxpc3REaWZmZXJlbmNlIjpbImxpc3REaWZmZXJlbmNlIl0sInRocm93TGFiZWxlZCI6WyJ0aHJvd0xhYmVsZWQiXSwiYXBwbHlMYWJlbGluZ0Vycm9yIjpbImFwcGx5TGFiZWxpbmdFcnJvciJdLCJnZXRNZXRob2ROYW1lcyI6WyJnZXRNZXRob2ROYW1lcyJdLCJiaW5kQWxsTWV0aG9kcyI6WyJiaW5kQWxsTWV0aG9kcyJdLCJkZWVwbHlGdWxmaWxsZWRPYmplY3QiOlsiZGVlcGx5RnVsZmlsbGVkT2JqZWN0Il0sIm1ha2VNZWFzdXJlU2Vjb25kcyI6WyJtYWtlTWVhc3VyZVNlY29uZHMiXSwibWFrZUFnZ3JlZ2F0ZUVycm9yIjpbIm1ha2VBZ2dyZWdhdGVFcnJvciJdLCJQcm9taXNlQWxsT3JFcnJvcnMiOlsiUHJvbWlzZUFsbE9yRXJyb3JzIl0sImFnZ3JlZ2F0ZVRyeUZpbmFsbHkiOlsiYWdncmVnYXRlVHJ5RmluYWxseSJdLCJmc1N0cmVhbVJlYWR5IjpbImZzU3RyZWFtUmVhZHkiXSwiYXNzZXJ0QWxsRGVmaW5lZCI6WyJhc3NlcnRBbGxEZWZpbmVkIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAFLz3TiICwAAiAsAACIAAABAYWdvcmljL25hdC12NC4xLjAvZGlzdC9uYXQuZXNtLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJOYXQiLCJpc05hdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShpc05hdCwgJ25hbWUnLCB7dmFsdWU6IFwiaXNOYXRcIn0pOyRo4oCNX29uY2UuaXNOYXQoaXNOYXQpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShOYXQsICduYW1lJywge3ZhbHVlOiBcIk5hdFwifSk7JGjigI1fb25jZS5OYXQoTmF0KTsgICAvKiBDb3B5cmlnaHQgKEMpIDIwMTEgR29vZ2xlIEluYy4qL1xuLyogQ29weXJpZ2h0IChDKSAyMDE4IEFnb3JpYyovXG4vKiovXG4vKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOyovXG4vKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuKi9cbi8qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCovXG4vKiovXG4vKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAqL1xuLyoqL1xuLyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSovXG4vKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsKi9cbi8qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiovXG4vKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kKi9cbi8qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiovXG5cbi8qIEB0cy1jaGVjayovXG5cbi8qKlxuICogSXMgYGFsbGVnZWROdW1gIGEgbnVtYmVyIGluIHRoZSBbY29udGlndW91cyByYW5nZSBvZiBleGFjdGx5IGFuZFxuICogdW5hbWJpZ3VvdXNseVxuICogcmVwcmVzZW50YWJsZV0oaHR0cHM6Ly9lc2Rpc2N1c3Mub3JnL3RvcGljL21vcmUtbnVtZXJpYy1jb25zdGFudHMtcGxlYXNlLWVzcGVjaWFsbHktZXBzaWxvbiNjb250ZW50LTE0KVxuICogIG5hdHVyYWwgbnVtYmVycyAobm9uLW5lZ2F0aXZlIGludGVnZXJzKT9cbiAqXG4gKiBUbyBxdWFsaWZ5IGBhbGxlZ2VkTnVtYCBtdXN0IGVpdGhlciBiZSBhXG4gKiBub24tbmVnYXRpdmUgYGJpZ2ludGAsIG9yIGEgbm9uLW5lZ2F0aXZlIGBudW1iZXJgIHJlcHJlc2VudGluZyBhbiBpbnRlZ2VyXG4gKiB3aXRoaW4gcmFuZ2Ugb2YgW2ludGVnZXJzIHNhZmVseSByZXByZXNlbnRhYmxlIGluXG4gKiBmbG9hdGluZyBwb2ludF0oaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1udW1iZXIuaXNzYWZlaW50ZWdlcikuXG4gKlxuICogQHBhcmFtIHthbnl9IGFsbGVnZWROdW1cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBpc05hdChhbGxlZ2VkTnVtKXtcbmlmKHR5cGVvZiBhbGxlZ2VkTnVtPT09J2JpZ2ludCcpe1xucmV0dXJuIGFsbGVnZWROdW0+PTA7XG4gfVxuXG5yZXR1cm4gTnVtYmVyLmlzU2FmZUludGVnZXIoYWxsZWdlZE51bSkmJmFsbGVnZWROdW0+PTA7XG4gfVxuXG4vKipcbiAqIElmIGBhbGxlZ2VkTnVtYmVyYCBwYXNzZXMgdGhlIGBpc05hdGAgdGVzdCwgdGhlbiByZXR1cm4gaXQgYXMgYSBiaWdpbnQuXG4gKiBPdGhlcndpc2UgdGhyb3cgYW4gYXBwcm9wcmlhdGUgZXJyb3IuXG4gKlxuICogSWYgYGFsbGVnZWROdW1gIGlzIG5laXRoZXIgYSBiaWdpbnQgbm9yIGEgbnVtYmVyLCBgTmF0YCB0aHJvd3MgYSBgVHlwZUVycm9yYC5cbiAqIE90aGVyd2lzZSwgaWYgaXQgaXMgbm90IGEgW3NhZmVseVxuICogcmVwcmVzZW50YWJsZV0oaHR0cHM6Ly9lc2Rpc2N1c3Mub3JnL3RvcGljL21vcmUtbnVtZXJpYy1jb25zdGFudHMtcGxlYXNlLWVzcGVjaWFsbHktZXBzaWxvbiNjb250ZW50LTE0KVxuICogbm9uLW5lZ2F0aXZlIGludGVnZXIsIGBOYXRgIHRocm93cyBhIGBSYW5nZUVycm9yYC5cbiAqIE90aGVyd2lzZSwgaXQgaXMgY29udmVydGVkIHRvIGEgYmlnaW50IGlmIG5lY2Vzc2FyeSBhbmQgcmV0dXJuZWQuXG4gKlxuICogQHBhcmFtIHtiaWdpbnQgfCBudW1iZXJ9IGFsbGVnZWROdW1cbiAqIEByZXR1cm5zIHtiaWdpbnR9XG4gKi9cbmZ1bmN0aW9uIE5hdChhbGxlZ2VkTnVtKXtcbmlmKHR5cGVvZiBhbGxlZ2VkTnVtPT09J2JpZ2ludCcpe1xuaWYoYWxsZWdlZE51bTwwKXtcbnRocm93IG5ldyBSYW5nZUVycm9yKCBgJHthbGxlZ2VkTnVtfSBpcyBuZWdhdGl2ZWApO1xuIH1cbnJldHVybiBhbGxlZ2VkTnVtO1xuIH1cblxuaWYodHlwZW9mIGFsbGVnZWROdW09PT0nbnVtYmVyJyl7XG5pZighTnVtYmVyLmlzU2FmZUludGVnZXIoYWxsZWdlZE51bSkpe1xudGhyb3cgbmV3IFJhbmdlRXJyb3IoIGAke2FsbGVnZWROdW19IG5vdCBhIHNhZmUgaW50ZWdlcmApO1xuIH1cbmlmKGFsbGVnZWROdW08MCl7XG50aHJvdyBuZXcgUmFuZ2VFcnJvciggYCR7YWxsZWdlZE51bX0gaXMgbmVnYXRpdmVgKTtcbiB9XG5yZXR1cm4gQmlnSW50KGFsbGVnZWROdW0pO1xuIH1cblxudGhyb3cgbmV3IFR5cGVFcnJvcihcbiBgJHthbGxlZ2VkTnVtfSBpcyBhICR7dHlwZW9mIGFsbGVnZWROdW19IGJ1dCBtdXN0IGJlIGEgYmlnaW50IG9yIGEgbnVtYmVyYCk7XG5cbiB9XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNOYXQiOlsiaXNOYXQiXSwiTmF0IjpbIk5hdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABdze4OVwEAAFcBAAAjAAAAQGFnb3JpYy9ub3RpZmllci12MC41LjEvZXhwb3J0ZWQuanN7ImltcG9ydHMiOlsiLi9zcmMvdHlwZXMtYW1iaWVudC5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3NyYy90eXBlcy1hbWJpZW50LmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB3Sz4jox0AAKMdAAAzAAAAQGFnb3JpYy9ub3RpZmllci12MC41LjEvc3JjL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzeyJpbXBvcnRzIjpbIi4vdHlwZXMtYW1iaWVudC5qcyIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsibWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIiLCJvYnNlcnZlSXRlcmF0aW9uIiwib2JzZXJ2ZUl0ZXJhdG9yIiwib2JzZXJ2ZU5vdGlmaWVyIiwidXBkYXRlRnJvbUl0ZXJhYmxlIiwidXBkYXRlRnJvbU5vdGlmaWVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEUsRmFyOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV0sW1wiLi90eXBlcy1hbWJpZW50LmpzXCIsIFtdXV0pOyAgIFxuXG5cblxuXG5cblxuLyoqXG4gKiBBZGFwdG9yIGZyb20gYSBub3RpZmllclAgdG8gYW4gYXN5bmMgaXRlcmFibGUuXG4gKiBUaGUgbm90aWZpZXJQIGNhbiBiZSBhbnkgb2JqZWN0IHRoYXQgaGFzIGFuIGV2ZW50dWFsbHkgaW52b2NhYmxlXG4gKiBgZ2V0VXBkYXRlU2luY2VgIG1ldGhvZCB0aGF0IGJlaGF2ZXMgYWNjb3JkaW5nIHRvIHRoZSBub3RpZmllclxuICogc3BlYy4gVGhpcyBjYW4gYmUgYSBub3RpZmllciwgYSBwcm9taXNlIGZvciBhIGxvY2FsIG9yIHJlbW90ZVxuICogbm90aWZpZXIsIG9yIGEgcHJlc2VuY2Ugb2YgYSByZW1vdGUgbm90aWZpZXIuXG4gKlxuICogSXQgaXMgYWxzbyB1c2VkIGludGVybmFsbHkgYnkgbm90aWZpZXIuanMgc28gdGhhdCBhIG5vdGlmaWVyIGl0c2VsZiBpcyBhblxuICogYXN5bmMgaXRlcmFibGUuXG4gKlxuICogQW4gYXN5bmMgaXRlcmFibGUgaXMgYW4gb2JqZWN0IHdpdGggYSBgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpYCBtZXRob2RcbiAqIHRoYXQgcmV0dXJucyBhbiBhc3luYyBpdGVyYXRvci4gVGhlIGFzeW5jIGl0ZXJhdG9yIHdlIHJldHVybiBoZXJlIGhhcyBvbmx5XG4gKiBhIGBuZXh0KClgIG1ldGhvZCwgd2l0aG91dCB0aGUgb3B0aW9uYWwgYHJldHVybmAgYW5kIGB0aHJvd2AgbWV0aG9kcy4gVGhlXG4gKiBvbWl0dGVkIG1ldGhvZHMsIGlmIHByZXNlbnQsIHdvdWxkIGJlIHVzZWQgYnkgdGhlIGZvci9hd2FpdC9vZiBsb29wIHRvXG4gKiBpbmZvcm0gdGhlIGl0ZXJhdG9yIG9mIGVhcmx5IHRlcm1pbmF0aW9uLiBCdXQgdGhpcyBhZGFwdG9yIHdvdWxkIG5vdCBkb1xuICogYW55dGhpbmcgdXNlZnVsIGluIHJlYWN0aW9uIHRvIHRoaXMgbm90aWZpY2F0aW9uLlxuICpcbiAqIEFuIGFzeW5jIGl0ZXJhdG9yJ3MgYG5leHQoKWAgbWV0aG9kIHJldHVybnMgYSBwcm9taXNlIGZvciBhbiBpdGVyYXRpb25cbiAqIHJlc3VsdC4gQW4gaXRlcmF0aW9uIHJlc3VsdCBpcyBhIHJlY29yZCB3aXRoIGB2YWx1ZWAgYW5kIGBkb25lYCBwcm9wZXJ0aWVzLlxuICpcbiAqIFRoZSBwdXJwb3NlIG9mIGJ1aWxkaW5nIG9uIHRoZSBub3RpZmllciBwcm90b2NvbCBpcyB0byBoYXZlIGEgbG9zc3lcbiAqIGFkYXB0b3IsIHdoZXJlIGludGVybWVkaWF0ZSByZXN1bHRzIGNhbiBiZSBtaXNzZWQgaW4gZmF2b3Igb2YgbW9yZSByZWNlbnRcbiAqIHJlc3VsdHMgd2hpY2ggYXJlIHRoZXJlZm9yZSBsZXNzIHN0YWxlLiBTZWVcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvZG9jdW1lbnRhdGlvbi9ibG9iL21hc3Rlci9tYWluL2Rpc3RyaWJ1dGVkLXByb2dyYW1taW5nLm1kI25vdGlmaWVyc1xuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8QmFzZU5vdGlmaWVyPFQ+Pn0gbm90aWZpZXJQXG4gKiBAcmV0dXJucyB7Q29uc2lzdGVudEFzeW5jSXRlcmFibGU8VD59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllcj0obm90aWZpZXJQKT0+e1xucmV0dXJuIEZhcignYXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllcicse1xuW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTooKT0+e1xuLyoqIEB0eXBlIHtVcGRhdGVDb3VudH0gKi9cbmxldCBsb2NhbFVwZGF0ZUNvdW50O1xuLyoqIEB0eXBlIHtQcm9taXNlPHt2YWx1ZTogVCwgZG9uZTogYm9vbGVhbn0+IHwgdW5kZWZpbmVkfSAqL1xubGV0IG15SXRlcmF0aW9uUmVzdWx0UDtcbnJldHVybiBGYXIoJ2FzeW5jSXRlcmF0b3JGcm9tTm90aWZpZXInLHtcbm5leHQ6KCk9PntcbmlmKCFteUl0ZXJhdGlvblJlc3VsdFApe1xuLyogSW4gdGhpcyBhZGFwdG9yLCBvbmNlIGBuZXh0KClgIGlzIGNhbGxlZCBhbmQgcmV0dXJucyBhbiovXG4vKiB1bnJlc29sdmVkIHByb21pc2UsIGBteUl0ZXJhdGlvblJlc3VsdFBgLCBhbmQgdW50aWwqL1xuLyogYG15SXRlcmF0aW9uUmVzdWx0UGAgaXMgZnVsZmlsbGVkIHdpdGggYW4qL1xuLyogaXRlcmF0aW9uIHJlc3VsdCwgZnVydGhlciBgbmV4dCgpYCBjYWxscyB3aWxsIHJldHVybiB0aGUgc2FtZSovXG4vKiBgbXlJdGVyYXRpb25SZXN1bHRQYCBwcm9taXNlIGFnYWluIHdpdGhvdXQgYXNraW5nIHRoZSBub3RpZmllciovXG4vKiBmb3IgbW9yZSB1cGRhdGVzLiBJZiB0aGVyZSdzIGFscmVhZHkgYW4gdW5hbnN3ZXJlZCBhc2sgaW4gdGhlKi9cbi8qIGFpciwgYWxsIGZ1cnRoZXIgYXNrcyBzaG91bGQganVzdCByZXVzZSB0aGUgcmVzdWx0IG9mIHRoYXQgb25lLiovXG4vKiovXG4vKiBUaGlzIHJldXNlIGJlaGF2aW9yIGlzIG9ubHkgbmVlZGVkIGZvciBjb2RlIHRoYXQgdXNlcyB0aGUgYXN5bmMqL1xuLyogaXRlcmF0b3IgcHJvdG9jb2wgZXhwbGljaXRseS4gV2hlbiB0aGlzIGFzeW5jIGl0ZXJhdG9yIGlzKi9cbi8qIGNvbnN1bWVkIGJ5IGEgZm9yL2F3YWl0L29mIGxvb3AsIGBuZXh0KClgIHdpbGwgb25seSBiZSBjYWxsZWQqL1xuLyogYWZ0ZXIgdGhlIHByb21pc2UgZm9yIHRoZSBwcmV2aW91cyBpdGVyYXRpb24gcmVzdWx0IGhhcyovXG4vKiBmdWxmaWxsZWQuIElmIGl0IGZ1bGZpbGxzIHdpdGggYGRvbmU6IHRydWVgLCB0aGUgZm9yL2F3YWl0L29mKi9cbi8qIGxvb3Agd2lsbCBuZXZlciBjYWxsIGBuZXh0KClgIGFnYWluLiovXG4vKiovXG4vKiBTZWUqL1xuLyogaHR0cHM6Ly8yYWxpdHkuY29tLzIwMTYvMTAvYXN5bmNocm9ub3VzLWl0ZXJhdGlvbi5odG1sI3F1ZXVpbmctbmV4dCgpLWludm9jYXRpb25zKi9cbi8qIGZvciBhbiBleHBsaWNpdCB1c2UgdGhhdCBzZW5kcyBgbmV4dCgpYCB3aXRob3V0IHdhaXRpbmcuKi9cbm15SXRlcmF0aW9uUmVzdWx0UD1FKG5vdGlmaWVyUCkuXG5nZXRVcGRhdGVTaW5jZShsb2NhbFVwZGF0ZUNvdW50KS5cbnRoZW4oKHt2YWx1ZSx1cGRhdGVDb3VudH0pPT57XG5sb2NhbFVwZGF0ZUNvdW50PXVwZGF0ZUNvdW50O1xuY29uc3QgZG9uZT1sb2NhbFVwZGF0ZUNvdW50PT09dW5kZWZpbmVkO1xuaWYoIWRvbmUpe1xuLyogT25jZSB0aGUgb3V0c3RhbmRpbmcgcXVlc3Rpb24gaGFzIGJlZW4gYW5zd2VyZWQsIHN0b3AqL1xuLyogdXNpbmcgdGhhdCBhbnN3ZXIsIHNvIGFueSBmdXJ0aGVyIGBuZXh0KClgIHF1ZXN0aW9ucyovXG4vKiBjYXVzZSBhIG5ldyBgZ2V0VXBkYXRlU2luY2VgIHJlcXVlc3QuKi9cbi8qKi9cbi8qIEJ1dCBvbmx5IGlmIG1vcmUgYW5zd2VycyBhcmUgZXhwZWN0ZWQuIE9uY2UgdGhlIG5vdGlmaWVyKi9cbi8qIGlzIGBkb25lYCwgdGhhdCB3YXMgdGhlIGxhc3QgYW5zd2VyIHNvIHJldXNlIGl0IGZvcmV2ZXIuKi9cbm15SXRlcmF0aW9uUmVzdWx0UD11bmRlZmluZWQ7XG4gfVxucmV0dXJuIGhhcmRlbih7dmFsdWUsZG9uZX0pO1xuIH0pO1xuIH1cbi8qIHh4eCBoaW50IGZvciB0eXBlIGNoZWNrZXIqL1xuYXNzZXJ0KG15SXRlcmF0aW9uUmVzdWx0UCk7XG5yZXR1cm4gbXlJdGVyYXRpb25SZXN1bHRQO1xuIH19KTtcblxuIH19KTtcblxuIH07XG5cbi8qKlxuICogVGhpcyBhZHZhbmNlcyBgYXN5bmNJdGVyYXRvclBgIHVwZGF0aW5nIGBpdGVyYXRpb25PYnNlcnZlcmAgd2l0aCBlYWNoXG4gKiBzdWNjZXNzaXZlIHZhbHVlLiBUaGUgYGl0ZXJhdGlvbk9ic2VydmVyYCBtYXkgb25seSBiZSBpbnRlcmVzdGVkIGluIGNlcnRhaW5cbiAqIG9jY3VycmVuY2VzIChgdXBkYXRlU3RhdGVgLCBgZmluaXNoYCwgYGZhaWxgKSwgc28gZm9yIGNvbnZlbmllbmNlLFxuICogYG9ic2VydmVJdGVyYXRvcmAgZmVhdHVyZSB0ZXN0cyBmb3IgdGhvc2UgbWV0aG9kcyBiZWZvcmUgY2FsbGluZyB0aGVtLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8QXN5bmNJdGVyYXRvcjxUPj59IGFzeW5jSXRlcmF0b3JQXG4gKiBAcGFyYW0ge1BhcnRpYWw8SXRlcmF0aW9uT2JzZXJ2ZXI8VD4+fSBpdGVyYXRpb25PYnNlcnZlclxuICogQHJldHVybnMge1Byb21pc2U8dW5kZWZpbmVkPn1cbiAqLyRo4oCNX29uY2UubWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIobWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIpO1xuY29uc3QgICAgICAgIG9ic2VydmVJdGVyYXRvcj0oYXN5bmNJdGVyYXRvclAsaXRlcmF0aW9uT2JzZXJ2ZXIpPT57XG5yZXR1cm4gbmV3IFByb21pc2UoKGFjayxvYnNlcnZlckVycm9yKT0+e1xuY29uc3QgcmVjdXI9KCk9PntcbkUud2hlbihcbkUoYXN5bmNJdGVyYXRvclApLm5leHQoKSxcbih7dmFsdWUsZG9uZX0pPT57XG5pZihkb25lKXtcbml0ZXJhdGlvbk9ic2VydmVyLmZpbmlzaCYmaXRlcmF0aW9uT2JzZXJ2ZXIuZmluaXNoKHZhbHVlKTtcbmFjayh1bmRlZmluZWQpO1xuIH1lbHNle1xuaXRlcmF0aW9uT2JzZXJ2ZXIudXBkYXRlU3RhdGUmJlxuaXRlcmF0aW9uT2JzZXJ2ZXIudXBkYXRlU3RhdGUodmFsdWUpO1xucmVjdXIoKTtcbiB9XG4gfSxcbihyZWFzb24pPT57XG5pdGVyYXRpb25PYnNlcnZlci5mYWlsJiZpdGVyYXRpb25PYnNlcnZlci5mYWlsKHJlYXNvbik7XG5hY2sodW5kZWZpbmVkKTtcbiB9KS5cbmNhdGNoKG9ic2VydmVyRXJyb3IpO1xuIH07XG5yZWN1cigpO1xuIH0pO1xuIH07XG5cbi8qKlxuICogVGhpcyByZWFkcyBmcm9tIGBhc3luY0l0ZXJhYmxlUGAgdXBkYXRpbmcgYGl0ZXJhdGlvbk9ic2VydmVyYCB3aXRoIGVhY2hcbiAqIHN1Y2Nlc3NpdmUgdmFsdWUuIFRoZSBgaXRlcmF0aW9uT2JzZXJ2ZXJgIG1heSBvbmx5IGJlIGludGVyZXN0ZWQgaW4gY2VydGFpblxuICogb2NjdXJyZW5jZXMgKGB1cGRhdGVTdGF0ZWAsIGBmaW5pc2hgLCBgZmFpbGApLCBzbyBmb3IgY29udmVuaWVuY2UsXG4gKiBgb2JzZXJ2ZUl0ZXJhdGlvbmAgZmVhdHVyZSB0ZXN0cyBmb3IgdGhvc2UgbWV0aG9kcyBiZWZvcmUgY2FsbGluZyB0aGVtLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8QXN5bmNJdGVyYWJsZTxUPj59IGFzeW5jSXRlcmFibGVQXG4gKiBAcGFyYW0ge1BhcnRpYWw8SXRlcmF0aW9uT2JzZXJ2ZXI8VD4+fSBpdGVyYXRpb25PYnNlcnZlclxuICogQHJldHVybnMge1Byb21pc2U8dW5kZWZpbmVkPn1cbiAqLyRo4oCNX29uY2Uub2JzZXJ2ZUl0ZXJhdG9yKG9ic2VydmVJdGVyYXRvcik7XG5jb25zdCAgICAgICAgb2JzZXJ2ZUl0ZXJhdGlvbj0oYXN5bmNJdGVyYWJsZVAsaXRlcmF0aW9uT2JzZXJ2ZXIpPT57XG5jb25zdCBpdGVyYXRvclA9RShhc3luY0l0ZXJhYmxlUClbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk7XG5yZXR1cm4gb2JzZXJ2ZUl0ZXJhdG9yKGl0ZXJhdG9yUCxpdGVyYXRpb25PYnNlcnZlcik7XG4gfTtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgYG9ic2VydmVJdGVyYXRpb25gIGluc3RlYWRcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1BhcnRpYWw8SXRlcmF0aW9uT2JzZXJ2ZXI8VD4+fSBpdGVyYXRpb25PYnNlcnZlclxuICogQHBhcmFtIHtFUmVmPEFzeW5jSXRlcmFibGU8VD4+fSBhc3luY0l0ZXJhYmxlUFxuICogQHJldHVybnMge1Byb21pc2U8dW5kZWZpbmVkPn1cbiAqLyRo4oCNX29uY2Uub2JzZXJ2ZUl0ZXJhdGlvbihvYnNlcnZlSXRlcmF0aW9uKTtcbmNvbnN0ICAgICAgICB1cGRhdGVGcm9tSXRlcmFibGU9KGl0ZXJhdGlvbk9ic2VydmVyLGFzeW5jSXRlcmFibGVQKT0+XG5vYnNlcnZlSXRlcmF0aW9uKGFzeW5jSXRlcmFibGVQLGl0ZXJhdGlvbk9ic2VydmVyKTtcblxuLyoqXG4gKiBBcyB1cGRhdGVzIGNvbWUgaW4gZnJvbSB0aGUgcG9zc2libHkgcmVtb3RlIGBub3RpZmllclBgLCB1cGRhdGVcbiAqIHRoZSBsb2NhbCBgdXBkYXRlcmAuIFNpbmNlIHRoZSB1cGRhdGVzIGNvbWUgZnJvbSBhIG5vdGlmaWVyLCB0aGV5XG4gKiBhcmUgbG9zc3ksIGkuZS4sIG9uY2UgYSBtb3JlIHJlY2VudCBzdGF0ZSBjYW4gYmUgcmVwb3J0ZWQsIGxlc3MgcmVjZW50XG4gKiBzdGF0ZXMgYXJlIGFzc3VtZWQgaXJyZWxldmFudCBhbmQgZHJvcHBlZC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPE5vdGlmaWVyPFQ+Pn0gbm90aWZpZXJQXG4gKiBAcGFyYW0ge1BhcnRpYWw8SXRlcmF0aW9uT2JzZXJ2ZXI8VD4+fSBpdGVyYXRpb25PYnNlcnZlclxuICogQHJldHVybnMge1Byb21pc2U8dW5kZWZpbmVkPn1cbiAqLyRo4oCNX29uY2UudXBkYXRlRnJvbUl0ZXJhYmxlKHVwZGF0ZUZyb21JdGVyYWJsZSk7XG5jb25zdCAgICAgICAgb2JzZXJ2ZU5vdGlmaWVyPShub3RpZmllclAsaXRlcmF0aW9uT2JzZXJ2ZXIpPT5cbm9ic2VydmVJdGVyYXRpb24obWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIobm90aWZpZXJQKSxpdGVyYXRpb25PYnNlcnZlcik7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlICdvYnNlcnZlTm90aWZpZXJgIGluc3RlYWQuXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtQYXJ0aWFsPEl0ZXJhdGlvbk9ic2VydmVyPFQ+Pn0gaXRlcmF0aW9uT2JzZXJ2ZXJcbiAqIEBwYXJhbSB7RVJlZjxOb3RpZmllcjxUPj59IG5vdGlmaWVyUFxuICogQHJldHVybnMge1Byb21pc2U8dW5kZWZpbmVkPn1cbiAqLyRo4oCNX29uY2Uub2JzZXJ2ZU5vdGlmaWVyKG9ic2VydmVOb3RpZmllcik7XG5jb25zdCAgICAgICAgdXBkYXRlRnJvbU5vdGlmaWVyPShpdGVyYXRpb25PYnNlcnZlcixub3RpZmllclApPT5cbm9ic2VydmVJdGVyYXRpb24obWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIobm90aWZpZXJQKSxpdGVyYXRpb25PYnNlcnZlcik7JGjigI1fb25jZS51cGRhdGVGcm9tTm90aWZpZXIodXBkYXRlRnJvbU5vdGlmaWVyKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllciI6WyJtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllciJdLCJvYnNlcnZlSXRlcmF0b3IiOlsib2JzZXJ2ZUl0ZXJhdG9yIl0sIm9ic2VydmVJdGVyYXRpb24iOlsib2JzZXJ2ZUl0ZXJhdGlvbiJdLCJ1cGRhdGVGcm9tSXRlcmFibGUiOlsidXBkYXRlRnJvbUl0ZXJhYmxlIl0sIm9ic2VydmVOb3RpZmllciI6WyJvYnNlcnZlTm90aWZpZXIiXSwidXBkYXRlRnJvbU5vdGlmaWVyIjpbInVwZGF0ZUZyb21Ob3RpZmllciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADPkEiLAAsAAAALAAAkAAAAQGFnb3JpYy9ub3RpZmllci12MC41LjEvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vYXN5bmNJdGVyYWJsZUFkYXB0b3IuanMiLCIuL25vdGlmaWVyLmpzIiwiLi9wdWJsaXNoLWtpdC5qcyIsIi4vc3RvcmVzdWIuanMiLCIuL3N1YnNjcmliZXIuanMiXSwiZXhwb3J0cyI6WyJTdWJzY3JpYmVyU2hhcGUiLCJtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllciIsIm1ha2VOb3RpZmllciIsIm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlIiwibWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIiLCJtYWtlTm90aWZpZXJLaXQiLCJtYWtlUHVibGlzaEtpdCIsIm1ha2VTdWJzY3JpcHRpb24iLCJtYWtlU3Vic2NyaXB0aW9uS2l0Iiwib2JzZXJ2ZUl0ZXJhdGlvbiIsIm9ic2VydmVJdGVyYXRvciIsIm9ic2VydmVOb3RpZmllciIsInN1YnNjcmliZUVhY2giLCJzdWJzY3JpYmVMYXRlc3QiLCJ1cGRhdGVGcm9tSXRlcmFibGUiLCJ1cGRhdGVGcm9tTm90aWZpZXIiLCJ2aXZpZnlEdXJhYmxlUHVibGlzaEtpdCJdLCJyZWV4cG9ydHMiOlsiLi9zdG9yZXN1Yi5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vcHVibGlzaC1raXQuanNcIiwgW1tcIm1ha2VQdWJsaXNoS2l0XCIsIFskaOKAjV9saXZlW1wibWFrZVB1Ymxpc2hLaXRcIl1dXSxbXCJzdWJzY3JpYmVFYWNoXCIsIFskaOKAjV9saXZlW1wic3Vic2NyaWJlRWFjaFwiXV1dLFtcInN1YnNjcmliZUxhdGVzdFwiLCBbJGjigI1fbGl2ZVtcInN1YnNjcmliZUxhdGVzdFwiXV1dLFtcInZpdmlmeUR1cmFibGVQdWJsaXNoS2l0XCIsIFskaOKAjV9saXZlW1widml2aWZ5RHVyYWJsZVB1Ymxpc2hLaXRcIl1dXSxbXCJTdWJzY3JpYmVyU2hhcGVcIiwgWyRo4oCNX2xpdmVbXCJTdWJzY3JpYmVyU2hhcGVcIl1dXV1dLFtcIi4vbm90aWZpZXIuanNcIiwgW1tcIm1ha2VOb3RpZmllclwiLCBbJGjigI1fbGl2ZVtcIm1ha2VOb3RpZmllclwiXV1dLFtcIm1ha2VOb3RpZmllcktpdFwiLCBbJGjigI1fbGl2ZVtcIm1ha2VOb3RpZmllcktpdFwiXV1dLFtcIm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlXCIsIFskaOKAjV9saXZlW1wibWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGVcIl1dXSxbXCJtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlclwiLCBbJGjigI1fbGl2ZVtcIm1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyXCJdXV1dXSxbXCIuL3N1YnNjcmliZXIuanNcIiwgW1tcIm1ha2VTdWJzY3JpcHRpb25cIiwgWyRo4oCNX2xpdmVbXCJtYWtlU3Vic2NyaXB0aW9uXCJdXV0sW1wibWFrZVN1YnNjcmlwdGlvbktpdFwiLCBbJGjigI1fbGl2ZVtcIm1ha2VTdWJzY3JpcHRpb25LaXRcIl1dXV1dLFtcIi4vYXN5bmNJdGVyYWJsZUFkYXB0b3IuanNcIiwgW1tcIm9ic2VydmVOb3RpZmllclwiLCBbJGjigI1fbGl2ZVtcIm9ic2VydmVOb3RpZmllclwiXV1dLFtcIm9ic2VydmVJdGVyYXRvclwiLCBbJGjigI1fbGl2ZVtcIm9ic2VydmVJdGVyYXRvclwiXV1dLFtcIm9ic2VydmVJdGVyYXRpb25cIiwgWyRo4oCNX2xpdmVbXCJvYnNlcnZlSXRlcmF0aW9uXCJdXV0sW1widXBkYXRlRnJvbUl0ZXJhYmxlXCIsIFskaOKAjV9saXZlW1widXBkYXRlRnJvbUl0ZXJhYmxlXCJdXV0sW1widXBkYXRlRnJvbU5vdGlmaWVyXCIsIFskaOKAjV9saXZlW1widXBkYXRlRnJvbU5vdGlmaWVyXCJdXV0sW1wibWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXJcIiwgWyRo4oCNX2xpdmVbXCJtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllclwiXV1dXV0sW1wiLi9zdG9yZXN1Yi5qc1wiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6eyJtYWtlUHVibGlzaEtpdCI6WyJtYWtlUHVibGlzaEtpdCIsZmFsc2VdLCJzdWJzY3JpYmVFYWNoIjpbInN1YnNjcmliZUVhY2giLGZhbHNlXSwic3Vic2NyaWJlTGF0ZXN0IjpbInN1YnNjcmliZUxhdGVzdCIsZmFsc2VdLCJ2aXZpZnlEdXJhYmxlUHVibGlzaEtpdCI6WyJ2aXZpZnlEdXJhYmxlUHVibGlzaEtpdCIsZmFsc2VdLCJTdWJzY3JpYmVyU2hhcGUiOlsiU3Vic2NyaWJlclNoYXBlIixmYWxzZV0sIm1ha2VOb3RpZmllciI6WyJtYWtlTm90aWZpZXIiLGZhbHNlXSwibWFrZU5vdGlmaWVyS2l0IjpbIm1ha2VOb3RpZmllcktpdCIsZmFsc2VdLCJtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSI6WyJtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSIsZmFsc2VdLCJtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlciI6WyJtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlciIsZmFsc2VdLCJtYWtlU3Vic2NyaXB0aW9uIjpbIm1ha2VTdWJzY3JpcHRpb24iLGZhbHNlXSwibWFrZVN1YnNjcmlwdGlvbktpdCI6WyJtYWtlU3Vic2NyaXB0aW9uS2l0IixmYWxzZV0sIm9ic2VydmVOb3RpZmllciI6WyJvYnNlcnZlTm90aWZpZXIiLGZhbHNlXSwib2JzZXJ2ZUl0ZXJhdG9yIjpbIm9ic2VydmVJdGVyYXRvciIsZmFsc2VdLCJvYnNlcnZlSXRlcmF0aW9uIjpbIm9ic2VydmVJdGVyYXRpb24iLGZhbHNlXSwidXBkYXRlRnJvbUl0ZXJhYmxlIjpbInVwZGF0ZUZyb21JdGVyYWJsZSIsZmFsc2VdLCJ1cGRhdGVGcm9tTm90aWZpZXIiOlsidXBkYXRlRnJvbU5vdGlmaWVyIixmYWxzZV0sIm1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyIjpbIm1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyIixmYWxzZV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADmvR3hAKgAAQCoAACcAAABAYWdvcmljL25vdGlmaWVyLXYwLjUuMS9zcmMvbm90aWZpZXIuanN7ImltcG9ydHMiOlsiLi9hc3luY0l0ZXJhYmxlQWRhcHRvci5qcyIsIi4vdHlwZXMtYW1iaWVudC5qcyIsIkBhZ29yaWMvYXNzZXJ0IiwiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL21hcnNoYWwiLCJAZW5kby9wcm9taXNlLWtpdCJdLCJleHBvcnRzIjpbIm1ha2VOb3RpZmllciIsIm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlIiwibWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIiLCJtYWtlTm90aWZpZXJLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0LG1ha2VQcm9taXNlS2l0LEUsRmFyLG1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvYXNzZXJ0XCIsIFtbXCJhc3NlcnRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydCA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wibWFrZVByb21pc2VLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VQcm9taXNlS2l0ID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV0sW1wiLi9hc3luY0l0ZXJhYmxlQWRhcHRvci5qc1wiLCBbW1wibWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXJcIiwgWyRo4oCNX2EgPT4gKG1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyID0gJGjigI1fYSldXV1dLFtcIi4vdHlwZXMtYW1iaWVudC5qc1wiLCBbXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxCYXNlTm90aWZpZXI8VD4gfCBOb3RpZmllckludGVybmFsczxUPj59IHNoYXJhYmxlSW50ZXJuYWxzUFxuICogQHJldHVybnMge0FzeW5jSXRlcmFibGU8VD4gJiBTaGFyYWJsZU5vdGlmaWVyPFQ+fVxuICovXG5jb25zdCAgICAgICAgbWFrZU5vdGlmaWVyPShzaGFyYWJsZUludGVybmFsc1ApPT57XG5jb25zdCBhc3luY0l0ZXJhYmxlPW1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyKHNoYXJhYmxlSW50ZXJuYWxzUCk7XG5cbi8qKiBAdHlwZSB7QXN5bmNJdGVyYWJsZTxUPiAmIFNoYXJhYmxlTm90aWZpZXI8VD59ICovXG5jb25zdCBub3RpZmllcj1GYXIoJ25vdGlmaWVyJyx7XG4uLi5hc3luY0l0ZXJhYmxlLFxuXG4vKipcbiAqIFVzZSB0aGlzIHRvIGRpc3RyaWJ1dGUgYSBOb3RpZmllciBlZmZpY2llbnRseSBvdmVyIHRoZSBuZXR3b3JrLFxuICogYnkgb2J0YWluaW5nIHRoaXMgZnJvbSB0aGUgTm90aWZpZXIgdG8gYmUgcmVwbGljYXRlZCwgYW5kIGFwcGx5aW5nXG4gKiBgbWFrZU5vdGlmaWVyYCB0byBpdCBhdCB0aGUgbmV3IHNpdGUgdG8gZ2V0IGFuIGVxdWl2YWxlbnQgbG9jYWxcbiAqIE5vdGlmaWVyIGF0IHRoYXQgc2l0ZS5cbiAqL1xuZ2V0U2hhcmFibGVOb3RpZmllckludGVybmFsczooKT0+c2hhcmFibGVJbnRlcm5hbHNQLFxuZ2V0U3RvcmVLZXk6KCk9PmhhcmRlbih7bm90aWZpZXJ9KX0pO1xuXG5yZXR1cm4gbm90aWZpZXI7XG4gfTtcblxuLyoqXG4gKiBQcm9kdWNlcyBhIHBhaXIgb2Ygb2JqZWN0cywgd2hpY2ggYWxsb3cgYSBzZXJ2aWNlIHRvIHByb2R1Y2UgYSBzdHJlYW0gb2ZcbiAqIHVwZGF0ZSBwcm9taXNlcy5cbiAqXG4gKiBUaGUgaW5pdGlhbCBzdGF0ZSBhcmd1bWVudCBoYXMgdG8gYmUgdHJ1bHkgb3B0aW9uYWwgZXZlbiB0aG91Z2ggaXQgY2FuXG4gKiBiZSBhbnkgZmlyc3QgY2xhc3MgdmFsdWUgaW5jbHVkaW5nIGB1bmRlZmluZWRgLiBXZSBuZWVkIHRvIGRpc3Rpbmd1aXNoIHRoZVxuICogcHJlc2VuY2UgdnMgdGhlIGFic2VuY2Ugb2YgaXQsIHdoaWNoIHdlIGNhbm5vdCBkbyB3aXRoIHRoZSBvcHRpb25hbCBhcmd1bWVudFxuICogc3ludGF4LiBSYXRoZXIgd2UgdXNlIHRoZSBhcml0eSBvZiB0aGUgYGluaXRpYWxTdGF0ZUFycmAgYXJyYXkuXG4gKlxuICogSWYgbm8gaW5pdGlhbCBzdGF0ZSBpcyBwcm92aWRlZCB0byBgbWFrZU5vdGlmaWVyS2l0YCwgdGhlbiBpdCBzdGFydHMgd2l0aG91dFxuICogYW4gaW5pdGlhbCBzdGF0ZS4gSXRzIGluaXRpYWwgc3RhdGUgd2lsbCBpbnN0ZWFkIGJlIHRoZSBzdGF0ZSBvZiB0aGUgZmlyc3RcbiAqIHVwZGF0ZS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtbXSB8IFtUXX0gaW5pdGlhbFN0YXRlQXJyIHRoZSBmaXJzdCBzdGF0ZSB0byBiZSByZXR1cm5lZCAodHlwZWQgYXMgcmVzdCBhcnJheSB0byBwZXJtaXQgYHVuZGVmaW5lZGApXG4gKiBAcmV0dXJucyB7Tm90aWZpZXJSZWNvcmQ8VD59IHRoZSBub3RpZmllciBhbmQgdXBkYXRlclxuICovJGjigI1fb25jZS5tYWtlTm90aWZpZXIobWFrZU5vdGlmaWVyKTtcbmNvbnN0ICAgICAgICBtYWtlTm90aWZpZXJLaXQ9KC4uLmluaXRpYWxTdGF0ZUFycik9Pntcbi8qKiBAdHlwZSB7UHJvbWlzZVJlY29yZDxVcGRhdGVSZWNvcmQ8VD4+fHVuZGVmaW5lZH0gKi9cbmxldCBvcHROZXh0UHJvbWlzZUtpdDtcbi8qKiBAdHlwZSB7VXBkYXRlQ291bnQgJiAobnVtYmVyIHwgdW5kZWZpbmVkKX0gKi9cbmxldCBjdXJyZW50VXBkYXRlQ291bnQ9MTsvKiBhdm9pZCBmYWxzeSBudW1iZXJzKi9cbi8qKiBAdHlwZSB7VXBkYXRlUmVjb3JkPFQ+fHVuZGVmaW5lZH0gKi9cbmxldCBjdXJyZW50UmVzcG9uc2U7XG5cbmNvbnN0IGhhc1N0YXRlPSgpPT5jdXJyZW50UmVzcG9uc2UhPT11bmRlZmluZWQ7XG5cbmNvbnN0IGZpbmFsPSgpPT5jdXJyZW50VXBkYXRlQ291bnQ9PT11bmRlZmluZWQ7XG5cbmNvbnN0IGJhc2VOb3RpZmllcj1GYXIoJ2Jhc2VOb3RpZmllcicse1xuLyogTmFOIG1hdGNoZXMgbm90aGluZyovXG5nZXRVcGRhdGVTaW5jZSh1cGRhdGVDb3VudD1OYU4pe1xuaWYoXG5oYXNTdGF0ZSgpJiYoXG5maW5hbCgpfHxcbmN1cnJlbnRSZXNwb25zZSYmY3VycmVudFJlc3BvbnNlLnVwZGF0ZUNvdW50IT09dXBkYXRlQ291bnQpKVxue1xuLyogSWYgaGFzU3RhdGUoKSBhbmQgZWl0aGVyIGl0IGlzIGZpbmFsKCkgb3IgaXQgaXMqL1xuLyogbm90IHRoZSBzdGF0ZSBvZiB1cGRhdGVDb3VudCwgcmV0dXJuIHRoZSBjdXJyZW50IHN0YXRlLiovXG5hc3NlcnQoY3VycmVudFJlc3BvbnNlIT09dW5kZWZpbmVkKTtcbnJldHVybiBQcm9taXNlLnJlc29sdmUoY3VycmVudFJlc3BvbnNlKTtcbiB9XG4vKiBvdGhlcndpc2UgcmV0dXJuIGEgcHJvbWlzZSBmb3IgdGhlIG5leHQgc3RhdGUuKi9cbmlmKCFvcHROZXh0UHJvbWlzZUtpdCl7XG5vcHROZXh0UHJvbWlzZUtpdD1tYWtlUHJvbWlzZUtpdCgpO1xuIH1cbnJldHVybiBvcHROZXh0UHJvbWlzZUtpdC5wcm9taXNlO1xuIH19KTtcblxuXG5jb25zdCBub3RpZmllcj1GYXIoJ25vdGlmaWVyJyx7XG4uLi5tYWtlTm90aWZpZXIoYmFzZU5vdGlmaWVyKSxcbi4uLmJhc2VOb3RpZmllcn0pO1xuXG5cbmNvbnN0IHVwZGF0ZXI9RmFyKCd1cGRhdGVyJyx7XG51cGRhdGVTdGF0ZShzdGF0ZSl7XG5pZihmaW5hbCgpKXtcbnRocm93IG5ldyBFcnJvcignQ2Fubm90IHVwZGF0ZSBzdGF0ZSBhZnRlciB0ZXJtaW5hdGlvbi4nKTtcbiB9XG5cbi8qIGJlY29tZSBoYXNTdGF0ZSgpICYmICFmaW5hbCgpKi9cbmFzc2VydChjdXJyZW50VXBkYXRlQ291bnQpO1xuY3VycmVudFVwZGF0ZUNvdW50Kz0xO1xuY3VycmVudFJlc3BvbnNlPWhhcmRlbih7XG52YWx1ZTpzdGF0ZSxcbnVwZGF0ZUNvdW50OmN1cnJlbnRVcGRhdGVDb3VudH0pO1xuXG5pZihvcHROZXh0UHJvbWlzZUtpdCl7XG5vcHROZXh0UHJvbWlzZUtpdC5yZXNvbHZlKGN1cnJlbnRSZXNwb25zZSk7XG5vcHROZXh0UHJvbWlzZUtpdD11bmRlZmluZWQ7XG4gfVxuIH0sXG5cbmZpbmlzaChmaW5hbFN0YXRlKXtcbmlmKGZpbmFsKCkpe1xudGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZmluaXNoIGFmdGVyIHRlcm1pbmF0aW9uLicpO1xuIH1cblxuLyogYmVjb21lIGhhc1N0YXRlKCkgJiYgZmluYWwoKSovXG5jdXJyZW50VXBkYXRlQ291bnQ9dW5kZWZpbmVkO1xuY3VycmVudFJlc3BvbnNlPWhhcmRlbih7XG52YWx1ZTpmaW5hbFN0YXRlLFxudXBkYXRlQ291bnQ6Y3VycmVudFVwZGF0ZUNvdW50fSk7XG5cbmlmKG9wdE5leHRQcm9taXNlS2l0KXtcbm9wdE5leHRQcm9taXNlS2l0LnJlc29sdmUoY3VycmVudFJlc3BvbnNlKTtcbm9wdE5leHRQcm9taXNlS2l0PXVuZGVmaW5lZDtcbiB9XG4gfSxcblxuZmFpbChyZWFzb24pe1xuaWYoZmluYWwoKSl7XG50aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBmYWlsIGFmdGVyIHRlcm1pbmF0aW9uLicpO1xuIH1cblxuLyogYmVjb21lICFoYXNTdGF0ZSgpICYmIGZpbmFsKCkqL1xuY3VycmVudFVwZGF0ZUNvdW50PXVuZGVmaW5lZDtcbmN1cnJlbnRSZXNwb25zZT11bmRlZmluZWQ7XG5pZighb3B0TmV4dFByb21pc2VLaXQpe1xub3B0TmV4dFByb21pc2VLaXQ9bWFrZVByb21pc2VLaXQoKTtcbiB9XG4vKiBEb24ndCB0cmlnZ2VyIE5vZGUuanMncyBVbmhhbmRsZWRQcm9taXNlUmVqZWN0aW9uV2FybmluZyovXG5vcHROZXh0UHJvbWlzZUtpdC5wcm9taXNlLmNhdGNoKChfKT0+eyB9KTtcbm9wdE5leHRQcm9taXNlS2l0LnJlamVjdChyZWFzb24pO1xuIH19KTtcblxuXG5hc3NlcnQoaW5pdGlhbFN0YXRlQXJyLmxlbmd0aDw9MSwndG9vIG1hbnkgYXJndW1lbnRzJyk7XG5pZihpbml0aWFsU3RhdGVBcnIubGVuZ3RoPT09MSl7XG51cGRhdGVyLnVwZGF0ZVN0YXRlKGluaXRpYWxTdGF0ZUFyclswXSk7XG4gfVxuXG4vKiBub3RpZmllciBmYWNldCBpcyBzZXBhcmF0ZSBzbyBpdCBjYW4gYmUgaGFuZGVkIG91dCB3aGlsZSB1cGRhdGVyKi9cbi8qIGlzIHRpZ2h0bHkgaGVsZCovXG5yZXR1cm4gaGFyZGVuKHtub3RpZmllcix1cGRhdGVyfSk7XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPFN1YnNjcmliZXI8VD4+fSBzdWJzY3JpYmVyUFxuICogQHJldHVybnMge05vdGlmaWVyPFQ+fVxuICovJGjigI1fb25jZS5tYWtlTm90aWZpZXJLaXQobWFrZU5vdGlmaWVyS2l0KTtcbmNvbnN0ICAgICAgICBtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlcj0oc3Vic2NyaWJlclApPT57XG4vKiogQHR5cGUge2JpZ2ludH0gKi9cbmxldCBsYXRlc3RJbmJvdW5kQ291bnQ7XG4vKiogQHR5cGUge1VwZGF0ZUNvdW50ICYgYmlnaW50fSAqL1xubGV0IGxhdGVzdFVwZGF0ZUNvdW50PTBuO1xuLyoqIEB0eXBlIHtXZWFrTWFwPFB1YmxpY2F0aW9uUmVjb3JkPFQ+LCBQcm9taXNlPFVwZGF0ZVJlY29yZDxUPj4+fSAqL1xuY29uc3Qgb3V0Ym91bmRSZXN1bHRzPW5ldyBXZWFrTWFwKCk7XG5cbi8qKlxuICogQHBhcmFtIHtQdWJsaWNhdGlvblJlY29yZDxUPn0gcmVjb3JkXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxVcGRhdGVSZWNvcmQ8VD4+fVxuICovXG5jb25zdCB0cmFuc2xhdGVJbmJvdW5kUHVibGljYXRpb25SZWNvcmQ9KHJlY29yZCk9Pntcbi8qIExldmVyYWdlIGlkZW50aXR5IHByZXNlcnZhdGlvbiBvZiBgcmVjb3JkYC4qL1xuY29uc3QgZXhpc3RpbmdPdXRib3VuZFJlc3VsdD1vdXRib3VuZFJlc3VsdHMuZ2V0KHJlY29yZCk7XG5pZihleGlzdGluZ091dGJvdW5kUmVzdWx0KXtcbnJldHVybiBleGlzdGluZ091dGJvdW5kUmVzdWx0O1xuIH1cblxubGF0ZXN0SW5ib3VuZENvdW50PXJlY29yZC5wdWJsaXNoQ291bnQ7XG5sYXRlc3RVcGRhdGVDb3VudCs9MW47XG5jb25zdCByZXN1bHRQPUUud2hlbihyZWNvcmQuaGVhZCwoe3ZhbHVlLGRvbmV9KT0+e1xuaWYoZG9uZSl7XG4vKiBGaW5hbCByZXN1bHRzIGhhdmUgdW5kZWZpbmVkIHVwZGF0ZUNvdW50LiovXG5yZXR1cm4gaGFyZGVuKHt2YWx1ZSx1cGRhdGVDb3VudDp1bmRlZmluZWR9KTtcbiB9XG5yZXR1cm4gaGFyZGVuKHt2YWx1ZSx1cGRhdGVDb3VudDpsYXRlc3RVcGRhdGVDb3VudH0pO1xuIH0pO1xub3V0Ym91bmRSZXN1bHRzLnNldChyZWNvcmQscmVzdWx0UCk7XG5yZXR1cm4gcmVzdWx0UDtcbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZSB7QmFzZU5vdGlmaWVyPFQ+fVxuICovXG5jb25zdCBiYXNlTm90aWZpZXI9RmFyKCdiYXNlTm90aWZpZXInLHtcbmdldFVwZGF0ZVNpbmNlKHVwZGF0ZUNvdW50PS0xbil7XG5hc3NlcnQoXG51cGRhdGVDb3VudDw9bGF0ZXN0VXBkYXRlQ291bnQsXG4nYXJndW1lbnQgbXVzdCBiZSBhIHByZXZpb3VzbHktaXNzdWVkIHVwZGF0ZUNvdW50LicpO1xuXG5cbmlmKHVwZGF0ZUNvdW50PGxhdGVzdFVwZGF0ZUNvdW50KXtcbi8qIFJldHVybiB0aGUgbW9zdCByZWNlbnQgcmVzdWx0IHBvc3NpYmxlIHdpdGhvdXQgaW1wb3NpbmcgYW4gdW5uZWNlc3NhcnkgZGVsYXkuKi9cbnJldHVybiBFKHN1YnNjcmliZXJQKS5cbnN1YnNjcmliZUFmdGVyKCkuXG50aGVuKHRyYW5zbGF0ZUluYm91bmRQdWJsaWNhdGlvblJlY29yZCk7XG4gfVxuXG4vKiBSZXR1cm4gYSByZXN1bHQgdGhhdCBmb2xsb3dzIHRoZSBsYXN0LXJldHVybmVkIHJlc3VsdCwqL1xuLyogc2tpcHBpbmcgb3ZlciBpbnRlcm1lZGlhdGUgcmVzdWx0cyBpZiBsYXRlc3RJbmJvdW5kQ291bnQqL1xuLyogbm8gbG9uZ2VyIGNvcnJlc3BvbmRzIHdpdGggdGhlIGxhdGVzdCByZXN1bHQuKi9cbi8qIE5vdGUgdGhhdCB1bmxpa2Ugbm90aWZpZXJzIGFuZCBzdWJzY3JpYmVycyByZXNwZWN0aXZlbHkgcmV0dXJuZWQgYnkqL1xuLyogbWFrZU5vdGlmaWVyS2l0IGFuZCBtYWtlUHVibGlzaEtpdCwgdGhpcyByZXN1bHQgaXMgbm90IGd1YXJhbnRlZWQqL1xuLyogdG8gZm9sbG93IHRoZSByZXN1bHQgcmV0dXJuZWQgd2hlbiBhIG5vbi1sYXRlc3QgdXBkYXRlQ291bnQgaXMgcHJvdmlkZWQqL1xuLyogKGUuZy4sIGl0IGlzIHBvc3NpYmxlIGZvciBgbm90aWZpZXJGcm9tU3Vic2NyaWJlci5nZXRVcGRhdGVTaW5jZSgpYCBhbmQqL1xuLyogYG5vdGlmaWVyRnJvbVN1YnNjcmliZXIuZ2V0VXBkYXRlU2luY2UobGF0ZXN0VXBkYXRlQ291bnQpYCB0byBib3RoKi9cbi8qIHNldHRsZSB0byB0aGUgc2FtZSBvYmplY3QgYG5ld0xhdGVzdGAgd2hlcmUgYG5ld0xhdGVzdC51cGRhdGVDb3VudGAqL1xuLyogaXMgb25lIGdyZWF0ZXIgdGhhbiBgbGF0ZXN0VXBkYXRlQ291bnRgKS4qL1xucmV0dXJuIEUoc3Vic2NyaWJlclApLlxuc3Vic2NyaWJlQWZ0ZXIobGF0ZXN0SW5ib3VuZENvdW50KS5cbnRoZW4odHJhbnNsYXRlSW5ib3VuZFB1YmxpY2F0aW9uUmVjb3JkKTtcbiB9fSk7XG5cblxuLyoqIEB0eXBlIHtOb3RpZmllcjxUPn0gKi9cbmNvbnN0IG5vdGlmaWVyPUZhcignbm90aWZpZXInLHtcbi4uLm1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyKGJhc2VOb3RpZmllciksXG4uLi5iYXNlTm90aWZpZXIsXG5cbi8qKlxuICogVXNlIHRoaXMgdG8gZGlzdHJpYnV0ZSBhIE5vdGlmaWVyIGVmZmljaWVudGx5IG92ZXIgdGhlIG5ldHdvcmssXG4gKiBieSBvYnRhaW5pbmcgdGhpcyBmcm9tIHRoZSBOb3RpZmllciB0byBiZSByZXBsaWNhdGVkLCBhbmQgYXBwbHlpbmdcbiAqIGBtYWtlTm90aWZpZXJgIHRvIGl0IGF0IHRoZSBuZXcgc2l0ZSB0byBnZXQgYW4gZXF1aXZhbGVudCBsb2NhbFxuICogTm90aWZpZXIgYXQgdGhhdCBzaXRlLlxuICovXG5nZXRTaGFyYWJsZU5vdGlmaWVySW50ZXJuYWxzOigpPT5iYXNlTm90aWZpZXIsXG5nZXRTdG9yZUtleTooKT0+aGFyZGVuKHtub3RpZmllcn0pfSk7XG5cbnJldHVybiBub3RpZmllcjtcbiB9OyRo4oCNX29uY2UubWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIobWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIpO1xuaGFyZGVuKG1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyKTtcblxuLyoqXG4gKiBBZGFwdG9yIGZyb20gYXN5bmMgaXRlcmFibGUgdG8gbm90aWZpZXIuXG4gKlxuICogQGRlcHJlY2F0ZWQgVGhlIHJlc3VsdGluZyBub3RpZmllciBpcyBsb3NzbGVzcywgd2hpY2ggaXMgbm90IGRlc2lyYWJsZS5cbiAqIFByZWZlciBtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlciwgYW5kIHJlZmVyIHRvXG4gKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzU0MTMgYW5kXG4gKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvcHVsbC81Njk1IGZvciBjb250ZXh0LlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8QXN5bmNJdGVyYWJsZTxUPj59IGFzeW5jSXRlcmFibGVQXG4gKiBAcmV0dXJucyB7Tm90aWZpZXI8VD59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZT0oYXN5bmNJdGVyYWJsZVApPT57XG5jb25zdCBpdGVyYXRvclA9RShhc3luY0l0ZXJhYmxlUClbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk7XG5cbi8qKiBAdHlwZSB7UHJvbWlzZTxVcGRhdGVSZWNvcmQ8VD4+fHVuZGVmaW5lZH0gKi9cbmxldCBvcHROZXh0UHJvbWlzZTtcbi8qKiBAdHlwZSB7VXBkYXRlQ291bnQgJiBiaWdpbnR9ICovXG5sZXQgY3VycmVudFVwZGF0ZUNvdW50PTBuO1xuLyoqIEB0eXBlIHtFUmVmPFVwZGF0ZVJlY29yZDxUPj58dW5kZWZpbmVkfSAqL1xubGV0IGN1cnJlbnRSZXNwb25zZTtcbmxldCBmaW5hbD1mYWxzZTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGUge0Jhc2VOb3RpZmllcjxUPn1cbiAqL1xuY29uc3QgYmFzZU5vdGlmaWVyPUZhcignYmFzZU5vdGlmaWVyJyx7XG5nZXRVcGRhdGVTaW5jZSh1cGRhdGVDb3VudD0tMW4pe1xuaWYodXBkYXRlQ291bnQ8Y3VycmVudFVwZGF0ZUNvdW50KXtcbmlmKGN1cnJlbnRSZXNwb25zZSl7XG5yZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGN1cnJlbnRSZXNwb25zZSk7XG4gfVxuIH1lbHNlIGlmKHVwZGF0ZUNvdW50IT09Y3VycmVudFVwZGF0ZUNvdW50KXtcbnRocm93IG5ldyBFcnJvcihcbidnZXRVcGRhdGVTaW5jZSBhcmd1bWVudCBtdXN0IGJlIGEgcHJldmlvdXNseS1pc3N1ZWQgdXBkYXRlQ291bnQuJyk7XG5cbiB9XG5cbi8qIFJldHVybiBhIGZpbmFsIHJlc3BvbnNlIGlmIHdlIGhhdmUgb25lLCBvdGhlcndpc2UgYSBwcm9taXNlIGZvciB0aGUgbmV4dCBzdGF0ZS4qL1xuaWYoZmluYWwpe1xuYXNzZXJ0KGN1cnJlbnRSZXNwb25zZSE9PXVuZGVmaW5lZCk7XG5yZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGN1cnJlbnRSZXNwb25zZSk7XG4gfVxuaWYoIW9wdE5leHRQcm9taXNlKXtcbmNvbnN0IG5leHRJdGVyUmVzdWx0UD1FKGl0ZXJhdG9yUCkubmV4dCgpO1xub3B0TmV4dFByb21pc2U9RS53aGVuKFxubmV4dEl0ZXJSZXN1bHRQLFxuKHtkb25lLHZhbHVlfSk9PntcbmFzc2VydCghZmluYWwpO1xuaWYoZG9uZSl7XG5maW5hbD10cnVlO1xuIH1cbmN1cnJlbnRVcGRhdGVDb3VudCs9MW47XG5jdXJyZW50UmVzcG9uc2U9aGFyZGVuKHtcbnZhbHVlLFxudXBkYXRlQ291bnQ6ZG9uZT91bmRlZmluZWQ6Y3VycmVudFVwZGF0ZUNvdW50fSk7XG5cbm9wdE5leHRQcm9taXNlPXVuZGVmaW5lZDtcbnJldHVybiBjdXJyZW50UmVzcG9uc2U7XG4gfSxcbihfcmVhc29uKT0+e1xuZmluYWw9dHJ1ZTtcbmN1cnJlbnRSZXNwb25zZT1cbi8qKiBAdHlwZSB7UHJvbWlzZTxVcGRhdGVSZWNvcmQ8VD4+fSAqL1xubmV4dEl0ZXJSZXN1bHRQO1xub3B0TmV4dFByb21pc2U9dW5kZWZpbmVkO1xucmV0dXJuIGN1cnJlbnRSZXNwb25zZTtcbiB9KTtcblxuIH1cbnJldHVybiBvcHROZXh0UHJvbWlzZTtcbiB9fSk7XG5cblxuLyoqIEB0eXBlIHtOb3RpZmllcjxUPn0gKi9cbmNvbnN0IG5vdGlmaWVyPUZhcignbm90aWZpZXInLHtcbi8qIERvbid0IGxlYWsgdGhlIG9yaWdpbmFsIGFzeW5jSXRlcmFibGVQIHNpbmNlIGl0IG1heSBiZSByZW1vdGUgYW5kIHdlIGFsc28qL1xuLyogd2FudCB0aGUgc2FtZSBzZW1hbnRpY3MgZm9yIHRoaXMgZXhwb3NlZCBpdGVyYWJsZSBhbmQgdGhlIGJhc2VOb3RpZmllci4qL1xuLi4ubWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIoYmFzZU5vdGlmaWVyKSxcbi4uLmJhc2VOb3RpZmllcixcblxuLyoqXG4gKiBVc2UgdGhpcyB0byBkaXN0cmlidXRlIGEgTm90aWZpZXIgZWZmaWNpZW50bHkgb3ZlciB0aGUgbmV0d29yayxcbiAqIGJ5IG9idGFpbmluZyB0aGlzIGZyb20gdGhlIE5vdGlmaWVyIHRvIGJlIHJlcGxpY2F0ZWQsIGFuZCBhcHBseWluZ1xuICogYG1ha2VOb3RpZmllcmAgdG8gaXQgYXQgdGhlIG5ldyBzaXRlIHRvIGdldCBhbiBlcXVpdmFsZW50IGxvY2FsXG4gKiBOb3RpZmllciBhdCB0aGF0IHNpdGUuXG4gKi9cbmdldFNoYXJhYmxlTm90aWZpZXJJbnRlcm5hbHM6KCk9PmJhc2VOb3RpZmllcixcbmdldFN0b3JlS2V5OigpPT5oYXJkZW4oe25vdGlmaWVyfSl9KTtcblxucmV0dXJuIG5vdGlmaWVyO1xuIH07JGjigI1fb25jZS5tYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZShtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSk7XG5oYXJkZW4obWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VOb3RpZmllciI6WyJtYWtlTm90aWZpZXIiXSwibWFrZU5vdGlmaWVyS2l0IjpbIm1ha2VOb3RpZmllcktpdCJdLCJtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlciI6WyJtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlciJdLCJtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSI6WyJtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADUg33V9jIAAPYyAAAqAAAAQGFnb3JpYy9ub3RpZmllci12MC41LjEvc3JjL3B1Ymxpc2gta2l0LmpzeyJpbXBvcnRzIjpbIi4vdHlwZXMtYW1iaWVudC5qcyIsIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL3ZhdC1kYXRhIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL21hcnNoYWwiLCJAZW5kby9wcm9taXNlLWtpdCJdLCJleHBvcnRzIjpbIlB1Ymxpc2hlckkiLCJTdWJzY3JpYmVySSIsIlN1YnNjcmliZXJTaGFwZSIsIm1ha2VQdWJsaXNoS2l0IiwicHVibGlzaEtpdElLaXQiLCJzdWJzY3JpYmVFYWNoIiwic3Vic2NyaWJlTGF0ZXN0Iiwidml2aWZ5RHVyYWJsZVB1Ymxpc2hLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgSGFuZGxlZFByb21pc2UsRSxtYWtlUHJvbWlzZUtpdCxGYXIsTSxjYW5CZUR1cmFibGUsdml2aWZ5RmFyQ2xhc3NLaXQ7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiSGFuZGxlZFByb21pc2VcIiwgWyRo4oCNX2EgPT4gKEhhbmRsZWRQcm9taXNlID0gJGjigI1fYSldXSxbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJtYWtlUHJvbWlzZUtpdFwiLCBbJGjigI1fYSA9PiAobWFrZVByb21pc2VLaXQgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiTVwiLCBbJGjigI1fYSA9PiAoTSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJjYW5CZUR1cmFibGVcIiwgWyRo4oCNX2EgPT4gKGNhbkJlRHVyYWJsZSA9ICRo4oCNX2EpXV0sW1widml2aWZ5RmFyQ2xhc3NLaXRcIiwgWyRo4oCNX2EgPT4gKHZpdmlmeUZhckNsYXNzS2l0ID0gJGjigI1fYSldXV1dLFtcIi4vdHlwZXMtYW1iaWVudC5qc1wiLCBbXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cbmNvbnN0e0ZhaWwscXVvdGU6cX09YXNzZXJ0O1xuXG5jb25zdCBzaW5rPSgpPT57IH07XG5jb25zdCBtYWtlUXVpZXRSZWplY3Rpb249KHJlYXNvbik9PntcbmNvbnN0IHJlamVjdGlvbj1IYW5kbGVkUHJvbWlzZS5yZWplY3QocmVhc29uKTtcbnZvaWQgRS53aGVuKHJlamVjdGlvbixzaW5rLHNpbmspO1xucmV0dXJuIGhhcmRlbihyZWplY3Rpb24pO1xuIH07XG5cbi8qKlxuICogQXN5bmNyb25vdXNseSBpdGVyYXRlcyBvdmVyIHRoZSBjb250ZW50cyBvZiBhIFB1YmxpY2F0aW9uTGlzdCBhcyB0aGV5IGFwcGVhci5cbiAqIFRoaXMgaXRlcmF0aW9uIG11c3QgZHJvcCBwYXJ0cyBvZiBwdWJsaWNhdGlvbiByZWNvcmRzIHRoYXQgYXJlIG5vIGxvbmdlclxuICogbmVlZGVkIHNvIHRoZXkgY2FuIGJlIGdhcmJhZ2UgY29sbGVjdGVkLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1B1YmxpY2F0aW9uTGlzdDxUPn0gcHViTGlzdFxuICogQHJldHVybnMge0FzeW5jSXRlcmF0b3I8VD59XG4gKi9cbmNvbnN0IG1ha2VFYWNoSXRlcmF0b3I9KHB1Ykxpc3QpPT57XG4vKiBUbyB1bmRlcnN0YW5kIHRoZSBpbXBsZW1lbnRhdGlvbiwgc3RhcnQgd2l0aCovXG4vKiBodHRwczovL3dlYi5hcmNoaXZlLm9yZy93ZWIvMjAxNjA0MDQxMjIyNTAvaHR0cDovL3dpa2kuZWNtYXNjcmlwdC5vcmcvZG9rdS5waHA/aWQ9c3RyYXdtYW46Y29uY3VycmVuY3kjaW5maW5pdGVfcXVldWUqL1xucmV0dXJuIEZhcignRWFjaEl0ZXJhdG9yJyx7XG5uZXh0OigpPT57XG5jb25zdCByZXN1bHRQPUUuZ2V0KHB1Ykxpc3QpLmhlYWQ7XG5wdWJMaXN0PUUuZ2V0KHB1Ykxpc3QpLnRhaWw7XG4vKiBXZSBleHBlY3QgdGhlIHRhaWwgdG8gYmUgdGhlIFwiY2Fubm90IHJlYWQgcGFzdCBlbmRcIiBlcnJvciBhdCB0aGUgZW5kKi9cbi8qIG9mIHRoZSBoYXBweSBwYXRoLiovXG4vKiBTaW5jZSB3ZSBhcmUgd3JhcHBpbmcgdGhhdCBlcnJvciB3aXRoIGV2ZW50dWFsIHNlbmQsIHdlIHNpbmsgdGhlKi9cbi8qIHJlamVjdGlvbiBoZXJlIHRvbyBzbyBpdCBkb2Vzbid0IGJlY29tZSBhbiBpbnZhbGlkIHVuaGFuZGxlZCByZWplY3Rpb24qL1xuLyogbGF0ZXIuKi9cbnZvaWQgRS53aGVuKHB1Ykxpc3Qsc2luayxzaW5rKTtcbnJldHVybiByZXN1bHRQO1xuIH19KTtcblxuIH07XG5cbi8qKlxuICogR2l2ZW4gYSBsb2NhbCBvciByZW1vdGUgc3Vic2NyaWJlciwgcmV0dXJucyBhIGxvY2FsIEFzeW5jSXRlcmFibGUgd2hpY2hcbiAqIHByb3ZpZGVzIFwicHJlZml4IGxvc3N5XCIgaXRlcmF0aW9ucyBvZiB0aGUgdW5kZXJseWluZyBQdWJsaWNhdGlvbkxpc3QuXG4gKiBCeSBcInByZWZpeCBsb3NzeVwiLCB3ZSBtZWFuIHRoYXQgeW91IG1heSBtaXNzIGV2ZXJ5dGhpbmcgcHVibGlzaGVkIGJlZm9yZVxuICogeW91IGFzayB0aGUgcmV0dXJuZWQgaXRlcmFibGUgZm9yIGFuIGl0ZXJhdG9yLiBCdXQgdGhlIHJldHVybmVkIGl0ZXJhdG9yXG4gKiB3aWxsIGVudW1lcmF0ZSBlYWNoIHRoaW5nIHB1Ymxpc2hlZCBmcm9tIHRoYXQgaXRlcmF0b3IncyBzdGFydGluZyBwb2ludC5cbiAqXG4gKiBJZiB0aGUgdW5kZXJseWluZyBQdWJsaWNhdGlvbkxpc3QgaXMgdGVybWluYXRlZCwgdGhhdCB0ZXJtaW5hbCB2YWx1ZSB3aWxsIGJlXG4gKiByZXBvcnRlZCBsb3NzbGVzc2x5LlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8U3Vic2NyaWJlcjxUPj59IHN1YnNjcmliZXJcbiAqIEByZXR1cm5zIHtBc3luY0l0ZXJhYmxlPFQ+fVxuICovXG5jb25zdCAgICAgICAgc3Vic2NyaWJlRWFjaD0oc3Vic2NyaWJlcik9PntcbmNvbnN0IGl0ZXJhYmxlPUZhcignRWFjaEl0ZXJhYmxlJyx7XG5bU3ltYm9sLmFzeW5jSXRlcmF0b3JdOigpPT57XG5jb25zdCBwdWJMaXN0PUUoc3Vic2NyaWJlcikuc3Vic2NyaWJlQWZ0ZXIoKTtcbnJldHVybiBtYWtlRWFjaEl0ZXJhdG9yKHB1Ykxpc3QpO1xuIH19KTtcblxucmV0dXJuIGl0ZXJhYmxlO1xuIH07JGjigI1fb25jZS5zdWJzY3JpYmVFYWNoKHN1YnNjcmliZUVhY2gpO1xuaGFyZGVuKHN1YnNjcmliZUVhY2gpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8U3Vic2NyaWJlcjxUPj59IHN1YnNjcmliZXJcbiAqIEByZXR1cm5zIHtBc3luY0l0ZXJhdG9yPFQ+fVxuICovXG5jb25zdCBtYWtlTGF0ZXN0SXRlcmF0b3I9KHN1YnNjcmliZXIpPT57XG5sZXQgbGF0ZXN0UHVibGlzaENvdW50O1xucmV0dXJuIEZhcignTGF0ZXN0SXRlcmF0b3InLHtcbm5leHQ6KCk9PntcbmNvbnN0IHB1Ykxpc3Q9RShzdWJzY3JpYmVyKS5zdWJzY3JpYmVBZnRlcihsYXRlc3RQdWJsaXNoQ291bnQpO1xuLyogV2l0aG91dCBhbiBvblJlamVjdGlvbiwgaWYgcHViTGlzdCBpcyBhIHJlamVjdGlvbiwgdGhpcyB3aWxsKi9cbi8qIHByb3BhZ2F0ZSB0aGUgcmVqZWN0aW9uIGFzIGl0IHNob3VsZC4qL1xucmV0dXJuIEUud2hlbihwdWJMaXN0LCh7aGVhZCxwdWJsaXNoQ291bnR9KT0+e1xubGF0ZXN0UHVibGlzaENvdW50PXB1Ymxpc2hDb3VudDtcbnJldHVybiBoZWFkO1xuIH0pO1xuIH19KTtcblxuIH07XG5cbi8qKlxuICogR2l2ZW4gYSBsb2NhbCBvciByZW1vdGUgc3Vic2NyaWJlciwgcmV0dXJucyBhIGxvY2FsIEFzeW5jSXRlcmFibGUgd2hpY2hcbiAqIHByb3ZpZGVzIFwibG9zc3lcIiBpdGVyYXRpb25zIG9mIHRoZSB1bmRlcmx5aW5nIFB1YmxpY2F0aW9uTGlzdC5cbiAqIEJ5IFwibG9zc3lcIiwgd2UgbWVhbiB0aGF0IHlvdSBtYXkgbWlzcyBhbnkgcHVibGlzaGVkIHN0YXRlIGlmIGEgbW9yZVxuICogcmVjZW50IHB1Ymxpc2hlZCBzdGF0ZSBjYW4gYmUgcmVwb3J0ZWQgaW5zdGVhZC5cbiAqXG4gKiBJZiB0aGUgdW5kZXJseWluZyBQdWJsaWNhdGlvbkxpc3QgaXMgdGVybWluYXRlZCwgdGhhdCB0ZXJtaW5hbCB2YWx1ZSB3aWxsIGJlXG4gKiByZXBvcnRlZCBsb3NzbGVzc2x5LlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8U3Vic2NyaWJlcjxUPj59IHN1YnNjcmliZXJcbiAqIEByZXR1cm5zIHtBc3luY0l0ZXJhYmxlPFQ+fVxuICovXG5jb25zdCAgICAgICAgc3Vic2NyaWJlTGF0ZXN0PShzdWJzY3JpYmVyKT0+e1xuY29uc3QgaXRlcmFibGU9RmFyKCdMYXRlc3RJdGVyYWJsZScse1xuW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTooKT0+bWFrZUxhdGVzdEl0ZXJhdG9yKHN1YnNjcmliZXIpfSk7XG5cbnJldHVybiBpdGVyYWJsZTtcbiB9OyRo4oCNX29uY2Uuc3Vic2NyaWJlTGF0ZXN0KHN1YnNjcmliZUxhdGVzdCk7XG5oYXJkZW4oc3Vic2NyaWJlTGF0ZXN0KTtcblxuY29uc3QgICAgICAgIFB1Ymxpc2hlckk9TS5pbnRlcmZhY2UoJ1B1Ymxpc2hlcicse1xucHVibGlzaDpNLmNhbGwoTS5hbnkoKSkucmV0dXJucygpLFxuZmluaXNoOk0uY2FsbChNLmFueSgpKS5yZXR1cm5zKCksXG5mYWlsOk0uY2FsbChNLmFueSgpKS5yZXR1cm5zKCl9KTskaOKAjV9vbmNlLlB1Ymxpc2hlckkoUHVibGlzaGVySSk7XG5cbmNvbnN0ICAgICAgICBTdWJzY3JpYmVyST1NLmludGVyZmFjZSgnU3Vic2NyaWJlcicse1xuc3Vic2NyaWJlQWZ0ZXI6TS5jYWxsKCkub3B0aW9uYWwoTS5iaWdpbnQoKSkucmV0dXJucyhNLnByb21pc2UoKSl9KTskaOKAjV9vbmNlLlN1YnNjcmliZXJJKFN1YnNjcmliZXJJKTtcblxuY29uc3QgICAgICAgIHB1Ymxpc2hLaXRJS2l0PWhhcmRlbih7XG5wdWJsaXNoZXI6UHVibGlzaGVySSxcbnN1YnNjcmliZXI6U3Vic2NyaWJlckl9KTtcblxuXG4vKipcbiAqIE1ha2VzIGEgYHsgcHVibGlzaGVyLCBzdWJzY3JpYmVyIH1gIHBhaXIgZm9yIGRvaW5nIGVmZmljaWVudFxuICogZGlzdHJpYnV0ZWQgcHViL3N1YiBzdXBwb3J0aW5nIGJvdGggXCJlYWNoXCIgYW5kIFwibGF0ZXN0XCIgaXRlcmF0aW9uXG4gKiBvZiBwdWJsaXNoZWQgdmFsdWVzLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcmV0dXJucyB7UHVibGlzaEtpdDxUPn1cbiAqLyRo4oCNX29uY2UucHVibGlzaEtpdElLaXQocHVibGlzaEtpdElLaXQpO1xuY29uc3QgICAgICAgIG1ha2VQdWJsaXNoS2l0PSgpPT57XG4vKiogQHR5cGUge1Byb21pc2U8UHVibGljYXRpb25SZWNvcmQ8VD4+fSAqL1xubGV0IHRhaWxQO1xuLyoqIEB0eXBlIHt1bmRlZmluZWQgfCAoKHZhbHVlOiBFUmVmPFB1YmxpY2F0aW9uUmVjb3JkPFQ+PikgPT4gdm9pZCl9ICovXG5sZXQgdGFpbFI7XG4oe3Byb21pc2U6dGFpbFAscmVzb2x2ZTp0YWlsUn09bWFrZVByb21pc2VLaXQoKSk7XG5cbmxldCBjdXJyZW50UHVibGlzaENvdW50PTBuO1xubGV0IGN1cnJlbnRQPXRhaWxQO1xuY29uc3QgYWR2YW5jZUN1cnJlbnQ9KGRvbmUsdmFsdWUscmVqZWN0aW9uKT0+e1xuaWYodGFpbFI9PT11bmRlZmluZWQpe1xudGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgdXBkYXRlIHN0YXRlIGFmdGVyIHRlcm1pbmF0aW9uLicpO1xuIH1cblxuY3VycmVudFB1Ymxpc2hDb3VudCs9MW47XG5jdXJyZW50UD10YWlsUDtcbmNvbnN0IHJlc29sdmVDdXJyZW50PXRhaWxSO1xuXG5pZihkb25lKXtcbnRhaWxQPW1ha2VRdWlldFJlamVjdGlvbihcbm5ldyBFcnJvcignQ2Fubm90IHJlYWQgcGFzdCBlbmQgb2YgaXRlcmF0aW9uLicpKTtcblxudGFpbFI9dW5kZWZpbmVkO1xuIH1lbHNle1xuKHtwcm9taXNlOnRhaWxQLHJlc29sdmU6dGFpbFJ9PW1ha2VQcm9taXNlS2l0KCkpO1xuIH1cblxuaWYocmVqZWN0aW9uKXtcbnJlc29sdmVDdXJyZW50KHJlamVjdGlvbik7XG4gfWVsc2V7XG5yZXNvbHZlQ3VycmVudChcbmhhcmRlbih7XG5oZWFkOnt2YWx1ZSxkb25lfSxcbnB1Ymxpc2hDb3VudDpjdXJyZW50UHVibGlzaENvdW50LFxudGFpbDp0YWlsUH0pKTtcblxuXG4gfVxuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlIHtTdWJzY3JpYmVyPFQ+fVxuICovXG5jb25zdCBzdWJzY3JpYmVyPUZhcignU3Vic2NyaWJlcicse1xuc3Vic2NyaWJlQWZ0ZXI6KHB1Ymxpc2hDb3VudD0tMW4pPT57XG5hc3NlcnQudHlwZW9mKHB1Ymxpc2hDb3VudCwnYmlnaW50Jyk7XG5pZihwdWJsaXNoQ291bnQ9PT1jdXJyZW50UHVibGlzaENvdW50KXtcbnJldHVybiB0YWlsUDtcbiB9ZWxzZSBpZihwdWJsaXNoQ291bnQ8Y3VycmVudFB1Ymxpc2hDb3VudCl7XG5yZXR1cm4gY3VycmVudFA7XG4gfWVsc2V7XG50aHJvdyBuZXcgRXJyb3IoXG4nc3Vic2NyaWJlQWZ0ZXIgYXJndW1lbnQgbXVzdCBiZSBhIHByZXZpb3VzbHktaXNzdWVkIHB1Ymxpc2hDb3VudC4nKTtcblxuIH1cbiB9fSk7XG5cblxuLyoqIEB0eXBlIHtQdWJsaXNoZXI8VD59ICovXG5jb25zdCBwdWJsaXNoZXI9RmFyKCdQdWJsaXNoZXInLHtcbnB1Ymxpc2g6KHZhbHVlKT0+e1xuYWR2YW5jZUN1cnJlbnQoZmFsc2UsdmFsdWUpO1xuIH0sXG5maW5pc2g6KGZpbmFsVmFsdWUpPT57XG5hZHZhbmNlQ3VycmVudCh0cnVlLGZpbmFsVmFsdWUpO1xuIH0sXG5mYWlsOihyZWFzb24pPT57XG5hZHZhbmNlQ3VycmVudCh0cnVlLHVuZGVmaW5lZCxtYWtlUXVpZXRSZWplY3Rpb24ocmVhc29uKSk7XG4gfX0pO1xuXG5yZXR1cm4gaGFyZGVuKHtwdWJsaXNoZXIsc3Vic2NyaWJlcn0pO1xuIH07JGjigI1fb25jZS5tYWtlUHVibGlzaEtpdChtYWtlUHVibGlzaEtpdCk7XG5oYXJkZW4obWFrZVB1Ymxpc2hLaXQpO1xuXG4vKiBUT0RPOiBNb3ZlIGR1cmFibGUgcHVibGlzaCBraXQgdG8gYSBuZXcgZmlsZT8qL1xuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7RHVyYWJsZVB1Ymxpc2hLaXRWYWx1ZUR1cmFiaWxpdHkgJiAnbWFuZGF0b3J5J30gW29wdGlvbnMudmFsdWVEdXJhYmlsaXR5PSdtYW5kYXRvcnknXVxuICogQHJldHVybnMge0R1cmFibGVQdWJsaXNoS2l0U3RhdGV9XG4gKi9cbmNvbnN0IGluaXREdXJhYmxlUHVibGlzaEtpdFN0YXRlPShvcHRpb25zPXt9KT0+e1xuY29uc3R7dmFsdWVEdXJhYmlsaXR5PSdtYW5kYXRvcnknfT1vcHRpb25zO1xuYXNzZXJ0LmVxdWFsKHZhbHVlRHVyYWJpbGl0eSwnbWFuZGF0b3J5Jyk7XG5yZXR1cm57XG4vKiBjb25maWd1cmF0aW9uKi9cbnZhbHVlRHVyYWJpbGl0eSxcblxuLyogbGlmZWN5Y2xlIHByb2dyZXNzKi9cbnB1Ymxpc2hDb3VudDowbixcbnN0YXR1czonbGl2ZScsLyogfCAnZmluaXNoZWQnIHwgJ2ZhaWxlZCcqL1xuXG4vKiBwZXJzaXN0ZWQgcmVzdWx0IGRhdGEqL1xuLyogTm90ZSB0aGF0IGluIGFkZGl0aW9uIHRvIG5vbi10ZXJtaW5hbCB2YWx1ZXMgZnJvbSBgcHVibGlzaGAsKi9cbi8qIHZhbHVlIGFsc28gaG9sZHMgdGhlIHRlcm1pbmFsIHZhbHVlIGZyb20gYGZpbmlzaGAgb3IgYGZhaWxgLiovXG5oYXNWYWx1ZTpmYWxzZSxcbnZhbHVlOnVuZGVmaW5lZH07XG5cbiB9O1xuXG4vKiBXZSBuZWVkIHRoZSBXZWFrTWFwIGtleSBmb3IgYSBraXQgdG8gYmUgYSB2cmVmLWJlYXJpbmcgb2JqZWN0Ki9cbi8qIGluIGl0cyBjb2hvcnQsIGFuZCBoYXZlIGFyYml0cmFyaWx5IGNob3NlbiB0aGUgcHVibGlzaGVyIGZhY2V0LiovXG4vKiogQHR5cGVkZWYge1B1Ymxpc2hlcjwqPn0gRHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxLZXkgKi9cbi8qKlxuICogQHBhcmFtIHtQdWJsaXNoS2l0PCo+fSBmYWNldHNcbiAqIEByZXR1cm5zIHtEdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbEtleX1cbiAqL1xuY29uc3QgZ2V0RXBoZW1lcmFsS2V5PShmYWNldHMpPT5mYWNldHMucHVibGlzaGVyO1xuXG4vKiogQHR5cGUge1dlYWtNYXA8RHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxLZXksIHtjdXJyZW50UCwgdGFpbFAsIHRhaWxSfT59ICovXG5jb25zdCBkdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbERhdGE9bmV3IFdlYWtNYXAoKTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBjdXJyZW50L25leHQtcmVzdWx0IHByb21pc2VzIGFuZCBuZXh0LXJlc3VsdCByZXNvbHZlclxuICogYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gZHVyYWJsZSBwdWJsaXNoIGtpdC5cbiAqIFRoZXkgYXJlIGxvc3Qgb24gdXBncmFkZSwgYnV0IHJlY3JlYXRlZCBvbi1kZW1hbmQuXG4gKiBTdWNoIHJlY3JlYXRpb24gcHJlc2VydmVzIHRoZSB2YWx1ZSBpbiAoYnV0IG5vdCB0aGUgaWRlbnRpdHkgb2YpIHRoZVxuICogY3VycmVudCB7IHZhbHVlLCBkb25lIH0gcmVzdWx0IHdoZW4gcG9zc2libGUsIHdoaWNoIGlzIGFsd2F5cyB0aGVcbiAqIGNhc2Ugd2hlbiB0aGF0IHZhbHVlIGlzIHRlcm1pbmFsIChpLmUuLCBmcm9tIGBmaW5pc2hgIG9yIGBmYWlsYCkgb3JcbiAqIHdoZW4gdGhlIGR1cmFibGUgcHVibGlzaCBraXQgaXMgY29uZmlndXJlZCB3aXRoXG4gKiBgdmFsdWVEdXJhYmlsaXR5OiAnbWFuZGF0b3J5J2AuXG4gKlxuICogQHBhcmFtIHtEdXJhYmxlUHVibGlzaEtpdFN0YXRlfSBzdGF0ZVxuICogQHBhcmFtIHtQdWJsaXNoS2l0PCo+fSBmYWNldHNcbiAqL1xuY29uc3QgcHJvdmlkZUR1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YT0oc3RhdGUsZmFjZXRzKT0+e1xuY29uc3QgZXBoZW1lcmFsS2V5PWdldEVwaGVtZXJhbEtleShmYWNldHMpO1xuY29uc3QgZm91bmREYXRhPWR1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YS5nZXQoZXBoZW1lcmFsS2V5KTtcbmlmKGZvdW5kRGF0YSl7XG5yZXR1cm4gZm91bmREYXRhO1xuIH1cbmNvbnN0e3N0YXR1cyxwdWJsaXNoQ291bnR9PXN0YXRlO1xuLyoqIEB0eXBlIHtvYmplY3R9ICovXG5sZXQgbmV3RGF0YTtcbmlmKHN0YXR1cz09PSdmYWlsZWQnKXtcbm5ld0RhdGE9e1xuY3VycmVudFA6bWFrZVF1aWV0UmVqZWN0aW9uKHN0YXRlLnZhbHVlKSxcbnRhaWxQOm1ha2VRdWlldFJlamVjdGlvbihcbm5ldyBFcnJvcignQ2Fubm90IHJlYWQgcGFzdCBlbmQgb2YgaXRlcmF0aW9uLicpKSxcblxudGFpbFI6dW5kZWZpbmVkfTtcblxuIH1lbHNlIGlmKHN0YXR1cz09PSdmaW5pc2hlZCcpe1xuY29uc3QgdGFpbFA9bWFrZVF1aWV0UmVqZWN0aW9uKFxubmV3IEVycm9yKCdDYW5ub3QgcmVhZCBwYXN0IGVuZCBvZiBpdGVyYXRpb24uJykpO1xuXG5uZXdEYXRhPXtcbmN1cnJlbnRQOkhhbmRsZWRQcm9taXNlLnJlc29sdmUoXG5oYXJkZW4oe1xuaGVhZDp7dmFsdWU6c3RhdGUudmFsdWUsZG9uZTp0cnVlfSxcbnB1Ymxpc2hDb3VudCxcbnRhaWw6dGFpbFB9KSksXG5cblxudGFpbFAsXG50YWlsUjp1bmRlZmluZWR9O1xuXG4gfWVsc2UgaWYoc3RhdHVzPT09J2xpdmUnKXtcbmNvbnN0e3Byb21pc2U6dGFpbFAscmVzb2x2ZTp0YWlsUn09bWFrZVByb21pc2VLaXQoKTtcbnZvaWQgRS53aGVuKHRhaWxQLHNpbmssc2luayk7XG5uZXdEYXRhPXtcbmN1cnJlbnRQOnN0YXRlLmhhc1ZhbHVlP1xuSGFuZGxlZFByb21pc2UucmVzb2x2ZShcbmhhcmRlbih7XG5oZWFkOnt2YWx1ZTpzdGF0ZS52YWx1ZSxkb25lOmZhbHNlfSxcbnB1Ymxpc2hDb3VudCxcbnRhaWw6dGFpbFB9KSk6XG5cblxudGFpbFAsXG50YWlsUCxcbnRhaWxSfTtcblxuIH1lbHNle1xuRmFpbCBgSW52YWxpZCBkdXJhYmxlIHByb21pc2Uga2l0IHN0YXR1czogJHtxKHN0YXR1cyl9YDtcbiB9XG5kdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbERhdGEuc2V0KGVwaGVtZXJhbEtleSxoYXJkZW4obmV3RGF0YSkpO1xucmV0dXJuIG5ld0RhdGE7XG4gfTtcblxuLyoqXG4gKiBFeHRlbmRzIHRoZSBzZXF1ZW5jZSBvZiByZXN1bHRzLlxuICpcbiAqIEBwYXJhbSB7e3N0YXRlOiBEdXJhYmxlUHVibGlzaEtpdFN0YXRlLCBmYWNldHM6IFB1Ymxpc2hLaXQ8Kj59fSBjb250ZXh0XG4gKiBAcGFyYW0ge2Jvb2xlYW59IGRvbmVcbiAqIEBwYXJhbSB7YW55fSB2YWx1ZVxuICogQHBhcmFtIHthbnl9IFtyZWplY3Rpb25dXG4gKi9cbmNvbnN0IGFkdmFuY2VEdXJhYmxlUHVibGlzaEtpdD0oY29udGV4dCxkb25lLHZhbHVlLHJlamVjdGlvbik9PntcbmNvbnN0e3N0YXRlLGZhY2V0c309Y29udGV4dDtcbmNvbnN0e3ZhbHVlRHVyYWJpbGl0eSxzdGF0dXN9PXN0YXRlO1xuaWYoc3RhdHVzIT09J2xpdmUnKXtcbnRocm93IG5ldyBFcnJvcignQ2Fubm90IHVwZGF0ZSBzdGF0ZSBhZnRlciB0ZXJtaW5hdGlvbi4nKTtcbiB9XG5pZihkb25lfHx2YWx1ZUR1cmFiaWxpdHk9PT0nbWFuZGF0b3J5Jyl7XG5jYW5CZUR1cmFibGUodmFsdWUpfHxGYWlsIGBDYW5ub3QgYWNjZXB0IG5vbi1kdXJhYmxlIHZhbHVlOiAke3ZhbHVlfWA7XG5jYW5CZUR1cmFibGUocmVqZWN0aW9uKXx8XG5GYWlsIGBDYW5ub3QgYWNjZXB0IG5vbi1kdXJhYmxlIHJlamVjdGlvbjogJHtyZWplY3Rpb259YDtcbiB9XG5jb25zdHt0YWlsUDpjdXJyZW50UCx0YWlsUjpyZXNvbHZlQ3VycmVudH09XG5wcm92aWRlRHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxEYXRhKHN0YXRlLGZhY2V0cyk7XG5cbmNvbnN0IHB1Ymxpc2hDb3VudD1zdGF0ZS5wdWJsaXNoQ291bnQrMW47XG5zdGF0ZS5wdWJsaXNoQ291bnQ9cHVibGlzaENvdW50O1xubGV0IHRhaWxQO1xubGV0IHRhaWxSO1xuXG5pZihkb25lKXtcbnN0YXRlLnN0YXR1cz1yZWplY3Rpb24/J2ZhaWxlZCc6J2ZpbmlzaGVkJztcbnRhaWxQPW1ha2VRdWlldFJlamVjdGlvbihuZXcgRXJyb3IoJ0Nhbm5vdCByZWFkIHBhc3QgZW5kIG9mIGl0ZXJhdGlvbi4nKSk7XG50YWlsUj11bmRlZmluZWQ7XG4gfWVsc2V7XG4oe3Byb21pc2U6dGFpbFAscmVzb2x2ZTp0YWlsUn09bWFrZVByb21pc2VLaXQoKSk7XG52b2lkIEUud2hlbih0YWlsUCxzaW5rLHNpbmspO1xuIH1cbmR1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YS5zZXQoXG5nZXRFcGhlbWVyYWxLZXkoZmFjZXRzKSxcbmhhcmRlbih7Y3VycmVudFAsdGFpbFAsdGFpbFJ9KSk7XG5cblxuaWYocmVqZWN0aW9uKXtcbnN0YXRlLmhhc1ZhbHVlPXRydWU7XG5zdGF0ZS52YWx1ZT1yZWplY3Rpb247XG5yZXNvbHZlQ3VycmVudChyZWplY3Rpb24pO1xuIH1lbHNle1xuLyogUGVyc2lzdCBhIHRlcm1pbmFsIHZhbHVlLCBvciBhIG5vbi10ZXJtaW5hbCB2YWx1ZSovXG4vKiBpZiBjb25maWd1cmVkIGFzICdtYW5kYXRvcnknIG9yICdvcHBvcnR1bmlzdGljJy4qL1xuaWYoZG9uZXx8dmFsdWVEdXJhYmlsaXR5IT09J2lnbm9yZWQnJiZjYW5CZUR1cmFibGUodmFsdWUpKXtcbnN0YXRlLmhhc1ZhbHVlPXRydWU7XG5zdGF0ZS52YWx1ZT12YWx1ZTtcbiB9ZWxzZXtcbnN0YXRlLmhhc1ZhbHVlPWZhbHNlO1xuc3RhdGUudmFsdWU9dW5kZWZpbmVkO1xuIH1cblxucmVzb2x2ZUN1cnJlbnQoXG5oYXJkZW4oe1xuaGVhZDp7dmFsdWUsZG9uZX0sXG5wdWJsaXNoQ291bnQsXG50YWlsOnRhaWxQfSkpO1xuXG5cbiB9XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1hpbXBvcnQoJy4uLy4uL3ZhdC1kYXRhL3NyYy90eXBlcy5qcycpLkJhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBraW5kTmFtZVxuICovXG5jb25zdCAgICAgICAgdml2aWZ5RHVyYWJsZVB1Ymxpc2hLaXQ9KGJhZ2dhZ2Usa2luZE5hbWUpPT57XG4vKipcbiAqIEByZXR1cm5zIHsoKSA9PiBQdWJsaXNoS2l0PCo+fVxuICovXG5yZXR1cm4gdml2aWZ5RmFyQ2xhc3NLaXQoXG5iYWdnYWdlLFxua2luZE5hbWUsXG5wdWJsaXNoS2l0SUtpdCxcbmluaXREdXJhYmxlUHVibGlzaEtpdFN0YXRlLFxue1xuLyogVGhlIHB1Ymxpc2hlciBmYWNldCBvZiBhIGR1cmFibGUgcHVibGlzaCBraXQqL1xuLyogYWNjZXB0cyBuZXcgdmFsdWVzLiovXG5wdWJsaXNoZXI6e1xucHVibGlzaCh2YWx1ZSl7XG5hZHZhbmNlRHVyYWJsZVB1Ymxpc2hLaXQodGhpcyxmYWxzZSx2YWx1ZSk7XG4gfSxcbmZpbmlzaChmaW5hbFZhbHVlKXtcbmFkdmFuY2VEdXJhYmxlUHVibGlzaEtpdCh0aGlzLHRydWUsZmluYWxWYWx1ZSk7XG4gfSxcbmZhaWwocmVhc29uKXtcbmNvbnN0IHJlamVjdGlvbj1tYWtlUXVpZXRSZWplY3Rpb24ocmVhc29uKTtcbmFkdmFuY2VEdXJhYmxlUHVibGlzaEtpdCh0aGlzLHRydWUsdW5kZWZpbmVkLHJlamVjdGlvbik7XG4gfX0sXG5cblxuLyogVGhlIHN1YnNjcmliZXIgZmFjZXQgb2YgYSBkdXJhYmxlIHB1Ymxpc2gga2l0Ki9cbi8qIHByb3BhZ2F0ZXMgdmFsdWVzLiovXG5zdWJzY3JpYmVyOntcbnN1YnNjcmliZUFmdGVyKHB1Ymxpc2hDb3VudD0tMW4pe1xuY29uc3R7c3RhdGUsZmFjZXRzfT10aGlzO1xuY29uc3R7cHVibGlzaENvdW50OmN1cnJlbnRQdWJsaXNoQ291bnR9PXN0YXRlO1xuY29uc3R7Y3VycmVudFAsdGFpbFB9PXByb3ZpZGVEdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbERhdGEoXG5zdGF0ZSxcbmZhY2V0cyk7XG5cbmlmKHB1Ymxpc2hDb3VudD09PWN1cnJlbnRQdWJsaXNoQ291bnQpe1xucmV0dXJuIHRhaWxQO1xuIH1lbHNlIGlmKHB1Ymxpc2hDb3VudDxjdXJyZW50UHVibGlzaENvdW50KXtcbnJldHVybiBjdXJyZW50UDtcbiB9ZWxzZXtcbnRocm93IG5ldyBFcnJvcihcbidzdWJzY3JpYmVBZnRlciBhcmd1bWVudCBtdXN0IGJlIGEgcHJldmlvdXNseS1pc3N1ZWQgcHVibGlzaENvdW50LicpO1xuXG4gfVxuIH19fSk7XG5cblxuXG4gfTskaOKAjV9vbmNlLnZpdmlmeUR1cmFibGVQdWJsaXNoS2l0KHZpdmlmeUR1cmFibGVQdWJsaXNoS2l0KTtcbmhhcmRlbih2aXZpZnlEdXJhYmxlUHVibGlzaEtpdCk7XG5cbmNvbnN0ICAgICAgICBTdWJzY3JpYmVyU2hhcGU9TS5yZW1vdGFibGUoJ1N1YnNjcmliZXInKTskaOKAjV9vbmNlLlN1YnNjcmliZXJTaGFwZShTdWJzY3JpYmVyU2hhcGUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InN1YnNjcmliZUVhY2giOlsic3Vic2NyaWJlRWFjaCJdLCJzdWJzY3JpYmVMYXRlc3QiOlsic3Vic2NyaWJlTGF0ZXN0Il0sIlB1Ymxpc2hlckkiOlsiUHVibGlzaGVySSJdLCJTdWJzY3JpYmVySSI6WyJTdWJzY3JpYmVySSJdLCJwdWJsaXNoS2l0SUtpdCI6WyJwdWJsaXNoS2l0SUtpdCJdLCJtYWtlUHVibGlzaEtpdCI6WyJtYWtlUHVibGlzaEtpdCJdLCJ2aXZpZnlEdXJhYmxlUHVibGlzaEtpdCI6WyJ2aXZpZnlEdXJhYmxlUHVibGlzaEtpdCJdLCJTdWJzY3JpYmVyU2hhcGUiOlsiU3Vic2NyaWJlclNoYXBlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAFYIhWa/HgAAvx4AACcAAABAYWdvcmljL25vdGlmaWVyLXYwLjUuMS9zcmMvc3RvcmVzdWIuanN7ImltcG9ydHMiOlsiLi9hc3luY0l0ZXJhYmxlQWRhcHRvci5qcyIsIi4vcHVibGlzaC1raXQuanMiLCIuL3N1YnNjcmliZXIuanMiLCJAYWdvcmljL2ludGVybmFsIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJtYWtlU3RvcmVkUHVibGlzaEtpdCIsIm1ha2VTdG9yZWRQdWJsaXNoZXJLaXQiLCJtYWtlU3RvcmVkU3Vic2NyaWJlciIsIm1ha2VTdG9yZWRTdWJzY3JpcHRpb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRSxGYXIsbWFrZU1hcnNoYWwsYXNzZXJ0QWxsRGVmaW5lZCxvYnNlcnZlSXRlcmF0aW9uLG1ha2VQdWJsaXNoS2l0LHN1YnNjcmliZUVhY2gsbWFrZVN1YnNjcmlwdGlvbktpdDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXSxbXCJtYWtlTWFyc2hhbFwiLCBbJGjigI1fYSA9PiAobWFrZU1hcnNoYWwgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbFwiLCBbW1wiYXNzZXJ0QWxsRGVmaW5lZFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0QWxsRGVmaW5lZCA9ICRo4oCNX2EpXV1dXSxbXCIuL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzXCIsIFtbXCJvYnNlcnZlSXRlcmF0aW9uXCIsIFskaOKAjV9hID0+IChvYnNlcnZlSXRlcmF0aW9uID0gJGjigI1fYSldXV1dLFtcIi4vcHVibGlzaC1raXQuanNcIiwgW1tcIm1ha2VQdWJsaXNoS2l0XCIsIFskaOKAjV9hID0+IChtYWtlUHVibGlzaEtpdCA9ICRo4oCNX2EpXV0sW1wic3Vic2NyaWJlRWFjaFwiLCBbJGjigI1fYSA9PiAoc3Vic2NyaWJlRWFjaCA9ICRo4oCNX2EpXV1dXSxbXCIuL3N1YnNjcmliZXIuanNcIiwgW1tcIm1ha2VTdWJzY3JpcHRpb25LaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VTdWJzY3JpcHRpb25LaXQgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7U3Vic2NyaWJlcjxUPn0gc3Vic2NyaWJlclxuICogQHBhcmFtIHsodjogVCkgPT4gdm9pZH0gY29uc3VtZVZhbHVlXG4gKi9cbmNvbnN0IGZvckVhY2hQdWJsaWNhdGlvblJlY29yZD1hc3luYyhzdWJzY3JpYmVyLGNvbnN1bWVWYWx1ZSk9PntcbmNvbnN0IGl0ZXJhdG9yUD1FKHN1YnNjcmliZUVhY2goc3Vic2NyaWJlcikpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpO1xuXG5sZXQgZmluaXNoZWQ9ZmFsc2U7XG53aGlsZSghZmluaXNoZWQpe1xuLyogQWxsb3cgbmVzdGVkIGF3YWl0cyAoaW4gbG9vcCkgYmVjYXVzZSBpdCdzIHNhZmUgZm9yIGVhY2ggdG8gcnVuIGluIGEgdHVybiovXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXdhaXQtaW4tbG9vcCwgQGplc3NpZS5qcy9uby1uZXN0ZWQtYXdhaXQqL1xuY29uc3R7dmFsdWUsZG9uZX09YXdhaXQgRShpdGVyYXRvclApLm5leHQoKTtcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hd2FpdC1pbi1sb29wLCBAamVzc2llLmpzL25vLW5lc3RlZC1hd2FpdCovXG5hd2FpdCBjb25zdW1lVmFsdWUodmFsdWUpO1xuZmluaXNoZWQ9ISFkb25lO1xuIH1cbiB9O1xuXG4vKipcbiAqIEJlZ2luIGl0ZXJhdGluZyB0aGUgc291cmNlLCBzdG9yaW5nIHNlcmlhbGl6ZWQgaXRlcmF0aW9uIHZhbHVlcy4gIElmIHRoZVxuICogc3RvcmFnZU5vZGUncyBgc2V0VmFsdWVgIG9wZXJhdGlvbiByZWplY3RzLCBubyBmdXJ0aGVyIHdyaXRlcyB0byBpdCB3aWxsXG4gKiBiZSBhdHRlbXB0ZWQgKGJ1dCByZXN1bHRzIHdpbGwgcmVtYWluIGF2YWlsYWJsZSBmcm9tIHRoZSBzdWJzY3JpYmVyKS5cbiAqXG4gKiBSZXR1cm5zIGEgU3RvcmVkU3Vic2NyaWJlciB0aGF0IGNhbiBiZSB1c2VkIGJ5IGEgY2xpZW50IHRvIGRpcmVjdGx5IGZvbGxvd1xuICogdGhlIGl0ZXJhdGlvbiB0aGVtc2VsdmVzLCBvciBvYnRhaW4gaW5mb3JtYXRpb24gdG8gc3Vic2NyaWJlIHRvIHRoZSBzdG9yZWRcbiAqIGRhdGEgb3V0LW9mLWJhbmQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7U3Vic2NyaWJlcjxUPn0gc3Vic2NyaWJlclxuICogQHBhcmFtIHtFUmVmPFN0b3JhZ2VOb2RlPn0gc3RvcmFnZU5vZGVcbiAqIEBwYXJhbSB7RVJlZjxSZXR1cm5UeXBlPHR5cGVvZiBtYWtlTWFyc2hhbD4+fSBtYXJzaGFsbGVyXG4gKiBAcmV0dXJucyB7U3RvcmVkU3Vic2NyaWJlcjxUPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VTdG9yZWRTdWJzY3JpYmVyPShzdWJzY3JpYmVyLHN0b3JhZ2VOb2RlLG1hcnNoYWxsZXIpPT57XG5hc3NlcnRBbGxEZWZpbmVkKHtzdWJzY3JpYmVyLHN0b3JhZ2VOb2RlLG1hcnNoYWxsZXJ9KTtcblxuY29uc3Qgc3RvcmVWYWx1ZT0odmFsdWUpPT5cbkUobWFyc2hhbGxlcikuXG5zZXJpYWxpemUodmFsdWUpLlxudGhlbigoc2VyaWFsaXplZCk9PntcbmNvbnN0IGVuY29kZWQ9SlNPTi5zdHJpbmdpZnkoc2VyaWFsaXplZCk7XG5yZXR1cm4gRShzdG9yYWdlTm9kZSkuc2V0VmFsdWUoZW5jb2RlZCk7XG4gfSk7XG5cbi8qIFN0YXJ0IHB1Ymxpc2hpbmcgdGhlIHNvdXJjZS4qL1xuZm9yRWFjaFB1YmxpY2F0aW9uUmVjb3JkKHN1YnNjcmliZXIsc3RvcmVWYWx1ZSkuY2F0Y2goKGVycik9Pntcbi8qIFRPRE86IEhvdyBzaG91bGQgd2UgaGFuZGxlIGFuZC9vciBzdXJmYWNlIHRoaXMgZmFpbHVyZT8qL1xuLyogaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL3B1bGwvNTc2NiNkaXNjdXNzaW9uX3I5MjI0OTgwODgqL1xuY29uc29sZS5lcnJvcignU3RvcmVkU3Vic2NyaWJlciBmYWlsZWQgdG8gaXRlcmF0ZScsZXJyKTtcbiB9KTtcblxuLyoqIEB0eXBlIHtVbnNlcmlhbGl6ZXJ9ICovXG5jb25zdCB1bnNlcmlhbGl6ZXI9RmFyKCd1bnNlcmlhbGl6ZXInLHtcbnVuc2VyaWFsaXplOihkYXRhKT0+RShtYXJzaGFsbGVyKS51bnNlcmlhbGl6ZShkYXRhKX0pO1xuXG5cbi8qKiBAdHlwZSB7U3RvcmVkU3Vic2NyaWJlcjxUPn0gKi9cbmNvbnN0IHN0b3Jlc3ViPUZhcignU3RvcmVkU3Vic2NyaWJlcicse1xuLi4uc3Vic2NyaWJlcixcbmdldFN0b3JlS2V5OigpPT5FKHN0b3JhZ2VOb2RlKS5nZXRTdG9yZUtleSgpLFxuZ2V0VW5zZXJpYWxpemVyOigpPT51bnNlcmlhbGl6ZXJ9KTtcblxucmV0dXJuIHN0b3Jlc3ViO1xuIH07XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgdXNlIG1ha2VTdG9yZWRTdWJzY3JpYmVyXG4gKlxuICogQmVnaW4gaXRlcmF0aW5nIHRoZSBzb3VyY2UsIHN0b3Jpbmcgc2VyaWFsaXplZCBpdGVyYXRpb24gdmFsdWVzLiAgSWYgdGhlXG4gKiBzdG9yYWdlTm9kZSdzIGBzZXRWYWx1ZWAgb3BlcmF0aW9uIHJlamVjdHMsIHRoZSBpdGVyYXRpb24gd2lsbCBiZSB0ZXJtaW5hdGVkLlxuICpcbiAqIFJldHVybnMgYSBTdG9yZWRTdWJzY3JpcHRpb24gdGhhdCBjYW4gYmUgdXNlZCBieSBhIGNsaWVudCB0byBkaXJlY3RseSBmb2xsb3dcbiAqIHRoZSBpdGVyYXRpb24gdGhlbXNlbHZlcywgb3Igb2J0YWluIGluZm9ybWF0aW9uIHRvIHN1YnNjcmliZSB0byB0aGUgc3RvcmVkXG4gKiBkYXRhIG91dC1vZi1iYW5kLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1N1YnNjcmlwdGlvbjxUPn0gc3Vic2NyaXB0aW9uXG4gKiBAcGFyYW0ge0VSZWY8U3RvcmFnZU5vZGU+fSBbc3RvcmFnZU5vZGVdXG4gKiBAcGFyYW0ge0VSZWY8UmV0dXJuVHlwZTx0eXBlb2YgbWFrZU1hcnNoYWw+Pn0gW21hcnNoYWxsZXJdXG4gKiBAcmV0dXJucyB7U3RvcmVkU3Vic2NyaXB0aW9uPFQ+fVxuICovJGjigI1fb25jZS5tYWtlU3RvcmVkU3Vic2NyaWJlcihtYWtlU3RvcmVkU3Vic2NyaWJlcik7XG5jb25zdCAgICAgICAgbWFrZVN0b3JlZFN1YnNjcmlwdGlvbj0oXG5zdWJzY3JpcHRpb24sXG5zdG9yYWdlTm9kZSxcbm1hcnNoYWxsZXI9bWFrZU1hcnNoYWwodW5kZWZpbmVkLHVuZGVmaW5lZCx7XG5tYXJzaGFsU2F2ZUVycm9yOigpPT57IH19KSk9PlxuXG57XG4vKiogQHR5cGUge1Vuc2VyaWFsaXplcn0gKi9cbmNvbnN0IHVuc2VyaWFsaXplcj1GYXIoJ3Vuc2VyaWFsaXplcicse1xudW5zZXJpYWxpemU6KGRhdGEpPT5FKG1hcnNoYWxsZXIpLnVuc2VyaWFsaXplKGRhdGEpfSk7XG5cblxuLyogQWJvcnQgdGhlIGl0ZXJhdGlvbiBvbiB0aGUgbmV4dCBvYnNlcnZhdGlvbiBpZiB0aGUgcHVibGlzaGVyIGV2ZXIgZmFpbHMuKi9cbmxldCBwdWJsaXNoRmFpbGVkPWZhbHNlO1xubGV0IHB1Ymxpc2hFeGNlcHRpb247XG5cbmNvbnN0IGZhaWw9KGVycik9PntcbnB1Ymxpc2hGYWlsZWQ9dHJ1ZTtcbnB1Ymxpc2hFeGNlcHRpb249ZXJyO1xuIH07XG5cbi8qIE11c3QgKm5vdCogYmUgYW4gYXN5bmMgZnVuY3Rpb24sIGJlY2F1c2UgaXQgc29tZXRpbWVzIG11c3QgdGhyb3cgdG8gYWJvcnQqL1xuLyogdGhlIGl0ZXJhdGlvbi4qL1xuY29uc3QgcHVibGlzaFZhbHVlPShvYmopPT57XG5hc3NlcnQoc3RvcmFnZU5vZGUpO1xuaWYocHVibGlzaEZhaWxlZCl7XG4vKiBUbyBwcm9wZXJseSBhYm9ydCB0aGUgaXRlcmF0aW9uLCB0aGlzIG11c3QgYmUgYSBzeW5jaHJvbm91cyBleGNlcHRpb24uKi9cbnRocm93IHB1Ymxpc2hFeGNlcHRpb247XG4gfVxuXG4vKiBQdWJsaXNoIHRoZSB2YWx1ZSwgY2FwdHVyaW5nIGFueSBlcnJvci4qL1xuRShtYXJzaGFsbGVyKS5cbnNlcmlhbGl6ZShvYmopLlxudGhlbigoc2VyaWFsaXplZCk9PntcbmNvbnN0IGVuY29kZWQ9SlNPTi5zdHJpbmdpZnkoc2VyaWFsaXplZCk7XG5yZXR1cm4gRShzdG9yYWdlTm9kZSkuc2V0VmFsdWUoZW5jb2RlZCk7XG4gfSkuXG5jYXRjaChmYWlsKTtcbiB9O1xuXG5pZihzdG9yYWdlTm9kZSl7XG4vKiBTdGFydCBwdWJsaXNoaW5nIHRoZSBzb3VyY2UuKi9cbm9ic2VydmVJdGVyYXRpb24oc3Vic2NyaXB0aW9uLHtcbnVwZGF0ZVN0YXRlOnB1Ymxpc2hWYWx1ZSxcbmZpbmlzaDpwdWJsaXNoVmFsdWV9KS5cbmNhdGNoKGZhaWwpO1xuIH1cblxuLyoqIEB0eXBlIHtTdG9yZWRTdWJzY3JpcHRpb248VD59ICovXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgLS0gZGlmZmVyZW50IHBlciBwYWNrYWdlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNDYyMCovXG4vKiBAdHMtaWdub3JlIGdldFN0b3JlS2V5IHR5cGUgZG9lcyBub3QgaGF2ZSBgc3Vic2NyaXB0aW9uYCovXG5jb25zdCBzdG9yZXN1Yj1GYXIoJ1N0b3JlZFN1YnNjcmlwdGlvbicse1xuZ2V0U3RvcmVLZXk6YXN5bmMoKT0+e1xuaWYoIXN0b3JhZ2VOb2RlKXtcbnJldHVybiBoYXJkZW4oe3N1YnNjcmlwdGlvbn0pO1xuIH1cbmNvbnN0IHN0b3JlS2V5PWF3YWl0IEUoc3RvcmFnZU5vZGUpLmdldFN0b3JlS2V5KCk7XG5yZXR1cm4gaGFyZGVuKHsuLi5zdG9yZUtleSxzdWJzY3JpcHRpb259KTtcbiB9LFxuZ2V0VW5zZXJpYWxpemVyOigpPT51bnNlcmlhbGl6ZXIsXG5nZXRTaGFyYWJsZVN1YnNjcmlwdGlvbkludGVybmFsczpcbnN1YnNjcmlwdGlvbi5nZXRTaGFyYWJsZVN1YnNjcmlwdGlvbkludGVybmFscyxcbltTeW1ib2wuYXN5bmNJdGVyYXRvcl06c3Vic2NyaXB0aW9uW1N5bWJvbC5hc3luY0l0ZXJhdG9yXX0pO1xuXG5yZXR1cm4gc3RvcmVzdWI7XG4gfTskaOKAjV9vbmNlLm1ha2VTdG9yZWRTdWJzY3JpcHRpb24obWFrZVN0b3JlZFN1YnNjcmlwdGlvbik7XG5oYXJkZW4obWFrZVN0b3JlZFN1YnNjcmlwdGlvbik7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgdXNlIFN0b3JlZFB1Ymxpc2hLaXRcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTdG9yZWRQdWJsaXNoZXJLaXRcbiAqIEBwcm9wZXJ0eSB7U3RvcmVkU3Vic2NyaXB0aW9uPFQ+fSBzdWJzY3JpYmVyXG4gKiBAcHJvcGVydHkge0l0ZXJhdGlvbk9ic2VydmVyPFQ+fSBwdWJsaXNoZXJcbiAqL1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIHVzZSBtYWtlU3RvcmVkUHVibGlzaEtpdFxuICpcbiAqIEB0ZW1wbGF0ZSBbVD11bmtub3duXVxuICogQHBhcmFtIHtFUmVmPFN0b3JhZ2VOb2RlPn0gW3N0b3JhZ2VOb2RlXVxuICogQHBhcmFtIHtFUmVmPE1hcnNoYWxsZXI+fSBbbWFyc2hhbGxlcl1cbiAqIEBwYXJhbSB7c3RyaW5nfSBbY2hpbGRQYXRoXVxuICogQHJldHVybnMge1N0b3JlZFB1Ymxpc2hlcktpdDxUPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VTdG9yZWRQdWJsaXNoZXJLaXQ9KHN0b3JhZ2VOb2RlLG1hcnNoYWxsZXIsY2hpbGRQYXRoKT0+e1xuY29uc3R7cHVibGljYXRpb24sc3Vic2NyaXB0aW9ufT1tYWtlU3Vic2NyaXB0aW9uS2l0KCk7XG5cbmlmKHN0b3JhZ2VOb2RlJiZjaGlsZFBhdGgpe1xuc3RvcmFnZU5vZGU9RShzdG9yYWdlTm9kZSkubWFrZUNoaWxkTm9kZShjaGlsZFBhdGgpO1xuIH1cblxuLyogd3JhcCB0aGUgc3Vic2NyaXB0aW9uIHRvIHRlZSBldmVudHMgdG8gc3RvcmFnZSwgcmVwZWF0aW5nIHRvIHRoaXMgYHN1YnNjcmliZXJgKi9cbmNvbnN0IHN1YnNjcmliZXI9bWFrZVN0b3JlZFN1YnNjcmlwdGlvbihcbnN1YnNjcmlwdGlvbixcbnN0b3JhZ2VOb2RlLFxubWFyc2hhbGxlcik7XG5cblxucmV0dXJue1xucHVibGlzaGVyOnB1YmxpY2F0aW9uLFxuc3Vic2NyaWJlcn07XG5cbiB9O1xuXG4vKipcbiAqIExpa2UgbWFrZVB1Ymxpc2hLaXQgdGhpcyBtYWtlcyBhIGB7IHB1Ymxpc2hlciwgc3Vic2NyaWJlciB9YCBwYWlyIGZvciBkb2luZyBlZmZpY2llbnRcbiAqIGRpc3RyaWJ1dGVkIHB1Yi9zdWIgc3VwcG9ydGluZyBib3RoIFwiZWFjaFwiIGFuZCBcImxhdGVzdFwiIGl0ZXJhdGlvblxuICogb2YgcHVibGlzaGVkIHZhbHVlcy5cbiAqXG4gKiBXaGF0J3MgZGlmZmVyZW50IGlzIGBzdWJzY3JpYmVyYCB0ZWVzIHJlY29yZHMsIHdyaXRpbmcgb3V0IHRvIHN0b3JhZ2VOb2RlLlxuICpcbiAqIEB0ZW1wbGF0ZSBbVD11bmtub3duXVxuICogQHBhcmFtIHtFUmVmPFN0b3JhZ2VOb2RlPn0gc3RvcmFnZU5vZGVcbiAqIEBwYXJhbSB7RVJlZjxNYXJzaGFsbGVyPn0gbWFyc2hhbGxlclxuICogQHJldHVybnMge1N0b3JlZFB1Ymxpc2hLaXQ8VD59XG4gKi8kaOKAjV9vbmNlLm1ha2VTdG9yZWRQdWJsaXNoZXJLaXQobWFrZVN0b3JlZFB1Ymxpc2hlcktpdCk7XG5jb25zdCAgICAgICAgbWFrZVN0b3JlZFB1Ymxpc2hLaXQ9KHN0b3JhZ2VOb2RlLG1hcnNoYWxsZXIpPT57XG5jb25zdHtwdWJsaXNoZXIsc3Vic2NyaWJlcn09bWFrZVB1Ymxpc2hLaXQoKTtcblxucmV0dXJue1xucHVibGlzaGVyLFxuLyogd3JhcCB0aGUgc3Vic2NyaWJlciB0byB0ZWUgZXZlbnRzIHRvIHN0b3JhZ2UqL1xuc3Vic2NyaWJlcjptYWtlU3RvcmVkU3Vic2NyaWJlcihzdWJzY3JpYmVyLHN0b3JhZ2VOb2RlLG1hcnNoYWxsZXIpfTtcblxuIH07JGjigI1fb25jZS5tYWtlU3RvcmVkUHVibGlzaEtpdChtYWtlU3RvcmVkUHVibGlzaEtpdCk7XG5oYXJkZW4obWFrZVN0b3JlZFB1Ymxpc2hLaXQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VTdG9yZWRTdWJzY3JpYmVyIjpbIm1ha2VTdG9yZWRTdWJzY3JpYmVyIl0sIm1ha2VTdG9yZWRTdWJzY3JpcHRpb24iOlsibWFrZVN0b3JlZFN1YnNjcmlwdGlvbiJdLCJtYWtlU3RvcmVkUHVibGlzaGVyS2l0IjpbIm1ha2VTdG9yZWRQdWJsaXNoZXJLaXQiXSwibWFrZVN0b3JlZFB1Ymxpc2hLaXQiOlsibWFrZVN0b3JlZFB1Ymxpc2hLaXQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA0bxMuTkMAAA5DAAAKQAAAEBhZ29yaWMvbm90aWZpZXItdjAuNS4xL3NyYy9zdWJzY3JpYmVyLmpzeyJpbXBvcnRzIjpbIi4vcHVibGlzaC1raXQuanMiLCIuL3R5cGVzLWFtYmllbnQuanMiLCJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbIm1ha2VTdWJzY3JpcHRpb24iLCJtYWtlU3Vic2NyaXB0aW9uS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEUsRmFyLG1ha2VQdWJsaXNoS2l0OyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV0sW1wiLi9wdWJsaXNoLWtpdC5qc1wiLCBbW1wibWFrZVB1Ymxpc2hLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VQdWJsaXNoS2l0ID0gJGjigI1fYSldXV1dLFtcIi4vdHlwZXMtYW1iaWVudC5qc1wiLCBbXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8UHVibGljYXRpb25SZWNvcmQ8VD4+fSBzaGFyYWJsZUludGVybmFsc1BcbiAqIEByZXR1cm5zIHtTdWJzY3JpcHRpb248VD59XG4gKi9cbmNvbnN0IG1ha2VTdWJzY3JpcHRpb249KHNoYXJhYmxlSW50ZXJuYWxzUCk9PntcbmNvbnN0IHN1YnNjcmlwdGlvbj1GYXIoJ1N1YnNjcmlwdGlvbicse1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbltTeW1ib2wuYXN5bmNJdGVyYXRvcl06KCk9Pm1ha2VTdWJzY3JpcHRpb25JdGVyYXRvcihzaGFyYWJsZUludGVybmFsc1ApLFxuXG4vKipcbiAqIFVzZSB0aGlzIHRvIGRpc3RyaWJ1dGUgYSBTdWJzY3JpcHRpb24gZWZmaWNpZW50bHkgb3ZlciB0aGUgbmV0d29yayxcbiAqIGJ5IG9idGFpbmluZyB0aGlzIGZyb20gdGhlIFN1YnNjcmlwdGlvbiB0byBiZSByZXBsaWNhdGVkLCBhbmQgYXBwbHlpbmdcbiAqIGBtYWtlU3Vic2NyaXB0aW9uYCB0byBpdCBhdCB0aGUgbmV3IHNpdGUgdG8gZ2V0IGFuIGVxdWl2YWxlbnQgbG9jYWxcbiAqIFN1YnNjcmlwdGlvbiBhdCB0aGF0IHNpdGUuXG4gKlxuICogQHJldHVybnMge0VSZWY8UHVibGljYXRpb25SZWNvcmQ8VD4+fVxuICovXG5nZXRTaGFyYWJsZVN1YnNjcmlwdGlvbkludGVybmFsczooKT0+c2hhcmFibGVJbnRlcm5hbHNQLFxuXG5nZXRTdG9yZUtleTooKT0+aGFyZGVuKHtzdWJzY3JpcHRpb259KX0pO1xuXG5yZXR1cm4gc3Vic2NyaXB0aW9uO1xuIH07JGjigI1fb25jZS5tYWtlU3Vic2NyaXB0aW9uKG1ha2VTdWJzY3JpcHRpb24pO1xuaGFyZGVuKG1ha2VTdWJzY3JpcHRpb24pO1xuXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxQdWJsaWNhdGlvblJlY29yZDxUPj59IHRhaWxQXG4gKiBAcmV0dXJucyB7U3Vic2NyaXB0aW9uSXRlcmF0b3I8VD59XG4gKi9cbmNvbnN0IG1ha2VTdWJzY3JpcHRpb25JdGVyYXRvcj0odGFpbFApPT57XG4vKiBUbyB1bmRlcnN0YW5kIHRoZSBpbXBsZW1lbnRhdGlvbiwgc3RhcnQgd2l0aCovXG4vKiBodHRwczovL3dlYi5hcmNoaXZlLm9yZy93ZWIvMjAxNjA0MDQxMjIyNTAvaHR0cDovL3dpa2kuZWNtYXNjcmlwdC5vcmcvZG9rdS5waHA/aWQ9c3RyYXdtYW46Y29uY3VycmVuY3kjaW5maW5pdGVfcXVldWUqL1xucmV0dXJuIEZhcignU3Vic2NyaXB0aW9uSXRlcmF0b3InLHtcbnN1YnNjcmliZTooKT0+bWFrZVN1YnNjcmlwdGlvbih0YWlsUCksXG5bU3ltYm9sLmFzeW5jSXRlcmF0b3JdOigpPT5tYWtlU3Vic2NyaXB0aW9uSXRlcmF0b3IodGFpbFApLFxubmV4dDooKT0+e1xuY29uc3QgcmVzdWx0UD1FLmdldCh0YWlsUCkuaGVhZDtcbnRhaWxQPUUuZ2V0KHRhaWxQKS50YWlsO1xuUHJvbWlzZS5yZXNvbHZlKHRhaWxQKS5jYXRjaCgoKT0+eyB9KTsvKiBzdXBwcmVzcyB1bmhhbmRsZWQgcmVqZWN0aW9uIGVycm9yKi9cbnJldHVybiByZXN1bHRQO1xuIH19KTtcblxuIH07XG5cbi8qKlxuICogTWFrZXMgYSBgeyBwdWJsaWNhdGlvbiwgc3Vic2NyaXB0aW9uIH1gIGZvciBkb2luZyBsb3NzbGVzcyBlZmZpY2llbnRcbiAqIGRpc3RyaWJ1dGVkIHB1Yi9zdWIuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEByZXR1cm5zIHtTdWJzY3JpcHRpb25SZWNvcmQ8VD59XG4gKi9cbmNvbnN0IG1ha2VTdWJzY3JpcHRpb25LaXQ9KCk9PntcbmNvbnN0e3B1Ymxpc2hlcixzdWJzY3JpYmVyfT1tYWtlUHVibGlzaEtpdCgpO1xuXG4vKiBUaGUgcHVibGlzaCBraXQgc3Vic2NyaWJlciBpcyBwcmVmaXgtbG9zc3ksIHNvIG1ha2luZyAqdGhpcyogc3Vic2NyaWJlciBjb21wbGV0ZWx5Ki9cbi8qIGxvc3NsZXNzIHJlcXVpcmVzIGVhZ2VyIGNvbnN1bXB0aW9uIG9mIHRoZSBmb3JtZXIuKi9cbi8qIFN1Y2ggbG9zc2xlc3NuZXNzIGluaGliaXRzIEdDLCB3aGljaCBpcyB3aHkgd2UncmUgbW92aW5nIGF3YXkgZnJvbSBpdC4qL1xuY29uc3QgcHViTGlzdD1zdWJzY3JpYmVyLnN1YnNjcmliZUFmdGVyKCk7XG5jb25zdCBzdWJzY3JpcHRpb249bWFrZVN1YnNjcmlwdGlvbihwdWJMaXN0KTtcblxuLyoqIEB0eXBlIHtJdGVyYXRpb25PYnNlcnZlcjxUPn0gKi9cbmNvbnN0IHB1YmxpY2F0aW9uPUZhcigncHVibGljYXRpb24nLHtcbnVwZGF0ZVN0YXRlOnB1Ymxpc2hlci5wdWJsaXNoLFxuZmluaXNoOnB1Ymxpc2hlci5maW5pc2gsXG5mYWlsOnB1Ymxpc2hlci5mYWlsfSk7XG5cblxucmV0dXJuIGhhcmRlbih7cHVibGljYXRpb24sc3Vic2NyaXB0aW9ufSk7XG4gfTskaOKAjV9vbmNlLm1ha2VTdWJzY3JpcHRpb25LaXQobWFrZVN1YnNjcmlwdGlvbktpdCk7XG5oYXJkZW4obWFrZVN1YnNjcmlwdGlvbktpdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVN1YnNjcmlwdGlvbiI6WyJtYWtlU3Vic2NyaXB0aW9uIl0sIm1ha2VTdWJzY3JpcHRpb25LaXQiOlsibWFrZVN1YnNjcmlwdGlvbktpdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAD+LodVCSgAAAkoAAAsAAAAQGFnb3JpYy9ub3RpZmllci12MC41LjEvc3JjL3R5cGVzLWFtYmllbnQuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vZmFyJykuRVJlZjxUPn0gRVJlZlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9wcm9taXNlLWtpdCcpLlByb21pc2VLaXQ8VD59IFByb21pc2VLaXRcbiAqL1xuXG4vKipcbiAqIERlcHJlY2F0ZWQuIFVzZSBQcm9taXNlS2l0IGluc3RlYWQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9wcm9taXNlLWtpdCcpLlByb21pc2VSZWNvcmQ8VD59IFByb21pc2VSZWNvcmRcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7e1xuICogICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdOiAoKSA9PiBBc3luY0l0ZXJhdG9yPFQsIFQ+XG4gKiB9fSBDb25zaXN0ZW50QXN5bmNJdGVyYWJsZVxuICogQW4gQXN5bmNJdGVyYWJsZSB0aGF0IHJldHVybnMgdGhlIHNhbWUgdHlwZSBhcyBpdCB5aWVsZHMuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gSXRlcmF0aW9uT2JzZXJ2ZXI8VD5cbiAqIEEgdmFsaWQgc2VxdWVuY2Ugb2YgY2FsbHMgdG8gdGhlIG1ldGhvZHMgb2YgYW4gYEl0ZXJhdGlvbk9ic2VydmVyYFxuICogcmVwcmVzZW50cyBhbiBpdGVyYXRpb24uIEEgdmFsaWQgc2VxdWVuY2UgY29uc2lzdHMgb2YgYW55IG51bWJlciBvZiBjYWxsc1xuICogdG8gYHVwZGF0ZVN0YXRlYCB3aXRoIHRoZSBzdWNjZXNzaXZlIG5vbi1maW5hbCB2YWx1ZXMsIGZvbGxvd2VkIGJ5IGFcbiAqIGZpbmFsIGNhbGwgdG8gZWl0aGVyIGBmaW5pc2hgIHdpdGggYSBzdWNjZXNzZnVsIGBjb21wbGV0aW9uYCB2YWx1ZVxuICogb3IgYGZhaWxgIHdpdGggdGhlIGFsbGVnZWQgYHJlYXNvbmAgZm9yIGZhaWx1cmUuIEFmdGVyIGF0IG1vc3Qgb25lXG4gKiB0ZXJtaW5hdGluZyBjYWxscywgbm8gZnVydGhlciBjYWxscyB0byB0aGVzZSBtZXRob2RzIGFyZSB2YWxpZCBhbmQgbXVzdCBiZVxuICogcmVqZWN0ZWQuXG4gKiBAcHJvcGVydHkgeyhub25GaW5hbFZhbHVlOiBUKSA9PiB2b2lkfSB1cGRhdGVTdGF0ZVxuICogQHByb3BlcnR5IHsoY29tcGxldGlvbjogVCkgPT4gdm9pZH0gZmluaXNoXG4gKiBAcHJvcGVydHkgeyhyZWFzb246IGFueSkgPT4gdm9pZH0gZmFpbFxuICovXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gUHVibGljYXRpb25SZWNvcmRcbiAqIEBwcm9wZXJ0eSB7SXRlcmF0b3JSZXN1bHQ8VD59IGhlYWRcbiAqIEBwcm9wZXJ0eSB7YmlnaW50fSBwdWJsaXNoQ291bnRcbiAqIEBwcm9wZXJ0eSB7UHVibGljYXRpb25MaXN0PFQ+fSB0YWlsXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge0VSZWY8UHVibGljYXRpb25SZWNvcmQ8VD4+fSBQdWJsaWNhdGlvbkxpc3RcbiAqIFdpbGwgYmUgc2hhcmVkIGJldHdlZW4gbWFjaGluZXMsIHNvIGl0IG11c3QgYmUgc2FmZSB0byBleHBvc2UuIEJ1dCBvdGhlclxuICogc29mdHdhcmUgc2hvdWxkIGNvbnNpZGVyIGl0IG9wYXF1ZSwgbm90IGRlcGVuZGluZyBvbiBpdHMgaW50ZXJuYWwgc3RydWN0dXJlLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN1YnNjcmliZXJcbiAqIEBwcm9wZXJ0eSB7KHB1Ymxpc2hDb3VudD86IGJpZ2ludCkgPT4gUHVibGljYXRpb25MaXN0PFQ+fSBzdWJzY3JpYmVBZnRlclxuICogSW50ZXJuYWxseSB1c2VkIHRvIGdldCB0aGUgXCJjdXJyZW50XCIgU2hhcmFibGVTdWJzY3JpcHRpb25JbnRlcm5hbHNcbiAqIGluIG9yZGVyIHRvIG1ha2UgYSBzdWJzY3JpcHRpb24gaXRlcmF0b3IgdGhhdCBzdGFydHMgdGhlcmUuXG4gKiBUaGUgYW5zd2VyIGlzIFwiY3VycmVudFwiIGluIHRoYXQgaXQgd2FzIGFjY3VyYXRlIGF0IHNvbWUgbW9tZW50IGJldHdlZW5cbiAqIHdoZW4geW91IGFza2VkIGFuZCB3aGVuIHlvdSBnb3QgdGhlIGFuc3dlci5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQdWJsaXNoZXJcbiAqIEEgdmFsaWQgc2VxdWVuY2Ugb2YgY2FsbHMgdG8gdGhlIG1ldGhvZHMgb2YgYW4gYEl0ZXJhdGlvbk9ic2VydmVyYFxuICogcmVwcmVzZW50cyBhbiBpdGVyYXRpb24uIEEgdmFsaWQgc2VxdWVuY2UgY29uc2lzdHMgb2YgYW55IG51bWJlciBvZiBjYWxsc1xuICogdG8gYHB1Ymxpc2hgIHdpdGggdGhlIHN1Y2Nlc3NpdmUgbm9uLWZpbmFsIHZhbHVlcywgZm9sbG93ZWQgYnkgYVxuICogZmluYWwgY2FsbCB0byBlaXRoZXIgYGZpbmlzaGAgd2l0aCBhIHN1Y2Nlc3NmdWwgYGNvbXBsZXRpb25gIHZhbHVlXG4gKiBvciBgZmFpbGAgd2l0aCB0aGUgYWxsZWdlZCBgcmVhc29uYCBmb3IgZmFpbHVyZS4gQWZ0ZXIgYXQgbW9zdCBvbmVcbiAqIHRlcm1pbmF0aW5nIGNhbGxzLCBubyBmdXJ0aGVyIGNhbGxzIHRvIHRoZXNlIG1ldGhvZHMgYXJlIHZhbGlkIGFuZCBtdXN0IGJlXG4gKiByZWplY3RlZC5cbiAqIEBwcm9wZXJ0eSB7KG5vbkZpbmFsVmFsdWU6IFQpID0+IHZvaWR9IHB1Ymxpc2hcbiAqIEBwcm9wZXJ0eSB7KGNvbXBsZXRpb246IFQpID0+IHZvaWR9IGZpbmlzaFxuICogQHByb3BlcnR5IHsocmVhc29uOiBhbnkpID0+IHZvaWR9IGZhaWxcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7UGFydGlhbDxQdWJsaXNoZXI8VD4+fSBQdWJsaXNoT2JzZXJ2ZXJcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQdWJsaXNoS2l0PFQ+XG4gKiBAcHJvcGVydHkge1B1Ymxpc2hlcjxUPn0gcHVibGlzaGVyXG4gKiBAcHJvcGVydHkge1N1YnNjcmliZXI8VD59IHN1YnNjcmliZXJcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTdG9yZWRQdWJsaXNoS2l0PFQ+XG4gKiBAcHJvcGVydHkge1B1Ymxpc2hlcjxUPn0gcHVibGlzaGVyXG4gKiBAcHJvcGVydHkge1N0b3JlZFN1YnNjcmliZXI8VD59IHN1YnNjcmliZXJcbiAqL1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQHR5cGVkZWYgeydtYW5kYXRvcnknIHwgJ29wcG9ydHVuaXN0aWMnIHwgJ2lnbm9yZWQnfSBEdXJhYmxlUHVibGlzaEtpdFZhbHVlRHVyYWJpbGl0eVxuICpcbiAqIER1cmFiaWxpdHkgY29uZmlndXJlcyBjb25zdHJhaW50cyBvbiBub24tdGVybWluYWwgdmFsdWVzIHRoYXQgY2FuIGJlXG4gKiBwdWJsaXNoZWQgdG8gYSBkdXJhYmxlIHB1Ymxpc2gga2l0ICh0ZXJtaW5hbCB2YWx1ZXMgc2VudCB0byBmaW5pc2ggb3IgZmFpbFxuICogbXVzdCBhbHdheXMgYmUgZHVyYWJsZSkuXG4gKiAtICdtYW5kYXRvcnknIG1lYW5zIHRoYXQgZWFjaCB2YWx1ZSBtdXN0IGJlIGR1cmFibGUsIHNvIGl0IGNhbiBiZSByZXN0b3JlZFxuICogICBvbiB1cGdyYWRlLlxuICogLSAnb3Bwb3J0dW5pc3RpYycgbWVhbnMgdGhhdCBhIGR1cmFibGUgdmFsdWUgaXMgcGVyc2lzdGVkIGZvciBwb3N0LXVwZ3JhZGVcbiAqICAgcmVzdG9yYXRpb24sIGJ1dCBhIG5vbi1kdXJhYmxlIHZhbHVlIGlzIHN0aWxsIGFjY2VwdGVkIChhbmQgd2lsbCByZXN1bHQgaW5cbiAqICAgdmFsdWVsZXNzIHJlc3RvcmF0aW9uKS5cbiAqIC0gJ2lnbm9yZWQnIG1lYW5zIHRoYXQgYSB2YWx1ZSBpcyBub3QgcGVyc2lzdGVkIGZvciByZXN0b3JhdGlvbiBldmVuIGlmIGl0XG4gKiAgIGlzIGR1cmFibGUuXG4gKlxuICogJ21hbmRhdG9yeScgaXMgdGhlIG9ubHkgY3VycmVudGx5LXN1cHBvcnRlZCB2YWx1ZSwgYW5kIG90aGVycyBtdXN0IG5vdCBiZVxuICogZW5hYmxlZCB3aXRob3V0IHRlc3QgY292ZXJhZ2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBEdXJhYmxlUHVibGlzaEtpdFN0YXRlXG4gKlxuICogQHByb3BlcnR5IHtEdXJhYmxlUHVibGlzaEtpdFZhbHVlRHVyYWJpbGl0eX0gdmFsdWVEdXJhYmlsaXR5XG4gKlxuICogQHByb3BlcnR5IHtiaWdpbnR9IHB1Ymxpc2hDb3VudFxuICpcbiAqIEBwcm9wZXJ0eSB7J2xpdmUnIHwgJ2ZpbmlzaGVkJyB8ICdmYWlsZWQnfSBzdGF0dXNcbiAqXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGhhc1ZhbHVlXG4gKiBoYXNWYWx1ZSBpbmRpY2F0ZXMgdGhlIHByZXNlbmNlIG9mIHZhbHVlLiBJdCBzdGFydHMgb2ZmIGZhbHNlLFxuICogYW5kIGNhbiBiZSByZXNldCB0byBmYWxzZSB3aGVuIGEgZHVyYWJsZSBwdWJsaXNoIGtpdCBpcyByZXN0b3JlZCBhbmRcbiAqIHRoZSBwcmV2aW91cyB2YWx1ZSB3YXMgbm90IGR1cmFibGUsIG9yIG5vbi10ZXJtaW5hbCBhbmQgdmFsdWVEdXJhYmxpdHkgaXMgJ2lnbm9yZWQnLlxuICpcbiAqIEBwcm9wZXJ0eSB7YW55fSB2YWx1ZVxuICogdmFsdWUgaG9sZHMgZWl0aGVyIGEgbm9uLXRlcm1pbmFsIHZhbHVlIGZyb20gYHB1Ymxpc2hgIG9yIGEgdGVybWluYWwgdmFsdWVcbiAqIGZyb20gYGZpbmlzaGAgb3IgYGZhaWxgLCBkZXBlbmRpbmcgdXBvbiB0aGUgdmFsdWUgaW4gc3RhdHVzLlxuICovXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyogVE9ETzogTmFycm93IHRvIGV4Y2x1ZGUgbnVtYmVyLiovXG4vKipcbiAqIEB0eXBlZGVmIHtudW1iZXIgfCBiaWdpbnQgfCB1bmRlZmluZWR9IFVwZGF0ZUNvdW50IGEgdmFsdWUgdXNlZCB0byBtYXJrIHRoZSBwb3NpdGlvblxuICogaW4gdGhlIHVwZGF0ZSBzdHJlYW0uIEZvciB0aGUgbGFzdCBzdGF0ZSwgdGhlIHVwZGF0ZUNvdW50IGlzIHVuZGVmaW5lZC5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBVcGRhdGVSZWNvcmQ8VD5cbiAqIEBwcm9wZXJ0eSB7VH0gdmFsdWUgaXMgd2hhdGV2ZXIgc3RhdGUgdGhlIHNlcnZpY2Ugd2FudHMgdG8gcHVibGlzaFxuICogQHByb3BlcnR5IHtVcGRhdGVDb3VudH0gdXBkYXRlQ291bnQgaXMgYSB2YWx1ZSB0aGF0IGlkZW50aWZpZXMgdGhlIHVwZGF0ZVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBjYWxsYmFjayBHZXRVcGRhdGVTaW5jZTxUPiBDYW4gYmUgY2FsbGVkIHJlcGVhdGVkbHkgdG8gZ2V0IGEgc2VxdWVuY2Ugb2ZcbiAqIHVwZGF0ZSByZWNvcmRzXG4gKiBAcGFyYW0ge1VwZGF0ZUNvdW50fSBbdXBkYXRlQ291bnRdIHJldHVybiB1cGRhdGUgcmVjb3JkIGFzIG9mIGFuIHVwZGF0ZVxuICogY291bnQuIElmIHRoZSBgdXBkYXRlQ291bnRgIGFyZ3VtZW50IGlzIG9taXR0ZWQgb3IgZGlmZmVycyBmcm9tIHRoZSBjdXJyZW50XG4gKiB1cGRhdGUgY291bnQsIHJldHVybiB0aGUgY3VycmVudCByZWNvcmQuXG4gKiBPdGhlcndpc2UsIGFmdGVyIHRoZSBuZXh0IHN0YXRlIGNoYW5nZSwgdGhlIHByb21pc2Ugd2lsbCByZXNvbHZlIHRvIHRoZVxuICogdGhlbi1jdXJyZW50IHZhbHVlIG9mIHRoZSByZWNvcmQuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxVcGRhdGVSZWNvcmQ8VD4+fSByZXNvbHZlcyB0byB0aGUgY29ycmVzcG9uZGluZ1xuICogdXBkYXRlXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gQmFzZU5vdGlmaWVyPFQ+IGFuIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvIGdldCB0aGVcbiAqIGN1cnJlbnQgc3RhdGUgb3IgdXBkYXRlc1xuICogQHByb3BlcnR5IHtHZXRVcGRhdGVTaW5jZTxUPn0gZ2V0VXBkYXRlU2luY2UgcmV0dXJuIHVwZGF0ZSByZWNvcmQgYXMgb2YgYW5cbiAqIHVwZGF0ZSBjb3VudC5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7QmFzZU5vdGlmaWVyPFQ+fSBOb3RpZmllckludGVybmFscyBXaWxsIGJlIHNoYXJlZCBiZXR3ZWVuIG1hY2hpbmVzLFxuICogc28gaXQgbXVzdCBiZSBzYWZlIHRvIGV4cG9zZS4gQnV0IG90aGVyIHNvZnR3YXJlIHNob3VsZCBhdm9pZCBkZXBlbmRpbmcgb25cbiAqIGl0cyBpbnRlcm5hbCBzdHJ1Y3R1cmUuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge0Jhc2VOb3RpZmllcjxUPiAmXG4gKiAgIENvbnNpc3RlbnRBc3luY0l0ZXJhYmxlPFQ+ICZcbiAqICAgU2hhcmFibGVOb3RpZmllcjxUPlxuICogfSBOb3RpZmllcjxUPiBhbiBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCB0byBnZXQgdGhlIGN1cnJlbnQgc3RhdGUgb3IgdXBkYXRlc1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFNoYXJhYmxlTm90aWZpZXJcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gRVJlZjxOb3RpZmllckludGVybmFsczxUPj59IGdldFNoYXJhYmxlTm90aWZpZXJJbnRlcm5hbHNcbiAqIFVzZWQgdG8gcmVwbGljYXRlIHRoZSBtdWx0aWNhc3QgdmFsdWVzIGF0IG90aGVyIHNpdGVzLiBUbyBtYW51YWxseSBjcmVhdGUgYVxuICogbG9jYWwgcmVwcmVzZW50YXRpdmUgb2YgYSBOb3RpZmljYXRpb24sIGRvXG4gKiBgYGBqc1xuICogbG9jYWxJdGVyYWJsZSA9XG4gKiAgIG1ha2VOb3RpZmllcihFKHJlbW90ZUl0ZXJhYmxlKS5nZXRTaGFyYWJsZU5vdGlmaWVySW50ZXJuYWxzKCkpO1xuICogYGBgXG4gKiBUaGUgcmVzdWx0aW5nIGBsb2NhbEl0ZXJhYmxlYCBhbHNvIHN1cHBvcnRzIHN1Y2ggcmVtb3RlIHVzZSwgYW5kXG4gKiB3aWxsIHJldHVybiBhY2Nlc3MgdG8gdGhlIHNhbWUgcmVwcmVzZW50YXRpb24uXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gTm90aWZpZXJSZWNvcmQ8VD4gdGhlIHByb2R1Y2VkIG5vdGlmaWVyL3VwZGF0ZXIgcGFpclxuICogQHByb3BlcnR5IHtJdGVyYXRpb25PYnNlcnZlcjxUPn0gdXBkYXRlciB0aGUgKGNsb3NlbHktaGVsZCkgbm90aWZpZXIgcHJvZHVjZXJcbiAqIEBwcm9wZXJ0eSB7Tm90aWZpZXI8VD59IG5vdGlmaWVyIHRoZSAod2lkZWx5LWhlbGQpIG5vdGlmaWVyIGNvbnN1bWVyXG4gKi9cblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7Q29uc2lzdGVudEFzeW5jSXRlcmFibGU8VD4gJlxuICogICBTaGFyYWJsZVN1YnNjcmlwdGlvbjxUPn0gU3Vic2NyaXB0aW9uPFQ+XG4gKiBBIGZvcm0gb2YgQXN5bmNJdGVyYWJsZSBzdXBwb3J0aW5nIGRpc3RyaWJ1dGVkIGFuZCBtdWx0aWNhc3QgdXNhZ2UuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gU2hhcmFibGVTdWJzY3JpcHRpb25cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gRVJlZjxQdWJsaWNhdGlvblJlY29yZDxUPj59IGdldFNoYXJhYmxlU3Vic2NyaXB0aW9uSW50ZXJuYWxzXG4gKiBVc2VkIHRvIHJlcGxpY2F0ZSB0aGUgbXVsdGljYXN0IHZhbHVlcyBhdCBvdGhlciBzaXRlcy4gVG8gbWFudWFsbHkgY3JlYXRlIGFcbiAqIGxvY2FsIHJlcHJlc2VudGF0aXZlIG9mIGEgU3Vic2NyaXB0aW9uLCBkb1xuICogYGBganNcbiAqIGxvY2FsSXRlcmFibGUgPVxuICogICBtYWtlU3Vic2NyaXB0aW9uKEUocmVtb3RlSXRlcmFibGUpLmdldFNoYXJhYmxlU3Vic2NyaXB0aW9uSW50ZXJuYWxzKCkpO1xuICogYGBgXG4gKiBUaGUgcmVzdWx0aW5nIGBsb2NhbEl0ZXJhYmxlYCBhbHNvIHN1cHBvcnRzIHN1Y2ggcmVtb3RlIHVzZSwgYW5kXG4gKiB3aWxsIHJldHVybiBhY2Nlc3MgdG8gdGhlIHNhbWUgcmVwcmVzZW50YXRpb24uXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge0FzeW5jSXRlcmF0b3I8VCwgVD4gJiBDb25zaXN0ZW50QXN5bmNJdGVyYWJsZTxUPn0gU3Vic2NyaXB0aW9uSXRlcmF0b3I8VD5cbiAqIGFuIEFzeW5jSXRlcmF0b3Igc3VwcG9ydGluZyBkaXN0cmlidXRlZCBhbmQgbXVsdGljYXN0IHVzYWdlLlxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gU3Vic2NyaXB0aW9uPFQ+fSBzdWJzY3JpYmVcbiAqIEdldCBhIG5ldyBzdWJzY3JpcHRpb24gd2hvc2Ugc3RhcnRpbmcgcG9zaXRpb24gaXMgdGhpcyBpdGVyYXRvcidzIGN1cnJlbnRcbiAqIHBvc2l0aW9uLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN1YnNjcmlwdGlvblJlY29yZDxUPlxuICogQHByb3BlcnR5IHtJdGVyYXRpb25PYnNlcnZlcjxUPn0gcHVibGljYXRpb25cbiAqIEBwcm9wZXJ0eSB7U3Vic2NyaXB0aW9uPFQ+fSBzdWJzY3JpcHRpb25cbiAqL1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKiBAdHlwZWRlZiB7UmV0dXJuVHlwZTx0eXBlb2YgWGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLm1ha2VNYXJzaGFsPn0gTWFyc2hhbGxlciAqL1xuLyoqIEB0eXBlZGVmIHtQaWNrPE1hcnNoYWxsZXIsICd1bnNlcmlhbGl6ZSc+fSBVbnNlcmlhbGl6ZXIgKi9cblxuLyoqXG4gKiBEZWZpbmVkIGJ5IHZzdG9yYWdlU3RvcmVLZXkgaW4gdnN0b3JhZ2UuZ29cbiAqXG4gKiBAdHlwZWRlZiBWU3RvcmFnZUtleVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHN0b3JlTmFtZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHN0b3JlU3Via2V5XG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGF0YVByZWZpeEJ5dGVzXG4gKi9cblxuLyoqXG4gKiBUaGlzIHJlcHJlc2VudHMgYSBub2RlIGluIGFuIElBVkwgdHJlZS5cbiAqXG4gKiBUaGUgYWN0aXZlIGltcGxlbWVudGF0aW9uIGlzIHgvdnN0b3JhZ2UsIGFuIEFnb3JpYyBleHRlbnNpb24gb2YgdGhlIENvc21vcyBTREsuXG4gKlxuICogVnN0b3JhZ2UgaXMgYSBoaWVyYXJjaGljYWwgZXh0ZXJuYWxseS1yZWFjaGFibGUgc3RvcmFnZSBzdHJ1Y3R1cmUgdGhhdFxuICogaWRlbnRpZmllcyBjaGlsZHJlbiBieSByZXN0cmljdGVkIEFTQ0lJIG5hbWUgYW5kIGlzIGFzc29jaWF0ZWQgd2l0aCBhcmJpdHJhcnlcbiAqIHN0cmluZy12YWx1ZWQgZGF0YSBmb3IgZWFjaCBub2RlLCBkZWZhdWx0aW5nIHRvIHRoZSBlbXB0eSBzdHJpbmcuXG4gKlxuICogQHR5cGVkZWYge29iamVjdH0gU3RvcmFnZU5vZGVcbiAqIEBwcm9wZXJ0eSB7KGRhdGE6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPn0gc2V0VmFsdWUgcHVibGlzaGVzIHNvbWUgZGF0YVxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPFZTdG9yYWdlS2V5Pn0gZ2V0U3RvcmVLZXkgZ2V0IHRoZVxuICogZXh0ZXJuYWxseS1yZWFjaGFibGUgc3RvcmUga2V5IGZvciB0aGlzIHN0b3JhZ2UgaXRlbVxuICogQHByb3BlcnR5IHsoc3ViUGF0aDogc3RyaW5nLCBvcHRpb25zPzoge3NlcXVlbmNlPzogYm9vbGVhbn0pID0+IFN0b3JhZ2VOb2RlfSBtYWtlQ2hpbGROb2RlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTdG9yZWRGYWNldFxuICogQHByb3BlcnR5IHtTdG9yYWdlTm9kZVsnZ2V0U3RvcmVLZXknXX0gZ2V0U3RvcmVLZXkgZ2V0IHRoZSBleHRlcm5hbGx5LXJlYWNoYWJsZSBzdG9yZSBrZXlcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gVW5zZXJpYWxpemVyfSBnZXRVbnNlcmlhbGl6ZXIgZ2V0IHRoZSB1bnNlcmlhbGl6ZXIgZm9yIHRoZSBzdG9yZWQgZGF0YVxuICovXG5cbi8qKlxuICogQGRlcHJlY2F0ZWRcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7U3Vic2NyaXB0aW9uPFQ+ICYgU3RvcmVkRmFjZXR9IFN0b3JlZFN1YnNjcmlwdGlvblxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtTdWJzY3JpYmVyPFQ+ICYgU3RvcmVkRmFjZXR9IFN0b3JlZFN1YnNjcmliZXJcbiAqL1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADW1iozlQEAAJUBAAAgAAAAQGFnb3JpYy9zdG9yZS12MC44LjMvZXhwb3J0ZWQuanN7ImltcG9ydHMiOlsiLi9zcmMvcGF0dGVybnMvaW50ZXJuYWwtdHlwZXMuanMiLCIuL3NyYy90eXBlcy5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3NyYy90eXBlcy5qc1wiLCBbXV0sW1wiLi9zcmMvcGF0dGVybnMvaW50ZXJuYWwtdHlwZXMuanNcIiwgW11dXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAE5VRpSeIgAAniIAACEAAABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvaW5kZXguanN7ImltcG9ydHMiOlsiLi9rZXlzL2NoZWNrS2V5LmpzIiwiLi9rZXlzL2NvbXBhcmVLZXlzLmpzIiwiLi9rZXlzL2NvcHlCYWcuanMiLCIuL2tleXMvY29weVNldC5qcyIsIi4va2V5cy9tZXJnZS1iYWctb3BlcmF0b3JzLmpzIiwiLi9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanMiLCIuL2xlZ2FjeS9sZWdhY3lNYXAuanMiLCIuL2xlZ2FjeS9sZWdhY3lXZWFrTWFwLmpzIiwiLi9wYXR0ZXJucy9lbmNvZGVQYXNzYWJsZS5qcyIsIi4vcGF0dGVybnMvaW50ZXJmYWNlLXRvb2xzLmpzIiwiLi9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanMiLCIuL3BhdHRlcm5zL3JhbmtPcmRlci5qcyIsIi4vc3RvcmVzL3NjYWxhck1hcFN0b3JlLmpzIiwiLi9zdG9yZXMvc2NhbGFyU2V0U3RvcmUuanMiLCIuL3N0b3Jlcy9zY2FsYXJXZWFrTWFwU3RvcmUuanMiLCIuL3N0b3Jlcy9zY2FsYXJXZWFrU2V0U3RvcmUuanMiLCIuL3N0b3Jlcy9zdG9yZS11dGlscy5qcyJdLCJleHBvcnRzIjpbIk0iLCJhc3NlcnRLZXkiLCJhc3NlcnRLZXlQYXR0ZXJuIiwiYXNzZXJ0UGF0dGVybiIsImJhZ0NvbXBhcmUiLCJiYWdEaXNqb2ludFN1YnRyYWN0IiwiYmFnSW50ZXJzZWN0aW9uIiwiYmFnSXNTdXBlcmJhZyIsImJhZ1VuaW9uIiwiY29lcmNlVG9CYWdFbnRyaWVzIiwiY29lcmNlVG9FbGVtZW50cyIsImNvbXBhcmVLZXlzIiwiY29tcGFyZVJhbmsiLCJkZWZhdWx0IiwiZGVmZW5kUHJvdG90eXBlIiwiZGVmZW5kUHJvdG90eXBlS2l0IiwiZGVmaW5lSGVhcEZhckNsYXNzIiwiZGVmaW5lSGVhcEZhckNsYXNzS2l0IiwiZWxlbWVudHNDb21wYXJlIiwiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0IiwiZWxlbWVudHNEaXNqb2ludFVuaW9uIiwiZWxlbWVudHNJbnRlcnNlY3Rpb24iLCJlbGVtZW50c0lzRGlzam9pbnQiLCJlbGVtZW50c0lzU3VwZXJzZXQiLCJlbGVtZW50c1VuaW9uIiwiZml0IiwiZ2V0Q29weUJhZ0VudHJpZXMiLCJnZXRDb3B5TWFwRW50cmllcyIsImdldENvcHlTZXRLZXlzIiwiZ2V0UmFua0NvdmVyIiwiaW5pdEVtcHR5IiwiaXNFbmNvZGVkUmVtb3RhYmxlIiwiaXNLZXkiLCJpc1BhdHRlcm4iLCJpc1JhbmtTb3J0ZWQiLCJrZXlFUSIsImtleUdUIiwia2V5R1RFIiwia2V5TFQiLCJrZXlMVEUiLCJtYWtlQ29weUJhZyIsIm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzIiwibWFrZUNvcHlNYXAiLCJtYWtlQ29weVNldCIsIm1ha2VEZWNvZGVQYXNzYWJsZSIsIm1ha2VFbmNvZGVQYXNzYWJsZSIsIm1ha2VIZWFwRmFySW5zdGFuY2UiLCJtYWtlTGVnYWN5TWFwIiwibWFrZUxlZ2FjeVdlYWtNYXAiLCJtYWtlU2NhbGFyTWFwIiwibWFrZVNjYWxhck1hcFN0b3JlIiwibWFrZVNjYWxhclNldFN0b3JlIiwibWFrZVNjYWxhcldlYWtNYXAiLCJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIiwibWFrZVNjYWxhcldlYWtTZXRTdG9yZSIsIm1ha2VTdG9yZSIsIm1ha2VXZWFrU3RvcmUiLCJtYXRjaGVzIiwicHJvdmlkZUxhenkiLCJzZXRDb21wYXJlIiwic2V0RGlzam9pbnRTdWJ0cmFjdCIsInNldERpc2pvaW50VW5pb24iLCJzZXRJbnRlcnNlY3Rpb24iLCJzZXRJc0Rpc2pvaW50Iiwic2V0SXNTdXBlcnNldCIsInNldFVuaW9uIiwic29ydEJ5UmFuayIsInplcm9QYWQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL2tleXMvY2hlY2tLZXkuanNcIiwgW1tcImlzS2V5XCIsIFskaOKAjV9saXZlW1wiaXNLZXlcIl1dXSxbXCJhc3NlcnRLZXlcIiwgWyRo4oCNX2xpdmVbXCJhc3NlcnRLZXlcIl1dXSxbXCJtYWtlQ29weVNldFwiLCBbJGjigI1fbGl2ZVtcIm1ha2VDb3B5U2V0XCJdXV0sW1wiZ2V0Q29weVNldEtleXNcIiwgWyRo4oCNX2xpdmVbXCJnZXRDb3B5U2V0S2V5c1wiXV1dLFtcIm1ha2VDb3B5QmFnXCIsIFskaOKAjV9saXZlW1wibWFrZUNvcHlCYWdcIl1dXSxbXCJtYWtlQ29weUJhZ0Zyb21FbGVtZW50c1wiLCBbJGjigI1fbGl2ZVtcIm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzXCJdXV0sW1wiZ2V0Q29weUJhZ0VudHJpZXNcIiwgWyRo4oCNX2xpdmVbXCJnZXRDb3B5QmFnRW50cmllc1wiXV1dLFtcIm1ha2VDb3B5TWFwXCIsIFskaOKAjV9saXZlW1wibWFrZUNvcHlNYXBcIl1dXSxbXCJnZXRDb3B5TWFwRW50cmllc1wiLCBbJGjigI1fbGl2ZVtcImdldENvcHlNYXBFbnRyaWVzXCJdXV1dXSxbXCIuL2tleXMvY29weVNldC5qc1wiLCBbW1wiY29lcmNlVG9FbGVtZW50c1wiLCBbJGjigI1fbGl2ZVtcImNvZXJjZVRvRWxlbWVudHNcIl1dXV1dLFtcIi4va2V5cy9jb3B5QmFnLmpzXCIsIFtbXCJjb2VyY2VUb0JhZ0VudHJpZXNcIiwgWyRo4oCNX2xpdmVbXCJjb2VyY2VUb0JhZ0VudHJpZXNcIl1dXV1dLFtcIi4va2V5cy9jb21wYXJlS2V5cy5qc1wiLCBbW1wiY29tcGFyZUtleXNcIiwgWyRo4oCNX2xpdmVbXCJjb21wYXJlS2V5c1wiXV1dLFtcImtleUxUXCIsIFskaOKAjV9saXZlW1wia2V5TFRcIl1dXSxbXCJrZXlMVEVcIiwgWyRo4oCNX2xpdmVbXCJrZXlMVEVcIl1dXSxbXCJrZXlFUVwiLCBbJGjigI1fbGl2ZVtcImtleUVRXCJdXV0sW1wia2V5R1RFXCIsIFskaOKAjV9saXZlW1wia2V5R1RFXCJdXV0sW1wia2V5R1RcIiwgWyRo4oCNX2xpdmVbXCJrZXlHVFwiXV1dXV0sW1wiLi9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanNcIiwgW1tcImVsZW1lbnRzSXNTdXBlcnNldFwiLCBbJGjigI1fbGl2ZVtcImVsZW1lbnRzSXNTdXBlcnNldFwiXV1dLFtcImVsZW1lbnRzSXNEaXNqb2ludFwiLCBbJGjigI1fbGl2ZVtcImVsZW1lbnRzSXNEaXNqb2ludFwiXV1dLFtcImVsZW1lbnRzQ29tcGFyZVwiLCBbJGjigI1fbGl2ZVtcImVsZW1lbnRzQ29tcGFyZVwiXV1dLFtcImVsZW1lbnRzVW5pb25cIiwgWyRo4oCNX2xpdmVbXCJlbGVtZW50c1VuaW9uXCJdXV0sW1wiZWxlbWVudHNEaXNqb2ludFVuaW9uXCIsIFskaOKAjV9saXZlW1wiZWxlbWVudHNEaXNqb2ludFVuaW9uXCJdXV0sW1wiZWxlbWVudHNJbnRlcnNlY3Rpb25cIiwgWyRo4oCNX2xpdmVbXCJlbGVtZW50c0ludGVyc2VjdGlvblwiXV1dLFtcImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdFwiLCBbJGjigI1fbGl2ZVtcImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdFwiXV1dLFtcInNldElzU3VwZXJzZXRcIiwgWyRo4oCNX2xpdmVbXCJzZXRJc1N1cGVyc2V0XCJdXV0sW1wic2V0SXNEaXNqb2ludFwiLCBbJGjigI1fbGl2ZVtcInNldElzRGlzam9pbnRcIl1dXSxbXCJzZXRDb21wYXJlXCIsIFskaOKAjV9saXZlW1wic2V0Q29tcGFyZVwiXV1dLFtcInNldFVuaW9uXCIsIFskaOKAjV9saXZlW1wic2V0VW5pb25cIl1dXSxbXCJzZXREaXNqb2ludFVuaW9uXCIsIFskaOKAjV9saXZlW1wic2V0RGlzam9pbnRVbmlvblwiXV1dLFtcInNldEludGVyc2VjdGlvblwiLCBbJGjigI1fbGl2ZVtcInNldEludGVyc2VjdGlvblwiXV1dLFtcInNldERpc2pvaW50U3VidHJhY3RcIiwgWyRo4oCNX2xpdmVbXCJzZXREaXNqb2ludFN1YnRyYWN0XCJdXV1dXSxbXCIuL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qc1wiLCBbW1wiYmFnSXNTdXBlcmJhZ1wiLCBbJGjigI1fbGl2ZVtcImJhZ0lzU3VwZXJiYWdcIl1dXSxbXCJiYWdDb21wYXJlXCIsIFskaOKAjV9saXZlW1wiYmFnQ29tcGFyZVwiXV1dLFtcImJhZ1VuaW9uXCIsIFskaOKAjV9saXZlW1wiYmFnVW5pb25cIl1dXSxbXCJiYWdJbnRlcnNlY3Rpb25cIiwgWyRo4oCNX2xpdmVbXCJiYWdJbnRlcnNlY3Rpb25cIl1dXSxbXCJiYWdEaXNqb2ludFN1YnRyYWN0XCIsIFskaOKAjV9saXZlW1wiYmFnRGlzam9pbnRTdWJ0cmFjdFwiXV1dXV0sW1wiLi9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanNcIiwgW1tcIk1cIiwgWyRo4oCNX2xpdmVbXCJNXCJdXV0sW1wiZ2V0UmFua0NvdmVyXCIsIFskaOKAjV9saXZlW1wiZ2V0UmFua0NvdmVyXCJdXV0sW1wiaXNQYXR0ZXJuXCIsIFskaOKAjV9saXZlW1wiaXNQYXR0ZXJuXCJdXV0sW1wiYXNzZXJ0UGF0dGVyblwiLCBbJGjigI1fbGl2ZVtcImFzc2VydFBhdHRlcm5cIl1dXSxbXCJhc3NlcnRLZXlQYXR0ZXJuXCIsIFskaOKAjV9saXZlW1wiYXNzZXJ0S2V5UGF0dGVyblwiXV1dLFtcIm1hdGNoZXNcIiwgWyRo4oCNX2xpdmVbXCJtYXRjaGVzXCJdXV0sW1wiZml0XCIsIFskaOKAjV9saXZlW1wiZml0XCJdXV1dXSxbXCIuL3BhdHRlcm5zL2ludGVyZmFjZS10b29scy5qc1wiLCBbW1wiZGVmZW5kUHJvdG90eXBlXCIsIFskaOKAjV9saXZlW1wiZGVmZW5kUHJvdG90eXBlXCJdXV0sW1wiZGVmZW5kUHJvdG90eXBlS2l0XCIsIFskaOKAjV9saXZlW1wiZGVmZW5kUHJvdG90eXBlS2l0XCJdXV0sW1wiaW5pdEVtcHR5XCIsIFskaOKAjV9saXZlW1wiaW5pdEVtcHR5XCJdXV0sW1wiZGVmaW5lSGVhcEZhckNsYXNzXCIsIFskaOKAjV9saXZlW1wiZGVmaW5lSGVhcEZhckNsYXNzXCJdXV0sW1wiZGVmaW5lSGVhcEZhckNsYXNzS2l0XCIsIFskaOKAjV9saXZlW1wiZGVmaW5lSGVhcEZhckNsYXNzS2l0XCJdXV0sW1wibWFrZUhlYXBGYXJJbnN0YW5jZVwiLCBbJGjigI1fbGl2ZVtcIm1ha2VIZWFwRmFySW5zdGFuY2VcIl1dXV1dLFtcIi4vcGF0dGVybnMvcmFua09yZGVyLmpzXCIsIFtbXCJjb21wYXJlUmFua1wiLCBbJGjigI1fbGl2ZVtcImNvbXBhcmVSYW5rXCJdXV0sW1wiaXNSYW5rU29ydGVkXCIsIFskaOKAjV9saXZlW1wiaXNSYW5rU29ydGVkXCJdXV0sW1wic29ydEJ5UmFua1wiLCBbJGjigI1fbGl2ZVtcInNvcnRCeVJhbmtcIl1dXV1dLFtcIi4vcGF0dGVybnMvZW5jb2RlUGFzc2FibGUuanNcIiwgW1tcIm1ha2VEZWNvZGVQYXNzYWJsZVwiLCBbJGjigI1fbGl2ZVtcIm1ha2VEZWNvZGVQYXNzYWJsZVwiXV1dLFtcIm1ha2VFbmNvZGVQYXNzYWJsZVwiLCBbJGjigI1fbGl2ZVtcIm1ha2VFbmNvZGVQYXNzYWJsZVwiXV1dLFtcImlzRW5jb2RlZFJlbW90YWJsZVwiLCBbJGjigI1fbGl2ZVtcImlzRW5jb2RlZFJlbW90YWJsZVwiXV1dLFtcInplcm9QYWRcIiwgWyRo4oCNX2xpdmVbXCJ6ZXJvUGFkXCJdXV1dXSxbXCIuL3N0b3Jlcy9zY2FsYXJXZWFrU2V0U3RvcmUuanNcIiwgW1tcIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmVcIiwgWyRo4oCNX2xpdmVbXCJtYWtlU2NhbGFyV2Vha1NldFN0b3JlXCJdXV1dXSxbXCIuL3N0b3Jlcy9zY2FsYXJTZXRTdG9yZS5qc1wiLCBbW1wibWFrZVNjYWxhclNldFN0b3JlXCIsIFskaOKAjV9saXZlW1wibWFrZVNjYWxhclNldFN0b3JlXCJdXV1dXSxbXCIuL3N0b3Jlcy9zY2FsYXJXZWFrTWFwU3RvcmUuanNcIiwgW1tcIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmVcIiwgWyRo4oCNX2xpdmVbXCJtYWtlU2NhbGFyV2Vha01hcFN0b3JlXCJdLCRo4oCNX2xpdmVbXCJtYWtlU2NhbGFyV2Vha01hcFN0b3JlXCJdLCRo4oCNX2xpdmVbXCJtYWtlU2NhbGFyV2Vha01hcFN0b3JlXCJdXV1dXSxbXCIuL3N0b3Jlcy9zY2FsYXJNYXBTdG9yZS5qc1wiLCBbW1wibWFrZVNjYWxhck1hcFN0b3JlXCIsIFskaOKAjV9saXZlW1wibWFrZVNjYWxhck1hcFN0b3JlXCJdLCRo4oCNX2xpdmVbXCJtYWtlU2NhbGFyTWFwU3RvcmVcIl0sJGjigI1fbGl2ZVtcIm1ha2VTY2FsYXJNYXBTdG9yZVwiXV1dXV0sW1wiLi9zdG9yZXMvc3RvcmUtdXRpbHMuanNcIiwgW1tcInByb3ZpZGVMYXp5XCIsIFskaOKAjV9saXZlW1wicHJvdmlkZUxhenlcIl1dXV1dLFtcIi4vbGVnYWN5L2xlZ2FjeU1hcC5qc1wiLCBbW1wibWFrZUxlZ2FjeU1hcFwiLCBbJGjigI1fbGl2ZVtcIm1ha2VMZWdhY3lNYXBcIl0sJGjigI1fbGl2ZVtcIm1ha2VMZWdhY3lNYXBcIl1dXV1dLFtcIi4vbGVnYWN5L2xlZ2FjeVdlYWtNYXAuanNcIiwgW1tcIm1ha2VMZWdhY3lXZWFrTWFwXCIsIFskaOKAjV9saXZlW1wibWFrZUxlZ2FjeVdlYWtNYXBcIl1dXV1dXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnsiaXNLZXkiOlsiaXNLZXkiLGZhbHNlXSwiYXNzZXJ0S2V5IjpbImFzc2VydEtleSIsZmFsc2VdLCJtYWtlQ29weVNldCI6WyJtYWtlQ29weVNldCIsZmFsc2VdLCJnZXRDb3B5U2V0S2V5cyI6WyJnZXRDb3B5U2V0S2V5cyIsZmFsc2VdLCJtYWtlQ29weUJhZyI6WyJtYWtlQ29weUJhZyIsZmFsc2VdLCJtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyI6WyJtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyIsZmFsc2VdLCJnZXRDb3B5QmFnRW50cmllcyI6WyJnZXRDb3B5QmFnRW50cmllcyIsZmFsc2VdLCJtYWtlQ29weU1hcCI6WyJtYWtlQ29weU1hcCIsZmFsc2VdLCJnZXRDb3B5TWFwRW50cmllcyI6WyJnZXRDb3B5TWFwRW50cmllcyIsZmFsc2VdLCJjb2VyY2VUb0VsZW1lbnRzIjpbImNvZXJjZVRvRWxlbWVudHMiLGZhbHNlXSwiY29lcmNlVG9CYWdFbnRyaWVzIjpbImNvZXJjZVRvQmFnRW50cmllcyIsZmFsc2VdLCJjb21wYXJlS2V5cyI6WyJjb21wYXJlS2V5cyIsZmFsc2VdLCJrZXlMVCI6WyJrZXlMVCIsZmFsc2VdLCJrZXlMVEUiOlsia2V5TFRFIixmYWxzZV0sImtleUVRIjpbImtleUVRIixmYWxzZV0sImtleUdURSI6WyJrZXlHVEUiLGZhbHNlXSwia2V5R1QiOlsia2V5R1QiLGZhbHNlXSwiZWxlbWVudHNJc1N1cGVyc2V0IjpbImVsZW1lbnRzSXNTdXBlcnNldCIsZmFsc2VdLCJlbGVtZW50c0lzRGlzam9pbnQiOlsiZWxlbWVudHNJc0Rpc2pvaW50IixmYWxzZV0sImVsZW1lbnRzQ29tcGFyZSI6WyJlbGVtZW50c0NvbXBhcmUiLGZhbHNlXSwiZWxlbWVudHNVbmlvbiI6WyJlbGVtZW50c1VuaW9uIixmYWxzZV0sImVsZW1lbnRzRGlzam9pbnRVbmlvbiI6WyJlbGVtZW50c0Rpc2pvaW50VW5pb24iLGZhbHNlXSwiZWxlbWVudHNJbnRlcnNlY3Rpb24iOlsiZWxlbWVudHNJbnRlcnNlY3Rpb24iLGZhbHNlXSwiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0IjpbImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCIsZmFsc2VdLCJzZXRJc1N1cGVyc2V0IjpbInNldElzU3VwZXJzZXQiLGZhbHNlXSwic2V0SXNEaXNqb2ludCI6WyJzZXRJc0Rpc2pvaW50IixmYWxzZV0sInNldENvbXBhcmUiOlsic2V0Q29tcGFyZSIsZmFsc2VdLCJzZXRVbmlvbiI6WyJzZXRVbmlvbiIsZmFsc2VdLCJzZXREaXNqb2ludFVuaW9uIjpbInNldERpc2pvaW50VW5pb24iLGZhbHNlXSwic2V0SW50ZXJzZWN0aW9uIjpbInNldEludGVyc2VjdGlvbiIsZmFsc2VdLCJzZXREaXNqb2ludFN1YnRyYWN0IjpbInNldERpc2pvaW50U3VidHJhY3QiLGZhbHNlXSwiYmFnSXNTdXBlcmJhZyI6WyJiYWdJc1N1cGVyYmFnIixmYWxzZV0sImJhZ0NvbXBhcmUiOlsiYmFnQ29tcGFyZSIsZmFsc2VdLCJiYWdVbmlvbiI6WyJiYWdVbmlvbiIsZmFsc2VdLCJiYWdJbnRlcnNlY3Rpb24iOlsiYmFnSW50ZXJzZWN0aW9uIixmYWxzZV0sImJhZ0Rpc2pvaW50U3VidHJhY3QiOlsiYmFnRGlzam9pbnRTdWJ0cmFjdCIsZmFsc2VdLCJNIjpbIk0iLGZhbHNlXSwiZ2V0UmFua0NvdmVyIjpbImdldFJhbmtDb3ZlciIsZmFsc2VdLCJpc1BhdHRlcm4iOlsiaXNQYXR0ZXJuIixmYWxzZV0sImFzc2VydFBhdHRlcm4iOlsiYXNzZXJ0UGF0dGVybiIsZmFsc2VdLCJhc3NlcnRLZXlQYXR0ZXJuIjpbImFzc2VydEtleVBhdHRlcm4iLGZhbHNlXSwibWF0Y2hlcyI6WyJtYXRjaGVzIixmYWxzZV0sImZpdCI6WyJmaXQiLGZhbHNlXSwiZGVmZW5kUHJvdG90eXBlIjpbImRlZmVuZFByb3RvdHlwZSIsZmFsc2VdLCJkZWZlbmRQcm90b3R5cGVLaXQiOlsiZGVmZW5kUHJvdG90eXBlS2l0IixmYWxzZV0sImluaXRFbXB0eSI6WyJpbml0RW1wdHkiLGZhbHNlXSwiZGVmaW5lSGVhcEZhckNsYXNzIjpbImRlZmluZUhlYXBGYXJDbGFzcyIsZmFsc2VdLCJkZWZpbmVIZWFwRmFyQ2xhc3NLaXQiOlsiZGVmaW5lSGVhcEZhckNsYXNzS2l0IixmYWxzZV0sIm1ha2VIZWFwRmFySW5zdGFuY2UiOlsibWFrZUhlYXBGYXJJbnN0YW5jZSIsZmFsc2VdLCJjb21wYXJlUmFuayI6WyJjb21wYXJlUmFuayIsZmFsc2VdLCJpc1JhbmtTb3J0ZWQiOlsiaXNSYW5rU29ydGVkIixmYWxzZV0sInNvcnRCeVJhbmsiOlsic29ydEJ5UmFuayIsZmFsc2VdLCJtYWtlRGVjb2RlUGFzc2FibGUiOlsibWFrZURlY29kZVBhc3NhYmxlIixmYWxzZV0sIm1ha2VFbmNvZGVQYXNzYWJsZSI6WyJtYWtlRW5jb2RlUGFzc2FibGUiLGZhbHNlXSwiaXNFbmNvZGVkUmVtb3RhYmxlIjpbImlzRW5jb2RlZFJlbW90YWJsZSIsZmFsc2VdLCJ6ZXJvUGFkIjpbInplcm9QYWQiLGZhbHNlXSwibWFrZVNjYWxhcldlYWtTZXRTdG9yZSI6WyJtYWtlU2NhbGFyV2Vha1NldFN0b3JlIixmYWxzZV0sIm1ha2VTY2FsYXJTZXRTdG9yZSI6WyJtYWtlU2NhbGFyU2V0U3RvcmUiLGZhbHNlXSwibWFrZVNjYWxhcldlYWtNYXBTdG9yZSI6WyJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIixmYWxzZV0sIm1ha2VTY2FsYXJXZWFrTWFwIjpbIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmUiLGZhbHNlXSwibWFrZVdlYWtTdG9yZSI6WyJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIixmYWxzZV0sIm1ha2VTY2FsYXJNYXBTdG9yZSI6WyJtYWtlU2NhbGFyTWFwU3RvcmUiLGZhbHNlXSwibWFrZVNjYWxhck1hcCI6WyJtYWtlU2NhbGFyTWFwU3RvcmUiLGZhbHNlXSwibWFrZVN0b3JlIjpbIm1ha2VTY2FsYXJNYXBTdG9yZSIsZmFsc2VdLCJwcm92aWRlTGF6eSI6WyJwcm92aWRlTGF6eSIsZmFsc2VdLCJtYWtlTGVnYWN5TWFwIjpbIm1ha2VMZWdhY3lNYXAiLGZhbHNlXSwiZGVmYXVsdCI6WyJtYWtlTGVnYWN5TWFwIixmYWxzZV0sIm1ha2VMZWdhY3lXZWFrTWFwIjpbIm1ha2VMZWdhY3lXZWFrTWFwIixmYWxzZV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACEE+ZSCQwAAgkMAACkAAABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMva2V5cy9jaGVja0tleS5qc3siaW1wb3J0cyI6WyIuLi9wYXR0ZXJucy9yYW5rT3JkZXIuanMiLCIuL2NvcHlCYWcuanMiLCIuL2NvcHlTZXQuanMiLCJAYWdvcmljL2Fzc2VydCIsIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJhc3NlcnRDb3B5QmFnIiwiYXNzZXJ0Q29weU1hcCIsImFzc2VydENvcHlTZXQiLCJhc3NlcnRLZXkiLCJhc3NlcnRQcmltaXRpdmVLZXkiLCJhc3NlcnRTY2FsYXJLZXkiLCJjaGVja0NvcHlCYWciLCJjaGVja0NvcHlNYXAiLCJjaGVja0NvcHlTZXQiLCJjaGVja0tleSIsImNoZWNrU2NhbGFyS2V5IiwiY29weU1hcEtleVNldCIsImV2ZXJ5Q29weUJhZ0VudHJ5IiwiZXZlcnlDb3B5TWFwS2V5IiwiZXZlcnlDb3B5TWFwVmFsdWUiLCJldmVyeUNvcHlTZXRLZXkiLCJnZXRDb3B5QmFnRW50cmllcyIsImdldENvcHlNYXBFbnRyaWVzIiwiZ2V0Q29weU1hcEtleXMiLCJnZXRDb3B5TWFwVmFsdWVzIiwiZ2V0Q29weVNldEtleXMiLCJpc0NvcHlCYWciLCJpc0NvcHlNYXAiLCJpc0NvcHlTZXQiLCJpc0tleSIsImlzUHJpbWl0aXZlS2V5IiwiaXNTY2FsYXJLZXkiLCJtYWtlQ29weUJhZyIsIm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzIiwibWFrZUNvcHlNYXAiLCJtYWtlQ29weVNldCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnRDaGVja2VyLGFzc2VydFBhc3NhYmxlLEZhcixnZXRUYWcsaXNPYmplY3QsbWFrZVRhZ2dlZCxwYXNzU3R5bGVPZixpZGVudENoZWNrZXIsY2hlY2tFbGVtZW50cyxtYWtlU2V0T2ZFbGVtZW50cyxjaGVja0JhZ0VudHJpZXMsbWFrZUJhZ09mRW50cmllcyxjb21wYXJlQW50aVJhbmssbWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQsc29ydEJ5UmFuazskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXSxbXCJhc3NlcnRQYXNzYWJsZVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGFzc2FibGUgPSAkaOKAjV9hKV1dLFtcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXSxbXCJnZXRUYWdcIiwgWyRo4oCNX2EgPT4gKGdldFRhZyA9ICRo4oCNX2EpXV0sW1wiaXNPYmplY3RcIiwgWyRo4oCNX2EgPT4gKGlzT2JqZWN0ID0gJGjigI1fYSldXSxbXCJtYWtlVGFnZ2VkXCIsIFskaOKAjV9hID0+IChtYWtlVGFnZ2VkID0gJGjigI1fYSldXSxbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9hc3NlcnRcIiwgW1tcImlkZW50Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoaWRlbnRDaGVja2VyID0gJGjigI1fYSldXV1dLFtcIi4vY29weVNldC5qc1wiLCBbW1wiY2hlY2tFbGVtZW50c1wiLCBbJGjigI1fYSA9PiAoY2hlY2tFbGVtZW50cyA9ICRo4oCNX2EpXV0sW1wibWFrZVNldE9mRWxlbWVudHNcIiwgWyRo4oCNX2EgPT4gKG1ha2VTZXRPZkVsZW1lbnRzID0gJGjigI1fYSldXV1dLFtcIi4vY29weUJhZy5qc1wiLCBbW1wiY2hlY2tCYWdFbnRyaWVzXCIsIFskaOKAjV9hID0+IChjaGVja0JhZ0VudHJpZXMgPSAkaOKAjV9hKV1dLFtcIm1ha2VCYWdPZkVudHJpZXNcIiwgWyRo4oCNX2EgPT4gKG1ha2VCYWdPZkVudHJpZXMgPSAkaOKAjV9hKV1dXV0sW1wiLi4vcGF0dGVybnMvcmFua09yZGVyLmpzXCIsIFtbXCJjb21wYXJlQW50aVJhbmtcIiwgWyRo4oCNX2EgPT4gKGNvbXBhcmVBbnRpUmFuayA9ICRo4oCNX2EpXV0sW1wibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0ID0gJGjigI1fYSldXSxbXCJzb3J0QnlSYW5rXCIsIFskaOKAjV9hID0+IChzb3J0QnlSYW5rID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3R7ZGV0YWlsczpYLHF1b3RlOnEsRmFpbH09YXNzZXJ0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vIFByaW1pdGl2ZSBhbmQgU2NhbGFyIGtleXMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHZhbFxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrUHJpbWl0aXZlS2V5PSh2YWwsY2hlY2spPT57XG5pZihpc09iamVjdCh2YWwpKXtcbnJldHVybihcbmNoZWNrIT09aWRlbnRDaGVja2VyJiZcbmNoZWNrKGZhbHNlLFggYEEgJHtxKHR5cGVvZiB2YWwpfSBjYW5ub3QgYmUgYSBwcmltaXRpdmU6ICR7dmFsfWApKTtcblxuIH1cbi8qIFRPRE8gVGhlcmUgaXMgbm90IHlldCBhIGNoZWNrUGFzc2FibGUsIGJ1dCBwZXJoYXBzIHRoZXJlIHNob3VsZCBiZS4qL1xuLyogSWYgdGhhdCBoYXBwZW5zLCB3ZSBzaG91bGQgY2FsbCBpdCBoZXJlIGluc3RlYWQuKi9cbmFzc2VydFBhc3NhYmxlKHZhbCk7XG5yZXR1cm4gdHJ1ZTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHZhbFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBpc1ByaW1pdGl2ZUtleT0odmFsKT0+Y2hlY2tQcmltaXRpdmVLZXkodmFsLGlkZW50Q2hlY2tlcik7JGjigI1fb25jZS5pc1ByaW1pdGl2ZUtleShpc1ByaW1pdGl2ZUtleSk7XG5oYXJkZW4oaXNQcmltaXRpdmVLZXkpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHZhbFxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRQcmltaXRpdmVLZXk9KHZhbCk9PntcbmNoZWNrUHJpbWl0aXZlS2V5KHZhbCxhc3NlcnRDaGVja2VyKTtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0UHJpbWl0aXZlS2V5KGFzc2VydFByaW1pdGl2ZUtleSk7XG5oYXJkZW4oYXNzZXJ0UHJpbWl0aXZlS2V5KTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB2YWxcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgY2hlY2tTY2FsYXJLZXk9KHZhbCxjaGVjayk9PntcbmlmKGlzUHJpbWl0aXZlS2V5KHZhbCkpe1xucmV0dXJuIHRydWU7XG4gfVxuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHZhbCk7XG5pZihwYXNzU3R5bGU9PT0ncmVtb3RhYmxlJyl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgQSAke3EocGFzc1N0eWxlKX0gY2Fubm90IGJlIGEgc2NhbGFyIGtleTogJHt2YWx9YCk7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB2YWxcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovJGjigI1fb25jZS5jaGVja1NjYWxhcktleShjaGVja1NjYWxhcktleSk7XG5jb25zdCAgICAgICAgaXNTY2FsYXJLZXk9KHZhbCk9PmNoZWNrU2NhbGFyS2V5KHZhbCxpZGVudENoZWNrZXIpOyRo4oCNX29uY2UuaXNTY2FsYXJLZXkoaXNTY2FsYXJLZXkpO1xuaGFyZGVuKGlzU2NhbGFyS2V5KTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB2YWxcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5jb25zdCAgICAgICAgYXNzZXJ0U2NhbGFyS2V5PSh2YWwpPT57XG5jaGVja1NjYWxhcktleSh2YWwsYXNzZXJ0Q2hlY2tlcik7XG4gfTskaOKAjV9vbmNlLmFzc2VydFNjYWxhcktleShhc3NlcnRTY2FsYXJLZXkpO1xuaGFyZGVuKGFzc2VydFNjYWxhcktleSk7XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBLZXlzIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqIEB0eXBlIHtXZWFrU2V0PEtleT59ICovXG5jb25zdCBrZXlNZW1vPW5ldyBXZWFrU2V0KCk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdmFsXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGNoZWNrS2V5PSh2YWwsY2hlY2spPT57XG5pZighaXNPYmplY3QodmFsKSl7XG4vKiBUT0RPIFRoZXJlIGlzIG5vdCB5ZXQgYSBjaGVja1Bhc3NhYmxlLCBidXQgcGVyaGFwcyB0aGVyZSBzaG91bGQgYmUuKi9cbi8qIElmIHRoYXQgaGFwcGVucywgd2Ugc2hvdWxkIGNhbGwgaXQgaGVyZSBpbnN0ZWFkLiovXG5hc3NlcnRQYXNzYWJsZSh2YWwpO1xucmV0dXJuIHRydWU7XG4gfVxuaWYoa2V5TWVtby5oYXModmFsKSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuY29uc3QgcmVzdWx0PWNoZWNrS2V5SW50ZXJuYWwodmFsLGNoZWNrKTtcbmlmKHJlc3VsdCl7XG4vKiBEb24ndCBjYWNoZSB0aGUgdW5kZWZpbmVkIGNhc2VzLCBzbyB0aGF0IGlmIGl0IGlzIHRyaWVkIGFnYWluKi9cbi8qIHdpdGggYGFzc2VydENoZWNrZXJgIGl0J2xsIHRocm93IGEgZGlhZ25vc3RpYyBhZ2FpbiovXG5rZXlNZW1vLmFkZCh2YWwpO1xuIH1cbi8qIE5vdGUgdGhhdCB3ZSBkbyBub3QgbWVtb2l6ZSBhIG5lZ2F0aXZlIGp1ZGdlbWVudCwgc28gdGhhdCBpZiBpdCBpcyB0cmllZCovXG4vKiBhZ2FpbiB3aXRoIGEgY2hlY2tlciwgaXQgd2lsbCBzdGlsbCBwcm9kdWNlIGEgdXNlZnVsIGRpYWdub3N0aWMuKi9cbnJldHVybiByZXN1bHQ7XG4gfTskaOKAjV9vbmNlLmNoZWNrS2V5KGNoZWNrS2V5KTtcbmhhcmRlbihjaGVja0tleSk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdmFsXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGlzS2V5PSh2YWwpPT5jaGVja0tleSh2YWwsaWRlbnRDaGVja2VyKTskaOKAjV9vbmNlLmlzS2V5KGlzS2V5KTtcbmhhcmRlbihpc0tleSk7XG5cbi8qKlxuICogQHBhcmFtIHtLZXl9IHZhbFxuICovXG5jb25zdCAgICAgICAgYXNzZXJ0S2V5PSh2YWwpPT57XG5jaGVja0tleSh2YWwsYXNzZXJ0Q2hlY2tlcik7XG4gfTskaOKAjV9vbmNlLmFzc2VydEtleShhc3NlcnRLZXkpO1xuaGFyZGVuKGFzc2VydEtleSk7XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gQ29weVNldCAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyogTW92ZWQgdG8gaGVyZSBzbyB0aGV5IGNhbiBjaGVjayB0aGF0IHRoZSBjb3B5U2V0IGNvbnRhaW5zIG9ubHkga2V5cyovXG4vKiB3aXRob3V0IGNyZWF0aW5nIGFuIGltcG9ydCBjeWNsZS4qL1xuXG4vKiogQHR5cGUgV2Vha1NldDxDb3B5U2V0PEtleT4+ICovXG5jb25zdCBjb3B5U2V0TWVtbz1uZXcgV2Vha1NldCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHNcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgY2hlY2tDb3B5U2V0PShzLGNoZWNrKT0+e1xuaWYoY29weVNldE1lbW8uaGFzKHMpKXtcbnJldHVybiB0cnVlO1xuIH1cbmNvbnN0IHJlc3VsdD1cbihwYXNzU3R5bGVPZihzKT09PSd0YWdnZWQnJiZnZXRUYWcocyk9PT0nY29weVNldCd8fFxuY2hlY2soZmFsc2UsWCBgTm90IGEgY29weVNldDogJHtzfWApKSYmXG5jaGVja0VsZW1lbnRzKHMucGF5bG9hZCxjaGVjaykmJlxuY2hlY2tLZXkocy5wYXlsb2FkLGNoZWNrKTtcbmlmKHJlc3VsdCl7XG5jb3B5U2V0TWVtby5hZGQocyk7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9OyRo4oCNX29uY2UuY2hlY2tDb3B5U2V0KGNoZWNrQ29weVNldCk7XG5oYXJkZW4oY2hlY2tDb3B5U2V0KTtcblxuLyoqXG4gKiBAY2FsbGJhY2sgSXNDb3B5U2V0XG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBzXG4gKiBAcmV0dXJucyB7cyBpcyBDb3B5U2V0PEtleT59XG4gKi9cblxuLyoqIEB0eXBlIHtJc0NvcHlTZXR9ICovXG5jb25zdCAgICAgICAgaXNDb3B5U2V0PShzKT0+Y2hlY2tDb3B5U2V0KHMsaWRlbnRDaGVja2VyKTskaOKAjV9vbmNlLmlzQ29weVNldChpc0NvcHlTZXQpO1xuaGFyZGVuKGlzQ29weVNldCk7XG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydENvcHlTZXRcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHNcbiAqIEByZXR1cm5zIHthc3NlcnRzIHMgaXMgQ29weVNldDxLZXk+fVxuICovXG5cbi8qKiBAdHlwZSB7QXNzZXJ0Q29weVNldH0gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRDb3B5U2V0PShzKT0+e1xuY2hlY2tDb3B5U2V0KHMsYXNzZXJ0Q2hlY2tlcik7XG4gfTskaOKAjV9vbmNlLmFzc2VydENvcHlTZXQoYXNzZXJ0Q29weVNldCk7XG5oYXJkZW4oYXNzZXJ0Q29weVNldCk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7Q29weVNldDxLPn0gc1xuICogQHJldHVybnMge0tbXX1cbiAqL1xuY29uc3QgICAgICAgIGdldENvcHlTZXRLZXlzPShzKT0+e1xuYXNzZXJ0Q29weVNldChzKTtcbnJldHVybiBzLnBheWxvYWQ7XG4gfTskaOKAjV9vbmNlLmdldENvcHlTZXRLZXlzKGdldENvcHlTZXRLZXlzKTtcbmhhcmRlbihnZXRDb3B5U2V0S2V5cyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7Q29weVNldDxLPn0gc1xuICogQHBhcmFtIHsoa2V5OiBLLCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFufSBmblxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBldmVyeUNvcHlTZXRLZXk9KHMsZm4pPT5cbmdldENvcHlTZXRLZXlzKHMpLmV2ZXJ5KChrZXksaW5kZXgpPT5mbihrZXksaW5kZXgpKTskaOKAjV9vbmNlLmV2ZXJ5Q29weVNldEtleShldmVyeUNvcHlTZXRLZXkpO1xuaGFyZGVuKGV2ZXJ5Q29weVNldEtleSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7SXRlcmFibGU8Sz59IGVsZW1lbnRJdGVyXG4gKiBAcmV0dXJucyB7Q29weVNldDxLPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VDb3B5U2V0PShlbGVtZW50SXRlcik9PntcbmNvbnN0IHJlc3VsdD1tYWtlU2V0T2ZFbGVtZW50cyhlbGVtZW50SXRlcik7XG5hc3NlcnRDb3B5U2V0KHJlc3VsdCk7XG5yZXR1cm4gcmVzdWx0O1xuIH07JGjigI1fb25jZS5tYWtlQ29weVNldChtYWtlQ29weVNldCk7XG5oYXJkZW4obWFrZUNvcHlTZXQpO1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIENvcHlCYWcgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qIE1vdmVkIHRvIGhlcmUgc28gdGhleSBjYW4gY2hlY2sgdGhhdCB0aGUgY29weUJhZyBjb250YWlucyBvbmx5IGtleXMqL1xuLyogd2l0aG91dCBjcmVhdGluZyBhbiBpbXBvcnQgY3ljbGUuKi9cblxuLyoqIEB0eXBlIFdlYWtTZXQ8Q29weUJhZzxLZXk+PiAqL1xuY29uc3QgY29weUJhZ01lbW89bmV3IFdlYWtTZXQoKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBiXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGNoZWNrQ29weUJhZz0oYixjaGVjayk9PntcbmlmKGNvcHlCYWdNZW1vLmhhcyhiKSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5jb25zdCByZXN1bHQ9XG4ocGFzc1N0eWxlT2YoYik9PT0ndGFnZ2VkJyYmZ2V0VGFnKGIpPT09J2NvcHlCYWcnfHxcbmNoZWNrKGZhbHNlLFggYE5vdCBhIGNvcHlCYWc6ICR7Yn1gKSkmJlxuY2hlY2tCYWdFbnRyaWVzKGIucGF5bG9hZCxjaGVjaykmJlxuY2hlY2tLZXkoYi5wYXlsb2FkLGNoZWNrKTtcbmlmKHJlc3VsdCl7XG5jb3B5QmFnTWVtby5hZGQoYik7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9OyRo4oCNX29uY2UuY2hlY2tDb3B5QmFnKGNoZWNrQ29weUJhZyk7XG5oYXJkZW4oY2hlY2tDb3B5QmFnKTtcblxuLyoqXG4gKiBAY2FsbGJhY2sgSXNDb3B5QmFnXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBiXG4gKiBAcmV0dXJucyB7YiBpcyBDb3B5QmFnPEtleT59XG4gKi9cblxuLyoqIEB0eXBlIHtJc0NvcHlCYWd9ICovXG5jb25zdCAgICAgICAgaXNDb3B5QmFnPShiKT0+Y2hlY2tDb3B5QmFnKGIsaWRlbnRDaGVja2VyKTskaOKAjV9vbmNlLmlzQ29weUJhZyhpc0NvcHlCYWcpO1xuaGFyZGVuKGlzQ29weUJhZyk7XG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydENvcHlCYWdcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGJcbiAqIEByZXR1cm5zIHthc3NlcnRzIGIgaXMgQ29weUJhZzxLZXk+fVxuICovXG5cbi8qKiBAdHlwZSB7QXNzZXJ0Q29weUJhZ30gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRDb3B5QmFnPShiKT0+e1xuY2hlY2tDb3B5QmFnKGIsYXNzZXJ0Q2hlY2tlcik7XG4gfTskaOKAjV9vbmNlLmFzc2VydENvcHlCYWcoYXNzZXJ0Q29weUJhZyk7XG5oYXJkZW4oYXNzZXJ0Q29weUJhZyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7Q29weUJhZzxLPn0gYlxuICogQHJldHVybnMge0NvcHlCYWc8Sz5bJ3BheWxvYWQnXX1cbiAqL1xuY29uc3QgICAgICAgIGdldENvcHlCYWdFbnRyaWVzPShiKT0+e1xuYXNzZXJ0Q29weUJhZyhiKTtcbnJldHVybiBiLnBheWxvYWQ7XG4gfTskaOKAjV9vbmNlLmdldENvcHlCYWdFbnRyaWVzKGdldENvcHlCYWdFbnRyaWVzKTtcbmhhcmRlbihnZXRDb3B5QmFnRW50cmllcyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7Q29weUJhZzxLPn0gYlxuICogQHBhcmFtIHsoZW50cnk6IFtLLCBiaWdpbnRdLCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFufSBmblxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBldmVyeUNvcHlCYWdFbnRyeT0oYixmbik9PlxuZ2V0Q29weUJhZ0VudHJpZXMoYikuZXZlcnkoKGVudHJ5LGluZGV4KT0+Zm4oZW50cnksaW5kZXgpKTskaOKAjV9vbmNlLmV2ZXJ5Q29weUJhZ0VudHJ5KGV2ZXJ5Q29weUJhZ0VudHJ5KTtcbmhhcmRlbihldmVyeUNvcHlCYWdFbnRyeSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7SXRlcmFibGU8W0ssYmlnaW50XT59IGJhZ0VudHJ5SXRlclxuICogQHJldHVybnMge0NvcHlCYWc8Sz59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlQ29weUJhZz0oYmFnRW50cnlJdGVyKT0+e1xuY29uc3QgcmVzdWx0PW1ha2VCYWdPZkVudHJpZXMoYmFnRW50cnlJdGVyKTtcbmFzc2VydENvcHlCYWcocmVzdWx0KTtcbnJldHVybiByZXN1bHQ7XG4gfTskaOKAjV9vbmNlLm1ha2VDb3B5QmFnKG1ha2VDb3B5QmFnKTtcbmhhcmRlbihtYWtlQ29weUJhZyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7SXRlcmFibGU8Sz59IGVsZW1lbnRJdGVyXG4gKiBAcmV0dXJucyB7Q29weVNldDxLPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzPShlbGVtZW50SXRlcik9Pntcbi8qIFRoaXMgZnVsbE9yZGVyIGNvbnRhaW5zIGhpc3RvcnkgZGVwZW5kZW50IHN0YXRlLiBJdCBpcyBzcGVjaWZpYyovXG4vKiB0byB0aGlzIG9uZSBjYWxsIGFuZCBkb2VzIG5vdCBzdXJ2aXZlIGl0LiovXG5jb25zdCBmdWxsQ29tcGFyZT1tYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCgpLmFudGlDb21wYXJhdG9yO1xuY29uc3Qgc29ydGVkPXNvcnRCeVJhbmsoZWxlbWVudEl0ZXIsZnVsbENvbXBhcmUpO1xuLyoqIEB0eXBlIHtbSyxiaWdpbnRdW119ICovXG5jb25zdCBlbnRyaWVzPVtdO1xuZm9yKGxldCBpPTA7aTxzb3J0ZWQubGVuZ3RoOyl7XG5jb25zdCBrPXNvcnRlZFtpXTtcbmxldCBqPWkrMTtcbndoaWxlKGo8c29ydGVkLmxlbmd0aCYmZnVsbENvbXBhcmUoayxzb3J0ZWRbal0pPT09MCl7XG5qKz0xO1xuIH1cbmVudHJpZXMucHVzaChbayxCaWdJbnQoai1pKV0pO1xuaT1qO1xuIH1cbnJldHVybiBtYWtlQ29weUJhZyhlbnRyaWVzKTtcbiB9OyRo4oCNX29uY2UubWFrZUNvcHlCYWdGcm9tRWxlbWVudHMobWFrZUNvcHlCYWdGcm9tRWxlbWVudHMpO1xuaGFyZGVuKG1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzKTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBDb3B5TWFwIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiBNb3ZlZCB0byBoZXJlIHNvIHRoZXkgY2FuIGNoZWNrIHRoYXQgdGhlIGNvcHlNYXAncyBrZXlzIGNvbnRhaW5zIG9ubHkga2V5cyovXG4vKiB3aXRob3V0IGNyZWF0aW5nIGFuIGltcG9ydCBjeWNsZS4qL1xuXG4vKiogQHR5cGUgV2Vha1NldDxDb3B5TWFwPGFueSxhbnk+PiAqL1xuY29uc3QgY29weU1hcE1lbW89bmV3IFdlYWtTZXQoKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBtXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGNoZWNrQ29weU1hcD0obSxjaGVjayk9PntcbmlmKGNvcHlNYXBNZW1vLmhhcyhtKSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5pZighKHBhc3NTdHlsZU9mKG0pPT09J3RhZ2dlZCcmJmdldFRhZyhtKT09PSdjb3B5TWFwJykpe1xucmV0dXJuIGNoZWNrKGZhbHNlLFggYE5vdCBhIGNvcHlNYXA6ICR7bX1gKTtcbiB9XG5jb25zdHtwYXlsb2FkfT1tO1xuaWYocGFzc1N0eWxlT2YocGF5bG9hZCkhPT0nY29weVJlY29yZCcpe1xucmV0dXJuIGNoZWNrKGZhbHNlLFggYEEgY29weU1hcCdzIHBheWxvYWQgbXVzdCBiZSBhIHJlY29yZDogJHttfWApO1xuIH1cbmNvbnN0e2tleXMsdmFsdWVzLC4uLnJlc3R9PXBheWxvYWQ7XG5jb25zdCByZXN1bHQ9XG4ob3duS2V5cyhyZXN0KS5sZW5ndGg9PT0wfHxcbmNoZWNrKFxuZmFsc2UsXG5YIGBBIGNvcHlNYXAncyBwYXlsb2FkIG11c3Qgb25seSBoYXZlIC5rZXlzIGFuZCAudmFsdWVzOiAke219YCkpJiZcblxuY2hlY2tFbGVtZW50cyhrZXlzLGNoZWNrKSYmXG5jaGVja0tleShrZXlzLGNoZWNrKSYmKFxucGFzc1N0eWxlT2YodmFsdWVzKT09PSdjb3B5QXJyYXknfHxcbmNoZWNrKGZhbHNlLFggYEEgY29weU1hcCdzIC52YWx1ZXMgbXVzdCBiZSBhIGNvcHlBcnJheTogJHttfWApKSYmKFxua2V5cy5sZW5ndGg9PT12YWx1ZXMubGVuZ3RofHxcbmNoZWNrKFxuZmFsc2UsXG5YIGBBIGNvcHlNYXAgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBrZXlzIGFuZCB2YWx1ZXM6ICR7bX1gKSk7XG5cbmlmKHJlc3VsdCl7XG5jb3B5TWFwTWVtby5hZGQobSk7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9OyRo4oCNX29uY2UuY2hlY2tDb3B5TWFwKGNoZWNrQ29weU1hcCk7XG5oYXJkZW4oY2hlY2tDb3B5TWFwKTtcblxuLyoqXG4gKiBAY2FsbGJhY2sgSXNDb3B5TWFwXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBtXG4gKiBAcmV0dXJucyB7bSBpcyBDb3B5TWFwPEtleSwgUGFzc2FibGU+fVxuICovXG5cbi8qKiBAdHlwZSB7SXNDb3B5TWFwfSAqL1xuY29uc3QgICAgICAgIGlzQ29weU1hcD0obSk9PmNoZWNrQ29weU1hcChtLGlkZW50Q2hlY2tlcik7JGjigI1fb25jZS5pc0NvcHlNYXAoaXNDb3B5TWFwKTtcbmhhcmRlbihpc0NvcHlNYXApO1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRDb3B5TWFwXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBtXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBtIGlzIENvcHlNYXA8S2V5LCBQYXNzYWJsZT59XG4gKi9cblxuLyoqIEB0eXBlIHtBc3NlcnRDb3B5TWFwfSAqL1xuY29uc3QgICAgICAgIGFzc2VydENvcHlNYXA9KG0pPT57XG5jaGVja0NvcHlNYXAobSxhc3NlcnRDaGVja2VyKTtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0Q29weU1hcChhc3NlcnRDb3B5TWFwKTtcbmhhcmRlbihhc3NlcnRDb3B5TWFwKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAcGFyYW0ge0NvcHlNYXA8SyxWPn0gbVxuICogQHJldHVybnMge0tbXX1cbiAqL1xuY29uc3QgICAgICAgIGdldENvcHlNYXBLZXlzPShtKT0+e1xuYXNzZXJ0Q29weU1hcChtKTtcbnJldHVybiBtLnBheWxvYWQua2V5cztcbiB9OyRo4oCNX29uY2UuZ2V0Q29weU1hcEtleXMoZ2V0Q29weU1hcEtleXMpO1xuaGFyZGVuKGdldENvcHlNYXBLZXlzKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAcGFyYW0ge0NvcHlNYXA8SyxWPn0gbVxuICogQHJldHVybnMge1ZbXX1cbiAqL1xuY29uc3QgICAgICAgIGdldENvcHlNYXBWYWx1ZXM9KG0pPT57XG5hc3NlcnRDb3B5TWFwKG0pO1xucmV0dXJuIG0ucGF5bG9hZC52YWx1ZXM7XG4gfTskaOKAjV9vbmNlLmdldENvcHlNYXBWYWx1ZXMoZ2V0Q29weU1hcFZhbHVlcyk7XG5oYXJkZW4oZ2V0Q29weU1hcFZhbHVlcyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEssVlxuICogQHBhcmFtIHtDb3B5TWFwPEssVj59IG1cbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxbSyxWXT59XG4gKi9cbmNvbnN0ICAgICAgICBnZXRDb3B5TWFwRW50cmllcz0obSk9PntcbmFzc2VydENvcHlNYXAobSk7XG5jb25zdHtcbnBheWxvYWQ6e2tleXMsdmFsdWVzfX09XG5tO1xuY29uc3R7bGVuZ3RofT1rZXlzO1xucmV0dXJuIEZhcignQ29weU1hcCBlbnRyaWVzIGl0ZXJhYmxlJyx7XG5bU3ltYm9sLml0ZXJhdG9yXTooKT0+e1xubGV0IGk9MDtcbnJldHVybiBGYXIoJ0NvcHlNYXAgZW50cmllcyBpdGVyYXRvcicse1xubmV4dDooKT0+e1xuLyoqIEB0eXBlIHtJdGVyYXRvclJlc3VsdDxbSyxWXSx2b2lkPn0gKi9cbmxldCByZXN1bHQ7XG5pZihpPGxlbmd0aCl7XG5yZXN1bHQ9aGFyZGVuKHtkb25lOmZhbHNlLHZhbHVlOltrZXlzW2ldLHZhbHVlc1tpXV19KTtcbmkrPTE7XG5yZXR1cm4gcmVzdWx0O1xuIH1lbHNle1xucmVzdWx0PWhhcmRlbih7ZG9uZTp0cnVlLHZhbHVlOnVuZGVmaW5lZH0pO1xuIH1cbnJldHVybiByZXN1bHQ7XG4gfX0pO1xuXG4gfX0pO1xuXG4gfTskaOKAjV9vbmNlLmdldENvcHlNYXBFbnRyaWVzKGdldENvcHlNYXBFbnRyaWVzKTtcbmhhcmRlbihnZXRDb3B5TWFwRW50cmllcyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEssVlxuICogQHBhcmFtIHtDb3B5TWFwPEssVj59IG1cbiAqIEBwYXJhbSB7KGtleTogSywgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbn0gZm5cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgZXZlcnlDb3B5TWFwS2V5PShtLGZuKT0+XG5nZXRDb3B5TWFwS2V5cyhtKS5ldmVyeSgoa2V5LGluZGV4KT0+Zm4oa2V5LGluZGV4KSk7JGjigI1fb25jZS5ldmVyeUNvcHlNYXBLZXkoZXZlcnlDb3B5TWFwS2V5KTtcbmhhcmRlbihldmVyeUNvcHlNYXBLZXkpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEBwYXJhbSB7Q29weU1hcDxLLFY+fSBtXG4gKiBAcGFyYW0geyh2YWx1ZTogViwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbn0gZm5cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgZXZlcnlDb3B5TWFwVmFsdWU9KG0sZm4pPT5cbmdldENvcHlNYXBWYWx1ZXMobSkuZXZlcnkoKHZhbHVlLGluZGV4KT0+Zm4odmFsdWUsaW5kZXgpKTskaOKAjV9vbmNlLmV2ZXJ5Q29weU1hcFZhbHVlKGV2ZXJ5Q29weU1hcFZhbHVlKTtcbmhhcmRlbihldmVyeUNvcHlNYXBWYWx1ZSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEssVlxuICogQHBhcmFtIHtDb3B5TWFwPEssVj59IG1cbiAqIEByZXR1cm5zIHtDb3B5U2V0PEs+fVxuICovXG5jb25zdCAgICAgICAgY29weU1hcEtleVNldD0obSk9PlxuLyogQSBjb3B5TWFwJ3Mga2V5cyBhcmUgYWxyZWFkeSBpbiB0aGUgaW50ZXJuYWwgZm9ybSB1c2VkIGJ5IGNvcHlTZXRzLiovXG5tYWtlVGFnZ2VkKCdjb3B5U2V0JyxtLnBheWxvYWQua2V5cyk7JGjigI1fb25jZS5jb3B5TWFwS2V5U2V0KGNvcHlNYXBLZXlTZXQpO1xuaGFyZGVuKGNvcHlNYXBLZXlTZXQpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEBwYXJhbSB7SXRlcmFibGU8W0ssIFZdPn0gZW50cmllc1xuICogQHJldHVybnMge0NvcHlNYXA8SyxWPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VDb3B5TWFwPShlbnRyaWVzKT0+e1xuLyogVGhpcyBpcyB3ZWlyZCwgYnV0IHJldmVyc2UgcmFuayBzb3J0aW5nIHRoZSBlbnRyaWVzIGlzIGEgZ29vZCBmaXJzdCBzdGVwKi9cbi8qIGZvciBnZXR0aW5nIHRoZSByYW5rIHNvcnRlZCBrZXlzIHRvZ2V0aGVyIHdpdGggdGhlIHZhbHVlcyovXG4vKiBvcmdhbml6ZWQgYnkgdGhvc2Uga2V5cy4gQWxzbywgYW1vbmcgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCovXG4vKiBrZXlzIGluIHRoZSBzYW1lIGVxdWl2YWxlbmNlIGNsYXNzLCB0aG9zZSBhcmUgcmFuayBzb3J0ZWQuKi9cbi8qIFRPRE8gVGhpcyovXG4vKiBjb3VsZCBzb2x2ZSB0aGUgY29weU1hcCBjb3ZlciBpc3N1ZSBleHBsYWluZWQgaW4gcGF0dGVybk1hdGNoZXJzLmpzLiovXG4vKiBCdXQgb25seSBpZiB3ZSBpbmNsdWRlIHRoaXMgY3JpdGVyaWEgaW4gb3VyIHZhbGlkYXRpb24gb2YgY29weU1hcHMsKi9cbi8qIHdoaWNoIHdlIGN1cnJlbnRseSBkbyBub3QuKi9cbmNvbnN0IHNvcnRlZEVudHJpZXM9c29ydEJ5UmFuayhlbnRyaWVzLGNvbXBhcmVBbnRpUmFuayk7XG5jb25zdCBrZXlzPXNvcnRlZEVudHJpZXMubWFwKChbayxfdl0pPT5rKTtcbmNvbnN0IHZhbHVlcz1zb3J0ZWRFbnRyaWVzLm1hcCgoW19rLHZdKT0+dik7XG5jb25zdCByZXN1bHQ9bWFrZVRhZ2dlZCgnY29weU1hcCcse2tleXMsdmFsdWVzfSk7XG5hc3NlcnRDb3B5TWFwKHJlc3VsdCk7XG5yZXR1cm4gcmVzdWx0O1xuIH07JGjigI1fb25jZS5tYWtlQ29weU1hcChtYWtlQ29weU1hcCk7XG5oYXJkZW4obWFrZUNvcHlNYXApO1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gS2V5cyBSZWN1ciAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdmFsXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tLZXlJbnRlcm5hbD0odmFsLGNoZWNrKT0+e1xuY29uc3QgY2hlY2tJdD0oY2hpbGQpPT5jaGVja0tleShjaGlsZCxjaGVjayk7XG5cbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZih2YWwpO1xuc3dpdGNoKHBhc3NTdHlsZSl7XG5jYXNlJ2NvcHlSZWNvcmQnOntcbi8qIEEgY29weVJlY29yZCBpcyBhIGtleSBpZmYgYWxsIGl0cyBjaGlsZHJlbiBhcmUga2V5cyovXG5yZXR1cm4gT2JqZWN0LnZhbHVlcyh2YWwpLmV2ZXJ5KGNoZWNrSXQpO1xuIH1cbmNhc2UnY29weUFycmF5Jzp7XG4vKiBBIGNvcHlBcnJheSBpcyBhIGtleSBpZmYgYWxsIGl0cyBjaGlsZHJlbiBhcmUga2V5cyovXG5yZXR1cm4gdmFsLmV2ZXJ5KGNoZWNrSXQpO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5jb25zdCB0YWc9Z2V0VGFnKHZhbCk7XG5zd2l0Y2godGFnKXtcbmNhc2UnY29weVNldCc6e1xucmV0dXJuIGNoZWNrQ29weVNldCh2YWwsY2hlY2spO1xuIH1cbmNhc2UnY29weUJhZyc6e1xucmV0dXJuIGNoZWNrQ29weUJhZyh2YWwsY2hlY2spO1xuIH1cbmNhc2UnY29weU1hcCc6e1xucmV0dXJuKFxuY2hlY2tDb3B5TWFwKHZhbCxjaGVjaykmJlxuLyogRm9yIGEgY29weU1hcCB0byBiZSBhIGtleSwgYWxsIGl0cyBrZXlzIGFuZCB2YWx1ZXMgbXVzdCovXG4vKiBiZSBrZXlzLiBLZXlzIGFscmVhZHkgY2hlY2tlZCBieSBgY2hlY2tDb3B5TWFwYCBzaW5jZSovXG4vKiB0aGF0J3MgYSBjb3B5TWFwIHJlcXVpcmVtZW50IGluIGdlbmVyYWwuKi9cbmV2ZXJ5Q29weU1hcFZhbHVlKHZhbCxjaGVja0l0KSk7XG5cbiB9XG5kZWZhdWx0OntcbnJldHVybihcbmNoZWNrIT09aWRlbnRDaGVja2VyJiZcbmNoZWNrKGZhbHNlLFggYEEgcGFzc2FibGUgdGFnZ2VkICR7cSh0YWcpfSBpcyBub3QgYSBrZXk6ICR7dmFsfWApKTtcblxuIH19XG5cbiB9XG5jYXNlJ3JlbW90YWJsZSc6e1xuLyogQWxsIHJlbW90YWJsZXMgYXJlIGtleXMuKi9cbnJldHVybiB0cnVlO1xuIH1cbmNhc2UnZXJyb3InOlxuY2FzZSdwcm9taXNlJzp7XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgQSAke3EocGFzc1N0eWxlKX0gY2Fubm90IGJlIGEga2V5YCk7XG4gfVxuZGVmYXVsdDp7XG4vKiBVbmV4cGVjdGVkIHRhZ3MgYXJlIGp1c3Qgbm9uLWtleXMsIGJ1dCBhbiB1bmV4cGVjdGVkIHBhc3NTdHlsZSovXG4vKiBpcyBhbHdheXMgYW4gZXJyb3IuKi9cbnRocm93IEZhaWwgYHVuZXhwZWN0ZWQgcGFzc1N0eWxlICR7cShwYXNzU3R5bGUpfTogJHt2YWx9YDtcbiB9fVxuXG4gfTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc1ByaW1pdGl2ZUtleSI6WyJpc1ByaW1pdGl2ZUtleSJdLCJhc3NlcnRQcmltaXRpdmVLZXkiOlsiYXNzZXJ0UHJpbWl0aXZlS2V5Il0sImNoZWNrU2NhbGFyS2V5IjpbImNoZWNrU2NhbGFyS2V5Il0sImlzU2NhbGFyS2V5IjpbImlzU2NhbGFyS2V5Il0sImFzc2VydFNjYWxhcktleSI6WyJhc3NlcnRTY2FsYXJLZXkiXSwiY2hlY2tLZXkiOlsiY2hlY2tLZXkiXSwiaXNLZXkiOlsiaXNLZXkiXSwiYXNzZXJ0S2V5IjpbImFzc2VydEtleSJdLCJjaGVja0NvcHlTZXQiOlsiY2hlY2tDb3B5U2V0Il0sImlzQ29weVNldCI6WyJpc0NvcHlTZXQiXSwiYXNzZXJ0Q29weVNldCI6WyJhc3NlcnRDb3B5U2V0Il0sImdldENvcHlTZXRLZXlzIjpbImdldENvcHlTZXRLZXlzIl0sImV2ZXJ5Q29weVNldEtleSI6WyJldmVyeUNvcHlTZXRLZXkiXSwibWFrZUNvcHlTZXQiOlsibWFrZUNvcHlTZXQiXSwiY2hlY2tDb3B5QmFnIjpbImNoZWNrQ29weUJhZyJdLCJpc0NvcHlCYWciOlsiaXNDb3B5QmFnIl0sImFzc2VydENvcHlCYWciOlsiYXNzZXJ0Q29weUJhZyJdLCJnZXRDb3B5QmFnRW50cmllcyI6WyJnZXRDb3B5QmFnRW50cmllcyJdLCJldmVyeUNvcHlCYWdFbnRyeSI6WyJldmVyeUNvcHlCYWdFbnRyeSJdLCJtYWtlQ29weUJhZyI6WyJtYWtlQ29weUJhZyJdLCJtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyI6WyJtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyJdLCJjaGVja0NvcHlNYXAiOlsiY2hlY2tDb3B5TWFwIl0sImlzQ29weU1hcCI6WyJpc0NvcHlNYXAiXSwiYXNzZXJ0Q29weU1hcCI6WyJhc3NlcnRDb3B5TWFwIl0sImdldENvcHlNYXBLZXlzIjpbImdldENvcHlNYXBLZXlzIl0sImdldENvcHlNYXBWYWx1ZXMiOlsiZ2V0Q29weU1hcFZhbHVlcyJdLCJnZXRDb3B5TWFwRW50cmllcyI6WyJnZXRDb3B5TWFwRW50cmllcyJdLCJldmVyeUNvcHlNYXBLZXkiOlsiZXZlcnlDb3B5TWFwS2V5Il0sImV2ZXJ5Q29weU1hcFZhbHVlIjpbImV2ZXJ5Q29weU1hcFZhbHVlIl0sImNvcHlNYXBLZXlTZXQiOlsiY29weU1hcEtleVNldCJdLCJtYWtlQ29weU1hcCI6WyJtYWtlQ29weU1hcCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA0aHctyhoAAMoaAAAsAAAAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL2tleXMvY29tcGFyZUtleXMuanN7ImltcG9ydHMiOlsiLi4vcGF0dGVybnMvZW5jb2RlUGFzc2FibGUuanMiLCIuLi9wYXR0ZXJucy9yYW5rT3JkZXIuanMiLCIuL2NoZWNrS2V5LmpzIiwiLi9tZXJnZS1iYWctb3BlcmF0b3JzLmpzIiwiLi9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbImNvbXBhcmVLZXlzIiwia2V5RVEiLCJrZXlHVCIsImtleUdURSIsImtleUxUIiwia2V5TFRFIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IHBhc3NTdHlsZU9mLGdldFRhZyxjb21wYXJlUmFuayxyZWNvcmROYW1lcyxyZWNvcmRWYWx1ZXMsYXNzZXJ0S2V5LGJhZ0NvbXBhcmUsc2V0Q29tcGFyZTskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dLFtcImdldFRhZ1wiLCBbJGjigI1fYSA9PiAoZ2V0VGFnID0gJGjigI1fYSldXV1dLFtcIi4uL3BhdHRlcm5zL3JhbmtPcmRlci5qc1wiLCBbW1wiY29tcGFyZVJhbmtcIiwgWyRo4oCNX2EgPT4gKGNvbXBhcmVSYW5rID0gJGjigI1fYSldXV1dLFtcIi4uL3BhdHRlcm5zL2VuY29kZVBhc3NhYmxlLmpzXCIsIFtbXCJyZWNvcmROYW1lc1wiLCBbJGjigI1fYSA9PiAocmVjb3JkTmFtZXMgPSAkaOKAjV9hKV1dLFtcInJlY29yZFZhbHVlc1wiLCBbJGjigI1fYSA9PiAocmVjb3JkVmFsdWVzID0gJGjigI1fYSldXV1dLFtcIi4vY2hlY2tLZXkuanNcIiwgW1tcImFzc2VydEtleVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0S2V5ID0gJGjigI1fYSldXV1dLFtcIi4vbWVyZ2UtYmFnLW9wZXJhdG9ycy5qc1wiLCBbW1wiYmFnQ29tcGFyZVwiLCBbJGjigI1fYSA9PiAoYmFnQ29tcGFyZSA9ICRo4oCNX2EpXV1dXSxbXCIuL21lcmdlLXNldC1vcGVyYXRvcnMuanNcIiwgW1tcInNldENvbXBhcmVcIiwgWyRo4oCNX2EgPT4gKHNldENvbXBhcmUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5jb25zdHtxdW90ZTpxLEZhaWx9PWFzc2VydDtcblxuLyoqIEB0eXBlIHtLZXlDb21wYXJlfSAqL1xuY29uc3QgICAgICAgIGNvbXBhcmVLZXlzPShsZWZ0LHJpZ2h0KT0+e1xuYXNzZXJ0S2V5KGxlZnQpO1xuYXNzZXJ0S2V5KHJpZ2h0KTtcbmNvbnN0IGxlZnRTdHlsZT1wYXNzU3R5bGVPZihsZWZ0KTtcbmNvbnN0IHJpZ2h0U3R5bGU9cGFzc1N0eWxlT2YocmlnaHQpO1xuaWYobGVmdFN0eWxlIT09cmlnaHRTdHlsZSl7XG4vKiBEaWZmZXJlbnQgcGFzc1N0eWxlcyBhcmUgaW5jb21tZW5zdXJhdGUqL1xucmV0dXJuIE5hTjtcbiB9XG5zd2l0Y2gobGVmdFN0eWxlKXtcbmNhc2UndW5kZWZpbmVkJzpcbmNhc2UnbnVsbCc6XG5jYXNlJ2Jvb2xlYW4nOlxuY2FzZSdiaWdpbnQnOlxuY2FzZSdzdHJpbmcnOlxuY2FzZSdzeW1ib2wnOntcbi8qIGZvciB0aGVzZSwga2V5cyBjb21wYXJlIHRoZSBzYW1lIGFzIHJhbmsqL1xucmV0dXJuIGNvbXBhcmVSYW5rKGxlZnQscmlnaHQpO1xuIH1cbmNhc2UnbnVtYmVyJzp7XG5jb25zdCByYW5rQ29tcD1jb21wYXJlUmFuayhsZWZ0LHJpZ2h0KTtcbmlmKHJhbmtDb21wPT09MCl7XG5yZXR1cm4gMDtcbiB9XG5pZihOdW1iZXIuaXNOYU4obGVmdCl8fE51bWJlci5pc05hTihyaWdodCkpe1xuLyogTmFOIGlzIGVxdWFsIHRvIGl0c2VsZiwgYnV0IGluY29tbWVuc3VyYXRlIHdpdGggZXZlcnl0aGluZyBlbHNlKi9cbmFzc2VydCghTnVtYmVyLmlzTmFOKGxlZnQpfHwhTnVtYmVyLmlzTmFOKHJpZ2h0KSk7XG5yZXR1cm4gTmFOO1xuIH1cbi8qIEFtb25nIG5vbi1OYU4gbnVtYmVycywga2V5IG9yZGVyIGlzIHRoZSBzYW1lIGFzIHJhbmsgb3JkZXIuIE5vdGUgdGhhdCovXG4vKiBpbiBib3RoIG9yZGVycywgYC0wYCBpcyBpbiB0aGUgc2FtZSBlcXVpdmFsZW5jZSBjbGFzcyBhcyBgMGAuKi9cbnJldHVybiByYW5rQ29tcDtcbiB9XG5jYXNlJ3JlbW90YWJsZSc6e1xuaWYobGVmdD09PXJpZ2h0KXtcbnJldHVybiAwO1xuIH1cbi8qIElmIHR3byByZW1vdGFibGVzIGFyZSBub3QgaWRlbnRpY2FsLCB0aGVuIGFzIGtleXMgdGhleSBhcmUqL1xuLyogaW5jb21tZW5zdXJhdGUuKi9cbnJldHVybiBOYU47XG4gfVxuY2FzZSdjb3B5QXJyYXknOntcbi8qIExleGljb2dyYXBoaWMgYnkga2V5IG9yZGVyLiBSYW5rIG9yZGVyIG9mIGFycmF5cyBpcyBsZXhpY29ncmFwaGljIGJ5Ki9cbi8qIHJhbmsgb3JkZXIuKi9cbi8qIEJlY2F1c2UgdGhlIGludmFyaWFudHMgYWJvdmUgYXBwbHkgdG8gdGhlIGVsZW1lbnRzIG9mIHRoZSBhcnJheSwqL1xuLyogdGhleSBhcHBseSB0byB0aGUgYXJyYXkgYXMgYSB3aG9sZS4qL1xuY29uc3QgbGVuPU1hdGgubWluKGxlZnQubGVuZ3RoLHJpZ2h0Lmxlbmd0aCk7XG5mb3IobGV0IGk9MDtpPGxlbjtpKz0xKXtcbmNvbnN0IHJlc3VsdD1jb21wYXJlS2V5cyhsZWZ0W2ldLHJpZ2h0W2ldKTtcbmlmKHJlc3VsdCE9PTApe1xucmV0dXJuIHJlc3VsdDtcbiB9XG4gfVxuLyogSWYgYWxsIG1hdGNoaW5nIGVsZW1lbnRzIGFyZSBrZXlFUSwgdGhlbiBhY2NvcmRpbmcgdG8gdGhlaXIgbGVuZ3Rocy4qL1xuLyogVGh1cywgaWYgYXJyYXkgWCBpcyBhIHByZWZpeCBvZiBhcnJheSBZLCB0aGVuIFggaXMgc21hbGxlciB0aGFuIFkuKi9cbnJldHVybiBjb21wYXJlUmFuayhsZWZ0Lmxlbmd0aCxyaWdodC5sZW5ndGgpO1xuIH1cbmNhc2UnY29weVJlY29yZCc6e1xuLyogUGFyZXRvIHBhcnRpYWwgb3JkZXIgY29tcGFyaXNvbi4qL1xuY29uc3QgbGVmdE5hbWVzPXJlY29yZE5hbWVzKGxlZnQpO1xuY29uc3QgcmlnaHROYW1lcz1yZWNvcmROYW1lcyhyaWdodCk7XG5cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5pZigha2V5RVEobGVmdE5hbWVzLHJpZ2h0TmFtZXMpKXtcbi8qIElmIHRoZXkgZG8gbm90IGhhdmUgZXhhY3RseSB0aGUgc2FtZSBwcm9wZXJ0aWVzLCovXG4vKiB0aGV5IGFyZSBpbmNvbW1lbnN1cmF0ZS4qL1xuLyogTm90ZSB0aGF0IHJhbmsgc29ydGluZyBvZiBjb3B5UmVjb3JkcyBncm91cHMgYWxsIGNvcHlSZWNvcmRzIHdpdGgqL1xuLyogdGhlIHNhbWUga2V5cyB0b2dldGhlciwgZW5hYmxpbmcgcmFuZ2Ugc2VhcmNoaW5nIG92ZXIgY29weVJlY29yZHMqL1xuLyogdG8gYXZvaWQgbW9yZSBpcnJlbGV2YW50IG9uZXMuKi9cbnJldHVybiBOYU47XG4gfVxuY29uc3QgbGVmdFZhbHVlcz1yZWNvcmRWYWx1ZXMobGVmdCxsZWZ0TmFtZXMpO1xuY29uc3QgcmlnaHRWYWx1ZXM9cmVjb3JkVmFsdWVzKHJpZ2h0LHJpZ2h0TmFtZXMpO1xuLyogUHJlc3VtZSB0aGF0IGJvdGggY29weVJlY29yZHMgaGF2ZSB0aGUgc2FtZSBrZXkgb3JkZXIqL1xuLyogdW50aWwgZW5jb3VudGVyaW5nIGEgcHJvcGVydHkgZGlzcHJvdmluZyB0aGF0IGh5cG90aGVzaXMuKi9cbmxldCByZXN1bHQ9MDtcbmZvcihsZXQgaT0wO2k8bGVmdFZhbHVlcy5sZW5ndGg7aSs9MSl7XG5jb25zdCBjb21wPWNvbXBhcmVLZXlzKGxlZnRWYWx1ZXNbaV0scmlnaHRWYWx1ZXNbaV0pO1xuaWYoTnVtYmVyLmlzTmFOKGNvbXApKXtcbnJldHVybiBOYU47XG4gfVxuaWYocmVzdWx0IT09Y29tcCYmY29tcCE9PTApe1xuaWYocmVzdWx0PT09MCl7XG5yZXN1bHQ9Y29tcDtcbiB9ZWxzZXtcbmFzc2VydChcbnJlc3VsdD09PS0xJiZjb21wPT09MXx8cmVzdWx0PT09MSYmY29tcD09PS0xKTtcblxucmV0dXJuIE5hTjtcbiB9XG4gfVxuIH1cbi8qIElmIGNvcHlSZWNvcmQgWCBpcyBzbWFsbGVyIHRoYW4gY29weVJlY29yZCBZLCB0aGVuIHRoZXkgbXVzdCBoYXZlIHRoZSovXG4vKiBzYW1lIHByb3BlcnR5IG5hbWVzIGFuZCBldmVyeSB2YWx1ZSBpbiBYIG11c3QgYmUgc21hbGxlciBvciBlcXVhbCB0byovXG4vKiB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBpbiBZICh3aXRoIGF0IGxlYXN0IG9uZSB2YWx1ZSBzbWFsbGVyKS4qL1xuLyogVGhlIHJhbmsgb3JkZXIgb2YgWCBhbmQgWSBpcyBiYXNlZCBvbiBsZXhpY29ncmFwaGljIHJhbmsgb3JkZXIgb2YqL1xuLyogdGhlaXIgdmFsdWVzLCBhcyBvcmdhbml6ZWQgYnkgcmV2ZXJzZSBsZXhpY29ncmFwaGljIG9yZGVyIG9mIHRoZWlyKi9cbi8qIHByb3BlcnR5IG5hbWVzLiovXG4vKiBUaHVzIGlmIGNvbXBhcmVLZXlzKFgsWSkgPCAwIHRoZW4gY29tcGFyZVJhbmsoWCxZKSA8IDAuKi9cbnJldHVybiByZXN1bHQ7XG4gfVxuY2FzZSd0YWdnZWQnOntcbmNvbnN0IGxlZnRUYWc9Z2V0VGFnKGxlZnQpO1xuY29uc3QgcmlnaHRUYWc9Z2V0VGFnKHJpZ2h0KTtcbmlmKGxlZnRUYWchPT1yaWdodFRhZyl7XG4vKiBkaWZmZXJlbnQgdGFncyBhcmUgaW5jb21tZW5zdXJhdGUqL1xucmV0dXJuIE5hTjtcbiB9XG5zd2l0Y2gobGVmdFRhZyl7XG5jYXNlJ2NvcHlTZXQnOntcbi8qIGNvcHlTZXQgWCBpcyBzbWFsbGVyIHRoYW4gY29weVNldCBZIHdoZW4gZXZlcnkgZWxlbWVudCBvZiBYKi9cbi8qIGlzIGtleUVRIHRvIHNvbWUgZWxlbWVudCBvZiBZIGFuZCBzb21lIGVsZW1lbnQgb2YgWSBpcyovXG4vKiBub3Qga2V5RVEgdG8gYW55IGVsZW1lbnQgb2YgWC4qL1xucmV0dXJuIHNldENvbXBhcmUobGVmdCxyaWdodCk7XG4gfVxuY2FzZSdjb3B5QmFnJzp7XG4vKiBjb3B5QmFnIFggaXMgc21hbGxlciB0aGFuIGNvcHlCYWcgWSB3aGVuIGV2ZXJ5IGVsZW1lbnQgb2YgWCovXG4vKiBvY2N1cnMgbm8gbW9yZSB0aGFuIHRoZSBrZXlFUSBlbGVtZW50IG9mIFksIGFuZCBzb21lIGVsZW1lbnQqL1xuLyogb2YgWSBvY2N1cnMgbW9yZSB0aGFuIHNvbWUgZWxlbWVudCBvZiBYLCB3aGVyZSBiZWluZyBhYnNlbnQqL1xuLyogZnJvbSBYIGNvdW50cyBhcyBvY2N1cnJpbmcgemVybyB0aW1lcy4qL1xucmV0dXJuIGJhZ0NvbXBhcmUobGVmdCxyaWdodCk7XG4gfVxuY2FzZSdjb3B5TWFwJzp7XG4vKiBUd28gY29weU1hcHMgdGhhdCBoYXZlIGRpZmZlcmVudCBrZXlzIChhY2NvcmRpbmcgdG8ga2V5RVEpIGFyZSovXG4vKiBpbmNvbW1lbnN1cmF0ZS4gVGhlIHJlcHJlc2VudGF0aW9uIG9mIGNvcHlNYXBzIGluY2x1ZGVzIHRoZSBrZXlzKi9cbi8qIGZpcnN0LCBpbiB0aGUgc2FtZSByZXZlcnNlIHJhbmsgb3JkZXIgdXNlZCBieSBzZXRzLiBUaHVzLCBhbGwqL1xuLyogY29weU1hcHMgd2l0aCBrZXlzIG9mIHRoZSBzYW1lIHJhbmsgKHdoaWNoIGlzKi9cbi8qIGxlc3MgcHJlY2lzZSEpIHdpbGwgYmUgZ3JvdXBlZCB0b2dldGhlciB3aGVuIGNvcHlNYXBzIGFyZSBzb3J0ZWQqL1xuLyogYnkgcmFuaywgbWluaW1pemluZyB0aGUgbnVtYmVyIG9mIG1pc3NlcyB3aGVuIHJhbmdlIHNlYXJjaGluZy4qL1xuLyoqL1xuLyogQW1vbmcgY29weU1hcHMgd2l0aCB0aGUgc2FtZSBrZXlzIChhY2NvcmRpbmcgdG8ga2V5RVEpLCB0aGV5Ki9cbi8qIGNvbXBhcmUgYnkgYSBjb3JyZXNwb25kaW5nIGNvbXBhcmlzb24gb2YgdGhlaXIgdmFsdWVzLiBUaHVzLCBhcyovXG4vKiB3aXRoIHJlY29yZHMsIGZvciB0d28gY29weU1hcHMgWCBhbmQgWSwgaWYgYGNvbXBhcmVLZXlzKFgsWSkgPCovXG4vKiAwYCB0aGVuLCBiZWNhdXNlIHRoZXNlIHZhbHVlcyBvYmV5IHRoZSBhYm92ZSBpbnZhcmlhbnRzLCBub25lIG9mKi9cbi8qIHRoZSB2YWx1ZXMgaW4gWCBoYXZlIGEgbGF0ZXIgcmFuayB0aGFuIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlKi9cbi8qIG9mIFkuIFRodXMsIGBjb21wYXJlUmFuayhYLFkpIDw9IDBgLiBUT0RPIGltcGxlbWVudCovXG50aHJvdyBGYWlsIGBNYXAgY29tcGFyaXNvbiBub3QgeWV0IGltcGxlbWVudGVkOiAke2xlZnR9IHZzICR7cmlnaHR9YDtcbiB9XG5kZWZhdWx0OntcbnRocm93IEZhaWwgYHVuZXhwZWN0ZWQgdGFnICR7cShsZWZ0VGFnKX06ICR7bGVmdH1gO1xuIH19XG5cbiB9XG5kZWZhdWx0OntcbnRocm93IEZhaWwgYHVuZXhwZWN0ZWQgcGFzc1N0eWxlICR7cShsZWZ0U3R5bGUpfTogJHtsZWZ0fWA7XG4gfX1cblxuIH07JGjigI1fb25jZS5jb21wYXJlS2V5cyhjb21wYXJlS2V5cyk7XG5oYXJkZW4oY29tcGFyZUtleXMpO1xuXG5jb25zdCAgICAgICAga2V5TFQ9KGxlZnQscmlnaHQpPT5jb21wYXJlS2V5cyhsZWZ0LHJpZ2h0KTwwOyRo4oCNX29uY2Uua2V5TFQoa2V5TFQpO1xuaGFyZGVuKGtleUxUKTtcblxuY29uc3QgICAgICAgIGtleUxURT0obGVmdCxyaWdodCk9PmNvbXBhcmVLZXlzKGxlZnQscmlnaHQpPD0wOyRo4oCNX29uY2Uua2V5TFRFKGtleUxURSk7XG5oYXJkZW4oa2V5TFRFKTtcblxuY29uc3QgICAgICAgIGtleUVRPShsZWZ0LHJpZ2h0KT0+Y29tcGFyZUtleXMobGVmdCxyaWdodCk9PT0wOyRo4oCNX29uY2Uua2V5RVEoa2V5RVEpO1xuaGFyZGVuKGtleUVRKTtcblxuY29uc3QgICAgICAgIGtleUdURT0obGVmdCxyaWdodCk9PmNvbXBhcmVLZXlzKGxlZnQscmlnaHQpPj0wOyRo4oCNX29uY2Uua2V5R1RFKGtleUdURSk7XG5oYXJkZW4oa2V5R1RFKTtcblxuY29uc3QgICAgICAgIGtleUdUPShsZWZ0LHJpZ2h0KT0+Y29tcGFyZUtleXMobGVmdCxyaWdodCk+MDskaOKAjV9vbmNlLmtleUdUKGtleUdUKTtcbmhhcmRlbihrZXlHVCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiY29tcGFyZUtleXMiOlsiY29tcGFyZUtleXMiXSwia2V5TFQiOlsia2V5TFQiXSwia2V5TFRFIjpbImtleUxURSJdLCJrZXlFUSI6WyJrZXlFUSJdLCJrZXlHVEUiOlsia2V5R1RFIl0sImtleUdUIjpbImtleUdUIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEyL4qQOEwAADhMAACgAAABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMva2V5cy9jb3B5QmFnLmpzeyJpbXBvcnRzIjpbIi4uL3BhdHRlcm5zL3JhbmtPcmRlci5qcyIsIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJhc3NlcnRCYWdFbnRyaWVzIiwiYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzIiwiY2hlY2tCYWdFbnRyaWVzIiwiY29lcmNlVG9CYWdFbnRyaWVzIiwibWFrZUJhZ09mRW50cmllcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnRDaGVja2VyLG1ha2VUYWdnZWQscGFzc1N0eWxlT2YsY29tcGFyZUFudGlSYW5rLGlzUmFua1NvcnRlZCxtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCxzb3J0QnlSYW5rOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dLFtcIm1ha2VUYWdnZWRcIiwgWyRo4oCNX2EgPT4gKG1ha2VUYWdnZWQgPSAkaOKAjV9hKV1dLFtcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV1dXSxbXCIuLi9wYXR0ZXJucy9yYW5rT3JkZXIuanNcIiwgW1tcImNvbXBhcmVBbnRpUmFua1wiLCBbJGjigI1fYSA9PiAoY29tcGFyZUFudGlSYW5rID0gJGjigI1fYSldXSxbXCJpc1JhbmtTb3J0ZWRcIiwgWyRo4oCNX2EgPT4gKGlzUmFua1NvcnRlZCA9ICRo4oCNX2EpXV0sW1wibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0ID0gJGjigI1fYSldXSxbXCJzb3J0QnlSYW5rXCIsIFskaOKAjV9hID0+IChzb3J0QnlSYW5rID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cbi8qLyA8cmVmZXJlbmNlIHR5cGVzPVwic2VzXCIvPiovXG5cbmNvbnN0e2RldGFpbHM6WH09YXNzZXJ0O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1tULGJpZ2ludF1bXX0gYmFnRW50cmllc1xuICogQHBhcmFtIHtGdWxsQ29tcGFyZSB8IHVuZGVmaW5lZH0gZnVsbENvbXBhcmUgSWYgcHJvdmlkZWQgYW5kIGBiYWdFbnRyaWVzYCBpcyBhbHJlYWR5XG4gKiBrbm93biB0byBiZSBzb3J0ZWQgYnkgdGhpcyBgZnVsbENvbXBhcmVgLCB0aGVuIHdlIHNob3VsZCBnZXQgYSBtZW1vIGhpdFxuICogcmF0aGVyIHRoYW4gYSByZXNvcnRpbmcuIEhvd2V2ZXIsIGN1cnJlbnRseSwgd2Ugc3RpbGwgZW51bWVyYXRlIHRoZSBlbnRpcmVcbiAqIGFycmF5IGVhY2ggdGltZS5cbiAqXG4gKiBUT0RPOiBJZiBkb2luZyB0aGlzIHJlZHVudGFudGx5IHR1cm5zIG91dCB0byBiZSBleHBlbnNpdmUsIHdlXG4gKiBjb3VsZCBtZW1vaXplIHRoaXMgbm8tZHVwbGljYXRlLWtleXMgZmluZGluZyBhcyB3ZWxsLCBpbmRlcGVuZGVudFxuICogb2YgdGhlIGBmdWxsT3JkZXJgIHVzZSB0byByZWFjaCB0aGlzIGZpbmRpbmcuXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tOb0R1cGxpY2F0ZUtleXM9KGJhZ0VudHJpZXMsZnVsbENvbXBhcmUsY2hlY2spPT57XG4vKiBUaGlzIGZ1bGxPcmRlciBjb250YWlucyBoaXN0b3J5IGRlcGVuZGVudCBzdGF0ZS4gSXQgaXMgc3BlY2lmaWMqL1xuLyogdG8gdGhpcyBvbmUgY2FsbCBhbmQgZG9lcyBub3Qgc3Vydml2ZSBpdC4qL1xuLyogVE9ETyBPbmNlIGFsbCBvdXIgdG9vbGluZyBpcyByZWFkeSBmb3IgYCYmPWAsIHRoZSBmb2xsb3dpbmcqL1xuLyogbGluZSBzaG91bGQgYmUgcmV3cml0dGVuIHVzaW5nIGl0LiovXG5mdWxsQ29tcGFyZT1mdWxsQ29tcGFyZXx8bWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQoKS5hbnRpQ29tcGFyYXRvcjtcblxuLyogU2luY2UgdGhlIGtleSBpcyBtb3JlIHNpZ25pZmljYW50IHRoYW4gdGhlIHZhbHVlICh0aGUgY291bnQpLCovXG4vKiBzb3J0aW5nIGJ5IGZ1bGxPcmRlciBpcyBndWFyYW50ZWVkIHRvIG1ha2UgZHVwbGljYXRlIGtleXMqL1xuLyogYWRqYWNlbnQgaW5kZXBlbmRlbnQgb2YgdGhlaXIgY291bnRzLiovXG5iYWdFbnRyaWVzPXNvcnRCeVJhbmsoYmFnRW50cmllcyxmdWxsQ29tcGFyZSk7XG5jb25zdHtsZW5ndGh9PWJhZ0VudHJpZXM7XG5mb3IobGV0IGk9MTtpPGxlbmd0aDtpKz0xKXtcbmNvbnN0IGswPWJhZ0VudHJpZXNbaS0xXVswXTtcbmNvbnN0IGsxPWJhZ0VudHJpZXNbaV1bMF07XG5pZihmdWxsQ29tcGFyZShrMCxrMSk9PT0wKXtcbnJldHVybiBjaGVjayhmYWxzZSxYIGB2YWx1ZSBoYXMgZHVwbGljYXRlIGtleXM6ICR7azB9YCk7XG4gfVxuIH1cbnJldHVybiB0cnVlO1xuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7W1QsYmlnaW50XVtdfSBiYWdFbnRyaWVzXG4gKiBAcGFyYW0ge0Z1bGxDb21wYXJlPX0gZnVsbENvbXBhcmVcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5jb25zdCAgICAgICAgYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzPShiYWdFbnRyaWVzLGZ1bGxDb21wYXJlPXVuZGVmaW5lZCk9PntcbmNoZWNrTm9EdXBsaWNhdGVLZXlzKGJhZ0VudHJpZXMsZnVsbENvbXBhcmUsYXNzZXJ0Q2hlY2tlcik7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1tQYXNzYWJsZSxiaWdpbnRdW119IGJhZ0VudHJpZXNcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovJGjigI1fb25jZS5hc3NlcnROb0R1cGxpY2F0ZUtleXMoYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzKTtcbmNvbnN0ICAgICAgICBjaGVja0JhZ0VudHJpZXM9KGJhZ0VudHJpZXMsY2hlY2spPT57XG5pZihwYXNzU3R5bGVPZihiYWdFbnRyaWVzKSE9PSdjb3B5QXJyYXknKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgVGhlIGVudHJpZXMgb2YgYSBjb3B5QmFnIG11c3QgYmUgYSBjb3B5QXJyYXk6ICR7YmFnRW50cmllc31gKTtcblxuIH1cbmlmKCFpc1JhbmtTb3J0ZWQoYmFnRW50cmllcyxjb21wYXJlQW50aVJhbmspKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgVGhlIGVudHJpZXMgb2YgYSBjb3B5QmFnIG11c3QgYmUgc29ydGVkIGluIHJldmVyc2UgcmFuayBvcmRlcjogJHtiYWdFbnRyaWVzfWApO1xuXG4gfVxuZm9yKGNvbnN0IGVudHJ5IG9mIGJhZ0VudHJpZXMpe1xuaWYoXG5wYXNzU3R5bGVPZihlbnRyeSkhPT0nY29weUFycmF5J3x8XG5lbnRyeS5sZW5ndGghPT0yfHxcbnR5cGVvZiBlbnRyeVsxXSE9PSdiaWdpbnQnKVxue1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBFYWNoIGVudHJ5IG9mIGEgY29weUJhZyBtdXN0IGJlIHBhaXIgb2YgYSBrZXkgYW5kIGEgYmlnaW50IHJlcHJlc2VudGluZyBhIGNvdW50OiAke2VudHJ5fWApO1xuXG4gfVxuaWYoZW50cnlbMV08MSl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYEVhY2ggZW50cnkgb2YgYSBjb3B5QmFnIG11c3QgaGF2ZSBhIHBvc2l0aXZlIGNvdW50OiAke2VudHJ5fWApO1xuXG4gfVxuIH1cbnJldHVybiBjaGVja05vRHVwbGljYXRlS2V5cyhiYWdFbnRyaWVzLHVuZGVmaW5lZCxjaGVjayk7XG4gfTskaOKAjV9vbmNlLmNoZWNrQmFnRW50cmllcyhjaGVja0JhZ0VudHJpZXMpO1xuaGFyZGVuKGNoZWNrQmFnRW50cmllcyk7XG5cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLXJldHVybnMtY2hlY2sgLS0gZG9lc24ndCB1bmRlcnN0YW5kIGFzc2VydHMqL1xuLyoqXG4gKiBAcGFyYW0ge1tQYXNzYWJsZSxiaWdpbnRdW119IGJhZ0VudHJpZXNcbiAqIEByZXR1cm5zIHthc3NlcnRzIGJhZ0VudHJpZXMgaXMgW1Bhc3NhYmxlLGJpZ2ludF1bXX1cbiAqL1xuY29uc3QgICAgICAgIGFzc2VydEJhZ0VudHJpZXM9KGJhZ0VudHJpZXMpPT57XG5jaGVja0JhZ0VudHJpZXMoYmFnRW50cmllcyxhc3NlcnRDaGVja2VyKTtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0QmFnRW50cmllcyhhc3NlcnRCYWdFbnRyaWVzKTtcbmhhcmRlbihhc3NlcnRCYWdFbnRyaWVzKTtcblxuY29uc3QgICAgICAgIGNvZXJjZVRvQmFnRW50cmllcz0oYmFnRW50cmllc0xpc3QpPT57XG5jb25zdCBiYWdFbnRyaWVzPXNvcnRCeVJhbmsoYmFnRW50cmllc0xpc3QsY29tcGFyZUFudGlSYW5rKTtcbmFzc2VydEJhZ0VudHJpZXMoYmFnRW50cmllcyk7XG5yZXR1cm4gYmFnRW50cmllcztcbiB9OyRo4oCNX29uY2UuY29lcmNlVG9CYWdFbnRyaWVzKGNvZXJjZVRvQmFnRW50cmllcyk7XG5oYXJkZW4oY29lcmNlVG9CYWdFbnRyaWVzKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtJdGVyYWJsZTxbSywgYmlnaW50XT59IGJhZ0VudHJ5SXRlclxuICogQHJldHVybnMge0NvcHlCYWc8Sz59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlQmFnT2ZFbnRyaWVzPShiYWdFbnRyeUl0ZXIpPT5cbm1ha2VUYWdnZWQoJ2NvcHlCYWcnLGNvZXJjZVRvQmFnRW50cmllcyhiYWdFbnRyeUl0ZXIpKTskaOKAjV9vbmNlLm1ha2VCYWdPZkVudHJpZXMobWFrZUJhZ09mRW50cmllcyk7XG5oYXJkZW4obWFrZUJhZ09mRW50cmllcyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzIjpbImFzc2VydE5vRHVwbGljYXRlS2V5cyJdLCJjaGVja0JhZ0VudHJpZXMiOlsiY2hlY2tCYWdFbnRyaWVzIl0sImFzc2VydEJhZ0VudHJpZXMiOlsiYXNzZXJ0QmFnRW50cmllcyJdLCJjb2VyY2VUb0JhZ0VudHJpZXMiOlsiY29lcmNlVG9CYWdFbnRyaWVzIl0sIm1ha2VCYWdPZkVudHJpZXMiOlsibWFrZUJhZ09mRW50cmllcyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACOhI2Thw8AAIcPAAAoAAAAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL2tleXMvY29weVNldC5qc3siaW1wb3J0cyI6WyIuLi9wYXR0ZXJucy9yYW5rT3JkZXIuanMiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsiYXNzZXJ0RWxlbWVudHMiLCJhc3NlcnROb0R1cGxpY2F0ZXMiLCJjaGVja0VsZW1lbnRzIiwiY29lcmNlVG9FbGVtZW50cyIsIm1ha2VTZXRPZkVsZW1lbnRzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydENoZWNrZXIsbWFrZVRhZ2dlZCxwYXNzU3R5bGVPZixjb21wYXJlQW50aVJhbmssaXNSYW5rU29ydGVkLG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0LHNvcnRCeVJhbms7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV0sW1wibWFrZVRhZ2dlZFwiLCBbJGjigI1fYSA9PiAobWFrZVRhZ2dlZCA9ICRo4oCNX2EpXV0sW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXV1dLFtcIi4uL3BhdHRlcm5zL3JhbmtPcmRlci5qc1wiLCBbW1wiY29tcGFyZUFudGlSYW5rXCIsIFskaOKAjV9hID0+IChjb21wYXJlQW50aVJhbmsgPSAkaOKAjV9hKV1dLFtcImlzUmFua1NvcnRlZFwiLCBbJGjigI1fYSA9PiAoaXNSYW5rU29ydGVkID0gJGjigI1fYSldXSxbXCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdFwiLCBbJGjigI1fYSA9PiAobWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQgPSAkaOKAjV9hKV1dLFtcInNvcnRCeVJhbmtcIiwgWyRo4oCNX2EgPT4gKHNvcnRCeVJhbmsgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuLyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIi8+Ki9cblxuY29uc3R7ZGV0YWlsczpYfT1hc3NlcnQ7XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7VFtdfSBlbGVtZW50c1xuICogQHBhcmFtIHtGdWxsQ29tcGFyZSB8IHVuZGVmaW5lZH0gZnVsbENvbXBhcmUgSWYgcHJvdmlkZWQgYW5kIGBlbGVtZW50c2AgaXMgYWxyZWFkeSBrbm93blxuICogdG8gYmUgc29ydGVkIGJ5IHRoaXMgYGZ1bGxDb21wYXJlYCwgdGhlbiB3ZSBzaG91bGQgZ2V0IGEgbWVtbyBoaXQgcmF0aGVyXG4gKiB0aGFuIGEgcmVzb3J0aW5nLiBIb3dldmVyLCBjdXJyZW50bHksIHdlIHN0aWxsIGVudW1lcmF0ZSB0aGUgZW50aXJlIGFycmF5XG4gKiBlYWNoIHRpbWUuXG4gKlxuICogVE9ETzogSWYgZG9pbmcgdGhpcyByZWR1bnRhbnRseSB0dXJucyBvdXQgdG8gYmUgZXhwZW5zaXZlLCB3ZVxuICogY291bGQgbWVtb2l6ZSB0aGlzIG5vLWR1cGxpY2F0ZSBmaW5kaW5nIGFzIHdlbGwsIGluZGVwZW5kZW50XG4gKiBvZiB0aGUgYGZ1bGxPcmRlcmAgdXNlIHRvIHJlYWNoIHRoaXMgZmluZGluZy5cbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja05vRHVwbGljYXRlcz0oZWxlbWVudHMsZnVsbENvbXBhcmUsY2hlY2spPT57XG4vKiBUaGlzIGZ1bGxPcmRlciBjb250YWlucyBoaXN0b3J5IGRlcGVuZGVudCBzdGF0ZS4gSXQgaXMgc3BlY2lmaWMqL1xuLyogdG8gdGhpcyBvbmUgY2FsbCBhbmQgZG9lcyBub3Qgc3Vydml2ZSBpdC4qL1xuLyogVE9ETyBPbmNlIGFsbCBvdXIgdG9vbGluZyBpcyByZWFkeSBmb3IgYCYmPWAsIHRoZSBmb2xsb3dpbmcqL1xuLyogbGluZSBzaG91bGQgYmUgcmV3cml0dGVuIHVzaW5nIGl0LiovXG5mdWxsQ29tcGFyZT1mdWxsQ29tcGFyZXx8bWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQoKS5hbnRpQ29tcGFyYXRvcjtcblxuZWxlbWVudHM9c29ydEJ5UmFuayhlbGVtZW50cyxmdWxsQ29tcGFyZSk7XG5jb25zdHtsZW5ndGh9PWVsZW1lbnRzO1xuZm9yKGxldCBpPTE7aTxsZW5ndGg7aSs9MSl7XG5jb25zdCBrMD1lbGVtZW50c1tpLTFdO1xuY29uc3QgazE9ZWxlbWVudHNbaV07XG5pZihmdWxsQ29tcGFyZShrMCxrMSk9PT0wKXtcbnJldHVybiBjaGVjayhmYWxzZSxYIGB2YWx1ZSBoYXMgZHVwbGljYXRlczogJHtrMH1gKTtcbiB9XG4gfVxucmV0dXJuIHRydWU7XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUW119IGVsZW1lbnRzXG4gKiBAcGFyYW0ge0Z1bGxDb21wYXJlPX0gZnVsbENvbXBhcmVcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5jb25zdCAgICAgICAgYXNzZXJ0Tm9EdXBsaWNhdGVzPShlbGVtZW50cyxmdWxsQ29tcGFyZT11bmRlZmluZWQpPT57XG5jaGVja05vRHVwbGljYXRlcyhlbGVtZW50cyxmdWxsQ29tcGFyZSxhc3NlcnRDaGVja2VyKTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gZWxlbWVudHNcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovJGjigI1fb25jZS5hc3NlcnROb0R1cGxpY2F0ZXMoYXNzZXJ0Tm9EdXBsaWNhdGVzKTtcbmNvbnN0ICAgICAgICBjaGVja0VsZW1lbnRzPShlbGVtZW50cyxjaGVjayk9PntcbmlmKHBhc3NTdHlsZU9mKGVsZW1lbnRzKSE9PSdjb3B5QXJyYXknKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgVGhlIGtleXMgb2YgYSBjb3B5U2V0IG9yIGNvcHlNYXAgbXVzdCBiZSBhIGNvcHlBcnJheTogJHtlbGVtZW50c31gKTtcblxuIH1cbmlmKCFpc1JhbmtTb3J0ZWQoZWxlbWVudHMsY29tcGFyZUFudGlSYW5rKSl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYFRoZSBrZXlzIG9mIGEgY29weVNldCBvciBjb3B5TWFwIG11c3QgYmUgc29ydGVkIGluIHJldmVyc2UgcmFuayBvcmRlcjogJHtlbGVtZW50c31gKTtcblxuIH1cbnJldHVybiBjaGVja05vRHVwbGljYXRlcyhlbGVtZW50cyx1bmRlZmluZWQsY2hlY2spO1xuIH07JGjigI1fb25jZS5jaGVja0VsZW1lbnRzKGNoZWNrRWxlbWVudHMpO1xuaGFyZGVuKGNoZWNrRWxlbWVudHMpO1xuXG5jb25zdCAgICAgICAgYXNzZXJ0RWxlbWVudHM9KGVsZW1lbnRzKT0+e1xuY2hlY2tFbGVtZW50cyhlbGVtZW50cyxhc3NlcnRDaGVja2VyKTtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0RWxlbWVudHMoYXNzZXJ0RWxlbWVudHMpO1xuaGFyZGVuKGFzc2VydEVsZW1lbnRzKTtcblxuY29uc3QgICAgICAgIGNvZXJjZVRvRWxlbWVudHM9KGVsZW1lbnRzTGlzdCk9PntcbmNvbnN0IGVsZW1lbnRzPXNvcnRCeVJhbmsoZWxlbWVudHNMaXN0LGNvbXBhcmVBbnRpUmFuayk7XG5hc3NlcnRFbGVtZW50cyhlbGVtZW50cyk7XG5yZXR1cm4gZWxlbWVudHM7XG4gfTskaOKAjV9vbmNlLmNvZXJjZVRvRWxlbWVudHMoY29lcmNlVG9FbGVtZW50cyk7XG5oYXJkZW4oY29lcmNlVG9FbGVtZW50cyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7SXRlcmFibGU8Sz59IGVsZW1lbnRJdGVyXG4gKiBAcmV0dXJucyB7Q29weVNldDxLPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VTZXRPZkVsZW1lbnRzPShlbGVtZW50SXRlcik9PlxubWFrZVRhZ2dlZCgnY29weVNldCcsY29lcmNlVG9FbGVtZW50cyhlbGVtZW50SXRlcikpOyRo4oCNX29uY2UubWFrZVNldE9mRWxlbWVudHMobWFrZVNldE9mRWxlbWVudHMpO1xuaGFyZGVuKG1ha2VTZXRPZkVsZW1lbnRzKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhc3NlcnROb0R1cGxpY2F0ZXMiOlsiYXNzZXJ0Tm9EdXBsaWNhdGVzIl0sImNoZWNrRWxlbWVudHMiOlsiY2hlY2tFbGVtZW50cyJdLCJhc3NlcnRFbGVtZW50cyI6WyJhc3NlcnRFbGVtZW50cyJdLCJjb2VyY2VUb0VsZW1lbnRzIjpbImNvZXJjZVRvRWxlbWVudHMiXSwibWFrZVNldE9mRWxlbWVudHMiOlsibWFrZVNldE9mRWxlbWVudHMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAS3V5OBoiAAAaIgAANAAAAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9rZXlzL21lcmdlLWJhZy1vcGVyYXRvcnMuanN7ImltcG9ydHMiOlsiLi4vcGF0dGVybnMvcmFua09yZGVyLmpzIiwiLi9jb3B5QmFnLmpzIl0sImV4cG9ydHMiOlsiYmFnQ29tcGFyZSIsImJhZ0Rpc2pvaW50U3VidHJhY3QiLCJiYWdJbnRlcnNlY3Rpb24iLCJiYWdJc0Rpc2pvaW50IiwiYmFnSXNTdXBlcmJhZyIsImJhZ1VuaW9uIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydFJhbmtTb3J0ZWQsY29tcGFyZUFudGlSYW5rLG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0LHNvcnRCeVJhbmssYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzLG1ha2VCYWdPZkVudHJpZXM7JGjigI1faW1wb3J0cyhbW1wiLi4vcGF0dGVybnMvcmFua09yZGVyLmpzXCIsIFtbXCJhc3NlcnRSYW5rU29ydGVkXCIsIFskaOKAjV9hID0+IChhc3NlcnRSYW5rU29ydGVkID0gJGjigI1fYSldXSxbXCJjb21wYXJlQW50aVJhbmtcIiwgWyRo4oCNX2EgPT4gKGNvbXBhcmVBbnRpUmFuayA9ICRo4oCNX2EpXV0sW1wibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0ID0gJGjigI1fYSldXSxbXCJzb3J0QnlSYW5rXCIsIFskaOKAjV9hID0+IChzb3J0QnlSYW5rID0gJGjigI1fYSldXV1dLFtcIi4vY29weUJhZy5qc1wiLCBbW1wiYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzXCIsIFskaOKAjV9hID0+IChhc3NlcnROb0R1cGxpY2F0ZUtleXMgPSAkaOKAjV9hKV1dLFtcIm1ha2VCYWdPZkVudHJpZXNcIiwgWyRo4oCNX2EgPT4gKG1ha2VCYWdPZkVudHJpZXMgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuY29uc3R7cXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5cbi8qIEJhc2VkIG9uIG1lcmdlLXNldC1vcGVyYXRvcnMuanMsIGJ1dCBhbHRlcmVkIGZvciB0aGUgYmFnIHJlcHJlc2VudGF0aW9uLiovXG4vKiBUT0RPIHNoYXJlIG1vcmUgY29kZSB3aXRoIG1lcmdlLXNldC1vcGVyYXRvcnMuanMsIHJhdGhlciB0aGFuKi9cbi8qIGR1cGxpY2F0aW5nIHdpdGggY2hhbmdlcy4qL1xuXG4vKipcbiAqIEFzc2VydHMgdGhhdCBgYmFnRW50cmllc2AgaXMgYWxyZWFkeSByYW5rIHNvcnRlZCBieSBgcmFua0NvbXBhcmVgLCB3aGVyZVxuICogdGhlcmVcbiAqIG1heSBiZSBjb250aWd1b3VzIHJlZ2lvbnMgb2YgYmFnRW50cmllcyB3aG9zZSBrZXlzIGFyZSB0aWVkIGZvciB0aGUgc2FtZVxuICogcmFuay5cbiAqIFJldHVybnMgYW4gaXRlcmFibGUgdGhhdCB3aWxsIGVudW1lcmF0ZSBhbGwgdGhlIGJhZ0VudHJpZXMgaW4gb3JkZXJcbiAqIGFjY29yZGluZyB0byBgZnVsbE9yZGVyYCwgd2hpY2ggc2hvdWxkIGRpZmZlciBmcm9tIGByYW5rT3JkZXJgIG9ubHlcbiAqIGJ5IGJlaW5nIG1vcmUgcHJlY2lzZS5cbiAqXG4gKiBUaGlzIHNob3VsZCBiZSBlcXVpdmFsZW50IHRvIHJlc29ydGluZyB0aGUgZW50aXJlIGBiYWdFbnRyaWVzYCBhcnJheVxuICogYWNjb3JkaW5nXG4gKiB0byBgZnVsbE9yZGVyYC4gSG93ZXZlciwgaXQgb3B0aW1pemVzIGZvciB0aGUgY2FzZSB3aGVyZSB0aGVzZSBjb250aWd1b3VzXG4gKiBydW5zIHRoYXQgbmVlZCB0byBiZSByZXNvcnRlZCBhcmUgZWl0aGVyIGFic2VudCBvciBzbWFsbC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtbVCxiaWdpbnRdW119IGJhZ0VudHJpZXNcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IHJhbmtDb21wYXJlXG4gKiBAcGFyYW0ge0Z1bGxDb21wYXJlfSBmdWxsQ29tcGFyZVxuICogQHJldHVybnMge0l0ZXJhYmxlPFtULGJpZ2ludF0+fVxuICovXG5jb25zdCBiYWdXaW5kb3dSZXNvcnQ9KGJhZ0VudHJpZXMscmFua0NvbXBhcmUsZnVsbENvbXBhcmUpPT57XG5hc3NlcnRSYW5rU29ydGVkKGJhZ0VudHJpZXMscmFua0NvbXBhcmUpO1xuY29uc3R7bGVuZ3RofT1iYWdFbnRyaWVzO1xubGV0IGk9MDtcbmxldCBvcHRJbm5lckl0ZXJhdG9yO1xucmV0dXJuIGhhcmRlbih7XG5bU3ltYm9sLml0ZXJhdG9yXTooKT0+XG5oYXJkZW4oe1xubmV4dDooKT0+e1xuaWYob3B0SW5uZXJJdGVyYXRvcil7XG5jb25zdCByZXN1bHQ9b3B0SW5uZXJJdGVyYXRvci5uZXh0KCk7XG5pZihyZXN1bHQuZG9uZSl7XG5vcHRJbm5lckl0ZXJhdG9yPXVuZGVmaW5lZDtcbi8qIGZhbGwgdGhyb3VnaCovXG4gfWVsc2V7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbiB9XG5pZihpPGxlbmd0aCl7XG5jb25zdCBlbnRyeT1iYWdFbnRyaWVzW2ldO1xubGV0IGo9aSsxO1xud2hpbGUoXG5qPGxlbmd0aCYmXG5yYW5rQ29tcGFyZShlbnRyeVswXSxiYWdFbnRyaWVzW2pdWzBdKT09PTApXG57XG5qKz0xO1xuIH1cbmlmKGo9PT1pKzEpe1xuaT1qO1xucmV0dXJuIGhhcmRlbih7ZG9uZTpmYWxzZSx2YWx1ZTplbnRyeX0pO1xuIH1cbmNvbnN0IHNpbWlsYXJSdW49YmFnRW50cmllcy5zbGljZShpLGopO1xuaT1qO1xuY29uc3QgcmVzb3J0ZWQ9c29ydEJ5UmFuayhzaW1pbGFyUnVuLGZ1bGxDb21wYXJlKTtcbi8qIFByb3ZpZGluZyB0aGUgc2FtZSBgZnVsbENvbXBhcmVgIHNob3VsZCBjYXVzZSBhIG1lbW8gaGl0Ki9cbi8qIHdpdGhpbiBgYXNzZXJ0Tm9EdXBsaWNhdGVzYCBlbmFibGluZyBpdCB0byBhdm9pZCBhKi9cbi8qIHJlZHVuZGFudCByZXNvcnRpbmcuKi9cbmFzc2VydE5vRHVwbGljYXRlS2V5cyhyZXNvcnRlZCxmdWxsQ29tcGFyZSk7XG4vKiBUaGlzIGlzIHRoZSByYXcgSlMgYXJyYXkgaXRlcmF0b3Igd2hvc2UgYC5uZXh0KClgIG1ldGhvZCovXG4vKiBkb2VzIG5vdCBoYXJkZW4gdGhlIEl0ZXJhdG9yUmVzdWx0LCBpbiB2aW9sYXRpb24gb2Ygb3VyKi9cbi8qIGNvbnZlbnRpb25zLiBGaXhpbmcgdGhpcyBpcyBleHBlbnNpdmUgYW5kIEknbSBjb25maWRlbnQgdGhlKi9cbi8qIHVuZnJvemVuIHZhbHVlIGRvZXMgbm90IGVzY2FwZSB0aGlzIGZpbGUsIHNvIEknbSBsZWF2aW5nIHRoaXMqL1xuLyogYXMgaXMuKi9cbm9wdElubmVySXRlcmF0b3I9cmVzb3J0ZWRbU3ltYm9sLml0ZXJhdG9yXSgpO1xucmV0dXJuIG9wdElubmVySXRlcmF0b3IubmV4dCgpO1xuIH1lbHNle1xucmV0dXJuIGhhcmRlbih7ZG9uZTp0cnVlLHZhbHVlOltudWxsLDBuXX0pO1xuIH1cbiB9fSl9KTtcblxuXG4gfTtcblxuLyoqXG4gKiBSZXR1cm5zIGFuIGl0ZXJhYmxlIHdob3NlIGl0ZXJhdGlvbiByZXN1bHRzIGFyZSBba2V5LCB4Q291bnQsIHlDb3VudF0gdHVwbGVzXG4gKiByZXByZXNlbnRpbmcgdGhlIG5leHQga2V5IGluIHRoZSBsb2NhbCBmdWxsIG9yZGVyLCBhcyB3ZWxsIGFzIGhvdyBtYW55XG4gKiB0aW1lcyBpdCBvY2N1cnJlZCBpbiB0aGUgeCBpbnB1dCBpdGVyYXRvciBhbmQgdGhlIHkgaW5wdXQgaXRlcmF0b3IuXG4gKlxuICogRm9yIHNldHMsIHRoZXNlIGNvdW50cyBhcmUgYWx3YXlzIDAgb3IgMSwgYnV0IHRoaXMgcmVwcmVzZW50YXRpb25cbiAqIGdlbmVyYWxpemVzIG5pY2VseSBmb3IgYmFncy5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtbVCxiaWdpbnRdW119IHhiYWdFbnRyaWVzXG4gKiBAcGFyYW0ge1tULGJpZ2ludF1bXX0geWJhZ0VudHJpZXNcbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxbVCxiaWdpbnQsYmlnaW50XT59XG4gKi9cbmNvbnN0IG1lcmdlPSh4YmFnRW50cmllcyx5YmFnRW50cmllcyk9Pntcbi8qIFRoaXMgZnVsbE9yZGVyIGNvbnRhaW5zIGhpc3RvcnkgZGVwZW5kZW50IHN0YXRlLiBJdCBpcyBzcGVjaWZpYyovXG4vKiB0byB0aGlzIG9uZSBgbWVyZ2VgIGNhbGwgYW5kIGRvZXMgbm90IHN1cnZpdmUgaXQuKi9cbmNvbnN0IGZ1bGxDb21wYXJlPW1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KCkuYW50aUNvbXBhcmF0b3I7XG5cbmNvbnN0IHhzPWJhZ1dpbmRvd1Jlc29ydCh4YmFnRW50cmllcyxjb21wYXJlQW50aVJhbmssZnVsbENvbXBhcmUpO1xuY29uc3QgeXM9YmFnV2luZG93UmVzb3J0KHliYWdFbnRyaWVzLGNvbXBhcmVBbnRpUmFuayxmdWxsQ29tcGFyZSk7XG5yZXR1cm4gaGFyZGVuKHtcbltTeW1ib2wuaXRlcmF0b3JdOigpPT57XG4vKiBUaGVzZSBzaXggYGxldGAgdmFyaWFibGVzIGFyZSBidWZmZXJpbmcgb25lIGFoZWFkIGZyb20gdGhlIHVuZGVybHlpbmcqL1xuLyogaXRlcmF0b3JzLiBFYWNoIGl0ZXJhdGlvbiByZXBvcnRzIG9uZSBvciB0aGUgb3RoZXIgb3IgYm90aCwgYW5kKi9cbi8qIHRoZW4gcmVmaWxscyB0aGUgYnVmZmVycyBvZiB0aG9zZSBpdCBhZHZhbmNlZC4qL1xuLyoqIEB0eXBlIHtUfSAqL1xubGV0IHg7XG5sZXQgeGM7XG5sZXQgeERvbmU7XG4vKiogQHR5cGUge1R9ICovXG5sZXQgeTtcbmxldCB5YztcbmxldCB5RG9uZTtcblxuY29uc3QgeGk9eHNbU3ltYm9sLml0ZXJhdG9yXSgpO1xuY29uc3QgbmV4dFg9KCk9PntcbiF4RG9uZXx8RmFpbCBgSW50ZXJuYWw6IG5leHRYIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uY2UgZG9uZWA7XG4oe1xuZG9uZTp4RG9uZSxcbnZhbHVlOlt4LHhjXX09XG54aS5uZXh0KCkpO1xuIH07XG5uZXh0WCgpO1xuXG5jb25zdCB5aT15c1tTeW1ib2wuaXRlcmF0b3JdKCk7XG5jb25zdCBuZXh0WT0oKT0+e1xuIXlEb25lfHxGYWlsIGBJbnRlcm5hbDogbmV4dFkgc2hvdWxkIG5vdCBiZSBjYWxsZWQgb25jZSBkb25lYDtcbih7XG5kb25lOnlEb25lLFxudmFsdWU6W3kseWNdfT1cbnlpLm5leHQoKSk7XG4gfTtcbm5leHRZKCk7XG5cbnJldHVybiBoYXJkZW4oe1xubmV4dDooKT0+e1xuLyoqIEB0eXBlIHtib29sZWFufSAqL1xubGV0IGRvbmU9ZmFsc2U7XG4vKiogQHR5cGUge1tULGJpZ2ludCxiaWdpbnRdfSAqL1xubGV0IHZhbHVlO1xuaWYoeERvbmUmJnlEb25lKXtcbmRvbmU9dHJ1ZTtcbi8qIEB0cy1leHBlY3QtZXJyb3IgQmVjYXVzZSB0aGUgdGVybWluYXRpbmcgdmFsdWUgZG9lcyBub3QgbWF0dGVyKi9cbnZhbHVlPVtudWxsLDBuLDBuXTtcbiB9ZWxzZSBpZih4RG9uZSl7XG4vKiBvbmx5IHlzIGFyZSBsZWZ0Ki9cbnZhbHVlPVt5LDBuLHljXTtcbm5leHRZKCk7XG4gfWVsc2UgaWYoeURvbmUpe1xuLyogb25seSB4cyBhcmUgbGVmdCovXG52YWx1ZT1beCx4Yywwbl07XG5uZXh0WCgpO1xuIH1lbHNle1xuY29uc3QgY29tcD1mdWxsQ29tcGFyZSh4LHkpO1xuaWYoY29tcD09PTApe1xuLyogeCBhbmQgeSBhcmUgZXF1aXZhbGVudCwgc28gcmVwb3J0IGJvdGgqL1xudmFsdWU9W3gseGMseWNdO1xubmV4dFgoKTtcbm5leHRZKCk7XG4gfWVsc2UgaWYoY29tcDwwKXtcbi8qIHggaXMgZWFybGllciwgc28gcmVwb3J0IGl0Ki9cbnZhbHVlPVt4LHhjLDBuXTtcbm5leHRYKCk7XG4gfWVsc2V7XG4vKiB5IGlzIGVhcmxpZXIsIHNvIHJlcG9ydCBpdCovXG5jb21wPjB8fEZhaWwgYEludGVybmFsOiBVbmV4cGVjdGVkIGNvbXAgJHtxKGNvbXApfWA7XG52YWx1ZT1beSwwbix5Y107XG5uZXh0WSgpO1xuIH1cbiB9XG5yZXR1cm4gaGFyZGVuKHtkb25lLHZhbHVlfSk7XG4gfX0pO1xuXG4gfX0pO1xuXG4gfTtcbmhhcmRlbihtZXJnZSk7XG5cbi8qIFdlIHNob3VsZCBiZSBhYmxlIHRvIHVzZSB0aGlzIGZvciBpdGVySXNTdXBlcnNldCBhcyB3ZWxsLiovXG4vKiBUaGUgZ2VuZXJhbGl6YXRpb24gaXMgZnJlZS4qL1xuY29uc3QgYmFnSXRlcklzU3VwZXJiYWc9KHh5aSk9PntcbmZvcihjb25zdFtfbSx4Yyx5Y11vZiB4eWkpe1xuaWYoeGM8eWMpe1xuLyogc29tZXRoaW5nIGluIHkgaXMgbm90IGluIHgsIHNvIHggaXMgbm90IGEgc3VwZXJiYWcgb2YgeSovXG5yZXR1cm4gZmFsc2U7XG4gfVxuIH1cbnJldHVybiB0cnVlO1xuIH07XG5cbi8qIFdlIHNob3VsZCBiZSBhYmxlIHRvIHVzZSB0aGlzIGZvciBpdGVySXNEaXNqb2ludCBhcyB3ZWxsLiovXG4vKiBUaGUgY29kZSBpcyBpZGVudGljYWwuKi9cbmNvbnN0IGJhZ0l0ZXJJc0Rpc2pvaW50PSh4eWkpPT57XG5mb3IoY29uc3RbX20seGMseWNdb2YgeHlpKXtcbmlmKHhjPj0xbiYmeWM+PTFuKXtcbi8qIFNvbWV0aGluZyBpbiBib3RoLCBzbyBub3QgZGlzam9pbnQqL1xucmV0dXJuIGZhbHNlO1xuIH1cbiB9XG5yZXR1cm4gdHJ1ZTtcbiB9O1xuXG4vKiBXZSBzaG91bGQgYmUgYWJsZSB0byB1c2UgdGhpcyBmb3IgaXRlckNvbXBhcmUgYXMgd2VsbC4qL1xuLyogVGhlIGdlbmVyYWxpemF0aW9uIGlzIGZyZWUuKi9cbmNvbnN0IGJhZ0l0ZXJDb21wYXJlPSh4eWkpPT57XG5sZXQgbG9uZVk9ZmFsc2U7XG5sZXQgbG9uZVg9ZmFsc2U7XG5mb3IoY29uc3RbX20seGMseWNdb2YgeHlpKXtcbmlmKHhjPHljKXtcbi8qIHNvbWV0aGluZyBpbiB5IGlzIG5vdCBpbiB4LCBzbyB4IGlzIG5vdCBhIHN1cGVyYmFnIG9mIHkqL1xubG9uZVk9dHJ1ZTtcbiB9XG5pZih4Yz55Yyl7XG4vKiBzb21ldGhpbmcgaW4geCBpcyBub3QgaW4geSwgc28geSBpcyBub3QgYSBzdXBlcmJhZyBvZiB4Ki9cbmxvbmVYPXRydWU7XG4gfVxuaWYobG9uZVgmJmxvbmVZKXtcbnJldHVybiBOYU47XG4gfVxuIH1cbmlmKGxvbmVYKXtcbnJldHVybiAxO1xuIH1lbHNlIGlmKGxvbmVZKXtcbnJldHVybi0xO1xuIH1lbHNle1xuIWxvbmVYJiYhbG9uZVl8fFxuRmFpbCBgSW50ZXJuYWw6IFVuZXhwZWN0ZWQgbG9uZSBwYWlyICR7cShbbG9uZVgsbG9uZVldKX1gO1xucmV0dXJuIDA7XG4gfVxuIH07XG5cbmNvbnN0IGJhZ0l0ZXJVbmlvbj0oeHlpKT0+e1xuY29uc3QgcmVzdWx0PVtdO1xuZm9yKGNvbnN0W20seGMseWNdb2YgeHlpKXtcbnJlc3VsdC5wdXNoKFttLHhjK3ljXSk7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG5jb25zdCBiYWdJdGVySW50ZXJzZWN0aW9uPSh4eWkpPT57XG5jb25zdCByZXN1bHQ9W107XG5mb3IoY29uc3RbbSx4Yyx5Y11vZiB4eWkpe1xuY29uc3QgbWM9eGM8PXljP3hjOnljO1xucmVzdWx0LnB1c2goW20sbWNdKTtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbmNvbnN0IGJhZ0l0ZXJEaXNqb2ludFN1YnRyYWN0PSh4eWkpPT57XG5jb25zdCByZXN1bHQ9W107XG5mb3IoY29uc3RbbSx4Yyx5Y11vZiB4eWkpe1xuY29uc3QgbWM9eGMteWM7XG5tYz49MG58fEZhaWwgYHJpZ2h0IGVsZW1lbnQgJHttfSB3YXMgbm90IGluIGxlZnRgO1xuaWYobWM+PTFuKXtcbi8qIHRoZSB4IHdhcyBub3QgaW4geSovXG5yZXN1bHQucHVzaChbbSxtY10pO1xuIH1cbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbmNvbnN0IG1lcmdlaWZ5PShiYWdJdGVyT3ApPT4oeGJhZ0VudHJpZXMseWJhZ0VudHJpZXMpPT5cbmJhZ0l0ZXJPcChtZXJnZSh4YmFnRW50cmllcyx5YmFnRW50cmllcykpO1xuXG5jb25zdCBiYWdFbnRyaWVzSXNTdXBlcmJhZz1tZXJnZWlmeShiYWdJdGVySXNTdXBlcmJhZyk7XG5jb25zdCBiYWdFbnRyaWVzSXNEaXNqb2ludD1tZXJnZWlmeShiYWdJdGVySXNEaXNqb2ludCk7XG5jb25zdCBiYWdFbnRyaWVzQ29tcGFyZT1tZXJnZWlmeShiYWdJdGVyQ29tcGFyZSk7XG5jb25zdCBiYWdFbnRyaWVzVW5pb249bWVyZ2VpZnkoYmFnSXRlclVuaW9uKTtcbmNvbnN0IGJhZ0VudHJpZXNJbnRlcnNlY3Rpb249bWVyZ2VpZnkoYmFnSXRlckludGVyc2VjdGlvbik7XG5jb25zdCBiYWdFbnRyaWVzRGlzam9pbnRTdWJ0cmFjdD1tZXJnZWlmeShiYWdJdGVyRGlzam9pbnRTdWJ0cmFjdCk7XG5cbmNvbnN0IHJhd0JhZ2lmeT0oYmFnRW50cmllc09wKT0+KHhiYWcseWJhZyk9PlxuYmFnRW50cmllc09wKHhiYWcucGF5bG9hZCx5YmFnLnBheWxvYWQpO1xuXG5jb25zdCBiYWdpZnk9KGJhZ0VudHJpZXNPcCk9Pih4YmFnLHliYWcpPT5cbm1ha2VCYWdPZkVudHJpZXMoYmFnRW50cmllc09wKHhiYWcucGF5bG9hZCx5YmFnLnBheWxvYWQpKTtcblxuY29uc3QgICAgICAgIGJhZ0lzU3VwZXJiYWc9cmF3QmFnaWZ5KGJhZ0VudHJpZXNJc1N1cGVyYmFnKTskaOKAjV9vbmNlLmJhZ0lzU3VwZXJiYWcoYmFnSXNTdXBlcmJhZyk7XG5jb25zdCAgICAgICAgYmFnSXNEaXNqb2ludD1yYXdCYWdpZnkoYmFnRW50cmllc0lzRGlzam9pbnQpOyRo4oCNX29uY2UuYmFnSXNEaXNqb2ludChiYWdJc0Rpc2pvaW50KTtcbmNvbnN0ICAgICAgICBiYWdDb21wYXJlPXJhd0JhZ2lmeShiYWdFbnRyaWVzQ29tcGFyZSk7JGjigI1fb25jZS5iYWdDb21wYXJlKGJhZ0NvbXBhcmUpO1xuY29uc3QgICAgICAgIGJhZ1VuaW9uPWJhZ2lmeShiYWdFbnRyaWVzVW5pb24pOyRo4oCNX29uY2UuYmFnVW5pb24oYmFnVW5pb24pO1xuY29uc3QgICAgICAgIGJhZ0ludGVyc2VjdGlvbj1iYWdpZnkoYmFnRW50cmllc0ludGVyc2VjdGlvbik7JGjigI1fb25jZS5iYWdJbnRlcnNlY3Rpb24oYmFnSW50ZXJzZWN0aW9uKTtcbmNvbnN0ICAgICAgICBiYWdEaXNqb2ludFN1YnRyYWN0PWJhZ2lmeShiYWdFbnRyaWVzRGlzam9pbnRTdWJ0cmFjdCk7JGjigI1fb25jZS5iYWdEaXNqb2ludFN1YnRyYWN0KGJhZ0Rpc2pvaW50U3VidHJhY3QpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImJhZ0lzU3VwZXJiYWciOlsiYmFnSXNTdXBlcmJhZyJdLCJiYWdJc0Rpc2pvaW50IjpbImJhZ0lzRGlzam9pbnQiXSwiYmFnQ29tcGFyZSI6WyJiYWdDb21wYXJlIl0sImJhZ1VuaW9uIjpbImJhZ1VuaW9uIl0sImJhZ0ludGVyc2VjdGlvbiI6WyJiYWdJbnRlcnNlY3Rpb24iXSwiYmFnRGlzam9pbnRTdWJ0cmFjdCI6WyJiYWdEaXNqb2ludFN1YnRyYWN0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJTK3autJQAArSUAADQAAABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMva2V5cy9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzeyJpbXBvcnRzIjpbIi4uL3BhdHRlcm5zL3JhbmtPcmRlci5qcyIsIi4vY29weVNldC5qcyJdLCJleHBvcnRzIjpbImVsZW1lbnRzQ29tcGFyZSIsImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCIsImVsZW1lbnRzRGlzam9pbnRVbmlvbiIsImVsZW1lbnRzSW50ZXJzZWN0aW9uIiwiZWxlbWVudHNJc0Rpc2pvaW50IiwiZWxlbWVudHNJc1N1cGVyc2V0IiwiZWxlbWVudHNVbmlvbiIsInNldENvbXBhcmUiLCJzZXREaXNqb2ludFN1YnRyYWN0Iiwic2V0RGlzam9pbnRVbmlvbiIsInNldEludGVyc2VjdGlvbiIsInNldElzRGlzam9pbnQiLCJzZXRJc1N1cGVyc2V0Iiwic2V0VW5pb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0UmFua1NvcnRlZCxjb21wYXJlQW50aVJhbmssbWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQsc29ydEJ5UmFuayxhc3NlcnROb0R1cGxpY2F0ZXMsbWFrZVNldE9mRWxlbWVudHM7JGjigI1faW1wb3J0cyhbW1wiLi4vcGF0dGVybnMvcmFua09yZGVyLmpzXCIsIFtbXCJhc3NlcnRSYW5rU29ydGVkXCIsIFskaOKAjV9hID0+IChhc3NlcnRSYW5rU29ydGVkID0gJGjigI1fYSldXSxbXCJjb21wYXJlQW50aVJhbmtcIiwgWyRo4oCNX2EgPT4gKGNvbXBhcmVBbnRpUmFuayA9ICRo4oCNX2EpXV0sW1wibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0ID0gJGjigI1fYSldXSxbXCJzb3J0QnlSYW5rXCIsIFskaOKAjV9hID0+IChzb3J0QnlSYW5rID0gJGjigI1fYSldXV1dLFtcIi4vY29weVNldC5qc1wiLCBbW1wiYXNzZXJ0Tm9EdXBsaWNhdGVzXCIsIFskaOKAjV9hID0+IChhc3NlcnROb0R1cGxpY2F0ZXMgPSAkaOKAjV9hKV1dLFtcIm1ha2VTZXRPZkVsZW1lbnRzXCIsIFskaOKAjV9hID0+IChtYWtlU2V0T2ZFbGVtZW50cyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5jb25zdHtxdW90ZTpxLEZhaWx9PWFzc2VydDtcblxuLyoqXG4gKiBBc3NlcnRzIHRoYXQgYGVsZW1lbnRzYCBpcyBhbHJlYWR5IHJhbmsgc29ydGVkIGJ5IGByYW5rQ29tcGFyZWAsIHdoZXJlIHRoZXJlXG4gKiBtYXkgYmUgY29udGlndW91cyByZWdpb25zIG9mIGVsZW1lbnRzIHRpZWQgZm9yIHRoZSBzYW1lIHJhbmsuXG4gKiBSZXR1cm5zIGFuIGl0ZXJhYmxlIHRoYXQgd2lsbCBlbnVtZXJhdGUgYWxsIHRoZSBlbGVtZW50cyBpbiBvcmRlclxuICogYWNjb3JkaW5nIHRvIGBmdWxsT3JkZXJgLCB3aGljaCBzaG91bGQgZGlmZmVyIGZyb20gYHJhbmtPcmRlcmAgb25seVxuICogYnkgYmVpbmcgbW9yZSBwcmVjaXNlLlxuICpcbiAqIFRoaXMgc2hvdWxkIGJlIGVxdWl2YWxlbnQgdG8gcmVzb3J0aW5nIHRoZSBlbnRpcmUgYGVsZW1lbnRzYCBhcnJheSBhY2NvcmRpbmdcbiAqICB0byBgZnVsbE9yZGVyYC4gSG93ZXZlciwgaXQgb3B0aW1pemVzIGZvciB0aGUgY2FzZSB3aGVyZSB0aGVzZSBjb250aWd1b3VzXG4gKiBydW5zIHRoYXQgbmVlZCB0byBiZSByZXNvcnRlZCBhcmUgZWl0aGVyIGFic2VudCBvciBzbWFsbC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUW119IGVsZW1lbnRzXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSByYW5rQ29tcGFyZVxuICogQHBhcmFtIHtGdWxsQ29tcGFyZX0gZnVsbENvbXBhcmVcbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxUPn1cbiAqL1xuY29uc3Qgd2luZG93UmVzb3J0PShlbGVtZW50cyxyYW5rQ29tcGFyZSxmdWxsQ29tcGFyZSk9PntcbmFzc2VydFJhbmtTb3J0ZWQoZWxlbWVudHMscmFua0NvbXBhcmUpO1xuY29uc3R7bGVuZ3RofT1lbGVtZW50cztcbmxldCBpPTA7XG5sZXQgb3B0SW5uZXJJdGVyYXRvcjtcbnJldHVybiBoYXJkZW4oe1xuW1N5bWJvbC5pdGVyYXRvcl06KCk9PlxuaGFyZGVuKHtcbm5leHQ6KCk9PntcbmlmKG9wdElubmVySXRlcmF0b3Ipe1xuY29uc3QgcmVzdWx0PW9wdElubmVySXRlcmF0b3IubmV4dCgpO1xuaWYocmVzdWx0LmRvbmUpe1xub3B0SW5uZXJJdGVyYXRvcj11bmRlZmluZWQ7XG4vKiBmYWxsIHRocm91Z2gqL1xuIH1lbHNle1xucmV0dXJuIHJlc3VsdDtcbiB9XG4gfVxuaWYoaTxsZW5ndGgpe1xuY29uc3QgdmFsdWU9ZWxlbWVudHNbaV07XG5sZXQgaj1pKzE7XG53aGlsZShqPGxlbmd0aCYmcmFua0NvbXBhcmUodmFsdWUsZWxlbWVudHNbal0pPT09MCl7XG5qKz0xO1xuIH1cbmlmKGo9PT1pKzEpe1xuaT1qO1xucmV0dXJuIGhhcmRlbih7ZG9uZTpmYWxzZSx2YWx1ZX0pO1xuIH1cbmNvbnN0IHNpbWlsYXJSdW49ZWxlbWVudHMuc2xpY2UoaSxqKTtcbmk9ajtcbmNvbnN0IHJlc29ydGVkPXNvcnRCeVJhbmsoc2ltaWxhclJ1bixmdWxsQ29tcGFyZSk7XG4vKiBQcm92aWRpbmcgdGhlIHNhbWUgYGZ1bGxDb21wYXJlYCBzaG91bGQgY2F1c2UgYSBtZW1vIGhpdCovXG4vKiB3aXRoaW4gYGFzc2VydE5vRHVwbGljYXRlc2AgZW5hYmxpbmcgaXQgdG8gYXZvaWQgYSovXG4vKiByZWR1bmRhbnQgcmVzb3J0aW5nLiovXG5hc3NlcnROb0R1cGxpY2F0ZXMocmVzb3J0ZWQsZnVsbENvbXBhcmUpO1xuLyogVGhpcyBpcyB0aGUgcmF3IEpTIGFycmF5IGl0ZXJhdG9yIHdob3NlIGAubmV4dCgpYCBtZXRob2QqL1xuLyogZG9lcyBub3QgaGFyZGVuIHRoZSBJdGVyYXRvclJlc3VsdCwgaW4gdmlvbGF0aW9uIG9mIG91ciovXG4vKiBjb252ZW50aW9ucy4gRml4aW5nIHRoaXMgaXMgZXhwZW5zaXZlIGFuZCBJJ20gY29uZmlkZW50IHRoZSovXG4vKiB1bmZyb3plbiB2YWx1ZSBkb2VzIG5vdCBlc2NhcGUgdGhpcyBmaWxlLCBzbyBJJ20gbGVhdmluZyB0aGlzKi9cbi8qIGFzIGlzLiovXG5vcHRJbm5lckl0ZXJhdG9yPXJlc29ydGVkW1N5bWJvbC5pdGVyYXRvcl0oKTtcbnJldHVybiBvcHRJbm5lckl0ZXJhdG9yLm5leHQoKTtcbiB9ZWxzZXtcbnJldHVybiBoYXJkZW4oe2RvbmU6dHJ1ZSx2YWx1ZTpudWxsfSk7XG4gfVxuIH19KX0pO1xuXG5cbiB9O1xuXG4vKipcbiAqIFJldHVybnMgYW4gaXRlcmFibGUgd2hvc2UgaXRlcmF0aW9uIHJlc3VsdHMgYXJlIFtrZXksIHhDb3VudCwgeUNvdW50XSB0dXBsZXNcbiAqIHJlcHJlc2VudGluZyB0aGUgbmV4dCBrZXkgaW4gdGhlIGxvY2FsIGZ1bGwgb3JkZXIsIGFzIHdlbGwgYXMgaG93IG1hbnlcbiAqIHRpbWVzIGl0IG9jY3VycmVkIGluIHRoZSB4IGlucHV0IGl0ZXJhdG9yIGFuZCB0aGUgeSBpbnB1dCBpdGVyYXRvci5cbiAqXG4gKiBGb3Igc2V0cywgdGhlc2UgY291bnRzIGFyZSBhbHdheXMgMCBvciAxLCBidXQgdGhpcyByZXByZXNlbnRhdGlvblxuICogZ2VuZXJhbGl6ZXMgbmljZWx5IGZvciBiYWdzLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1RbXX0geGVsZW1lbnRzXG4gKiBAcGFyYW0ge1RbXX0geWVsZW1lbnRzXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8W1QsYmlnaW50LGJpZ2ludF0+fVxuICovXG5jb25zdCBtZXJnZT0oeGVsZW1lbnRzLHllbGVtZW50cyk9Pntcbi8qIFRoaXMgZnVsbE9yZGVyIGNvbnRhaW5zIGhpc3RvcnkgZGVwZW5kZW50IHN0YXRlLiBJdCBpcyBzcGVjaWZpYyovXG4vKiB0byB0aGlzIG9uZSBgbWVyZ2VgIGNhbGwgYW5kIGRvZXMgbm90IHN1cnZpdmUgaXQuKi9cbmNvbnN0IGZ1bGxDb21wYXJlPW1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KCkuYW50aUNvbXBhcmF0b3I7XG5cbmNvbnN0IHhzPXdpbmRvd1Jlc29ydCh4ZWxlbWVudHMsY29tcGFyZUFudGlSYW5rLGZ1bGxDb21wYXJlKTtcbmNvbnN0IHlzPXdpbmRvd1Jlc29ydCh5ZWxlbWVudHMsY29tcGFyZUFudGlSYW5rLGZ1bGxDb21wYXJlKTtcbnJldHVybiBoYXJkZW4oe1xuW1N5bWJvbC5pdGVyYXRvcl06KCk9Pntcbi8qIFRoZXNlIGZvdXIgYGxldGAgdmFyaWFibGVzIGFyZSBidWZmZXJpbmcgb25lIGFoZWFkIGZyb20gdGhlIHVuZGVybHlpbmcqL1xuLyogaXRlcmF0b3JzLiBFYWNoIGl0ZXJhdGlvbiByZXBvcnRzIG9uZSBvciB0aGUgb3RoZXIgb3IgYm90aCwgYW5kKi9cbi8qIHRoZW4gcmVmaWxscyB0aGUgYnVmZmVycyBvZiB0aG9zZSBpdCBhZHZhbmNlZC4qL1xuLyoqIEB0eXBlIHtUfSAqL1xubGV0IHg7XG5sZXQgeERvbmU7XG4vKiogQHR5cGUge1R9ICovXG5sZXQgeTtcbmxldCB5RG9uZTtcblxuY29uc3QgeGk9eHNbU3ltYm9sLml0ZXJhdG9yXSgpO1xuY29uc3QgbmV4dFg9KCk9PntcbiF4RG9uZXx8RmFpbCBgSW50ZXJuYWw6IG5leHRYIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uY2UgZG9uZWA7XG4oe2RvbmU6eERvbmUsdmFsdWU6eH09eGkubmV4dCgpKTtcbiB9O1xubmV4dFgoKTtcblxuY29uc3QgeWk9eXNbU3ltYm9sLml0ZXJhdG9yXSgpO1xuY29uc3QgbmV4dFk9KCk9PntcbiF5RG9uZXx8RmFpbCBgSW50ZXJuYWw6IG5leHRZIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uY2UgZG9uZWA7XG4oe2RvbmU6eURvbmUsdmFsdWU6eX09eWkubmV4dCgpKTtcbiB9O1xubmV4dFkoKTtcblxucmV0dXJuIGhhcmRlbih7XG5uZXh0OigpPT57XG4vKiogQHR5cGUge2Jvb2xlYW59ICovXG5sZXQgZG9uZT1mYWxzZTtcbi8qKiBAdHlwZSB7W1QsYmlnaW50LGJpZ2ludF19ICovXG5sZXQgdmFsdWU7XG5pZih4RG9uZSYmeURvbmUpe1xuZG9uZT10cnVlO1xuLyogQHRzLWV4cGVjdC1lcnJvciBCZWNhdXNlIHRoZSB0ZXJtaW5hdGluZyB2YWx1ZSBkb2VzIG5vdCBtYXR0ZXIqL1xudmFsdWU9W251bGwsMG4sMG5dO1xuIH1lbHNlIGlmKHhEb25lKXtcbi8qIG9ubHkgeXMgYXJlIGxlZnQqL1xudmFsdWU9W3ksMG4sMW5dO1xubmV4dFkoKTtcbiB9ZWxzZSBpZih5RG9uZSl7XG4vKiBvbmx5IHhzIGFyZSBsZWZ0Ki9cbnZhbHVlPVt4LDFuLDBuXTtcbm5leHRYKCk7XG4gfWVsc2V7XG5jb25zdCBjb21wPWZ1bGxDb21wYXJlKHgseSk7XG5pZihjb21wPT09MCl7XG4vKiB4IGFuZCB5IGFyZSBlcXVpdmFsZW50LCBzbyByZXBvcnQgYm90aCovXG52YWx1ZT1beCwxbiwxbl07XG5uZXh0WCgpO1xubmV4dFkoKTtcbiB9ZWxzZSBpZihjb21wPDApe1xuLyogeCBpcyBlYXJsaWVyLCBzbyByZXBvcnQgaXQqL1xudmFsdWU9W3gsMW4sMG5dO1xubmV4dFgoKTtcbiB9ZWxzZXtcbi8qIHkgaXMgZWFybGllciwgc28gcmVwb3J0IGl0Ki9cbmNvbXA+MHx8RmFpbCBgSW50ZXJuYWw6IFVuZXhwZWN0ZWQgY29tcCAke3EoY29tcCl9YDtcbnZhbHVlPVt5LDBuLDFuXTtcbm5leHRZKCk7XG4gfVxuIH1cbnJldHVybiBoYXJkZW4oe2RvbmUsdmFsdWV9KTtcbiB9fSk7XG5cbiB9fSk7XG5cbiB9O1xuaGFyZGVuKG1lcmdlKTtcblxuY29uc3QgaXRlcklzU3VwZXJzZXQ9KHh5aSk9PntcbmZvcihjb25zdFtfbSx4YyxfeWNdb2YgeHlpKXtcbmlmKHhjPT09MG4pe1xuLyogc29tZXRoaW5nIGluIHkgaXMgbm90IGluIHgsIHNvIHggaXMgbm90IGEgc3VwZXJzZXQgb2YgeSovXG5yZXR1cm4gZmFsc2U7XG4gfVxuIH1cbnJldHVybiB0cnVlO1xuIH07XG5cbmNvbnN0IGl0ZXJJc0Rpc2pvaW50PSh4eWkpPT57XG5mb3IoY29uc3RbX20seGMseWNdb2YgeHlpKXtcbmlmKHhjPj0xbiYmeWM+PTFuKXtcbi8qIFNvbWV0aGluZyBpbiBib3RoLCBzbyBub3QgZGlzam9pbnQqL1xucmV0dXJuIGZhbHNlO1xuIH1cbiB9XG5yZXR1cm4gdHJ1ZTtcbiB9O1xuXG5jb25zdCBpdGVyQ29tcGFyZT0oeHlpKT0+e1xubGV0IGxvbmVZPWZhbHNlO1xubGV0IGxvbmVYPWZhbHNlO1xuZm9yKGNvbnN0W19tLHhjLHljXW9mIHh5aSl7XG5pZih4Yz09PTBuKXtcbi8qIHNvbWV0aGluZyBpbiB5IGlzIG5vdCBpbiB4LCBzbyB4IGlzIG5vdCBhIHN1cGVyc2V0IG9mIHkqL1xubG9uZVk9dHJ1ZTtcbiB9XG5pZih5Yz09PTBuKXtcbi8qIHNvbWV0aGluZyBpbiB4IGlzIG5vdCBpbiB5LCBzbyB5IGlzIG5vdCBhIHN1cGVyc2V0IG9mIHgqL1xubG9uZVg9dHJ1ZTtcbiB9XG5pZihsb25lWCYmbG9uZVkpe1xucmV0dXJuIE5hTjtcbiB9XG4gfVxuaWYobG9uZVgpe1xucmV0dXJuIDE7XG4gfWVsc2UgaWYobG9uZVkpe1xucmV0dXJuLTE7XG4gfWVsc2V7XG4hbG9uZVgmJiFsb25lWXx8XG5GYWlsIGBJbnRlcm5hbDogVW5leHBlY3RlZCBsb25lIHBhaXIgJHtxKFtsb25lWCxsb25lWV0pfWA7XG5yZXR1cm4gMDtcbiB9XG4gfTtcblxuY29uc3QgaXRlclVuaW9uPSh4eWkpPT57XG5jb25zdCByZXN1bHQ9W107XG5mb3IoY29uc3RbbSx4Yyx5Y11vZiB4eWkpe1xuaWYoeGM+PTBuKXtcbnJlc3VsdC5wdXNoKG0pO1xuIH1lbHNle1xueWM+PTBufHxGYWlsIGBJbnRlcm5hbDogVW5leHBlY3RlZCBjb3VudCAke3EoeWMpfWA7XG4vKiBpZiB4IGFuZCB5IHdlcmUgYm90aCByZWFkeSwgdGhlbiB0aGV5IHdlcmUgZXF1aXZhbGVudCBhbmQqL1xuLyogYWJvdmUgY2xhdXNlIGFscmVhZHkgdG9vayBjYXJlIG9mIGl0LiBPdGhlcndpc2UgcHVzaCBoZXJlLiovXG5yZXN1bHQucHVzaChtKTtcbiB9XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG5jb25zdCBpdGVyRGlzam9pbnRVbmlvbj0oeHlpKT0+e1xuY29uc3QgcmVzdWx0PVtdO1xuZm9yKGNvbnN0W20seGMseWNdb2YgeHlpKXtcbnhjPT09MG58fHljPT09MG58fEZhaWwgYFNldHMgbXVzdCBub3QgaGF2ZSBjb21tb24gZWxlbWVudHM6ICR7bX1gO1xuaWYoeGM+PTFuKXtcbnJlc3VsdC5wdXNoKG0pO1xuIH1lbHNle1xueWM+PTFufHxGYWlsIGBJbnRlcm5hbDogVW5leHBlY3RlZCBjb3VudCAke3EoeWMpfWA7XG5yZXN1bHQucHVzaChtKTtcbiB9XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG5jb25zdCBpdGVySW50ZXJzZWN0aW9uPSh4eWkpPT57XG5jb25zdCByZXN1bHQ9W107XG5mb3IoY29uc3RbbSx4Yyx5Y11vZiB4eWkpe1xuaWYoeGM+PTFuJiZ5Yz49MW4pe1xuLyogSWYgdGhleSBhcmUgYm90aCBwcmVzZW50LCB0aGVuIHRoZXkgd2VyZSBlcXVpdmFsZW50Ki9cbnJlc3VsdC5wdXNoKG0pO1xuIH1cbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbmNvbnN0IGl0ZXJEaXNqb2ludFN1YnRyYWN0PSh4eWkpPT57XG5jb25zdCByZXN1bHQ9W107XG5mb3IoY29uc3RbbSx4Yyx5Y11vZiB4eWkpe1xueGM+PTFufHxGYWlsIGByaWdodCBlbGVtZW50ICR7bX0gd2FzIG5vdCBpbiBsZWZ0YDtcbmlmKHljPT09MG4pe1xuLyogdGhlIHggd2FzIG5vdCBpbiB5Ki9cbnJlc3VsdC5wdXNoKG0pO1xuIH1cbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbmNvbnN0IG1lcmdlaWZ5PShpdGVyT3ApPT4oeGVsZW1lbnRzLHllbGVtZW50cyk9PlxuaXRlck9wKG1lcmdlKHhlbGVtZW50cyx5ZWxlbWVudHMpKTtcblxuY29uc3QgICAgICAgIGVsZW1lbnRzSXNTdXBlcnNldD1tZXJnZWlmeShpdGVySXNTdXBlcnNldCk7JGjigI1fb25jZS5lbGVtZW50c0lzU3VwZXJzZXQoZWxlbWVudHNJc1N1cGVyc2V0KTtcbmNvbnN0ICAgICAgICBlbGVtZW50c0lzRGlzam9pbnQ9bWVyZ2VpZnkoaXRlcklzRGlzam9pbnQpOyRo4oCNX29uY2UuZWxlbWVudHNJc0Rpc2pvaW50KGVsZW1lbnRzSXNEaXNqb2ludCk7XG5jb25zdCAgICAgICAgZWxlbWVudHNDb21wYXJlPW1lcmdlaWZ5KGl0ZXJDb21wYXJlKTskaOKAjV9vbmNlLmVsZW1lbnRzQ29tcGFyZShlbGVtZW50c0NvbXBhcmUpO1xuY29uc3QgICAgICAgIGVsZW1lbnRzVW5pb249bWVyZ2VpZnkoaXRlclVuaW9uKTskaOKAjV9vbmNlLmVsZW1lbnRzVW5pb24oZWxlbWVudHNVbmlvbik7XG5jb25zdCAgICAgICAgZWxlbWVudHNEaXNqb2ludFVuaW9uPW1lcmdlaWZ5KGl0ZXJEaXNqb2ludFVuaW9uKTskaOKAjV9vbmNlLmVsZW1lbnRzRGlzam9pbnRVbmlvbihlbGVtZW50c0Rpc2pvaW50VW5pb24pO1xuY29uc3QgICAgICAgIGVsZW1lbnRzSW50ZXJzZWN0aW9uPW1lcmdlaWZ5KGl0ZXJJbnRlcnNlY3Rpb24pOyRo4oCNX29uY2UuZWxlbWVudHNJbnRlcnNlY3Rpb24oZWxlbWVudHNJbnRlcnNlY3Rpb24pO1xuY29uc3QgICAgICAgIGVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdD1tZXJnZWlmeShpdGVyRGlzam9pbnRTdWJ0cmFjdCk7JGjigI1fb25jZS5lbGVtZW50c0Rpc2pvaW50U3VidHJhY3QoZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0KTtcblxuY29uc3QgcmF3U2V0aWZ5PShlbGVtZW50c09wKT0+KHhzZXQseXNldCk9PlxuZWxlbWVudHNPcCh4c2V0LnBheWxvYWQseXNldC5wYXlsb2FkKTtcblxuY29uc3Qgc2V0aWZ5PShlbGVtZW50c09wKT0+KHhzZXQseXNldCk9PlxubWFrZVNldE9mRWxlbWVudHMoZWxlbWVudHNPcCh4c2V0LnBheWxvYWQseXNldC5wYXlsb2FkKSk7XG5cbmNvbnN0ICAgICAgICBzZXRJc1N1cGVyc2V0PXJhd1NldGlmeShlbGVtZW50c0lzU3VwZXJzZXQpOyRo4oCNX29uY2Uuc2V0SXNTdXBlcnNldChzZXRJc1N1cGVyc2V0KTtcbmNvbnN0ICAgICAgICBzZXRJc0Rpc2pvaW50PXJhd1NldGlmeShlbGVtZW50c0lzRGlzam9pbnQpOyRo4oCNX29uY2Uuc2V0SXNEaXNqb2ludChzZXRJc0Rpc2pvaW50KTtcbmNvbnN0ICAgICAgICBzZXRDb21wYXJlPXJhd1NldGlmeShlbGVtZW50c0NvbXBhcmUpOyRo4oCNX29uY2Uuc2V0Q29tcGFyZShzZXRDb21wYXJlKTtcbmNvbnN0ICAgICAgICBzZXRVbmlvbj1zZXRpZnkoZWxlbWVudHNVbmlvbik7JGjigI1fb25jZS5zZXRVbmlvbihzZXRVbmlvbik7XG5jb25zdCAgICAgICAgc2V0RGlzam9pbnRVbmlvbj1zZXRpZnkoZWxlbWVudHNEaXNqb2ludFVuaW9uKTskaOKAjV9vbmNlLnNldERpc2pvaW50VW5pb24oc2V0RGlzam9pbnRVbmlvbik7XG5jb25zdCAgICAgICAgc2V0SW50ZXJzZWN0aW9uPXNldGlmeShlbGVtZW50c0ludGVyc2VjdGlvbik7JGjigI1fb25jZS5zZXRJbnRlcnNlY3Rpb24oc2V0SW50ZXJzZWN0aW9uKTtcbmNvbnN0ICAgICAgICBzZXREaXNqb2ludFN1YnRyYWN0PXNldGlmeShlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QpOyRo4oCNX29uY2Uuc2V0RGlzam9pbnRTdWJ0cmFjdChzZXREaXNqb2ludFN1YnRyYWN0KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJlbGVtZW50c0lzU3VwZXJzZXQiOlsiZWxlbWVudHNJc1N1cGVyc2V0Il0sImVsZW1lbnRzSXNEaXNqb2ludCI6WyJlbGVtZW50c0lzRGlzam9pbnQiXSwiZWxlbWVudHNDb21wYXJlIjpbImVsZW1lbnRzQ29tcGFyZSJdLCJlbGVtZW50c1VuaW9uIjpbImVsZW1lbnRzVW5pb24iXSwiZWxlbWVudHNEaXNqb2ludFVuaW9uIjpbImVsZW1lbnRzRGlzam9pbnRVbmlvbiJdLCJlbGVtZW50c0ludGVyc2VjdGlvbiI6WyJlbGVtZW50c0ludGVyc2VjdGlvbiJdLCJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QiOlsiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0Il0sInNldElzU3VwZXJzZXQiOlsic2V0SXNTdXBlcnNldCJdLCJzZXRJc0Rpc2pvaW50IjpbInNldElzRGlzam9pbnQiXSwic2V0Q29tcGFyZSI6WyJzZXRDb21wYXJlIl0sInNldFVuaW9uIjpbInNldFVuaW9uIl0sInNldERpc2pvaW50VW5pb24iOlsic2V0RGlzam9pbnRVbmlvbiJdLCJzZXRJbnRlcnNlY3Rpb24iOlsic2V0SW50ZXJzZWN0aW9uIl0sInNldERpc2pvaW50U3VidHJhY3QiOlsic2V0RGlzam9pbnRTdWJ0cmFjdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADCCfN5CQsAAAkLAAAsAAAAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL2xlZ2FjeS9sZWdhY3lNYXAuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9hc3NlcnQiXSwiZXhwb3J0cyI6WyJtYWtlTGVnYWN5TWFwIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IHEsRmFpbDskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2Fzc2VydFwiLCBbW1wicVwiLCBbJGjigI1fYSA9PiAocSA9ICRo4oCNX2EpXV0sW1wiRmFpbFwiLCBbJGjigI1fYSA9PiAoRmFpbCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG4vKipcbiAqIFRoaXMgbW9kdWxlIGFuZCBpdHMgZnJhdGVybmFsIHNpYmxpbmcgbGVnYWN5V2Vha01hcCBleGlzdCBvbmx5IHRvXG4gKiBlYXNlIGEgdHJhbnNpdGlvbiB0byB0aGUgbW9kZXJuIGBzdG9yZWAgc3lzdGVtLCBhcmUgZGVwcmVjYXRlZCxcbiAqIGFuZCB3aWxsIGV2ZW50dWFsbHkgZGlzYXBwZWFyLiBUaGV5IGFyZSBuZWVkZWQgZm9yIG5vdyB0byBzdXBwb3J0XG4gKiBzb21lIG9mIHRoZSB1c2VzIG9mIHRoZSBvbGQgYmVoYXZpb3IgdGhhdCBhcmUgbm90IGNvbXBhdGlibGUgd2l0aFxuICogdGhlIG5ldy4gVGhlIGNvbnN0cmFpbnQgaW1wb3NlZCBieSB0aGUgbmV3IGlzIHRoYXQgb25seSBwYXNzYWJsZXMgY2FuXG4gKiBiZSB1c2VkIGFzIHZhbHVlcywgYW5kIG9ubHkga2V5cyAocm91Z2hseSwgc3RydWN0dXJlcywgYWthIGNvbXBhcmFibGVzKVxuICogY2FuIGJlIHVzZWQgYXMgdmFsdWVzLlxuICpcbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvcHVsbC8zNTY3XG4gKiBUT0RPIE9uY2UgdGhhdCBQUiBpcyBtZXJnZWQsIGxpbmsgdG8gdGhlIGRvY3VtZW50cyByYXRoZXIgdGhhbiB0aGUgUFJzLlxuICpcbiAqIEVhY2ggb2YgdGhlc2Ugbm9uLWNvbmZvcm1pbmcgdXNlcyBzaG91bGQgYmUgbWFya2VkIHdpdGggYVxuICogYGBganNcbiAqIC8vIExlZ2FjeSBiZWNhdXNlLi4uXG4gKiBgYGBcbiAqIGNvbW1lbnQgZXhwbGFpbmluZyB0aGUgcHJvYmxlbSBpbmhpYml0aW5nIGNvbnZlcnNpb24gdG8gdGhlIG5ld1xuICogc3lzdGVtLiBTb21lIG9mIHRoZXNlIHByb2JsZW1zIGFzIG9mIHRoaXMgd3JpdGluZzpcbiAqICAgICogQSBwcm9taXNlS2l0IHVzZWQgYXMgYSB2YWx1ZSwgZXZlbiB0aG91Z2ggYSBwcm9taXNlS2l0IGlzIG5vdFxuICogICAgICBhIHBhc3NhYmxlLiBTb2x1dGlvbnMgYXJlIHRvIG1ha2UgaXQgYSBwYXNzYWJsZSwgb3IgdG8gY29udmVydFxuICogICAgICB0aGUgY29udGFpbmVyIGJhY2sgdG8gYSBjb252ZW50aW9uYWwgSmF2YVNjcmlwdCBNYXAuXG4gKiAgICAqIEEgbXV0YWJsZSBhcnJheSB1c2VkIGFzIGEgdmFsdWUsIHRoYXQgaXMgc3Vic2VxdWVudGx5IG11dGF0ZWQuXG4gKiAgICAgIEZyZWV6aW5nIHRoZSBhcnJheSB3b3VsZG4ndCB3b3JrIG9mIGNvdXJzZSBiZWNhdXNlIGl0IHdvdWxkIGJyZWFrXG4gKiAgICAgIHRoZSBzdWJzZXF1ZW50IG11dGF0aW9uLiBVc2luZyBhIGZhciBvYmplY3Qgd3JhcHBpbmcgYW4gYXJyYXkgd291bGRcbiAqICAgICAgbGlrZWx5IHdvcmsgZmluZS5cbiAqXG4gKiBAZGVwcmVjYXRlZCBzd2l0Y2ggdG8gU2NhbGFyTWFwIGlmIHBvc3NpYmxlLCBNYXAgb3RoZXJ3aXNlXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAcGFyYW0ge3N0cmluZ30gW3RhZz0na2V5J10gLSB0YWcgZm9yIGRlYnVnZ2luZ1xuICogQHJldHVybnMge0xlZ2FjeU1hcDxLLFY+fVxuICovXG5jb25zdCAgICAgICAgbWFrZUxlZ2FjeU1hcD0odGFnPSdrZXknKT0+e1xuY29uc3QgbT1uZXcgTWFwKCk7XG5jb25zdCBhc3NlcnRLZXlEb2VzTm90RXhpc3Q9KGtleSk9PlxuIW0uaGFzKGtleSl8fEZhaWwgYCR7cSh0YWcpfSBhbHJlYWR5IHJlZ2lzdGVyZWQ6ICR7a2V5fWA7XG5jb25zdCBhc3NlcnRLZXlFeGlzdHM9KGtleSk9PlxubS5oYXMoa2V5KXx8RmFpbCBgJHtxKHRhZyl9IG5vdCBmb3VuZDogJHtrZXl9YDtcbnJldHVybiBoYXJkZW4oe1xuaGFzOihrZXkpPT57XG4vKiBDaGVjayBpZiBhIGtleSBleGlzdHMuIFRoZSBrZXkgY2FuIGJlIGFueSBKYXZhU2NyaXB0IHZhbHVlLCovXG4vKiB0aG91Z2ggdGhlIGFuc3dlciB3aWxsIGFsd2F5cyBiZSBmYWxzZSBmb3Iga2V5cyB0aGF0IGNhbm5vdCBiZSBmb3VuZCovXG4vKiBpbiB0aGlzIG1hcC4qL1xucmV0dXJuIG0uaGFzKGtleSk7XG4gfSxcbmluaXQ6KGtleSx2YWx1ZSk9PntcbmFzc2VydEtleURvZXNOb3RFeGlzdChrZXkpO1xubS5zZXQoa2V5LHZhbHVlKTtcbiB9LFxuZ2V0OihrZXkpPT57XG5hc3NlcnRLZXlFeGlzdHMoa2V5KTtcbnJldHVybiBtLmdldChrZXkpO1xuIH0sXG5zZXQ6KGtleSx2YWx1ZSk9PntcbmFzc2VydEtleUV4aXN0cyhrZXkpO1xubS5zZXQoa2V5LHZhbHVlKTtcbiB9LFxuZGVsZXRlOihrZXkpPT57XG5hc3NlcnRLZXlFeGlzdHMoa2V5KTtcbm0uZGVsZXRlKGtleSk7XG4gfSxcbmtleXM6KCk9Pm0ua2V5cygpLFxudmFsdWVzOigpPT5tLnZhbHVlcygpLFxuZW50cmllczooKT0+bS5lbnRyaWVzKCksXG5nZXRTaXplOigpPT5tLnNpemUsXG5jbGVhcjooKT0+bS5jbGVhcigpfSk7XG5cbiB9OyRo4oCNX29uY2UubWFrZUxlZ2FjeU1hcChtYWtlTGVnYWN5TWFwKTtcbmhhcmRlbihtYWtlTGVnYWN5TWFwKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlTGVnYWN5TWFwIjpbIm1ha2VMZWdhY3lNYXAiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAWsuWBq0GAACtBgAAMAAAAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9sZWdhY3kvbGVnYWN5V2Vha01hcC5qc3siaW1wb3J0cyI6WyIuLi90eXBlcy5qcyIsIkBhZ29yaWMvYXNzZXJ0Il0sImV4cG9ydHMiOlsibWFrZUxlZ2FjeVdlYWtNYXAiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgcSxGYWlsOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvYXNzZXJ0XCIsIFtbXCJxXCIsIFskaOKAjV9hID0+IChxID0gJGjigI1fYSldXSxbXCJGYWlsXCIsIFskaOKAjV9hID0+IChGYWlsID0gJGjigI1fYSldXV1dLFtcIi4uL3R5cGVzLmpzXCIsIFtdXV0pOyAgIFxuXG5cbi8qKlxuICogU2VlIGRvY2NvbW1lbnQgaW4gdGhlIGNsb3NlbHkgcmVsYXRlZCBgbGVnYWN5TWFwLmpzYCBtb2R1bGUuXG4gKlxuICogQGRlcHJlY2F0ZWQgc3dpdGNoIHRvIFNjYWxhcldlYWtNYXAgaWYgcG9zc2libGUsIFdlYWtNYXAgb3RoZXJ3aXNlXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAcGFyYW0ge3N0cmluZ30gW3RhZz0na2V5J10gLSB0YWcgZm9yIGRlYnVnZ2luZ1xuICogQHJldHVybnMge0xlZ2FjeVdlYWtNYXA8SyxWPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VMZWdhY3lXZWFrTWFwPSh0YWc9J2tleScpPT57XG4vKiogQHR5cGUge1dlYWtNYXA8SyAmIG9iamVjdCwgVj59ICovXG5jb25zdCB3bT1uZXcgV2Vha01hcCgpO1xuY29uc3QgYXNzZXJ0S2V5RG9lc05vdEV4aXN0PShrZXkpPT5cbiF3bS5oYXMoa2V5KXx8RmFpbCBgJHtxKHRhZyl9IGFscmVhZHkgcmVnaXN0ZXJlZDogJHtrZXl9YDtcbmNvbnN0IGFzc2VydEtleUV4aXN0cz0oa2V5KT0+XG53bS5oYXMoa2V5KXx8RmFpbCBgJHtxKHRhZyl9IG5vdCBmb3VuZDogJHtrZXl9YDtcbnJldHVybiBoYXJkZW4oe1xuaGFzOihrZXkpPT57XG4vKiBDaGVjayBpZiBhIGtleSBleGlzdHMuIFRoZSBrZXkgY2FuIGJlIGFueSBKYXZhU2NyaXB0IHZhbHVlLCovXG4vKiB0aG91Z2ggdGhlIGFuc3dlciB3aWxsIGFsd2F5cyBiZSBmYWxzZSBmb3Iga2V5cyB0aGF0IGNhbm5vdCBiZSBmb3VuZCovXG4vKiBpbiB0aGlzIG1hcC4qL1xucmV0dXJuIHdtLmhhcyhrZXkpO1xuIH0sXG5pbml0OihrZXksdmFsdWUpPT57XG5hc3NlcnRLZXlEb2VzTm90RXhpc3Qoa2V5KTtcbndtLnNldChrZXksdmFsdWUpO1xuIH0sXG5nZXQ6KGtleSk9PntcbmFzc2VydEtleUV4aXN0cyhrZXkpO1xuLyogSG93IHRvIHRlbGwgdHlwZXNjcmlwdCBJIGJlbGlldmUgdGhlIGBnZXRgIHdpbGwgc3VjY2VlZC4qL1xucmV0dXJuICgvKiogQHR5cGUge1Z9ICovd20uZ2V0KGtleSkpO1xuIH0sXG5zZXQ6KGtleSx2YWx1ZSk9PntcbmFzc2VydEtleUV4aXN0cyhrZXkpO1xud20uc2V0KGtleSx2YWx1ZSk7XG4gfSxcbmRlbGV0ZTooa2V5KT0+e1xuYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG53bS5kZWxldGUoa2V5KTtcbiB9fSk7XG5cbiB9OyRo4oCNX29uY2UubWFrZUxlZ2FjeVdlYWtNYXAobWFrZUxlZ2FjeVdlYWtNYXApO1xuaGFyZGVuKG1ha2VMZWdhY3lXZWFrTWFwKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlTGVnYWN5V2Vha01hcCI6WyJtYWtlTGVnYWN5V2Vha01hcCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACg/IAq0kAAANJAAAAzAAAAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL3BhdHRlcm5zL2VuY29kZVBhc3NhYmxlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL21hcnNoYWwiLCJAZW5kby9tYXJzaGFsL3NyYy9oZWxwZXJzL2Vycm9yLmpzIl0sImV4cG9ydHMiOlsiaXNFbmNvZGVkUmVtb3RhYmxlIiwibWFrZURlY29kZVBhc3NhYmxlIiwibWFrZUVuY29kZVBhc3NhYmxlIiwicGFzc1N0eWxlUHJlZml4ZXMiLCJyZWNvcmROYW1lcyIsInJlY29yZFZhbHVlcyIsInplcm9QYWQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgcGFzc1N0eWxlT2YsbmFtZUZvclBhc3NhYmxlU3ltYm9sLHBhc3NhYmxlU3ltYm9sRm9yTmFtZSxhc3NlcnRSZWNvcmQsZ2V0VGFnLG1ha2VUYWdnZWQsRXJyb3JIZWxwZXI7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXSxbXCJuYW1lRm9yUGFzc2FibGVTeW1ib2xcIiwgWyRo4oCNX2EgPT4gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9ICRo4oCNX2EpXV0sW1wicGFzc2FibGVTeW1ib2xGb3JOYW1lXCIsIFskaOKAjV9hID0+IChwYXNzYWJsZVN5bWJvbEZvck5hbWUgPSAkaOKAjV9hKV1dLFtcImFzc2VydFJlY29yZFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UmVjb3JkID0gJGjigI1fYSldXSxbXCJnZXRUYWdcIiwgWyRo4oCNX2EgPT4gKGdldFRhZyA9ICRo4oCNX2EpXV0sW1wibWFrZVRhZ2dlZFwiLCBbJGjigI1fYSA9PiAobWFrZVRhZ2dlZCA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsL3NyYy9oZWxwZXJzL2Vycm9yLmpzXCIsIFtbXCJFcnJvckhlbHBlclwiLCBbJGjigI1fYSA9PiAoRXJyb3JIZWxwZXIgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAYWdvcmljL2ludGVybmFsJykuUmVtb3RhYmxlfSBSZW1vdGFibGUgKi9cblxuY29uc3R7cXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5jb25zdHtmcm9tRW50cmllcyxpc309T2JqZWN0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcblxuLyoqXG4gKiBBc3N1bWluZyB0aGF0IGByZWNvcmRgIGlzIGEgQ29weVJlY29yZCwgd2UgaGF2ZSBvbmx5XG4gKiBzdHJpbmctbmFtZWQgb3duIHByb3BlcnRpZXMuIGByZWNvcmROYW1lc2AgcmV0dXJucyB0aG9zZSBuYW1lICpyZXZlcnNlKlxuICogc29ydGVkLCBiZWNhdXNlIHRoYXQncyBob3cgcmVjb3JkcyBhcmUgY29tcGFyZWQsIGVuY29kZWQsIGFuZCBzb3J0ZWQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7Q29weVJlY29yZDxUPn0gcmVjb3JkXG4gKiBAcmV0dXJucyB7c3RyaW5nW119XG4gKi9cbmNvbnN0ICAgICAgICByZWNvcmROYW1lcz0ocmVjb3JkKT0+XG4vKiBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xMjYwI2Rpc2N1c3Npb25fcjEwMDM2NTcyNDQqL1xuLyogY29tcGFyZXMgdHdvIHdheXMgb2YgcmV2ZXJzZSBzb3J0aW5nLCBhbmQgc2hvd3MgdGhhdCBgLnNvcnQoKS5yZXZlcnNlKClgKi9cbi8qIGlzIGN1cnJlbnRseSBmYXN0ZXIgb24gTW9kZGFibGUgWFMsIHdoaWxlIHRoZSBvdGhlciB3YXksKi9cbi8qIGAuc29ydChyZXZlcnNlQ29tcGFyYXRvcilgLCBpcyBmYXN0ZXIgb24gdjguIFdlIGN1cnJlbnRseSBjYXJlIG1vcmUgYWJvdXQqL1xuLyogWFMgcGVyZm9ybWFuY2UsIHNvIHdlIHJldmVyc2Ugc29ydCB1c2luZyBgLnNvcnQoKS5yZXZlcnNlKClgLiovXG5oYXJkZW4oLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9vd25LZXlzKHJlY29yZCkuc29ydCgpLnJldmVyc2UoKSk7JGjigI1fb25jZS5yZWNvcmROYW1lcyhyZWNvcmROYW1lcyk7XG5oYXJkZW4ocmVjb3JkTmFtZXMpO1xuXG4vKipcbiAqIEFzc3VtaW5nIHRoYXQgYHJlY29yZGAgaXMgYSBDb3B5UmVjb3JkIGFuZCBgbmFtZXNgIGlzIGByZWNvcmROYW1lcyhyZWNvcmQpYCxcbiAqIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBhcnJheSBvZiBwcm9wZXJ0eSB2YWx1ZXMuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7Q29weVJlY29yZDxUPn0gcmVjb3JkXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBuYW1lc1xuICogQHJldHVybnMge1RbXX1cbiAqL1xuY29uc3QgICAgICAgIHJlY29yZFZhbHVlcz0ocmVjb3JkLG5hbWVzKT0+XG5oYXJkZW4obmFtZXMubWFwKChuYW1lKT0+cmVjb3JkW25hbWVdKSk7JGjigI1fb25jZS5yZWNvcmRWYWx1ZXMocmVjb3JkVmFsdWVzKTtcbmhhcmRlbihyZWNvcmRWYWx1ZXMpO1xuXG5jb25zdCAgICAgICAgemVyb1BhZD0obixzaXplKT0+e1xuY29uc3QgblN0cj0gYCR7bn1gO1xuYXNzZXJ0KG5TdHIubGVuZ3RoPD1zaXplKTtcbmNvbnN0IHN0cj0gYDAwMDAwMDAwMDAwMDAwMDAwMDAwJHtuU3RyfWA7XG5jb25zdCByZXN1bHQ9c3RyLnN1YnN0cmluZyhzdHIubGVuZ3RoLXNpemUpO1xuYXNzZXJ0KHJlc3VsdC5sZW5ndGg9PT1zaXplKTtcbnJldHVybiByZXN1bHQ7XG4gfTskaOKAjV9vbmNlLnplcm9QYWQoemVyb1BhZCk7XG5oYXJkZW4oemVyb1BhZCk7XG5cbi8qIFRoaXMgaXMgdGhlIEphdmFTY3JpcHQgYW5hbG9nIHRvIGEgQyB1bmlvbjogYSB3YXkgdG8gbWFwIGJldHdlZW4gYSBmbG9hdCBhcyBhKi9cbi8qIG51bWJlciBhbmQgdGhlIGJpdHMgdGhhdCByZXByZXNlbnQgdGhlIGZsb2F0IGFzIGEgYnVmZmVyIGZ1bGwgb2YgYnl0ZXMuICBOb3RlKi9cbi8qIHRoYXQgdGhlIG11dGF0aW9uIG9mIHN0YXRpYyBzdGF0ZSBoZXJlIG1ha2VzIHRoaXMgaW52YWxpZCBKZXNzaWUgY29kZSwgYnV0Ki9cbi8qIGRvaW5nIGl0IHRoaXMgd2F5IHNhdmVzIHRoZSBudWdhdG9yeSBhbmQgZ3JhdHVpdG91cyBhbGxvY2F0aW9ucyB0aGF0IHdvdWxkKi9cbi8qIGhhcHBlbiBldmVyeSB0aW1lIHlvdSBkbyBhIGNvbnZlcnNpb24gLS0gYW5kIGluIHByYWN0aWNhbCB0ZXJtcyBpdCdzIHNhZmUqL1xuLyogYmVjYXVzZSB3ZSBwdXQgdGhlIHZhbHVlIGluIG9uZSBzaWRlIGFuZCB0aGVuIGltbWVkaWF0ZWx5IHRha2UgaXQgb3V0IHRoZSovXG4vKiBvdGhlcjsgdGhlcmUgaXMgbm8gYWN0dWFsIHN0YXRlIHJldGFpbmVkIGluIHRoZSBjbGFzc2ljIHNlbnNlIGFuZCB0aHVzIG5vKi9cbi8qIHJlLWVudHJhbmN5IGlzc3VlLiovXG5jb25zdCBhc051bWJlcj1uZXcgRmxvYXQ2NEFycmF5KDEpO1xuY29uc3QgYXNCaXRzPW5ldyBCaWdVaW50NjRBcnJheShhc051bWJlci5idWZmZXIpO1xuXG4vKiBKYXZhU2NyaXB0IG51bWJlcnMgYXJlIGVuY29kZWQgYnkgb3V0cHV0dGluZyB0aGUgYmFzZS0xNiovXG4vKiByZXByZXNlbnRhdGlvbiBvZiB0aGUgYmluYXJ5IHZhbHVlIG9mIHRoZSB1bmRlcmx5aW5nIElFRUUgZmxvYXRpbmcgcG9pbnQqL1xuLyogcmVwcmVzZW50YXRpb24uICBGb3IgbmVnYXRpdmUgdmFsdWVzLCBhbGwgYml0cyBvZiB0aGlzIHJlcHJlc2VudGF0aW9uIGFyZSovXG4vKiBjb21wbGVtZW50ZWQgcHJpb3IgdG8gdGhlIGJhc2UtMTYgY29udmVyc2lvbiwgd2hpbGUgZm9yIHBvc2l0aXZlIHZhbHVlcywgdGhlKi9cbi8qIHNpZ24gYml0IGlzIGNvbXBsZW1lbnRlZC4gIFRoaXMgZW5zdXJlcyBib3RoIHRoYXQgbmVnYXRpdmUgdmFsdWVzIHNvcnQgYmVmb3JlKi9cbi8qIHBvc2l0aXZlIHZhbHVlcyBhbmQgdGhhdCBuZWdhdGl2ZSB2YWx1ZXMgc29ydCBhY2NvcmRpbmcgdG8gdGhlaXIgbmVnYXRpdmUqL1xuLyogbWFnbml0dWRlIHJhdGhlciB0aGFuIHRoZWlyIHBvc2l0aXZlIG1hZ25pdHVkZS4gIFRoaXMgcmVzdWx0cyBpbiBhbiBBU0NJSSovXG4vKiBlbmNvZGluZyB3aG9zZSBsZXhpY29ncmFwaGljIHNvcnQgb3JkZXIgaXMgdGhlIHNhbWUgYXMgdGhlIG51bWVyaWMgc29ydCBvcmRlciovXG4vKiBvZiB0aGUgY29ycmVzcG9uZGluZyBudW1iZXJzLiovXG5cbi8qIFRPRE8gQ2hvb3NlIHRoZSBzYW1lIGNhbm9uaWNhbCBOYU4gZW5jb2RpbmcgdGhhdCBjb3NtV2FzbSBhbmQgZXdhc20gY2hvc2UuKi9cbmNvbnN0IENhbm9uaWNhbE5hTkJpdHM9J2ZmZjgwMDAwMDAwMDAwMDAnO1xuXG5jb25zdCBlbmNvZGVCaW5hcnk2ND0obik9Pntcbi8qIE5vcm1hbGl6ZSAtMCB0byAwIGFuZCBOYU4gdG8gYSBjYW5vbmljYWwgZW5jb2RpbmcqL1xuaWYoaXMobiwtMCkpe1xubj0wO1xuIH1lbHNlIGlmKGlzKG4sTmFOKSl7XG5yZXR1cm4gYGYke0Nhbm9uaWNhbE5hTkJpdHN9YDtcbiB9XG5hc051bWJlclswXT1uO1xubGV0IGJpdHM9YXNCaXRzWzBdO1xuaWYobjwwKXtcbmJpdHNePTB4ZmZmZmZmZmZmZmZmZmZmZm47XG4gfWVsc2V7XG5iaXRzXj0weDgwMDAwMDAwMDAwMDAwMDBuO1xuIH1cbnJldHVybiBgZiR7emVyb1BhZChiaXRzLnRvU3RyaW5nKDE2KSwxNil9YDtcbiB9O1xuXG5jb25zdCBkZWNvZGVCaW5hcnk2ND0oZW5jb2RlZCk9PntcbmVuY29kZWQuc3RhcnRzV2l0aCgnZicpfHxGYWlsIGBFbmNvZGVkIG51bWJlciBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG5sZXQgYml0cz1CaWdJbnQoIGAweCR7ZW5jb2RlZC5zdWJzdHJpbmcoMSl9YCk7XG5pZihlbmNvZGVkWzFdPCc4Jyl7XG5iaXRzXj0weGZmZmZmZmZmZmZmZmZmZmZuO1xuIH1lbHNle1xuYml0c149MHg4MDAwMDAwMDAwMDAwMDAwbjtcbiB9XG5hc0JpdHNbMF09Yml0cztcbmNvbnN0IHJlc3VsdD1hc051bWJlclswXTtcbiFpcyhyZXN1bHQsLTApfHxGYWlsIGBVbmV4cGVjdGVkIG5lZ2F0aXZlIHplcm86ICR7ZW5jb2RlZH1gO1xucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG4vKiBKYXZhU2NyaXB0IGJpZ2ludHMgYXJlIGVuY29kZWQgdXNpbmcgYSB2YXJpYW50IG9mIEVsaWFzIGRlbHRhIGNvZGluZywgd2l0aCBhbiovXG4vKiBpbml0aWFsIGNvbXBvbmVudCBmb3IgdGhlIGxlbmd0aCBvZiB0aGUgZGlnaXQgY291bnQgYXMgYSB1bmFyeSBzdHJpbmcsIGEqL1xuLyogc2Vjb25kIGNvbXBvbmVudCBmb3IgdGhlIGRlY2ltYWwgZGlnaXQgY291bnQsIGFuZCBhIHRoaXJkIGNvbXBvbmVudCBmb3IgdGhlKi9cbi8qIGRlY2ltYWwgZGlnaXRzIHByZWNlZGVkIGJ5IGEgZ3JhdHVpdG91cyBzZXBhcmF0aW5nIGNvbG9uLiovXG4vKiBUbyBlbnN1cmUgdGhhdCB0aGUgbGV4aWNvZ3JhcGhpYyBzb3J0IG9yZGVyIG9mIGVuY29kZWQgdmFsdWVzIG1hdGNoZXMgdGhlKi9cbi8qIG51bWVyaWMgc29ydCBvcmRlciBvZiB0aGUgY29ycmVzcG9uZGluZyBudW1iZXJzLCB0aGUgY2hhcmFjdGVycyBvZiB0aGUgdW5hcnkqL1xuLyogcHJlZml4IGFyZSBkaWZmZXJlbnQgZm9yIG5lZ2F0aXZlIHZhbHVlcyAodHlwZSBcIm5cIiBmb2xsb3dlZCBieSBhbnkgbnVtYmVyIG9mKi9cbi8qIFwiI1wicyBbd2hpY2ggc29ydCBiZWZvcmUgZGVjaW1hbCBkaWdpdHNdKSB2cy4gcG9zaXRpdmUgYW5kIHplcm8gdmFsdWVzICh0eXBlKi9cbi8qIFwicFwiIGZvbGxvd2VkIGJ5IGFueSBudW1iZXIgb2YgXCJ+XCJzIFt3aGljaCBzb3J0IGFmdGVyIGRlY2ltYWwgZGlnaXRzXSkgYW5kKi9cbi8qIGVhY2ggZGVjaW1hbCBkaWdpdCBvZiB0aGUgZW5jb2RpbmcgZm9yIGEgbmVnYXRpdmUgdmFsdWUgaXMgcmVwbGFjZWQgd2l0aCBpdHMqL1xuLyogdGVuJ3MgY29tcGxlbWVudCAoc28gdGhhdCBuZWdhdGl2ZSB2YWx1ZXMgb2YgdGhlIHNhbWUgc2NhbGUgc29ydCBieSovXG4vKiAqZGVzY2VuZGluZyogYWJzb2x1dGUgdmFsdWUpLiovXG5jb25zdCBlbmNvZGVCaWdJbnQ9KG4pPT57XG5jb25zdCBhYnM9bjwwbj8tbjpuO1xuY29uc3QgbkRpZ2l0cz1hYnMudG9TdHJpbmcoKS5sZW5ndGg7XG5jb25zdCBsRGlnaXRzPW5EaWdpdHMudG9TdHJpbmcoKS5sZW5ndGg7XG5pZihuPDBuKXtcbnJldHVybiBgbiR7XG4vKiBBIFwiI1wiIGZvciBlYWNoIGRpZ2l0IGJleW9uZCB0aGUgZmlyc3QqL1xuLyogaW4gdGhlIGRlY2ltYWwgKmNvdW50KiBvZiBkZWNpbWFsIGRpZ2l0cy4qL1xuJyMnLnJlcGVhdChsRGlnaXRzLTEpXG4gfSR7XG4vKiBUaGUgdGVuJ3MgY29tcGxlbWVudCBvZiB0aGUgY291bnQgb2YgZGlnaXRzLiovXG4oMTAqKmxEaWdpdHMtbkRpZ2l0cykudG9TdHJpbmcoKS5wYWRTdGFydChsRGlnaXRzLCcwJylcbiB9OiR7XG4vKiBUaGUgdGVuJ3MgY29tcGxlbWVudCBvZiB0aGUgZGlnaXRzLiovXG4oMTBuKipCaWdJbnQobkRpZ2l0cykrbikudG9TdHJpbmcoKS5wYWRTdGFydChuRGlnaXRzLCcwJylcbiB9YDtcbiB9ZWxzZXtcbnJldHVybiBgcCR7XG4vKiBBIFwiflwiIGZvciBlYWNoIGRpZ2l0IGJleW9uZCB0aGUgZmlyc3QqL1xuLyogaW4gdGhlIGRlY2ltYWwgKmNvdW50KiBvZiBkZWNpbWFsIGRpZ2l0cy4qL1xuJ34nLnJlcGVhdChsRGlnaXRzLTEpXG4gfSR7XG4vKiBUaGUgY291bnQgb2YgZGlnaXRzLiovXG5uRGlnaXRzXG4gfToke1xuLyogVGhlIGRpZ2l0cy4qL1xublxuIH1gO1xuIH1cbiB9O1xuXG5jb25zdCBkZWNvZGVCaWdJbnQ9KGVuY29kZWQpPT57XG5jb25zdCB0eXBlUHJlZml4PWVuY29kZWQuY2hhckF0KDApOy8qIGZhc3RlciB0aGFuIGVuY29kZWRbMF0qL1xubGV0IHJlbT1lbmNvZGVkLnNsaWNlKDEpO1xudHlwZVByZWZpeD09PSdwJ3x8XG50eXBlUHJlZml4PT09J24nfHxcbkZhaWwgYEVuY29kZWQgYmlnaW50IGV4cGVjdGVkOiAke2VuY29kZWR9YDtcblxuY29uc3QgbERpZ2l0cz1yZW0uc2VhcmNoKC9bMC05XS8pKzE7XG5sRGlnaXRzPj0xfHxGYWlsIGBEaWdpdCBjb3VudCBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG5yZW09cmVtLnNsaWNlKGxEaWdpdHMtMSk7XG5cbnJlbS5sZW5ndGg+PWxEaWdpdHN8fEZhaWwgYENvbXBsZXRlIGRpZ2l0IGNvdW50IGV4cGVjdGVkOiAke2VuY29kZWR9YDtcbmNvbnN0IHNuRGlnaXRzPXJlbS5zbGljZSgwLGxEaWdpdHMpO1xucmVtPXJlbS5zbGljZShsRGlnaXRzKTtcbi9eWzAtOV0rJC8udGVzdChzbkRpZ2l0cyl8fEZhaWwgYERlY2ltYWwgZGlnaXQgY291bnQgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xubGV0IG5EaWdpdHM9cGFyc2VJbnQoc25EaWdpdHMsMTApO1xuaWYodHlwZVByZWZpeD09PSduJyl7XG4vKiBUT0RPIEFzc2VydCB0byByZWplY3QgZm9yYmlkZGVuIGVuY29kaW5ncyovXG4vKiBsaWtlIFwibjA6XCIgYW5kIFwibjAwOuKAplwiIGFuZCBcIm45MTrigKZcIiB0aHJvdWdoIFwibjk5OuKAplwiPyovXG5uRGlnaXRzPTEwKipsRGlnaXRzLW5EaWdpdHM7XG4gfVxuXG5yZW0uc3RhcnRzV2l0aCgnOicpfHxGYWlsIGBTZXBhcmF0b3IgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xucmVtPXJlbS5zbGljZSgxKTtcbnJlbS5sZW5ndGg9PT1uRGlnaXRzfHxcbkZhaWwgYEZpeGVkLWxlbmd0aCBkaWdpdCBzZXF1ZW5jZSBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG5sZXQgbj1CaWdJbnQocmVtKTtcbmlmKHR5cGVQcmVmaXg9PT0nbicpe1xuLyogVE9ETyBBc3NlcnQgdG8gcmVqZWN0IGZvcmJpZGRlbiBlbmNvZGluZ3MqL1xuLyogbGlrZSBcIm45OjBcIiBhbmQgXCJuODowMFwiIGFuZCBcIm44OjkxXCIgdGhyb3VnaCBcIm44Ojk5XCI/Ki9cbm49LSgxMG4qKkJpZ0ludChuRGlnaXRzKS1uKTtcbiB9XG5cbnJldHVybiBuO1xuIH07XG5cbi8qIGAnXFx1MDAwMCdgIGlzIHRoZSB0ZXJtaW5hdG9yIGFmdGVyIGVsZW1lbnRzLiovXG4vKiBgJ1xcdTAwMDEnYCBpcyB0aGUgYmFja3NsYXNoLWxpa2UgZXNjYXBlIGNoYXJhY3RlciwgZm9yKi9cbi8qIGVzY2FwaW5nIGJvdGggb2YgdGhlc2UgY2hhcmFjdGVycy4qL1xuXG5jb25zdCBlbmNvZGVBcnJheT0oYXJyYXksZW5jb2RlUGFzc2FibGUpPT57XG5jb25zdCBjaGFycz1bJ1snXTtcbmZvcihjb25zdCBlbGVtZW50IG9mIGFycmF5KXtcbmNvbnN0IGVuYz1lbmNvZGVQYXNzYWJsZShlbGVtZW50KTtcbmZvcihjb25zdCBjIG9mIGVuYyl7XG5pZihjPT09J1xcdTAwMDAnfHxjPT09J1xcdTAwMDEnKXtcbmNoYXJzLnB1c2goJ1xcdTAwMDEnKTtcbiB9XG5jaGFycy5wdXNoKGMpO1xuIH1cbmNoYXJzLnB1c2goJ1xcdTAwMDAnKTtcbiB9XG5yZXR1cm4gY2hhcnMuam9pbignJyk7XG4gfTtcblxuY29uc3QgZGVjb2RlQXJyYXk9KGVuY29kZWQsZGVjb2RlUGFzc2FibGUpPT57XG5lbmNvZGVkLnN0YXJ0c1dpdGgoJ1snKXx8RmFpbCBgRW5jb2RlZCBhcnJheSBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG5jb25zdCBlbGVtZW50cz1bXTtcbmNvbnN0IGVsZW1DaGFycz1bXTtcbmZvcihsZXQgaT0xO2k8ZW5jb2RlZC5sZW5ndGg7aSs9MSl7XG5jb25zdCBjPWVuY29kZWRbaV07XG5pZihjPT09J1xcdTAwMDAnKXtcbmNvbnN0IGVuY29kZWRFbGVtZW50PWVsZW1DaGFycy5qb2luKCcnKTtcbmVsZW1DaGFycy5sZW5ndGg9MDtcbmNvbnN0IGVsZW1lbnQ9ZGVjb2RlUGFzc2FibGUoZW5jb2RlZEVsZW1lbnQpO1xuZWxlbWVudHMucHVzaChlbGVtZW50KTtcbiB9ZWxzZSBpZihjPT09J1xcdTAwMDEnKXtcbmkrPTE7XG5pPGVuY29kZWQubGVuZ3RofHxGYWlsIGB1bmV4cGVjdGVkIGVuZCBvZiBlbmNvZGluZyAke2VuY29kZWR9YDtcbmNvbnN0IGMyPWVuY29kZWRbaV07XG5jMj09PSdcXHUwMDAwJ3x8XG5jMj09PSdcXHUwMDAxJ3x8XG5GYWlsIGBVbmV4cGVjdGVkIGNoYXJhY3RlciBhZnRlciB1MDAwMSBlc2NhcGU6ICR7YzJ9YDtcbmVsZW1DaGFycy5wdXNoKGMyKTtcbiB9ZWxzZXtcbmVsZW1DaGFycy5wdXNoKGMpO1xuIH1cbiB9XG5lbGVtQ2hhcnMubGVuZ3RoPT09MHx8RmFpbCBgZW5jb2RpbmcgdGVybWluYXRlZCBlYXJseTogJHtlbmNvZGVkfWA7XG5yZXR1cm4gaGFyZGVuKGVsZW1lbnRzKTtcbiB9O1xuXG5jb25zdCBlbmNvZGVSZWNvcmQ9KHJlY29yZCxlbmNvZGVQYXNzYWJsZSk9PntcbmNvbnN0IG5hbWVzPXJlY29yZE5hbWVzKHJlY29yZCk7XG5jb25zdCB2YWx1ZXM9cmVjb3JkVmFsdWVzKHJlY29yZCxuYW1lcyk7XG5yZXR1cm4gYCgke2VuY29kZUFycmF5KGhhcmRlbihbbmFtZXMsdmFsdWVzXSksZW5jb2RlUGFzc2FibGUpfWA7XG4gfTtcblxuY29uc3QgZGVjb2RlUmVjb3JkPShlbmNvZGVkLGRlY29kZVBhc3NhYmxlKT0+e1xuYXNzZXJ0KGVuY29kZWQuc3RhcnRzV2l0aCgnKCcpKTtcbmNvbnN0IGtleXN2YWxzPWRlY29kZUFycmF5KGVuY29kZWQuc3Vic3RyaW5nKDEpLGRlY29kZVBhc3NhYmxlKTtcbmtleXN2YWxzLmxlbmd0aD09PTJ8fEZhaWwgYGV4cGVjdGVkIGtleXMsdmFsdWVzIHBhaXI6ICR7ZW5jb2RlZH1gO1xuY29uc3Rba2V5cyx2YWxzXT1rZXlzdmFscztcblxucGFzc1N0eWxlT2Yoa2V5cyk9PT0nY29weUFycmF5JyYmXG5wYXNzU3R5bGVPZih2YWxzKT09PSdjb3B5QXJyYXknJiZcbmtleXMubGVuZ3RoPT09dmFscy5sZW5ndGgmJlxua2V5cy5ldmVyeSgoa2V5KT0+dHlwZW9mIGtleT09PSdzdHJpbmcnKXx8XG5GYWlsIGBub3QgYSB2YWxpZCByZWNvcmQgZW5jb2Rpbmc6ICR7ZW5jb2RlZH1gO1xuY29uc3QgbWFwRW50cmllcz1rZXlzLm1hcCgoa2V5LGkpPT5ba2V5LHZhbHNbaV1dKTtcbmNvbnN0IHJlY29yZD1oYXJkZW4oZnJvbUVudHJpZXMobWFwRW50cmllcykpO1xuYXNzZXJ0UmVjb3JkKHJlY29yZCwnZGVjb2RlZCByZWNvcmQnKTtcbnJldHVybiByZWNvcmQ7XG4gfTtcblxuY29uc3QgZW5jb2RlVGFnZ2VkPSh0YWdnZWQsZW5jb2RlUGFzc2FibGUpPT5cbiBgOiR7ZW5jb2RlQXJyYXkoaGFyZGVuKFtnZXRUYWcodGFnZ2VkKSx0YWdnZWQucGF5bG9hZF0pLGVuY29kZVBhc3NhYmxlKX1gO1xuXG5jb25zdCBkZWNvZGVUYWdnZWQ9KGVuY29kZWQsZGVjb2RlUGFzc2FibGUpPT57XG5hc3NlcnQoZW5jb2RlZC5zdGFydHNXaXRoKCc6JykpO1xuY29uc3QgdGFncGF5bG9hZD1kZWNvZGVBcnJheShlbmNvZGVkLnN1YnN0cmluZygxKSxkZWNvZGVQYXNzYWJsZSk7XG50YWdwYXlsb2FkLmxlbmd0aD09PTJ8fEZhaWwgYGV4cGVjdGVkIHRhZyxwYXlsb2FkIHBhaXI6ICR7ZW5jb2RlZH1gO1xuY29uc3RbdGFnLHBheWxvYWRdPXRhZ3BheWxvYWQ7XG5wYXNzU3R5bGVPZih0YWcpPT09J3N0cmluZyd8fFxuRmFpbCBgbm90IGEgdmFsaWQgdGFnZ2VkIGVuY29kaW5nOiAke2VuY29kZWR9YDtcbnJldHVybiBtYWtlVGFnZ2VkKHRhZyxwYXlsb2FkKTtcbiB9O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEVuY29kZU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7KFxuICogICByZW1vdGFibGU6IFJlbW90YWJsZSxcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gc3RyaW5nLFxuICogKSA9PiBzdHJpbmd9IFtlbmNvZGVSZW1vdGFibGVdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgcHJvbWlzZTogUHJvbWlzZSxcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gc3RyaW5nLFxuICogKSA9PiBzdHJpbmd9IFtlbmNvZGVQcm9taXNlXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVycm9yOiBFcnJvcixcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gc3RyaW5nLFxuICogKSA9PiBzdHJpbmd9IFtlbmNvZGVFcnJvcl1cbiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7RW5jb2RlT3B0aW9uc30gW2VuY29kZU9wdGlvbnNdXG4gKiBAcmV0dXJucyB7KHBhc3NhYmxlOiBQYXNzYWJsZSkgPT4gc3RyaW5nfVxuICovXG4vKiBgeWFybiBsaW50YCBjb21wbGFpbnMgaGVyZSBidXQgbm90IGZvciBlcXVpdmFsZW50IGNvZGUgaW4gYWdvcmljLXNkay4qL1xuLyogQWxzbywgdnNjb2RlIGRvZXMgbm90IGNvbXBsYWluLiBIZW5jZSB3ZSdyZSB1c2luZyBhdC10cy1pZ25vcmUgcmF0aGVyIHRoYW4qL1xuLyogYXQtdHMtZXhwZWN0LWVycm9yLiBVc2luZyBhdC10cy1pZ25vcmUgc2hvdWxkIGFsc28gZ2VuZXJhdGUgYSBjb21wbGFpbnQqL1xuLyogdGhhdCB3ZSBzaG91bGQgYmUgdXNpbmcgYXQtZXhwZWN0LWVycm9yLCB3aGVyZSB3ZSB3b3VsZCBub3JtYWxseSBuZWVkKi9cbi8qIHRvIHN1cHByZXNzIHRoYXQgZXJyb3IgYXMgd2VsbC4gSG93ZXZlciwgcGVyaGFwcyB0aGF0IHNlY29uZCBlcnJvciBjdXJyZW50bHkqL1xuLyogaGFwcGVucyBvbmx5IGluIGFnb3JpYy1zZGssIGJ1dCBub3QgeWV0IGluIGVuZG8uIFRPRE8gZmlndXJlIG91dCBhbmQgZml4LiovXG4vKiBAIHRzLWlnbm9yZSovXG5jb25zdCAgICAgICAgbWFrZUVuY29kZVBhc3NhYmxlPSh7XG5lbmNvZGVSZW1vdGFibGU9KHJlbSxfKT0+RmFpbCBgcmVtb3RhYmxlIHVuZXhwZWN0ZWQ6ICR7cmVtfWAsXG5lbmNvZGVQcm9taXNlPShwcm9tLF8pPT5GYWlsIGBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7cHJvbX1gLFxuZW5jb2RlRXJyb3I9KGVycixfKT0+RmFpbCBgZXJyb3IgdW5leHBlY3RlZDogJHtlcnJ9YH09XG57fSk9PntcbmNvbnN0IGVuY29kZVBhc3NhYmxlPShwYXNzYWJsZSk9PntcbmlmKEVycm9ySGVscGVyLmNhbkJlVmFsaWQocGFzc2FibGUpKXtcbnJldHVybiBlbmNvZGVFcnJvcihwYXNzYWJsZSxlbmNvZGVQYXNzYWJsZSk7XG4gfVxuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHBhc3NhYmxlKTtcbnN3aXRjaChwYXNzU3R5bGUpe1xuY2FzZSdudWxsJzp7XG5yZXR1cm4ndic7XG4gfVxuY2FzZSd1bmRlZmluZWQnOntcbnJldHVybid6JztcbiB9XG5jYXNlJ251bWJlcic6e1xucmV0dXJuIGVuY29kZUJpbmFyeTY0KHBhc3NhYmxlKTtcbiB9XG5jYXNlJ3N0cmluZyc6e1xucmV0dXJuIGBzJHtwYXNzYWJsZX1gO1xuIH1cbmNhc2UnYm9vbGVhbic6e1xucmV0dXJuIGBiJHtwYXNzYWJsZX1gO1xuIH1cbmNhc2UnYmlnaW50Jzp7XG5yZXR1cm4gZW5jb2RlQmlnSW50KHBhc3NhYmxlKTtcbiB9XG5jYXNlJ3JlbW90YWJsZSc6e1xuY29uc3QgcmVzdWx0PWVuY29kZVJlbW90YWJsZShwYXNzYWJsZSxlbmNvZGVQYXNzYWJsZSk7XG5yZXN1bHQuc3RhcnRzV2l0aCgncicpfHxcbkZhaWwgYGludGVybmFsOiBSZW1vdGFibGUgZW5jb2RpbmcgbXVzdCBzdGFydCB3aXRoIFwiclwiOiAke3Jlc3VsdH1gO1xucmV0dXJuIHJlc3VsdDtcbiB9XG5jYXNlJ2Vycm9yJzp7XG5jb25zdCByZXN1bHQ9ZW5jb2RlRXJyb3IocGFzc2FibGUsZW5jb2RlUGFzc2FibGUpO1xucmVzdWx0LnN0YXJ0c1dpdGgoJyEnKXx8XG5GYWlsIGBpbnRlcm5hbDogRXJyb3IgZW5jb2RpbmcgbXVzdCBzdGFydCB3aXRoIFwiIVwiOiAke3Jlc3VsdH1gO1xucmV0dXJuIHJlc3VsdDtcbiB9XG5jYXNlJ3Byb21pc2UnOntcbmNvbnN0IHJlc3VsdD1lbmNvZGVQcm9taXNlKHBhc3NhYmxlLGVuY29kZVBhc3NhYmxlKTtcbnJlc3VsdC5zdGFydHNXaXRoKCc/Jyl8fFxuRmFpbCBgaW50ZXJuYWw6IFByb21pc2UgZW5jb2RpbmcgbXVzdCBzdGFydCB3aXRoIFwiP1wiOiAke3Jlc3VsdH1gO1xucmV0dXJuIHJlc3VsdDtcbiB9XG5jYXNlJ3N5bWJvbCc6e1xucmV0dXJuIGB5JHtuYW1lRm9yUGFzc2FibGVTeW1ib2wocGFzc2FibGUpfWA7XG4gfVxuY2FzZSdjb3B5QXJyYXknOntcbnJldHVybiBlbmNvZGVBcnJheShwYXNzYWJsZSxlbmNvZGVQYXNzYWJsZSk7XG4gfVxuY2FzZSdjb3B5UmVjb3JkJzp7XG5yZXR1cm4gZW5jb2RlUmVjb3JkKHBhc3NhYmxlLGVuY29kZVBhc3NhYmxlKTtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xucmV0dXJuIGVuY29kZVRhZ2dlZChwYXNzYWJsZSxlbmNvZGVQYXNzYWJsZSk7XG4gfVxuZGVmYXVsdDp7XG50aHJvdyBGYWlsIGBhICR7cShwYXNzU3R5bGUpfSBjYW5ub3QgYmUgdXNlZCBhcyBhIGNvbGxlY3Rpb24gcGFzc2FibGVgO1xuIH19XG5cbiB9O1xucmV0dXJuIGhhcmRlbihlbmNvZGVQYXNzYWJsZSk7XG4gfTskaOKAjV9vbmNlLm1ha2VFbmNvZGVQYXNzYWJsZShtYWtlRW5jb2RlUGFzc2FibGUpO1xuaGFyZGVuKG1ha2VFbmNvZGVQYXNzYWJsZSk7XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRGVjb2RlT3B0aW9uc1xuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRSZW1vdGFibGU6IHN0cmluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlOiBzdHJpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IFJlbW90YWJsZX0gW2RlY29kZVJlbW90YWJsZV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkUHJvbWlzZTogc3RyaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGU6IHN0cmluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gUHJvbWlzZX0gW2RlY29kZVByb21pc2VdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZEVycm9yOiBzdHJpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZTogc3RyaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiBFcnJvcn0gW2RlY29kZUVycm9yXVxuICovXG5cbi8qKlxuICogQHBhcmFtIHtEZWNvZGVPcHRpb25zfSBbZGVjb2RlT3B0aW9uc11cbiAqIEByZXR1cm5zIHsoZW5jb2RlZDogc3RyaW5nKSA9PiBQYXNzYWJsZX1cbiAqL1xuLyogYHlhcm4gbGludGAgY29tcGxhaW5zIGhlcmUgYnV0IG5vdCBmb3IgZXF1aXZhbGVudCBjb2RlIGluIGFnb3JpYy1zZGsuKi9cbi8qIEFsc28sIHZzY29kZSBkb2VzIG5vdCBjb21wbGFpbi4gSGVuY2Ugd2UncmUgdXNpbmcgYXQtdHMtaWdub3JlIHJhdGhlciB0aGFuKi9cbi8qIGF0LXRzLWV4cGVjdC1lcnJvci4gVXNpbmcgYXQtdHMtaWdub3JlIHNob3VsZCBhbHNvIGdlbmVyYXRlIGEgY29tcGxhaW50Ki9cbi8qIHRoYXQgd2Ugc2hvdWxkIGJlIHVzaW5nIGF0LWV4cGVjdC1lcnJvciwgd2hlcmUgd2Ugd291bGQgbm9ybWFsbHkgbmVlZCovXG4vKiB0byBzdXBwcmVzcyB0aGF0IGVycm9yIGFzIHdlbGwuIEhvd2V2ZXIsIHBlcmhhcHMgdGhhdCBzZWNvbmQgZXJyb3IgY3VycmVudGx5Ki9cbi8qIGhhcHBlbnMgb25seSBpbiBhZ29yaWMtc2RrLCBidXQgbm90IHlldCBpbiBlbmRvLiBUT0RPIGZpZ3VyZSBvdXQgYW5kIGZpeC4qL1xuLyogQCB0cy1pZ25vcmUqL1xuY29uc3QgICAgICAgIG1ha2VEZWNvZGVQYXNzYWJsZT0oe1xuZGVjb2RlUmVtb3RhYmxlPShyZW0sXyk9PkZhaWwgYHJlbW90YWJsZSB1bmV4cGVjdGVkOiAke3JlbX1gLFxuZGVjb2RlUHJvbWlzZT0ocHJvbSxfKT0+RmFpbCBgcHJvbWlzZSB1bmV4cGVjdGVkOiAke3Byb219YCxcbmRlY29kZUVycm9yPShlcnIsXyk9PkZhaWwgYGVycm9yIHVuZXhwZWN0ZWQ6ICR7ZXJyfWB9PVxue30pPT57XG5jb25zdCBkZWNvZGVQYXNzYWJsZT0oZW5jb2RlZCk9PntcbnN3aXRjaChlbmNvZGVkLmNoYXJBdCgwKSl7XG5jYXNlJ3YnOntcbnJldHVybiBudWxsO1xuIH1cbmNhc2Uneic6e1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG5jYXNlJ2YnOntcbnJldHVybiBkZWNvZGVCaW5hcnk2NChlbmNvZGVkKTtcbiB9XG5jYXNlJ3MnOntcbnJldHVybiBlbmNvZGVkLnN1YnN0cmluZygxKTtcbiB9XG5jYXNlJ2InOntcbnJldHVybiBlbmNvZGVkLnN1YnN0cmluZygxKSE9PSdmYWxzZSc7XG4gfVxuY2FzZSduJzpcbmNhc2UncCc6e1xucmV0dXJuIGRlY29kZUJpZ0ludChlbmNvZGVkKTtcbiB9XG5jYXNlJ3InOntcbnJldHVybiBkZWNvZGVSZW1vdGFibGUoZW5jb2RlZCxkZWNvZGVQYXNzYWJsZSk7XG4gfVxuY2FzZSc/Jzp7XG5yZXR1cm4gZGVjb2RlUHJvbWlzZShlbmNvZGVkLGRlY29kZVBhc3NhYmxlKTtcbiB9XG5jYXNlJyEnOntcbnJldHVybiBkZWNvZGVFcnJvcihlbmNvZGVkLGRlY29kZVBhc3NhYmxlKTtcbiB9XG5jYXNlJ3knOntcbnJldHVybiBwYXNzYWJsZVN5bWJvbEZvck5hbWUoZW5jb2RlZC5zdWJzdHJpbmcoMSkpO1xuIH1cbmNhc2UnWyc6e1xucmV0dXJuIGRlY29kZUFycmF5KGVuY29kZWQsZGVjb2RlUGFzc2FibGUpO1xuIH1cbmNhc2UnKCc6e1xucmV0dXJuIGRlY29kZVJlY29yZChlbmNvZGVkLGRlY29kZVBhc3NhYmxlKTtcbiB9XG5jYXNlJzonOntcbnJldHVybiBkZWNvZGVUYWdnZWQoZW5jb2RlZCxkZWNvZGVQYXNzYWJsZSk7XG4gfVxuZGVmYXVsdDp7XG50aHJvdyBGYWlsIGBpbnZhbGlkIGRhdGFiYXNlIGtleTogJHtlbmNvZGVkfWA7XG4gfX1cblxuIH07XG5yZXR1cm4gaGFyZGVuKGRlY29kZVBhc3NhYmxlKTtcbiB9OyRo4oCNX29uY2UubWFrZURlY29kZVBhc3NhYmxlKG1ha2VEZWNvZGVQYXNzYWJsZSk7XG5oYXJkZW4obWFrZURlY29kZVBhc3NhYmxlKTtcblxuY29uc3QgICAgICAgIGlzRW5jb2RlZFJlbW90YWJsZT0oZW5jb2RlZCk9PmVuY29kZWQuY2hhckF0KDApPT09J3InOyRo4oCNX29uY2UuaXNFbmNvZGVkUmVtb3RhYmxlKGlzRW5jb2RlZFJlbW90YWJsZSk7XG5oYXJkZW4oaXNFbmNvZGVkUmVtb3RhYmxlKTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKipcbiAqIEB0eXBlIHtSZWNvcmQ8UGFzc1N0eWxlLCBzdHJpbmc+fVxuICogVGhlIHNpbmdsZSBwcmVmaXggY2hhcmFjdGVycyB0byBiZSB1c2VkIGZvciBlYWNoIFBhc3NTdHlsZSBjYXRlZ29yeS5cbiAqIGBiaWdpbnRgIGlzIGEgdHdvIGNoYXJhY3RlciBzdHJpbmcgYmVjYXVzZSBlYWNoIG9mIHRob3NlIGNoYXJhY3RlcnNcbiAqIGluZGl2aWR1YWxseSBpcyBhIHZhbGlkIGJpZ2ludCBwcmVmaXguIGBuYCBmb3IgXCJuZWdhdGl2ZVwiIGFuZCBgcGAgZm9yXG4gKiBcInBvc2l0aXZlXCIuIFRoZSBvcmRlcmluZyBvZiB0aGVzZSBwcmVmaXhlcyBpcyB0aGUgc2FtZSBhcyB0aGVcbiAqIHJhbmtPcmRlcmluZyBvZiB0aGVpciByZXNwZWN0aXZlIFBhc3NTdHlsZXMuIFRoaXMgdGFibGUgaXMgaW1wb3J0ZWQgYnlcbiAqIHJhbmtPcmRlci5qcyBmb3IgdGhpcyBwdXJwb3NlLlxuICpcbiAqIEluIGFkZGl0aW9uLCBgfGAgaXMgdGhlIHJlbW90YWJsZS0+b3JkaW5hbCBtYXBwaW5nIHByZWZpeDpcbiAqIFRoaXMgaXMgbm90IHVzZWQgaW4gY292ZXJzIGJ1dCBpdCBpc1xuICogcmVzZXJ2ZWQgZnJvbSB0aGUgc2FtZSBzZXQgb2Ygc3RyaW5ncy4gTm90ZSB0aGF0IHRoZSBwcmVmaXggaXMgPiBhbnlcbiAqIHByZWZpeCB1c2VkIGJ5IGFueSBjb3ZlciBzbyB0aGF0IG9yZGluYWwgbWFwcGluZyBrZXlzIGFyZSBhbHdheXMgb3V0c2lkZVxuICogdGhlIHJhbmdlIG9mIHZhbGlkIGNvbGxlY3Rpb24gZW50cnkga2V5cy5cbiAqL1xuY29uc3QgICAgICAgIHBhc3NTdHlsZVByZWZpeGVzPWhhcmRlbih7XG5fX3Byb3RvX186bnVsbCxcbmVycm9yOichJyxcbmNvcHlSZWNvcmQ6JygnLFxudGFnZ2VkOic6JyxcbnByb21pc2U6Jz8nLFxuY29weUFycmF5OidbJyxcbmJvb2xlYW46J2InLFxubnVtYmVyOidmJyxcbmJpZ2ludDonbnAnLFxucmVtb3RhYmxlOidyJyxcbnN0cmluZzoncycsXG5udWxsOid2JyxcbnN5bWJvbDoneScsXG51bmRlZmluZWQ6J3onfSk7JGjigI1fb25jZS5wYXNzU3R5bGVQcmVmaXhlcyhwYXNzU3R5bGVQcmVmaXhlcyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicmVjb3JkTmFtZXMiOlsicmVjb3JkTmFtZXMiXSwicmVjb3JkVmFsdWVzIjpbInJlY29yZFZhbHVlcyJdLCJ6ZXJvUGFkIjpbInplcm9QYWQiXSwibWFrZUVuY29kZVBhc3NhYmxlIjpbIm1ha2VFbmNvZGVQYXNzYWJsZSJdLCJtYWtlRGVjb2RlUGFzc2FibGUiOlsibWFrZURlY29kZVBhc3NhYmxlIl0sImlzRW5jb2RlZFJlbW90YWJsZSI6WyJpc0VuY29kZWRSZW1vdGFibGUiXSwicGFzc1N0eWxlUHJlZml4ZXMiOlsicGFzc1N0eWxlUHJlZml4ZXMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAALzWfSUyAAAlMgAANAAAAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9wYXR0ZXJucy9pbnRlcmZhY2UtdG9vbHMuanN7ImltcG9ydHMiOlsiLi9wYXR0ZXJuTWF0Y2hlcnMuanMiLCJAYWdvcmljL2ludGVybmFsIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJkZWZlbmRQcm90b3R5cGUiLCJkZWZlbmRQcm90b3R5cGVLaXQiLCJkZWZpbmVIZWFwRmFyQ2xhc3MiLCJkZWZpbmVIZWFwRmFyQ2xhc3NLaXQiLCJpbml0RW1wdHkiLCJtYWtlSGVhcEZhckluc3RhbmNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEZhcixFLGxpc3REaWZmZXJlbmNlLG9iamVjdE1hcCxmaXQsTTskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWxcIiwgW1tcImxpc3REaWZmZXJlbmNlXCIsIFskaOKAjV9hID0+IChsaXN0RGlmZmVyZW5jZSA9ICRo4oCNX2EpXV0sW1wib2JqZWN0TWFwXCIsIFskaOKAjV9hID0+IChvYmplY3RNYXAgPSAkaOKAjV9hKV1dXV0sW1wiLi9wYXR0ZXJuTWF0Y2hlcnMuanNcIiwgW1tcImZpdFwiLCBbJGjigI1fYSA9PiAoZml0ID0gJGjigI1fYSldXSxbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuY29uc3R7cXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5jb25zdHthcHBseSxvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7ZGVmaW5lUHJvcGVydGllcyxzZWFsLGZyZWV6ZX09T2JqZWN0O1xuXG5jb25zdCBkZWZlbmRTeW5jQXJncz0oYXJncyxtZXRob2RHdWFyZCxsYWJlbCk9PntcbmNvbnN0e2FyZ0d1YXJkcyxvcHRpb25hbEFyZ0d1YXJkcyxyZXN0QXJnR3VhcmR9PW1ldGhvZEd1YXJkO1xuY29uc3QgcGFyYW1zUGF0dGVybj1NLnNwbGl0QXJyYXkoXG5hcmdHdWFyZHMsXG5vcHRpb25hbEFyZ0d1YXJkcyxcbnJlc3RBcmdHdWFyZCk7XG5cbmZpdChoYXJkZW4oYXJncykscGFyYW1zUGF0dGVybixsYWJlbCk7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge01ldGhvZH0gbWV0aG9kXG4gKiBAcGFyYW0ge01ldGhvZEd1YXJkfSBtZXRob2RHdWFyZFxuICogQHBhcmFtIHtzdHJpbmd9IGxhYmVsXG4gKiBAcmV0dXJucyB7TWV0aG9kfVxuICovXG5jb25zdCBkZWZlbmRTeW5jTWV0aG9kPShtZXRob2QsbWV0aG9kR3VhcmQsbGFiZWwpPT57XG5jb25zdHtyZXR1cm5HdWFyZH09bWV0aG9kR3VhcmQ7XG5jb25zdHtzeW5jTWV0aG9kfT17XG4vKiBOb3RlIHB1cnBvc2VmdWwgdXNlIG9mIGB0aGlzYCBhbmQgY29uY2lzZSBtZXRob2Qgc3ludGF4Ki9cbnN5bmNNZXRob2QoLi4uYXJncyl7XG5kZWZlbmRTeW5jQXJncyhoYXJkZW4oYXJncyksbWV0aG9kR3VhcmQsbGFiZWwpO1xuY29uc3QgcmVzdWx0PWFwcGx5KG1ldGhvZCx0aGlzLGFyZ3MpO1xuZml0KGhhcmRlbihyZXN1bHQpLHJldHVybkd1YXJkLCBgJHtsYWJlbH06IHJlc3VsdGApO1xucmV0dXJuIHJlc3VsdDtcbiB9fTtcblxucmV0dXJuIHN5bmNNZXRob2Q7XG4gfTtcblxuY29uc3QgaXNBd2FpdEFyZ0d1YXJkPShhcmdHdWFyZCk9PlxuYXJnR3VhcmQmJnR5cGVvZiBhcmdHdWFyZD09PSdvYmplY3QnJiZhcmdHdWFyZC5rbGFzcz09PSdhd2FpdEFyZyc7XG5cbmNvbnN0IGRlc3luYz0obWV0aG9kR3VhcmQpPT57XG5jb25zdHthcmdHdWFyZHMsb3B0aW9uYWxBcmdHdWFyZHM9W10scmVzdEFyZ0d1YXJkfT1tZXRob2RHdWFyZDtcbiFpc0F3YWl0QXJnR3VhcmQocmVzdEFyZ0d1YXJkKXx8XG5GYWlsIGBSZXN0IGFyZ3MgbWF5IG5vdCBiZSBhd2FpdGVkOiAke3Jlc3RBcmdHdWFyZH1gO1xuY29uc3QgcmF3QXJnR3VhcmRzPVsuLi5hcmdHdWFyZHMsLi4ub3B0aW9uYWxBcmdHdWFyZHNdO1xuXG5jb25zdCBhd2FpdEluZGV4ZXM9W107XG5mb3IobGV0IGk9MDtpPHJhd0FyZ0d1YXJkcy5sZW5ndGg7aSs9MSl7XG5jb25zdCBhcmdHdWFyZD1yYXdBcmdHdWFyZHNbaV07XG5pZihpc0F3YWl0QXJnR3VhcmQoYXJnR3VhcmQpKXtcbnJhd0FyZ0d1YXJkc1tpXT1hcmdHdWFyZC5hcmdHdWFyZDtcbmF3YWl0SW5kZXhlcy5wdXNoKGkpO1xuIH1cbiB9XG5yZXR1cm57XG5hd2FpdEluZGV4ZXMsXG5yYXdNZXRob2RHdWFyZDp7XG5hcmdHdWFyZHM6cmF3QXJnR3VhcmRzLnNsaWNlKDAsYXJnR3VhcmRzLmxlbmd0aCksXG5vcHRpb25hbEFyZ0d1YXJkczpyYXdBcmdHdWFyZHMuc2xpY2UoYXJnR3VhcmRzLmxlbmd0aCksXG5yZXN0QXJnR3VhcmR9fTtcblxuXG4gfTtcblxuY29uc3QgZGVmZW5kQXN5bmNNZXRob2Q9KG1ldGhvZCxtZXRob2RHdWFyZCxsYWJlbCk9PntcbmNvbnN0e3JldHVybkd1YXJkfT1tZXRob2RHdWFyZDtcbmNvbnN0e2F3YWl0SW5kZXhlcyxyYXdNZXRob2RHdWFyZH09ZGVzeW5jKG1ldGhvZEd1YXJkKTtcbmNvbnN0e2FzeW5jTWV0aG9kfT17XG4vKiBOb3RlIHB1cnBvc2VmdWwgdXNlIG9mIGB0aGlzYCBhbmQgY29uY2lzZSBtZXRob2Qgc3ludGF4Ki9cbmFzeW5jTWV0aG9kKC4uLmFyZ3Mpe1xuY29uc3QgYXdhaXRMaXN0PWF3YWl0SW5kZXhlcy5tYXAoKGkpPT5hcmdzW2ldKTtcbmNvbnN0IHA9UHJvbWlzZS5hbGwoYXdhaXRMaXN0KTtcbmNvbnN0IHJhd0FyZ3M9Wy4uLmFyZ3NdO1xuY29uc3QgcmVzdWx0UD1FLndoZW4ocCwoYXdhaXRlZEFyZ3MpPT57XG5mb3IobGV0IGo9MDtqPGF3YWl0SW5kZXhlcy5sZW5ndGg7ais9MSl7XG5yYXdBcmdzW2F3YWl0SW5kZXhlc1tqXV09YXdhaXRlZEFyZ3Nbal07XG4gfVxuZGVmZW5kU3luY0FyZ3MocmF3QXJncyxyYXdNZXRob2RHdWFyZCxsYWJlbCk7XG5yZXR1cm4gYXBwbHkobWV0aG9kLHRoaXMscmF3QXJncyk7XG4gfSk7XG5yZXR1cm4gRS53aGVuKHJlc3VsdFAsKHJlc3VsdCk9PntcbmZpdChoYXJkZW4ocmVzdWx0KSxyZXR1cm5HdWFyZCwgYCR7bGFiZWx9OiByZXN1bHRgKTtcbnJldHVybiByZXN1bHQ7XG4gfSk7XG4gfX07XG5cbnJldHVybiBhc3luY01ldGhvZDtcbiB9O1xuXG4vKipcbiAqXG4gKiBAcGFyYW0ge01ldGhvZH0gbWV0aG9kXG4gKiBAcGFyYW0ge01ldGhvZEd1YXJkfSBtZXRob2RHdWFyZFxuICogQHBhcmFtIHtzdHJpbmd9IGxhYmVsXG4gKi9cbmNvbnN0IGRlZmVuZE1ldGhvZD0obWV0aG9kLG1ldGhvZEd1YXJkLGxhYmVsKT0+e1xuY29uc3R7a2xhc3MsY2FsbEtpbmR9PW1ldGhvZEd1YXJkO1xuYXNzZXJ0KGtsYXNzPT09J21ldGhvZEd1YXJkJyk7XG5pZihjYWxsS2luZD09PSdzeW5jJyl7XG5yZXR1cm4gZGVmZW5kU3luY01ldGhvZChtZXRob2QsbWV0aG9kR3VhcmQsbGFiZWwpO1xuIH1lbHNle1xuYXNzZXJ0KGNhbGxLaW5kPT09J2FzeW5jJyk7XG5yZXR1cm4gZGVmZW5kQXN5bmNNZXRob2QobWV0aG9kLG1ldGhvZEd1YXJkLGxhYmVsKTtcbiB9XG4gfTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZFRhZ1xuICogQHBhcmFtIHtXZWFrTWFwfSBjb250ZXh0TWFwXG4gKiBAcGFyYW0ge0NhbGxhYmxlRnVuY3Rpb259IGJlaGF2aW9yTWV0aG9kXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFt0aGlzZnVsTWV0aG9kc11cbiAqIEBwYXJhbSB7TWV0aG9kR3VhcmR9IFttZXRob2RHdWFyZF1cbiAqL1xuY29uc3QgYmluZE1ldGhvZD0oXG5tZXRob2RUYWcsXG5jb250ZXh0TWFwLFxuYmVoYXZpb3JNZXRob2QsXG50aGlzZnVsTWV0aG9kcz1mYWxzZSxcbm1ldGhvZEd1YXJkPXVuZGVmaW5lZCk9Plxue1xuYXNzZXJ0LnR5cGVvZihiZWhhdmlvck1ldGhvZCwnZnVuY3Rpb24nKTtcblxuY29uc3QgZ2V0Q29udGV4dD0oc2VsZik9PntcbmNvbnN0IGNvbnRleHQ9Y29udGV4dE1hcC5nZXQoc2VsZik7XG5jb250ZXh0fHxcbkZhaWwgYCR7cShtZXRob2RUYWcpfSBtYXkgb25seSBiZSBhcHBsaWVkIHRvIGEgdmFsaWQgaW5zdGFuY2U6ICR7c2VsZn1gO1xucmV0dXJuIGNvbnRleHQ7XG4gfTtcblxuLyogVmlvbGF0aW5nIGFsbCBKZXNzaWUgcnVsZXMgdG8gY3JlYXRlIHJlcHJlc2VudGF0aXZlcyB0aGF0IGluaGVyaXQqL1xuLyogbWV0aG9kcyBmcm9tIGEgc2hhcmVkIHByb3RvdHlwZS4gVGhlIGJvdW5kIG1ldGhvZCB0aGVyZWZvcmUgbmVlZHMqL1xuLyogdG8gbWVudGlvbiBgdGhpc2AuIFdlIGRlZmluZSBpdCB1c2luZyBjb25jaXNlIG1ldGhvZCBzeW50YXgqL1xuLyogc28gdGhhdCBpdCB3aWxsIGJlIGB0aGlzYCBzZW5zaXRpdmUgYnV0IG5vdCBjb25zdHJ1Y3RhYmxlLiovXG4vKiovXG4vKiBXZSBub3JtYWxseSBjb25zaWRlciBgdGhpc2AgdW5zYWZlIGJlY2F1c2Ugb2YgdGhlIGhhemFyZCBvZiBhKi9cbi8qIG1ldGhvZCBvZiBvbmUgYWJzdHJhY3Rpb24gYmVpbmcgYXBwbGllZCB0byBhbiBpbnN0YW5jZSBvZiovXG4vKiBhbm90aGVyIGFic3RyYWN0aW9uLiBUbyBwcmV2ZW50IHRoYXQgYXR0YWNrLCB0aGUgYm91bmQgbWV0aG9kKi9cbi8qIGNoZWNrcyB0aGF0IGl0cyBgdGhpc2AgaXMgaW4gdGhlIG1hcCBpbiB3aGljaCBpdHMgcmVwcmVzZW50YXRpdmVzKi9cbi8qIGFyZSByZWdpc3RlcmVkLiovXG5sZXR7bWV0aG9kfT10aGlzZnVsTWV0aG9kcz9cbntcbm1ldGhvZCguLi5hcmdzKXtcbmNvbnN0IGNvbnRleHQ9Z2V0Q29udGV4dCh0aGlzKTtcbnJldHVybiBhcHBseShiZWhhdmlvck1ldGhvZCxjb250ZXh0LGFyZ3MpO1xuIH19OlxuXG57XG5tZXRob2QoLi4uYXJncyl7XG5jb25zdCBjb250ZXh0PWdldENvbnRleHQodGhpcyk7XG5yZXR1cm4gYXBwbHkoYmVoYXZpb3JNZXRob2QsbnVsbCxbY29udGV4dCwuLi5hcmdzXSk7XG4gfX07XG5cbmlmKG1ldGhvZEd1YXJkKXtcbm1ldGhvZD1kZWZlbmRNZXRob2QobWV0aG9kLG1ldGhvZEd1YXJkLG1ldGhvZFRhZyk7XG4gfVxuZGVmaW5lUHJvcGVydGllcyhtZXRob2Qse1xubmFtZTp7dmFsdWU6bWV0aG9kVGFnfSxcbmxlbmd0aDp7XG52YWx1ZTp0aGlzZnVsTWV0aG9kcz9iZWhhdmlvck1ldGhvZC5sZW5ndGg6YmVoYXZpb3JNZXRob2QubGVuZ3RoLTF9fSk7XG5cblxucmV0dXJuIG1ldGhvZDtcbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgQ2FsbGFibGVGdW5jdGlvbj59IFRcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEBwYXJhbSB7V2Vha01hcH0gY29udGV4dE1hcFxuICogQHBhcmFtIHtUfSBiZWhhdmlvck1ldGhvZHNcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3RoaXNmdWxNZXRob2RzXVxuICogQHBhcmFtIHtJbnRlcmZhY2VHdWFyZH0gW2ludGVyZmFjZUd1YXJkXVxuICogQHJldHVybnMge1QgJiBYaW1wb3J0KCdAZW5kby9ldmVudHVhbC1zZW5kJykuUmVtb3RhYmxlQnJhbmQ8e30sIFQ+fVxuICovXG5jb25zdCAgICAgICAgZGVmZW5kUHJvdG90eXBlPShcbnRhZyxcbmNvbnRleHRNYXAsXG5iZWhhdmlvck1ldGhvZHMsXG50aGlzZnVsTWV0aG9kcz1mYWxzZSxcbmludGVyZmFjZUd1YXJkPXVuZGVmaW5lZCk9Plxue1xuY29uc3QgcHJvdG90eXBlPXt9O1xuY29uc3QgbWV0aG9kTmFtZXM9b3duS2V5cyhiZWhhdmlvck1ldGhvZHMpLmZpbHRlcihcbi8qIEJ5IGlnbm9yaW5nIGFueSBtZXRob2QgbmFtZWQgXCJjb25zdHJ1Y3RvclwiLCB3ZSBjYW4gdXNlIGEqL1xuLyogY2xhc3MucHJvdG90eXBlIGFzIGEgYmVoYXZpb3JNZXRob2RzLiovXG4obmFtZSk9Pm5hbWUhPT0nY29uc3RydWN0b3InKTtcblxubGV0IG1ldGhvZEd1YXJkcztcbmlmKGludGVyZmFjZUd1YXJkKXtcbmNvbnN0e1xua2xhc3MsXG5pbnRlcmZhY2VOYW1lLFxubWV0aG9kR3VhcmRzOm1nLFxuc2xvcHB5PWZhbHNlfT1cbmludGVyZmFjZUd1YXJkO1xubWV0aG9kR3VhcmRzPW1nO1xuYXNzZXJ0LmVxdWFsKGtsYXNzLCdJbnRlcmZhY2UnKTtcbmFzc2VydC50eXBlb2YoaW50ZXJmYWNlTmFtZSwnc3RyaW5nJyk7XG57XG5jb25zdCBtZXRob2RHdWFyZE5hbWVzPW93bktleXMobWV0aG9kR3VhcmRzKTtcbmNvbnN0IHVuaW1wbGVtZW50ZWQ9bGlzdERpZmZlcmVuY2UobWV0aG9kR3VhcmROYW1lcyxtZXRob2ROYW1lcyk7XG51bmltcGxlbWVudGVkLmxlbmd0aD09PTB8fFxuRmFpbCBgbWV0aG9kcyAke3EodW5pbXBsZW1lbnRlZCl9IG5vdCBpbXBsZW1lbnRlZCBieSAke3EodGFnKX1gO1xuaWYoIXNsb3BweSl7XG5jb25zdCB1bmd1YXJkZWQ9bGlzdERpZmZlcmVuY2UobWV0aG9kTmFtZXMsbWV0aG9kR3VhcmROYW1lcyk7XG51bmd1YXJkZWQubGVuZ3RoPT09MHx8XG5GYWlsIGBtZXRob2RzICR7cSh1bmd1YXJkZWQpfSBub3QgZ3VhcmRlZCBieSAke3EoaW50ZXJmYWNlTmFtZSl9YDtcbiB9XG4gfVxuIH1cbmZvcihjb25zdCBwcm9wIG9mIG1ldGhvZE5hbWVzKXtcbnByb3RvdHlwZVtwcm9wXT1iaW5kTWV0aG9kKFxuIGBJbiAke3EocHJvcCl9IG1ldGhvZCBvZiAoJHt0YWd9KWAsXG5jb250ZXh0TWFwLFxuYmVoYXZpb3JNZXRob2RzW3Byb3BdLFxudGhpc2Z1bE1ldGhvZHMsXG4vKiBUT0RPIHNvbWUgdG9vbCBkb2VzIG5vdCB5ZXQgdW5kZXJzdGFuZCB0aGUgYD8uW2Agc3ludGF4Ki9cbm1ldGhvZEd1YXJkcyYmbWV0aG9kR3VhcmRzW3Byb3BdKTtcblxuIH1cbi8qIEB0cy1leHBlY3QtZXJyb3IgY291bGQgYmUgaW5zdGFudGlhdGVkIHdpdGggZGlmZmVyZW50IHN1YnR5cGUqL1xucmV0dXJuIEZhcih0YWcscHJvdG90eXBlKTtcbiB9OyRo4oCNX29uY2UuZGVmZW5kUHJvdG90eXBlKGRlZmVuZFByb3RvdHlwZSk7XG5oYXJkZW4oZGVmZW5kUHJvdG90eXBlKTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIFdlYWtNYXA+fSBjb250ZXh0TWFwS2l0XG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcgfCBzeW1ib2wsIENhbGxhYmxlRnVuY3Rpb24+Pn0gYmVoYXZpb3JNZXRob2RzS2l0XG4gKiBAcGFyYW0ge2Jvb2xlYW59IFt0aGlzZnVsTWV0aG9kc11cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgSW50ZXJmYWNlR3VhcmQ+fSBbaW50ZXJmYWNlR3VhcmRLaXRdXG4gKi9cbmNvbnN0ICAgICAgICBkZWZlbmRQcm90b3R5cGVLaXQ9KFxudGFnLFxuY29udGV4dE1hcEtpdCxcbmJlaGF2aW9yTWV0aG9kc0tpdCxcbnRoaXNmdWxNZXRob2RzPWZhbHNlLFxuaW50ZXJmYWNlR3VhcmRLaXQ9dW5kZWZpbmVkKT0+XG57XG5jb25zdCBmYWNldE5hbWVzPW93bktleXMoYmVoYXZpb3JNZXRob2RzS2l0KS5zb3J0KCk7XG5mYWNldE5hbWVzLmxlbmd0aD4xfHxGYWlsIGBBIG11bHRpLWZhY2V0IG9iamVjdCBtdXN0IGhhdmUgbXVsdGlwbGUgZmFjZXRzYDtcbmlmKGludGVyZmFjZUd1YXJkS2l0KXtcbmNvbnN0IGludGVyZmFjZU5hbWVzPW93bktleXMoaW50ZXJmYWNlR3VhcmRLaXQpO1xuY29uc3QgZXh0cmFJbnRlcmZhY2VOYW1lcz1saXN0RGlmZmVyZW5jZShmYWNldE5hbWVzLGludGVyZmFjZU5hbWVzKTtcbmV4dHJhSW50ZXJmYWNlTmFtZXMubGVuZ3RoPT09MHx8XG5GYWlsIGBJbnRlcmZhY2VzICR7cShleHRyYUludGVyZmFjZU5hbWVzKX0gbm90IGltcGxlbWVudGVkIGJ5ICR7cSh0YWcpfWA7XG5jb25zdCBleHRyYUZhY2V0TmFtZXM9bGlzdERpZmZlcmVuY2UoaW50ZXJmYWNlTmFtZXMsZmFjZXROYW1lcyk7XG5leHRyYUZhY2V0TmFtZXMubGVuZ3RoPT09MHx8XG5GYWlsIGBGYWNldHMgJHtxKGV4dHJhRmFjZXROYW1lcyl9IG9mICR7cSh0YWcpfSBub3QgZ3VhcmRlZCBieSBpbnRlcmZhY2VzYDtcbiB9XG5jb25zdCBjb250ZXh0TWFwTmFtZXM9b3duS2V5cyhjb250ZXh0TWFwS2l0KTtcbmNvbnN0IGV4dHJhQ29udGV4dE5hbWVzPWxpc3REaWZmZXJlbmNlKGZhY2V0TmFtZXMsY29udGV4dE1hcE5hbWVzKTtcbmV4dHJhQ29udGV4dE5hbWVzLmxlbmd0aD09PTB8fFxuRmFpbCBgQ29udGV4dHMgJHtxKGV4dHJhQ29udGV4dE5hbWVzKX0gbm90IGltcGxlbWVudGVkIGJ5ICR7cSh0YWcpfWA7XG5jb25zdCBleHRyYUZhY2V0TmFtZXM9bGlzdERpZmZlcmVuY2UoY29udGV4dE1hcE5hbWVzLGZhY2V0TmFtZXMpO1xuZXh0cmFGYWNldE5hbWVzLmxlbmd0aD09PTB8fFxuRmFpbCBgRmFjZXRzICR7cShleHRyYUZhY2V0TmFtZXMpfSBvZiAke3EodGFnKX0gbWlzc2luZyBjb250ZXh0c2A7XG5yZXR1cm4gb2JqZWN0TWFwKGJlaGF2aW9yTWV0aG9kc0tpdCwoYmVoYXZpb3JNZXRob2RzLGZhY2V0TmFtZSk9PlxuZGVmZW5kUHJvdG90eXBlKFxuIGAke3RhZ30gJHtmYWNldE5hbWV9YCxcbmNvbnRleHRNYXBLaXRbZmFjZXROYW1lXSxcbmJlaGF2aW9yTWV0aG9kcyxcbnRoaXNmdWxNZXRob2RzLFxuaW50ZXJmYWNlR3VhcmRLaXQmJmludGVyZmFjZUd1YXJkS2l0W2ZhY2V0TmFtZV0pKTtcblxuXG4gfTskaOKAjV9vbmNlLmRlZmVuZFByb3RvdHlwZUtpdChkZWZlbmRQcm90b3R5cGVLaXQpO1xuXG5jb25zdCBlbXB0eVJlY29yZD1oYXJkZW4oe30pO1xuXG4vKipcbiAqIFdoZW4gY2FsbGluZyBgZGVmaW5lRHVyYWJsZUtpbmRgIGFuZFxuICogaXRzIHNpYmxpbmdzLCB1c2VkIGFzIHRoZSBgaW5pdGAgZnVuY3Rpb24gYXJndW1lbnQgdG8gaW5kaWNhdGUgdGhhdCB0aGVcbiAqIHN0YXRlIHJlY29yZCBvZiB0aGUgKHZpcnR1YWwvZHVyYWJsZSkgaW5zdGFuY2VzIG9mIHRoZSBraW5kL2ZhckNsYXNzXG4gKiBzaG91bGQgYmUgZW1wdHksIGFuZCB0aGF0IHRoZSByZXR1cm5lZCBtYWtlciBmdW5jdGlvbiBzaG91bGQgaGF2ZSB6ZXJvXG4gKiBwYXJhbWV0ZXJzLlxuICpcbiAqIEByZXR1cm5zIHt7fX1cbiAqL1xuY29uc3QgICAgICAgIGluaXRFbXB0eT0oKT0+ZW1wdHlSZWNvcmQ7XG5cbi8qKlxuICogQHRlbXBsYXRlIFtTID0gYW55XVxuICogQHRlbXBsYXRlIFtUID0gYW55XVxuICogQHR5cGVkZWYge29iamVjdH0gQ29udGV4dFxuICogQHByb3BlcnR5IHtTfSBzdGF0ZVxuICogQHByb3BlcnR5IHtUfSBzZWxmXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgQSBhcmdzIHRvIGluaXRcbiAqIEB0ZW1wbGF0ZSBTIHN0YXRlIGZyb20gaW5pdFxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCBDYWxsYWJsZUZ1bmN0aW9uPn0gVCBtZXRob2RzXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gKiBAcGFyYW0ge2FueX0gaW50ZXJmYWNlR3VhcmRcbiAqIEBwYXJhbSB7KC4uLmFyZ3M6IEFbXSkgPT4gU30gaW5pdFxuICogQHBhcmFtIHtUICYgVGhpc1R5cGU8eyBzZWxmOiBULCBzdGF0ZTogUyB9Pn0gbWV0aG9kc1xuICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXVxuICogQHJldHVybnMgeyguLi5hcmdzOiBBW10pID0+IChUICYgWGltcG9ydCgnQGVuZG8vZXZlbnR1YWwtc2VuZCcpLlJlbW90YWJsZUJyYW5kPHt9LCBUPil9XG4gKi8kaOKAjV9vbmNlLmluaXRFbXB0eShpbml0RW1wdHkpO1xuY29uc3QgICAgICAgIGRlZmluZUhlYXBGYXJDbGFzcz0oXG50YWcsXG5pbnRlcmZhY2VHdWFyZCxcbmluaXQsXG5tZXRob2RzLFxub3B0aW9ucz11bmRlZmluZWQpPT5cbntcbi8qKiBAdHlwZSB7V2Vha01hcDxULENvbnRleHQ8UywgVD4+fSAqL1xuY29uc3QgY29udGV4dE1hcD1uZXcgV2Vha01hcCgpO1xuY29uc3QgcHJvdG90eXBlPWRlZmVuZFByb3RvdHlwZShcbnRhZyxcbmNvbnRleHRNYXAsXG5tZXRob2RzLFxudHJ1ZSxcbmludGVyZmFjZUd1YXJkKTtcblxuY29uc3QgbWFrZUluc3RhbmNlPSguLi5hcmdzKT0+e1xuLyogQmUgY2FyZWZ1bCBub3QgdG8gZnJlZXplIHRoZSBzdGF0ZSByZWNvcmQqL1xuY29uc3Qgc3RhdGU9c2VhbChpbml0KC4uLmFyZ3MpKTtcbi8qKiBAdHlwZSB7VH0gKi9cbi8qIEB0cy1leHBlY3QtZXJyb3IgY291bGQgYmUgaW5zdGFudGlhdGVkIHdpdGggZGlmZmVyZW50IHN1YnR5cGUqL1xuY29uc3Qgc2VsZj1oYXJkZW4oe19fcHJvdG9fXzpwcm90b3R5cGV9KTtcbi8qIEJlIGNhcmVmdWwgbm90IHRvIGZyZWV6ZSB0aGUgc3RhdGUgcmVjb3JkKi9cbi8qKiBAdHlwZSB7Q29udGV4dDxTLFQ+fSAqL1xuY29uc3QgY29udGV4dD1mcmVlemUoe3N0YXRlLHNlbGZ9KTtcbmNvbnRleHRNYXAuc2V0KHNlbGYsY29udGV4dCk7XG5pZihvcHRpb25zKXtcbmNvbnN0e2ZpbmlzaD11bmRlZmluZWR9PW9wdGlvbnM7XG5pZihmaW5pc2gpe1xuZmluaXNoKGNvbnRleHQpO1xuIH1cbiB9XG5yZXR1cm4gc2VsZjtcbiB9O1xuLyogQHRzLWV4cGVjdC1lcnJvciBjb3VsZCBiZSBpbnN0YW50aWF0ZWQgd2l0aCBkaWZmZXJlbnQgc3VidHlwZSovXG5yZXR1cm4gaGFyZGVuKG1ha2VJbnN0YW5jZSk7XG4gfTskaOKAjV9vbmNlLmRlZmluZUhlYXBGYXJDbGFzcyhkZWZpbmVIZWFwRmFyQ2xhc3MpO1xuaGFyZGVuKGRlZmluZUhlYXBGYXJDbGFzcyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEEgYXJncyB0byBpbml0XG4gKiBAdGVtcGxhdGUgUyBzdGF0ZSBmcm9tIGluaXRcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgQ2FsbGFibGVGdW5jdGlvbj4+fSBGIG1ldGhvZHNcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEBwYXJhbSB7YW55fSBpbnRlcmZhY2VHdWFyZEtpdFxuICogQHBhcmFtIHsoLi4uYXJnczogQVtdKSA9PiBTfSBpbml0XG4gKiBAcGFyYW0ge0YgJiBUaGlzVHlwZTx7IGZhY2V0czogRiwgc3RhdGU6IFMgfT4gfSBtZXRob2RzS2l0XG4gKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7KC4uLmFyZ3M6IEFbXSkgPT4gRn1cbiAqL1xuY29uc3QgICAgICAgIGRlZmluZUhlYXBGYXJDbGFzc0tpdD0oXG50YWcsXG5pbnRlcmZhY2VHdWFyZEtpdCxcbmluaXQsXG5tZXRob2RzS2l0LFxub3B0aW9ucz11bmRlZmluZWQpPT5cbntcbmNvbnN0IGNvbnRleHRNYXBLaXQ9b2JqZWN0TWFwKG1ldGhvZHNLaXQsKCk9Pm5ldyBXZWFrTWFwKCkpO1xuY29uc3QgcHJvdG90eXBlS2l0PWRlZmVuZFByb3RvdHlwZUtpdChcbnRhZyxcbmNvbnRleHRNYXBLaXQsXG5tZXRob2RzS2l0LFxudHJ1ZSxcbmludGVyZmFjZUd1YXJkS2l0KTtcblxuY29uc3QgbWFrZUluc3RhbmNlS2l0PSguLi5hcmdzKT0+e1xuLyogQmUgY2FyZWZ1bCBub3QgdG8gZnJlZXplIHRoZSBzdGF0ZSByZWNvcmQqL1xuY29uc3Qgc3RhdGU9c2VhbChpbml0KC4uLmFyZ3MpKTtcbi8qIERvbid0IGZyZWV6ZSBjb250ZXh0IHVudGlsIHdlIGFkZCBmYWNldHMqL1xuY29uc3QgY29udGV4dD17c3RhdGV9O1xuY29uc3QgZmFjZXRzPW9iamVjdE1hcChwcm90b3R5cGVLaXQsKHByb3RvdHlwZSxmYWNldE5hbWUpPT57XG5jb25zdCBzZWxmPWhhcmRlbih7X19wcm90b19fOnByb3RvdHlwZX0pO1xuY29udGV4dE1hcEtpdFtmYWNldE5hbWVdLnNldChzZWxmLGNvbnRleHQpO1xucmV0dXJuIHNlbGY7XG4gfSk7XG5jb250ZXh0LmZhY2V0cz1mYWNldHM7XG4vKiBCZSBjYXJlZnVsIG5vdCB0byBmcmVlemUgdGhlIHN0YXRlIHJlY29yZCovXG5mcmVlemUoY29udGV4dCk7XG5pZihvcHRpb25zKXtcbmNvbnN0e2ZpbmlzaD11bmRlZmluZWR9PW9wdGlvbnM7XG5pZihmaW5pc2gpe1xuZmluaXNoKGNvbnRleHQpO1xuIH1cbiB9XG5yZXR1cm4gZmFjZXRzO1xuIH07XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci10cy1leHBlY3QtZXJyb3IgLS0gZGlmZmVyZW50IHBlciBwYWNrYWdlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNDYyMCovXG4vKiBAdHMtaWdub3JlIHh4eCovXG5yZXR1cm4gaGFyZGVuKG1ha2VJbnN0YW5jZUtpdCk7XG4gfTskaOKAjV9vbmNlLmRlZmluZUhlYXBGYXJDbGFzc0tpdChkZWZpbmVIZWFwRmFyQ2xhc3NLaXQpO1xuaGFyZGVuKGRlZmluZUhlYXBGYXJDbGFzc0tpdCk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nLCBNZXRob2Q+fSBUXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gKiBAcGFyYW0ge0ludGVyZmFjZUd1YXJkIHwgdW5kZWZpbmVkfSBpbnRlcmZhY2VHdWFyZCBDQVZFQVQ6IHN0YXRpYyB0eXBpbmcgZG9lcyBub3QgeWV0IHN1cHBvcnQgYGNhbGxXaGVuYCB0cmFuc2Zvcm1hdGlvblxuICogQHBhcmFtIHtUfSBtZXRob2RzXG4gKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7VCAmIFhpbXBvcnQoJ0BlbmRvL2V2ZW50dWFsLXNlbmQnKS5SZW1vdGFibGVCcmFuZDx7fSwgVD59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlSGVhcEZhckluc3RhbmNlPShcbnRhZyxcbmludGVyZmFjZUd1YXJkLFxubWV0aG9kcyxcbm9wdGlvbnM9dW5kZWZpbmVkKT0+XG57XG5jb25zdCBtYWtlSW5zdGFuY2U9ZGVmaW5lSGVhcEZhckNsYXNzKFxudGFnLFxuaW50ZXJmYWNlR3VhcmQsXG5pbml0RW1wdHksXG5tZXRob2RzLFxub3B0aW9ucyk7XG5cbnJldHVybiBtYWtlSW5zdGFuY2UoKTtcbiB9OyRo4oCNX29uY2UubWFrZUhlYXBGYXJJbnN0YW5jZShtYWtlSGVhcEZhckluc3RhbmNlKTtcbmhhcmRlbihtYWtlSGVhcEZhckluc3RhbmNlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZlbmRQcm90b3R5cGUiOlsiZGVmZW5kUHJvdG90eXBlIl0sImRlZmVuZFByb3RvdHlwZUtpdCI6WyJkZWZlbmRQcm90b3R5cGVLaXQiXSwiaW5pdEVtcHR5IjpbImluaXRFbXB0eSJdLCJkZWZpbmVIZWFwRmFyQ2xhc3MiOlsiZGVmaW5lSGVhcEZhckNsYXNzIl0sImRlZmluZUhlYXBGYXJDbGFzc0tpdCI6WyJkZWZpbmVIZWFwRmFyQ2xhc3NLaXQiXSwibWFrZUhlYXBGYXJJbnN0YW5jZSI6WyJtYWtlSGVhcEZhckluc3RhbmNlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKJ1R3y1BwAAtQcAADMAAABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvcGF0dGVybnMvaW50ZXJuYWwtdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG4vKiBUT0RPKi9cbi8qIFRoZSBmb2xsb3dpbmcgY29tbWVudGVkIG91dCB0eXBlIHNob3VsZCBiZSBpbiB0aGlzIGZpbGUsIHNpbmNlIHRoZSovXG4vKiBgTWF0Y2hIZWxwZXJgIHR5cGUgaXMgcHVyZWx5IGludGVybmFsIHRvIHRoaXMgcGFja2FnZS4gSG93ZXZlciwqL1xuLyogaW4gb3JkZXIgdG8gZ2V0IHRoZSBnb3Zlcm5hbmNlIGFuZCBzb2xvIHBhY2thZ2VzIGJvdGggdG8gcGFzcyBsaW50LCovXG4vKiBJIG1vdmVkIHRoZSB0eXBlIGRlY2xhcmF0aW9uIGl0c2VsZiB0byB0eXBlcy5qcy4gU2VlIHRoZSBjb21tZW50cyB0aGVyZSovXG4vKiBhbmQgaW4gZXhwb3J0cy5qcyovXG5cbi8qIC8qKiovXG4vKiAqIEB0eXBlZGVmIHtvYmplY3R9IE1hdGNoSGVscGVyKi9cbi8qICogVGhpcyBmYWN0b3JzIG91dCBvbmx5IHRoZSBwYXJ0cyBzcGVjaWZpYyB0byBlYWNoIGtpbmQgb2YgTWF0Y2hlci4gSXQgaXMqL1xuLyogKiBlbmNhcHN1bGF0ZWQsIGFuZCBpdHMgbWV0aG9kcyBjYW4gbWFrZSB0aGUgc3RhdGVkIHVuY2hlY2tlciBhc3N1bXB0aW9ucyovXG4vKiAqIGVuZm9yY2VkIGJ5IHRoZSBjb21tb24gY2FsbGluZyBsb2dpYy4qL1xuLyogKiovXG4vKiAqIEBwcm9wZXJ0eSB7KGFsbGVnZWRQYXlsb2FkOiBQYXNzYWJsZSwqL1xuLyogKiAgICAgICAgICAgICBjaGVjazogQ2hlY2tlciovXG4vKiAqICkgPT4gYm9vbGVhbn0gY2hlY2tJc1dlbGxGb3JtZWQqL1xuLyogKiBBc3N1bWVzIHRoaXMgaXMgdGhlIHBheWxvYWQgb2YgYSBDb3B5VGFnZ2VkIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcqL1xuLyogKiBtYXRjaFRhZy4gSXMgdGhpcyBhIHZhbGlkIHBheWxvYWQgZm9yIGEgTWF0Y2hlciB3aXRoIHRoYXQgdGFnPyovXG4vKiAqKi9cbi8qICogQHByb3BlcnR5IHsoc3BlY2ltZW46IFBhc3NhYmxlLCovXG4vKiAqICAgICAgICAgICAgIG1hdGNoZXJQYXlsb2FkOiBQYXNzYWJsZSwqL1xuLyogKiAgICAgICAgICAgICBjaGVjazogQ2hlY2tlciovXG4vKiAqICkgPT4gYm9vbGVhbn0gY2hlY2tNYXRjaGVzKi9cbi8qICogQXNzdW1pbmcgYSB2YWxpZCBNYXRjaGVyIG9mIHRoaXMgdHlwZSB3aXRoIGBtYXRjaGVyUGF5bG9hZGAgYXMgaXRzKi9cbi8qICogcGF5bG9hZCwgZG9lcyB0aGlzIHNwZWNpbWVuIG1hdGNoIHRoYXQgTWF0Y2hlcj8qL1xuLyogKiovXG4vKiAqIEBwcm9wZXJ0eSB7KHBheWxvYWQ6IFBhc3NhYmxlKSA9PiBSYW5rQ292ZXJ9IGdldFJhbmtDb3ZlciovXG4vKiAqIEFzc3VtZXMgdGhpcyBpcyB0aGUgcGF5bG9hZCBvZiBhIENvcHlUYWdnZWQgd2l0aCB0aGUgY29ycmVzcG9uZGluZyovXG4vKiAqIG1hdGNoVGFnLiBSZXR1cm4gYSBSYW5rQ292ZXIgdG8gYm91bmQgZnJvbSBiZWxvdyBhbmQgYWJvdmUsKi9cbi8qICogaW4gcmFuayBvcmRlciwgYWxsIHBvc3NpYmxlIFBhc3NhYmxlcyB0aGF0IHdvdWxkIG1hdGNoIHRoaXMgTWF0Y2hlci4qL1xuLyogKiBUaGUgbGVmdCBlbGVtZW50IG11c3QgYmUgYmVmb3JlIG9yIHRoZSBzYW1lIHJhbmsgYXMgYW55IHBvc3NpYmxlKi9cbi8qICogbWF0Y2hpbmcgc3BlY2ltZW4uIFRoZSByaWdodCBlbGVtZW50IG11c3QgYmUgYWZ0ZXIgb3IgdGhlIHNhbWUqL1xuLyogKiByYW5rIGFzIGFueSBwb3NzaWJsZSBtYXRjaGluZyBzcGVjaW1lbi4qL1xuLyogKlgvKi9cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAGgQ69M3IAADNyAAANAAAAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanN7ImltcG9ydHMiOlsiLi4va2V5cy9jaGVja0tleS5qcyIsIi4uL2tleXMvY29tcGFyZUtleXMuanMiLCIuL2VuY29kZVBhc3NhYmxlLmpzIiwiLi9yYW5rT3JkZXIuanMiLCJAYWdvcmljL2Fzc2VydCIsIkBhZ29yaWMvaW50ZXJuYWwiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsiTSIsImFzc2VydEtleVBhdHRlcm4iLCJhc3NlcnRQYXR0ZXJuIiwiY2hlY2tNYXRjaGVzIiwiZGVmYXVsdExpbWl0cyIsImZpdCIsImdldFJhbmtDb3ZlciIsImlzS2V5UGF0dGVybiIsImlzUGF0dGVybiIsIm1hdGNoZXMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0Q2hlY2tlcixGYXIsZ2V0VGFnLG1ha2VUYWdnZWQscGFzc1N0eWxlT2YsaGFzT3duUHJvcGVydHlPZixuYW1lRm9yUGFzc2FibGVTeW1ib2wsaWRlbnRDaGVja2VyLGFwcGx5TGFiZWxpbmdFcnJvcixmcm9tVW5pcXVlRW50cmllcyxsaXN0RGlmZmVyZW5jZSxjb21wYXJlUmFuayxnZXRQYXNzU3R5bGVDb3ZlcixpbnRlcnNlY3RSYW5rQ292ZXJzLHVuaW9uUmFua0NvdmVycyxyZWNvcmROYW1lcyxyZWNvcmRWYWx1ZXMsa2V5RVEsa2V5R1Qsa2V5R1RFLGtleUxULGtleUxURSxhc3NlcnRLZXksY2hlY2tLZXksaXNLZXksY2hlY2tTY2FsYXJLZXksaXNTY2FsYXJLZXksY2hlY2tDb3B5U2V0LGNoZWNrQ29weU1hcCxjb3B5TWFwS2V5U2V0LGNoZWNrQ29weUJhZzskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXSxbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV0sW1wiZ2V0VGFnXCIsIFskaOKAjV9hID0+IChnZXRUYWcgPSAkaOKAjV9hKV1dLFtcIm1ha2VUYWdnZWRcIiwgWyRo4oCNX2EgPT4gKG1ha2VUYWdnZWQgPSAkaOKAjV9hKV1dLFtcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV0sW1wiaGFzT3duUHJvcGVydHlPZlwiLCBbJGjigI1fYSA9PiAoaGFzT3duUHJvcGVydHlPZiA9ICRo4oCNX2EpXV0sW1wibmFtZUZvclBhc3NhYmxlU3ltYm9sXCIsIFskaOKAjV9hID0+IChuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9hc3NlcnRcIiwgW1tcImlkZW50Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoaWRlbnRDaGVja2VyID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWxcIiwgW1tcImFwcGx5TGFiZWxpbmdFcnJvclwiLCBbJGjigI1fYSA9PiAoYXBwbHlMYWJlbGluZ0Vycm9yID0gJGjigI1fYSldXSxbXCJmcm9tVW5pcXVlRW50cmllc1wiLCBbJGjigI1fYSA9PiAoZnJvbVVuaXF1ZUVudHJpZXMgPSAkaOKAjV9hKV1dLFtcImxpc3REaWZmZXJlbmNlXCIsIFskaOKAjV9hID0+IChsaXN0RGlmZmVyZW5jZSA9ICRo4oCNX2EpXV1dXSxbXCIuL3JhbmtPcmRlci5qc1wiLCBbW1wiY29tcGFyZVJhbmtcIiwgWyRo4oCNX2EgPT4gKGNvbXBhcmVSYW5rID0gJGjigI1fYSldXSxbXCJnZXRQYXNzU3R5bGVDb3ZlclwiLCBbJGjigI1fYSA9PiAoZ2V0UGFzc1N0eWxlQ292ZXIgPSAkaOKAjV9hKV1dLFtcImludGVyc2VjdFJhbmtDb3ZlcnNcIiwgWyRo4oCNX2EgPT4gKGludGVyc2VjdFJhbmtDb3ZlcnMgPSAkaOKAjV9hKV1dLFtcInVuaW9uUmFua0NvdmVyc1wiLCBbJGjigI1fYSA9PiAodW5pb25SYW5rQ292ZXJzID0gJGjigI1fYSldXV1dLFtcIi4vZW5jb2RlUGFzc2FibGUuanNcIiwgW1tcInJlY29yZE5hbWVzXCIsIFskaOKAjV9hID0+IChyZWNvcmROYW1lcyA9ICRo4oCNX2EpXV0sW1wicmVjb3JkVmFsdWVzXCIsIFskaOKAjV9hID0+IChyZWNvcmRWYWx1ZXMgPSAkaOKAjV9hKV1dXV0sW1wiLi4va2V5cy9jb21wYXJlS2V5cy5qc1wiLCBbW1wia2V5RVFcIiwgWyRo4oCNX2EgPT4gKGtleUVRID0gJGjigI1fYSldXSxbXCJrZXlHVFwiLCBbJGjigI1fYSA9PiAoa2V5R1QgPSAkaOKAjV9hKV1dLFtcImtleUdURVwiLCBbJGjigI1fYSA9PiAoa2V5R1RFID0gJGjigI1fYSldXSxbXCJrZXlMVFwiLCBbJGjigI1fYSA9PiAoa2V5TFQgPSAkaOKAjV9hKV1dLFtcImtleUxURVwiLCBbJGjigI1fYSA9PiAoa2V5TFRFID0gJGjigI1fYSldXV1dLFtcIi4uL2tleXMvY2hlY2tLZXkuanNcIiwgW1tcImFzc2VydEtleVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0S2V5ID0gJGjigI1fYSldXSxbXCJjaGVja0tleVwiLCBbJGjigI1fYSA9PiAoY2hlY2tLZXkgPSAkaOKAjV9hKV1dLFtcImlzS2V5XCIsIFskaOKAjV9hID0+IChpc0tleSA9ICRo4oCNX2EpXV0sW1wiY2hlY2tTY2FsYXJLZXlcIiwgWyRo4oCNX2EgPT4gKGNoZWNrU2NhbGFyS2V5ID0gJGjigI1fYSldXSxbXCJpc1NjYWxhcktleVwiLCBbJGjigI1fYSA9PiAoaXNTY2FsYXJLZXkgPSAkaOKAjV9hKV1dLFtcImNoZWNrQ29weVNldFwiLCBbJGjigI1fYSA9PiAoY2hlY2tDb3B5U2V0ID0gJGjigI1fYSldXSxbXCJjaGVja0NvcHlNYXBcIiwgWyRo4oCNX2EgPT4gKGNoZWNrQ29weU1hcCA9ICRo4oCNX2EpXV0sW1wiY29weU1hcEtleVNldFwiLCBbJGjigI1fYSA9PiAoY29weU1hcEtleVNldCA9ICRo4oCNX2EpXV0sW1wiY2hlY2tDb3B5QmFnXCIsIFskaOKAjV9hID0+IChjaGVja0NvcHlCYWcgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG5jb25zdHtxdW90ZTpxLGRldGFpbHM6WCxGYWlsfT1hc3NlcnQ7XG5jb25zdHtlbnRyaWVzLHZhbHVlc309T2JqZWN0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcblxuLyoqIEB0eXBlIFdlYWtTZXQ8UGF0dGVybj4gKi9cbmNvbnN0IHBhdHRlcm5NZW1vPW5ldyBXZWFrU2V0KCk7XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIE1hdGNoIEhlbHBlcnMgSGVscGVycyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKiBGb3IgZm9yd2FyZCByZWZlcmVuY2VzIHRvIGBNYCAqL1xubGV0IE1NO1xuXG4vKipcbiAqIFRoZSBhY3R1YWwgZGVmYXVsdCB2YWx1ZXMgaGVyZSBhcmUsIGF0IHRoZSBwcmVzZW50IHRpbWUsIGZhaXJseVxuICogYXJiaXRyYXJ5IGNob2ljZXMgYW5kIG1heSBjaGFuZ2UgYmVmb3JlIHRoZXkgc2V0dGxlIGRvd24uIE9mIGNvdXJzZVxuICogYXQgc29tZSBwb2ludCB3ZSdsbCBuZWVkIHRvIHN0b3AgY2hhbmdpbmcgdGhlbS4gQnV0IHdlIHNob3VsZCBmaXJzdFxuICogc2VlIGhvdyBvdXIgc3lzdGVtIGhvbGRzIHVwIHdpdGggdGhlc2UgY2hvaWNlcy4gVGhlIG1haW4gY3JpdGVyaWFcbiAqIGlzIHRoYXQgdGhleSBiZSBiaWcgZW5vdWdoIHRoYXQgXCJub3JtYWxcIiBpbm5vY2VudCBwcm9ncmFtcyByYXJlbHlcbiAqIGVuY291bnRlciB0aGVzZSBsaW1pdHMuXG4gKlxuICogRXhwb3J0ZWQgcHJpbWFyaWx5IGZvciB0ZXN0aW5nLlxuICovXG5jb25zdCAgICAgICAgZGVmYXVsdExpbWl0cz1oYXJkZW4oe1xuZGVjaW1hbERpZ2l0c0xpbWl0OjEwMCxcbnN0cmluZ0xlbmd0aExpbWl0OjEwMF8wMDAsXG5zeW1ib2xOYW1lTGVuZ3RoTGltaXQ6MTAwLFxubnVtUHJvcGVydGllc0xpbWl0OjgwLFxucHJvcGVydHlOYW1lTGVuZ3RoTGltaXQ6MTAwLFxuYXJyYXlMZW5ndGhMaW1pdDoxMF8wMDAsXG5udW1TZXRFbGVtZW50c0xpbWl0OjEwXzAwMCxcbm51bVVuaXF1ZUJhZ0VsZW1lbnRzTGltaXQ6MTBfMDAwLFxubnVtTWFwRW50cmllc0xpbWl0OjUwMDB9KTtcblxuXG4vKipcbiAqIFVzZSB0aGUgcmVzdWx0IG9ubHkgdG8gZ2V0IHRoZSBsaW1pdHMgeW91IG5lZWQgYnkgZGVzdHJ1Y3R1cmluZy5cbiAqIFRodXMsIHRoZSByZXN1bHQgb25seSBuZWVkcyB0byBzdXBwb3J0IGRlc3RydWN0dXJpbmcuIFRoZSBjdXJyZW50XG4gKiBpbXBsZW1lbnRhdGlvbiB1c2VzIGluaGVyaXRhbmNlIGFzIGEgY2hlYXAgaGFjay5cbiAqXG4gKiBAcGFyYW0ge0xpbWl0c30gW2xpbWl0c11cbiAqIEByZXR1cm5zIHtBbGxMaW1pdHN9XG4gKi8kaOKAjV9vbmNlLmRlZmF1bHRMaW1pdHMoZGVmYXVsdExpbWl0cyk7XG5jb25zdCBsaW1pdD0obGltaXRzPXt9KT0+XG4vKiogQHR5cGUge0FsbExpbWl0c30gKi9oYXJkZW4oe19fcHJvdG9fXzpkZWZhdWx0TGltaXRzLC4uLmxpbWl0c30pO1xuXG5jb25zdCBjaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdD0oXG5wYXlsb2FkLFxubWFpblBheWxvYWRTaGFwZSxcbmNoZWNrLFxubGFiZWwpPT5cbntcbmFzc2VydChBcnJheS5pc0FycmF5KG1haW5QYXlsb2FkU2hhcGUpKTtcbmlmKCFBcnJheS5pc0FycmF5KHBheWxvYWQpKXtcbnJldHVybiBjaGVjayhmYWxzZSxYIGAke3EobGFiZWwpfSBwYXlsb2FkIG11c3QgYmUgYW4gYXJyYXk6ICR7cGF5bG9hZH1gKTtcbiB9XG5cbi8qIFdhcyB0aGUgZm9sbG93aW5nLCBidXQgaXRzIG92ZXJ1c2Ugb2YgcGF0dGVybnMgY2F1c2VkIGFuIGluZmluaXRlIHJlZ3Jlc3MqL1xuLyogY29uc3QgcGF5bG9hZExpbWl0U2hhcGUgPSBoYXJkZW4oKi9cbi8qIE0uc3BsaXQoKi9cbi8qIG1haW5QYXlsb2FkU2hhcGUsKi9cbi8qIE0ucGFydGlhbChoYXJkZW4oW00ucmVjb3JkT2YoTS5zdHJpbmcoKSwgTS5udW1iZXIoKSldKSwgaGFyZGVuKFtdKSksKi9cbi8qICksKi9cbi8qICk7Ki9cbi8qIHJldHVybiBjaGVja01hdGNoZXMocGF5bG9hZCwgcGF5bG9hZExpbWl0U2hhcGUsIGNoZWNrLCBsYWJlbCk7Ki9cblxuY29uc3QgbWFpbkxlbmd0aD1tYWluUGF5bG9hZFNoYXBlLmxlbmd0aDtcbmlmKCEocGF5bG9hZC5sZW5ndGg9PT1tYWluTGVuZ3RofHxwYXlsb2FkLmxlbmd0aD09PW1haW5MZW5ndGgrMSkpe1xucmV0dXJuIGNoZWNrKGZhbHNlLFggYCR7cShsYWJlbCl9IHBheWxvYWQgdW5leHBlY3RlZCBzaXplOiAke3BheWxvYWR9YCk7XG4gfVxuY29uc3QgbGltaXRzPXBheWxvYWRbbWFpbkxlbmd0aF07XG5wYXlsb2FkPWhhcmRlbihwYXlsb2FkLnNsaWNlKDAsbWFpbkxlbmd0aCkpO1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbmlmKCFjaGVja01hdGNoZXMocGF5bG9hZCxtYWluUGF5bG9hZFNoYXBlLGNoZWNrLGxhYmVsKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuaWYobGltaXRzPT09dW5kZWZpbmVkKXtcbnJldHVybiB0cnVlO1xuIH1cbnJldHVybihcbihwYXNzU3R5bGVPZihsaW1pdHMpPT09J2NvcHlSZWNvcmQnfHxcbmNoZWNrKGZhbHNlLFggYExpbWl0cyBtdXN0IGJlIGEgcmVjb3JkOiAke3EobGltaXRzKX1gKSkmJlxuZW50cmllcyhsaW1pdHMpLmV2ZXJ5KFxuKFtrZXksdmFsdWVdKT0+XG5wYXNzU3R5bGVPZih2YWx1ZSk9PT0nbnVtYmVyJ3x8XG5jaGVjayhmYWxzZSxYIGBWYWx1ZSBvZiBsaW1pdCAke3Eoa2V5KX0gYnV0IGJlIGEgbnVtYmVyOiAke3EodmFsdWUpfWApKSk7XG5cblxuIH07XG5cbmNvbnN0IGNoZWNrRGVjaW1hbERpZ2l0c0xpbWl0PShzcGVjaW1lbixkZWNpbWFsRGlnaXRzTGltaXQsY2hlY2spPT57XG5pZihcbk1hdGguZmxvb3IoTWF0aC5sb2cxMChNYXRoLmFicyhOdW1iZXIoc3BlY2ltZW4pKSkpKzE8PVxuZGVjaW1hbERpZ2l0c0xpbWl0KVxue1xucmV0dXJuIHRydWU7XG4gfVxucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBiaWdpbnQgJHtzcGVjaW1lbn0gbXVzdCBub3QgaGF2ZSBtb3JlIHRoYW4gJHtkZWNpbWFsRGlnaXRzTGltaXR9IGRpZ2l0c2ApO1xuXG4gfTtcblxuLyoqXG4gKiBAcmV0dXJucyB7UGF0dGVybktpdH1cbiAqL1xuY29uc3QgbWFrZVBhdHRlcm5LaXQ9KCk9Pntcbi8qKlxuICogSWYgdGhpcyBpcyBhIHJlY29nbml6ZWQgbWF0Y2ggdGFnLCByZXR1cm4gdGhlIE1hdGNoSGVscGVyLlxuICogT3RoZXJ3aXNlIHJlc3VsdCB1bmRlZmluZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICogQHJldHVybnMge01hdGNoSGVscGVyPX1cbiAqL1xuY29uc3QgbWF5YmVNYXRjaEhlbHBlcj0odGFnKT0+XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuSGVscGVyc0J5TWF0Y2hUYWdbdGFnXTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7c3RyaW5nfSBLaW5kXG4gKiBJdCBpcyBlaXRoZXIgYSBQYXNzU3R5bGUgb3RoZXIgdGhhbiAndGFnZ2VkJywgb3IsIGlmIHRoZSB1bmRlcmx5aW5nXG4gKiBQYXNzU3R5bGUgaXMgJ3RhZ2dlZCcsIHRoZW4gdGhlIGBnZXRUYWdgIHZhbHVlIGZvciB0YWdzIHRoYXQgYXJlXG4gKiByZWNvZ25pemVkIGF0IHRoZSBzdG9yZSBsZXZlbCBvZiBhYnN0cmFjdGlvbi4gRm9yIGVhY2ggb2YgdGhvc2VcbiAqIHRhZ3MsIGEgdGFnZ2VkIHJlY29yZCBvbmx5IGhhcyB0aGF0IGtpbmQgaWYgaXQgc2F0aXNmaWVzIHRoZSBpbnZhcmlhbnRzXG4gKiB0aGF0IHRoZSBzdG9yZSBsZXZlbCBhc3NvY2lhdGVzIHdpdGggdGhhdCBraW5kLlxuICovXG5cbi8qKlxuICogQHR5cGUge1dlYWtNYXA8Q29weVRhZ2dlZCwgS2luZD59XG4gKiBPbmx5IGZvciB0YWdnZWQgcmVjb3JkcyBvZiByZWNvZ25pemVkIGtpbmRzIHdob3NlIHN0b3JlLWxldmVsIGludmFyaWFudHNcbiAqIGhhdmUgYWxyZWFkeSBiZWVuIGNoZWNrZWQuXG4gKi9cbmNvbnN0IHRhZ01lbW89bmV3IFdlYWtNYXAoKTtcblxuLyoqXG4gKiBDaGVja3Mgb25seSByZWNvZ25pemVkIHRhZ3MsIGFuZCBvbmx5IGlmIHRoZSB0YWdnZWRcbiAqIHBhc3NlcyB0aGUgaW52YXJpYW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCByZWNvZ25pdGlvbi5cbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB0YWdnZWRcbiAqIEBwYXJhbSB7S2luZH0gdGFnXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tUYWdnZWQ9KHRhZ2dlZCx0YWcsY2hlY2spPT57XG5jb25zdCBtYXRjaEhlbHBlcj1tYXliZU1hdGNoSGVscGVyKHRhZyk7XG5pZihtYXRjaEhlbHBlcil7XG4vKiBCdXJpZWQgaGVyZSBpcyB0aGUgaW1wb3J0YW50IGNhc2UsIHdoZXJlIHdlIHByb2Nlc3MqL1xuLyogdGhlIHZhcmlvdXMgcGF0dGVybk5vZGVzKi9cbnJldHVybiBtYXRjaEhlbHBlci5jaGVja0lzV2VsbEZvcm1lZCh0YWdnZWQucGF5bG9hZCxjaGVjayk7XG4gfVxuc3dpdGNoKHRhZyl7XG5jYXNlJ2NvcHlTZXQnOntcbnJldHVybiBjaGVja0NvcHlTZXQodGFnZ2VkLGNoZWNrKTtcbiB9XG5jYXNlJ2NvcHlCYWcnOntcbnJldHVybiBjaGVja0NvcHlCYWcodGFnZ2VkLGNoZWNrKTtcbiB9XG5jYXNlJ2NvcHlNYXAnOntcbnJldHVybiBjaGVja0NvcHlNYXAodGFnZ2VkLGNoZWNrKTtcbiB9XG5kZWZhdWx0OntcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgY2Fubm90IGNoZWNrIHVucmVjb2duaXplZCB0YWcgJHtxKHRhZyl9OiAke3RhZ2dlZH1gKTtcblxuIH19XG5cbiB9O1xuXG4vKipcbiAqIFJldHVybnMgb25seSBhIHJlY29nbml6ZWQga2luZCwgYW5kIG9ubHkgaWYgdGhlIHNwZWNpbWVuIHBhc3NlcyB0aGVcbiAqIGludmFyaWFudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgcmVjb2duaXRpb24uXG4gKiBPdGhlcndpc2UsIGBjaGVjayhmYWxzZSwgLi4uKWAgYW5kIHJldHVybnMgdW5kZWZpbmVkXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge0tpbmQgfCB1bmRlZmluZWR9XG4gKi9cbmNvbnN0IGtpbmRPZj0oc3BlY2ltZW4sY2hlY2s9aWRlbnRDaGVja2VyKT0+e1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHNwZWNpbWVuKTtcbmlmKHBhc3NTdHlsZSE9PSd0YWdnZWQnKXtcbnJldHVybiBwYXNzU3R5bGU7XG4gfVxuLyogQXQgdGhpcyBwb2ludCB3ZSBrbm93IHRoYXQgc3BlY2ltZW4gaXMgYSB3ZWxsIGZvcm1lZCovXG4vKiBhcyBhIHRhZ2dlZCByZWNvcmQsIHdoaWNoIGlzIGRlZmluZWQgYXQgdGhlIG1hcnNoYWwgbGV2ZWwgb2YgYWJzdHJhY3Rpb24sKi9cbi8qIHNpbmNlIGBwYXNzU3R5bGVPZmAgY2hlY2tzIHRob3NlIGludmFyaWFudHMuKi9cbmlmKHRhZ01lbW8uaGFzKHNwZWNpbWVuKSl7XG5yZXR1cm4gdGFnTWVtby5nZXQoc3BlY2ltZW4pO1xuIH1cbmNvbnN0IHRhZz1nZXRUYWcoc3BlY2ltZW4pO1xuaWYoY2hlY2tUYWdnZWQoc3BlY2ltZW4sdGFnLGNoZWNrKSl7XG50YWdNZW1vLnNldChzcGVjaW1lbix0YWcpO1xucmV0dXJuIHRhZztcbiB9XG5pZihjaGVjayE9PWlkZW50Q2hlY2tlcil7XG5jaGVjayhmYWxzZSxYIGBjYW5ub3QgY2hlY2sgdW5yZWNvZ25pemVkIHRhZyAke3EodGFnKX1gKTtcbiB9XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH07XG5oYXJkZW4oa2luZE9mKTtcblxuLyoqXG4gKiBDaGVja3Mgb25seSByZWNvZ25pemVkIGtpbmRzLCBhbmQgb25seSBpZiB0aGUgc3BlY2ltZW5cbiAqIHBhc3NlcyB0aGUgaW52YXJpYW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCByZWNvZ25pdGlvbi5cbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBzcGVjaW1lblxuICogQHBhcmFtIHtLaW5kfSBraW5kXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tLaW5kPShzcGVjaW1lbixraW5kLGNoZWNrKT0+e1xuY29uc3QgcmVhbEtpbmQ9a2luZE9mKHNwZWNpbWVuLGNoZWNrKTtcbmlmKGtpbmQ9PT1yZWFsS2luZCl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5pZihjaGVjayE9PWlkZW50Q2hlY2tlcil7XG4vKiBxdW90aW5nIHdpdGhvdXQgcXVvdGVzKi9cbmNvbnN0IGRldGFpbHM9WChbIGAke3JlYWxLaW5kfSBgLGAgLSBNdXN0IGJlIGEgJHtraW5kfWBdLHNwZWNpbWVuKTtcbmNoZWNrKGZhbHNlLGRldGFpbHMpO1xuIH1cbnJldHVybiBmYWxzZTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHNwZWNpbWVuXG4gKiBAcGFyYW0ge0tleX0ga2V5QXNQYXR0ZXJuXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tBc0tleVBhdHQ9KHNwZWNpbWVuLGtleUFzUGF0dGVybixjaGVjayk9PntcbmlmKGtleUVRKHNwZWNpbWVuLGtleUFzUGF0dGVybikpe1xucmV0dXJuIHRydWU7XG4gfVxucmV0dXJuKFxuY2hlY2shPT1pZGVudENoZWNrZXImJlxuY2hlY2soZmFsc2UsWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGJlOiAke2tleUFzUGF0dGVybn1gKSk7XG5cbiB9O1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBpc1BhdHRlcm4gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiogQHR5cGUge0NoZWNrUGF0dGVybn0gKi9cbmNvbnN0IGNoZWNrUGF0dGVybj0ocGF0dCxjaGVjayk9PntcbmlmKGlzS2V5KHBhdHQpKXtcbi8qIEFsbCBrZXlzIGFyZSBwYXR0ZXJucy4gRm9yIHRoZXNlLCB0aGUga2V5TWVtbyB3aWxsIGRvLiovXG4vKiBBbGwgcHJpbWl0aXZlcyB0aGF0IGFyZSBwYXR0ZXJucyBhcmUgYWxzbyBrZXlzLCB3aGljaCB0aGlzKi9cbi8qIGFsc28gdGFrZXMgY2FyZSBvZiB3aXRob3V0IG1lbW8uIFRoZSByZXN0IG9mIG91ciBjaGVja2luZyBsb2dpYyovXG4vKiBpcyBvbmx5IGNvbmNlcm5lZCB3aXRoIG5vbi1rZXkgcGF0dGVybnMuKi9cbnJldHVybiB0cnVlO1xuIH1cbmlmKHBhdHRlcm5NZW1vLmhhcyhwYXR0KSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuY29uc3QgcmVzdWx0PWNoZWNrUGF0dGVybkludGVybmFsKHBhdHQsY2hlY2spO1xuaWYocmVzdWx0KXtcbnBhdHRlcm5NZW1vLmFkZChwYXR0KTtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gcGF0dCAtIGtub3duIG5vdCB0byBiZSBhIGtleSwgYW5kIHRoZXJlZm9yZSBrbm93blxuICogbm90IHRvIGJlIHByaW1pdGl2ZS5cbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja1BhdHRlcm5JbnRlcm5hbD0ocGF0dCxjaGVjayk9Pntcbi8qIFB1cnBvc2VseSBwYXJhbGxlbHMgY2hlY2tLZXkuIFRPRE8gcmV1c2UgbW9yZSBsb2dpYyBiZXR3ZWVuIHRoZW0uKi9cbi8qIE1vc3Qgb2YgdGhlIHRleHQgb2YgdGhlIHN3aXRjaCBiZWxvdyBub3QgZGVhbGluZyB3aXRoIG1hdGNoZXJzIGlzKi9cbi8qIGVzc2VudGlhbGx5IGlkZW50aWNhbC4qL1xuY29uc3QgY2hlY2tJdD0oY2hpbGQpPT5jaGVja1BhdHRlcm4oY2hpbGQsY2hlY2spO1xuXG5jb25zdCBraW5kPWtpbmRPZihwYXR0LGNoZWNrKTtcbnN3aXRjaChraW5kKXtcbmNhc2UgdW5kZWZpbmVkOntcbnJldHVybiBmYWxzZTtcbiB9XG5jYXNlJ2NvcHlSZWNvcmQnOntcbi8qIEEgY29weVJlY29yZCBpcyBhIHBhdHRlcm4gaWZmIGFsbCBpdHMgY2hpbGRyZW4gYXJlKi9cbi8qIHBhdHRlcm5zKi9cbnJldHVybiB2YWx1ZXMocGF0dCkuZXZlcnkoY2hlY2tJdCk7XG4gfVxuY2FzZSdjb3B5QXJyYXknOntcbi8qIEEgY29weUFycmF5IGlzIGEgcGF0dGVybiBpZmYgYWxsIGl0cyBjaGlsZHJlbiBhcmUqL1xuLyogcGF0dGVybnMqL1xucmV0dXJuIHBhdHQuZXZlcnkoY2hlY2tJdCk7XG4gfVxuY2FzZSdjb3B5TWFwJzp7XG4vKiBBIGNvcHlNYXAncyBrZXlzIGFyZSBrZXlzIGFuZCB0aGVyZWZvcmUgYWxyZWFkeSBrbm93biB0byBiZSovXG4vKiBwYXR0ZXJucy4qL1xuLyogQSBjb3B5TWFwIGlzIGEgcGF0dGVybiBpZiBpdHMgdmFsdWVzIGFyZSBwYXR0ZXJucy4qL1xucmV0dXJuIGNoZWNrUGF0dGVybihwYXR0LnZhbHVlcyxjaGVjayk7XG4gfVxuY2FzZSdlcnJvcic6XG5jYXNlJ3Byb21pc2UnOntcbnJldHVybiBjaGVjayhmYWxzZSxYIGBBICR7cShraW5kKX0gY2Fubm90IGJlIGEgcGF0dGVybmApO1xuIH1cbmRlZmF1bHQ6e1xuaWYobWF5YmVNYXRjaEhlbHBlcihraW5kKSE9PXVuZGVmaW5lZCl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYEEgcGFzc2FibGUgb2Yga2luZCAke3Eoa2luZCl9IGlzIG5vdCBhIHBhdHRlcm46ICR7cGF0dH1gKTtcblxuIH19XG5cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHBhdHRcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBpc1BhdHRlcm49KHBhdHQpPT5jaGVja1BhdHRlcm4ocGF0dCxpZGVudENoZWNrZXIpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGF0dGVybn0gcGF0dFxuICovXG5jb25zdCBhc3NlcnRQYXR0ZXJuPShwYXR0KT0+e1xuY2hlY2tQYXR0ZXJuKHBhdHQsYXNzZXJ0Q2hlY2tlcik7XG4gfTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gaXNLZXlQYXR0ZXJuIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqIEB0eXBlIHtDaGVja0tleVBhdHRlcm59ICovXG5jb25zdCBjaGVja0tleVBhdHRlcm49KHBhdHQsY2hlY2spPT57XG5pZihpc0tleShwYXR0KSl7XG4vKiBJbiBwcmluY2lwbGUsIGFsbCBrZXlzIGFyZSBwYXR0ZXJucywgYnV0IG9ubHkgc2NhbGFycyBhcmUgY3VycmVudGx5Ki9cbi8qIHN1cHBvcnRlZCBhcyBrZXlzLiovXG5yZXR1cm4gY2hlY2soaXNTY2FsYXJLZXkocGF0dCksWCBgbm9uLXNjYWxhciBrZXlzIGFyZSBub3QgeWV0IHN1cHBvcnRlZGApO1xuIH1cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5yZXR1cm4gY2hlY2tLZXlQYXR0ZXJuSW50ZXJuYWwocGF0dCxjaGVjayk7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBwYXR0XG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tLZXlQYXR0ZXJuSW50ZXJuYWw9KHBhdHQsY2hlY2spPT57XG4vKiBQdXJwb3NlbHkgcGFyYWxsZWxzIGNoZWNrS2V5LiBUT0RPIHJldXNlIG1vcmUgbG9naWMgYmV0d2VlbiB0aGVtLiovXG4vKiBNb3N0IG9mIHRoZSB0ZXh0IG9mIHRoZSBzd2l0Y2ggYmVsb3cgbm90IGRlYWxpbmcgd2l0aCBtYXRjaGVycyBpcyovXG4vKiBlc3NlbnRpYWxseSBpZGVudGljYWwuKi9cbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihwYXR0KTtcbnN3aXRjaChwYXNzU3R5bGUpe1xuY2FzZSdjb3B5UmVjb3JkJzpcbmNhc2UnY29weUFycmF5Jzp7XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgbm9uLXNjYWxhciBrZXlzIGFyZSBub3QgeWV0IHN1cHBvcnRlZGApO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5jb25zdCB0YWc9Z2V0VGFnKHBhdHQpO1xuY29uc3QgbWF0Y2hIZWxwZXI9bWF5YmVNYXRjaEhlbHBlcih0YWcpO1xuaWYobWF0Y2hIZWxwZXIhPT11bmRlZmluZWQpe1xuLyogVGhpcyBjaGVjayBndWFyYW50ZWVzIHRoZSBwYXlsb2FkIGludmFyaWFudHMgYXNzdW1lZCBieSB0aGUgb3RoZXIqL1xuLyogbWF0Y2hIZWxwZXIgbWV0aG9kcy4qL1xucmV0dXJuIG1hdGNoSGVscGVyLmNoZWNrS2V5UGF0dGVybihwYXR0LnBheWxvYWQsY2hlY2spO1xuIH1cbnN3aXRjaCh0YWcpe1xuY2FzZSdjb3B5U2V0JzpcbmNhc2UnY29weU1hcCc6e1xucmV0dXJuIGNoZWNrKGZhbHNlLFggYG5vbi1zY2FsYXIga2V5cyBhcmUgbm90IHlldCBzdXBwb3J0ZWRgKTtcbiB9XG5kZWZhdWx0OntcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgQSBwYXNzYWJsZSB0YWdnZWQgJHtxKHRhZyl9IGlzIG5vdCBhIGtleTogJHtwYXR0fWApO1xuXG4gfX1cblxuIH1cbmNhc2UnZXJyb3InOlxuY2FzZSdwcm9taXNlJzp7XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgQSAke3EocGFzc1N0eWxlKX0gY2Fubm90IGJlIGEgcGF0dGVybmApO1xuIH1cbmRlZmF1bHQ6e1xuLyogVW5leHBlY3RlZCB0YWdzIGFyZSBqdXN0IG5vbi1wYXR0ZXJucywgYnV0IGFuIHVuZXhwZWN0ZWQgcGFzc1N0eWxlKi9cbi8qIGlzIGFsd2F5cyBhbiBlcnJvci4qL1xudGhyb3cgRmFpbCBgdW5leHBlY3RlZCBwYXNzU3R5bGUgJHtxKHBhc3NTdHlsZSl9OiAke3BhdHR9YDtcbiB9fVxuXG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBwYXR0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgaXNLZXlQYXR0ZXJuPShwYXR0KT0+Y2hlY2tLZXlQYXR0ZXJuKHBhdHQsaWRlbnRDaGVja2VyKTtcblxuLyoqXG4gKiBAcGFyYW0ge1BhdHRlcm59IHBhdHRcbiAqL1xuY29uc3QgYXNzZXJ0S2V5UGF0dGVybj0ocGF0dCk9PntcbmNoZWNrS2V5UGF0dGVybihwYXR0LGFzc2VydENoZWNrZXIpO1xuIH07XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIG1hdGNoZXMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7UGF0dGVybn0gcGF0dGVyblxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBbbGFiZWxdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tNYXRjaGVzPShzcGVjaW1lbixwYXR0ZXJuLGNoZWNrLGxhYmVsPXVuZGVmaW5lZCk9PlxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbmFwcGx5TGFiZWxpbmdFcnJvcihjaGVja01hdGNoZXNJbnRlcm5hbCxbc3BlY2ltZW4scGF0dGVybixjaGVja10sbGFiZWwpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHNwZWNpbWVuXG4gKiBAcGFyYW0ge1BhdHRlcm59IHBhdHRcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja01hdGNoZXNJbnRlcm5hbD0oc3BlY2ltZW4scGF0dCxjaGVjayk9Pntcbi8qIFdvcnRoIGJlaW5nIGEgYml0IHZlcmJvc2UgYW5kIHJlcGV0aXRpdmUgaW4gb3JkZXIgdG8gb3B0aW1pemUqL1xuY29uc3QgcGF0dGVybktpbmQ9a2luZE9mKHBhdHQsY2hlY2spO1xuY29uc3Qgc3BlY2ltZW5LaW5kPWtpbmRPZihzcGVjaW1lbik7LyogbWF5IGJlIHVuZGVmaW5lZCovXG5zd2l0Y2gocGF0dGVybktpbmQpe1xuY2FzZSB1bmRlZmluZWQ6e1xucmV0dXJuIEZhaWwgYHBhdHRlcm4gZXhwZWN0ZWQ6ICR7cGF0dH1gO1xuIH1cbmNhc2UncHJvbWlzZSc6e1xucmV0dXJuIEZhaWwgYHByb21pc2VzIGNhbm5vdCBiZSBwYXR0ZXJuczogJHtwYXR0fWA7XG4gfVxuY2FzZSdlcnJvcic6e1xucmV0dXJuIEZhaWwgYGVycm9ycyBjYW5ub3QgYmUgcGF0dGVybnM6ICR7cGF0dH1gO1xuIH1cbmNhc2UndW5kZWZpbmVkJzpcbmNhc2UnbnVsbCc6XG5jYXNlJ2Jvb2xlYW4nOlxuY2FzZSdudW1iZXInOlxuY2FzZSdiaWdpbnQnOlxuY2FzZSdzdHJpbmcnOlxuY2FzZSdzeW1ib2wnOlxuY2FzZSdjb3B5U2V0JzpcbmNhc2UnY29weUJhZyc6XG5jYXNlJ3JlbW90YWJsZSc6e1xuLyogVGhlc2Uga2luZHMgYXJlIG5lY2Vzc2FyaWx5IGtleXMqL1xucmV0dXJuIGNoZWNrQXNLZXlQYXR0KHNwZWNpbWVuLHBhdHQsY2hlY2spO1xuIH1cbmNhc2UnY29weUFycmF5Jzp7XG5pZihpc0tleShwYXR0KSl7XG4vKiBUYWtlcyBjYXJlIG9mIHBhdHRlcm5zIHdoaWNoIGFyZSBrZXlzLCBzbyB0aGUgcmVzdCBvZiB0aGlzKi9cbi8qIGxvZ2ljIGNhbiBhc3N1bWUgcGF0dGVybnMgdGhhdCBhcmUgbm90IGtleXMuKi9cbnJldHVybiBjaGVja0FzS2V5UGF0dChzcGVjaW1lbixwYXR0LGNoZWNrKTtcbiB9XG5pZihzcGVjaW1lbktpbmQhPT0nY29weUFycmF5Jyl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYCR7c3BlY2ltZW59IC0gTXVzdCBiZSBhIGNvcHlBcnJheSB0byBtYXRjaCBhIGNvcHlBcnJheSBwYXR0ZXJuOiAke3BhdHR9YCk7XG5cbiB9XG5jb25zdHtsZW5ndGh9PXBhdHQ7XG5pZihzcGVjaW1lbi5sZW5ndGghPT1sZW5ndGgpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBBcnJheSAke3NwZWNpbWVufSAtIE11c3QgYmUgYXMgbG9uZyBhcyBjb3B5QXJyYXkgcGF0dGVybjogJHtwYXR0fWApO1xuXG4gfVxucmV0dXJuIHBhdHQuZXZlcnkoKHAsaSk9PmNoZWNrTWF0Y2hlcyhzcGVjaW1lbltpXSxwLGNoZWNrLGkpKTtcbiB9XG5jYXNlJ2NvcHlSZWNvcmQnOntcbmlmKGlzS2V5KHBhdHQpKXtcbi8qIFRha2VzIGNhcmUgb2YgcGF0dGVybnMgd2hpY2ggYXJlIGtleXMsIHNvIHRoZSByZXN0IG9mIHRoaXMqL1xuLyogbG9naWMgY2FuIGFzc3VtZSBwYXR0ZXJucyB0aGF0IGFyZSBub3Qga2V5cy4qL1xucmV0dXJuIGNoZWNrQXNLZXlQYXR0KHNwZWNpbWVuLHBhdHQsY2hlY2spO1xuIH1cbmlmKHNwZWNpbWVuS2luZCE9PSdjb3B5UmVjb3JkJyl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYCR7c3BlY2ltZW59IC0gTXVzdCBiZSBhIGNvcHlSZWNvcmQgdG8gbWF0Y2ggYSBjb3B5UmVjb3JkIHBhdHRlcm46ICR7cGF0dH1gKTtcblxuIH1cbi8qIFRPRE8gRGV0ZWN0IGFuZCBhY2N1bXVsYXRlIGRpZmZlcmVuY2UgaW4gb25lIHBhc3MuKi9cbi8qIFJhdGhlciB0aGFuIHVzaW5nIHR3byBjYWxscyB0byBgbGlzdERpZmZlcmVuY2VgIHRvIGRldGVjdCBhbmQqL1xuLyogcmVwb3J0IGlmIGFuZCBob3cgdGhlc2UgbGlzdHMgZGlmZmVyLCBzaW5jZSB0aGV5IGFyZSBhbHJlYWR5Ki9cbi8qIGluIHNvcnRlZCBvcmRlciwgd2Ugc2hvdWxkIGluc3RlYWQgdXNlIGFuIGFsZ29yaXRobSBsaWtlKi9cbi8qIGBpdGVyRGlzam9pbnRVbmlvbmAgZnJvbSBtZXJnZS1zb3J0LW9wZXJhdG9ycy5qcyovXG5jb25zdCBzcGVjaW1lbk5hbWVzPXJlY29yZE5hbWVzKHNwZWNpbWVuKTtcbmNvbnN0IHBhdHROYW1lcz1yZWNvcmROYW1lcyhwYXR0KTtcbmNvbnN0IG1pc3Npbmc9bGlzdERpZmZlcmVuY2UocGF0dE5hbWVzLHNwZWNpbWVuTmFtZXMpO1xuaWYobWlzc2luZy5sZW5ndGg+PTEpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGAke3NwZWNpbWVufSAtIE11c3QgaGF2ZSBtaXNzaW5nIHByb3BlcnRpZXMgJHtxKG1pc3NpbmcpfWApO1xuXG4gfVxuY29uc3QgdW5leHBlY3RlZD1saXN0RGlmZmVyZW5jZShzcGVjaW1lbk5hbWVzLHBhdHROYW1lcyk7XG5pZih1bmV4cGVjdGVkLmxlbmd0aD49MSl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYCR7c3BlY2ltZW59IC0gTXVzdCBub3QgaGF2ZSB1bmV4cGVjdGVkIHByb3BlcnRpZXM6ICR7cShcbnVuZXhwZWN0ZWQpXG4gfWApO1xuXG4gfVxuY29uc3Qgc3BlY2ltZW5WYWx1ZXM9cmVjb3JkVmFsdWVzKHNwZWNpbWVuLHNwZWNpbWVuTmFtZXMpO1xuY29uc3QgcGF0dFZhbHVlcz1yZWNvcmRWYWx1ZXMocGF0dCxwYXR0TmFtZXMpO1xucmV0dXJuIHBhdHROYW1lcy5ldmVyeSgobGFiZWwsaSk9PlxuY2hlY2tNYXRjaGVzKHNwZWNpbWVuVmFsdWVzW2ldLHBhdHRWYWx1ZXNbaV0sY2hlY2ssbGFiZWwpKTtcblxuIH1cbmNhc2UnY29weU1hcCc6e1xuaWYoaXNLZXkocGF0dCkpe1xuLyogVGFrZXMgY2FyZSBvZiBwYXR0ZXJucyB3aGljaCBhcmUga2V5cywgc28gdGhlIHJlc3Qgb2YgdGhpcyovXG4vKiBsb2dpYyBjYW4gYXNzdW1lIHBhdHRlcm5zIHRoYXQgYXJlIG5vdCBrZXlzLiovXG5yZXR1cm4gY2hlY2tBc0tleVBhdHQoc3BlY2ltZW4scGF0dCxjaGVjayk7XG4gfVxuaWYoc3BlY2ltZW5LaW5kIT09J2NvcHlNYXAnKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGJlIGEgY29weU1hcCB0byBtYXRjaCBhIGNvcHlNYXAgcGF0dGVybjogJHtwYXR0fWApO1xuXG4gfVxuY29uc3R7cGF5bG9hZDpwYXR0UGF5bG9hZH09cGF0dDtcbmNvbnN0e3BheWxvYWQ6c3BlY2ltZW5QYXlsb2FkfT1zcGVjaW1lbjtcbmNvbnN0IHBhdHRLZXlTZXQ9Y29weU1hcEtleVNldChwYXR0UGF5bG9hZCk7XG5jb25zdCBzcGVjaW1lbktleVNldD1jb3B5TWFwS2V5U2V0KHNwZWNpbWVuUGF5bG9hZCk7XG4vKiBDb21wYXJlIGtleXMgYXMgY29weVNldHMqL1xuaWYoIWNoZWNrTWF0Y2hlcyhzcGVjaW1lbktleVNldCxwYXR0S2V5U2V0LGNoZWNrKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuY29uc3QgcGF0dFZhbHVlcz1wYXR0UGF5bG9hZC52YWx1ZXM7XG5jb25zdCBzcGVjaW1lblZhbHVlcz1zcGVjaW1lblBheWxvYWQudmFsdWVzO1xuLyogY29tcGFyZSB2YWx1ZXMgYXMgY29weUFycmF5cyovXG5yZXR1cm4gY2hlY2tNYXRjaGVzKHNwZWNpbWVuVmFsdWVzLHBhdHRWYWx1ZXMsY2hlY2spO1xuIH1cbmRlZmF1bHQ6e1xuY29uc3QgbWF0Y2hIZWxwZXI9bWF5YmVNYXRjaEhlbHBlcihwYXR0ZXJuS2luZCk7XG5pZihtYXRjaEhlbHBlcil7XG5yZXR1cm4gbWF0Y2hIZWxwZXIuY2hlY2tNYXRjaGVzKHNwZWNpbWVuLHBhdHQucGF5bG9hZCxjaGVjayk7XG4gfVxudGhyb3cgRmFpbCBgaW50ZXJuYWw6IHNob3VsZCBoYXZlIHJlY29nbml6ZWQgJHtxKHBhdHRlcm5LaW5kKX0gYDtcbiB9fVxuXG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBzcGVjaW1lblxuICogQHBhcmFtIHtQYXR0ZXJufSBwYXR0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgbWF0Y2hlcz0oc3BlY2ltZW4scGF0dCk9PlxuY2hlY2tNYXRjaGVzKHNwZWNpbWVuLHBhdHQsaWRlbnRDaGVja2VyKTtcblxuLyoqXG4gKiBSZXR1cm5pbmcgbm9ybWFsbHkgaW5kaWNhdGVzIHN1Y2Nlc3MuIE1hdGNoIGZhaWx1cmUgaXMgaW5kaWNhdGVkIGJ5XG4gKiB0aHJvd2luZy5cbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBzcGVjaW1lblxuICogQHBhcmFtIHtQYXR0ZXJufSBwYXR0XG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IFtsYWJlbF1cbiAqL1xuY29uc3QgZml0PShzcGVjaW1lbixwYXR0LGxhYmVsPXVuZGVmaW5lZCk9PntcbmlmKGNoZWNrTWF0Y2hlcyhzcGVjaW1lbixwYXR0LGlkZW50Q2hlY2tlcixsYWJlbCkpe1xucmV0dXJuO1xuIH1cbi8qIHNob3VsZCBvbmx5IHRocm93Ki9cbmNoZWNrTWF0Y2hlcyhzcGVjaW1lbixwYXR0LGFzc2VydENoZWNrZXIsbGFiZWwpO1xuRmFpbCBgaW50ZXJuYWw6ICR7bGFiZWx9OiBpbmNvbnNpc3RlbnQgcGF0dGVybiBtYXRjaDogJHtxKHBhdHQpfWA7XG4gfTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gZ2V0UmFua0NvdmVyIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqIEB0eXBlIHtHZXRSYW5rQ292ZXJ9ICovXG5jb25zdCBnZXRSYW5rQ292ZXI9KHBhdHQsZW5jb2RlUGFzc2FibGUpPT57XG5pZihpc0tleShwYXR0KSl7XG5jb25zdCBlbmNvZGVkPWVuY29kZVBhc3NhYmxlKHBhdHQpO1xuaWYoZW5jb2RlZCE9PXVuZGVmaW5lZCl7XG5yZXR1cm5bZW5jb2RlZCwgYCR7ZW5jb2RlZH1+YF07XG4gfVxuIH1cbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihwYXR0KTtcbnN3aXRjaChwYXNzU3R5bGUpe1xuY2FzZSdjb3B5QXJyYXknOntcbi8qIFhYWCB0aGlzIGRvZXNuJ3QgZ2V0IGFsb25nIHdpdGggdGhlIHdvcmxkIG9mIGNvdmVyID09PSBwYWlyIG9mKi9cbi8qIHN0cmluZ3MuIEluIHRoZSBtZWFudGltZSwgZmFsbCB0aHJvdWdoIHRvIHRoZSBkZWZhdWx0IHdoaWNoKi9cbi8qIHJldHVybnMgYSBjb3ZlciB0aGF0IGNvdmVycyBhbGwgY29weUFycmF5cy4qL1xuLyoqL1xuLyogY29uc3QgcmFua0NvdmVycyA9IHBhdHQubWFwKHAgPT4gZ2V0UmFua0NvdmVyKHAsIGVuY29kZVBhc3NhYmxlKSk7Ki9cbi8qIHJldHVybiBoYXJkZW4oWyovXG4vKiByYW5rQ292ZXJzLm1hcCgoW2xlZnQsIF9yaWdodF0pID0+IGxlZnQpLCovXG4vKiByYW5rQ292ZXJzLm1hcCgoW19sZWZ0LCByaWdodF0pID0+IHJpZ2h0KSwqL1xuLyogXSk7Ki9cbmJyZWFrO1xuIH1cbmNhc2UnY29weVJlY29yZCc6e1xuLyogWFhYIHRoaXMgZG9lc24ndCBnZXQgYWxvbmcgd2l0aCB0aGUgd29ybGQgb2YgY292ZXIgPT09IHBhaXIgb2YqL1xuLyogc3RyaW5ncy4gSW4gdGhlIG1lYW50aW1lLCBmYWxsIHRocm91Z2ggdG8gdGhlIGRlZmF1bHQgd2hpY2gqL1xuLyogcmV0dXJucyBhIGNvdmVyIHRoYXQgY292ZXJzIGFsbCBjb3B5UmVjb3Jkcy4qL1xuLyoqL1xuLyogY29uc3QgcGF0dEtleXMgPSBvd25LZXlzKHBhdHQpOyovXG4vKiBjb25zdCBwYXR0RW50cmllcyA9IGhhcmRlbihwYXR0S2V5cy5tYXAoa2V5ID0+IFtrZXksIHBhdHRba2V5XV0pKTsqL1xuLyogY29uc3QgW2xlZnRFbnRyaWVzTGltaXQsIHJpZ2h0RW50cmllc0xpbWl0XSA9Ki9cbi8qIGdldFJhbmtDb3ZlcihwYXR0RW50cmllcyk7Ki9cbi8qIHJldHVybiBoYXJkZW4oWyovXG4vKiBmcm9tVW5pcXVlRW50cmllcyhsZWZ0RW50cmllc0xpbWl0KSwqL1xuLyogZnJvbVVuaXF1ZUVudHJpZXMocmlnaHRFbnRyaWVzTGltaXQpLCovXG4vKiBdKTsqL1xuYnJlYWs7XG4gfVxuY2FzZSd0YWdnZWQnOntcbmNvbnN0IHRhZz1nZXRUYWcocGF0dCk7XG5jb25zdCBtYXRjaEhlbHBlcj1tYXliZU1hdGNoSGVscGVyKHRhZyk7XG5pZihtYXRjaEhlbHBlcil7XG4vKiBCdXJpZWQgaGVyZSBpcyB0aGUgaW1wb3J0YW50IGNhc2UsIHdoZXJlIHdlIHByb2Nlc3MqL1xuLyogdGhlIHZhcmlvdXMgcGF0dGVybk5vZGVzKi9cbnJldHVybiBtYXRjaEhlbHBlci5nZXRSYW5rQ292ZXIocGF0dC5wYXlsb2FkLGVuY29kZVBhc3NhYmxlKTtcbiB9XG5zd2l0Y2godGFnKXtcbmNhc2UnY29weVNldCc6e1xuLyogWFhYIHRoaXMgZG9lc24ndCBnZXQgYWxvbmcgd2l0aCB0aGUgd29ybGQgb2YgY292ZXIgPT09IHBhaXIgb2YqL1xuLyogc3RyaW5ncy4gSW4gdGhlIG1lYW50aW1lLCBmYWxsIHRocm91Z2ggdG8gdGhlIGRlZmF1bHQgd2hpY2gqL1xuLyogcmV0dXJucyBhIGNvdmVyIHRoYXQgY292ZXJzIGFsbCBjb3B5U2V0cy4qL1xuLyoqL1xuLyogLy8gU2hvdWxkIGFscmVhZHkgYmUgdmFsaWRhdGVkIGJ5IGNoZWNrUGF0dGVybi4gQnV0IGJlY2F1c2UgdGhpcyovXG4vKiAvLyBpcyBhIGNoZWNrIHRoYXQgbWF5IGxvb3NlbiBvdmVyIHRpbWUsIHdlIGFsc28gYXNzZXJ0Ki9cbi8qIC8vIGV2ZXJ5d2hlcmUgd2Ugc3RpbGwgcmVseSBvbiB0aGUgcmVzdHJpY3Rpb24uKi9cbi8qIGBgYGpzKi9cbi8qIHBhdHQucGF5bG9hZC5sZW5ndGggPT09IDEgfHwqL1xuLyogRmFpbGBOb24tc2luZ2xldG9uIGNvcHlTZXRzIHdpdGggbWF0Y2hlciBub3QgeWV0IGltcGxlbWVudGVkOiAke3BhdHR9YDsqL1xuLyogYGBgKi9cbi8qKi9cbi8qIGNvbnN0IFtsZWZ0RWxlbWVudExpbWl0LCByaWdodEVsZW1lbnRMaW1pdF0gPSBnZXRSYW5rQ292ZXIoKi9cbi8qIHBhdHQucGF5bG9hZFswXSwqL1xuLyogKTsqL1xuLyogcmV0dXJuIGhhcmRlbihbKi9cbi8qIG1ha2VDb3B5U2V0KFtsZWZ0RWxlbWVudExpbWl0XSksKi9cbi8qIG1ha2VDb3B5U2V0KFtyaWdodEVsZW1lbnRMaW1pdF0pLCovXG4vKiBdKTsqL1xuYnJlYWs7XG4gfVxuY2FzZSdjb3B5TWFwJzp7XG4vKiBYWFggdGhpcyBkb2Vzbid0IGdldCBhbG9uZyB3aXRoIHRoZSB3b3JsZCBvZiBjb3ZlciA9PT0gcGFpciBvZiovXG4vKiBzdHJpbmdzLiBJbiB0aGUgbWVhbnRpbWUsIGZhbGwgdGhyb3VnaCB0byB0aGUgZGVmYXVsdCB3aGljaCovXG4vKiByZXR1cm5zIGEgY292ZXIgdGhhdCBjb3ZlcnMgYWxsIGNvcHlNYXBzLiovXG4vKiovXG4vKiAvLyBBIG1hdGNoaW5nIGNvcHlNYXAgbXVzdCBoYXZlIHRoZSBzYW1lIGtleXMsIG9yIGF0IG1vc3Qgb25lKi9cbi8qIC8vIG5vbi1rZXkga2V5IHBhdHRlcm4uIFRodXMgd2UgY2FuIGFzc3VtZSB0aGF0IHZhbHVlIHBvc2l0aW9ucyovXG4vKiAvLyBtYXRjaCAxLXRvLTEuKi9cbi8qIC8vKi9cbi8qIC8vIFRPRE8gSSBtYXkgYmUgb3Zlcmxvb2tpbmcgdGhhdCB0aGUgbGVzcyBwcmVjaXNlIHJhbmtPcmRlciovXG4vKiAvLyBlcXVpdmFsZW5jZSBjbGFzcyBtYXkgY2F1c2UgdmFsdWVzIHRvIGJlIG91dCBvZiBvcmRlciwqL1xuLyogLy8gbWFraW5nIHRoaXMgcmFua0NvdmVyIG5vdCBhY3R1YWxseSBjb3Zlci4gSW4gdGhhdCBjYXNlLCBmb3IqL1xuLyogLy8gYWxsIHRoZSB2YWx1ZXMgZm9yIGtleXMgYXQgdGhlIHNhbWUgcmFuaywgd2Ugc2hvdWxkIHVuaW9uIHRoZWlyKi9cbi8qIC8vIHJhbmsgY292ZXJzLiBUT0RPIFBPU1NJQkxFIFNJTEVOVCBDT1JSRUNUTkVTUyBCVUcqL1xuLyogLy8qL1xuLyogLy8gSWYgdGhpcyBpcyBhIGJ1ZywgaXQgcHJvYmFibHkgYWZmZWN0cyB0aGUgZ2V0UmFua0NvdmVyKi9cbi8qIC8vIGNhc2VzIG9mIG1hdGNoTFRFSGVscGVyIGFuZCBtYXRjaEdURUhlbHBlciBvbiBjb3B5TWFwIGFzKi9cbi8qIC8vIHdlbGwuIFNlZSBtYWtlQ29weU1hcCBmb3IgYW4gaWRlYSBvbiBmaXhpbmcqL1xuLyogLy8gdGhpcyBidWcuKi9cbi8qIGNvbnN0IFtsZWZ0UGF5bG9hZExpbWl0LCByaWdodFBheWxvYWRMaW1pdF0gPSBnZXRSYW5rQ292ZXIoKi9cbi8qIHBhdHQucGF5bG9hZCwqL1xuLyogZW5jb2RlUGFzc2FibGUsKi9cbi8qICk7Ki9cbi8qIHJldHVybiBoYXJkZW4oWyovXG4vKiBtYWtlVGFnZ2VkKCdjb3B5TWFwJywgbGVmdFBheWxvYWRMaW1pdCksKi9cbi8qIG1ha2VUYWdnZWQoJ2NvcHlNYXAnLCByaWdodFBheWxvYWRMaW1pdCksKi9cbi8qIF0pOyovXG5icmVhaztcbiB9XG5kZWZhdWx0OntcbmJyZWFrOy8qIGZhbGwgdGhyb3VnaCB0byBkZWZhdWx0Ki9cbiB9fVxuXG5icmVhazsvKiBmYWxsIHRocm91Z2ggdG8gZGVmYXVsdCovXG4gfVxuZGVmYXVsdDp7XG5icmVhazsvKiBmYWxsIHRocm91Z2ggdG8gZGVmYXVsdCovXG4gfX1cblxucmV0dXJuIGdldFBhc3NTdHlsZUNvdmVyKHBhc3NTdHlsZSk7XG4gfTtcblxuY29uc3QgYXJyYXlFdmVyeU1hdGNoUGF0dGVybj0oYXJyYXkscGF0dCxjaGVjayxsYWJlbFByZWZpeD0nJyk9PntcbmlmKGNoZWNrS2luZChwYXR0LCdtYXRjaDphbnknLGlkZW50Q2hlY2tlcikpe1xuLyogaWYgdGhlIHBhdHRlcm4gaXMgTS5hbnkoKSwgd2Uga25vdyBpdHMgdHJ1ZSovXG5yZXR1cm4gdHJ1ZTtcbiB9XG5yZXR1cm4gYXJyYXkuZXZlcnkoKGVsLGkpPT5cbmNoZWNrTWF0Y2hlcyhlbCxwYXR0LGNoZWNrLCBgJHtsYWJlbFByZWZpeH1bJHtpfV1gKSk7XG5cbiB9O1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBNYXRjaCBIZWxwZXJzIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hBbnlIZWxwZXI9RmFyKCdtYXRjaDphbnkgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KF9zcGVjaW1lbixfbWF0Y2hlclBheWxvYWQsX2NoZWNrKT0+dHJ1ZSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KG1hdGNoZXJQYXlsb2FkLGNoZWNrKT0+XG5tYXRjaGVyUGF5bG9hZD09PXVuZGVmaW5lZHx8XG5jaGVjayhmYWxzZSxYIGBtYXRjaDphbnkgcGF5bG9hZDogJHttYXRjaGVyUGF5bG9hZH0gLSBNdXN0IGJlIHVuZGVmaW5lZGApLFxuXG5nZXRSYW5rQ292ZXI6KF9tYXRjaFBheWxvYWQsX2VuY29kZVBhc3NhYmxlKT0+WycnLCd7J10sXG5cbmNoZWNrS2V5UGF0dGVybjooX21hdGNoZXJQYXlsb2FkLF9jaGVjayk9PnRydWV9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hBbmRIZWxwZXI9RmFyKCdtYXRjaDphbmQgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLHBhdHRzLGNoZWNrKT0+e1xucmV0dXJuIHBhdHRzLmV2ZXJ5KChwYXR0KT0+Y2hlY2tNYXRjaGVzKHNwZWNpbWVuLHBhdHQsY2hlY2spKTtcbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDooYWxsZWdlZFBhdHRzLGNoZWNrKT0+e1xuY29uc3QgY2hlY2tJdD0ocGF0dCk9PmNoZWNrUGF0dGVybihwYXR0LGNoZWNrKTtcbnJldHVybihcbihwYXNzU3R5bGVPZihhbGxlZ2VkUGF0dHMpPT09J2NvcHlBcnJheSd8fFxuY2hlY2soZmFsc2UsWCBgTmVlZHMgYXJyYXkgb2Ygc3ViLXBhdHRlcm5zOiAke2FsbGVnZWRQYXR0c31gKSkmJlxuYWxsZWdlZFBhdHRzLmV2ZXJ5KGNoZWNrSXQpKTtcblxuIH0sXG5cbmdldFJhbmtDb3ZlcjoocGF0dHMsZW5jb2RlUGFzc2FibGUpPT5cbmludGVyc2VjdFJhbmtDb3ZlcnMoXG5jb21wYXJlUmFuayxcbnBhdHRzLm1hcCgocCk9PmdldFJhbmtDb3ZlcihwLGVuY29kZVBhc3NhYmxlKSkpLFxuXG5cbmNoZWNrS2V5UGF0dGVybjoocGF0dHMsY2hlY2spPT57XG5yZXR1cm4gcGF0dHMuZXZlcnkoKHBhdHQpPT5jaGVja0tleVBhdHRlcm4ocGF0dCxjaGVjaykpO1xuIH19KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hPckhlbHBlcj1GYXIoJ21hdGNoOm9yIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixwYXR0cyxjaGVjayk9PntcbmNvbnN0e2xlbmd0aH09cGF0dHM7XG5pZihsZW5ndGg9PT0wKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgJHtzcGVjaW1lbn0gLSBubyBwYXR0ZXJuIGRpc2p1bmN0cyB0byBtYXRjaDogJHtwYXR0c31gKTtcblxuIH1cbmlmKFxucGF0dHMubGVuZ3RoPT09MiYmXG4hbWF0Y2hlcyhzcGVjaW1lbixwYXR0c1swXSkmJlxuY2hlY2tLaW5kKHBhdHRzWzBdLCdtYXRjaDpraW5kJyxpZGVudENoZWNrZXIpJiZcbnBhdHRzWzBdLnBheWxvYWQ9PT0ndW5kZWZpbmVkJylcbntcbi8qIFdvcnRoIHNwZWNpYWwgY2FzaW5nIHRoZSBvcHRpb25hbCBwYXR0ZXJuIGZvciovXG4vKiBiZXR0ZXIgZXJyb3IgbWVzc2FnZXMuKi9cbnJldHVybiBjaGVja01hdGNoZXMoc3BlY2ltZW4scGF0dHNbMV0sY2hlY2spO1xuIH1cbmlmKHBhdHRzLnNvbWUoKHBhdHQpPT5tYXRjaGVzKHNwZWNpbWVuLHBhdHQpKSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgJHtzcGVjaW1lbn0gLSBNdXN0IG1hdGNoIG9uZSBvZiAke3BhdHRzfWApO1xuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOm1hdGNoQW5kSGVscGVyLmNoZWNrSXNXZWxsRm9ybWVkLFxuXG5nZXRSYW5rQ292ZXI6KHBhdHRzLGVuY29kZVBhc3NhYmxlKT0+XG51bmlvblJhbmtDb3ZlcnMoXG5jb21wYXJlUmFuayxcbnBhdHRzLm1hcCgocCk9PmdldFJhbmtDb3ZlcihwLGVuY29kZVBhc3NhYmxlKSkpLFxuXG5cbmNoZWNrS2V5UGF0dGVybjoocGF0dHMsY2hlY2spPT57XG5yZXR1cm4gcGF0dHMuZXZlcnkoKHBhdHQpPT5jaGVja0tleVBhdHRlcm4ocGF0dCxjaGVjaykpO1xuIH19KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hOb3RIZWxwZXI9RmFyKCdtYXRjaDpub3QgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLHBhdHQsY2hlY2spPT57XG5pZihtYXRjaGVzKHNwZWNpbWVuLHBhdHQpKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGZhaWwgbmVnYXRlZCBwYXR0ZXJuOiAke3BhdHR9YCk7XG5cbiB9ZWxzZXtcbnJldHVybiB0cnVlO1xuIH1cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDpjaGVja1BhdHRlcm4sXG5cbmdldFJhbmtDb3ZlcjooX3BhdHQsX2VuY29kZVBhc3NhYmxlKT0+WycnLCd7J10sXG5cbmNoZWNrS2V5UGF0dGVybn0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaFNjYWxhckhlbHBlcj1GYXIoJ21hdGNoOnNjYWxhciBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4sX21hdGNoZXJQYXlsb2FkLGNoZWNrKT0+XG5jaGVja1NjYWxhcktleShzcGVjaW1lbixjaGVjayksXG5cbmNoZWNrSXNXZWxsRm9ybWVkOm1hdGNoQW55SGVscGVyLmNoZWNrSXNXZWxsRm9ybWVkLFxuXG5nZXRSYW5rQ292ZXI6KF9tYXRjaFBheWxvYWQsX2VuY29kZVBhc3NhYmxlKT0+WydhJywnen4nXSxcblxuY2hlY2tLZXlQYXR0ZXJuOihfbWF0Y2hlclBheWxvYWQsX2NoZWNrKT0+dHJ1ZX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaEtleUhlbHBlcj1GYXIoJ21hdGNoOmtleSBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4sX21hdGNoZXJQYXlsb2FkLGNoZWNrKT0+XG5jaGVja0tleShzcGVjaW1lbixjaGVjayksXG5cbmNoZWNrSXNXZWxsRm9ybWVkOm1hdGNoQW55SGVscGVyLmNoZWNrSXNXZWxsRm9ybWVkLFxuXG5nZXRSYW5rQ292ZXI6KF9tYXRjaFBheWxvYWQsX2VuY29kZVBhc3NhYmxlKT0+WydhJywnen4nXSxcblxuY2hlY2tLZXlQYXR0ZXJuOihfbWF0Y2hlclBheWxvYWQsX2NoZWNrKT0+dHJ1ZX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaFBhdHRlcm5IZWxwZXI9RmFyKCdtYXRjaDpwYXR0ZXJuIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixfbWF0Y2hlclBheWxvYWQsY2hlY2spPT5cbmNoZWNrUGF0dGVybihzcGVjaW1lbixjaGVjayksXG5cbmNoZWNrSXNXZWxsRm9ybWVkOm1hdGNoQW55SGVscGVyLmNoZWNrSXNXZWxsRm9ybWVkLFxuXG5nZXRSYW5rQ292ZXI6KF9tYXRjaFBheWxvYWQsX2VuY29kZVBhc3NhYmxlKT0+WydhJywnen4nXSxcblxuY2hlY2tLZXlQYXR0ZXJuOihfbWF0Y2hlclBheWxvYWQsX2NoZWNrKT0+dHJ1ZX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaEtpbmRIZWxwZXI9RmFyKCdtYXRjaDpraW5kIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOmNoZWNrS2luZCxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KGFsbGVnZWRLZXlLaW5kLGNoZWNrKT0+XG50eXBlb2YgYWxsZWdlZEtleUtpbmQ9PT0nc3RyaW5nJ3x8XG5jaGVjayhcbmZhbHNlLFxuWCBgbWF0Y2g6a2luZDogcGF5bG9hZDogJHthbGxlZ2VkS2V5S2luZH0gLSBBIGtpbmQgbmFtZSBtdXN0IGJlIGEgc3RyaW5nYCksXG5cblxuZ2V0UmFua0NvdmVyOihraW5kLF9lbmNvZGVQYXNzYWJsZSk9PntcbmxldCBzdHlsZTtcbnN3aXRjaChraW5kKXtcbmNhc2UnY29weVNldCc6XG5jYXNlJ2NvcHlNYXAnOntcbnN0eWxlPSd0YWdnZWQnO1xuYnJlYWs7XG4gfVxuZGVmYXVsdDp7XG5zdHlsZT1raW5kO1xuYnJlYWs7XG4gfX1cblxucmV0dXJuIGdldFBhc3NTdHlsZUNvdmVyKHN0eWxlKTtcbiB9LFxuXG5jaGVja0tleVBhdHRlcm46KGtpbmQsY2hlY2spPT57XG5zd2l0Y2goa2luZCl7XG5jYXNlJ2Jvb2xlYW4nOlxuY2FzZSdudW1iZXInOlxuY2FzZSdiaWdpbnQnOlxuY2FzZSdzdHJpbmcnOlxuY2FzZSdzeW1ib2wnOlxuY2FzZSdyZW1vdGFibGUnOlxuY2FzZSd1bmRlZmluZWQnOntcbnJldHVybiB0cnVlO1xuIH1cbmRlZmF1bHQ6e1xucmV0dXJuIGNoZWNrKGZhbHNlLFggYCR7a2luZH0ga2V5cyBhcmUgbm90IHN1cHBvcnRlZGApO1xuIH19XG5cbiB9fSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoQmlnaW50SGVscGVyPUZhcignbWF0Y2g6YmlnaW50IGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixbbGltaXRzPXVuZGVmaW5lZF0sY2hlY2spPT57XG5jb25zdHtkZWNpbWFsRGlnaXRzTGltaXR9PWxpbWl0KGxpbWl0cyk7XG5yZXR1cm4oXG5jaGVja0tpbmQoc3BlY2ltZW4sJ2JpZ2ludCcsY2hlY2spJiZcbmNoZWNrRGVjaW1hbERpZ2l0c0xpbWl0KHNwZWNpbWVuLGRlY2ltYWxEaWdpdHNMaW1pdCxjaGVjaykpO1xuXG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KHBheWxvYWQsY2hlY2spPT5cbmNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxucGF5bG9hZCxcbmhhcmRlbihbXSksXG5jaGVjayxcbidtYXRjaDpiaWdpbnQgcGF5bG9hZCcpLFxuXG5cbmdldFJhbmtDb3ZlcjooX21hdGNoUGF5bG9hZCxfZW5jb2RlUGFzc2FibGUpPT5cbmdldFBhc3NTdHlsZUNvdmVyKCdiaWdpbnQnKSxcblxuY2hlY2tLZXlQYXR0ZXJuOihfbWF0Y2hlclBheWxvYWQsX2NoZWNrKT0+dHJ1ZX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaE5hdEhlbHBlcj1GYXIoJ21hdGNoOm5hdCBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4sW2xpbWl0cz11bmRlZmluZWRdLGNoZWNrKT0+e1xuY29uc3R7ZGVjaW1hbERpZ2l0c0xpbWl0fT1saW1pdChsaW1pdHMpO1xucmV0dXJuKFxuY2hlY2tLaW5kKHNwZWNpbWVuLCdiaWdpbnQnLGNoZWNrKSYmXG5jaGVjayhzcGVjaW1lbj49MG4sWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGJlIG5vbi1uZWdhdGl2ZWApJiZcbmNoZWNrRGVjaW1hbERpZ2l0c0xpbWl0KHNwZWNpbWVuLGRlY2ltYWxEaWdpdHNMaW1pdCxjaGVjaykpO1xuXG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KHBheWxvYWQsY2hlY2spPT5cbmNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxucGF5bG9hZCxcbmhhcmRlbihbXSksXG5jaGVjayxcbidtYXRjaDpuYXQgcGF5bG9hZCcpLFxuXG5cbmdldFJhbmtDb3ZlcjooX21hdGNoUGF5bG9hZCxfZW5jb2RlUGFzc2FibGUpPT5cbi8qIFRPRE8gQ291bGQgYmUgbW9yZSBwcmVjaXNlKi9cbmdldFBhc3NTdHlsZUNvdmVyKCdiaWdpbnQnKSxcblxuY2hlY2tLZXlQYXR0ZXJuOihfbWF0Y2hlclBheWxvYWQsX2NoZWNrKT0+dHJ1ZX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaFN0cmluZ0hlbHBlcj1GYXIoJ21hdGNoOnN0cmluZyBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4sW2xpbWl0cz11bmRlZmluZWRdLGNoZWNrKT0+e1xuY29uc3R7c3RyaW5nTGVuZ3RoTGltaXR9PWxpbWl0KGxpbWl0cyk7XG5yZXR1cm4oXG5jaGVja0tpbmQoc3BlY2ltZW4sJ3N0cmluZycsY2hlY2spJiYoXG5zcGVjaW1lbi5sZW5ndGg8PXN0cmluZ0xlbmd0aExpbWl0fHxcbmNoZWNrKFxuZmFsc2UsXG5YIGBzdHJpbmcgJHtzcGVjaW1lbn0gbXVzdCBub3QgYmUgYmlnZ2VyIHRoYW4gJHtzdHJpbmdMZW5ndGhMaW1pdH1gKSkpO1xuXG5cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDoocGF5bG9hZCxjaGVjayk9PlxuY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG5wYXlsb2FkLFxuaGFyZGVuKFtdKSxcbmNoZWNrLFxuJ21hdGNoOnN0cmluZyBwYXlsb2FkJyksXG5cblxuZ2V0UmFua0NvdmVyOihfbWF0Y2hQYXlsb2FkLF9lbmNvZGVQYXNzYWJsZSk9PlxuZ2V0UGFzc1N0eWxlQ292ZXIoJ3N0cmluZycpLFxuXG5jaGVja0tleVBhdHRlcm46KF9tYXRjaGVyUGF5bG9hZCxfY2hlY2spPT50cnVlfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoU3ltYm9sSGVscGVyPUZhcignbWF0Y2g6c3ltYm9sIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixbbGltaXRzPXVuZGVmaW5lZF0sY2hlY2spPT57XG5jb25zdHtzeW1ib2xOYW1lTGVuZ3RoTGltaXR9PWxpbWl0KGxpbWl0cyk7XG5pZighY2hlY2tLaW5kKHNwZWNpbWVuLCdzeW1ib2wnLGNoZWNrKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuY29uc3Qgc3ltYm9sTmFtZT1uYW1lRm9yUGFzc2FibGVTeW1ib2woc3BlY2ltZW4pO1xuXG5pZih0eXBlb2Ygc3ltYm9sTmFtZSE9PSdzdHJpbmcnKXtcbnRocm93IEZhaWwgYGludGVybmFsOiBQYXNzYWJsZSBzeW1ib2wgJHtzcGVjaW1lbn0gbXVzdCBoYXZlIGEgcGFzc2FibGUgbmFtZWA7XG4gfVxucmV0dXJuIGNoZWNrKFxuc3ltYm9sTmFtZS5sZW5ndGg8PXN5bWJvbE5hbWVMZW5ndGhMaW1pdCxcblggYFN5bWJvbCBuYW1lICR7cShcbnN5bWJvbE5hbWUpXG4gfSBtdXN0IG5vdCBiZSBiaWdnZXIgdGhhbiAke3N5bWJvbE5hbWVMZW5ndGhMaW1pdH1gKTtcblxuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihwYXlsb2FkLGNoZWNrKT0+XG5jaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbnBheWxvYWQsXG5oYXJkZW4oW10pLFxuY2hlY2ssXG4nbWF0Y2g6YmlnaW50IHBheWxvYWQnKSxcblxuXG5nZXRSYW5rQ292ZXI6KF9tYXRjaFBheWxvYWQsX2VuY29kZVBhc3NhYmxlKT0+XG5nZXRQYXNzU3R5bGVDb3Zlcignc3ltYm9sJyksXG5cbmNoZWNrS2V5UGF0dGVybjooX21hdGNoZXJQYXlsb2FkLF9jaGVjayk9PnRydWV9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hSZW1vdGFibGVIZWxwZXI9RmFyKCdtYXRjaDpyZW1vdGFibGUgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLHJlbW90YWJsZURlc2MsY2hlY2spPT57XG4vKiBVbmZvcnR1bmF0ZSBkdXBsaWNhdGlvbiBvZiBjaGVja0tpbmQgbG9naWMsIGJ1dCBubyBiZXR0ZXIgY2hvaWNlcy4qL1xuaWYoY2hlY2tLaW5kKHNwZWNpbWVuLCdyZW1vdGFibGUnLGlkZW50Q2hlY2tlcikpe1xucmV0dXJuIHRydWU7XG4gfVxuaWYoY2hlY2s9PT1pZGVudENoZWNrZXIpe1xucmV0dXJuIGZhbHNlO1xuIH1cbmxldCBzcGVjaW1lbktpbmQ9cGFzc1N0eWxlT2Yoc3BlY2ltZW4pO1xuaWYoc3BlY2ltZW5LaW5kPT09J3RhZ2dlZCcpe1xuc3BlY2ltZW5LaW5kPWdldFRhZyhzcGVjaW1lbik7XG4gfVxuY29uc3R7bGFiZWx9PXJlbW90YWJsZURlc2M7XG5cbi8qIHF1b3Rpbmcgd2l0aG91dCBxdW90ZXMqL1xuY29uc3QgZGV0YWlscz1YKFxuWyBgJHtzcGVjaW1lbktpbmR9IGAsYCAtIE11c3QgYmUgYSByZW1vdGFibGUgKCR7bGFiZWx9KWBdLFxuc3BlY2ltZW4pO1xuXG5yZXR1cm4gY2hlY2soZmFsc2UsZGV0YWlscyk7XG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KGFsbGVnZWRSZW1vdGFibGVEZXNjLGNoZWNrKT0+XG5jaGVja01hdGNoZXMoXG5hbGxlZ2VkUmVtb3RhYmxlRGVzYyxcbmhhcmRlbih7bGFiZWw6TU0uc3RyaW5nKCl9KSxcbmNoZWNrLFxuJ21hdGNoOnJlbW90YWJsZSBwYXlsb2FkJyksXG5cblxuZ2V0UmFua0NvdmVyOihfcmVtb3RhYmxlRGVzYyxfZW5jb2RlUGFzc2FibGUpPT5cbmdldFBhc3NTdHlsZUNvdmVyKCdyZW1vdGFibGUnKSxcblxuY2hlY2tLZXlQYXR0ZXJuOihfcmVtb3RhYmxlRGVzYyxfY2hlY2spPT50cnVlfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoTFRFSGVscGVyPUZhcignbWF0Y2g6bHRlIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixyaWdodE9wZXJhbmQsY2hlY2spPT5cbmtleUxURShzcGVjaW1lbixyaWdodE9wZXJhbmQpfHxcbmNoZWNrKGZhbHNlLFggYCR7c3BlY2ltZW59IC0gTXVzdCBiZSA8PSAke3JpZ2h0T3BlcmFuZH1gKSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6Y2hlY2tLZXksXG5cbmdldFJhbmtDb3ZlcjoocmlnaHRPcGVyYW5kLGVuY29kZVBhc3NhYmxlKT0+e1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHJpZ2h0T3BlcmFuZCk7XG4vKiBUaGUgcHJlZmVyLWNvbnN0IG1ha2VzIG5vIHNlbnNlIHdoZW4gc29tZSBvZiB0aGUgdmFyaWFibGVzIG5lZWQqL1xuLyogdG8gYmUgYGxldGAqL1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdCovXG5sZXRbbGVmdEJvdW5kLHJpZ2h0Qm91bmRdPWdldFBhc3NTdHlsZUNvdmVyKHBhc3NTdHlsZSk7XG5jb25zdCBuZXdSaWdodEJvdW5kPSBgJHtlbmNvZGVQYXNzYWJsZShyaWdodE9wZXJhbmQpfX5gO1xuaWYobmV3UmlnaHRCb3VuZCE9PXVuZGVmaW5lZCl7XG5yaWdodEJvdW5kPW5ld1JpZ2h0Qm91bmQ7XG4gfVxucmV0dXJuW2xlZnRCb3VuZCxyaWdodEJvdW5kXTtcbiB9LFxuXG5jaGVja0tleVBhdHRlcm46KHJpZ2h0T3BlcmFuZCxjaGVjayk9PlxuY2hlY2tLZXlQYXR0ZXJuKHJpZ2h0T3BlcmFuZCxjaGVjayl9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hMVEhlbHBlcj1GYXIoJ21hdGNoOmx0IGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixyaWdodE9wZXJhbmQsY2hlY2spPT5cbmtleUxUKHNwZWNpbWVuLHJpZ2h0T3BlcmFuZCl8fFxuY2hlY2soZmFsc2UsWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGJlIDwgJHtyaWdodE9wZXJhbmR9YCksXG5cbmNoZWNrSXNXZWxsRm9ybWVkOmNoZWNrS2V5LFxuXG5nZXRSYW5rQ292ZXI6bWF0Y2hMVEVIZWxwZXIuZ2V0UmFua0NvdmVyLFxuXG5jaGVja0tleVBhdHRlcm46KHJpZ2h0T3BlcmFuZCxjaGVjayk9PlxuY2hlY2tLZXlQYXR0ZXJuKHJpZ2h0T3BlcmFuZCxjaGVjayl9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hHVEVIZWxwZXI9RmFyKCdtYXRjaDpndGUgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLHJpZ2h0T3BlcmFuZCxjaGVjayk9Plxua2V5R1RFKHNwZWNpbWVuLHJpZ2h0T3BlcmFuZCl8fFxuY2hlY2soZmFsc2UsWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGJlID49ICR7cmlnaHRPcGVyYW5kfWApLFxuXG5jaGVja0lzV2VsbEZvcm1lZDpjaGVja0tleSxcblxuZ2V0UmFua0NvdmVyOihyaWdodE9wZXJhbmQsZW5jb2RlUGFzc2FibGUpPT57XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YocmlnaHRPcGVyYW5kKTtcbi8qIFRoZSBwcmVmZXItY29uc3QgbWFrZXMgbm8gc2Vuc2Ugd2hlbiBzb21lIG9mIHRoZSB2YXJpYWJsZXMgbmVlZCovXG4vKiB0byBiZSBgbGV0YCovXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0Ki9cbmxldFtsZWZ0Qm91bmQscmlnaHRCb3VuZF09Z2V0UGFzc1N0eWxlQ292ZXIocGFzc1N0eWxlKTtcbmNvbnN0IG5ld0xlZnRCb3VuZD1lbmNvZGVQYXNzYWJsZShyaWdodE9wZXJhbmQpO1xuaWYobmV3TGVmdEJvdW5kIT09dW5kZWZpbmVkKXtcbmxlZnRCb3VuZD1uZXdMZWZ0Qm91bmQ7XG4gfVxucmV0dXJuW2xlZnRCb3VuZCxyaWdodEJvdW5kXTtcbiB9LFxuXG5jaGVja0tleVBhdHRlcm46KHJpZ2h0T3BlcmFuZCxjaGVjayk9PlxuY2hlY2tLZXlQYXR0ZXJuKHJpZ2h0T3BlcmFuZCxjaGVjayl9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hHVEhlbHBlcj1GYXIoJ21hdGNoOmd0IGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixyaWdodE9wZXJhbmQsY2hlY2spPT5cbmtleUdUKHNwZWNpbWVuLHJpZ2h0T3BlcmFuZCl8fFxuY2hlY2soZmFsc2UsWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGJlID4gJHtyaWdodE9wZXJhbmR9YCksXG5cbmNoZWNrSXNXZWxsRm9ybWVkOmNoZWNrS2V5LFxuXG5nZXRSYW5rQ292ZXI6bWF0Y2hHVEVIZWxwZXIuZ2V0UmFua0NvdmVyLFxuXG5jaGVja0tleVBhdHRlcm46KHJpZ2h0T3BlcmFuZCxjaGVjayk9PlxuY2hlY2tLZXlQYXR0ZXJuKHJpZ2h0T3BlcmFuZCxjaGVjayl9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hSZWNvcmRPZkhlbHBlcj1GYXIoJ21hdGNoOnJlY29yZE9mIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihcbnNwZWNpbWVuLFxuW2tleVBhdHQsdmFsdWVQYXR0LGxpbWl0cz11bmRlZmluZWRdLFxuY2hlY2spPT5cbntcbmNvbnN0e251bVByb3BlcnRpZXNMaW1pdCxwcm9wZXJ0eU5hbWVMZW5ndGhMaW1pdH09bGltaXQobGltaXRzKTtcbnJldHVybihcbmNoZWNrS2luZChzcGVjaW1lbiwnY29weVJlY29yZCcsY2hlY2spJiZcbmNoZWNrKFxub3duS2V5cyhzcGVjaW1lbikubGVuZ3RoPD1udW1Qcm9wZXJ0aWVzTGltaXQsXG5YIGBNdXN0IG5vdCBoYXZlIG1vcmUgdGhhbiAke3EoXG5udW1Qcm9wZXJ0aWVzTGltaXQpXG4gfSBwcm9wZXJ0aWVzOiAke3NwZWNpbWVufWApJiZcblxuZW50cmllcyhzcGVjaW1lbikuZXZlcnkoXG4oW2tleSx2YWx1ZV0pPT5cbmFwcGx5TGFiZWxpbmdFcnJvcihcbmNoZWNrLFxuW1xua2V5Lmxlbmd0aDw9cHJvcGVydHlOYW1lTGVuZ3RoTGltaXQsXG5YIGBQcm9wZXJ0eSBuYW1lIG11c3Qgbm90IGJlIGxvbmdlciB0aGFuICR7cShcbnByb3BlcnR5TmFtZUxlbmd0aExpbWl0KVxuIH1gXSxcblxua2V5KSYmXG5cbmNoZWNrTWF0Y2hlcyhcbmhhcmRlbihba2V5LHZhbHVlXSksXG5oYXJkZW4oW2tleVBhdHQsdmFsdWVQYXR0XSksXG5jaGVjayxcbmtleSkpKTtcblxuXG5cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDoocGF5bG9hZCxjaGVjayk9PlxuY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG5wYXlsb2FkLFxuaGFyZGVuKFtNTS5wYXR0ZXJuKCksTU0ucGF0dGVybigpXSksXG5jaGVjayxcbidtYXRjaDpyZWNvcmRPZiBwYXlsb2FkJyksXG5cblxuZ2V0UmFua0NvdmVyOihfZW50cnlQYXR0KT0+Z2V0UGFzc1N0eWxlQ292ZXIoJ2NvcHlSZWNvcmQnKSxcblxuY2hlY2tLZXlQYXR0ZXJuOihfZW50cnlQYXR0LGNoZWNrKT0+XG5jaGVjayhmYWxzZSxYIGBSZWNvcmRzIG5vdCB5ZXQgc3VwcG9ydGVkIGFzIGtleXNgKX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaEFycmF5T2ZIZWxwZXI9RmFyKCdtYXRjaDphcnJheU9mIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixbc3ViUGF0dCxsaW1pdHM9dW5kZWZpbmVkXSxjaGVjayk9PntcbmNvbnN0e2FycmF5TGVuZ3RoTGltaXR9PWxpbWl0KGxpbWl0cyk7XG5yZXR1cm4oXG5jaGVja0tpbmQoc3BlY2ltZW4sJ2NvcHlBcnJheScsY2hlY2spJiYoXG5zcGVjaW1lbi5sZW5ndGg8PWFycmF5TGVuZ3RoTGltaXR8fFxuY2hlY2soXG5mYWxzZSxcblggYEFycmF5IGxlbmd0aCAke3NwZWNpbWVuLmxlbmd0aH0gbXVzdCBiZSA8PSBsaW1pdCAke2FycmF5TGVuZ3RoTGltaXR9YCkpJiZcblxuYXJyYXlFdmVyeU1hdGNoUGF0dGVybihzcGVjaW1lbixzdWJQYXR0LGNoZWNrKSk7XG5cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDoocGF5bG9hZCxjaGVjayk9PlxuY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG5wYXlsb2FkLFxuaGFyZGVuKFtNTS5wYXR0ZXJuKCldKSxcbmNoZWNrLFxuJ21hdGNoOmFycmF5T2YgcGF5bG9hZCcpLFxuXG5cbmdldFJhbmtDb3ZlcjooKT0+Z2V0UGFzc1N0eWxlQ292ZXIoJ2NvcHlBcnJheScpLFxuXG5jaGVja0tleVBhdHRlcm46KF8sY2hlY2spPT5cbmNoZWNrKGZhbHNlLFggYEFycmF5cyBub3QgeWV0IHN1cHBvcnRlZCBhcyBrZXlzYCl9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hTZXRPZkhlbHBlcj1GYXIoJ21hdGNoOnNldE9mIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixba2V5UGF0dCxsaW1pdHM9dW5kZWZpbmVkXSxjaGVjayk9PntcbmNvbnN0e251bVNldEVsZW1lbnRzTGltaXR9PWxpbWl0KGxpbWl0cyk7XG5yZXR1cm4oXG5jaGVja0tpbmQoc3BlY2ltZW4sJ2NvcHlTZXQnLGNoZWNrKSYmXG5jaGVjayhcbnNwZWNpbWVuLnBheWxvYWQubGVuZ3RoPG51bVNldEVsZW1lbnRzTGltaXQsXG5YIGBTZXQgbXVzdCBub3QgaGF2ZSBtb3JlIHRoYW4gJHtxKG51bVNldEVsZW1lbnRzTGltaXQpfSBlbGVtZW50czogJHtcbnNwZWNpbWVuLnBheWxvYWQubGVuZ3RoXG4gfWApJiZcblxuYXJyYXlFdmVyeU1hdGNoUGF0dGVybihzcGVjaW1lbi5wYXlsb2FkLGtleVBhdHQsY2hlY2ssJ3NldCBlbGVtZW50cycpKTtcblxuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihwYXlsb2FkLGNoZWNrKT0+XG5jaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbnBheWxvYWQsXG5oYXJkZW4oW01NLnBhdHRlcm4oKV0pLFxuY2hlY2ssXG4nbWF0Y2g6c2V0T2YgcGF5bG9hZCcpLFxuXG5cbmdldFJhbmtDb3ZlcjooKT0+Z2V0UGFzc1N0eWxlQ292ZXIoJ3RhZ2dlZCcpLFxuXG5jaGVja0tleVBhdHRlcm46KF8sY2hlY2spPT5cbmNoZWNrKGZhbHNlLFggYENvcHlTZXRzIG5vdCB5ZXQgc3VwcG9ydGVkIGFzIGtleXNgKX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaEJhZ09mSGVscGVyPUZhcignbWF0Y2g6YmFnT2YgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KFxuc3BlY2ltZW4sXG5ba2V5UGF0dCxjb3VudFBhdHQsbGltaXRzPXVuZGVmaW5lZF0sXG5jaGVjayk9Plxue1xuY29uc3R7bnVtVW5pcXVlQmFnRWxlbWVudHNMaW1pdCxkZWNpbWFsRGlnaXRzTGltaXR9PWxpbWl0KGxpbWl0cyk7XG5yZXR1cm4oXG5jaGVja0tpbmQoc3BlY2ltZW4sJ2NvcHlCYWcnLGNoZWNrKSYmXG5jaGVjayhcbnNwZWNpbWVuLnBheWxvYWQubGVuZ3RoPD1udW1VbmlxdWVCYWdFbGVtZW50c0xpbWl0LFxuWCBgQmFnIG11c3Qgbm90IGhhdmUgbW9yZSB0aGFuICR7cShcbm51bVVuaXF1ZUJhZ0VsZW1lbnRzTGltaXQpXG4gfSB1bmlxdWUgZWxlbWVudHM6ICR7c3BlY2ltZW59YCkmJlxuXG5zcGVjaW1lbi5wYXlsb2FkLmV2ZXJ5KFxuKFtrZXksY291bnRdLGkpPT5cbmNoZWNrTWF0Y2hlcyhrZXksa2V5UGF0dCxjaGVjaywgYGJhZyBrZXlzWyR7aX1dYCkmJlxuYXBwbHlMYWJlbGluZ0Vycm9yKFxuY2hlY2tEZWNpbWFsRGlnaXRzTGltaXQsXG5bY291bnQsZGVjaW1hbERpZ2l0c0xpbWl0LGNoZWNrXSxcbiBgYmFnIGNvdW50c1ske2l9XWApJiZcblxuY2hlY2tNYXRjaGVzKGNvdW50LGNvdW50UGF0dCxjaGVjaywgYGJhZyBjb3VudHNbJHtpfV1gKSkpO1xuXG5cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDoocGF5bG9hZCxjaGVjayk9PlxuY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG5wYXlsb2FkLFxuaGFyZGVuKFtNTS5wYXR0ZXJuKCksTU0ucGF0dGVybigpXSksXG5jaGVjayxcbidtYXRjaDpiYWdPZiBwYXlsb2FkJyksXG5cblxuZ2V0UmFua0NvdmVyOigpPT5nZXRQYXNzU3R5bGVDb3ZlcigndGFnZ2VkJyksXG5cbmNoZWNrS2V5UGF0dGVybjooXyxjaGVjayk9PlxuY2hlY2soZmFsc2UsWCBgQ29weUJhZ3Mgbm90IHlldCBzdXBwb3J0ZWQgYXMga2V5c2ApfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoTWFwT2ZIZWxwZXI9RmFyKCdtYXRjaDptYXBPZiBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooXG5zcGVjaW1lbixcbltrZXlQYXR0LHZhbHVlUGF0dCxsaW1pdHM9dW5kZWZpbmVkXSxcbmNoZWNrKT0+XG57XG5jb25zdHtudW1NYXBFbnRyaWVzTGltaXR9PWxpbWl0KGxpbWl0cyk7XG5yZXR1cm4oXG5jaGVja0tpbmQoc3BlY2ltZW4sJ2NvcHlNYXAnLGNoZWNrKSYmXG5jaGVjayhcbnNwZWNpbWVuLnBheWxvYWQua2V5cy5sZW5ndGg8PW51bU1hcEVudHJpZXNMaW1pdCxcblggYENvcHlNYXAgbXVzdCBoYXZlIG5vIG1vcmUgdGhhbiAke3EoXG5udW1NYXBFbnRyaWVzTGltaXQpXG4gfSBlbnRyaWVzOiAke3NwZWNpbWVufWApJiZcblxuYXJyYXlFdmVyeU1hdGNoUGF0dGVybihcbnNwZWNpbWVuLnBheWxvYWQua2V5cyxcbmtleVBhdHQsXG5jaGVjayxcbidtYXAga2V5cycpJiZcblxuYXJyYXlFdmVyeU1hdGNoUGF0dGVybihcbnNwZWNpbWVuLnBheWxvYWQudmFsdWVzLFxudmFsdWVQYXR0LFxuY2hlY2ssXG4nbWFwIHZhbHVlcycpKTtcblxuXG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KHBheWxvYWQsY2hlY2spPT5cbmNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxucGF5bG9hZCxcbmhhcmRlbihbTU0ucGF0dGVybigpLE1NLnBhdHRlcm4oKV0pLFxuY2hlY2ssXG4nbWF0Y2g6bWFwT2YgcGF5bG9hZCcpLFxuXG5cbmdldFJhbmtDb3ZlcjooX2VudHJ5UGF0dCk9PmdldFBhc3NTdHlsZUNvdmVyKCd0YWdnZWQnKSxcblxuY2hlY2tLZXlQYXR0ZXJuOihfZW50cnlQYXR0LGNoZWNrKT0+XG5jaGVjayhmYWxzZSxYIGBDb3B5TWFwIG5vdCB5ZXQgc3VwcG9ydGVkIGFzIGtleXNgKX0pO1xuXG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBzcGVjaW1lblxuICogQHBhcmFtIHtQYXR0ZXJuW119IHJlcXVpcmVkUGF0dFxuICogQHBhcmFtIHtQYXR0ZXJuW119IG9wdGlvbmFsUGF0dFxuICogQHJldHVybnMge3tcbiAqICAgcmVxdWlyZWRTcGVjaW1lbjogUGFzc2FibGVbXSxcbiAqICAgb3B0aW9uYWxTcGVjaW1lbjogUGFzc2FibGVbXSxcbiAqICAgcmVzdFNwZWNpbWVuOiBQYXNzYWJsZVtdXG4gKiB9fVxuICovXG5jb25zdCBzcGxpdEFycmF5UGFydHM9KHNwZWNpbWVuLHJlcXVpcmVkUGF0dCxvcHRpb25hbFBhdHQpPT57XG5jb25zdCBudW1SZXF1aXJlZD1yZXF1aXJlZFBhdHQubGVuZ3RoO1xuY29uc3QgbnVtT3B0aW9uYWw9b3B0aW9uYWxQYXR0Lmxlbmd0aDtcbmNvbnN0IHJlcXVpcmVkU3BlY2ltZW49c3BlY2ltZW4uc2xpY2UoMCxudW1SZXF1aXJlZCk7XG5jb25zdCBvcHRpb25hbFNwZWNpbWVuPXNwZWNpbWVuLnNsaWNlKFxubnVtUmVxdWlyZWQsXG5udW1SZXF1aXJlZCtudW1PcHRpb25hbCk7XG5cbmNvbnN0IHJlc3RTcGVjaW1lbj1zcGVjaW1lbi5zbGljZShudW1SZXF1aXJlZCtudW1PcHRpb25hbCk7XG5yZXR1cm4gaGFyZGVuKHtyZXF1aXJlZFNwZWNpbWVuLG9wdGlvbmFsU3BlY2ltZW4scmVzdFNwZWNpbWVufSk7XG4gfTtcblxuLyoqXG4gKiBPcHRpb25hbCBzcGVjaW1lbiBlbGVtZW50cyB3aGljaCBhcmUgYHVuZGVmaW5lZGAgcGFzcyB1bmNvbmRpdGlvbmFsbHkuXG4gKiBXZSBlbmNvZGUgdGhpcyB3aXRoIHRoZSBgTS5vcmAgcGF0dGVybiBzbyBpdCBhbHNvIHByb2R1Y2VzIGEgZ29vZFxuICogY29tcHJlc3Npb24gZGlzdGluZ3Vpc2hpbmcgYHVuZGVmaW5lZGAgZnJvbSBhYnNlbmNlLlxuICpcbiAqIEBwYXJhbSB7UGF0dGVybltdfSBvcHRpb25hbFBhdHRcbiAqIEBwYXJhbSB7bnVtYmVyfSBsZW5ndGhcbiAqIEByZXR1cm5zIHtQYXR0ZXJuW119IFRoZSBwYXJ0aWFsUGF0dFxuICovXG5jb25zdCBhZGFwdEFycmF5UGF0dGVybj0ob3B0aW9uYWxQYXR0LGxlbmd0aCk9PlxuaGFyZGVuKG9wdGlvbmFsUGF0dC5zbGljZSgwLGxlbmd0aCkubWFwKChwYXR0KT0+TU0ub3B0KHBhdHQpKSk7XG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaFNwbGl0QXJyYXlIZWxwZXI9RmFyKCdtYXRjaDpzcGxpdEFycmF5IGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihcbnNwZWNpbWVuLFxuW3JlcXVpcmVkUGF0dCxvcHRpb25hbFBhdHQ9W10scmVzdFBhdHQ9TU0uYW55KCldLFxuY2hlY2spPT5cbntcbmlmKCFjaGVja0tpbmQoc3BlY2ltZW4sJ2NvcHlBcnJheScsY2hlY2spKXtcbnJldHVybiBmYWxzZTtcbiB9XG5jb25zdHtyZXF1aXJlZFNwZWNpbWVuLG9wdGlvbmFsU3BlY2ltZW4scmVzdFNwZWNpbWVufT1cbnNwbGl0QXJyYXlQYXJ0cyhzcGVjaW1lbixyZXF1aXJlZFBhdHQsb3B0aW9uYWxQYXR0KTtcbmNvbnN0IHBhcnRpYWxQYXR0PWFkYXB0QXJyYXlQYXR0ZXJuKFxub3B0aW9uYWxQYXR0LFxub3B0aW9uYWxTcGVjaW1lbi5sZW5ndGgpO1xuXG5sZXQgYXJnTnVtPTA7XG5yZXR1cm4oXG4ocmVxdWlyZWRTcGVjaW1lbi5sZW5ndGg9PT1yZXF1aXJlZFBhdHQubGVuZ3RofHxcbmNoZWNrKFxuZmFsc2UsXG5YIGBFeHBlY3RlZCBhdCBsZWFzdCAke3EoXG5yZXF1aXJlZFBhdHQubGVuZ3RoKVxuIH0gYXJndW1lbnRzOiAke3NwZWNpbWVufWApKSYmXG5cbnJlcXVpcmVkUGF0dC5ldmVyeSgocCxpKT0+XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGx1c3BsdXMqL1xuY2hlY2tNYXRjaGVzKHJlcXVpcmVkU3BlY2ltZW5baV0scCxjaGVjaywgYGFyZyAke2FyZ051bSsrfWApKSYmXG5cbnBhcnRpYWxQYXR0LmV2ZXJ5KChwLGkpPT5cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wbHVzcGx1cyovXG5jaGVja01hdGNoZXMob3B0aW9uYWxTcGVjaW1lbltpXSxwLGNoZWNrLCBgYXJnICR7YXJnTnVtKyt9P2ApKSYmXG5cbmNoZWNrTWF0Y2hlcyhyZXN0U3BlY2ltZW4scmVzdFBhdHQsY2hlY2ssJy4uLnJlc3QnKSk7XG5cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDooc3BsaXRBcnJheSxjaGVjayk9PntcbmlmKFxucGFzc1N0eWxlT2Yoc3BsaXRBcnJheSk9PT0nY29weUFycmF5JyYmKFxuc3BsaXRBcnJheS5sZW5ndGg+PTF8fHNwbGl0QXJyYXkubGVuZ3RoPD0zKSlcbntcbmNvbnN0W3JlcXVpcmVkUGF0dCxvcHRpb25hbFBhdHQ9dW5kZWZpbmVkLHJlc3RQYXR0PXVuZGVmaW5lZF09XG5zcGxpdEFycmF5O1xuaWYoXG5pc1BhdHRlcm4ocmVxdWlyZWRQYXR0KSYmXG5wYXNzU3R5bGVPZihyZXF1aXJlZFBhdHQpPT09J2NvcHlBcnJheScmJihcbm9wdGlvbmFsUGF0dD09PXVuZGVmaW5lZHx8XG5pc1BhdHRlcm4ob3B0aW9uYWxQYXR0KSYmXG5wYXNzU3R5bGVPZihvcHRpb25hbFBhdHQpPT09J2NvcHlBcnJheScpJiYoXG5yZXN0UGF0dD09PXVuZGVmaW5lZHx8aXNQYXR0ZXJuKHJlc3RQYXR0KSkpXG57XG5yZXR1cm4gdHJ1ZTtcbiB9XG4gfVxucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBNdXN0IGJlIGFuIGFycmF5IG9mIGEgcmVxdWlyZWRQYXR0IGFycmF5LCBhbiBvcHRpb25hbCBvcHRpb25hbFBhdHQgYXJyYXksIGFuZCBhbiBvcHRpb25hbCByZXN0UGF0dDogJHtxKFxuc3BsaXRBcnJheSlcbiB9YCk7XG5cbiB9LFxuXG5nZXRSYW5rQ292ZXI6KFtcbl9yZXF1aXJlZFBhdHQsXG5fb3B0aW9uYWxQYXR0PXVuZGVmaW5lZCxcbl9yZXN0UGF0dD11bmRlZmluZWRdKT0+XG5nZXRQYXNzU3R5bGVDb3ZlcignY29weUFycmF5JyksXG5cbmNoZWNrS2V5UGF0dGVybjooXG5bX3JlcXVpcmVkUGF0dCxfb3B0aW9uYWxQYXR0PXVuZGVmaW5lZCxfcmVzdFBhdHQ9dW5kZWZpbmVkXSxcbmNoZWNrKT0+XG5jaGVjayhmYWxzZSxYIGBjb3B5UmVjb3JkIG5vdCB5ZXQgc3VwcG9ydGVkIGFzIGtleXNgKX0pO1xuXG5cbi8qKlxuICogQHBhcmFtIHtDb3B5UmVjb3JkPFBhc3NhYmxlPn0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7Q29weVJlY29yZDxQYXR0ZXJuPn0gcmVxdWlyZWRQYXR0XG4gKiBAcGFyYW0ge0NvcHlSZWNvcmQ8UGF0dGVybj59IG9wdGlvbmFsUGF0dFxuICogQHJldHVybnMge3tcbiAqICAgcmVxdWlyZWRTcGVjaW1lbjogQ29weVJlY29yZDxQYXNzYWJsZT4sXG4gKiAgIG9wdGlvbmFsU3BlY2ltZW46IENvcHlSZWNvcmQ8UGFzc2FibGU+LFxuICogICByZXN0U3BlY2ltZW46IENvcHlSZWNvcmQ8UGFzc2FibGU+XG4gKiB9fVxuICovXG5jb25zdCBzcGxpdFJlY29yZFBhcnRzPShzcGVjaW1lbixyZXF1aXJlZFBhdHQsb3B0aW9uYWxQYXR0KT0+e1xuLyogTm90IGZyb3plbiEgTXV0YXRlZCBpbiBwbGFjZSovXG4vKiogQHR5cGUge1tzdHJpbmcsIFBhc3NhYmxlXVtdfSAqL1xuY29uc3QgcmVxdWlyZWRFbnRyaWVzPVtdO1xuLyoqIEB0eXBlIHtbc3RyaW5nLCBQYXNzYWJsZV1bXX0gKi9cbmNvbnN0IG9wdGlvbmFsRW50cmllcz1bXTtcbi8qKiBAdHlwZSB7W3N0cmluZywgUGFzc2FibGVdW119ICovXG5jb25zdCByZXN0RW50cmllcz1bXTtcbmZvcihjb25zdFtuYW1lLHZhbHVlXW9mIGVudHJpZXMoc3BlY2ltZW4pKXtcbmlmKGhhc093blByb3BlcnR5T2YocmVxdWlyZWRQYXR0LG5hbWUpKXtcbnJlcXVpcmVkRW50cmllcy5wdXNoKFtuYW1lLHZhbHVlXSk7XG4gfWVsc2UgaWYoaGFzT3duUHJvcGVydHlPZihvcHRpb25hbFBhdHQsbmFtZSkpe1xub3B0aW9uYWxFbnRyaWVzLnB1c2goW25hbWUsdmFsdWVdKTtcbiB9ZWxzZXtcbnJlc3RFbnRyaWVzLnB1c2goW25hbWUsdmFsdWVdKTtcbiB9XG4gfVxucmV0dXJuIGhhcmRlbih7XG5yZXF1aXJlZFNwZWNpbWVuOmZyb21VbmlxdWVFbnRyaWVzKHJlcXVpcmVkRW50cmllcyksXG5vcHRpb25hbFNwZWNpbWVuOmZyb21VbmlxdWVFbnRyaWVzKG9wdGlvbmFsRW50cmllcyksXG5yZXN0U3BlY2ltZW46ZnJvbVVuaXF1ZUVudHJpZXMocmVzdEVudHJpZXMpfSk7XG5cbiB9O1xuXG4vKipcbiAqIE9wdGlvbmFsIHNwZWNpbWVuIHZhbHVlcyB3aGljaCBhcmUgYHVuZGVmaW5lZGAgcGFzcyB1bmNvbmRpdGlvbmFsbHkuXG4gKiBXZSBlbmNvZGUgdGhpcyB3aXRoIHRoZSBgTS5vcmAgcGF0dGVybiBzbyBpdCBhbHNvIHByb2R1Y2VzIGEgZ29vZFxuICogY29tcHJlc3Npb24gZGlzdGluZ3Vpc2hpbmcgYHVuZGVmaW5lZGAgZnJvbSBhYnNlbmNlLlxuICpcbiAqIEBwYXJhbSB7Q29weVJlY29yZDxQYXR0ZXJuPn0gb3B0aW9uYWxQYXR0XG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBuYW1lc1xuICogQHJldHVybnMge0NvcHlSZWNvcmQ8UGF0dGVybj59IFRoZSBwYXJ0aWFsUGF0dFxuICovXG5jb25zdCBhZGFwdFJlY29yZFBhdHRlcm49KG9wdGlvbmFsUGF0dCxuYW1lcyk9PlxuZnJvbVVuaXF1ZUVudHJpZXMobmFtZXMubWFwKChuYW1lKT0+W25hbWUsTU0ub3B0KG9wdGlvbmFsUGF0dFtuYW1lXSldKSk7XG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaFNwbGl0UmVjb3JkSGVscGVyPUZhcignbWF0Y2g6c3BsaXRSZWNvcmQgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KFxuc3BlY2ltZW4sXG5bcmVxdWlyZWRQYXR0LG9wdGlvbmFsUGF0dD17fSxyZXN0UGF0dD1NTS5hbnkoKV0sXG5jaGVjayk9Plxue1xuaWYoIWNoZWNrS2luZChzcGVjaW1lbiwnY29weVJlY29yZCcsY2hlY2spKXtcbnJldHVybiBmYWxzZTtcbiB9XG5jb25zdHtyZXF1aXJlZFNwZWNpbWVuLG9wdGlvbmFsU3BlY2ltZW4scmVzdFNwZWNpbWVufT1cbnNwbGl0UmVjb3JkUGFydHMoc3BlY2ltZW4scmVxdWlyZWRQYXR0LG9wdGlvbmFsUGF0dCk7XG5cbmNvbnN0IHBhcnRpYWxOYW1lcz0vKiogQHR5cGUge3N0cmluZ1tdfSAqL293bktleXMob3B0aW9uYWxTcGVjaW1lbik7XG5jb25zdCBwYXJ0aWFsUGF0dD1hZGFwdFJlY29yZFBhdHRlcm4ob3B0aW9uYWxQYXR0LHBhcnRpYWxOYW1lcyk7XG5yZXR1cm4oXG5jaGVja01hdGNoZXMocmVxdWlyZWRTcGVjaW1lbixyZXF1aXJlZFBhdHQsY2hlY2spJiZcbnBhcnRpYWxOYW1lcy5ldmVyeSgobmFtZSk9PlxuY2hlY2tNYXRjaGVzKFxub3B0aW9uYWxTcGVjaW1lbltuYW1lXSxcbnBhcnRpYWxQYXR0W25hbWVdLFxuY2hlY2ssXG4gYCR7bmFtZX0/YCkpJiZcblxuXG5jaGVja01hdGNoZXMocmVzdFNwZWNpbWVuLHJlc3RQYXR0LGNoZWNrLCcuLi5yZXN0JykpO1xuXG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KHNwbGl0QXJyYXksY2hlY2spPT57XG5pZihcbnBhc3NTdHlsZU9mKHNwbGl0QXJyYXkpPT09J2NvcHlBcnJheScmJihcbnNwbGl0QXJyYXkubGVuZ3RoPj0xfHxzcGxpdEFycmF5Lmxlbmd0aDw9MykpXG57XG5jb25zdFtyZXF1aXJlZFBhdHQsb3B0aW9uYWxQYXR0PXVuZGVmaW5lZCxyZXN0UGF0dD11bmRlZmluZWRdPVxuc3BsaXRBcnJheTtcbmlmKFxuaXNQYXR0ZXJuKHJlcXVpcmVkUGF0dCkmJlxucGFzc1N0eWxlT2YocmVxdWlyZWRQYXR0KT09PSdjb3B5UmVjb3JkJyYmKFxub3B0aW9uYWxQYXR0PT09dW5kZWZpbmVkfHxcbmlzUGF0dGVybihvcHRpb25hbFBhdHQpJiZcbnBhc3NTdHlsZU9mKG9wdGlvbmFsUGF0dCk9PT0nY29weVJlY29yZCcpJiYoXG5yZXN0UGF0dD09PXVuZGVmaW5lZHx8aXNQYXR0ZXJuKHJlc3RQYXR0KSkpXG57XG5yZXR1cm4gdHJ1ZTtcbiB9XG4gfVxucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBNdXN0IGJlIGFuIGFycmF5IG9mIGEgcmVxdWlyZWRQYXR0IHJlY29yZCwgYW4gb3B0aW9uYWwgb3B0aW9uYWxQYXR0IHJlY29yZCwgYW5kIGFuIG9wdGlvbmFsIHJlc3RQYXR0OiAke3EoXG5zcGxpdEFycmF5KVxuIH1gKTtcblxuIH0sXG5cbmdldFJhbmtDb3ZlcjooW1xucmVxdWlyZWRQYXR0LFxuX29wdGlvbmFsUGF0dD11bmRlZmluZWQsXG5fcmVzdFBhdHQ9dW5kZWZpbmVkXSk9PlxuZ2V0UGFzc1N0eWxlQ292ZXIocGFzc1N0eWxlT2YocmVxdWlyZWRQYXR0KSksXG5cbmNoZWNrS2V5UGF0dGVybjooXG5bX3JlcXVpcmVkUGF0dCxfb3B0aW9uYWxQYXR0PXVuZGVmaW5lZCxfcmVzdFBhdHQ9dW5kZWZpbmVkXSxcbmNoZWNrKT0+XG5jaGVjayhmYWxzZSxYIGBjb3B5UmVjb3JkIG5vdCB5ZXQgc3VwcG9ydGVkIGFzIGtleXNgKX0pO1xuXG5cbi8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgTWF0Y2hIZWxwZXI+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+bWFrZU1ldGhvZEd1YXJkTWFrZXIoJ2FzeW5jJyxhcmdHdWFyZHMpLFxuXG5hd2FpdDooYXJnR3VhcmQpPT5tYWtlQXdhaXRBcmdHdWFyZChhcmdHdWFyZCl9KTtcblxuXG5yZXR1cm4gaGFyZGVuKHtcbmNoZWNrTWF0Y2hlcyxcbm1hdGNoZXMsXG5maXQsXG5hc3NlcnRQYXR0ZXJuLFxuaXNQYXR0ZXJuLFxuYXNzZXJ0S2V5UGF0dGVybixcbmlzS2V5UGF0dGVybixcbmdldFJhbmtDb3Zlcixcbk19KTtcblxuIH07XG5cbi8qIE9ubHkgaW5jbHVkZSB0aG9zZSB3aG9zZSBtZWFuaW5nIGlzIGluZGVwZW5kZW50IG9mIGFuIGltcHV0ZWQgc29ydCBvcmRlciovXG4vKiBvZiByZW1vdGFibGVzLCBvciBvZiBlbmNvZGluZyBvZiBwYXNzYWJsZSBhcyBzb3J0YWJsZSBzdHJpbmdzLiBUaHVzLCovXG4vKiBnZXRSYW5rQ292ZXIgaXMgb21pdHRlZC4gVG8gZ2V0IG9uZSwgeW91J2QgbmVlZCB0byBpbnN0YW50aWF0ZSovXG4vKiBgbWFrZVBhdHRlcm5LaXQoKWAgeW91cnNlbGYuIFNpbmNlIHRoZXJlIGFyZSBjdXJyZW50bHkgbm8gZXh0ZXJuYWwqL1xuLyogdXNlcyBvZiBgZ2V0UmFua0NvdmVyYCwgZm9yIGNsYXJpdHkgZHVyaW5nIGRldmVsb3BtZW50LCBgbWFrZVBhdHRlcm5LaXRgKi9cbi8qIGlzIG5vdCBjdXJyZW50bHkgZXhwb3J0ZWQuKi9cbmNvbnN0ICAgICAgIHtcbmNoZWNrTWF0Y2hlcyxcbm1hdGNoZXMsXG5maXQsXG5hc3NlcnRQYXR0ZXJuLFxuaXNQYXR0ZXJuLFxuYXNzZXJ0S2V5UGF0dGVybixcbmlzS2V5UGF0dGVybixcbmdldFJhbmtDb3Zlcixcbk19PVxubWFrZVBhdHRlcm5LaXQoKTskaOKAjV9vbmNlLmNoZWNrTWF0Y2hlcyhjaGVja01hdGNoZXMpOyRo4oCNX29uY2UubWF0Y2hlcyhtYXRjaGVzKTskaOKAjV9vbmNlLmZpdChmaXQpOyRo4oCNX29uY2UuYXNzZXJ0UGF0dGVybihhc3NlcnRQYXR0ZXJuKTskaOKAjV9vbmNlLmlzUGF0dGVybihpc1BhdHRlcm4pOyRo4oCNX29uY2UuYXNzZXJ0S2V5UGF0dGVybihhc3NlcnRLZXlQYXR0ZXJuKTskaOKAjV9vbmNlLmlzS2V5UGF0dGVybihpc0tleVBhdHRlcm4pOyRo4oCNX29uY2UuZ2V0UmFua0NvdmVyKGdldFJhbmtDb3Zlcik7JGjigI1fb25jZS5NKE0pO1xuXG5NTT1NO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZmF1bHRMaW1pdHMiOlsiZGVmYXVsdExpbWl0cyJdLCJjaGVja01hdGNoZXMiOlsiY2hlY2tNYXRjaGVzIl0sIm1hdGNoZXMiOlsibWF0Y2hlcyJdLCJmaXQiOlsiZml0Il0sImFzc2VydFBhdHRlcm4iOlsiYXNzZXJ0UGF0dGVybiJdLCJpc1BhdHRlcm4iOlsiaXNQYXR0ZXJuIl0sImFzc2VydEtleVBhdHRlcm4iOlsiYXNzZXJ0S2V5UGF0dGVybiJdLCJpc0tleVBhdHRlcm4iOlsiaXNLZXlQYXR0ZXJuIl0sImdldFJhbmtDb3ZlciI6WyJnZXRSYW5rQ292ZXIiXSwiTSI6WyJNIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHMpU07wPAAA8DwAAC4AAABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvcGF0dGVybnMvcmFua09yZGVyLmpzeyJpbXBvcnRzIjpbIi4vZW5jb2RlUGFzc2FibGUuanMiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsiRnVsbFJhbmtDb3ZlciIsImFzc2VydFJhbmtTb3J0ZWQiLCJjb21wYXJhdG9yTWlycm9ySW1hZ2UiLCJjb21wYXJlQW50aVJhbmsiLCJjb21wYXJlUmFuayIsImNvdmVyZWRFbnRyaWVzIiwiZ2V0SW5kZXhDb3ZlciIsImdldFBhc3NTdHlsZUNvdmVyIiwiaW50ZXJzZWN0UmFua0NvdmVycyIsImlzUmFua1NvcnRlZCIsIm1ha2VDb21wYXJhdG9yS2l0IiwibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQiLCJzb3J0QnlSYW5rIiwidW5pb25SYW5rQ292ZXJzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGdldFRhZyxuYW1lRm9yUGFzc2FibGVTeW1ib2wscGFzc1N0eWxlT2YscGFzc1N0eWxlUHJlZml4ZXMscmVjb3JkTmFtZXMscmVjb3JkVmFsdWVzOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcImdldFRhZ1wiLCBbJGjigI1fYSA9PiAoZ2V0VGFnID0gJGjigI1fYSldXSxbXCJuYW1lRm9yUGFzc2FibGVTeW1ib2xcIiwgWyRo4oCNX2EgPT4gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9ICRo4oCNX2EpXV0sW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXV1dLFtcIi4vZW5jb2RlUGFzc2FibGUuanNcIiwgW1tcInBhc3NTdHlsZVByZWZpeGVzXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVQcmVmaXhlcyA9ICRo4oCNX2EpXV0sW1wicmVjb3JkTmFtZXNcIiwgWyRo4oCNX2EgPT4gKHJlY29yZE5hbWVzID0gJGjigI1fYSldXSxbXCJyZWNvcmRWYWx1ZXNcIiwgWyRo4oCNX2EgPT4gKHJlY29yZFZhbHVlcyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuUGFzc1N0eWxlfSBQYXNzU3R5bGUgKi9cblxuY29uc3R7cXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5jb25zdHtlbnRyaWVzLGZyb21FbnRyaWVzLHNldFByb3RvdHlwZU9mLGlzfT1PYmplY3Q7XG5cbi8qKlxuICogVGhpcyBpcyB0aGUgZXF1YWxpdHkgY29tcGFyaXNvbiB1c2VkIGJ5IEphdmFTY3JpcHQncyBNYXAgYW5kIFNldFxuICogYWJzdHJhY3Rpb25zLCB3aGVyZSBOYU4gaXMgdGhlIHNhbWUgYXMgTmFOIGFuZCAtMCBpcyB0aGUgc2FtZSBhc1xuICogMC4gTWFyc2hhbCBzZXJpYWxpemVzIC0wIGFzIHplcm8sIHNvIHRoZSBzZW1hbnRpY3Mgb2Ygb3VyIGRpc3RyaWJ1dGVkXG4gKiBvYmplY3Qgc3lzdGVtIGRvZXMgbm90IGRpc3Rpbmd1aXNoIDAgZnJvbSAtMC5cbiAqXG4gKiBgc2FtZVZhbHVlWmVyb2AgaXMgdGhlIEVjbWFTY3JpcHQgc3BlYyBuYW1lIGZvciB0aGlzIGVxdWFsaXR5IGNvbXBhcmlzb24sXG4gKiBidXQgVE9ETyB3ZSBuZWVkIGEgYmV0dGVyIG5hbWUgZm9yIHRoZSBBUEkuXG4gKlxuICogQHBhcmFtIHthbnl9IHhcbiAqIEBwYXJhbSB7YW55fSB5XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3Qgc2FtZVZhbHVlWmVybz0oeCx5KT0+eD09PXl8fGlzKHgseSk7XG5cbmNvbnN0IHRyaXZpYWxDb21wYXJhdG9yPShsZWZ0LHJpZ2h0KT0+XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmVzdGVkLXRlcm5hcnkqL1xubGVmdDxyaWdodD8tMTpsZWZ0PT09cmlnaHQ/MDoxO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8UGFzc1N0eWxlLCB7IGluZGV4OiBudW1iZXIsIGNvdmVyOiBSYW5rQ292ZXIgfT59IFBhc3NTdHlsZVJhbmtzUmVjb3JkXG4gKi9cblxuY29uc3QgcGFzc1N0eWxlUmFua3M9LyoqIEB0eXBlIHtQYXNzU3R5bGVSYW5rc1JlY29yZH0gKi9cbmZyb21FbnRyaWVzKFxuZW50cmllcyhwYXNzU3R5bGVQcmVmaXhlcylcbi8qIFNvcnQgZW50cmllcyBieSBhc2NlbmRpbmcgcHJlZml4LiovLlxuc29ydCgoW19sZWZ0U3R5bGUsbGVmdFByZWZpeGVzXSxbX3JpZ2h0U3R5bGUscmlnaHRQcmVmaXhlc10pPT57XG5yZXR1cm4gdHJpdmlhbENvbXBhcmF0b3IobGVmdFByZWZpeGVzLHJpZ2h0UHJlZml4ZXMpO1xuIH0pLlxubWFwKChbcGFzc1N0eWxlLHByZWZpeGVzXSxpbmRleCk9Pntcbi8qIENvdmVyIGFsbCBzdHJpbmdzIHRoYXQgc3RhcnQgd2l0aCBhbnkgY2hhcmFjdGVyIGluIGBwcmVmaXhlc2AsKi9cbi8qIHZlcmlmeWluZyB0aGF0IGl0IGlzIHNvcnRlZCBzbyB0aGF0IGlzKi9cbi8qIGFsbCBzIHN1Y2ggdGhhdCBwcmVmaXhlcy5hdCgwKSDiiaQgcyA8IHN1Y2Nlc3NvcihwcmVmaXhlcy5hdCgtMSkpLiovXG5wcmVmaXhlcz09PVsuLi5wcmVmaXhlc10uc29ydCgpLmpvaW4oJycpfHxcbkZhaWwgYHVuc29ydGVkIHByZWZpeGVzIGZvciBwYXNzU3R5bGUgJHtxKHBhc3NTdHlsZSl9OiAke3EocHJlZml4ZXMpfWA7XG5jb25zdCBjb3Zlcj1bXG5wcmVmaXhlcy5jaGFyQXQoMCksXG5TdHJpbmcuZnJvbUNoYXJDb2RlKHByZWZpeGVzLmNoYXJDb2RlQXQocHJlZml4ZXMubGVuZ3RoLTEpKzEpXTtcblxucmV0dXJuW3Bhc3NTdHlsZSx7aW5kZXgsY292ZXJ9XTtcbiB9KSk7XG5cblxuc2V0UHJvdG90eXBlT2YocGFzc1N0eWxlUmFua3MsbnVsbCk7XG5oYXJkZW4ocGFzc1N0eWxlUmFua3MpO1xuXG4vKipcbiAqIEFzc29jaWF0ZSB3aXRoIGVhY2ggcGFzc1N0eWxlIGEgUmFua0NvdmVyIHRoYXQgbWF5IGJlIGFuIG92ZXJlc3RpbWF0ZSxcbiAqIGFuZCB3aG9zZSByZXN1bHRzIHRoZXJlZm9yZSBuZWVkIHRvIGJlIGZpbHRlcmVkIGRvd24uIEZvciBleGFtcGxlLCBiZWNhdXNlXG4gKiB0aGVyZSBpcyBub3QgYSBzbWFsbGVzdCBvciBiaWdnZXN0IGJpZ2ludCwgYm91bmQgaXQgYnkgYE5hTmAgKHRoZSBsYXN0IHBsYWNlXG4gKiBudW1iZXIpIGFuZCBgJydgICh0aGUgZW1wdHkgc3RyaW5nLCB3aGljaCBpcyB0aGUgZmlyc3QgcGxhY2Ugc3RyaW5nKS4gVGh1cyxcbiAqIGEgcmFuZ2UgcXVlcnkgdXNpbmcgdGhpcyByYW5nZSBtYXkgaW5jbHVkZSB0aGVzZSB2YWx1ZXMsIHdoaWNoIHdvdWxkIHRoZW5cbiAqIG5lZWQgdG8gYmUgZmlsdGVyZWQgb3V0LlxuICpcbiAqIEBwYXJhbSB7UGFzc1N0eWxlfSBwYXNzU3R5bGVcbiAqIEByZXR1cm5zIHtSYW5rQ292ZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBnZXRQYXNzU3R5bGVDb3Zlcj0ocGFzc1N0eWxlKT0+cGFzc1N0eWxlUmFua3NbcGFzc1N0eWxlXS5jb3ZlcjskaOKAjV9vbmNlLmdldFBhc3NTdHlsZUNvdmVyKGdldFBhc3NTdHlsZUNvdmVyKTtcbmhhcmRlbihnZXRQYXNzU3R5bGVDb3Zlcik7XG5cbi8qKlxuICogQHR5cGUge1dlYWtNYXA8UmFua0NvbXBhcmUsV2Vha1NldDxQYXNzYWJsZVtdPj59XG4gKi9cbmNvbnN0IG1lbW9PZlNvcnRlZD1uZXcgV2Vha01hcCgpO1xuXG4vKipcbiAqIEB0eXBlIHtXZWFrTWFwPFJhbmtDb21wYXJlLFJhbmtDb21wYXJlPn1cbiAqL1xuY29uc3QgY29tcGFyYXRvck1pcnJvckltYWdlcz1uZXcgV2Vha01hcCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmU9fSBjb21wYXJlUmVtb3RhYmxlc1xuICogQW4gb3B0aW9uIHRvIGNyZWF0ZSBhIGNvbXBhcmF0b3IgaW4gd2hpY2ggYW4gaW50ZXJuYWwgb3JkZXIgaXNcbiAqIGFzc2lnbmVkIHRvIHJlbW90YWJsZXMuIFRoaXMgZGVmYXVsdHMgdG8gYSBjb21wYXJhdG9yIHRoYXRcbiAqIGFsd2F5cyByZXR1cm5zIGAwYCwgbWVhbmluZyB0aGF0IGFsbCByZW1vdGFibGVzIGFyZSB0aWVkXG4gKiBmb3IgdGhlIHNhbWUgcmFuay5cbiAqIEByZXR1cm5zIHtSYW5rQ29tcGFyYXRvcktpdH1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VDb21wYXJhdG9yS2l0PShjb21wYXJlUmVtb3RhYmxlcz0oX3gsX3kpPT4wKT0+e1xuLyoqIEB0eXBlIHtSYW5rQ29tcGFyZX0gKi9cbmNvbnN0IGNvbXBhcmF0b3I9KGxlZnQscmlnaHQpPT57XG5pZihzYW1lVmFsdWVaZXJvKGxlZnQscmlnaHQpKXtcbnJldHVybiAwO1xuIH1cbmNvbnN0IGxlZnRTdHlsZT1wYXNzU3R5bGVPZihsZWZ0KTtcbmNvbnN0IHJpZ2h0U3R5bGU9cGFzc1N0eWxlT2YocmlnaHQpO1xuaWYobGVmdFN0eWxlIT09cmlnaHRTdHlsZSl7XG5yZXR1cm4gdHJpdmlhbENvbXBhcmF0b3IoXG5wYXNzU3R5bGVSYW5rc1tsZWZ0U3R5bGVdLmluZGV4LFxucGFzc1N0eWxlUmFua3NbcmlnaHRTdHlsZV0uaW5kZXgpO1xuXG4gfVxuc3dpdGNoKGxlZnRTdHlsZSl7XG5jYXNlJ3JlbW90YWJsZSc6e1xucmV0dXJuIGNvbXBhcmVSZW1vdGFibGVzKGxlZnQscmlnaHQpO1xuIH1cbmNhc2UndW5kZWZpbmVkJzpcbmNhc2UnbnVsbCc6XG5jYXNlJ2Vycm9yJzpcbmNhc2UncHJvbWlzZSc6e1xuLyogRm9yIGVhY2ggb2YgdGhlc2UgcGFzc1N0eWxlcywgYWxsIG1lbWJlcnMgb2YgdGhhdCBwYXNzU3R5bGUgYXJlIHRpZWQqL1xuLyogZm9yIHRoZSBzYW1lIHJhbmsuKi9cbnJldHVybiAwO1xuIH1cbmNhc2UnYm9vbGVhbic6XG5jYXNlJ2JpZ2ludCc6XG5jYXNlJ3N0cmluZyc6e1xuLyogV2l0aGluIGVhY2ggb2YgdGhlc2UgcGFzc1N0eWxlcywgdGhlIHJhbmsgb3JkZXJpbmcgYWdyZWVzIHdpdGgqL1xuLyogSmF2YVNjcmlwdCdzIHJlbGF0aW9uYWwgb3BlcmF0b3JzIGA8YCBhbmQgYD5gLiovXG5pZihsZWZ0PHJpZ2h0KXtcbnJldHVybi0xO1xuIH1lbHNle1xuYXNzZXJ0KGxlZnQ+cmlnaHQpO1xucmV0dXJuIDE7XG4gfVxuIH1cbmNhc2Unc3ltYm9sJzp7XG5yZXR1cm4gY29tcGFyYXRvcihcbm5hbWVGb3JQYXNzYWJsZVN5bWJvbChsZWZ0KSxcbm5hbWVGb3JQYXNzYWJsZVN5bWJvbChyaWdodCkpO1xuXG4gfVxuY2FzZSdudW1iZXInOntcbi8qIGBOYU5gJ3MgcmFuayBpcyBhZnRlciBhbGwgb3RoZXIgbnVtYmVycy4qL1xuaWYoTnVtYmVyLmlzTmFOKGxlZnQpKXtcbmFzc2VydCghTnVtYmVyLmlzTmFOKHJpZ2h0KSk7XG5yZXR1cm4gMTtcbiB9ZWxzZSBpZihOdW1iZXIuaXNOYU4ocmlnaHQpKXtcbnJldHVybi0xO1xuIH1cbi8qIFRoZSByYW5rIG9yZGVyaW5nIG9mIG5vbi1OYU4gbnVtYmVycyBhZ3JlZXMgd2l0aCBKYXZhU2NyaXB0J3MqL1xuLyogcmVsYXRpb25hbCBvcGVyYXRvcnMgJzwnIGFuZCAnPicuKi9cbmlmKGxlZnQ8cmlnaHQpe1xucmV0dXJuLTE7XG4gfWVsc2V7XG5hc3NlcnQobGVmdD5yaWdodCk7XG5yZXR1cm4gMTtcbiB9XG4gfVxuY2FzZSdjb3B5UmVjb3JkJzp7XG4vKiBMZXhpY29ncmFwaGljIGJ5IGludmVyc2Ugc29ydGVkIG9yZGVyIG9mIHByb3BlcnR5IG5hbWVzLCB0aGVuKi9cbi8qIGxleGljb2dyYXBoaWMgYnkgY29ycmVzcG9uZGluZyB2YWx1ZXMgaW4gdGhhdCBzYW1lIGludmVyc2UqL1xuLyogb3JkZXIgb2YgdGhlaXIgcHJvcGVydHkgbmFtZXMuIENvbXBhcmluZyBuYW1lcyBieSB0aGVtc2VsdmVzIGZpcnN0LCovXG4vKiBhbGwgcmVjb3JkcyB3aXRoIHRoZSBleGFjdCBzYW1lIHNldCBvZiBwcm9wZXJ0eSBuYW1lcyBzb3J0IG5leHQgdG8qL1xuLyogZWFjaCBvdGhlciBpbiBhIHJhbmstc29ydCBvZiBjb3B5UmVjb3Jkcy4qL1xuXG4vKiBUaGUgY29weVJlY29yZCBpbnZhcmlhbnRzIGVuZm9yY2VkIGJ5IHBhc3NTdHlsZU9mIGVuc3VyZSB0aGF0Ki9cbi8qIGFsbCB0aGUgcHJvcGVydHkgbmFtZXMgYXJlIHN0cmluZ3MuIFdlIG5lZWQgdGhlIHJldmVyc2Ugc29ydGVkIG9yZGVyKi9cbi8qIG9mIHRoZXNlIG5hbWVzLCB3aGljaCB3ZSB0aGVuIGNvbXBhcmUgbGV4aWNvZ3JhcGhpY2FsbHkuIFRoaXMgZW5zdXJlcyovXG4vKiB0aGF0IGlmIHRoZSBuYW1lcyBvZiByZWNvcmQgWCBhcmUgYSBzdWJzZXQgb2YgdGhlIG5hbWVzIG9mIHJlY29yZCBZLCovXG4vKiB0aGVuIHJlY29yZCBYIHdpbGwgaGF2ZSBhbiBlYXJsaWVyIHJhbmsgYW5kIHNvcnQgdG8gdGhlIGxlZnQgb2YgWS4qL1xuY29uc3QgbGVmdE5hbWVzPXJlY29yZE5hbWVzKGxlZnQpO1xuY29uc3QgcmlnaHROYW1lcz1yZWNvcmROYW1lcyhyaWdodCk7XG5cbmNvbnN0IHJlc3VsdD1jb21wYXJhdG9yKGxlZnROYW1lcyxyaWdodE5hbWVzKTtcbmlmKHJlc3VsdCE9PTApe1xucmV0dXJuIHJlc3VsdDtcbiB9XG5yZXR1cm4gY29tcGFyYXRvcihcbnJlY29yZFZhbHVlcyhsZWZ0LGxlZnROYW1lcyksXG5yZWNvcmRWYWx1ZXMocmlnaHQscmlnaHROYW1lcykpO1xuXG4gfVxuY2FzZSdjb3B5QXJyYXknOntcbi8qIExleGljb2dyYXBoaWMqL1xuY29uc3QgbGVuPU1hdGgubWluKGxlZnQubGVuZ3RoLHJpZ2h0Lmxlbmd0aCk7XG5mb3IobGV0IGk9MDtpPGxlbjtpKz0xKXtcbmNvbnN0IHJlc3VsdD1jb21wYXJhdG9yKGxlZnRbaV0scmlnaHRbaV0pO1xuaWYocmVzdWx0IT09MCl7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbiB9XG4vKiBJZiBhbGwgbWF0Y2hpbmcgZWxlbWVudHMgd2VyZSB0aWVkLCB0aGVuIGFjY29yZGluZyB0byB0aGVpciBsZW5ndGhzLiovXG4vKiBJZiBhcnJheSBYIGlzIGEgcHJlZml4IG9mIGFycmF5IFksIHRoZW4gWCBoYXMgYW4gZWFybGllciByYW5rIHRoYW4gWS4qL1xucmV0dXJuIGNvbXBhcmF0b3IobGVmdC5sZW5ndGgscmlnaHQubGVuZ3RoKTtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xuLyogTGV4aWNvZ3JhcGhpYyBieSBgW1N5bWJvbC50b1N0cmluZ1RhZ11gIHRoZW4gYC5wYXlsb2FkYC4qL1xuY29uc3QgbGFiZWxDb21wPWNvbXBhcmF0b3IoZ2V0VGFnKGxlZnQpLGdldFRhZyhyaWdodCkpO1xuaWYobGFiZWxDb21wIT09MCl7XG5yZXR1cm4gbGFiZWxDb21wO1xuIH1cbnJldHVybiBjb21wYXJhdG9yKGxlZnQucGF5bG9hZCxyaWdodC5wYXlsb2FkKTtcbiB9XG5kZWZhdWx0OntcbnRocm93IEZhaWwgYFVucmVjb2duaXplZCBwYXNzU3R5bGU6ICR7cShsZWZ0U3R5bGUpfWA7XG4gfX1cblxuIH07XG5cbi8qKiBAdHlwZSB7UmFua0NvbXBhcmV9ICovXG5jb25zdCBhbnRpQ29tcGFyYXRvcj0oeCx5KT0+Y29tcGFyYXRvcih5LHgpO1xuXG5tZW1vT2ZTb3J0ZWQuc2V0KGNvbXBhcmF0b3IsbmV3IFdlYWtTZXQoKSk7XG5tZW1vT2ZTb3J0ZWQuc2V0KGFudGlDb21wYXJhdG9yLG5ldyBXZWFrU2V0KCkpO1xuY29tcGFyYXRvck1pcnJvckltYWdlcy5zZXQoY29tcGFyYXRvcixhbnRpQ29tcGFyYXRvcik7XG5jb21wYXJhdG9yTWlycm9ySW1hZ2VzLnNldChhbnRpQ29tcGFyYXRvcixjb21wYXJhdG9yKTtcblxucmV0dXJuIGhhcmRlbih7Y29tcGFyYXRvcixhbnRpQ29tcGFyYXRvcn0pO1xuIH07XG4vKipcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmF0b3JcbiAqIEByZXR1cm5zIHtSYW5rQ29tcGFyZT19XG4gKi8kaOKAjV9vbmNlLm1ha2VDb21wYXJhdG9yS2l0KG1ha2VDb21wYXJhdG9yS2l0KTtcbmNvbnN0ICAgICAgICBjb21wYXJhdG9yTWlycm9ySW1hZ2U9KGNvbXBhcmF0b3IpPT5cbmNvbXBhcmF0b3JNaXJyb3JJbWFnZXMuZ2V0KGNvbXBhcmF0b3IpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gcGFzc2FibGVzXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqLyRo4oCNX29uY2UuY29tcGFyYXRvck1pcnJvckltYWdlKGNvbXBhcmF0b3JNaXJyb3JJbWFnZSk7XG5jb25zdCAgICAgICAgaXNSYW5rU29ydGVkPShwYXNzYWJsZXMsY29tcGFyZSk9PntcbmNvbnN0IHN1Yk1lbW9PZlNvcnRlZD1tZW1vT2ZTb3J0ZWQuZ2V0KGNvbXBhcmUpO1xuYXNzZXJ0KHN1Yk1lbW9PZlNvcnRlZCE9PXVuZGVmaW5lZCk7XG5pZihzdWJNZW1vT2ZTb3J0ZWQuaGFzKHBhc3NhYmxlcykpe1xucmV0dXJuIHRydWU7XG4gfVxuYXNzZXJ0KHBhc3NTdHlsZU9mKHBhc3NhYmxlcyk9PT0nY29weUFycmF5Jyk7XG5mb3IobGV0IGk9MTtpPHBhc3NhYmxlcy5sZW5ndGg7aSs9MSl7XG5pZihjb21wYXJlKHBhc3NhYmxlc1tpLTFdLHBhc3NhYmxlc1tpXSk+PTEpe1xucmV0dXJuIGZhbHNlO1xuIH1cbiB9XG5zdWJNZW1vT2ZTb3J0ZWQuYWRkKHBhc3NhYmxlcyk7XG5yZXR1cm4gdHJ1ZTtcbiB9OyRo4oCNX29uY2UuaXNSYW5rU29ydGVkKGlzUmFua1NvcnRlZCk7XG5oYXJkZW4oaXNSYW5rU29ydGVkKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IHNvcnRlZFxuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICovXG5jb25zdCAgICAgICAgYXNzZXJ0UmFua1NvcnRlZD0oc29ydGVkLGNvbXBhcmUpPT5cbmlzUmFua1NvcnRlZChzb3J0ZWQsY29tcGFyZSl8fFxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbkZhaWwgYE11c3QgYmUgcmFuayBzb3J0ZWQ6ICR7c29ydGVkfSB2cyAke3NvcnRCeVJhbmsoc29ydGVkLGNvbXBhcmUpfWA7JGjigI1fb25jZS5hc3NlcnRSYW5rU29ydGVkKGFzc2VydFJhbmtTb3J0ZWQpO1xuaGFyZGVuKGFzc2VydFJhbmtTb3J0ZWQpO1xuXG4vKipcbiAqIFRPRE8gU0VDVVJJVFkgQlVHOiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQyNjBcbiAqIHNvcnRCeVJhbmsgY3VycmVudGx5IHVzZXMgYEFycmF5LnByb3RvdHlwZS5zb3J0YCBkaXJlY3RseSwgYW5kXG4gKiBzbyBvbmx5IHdvcmtzIGNvcnJlY3RseSB3aGVuIGdpdmVuIGEgYGNvbXBhcmVgIGZ1bmN0aW9uIHRoYXQgY29uc2lkZXJzXG4gKiBgdW5kZWZpbmVkYCBzdHJpY3RseSBiaWdnZXIgKGA+YCkgdGhhbiBldmVyeXRoaW5nIGVsc2UuIFRoaXMgaXNcbiAqIGJlY2F1c2UgYEFycmF5LnByb3RvdHlwZS5zb3J0YCBiaXphcnJlbHkgbW92ZXMgYWxsIGB1bmRlZmluZWRgcyB0b1xuICogdGhlIGVuZCBvZiB0aGUgYXJyYXkgcmVnYXJkbGVzcywgd2l0aG91dCBjb25zdWx0aW5nIHRoZSBgY29tcGFyZWBcbiAqIGZ1bmN0aW9uLiBUaGlzIGlzIGEgZ2VudWluZSBidWcgZm9yIHVzIE5PVyBiZWNhdXNlIHNvbWV0aW1lcyB3ZSBzb3J0XG4gKiBpbiByZXZlcnNlIG9yZGVyIGJ5IHBhc3NpbmcgYSByZXZlcnNlZCByYW5rIGNvbXBhcmlzb24gZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHtJdGVyYWJsZTxQYXNzYWJsZT59IHBhc3NhYmxlc1xuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHJldHVybnMge1Bhc3NhYmxlW119XG4gKi9cbmNvbnN0ICAgICAgICBzb3J0QnlSYW5rPShwYXNzYWJsZXMsY29tcGFyZSk9PntcbmlmKEFycmF5LmlzQXJyYXkocGFzc2FibGVzKSl7XG5oYXJkZW4ocGFzc2FibGVzKTtcbi8qIENhbGxpbmcgaXNSYW5rU29ydGVkIGdpdmVzIGl0IGEgY2hhbmNlIHRvIGdldCBtZW1vaXplZCBmb3IqL1xuLyogdGhpcyBgY29tcGFyZWAgZnVuY3Rpb24gZXZlbiBpZiBpdCB3YXMgYWxyZWFkeSBtZW1vaXplZCBmb3IgYSBkaWZmZXJlbnQqL1xuLyogYGNvbXBhcmVgIGZ1bmN0aW9uLiovXG5pZihpc1JhbmtTb3J0ZWQocGFzc2FibGVzLGNvbXBhcmUpKXtcbnJldHVybiBwYXNzYWJsZXM7XG4gfVxuIH1cbmNvbnN0IHVuc29ydGVkPVsuLi5wYXNzYWJsZXNdO1xudW5zb3J0ZWQuZm9yRWFjaChoYXJkZW4pO1xuY29uc3Qgc29ydGVkPWhhcmRlbih1bnNvcnRlZC5zb3J0KGNvbXBhcmUpKTtcbmNvbnN0IHN1Yk1lbW9PZlNvcnRlZD1tZW1vT2ZTb3J0ZWQuZ2V0KGNvbXBhcmUpO1xuYXNzZXJ0KHN1Yk1lbW9PZlNvcnRlZCE9PXVuZGVmaW5lZCk7XG5zdWJNZW1vT2ZTb3J0ZWQuYWRkKHNvcnRlZCk7XG5yZXR1cm4gc29ydGVkO1xuIH07JGjigI1fb25jZS5zb3J0QnlSYW5rKHNvcnRCeVJhbmspO1xuaGFyZGVuKHNvcnRCeVJhbmspO1xuXG4vKipcbiAqIFNlZVxuICogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQmluYXJ5X3NlYXJjaF9hbGdvcml0aG0jUHJvY2VkdXJlX2Zvcl9maW5kaW5nX3RoZV9sZWZ0bW9zdF9lbGVtZW50XG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBzb3J0ZWRcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGtleVxuICogQHBhcmFtIHsoXCJsZWZ0TW9zdFwiIHwgXCJyaWdodE1vc3RcIik9fSBiaWFzXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5jb25zdCByYW5rU2VhcmNoPShzb3J0ZWQsY29tcGFyZSxrZXksYmlhcz0nbGVmdE1vc3QnKT0+e1xuYXNzZXJ0UmFua1NvcnRlZChzb3J0ZWQsY29tcGFyZSk7XG5sZXQgbGVmdD0wO1xubGV0IHJpZ2h0PXNvcnRlZC5sZW5ndGg7XG53aGlsZShsZWZ0PHJpZ2h0KXtcbmNvbnN0IG09TWF0aC5mbG9vcigobGVmdCtyaWdodCkvMik7XG5jb25zdCBjb21wPWNvbXBhcmUoc29ydGVkW21dLGtleSk7XG5pZihjb21wPD0tMXx8Y29tcD09PTAmJmJpYXM9PT0ncmlnaHRNb3N0Jyl7XG5sZWZ0PW0rMTtcbiB9ZWxzZXtcbmFzc2VydChjb21wPj0xfHxjb21wPT09MCYmYmlhcz09PSdsZWZ0TW9zdCcpO1xucmlnaHQ9bTtcbiB9XG4gfVxucmV0dXJuIGJpYXM9PT0nbGVmdE1vc3QnP2xlZnQ6cmlnaHQtMTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gc29ydGVkXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1JhbmtDb3Zlcn0gcmFua0NvdmVyXG4gKiBAcmV0dXJucyB7SW5kZXhDb3Zlcn1cbiAqL1xuY29uc3QgICAgICAgIGdldEluZGV4Q292ZXI9KHNvcnRlZCxjb21wYXJlLFtsZWZ0S2V5LHJpZ2h0S2V5XSk9PntcbmFzc2VydFJhbmtTb3J0ZWQoc29ydGVkLGNvbXBhcmUpO1xuY29uc3QgbGVmdEluZGV4PXJhbmtTZWFyY2goc29ydGVkLGNvbXBhcmUsbGVmdEtleSwnbGVmdE1vc3QnKTtcbmNvbnN0IHJpZ2h0SW5kZXg9cmFua1NlYXJjaChzb3J0ZWQsY29tcGFyZSxyaWdodEtleSwncmlnaHRNb3N0Jyk7XG5yZXR1cm5bbGVmdEluZGV4LHJpZ2h0SW5kZXhdO1xuIH07JGjigI1fb25jZS5nZXRJbmRleENvdmVyKGdldEluZGV4Q292ZXIpO1xuaGFyZGVuKGdldEluZGV4Q292ZXIpO1xuXG4vKiogQHR5cGUge1JhbmtDb3Zlcn0gKi9cbmNvbnN0ICAgICAgICBGdWxsUmFua0NvdmVyPWhhcmRlbihbJycsJ3snXSk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBzb3J0ZWRcbiAqIEBwYXJhbSB7SW5kZXhDb3Zlcn0gaW5kZXhDb3ZlclxuICogQHJldHVybnMge0l0ZXJhYmxlPFtudW1iZXIsIFBhc3NhYmxlXT59XG4gKi8kaOKAjV9vbmNlLkZ1bGxSYW5rQ292ZXIoRnVsbFJhbmtDb3Zlcik7XG5jb25zdCAgICAgICAgY292ZXJlZEVudHJpZXM9KHNvcnRlZCxbbGVmdEluZGV4LHJpZ2h0SW5kZXhdKT0+e1xuLyoqIEB0eXBlIHtJdGVyYWJsZTxbbnVtYmVyLCBQYXNzYWJsZV0+fSAqL1xuY29uc3QgaXRlcmFibGU9aGFyZGVuKHtcbltTeW1ib2wuaXRlcmF0b3JdOigpPT57XG5sZXQgaT1sZWZ0SW5kZXg7XG5yZXR1cm4gaGFyZGVuKHtcbm5leHQ6KCk9PntcbmlmKGk8PXJpZ2h0SW5kZXgpe1xuY29uc3QgZWxlbWVudD1zb3J0ZWRbaV07XG5pKz0xO1xucmV0dXJuIGhhcmRlbih7dmFsdWU6W2ksZWxlbWVudF0sZG9uZTpmYWxzZX0pO1xuIH1lbHNle1xucmV0dXJuIGhhcmRlbih7dmFsdWU6dW5kZWZpbmVkLGRvbmU6dHJ1ZX0pO1xuIH1cbiB9fSk7XG5cbiB9fSk7XG5cbnJldHVybiBpdGVyYWJsZTtcbiB9OyRo4oCNX29uY2UuY292ZXJlZEVudHJpZXMoY292ZXJlZEVudHJpZXMpO1xuaGFyZGVuKGNvdmVyZWRFbnRyaWVzKTtcblxuLyoqXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBhXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBiXG4gKiBAcmV0dXJucyB7UGFzc2FibGV9XG4gKi9cbmNvbnN0IG1heFJhbms9KGNvbXBhcmUsYSxiKT0+Y29tcGFyZShhLGIpPj0wP2E6YjtcblxuLyoqXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBhXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBiXG4gKiBAcmV0dXJucyB7UGFzc2FibGV9XG4gKi9cbmNvbnN0IG1pblJhbms9KGNvbXBhcmUsYSxiKT0+Y29tcGFyZShhLGIpPD0wP2E6YjtcblxuLyoqXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1JhbmtDb3ZlcltdfSBjb3ZlcnNcbiAqIEByZXR1cm5zIHtSYW5rQ292ZXJ9XG4gKi9cbmNvbnN0ICAgICAgICB1bmlvblJhbmtDb3ZlcnM9KGNvbXBhcmUsY292ZXJzKT0+e1xuLyoqXG4gKiBAcGFyYW0ge1JhbmtDb3Zlcn0gYVxuICogQHBhcmFtIHtSYW5rQ292ZXJ9IGJcbiAqIEByZXR1cm5zIHtSYW5rQ292ZXJ9XG4gKi9cbmNvbnN0IHVuaW9uUmFua0NvdmVyUGFpcj0oW2xlZnRBLHJpZ2h0QV0sW2xlZnRCLHJpZ2h0Ql0pPT5bXG5taW5SYW5rKGNvbXBhcmUsbGVmdEEsbGVmdEIpLFxubWF4UmFuayhjb21wYXJlLHJpZ2h0QSxyaWdodEIpXTtcblxucmV0dXJuIGNvdmVycy5yZWR1Y2UodW5pb25SYW5rQ292ZXJQYWlyLFsneycsJyddKTtcbiB9OyRo4oCNX29uY2UudW5pb25SYW5rQ292ZXJzKHVuaW9uUmFua0NvdmVycyk7XG5oYXJkZW4odW5pb25SYW5rQ292ZXJzKTtcblxuLyoqXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1JhbmtDb3ZlcltdfSBjb3ZlcnNcbiAqIEByZXR1cm5zIHtSYW5rQ292ZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBpbnRlcnNlY3RSYW5rQ292ZXJzPShjb21wYXJlLGNvdmVycyk9Pntcbi8qKlxuICogQHBhcmFtIHtSYW5rQ292ZXJ9IGFcbiAqIEBwYXJhbSB7UmFua0NvdmVyfSBiXG4gKiBAcmV0dXJucyB7UmFua0NvdmVyfVxuICovXG5jb25zdCBpbnRlcnNlY3RSYW5rQ292ZXJQYWlyPShbbGVmdEEscmlnaHRBXSxbbGVmdEIscmlnaHRCXSk9Pltcbm1heFJhbmsoY29tcGFyZSxsZWZ0QSxsZWZ0QiksXG5taW5SYW5rKGNvbXBhcmUscmlnaHRBLHJpZ2h0QildO1xuXG5yZXR1cm4gY292ZXJzLnJlZHVjZShpbnRlcnNlY3RSYW5rQ292ZXJQYWlyLFsnJywneyddKTtcbiB9OyRo4oCNX29uY2UuaW50ZXJzZWN0UmFua0NvdmVycyhpbnRlcnNlY3RSYW5rQ292ZXJzKTtcblxuY29uc3QgICAgICAge2NvbXBhcmF0b3I6Y29tcGFyZVJhbmssYW50aUNvbXBhcmF0b3I6Y29tcGFyZUFudGlSYW5rfT1cbm1ha2VDb21wYXJhdG9yS2l0KCk7XG5cbi8qKlxuICogQ3JlYXRlIGEgY29tcGFyYXRvciBraXQgaW4gd2hpY2ggcmVtb3RhYmxlcyBhcmUgZnVsbHkgb3JkZXJlZFxuICogYnkgdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgYXJlIGZpcnN0IHNlZW4gYnkgKnRoaXMqIGNvbXBhcmF0b3Iga2l0LlxuICogQkVXQVJFOiBUaGlzIGlzIG9ic2VydmFibGUgbXV0YWJsZSBzdGF0ZSwgc28gc3VjaCBhIGNvbXBhcmF0b3Iga2l0XG4gKiBzaG91bGQgbmV2ZXIgYmUgc2hhcmVkIGFtb25nIHN1YnN5c3RlbXMgdGhhdCBzaG91bGQgbm90IGJlIGFibGVcbiAqIHRvIGNvbW11bmljYXRlLlxuICpcbiAqIE5vdGUgdGhhdCB0aGlzIG9yZGVyIGRvZXMgbm90IG1lZXQgdGhlIHJlcXVpcmVtZW50cyBmb3Igc3RvcmVcbiAqIG9yZGVyaW5nLCBzaW5jZSBpdCBoYXMgbm8gbWVtb3J5IG9mIGRlbGV0ZWQga2V5cy5cbiAqXG4gKiBUaGVzZSBmdWxsIG9yZGVyIGNvbXBhcmF0b3Iga2l0IGlzIHN0cmljdGx5IG1vcmUgcHJlY2lzZSB0aGF0IHRoZVxuICogcmFuayBvcmRlciBjb21wYXJhdG9yIGtpdHMgYWJvdmUuIEFzIGEgcmVzdWx0LCBhbnkgYXJyYXkgd2hpY2ggaXNcbiAqIHNvcnRlZCBieSBzdWNoIGEgZnVsbCBvcmRlciB3aWxsIHBhc3MgdGhlIGlzUmFua1NvcnRlZCB0ZXN0IHdpdGhcbiAqIGEgY29ycmVzcG9uZGluZyByYW5rIG9yZGVyLlxuICpcbiAqIEFuIGFycmF5IHdoaWNoIGlzIHNvcnRlZCBieSBhICpmcmVzaCogZnVsbCBvcmRlciBjb21wYXJhdG9yLCBpLmUuLFxuICogb25lIHRoYXQgaGFzIG5vdCB5ZXQgc2VlbiBhbnkgcmVtb3RhYmxlcywgd2lsbCBvZiBjb3Vyc2UgcmVtYWluXG4gKiBzb3J0ZWQgYnkgYWNjb3JkaW5nIHRvICp0aGF0KiBmdWxsIG9yZGVyIGNvbXBhcmF0b3IuIEFuIGFycmF5ICpvZlxuICogc2NhbGFycyogc29ydGVkIGJ5IGEgZnJlc2ggZnVsbCBvcmRlciB3aWxsIHJlbWFpbiBzb3J0ZWQgZXZlblxuICogYWNjb3JkaW5nIHRvIGEgbmV3IGZyZXNoIGZ1bGwgb3JkZXIgY29tcGFyYXRvciwgc2luY2UgaXQgd2lsbCBzZWVcbiAqIHRoZSByZW1vdGFibGVzIGluIHRoZSBzYW1lIG9yZGVyIGFnYWluLiBVbmZvcnR1bmF0ZWx5LCB0aGlzIGlzXG4gKiBub3QgdHJ1ZSBvZiBhcnJheXMgb2YgcGFzc2FibGVzIGluIGdlbmVyYWwuXG4gKlxuICogQHBhcmFtIHtib29sZWFuPX0gbG9uZ0xpdmVkXG4gKiBAcmV0dXJucyB7RnVsbENvbXBhcmF0b3JLaXR9XG4gKi8kaOKAjV9vbmNlLmNvbXBhcmVSYW5rKGNvbXBhcmVSYW5rKTskaOKAjV9vbmNlLmNvbXBhcmVBbnRpUmFuayhjb21wYXJlQW50aVJhbmspO1xuY29uc3QgICAgICAgIG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0PShsb25nTGl2ZWQ9ZmFsc2UpPT57XG5sZXQgbnVtU2Vlbj0wO1xuLyogV2hlbiBkeW5hbWljYWxseSBjcmVhdGVkIHdpdGggc2hvcnQgbGlmZXRpbWVzICh0aGUgZGVmYXVsdCkgYSBXZWFrTWFwKi9cbi8qIHdvdWxkIHBlcmZvcm0gcG9vcmx5LCBhbmQgdGhlIGxlYWsgY3JlYXRlZCBieSBhIE1hcCBvbmx5IGxhc3RzIGFzIGxvbmcqL1xuLyogYXMgdGhlIE1hcC4qL1xuY29uc3QgTWFwQ29uc3RydWN0b3I9bG9uZ0xpdmVkP1dlYWtNYXA6TWFwO1xuY29uc3Qgc2Vlbj1uZXcgTWFwQ29uc3RydWN0b3IoKTtcbmNvbnN0IHRhZz0ocik9PntcbmlmKHNlZW4uaGFzKHIpKXtcbnJldHVybiBzZWVuLmdldChyKTtcbiB9XG5udW1TZWVuKz0xO1xuc2Vlbi5zZXQocixudW1TZWVuKTtcbnJldHVybiBudW1TZWVuO1xuIH07XG5jb25zdCBjb21wYXJlUmVtb3RhYmxlcz0oeCx5KT0+Y29tcGFyZVJhbmsodGFnKHgpLHRhZyh5KSk7XG5yZXR1cm4gbWFrZUNvbXBhcmF0b3JLaXQoY29tcGFyZVJlbW90YWJsZXMpO1xuIH07JGjigI1fb25jZS5tYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCk7XG5oYXJkZW4obWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImdldFBhc3NTdHlsZUNvdmVyIjpbImdldFBhc3NTdHlsZUNvdmVyIl0sIm1ha2VDb21wYXJhdG9yS2l0IjpbIm1ha2VDb21wYXJhdG9yS2l0Il0sImNvbXBhcmF0b3JNaXJyb3JJbWFnZSI6WyJjb21wYXJhdG9yTWlycm9ySW1hZ2UiXSwiaXNSYW5rU29ydGVkIjpbImlzUmFua1NvcnRlZCJdLCJhc3NlcnRSYW5rU29ydGVkIjpbImFzc2VydFJhbmtTb3J0ZWQiXSwic29ydEJ5UmFuayI6WyJzb3J0QnlSYW5rIl0sImdldEluZGV4Q292ZXIiOlsiZ2V0SW5kZXhDb3ZlciJdLCJGdWxsUmFua0NvdmVyIjpbIkZ1bGxSYW5rQ292ZXIiXSwiY292ZXJlZEVudHJpZXMiOlsiY292ZXJlZEVudHJpZXMiXSwidW5pb25SYW5rQ292ZXJzIjpbInVuaW9uUmFua0NvdmVycyJdLCJpbnRlcnNlY3RSYW5rQ292ZXJzIjpbImludGVyc2VjdFJhbmtDb3ZlcnMiXSwiY29tcGFyZVJhbmsiOlsiY29tcGFyZVJhbmsiXSwiY29tcGFyZUFudGlSYW5rIjpbImNvbXBhcmVBbnRpUmFuayJdLCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCI6WyJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA4EE4s9RUAAPUVAAAxAAAAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL3N0b3Jlcy9zY2FsYXJNYXBTdG9yZS5qc3siaW1wb3J0cyI6WyIuLi9rZXlzL2NoZWNrS2V5LmpzIiwiLi4vcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzIiwiLi4vcGF0dGVybnMvcmFua09yZGVyLmpzIiwiLi9zY2FsYXJXZWFrTWFwU3RvcmUuanMiLCIuL3N0b3JlLXV0aWxzLmpzIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbIm1ha2VNYXBTdG9yZU1ldGhvZHMiLCJtYWtlU2NhbGFyTWFwU3RvcmUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRmFyLGFzc2VydFBhc3NhYmxlLGZpbHRlckl0ZXJhYmxlLG1hcEl0ZXJhYmxlLGNvbXBhcmVSYW5rLGFzc2VydFNjYWxhcktleSxtYWtlQ29weU1hcCxtYXRjaGVzLGZpdCxhc3NlcnRQYXR0ZXJuLG1ha2VXZWFrTWFwU3RvcmVNZXRob2RzLG1ha2VDdXJyZW50S2V5c0tpdDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0UGFzc2FibGVcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhc3NhYmxlID0gJGjigI1fYSldXSxbXCJmaWx0ZXJJdGVyYWJsZVwiLCBbJGjigI1fYSA9PiAoZmlsdGVySXRlcmFibGUgPSAkaOKAjV9hKV1dLFtcIm1hcEl0ZXJhYmxlXCIsIFskaOKAjV9hID0+IChtYXBJdGVyYWJsZSA9ICRo4oCNX2EpXV1dXSxbXCIuLi9wYXR0ZXJucy9yYW5rT3JkZXIuanNcIiwgW1tcImNvbXBhcmVSYW5rXCIsIFskaOKAjV9hID0+IChjb21wYXJlUmFuayA9ICRo4oCNX2EpXV1dXSxbXCIuLi9rZXlzL2NoZWNrS2V5LmpzXCIsIFtbXCJhc3NlcnRTY2FsYXJLZXlcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFNjYWxhcktleSA9ICRo4oCNX2EpXV0sW1wibWFrZUNvcHlNYXBcIiwgWyRo4oCNX2EgPT4gKG1ha2VDb3B5TWFwID0gJGjigI1fYSldXV1dLFtcIi4uL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qc1wiLCBbW1wibWF0Y2hlc1wiLCBbJGjigI1fYSA9PiAobWF0Y2hlcyA9ICRo4oCNX2EpXV0sW1wiZml0XCIsIFskaOKAjV9hID0+IChmaXQgPSAkaOKAjV9hKV1dLFtcImFzc2VydFBhdHRlcm5cIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhdHRlcm4gPSAkaOKAjV9hKV1dXV0sW1wiLi9zY2FsYXJXZWFrTWFwU3RvcmUuanNcIiwgW1tcIm1ha2VXZWFrTWFwU3RvcmVNZXRob2RzXCIsIFskaOKAjV9hID0+IChtYWtlV2Vha01hcFN0b3JlTWV0aG9kcyA9ICRo4oCNX2EpXV1dXSxbXCIuL3N0b3JlLXV0aWxzLmpzXCIsIFtbXCJtYWtlQ3VycmVudEtleXNLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VDdXJyZW50S2V5c0tpdCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0e3F1b3RlOnF9PWFzc2VydDtcblxuLyoqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAcGFyYW0ge01hcDxLLFY+fSBqc21hcFxuICogQHBhcmFtIHsoazogSywgdjogVikgPT4gdm9pZH0gYXNzZXJ0S1ZPa1RvQWRkXG4gKiBAcGFyYW0geyhrOiBLLCB2OiBWKSA9PiB2b2lkfSBhc3NlcnRLVk9rVG9TZXRcbiAqIEBwYXJhbSB7KChrOiBLKSA9PiB2b2lkKT19IGFzc2VydEtleU9rVG9EZWxldGVcbiAqIEBwYXJhbSB7c3RyaW5nPX0gdGFnXG4gKiBAcmV0dXJucyB7TWFwU3RvcmU8SyxWPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VNYXBTdG9yZU1ldGhvZHM9KFxuanNtYXAsXG5hc3NlcnRLVk9rVG9BZGQsXG5hc3NlcnRLVk9rVG9TZXQsXG5hc3NlcnRLZXlPa1RvRGVsZXRlPXVuZGVmaW5lZCxcbnRhZz0na2V5Jyk9Plxue1xuY29uc3R7YXNzZXJ0VXBkYXRlT25BZGQsYXNzZXJ0VXBkYXRlT25EZWxldGUsaXRlcmFibGVLZXlzfT1cbm1ha2VDdXJyZW50S2V5c0tpdChcbigpPT5qc21hcC5rZXlzKCksXG4oayk9PmpzbWFwLmhhcyhrKSxcbmNvbXBhcmVSYW5rLFxuYXNzZXJ0S1ZPa1RvQWRkLFxuYXNzZXJ0S2V5T2tUb0RlbGV0ZSxcbnRhZyk7XG5cblxuLyoqXG4gKiBAcGFyYW0ge1BhdHRlcm49fSBrZXlQYXR0XG4gKiBAcGFyYW0ge1BhdHRlcm49fSB2YWx1ZVBhdHRcbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxLPn1cbiAqL1xuY29uc3Qga2V5cz0oa2V5UGF0dD11bmRlZmluZWQsdmFsdWVQYXR0PXVuZGVmaW5lZCk9PntcbmlmKGtleVBhdHQ9PT11bmRlZmluZWQmJnZhbHVlUGF0dD09PXVuZGVmaW5lZCl7XG5yZXR1cm4gaXRlcmFibGVLZXlzO1xuIH1cbmNvbnN0IGZpbHRlcj0oayk9PntcbmlmKGtleVBhdHQhPT11bmRlZmluZWQmJiFtYXRjaGVzKGssa2V5UGF0dCkpe1xucmV0dXJuIGZhbHNlO1xuIH1cbi8qIFVzZXMgdGhlIGN1cnJlbnQganNtYXAgdmFsdWUsIHNpbmNlIHRoZSBpdGVyYXRhdG9yIHN1cnZpdmVzIGAuc2V0YCovXG5pZih2YWx1ZVBhdHQhPT11bmRlZmluZWQmJiFtYXRjaGVzKGpzbWFwLmdldChrKSx2YWx1ZVBhdHQpKXtcbnJldHVybiBmYWxzZTtcbiB9XG5yZXR1cm4gdHJ1ZTtcbiB9O1xucmV0dXJuIGZpbHRlckl0ZXJhYmxlKGl0ZXJhYmxlS2V5cyxmaWx0ZXIpO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtQYXR0ZXJuPX0ga2V5UGF0dFxuICogQHBhcmFtIHtQYXR0ZXJuPX0gdmFsdWVQYXR0XG4gKiBAcmV0dXJucyB7SXRlcmFibGU8Vj59XG4gKi9cbmNvbnN0IHZhbHVlcz0oa2V5UGF0dD11bmRlZmluZWQsdmFsdWVQYXR0PXVuZGVmaW5lZCk9PlxubWFwSXRlcmFibGUoa2V5cyhrZXlQYXR0LHZhbHVlUGF0dCksKGspPT4vKiogQHR5cGUge1Z9ICovanNtYXAuZ2V0KGspKTtcblxuLyoqXG4gKiBAcGFyYW0ge1BhdHRlcm49fSBrZXlQYXR0XG4gKiBAcGFyYW0ge1BhdHRlcm49fSB2YWx1ZVBhdHRcbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxbSyxWXT59XG4gKi9cbmNvbnN0IGVudHJpZXM9KGtleVBhdHQ9dW5kZWZpbmVkLHZhbHVlUGF0dD11bmRlZmluZWQpPT5cbm1hcEl0ZXJhYmxlKGtleXMoa2V5UGF0dCx2YWx1ZVBhdHQpLChrKT0+W1xuayxcbi8qKiBAdHlwZSB7Vn0gKi9qc21hcC5nZXQoayldKTtcblxuXG5yZXR1cm4gaGFyZGVuKHtcbi4uLm1ha2VXZWFrTWFwU3RvcmVNZXRob2RzKFxuanNtYXAsXG4vKiogQHR5cGUgeyhrOiBLLCB2OiBWKSA9PiB2b2lkfSAqL2Fzc2VydFVwZGF0ZU9uQWRkLFxuYXNzZXJ0S1ZPa1RvU2V0LFxuYXNzZXJ0VXBkYXRlT25EZWxldGUsXG50YWcpLFxuXG5rZXlzLFxudmFsdWVzLFxuZW50cmllcyxcblxuc25hcHNob3Q6KGtleVBhdHQ9dW5kZWZpbmVkLHZhbHVlUGF0dD11bmRlZmluZWQpPT5cbm1ha2VDb3B5TWFwKGVudHJpZXMoa2V5UGF0dCx2YWx1ZVBhdHQpKSxcblxuZ2V0U2l6ZTooa2V5UGF0dD11bmRlZmluZWQsdmFsdWVQYXR0PXVuZGVmaW5lZCk9Plxua2V5UGF0dD09PXVuZGVmaW5lZCYmdmFsdWVQYXR0PT09dW5kZWZpbmVkP1xuanNtYXAuc2l6ZTpcblsuLi5rZXlzKGtleVBhdHQsdmFsdWVQYXR0KV0ubGVuZ3RoLFxuXG5jbGVhcjooa2V5UGF0dD11bmRlZmluZWQsdmFsdWVQYXR0PXVuZGVmaW5lZCk9PntcbmlmKGtleVBhdHQ9PT11bmRlZmluZWQmJnZhbHVlUGF0dD09PXVuZGVmaW5lZCl7XG5qc21hcC5jbGVhcigpO1xuIH1cbmZvcihjb25zdCBrZXkgb2Yga2V5cyhrZXlQYXR0LHZhbHVlUGF0dCkpe1xuanNtYXAuZGVsZXRlKGtleSk7XG4gfVxuIH19KTtcblxuIH07XG5cbi8qKlxuICogRGlzdGluZ3Vpc2hlcyBiZXR3ZWVuIGFkZGluZyBhIG5ldyBrZXkgKGluaXQpIGFuZCB1cGRhdGluZyBvclxuICogcmVmZXJlbmNpbmcgYSBrZXkgKGdldCwgc2V0LCBkZWxldGUpLlxuICpcbiAqIGBpbml0YCBpcyBvbmx5IGFsbG93ZWQgaWYgdGhlIGtleSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LiBgR2V0YCxcbiAqIGBzZXRgIGFuZCBgZGVsZXRlYCBhcmUgb25seSBhbGxvd2VkIGlmIHRoZSBrZXkgZG9lcyBhbHJlYWR5IGV4aXN0LlxuICpcbiAqIFRoaXMgaXMgYSAqc2NhbGFyKiBtYXAgaW4gdGhhdCB0aGUga2V5cyBjYW4gb25seSBiZSBhdG9taWMgdmFsdWVzLCBwcmltaXRpdmVzXG4gKiBvciByZW1vdGFibGVzLiBPdGhlciBzdG9yZU1hcHMgd2lsbCBhY2NlcHQsIGZvciBleGFtcGxlLCBjb3B5QXJyYXlzIGFuZFxuICogY29weVJlY29yZHMsIGFzIGtleXMgYW5kIGxvb2sgdGhlbSB1cCBiYXNlZCBvbiBlcXVhbGl0eSBvZiB0aGVpciBjb250ZW50cy5cbiAqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAcGFyYW0ge3N0cmluZ30gW3RhZz0na2V5J10gLSB0aGUgY29sdW1uIG5hbWUgZm9yIHRoZSBrZXlcbiAqIEBwYXJhbSB7U3RvcmVPcHRpb25zPX0gb3B0aW9uc1xuICogQHJldHVybnMge01hcFN0b3JlPEssVj59XG4gKi8kaOKAjV9vbmNlLm1ha2VNYXBTdG9yZU1ldGhvZHMobWFrZU1hcFN0b3JlTWV0aG9kcyk7XG5jb25zdCAgICAgICAgbWFrZVNjYWxhck1hcFN0b3JlPShcbnRhZz0na2V5JyxcbntrZXlTaGFwZT11bmRlZmluZWQsdmFsdWVTaGFwZT11bmRlZmluZWR9PXt9KT0+XG57XG5jb25zdCBqc21hcD1uZXcgTWFwKCk7XG5pZihrZXlTaGFwZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnRQYXR0ZXJuKGtleVNoYXBlKTtcbiB9XG5pZih2YWx1ZVNoYXBlIT09dW5kZWZpbmVkKXtcbmFzc2VydFBhdHRlcm4odmFsdWVTaGFwZSk7XG4gfVxuXG5jb25zdCBhc3NlcnRLVk9rVG9TZXQ9KF9rZXksdmFsdWUpPT57XG4vKiBUT0RPOiBKdXN0IGEgdHJhbnNpdGlvbiBrbHVkZ2UuIFJlbW92ZSB3aGVuIHBvc3NpYmxlLiovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNjA2Ki9cbmhhcmRlbih2YWx1ZSk7XG5cbmFzc2VydFBhc3NhYmxlKHZhbHVlKTtcbmlmKHZhbHVlU2hhcGUhPT11bmRlZmluZWQpe1xuZml0KHZhbHVlLHZhbHVlU2hhcGUsJ21hcFN0b3JlIHZhbHVlJyk7XG4gfVxuIH07XG5cbmNvbnN0IGFzc2VydEtWT2tUb0FkZD0oa2V5LHZhbHVlKT0+e1xuLyogVE9ETzogSnVzdCBhIHRyYW5zaXRpb24ga2x1ZGdlLiBSZW1vdmUgd2hlbiBwb3NzaWJsZS4qL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzYwNiovXG5oYXJkZW4oa2V5KTtcblxuYXNzZXJ0U2NhbGFyS2V5KGtleSk7XG5pZihrZXlTaGFwZSE9PXVuZGVmaW5lZCl7XG5maXQoa2V5LGtleVNoYXBlLCdtYXBTdG9yZSBrZXknKTtcbiB9XG5hc3NlcnRLVk9rVG9TZXQoa2V5LHZhbHVlKTtcbiB9O1xuXG5yZXR1cm4gRmFyKCBgc2NhbGFyIE1hcFN0b3JlIG9mICR7cSh0YWcpfWAse1xuLi4ubWFrZU1hcFN0b3JlTWV0aG9kcyhcbmpzbWFwLFxuYXNzZXJ0S1ZPa1RvQWRkLFxuYXNzZXJ0S1ZPa1RvU2V0LFxudW5kZWZpbmVkLFxudGFnKX0pO1xuXG5cbiB9OyRo4oCNX29uY2UubWFrZVNjYWxhck1hcFN0b3JlKG1ha2VTY2FsYXJNYXBTdG9yZSk7XG5oYXJkZW4obWFrZVNjYWxhck1hcFN0b3JlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlTWFwU3RvcmVNZXRob2RzIjpbIm1ha2VNYXBTdG9yZU1ldGhvZHMiXSwibWFrZVNjYWxhck1hcFN0b3JlIjpbIm1ha2VTY2FsYXJNYXBTdG9yZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA2fzG+aw8AAGsPAAAxAAAAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL3N0b3Jlcy9zY2FsYXJTZXRTdG9yZS5qc3siaW1wb3J0cyI6WyIuLi9rZXlzL2NoZWNrS2V5LmpzIiwiLi4vcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzIiwiLi4vcGF0dGVybnMvcmFua09yZGVyLmpzIiwiLi9zY2FsYXJXZWFrU2V0U3RvcmUuanMiLCIuL3N0b3JlLXV0aWxzLmpzIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbIm1ha2VTY2FsYXJTZXRTdG9yZSIsIm1ha2VTZXRTdG9yZU1ldGhvZHMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRmFyLGZpbHRlckl0ZXJhYmxlLGNvbXBhcmVSYW5rLGFzc2VydFNjYWxhcktleSxtYWtlQ29weVNldCxtYXRjaGVzLGZpdCxhc3NlcnRQYXR0ZXJuLG1ha2VXZWFrU2V0U3RvcmVNZXRob2RzLG1ha2VDdXJyZW50S2V5c0tpdDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV0sW1wiZmlsdGVySXRlcmFibGVcIiwgWyRo4oCNX2EgPT4gKGZpbHRlckl0ZXJhYmxlID0gJGjigI1fYSldXV1dLFtcIi4uL3BhdHRlcm5zL3JhbmtPcmRlci5qc1wiLCBbW1wiY29tcGFyZVJhbmtcIiwgWyRo4oCNX2EgPT4gKGNvbXBhcmVSYW5rID0gJGjigI1fYSldXV1dLFtcIi4uL2tleXMvY2hlY2tLZXkuanNcIiwgW1tcImFzc2VydFNjYWxhcktleVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0U2NhbGFyS2V5ID0gJGjigI1fYSldXSxbXCJtYWtlQ29weVNldFwiLCBbJGjigI1fYSA9PiAobWFrZUNvcHlTZXQgPSAkaOKAjV9hKV1dXV0sW1wiLi4vcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzXCIsIFtbXCJtYXRjaGVzXCIsIFskaOKAjV9hID0+IChtYXRjaGVzID0gJGjigI1fYSldXSxbXCJmaXRcIiwgWyRo4oCNX2EgPT4gKGZpdCA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0UGF0dGVyblwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGF0dGVybiA9ICRo4oCNX2EpXV1dXSxbXCIuL3NjYWxhcldlYWtTZXRTdG9yZS5qc1wiLCBbW1wibWFrZVdlYWtTZXRTdG9yZU1ldGhvZHNcIiwgWyRo4oCNX2EgPT4gKG1ha2VXZWFrU2V0U3RvcmVNZXRob2RzID0gJGjigI1fYSldXV1dLFtcIi4vc3RvcmUtdXRpbHMuanNcIiwgW1tcIm1ha2VDdXJyZW50S2V5c0tpdFwiLCBbJGjigI1fYSA9PiAobWFrZUN1cnJlbnRLZXlzS2l0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5jb25zdHtxdW90ZTpxfT1hc3NlcnQ7XG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7U2V0PEs+fSBqc3NldFxuICogQHBhcmFtIHsoazogSykgPT4gdm9pZH0gYXNzZXJ0S2V5T2tUb0FkZFxuICogQHBhcmFtIHsoKGs6IEspID0+IHZvaWQpPX0gYXNzZXJ0S2V5T2tUb0RlbGV0ZVxuICogQHBhcmFtIHtzdHJpbmc9fSBrZXlOYW1lXG4gKiBAcmV0dXJucyB7U2V0U3RvcmU8Sz59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlU2V0U3RvcmVNZXRob2RzPShcbmpzc2V0LFxuYXNzZXJ0S2V5T2tUb0FkZCxcbmFzc2VydEtleU9rVG9EZWxldGU9dW5kZWZpbmVkLFxua2V5TmFtZT0na2V5Jyk9Plxue1xuY29uc3R7YXNzZXJ0VXBkYXRlT25BZGQsYXNzZXJ0VXBkYXRlT25EZWxldGUsaXRlcmFibGVLZXlzfT1cbm1ha2VDdXJyZW50S2V5c0tpdChcbigpPT5qc3NldC5rZXlzKCksXG4oayk9Pmpzc2V0LmhhcyhrKSxcbmNvbXBhcmVSYW5rLFxuYXNzZXJ0S2V5T2tUb0FkZCxcbmFzc2VydEtleU9rVG9EZWxldGUsXG5rZXlOYW1lKTtcblxuXG4vKipcbiAqIEBwYXJhbSB7UGF0dGVybj19IGtleVBhdHRcbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxLPn1cbiAqL1xuY29uc3Qga2V5cz0oa2V5UGF0dD11bmRlZmluZWQpPT5cbmtleVBhdHQ9PT11bmRlZmluZWQ/XG5pdGVyYWJsZUtleXM6XG5maWx0ZXJJdGVyYWJsZShpdGVyYWJsZUtleXMsKGspPT5tYXRjaGVzKGssa2V5UGF0dCkpO1xuXG5yZXR1cm4gaGFyZGVuKHtcbi4uLm1ha2VXZWFrU2V0U3RvcmVNZXRob2RzKFxuanNzZXQsXG5hc3NlcnRVcGRhdGVPbkFkZCxcbmFzc2VydFVwZGF0ZU9uRGVsZXRlLFxua2V5TmFtZSksXG5cblxua2V5cyxcblxudmFsdWVzOmtleXMsXG5cbnNuYXBzaG90OihrZXlQYXR0PXVuZGVmaW5lZCk9Pm1ha2VDb3B5U2V0KGtleXMoa2V5UGF0dCkpLFxuXG5nZXRTaXplOihrZXlQYXR0PXVuZGVmaW5lZCk9Plxua2V5UGF0dD09PXVuZGVmaW5lZD9qc3NldC5zaXplOlsuLi5rZXlzKGtleVBhdHQpXS5sZW5ndGgsXG5cbmNsZWFyOihrZXlQYXR0PXVuZGVmaW5lZCk9PntcbmlmKGtleVBhdHQ9PT11bmRlZmluZWQpe1xuanNzZXQuY2xlYXIoKTtcbiB9XG5mb3IoY29uc3Qga2V5IG9mIGtleXMoa2V5UGF0dCkpe1xuanNzZXQuZGVsZXRlKGtleSk7XG4gfVxuIH19KTtcblxuIH07XG5cbi8qKlxuICogRGlzdGluZ3Vpc2hlcyBiZXR3ZWVuIGFkZGluZyBhIG5ldyBrZXkgKGluaXQpIGFuZCB1cGRhdGluZyBvclxuICogcmVmZXJlbmNpbmcgYSBrZXkgKGdldCwgc2V0LCBkZWxldGUpLlxuICpcbiAqIGBpbml0YCBpcyBvbmx5IGFsbG93ZWQgaWYgdGhlIGtleSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LiBgR2V0YCxcbiAqIGBzZXRgIGFuZCBgZGVsZXRlYCBhcmUgb25seSBhbGxvd2VkIGlmIHRoZSBrZXkgZG9lcyBhbHJlYWR5IGV4aXN0LlxuICpcbiAqIFRoaXMgaXMgYSAqc2NhbGFyKiBzZXQgaW4gdGhhdCB0aGUga2V5cyBjYW4gb25seSBiZSBhdG9taWMgdmFsdWVzLCBwcmltaXRpdmVzXG4gKiBvciByZW1vdGFibGVzLiBPdGhlciBzdG9yZVNldHMgd2lsbCBhY2NlcHQsIGZvciBleGFtcGxlLCBjb3B5QXJyYXlzIGFuZFxuICogY29weVJlY29yZHMsIGFzIGtleXMgYW5kIGxvb2sgdGhlbSB1cCBiYXNlZCBvbiBlcXVhbGl0eSBvZiB0aGVpciBjb250ZW50cy5cbiAqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtzdHJpbmd9IFt0YWc9J2tleSddIC0gdGFnIGZvciBkZWJ1Z2dpbmdcbiAqIEBwYXJhbSB7U3RvcmVPcHRpb25zPX0gb3B0aW9uc1xuICogQHJldHVybnMge1NldFN0b3JlPEs+fVxuICovJGjigI1fb25jZS5tYWtlU2V0U3RvcmVNZXRob2RzKG1ha2VTZXRTdG9yZU1ldGhvZHMpO1xuY29uc3QgICAgICAgIG1ha2VTY2FsYXJTZXRTdG9yZT0oXG50YWc9J2tleScsXG57a2V5U2hhcGU9dW5kZWZpbmVkfT17fSk9Plxue1xuY29uc3QganNzZXQ9bmV3IFNldCgpO1xuaWYoa2V5U2hhcGUhPT11bmRlZmluZWQpe1xuYXNzZXJ0UGF0dGVybihrZXlTaGFwZSk7XG4gfVxuXG5jb25zdCBhc3NlcnRLZXlPa1RvQWRkPShrZXkpPT57XG4vKiBUT0RPOiBKdXN0IGEgdHJhbnNpdGlvbiBrbHVkZ2UuIFJlbW92ZSB3aGVuIHBvc3NpYmxlLiovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNjA2Ki9cbmhhcmRlbihrZXkpO1xuXG5hc3NlcnRTY2FsYXJLZXkoa2V5KTtcbmlmKGtleVNoYXBlIT09dW5kZWZpbmVkKXtcbmZpdChrZXksa2V5U2hhcGUsJ3NldFN0b3JlIGtleScpO1xuIH1cbiB9O1xuXG5yZXR1cm4gRmFyKCBgc2NhbGFyIFNldFN0b3JlIG9mICR7cSh0YWcpfWAse1xuLi4ubWFrZVNldFN0b3JlTWV0aG9kcyhqc3NldCxhc3NlcnRLZXlPa1RvQWRkLHVuZGVmaW5lZCx0YWcpfSk7XG5cbiB9OyRo4oCNX29uY2UubWFrZVNjYWxhclNldFN0b3JlKG1ha2VTY2FsYXJTZXRTdG9yZSk7XG5oYXJkZW4obWFrZVNjYWxhclNldFN0b3JlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlU2V0U3RvcmVNZXRob2RzIjpbIm1ha2VTZXRTdG9yZU1ldGhvZHMiXSwibWFrZVNjYWxhclNldFN0b3JlIjpbIm1ha2VTY2FsYXJTZXRTdG9yZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACQcw0zsRIAALESAAA1AAAAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL3N0b3Jlcy9zY2FsYXJXZWFrTWFwU3RvcmUuanN7ImltcG9ydHMiOlsiLi4va2V5cy9jaGVja0tleS5qcyIsIi4uL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qcyIsIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIiwibWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRmFyLGFzc2VydFBhc3NhYmxlLHBhc3NTdHlsZU9mLGdldENvcHlNYXBFbnRyaWVzLGlzQ29weU1hcCxmaXQsYXNzZXJ0UGF0dGVybjskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0UGFzc2FibGVcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhc3NhYmxlID0gJGjigI1fYSldXSxbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dXV0sW1wiLi4va2V5cy9jaGVja0tleS5qc1wiLCBbW1wiZ2V0Q29weU1hcEVudHJpZXNcIiwgWyRo4oCNX2EgPT4gKGdldENvcHlNYXBFbnRyaWVzID0gJGjigI1fYSldXSxbXCJpc0NvcHlNYXBcIiwgWyRo4oCNX2EgPT4gKGlzQ29weU1hcCA9ICRo4oCNX2EpXV1dXSxbXCIuLi9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanNcIiwgW1tcImZpdFwiLCBbJGjigI1fYSA9PiAoZml0ID0gJGjigI1fYSldXSxbXCJhc3NlcnRQYXR0ZXJuXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXR0ZXJuID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5jb25zdHtxdW90ZTpxLEZhaWx9PWFzc2VydDtcblxuLyoqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAcGFyYW0ge1dlYWtNYXA8SyAmIG9iamVjdCwgVj59IGpzbWFwXG4gKiBAcGFyYW0geyhrOiBLLCB2OiBWKSA9PiB2b2lkfSBhc3NlcnRLVk9rVG9BZGRcbiAqIEBwYXJhbSB7KGs6IEssIHY6IFYpID0+IHZvaWR9IGFzc2VydEtWT2tUb1NldFxuICogQHBhcmFtIHsoKGs6IEspID0+IHZvaWQpPX0gYXNzZXJ0S2V5T2tUb0RlbGV0ZVxuICogQHBhcmFtIHtzdHJpbmc9fSBrZXlOYW1lXG4gKiBAcmV0dXJucyB7V2Vha01hcFN0b3JlPEssVj59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlV2Vha01hcFN0b3JlTWV0aG9kcz0oXG5qc21hcCxcbmFzc2VydEtWT2tUb0FkZCxcbmFzc2VydEtWT2tUb1NldCxcbmFzc2VydEtleU9rVG9EZWxldGU9dW5kZWZpbmVkLFxua2V5TmFtZT0na2V5Jyk9Plxue1xuY29uc3QgYXNzZXJ0S2V5RG9lc05vdEV4aXN0PShrZXkpPT5cbiFqc21hcC5oYXMoa2V5KXx8RmFpbCBgJHtxKGtleU5hbWUpfSBhbHJlYWR5IHJlZ2lzdGVyZWQ6ICR7a2V5fWA7XG5cbmNvbnN0IGFzc2VydEtleUV4aXN0cz0oa2V5KT0+XG5qc21hcC5oYXMoa2V5KXx8RmFpbCBgJHtxKGtleU5hbWUpfSBub3QgZm91bmQ6ICR7a2V5fWA7XG5cbnJldHVybiBoYXJkZW4oe1xuaGFzOihrZXkpPT57XG4vKiBDaGVjayBpZiBhIGtleSBleGlzdHMuIFRoZSBrZXkgY2FuIGJlIGFueSBKYXZhU2NyaXB0IHZhbHVlLCovXG4vKiB0aG91Z2ggdGhlIGFuc3dlciB3aWxsIGFsd2F5cyBiZSBmYWxzZSBmb3Iga2V5cyB0aGF0IGNhbm5vdCBiZSBmb3VuZCovXG4vKiBpbiB0aGlzIG1hcC4qL1xucmV0dXJuIGpzbWFwLmhhcyhrZXkpO1xuIH0sXG5nZXQ6KGtleSk9PntcbmFzc2VydEtleUV4aXN0cyhrZXkpO1xuLyogSG93IHRvIHRlbGwgdHlwZXNjcmlwdCBJIGJlbGlldmUgdGhlIGBnZXRgIHdpbGwgc3VjY2VlZC4qL1xucmV0dXJuICgvKiogQHR5cGUge1Z9ICovanNtYXAuZ2V0KGtleSkpO1xuIH0sXG5cbmluaXQ6KGtleSx2YWx1ZSk9PntcbmFzc2VydEtleURvZXNOb3RFeGlzdChrZXkpO1xuYXNzZXJ0S1ZPa1RvQWRkKGtleSx2YWx1ZSk7XG5qc21hcC5zZXQoa2V5LHZhbHVlKTtcbiB9LFxuc2V0OihrZXksdmFsdWUpPT57XG5hc3NlcnRLZXlFeGlzdHMoa2V5KTtcbmFzc2VydEtWT2tUb1NldChrZXksdmFsdWUpO1xuanNtYXAuc2V0KGtleSx2YWx1ZSk7XG4gfSxcbmRlbGV0ZTooa2V5KT0+e1xuYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG5pZihhc3NlcnRLZXlPa1RvRGVsZXRlIT09dW5kZWZpbmVkKXtcbmFzc2VydEtleU9rVG9EZWxldGUoa2V5KTtcbiB9XG5qc21hcC5kZWxldGUoa2V5KTtcbiB9LFxuXG5hZGRBbGw6KGVudHJpZXMpPT57XG5pZihpc0NvcHlNYXAoZW50cmllcykpe1xuZW50cmllcz1nZXRDb3B5TWFwRW50cmllcyhlbnRyaWVzKTtcbiB9XG5mb3IoY29uc3Rba2V5LHZhbHVlXW9mIGVudHJpZXMpe1xuLyogRG9uJ3QgYXNzZXJ0IHRoYXQgdGhlIGtleSBlaXRoZXIgZG9lcyBvciBkb2VzIG5vdCBleGlzdC4qL1xuYXNzZXJ0S1ZPa1RvQWRkKGtleSx2YWx1ZSk7XG5qc21hcC5zZXQoa2V5LHZhbHVlKTtcbiB9XG4gfX0pO1xuXG4gfTtcblxuLyoqXG4gKiBUaGlzIGlzIGEgKnNjYWxhciogbWFwU3RvcmUgaW4gdGhhdCB0aGUga2V5cyBjYW4gb25seSBiZSBhdG9taWMgdmFsdWVzOlxuICogcHJpbWl0aXZlcyBvciByZW1vdGFibGVzLlxuICogT3RoZXIgbWFwU3RvcmVzIHdpbGwgYWNjZXB0LCBmb3IgZXhhbXBsZSwgY29weUFycmF5cyBhbmRcbiAqIGNvcHlSZWNvcmRzIGFzIGtleXMgYW5kIGxvb2sgdGhlbSB1cCBiYXNlZCBvbiBlcXVhbGl0eSBvZiB0aGVpciBjb250ZW50cy5cbiAqXG4gKiBUT0RPIEZvciBub3csIHRoaXMgc2NhbGFyV2Vha01hcCBhY2NlcHRzIG9ubHkgcmVtb3RhYmxlcywgcmVmbGVjdGluZyB0aGVcbiAqIGNvbnN0cmFpbnRzIG9mIHRoZSB1bmRlcmx5aW5nIEphdmFTY3JpcHQgV2Vha01hcCBpdCB1c2VzIGludGVybmFsbHkuIEJ1dFxuICogaXQgc2hvdWxkIGFjY2VwdCB0aGUgcHJpbWl0aXZlcyBhcyB3ZWxsLCBzdG9yaW5nIHRoZW0gaW4gYSBzZXBhcmF0ZSBpbnRlcm5hbFxuICogbWFwLiBXaGF0IG1ha2VzIGl0IFwid2Vha1wiIGlzIHRoYXQgaXQgcHJvdmlkZXMgbm8gQVBJIGZvciBlbnVtZXJhdGluZyB3aGF0J3NcbiAqIHRoZXJlLiBUaG91Z2ggbm90ZSB0aGF0IHRoaXMgd291bGQgb25seSBlbmFibGVzIGNvbGxlY3Rpb24gb2YgdGhlXG4gKiByZW1vdGFibGVzLCBzaW5jZSB0aGUgb3RoZXIgcHJpbWl0aXZlcyBtYXkgYWx3YXlzIHJlYXBwZWFyLlxuICpcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdGFnPSdrZXknXSAtIHRhZyBmb3IgZGVidWdnaW5nXG4gKiBAcGFyYW0ge1N0b3JlT3B0aW9ucz19IG9wdGlvbnNcbiAqIEByZXR1cm5zIHtXZWFrTWFwU3RvcmU8SyxWPn1cbiAqLyRo4oCNX29uY2UubWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMobWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMpO1xuY29uc3QgICAgICAgIG1ha2VTY2FsYXJXZWFrTWFwU3RvcmU9KFxudGFnPSdrZXknLFxue2xvbmdMaXZlZD10cnVlLGtleVNoYXBlPXVuZGVmaW5lZCx2YWx1ZVNoYXBlPXVuZGVmaW5lZH09e30pPT5cbntcbmNvbnN0IGpzbWFwPW5ldyhsb25nTGl2ZWQ/V2Vha01hcDpNYXApKCk7XG5pZihrZXlTaGFwZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnRQYXR0ZXJuKGtleVNoYXBlKTtcbiB9XG5pZih2YWx1ZVNoYXBlIT09dW5kZWZpbmVkKXtcbmFzc2VydFBhdHRlcm4odmFsdWVTaGFwZSk7XG4gfVxuXG5jb25zdCBhc3NlcnRLVk9rVG9TZXQ9KF9rZXksdmFsdWUpPT57XG4vKiBUT0RPOiBKdXN0IGEgdHJhbnNpdGlvbiBrbHVkZ2UuIFJlbW92ZSB3aGVuIHBvc3NpYmxlLiovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNjA2Ki9cbmhhcmRlbih2YWx1ZSk7XG5cbmFzc2VydFBhc3NhYmxlKHZhbHVlKTtcbmlmKHZhbHVlU2hhcGUhPT11bmRlZmluZWQpe1xuZml0KHZhbHVlLHZhbHVlU2hhcGUsJ3dlYWtNYXBTdG9yZSB2YWx1ZScpO1xuIH1cbiB9O1xuXG5jb25zdCBhc3NlcnRLVk9rVG9BZGQ9KGtleSx2YWx1ZSk9Pntcbi8qIFRPRE86IEp1c3QgYSB0cmFuc2l0aW9uIGtsdWRnZS4gUmVtb3ZlIHdoZW4gcG9zc2libGUuKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM2MDYqL1xuaGFyZGVuKGtleSk7XG5wYXNzU3R5bGVPZihrZXkpPT09J3JlbW90YWJsZSd8fFxuRmFpbCBgT25seSByZW1vdGFibGVzIGNhbiBiZSBrZXlzIG9mIHNjYWxhciBXZWFrTWFwU3RvcmVzOiAke2tleX1gO1xuaWYoa2V5U2hhcGUhPT11bmRlZmluZWQpe1xuZml0KGtleSxrZXlTaGFwZSwnd2Vha01hcFN0b3JlIGtleScpO1xuIH1cbmFzc2VydEtWT2tUb1NldChrZXksdmFsdWUpO1xuIH07XG5cbnJldHVybiBGYXIoIGBzY2FsYXIgV2Vha01hcFN0b3JlIG9mICR7cSh0YWcpfWAse1xuLi4ubWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMoXG5qc21hcCxcbmFzc2VydEtWT2tUb0FkZCxcbmFzc2VydEtWT2tUb1NldCxcbnVuZGVmaW5lZCxcbnRhZyl9KTtcblxuXG4gfTskaOKAjV9vbmNlLm1ha2VTY2FsYXJXZWFrTWFwU3RvcmUobWFrZVNjYWxhcldlYWtNYXBTdG9yZSk7XG5oYXJkZW4obWFrZVNjYWxhcldlYWtNYXBTdG9yZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMiOlsibWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMiXSwibWFrZVNjYWxhcldlYWtNYXBTdG9yZSI6WyJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMtVOkJdDgAAXQ4AADUAAABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvc3RvcmVzL3NjYWxhcldlYWtTZXRTdG9yZS5qc3siaW1wb3J0cyI6WyIuLi9rZXlzL2NoZWNrS2V5LmpzIiwiLi4vcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmUiLCJtYWtlV2Vha1NldFN0b3JlTWV0aG9kcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBGYXIscGFzc1N0eWxlT2YsZ2V0Q29weVNldEtleXMsaXNDb3B5U2V0LGZpdCxhc3NlcnRQYXR0ZXJuOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXSxbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dXV0sW1wiLi4va2V5cy9jaGVja0tleS5qc1wiLCBbW1wiZ2V0Q29weVNldEtleXNcIiwgWyRo4oCNX2EgPT4gKGdldENvcHlTZXRLZXlzID0gJGjigI1fYSldXSxbXCJpc0NvcHlTZXRcIiwgWyRo4oCNX2EgPT4gKGlzQ29weVNldCA9ICRo4oCNX2EpXV1dXSxbXCIuLi9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanNcIiwgW1tcImZpdFwiLCBbJGjigI1fYSA9PiAoZml0ID0gJGjigI1fYSldXSxbXCJhc3NlcnRQYXR0ZXJuXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXR0ZXJuID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5jb25zdHtxdW90ZTpxLEZhaWx9PWFzc2VydDtcblxuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtXZWFrU2V0PEsgJiBvYmplY3Q+fSBqc3NldFxuICogQHBhcmFtIHsoazogSykgPT4gdm9pZH0gYXNzZXJ0S2V5T2tUb0FkZFxuICogQHBhcmFtIHsoKGs6IEspID0+IHZvaWQpPX0gYXNzZXJ0S2V5T2tUb0RlbGV0ZVxuICogQHBhcmFtIHtzdHJpbmc9fSBrZXlOYW1lXG4gKiBAcmV0dXJucyB7V2Vha1NldFN0b3JlPEs+fVxuICovXG5jb25zdCAgICAgICAgbWFrZVdlYWtTZXRTdG9yZU1ldGhvZHM9KFxuanNzZXQsXG5hc3NlcnRLZXlPa1RvQWRkLFxuYXNzZXJ0S2V5T2tUb0RlbGV0ZT11bmRlZmluZWQsXG5rZXlOYW1lPSdrZXknKT0+XG57XG5jb25zdCBhc3NlcnRLZXlFeGlzdHM9KGtleSk9PlxuanNzZXQuaGFzKGtleSl8fEZhaWwgYCR7cShrZXlOYW1lKX0gbm90IGZvdW5kOiAke2tleX1gO1xuXG5yZXR1cm4gaGFyZGVuKHtcbmhhczooa2V5KT0+e1xuLyogQ2hlY2sgaWYgYSBrZXkgZXhpc3RzLiBUaGUga2V5IGNhbiBiZSBhbnkgSmF2YVNjcmlwdCB2YWx1ZSwqL1xuLyogdGhvdWdoIHRoZSBhbnN3ZXIgd2lsbCBhbHdheXMgYmUgZmFsc2UgZm9yIGtleXMgdGhhdCBjYW5ub3QgYmUgZm91bmQqL1xuLyogaW4gdGhpcyBzZXQuKi9cbnJldHVybiBqc3NldC5oYXMoa2V5KTtcbiB9LFxuXG5hZGQ6KGtleSk9PntcbmFzc2VydEtleU9rVG9BZGQoa2V5KTtcbmpzc2V0LmFkZChrZXkpO1xuIH0sXG5kZWxldGU6KGtleSk9PntcbmFzc2VydEtleUV4aXN0cyhrZXkpO1xuaWYoYXNzZXJ0S2V5T2tUb0RlbGV0ZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnRLZXlPa1RvRGVsZXRlKGtleSk7XG4gfVxuanNzZXQuZGVsZXRlKGtleSk7XG4gfSxcblxuYWRkQWxsOihrZXlzKT0+e1xuaWYoaXNDb3B5U2V0KGtleXMpKXtcbmtleXM9Z2V0Q29weVNldEtleXMoa2V5cyk7XG4gfVxuZm9yKGNvbnN0IGtleSBvZiBrZXlzKXtcbmFzc2VydEtleU9rVG9BZGQoa2V5KTtcbmpzc2V0LmFkZChrZXkpO1xuIH1cbiB9fSk7XG5cbiB9O1xuXG4vKipcbiAqIFRoaXMgaXMgYSAqc2NhbGFyKiBzZXQgaW4gdGhhdCB0aGUga2V5cyBjYW4gb25seSBiZSBhdG9taWMgdmFsdWVzLCBwcmltaXRpdmVzXG4gKiBvciByZW1vdGFibGVzLiBPdGhlciBzdG9yZVNldHMgd2lsbCBhY2NlcHQsIGZvciBleGFtcGxlLCBjb3B5QXJyYXlzIGFuZFxuICogY29weVJlY29yZHMsIGFzIGtleXMgYW5kIGxvb2sgdGhlbSB1cCBiYXNlZCBvbiBlcXVhbGl0eSBvZiB0aGVpciBjb250ZW50cy5cbiAqXG4gKiBUT0RPIEZvciBub3csIHRoaXMgc2NhbGFyV2Vha1NldCBhY2NlcHRzIG9ubHkgcmVtb3RhYmxlcywgcmVmbGVjdGluZyB0aGVcbiAqIGNvbnN0cmFpbnRzIG9mIHRoZSB1bmRlcmx5aW5nIEphdmFTY3JpcHQgV2Vha1NldCBpdCB1c2VzIGludGVybmFsbHkuIEJ1dFxuICogaXQgc2hvdWxkIGFjY2VwdCB0aGUgcHJpbWl0aXZlcyBhcyB3ZWxsLCBzdG9yaW5nIHRoZW0gaW4gYSBzZXBhcmF0ZSBpbnRlcm5hbFxuICogc2V0LiBXaGF0IG1ha2VzIGl0IFwid2Vha1wiIGlzIHRoYXQgaXQgcHJvdmlkZXMgbm8gQVBJIGZvciBlbnVtZXJhdGluZyB3aGF0J3NcbiAqIHRoZXJlLiBUaG91Z2ggbm90ZSB0aGF0IHRoaXMgd291bGQgb25seSBlbmFibGVzIGNvbGxlY3Rpb24gb2YgdGhlXG4gKiByZW1vdGFibGVzLCBzaW5jZSB0aGUgb3RoZXIgcHJpbWl0aXZlcyBtYXkgYWx3YXlzIGFwcGVhci5cbiAqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtzdHJpbmd9IFt0YWc9J2tleSddIC0gdGFnIGZvciBkZWJ1Z2dpbmdcbiAqIEBwYXJhbSB7U3RvcmVPcHRpb25zPX0gb3B0aW9uc1xuICogQHJldHVybnMge1dlYWtTZXRTdG9yZTxLPn1cbiAqLyRo4oCNX29uY2UubWFrZVdlYWtTZXRTdG9yZU1ldGhvZHMobWFrZVdlYWtTZXRTdG9yZU1ldGhvZHMpO1xuY29uc3QgICAgICAgIG1ha2VTY2FsYXJXZWFrU2V0U3RvcmU9KFxudGFnPSdrZXknLFxue2xvbmdMaXZlZD10cnVlLGtleVNoYXBlPXVuZGVmaW5lZH09e30pPT5cbntcbmNvbnN0IGpzc2V0PW5ldyhsb25nTGl2ZWQ/V2Vha1NldDpTZXQpKCk7XG5pZihrZXlTaGFwZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnRQYXR0ZXJuKGtleVNoYXBlKTtcbiB9XG5cbmNvbnN0IGFzc2VydEtleU9rVG9BZGQ9KGtleSk9Pntcbi8qIFRPRE86IEp1c3QgYSB0cmFuc2l0aW9uIGtsdWRnZS4gUmVtb3ZlIHdoZW4gcG9zc2libGUuKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM2MDYqL1xuaGFyZGVuKGtleSk7XG5wYXNzU3R5bGVPZihrZXkpPT09J3JlbW90YWJsZSd8fFxuRmFpbCBgT25seSByZW1vdGFibGVzIGNhbiBiZSBrZXlzIG9mIHNjYWxhciBXZWFrU3RvcmVzOiAke2tleX1gO1xuaWYoa2V5U2hhcGUhPT11bmRlZmluZWQpe1xuZml0KGtleSxrZXlTaGFwZSwnd2Vha1NldFN0b3JlIGtleScpO1xuIH1cbiB9O1xuXG5yZXR1cm4gRmFyKCBgc2NhbGFyIFdlYWtTZXRTdG9yZSBvZiAke3EodGFnKX1gLHtcbi4uLm1ha2VXZWFrU2V0U3RvcmVNZXRob2RzKGpzc2V0LGFzc2VydEtleU9rVG9BZGQsdW5kZWZpbmVkLHRhZyl9KTtcblxuIH07JGjigI1fb25jZS5tYWtlU2NhbGFyV2Vha1NldFN0b3JlKG1ha2VTY2FsYXJXZWFrU2V0U3RvcmUpO1xuaGFyZGVuKG1ha2VTY2FsYXJXZWFrU2V0U3RvcmUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VXZWFrU2V0U3RvcmVNZXRob2RzIjpbIm1ha2VXZWFrU2V0U3RvcmVNZXRob2RzIl0sIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmUiOlsibWFrZVNjYWxhcldlYWtTZXRTdG9yZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAqUK3IPBMAADwTAAAuAAAAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL3N0b3Jlcy9zdG9yZS11dGlscy5qc3siaW1wb3J0cyI6WyJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsibWFrZUF0b21pY1Byb3ZpZGVyIiwibWFrZUN1cnJlbnRLZXlzS2l0IiwicHJvdmlkZUxhenkiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRmFyOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXV1dXSk7ICAgXG5cbmNvbnN0e2RldGFpbHM6WCxxdW90ZTpxfT1hc3NlcnQ7XG5cbi8qKlxuICogQHRlbXBsYXRlIEssVlxuICogQHR5cGVkZWYge29iamVjdH0gQ3VycmVudEtleXNLaXRcbiAqIEBwcm9wZXJ0eSB7KGs6IEssIHY/OiBWKSA9PiB2b2lkfSBhc3NlcnRVcGRhdGVPbkFkZFxuICogQHByb3BlcnR5IHsoazogSykgPT4gdm9pZH0gYXNzZXJ0VXBkYXRlT25EZWxldGVcbiAqIEBwcm9wZXJ0eSB7SXRlcmFibGU8Sz59IGl0ZXJhYmxlS2V5c1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIEssVlxuICogQHBhcmFtIHsoKSA9PiBJdGVyYWJsZTxLPn0gZ2V0UmF3S2V5c1xuICogQHBhcmFtIHsoazogSykgPT4gYm9vbGVhbn0gY2hlY2tIYXNcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEBwYXJhbSB7KGs6IEssIHY/OiBWKSA9PiB2b2lkfSBhc3NlcnRPa1RvQWRkXG4gKiBAcGFyYW0geygoazogSykgPT4gdm9pZCk9fSBhc3NlcnRPa1RvRGVsZXRlXG4gKiBAcGFyYW0ge3N0cmluZz19IGtleU5hbWVcbiAqIEByZXR1cm5zIHtDdXJyZW50S2V5c0tpdDxLLFY+fVxuICovXG5jb25zdCAgICAgICAgbWFrZUN1cnJlbnRLZXlzS2l0PShcbmdldFJhd0tleXMsXG5jaGVja0hhcyxcbmNvbXBhcmUsXG5hc3NlcnRPa1RvQWRkLFxuYXNzZXJ0T2tUb0RlbGV0ZT11bmRlZmluZWQsXG5rZXlOYW1lPSdrZXknKT0+XG57XG5sZXQgdXBkYXRlQ291bnQ9MDtcbmxldCBzb3J0ZWRLZXlzTWVtbztcblxuY29uc3QgYXNzZXJ0VXBkYXRlT25BZGQ9KGssdj11bmRlZmluZWQpPT57XG5hc3NlcnRPa1RvQWRkKGssdik7XG51cGRhdGVDb3VudCs9MTtcbnNvcnRlZEtleXNNZW1vPXVuZGVmaW5lZDtcbiB9O1xuXG5jb25zdCBhc3NlcnRVcGRhdGVPbkRlbGV0ZT0oayk9PmFzc2VydE9rVG9EZWxldGUmJmFzc2VydE9rVG9EZWxldGUoayk7XG5cbmNvbnN0IGdldFNvcnRlZEtleXM9KCk9PntcbmlmKHNvcnRlZEtleXNNZW1vPT09dW5kZWZpbmVkKXtcbnNvcnRlZEtleXNNZW1vPWhhcmRlbihbLi4uZ2V0UmF3S2V5cygpXS5zb3J0KGNvbXBhcmUpKTtcbiB9XG5yZXR1cm4gc29ydGVkS2V5c01lbW87XG4gfTtcblxuY29uc3QgaXRlcmFibGVLZXlzPUZhcignSXRlcmFibGUgb2Yga2V5cycse1xuW1N5bWJvbC5pdGVyYXRvcl06KCk9PntcbmNvbnN0IGdlbmVyYXRpb249dXBkYXRlQ291bnQ7XG5nZXRTb3J0ZWRLZXlzKCk7XG5jb25zdCBsZW49c29ydGVkS2V5c01lbW8ubGVuZ3RoO1xubGV0IGk9MDtcbnJldHVybiBGYXIoJ0l0ZXJhdG9yIG9mIGtleXMnLHtcbm5leHQ6KCk9PntcbmFzc2VydC5lcXVhbChcbmdlbmVyYXRpb24sXG51cGRhdGVDb3VudCxcblggYFN0b3JlICR7cShrZXlOYW1lKX0gY3Vyc29yIHN0YWxlYCk7XG5cbi8qIElmIHRoZXkncmUgZXF1YWwsIHRoZW4gdGhlIHNvcnRlZEtleU1lbW8gaXMgdGhlIHNhbWUgb25lKi9cbi8qIHdlIHN0YXJ0ZWQgd2l0aC4qL1xuZm9yKDs7KXtcbmlmKGk8bGVuKXtcbmNvbnN0IHZhbHVlPXNvcnRlZEtleXNNZW1vW2ldO1xuaSs9MTtcbmlmKGNoZWNrSGFzKHZhbHVlKSl7XG5yZXR1cm4gaGFyZGVuKHtkb25lOmZhbHNlLHZhbHVlfSk7XG4gfVxuIH1lbHNle1xucmV0dXJuIGhhcmRlbih7ZG9uZTp0cnVlLHZhbHVlOnVuZGVmaW5lZH0pO1xuIH1cbiB9XG4gfX0pO1xuXG4gfX0pO1xuXG5cbnJldHVybiBoYXJkZW4oe1xuYXNzZXJ0VXBkYXRlT25BZGQsXG5hc3NlcnRVcGRhdGVPbkRlbGV0ZSxcbml0ZXJhYmxlS2V5c30pO1xuXG4gfTskaOKAjV9vbmNlLm1ha2VDdXJyZW50S2V5c0tpdChtYWtlQ3VycmVudEtleXNLaXQpO1xuaGFyZGVuKG1ha2VDdXJyZW50S2V5c0tpdCk7XG5cbi8qKlxuICogQ2FsbCBgcHJvdmlkZUxhenlgIHRvIGdldCBvciBtYWtlIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGtleS5cbiAqIElmIHRoZXJlIGFscmVhZHkgaXMgb25lLCByZXR1cm4gdGhhdC4gT3RoZXJ3aXNlLFxuICogY2FsbCBgbWFrZVZhbHVlKGtleSlgLCByZW1lbWJlciBpdCBhcyB0aGUgdmFsdWUgZm9yXG4gKiB0aGF0IGtleSwgYW5kIHJldHVybiBpdC5cbiAqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAcGFyYW0ge1dlYWtNYXBTdG9yZTxLLFY+fSBtYXBTdG9yZVxuICogQHBhcmFtIHtLfSBrZXlcbiAqIEBwYXJhbSB7KGtleTogSykgPT4gVn0gbWFrZVZhbHVlXG4gKiBAcmV0dXJucyB7Vn1cbiAqL1xuY29uc3QgICAgICAgIHByb3ZpZGVMYXp5PShtYXBTdG9yZSxrZXksbWFrZVZhbHVlKT0+e1xuaWYoIW1hcFN0b3JlLmhhcyhrZXkpKXtcbm1hcFN0b3JlLmluaXQoa2V5LG1ha2VWYWx1ZShrZXkpKTtcbiB9XG5yZXR1cm4gbWFwU3RvcmUuZ2V0KGtleSk7XG4gfTskaOKAjV9vbmNlLnByb3ZpZGVMYXp5KHByb3ZpZGVMYXp5KTtcbmhhcmRlbihwcm92aWRlTGF6eSk7XG5cbi8qKlxuICogSGVscGVyIGZvciB1c2UgY2FzZXMgaW4gd2hpY2ggdGhlIG1ha2VyIGZ1bmN0aW9uIGlzIGFzeW5jLlxuICogRm9yIHR3byBwcm92aWRlTGF6eSBjYWxscyB3aXRoIHRoZSBzYW1lIGtleSwgb25lIG1heSBiZSBtYWtpbmcgd2hlbiB0aGVcbiAqIG90aGVyIGNhbGwgc3RhcnRzIGFuZCBpdCB3b3VsZCBtYWtlIGFnYWluLlxuICogKFRoZW4gdGhlcmUnZCBiZSBhIGNvbGxpc2lvbiB3aGVuIHRoZSBzZWNvbmQgdHJpZXMgdG8gc3RvcmVcbiAqIHRoZSBrZXkuKSBUaGlzIHByZXZlbnRzIHRoYXQgcmFjZSBjb25kaXRpb24gYnkgaW1tZWRpYXRlbHkgc3RvcmluZyBhIFByb21pc2VcbiAqIGZvciB0aGUgbWFrZXIgaW4gYW4gZXBoZW1lcmFsIHN0b3JlLlxuICpcbiAqIFdoZW4gdGhlIGBzdG9yZWAgYXJndW1lbnQgaXMgZHVyYWJsZSBzdG9yYWdlLCBub3RlIHRoYXQgaXQncyBwb3NzaWJsZSBmb3JcbiAqIHRlcm1pbmF0aW9uIHRvIGhhcHBlbiBhZnRlciB0aGUgbWFrZSBjb21wbGV0ZXMgYW5kIGJlZm9yZSBpdCByZWFjaGVzIGR1cmFibGVcbiAqIHN0b3JhZ2UuXG4gKlxuICogQHRlbXBsYXRlIEtcbiAqIEB0ZW1wbGF0ZSBWXG4gKiBAcGFyYW0ge1dlYWtNYXBTdG9yZTxLLCBWPn0gc3RvcmVcbiAqL1xuY29uc3QgICAgICAgIG1ha2VBdG9taWNQcm92aWRlcj0oc3RvcmUpPT57XG4vKiogQHR5cGUge01hcDxLLCBQcm9taXNlPFY+Pn0gKi9cbmNvbnN0IHBlbmRpbmc9bmV3IE1hcCgpO1xuXG4vKipcbiAqIENhbGwgYHByb3ZpZGVBc3luY2AgdG8gZ2V0IG9yIG1ha2UgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5LFxuICogd2hlbiB0aGUgbWFrZXIgaXMgYXN5bmNocm9ub3VzLlxuICogSWYgdGhlcmUgYWxyZWFkeSBpcyBvbmUsIHJldHVybiB0aGF0LiBPdGhlcndpc2UsXG4gKiBjYWxsIGBtYWtlVmFsdWUoa2V5KWAsIHJlbWVtYmVyIGl0IGFzIHRoZSB2YWx1ZSBmb3JcbiAqIHRoYXQga2V5LCBhbmQgcmV0dXJuIGl0LlxuICpcbiAqIEBwYXJhbSB7S30ga2V5XG4gKiBAcGFyYW0geyhrZXk6IEspID0+IFByb21pc2U8Vj59IG1ha2VWYWx1ZSBtYWtlIHRoZSB2YWx1ZSBmb3IgdGhlIHN0b3JlXG4gKiBpZiBpdCBoYXNuJ3QgYmVlbiBtYWRlIHlldCBvciB0aGUgbGFzdCBtYWtlIGZhaWxlZFxuICogQHBhcmFtIHsoa2V5OiBLLCB2YWx1ZTogVikgPT4gUHJvbWlzZTx2b2lkPn0gW2ZpbmlzaFZhbHVlXSBydW5zIGV4YWN0bHlcbiAqIG9uY2UgYWZ0ZXIgYSBuZXcgdmFsdWUgaXMgYWRkZWQgdG8gdGhlIHN0b3JlXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxWPn1cbiAqL1xuY29uc3QgcHJvdmlkZUFzeW5jPShrZXksbWFrZVZhbHVlLGZpbmlzaFZhbHVlKT0+e1xuaWYoc3RvcmUuaGFzKGtleSkpe1xucmV0dXJuIFByb21pc2UucmVzb2x2ZShzdG9yZS5nZXQoa2V5KSk7XG4gfVxuaWYoIXBlbmRpbmcuaGFzKGtleSkpe1xuY29uc3QgdmFsUD1tYWtlVmFsdWUoa2V5KS5cbnRoZW4oKHYpPT57XG5zdG9yZS5pbml0KGtleSx2KTtcbnJldHVybiB2O1xuIH0pLlxudGhlbigodik9PntcbmlmKGZpbmlzaFZhbHVlKXtcbnJldHVybiBmaW5pc2hWYWx1ZShrZXksdikudGhlbigoKT0+dik7XG4gfVxucmV0dXJuIHY7XG4gfSkuXG5maW5hbGx5KCgpPT57XG5wZW5kaW5nLmRlbGV0ZShrZXkpO1xuIH0pO1xucGVuZGluZy5zZXQoa2V5LHZhbFApO1xuIH1cbmNvbnN0IHZhbFA9cGVuZGluZy5nZXQoa2V5KTtcbmFzc2VydCh2YWxQKTtcbnJldHVybiB2YWxQO1xuIH07XG5cbnJldHVybiBoYXJkZW4oe3Byb3ZpZGVBc3luY30pO1xuIH07JGjigI1fb25jZS5tYWtlQXRvbWljUHJvdmlkZXIobWFrZUF0b21pY1Byb3ZpZGVyKTtcbmhhcmRlbihtYWtlQXRvbWljUHJvdmlkZXIpO1xuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHRlbXBsYXRlIFZcbiAqIEB0eXBlZGVmIHtSZXR1cm5UeXBlPHR5cGVvZiBtYWtlQXRvbWljUHJvdmlkZXI8SywgVj4+fSBBdG9taWNQcm92aWRlcjxLLCBWPlxuICovXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUN1cnJlbnRLZXlzS2l0IjpbIm1ha2VDdXJyZW50S2V5c0tpdCJdLCJwcm92aWRlTGF6eSI6WyJwcm92aWRlTGF6eSJdLCJtYWtlQXRvbWljUHJvdmlkZXIiOlsibWFrZUF0b21pY1Byb3ZpZGVyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANMBGDlcfgAAXH4AACEAAABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLlBhc3NTdHlsZX0gUGFzc1N0eWxlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5Db3B5VGFnZ2VkfSBDb3B5VGFnZ2VkICovXG4vKiogQHRlbXBsYXRlIFQgQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5Db3B5UmVjb3JkPFQ+fSBDb3B5UmVjb3JkICovXG4vKiogQHRlbXBsYXRlIFQgQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5Db3B5QXJyYXk8VD59IENvcHlBcnJheSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuQ2hlY2tlcn0gQ2hlY2tlciAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtQYXNzYWJsZX0gS2V5XG4gKiBLZXlzIGFyZSBwYXNzLWJ5LWNvcHkgc3RydWN0dXJlcyAoQ29weUFycmF5LCBDb3B5UmVjb3JkLFxuICogQ29weVNldCwgQ29weUJhZywgQ29weU1hcCkgdGhhdCBlbmQgaW4gZWl0aGVyIHBhc3NhYmxlIHByaW1pdGl2ZSBkYXRhIG9yXG4gKiBSZW1vdGFibGVzIChGYXIgb2JqZWN0cyBvciB0aGVpciByZW1vdGUgcHJlc2VuY2VzLikgS2V5cyBhcmUgc28gbmFtZWRcbiAqIGJlY2F1c2UgdGhleSBjYW4gYmUgdXNlZCBhcyBrZXlzIGluIE1hcFN0b3JlcyBhbmQgQ29weU1hcHMsIGFzIHdlbGwgYXNcbiAqIHRoZSBlbGVtZW50cyBvZiBDb3B5U2V0cyBhbmQgQ29weUJhZ3MuXG4gKlxuICogS2V5cyBjYW5ub3QgY29udGFpbiBwcm9taXNlcyBvciBlcnJvcnMsIGFzIHRoZXNlIGRvIG5vdCBoYXZlIGEgdXNlZnVsXG4gKiBkaXN0cmlidXRlZCBlcXVhbGl0eSBzZW1hbnRpY3MuIEtleXMgYWxzbyBjYW5ub3QgY29udGFpbiBhbnkgQ29weVRhZ2dlZFxuICogZXhjZXB0IGZvciB0aG9zZSByZWNvZ25pemVkIGFzIENvcHlTZXRzLCBDb3B5QmFncywgYW5kIENvcHlNYXBzLlxuICpcbiAqIEJlIGF3YXJlIHRoYXQgd2UgbWF5IHJlY29nbml6ZSBtb3JlIENvcHlUYWdnZWRzIG92ZXIgdGltZSwgaW5jbHVkaW5nXG4gKiBDb3B5VGFnZ2VkcyByZWNvZ25pemVkIGFzIGtleXMuXG4gKlxuICogRGlzdHJpYnV0ZWQgZXF1YWxpdHkgaXMgbG9jYXRpb24gaW5kZXBlbmRlbnQuXG4gKiBUaGUgc2FtZSB0d28ga2V5cywgcGFzc2VkIHRvIGFub3RoZXIgbG9jYXRpb24sIHdpbGwgYmUgYGtleUVRYCB0aGVyZSBpZmZcbiAqIHRoZXkgYXJlIGBrZXlFUWAgaGVyZS4gKGBrZXlFUWAgdGVzdHMgZXF1YWxpdHkgYWNjb3JkaW5nIHRvIHRoZVxuICoga2V5IGRpc3RyaWJ1dGVkIGVxdWFsaXR5IHNlbWFudGljcy4pXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7UGFzc2FibGV9IFBhdHRlcm5cbiAqIFBhdHRlcm5zIGFyZSBwYXNzLWJ5LWNvcHkgc3RydWN0dXJlcyAoQ29weUFycmF5LCBDb3B5UmVjb3JkLFxuICogQ29weVNldCwgQ29weUJhZywgQ29weU1hcCkgdGhhdCBlbmQgaW4gZWl0aGVyIEtleXMgb3IgTWF0Y2hlcnMuIEVhY2ggcGF0dGVyblxuICogYWN0cyBhcyBhIGRlY2xhcmF0aXZlIHBhc3NhYmxlIHByZWRpY2F0ZSBvdmVyIHBhc3NhYmxlcywgd2hlcmUgZWFjaCBwYXNzYWJsZVxuICogZWl0aGVyIHBhc3NlcyBhIGdpdmVuIHBhdHRlcm4sIG9yIGRvZXMgbm90LiBFdmVyeSBrZXkgaXMgYWxzbyBhIHBhdHRlcm4uXG4gKiBVc2VkIGFzIGEgcGF0dGVybiwgYSBrZXkgbWF0Y2hlcyBvbmx5IFwiaXRzZWxmXCIsIGkuZS4sIGtleXMgdGhhdCBhcmVcbiAqIGBrZXlFUWAgdG8gaXQsIHRoYXQgaXMsIGVxdWFsIGFjY29yZGluZyB0byB0aGVcbiAqIGtleSBkaXN0cmlidXRlZCBlcXVhbGl0eSBzZW1hbnRpY3MuXG4gKlxuICogUGF0dGVybnMgY2Fubm90IGNvbnRhaW4gcHJvbWlzZXMgb3IgZXJyb3JzLCBhcyB0aGVzZSBkb1xuICogbm90IGhhdmUgYSB1c2VmdWwgZGlzdHJpYnV0ZWQgZXF1YWxpdHkgb3IgbWF0Y2hpbmcgc2VtYW50aWNzLiBMaWtld2lzZSxcbiAqIG5vIHBhdHRlcm4gY2FuIGRpc3Rpbmd1aXNoIGFtb25nIHByb21pc2VzLCBvciBkaXN0aW5ndWlzaCBhbW9uZyBlcnJvcnMuXG4gKiBQYXR0ZXJucyBhbHNvIGNhbm5vdCBjb250YWluIGFueSBDb3B5VGFnZ2VkcyBleGNlcHQgZm9yIHRob3NlIHJlY29nbml6ZWQgYXNcbiAqIENvcHlTZXRzLCBDb3B5QmFncywgQ29weU1hcHMsIG9yIE1hdGNoZXJzLlxuICpcbiAqIEJlIGF3YXJlIHRoYXQgd2UgbWF5IHJlY29nbml6ZSBtb3JlIENvcHlUYWdnZWRzIG92ZXIgdGltZSwgaW5jbHVkaW5nXG4gKiBDb3B5VGFnZ2VkcyByZWNvZ25pemVkIGFzIHBhdHRlcm5zLlxuICpcbiAqIFdoZXRoZXIgYSBwYXNzYWJsZSBtYXRjaGVzIGEgZ2l2ZW4gcGF0dGVybiBpcyBsb2NhdGlvbiBpbmRlcGVuZGVudC5cbiAqIEZvciBhIHBhc3NhYmxlIGFuZCBhIHBhdHRlcm4sIGJvdGggcGFzc2VkIHRvIGFub3RoZXIgbG9jYXRpb24sIHRoZSBwYXNzYWJsZVxuICogd2lsbCBtYXRjaCB0aGUgcGF0dGVybiB0aGVyZSBpZmYgdGhlIHBhc3NhYmxlIG1hdGNoZXMgdGhhdCBwYXR0ZXJuIGhlcmUuXG4gKlxuICogUGF0dGVybnMgYXJlIG9mdGVuIHVzZWQgaW4gYSB0eXBlLWxpa2UgbWFubmVyLCB0byByZXByZXNlbnQgdGhlIGNhdGVnb3J5XG4gKiBvZiBwYXNzYWJsZXMgdGhhdCBhcmUgaW50ZW5kZWQqIHRvIG1hdGNoIHRoYXQgcGF0dGVybi4gVG8ga2VlcCB0aGlzXG4gKiBkaXN0aW5jdGlvbiBjbGVhciwgd2Ugb2Z0ZW4gdXNlIHRoZSBzdWZmaXggXCJTaGFwZVwiIHJhdGhlciB0aGFuIFwiUGF0dGVyblwiXG4gKiB0byBhdm9pZCB0aGUgbGV2ZWxzIGNvbmZ1c2lvbiB3aGVuIHRoZSBwYXR0ZXJuIGl0c2VsZiByZXByZXNlbnRzXG4gKiBzb21lIGNhdGVnb3J5IG9mIHBhdHRlcm4uIEZvciBleGFtcGxlLCBhbiBcIkFtb3VudFNoYXBlXCIgcmVwcmVzZW50cyB0aGVcbiAqIGNhdGVnb3J5IG9mIEFtb3VudHMuIEFuZCBcIkFtb3VudFBhdHRlcm5TaGFwZVwiIHJlcHJlc2VudHMgdGhlXG4gKiBjYXRlZ29yeSBvZiBwYXR0ZXJucyBvdmVyIEFtb3VudHMuXG4gKlxuICogKiBJIHNheSBcImludGVuZGVkXCIgYWJvdmUgYmVjYXVzZSBQYXR0ZXJucywgaW4gb3JkZXIgdG8gYmUgZGVjbGFyYXRpdmVcbiAqIGFuZCBwYXNzYWJsZSwgY2Fubm90IGhhdmUgdGhlIGdlbmVyYWxpdHkgb2YgcHJlZGljYXRlcyB3cml0dGVuIGluIGFcbiAqIFR1cmluZy11bml2ZXJzYWwgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UuIFJhdGhlciwgdG8gcmVwcmVzZW50IHRoZSBjYXRlZ29yeSBvZlxuICogdGhpbmdzIGludGVuZGVkIHRvIGJlIGEgRm9vLCBhIEZvb1NoYXBlIHNob3VsZCByZWxpYWJseVxuICogYWNjZXB0IGFsbCBGb29zIGFuZCByZWplY3Qgb25seSBub24tRm9vcy4gSG93ZXZlciwgYSBGb29TaGFwZSBtYXkgYWxzbyBhY2NlcHRcbiAqIG5vbi1Gb29zIHRoYXQgXCJsb29rIGxpa2VcIiBvciBoYXZlIFwidGhlIHNhbWUgc2hhcGUgYXNcIiBnZW51aW5lIEZvb3MuIFRvIHdyaXRlXG4gKiBhcyBhY2N1cmF0ZSBwcmVkaWNhdGUsIGZvciB1c2UsIGZvciBleGFtcGxlLCBmb3IgaW5wdXQgdmFsaWRhdGlvbiwgd291bGRcbiAqIG5lZWQgdG8gc3VwcGxlbWVudCB0aGUgcGF0dGVybiBjaGVjayB3aXRoIGNvZGUgdG8gY2hlY2sgZm9yIHRoZSByZXNpZHVhbFxuICogY2FzZXMuXG4gKiBXZSBob3BlIHRoZSBcIlNoYXBlXCIgbWV0YXBob3IgaGVscHMgcmVtaW5kIHVzIG9mIHRoaXMgdHlwZS1saWtlIGltcHJlY2lzaW9uXG4gKiBvZiBwYXR0ZXJucy5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAdHlwZWRlZiB7Q29weVRhZ2dlZH0gQ29weVNldFxuICovXG5cbi8qIFRPRE8gcGFyYW1ldGVyaXplIENvcHlUYWdnZWQgc28gdGhpcyBjYW4gaW5jbHVkZSBpdCovXG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAdHlwZWRlZiB7e1xuICogICBbU3ltYm9sLnRvU3RyaW5nVGFnXTogc3RyaW5nO1xuICogICBwYXlsb2FkOiBBcnJheTxbSywgYmlnaW50XT47XG4gKiB9fSBDb3B5QmFnXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAdHlwZWRlZiB7Q29weVRhZ2dlZH0gQ29weU1hcFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge0NvcHlUYWdnZWR9IE1hdGNoZXJcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN0b3JlT3B0aW9uc1xuICogT2YgdGhlIGRpbWVuc2lvbnMgb24gd2hpY2ggS2V5ZWRTdG9yZXMgY2FuIGRpZmZlciwgd2Ugb25seSByZXByZXNlbnQgYSBmZXdcbiAqIG9mIHRoZW0gYXMgc3RhbmRhcmQgb3B0aW9ucy4gQSBnaXZlbiBzdG9yZSBtYWtlciBzaG91bGQgZG9jdW1lbnQgd2hpY2hcbiAqIG9wdGlvbnMgaXQgc3VwcG9ydHMsIGFzIHdlbGwgYXMgaXRzIHBvc2l0aW9ucyBvbiBkaW1lbnNpb25zIGZvciB3aGljaCBpdFxuICogZG9lcyBub3Qgc3VwcG9ydCBvcHRpb25zLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbbG9uZ0xpdmVkPXRydWVdIFdoaWNoIHdheSB0byBvcHRpbWl6ZSBhIHdlYWsgc3RvcmUuIFRydWUgbWVhbnNcbiAqIHRoYXQgd2UgZXhwZWN0IHRoaXMgd2VhayBzdG9yZSB0byBvdXRsaXZlIG1vc3Qgb2YgaXRzIGtleXMsIGluIHdoaWNoXG4gKiBjYXNlIHdlIGludGVybmFsbHkgbWF5IHVzZSBhIEphdmFTY3JpcHQgYFdlYWtNYXBgLiBPdGhlcndpc2Ugd2UgaW50ZXJuYWxseVxuICogbWF5IHVzZSBhIEphdmFTY3JpcHQgYE1hcGAuXG4gKiBEZWZhdWx0cyB0byB0cnVlLCBzbyBwbGVhc2UgbWFyayBzaG9ydCBsaXZlZCBzdG9yZXMgZXhwbGljaXRseS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2R1cmFibGU9ZmFsc2VdICBUaGUgY29udGVudHMgb2YgdGhpcyBzdG9yZSBzdXJ2aXZlIHRlcm1pbmF0aW9uXG4gKiAgIG9mIGl0cyBjb250YWluaW5nIHByb2Nlc3MsIGFsbG93aW5nIGZvciByZXN0YXJ0IG9yIHVwZ3JhZGUgYnV0IGF0IHRoZSBjb3N0XG4gKiAgIG9mIGZvcmJpZGRpbmcgc3RvcmFnZSBvZiByZWZlcmVuY2VzIHRvIGVwaGVtZXJhbCBkYXRhLiAgRGVmYXVsdHMgdG8gZmFsc2UuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtmYWtlRHVyYWJsZT1mYWxzZV0gIFRoaXMgc3RvcmUgcHJldGVuZHMgdG8gYmUgYSBkdXJhYmxlIHN0b3JlXG4gKiAgIGJ1dCBkb2VzIG5vdCBlbmZvcmNlIHRoYXQgdGhlIHRoaW5ncyBzdG9yZWQgaW4gaXQgYWN0dWFsbHkgYmUgdGhlbXNlbHZlc1xuICogICBkdXJhYmxlICh3aGVyZWFzIGFuIGFjdHVhbCBkdXJhYmxlIHN0b3JlIHdvdWxkIGZvcmJpZCBzdG9yYWdlIG9mIHN1Y2hcbiAqICAgaXRlbXMpLiAgVGhpcyBpcyBpbiBzZXJ2aWNlIG9mIGFsbG93aW5nIGluY3JlbWVudGFsIHRyYW5zaXRpb24gdG8gdXNlIG9mXG4gKiAgIGR1cmFibGUgc3RvcmVzLCB0byBlbmFibGUgbm9ybWFsIG9wZXJhdGlvbiBhbmQgdGVzdGluZyB3aGVuIHNvbWUgc3R1ZmZcbiAqICAgaW50ZW5kZWQgdG8gZXZlbnR1YWxseSBiZSBkdXJhYmxlIGhhcyBub3QgeWV0IGJlZW4gbWFkZSBkdXJhYmxlLiAgQSBzdG9yZVxuICogICBtYXJrZWQgYXMgZmFrZUR1cmFibGUgd2lsbCBhcHBlYXIgdG8gb3BlcmF0ZSBub3JtYWxseSBidXQgYW55IGF0dGVtcHQgdG9cbiAqICAgdXBncmFkZSBpdHMgY29udGFpbmluZyB2YXQgd2lsbCBmYWlsIHdpdGggYW4gZXJyb3IuXG4gKiBAcHJvcGVydHkge1BhdHRlcm49fSBrZXlTaGFwZVxuICogQHByb3BlcnR5IHtQYXR0ZXJuPX0gdmFsdWVTaGFwZVxuICovXG5cbi8qKlxuICogTW9zdCBzdG9yZSBtZXRob2RzIGFyZSBpbiBvbmUgb2YgdGhyZWUgY2F0ZWdvcmllc1xuICogICAqIGxvb2t1cCBtZXRob2RzIChgaGFzYCxgZ2V0YClcbiAqICAgKiB1cGRhdGUgbWV0aG9kcyAoYGFkZGAsYGluaXRgLGBzZXRgLGBkZWxldGVgLGBhZGRBbGxgKVxuICogICAqIHF1ZXJ5IG1ldGhvZHMgKGBzbmFwc2hvdGAsYGtleXNgLGB2YWx1ZXNgLGBlbnRyaWVzYCxgZ2V0U2l6ZWApXG4gKiAgICogcXVlcnktdXBkYXRlIG1ldGhvZHMgKGBjbGVhcmApXG4gKlxuICogV2Vha1N0b3JlcyBoYXZlIHRoZSBsb29rdXAgYW5kIHVwZGF0ZSBtZXRob2RzIGJ1dCBub3QgdGhlIHF1ZXJ5XG4gKiBvciBxdWVyeS11cGRhdGUgbWV0aG9kcy5cbiAqIE5vbi13ZWFrIFN0b3JlcyBhcmUgbGlrZSB0aGVpciBjb3JyZXNwb25kaW5nIFdlYWtTdG9yZSwgYnV0IHdpdGggdGhlXG4gKiBhZGRpdGlvbmFsIHF1ZXJ5IGFuZCBxdWVyeS11cGRhdGUgbWV0aG9kcy5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBXZWFrU2V0U3RvcmVcbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gYm9vbGVhbn0gaGFzXG4gKiBDaGVjayBpZiBhIGtleSBleGlzdHMuIFRoZSBrZXkgY2FuIGJlIGFueSBKYXZhU2NyaXB0IHZhbHVlLCB0aG91Z2ggdGhlXG4gKiBhbnN3ZXIgd2lsbCBhbHdheXMgYmUgZmFsc2UgZm9yIGtleXMgdGhhdCBjYW5ub3QgYmUgZm91bmQgaW4gdGhpcyBzdG9yZS5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gdm9pZH0gYWRkXG4gKiBBZGQgdGhlIGtleSB0byB0aGUgc2V0IGlmIGl0IGlzIG5vdCBhbHJlYWR5IHRoZXJlLiBEbyBub3RoaW5nIHNpbGVudGx5IGlmXG4gKiBhbHJlYWR5IHRoZXJlLlxuICogVGhlIGtleSBtdXN0IGJlIG9uZSBhbGxvd2VkIGJ5IHRoaXMgc3RvcmUuIEZvciBleGFtcGxlIGEgc2NhbGFyIHN0b3JlIG9ubHlcbiAqIGFsbG93cyBwcmltaXRpdmVzIGFuZCByZW1vdGFibGVzLlxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiB2b2lkfSBkZWxldGVcbiAqIFJlbW92ZSB0aGUga2V5LiBUaHJvd3MgaWYgbm90IGZvdW5kLlxuICogQHByb3BlcnR5IHsoa2V5czogQ29weVNldDxLPiB8IEl0ZXJhYmxlPEs+KSA9PiB2b2lkfSBhZGRBbGxcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTZXRTdG9yZVxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiBib29sZWFufSBoYXNcbiAqIENoZWNrIGlmIGEga2V5IGV4aXN0cy4gVGhlIGtleSBjYW4gYmUgYW55IEphdmFTY3JpcHQgdmFsdWUsIHRob3VnaCB0aGVcbiAqIGFuc3dlciB3aWxsIGFsd2F5cyBiZSBmYWxzZSBmb3Iga2V5cyB0aGF0IGNhbm5vdCBiZSBmb3VuZCBpbiB0aGlzIHN0b3JlLlxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiB2b2lkfSBhZGRcbiAqIEFkZCB0aGUga2V5IHRvIHRoZSBzZXQgaWYgaXQgaXMgbm90IGFscmVhZHkgdGhlcmUuIERvIG5vdGhpbmcgc2lsZW50bHkgaWZcbiAqIGFscmVhZHkgdGhlcmUuXG4gKiBUaGUga2V5IG11c3QgYmUgb25lIGFsbG93ZWQgYnkgdGhpcyBzdG9yZS4gRm9yIGV4YW1wbGUgYSBzY2FsYXIgc3RvcmUgb25seVxuICogYWxsb3dzIHByaW1pdGl2ZXMgYW5kIHJlbW90YWJsZXMuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IHZvaWR9IGRlbGV0ZVxuICogUmVtb3ZlIHRoZSBrZXkuIFRocm93cyBpZiBub3QgZm91bmQuXG4gKiBAcHJvcGVydHkgeyhrZXlzOiBDb3B5U2V0PEs+IHwgSXRlcmFibGU8Sz4pID0+IHZvaWR9IGFkZEFsbFxuICogQHByb3BlcnR5IHsoa2V5UGF0dD86IFBhdHRlcm4pID0+IEl0ZXJhYmxlPEs+fSBrZXlzXG4gKiBAcHJvcGVydHkgeyhrZXlQYXR0PzogUGF0dGVybikgPT4gSXRlcmFibGU8Sz59IHZhbHVlc1xuICogQHByb3BlcnR5IHsoa2V5UGF0dD86IFBhdHRlcm4pID0+IENvcHlTZXQ8Sz59IHNuYXBzaG90XG4gKiBAcHJvcGVydHkgeyhrZXlQYXR0PzogUGF0dGVybikgPT4gbnVtYmVyfSBnZXRTaXplXG4gKiBAcHJvcGVydHkgeyhrZXlQYXR0PzogUGF0dGVybikgPT4gdm9pZH0gY2xlYXJcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFdlYWtNYXBTdG9yZVxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiBib29sZWFufSBoYXNcbiAqIENoZWNrIGlmIGEga2V5IGV4aXN0cy4gVGhlIGtleSBjYW4gYmUgYW55IEphdmFTY3JpcHQgdmFsdWUsIHRob3VnaCB0aGVcbiAqIGFuc3dlciB3aWxsIGFsd2F5cyBiZSBmYWxzZSBmb3Iga2V5cyB0aGF0IGNhbm5vdCBiZSBmb3VuZCBpbiB0aGlzIHN0b3JlLlxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiBWfSBnZXRcbiAqIFJldHVybiBhIHZhbHVlIGZvciB0aGUga2V5LiBUaHJvd3MgaWYgbm90IGZvdW5kLlxuICogQHByb3BlcnR5IHsoa2V5OiBLLCB2YWx1ZTogVikgPT4gdm9pZH0gaW5pdFxuICogSW5pdGlhbGl6ZSB0aGUga2V5IG9ubHkgaWYgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0LlxuICogVGhlIGtleSBtdXN0IGJlIG9uZSBhbGxvd2VkIGJ5IHRoaXMgc3RvcmUuIEZvciBleGFtcGxlIGEgc2NhbGFyIHN0b3JlIG9ubHlcbiAqIGFsbG93cyBwcmltaXRpdmVzIGFuZCByZW1vdGFibGVzLlxuICogQHByb3BlcnR5IHsoa2V5OiBLLCB2YWx1ZTogVikgPT4gdm9pZH0gc2V0XG4gKiBTZXQgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gdm9pZH0gZGVsZXRlXG4gKiBSZW1vdmUgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGVudHJpZXM6IENvcHlNYXA8SyxWPiB8IEl0ZXJhYmxlPFtLLFZdPikgPT4gdm9pZH0gYWRkQWxsXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBNYXBTdG9yZVxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiBib29sZWFufSBoYXNcbiAqIENoZWNrIGlmIGEga2V5IGV4aXN0cy4gVGhlIGtleSBjYW4gYmUgYW55IEphdmFTY3JpcHQgdmFsdWUsIHRob3VnaCB0aGVcbiAqIGFuc3dlciB3aWxsIGFsd2F5cyBiZSBmYWxzZSBmb3Iga2V5cyB0aGF0IGNhbm5vdCBiZSBmb3VuZCBpbiB0aGlzIG1hcFxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiBWfSBnZXRcbiAqIFJldHVybiBhIHZhbHVlIGZvciB0aGUga2V5LiBUaHJvd3MgaWYgbm90IGZvdW5kLlxuICogQHByb3BlcnR5IHsoa2V5OiBLLCB2YWx1ZTogVikgPT4gdm9pZH0gaW5pdFxuICogSW5pdGlhbGl6ZSB0aGUga2V5IG9ubHkgaWYgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0LlxuICogVGhlIGtleSBtdXN0IGJlIG9uZSBhbGxvd2VkIGJ5IHRoaXMgc3RvcmUuIEZvciBleGFtcGxlIGEgc2NhbGFyIHN0b3JlIG9ubHlcbiAqIGFsbG93cyBwcmltaXRpdmVzIGFuZCByZW1vdGFibGVzLlxuICogQHByb3BlcnR5IHsoa2V5OiBLLCB2YWx1ZTogVikgPT4gdm9pZH0gc2V0XG4gKiBTZXQgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gdm9pZH0gZGVsZXRlXG4gKiBSZW1vdmUgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGVudHJpZXM6IENvcHlNYXA8SyxWPiB8IEl0ZXJhYmxlPFtLLFZdPikgPT4gdm9pZH0gYWRkQWxsXG4gKiBAcHJvcGVydHkgeyhrZXlQYXR0PzogUGF0dGVybiwgdmFsdWVQYXR0PzogUGF0dGVybikgPT4gSXRlcmFibGU8Sz59IGtleXNcbiAqIEBwcm9wZXJ0eSB7KGtleVBhdHQ/OiBQYXR0ZXJuLCB2YWx1ZVBhdHQ/OiBQYXR0ZXJuKSA9PiBJdGVyYWJsZTxWPn0gdmFsdWVzXG4gKiBAcHJvcGVydHkgeyhcbiAqICAga2V5UGF0dD86IFBhdHRlcm4sXG4gKiAgIHZhbHVlUGF0dD86IFBhdHRlcm5cbiAqICkgPT4gSXRlcmFibGU8W0ssVl0+fSBlbnRyaWVzXG4gKiBAcHJvcGVydHkgeyhrZXlQYXR0PzogUGF0dGVybiwgdmFsdWVQYXR0PzogUGF0dGVybikgPT4gQ29weU1hcDxLLFY+fSBzbmFwc2hvdFxuICogQHByb3BlcnR5IHsoa2V5UGF0dD86IFBhdHRlcm4sIHZhbHVlUGF0dD86IFBhdHRlcm4pID0+IG51bWJlcn0gZ2V0U2l6ZVxuICogQHByb3BlcnR5IHsoa2V5UGF0dD86IFBhdHRlcm4sIHZhbHVlUGF0dD86IFBhdHRlcm4pID0+IHZvaWR9IGNsZWFyXG4gKi9cblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBEZXByZWNhdGVkIExlZ2FjeSAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEB0eXBlZGVmIHtXZWFrTWFwU3RvcmU8SyxWPn0gV2Vha1N0b3JlXG4gKiBEZXByZWNhdGVkIHR5cGUgbmFtZSBgV2Vha1N0b3JlYC4gVXNlIGBXZWFrTWFwU3RvcmVgIGluc3RlYWQuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAdHlwZWRlZiB7TWFwU3RvcmU8SyxWPn0gU3RvcmVcbiAqIERlcHJlY2F0ZWQgdHlwZSBuYW1lIGBTdG9yZWAuIFVzZSBgTWFwU3RvcmVgIGluc3RlYWQuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBMZWdhY3lXZWFrTWFwXG4gKiBMZWdhY3lXZWFrTWFwIGlzIGRlcHJlY2F0ZWQuIFVzZSBXZWFrTWFwU3RvcmUgaW5zdGVhZC5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gYm9vbGVhbn0gaGFzXG4gKiBDaGVjayBpZiBhIGtleSBleGlzdHNcbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gVn0gZ2V0XG4gKiBSZXR1cm4gYSB2YWx1ZSBmb3IgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSywgdmFsdWU6IFYpID0+IHZvaWR9IGluaXRcbiAqIEluaXRpYWxpemUgdGhlIGtleSBvbmx5IGlmIGl0XG4gKiBkb2Vzbid0IGFscmVhZHkgZXhpc3RcbiAqIEBwcm9wZXJ0eSB7KGtleTogSywgdmFsdWU6IFYpID0+IHZvaWR9IHNldFxuICogU2V0IHRoZSBrZXkuIFRocm93cyBpZiBub3QgZm91bmQuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IHZvaWR9IGRlbGV0ZVxuICogUmVtb3ZlIHRoZSBrZXkuIFRocm93cyBpZiBub3QgZm91bmQuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBMZWdhY3lNYXBcbiAqIExlZ2FjeVdlYWtNYXAgaXMgZGVwcmVjYXRlZC4gVXNlIFdlYWtNYXBTdG9yZSBpbnN0ZWFkLlxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiBib29sZWFufSBoYXNcbiAqIENoZWNrIGlmIGEga2V5IGV4aXN0c1xuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiBWfSBnZXRcbiAqIFJldHVybiBhIHZhbHVlIGZvciB0aGUga2V5LiBUaHJvd3MgaWYgbm90IGZvdW5kLlxuICogQHByb3BlcnR5IHsoa2V5OiBLLCB2YWx1ZTogVikgPT4gdm9pZH0gaW5pdFxuICogSW5pdGlhbGl6ZSB0aGUga2V5IG9ubHkgaWYgaXRcbiAqIGRvZXNuJ3QgYWxyZWFkeSBleGlzdFxuICogQHByb3BlcnR5IHsoa2V5OiBLLCB2YWx1ZTogVikgPT4gdm9pZH0gc2V0XG4gKiBTZXQgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gdm9pZH0gZGVsZXRlXG4gKiBSZW1vdmUgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gSXRlcmFibGU8Sz59IGtleXNcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gSXRlcmFibGU8Vj59IHZhbHVlc1xuICogQHByb3BlcnR5IHsoKSA9PiBJdGVyYWJsZTxbSyxWXT59IGVudHJpZXNcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gbnVtYmVyfSBnZXRTaXplXG4gKiBAcHJvcGVydHkgeygpID0+IHZvaWR9IGNsZWFyXG4gKi9cblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKipcbiAqIEB0eXBlZGVmIHstMSB8IDAgfCAxfSBSYW5rQ29tcGFyaXNvblxuICogVGhlIHJlc3VsdCBvZiBhIGBSYW5rQ29tcGFyZWAgZnVuY3Rpb24gdGhhdCBkZWZpbmVzIGEgcmFuay1vcmRlciwgaS5lLixcbiAqIGEgdG90YWwgcHJlb3JkZXIgaW4gd2hpY2ggZGlmZmVyZW50IGVsZW1lbnRzIGFyZSBhbHdheXMgY29tcGFyYWJsZSBidXRcbiAqIGNhbiBiZSB0aWVkIGZvciB0aGUgc2FtZSByYW5rLiBTZWUgYFJhbmtDb21wYXJlYC5cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBSYW5rQ29tcGFyZVxuICogUmV0dXJucyBgLTFgLCBgMGAsIG9yIGAxYCBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgcmFuayBvZiBgbGVmdGBcbiAqIGlzIGJlZm9yZSwgdGllZC13aXRoLCBvciBhZnRlciB0aGUgcmFuayBvZiBgcmlnaHRgLlxuICpcbiAqIFRoaXMgY29tcGFyaXNvbiBmdW5jdGlvbiBpcyB2YWxpZCBhcyBhcmd1bWVudCB0b1xuICogYEFycmF5LnByb3RvdHlwZS5zb3J0YC4gVGhpcyBpcyBzb21ldGltZXMgZGVzY3JpYmVkIGFzIGEgXCJ0b3RhbCBvcmRlclwiXG4gKiBidXQsIGRlcGVuZGluZyBvbiB5b3VyIGRlZmluaXRpb25zLCB0aGlzIGlzIHRlY2huaWNhbGx5IGluY29ycmVjdCBiZWNhdXNlXG4gKiBpdCBtYXkgcmV0dXJuIGAwYCB0byBpbmRpY2F0ZSB0aGF0IHR3byBkaXN0aW5ndWlzaGFibGUgZWxlbWVudHMgc3VjaCBhc1xuICogYC0wYCBhbmQgYDBgIGFyZSB0aWVkIChpLmUuLCBhcmUgaW4gdGhlIHNhbWUgZXF1aXZhbGVuY2UgY2xhc3NcbiAqIGZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBvcmRlcmluZykuIElmIGVhY2ggc3VjaCBlcXVpdmFsZW5jZSBjbGFzcyBpc1xuICogYSAqcmFuayogYW5kIHJhbmtzIGFyZSBkaXNqb2ludCwgdGhlbiB0aGlzIFwicmFuayBvcmRlclwiIGlzIGFcbiAqIHRydWUgdG90YWwgb3JkZXIgb3ZlciB0aGVzZSByYW5rcy4gSW4gbWF0aGVtYXRpY3MgdGhpcyBnb2VzIGJ5IHNldmVyYWxcbiAqIG90aGVyIG5hbWVzIHN1Y2ggYXMgXCJ0b3RhbCBwcmVvcmRlclwiLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gZXN0YWJsaXNoZXMgYSB0b3RhbCByYW5rIG9yZGVyIG92ZXIgYWxsIHBhc3NhYmxlcy5cbiAqIFRvIGRvIHNvIGl0IG1ha2VzIGFyYml0cmFyeSBjaG9pY2VzLCBzdWNoIGFzIHRoYXQgYWxsIHN0cmluZ3NcbiAqIGFyZSBhZnRlciBhbGwgbnVtYmVycy4gVGh1cywgdGhpcyBvcmRlciBpcyBub3QgaW50ZW5kZWQgdG8gYmVcbiAqIHVzZWQgZGlyZWN0bHkgYXMgYSBjb21wYXJpc29uIHdpdGggdXNlZnVsIHNlbWFudGljcy4gSG93ZXZlciwgaXQgbXVzdCBiZVxuICogY2xvc2VseSBlbm91Z2ggcmVsYXRlZCB0byBzdWNoIGNvbXBhcmlzb25zIHRvIGFpZCBpbiBpbXBsZW1lbnRpbmdcbiAqIGxvb2t1cHMgYmFzZWQgb24gdGhvc2UgY29tcGFyaXNvbnMuIEZvciBleGFtcGxlLCBpbiBvcmRlciB0byBnZXQgYSB0b3RhbFxuICogb3JkZXIgYW1vbmcgcmFua3MsIHdlIHB1dCBgTmFOYCBhZnRlciBhbGwgb3RoZXIgSmF2YVNjcmlwdCBcIm51bWJlclwiIHZhbHVlc1xuICogKGkuZS4sIElFRUUgNzU0IGZsb2F0aW5nLXBvaW50IHZhbHVlcykuIEJ1dCBvdGhlcndpc2UsIHdlIHJhbmsgSmF2YVNjcmlwdFxuICogbnVtYmVycyBieSBzaWduZWQgbWFnbml0dWRlLCB3aXRoIGAwYCBhbmQgYC0wYCB0aWVkLiBBIHNlbWFudGljYWxseSB1c2VmdWxcbiAqIG9yZGVyaW5nIHdvdWxkIGFsc28gY29tcGFyZSBtYWduaXR1ZGVzLCBhbmQgc28gYWdyZWUgd2l0aCB0aGUgcmFuayBvcmRlcmluZ1xuICogb2YgYWxsIHZhbHVlcyBvdGhlciB0aGFuIGBOYU5gLiBBbiBhcnJheSBzb3J0ZWQgYnkgcmFuayB3b3VsZCBlbmFibGUgcmFuZ2VcbiAqIHF1ZXJpZXMgYnkgbWFnbml0dWRlLlxuICogQHBhcmFtIHtQYXNzYWJsZX0gbGVmdFxuICogQHBhcmFtIHtQYXNzYWJsZX0gcmlnaHRcbiAqIEByZXR1cm5zIHtSYW5rQ29tcGFyaXNvbn1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSYW5rQ29tcGFyZX0gRnVsbENvbXBhcmVcbiAqIEEgYEZ1bGxDb21wYXJlYCBmdW5jdGlvbiBzYXRpc2ZpZXMgYWxsIHRoZSBpbnZhcmlhbnRzIHN0YXRlZCBiZWxvdyBmb3JcbiAqIGBSYW5rQ29tcGFyZWAncyByZWxhdGlvbiB3aXRoIEtleUNvbXBhcmUuXG4gKiBJbiBhZGRpdGlvbiwgaXRzIGVxdWFsaXR5IGlzIGFzIHByZWNpc2UgYXMgdGhlIGBLZXlDb21wYXJlYFxuICogY29tcGFyaXNvbiBkZWZpbmVkIGJlbG93LCBpbiB0aGF0LCBmb3IgYWxsIEtleXMgYHhgIGFuZCBgeWAsXG4gKiBgRnVsbENvbXBhcmUoeCwgeSkgPT09IDBgIGlmZiBgS2V5Q29tcGFyZSh4LCB5KSA9PT0gMGAuXG4gKlxuICogRm9yIG5vbi1rZXlzIGEgYEZ1bGxDb21wYXJlYCBzaG91bGQgYmUgZXhhY3RseSBhcyBpbXByZWNpc2UgYXNcbiAqIGBSYW5rQ29tcGFyZWAuIEZvciBleGFtcGxlLCBib3RoIHdpbGwgdHJlYXQgYWxsIGVycm9ycyBhcyBpbiB0aGUgc2FtZVxuICogZXF1aXZhbGVuY2UgY2xhc3MuIEJvdGggd2lsbCB0cmVhdCBhbGwgcHJvbWlzZXMgYXMgaW4gdGhlIHNhbWVcbiAqIGVxdWl2YWxlbmNlIGNsYXNzLiBCb3RoIHdpbGwgb3JkZXIgdGFnZ2VkcyB0aGUgc2FtZSB3YXksIHdoaWNoIGlzIGFkbWl0dGVkbHlcbiAqIHdlaXJkLCBhcyBzb21lIHRhZ2dlZHMgd2lsbCBiZSBjb25zaWRlcmVkIGtleXMgYW5kIG90aGVyIHRhZ2dlZHMgd2lsbCBiZVxuICogY29uc2lkZXJlZCBub24ta2V5cy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFJhbmtDb21wYXJhdG9yS2l0XG4gKiBAcHJvcGVydHkge1JhbmtDb21wYXJlfSBjb21wYXJhdG9yXG4gKiBAcHJvcGVydHkge1JhbmtDb21wYXJlfSBhbnRpQ29tcGFyYXRvclxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRnVsbENvbXBhcmF0b3JLaXRcbiAqIEBwcm9wZXJ0eSB7RnVsbENvbXBhcmV9IGNvbXBhcmF0b3JcbiAqIEBwcm9wZXJ0eSB7RnVsbENvbXBhcmV9IGFudGlDb21wYXJhdG9yXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7LTEgfCAwIHwgMSB8IE5hTn0gS2V5Q29tcGFyaXNvblxuICogVGhlIHJlc3VsdCBvZiBhIGBLZXlDb21wYXJlYCBmdW5jdGlvbiB0aGF0IGRlZmluZXMgYSBtZWFuaW5nZnVsXG4gKiBhbmQgbWVhbmluZ2Z1bGx5IHByZWNpc2UgcGFydGlhbCBvcmRlciBvZiBgS2V5YCB2YWx1ZXMuIFNlZSBgS2V5Q29tcGFyZWAuXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgS2V5Q29tcGFyZVxuICogYGNvbXBhcmVLZXlzYCBpbXBsZW1lbnRzIGEgcGFydGlhbCBvcmRlciBvdmVyIGtleXMuIEFzIHdpdGggdGhlXG4gKiByYW5rIG9yZGVyaW5nIHByb2R1Y2VkIGJ5IGBjb21wYXJlUmFua2AsIC0xLCAwLCBhbmQgMSBtZWFuXG4gKiBcImxlc3MgdGhhblwiLCBcImVxdWl2YWxlbnQgdG9cIiwgYW5kIFwiZ3JlYXRlciB0aGFuXCIgcmVzcGVjdGl2ZWx5LlxuICogTmFOIG1lYW5zIFwiaW5jb21wYXJhYmxlXCIgLS0tIHRoZSBmaXJzdCBrZXkgaXMgbm90IGxlc3MsIGVxdWl2YWxlbnQsXG4gKiBvciBncmVhdGVyIHRoYW4gdGhlIHNlY29uZC4gRm9yIGV4YW1wbGUsIHN1YnNldHMgb3ZlciBzZXRzIGlzXG4gKiBhIHBhcnRpYWwgb3JkZXIuXG4gKlxuICogQnkgdXNpbmcgTmFOIGZvciBcImluY29tcGFyYWJsZVwiLCB0aGUgbm9ybWFsIGVxdWl2YWxlbmNlIGZvciB1c2luZ1xuICogdGhlIHJldHVybiB2YWx1ZSBpbiBhIGNvbXBhcmlzb24gaXMgcHJlc2VydmVkLlxuICogYGNvbXBhcmVLZXlzKGxlZnQsIHJpZ2h0KSA+PSAwYCBpZmYgYGxlZnRgIGlzIGdyZWF0ZXIgdGhhbiBvclxuICogZXF1aXZhbGVudCB0byBgcmlnaHRgIGluIHRoZSBwYXJ0aWFsIG9yZGVyaW5nLlxuICpcbiAqIEtleSBvcmRlciAoYSBwYXJ0aWFsIG9yZGVyKSBhbmQgcmFuayBvcmRlciAoYSB0b3RhbCBwcmVvcmRlcikgYXJlXG4gKiBjby1kZXNpZ25lZCBzbyB0aGF0IHdlIHN0b3JlIHBhc3NhYmxlcyBpbiByYW5rIG9yZGVyIGFuZCBpbmRleCBpbnRvIHRoZW1cbiAqIHdpdGgga2V5cyBmb3Iga2V5LWJhc2VkIHF1ZXJpZXMuIFRvIGtlZXAgdGhlc2UgZGlzdGluY3QsIHdoZW4gc3BlYWtpbmdcbiAqIGluZm9ybWFsbHkgYWJvdXQgcmFuaywgd2UgdGFsayBhYm91dCBcImVhcmxpZXJcIiBhbmQgXCJsYXRlclwiLiBXaGVuIHNwZWFraW5nXG4gKiBpbmZvcm1hbGx5IGFib3V0IGtleXMsIHdlIHRhbGsgYWJvdXQgXCJzbWFsbGVyXCIgYW5kIFwiYmlnZ2VyXCIuXG4gKlxuICogSW4gYm90aCBvcmRlcnMsIHRoZSByZXR1cm4tMCBjYXNlIGRlZmluZXNcbiAqIGFuIGVxdWl2YWxlbmNlIGNsYXNzLCBpLmUuLCB0aG9zZSB0aGF0IGFyZSB0aWVkIGZvciB0aGUgc2FtZSBwbGFjZSBpbiB0aGVcbiAqIG9yZGVyLiBUaGUgZ2xvYmFsIGludmFyaWFudCB0aGF0IHdlIG5lZWQgYmV0d2VlbiB0aGUgdHdvIG9yZGVycyBpcyB0aGF0IHRoZVxuICoga2V5IG9yZGVyIGVxdWl2YWxlbmNlIGNsYXNzIGlzIGFsd2F5cyBhdCBsZWFzdCBhcyBwcmVjaXNlIGFzIHRoZVxuICogcmFuayBvcmRlciBlcXVpdmFsZW5jZSBjbGFzcy4gSU9XLCBpZiBgY29tcGFyZUtleXMoWCxZKSA9PT0gMGAgdGhlblxuICogYGNvbXBhcmVSYW5rKFgsWSkgPT09IDBgLiBCdXQgbm90IHZpY2UgdmVyc2EuIEZvciBleGFtcGxlLCB0d28gZGlmZmVyZW50XG4gKiByZW1vdGFibGVzIGFyZSB0aGUgc2FtZSByYW5rIGJ1dCBpbmNvbXBhcmFibGUgYXMga2V5cy5cbiAqXG4gKiBBIGZ1cnRoZXIgaW52YXJpYW50IGlzIGlmIGBjb21wYXJlS2V5cyhYLFkpIDwgMGAgdGhlblxuICogYGNvbXBhcmVSYW5rKFgsWSkgPCAwYCwgaS5lLiwgaWYgWCBpcyBzbWFsbGVyIHRoYW4gWSBpbiBrZXkgb3JkZXIsIHRoZW4gWFxuICogbXVzdCBiZSBlYXJsaWVyIHRoYW4gWSBpbiByYW5rIG9yZGVyLiBCdXQgbm90IHZpY2UgdmVyc2EuXG4gKiBYIGNhbiBiZSBlcXVpdmFsZW50IHRvIG9yIGVhcmxpZXIgdGhhbiBZIGluIHJhbmsgb3JkZXIgYW5kIHN0aWxsIGJlXG4gKiBpbmNvbXBhcmFibGUgd2l0aCBZIGluIGtleSBvcmRlci4gRm9yIGV4YW1wbGUsIHRoZSByZWNvcmQgYHtiOiAzLCBhOiA1fWAgaXNcbiAqIGVhcmxpZXIgdGhhbiB0aGUgcmVjb3JkIGB7YjogNSwgYTogM31gIGluIHJhbmsgb3JkZXIgYnV0IHRoZXkgYXJlXG4gKiBpbmNvbXBhcmFibGUgYXMga2V5cy4gQW5kIHR3byBkaXN0aW5jdCByZW1vdGFibGVzIHN1Y2ggYXMgYEZhcignWCcsIHt9KWAgYW5kXG4gKiBgRmFyKCdZJywge30pYCBhcmUgZXF1aXZhbGVudCBpbiByYW5rIG9yZGVyIGJ1dCBpbmNvbXBhcmFibGUgYXMga2V5cy5cbiAqXG4gKiBUaGlzIGxldHMgdXMgdHJhbnNsYXRlIGEgcmFuZ2Ugc2VhcmNoIG92ZXIgdGhlXG4gKiBwYXJ0aWFsIGtleSBvcmRlciBpbnRvIGEgcmFuZ2Ugc2VhcmNoIG92ZXIgcmFuayBvcmRlciBmb2xsb3dlZCBieSBmaWx0ZXJpbmdcbiAqIG91dCB0aG9zZSB0aGF0IGRvbid0IG1hdGNoLiBUbyBnZXQgdGhpcyBlZmZlY3QsIHdlIHN0b3JlIHRoZSBlbGVtZW50cyBvZlxuICogYSBzZXQgaW4gYW4gYXJyYXkgc29ydGVkIGluIHJldmVyc2UgcmFuayBvcmRlciwgZnJvbSBsYXRlciB0byBlYXJsaWVyLlxuICogQ29tYmluZWQgd2l0aCBvdXIgbGV4aWNvZ3JhcGhpYyBjb21wYXJpc29uIG9mIGFycmF5cywgaWYgc2V0IFggaXMgYSBzdWJzZXRcbiAqIG9mIHNldCBZIHRoZW4gdGhlIGFycmF5IHJlcHJlc2VudGluZyBzZXQgWCB3aWxsIGJlIGFuIGVhcmxpZXIgcmFuayB0aGF0IHRoZVxuICogYXJyYXkgcmVwcmVzZW50aW5nIHNldCBZLlxuICpcbiAqIEBwYXJhbSB7S2V5fSBsZWZ0XG4gKiBAcGFyYW0ge0tleX0gcmlnaHRcbiAqIEByZXR1cm5zIHtLZXlDb21wYXJpc29ufVxuICovXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLyBTaG91bGQgYmUgaW50ZXJuYWwgb25seSB0eXBlcyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7W3N0cmluZywgc3RyaW5nXX0gUmFua0NvdmVyXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7W251bWJlciwgbnVtYmVyXX0gSW5kZXhDb3ZlclxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEdldFBhc3NTdHlsZUNvdmVyXG4gKiBBc3NvY2lhdGUgd2l0aCBlYWNoIHBhc3NTdHlsZSBhIFJhbmtDb3ZlciB0aGF0IG1heSBiZSBhbiBvdmVyZXN0aW1hdGUsXG4gKiBhbmQgd2hvc2UgcmVzdWx0cyB0aGVyZWZvcmUgbmVlZCB0byBiZSBmaWx0ZXJlZCBkb3duLiBGb3IgZXhhbXBsZSwgYmVjYXVzZVxuICogdGhlcmUgaXMgbm90IGEgc21hbGxlc3Qgb3IgYmlnZ2VzdCBiaWdpbnQsIGJvdW5kIGl0IGJ5IGBOYU5gICh0aGUgbGFzdCBwbGFjZVxuICogbnVtYmVyKSBhbmQgYCcnYCAodGhlIGVtcHR5IHN0cmluZywgd2hpY2ggaXMgdGhlIGZpcnN0IHBsYWNlIHN0cmluZykuIFRodXMsXG4gKiBhIHJhbmdlIHF1ZXJ5IHVzaW5nIHRoaXMgcmFuZ2UgbWF5IGluY2x1ZGUgdGhlc2UgdmFsdWVzLCB3aGljaCB3b3VsZCB0aGVuXG4gKiBuZWVkIHRvIGJlIGZpbHRlcmVkIG91dC5cbiAqIEBwYXJhbSB7UGFzc1N0eWxlfSBwYXNzU3R5bGVcbiAqIEByZXR1cm5zIHtSYW5rQ292ZXJ9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgR2V0SW5kZXhDb3ZlclxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBzb3J0ZWRcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEBwYXJhbSB7UmFua0NvdmVyfSByYW5rQ292ZXJcbiAqIEByZXR1cm5zIHtJbmRleENvdmVyfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIENvdmVyZWRFbnRyaWVzXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IHNvcnRlZFxuICogQHBhcmFtIHtJbmRleENvdmVyfSBpbmRleENvdmVyXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8W251bWJlciwgUGFzc2FibGVdPn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBDaGVja1BhdHRlcm5cbiAqIEBwYXJhbSB7UGFzc2FibGV9IGFsbGVnZWRQYXR0ZXJuXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBDaGVja0tleVBhdHRlcm5cbiAqIEBwYXJhbSB7UGFzc2FibGV9IGFsbGVnZWRQYXR0ZXJuXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBLZXlUb0RCS2V5XG4gKiBJZiB0aGlzIGtleSBjYW4gYmUgZW5jb2RlZCBhcyBhIERCS2V5IHN0cmluZyB3aGljaCBzb3J0cyBjb3JyZWN0bHksXG4gKiByZXR1cm4gdGhhdCBzdHJpbmcuIEVsc2UgcmV0dXJuIGB1bmRlZmluZWRgLiBGb3IgZXhhbXBsZSwgYSBzY2FsYXItb25seVxuICogZW5jb2RlUGFzc2FibGUgd291bGQgcmV0dXJuIGB1bmRlZmluZWRgIGZvciBhbGwgbm9uLXNjYWxhciBrZXlzLlxuICogQHBhcmFtIHtQYXNzYWJsZX0ga2V5XG4gKiBAcmV0dXJucyB7c3RyaW5nPX1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBHZXRSYW5rQ292ZXJcbiAqIEBwYXJhbSB7UGF0dGVybn0gcGF0dGVyblxuICogQHBhcmFtIHtLZXlUb0RCS2V5fSBlbmNvZGVQYXNzYWJsZVxuICogQHJldHVybnMge1JhbmtDb3Zlcn1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEFsbExpbWl0c1xuICogQHByb3BlcnR5IHtudW1iZXJ9IGRlY2ltYWxEaWdpdHNMaW1pdFxuICogQHByb3BlcnR5IHtudW1iZXJ9IHN0cmluZ0xlbmd0aExpbWl0XG4gKiBAcHJvcGVydHkge251bWJlcn0gc3ltYm9sTmFtZUxlbmd0aExpbWl0XG4gKiBAcHJvcGVydHkge251bWJlcn0gbnVtUHJvcGVydGllc0xpbWl0XG4gKiBAcHJvcGVydHkge251bWJlcn0gcHJvcGVydHlOYW1lTGVuZ3RoTGltaXRcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBhcnJheUxlbmd0aExpbWl0XG4gKiBAcHJvcGVydHkge251bWJlcn0gbnVtU2V0RWxlbWVudHNMaW1pdFxuICogQHByb3BlcnR5IHtudW1iZXJ9IG51bVVuaXF1ZUJhZ0VsZW1lbnRzTGltaXRcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBudW1NYXBFbnRyaWVzTGltaXRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtQYXJ0aWFsPEFsbExpbWl0cz59IExpbWl0c1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gTWF0Y2hlck5hbWVzcGFjZVxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gTWF0Y2hlcn0gYW55XG4gKiBNYXRjaGVzIGFueSBwYXNzYWJsZS5cbiAqXG4gKiBAcHJvcGVydHkgeyguLi5wYXR0czogUGF0dGVybltdKSA9PiBNYXRjaGVyfSBhbmRcbiAqIE1hdGNoZXMgYWdhaW5zdCB0aGUgaW50ZXJzZWN0aW9uIG9mIGFsbCBzdWItcGF0dGVybnMuXG4gKlxuICogQHByb3BlcnR5IHsoLi4ucGF0dHM6IFBhdHRlcm5bXSkgPT4gTWF0Y2hlcn0gb3JcbiAqIE1hdGNoZXMgYWdhaW5zdCB0aGUgdW5pb24gb2YgYWxsIHN1Yi1wYXR0ZXJuc1xuICogKHJlcXVpcmluZyBhIG1hdGNoIGFnYWluc3QgYXQgbGVhc3Qgb25lKS5cbiAqXG4gKiBAcHJvcGVydHkgeyhzdWJQYXR0OiBQYXR0ZXJuKSA9PiBNYXRjaGVyfSBub3RcbiAqIE1hdGNoZXMgYWdhaW5zdCB0aGUgbmVnYXRpb24gb2YgdGhlIHN1Yi1wYXR0ZXJuLlxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gTWF0Y2hlcn0gc2NhbGFyXG4gKiBNYXRjaGVzIGEgcHJpbWl0aXZlIHZhbHVlIG9yIFJlbW90YWJsZS5cbiAqIEFsbCBzY2FsYXJzIGFyZSBrZXlzLlxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gTWF0Y2hlcn0ga2V5XG4gKiBNYXRjaGVzIGFueSB2YWx1ZSB0aGF0IGNhbiBiZSBhIGtleSBpbiBhIENvcHlNYXBcbiAqIG9yIGEgdmFsdWUgaW4gYSBDb3B5U2V0IG9yIENvcHlCYWcuXG4gKiBBbGwga2V5cyBhcmUgYWxzbyB2YWxpZCBQYXR0ZXJucyB0aGF0IG1hdGNoIG9ubHkgdGhlbXNlbHZlcy5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IE1hdGNoZXJ9IHBhdHRlcm5cbiAqIE1hdGNoZXMgYW55IFBhdHRlcm4gdGhhdCBjYW4gYmUgdXNlZCB0byBjaGFyYWN0ZXJpemUgcGFzc2FibGVzLlxuICogQSBwYXR0ZXJuIGNhbm5vdCBjb250YWluIGVycm9ycyBvciBwcm9taXNlcyxcbiAqIGFzIHRoZXNlIGFyZSBub3Qgc3RhYmxlIGVub3VnaCB0byB1c2VmdWxseSBtYXRjaC5cbiAqXG4gKiBAcHJvcGVydHkgeyhraW5kOiBzdHJpbmcpID0+IE1hdGNoZXJ9IGtpbmRcbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IE1hdGNoZXJ9IGJvb2xlYW5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IE1hdGNoZXJ9IG51bWJlclxuICogTWF0Y2hlcyBhbnkgZmxvYXRpbmcgcG9pbnQgbnVtYmVyLlxuICpcbiAqIEBwcm9wZXJ0eSB7KGxpbWl0cz86IExpbWl0cykgPT4gTWF0Y2hlcn0gYmlnaW50XG4gKlxuICogQHByb3BlcnR5IHsobGltaXRzPzogTGltaXRzKSA9PiBNYXRjaGVyfSBuYXRcbiAqIE1hdGNoZXMgYW55IG5vbi1uZWdhdGl2ZSBiaWdpbnQgb3JcbiAqIFwic2FmZVwiIChubyBncmVhdGVyIHRoYW4gMioqNTMgLSAxKSBub24tbmVnYXRpdmUgaW50ZWdyYWwgbnVtYmVyLFxuICogc3ViamVjdCB0byBsaW1pdHMuXG4gKlxuICogQHByb3BlcnR5IHsobGltaXRzPzogTGltaXRzKSA9PiBNYXRjaGVyfSBzdHJpbmdcbiAqXG4gKiBAcHJvcGVydHkgeyhsaW1pdHM/OiBMaW1pdHMpID0+IE1hdGNoZXJ9IHN5bWJvbFxuICogTWF0Y2hlcyBhbnkgcmVnaXN0ZXJlZCBvciB3ZWxsLWtub3duIHN5bWJvbCxcbiAqIHN1YmplY3QgdG8gbGltaXRzLlxuICpcbiAqIEBwcm9wZXJ0eSB7KGxpbWl0cz86IExpbWl0cykgPT4gTWF0Y2hlcn0gcmVjb3JkXG4gKiBNYXRjaGVzIGFueSBDb3B5UmVjb3JkLCBzdWJqZWN0IHRvIGxpbWl0cy5cbiAqXG4gKiBAcHJvcGVydHkgeyhsaW1pdHM/OiBMaW1pdHMpID0+IE1hdGNoZXJ9IGFycmF5XG4gKiBNYXRjaGVzIGFueSBDb3B5QXJyYXksIHN1YmplY3QgdG8gbGltaXRzLlxuICpcbiAqIEBwcm9wZXJ0eSB7KGxpbWl0cz86IExpbWl0cykgPT4gTWF0Y2hlcn0gc2V0XG4gKiBNYXRjaGVzIGFueSBDb3B5U2V0LCBzdWJqZWN0IHRvIGxpbWl0cy5cbiAqXG4gKiBAcHJvcGVydHkgeyhsaW1pdHM/OiBMaW1pdHMpID0+IE1hdGNoZXJ9IGJhZ1xuICogTWF0Y2hlcyBhbnkgQ29weUJhZywgc3ViamVjdCB0byBsaW1pdHMuXG4gKlxuICogQHByb3BlcnR5IHsobGltaXRzPzogTGltaXRzKSA9PiBNYXRjaGVyfSBtYXBcbiAqIE1hdGNoZXMgYW55IENvcHlNYXAsIHN1YmplY3QgdG8gbGltaXRzLlxuICpcbiAqIEBwcm9wZXJ0eSB7KGxhYmVsPzogc3RyaW5nKSA9PiBNYXRjaGVyfSByZW1vdGFibGVcbiAqIE1hdGNoZXMgYSBmYXIgb2JqZWN0IG9yIGl0cyByZW1vdGUgcHJlc2VuY2UuXG4gKiBUaGUgb3B0aW9uYWwgYGxhYmVsYCBpcyBwdXJlbHkgZm9yIGRpYWdub3N0aWMgcHVycG9zZXMgYW5kIGRvZXMgbm90XG4gKiBhZGQgYW55IGNvbnN0cmFpbnRzLlxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gTWF0Y2hlcn0gZXJyb3JcbiAqIE1hdGNoZXMgYW55IGVycm9yIG9iamVjdC5cbiAqIEVycm9yIG9iamVjdHMgYXJlIHBhc3NhYmxlLCBidXQgYXJlIG5laXRoZXIga2V5cyBub3Igc3ltYm9scy5cbiAqIFRoZXkgZG8gbm90IGhhdmUgYSB1c2VmdWwgaWRlbnRpdHkuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBNYXRjaGVyfSBwcm9taXNlXG4gKiBNYXRjaGVzIGFueSBwcm9taXNlIG9iamVjdC5cbiAqIFByb21pc2VzIGFyZSBwYXNzYWJsZSwgYnV0IGFyZSBuZWl0aGVyIGtleXMgbm9yIHN5bWJvbHMuXG4gKiBUaGV5IGRvIG5vdCBoYXZlIGEgdXNlZnVsIGlkZW50aXR5LlxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gTWF0Y2hlcn0gdW5kZWZpbmVkXG4gKiBNYXRjaGVzIHRoZSBleGFjdCB2YWx1ZSBgdW5kZWZpbmVkYC5cbiAqIEFsbCBrZXlzIGluY2x1ZGluZyBgdW5kZWZpbmVkYCBhcmUgYWxyZWFkeSB2YWxpZCBwYXR0ZXJucyBhbmRcbiAqIHNvIGNhbiB2YWxpZGx5IHJlcHJlc2VudCB0aGVtc2VsdmVzLlxuICogQnV0IG9wdGlvbmFsIHBhdHRlcm4gYXJndW1lbnRzIGAocGF0dGVybiA9IHVuZGVmaW5lZCkgPT4gLi4uYFxuICogY2Fubm90IGRpc3Rpbmd1aXNoIGJldHdlZW4gYHVuZGVmaW5lZGAgcGFzc2VkIGFzIGEgcGF0dGVybiB2cy5cbiAqIG9taXNzaW9uIG9mIHRoZSBhcmd1bWVudCwgYW5kIGludGVycHJldCB0aGUgZm9ybWVyIGFzIHRoZSBsYXR0ZXIuXG4gKiBUaHVzLCB3aGVuIGEgcGFzc2VkIHBhdHRlcm4gZG9lcyBub3QgYWxzbyBuZWVkIHRvIGJlIGEga2V5LFxuICogd2UgcmVjb21tZW5kIHBhc3NpbmcgYE0udW5kZWZpbmVkKClgIGluc3RlYWQgb2YgYHVuZGVmaW5lZGAuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBudWxsfSBudWxsXG4gKlxuICogQHByb3BlcnR5IHsocmlnaHRPcGVyYW5kIDpLZXkpID0+IE1hdGNoZXJ9IGx0XG4gKiBNYXRjaGVzIGFueSB2YWx1ZSB0aGF0IGNvbXBhcmVLZXlzIHJlcG9ydHMgYXMgbGVzcyB0aGFuIHJpZ2h0T3BlcmFuZC5cbiAqXG4gKiBAcHJvcGVydHkgeyhyaWdodE9wZXJhbmQgOktleSkgPT4gTWF0Y2hlcn0gbHRlXG4gKiBNYXRjaGVzIGFueSB2YWx1ZSB0aGF0IGNvbXBhcmVLZXlzIHJlcG9ydHMgYXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvXG4gKiByaWdodE9wZXJhbmQuXG4gKlxuICogQHByb3BlcnR5IHsoa2V5IDpLZXkpID0+IE1hdGNoZXJ9IGVxXG4gKiBNYXRjaGVzIGFueSB2YWx1ZSB0aGF0IGlzIGVxdWFsIHRvIGtleS5cbiAqXG4gKiBAcHJvcGVydHkgeyhrZXkgOktleSkgPT4gTWF0Y2hlcn0gbmVxXG4gKiBNYXRjaGVzIGFueSB2YWx1ZSB0aGF0IGlzIG5vdCBlcXVhbCB0byBrZXkuXG4gKlxuICogQHByb3BlcnR5IHsocmlnaHRPcGVyYW5kIDpLZXkpID0+IE1hdGNoZXJ9IGd0ZVxuICogTWF0Y2hlcyBhbnkgdmFsdWUgdGhhdCBjb21wYXJlS2V5cyByZXBvcnRzIGFzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbFxuICogdG8gcmlnaHRPcGVyYW5kLlxuICpcbiAqIEBwcm9wZXJ0eSB7KHJpZ2h0T3BlcmFuZCA6S2V5KSA9PiBNYXRjaGVyfSBndFxuICogTWF0Y2hlcyBpZiA+IHRoZSByaWdodCBvcGVyYW5kIGJ5IGNvbXBhcmVLZXlzXG4gKiBNYXRjaGVzIGFueSB2YWx1ZSB0aGF0IGNvbXBhcmVLZXlzIHJlcG9ydHMgYXMgZ3JlYXRlciB0aGFuXG4gKiByaWdodE9wZXJhbmQuXG4gKlxuICogQHByb3BlcnR5IHsoc3ViUGF0dD86IFBhdHRlcm4sIGxpbWl0cz86IExpbWl0cykgPT4gTWF0Y2hlcn0gYXJyYXlPZlxuICogTWF0Y2hlcyBhbnkgQ29weUFycmF5IHdob3NlIGVsZW1lbnRzIGFyZSBhbGwgbWF0Y2hlZCBieSBzdWJQYXR0XG4gKiBpZiBkZWZpbmVkLCBzdWJqZWN0IHRvIGxpbWl0cy5cbiAqXG4gKiBAcHJvcGVydHkgeyhrZXlQYXR0PzogUGF0dGVybixcbiAqICAgICAgICAgICAgIHZhbHVlUGF0dD86IFBhdHRlcm4sXG4gKiAgICAgICAgICAgICBsaW1pdHM/OiBMaW1pdHNcbiAqICkgPT4gTWF0Y2hlcn0gcmVjb3JkT2ZcbiAqIE1hdGNoZXMgYW55IENvcHlSZWNvcmQgd2hvc2Uga2V5cyBhcmUgYWxsIG1hdGNoZWQgYnkga2V5UGF0dFxuICogaWYgZGVmaW5lZCBhbmQgdmFsdWVzIGFyZSBhbGwgbWF0Y2hlZCBieSB2YWx1ZVBhdHQgaWYgZGVmaW5lZCxcbiAqIHN1YmplY3QgdG8gbGltaXRzLlxuICpcbiAqIEBwcm9wZXJ0eSB7KGtleVBhdHQ/OiBQYXR0ZXJuLCBsaW1pdHM/OiBMaW1pdHMpID0+IE1hdGNoZXJ9IHNldE9mXG4gKiBNYXRjaGVzIGFueSBDb3B5U2V0IHdob3NlIGVsZW1lbnRzIGFyZSBhbGwgbWF0Y2hlZCBieSBzdWJQYXR0XG4gKiBpZiBkZWZpbmVkLCBzdWJqZWN0IHRvIGxpbWl0cy5cbiAqXG4gKiBAcHJvcGVydHkgeyhrZXlQYXR0PzogUGF0dGVybixcbiAqICAgICAgICAgICAgIGNvdW50UGF0dD86IFBhdHRlcm4sXG4gKiAgICAgICAgICAgICBsaW1pdHM/OiBMaW1pdHNcbiAqICkgPT4gTWF0Y2hlcn0gYmFnT2ZcbiAqIE1hdGNoZXMgYW55IENvcHlCYWcgd2hvc2UgZWxlbWVudHMgYXJlIGFsbCBtYXRjaGVkIGJ5IGtleVBhdHRcbiAqIGlmIGRlZmluZWQgYW5kIHRoZSBjYXJkaW5hbGl0eSBvZiBlYWNoIGlzIG1hdGNoZWQgYnkgY291bnRQYXR0XG4gKiBpZiBkZWZpbmVkLCBzdWJqZWN0IHRvIGxpbWl0cy5cbiAqIGNvdW50UGF0dCBpcyBleHBlY3RlZCB0byByYXJlbHkgYmUgdXNlZnVsLFxuICogYnV0IGlzIHByb3ZpZGVkIHRvIG1pbmltaXplIHN1cnByaXNlLlxuICpcbiAqIEBwcm9wZXJ0eSB7KGtleVBhdHQ/OiBQYXR0ZXJuLFxuICogICAgICAgICAgICAgdmFsdWVQYXR0PzogUGF0dGVybixcbiAqICAgICAgICAgICAgIGxpbWl0cz86IExpbWl0c1xuICogKSA9PiBNYXRjaGVyfSBtYXBPZlxuICogTWF0Y2hlcyBhbnkgQ29weU1hcCB3aG9zZSBrZXlzIGFyZSBhbGwgbWF0Y2hlZCBieSBrZXlQYXR0IGlmIGRlZmluZWRcbiAqIGFuZCB2YWx1ZXMgYXJlIGFsbCBtYXRjaGVkIGJ5IHZhbHVlUGF0dCBpZiBkZWZpbmVkLFxuICogc3ViamVjdCB0byBsaW1pdHMuXG4gKlxuICogQHByb3BlcnR5IHsocmVxdWlyZWQ6IFBhdHRlcm5bXSxcbiAqICAgICAgICAgICAgIG9wdGlvbmFsPzogUGF0dGVybltdLFxuICogICAgICAgICAgICAgcmVzdD86IFBhdHRlcm4sXG4gKiApID0+IE1hdGNoZXJ9IHNwbGl0QXJyYXlcbiAqIE1hdGNoZXMgYW55IGFycmF5IC0tLSB0eXBpY2FsbHkgYW4gYXJndW1lbnRzIGxpc3QgLS0tIGNvbnNpc3Rpbmcgb2ZcbiAqICAgLSBhbiBpbml0aWFsIHBvcnRpb24gbWF0Y2hlZCBieSByZXF1aXJlZCwgYW5kXG4gKiAgIC0gYSBtaWRkbGUgcG9ydGlvbiBvZiBsZW5ndGggdXAgdG8gdGhlIGxlbmd0aCBvZiBvcHRpb25hbCB0aGF0IGlzXG4gKiAgICAgbWF0Y2hlZCBieSB0aGUgZXF1YWwtbGVuZ3RoIHByZWZpeCBvZiBvcHRpb25hbCBpZiBvcHRpb25hbCBpc1xuICogICAgIGRlZmluZWQsIGFuZFxuICogICAtIGEgcmVtYWluZGVyIHRoYXQgaXMgbWF0Y2hlZCBieSByZXN0IGlmIHJlc3QgaXMgZGVmaW5lZC5cbiAqIFRoZSBhcnJheSBtdXN0IGJlIGF0IGxlYXN0IGFzIGxvbmcgYXMgdGhlIHJlcXVpcmVkIHBhdHRlcm4sXG4gKiBidXQgaXRzIHJlbWFpbmRlciBjYW4gYmUgYXJiaXRyYXJpbHkgc2hvcnQuXG4gKiBBbnkgYXJyYXkgZWxlbWVudHMgYmV5b25kIHRoZSBzdW1tZWQgbGVuZ3RoIG9mIHJlcXVpcmVkIGFuZCBvcHRpb25hbFxuICogYXJlIGNvbGxlY3RlZCBhbmQgbWF0Y2hlZCBhZ2FpbnN0IHRoZSByZXN0IHBhdHRlcm4uXG4gKlxuICogQHByb3BlcnR5IHsocmVxdWlyZWQ6IENvcHlSZWNvcmQ8UGF0dGVybj4sXG4gKiAgICAgICAgICAgICBvcHRpb25hbD86IENvcHlSZWNvcmQ8UGF0dGVybj4sXG4gKiAgICAgICAgICAgICByZXN0PzogUGF0dGVybixcbiAqICkgPT4gTWF0Y2hlcn0gc3BsaXRSZWNvcmRcbiAqIE1hdGNoZXMgYW55IENvcHlSZWNvcmQgdGhhdCBjYW4gYmUgc3BsaXQgaW50byBjb21wb25lbnQgQ29weVJlY29yZHNcbiAqIGFzIGZvbGxvd3M6XG4gKiAgIC0gYWxsIHByb3BlcnRpZXMgY29ycmVzcG9uZGluZyB3aXRoIGEgcHJvcGVydHkgb2YgcmVxdWlyZWRcbiAqICAgLSBhbGwgcHJvcGVydGllcyBjb3JyZXNwb25kaW5nIHdpdGggYSBwcm9wZXJ0eSBvZiBvcHRpb25hbFxuICogICAgIGJ1dCBub3QgY29ycmVzcG9uZGluZyB3aXRoIGEgcHJvcGVydHkgb2YgcmVxdWlyZWRcbiAqICAgLSBhbGwgb3RoZXIgcHJvcGVydGllc1xuICogd2hlcmUgdGhlIGZpcnN0IGNvbXBvbmVudCBpcyBtYXRjaGVkIGJ5IHRoZSByZXF1aXJlZCBwYXR0ZXJuLFxuICogdGhlIHNlY29uZCBjb21wb25lbnQgaXMgbWF0Y2hlZCBieSB0aGUgc3Vic2V0IG9mIHRoZSBvcHRpb25hbCBwYXR0ZXJuXG4gKiBjb3JyZXNwb25kaW5nIHdpdGggaXRzIHByb3BlcnRpZXMgaWYgb3B0aW9uYWwgaXMgZGVmaW5lZCwgYW5kXG4gKiB0aGUgdGhpcmQgY29tcG9uZW50IGlzIG1hdGNoZWQgYnkgdGhlIHJlc3QgcGF0dGVybiBpZiBkZWZpbmVkLlxuICogVGhlIENvcHlSZWNvcmQgbXVzdCBoYXZlIGFsbCBwcm9wZXJ0aWVzIHRoYXQgYXBwZWFyIG9uIHRoZSByZXF1aXJlZFxuICogcGF0dGVybiwgYnV0IG1heSBvbWl0IHByb3BlcnRpZXMgdGhhdCBhcHBlYXIgb24gdGhlIG9wdGlvbmFsIHBhdHRlcm4uXG4gKlxuICogQHByb3BlcnR5IHsocmVxdWlyZWQ6IENvcHlSZWNvcmQ8Kj4gfCBDb3B5QXJyYXk8Kj4sXG4gKiAgICAgICAgICAgICByZXN0PzogUGF0dGVybixcbiAqICkgPT4gTWF0Y2hlcn0gc3BsaXRcbiAqIERlcHJlY2F0ZWQuIFVzZSBgTS5zcGxpdEFycmF5YCBvciBgTS5zcGxpdFJlY29yZGAgaW5zdGVhZC5cbiAqIEFuIGFycmF5IG9yIHJlY29yZCBpcyBzcGxpdCBpbnRvIHRoZSBmaXJzdCBwYXJ0IHRoYXQgbWF0Y2hlcyB0aGVcbiAqIGJhc2UgcGF0dGVybiwgYW5kIHRoZSByZW1haW5kZXIsIHdoaWNoIG1hdGNoZXMgYWdhaW5zdCB0aGUgb3B0aW9uYWxcbiAqIHJlc3QgcGF0dGVybiBpZiBwcmVzZW50LlxuICpcbiAqIEBwcm9wZXJ0eSB7KGJhc2U6IENvcHlSZWNvcmQ8Kj4gfCBDb3B5QXJyYXk8Kj4sXG4gKiAgICAgICAgICAgICByZXN0PzogUGF0dGVybixcbiAqICkgPT4gTWF0Y2hlcn0gcGFydGlhbFxuICogRGVwcmVjYXRlZC4gVXNlIGBNLnNwbGl0QXJyYXlgIG9yIGBNLnNwbGl0UmVjb3JkYCBpbnN0ZWFkLlxuICogQW4gYXJyYXkgb3IgcmVjb3JkIGlzIHNwbGl0IGludG8gdGhlIGZpcnN0IHBhcnQgdGhhdCBtYXRjaGVzIHRoZVxuICogYmFzZSBwYXR0ZXJuLCBhbmQgdGhlIHJlbWFpbmRlciwgd2hpY2ggbWF0Y2hlcyBhZ2FpbnN0IHRoZSBvcHRpb25hbFxuICogcmVzdCBwYXR0ZXJuIGlmIHByZXNlbnQuXG4gKiBgTS5wYXJ0aWFsYCBkaWZmZXJzIGZyb20gYE0uc3BsaXRgIGluIHRoZSBoYW5kbGluZyBvZiBkYXRhIHRoYXQgaXNcbiAqIGRlc2NyaWJlZCBpbiB0aGUgYmFzZSBwYXR0ZXJuIGJ1dCBhYnNlbnQgaW4gYSBwcm92aWRlZCBzcGVjaW1lbjpcbiAqICAgLSBGb3IgYSBDb3B5UmVjb3JkLCBgTS5wYXJ0aWFsYCBpZ25vcmVzIHByb3BlcnRpZXMgb2YgdGhlIGJhc2VcbiAqICAgICBwYXR0ZXJuIHRoYXQgYXJlIG5vdCBwcmVzZW50IG9uIHRoZSBzcGVjaW1lbi5cbiAqICAgLSBGb3IgYSBDb3B5QXJyYXksIGBNLnBhcnRpYWxgIGlnbm9yZXMgZWxlbWVudHMgb2YgdGhlIGJhc2VcbiAqICAgICBwYXR0ZXJuIGF0IGluZGljZXMgYmV5b25kIHRoZSBtYXhpbXVtIGluZGV4IG9mIHRoZSBzcGVjaW1lbi5cbiAqXG4gKiBAcHJvcGVydHkgeyh0OiBQYXR0ZXJuKSA9PiBQYXR0ZXJufSBlcmVmXG4gKiBNYXRjaGVzIGFueSBwcm9taXNlIG9iamVjdCBvciBwYXNzYWJsZSBub24tcHJvbWlzZSB0aGF0IG1hdGNoZXMgdGhlXG4gKiBzdWItcGF0dGVybi5cbiAqIE5vdGUgdGhhdCB2YWxpZGF0aW9uIGlzIGltbWVkaWF0ZSwgc28gKHVubGlrZSB0aGUgVHlwZVNjcmlwdCBFUmVmPFQ+XG4gKiB0eXBlKSBgTS5lcmVmYCBtYXRjaGVzIGEgcHJvbWlzZSBvYmplY3Qgd2hvc2UgZnVsZmlsbG1lbnQgdmFsdWUgaXNcbiAqIF9ub3RfIG1hdGNoZWQgYnkgdGhlIHN1Yi1wYXR0ZXJuLlxuICogRm9yIGRlc2NyaWJpbmcgYSB0b3AtbGV2ZWwgcGFyYW1ldGVyLFxuICogYE0uY2FsbFdoZW4oLi4uLCBNLmF3YWl0KHApLCAuLi4pYCBpcyBwcm9iYWJseSBtb3JlIGFwcHJvcHJpYXRlIHRoYW5cbiAqIGBNLmNhbGwoLi4uLCBNLmVyZWYocCksIC4uLilgLlxuICpcbiAqIEBwcm9wZXJ0eSB7KHQ6IFBhdHRlcm4pID0+IFBhdHRlcm59IG9wdFxuICogTWF0Y2hlcyBhIHZhbHVlIG1hdGNoZWQgYnkgdGhlIHN1Yi1wYXR0ZXJuIG9yIHRoZSBleGFjdCB2YWx1ZVxuICogYHVuZGVmaW5lZGAuXG4gKlxuICogQHByb3BlcnR5IHs8TSBleHRlbmRzIFJlY29yZDxhbnksIGFueT4+KGludGVyZmFjZU5hbWU6IHN0cmluZyxcbiAqICAgICAgICAgICAgIG1ldGhvZEd1YXJkczogTSxcbiAqICAgICAgICAgICAgIG9wdGlvbnM/OiB7c2xvcHB5PzogYm9vbGVhbn1cbiAqICkgPT4gSW50ZXJmYWNlR3VhcmR9IGludGVyZmFjZVxuICpcbiAqIEBwcm9wZXJ0eSB7KC4uLmFyZ0d1YXJkczogQXJnR3VhcmRbXSkgPT4gTWV0aG9kR3VhcmRNYWtlcn0gY2FsbFxuICpcbiAqIEBwcm9wZXJ0eSB7KC4uLmFyZ0d1YXJkczogQXJnR3VhcmRbXSkgPT4gTWV0aG9kR3VhcmRNYWtlcn0gY2FsbFdoZW5cbiAqXG4gKiBAcHJvcGVydHkgeyhhcmdHdWFyZDogQXJnR3VhcmQpID0+IEFyZ0d1YXJkfSBhd2FpdFxuICovXG5cbi8qKiBAdHlwZWRlZiB7KC4uLmFyZ3M6IGFueVtdKSA9PiBhbnl9IE1ldGhvZCAqL1xuXG4vKiBUT0RPIHBhcmFtZXRlcml6ZSB0aGlzIHRvIG1hdGNoIHRoZSBiZWhhdmlvciBvYmplY3QgaXQgZ3VhcmRzKi9cbi8qKlxuICogQHR5cGVkZWYge3tcbiAqIGtsYXNzOiAnSW50ZXJmYWNlJyxcbiAqIGludGVyZmFjZU5hbWU6IHN0cmluZyxcbiAqIG1ldGhvZEd1YXJkczogUmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgTWV0aG9kR3VhcmQ+XG4gKiBzbG9wcHk/OiBib29sZWFuXG4gKiB9fSBJbnRlcmZhY2VHdWFyZFxuICovXG5cbi8qKiBAdHlwZWRlZiB7YW55fSBNZXRob2RHdWFyZE1ha2VyXG4gKiBhIHBhcmFtZXRlciBsaXN0IGxpa2UgZm9vKGEsIGIsIGMgPSBkLCDigKZlKSA9PiBmIHNob3VsZCBiZSBndWFyZGVkIGJ5XG4gKiBzb21ldGhpbmcgbGlrZVxuICogZm9vOiBNLmNhbGwoQVNoYXBlLCBCU2hhcGUpLm9wdGlvbmFsKENTaGFwZSkucmVzdChFU2hhcGUpLnJldHVybnMoRlNoYXBlKVxuICogb3B0aW9uYWwgaXMgZm9yIG9wdGlvbmFsICg9KSBwYXJhbXMuIHJlc3QgaXMgZm9yIOKApiAodmFyYXJncykgcGFyYW1zXG4gKi9cblxuLyoqIEB0eXBlZGVmIHt7IGtsYXNzOiAnbWV0aG9kR3VhcmQnLCBjYWxsS2luZDogJ3N5bmMnIHwgJ2FzeW5jJywgcmV0dXJuR3VhcmQ6IHVua25vd24gfX0gTWV0aG9kR3VhcmQgKi9cbi8qKiBAdHlwZWRlZiB7YW55fSBBcmdHdWFyZCAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBhdHRlcm5LaXRcbiAqIEBwcm9wZXJ0eSB7KHNwZWNpbWVuOiBQYXNzYWJsZSxcbiAqICAgICAgICAgICAgIHBhdHQ6IFBhc3NhYmxlLFxuICogICAgICAgICAgICAgY2hlY2s6IENoZWNrZXIsXG4gKiAgICAgICAgICAgICBsYWJlbD86IHN0cmluZ3xudW1iZXJcbiAqICkgPT4gYm9vbGVhbn0gY2hlY2tNYXRjaGVzXG4gKiBAcHJvcGVydHkgeyhzcGVjaW1lbjogUGFzc2FibGUsIHBhdHQ6IFBhdHRlcm4pID0+IGJvb2xlYW59IG1hdGNoZXNcbiAqIEBwcm9wZXJ0eSB7KHNwZWNpbWVuOiBQYXNzYWJsZSwgcGF0dDogUGF0dGVybiwgbGFiZWw/OiBzdHJpbmd8bnVtYmVyKSA9PiB2b2lkfSBmaXRcbiAqIEBwcm9wZXJ0eSB7KHBhdHQ6IFBhdHRlcm4pID0+IHZvaWR9IGFzc2VydFBhdHRlcm5cbiAqIEBwcm9wZXJ0eSB7KHBhdHQ6IFBhc3NhYmxlKSA9PiBib29sZWFufSBpc1BhdHRlcm5cbiAqIEBwcm9wZXJ0eSB7KHBhdHQ6IFBhdHRlcm4pID0+IHZvaWR9IGFzc2VydEtleVBhdHRlcm5cbiAqIEBwcm9wZXJ0eSB7KHBhdHQ6IFBhc3NhYmxlKSA9PiBib29sZWFufSBpc0tleVBhdHRlcm5cbiAqIEBwcm9wZXJ0eSB7R2V0UmFua0NvdmVyfSBnZXRSYW5rQ292ZXJcbiAqIEBwcm9wZXJ0eSB7TWF0Y2hlck5hbWVzcGFjZX0gTVxuICovXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyogVE9ETyovXG4vKiBUaGUgZm9sbG93aW5nIHR5cGUgc2hvdWxkIGJlIGluIGludGVybmFsLXR5cGVzLmpzLCBzaW5jZSB0aGUqL1xuLyogYE1hdGNoSGVscGVyYCB0eXBlIGlzIHB1cmVseSBpbnRlcm5hbCB0byB0aGlzIHBhY2thZ2UuIEhvd2V2ZXIsKi9cbi8qIGluIG9yZGVyIHRvIGdldCB0aGUgZ292ZXJuYW5jZSBhbmQgc29sbyBwYWNrYWdlcyBib3RoIHRvIHBhc3MgbGludCwqL1xuLyogSSBtb3ZlZCB0aGUgdHlwZSBkZWNsYXJhdGlvbiBpdHNlbGYgdG8gdHlwZXMuanMuIFNlZSB0aGUgY29tbWVudHMgaW4qL1xuLyogaW4gaW50ZXJuYWwtdHlwZXMuanMgYW5kIGV4cG9ydHMuanMqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IE1hdGNoSGVscGVyXG4gKiBUaGlzIGZhY3RvcnMgb3V0IG9ubHkgdGhlIHBhcnRzIHNwZWNpZmljIHRvIGVhY2gga2luZCBvZiBNYXRjaGVyLiBJdCBpc1xuICogZW5jYXBzdWxhdGVkLCBhbmQgaXRzIG1ldGhvZHMgY2FuIG1ha2UgdGhlIHN0YXRlZCB1bmNoZWNrZXIgYXNzdW1wdGlvbnNcbiAqIGVuZm9yY2VkIGJ5IHRoZSBjb21tb24gY2FsbGluZyBsb2dpYy5cbiAqXG4gKiBAcHJvcGVydHkgeyhhbGxlZ2VkUGF5bG9hZDogUGFzc2FibGUsXG4gKiAgICAgICAgICAgICBjaGVjazogQ2hlY2tlclxuICogKSA9PiBib29sZWFufSBjaGVja0lzV2VsbEZvcm1lZFxuICogQXNzdW1lcyB0aGlzIGlzIHRoZSBwYXlsb2FkIG9mIGEgQ29weVRhZ2dlZCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nXG4gKiBtYXRjaFRhZy4gSXMgdGhpcyBhIHZhbGlkIHBheWxvYWQgZm9yIGEgTWF0Y2hlciB3aXRoIHRoYXQgdGFnP1xuICpcbiAqIEBwcm9wZXJ0eSB7KHNwZWNpbWVuOiBQYXNzYWJsZSxcbiAqICAgICAgICAgICAgIG1hdGNoZXJQYXlsb2FkOiBQYXNzYWJsZSxcbiAqICAgICAgICAgICAgIGNoZWNrOiBDaGVja2VyLFxuICogKSA9PiBib29sZWFufSBjaGVja01hdGNoZXNcbiAqIEFzc3VtaW5nIGEgdmFsaWQgTWF0Y2hlciBvZiB0aGlzIHR5cGUgd2l0aCBgbWF0Y2hlclBheWxvYWRgIGFzIGl0c1xuICogcGF5bG9hZCwgZG9lcyB0aGlzIHNwZWNpbWVuIG1hdGNoIHRoYXQgTWF0Y2hlcj9cbiAqXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgcGF5bG9hZDogUGFzc2FibGUsXG4gKiAgIGVuY29kZVBhc3NhYmxlOiBLZXlUb0RCS2V5XG4gKiApID0+IFJhbmtDb3Zlcn0gZ2V0UmFua0NvdmVyXG4gKiBBc3N1bWVzIHRoaXMgaXMgdGhlIHBheWxvYWQgb2YgYSBDb3B5VGFnZ2VkIHdpdGggdGhlIGNvcnJlc3BvbmRpbmdcbiAqIG1hdGNoVGFnLiBSZXR1cm4gYSBSYW5rQ292ZXIgdG8gYm91bmQgZnJvbSBiZWxvdyBhbmQgYWJvdmUsXG4gKiBpbiByYW5rIG9yZGVyLCBhbGwgcG9zc2libGUgUGFzc2FibGVzIHRoYXQgd291bGQgbWF0Y2ggdGhpcyBNYXRjaGVyLlxuICogVGhlIGxlZnQgZWxlbWVudCBtdXN0IGJlIGJlZm9yZSBvciB0aGUgc2FtZSByYW5rIGFzIGFueSBwb3NzaWJsZVxuICogbWF0Y2hpbmcgc3BlY2ltZW4uIFRoZSByaWdodCBlbGVtZW50IG11c3QgYmUgYWZ0ZXIgb3IgdGhlIHNhbWVcbiAqIHJhbmsgYXMgYW55IHBvc3NpYmxlIG1hdGNoaW5nIHNwZWNpbWVuLlxuICpcbiAqIEBwcm9wZXJ0eSB7KGFsbGVnZWRQYXR0ZXJuOiBQYXNzYWJsZSxcbiAqICAgICAgICAgICAgIGNoZWNrOiBDaGVja2VyXG4gKiApID0+IGJvb2xlYW59IGNoZWNrS2V5UGF0dGVyblxuICogQXNzdW1lcyB0aGlzIGlzIHRoZSBwYXlsb2FkIG9mIGEgQ29weVRhZ2dlZCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nXG4gKiBtYXRjaFRhZy4gSXMgdGhpcyBhIHZhbGlkIHBhdHRlcm4gZm9yIHVzZSBhcyBhIHF1ZXJ5IGtleSBvciBrZXkgc2hhcGU/XG4gKi9cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAP7X12VIBAABSAQAAKAAAAEBhZ29yaWMvc3dpbmdzZXQtdmF0LXYwLjMwLjIvZXhwb3J0ZWQuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKi8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vc3JjL3ZhdHMvdGltZXIvdHlwZXNcIi8+Ki9cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA314sitcGAADXBgAAOQAAAEBhZ29yaWMvc3dpbmdzZXQtdmF0LXYwLjMwLjIvc3JjL3ZhdHMvdGltZXIvdHlwZUd1YXJkcy5qc3siaW1wb3J0cyI6WyJAYWdvcmljL3N0b3JlIl0sImV4cG9ydHMiOlsiUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUiLCJSZWxhdGl2ZVRpbWVTaGFwZSIsIlJlbGF0aXZlVGltZVZhbHVlU2hhcGUiLCJUaW1lckJyYW5kU2hhcGUiLCJUaW1lc3RhbXBSZWNvcmRTaGFwZSIsIlRpbWVzdGFtcFNoYXBlIiwiVGltZXN0YW1wVmFsdWVTaGFwZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBNOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIk1cIiwgWyRo4oCNX2EgPT4gKE0gPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuY29uc3QgICAgICAgIFRpbWVyQnJhbmRTaGFwZT1NLnJlbW90YWJsZSgpOyRo4oCNX29uY2UuVGltZXJCcmFuZFNoYXBlKFRpbWVyQnJhbmRTaGFwZSk7XG5jb25zdCAgICAgICAgVGltZXN0YW1wVmFsdWVTaGFwZT1NLm5hdCgpOyRo4oCNX29uY2UuVGltZXN0YW1wVmFsdWVTaGFwZShUaW1lc3RhbXBWYWx1ZVNoYXBlKTtcbmNvbnN0ICAgICAgICBSZWxhdGl2ZVRpbWVWYWx1ZVNoYXBlPU0ubmF0KCk7LyogU2hvdWxkIHdlIGFsbG93IG5lZ2F0aXZlcz8qLyRo4oCNX29uY2UuUmVsYXRpdmVUaW1lVmFsdWVTaGFwZShSZWxhdGl2ZVRpbWVWYWx1ZVNoYXBlKTtcblxuY29uc3QgICAgICAgIFRpbWVzdGFtcFJlY29yZFNoYXBlPWhhcmRlbih7XG50aW1lckJyYW5kOlRpbWVyQnJhbmRTaGFwZSxcbmFic1ZhbHVlOlRpbWVzdGFtcFZhbHVlU2hhcGV9KTskaOKAjV9vbmNlLlRpbWVzdGFtcFJlY29yZFNoYXBlKFRpbWVzdGFtcFJlY29yZFNoYXBlKTtcblxuXG5jb25zdCAgICAgICAgUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGU9aGFyZGVuKHtcbnRpbWVyQnJhbmQ6VGltZXJCcmFuZFNoYXBlLFxucmVsVmFsdWU6UmVsYXRpdmVUaW1lVmFsdWVTaGFwZX0pOyRo4oCNX29uY2UuUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUoUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUpO1xuXG5cbmNvbnN0ICAgICAgICBUaW1lc3RhbXBTaGFwZT1NLm9yKFRpbWVzdGFtcFJlY29yZFNoYXBlLFRpbWVzdGFtcFZhbHVlU2hhcGUpOyRo4oCNX29uY2UuVGltZXN0YW1wU2hhcGUoVGltZXN0YW1wU2hhcGUpO1xuY29uc3QgICAgICAgIFJlbGF0aXZlVGltZVNoYXBlPU0ub3IoXG5SZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSxcblJlbGF0aXZlVGltZVZhbHVlU2hhcGUpOyRo4oCNX29uY2UuUmVsYXRpdmVUaW1lU2hhcGUoUmVsYXRpdmVUaW1lU2hhcGUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlRpbWVyQnJhbmRTaGFwZSI6WyJUaW1lckJyYW5kU2hhcGUiXSwiVGltZXN0YW1wVmFsdWVTaGFwZSI6WyJUaW1lc3RhbXBWYWx1ZVNoYXBlIl0sIlJlbGF0aXZlVGltZVZhbHVlU2hhcGUiOlsiUmVsYXRpdmVUaW1lVmFsdWVTaGFwZSJdLCJUaW1lc3RhbXBSZWNvcmRTaGFwZSI6WyJUaW1lc3RhbXBSZWNvcmRTaGFwZSJdLCJSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSI6WyJSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSJdLCJUaW1lc3RhbXBTaGFwZSI6WyJUaW1lc3RhbXBTaGFwZSJdLCJSZWxhdGl2ZVRpbWVTaGFwZSI6WyJSZWxhdGl2ZVRpbWVTaGFwZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB3iGo/SCMAAEgjAAAuAAAAQGFnb3JpYy92YXQtZGF0YS12MC40LjMvc3JjL2Zhci1jbGFzcy11dGlscy5qc3siaW1wb3J0cyI6WyIuL2tpbmQtdXRpbHMuanMiLCIuL3ZhdC1kYXRhLWJpbmRpbmdzLmpzIiwiQGFnb3JpYy9zdG9yZSJdLCJleHBvcnRzIjpbImRlZmluZUR1cmFibGVGYXJDbGFzcyIsImRlZmluZUR1cmFibGVGYXJDbGFzc0tpdCIsImRlZmluZVZpcnR1YWxGYXJDbGFzcyIsImRlZmluZVZpcnR1YWxGYXJDbGFzc0tpdCIsInZpdmlmeUZhckNsYXNzIiwidml2aWZ5RmFyQ2xhc3NLaXQiLCJ2aXZpZnlGYXJJbnN0YW5jZSIsInZpdmlmeVNpbmdsZXRvbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBpbml0RW1wdHkscHJvdmlkZUtpbmRIYW5kbGUsZGVmaW5lS2luZCxkZWZpbmVLaW5kTXVsdGksZGVmaW5lRHVyYWJsZUtpbmQsZGVmaW5lRHVyYWJsZUtpbmRNdWx0aSxwcm92aWRlOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvc3RvcmVcIiwgW1tcImluaXRFbXB0eVwiLCBbJGjigI1fYSA9PiAoaW5pdEVtcHR5ID0gJGjigI1fYSldXV1dLFtcIi4va2luZC11dGlscy5qc1wiLCBbW1wicHJvdmlkZUtpbmRIYW5kbGVcIiwgWyRo4oCNX2EgPT4gKHByb3ZpZGVLaW5kSGFuZGxlID0gJGjigI1fYSldXV1dLFtcIi4vdmF0LWRhdGEtYmluZGluZ3MuanNcIiwgW1tcImRlZmluZUtpbmRcIiwgWyRo4oCNX2EgPT4gKGRlZmluZUtpbmQgPSAkaOKAjV9hKV1dLFtcImRlZmluZUtpbmRNdWx0aVwiLCBbJGjigI1fYSA9PiAoZGVmaW5lS2luZE11bHRpID0gJGjigI1fYSldXSxbXCJkZWZpbmVEdXJhYmxlS2luZFwiLCBbJGjigI1fYSA9PiAoZGVmaW5lRHVyYWJsZUtpbmQgPSAkaOKAjV9hKV1dLFtcImRlZmluZUR1cmFibGVLaW5kTXVsdGlcIiwgWyRo4oCNX2EgPT4gKGRlZmluZUR1cmFibGVLaW5kTXVsdGkgPSAkaOKAjV9hKV1dLFtcInByb3ZpZGVcIiwgWyRo4oCNX2EgPT4gKHByb3ZpZGUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0ZW1wbGF0ZSBMLFIgQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL2V2ZW50dWFsLXNlbmQnKS5SZW1vdGFibGVCcmFuZDxMLCBSPn0gUmVtb3RhYmxlQnJhbmQgKi9cbi8qKiBAdGVtcGxhdGUgVCBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vZXZlbnR1YWwtc2VuZCcpLkVSZWY8VD59IEVSZWYgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkJhZ2dhZ2V9IEJhZ2dhZ2UgKi9cbi8qKiBAdGVtcGxhdGUgVCBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkRlZmluZUtpbmRPcHRpb25zPFQ+fSBEZWZpbmVLaW5kT3B0aW9ucyAqL1xuLyoqIEB0ZW1wbGF0ZSBUIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuS2luZEZhY2V0PFQ+fSBLaW5kRmFjZXQgKi9cbi8qKiBAdGVtcGxhdGUgVCBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLktpbmRGYWNldHM8VD59IEtpbmRGYWNldHMgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkR1cmFibGVLaW5kSGFuZGxlfSBEdXJhYmxlS2luZEhhbmRsZSAqL1xuXG4vKiBUT0RPIGludGVyZmFjZUd1YXJkIHR5cGUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy82MjA2Ki9cbi8qKlxuICogQHRlbXBsYXRlIHsoLi4uYXJnczogYW55KSA9PiBhbnl9IEkgaW5pdCBzdGF0ZSBmdW5jdGlvblxuICogQHRlbXBsYXRlIFQgYmVoYXZpb3JcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEBwYXJhbSB7YW55fSBpbnRlcmZhY2VHdWFyZFxuICogQHBhcmFtIHtJfSBpbml0XG4gKiBAcGFyYW0ge1QgJiBUaGlzVHlwZTx7IHNlbGY6IFQsIHN0YXRlOiBSZXR1cm5UeXBlPEk+IH0+fSBtZXRob2RzXG4gKiBAcGFyYW0ge0RlZmluZUtpbmRPcHRpb25zPHsgc2VsZjogVCwgc3RhdGU6IFJldHVyblR5cGU8ST4gfT59IFtvcHRpb25zXVxuICogQHJldHVybnMgeyguLi5hcmdzOiBQYXJhbWV0ZXJzPEk+KSA9PiAoVCAmIFJlbW90YWJsZUJyYW5kPHt9LCBUPil9XG4gKi9cbmNvbnN0ICAgICAgICBkZWZpbmVWaXJ0dWFsRmFyQ2xhc3M9KFxudGFnLFxuaW50ZXJmYWNlR3VhcmQsXG5pbml0LFxubWV0aG9kcyxcbm9wdGlvbnMpPT5cblxuLyogQHRzLWV4cGVjdC1lcnJvciBUaGUgdXNlIG9mIGB0aGlzZnVsTWV0aG9kc2AgdG8gY2hhbmdlKi9cbi8qIHRoZSBhcHByb3ByaWF0ZSBzdGF0aWMgdHlwZSBpcyB0aGUgd2hvbGUgcG9pbnQgb2YgdGhpcyBtZXRob2QuKi9cbmRlZmluZUtpbmQodGFnLGluaXQsbWV0aG9kcyx7XG4uLi5vcHRpb25zLFxudGhpc2Z1bE1ldGhvZHM6dHJ1ZSxcbmludGVyZmFjZUd1YXJkfSk7JGjigI1fb25jZS5kZWZpbmVWaXJ0dWFsRmFyQ2xhc3MoZGVmaW5lVmlydHVhbEZhckNsYXNzKTtcblxuaGFyZGVuKGRlZmluZVZpcnR1YWxGYXJDbGFzcyk7XG5cbi8qIFRPRE8gaW50ZXJmYWNlR3VhcmQgdHlwZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzYyMDYqL1xuLyoqXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiBhbnkpID0+IGFueX0gSSBpbml0IHN0YXRlIGZ1bmN0aW9uXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcgfCBzeW1ib2wsIENhbGxhYmxlRnVuY3Rpb24+Pn0gVCBmYWNldHNcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEBwYXJhbSB7YW55fSBpbnRlcmZhY2VHdWFyZEtpdFxuICogQHBhcmFtIHtJfSBpbml0XG4gKiBAcGFyYW0ge1QgJiBUaGlzVHlwZTx7IGZhY2V0czogVCwgc3RhdGU6IFJldHVyblR5cGU8ST4gfT4gfSBmYWNldHNcbiAqIEBwYXJhbSB7RGVmaW5lS2luZE9wdGlvbnM8eyBmYWNldHM6IFQsIHN0YXRlOiBSZXR1cm5UeXBlPEk+IH0+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHsoLi4uYXJnczogUGFyYW1ldGVyczxJPikgPT4gKFQgJiBSZW1vdGFibGVCcmFuZDx7fSwgVD4pfVxuICovXG5jb25zdCAgICAgICAgZGVmaW5lVmlydHVhbEZhckNsYXNzS2l0PShcbnRhZyxcbmludGVyZmFjZUd1YXJkS2l0LFxuaW5pdCxcbmZhY2V0cyxcbm9wdGlvbnMpPT5cblxuLyogQHRzLWV4cGVjdC1lcnJvciBUaGUgdXNlIG9mIGB0aGlzZnVsTWV0aG9kc2AgdG8gY2hhbmdlKi9cbi8qIHRoZSBhcHByb3ByaWF0ZSBzdGF0aWMgdHlwZSBpcyB0aGUgd2hvbGUgcG9pbnQgb2YgdGhpcyBtZXRob2QuKi9cbmRlZmluZUtpbmRNdWx0aSh0YWcsaW5pdCxmYWNldHMse1xuLi4ub3B0aW9ucyxcbnRoaXNmdWxNZXRob2RzOnRydWUsXG5pbnRlcmZhY2VHdWFyZDppbnRlcmZhY2VHdWFyZEtpdH0pOyRo4oCNX29uY2UuZGVmaW5lVmlydHVhbEZhckNsYXNzS2l0KGRlZmluZVZpcnR1YWxGYXJDbGFzc0tpdCk7XG5cbmhhcmRlbihkZWZpbmVWaXJ0dWFsRmFyQ2xhc3NLaXQpO1xuXG4vKiBUT0RPIGludGVyZmFjZUd1YXJkIHR5cGUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy82MjA2Ki9cbi8qKlxuICogQHRlbXBsYXRlIHsoLi4uYXJnczogYW55KSA9PiBhbnl9IEkgaW5pdCBzdGF0ZSBmdW5jdGlvblxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCBDYWxsYWJsZUZ1bmN0aW9uPn0gVCBtZXRob2RzXG4gKiBAcGFyYW0ge0R1cmFibGVLaW5kSGFuZGxlfSBraW5kSGFuZGxlXG4gKiBAcGFyYW0ge2FueX0gaW50ZXJmYWNlR3VhcmRcbiAqIEBwYXJhbSB7SX0gaW5pdFxuICogQHBhcmFtIHtUICYgVGhpc1R5cGU8eyBzZWxmOiBULCBzdGF0ZTogUmV0dXJuVHlwZTxJPiB9Pn0gbWV0aG9kc1xuICogQHBhcmFtIHtEZWZpbmVLaW5kT3B0aW9uczx7IHNlbGY6IFQsIHN0YXRlOiBSZXR1cm5UeXBlPEk+IH0+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHsoLi4uYXJnczogUGFyYW1ldGVyczxJPikgPT4gKFQgJiBSZW1vdGFibGVCcmFuZDx7fSwgVD4pfVxuICovXG5jb25zdCAgICAgICAgZGVmaW5lRHVyYWJsZUZhckNsYXNzPShcbmtpbmRIYW5kbGUsXG5pbnRlcmZhY2VHdWFyZCxcbmluaXQsXG5tZXRob2RzLFxub3B0aW9ucyk9PlxuXG4vKiBAdHMtZXhwZWN0LWVycm9yIFRoZSB1c2Ugb2YgYHRoaXNmdWxNZXRob2RzYCB0byBjaGFuZ2UqL1xuLyogdGhlIGFwcHJvcHJpYXRlIHN0YXRpYyB0eXBlIGlzIHRoZSB3aG9sZSBwb2ludCBvZiB0aGlzIG1ldGhvZC4qL1xuZGVmaW5lRHVyYWJsZUtpbmQoa2luZEhhbmRsZSxpbml0LG1ldGhvZHMse1xuLi4ub3B0aW9ucyxcbnRoaXNmdWxNZXRob2RzOnRydWUsXG5pbnRlcmZhY2VHdWFyZH0pOyRo4oCNX29uY2UuZGVmaW5lRHVyYWJsZUZhckNsYXNzKGRlZmluZUR1cmFibGVGYXJDbGFzcyk7XG5cbmhhcmRlbihkZWZpbmVEdXJhYmxlRmFyQ2xhc3MpO1xuXG4vKiBUT0RPIGludGVyZmFjZUd1YXJkIHR5cGUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy82MjA2Ki9cbi8qKlxuICogQHRlbXBsYXRlIHsoLi4uYXJnczogYW55KSA9PiBhbnl9IEkgaW5pdCBzdGF0ZSBmdW5jdGlvblxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCBDYWxsYWJsZUZ1bmN0aW9uPj59IFQgZmFjZXRzXG4gKiBAcGFyYW0ge0R1cmFibGVLaW5kSGFuZGxlfSBraW5kSGFuZGxlXG4gKiBAcGFyYW0ge2FueX0gaW50ZXJmYWNlR3VhcmRLaXRcbiAqIEBwYXJhbSB7SX0gaW5pdFxuICogQHBhcmFtIHtUICYgVGhpc1R5cGU8eyBmYWNldHM6IFQsIHN0YXRlOiBSZXR1cm5UeXBlPEk+fT4gfSBmYWNldHNcbiAqIEBwYXJhbSB7RGVmaW5lS2luZE9wdGlvbnM8eyBmYWNldHM6IFQsIHN0YXRlOiBSZXR1cm5UeXBlPEk+fT59IFtvcHRpb25zXVxuICogQHJldHVybnMgeyguLi5hcmdzOiBQYXJhbWV0ZXJzPEk+KSA9PiAoVCAmIFJlbW90YWJsZUJyYW5kPHt9LCBUPil9XG4gKi9cbmNvbnN0ICAgICAgICBkZWZpbmVEdXJhYmxlRmFyQ2xhc3NLaXQ9KFxua2luZEhhbmRsZSxcbmludGVyZmFjZUd1YXJkS2l0LFxuaW5pdCxcbmZhY2V0cyxcbm9wdGlvbnMpPT5cblxuLyogQHRzLWV4cGVjdC1lcnJvciBUaGUgdXNlIG9mIGB0aGlzZnVsTWV0aG9kc2AgdG8gY2hhbmdlKi9cbi8qIHRoZSBhcHByb3ByaWF0ZSBzdGF0aWMgdHlwZSBpcyB0aGUgd2hvbGUgcG9pbnQgb2YgdGhpcyBtZXRob2QuKi9cbmRlZmluZUR1cmFibGVLaW5kTXVsdGkoa2luZEhhbmRsZSxpbml0LGZhY2V0cyx7XG4uLi5vcHRpb25zLFxudGhpc2Z1bE1ldGhvZHM6dHJ1ZSxcbmludGVyZmFjZUd1YXJkOmludGVyZmFjZUd1YXJkS2l0fSk7JGjigI1fb25jZS5kZWZpbmVEdXJhYmxlRmFyQ2xhc3NLaXQoZGVmaW5lRHVyYWJsZUZhckNsYXNzS2l0KTtcblxuaGFyZGVuKGRlZmluZUR1cmFibGVGYXJDbGFzc0tpdCk7XG5cbi8qIFRPRE8gaW50ZXJmYWNlR3VhcmQgdHlwZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzYyMDYqL1xuLyoqXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiBhbnkpID0+IGFueX0gSSBpbml0IHN0YXRlIGZ1bmN0aW9uXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcgfCBzeW1ib2wsIENhbGxhYmxlRnVuY3Rpb24+fSBUIG1ldGhvZHNcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IGtpbmROYW1lXG4gKiBAcGFyYW0ge2FueX0gaW50ZXJmYWNlR3VhcmRcbiAqIEBwYXJhbSB7SX0gaW5pdFxuICogQHBhcmFtIHtUICYgVGhpc1R5cGU8eyBzZWxmOiBULCBzdGF0ZTogUmV0dXJuVHlwZTxJPiB9Pn0gbWV0aG9kc1xuICogQHBhcmFtIHtEZWZpbmVLaW5kT3B0aW9uczx7IHNlbGY6IFQsIHN0YXRlOiBSZXR1cm5UeXBlPEk+IH0+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHsoLi4uYXJnczogUGFyYW1ldGVyczxJPikgPT4gKFQgJiBSZW1vdGFibGVCcmFuZDx7fSwgVD4pfVxuICovXG5jb25zdCAgICAgICAgdml2aWZ5RmFyQ2xhc3M9KFxuYmFnZ2FnZSxcbmtpbmROYW1lLFxuaW50ZXJmYWNlR3VhcmQsXG5pbml0LFxubWV0aG9kcyxcbm9wdGlvbnM9dW5kZWZpbmVkKT0+XG5cbmRlZmluZUR1cmFibGVGYXJDbGFzcyhcbnByb3ZpZGVLaW5kSGFuZGxlKGJhZ2dhZ2Usa2luZE5hbWUpLFxuaW50ZXJmYWNlR3VhcmQsXG5pbml0LFxubWV0aG9kcyxcbm9wdGlvbnMpOyRo4oCNX29uY2Uudml2aWZ5RmFyQ2xhc3Modml2aWZ5RmFyQ2xhc3MpO1xuXG5oYXJkZW4odml2aWZ5RmFyQ2xhc3MpO1xuXG4vKiBUT0RPIGludGVyZmFjZUd1YXJkIHR5cGUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy82MjA2Ki9cbi8qKlxuICogQHRlbXBsYXRlIHsoLi4uYXJnczogYW55KSA9PiBhbnl9IEkgaW5pdCBzdGF0ZSBmdW5jdGlvblxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCBDYWxsYWJsZUZ1bmN0aW9uPj59IFQgZmFjZXRzXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBraW5kTmFtZVxuICogQHBhcmFtIHthbnl9IGludGVyZmFjZUd1YXJkS2l0XG4gKiBAcGFyYW0ge0l9IGluaXRcbiAqIEBwYXJhbSB7VCAmIFRoaXNUeXBlPHsgZmFjZXRzOiBULCBzdGF0ZTogUmV0dXJuVHlwZTxJPiB9PiB9IGZhY2V0c1xuICogQHBhcmFtIHtEZWZpbmVLaW5kT3B0aW9uczx7IGZhY2V0czogVCwgc3RhdGU6IFJldHVyblR5cGU8ST4gfT59IFtvcHRpb25zXVxuICogQHJldHVybnMgeyguLi5hcmdzOiBQYXJhbWV0ZXJzPEk+KSA9PiAoVCAmIFJlbW90YWJsZUJyYW5kPHt9LCBUPil9XG4gKi9cbmNvbnN0ICAgICAgICB2aXZpZnlGYXJDbGFzc0tpdD0oXG5iYWdnYWdlLFxua2luZE5hbWUsXG5pbnRlcmZhY2VHdWFyZEtpdCxcbmluaXQsXG5mYWNldHMsXG5vcHRpb25zPXVuZGVmaW5lZCk9PlxuXG5kZWZpbmVEdXJhYmxlRmFyQ2xhc3NLaXQoXG5wcm92aWRlS2luZEhhbmRsZShiYWdnYWdlLGtpbmROYW1lKSxcbmludGVyZmFjZUd1YXJkS2l0LFxuaW5pdCxcbmZhY2V0cyxcbm9wdGlvbnMpOyRo4oCNX29uY2Uudml2aWZ5RmFyQ2xhc3NLaXQodml2aWZ5RmFyQ2xhc3NLaXQpO1xuXG5oYXJkZW4odml2aWZ5RmFyQ2xhc3NLaXQpO1xuXG4vKiBUT0RPIGludGVyZmFjZUd1YXJkIHR5cGUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy82MjA2Ki9cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgQ2FsbGFibGVGdW5jdGlvbj59IE0gbWV0aG9kc1xuICogQHBhcmFtIHtCYWdnYWdlfSBiYWdnYWdlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2luZE5hbWVcbiAqIEBwYXJhbSB7YW55fSBpbnRlcmZhY2VHdWFyZFxuICogQHBhcmFtIHtNfSBtZXRob2RzXG4gKiBAcGFyYW0ge0RlZmluZUtpbmRPcHRpb25zPHsgc2VsZjogTSB9Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7VCAmIFJlbW90YWJsZUJyYW5kPHt9LCBUPn1cbiAqL1xuY29uc3QgICAgICAgIHZpdmlmeUZhckluc3RhbmNlPShcbmJhZ2dhZ2UsXG5raW5kTmFtZSxcbmludGVyZmFjZUd1YXJkLFxubWV0aG9kcyxcbm9wdGlvbnM9dW5kZWZpbmVkKT0+XG57XG5jb25zdCBtYWtlU2luZ2xldG9uPXZpdmlmeUZhckNsYXNzKFxuYmFnZ2FnZSxcbmtpbmROYW1lLFxuaW50ZXJmYWNlR3VhcmQsXG5pbml0RW1wdHksXG5tZXRob2RzLFxub3B0aW9ucyk7XG5cblxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItdHMtZXhwZWN0LWVycm9yIC0tIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNDYyMCovXG4vKiBAdHMtaWdub3JlIGNvdWxkIGJlIGluc3RhbnRpYXRlZCB3aXRoIGFuIGFyYml0cmFyeSB0eXBlKi9cbnJldHVybiBwcm92aWRlKGJhZ2dhZ2UsIGB0aGVfJHtraW5kTmFtZX1gLCgpPT5tYWtlU2luZ2xldG9uKCkpO1xuIH07JGjigI1fb25jZS52aXZpZnlGYXJJbnN0YW5jZSh2aXZpZnlGYXJJbnN0YW5jZSk7XG5oYXJkZW4odml2aWZ5RmFySW5zdGFuY2UpO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSB2aXZpZnlGYXJJbnN0YW5jZSBpbnN0ZWFkLlxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCBDYWxsYWJsZUZ1bmN0aW9uPn0gVCBtZXRob2RzXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBraW5kTmFtZVxuICogQHBhcmFtIHtUfSBtZXRob2RzXG4gKiBAcGFyYW0ge0RlZmluZUtpbmRPcHRpb25zPHsgc2VsZjogVCB9Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7VCAmIFJlbW90YWJsZUJyYW5kPHt9LCBUPn1cbiAqL1xuY29uc3QgICAgICAgIHZpdmlmeVNpbmdsZXRvbj0oXG5iYWdnYWdlLFxua2luZE5hbWUsXG5tZXRob2RzLFxub3B0aW9ucz11bmRlZmluZWQpPT5cbnZpdmlmeUZhckluc3RhbmNlKGJhZ2dhZ2Usa2luZE5hbWUsdW5kZWZpbmVkLG1ldGhvZHMsb3B0aW9ucyk7JGjigI1fb25jZS52aXZpZnlTaW5nbGV0b24odml2aWZ5U2luZ2xldG9uKTtcbmhhcmRlbih2aXZpZnlTaW5nbGV0b24pO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZmluZVZpcnR1YWxGYXJDbGFzcyI6WyJkZWZpbmVWaXJ0dWFsRmFyQ2xhc3MiXSwiZGVmaW5lVmlydHVhbEZhckNsYXNzS2l0IjpbImRlZmluZVZpcnR1YWxGYXJDbGFzc0tpdCJdLCJkZWZpbmVEdXJhYmxlRmFyQ2xhc3MiOlsiZGVmaW5lRHVyYWJsZUZhckNsYXNzIl0sImRlZmluZUR1cmFibGVGYXJDbGFzc0tpdCI6WyJkZWZpbmVEdXJhYmxlRmFyQ2xhc3NLaXQiXSwidml2aWZ5RmFyQ2xhc3MiOlsidml2aWZ5RmFyQ2xhc3MiXSwidml2aWZ5RmFyQ2xhc3NLaXQiOlsidml2aWZ5RmFyQ2xhc3NLaXQiXSwidml2aWZ5RmFySW5zdGFuY2UiOlsidml2aWZ5RmFySW5zdGFuY2UiXSwidml2aWZ5U2luZ2xldG9uIjpbInZpdmlmeVNpbmdsZXRvbiJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACPyzk/PQYAAD0GAAAkAAAAQGFnb3JpYy92YXQtZGF0YS12MC40LjMvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vZmFyLWNsYXNzLXV0aWxzLmpzIiwiLi9raW5kLXV0aWxzLmpzIiwiLi92YXQtZGF0YS1iaW5kaW5ncy5qcyJdLCJleHBvcnRzIjpbImRlZmluZUR1cmFibGVGYXJDbGFzcyIsImRlZmluZUR1cmFibGVGYXJDbGFzc0tpdCIsImRlZmluZVZpcnR1YWxGYXJDbGFzcyIsImRlZmluZVZpcnR1YWxGYXJDbGFzc0tpdCIsInZpdmlmeUZhckNsYXNzIiwidml2aWZ5RmFyQ2xhc3NLaXQiLCJ2aXZpZnlGYXJJbnN0YW5jZSIsInZpdmlmeVNpbmdsZXRvbiJdLCJyZWV4cG9ydHMiOlsiLi9raW5kLXV0aWxzLmpzIiwiLi92YXQtZGF0YS1iaW5kaW5ncy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vdmF0LWRhdGEtYmluZGluZ3MuanNcIiwgW11dLFtcIi4va2luZC11dGlscy5qc1wiLCBbXV0sW1wiLi9mYXItY2xhc3MtdXRpbHMuanNcIiwgW1tcImRlZmluZVZpcnR1YWxGYXJDbGFzc1wiLCBbJGjigI1fbGl2ZVtcImRlZmluZVZpcnR1YWxGYXJDbGFzc1wiXV1dLFtcImRlZmluZVZpcnR1YWxGYXJDbGFzc0tpdFwiLCBbJGjigI1fbGl2ZVtcImRlZmluZVZpcnR1YWxGYXJDbGFzc0tpdFwiXV1dLFtcImRlZmluZUR1cmFibGVGYXJDbGFzc1wiLCBbJGjigI1fbGl2ZVtcImRlZmluZUR1cmFibGVGYXJDbGFzc1wiXV1dLFtcImRlZmluZUR1cmFibGVGYXJDbGFzc0tpdFwiLCBbJGjigI1fbGl2ZVtcImRlZmluZUR1cmFibGVGYXJDbGFzc0tpdFwiXV1dLFtcInZpdmlmeUZhckNsYXNzXCIsIFskaOKAjV9saXZlW1widml2aWZ5RmFyQ2xhc3NcIl1dXSxbXCJ2aXZpZnlGYXJDbGFzc0tpdFwiLCBbJGjigI1fbGl2ZVtcInZpdmlmeUZhckNsYXNzS2l0XCJdXV0sW1widml2aWZ5RmFySW5zdGFuY2VcIiwgWyRo4oCNX2xpdmVbXCJ2aXZpZnlGYXJJbnN0YW5jZVwiXV1dLFtcInZpdmlmeVNpbmdsZXRvblwiLCBbJGjigI1fbGl2ZVtcInZpdmlmeVNpbmdsZXRvblwiXV1dXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6eyJkZWZpbmVWaXJ0dWFsRmFyQ2xhc3MiOlsiZGVmaW5lVmlydHVhbEZhckNsYXNzIixmYWxzZV0sImRlZmluZVZpcnR1YWxGYXJDbGFzc0tpdCI6WyJkZWZpbmVWaXJ0dWFsRmFyQ2xhc3NLaXQiLGZhbHNlXSwiZGVmaW5lRHVyYWJsZUZhckNsYXNzIjpbImRlZmluZUR1cmFibGVGYXJDbGFzcyIsZmFsc2VdLCJkZWZpbmVEdXJhYmxlRmFyQ2xhc3NLaXQiOlsiZGVmaW5lRHVyYWJsZUZhckNsYXNzS2l0IixmYWxzZV0sInZpdmlmeUZhckNsYXNzIjpbInZpdmlmeUZhckNsYXNzIixmYWxzZV0sInZpdmlmeUZhckNsYXNzS2l0IjpbInZpdmlmeUZhckNsYXNzS2l0IixmYWxzZV0sInZpdmlmeUZhckluc3RhbmNlIjpbInZpdmlmeUZhckluc3RhbmNlIixmYWxzZV0sInZpdmlmeVNpbmdsZXRvbiI6WyJ2aXZpZnlTaW5nbGV0b24iLGZhbHNlXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAI8gotDQJAAA0CQAAKQAAAEBhZ29yaWMvdmF0LWRhdGEtdjAuNC4zL3NyYy9raW5kLXV0aWxzLmpzeyJpbXBvcnRzIjpbIi4vdmF0LWRhdGEtYmluZGluZ3MuanMiXSwiZXhwb3J0cyI6WyJpZ25vcmVDb250ZXh0IiwicHJvdmlkZUtpbmRIYW5kbGUiLCJ2aXZpZnlLaW5kIiwidml2aWZ5S2luZE11bHRpIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IHByb3ZpZGUsZGVmaW5lRHVyYWJsZUtpbmQsZGVmaW5lRHVyYWJsZUtpbmRNdWx0aSxtYWtlS2luZEhhbmRsZTskaOKAjV9pbXBvcnRzKFtbXCIuL3ZhdC1kYXRhLWJpbmRpbmdzLmpzXCIsIFtbXCJwcm92aWRlXCIsIFskaOKAjV9hID0+IChwcm92aWRlID0gJGjigI1fYSldXSxbXCJkZWZpbmVEdXJhYmxlS2luZFwiLCBbJGjigI1fYSA9PiAoZGVmaW5lRHVyYWJsZUtpbmQgPSAkaOKAjV9hKV1dLFtcImRlZmluZUR1cmFibGVLaW5kTXVsdGlcIiwgWyRo4oCNX2EgPT4gKGRlZmluZUR1cmFibGVLaW5kTXVsdGkgPSAkaOKAjV9hKV1dLFtcIm1ha2VLaW5kSGFuZGxlXCIsIFskaOKAjV9hID0+IChtYWtlS2luZEhhbmRsZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQmFnZ2FnZX0gQmFnZ2FnZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuRHVyYWJsZUtpbmRIYW5kbGV9IER1cmFibGVLaW5kSGFuZGxlICovXG5cbi8qKlxuICogTWFrZSBhIHZlcnNpb24gb2YgdGhlIGFyZ3VtZW50IGZ1bmN0aW9uIHRoYXQgdGFrZXMgYSBraW5kIGNvbnRleHQgYnV0XG4gKiBpZ25vcmVzIGl0LlxuICpcbiAqIEB0eXBlIHs8VCBleHRlbmRzIEZ1bmN0aW9uPihmbjogVCkgPT4gWGltcG9ydCgnLi90eXBlcy5qcycpLlBsdXNDb250ZXh0PG5ldmVyLCBUPn1cbiAqL1xuY29uc3QgICAgICAgIGlnbm9yZUNvbnRleHQ9XG4oZm4pPT5cbihfY29udGV4dCwuLi5hcmdzKT0+XG5mbiguLi5hcmdzKTskaOKAjV9vbmNlLmlnbm9yZUNvbnRleHQoaWdub3JlQ29udGV4dCk7XG5oYXJkZW4oaWdub3JlQ29udGV4dCk7XG5cbi8qKlxuICogQHBhcmFtIHtCYWdnYWdlfSBiYWdnYWdlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2luZE5hbWVcbiAqIEByZXR1cm5zIHtEdXJhYmxlS2luZEhhbmRsZX1cbiAqL1xuY29uc3QgICAgICAgIHByb3ZpZGVLaW5kSGFuZGxlPShiYWdnYWdlLGtpbmROYW1lKT0+XG5wcm92aWRlKGJhZ2dhZ2UsIGAke2tpbmROYW1lfV9raW5kSGFuZGxlYCwoKT0+bWFrZUtpbmRIYW5kbGUoa2luZE5hbWUpKTskaOKAjV9vbmNlLnByb3ZpZGVLaW5kSGFuZGxlKHByb3ZpZGVLaW5kSGFuZGxlKTtcbmhhcmRlbihwcm92aWRlS2luZEhhbmRsZSk7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIHZpdmlmeUZhckNsYXNzIGluc3RlYWRcbiAqIEB0eXBlIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuVml2aWZ5S2luZH1cbiAqL1xuY29uc3QgICAgICAgIHZpdmlmeUtpbmQ9KFxuYmFnZ2FnZSxcbmtpbmROYW1lLFxuaW5pdCxcbmJlaGF2aW9yLFxub3B0aW9ucz11bmRlZmluZWQpPT5cblxuZGVmaW5lRHVyYWJsZUtpbmQoXG5wcm92aWRlS2luZEhhbmRsZShiYWdnYWdlLGtpbmROYW1lKSxcbmluaXQsXG5iZWhhdmlvcixcbm9wdGlvbnMpOyRo4oCNX29uY2Uudml2aWZ5S2luZCh2aXZpZnlLaW5kKTtcblxuaGFyZGVuKHZpdmlmeUtpbmQpO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSB2aXZpZnlGYXJDbGFzc0tpdCBpbnN0ZWFkXG4gKiBAdHlwZSB7WGltcG9ydCgnLi90eXBlcy5qcycpLlZpdmlmeUtpbmRNdWx0aX1cbiAqL1xuY29uc3QgICAgICAgIHZpdmlmeUtpbmRNdWx0aT0oXG5iYWdnYWdlLFxua2luZE5hbWUsXG5pbml0LFxuYmVoYXZpb3IsXG5vcHRpb25zPXVuZGVmaW5lZCk9PlxuXG5kZWZpbmVEdXJhYmxlS2luZE11bHRpKFxucHJvdmlkZUtpbmRIYW5kbGUoYmFnZ2FnZSxraW5kTmFtZSksXG5pbml0LFxuYmVoYXZpb3IsXG5vcHRpb25zKTskaOKAjV9vbmNlLnZpdmlmeUtpbmRNdWx0aSh2aXZpZnlLaW5kTXVsdGkpO1xuXG5oYXJkZW4odml2aWZ5S2luZE11bHRpKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpZ25vcmVDb250ZXh0IjpbImlnbm9yZUNvbnRleHQiXSwicHJvdmlkZUtpbmRIYW5kbGUiOlsicHJvdmlkZUtpbmRIYW5kbGUiXSwidml2aWZ5S2luZCI6WyJ2aXZpZnlLaW5kIl0sInZpdmlmeUtpbmRNdWx0aSI6WyJ2aXZpZnlLaW5kTXVsdGkiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAArcdmbcocAADKHAAAMAAAAEBhZ29yaWMvdmF0LWRhdGEtdjAuNC4zL3NyYy92YXQtZGF0YS1iaW5kaW5ncy5qc3siaW1wb3J0cyI6WyJAYWdvcmljL2Fzc2VydCIsIkBhZ29yaWMvc3RvcmUiXSwiZXhwb3J0cyI6WyJNIiwiY2FuQmVEdXJhYmxlIiwiZGVmaW5lRHVyYWJsZUtpbmQiLCJkZWZpbmVEdXJhYmxlS2luZE11bHRpIiwiZGVmaW5lS2luZCIsImRlZmluZUtpbmRNdWx0aSIsIm1ha2VLaW5kSGFuZGxlIiwibWFrZVNjYWxhckJpZ01hcFN0b3JlIiwibWFrZVNjYWxhckJpZ1NldFN0b3JlIiwibWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSIsIm1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUiLCJtYWtlU2NhbGFyTWFwU3RvcmUiLCJtYWtlU2NhbGFyU2V0U3RvcmUiLCJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIiwibWFrZVNjYWxhcldlYWtTZXRTdG9yZSIsInBhcnRpYWxBc3NpZ24iLCJwaWNrRmFjZXQiLCJwcm92aWRlIiwicHJvdmlkZUR1cmFibGVNYXBTdG9yZSIsInByb3ZpZGVEdXJhYmxlU2V0U3RvcmUiLCJwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSIsInByb3ZpZGVQcm9taXNlV2F0Y2hlciIsIndhdGNoUHJvbWlzZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnQsTSxtYWtlU2NhbGFyTWFwU3RvcmUsbWFrZVNjYWxhcldlYWtNYXBTdG9yZSxtYWtlU2NhbGFyU2V0U3RvcmUsbWFrZVNjYWxhcldlYWtTZXRTdG9yZSxwcm92aWRlTGF6eTskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2Fzc2VydFwiLCBbW1wiYXNzZXJ0XCIsIFskaOKAjV9hID0+IChhc3NlcnQgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiTVwiLCBbJGjigI1fYSA9PiAoTSA9ICRo4oCNX2EpLCRo4oCNX2xpdmVbXCJNXCJdXV0sW1wibWFrZVNjYWxhck1hcFN0b3JlXCIsIFskaOKAjV9hID0+IChtYWtlU2NhbGFyTWFwU3RvcmUgPSAkaOKAjV9hKSwkaOKAjV9saXZlW1wibWFrZVNjYWxhck1hcFN0b3JlXCJdXV0sW1wibWFrZVNjYWxhcldlYWtNYXBTdG9yZVwiLCBbJGjigI1fYSA9PiAobWFrZVNjYWxhcldlYWtNYXBTdG9yZSA9ICRo4oCNX2EpLCRo4oCNX2xpdmVbXCJtYWtlU2NhbGFyV2Vha01hcFN0b3JlXCJdXV0sW1wibWFrZVNjYWxhclNldFN0b3JlXCIsIFskaOKAjV9hID0+IChtYWtlU2NhbGFyU2V0U3RvcmUgPSAkaOKAjV9hKSwkaOKAjV9saXZlW1wibWFrZVNjYWxhclNldFN0b3JlXCJdXV0sW1wibWFrZVNjYWxhcldlYWtTZXRTdG9yZVwiLCBbJGjigI1fYSA9PiAobWFrZVNjYWxhcldlYWtTZXRTdG9yZSA9ICRo4oCNX2EpLCRo4oCNX2xpdmVbXCJtYWtlU2NhbGFyV2Vha1NldFN0b3JlXCJdXV0sW1wicHJvdmlkZUxhenlcIiwgWyRo4oCNX2EgPT4gKHByb3ZpZGVMYXp5ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZSB7WGltcG9ydCgnLi90eXBlcycpLlZhdERhdGF9ICovXG5sZXQgVmF0RGF0YUdsb2JhbDtcbmlmKCdWYXREYXRhJ2luIGdsb2JhbFRoaXMpe1xuYXNzZXJ0KGdsb2JhbFRoaXMuVmF0RGF0YSwnVmF0RGF0YSBkZWZpbmVkIGluIGdsb2JhbCBhcyBudWxsIG9yIHVuZGVmaW5lZCcpO1xuVmF0RGF0YUdsb2JhbD1nbG9iYWxUaGlzLlZhdERhdGE7XG4gfWVsc2V7XG4vKiBYWFggdGhpcyBtb2R1bGUgaGFzIGJlZW4ga25vd24gdG8gZ2V0IGltcG9ydGVkICh0cmFuc2l0aXZlbHkpIGluIGNhc2VzIHRoYXQqL1xuLyogbmV2ZXIgdXNlIGl0IHNvIHdlIG1ha2UgYSB2ZXJzaW9uIHRoYXQgd2lsbCBzYXRpc2Z5IG1vZHVsZSByZXNvbHV0aW9uIGJ1dCovXG4vKiBmYWlsIGF0IHJ1bnRpbWUuKi9cbmNvbnN0IHVudmFpbGFibGU9KCk9PmFzc2VydC5mYWlsKCdWYXREYXRhIHVuYXZhaWxhYmxlJyk7XG5WYXREYXRhR2xvYmFsPXtcbmRlZmluZUtpbmQ6dW52YWlsYWJsZSxcbmRlZmluZUtpbmRNdWx0aTp1bnZhaWxhYmxlLFxuZGVmaW5lRHVyYWJsZUtpbmQ6dW52YWlsYWJsZSxcbmRlZmluZUR1cmFibGVLaW5kTXVsdGk6dW52YWlsYWJsZSxcbm1ha2VLaW5kSGFuZGxlOnVudmFpbGFibGUsXG5wcm92aWRlUHJvbWlzZVdhdGNoZXI6dW52YWlsYWJsZSxcbndhdGNoUHJvbWlzZTp1bnZhaWxhYmxlLFxubWFrZVNjYWxhckJpZ01hcFN0b3JlOnVudmFpbGFibGUsXG5tYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlOnVudmFpbGFibGUsXG5tYWtlU2NhbGFyQmlnU2V0U3RvcmU6dW52YWlsYWJsZSxcbm1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmU6dW52YWlsYWJsZSxcbmNhbkJlRHVyYWJsZTp1bnZhaWxhYmxlfTtcblxuIH1cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgRmFyQ2xhc3Nlcy9GYXJJbnN0YW5jZXMgaW5zdGVhZCBvZiBraW5kc1xuICovXG5jb25zdCAgICAgICB7XG5kZWZpbmVLaW5kLFxuZGVmaW5lS2luZE11bHRpLFxuZGVmaW5lRHVyYWJsZUtpbmQsXG5kZWZpbmVEdXJhYmxlS2luZE11bHRpfT1cblZhdERhdGFHbG9iYWw7JGjigI1fb25jZS5kZWZpbmVLaW5kKGRlZmluZUtpbmQpOyRo4oCNX29uY2UuZGVmaW5lS2luZE11bHRpKGRlZmluZUtpbmRNdWx0aSk7JGjigI1fb25jZS5kZWZpbmVEdXJhYmxlS2luZChkZWZpbmVEdXJhYmxlS2luZCk7JGjigI1fb25jZS5kZWZpbmVEdXJhYmxlS2luZE11bHRpKGRlZmluZUR1cmFibGVLaW5kTXVsdGkpO1xuXG5jb25zdCAgICAgICB7XG5tYWtlS2luZEhhbmRsZSxcbnByb3ZpZGVQcm9taXNlV2F0Y2hlcixcbndhdGNoUHJvbWlzZSxcbm1ha2VTY2FsYXJCaWdNYXBTdG9yZSxcbm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUsXG5tYWtlU2NhbGFyQmlnU2V0U3RvcmUsXG5tYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlLFxuY2FuQmVEdXJhYmxlfT1cblZhdERhdGFHbG9iYWw7XG5cbi8qKlxuICogV2hlbiBtYWtpbmcgYSBtdWx0aS1mYWNldCBraW5kLCBpdCdzIGNvbW1vbiB0byBwaWNrIG9uZSBmYWNldCB0byBleHBvc2UuIEUuZy4sXG4gKlxuICogICAgIGNvbnN0IG1ha2VGb28gPSAoYSwgYiwgYywgZCkgPT4gbWFrZUZvb0Jhc2UoYSwgYiwgYywgZCkuc2VsZjtcbiAqXG4gKiBUaGlzIGhlbHBlciByZWR1Y2VzIHRoZSBkdXBsaWNhdGlvbjpcbiAqXG4gKiAgICAgY29uc3QgbWFrZUZvbyA9IHBpY2tGYWNldChtYWtlRm9vQmFzZSwgJ3NlbGYnKTtcbiAqXG4gKiBAdHlwZSB7WGltcG9ydCgnLi90eXBlcycpLlBpY2tGYWNldH1cbiAqLyRo4oCNX29uY2UubWFrZUtpbmRIYW5kbGUobWFrZUtpbmRIYW5kbGUpOyRo4oCNX29uY2UucHJvdmlkZVByb21pc2VXYXRjaGVyKHByb3ZpZGVQcm9taXNlV2F0Y2hlcik7JGjigI1fb25jZS53YXRjaFByb21pc2Uod2F0Y2hQcm9taXNlKTskaOKAjV9vbmNlLm1ha2VTY2FsYXJCaWdNYXBTdG9yZShtYWtlU2NhbGFyQmlnTWFwU3RvcmUpOyRo4oCNX29uY2UubWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZShtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlKTskaOKAjV9vbmNlLm1ha2VTY2FsYXJCaWdTZXRTdG9yZShtYWtlU2NhbGFyQmlnU2V0U3RvcmUpOyRo4oCNX29uY2UubWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZShtYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlKTskaOKAjV9vbmNlLmNhbkJlRHVyYWJsZShjYW5CZUR1cmFibGUpO1xuY29uc3QgICAgICAgIHBpY2tGYWNldD1cbihtYWtlcixmYWNldE5hbWUpPT5cbiguLi5hcmdzKT0+XG5tYWtlciguLi5hcmdzKVtmYWNldE5hbWVdOyRo4oCNX29uY2UucGlja0ZhY2V0KHBpY2tGYWNldCk7XG5oYXJkZW4ocGlja0ZhY2V0KTtcblxuLyoqXG4gKiBBc3NpZ24gdGhlIHZhbHVlcyBvZiBhbGwgb2YgdGhlIGVudW1lcmFibGUgb3duIHByb3BlcnRpZXMgZnJvbSB0aGUgc291cmNlXG4gKiBvYmplY3QgdG8gdGhlaXIga2V5cyBpbiB0aGUgdGFyZ2V0IG9iamVjdC5cbiAqXG4gKiBAdGVtcGxhdGUge3t9fSBUXG4gKiBAcGFyYW0ge1R9IHRhcmdldFxuICogQHBhcmFtIHtQYXJ0aWFsPFQ+fSBzb3VyY2VcbiAqL1xuY29uc3QgICAgICAgIHBhcnRpYWxBc3NpZ249KHRhcmdldCxzb3VyY2UpPT57XG5PYmplY3QuYXNzaWduKHRhcmdldCxzb3VyY2UpO1xuIH07JGjigI1fb25jZS5wYXJ0aWFsQXNzaWduKHBhcnRpYWxBc3NpZ24pO1xuaGFyZGVuKHBhcnRpYWxBc3NpZ24pO1xuXG4vKipcbiAqIFVubGlrZSBgcHJvdmlkZUxhenlgLCBgcHJvdmlkZWAgc2hvdWxkIGJlIGNhbGxlZCBhdCBtb3N0IG9uY2VcbiAqIHdpdGhpbiBhbnkgdmF0IGluY2FybmF0aW9uIHdpdGggYSBnaXZlbiBgYmFnZ2FnZWAsYGtleWAgcGFpci5cbiAqXG4gKiBgcHJvdmlkZWAgc2hvdWxkIG9ubHkgdG8gYmUgdXNlZCB0byBwb3B1bGF0ZSBiYWdnYWdlLFxuICogd2hlcmUgdGhlIHRvdGFsIG51bWJlciBvZiBjYWxscyB0byBgcHJvdmlkZWAgbXVzdCBiZVxuICogbG93IGNhcmRpbmFsaXR5LCBzaW5jZSB3ZSBrZWVwIHRoZSBib29ra2VlcGluZyB0byBkZXRlY3QgY29sbGlzaW9uc1xuICogaW4gbm9ybWFsIGxhbmd1YWdlLWhlYXAgbWVtb3J5LiBBbGwgdGhlIG90aGVyIGJhZ2dhZ2Utb3JpZW50ZWRcbiAqIGBwcm92aWRlKmAgYW5kIGB2aXZpZnkqYCBmdW5jdGlvbnMgY2FsbCBgcHJvdmlkZWAsXG4gKiBhbmQgc28gaW1wb3NlIHRoZSBzYW1lIGNvbnN0cmFpbnRzLiBUaGlzIGlzIGNvbnNpc3RlbnQgd2l0aFxuICogb3VyIGV4cGVjdGVkIGR1cmFiaWxpdHkgcGF0dGVybnM6IFdoYXQgd2Ugc3RvcmUgaW4gYmFnZ2FnZSBhcmVcbiAqICAgICoga2luZEhhbmRsZXMsIHdoaWNoIGFyZSBwZXIga2luZCwgd2hpY2ggbXVzdCBiZSBsb3cgY2FyZGluYWxpdHlcbiAqICAgICogZGF0YSBcInZhcmlhYmxlc1wiIGZvciByZWVzdGFibGlzaGluZyB0aGUgbGV4aWNhbCBzY29wZSwgZXNwZWNpYWxseVxuICogICAgICBvZiBzaW5nbGV0b25zXG4gKiAgICAqIG5hbWVkIG5vbi1iYWdnYWdlIGNvbGxlY3Rpb25zIGF0IHRoZSBsZWF2ZXMgb2YgdGhlIGJhZ2dhZ2UgdHJlZS5cbiAqXG4gKiBXaGF0IGlzIGV4cGVjdGVkIHRvIGJlIGhpZ2ggY2FyZGluYWxpdHkgYXJlIHRoZSBpbnN0YW5jZXMgb2YgdGhlIGtpbmRzLFxuICogYW5kIHRoZSBtZW1iZXJzIG9mIHRoZSBub24tYmFnZ2dhZ2UgY29sbGVjdGlvbnMuXG4gKlxuICogVE9ETyBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvcHVsbC81ODc1IDpcbiAqIEltcGxlbWVudCBkZXZlbG9wbWVudC10aW1lIGluc3RydW1lbnRhdGlvbiB0byBkZXRlY3Qgd2hlblxuICogYHByb3ZpZGVgIHZpb2xhdGVzIHRoZSBhYm92ZSBwcmVzY3JpcHRpb24sIGFuZCBpcyBjYWxsZWQgbW9yZVxuICogdGhhbiBvbmUgaW4gdGhlIHNhbWUgdmF0IGluY2FybmF0aW9uIHdpdGggdGhlIHNhbWVcbiAqIGJhZ2dhZ2Usa2V5IHBhaXIuXG4gKlxuICogQHRlbXBsYXRlIEssVlxuICogQHBhcmFtIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtLfSBrZXlcbiAqIEBwYXJhbSB7KGtleTogSykgPT4gVn0gbWFrZVZhbHVlXG4gKiBAcmV0dXJucyB7Vn1cbiAqL1xuY29uc3QgICAgICAgIHByb3ZpZGU9cHJvdmlkZUxhenk7JGjigI1fb25jZS5wcm92aWRlKHByb3ZpZGUpO1xuXG5jb25zdCAgICAgICAgcHJvdmlkZUR1cmFibGVNYXBTdG9yZT0oYmFnZ2FnZSxuYW1lKT0+XG5wcm92aWRlKGJhZ2dhZ2UsbmFtZSwoKT0+bWFrZVNjYWxhckJpZ01hcFN0b3JlKG5hbWUse2R1cmFibGU6dHJ1ZX0pKTskaOKAjV9vbmNlLnByb3ZpZGVEdXJhYmxlTWFwU3RvcmUocHJvdmlkZUR1cmFibGVNYXBTdG9yZSk7XG5oYXJkZW4ocHJvdmlkZUR1cmFibGVNYXBTdG9yZSk7XG5cbmNvbnN0ICAgICAgICBwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZT0oYmFnZ2FnZSxuYW1lKT0+XG5wcm92aWRlKGJhZ2dhZ2UsbmFtZSwoKT0+XG5tYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlKG5hbWUse2R1cmFibGU6dHJ1ZX0pKTskaOKAjV9vbmNlLnByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlKHByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlKTtcblxuaGFyZGVuKHByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlKTtcblxuY29uc3QgICAgICAgIHByb3ZpZGVEdXJhYmxlU2V0U3RvcmU9KGJhZ2dhZ2UsbmFtZSk9PlxucHJvdmlkZShiYWdnYWdlLG5hbWUsKCk9Pm1ha2VTY2FsYXJCaWdTZXRTdG9yZShuYW1lLHtkdXJhYmxlOnRydWV9KSk7JGjigI1fb25jZS5wcm92aWRlRHVyYWJsZVNldFN0b3JlKHByb3ZpZGVEdXJhYmxlU2V0U3RvcmUpO1xuaGFyZGVuKHByb3ZpZGVEdXJhYmxlU2V0U3RvcmUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7Ik0iOlsiTSIsZmFsc2VdLCJtYWtlU2NhbGFyTWFwU3RvcmUiOlsibWFrZVNjYWxhck1hcFN0b3JlIixmYWxzZV0sIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmUiOlsibWFrZVNjYWxhcldlYWtNYXBTdG9yZSIsZmFsc2VdLCJtYWtlU2NhbGFyU2V0U3RvcmUiOlsibWFrZVNjYWxhclNldFN0b3JlIixmYWxzZV0sIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmUiOlsibWFrZVNjYWxhcldlYWtTZXRTdG9yZSIsZmFsc2VdfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZmluZUtpbmQiOlsiZGVmaW5lS2luZCJdLCJkZWZpbmVLaW5kTXVsdGkiOlsiZGVmaW5lS2luZE11bHRpIl0sImRlZmluZUR1cmFibGVLaW5kIjpbImRlZmluZUR1cmFibGVLaW5kIl0sImRlZmluZUR1cmFibGVLaW5kTXVsdGkiOlsiZGVmaW5lRHVyYWJsZUtpbmRNdWx0aSJdLCJtYWtlS2luZEhhbmRsZSI6WyJtYWtlS2luZEhhbmRsZSJdLCJwcm92aWRlUHJvbWlzZVdhdGNoZXIiOlsicHJvdmlkZVByb21pc2VXYXRjaGVyIl0sIndhdGNoUHJvbWlzZSI6WyJ3YXRjaFByb21pc2UiXSwibWFrZVNjYWxhckJpZ01hcFN0b3JlIjpbIm1ha2VTY2FsYXJCaWdNYXBTdG9yZSJdLCJtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlIjpbIm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUiXSwibWFrZVNjYWxhckJpZ1NldFN0b3JlIjpbIm1ha2VTY2FsYXJCaWdTZXRTdG9yZSJdLCJtYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlIjpbIm1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUiXSwiY2FuQmVEdXJhYmxlIjpbImNhbkJlRHVyYWJsZSJdLCJwaWNrRmFjZXQiOlsicGlja0ZhY2V0Il0sInBhcnRpYWxBc3NpZ24iOlsicGFydGlhbEFzc2lnbiJdLCJwcm92aWRlIjpbInByb3ZpZGUiXSwicHJvdmlkZUR1cmFibGVNYXBTdG9yZSI6WyJwcm92aWRlRHVyYWJsZU1hcFN0b3JlIl0sInByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlIjpbInByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlIl0sInByb3ZpZGVEdXJhYmxlU2V0U3RvcmUiOlsicHJvdmlkZUR1cmFibGVTZXRTdG9yZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB8VWrpmwMAAJsDAAAfAAAAQGFnb3JpYy96b2UtdjAuMjUuMy9leHBvcnRlZC5qc3siaW1wb3J0cyI6WyIuL3NyYy9jb250cmFjdEZhY2V0L3R5cGVzLmpzIiwiLi9zcmMvY29udHJhY3RTdXBwb3J0L3R5cGVzLmpzIiwiLi9zcmMvY29udHJhY3RzL2V4cG9ydGVkLmpzIiwiLi9zcmMvdHlwZXMuanMiLCIuL3NyYy96b2VTZXJ2aWNlL3R5cGVzLmpzIiwiLi90b29scy90eXBlcy5qcyIsIkBhZ29yaWMvZXJ0cC9leHBvcnRlZC5qcyIsIkBhZ29yaWMvbm90aWZpZXIvZXhwb3J0ZWQuanMiLCJAYWdvcmljL3N0b3JlL2V4cG9ydGVkLmpzIiwiQGFnb3JpYy9zd2luZ3NldC12YXQvZXhwb3J0ZWQuanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9zcmMvY29udHJhY3RGYWNldC90eXBlcy5qc1wiLCBbXV0sW1wiLi9zcmMvem9lU2VydmljZS90eXBlcy5qc1wiLCBbXV0sW1wiLi9zcmMvY29udHJhY3RTdXBwb3J0L3R5cGVzLmpzXCIsIFtdXSxbXCIuL3NyYy9jb250cmFjdHMvZXhwb3J0ZWQuanNcIiwgW11dLFtcIi4vc3JjL3R5cGVzLmpzXCIsIFtdXSxbXCIuL3Rvb2xzL3R5cGVzLmpzXCIsIFtdXSxbXCJAYWdvcmljL25vdGlmaWVyL2V4cG9ydGVkLmpzXCIsIFtdXSxbXCJAYWdvcmljL2VydHAvZXhwb3J0ZWQuanNcIiwgW11dLFtcIkBhZ29yaWMvc3RvcmUvZXhwb3J0ZWQuanNcIiwgW11dLFtcIkBhZ29yaWMvc3dpbmdzZXQtdmF0L2V4cG9ydGVkLmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACGw0MSYyUAAGMlAAAuAAAAQGFnb3JpYy96b2UtdjAuMjUuMy9zcmMvY29udHJhY3RGYWNldC90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qLyA8cmVmZXJlbmNlIHR5cGVzPVwic2VzXCIvPiovXG5cbi8qIFhYWCBjYW4gYmUgdGlnaHRlciB0aGFuICdhbnknKi9cbi8qKlxuICogQHR5cGVkZWYge2FueX0gQ29tcGxldGlvblxuICogQW55IHBhc3NhYmxlIG5vbi10aGVuYWJsZS4gT2Z0ZW4gYW4gZXhwbGFuYXRvcnkgc3RyaW5nLlxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFpDRk1ha2VFbXB0eVNlYXRLaXRcbiAqIEBwYXJhbSB7RXhpdFJ1bGU9fSBleGl0XG4gKiBAcmV0dXJucyB7WmNmU2VhdEtpdH1cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7b2JqZWN0fSBbQ1Q9UmVjb3JkPHN0cmluZywgdW5rbm93bj5dIENvbnRyYWN0J3MgY3VzdG9tIHRlcm1zXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBaQ0YgWm9lIENvbnRyYWN0IEZhY2V0XG4gKlxuICogVGhlIFpvZSBpbnRlcmZhY2Ugc3BlY2lmaWMgdG8gYSBjb250cmFjdCBpbnN0YW5jZS4gVGhlIFpvZSBDb250cmFjdFxuICogRmFjZXQgaXMgYW4gQVBJIG9iamVjdCB1c2VkIGJ5IHJ1bm5pbmcgY29udHJhY3QgaW5zdGFuY2VzIHRvIGFjY2Vzc1xuICogdGhlIFpvZSBzdGF0ZSBmb3IgdGhhdCBpbnN0YW5jZS4gVGhlIFpvZSBDb250cmFjdCBGYWNldCBpcyBhY2Nlc3NlZFxuICogc3luY2hyb25vdXNseSBmcm9tIHdpdGhpbiB0aGUgY29udHJhY3QsIGFuZCB1c3VhbGx5IGlzIHJlZmVycmVkIHRvXG4gKiBpbiBjb2RlIGFzIHpjZi5cbiAqXG4gKiBAcHJvcGVydHkge1JlYWxsb2NhdGV9IHJlYWxsb2NhdGUgLSByZWFsbG9jYXRlIGFtb3VudHMgYW1vbmcgc2VhdHMuXG4gKiBEZXByZWNhdGVkOiBVc2UgYXRvbWljUmVhcnJhbmdlIGluc3RlYWQuXG4gKiBAcHJvcGVydHkgeyhrZXl3b3JkOiBLZXl3b3JkKSA9PiB2b2lkfSBhc3NlcnRVbmlxdWVLZXl3b3JkIC0gY2hlY2tcbiAqIHdoZXRoZXIgYSBrZXl3b3JkIGlzIHZhbGlkIGFuZCB1bmlxdWUgYW5kIGNvdWxkIGJlIGFkZGVkIGluXG4gKiBgc2F2ZUlzc3VlcmBcbiAqIEBwcm9wZXJ0eSB7U2F2ZUlzc3Vlcn0gc2F2ZUlzc3VlciAtIHNhdmUgYW4gaXNzdWVyIHRvIFpDRiBhbmQgWm9lXG4gKiBhbmQgZ2V0IHRoZSBBbW91bnRNYXRoIGFuZCBicmFuZCBzeW5jaHJvbm91c2x5IGFjY2Vzc2libGUgYWZ0ZXJcbiAqIHNhdmluZ1xuICogQHByb3BlcnR5IHtNYWtlSW52aXRhdGlvbn0gbWFrZUludml0YXRpb25cbiAqIEBwcm9wZXJ0eSB7KGNvbXBsZXRpb246IENvbXBsZXRpb24pID0+IHZvaWR9IHNodXRkb3duXG4gKiBAcHJvcGVydHkge1NodXRkb3duV2l0aEZhaWx1cmV9IHNodXRkb3duV2l0aEZhaWx1cmVcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gRVJlZjxab2VTZXJ2aWNlPn0gZ2V0Wm9lU2VydmljZVxuICogQHByb3BlcnR5IHsoKSA9PiBJc3N1ZXI8J3NldCc+fSBnZXRJbnZpdGF0aW9uSXNzdWVyXG4gKiBAcHJvcGVydHkgeygpID0+IFN0YW5kYXJkVGVybXMgJiBDVH0gZ2V0VGVybXNcbiAqIEBwcm9wZXJ0eSB7PEsgZXh0ZW5kcyBBc3NldEtpbmQ+KGlzc3VlcjogSXNzdWVyPEs+KSA9PiBCcmFuZDxLPn0gZ2V0QnJhbmRGb3JJc3N1ZXJcbiAqIEBwcm9wZXJ0eSB7PEsgZXh0ZW5kcyBBc3NldEtpbmQ+KGJyYW5kOiBCcmFuZDxLPikgPT4gSXNzdWVyPEs+fSBnZXRJc3N1ZXJGb3JCcmFuZFxuICogQHByb3BlcnR5IHtHZXRBc3NldEtpbmRCeUJyYW5kfSBnZXRBc3NldEtpbmRcbiAqIEBwcm9wZXJ0eSB7PEsgZXh0ZW5kcyBBc3NldEtpbmQgPSAnbmF0Jz4oa2V5d29yZDogS2V5d29yZCwgYXNzZXRLaW5kPzogSywgZGlzcGxheUluZm8/OiBBZGRpdGlvbmFsRGlzcGxheUluZm8pID0+IFByb21pc2U8WkNGTWludDxLPj59IG1ha2VaQ0ZNaW50XG4gKiBAcHJvcGVydHkge1pDRlJlZ2lzdGVyRmVlTWludH0gcmVnaXN0ZXJGZWVNaW50XG4gKiBAcHJvcGVydHkge1pDRk1ha2VFbXB0eVNlYXRLaXR9IG1ha2VFbXB0eVNlYXRLaXRcbiAqIEBwcm9wZXJ0eSB7U2V0VGVzdEppZ30gc2V0VGVzdEppZ1xuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPHZvaWQ+fSBzdG9wQWNjZXB0aW5nT2ZmZXJzXG4gKiBAcHJvcGVydHkgeyhzdHJpbmdzOiBBcnJheTxzdHJpbmc+KSA9PiB2b2lkfSBzZXRPZmZlckZpbHRlclxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPEFycmF5PHN0cmluZz4+fSBnZXRPZmZlckZpbHRlclxuICogQHByb3BlcnR5IHsoKSA9PiBJbnN0YW5jZX0gZ2V0SW5zdGFuY2VcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoc2VhdDE6IFpDRlNlYXQsIHNlYXQyOiBaQ0ZTZWF0LCAuLi5zZWF0UmVzdDpcbiAqIEFycmF5PFpDRlNlYXQ+KSA9PiB2b2lkfSBSZWFsbG9jYXRlXG4gKlxuICogVGhlIGNvbnRyYWN0IGNhbiByZWFsbG9jYXRlIG92ZXIgc2VhdHMsIHdoaWNoIGNvbW1pdHMgdGhlIHN0YWdlZFxuICogYWxsb2NhdGlvbiBmb3IgZWFjaCBzZWF0LiBPbiBjb21taXQsIHRoZSBzdGFnZWQgYWxsb2NhdGlvbiBiZWNvbWVzXG4gKiB0aGUgY3VycmVudCBhbGxvY2F0aW9uIGFuZCB0aGUgc3RhZ2VkIGFsbG9jYXRpb24gaXMgZGVsZXRlZC5cbiAqXG4gKiBUaGUgcmVhbGxvY2F0aW9uIHdpbGwgb25seSBzdWNjZWVkIGlmIHRoZSByZWFsbG9jYXRpb24gMSkgY29uc2VydmVzXG4gKiByaWdodHMgKHRoZSBhbW91bnRzIHNwZWNpZmllZCBoYXZlIHRoZSBzYW1lIHRvdGFsIHZhbHVlIGFzIHRoZVxuICogY3VycmVudCB0b3RhbCBhbW91bnQpLCBhbmQgMikgaXMgJ29mZmVyLXNhZmUnIGZvciBhbGwgcGFydGllc1xuICogaW52b2x2ZWQuIEFsbCBzZWF0cyB0aGF0IGhhdmUgc3RhZ2VkIGFsbG9jYXRpb25zIG11c3QgYmUgaW5jbHVkZWRcbiAqIGFzIGFyZ3VtZW50cyB0byBgcmVhbGxvY2F0ZWAsIG9yIGFuIGVycm9yIGlzIHRocm93bi4gQWRkaXRpb25hbGx5LFxuICogYW4gZXJyb3IgaXMgdGhyb3duIGlmIGFueSBzZWF0cyBpbmNsdWRlZCBpbiBgcmVhbGxvY2F0ZWAgZG8gbm90XG4gKiBoYXZlIGEgc3RhZ2VkIGFsbG9jYXRpb24uXG4gKlxuICogVGhlIHJlYWxsb2NhdGlvbiBpcyBwYXJ0aWFsLCBtZWFuaW5nIHRoYXQgaXQgYXBwbGllcyBvbmx5IHRvIHRoZVxuICogc2VhdHMgcGFzc2VkIGluIGFzIGFyZ3VtZW50cy4gQnkgaW5kdWN0aW9uLCBpZiByaWdodHMgY29uc2VydmF0aW9uXG4gKiBhbmQgb2ZmZXIgc2FmZXR5IGhvbGQgYmVmb3JlLCB0aGV5IHdpbGwgaG9sZCBhZnRlciBhIHNhZmVcbiAqIHJlYWxsb2NhdGlvbiwgZXZlbiB0aG91Z2ggd2Ugb25seSByZS12YWxpZGF0ZSBmb3IgdGhlIHNlYXRzIHdob3NlXG4gKiBhbGxvY2F0aW9ucyB3aWxsIGNoYW5nZS4gU2luY2UgcmlnaHRzIGFyZSBjb25zZXJ2ZWQgZm9yIHRoZSBjaGFuZ2UsXG4gKiBvdmVyYWxsIHJpZ2h0cyB3aWxsIGJlIHVuY2hhbmdlZCwgYW5kIGEgcmVhbGxvY2F0aW9uIGNhbiBvbmx5XG4gKiBlZmZlY3Qgb2ZmZXIgc2FmZXR5IGZvciBzZWF0cyB3aG9zZSBhbGxvY2F0aW9ucyBjaGFuZ2UuXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgU2F2ZUlzc3VlclxuICpcbiAqIEluZm9ybXMgWm9lIGFib3V0IGFuIGlzc3VlciBhbmQgcmV0dXJucyBhIHByb21pc2UgZm9yIGFja25vd2xlZGdpbmdcbiAqIHdoZW4gdGhlIGlzc3VlciBpcyBhZGRlZCBhbmQgcmVhZHkuXG4gKlxuICogQHBhcmFtIHtFUmVmPElzc3Vlcj59IGlzc3VlclAgUHJvbWlzZSBmb3IgaXNzdWVyXG4gKiBAcGFyYW0ge0tleXdvcmR9IGtleXdvcmQgS2V5d29yZCBmb3IgYWRkZWQgaXNzdWVyXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxJc3N1ZXJSZWNvcmQ8Kj4+fSBJc3N1ZXIgaXMgYWRkZWQgYW5kIHJlYWR5XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7PFJlc3VsdD4oXG4gKiAgIG9mZmVySGFuZGxlcjogT2ZmZXJIYW5kbGVyPFJlc3VsdD4sXG4gKiAgIGRlc2NyaXB0aW9uOiBzdHJpbmcsXG4gKiAgIGN1c3RvbVByb3BlcnRpZXM/OiBvYmplY3QsXG4gKiAgIHByb3Bvc2FsU2hhcGU/OiBQYXR0ZXJuLFxuICogKSA9PiBQcm9taXNlPEludml0YXRpb248QXdhaXRlZDxSZXN1bHQ+Pj5cbiAqIH0gTWFrZUludml0YXRpb25cbiAqXG4gKiBNYWtlIGEgY3JlZGlibGUgWm9lIGludml0YXRpb24gZm9yIGEgcGFydGljdWxhciBzbWFydCBjb250cmFjdFxuICogaW5kaWNhdGVkIGJ5IHRoZSBgaW5zdGFuY2VgIGluIHRoZSBkZXRhaWxzIG9mIHRoZSBpbnZpdGF0aW9uLiBab2VcbiAqIGFsc28gcHV0cyB0aGUgYGluc3RhbGxhdGlvbmAgYW5kIGEgdW5pcXVlIGBoYW5kbGVgIGluIHRoZSBkZXRhaWxzXG4gKiBvZiB0aGUgaW52aXRhdGlvbi4gVGhlIGNvbnRyYWN0IG11c3QgcHJvdmlkZSBhIGBkZXNjcmlwdGlvbmAgZm9yXG4gKiB0aGUgaW52aXRhdGlvbiBhbmQgc2hvdWxkIGluY2x1ZGUgd2hhdGV2ZXIgaW5mb3JtYXRpb24gaXMgbmVjZXNzYXJ5XG4gKiBmb3IgYSBwb3RlbnRpYWwgYnV5ZXIgb2YgdGhlIGludml0YXRpb24gdG8ga25vdyB3aGF0IHRoZXkgYXJlXG4gKiBnZXR0aW5nIGluIHRoZSBgY3VzdG9tUHJvcGVydGllc2AuIGBjdXN0b21Qcm9wZXJ0aWVzYCB3aWxsIGJlXG4gKiBwbGFjZWQgaW4gdGhlIGRldGFpbHMgb2YgdGhlIGludml0YXRpb24uXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgWkNGUmVnaXN0ZXJGZWVNaW50XG4gKiBAcGFyYW0ge0tleXdvcmR9IGtleXdvcmRcbiAqIEBwYXJhbSB7RmVlTWludEFjY2Vzc30gYWxsZWdlZEZlZU1pbnRBY2Nlc3MgLSBhbiBvYmplY3QgdGhhdFxuICogcHVycG9ydHMgdG8gYmUgdGhlIG9iamVjdCB0aGF0IGdyYW50cyBhY2Nlc3MgdG8gdGhlIGZlZSBtaW50XG4gKiBAcmV0dXJucyB7UHJvbWlzZTxaQ0ZNaW50PCduYXQnPj59XG4gKi9cblxuLyoqXG4gKiBQcm92aWRlIGEgamlnIG9iamVjdCBmb3IgdGVzdGluZyBwdXJwb3NlcyBvbmx5LlxuICpcbiAqIFRoZSBjb250cmFjdCBjb2RlIHByb3ZpZGVzIGEgY2FsbGJhY2sgd2hvc2UgcmV0dXJuIHJlc3VsdCB3aWxsXG4gKiBiZSBtYWRlIGF2YWlsYWJsZSB0byB0aGUgdGVzdCB0aGF0IHN0YXJ0ZWQgdGhpcyBjb250cmFjdC4gVGhlXG4gKiBzdXBwbGllZCBjYWxsYmFjayB3aWxsIG9ubHkgYmUgY2FsbGVkIGluIGEgdGVzdGluZyBjb250ZXh0LFxuICogbmV2ZXIgaW4gcHJvZHVjdGlvbjsgaS5lLiwgaXQgaXMgb25seSBjYWxsZWQgaWYgYHRlc3RKaWdTZXR0ZXJgXG4gKiB3YXMgc3VwcGxpZWQuXG4gKlxuICogSWYgbm8sIGB0ZXN0Rm5gIGlzIHN1cHBsaWVkLCB0aGVuIGFuIGVtcHR5IGppZyB3aWxsIGJlIHVzZWQuXG4gKiBBbiBhZGRpdGlvbmFsIGB6Y2ZgIHByb3BlcnR5IHNldCB0byB0aGUgY3VycmVudCBDb250cmFjdEZhY2V0XG4gKiB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSByZXR1cm5lZCBqaWcgb2JqZWN0IChvdmVycmlkaW5nIGFueVxuICogcHJvdmlkZWQgYnkgdGhlIGB0ZXN0Rm5gKS5cbiAqXG4gKiBAY2FsbGJhY2sgU2V0VGVzdEppZ1xuICogQHBhcmFtIHsoKSA9PiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gdGVzdEZuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBaQ0ZNaW50TWludEdhaW5zXG4gKiBAcGFyYW0ge0Ftb3VudEtleXdvcmRSZWNvcmR9IGdhaW5zXG4gKiBAcGFyYW0ge1pDRlNlYXQ9fSB6Y2ZTZWF0XG4gKiBAcmV0dXJucyB7WkNGU2VhdH1cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBaQ0ZNaW50XG4gKiBAcHJvcGVydHkgeygpID0+IElzc3VlclJlY29yZDxLPn0gZ2V0SXNzdWVyUmVjb3JkXG4gKiBAcHJvcGVydHkge1pDRk1pbnRNaW50R2FpbnN9IG1pbnRHYWluc1xuICogQWxsIHRoZSBhbW91bnRzIGluIGdhaW5zIG11c3QgYmUgb2YgdGhpcyBaQ0ZNaW50J3MgYnJhbmQuXG4gKiBUaGUgZ2FpbnMnIGtleXdvcmRzIGFyZSBpbiB0aGUgbmFtZXNwYWNlIG9mIHRoYXQgc2VhdC5cbiAqIEFkZCB0aGUgZ2FpbnMgdG8gdGhhdCBzZWF0J3MgYWxsb2NhdGlvbi5cbiAqIFRoZSByZXN1bHRpbmcgc3RhdGUgbXVzdCBiZSBvZmZlciBzYWZlLiAoQ3VycmVudGx5LCBpbmNyZWFzaW5nIGFzc2V0cyBjYW5cbiAqIG5ldmVyIHZpb2xhdGUgb2ZmZXIgc2FmZXR5IGFueXdheS4pXG4gKlxuICogTWludCB0aGF0IGFtb3VudCBvZiBhc3NldHMgaW50byB0aGUgcG9vbGVkIHB1cnNlLlxuICogSWYgYSBzZWF0IGlzIHByb3ZpZGVkLCBpdCBpcyByZXR1cm5lZC4gT3RoZXJ3aXNlIGEgbmV3IHNlYXQgaXNcbiAqIHJldHVybmVkLlxuICogVE9ETyB1bmltcGxlbWVudGVkXG4gKiBUaGlzIGNyZWF0aW9uLW9uLWRlbWFuZCBpcyBub3QgeWV0IGltcGxlbWVudGVkLlxuICpcbiAqIEBwcm9wZXJ0eSB7KGxvc3NlczogQW1vdW50S2V5d29yZFJlY29yZCxcbiAqICAgICAgICAgICAgIHpjZlNlYXQ6IFpDRlNlYXQsXG4gKiAgICAgICAgICAgICkgPT4gdm9pZH0gYnVybkxvc3Nlc1xuICogQWxsIHRoZSBhbW91bnRzIGluIGxvc3NlcyBtdXN0IGJlIG9mIHRoaXMgWkNGTWludCdzIGJyYW5kLlxuICogVGhlIGxvc3Nlcycga2V5d29yZHMgYXJlIGluIHRoZSBuYW1lc3BhY2Ugb2YgdGhhdCBzZWF0LlxuICogU3VidHJhY3QgbG9zc2VzIGZyb20gdGhhdCBzZWF0J3MgYWxsb2NhdGlvbi5cbiAqIFRoZSByZXN1bHRpbmcgc3RhdGUgbXVzdCBiZSBvZmZlciBzYWZlLlxuICpcbiAqIEJ1cm4gdGhhdCBhbW91bnQgb2YgYXNzZXRzIGZyb20gdGhlIHBvb2xlZCBwdXJzZS5cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBaQ0ZTZWF0RmFpbFxuICpcbiAqIGZhaWwgY2FsbGVkIHdpdGggdGhlIHJlYXNvbiBmb3IgdGhpcyBmYWlsdXJlLCB3aGVyZSByZWFzb24gaXNcbiAqIG5vcm1hbGx5IGFuIGluc3RhbmNlb2YgRXJyb3IuXG4gKiBAcGFyYW0ge0Vycm9yfSByZWFzb25cbiAqIEByZXR1cm5zIHtFcnJvcn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBaQ0ZHZXRBbW91bnRBbGxvY2F0ZWRcbiAqIFRoZSBicmFuZCBpcyB1c2VkIGZvciBmaWxsaW5nIGluIGFuIGVtcHR5IGFtb3VudCBpZiB0aGUgYGtleXdvcmRgXG4gKiBpcyBub3QgcHJlc2VudCBpbiB0aGUgYWxsb2NhdGlvblxuICogQHBhcmFtIHtLZXl3b3JkfSBrZXl3b3JkXG4gKiBAcGFyYW0ge0JyYW5kPX0gYnJhbmRcbiAqIEByZXR1cm5zIHtBbW91bnQ8YW55Pn1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFpDRlNlYXRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gdm9pZH0gZXhpdFxuICogQHByb3BlcnR5IHtaQ0ZTZWF0RmFpbH0gZmFpbFxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPFN1YnNjcmliZXI8QWxsb2NhdGlvbj4+fSBnZXRTdWJzY3JpYmVyXG4gKiBAcHJvcGVydHkgeygpID0+IGJvb2xlYW59IGhhc0V4aXRlZFxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9wb3NhbFJlY29yZH0gZ2V0UHJvcG9zYWxcbiAqIEBwcm9wZXJ0eSB7WkNGR2V0QW1vdW50QWxsb2NhdGVkfSBnZXRBbW91bnRBbGxvY2F0ZWRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gQWxsb2NhdGlvbn0gZ2V0Q3VycmVudEFsbG9jYXRpb25cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gQWxsb2NhdGlvbn0gZ2V0U3RhZ2VkQWxsb2NhdGlvblxuICogRGVwcmVjYXRlZDogVXNlIGF0b21pY1JlYXJyYW5nZSBpbnN0ZWFkXG4gKiBAcHJvcGVydHkgeygpID0+IGJvb2xlYW59IGhhc1N0YWdlZEFsbG9jYXRpb25cbiAqIERlcHJlY2F0ZWQ6IFVzZSBhdG9taWNSZWFycmFuZ2UgaW5zdGVhZFxuICogQHByb3BlcnR5IHsobmV3QWxsb2NhdGlvbjogQWxsb2NhdGlvbikgPT4gYm9vbGVhbn0gaXNPZmZlclNhZmVcbiAqIEBwcm9wZXJ0eSB7KGFtb3VudEtleXdvcmRSZWNvcmQ6IEFtb3VudEtleXdvcmRSZWNvcmQpID0+IEFtb3VudEtleXdvcmRSZWNvcmR9IGluY3JlbWVudEJ5XG4gKiBEZXByZWNhdGVkOiBVc2UgYXRvbWljUmVhcnJhbmdlIGluc3RlYWRcbiAqIEBwcm9wZXJ0eSB7KGFtb3VudEtleXdvcmRSZWNvcmQ6IEFtb3VudEtleXdvcmRSZWNvcmQpID0+IEFtb3VudEtleXdvcmRSZWNvcmR9IGRlY3JlbWVudEJ5XG4gKiBEZXByZWNhdGVkOiBVc2UgYXRvbWljUmVhcnJhbmdlIGluc3RlYWRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gdm9pZH0gY2xlYXJcbiAqIERlcHJlY2F0ZWQ6IFVzZSBhdG9taWNSZWFycmFuZ2UgaW5zdGVhZFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge3sgemNmU2VhdDogWkNGU2VhdCwgdXNlclNlYXQ6IEVSZWY8VXNlclNlYXQ+fX0gWmNmU2VhdEtpdFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtvYmplY3R9IE9SIE9mZmVyIHJlc3VsdHNcbiAqIEB0eXBlZGVmIHsoc2VhdDogWkNGU2VhdCwgb2ZmZXJBcmdzPzogb2JqZWN0KSA9PiBPUn0gSGFuZGxlT2ZmZXJcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7b2JqZWN0fSBbT1I9dW5rbm93bl0gT2ZmZXIgcmVzdWx0c1xuICogQHR5cGVkZWYge0hhbmRsZU9mZmVyPE9SPiB8IHsgaGFuZGxlOiBIYW5kbGVPZmZlcjxPUj4gfX0gT2ZmZXJIYW5kbGVyXG4gKi9cblxuLyoqXG4gKiBBUEkgZm9yIGEgY29udHJhY3Qgc3RhcnQgZnVuY3Rpb24uXG4gKlxuICogQ0FWRUFUOiBhc3N1bWVzIHN5bmNocm9ub3VzXG4gKlxuICogQGRlcHJlY2F0ZWQgZGVmaW5lIGZ1bmN0aW9uIHNpZ25hdHVyZSBkaXJlY3RseVxuICpcbiAqIEB0ZW1wbGF0ZSB7b2JqZWN0fSBbUEY9YW55XSBQdWJsaWMgZmFjZXRcbiAqIEB0ZW1wbGF0ZSB7b2JqZWN0fSBbQ0Y9YW55XSBDcmVhdG9yIGZhY2V0XG4gKiBAdGVtcGxhdGUge29iamVjdH0gW0NUPWFueV0gQ3VzdG9tIHRlcm1zXG4gKiBAdGVtcGxhdGUge29iamVjdH0gW1BBPWFueV0gUHJpdmF0ZSBhcmdzXG4gKiBAY2FsbGJhY2sgQ29udHJhY3RTdGFydEZuXG4gKiBAcGFyYW0ge1pDRjxDVD59IHpjZlxuICogQHBhcmFtIHtQQX0gcHJpdmF0ZUFyZ3NcbiAqIEByZXR1cm5zIHtDb250cmFjdFN0YXJ0Rm5SZXN1bHQ8UEYsIENGPn1cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBQRiBQdWJsaWMgZmFjZXRcbiAqIEB0ZW1wbGF0ZSBDRiBDcmVhdG9yIGZhY2V0XG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBDb250cmFjdFN0YXJ0Rm5SZXN1bHRcbiAqIEBwcm9wZXJ0eSB7UEZ9IHB1YmxpY0ZhY2V0XG4gKiBAcHJvcGVydHkge0NGfSBjcmVhdG9yRmFjZXRcbiAqIEBwcm9wZXJ0eSB7UHJvbWlzZTxJbnZpdGF0aW9uPj19IFtjcmVhdG9ySW52aXRhdGlvbl1cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBTXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vem9lU2VydmljZS91dGlscycpLkNvbnRyYWN0T2Y8Uz59IENvbnRyYWN0T2ZcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi96b2VTZXJ2aWNlL3V0aWxzJykuQWRtaW5GYWNldH0gQWRtaW5GYWNldFxuICovXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMruLwmmCwAApgsAADAAAABAYWdvcmljL3pvZS12MC4yNS4zL3NyYy9jb250cmFjdFN1cHBvcnQvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFNlYXRHYWluc0xvc3Nlc1JlY29yZFxuICogQHByb3BlcnR5IHtaQ0ZTZWF0fSBzZWF0XG4gKiBAcHJvcGVydHkge0Ftb3VudEtleXdvcmRSZWNvcmR9IGdhaW5zIC0gd2hhdCB0aGUgc2VhdCB3aWxsXG4gKiBnYWluIGFzIGEgcmVzdWx0IG9mIHRoaXMgdHJhZGVcbiAqIEBwcm9wZXJ0eSB7QW1vdW50S2V5d29yZFJlY29yZD19IGxvc3NlcyAtIHdoYXQgdGhlIHNlYXQgd2lsbFxuICogZ2l2ZSB1cCBhcyBhIHJlc3VsdCBvZiB0aGlzIHRyYWRlLiBMb3NzZXMgaXMgb3B0aW9uYWwsIGJ1dCBjYW5cbiAqIG9ubHkgYmUgb21pdHRlZCBpZiB0aGUga2V5d29yZHMgZm9yIGJvdGggc2VhdHMgYXJlIHRoZSBzYW1lLlxuICogSWYgbG9zc2VzIGlzIG5vdCBkZWZpbmVkLCB0aGUgZ2FpbnMgb2YgdGhlIG90aGVyIHNlYXQgaXNcbiAqIHN1YnRyYWN0ZWQuXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgU3dhcFxuICogSWYgdHdvIHNlYXRzIGNhbiBzYXRpc2Z5IGVhY2ggb3RoZXIncyB3YW50cywgdHJhZGUgZW5vdWdoIHRvXG4gKiBzYXRpc2Z5IHRoZSB3YW50cyBvZiBib3RoIHNlYXRzIGFuZCBleGl0IGJvdGggc2VhdHMuXG4gKlxuICogVGhlIHN1cnBsdXMgcmVtYWlucyB3aXRoIHRoZSBvcmlnaW5hbCBzZWF0LiBGb3IgZXhhbXBsZSBpZiBzZWF0IEFcbiAqIGdpdmVzIDUgbW9vbGEgYW5kIHNlYXQgQiBvbmx5IHdhbnRzIDMgbW9vbGEsIHNlYXQgQSByZXRhaW5zIDJcbiAqIG1vb2xhLlxuICpcbiAqIElmIHRoZSBzd2FwIGZhaWxzLCBubyBhc3NldHMgYXJlIHRyYW5zZmVycmVkLCBib3RoIHNlYXRzIHdpbGwgZmFpbCxcbiAqIGFuZCB0aGUgZnVuY3Rpb24gdGhyb3dzLlxuICpcbiAqIFRoZSBrZXl3b3JkcyBmb3IgYm90aCBzZWF0cyBtdXN0IG1hdGNoLlxuICpcbiAqIEBwYXJhbSB7WkNGfSB6Y2ZcbiAqIEBwYXJhbSB7WkNGU2VhdH0gbGVmdFNlYXRcbiAqIEBwYXJhbSB7WkNGU2VhdH0gcmlnaHRTZWF0XG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFN3YXBFeGFjdFxuICpcbiAqIFN3YXAgc3VjaCB0aGF0IGJvdGggc2VhdHMgZ2FpbiB3aGF0IHRoZXkgd2FudCBhbmQgbG9zZSBldmVyeXRoaW5nXG4gKiB0aGF0IHRoZXkgZ2F2ZS4gT25seSBnb29kIGZvciBleGFjdCBhbmQgZW50aXJlIHN3YXBzIHdoZXJlIGVhY2hcbiAqIHNlYXQgd2FudHMgZXZlcnl0aGluZyB0aGF0IHRoZSBvdGhlciBzZWF0IGhhcy4gVGhlIGJlbmVmaXQgb2YgdXNpbmdcbiAqIHRoaXMgbWV0aG9kIGlzIHRoYXQgdGhlIGtleXdvcmRzIG9mIGVhY2ggc2VhdCBkbyBub3QgbWF0dGVyLlxuICpcbiAqIElmIHRoZSBzd2FwIGZhaWxzLCBubyBhc3NldHMgYXJlIHRyYW5zZmVycmVkLCBib3RoIHNlYXRzIHdpbGwgZmFpbCxcbiAqIGFuZCB0aGUgZnVuY3Rpb24gdGhyb3dzLlxuICpcbiAqIEBwYXJhbSB7WkNGfSB6Y2ZcbiAqIEBwYXJhbSB7WkNGU2VhdH0gbGVmdFNlYXRcbiAqIEBwYXJhbSB7WkNGU2VhdH0gcmlnaHRTZWF0XG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1JlY29yZDxLZXl3b3JkLEtleXdvcmQ+fSBLZXl3b3JkS2V5d29yZFJlY29yZFxuICpcbiAqIEEgbWFwcGluZyBvZiBrZXl3b3JkcyB0byBrZXl3b3Jkcy5cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBSZXZlcnNlXG4gKlxuICogR2l2ZW4gYSBtYXBwaW5nIG9mIGtleXdvcmRzIHRvIGtleXdvcmRzLCBpbnZlcnQgdGhlIGtleXMgYW5kXG4gKiB2YWx1ZXMuIFRoaXMgaXMgdXNlZCB0byBtYXAgdGhlIG9mZmVycyBtYWRlIHRvIGFub3RoZXIgY29udHJhY3RcbiAqIGJhY2sgdG8gdGhlIGtleXdvcmRzIHVzZWQgaW4gdGhlIGZpcnN0IGNvbnRyYWN0LlxuICogQHBhcmFtIHtLZXl3b3JkS2V5d29yZFJlY29yZD19IGtleXdvcmRSZWNvcmRcbiAqIEByZXR1cm5zIHtLZXl3b3JkS2V5d29yZFJlY29yZCB9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgTWFwS2V5d29yZHNcbiAqXG4gKiBSZW1hcCB0aGUga2V5d29yZHMgb2YgYW4gYW1vdW50S2V5d29yZFJlY29yZCwgaXNzdWVyS2V5d29yZFJlY29yZCwgb3IgYVxuICogUGF5bWVudFBLZXl3b3JkUmVjb3JkIGFjY29yZGluZyB0byBhIG1hcHBpbmcuIFRoaXMgaXMgdXNlZCB0byByZW1hcFxuICogZnJvbSBrZXl3b3JkcyB1c2VkIGluIGNvbnRyYWN0QSB0byBrZXl3b3JkcyB1c2VkIGluIGNvbnRyYWN0QiBhbmRcbiAqIHZpY2UgdmVyc2EgaW4gYG9mZmVyVG9gXG4gKlxuICogQHBhcmFtIHtBbW91bnRLZXl3b3JkUmVjb3JkIHwgUGF5bWVudFBLZXl3b3JkUmVjb3JkIHwgSXNzdWVyS2V5d29yZFJlY29yZCB8IHVuZGVmaW5lZCB9IGtleXdvcmRSZWNvcmRcbiAqIEBwYXJhbSB7S2V5d29yZEtleXdvcmRSZWNvcmR9IGtleXdvcmRNYXBwaW5nXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBSYXRpb1xuICogQHByb3BlcnR5IHtBbW91bnQ8J25hdCc+fSBudW1lcmF0b3JcbiAqIEBwcm9wZXJ0eSB7QW1vdW50PCduYXQnPn0gZGVub21pbmF0b3JcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBTY2FsZUFtb3VudFxuICogQHBhcmFtIHtBbW91bnR9IGFtb3VudFxuICogQHBhcmFtIHtSYXRpb30gcmF0aW9cbiAqIEByZXR1cm5zIHtBbW91bnQ8J25hdCc+fVxuICovXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKnQ3z1CBwAAQgcAADUAAABAYWdvcmljL3pvZS12MC4yNS4zL3NyYy9jb250cmFjdHMvY2FsbFNwcmVhZC90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qKlxuICogQHR5cGVkZWYgeydsb25nJyB8ICdzaG9ydCd9IFBvc2l0aW9uS2luZFxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIE1ha2VPcHRpb25JbnZpdGF0aW9uXG4gKiBAcGFyYW0ge1Bvc2l0aW9uS2luZH0gcG9zaXRpb25LaW5kXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxJbnZpdGF0aW9uPn1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBheW9mZkhhbmRsZXJcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gdm9pZH0gc2NoZWR1bGVQYXlvZmZzXG4gKiBAcHJvcGVydHkgIHtNYWtlT3B0aW9uSW52aXRhdGlvbn0gbWFrZU9wdGlvbkludml0YXRpb25cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IENhbGN1bGF0ZVNoYXJlc1JldHVyblxuICogUmV0dXJuIHZhbHVlIGZyb20gY2FsY3VsYXRlU2hhcmVzLCB3aGljaCByZXByZXNlbnRzIHRoZSBwb3J0aW9ucyBhc3NpZ25lZCB0b1xuICogdGhlIGxvbmcgYW5kIHNob3J0IHNpZGUgb2YgYSB0cmFuc2FjdGlvbi4gVGhlc2Ugd2lsbCBiZSB0d28gbm9uLW5lZ2F0aXZlXG4gKiBpbnRlZ2VycyB0aGF0IHN1bSB0byAxMDAuXG4gKiBAcHJvcGVydHkge1JhdGlvfSBsb25nU2hhcmVcbiAqIEBwcm9wZXJ0eSB7UmF0aW99IHNob3J0U2hhcmVcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBDYWxjdWxhdGVTaGFyZXNcbiAqIGNhbGN1bGF0ZSB0aGUgcG9ydGlvbiAoYXMgYSBwZXJjZW50YWdlKSBvZiB0aGUgY29sbGF0ZXJhbCB0aGF0IHNob3VsZCBiZVxuICogYWxsb2NhdGVkIHRvIHRoZSBsb25nIHNpZGUgb2YgYSBjYWxsIHNwcmVhZCBjb250cmFjdC4gcHJpY2UgZ2l2ZXMgdGhlIHZhbHVlXG4gKiBvZiB0aGUgdW5kZXJseWluZyBhc3NldCBhdCBjbG9zaW5nIHRoYXQgZGV0ZXJtaW5lcyB0aGUgcGF5b3V0cyB0byB0aGUgcGFydGllc1xuICpcbiAqIGlmIHByaWNlIDw9IHN0cmlrZVByaWNlMSwgcmV0dXJuIFJhdGlvIHJlcHJlc2VudGluZyAwXG4gKiBpZiBwcmljZSA+PSBzdHJpa2VQcmljZTIsIHJldHVybiBSYXRpbyByZXByZXNlbnRpbmcgMS5cbiAqIE90aGVyd2lzZSByZXR1cm4gbG9uZ1NoYXJlIGFuZCBzaG9ydFNoYXJlIHJlcHJlc2VudGluZyByYXRpb3MgYmV0d2VlbiAwJSBhbmRcbiAqIDEwMCUgcmVmbGVjdGluZyB0aGUgcG9zaXRpb24gb2YgdGhlIHByaWNlIGluIHRoZSByYW5nZSBmcm9tIHN0cmlrZVByaWNlMSB0b1xuICogc3RyaWtlUHJpY2UyLlxuICogQHBhcmFtIHtCcmFuZH0gY29sbGF0ZXJhbEJyYW5kXG4gKiBAcGFyYW0ge0Ftb3VudDwnbmF0Jz59IHByaWNlXG4gKiBAcGFyYW0ge0Ftb3VudDwnbmF0Jz59IHN0cmlrZVByaWNlMVxuICogQHBhcmFtIHtBbW91bnQ8J25hdCc+fSBzdHJpa2VQcmljZTJcbiAqIEByZXR1cm5zIHtDYWxjdWxhdGVTaGFyZXNSZXR1cm59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgTWFrZTEwMFBlcmNlbnRcbiAqIEBwYXJhbSB7QnJhbmR9IGJyYW5kXG4gKiBAcmV0dXJucyB7UmF0aW99XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgTWFrZTBQZXJjZW50XG4gKiBAcGFyYW0ge0JyYW5kfSBicmFuZFxuICogQHJldHVybnMge1JhdGlvfVxuICovXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANxeljujAQAAowEAAC0AAABAYWdvcmljL3pvZS12MC4yNS4zL3NyYy9jb250cmFjdHMvZXhwb3J0ZWQuanN7ImltcG9ydHMiOlsiLi9jYWxsU3ByZWFkL3R5cGVzLmpzIiwiLi9sb2FuL3R5cGVzLmpzIiwiLi90eXBlcy5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3R5cGVzLmpzXCIsIFtdXSxbXCIuL2xvYW4vdHlwZXMuanNcIiwgW11dLFtcIi4vY2FsbFNwcmVhZC90eXBlcy5qc1wiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAqRqTYLgZAAC4GQAALwAAAEBhZ29yaWMvem9lLXYwLjI1LjMvc3JjL2NvbnRyYWN0cy9sb2FuL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyoqXG4gKiBAdHlwZWRlZiB7Tm90aWZpZXI8VGltZXN0YW1wPn0gUGVyaW9kTm90aWZpZXJcbiAqXG4gKiAgVGhlIE5vdGlmaWVyIHRoYXQgcHJvdmlkZXMgbm90aWZpY2F0aW9ucyB0aGF0IHBlcmlvZHMgaGF2ZSBwYXNzZWQuXG4gKiAgU2luY2Ugbm90aWZpZXJzIGNhbid0IGJlIHJlbGllZCBvbiB0byBwcm9kdWNlIGFuIG91dHB1dCBldmVyeSB0aW1lXG4gKiAgdGhleSBzaG91bGQsIHdlJ2xsIHRyYWNrIHRoZSB0aW1lIG9mIGxhc3QgcGF5bWVudCwgYW5kIGNhdGNoIHVwIGlmXG4gKiAgYW55IHRpbWVzIGhhdmUgYmVlbiBtaXNzZWQuIENvbXBvdW5kIGludGVyZXN0IHdpbGwgYmUgY2FsY3VsYXRlZFxuICogIHVzaW5nIHRoZSBpbnRlcmVzdFJhdGUuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7SW5zdGFuY2V9IEF1dG9zd2FwSW5zdGFuY2VcbiAqICAgVGhlIHJ1bm5pbmcgY29udHJhY3QgaW5zdGFuY2UgZm9yIGFuIEF1dG9zd2FwIG9yIGNvbnN0YW50IHByb2R1Y3RcbiAqICAgQU1NIGluc3RhbGxhdGlvbi4gIFRoZSBwdWJsaWNGYWNldCBmcm9tIHRoZSBBdXRvc3dhcFxuICogICBpbnN0YW5jZSBpcyB1c2VkIGZvciBwcm9kdWNpbmcgYW4gaW52aXRhdGlvbiB0byBzZWxsIHRoZVxuICogICBjb2xsYXRlcmFsIG9uIGxpcXVpZGF0aW9uLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgTG9hblRlcm1zXG4gKlxuICogQHByb3BlcnR5IHtSYXRpb30gbW1yIC0gTWFpbnRlbmFuY2UgTWFyZ2luIFJlcXVpcmVtZW50LCBhIFJhdGlvIHJlY29yZC5cbiAqIERlZmF1bHQgaXMgMTUwJVxuICpcbiAqIEBwcm9wZXJ0eSB7QXV0b3N3YXBJbnN0YW5jZX0gYXV0b3N3YXBJbnN0YW5jZVxuICpcbiAqIEBwcm9wZXJ0eSB7UHJpY2VBdXRob3JpdHl9IHByaWNlQXV0aG9yaXR5XG4gKlxuICogICBVc2VkIGZvciBnZXR0aW5nIHRoZSBjdXJyZW50IHZhbHVlIG9mIGNvbGxhdGVyYWwgYW5kIHNldHRpbmdcbiAqICAgbGlxdWlkYXRpb24gdHJpZ2dlcnMuXG4gKlxuICogQHByb3BlcnR5IHtQZXJpb2ROb3RpZmllcn0gcGVyaW9kTm90aWZpZXJcbiAqXG4gKiBAcHJvcGVydHkge1JhdGlvfSBpbnRlcmVzdFJhdGVcbiAqICAgVGhlIHJhdGUgaW4gYmFzaXMgcG9pbnRzIHRoYXQgd2lsbCBiZSBtdWx0aXBsaWVkIHdpdGggdGhlIGRlYnQgb25cbiAqICAgZXZlcnkgcGVyaW9kIHRvIGNvbXBvdW5kIGludGVyZXN0LlxuICpcbiAqIEBwcm9wZXJ0eSB7UmVsYXRpdmVUaW1lfSBpbnRlcmVzdFBlcmlvZFxuICpcbiAqIEBwcm9wZXJ0eSB7QnJhbmR9IGxvYW5CcmFuZFxuICogQHByb3BlcnR5IHtCcmFuZH0gY29sbGF0ZXJhbEJyYW5kXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBMZW5kZXJTZWF0UHJvcGVydHlcbiAqIEBwcm9wZXJ0eSB7WkNGU2VhdH0gbGVuZGVyU2VhdFxuICpcbiAqICAgVGhlIFpDRlNlYXQgcmVwcmVzZW50aW5nIHRoZSBsZW5kZXIncyBwb3NpdGlvbiBpbiB0aGUgY29udHJhY3QuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7TG9hblRlcm1zICYgTGVuZGVyU2VhdFByb3BlcnR5fSBMb2FuQ29uZmlnV2l0aExlbmRlclxuICpcbiAqIFRoZSBsb2FuIG5vdyBoYXMgYSBsZW5kZXJTZWF0LCB3aGljaCBpcyBhZGRlZCB0byB0aGUgY29uZmlnLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgQm9ycm93ZXJDb25maWdQcm9wZXJ0aWVzXG4gKlxuICogQHByb3BlcnR5IHtaQ0ZTZWF0fSBjb2xsYXRlcmFsU2VhdFxuICpcbiAqICAgVGhlIFpDRlNlYXQgaG9sZGluZyB0aGUgY29sbGF0ZXJhbCBpbiBlc2Nyb3cgYWZ0ZXIgdGhlIGJvcnJvd2VyXG4gKiAgIGVzY3Jvd3MgaXRcbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IEFtb3VudH0gZ2V0RGVidFxuICpcbiAqICAgQSBmdW5jdGlvbiB0byBnZXQgdGhlIGN1cnJlbnQgZGVidFxuICpcbiAqIEBwcm9wZXJ0eSB7UHJvbWlzZVJlY29yZDxQcmljZVF1b3RlPn0gbGlxdWlkYXRpb25Qcm9taXNlS2l0XG4gKlxuICogICBQcm9taXNlS2l0IHRoYXQgaW5jbHVkZXMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYSBQcmljZVF1b3RlXG4gKiAgIHdoZW4gbGlxdWlkYXRpb24gaXMgdHJpZ2dlcmVkXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBCb3Jyb3dlckNvbmZpZ1Byb3BlcnRpZXNNaW51c0RlYnRcbiAqXG4gKiBAcHJvcGVydHkge1pDRlNlYXR9IGNvbGxhdGVyYWxTZWF0XG4gKlxuICogICBUaGUgWkNGU2VhdCBob2xkaW5nIHRoZSBjb2xsYXRlcmFsIGluIGVzY3JvdyBhZnRlciB0aGUgYm9ycm93ZXJcbiAqICAgZXNjcm93cyBpdFxuICpcbiAqIEBwcm9wZXJ0eSB7UHJvbWlzZVJlY29yZDxQcmljZVF1b3RlPn0gbGlxdWlkYXRpb25Qcm9taXNlS2l0XG4gKlxuICogICBQcm9taXNlS2l0IHRoYXQgaW5jbHVkZXMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYSBQcmljZVF1b3RlXG4gKiAgIHdoZW4gbGlxdWlkYXRpb24gaXMgdHJpZ2dlcmVkXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7TG9hbkNvbmZpZ1dpdGhMZW5kZXIgJiBCb3Jyb3dlckNvbmZpZ1Byb3BlcnRpZXMgfSBMb2FuQ29uZmlnV2l0aEJvcnJvd2VyXG4gKlxuICogVGhlIGxvYW4gaGFzIGEgbGVuZGVyLCBhIGJvcnJvd2VyLCBhbmQgY29sbGF0ZXJhbCBlc2Nyb3dlZC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtMb2FuQ29uZmlnV2l0aExlbmRlciAmIEJvcnJvd2VyQ29uZmlnUHJvcGVydGllc01pbnVzRGVidFxuICogfSBMb2FuQ29uZmlnV2l0aEJvcnJvd2VyTWludXNEZWJ0XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgU2NoZWR1bGVMaXF1aWRhdGlvblxuICogQHBhcmFtIHtaQ0Z9IHpjZlxuICogQHBhcmFtIHtMb2FuQ29uZmlnV2l0aEJvcnJvd2VyfSBjb25maWdcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBNYWtlTGVuZEludml0YXRpb25cbiAqIEBwYXJhbSB7WkNGfSB6Y2ZcbiAqIEBwYXJhbSB7TG9hblRlcm1zfSBjb25maWdcbiAqIEByZXR1cm5zIHtQcm9taXNlPEludml0YXRpb24+fSBsZW5kSW52aXRhdGlvblxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIE1ha2VCb3Jyb3dJbnZpdGF0aW9uXG4gKiBAcGFyYW0ge1pDRn0gemNmXG4gKiBAcGFyYW0ge0xvYW5Db25maWdXaXRoTGVuZGVyfSBjb25maWdcbiAqIEByZXR1cm5zIHtQcm9taXNlPEludml0YXRpb24+fSBib3Jyb3dJbnZpdGF0aW9uXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgTWFrZUNsb3NlTG9hbkludml0YXRpb25cbiAqIEBwYXJhbSB7WkNGfSB6Y2ZcbiAqIEBwYXJhbSB7TG9hbkNvbmZpZ1dpdGhCb3Jyb3dlcn0gY29uZmlnXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxJbnZpdGF0aW9uPn0gY2xvc2VMb2FuSW52aXRhdGlvblxuICovXG5cbi8qKlxuICogQWxsb3dzIGhvbGRlciB0byBhZGQgY29sbGF0ZXJhbCB0byB0aGUgY29udHJhY3QuIEV4aXRzIHRoZSBzZWF0XG4gKiBhZnRlciBhZGRpbmcuXG4gKlxuICogQGNhbGxiYWNrIE1ha2VBZGRDb2xsYXRlcmFsSW52aXRhdGlvblxuICogQHBhcmFtIHtaQ0Z9IHpjZlxuICogQHBhcmFtIHtMb2FuQ29uZmlnV2l0aEJvcnJvd2VyfSBjb25maWdcbiAqIEByZXR1cm5zIHtQcm9taXNlPEludml0YXRpb24+fSBhZGRDb2xsYXRlcmFsSW52aXRhdGlvblxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIExpcXVpZGF0ZVxuICogQHBhcmFtIHtaQ0Z9IHpjZlxuICogQHBhcmFtIHtMb2FuQ29uZmlnV2l0aEJvcnJvd2VyfSBjb25maWdcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIE1ha2VEZWJ0Q2FsY3VsYXRvclxuICogQHBhcmFtIHtEZWJ0Q2FsY3VsYXRvckNvbmZpZ30gZGVidENhbGN1bGF0b3JDb25maWdcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBDYWxjSW50ZXJlc3RGblxuICogQHBhcmFtIHtBbW91bnR9IG9sZERlYnRcbiAqIEBwYXJhbSB7UmF0aW99IGludGVyZXN0UmF0ZVxuICogQHJldHVybnMge0Ftb3VudH0gaW50ZXJlc3RcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IERlYnRDYWxjdWxhdG9yQ29uZmlnXG4gKiBAcHJvcGVydHkge0NhbGNJbnRlcmVzdEZufSBjYWxjSW50ZXJlc3RGblxuICpcbiAqICAgQSBmdW5jdGlvbiB0byBjYWxjdWxhdGUgdGhlIGludGVyZXN0LCBnaXZlbiB0aGUgZGVidCB2YWx1ZSBhbmQgYW5cbiAqICAgaW50ZXJlc3QgcmF0ZSBpbiBiYXNpcyBwb2ludHMuXG4gKlxuICogQHByb3BlcnR5IHtBbW91bnR9IG9yaWdpbmFsRGVidFxuICpcbiAqICAgVGhlIGRlYnQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBsb2FuLCBpbiBMb2FuIGJyYW5kXG4gKlxuICogQHByb3BlcnR5IHtQZXJpb2ROb3RpZmllcn0gcGVyaW9kTm90aWZpZXJcbiAqXG4gKiAgIFRoZSBBc3luY0l0ZXJhYmxlIHRvIG5vdGlmeSB3aGVuIGEgcGVyaW9kIGhhcyBvY2N1cnJlZFxuICpcbiAqIEBwcm9wZXJ0eSB7UmF0aW99IGludGVyZXN0UmF0ZVxuICogQHByb3BlcnR5IHtSZWxhdGl2ZVRpbWV9IGludGVyZXN0UGVyaW9kXG4gKlxuICogIHRoZSBwZXJpb2QgYXQgd2hpY2ggdGhlIG91dHN0YW5kaW5nIGRlYnQgaW5jcmVhc2VzIGJ5IHRoZSBpbnRlcmVzdFJhdGVcbiAqXG4gKiBAcHJvcGVydHkge1pDRn0gemNmXG4gKlxuICogQHByb3BlcnR5IHtMb2FuQ29uZmlnV2l0aEJvcnJvd2VyTWludXNEZWJ0fSBjb25maWdNaW51c0dldERlYnRcbiAqIEBwcm9wZXJ0eSB7VGltZXN0YW1wfSBiYXNldGltZSBUaGUgc3RhcnRpbmcgcG9pbnQgZnJvbSB3aGljaCB0byBjYWxjdWxhdGVcbiAqIGludGVyZXN0LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQ29uZmlnTWludXNHZXREZWJ0XG4gKiBAcHJvcGVydHkge1pDRlNlYXR9IGNvbGxhdGVyYWxTZWF0XG4gKiBAcHJvcGVydHkge1Byb21pc2VSZWNvcmQ8YW55Pn0gbGlxdWlkYXRpb25Qcm9taXNlS2l0XG4gKiBAcHJvcGVydHkge2JpZ2ludH0gW21tcl1cbiAqIEBwcm9wZXJ0eSB7SGFuZGxlPCdJbnN0YW5jZSc+fSBhdXRvc3dhcEluc3RhbmNlXG4gKiBAcHJvcGVydHkge1ByaWNlQXV0aG9yaXR5fSBwcmljZUF1dGhvcml0eVxuICogQHByb3BlcnR5IHtQZXJpb2ROb3RpZmllcn0gcGVyaW9kTm90aWZpZXJcbiAqIEBwcm9wZXJ0eSB7YmlnaW50fSBpbnRlcmVzdFJhdGVcbiAqIEBwcm9wZXJ0eSB7UmVsYXRpdmVUaW1lfSBpbnRlcmVzdFBlcmlvZFxuICogQHByb3BlcnR5IHtaQ0ZTZWF0fSBsZW5kZXJTZWF0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBCb3Jyb3dGYWNldFxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxJbnZpdGF0aW9uPn0gbWFrZUNsb3NlTG9hbkludml0YXRpb25cbiAqXG4gKiBNYWtlIGFuIGludml0YXRpb24gdG8gY2xvc2UgdGhlIGxvYW4gYnkgcmVwYXlpbmcgdGhlIGRlYnRcbiAqICAgKGluY2x1ZGluZyBpbnRlcmVzdCkuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPEludml0YXRpb24+fSBtYWtlQWRkQ29sbGF0ZXJhbEludml0YXRpb25cbiAqXG4gKiBNYWtlIGFuIGludml0YXRpb24gdG8gYWRkIGNvbGxhdGVyYWwgdG8gcHJvdGVjdCBhZ2FpbnN0IGxpcXVpZGF0aW9uXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPFByaWNlUXVvdGU+fSBnZXRMaXF1aWRhdGlvblByb21pc2VcbiAqXG4gKiBHZXQgYSBwcm9taXNlIGZvciBhIHByaWNlUXVvdGUgdGhhdCB3aWxsIHJlc29sdmUgaWYgbGlxdWlkYXRpb25cbiAqIG9jY3Vycy4gVGhlIHByaWNlUXVvdGUgaXMgZm9yIHRoZSB2YWx1ZSBvZiB0aGUgY29sbGF0ZXJhbCB0aGF0XG4gKiB0cmlnZ2VyZWQgdGhlIGxpcXVpZGF0aW9uLiBUaGlzIG1heSBiZSBsb3dlciB0aGFuIGV4cGVjdGVkIGlmIHRoZVxuICogcHJpY2UgaXMgbW92aW5nIHF1aWNrbHkuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBUaW1lc3RhbXB9IGdldExhc3RDYWxjdWxhdGlvblRpbWVzdGFtcFxuICpcbiAqIEdldCB0aGUgdGltZXN0YW1wIGF0IHdoaWNoIHRoZSBkZWJ0IHdhcyBtb3N0IHJlY2VudGx5IHJlY2FsY3VsYXRlZC5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IE5vdGlmaWVyPEFtb3VudD59IGdldERlYnROb3RpZmllclxuICpcbiAqIEdldCBhIE5vdGlmaWVyIHRoYXQgd2lsbCBiZSB1cGRhdGVkIHdoZW4gdGhlIGN1cnJlbnQgZGVidCAoYW4gQW1vdW50IHdpdGggdGhlIExvYW5cbiAqIEJyYW5kKSBjaGFuZ2VzLiBUaGlzIHdpbGwgaW5jcmVhc2UgYXMgaW50ZXJlc3QgaXMgYWRkZWQuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBBbW91bnR9IGdldFJlY2VudENvbGxhdGVyYWxBbW91bnRcbiAqXG4gKiBHZXQgYSByZWNlbnQgcmVwb3J0IG9mIHRoZSBhbW91bnQgb2YgY29sbGF0ZXJhbCBpbiB0aGUgbG9hblxuICovXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALZQ7U+9CwAAvQsAACoAAABAYWdvcmljL3pvZS12MC4yNS4zL3NyYy9jb250cmFjdHMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFNlbGxJdGVtc1B1YmxpY0ZhY2V0XG4gKiBAcHJvcGVydHkgeygpID0+IElzc3Vlcn0gZ2V0SXRlbXNJc3N1ZXJcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gQW1vdW50fSBnZXRBdmFpbGFibGVJdGVtc1xuICpcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFNlbGxJdGVtc0NyZWF0b3JPbmx5XG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8SW52aXRhdGlvbj59IG1ha2VCdXllckludml0YXRpb25cbiAqXG4gKiBAdHlwZWRlZiB7U2VsbEl0ZW1zUHVibGljRmFjZXQgJiBTZWxsSXRlbXNDcmVhdG9yT25seX0gU2VsbEl0ZW1zQ3JlYXRvckZhY2V0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTZWxsSXRlbXNQYXJhbWV0ZXJzXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsIGFueT59IGN1c3RvbVZhbHVlUHJvcGVydGllc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IGNvdW50XG4gKiBAcHJvcGVydHkge0lzc3Vlcn0gbW9uZXlJc3N1ZXJcbiAqIEBwcm9wZXJ0eSB7SW5zdGFsbGF0aW9ufSBzZWxsSXRlbXNJbnN0YWxsYXRpb25cbiAqIEBwcm9wZXJ0eSB7QW1vdW50fSBwcmljZVBlckl0ZW1cbiAqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTZWxsSXRlbXNSZXN1bHRcbiAqIEBwcm9wZXJ0eSB7VXNlclNlYXR9IHNlbGxJdGVtc0NyZWF0b3JTZWF0XG4gKiBAcHJvcGVydHkge1NlbGxJdGVtc0NyZWF0b3JGYWNldH0gc2VsbEl0ZW1zQ3JlYXRvckZhY2V0XG4gKiBAcHJvcGVydHkge0luc3RhbmNlfSBzZWxsSXRlbXNJbnN0YW5jZVxuICogQHByb3BlcnR5IHtTZWxsSXRlbXNQdWJsaWNGYWNldH0gc2VsbEl0ZW1zUHVibGljRmFjZXRcbiAqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBNaW50QW5kU2VsbE5GVENyZWF0b3JGYWNldFxuICogQHByb3BlcnR5IHsoc2VsbFBhcmFtczogU2VsbEl0ZW1zUGFyYW1ldGVycykgPT4gUHJvbWlzZTxTZWxsSXRlbXNSZXN1bHQ+fSBzZWxsVG9rZW5zXG4gKiBAcHJvcGVydHkgeygpID0+IElzc3Vlcn0gZ2V0SXNzdWVyXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBBdXRvbWF0aWNSZWZ1bmRQdWJsaWNGYWNldFxuICogQHByb3BlcnR5IHsoKSA9PiBiaWdpbnR9IGdldE9mZmVyc0NvdW50XG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8SW52aXRhdGlvbj59IG1ha2VJbnZpdGF0aW9uXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBBdXRvc3dhcFB1YmxpY0ZhY2V0XG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8SW52aXRhdGlvbj59IG1ha2VTd2FwSW52aXRhdGlvbiBzeW5vbnltIGZvclxuICogbWFrZVN3YXBJbkludml0YXRpb25cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxJbnZpdGF0aW9uPn0gbWFrZVN3YXBJbkludml0YXRpb24gbWFrZSBhbiBpbnZpdGF0aW9uXG4gKiB0aGF0IGFsbG93cyBvbmUgdG8gZG8gYSBzd2FwIGluIHdoaWNoIHRoZSBJbiBhbW91bnQgaXMgc3BlY2lmaWVkIGFuZCB0aGUgT3V0XG4gKiBhbW91bnQgaXMgY2FsY3VsYXRlZFxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPEludml0YXRpb24+fSBtYWtlU3dhcE91dEludml0YXRpb24gbWFrZSBhbiBpbnZpdGF0aW9uXG4gKiB0aGF0IGFsbG93cyBvbmUgdG8gZG8gYSBzd2FwIGluIHdoaWNoIHRoZSBPdXQgYW1vdW50IGlzIHNwZWNpZmllZCBhbmQgdGhlIEluXG4gKiBhbW91bnQgaXMgY2FsY3VsYXRlZFxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPEludml0YXRpb24+fSBtYWtlQWRkTGlxdWlkaXR5SW52aXRhdGlvbiBtYWtlIGFuXG4gKiBpbnZpdGF0aW9uIHRoYXQgYWxsb3dzIG9uZSB0byBhZGQgbGlxdWlkaXR5IHRvIHRoZSBwb29sLlxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPEludml0YXRpb24+fSBtYWtlUmVtb3ZlTGlxdWlkaXR5SW52aXRhdGlvbiBtYWtlIGFuXG4gKiBpbnZpdGF0aW9uIHRoYXQgYWxsb3dzIG9uZSB0byByZW1vdmUgbGlxdWlkaXR5IGZyb20gdGhlIHBvb2wuXG4gKiBAcHJvcGVydHkgeygpID0+IElzc3Vlcn0gZ2V0TGlxdWlkaXR5SXNzdWVyXG4gKiBAcHJvcGVydHkgeygpID0+IGJpZ2ludH0gZ2V0TGlxdWlkaXR5U3VwcGx5IGdldCB0aGUgY3VycmVudCB2YWx1ZSBvZlxuICogbGlxdWlkaXR5IGhlbGQgYnkgaW52ZXN0b3JzLlxuICogQHByb3BlcnR5IHsoYW1vdW50SW46IEFtb3VudCwgYnJhbmRPdXQ6IEJyYW5kKSA9PiBBbW91bnR9IGdldElucHV0UHJpY2VcbiAqIGNhbGN1bGF0ZSB0aGUgYW1vdW50IG9mIGJyYW5kT3V0IHRoYXQgd2lsbCBiZSByZXR1cm5lZCBpZiB0aGUgYW1vdW50SW4gaXNcbiAqIG9mZmVyZWQgdXNpbmcgbWFrZVN3YXBJbkludml0YXRpb24gYXQgdGhlIGN1cnJlbnQgcHJpY2UuXG4gKiBAcHJvcGVydHkgeyhhbW91bnRPdXQ6IEFtb3VudCwgYnJhbmRJbjogQnJhbmQpID0+IEFtb3VudH0gZ2V0T3V0cHV0UHJpY2VcbiAqIGNhbGN1bGF0ZSB0aGUgYW1vdW50IG9mIGJyYW5kSW4gdGhhdCBpcyByZXF1aXJlZCBpbiBvcmRlciB0byBnZXQgYW1vdW50T3V0XG4gKiB1c2luZyBtYWtlU3dhcE91dEludml0YXRpb24gYXQgdGhlIGN1cnJlbnQgcHJpY2VcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUmVjb3JkPHN0cmluZywgQW1vdW50Pn0gZ2V0UG9vbEFsbG9jYXRpb24gZ2V0IGFuXG4gKiBBbW91bnRLZXl3b3JkUmVjb3JkIHNob3dpbmcgdGhlIGN1cnJlbnQgYmFsYW5jZXMgaW4gdGhlIHBvb2wuXG4gKi9cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAHMasYdtBAADbQQAAJQAAAEBhZ29yaWMvem9lLXYwLjI1LjMvc3JjL3R5cGVHdWFyZHMuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9lcnRwIiwiQGFnb3JpYy9ub3RpZmllciIsIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL3N3aW5nc2V0LXZhdC9zcmMvdmF0cy90aW1lci90eXBlR3VhcmRzLmpzIl0sImV4cG9ydHMiOlsiQWRtaW5GYWNldEkiLCJBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUiLCJBbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZFNoYXBlIiwiQnJhbmRLZXl3b3JkUmVjb3JkU2hhcGUiLCJCdW5kbGVDYXBTaGFwZSIsIkJ1bmRsZVNoYXBlIiwiRXhpdE9iamVjdEkiLCJFeGl0T2JqZWN0U2hhcGUiLCJGdWxsUHJvcG9zYWxTaGFwZSIsIkhhbmRsZUkiLCJIYW5kbGVPZmZlckkiLCJJbnN0YWxsYXRpb25TaGFwZSIsIkluc3RhbmNlQWRtaW5JIiwiSW5zdGFuY2VBZG1pblNoYXBlIiwiSW5zdGFuY2VIYW5kbGVTaGFwZSIsIkluc3RhbmNlUmVjb3JkU2hhcGUiLCJJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VySUtpdCIsIkludml0YXRpb25FbGVtZW50U2hhcGUiLCJJbnZpdGF0aW9uSGFuZGxlU2hhcGUiLCJJbnZpdGF0aW9uU2hhcGUiLCJJc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGUiLCJJc3N1ZXJQS2V5d29yZFJlY29yZFNoYXBlIiwiSXNzdWVyUmVjb3JkU2hhcGUiLCJLZXl3b3JkU2hhcGUiLCJPZmZlckhhbmRsZXJJIiwiUGF5bWVudEtleXdvcmRSZWNvcmRTaGFwZSIsIlBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlIiwiUHJvcG9zYWxTaGFwZSIsIlNlYXREYXRhU2hhcGUiLCJTZWF0SGFuZGxlQWxsb2NhdGlvbnNTaGFwZSIsIlNlYXRTaGFwZSIsIlRlcm1zU2hhcGUiLCJUaW1lclNoYXBlIiwiWmNmTWludEkiLCJab2VNaW50SSIsIlpvZU1pbnRTaGFwZSIsIlpvZVNlcnZpY2VJS2l0IiwiWm9lU3RvcmFnZU1hbmFnZXJJS2l0IiwiaXNBZnRlckRlYWRsaW5lRXhpdFJ1bGUiLCJpc09uRGVtYW5kRXhpdFJ1bGUiLCJpc1dhaXZlZEV4aXRSdWxlIiwibWFrZUhhbmRsZVNoYXBlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEFtb3VudFNoYXBlLEFzc2V0S2luZFNoYXBlLERpc3BsYXlJbmZvU2hhcGUsSXNzdWVyU2hhcGUsQnJhbmRTaGFwZSxQYXltZW50U2hhcGUsTSxUaW1lc3RhbXBWYWx1ZVNoYXBlLFN1YnNjcmliZXJTaGFwZTskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2VydHBcIiwgW1tcIkFtb3VudFNoYXBlXCIsIFskaOKAjV9hID0+IChBbW91bnRTaGFwZSA9ICRo4oCNX2EpXV0sW1wiQXNzZXRLaW5kU2hhcGVcIiwgWyRo4oCNX2EgPT4gKEFzc2V0S2luZFNoYXBlID0gJGjigI1fYSldXSxbXCJEaXNwbGF5SW5mb1NoYXBlXCIsIFskaOKAjV9hID0+IChEaXNwbGF5SW5mb1NoYXBlID0gJGjigI1fYSldXSxbXCJJc3N1ZXJTaGFwZVwiLCBbJGjigI1fYSA9PiAoSXNzdWVyU2hhcGUgPSAkaOKAjV9hKV1dLFtcIkJyYW5kU2hhcGVcIiwgWyRo4oCNX2EgPT4gKEJyYW5kU2hhcGUgPSAkaOKAjV9hKV1dLFtcIlBheW1lbnRTaGFwZVwiLCBbJGjigI1fYSA9PiAoUGF5bWVudFNoYXBlID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIk1cIiwgWyRo4oCNX2EgPT4gKE0gPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zd2luZ3NldC12YXQvc3JjL3ZhdHMvdGltZXIvdHlwZUd1YXJkcy5qc1wiLCBbW1wiVGltZXN0YW1wVmFsdWVTaGFwZVwiLCBbJGjigI1fYSA9PiAoVGltZXN0YW1wVmFsdWVTaGFwZSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL25vdGlmaWVyXCIsIFtbXCJTdWJzY3JpYmVyU2hhcGVcIiwgWyRo4oCNX2EgPT4gKFN1YnNjcmliZXJTaGFwZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qIGtleXdvcmRzIGhhdmUgYW4gaW5pdGlhbCBjYXAqL1xuY29uc3QgICAgICAgIEtleXdvcmRTaGFwZT1NLnN0cmluZygpOyRo4oCNX29uY2UuS2V5d29yZFNoYXBlKEtleXdvcmRTaGFwZSk7XG5cbmNvbnN0ICAgICAgICBJbnZpdGF0aW9uSGFuZGxlU2hhcGU9TS5yZW1vdGFibGUoJ0ludml0YXRpb25IYW5kbGUnKTskaOKAjV9vbmNlLkludml0YXRpb25IYW5kbGVTaGFwZShJbnZpdGF0aW9uSGFuZGxlU2hhcGUpO1xuY29uc3QgICAgICAgIEludml0YXRpb25TaGFwZT1NLnJlbW90YWJsZSgnSW52aXRhdGlvbicpOyRo4oCNX29uY2UuSW52aXRhdGlvblNoYXBlKEludml0YXRpb25TaGFwZSk7XG5jb25zdCAgICAgICAgSW5zdGFuY2VIYW5kbGVTaGFwZT1NLnJlbW90YWJsZSgnSW5zdGFuY2VIYW5kbGUnKTskaOKAjV9vbmNlLkluc3RhbmNlSGFuZGxlU2hhcGUoSW5zdGFuY2VIYW5kbGVTaGFwZSk7XG5jb25zdCAgICAgICAgSW5zdGFsbGF0aW9uU2hhcGU9TS5yZW1vdGFibGUoJ0luc3RhbGxhdGlvbicpOyRo4oCNX29uY2UuSW5zdGFsbGF0aW9uU2hhcGUoSW5zdGFsbGF0aW9uU2hhcGUpO1xuY29uc3QgICAgICAgIFNlYXRTaGFwZT1NLnJlbW90YWJsZSgnU2VhdCcpOyRo4oCNX29uY2UuU2VhdFNoYXBlKFNlYXRTaGFwZSk7XG5cbmNvbnN0ICAgICAgICBBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGU9TS5yZWNvcmRPZihLZXl3b3JkU2hhcGUsQW1vdW50U2hhcGUpOyRo4oCNX29uY2UuQW1vdW50S2V5d29yZFJlY29yZFNoYXBlKEFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSk7XG5jb25zdCAgICAgICAgQW1vdW50UGF0dGVybktleXdvcmRSZWNvcmRTaGFwZT1NLnJlY29yZE9mKFxuS2V5d29yZFNoYXBlLFxuTS5wYXR0ZXJuKCkpOyRo4oCNX29uY2UuQW1vdW50UGF0dGVybktleXdvcmRSZWNvcmRTaGFwZShBbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZFNoYXBlKTtcblxuY29uc3QgICAgICAgIFBheW1lbnRLZXl3b3JkUmVjb3JkU2hhcGU9TS5yZWNvcmRPZihLZXl3b3JkU2hhcGUsUGF5bWVudFNoYXBlKTskaOKAjV9vbmNlLlBheW1lbnRLZXl3b3JkUmVjb3JkU2hhcGUoUGF5bWVudEtleXdvcmRSZWNvcmRTaGFwZSk7XG5jb25zdCAgICAgICAgUGF5bWVudFBLZXl3b3JkUmVjb3JkU2hhcGU9TS5yZWNvcmRPZihcbktleXdvcmRTaGFwZSxcbk0uZXJlZihQYXltZW50U2hhcGUpKTskaOKAjV9vbmNlLlBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlKFBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlKTtcblxuY29uc3QgICAgICAgIElzc3VlcktleXdvcmRSZWNvcmRTaGFwZT1NLnJlY29yZE9mKEtleXdvcmRTaGFwZSxJc3N1ZXJTaGFwZSk7JGjigI1fb25jZS5Jc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGUoSXNzdWVyS2V5d29yZFJlY29yZFNoYXBlKTtcbmNvbnN0ICAgICAgICBJc3N1ZXJQS2V5d29yZFJlY29yZFNoYXBlPU0ucmVjb3JkT2YoXG5LZXl3b3JkU2hhcGUsXG5NLmVyZWYoSXNzdWVyU2hhcGUpKTskaOKAjV9vbmNlLklzc3VlclBLZXl3b3JkUmVjb3JkU2hhcGUoSXNzdWVyUEtleXdvcmRSZWNvcmRTaGFwZSk7XG5cbmNvbnN0ICAgICAgICBCcmFuZEtleXdvcmRSZWNvcmRTaGFwZT1NLnJlY29yZE9mKEtleXdvcmRTaGFwZSxCcmFuZFNoYXBlKTskaOKAjV9vbmNlLkJyYW5kS2V5d29yZFJlY29yZFNoYXBlKEJyYW5kS2V5d29yZFJlY29yZFNoYXBlKTtcblxuY29uc3QgICAgICAgIElzc3VlclJlY29yZFNoYXBlPU0uc3BsaXRSZWNvcmQoXG57XG5icmFuZDpCcmFuZFNoYXBlLFxuaXNzdWVyOklzc3VlclNoYXBlLFxuYXNzZXRLaW5kOkFzc2V0S2luZFNoYXBlfSxcblxue2Rpc3BsYXlJbmZvOkRpc3BsYXlJbmZvU2hhcGV9KTskaOKAjV9vbmNlLklzc3VlclJlY29yZFNoYXBlKElzc3VlclJlY29yZFNoYXBlKTtcblxuXG5jb25zdCAgICAgICAgVGVybXNTaGFwZT1oYXJkZW4oe1xuaXNzdWVyczpJc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGUsXG5icmFuZHM6QnJhbmRLZXl3b3JkUmVjb3JkU2hhcGV9KTskaOKAjV9vbmNlLlRlcm1zU2hhcGUoVGVybXNTaGFwZSk7XG5cblxuY29uc3QgICAgICAgIEluc3RhbmNlUmVjb3JkU2hhcGU9aGFyZGVuKHtcbmluc3RhbGxhdGlvbjpJbnN0YWxsYXRpb25TaGFwZSxcbmluc3RhbmNlOkluc3RhbmNlSGFuZGxlU2hhcGUsXG50ZXJtczpNLnNwbGl0UmVjb3JkKFRlcm1zU2hhcGUpfSk7JGjigI1fb25jZS5JbnN0YW5jZVJlY29yZFNoYXBlKEluc3RhbmNlUmVjb3JkU2hhcGUpO1xuXG5cbmNvbnN0ICAgICAgICBIYW5kbGVJPU0uaW50ZXJmYWNlKCdIYW5kbGUnLHt9KTskaOKAjV9vbmNlLkhhbmRsZUkoSGFuZGxlSSk7XG5cbmNvbnN0ICAgICAgICBtYWtlSGFuZGxlU2hhcGU9KG5hbWUpPT5NLnJlbW90YWJsZSggYCR7bmFtZX1IYW5kbGVgKTskaOKAjV9vbmNlLm1ha2VIYW5kbGVTaGFwZShtYWtlSGFuZGxlU2hhcGUpO1xuY29uc3QgICAgICAgIFRpbWVyU2hhcGU9bWFrZUhhbmRsZVNoYXBlKCd0aW1lcicpO1xuXG4vKipcbiAqIEFmdGVyIGRlZmF1bHRzIGFyZSBmaWxsZWQgaW5cbiAqXG4gKiBAc2VlIHtQcm9wb3NhbFJlY29yZH0gdHlwZVxuICovJGjigI1fb25jZS5UaW1lclNoYXBlKFRpbWVyU2hhcGUpO1xuY29uc3QgICAgICAgIEZ1bGxQcm9wb3NhbFNoYXBlPWhhcmRlbih7XG53YW50OkFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkU2hhcGUsXG5naXZlOkFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSxcbi8qIFRvIGFjY2VwdCBvbmx5IG9uZSwgd2UgY291bGQgdXNlIE0ub3IgcmF0aGVyIHRoYW4gTS5zcGxpdFJlY29yZCwqL1xuLyogYnV0IHRoZSBlcnJvciBtZXNzYWdlcyB3b3VsZCBoYXZlIGJlZW4gd29yc2UuIFJhdGhlciwqL1xuLyogY2xlYW5Qcm9wb3NhbCdzIGFzc2VydEV4aXQgY2hlY2tzIHRoYXQgdGhlcmUncyBleGFjdGx5IG9uZS4qL1xuZXhpdDpNLnNwbGl0UmVjb3JkKFxue30sXG57XG5vbkRlbWFuZDpudWxsLFxud2FpdmVkOm51bGwsXG5hZnRlckRlYWRsaW5lOntcbnRpbWVyOk0uZXJlZihUaW1lclNoYXBlKSxcbmRlYWRsaW5lOlRpbWVzdGFtcFZhbHVlU2hhcGV9fSxcblxuXG57fSl9KTtcblxuXG4vKiogQHNlZSB7UHJvcG9zYWx9IHR5cGUgKi8kaOKAjV9vbmNlLkZ1bGxQcm9wb3NhbFNoYXBlKEZ1bGxQcm9wb3NhbFNoYXBlKTtcbmNvbnN0ICAgICAgICBQcm9wb3NhbFNoYXBlPU0uc3BsaXRSZWNvcmQoe30sRnVsbFByb3Bvc2FsU2hhcGUse30pOyRo4oCNX29uY2UuUHJvcG9zYWxTaGFwZShQcm9wb3NhbFNoYXBlKTtcblxuY29uc3QgICAgICAgIGlzT25EZW1hbmRFeGl0UnVsZT0oZXhpdCk9PntcbmNvbnN0W2V4aXRLZXldPU9iamVjdC5rZXlzKGV4aXQpO1xucmV0dXJuIGV4aXRLZXk9PT0nb25EZW1hbmQnO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtFeGl0UnVsZX0gZXhpdFxuICogQHJldHVybnMge2V4aXQgaXMgV2FpdmVkRXhpdFJ1bGV9XG4gKi8kaOKAjV9vbmNlLmlzT25EZW1hbmRFeGl0UnVsZShpc09uRGVtYW5kRXhpdFJ1bGUpO1xuY29uc3QgICAgICAgIGlzV2FpdmVkRXhpdFJ1bGU9KGV4aXQpPT57XG5jb25zdFtleGl0S2V5XT1PYmplY3Qua2V5cyhleGl0KTtcbnJldHVybiBleGl0S2V5PT09J3dhaXZlZCc7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge0V4aXRSdWxlfSBleGl0XG4gKiBAcmV0dXJucyB7ZXhpdCBpcyBBZnRlckRlYWRsaW5lRXhpdFJ1bGV9XG4gKi8kaOKAjV9vbmNlLmlzV2FpdmVkRXhpdFJ1bGUoaXNXYWl2ZWRFeGl0UnVsZSk7XG5jb25zdCAgICAgICAgaXNBZnRlckRlYWRsaW5lRXhpdFJ1bGU9KGV4aXQpPT57XG5jb25zdFtleGl0S2V5XT1PYmplY3Qua2V5cyhleGl0KTtcbnJldHVybiBleGl0S2V5PT09J2FmdGVyRGVhZGxpbmUnO1xuIH07JGjigI1fb25jZS5pc0FmdGVyRGVhZGxpbmVFeGl0UnVsZShpc0FmdGVyRGVhZGxpbmVFeGl0UnVsZSk7XG5cbmNvbnN0ICAgICAgICBJbnZpdGF0aW9uRWxlbWVudFNoYXBlPU0uc3BsaXRSZWNvcmQoe1xuZGVzY3JpcHRpb246TS5zdHJpbmcoKSxcbmhhbmRsZTpJbnZpdGF0aW9uSGFuZGxlU2hhcGUsXG5pbnN0YW5jZTpJbnN0YW5jZUhhbmRsZVNoYXBlLFxuaW5zdGFsbGF0aW9uOkluc3RhbGxhdGlvblNoYXBlfSk7JGjigI1fb25jZS5JbnZpdGF0aW9uRWxlbWVudFNoYXBlKEludml0YXRpb25FbGVtZW50U2hhcGUpO1xuXG5cbmNvbnN0ICAgICAgICBPZmZlckhhbmRsZXJJPU0uaW50ZXJmYWNlKCdPZmZlckhhbmRsZXInLHtcbmhhbmRsZTpNLmNhbGwoU2VhdFNoYXBlKS5vcHRpb25hbChNLmFueSgpKS5yZXR1cm5zKE0uc3RyaW5nKCkpfSk7JGjigI1fb25jZS5PZmZlckhhbmRsZXJJKE9mZmVySGFuZGxlckkpO1xuXG5cbmNvbnN0ICAgICAgICBTZWF0SGFuZGxlQWxsb2NhdGlvbnNTaGFwZT1NLmFycmF5T2YoXG5oYXJkZW4oe1xuc2VhdEhhbmRsZTpTZWF0U2hhcGUsXG5hbGxvY2F0aW9uOkFtb3VudEtleXdvcmRSZWNvcmRTaGFwZX0pKTskaOKAjV9vbmNlLlNlYXRIYW5kbGVBbGxvY2F0aW9uc1NoYXBlKFNlYXRIYW5kbGVBbGxvY2F0aW9uc1NoYXBlKTtcblxuXG5cbmNvbnN0ICAgICAgICBab2VNaW50U2hhcGU9TS5yZW1vdGFibGUoJ1pvZU1pbnQnKTskaOKAjV9vbmNlLlpvZU1pbnRTaGFwZShab2VNaW50U2hhcGUpO1xuY29uc3QgICAgICAgIFpvZU1pbnRJPU0uaW50ZXJmYWNlKCdab2VNaW50Jyx7XG5nZXRJc3N1ZXJSZWNvcmQ6TS5jYWxsKCkucmV0dXJucyhJc3N1ZXJSZWNvcmRTaGFwZSksXG5taW50QW5kRXNjcm93Ok0uY2FsbChBbW91bnRTaGFwZSkucmV0dXJucygpLFxud2l0aGRyYXdBbmRCdXJuOk0uY2FsbChBbW91bnRTaGFwZSkucmV0dXJucygpfSk7JGjigI1fb25jZS5ab2VNaW50SShab2VNaW50SSk7XG5cblxuY29uc3QgICAgICAgIFpjZk1pbnRJPU0uaW50ZXJmYWNlKCdaY2ZNaW50Jyx7XG5nZXRJc3N1ZXJSZWNvcmQ6TS5jYWxsKCkucmV0dXJucyhJc3N1ZXJSZWNvcmRTaGFwZSksXG5taW50R2FpbnM6TS5jYWxsKEFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSxNLnJlbW90YWJsZSgnemNmU2VhdCcpKS5yZXR1cm5zKCksXG5idXJuTG9zc2VzOk0uY2FsbChcbkFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSxcbk0ucmVtb3RhYmxlKCd6Y2ZTZWF0JykpLlxucmV0dXJucygpfSk7JGjigI1fb25jZS5aY2ZNaW50SShaY2ZNaW50SSk7XG5cblxuY29uc3QgICAgICAgIEV4aXRPYmplY3RJPU0uaW50ZXJmYWNlKCdFeGl0IE9iamVjdCcse1xuZXhpdDpNLmNhbGwoKS5yZXR1cm5zKCl9KTskaOKAjV9vbmNlLkV4aXRPYmplY3RJKEV4aXRPYmplY3RJKTtcblxuXG5jb25zdCAgICAgICAgRXhpdE9iamVjdFNoYXBlPU0ucmVtb3RhYmxlKCdFeGl0T2JqJyk7JGjigI1fb25jZS5FeGl0T2JqZWN0U2hhcGUoRXhpdE9iamVjdFNoYXBlKTtcbmNvbnN0ICAgICAgICBJbnN0YW5jZUFkbWluU2hhcGU9TS5yZW1vdGFibGUoJ0luc3RhbmNlQWRtaW4nKTskaOKAjV9vbmNlLkluc3RhbmNlQWRtaW5TaGFwZShJbnN0YW5jZUFkbWluU2hhcGUpO1xuY29uc3QgICAgICAgIEluc3RhbmNlQWRtaW5JPU0uaW50ZXJmYWNlKCdJbnN0YW5jZUFkbWluJyx7XG5tYWtlSW52aXRhdGlvbjpNLmNhbGwoSW52aXRhdGlvbkhhbmRsZVNoYXBlLE0uc3RyaW5nKCkpLlxub3B0aW9uYWwoTS5yZWNvcmQoKSxNLnBhdHRlcm4oKSkuXG5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbnNhdmVJc3N1ZXI6TS5jYWxsV2hlbihNLmF3YWl0KElzc3VlclNoYXBlKSxLZXl3b3JkU2hhcGUpLnJldHVybnMoXG5Jc3N1ZXJSZWNvcmRTaGFwZSksXG5cbm1ha2VOb0VzY3Jvd1NlYXQ6TS5jYWxsKFxuQW1vdW50S2V5d29yZFJlY29yZFNoYXBlLFxuUHJvcG9zYWxTaGFwZSxcbkV4aXRPYmplY3RTaGFwZSxcblNlYXRTaGFwZSkuXG5yZXR1cm5zKFNlYXRTaGFwZSksXG5leGl0QWxsU2VhdHM6TS5jYWxsKE0uYW55KCkpLnJldHVybnMoKSxcbmZhaWxBbGxTZWF0czpNLmNhbGwoTS5hbnkoKSkucmV0dXJucygpLFxuZXhpdFNlYXQ6TS5jYWxsKFNlYXRTaGFwZSxNLmFueSgpKS5yZXR1cm5zKCksXG5mYWlsU2VhdDpNLmNhbGwoU2VhdFNoYXBlLE0uYW55KCkpLnJldHVybnMoKSxcbm1ha2Vab2VNaW50Ok0uY2FsbChLZXl3b3JkU2hhcGUpLlxub3B0aW9uYWwoXG5Bc3NldEtpbmRTaGFwZSxcbkRpc3BsYXlJbmZvU2hhcGUsXG5NLnNwbGl0UmVjb3JkKGhhcmRlbih7fSksaGFyZGVuKHtlbGVtZW50U2hhcGU6TS5wYXR0ZXJuKCl9KSkpLlxuXG5yZXR1cm5zKE0ucmVtb3RhYmxlKCd6b2VNaW50JykpLFxucmVnaXN0ZXJGZWVNaW50Ok0uY2FsbChLZXl3b3JkU2hhcGUsTS5yZW1vdGFibGUoJ2ZlZU1pbnRBY2Nlc3MnKSkucmV0dXJucyhcbk0ucmVtb3RhYmxlKCdmZWVNaW50JykpLFxuXG5yZXBsYWNlQWxsb2NhdGlvbnM6TS5jYWxsKFNlYXRIYW5kbGVBbGxvY2F0aW9uc1NoYXBlKS5yZXR1cm5zKCksXG5zdG9wQWNjZXB0aW5nT2ZmZXJzOk0uY2FsbCgpLnJldHVybnMoKSxcbnNldE9mZmVyRmlsdGVyOk0uY2FsbChNLmFycmF5T2YoTS5zdHJpbmcoKSkpLnJldHVybnMoKSxcbmdldE9mZmVyRmlsdGVyOk0uY2FsbCgpLnJldHVybnMoTS5hcnJheU9mKE0uc3RyaW5nKCkpKSxcbmdldEV4aXRTdWJzY3JpYmVyOk0uY2FsbChTZWF0U2hhcGUpLnJldHVybnMoU3Vic2NyaWJlclNoYXBlKSxcbmlzQmxvY2tlZDpNLmNhbGwoTS5zdHJpbmcoKSkucmV0dXJucyhNLmJvb2xlYW4oKSl9KTskaOKAjV9vbmNlLkluc3RhbmNlQWRtaW5JKEluc3RhbmNlQWRtaW5JKTtcblxuXG5jb25zdCAgICAgICAgSW5zdGFuY2VTdG9yYWdlTWFuYWdlcklLaXQ9aGFyZGVuKHtcbmluc3RhbmNlU3RvcmFnZU1hbmFnZXI6TS5pbnRlcmZhY2UoJ0luc3RhbmNlU3RvcmFnZU1hbmFnZXInLHtcbmdldFRlcm1zOk0uY2FsbCgpLnJldHVybnMoTS5zcGxpdFJlY29yZChUZXJtc1NoYXBlKSksXG5nZXRJc3N1ZXJzOk0uY2FsbCgpLnJldHVybnMoSXNzdWVyS2V5d29yZFJlY29yZFNoYXBlKSxcbmdldEJyYW5kczpNLmNhbGwoKS5yZXR1cm5zKEJyYW5kS2V5d29yZFJlY29yZFNoYXBlKSxcbmdldEluc3RhbGxhdGlvbkZvckluc3RhbmNlOk0uY2FsbCgpLnJldHVybnMoSW5zdGFsbGF0aW9uU2hhcGUpLFxuZ2V0SW52aXRhdGlvbklzc3VlcjpNLmNhbGwoKS5yZXR1cm5zKElzc3VlclNoYXBlKSxcblxuc2F2ZUlzc3VlcjpNLmNhbGwoSXNzdWVyU2hhcGUsS2V5d29yZFNoYXBlKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbm1ha2Vab2VNaW50Ok0uY2FsbChLZXl3b3JkU2hhcGUpLlxub3B0aW9uYWwoXG5Bc3NldEtpbmRTaGFwZSxcbkRpc3BsYXlJbmZvU2hhcGUsXG5NLnNwbGl0UmVjb3JkKGhhcmRlbih7fSksaGFyZGVuKHtlbGVtZW50U2hhcGU6TS5wYXR0ZXJuKCl9KSkpLlxuXG5yZXR1cm5zKE0uZXJlZihab2VNaW50U2hhcGUpKSxcbnJlZ2lzdGVyRmVlTWludDpNLmNhbGwoS2V5d29yZFNoYXBlLE0ucmVtb3RhYmxlKCdmZWVNaW50QWNjZXNzJykpLnJldHVybnMoXG5NLnJlbW90YWJsZSgnZmVlTWludCcpKSxcblxuZ2V0SW5zdGFuY2VSZWNvcmQ6TS5jYWxsKCkucmV0dXJucyhJbnN0YW5jZVJlY29yZFNoYXBlKSxcbmdldElzc3VlclJlY29yZHM6TS5jYWxsKCkucmV0dXJucyhNLmFycmF5T2YoSXNzdWVyUmVjb3JkU2hhcGUpKSxcbmdldFdpdGhkcmF3RmFjZXQ6TS5jYWxsKCkucmV0dXJucyhNLnJlbW90YWJsZSgnV2l0aGRyYXdGYWNldCcpKSxcbmluaXRJbnN0YW5jZUFkbWluOk0uY2FsbChcbkluc3RhbmNlSGFuZGxlU2hhcGUsXG5NLnJlbW90YWJsZSgnaW5zdGFuY2VBZG1pbicpKS5cbnJldHVybnMoTS5wcm9taXNlKCkpLFxuZGVsZXRlSW5zdGFuY2VBZG1pbjpNLmNhbGwoSW5zdGFuY2VBZG1pbkkpLnJldHVybnMoKSxcbm1ha2VJbnZpdGF0aW9uOk0uY2FsbChJbnZpdGF0aW9uSGFuZGxlU2hhcGUsTS5zdHJpbmcoKSkuXG5vcHRpb25hbChNLnJlY29yZCgpLE0ucGF0dGVybigpKS5cbnJldHVybnMoTS5wcm9taXNlKCkpLFxuZ2V0Um9vdDpNLmNhbGwoKS5yZXR1cm5zKE0uYW55KCkpLFxuZ2V0QWRtaW5Ob2RlOk0uY2FsbCgpLnJldHVybnMoTS5yZW1vdGFibGUoJ2FkbWluTm9kZScpKX0pLFxuXG53aXRoZHJhd0ZhY2V0Ok0uaW50ZXJmYWNlKCdXaXRoZHJhd0ZhY2V0Jyx7XG53aXRoZHJhd1BheW1lbnRzOk0uY2FsbChBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUpLnJldHVybnMoXG5QYXltZW50UEtleXdvcmRSZWNvcmRTaGFwZSl9KX0pOyRo4oCNX29uY2UuSW5zdGFuY2VTdG9yYWdlTWFuYWdlcklLaXQoSW5zdGFuY2VTdG9yYWdlTWFuYWdlcklLaXQpO1xuXG5cblxuXG5jb25zdCAgICAgICAgQnVuZGxlQ2FwU2hhcGU9TS5yZW1vdGFibGUoJ2J1bmRsZUNhcCcpOyRo4oCNX29uY2UuQnVuZGxlQ2FwU2hhcGUoQnVuZGxlQ2FwU2hhcGUpO1xuY29uc3QgICAgICAgIEJ1bmRsZVNoYXBlPU0uYW5kKFxuTS5zcGxpdFJlY29yZCh7bW9kdWxlRm9ybWF0Ok0uYW55KCl9KSxcbk0ucmVjb3JkT2YoTS5zdHJpbmcoKSxNLnN0cmluZyh7c3RyaW5nTGVuZ3RoTGltaXQ6SW5maW5pdHl9KSkpOyRo4oCNX29uY2UuQnVuZGxlU2hhcGUoQnVuZGxlU2hhcGUpO1xuXG5cbmNvbnN0ICAgICAgICBab2VTdG9yYWdlTWFuYWdlcklLaXQ9aGFyZGVuKHtcbnpvZVNlcnZpY2VEYXRhQWNjZXNzOk0uaW50ZXJmYWNlKCdab2VTZXJ2aWNlIGRhdGFBY2Nlc3MnLHtcbmdldFRlcm1zOk0uY2FsbChJbnN0YW5jZUhhbmRsZVNoYXBlKS5yZXR1cm5zKE0uc3BsaXRSZWNvcmQoVGVybXNTaGFwZSkpLFxuZ2V0SXNzdWVyczpNLmNhbGwoSW5zdGFuY2VIYW5kbGVTaGFwZSkucmV0dXJucyhJc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGUpLFxuZ2V0QnJhbmRzOk0uY2FsbChJbnN0YW5jZUhhbmRsZVNoYXBlKS5yZXR1cm5zKEJyYW5kS2V5d29yZFJlY29yZFNoYXBlKSxcbmdldEluc3RhbGxhdGlvbkZvckluc3RhbmNlOk0uY2FsbChJbnN0YW5jZUhhbmRsZVNoYXBlKS5yZXR1cm5zKFxuTS5lcmVmKE0ucmVtb3RhYmxlKCdJbnN0YWxsYXRpb24nKSkpLFxuXG5nZXRJbnZpdGF0aW9uSXNzdWVyOk0uY2FsbCgpLnJldHVybnMoSXNzdWVyU2hhcGUpLFxuXG5nZXRCdW5kbGVJREZyb21JbnN0YWxsYXRpb246TS5jYWxsKEluc3RhbGxhdGlvblNoYXBlKS5yZXR1cm5zKFxuTS5lcmVmKE0uc3RyaW5nKCkpKSxcblxuaW5zdGFsbEJ1bmRsZTpNLmNhbGwoTS5vcihJbnN0YW5jZUhhbmRsZVNoYXBlLEJ1bmRsZVNoYXBlKSkucmV0dXJucyhcbk0ucHJvbWlzZSgpKSxcblxuaW5zdGFsbEJ1bmRsZUlEOk0uY2FsbChNLnN0cmluZygpKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcblxuZ2V0UHVibGljRmFjZXQ6TS5jYWxsKEluc3RhbmNlSGFuZGxlU2hhcGUpLnJldHVybnMoXG5NLmVyZWYoTS5yZW1vdGFibGUoJ1B1YmxpY0ZhY2V0JykpKSxcblxuZ2V0T2ZmZXJGaWx0ZXI6TS5jYWxsKEluc3RhbmNlSGFuZGxlU2hhcGUpLnJldHVybnMoTS5hcnJheU9mKE0uc3RyaW5nKCkpKSxcbnNldE9mZmVyRmlsdGVyOk0uY2FsbChcbkluc3RhbmNlSGFuZGxlU2hhcGUsXG5NLmFycmF5T2YoTS5zdHJpbmcoKSkpLlxucmV0dXJucygpLFxuZ2V0UHJvcG9zYWxTaGFwZUZvckludml0YXRpb246TS5jYWxsKEludml0YXRpb25IYW5kbGVTaGFwZSkucmV0dXJucyhcbk0ub3B0KE0ucGF0dGVybigpKSl9KSxcblxuXG5tYWtlT2ZmZXJBY2Nlc3M6TS5pbnRlcmZhY2UoJ1pvZVN0b3JhZ2UgbWFrZU9mZmVyIGFjY2Vzcycse1xuZ2V0QXNzZXRLaW5kQnlCcmFuZDpNLmNhbGwoQnJhbmRTaGFwZSkucmV0dXJucyhBc3NldEtpbmRTaGFwZSksXG5nZXRJbnN0YW5jZUFkbWluOk0uY2FsbChJbnN0YW5jZUhhbmRsZVNoYXBlKS5yZXR1cm5zKFxuTS5yZW1vdGFibGUoJ2luc3RhbmNlQWRtaW4nKSksXG5cbmdldFByb3Bvc2FsU2hhcGVGb3JJbnZpdGF0aW9uOk0uY2FsbChJbnZpdGF0aW9uSGFuZGxlU2hhcGUpLnJldHVybnMoXG5NLm9wdChNLnBhdHRlcm4oKSkpLFxuXG5nZXRJbnZpdGF0aW9uSXNzdWVyOk0uY2FsbCgpLnJldHVybnMoSXNzdWVyU2hhcGUpLFxuZGVwb3NpdFBheW1lbnRzOk0uY2FsbChQcm9wb3NhbFNoYXBlLFBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlKS5yZXR1cm5zKFxuTS5wcm9taXNlKCkpfSksXG5cblxuc3RhcnRJbnN0YW5jZUFjY2VzczpNLmludGVyZmFjZSgnWm9lU3RvcmFnZSBzdGFydEluc3RhbmNlIGFjY2Vzcycse1xubWFrZVpvZUluc3RhbmNlU3RvcmFnZU1hbmFnZXI6TS5jYWxsKFxuTS5hbnkoKSxcbkluc3RhbGxhdGlvblNoYXBlLFxuTS5hbnkoKSxcbklzc3VlclBLZXl3b3JkUmVjb3JkU2hhcGUsXG5NLm9yKEluc3RhbmNlSGFuZGxlU2hhcGUsQnVuZGxlU2hhcGUpLFxuTS5vcihCdW5kbGVDYXBTaGFwZSxCdW5kbGVTaGFwZSkpLlxucmV0dXJucyhNLnByb21pc2UoKSksXG51bndyYXBJbnN0YWxsYXRpb246TS5jYWxsV2hlbihNLmVyZWYoSW5zdGFsbGF0aW9uU2hhcGUpKS5yZXR1cm5zKE0uYW55KCkpfSksXG5cbmludml0YXRpb25Jc3N1ZXJBY2Nlc3M6TS5pbnRlcmZhY2UoJ1pvZVN0b3JhZ2UgaW52aXRhdGlvbklzc3Vlcicse1xuZ2V0SW52aXRhdGlvbklzc3VlcjpNLmNhbGwoKS5yZXR1cm5zKElzc3VlclNoYXBlKX0pfSk7JGjigI1fb25jZS5ab2VTdG9yYWdlTWFuYWdlcklLaXQoWm9lU3RvcmFnZU1hbmFnZXJJS2l0KTtcblxuXG5cbmNvbnN0ICAgICAgICBab2VTZXJ2aWNlSUtpdD1oYXJkZW4oe1xuem9lU2VydmljZTpNLmludGVyZmFjZSgnWm9lU2VydmljZScse1xuaW5zdGFsbDpNLmNhbGwoTS5hbnkoKSkucmV0dXJucyhNLnByb21pc2UoKSksXG5pbnN0YWxsQnVuZGxlSUQ6TS5jYWxsKE0uc3RyaW5nKCkpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuc3RhcnRJbnN0YW5jZTpNLmNhbGwoTS5lcmVmKEluc3RhbGxhdGlvblNoYXBlKSkuXG5vcHRpb25hbChJc3N1ZXJQS2V5d29yZFJlY29yZFNoYXBlLE0uYW55KCksTS5hbnkoKSkuXG5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbm9mZmVyOk0uY2FsbChNLmVyZWYoSW52aXRhdGlvblNoYXBlKSkuXG5vcHRpb25hbChQcm9wb3NhbFNoYXBlLFBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlLE0uYW55KCkpLlxucmV0dXJucyhNLnByb21pc2UoKSksXG5zZXRPZmZlckZpbHRlcjpNLmNhbGwoXG5JbnN0YW5jZUhhbmRsZVNoYXBlLFxuTS5hcnJheU9mKE0uc3RyaW5nKCkpKS5cbnJldHVybnMoKSxcblxuZ2V0T2ZmZXJGaWx0ZXI6TS5jYWxsV2hlbihNLmF3YWl0KEluc3RhbmNlSGFuZGxlU2hhcGUpKS5yZXR1cm5zKFxuTS5hcnJheU9mKE0uc3RyaW5nKCkpKSxcblxuZ2V0SW52aXRhdGlvbklzc3VlcjpNLmNhbGwoKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbmdldEZlZUlzc3VlcjpNLmNhbGwoKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbmdldEJyYW5kczpNLmNhbGxXaGVuKE0uYXdhaXQoSW5zdGFuY2VIYW5kbGVTaGFwZSkpLnJldHVybnMoXG5CcmFuZEtleXdvcmRSZWNvcmRTaGFwZSksXG5cbmdldElzc3VlcnM6TS5jYWxsV2hlbihNLmF3YWl0KEluc3RhbmNlSGFuZGxlU2hhcGUpKS5yZXR1cm5zKFxuSXNzdWVyS2V5d29yZFJlY29yZFNoYXBlKSxcblxuZ2V0UHVibGljRmFjZXQ6TS5jYWxsV2hlbihNLmF3YWl0KEluc3RhbmNlSGFuZGxlU2hhcGUpKS5yZXR1cm5zKFxuTS5yZW1vdGFibGUoJ1B1YmxpY0ZhY2V0JykpLFxuXG5nZXRUZXJtczpNLmNhbGxXaGVuKE0uYXdhaXQoSW5zdGFuY2VIYW5kbGVTaGFwZSkpLnJldHVybnMoTS5hbnkoKSksXG5nZXRJbnN0YWxsYXRpb25Gb3JJbnN0YW5jZTpNLmNhbGxXaGVuKFxuTS5hd2FpdChJbnN0YW5jZUhhbmRsZVNoYXBlKSkuXG5yZXR1cm5zKE0uZXJlZihNLnJlbW90YWJsZSgnSW5zdGFsbGF0aW9uJykpKSxcbmdldEJ1bmRsZUlERnJvbUluc3RhbGxhdGlvbjpNLmNhbGwoSW5zdGFsbGF0aW9uU2hhcGUpLnJldHVybnMoXG5NLmVyZWYoTS5zdHJpbmcoKSkpLFxuXG5cbmdldEluc3RhbGxhdGlvbjpNLmNhbGwoTS5lcmVmKEludml0YXRpb25TaGFwZSkpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuZ2V0SW5zdGFuY2U6TS5jYWxsKE0uZXJlZihJbnZpdGF0aW9uU2hhcGUpKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbmdldENvbmZpZ3VyYXRpb246TS5jYWxsKCkucmV0dXJucyh7XG5mZWVJc3N1ZXJDb25maWc6e1xubmFtZTpNLnN0cmluZygpLFxuYXNzZXRLaW5kOiduYXQnLFxuZGlzcGxheUluZm86RGlzcGxheUluZm9TaGFwZX19KSxcblxuXG5nZXRJbnZpdGF0aW9uRGV0YWlsczpNLmNhbGwoTS5lcmVmKEludml0YXRpb25TaGFwZSkpLnJldHVybnMoTS5hbnkoKSksXG5nZXRQcm9wb3NhbFNoYXBlRm9ySW52aXRhdGlvbjpNLmNhbGwoSW52aXRhdGlvbkhhbmRsZVNoYXBlKS5yZXR1cm5zKFxuTS5vcHQoUHJvcG9zYWxTaGFwZSkpfSksXG5cblxuZmVlTWludEFjY2Vzc1JldHJpZXZlcjpNLmludGVyZmFjZSgnRmVlTWludEFjY2Vzc1JldHJpZXZlcicse1xuZ2V0Ok0uY2FsbCgpLnJldHVybnMoTS5hbnkoKSl9KX0pOyRo4oCNX29uY2UuWm9lU2VydmljZUlLaXQoWm9lU2VydmljZUlLaXQpO1xuXG5cblxuY29uc3QgICAgICAgIEFkbWluRmFjZXRJPU0uaW50ZXJmYWNlKCdaY2ZBZG1pbkZhY2V0Jyx7XG5nZXRWYXRTaHV0ZG93blByb21pc2U6TS5jYWxsKCkucmV0dXJucyhNLnByb21pc2UoKSksXG5yZXN0YXJ0Q29udHJhY3Q6TS5jYWxsKCkub3B0aW9uYWwoTS5hbnkoKSkucmV0dXJucyhNLnByb21pc2UoKSksXG51cGdyYWRlQ29udHJhY3Q6TS5jYWxsKE0uc3RyaW5nKCkpLm9wdGlvbmFsKE0uYW55KCkpLnJldHVybnMoTS5wcm9taXNlKCkpfSk7JGjigI1fb25jZS5BZG1pbkZhY2V0SShBZG1pbkZhY2V0SSk7XG5cblxuY29uc3QgICAgICAgIFNlYXREYXRhU2hhcGU9aGFyZGVuKHtcbnByb3Bvc2FsOlByb3Bvc2FsU2hhcGUsXG5pbml0aWFsQWxsb2NhdGlvbjpBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUsXG5zZWF0SGFuZGxlOlNlYXRTaGFwZX0pOyRo4oCNX29uY2UuU2VhdERhdGFTaGFwZShTZWF0RGF0YVNoYXBlKTtcblxuXG5jb25zdCAgICAgICAgSGFuZGxlT2ZmZXJJPU0uaW50ZXJmYWNlKCdIYW5kbGVPZmZlcicse1xuaGFuZGxlT2ZmZXI6TS5jYWxsKEludml0YXRpb25IYW5kbGVTaGFwZSxTZWF0RGF0YVNoYXBlKS5yZXR1cm5zKHtcbm9mZmVyUmVzdWx0UHJvbWlzZTpNLnByb21pc2UoKSxcbmV4aXRPYmo6RXhpdE9iamVjdEl9KX0pOyRo4oCNX29uY2UuSGFuZGxlT2ZmZXJJKEhhbmRsZU9mZmVySSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiS2V5d29yZFNoYXBlIjpbIktleXdvcmRTaGFwZSJdLCJJbnZpdGF0aW9uSGFuZGxlU2hhcGUiOlsiSW52aXRhdGlvbkhhbmRsZVNoYXBlIl0sIkludml0YXRpb25TaGFwZSI6WyJJbnZpdGF0aW9uU2hhcGUiXSwiSW5zdGFuY2VIYW5kbGVTaGFwZSI6WyJJbnN0YW5jZUhhbmRsZVNoYXBlIl0sIkluc3RhbGxhdGlvblNoYXBlIjpbIkluc3RhbGxhdGlvblNoYXBlIl0sIlNlYXRTaGFwZSI6WyJTZWF0U2hhcGUiXSwiQW1vdW50S2V5d29yZFJlY29yZFNoYXBlIjpbIkFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSJdLCJBbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZFNoYXBlIjpbIkFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkU2hhcGUiXSwiUGF5bWVudEtleXdvcmRSZWNvcmRTaGFwZSI6WyJQYXltZW50S2V5d29yZFJlY29yZFNoYXBlIl0sIlBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlIjpbIlBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlIl0sIklzc3VlcktleXdvcmRSZWNvcmRTaGFwZSI6WyJJc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGUiXSwiSXNzdWVyUEtleXdvcmRSZWNvcmRTaGFwZSI6WyJJc3N1ZXJQS2V5d29yZFJlY29yZFNoYXBlIl0sIkJyYW5kS2V5d29yZFJlY29yZFNoYXBlIjpbIkJyYW5kS2V5d29yZFJlY29yZFNoYXBlIl0sIklzc3VlclJlY29yZFNoYXBlIjpbIklzc3VlclJlY29yZFNoYXBlIl0sIlRlcm1zU2hhcGUiOlsiVGVybXNTaGFwZSJdLCJJbnN0YW5jZVJlY29yZFNoYXBlIjpbIkluc3RhbmNlUmVjb3JkU2hhcGUiXSwiSGFuZGxlSSI6WyJIYW5kbGVJIl0sIm1ha2VIYW5kbGVTaGFwZSI6WyJtYWtlSGFuZGxlU2hhcGUiXSwiVGltZXJTaGFwZSI6WyJUaW1lclNoYXBlIl0sIkZ1bGxQcm9wb3NhbFNoYXBlIjpbIkZ1bGxQcm9wb3NhbFNoYXBlIl0sIlByb3Bvc2FsU2hhcGUiOlsiUHJvcG9zYWxTaGFwZSJdLCJpc09uRGVtYW5kRXhpdFJ1bGUiOlsiaXNPbkRlbWFuZEV4aXRSdWxlIl0sImlzV2FpdmVkRXhpdFJ1bGUiOlsiaXNXYWl2ZWRFeGl0UnVsZSJdLCJpc0FmdGVyRGVhZGxpbmVFeGl0UnVsZSI6WyJpc0FmdGVyRGVhZGxpbmVFeGl0UnVsZSJdLCJJbnZpdGF0aW9uRWxlbWVudFNoYXBlIjpbIkludml0YXRpb25FbGVtZW50U2hhcGUiXSwiT2ZmZXJIYW5kbGVySSI6WyJPZmZlckhhbmRsZXJJIl0sIlNlYXRIYW5kbGVBbGxvY2F0aW9uc1NoYXBlIjpbIlNlYXRIYW5kbGVBbGxvY2F0aW9uc1NoYXBlIl0sIlpvZU1pbnRTaGFwZSI6WyJab2VNaW50U2hhcGUiXSwiWm9lTWludEkiOlsiWm9lTWludEkiXSwiWmNmTWludEkiOlsiWmNmTWludEkiXSwiRXhpdE9iamVjdEkiOlsiRXhpdE9iamVjdEkiXSwiRXhpdE9iamVjdFNoYXBlIjpbIkV4aXRPYmplY3RTaGFwZSJdLCJJbnN0YW5jZUFkbWluU2hhcGUiOlsiSW5zdGFuY2VBZG1pblNoYXBlIl0sIkluc3RhbmNlQWRtaW5JIjpbIkluc3RhbmNlQWRtaW5JIl0sIkluc3RhbmNlU3RvcmFnZU1hbmFnZXJJS2l0IjpbIkluc3RhbmNlU3RvcmFnZU1hbmFnZXJJS2l0Il0sIkJ1bmRsZUNhcFNoYXBlIjpbIkJ1bmRsZUNhcFNoYXBlIl0sIkJ1bmRsZVNoYXBlIjpbIkJ1bmRsZVNoYXBlIl0sIlpvZVN0b3JhZ2VNYW5hZ2VySUtpdCI6WyJab2VTdG9yYWdlTWFuYWdlcklLaXQiXSwiWm9lU2VydmljZUlLaXQiOlsiWm9lU2VydmljZUlLaXQiXSwiQWRtaW5GYWNldEkiOlsiQWRtaW5GYWNldEkiXSwiU2VhdERhdGFTaGFwZSI6WyJTZWF0RGF0YVNoYXBlIl0sIkhhbmRsZU9mZmVySSI6WyJIYW5kbGVPZmZlckkiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAfqSfx2sHAABrBwAAIAAAAEBhZ29yaWMvem9lLXYwLjI1LjMvc3JjL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIi8+Ki9cblxuLyoqXG4gKiBAdGVtcGxhdGUge3N0cmluZ30gSCAtIHRoZSBuYW1lIG9mIHRoZSBoYW5kbGVcbiAqIEB0eXBlZGVmIHtIICYgWGltcG9ydChcIkBlbmRvL21hcnNoYWxcIikuUmVtb3RhYmxlfSBIYW5kbGUgQSB0eXBlIGNvbnN0cnVjdG9yIGZvciBhbiBvcGFxdWUgdHlwZVxuICogaWRlbnRpZmllZCBieSB0aGUgSCBzdHJpbmcuIFRoaXMgdXNlcyBhbiBpbnRlcnNlY3Rpb24gdHlwZVxuICogKCdNeUhhbmRsZScgJiB7fSkgdG8gdGFnIHRoZSBoYW5kbGUncyB0eXBlIGV2ZW4gdGhvdWdoIHRoZSBhY3R1YWxcbiAqIHZhbHVlIGlzIGp1c3QgYW4gZW1wdHkgb2JqZWN0LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge3N0cmluZ30gS2V5d29yZFxuICogQHR5cGVkZWYge0hhbmRsZTwnSW52aXRhdGlvbic+fSBJbnZpdGF0aW9uSGFuZGxlIC0gYW4gb3BhcXVlIGhhbmRsZSBmb3IgYW4gaW52aXRhdGlvblxuICogQHR5cGVkZWYge1JlY29yZDxLZXl3b3JkLCBJc3N1ZXI8YW55Pj59IElzc3VlcktleXdvcmRSZWNvcmRcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8S2V5d29yZCwgRVJlZjxJc3N1ZXI8YW55Pj4+fSBJc3N1ZXJQS2V5d29yZFJlY29yZFxuICogQHR5cGVkZWYge1JlY29yZDxLZXl3b3JkLCBCcmFuZDxhbnk+Pn0gQnJhbmRLZXl3b3JkUmVjb3JkXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTdGFuZGFyZFRlcm1zXG4gKiBAcHJvcGVydHkge0lzc3VlcktleXdvcmRSZWNvcmR9IGlzc3VlcnMgLSByZWNvcmQgd2l0aFxuICoga2V5d29yZHMga2V5cywgaXNzdWVyIHZhbHVlc1xuICogQHByb3BlcnR5IHtCcmFuZEtleXdvcmRSZWNvcmR9IGJyYW5kcyAtIHJlY29yZCB3aXRoIGtleXdvcmRzXG4gKiBrZXlzLCBicmFuZCB2YWx1ZXNcbiAqXG4gKiBAdHlwZWRlZiB7U3RhbmRhcmRUZXJtcyAmIFJlY29yZDxzdHJpbmcsIGFueT59IEFueVRlcm1zXG4gKlxuICogQHR5cGVkZWYge29iamVjdH0gSW5zdGFuY2VSZWNvcmRcbiAqIEBwcm9wZXJ0eSB7SW5zdGFsbGF0aW9ufSBpbnN0YWxsYXRpb25cbiAqIEBwcm9wZXJ0eSB7WGltcG9ydChcIi4vem9lU2VydmljZS91dGlscy5qc1wiKS5JbnN0YW5jZTxhbnk+fSBpbnN0YW5jZVxuICogQHByb3BlcnR5IHtBbnlUZXJtc30gdGVybXMgLSBjb250cmFjdCBwYXJhbWV0ZXJzXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHR5cGVkZWYge29iamVjdH0gSXNzdWVyUmVjb3JkXG4gKiBAcHJvcGVydHkge0JyYW5kPEs+fSBicmFuZFxuICogQHByb3BlcnR5IHtJc3N1ZXI8Sz59IGlzc3VlclxuICogQHByb3BlcnR5IHtLfSBhc3NldEtpbmRcbiAqIEBwcm9wZXJ0eSB7RGlzcGxheUluZm88Sz59IFtkaXNwbGF5SW5mb11cbiAqXG4gKiBAdHlwZWRlZiB7QW1vdW50S2V5d29yZFJlY29yZH0gQWxsb2NhdGlvblxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtvYmplY3R9IFtSPXVua25vd25dIE9mZmVyIHJlc3VsdFxuICogQHRlbXBsYXRlIHtvYmplY3R9IFtBPW5ldmVyXSBPZmZlciBhcmdzXG4gKiBAdHlwZWRlZiB7UGF5bWVudDwnc2V0Jz59IEludml0YXRpb25cbiAqL1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA+/rD3gi4AAIIuAAArAAAAQGFnb3JpYy96b2UtdjAuMjUuMy9zcmMvem9lU2VydmljZS90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qLyA8cmVmZXJlbmNlIHR5cGVzPVwic2VzXCIvPiovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gWm9lU2VydmljZVxuICpcbiAqIFpvZSBwcm92aWRlcyBhIGZyYW1ld29yayBmb3IgZGVwbG95aW5nIGFuZCB3b3JraW5nIHdpdGggc21hcnRcbiAqIGNvbnRyYWN0cy4gSXQgaXMgYWNjZXNzZWQgYXMgYSBsb25nLWxpdmVkIGFuZCB3ZWxsLXRydXN0ZWQgc2VydmljZVxuICogdGhhdCBlbmZvcmNlcyBvZmZlciBzYWZldHkgZm9yIHRoZSBjb250cmFjdHMgdGhhdCB1c2UgaXQuIFpvZSBoYXMgYVxuICogc2luZ2xlIGBpbnZpdGF0aW9uSXNzdWVyYCBmb3IgdGhlIGVudGlyZXR5IG9mIGl0cyBsaWZldGltZS4gQnlcbiAqIGhhdmluZyBhIHJlZmVyZW5jZSB0byBab2UsIGEgdXNlciBjYW4gZ2V0IHRoZSBgaW52aXRhdGlvbklzc3VlcmBcbiAqIGFuZCB0aHVzIHZhbGlkYXRlIGFueSBgaW52aXRhdGlvbmAgdGhleSByZWNlaXZlIGZyb20gc29tZW9uZSBlbHNlLlxuICpcbiAqIFpvZSBoYXMgdHdvIGRpZmZlcmVudCBmYWNldHM6IHRoZSBwdWJsaWMgWm9lIHNlcnZpY2UgYW5kIHRoZVxuICogY29udHJhY3QgZmFjZXQgKFpDRikuIEVhY2ggY29udHJhY3QgaW5zdGFuY2UgaGFzIGEgY29weSBvZiBaQ0ZcbiAqIHdpdGhpbiBpdHMgdmF0LiBUaGUgY29udHJhY3QgYW5kIFpDRiBuZXZlciBoYXZlIGRpcmVjdCBhY2Nlc3MgdG9cbiAqIHRoZSB1c2VycycgcGF5bWVudHMgb3IgdGhlIFpvZSBwdXJzZXMuXG4gKlxuICogQHByb3BlcnR5IHtHZXRJbnZpdGF0aW9uSXNzdWVyfSBnZXRJbnZpdGF0aW9uSXNzdWVyXG4gKlxuICogWm9lIGhhcyBhIHNpbmdsZSBgaW52aXRhdGlvbklzc3VlcmAgZm9yIHRoZSBlbnRpcmV0eSBvZiBpdHNcbiAqIGxpZmV0aW1lLiBCeSBoYXZpbmcgYSByZWZlcmVuY2UgdG8gWm9lLCBhIHVzZXIgY2FuIGdldCB0aGVcbiAqIGBpbnZpdGF0aW9uSXNzdWVyYCBhbmQgdGh1cyB2YWxpZGF0ZSBhbnkgYGludml0YXRpb25gIHRoZXkgcmVjZWl2ZVxuICogZnJvbSBzb21lb25lIGVsc2UuIFRoZSBtaW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgaW52aXRhdGlvbklzc3VlclxuICogY3JlYXRlcyB0aGUgRVJUUCBwYXltZW50cyB0aGF0IHJlcHJlc2VudCB0aGUgcmlnaHQgdG8gaW50ZXJhY3Qgd2l0aFxuICogYSBzbWFydCBjb250cmFjdCBpbiBwYXJ0aWN1bGFyIHdheXMuXG4gKlxuICogQHByb3BlcnR5IHtJbnN0YWxsQnVuZGxlfSBpbnN0YWxsXG4gKiBAcHJvcGVydHkge0luc3RhbGxCdW5kbGVJRH0gaW5zdGFsbEJ1bmRsZUlEXG4gKiBAcHJvcGVydHkge1hpbXBvcnQoJy4vdXRpbHMnKS5TdGFydEluc3RhbmNlfSBzdGFydEluc3RhbmNlXG4gKiBAcHJvcGVydHkge09mZmVyfSBvZmZlclxuICogQHByb3BlcnR5IHtYaW1wb3J0KCcuL3V0aWxzJykuR2V0UHVibGljRmFjZXR9IGdldFB1YmxpY0ZhY2V0XG4gKiBAcHJvcGVydHkge0dldElzc3VlcnN9IGdldElzc3VlcnNcbiAqIEBwcm9wZXJ0eSB7R2V0QnJhbmRzfSBnZXRCcmFuZHNcbiAqIEBwcm9wZXJ0eSB7WGltcG9ydCgnLi91dGlscycpLkdldFRlcm1zfSBnZXRUZXJtc1xuICogQHByb3BlcnR5IHtHZXRPZmZlckZpbHRlcn0gZ2V0T2ZmZXJGaWx0ZXJcbiAqIEBwcm9wZXJ0eSB7U2V0T2ZmZXJGaWx0ZXJ9IHNldE9mZmVyRmlsdGVyXG4gKiBAcHJvcGVydHkge0dldEluc3RhbGxhdGlvbkZvckluc3RhbmNlfSBnZXRJbnN0YWxsYXRpb25Gb3JJbnN0YW5jZVxuICogQHByb3BlcnR5IHtHZXRJbnN0YW5jZX0gZ2V0SW5zdGFuY2VcbiAqIEBwcm9wZXJ0eSB7R2V0SW5zdGFsbGF0aW9ufSBnZXRJbnN0YWxsYXRpb25cbiAqIEBwcm9wZXJ0eSB7R2V0SW52aXRhdGlvbkRldGFpbHN9IGdldEludml0YXRpb25EZXRhaWxzXG4gKiBSZXR1cm4gYW4gb2JqZWN0IHdpdGggdGhlIGluc3RhbmNlLCBpbnN0YWxsYXRpb24sIGRlc2NyaXB0aW9uLCBpbnZpdGF0aW9uXG4gKiBoYW5kbGUsIGFuZCBhbnkgY3VzdG9tIHByb3BlcnRpZXMgc3BlY2lmaWMgdG8gdGhlIGNvbnRyYWN0LlxuICogQHByb3BlcnR5IHtHZXRGZWVJc3N1ZXJ9IGdldEZlZUlzc3VlclxuICogQHByb3BlcnR5IHtHZXRDb25maWd1cmF0aW9ufSBnZXRDb25maWd1cmF0aW9uXG4gKiBAcHJvcGVydHkge0dldEJ1bmRsZUlERnJvbUluc3RhbGxhdGlvbn0gZ2V0QnVuZGxlSURGcm9tSW5zdGFsbGF0aW9uXG4gKiBAcHJvcGVydHkgeyhpbnZpdGF0aW9uSGFuZGxlOiBJbnZpdGF0aW9uSGFuZGxlKSA9PiBQYXR0ZXJuIHwgdW5kZWZpbmVkfSBnZXRQcm9wb3NhbFNoYXBlRm9ySW52aXRhdGlvblxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEdldEludml0YXRpb25Jc3N1ZXJcbiAqIEByZXR1cm5zIHtQcm9taXNlPElzc3Vlcjwnc2V0Jz4+fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEdldEZlZUlzc3VlclxuICogQHJldHVybnMge1Byb21pc2U8SXNzdWVyPCduYXQnPj59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgR2V0Q29uZmlndXJhdGlvblxuICogQHJldHVybnMge3tcbiAqICAgZmVlSXNzdWVyQ29uZmlnOiBGZWVJc3N1ZXJDb25maWcsXG4gKiB9fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEdldElzc3VlcnNcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi91dGlscycpLkluc3RhbmNlPGFueT59IGluc3RhbmNlXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxJc3N1ZXJLZXl3b3JkUmVjb3JkPn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBHZXRCcmFuZHNcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi91dGlscycpLkluc3RhbmNlPGFueT59IGluc3RhbmNlXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxCcmFuZEtleXdvcmRSZWNvcmQ+fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEdldE9mZmVyRmlsdGVyXG4gKiBAcGFyYW0ge1hpbXBvcnQoJy4vdXRpbHMnKS5JbnN0YW5jZTxhbnk+fSBpbnN0YW5jZVxuICogQHJldHVybnMge3N0cmluZ1tdfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFNldE9mZmVyRmlsdGVyXG4gKiBAcGFyYW0ge0luc3RhbmNlfSBpbnN0YW5jZVxuICogQHBhcmFtIHtzdHJpbmdbXX0gc3RyaW5nc1xuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEdldEluc3RhbGxhdGlvbkZvckluc3RhbmNlXG4gKiBAcGFyYW0ge1hpbXBvcnQoJy4vdXRpbHMnKS5JbnN0YW5jZTxhbnk+fSBpbnN0YW5jZVxuICogQHJldHVybnMge1Byb21pc2U8SW5zdGFsbGF0aW9uPn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBHZXRJbnN0YW5jZVxuICogQHBhcmFtIHtFUmVmPEludml0YXRpb24+fSBpbnZpdGF0aW9uXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxYaW1wb3J0KCcuL3V0aWxzJykuSW5zdGFuY2U8YW55Pj59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgR2V0SW5zdGFsbGF0aW9uXG4gKiBAcGFyYW0ge0VSZWY8SW52aXRhdGlvbj59IGludml0YXRpb25cbiAqIEByZXR1cm5zIHtQcm9taXNlPEluc3RhbGxhdGlvbj59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgR2V0SW52aXRhdGlvbkRldGFpbHNcbiAqIEBwYXJhbSB7RVJlZjxJbnZpdGF0aW9uPn0gaW52aXRhdGlvblxuICogQHJldHVybnMge1Byb21pc2U8SW52aXRhdGlvbkRldGFpbHM+fVxuICovXG5cbi8qIFRPRE8gcmVtb3ZlIHN1cHBvcnQgZm9yIHNvdXJjZSBidW5kbGVzLCBsZWF2aW5nIG9ubHkgc3VwcG9ydCBmb3IgaGFzaCBidW5kbGVzLiovXG4vKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQ1NjUqL1xuLyoqXG4gKiBAY2FsbGJhY2sgSW5zdGFsbEJ1bmRsZVxuICpcbiAqIENyZWF0ZSBhbiBpbnN0YWxsYXRpb24gYnkgc2FmZWx5IGV2YWx1YXRpbmcgdGhlIGNvZGUgYW5kXG4gKiByZWdpc3RlcmluZyBpdCB3aXRoIFpvZS4gUmV0dXJucyBhbiBpbnN0YWxsYXRpb24uXG4gKlxuICogQHBhcmFtIHtCdW5kbGUgfCBTb3VyY2VCdW5kbGV9IGJ1bmRsZVxuICogQHJldHVybnMge1Byb21pc2U8SW5zdGFsbGF0aW9uPn1cbiAqL1xuXG4vKiBUT0RPIGNvbnNvbGlkYXRlIGluc3RhbGxCdW5kbGVJRCBpbnRvIGluc3RhbGwuKi9cbi8qIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNDk3NCovXG4vKipcbiAqIEBjYWxsYmFjayBJbnN0YWxsQnVuZGxlSURcbiAqXG4gKiBDcmVhdGUgYW4gaW5zdGFsbGF0aW9uIGZyb20gYSBCdW5kbGUgSUQuIFJldHVybnMgYW4gaW5zdGFsbGF0aW9uLlxuICpcbiAqIEBwYXJhbSB7QnVuZGxlSUR9IGJ1bmRsZUlEXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxJbnN0YWxsYXRpb24+fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEdldEJ1bmRsZUlERnJvbUluc3RhbGxhdGlvblxuICpcbiAqIFZlcmlmeSB0aGF0IGFuIGFsbGVnZWQgSW5zdGFsbGF0aW9uIGlzIHJlYWwsIGFuZCByZXR1cm4gdGhlIEJ1bmRsZSBJRCBpdFxuICogd2lsbCB1c2UgZm9yIGNvbnRyYWN0IGNvZGUuXG4gKlxuICogQHBhcmFtIHtFUmVmPEluc3RhbGxhdGlvbj59IGFsbGVnZWRJbnN0YWxsYXRpb25cbiAqIEByZXR1cm5zIHtQcm9taXNlPEJ1bmRsZUlEPn1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHs8QXJncywgUmVzdWx0PihcbiAqICAgaW52aXRhdGlvbjogRVJlZjxJbnZpdGF0aW9uPFJlc3VsdCwgQXJncz4+LFxuICogICBwcm9wb3NhbD86IFByb3Bvc2FsLFxuICogICBwYXltZW50S2V5d29yZFJlY29yZD86IFBheW1lbnRQS2V5d29yZFJlY29yZCxcbiAqICAgb2ZmZXJBcmdzPzogQXJncyxcbiAqICAgKSA9PiBQcm9taXNlPFVzZXJTZWF0PFJlc3VsdD4+XG4gKiB9IE9mZmVyXG4gKlxuICogVG8gcmVkZWVtIGFuIGludml0YXRpb24sIHRoZSB1c2VyIG5vcm1hbGx5IHByb3ZpZGVzIGEgcHJvcG9zYWwgKHRoZWlyXG4gKiBydWxlcyBmb3IgdGhlIG9mZmVyKSBhcyB3ZWxsIGFzIHBheW1lbnRzIHRvIGJlIGVzY3Jvd2VkIGJ5IFpvZS4gIElmXG4gKiBlaXRoZXIgdGhlIHByb3Bvc2FsIG9yIHBheW1lbnRzIHdvdWxkIGJlIGVtcHR5LCBpbmRpY2F0ZSB0aGlzIGJ5XG4gKiBvbWl0dGluZyB0aGF0IGFyZ3VtZW50IG9yIHBhc3NpbmcgdW5kZWZpbmVkLCByYXRoZXIgdGhhbiBwYXNzaW5nIGFuXG4gKiBlbXB0eSByZWNvcmQuXG4gKlxuICogVGhlIHByb3Bvc2FsIGhhcyB0aHJlZSBwYXJ0czogYHdhbnRgIGFuZCBgZ2l2ZWAgYXJlIHVzZWQgYnkgWm9lIHRvXG4gKiBlbmZvcmNlIG9mZmVyIHNhZmV0eSwgYW5kIGBleGl0YCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIHBhcnRpY3VsYXJcbiAqIHBheW91dC1saXZlbmVzcyBwb2xpY3kgdGhhdCBab2UgY2FuIGd1YXJhbnRlZS4gYHdhbnRgIGFuZCBgZ2l2ZWBcbiAqIGFyZSBvYmplY3RzIHdpdGgga2V5d29yZHMgYXMga2V5cyBhbmQgYW1vdW50cyBhcyB2YWx1ZXMuXG4gKiBgcGF5bWVudEtleXdvcmRSZWNvcmRgIGlzIGEgcmVjb3JkIHdpdGgga2V5d29yZHMgYXMga2V5cywgYW5kIHRoZVxuICogdmFsdWVzIGFyZSB0aGUgYWN0dWFsIHBheW1lbnRzIHRvIGJlIGVzY3Jvd2VkLiBBIHBheW1lbnQgaXNcbiAqIGV4cGVjdGVkIGZvciBldmVyeSBydWxlIHVuZGVyIGBnaXZlYC5cbiAqL1xuXG4vKipcbiAqIFpvZSB1c2VzIHNlYXRzIHRvIGFjY2VzcyBvciBtYW5pcHVsYXRlIG9mZmVycy4gVGhleSBsZXQgY29udHJhY3RzIGFuZCB1c2Vyc1xuICogaW50ZXJhY3Qgd2l0aCB0aGVtLiBab2UgaGFzIHR3byBraW5kcyBvZiBzZWF0cy4gWkNGU2VhdHMgYXJlIHVzZWQgd2l0aGluXG4gKiBjb250cmFjdHMgYW5kIHdpdGggemNmIG1ldGhvZHMuIFVzZXJTZWF0cyByZXByZXNlbnQgb2ZmZXJzIGV4dGVybmFsIHRvIFpvZVxuICogYW5kIHRoZSBjb250cmFjdC4gVGhlIHBhcnR5IHdobyBleGVyY2lzZXMgYW4gaW52aXRhdGlvbiBhbmQgc2VuZHMgdGhlIG9mZmVyKClcbiAqIG1lc3NhZ2UgdG8gWm9lIGdldHMgYSBVc2VyU2VhdCB0aGF0IGNhbiBjaGVjayBwYXlvdXRzJyBzdGF0dXMgb3IgcmV0cmlldmUgdGhlXG4gKiByZXN1bHQgb2YgcHJvY2Vzc2luZyB0aGUgb2ZmZXIgaW4gdGhlIGNvbnRyYWN0LiBUaGlzIHZhcmllcywgYnV0IGV4YW1wbGVzIGFyZVxuICogYSBzdHJpbmcgYW5kIGFuIGludml0YXRpb24gZm9yIGFub3RoZXIgc2VhdC5cbiAqXG4gKiBBbHNvLCBhIFVzZXJTZWF0IGNhbiBiZSBoYW5kZWQgdG8gYW4gYWdlbnQgb3V0c2lkZSBab2UgYW5kIHRoZSBjb250cmFjdCxcbiAqIGxldHRpbmcgdGhlbSBxdWVyeSBvciBtb25pdG9yIHRoZSBjdXJyZW50IHN0YXRlLCBhY2Nlc3MgdGhlIHBheW91dHMgYW5kXG4gKiByZXN1bHQsIGFuZCwgaWYgaXQncyBhbGxvd2VkIGZvciB0aGlzIHNlYXQsIGNhbGwgdHJ5RXhpdCgpLlxuICpcbiAqIFNpbmNlIGFueW9uZSBjYW4gYXR0ZW1wdCB0byBleGl0IHRoZSBzZWF0IGlmIHRoZXkgaGF2ZSBhIHJlZmVyZW5jZSB0byBpdCwgeW91XG4gKiBzaG91bGQgb25seSBzaGFyZSBhIFVzZXJTZWF0IHdpdGggdHJ1c3RlZCBwYXJ0aWVzLlxuICpcbiAqIFVzZXJTZWF0IGluY2x1ZGVzIHF1ZXJpZXMgZm9yIHRoZSBhc3NvY2lhdGVkIG9mZmVyJ3MgY3VycmVudCBzdGF0ZSBhbmQgYW5cbiAqIG9wZXJhdGlvbiB0byByZXF1ZXN0IHRoYXQgdGhlIG9mZmVyIGV4aXQsIGFzIGZvbGxvd3M6XG4gKlxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kb2NzLmFnb3JpYy5jb20vem9lL2FwaS96b2UuaHRtbCN1c2Vyc2VhdC1vYmplY3R9fVxuICogQHRlbXBsYXRlIHtvYmplY3R9IFtPUj11bmtub3duXVxuICogQHR5cGVkZWYge29iamVjdH0gVXNlclNlYXRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxQcm9wb3NhbFJlY29yZD59IGdldFByb3Bvc2FsXG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8UGF5bWVudFBLZXl3b3JkUmVjb3JkPn0gZ2V0UGF5b3V0c1xuICogcmV0dXJucyBhIHByb21pc2UgZm9yIGEgS2V5d29yZFBheW1lbnRSZWNvcmQgY29udGFpbmluZyBhbGwgdGhlIHBheW91dHMgZnJvbVxuICogdGhpcyBzZWF0LiBUaGUgcHJvbWlzZSB3aWxsIHJlc29sdmUgYWZ0ZXIgdGhlIHNlYXQgaGFzIGV4aXRlZC5cbiAqIEBwcm9wZXJ0eSB7KGtleXdvcmQ6IEtleXdvcmQpID0+IFByb21pc2U8UGF5bWVudDxhbnk+Pn0gZ2V0UGF5b3V0XG4gKiByZXR1cm5zIGEgcHJvbWlzZSBmb3IgdGhlIFBheW1lbnQgY29ycmVzcG9uZGluZyB0byB0aGUgaW5kaWNhdGVkIGtleXdvcmQuXG4gKiBUaGUgcHJvbWlzZSB3aWxsIHJlc29sdmUgYWZ0ZXIgdGhlIHNlYXQgaGFzIGV4aXRlZC5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxPUj59IGdldE9mZmVyUmVzdWx0XG4gKiBAcHJvcGVydHkgeygpID0+IHZvaWR9IFt0cnlFeGl0XVxuICogTm90ZTogT25seSB3b3JrcyBpZiB0aGUgc2VhdCdzIGBwcm9wb3NhbGAgaGFzIGFuIGBPbkRlbWFuZGAgYGV4aXRgIGNsYXVzZS4gWm9lJ3NcbiAqIG9mZmVyLXNhZmV0eSBndWFyYW50ZWUgYXBwbGllcyBubyBtYXR0ZXIgaG93IGEgc2VhdCdzIGludGVyYWN0aW9uIHdpdGggYVxuICogY29udHJhY3QgZW5kcy4gVW5kZXIgbm9ybWFsIGNpcmN1bXN0YW5jZXMsIHRoZSBwYXJ0aWNpcGFudCBtaWdodCBiZSBhYmxlIHRvXG4gKiBjYWxsIGB0cnlFeGl0KClgLCBvciB0aGUgY29udHJhY3QgbWlnaHQgZG8gc29tZXRoaW5nIGV4cGxpY2l0bHkuIE9uIGV4aXRpbmcsXG4gKiB0aGUgc2VhdCBob2xkZXIgZ2V0cyBpdHMgY3VycmVudCBgYWxsb2NhdGlvbmAgYW5kIHRoZSBgc2VhdGAgY2FuIG5vIGxvbmdlclxuICogaW50ZXJhY3Qgd2l0aCB0aGUgY29udHJhY3QuXG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8Ym9vbGVhbj59IGhhc0V4aXRlZFxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBzZWF0IGhhcyBleGl0ZWQsIGZhbHNlIGlmIGl0IGlzIHN0aWxsIGFjdGl2ZS5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTwwfDE+fSBudW1XYW50c1NhdGlzZmllZCByZXR1cm5zIDEgaWYgdGhlIHByb3Bvc2FsJ3NcbiAqIHdhbnQgY2xhdXNlIHdhcyBzYXRpc2ZpZWQgYnkgdGhlIGZpbmFsIGFsbG9jYXRpb24sIG90aGVyd2lzZSAwLiBUaGlzIGlzXG4gKiBudW1lcmljIHRvIHN1cHBvcnQgYSBwbGFubmVkIGVuaGFuY2VtZW50IGNhbGxlZCBcIm11bHRpcGxlc1wiIHdoaWNoIHdpbGwgYWxsb3dcbiAqIHRoZSByZXR1cm4gdmFsdWUgdG8gYmUgYW55IG5vbi1uZWdhdGl2ZSBudW1iZXIuIFRoZSBwcm9taXNlIHdpbGwgcmVzb2x2ZVxuICogYWZ0ZXIgdGhlIHNlYXQgaGFzIGV4aXRlZC5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxBbGxvY2F0aW9uPn0gZ2V0RmluYWxBbGxvY2F0aW9uXG4gKiByZXR1cm4gYSBwcm9taXNlIGZvciB0aGUgZmluYWwgYWxsb2NhdGlvbi4gVGhlIHByb21pc2Ugd2lsbCByZXNvbHZlIGFmdGVyIHRoZVxuICogc2VhdCBoYXMgZXhpdGVkLlxuICogQHByb3BlcnR5IHsoKSA9PiBTdWJzY3JpYmVyPGFueT59IGdldEV4aXRTdWJzY3JpYmVyIHJldHVybnMgYSBzdWJzY3JpYmVyIHRoYXRcbiAqIHdpbGwgYmUgbm90aWZpZWQgd2hlbiB0aGUgc2VhdCBoYXMgZXhpdGVkIG9yIGZhaWxlZC5cbiAqL1xuXG4vKipcbiAqXG4gKiBAdHlwZWRlZiB7UGFydGlhbDxQcm9wb3NhbFJlY29yZD59IFByb3Bvc2FsXG4gKlxuICogQHR5cGVkZWYge3tnaXZlOiBBbW91bnRLZXl3b3JkUmVjb3JkLFxuICogICAgICAgICAgICB3YW50OiBBbW91bnRLZXl3b3JkUmVjb3JkLFxuICogICAgICAgICAgICBleGl0OiBFeGl0UnVsZVxuICogICAgICAgICAgIH19IFByb3Bvc2FsUmVjb3JkXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7UmVjb3JkPEtleXdvcmQsIEFtb3VudDxhbnk+Pn0gQW1vdW50S2V5d29yZFJlY29yZFxuICpcbiAqIFRoZSBrZXlzIGFyZSBrZXl3b3JkcywgYW5kIHRoZSB2YWx1ZXMgYXJlIGFtb3VudHMuIEZvciBleGFtcGxlOlxuICogeyBBc3NldDogQW1vdW50TWF0aC5tYWtlKGFzc2V0QnJhbmQsIDVuKSwgUHJpY2U6XG4gKiBBbW91bnRNYXRoLm1ha2UocHJpY2VCcmFuZCwgOW4pIH1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFdha2VyXG4gKiBAcHJvcGVydHkgeygpID0+IHZvaWR9IHdha2VcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtUaW1lc3RhbXB9IERlYWRsaW5lXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBUaW1lclxuICogQHByb3BlcnR5IHsoZGVhZGxpbmU6IERlYWRsaW5lLCB3YWtlclA6IEVSZWY8V2FrZXI+KSA9PiB2b2lkfSBzZXRXYWtldXBcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IE9uRGVtYW5kRXhpdFJ1bGVcbiAqIEBwcm9wZXJ0eSB7bnVsbH0gb25EZW1hbmRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFdhaXZlZEV4aXRSdWxlXG4gKiBAcHJvcGVydHkge251bGx9IHdhaXZlZFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQWZ0ZXJEZWFkbGluZUV4aXRSdWxlXG4gKiBAcHJvcGVydHkge3t0aW1lcjpUaW1lciwgZGVhZGxpbmU6RGVhZGxpbmV9fSBhZnRlckRlYWRsaW5lXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T25EZW1hbmRFeGl0UnVsZSB8IFdhaXZlZEV4aXRSdWxlIHwgQWZ0ZXJEZWFkbGluZUV4aXRSdWxlfSBFeGl0UnVsZVxuICpcbiAqIFRoZSBwb3NzaWJsZSBrZXlzIGFyZSAnd2FpdmVkJywgJ29uRGVtYW5kJywgYW5kICdhZnRlckRlYWRsaW5lJy5cbiAqIGB0aW1lcmAgYW5kIGBkZWFkbGluZWAgb25seSBhcmUgdXNlZCBmb3IgdGhlIGBhZnRlckRlYWRsaW5lYCBrZXkuXG4gKiBUaGUgcG9zc2libGUgcmVjb3JkcyBhcmU6XG4gKiBgeyB3YWl2ZWQ6IG51bGwgfWBcbiAqIGB7IG9uRGVtYW5kOiBudWxsIH1gXG4gKiBgeyBhZnRlckRlYWRsaW5lOiB7IHRpbWVyIDpUaW1lcjxEZWFkbGluZT4sIGRlYWRsaW5lIDpEZWFkbGluZSB9IH1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3V0aWxzJykuSW5zdGFuY2U8YW55Pn0gSW5zdGFuY2VcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFZhdEFkbWluU3ZjXG4gKiBAcHJvcGVydHkgeyhpZDogQnVuZGxlSUQpID0+IEVSZWY8WGltcG9ydCgnQGFnb3JpYy9zd2luZ3NldC12YXQnKS5CdW5kbGVDYXA+fSB3YWl0Rm9yQnVuZGxlQ2FwXG4gKiBAcHJvcGVydHkgeyhpZDogQnVuZGxlSUQpID0+IEVSZWY8WGltcG9ydCgnQGFnb3JpYy9zd2luZ3NldC12YXQnKS5CdW5kbGVDYXA+fSBnZXRCdW5kbGVDYXBcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZykgPT4gRVJlZjxYaW1wb3J0KCdAYWdvcmljL3N3aW5nc2V0LXZhdCcpLkJ1bmRsZUNhcD59IGdldE5hbWVkQnVuZGxlQ2FwXG4gKiBAcHJvcGVydHkgeyhidW5kbGVDYXA6IFhpbXBvcnQoJ0BhZ29yaWMvc3dpbmdzZXQtdmF0JykuQnVuZGxlQ2FwLCBvcHRpb25zPzogUmVjb3JkPHN0cmluZywgYW55PikgPT4gRVJlZjxSb290QW5kQWRtaW5Ob2RlPn0gY3JlYXRlVmF0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7e2J1bmRsZUNhcDogWGltcG9ydCgnQGFnb3JpYy9zd2luZ3NldC12YXQnKS5CdW5kbGVDYXAgfSB8IHtuYW1lOiBzdHJpbmd9IHwge2lkOiBCdW5kbGVJRH19IFpDRlNwZWNcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBTb3VyY2VCdW5kbGVcbiAqIE9wYXF1ZSB0eXBlIGZvciBhIEpTT05hYmxlIHNvdXJjZSBidW5kbGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8S2V5d29yZCxFUmVmPFBheW1lbnQ8YW55Pj4+fSBQYXltZW50UEtleXdvcmRSZWNvcmRcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8S2V5d29yZCxQYXltZW50PGFueT4+fSBQYXltZW50S2V5d29yZFJlY29yZFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU3RhbmRhcmRJbnZpdGF0aW9uRGV0YWlsc1xuICogQHByb3BlcnR5IHtJbnN0YWxsYXRpb259IGluc3RhbGxhdGlvblxuICogQHByb3BlcnR5IHtYaW1wb3J0KCcuL3V0aWxzJykuSW5zdGFuY2U8YW55Pn0gaW5zdGFuY2VcbiAqIEBwcm9wZXJ0eSB7SW52aXRhdGlvbkhhbmRsZX0gaGFuZGxlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGVzY3JpcHRpb25cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtTdGFuZGFyZEludml0YXRpb25EZXRhaWxzICYgUmVjb3JkPHN0cmluZywgYW55Pn0gSW52aXRhdGlvbkRldGFpbHNcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBbU0Y9YW55XSBjb250cmFjdCBzdGFydCBmdW5jdGlvblxuICogQHR5cGVkZWYge1hpbXBvcnQoJy4vdXRpbHMnKS5JbnN0YWxsYXRpb248U0Y+fSBJbnN0YWxsYXRpb25cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7SW5zdGFsbGF0aW9ufSBJXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnLi91dGlscycpLkluc3RhbGxhdGlvblN0YXJ0PEk+fSBJbnN0YWxsYXRpb25TdGFydFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRmVlSXNzdWVyQ29uZmlnXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZVxuICogQHByb3BlcnR5IHtBc3NldEtpbmR9IGFzc2V0S2luZFxuICogQHByb3BlcnR5IHtEaXNwbGF5SW5mb30gZGlzcGxheUluZm9cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFpvZUZlZXNDb25maWdcbiAqIEBwcm9wZXJ0eSB7TmF0VmFsdWV9IGdldFB1YmxpY0ZhY2V0RmVlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7SGFuZGxlPCdmZWVNaW50QWNjZXNzJz59IEZlZU1pbnRBY2Nlc3NcbiAqL1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC/lfXyqRQAAKkUAAAiAAAAQGFnb3JpYy96b2UtdjAuMjUuMy90b29scy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUHJpY2VRdW90ZVxuICogQHByb3BlcnR5IHtBbW91bnQ8J3NldCc+fSBxdW90ZUFtb3VudFxuICogQW1vdW50IHdob3NlIHZhbHVlIGlzIGEgUHJpY2VRdW90ZVZhbHVlXG4gKiBAcHJvcGVydHkge0VSZWY8UGF5bWVudDwnc2V0Jz4+fSBxdW90ZVBheW1lbnRcbiAqIFRoZSBgcXVvdGVBbW91bnRgIHdyYXBwZWQgYXMgYSBwYXltZW50XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7W1ByaWNlRGVzY3JpcHRpb25dfSBQcmljZVF1b3RlVmFsdWVcbiAqIEEgc2luZ2xlLXZhbHVlZCBzZXQgb2YgUHJpY2VEZXNjcmlwdGlvbnMuICBUaGlzIGlzIHRoZSBgdmFsdWVgIGluXG4gKiBQcmljZVF1b3RlLnF1b3RlQW1vdW50IChgeyBicmFuZCwgdmFsdWU6IFByaWNlUXVvdGVWYWx1ZSB9YCkuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQcmljZURlc2NyaXB0aW9uXG4gKiBBIGRlc2NyaXB0aW9uIG9mIGEgc2luZ2xlIHF1b3RlXG4gKiBAcHJvcGVydHkge0Ftb3VudH0gYW1vdW50SW5cbiAqIFRoZSBhbW91bnQgc3VwcGxpZWQgdG8gYSB0cmFkZVxuICogQHByb3BlcnR5IHtBbW91bnR9IGFtb3VudE91dFxuICogVGhlIHF1b3RlZCByZXN1bHQgb2YgdHJhZGluZyBgYW1vdW50SW5gXG4gKiBAcHJvcGVydHkge1RpbWVyU2VydmljZX0gdGltZXJcbiAqIFRoZSBzZXJ2aWNlIHRoYXQgZ2F2ZSB0aGUgYHRpbWVzdGFtcGBcbiAqIEBwcm9wZXJ0eSB7VGltZXN0YW1wfSB0aW1lc3RhbXBcbiAqIEEgdGltZXN0YW1wIGFjY29yZGluZyB0byBgdGltZXJgIGZvciB0aGUgcXVvdGVcbiAqIEBwcm9wZXJ0eSB7YW55PX0gY29uZGl0aW9uc1xuICogQWRkaXRpb25hbCBjb25kaXRpb25zIGZvciB0aGUgcXVvdGVcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBQcmljZVF1b3RlQ3JlYXRlXG4gKiBAcGFyYW0ge1ByaWNlUXVlcnl9IHByaWNlUXVlcnlcbiAqIEByZXR1cm5zIHtFUmVmPFByaWNlUXVvdGU+IHwgdW5kZWZpbmVkfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFByaWNlUXVvdGVUcmlnZ2VyXG4gKiBAcGFyYW0ge1ByaWNlUXVvdGVDcmVhdGV9IGNyZWF0ZVF1b3RlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQcmljZUF1dGhvcml0eUFkbWluXG4gKiBAcHJvcGVydHkgeyhjcmVhdGVRdW90ZTogUHJpY2VRdW90ZUNyZWF0ZSkgPT4gUHJvbWlzZTx2b2lkPn0gZmlyZVRyaWdnZXJzXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQcmljZUF1dGhvcml0eUtpdFxuICogQHByb3BlcnR5IHtQcmljZUF1dGhvcml0eX0gcHJpY2VBdXRob3JpdHlcbiAqIEBwcm9wZXJ0eSB7UHJpY2VBdXRob3JpdHlBZG1pbn0gYWRtaW5GYWNldFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gTXV0YWJsZVF1b3RlXG4gKiBAcHJvcGVydHkgeyhyZWFzb24/OiBhbnkpID0+IHZvaWR9IGNhbmNlbFxuICogQHByb3BlcnR5IHsoYW1vdW50SW46IEFtb3VudDwnbmF0Jz4sIGFtb3VudE91dDogQW1vdW50PCduYXQnPikgPT4gdm9pZH0gdXBkYXRlTGV2ZWxcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gRVJlZjxQcmljZVF1b3RlPn0gZ2V0UHJvbWlzZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUHJpY2VBdXRob3JpdHlcbiAqIEFuIG9iamVjdCB0aGF0IG1pbnRzIFByaWNlUXVvdGVzIGFuZCBoYW5kbGVzXG4gKiB0cmlnZ2VycyBhbmQgbm90aWZpZXJzIGZvciBjaGFuZ2VzIGluIHRoZSBwcmljZVxuICpcbiAqIEBwcm9wZXJ0eSB7KGJyYW5kSW46IEJyYW5kLCBicmFuZE91dDogQnJhbmQpID0+IEVSZWY8SXNzdWVyPCdzZXQnPj59IGdldFF1b3RlSXNzdWVyXG4gKiBHZXQgdGhlIEVSVFAgaXNzdWVyIG9mIFByaWNlUXVvdGVzIGZvciBhIGdpdmVuIGJyYW5kSW4vYnJhbmRPdXQgcGFpclxuICpcbiAqIEBwcm9wZXJ0eSB7KGJyYW5kSW46IEJyYW5kLFxuICogICAgICAgICAgICAgYnJhbmRPdXQ6IEJyYW5kXG4gKiApID0+IEVSZWY8VGltZXJTZXJ2aWNlPn0gZ2V0VGltZXJTZXJ2aWNlXG4gKiBHZXQgdGhlIHRpbWVyIHVzZWQgaW4gUHJpY2VRdW90ZXMgZm9yIGEgZ2l2ZW4gYnJhbmRJbi9icmFuZE91dCBwYWlyXG4gKlxuICogQHByb3BlcnR5IHsoYW1vdW50SW46IEFtb3VudDwnbmF0Jz4sXG4gKiAgICAgICAgICAgICBicmFuZE91dDogQnJhbmQ8J25hdCc+XG4gKiAgICAgICAgICAgICkgPT4gRVJlZjxOb3RpZmllcjxQcmljZVF1b3RlPj59IG1ha2VRdW90ZU5vdGlmaWVyXG4gKiBCZSBub3RpZmllZCBvZiB0aGUgbGF0ZXN0IFByaWNlUXVvdGVzIGZvciBhIGdpdmVuXG4gKiBgYW1vdW50SW5gLiAgVGhlIHJhdGUgYXQgd2hpY2ggdGhlc2UgYXJlIGlzc3VlZCBtYXkgYmUgdmVyeSBkaWZmZXJlbnQgYmV0d2VlblxuICogYHByaWNlQXV0aG9yaXRpZXNgLlxuICpcbiAqIEBwcm9wZXJ0eSB7KGRlYWRsaW5lOiBUaW1lc3RhbXAsXG4gKiAgICAgICAgICAgICBhbW91bnRJbjogQW1vdW50PCduYXQnPixcbiAqICAgICAgICAgICAgIGJyYW5kT3V0OiBCcmFuZDwnbmF0Jz5cbiAqICkgPT4gUHJvbWlzZTxQcmljZVF1b3RlPn0gcXVvdGVBdFRpbWVcbiAqIFJlc29sdmVzIGFmdGVyIGBkZWFkbGluZWAgcGFzc2VzIG9uIHRoZVxuICogcHJpY2VBdXRob3JpdHkncyB0aW1lclNlcnZpY2Ugd2l0aCB0aGUgcHJpY2UgcXVvdGUgb2YgYGFtb3VudEluYCBhdCB0aGF0IHRpbWVcbiAqXG4gKiBAcHJvcGVydHkgeyhhbW91bnRJbjogQW1vdW50PCduYXQnPixcbiAqICAgICAgICAgICAgIGJyYW5kT3V0OiBCcmFuZDwnbmF0Jz5cbiAqICkgPT4gUHJvbWlzZTxQcmljZVF1b3RlPn0gcXVvdGVHaXZlblxuICogR2V0IGEgcXVvdGUgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGFtb3VudEluXG4gKlxuICogQHByb3BlcnR5IHsoYnJhbmRJbjogQnJhbmQ8J25hdCc+LFxuICogICAgICAgICAgICAgYW1vdW50T3V0OiBBbW91bnQ8J25hdCc+KSA9PiBQcm9taXNlPFByaWNlUXVvdGU+fSBxdW90ZVdhbnRlZFxuICogR2V0IGEgcXVvdGUgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGFtb3VudE91dFxuICpcbiAqIEBwcm9wZXJ0eSB7KGFtb3VudEluOiBBbW91bnQ8J25hdCc+LFxuICogICAgICAgICAgICAgYW1vdW50T3V0TGltaXQ6IEFtb3VudDwnbmF0Jz5cbiAqICkgPT4gUHJvbWlzZTxQcmljZVF1b3RlPn0gcXVvdGVXaGVuR1RcbiAqIFJlc29sdmUgd2hlbiBhIHByaWNlIHF1b3RlIG9mIGBhbW91bnRJbmAgZXhjZWVkcyBgYW1vdW50T3V0TGltaXRgXG4gKlxuICogQHByb3BlcnR5IHsoYW1vdW50SW46IEFtb3VudDwnbmF0Jz4sXG4gKiAgICAgICAgICAgICBhbW91bnRPdXRMaW1pdDogQW1vdW50PCduYXQnPlxuICogKSA9PiBQcm9taXNlPFByaWNlUXVvdGU+fSBxdW90ZVdoZW5HVEVcbiAqIFJlc29sdmUgd2hlbiBhIHByaWNlIHF1b3RlIG9mIGBhbW91bnRJbmAgcmVhY2hlcyBvciBleGNlZWRzIGBhbW91bnRPdXRMaW1pdGBcbiAqXG4gKiBAcHJvcGVydHkgeyhhbW91bnRJbjogQW1vdW50LFxuICogICAgICAgICAgICAgYW1vdW50T3V0TGltaXQ6IEFtb3VudFxuICogKSA9PiBQcm9taXNlPFByaWNlUXVvdGU+fSBxdW90ZVdoZW5MVEVcbiAqIFJlc29sdmUgd2hlbiBhIHByaWNlIHF1b3RlIG9mIGBhbW91bnRJbmAgcmVhY2hlcyBvciBkcm9wcyBiZWxvd1xuICogYGFtb3VudE91dExpbWl0YFxuICpcbiAqIEBwcm9wZXJ0eSB7KGFtb3VudEluOiBBbW91bnQsXG4gKiAgICAgICAgICAgICBhbW91bnRPdXRMaW1pdDogQW1vdW50XG4gKiApID0+IFByb21pc2U8UHJpY2VRdW90ZT59IHF1b3RlV2hlbkxUXG4gKiBSZXNvbHZlIHdoZW4gdGhlIHByaWNlIHF1b3RlIG9mIGBhbW91bnRJbmAgZHJvcHMgYmVsb3cgYGFtb3VudE91dExpbWl0YFxuICpcbiAqIEBwcm9wZXJ0eSB7KGFtb3VudEluOiBBbW91bnQsXG4gKiAgICAgICAgICAgICBhbW91bnRPdXRMaW1pdDogQW1vdW50XG4gKiApID0+IEVSZWY8TXV0YWJsZVF1b3RlPn0gbXV0YWJsZVF1b3RlV2hlbkdUXG4gKiBSZXNvbHZlIHdoZW4gYSBwcmljZSBxdW90ZSBvZiBgYW1vdW50SW5gIGV4Y2VlZHMgYGFtb3VudE91dExpbWl0YFxuICpcbiAqIEBwcm9wZXJ0eSB7KGFtb3VudEluOiBBbW91bnQsXG4gKiAgICAgICAgICAgICBhbW91bnRPdXRMaW1pdDogQW1vdW50XG4gKiApID0+IEVSZWY8TXV0YWJsZVF1b3RlPn0gbXV0YWJsZVF1b3RlV2hlbkdURVxuICogUmVzb2x2ZSB3aGVuIGEgcHJpY2UgcXVvdGUgb2YgYGFtb3VudEluYCByZWFjaGVzIG9yIGV4Y2VlZHNcbiAqIGBhbW91bnRPdXRMaW1pdGBcbiAqXG4gKiBAcHJvcGVydHkgeyhhbW91bnRJbjogQW1vdW50LFxuICogICAgICAgICAgICAgYW1vdW50T3V0TGltaXQ6IEFtb3VudFxuICogKSA9PiBFUmVmPE11dGFibGVRdW90ZT59IG11dGFibGVRdW90ZVdoZW5MVEVcbiAqIFJlc29sdmUgd2hlbiBhIHByaWNlIHF1b3RlIG9mIGBhbW91bnRJbmAgcmVhY2hlcyBvciBkcm9wcyBiZWxvd1xuICogYGFtb3VudE91dExpbWl0YFxuICpcbiAqIEBwcm9wZXJ0eSB7KGFtb3VudEluOiBBbW91bnQsXG4gKiAgICAgICAgICAgICBhbW91bnRPdXRMaW1pdDogQW1vdW50XG4gKiApID0+IEVSZWY8TXV0YWJsZVF1b3RlPn0gbXV0YWJsZVF1b3RlV2hlbkxUXG4gKiBSZXNvbHZlIHdoZW4gdGhlIHByaWNlIHF1b3RlIG9mIGBhbW91bnRJbmAgZHJvcHMgYmVsb3cgYGFtb3VudE91dExpbWl0YFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyhhbW91bnQ6IEFtb3VudDwnbmF0Jz4pID0+IEFtb3VudDwnbmF0Jz59IFByaWNlQ2FsY3VsYXRvclxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFByaWNlUXVlcnlcbiAqIEBwYXJhbSB7UHJpY2VDYWxjdWxhdG9yfSBjYWxjQW1vdW50SW5cbiAqIEBwYXJhbSB7UHJpY2VDYWxjdWxhdG9yfSBjYWxjQW1vdW50T3V0XG4gKiBAcmV0dXJucyB7eyBhbW91bnRJbjogQW1vdW50PCduYXQnPiwgYW1vdW50T3V0OiBBbW91bnQ8J25hdCc+LCB0aW1lc3RhbXA/OiBUaW1lc3RhbXAgfT19XG4gKi9cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA+g/tX+sRAADrEQAAJAAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTYuOC9zcmMvRS5qc3siaW1wb3J0cyI6WyIuL3RyYWNrLXR1cm5zLmpzIl0sImV4cG9ydHMiOlsiZGVmYXVsdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCB0cmFja1R1cm5zOyRo4oCNX2ltcG9ydHMoW1tcIi4vdHJhY2stdHVybnMuanNcIiwgW1tcInRyYWNrVHVybnNcIiwgWyRo4oCNX2EgPT4gKHRyYWNrVHVybnMgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG4vKi8gPHJlZmVyZW5jZSBwYXRoPVwiaW5kZXguZC50c1wiIC8+Ki9cblxuY29uc3R7ZGV0YWlsczpYLHF1b3RlOnF9PWFzc2VydDtcblxuLyoqIEB0eXBlIHtQcm94eUhhbmRsZXI8YW55Pn0gKi9cbmNvbnN0IGJhc2VGcmVlemFibGVQcm94eUhhbmRsZXI9e1xuc2V0KF90YXJnZXQsX3Byb3AsX3ZhbHVlKXtcbnJldHVybiBmYWxzZTtcbiB9LFxuaXNFeHRlbnNpYmxlKF90YXJnZXQpe1xucmV0dXJuIGZhbHNlO1xuIH0sXG5zZXRQcm90b3R5cGVPZihfdGFyZ2V0LF92YWx1ZSl7XG5yZXR1cm4gZmFsc2U7XG4gfSxcbmRlbGV0ZVByb3BlcnR5KF90YXJnZXQsX3Byb3Ape1xucmV0dXJuIGZhbHNlO1xuIH19O1xuXG5cbi8qIEUgUHJveHkgaGFuZGxlcnMgcHJldGVuZCB0aGF0IGFueSBwcm9wZXJ0eSBleGlzdHMgb24gdGhlIHRhcmdldCBhbmQgcmV0dXJucyovXG4vKiBhIGZ1bmN0aW9uIGZvciB0aGVpciB2YWx1ZS4gV2hpbGUgdGhpcyBmdW5jdGlvbiBpcyBcImJvdW5kXCIgYnkgY29udGV4dCwgaXQgaXMqL1xuLyogbWVhbnQgdG8gYmUgY2FsbGVkIGFzIGEgbWV0aG9kLiBGb3IgdGhhdCByZWFzb24sIHRoZSByZXR1cm5lZCBmdW5jdGlvbiovXG4vKiBpbmNsdWRlcyBhIGNoZWNrIHRoYXQgdGhlIGB0aGlzYCBhcmd1bWVudCBjb3JyZXNwb25kcyB0byB0aGUgaW5pdGlhbCovXG4vKiByZWNlaXZlciB3aGVuIHRoZSBmdW5jdGlvbiB3YXMgcmV0cmlldmVkLiovXG4vKiBFIFByb3h5IGhhbmRsZXJzIGFsc28gZm9yd2FyZCBkaXJlY3QgY2FsbHMgdG8gdGhlIHRhcmdldCBpbiBjYXNlIHRoZSByZW1vdGUqL1xuLyogaXMgYSBmdW5jdGlvbiBpbnN0ZWFkIG9mIGFuIG9iamVjdC4gTm8gc3VjaCByZWNlaXZlciBjaGVja3MgYXJlIG5lY2Vzc2FyeSBpbiovXG4vKiB0aGF0IGNhc2UuKi9cblxuLyoqXG4gKiBBIFByb3h5IGhhbmRsZXIgZm9yIEUoeCkuXG4gKlxuICogQHBhcmFtIHsqfSB4IEFueSB2YWx1ZSBwYXNzZWQgdG8gRSh4KVxuICogQHBhcmFtIHtYaW1wb3J0KCcuL2luZGV4JykuSGFuZGxlZFByb21pc2VDb25zdHJ1Y3Rvcn0gSGFuZGxlZFByb21pc2VcbiAqIEByZXR1cm5zIHtQcm94eUhhbmRsZXJ9IHRoZSBQcm94eSBoYW5kbGVyXG4gKi9cbmZ1bmN0aW9uIEVQcm94eUhhbmRsZXIoeCxIYW5kbGVkUHJvbWlzZSl7XG5yZXR1cm4gaGFyZGVuKHtcbi4uLmJhc2VGcmVlemFibGVQcm94eUhhbmRsZXIsXG5nZXQoX3RhcmdldCxwLHJlY2VpdmVyKXtcbnJldHVybiBoYXJkZW4oXG57XG4vKiBUaGlzIGZ1bmN0aW9uIHB1cnBvc2VseSBjaGVja3MgdGhlIGB0aGlzYCB2YWx1ZSAoc2VlIGFib3ZlKSovXG4vKiBJbiBvcmRlciB0byBiZSBgdGhpc2Agc2Vuc2l0aXZlIGl0IGlzIGRlZmluZWQgdXNpbmcgY29uY2lzZSBtZXRob2QqL1xuLyogc3ludGF4IHJhdGhlciB0aGFuIGFzIGFuIGFycm93IGZ1bmN0aW9uLiBUbyBlbnN1cmUgdGhlIGZ1bmN0aW9uKi9cbi8qIGlzIG5vdCBjb25zdHJ1Y3RhYmxlLCBpdCBhbHNvIGF2b2lkcyB0aGUgYGZ1bmN0aW9uYCBzeW50YXguKi9cbltwXSguLi5hcmdzKXtcbmlmKHRoaXMhPT1yZWNlaXZlcil7XG4vKiBSZWplY3QgdGhlIGFzeW5jIGZ1bmN0aW9uIGNhbGwqL1xucmV0dXJuIEhhbmRsZWRQcm9taXNlLnJlamVjdChcbmFzc2VydC5lcnJvcihcblggYFVuZXhwZWN0ZWQgcmVjZWl2ZXIgZm9yIFwiJHtwfVwiIG1ldGhvZCBvZiBFKCR7cSh4KX0pYCkpO1xuXG5cbiB9XG5cbnJldHVybiBIYW5kbGVkUHJvbWlzZS5hcHBseU1ldGhvZCh4LHAsYXJncyk7XG4gfVxuLyogQHRzLWV4cGVjdC1lcnJvciBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzUwMzE5Ki99W1xucF0pO1xuXG4gfSxcbmFwcGx5KF90YXJnZXQsX3RoaXNBcmcsYXJnQXJyYXk9W10pe1xucmV0dXJuIEhhbmRsZWRQcm9taXNlLmFwcGx5RnVuY3Rpb24oeCxhcmdBcnJheSk7XG4gfSxcbmhhcyhfdGFyZ2V0LF9wKXtcbi8qIFdlIGp1c3QgcHJldGVuZCBldmVyeXRoaW5nIGV4aXN0cy4qL1xucmV0dXJuIHRydWU7XG4gfX0pO1xuXG4gfVxuXG4vKipcbiAqIEEgUHJveHkgaGFuZGxlciBmb3IgRS5zZW5kT25seSh4KVxuICogSXQgaXMgYSB2YXJpYW50IG9uIHRoZSBFKHgpIFByb3h5IGhhbmRsZXIuXG4gKlxuICogQHBhcmFtIHsqfSB4IEFueSB2YWx1ZSBwYXNzZWQgdG8gRS5zZW5kT25seSh4KVxuICogQHBhcmFtIHtYaW1wb3J0KCcuL2luZGV4JykuSGFuZGxlZFByb21pc2VDb25zdHJ1Y3Rvcn0gSGFuZGxlZFByb21pc2VcbiAqIEByZXR1cm5zIHtQcm94eUhhbmRsZXJ9IHRoZSBQcm94eSBoYW5kbGVyXG4gKi9cbmZ1bmN0aW9uIEVzZW5kT25seVByb3h5SGFuZGxlcih4LEhhbmRsZWRQcm9taXNlKXtcbnJldHVybiBoYXJkZW4oe1xuLi4uYmFzZUZyZWV6YWJsZVByb3h5SGFuZGxlcixcbmdldChfdGFyZ2V0LHAscmVjZWl2ZXIpe1xucmV0dXJuIGhhcmRlbihcbntcbi8qIFRoaXMgZnVuY3Rpb24gcHVycG9zZWx5IGNoZWNrcyB0aGUgYHRoaXNgIHZhbHVlIChzZWUgYWJvdmUpKi9cbi8qIEluIG9yZGVyIHRvIGJlIGB0aGlzYCBzZW5zaXRpdmUgaXQgaXMgZGVmaW5lZCB1c2luZyBjb25jaXNlIG1ldGhvZCovXG4vKiBzeW50YXggcmF0aGVyIHRoYW4gYXMgYW4gYXJyb3cgZnVuY3Rpb24uIFRvIGVuc3VyZSB0aGUgZnVuY3Rpb24qL1xuLyogaXMgbm90IGNvbnN0cnVjdGFibGUsIGl0IGFsc28gYXZvaWRzIHRoZSBgZnVuY3Rpb25gIHN5bnRheC4qL1xuW3BdKC4uLmFyZ3Mpe1xuLyogVGhyb3cgc2luY2UgdGhlIGZ1bmN0aW9uIHJldHVybnMgbm90aGluZyovXG5hc3NlcnQuZXF1YWwoXG50aGlzLFxucmVjZWl2ZXIsXG5YIGBVbmV4cGVjdGVkIHJlY2VpdmVyIGZvciBcIiR7cH1cIiBtZXRob2Qgb2YgRS5zZW5kT25seSgke3EoeCl9KWApO1xuXG5IYW5kbGVkUHJvbWlzZS5hcHBseU1ldGhvZFNlbmRPbmx5KHgscCxhcmdzKTtcbnJldHVybiB1bmRlZmluZWQ7XG4gfVxuLyogQHRzLWV4cGVjdC1lcnJvciBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzUwMzE5Ki99W1xucF0pO1xuXG4gfSxcbmFwcGx5KF90YXJnZXQsX3RoaXNBcmcsYXJnc0FycmF5PVtdKXtcbkhhbmRsZWRQcm9taXNlLmFwcGx5RnVuY3Rpb25TZW5kT25seSh4LGFyZ3NBcnJheSk7XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH0sXG5oYXMoX3RhcmdldCxfcCl7XG4vKiBXZSBqdXN0IHByZXRlbmQgdGhhdCBldmVyeXRoaW5nIGV4aXN0cy4qL1xucmV0dXJuIHRydWU7XG4gfX0pO1xuXG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi9pbmRleCcpLkhhbmRsZWRQcm9taXNlQ29uc3RydWN0b3J9IEhhbmRsZWRQcm9taXNlXG4gKiBAcmV0dXJucyB7WGltcG9ydCgnLi9pbmRleCcpLkVQcm94eX1cbiAqL1xuZnVuY3Rpb24gICAgICAgICAgICAgICAgbWFrZUUoSGFuZGxlZFByb21pc2Upe1xuZnVuY3Rpb24gRSh4KXtcbmNvbnN0IGhhbmRsZXI9RVByb3h5SGFuZGxlcih4LEhhbmRsZWRQcm9taXNlKTtcbnJldHVybiBoYXJkZW4obmV3IFByb3h5KCgpPT57IH0saGFuZGxlcikpO1xuIH1cblxuY29uc3QgbWFrZUVHZXR0ZXJQcm94eT0oeCk9PlxubmV3IFByb3h5KE9iamVjdC5jcmVhdGUobnVsbCkse1xuLi4uYmFzZUZyZWV6YWJsZVByb3h5SGFuZGxlcixcbmhhcyhfdGFyZ2V0LF9wcm9wKXtcbnJldHVybiB0cnVlO1xuIH0sXG5nZXQoX3RhcmdldCxwcm9wKXtcbnJldHVybiBIYW5kbGVkUHJvbWlzZS5nZXQoeCxwcm9wKTtcbiB9fSk7XG5cblxuRS5nZXQ9bWFrZUVHZXR0ZXJQcm94eTtcbkUucmVzb2x2ZT1IYW5kbGVkUHJvbWlzZS5yZXNvbHZlO1xuRS5zZW5kT25seT0oeCk9PntcbmNvbnN0IGhhbmRsZXI9RXNlbmRPbmx5UHJveHlIYW5kbGVyKHgsSGFuZGxlZFByb21pc2UpO1xucmV0dXJuIGhhcmRlbihuZXcgUHJveHkoKCk9PnsgfSxoYW5kbGVyKSk7XG4gfTtcblxuRS53aGVuPSh4LG9uZnVsZmlsbGVkLG9ucmVqZWN0ZWQpPT57XG5jb25zdFtvbnN1Y2Nlc3Msb25mYWlsdXJlXT10cmFja1R1cm5zKFtvbmZ1bGZpbGxlZCxvbnJlamVjdGVkXSk7XG5yZXR1cm4gSGFuZGxlZFByb21pc2UucmVzb2x2ZSh4KS50aGVuKG9uc3VjY2VzcyxvbmZhaWx1cmUpO1xuIH07XG5cbnJldHVybiBoYXJkZW4oRSk7XG4gfSRo4oCNX29uY2UuZGVmYXVsdCggICAgIG1ha2VFKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZhdWx0IjpbImRlZmF1bHQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAotScywoCAAAKAgAAKgAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTYuOC9zcmMvbm8tc2hpbS5qc3siaW1wb3J0cyI6WyIuL0UuanMiXSwiZXhwb3J0cyI6WyJFIiwiSGFuZGxlZFByb21pc2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgbWFrZUU7JGjigI1faW1wb3J0cyhbW1wiLi9FLmpzXCIsIFtbXCJkZWZhdWx0XCIsIFskaOKAjV9hID0+IChtYWtlRSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cbmNvbnN0IGhwPUhhbmRsZWRQcm9taXNlOyRo4oCNX29uY2UuaHAoaHApO1xuY29uc3QgICAgICAgIEU9bWFrZUUoSGFuZGxlZFByb21pc2UpOyRo4oCNX29uY2UuRShFKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJIYW5kbGVkUHJvbWlzZSI6WyJocCJdLCJFIjpbIkUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA4rOx3dgPAADYDwAALgAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTYuOC9zcmMvdHJhY2stdHVybnMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbInRyYWNrVHVybnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBnbG9iYWwgZ2xvYmFsVGhpcyAqL1xuLyogQHRzLW5vY2hlY2sqL1xuXG4vKiBOT1RFOiBXZSBjYW4ndCBpbXBvcnQgdGhlc2UgYmVjYXVzZSB0aGV5J3JlIG5vdCBpbiBzY29wZSBiZWZvcmUgbG9ja2Rvd24uKi9cbi8qIGltcG9ydCB7IGFzc2VydCwgZGV0YWlscyBhcyBYLCBGYWlsIH0gZnJvbSAnQGFnb3JpYy9hc3NlcnQnOyovXG5cbi8qIFdBUk5JTkc6IEdsb2JhbCBNdXRhYmxlIFN0YXRlISovXG4vKiBUaGlzIHN0YXRlIGlzIGNvbW11bmljYXRlZCB0byBgYXNzZXJ0YCB0aGF0IG1ha2VzIGl0IGF2YWlsYWJsZSB0byB0aGUqL1xuLyogY2F1c2FsIGNvbnNvbGUsIHdoaWNoIGFmZmVjdHMgdGhlIGNvbnNvbGUgbG9nIG91dHB1dC4gTm9ybWFsbHkgd2UqL1xuLyogcmVnYXJkIHRoZSBhYmlsaXR5IHRvIHNlZSBjb25zb2xlIGxvZyBvdXRwdXQgYXMgYSBtZXRhLWxldmVsIHByaXZpbGVnZSovXG4vKiBhbmFsb2dvdXMgdG8gdGhlIGFiaWxpdHkgdG8gZGVidWcuIEFzaWRlIGZyb20gdGhhdCwgdGhpcyBtb2R1bGUgc2hvdWxkKi9cbi8qIG5vdCBoYXZlIGFueSBvYnNlcnZhYmx5IG11dGFibGUgc3RhdGUuKi9cblxubGV0IGhpZGRlblByaW9yRXJyb3I7XG5sZXQgaGlkZGVuQ3VycmVudFR1cm49MDtcbmxldCBoaWRkZW5DdXJyZW50RXZlbnQ9MDtcblxuLyogVE9ETyBVc2UgZW52aXJvbm1lbnQtb3B0aW9ucy5qcyBjdXJyZW50bHkgaW4gc2VzL3NyYyBhZnRlciBmYWN0b3JpbmcgaXQgb3V0Ki9cbi8qIHRvIGEgbmV3IHBhY2thZ2UuKi9cbmNvbnN0IGVudj0oZ2xvYmFsVGhpcy5wcm9jZXNzfHx7fSkuZW52fHx7fTtcblxuLyogVHVybiBvbiBpZiB5b3Ugc2VlbSB0byBiZSBsb3NpbmcgZXJyb3IgbG9nZ2luZyBhdCB0aGUgdG9wIG9mIHRoZSBldmVudCBsb29wKi9cbmNvbnN0IFZFUkJPU0U9KGVudi5ERUJVR3x8JycpLnNwbGl0KCc6JykuaW5jbHVkZXMoJ3RyYWNrLXR1cm5zJyk7XG5cbi8qIFRyYWNrLXR1cm5zIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQgYW5kIGNhbiBiZSBlbmFibGVkIGJ5IGFuIGVudmlyb25tZW50Ki9cbi8qIG9wdGlvbi4gV2UgaW50ZW5kIHRvIGNoYW5nZSB0aGUgZGVmYXVsdCBhZnRlciB2ZXJpZnlpbmcgdGhhdCBoYXZpbmcqL1xuLyogdGhlIGZlYXR1cmUgZW5hYmxlZCBpbiBwcm9kdWN0aW9uIGRvZXMgbm90IGNhdXNlIG1lbW9yeSB0byBsZWFrLiovXG5jb25zdCBFTkFCTEVEPWVudi5UUkFDS19UVVJOUz09PSdlbmFibGVkJztcblxuLyogV2UgaG9pc3QgdGhlc2UgZnVuY3Rpb25zIG91dCBvZiB0cmFja1R1cm5zKCkgdG8gZGlzY291cmFnZSB0aGUqL1xuLyogY2xvc3VyZXMgZnJvbSBob2xkaW5nIG9udG8gJ2FyZ3MnIG9yICdmdW5jJyBsb25nZXIgdGhhbiBuZWNlc3NhcnksKi9cbi8qIHdoaWNoIHdlJ3ZlIHNlZW4gY2F1c2UgSGFuZGxlZFByb21pc2UgYXJndW1lbnRzIHRvIGJlIHJldGFpbmVkIGZvciovXG4vKiBhIHN1cnByaXNpbmdseSBsb25nIHRpbWUuKi9cblxuY29uc3QgYWRkUmVqZWN0aW9uTm90ZT0oZGV0YWlsc05vdGUpPT4ocmVhc29uKT0+e1xuaWYocmVhc29uIGluc3RhbmNlb2YgRXJyb3Ipe1xuYXNzZXJ0Lm5vdGUocmVhc29uLGRldGFpbHNOb3RlKTtcbiB9XG5pZihWRVJCT1NFKXtcbmNvbnNvbGUubG9nKCdSRUpFQ1RFRCBhdCB0b3Agb2YgZXZlbnQgbG9vcCcscmVhc29uKTtcbiB9XG4gfTtcblxuY29uc3Qgd3JhcEZ1bmN0aW9uPShmdW5jLHNlbmRpbmdFcnJvcixYKT0+KC4uLmFyZ3MpPT57XG5oaWRkZW5QcmlvckVycm9yPXNlbmRpbmdFcnJvcjtcbmhpZGRlbkN1cnJlbnRUdXJuKz0xO1xuaGlkZGVuQ3VycmVudEV2ZW50PTA7XG50cnl7XG5sZXQgcmVzdWx0O1xudHJ5e1xucmVzdWx0PWZ1bmMoLi4uYXJncyk7XG4gfWNhdGNoKGVycil7XG5pZihlcnIgaW5zdGFuY2VvZiBFcnJvcil7XG5hc3NlcnQubm90ZShcbmVycixcblggYFRocm93biBmcm9tOiAke2hpZGRlblByaW9yRXJyb3J9OiR7aGlkZGVuQ3VycmVudFR1cm59LiR7aGlkZGVuQ3VycmVudEV2ZW50fWApO1xuXG4gfVxuaWYoVkVSQk9TRSl7XG5jb25zb2xlLmxvZygnVEhST1dOIHRvIHRvcCBvZiBldmVudCBsb29wJyxlcnIpO1xuIH1cbnRocm93IGVycjtcbiB9XG4vKiBNdXN0IGNhcHR1cmUgdGhpcyBub3csIG5vdCB3aGVuIHRoZSBjYXRjaCB0cmlnZ2Vycy4qL1xuY29uc3QgZGV0YWlsc05vdGU9WCBgUmVqZWN0aW9uIGZyb206ICR7aGlkZGVuUHJpb3JFcnJvcn06JHtoaWRkZW5DdXJyZW50VHVybn0uJHtoaWRkZW5DdXJyZW50RXZlbnR9YDtcblByb21pc2UucmVzb2x2ZShyZXN1bHQpLmNhdGNoKGFkZFJlamVjdGlvbk5vdGUoZGV0YWlsc05vdGUpKTtcbnJldHVybiBoYXJkZW4ocmVzdWx0KTtcbiB9ZmluYWxseXtcbmhpZGRlblByaW9yRXJyb3I9dW5kZWZpbmVkO1xuIH1cbiB9O1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkpIHwgdW5kZWZpbmVkfSBUdXJuU3RhcnRlckZuXG4gKiBBbiBvcHRpb25hbCBmdW5jdGlvbiB0aGF0IGlzIG5vdCB0aGlzLXNlbnNpdGl2ZSwgZXhwZWN0ZWQgdG8gYmUgY2FsbGVkIGF0XG4gKiBib3R0b20gb2Ygc3RhY2sgdG8gc3RhcnQgYSBuZXcgdHVybi5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7VHVyblN0YXJ0ZXJGbltdfSBUXG4gKiBHaXZlbiBhIGxpc3Qgb2YgYFR1cm5TdGFydGVyRm5gcywgcmV0dXJucyBhIGxpc3Qgb2YgYFR1cm5TdGFydGVyRm5gcyB3aG9zZVxuICogYHRoaXNgLWZyZWUgY2FsbCBiZWhhdmlvcnMgYXJlIG5vdCBvYnNlcnZhYmx5IGRpZmZlcmVudCB0byB0aG9zZSB0aGF0XG4gKiBjYW5ub3Qgc2VlIGNvbnNvbGUgb3V0cHV0LiBUaGUgb25seSBwdXJwb3NlIGlzIHRvIGNhdXNlIGFkZGl0aW9uYWxcbiAqIGluZm9ybWF0aW9uIHRvIGFwcGVhciBvbiB0aGUgY29uc29sZS5cbiAqXG4gKiBUaGUgY2FsbCB0byBgdHJhY2tUdXJuc2AgaXMgaXRzZWxmIGEgc2VuZGluZyBldmVudCwgdGhhdCBvY2N1cnMgaW4gc29tZSBjYWxsXG4gKiBzdGFjayBpbiBzb21lIHR1cm4gbnVtYmVyIGF0IHNvbWUgZXZlbnQgbnVtYmVyIHdpdGhpbiB0aGF0IHR1cm4uIEVhY2ggY2FsbFxuICogdG8gYW55IG9mIHRoZSByZXR1cm5lZCBgVHVyblN0YXJ0Rm5gcyBpcyBhIHJlY2VpdmluZyBldmVudCB0aGF0IGJlZ2lucyBhIG5ld1xuICogdHVybi4gVGhpcyBzZW5kaW5nIGV2ZW50IGNhdXNlZCBlYWNoIG9mIHRob3NlIHJlY2VpdmluZyBldmVudHMuXG4gKlxuICogQHBhcmFtIHtUfSBmdW5jc1xuICogQHJldHVybnMge1R9XG4gKi9cbmNvbnN0ICAgICAgICB0cmFja1R1cm5zPShmdW5jcyk9PntcbmlmKCFFTkFCTEVEfHx0eXBlb2YgZ2xvYmFsVGhpcz09PSd1bmRlZmluZWQnfHwhZ2xvYmFsVGhpcy5hc3NlcnQpe1xucmV0dXJuIGZ1bmNzO1xuIH1cbmNvbnN0e2RldGFpbHM6WH09YXNzZXJ0O1xuXG5oaWRkZW5DdXJyZW50RXZlbnQrPTE7XG5jb25zdCBzZW5kaW5nRXJyb3I9bmV3IEVycm9yKFxuIGBFdmVudDogJHtoaWRkZW5DdXJyZW50VHVybn0uJHtoaWRkZW5DdXJyZW50RXZlbnR9YCk7XG5cbmlmKGhpZGRlblByaW9yRXJyb3IhPT11bmRlZmluZWQpe1xuYXNzZXJ0Lm5vdGUoc2VuZGluZ0Vycm9yLFggYENhdXNlZCBieTogJHtoaWRkZW5QcmlvckVycm9yfWApO1xuIH1cblxucmV0dXJuIGZ1bmNzLm1hcCgoZnVuYyk9PmZ1bmMmJndyYXBGdW5jdGlvbihmdW5jLHNlbmRpbmdFcnJvcixYKSk7XG4gfTskaOKAjV9vbmNlLnRyYWNrVHVybnModHJhY2tUdXJucyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsidHJhY2tUdXJucyI6WyJ0cmFja1R1cm5zIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAD7lgF62AgAAtgIAAB4AAABAZW5kby9mYXItdjAuMi4xNC9zcmMvaW5kZXguanN7ImltcG9ydHMiOlsiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJFIiwiRmFyIiwiZ2V0SW50ZXJmYWNlT2YiLCJwYXNzU3R5bGVPZiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIiwgWyRo4oCNX2xpdmVbXCJFXCJdXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJGYXJcIiwgWyRo4oCNX2xpdmVbXCJGYXJcIl1dXSxbXCJnZXRJbnRlcmZhY2VPZlwiLCBbJGjigI1fbGl2ZVtcImdldEludGVyZmFjZU9mXCJdXV0sW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2xpdmVbXCJwYXNzU3R5bGVPZlwiXV1dXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6eyJFIjpbIkUiLGZhbHNlXSwiRmFyIjpbIkZhciIsZmFsc2VdLCJnZXRJbnRlcmZhY2VPZiI6WyJnZXRJbnRlcmZhY2VPZiIsZmFsc2VdLCJwYXNzU3R5bGVPZiI6WyJwYXNzU3R5bGVPZiIsZmFsc2VdfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACE1ofwvxAAAL8QAAAdAAAAQGVuZG8vbWFyc2hhbC12MC44LjEvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzIiwiLi9zcmMvZW5jb2RlVG9DYXBEYXRhLmpzIiwiLi9zcmMvaGVscGVycy9lcnJvci5qcyIsIi4vc3JjL2hlbHBlcnMvaXRlci1oZWxwZXJzLmpzIiwiLi9zcmMvaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vc3JjL2hlbHBlcnMvcmVtb3RhYmxlLmpzIiwiLi9zcmMvaGVscGVycy9zeW1ib2wuanMiLCIuL3NyYy9tYWtlLWZhci5qcyIsIi4vc3JjL21ha2VUYWdnZWQuanMiLCIuL3NyYy9tYXJzaGFsLWp1c3Rpbi5qcyIsIi4vc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzIiwiLi9zcmMvbWFyc2hhbC5qcyIsIi4vc3JjL3Bhc3NTdHlsZU9mLmpzIiwiLi9zcmMvdHlwZUd1YXJkcy5qcyIsIi4vc3JjL3R5cGVzLmpzIl0sImV4cG9ydHMiOlsiRmFyIiwiUEFTU19TVFlMRSIsIlFDTEFTUyIsIlJlbW90YWJsZSIsIlRvRmFyRnVuY3Rpb24iLCJhc3NlcnRDaGVja2VyIiwiYXNzZXJ0Q29weUFycmF5IiwiYXNzZXJ0UGFzc2FibGUiLCJhc3NlcnRSZWNvcmQiLCJhc3NlcnRSZW1vdGFibGUiLCJkZWNvZGVUb0p1c3RpbiIsImRlZXBseUZ1bGZpbGxlZCIsImZpbHRlckl0ZXJhYmxlIiwiZ2V0RXJyb3JDb25zdHJ1Y3RvciIsImdldEludGVyZmFjZU9mIiwiZ2V0VGFnIiwiaGFzT3duUHJvcGVydHlPZiIsImlzQ29weUFycmF5IiwiaXNPYmplY3QiLCJpc1JlY29yZCIsImlzUmVtb3RhYmxlIiwibWFrZU1hcnNoYWwiLCJtYWtlVGFnZ2VkIiwibWFwSXRlcmFibGUiLCJuYW1lRm9yUGFzc2FibGVTeW1ib2wiLCJwYXJzZSIsInBhc3NTdHlsZU9mIiwicGFzc2FibGVTeW1ib2xGb3JOYW1lIiwic3RyaW5naWZ5IiwidG9QYXNzYWJsZUVycm9yIl0sInJlZXhwb3J0cyI6WyIuL3NyYy90eXBlcy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vc3JjL2hlbHBlcnMvaXRlci1oZWxwZXJzLmpzXCIsIFtbXCJtYXBJdGVyYWJsZVwiLCBbJGjigI1fbGl2ZVtcIm1hcEl0ZXJhYmxlXCJdXV0sW1wiZmlsdGVySXRlcmFibGVcIiwgWyRo4oCNX2xpdmVbXCJmaWx0ZXJJdGVyYWJsZVwiXV1dXV0sW1wiLi9zcmMvaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiUEFTU19TVFlMRVwiLCBbJGjigI1fbGl2ZVtcIlBBU1NfU1RZTEVcIl1dXSxbXCJpc09iamVjdFwiLCBbJGjigI1fbGl2ZVtcImlzT2JqZWN0XCJdXV0sW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fbGl2ZVtcImFzc2VydENoZWNrZXJcIl1dXSxbXCJnZXRUYWdcIiwgWyRo4oCNX2xpdmVbXCJnZXRUYWdcIl1dXSxbXCJoYXNPd25Qcm9wZXJ0eU9mXCIsIFskaOKAjV9saXZlW1wiaGFzT3duUHJvcGVydHlPZlwiXV1dXV0sW1wiLi9zcmMvaGVscGVycy9lcnJvci5qc1wiLCBbW1wiZ2V0RXJyb3JDb25zdHJ1Y3RvclwiLCBbJGjigI1fbGl2ZVtcImdldEVycm9yQ29uc3RydWN0b3JcIl1dXSxbXCJ0b1Bhc3NhYmxlRXJyb3JcIiwgWyRo4oCNX2xpdmVbXCJ0b1Bhc3NhYmxlRXJyb3JcIl1dXV1dLFtcIi4vc3JjL2hlbHBlcnMvcmVtb3RhYmxlLmpzXCIsIFtbXCJnZXRJbnRlcmZhY2VPZlwiLCBbJGjigI1fbGl2ZVtcImdldEludGVyZmFjZU9mXCJdXV1dXSxbXCIuL3NyYy9oZWxwZXJzL3N5bWJvbC5qc1wiLCBbW1wibmFtZUZvclBhc3NhYmxlU3ltYm9sXCIsIFskaOKAjV9saXZlW1wibmFtZUZvclBhc3NhYmxlU3ltYm9sXCJdXV0sW1wicGFzc2FibGVTeW1ib2xGb3JOYW1lXCIsIFskaOKAjV9saXZlW1wicGFzc2FibGVTeW1ib2xGb3JOYW1lXCJdXV1dXSxbXCIuL3NyYy9wYXNzU3R5bGVPZi5qc1wiLCBbW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2xpdmVbXCJwYXNzU3R5bGVPZlwiXV1dLFtcImFzc2VydFBhc3NhYmxlXCIsIFskaOKAjV9saXZlW1wiYXNzZXJ0UGFzc2FibGVcIl1dXV1dLFtcIi4vc3JjL2RlZXBseUZ1bGZpbGxlZC5qc1wiLCBbW1wiZGVlcGx5RnVsZmlsbGVkXCIsIFskaOKAjV9saXZlW1wiZGVlcGx5RnVsZmlsbGVkXCJdXV1dXSxbXCIuL3NyYy9tYWtlVGFnZ2VkLmpzXCIsIFtbXCJtYWtlVGFnZ2VkXCIsIFskaOKAjV9saXZlW1wibWFrZVRhZ2dlZFwiXV1dXV0sW1wiLi9zcmMvbWFrZS1mYXIuanNcIiwgW1tcIlJlbW90YWJsZVwiLCBbJGjigI1fbGl2ZVtcIlJlbW90YWJsZVwiXV1dLFtcIkZhclwiLCBbJGjigI1fbGl2ZVtcIkZhclwiXV1dLFtcIlRvRmFyRnVuY3Rpb25cIiwgWyRo4oCNX2xpdmVbXCJUb0ZhckZ1bmN0aW9uXCJdXV1dXSxbXCIuL3NyYy9lbmNvZGVUb0NhcERhdGEuanNcIiwgW1tcIlFDTEFTU1wiLCBbJGjigI1fbGl2ZVtcIlFDTEFTU1wiXV1dXV0sW1wiLi9zcmMvbWFyc2hhbC5qc1wiLCBbW1wibWFrZU1hcnNoYWxcIiwgWyRo4oCNX2xpdmVbXCJtYWtlTWFyc2hhbFwiXV1dXV0sW1wiLi9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanNcIiwgW1tcInN0cmluZ2lmeVwiLCBbJGjigI1fbGl2ZVtcInN0cmluZ2lmeVwiXV1dLFtcInBhcnNlXCIsIFskaOKAjV9saXZlW1wicGFyc2VcIl1dXV1dLFtcIi4vc3JjL21hcnNoYWwtanVzdGluLmpzXCIsIFtbXCJkZWNvZGVUb0p1c3RpblwiLCBbJGjigI1fbGl2ZVtcImRlY29kZVRvSnVzdGluXCJdXV1dXSxbXCIuL3NyYy90eXBlR3VhcmRzLmpzXCIsIFtbXCJhc3NlcnRSZWNvcmRcIiwgWyRo4oCNX2xpdmVbXCJhc3NlcnRSZWNvcmRcIl1dXSxbXCJhc3NlcnRDb3B5QXJyYXlcIiwgWyRo4oCNX2xpdmVbXCJhc3NlcnRDb3B5QXJyYXlcIl1dXSxbXCJhc3NlcnRSZW1vdGFibGVcIiwgWyRo4oCNX2xpdmVbXCJhc3NlcnRSZW1vdGFibGVcIl1dXSxbXCJpc1JlbW90YWJsZVwiLCBbJGjigI1fbGl2ZVtcImlzUmVtb3RhYmxlXCJdXV0sW1wiaXNSZWNvcmRcIiwgWyRo4oCNX2xpdmVbXCJpc1JlY29yZFwiXV1dLFtcImlzQ29weUFycmF5XCIsIFskaOKAjV9saXZlW1wiaXNDb3B5QXJyYXlcIl1dXV1dLFtcIi4vc3JjL3R5cGVzLmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7Im1hcEl0ZXJhYmxlIjpbIm1hcEl0ZXJhYmxlIixmYWxzZV0sImZpbHRlckl0ZXJhYmxlIjpbImZpbHRlckl0ZXJhYmxlIixmYWxzZV0sIlBBU1NfU1RZTEUiOlsiUEFTU19TVFlMRSIsZmFsc2VdLCJpc09iamVjdCI6WyJpc09iamVjdCIsZmFsc2VdLCJhc3NlcnRDaGVja2VyIjpbImFzc2VydENoZWNrZXIiLGZhbHNlXSwiZ2V0VGFnIjpbImdldFRhZyIsZmFsc2VdLCJoYXNPd25Qcm9wZXJ0eU9mIjpbImhhc093blByb3BlcnR5T2YiLGZhbHNlXSwiZ2V0RXJyb3JDb25zdHJ1Y3RvciI6WyJnZXRFcnJvckNvbnN0cnVjdG9yIixmYWxzZV0sInRvUGFzc2FibGVFcnJvciI6WyJ0b1Bhc3NhYmxlRXJyb3IiLGZhbHNlXSwiZ2V0SW50ZXJmYWNlT2YiOlsiZ2V0SW50ZXJmYWNlT2YiLGZhbHNlXSwibmFtZUZvclBhc3NhYmxlU3ltYm9sIjpbIm5hbWVGb3JQYXNzYWJsZVN5bWJvbCIsZmFsc2VdLCJwYXNzYWJsZVN5bWJvbEZvck5hbWUiOlsicGFzc2FibGVTeW1ib2xGb3JOYW1lIixmYWxzZV0sInBhc3NTdHlsZU9mIjpbInBhc3NTdHlsZU9mIixmYWxzZV0sImFzc2VydFBhc3NhYmxlIjpbImFzc2VydFBhc3NhYmxlIixmYWxzZV0sImRlZXBseUZ1bGZpbGxlZCI6WyJkZWVwbHlGdWxmaWxsZWQiLGZhbHNlXSwibWFrZVRhZ2dlZCI6WyJtYWtlVGFnZ2VkIixmYWxzZV0sIlJlbW90YWJsZSI6WyJSZW1vdGFibGUiLGZhbHNlXSwiRmFyIjpbIkZhciIsZmFsc2VdLCJUb0ZhckZ1bmN0aW9uIjpbIlRvRmFyRnVuY3Rpb24iLGZhbHNlXSwiUUNMQVNTIjpbIlFDTEFTUyIsZmFsc2VdLCJtYWtlTWFyc2hhbCI6WyJtYWtlTWFyc2hhbCIsZmFsc2VdLCJzdHJpbmdpZnkiOlsic3RyaW5naWZ5IixmYWxzZV0sInBhcnNlIjpbInBhcnNlIixmYWxzZV0sImRlY29kZVRvSnVzdGluIjpbImRlY29kZVRvSnVzdGluIixmYWxzZV0sImFzc2VydFJlY29yZCI6WyJhc3NlcnRSZWNvcmQiLGZhbHNlXSwiYXNzZXJ0Q29weUFycmF5IjpbImFzc2VydENvcHlBcnJheSIsZmFsc2VdLCJhc3NlcnRSZW1vdGFibGUiOlsiYXNzZXJ0UmVtb3RhYmxlIixmYWxzZV0sImlzUmVtb3RhYmxlIjpbImlzUmVtb3RhYmxlIixmYWxzZV0sImlzUmVjb3JkIjpbImlzUmVjb3JkIixmYWxzZV0sImlzQ29weUFycmF5IjpbImlzQ29weUFycmF5IixmYWxzZV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKo0/YJCDAAAQgwAACsAAABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzeyJpbXBvcnRzIjpbIi4vaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vbWFrZVRhZ2dlZC5qcyIsIi4vcGFzc1N0eWxlT2YuanMiLCJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vcHJvbWlzZS1raXQiXSwiZXhwb3J0cyI6WyJkZWVwbHlGdWxmaWxsZWQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRSxpc1Byb21pc2UsZ2V0VGFnLGlzT2JqZWN0LG1ha2VUYWdnZWQscGFzc1N0eWxlT2Y7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wiaXNQcm9taXNlXCIsIFskaOKAjV9hID0+IChpc1Byb21pc2UgPSAkaOKAjV9hKV1dXV0sW1wiLi9oZWxwZXJzL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJnZXRUYWdcIiwgWyRo4oCNX2EgPT4gKGdldFRhZyA9ICRo4oCNX2EpXV0sW1wiaXNPYmplY3RcIiwgWyRo4oCNX2EgPT4gKGlzT2JqZWN0ID0gJGjigI1fYSldXV1dLFtcIi4vbWFrZVRhZ2dlZC5qc1wiLCBbW1wibWFrZVRhZ2dlZFwiLCBbJGjigI1fYSA9PiAobWFrZVRhZ2dlZCA9ICRo4oCNX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZU9mLmpzXCIsIFtbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlBhc3NhYmxlfSBQYXNzYWJsZSAqL1xuLyoqIEB0ZW1wbGF0ZSBUIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9ldmVudHVhbC1zZW5kJykuRVJlZjxUPn0gRVJlZiAqL1xuXG5jb25zdHtkZXRhaWxzOlgscXVvdGU6cX09YXNzZXJ0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2Zyb21FbnRyaWVzfT1PYmplY3Q7XG5cbi8qKlxuICogR2l2ZW4gYSBQYXNzYWJsZSBgdmFsYCB3aG9zZSBwYXNzLWJ5LWNvcHkgc3RydWN0dXJlIG1heSBjb250YWluIGxlYWZcbiAqIHByb21pc2VzLCByZXR1cm4gZWl0aGVyIGEgcmVwbGFjZW1lbnQgUGFzc2FibGUsIG9yIGEgcHJvbWlzZSBmb3IgdGhhdFxuICogcmVwbGFjZW1lbnQsIHdoZXJlIHRoYXQgcmVwbGFjZW1lbnQgaXMgKmRlZXBseSBmdWxmaWxsZWQqLCBpLmUuLCBpdHNcbiAqIHBhc3MtYnktY29weSBzdHJ1Y3R1cmUgZG9lcyBub3QgY29udGFpbiBhbnkgcHJvbWlzZXMuXG4gKlxuICogVGhpcyBpcyBhIGRlZXAgZm9ybSBvZiBgUHJvbWlzZS5hbGxgIHNwZWNpYWxpemVkIGZvciBQYXNzYWJsZXMuIEZvciBlYWNoXG4gKiBlbmNvdW50ZXJlZCBwcm9taXNlLCByZXBsYWNlIGl0IHdpdGggdGhlIGRlZXBseSBmdWxmaWxsZWQgZm9ybSBvZlxuICogaXRzIGZ1bGZpbGxtZW50LlxuICogSWYgYW55IG9mIHRoZSBwcm9taXNlcyByZWplY3QsIHRoZW4gdGhlIHByb21pc2UgZm9yIHRoZSByZXBsYWNlbWVudFxuICogcmVqZWN0cy4gSWYgYW55IG9mIHRoZSBwcm9taXNlcyBuZXZlciBzZXR0bGUsIHRoZW4gdGhlIHByb21pc2UgZm9yXG4gKiB0aGUgcmVwbGFjZW1lbnQgbmV2ZXIgc2V0dGxlcy5cbiAqXG4gKiBJZiBgdmFsYCBvciBpdHMgcGFydHMgYXJlIG5vbi1rZXkgcGFzc2FibGVzICpiZWNhdXNlKiB0aGV5IGNvbnRhaW5zXG4gKiBwcm9taXNlcywgdGhlIGRlZXBseSBmdWxmaWxsZWQgZm9ybXMgb2YgdmFsIG9yIGl0cyBwYXJ0cyBtYXkgYmUga2V5cy4gVGhpc1xuICogaXMgZm9yIHRoZSBoaWdoZXIgXCJzdG9yZVwiIGxldmVsIG9mIGFic3RyYWN0aW9uIHRvIGRldGVybWluZSwgYmVjYXVzZSBpdFxuICogZGVmaW5lcyB0aGUgXCJrZXlcIiBub3Rpb24gaW4gcXVlc3Rpb24uXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdmFsXG4gKiBAcmV0dXJucyB7RVJlZjxQYXNzYWJsZT59XG4gKi9cbmNvbnN0ICAgICAgICBkZWVwbHlGdWxmaWxsZWQ9KHZhbCk9PntcbmlmKCFpc09iamVjdCh2YWwpKXtcbnJldHVybiB2YWw7XG4gfVxuaWYoaXNQcm9taXNlKHZhbCkpe1xucmV0dXJuIEUud2hlbih2YWwsKG5vbnApPT5kZWVwbHlGdWxmaWxsZWQobm9ucCkpO1xuIH1cbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZih2YWwpO1xuc3dpdGNoKHBhc3NTdHlsZSl7XG5jYXNlJ2NvcHlSZWNvcmQnOntcbmNvbnN0IG5hbWVzPW93bktleXModmFsKTtcbmNvbnN0IHZhbFBzPW5hbWVzLm1hcCgobmFtZSk9PmRlZXBseUZ1bGZpbGxlZCh2YWxbbmFtZV0pKTtcbnJldHVybiBFLndoZW4oUHJvbWlzZS5hbGwodmFsUHMpLCh2YWxzKT0+XG5oYXJkZW4oZnJvbUVudHJpZXModmFscy5tYXAoKGMsaSk9PltuYW1lc1tpXSxjXSkpKSk7XG5cbiB9XG5jYXNlJ2NvcHlBcnJheSc6e1xuY29uc3QgdmFsUHM9dmFsLm1hcCgocCk9PmRlZXBseUZ1bGZpbGxlZChwKSk7XG5yZXR1cm4gRS53aGVuKFByb21pc2UuYWxsKHZhbFBzKSwodmFscyk9PmhhcmRlbih2YWxzKSk7XG4gfVxuY2FzZSd0YWdnZWQnOntcbmNvbnN0IHRhZz1nZXRUYWcodmFsKTtcbnJldHVybiBFLndoZW4oZGVlcGx5RnVsZmlsbGVkKHZhbC5wYXlsb2FkKSwocGF5bG9hZCk9PlxubWFrZVRhZ2dlZCh0YWcscGF5bG9hZCkpO1xuXG4gfVxuY2FzZSdyZW1vdGFibGUnOntcbnJldHVybiB2YWw7XG4gfVxuY2FzZSdlcnJvcic6e1xucmV0dXJuIHZhbDtcbiB9XG5jYXNlJ3Byb21pc2UnOntcbnJldHVybiBFLndoZW4odmFsLChub25wKT0+ZGVlcGx5RnVsZmlsbGVkKG5vbnApKTtcbiB9XG5kZWZhdWx0OntcbmFzc2VydC5mYWlsKFggYFVuZXhwZWN0ZWQgcGFzc1N0eWxlICR7cShwYXNzU3R5bGUpfWAsVHlwZUVycm9yKTtcbiB9fVxuXG4gfTskaOKAjV9vbmNlLmRlZXBseUZ1bGZpbGxlZChkZWVwbHlGdWxmaWxsZWQpO1xuaGFyZGVuKGRlZXBseUZ1bGZpbGxlZCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVlcGx5RnVsZmlsbGVkIjpbImRlZXBseUZ1bGZpbGxlZCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAwwIZwCkAAAApAAAArAAAAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL2VuY29kZVRvQ2FwRGF0YS5qc3siaW1wb3J0cyI6WyIuL2hlbHBlcnMvZXJyb3IuanMiLCIuL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanMiLCIuL2hlbHBlcnMvc3ltYm9sLmpzIiwiLi9tYWtlVGFnZ2VkLmpzIiwiLi9wYXNzU3R5bGVPZi5qcyJdLCJleHBvcnRzIjpbIlFDTEFTUyIsIm1ha2VEZWNvZGVGcm9tQ2FwRGF0YSIsIm1ha2VFbmNvZGVUb0NhcERhdGEiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgcGFzc1N0eWxlT2YsRXJyb3JIZWxwZXIsbWFrZVRhZ2dlZCxpc09iamVjdCxnZXRUYWcsaGFzT3duUHJvcGVydHlPZixhc3NlcnRQYXNzYWJsZVN5bWJvbCxuYW1lRm9yUGFzc2FibGVTeW1ib2wscGFzc2FibGVTeW1ib2xGb3JOYW1lOyRo4oCNX2ltcG9ydHMoW1tcIi4vcGFzc1N0eWxlT2YuanNcIiwgW1tcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvZXJyb3IuanNcIiwgW1tcIkVycm9ySGVscGVyXCIsIFskaOKAjV9hID0+IChFcnJvckhlbHBlciA9ICRo4oCNX2EpXV1dXSxbXCIuL21ha2VUYWdnZWQuanNcIiwgW1tcIm1ha2VUYWdnZWRcIiwgWyRo4oCNX2EgPT4gKG1ha2VUYWdnZWQgPSAkaOKAjV9hKV1dXV0sW1wiLi9oZWxwZXJzL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJpc09iamVjdFwiLCBbJGjigI1fYSA9PiAoaXNPYmplY3QgPSAkaOKAjV9hKV1dLFtcImdldFRhZ1wiLCBbJGjigI1fYSA9PiAoZ2V0VGFnID0gJGjigI1fYSldXSxbXCJoYXNPd25Qcm9wZXJ0eU9mXCIsIFskaOKAjV9hID0+IChoYXNPd25Qcm9wZXJ0eU9mID0gJGjigI1fYSldXV1dLFtcIi4vaGVscGVycy9zeW1ib2wuanNcIiwgW1tcImFzc2VydFBhc3NhYmxlU3ltYm9sXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXNzYWJsZVN5bWJvbCA9ICRo4oCNX2EpXV0sW1wibmFtZUZvclBhc3NhYmxlU3ltYm9sXCIsIFskaOKAjV9hID0+IChuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSAkaOKAjV9hKV1dLFtcInBhc3NhYmxlU3ltYm9sRm9yTmFtZVwiLCBbJGjigI1fYSA9PiAocGFzc2FibGVTeW1ib2xGb3JOYW1lID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkVuY29kaW5nfSBFbmNvZGluZyAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUmVtb3RhYmxlfSBSZW1vdGFibGUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkVuY29kaW5nVW5pb259IEVuY29kaW5nVW5pb24gKi9cblxuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2lzQXJyYXl9PUFycmF5O1xuY29uc3R7XG5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzLFxuZGVmaW5lUHJvcGVydGllcyxcbmlzLFxuZW50cmllcyxcbmZyb21FbnRyaWVzLFxuZnJlZXplfT1cbk9iamVjdDtcbmNvbnN0e2RldGFpbHM6WCxGYWlsLHF1b3RlOnF9PWFzc2VydDtcblxuLyoqXG4gKiBTcGVjaWFsIHByb3BlcnR5IG5hbWUgdGhhdCBpbmRpY2F0ZXMgYW4gZW5jb2RpbmcgdGhhdCBuZWVkcyBzcGVjaWFsXG4gKiBkZWNvZGluZy5cbiAqL1xuY29uc3QgUUNMQVNTPSdAcWNsYXNzJzskaOKAjV9vbmNlLlFDTEFTUyhRQ0xBU1MpO1xuXG5cbi8qKlxuICogQHBhcmFtIHtFbmNvZGluZ30gZW5jb2RlZFxuICogQHJldHVybnMge2VuY29kZWQgaXMgRW5jb2RpbmdVbmlvbn1cbiAqL1xuY29uc3QgaGFzUUNsYXNzPShlbmNvZGVkKT0+aGFzT3duUHJvcGVydHlPZihlbmNvZGVkLFFDTEFTUyk7XG5cbi8qKlxuICogQHBhcmFtIHtFbmNvZGluZ30gZW5jb2RlZFxuICogQHBhcmFtIHtzdHJpbmd9IHFjbGFzc1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IHFjbGFzc01hdGNoZXM9KGVuY29kZWQscWNsYXNzKT0+XG5pc09iamVjdChlbmNvZGVkKSYmXG4haXNBcnJheShlbmNvZGVkKSYmXG5oYXNRQ2xhc3MoZW5jb2RlZCkmJlxuZW5jb2RlZFtRQ0xBU1NdPT09cWNsYXNzO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEVuY29kZVRvQ2FwRGF0YU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7KFxuICogICByZW1vdGFibGU6IFJlbW90YWJsZSxcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gRW5jb2RpbmdcbiAqICkgPT4gRW5jb2Rpbmd9IFtlbmNvZGVSZW1vdGFibGVUb0NhcERhdGFdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgcHJvbWlzZTogUHJvbWlzZSxcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gRW5jb2RpbmdcbiAqICkgPT4gRW5jb2Rpbmd9IFtlbmNvZGVQcm9taXNlVG9DYXBEYXRhXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVycm9yOiBFcnJvcixcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gRW5jb2RpbmdcbiAqICkgPT4gRW5jb2Rpbmd9IFtlbmNvZGVFcnJvclRvQ2FwRGF0YV1cbiAqL1xuXG5jb25zdCBkb250RW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhPShyZW0pPT5GYWlsIGByZW1vdGFibGUgdW5leHBlY3RlZDogJHtyZW19YDtcblxuY29uc3QgZG9udEVuY29kZVByb21pc2VUb0NhcERhdGE9KHByb20pPT5GYWlsIGBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7cHJvbX1gO1xuXG5jb25zdCBkb250RW5jb2RlRXJyb3JUb0NhcERhdGE9KGVycik9PkZhaWwgYGVycm9yIG9iamVjdCB1bmV4cGVjdGVkOiAke2Vycn1gO1xuXG4vKipcbiAqIEBwYXJhbSB7RW5jb2RlVG9DYXBEYXRhT3B0aW9uc30gZW5jb2RlT3B0aW9uc1xuICogQHJldHVybnMgeyhwYXNzYWJsZTogUGFzc2FibGUpID0+IEVuY29kaW5nfVxuICovXG5jb25zdCAgICAgICAgbWFrZUVuY29kZVRvQ2FwRGF0YT0oe1xuZW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhPWRvbnRFbmNvZGVSZW1vdGFibGVUb0NhcERhdGEsXG5lbmNvZGVQcm9taXNlVG9DYXBEYXRhPWRvbnRFbmNvZGVQcm9taXNlVG9DYXBEYXRhLFxuZW5jb2RlRXJyb3JUb0NhcERhdGE9ZG9udEVuY29kZUVycm9yVG9DYXBEYXRhfT1cbnt9KT0+e1xuLyoqXG4gKiBNdXN0IGVuY29kZSBgdmFsYCBpbnRvIHBsYWluIEpTT04gZGF0YSAqY2Fub25pY2FsbHkqLCBzdWNoIHRoYXRcbiAqIGBKU09OLnN0cmluZ2lmeShlbmNvZGUodjEpKSA9PT0gSlNPTi5zdHJpbmdpZnkoZW5jb2RlKHYxKSlgLiBGb3IgbW9zdFxuICogZW5jb2RpbmdzLCB0aGUgb3JkZXIgb2YgcHJvcGVydGllcyBvZiBlYWNoIG5vZGUgb2YgdGhlIG91dHB1dFxuICogc3RydWN0dXJlIGlzIGRldGVybWluZWQgYnkgdGhlIGFsZ29yaXRobSBiZWxvdyB3aXRob3V0IHNwZWNpYWxcbiAqIGFycmFuZ2VtZW50LCB1c3VhbGx5IGJ5IGJlaW5nIGV4cHJlc3NlZCBkaXJlY3RseSBhcyBhbiBvYmplY3QgbGl0ZXJhbC5cbiAqIFRoZSBleGNlcHRpb24gaXMgY29weVJlY29yZHMsIHdob3NlIG5hdHVyYWwgZW51bWVyYXRpb24gb3JkZXJcbiAqIGNhbiBkaWZmZXIgYmV0d2VlbiBjb3B5UmVjb3JkcyB0aGF0IG91ciBkaXN0cmlidXRlZCBvYmplY3Qgc2VtYW50aWNzXG4gKiBjb25zaWRlcnMgdG8gYmUgZXF1aXZhbGVudC5cbiAqIFNpbmNlLCBmb3IgZWFjaCBjb3B5UmVjb3JkLCB3ZSBvbmx5IGFjY2VwdCBzdHJpbmcgcHJvcGVydHkgbmFtZXMsXG4gKiBub3Qgc3ltYm9scywgd2UgY2FuIGNhbm9uaWNhbGx5IHNvcnQgdGhlIG5hbWVzIGZpcnN0LlxuICogSlNPTi5zdHJpbmdpZnkgd2lsbCB0aGVuIHZpc2l0IHRoZXNlIGluIHRoYXQgc29ydGVkIG9yZGVyLlxuICpcbiAqIEVuY29kaW5nIHdpdGggYSBjYW5vbmljYWwtSlNPTiBlbmNvZGVyIHdvdWxkIGFsc28gc29sdmUgdGhpcyBjYW5vbmljYWxuZXNzXG4gKiBwcm9ibGVtIGluIGEgbW9yZSBtb2R1bGFyIGFuZCBlbmNhcHN1bGF0ZWQgbWFubmVyLiBOb3RlIHRoYXQgdGhlXG4gKiBhY3R1YWwgb3JkZXIgcHJvZHVjZWQgaGVyZSwgdGhvdWdoIGl0IGFncmVlcyB3aXRoIGNhbm9uaWNhbC1KU09OIG9uXG4gKiBjb3B5UmVjb3JkIHByb3BlcnR5IG9yZGVyaW5nLCBkaWZmZXJzIGZyb20gY2Fub25pY2FsLUpTT04gYXMgYSB3aG9sZVxuICogaW4gdGhhdCB0aGUgb3RoZXIgcmVjb3JkIHByb3BlcnRpZXMgYXJlIHZpc2l0ZWQgaW4gdGhlIG9yZGVyIGluIHdoaWNoXG4gKiB0aGV5IGFyZSBsaXRlcmFsbHkgd3JpdHRlbiBiZWxvdy4gVE9ETyBwZXJoYXBzIHdlIHNob3VsZCBpbmRlZWQgc3dpdGNoXG4gKiB0byBhIGNhbm9uaWNhbCBKU09OIGVuY29kZXIsIGFuZCBub3QgZGVsaWNhdGV0bHkgZGVwZW5kIG9uIHRoZSBvcmRlclxuICogaW4gd2hpY2ggdGhlc2Ugb2JqZWN0IGxpdGVyYWxzIGFyZSB3cml0dGVuLlxuICpcbiAqIFJlYWRlcnMgbXVzdCBub3QgY2FyZSBhYm91dCB0aGlzIG9yZGVyIGFueXdheS4gV2UgaW1wb3NlIHRoaXMgcmVxdWlyZW1lbnRcbiAqIG1haW5seSB0byByZWR1Y2Ugbm9uLWRldGVybWluaXNtIGV4cG9zZWQgb3V0c2lkZSBhIHZhdC5cbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBwYXNzYWJsZVxuICogQHJldHVybnMge0VuY29kaW5nfSBleGNlcHQgdGhhdCBgZW5jb2RlVG9DYXBEYXRhYCBkb2VzIG5vdCBnZW5lcmFsbHlcbiAqIGBoYXJkZW5gIHRoaXMgcmVzdWx0IGJlZm9yZSByZXR1cm5pbmcuIFJhdGhlciwgYGVuY29kZVRvQ2FwRGF0YWAgaXMgbm90XG4gKiBkaXJlY3RseSBleHBvc2VkLlxuICogV2hhdCdzIGV4cG9zZWQgaW5zdGVhZCBpcyBhIHdyYXBwZXIgdGhhdCBmcmVlemVzIHRoZSBvdXRwdXQgYmVmb3JlXG4gKiByZXR1cm5pbmcuIElmIHRoaXMgdHVybnMgb3V0IHRvIGltcGVkZSBzdGF0aWMgYW5hbHlzaXMgZm9yIGBoYXJkZW5gIHNhZmV0eSxcbiAqIHdlIGNhbiBhbHdheXMgcHV0IHRoZSAobm93IHJlZHVuZGFudCkgaGFyZGVucyBiYWNrIGluLiBUaGV5IGRvbid0IGh1cnQuXG4gKi9cbmNvbnN0IGVuY29kZVRvQ2FwRGF0YVJlY3VyPShwYXNzYWJsZSk9Pntcbi8qIEZpcnN0IHdlIGhhbmRsZSBhbGwgcHJpbWl0aXZlcy4gU29tZSBjYW4gYmUgcmVwcmVzZW50ZWQgZGlyZWN0bHkgYXMqL1xuLyogSlNPTiwgYW5kIHNvbWUgbXVzdCBiZSBlbmNvZGVkIGFzIFtRQ0xBU1NdIGNvbXBvc2l0ZXMuKi9cbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihwYXNzYWJsZSk7XG5zd2l0Y2gocGFzc1N0eWxlKXtcbmNhc2UnbnVsbCc6e1xucmV0dXJuIG51bGw7XG4gfVxuY2FzZSd1bmRlZmluZWQnOntcbnJldHVybntbUUNMQVNTXTondW5kZWZpbmVkJ307XG4gfVxuY2FzZSdzdHJpbmcnOlxuY2FzZSdib29sZWFuJzp7XG5yZXR1cm4gcGFzc2FibGU7XG4gfVxuY2FzZSdudW1iZXInOntcbmlmKE51bWJlci5pc05hTihwYXNzYWJsZSkpe1xucmV0dXJue1tRQ0xBU1NdOidOYU4nfTtcbiB9XG5pZihpcyhwYXNzYWJsZSwtMCkpe1xucmV0dXJuIDA7XG4gfVxuaWYocGFzc2FibGU9PT1JbmZpbml0eSl7XG5yZXR1cm57W1FDTEFTU106J0luZmluaXR5J307XG4gfVxuaWYocGFzc2FibGU9PT0tSW5maW5pdHkpe1xucmV0dXJue1tRQ0xBU1NdOictSW5maW5pdHknfTtcbiB9XG5yZXR1cm4gcGFzc2FibGU7XG4gfVxuY2FzZSdiaWdpbnQnOntcbnJldHVybntcbltRQ0xBU1NdOidiaWdpbnQnLFxuZGlnaXRzOlN0cmluZyhwYXNzYWJsZSl9O1xuXG4gfVxuY2FzZSdzeW1ib2wnOntcbmFzc2VydFBhc3NhYmxlU3ltYm9sKHBhc3NhYmxlKTtcbmNvbnN0IG5hbWU9LyoqIEB0eXBlIHtzdHJpbmd9ICovbmFtZUZvclBhc3NhYmxlU3ltYm9sKHBhc3NhYmxlKTtcbnJldHVybntcbltRQ0xBU1NdOidzeW1ib2wnLFxubmFtZX07XG5cbiB9XG5jYXNlJ2NvcHlSZWNvcmQnOntcbmlmKGhhc093blByb3BlcnR5T2YocGFzc2FibGUsUUNMQVNTKSl7XG4vKiBIaWxiZXJ0IGhvdGVsKi9cbmNvbnN0e1tRQ0xBU1NdOnFjbGFzc1ZhbHVlLC4uLnJlc3R9PXBhc3NhYmxlO1xuLyoqIEB0eXBlIHtFbmNvZGluZ30gKi9cbmNvbnN0IHJlc3VsdD17XG5bUUNMQVNTXTonaGlsYmVydCcsXG5vcmlnaW5hbDplbmNvZGVUb0NhcERhdGFSZWN1cihxY2xhc3NWYWx1ZSl9O1xuXG5pZihvd25LZXlzKHJlc3QpLmxlbmd0aD49MSl7XG4vKiBXZSBoYXJkZW4gdGhlIGVudGlyZSBjYXBEYXRhIGVuY29kaW5nIGJlZm9yZSB3ZSByZXR1cm4gaXQuKi9cbi8qIGBlbmNvZGVUb0NhcERhdGFgIHJlcXVpcmVzIHRoYXQgaXRzIGlucHV0IGJlIFBhc3NhYmxlLCBhbmQqL1xuLyogdGhlcmVmb3JlIGhhcmRlbmVkLiovXG4vKiBUaGUgYGZyZWV6ZWAgaGVyZSBpcyBuZWVkZWQgYW55d2F5LCBiZWNhdXNlIHRoZSBgcmVzdGAgaXMqL1xuLyogZnJlc2hseSBjb25zdHJ1Y3RlZCBieSB0aGUgYC4uLmAgYWJvdmUsIGFuZCB3ZSdyZSB1c2luZyBpdCovXG4vKiBhcyBpbXB1dCBpbiBhbm90aGVyIGNhbGwgdG8gYGVuY29kZVRvQ2FwRGF0YWAuKi9cbnJlc3VsdC5yZXN0PWVuY29kZVRvQ2FwRGF0YVJlY3VyKGZyZWV6ZShyZXN0KSk7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9XG4vKiBDdXJyZW50bHkgY29weVJlY29yZCBhbGxvd3Mgb25seSBzdHJpbmcga2V5cyBzbyB0aGlzIHdpbGwqL1xuLyogd29yay4gSWYgd2UgYWxsb3cgc29ydGFibGUgc3ltYm9sIGtleXMsIHRoaXMgd2lsbCBuZWVkIHRvKi9cbi8qIGJlY29tZSBtb3JlIGludGVyZXN0aW5nLiovXG5jb25zdCBuYW1lcz1vd25LZXlzKHBhc3NhYmxlKS5zb3J0KCk7XG5yZXR1cm4gZnJvbUVudHJpZXMoXG5uYW1lcy5tYXAoKG5hbWUpPT5bbmFtZSxlbmNvZGVUb0NhcERhdGFSZWN1cihwYXNzYWJsZVtuYW1lXSldKSk7XG5cbiB9XG5jYXNlJ2NvcHlBcnJheSc6e1xucmV0dXJuIHBhc3NhYmxlLm1hcChlbmNvZGVUb0NhcERhdGFSZWN1cik7XG4gfVxuY2FzZSd0YWdnZWQnOntcbnJldHVybntcbltRQ0xBU1NdOid0YWdnZWQnLFxudGFnOmdldFRhZyhwYXNzYWJsZSksXG5wYXlsb2FkOmVuY29kZVRvQ2FwRGF0YVJlY3VyKHBhc3NhYmxlLnBheWxvYWQpfTtcblxuIH1cbmNhc2UncmVtb3RhYmxlJzp7XG5jb25zdCBlbmNvZGVkPWVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YShcbnBhc3NhYmxlLFxuZW5jb2RlVG9DYXBEYXRhUmVjdXIpO1xuXG5pZihxY2xhc3NNYXRjaGVzKGVuY29kZWQsJ3Nsb3QnKSl7XG5yZXR1cm4gZW5jb2RlZDtcbiB9XG4vKiBgdGhyb3dgIGlzIG5vb3Agc2luY2UgYEZhaWxgIHRocm93cy4gQnV0IGxpbnRlciBjb25mdXNlZCovXG50aHJvdyBGYWlsIGBpbnRlcm5hbDogUmVtb3RhYmxlIGVuY29kaW5nIG11c3QgYmUgYW4gb2JqZWN0IHdpdGggJHtxKFxuUUNMQVNTKVxuIH0gJHtxKCdzbG90Jyl9OiAke2VuY29kZWR9YDtcbiB9XG5jYXNlJ3Byb21pc2UnOntcbmNvbnN0IGVuY29kZWQ9ZW5jb2RlUHJvbWlzZVRvQ2FwRGF0YShwYXNzYWJsZSxlbmNvZGVUb0NhcERhdGFSZWN1cik7XG5pZihxY2xhc3NNYXRjaGVzKGVuY29kZWQsJ3Nsb3QnKSl7XG5yZXR1cm4gZW5jb2RlZDtcbiB9XG50aHJvdyBGYWlsIGBpbnRlcm5hbDogUHJvbWlzZSBlbmNvZGluZyBtdXN0IGJlIGFuIG9iamVjdCB3aXRoICR7cShcblFDTEFTUyxcbidzbG90JylcbiB9OiAke2VuY29kZWR9YDtcbiB9XG5jYXNlJ2Vycm9yJzp7XG5jb25zdCBlbmNvZGVkPWVuY29kZUVycm9yVG9DYXBEYXRhKHBhc3NhYmxlLGVuY29kZVRvQ2FwRGF0YVJlY3VyKTtcbmlmKHFjbGFzc01hdGNoZXMoZW5jb2RlZCwnZXJyb3InKSl7XG5yZXR1cm4gZW5jb2RlZDtcbiB9XG50aHJvdyBGYWlsIGBpbnRlcm5hbDogRXJyb3IgZW5jb2RpbmcgbXVzdCBiZSBhbiBvYmplY3Qgd2l0aCAke3EoXG5RQ0xBU1MsXG4nZXJyb3InKVxuIH06ICR7ZW5jb2RlZH1gO1xuIH1cbmRlZmF1bHQ6e1xuYXNzZXJ0LmZhaWwoXG5YIGBpbnRlcm5hbDogVW5yZWNvZ25pemVkIHBhc3NTdHlsZSAke3EocGFzc1N0eWxlKX1gLFxuVHlwZUVycm9yKTtcblxuIH19XG5cbiB9O1xuY29uc3QgZW5jb2RlVG9DYXBEYXRhPShwYXNzYWJsZSk9PntcbmlmKEVycm9ySGVscGVyLmNhbkJlVmFsaWQocGFzc2FibGUpKXtcbi8qIFdlIHB1bGwgb3V0IHRoaXMgc3BlY2lhbCBjYXNlIHRvIGFjY29tbW9kYXRlIGVycm9ycyB0aGF0IGFyZSBub3QqL1xuLyogdmFsaWQgUGFzc2FibGVzLiBGb3IgZXhhbXBsZSwgYmVjYXVzZSB0aGV5J3JlIG5vdCBmcm96ZW4uKi9cbi8qIFRoZSBzcGVjaWFsIGNhc2UgY2FuIG9ubHkgZXZlciBhcHBseSBhdCB0aGUgcm9vdCwgYW5kIHRoZXJlZm9yZSovXG4vKiBvdXRzaWRlIHRoZSByZWN1cnNpb24sIHNpbmNlIGFuIGVycm9yIGNvdWxkIG9ubHkgYmUgZGVlcGVyIGluKi9cbi8qIGEgcGFzc2FibGUgc3RydWN0dXJlIGlmIGl0IHdlcmUgcGFzc2FibGUuKi9cbi8qKi9cbi8qIFdlIHB1bGwgb3V0IHRoaXMgc3BlY2lhbCBjYXNlIGJlY2F1c2UsIGZvciB0aGVzZSBlcnJvcnMsIHdlJ3JlIG11Y2gqL1xuLyogbW9yZSBpbnRlcmVzdGVkIGluIHJlcG9ydGluZyB3aGF0ZXZlciBkaWFnbm9zdGljIGluZm9ybWF0aW9uIHRoZXkqL1xuLyogY2FycnkgdGhhbiB3ZSBhcmUgYWJvdXQgcmVwb3J0aW5nIHByb2JsZW1zIGVuY291bnRlcmVkIGluIHJlcG9ydGluZyovXG4vKiB0aGlzIGluZm9ybWF0aW9uLiovXG5yZXR1cm4gaGFyZGVuKGVuY29kZUVycm9yVG9DYXBEYXRhKHBhc3NhYmxlLGVuY29kZVRvQ2FwRGF0YVJlY3VyKSk7XG4gfVxucmV0dXJuIGhhcmRlbihlbmNvZGVUb0NhcERhdGFSZWN1cihwYXNzYWJsZSkpO1xuIH07XG5yZXR1cm4gaGFyZGVuKGVuY29kZVRvQ2FwRGF0YSk7XG4gfTskaOKAjV9vbmNlLm1ha2VFbmNvZGVUb0NhcERhdGEobWFrZUVuY29kZVRvQ2FwRGF0YSk7XG5oYXJkZW4obWFrZUVuY29kZVRvQ2FwRGF0YSk7XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRGVjb2RlT3B0aW9uc1xuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRSZW1vdGFibGU6IEVuY29kaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGU6IEVuY29kaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiAoUHJvbWlzZXxSZW1vdGFibGUpfSBbZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGFdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZFByb21pc2U6IEVuY29kaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGU6IEVuY29kaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiAoUHJvbWlzZXxSZW1vdGFibGUpfSBbZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRFcnJvcjogRW5jb2RpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZTogRW5jb2RpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IEVycm9yfSBbZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YV1cbiAqL1xuXG5jb25zdCBkb250RGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGE9KHNsb3RFbmNvZGluZyk9PlxuRmFpbCBgcmVtb3RhYmxlIG9yIHByb21pc2UgdW5leHBlY3RlZDogJHtzbG90RW5jb2Rpbmd9YDtcbmNvbnN0IGRvbnREZWNvZGVFcnJvckZyb21DYXBEYXRhPShlcnJvckVuY29kaW5nKT0+XG5GYWlsIGBlcnJvciB1bmV4cGVjdGVkOiAke2Vycm9yRW5jb2Rpbmd9YDtcblxuLyoqXG4gKiBUaGUgY3VycmVudCBlbmNvZGluZyBkb2VzIG5vdCBnaXZlIHRoZSBkZWNvZGVyIGVub3VnaCBpbnRvIHRvIGRpc3Rpbmd1aXNoXG4gKiB3aGV0aGVyIGEgc2xvdCByZXByZXNlbnRzIGEgcHJvbWlzZSBvciBhIHJlbW90YWJsZS4gQXMgYW4gaW1wbGVtZW50YXRpb25cbiAqIHJlc3RyaWN0aW9uIHVudGlsIHRoaXMgaXMgZml4ZWQsIGlmIGVpdGhlciBpcyBwcm92aWRlZCwgYm90aCBtdXN0IGJlXG4gKiBwcm92aWRlZCBhbmQgdGhleSBtdXN0IGJlIHRoZSBzYW1lLlxuICpcbiAqIFRoaXMgc2VlbXMgbGlrZSB0aGUgYmVzdCBzdGFydGluZyBwb2ludCB0byBpbmNyZW1lbnRhbGx5IGV2b2x2ZSB0byBhblxuICogQVBJIHdoZXJlIHRoZXNlIGNhbiByZWxpYWJseSBkaWZmZXIuXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80MzM0XG4gKlxuICogQHBhcmFtIHtEZWNvZGVPcHRpb25zfSBkZWNvZGVPcHRpb25zXG4gKiBAcmV0dXJucyB7KGVuY29kZWQ6IEVuY29kaW5nKSA9PiBQYXNzYWJsZX1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VEZWNvZGVGcm9tQ2FwRGF0YT0oe1xuZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGE9ZG9udERlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhLFxuZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhPWRvbnREZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YSxcbmRlY29kZUVycm9yRnJvbUNhcERhdGE9ZG9udERlY29kZUVycm9yRnJvbUNhcERhdGF9PVxue30pPT57XG5kZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YT09PWRlY29kZVByb21pc2VGcm9tQ2FwRGF0YXx8XG5GYWlsIGBBbiBpbXBsZW1lbnRhdGlvbiByZXN0cmljdGlvbiBmb3Igbm93OiBJZiBlaXRoZXIgZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGEgb3IgZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhIGlzIHByb3ZpZGVkLCBib3RoIG11c3QgYmUgcHJvdmlkZWQgYW5kIHRoZXkgbXVzdCBiZSB0aGUgc2FtZTogJHtxKFxuZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGEpXG4gfSB2cyAke3EoZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhKX1gO1xuXG4vKipcbiAqIGBkZWNvZGVGcm9tQ2FwRGF0YWAgbWF5IHJlbHkgb24gYGpzb25FbmNvZGVkYCBiZWluZyB0aGUgcmVzdWx0IG9mIGFcbiAqIHBsYWluIGNhbGwgdG8gSlNPTi5wYXJzZS4gSG93ZXZlciwgaXQgKmNhbm5vdCogcmVseSBvbiBganNvbkVuY29kZWRgXG4gKiBoYXZpbmcgYmVlbiBwcm9kdWNlZCBieSBKU09OLnN0cmluZ2lmeSBvbiB0aGUgb3V0cHV0IG9mIGBlbmNvZGVUb0NhcERhdGFgXG4gKiBhYm92ZSwgaS5lLiwgYGRlY29kZUZyb21DYXBEYXRhYCBjYW5ub3QgcmVseSBvbiBganNvbkVuY29kZWRgIGJlaW5nIGFcbiAqIHZhbGlkIG1hcnNoYWxsZWQgcmVwcmVzZW50YXRpb24uIFJhdGhlciwgYGRlY29kZUZyb21DYXBEYXRhYCBtdXN0XG4gKiB2YWxpZGF0ZSB0aGF0LlxuICpcbiAqIEBwYXJhbSB7RW5jb2Rpbmd9IGpzb25FbmNvZGVkIG11c3QgYmUgaGFyZGVuZWRcbiAqL1xuY29uc3QgZGVjb2RlRnJvbUNhcERhdGE9KGpzb25FbmNvZGVkKT0+e1xuaWYoIWlzT2JqZWN0KGpzb25FbmNvZGVkKSl7XG4vKiBwcmltaXRpdmVzIHBhc3MgdGhyb3VnaCovXG5yZXR1cm4ganNvbkVuY29kZWQ7XG4gfVxuaWYoaXNBcnJheShqc29uRW5jb2RlZCkpe1xucmV0dXJuIGpzb25FbmNvZGVkLm1hcCgoZW5jb2RlZFZhbCk9PmRlY29kZUZyb21DYXBEYXRhKGVuY29kZWRWYWwpKTtcbiB9ZWxzZSBpZihoYXNRQ2xhc3MoanNvbkVuY29kZWQpKXtcbmNvbnN0IHFjbGFzcz1qc29uRW5jb2RlZFtRQ0xBU1NdO1xuYXNzZXJ0LnR5cGVvZihcbnFjbGFzcyxcbidzdHJpbmcnLFxuWCBgaW52YWxpZCAke3EoUUNMQVNTKX0gdHlwZW9mICR7cSh0eXBlb2YgcWNsYXNzKX1gKTtcblxuc3dpdGNoKHFjbGFzcyl7XG4vKiBFbmNvZGluZyBvZiBwcmltaXRpdmVzIG5vdCBoYW5kbGVkIGJ5IEpTT04qL1xuY2FzZSd1bmRlZmluZWQnOntcbnJldHVybiB1bmRlZmluZWQ7XG4gfVxuY2FzZSdOYU4nOntcbnJldHVybiBOYU47XG4gfVxuY2FzZSdJbmZpbml0eSc6e1xucmV0dXJuIEluZmluaXR5O1xuIH1cbmNhc2UnLUluZmluaXR5Jzp7XG5yZXR1cm4tSW5maW5pdHk7XG4gfVxuY2FzZSdiaWdpbnQnOntcbi8qIFVzaW5nIEB0cy1pZ25vcmUgcmF0aGVyIHRoYW4gQHRzLWV4cGVjdC1lcnJvciBiZWxvdyBiZWNhdXNlKi9cbi8qIHdpdGggQHRzLWV4cGVjdC1lcnJvciBJIGdldCBhIHJlZCB1bmRlcmxpbmUgaW4gdnNjb2RlLCBidXQqL1xuLyogd2l0aG91dCBpdCBJIGdldCBlcnJvcnMgZnJvbSBgeWFybiBsaW50YC4qL1xuLyogQHRzLWlnbm9yZSBpbmFkZXF1YXRlIHR5cGUgaW5mZXJlbmNlKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xMjU5I2Rpc2N1c3Npb25fcjk1NDU2MTkwMSovXG5jb25zdHtkaWdpdHN9PWpzb25FbmNvZGVkO1xuYXNzZXJ0LnR5cGVvZihcbmRpZ2l0cyxcbidzdHJpbmcnLFxuWCBgaW52YWxpZCBkaWdpdHMgdHlwZW9mICR7cSh0eXBlb2YgZGlnaXRzKX1gKTtcblxucmV0dXJuIEJpZ0ludChkaWdpdHMpO1xuIH1cbmNhc2UnQEBhc3luY0l0ZXJhdG9yJzp7XG4vKiBEZXByZWNhdGVkIHFjbGFzcy4gVE9ETyBtYWtlIGNvbmRpdGlvbmFsKi9cbi8qIG9uIGVudmlyb25tZW50IHZhcmlhYmxlLiBFdmVudHVhbGx5IHJlbW92ZSwgYnV0IGFmdGVyIGNvbmZpZGVudCovXG4vKiB0aGF0IHRoZXJlIGFyZSBubyBtb3JlIHN1cHBvcnRlZCBzZW5kZXJzLiovXG4vKiovXG4vKiBVc2luZyBAdHMtaWdub3JlIHJhdGhlciB0aGFuIEB0cy1leHBlY3QtZXJyb3IgYmVsb3cgYmVjYXVzZSovXG4vKiB3aXRoIEB0cy1leHBlY3QtZXJyb3IgSSBnZXQgYSByZWQgdW5kZXJsaW5lIGluIHZzY29kZSwgYnV0Ki9cbi8qIHdpdGhvdXQgaXQgSSBnZXQgZXJyb3JzIGZyb20gYHlhcm4gbGludGAuKi9cbi8qIEB0cy1pZ25vcmUgaW5hZGVxdWF0ZSB0eXBlIGluZmVyZW5jZSovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTI1OSNkaXNjdXNzaW9uX3I5NTQ1NjE5MDEqL1xucmV0dXJuIFN5bWJvbC5hc3luY0l0ZXJhdG9yO1xuIH1cbmNhc2Unc3ltYm9sJzp7XG4vKiBVc2luZyBAdHMtaWdub3JlIHJhdGhlciB0aGFuIEB0cy1leHBlY3QtZXJyb3IgYmVsb3cgYmVjYXVzZSovXG4vKiB3aXRoIEB0cy1leHBlY3QtZXJyb3IgSSBnZXQgYSByZWQgdW5kZXJsaW5lIGluIHZzY29kZSwgYnV0Ki9cbi8qIHdpdGhvdXQgaXQgSSBnZXQgZXJyb3JzIGZyb20gYHlhcm4gbGludGAuKi9cbi8qIEB0cy1pZ25vcmUgaW5hZGVxdWF0ZSB0eXBlIGluZmVyZW5jZSovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTI1OSNkaXNjdXNzaW9uX3I5NTQ1NjE5MDEqL1xuY29uc3R7bmFtZX09anNvbkVuY29kZWQ7XG5yZXR1cm4gcGFzc2FibGVTeW1ib2xGb3JOYW1lKG5hbWUpO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG4vKiBVc2luZyBAdHMtaWdub3JlIHJhdGhlciB0aGFuIEB0cy1leHBlY3QtZXJyb3IgYmVsb3cgYmVjYXVzZSovXG4vKiB3aXRoIEB0cy1leHBlY3QtZXJyb3IgSSBnZXQgYSByZWQgdW5kZXJsaW5lIGluIHZzY29kZSwgYnV0Ki9cbi8qIHdpdGhvdXQgaXQgSSBnZXQgZXJyb3JzIGZyb20gYHlhcm4gbGludGAuKi9cbi8qIEB0cy1pZ25vcmUgaW5hZGVxdWF0ZSB0eXBlIGluZmVyZW5jZSovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTI1OSNkaXNjdXNzaW9uX3I5NTQ1NjE5MDEqL1xuY29uc3R7dGFnLHBheWxvYWR9PWpzb25FbmNvZGVkO1xucmV0dXJuIG1ha2VUYWdnZWQodGFnLGRlY29kZUZyb21DYXBEYXRhKHBheWxvYWQpKTtcbiB9XG5jYXNlJ3Nsb3QnOntcbi8qIFNlZSBub3RlIGFib3ZlIGFib3V0IGhvdyB0aGUgY3VycmVudCBlbmNvZGluZyBjYW5ub3QgcmVsaWFibHkqL1xuLyogZGlzdGluZ3Vpc2ggd2hpY2ggd2Ugc2hvdWxkIGNhbGwsIHNvIGluIHRoZSBub24tZGVmYXVsdCBjYXNlKi9cbi8qIGJvdGggbXVzdCBiZSB0aGUgc2FtZSBhbmQgaXQgZG9lc24ndCBtYXR0ZXIgd2hpY2ggd2UgY2FsbC4qL1xuY29uc3QgZGVjb2RlZD1kZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YShcbmpzb25FbmNvZGVkLFxuZGVjb2RlRnJvbUNhcERhdGEpO1xuXG4vKiBCRVdBUkU6IGNhcGRhdGEgZG9lcyBub3QgY2hlY2sgdGhhdCBgZGVjb2RlZGAgaXMqL1xuLyogYSBwcm9taXNlIG9yIGEgcmVtb3RhYmxlLCBzaW5jZSB0aGF0IHdvdWxkIGJyZWFrIHNvbWUqL1xuLyogY2FwZGF0YSBjbGllbnRzLiBXZSBhcmUgZGVwcmVjYXRpbmcgY2FwZGF0YSwgYW5kIHRoZXNlIGNsaWVudHMqL1xuLyogd2lsbCBuZWVkIHRvIHVwZGF0ZSBiZWZvcmUgc3dpdGNoaW5nIHRvIHNtYWxsY2Fwcy4qL1xucmV0dXJuIGRlY29kZWQ7XG4gfVxuY2FzZSdlcnJvcic6e1xuY29uc3QgZGVjb2RlZD1kZWNvZGVFcnJvckZyb21DYXBEYXRhKFxuanNvbkVuY29kZWQsXG5kZWNvZGVGcm9tQ2FwRGF0YSk7XG5cbmlmKHBhc3NTdHlsZU9mKGRlY29kZWQpPT09J2Vycm9yJyl7XG5yZXR1cm4gZGVjb2RlZDtcbiB9XG50aHJvdyBGYWlsIGBpbnRlcm5hbDogZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YSBvcHRpb24gbXVzdCByZXR1cm4gYW4gZXJyb3I6ICR7ZGVjb2RlZH1gO1xuIH1cbmNhc2UnaGlsYmVydCc6e1xuLyogVXNpbmcgQHRzLWlnbm9yZSByYXRoZXIgdGhhbiBAdHMtZXhwZWN0LWVycm9yIGJlbG93IGJlY2F1c2UqL1xuLyogd2l0aCBAdHMtZXhwZWN0LWVycm9yIEkgZ2V0IGEgcmVkIHVuZGVybGluZSBpbiB2c2NvZGUsIGJ1dCovXG4vKiB3aXRob3V0IGl0IEkgZ2V0IGVycm9ycyBmcm9tIGB5YXJuIGxpbnRgLiovXG4vKiBAdHMtaWdub3JlIGluYWRlcXVhdGUgdHlwZSBpbmZlcmVuY2UqL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzEyNTkjZGlzY3Vzc2lvbl9yOTU0NTYxOTAxKi9cbmNvbnN0e29yaWdpbmFsLHJlc3R9PWpzb25FbmNvZGVkO1xuaGFzT3duUHJvcGVydHlPZihqc29uRW5jb2RlZCwnb3JpZ2luYWwnKXx8XG5GYWlsIGBJbnZhbGlkIEhpbGJlcnQgSG90ZWwgZW5jb2RpbmcgJHtqc29uRW5jb2RlZH1gO1xuLyogRG9uJ3QgaGFyZGVuIHNpbmNlIHdlJ3JlIG5vdCBkb25lIG11dGF0aW5nIGl0Ki9cbmNvbnN0IHJlc3VsdD17W1FDTEFTU106ZGVjb2RlRnJvbUNhcERhdGEob3JpZ2luYWwpfTtcbmlmKGhhc093blByb3BlcnR5T2YoanNvbkVuY29kZWQsJ3Jlc3QnKSl7XG5jb25zdCBpc05vbkVtcHR5T2JqZWN0PVxudHlwZW9mIHJlc3Q9PT0nb2JqZWN0JyYmXG5yZXN0IT09bnVsbCYmXG5vd25LZXlzKHJlc3QpLmxlbmd0aD49MTtcbmlzTm9uRW1wdHlPYmplY3R8fFxuRmFpbCBgUmVzdCBlbmNvZGluZyBtdXN0IGJlIGEgbm9uLWVtcHR5IG9iamVjdDogJHtyZXN0fWA7XG5jb25zdCByZXN0T2JqPWRlY29kZUZyb21DYXBEYXRhKHJlc3QpO1xuLyogVE9ETyByZWFsbHkgc2hvdWxkIGFzc2VydCB0aGF0IGBwYXNzU3R5bGVPZihyZXN0KWAgaXMqL1xuLyogYCdjb3B5UmVjb3JkJ2AgYnV0IHdlJ2QgaGF2ZSB0byBoYXJkZW4gaXQgYW5kIGl0IGlzIHRvbyovXG4vKiBlYXJseSB0byBkbyB0aGF0LiovXG4haGFzT3duUHJvcGVydHlPZihyZXN0T2JqLFFDTEFTUyl8fFxuRmFpbCBgUmVzdCBtdXN0IG5vdCBjb250YWluIGl0cyBvd24gZGVmaW5pdGlvbiBvZiAke3EoUUNMQVNTKX1gO1xuZGVmaW5lUHJvcGVydGllcyhyZXN1bHQsZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhyZXN0T2JqKSk7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9XG4vKiBAdHMtZXhwZWN0LWVycm9yIFRoaXMgaXMgdGhlIGVycm9yIGNhc2Ugd2UncmUgdGVzdGluZyBmb3IqL1xuY2FzZSdpYmlkJzp7XG50aHJvdyBGYWlsIGBUaGUgY2FwRGF0YSBwcm90b2NvbCBubyBsb25nZXIgc3VwcG9ydHMgJHtxKFFDTEFTUyl9ICR7cShcbnFjbGFzcylcbiB9YDtcbiB9XG5kZWZhdWx0OntcbmFzc2VydC5mYWlsKFggYHVucmVjb2duaXplZCAke3EoUUNMQVNTKX0gJHtxKHFjbGFzcyl9YCxUeXBlRXJyb3IpO1xuIH19XG5cbiB9ZWxzZXtcbmFzc2VydCh0eXBlb2YganNvbkVuY29kZWQ9PT0nb2JqZWN0JyYmanNvbkVuY29kZWQhPT1udWxsKTtcbmNvbnN0IGRlY29kZUVudHJ5PShbbmFtZSxlbmNvZGVkVmFsXSk9PntcbnR5cGVvZiBuYW1lPT09J3N0cmluZyd8fFxuRmFpbCBgUHJvcGVydHkgJHtxKG5hbWUpfSBvZiAke2pzb25FbmNvZGVkfSBtdXN0IGJlIGEgc3RyaW5nYDtcbnJldHVybltuYW1lLGRlY29kZUZyb21DYXBEYXRhKGVuY29kZWRWYWwpXTtcbiB9O1xuY29uc3QgZGVjb2RlZEVudHJpZXM9ZW50cmllcyhqc29uRW5jb2RlZCkubWFwKGRlY29kZUVudHJ5KTtcbnJldHVybiBmcm9tRW50cmllcyhkZWNvZGVkRW50cmllcyk7XG4gfVxuIH07XG5yZXR1cm4gaGFyZGVuKGRlY29kZUZyb21DYXBEYXRhKTtcbiB9OyRo4oCNX29uY2UubWFrZURlY29kZUZyb21DYXBEYXRhKG1ha2VEZWNvZGVGcm9tQ2FwRGF0YSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiUUNMQVNTIjpbIlFDTEFTUyJdLCJtYWtlRW5jb2RlVG9DYXBEYXRhIjpbIm1ha2VFbmNvZGVUb0NhcERhdGEiXSwibWFrZURlY29kZUZyb21DYXBEYXRhIjpbIm1ha2VEZWNvZGVGcm9tQ2FwRGF0YSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADAGgwheT0AAHk9AAAtAAAAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL2VuY29kZVRvU21hbGxjYXBzLmpzeyJpbXBvcnRzIjpbIi4vaGVscGVycy9lcnJvci5qcyIsIi4vaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vaGVscGVycy9zeW1ib2wuanMiLCIuL21ha2VUYWdnZWQuanMiLCIuL3Bhc3NTdHlsZU9mLmpzIl0sImV4cG9ydHMiOlsibWFrZURlY29kZUZyb21TbWFsbGNhcHMiLCJtYWtlRW5jb2RlVG9TbWFsbGNhcHMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgcGFzc1N0eWxlT2YsRXJyb3JIZWxwZXIsbWFrZVRhZ2dlZCxnZXRUYWcsaGFzT3duUHJvcGVydHlPZixhc3NlcnRQYXNzYWJsZVN5bWJvbCxuYW1lRm9yUGFzc2FibGVTeW1ib2wscGFzc2FibGVTeW1ib2xGb3JOYW1lOyRo4oCNX2ltcG9ydHMoW1tcIi4vcGFzc1N0eWxlT2YuanNcIiwgW1tcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvZXJyb3IuanNcIiwgW1tcIkVycm9ySGVscGVyXCIsIFskaOKAjV9hID0+IChFcnJvckhlbHBlciA9ICRo4oCNX2EpXV1dXSxbXCIuL21ha2VUYWdnZWQuanNcIiwgW1tcIm1ha2VUYWdnZWRcIiwgWyRo4oCNX2EgPT4gKG1ha2VUYWdnZWQgPSAkaOKAjV9hKV1dXV0sW1wiLi9oZWxwZXJzL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJnZXRUYWdcIiwgWyRo4oCNX2EgPT4gKGdldFRhZyA9ICRo4oCNX2EpXV0sW1wiaGFzT3duUHJvcGVydHlPZlwiLCBbJGjigI1fYSA9PiAoaGFzT3duUHJvcGVydHlPZiA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvc3ltYm9sLmpzXCIsIFtbXCJhc3NlcnRQYXNzYWJsZVN5bWJvbFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGFzc2FibGVTeW1ib2wgPSAkaOKAjV9hKV1dLFtcIm5hbWVGb3JQYXNzYWJsZVN5bWJvbFwiLCBbJGjigI1fYSA9PiAobmFtZUZvclBhc3NhYmxlU3ltYm9sID0gJGjigI1fYSldXSxbXCJwYXNzYWJsZVN5bWJvbEZvck5hbWVcIiwgWyRo4oCNX2EgPT4gKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlBhc3NhYmxlfSBQYXNzYWJsZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUmVtb3RhYmxlfSBSZW1vdGFibGUgKi9cbi8qIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuU21hbGxjYXBzRW5jb2Rpbmd9IFNtYWxsY2Fwc0VuY29kaW5nICpYLyovXG4vKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlNtYWxsY2Fwc0VuY29kaW5nVW5pb259IFNtYWxsY2Fwc0VuY29kaW5nVW5pb24gKlgvKi9cbi8qKiBAdHlwZWRlZiB7YW55fSBTbWFsbGNhcHNFbmNvZGluZyAqL1xuLyoqIEB0eXBlZGVmIHthbnl9IFNtYWxsY2Fwc0VuY29kaW5nVW5pb24gKi9cblxuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2lzQXJyYXl9PUFycmF5O1xuY29uc3R7aXMsZW50cmllcyxmcm9tRW50cmllc309T2JqZWN0O1xuY29uc3R7ZGV0YWlsczpYLEZhaWwscXVvdGU6cX09YXNzZXJ0O1xuXG5jb25zdCBCQU5HPSchJy5jaGFyQ29kZUF0KDApO1xuY29uc3QgREFTSD0nLScuY2hhckNvZGVBdCgwKTtcblxuLyoqXG4gKiBBbiBgZW5jb2RlVG9TbWFsbGNhcHNgIGZ1bmN0aW9uIHRha2VzIGEgcGFzc2FibGUgYW5kIHJldHVybnMgYVxuICogSlNPTi1yZXByZXNlbnRhYmxlIG9iamVjdCAoaS5lLiwgcm91bmQtdHJpcHBpbmcgaXQgdGhyb3VnaFxuICogYEpTT04uc3RyaW5naWZ5YCBhbmQgYEpTT04ucGFyc2VgIHdpdGggbm8gcmVwbGFjZXJzIG9yIHJldml2ZXJzXG4gKiByZXR1cm5zIGFuIGVxdWl2YWxlbnQgc3RydWN0dXJlIGV4Y2VwdCBmb3Igb2JqZWN0IGlkZW50aXR5KS5cbiAqIFdlIGNhbGwgdGhpcyByZXByZXNlbnRhdGlvbiBhIFNtYWxsY2FwcyBFbmNvZGluZy5cbiAqXG4gKiBBIGBkZWNvZGVGcm9tU21hbGxjYXBzYCBmdW5jdGlvbiB0YWtlcyBhcyBhcmd1bWVudCB3aGF0IGl0XG4gKiAqYXNzdW1lcyogaXMgdGhlIHJlc3VsdCBvZiBhIHBsYWluIGBKU09OLnBhcnNlYCB3aXRoIG5vIHJlc29sdmVyLiBJdCB0aGVuXG4gKiBtdXN0IHZhbGlkYXRlIHRoYXQgaXQgaXMgYSB2YWxpZCBTbWFsbGNhcHMgRW5jb2RpbmcsIGFuZCBpZiBpdCBpcyxcbiAqIHJldHVybiBhIGNvcnJlc3BvbmRpbmcgcGFzc2FibGUuXG4gKlxuICogU21hbGxjYXBzIGNvbnNpZGVycyB0aGUgY2hhcmFjdGVycyBiZXR3ZWVuIGAhYCAoYXNjaWkgY29kZSAzMywgQkFORylcbiAqIGFuZCBgLWAgKGFzY2lpIGNvZGUgNDUsIERBU0gpIHRvIGJlIHNwZWNpYWwgcHJlZml4ZXMgYWxsb3dpbmdcbiAqIHJlcHJlc2VudGF0aW9uIG9mIEpTT04taW5jb21wYXRpYmxlIGRhdGEgdXNpbmcgc3RyaW5ncy5cbiAqIFRoZXNlIGNoYXJhY3RlcnMsIGluIG9yZGVyLCBhcmUgYCFcIiMkJSYnKCkqKywtYFxuICogT2YgdGhlc2UsIHNtYWxsY2FwcyBjdXJyZW50bHkgdXNlcyB0aGUgZm9sbG93aW5nOlxuICpcbiAqICAqIGAhYCAtIGVzY2FwZWQgc3RyaW5nXG4gKiAgKiBgK2AgLSBub24tbmVnYXRpdmUgYmlnaW50XG4gKiAgKiBgLWAgLSBuZWdhdGl2ZSBiaWdpbnRcbiAqICAqIGAjYCAtIG1hbmlmZXN0IGNvbnN0YW50XG4gKiAgKiBgJWAgLSBzeW1ib2xcbiAqICAqIGAkYCAtIHJlbW90YWJsZVxuICogICogYCZgIC0gcHJvbWlzZVxuICpcbiAqIEFsbCBvdGhlciBzcGVjaWFsIGNoYXJhY3RlcnMgKGBcIicoKSosYCkgYXJlIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlLlxuICpcbiAqIFRoZSBtYW5pZmVzdCBjb25zdGFudHMgdGhhdCBzbWFsbGNhcHMgY3VycmVudGx5IHVzZXMgZm9yIHZhbHVlczpcbiAqICAqIGAjdW5kZWZpbmVkYFxuICogICogYCNOYU5gXG4gKiAgKiBgI0luZmluaXR5YFxuICogICogYCMtSW5maW5pdHlgXG4gKlxuICogYW5kIGZvciBwcm9wZXJ0eSBuYW1lcyBhbmFsb2dvdXMgdG8gY2FwZGF0YSBAcWNsYXNzOlxuICogICogYCN0YWdgXG4gKiAgKiBgI2Vycm9yYFxuICpcbiAqIEFsbCBvdGhlciBlbmNvZGVkIHN0cmluZ3MgYmVnaW5uaW5nIHdpdGggYCNgIGFyZSByZXNlcnZlZCBmb3JcbiAqIGZ1dHVyZSB1c2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGVuY29kZWRTdHJcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBzdGFydHNTcGVjaWFsPShlbmNvZGVkU3RyKT0+e1xuaWYoZW5jb2RlZFN0cj09PScnKXtcbnJldHVybiBmYWxzZTtcbiB9XG4vKiBjaGFyQ29kZUF0KDApIGFuZCBudW1iZXIgY29tcGFyZSBpcyBhIGJpdCBmYXN0ZXIuKi9cbmNvbnN0IGNvZGU9ZW5jb2RlZFN0ci5jaGFyQ29kZUF0KDApO1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHlvZGEqL1xucmV0dXJuIEJBTkc8PWNvZGUmJmNvZGU8PURBU0g7XG4gfTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBFbmNvZGVUb1NtYWxsY2Fwc09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7KFxuICogICByZW1vdGFibGU6IFJlbW90YWJsZSxcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gU21hbGxjYXBzRW5jb2RpbmdcbiAqICkgPT4gU21hbGxjYXBzRW5jb2Rpbmd9IFtlbmNvZGVSZW1vdGFibGVUb1NtYWxsY2Fwc11cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBwcm9taXNlOiBQcm9taXNlLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBTbWFsbGNhcHNFbmNvZGluZ1xuICogKSA9PiBTbWFsbGNhcHNFbmNvZGluZ30gW2VuY29kZVByb21pc2VUb1NtYWxsY2Fwc11cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlcnJvcjogRXJyb3IsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IFNtYWxsY2Fwc0VuY29kaW5nXG4gKiApID0+IFNtYWxsY2Fwc0VuY29kaW5nfSBbZW5jb2RlRXJyb3JUb1NtYWxsY2Fwc11cbiAqL1xuXG5jb25zdCBkb250RW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHM9KHJlbSk9PlxuRmFpbCBgcmVtb3RhYmxlIHVuZXhwZWN0ZWQ6ICR7cmVtfWA7XG5cbmNvbnN0IGRvbnRFbmNvZGVQcm9taXNlVG9TbWFsbGNhcHM9KHByb20pPT5GYWlsIGBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7cHJvbX1gO1xuXG5jb25zdCBkb250RW5jb2RlRXJyb3JUb1NtYWxsY2Fwcz0oZXJyKT0+XG5GYWlsIGBlcnJvciBvYmplY3QgdW5leHBlY3RlZDogJHtxKGVycil9YDtcblxuLyoqXG4gKiBAcGFyYW0ge0VuY29kZVRvU21hbGxjYXBzT3B0aW9uc30gZW5jb2RlT3B0aW9uc1xuICogQHJldHVybnMgeyhwYXNzYWJsZTogUGFzc2FibGUpID0+IFNtYWxsY2Fwc0VuY29kaW5nfVxuICovXG5jb25zdCAgICAgICAgbWFrZUVuY29kZVRvU21hbGxjYXBzPSh7XG5lbmNvZGVSZW1vdGFibGVUb1NtYWxsY2Fwcz1kb250RW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHMsXG5lbmNvZGVQcm9taXNlVG9TbWFsbGNhcHM9ZG9udEVuY29kZVByb21pc2VUb1NtYWxsY2FwcyxcbmVuY29kZUVycm9yVG9TbWFsbGNhcHM9ZG9udEVuY29kZUVycm9yVG9TbWFsbGNhcHN9PVxue30pPT57XG4vKipcbiAqIE11c3QgZW5jb2RlIGB2YWxgIGludG8gcGxhaW4gSlNPTiBkYXRhICpjYW5vbmljYWxseSosIHN1Y2ggdGhhdFxuICogYEpTT04uc3RyaW5naWZ5KGVuY29kZSh2MSkpID09PSBKU09OLnN0cmluZ2lmeShlbmNvZGUodjEpKWAuIEZvciBtb3N0XG4gKiBlbmNvZGluZ3MsIHRoZSBvcmRlciBvZiBwcm9wZXJ0aWVzIG9mIGVhY2ggbm9kZSBvZiB0aGUgb3V0cHV0XG4gKiBzdHJ1Y3R1cmUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgYWxnb3JpdGhtIGJlbG93IHdpdGhvdXQgc3BlY2lhbFxuICogYXJyYW5nZW1lbnQsIHVzdWFsbHkgYnkgYmVpbmcgZXhwcmVzc2VkIGRpcmVjdGx5IGFzIGFuIG9iamVjdCBsaXRlcmFsLlxuICogVGhlIGV4Y2VwdGlvbiBpcyBjb3B5UmVjb3Jkcywgd2hvc2UgbmF0dXJhbCBlbnVtZXJhdGlvbiBvcmRlclxuICogY2FuIGRpZmZlciBiZXR3ZWVuIGNvcHlSZWNvcmRzIHRoYXQgb3VyIGRpc3RyaWJ1dGVkIG9iamVjdCBzZW1hbnRpY3NcbiAqIGNvbnNpZGVycyB0byBiZSBlcXVpdmFsZW50LlxuICogU2luY2UsIGZvciBlYWNoIGNvcHlSZWNvcmQsIHdlIG9ubHkgYWNjZXB0IHN0cmluZyBwcm9wZXJ0eSBuYW1lcyxcbiAqIG5vdCBzeW1ib2xzLCB3ZSBjYW4gY2Fub25pY2FsbHkgc29ydCB0aGUgbmFtZXMgZmlyc3QuXG4gKiBKU09OLnN0cmluZ2lmeSB3aWxsIHRoZW4gdmlzaXQgdGhlc2UgaW4gdGhhdCBzb3J0ZWQgb3JkZXIuXG4gKlxuICogU21hbGxjYXBzRW5jb2Rpbmcgd2l0aCBhIGNhbm9uaWNhbC1KU09OIGVuY29kZXIgd291bGQgYWxzbyBzb2x2ZVxuICogdGhpcyBjYW5vbmljYWxuZXNzXG4gKiBwcm9ibGVtIGluIGEgbW9yZSBtb2R1bGFyIGFuZCBlbmNhcHN1bGF0ZWQgbWFubmVyLiBOb3RlIHRoYXQgdGhlXG4gKiBhY3R1YWwgb3JkZXIgcHJvZHVjZWQgaGVyZSwgdGhvdWdoIGl0IGFncmVlcyB3aXRoIGNhbm9uaWNhbC1KU09OIG9uXG4gKiBjb3B5UmVjb3JkIHByb3BlcnR5IG9yZGVyaW5nLCBkaWZmZXJzIGZyb20gY2Fub25pY2FsLUpTT04gYXMgYSB3aG9sZVxuICogaW4gdGhhdCB0aGUgb3RoZXIgcmVjb3JkIHByb3BlcnRpZXMgYXJlIHZpc2l0ZWQgaW4gdGhlIG9yZGVyIGluIHdoaWNoXG4gKiB0aGV5IGFyZSBsaXRlcmFsbHkgd3JpdHRlbiBiZWxvdy4gVE9ETyBwZXJoYXBzIHdlIHNob3VsZCBpbmRlZWQgc3dpdGNoXG4gKiB0byBhIGNhbm9uaWNhbCBKU09OIGVuY29kZXIsIGFuZCBub3QgZGVsaWNhdGV0bHkgZGVwZW5kIG9uIHRoZSBvcmRlclxuICogaW4gd2hpY2ggdGhlc2Ugb2JqZWN0IGxpdGVyYWxzIGFyZSB3cml0dGVuLlxuICpcbiAqIFJlYWRlcnMgbXVzdCBub3QgY2FyZSBhYm91dCB0aGlzIG9yZGVyIGFueXdheS4gV2UgaW1wb3NlIHRoaXMgcmVxdWlyZW1lbnRcbiAqIG1haW5seSB0byByZWR1Y2Ugbm9uLWRldGVybWluaXNtIGV4cG9zZWQgb3V0c2lkZSBhIHZhdC5cbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBwYXNzYWJsZVxuICogQHJldHVybnMge1NtYWxsY2Fwc0VuY29kaW5nfSBleGNlcHQgdGhhdCBgZW5jb2RlVG9TbWFsbGNhcHNgIGRvZXMgbm90IGdlbmVyYWxseVxuICogYGhhcmRlbmAgdGhpcyByZXN1bHQgYmVmb3JlIHJldHVybmluZy4gUmF0aGVyLCBgZW5jb2RlVG9TbWFsbGNhcHNgIGlzIG5vdFxuICogZGlyZWN0bHkgZXhwb3NlZC5cbiAqIFdoYXQncyBleHBvc2VkIGluc3RlYWQgaXMgYSB3cmFwcGVyIHRoYXQgZnJlZXplcyB0aGUgb3V0cHV0IGJlZm9yZVxuICogcmV0dXJuaW5nLiBJZiB0aGlzIHR1cm5zIG91dCB0byBpbXBlZGUgc3RhdGljIGFuYWx5c2lzIGZvciBgaGFyZGVuYCBzYWZldHksXG4gKiB3ZSBjYW4gYWx3YXlzIHB1dCB0aGUgKG5vdyByZWR1bmRhbnQpIGhhcmRlbnMgYmFjayBpbi4gVGhleSBkb24ndCBodXJ0LlxuICovXG5jb25zdCBlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyPShwYXNzYWJsZSk9Pntcbi8qIEZpcnN0IHdlIGhhbmRsZSBhbGwgcHJpbWl0aXZlcy4gU29tZSBjYW4gYmUgcmVwcmVzZW50ZWQgZGlyZWN0bHkgYXMqL1xuLyogSlNPTiwgYW5kIHNvbWUgbXVzdCBiZSBlbmNvZGVkIGludG8gc21hbGxjYXBzIHN0cmluZ3MuKi9cbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihwYXNzYWJsZSk7XG5zd2l0Y2gocGFzc1N0eWxlKXtcbmNhc2UnbnVsbCc6XG5jYXNlJ2Jvb2xlYW4nOntcbi8qIHBhc3MgdGhyb3VnaCB0byBKU09OKi9cbnJldHVybiBwYXNzYWJsZTtcbiB9XG5jYXNlJ3N0cmluZyc6e1xuaWYoc3RhcnRzU3BlY2lhbChwYXNzYWJsZSkpe1xuLyogU3RyaW5ncyB0aGF0IHN0YXJ0IHdpdGggYSBzcGVjaWFsIGNoYXIgYXJlIHF1b3RlZCB3aXRoIGAhYC4qL1xuLyogU2luY2UgYCFgIGlzIGl0c2VsZiBhIHNwZWNpYWwgY2hhcmFjdGVyLCB0aGlzIHRyaXZpYWxseSBkb2VzKi9cbi8qIHRoZSBIaWxiZXJ0IGhvdGVsLiBBbHNvLCBzaW5jZSB0aGUgc3BlY2lhbCBjaGFyYWN0ZXJzIGFyZSovXG4vKiBhIGNvbnRpbnVvdXMgc3VicmFuZ2Ugb2YgYXNjaWksIHRoaXMgcXVvdGluZyBpcyBzb3J0LW9yZGVyKi9cbi8qIHByZXNlcnZpbmcuKi9cbnJldHVybiBgISR7cGFzc2FibGV9YDtcbiB9XG4vKiBBbGwgb3RoZXIgc3RyaW5ncyBwYXNzIHRocm91Z2ggdG8gSlNPTiovXG5yZXR1cm4gcGFzc2FibGU7XG4gfVxuY2FzZSdzeW1ib2wnOntcbi8qIEF0IHRoZSBzbWFsbGNhcHMgbGV2ZWwsIHdlIHByZWZpeCBzeW1ib2wgbmFtZXMgd2l0aCBgJWAuKi9cbi8qIEJ5IFwic3ltYm9sIG5hbWVcIiwgd2UgbWVhbiBhY2NvcmRpbmcgdG8gYG5hbWVGb3JQYXNzYWJsZVN5bWJvbGAqL1xuLyogd2hpY2ggZG9lcyBzb21lIGZ1cnRoZXIgZXNjYXBpbmcuIFNlZSBjb21tZW50IG9uIHRoYXQgZnVuY3Rpb24uKi9cbmFzc2VydFBhc3NhYmxlU3ltYm9sKHBhc3NhYmxlKTtcbmNvbnN0IG5hbWU9LyoqIEB0eXBlIHtzdHJpbmd9ICovbmFtZUZvclBhc3NhYmxlU3ltYm9sKHBhc3NhYmxlKTtcbnJldHVybiBgJSR7bmFtZX1gO1xuIH1cbmNhc2UndW5kZWZpbmVkJzp7XG5yZXR1cm4nI3VuZGVmaW5lZCc7XG4gfVxuY2FzZSdudW1iZXInOntcbmlmKE51bWJlci5pc05hTihwYXNzYWJsZSkpe1xucmV0dXJuJyNOYU4nO1xuIH1cbmlmKGlzKHBhc3NhYmxlLC0wKSl7XG5yZXR1cm4gMDtcbiB9XG5pZihwYXNzYWJsZT09PUluZmluaXR5KXtcbnJldHVybicjSW5maW5pdHknO1xuIH1cbmlmKHBhc3NhYmxlPT09LUluZmluaXR5KXtcbnJldHVybicjLUluZmluaXR5JztcbiB9XG4vKiBBbGwgb3RoZXIgbnVtYmVycyBwYXNzIHRocm91Z2ggdG8gSlNPTiovXG5yZXR1cm4gcGFzc2FibGU7XG4gfVxuY2FzZSdiaWdpbnQnOntcbmNvbnN0IHN0cj1TdHJpbmcocGFzc2FibGUpO1xucmV0dXJuIHBhc3NhYmxlPDBuP3N0cjogYCske3N0cn1gO1xuIH1cbmNhc2UnY29weVJlY29yZCc6e1xuLyogQ3VycmVudGx5IGNvcHlSZWNvcmQgYWxsb3dzIG9ubHkgc3RyaW5nIGtleXMgc28gdGhpcyB3aWxsKi9cbi8qIHdvcmsuIElmIHdlIGFsbG93IHNvcnRhYmxlIHN5bWJvbCBrZXlzLCB0aGlzIHdpbGwgbmVlZCB0byovXG4vKiBiZWNvbWUgbW9yZSBpbnRlcmVzdGluZy4qL1xuY29uc3QgbmFtZXM9b3duS2V5cyhwYXNzYWJsZSkuc29ydCgpO1xucmV0dXJuIGZyb21FbnRyaWVzKFxubmFtZXMubWFwKChuYW1lKT0+W1xuZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihuYW1lKSxcbmVuY29kZVRvU21hbGxjYXBzUmVjdXIocGFzc2FibGVbbmFtZV0pXSkpO1xuXG5cbiB9XG5jYXNlJ2NvcHlBcnJheSc6e1xucmV0dXJuIHBhc3NhYmxlLm1hcChlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKTtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xucmV0dXJue1xuJyN0YWcnOmVuY29kZVRvU21hbGxjYXBzUmVjdXIoZ2V0VGFnKHBhc3NhYmxlKSksXG5wYXlsb2FkOmVuY29kZVRvU21hbGxjYXBzUmVjdXIocGFzc2FibGUucGF5bG9hZCl9O1xuXG4gfVxuY2FzZSdyZW1vdGFibGUnOntcbmNvbnN0IHJlc3VsdD1lbmNvZGVSZW1vdGFibGVUb1NtYWxsY2FwcyhcbnBhc3NhYmxlLFxuZW5jb2RlVG9TbWFsbGNhcHNSZWN1cik7XG5cbmlmKHR5cGVvZiByZXN1bHQ9PT0nc3RyaW5nJyYmcmVzdWx0LnN0YXJ0c1dpdGgoJyQnKSl7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbi8qIGB0aHJvd2AgaXMgbm9vcCBzaW5jZSBgRmFpbGAgdGhyb3dzLiBCdXQgbGludGVyIGNvbmZ1c2VkKi9cbnRocm93IEZhaWwgYGludGVybmFsOiBSZW1vdGFibGUgZW5jb2RpbmcgbXVzdCBzdGFydCB3aXRoIFwiJFwiOiAke3Jlc3VsdH1gO1xuIH1cbmNhc2UncHJvbWlzZSc6e1xuY29uc3QgcmVzdWx0PWVuY29kZVByb21pc2VUb1NtYWxsY2FwcyhcbnBhc3NhYmxlLFxuZW5jb2RlVG9TbWFsbGNhcHNSZWN1cik7XG5cbmlmKHR5cGVvZiByZXN1bHQ9PT0nc3RyaW5nJyYmcmVzdWx0LnN0YXJ0c1dpdGgoJyYnKSl7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbnRocm93IEZhaWwgYGludGVybmFsOiBQcm9taXNlIGVuY29kaW5nIG11c3Qgc3RhcnQgd2l0aCBcIiZcIjogJHtyZXN1bHR9YDtcbiB9XG5jYXNlJ2Vycm9yJzp7XG5jb25zdCByZXN1bHQ9ZW5jb2RlRXJyb3JUb1NtYWxsY2FwcyhwYXNzYWJsZSxlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKTtcbmlmKHR5cGVvZiByZXN1bHQ9PT0nb2JqZWN0JyYmaGFzT3duUHJvcGVydHlPZihyZXN1bHQsJyNlcnJvcicpKXtcbmNvbnN0IG1lc3NhZ2U9cmVzdWx0WycjZXJyb3InXTtcbmlmKFxudHlwZW9mIG1lc3NhZ2U9PT0nc3RyaW5nJyYmKFxuLyogY2hlY2sgdGhhdCBpdCBkZWNvZGVzIHRvIGEgc3RyaW5nKi9cbiFzdGFydHNTcGVjaWFsKG1lc3NhZ2UpfHxtZXNzYWdlLnN0YXJ0c1dpdGgoJyEnKSkpXG57XG5yZXR1cm4gcmVzdWx0O1xuIH1cbkZhaWwgYGludGVybmFsOiBFcnJvciBlbmNvZGluZyBtdXN0IGhhdmUgc3RyaW5nIG1lc3NhZ2U6ICR7cShcbm1lc3NhZ2UpXG4gfWA7XG4gfVxudGhyb3cgRmFpbCBgaW50ZXJuYWw6IEVycm9yIGVuY29kaW5nIG11c3QgaGF2ZSBcIiNlcnJvclwiIHByb3BlcnR5OiAke3EoXG5yZXN1bHQpXG4gfWA7XG4gfVxuZGVmYXVsdDp7XG5hc3NlcnQuZmFpbChcblggYGludGVybmFsOiBVbnJlY29nbml6ZWQgcGFzc1N0eWxlICR7cShwYXNzU3R5bGUpfWAsXG5UeXBlRXJyb3IpO1xuXG4gfX1cblxuIH07XG5jb25zdCBlbmNvZGVUb1NtYWxsY2Fwcz0ocGFzc2FibGUpPT57XG5pZihFcnJvckhlbHBlci5jYW5CZVZhbGlkKHBhc3NhYmxlKSl7XG4vKiBXZSBwdWxsIG91dCB0aGlzIHNwZWNpYWwgY2FzZSB0byBhY2NvbW1vZGF0ZSBlcnJvcnMgdGhhdCBhcmUgbm90Ki9cbi8qIHZhbGlkIFBhc3NhYmxlcy4gRm9yIGV4YW1wbGUsIGJlY2F1c2UgdGhleSdyZSBub3QgZnJvemVuLiovXG4vKiBUaGUgc3BlY2lhbCBjYXNlIGNhbiBvbmx5IGV2ZXIgYXBwbHkgYXQgdGhlIHJvb3QsIGFuZCB0aGVyZWZvcmUqL1xuLyogb3V0c2lkZSB0aGUgcmVjdXJzaW9uLCBzaW5jZSBhbiBlcnJvciBjb3VsZCBvbmx5IGJlIGRlZXBlciBpbiovXG4vKiBhIHBhc3NhYmxlIHN0cnVjdHVyZSBpZiBpdCB3ZXJlIHBhc3NhYmxlLiovXG4vKiovXG4vKiBXZSBwdWxsIG91dCB0aGlzIHNwZWNpYWwgY2FzZSBiZWNhdXNlLCBmb3IgdGhlc2UgZXJyb3JzLCB3ZSdyZSBtdWNoKi9cbi8qIG1vcmUgaW50ZXJlc3RlZCBpbiByZXBvcnRpbmcgd2hhdGV2ZXIgZGlhZ25vc3RpYyBpbmZvcm1hdGlvbiB0aGV5Ki9cbi8qIGNhcnJ5IHRoYW4gd2UgYXJlIGFib3V0IHJlcG9ydGluZyBwcm9ibGVtcyBlbmNvdW50ZXJlZCBpbiByZXBvcnRpbmcqL1xuLyogdGhpcyBpbmZvcm1hdGlvbi4qL1xuY29uc3QgcmVzdWx0PWhhcmRlbihcbmVuY29kZUVycm9yVG9TbWFsbGNhcHMocGFzc2FibGUsZW5jb2RlVG9TbWFsbGNhcHNSZWN1cikpO1xuXG5pZih0eXBlb2YgcmVzdWx0PT09J29iamVjdCcmJmhhc093blByb3BlcnR5T2YocmVzdWx0LCcjZXJyb3InKSl7XG5jb25zdCBtZXNzYWdlPXJlc3VsdFsnI2Vycm9yJ107XG5pZihcbnR5cGVvZiBtZXNzYWdlPT09J3N0cmluZycmJihcbi8qIGNoZWNrIHRoYXQgaXQgZGVjb2RlcyB0byBhIHN0cmluZyovXG4hc3RhcnRzU3BlY2lhbChtZXNzYWdlKXx8bWVzc2FnZS5zdGFydHNXaXRoKCchJykpKVxue1xucmV0dXJuIHJlc3VsdDtcbiB9XG5GYWlsIGBpbnRlcm5hbDogRXJyb3IgZW5jb2RpbmcgbXVzdCBzdHJpbmcgbWVzc2FnZTogJHtxKG1lc3NhZ2UpfWA7XG4gfVxuRmFpbCBgaW50ZXJuYWw6IEVycm9yIGVuY29kaW5nIG11c3QgaGF2ZSBcIiNlcnJvclwiIHByb3BlcnR5OiAke3EocmVzdWx0KX1gO1xuIH1cbnJldHVybiBoYXJkZW4oZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihwYXNzYWJsZSkpO1xuIH07XG5yZXR1cm4gaGFyZGVuKGVuY29kZVRvU21hbGxjYXBzKTtcbiB9OyRo4oCNX29uY2UubWFrZUVuY29kZVRvU21hbGxjYXBzKG1ha2VFbmNvZGVUb1NtYWxsY2Fwcyk7XG5oYXJkZW4obWFrZUVuY29kZVRvU21hbGxjYXBzKTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBEZWNvZGVGcm9tU21hbGxjYXBzT3B0aW9uc1xuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRSZW1vdGFibGU6IFNtYWxsY2Fwc0VuY29kaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGUgOlNtYWxsY2Fwc0VuY29kaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiBSZW1vdGFibGV9IFtkZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRQcm9taXNlOiBTbWFsbGNhcHNFbmNvZGluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlIDpTbWFsbGNhcHNFbmNvZGluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gUHJvbWlzZX0gW2RlY29kZVByb21pc2VGcm9tU21hbGxjYXBzXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRFcnJvcjogU21hbGxjYXBzRW5jb2RpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZSA6U21hbGxjYXBzRW5jb2RpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IEVycm9yfSBbZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzXVxuICovXG5cbmNvbnN0IGRvbnREZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzPShlbmNvZGluZyk9PlxuRmFpbCBgcmVtb3RhYmxlIHVuZXhwZWN0ZWQ6ICR7ZW5jb2Rpbmd9YDtcbmNvbnN0IGRvbnREZWNvZGVQcm9taXNlRnJvbVNtYWxsY2Fwcz0oZW5jb2RpbmcpPT5cbkZhaWwgYHByb21pc2UgdW5leHBlY3RlZDogJHtlbmNvZGluZ31gO1xuY29uc3QgZG9udERlY29kZUVycm9yRnJvbVNtYWxsY2Fwcz0oZW5jb2RpbmcpPT5cbkZhaWwgYGVycm9yIHVuZXhwZWN0ZWQ6ICR7cShlbmNvZGluZyl9YDtcblxuLyoqXG4gKiBAcGFyYW0ge0RlY29kZUZyb21TbWFsbGNhcHNPcHRpb25zfSBkZWNvZGVPcHRpb25zXG4gKiBAcmV0dXJucyB7KGVuY29kZWQ6IFNtYWxsY2Fwc0VuY29kaW5nKSA9PiBQYXNzYWJsZX1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VEZWNvZGVGcm9tU21hbGxjYXBzPSh7XG5kZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzPWRvbnREZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzLFxuZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHM9ZG9udERlY29kZVByb21pc2VGcm9tU21hbGxjYXBzLFxuZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzPWRvbnREZWNvZGVFcnJvckZyb21TbWFsbGNhcHN9PVxue30pPT57XG4vKipcbiAqIGBkZWNvZGVGcm9tU21hbGxjYXBzYCBtYXkgcmVseSBvbiBgZW5jb2RpbmdgIGJlaW5nIHRoZSByZXN1bHQgb2YgYVxuICogcGxhaW4gY2FsbCB0byBKU09OLnBhcnNlLiBIb3dldmVyLCBpdCAqY2Fubm90KiByZWx5IG9uIGBlbmNvZGluZ2BcbiAqIGhhdmluZyBiZWVuIHByb2R1Y2VkIGJ5IEpTT04uc3RyaW5naWZ5IG9uIHRoZSBvdXRwdXQgb2YgYGVuY29kZVRvU21hbGxjYXBzYFxuICogYWJvdmUsIGkuZS4sIGBkZWNvZGVGcm9tU21hbGxjYXBzYCBjYW5ub3QgcmVseSBvbiBgZW5jb2RpbmdgIGJlaW5nIGFcbiAqIHZhbGlkIG1hcnNoYWxsZWQgcmVwcmVzZW50YXRpb24uIFJhdGhlciwgYGRlY29kZUZyb21TbWFsbGNhcHNgIG11c3RcbiAqIHZhbGlkYXRlIHRoYXQuXG4gKlxuICogQHBhcmFtIHtTbWFsbGNhcHNFbmNvZGluZ30gZW5jb2RpbmcgbXVzdCBiZSBoYXJkZW5lZFxuICovXG5jb25zdCBkZWNvZGVGcm9tU21hbGxjYXBzPShlbmNvZGluZyk9PntcbnN3aXRjaCh0eXBlb2YgZW5jb2Rpbmcpe1xuY2FzZSdib29sZWFuJzpcbmNhc2UnbnVtYmVyJzp7XG5yZXR1cm4gZW5jb2Rpbmc7XG4gfVxuY2FzZSdzdHJpbmcnOntcbmlmKCFzdGFydHNTcGVjaWFsKGVuY29kaW5nKSl7XG5yZXR1cm4gZW5jb2Rpbmc7XG4gfVxuY29uc3QgYz1lbmNvZGluZy5jaGFyQXQoMCk7XG5zd2l0Y2goYyl7XG5jYXNlJyEnOntcbi8qIHVuLWhpbGJlcnQtaWZ5IHRoZSBzdHJpbmcqL1xucmV0dXJuIGVuY29kaW5nLnNsaWNlKDEpO1xuIH1cbmNhc2UnJSc6e1xucmV0dXJuIHBhc3NhYmxlU3ltYm9sRm9yTmFtZShlbmNvZGluZy5zbGljZSgxKSk7XG4gfVxuY2FzZScjJzp7XG5zd2l0Y2goZW5jb2Rpbmcpe1xuY2FzZScjdW5kZWZpbmVkJzp7XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cbmNhc2UnI05hTic6e1xucmV0dXJuIE5hTjtcbiB9XG5jYXNlJyNJbmZpbml0eSc6e1xucmV0dXJuIEluZmluaXR5O1xuIH1cbmNhc2UnIy1JbmZpbml0eSc6e1xucmV0dXJuLUluZmluaXR5O1xuIH1cbmRlZmF1bHQ6e1xuYXNzZXJ0LmZhaWwoWCBgdW5rbm93biBjb25zdGFudCBcIiR7cShlbmNvZGluZyl9XCJgLFR5cGVFcnJvcik7XG4gfX1cblxuIH1cbmNhc2UnKyc6e1xucmV0dXJuIEJpZ0ludChlbmNvZGluZy5zbGljZSgxKSk7XG4gfVxuY2FzZSctJzp7XG5yZXR1cm4gQmlnSW50KGVuY29kaW5nKTtcbiB9XG5jYXNlJyQnOntcbmNvbnN0IHJlc3VsdD1kZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzKFxuZW5jb2RpbmcsXG5kZWNvZGVGcm9tU21hbGxjYXBzKTtcblxuaWYocGFzc1N0eWxlT2YocmVzdWx0KSE9PSdyZW1vdGFibGUnKXtcbkZhaWwgYGludGVybmFsOiBkZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzIG9wdGlvbiBtdXN0IHJldHVybiBhIHJlbW90YWJsZTogJHtyZXN1bHR9YDtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH1cbmNhc2UnJic6e1xuY29uc3QgcmVzdWx0PWRlY29kZVByb21pc2VGcm9tU21hbGxjYXBzKFxuZW5jb2RpbmcsXG5kZWNvZGVGcm9tU21hbGxjYXBzKTtcblxuaWYocGFzc1N0eWxlT2YocmVzdWx0KSE9PSdwcm9taXNlJyl7XG5GYWlsIGBpbnRlcm5hbDogZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHMgb3B0aW9uIG11c3QgcmV0dXJuIGEgcHJvbWlzZTogJHtyZXN1bHR9YDtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH1cbmRlZmF1bHQ6e1xudGhyb3cgRmFpbCBgU3BlY2lhbCBjaGFyICR7cShcbmMpXG4gfSByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZTogJHtlbmNvZGluZ31gO1xuIH19XG5cbiB9XG5jYXNlJ29iamVjdCc6e1xuaWYoZW5jb2Rpbmc9PT1udWxsKXtcbnJldHVybiBlbmNvZGluZztcbiB9XG5cbmlmKGlzQXJyYXkoZW5jb2RpbmcpKXtcbnJldHVybiBlbmNvZGluZy5tYXAoKHZhbCk9PmRlY29kZUZyb21TbWFsbGNhcHModmFsKSk7XG4gfVxuXG5pZihoYXNPd25Qcm9wZXJ0eU9mKGVuY29kaW5nLCcjdGFnJykpe1xuY29uc3R7JyN0YWcnOnRhZyxwYXlsb2FkLC4uLnJlc3R9PWVuY29kaW5nO1xudHlwZW9mIHRhZz09PSdzdHJpbmcnfHxcbkZhaWwgYFZhbHVlIG9mIFwiI3RhZ1wiLCB0aGUgdGFnLCBtdXN0IGJlIGEgc3RyaW5nOiAke2VuY29kaW5nfWA7XG5vd25LZXlzKHJlc3QpLmxlbmd0aD09PTB8fFxuRmFpbCBgI3RhZyByZWNvcmQgdW5leHBlY3RlZCBwcm9wZXJ0aWVzOiAke3Eob3duS2V5cyhyZXN0KSl9YDtcbnJldHVybiBtYWtlVGFnZ2VkKFxuZGVjb2RlRnJvbVNtYWxsY2Fwcyh0YWcpLFxuZGVjb2RlRnJvbVNtYWxsY2FwcyhwYXlsb2FkKSk7XG5cbiB9XG5cbmlmKGhhc093blByb3BlcnR5T2YoZW5jb2RpbmcsJyNlcnJvcicpKXtcbmNvbnN0IHJlc3VsdD1kZWNvZGVFcnJvckZyb21TbWFsbGNhcHMoXG5lbmNvZGluZyxcbmRlY29kZUZyb21TbWFsbGNhcHMpO1xuXG5wYXNzU3R5bGVPZihyZXN1bHQpPT09J2Vycm9yJ3x8XG5GYWlsIGBpbnRlcm5hbDogZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzIG9wdGlvbiBtdXN0IHJldHVybiBhbiBlcnJvcjogJHtyZXN1bHR9YDtcbnJldHVybiByZXN1bHQ7XG4gfVxuXG5jb25zdCBkZWNvZGVFbnRyeT0oW2VuY29kZWROYW1lLGVuY29kZWRWYWxdKT0+e1xudHlwZW9mIGVuY29kZWROYW1lPT09J3N0cmluZyd8fFxuRmFpbCBgUHJvcGVydHkgbmFtZSAke3EoXG5lbmNvZGVkTmFtZSlcbiB9IG9mICR7ZW5jb2Rpbmd9IG11c3QgYmUgYSBzdHJpbmdgO1xuIWVuY29kZWROYW1lLnN0YXJ0c1dpdGgoJyMnKXx8XG5GYWlsIGBVbnJlY29nbml6ZWQgcmVjb3JkIHR5cGUgJHtxKGVuY29kZWROYW1lKX06ICR7ZW5jb2Rpbmd9YDtcbmNvbnN0IG5hbWU9ZGVjb2RlRnJvbVNtYWxsY2FwcyhlbmNvZGVkTmFtZSk7XG50eXBlb2YgbmFtZT09PSdzdHJpbmcnfHxcbkZhaWwgYERlY29kZWQgcHJvcGVydHkgbmFtZSAke25hbWV9IGZyb20gJHtlbmNvZGluZ30gbXVzdCBiZSBhIHN0cmluZ2A7XG5yZXR1cm5bbmFtZSxkZWNvZGVGcm9tU21hbGxjYXBzKGVuY29kZWRWYWwpXTtcbiB9O1xuY29uc3QgZGVjb2RlZEVudHJpZXM9ZW50cmllcyhlbmNvZGluZykubWFwKGRlY29kZUVudHJ5KTtcbnJldHVybiBmcm9tRW50cmllcyhkZWNvZGVkRW50cmllcyk7XG4gfVxuZGVmYXVsdDp7XG5hc3NlcnQuZmFpbChcblggYGludGVybmFsOiB1bnJlY29nbml6ZWQgSlNPTiB0eXBlb2YgJHtxKFxudHlwZW9mIGVuY29kaW5nKVxuIH06ICR7ZW5jb2Rpbmd9YCxcblR5cGVFcnJvcik7XG5cbiB9fVxuXG4gfTtcbnJldHVybiBoYXJkZW4oZGVjb2RlRnJvbVNtYWxsY2Fwcyk7XG4gfTskaOKAjV9vbmNlLm1ha2VEZWNvZGVGcm9tU21hbGxjYXBzKG1ha2VEZWNvZGVGcm9tU21hbGxjYXBzKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlRW5jb2RlVG9TbWFsbGNhcHMiOlsibWFrZUVuY29kZVRvU21hbGxjYXBzIl0sIm1ha2VEZWNvZGVGcm9tU21hbGxjYXBzIjpbIm1ha2VEZWNvZGVGcm9tU21hbGxjYXBzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKbKF2ToBgAA6AYAAC0AAABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvaGVscGVycy9jb3B5QXJyYXkuanN7ImltcG9ydHMiOlsiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbIkNvcHlBcnJheUhlbHBlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnRDaGVja2VyLGNoZWNrTm9ybWFsUHJvcGVydHk7JGjigI1faW1wb3J0cyhbW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV0sW1wiY2hlY2tOb3JtYWxQcm9wZXJ0eVwiLCBbJGjigI1fYSA9PiAoY2hlY2tOb3JtYWxQcm9wZXJ0eSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cbmNvbnN0e2RldGFpbHM6WH09YXNzZXJ0O1xuY29uc3R7Z2V0UHJvdG90eXBlT2Z9PU9iamVjdDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtpc0FycmF5LHByb3RvdHlwZTphcnJheVByb3RvdHlwZX09QXJyYXk7XG5cbi8qKlxuICpcbiAqIEB0eXBlIHtYaW1wb3J0KCcuL2ludGVybmFsLXR5cGVzLmpzJykuUGFzc1N0eWxlSGVscGVyfVxuICovXG5jb25zdCAgICAgICAgQ29weUFycmF5SGVscGVyPWhhcmRlbih7XG5zdHlsZU5hbWU6J2NvcHlBcnJheScsXG5cbmNhbkJlVmFsaWQ6KGNhbmRpZGF0ZSxjaGVjayk9PlxuaXNBcnJheShjYW5kaWRhdGUpfHxcbiEhY2hlY2smJmNoZWNrKGZhbHNlLFggYEFycmF5IGV4cGVjdGVkOiAke2NhbmRpZGF0ZX1gKSxcblxuYXNzZXJ0VmFsaWQ6KGNhbmRpZGF0ZSxwYXNzU3R5bGVPZlJlY3VyKT0+e1xuQ29weUFycmF5SGVscGVyLmNhbkJlVmFsaWQoY2FuZGlkYXRlLGFzc2VydENoZWNrZXIpO1xuZ2V0UHJvdG90eXBlT2YoY2FuZGlkYXRlKT09PWFycmF5UHJvdG90eXBlfHxcbmFzc2VydC5mYWlsKFggYE1hbGZvcm1lZCBhcnJheTogJHtjYW5kaWRhdGV9YCxUeXBlRXJyb3IpO1xuLyogU2luY2Ugd2UncmUgYWxyZWFkeSBlbnN1cmVkIGNhbmRpZGF0ZSBpcyBhbiBhcnJheSwgaXQgc2hvdWxkIG5vdCBiZSovXG4vKiBwb3NzaWJsZSBmb3IgdGhlIGZvbGxvd2luZyB0ZXN0IHRvIGZhaWwqL1xuY2hlY2tOb3JtYWxQcm9wZXJ0eShjYW5kaWRhdGUsJ2xlbmd0aCcsZmFsc2UsYXNzZXJ0Q2hlY2tlcik7XG5jb25zdCBsZW49Y2FuZGlkYXRlLmxlbmd0aDtcbmZvcihsZXQgaT0wO2k8bGVuO2krPTEpe1xuY2hlY2tOb3JtYWxQcm9wZXJ0eShjYW5kaWRhdGUsaSx0cnVlLGFzc2VydENoZWNrZXIpO1xuIH1cbi8qICsxIGZvciB0aGUgJ2xlbmd0aCcgcHJvcGVydHkgaXRzZWxmLiovXG5vd25LZXlzKGNhbmRpZGF0ZSkubGVuZ3RoPT09bGVuKzF8fFxuYXNzZXJ0LmZhaWwoWCBgQXJyYXlzIG11c3Qgbm90IGhhdmUgbm9uLWluZGV4ZXM6ICR7Y2FuZGlkYXRlfWAsVHlwZUVycm9yKTtcbi8qIFJlY3Vyc2l2ZWx5IHZhbGlkYXRlIHRoYXQgZWFjaCBtZW1iZXIgaXMgcGFzc2FibGUuKi9cbmNhbmRpZGF0ZS5ldmVyeSgodik9PiEhcGFzc1N0eWxlT2ZSZWN1cih2KSk7XG4gfX0pOyRo4oCNX29uY2UuQ29weUFycmF5SGVscGVyKENvcHlBcnJheUhlbHBlcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQ29weUFycmF5SGVscGVyIjpbIkNvcHlBcnJheUhlbHBlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACThwVh0wcAANMHAAAuAAAAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL2hlbHBlcnMvY29weVJlY29yZC5qc3siaW1wb3J0cyI6WyIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiQ29weVJlY29yZEhlbHBlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnRDaGVja2VyLGNhbkJlTWV0aG9kLGNoZWNrTm9ybWFsUHJvcGVydHk7JGjigI1faW1wb3J0cyhbW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV0sW1wiY2FuQmVNZXRob2RcIiwgWyRo4oCNX2EgPT4gKGNhbkJlTWV0aG9kID0gJGjigI1fYSldXSxbXCJjaGVja05vcm1hbFByb3BlcnR5XCIsIFskaOKAjV9hID0+IChjaGVja05vcm1hbFByb3BlcnR5ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5jb25zdHtkZXRhaWxzOlh9PWFzc2VydDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtnZXRQcm90b3R5cGVPZix2YWx1ZXMscHJvdG90eXBlOm9iamVjdFByb3RvdHlwZX09T2JqZWN0O1xuXG4vKipcbiAqXG4gKiBAdHlwZSB7WGltcG9ydCgnLi9pbnRlcm5hbC10eXBlcy5qcycpLlBhc3NTdHlsZUhlbHBlcn1cbiAqL1xuY29uc3QgICAgICAgIENvcHlSZWNvcmRIZWxwZXI9aGFyZGVuKHtcbnN0eWxlTmFtZTonY29weVJlY29yZCcsXG5cbmNhbkJlVmFsaWQ6KGNhbmRpZGF0ZSxjaGVjayk9PntcbmNvbnN0IHJlamVjdD0hIWNoZWNrJiYoKGRldGFpbHMpPT5jaGVjayhmYWxzZSxkZXRhaWxzKSk7XG5pZihnZXRQcm90b3R5cGVPZihjYW5kaWRhdGUpIT09b2JqZWN0UHJvdG90eXBlKXtcbnJldHVybihcbnJlamVjdCYmXG5yZWplY3QoWCBgUmVjb3JkcyBtdXN0IGluaGVyaXQgZnJvbSBPYmplY3QucHJvdG90eXBlOiAke2NhbmRpZGF0ZX1gKSk7XG5cbiB9XG5cbmZvcihjb25zdCBrZXkgb2Ygb3duS2V5cyhjYW5kaWRhdGUpKXtcbmNvbnN0IHZhbGlkPVxuKHR5cGVvZiBrZXk9PT0nc3RyaW5nJ3x8XG4hIXJlamVjdCYmXG5yZWplY3QoXG5YIGBSZWNvcmRzIGNhbiBvbmx5IGhhdmUgc3RyaW5nLW5hbWVkIHByb3BlcnRpZXM6ICR7Y2FuZGlkYXRlfWApKSYmKFxuXG4hY2FuQmVNZXRob2QoY2FuZGlkYXRlW2tleV0pfHxcbiEhcmVqZWN0JiZcbnJlamVjdChcbi8qIFRPRE86IFVwZGF0ZSBtZXNzYWdlIG5vdyB0aGF0IHRoZXJlIGlzIG5vIHN1Y2ggdGhpbmcgYXMgXCJpbXBsaWNpdCBSZW1vdGFibGVcIi4qL1xuWCBgUmVjb3JkcyBjYW5ub3QgY29udGFpbiBub24tZmFyIGZ1bmN0aW9ucyBiZWNhdXNlIHRoZXkgbWF5IGJlIG1ldGhvZHMgb2YgYW4gaW1wbGljaXQgUmVtb3RhYmxlOiAke2NhbmRpZGF0ZX1gKSk7XG5cbmlmKCF2YWxpZCl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuIH1cbnJldHVybiB0cnVlO1xuIH0sXG5cbmFzc2VydFZhbGlkOihjYW5kaWRhdGUscGFzc1N0eWxlT2ZSZWN1cik9PntcbkNvcHlSZWNvcmRIZWxwZXIuY2FuQmVWYWxpZChjYW5kaWRhdGUsYXNzZXJ0Q2hlY2tlcik7XG5mb3IoY29uc3QgbmFtZSBvZiBvd25LZXlzKGNhbmRpZGF0ZSkpe1xuY2hlY2tOb3JtYWxQcm9wZXJ0eShjYW5kaWRhdGUsbmFtZSx0cnVlLGFzc2VydENoZWNrZXIpO1xuIH1cbi8qIFJlY3Vyc2l2ZWx5IHZhbGlkYXRlIHRoYXQgZWFjaCBtZW1iZXIgaXMgcGFzc2FibGUuKi9cbnZhbHVlcyhjYW5kaWRhdGUpLmV2ZXJ5KCh2KT0+ISFwYXNzU3R5bGVPZlJlY3VyKHYpKTtcbiB9fSk7JGjigI1fb25jZS5Db3B5UmVjb3JkSGVscGVyKENvcHlSZWNvcmRIZWxwZXIpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkNvcHlSZWNvcmRIZWxwZXIiOlsiQ29weVJlY29yZEhlbHBlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAMmaTaYBEAAGARAAApAAAAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL2hlbHBlcnMvZXJyb3IuanN7ImltcG9ydHMiOlsiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbIkVycm9ySGVscGVyIiwiZ2V0RXJyb3JDb25zdHJ1Y3RvciIsInRvUGFzc2FibGVFcnJvciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnRDaGVja2VyOyRo4oCNX2ltcG9ydHMoW1tcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vaW50ZXJuYWwtdHlwZXMuanMnKS5QYXNzU3R5bGVIZWxwZXJ9IFBhc3NTdHlsZUhlbHBlciAqL1xuXG5jb25zdHtkZXRhaWxzOlh9PWFzc2VydDtcbmNvbnN0e2dldFByb3RvdHlwZU9mLGdldE93blByb3BlcnR5RGVzY3JpcHRvcnN9PU9iamVjdDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5cbi8qIFRPRE86IE1haW50ZW5hbmNlIGhhemFyZDogQ29vcmRpbmF0ZSB3aXRoIHRoZSBsaXN0IG9mIGVycm9ycyBpbiB0aGUgU0VTKi9cbi8qIHdoaWxlbGlzdC4gQ3VycmVudGx5LCBib3RoIG9taXQgQWdncmVnYXRlRXJyb3IsIHdoaWNoIGlzIG5vdyBzdGFuZGFyZC4gQm90aCovXG4vKiBtdXN0IGV2ZW50dWFsbHkgaW5jbHVkZSBpdC4qL1xuY29uc3QgZXJyb3JDb25zdHJ1Y3RvcnM9bmV3IE1hcChbXG5bJ0Vycm9yJyxFcnJvcl0sXG5bJ0V2YWxFcnJvcicsRXZhbEVycm9yXSxcblsnUmFuZ2VFcnJvcicsUmFuZ2VFcnJvcl0sXG5bJ1JlZmVyZW5jZUVycm9yJyxSZWZlcmVuY2VFcnJvcl0sXG5bJ1N5bnRheEVycm9yJyxTeW50YXhFcnJvcl0sXG5bJ1R5cGVFcnJvcicsVHlwZUVycm9yXSxcblsnVVJJRXJyb3InLFVSSUVycm9yXV0pO1xuXG5cbmNvbnN0ICAgICAgICBnZXRFcnJvckNvbnN0cnVjdG9yPShuYW1lKT0+ZXJyb3JDb25zdHJ1Y3RvcnMuZ2V0KG5hbWUpOyRo4oCNX29uY2UuZ2V0RXJyb3JDb25zdHJ1Y3RvcihnZXRFcnJvckNvbnN0cnVjdG9yKTtcbmhhcmRlbihnZXRFcnJvckNvbnN0cnVjdG9yKTtcblxuLyoqXG4gKiBWYWxpZGF0aW5nIGVycm9yIG9iamVjdHMgYXJlIHBhc3NhYmxlIHJhaXNlcyBhIHRlbnNpb24gYmV0d2VlbiBzZWN1cml0eVxuICogdnMgcHJlc2VydmluZyBkaWFnbm9zdGljIGluZm9ybWF0aW9uLiBGb3IgZXJyb3JzLCB3ZSBuZWVkIHRvIHJlbWVtYmVyXG4gKiB0aGUgZXJyb3IgaXRzZWxmIGV4aXN0cyB0byBoZWxwIHVzIGRpYWdub3NlIGEgYnVnIHRoYXQncyBsaWtlbHkgbW9yZVxuICogcHJlc3NpbmcgdGhhbiBhIHZhbGlkaXR5IGJ1ZyBpbiB0aGUgZXJyb3IgaXRzZWxmLiBUaHVzLCB3aGVuZXZlciBpdCBpcyBzYWZlXG4gKiB0byBkbyBzbywgd2UgcHJlZmVyIHRvIGxldCB0aGUgZXJyb3IgdGVzdCBzdWNjZWVkIGFuZCB0byBjb3VjaCB0aGVzZVxuICogY29tcGxhaW50cyBhcyBub3RlcyBvbiB0aGUgZXJyb3IuXG4gKlxuICogVG8gcmVzb2x2ZSB0aGlzLCBzdWNoIGEgbWFsZm9ybWVkIGVycm9yIG9iamVjdCB3aWxsIHN0aWxsIHBhc3NcbiAqIGBjYW5CZVZhbGlkYCBzbyBtYXJzaGFsIGNhbiB1c2UgdGhpcyBmb3IgdG9wIGxldmVsIGVycm9yIHRvIHJlcG9ydCBmcm9tLFxuICogZXZlbiBpZiBpdCB3b3VsZCBub3QgYWN0dWFsbHkgdmFsaWRhdGUuXG4gKiBJbnN0ZWFkLCB0aGUgZGlhZ25vc3RpY3MgdGhhdCBgYXNzZXJ0RXJyb3JgIHdvdWxkIGhhdmUgcmVwb3J0ZWQgYXJlXG4gKiBhdHRhY2hlZCBhcyBub3RlcyB0byB0aGUgbWFsZm9ybWVkIGVycm9yLiBUaHVzLCBhIG1hbGZvcm1lZFxuICogZXJyb3IgaXMgcGFzc2FibGUgYnkgaXRzZWxmLCBidXQgbm90IGFzIHBhcnQgb2YgYSBwYXNzYWJsZSBzdHJ1Y3R1cmUuXG4gKlxuICogQHR5cGUge1Bhc3NTdHlsZUhlbHBlcn1cbiAqL1xuY29uc3QgICAgICAgIEVycm9ySGVscGVyPWhhcmRlbih7XG5zdHlsZU5hbWU6J2Vycm9yJyxcblxuY2FuQmVWYWxpZDooY2FuZGlkYXRlLGNoZWNrKT0+e1xuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpKTtcbi8qIFRPRE86IE5lZWQgYSBiZXR0ZXIgdGVzdCB0aGFuIGluc3RhbmNlb2YqL1xuaWYoIShjYW5kaWRhdGUgaW5zdGFuY2VvZiBFcnJvcikpe1xucmV0dXJuIHJlamVjdCYmcmVqZWN0KFggYEVycm9yIGV4cGVjdGVkOiAke2NhbmRpZGF0ZX1gKTtcbiB9XG5jb25zdCBwcm90bz1nZXRQcm90b3R5cGVPZihjYW5kaWRhdGUpO1xuY29uc3R7bmFtZX09cHJvdG87XG5jb25zdCBFQz1nZXRFcnJvckNvbnN0cnVjdG9yKG5hbWUpO1xuaWYoIUVDfHxFQy5wcm90b3R5cGUhPT1wcm90byl7XG5jb25zdCBub3RlPVggYEVycm9ycyBtdXN0IGluaGVyaXQgZnJvbSBhbiBlcnJvciBjbGFzcyAucHJvdG90eXBlICR7Y2FuZGlkYXRlfWA7XG4vKiBPbmx5IHRlcm1pbmF0ZSBpZiBjaGVjayB0aHJvd3MqL1xucmVqZWN0JiZyZWplY3Qobm90ZSk7XG5hc3NlcnQubm90ZShjYW5kaWRhdGUsbm90ZSk7XG4gfVxuXG5jb25zdHtcbi8qIE11c3QgYWxsb3cgYGNhdXNlYCwgYGVycm9yc2AqL1xubWVzc2FnZTptRGVzYyxcbi8qIEFsbG93IGJ1dCBpZ25vcmUgb25seSBleHRyYW5lb3VzIG93biBgc3RhY2tgIHByb3BlcnR5LiovXG5zdGFjazpfb3B0U3RhY2tEZXNjLFxuLi4ucmVzdERlc2NzfT1cbmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoY2FuZGlkYXRlKTtcbmlmKG93bktleXMocmVzdERlc2NzKS5sZW5ndGg+PTEpe1xuY29uc3Qgbm90ZT1YIGBQYXNzZWQgRXJyb3IgaGFzIGV4dHJhIHVucGFzc2VkIHByb3BlcnRpZXMgJHtyZXN0RGVzY3N9YDtcbi8qIE9ubHkgdGVybWluYXRlIGlmIGNoZWNrIHRocm93cyovXG5yZWplY3QmJnJlamVjdChub3RlKTtcbmFzc2VydC5ub3RlKGNhbmRpZGF0ZSxub3RlKTtcbiB9XG5pZihtRGVzYyl7XG5pZih0eXBlb2YgbURlc2MudmFsdWUhPT0nc3RyaW5nJyl7XG5jb25zdCBub3RlPVggYFBhc3NlZCBFcnJvciBcIm1lc3NhZ2VcIiAke21EZXNjfSBtdXN0IGJlIGEgc3RyaW5nLXZhbHVlZCBkYXRhIHByb3BlcnR5LmA7XG4vKiBPbmx5IHRlcm1pbmF0ZSBpZiBjaGVjayB0aHJvd3MqL1xucmVqZWN0JiZyZWplY3Qobm90ZSk7XG5hc3NlcnQubm90ZShjYW5kaWRhdGUsbm90ZSk7XG4gfVxuaWYobURlc2MuZW51bWVyYWJsZSl7XG5jb25zdCBub3RlPVggYFBhc3NlZCBFcnJvciBcIm1lc3NhZ2VcIiAke21EZXNjfSBtdXN0IG5vdCBiZSBlbnVtZXJhYmxlYDtcbi8qIE9ubHkgdGVybWluYXRlIGlmIGNoZWNrIHRocm93cyovXG5yZWplY3QmJnJlamVjdChub3RlKTtcbmFzc2VydC5ub3RlKGNhbmRpZGF0ZSxub3RlKTtcbiB9XG4gfVxucmV0dXJuIHRydWU7XG4gfSxcblxuYXNzZXJ0VmFsaWQ6KGNhbmRpZGF0ZSk9PntcbkVycm9ySGVscGVyLmNhbkJlVmFsaWQoY2FuZGlkYXRlLGFzc2VydENoZWNrZXIpO1xuIH19KTtcblxuXG4vKipcbiAqIFJldHVybiBhIG5ldyBwYXNzYWJsZSBlcnJvciB0aGF0IHByb3BhZ2F0ZXMgdGhlIGRpYWdub3N0aWMgaW5mbyBvZiB0aGVcbiAqIG9yaWdpbmFsLCBhbmQgaXMgbGlua2VkIHRvIHRoZSBvcmlnaW5hbCBhcyBhIG5vdGUuXG4gKlxuICogQHBhcmFtIHtFcnJvcn0gZXJyXG4gKiBAcmV0dXJucyB7RXJyb3J9XG4gKi8kaOKAjV9vbmNlLkVycm9ySGVscGVyKEVycm9ySGVscGVyKTtcbmNvbnN0ICAgICAgICB0b1Bhc3NhYmxlRXJyb3I9KGVycik9PntcbmNvbnN0e25hbWUsbWVzc2FnZX09ZXJyO1xuXG5jb25zdCBFQz1nZXRFcnJvckNvbnN0cnVjdG9yKCBgJHtuYW1lfWApfHxFcnJvcjtcbmNvbnN0IG5ld0Vycm9yPWhhcmRlbihuZXcgRUMoIGAke21lc3NhZ2V9YCkpO1xuLyogRXZlbiB0aGUgY2xlYW5lZCB1cCBlcnJvciBjb3B5LCBpZiBzZW50IHRvIHRoZSBjb25zb2xlLCBzaG91bGQqL1xuLyogY2F1c2UgaGlkZGVuIGRpYWdub3N0aWMgaW5mb3JtYXRpb24gb2YgdGhlIG9yaWdpbmFsIGVycm9yKi9cbi8qIHRvIGJlIGxvZ2dlZC4qL1xuYXNzZXJ0Lm5vdGUobmV3RXJyb3IsWCBgY29waWVkIGZyb20gZXJyb3IgJHtlcnJ9YCk7XG5yZXR1cm4gbmV3RXJyb3I7XG4gfTskaOKAjV9vbmNlLnRvUGFzc2FibGVFcnJvcih0b1Bhc3NhYmxlRXJyb3IpO1xuaGFyZGVuKHRvUGFzc2FibGVFcnJvcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZ2V0RXJyb3JDb25zdHJ1Y3RvciI6WyJnZXRFcnJvckNvbnN0cnVjdG9yIl0sIkVycm9ySGVscGVyIjpbIkVycm9ySGVscGVyIl0sInRvUGFzc2FibGVFcnJvciI6WyJ0b1Bhc3NhYmxlRXJyb3IiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA0TG62UYIAABGCAAAMAAAAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9oZWxwZXJzL2l0ZXItaGVscGVycy5qc3siaW1wb3J0cyI6WyIuLi9tYWtlLWZhci5qcyJdLCJleHBvcnRzIjpbImZpbHRlckl0ZXJhYmxlIiwibWFwSXRlcmFibGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRmFyOyRo4oCNX2ltcG9ydHMoW1tcIi4uL21ha2UtZmFyLmpzXCIsIFtbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuLyoqXG4gKiBUaGUgcmVzdWx0IGl0ZXJhdG9yIGhhcyBhcyBtYW55IGVsZW1lbnRzIGFzIHRoZSBgYmFzZUl0ZXJhdG9yYCBhbmRcbiAqIGhhdmUgdGhlIHNhbWUgdGVybWluYXRpb24gLS0gdGhlIHNhbWUgY29tcGxldGlvbiB2YWx1ZSBvciBmYWlsdXJlXG4gKiByZWFzb24uIEJ1dCB0aGUgbm9uLWZpbmFsIHZhbHVlcyBhcmUgdGhlIGNvcnJlc3BvbmRpbmcgbm9uLWZpbmFsXG4gKiB2YWx1ZXMgZnJvbSBgYmFzZUl0ZXJhdG9yYCBhcyB0cmFuc2Zvcm1lZCBieSBgZnVuY2AuXG4gKlxuICogQHRlbXBsYXRlIFQsVVxuICogQHBhcmFtIHtJdGVyYWJsZTxUPn0gYmFzZUl0ZXJhYmxlXG4gKiBAcGFyYW0geyh2YWx1ZTogVCkgPT4gVX0gZnVuY1xuICogQHJldHVybnMge0l0ZXJhYmxlPFU+fVxuICovXG5jb25zdCAgICAgICAgbWFwSXRlcmFibGU9KGJhc2VJdGVyYWJsZSxmdW5jKT0+XG4vKiogQHR5cGUge0l0ZXJhYmxlPFU+fSAqL1xuRmFyKCdtYXBwZWQgaXRlcmFibGUnLHtcbltTeW1ib2wuaXRlcmF0b3JdOigpPT57XG5jb25zdCBiYXNlSXRlcmF0b3I9YmFzZUl0ZXJhYmxlW1N5bWJvbC5pdGVyYXRvcl0oKTtcbnJldHVybiBGYXIoJ21hcHBlZCBpdGVyYXRvcicse1xubmV4dDooKT0+e1xuY29uc3R7dmFsdWU6YmFzZVZhbHVlLGRvbmV9PWJhc2VJdGVyYXRvci5uZXh0KCk7XG5jb25zdCB2YWx1ZT1kb25lP2Jhc2VWYWx1ZTpmdW5jKGJhc2VWYWx1ZSk7XG5yZXR1cm4gaGFyZGVuKHt2YWx1ZSxkb25lfSk7XG4gfX0pO1xuXG4gfX0pOyRo4oCNX29uY2UubWFwSXRlcmFibGUobWFwSXRlcmFibGUpO1xuXG5oYXJkZW4obWFwSXRlcmFibGUpO1xuXG4vKipcbiAqIFRoZSByZXN1bHQgaXRlcmF0b3IgaGFzIGEgc3Vic2V0IG9mIHRoZSBub24tZmluYWwgdmFsdWVzIGZyb20gdGhlXG4gKiBgYmFzZUl0ZXJhdG9yYCAtLS0gdGhvc2UgZm9yIHdoaWNoIGBwcmVkKHZhbHVlKWAgd2FzIHRydXRoeS4gVGhlIHJlc3VsdFxuICogaGFzIHRoZSBzYW1lIHRlcm1pbmF0aW9uIGFzIHRoZSBgYmFzZUl0ZXJhdG9yYCAtLSB0aGUgc2FtZSBjb21wbGV0aW9uIHZhbHVlXG4gKiBvciBmYWlsdXJlIHJlYXNvbi5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxUPn0gYmFzZUl0ZXJhYmxlXG4gKiBAcGFyYW0geyh2YWx1ZTogVCkgPT4gYm9vbGVhbn0gcHJlZFxuICogQHJldHVybnMge0l0ZXJhYmxlPFQ+fVxuICovXG5jb25zdCAgICAgICAgZmlsdGVySXRlcmFibGU9KGJhc2VJdGVyYWJsZSxwcmVkKT0+XG4vKiogQHR5cGUge0l0ZXJhYmxlPFU+fSAqL1xuRmFyKCdmaWx0ZXJlZCBpdGVyYWJsZScse1xuW1N5bWJvbC5pdGVyYXRvcl06KCk9PntcbmNvbnN0IGJhc2VJdGVyYXRvcj1iYXNlSXRlcmFibGVbU3ltYm9sLml0ZXJhdG9yXSgpO1xucmV0dXJuIEZhcignZmlsdGVyZWQgaXRlcmF0b3InLHtcbm5leHQ6KCk9PntcbmZvcig7Oyl7XG5jb25zdCByZXN1bHQ9YmFzZUl0ZXJhdG9yLm5leHQoKTtcbmNvbnN0e3ZhbHVlLGRvbmV9PXJlc3VsdDtcbmlmKGRvbmV8fHByZWQodmFsdWUpKXtcbnJldHVybiByZXN1bHQ7XG4gfVxuIH1cbiB9fSk7XG5cbiB9fSk7JGjigI1fb25jZS5maWx0ZXJJdGVyYWJsZShmaWx0ZXJJdGVyYWJsZSk7XG5cbmhhcmRlbihmaWx0ZXJJdGVyYWJsZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFwSXRlcmFibGUiOlsibWFwSXRlcmFibGUiXSwiZmlsdGVySXRlcmFibGUiOlsiZmlsdGVySXRlcmFibGUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAADALqJ/QZAAD0GQAANQAAAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9oZWxwZXJzL3Bhc3NTdHlsZS1oZWxwZXJzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJQQVNTX1NUWUxFIiwiYXNzZXJ0Q2hlY2tlciIsImNhbkJlTWV0aG9kIiwiY2hlY2tGdW5jdGlvblRhZ1JlY29yZCIsImNoZWNrTm9ybWFsUHJvcGVydHkiLCJjaGVja1Bhc3NTdHlsZSIsImNoZWNrVGFnUmVjb3JkIiwiZ2V0VGFnIiwiaGFzT3duUHJvcGVydHlPZiIsImlzT2JqZWN0IiwiaXNUeXBlZEFycmF5Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQHRzLWNoZWNrKi9cblxuLyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIi8+Ki9cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcy5qcycpLkNoZWNrZXJ9IENoZWNrZXIgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMuanMnKS5QYXNzU3R5bGV9IFBhc3NTdHlsZSAqL1xuXG5jb25zdHtkZXRhaWxzOlgscXVvdGU6cX09YXNzZXJ0O1xuY29uc3R7aXNBcnJheX09QXJyYXk7XG5jb25zdHtwcm90b3R5cGU6ZnVuY3Rpb25Qcm90b3R5cGV9PUZ1bmN0aW9uO1xuY29uc3R7XG5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsXG5nZXRQcm90b3R5cGVPZixcbmhhc093blByb3BlcnR5Om9iamVjdEhhc093blByb3BlcnR5LFxuaXNGcm96ZW4sXG5wcm90b3R5cGU6b2JqZWN0UHJvdG90eXBlfT1cbk9iamVjdDtcbmNvbnN0e2FwcGx5fT1SZWZsZWN0O1xuY29uc3R7dG9TdHJpbmdUYWc6dG9TdHJpbmdUYWdTeW1ib2x9PVN5bWJvbDtcblxuY29uc3QgdHlwZWRBcnJheVByb3RvdHlwZT1nZXRQcm90b3R5cGVPZihVaW50OEFycmF5LnByb3RvdHlwZSk7XG5jb25zdCB0eXBlZEFycmF5VG9TdHJpbmdUYWdEZXNjPWdldE93blByb3BlcnR5RGVzY3JpcHRvcihcbnR5cGVkQXJyYXlQcm90b3R5cGUsXG50b1N0cmluZ1RhZ1N5bWJvbCk7XG5cbmFzc2VydCh0eXBlZEFycmF5VG9TdHJpbmdUYWdEZXNjKTtcbmNvbnN0IGdldFR5cGVkQXJyYXlUb1N0cmluZ1RhZz10eXBlZEFycmF5VG9TdHJpbmdUYWdEZXNjLmdldDtcbmFzc2VydCh0eXBlb2YgZ2V0VHlwZWRBcnJheVRvU3RyaW5nVGFnPT09J2Z1bmN0aW9uJyk7XG5cbmNvbnN0ICAgICAgICBoYXNPd25Qcm9wZXJ0eU9mPShvYmoscHJvcCk9PlxuYXBwbHkob2JqZWN0SGFzT3duUHJvcGVydHksb2JqLFtwcm9wXSk7JGjigI1fb25jZS5oYXNPd25Qcm9wZXJ0eU9mKGhhc093blByb3BlcnR5T2YpO1xuaGFyZGVuKGhhc093blByb3BlcnR5T2YpO1xuXG5jb25zdCAgICAgICAgaXNPYmplY3Q9KHZhbCk9Pk9iamVjdCh2YWwpPT09dmFsOyRo4oCNX29uY2UuaXNPYmplY3QoaXNPYmplY3QpO1xuaGFyZGVuKGlzT2JqZWN0KTtcblxuLyoqXG4gKiBEdXBsaWNhdGVzIHBhY2thZ2VzL3Nlcy9zcmMvbWFrZS1oYXJkZW5lci5qcyB0byBhdm9pZCBhIGRlcGVuZGVuY3kuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBvYmplY3RcbiAqL1xuY29uc3QgICAgICAgIGlzVHlwZWRBcnJheT0ob2JqZWN0KT0+e1xuLyogVGhlIG9iamVjdCBtdXN0IHBhc3MgYSBicmFuZCBjaGVjayBvciB0b1N0cmluZ1RhZyB3aWxsIHJldHVybiB1bmRlZmluZWQuKi9cbmNvbnN0IHRhZz1hcHBseShnZXRUeXBlZEFycmF5VG9TdHJpbmdUYWcsb2JqZWN0LFtdKTtcbnJldHVybiB0YWchPT11bmRlZmluZWQ7XG4gfTskaOKAjV9vbmNlLmlzVHlwZWRBcnJheShpc1R5cGVkQXJyYXkpO1xuaGFyZGVuKGlzVHlwZWRBcnJheSk7XG5cbmNvbnN0ICAgICAgICBQQVNTX1NUWUxFPVN5bWJvbC5mb3IoJ3Bhc3NTdHlsZScpO1xuXG4vKipcbiAqIEZvciBhIGZ1bmN0aW9uIHRvIGJlIGEgdmFsaWQgbWV0aG9kLCBpdCBtdXN0IG5vdCBiZSBwYXNzYWJsZS5cbiAqIE90aGVyd2lzZSwgd2UgcmlzayBjb25mdXNpbmcgcGFzcy1ieS1jb3B5IGRhdGEgY2FycnlpbmdcbiAqIGZhciBmdW5jdGlvbnMgd2l0aCBhdHRlbXB0cyBhdCBmYXIgb2JqZWN0cyB3aXRoIG1ldGhvZHMuXG4gKlxuICogVE9ETyBIQVpBUkQgQmVjYXVzZSB3ZSBjaGVjayB0aGlzIG9uIHRoZSB3YXkgdG8gaGFyZGVuaW5nIGEgcmVtb3RhYmxlLFxuICogd2UgY2Fubm90IHlldCBjaGVjayB0aGF0IGBmdW5jYCBpcyBoYXJkZW5lZC4gSG93ZXZlciwgd2l0aG91dFxuICogZG9pbmcgc28sIGl0J3MgaW5oZXJpdGFuY2UgbWlnaHQgY2hhbmdlIGFmdGVyIHRoZSBgUEFTU19TVFlMRWBcbiAqIGNoZWNrIGJlbG93LlxuICpcbiAqIEBwYXJhbSB7YW55fSBmdW5jXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqLyRo4oCNX29uY2UuUEFTU19TVFlMRShQQVNTX1NUWUxFKTtcbmNvbnN0ICAgICAgICBjYW5CZU1ldGhvZD0oZnVuYyk9PlxudHlwZW9mIGZ1bmM9PT0nZnVuY3Rpb24nJiYhKFBBU1NfU1RZTEUgaW4gZnVuYyk7JGjigI1fb25jZS5jYW5CZU1ldGhvZChjYW5CZU1ldGhvZCk7XG5oYXJkZW4oY2FuQmVNZXRob2QpO1xuXG4vKipcbiAqIEJlbG93IHdlIGhhdmUgYSBzZXJpZXMgb2YgcHJlZGljYXRlIGZ1bmN0aW9ucyBhbmQgdGhlaXIgKGN1cnJpZWQpIGFzc2VydGlvblxuICogZnVuY3Rpb25zLiBUaGUgc2VtYW50aWNzIG9mIHRoZSBhc3NlcnRpb24gZnVuY3Rpb24gaXMganVzdCB0byBhc3NlcnQgdGhhdFxuICogdGhlIGNvcnJlc3BvbmRpbmcgcHJlZGljYXRlIGZ1bmN0aW9uIHdvdWxkIGhhdmUgcmV0dXJuZWQgdHJ1ZS4gQnV0IGl0XG4gKiByZXByb2R1Y2VzIHRoZSBpbnRlcm5hbCB0ZXN0cyBzbyBmYWlsdXJlcyBjYW4gZ2l2ZSBhIGJldHRlciBlcnJvciBtZXNzYWdlLlxuICpcbiAqIEB0eXBlIHtDaGVja2VyfVxuICovXG5jb25zdCAgICAgICAgYXNzZXJ0Q2hlY2tlcj0oY29uZCxkZXRhaWxzKT0+e1xuYXNzZXJ0KGNvbmQsZGV0YWlscyk7XG5yZXR1cm4gdHJ1ZTtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0Q2hlY2tlcihhc3NlcnRDaGVja2VyKTtcbmhhcmRlbihhc3NlcnRDaGVja2VyKTtcblxuLyoqXG4gKiBDaGVja3MgZm9yIHRoZSBwcmVzZW5jZSBhbmQgZW51bWVyYWJpbGl0eSBvZiBhbiBvd24gZGF0YSBwcm9wZXJ0eS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gY2FuZGlkYXRlXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ8c3ltYm9sfSBwcm9wZXJ0eU5hbWVcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gc2hvdWxkQmVFbnVtZXJhYmxlXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgY2hlY2tOb3JtYWxQcm9wZXJ0eT0oXG5jYW5kaWRhdGUsXG5wcm9wZXJ0eU5hbWUsXG5zaG91bGRCZUVudW1lcmFibGUsXG5jaGVjayk9Plxue1xuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpKTtcbmNvbnN0IGRlc2M9Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGNhbmRpZGF0ZSxwcm9wZXJ0eU5hbWUpO1xuaWYoZGVzYz09PXVuZGVmaW5lZCl7XG5yZXR1cm4oXG5yZWplY3QmJnJlamVjdChYIGAke3EocHJvcGVydHlOYW1lKX0gcHJvcGVydHkgZXhwZWN0ZWQ6ICR7Y2FuZGlkYXRlfWApKTtcblxuIH1cbnJldHVybihcbihoYXNPd25Qcm9wZXJ0eU9mKGRlc2MsJ3ZhbHVlJyl8fFxucmVqZWN0JiZcbnJlamVjdChcblggYCR7cShwcm9wZXJ0eU5hbWUpfSBtdXN0IG5vdCBiZSBhbiBhY2Nlc3NvciBwcm9wZXJ0eTogJHtjYW5kaWRhdGV9YCkpJiYoXG5cbnNob3VsZEJlRW51bWVyYWJsZT9cbmRlc2MuZW51bWVyYWJsZXx8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgJHtxKHByb3BlcnR5TmFtZSl9IG11c3QgYmUgYW4gZW51bWVyYWJsZSBwcm9wZXJ0eTogJHtjYW5kaWRhdGV9YCk6XG5cbiFkZXNjLmVudW1lcmFibGV8fFxucmVqZWN0JiZcbnJlamVjdChcblggYCR7cShcbnByb3BlcnR5TmFtZSlcbiB9IG11c3Qgbm90IGJlIGFuIGVudW1lcmFibGUgcHJvcGVydHk6ICR7Y2FuZGlkYXRlfWApKSk7XG5cblxuIH07JGjigI1fb25jZS5jaGVja05vcm1hbFByb3BlcnR5KGNoZWNrTm9ybWFsUHJvcGVydHkpO1xuaGFyZGVuKGNoZWNrTm9ybWFsUHJvcGVydHkpO1xuXG5jb25zdCAgICAgICAgZ2V0VGFnPSh0YWdSZWNvcmQpPT50YWdSZWNvcmRbU3ltYm9sLnRvU3RyaW5nVGFnXTskaOKAjV9vbmNlLmdldFRhZyhnZXRUYWcpO1xuaGFyZGVuKGdldFRhZyk7XG5cbmNvbnN0ICAgICAgICBjaGVja1Bhc3NTdHlsZT0ob2JqLGV4cGVjdGVkUGFzc1N0eWxlLGNoZWNrKT0+e1xuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpKTtcbmNvbnN0IGFjdHVhbD1vYmpbUEFTU19TVFlMRV07XG5yZXR1cm4oXG5hY3R1YWw9PT1leHBlY3RlZFBhc3NTdHlsZXx8XG5yZWplY3QmJlxucmVqZWN0KFggYEV4cGVjdGVkICR7cShleHBlY3RlZFBhc3NTdHlsZSl9LCBub3QgJHtxKGFjdHVhbCl9OiAke29ian1gKSk7XG5cbiB9OyRo4oCNX29uY2UuY2hlY2tQYXNzU3R5bGUoY2hlY2tQYXNzU3R5bGUpO1xuaGFyZGVuKGNoZWNrUGFzc1N0eWxlKTtcblxuY29uc3QgbWFrZUNoZWNrVGFnUmVjb3JkPShjaGVja1Byb3RvKT0+e1xuLyoqXG4gKiBAcGFyYW0ge3sgW1BBU1NfU1RZTEVdOiBzdHJpbmcgfX0gdGFnUmVjb3JkXG4gKiBAcGFyYW0ge1Bhc3NTdHlsZX0gcGFzc1N0eWxlXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja1RhZ1JlY29yZD0odGFnUmVjb3JkLHBhc3NTdHlsZSxjaGVjayk9PntcbmNvbnN0IHJlamVjdD0hIWNoZWNrJiYoKGRldGFpbHMpPT5jaGVjayhmYWxzZSxkZXRhaWxzKSk7XG5yZXR1cm4oXG4oaXNPYmplY3QodGFnUmVjb3JkKXx8XG5yZWplY3QmJlxucmVqZWN0KFggYEEgbm9uLW9iamVjdCBjYW5ub3QgYmUgYSB0YWdSZWNvcmQ6ICR7dGFnUmVjb3JkfWApKSYmKFxuaXNGcm96ZW4odGFnUmVjb3JkKXx8XG5yZWplY3QmJnJlamVjdChYIGBBIHRhZ1JlY29yZCBtdXN0IGJlIGZyb3plbjogJHt0YWdSZWNvcmR9YCkpJiYoXG4haXNBcnJheSh0YWdSZWNvcmQpfHxcbnJlamVjdCYmcmVqZWN0KFggYEFuIGFycmF5IGNhbm5vdCBiZSBhIHRhZ1JlY29yZDogJHt0YWdSZWNvcmR9YCkpJiZcbmNoZWNrTm9ybWFsUHJvcGVydHkodGFnUmVjb3JkLFBBU1NfU1RZTEUsZmFsc2UsY2hlY2spJiZcbmNoZWNrUGFzc1N0eWxlKHRhZ1JlY29yZCxwYXNzU3R5bGUsY2hlY2spJiZcbmNoZWNrTm9ybWFsUHJvcGVydHkodGFnUmVjb3JkLFN5bWJvbC50b1N0cmluZ1RhZyxmYWxzZSxjaGVjaykmJihcbnR5cGVvZiBnZXRUYWcodGFnUmVjb3JkKT09PSdzdHJpbmcnfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGBBIFtTeW1ib2wudG9TdHJpbmdUYWddLW5hbWVkIHByb3BlcnR5IG11c3QgYmUgYSBzdHJpbmc6ICR7dGFnUmVjb3JkfWApKSYmXG5cbmNoZWNrUHJvdG8odGFnUmVjb3JkLGdldFByb3RvdHlwZU9mKHRhZ1JlY29yZCksY2hlY2spKTtcblxuIH07XG5yZXR1cm4gaGFyZGVuKGNoZWNrVGFnUmVjb3JkKTtcbiB9O1xuXG5jb25zdCAgICAgICAgY2hlY2tUYWdSZWNvcmQ9bWFrZUNoZWNrVGFnUmVjb3JkKFxuKHZhbCxwcm90byxjaGVjayk9PlxucHJvdG89PT1vYmplY3RQcm90b3R5cGV8fFxuISFjaGVjayYmXG5jaGVjayhmYWxzZSxYIGBBIHRhZ1JlY29yZCBtdXN0IGluaGVyaXQgZnJvbSBPYmplY3QucHJvdG90eXBlOiAke3ZhbH1gKSk7JGjigI1fb25jZS5jaGVja1RhZ1JlY29yZChjaGVja1RhZ1JlY29yZCk7XG5cbmhhcmRlbihjaGVja1RhZ1JlY29yZCk7XG5cbmNvbnN0ICAgICAgICBjaGVja0Z1bmN0aW9uVGFnUmVjb3JkPW1ha2VDaGVja1RhZ1JlY29yZChcbih2YWwscHJvdG8sY2hlY2spPT5cbnByb3RvPT09ZnVuY3Rpb25Qcm90b3R5cGV8fFxucHJvdG8hPT1udWxsJiZnZXRQcm90b3R5cGVPZihwcm90byk9PT1mdW5jdGlvblByb3RvdHlwZXx8XG4hIWNoZWNrJiZcbmNoZWNrKFxuZmFsc2UsXG5YIGBGb3IgZnVuY3Rpb25zLCBhIHRhZ1JlY29yZCBtdXN0IGluaGVyaXQgZnJvbSBGdW5jdGlvbi5wcm90b3R5cGU6ICR7dmFsfWApKTskaOKAjV9vbmNlLmNoZWNrRnVuY3Rpb25UYWdSZWNvcmQoY2hlY2tGdW5jdGlvblRhZ1JlY29yZCk7XG5cblxuaGFyZGVuKGNoZWNrRnVuY3Rpb25UYWdSZWNvcmQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Imhhc093blByb3BlcnR5T2YiOlsiaGFzT3duUHJvcGVydHlPZiJdLCJpc09iamVjdCI6WyJpc09iamVjdCJdLCJpc1R5cGVkQXJyYXkiOlsiaXNUeXBlZEFycmF5Il0sIlBBU1NfU1RZTEUiOlsiUEFTU19TVFlMRSJdLCJjYW5CZU1ldGhvZCI6WyJjYW5CZU1ldGhvZCJdLCJhc3NlcnRDaGVja2VyIjpbImFzc2VydENoZWNrZXIiXSwiY2hlY2tOb3JtYWxQcm9wZXJ0eSI6WyJjaGVja05vcm1hbFByb3BlcnR5Il0sImdldFRhZyI6WyJnZXRUYWciXSwiY2hlY2tQYXNzU3R5bGUiOlsiY2hlY2tQYXNzU3R5bGUiXSwiY2hlY2tUYWdSZWNvcmQiOlsiY2hlY2tUYWdSZWNvcmQiXSwiY2hlY2tGdW5jdGlvblRhZ1JlY29yZCI6WyJjaGVja0Z1bmN0aW9uVGFnUmVjb3JkIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAATybD72HwAA9h8AAC0AAABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvaGVscGVycy9yZW1vdGFibGUuanN7ImltcG9ydHMiOlsiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbIlJlbW90YWJsZUhlbHBlciIsImFzc2VydElmYWNlIiwiZ2V0SW50ZXJmYWNlT2YiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0Q2hlY2tlcixjYW5CZU1ldGhvZCxoYXNPd25Qcm9wZXJ0eU9mLFBBU1NfU1RZTEUsY2hlY2tUYWdSZWNvcmQsY2hlY2tGdW5jdGlvblRhZ1JlY29yZCxpc09iamVjdCxnZXRUYWc7JGjigI1faW1wb3J0cyhbW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV0sW1wiY2FuQmVNZXRob2RcIiwgWyRo4oCNX2EgPT4gKGNhbkJlTWV0aG9kID0gJGjigI1fYSldXSxbXCJoYXNPd25Qcm9wZXJ0eU9mXCIsIFskaOKAjV9hID0+IChoYXNPd25Qcm9wZXJ0eU9mID0gJGjigI1fYSldXSxbXCJQQVNTX1NUWUxFXCIsIFskaOKAjV9hID0+IChQQVNTX1NUWUxFID0gJGjigI1fYSldXSxbXCJjaGVja1RhZ1JlY29yZFwiLCBbJGjigI1fYSA9PiAoY2hlY2tUYWdSZWNvcmQgPSAkaOKAjV9hKV1dLFtcImNoZWNrRnVuY3Rpb25UYWdSZWNvcmRcIiwgWyRo4oCNX2EgPT4gKGNoZWNrRnVuY3Rpb25UYWdSZWNvcmQgPSAkaOKAjV9hKV1dLFtcImlzT2JqZWN0XCIsIFskaOKAjV9hID0+IChpc09iamVjdCA9ICRo4oCNX2EpXV0sW1wiZ2V0VGFnXCIsIFskaOKAjV9hID0+IChnZXRUYWcgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzLmpzJykuQ2hlY2tlcn0gQ2hlY2tlciAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcy5qcycpLkludGVyZmFjZVNwZWN9IEludGVyZmFjZVNwZWMgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMuanMnKS5NYXJzaGFsR2V0SW50ZXJmYWNlT2Z9IE1hcnNoYWxHZXRJbnRlcmZhY2VPZiAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL2ludGVybmFsLXR5cGVzLmpzJykuUGFzc1N0eWxlSGVscGVyfSBQYXNzU3R5bGVIZWxwZXIgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMuanMnKS5SZW1vdGFibGV9IFJlbW90YWJsZSAqL1xuXG5jb25zdHtkZXRhaWxzOlgsRmFpbCxxdW90ZTpxfT1hc3NlcnQ7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7aXNBcnJheX09QXJyYXk7XG5jb25zdHtcbmdldFByb3RvdHlwZU9mLFxuaXNGcm96ZW4sXG5wcm90b3R5cGU6b2JqZWN0UHJvdG90eXBlLFxuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yc309XG5PYmplY3Q7XG5cbi8qKlxuICogQHBhcmFtIHtJbnRlcmZhY2VTcGVjfSBpZmFjZVxuICogQHBhcmFtIHtDaGVja2VyfSBbY2hlY2tdXG4gKi9cbmNvbnN0IGNoZWNrSWZhY2U9KGlmYWNlLGNoZWNrKT0+e1xuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpKTtcbnJldHVybihcbi8qIFRPRE8gb3RoZXIgcG9zc2libGUgaWZhY2VzLCBvbmNlIHdlIGhhdmUgdGhpcmQgcGFydHkgdmVyYWNpdHkqL1xuKHR5cGVvZiBpZmFjZT09PSdzdHJpbmcnfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGBGb3Igbm93LCBpbnRlcmZhY2UgJHtpZmFjZX0gbXVzdCBiZSBhIHN0cmluZzsgdW5pbXBsZW1lbnRlZGApKSYmKFxuXG5pZmFjZT09PSdSZW1vdGFibGUnfHxcbmlmYWNlLnN0YXJ0c1dpdGgoJ0FsbGVnZWQ6ICcpfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGBGb3Igbm93LCBpZmFjZSAke3EoXG5pZmFjZSlcbiB9IG11c3QgYmUgXCJSZW1vdGFibGVcIiBvciBiZWdpbiB3aXRoIFwiQWxsZWdlZDogXCI7IHVuaW1wbGVtZW50ZWRgKSkpO1xuXG5cbiB9O1xuXG4vKipcbiAqIEFuIGBpZmFjZWAgbXVzdCBiZSBwdXJlLiBSaWdodCBub3cgaXQgbXVzdCBiZSBhIHN0cmluZywgd2hpY2ggaXMgcHVyZS5cbiAqIExhdGVyIHdlIGV4cGVjdCB0byBpbmNsdWRlIHNvbWUgb3RoZXIgdmFsdWVzIHRoYXQgcXVhbGlmeSBhcyBgUHVyZURhdGFgLFxuICogd2hpY2ggaXMgYSBwYXNzLWJ5LWNvcHkgc3VwZXJzdHJ1Y3R1cmUgZW5kaW5nIG9ubHkgaW4gcHJpbWl0aXZlcyBvclxuICogZW1wdHkgcGFzcy1ieS1jb3B5IGNvbXBvc2l0ZXMuIE5vIHJlbW90YWJsZXMsIHByb21pc2VzLCBvciBlcnJvcnMuXG4gKiBXZSAqYXNzdW1lKiBmb3Igbm93IHRoYXQgdGhlIHBhc3MtYnktY29weSBzdXBlcnN0cnVjdHVyZSBjb250YWlucyBub1xuICogcHJveGllcy5cbiAqXG4gKiBAcGFyYW0ge0ludGVyZmFjZVNwZWN9IGlmYWNlXG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRJZmFjZT0oaWZhY2UpPT5jaGVja0lmYWNlKGlmYWNlLGFzc2VydENoZWNrZXIpOyRo4oCNX29uY2UuYXNzZXJ0SWZhY2UoYXNzZXJ0SWZhY2UpO1xuaGFyZGVuKGFzc2VydElmYWNlKTtcblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdCB8IEZ1bmN0aW9ufSBvcmlnaW5hbFxuICogQHBhcmFtIHtDaGVja2VyfSBbY2hlY2tdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tSZW1vdGFibGVQcm90b09mPShvcmlnaW5hbCxjaGVjayk9PntcbmNvbnN0IHJlamVjdD0hIWNoZWNrJiYoKGRldGFpbHMpPT5jaGVjayhmYWxzZSxkZXRhaWxzKSk7XG5pc09iamVjdChvcmlnaW5hbCl8fFxuRmFpbCBgUmVtb3RhYmxlcyBtdXN0IGJlIG9iamVjdHMgb3IgZnVuY3Rpb25zOiAke29yaWdpbmFsfWA7XG5cbi8qIEEgdmFsaWQgcmVtb3RhYmxlIG9iamVjdCBtdXN0IGluaGVyaXQgZnJvbSBhIFwidGFnIHJlY29yZFwiIC0tIGEqL1xuLyogcGxhaW4tb2JqZWN0IHByb3RvdHlwZSBjb25zaXN0aW5nIG9mIG9ubHkqL1xuLyogYSBgUEFTU19TVFlMRWAgcHJvcGVydHkgd2l0aCB2YWx1ZSBcInJlbW90YWJsZVwiIGFuZCBhIHN1aXRhYmxlIGBTeW1ib2wudG9TdHJpbmdUYWdgKi9cbi8qIHByb3BlcnR5LiBUaGUgcmVtb3RhYmxlIGNvdWxkIGluaGVyaXQgZGlyZWN0bHkgZnJvbSBzdWNoIGEgdGFnIHJlY29yZCwgb3IqL1xuLyogaXQgY291bGQgaW5oZXJpdCBmcm9tIGFub3RoZXIgdmFsaWQgcmVtb3RhYmxlLCB0aGF0IHRoZXJlZm9yZSBpdHNlbGYqL1xuLyogaW5oZXJpdHMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBmcm9tIHN1Y2ggYSB0YWcgcmVjb3JkLiovXG4vKiovXG4vKiBUT0RPOiBJdCB3b3VsZCBiZSBuaWNlIHRvIHR5cGVkZWYgdGhpcyBzaGFwZSwgYnV0IHdlIGNhbid0IGRlY2xhcmUgYSB0eXBlKi9cbi8qIHdpdGggUEFTU19TVFlMRSBmcm9tIEpTRG9jLiovXG4vKiovXG4vKiBAdHlwZSB7eyBbUEFTU19TVFlMRV06IHN0cmluZywqL1xuLyogW1N5bWJvbC50b1N0cmluZ1RhZ106IHN0cmluZywqL1xuLyogfX0qL1xuLyoqL1xuY29uc3QgcHJvdG89Z2V0UHJvdG90eXBlT2Yob3JpZ2luYWwpO1xuaWYocHJvdG89PT1vYmplY3RQcm90b3R5cGV8fHByb3RvPT09bnVsbCl7XG5yZXR1cm4oXG5yZWplY3QmJlxucmVqZWN0KFggYFJlbW90YWJsZXMgbXVzdCBiZSBleHBsaWNpdGx5IGRlY2xhcmVkOiAke3Eob3JpZ2luYWwpfWApKTtcblxuIH1cblxuaWYodHlwZW9mIG9yaWdpbmFsPT09J29iamVjdCcpe1xuY29uc3QgcHJvdG9Qcm90bz1nZXRQcm90b3R5cGVPZihwcm90byk7XG5pZihwcm90b1Byb3RvIT09b2JqZWN0UHJvdG90eXBlJiZwcm90b1Byb3RvIT09bnVsbCl7XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xucmV0dXJuIGNoZWNrUmVtb3RhYmxlKHByb3RvLGNoZWNrKTtcbiB9XG5pZighY2hlY2tUYWdSZWNvcmQocHJvdG8sJ3JlbW90YWJsZScsY2hlY2spKXtcbnJldHVybiBmYWxzZTtcbiB9XG4gfWVsc2UgaWYodHlwZW9mIG9yaWdpbmFsPT09J2Z1bmN0aW9uJyl7XG5pZighY2hlY2tGdW5jdGlvblRhZ1JlY29yZChwcm90bywncmVtb3RhYmxlJyxjaGVjaykpe1xucmV0dXJuIGZhbHNlO1xuIH1cbiB9XG5cbi8qIFR5cGVjYXN0cyBuZWVkZWQgZHVlIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvMTg2MyovXG5jb25zdCBwYXNzU3R5bGVLZXk9LyoqIEB0eXBlIHt1bmtub3dufSAqL1BBU1NfU1RZTEU7XG5jb25zdCB0YWdLZXk9LyoqIEB0eXBlIHt1bmtub3dufSAqL1N5bWJvbC50b1N0cmluZ1RhZztcbmNvbnN0e1xuLyogY2hlY2tUYWdSZWNvcmQgYWxyZWFkeSB2ZXJpZmllZCBQQVNTX1NUWUxFIGFuZCBTeW1ib2wudG9TdHJpbmdUYWcgb3duIGRhdGEgcHJvcGVydGllcy4qL1xuWy8qKiBAdHlwZSB7c3RyaW5nfSAqL3Bhc3NTdHlsZUtleV06X3Bhc3NTdHlsZURlc2MsXG5bLyoqIEB0eXBlIHtzdHJpbmd9ICovdGFnS2V5XTp7dmFsdWU6aWZhY2V9LFxuLi4ucmVzdERlc2NzfT1cbmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMocHJvdG8pO1xuXG5yZXR1cm4oXG4ob3duS2V5cyhyZXN0RGVzY3MpLmxlbmd0aD09PTB8fFxucmVqZWN0JiZcbnJlamVjdChcblggYFVuZXhwZWN0ZWQgcHJvcGVydGllcyBvbiBSZW1vdGFibGUgUHJvdG8gJHtvd25LZXlzKHJlc3REZXNjcyl9YCkpJiZcblxuY2hlY2tJZmFjZShpZmFjZSxjaGVjaykpO1xuXG4gfTtcblxuLyoqXG4gKiBLZWVwIGEgd2VhayBzZXQgb2YgY29uZmlybWVkIHJlbW90YWJsZXMgZm9yIG1hcnNoYWwgcGVyZm9ybWFuY2VcbiAqICh3aXRob3V0IHdoaWNoIHdlIHdvdWxkIGluY3VyIGEgcmVkdW5kYW50IHZlcmlmaWNhdGlvbiBpblxuICogZ2V0SW50ZXJmYWNlT2YpLlxuICogV2UgZG9uJ3QgcmVtZW1iZXIgcmVqZWN0aW9ucyBiZWNhdXNlIHRoZXkgYXJlIHBvc3NpYmxlIHRvIGNvcnJlY3RcbiAqIHdpdGggZS5nLiBgaGFyZGVuYC5cbiAqXG4gKiBAdHlwZSB7V2Vha1NldDxSZW1vdGFibGU+fVxuICovXG5jb25zdCBjb25maXJtZWRSZW1vdGFibGVzPW5ldyBXZWFrU2V0KCk7XG5cbi8qKlxuICogQHBhcmFtIHtSZW1vdGFibGV9IHZhbFxuICogQHBhcmFtIHtDaGVja2VyfSBbY2hlY2tdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tSZW1vdGFibGU9KHZhbCxjaGVjayk9PntcbmlmKGNvbmZpcm1lZFJlbW90YWJsZXMuaGFzKHZhbCkpe1xucmV0dXJuIHRydWU7XG4gfVxuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpKTtcbmlmKCFpc0Zyb3plbih2YWwpKXtcbnJldHVybiByZWplY3QmJnJlamVjdChYIGBjYW5ub3Qgc2VyaWFsaXplIG5vbi1mcm96ZW4gb2JqZWN0cyBsaWtlICR7dmFsfWApO1xuIH1cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5pZighUmVtb3RhYmxlSGVscGVyLmNhbkJlVmFsaWQodmFsLGNoZWNrKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuY29uc3QgcmVzdWx0PWNoZWNrUmVtb3RhYmxlUHJvdG9PZih2YWwsY2hlY2spO1xuaWYocmVzdWx0KXtcbmNvbmZpcm1lZFJlbW90YWJsZXMuYWRkKHZhbCk7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG4vKiogQHR5cGUge01hcnNoYWxHZXRJbnRlcmZhY2VPZn0gKi9cbmNvbnN0ICAgICAgICBnZXRJbnRlcmZhY2VPZj0odmFsKT0+e1xuaWYoXG4haXNPYmplY3QodmFsKXx8XG52YWxbUEFTU19TVFlMRV0hPT0ncmVtb3RhYmxlJ3x8XG4hY2hlY2tSZW1vdGFibGUodmFsKSlcbntcbnJldHVybiB1bmRlZmluZWQ7XG4gfVxucmV0dXJuIGdldFRhZyh2YWwpO1xuIH07JGjigI1fb25jZS5nZXRJbnRlcmZhY2VPZihnZXRJbnRlcmZhY2VPZik7XG5oYXJkZW4oZ2V0SW50ZXJmYWNlT2YpO1xuXG4vKipcbiAqXG4gKiBAdHlwZSB7UGFzc1N0eWxlSGVscGVyfVxuICovXG5jb25zdCAgICAgICAgUmVtb3RhYmxlSGVscGVyPWhhcmRlbih7XG5zdHlsZU5hbWU6J3JlbW90YWJsZScsXG5cbmNhbkJlVmFsaWQ6KGNhbmRpZGF0ZSxjaGVjayk9PntcbmNvbnN0IHJlamVjdD0hIWNoZWNrJiYoKGRldGFpbHMpPT5jaGVjayhmYWxzZSxkZXRhaWxzKSk7XG5pZighaXNPYmplY3QoY2FuZGlkYXRlKSl7XG5yZXR1cm4oXG5yZWplY3QmJlxucmVqZWN0KFggYGNhbm5vdCBzZXJpYWxpemUgbm9uLW9iamVjdHMgYXMgUmVtb3RhYmxlICR7Y2FuZGlkYXRlfWApKTtcblxuIH1lbHNlIGlmKGlzQXJyYXkoY2FuZGlkYXRlKSl7XG5yZXR1cm4oXG5yZWplY3QmJnJlamVjdChYIGBjYW5ub3Qgc2VyaWFsaXplIGFycmF5cyBhcyBSZW1vdGFibGUgJHtjYW5kaWRhdGV9YCkpO1xuXG4gfVxuXG5jb25zdCBkZXNjcz1nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKGNhbmRpZGF0ZSk7XG5pZih0eXBlb2YgY2FuZGlkYXRlPT09J29iamVjdCcpe1xuLyogRXZlcnkgb3duIHByb3BlcnR5IChyZWdhcmRsZXNzIG9mIGVudW1lcmFiaWxpdHkpKi9cbi8qIG11c3QgaGF2ZSBhIGZ1bmN0aW9uIHZhbHVlLiovXG5jb25zdCBrZXlzPW93bktleXMoZGVzY3MpO1xucmV0dXJuIGtleXMuZXZlcnkoKGtleSk9PntcbnJldHVybihcbi8qIFR5cGVjYXN0IG5lZWRlZCBkdWUgdG8gaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy8xODYzKi9cbihoYXNPd25Qcm9wZXJ0eU9mKGRlc2NzWy8qKiBAdHlwZSB7c3RyaW5nfSAqL2tleV0sJ3ZhbHVlJyl8fFxucmVqZWN0JiZcbnJlamVjdChcblggYGNhbm5vdCBzZXJpYWxpemUgUmVtb3RhYmxlcyB3aXRoIGFjY2Vzc29ycyBsaWtlICR7cShcblN0cmluZyhrZXkpKVxuIH0gaW4gJHtjYW5kaWRhdGV9YCkpJiYoXG5cbmNhbkJlTWV0aG9kKGNhbmRpZGF0ZVtrZXldKXx8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgY2Fubm90IHNlcmlhbGl6ZSBSZW1vdGFibGVzIHdpdGggbm9uLW1ldGhvZHMgbGlrZSAke3EoXG5TdHJpbmcoa2V5KSlcbiB9IGluICR7Y2FuZGlkYXRlfWApKSYmKFxuXG5rZXkhPT1QQVNTX1NUWUxFfHxcbnJlamVjdCYmXG5yZWplY3QoWCBgQSBwYXNzLWJ5LXJlbW90ZSBjYW5ub3Qgc2hhZG93ICR7cShQQVNTX1NUWUxFKX1gKSkpO1xuXG4gfSk7XG4gfWVsc2UgaWYodHlwZW9mIGNhbmRpZGF0ZT09PSdmdW5jdGlvbicpe1xuLyogRmFyIGZ1bmN0aW9ucyBjYW5ub3QgYmUgbWV0aG9kcywgYW5kIGNhbm5vdCBoYXZlIG1ldGhvZHMuKi9cbi8qIFRoZXkgbXVzdCBoYXZlIGV4YWN0bHkgZXhwZWN0ZWQgYC5uYW1lYCBhbmQgYC5sZW5ndGhgIHByb3BlcnRpZXMqL1xuY29uc3R7bmFtZTpuYW1lRGVzYyxsZW5ndGg6bGVuZ3RoRGVzYywuLi5yZXN0RGVzY3N9PWRlc2NzO1xuY29uc3QgcmVzdEtleXM9b3duS2V5cyhyZXN0RGVzY3MpO1xucmV0dXJuKFxuKG5hbWVEZXNjJiZ0eXBlb2YgbmFtZURlc2MudmFsdWU9PT0nc3RyaW5nJ3x8XG5yZWplY3QmJlxucmVqZWN0KFggYEZhciBmdW5jdGlvbiBuYW1lIG11c3QgYmUgYSBzdHJpbmcsIGluICR7Y2FuZGlkYXRlfWApKSYmKFxubGVuZ3RoRGVzYyYmdHlwZW9mIGxlbmd0aERlc2MudmFsdWU9PT0nbnVtYmVyJ3x8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgRmFyIGZ1bmN0aW9uIGxlbmd0aCBtdXN0IGJlIGEgbnVtYmVyLCBpbiAke2NhbmRpZGF0ZX1gKSkmJihcblxucmVzdEtleXMubGVuZ3RoPT09MHx8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgRmFyIGZ1bmN0aW9ucyB1bmV4cGVjdGVkIHByb3BlcnRpZXMgYmVzaWRlcyAubmFtZSBhbmQgLmxlbmd0aCAke3Jlc3RLZXlzfWApKSk7XG5cblxuIH1lbHNle1xucmV0dXJuIHJlamVjdCYmcmVqZWN0KFggYHVucmVjb2duaXplZCB0eXBlb2YgJHtjYW5kaWRhdGV9YCk7XG4gfVxuIH0sXG5cbmFzc2VydFZhbGlkOihjYW5kaWRhdGUpPT5jaGVja1JlbW90YWJsZShjYW5kaWRhdGUsYXNzZXJ0Q2hlY2tlciksXG5cbmV2ZXJ5OihfcGFzc2FibGUsX2ZuKT0+dHJ1ZX0pOyRo4oCNX29uY2UuUmVtb3RhYmxlSGVscGVyKFJlbW90YWJsZUhlbHBlcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYXNzZXJ0SWZhY2UiOlsiYXNzZXJ0SWZhY2UiXSwiZ2V0SW50ZXJmYWNlT2YiOlsiZ2V0SW50ZXJmYWNlT2YiXSwiUmVtb3RhYmxlSGVscGVyIjpbIlJlbW90YWJsZUhlbHBlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAUxqrBig8AAIoPAAAwAAAAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL2hlbHBlcnMvc2FmZS1wcm9taXNlLmpzeyJpbXBvcnRzIjpbIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiLCJAZW5kby9wcm9taXNlLWtpdCJdLCJleHBvcnRzIjpbImFzc2VydFNhZmVQcm9taXNlIiwiaXNTYWZlUHJvbWlzZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBpc1Byb21pc2UsYXNzZXJ0Q2hlY2tlcixoYXNPd25Qcm9wZXJ0eU9mOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJpc1Byb21pc2VcIiwgWyRo4oCNX2EgPT4gKGlzUHJvbWlzZSA9ICRo4oCNX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXSxbXCJoYXNPd25Qcm9wZXJ0eU9mXCIsIFskaOKAjV9hID0+IChoYXNPd25Qcm9wZXJ0eU9mID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzLmpzJykuQ2hlY2tlcn0gQ2hlY2tlciAqL1xuXG5jb25zdHtkZXRhaWxzOlgscXVvdGU6cX09YXNzZXJ0O1xuY29uc3R7aXNGcm96ZW4sZ2V0UHJvdG90eXBlT2Z9PU9iamVjdDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5cbi8qKlxuICogQHBhcmFtIHtQcm9taXNlfSBwciBUaGUgdmFsdWUgdG8gZXhhbWluZVxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge3ByIGlzIFByb21pc2V9IFdoZXRoZXIgaXQgaXMgYSBzYWZlIHByb21pc2VcbiAqL1xuY29uc3QgY2hlY2tQcm9taXNlT3duS2V5cz0ocHIsY2hlY2spPT57XG5jb25zdCByZWplY3Q9KGRldGFpbHMpPT5jaGVjayhmYWxzZSxkZXRhaWxzKTtcbmNvbnN0IGtleXM9b3duS2V5cyhwcik7XG5cbmlmKGtleXMubGVuZ3RoPT09MCl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5cbmNvbnN0IHVua25vd25LZXlzPWtleXMuZmlsdGVyKFxuKGtleSk9PnR5cGVvZiBrZXkhPT0nc3ltYm9sJ3x8IWhhc093blByb3BlcnR5T2YoUHJvbWlzZS5wcm90b3R5cGUsa2V5KSk7XG5cblxuaWYodW5rbm93bktleXMubGVuZ3RoIT09MCl7XG5yZXR1cm4gcmVqZWN0KFxuWCBgJHtwcn0gLSBNdXN0IG5vdCBoYXZlIGFueSBvd24gcHJvcGVydGllczogJHtxKHVua25vd25LZXlzKX1gKTtcblxuIH1cblxuLyoqXG4gKiBBdCB0aGUgdGltZSBvZiB0aGlzIHdyaXRpbmcsIE5vZGUncyBhc3luY19ob29rcyBjb250YWlucyB0aGVcbiAqIGZvbGxvd2luZyBjb2RlLCB3aGljaCB3ZSBjYW4gYWxzbyBzYWZlbHkgdG9sZXJhdGVcbiAqXG4gKiBgYGBqc1xuICogZnVuY3Rpb24gZGVzdHJveVRyYWNraW5nKHByb21pc2UsIHBhcmVudCkge1xuICogdHJhY2tQcm9taXNlKHByb21pc2UsIHBhcmVudCk7XG4gKiAgIGNvbnN0IGFzeW5jSWQgPSBwcm9taXNlW2FzeW5jX2lkX3N5bWJvbF07XG4gKiAgIGNvbnN0IGRlc3Ryb3llZCA9IHsgZGVzdHJveWVkOiBmYWxzZSB9O1xuICogICBwcm9taXNlW2Rlc3Ryb3llZFN5bWJvbF0gPSBkZXN0cm95ZWQ7XG4gKiAgIHJlZ2lzdGVyRGVzdHJveUhvb2socHJvbWlzZSwgYXN5bmNJZCwgZGVzdHJveWVkKTtcbiAqIH1cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfHN5bWJvbH0ga2V5XG4gKi9cbmNvbnN0IGNoZWNrU2FmZUFzeW5jSG9va3NLZXk9KGtleSk9PntcbmNvbnN0IHZhbD1wcltrZXldO1xuaWYodmFsPT09dW5kZWZpbmVkfHx0eXBlb2YgdmFsPT09J251bWJlcicpe1xucmV0dXJuIHRydWU7XG4gfVxuaWYoXG50eXBlb2YgdmFsPT09J29iamVjdCcmJlxudmFsIT09bnVsbCYmXG5pc0Zyb3plbih2YWwpJiZcbmdldFByb3RvdHlwZU9mKHZhbCk9PT1PYmplY3QucHJvdG90eXBlKVxue1xuY29uc3Qgc3ViS2V5cz1vd25LZXlzKHZhbCk7XG5pZihzdWJLZXlzLmxlbmd0aD09PTApe1xucmV0dXJuIHRydWU7XG4gfVxuXG5pZihcbnN1YktleXMubGVuZ3RoPT09MSYmXG5zdWJLZXlzWzBdPT09J2Rlc3Ryb3llZCcmJlxudmFsLmRlc3Ryb3llZD09PWZhbHNlKVxue1xucmV0dXJuIHRydWU7XG4gfVxuIH1cbnJldHVybiByZWplY3QoXG5YIGBVbmV4cGVjdGVkIE5vZGUgYXN5bmNfaG9va3MgYWRkaXRpb25zIHRvIHByb21pc2U6ICR7cHJ9LiR7cShcblN0cmluZyhrZXkpKVxuIH0gaXMgJHt2YWx9YCk7XG5cbiB9O1xuXG5yZXR1cm4ga2V5cy5ldmVyeShjaGVja1NhZmVBc3luY0hvb2tzS2V5KTtcbiB9O1xuXG4vKipcbiAqIFVuZGVyIEhhcmRlbmVkIEpTIGEgcHJvbWlzZSBpcyBcInNhZmVcIiBpZiBpdHMgYHRoZW5gIG1ldGhvZCBjYW4gYmUgY2FsbGVkXG4gKiBzeW5jaHJvbm91c2x5IHdpdGhvdXQgZ2l2aW5nIHRoZSBwcm9taXNlIGFuIG9wcG9ydHVuaXR5IGZvciBhXG4gKiByZWVudHJhbmN5IGF0dGFjayBkdXJpbmcgdGhhdCBjYWxsLlxuICpcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvOVxuICogcmFpc2VzIHRoZSBpc3N1ZSBvZiB0ZXN0aW5nIHRoYXQgYSBzcGVjaW1lbiBpcyBhIHNhZmUgcHJvbWlzZVxuICogc3VjaCB0aGF0IHRoZSB0ZXN0IGFsc28gZG9lcyBub3QgZ2l2ZSB0aGUgc3BlY2ltZW4gYVxuICogcmVlbnRyYW5jeSBvcHBvcnR1bml0eS4gVGhhdCBpcyB3ZWxsIGJleW9uZCB0aGUgYW1iaXRpb24gaGVyZS5cbiAqIFRPRE8gVGhvdWdoIGlmIHdlIGZpZ3VyZSBvdXQgYSBuaWNlIHNvbHV0aW9uLCBpdCBtaWdodCBiZSBnb29kIHRvXG4gKiB1c2UgaXQgaGVyZSBhcyB3ZWxsLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gcHIgVGhlIHZhbHVlIHRvIGV4YW1pbmVcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtwciBpcyBQcm9taXNlfSBXaGV0aGVyIGl0IGlzIGEgc2FmZSBwcm9taXNlXG4gKi9cbmNvbnN0IGNoZWNrU2FmZVByb21pc2U9KHByLGNoZWNrKT0+e1xuY29uc3QgcmVqZWN0PShkZXRhaWxzKT0+Y2hlY2soZmFsc2UsZGV0YWlscyk7XG5yZXR1cm4oXG4oaXNGcm96ZW4ocHIpfHxyZWplY3QoWCBgJHtwcn0gLSBNdXN0IGJlIGZyb3plbmApKSYmKFxuaXNQcm9taXNlKHByKXx8cmVqZWN0KFggYCR7cHJ9IC0gTXVzdCBiZSBhIHByb21pc2VgKSkmJihcbmdldFByb3RvdHlwZU9mKHByKT09PVByb21pc2UucHJvdG90eXBlfHxcbnJlamVjdChcblggYCR7cHJ9IC0gTXVzdCBpbmhlcml0IGZyb20gUHJvbWlzZS5wcm90b3R5cGU6ICR7cShcbmdldFByb3RvdHlwZU9mKHByKSlcbiB9YCkpJiZcblxuY2hlY2tQcm9taXNlT3duS2V5cygvKiogQHR5cGUge1Byb21pc2V9ICovcHIsY2hlY2spKTtcblxuIH07XG5oYXJkZW4oY2hlY2tTYWZlUHJvbWlzZSk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIHRoZSBhcmd1bWVudCBpcyBhIFByb21pc2UuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBwciBUaGUgdmFsdWUgdG8gZXhhbWluZVxuICogQHJldHVybnMge3ByIGlzIFByb21pc2V9IFdoZXRoZXIgaXQgaXMgYSBwcm9taXNlXG4gKi9cbmNvbnN0ICAgICAgICBpc1NhZmVQcm9taXNlPShwcik9PmNoZWNrU2FmZVByb21pc2UocHIsKHgpPT54KTskaOKAjV9vbmNlLmlzU2FmZVByb21pc2UoaXNTYWZlUHJvbWlzZSk7XG5oYXJkZW4oaXNTYWZlUHJvbWlzZSk7XG5cbmNvbnN0ICAgICAgICBhc3NlcnRTYWZlUHJvbWlzZT0ocHIpPT5jaGVja1NhZmVQcm9taXNlKHByLGFzc2VydENoZWNrZXIpOyRo4oCNX29uY2UuYXNzZXJ0U2FmZVByb21pc2UoYXNzZXJ0U2FmZVByb21pc2UpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzU2FmZVByb21pc2UiOlsiaXNTYWZlUHJvbWlzZSJdLCJhc3NlcnRTYWZlUHJvbWlzZSI6WyJhc3NlcnRTYWZlUHJvbWlzZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABlE/1ouRIAALkSAAAqAAAAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL2hlbHBlcnMvc3ltYm9sLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJBdEF0UHJlZml4UGF0dGVybiIsImFzc2VydFBhc3NhYmxlU3ltYm9sIiwiaXNQYXNzYWJsZVN5bWJvbCIsIm5hbWVGb3JQYXNzYWJsZVN5bWJvbCIsInBhc3NhYmxlU3ltYm9sRm9yTmFtZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEB0cy1jaGVjayovXG5cbmNvbnN0e0ZhaWwscXVvdGU6cX09YXNzZXJ0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcblxuLyoqXG4gKiBUaGUgd2VsbCBrbm93biBzeW1ib2xzIGFyZSBzdGF0aWMgc3ltYm9sIHZhbHVlcyBvbiB0aGUgYFN5bWJvbGAgY29uc3RydWN0b3IuXG4gKi9cbmNvbnN0IHdlbGxLbm93blN5bWJvbE5hbWVzPW5ldyBNYXAoXG5vd25LZXlzKFN5bWJvbCkuXG5maWx0ZXIoXG4obmFtZSk9PnR5cGVvZiBuYW1lPT09J3N0cmluZycmJnR5cGVvZiBTeW1ib2xbbmFtZV09PT0nc3ltYm9sJykuXG5cbmZpbHRlcigobmFtZSk9Pntcbi8qIEB0cy1leHBlY3QtZXJyb3IgSXQgZG9lc24ndCBrbm93IG5hbWUgY2Fubm90IGJlIGEgc3ltYm9sKi9cbiFuYW1lLnN0YXJ0c1dpdGgoJ0BAJyl8fFxuRmFpbCBgRGlkIG5vdCBleHBlY3QgU3ltYm9sIHRvIGhhdmUgYSBzeW1ib2wtdmFsdWVkIHByb3BlcnR5IG5hbWUgc3RhcnRpbmcgd2l0aCBcIkBAXCIgJHtxKFxubmFtZSlcbiB9YDtcbnJldHVybiB0cnVlO1xuIH0pXG4vKiBAdHMtaWdub3JlIEl0IGRvZXNuJ3Qga25vdyBuYW1lIGNhbm5vdCBiZSBhIHN5bWJvbCovLlxubWFwKChuYW1lKT0+W1N5bWJvbFtuYW1lXSwgYEBAJHtuYW1lfWBdKSk7XG5cblxuLyoqXG4gKiBUaGUgcGFzc2FibGUgc3ltYm9scyBhcmUgdGhlIHdlbGwga25vd24gc3ltYm9scyAodGhlIHN5bWJvbCB2YWx1ZXNcbiAqIG9mIHN0YXRpYyBwcm9wZXJ0aWVzIG9mIHRoZSBgU3ltYm9sYCBjb25zdHJ1Y3RvcikgYW5kIHRoZSByZWdpc3RlcmVkXG4gKiBzeW1ib2xzLlxuICpcbiAqIEBwYXJhbSB7YW55fSBzeW1cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgaXNQYXNzYWJsZVN5bWJvbD0oc3ltKT0+XG50eXBlb2Ygc3ltPT09J3N5bWJvbCcmJihcbnR5cGVvZiBTeW1ib2wua2V5Rm9yKHN5bSk9PT0nc3RyaW5nJ3x8d2VsbEtub3duU3ltYm9sTmFtZXMuaGFzKHN5bSkpOyRo4oCNX29uY2UuaXNQYXNzYWJsZVN5bWJvbChpc1Bhc3NhYmxlU3ltYm9sKTtcbmhhcmRlbihpc1Bhc3NhYmxlU3ltYm9sKTtcblxuY29uc3QgICAgICAgIGFzc2VydFBhc3NhYmxlU3ltYm9sPShzeW0pPT5cbmlzUGFzc2FibGVTeW1ib2woc3ltKXx8XG5GYWlsIGBPbmx5IHJlZ2lzdGVyZWQgc3ltYm9scyBvciB3ZWxsLWtub3duIHN5bWJvbHMgYXJlIHBhc3NhYmxlOiAke3Eoc3ltKX1gOyRo4oCNX29uY2UuYXNzZXJ0UGFzc2FibGVTeW1ib2woYXNzZXJ0UGFzc2FibGVTeW1ib2wpO1xuaGFyZGVuKGFzc2VydFBhc3NhYmxlU3ltYm9sKTtcblxuLyoqXG4gKiBJZiBgc3ltYCBpcyBhIHBhc3NhYmxlIHN5bWJvbCwgcmV0dXJuIGEgc3RyaW5nIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGlzXG4gKiBzeW1ib2wuIElmIGBzeW1gIGlzIGEgbm9uLXBhc3NhYmxlIHN5bWJvbCwgcmV0dXJuIGB1bmRlZmluZWRgLlxuICpcbiAqIFRoZSBwYXNzYWJsZSBzeW1ib2xzIGFyZSB0aGUgd2VsbCBrbm93biBzeW1ib2xzICh0aGUgc3ltYm9sIHZhbHVlc1xuICogb2Ygc3RhdGljIHByb3BlcnRpZXMgb2YgdGhlIGBTeW1ib2xgIGNvbnN0cnVjdG9yKSBhbmQgdGhlIHJlZ2lzdGVyZWRcbiAqIHN5bWJvbHMuIFNpbmNlIHRoZSByZWdpc3RyYXRpb24gc3RyaW5nIG9mIGEgcmVnaXN0ZXJlZCBzeW1ib2wgY2FuIGJlIGFueVxuICogc3RyaW5nLCBpZiB3ZSBzaW1wbHkgdXNlZCB0aGF0IHRvIGlkZW50aWZ5IHRob3NlIHN5bWJvbHMsIHRoZXJlIHdvdWxkIG5vdFxuICogYmUgYW55IHJlbWFpbmluZyBzdHJpbmdzIGxlZnQgb3ZlciB0byBpZGVudGlmeSB0aGUgd2VsbC1rbm93biBzeW1ib2xzLlxuICogSW5zdGVhZCwgd2UgcmVzZXJ2ZSBzdHJpbmdzIGJlZ2lubmluZyB3aXRoIGBcIkBAXCJgIGZvciBwdXJwb3NlcyBvZiB0aGlzXG4gKiBlbmNvZGluZy4gV2UgaWRlbnRpZnkgYSB3ZWxsIGtub3duIHN5bWJvbCBzdWNoIGFzIGBTeW1ib2wuaXRlcmF0b3JgXG4gKiBieSBwcmVmaXhpbmcgdGhlIHByb3BlcnR5IG5hbWUgd2l0aCBgXCJAQFwiYCwgc3VjaCBhcyBgXCJAQGl0ZXJhdG9yXCJgLlxuICogRm9yIHJlZ2lzdGVyZWQgc3ltYm9scyB3aG9zZSBuYW1lIGhhcHBlbnMgdG8gYmVnaW4gd2l0aCBgXCJAQFwiYCwgc3VjaFxuICogYXMgYFN5bWJvbC5mb3IoJ0BAaXRlcmF0b3InKWAgb3IgYFN5bWJvbC5mb3IoJ0BAZm9vJylgLCB3ZSBpZGVudGlmeVxuICogdGhlbSBieSBwcmVmaXhpbmcgdGhlbSB3aXRoIGFuIGV4dHJhIGBcIkBAXCJgLCBzdWNoIGFzXG4gKiBgXCJAQEBAaXRlcmF0b3JcImAgb3IgYFwiQEBAQGZvb1wiYC4gKFRoaXMgaXMgdGhlIEhpbGJlcnQgSG90ZWwgZW5jb2RpbmdcbiAqIHRlY2huaXF1ZS4pXG4gKlxuICogQHBhcmFtIHtzeW1ib2x9IHN5bVxuICogQHJldHVybnMge3N0cmluZz19XG4gKi9cbmNvbnN0ICAgICAgICBuYW1lRm9yUGFzc2FibGVTeW1ib2w9KHN5bSk9PntcbmNvbnN0IG5hbWU9U3ltYm9sLmtleUZvcihzeW0pO1xuaWYobmFtZT09PXVuZGVmaW5lZCl7XG5yZXR1cm4gd2VsbEtub3duU3ltYm9sTmFtZXMuZ2V0KHN5bSk7XG4gfVxuaWYobmFtZS5zdGFydHNXaXRoKCdAQCcpKXtcbnJldHVybiBgQEAke25hbWV9YDtcbiB9XG5yZXR1cm4gbmFtZTtcbiB9OyRo4oCNX29uY2UubmFtZUZvclBhc3NhYmxlU3ltYm9sKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCk7XG5oYXJkZW4obmFtZUZvclBhc3NhYmxlU3ltYm9sKTtcblxuY29uc3QgICAgICAgIEF0QXRQcmVmaXhQYXR0ZXJuPS9eQEAoLiopJC87JGjigI1fb25jZS5BdEF0UHJlZml4UGF0dGVybihBdEF0UHJlZml4UGF0dGVybik7XG5oYXJkZW4oQXRBdFByZWZpeFBhdHRlcm4pO1xuXG4vKipcbiAqIElmIGBuYW1lYCBpcyBhIHN0cmluZyB0aGF0IGNvdWxkIGhhdmUgYmVlbiBwcm9kdWNlZCBieVxuICogYG5hbWVGb3JQYXNzYWJsZVN5bWJvbGAsIHJldHVybiB0aGUgc3ltYm9sIGFyZ3VtZW50IGl0IHdhcyBwcm9kdWNlZCB0b1xuICogcmVwcmVzZW50LlxuICpcbiAqICAgIElmIGBuYW1lYCBkb2VzIG5vdCBiZWdpbiB3aXRoIGBcIkBAXCJgLCB0aGVuIGp1c3QgdGhlIGNvcnJlc3BvbmRpbmdcbiAqICAgICAgcmVnaXN0ZXJlZCBzeW1ib2wsIGBTeW1ib2wuZm9yKG5hbWUpYC5cbiAqICAgIElmIGBuYW1lYCBpcyBgXCJAQFwiYCBmb2xsb3dlZCBieSBhIHdlbGwga25vd24gc3ltYm9sJ3MgcHJvcGVydHkgbmFtZSBvblxuICogICAgICBgU3ltYm9sYCBzdWNoIGBcIkBAaXRlcmF0b3JcIiwgcmV0dXJuIHRoYXQgd2VsbCBrbm93biBzeW1ib2wgc3VjaCBhc1xuICogICAgICBgU3ltYm9sLml0ZXJhdG9yYFxuICogICAgSWYgYG5hbWVgIGJlZ2lucyB3aXRoIGBcIkBAQEBcImAgaXQgZW5jb2RlcyB0aGUgcmVnaXN0ZXJlZCBzeW1ib2wgd2hvc2VcbiAqICAgICAgbmFtZSBiZWdpbnMgd2l0aCBgXCJAQFwiYCBpbnN0ZWFkLlxuICogICAgT3RoZXJ3aXNlLCBpZiBuYW1lIGJlZ2lucyB3aXRoIGBcIkBAXCJgIGl0IG1heSBlbmNvZGUgYSByZWdpc3RlcmVkIHN5bWJvbFxuICogICAgICBmcm9tIGEgZnV0dXJlIHZlcnNpb24gb2YgSmF2YVNjcmlwdCwgYnV0IGl0IGlzIG5vdCBvbmUgd2UgY2FuIGRlY29kZVxuICogICAgICB5ZXQsIHNvIHRocm93LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcmV0dXJucyB7c3ltYm9sPX1cbiAqL1xuY29uc3QgICAgICAgIHBhc3NhYmxlU3ltYm9sRm9yTmFtZT0obmFtZSk9PntcbmlmKHR5cGVvZiBuYW1lIT09J3N0cmluZycpe1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG5jb25zdCBtYXRjaD1BdEF0UHJlZml4UGF0dGVybi5leGVjKG5hbWUpO1xuaWYobWF0Y2gpe1xuY29uc3Qgc3VmZml4PW1hdGNoWzFdO1xuaWYoc3VmZml4LnN0YXJ0c1dpdGgoJ0BAJykpe1xucmV0dXJuIFN5bWJvbC5mb3Ioc3VmZml4KTtcbiB9ZWxzZXtcbmNvbnN0IHN5bT1TeW1ib2xbc3VmZml4XTtcbmlmKHR5cGVvZiBzeW09PT0nc3ltYm9sJyl7XG5yZXR1cm4gc3ltO1xuIH1cbkZhaWwgYFJlc2VydmVkIGZvciB3ZWxsIGtub3duIHN5bWJvbCAke3Eoc3VmZml4KX06ICR7cShuYW1lKX1gO1xuIH1cbiB9XG5yZXR1cm4gU3ltYm9sLmZvcihuYW1lKTtcbiB9OyRo4oCNX29uY2UucGFzc2FibGVTeW1ib2xGb3JOYW1lKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSk7XG5oYXJkZW4ocGFzc2FibGVTeW1ib2xGb3JOYW1lKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc1Bhc3NhYmxlU3ltYm9sIjpbImlzUGFzc2FibGVTeW1ib2wiXSwiYXNzZXJ0UGFzc2FibGVTeW1ib2wiOlsiYXNzZXJ0UGFzc2FibGVTeW1ib2wiXSwibmFtZUZvclBhc3NhYmxlU3ltYm9sIjpbIm5hbWVGb3JQYXNzYWJsZVN5bWJvbCJdLCJBdEF0UHJlZml4UGF0dGVybiI6WyJBdEF0UHJlZml4UGF0dGVybiJdLCJwYXNzYWJsZVN5bWJvbEZvck5hbWUiOlsicGFzc2FibGVTeW1ib2xGb3JOYW1lIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAq0udbgBwAA4AcAACoAAABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvaGVscGVycy90YWdnZWQuanN7ImltcG9ydHMiOlsiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbIlRhZ2dlZEhlbHBlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnRDaGVja2VyLGNoZWNrVGFnUmVjb3JkLFBBU1NfU1RZTEUsY2hlY2tOb3JtYWxQcm9wZXJ0eSxjaGVja1Bhc3NTdHlsZTskaOKAjV9pbXBvcnRzKFtbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXSxbXCJjaGVja1RhZ1JlY29yZFwiLCBbJGjigI1fYSA9PiAoY2hlY2tUYWdSZWNvcmQgPSAkaOKAjV9hKV1dLFtcIlBBU1NfU1RZTEVcIiwgWyRo4oCNX2EgPT4gKFBBU1NfU1RZTEUgPSAkaOKAjV9hKV1dLFtcImNoZWNrTm9ybWFsUHJvcGVydHlcIiwgWyRo4oCNX2EgPT4gKGNoZWNrTm9ybWFsUHJvcGVydHkgPSAkaOKAjV9hKV1dLFtcImNoZWNrUGFzc1N0eWxlXCIsIFskaOKAjV9hID0+IChjaGVja1Bhc3NTdHlsZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0e0ZhaWx9PWFzc2VydDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzfT1PYmplY3Q7XG5cbi8qKlxuICpcbiAqIEB0eXBlIHtYaW1wb3J0KCcuL2ludGVybmFsLXR5cGVzLmpzJykuUGFzc1N0eWxlSGVscGVyfVxuICovXG5jb25zdCAgICAgICAgVGFnZ2VkSGVscGVyPWhhcmRlbih7XG5zdHlsZU5hbWU6J3RhZ2dlZCcsXG5cbmNhbkJlVmFsaWQ6KGNhbmRpZGF0ZSxjaGVjayk9PmNoZWNrUGFzc1N0eWxlKGNhbmRpZGF0ZSwndGFnZ2VkJyxjaGVjayksXG5cbmFzc2VydFZhbGlkOihjYW5kaWRhdGUscGFzc1N0eWxlT2ZSZWN1cik9PntcbmNoZWNrVGFnUmVjb3JkKGNhbmRpZGF0ZSwndGFnZ2VkJyxhc3NlcnRDaGVja2VyKTtcblxuLyogVHlwZWNhc3RzIG5lZWRlZCBkdWUgdG8gaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy8xODYzKi9cbmNvbnN0IHBhc3NTdHlsZUtleT0vKiogQHR5cGUge3Vua25vd259ICovUEFTU19TVFlMRTtcbmNvbnN0IHRhZ0tleT0vKiogQHR5cGUge3Vua25vd259ICovU3ltYm9sLnRvU3RyaW5nVGFnO1xuY29uc3R7XG4vKiBjaGVja1RhZ1JlY29yZCBhbHJlYWR5IHZlcmlmaWVkIFBBU1NfU1RZTEUgYW5kIFN5bWJvbC50b1N0cmluZ1RhZyBvd24gZGF0YSBwcm9wZXJ0aWVzLiovXG5bLyoqIEB0eXBlIHtzdHJpbmd9ICovcGFzc1N0eWxlS2V5XTpfcGFzc1N0eWxlRGVzYyxcblsvKiogQHR5cGUge3N0cmluZ30gKi90YWdLZXldOl9sYWJlbERlc2MsXG5wYXlsb2FkOl9wYXlsb2FkRGVzYywvKiB2YWx1ZSBjaGVja2VkIGJ5IHJlY3Vyc2l2ZSB3YWxrIGF0IHRoZSBlbmQqL1xuLi4ucmVzdERlc2NzfT1cbmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoY2FuZGlkYXRlKTtcbm93bktleXMocmVzdERlc2NzKS5sZW5ndGg9PT0wfHxcbkZhaWwgYFVuZXhwZWN0ZWQgcHJvcGVydGllcyBvbiB0YWdnZWQgcmVjb3JkICR7b3duS2V5cyhyZXN0RGVzY3MpfWA7XG5cbmNoZWNrTm9ybWFsUHJvcGVydHkoY2FuZGlkYXRlLCdwYXlsb2FkJyx0cnVlLGFzc2VydENoZWNrZXIpO1xuXG4vKiBSZWN1cnNpdmVseSB2YWxpZGF0ZSB0aGF0IGVhY2ggbWVtYmVyIGlzIHBhc3NhYmxlLiovXG5wYXNzU3R5bGVPZlJlY3VyKGNhbmRpZGF0ZS5wYXlsb2FkKTtcbiB9fSk7JGjigI1fb25jZS5UYWdnZWRIZWxwZXIoVGFnZ2VkSGVscGVyKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJUYWdnZWRIZWxwZXIiOlsiVGFnZ2VkSGVscGVyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAABGaO1D0GAAA9BgAACQAAABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvbWFrZS1mYXIuanN7ImltcG9ydHMiOlsiLi9oZWxwZXJzL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9oZWxwZXJzL3JlbW90YWJsZS5qcyJdLCJleHBvcnRzIjpbIkZhciIsIlJlbW90YWJsZSIsIlRvRmFyRnVuY3Rpb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0Q2hlY2tlcixQQVNTX1NUWUxFLGFzc2VydElmYWNlLGdldEludGVyZmFjZU9mLFJlbW90YWJsZUhlbHBlcjskaOKAjV9pbXBvcnRzKFtbXCIuL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dLFtcIlBBU1NfU1RZTEVcIiwgWyRo4oCNX2EgPT4gKFBBU1NfU1RZTEUgPSAkaOKAjV9hKV1dXV0sW1wiLi9oZWxwZXJzL3JlbW90YWJsZS5qc1wiLCBbW1wiYXNzZXJ0SWZhY2VcIiwgWyRo4oCNX2EgPT4gKGFzc2VydElmYWNlID0gJGjigI1fYSldXSxbXCJnZXRJbnRlcmZhY2VPZlwiLCBbJGjigI1fYSA9PiAoZ2V0SW50ZXJmYWNlT2YgPSAkaOKAjV9hKV1dLFtcIlJlbW90YWJsZUhlbHBlclwiLCBbJGjigI1fYSA9PiAoUmVtb3RhYmxlSGVscGVyID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkludGVyZmFjZVNwZWN9IEludGVyZmFjZVNwZWMgKi9cbi8qKiBAdGVtcGxhdGUgTCxSIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9ldmVudHVhbC1zZW5kJykuUmVtb3RhYmxlQnJhbmQ8TCwgUj59IFJlbW90YWJsZUJyYW5kICovXG5cbmNvbnN0e3F1b3RlOnEsRmFpbH09YXNzZXJ0O1xuXG5jb25zdHtwcm90b3R5cGU6ZnVuY3Rpb25Qcm90b3R5cGV9PUZ1bmN0aW9uO1xuY29uc3R7XG5nZXRQcm90b3R5cGVPZixcbnNldFByb3RvdHlwZU9mLFxuY3JlYXRlLFxuaXNGcm96ZW4sXG5wcm90b3R5cGU6b2JqZWN0UHJvdG90eXBlfT1cbk9iamVjdDtcblxuLyoqXG4gKiBOb3cgdGhhdCB0aGUgcmVtb3RhYmxlUHJvdG8gZG9lcyBub3QgcHJvdmlkZSBpdHMgb3duIGB0b1N0cmluZ2AgbWV0aG9kLFxuICogZW5zdXJlIGl0IGFsd2F5cyBpbmhlcml0cyBmcm9tIHNvbWV0aGluZy4gVGhlIG9yaWdpbmFsIHByb3RvdHlwZSBvZlxuICogYHJlbW90YWJsZWAgaWYgdGhlcmUgd2FzIG9uZSwgb3IgYE9iamVjdC5wcm90b3R5cGVgIG90aGVyd2lzZS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcmVtb3RhYmxlXG4gKiBAcGFyYW0ge0ludGVyZmFjZVNwZWN9IGlmYWNlXG4gKiBAcmV0dXJucyB7T2JqZWN0fVxuICovXG5jb25zdCBtYWtlUmVtb3RhYmxlUHJvdG89KHJlbW90YWJsZSxpZmFjZSk9PntcbmxldCBvbGRQcm90bz1nZXRQcm90b3R5cGVPZihyZW1vdGFibGUpO1xuaWYodHlwZW9mIHJlbW90YWJsZT09PSdvYmplY3QnKXtcbmlmKG9sZFByb3RvPT09bnVsbCl7XG5vbGRQcm90bz1vYmplY3RQcm90b3R5cGU7XG4gfVxub2xkUHJvdG89PT1vYmplY3RQcm90b3R5cGV8fFxuRmFpbCBgRm9yIG5vdywgcmVtb3RhYmxlcyBjYW5ub3QgaW5oZXJpdCBmcm9tIGFueXRoaW5nIHVudXN1YWwsIGluICR7cmVtb3RhYmxlfWA7XG4gfWVsc2UgaWYodHlwZW9mIHJlbW90YWJsZT09PSdmdW5jdGlvbicpe1xub2xkUHJvdG8hPT1udWxsfHxcbkZhaWwgYE9yaWdpbmFsIGZ1bmN0aW9uIG11c3Qgbm90IGluaGVyaXQgZnJvbSBudWxsOiAke3JlbW90YWJsZX1gO1xub2xkUHJvdG89PT1mdW5jdGlvblByb3RvdHlwZXx8XG5nZXRQcm90b3R5cGVPZihvbGRQcm90byk9PT1mdW5jdGlvblByb3RvdHlwZXx8XG5GYWlsIGBGYXIgZnVuY3Rpb25zIG11c3Qgb3JpZ2luYWxseSBpbmhlcml0IGZyb20gRnVuY3Rpb24ucHJvdG90eXBlLCBpbiAke3JlbW90YWJsZX1gO1xuIH1lbHNle1xuRmFpbCBgdW5yZWNvZ25pemVkIHR5cGVvZiAke3JlbW90YWJsZX1gO1xuIH1cbnJldHVybiBoYXJkZW4oXG5jcmVhdGUob2xkUHJvdG8se1xuW1BBU1NfU1RZTEVdOnt2YWx1ZToncmVtb3RhYmxlJ30sXG5bU3ltYm9sLnRvU3RyaW5nVGFnXTp7dmFsdWU6aWZhY2V9fSkpO1xuXG5cbiB9O1xuXG5jb25zdCBhc3NlcnRDYW5CZVJlbW90YWJsZT0oY2FuZGlkYXRlKT0+XG5SZW1vdGFibGVIZWxwZXIuY2FuQmVWYWxpZChjYW5kaWRhdGUsYXNzZXJ0Q2hlY2tlcik7XG5cbi8qKlxuICogQ3JlYXRlIGFuZCByZWdpc3RlciBhIFJlbW90YWJsZS4gIEFmdGVyIHRoaXMsIGdldEludGVyZmFjZU9mKHJlbW90YWJsZSlcbiAqIHJldHVybnMgaWZhY2UuXG4gKlxuICogLy8gaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy84MDRcbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJbnRlcmZhY2VTcGVjfSBbaWZhY2U9J1JlbW90YWJsZSddIFRoZSBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbiBmb3JcbiAqIHRoZSByZW1vdGFibGUuIEZvciBub3csIGEgc3RyaW5nIGlmYWNlIG11c3QgYmUgXCJSZW1vdGFibGVcIiBvciBiZWdpbiB3aXRoXG4gKiBcIkFsbGVnZWQ6IFwiLCB0byBzZXJ2ZSBhcyB0aGUgYWxsZWdlZCBuYW1lLiBNb3JlIGdlbmVyYWwgaWZhY2VzIGFyZSBub3QgeWV0XG4gKiBpbXBsZW1lbnRlZC4gVGhpcyBpcyB0ZW1wb3JhcnkuIFdlIGluY2x1ZGUgdGhlXG4gKiBcIkFsbGVnZWRcIiBhcyBhIHJlbWluZGVyIHRoYXQgd2UgZG8gbm90IHlldCBoYXZlIFN3aW5nU2V0IG9yIENvbW1zIFZhdFxuICogc3VwcG9ydCBmb3IgZW5zdXJpbmcgdGhpcyBpcyBhY2NvcmRpbmcgdG8gdGhlIHZhdCBob3N0aW5nIHRoZSBvYmplY3QuXG4gKiBDdXJyZW50bHksIEFsaWNlIGNhbiB0ZWxsIEJvYiBhYm91dCBDYXJvbCwgd2hlcmUgVmF0QSAob24gQWxpY2UncyBiZWhhbGYpXG4gKiBtaXNyZXByZXNlbnRzIENhcm9sJ3MgYGlmYWNlYC4gVmF0QiBhbmQgdGhlcmVmb3JlIEJvYiB3aWxsIHRoZW4gc2VlXG4gKiBDYXJvbCdzIGBpZmFjZWAgYXMgbWlzcmVwcmVzZW50ZWQgYnkgVmF0QS5cbiAqIEBwYXJhbSB7dW5kZWZpbmVkfSBbcHJvcHM9dW5kZWZpbmVkXSBDdXJyZW50bHkgbWF5IG9ubHkgYmUgdW5kZWZpbmVkLlxuICogVGhhdCBwbGFuIGlzIHRoYXQgb3duLXByb3BlcnRpZXMgYXJlIGNvcGllZCB0byB0aGUgcmVtb3RhYmxlXG4gKiBAcGFyYW0ge1R9IFtyZW1vdGFibGU9e31dIFRoZSBvYmplY3QgdXNlZCBhcyB0aGUgcmVtb3RhYmxlXG4gKiBAcmV0dXJucyB7VCAmIFJlbW90YWJsZUJyYW5kPHt9LCBUPn0gcmVtb3RhYmxlLCBtb2RpZmllZCBmb3IgZGVidWdnYWJpbGl0eVxuICovXG5jb25zdCAgICAgICAgUmVtb3RhYmxlPShcbmlmYWNlPSdSZW1vdGFibGUnLFxucHJvcHM9dW5kZWZpbmVkLFxucmVtb3RhYmxlPS8qKiBAdHlwZSB7VH0gKi97fSk9Plxue1xuYXNzZXJ0SWZhY2UoaWZhY2UpO1xuYXNzZXJ0KGlmYWNlKTtcbi8qIFRPRE86IFdoZW4gaWZhY2UgaXMgcmljaGVyIHRoYW4ganVzdCBzdHJpbmcsIHdlIG5lZWQgdG8gZ2V0IHRoZSBhbGxlZ2VkTmFtZSovXG4vKiBpbiBhIGRpZmZlcmVudCB3YXkuKi9cbnByb3BzPT09dW5kZWZpbmVkfHxGYWlsIGBSZW1vdGFibGUgcHJvcHMgbm90IHlldCBpbXBsZW1lbnRlZCAke3Byb3BzfWA7XG5cbi8qIEZhaWwgZmFzdDogY2hlY2sgdGhhdCB0aGUgdW5tb2RpZmllZCBvYmplY3QgaXMgYWJsZSB0byBiZWNvbWUgYSBSZW1vdGFibGUuKi9cbmFzc2VydENhbkJlUmVtb3RhYmxlKHJlbW90YWJsZSk7XG5cbi8qIEVuc3VyZSB0aGF0IHRoZSByZW1vdGFibGUgaXNuJ3QgYWxyZWFkeSBtYXJrZWQuKi9cbiEoUEFTU19TVFlMRSBpbiByZW1vdGFibGUpfHxcbkZhaWwgYFJlbW90YWJsZSAke3JlbW90YWJsZX0gaXMgYWxyZWFkeSBtYXJrZWQgYXMgYSAke3EoXG5yZW1vdGFibGVbUEFTU19TVFlMRV0pXG4gfWA7XG4vKiBFbnN1cmUgdGhhdCB0aGUgcmVtb3RhYmxlIGlzbid0IGFscmVhZHkgZnJvemVuLiovXG4haXNGcm96ZW4ocmVtb3RhYmxlKXx8RmFpbCBgUmVtb3RhYmxlICR7cmVtb3RhYmxlfSBpcyBhbHJlYWR5IGZyb3plbmA7XG5jb25zdCByZW1vdGFibGVQcm90bz1tYWtlUmVtb3RhYmxlUHJvdG8ocmVtb3RhYmxlLGlmYWNlKTtcblxuLyogVGFrZSBhIHN0YXRpYyBjb3B5IG9mIHRoZSBlbnVtZXJhYmxlIG93biBwcm9wZXJ0aWVzIGFzIGRhdGEgcHJvcGVydGllcy4qL1xuLyogY29uc3QgcHJvcERlc2NzID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyh7IC4uLnByb3BzIH0pOyovXG5jb25zdCBtdXRhdGVIYXJkZW5BbmRDaGVjaz0odGFyZ2V0KT0+e1xuLyogZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BEZXNjcyk7Ki9cbnNldFByb3RvdHlwZU9mKHRhcmdldCxyZW1vdGFibGVQcm90byk7XG5oYXJkZW4odGFyZ2V0KTtcbmFzc2VydENhbkJlUmVtb3RhYmxlKHRhcmdldCk7XG4gfTtcblxuLyogRmFpbCBmYXN0OiBjaGVjayBhIGZyZXNoIHJlbW90YWJsZSB0byBzZWUgaWYgb3VyIHJ1bGVzIGZpdC4qL1xubXV0YXRlSGFyZGVuQW5kQ2hlY2soe30pO1xuXG4vKiBBY3R1YWxseSBmaW5pc2ggdGhlIG5ldyByZW1vdGFibGUuKi9cbm11dGF0ZUhhcmRlbkFuZENoZWNrKHJlbW90YWJsZSk7XG5cbi8qIENPTU1JVFRFRCEqL1xuLyogV2UncmUgY29tbWl0dGVkLCBzbyBrZWVwIHRoZSBpbnRlcmZhY2UgZm9yIGZ1dHVyZSByZWZlcmVuY2UuKi9cbmFzc2VydChpZmFjZSE9PXVuZGVmaW5lZCk7LyogVG8gbWFrZSBUeXBlU2NyaXB0IGhhcHB5Ki9cbnJldHVybiAoLyoqIEB0eXBlIHtUICYgUmVtb3RhYmxlQnJhbmQ8e30sIFQ+fSAqL3JlbW90YWJsZSk7XG4gfTskaOKAjV9vbmNlLlJlbW90YWJsZShSZW1vdGFibGUpO1xuaGFyZGVuKFJlbW90YWJsZSk7XG5cbi8qKlxuICogQSBjb25jaXNlIGNvbnZlbmllbmNlIGZvciB0aGUgbW9zdCBjb21tb24gYFJlbW90YWJsZWAgdXNlLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge3N0cmluZ30gZmFyTmFtZSBUaGlzIG5hbWUgd2lsbCBiZSBwcmVwZW5kZWQgd2l0aCBgQWxsZWdlZDogYFxuICogZm9yIG5vdyB0byBmb3JtIHRoZSBgUmVtb3RhYmxlYCBgaWZhY2VgIGFyZ3VtZW50LlxuICogQHBhcmFtIHtUfSBbcmVtb3RhYmxlPXt9XSBUaGUgb2JqZWN0IHVzZWQgYXMgdGhlIHJlbW90YWJsZVxuICovXG5jb25zdCAgICAgICAgRmFyPShmYXJOYW1lLHJlbW90YWJsZT11bmRlZmluZWQpPT57XG5jb25zdCByPXJlbW90YWJsZT09PXVuZGVmaW5lZD8vKiogQHR5cGUge1R9ICove306cmVtb3RhYmxlO1xucmV0dXJuIFJlbW90YWJsZSggYEFsbGVnZWQ6ICR7ZmFyTmFtZX1gLHVuZGVmaW5lZCxyKTtcbiB9OyRo4oCNX29uY2UuRmFyKEZhcik7XG5oYXJkZW4oRmFyKTtcblxuLyoqXG4gKiBDb2VyY2UgYGZ1bmNgIHRvIGEgZmFyIGZ1bmN0aW9uIHRoYXQgcHJlc2VydmVzIGl0cyBjYWxsIGJlaGF2aW9yLlxuICogSWYgaXQgaXMgYWxyZWFkeSBhIGZhciBmdW5jdGlvbiwgcmV0dXJuIGl0LiBPdGhlcndpc2UgbWFrZSBhbmQgcmV0dXJuIGFcbiAqIG5ldyBmYXIgZnVuY3Rpb24gdGhhdCB3cmFwcyBgZnVuY2AgYW5kIGZvcndhcmRzIGNhbGxzIHRvIGl0LiBUaGlzXG4gKiB3b3JrcyBldmVuIGlmIGBmdW5jYCBpcyBhbHJlYWR5IGZyb3plbi4gYFRvRmFyRnVuY3Rpb25gIGlzIHRvIGJlIHVzZWRcbiAqIHdoZW4gdGhlIGZ1bmN0aW9uIGNvbWVzIGZyb20gZWxzZXdoZXJlIHVuZGVyIGxlc3MgY29udHJvbC4gRm9yIGZ1bmN0aW9uc1xuICogeW91IGF1dGhvciBpbiBwbGFjZSwgYmV0dGVyIHRvIHVzZSBgRmFyYCBvbiB0aGVpciBmdW5jdGlvbiBsaXRlcmFsIGRpcmVjdGx5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmYXJOYW1lIHRvIGJlIHVzZWQgb25seSBpZiBgZnVuY2AgaXMgbm90IGFscmVhZHkgYVxuICogZmFyIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsoLi4uYXJnczogYW55W10pID0+IGFueX0gZnVuY1xuICovXG5jb25zdCAgICAgICAgVG9GYXJGdW5jdGlvbj0oZmFyTmFtZSxmdW5jKT0+e1xuaWYoZ2V0SW50ZXJmYWNlT2YoZnVuYykhPT11bmRlZmluZWQpe1xucmV0dXJuIGZ1bmM7XG4gfVxucmV0dXJuIEZhcihmYXJOYW1lLCguLi5hcmdzKT0+ZnVuYyguLi5hcmdzKSk7XG4gfTskaOKAjV9vbmNlLlRvRmFyRnVuY3Rpb24oVG9GYXJGdW5jdGlvbik7XG5oYXJkZW4oVG9GYXJGdW5jdGlvbik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiUmVtb3RhYmxlIjpbIlJlbW90YWJsZSJdLCJGYXIiOlsiRmFyIl0sIlRvRmFyRnVuY3Rpb24iOlsiVG9GYXJGdW5jdGlvbiJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABb8wNnKQQAACkEAAAmAAAAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL21ha2VUYWdnZWQuanN7ImltcG9ydHMiOlsiLi9oZWxwZXJzL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9wYXNzU3R5bGVPZi5qcyJdLCJleHBvcnRzIjpbIm1ha2VUYWdnZWQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgUEFTU19TVFlMRSxhc3NlcnRQYXNzYWJsZTskaOKAjV9pbXBvcnRzKFtbXCIuL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcIlBBU1NfU1RZTEVcIiwgWyRo4oCNX2EgPT4gKFBBU1NfU1RZTEUgPSAkaOKAjV9hKV1dXV0sW1wiLi9wYXNzU3R5bGVPZi5qc1wiLCBbW1wiYXNzZXJ0UGFzc2FibGVcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhc3NhYmxlID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5jb25zdHtjcmVhdGUscHJvdG90eXBlOm9iamVjdFByb3RvdHlwZX09T2JqZWN0O1xuY29uc3R7ZGV0YWlsczpYfT1hc3NlcnQ7XG5cbmNvbnN0ICAgICAgICBtYWtlVGFnZ2VkPSh0YWcscGF5bG9hZCk9PntcbmFzc2VydC50eXBlb2YoXG50YWcsXG4nc3RyaW5nJyxcblggYFRoZSB0YWcgb2YgYSB0YWdnZWQgcmVjb3JkIG11c3QgYmUgYSBzdHJpbmc6ICR7dGFnfWApO1xuXG5hc3NlcnRQYXNzYWJsZShoYXJkZW4ocGF5bG9hZCkpO1xucmV0dXJuIGhhcmRlbihcbmNyZWF0ZShvYmplY3RQcm90b3R5cGUse1xuW1BBU1NfU1RZTEVdOnt2YWx1ZTondGFnZ2VkJ30sXG5bU3ltYm9sLnRvU3RyaW5nVGFnXTp7dmFsdWU6dGFnfSxcbnBheWxvYWQ6e3ZhbHVlOnBheWxvYWQsZW51bWVyYWJsZTp0cnVlfX0pKTtcblxuXG4gfTskaOKAjV9vbmNlLm1ha2VUYWdnZWQobWFrZVRhZ2dlZCk7XG5oYXJkZW4obWFrZVRhZ2dlZCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVRhZ2dlZCI6WyJtYWtlVGFnZ2VkIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANAlDou8KAAAvCgAACoAAABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvbWFyc2hhbC1qdXN0aW4uanN7ImltcG9ydHMiOlsiLi9lbmNvZGVUb0NhcERhdGEuanMiLCIuL2hlbHBlcnMvZXJyb3IuanMiLCIuL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanMiLCIuL2hlbHBlcnMvc3ltYm9sLmpzIiwiQGVuZG8vbmF0Il0sImV4cG9ydHMiOlsiZGVjb2RlVG9KdXN0aW4iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgTmF0LFFDTEFTUyxnZXRFcnJvckNvbnN0cnVjdG9yLGlzT2JqZWN0LEF0QXRQcmVmaXhQYXR0ZXJuLHBhc3NhYmxlU3ltYm9sRm9yTmFtZTskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9uYXRcIiwgW1tcIk5hdFwiLCBbJGjigI1fYSA9PiAoTmF0ID0gJGjigI1fYSldXV1dLFtcIi4vZW5jb2RlVG9DYXBEYXRhLmpzXCIsIFtbXCJRQ0xBU1NcIiwgWyRo4oCNX2EgPT4gKFFDTEFTUyA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvZXJyb3IuanNcIiwgW1tcImdldEVycm9yQ29uc3RydWN0b3JcIiwgWyRo4oCNX2EgPT4gKGdldEVycm9yQ29uc3RydWN0b3IgPSAkaOKAjV9hKV1dXV0sW1wiLi9oZWxwZXJzL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJpc09iamVjdFwiLCBbJGjigI1fYSA9PiAoaXNPYmplY3QgPSAkaOKAjV9hKV1dXV0sW1wiLi9oZWxwZXJzL3N5bWJvbC5qc1wiLCBbW1wiQXRBdFByZWZpeFBhdHRlcm5cIiwgWyRo4oCNX2EgPT4gKEF0QXRQcmVmaXhQYXR0ZXJuID0gJGjigI1fYSldXSxbXCJwYXNzYWJsZVN5bWJvbEZvck5hbWVcIiwgWyRo4oCNX2EgPT4gKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5FbmNvZGluZ30gRW5jb2RpbmcgKi9cblxuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2lzQXJyYXl9PUFycmF5O1xuY29uc3R7c3RyaW5naWZ5OnF1b3RlfT1KU09OO1xuY29uc3R7cXVvdGU6cSxkZXRhaWxzOlgsRmFpbH09YXNzZXJ0O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEluZGVudGVyXG4gKiBAcHJvcGVydHkgeyhvcGVuQnJhY2tldDogc3RyaW5nKSA9PiBudW1iZXJ9IG9wZW5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gbnVtYmVyfSBsaW5lXG4gKiBAcHJvcGVydHkgeyh0b2tlbjogc3RyaW5nKSA9PiBudW1iZXJ9IG5leHRcbiAqIEBwcm9wZXJ0eSB7KGNsb3NlQnJhY2tldDogc3RyaW5nKSA9PiBudW1iZXJ9IGNsb3NlXG4gKiBAcHJvcGVydHkgeygpID0+IHN0cmluZ30gZG9uZVxuICovXG5cbi8qKlxuICogR2VuZXJvdXMgd2hpdGVzcGFjZSBmb3IgcmVhZGFiaWxpdHlcbiAqXG4gKiBAcmV0dXJucyB7SW5kZW50ZXJ9XG4gKi9cbmNvbnN0IG1ha2VZZXNJbmRlbnRlcj0oKT0+e1xuY29uc3Qgc3RyaW5ncz1bXTtcbmxldCBsZXZlbD0wO1xubGV0IG5lZWRTcGFjZT1mYWxzZTtcbmNvbnN0IGxpbmU9KCk9Pntcbm5lZWRTcGFjZT1mYWxzZTtcbnJldHVybiBzdHJpbmdzLnB1c2goJ1xcbicsJyAgJy5yZXBlYXQobGV2ZWwpKTtcbiB9O1xucmV0dXJuIGhhcmRlbih7XG5vcGVuOihvcGVuQnJhY2tldCk9PntcbmxldmVsKz0xO1xuaWYobmVlZFNwYWNlKXtcbnN0cmluZ3MucHVzaCgnICcpO1xuIH1cbm5lZWRTcGFjZT1mYWxzZTtcbnJldHVybiBzdHJpbmdzLnB1c2gob3BlbkJyYWNrZXQpO1xuIH0sXG5saW5lLFxubmV4dDoodG9rZW4pPT57XG5pZihuZWVkU3BhY2UmJnRva2VuIT09JywnKXtcbnN0cmluZ3MucHVzaCgnICcpO1xuIH1cbm5lZWRTcGFjZT10cnVlO1xucmV0dXJuIHN0cmluZ3MucHVzaCh0b2tlbik7XG4gfSxcbmNsb3NlOihjbG9zZUJyYWNrZXQpPT57XG5hc3NlcnQobGV2ZWw+PTEpO1xubGV2ZWwtPTE7XG5saW5lKCk7XG5yZXR1cm4gc3RyaW5ncy5wdXNoKGNsb3NlQnJhY2tldCk7XG4gfSxcbmRvbmU6KCk9PntcbmFzc2VydC5lcXVhbChsZXZlbCwwKTtcbnJldHVybiBzdHJpbmdzLmpvaW4oJycpO1xuIH19KTtcblxuIH07XG5cbi8qKlxuICogSWYgdGhlIGxhc3QgY2hhcmFjdGVyIG9mIG9uZSB0b2tlbiB0b2dldGhlciB3aXRoIHRoZSBmaXJzdCBjaGFyYWN0ZXJcbiAqIG9mIHRoZSBuZXh0IHRva2VuIG1hdGNoZXMgdGhpcyBwYXR0ZXJuLCB0aGVuIHRoZSB0d28gdG9rZW5zIG11c3QgYmVcbiAqIHNlcGFyYXRlZCBieSB3aGl0ZXNwYWNlIHRvIHByZXNlcnZlIHRoZWlyIG1lYW5pbmcuIE90aGVyd2lzZSB0aGVcbiAqIHdoaXRlc3BhY2UgaW4gdW5uZWNlc3NhcnkuXG4gKlxuICogVGhlIGA8IWAgYW5kIGAtPmAgY2FzZXMgcHJldmVudCB0aGUgYWNjaWRlbnRhbCBmb3JtYXRpb24gb2YgYW5cbiAqIGh0bWwtbGlrZSBjb21tZW50LiBJIGRvbid0IHRoaW5rIHRoZSBkb3VibGUgYW5nbGUgYnJhY2tldHMgYXJlIGFjdHVhbGx5XG4gKiBuZWVkZWQgYnV0IEkgaGF2ZW4ndCB0aG91Z2h0IGFib3V0IGl0IGVub3VnaCB0byByZW1vdmUgdGhlbS5cbiAqL1xuY29uc3QgYmFkUGFpclBhdHRlcm49L14oPzpcXHdcXHd8PDx8Pj58XFwrXFwrfC0tfDwhfC0+KSQvO1xuXG4vKipcbiAqIE1pbmltdW0gd2hpdGVzcGFjZSBuZWVkZWQgdG8gcHJlc2V2ZSBtZWFuaW5nLlxuICpcbiAqIEByZXR1cm5zIHtJbmRlbnRlcn1cbiAqL1xuY29uc3QgbWFrZU5vSW5kZW50ZXI9KCk9PntcbmNvbnN0IHN0cmluZ3M9W107XG5yZXR1cm4gaGFyZGVuKHtcbm9wZW46KG9wZW5CcmFja2V0KT0+c3RyaW5ncy5wdXNoKG9wZW5CcmFja2V0KSxcbmxpbmU6KCk9PnN0cmluZ3MubGVuZ3RoLFxubmV4dDoodG9rZW4pPT57XG5pZihzdHJpbmdzLmxlbmd0aD49MSl7XG5jb25zdCBsYXN0PXN0cmluZ3Nbc3RyaW5ncy5sZW5ndGgtMV07XG5pZihsYXN0Lmxlbmd0aD49MSYmdG9rZW4ubGVuZ3RoPj0xKXtcbmNvbnN0IHBhaXI9IGAke2xhc3RbbGFzdC5sZW5ndGgtMV19JHt0b2tlblswXX1gO1xuaWYoYmFkUGFpclBhdHRlcm4udGVzdChwYWlyKSl7XG5zdHJpbmdzLnB1c2goJyAnKTtcbiB9XG4gfVxuIH1cbnJldHVybiBzdHJpbmdzLnB1c2godG9rZW4pO1xuIH0sXG5jbG9zZTooY2xvc2VCcmFja2V0KT0+e1xuaWYoc3RyaW5ncy5sZW5ndGg+PTEmJnN0cmluZ3Nbc3RyaW5ncy5sZW5ndGgtMV09PT0nLCcpe1xuc3RyaW5ncy5wb3AoKTtcbiB9XG5yZXR1cm4gc3RyaW5ncy5wdXNoKGNsb3NlQnJhY2tldCk7XG4gfSxcbmRvbmU6KCk9PnN0cmluZ3Muam9pbignJyl9KTtcblxuIH07XG5cbmNvbnN0IGlkZW50UGF0dGVybj0vXlthLXpBLVpdXFx3KiQvO1xuXG4vKipcbiAqIEBwYXJhbSB7RW5jb2Rpbmd9IGVuY29kaW5nXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBzaG91bGRJbmRlbnRcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IGRlY29kZVRvSnVzdGluPShlbmNvZGluZyxzaG91bGRJbmRlbnQ9ZmFsc2UpPT57XG4vKipcbiAqIFRoZSBmaXJzdCBwYXNzIGRvZXMgc29tZSBpbnB1dCB2YWxpZGF0aW9uLlxuICogSXRzIGNvbnRyb2wgZmxvdyBzaG91bGQgbWlycm9yIGByZWN1cmAgYXMgY2xvc2VseSBhcyBwb3NzaWJsZVxuICogYW5kIHRoZSB0d28gc2hvdWxkIGJlIG1haW50YWluZWQgdG9nZXRoZXIuIFRoZXkgbXVzdCB2aXNpdCBldmVyeXRoaW5nXG4gKiBpbiB0aGUgc2FtZSBvcmRlci5cbiAqXG4gKiBUT0RPIG5vdyB0aGF0IGliaWRzIGFyZSBnb25lLCB3ZSBzaG91bGQgZm9sZCB0aGlzIGJhY2sgdG9nZXRoZXIgaW50b1xuICogb25lIHZhbGlkYXRpbmcgcGFzcy5cbiAqXG4gKiBAcGFyYW0ge0VuY29kaW5nfSByYXdUcmVlXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuY29uc3QgcHJlcGFyZT0ocmF3VHJlZSk9PntcbmlmKCFpc09iamVjdChyYXdUcmVlKSl7XG5yZXR1cm47XG4gfVxuLyogQXNzZXJ0aW9ucyBvZiB0aGUgYWJvdmUgdG8gbmFycm93IHRoZSB0eXBlLiovXG5hc3NlcnQudHlwZW9mKHJhd1RyZWUsJ29iamVjdCcpO1xuYXNzZXJ0KHJhd1RyZWUhPT1udWxsKTtcbmlmKFFDTEFTUyBpbiByYXdUcmVlKXtcbmNvbnN0IHFjbGFzcz1yYXdUcmVlW1FDTEFTU107XG5hc3NlcnQudHlwZW9mKFxucWNsYXNzLFxuJ3N0cmluZycsXG5YIGBpbnZhbGlkIHFjbGFzcyB0eXBlb2YgJHtxKHR5cGVvZiBxY2xhc3MpfWApO1xuXG5hc3NlcnQoIWlzQXJyYXkocmF3VHJlZSkpO1xuc3dpdGNoKHJhd1RyZWVbJ0BxY2xhc3MnXSl7XG5jYXNlJ3VuZGVmaW5lZCc6XG5jYXNlJ05hTic6XG5jYXNlJ0luZmluaXR5JzpcbmNhc2UnLUluZmluaXR5Jzp7XG5yZXR1cm47XG4gfVxuY2FzZSdiaWdpbnQnOntcbmNvbnN0e2RpZ2l0c309cmF3VHJlZTtcbmFzc2VydC50eXBlb2YoXG5kaWdpdHMsXG4nc3RyaW5nJyxcblggYGludmFsaWQgZGlnaXRzIHR5cGVvZiAke3EodHlwZW9mIGRpZ2l0cyl9YCk7XG5cbnJldHVybjtcbiB9XG5jYXNlJ0BAYXN5bmNJdGVyYXRvcic6e1xucmV0dXJuO1xuIH1cbmNhc2Unc3ltYm9sJzp7XG5jb25zdHtuYW1lfT1yYXdUcmVlO1xuY29uc3Qgc3ltPXBhc3NhYmxlU3ltYm9sRm9yTmFtZShuYW1lKTtcbmFzc2VydC50eXBlb2Yoc3ltLCdzeW1ib2wnKTtcbnJldHVybjtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xuY29uc3R7dGFnLHBheWxvYWR9PXJhd1RyZWU7XG5hc3NlcnQudHlwZW9mKHRhZywnc3RyaW5nJyk7XG5wcmVwYXJlKHBheWxvYWQpO1xucmV0dXJuO1xuIH1cbmNhc2Unc2xvdCc6e1xuY29uc3R7aW5kZXgsaWZhY2V9PXJhd1RyZWU7XG5hc3NlcnQudHlwZW9mKGluZGV4LCdudW1iZXInKTtcbk5hdChpbmRleCk7XG5pZihpZmFjZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnQudHlwZW9mKGlmYWNlLCdzdHJpbmcnKTtcbiB9XG5yZXR1cm47XG4gfVxuY2FzZSdoaWxiZXJ0Jzp7XG5jb25zdHtvcmlnaW5hbCxyZXN0fT1yYXdUcmVlO1xuJ29yaWdpbmFsJ2luIHJhd1RyZWV8fFxuRmFpbCBgSW52YWxpZCBIaWxiZXJ0IEhvdGVsIGVuY29kaW5nICR7cmF3VHJlZX1gO1xucHJlcGFyZShvcmlnaW5hbCk7XG5pZigncmVzdCdpbiByYXdUcmVlKXtcbmFzc2VydC50eXBlb2YoXG5yZXN0LFxuJ29iamVjdCcsXG5YIGBSZXN0ICR7cmVzdH0gZW5jb2RpbmcgbXVzdCBiZSBhbiBvYmplY3RgKTtcblxuaWYocmVzdD09PW51bGwpe1xudGhyb3cgRmFpbCBgUmVzdCAke3Jlc3R9IGVuY29kaW5nIG11c3Qgbm90IGJlIG51bGxgO1xuIH1cbiFpc0FycmF5KHJlc3QpfHxGYWlsIGBSZXN0ICR7cmVzdH0gZW5jb2RpbmcgbXVzdCBub3QgYmUgYW4gYXJyYXlgO1xuIShRQ0xBU1MgaW4gcmVzdCl8fFxuRmFpbCBgUmVzdCBlbmNvZGluZyAke3Jlc3R9IG11c3Qgbm90IGNvbnRhaW4gJHtxKFFDTEFTUyl9YDtcbmNvbnN0IG5hbWVzPW93bktleXMocmVzdCk7XG5mb3IoY29uc3QgbmFtZSBvZiBuYW1lcyl7XG5hc3NlcnQudHlwZW9mKFxubmFtZSxcbidzdHJpbmcnLFxuWCBgUHJvcGVydHkgbmFtZSAke25hbWV9IG9mICR7cmF3VHJlZX0gbXVzdCBiZSBhIHN0cmluZ2ApO1xuXG5wcmVwYXJlKHJlc3RbbmFtZV0pO1xuIH1cbiB9XG5yZXR1cm47XG4gfVxuY2FzZSdlcnJvcic6e1xuY29uc3R7bmFtZSxtZXNzYWdlfT1yYXdUcmVlO1xuYXNzZXJ0LnR5cGVvZihcbm5hbWUsXG4nc3RyaW5nJyxcblggYGludmFsaWQgZXJyb3IgbmFtZSB0eXBlb2YgJHtxKHR5cGVvZiBuYW1lKX1gKTtcblxuZ2V0RXJyb3JDb25zdHJ1Y3RvcihuYW1lKSE9PXVuZGVmaW5lZHx8XG5GYWlsIGBNdXN0IGJlIHRoZSBuYW1lIG9mIGFuIEVycm9yIGNvbnN0cnVjdG9yICR7bmFtZX1gO1xuYXNzZXJ0LnR5cGVvZihcbm1lc3NhZ2UsXG4nc3RyaW5nJyxcblggYGludmFsaWQgZXJyb3IgbWVzc2FnZSB0eXBlb2YgJHtxKHR5cGVvZiBtZXNzYWdlKX1gKTtcblxucmV0dXJuO1xuIH1cblxuZGVmYXVsdDp7XG5hc3NlcnQuZmFpbChYIGB1bnJlY29nbml6ZWQgJHtxKFFDTEFTUyl9ICR7cShxY2xhc3MpfWAsVHlwZUVycm9yKTtcbiB9fVxuXG4gfWVsc2UgaWYoaXNBcnJheShyYXdUcmVlKSl7XG5jb25zdHtsZW5ndGh9PXJhd1RyZWU7XG5mb3IobGV0IGk9MDtpPGxlbmd0aDtpKz0xKXtcbnByZXBhcmUocmF3VHJlZVtpXSk7XG4gfVxuIH1lbHNle1xuY29uc3QgbmFtZXM9b3duS2V5cyhyYXdUcmVlKTtcbmZvcihjb25zdCBuYW1lIG9mIG5hbWVzKXtcbmFzc2VydC50eXBlb2YoXG5uYW1lLFxuJ3N0cmluZycsXG5YIGBQcm9wZXJ0eSBuYW1lICR7bmFtZX0gb2YgJHtyYXdUcmVlfSBtdXN0IGJlIGEgc3RyaW5nYCk7XG5cbnByZXBhcmUocmF3VHJlZVtuYW1lXSk7XG4gfVxuIH1cbiB9O1xuXG5jb25zdCBtYWtlSW5kZW50ZXI9c2hvdWxkSW5kZW50P21ha2VZZXNJbmRlbnRlcjptYWtlTm9JbmRlbnRlcjtcbmNvbnN0IG91dD1tYWtlSW5kZW50ZXIoKTtcblxuLyoqXG4gKiBUaGlzIGlzIHRoZSBzZWNvbmQgcGFzcyByZWN1cnNpb24gYWZ0ZXIgdGhlIGZpcnN0IHBhc3MgYHByZXBhcmVgLlxuICogVGhlIGZpcnN0IHBhc3MgZGlkIHNvbWUgaW5wdXQgdmFsaWRhdGlvbiBzb1xuICogaGVyZSB3ZSBjYW4gc2FmZWx5IGFzc3VtZSBldmVyeXRoaW5nIHRob3NlIHRoaW5ncyBhcmUgdmFsaWRhdGVkLlxuICpcbiAqIEBwYXJhbSB7RW5jb2Rpbmd9IHJhd1RyZWVcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmNvbnN0IGRlY29kZT0ocmF3VHJlZSk9Pntcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5yZXR1cm4gcmVjdXIocmF3VHJlZSk7XG4gfTtcblxuY29uc3QgZGVjb2RlUHJvcGVydHk9KG5hbWUsdmFsdWUpPT57XG5vdXQubGluZSgpO1xuaWYobmFtZT09PSdfX3Byb3RvX18nKXtcbi8qIEphdmFTY3JpcHQgaW50ZXJwcmV0cyBge19fcHJvdG9fXzogeCwgLi4ufWAqL1xuLyogYXMgbWFraW5nIGFuIG9iamVjdCBpbmhlcml0aW5nIGZyb20gYHhgLCB3aGVyZWFzKi9cbi8qIGluIEpTT04gaXQgaXMgc2ltcGx5IGEgcHJvcGVydHkgbmFtZS4gUHJlc2VydmUgdGhlKi9cbi8qIEpTT04gbWVhbmluZy4qL1xub3V0Lm5leHQoIGBbXCJfX3Byb3RvX19cIl06YCk7XG4gfWVsc2UgaWYoaWRlbnRQYXR0ZXJuLnRlc3QobmFtZSkpe1xub3V0Lm5leHQoIGAke25hbWV9OmApO1xuIH1lbHNle1xub3V0Lm5leHQoIGAke3F1b3RlKG5hbWUpfTpgKTtcbiB9XG5kZWNvZGUodmFsdWUpO1xub3V0Lm5leHQoJywnKTtcbiB9O1xuXG4vKipcbiAqIE1vZGVsZWQgYWZ0ZXIgYGZ1bGxSZXZpdmVgIGluIG1hcnNoYWwuanNcbiAqXG4gKiBAcGFyYW0ge0VuY29kaW5nfSByYXdUcmVlXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5jb25zdCByZWN1cj0ocmF3VHJlZSk9PntcbmlmKCFpc09iamVjdChyYXdUcmVlKSl7XG4vKiBwcmltaXRpdmVzIGdldCBxdW90ZWQqL1xucmV0dXJuIG91dC5uZXh0KHF1b3RlKHJhd1RyZWUpKTtcbiB9XG4vKiBBc3NlcnRpb25zIG9mIHRoZSBhYm92ZSB0byBuYXJyb3cgdGhlIHR5cGUuKi9cbmFzc2VydC50eXBlb2YocmF3VHJlZSwnb2JqZWN0Jyk7XG5hc3NlcnQocmF3VHJlZSE9PW51bGwpO1xuaWYoUUNMQVNTIGluIHJhd1RyZWUpe1xuY29uc3QgcWNsYXNzPXJhd1RyZWVbUUNMQVNTXTtcbmFzc2VydC50eXBlb2YocWNsYXNzLCdzdHJpbmcnKTtcbmFzc2VydCghaXNBcnJheShyYXdUcmVlKSk7XG4vKiBTd2l0Y2hpbmcgb24gYGVuY29kZWRbUUNMQVNTXWAgKG9yIGFueXRoaW5nIGxlc3MgZGlyZWN0LCBsaWtlKi9cbi8qIGBxY2xhc3NgKSBkb2VzIG5vdCBkaXNjcmltaW5hdGUgcmF3VHJlZSBpbiB0eXBlc2NyaXB0QDQuMi4zIGFuZCovXG4vKiBlYXJsaWVyLiovXG5zd2l0Y2gocmF3VHJlZVsnQHFjbGFzcyddKXtcbi8qIEVuY29kaW5nIG9mIHByaW1pdGl2ZXMgbm90IGhhbmRsZWQgYnkgSlNPTiovXG5jYXNlJ3VuZGVmaW5lZCc6XG5jYXNlJ05hTic6XG5jYXNlJ0luZmluaXR5JzpcbmNhc2UnLUluZmluaXR5Jzp7XG4vKiBUaGVpciBxY2xhc3MgaXMgdGhlaXIgZXhwcmVzc2lvbiBzb3VyY2UuKi9cbnJldHVybiBvdXQubmV4dChxY2xhc3MpO1xuIH1cbmNhc2UnYmlnaW50Jzp7XG5jb25zdHtkaWdpdHN9PXJhd1RyZWU7XG5yZXR1cm4gb3V0Lm5leHQoIGAke0JpZ0ludChkaWdpdHMpfW5gKTtcbiB9XG5jYXNlJ0BAYXN5bmNJdGVyYXRvcic6e1xuLyogVE9ETyBkZXByZWNhdGVkLiBFdmVudHVhbGx5IHJlbW92ZS4qL1xucmV0dXJuIG91dC5uZXh0KCdTeW1ib2wuYXN5bmNJdGVyYXRvcicpO1xuIH1cbmNhc2Unc3ltYm9sJzp7XG5jb25zdHtuYW1lfT1yYXdUcmVlO1xuY29uc3Qgc3ltPXBhc3NhYmxlU3ltYm9sRm9yTmFtZShuYW1lKTtcbmFzc2VydC50eXBlb2Yoc3ltLCdzeW1ib2wnKTtcbmNvbnN0IHJlZ2lzdGVyZWROYW1lPVN5bWJvbC5rZXlGb3Ioc3ltKTtcbmlmKHJlZ2lzdGVyZWROYW1lPT09dW5kZWZpbmVkKXtcbmNvbnN0IG1hdGNoPUF0QXRQcmVmaXhQYXR0ZXJuLmV4ZWMobmFtZSk7XG5hc3NlcnQobWF0Y2ghPT1udWxsKTtcbmNvbnN0IHN1ZmZpeD1tYXRjaFsxXTtcbmFzc2VydChTeW1ib2xbc3VmZml4XT09PXN5bSk7XG5hc3NlcnQoaWRlbnRQYXR0ZXJuLnRlc3Qoc3VmZml4KSk7XG5yZXR1cm4gb3V0Lm5leHQoIGBTeW1ib2wuJHtzdWZmaXh9YCk7XG4gfVxucmV0dXJuIG91dC5uZXh0KCBgU3ltYm9sLmZvcigke3F1b3RlKHJlZ2lzdGVyZWROYW1lKX0pYCk7XG4gfVxuY2FzZSd0YWdnZWQnOntcbmNvbnN0e3RhZyxwYXlsb2FkfT1yYXdUcmVlO1xub3V0Lm5leHQoIGBtYWtlVGFnZ2VkKCR7cXVvdGUodGFnKX0sYCk7XG5kZWNvZGUocGF5bG9hZCk7XG5yZXR1cm4gb3V0Lm5leHQoJyknKTtcbiB9XG5cbmNhc2Unc2xvdCc6e1xubGV0e2luZGV4LGlmYWNlfT1yYXdUcmVlO1xuaW5kZXg9TnVtYmVyKE5hdChpbmRleCkpO1xuaWYoaWZhY2U9PT11bmRlZmluZWQpe1xucmV0dXJuIG91dC5uZXh0KCBgc2xvdCgke2luZGV4fSlgKTtcbiB9ZWxzZXtcbmlmYWNlPXF1b3RlKGlmYWNlKTtcbnJldHVybiBvdXQubmV4dCggYHNsb3QoJHtpbmRleH0sJHtpZmFjZX0pYCk7XG4gfVxuIH1cblxuY2FzZSdoaWxiZXJ0Jzp7XG5jb25zdHtvcmlnaW5hbCxyZXN0fT1yYXdUcmVlO1xub3V0Lm9wZW4oJ3snKTtcbmRlY29kZVByb3BlcnR5KFFDTEFTUyxvcmlnaW5hbCk7XG5pZigncmVzdCdpbiByYXdUcmVlKXtcbmFzc2VydC50eXBlb2YocmVzdCwnb2JqZWN0Jyk7XG5hc3NlcnQocmVzdCE9PW51bGwpO1xuY29uc3QgbmFtZXM9b3duS2V5cyhyZXN0KTtcbmZvcihjb25zdCBuYW1lIG9mIG5hbWVzKXtcbmFzc2VydC50eXBlb2YoXG5uYW1lLFxuJ3N0cmluZycsXG5YIGBQcm9wZXJ0eSBuYW1lICR7bmFtZX0gb2YgJHtyZXN0fSBtdXN0IGJlIGEgc3RyaW5nYCk7XG5cbmRlY29kZVByb3BlcnR5KG5hbWUscmVzdFtuYW1lXSk7XG4gfVxuIH1cbnJldHVybiBvdXQuY2xvc2UoJ30nKTtcbiB9XG5cbmNhc2UnZXJyb3InOntcbmNvbnN0e25hbWUsbWVzc2FnZX09cmF3VHJlZTtcbnJldHVybiBvdXQubmV4dCggYCR7bmFtZX0oJHtxdW90ZShtZXNzYWdlKX0pYCk7XG4gfVxuXG5kZWZhdWx0OntcbmFzc2VydC5mYWlsKFggYHVucmVjb2duaXplZCAke3EoUUNMQVNTKX0gJHtxKHFjbGFzcyl9YCxUeXBlRXJyb3IpO1xuIH19XG5cbiB9ZWxzZSBpZihpc0FycmF5KHJhd1RyZWUpKXtcbmNvbnN0e2xlbmd0aH09cmF3VHJlZTtcbmlmKGxlbmd0aD09PTApe1xucmV0dXJuIG91dC5uZXh0KCdbXScpO1xuIH1lbHNle1xub3V0Lm9wZW4oJ1snKTtcbmZvcihsZXQgaT0wO2k8bGVuZ3RoO2krPTEpe1xub3V0LmxpbmUoKTtcbmRlY29kZShyYXdUcmVlW2ldKTtcbm91dC5uZXh0KCcsJyk7XG4gfVxucmV0dXJuIG91dC5jbG9zZSgnXScpO1xuIH1cbiB9ZWxzZXtcbi8qIHJhd1RyZWUgaXMgYW4gYEVuY29kaW5nUmVjb3JkYCB3aGljaCBvbmx5IGhhcyBzdHJpbmcga2V5cywqL1xuLyogYnV0IHNpbmNlIG93bktleXMgaXMgbm90IGdlbmVyaWMsIGl0IGNhbid0IHByb3BhZ2F0ZSB0aGF0Ki9cbmNvbnN0IG5hbWVzPS8qKiBAdHlwZSB7c3RyaW5nW119ICovb3duS2V5cyhyYXdUcmVlKTtcbmlmKG5hbWVzLmxlbmd0aD09PTApe1xucmV0dXJuIG91dC5uZXh0KCd7fScpO1xuIH1lbHNle1xub3V0Lm9wZW4oJ3snKTtcbmZvcihjb25zdCBuYW1lIG9mIG5hbWVzKXtcbmRlY29kZVByb3BlcnR5KG5hbWUscmF3VHJlZVtuYW1lXSk7XG4gfVxucmV0dXJuIG91dC5jbG9zZSgnfScpO1xuIH1cbiB9XG4gfTtcbnByZXBhcmUoZW5jb2RpbmcpO1xuZGVjb2RlKGVuY29kaW5nKTtcbnJldHVybiBvdXQuZG9uZSgpO1xuIH07JGjigI1fb25jZS5kZWNvZGVUb0p1c3RpbihkZWNvZGVUb0p1c3Rpbik7XG5oYXJkZW4oZGVjb2RlVG9KdXN0aW4pO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlY29kZVRvSnVzdGluIjpbImRlY29kZVRvSnVzdGluIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADLXk0XDBgAAwwYAAC0AAABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanN7ImltcG9ydHMiOlsiLi9tYXJzaGFsLmpzIl0sImV4cG9ydHMiOlsicGFyc2UiLCJzdHJpbmdpZnkiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgbWFrZU1hcnNoYWw7JGjigI1faW1wb3J0cyhbW1wiLi9tYXJzaGFsLmpzXCIsIFtbXCJtYWtlTWFyc2hhbFwiLCBbJGjigI1fYSA9PiAobWFrZU1hcnNoYWwgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUGFzc2FibGV9IFBhc3NhYmxlICovXG5cbmNvbnN0e0ZhaWx9PWFzc2VydDtcblxuLyoqIEB0eXBlIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQ29udmVydFZhbFRvU2xvdDxhbnk+fSAqL1xuY29uc3QgZG9Ob3RDb252ZXJ0VmFsVG9TbG90PSh2YWwpPT5cbkZhaWwgYE1hcnNoYWwncyBzdHJpbmdpZnkgcmVqZWN0cyBwcmVzZW5jZXMgYW5kIHByb21pc2VzICR7dmFsfWA7XG5cbi8qKiBAdHlwZSB7WGltcG9ydCgnLi90eXBlcy5qcycpLkNvbnZlcnRTbG90VG9WYWw8YW55Pn0gKi9cbmNvbnN0IGRvTm90Q29udmVydFNsb3RUb1ZhbD0oc2xvdCxfaWZhY2UpPT5cbkZhaWwgYE1hcnNoYWwncyBwYXJzZSBtdXN0IG5vdCBlbmNvZGUgYW55IHNsb3RzICR7c2xvdH1gO1xuXG5jb25zdCBiYWRBcnJheUhhbmRsZXI9aGFyZGVuKHtcbmdldDooX3RhcmdldCxuYW1lLF9yZWNlaXZlcik9PntcbmlmKG5hbWU9PT0nbGVuZ3RoJyl7XG5yZXR1cm4gMDtcbiB9XG4vKiBgdGhyb3dgIGlzIG5vb3Agc2luY2UgYEZhaWxgIHRocm93cy4gQnV0IGxpbnRlciBjb25mdXNlZCovXG50aHJvdyBGYWlsIGBNYXJzaGFsJ3MgcGFyc2UgbXVzdCBub3QgZW5jb2RlIGFueSBzbG90IHBvc2l0aW9ucyAke25hbWV9YDtcbiB9fSk7XG5cblxuY29uc3QgYmFkQXJyYXk9aGFyZGVuKG5ldyBQcm94eShoYXJkZW4oW10pLGJhZEFycmF5SGFuZGxlcikpO1xuXG5jb25zdHtzZXJpYWxpemUsdW5zZXJpYWxpemV9PW1ha2VNYXJzaGFsKFxuZG9Ob3RDb252ZXJ0VmFsVG9TbG90LFxuZG9Ob3RDb252ZXJ0U2xvdFRvVmFsLFxue1xuZXJyb3JUYWdnaW5nOidvZmYnLFxuLyogVE9ETyBmaXggdGVzdHMgdG8gd29ya3Mgd2l0aCBzbWFsbGNhcHMuKi9cbnNlcmlhbGl6ZUJvZHlGb3JtYXQ6J2NhcGRhdGEnfSk7XG5cblxuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHZhbFxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3Qgc3RyaW5naWZ5PSh2YWwpPT5zZXJpYWxpemUodmFsKS5ib2R5OyRo4oCNX29uY2Uuc3RyaW5naWZ5KHN0cmluZ2lmeSk7XG5oYXJkZW4oc3RyaW5naWZ5KTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gKiBAcmV0dXJucyB7UGFzc2FibGV9XG4gKi9cbmNvbnN0IHBhcnNlPShzdHIpPT5cbnVuc2VyaWFsaXplKFxuaGFyZGVuKHtcbmJvZHk6c3RyLFxuc2xvdHM6YmFkQXJyYXl9KSk7JGjigI1fb25jZS5wYXJzZShwYXJzZSk7XG5cblxuaGFyZGVuKHBhcnNlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJzdHJpbmdpZnkiOlsic3RyaW5naWZ5Il0sInBhcnNlIjpbInBhcnNlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGnf3flVMgAAVTIAACMAAABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvbWFyc2hhbC5qc3siaW1wb3J0cyI6WyIuL2VuY29kZVRvQ2FwRGF0YS5qcyIsIi4vZW5jb2RlVG9TbWFsbGNhcHMuanMiLCIuL2hlbHBlcnMvZXJyb3IuanMiLCIuL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanMiLCIuL2hlbHBlcnMvcmVtb3RhYmxlLmpzIiwiLi9wYXNzU3R5bGVPZi5qcyIsIkBlbmRvL25hdCJdLCJleHBvcnRzIjpbIm1ha2VNYXJzaGFsIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IE5hdCxhc3NlcnRQYXNzYWJsZSxnZXRJbnRlcmZhY2VPZixnZXRFcnJvckNvbnN0cnVjdG9yLFFDTEFTUyxtYWtlRW5jb2RlVG9DYXBEYXRhLG1ha2VEZWNvZGVGcm9tQ2FwRGF0YSxtYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyxtYWtlRW5jb2RlVG9TbWFsbGNhcHMsaGFzT3duUHJvcGVydHlPZjskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9uYXRcIiwgW1tcIk5hdFwiLCBbJGjigI1fYSA9PiAoTmF0ID0gJGjigI1fYSldXV1dLFtcIi4vcGFzc1N0eWxlT2YuanNcIiwgW1tcImFzc2VydFBhc3NhYmxlXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXNzYWJsZSA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvcmVtb3RhYmxlLmpzXCIsIFtbXCJnZXRJbnRlcmZhY2VPZlwiLCBbJGjigI1fYSA9PiAoZ2V0SW50ZXJmYWNlT2YgPSAkaOKAjV9hKV1dXV0sW1wiLi9oZWxwZXJzL2Vycm9yLmpzXCIsIFtbXCJnZXRFcnJvckNvbnN0cnVjdG9yXCIsIFskaOKAjV9hID0+IChnZXRFcnJvckNvbnN0cnVjdG9yID0gJGjigI1fYSldXV1dLFtcIi4vZW5jb2RlVG9DYXBEYXRhLmpzXCIsIFtbXCJRQ0xBU1NcIiwgWyRo4oCNX2EgPT4gKFFDTEFTUyA9ICRo4oCNX2EpXV0sW1wibWFrZUVuY29kZVRvQ2FwRGF0YVwiLCBbJGjigI1fYSA9PiAobWFrZUVuY29kZVRvQ2FwRGF0YSA9ICRo4oCNX2EpXV0sW1wibWFrZURlY29kZUZyb21DYXBEYXRhXCIsIFskaOKAjV9hID0+IChtYWtlRGVjb2RlRnJvbUNhcERhdGEgPSAkaOKAjV9hKV1dXV0sW1wiLi9lbmNvZGVUb1NtYWxsY2Fwcy5qc1wiLCBbW1wibWFrZURlY29kZUZyb21TbWFsbGNhcHNcIiwgWyRo4oCNX2EgPT4gKG1ha2VEZWNvZGVGcm9tU21hbGxjYXBzID0gJGjigI1fYSldXSxbXCJtYWtlRW5jb2RlVG9TbWFsbGNhcHNcIiwgWyRo4oCNX2EgPT4gKG1ha2VFbmNvZGVUb1NtYWxsY2FwcyA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImhhc093blByb3BlcnR5T2ZcIiwgWyRo4oCNX2EgPT4gKGhhc093blByb3BlcnR5T2YgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuTWFrZU1hcnNoYWxPcHRpb25zfSBNYWtlTWFyc2hhbE9wdGlvbnMgKi9cbi8qKiBAdGVtcGxhdGUgU2xvdCBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkNvbnZlcnRTbG90VG9WYWw8U2xvdD59IENvbnZlcnRTbG90VG9WYWwgKi9cbi8qKiBAdGVtcGxhdGUgU2xvdCBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkNvbnZlcnRWYWxUb1Nsb3Q8U2xvdD59IENvbnZlcnRWYWxUb1Nsb3QgKi9cbi8qKiBAdGVtcGxhdGUgU2xvdCBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlNlcmlhbGl6ZTxTbG90Pn0gU2VyaWFsaXplICovXG4vKiogQHRlbXBsYXRlIFNsb3QgQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5VbnNlcmlhbGl6ZTxTbG90Pn0gVW5zZXJpYWxpemUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlBhc3NhYmxlfSBQYXNzYWJsZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuSW50ZXJmYWNlU3BlY30gSW50ZXJmYWNlU3BlYyAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuRW5jb2Rpbmd9IEVuY29kaW5nICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5SZW1vdGFibGV9IFJlbW90YWJsZSAqL1xuXG5jb25zdHtpc0FycmF5fT1BcnJheTtcbmNvbnN0e2RldGFpbHM6WCxGYWlsLHF1b3RlOnF9PWFzc2VydDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5cbi8qKiBAdHlwZSB7Q29udmVydFZhbFRvU2xvdDxhbnk+fSAqL1xuY29uc3QgZGVmYXVsdFZhbFRvU2xvdEZuPSh4KT0+eDtcbi8qKiBAdHlwZSB7Q29udmVydFNsb3RUb1ZhbDxhbnk+fSAqL1xuY29uc3QgZGVmYXVsdFNsb3RUb1ZhbEZuPSh4LF8pPT54O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBTbG90XG4gKiBAcGFyYW0ge0NvbnZlcnRWYWxUb1Nsb3Q8U2xvdD59IFtjb252ZXJ0VmFsVG9TbG90XVxuICogQHBhcmFtIHtDb252ZXJ0U2xvdFRvVmFsPFNsb3Q+fSBbY29udmVydFNsb3RUb1ZhbF1cbiAqIEBwYXJhbSB7TWFrZU1hcnNoYWxPcHRpb25zfSBvcHRpb25zXG4gKi9cbmNvbnN0ICAgICAgICBtYWtlTWFyc2hhbD0oXG5jb252ZXJ0VmFsVG9TbG90PWRlZmF1bHRWYWxUb1Nsb3RGbixcbmNvbnZlcnRTbG90VG9WYWw9ZGVmYXVsdFNsb3RUb1ZhbEZuLFxue1xuZXJyb3JUYWdnaW5nPSdvbicsXG5tYXJzaGFsTmFtZT0nYW5vbi1tYXJzaGFsJyxcbi8qIFRPRE8gVGVtcG9yYXJ5IGhhY2suKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzI3ODAqL1xuZXJyb3JJZE51bT0xMDAwMCxcbi8qIFdlIHByZWZlciB0aGF0IHRoZSBjYWxsZXIgaW5zdGVhZCBsb2cgdG8gc29tZXdoZXJlIGhpZGRlbiovXG4vKiB0byBiZSByZXZlYWxlZCB3aGVuIGNvcnJlbGF0aW5nIHdpdGggdGhlIHJlY2VpdmVkIGVycm9yLiovXG5tYXJzaGFsU2F2ZUVycm9yPShlcnIpPT5cbmNvbnNvbGUubG9nKCdUZW1wb3JhcnkgbG9nZ2luZyBvZiBzZW50IGVycm9yJyxlcnIpLFxuLyogRGVmYXVsdCB0byAnY2FwZGF0YScgYmVjYXVzZSBpdCB3YXMgaW1wbGVtZW50ZWQgZmlyc3QuKi9cbi8qIFNvbWV0aW1lcywgb250b2dlbnkgZG9lcyByZWNhcGl0dWxhdGUgcGh5bG9nZW55IDspKi9cbnNlcmlhbGl6ZUJvZHlGb3JtYXQ9J2NhcGRhdGEnfT1cbnt9KT0+XG57XG5hc3NlcnQudHlwZW9mKG1hcnNoYWxOYW1lLCdzdHJpbmcnKTtcbmVycm9yVGFnZ2luZz09PSdvbid8fFxuZXJyb3JUYWdnaW5nPT09J29mZid8fFxuRmFpbCBgVGhlIGVycm9yVGFnZ2luZyBvcHRpb24gY2FuIG9ubHkgYmUgXCJvblwiIG9yIFwib2ZmXCIgJHtlcnJvclRhZ2dpbmd9YDtcbmNvbnN0IG5leHRFcnJvcklkPSgpPT57XG5lcnJvcklkTnVtKz0xO1xucmV0dXJuIGBlcnJvcjoke21hcnNoYWxOYW1lfSMke2Vycm9ySWROdW19YDtcbiB9O1xuXG4vKipcbiAqIEB0eXBlIHtTZXJpYWxpemU8U2xvdD59XG4gKi9cbmNvbnN0IHNlcmlhbGl6ZT0ocm9vdCk9PntcbmNvbnN0IHNsb3RzPVtdO1xuLyogbWFwcyB2YWwgKHByb21pc2Ugb3IgcmVtb3RhYmxlKSB0byBpbmRleCBvZiBzbG90c1tdKi9cbmNvbnN0IHNsb3RNYXA9bmV3IE1hcCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7UmVtb3RhYmxlIHwgUHJvbWlzZX0gcGFzc2FibGVcbiAqIEByZXR1cm5zIHt7aW5kZXg6IG51bWJlciwgcmVwZWF0OiBib29sZWFufX1cbiAqL1xuY29uc3QgZW5jb2RlU2xvdENvbW1vbj0ocGFzc2FibGUpPT57XG5sZXQgaW5kZXg9c2xvdE1hcC5nZXQocGFzc2FibGUpO1xuaWYoaW5kZXghPT11bmRlZmluZWQpe1xuLyogVE9ETyBhc3NlcnQgdGhhdCBpdCdzIHRoZSBzYW1lIGlmYWNlIGFzIGJlZm9yZSovXG5hc3NlcnQudHlwZW9mKGluZGV4LCdudW1iZXInKTtcbnJldHVybiBoYXJkZW4oe2luZGV4LHJlcGVhdDp0cnVlfSk7XG4gfVxuXG5pbmRleD1zbG90cy5sZW5ndGg7XG5jb25zdCBzbG90PWNvbnZlcnRWYWxUb1Nsb3QocGFzc2FibGUpO1xuc2xvdHMucHVzaChzbG90KTtcbnNsb3RNYXAuc2V0KHBhc3NhYmxlLGluZGV4KTtcbnJldHVybiBoYXJkZW4oe2luZGV4LHJlcGVhdDpmYWxzZX0pO1xuIH07XG5cbi8qKlxuICogRXZlbiBpZiBhbiBFcnJvciBpcyBub3QgYWN0dWFsbHkgcGFzc2FibGUsIHdlJ2QgcmF0aGVyIHNlbmRcbiAqIGl0IGFueXdheSBiZWNhdXNlIHRoZSBkaWFnbm9zdGljIGluZm8gY2FycmllZCBieSB0aGUgZXJyb3JcbiAqIGlzIG1vcmUgdmFsdWFibGUgdGhhbiBkaWFnbm9zaW5nIHdoeSB0aGUgZXJyb3IgaXNuJ3RcbiAqIHBhc3NhYmxlLiBTZWUgY29tbWVudHMgaW4gRXJyb3JIZWxwZXIuXG4gKlxuICogQHBhcmFtIHtFcnJvcn0gZXJyXG4gKiBAcGFyYW0geyhwOiBQYXNzYWJsZSkgPT4gdW5rbm93bn0gZW5jb2RlUmVjdXJcbiAqIEByZXR1cm5zIHt7ZXJyb3JJZD86IHN0cmluZywgbWVzc2FnZTogc3RyaW5nLCBuYW1lOiBzdHJpbmd9fVxuICovXG5jb25zdCBlbmNvZGVFcnJvckNvbW1vbj0oZXJyLGVuY29kZVJlY3VyKT0+e1xuY29uc3QgbWVzc2FnZT1lbmNvZGVSZWN1ciggYCR7ZXJyLm1lc3NhZ2V9YCk7XG5hc3NlcnQudHlwZW9mKG1lc3NhZ2UsJ3N0cmluZycpO1xuY29uc3QgbmFtZT1lbmNvZGVSZWN1ciggYCR7ZXJyLm5hbWV9YCk7XG5hc3NlcnQudHlwZW9mKG5hbWUsJ3N0cmluZycpO1xuLyogTXVzdCBlbmNvZGUgYGNhdXNlYCwgYGVycm9yc2AuKi9cbi8qIG5lc3RlZCBub24tcGFzc2FibGUgZXJyb3JzIG11c3QgYmUgb2sgZnJvbSBoZXJlLiovXG5pZihlcnJvclRhZ2dpbmc9PT0nb24nKXtcbi8qIFdlIGRlbGliZXJhdGVseSBkbyBub3Qgc2hhcmUgdGhlIHN0YWNrLCBidXQgaXQgd291bGQqL1xuLyogYmUgdXNlZnVsIHRvIGxvZyB0aGUgc3RhY2sgbG9jYWxseSBzbyBzb21lb25lIHdobyBoYXMqL1xuLyogcHJpdmlsZWdlZCBhY2Nlc3MgdG8gdGhlIHRocm93aW5nIFZhdCBjYW4gY29ycmVsYXRlKi9cbi8qIHRoZSBwcm9ibGVtIHdpdGggdGhlIHJlbW90ZSBWYXQgdGhhdCBnZXRzIHRoaXMqL1xuLyogc3VtbWFyeS4gSWYgd2UgZG8gdGhhdCwgd2UgY291bGQgYWxsb2NhdGUgc29tZSByYW5kb20qL1xuLyogaWRlbnRpZmllciBhbmQgaW5jbHVkZSBpdCBpbiB0aGUgbWVzc2FnZSwgdG8gaGVscCovXG4vKiB3aXRoIHRoZSBjb3JyZWxhdGlvbi4qL1xuY29uc3QgZXJyb3JJZD1lbmNvZGVSZWN1cihuZXh0RXJyb3JJZCgpKTtcbmFzc2VydC50eXBlb2YoZXJyb3JJZCwnc3RyaW5nJyk7XG5hc3NlcnQubm90ZShlcnIsWCBgU2VudCBhcyAke2Vycm9ySWR9YCk7XG5tYXJzaGFsU2F2ZUVycm9yKGVycik7XG5yZXR1cm4gaGFyZGVuKHtlcnJvcklkLG1lc3NhZ2UsbmFtZX0pO1xuIH1lbHNle1xucmV0dXJuIGhhcmRlbih7bWVzc2FnZSxuYW1lfSk7XG4gfVxuIH07XG5cbmlmKHNlcmlhbGl6ZUJvZHlGb3JtYXQ9PT0nY2FwZGF0YScpe1xuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBwYXNzYWJsZVxuICogQHBhcmFtIHtJbnRlcmZhY2VTcGVjfSBbaWZhY2VdXG4gKiBAcmV0dXJucyB7RW5jb2Rpbmd9XG4gKi9cbmNvbnN0IGVuY29kZVNsb3RUb0NhcERhdGE9KHBhc3NhYmxlLGlmYWNlPXVuZGVmaW5lZCk9PntcbmNvbnN0e2luZGV4LHJlcGVhdH09ZW5jb2RlU2xvdENvbW1vbihwYXNzYWJsZSk7XG5cbmlmKHJlcGVhdD09PXRydWV8fGlmYWNlPT09dW5kZWZpbmVkKXtcbnJldHVybiBoYXJkZW4oe1tRQ0xBU1NdOidzbG90JyxpbmRleH0pO1xuIH1lbHNle1xucmV0dXJuIGhhcmRlbih7W1FDTEFTU106J3Nsb3QnLGlmYWNlLGluZGV4fSk7XG4gfVxuIH07XG5cbmNvbnN0IGVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YT0odmFsLF9lbmNvZGVSZWN1cik9PlxuZW5jb2RlU2xvdFRvQ2FwRGF0YSh2YWwsZ2V0SW50ZXJmYWNlT2YodmFsKSk7XG5cbmNvbnN0IGVuY29kZVByb21pc2VUb0NhcERhdGE9KHByb21pc2UsX2VuY29kZVJlY3VyKT0+XG5lbmNvZGVTbG90VG9DYXBEYXRhKHByb21pc2UpO1xuXG4vKipcbiAqIEV2ZW4gaWYgYW4gRXJyb3IgaXMgbm90IGFjdHVhbGx5IHBhc3NhYmxlLCB3ZSdkIHJhdGhlciBzZW5kXG4gKiBpdCBhbnl3YXkgYmVjYXVzZSB0aGUgZGlhZ25vc3RpYyBpbmZvIGNhcnJpZWQgYnkgdGhlIGVycm9yXG4gKiBpcyBtb3JlIHZhbHVhYmxlIHRoYW4gZGlhZ25vc2luZyB3aHkgdGhlIGVycm9yIGlzbid0XG4gKiBwYXNzYWJsZS4gU2VlIGNvbW1lbnRzIGluIEVycm9ySGVscGVyLlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IGVyclxuICogQHBhcmFtIHsocDogUGFzc2FibGUpID0+IEVuY29kaW5nfSBlbmNvZGVSZWN1clxuICogQHJldHVybnMge0VuY29kaW5nfVxuICovXG5jb25zdCBlbmNvZGVFcnJvclRvQ2FwRGF0YT0oZXJyLGVuY29kZVJlY3VyKT0+e1xuY29uc3QgZXJyRGF0YT1lbmNvZGVFcnJvckNvbW1vbihlcnIsZW5jb2RlUmVjdXIpO1xucmV0dXJuIGhhcmRlbih7W1FDTEFTU106J2Vycm9yJywuLi5lcnJEYXRhfSk7XG4gfTtcblxuY29uc3QgZW5jb2RlVG9DYXBEYXRhPW1ha2VFbmNvZGVUb0NhcERhdGEoe1xuZW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhLFxuZW5jb2RlUHJvbWlzZVRvQ2FwRGF0YSxcbmVuY29kZUVycm9yVG9DYXBEYXRhfSk7XG5cblxuY29uc3QgZW5jb2RlZD1lbmNvZGVUb0NhcERhdGEocm9vdCk7XG5jb25zdCBib2R5PUpTT04uc3RyaW5naWZ5KGVuY29kZWQpO1xucmV0dXJuIGhhcmRlbih7XG5ib2R5LFxuc2xvdHN9KTtcblxuIH1lbHNlIGlmKHNlcmlhbGl6ZUJvZHlGb3JtYXQ9PT0nc21hbGxjYXBzJyl7XG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcmVmaXhcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHBhc3NhYmxlXG4gKiBAcGFyYW0ge0ludGVyZmFjZVNwZWN9IFtpZmFjZV1cbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IGVuY29kZVNsb3RUb1NtYWxsY2Fwcz0ocHJlZml4LHBhc3NhYmxlLGlmYWNlPXVuZGVmaW5lZCk9PntcbmNvbnN0e2luZGV4LHJlcGVhdH09ZW5jb2RlU2xvdENvbW1vbihwYXNzYWJsZSk7XG5cbi8qIFRPRE8gZXhwbG9yZSByZW1vdmluZyB0aGlzIHNwZWNpYWwgY2FzZSovXG5pZihyZXBlYXQ9PT10cnVlfHxpZmFjZT09PXVuZGVmaW5lZCl7XG5yZXR1cm4gYCR7cHJlZml4fSR7aW5kZXh9YDtcbiB9XG5yZXR1cm4gYCR7cHJlZml4fSR7aW5kZXh9LiR7aWZhY2V9YDtcbiB9O1xuXG5jb25zdCBlbmNvZGVSZW1vdGFibGVUb1NtYWxsY2Fwcz0ocmVtb3RhYmxlLF9lbmNvZGVSZWN1cik9PlxuZW5jb2RlU2xvdFRvU21hbGxjYXBzKCckJyxyZW1vdGFibGUsZ2V0SW50ZXJmYWNlT2YocmVtb3RhYmxlKSk7XG5cbmNvbnN0IGVuY29kZVByb21pc2VUb1NtYWxsY2Fwcz0ocHJvbWlzZSxfZW5jb2RlUmVjdXIpPT5cbmVuY29kZVNsb3RUb1NtYWxsY2FwcygnJicscHJvbWlzZSk7XG5cbmNvbnN0IGVuY29kZUVycm9yVG9TbWFsbGNhcHM9KGVycixlbmNvZGVSZWN1cik9PntcbmNvbnN0IGVyckRhdGE9ZW5jb2RlRXJyb3JDb21tb24oZXJyLGVuY29kZVJlY3VyKTtcbmNvbnN0e21lc3NhZ2UsLi4ucmVzdH09ZXJyRGF0YTtcbnJldHVybiBoYXJkZW4oeycjZXJyb3InOm1lc3NhZ2UsLi4ucmVzdH0pO1xuIH07XG5cbmNvbnN0IGVuY29kZVRvU21hbGxjYXBzPW1ha2VFbmNvZGVUb1NtYWxsY2Fwcyh7XG5lbmNvZGVSZW1vdGFibGVUb1NtYWxsY2FwcyxcbmVuY29kZVByb21pc2VUb1NtYWxsY2FwcyxcbmVuY29kZUVycm9yVG9TbWFsbGNhcHN9KTtcblxuXG5jb25zdCBlbmNvZGVkPWVuY29kZVRvU21hbGxjYXBzKHJvb3QpO1xuY29uc3Qgc21hbGxjYXBzQm9keT1KU09OLnN0cmluZ2lmeShlbmNvZGVkKTtcbnJldHVybiBoYXJkZW4oe1xuLyogVmFsaWQgSlNPTiBjYW5ub3QgYmVnaW4gd2l0aCBhICcjJywgc28gdGhpcyBpcyBhIHZhbGlkIHNpZ25hbCovXG4vKiBpbmRpY2F0aW5nIHNtYWxsY2FwcyBmb3JtYXQuKi9cbmJvZHk6IGAjJHtzbWFsbGNhcHNCb2R5fWAsXG5zbG90c30pO1xuXG4gfWVsc2V7XG4vKiBUaGUgYHRocm93YCBpcyBhIG5vb3Agc2luY2UgYEZhaWxgIHRocm93cy4gQWRkZWQgZm9yIGNvbmZ1c2VkIGxpbnRlcnMuKi9cbnRocm93IEZhaWwgYFVucmVjb2duaXplZCBzZXJpYWxpemVCb2R5Rm9ybWF0OiAke3Eoc2VyaWFsaXplQm9keUZvcm1hdCl9YDtcbiB9XG4gfTtcblxuY29uc3QgbWFrZUZ1bGxSZXZpdmU9KHNsb3RzKT0+e1xuLyoqIEB0eXBlIHtNYXA8bnVtYmVyLCBQYXNzYWJsZT59ICovXG5jb25zdCB2YWxNYXA9bmV3IE1hcCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7e2lmYWNlPzogc3RyaW5nLCBpbmRleDogbnVtYmVyfX0gc2xvdERhdGFcbiAqIEByZXR1cm5zIHtSZW1vdGFibGUgfCBQcm9taXNlfVxuICovXG5jb25zdCBkZWNvZGVTbG90Q29tbW9uPShzbG90RGF0YSk9PntcbmNvbnN0e2lmYWNlPXVuZGVmaW5lZCxpbmRleCwuLi5yZXN0fT1zbG90RGF0YTtcbm93bktleXMocmVzdCkubGVuZ3RoPT09MHx8XG5GYWlsIGB1bmV4cGVjdGVkIGVuY29kZWQgc2xvdCBwcm9wZXJ0aWVzICR7cShvd25LZXlzKHJlc3QpKX1gO1xuaWYodmFsTWFwLmhhcyhpbmRleCkpe1xucmV0dXJuIHZhbE1hcC5nZXQoaW5kZXgpO1xuIH1cbi8qIFRPRE8gU0VDVVJJVFkgSEFaQVJEOiBtdXN0IGVuZm9jZSB0aGF0IHJlbW90YWJsZSB2cyBwcm9taXNlKi9cbi8qIGlzIGFjY29yZGluZyB0byB0aGUgZW5jb2RlZCBzdHJpbmcuKi9cbmNvbnN0IHNsb3Q9c2xvdHNbTnVtYmVyKE5hdChpbmRleCkpXTtcbmNvbnN0IHZhbD1jb252ZXJ0U2xvdFRvVmFsKHNsb3QsaWZhY2UpO1xudmFsTWFwLnNldChpbmRleCx2YWwpO1xucmV0dXJuIHZhbDtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7e2Vycm9ySWQ/OiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZywgbmFtZTogc3RyaW5nfX0gZXJyRGF0YVxuICogQHBhcmFtIHsoZTogdW5rbm93bikgPT4gUGFzc2FibGV9IGRlY29kZVJlY3VyXG4gKiBAcmV0dXJucyB7RXJyb3J9XG4gKi9cbmNvbnN0IGRlY29kZUVycm9yQ29tbW9uPShlcnJEYXRhLGRlY29kZVJlY3VyKT0+e1xuY29uc3R7ZXJyb3JJZD11bmRlZmluZWQsbWVzc2FnZSxuYW1lLC4uLnJlc3R9PWVyckRhdGE7XG5vd25LZXlzKHJlc3QpLmxlbmd0aD09PTB8fFxuRmFpbCBgdW5leHBlY3RlZCBlbmNvZGVkIGVycm9yIHByb3BlcnRpZXMgJHtxKG93bktleXMocmVzdCkpfWA7XG4vKiBUT0RPIE11c3QgZGVjb2RlIGBjYXVzZWAgYW5kIGBlcnJvcnNgIHByb3BlcnRpZXMqL1xuLyogY2FwRGF0YSBkb2VzIG5vdCB0cmFuc2Zvcm0gc3RyaW5ncy4gVGhlIGNhbGxzIHRvIGBkZWNvZGVSZWN1cmAqL1xuLyogYXJlIGZvciByZXVzZSBieSBvdGhlciBlbmNvZGluZ3MgdGhhdCBkbywgc3VjaCBhcyBzbWFsbGNhcHMuKi9cbmNvbnN0IGROYW1lPWRlY29kZVJlY3VyKG5hbWUpO1xuY29uc3QgZE1lc3NhZ2U9ZGVjb2RlUmVjdXIobWVzc2FnZSk7XG5jb25zdCBkRXJyb3JJZD1lcnJvcklkJiZkZWNvZGVSZWN1cihlcnJvcklkKTtcbnR5cGVvZiBkTmFtZT09PSdzdHJpbmcnfHxcbkZhaWwgYGludmFsaWQgZXJyb3IgbmFtZSB0eXBlb2YgJHtxKHR5cGVvZiBkTmFtZSl9YDtcbnR5cGVvZiBkTWVzc2FnZT09PSdzdHJpbmcnfHxcbkZhaWwgYGludmFsaWQgZXJyb3IgbWVzc2FnZSB0eXBlb2YgJHtxKHR5cGVvZiBkTWVzc2FnZSl9YDtcbmNvbnN0IEVDPWdldEVycm9yQ29uc3RydWN0b3IoZE5hbWUpfHxFcnJvcjtcbi8qIGVycm9ySWQgaXMgYSBsYXRlIGFkZGl0aW9uIHNvIGJlIHRvbGVyYW50IG9mIGl0cyBhYnNlbmNlLiovXG5jb25zdCBlcnJvck5hbWU9XG5kRXJyb3JJZD09PXVuZGVmaW5lZD9cbiBgUmVtb3RlJHtFQy5uYW1lfWA6XG4gYFJlbW90ZSR7RUMubmFtZX0oJHtkRXJyb3JJZH0pYDtcbmNvbnN0IGVycm9yPWFzc2VydC5lcnJvcihkTWVzc2FnZSxFQyx7ZXJyb3JOYW1lfSk7XG5yZXR1cm4gaGFyZGVuKGVycm9yKTtcbiB9O1xuXG4vKiBUaGUgY3VycmVudCBlbmNvZGluZyBkb2VzIG5vdCBnaXZlIHRoZSBkZWNvZGVyIGVub3VnaCBpbnRvIHRvIGRpc3Rpbmd1aXNoKi9cbi8qIHdoZXRoZXIgYSBzbG90IHJlcHJlc2VudHMgYSBwcm9taXNlIG9yIGEgcmVtb3RhYmxlLiBBcyBhbiBpbXBsZW1lbnRhdGlvbiovXG4vKiByZXN0cmljdGlvbiB1bnRpbCB0aGlzIGlzIGZpeGVkLCBpZiBlaXRoZXIgaXMgcHJvdmlkZWQsIGJvdGggbXVzdCBiZSovXG4vKiBwcm92aWRlZCBhbmQgdGhleSBtdXN0IGJlIHRoZSBzYW1lLiovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80MzM0Ki9cbmNvbnN0IGRlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhPShyYXdUcmVlLF9kZWNvZGVSZWN1cik9PntcbmNvbnN0e1tRQ0xBU1NdOl8sLi4uc2xvdERhdGF9PXJhd1RyZWU7XG5yZXR1cm4gZGVjb2RlU2xvdENvbW1vbihzbG90RGF0YSk7XG4gfTtcblxuY29uc3QgZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YT0ocmF3VHJlZSxkZWNvZGVSZWN1cik9PntcbmNvbnN0e1tRQ0xBU1NdOl8sLi4uZXJyRGF0YX09cmF3VHJlZTtcbnJldHVybiBkZWNvZGVFcnJvckNvbW1vbihlcnJEYXRhLGRlY29kZVJlY3VyKTtcbiB9O1xuXG5jb25zdCByZXZpdmVGcm9tQ2FwRGF0YT1tYWtlRGVjb2RlRnJvbUNhcERhdGEoe1xuZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGE6ZGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGEsXG5kZWNvZGVQcm9taXNlRnJvbUNhcERhdGE6ZGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGEsXG5kZWNvZGVFcnJvckZyb21DYXBEYXRhfSk7XG5cblxuY29uc3QgbWFrZURlY29kZVNsb3RGcm9tU21hbGxjYXBzPShwcmVmaXgpPT57XG5yZXR1cm4oc3RyaW5nRW5jb2RpbmcsX2RlY29kZVJlY3VyKT0+e1xuYXNzZXJ0KHN0cmluZ0VuY29kaW5nLnN0YXJ0c1dpdGgocHJlZml4KSk7XG4vKiBzbG90czogJHNsb3RJbmRleC5pZmFjZSBvciAkc2xvdEluZGV4Ki9cbmNvbnN0IGk9c3RyaW5nRW5jb2RpbmcuaW5kZXhPZignLicpO1xuY29uc3QgaW5kZXg9TnVtYmVyKHN0cmluZ0VuY29kaW5nLnNsaWNlKDEsaTwwP3VuZGVmaW5lZDppKSk7XG4vKiBpIDwgMCBtZWFucyB0aGVyZSB3YXMgbm8gaWZhY2UgaW5jbHVkZWQuKi9cbmNvbnN0IGlmYWNlPWk8MD91bmRlZmluZWQ6c3RyaW5nRW5jb2Rpbmcuc2xpY2UoaSsxKTtcbnJldHVybiBkZWNvZGVTbG90Q29tbW9uKHtpZmFjZSxpbmRleH0pO1xuIH07XG4gfTtcbmNvbnN0IGRlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHM9bWFrZURlY29kZVNsb3RGcm9tU21hbGxjYXBzKCckJyk7XG5jb25zdCBkZWNvZGVQcm9taXNlRnJvbVNtYWxsY2Fwcz1tYWtlRGVjb2RlU2xvdEZyb21TbWFsbGNhcHMoJyYnKTtcblxuY29uc3QgZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzPShlbmNvZGluZyxkZWNvZGVSZWN1cik9PntcbmNvbnN0eycjZXJyb3InOm1lc3NhZ2UsLi4ucmVzdEVyckRhdGF9PWVuY29kaW5nO1xuIWhhc093blByb3BlcnR5T2YocmVzdEVyckRhdGEsJ21lc3NhZ2UnKXx8XG5GYWlsIGB1bmV4cGVjdGVkIGVuY29kZWQgZXJyb3IgcHJvcGVydHkgJHtxKCdtZXNzYWdlJyl9YDtcbnJldHVybiBkZWNvZGVFcnJvckNvbW1vbih7bWVzc2FnZSwuLi5yZXN0RXJyRGF0YX0sZGVjb2RlUmVjdXIpO1xuIH07XG5cbmNvbnN0IHJldml2ZUZyb21TbWFsbGNhcHM9bWFrZURlY29kZUZyb21TbWFsbGNhcHMoe1xuZGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2FwcyxcbmRlY29kZVByb21pc2VGcm9tU21hbGxjYXBzLFxuZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzfSk7XG5cblxucmV0dXJuIGhhcmRlbih7cmV2aXZlRnJvbUNhcERhdGEscmV2aXZlRnJvbVNtYWxsY2Fwc30pO1xuIH07XG5cbi8qKlxuICogQHR5cGUge1Vuc2VyaWFsaXplPFNsb3Q+fVxuICovXG5jb25zdCB1bnNlcmlhbGl6ZT0oZGF0YSk9PntcbmNvbnN0e2JvZHksc2xvdHN9PWRhdGE7XG50eXBlb2YgYm9keT09PSdzdHJpbmcnfHxcbkZhaWwgYHVuc2VyaWFsaXplKCkgZ2l2ZW4gbm9uLWNhcGRhdGEgKC5ib2R5IGlzICR7Ym9keX0sIG5vdCBzdHJpbmcpYDtcbmlzQXJyYXkoZGF0YS5zbG90cyl8fFxuRmFpbCBgdW5zZXJpYWxpemUoKSBnaXZlbiBub24tY2FwZGF0YSAoLnNsb3RzIGFyZSBub3QgQXJyYXkpYDtcbmNvbnN0e3Jldml2ZUZyb21DYXBEYXRhLHJldml2ZUZyb21TbWFsbGNhcHN9PW1ha2VGdWxsUmV2aXZlKHNsb3RzKTtcbmxldCByZXN1bHQ7XG4vKiBKU09OIGNhbm5vdCBiZWdpbiB3aXRoIGEgJyMnLCBzbyB0aGlzIGlzIGFuIHVuYW1iaWd1b3VzIHNpZ25hbC4qL1xuaWYoYm9keS5zdGFydHNXaXRoKCcjJykpe1xuY29uc3Qgc21hbGxjYXBzQm9keT1ib2R5LnNsaWNlKDEpO1xuY29uc3QgZW5jb2Rpbmc9aGFyZGVuKEpTT04ucGFyc2Uoc21hbGxjYXBzQm9keSkpO1xucmVzdWx0PWhhcmRlbihyZXZpdmVGcm9tU21hbGxjYXBzKGVuY29kaW5nKSk7XG4gfWVsc2V7XG5jb25zdCByYXdUcmVlPWhhcmRlbihKU09OLnBhcnNlKGJvZHkpKTtcbnJlc3VsdD1oYXJkZW4ocmV2aXZlRnJvbUNhcERhdGEocmF3VHJlZSkpO1xuIH1cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQzMzcqL1xuLyogd2hpY2ggc2hvdWxkIGJlIGNvbnNpZGVyZWQgZml4ZWQgb25jZSB3ZSd2ZSBjb21wbGV0ZWQgdGhlIHN3aXRjaCovXG4vKiB0byBzbWFsbGNhcHMuKi9cbmFzc2VydFBhc3NhYmxlKHJlc3VsdCk7XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbnJldHVybiBoYXJkZW4oe1xuc2VyaWFsaXplLFxudW5zZXJpYWxpemV9KTtcblxuIH07JGjigI1fb25jZS5tYWtlTWFyc2hhbChtYWtlTWFyc2hhbCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZU1hcnNoYWwiOlsibWFrZU1hcnNoYWwiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAQWezeQIcAAACHAAAJwAAAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9wYXNzU3R5bGVPZi5qc3siaW1wb3J0cyI6WyIuL2hlbHBlcnMvY29weUFycmF5LmpzIiwiLi9oZWxwZXJzL2NvcHlSZWNvcmQuanMiLCIuL2hlbHBlcnMvZXJyb3IuanMiLCIuL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanMiLCIuL2hlbHBlcnMvcmVtb3RhYmxlLmpzIiwiLi9oZWxwZXJzL3NhZmUtcHJvbWlzZS5qcyIsIi4vaGVscGVycy9zeW1ib2wuanMiLCIuL2hlbHBlcnMvdGFnZ2VkLmpzIiwiQGVuZG8vcHJvbWlzZS1raXQiXSwiZXhwb3J0cyI6WyJhc3NlcnRQYXNzYWJsZSIsInBhc3NTdHlsZU9mIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGlzUHJvbWlzZSxpc09iamVjdCxpc1R5cGVkQXJyYXksUEFTU19TVFlMRSxDb3B5QXJyYXlIZWxwZXIsQ29weVJlY29yZEhlbHBlcixUYWdnZWRIZWxwZXIsRXJyb3JIZWxwZXIsUmVtb3RhYmxlSGVscGVyLGFzc2VydFBhc3NhYmxlU3ltYm9sLGFzc2VydFNhZmVQcm9taXNlOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJpc1Byb21pc2VcIiwgWyRo4oCNX2EgPT4gKGlzUHJvbWlzZSA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImlzT2JqZWN0XCIsIFskaOKAjV9hID0+IChpc09iamVjdCA9ICRo4oCNX2EpXV0sW1wiaXNUeXBlZEFycmF5XCIsIFskaOKAjV9hID0+IChpc1R5cGVkQXJyYXkgPSAkaOKAjV9hKV1dLFtcIlBBU1NfU1RZTEVcIiwgWyRo4oCNX2EgPT4gKFBBU1NfU1RZTEUgPSAkaOKAjV9hKV1dXV0sW1wiLi9oZWxwZXJzL2NvcHlBcnJheS5qc1wiLCBbW1wiQ29weUFycmF5SGVscGVyXCIsIFskaOKAjV9hID0+IChDb3B5QXJyYXlIZWxwZXIgPSAkaOKAjV9hKV1dXV0sW1wiLi9oZWxwZXJzL2NvcHlSZWNvcmQuanNcIiwgW1tcIkNvcHlSZWNvcmRIZWxwZXJcIiwgWyRo4oCNX2EgPT4gKENvcHlSZWNvcmRIZWxwZXIgPSAkaOKAjV9hKV1dXV0sW1wiLi9oZWxwZXJzL3RhZ2dlZC5qc1wiLCBbW1wiVGFnZ2VkSGVscGVyXCIsIFskaOKAjV9hID0+IChUYWdnZWRIZWxwZXIgPSAkaOKAjV9hKV1dXV0sW1wiLi9oZWxwZXJzL2Vycm9yLmpzXCIsIFtbXCJFcnJvckhlbHBlclwiLCBbJGjigI1fYSA9PiAoRXJyb3JIZWxwZXIgPSAkaOKAjV9hKV1dXV0sW1wiLi9oZWxwZXJzL3JlbW90YWJsZS5qc1wiLCBbW1wiUmVtb3RhYmxlSGVscGVyXCIsIFskaOKAjV9hID0+IChSZW1vdGFibGVIZWxwZXIgPSAkaOKAjV9hKV1dXV0sW1wiLi9oZWxwZXJzL3N5bWJvbC5qc1wiLCBbW1wiYXNzZXJ0UGFzc2FibGVTeW1ib2xcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhc3NhYmxlU3ltYm9sID0gJGjigI1fYSldXV1dLFtcIi4vaGVscGVycy9zYWZlLXByb21pc2UuanNcIiwgW1tcImFzc2VydFNhZmVQcm9taXNlXCIsIFskaOKAjV9hID0+IChhc3NlcnRTYWZlUHJvbWlzZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vaGVscGVycy9pbnRlcm5hbC10eXBlcy5qcycpLlBhc3NTdHlsZUhlbHBlcn0gUGFzc1N0eWxlSGVscGVyICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlBhc3NTdHlsZX0gUGFzc1N0eWxlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5QYXNzU3R5bGVPZn0gUGFzc1N0eWxlT2YgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlByaW1pdGl2ZVN0eWxlfSBQcmltaXRpdmVTdHlsZSAqL1xuXG4vKiogQHR5cGVkZWYge0V4Y2x1ZGU8UGFzc1N0eWxlLCBQcmltaXRpdmVTdHlsZSB8IFwicHJvbWlzZVwiPn0gSGVscGVyUGFzc1N0eWxlICovXG5cbmNvbnN0e2RldGFpbHM6WCxGYWlsLHF1b3RlOnF9PWFzc2VydDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtpc0Zyb3plbn09T2JqZWN0O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc1N0eWxlSGVscGVyW119IHBhc3NTdHlsZUhlbHBlcnNcbiAqIEByZXR1cm5zIHtSZWNvcmQ8SGVscGVyUGFzc1N0eWxlLCBQYXNzU3R5bGVIZWxwZXI+IH1cbiAqL1xuXG5jb25zdCBtYWtlSGVscGVyVGFibGU9KHBhc3NTdHlsZUhlbHBlcnMpPT57XG4vKiogQHR5cGUge1JlY29yZDxIZWxwZXJQYXNzU3R5bGUsIGFueT4gJiB7X19wcm90b19fOiBudWxsfX0gKi9cbmNvbnN0IEhlbHBlclRhYmxlPXtcbl9fcHJvdG9fXzpudWxsLFxuY29weUFycmF5OnVuZGVmaW5lZCxcbmNvcHlSZWNvcmQ6dW5kZWZpbmVkLFxudGFnZ2VkOnVuZGVmaW5lZCxcbmVycm9yOnVuZGVmaW5lZCxcbnJlbW90YWJsZTp1bmRlZmluZWR9O1xuXG5mb3IoY29uc3QgaGVscGVyIG9mIHBhc3NTdHlsZUhlbHBlcnMpe1xuY29uc3R7c3R5bGVOYW1lfT1oZWxwZXI7XG5zdHlsZU5hbWUgaW4gSGVscGVyVGFibGV8fEZhaWwgYFVucmVjb2duaXplZCBoZWxwZXI6ICR7cShzdHlsZU5hbWUpfWA7XG5IZWxwZXJUYWJsZVtzdHlsZU5hbWVdPT09dW5kZWZpbmVkfHxcbkZhaWwgYGNvbmZsaWN0aW5nIGhlbHBlcnMgZm9yICR7cShzdHlsZU5hbWUpfWA7XG5IZWxwZXJUYWJsZVtzdHlsZU5hbWVdPWhlbHBlcjtcbiB9XG5mb3IoY29uc3Qgc3R5bGVOYW1lIG9mIG93bktleXMoSGVscGVyVGFibGUpKXtcbkhlbHBlclRhYmxlW3N0eWxlTmFtZV0hPT11bmRlZmluZWR8fFxuRmFpbCBgbWlzc2luZyBoZWxwZXIgZm9yICR7cShzdHlsZU5hbWUpfWA7XG4gfVxuXG5yZXR1cm4gaGFyZGVuKEhlbHBlclRhYmxlKTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc1N0eWxlSGVscGVyW119IHBhc3NTdHlsZUhlbHBlcnMgVGhlIHBhc3NTdHlsZUhlbHBlcnMgdG8gcmVnaXN0ZXIsXG4gKiBpbiBwcmlvcml0eSBvcmRlci5cbiAqIE5PVEUgVGhlc2UgbXVzdCBhbGwgYmUgXCJ0cnVzdGVkXCIsXG4gKiBjb21wbGV0ZSwgYW5kIG5vbi1jb2xsaWRpbmcuIGBtYWtlUGFzc1N0eWxlT2ZgIG1heSAqYXNzdW1lKiB0aGF0IGVhY2ggaGVscGVyXG4gKiBkb2VzIHdoYXQgaXQgaXMgc3VwcG9zZWQgdG8gZG8uIGBtYWtlUGFzc1N0eWxlT2ZgIGlzIG5vdCB0cnlpbmcgdG8gZGVmZW5kXG4gKiBpdHNlbGYgYWdhaW5zdCBtYWxpY2lvdXMgaGVscGVycywgdGhvdWdoIGl0IGRvZXMgZGVmZW5kIGFnYWluc3Qgc29tZVxuICogYWNjaWRlbnRzLlxuICogQHJldHVybnMge1Bhc3NTdHlsZU9mfVxuICovXG5jb25zdCBtYWtlUGFzc1N0eWxlT2Y9KHBhc3NTdHlsZUhlbHBlcnMpPT57XG5jb25zdCBIZWxwZXJUYWJsZT1tYWtlSGVscGVyVGFibGUocGFzc1N0eWxlSGVscGVycyk7XG5jb25zdCByZW1vdGFibGVIZWxwZXI9SGVscGVyVGFibGUucmVtb3RhYmxlO1xuXG4vKipcbiAqIFB1cmVseSBmb3IgcGVyZm9ybWFuY2UuIEhvd2V2ZXIgaXQgaXMgbXV0YWJsZSBzdGF0aWMgc3RhdGUsIGFuZFxuICogaXQgZG9lcyBoYXZlIHNvbWUgb2JzZXJ2YWJpbGl0eSBvbiBwcm94aWVzLiBUT0RPIG5lZWQgdG8gYXNzZXNzXG4gKiB3aGV0aGVyIHRoaXMgY3JlYXRlcyBhIHN0YXRpYyBjb21tdW5pY2F0aW9ucyBjaGFubmVsLlxuICpcbiAqIHBhc3NTdHlsZU9mIGRvZXMgYSBmdWxsIHJlY3Vyc2l2ZSB3YWxrIG9mIHBhc3MtYnktY29weVxuICogc3RydWN0dXJlcywgaW4gb3JkZXIgdG8gdmFsaWRhdGUgdGhhdCB0aGV5IGFyZSBhY3ljbGljLiBJbiBhZGRpdGlvblxuICogaXQgaXMgdXNlZCBieSBvdGhlciBhbGdvcml0aG1zIHRvIHJlY3Vyc2l2ZWx5IHdhbGsgdGhlc2UgcGFzcy1ieS1jb3B5XG4gKiBzdHJ1Y3R1cmVzLCBzbyB3aXRob3V0IHRoaXMgY2FjaGUsIHRoZXNlIGFsZ29yaXRobXMgY291bGQgYmVcbiAqIE8oTioqMikgb3Igd29yc2UuXG4gKlxuICogQHR5cGUge1dlYWtNYXA8UGFzc2FibGUsIFBhc3NTdHlsZT59XG4gKi9cbmNvbnN0IHBhc3NTdHlsZU1lbW89bmV3IFdlYWtNYXAoKTtcblxuLyoqXG4gKiBAdHlwZSB7UGFzc1N0eWxlT2Z9XG4gKi9cbmNvbnN0IHBhc3NTdHlsZU9mPShwYXNzYWJsZSk9Pntcbi8qIEV2ZW4gd2hlbiBhIFdlYWtTZXQgaXMgY29ycmVjdCwgd2hlbiB0aGUgc2V0IGhhcyBhIHNob3J0ZXIgbGlmZXRpbWUqL1xuLyogdGhhbiBpdHMga2V5cywgd2UgcHJlZmVyIGEgU2V0IGR1ZSB0byBleHBlY3RlZCBpbXBsZW1lbnRhdGlvbiovXG4vKiB0cmFkZW9mZnMuKi9cbmNvbnN0IGluUHJvZ3Jlc3M9bmV3IFNldCgpO1xuXG4vKipcbiAqIEB0eXBlIHtQYXNzU3R5bGVPZn1cbiAqL1xuY29uc3QgcGFzc1N0eWxlT2ZSZWN1cj0oaW5uZXIpPT57XG5jb25zdCBpbm5lcklzT2JqZWN0PWlzT2JqZWN0KGlubmVyKTtcbmlmKGlubmVySXNPYmplY3Qpe1xuaWYocGFzc1N0eWxlTWVtby5oYXMoaW5uZXIpKXtcbi8qIEB0cy1pZ25vcmUgVHlwZVNjcmlwdCBkb2Vzbid0IGtub3cgdGhhdCBgZ2V0YCBhZnRlciBgaGFzYCBpcyBzYWZlKi9cbnJldHVybiBwYXNzU3R5bGVNZW1vLmdldChpbm5lcik7XG4gfVxuIWluUHJvZ3Jlc3MuaGFzKGlubmVyKXx8XG5GYWlsIGBQYXNzLWJ5LWNvcHkgZGF0YSBjYW5ub3QgYmUgY3ljbGljICR7aW5uZXJ9YDtcbmluUHJvZ3Jlc3MuYWRkKGlubmVyKTtcbiB9XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mSW50ZXJuYWwoaW5uZXIpO1xuaWYoaW5uZXJJc09iamVjdCl7XG5wYXNzU3R5bGVNZW1vLnNldChpbm5lcixwYXNzU3R5bGUpO1xuaW5Qcm9ncmVzcy5kZWxldGUoaW5uZXIpO1xuIH1cbnJldHVybiBwYXNzU3R5bGU7XG4gfTtcblxuLyoqXG4gKiBAdHlwZSB7UGFzc1N0eWxlT2Z9XG4gKi9cbmNvbnN0IHBhc3NTdHlsZU9mSW50ZXJuYWw9KGlubmVyKT0+e1xuY29uc3QgdHlwZXN0cj10eXBlb2YgaW5uZXI7XG5zd2l0Y2godHlwZXN0cil7XG5jYXNlJ3VuZGVmaW5lZCc6XG5jYXNlJ3N0cmluZyc6XG5jYXNlJ2Jvb2xlYW4nOlxuY2FzZSdudW1iZXInOlxuY2FzZSdiaWdpbnQnOntcbnJldHVybiB0eXBlc3RyO1xuIH1cbmNhc2Unc3ltYm9sJzp7XG5hc3NlcnRQYXNzYWJsZVN5bWJvbChpbm5lcik7XG5yZXR1cm4nc3ltYm9sJztcbiB9XG5jYXNlJ29iamVjdCc6e1xuaWYoaW5uZXI9PT1udWxsKXtcbnJldHVybidudWxsJztcbiB9XG5pZighaXNGcm96ZW4oaW5uZXIpKXtcbmFzc2VydC5mYWlsKFxuLyogVHlwZWRBcnJheXMgZ2V0IHNwZWNpYWwgdHJlYXRtZW50IGluIGhhcmRlbigpKi9cbi8qIGFuZCBhIGNvcnJlc3BvbmRpbmcgc3BlY2lhbCBlcnJvciBtZXNzYWdlIGhlcmUuKi9cbmlzVHlwZWRBcnJheShpbm5lcik/XG5YIGBDYW5ub3QgcGFzcyBtdXRhYmxlIHR5cGVkIGFycmF5cyBsaWtlICR7aW5uZXJ9LmA6XG5YIGBDYW5ub3QgcGFzcyBub24tZnJvemVuIG9iamVjdHMgbGlrZSAke2lubmVyfS4gVXNlIGhhcmRlbigpYCk7XG5cbiB9XG5pZihpc1Byb21pc2UoaW5uZXIpKXtcbmFzc2VydFNhZmVQcm9taXNlKGlubmVyKTtcbnJldHVybidwcm9taXNlJztcbiB9XG50eXBlb2YgaW5uZXIudGhlbiE9PSdmdW5jdGlvbid8fFxuRmFpbCBgQ2Fubm90IHBhc3Mgbm9uLXByb21pc2UgdGhlbmFibGVzYDtcbmNvbnN0IHBhc3NTdHlsZVRhZz1pbm5lcltQQVNTX1NUWUxFXTtcbmlmKHBhc3NTdHlsZVRhZyE9PXVuZGVmaW5lZCl7XG5hc3NlcnQudHlwZW9mKHBhc3NTdHlsZVRhZywnc3RyaW5nJyk7XG5jb25zdCBoZWxwZXI9SGVscGVyVGFibGVbcGFzc1N0eWxlVGFnXTtcbmhlbHBlciE9PXVuZGVmaW5lZHx8XG5GYWlsIGBVbnJlY29nbml6ZWQgUGFzc1N0eWxlOiAke3EocGFzc1N0eWxlVGFnKX1gO1xuaGVscGVyLmFzc2VydFZhbGlkKGlubmVyLHBhc3NTdHlsZU9mUmVjdXIpO1xucmV0dXJuICgvKiogQHR5cGUge1Bhc3NTdHlsZX0gKi9wYXNzU3R5bGVUYWcpO1xuIH1cbmZvcihjb25zdCBoZWxwZXIgb2YgcGFzc1N0eWxlSGVscGVycyl7XG5pZihoZWxwZXIuY2FuQmVWYWxpZChpbm5lcikpe1xuaGVscGVyLmFzc2VydFZhbGlkKGlubmVyLHBhc3NTdHlsZU9mUmVjdXIpO1xucmV0dXJuIGhlbHBlci5zdHlsZU5hbWU7XG4gfVxuIH1cbnJlbW90YWJsZUhlbHBlci5hc3NlcnRWYWxpZChpbm5lcixwYXNzU3R5bGVPZlJlY3VyKTtcbnJldHVybidyZW1vdGFibGUnO1xuIH1cbmNhc2UnZnVuY3Rpb24nOntcbmlzRnJvemVuKGlubmVyKXx8XG5GYWlsIGBDYW5ub3QgcGFzcyBub24tZnJvemVuIG9iamVjdHMgbGlrZSAke2lubmVyfS4gVXNlIGhhcmRlbigpYDtcbnR5cGVvZiBpbm5lci50aGVuIT09J2Z1bmN0aW9uJ3x8XG5GYWlsIGBDYW5ub3QgcGFzcyBub24tcHJvbWlzZSB0aGVuYWJsZXNgO1xucmVtb3RhYmxlSGVscGVyLmFzc2VydFZhbGlkKGlubmVyLHBhc3NTdHlsZU9mUmVjdXIpO1xucmV0dXJuJ3JlbW90YWJsZSc7XG4gfVxuZGVmYXVsdDp7XG5hc3NlcnQuZmFpbChYIGBVbnJlY29nbml6ZWQgdHlwZW9mICR7cSh0eXBlc3RyKX1gLFR5cGVFcnJvcik7XG4gfX1cblxuIH07XG5cbnJldHVybiBwYXNzU3R5bGVPZlJlY3VyKHBhc3NhYmxlKTtcbiB9O1xucmV0dXJuIGhhcmRlbihwYXNzU3R5bGVPZik7XG4gfTtcblxuY29uc3QgICAgICAgIHBhc3NTdHlsZU9mPW1ha2VQYXNzU3R5bGVPZihbXG5Db3B5QXJyYXlIZWxwZXIsXG5Db3B5UmVjb3JkSGVscGVyLFxuVGFnZ2VkSGVscGVyLFxuRXJyb3JIZWxwZXIsXG5SZW1vdGFibGVIZWxwZXJdKTskaOKAjV9vbmNlLnBhc3NTdHlsZU9mKHBhc3NTdHlsZU9mKTtcblxuXG5jb25zdCAgICAgICAgYXNzZXJ0UGFzc2FibGU9KHZhbCk9PntcbnBhc3NTdHlsZU9mKHZhbCk7LyogdGhyb3dzIGlmIHZhbCBpcyBub3QgYSBwYXNzYWJsZSovXG4gfTskaOKAjV9vbmNlLmFzc2VydFBhc3NhYmxlKGFzc2VydFBhc3NhYmxlKTtcbmhhcmRlbihhc3NlcnRQYXNzYWJsZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicGFzc1N0eWxlT2YiOlsicGFzc1N0eWxlT2YiXSwiYXNzZXJ0UGFzc2FibGUiOlsiYXNzZXJ0UGFzc2FibGUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAgjnZkwMNAAADDQAAJgAAAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy90eXBlR3VhcmRzLmpzeyJpbXBvcnRzIjpbIi4vcGFzc1N0eWxlT2YuanMiXSwiZXhwb3J0cyI6WyJhc3NlcnRDb3B5QXJyYXkiLCJhc3NlcnRSZWNvcmQiLCJhc3NlcnRSZW1vdGFibGUiLCJpc0NvcHlBcnJheSIsImlzUmVjb3JkIiwiaXNSZW1vdGFibGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgcGFzc1N0eWxlT2Y7JGjigI1faW1wb3J0cyhbW1wiLi9wYXNzU3R5bGVPZi5qc1wiLCBbW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cbi8qKiBAdGVtcGxhdGUgVCBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkNvcHlBcnJheTxUPn0gQ29weUFycmF5ICovXG4vKiogQHRlbXBsYXRlIFQgQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5Db3B5UmVjb3JkPFQ+fSBDb3B5UmVjb3JkICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5SZW1vdGFibGV9IFJlbW90YWJsZSAqL1xuXG5jb25zdHtGYWlsLHF1b3RlOnF9PWFzc2VydDtcblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIHRoZSBhcmd1bWVudCBpcyBhIHBhc3MtYnktY29weSBhcnJheSwgQUtBIGEgXCJjb3B5QXJyYXlcIlxuICogaW4gQGVuZG8vbWFyc2hhbCB0ZXJtc1xuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGFycmF5XG4gKiBAcmV0dXJucyB7YXJyYXkgaXMgQ29weUFycmF5PGFueT59XG4gKi9cbmNvbnN0IGlzQ29weUFycmF5PShhcnJheSk9PnBhc3NTdHlsZU9mKGFycmF5KT09PSdjb3B5QXJyYXknOyRo4oCNX29uY2UuaXNDb3B5QXJyYXkoaXNDb3B5QXJyYXkpO1xuaGFyZGVuKGlzQ29weUFycmF5KTtcblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIHRoZSBhcmd1bWVudCBpcyBhIHBhc3MtYnktY29weSByZWNvcmQsIEFLQSBhXG4gKiBcImNvcHlSZWNvcmRcIiBpbiBAZW5kby9tYXJzaGFsIHRlcm1zXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gcmVjb3JkXG4gKiBAcmV0dXJucyB7cmVjb3JkIGlzIENvcHlSZWNvcmQ8YW55Pn1cbiAqL1xuY29uc3QgaXNSZWNvcmQ9KHJlY29yZCk9PnBhc3NTdHlsZU9mKHJlY29yZCk9PT0nY29weVJlY29yZCc7JGjigI1fb25jZS5pc1JlY29yZChpc1JlY29yZCk7XG5oYXJkZW4oaXNSZWNvcmQpO1xuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgdGhlIGFyZ3VtZW50IGlzIGEgcmVtb3RhYmxlLlxuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHJlbW90YWJsZVxuICogQHJldHVybnMge3JlbW90YWJsZSBpcyBSZW1vdGFibGV9XG4gKi9cbmNvbnN0IGlzUmVtb3RhYmxlPShyZW1vdGFibGUpPT5wYXNzU3R5bGVPZihyZW1vdGFibGUpPT09J3JlbW90YWJsZSc7JGjigI1fb25jZS5pc1JlbW90YWJsZShpc1JlbW90YWJsZSk7XG5oYXJkZW4oaXNSZW1vdGFibGUpO1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRBcnJheVxuICogQHBhcmFtIHtQYXNzYWJsZX0gYXJyYXlcbiAqIEBwYXJhbSB7c3RyaW5nPX0gb3B0TmFtZU9mQXJyYXlcbiAqIEByZXR1cm5zIHthc3NlcnRzIGFycmF5IGlzIENvcHlBcnJheTxhbnk+fVxuICovXG5cbi8qKiBAdHlwZSB7QXNzZXJ0QXJyYXl9ICovXG5jb25zdCBhc3NlcnRDb3B5QXJyYXk9KGFycmF5LG9wdE5hbWVPZkFycmF5PSdBbGxlZ2VkIGFycmF5Jyk9PntcbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihhcnJheSk7XG5wYXNzU3R5bGU9PT0nY29weUFycmF5J3x8XG5GYWlsIGAke3Eob3B0TmFtZU9mQXJyYXkpfSAke2FycmF5fSBtdXN0IGJlIGEgcGFzcy1ieS1jb3B5IGFycmF5LCBub3QgJHtxKFxucGFzc1N0eWxlKVxuIH1gO1xuIH07JGjigI1fb25jZS5hc3NlcnRDb3B5QXJyYXkoYXNzZXJ0Q29weUFycmF5KTtcbmhhcmRlbihhc3NlcnRDb3B5QXJyYXkpO1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRSZWNvcmRcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHJlY29yZFxuICogQHBhcmFtIHtzdHJpbmc9fSBvcHROYW1lT2ZSZWNvcmRcbiAqIEByZXR1cm5zIHthc3NlcnRzIHJlY29yZCBpcyBDb3B5UmVjb3JkPGFueT59XG4gKi9cblxuLyoqIEB0eXBlIHtBc3NlcnRSZWNvcmR9ICovXG5jb25zdCBhc3NlcnRSZWNvcmQ9KHJlY29yZCxvcHROYW1lT2ZSZWNvcmQ9J0FsbGVnZWQgcmVjb3JkJyk9PntcbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihyZWNvcmQpO1xucGFzc1N0eWxlPT09J2NvcHlSZWNvcmQnfHxcbkZhaWwgYCR7cShvcHROYW1lT2ZSZWNvcmQpfSAke3JlY29yZH0gbXVzdCBiZSBhIHBhc3MtYnktY29weSByZWNvcmQsIG5vdCAke3EoXG5wYXNzU3R5bGUpXG4gfWA7XG4gfTskaOKAjV9vbmNlLmFzc2VydFJlY29yZChhc3NlcnRSZWNvcmQpO1xuaGFyZGVuKGFzc2VydFJlY29yZCk7XG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydFJlbW90YWJsZVxuICogQHBhcmFtIHtQYXNzYWJsZX0gcmVtb3RhYmxlXG4gKiBAcGFyYW0ge3N0cmluZz19IG9wdE5hbWVPZlJlbW90YWJsZVxuICogQHJldHVybnMge2Fzc2VydHMgcmVtb3RhYmxlIGlzIFJlbW90YWJsZX1cbiAqL1xuXG4vKiogQHR5cGUge0Fzc2VydFJlbW90YWJsZX0gKi9cbmNvbnN0IGFzc2VydFJlbW90YWJsZT0oXG5yZW1vdGFibGUsXG5vcHROYW1lT2ZSZW1vdGFibGU9J0FsbGVnZWQgcmVtb3RhYmxlJyk9Plxue1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHJlbW90YWJsZSk7XG5wYXNzU3R5bGU9PT0ncmVtb3RhYmxlJ3x8XG5GYWlsIGAke3Eob3B0TmFtZU9mUmVtb3RhYmxlKX0gJHtyZW1vdGFibGV9IG11c3QgYmUgYSByZW1vdGFibGUsIG5vdCAke3EoXG5wYXNzU3R5bGUpXG4gfWA7XG4gfTskaOKAjV9vbmNlLmFzc2VydFJlbW90YWJsZShhc3NlcnRSZW1vdGFibGUpO1xuaGFyZGVuKGFzc2VydFJlbW90YWJsZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNDb3B5QXJyYXkiOlsiaXNDb3B5QXJyYXkiXSwiaXNSZWNvcmQiOlsiaXNSZWNvcmQiXSwiaXNSZW1vdGFibGUiOlsiaXNSZW1vdGFibGUiXSwiYXNzZXJ0Q29weUFycmF5IjpbImFzc2VydENvcHlBcnJheSJdLCJhc3NlcnRSZWNvcmQiOlsiYXNzZXJ0UmVjb3JkIl0sImFzc2VydFJlbW90YWJsZSI6WyJhc3NlcnRSZW1vdGFibGUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAu1cO9x8BAAAfAQAAIQAAAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAD/CipPugsAALoLAAAeAAAAQGVuZG8vbmF0LXY0LjEuMjMvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJOYXQiLCJpc05hdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShpc05hdCwgJ25hbWUnLCB7dmFsdWU6IFwiaXNOYXRcIn0pOyRo4oCNX29uY2UuaXNOYXQoaXNOYXQpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShOYXQsICduYW1lJywge3ZhbHVlOiBcIk5hdFwifSk7JGjigI1fb25jZS5OYXQoTmF0KTsgICAvKiBDb3B5cmlnaHQgKEMpIDIwMTEgR29vZ2xlIEluYy4qL1xuLyogQ29weXJpZ2h0IChDKSAyMDE4IEFnb3JpYyovXG4vKiovXG4vKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOyovXG4vKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuKi9cbi8qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCovXG4vKiovXG4vKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAqL1xuLyoqL1xuLyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSovXG4vKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsKi9cbi8qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiovXG4vKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kKi9cbi8qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiovXG5cbi8qIEB0cy1jaGVjayovXG5cbi8qKlxuICogSXMgYGFsbGVnZWROdW1gIGEgbnVtYmVyIGluIHRoZSBbY29udGlndW91cyByYW5nZSBvZiBleGFjdGx5IGFuZFxuICogdW5hbWJpZ3VvdXNseVxuICogcmVwcmVzZW50YWJsZV0oaHR0cHM6Ly9lc2Rpc2N1c3Mub3JnL3RvcGljL21vcmUtbnVtZXJpYy1jb25zdGFudHMtcGxlYXNlLWVzcGVjaWFsbHktZXBzaWxvbiNjb250ZW50LTE0KVxuICogIG5hdHVyYWwgbnVtYmVycyAobm9uLW5lZ2F0aXZlIGludGVnZXJzKT9cbiAqXG4gKiBUbyBxdWFsaWZ5IGBhbGxlZ2VkTnVtYCBtdXN0IGVpdGhlciBiZSBhXG4gKiBub24tbmVnYXRpdmUgYGJpZ2ludGAsIG9yIGEgbm9uLW5lZ2F0aXZlIGBudW1iZXJgIHJlcHJlc2VudGluZyBhbiBpbnRlZ2VyXG4gKiB3aXRoaW4gcmFuZ2Ugb2YgW2ludGVnZXJzIHNhZmVseSByZXByZXNlbnRhYmxlIGluXG4gKiBmbG9hdGluZyBwb2ludF0oaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1udW1iZXIuaXNzYWZlaW50ZWdlcikuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBhbGxlZ2VkTnVtXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNOYXQoYWxsZWdlZE51bSl7XG5pZih0eXBlb2YgYWxsZWdlZE51bT09PSdiaWdpbnQnKXtcbnJldHVybiBhbGxlZ2VkTnVtPj0wO1xuIH1cbmlmKHR5cGVvZiBhbGxlZ2VkTnVtIT09J251bWJlcicpe1xucmV0dXJuIGZhbHNlO1xuIH1cblxucmV0dXJuIE51bWJlci5pc1NhZmVJbnRlZ2VyKGFsbGVnZWROdW0pJiZhbGxlZ2VkTnVtPj0wO1xuIH1cblxuLyoqXG4gKiBJZiBgYWxsZWdlZE51bWJlcmAgcGFzc2VzIHRoZSBgaXNOYXRgIHRlc3QsIHRoZW4gcmV0dXJuIGl0IGFzIGEgYmlnaW50LlxuICogT3RoZXJ3aXNlIHRocm93IGFuIGFwcHJvcHJpYXRlIGVycm9yLlxuICpcbiAqIElmIGBhbGxlZ2VkTnVtYCBpcyBuZWl0aGVyIGEgYmlnaW50IG5vciBhIG51bWJlciwgYE5hdGAgdGhyb3dzIGEgYFR5cGVFcnJvcmAuXG4gKiBPdGhlcndpc2UsIGlmIGl0IGlzIG5vdCBhIFtzYWZlbHlcbiAqIHJlcHJlc2VudGFibGVdKGh0dHBzOi8vZXNkaXNjdXNzLm9yZy90b3BpYy9tb3JlLW51bWVyaWMtY29uc3RhbnRzLXBsZWFzZS1lc3BlY2lhbGx5LWVwc2lsb24jY29udGVudC0xNClcbiAqIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyLCBgTmF0YCB0aHJvd3MgYSBgUmFuZ2VFcnJvcmAuXG4gKiBPdGhlcndpc2UsIGl0IGlzIGNvbnZlcnRlZCB0byBhIGJpZ2ludCBpZiBuZWNlc3NhcnkgYW5kIHJldHVybmVkLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gYWxsZWdlZE51bVxuICogQHJldHVybnMge2JpZ2ludH1cbiAqL1xuZnVuY3Rpb24gTmF0KGFsbGVnZWROdW0pe1xuaWYodHlwZW9mIGFsbGVnZWROdW09PT0nYmlnaW50Jyl7XG5pZihhbGxlZ2VkTnVtPDApe1xudGhyb3cgbmV3IFJhbmdlRXJyb3IoIGAke2FsbGVnZWROdW19IGlzIG5lZ2F0aXZlYCk7XG4gfVxucmV0dXJuIGFsbGVnZWROdW07XG4gfVxuXG5pZih0eXBlb2YgYWxsZWdlZE51bT09PSdudW1iZXInKXtcbmlmKCFOdW1iZXIuaXNTYWZlSW50ZWdlcihhbGxlZ2VkTnVtKSl7XG50aHJvdyBuZXcgUmFuZ2VFcnJvciggYCR7YWxsZWdlZE51bX0gbm90IGEgc2FmZSBpbnRlZ2VyYCk7XG4gfVxuaWYoYWxsZWdlZE51bTwwKXtcbnRocm93IG5ldyBSYW5nZUVycm9yKCBgJHthbGxlZ2VkTnVtfSBpcyBuZWdhdGl2ZWApO1xuIH1cbnJldHVybiBCaWdJbnQoYWxsZWdlZE51bSk7XG4gfVxuXG50aHJvdyBuZXcgVHlwZUVycm9yKFxuIGAke2FsbGVnZWROdW19IGlzIGEgJHt0eXBlb2YgYWxsZWdlZE51bX0gYnV0IG11c3QgYmUgYSBiaWdpbnQgb3IgYSBudW1iZXJgKTtcblxuIH1cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc05hdCI6WyJpc05hdCJdLCJOYXQiOlsiTmF0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEdvKsdbCQAAWwkAACIAAABAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vc3JjL2lzLXByb21pc2UuanMiLCIuL3NyYy9tZW1vLXJhY2UuanMiLCIuL3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qcyIsIi4vc3JjL3R5cGVzLmpzIl0sImV4cG9ydHMiOlsibWFrZVByb21pc2VLaXQiLCJyYWNlUHJvbWlzZXMiXSwicmVleHBvcnRzIjpbIi4vc3JjL2lzLXByb21pc2UuanMiLCIuL3NyYy90eXBlcy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQsbWVtb1JhY2U7JGjigI1faW1wb3J0cyhbW1wiLi9zcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanNcIiwgW1tcIm1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdFwiLCBbJGjigI1fYSA9PiAobWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0ID0gJGjigI1fYSldXV1dLFtcIi4vc3JjL21lbW8tcmFjZS5qc1wiLCBbW1wibWVtb1JhY2VcIiwgWyRo4oCNX2EgPT4gKG1lbW9SYWNlID0gJGjigI1fYSldXV1dLFtcIi4vc3JjL2lzLXByb21pc2UuanNcIiwgW11dLFtcIi4vc3JjL3R5cGVzLmpzXCIsIFtdXV0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShtYWtlUHJvbWlzZUtpdCwgJ25hbWUnLCB7dmFsdWU6IFwibWFrZVByb21pc2VLaXRcIn0pOyRo4oCNX29uY2UubWFrZVByb21pc2VLaXQobWFrZVByb21pc2VLaXQpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShyYWNlUHJvbWlzZXMsICduYW1lJywge3ZhbHVlOiBcInJhY2VQcm9taXNlc1wifSk7JGjigI1fb25jZS5yYWNlUHJvbWlzZXMocmFjZVByb21pc2VzKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlIHtQcm9taXNlQ29uc3RydWN0b3J9ICovXG5jb25zdCBCZXN0UGlwZWxpbmFibGVQcm9taXNlPWdsb2JhbFRoaXMuSGFuZGxlZFByb21pc2V8fFByb21pc2U7XG5cbi8qKlxuICogbWFrZVByb21pc2VLaXQoKSBidWlsZHMgYSBQcm9taXNlIG9iamVjdCwgYW5kIHJldHVybnMgYSByZWNvcmRcbiAqIGNvbnRhaW5pbmcgdGhlIHByb21pc2UgaXRzZWxmLCBhcyB3ZWxsIGFzIHNlcGFyYXRlIGZhY2V0cyBmb3IgcmVzb2x2aW5nXG4gKiBhbmQgcmVqZWN0aW5nIGl0LlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcmV0dXJucyB7WGltcG9ydCgnLi9zcmMvdHlwZXMuanMnKS5Qcm9taXNlS2l0PFQ+fVxuICovXG5mdW5jdGlvbiAgICAgICAgbWFrZVByb21pc2VLaXQoKXtcbmNvbnN0e3Jlc29sdmUscmVqZWN0LGV4ZWN1dG9yfT1tYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQoKTtcblxuY29uc3QgcHJvbWlzZT1uZXcgQmVzdFBpcGVsaW5hYmxlUHJvbWlzZShleGVjdXRvcik7XG5cbnJldHVybiBoYXJkZW4oe3Byb21pc2UscmVzb2x2ZSxyZWplY3R9KTtcbiB9XG5oYXJkZW4obWFrZVByb21pc2VLaXQpO1xuXG4vKiBOQjogQW5vdGhlciBpbXBsZW1lbnRhdGlvbiBmb3IgUHJvbWlzZS5yYWNlIHdvdWxkIGJlIHRvIHVzZSB0aGUgcmVsZWFzaW5nIGV4ZWN1dG9yLCovXG4vKiBIb3dldmVyIHdoaWxlIGl0IHdvdWxkIG5vIGxvbmdlciBsZWFrIHRoZSByYWNlZCBwcm9taXNlIG9iamVjdHMgdGhlbXNlbHZlcywgaXQgd291bGQqL1xuLyogc3RpbGwgbGVhayByZWFjdGlvbnMgb24gdGhlIG5vbi1yZXNvbHZlZCBwcm9taXNlcyBjb250ZW5kaW5nIGZvciB0aGUgcmFjZS4qL1xuXG4vKipcbiAqIENyZWF0ZXMgYSBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgb3IgcmVqZWN0ZWQgd2hlbiBhbnkgb2YgdGhlIHByb3ZpZGVkIFByb21pc2VzIGFyZSByZXNvbHZlZFxuICogb3IgcmVqZWN0ZWQuXG4gKlxuICogVW5saWtlIGBQcm9taXNlLnJhY2VgIGl0IGNsZWFucyB1cCBhZnRlciBpdHNlbGYgc28gYSBub24tcmVzb2x2ZWQgdmFsdWUgZG9lc24ndCBob2xkIG9udG9cbiAqIHRoZSByZXN1bHQgcHJvbWlzZS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxUPn0gdmFsdWVzIEFuIGl0ZXJhYmxlIG9mIFByb21pc2VzLlxuICogQHJldHVybnMge1Byb21pc2U8QXdhaXRlZDxUPj59IEEgbmV3IFByb21pc2UuXG4gKi9cbmZ1bmN0aW9uICAgICAgICByYWNlUHJvbWlzZXModmFsdWVzKXtcbnJldHVybiBoYXJkZW4obWVtb1JhY2UuY2FsbChCZXN0UGlwZWxpbmFibGVQcm9taXNlLHZhbHVlcykpO1xuIH1cbmhhcmRlbihyYWNlUHJvbWlzZXMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VQcm9taXNlS2l0IjpbIm1ha2VQcm9taXNlS2l0Il0sInJhY2VQcm9taXNlcyI6WyJyYWNlUHJvbWlzZXMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAl4jgW8oCAADKAgAAKwAAAEBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIvc3JjL2lzLXByb21pc2UuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImlzUHJvbWlzZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShpc1Byb21pc2UsICduYW1lJywge3ZhbHVlOiBcImlzUHJvbWlzZVwifSk7JGjigI1fb25jZS5pc1Byb21pc2UoaXNQcm9taXNlKTsgICAvKipcbiAqIERldGVybWluZSBpZiB0aGUgYXJndW1lbnQgaXMgYSBQcm9taXNlLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gbWF5YmVQcm9taXNlIFRoZSB2YWx1ZSB0byBleGFtaW5lXG4gKiBAcmV0dXJucyB7bWF5YmVQcm9taXNlIGlzIFByb21pc2V9IFdoZXRoZXIgaXQgaXMgYSBwcm9taXNlXG4gKi9cbmZ1bmN0aW9uICAgICAgICBpc1Byb21pc2UobWF5YmVQcm9taXNlKXtcbnJldHVybiBQcm9taXNlLnJlc29sdmUobWF5YmVQcm9taXNlKT09PW1heWJlUHJvbWlzZTtcbiB9XG5oYXJkZW4oaXNQcm9taXNlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc1Byb21pc2UiOlsiaXNQcm9taXNlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAIQRv9OpEgAAqRIAACoAAABAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyL3NyYy9tZW1vLXJhY2UuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIm1lbW9SYWNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogSW5pdGlhbCB2ZXJzaW9uIGF1dGhvcmVkIGJ5IEJyaWFuIEtpbTpcbmh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9pc3N1ZXMvMTc0NjkjaXNzdWVjb21tZW50LTY4NTIxNjc3N1xuIFRoaXMgaXMgZnJlZSBhbmQgdW5lbmN1bWJlcmVkIHNvZnR3YXJlIHJlbGVhc2VkIGludG8gdGhlIHB1YmxpYyBkb21haW4uXG4gQW55b25lIGlzIGZyZWUgdG8gY29weSwgbW9kaWZ5LCBwdWJsaXNoLCB1c2UsIGNvbXBpbGUsIHNlbGwsIG9yXG5kaXN0cmlidXRlIHRoaXMgc29mdHdhcmUsIGVpdGhlciBpbiBzb3VyY2UgY29kZSBmb3JtIG9yIGFzIGEgY29tcGlsZWRcbmJpbmFyeSwgZm9yIGFueSBwdXJwb3NlLCBjb21tZXJjaWFsIG9yIG5vbi1jb21tZXJjaWFsLCBhbmQgYnkgYW55XG5tZWFucy5cbiBJbiBqdXJpc2RpY3Rpb25zIHRoYXQgcmVjb2duaXplIGNvcHlyaWdodCBsYXdzLCB0aGUgYXV0aG9yIG9yIGF1dGhvcnNcbm9mIHRoaXMgc29mdHdhcmUgZGVkaWNhdGUgYW55IGFuZCBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoZVxuc29mdHdhcmUgdG8gdGhlIHB1YmxpYyBkb21haW4uIFdlIG1ha2UgdGhpcyBkZWRpY2F0aW9uIGZvciB0aGUgYmVuZWZpdFxub2YgdGhlIHB1YmxpYyBhdCBsYXJnZSBhbmQgdG8gdGhlIGRldHJpbWVudCBvZiBvdXIgaGVpcnMgYW5kXG5zdWNjZXNzb3JzLiBXZSBpbnRlbmQgdGhpcyBkZWRpY2F0aW9uIHRvIGJlIGFuIG92ZXJ0IGFjdCBvZlxucmVsaW5xdWlzaG1lbnQgaW4gcGVycGV0dWl0eSBvZiBhbGwgcHJlc2VudCBhbmQgZnV0dXJlIHJpZ2h0cyB0byB0aGlzXG5zb2Z0d2FyZSB1bmRlciBjb3B5cmlnaHQgbGF3LlxuIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsXG5FWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbk1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC5cbklOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SXG5PVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSxcbkFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUlxuT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBwbGVhc2UgcmVmZXIgdG8gPGh0dHA6Ly91bmxpY2Vuc2Uub3JnLz5cbiovXG5cblxuXG5cblxuXG5cbmNvbnN0IGlzT2JqZWN0PSh2YWx1ZSk9Pk9iamVjdCh2YWx1ZSk9PT12YWx1ZTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgW1Q9YW55XVxuICogQHR5cGVkZWYge29iamVjdH0gRGVmZXJyZWRcbiAqIEBwcm9wZXJ0eSB7KHZhbHVlPzogWGltcG9ydChcIi4vdHlwZXMuanNcIikuRVJlZjxUPiApID0+IHZvaWR9IHJlc29sdmVcbiAqIEBwcm9wZXJ0eSB7KGVycj86IGFueSApID0+IHZvaWR9IHJlamVjdFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyBuZXZlclxuICogIHwge3NldHRsZWQ6IGZhbHNlLCBkZWZlcnJlZHM6IFNldDxEZWZlcnJlZD59XG4gKiAgfCB7c2V0dGxlZDogdHJ1ZSwgZGVmZXJyZWRzPzogdW5kZWZpbmVkfVxuICogfSBQcm9taXNlTWVtb1JlY29yZFxuICovXG5cbi8qIEtleXMgYXJlIHRoZSB2YWx1ZXMgcGFzc2VkIHRvIHJhY2UsIHZhbHVlcyBhcmUgYSByZWNvcmQgb2YgZGF0YSBjb250YWluaW5nIGEqL1xuLyogc2V0IG9mIGRlZmVycmVkcyBhbmQgd2hldGhlciB0aGUgdmFsdWUgaGFzIHNldHRsZWQuKi9cbi8qKiBAdHlwZSB7V2Vha01hcDxvYmplY3QsIFByb21pc2VNZW1vUmVjb3JkPn0gKi9cbmNvbnN0IGtub3duUHJvbWlzZXM9bmV3IFdlYWtNYXAoKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Byb21pc2VNZW1vUmVjb3JkIHwgdW5kZWZpbmVkfSByZWNvcmRcbiAqIEByZXR1cm5zIHtTZXQ8RGVmZXJyZWQ+fVxuICovXG5jb25zdCBtYXJrU2V0dGxlZD0ocmVjb3JkKT0+e1xuaWYoIXJlY29yZHx8cmVjb3JkLnNldHRsZWQpe1xucmV0dXJuIG5ldyBTZXQoKTtcbiB9XG5cbmNvbnN0e2RlZmVycmVkc309cmVjb3JkO1xuT2JqZWN0LmFzc2lnbihyZWNvcmQse1xuZGVmZXJyZWRzOnVuZGVmaW5lZCxcbnNldHRsZWQ6dHJ1ZX0pO1xuXG5PYmplY3QuZnJlZXplKHJlY29yZCk7XG5yZXR1cm4gZGVmZXJyZWRzO1xuIH07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7YW55fSB2YWx1ZVxuICogQHJldHVybnMge1Byb21pc2VNZW1vUmVjb3JkfVxuICovXG5jb25zdCBnZXRNZW1vUmVjb3JkPSh2YWx1ZSk9PntcbmlmKCFpc09iamVjdCh2YWx1ZSkpe1xuLyogSWYgdGhlIGNvbnRlbmRlciBpcyBhIHByaW1pdGl2ZSwgYXR0ZW1wdGluZyB0byB1c2UgaXQgYXMgYSBrZXkgaW4gdGhlKi9cbi8qIHdlYWttYXAgd291bGQgdGhyb3cgYW4gZXJyb3IuIEx1Y2tpbHksIGl0IGlzIHNhZmUgdG8gY2FsbCovXG4vKiBgUHJvbWlzZS5yZXNvbHZlKGNvbnRlbmRlcikudGhlbmAgb24gYSBwcmltaXRpdmUgdmFsdWUgbXVsdGlwbGUgdGltZXMqL1xuLyogYmVjYXVzZSB0aGUgcHJvbWlzZSBmdWxmaWxscyBpbW1lZGlhdGVseS4gU28gd2UgZmFrZSBhIHNldHRsZWQgcmVjb3JkLiovXG5yZXR1cm4gaGFyZGVuKHtzZXR0bGVkOnRydWV9KTtcbiB9XG5cbmxldCByZWNvcmQ9a25vd25Qcm9taXNlcy5nZXQodmFsdWUpO1xuXG5pZighcmVjb3JkKXtcbnJlY29yZD17ZGVmZXJyZWRzOm5ldyBTZXQoKSxzZXR0bGVkOmZhbHNlfTtcbmtub3duUHJvbWlzZXMuc2V0KHZhbHVlLHJlY29yZCk7XG4vKiBUaGlzIGNhbGwgdG8gYHRoZW5gIGhhcHBlbnMgb25jZSBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSB2YWx1ZS4qL1xuUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuKFxuKHZhbCk9PntcbmZvcihjb25zdHtyZXNvbHZlfW9mIG1hcmtTZXR0bGVkKHJlY29yZCkpe1xucmVzb2x2ZSh2YWwpO1xuIH1cbiB9LFxuKGVycik9PntcbmZvcihjb25zdHtyZWplY3R9b2YgbWFya1NldHRsZWQocmVjb3JkKSl7XG5yZWplY3QoZXJyKTtcbiB9XG4gfSk7XG5cbiB9XG5yZXR1cm4gcmVjb3JkO1xuIH07XG5cbmNvbnN0e3JhY2V9PXtcbi8qKlxuICogQ3JlYXRlcyBhIFByb21pc2UgdGhhdCBpcyByZXNvbHZlZCBvciByZWplY3RlZCB3aGVuIGFueSBvZiB0aGUgcHJvdmlkZWQgUHJvbWlzZXMgYXJlIHJlc29sdmVkXG4gKiBvciByZWplY3RlZC5cbiAqXG4gKiBVbmxpa2UgYFByb21pc2UucmFjZWAgaXQgY2xlYW5zIHVwIGFmdGVyIGl0c2VsZiBzbyBhIG5vbi1yZXNvbHZlZCB2YWx1ZSBkb2Vzbid0IGhvbGQgb250b1xuICogdGhlIHJlc3VsdCBwcm9taXNlLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdGVtcGxhdGUge1Byb21pc2VDb25zdHJ1Y3Rvcn0gW1A9UHJvbWlzZUNvbnN0cnVjdG9yXVxuICogQHRoaXMge1B9XG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFQ+fSB2YWx1ZXMgQW4gaXRlcmFibGUgb2YgUHJvbWlzZXMuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxBd2FpdGVkPFQ+Pn0gQSBuZXcgUHJvbWlzZS5cbiAqL1xucmFjZSh2YWx1ZXMpe1xubGV0IGRlZmVycmVkO1xuLyoqIEB0eXBlIHtUW119ICovXG5jb25zdCBjYWNoZWRWYWx1ZXM9W107XG5jb25zdCBDPXRoaXM7XG5jb25zdCByZXN1bHQ9bmV3IEMoKHJlc29sdmUscmVqZWN0KT0+e1xuZGVmZXJyZWQ9e3Jlc29sdmUscmVqZWN0fTtcbmZvcihjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpe1xuY2FjaGVkVmFsdWVzLnB1c2godmFsdWUpO1xuY29uc3R7c2V0dGxlZCxkZWZlcnJlZHN9PWdldE1lbW9SZWNvcmQodmFsdWUpO1xuaWYoc2V0dGxlZCl7XG4vKiBJZiB0aGUgY29udGVuZGVyIGlzIHNldHRsZWQgKGluY2x1ZGluZyBwcmltaXRpdmVzKSwgaXQgaXMgc2FmZSovXG4vKiB0byBjYWxsIGBQcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW5gIG9uIGl0LiovXG5DLnJlc29sdmUodmFsdWUpLnRoZW4ocmVzb2x2ZSxyZWplY3QpO1xuIH1lbHNle1xuZGVmZXJyZWRzLmFkZChkZWZlcnJlZCk7XG4gfVxuIH1cbiB9KTtcblxuLyogVGhlIGZpbmFsbHkgY2FsbGJhY2sgZXhlY3V0ZXMgd2hlbiBhbnkgdmFsdWUgc2V0dGxlcywgcHJldmVudGluZyBhbnkgb2YqL1xuLyogdGhlIHVucmVzb2x2ZWQgdmFsdWVzIGZyb20gcmV0YWluaW5nIGEgcmVmZXJlbmNlIHRvIHRoZSByZXNvbHZlZCB2YWx1ZS4qL1xucmV0dXJuIHJlc3VsdC5maW5hbGx5KCgpPT57XG5mb3IoY29uc3QgdmFsdWUgb2YgY2FjaGVkVmFsdWVzKXtcbmNvbnN0e2RlZmVycmVkc309Z2V0TWVtb1JlY29yZCh2YWx1ZSk7XG5pZihkZWZlcnJlZHMpe1xuZGVmZXJyZWRzLmRlbGV0ZShkZWZlcnJlZCk7XG4gfVxuIH1cbiB9KTtcbiB9fTskaOKAjV9vbmNlLnJhY2UocmFjZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWVtb1JhY2UiOlsicmFjZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB0DAyPVAcAAFQHAAA1AAAAQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41Mi9zcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIm1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qLyA8cmVmZXJlbmNlIHR5cGVzPVwic2VzXCIvPiovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBjYWxsYmFjayBQcm9taXNlRXhlY3V0b3IgVGhlIHByb21pc2UgZXhlY3V0b3JcbiAqIEBwYXJhbSB7KHZhbHVlOiBYaW1wb3J0KCcuL3R5cGVzLmpzJykuRVJlZjxUPikgPT4gdm9pZH0gcmVzb2x2ZVxuICogQHBhcmFtIHsocmVhc29uOiBhbnkpID0+IHZvaWR9IHJlamVjdFxuICovXG5cbi8qKlxuICogbWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KCkgYnVpbGRzIHJlc29sdmUvcmVqZWN0IGZ1bmN0aW9ucyB3aGljaCBkcm9wIHJlZmVyZW5jZXNcbiAqIHRvIHRoZSByZXNvbHZlL3JlamVjdCBmdW5jdGlvbnMgZ2F0aGVyZWQgZnJvbSBhbiBleGVjdXRvciB0byBiZSB1c2VkIHdpdGggYVxuICogcHJvbWlzZSBjb25zdHJ1Y3Rvci5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHJldHVybnMge1BpY2s8WGltcG9ydCgnLi90eXBlcy5qcycpLlByb21pc2VLaXQ8VD4sICdyZXNvbHZlJyB8ICdyZWplY3QnPiAmIHsgZXhlY3V0b3I6IFByb21pc2VFeGVjdXRvcjxUPn19XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQ9KCk9Pntcbi8qKiBAdHlwZSB7bnVsbCB8IHVuZGVmaW5lZCB8ICgodmFsdWU6IFhpbXBvcnQoJy4vdHlwZXMuanMnKS5FUmVmPFQ+KSA9PiB2b2lkKX0gKi9cbmxldCBpbnRlcm5hbFJlc29sdmU7XG4vKiogQHR5cGUge251bGwgfCB1bmRlZmluZWQgfCAoKHJlYXNvbjogdW5rbm93bikgPT4gdm9pZCl9ICovXG5sZXQgaW50ZXJuYWxSZWplY3Q7XG5cbi8qKiBAcGFyYW0ge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5FUmVmPFQ+fSB2YWx1ZSAqL1xuY29uc3QgcmVzb2x2ZT0odmFsdWUpPT57XG5pZihpbnRlcm5hbFJlc29sdmUpe1xuaW50ZXJuYWxSZXNvbHZlKHZhbHVlKTtcbmludGVybmFsUmVzb2x2ZT1udWxsO1xuaW50ZXJuYWxSZWplY3Q9bnVsbDtcbiB9ZWxzZXtcbmFzc2VydChpbnRlcm5hbFJlc29sdmU9PT1udWxsKTtcbiB9XG4gfTtcblxuLyoqIEBwYXJhbSB7dW5rbm93bn0gcmVhc29uICovXG5jb25zdCByZWplY3Q9KHJlYXNvbik9PntcbmlmKGludGVybmFsUmVqZWN0KXtcbmludGVybmFsUmVqZWN0KHJlYXNvbik7XG5pbnRlcm5hbFJlc29sdmU9bnVsbDtcbmludGVybmFsUmVqZWN0PW51bGw7XG4gfWVsc2V7XG5hc3NlcnQoaW50ZXJuYWxSZWplY3Q9PT1udWxsKTtcbiB9XG4gfTtcblxuY29uc3QgZXhlY3V0b3I9KHJlcyxyZWopPT57XG5hc3NlcnQoaW50ZXJuYWxSZXNvbHZlPT09dW5kZWZpbmVkJiZpbnRlcm5hbFJlamVjdD09PXVuZGVmaW5lZCk7XG5pbnRlcm5hbFJlc29sdmU9cmVzO1xuaW50ZXJuYWxSZWplY3Q9cmVqO1xuIH07XG5cbnJldHVybiBoYXJkZW4oe3Jlc29sdmUscmVqZWN0LGV4ZWN1dG9yfSk7XG4gfTskaOKAjV9vbmNlLm1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdChtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQpO1xuaGFyZGVuKG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0IjpbIm1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC7Vw73HwEAAB8BAAAmAAAAQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41Mi9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAQIeAwoAAAAAAAAAAAA7GAQQpeAAAKXgAAAUAAAAAAAAAAAAAACkgQAAAABjb21wYXJ0bWVudC1tYXAuanNvblBLAQIeAwoAAAAAAAAAAAAB7dpgGgsAABoLAAAjAAAAAAAAAAAAAACkgdfgAABAYWdvcmljL2Fzc2VydC12MC41LjEvc3JjL2Fzc2VydC5qc1BLAQIeAwoAAAAAAAAAAADib06ZOC8AADgvAAAiAAAAAAAAAAAAAACkgTLsAABAYWdvcmljL2Fzc2VydC12MC41LjEvc3JjL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAAF3N7g5XAQAAVwEAACAAAAAAAAAAAAAAAKSBqhsBAEBhZ29yaWMvZXJ0cC12MC4xNS4zL2V4cG9ydGVkLmpzUEsBAh4DCgAAAAAAAAAAADjC3enZNgAA2TYAACYAAAAAAAAAAAAAAKSBPx0BAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy9hbW91bnRNYXRoLmpzUEsBAh4DCgAAAAAAAAAAAI7m3xykBQAApAUAACcAAAAAAAAAAAAAAKSBXFQBAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy9kaXNwbGF5SW5mby5qc1BLAQIeAwoAAAAAAAAAAADJvSw40wEAANMBAAAhAAAAAAAAAAAAAACkgUVaAQBAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAA2lh63DMbAAAzGwAAJQAAAAAAAAAAAAAApIFXXAEAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL2lzc3VlcktpdC5qc1BLAQIeAwoAAAAAAAAAAAApLuyRjAUAAIwFAAA6AAAAAAAAAAAAAACkgc13AQBAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvbWF0aEhlbHBlcnMvY29weUJhZ01hdGhIZWxwZXJzLmpzUEsBAh4DCgAAAAAAAAAAAOWIulyZBQAAmQUAADoAAAAAAAAAAAAAAKSBsX0BAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy9tYXRoSGVscGVycy9jb3B5U2V0TWF0aEhlbHBlcnMuanNQSwECHgMKAAAAAAAAAAAATxBrABMGAAATBgAANgAAAAAAAAAAAAAApIGigwEAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL21hdGhIZWxwZXJzL25hdE1hdGhIZWxwZXJzLmpzUEsBAh4DCgAAAAAAAAAAAJGAua5/BwAAfwcAADYAAAAAAAAAAAAAAKSBCYoBAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy9tYXRoSGVscGVycy9zZXRNYXRoSGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAAAEVD8rgQQAAIEEAAAjAAAAAAAAAAAAAACkgdyRAQBAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvcGF5bWVudC5qc1BLAQIeAwoAAAAAAAAAAACpSD8cnDwAAJw8AAApAAAAAAAAAAAAAACkgZ6WAQBAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvcGF5bWVudExlZGdlci5qc1BLAQIeAwoAAAAAAAAAAAA1TYq52w4AANsOAAAhAAAAAAAAAAAAAACkgYHTAQBAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvcHVyc2UuanNQSwECHgMKAAAAAAAAAAAA3ts1pfsFAAD7BQAALQAAAAAAAAAAAAAApIGb4gEAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL3RyYW5zaWVudE5vdGlmaWVyLmpzUEsBAh4DCgAAAAAAAAAAAF6JbmdpJwAAaScAACYAAAAAAAAAAAAAAKSB4egBAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy90eXBlR3VhcmRzLmpzUEsBAh4DCgAAAAAAAAAAACuDcfvpQgAA6UIAACkAAAAAAAAAAAAAAKSBjhACAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy90eXBlcy1hbWJpZW50LmpzUEsBAh4DCgAAAAAAAAAAAF3N7g5XAQAAVwEAACUAAAAAAAAAAAAAAKSBvlMCAEBhZ29yaWMvZ292ZXJuYW5jZS12MC45LjEvZXhwb3J0ZWQuanNQSwECHgMKAAAAAAAAAAAAT1Jlay9cAAAvXAAALgAAAAAAAAAAAAAApIFYVQIAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjkuMS9zcmMvdHlwZXMtYW1iaWVudC5qc1BLAQIeAwoAAAAAAAAAAAAO61XYMhIAADISAAA6AAAAAAAAAAAAAACkgdOxAgBAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjEvc3JjL2Vjb25Db21taXR0ZWVDaGFydGVyLmpzUEsBAh4DCgAAAAAAAAAAADZnyOF4BAAAeAQAACUAAAAAAAAAAAAAAKSBXcQCAEBhZ29yaWMvaW50ZXJuYWwtdjAuMi4xL3NyYy9jb25maWcuanNQSwECHgMKAAAAAAAAAAAAr/QmyH0BAAB9AQAAJAAAAAAAAAAAAAAApIEYyQIAQGFnb3JpYy9pbnRlcm5hbC12MC4yLjEvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAGM+OswjNwAAIzcAACQAAAAAAAAAAAAAAKSB18oCAEBhZ29yaWMvaW50ZXJuYWwtdjAuMi4xL3NyYy91dGlscy5qc1BLAQIeAwoAAAAAAAAAAABS8904iAsAAIgLAAAiAAAAAAAAAAAAAACkgTwCAwBAYWdvcmljL25hdC12NC4xLjAvZGlzdC9uYXQuZXNtLmpzUEsBAh4DCgAAAAAAAAAAAF3N7g5XAQAAVwEAACMAAAAAAAAAAAAAAKSBBA4DAEBhZ29yaWMvbm90aWZpZXItdjAuNS4xL2V4cG9ydGVkLmpzUEsBAh4DCgAAAAAAAAAAAHdLPiOjHQAAox0AADMAAAAAAAAAAAAAAKSBnA8DAEBhZ29yaWMvbm90aWZpZXItdjAuNS4xL3NyYy9hc3luY0l0ZXJhYmxlQWRhcHRvci5qc1BLAQIeAwoAAAAAAAAAAADPkEiLAAsAAAALAAAkAAAAAAAAAAAAAACkgZAtAwBAYWdvcmljL25vdGlmaWVyLXYwLjUuMS9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAOa9HeEAqAABAKgAAJwAAAAAAAAAAAAAApIHSOAMAQGFnb3JpYy9ub3RpZmllci12MC41LjEvc3JjL25vdGlmaWVyLmpzUEsBAh4DCgAAAAAAAAAAANSDfdX2MgAA9jIAACoAAAAAAAAAAAAAAKSBV2MDAEBhZ29yaWMvbm90aWZpZXItdjAuNS4xL3NyYy9wdWJsaXNoLWtpdC5qc1BLAQIeAwoAAAAAAAAAAABWCIVmvx4AAL8eAAAnAAAAAAAAAAAAAACkgZWWAwBAYWdvcmljL25vdGlmaWVyLXYwLjUuMS9zcmMvc3RvcmVzdWIuanNQSwECHgMKAAAAAAAAAAAA0bxMuTkMAAA5DAAAKQAAAAAAAAAAAAAApIGZtQMAQGFnb3JpYy9ub3RpZmllci12MC41LjEvc3JjL3N1YnNjcmliZXIuanNQSwECHgMKAAAAAAAAAAAA/i6HVQkoAAAJKAAALAAAAAAAAAAAAAAApIEZwgMAQGFnb3JpYy9ub3RpZmllci12MC41LjEvc3JjL3R5cGVzLWFtYmllbnQuanNQSwECHgMKAAAAAAAAAAAA1tYqM5UBAACVAQAAIAAAAAAAAAAAAAAApIFs6gMAQGFnb3JpYy9zdG9yZS12MC44LjMvZXhwb3J0ZWQuanNQSwECHgMKAAAAAAAAAAAATlVGlJ4iAACeIgAAIQAAAAAAAAAAAAAApIE/7AMAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAACEE+ZSCQwAAgkMAACkAAAAAAAAAAAAAAKSBHA8EAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9rZXlzL2NoZWNrS2V5LmpzUEsBAh4DCgAAAAAAAAAAADRody3KGgAAyhoAACwAAAAAAAAAAAAAAKSB5VIEAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9rZXlzL2NvbXBhcmVLZXlzLmpzUEsBAh4DCgAAAAAAAAAAAEyL4qQOEwAADhMAACgAAAAAAAAAAAAAAKSB+W0EAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9rZXlzL2NvcHlCYWcuanNQSwECHgMKAAAAAAAAAAAAjoSNk4cPAACHDwAAKAAAAAAAAAAAAAAApIFNgQQAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL2tleXMvY29weVNldC5qc1BLAQIeAwoAAAAAAAAAAABLdXk4GiIAABoiAAA0AAAAAAAAAAAAAACkgRqRBABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMva2V5cy9tZXJnZS1iYWctb3BlcmF0b3JzLmpzUEsBAh4DCgAAAAAAAAAAAJTK3autJQAArSUAADQAAAAAAAAAAAAAAKSBhrMEAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanNQSwECHgMKAAAAAAAAAAAAwgnzeQkLAAAJCwAALAAAAAAAAAAAAAAApIGF2QQAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL2xlZ2FjeS9sZWdhY3lNYXAuanNQSwECHgMKAAAAAAAAAAAAWsuWBq0GAACtBgAAMAAAAAAAAAAAAAAApIHY5AQAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL2xlZ2FjeS9sZWdhY3lXZWFrTWFwLmpzUEsBAh4DCgAAAAAAAAAAAKD8gCrSQAAA0kAAADMAAAAAAAAAAAAAAKSB0+sEAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9wYXR0ZXJucy9lbmNvZGVQYXNzYWJsZS5qc1BLAQIeAwoAAAAAAAAAAAAAvNZ9JTIAACUyAAA0AAAAAAAAAAAAAACkgfYsBQBAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvcGF0dGVybnMvaW50ZXJmYWNlLXRvb2xzLmpzUEsBAh4DCgAAAAAAAAAAAKJ1R3y1BwAAtQcAADMAAAAAAAAAAAAAAKSBbV8FAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9wYXR0ZXJucy9pbnRlcm5hbC10eXBlcy5qc1BLAQIeAwoAAAAAAAAAAAAaBDr0zcgAAM3IAAA0AAAAAAAAAAAAAACkgXNnBQBAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzUEsBAh4DCgAAAAAAAAAAAHMpU07wPAAA8DwAAC4AAAAAAAAAAAAAAKSBkjAGAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9wYXR0ZXJucy9yYW5rT3JkZXIuanNQSwECHgMKAAAAAAAAAAAAOBBOLPUVAAD1FQAAMQAAAAAAAAAAAAAApIHObQYAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL3N0b3Jlcy9zY2FsYXJNYXBTdG9yZS5qc1BLAQIeAwoAAAAAAAAAAAA2fzG+aw8AAGsPAAAxAAAAAAAAAAAAAACkgRKEBgBAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvc3RvcmVzL3NjYWxhclNldFN0b3JlLmpzUEsBAh4DCgAAAAAAAAAAAJBzDTOxEgAAsRIAADUAAAAAAAAAAAAAAKSBzJMGAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9zdG9yZXMvc2NhbGFyV2Vha01hcFN0b3JlLmpzUEsBAh4DCgAAAAAAAAAAAMtVOkJdDgAAXQ4AADUAAAAAAAAAAAAAAKSB0KYGAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9zdG9yZXMvc2NhbGFyV2Vha1NldFN0b3JlLmpzUEsBAh4DCgAAAAAAAAAAACpQrcg8EwAAPBMAAC4AAAAAAAAAAAAAAKSBgLUGAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9zdG9yZXMvc3RvcmUtdXRpbHMuanNQSwECHgMKAAAAAAAAAAAA0wEYOVx+AABcfgAAIQAAAAAAAAAAAAAApIEIyQYAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAAD+19dlSAQAAUgEAACgAAAAAAAAAAAAAAKSBo0cHAEBhZ29yaWMvc3dpbmdzZXQtdmF0LXYwLjMwLjIvZXhwb3J0ZWQuanNQSwECHgMKAAAAAAAAAAAA314sitcGAADXBgAAOQAAAAAAAAAAAAAApIE7SQcAQGFnb3JpYy9zd2luZ3NldC12YXQtdjAuMzAuMi9zcmMvdmF0cy90aW1lci90eXBlR3VhcmRzLmpzUEsBAh4DCgAAAAAAAAAAAHeIaj9IIwAASCMAAC4AAAAAAAAAAAAAAKSBaVAHAEBhZ29yaWMvdmF0LWRhdGEtdjAuNC4zL3NyYy9mYXItY2xhc3MtdXRpbHMuanNQSwECHgMKAAAAAAAAAAAAj8s5Pz0GAAA9BgAAJAAAAAAAAAAAAAAApIH9cwcAQGFnb3JpYy92YXQtZGF0YS12MC40LjMvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAACPIKLQ0CQAANAkAACkAAAAAAAAAAAAAAKSBfHoHAEBhZ29yaWMvdmF0LWRhdGEtdjAuNC4zL3NyYy9raW5kLXV0aWxzLmpzUEsBAh4DCgAAAAAAAAAAAK3HZm3KHAAAyhwAADAAAAAAAAAAAAAAAKSB94MHAEBhZ29yaWMvdmF0LWRhdGEtdjAuNC4zL3NyYy92YXQtZGF0YS1iaW5kaW5ncy5qc1BLAQIeAwoAAAAAAAAAAAB8VWrpmwMAAJsDAAAfAAAAAAAAAAAAAACkgQ+hBwBAYWdvcmljL3pvZS12MC4yNS4zL2V4cG9ydGVkLmpzUEsBAh4DCgAAAAAAAAAAAIbDQxJjJQAAYyUAAC4AAAAAAAAAAAAAAKSB56QHAEBhZ29yaWMvem9lLXYwLjI1LjMvc3JjL2NvbnRyYWN0RmFjZXQvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAAyu4vCaYLAACmCwAAMAAAAAAAAAAAAAAApIGWygcAQGFnb3JpYy96b2UtdjAuMjUuMy9zcmMvY29udHJhY3RTdXBwb3J0L3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAAKnQ3z1CBwAAQgcAADUAAAAAAAAAAAAAAKSBitYHAEBhZ29yaWMvem9lLXYwLjI1LjMvc3JjL2NvbnRyYWN0cy9jYWxsU3ByZWFkL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAANxeljujAQAAowEAAC0AAAAAAAAAAAAAAKSBH94HAEBhZ29yaWMvem9lLXYwLjI1LjMvc3JjL2NvbnRyYWN0cy9leHBvcnRlZC5qc1BLAQIeAwoAAAAAAAAAAACpGpNguBkAALgZAAAvAAAAAAAAAAAAAACkgQ3gBwBAYWdvcmljL3pvZS12MC4yNS4zL3NyYy9jb250cmFjdHMvbG9hbi90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAAC2UO1PvQsAAL0LAAAqAAAAAAAAAAAAAACkgRL6BwBAYWdvcmljL3pvZS12MC4yNS4zL3NyYy9jb250cmFjdHMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAAHMasYdtBAADbQQAAJQAAAAAAAAAAAAAApIEXBggAQGFnb3JpYy96b2UtdjAuMjUuMy9zcmMvdHlwZUd1YXJkcy5qc1BLAQIeAwoAAAAAAAAAAAB+pJ/HawcAAGsHAAAgAAAAAAAAAAAAAACkgTVICABAYWdvcmljL3pvZS12MC4yNS4zL3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAAA+/rD3gi4AAIIuAAArAAAAAAAAAAAAAACkgd5PCABAYWdvcmljL3pvZS12MC4yNS4zL3NyYy96b2VTZXJ2aWNlL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAAL+V9fKpFAAAqRQAACIAAAAAAAAAAAAAAKSBqX4IAEBhZ29yaWMvem9lLXYwLjI1LjMvdG9vbHMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAA+g/tX+sRAADrEQAAJAAAAAAAAAAAAAAApIGSkwgAQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNi44L3NyYy9FLmpzUEsBAh4DCgAAAAAAAAAAAKLUnMsKAgAACgIAACoAAAAAAAAAAAAAAKSBv6UIAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTYuOC9zcmMvbm8tc2hpbS5qc1BLAQIeAwoAAAAAAAAAAADis7Hd2A8AANgPAAAuAAAAAAAAAAAAAACkgRGoCABAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE2Ljgvc3JjL3RyYWNrLXR1cm5zLmpzUEsBAh4DCgAAAAAAAAAAAD7lgF62AgAAtgIAAB4AAAAAAAAAAAAAAKSBNbgIAEBlbmRvL2Zhci12MC4yLjE0L3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAACE1ofwvxAAAL8QAAAdAAAAAAAAAAAAAACkgSe7CABAZW5kby9tYXJzaGFsLXYwLjguMS9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAACqNP2CQgwAAEIMAAArAAAAAAAAAAAAAACkgSHMCABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzUEsBAh4DCgAAAAAAAAAAADDAhnAKQAAACkAAACsAAAAAAAAAAAAAAKSBrNgIAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9lbmNvZGVUb0NhcERhdGEuanNQSwECHgMKAAAAAAAAAAAAwBoMIXk9AAB5PQAALQAAAAAAAAAAAAAApIH/GAkAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL2VuY29kZVRvU21hbGxjYXBzLmpzUEsBAh4DCgAAAAAAAAAAAKbKF2ToBgAA6AYAAC0AAAAAAAAAAAAAAKSBw1YJAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9oZWxwZXJzL2NvcHlBcnJheS5qc1BLAQIeAwoAAAAAAAAAAACThwVh0wcAANMHAAAuAAAAAAAAAAAAAACkgfZdCQBAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvaGVscGVycy9jb3B5UmVjb3JkLmpzUEsBAh4DCgAAAAAAAAAAAAyZpNpgEQAAYBEAACkAAAAAAAAAAAAAAKSBFWYJAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9oZWxwZXJzL2Vycm9yLmpzUEsBAh4DCgAAAAAAAAAAANExutlGCAAARggAADAAAAAAAAAAAAAAAKSBvHcJAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9oZWxwZXJzL2l0ZXItaGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAAAMAuon9BkAAPQZAAA1AAAAAAAAAAAAAACkgVCACQBAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAAAE8mw+9h8AAPYfAAAtAAAAAAAAAAAAAACkgZeaCQBAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvaGVscGVycy9yZW1vdGFibGUuanNQSwECHgMKAAAAAAAAAAAAFMaqwYoPAACKDwAAMAAAAAAAAAAAAAAApIHYugkAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL2hlbHBlcnMvc2FmZS1wcm9taXNlLmpzUEsBAh4DCgAAAAAAAAAAAGUT/Wi5EgAAuRIAACoAAAAAAAAAAAAAAKSBsMoJAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9oZWxwZXJzL3N5bWJvbC5qc1BLAQIeAwoAAAAAAAAAAAAKtLnW4AcAAOAHAAAqAAAAAAAAAAAAAACkgbHdCQBAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvaGVscGVycy90YWdnZWQuanNQSwECHgMKAAAAAAAAAAAAEZo7UPQYAAD0GAAAJAAAAAAAAAAAAAAApIHZ5QkAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL21ha2UtZmFyLmpzUEsBAh4DCgAAAAAAAAAAAFvzA2cpBAAAKQQAACYAAAAAAAAAAAAAAKSBD/8JAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9tYWtlVGFnZ2VkLmpzUEsBAh4DCgAAAAAAAAAAANAlDou8KAAAvCgAACoAAAAAAAAAAAAAAKSBfAMKAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9tYXJzaGFsLWp1c3Rpbi5qc1BLAQIeAwoAAAAAAAAAAAAy15NFwwYAAMMGAAAtAAAAAAAAAAAAAACkgYAsCgBAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanNQSwECHgMKAAAAAAAAAAAAad/d+VUyAABVMgAAIwAAAAAAAAAAAAAApIGOMwoAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL21hcnNoYWwuanNQSwECHgMKAAAAAAAAAAAAQWezeQIcAAACHAAAJwAAAAAAAAAAAAAApIEkZgoAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL3Bhc3NTdHlsZU9mLmpzUEsBAh4DCgAAAAAAAAAAAII52ZMDDQAAAw0AACYAAAAAAAAAAAAAAKSBa4IKAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy90eXBlR3VhcmRzLmpzUEsBAh4DCgAAAAAAAAAAALtXDvcfAQAAHwEAACEAAAAAAAAAAAAAAKSBso8KAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAAD/CipPugsAALoLAAAeAAAAAAAAAAAAAACkgRCRCgBAZW5kby9uYXQtdjQuMS4yMy9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAR28qx1sJAABbCQAAIgAAAAAAAAAAAAAApIEGnQoAQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41Mi9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAACXiOBbygIAAMoCAAArAAAAAAAAAAAAAACkgaGmCgBAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyL3NyYy9pcy1wcm9taXNlLmpzUEsBAh4DCgAAAAAAAAAAAIQRv9OpEgAAqRIAACoAAAAAAAAAAAAAAKSBtKkKAEBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIvc3JjL21lbW8tcmFjZS5qc1BLAQIeAwoAAAAAAAAAAAB0DAyPVAcAAFQHAAA1AAAAAAAAAAAAAACkgaW8CgBAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyL3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qc1BLAQIeAwoAAAAAAAAAAAC7Vw73HwEAAB8BAAAmAAAAAAAAAAAAAACkgUzECgBAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyL3NyYy90eXBlcy5qc1BLBQYAAAAAZgBmABkjAACvxQoAAAA=","endoZipBase64Sha512":"d19527775f155fc8b8fc39b23ed38b4227958f1d0234b6eafc3c50d4ee433f6033893687082ab79bcc8f88d103c8c615288e58a50ed55357e6f85ef901a7641f"};
|