@agoric/inter-protocol 0.13.3 → 0.13.4-dev-d32a66a.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/README.md +26 -20
- package/bundles/bundle-auctioneer-js-meta.json +722 -0
- package/bundles/bundle-auctioneer.js +1 -0
- package/bundles/bundle-econCommitteeCharter-js-meta.json +514 -0
- package/bundles/bundle-econCommitteeCharter.js +1 -0
- package/bundles/bundle-feeDistributor-js-meta.json +458 -0
- package/bundles/bundle-feeDistributor.js +1 -1
- package/bundles/bundle-fluxAggregatorKit-js-meta.json +674 -0
- package/bundles/bundle-fluxAggregatorKit.js +1 -0
- package/bundles/bundle-psm-js-meta.json +666 -0
- package/bundles/bundle-psm.js +1 -1
- package/bundles/bundle-reserve-js-meta.json +662 -0
- package/bundles/bundle-reserve.js +1 -1
- package/bundles/bundle-scaledPriceAuthority-js-meta.json +542 -0
- package/bundles/bundle-scaledPriceAuthority.js +1 -1
- package/bundles/bundle-vaultFactory-js-meta.json +786 -0
- package/bundles/bundle-vaultFactory.js +1 -1
- package/exported.js +0 -2
- package/package.json +34 -31
- package/scripts/add-collateral-core.js +14 -4
- package/scripts/build-bundles.js +9 -2
- package/scripts/deploy-contracts.js +1 -4
- package/scripts/init-core.js +20 -38
- package/scripts/invite-committee-core.js +1 -1
- package/scripts/manual-price-feed.js +2 -2
- package/scripts/price-feed-core.js +7 -6
- package/scripts/start-local-chain.sh +84 -0
- package/src/auction/auctionBook.js +755 -0
- package/src/auction/auctioneer.js +720 -0
- package/src/auction/offerBook.js +221 -0
- package/src/auction/params.js +174 -0
- package/src/auction/scheduleMath.js +167 -0
- package/src/auction/scheduler.js +370 -0
- package/src/auction/sortedOffers.js +136 -0
- package/src/auction/util.js +55 -0
- package/src/clientSupport.js +324 -0
- package/src/collectFees.js +8 -14
- package/src/contractSupport.js +24 -68
- package/src/econCommitteeCharter.js +161 -77
- package/src/feeDistributor.js +60 -20
- package/src/index.js +2 -0
- package/src/interest-math.js +1 -4
- package/src/interest.js +20 -13
- package/src/price/README.md +57 -0
- package/src/price/fluxAggregatorContract.js +190 -0
- package/src/price/fluxAggregatorKit.js +375 -0
- package/src/price/priceOracleKit.js +127 -0
- package/src/price/roundsManager.js +726 -0
- package/src/proposals/addAssetToVault.js +89 -94
- package/src/proposals/committee-proposal.js +141 -40
- package/src/proposals/core-proposal.js +100 -167
- package/src/proposals/econ-behaviors.js +320 -564
- package/src/proposals/price-feed-proposal.js +175 -78
- package/src/proposals/startEconCommittee.js +25 -12
- package/src/proposals/startPSM.js +231 -211
- package/src/proposals/utils.js +31 -17
- package/src/psm/README.md +71 -0
- package/src/psm/psm.js +272 -160
- package/src/psm/types.js +2 -0
- package/src/reserve/assetReserve.js +56 -413
- package/src/reserve/assetReserveKit.js +303 -0
- package/src/reserve/doc.md +1 -3
- package/src/reserve/params.js +2 -5
- package/src/typeGuards.js +13 -0
- package/src/vaultFactory/Liquidation.md +100 -0
- package/src/vaultFactory/burn.js +2 -1
- package/src/vaultFactory/liquidation.js +270 -108
- package/src/vaultFactory/math.js +95 -0
- package/src/vaultFactory/orderedVaultStore.js +0 -1
- package/src/vaultFactory/params.js +133 -112
- package/src/vaultFactory/prioritizedVaults.js +36 -79
- package/src/vaultFactory/storeUtils.js +67 -9
- package/src/vaultFactory/type-imports.js +2 -0
- package/src/vaultFactory/types.js +22 -26
- package/src/vaultFactory/vault.js +772 -709
- package/src/vaultFactory/vaultDirector.js +480 -483
- package/src/vaultFactory/vaultFactory.js +99 -60
- package/src/vaultFactory/vaultHolder.js +121 -95
- package/src/vaultFactory/vaultKit.js +39 -31
- package/src/vaultFactory/vaultManager.js +1249 -868
- package/bundles/bundle-amm-meta.js +0 -618
- package/bundles/bundle-amm.js +0 -1
- package/bundles/bundle-feeDistributor-meta.js +0 -346
- package/bundles/bundle-interchainPool-meta.js +0 -534
- package/bundles/bundle-interchainPool.js +0 -1
- package/bundles/bundle-liquidateIncrementally-meta.js +0 -442
- package/bundles/bundle-liquidateIncrementally.js +0 -1
- package/bundles/bundle-liquidateMinimum-meta.js +0 -442
- package/bundles/bundle-liquidateMinimum.js +0 -1
- package/bundles/bundle-psm-meta.js +0 -538
- package/bundles/bundle-psmCharter-meta.js +0 -418
- package/bundles/bundle-psmCharter.js +0 -1
- package/bundles/bundle-reserve-meta.js +0 -542
- package/bundles/bundle-scaledPriceAuthority-meta.js +0 -442
- package/bundles/bundle-stakeFactory-meta.js +0 -574
- package/bundles/bundle-stakeFactory.js +0 -1
- package/bundles/bundle-vaultFactory-meta.js +0 -598
- package/scripts/add-initial-liquidity.js +0 -180
- package/src/collect.js +0 -13
- package/src/interchainPool.js +0 -135
- package/src/makeTracer.js +0 -36
- package/src/my-lien.js +0 -85
- package/src/proposals/demoIssuers.js +0 -685
- package/src/proposals/sim-behaviors.js +0 -40
- package/src/psm/psmCharter.js +0 -139
- package/src/stakeFactory/README.md +0 -62
- package/src/stakeFactory/attestation.js +0 -267
- package/src/stakeFactory/attestationTool.js +0 -66
- package/src/stakeFactory/constants.js +0 -16
- package/src/stakeFactory/params.js +0 -31
- package/src/stakeFactory/stakeFactory.js +0 -236
- package/src/stakeFactory/stakeFactoryKit.js +0 -455
- package/src/stakeFactory/stakeFactoryManager.js +0 -296
- package/src/stakeFactory/types.js +0 -42
- package/src/vaultFactory/liquidateIncrementally.js +0 -350
- package/src/vaultFactory/liquidateMinimum.js +0 -100
- package/src/vpool-xyk-amm/AttackersGuide.md +0 -89
- package/src/vpool-xyk-amm/addLiquidity.js +0 -222
- package/src/vpool-xyk-amm/addPool.js +0 -197
- package/src/vpool-xyk-amm/constantProduct/AMM-Trade.jpeg +0 -0
- package/src/vpool-xyk-amm/constantProduct/README.md +0 -204
- package/src/vpool-xyk-amm/constantProduct/calcFees.js +0 -99
- package/src/vpool-xyk-amm/constantProduct/calcSwapPrices.js +0 -85
- package/src/vpool-xyk-amm/constantProduct/core.js +0 -153
- package/src/vpool-xyk-amm/constantProduct/defaults.js +0 -5
- package/src/vpool-xyk-amm/constantProduct/getXY.js +0 -52
- package/src/vpool-xyk-amm/constantProduct/internal-types.js +0 -116
- package/src/vpool-xyk-amm/constantProduct/invariants.js +0 -43
- package/src/vpool-xyk-amm/constantProduct/swap.js +0 -272
- package/src/vpool-xyk-amm/constantProduct/types.js +0 -32
- package/src/vpool-xyk-amm/doublePool.js +0 -194
- package/src/vpool-xyk-amm/estimate.js +0 -155
- package/src/vpool-xyk-amm/multipoolMarketMaker.js +0 -520
- package/src/vpool-xyk-amm/params.js +0 -61
- package/src/vpool-xyk-amm/pool.js +0 -396
- package/src/vpool-xyk-amm/priceAuthority.js +0 -94
- package/src/vpool-xyk-amm/removeLiquidity.js +0 -31
- package/src/vpool-xyk-amm/singlePool.js +0 -73
- package/src/vpool-xyk-amm/swap.js +0 -69
- package/src/vpool-xyk-amm/types.js +0 -154
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export default {"moduleFormat":"endoZipBase64","endoZipBase64":"UEsDBAoAAAAAAAAAAAD61bEJn/wAAJ/8AAAUAAAAY29tcGFydG1lbnQtbWFwLmpzb257CiAgImVudHJ5IjogewogICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMyIsCiAgICAibW9kdWxlIjogIi4vc3JjL2ludGVyY2hhaW5Qb29sLmpzIgogIH0sCiAgImNvbXBhcnRtZW50cyI6IHsKICAgICJAYWdvcmljL2Fzc2VydC12MC41LjEiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvYXNzZXJ0IiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvYXNzZXJ0LXYwLjUuMSIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL2Fzc2VydC12MC41LjEiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9pbnRlci1wcm90b2NvbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9hc3NlcnQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2Fzc2VydC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImNjYmVmZjVhYTRjNjI3ZTNmN2EzZmI1ZmM1NTIzNzdjMmU3NGE1NDY0MTQ4MGVkZGFkZGFiNzlkMjkxNjNmZWQxZTg3MjYzOTZjYWI3YzIzMjk0NjViM2E5MjBjYzExNmQ1N2JkOTc3Y2RkYzZlNjUzODY3MzZkYmExZGFkYjVlIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjAxZDdhOWNiN2Y3Zjk4Y2M3YzRlNTc5ZjE4NmM0ZDczNWFkMWQzNjExODEyYTgzYTBkODA0YTI4ZTQ5MGIyNmI0ZmMzMWYwZmU1MzlhYmYwMDI3Mzk3OTM4MjBjMmFhZDE0MGI4NWI2YTk0NDMyZmNlMWVjN2NmYjUwM2UzZGYyIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL2VydHAtdjAuMTUuNSI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy9lcnRwIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvZXJ0cC12MC4xNS41IiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvZXJ0cC12MC4xNS41IiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvYXNzZXJ0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvYXNzZXJ0LXYwLjUuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2Fzc2VydC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVyLXByb3RvY29sIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbmF0LXY0LjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZGlzdC9uYXQuZXNtLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC41LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N0b3JlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3RvcmUtdjAuOC41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zdG9yZS9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjguNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZXhwb3J0ZWQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zd2luZ3NldC12YXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zd2luZ3NldC12YXQtdjAuMzEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdmF0LWRhdGEiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy92YXQtZGF0YS12MC40LjUiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTYuNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZmFyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Zhci12MC4yLjExIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYwLjcuNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi40OSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNDkiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNDkiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiLi9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJleHBvcnRlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImE3NmRkNjgyOGJmZmVlOGJiODkwYWYzNGNjNTU4YzkwNmI0ZDVkOTk2MDQ4YzZiMjdiODYxMDAzNjQ0YTZjMDJlZTczOGEzMjMyODcxNjgyMjEyMzQyYTJmNjNkMjkzYzEzYTI0M2Q2MDdjMjUwOTM4N2I3NmQ4NWIyODIxMTMyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2Ftb3VudE1hdGguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2Ftb3VudE1hdGguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiNDAwOGIxMGJiMWRmNTU4N2ZmMTk4ODkyODdjYmUxZWExYTEyMWFjODE3YjQ5ODhjMDlmOGJiYWVhNjBmOGIzMTEwMmMyZGE0Mzk1YTViNmQ0Y2I2YmNlNTNlYjkyMTQ0YTU3YWFiYzFmZmVhYTBmODdlYTBhNmQ1NGJhZWMwZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9kaXNwbGF5SW5mby5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZGlzcGxheUluZm8uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhMzk5Y2E4NmYzODY4YmU4NjRjMmJmNThmZjk4N2MyYTZiMDZlMzk4ZmU0MDNkOTA3MWFkYmE3MjZmODgyYmMyZmZlNDM4Yjk3NjY3MWY1YmVmZDJkMjExNDY0NTI1MTcwZDdlNDhmZGRiMTI4NzFkYzViOTU2NjFjYzg3NDcxZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlYmVhNzRhZWYwMDgzZTVlMjNkZjEyZDkyM2Q4MWZkZmJmMWJkZjhkZDYxZjhlMzJhYzg1OGFiY2UzODFmMjMzZDFjNTRkOWU2YjE3MTRhMjliY2JhOTYxOWQ0OGJiOWE2MDcxOGVjZjYwZTA4NTFhYTIxMzI1MzZhMDIzYmNhYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pc3N1ZXJLaXQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2lzc3VlcktpdC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjM0YjkyNGIwODkyODVlNTcxMWE1MWJiNmUyMjI2MjNmYjFhYTlmZWE0MWZhNTY5NzRjNmFkYjQwMTBjZmJjZDdhYWI1OWJkZTUwOTQ4MDljNjU2MTZjZWZjYjE0ZGZkYTdkNGM2NmI3ZThjNTdkYjRiNTQyZmQ2OWI1ZmEyY2E1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hdGhIZWxwZXJzL2NvcHlCYWdNYXRoSGVscGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWF0aEhlbHBlcnMvY29weUJhZ01hdGhIZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNjZiNGYxNGQ0NDk0ZDU1MGQ3OWM5OTkzN2QxM2ZmMDlmODhkZjNjMjM4ODFlNzFhMzcxY2JiZTljMGQ3NmEyM2NmMDZkZTM2MGI0YzllMjg1MzRmZGZlM2EyNjA3ZDliMTc2Y2E1MWJhY2I0MmI4M2M0N2JlNDAwZTM0ZmU5MmEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWF0aEhlbHBlcnMvY29weVNldE1hdGhIZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXRoSGVscGVycy9jb3B5U2V0TWF0aEhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyZTVkNGU5YWE4ZDFhYzU4ZTljYzRmOWVkY2RkZWJmYzgwOTU1Y2I5YzI5M2NkNzExZDliMmQ3ZmRmNjA1Y2JmZTAwMDZmNzRjNzE5OGJkMGQ2NGRiOGM3MzIyNmUzNjBiM2YzMmNlNzI0N2VhYTRlNmE1Y2ExOGQxNmM1MGMzNyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYXRoSGVscGVycy9uYXRNYXRoSGVscGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWF0aEhlbHBlcnMvbmF0TWF0aEhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2N2Q4NjQ2Yjc1YjdjNWVmYzkwZjM1M2Q1YzI3NTM1NjM2ZmE5M2ZlOTY5MWU0NGI0YTNiNTA1N2Y4YTAzZGUyMjdjY2RmODc3ZGYwOTQ2ZjUzMjAwZGQxN2MzZmJjYWQwZTkyMDRlOGQ3OWU4YWJlZTI1MWJiOTU3YmM0MGNlYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYXRoSGVscGVycy9zZXRNYXRoSGVscGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWF0aEhlbHBlcnMvc2V0TWF0aEhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiYzAxMTczZGQzNDBjNTljNjBkYmI4NTlmYzc3YzQ4YTllMGEwMjFlYzc3YjQ1OTM4OWRiZTQ3NzFmZjY3Yzg1MzZjOWZkMGFlOWE0ODdiNGM4MjUwMzZmMjhjMWNmNDM2MTNlOWFhYjlkYjJjMjI4OGU0NzkyZWE3Y2I4NmI2MSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXltZW50LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXltZW50LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDQ2MzE0YmQyZjIzM2NjYzVmODc4MjRlMzE4MGY2ZjI5NTk5NmY3ZDZlYmZmZWY3ZGQ0YWFjODc4Y2ZjODlhN2E1YTJmYzdkMjhiNjc3NGRkZjhmZmM3ZmIyMzQ1NWUzMWI3N2U1MTk2YTViMTQxYjFiZDkxYTUwNmEwOTMxZjkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGF5bWVudExlZGdlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGF5bWVudExlZGdlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjdkZDUzNjMxODI2NWVkMDJiZjc4N2YzNmJmOGVlMWMyMjgxMjFlOWQ4YzEyZGViOWJjN2QzNmVhYWUzOTM2ZTliMThjYjNmYjBhNmEyYThhZmRlMWI3YjI4Yzk4ZWZkMTUxNDA1MTE5ZDNhZDQxMzNjOTQ1NmY4M2Y4MzQxM2UwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3B1cnNlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wdXJzZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjY5MjZhNWFjMDc2NTIyYjgyMWQ4Y2Q2OTE4ODJhYjQ3ZTU5MmEyY2M0ZmY2YWRlNTdiNTBlYzZmN2UzYTk4MGZlNWFiYjVlMTQ1NTQyYzg0MjUzMWVjOWE2MzIzNjQ5N2FmM2NmZTA0MTM5YjkwMjAzY2VmY2VhNTI1MDhjZjhlIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3RyYW5zaWVudE5vdGlmaWVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90cmFuc2llbnROb3RpZmllci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjY1NDBhOTEyMTliMTE5MTc0OGQxYWJhNjllNmJkNjg5NmZjYTA2MmNmNmU0NzQxZDAxZDQ1NGFiZmE0Y2Q1ZGIwM2ZmODZkZDQzNGI0OWJiNDk2Mjc5NDg3ZjVmN2JhMjg1NzNlMDRkYzEyYjdlYzg0OWJkMmFmZjc2ODc3NmMyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVHdWFyZHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVHdWFyZHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjNTRkMThmN2QxMmU3MDgxZTBjZTJiZmNlZjk2NDY2ZWFiYTdmNGMwMWI0YzhlZDkyMmI0ZGZlNDY2YzY5NWVhYjY1ZDM2NDIxNGVmMWYzODUwNGQ2Y2UyMzMzYTMzOGE2MGI5MmNjYzA0MDgzMTlkNTU5NDE3M2VlZDdkM2IyMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmZjIwMDViMTA2YTUzNjU0MGRlYjEzNmJiNzNmMWZiYWRjMmE2YmVjNDAwZGJiZjcxN2Q2MDdmMzcwNjQ1OWIzOTI2M2VhZWYyNDAxNjM0ZjI3NDA1MDE2MWMyNDQ4OThkZjMxMTM0ZTU5MTk4Y2Q1ZDczYzA0MGEwNWU5MmQzZiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjkuMyI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy9nb3Zlcm5hbmNlIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvZ292ZXJuYW5jZS12MC45LjMiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjkuMyIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2Fzc2VydCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2Fzc2VydC12MC41LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9hc3NlcnQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9lcnRwIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvZXJ0cC12MC4xNS41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlci1wcm90b2NvbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVybmFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMi4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9uYXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9uYXQtdjQuMS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9kaXN0L25hdC5lc20uanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9ub3RpZmllciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjUuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3RvcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC44LjUiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N3aW5nc2V0LXZhdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N3aW5nc2V0LXZhdC12MC4zMS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zd2luZ3NldC12YXQvc3JjL3ZhdHMvdGltZXIvdHlwZUd1YXJkcy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N3aW5nc2V0LXZhdC12MC4zMS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvdmF0cy90aW1lci90eXBlR3VhcmRzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdmF0LWRhdGEiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy92YXQtZGF0YS12MC40LjUiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3ZhdHMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy92YXRzLXYwLjEzLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9jb3JlL2Jvb3QuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy96b2UiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy96b2UtdjAuMjUuNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL3pvZVNlcnZpY2Uvem9lLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvem9lL3NyYy9jbGVhblByb3Bvc2FsLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvem9lLXYwLjI1LjUiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9jbGVhblByb3Bvc2FsLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvem9lL3NyYy9jb250cmFjdFN1cHBvcnQvcmF0aW8uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy96b2UtdjAuMjUuNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2NvbnRyYWN0U3VwcG9ydC9yYXRpby5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3pvZS9zcmMvbWFrZUhhbmRsZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3pvZS12MC4yNS41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbWFrZUhhbmRsZS5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3pvZS9zcmMvdHlwZUd1YXJkcy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3pvZS12MC4yNS41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvdHlwZUd1YXJkcy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jYXB0cCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jYXB0cC12Mi4wLjE1IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE2LjUiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ZhciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9mYXItdjAuMi4xMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MC43LjUiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNDkiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjQ5IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjQ5IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2JpbmFyeVZvdGVDb3VudGVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9iaW5hcnlWb3RlQ291bnRlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjdlN2MzNTQzOTJmMjFmOGM3OTQzMzM5MTI3OTE2NGY2MDAxODk1MGRmOWY1NDMxZTdiZDlmMGU0NDg5ZDAzNzFiODMyMjdhYjk1NWZjODRiZWNiZThkZWU5MDg3OGQ5ODFlZTcwYTU5ODZiZTRjYTRjZDhmZjk0M2M2NGFlZDQ5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2Nsb3NpbmdSdWxlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jbG9zaW5nUnVsZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjhlNzM4MDMxMmNkYzM3Y2QxZjBhNzFkYTBiM2E4NDkyMzJhOWYyNzJmY2FlZTg2MTRjMjgxZTQ5NmE3YmQ2YzEzZDJkMzIxOTc2MWExMDBmZDI2ZjRkZWJkZmFmYjNlODk4ZjZhODhjY2NhYmRhNzYzM2ExOTY5NWQ4YjJlN2E5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnN0YW50cy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29uc3RhbnRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNTllNDAxYjIwOWI4NmY0Zjg1MzE3M2I5YWEzMTZkNjYwNzliYjhjYjQxYjIyMjZiNzVjNjY5OTJiNjA3MDVmNWY3NWIyMzIwM2ZjNWJkNDViYzVlMTdkNGU3MTU1MzU4NTg3YzdlM2ZhYzk0Y2ZiNDIzNDI1MjZmYzlmNmVlZDciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RHb3Zlcm5hbmNlL2Fzc2VydGlvbnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0R292ZXJuYW5jZS9hc3NlcnRpb25zLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNWRmODA5MzM3YjBlMjVhYmRmZGFiMmE5MzQyOWM5ZDMzMGRmZWE5ODUzOTZiYWYwMmNmYmE1Zjc1NjE2ZmZlZWIwNWQ5NTlmODgwMDMzNjU1MWNhZTEwZTlhN2ZhOWFkMzIwM2YxMzNjMTRiNDcyY2JhOWNmYjNhNDY4ODZjMGEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RHb3Zlcm5hbmNlL2dvdmVybkFwaS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RHb3Zlcm5hbmNlL2dvdmVybkFwaS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjMxZmJhNGQ1MjczZDBhNzM2Y2E2ODVlYzc5MzkyNDRiYjNjNjA4NDUwZTMzYjUxNzUxNDYyNzZmYTk5ZTFlZTFiYmE4OGJmZjc3ODJiYmE5OTE3OWMwMDVhYWVkNTc5MDc1NmE0NzgyN2YzZjhmZmU2NGFhNThhNjQ1YmY3NjVkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0R292ZXJuYW5jZS9nb3Zlcm5GaWx0ZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0R292ZXJuYW5jZS9nb3Zlcm5GaWx0ZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzZTJjNTNhNzMyODJmNTE4MzFmMjM5ZDEzMjA4MzNhNmUwZDczNTlkZDQyZTU4NGMxNDJlMzM2YWJiMDE4ZmI1ZDQyYTU2ZjMwMWI0MTFlOTM0NGY3MzJkM2MwNGVjOTkxMDBhNmExOTRhNTBjY2Q5OGRhNGRlZjk2YzNjYTQ3ZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdEdvdmVybmFuY2UvZ292ZXJuUGFyYW0uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0R292ZXJuYW5jZS9nb3Zlcm5QYXJhbS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjI0Yjk5ZjliMmM0MDBiODg3NjQyNTIyYWQ4MWJlYjhlMGQ2ZjgxZTMxNmY5Y2MzYjg1MjI2NTllZWE3MWNiOWRjZGJmZWJiODQ1MjQxZmE3NjQxNDMyOGVlOTUxYmYxNTk0ZGM0YzgyMWFiYTI3ZGI5N2RkYmE3N2ExOWE3ZDBkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0R292ZXJuYW5jZS9wYXJhbU1hbmFnZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0R292ZXJuYW5jZS9wYXJhbU1hbmFnZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiZWJmMWRiMTQ1ODJmZmIyMTY0Y2E0YTFkYzcwYmI5ZmVkYzk4NTVkNmRkNTJkNDRlMDIyNjNhMDdhZGNiODBiNDIzMWQ2OWM1MWJmMzY2NjQ5NzNhY2U5ZGVkYjY3M2VlZmZhODVlMzg2YWQxMjZiNDk2ZDhhYTY1NGM1Y2NiYSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdEdvdmVybmFuY2UvdHlwZWRQYXJhbU1hbmFnZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0R292ZXJuYW5jZS90eXBlZFBhcmFtTWFuYWdlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjE2MzNmMDY4NTJjMTgwYmMwODFlMmY0NDAyOTY1NDk2YjZmOGVjNDUzMmM4YjM0NDQ5ZmFiNTc2MDJhZmVlNjVlMzM4NjgxMWNhYjM0MDk2YTI3NzkwMWIxMmViNTljM2UzNTBiYzI1NWNkMjIyMTRlNzZlMjU4YjBjYTA2YTQ2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0R292ZXJub3IuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0R292ZXJub3IuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxMDNlZTBhN2JmNGFkMjJhNjJkMTRiZjdhMmNhNDRjZjU1ZmJkZjAyYTU5N2RhNDY0NzM4NjFkMzRlOGVkZmNhZWQzYzJlZmVmYjIwNTI5ZWM3ZDBlMDRmYWU1MGI4NDIxZWRiOTQwNGY5NDkzZjZlNTY3MDU4ODcwY2M4MWZkYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdEhlbHBlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RIZWxwZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmNzkxY2I4ZDg5ZjA0YWY5MWVjY2Y2NjMxMzIxNDk4Yzk0ODBmY2VlMTczODNmNmYyNGYwM2VhZmU3ZTkxMDdlNzI5OWNmMWUzMWYxNTZmNjY3NzY1Y2Q3Yjg4MTdlYTBlZGE1OTk5ODI2MWEwMGNlMTg0MjM1NTZiZWUzYzRhNiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkODlmOTFkNzU1NDZiYWYyM2ZkZmExY2U2MDExNGY3ZDVjMTdjNjM3OTU5ZDcyMjQzY2MyYThhNjE5N2ZmZWI3NDE3NWNjMTlmYzk2NDg5ZTM0MjA1Mjk5M2E0NDBiN2UyMDU5MTlhYzYxOTNlZjUzODM2ZWQ2MDAyMDExMjBkYiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9xdWVzdGlvbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcXVlc3Rpb24uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1NWZlMzEwNGMwZDQyMGJjMjgxM2EyNTM3NjhiODZiYjRiNmI1Y2IzMGRhZWVjZjhiYzcyZDA0ODJkNzk3YTI1ZTk5YTlmZTRlODc5NWM0N2Y1YjMwYmNlYTIyMmJiNDBkYTY4NjI0OGI2NGRkYTAwYTA2NTRmYmE1ZmIwNzYyNyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlR3VhcmRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlR3VhcmRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNjY1NDE2MDA3Nzg0YTlmNmE0OWI4ZGUxZGZkNjcyZDFiZDE3NWIyNjQxNTczNmE5MmY0MzBmYTZiZjM1NzA0MmU1YjAwZTM2OTJjNDM5Njk2MmExMTEyODU3MzZmODRmMjAzNTc0NDk2OGNkNDU2NTkzN2FmMjAzODBlN2E0MDgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMzAxMjFhZDhmMmQ4MTc4Mzg3NmE0NDc3YjI2NjU2ZWM2Mzc1Zjk0ZDI2YmNhOTMwMTNmNTljNDEzZDlkNGNlYzE4N2RkNzQ4NWYzYzcwNmJmY2I5Mjg1MGFkYzJjZTUyZWYyMTBkYWFjYjE4MjgxNjk2MmZkNDdhNDk0YTIwZjEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdmFsaWRhdG9ycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdmFsaWRhdG9ycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjMxN2I1N2ZhMWI2OWMxZjVjNjhlMzQ5OTIzOTgyMWU1NjRhMmE3Mzc3YTZjZmM1ZWNmNjVjYjI4MDY3MTMyMzk2N2RhN2Q5ZWY3OTUyN2UxMzgxM2Q0MmEzNDAwZmJkZDdmMmM2MTk1NjYzZmRmMzFhYTVkZDE1ZjI1MTgzMTMyIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjMiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4zIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMyIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2Fzc2VydCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2Fzc2VydC12MC41LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9hc3NlcnQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9lcnRwIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvZXJ0cC12MC4xNS41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9nb3Zlcm5hbmNlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvZ292ZXJuYW5jZS12MC45LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVyLXByb3RvY29sIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXJuYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4yLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25hdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25hdC12NC4xLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2Rpc3QvbmF0LmVzbS5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zdG9yZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjguNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3dpbmdzZXQtdmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3dpbmdzZXQtdmF0LXYwLjMxLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3ZhdC1kYXRhIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvdmF0LWRhdGEtdjAuNC41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy92YXRzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvdmF0cy12MC4xMy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvY29yZS9ib290LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvem9lIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvem9lLXYwLjI1LjUiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy96b2VTZXJ2aWNlL3pvZS5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3pvZS9zcmMvY29udHJhY3RTdXBwb3J0L2luZGV4LmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvem9lLXYwLjI1LjUiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9jb250cmFjdFN1cHBvcnQvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYnVuZGxlLXNvdXJjZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9idW5kbGUtc291cmNlLXYyLjMuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2J1bmRsZS1zb3VyY2UvZXhwb3J0ZWQuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYnVuZGxlLXNvdXJjZS12Mi4zLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2V4cG9ydGVkLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2J1bmRsZS1zb3VyY2UvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2J1bmRsZS1zb3VyY2UtdjIuMy4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY2FwdHAiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY2FwdHAtdjIuMC4xNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNi41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbm8tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9mYXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZmFyLXYwLjIuMTEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjAuNy41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY0LjEuMjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NC4xLjIwIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi40OSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNDkiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNDkiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW50ZXJjaGFpblBvb2wuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2ludGVyY2hhaW5Qb29sLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMWNmZDQzMWVjMGFlNTQyZDFjMjdlNjk0ZDI4ODQ5MmUwOThiZTViYzEyYTQxNzE5ODhkZmE1YzBhZDRhN2QyNDgxYjYyNTY1N2Y0MTQ5MTkwNTZhYzhiMWQwODU5MTUyNjVhNTgzYmM1YTM2NjBkMjc1ZWZmN2JkYjc2NDJlMWYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdnBvb2wteHlrLWFtbS9wYXJhbXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3Zwb29sLXh5ay1hbW0vcGFyYW1zLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMTRmYWMzZGMzYTYzMWM4ZjNhMDU2ZDg3ZmFiMjU5Yzc3MzU2OGQxODhkMjEzMzU3ZTc4MGY5NTRiZjdiZDk3OTljYzBlMjZjNWRhNTViMWZlMWNiODZmZWU0YzY1N2NlYWEyODNhMTI3MzgzYzgzNzA2OTE4NzUwYTU4NjE3OTAiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvaW50ZXJuYWwtdjAuMi4xIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL2ludGVybmFsIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMi4xIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMi4xIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE2LjUiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MC43LjUiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNDkiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjQ5IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjQ5IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbmZpZy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29uZmlnLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOWZmMTRhYzk0MmQwMDhkN2E4Nzg0NjllZWExYTgxZWViZTBjMmUzMmU1YjdlNGRjY2ViMTdjYjYyOTk0ZDU2M2FjNzJjYzI3OWU2Y2Y5YThjY2Y4NTc1NjA2ZWViOGZkM2QwNTk2NTEwZjdlNTA5N2RhODUyMjA0Y2IyYWQ0NjciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMTU4NDQ4MWY5OGM2MTM4ZDBkYzJlOWRmNDJlZjcxOTE4Y2U0ODgzMzc0MTA1YzM5NWVkNjYzYzMwZDljMzk4NzUzZDA5YmJiMjE5YmUwOTlmYTFhYWEwMDk1MGU5MDE4OTM3ZDBjNDZiZDhiZDg5MjQxNTFkYWE0NDE4MTVjZGUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdXRpbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3V0aWxzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODc4ZmU5N2QyYjRmZDBjNjZlZGQxYzY0NWVmNzBkOGFkMGYzZjkzYzIxM2MxZTFkM2E3NmM0OWQ3MzI1NDAzNmZmY2EwNDViNTBlNzQxNDBmZWU0NWVhYjA4M2JiNDU4NjBkYmM4MjEzYzI4NmM1N2FhYjMzNjg0MGFjZjI0YzIiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvbmF0LXY0LjEuMCI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy9uYXQiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy9uYXQtdjQuMS4wIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvbmF0LXY0LjEuMCIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2ludGVyLXByb3RvY29sIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vZGlzdC9uYXQuZXNtLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImRpc3QvbmF0LmVzbS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjYyY2U0ZmI2MTdlNTQ4YTI0YmU0MDc0MjQxYTQzZmQ5ZDIzZjU3OTkxNDAxMzI3NGUwNjYwNzk3NGRiOGFjMDEwMmI5Mzc4MDgyMWJiZjZkNDk0Yzk1YWRjNTRjYTIxNDdiMTI1ODVhZDg5NjJiMzA0OWY0MjhjMWQ5OWEyMDJlIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL25vdGlmaWVyLXYwLjUuMSI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy9ub3RpZmllciIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjUuMSIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjUuMSIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2Fzc2VydCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2Fzc2VydC12MC41LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9hc3NlcnQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlci1wcm90b2NvbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTYuNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYwLjcuNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi40OSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNDkiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNDkiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiLi9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJleHBvcnRlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImE3NmRkNjgyOGJmZmVlOGJiODkwYWYzNGNjNTU4YzkwNmI0ZDVkOTk2MDQ4YzZiMjdiODYxMDAzNjQ0YTZjMDJlZTczOGEzMjMyODcxNjgyMjEyMzQyYTJmNjNkMjkzYzEzYTI0M2Q2MDdjMjUwOTM4N2I3NmQ4NWIyODIxMTMyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9hc3luY0l0ZXJhYmxlQWRhcHRvci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjRkYzk5N2ZiMjVlMmY1ZmM5ZTYxYzg3OTc5Mjg5MDA4OTc1NGMwMGQ3ODdiYTQ3YjI2ZDJhYTViNTZjYjQyNWFmNmQxMTY1YzUxODlhMGJhNDliYmMxODM2ZWJhYjE4NmJjNDgwNjYwNDViNjNkMDBkNjYwOTk0YmZiM2FiOTkyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjg2MzdkZWU0MjJmZWE3N2Y3ZDNlZTU3ZjVlNGExNThlMTFhOTg1N2EyOTAxMzRhZDNiNmRhY2VhMTQ3Yjc0MWRmYzE0OTA4ZWFiNGFiMjg2NjA4NDEyZWZmNzAwNWUyYWZhY2Y2OGJjNmNlYjkwNjdiNjg5NTIyNTRjMWQyOWJkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL25vdGlmaWVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9ub3RpZmllci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImUyMjkyOGY4MzkxZDNhMGNjN2ZiOGJiODhmZjIyY2MxMTA2Y2IxM2Q1Yjc0ODE1MGVlODBiOGY5NDQwNjNmMzdkNTExMDE0MDVlYTAwOTVkMzFkY2RmZjBmNDM5MTQ5ZTZmNmMxNDI2NTQxNDlmZDU1ZDAyZGZhYjU0NDkwM2RhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3B1Ymxpc2gta2l0LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wdWJsaXNoLWtpdC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImE3YTQxODQxNTY5ODlkNWE1MGY1NDc0NzljY2I4M2JhYjU4NjY0ODU3MzI3NmU5MTEwMDI4NTNmYTBkNGZlYTgzNTZkYWI0MmNiMTAzZjFiNTdhZmJjZTQzZGE2YjM0MWVkZWM2NzE2ZGM4YzQ4NzhhNDkyZTJjYjA2MTVmMzE3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0b3Jlc3ViLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdG9yZXN1Yi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjAxNjQ0MmZmNzdiNTFhZDBjNmUxMjMzOWIyMGQzYTY0NDk1Nzk3M2NlYzZmMGQ3ZmE5OGU0ZDY3ZGY2OTVkMGI3NjhiNzNiYWY3ZTRhY2YwNmZkZGRhYTM0ZjMyYTBhMjRmNjQ0Zjg5MWMzZDc2MjdiMGIxMzFlOGRlODk3NzBmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N1YnNjcmliZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N1YnNjcmliZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjMDM0YmZjNTkyM2E0YmZkZWUzMjU3MzRiYzI5NTkzMTdjNjdkMWNlMTIzMWMyNzZkNWZjZmVhZDZmMDQ4YzhiMTI1OGY0MzFmNmVlZTI1ZGRjMDIwYmNmZjBmMTk4NWE0NjE0ZjFlZDVmMDRkYmI4MTFlOTkwOGIzYzZhZDFiMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIwODliNzJmOTA4MTYzYzE1YTRmNDhmNjg3M2E1M2I5Zjc2Y2Q4NjkzNWQ2ODA1YWNjNDljMmI3ZTAxZjZiZmY2ODUwNDE5MDUzNmQ5OTg4MDQ2MTkxYTI2ZjNkMmVhMDc2NWQ0NzhmZjRjYjYxMGVjNWIxNWI1ODE0Yzk2NTJmMyIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy9zdG9yZS12MC44LjUiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvc3RvcmUiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy9zdG9yZS12MC44LjUiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy9zdG9yZS12MC44LjUiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9hc3NlcnQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9hc3NlcnQtdjAuNS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvYXNzZXJ0LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlcm5hbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjIuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNi41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbm8tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjAuNy41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjQ5IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi40OSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3NoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi40OSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICIuL2V4cG9ydGVkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImV4cG9ydGVkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZjI5ZmUzNTMwNWY4MDdkYTIzNWYwNjg4ZDNiNjVlMzUxMDM4ZGZiNTc0MGNmNzI4MWMyMGM0NTM4MjVmODNhMDY2Nzc2OTZkM2JlMmMwMTg0YmYyZDI1MDgxYTA4YjkyOTBkZWVjNjlhMzlmODg2MjkwMDE3Y2M4MmJiMDRjNmUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYmUzZDMzNDIwNDc4OTBjOWFmZjk2MGNkOTY0MWFkNWEyMDBmZGE1NDZkNzlhYzM3ZTgxYjhlNmI0NGVlM2VjNGJjMWFlOTE1OTA4ODllNTNmYjliNGIxZTVjM2ExNWIxMGE4MzFlNGQ4Njc2ZmY0YmNkZTg1MDlkYTBiY2Q1NzUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMva2V5cy9jaGVja0tleS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMva2V5cy9jaGVja0tleS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImQ4Mzk3YjBhYmE4YWRmYTAxOWE2MzU4YjFjZjkwMDJkN2JkNmJmMjQyZTU5MmZjMDA1ZDMxODI5Y2Q3MTgxNjE4YmMyZWE4MGNlOTQ3NWJiZjZjMWVlYzQzODQ3Mjc4NGU2NmIwODEyNWIyNGExZGI2NTM2NTgxYjg1YTJlNDg3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tleXMvY29tcGFyZUtleXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMvY29tcGFyZUtleXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0NDc1ZWIzYTBjZjU3OTJlZTFmNTA0OWU5OTBkMjcyYzZlYjJiOWE1ZWMxOGU3YTg5Zjc2MjExMjI4MjdiYzIxZjZmNGJjMGUyNzE1ZTc1OTU5M2M4YjE5NjJiMzZlZDQ4NTQyYWY2MWYxN2U4ZTkwZDk2M2Q1M2RhYTg3ODEyMiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9rZXlzL2NvcHlCYWcuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMvY29weUJhZy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjViYWI1YjgzNzhlNjEyZjQ2NzczN2U0Zjc5MTI2ZTUxMmMyODM2NWU1NzVjMGFlNmViYmZmOTIxYmJlYTViMjAyNTZhZjcxNmViNTY4MDA4ZWQxNjg0ZjcxN2JjYmQ3YjQ2ZThlOTNmNjllMTc0MGE3NGY4MTM4NTUwMjM1MTAwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tleXMvY29weVNldC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMva2V5cy9jb3B5U2V0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTU0YTBmZjY4MzdkN2ZhNDI2NTNmOGFkOGNmYmZhYTA0MzI4NmMzZTE2NmZjZmI4MWYyZWZkYTZjMzJiOWQ0MjJhOWIyZWE4MmUwOGEyZWQyZDI1NjgyNzYyN2MyMDU1YzE1M2I4ZDJlMTJlODhhZWE4NzUyODk4NzY0NDE5NTAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMva2V5cy9tZXJnZS1iYWctb3BlcmF0b3JzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9rZXlzL21lcmdlLWJhZy1vcGVyYXRvcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlMTZmZmQ2NGM4NDU4MDMxYmIyODExZmZmZTk3ZTg5MDJmZDQxMTBmZDA2NzEwYjBlNTc4YTVhNTM2ZWQwZGUzZjEyNzg4YTBkOTY5NjM3N2Q5NzQ5OThiZTQwMDRkMzVlMjExMzg2Y2RlOGRiYmVkYmJmNzBhYzVkY2E5YWVhNSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMvbWVyZ2Utc2V0LW9wZXJhdG9ycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImFlM2I5OWFkYTE5NjNkZGFjMzdlZDUwMGYxZjkxYWM1YmE4NDU0NThkZjNiNjk2ZmQxNmUzYWUxZTI4Y2M3YjljYzIzYzQzZjIwOTY3NjFhM2IyZGI2Y2E4NWJhN2Q4OTU5OTEzNWQ3MzIxNGQ3NmVmMDY5MmQ5OGE1ODg1ODkzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2xlZ2FjeS9sZWdhY3lNYXAuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2xlZ2FjeS9sZWdhY3lNYXAuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIwZTUzNzdlMjM0NDdlNmRjZGIzMDM3ZDI1MWU3YzU0MTEzY2RlODFhZWVjZGZkNWZhYTMwMjMxYmIzZGZhMzgyNGNhODZhOWUyNmIwMzE3N2UxZmY4NmQxZjEyNTY3OGRjNzc1NTBkMjUzYWJiMGE5MGZiZDRjOTllYzA5MGFlNCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9sZWdhY3kvbGVnYWN5V2Vha01hcC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbGVnYWN5L2xlZ2FjeVdlYWtNYXAuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjMjIyOGYzYjg4NzVmNDA3OThlZDE2MmU3NzkxM2U3ZjNkZDExNTRhMTViMGI0NTYwZjI3YjFhZWFjMWFjOGE1NjQ5YWFhMzgyMWYwY2YzY2Y3ZjIzMTJkYWM4OTBmZWFjYjMwYTgyOWU1MmUwODJjMjE2NzA3YTBmZjljN2FjMSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXR0ZXJucy9lbmNvZGVQYXNzYWJsZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGF0dGVybnMvZW5jb2RlUGFzc2FibGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4YThkM2JjYjFlZjhiNTU5ZjY2NTY4Zjc3NDRlYTRkZDA4NzI0NDBmMDJlMzBlY2NiYWM4MmE3YWI2ZWQyNmU5OTdmNTI1MzMyMWQyMWVhODUwNmZhNzI3YzY3NTY3NjA1YmVjODg1ZjQ5YjcyZDU0MjdhNTU0OWI0ODczODliYiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXR0ZXJucy9pbnRlcmZhY2UtdG9vbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BhdHRlcm5zL2ludGVyZmFjZS10b29scy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjgyOGJkZWRlNGZlNGI5YTE3MDRjM2I1ZmY4ODE1NDc5NTEzZTk3MTk3Yjg1NGU2OGMwZjU5MzcyMjRiYjBiZGYzMjI4MDE0YjVmMTA5Y2E5MzZhZjkzYzY3ZmIxOWUwZmY5MTY0MTEzNWY2NjMwM2U4MDE1ZDViMDQ0ZWM0ZmRmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BhdHRlcm5zL2ludGVybmFsLXR5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXR0ZXJucy9pbnRlcm5hbC10eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjU2ZWM5OWM0MTVjZTA5YTg5ZDljOTJlOWRjZDY5ODllNThlMTQ4Mjg2YjY1OWM5ZjBlMGZjYTNmMjQzNjBmNjA4OTdkMzY0YjA5NDhiYWZkMWUxZWQ5MGM5NmExNTFlNWZhOGI5YzdmZjhhNTAwMzYwMzgxMmViNDQyNTQzMzRmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiN2QxNjM5NzQ3MmQyNDE4MGRjOGJiOTI4NWY2Y2Q3MzJjMTA4Y2UyNmZiNWRhN2IxMjUwZThlY2YwODkwZjk5MTA0OTI4ZjU1MzQ1MjNkZmQ4ZGZlZjdkM2MxZmVkZDFiMmE2N2U0ZTJhMDBmOTc1OGZhNGExMzFmM2VjN2ZkZDkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGF0dGVybnMvcmFua09yZGVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXR0ZXJucy9yYW5rT3JkZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhYjlkZDA0ZTBlMDZlODg4MTRlNzZkZmIxNmJjMzA1YTc1M2E1ZWUyMDg1YjBlYWJkNmY3MzQ3ZDY0NTE0NGNiYTUzNDZiMjhjZjJkZDViYWQ1ZTI4NGYwZmU4MGFjYTAxMTJhZmRkM2YwOGE1MjlhZGFiMjM1NzkzZDgzZTUwMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdG9yZXMvc2NhbGFyTWFwU3RvcmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0b3Jlcy9zY2FsYXJNYXBTdG9yZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjUyMzgwOWFhMTg2MjQ0MTY1OWQ3MTYwYjlmYWYwNjliMzk3NDY3YzY2Yzg4MTcyZjhhNjBkNzJjNzkxMWJjOTc4ZGQ2Zjc1MGE2ZDEyMjNhYjUzYjQxNjRiN2MyMWEyYmM2NmE1YWQ3ZjQ0ZmY2YjlmY2ZhNzhmODQ5YzZhOTRiIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0b3Jlcy9zY2FsYXJTZXRTdG9yZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RvcmVzL3NjYWxhclNldFN0b3JlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzI0MDg0MzI1Zjk0Yjg4YTJlZjI2ODgxNzFjNjgzYzVhYmNmYmE3NTFiMWNlYTY0NTRlZGUyODliYTQzOGQxOTZkZWNlN2I0NzkyODlhYTJhY2M0OWNlNmJlMjA0ZTVhZDljNTI2NTQ1MjgyNGUzODY2N2Q4NDg2N2Q4NDAwYjIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RvcmVzL3NjYWxhcldlYWtNYXBTdG9yZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RvcmVzL3NjYWxhcldlYWtNYXBTdG9yZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjYxNTQ5MGFhYjU0MjEwMjBiZGIxNmU5M2I1MTQyZTVmNjFhY2YxZjhmNGQzNmE1NzAzZDNmYTNkYTdjZDg0YTlmMGViOWZhZWEwZjE2ZjhhYzQwNGE0ZDA1MTM1NTYyMGY0Y2Y3MDVhMmIwODQ1Yzk1Mjg3MTQ2MDJhZjEwOTc3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0b3Jlcy9zY2FsYXJXZWFrU2V0U3RvcmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0b3Jlcy9zY2FsYXJXZWFrU2V0U3RvcmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjNTlhZDg0NDgyNWFjOWI1NGY5YWJjOGZlMGIzYTliZTMzOGY4NmNkNWMwMzJlYjVjOWM5NTVkMzgyM2Y5YjQ4MTU0OTIwY2I0ZTFiMzlhNjM4YjdhZWY2NDgzYzZhNjgxZjA3YzBlMTQxNjliYzM4ZjhhNDUyMjM3ZWUwNTkxZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdG9yZXMvc3RvcmUtdXRpbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0b3Jlcy9zdG9yZS11dGlscy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjA5OWM4OGY2NzUwYWE4ZDBlM2UwMzQ1ZjNjNzg2M2U1MDhjN2QxNTZkNGI4ZDE3YWRmMzBlMTkyZDU2NDhhYTU3M2MzMDRhNDEyMDQ0ZTkzNDE0ZmYyMTBjY2I2NDhlYzlkODg3MmQ3YjUwMmZjZjJlOTA2MDljOGJiZWM0MGU4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImQxZDY1NGViZDcxOWEwYjI2NGQyODMwMGMwNGY2MjM0ZTc0MjNhZjE2OWQxZGQ2NjVmMjlmMzUzNDk5OWFjOWY0NzkzODY4Yzk1OTg0ZmRkYzRjZWU5YWRiNTk5MTYwMDU4MjA0OWYwZmRmNDk0MjZmZmI2MjYyZTBmY2M5NGEwIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL3N3aW5nc2V0LXZhdC12MC4zMS4wIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL3N3aW5nc2V0LXZhdCIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL3N3aW5nc2V0LXZhdC12MC4zMS4wIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvc3dpbmdzZXQtdmF0LXYwLjMxLjAiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9hc3NlcnQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9hc3NlcnQtdjAuNS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvYXNzZXJ0LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlcm5hbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjIuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbmF0LXY0LjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZGlzdC9uYXQuZXNtLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC41LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N0b3JlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3RvcmUtdjAuOC41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zd2luZy1zdG9yZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N3aW5nLXN0b3JlLXYwLjguMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL3N3aW5nU3RvcmUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy92YXQtZGF0YSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3ZhdC1kYXRhLXYwLjQuNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMveHNuYXAiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy94c25hcC12MC4xMy4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYmFzZTY0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Jhc2U2NC12MC4yLjI3IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9iYXNlNjQvYXRvYi5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9iYXNlNjQtdjAuMi4yNyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vYXRvYi5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9iYXNlNjQvYnRvYS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9iYXNlNjQtdjAuMi4yNyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vYnRvYS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9iYXNlNjQvZGVjb2RlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Jhc2U2NC12MC4yLjI3IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9kZWNvZGUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYmFzZTY0L2VuY29kZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9iYXNlNjQtdjAuMi4yNyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZW5jb2RlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Jhc2U2NC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYmFzZTY0LXYwLjIuMjciLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9iYXNlNjQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9iYXNlNjQtdjAuMi4yNyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9idW5kbGUtc291cmNlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2J1bmRsZS1zb3VyY2UtdjIuMy4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYnVuZGxlLXNvdXJjZS9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9idW5kbGUtc291cmNlLXYyLjMuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZXhwb3J0ZWQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYnVuZGxlLXNvdXJjZS9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYnVuZGxlLXNvdXJjZS12Mi4zLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jYXB0cCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jYXB0cC12Mi4wLjE1IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY2hlY2stYnVuZGxlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NoZWNrLWJ1bmRsZS12MC4yLjExIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jaGVjay1idW5kbGUvbGl0ZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jaGVjay1idW5kbGUtdjAuMi4xMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vbGl0ZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jaGVjay1idW5kbGUvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NoZWNrLWJ1bmRsZS12MC4yLjExIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MC43LjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIvYXJjaGl2ZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuNy4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vYXJjaGl2ZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIvYnVuZGxlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MC43LjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9idW5kbGUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyL2ltcG9ydC1hcmNoaXZlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MC43LjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbXBvcnQtYXJjaGl2ZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIvaW1wb3J0LmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MC43LjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbXBvcnQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyL25vZGUtcG93ZXJzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MC43LjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9ub2RlLXBvd2Vycy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MC43LjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE2LjUiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ltcG9ydC1idW5kbGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vaW1wb3J0LWJ1bmRsZS12MC4yLjUzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vaW5pdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9pbml0LXYwLjUuNDkiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2luaXQvZGVidWcuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vaW5pdC12MC41LjQ5IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9kZWJ1Zy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9pbml0L2xlZ2FjeS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9pbml0LXYwLjUuNDkiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2xlZ2FjeS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9pbml0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9pbml0LXYwLjUuNDkiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9pbml0L3ByZS1idW5kbGUtc291cmNlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2luaXQtdjAuNS40OSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcHJlLWJ1bmRsZS1zb3VyY2UuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vaW5pdC9wcmUtcmVtb3RpbmcuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vaW5pdC12MC41LjQ5IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wcmUtcmVtb3RpbmcuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vaW5pdC9wcmUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vaW5pdC12MC41LjQ5IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wcmUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYwLjcuNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NC4xLjIwIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjQuMS4yMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNDkiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjQ5IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjQ5IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3ppcCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby96aXAtdjAuMi4yNyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vemlwL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby96aXAtdjAuMi4yNyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3ppcC9yZWFkZXIuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vemlwLXYwLjIuMjciLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3JlYWRlci5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby96aXAvd3JpdGVyLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3ppcC12MC4yLjI3IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi93cml0ZXIuanMiCiAgICAgICAgfSwKICAgICAgICAiYW55bG9nZ2VyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogImFueWxvZ2dlci12MC4yMS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9hbnlsb2dnZXIuanMiCiAgICAgICAgfSwKICAgICAgICAiaW1wb3J0LW1ldGEtcmVzb2x2ZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJpbXBvcnQtbWV0YS1yZXNvbHZlLXYxLjEuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAibG1kYiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJsbWRiLXYyLjUuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAibWljcm90aW1lIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIm1pY3JvdGltZS12My4xLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4IgogICAgICAgIH0sCiAgICAgICAgInNlbXZlciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJzZW12ZXItdjYuMy4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zZW12ZXIuanMiCiAgICAgICAgfSwKICAgICAgICAiLi9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJleHBvcnRlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjEzZmM2NmE5ZjBhYTdmMGUwZmM1ZDRhZDA0NzRmZTU4YjE0ZDlkNDdlYjA1ODg0NDIxY2FhODRmYmRjNjI2YzFmY2E2ZGEwODNjMTU1YWVlNGIyYjRhNmY0YzdkMDYyZWY1NGUzZGQ3ZTVhMjcxMDYwYjZmZjZjZmEzNzA0OTJlIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3ZhdHMvdGltZXIvdHlwZUd1YXJkcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdmF0cy90aW1lci90eXBlR3VhcmRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMmY0MTA4N2NmZGY5ZTdlNGYyMzgwYTkzNmZkNTU1ZmJkNmZkYzUwMGU4Mjc2NzM1MzQ3NTA5MTU3YmIwMTAwMDk4N2JlNDhkNWMzZjNiNGUzMzg1YWM4YWRlYzA4YzE3YTkzY2QwZmNiMGMwZDMyNmY4Yjg4MDVlMDAyNTlhYzciCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvdmF0LWRhdGEtdjAuNC41IjogewogICAgICAibmFtZSI6ICJAYWdvcmljL3ZhdC1kYXRhIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvdmF0LWRhdGEtdjAuNC41IiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvdmF0LWRhdGEtdjAuNC41IiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvYXNzZXJ0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvYXNzZXJ0LXYwLjUuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2Fzc2VydC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVyLXByb3RvY29sIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXJuYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4yLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N0b3JlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3RvcmUtdjAuOC41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZmFyLWNsYXNzLXV0aWxzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9mYXItY2xhc3MtdXRpbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyZDg1MWZhZWQ0ZDM4ZTdjMDIxMTExYWE1MDhmMDczZjMxZjYwNWJiNDEwZWZlYTAzZDllNGE5OTRjZTdmZTcyMmMxMzQ5MzdlZDA3ZmI2YzQyZmQ0NzA4YjQ4MzE4ODhhZDNmNzlkNzIzZTE2NWRjODExMmZkMGEwNGQzNjE3ZCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmMDRjYzQxNjk1ZjdkMmQyZGUxYWU2OTNhNTNjODk5NGU1MWVhMWExYTIzZThmOGIxMjAxYzc0NTA5YzU4MjViNDQzMzRmMjVjYTk3YjA0ODliNzM4M2U0MjZmZDNiN2FlNDg1ZjJjYTFiNGMxNDMzYjE1YjdhZDQzNmU2NjdlOCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9raW5kLXV0aWxzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9raW5kLXV0aWxzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzJiYmJmMmI0OTZkODBjNmIyNmM4MzY0M2M1ZjcyODFlY2E3YjYwMjBiNjA2NGQzNzk2Mjg4ZjczYjQ2MTEzM2U2Y2I5YjlkYjBkOTJhYzc0NmJiMDFlYmMyZmI4N2E4ZTFhMDk3YmIwZTUxMTI2MGQwZTdjZjQ1NWQ5MTY2MDEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdmF0LWRhdGEtYmluZGluZ3MuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3ZhdC1kYXRhLWJpbmRpbmdzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMmMyNTkwZGRiY2ExYzc3NTI2NzgwNWQxODljYWI4Y2RlZWJiMzg5ODMyMDA2Y2ExN2EwZjAzYzQ5ZWE1N2ExZTQ1ZWNmNGQ3NTM5OTc2NjcxNDlhZDdjZmU0ZTM2NDAxNDM5YTJjZWQ4OTY4YjFkNDhjODQyMDcxMjI0NzIzMTQiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvem9lLXYwLjI1LjUiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvem9lIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvem9lLXYwLjI1LjUiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy96b2UtdjAuMjUuNSIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2Fzc2VydCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2Fzc2VydC12MC41LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9hc3NlcnQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9lcnRwIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvZXJ0cC12MC4xNS41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9lcnRwL2V4cG9ydGVkLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvZXJ0cC12MC4xNS41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9leHBvcnRlZC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVyLXByb3RvY29sIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXJuYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4yLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25hdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25hdC12NC4xLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2Rpc3QvbmF0LmVzbS5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9ub3RpZmllci9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjUuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZXhwb3J0ZWQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zdG9yZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjguNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3RvcmUvZXhwb3J0ZWQuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC44LjUiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2V4cG9ydGVkLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3dpbmdzZXQtdmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3dpbmdzZXQtdmF0LXYwLjMxLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N3aW5nc2V0LXZhdC9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N3aW5nc2V0LXZhdC12MC4zMS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9leHBvcnRlZC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N3aW5nc2V0LXZhdC9zcmMvdmF0cy90aW1lci90eXBlR3VhcmRzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3dpbmdzZXQtdmF0LXYwLjMxLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy92YXRzL3RpbWVyL3R5cGVHdWFyZHMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy92YXQtZGF0YSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3ZhdC1kYXRhLXYwLjQuNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2J1bmRsZS1zb3VyY2UiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYnVuZGxlLXNvdXJjZS12Mi4zLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9idW5kbGUtc291cmNlL2V4cG9ydGVkLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2J1bmRsZS1zb3VyY2UtdjIuMy4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9leHBvcnRlZC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9idW5kbGUtc291cmNlL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9idW5kbGUtc291cmNlLXYyLjMuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNi41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbm8tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9mYXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZmFyLXYwLjIuMTEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9pbXBvcnQtYnVuZGxlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2ltcG9ydC1idW5kbGUtdjAuMi41MyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MC43LjUiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNDkiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjQ5IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjQ5IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vZXhwb3J0ZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiZXhwb3J0ZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmZDI1NTE2NmUyNDhkODMwOTdkZjg4MTc2YmE4YjI1YTU5YzBjYjI4OTIwY2U2YmM0YjhlNWZiMGJlNGI0MzY5MzYxYjQwZWQ1YWJkMzk1NDQxOTE2ZWRiZDQzMGI3MDFlYjlkZmRkY2QxMWEzNWRmOWJlNDE4OWQ1YjYwOTlmMiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jbGVhblByb3Bvc2FsLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jbGVhblByb3Bvc2FsLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYzRlY2EzZjk0MGIzNmMwYTgwYWE0YzY0ZDcxNTA3ZTkzYzI3MDA5MDYyOTI1NzNiZWZlYzAyZmI4MDc2NDg4NzJiZWFkNzA1MDA3MDEzYTYxOWM3Zjc4ZTc3MGYxOWQ4NWIwZDljNGE1OWJmYzliMzEzNWUyOTY5YmQxMjQ3NDgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RGYWNldC9vZmZlclNhZmV0eS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RGYWNldC9vZmZlclNhZmV0eS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImU5MGMzZWMxNzE0NWZhNmU5NDAxYjMwNWQwMTg3YjVhOTViYjMxY2E5Yjk4ZmU3NTg1Yjk4MmU2NGEwMWZiODk3ZDAxZjdmYzlmYWViNTQ2OTk5ZmYzMDVjZjYxODY1ODNiMWY5Y2U0YzMxYmFkODExMDk5MmZjNzg2NWNhOTVhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0RmFjZXQvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0RmFjZXQvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1ZmVkZGNmMmRkNmE5ODk4OTBlYzJjNzk5ODU2NGU0MjJhNzNjODVlMDliMjc3YTZhY2U4OWY1M2RkZDE0Yjk2OTVjZWEyMGYwZWJiZDE5MGY0MjBmNTVhNGY4MDBkZmJjZDFhZGVkYjVjNjRjY2Y0NGUyYzk0ZjcxZGJlZjQwYSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdFN1cHBvcnQvYm9uZGluZ0N1cnZlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RTdXBwb3J0L2JvbmRpbmdDdXJ2ZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmZGNiMGRkMzQwOTc2MWU0ZGNjY2ViYmMwMWNjMGQ2YmQzYWE4OWM1ODU1MThhMzAyZGQwY2ZlZmNiMDYzYjZkOGMzMzAxZTlkZGRmOWZlNDI1MWY2YmFmZmU2MDc5MmZkZTAyMjY4ZGQxNjQ3ZWVjODk2ZmQ3MTE5ZDljZDI1OSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdFN1cHBvcnQvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0U3VwcG9ydC9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNjMTZkMzgwMjljNDA4MDFkYjAwYjQ3OGQ5MjhiODIzMDY5NDNjOWQxMTlhZWQxODc3MDNlNzkyMGUxZTFhZjA1OTMwMTYzZjA0ZGNhNDMyODEzNTU0ZTk2YjhhZWM3NzY1YjUwZWU3NjUyYzZmNWUwZDNjMWVmODQ5ZDFjODA0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0U3VwcG9ydC9wcmljZUF1dGhvcml0eS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RTdXBwb3J0L3ByaWNlQXV0aG9yaXR5LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZmFiMmZhYzc3YjA2MTEyN2U4MGRkNjMzN2FkMWQ2MWVmZGRhYTg2ODgzMTM4ZDc5MGYxYTAyODNhMTI2NDBkNGVkYmE1ZDIwYWE0NDIxYjljZjViZTJhMzRhNzg2NDQ1ZmEzOTg4ODM3ODRhZGY0NDM5MjEwYTYxMjdkYmZjZjYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RTdXBwb3J0L3ByaWNlUXVvdGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0U3VwcG9ydC9wcmljZVF1b3RlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTFhODhiZWZlODhhZjY3NDU5ZmI1NzU2ZWE5ZmI5OWRkNGQzY2IyOWM3ODVkNjYwZjlmMGVlMDM2OGE4OWJjMDA4ZDQ3ZDc5YTdlYTk3M2YyNmMzMmI2NzMyN2RiNmM5NTI2Y2I0YzA1NjFkZjJiMjVmYTY1NjlmMzU2NzE3YmMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RTdXBwb3J0L3JhdGlvLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdFN1cHBvcnQvcmF0aW8uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlYTk5NGQxMjlhZTkyMzk1MTUwMTg2MTM2OGY2NmE0OWE1ZjhmZTk0MmMxNTZiMmVmOTI2NjZhODM5YWJiYjFlM2NhOWRjNzQ3MzcxMDg0MGRhMDdhZDliYzU0NTIyM2Q0ZDExYTRkZWQzNDc4NDkwNTJkYTg1N2M3NzhiZjY3MSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdFN1cHBvcnQvc2FmZU1hdGguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0U3VwcG9ydC9zYWZlTWF0aC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjUwN2Q1N2MyZjI3M2E2ZDQ2MmE2NTNkOTE3NmVmNzgwZTQxMGIzOGFkMTY0MzA3MDAxZWM0YmM0ZTNkMmFmODg1YTA1OWQ3MjlkYmNjYzM3ZmQyYjdlMDAwMzU1NGNlYzQzMjgxOGZlNzZjZGQzZWMwMDIwOGE4N2RjOTViMTdjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0U3VwcG9ydC9zdGF0ZU1hY2hpbmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0U3VwcG9ydC9zdGF0ZU1hY2hpbmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxYjFkOWZjZGY3MDhkNWViZmQ4YjE0MTAxNTVmYjY5YWEzYWUwMjgxYjQwMDg0ODAxY2E2MmJmOGZkYWY0NWYxYWVhZTJiYjNiMGE1M2IzYTJlZjg4MzRkNTg5ODI2N2YyNGJkYjUyOGQyNDY4ZjI3OTUwZTkyMzRkYTRiYzJmNCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdFN1cHBvcnQvc3RhdGlzdGljcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RTdXBwb3J0L3N0YXRpc3RpY3MuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxYjQ5NmM2MzE3MThkODZkNzg0YWIwZDI1ZjdiZmZhMDU3N2Y1NmE3NzdiMzQ3MTRkYjE4MjMwNGE5OTg0N2M1ODAwZDdhYWQwYzViOWJlNDcwNzBiNjViNmY5MmYzYmJjZjRjMmEwOTc5MGJmM2I4YTk2NDVlMDMzMzQyZDRhMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdFN1cHBvcnQvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0U3VwcG9ydC90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjRmN2E1ZDY4YzJlNDA3ZjljMDA4ZDA2YzNiYzJkNTc0ZjdlNDk5ZmE5MzcxMWYyYmQ5YzgwN2JkODVlMTQzMzRiNTY1ZDkxOTE5ZjdlMDI5ZjRkOWE5Mzc3NDYyZmQyMzRmODQxNmI1ZWYwYTAwZjhjNGViZjczZjYwMTg4YzUzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0U3VwcG9ydC96b2VIZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdFN1cHBvcnQvem9lSGVscGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjVjMDcyNzhkNDAwZWYyNzI3MzhlMTVlMjEwNTgxZTMzNGJiNDc4NTUxNWIyY2NhNGY0ZDViYWMwNTk3ZDk5OTBjYzU0YmNkMDE5ZjllZWY0YmM1YTcwYWQ2OTg5ZGQzZmNiMjI5Yjk4ZGIzYTU2YWM4NzMxOWZiMGQ0OGViODY0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0cy9jYWxsU3ByZWFkL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdHMvY2FsbFNwcmVhZC90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjE0ZmI3Yzk3NDUzODY1NzQ1ZTUyMTQxZjE3ZjVjMmU3NDRjY2ZjNDU3YzQ5YmVlYTg5N2M0ODIzZGMwMThkOGFkOGQ3YTU1Zjk0M2Q3NGQxMWVjNmE2YTY4YmM5MzM5NWZkMmRmMjk5OTRhOGQ3YTkyNzYwYzgyZTlhMjYxZDY5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0cy9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RzL2V4cG9ydGVkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDIxMWI2NzhmN2IzNzFjMzhjZGU3ZGE2Mjc1MTM1NWM4YThlZjliMjU2NjMzNWZmMDM0YTY5ODdhMDIyNzU0N2RjZmQxYjgzYTgxNWRiNzVkMjc0YzA3ZWQ4ZWRhYzA4YTk3MWZmNzYzM2JmNGIwMWE5NjY2YjcxYjNjZGQ4NjYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RzL2xvYW4vdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0cy9sb2FuL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMmM2NTc0MmU1YjhiYTc2MzhlNThkZWNiMjI2ZTBlOTZiNWZjMDE5Y2VjNDlhYzViZDcxN2Y0YTEyMzc2OWNkN2U1ODE0YTA0MmU5Nzg4MzFhZWQzNGVmNzZmY2Q2Y2EwM2Y3OWMyNThlY2I2NjQzMDcxYmNhZWY0ZDYxNDhhYzMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RzL3ByaWNlQWdncmVnYXRvclR5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdHMvcHJpY2VBZ2dyZWdhdG9yVHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyZWI2ZDBlYTliYjhhODAyZGFhMTZhNjMzYTgzZGFhYTAyZTQ5YzdmN2EzMDBjMTRkMjYyNjU4YTM0NWY2OTcyODQ4MGVmZjcxNWQyMDhmNjIzNWM5NWVhZWU5ZjQxZTg0OGU4MmJmYWZmMmQ0MGNmOWYyZmQxYTYzZDRiODRjOSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdHMvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0cy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjgxZDQyOWEwODljYTVhYzMzNWY2YTkwZDIxYjUzMThmZGU4ODRhOWQyMzQ1NTMzNGNlNWIwMWVjZjk5Y2UwOTc5ODk4YWE0N2UwYzJkMzdiNmM4ZjI0MTJkODNkNGQ5MzA5OTFiMDJlMDUwYTMyYmM4OTczNjQ4MGExNDQ4NzEwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2ludGVybmFsLXR5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbnRlcm5hbC10eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjU4ZmZkNDEwNDk0YzdhZTIxNjNiZmE0YWY3ZTMwMGNlNmQ5Yjk4ZDJjMTQ2YmMyOGI3MjUxYmVjYTZkOWRjMmU5ZDc1YTFlYzQzNDVkNTI1NTQyNTU0NGIyMjQyOWQ5MDU2Y2ZjOGQyODgzYzliZTliOGUxZDI5OGM1NWJhZDU5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21ha2VIYW5kbGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21ha2VIYW5kbGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzNzI4ZDZmODU4NDRlMDVhZDY2MzIzNTNiOTFjNzE0NDBiZTYwMGUxMDFjZGQ1OWIxYzcxOTY0OWM1ZjNlZjk4ZjZhYWQ5NjA2OTk3NTY2N2QwN2E2NTJjZTJjY2I3YTA3MGM3YmY1MWZhYjE0NjAwNmRkYzRiN2Y3ODY0MDYwYiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9vYmpBcnJheUNvbnZlcnNpb24uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL29iakFycmF5Q29udmVyc2lvbi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjMzOWIwMGEzYWU3N2NhNDFhN2NkMzVmNDk1ODhjYzRlNWU4ZTJmM2FlMjVhOTI3N2EyMTZjYmU0OGM4N2MwNmNjYWMxNDcxNjQ1MWI4ZDQ3ZDI0OTQwZTRmYjY0ZDRkNWU5NTk4MTc4ODJhODZjMTViY2E0OWRlMDI3NjRhZjRlIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVHdWFyZHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVHdWFyZHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxYzRkMjdmOTk2NTE5YTJhOTU0YmE5NzJkNTJiNjdhYzgyMDJmNTYwYmM0ODUwNWE5OWNlMTAyZDhhNDhkMWRjNTFmZGQwODIyYTBmODIxMmE1N2FiOWNiZjUyNzcxM2VmMjI5YjJmMmNmZTljMTFiYTU3NGM0YWRiZDlkM2EyNiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzNzYzMzdkNTJjOGM2OWYxY2I0Y2JlMWVhYjIyZGNlYjFlNzU4ZTFmNDQxZTc3ZjU2YzU0ZTg3YzU5MDhmMzhkYmMzOGQwYjExMWRjY2QxNzJiNGM5ZDc2YTYxOTg3NTEwMGYxMDhhODQ1ZjE1ZmJlNjdiZWQ3NTA1ODkwMDVlMSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy96b2VTZXJ2aWNlL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy96b2VTZXJ2aWNlL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOWRjMmI5MTUzNmMwNzg3MzMzZDQ1YzEzYzQyMjdmZmFjODRlOGFmMWZhMjA3NWI0OTYxYTA1YWZlMDI0MjFiOTM3Zjc0OTY5YmE2ZTliNmIzNGVkYTc0OGQ5OGM5YzA4Yjk3OGZiY2Y0NGI1OTNhM2I1NDIyNjU1ZTMxYzRkZTEiCiAgICAgICAgfSwKICAgICAgICAiLi90b29scy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJ0b29scy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImI4ODQyZGFhMmM5MDQ3OTljYTU2ZjhhYmI5ZDI1OGM1MTllZTJhNjYxNTg3Y2E3MTBmODJlNGZhNmUwZDI2YWEwYmVjOWJhMTA5NDMxZTFjYjY4MjBhZmI4MWY1YWUyMmM5ZjBiODdlOTM0ZjY4OTI1OGMwMTQ0NzU0NDM0MTYwIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE2LjUiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL2V2ZW50dWFsLXNlbmQiLAogICAgICAibGFiZWwiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNi41IiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTYuNSIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2ludGVyLXByb3RvY29sIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL0UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL0UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmNTVmYzg5OTM0MzYxYmRmMjUyYTEwNGNkNmZiNGZhN2JhOTRlZDI3ZTkxMmRhYmU0YmZlMjdhZmM0MDYyMTU0NTcxMTY5NzdkNjg2OTg3ZDA2MjFiNTc4ZWQxMWY4MDExYmE2MjNlODdlMDAxMGJlMTFmYmFhYmQxNWFlNGQzOSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9uby1zaGltLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9uby1zaGltLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYjdjYjE5MzI1NjZjNGE2NGZjODc0ZTk5YWMxMTY4MDY4YmY5ZGFlYmZjOTUxNGZlNzc2YjdmYTQzYjdmOTZhMGIyMjhkOTE5ZjFjN2M2OWYzNDBhYTkxMDA1MzM4ZDI2ZmMyY2ZjZDMwZGJhZjJlOTQzZjMzNDBkMzFmMTE5NGEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHJhY2stdHVybnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3RyYWNrLXR1cm5zLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDJjMmU5MmZhYTAxNTU3ZTZmZjk5MGQ5N2UwNDYyZDYzNGJjMTUwMGRiNTE4YzdlZTBmNmZjYThlZThjMTU4YjM3M2ZlNTNlMzRiNjU4ZGYyMDgzYzg0NDg3ZDljNWFmZDdiNTBiZmFjMWM3YmYyYWYxYTQ1ZTVmOTA4MjJlOTYiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL2Zhci12MC4yLjExIjogewogICAgICAibmFtZSI6ICJAZW5kby9mYXIiLAogICAgICAibGFiZWwiOiAiQGVuZG8vZmFyLXYwLjIuMTEiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vZmFyLXYwLjIuMTEiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9pbnRlci1wcm90b2NvbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTYuNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYwLjcuNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMjg2OGQ4M2E1NWE2M2QxNmJiNTQwN2IyMzg3NzU4YTEyNjZiNTZjYzU4ZTRhY2ZhYzhhNmUxMmEwMzVmNTg5ZWI3M2YxYmEyMzFkYWQxM2Q1YzY1Y2U0OGVlYjJkNjI2MjgxNDIxMTg0MmRmMzkxY2JjNDRiZWJjNmUwMDBjMjIiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL21hcnNoYWwtdjAuNy41IjogewogICAgICAibmFtZSI6ICJAZW5kby9tYXJzaGFsIiwKICAgICAgImxhYmVsIjogIkBlbmRvL21hcnNoYWwtdjAuNy41IiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL21hcnNoYWwtdjAuNy41IiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE2LjUiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjQuMS4yMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY0LjEuMjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjQ5IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi40OSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3NoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi40OSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZDljZWYzNmEyMTcxNTAwOGFiYTVlOTI5NjUzZjI3MjA4YzY2YmI3OThmNDBjYjZkMzMyZGZlNDM5ZGRhY2FkYzU2MjJkNWMwMDhmNzY1NzI0MjE3MTIwOTY3Y2JlOTI0ODBmZjM1NjZmMWQ5MmMyMWRiOGNhNmY4ZTBmOWRmMjEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9kZWVwbHlGdWxmaWxsZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0MzhhMDJiZGRmNmVkYTVmODlkYzE3OTI0OTNiZWYzMDVkMGM4Njk5ZmE1Y2QxYTVkNGVmZDk4MzZmYzRlOWY1ZWIyZGRkODZmMTNjYzFiNDY3MTQ0MjNlOGY4YTU5ZGEyZTAwM2QzODJlNWU4NWEwYjczNzlmN2FjMWIzYzBiOSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbmNvZGVUb0NhcERhdGEuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2VuY29kZVRvQ2FwRGF0YS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjJhYjk0YWNlNGI3YjBhMGM2MzAzOWVjMGFkMjZhOWQyM2FhMTM4OWVhZTYzYmQ1OWM0MDIyMTg2MzViYWEwN2JhZTk5MGMyZjJjMTQ4YjgwMzJhMGFjOWM4ODUxYzExODcxMDg2MzNhYmQ4MTllMzE4NDQ5NDE3NDZmODFiOGU3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2VuY29kZVRvU21hbGxjYXBzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9lbmNvZGVUb1NtYWxsY2Fwcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjA4ZGE4NmVkOTUyZTI5ODY3YmQ2YjI2ZjM1M2ZjZjc0MWEwMTE5NDZlZTI0Mzk5ZDhhYzhmYjUzZTkzMWYwYjZhY2VjZDU2ZTk0Y2YyZWNiMGFiYzJmMDA1NTBmZTdlOWM5ZmY4NWYwYzc3NDVkMTQzNTE2OTM3Y2MwMWQwNDE3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2hlbHBlcnMvY29weUFycmF5LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9oZWxwZXJzL2NvcHlBcnJheS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjgzMjc1Zjc4NGUyMWE2NjAwZmRlMzUyNzViYjE2MzFlOWQyY2QxZjY2OGNiYjQwNGFmM2MxZTQwYjQ2NGMxMWY1N2U3MmQ1NmY4YmMzMDI1OWVhY2ZlMGMyYzk1NTVlZDhiOTg5ZGIyZGU2MmIwMjk0OTBkMmZiYTU3YWRjZmEwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2hlbHBlcnMvY29weVJlY29yZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaGVscGVycy9jb3B5UmVjb3JkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDIyZjY3MzY1ZDIyYjFmYWVlNjZkY2RkNjFhMGVhOTE1Y2FiMTFmZjIwNWExNzExNDUwODQxYWIzMjBjOGI4NWYyYThmODI0ODJiNDc5M2MxYTA5YmJiMDdhZDMyOTI5YTcxZDc0NTMxMTZiYWM2ZmQwOTIyZmJhNWE0OWM0NzciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaGVscGVycy9lcnJvci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaGVscGVycy9lcnJvci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjdmMGNmNjlhMDkwYWJiMzhmYjZkODRlM2RjYjAyMjUwMmQwMWZjZDA4YTVhZTU3NzEyOWMxZTdiNGJlNjc0OWI5ZjQwMWFkMDFhZDFiNWFjMjIwNDU2OTgwYzBmMjVhZjg1NzAzYmZlZDdiMGEzMjEzYjI5ZjhlNDdlY2M1NTI1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2hlbHBlcnMvaXRlci1oZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9oZWxwZXJzL2l0ZXItaGVscGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjJkMTExZjFiNmMxODllNTIwYWNlMzVlZDhlMGJiYTZhYTZkMjA3ZWU4NzgxZjZhNzY5ODgxM2Q1NjFjN2VjOWFkZmEyY2NiZjRmOGZhNTIxNzc1ZWQyYTIxMGM0NDdlMDE3NGI3YTM2ZThmZmJkMGYwZWM3NzcyN2NkZDFjODIwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkOWNhZmU1MTM0ZjEzNWY2NWE1NDNiYmU3MWMyNGI2MzFmYzlmN2I1MGY1YTljMDFiYzMxMmMzNzNkNzlmOGVkNWUxOWMzMjA1MzFkZmI5MGZiOTNkMWYyMGM1ODZjOGJjOGE5YmIyYjU1ODBmNjdjZThlM2M3NDQ4ZDM5ODM4MCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9oZWxwZXJzL3JlbW90YWJsZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaGVscGVycy9yZW1vdGFibGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkMWNjYzkyM2NjOTI0ZmM4MmUyYWFlN2IzMDMyZjMwY2ZjYWEwOGE1ZTBkNWUzNDFiODIzMTIyN2I1NDU1Yzg2NzY3NTlmZTUxMDlkZTllN2IyMDU2ZTM1MDQ4YjJlNjZmOGYwMzVmZjgxZWY0MjAzZjg1MmU4ZTBjN2E1MTg1MCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9oZWxwZXJzL3NhZmUtcHJvbWlzZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaGVscGVycy9zYWZlLXByb21pc2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiZjBhNWIyYTJiYjYzOWZkZDM2NmYzOGVlYzdjM2EyZDVjNWMyM2VkMzRmMWQyYmVlODg3NTEyZGIxODA2YjZjZTJlY2JlMzk2MmI4ZDA0N2Q1YzNlN2I2MjEwYTM0MDJmZDBkMTZlZjc1MzU1ZGViODc3MmM5MzZiNjE0NjkyNiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9oZWxwZXJzL3N5bWJvbC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaGVscGVycy9zeW1ib2wuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0OWEyZGQ2MjdmY2E1YzVhYjU0Y2VmMDU5NDQwYzExNGQ1YTAzNDg1Y2I1NDY4YmMzZWNjNjQxY2VhNGE0MzFmNmVlYjMxYWQxNzE4YjQ4ZjgzYmRjMWQwZjI1MmE1Mjk0NTQzNjRhYjU3YzY4MDg5OTIyYTQ3MTI4MzBmYzBlNiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9oZWxwZXJzL3RhZ2dlZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaGVscGVycy90YWdnZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0ZDA1Y2YwYzViZjAxOTg5MGUxODg1OTkzNjI1NGQyYzIzNTlkYmFjNjQ0MjI1OWJkMzRlNTg2NzJmZGU5OTNkYjlkNzlkYzE2M2I5MjVkOWRlMTQyYWYwOGMwZWRhMDdiZjdiOGFmY2Q5NzRkYzMyMTc1OWEyZWYwZjJiMTVkZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYWtlLWZhci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFrZS1mYXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlN2I5OWIyM2M1ZWEyZWM4MTgzYTZkYjNhMWYzNjk4Y2FmNmU4MjNiZDY5ODA2MzU0MjcyODk1YjY3ZmU2YThlMmZmNjNkYmE4MTg3MmFlNTJmMDM4MjQ0MTdmNzQzMzAyZWFlYzZkMGExZTZlMzQ4MDhlNzk0YzEwYzg4MTczYSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYWtlVGFnZ2VkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYWtlVGFnZ2VkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMzBiZTZhYTI3YTBhNmIxMmQ4NjY3ODU5MTAxOGQxMmU5Yzg4MWE3NGZlZDNkZGNlMWU3NzMzZTI5OTgzNTY2MDA1MmRkNDJkOTZmNjVhNGJkNTY2YjJhMWZlOGUyYWVmNWVkNTNmYjQ5MDUwYjc5OTQ1OWI3NDZkNDY3NTI2MGUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFyc2hhbC1qdXN0aW4uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hcnNoYWwtanVzdGluLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODA3Y2VhODQ2YzU4NmRlZTA2MmM1MDNhMjIwMDQyMzM0NjA0Yjk4M2FhNDJiY2U2NzNmYTZlZDcyNTJiN2UzZDVjNTlmZGRhZWM2OGY1ODMwZDExNmNhYzA4MTJkNmE3OGVjYzkyNDFiMDY1MzQ5OWI0MTZhNjU3NWJmNmRkMDUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYzk4ZjllOWEyYmI5MDJlMzQ2MTZlMjI0NzJhZGVjYTA1ZjFmMmY0ODdiMzIxZmViMDBmNjNmZjQ3ZjRmZGQzYmM1ODU4YThhNDBiNTE4Y2U4YjY3NGY5N2EwN2Q4YTljNzE5YjcyZjg3MDk4NmEzMGQ3NmY1Njc2ZTgwMTY4MjQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFyc2hhbC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFyc2hhbC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImQ2ZTg5ZmM0MzEyZGU2MTY4MDU3MTA0N2QwNGRlYmFiZGMxMWQ0MmRlYzQzNDk1MWQ1MGM3OWQ1NDhmNmQzZTlmM2IzNzZlYzc5Yzk1NzNlNjU1ZWE2YzVjMThkOGQ5ZjljZWFhMzJhODVkZjM5YTY0MzgzMjBjM2VjNmFhZGJkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3Bhc3NTdHlsZU9mLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXNzU3R5bGVPZi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjM2NTcxNDY2MzQ4OTBhNDgyZGJmNmUwMzQxZjE5YTdmYTgwNDc1NTU2NDI4ODhjYmU5MzY3YWRkNDRhODhkMjFkZTgzNjJkZmMwZDhlYTkyMzFlNGI5NTAzMzY3NDcyMzFmOTQwZjVmY2U5ZWY2YTFiMWFiYzdmM2Q0NjZiOWU0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVHdWFyZHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVHdWFyZHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0MjIzYzQyNmE5NDRlYjcyM2FmMzY2MjBkOWI1NzA2NDBkODhhNzMyYmJjY2VkOTQ4ZmM0OGVjZjA3NDM3YTcyMzgyYmZkNDc5N2JkZmU1MmIxMjM2YmUwYTMyMmM2Y2IyNzEzMjM2YjZmMWEyNzVkZDI5MmIxN2ZmNDdmNWRhZCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1NjdlZjFiMWIxNjJkMDI4YWQ0OTM4MjhjZTNlZDQ1MDkzOGQwYmZmZDRmOGNlZTFkNzYxOGQ1OTk3MDlhY2ZjNGI5MjVlMDM3OTVlODYxZDdkYmI5Yjg5ZjAxNDdlZWMyYjIxZjE5NDRmN2E5Mjk3MDM1NTUwMjVmODYyODdlNiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vbmF0LXY0LjEuMjAiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL25hdCIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9uYXQtdjQuMS4yMCIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9uYXQtdjQuMS4yMCIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2ludGVyLXByb3RvY29sIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjVjZDY3OTI4NzUwMDFkZWRkYTU1MWNlOTI0ZWYxYTNlMmQwNjNkNWY3NzZmYzNhZGY0NzQyZDMzNjIyZDQ1MWM1NDU1MzQ2NmVjOGRmNDI4ZTFlNzNiYjBkMjc0MjMyMTZlNDM5YWIxNjg1MzQ5ODNhODhlOTM4ZTk0ZDkxZjM0IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjQ5IjogewogICAgICAibmFtZSI6ICJAZW5kby9wcm9taXNlLWtpdCIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjQ5IiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNDkiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9pbnRlci1wcm90b2NvbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJzZXMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYwLjE1LjIzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJzZXMvbG9ja2Rvd24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYwLjE1LjIzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJzZXMvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MC4xNS4yMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmMDNlZTQ2ZGVjYjViYWRjZDcwODhjMzg4OGIzNGEzZWQ4ODYxODA5MWU3YzBiM2IzODhkNjg2ZWQ2ODI1YmVmNDFjZjc4ODlkOTNhYTMxY2EzZjMzNGE2Mjk0MzgyM2M5Mzc3NTc2NjBkMzc3YzBhMDBiZTVkZTQyMzczNDAyMSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pcy1wcm9taXNlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pcy1wcm9taXNlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMDU5NjY5MGM0ZTQyMWY0MGEwYzdlNmNjYjIwYmY2ZDBhMDA1MzZmODIwZmNjOTdmNmIwMWU0ZDZmMzFiNjM5NWNhZGU2N2Q4ODEyYTk4YjFlZGYxZmE1NWNjYjIyNTRlNTZkZjE1MWYzNjEyNzE3MTNhYjE5NjkyNGY4OTg0YTYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWVtby1yYWNlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tZW1vLXJhY2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5MmYyNTEyMjBkNzNjNDg1MTgxMTdlZmZkZGY0Y2RmYjA3N2QzYzUzYzk1MWIzZDgzZmUyNTJkNTAwMjQyOTQ3YTZiNGM4ZTcxMmQ2MzY2MWRmZWEyNzdiNjYxZWQ4NDg0YzNkY2E4NTdhZTQ5YjhiYTk4YzdhYTE3ZjJjOTg4MCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxODJiZTU5NTZkODUyNjE3ZDJlMTA4Y2Q2NjEyNGUwMTEwMzEyNjExZmU0MTUzY2QwNTk4M2M1YjU4Y2Y0ZGI1ZTRhNTdmYTNiZWFmNmNkNTRhZDNmMGU0NGJlYzJhZDI3YTI0NGM0YjE2NjQwNzRlMDMyOGRkMDE4ODJhNjg5NiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1NjdlZjFiMWIxNjJkMDI4YWQ0OTM4MjhjZTNlZDQ1MDkzOGQwYmZmZDRmOGNlZTFkNzYxOGQ1OTk3MDlhY2ZjNGI5MjVlMDM3OTVlODYxZDdkYmI5Yjg5ZjAxNDdlZWMyYjIxZjE5NDRmN2E5Mjk3MDM1NTUwMjVmODYyODdlNiIKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9Cn1QSwMECgAAAAAAAAAAACA8nw/nCgAA5woAACMAAABAYWdvcmljL2Fzc2VydC12MC41LjEvc3JjL2Fzc2VydC5qc3siaW1wb3J0cyI6WyIuL3R5cGVzLmpzIl0sImV4cG9ydHMiOlsiTm9uTnVsbGlzaCIsImFuIiwiYXNzZXJ0IiwiZGV0YWlscyIsImlkZW50Q2hlY2tlciIsIm1ha2VBc3NlcnQiLCJxIiwicXVvdGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3R5cGVzLmpzXCIsIFtdXV0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShhbiwgJ25hbWUnLCB7dmFsdWU6IFwiYW5cIn0pOyRo4oCNX29uY2UuYW4oYW4pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuQ2hlY2tlcn0gQ2hlY2tlciAqL1xuXG5jb25zdHtmcmVlemV9PU9iamVjdDtcblxuLyoqIEB0eXBlIHtBc3NlcnR9ICovXG5jb25zdCBnbG9iYWxBc3NlcnQ9Z2xvYmFsVGhpcy5hc3NlcnQ7JGjigI1fb25jZS5nbG9iYWxBc3NlcnQoZ2xvYmFsQXNzZXJ0KTtcblxuaWYoZ2xvYmFsQXNzZXJ0PT09dW5kZWZpbmVkKXtcbnRocm93IG5ldyBFcnJvcihcbiBgQ2Fubm90IGluaXRpYWxpemUgQGFnb3JpYy9hc3NlcnQsIG1pc3NpbmcgZ2xvYmFsVGhpcy5hc3NlcnQsIGltcG9ydCAnc2VzJyBiZWZvcmUgJ0BhZ29yaWMvYXNzZXJ0J2ApO1xuXG4gfVxuXG5jb25zdCBtaXNzaW5nPVtcbidmYWlsJyxcbidlcXVhbCcsXG4ndHlwZW9mJyxcbidzdHJpbmcnLFxuJ25vdGUnLFxuJ2RldGFpbHMnLFxuJ3F1b3RlJyxcbidtYWtlQXNzZXJ0J10uXG5maWx0ZXIoKG5hbWUpPT5nbG9iYWxBc3NlcnRbbmFtZV09PT11bmRlZmluZWQpO1xuaWYobWlzc2luZy5sZW5ndGg+MCl7XG50aHJvdyBuZXcgRXJyb3IoXG4gYENhbm5vdCBpbml0aWFsaXplIEBhZ29yaWMvYXNzZXJ0LCBtaXNzaW5nIGdsb2JhbFRoaXMuYXNzZXJ0IG1ldGhvZHMgJHttaXNzaW5nLmpvaW4oXG4nLCAnKVxuIH1gKTtcblxuIH1cblxuY29uc3R7ZGV0YWlscyxxdW90ZSxtYWtlQXNzZXJ0fT1nbG9iYWxBc3NlcnQ7JGjigI1fb25jZS5kZXRhaWxzKGRldGFpbHMpOyRo4oCNX29uY2UucXVvdGUocXVvdGUpOyRo4oCNX29uY2UubWFrZUFzc2VydChtYWtlQXNzZXJ0KTtcblxuXG5cblxuXG5cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUIHwgbnVsbCB8IHVuZGVmaW5lZH0gdmFsXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdERldGFpbHNdXG4gKiBAcmV0dXJucyB7VH1cbiAqL1xuY29uc3QgICAgICAgIE5vbk51bGxpc2g9KHZhbCxvcHREZXRhaWxzPSBgdW5leHBlY3RlZCAke3F1b3RlKHZhbCl9YCk9PntcbmlmKHZhbCE9bnVsbCl7XG4vKiBUaGlzIGAhPSBudWxsYCBpZGlvbSBjaGVja3MgdGhhdCBgdmFsYCBpcyBuZWl0aGVyIGBudWxsYCBub3IgYHVuZGVmaW5lZGAuKi9cbnJldHVybiB2YWw7XG4gfVxuYXNzZXJ0LmZhaWwob3B0RGV0YWlscyk7XG4gfTskaOKAjV9vbmNlLk5vbk51bGxpc2goTm9uTnVsbGlzaCk7XG5oYXJkZW4oTm9uTnVsbGlzaCk7XG5cbi8qKlxuICogUHJlcGVuZCB0aGUgY29ycmVjdCBpbmRlZmluaXRlIGFydGljbGUgb250byBhIG5vdW4sIHR5cGljYWxseSBhIHR5cGVvZiByZXN1bHRcbiAqIGUuZy4sIFwiYW4gT2JqZWN0XCIgdnMuIFwiYSBOdW1iZXJcIlxuICpcbiAqIEBkZXByZWNhdGVkXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyIFRoZSBub3VuIHRvIHByZXBlbmRcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBub3VuIHByZXBlbmRlZCB3aXRoIGEvYW5cbiAqL1xuZnVuY3Rpb24gYW4oc3RyKXtcbnN0cj0gYCR7c3RyfWA7XG5pZihzdHIubGVuZ3RoPj0xJiYnYWVpb3VBRUlPVScuaW5jbHVkZXMoc3RyWzBdKSl7XG5yZXR1cm4gYGFuICR7c3RyfWA7XG4gfVxucmV0dXJuIGBhICR7c3RyfWA7XG4gfVxuZnJlZXplKGFuKTtcblxuXG4vKipcbiAqIEluIHRoZSBgYXNzZXJ0Rm9vYC9gaXNGb29gL2BjaGVja0Zvb2AgcGF0dGVybiwgYGNoZWNrRm9vYCBoYXMgYSBgY2hlY2tgXG4gKiBwYXJhbWV0ZXIgb2YgdHlwZSBgQ2hlY2tlcmAuIGBhc3NlcnRGb29gIGNhbGxzIGBjaGVja0Zvb2AgcGFzc2VzXG4gKiBgYXNzZXJ0Q2hlY2tlcmAgYXMgdGhlIGBjaGVja2AgYXJndW1lbnQuIGBpc0Zvb2AgcGFzc2VzIGBpZGVudENoZWNrZXJgXG4gKiBhcyB0aGUgYGNoZWNrYCBhcmd1bWVudC4gYGlkZW50Q2hlY2tlcmAgYWN0cyBwcmVjaXNlbHkgbGlrZSBhblxuICogaWRlbnRpdHkgZnVuY3Rpb24sIGJ1dCBpcyB0eXBlZCBhcyBhIGBDaGVja2VyYCB0byBpbmRpY2F0ZSBpdHNcbiAqIGludGVuZGVkIHVzZS5cbiAqXG4gKiBAdHlwZSB7Q2hlY2tlcn1cbiAqL1xuY29uc3QgICAgICAgIGlkZW50Q2hlY2tlcj0oY29uZCxfZGV0YWlscyk9PmNvbmQ7JGjigI1fb25jZS5pZGVudENoZWNrZXIoaWRlbnRDaGVja2VyKTtcbmhhcmRlbihpZGVudENoZWNrZXIpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFzc2VydCI6WyJnbG9iYWxBc3NlcnQiXSwiZGV0YWlscyI6WyJkZXRhaWxzIl0sInF1b3RlIjpbInF1b3RlIl0sInEiOlsicXVvdGUiXSwibWFrZUFzc2VydCI6WyJtYWtlQXNzZXJ0Il0sImFuIjpbImFuIl0sIk5vbk51bGxpc2giOlsiTm9uTnVsbGlzaCJdLCJpZGVudENoZWNrZXIiOlsiaWRlbnRDaGVja2VyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAC26WXrJwAA6ycAACIAAABAYWdvcmljL2Fzc2VydC12MC41LjEvc3JjL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQHRzLWNoZWNrKi9cbi8qLyA8cmVmZXJlbmNlIHR5cGVzPVwic2VzXCIvPiovXG5cbi8qIEJhc2VkIG9uKi9cbi8qIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvU0VTLXNoaW0vYmxvYi9tYXN0ZXIvcGFja2FnZXMvc2VzL3NyYy9lcnJvci90eXBlcy5qcyovXG4vKiBDb29yZGluYXRlIGVkaXRzIHVudGlsIHdlIHJlZmFjdG9yIHRvIGF2b2lkIHRoaXMgZHVwbGljYXRpb24qL1xuLyogQXQgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8yNzc0Ki9cbi8qIGlzIGEgcmVjb3JkIG9mIGEgZmFpbGVkIGF0dGVtcHQgdG8gcmVtb3ZlIHRoaXMgZHVwbGljYXRpb24uKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQmFzZUFzc2VydFxuICogVGhlIGBhc3NlcnRgIGZ1bmN0aW9uIGl0c2VsZi5cbiAqIEBwYXJhbSB7Kn0gZmxhZyBUaGUgdHJ1dGh5L2ZhbHN5IHZhbHVlXG4gKiBAcGFyYW0ge0RldGFpbHM9fSBvcHREZXRhaWxzIFRoZSBkZXRhaWxzIHRvIHRocm93XG4gKiBAcGFyYW0ge0Vycm9yQ29uc3RydWN0b3I9fSBFcnJvckNvbnN0cnVjdG9yIEFuIG9wdGlvbmFsIGFsdGVybmF0ZSBlcnJvclxuICogY29uc3RydWN0b3IgdG8gdXNlLlxuICogQHJldHVybnMge2Fzc2VydHMgZmxhZ31cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEFzc2VydE1ha2VFcnJvck9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nPX0gZXJyb3JOYW1lXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0TWFrZUVycm9yXG4gKlxuICogVGhlIGBhc3NlcnQuZXJyb3JgIG1ldGhvZCwgcmVjb3JkaW5nIGRldGFpbHMgZm9yIHRoZSBjb25zb2xlLlxuICpcbiAqIFRoZSBvcHRpb25hbCBgb3B0RGV0YWlsc2AgY2FuIGJlIGEgc3RyaW5nLlxuICogQHBhcmFtIHtEZXRhaWxzPX0gb3B0RGV0YWlscyBUaGUgZGV0YWlscyBvZiB3aGF0IHdhcyBhc3NlcnRlZFxuICogQHBhcmFtIHtFcnJvckNvbnN0cnVjdG9yPX0gRXJyb3JDb25zdHJ1Y3RvciBBbiBvcHRpb25hbCBhbHRlcm5hdGUgZXJyb3JcbiAqIGNvbnN0cnVjdG9yIHRvIHVzZS5cbiAqIEBwYXJhbSB7QXNzZXJ0TWFrZUVycm9yT3B0aW9ucz19IG9wdGlvbnNcbiAqIEByZXR1cm5zIHtFcnJvcn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRGYWlsXG4gKlxuICogVGhlIGBhc3NlcnQuZmFpbGAgbWV0aG9kLlxuICpcbiAqIEZhaWwgYW4gYXNzZXJ0aW9uLCByZWNvcmRpbmcgZGV0YWlscyB0byB0aGUgY29uc29sZSBhbmRcbiAqIHJhaXNpbmcgYW4gZXhjZXB0aW9uIHdpdGgganVzdCB0eXBlIGluZm9ybWF0aW9uLlxuICpcbiAqIFRoZSBvcHRpb25hbCBgb3B0RGV0YWlsc2AgY2FuIGJlIGEgc3RyaW5nIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICogd2l0aCB0aGUgbm9kZWpzIGFzc2VydGlvbiBsaWJyYXJ5LlxuICogQHBhcmFtIHtEZXRhaWxzPX0gb3B0RGV0YWlscyBUaGUgZGV0YWlscyBvZiB3aGF0IHdhcyBhc3NlcnRlZFxuICogQHBhcmFtIHtFcnJvckNvbnN0cnVjdG9yPX0gRXJyb3JDb25zdHJ1Y3RvciBBbiBvcHRpb25hbCBhbHRlcm5hdGUgZXJyb3JcbiAqIGNvbnN0cnVjdG9yIHRvIHVzZS5cbiAqIEByZXR1cm5zIHtuZXZlcn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRFcXVhbFxuICogVGhlIGBhc3NlcnQuZXF1YWxgIG1ldGhvZFxuICpcbiAqIEFzc2VydCB0aGF0IHR3byB2YWx1ZXMgbXVzdCBiZSBgT2JqZWN0LmlzYC5cbiAqIEBwYXJhbSB7Kn0gYWN0dWFsIFRoZSB2YWx1ZSB3ZSByZWNlaXZlZFxuICogQHBhcmFtIHsqfSBleHBlY3RlZCBXaGF0IHdlIHdhbnRlZFxuICogQHBhcmFtIHtEZXRhaWxzPX0gb3B0RGV0YWlscyBUaGUgZGV0YWlscyB0byB0aHJvd1xuICogQHBhcmFtIHtFcnJvckNvbnN0cnVjdG9yPX0gRXJyb3JDb25zdHJ1Y3RvciBBbiBvcHRpb25hbCBhbHRlcm5hdGUgZXJyb3JcbiAqIGNvbnN0cnVjdG9yIHRvIHVzZS5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5cbi8qIFR5cGUgYWxsIHRoZSBvdmVybG9hZHMgb2YgdGhlIGFzc2VydFR5cGVvZiBmdW5jdGlvbi4qL1xuLyogVGhlcmUgbWF5IGV2ZW50dWFsbHkgYmUgYSBiZXR0ZXIgd2F5IHRvIGRvIHRoaXMsIGJ1dCovXG4vKiB0aGVtcyB0aGUgYnJlYWtzIHdpdGggVHlwZXNjcmlwdCA0LjAuKi9cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydFR5cGVvZkJpZ2ludFxuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcGFyYW0geydiaWdpbnQnfSB0eXBlbmFtZVxuICogQHBhcmFtIHtEZXRhaWxzPX0gb3B0RGV0YWlsc1xuICogQHJldHVybnMge2Fzc2VydHMgc3BlY2ltZW4gaXMgYmlnaW50fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydFR5cGVvZkJvb2xlYW5cbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHBhcmFtIHsnYm9vbGVhbid9IHR5cGVuYW1lXG4gKiBAcGFyYW0ge0RldGFpbHM9fSBvcHREZXRhaWxzXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzcGVjaW1lbiBpcyBib29sZWFufVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydFR5cGVvZkZ1bmN0aW9uXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7J2Z1bmN0aW9uJ30gdHlwZW5hbWVcbiAqIEBwYXJhbSB7RGV0YWlscz19IG9wdERldGFpbHNcbiAqIEByZXR1cm5zIHthc3NlcnRzIHNwZWNpbWVuIGlzIEZ1bmN0aW9ufVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydFR5cGVvZk51bWJlclxuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcGFyYW0geydudW1iZXInfSB0eXBlbmFtZVxuICogQHBhcmFtIHtEZXRhaWxzPX0gb3B0RGV0YWlsc1xuICogQHJldHVybnMge2Fzc2VydHMgc3BlY2ltZW4gaXMgbnVtYmVyfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydFR5cGVvZk9iamVjdFxuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcGFyYW0geydvYmplY3QnfSB0eXBlbmFtZVxuICogQHBhcmFtIHtEZXRhaWxzPX0gb3B0RGV0YWlsc1xuICogQHJldHVybnMge2Fzc2VydHMgc3BlY2ltZW4gaXMgUmVjb3JkPGFueSwgYW55PiB8IG51bGx9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0VHlwZW9mU3RyaW5nXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7J3N0cmluZyd9IHR5cGVuYW1lXG4gKiBAcGFyYW0ge0RldGFpbHM9fSBvcHREZXRhaWxzXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzcGVjaW1lbiBpcyBzdHJpbmd9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0VHlwZW9mU3ltYm9sXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7J3N5bWJvbCd9IHR5cGVuYW1lXG4gKiBAcGFyYW0ge0RldGFpbHM9fSBvcHREZXRhaWxzXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzcGVjaW1lbiBpcyBzeW1ib2x9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0VHlwZW9mVW5kZWZpbmVkXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7J3VuZGVmaW5lZCd9IHR5cGVuYW1lXG4gKiBAcGFyYW0ge0RldGFpbHM9fSBvcHREZXRhaWxzXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzcGVjaW1lbiBpcyB1bmRlZmluZWR9XG4gKi9cblxuLyoqXG4gKiBUaGUgYGFzc2VydC50eXBlb2ZgIG1ldGhvZFxuICpcbiAqIEB0eXBlZGVmIHtBc3NlcnRUeXBlb2ZCaWdpbnQgJiBBc3NlcnRUeXBlb2ZCb29sZWFuICYgQXNzZXJ0VHlwZW9mRnVuY3Rpb24gJiBBc3NlcnRUeXBlb2ZOdW1iZXIgJiBBc3NlcnRUeXBlb2ZPYmplY3QgJiBBc3NlcnRUeXBlb2ZTdHJpbmcgJiBBc3NlcnRUeXBlb2ZTeW1ib2wgJiBBc3NlcnRUeXBlb2ZVbmRlZmluZWR9IEFzc2VydFR5cGVvZlxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydFN0cmluZ1xuICogVGhlIGBhc3NlcnQuc3RyaW5nYCBtZXRob2QuXG4gKlxuICogYGFzc2VydC5zdHJpbmcodilgIGlzIGVxdWl2YWxlbnQgdG8gYGFzc2VydC50eXBlb2YodiwgJ3N0cmluZycpYC4gV2VcbiAqIHNwZWNpYWwgY2FzZSB0aGlzIG9uZSBiZWNhdXNlIGl0IGlzIHRoZSBtb3N0IGZyZXF1ZW50bHkgdXNlZC5cbiAqXG4gKiBBc3NlcnQgYW4gZXhwZWN0ZWQgdHlwZW9mIHJlc3VsdC5cbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lbiBUaGUgdmFsdWUgdG8gZ2V0IHRoZSB0eXBlb2ZcbiAqIEBwYXJhbSB7RGV0YWlscz19IG9wdERldGFpbHMgVGhlIGRldGFpbHMgdG8gdGhyb3dcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnROb3RlXG4gKiBUaGUgYGFzc2VydC5ub3RlYCBtZXRob2QuXG4gKlxuICogQW5ub3RhdGUgdGhpcyBlcnJvciB3aXRoIHRoZXNlIGRldGFpbHMsIHBvdGVudGlhbGx5IHRvIGJlIHVzZWQgYnkgYW5cbiAqIGF1Z21lbnRlZCBjb25zb2xlLCBsaWtlIHRoZSBjYXVzYWwgY29uc29sZSBvZiBgY29uc29sZS5qc2AsIHRvXG4gKiBwcm92aWRlIGV4dHJhIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCBsb2dnZWQgZXJyb3JzLlxuICogQHBhcmFtIHtFcnJvcn0gZXJyb3JcbiAqIEBwYXJhbSB7RGV0YWlsc30gZGV0YWlsc05vdGVcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7e319IERldGFpbHNUb2tlblxuICogQSBjYWxsIHRvIHRoZSBgZGV0YWlsc2AgdGVtcGxhdGUgbGl0ZXJhbCBtYWtlcyBhbmQgcmV0dXJucyBhIGZyZXNoIGRldGFpbHNcbiAqIHRva2VuLCB3aGljaCBpcyBhIGZyb3plbiBlbXB0eSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBhcmd1bWVudHMgb2YgdGhhdFxuICogYGRldGFpbHNgIHRlbXBsYXRlIGxpdGVyYWwgZXhwcmVzc2lvbi5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtzdHJpbmcgfCBEZXRhaWxzVG9rZW59IERldGFpbHNcbiAqIEVpdGhlciBhIHBsYWluIHN0cmluZywgb3IgbWFkZSBieSB0aGUgYGRldGFpbHNgIHRlbXBsYXRlIGxpdGVyYWwgdGFnLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU3RyaW5nYWJsZVBheWxvYWRcbiAqIEhvbGRzIHRoZSBwYXlsb2FkIHBhc3NlZCB0byBxdW90ZSBzbyB0aGF0IGl0cyBwcmludGVkIGZvcm0gaXMgdmlzaWJsZS5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gc3RyaW5nfSB0b1N0cmluZyBIb3cgdG8gcHJpbnQgdGhlIHBheWxvYWRcbiAqL1xuXG4vKipcbiAqIFRvIFwiZGVjbGFzc2lmeVwiIGFuZCBxdW90ZSBhIHN1YnN0aXR1dGlvbiB2YWx1ZSB1c2VkIGluIGFcbiAqIGRldGFpbHNgLi4uYCB0ZW1wbGF0ZSBsaXRlcmFsLCBlbmNsb3NlIHRoYXQgc3Vic3RpdHV0aW9uIGV4cHJlc3Npb25cbiAqIGluIGEgY2FsbCB0byBgcXVvdGVgLiBUaGlzIHN0YXRlcyB0aGF0IHRoZSBhcmd1bWVudCBzaG91bGQgYXBwZWFyIHF1b3RlZFxuICogKGFzIGlmIHdpdGggYEpTT04uc3RyaW5naWZ5YCksIGluIHRoZSBlcnJvciBtZXNzYWdlIG9mIHRoZSB0aHJvd24gZXJyb3IuIFRoZVxuICogcGF5bG9hZCBpdHNlbGYgaXMgc3RpbGwgcGFzc2VkIHVucXVvdGVkIHRvIHRoZSBjb25zb2xlIGFzIGl0IHdvdWxkIGJlXG4gKiB3aXRob3V0IGBxdW90ZWAuXG4gKlxuICogU3RhcnRpbmcgZnJvbSB0aGUgZXhhbXBsZSBpbiB0aGUgYGRldGFpbHNgIGNvbW1lbnQsIHNheSBpbnN0ZWFkIHRoYXQgdGhlXG4gKiBjb2xvciB0aGUgc2t5IGlzIHN1cHBvc2VkIHRvIGJlIGlzIGFsc28gY29tcHV0ZWQuIFNheSB0aGF0IHdlIHN0aWxsIGRvbid0XG4gKiB3YW50IHRvIHJldmVhbCB0aGUgc2t5J3MgYWN0dWFsIGNvbG9yLCBidXQgd2UgZG8gd2FudCB0aGUgdGhyb3duIGVycm9yJ3NcbiAqIG1lc3NhZ2UgdG8gcmV2ZWFsIHdoYXQgY29sb3IgdGhlIHNreSB3YXMgc3VwcG9zZWQgdG8gYmU6XG4gKiBgYGBqc1xuICogYXNzZXJ0LmVxdWFsKFxuICogICBza3kuY29sb3IsXG4gKiAgIGNvbG9yLFxuICogICBkZXRhaWxzYCR7c2t5LmNvbG9yfSBzaG91bGQgYmUgJHtxdW90ZShjb2xvcil9YCxcbiAqICk7XG4gKiBgYGBcbiAqXG4gKiBUaGUgbm9ybWFsIGNvbnZlbnRpb24gaXMgdG8gbG9jYWxseSByZW5hbWUgYHF1b3RlYCB0byBgcWAgYW5kXG4gKiBgZGV0YWlsc2AgdG8gYFhgXG4gKiBgYGBqc1xuICogY29uc3QgeyBkZXRhaWxzOiBYLCBxdW90ZTogcSB9ID0gYXNzZXJ0O1xuICogYGBgXG4gKiBzbyB0aGUgYWJvdmUgZXhhbXBsZSB3b3VsZCB0aGVuIGJlXG4gKiBgYGBqc1xuICogYXNzZXJ0LmVxdWFsKFxuICogICBza3kuY29sb3IsXG4gKiAgIGNvbG9yLFxuICogICBYYCR7c2t5LmNvbG9yfSBzaG91bGQgYmUgJHtxKGNvbG9yKX1gLFxuICogKTtcbiAqIGBgYFxuICpcbiAqIEBjYWxsYmFjayBBc3NlcnRRdW90ZVxuICogQHBhcmFtIHsqfSBwYXlsb2FkIFdoYXQgdG8gZGVjbGFzc2lmeVxuICogQHBhcmFtIHsoc3RyaW5nfG51bWJlcik9fSBzcGFjZXNcbiAqIEByZXR1cm5zIHtTdHJpbmdhYmxlUGF5bG9hZH0gVGhlIGRlY2xhc3NpZmllZCBwYXlsb2FkXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgUmFpc2VcbiAqXG4gKiBUbyBtYWtlIGFuIGBhc3NlcnRgIHdoaWNoIHRlcm1pbmF0ZXMgc29tZSBsYXJnZXIgdW5pdCBvZiBjb21wdXRhdGlvblxuICogbGlrZSBhIHRyYW5zYWN0aW9uLCB2YXQsIG9yIHByb2Nlc3MsIGNhbGwgYG1ha2VBc3NlcnRgIHdpdGggYSBgUmFpc2VgXG4gKiBjYWxsYmFjaywgd2hlcmUgdGhhdCBjYWxsYmFjayBhY3R1YWxseSBwZXJmb3JtcyB0aGF0IGxhcmdlciB0ZXJtaW5hdGlvbi5cbiAqIElmIHBvc3NpYmxlLCB0aGUgY2FsbGJhY2sgc2hvdWxkIGFsc28gcmVwb3J0IGl0cyBgcmVhc29uYCBwYXJhbWV0ZXIgYXNcbiAqIHRoZSBhbGxlZ2VkIHJlYXNvbiBmb3IgdGhlIHRlcm1pbmF0aW9uLlxuICogQHBhcmFtIHtFcnJvcn0gcmVhc29uXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgTWFrZUFzc2VydFxuICpcbiAqIE1ha2VzIGFuZCByZXR1cm5zIGFuIGBhc3NlcnRgIGZ1bmN0aW9uIG9iamVjdCB0aGF0IHNoYXJlcyB0aGUgYm9va2tlZXBpbmdcbiAqIHN0YXRlIGRlZmluZWQgYnkgdGhpcyBtb2R1bGUgd2l0aCBvdGhlciBgYXNzZXJ0YCBmdW5jdGlvbiBvYmplY3RzIG1hZGUgYnlcbiAqIGBtYWtlQXNzZXJ0YC4gVGhpcyBzdGF0ZSBpcyBwZXItbW9kdWxlLWluc3RhbmNlIGFuZCBpcyBleHBvc2VkIGJ5IHRoZVxuICogYGxvZ2dlZEVycm9ySGFuZGxlcmAgYWJvdmUuIFdlIHJlZmVyIHRvIGBhc3NlcnRgIGFzIGEgXCJmdW5jdGlvbiBvYmplY3RcIlxuICogYmVjYXVzZSBpdCBjYW4gYmUgY2FsbGVkIGRpcmVjdGx5IGFzIGEgZnVuY3Rpb24sIGJ1dCBhbHNvIGhhcyBtZXRob2RzIHRoYXRcbiAqIGNhbiBiZSBjYWxsZWQuXG4gKlxuICogSWYgYG9wdFJhaXNlYCBpcyBwcm92aWRlZCwgdGhlIHJldHVybmVkIGBhc3NlcnRgIGZ1bmN0aW9uIG9iamVjdCB3aWxsIGNhbGxcbiAqIGBvcHRSYWlzZShyZWFzb24pYCBiZWZvcmUgdGhyb3dpbmcgdGhlIGVycm9yLiBUaGlzIGVuYWJsZXMgYG9wdFJhaXNlYCB0b1xuICogZW5nYWdlIGluIGV2ZW4gbW9yZSB2aW9sZW50IHRlcm1pbmF0aW9uIGJlaGF2aW9yLCBsaWtlIHRlcm1pbmF0aW5nIHRoZSB2YXQsXG4gKiB0aGF0IHByZXZlbnRzIGV4ZWN1dGlvbiBmcm9tIHJlYWNoaW5nIHRoZSBmb2xsb3dpbmcgdGhyb3cuIEhvd2V2ZXIsIGlmXG4gKiBgb3B0UmFpc2VgIHJldHVybnMgbm9ybWFsbHksIHdoaWNoIHdvdWxkIGJlIHVudXN1YWwsIHRoZSB0aHJvdyBmb2xsb3dpbmdcbiAqIGBvcHRSYWlzZShyZWFzb24pYCB3b3VsZCBzdGlsbCBoYXBwZW4uXG4gKiBAcGFyYW0ge1JhaXNlPX0gb3B0UmFpc2VcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IHVucmVkYWN0ZWRcbiAqIEByZXR1cm5zIHtBc3NlcnR9XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KHRlbXBsYXRlOiBUZW1wbGF0ZVN0cmluZ3NBcnJheSB8IHN0cmluZ1tdLCAuLi5hcmdzOiBhbnkpID0+IERldGFpbHNUb2tlbn0gRGV0YWlsc1RhZ1xuICpcbiAqIFVzZSB0aGUgYGRldGFpbHNgIGZ1bmN0aW9uIGFzIGEgdGVtcGxhdGUgbGl0ZXJhbCB0YWcgdG8gY3JlYXRlXG4gKiBpbmZvcm1hdGl2ZSBlcnJvciBtZXNzYWdlcy4gVGhlIGFzc2VydGlvbiBmdW5jdGlvbnMgdGFrZSBzdWNoIG1lc3NhZ2VzXG4gKiBhcyBvcHRpb25hbCBhcmd1bWVudHM6XG4gKiBgYGBqc1xuICogYXNzZXJ0KHNreS5pc0JsdWUoKSwgZGV0YWlsc2Ake3NreS5jb2xvcn0gc2hvdWxkIGJlIFwiYmx1ZVwiYCk7XG4gKiBgYGBcbiAqIFRoZSBkZXRhaWxzIHRlbXBsYXRlIHRhZyByZXR1cm5zIGEgYERldGFpbHNUb2tlbmAgb2JqZWN0IHRoYXQgY2FuIHByaW50XG4gKiBpdHNlbGYgd2l0aCB0aGUgZm9ybWF0dGVkIG1lc3NhZ2UgaW4gdHdvIHdheXMuXG4gKiBJdCB3aWxsIHJlcG9ydCB0aGUgcmVhbCBkZXRhaWxzIHRvXG4gKiB0aGUgY29uc29sZSBidXQgaW5jbHVkZSBvbmx5IHRoZSB0eXBlb2YgaW5mb3JtYXRpb24gaW4gdGhlIHRocm93biBlcnJvclxuICogdG8gcHJldmVudCByZXZlYWxpbmcgc2VjcmV0cyB1cCB0aGUgZXhjZXB0aW9uYWwgcGF0aC4gSW4gdGhlIGV4YW1wbGVcbiAqIGFib3ZlLCB0aGUgdGhyb3duIGVycm9yIG1heSByZXZlYWwgb25seSB0aGF0IGBza3kuY29sb3JgIGlzIGEgc3RyaW5nLFxuICogd2hlcmVhcyB0aGUgc2FtZSBkaWFnbm9zdGljIHByaW50ZWQgdG8gdGhlIGNvbnNvbGUgcmV2ZWFscyB0aGF0IHRoZVxuICogc2t5IHdhcyBncmVlbi5cbiAqXG4gKiBUaGUgYHJhd2AgbWVtYmVyIG9mIGEgYHRlbXBsYXRlYCBpcyBpZ25vcmVkLCBzbyBhIHNpbXBsZVxuICogYHN0cmluZ1tdYCBjYW4gYWxzbyBiZSB1c2VkIGFzIGEgdGVtcGxhdGUuXG4gKi9cblxuLyoqXG4gKiBhc3NlcnQgdGhhdCBleHByIGlzIHRydXRoeSwgd2l0aCBhbiBvcHRpb25hbCBkZXRhaWxzIHRvIGRlc2NyaWJlXG4gKiB0aGUgYXNzZXJ0aW9uLiBJdCBpcyBhIHRhZ2dlZCB0ZW1wbGF0ZSBsaXRlcmFsIGxpa2VcbiAqIGBgYGpzXG4gKiBhc3NlcnQoZXhwciwgZGV0YWlsc2AuLi4uYCk7YFxuICogYGBgXG4gKlxuICogVGhlIGxpdGVyYWwgcG9ydGlvbnMgb2YgdGhlIHRlbXBsYXRlIGFyZSBhc3N1bWVkIG5vbi1zZW5zaXRpdmUsIGFzXG4gKiBhcmUgdGhlIGB0eXBlb2ZgIHR5cGVzIG9mIHRoZSBzdWJzdGl0dXRpb24gdmFsdWVzLiBUaGVzZSBhcmVcbiAqIGFzc2VtYmxlZCBpbnRvIHRoZSB0aHJvd24gZXJyb3IgbWVzc2FnZS4gVGhlIGFjdHVhbCBjb250ZW50cyBvZiB0aGVcbiAqIHN1YnN0aXR1dGlvbiB2YWx1ZXMgYXJlIGFzc3VtZWQgc2Vuc2l0aXZlLCB0byBiZSByZXZlYWxlZCB0b1xuICogdGhlIGNvbnNvbGUgb25seS4gV2UgYXNzdW1lIG9ubHkgdGhlIHZpcnR1YWwgcGxhdGZvcm0ncyBvd25lciBjYW4gcmVhZFxuICogd2hhdCBpcyB3cml0dGVuIHRvIHRoZSBjb25zb2xlLCB3aGVyZSB0aGUgb3duZXIgaXMgaW4gYSBwcml2aWxlZ2VkXG4gKiBwb3NpdGlvbiBvdmVyIGNvbXB1dGF0aW9uIHJ1bm5pbmcgb24gdGhhdCBwbGF0Zm9ybS5cbiAqXG4gKiBUaGUgb3B0aW9uYWwgYG9wdERldGFpbHNgIGNhbiBiZSBhIHN0cmluZyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAqIHdpdGggdGhlIG5vZGVqcyBhc3NlcnRpb24gbGlicmFyeS5cbiAqXG4gKiBAdHlwZWRlZiB7IEJhc2VBc3NlcnQgJiB7XG4gKiAgIHR5cGVvZjogQXNzZXJ0VHlwZW9mLFxuICogICBlcnJvcjogQXNzZXJ0TWFrZUVycm9yLFxuICogICBmYWlsOiBBc3NlcnRGYWlsLFxuICogICBlcXVhbDogQXNzZXJ0RXF1YWwsXG4gKiAgIHN0cmluZzogQXNzZXJ0U3RyaW5nLFxuICogICBub3RlOiBBc3NlcnROb3RlLFxuICogICBkZXRhaWxzOiBEZXRhaWxzVGFnLFxuICogICBxdW90ZTogQXNzZXJ0UXVvdGUsXG4gKiAgIG1ha2VBc3NlcnQ6IE1ha2VBc3NlcnQsXG4gKiB9IH0gQXNzZXJ0XG4gKi9cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAkcXQLkcBAABHAQAAIAAAAEBhZ29yaWMvZXJ0cC12MC4xNS41L2V4cG9ydGVkLmpzeyJpbXBvcnRzIjpbIi4vc3JjL3R5cGVzLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vc3JjL3R5cGVzLmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA/OW00rDgAAKw4AAAmAAAAQGFnb3JpYy9lcnRwLXYwLjE1LjUvc3JjL2Ftb3VudE1hdGguanN7ImltcG9ydHMiOlsiLi9tYXRoSGVscGVycy9jb3B5QmFnTWF0aEhlbHBlcnMuanMiLCIuL21hdGhIZWxwZXJzL2NvcHlTZXRNYXRoSGVscGVycy5qcyIsIi4vbWF0aEhlbHBlcnMvbmF0TWF0aEhlbHBlcnMuanMiLCIuL21hdGhIZWxwZXJzL3NldE1hdGhIZWxwZXJzLmpzIiwiLi90eXBlcy5qcyIsIkBhZ29yaWMvc3RvcmUiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsiQW1vdW50TWF0aCIsIkFzc2V0S2luZCIsImFzc2VydEFzc2V0S2luZCIsImFzc2VydFZhbHVlR2V0SGVscGVycyIsImdldEFzc2V0S2luZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBwYXNzU3R5bGVPZixhc3NlcnRSZW1vdGFibGUsYXNzZXJ0UmVjb3JkLE0sbWF0Y2hlcyxuYXRNYXRoSGVscGVycyxzZXRNYXRoSGVscGVycyxjb3B5U2V0TWF0aEhlbHBlcnMsY29weUJhZ01hdGhIZWxwZXJzOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0UmVtb3RhYmxlXCIsIFskaOKAjV9hID0+IChhc3NlcnRSZW1vdGFibGUgPSAkaOKAjV9hKV1dLFtcImFzc2VydFJlY29yZFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UmVjb3JkID0gJGjigI1fYSldXV1dLFtcIi4vdHlwZXMuanNcIiwgW11dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIk1cIiwgWyRo4oCNX2EgPT4gKE0gPSAkaOKAjV9hKV1dLFtcIm1hdGNoZXNcIiwgWyRo4oCNX2EgPT4gKG1hdGNoZXMgPSAkaOKAjV9hKV1dXV0sW1wiLi9tYXRoSGVscGVycy9uYXRNYXRoSGVscGVycy5qc1wiLCBbW1wibmF0TWF0aEhlbHBlcnNcIiwgWyRo4oCNX2EgPT4gKG5hdE1hdGhIZWxwZXJzID0gJGjigI1fYSldXV1dLFtcIi4vbWF0aEhlbHBlcnMvc2V0TWF0aEhlbHBlcnMuanNcIiwgW1tcInNldE1hdGhIZWxwZXJzXCIsIFskaOKAjV9hID0+IChzZXRNYXRoSGVscGVycyA9ICRo4oCNX2EpXV1dXSxbXCIuL21hdGhIZWxwZXJzL2NvcHlTZXRNYXRoSGVscGVycy5qc1wiLCBbW1wiY29weVNldE1hdGhIZWxwZXJzXCIsIFskaOKAjV9hID0+IChjb3B5U2V0TWF0aEhlbHBlcnMgPSAkaOKAjV9hKV1dXV0sW1wiLi9tYXRoSGVscGVycy9jb3B5QmFnTWF0aEhlbHBlcnMuanNcIiwgW1tcImNvcHlCYWdNYXRoSGVscGVyc1wiLCBbJGjigI1fYSA9PiAoY29weUJhZ01hdGhIZWxwZXJzID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0e2RldGFpbHM6WCxxdW90ZTpxfT1hc3NlcnQ7XG5cbi8qKlxuICogQ29uc3RhbnRzIGZvciB0aGUga2luZHMgb2YgYXNzZXRzIHdlIHN1cHBvcnQuXG4gKlxuICogQHR5cGUge3sgTkFUOiAnbmF0JywgU0VUOiAnc2V0JywgQ09QWV9TRVQ6ICdjb3B5U2V0JywgQ09QWV9CQUc6ICdjb3B5QmFnJyB9fVxuICovXG5jb25zdCBBc3NldEtpbmQ9aGFyZGVuKHtcbk5BVDonbmF0JyxcblNFVDonc2V0JyxcbkNPUFlfU0VUOidjb3B5U2V0JyxcbkNPUFlfQkFHOidjb3B5QmFnJ30pOyRo4oCNX29uY2UuQXNzZXRLaW5kKEFzc2V0S2luZCk7XG5cbmNvbnN0IGFzc2V0S2luZE5hbWVzPWhhcmRlbihPYmplY3QudmFsdWVzKEFzc2V0S2luZCkuc29ydCgpKTtcblxuLyoqIEB0eXBlIHtBc3NlcnRBc3NldEtpbmR9ICovXG5jb25zdCBhc3NlcnRBc3NldEtpbmQ9KGFsbGVnZWRBSyk9PntcbmFzc2V0S2luZE5hbWVzLmluY2x1ZGVzKGFsbGVnZWRBSyl8fFxuYXNzZXJ0LmZhaWwoXG5YIGBUaGUgYXNzZXRLaW5kICR7YWxsZWdlZEFLfSBtdXN0IGJlIG9uZSBvZiAke3EoYXNzZXRLaW5kTmFtZXMpfWApO1xuXG4gfTskaOKAjV9vbmNlLmFzc2VydEFzc2V0S2luZChhc3NlcnRBc3NldEtpbmQpO1xuaGFyZGVuKGFzc2VydEFzc2V0S2luZCk7XG5cbi8qKlxuICogQW1vdW50cyBkZXNjcmliZSBkaWdpdGFsIGFzc2V0cy4gRnJvbSBhbiBhbW91bnQsIHlvdSBjYW4gbGVhcm4gdGhlXG4gKiBicmFuZCBvZiBkaWdpdGFsIGFzc2V0IGFzIHdlbGwgYXMgXCJob3cgbXVjaFwiIG9yIFwiaG93IG1hbnlcIi4gQW1vdW50c1xuICogaGF2ZSB0d28gcGFydHM6IGEgYnJhbmQgKGxvb3NlbHkgc3BlYWtpbmcsIHRoZSB0eXBlIG9mIGRpZ2l0YWxcbiAqIGFzc2V0KSBhbmQgdGhlIHZhbHVlICh0aGUgYW5zd2VyIHRvIFwiaG93IG11Y2hcIikuIEZvciBleGFtcGxlLCBpblxuICogdGhlIHBocmFzZSBcIjUgYnVja3NcIiwgXCJidWNrc1wiIHRha2VzIHRoZSByb2xlIG9mIHRoZSBicmFuZCBhbmQgdGhlXG4gKiB2YWx1ZSBpcyA1LiBBbW91bnRzIGNhbiBkZXNjcmliZSBmdW5naWJsZSBhbmQgbm9uLWZ1bmdpYmxlIGRpZ2l0YWxcbiAqIGFzc2V0cy4gQW1vdW50cyBhcmUgcGFzcy1ieS1jb3B5IGFuZCBjYW4gYmUgbWFkZSBieSBhbmQgc2VudCB0b1xuICogYW55b25lLlxuICpcbiAqIFRoZSBpc3N1ZXIgaXMgdGhlIGF1dGhvcml0YXRpdmUgc291cmNlIG9mIHRoZSBhbW91bnQgaW4gcGF5bWVudHNcbiAqIGFuZCBwdXJzZXMuIFRoZSBpc3N1ZXIgbXVzdCBiZSBhYmxlIHRvIGRvIHRoaW5ncyBzdWNoIGFzIGFkZFxuICogZGlnaXRhbCBhc3NldHMgdG8gYSBwdXJzZSBhbmQgd2l0aGRyYXcgZGlnaXRhbCBhc3NldHMgZnJvbSBhIHB1cnNlLlxuICogVG8gZG8gc28sIGl0IG11c3Qga25vdyBob3cgdG8gYWRkIGFuZCBzdWJ0cmFjdCBkaWdpdGFsIGFzc2V0cy5cbiAqIFJhdGhlciB0aGFuIGhhcmQtY29kaW5nIGEgcGFydGljdWxhciBzb2x1dGlvbiwgd2UgY2hvc2UgdG9cbiAqIHBhcmFtZXRlcml6ZSB0aGUgaXNzdWVyIHdpdGggYSBjb2xsZWN0aW9uIG9mIHBvbHltb3JwaGljIGZ1bmN0aW9ucyxcbiAqIHdoaWNoIHdlIGNhbGwgYEFtb3VudE1hdGhgLiBUaGVzZSBtYXRoIGZ1bmN0aW9ucyBpbmNsdWRlIGNvbmNlcHRzXG4gKiBsaWtlIGFkZGl0aW9uLCBzdWJ0cmFjdGlvbiwgYW5kIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0by5cbiAqXG4gKiBXZSBhbHNvIHdhbnQgdG8gbWFrZSBzdXJlIHRoZXJlIGlzIG5vIGNvbmZ1c2lvbiBhcyB0byB3aGF0IGtpbmQgb2ZcbiAqIGFzc2V0IHdlIGFyZSB1c2luZy4gVGh1cywgQW1vdW50TWF0aCBpbmNsdWRlcyBjaGVja3Mgb2YgdGhlXG4gKiBgYnJhbmRgLCB0aGUgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSB0eXBlIG9mIGRpZ2l0YWwgYXNzZXQuIElmXG4gKiB0aGUgd3JvbmcgYnJhbmQgaXMgdXNlZCBpbiBBbW91bnRNYXRoLCBhbiBlcnJvciBpcyB0aHJvd24gYW5kIHRoZVxuICogb3BlcmF0aW9uIGRvZXMgbm90IHN1Y2NlZWQuXG4gKlxuICogQW1vdW50TWF0aCB1c2VzIG1hdGhIZWxwZXJzIHRvIGRvIG1vc3Qgb2YgdGhlIHdvcmssIGJ1dCB0aGVuIGFkZHNcbiAqIHRoZSBicmFuZCB0byB0aGUgcmVzdWx0LiBUaGUgZnVuY3Rpb24gYHZhbHVlYCBnZXRzIHRoZSB2YWx1ZSBmcm9tXG4gKiB0aGUgYW1vdW50IGJ5IHJlbW92aW5nIHRoZSBicmFuZCAoYW1vdW50IC0+IHZhbHVlKSwgYW5kIHRoZVxuICogZnVuY3Rpb24gYG1ha2VgIGFkZHMgdGhlIGJyYW5kIHRvIHByb2R1Y2UgYW4gYW1vdW50ICh2YWx1ZSAtPlxuICogYW1vdW50KS4gVGhlIGZ1bmN0aW9uIGBjb2VyY2VgIHRha2VzIGFuIGFtb3VudCBhbmQgY2hlY2tzIGl0LFxuICogcmV0dXJuaW5nIGFuIGFtb3VudCAoYW1vdW50IC0+IGFtb3VudCkuXG4gKlxuICogRWFjaCBpc3N1ZXIgb2YgZGlnaXRhbCBhc3NldHMgaGFzIGFuIGFzc29jaWF0ZWQgYnJhbmQgaW4gYVxuICogb25lLXRvLW9uZSBtYXBwaW5nLiBJbiB1bnRydXN0ZWQgY29udGV4dHMsIHN1Y2ggYXMgaW4gYW5hbHl6aW5nXG4gKiBwYXltZW50cyBhbmQgYW1vdW50cywgd2UgY2FuIGdldCB0aGUgYnJhbmQgYW5kIGZpbmQgdGhlIGlzc3VlclxuICogd2hpY2ggbWF0Y2hlcyB0aGUgYnJhbmQuIFRoZSBpc3N1ZXIgYW5kIHRoZSBicmFuZCBtdXR1YWxseSB2YWxpZGF0ZVxuICogZWFjaCBvdGhlci5cbiAqL1xuXG4vKiogQHR5cGUge3tcbiAqICAgbmF0OiBOYXRNYXRoSGVscGVycyxcbiAqICAgc2V0OiBTZXRNYXRoSGVscGVycyxcbiAqICAgY29weVNldDogQ29weVNldE1hdGhIZWxwZXJzLFxuICogICBjb3B5QmFnOiBDb3B5QmFnTWF0aEhlbHBlcnNcbiAqIH19ICovXG5jb25zdCBoZWxwZXJzPXtcbm5hdDpuYXRNYXRoSGVscGVycyxcbnNldDpzZXRNYXRoSGVscGVycyxcbmNvcHlTZXQ6Y29weVNldE1hdGhIZWxwZXJzLFxuY29weUJhZzpjb3B5QmFnTWF0aEhlbHBlcnN9O1xuXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBbW91bnRWYWx1ZX0gVlxuICogQHR5cGUgeyh2YWx1ZTogVikgPT4gQXNzZXRLaW5kRm9yVmFsdWU8Vj59XG4gKi9cbmNvbnN0IGFzc2VydFZhbHVlR2V0QXNzZXRLaW5kPSh2YWx1ZSk9PntcbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZih2YWx1ZSk7XG5pZihwYXNzU3R5bGU9PT0nYmlnaW50Jyl7XG4vKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xucmV0dXJuJ25hdCc7XG4gfVxuaWYocGFzc1N0eWxlPT09J2NvcHlBcnJheScpe1xuLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0Ki9cbnJldHVybidzZXQnO1xuIH1cbmlmKG1hdGNoZXModmFsdWUsTS5zZXQoKSkpe1xuLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0Ki9cbnJldHVybidjb3B5U2V0JztcbiB9XG5pZihtYXRjaGVzKHZhbHVlLE0uYmFnKCkpKXtcbi8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCovXG5yZXR1cm4nY29weUJhZyc7XG4gfVxuYXNzZXJ0LmZhaWwoXG4vKiBUT0RPIFRoaXMgaXNuJ3QgcXVpdGUgdGhlIHJpZ2h0IGVycm9yIG1lc3NhZ2UsIGluIGNhc2UgdmFsdWVQYXNzU3R5bGUqL1xuLyogaXMgJ3RhZ2dlZCcuIFdlIHdvdWxkIG5lZWQgdG8gZGlzdGluZ3Vpc2ggd2hhdCBraW5kIG9mIHRhZ2dlZCovXG4vKiBvYmplY3QgaXQgaXMuKi9cbi8qIEFsc28sIHRoaXMga2luZCBvZiBtYW51YWwgbGlzdGluZyBpcyBhIG1haW50ZW5hbmNlIGhhemFyZCB3ZSovXG4vKiAoVE9ETykgd2lsbCBlbmNvdW50ZXIgd2hlbiB3ZSBleHRlbmQgdGhlIG1hdGggaGVscGVycyBmdXJ0aGVyLiovXG5YIGB2YWx1ZSAke3ZhbHVlfSBtdXN0IGJlIGEgYmlnaW50LCBjb3B5U2V0LCBjb3B5QmFnLCBvciBhbiBhcnJheSwgbm90ICR7cGFzc1N0eWxlfWApO1xuXG4gfTtcblxuLyoqXG4gKlxuICogQXNzZXJ0cyB0aGF0IHZhbHVlIGlzIGEgdmFsaWQgQW1vdW50TWF0aCBhbmQgcmV0dXJucyB0aGUgYXBwcm9wcmlhdGUgaGVscGVycy5cbiAqXG4gKiBNYWRlIGF2YWlsYWJsZSBvbmx5IGZvciB0ZXN0aW5nLCBidXQgaXQgaXMgaGFybWxlc3MgZm9yIG90aGVyIHVzZXMuXG4gKlxuICogQHRlbXBsYXRlIHtBbW91bnRWYWx1ZX0gVlxuICogQHBhcmFtIHtWfSB2YWx1ZVxuICogQHJldHVybnMge01hdGhIZWxwZXJzPFY+fVxuICovXG5jb25zdCAgICAgICAgYXNzZXJ0VmFsdWVHZXRIZWxwZXJzPSh2YWx1ZSk9PlxuLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0Ki9cbmhlbHBlcnNbYXNzZXJ0VmFsdWVHZXRBc3NldEtpbmQodmFsdWUpXTtcblxuLyoqIEB0eXBlIHsoYWxsZWdlZEJyYW5kOiBCcmFuZCwgYnJhbmQ/OiBCcmFuZCkgPT4gdm9pZH0gKi8kaOKAjV9vbmNlLmFzc2VydFZhbHVlR2V0SGVscGVycyhhc3NlcnRWYWx1ZUdldEhlbHBlcnMpO1xuY29uc3Qgb3B0aW9uYWxCcmFuZENoZWNrPShhbGxlZ2VkQnJhbmQsYnJhbmQpPT57XG5pZihicmFuZCE9PXVuZGVmaW5lZCl7XG5hc3NlcnRSZW1vdGFibGUoYnJhbmQsJ2JyYW5kJyk7XG5hc3NlcnQuZXF1YWwoXG5hbGxlZ2VkQnJhbmQsXG5icmFuZCxcblggYGFtb3VudCdzIGJyYW5kICR7YWxsZWdlZEJyYW5kfSBkaWQgbm90IG1hdGNoIGV4cGVjdGVkIGJyYW5kICR7YnJhbmR9YCk7XG5cbiB9XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHBhcmFtIHtBbW91bnQ8Sz59IGxlZnRBbW91bnRcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSByaWdodEFtb3VudFxuICogQHBhcmFtIHtCcmFuZDxLPiB8IHVuZGVmaW5lZH0gYnJhbmRcbiAqIEByZXR1cm5zIHtNYXRoSGVscGVyczwqPn1cbiAqL1xuY29uc3QgY2hlY2tMUkFuZEdldEhlbHBlcnM9KGxlZnRBbW91bnQscmlnaHRBbW91bnQsYnJhbmQ9dW5kZWZpbmVkKT0+e1xuYXNzZXJ0UmVjb3JkKGxlZnRBbW91bnQsJ2xlZnRBbW91bnQnKTtcbmFzc2VydFJlY29yZChyaWdodEFtb3VudCwncmlnaHRBbW91bnQnKTtcbmNvbnN0e3ZhbHVlOmxlZnRWYWx1ZSxicmFuZDpsZWZ0QnJhbmR9PWxlZnRBbW91bnQ7XG5jb25zdHt2YWx1ZTpyaWdodFZhbHVlLGJyYW5kOnJpZ2h0QnJhbmR9PXJpZ2h0QW1vdW50O1xuYXNzZXJ0UmVtb3RhYmxlKGxlZnRCcmFuZCwnbGVmdEJyYW5kJyk7XG5hc3NlcnRSZW1vdGFibGUocmlnaHRCcmFuZCwncmlnaHRCcmFuZCcpO1xub3B0aW9uYWxCcmFuZENoZWNrKGxlZnRCcmFuZCxicmFuZCk7XG5vcHRpb25hbEJyYW5kQ2hlY2socmlnaHRCcmFuZCxicmFuZCk7XG5hc3NlcnQuZXF1YWwoXG5sZWZ0QnJhbmQsXG5yaWdodEJyYW5kLFxuWCBgQnJhbmRzIGluIGxlZnQgJHtsZWZ0QnJhbmR9IGFuZCByaWdodCAke3JpZ2h0QnJhbmR9IHNob3VsZCBtYXRjaCBidXQgZG8gbm90YCk7XG5cbmNvbnN0IGxlZnRIZWxwZXJzPWFzc2VydFZhbHVlR2V0SGVscGVycyhsZWZ0VmFsdWUpO1xuY29uc3QgcmlnaHRIZWxwZXJzPWFzc2VydFZhbHVlR2V0SGVscGVycyhyaWdodFZhbHVlKTtcbmFzc2VydC5lcXVhbChcbmxlZnRIZWxwZXJzLFxucmlnaHRIZWxwZXJzLFxuWCBgVGhlIGxlZnQgJHtsZWZ0QW1vdW50fSBhbmQgcmlnaHQgYW1vdW50ICR7cmlnaHRBbW91bnR9IGhhZCBkaWZmZXJlbnQgYXNzZXRLaW5kc2ApO1xuXG5yZXR1cm4gbGVmdEhlbHBlcnM7XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQHBhcmFtIHtNYXRoSGVscGVyczxBc3NldFZhbHVlRm9yS2luZDxLPj59IGhcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSBsZWZ0QW1vdW50XG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gcmlnaHRBbW91bnRcbiAqIEByZXR1cm5zIHtbSywgS119XG4gKi9cbmNvbnN0IGNvZXJjZUxSPShoLGxlZnRBbW91bnQscmlnaHRBbW91bnQpPT57XG4vKiBAdHMtZXhwZWN0LWVycm9yIGNvdWxkIGJlIGFyYml0cmFyeSBzdWJ0eXBlKi9cbnJldHVybltoLmRvQ29lcmNlKGxlZnRBbW91bnQudmFsdWUpLGguZG9Db2VyY2UocmlnaHRBbW91bnQudmFsdWUpXTtcbiB9O1xuXG4vKipcbiAqIExvZ2ljIGZvciBtYW5pcHVsYXRpbmcgYW1vdW50cy5cbiAqXG4gKiBBbW91bnRzIGFyZSB0aGUgY2Fub25pY2FsIGRlc2NyaXB0aW9uIG9mIHRyYWRhYmxlIGdvb2RzLiBUaGV5IGFyZSBtYW5pcHVsYXRlZFxuICogYnkgaXNzdWVycyBhbmQgbWludHMsIGFuZCByZXByZXNlbnQgdGhlIGdvb2RzIGFuZCBjdXJyZW5jeSBjYXJyaWVkIGJ5IHB1cnNlc1xuICogYW5kXG4gKiBwYXltZW50cy4gVGhleSBjYW4gYmUgdXNlZCB0byByZXByZXNlbnQgdGhpbmdzIGxpa2UgY3VycmVuY3ksIHN0b2NrLCBhbmQgdGhlXG4gKiBhYnN0cmFjdCByaWdodCB0byBwYXJ0aWNpcGF0ZSBpbiBhIHBhcnRpY3VsYXIgZXhjaGFuZ2UuXG4gKi9cbmNvbnN0IEFtb3VudE1hdGg9e1xuLyoqXG4gKiBNYWtlIGFuIGFtb3VudCBmcm9tIGEgdmFsdWUgYnkgYWRkaW5nIHRoZSBicmFuZC5cbiAqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHBhcmFtIHtCcmFuZDxLPn0gYnJhbmRcbiAqIEBwYXJhbSB7QXNzZXRWYWx1ZUZvcktpbmQ8Sz59IGFsbGVnZWRWYWx1ZVxuICogQHJldHVybnMge0Ftb3VudDxLPn1cbiAqL1xuLyogYWxsZWdlZFZhbHVlIGhhcyBhIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gZm9yIHR5cGUgd2lkZW5pbmcsIHRvIHByZXZlbnQgViBiZWluZyBib3VuZCB0byBhIGEgbGl0ZXJhbCBsaWtlIDFuKi9cbm1ha2U6KGJyYW5kLGFsbGVnZWRWYWx1ZSk9PntcbmFzc2VydFJlbW90YWJsZShicmFuZCwnYnJhbmQnKTtcbmNvbnN0IGg9YXNzZXJ0VmFsdWVHZXRIZWxwZXJzKGFsbGVnZWRWYWx1ZSk7XG5jb25zdCB2YWx1ZT1oLmRvQ29lcmNlKGFsbGVnZWRWYWx1ZSk7XG5yZXR1cm4gaGFyZGVuKHticmFuZCx2YWx1ZX0pO1xuIH0sXG4vKipcbiAqIE1ha2Ugc3VyZSB0aGlzIGFtb3VudCBpcyB2YWxpZCBlbm91Z2gsIGFuZCByZXR1cm4gYSBjb3JyZXNwb25kaW5nXG4gKiB2YWxpZCBhbW91bnQgaWYgc28uXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEBwYXJhbSB7QnJhbmR9IGJyYW5kXG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gYWxsZWdlZEFtb3VudFxuICogQHJldHVybnMge0Ftb3VudDxLPn1cbiAqL1xuY29lcmNlOihicmFuZCxhbGxlZ2VkQW1vdW50KT0+e1xuYXNzZXJ0UmVtb3RhYmxlKGJyYW5kLCdicmFuZCcpO1xuYXNzZXJ0UmVjb3JkKGFsbGVnZWRBbW91bnQsJ2Ftb3VudCcpO1xuY29uc3R7YnJhbmQ6YWxsZWdlZEJyYW5kLHZhbHVlOmFsbGVnZWRWYWx1ZX09YWxsZWdlZEFtb3VudDtcbmJyYW5kPT09YWxsZWdlZEJyYW5kfHxcbmFzc2VydC5mYWlsKFxuWCBgVGhlIGJyYW5kIGluIHRoZSBhbGxlZ2VkQW1vdW50ICR7YWxsZWdlZEFtb3VudH0gaW4gJ2NvZXJjZScgZGlkbid0IG1hdGNoIHRoZSBzcGVjaWZpZWQgYnJhbmQgJHticmFuZH0uYCk7XG5cbi8qIFdpbGwgdGhyb3cgb24gaW5hcHByb3ByaWF0ZSB2YWx1ZSovXG5yZXR1cm4gQW1vdW50TWF0aC5tYWtlKGJyYW5kLGFsbGVnZWRWYWx1ZSk7XG4gfSxcbi8qKlxuICogRXh0cmFjdCBhbmQgcmV0dXJuIHRoZSB2YWx1ZS5cbiAqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHBhcmFtIHtCcmFuZDxLPn0gYnJhbmRcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSBhbW91bnRcbiAqIEByZXR1cm5zIHtBc3NldFZhbHVlRm9yS2luZDxLPn1cbiAqL1xuZ2V0VmFsdWU6KGJyYW5kLGFtb3VudCk9PkFtb3VudE1hdGguY29lcmNlKGJyYW5kLGFtb3VudCkudmFsdWUsXG4vKipcbiAqIFJldHVybiB0aGUgYW1vdW50IHJlcHJlc2VudGluZyBhbiBlbXB0eSBhbW91bnQuIFRoaXMgaXMgdGhlXG4gKiBpZGVudGl0eSBlbGVtZW50IGZvciBNYXRoSGVscGVycy5hZGQgYW5kIE1hdEhlbHBlcnMuc3VidHJhY3QuXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPSduYXQnXVxuICogQHBhcmFtIHtCcmFuZDxLPn0gYnJhbmRcbiAqIEBwYXJhbSB7S30gW2Fzc2V0S2luZF1cbiAqIEByZXR1cm5zIHtBbW91bnQ8Sz59XG4gKi9cbi8qIEB0cy1leHBlY3QtZXJyb3IgVFMvanNkb2MgdGhpbmtzICduYXQnIGNhbid0IGJlIGFzc2lnbmVkIHRvIEsgc3ViY2xhc3NpbmcgQXNzZXRLaW5kKi9cbi8qIElmIHdlIHdlcmUgdXNpbmcgVHlwZVNjcmlwdCB3ZSdkIHNpbXBseSBvdmVybG9hZCB0aGUgZnVuY3Rpb24gZGVmaW5pdGlvbiBmb3IgZWFjaCBjYXNlLiovXG5tYWtlRW1wdHk6KGJyYW5kLGFzc2V0S2luZD0nbmF0Jyk9PntcbmFzc2VydFJlbW90YWJsZShicmFuZCwnYnJhbmQnKTtcbmFzc2VydEFzc2V0S2luZChhc3NldEtpbmQpO1xuY29uc3QgdmFsdWU9aGVscGVyc1thc3NldEtpbmRdLmRvTWFrZUVtcHR5KCk7XG4vKiBAdHMtZXhwZWN0LWVycm9yIFRTL2pzZG9jIHRoaW5rcyAnbmF0JyBjYW4ndCBiZSBhc3NpZ25lZCB0byBLIHN1YmNsYXNzaW5nIEFzc2V0S2luZCovXG5yZXR1cm4gaGFyZGVuKHticmFuZCx2YWx1ZX0pO1xuIH0sXG4vKipcbiAqIFJldHVybiB0aGUgYW1vdW50IHJlcHJlc2VudGluZyBhbiBlbXB0eSBhbW91bnQsIHVzaW5nIGFub3RoZXJcbiAqIGFtb3VudCBhcyB0aGUgdGVtcGxhdGUgZm9yIHRoZSBicmFuZCBhbmQgYXNzZXRLaW5kLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gYW1vdW50XG4gKiBAcmV0dXJucyB7QW1vdW50PEs+fVxuICovXG5tYWtlRW1wdHlGcm9tQW1vdW50OihhbW91bnQpPT57XG5hc3NlcnRSZWNvcmQoYW1vdW50LCdhbW91bnQnKTtcbmNvbnN0e2JyYW5kLHZhbHVlfT1hbW91bnQ7XG4vKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xuY29uc3QgYXNzZXRLaW5kPWFzc2VydFZhbHVlR2V0QXNzZXRLaW5kKHZhbHVlKTtcbi8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCAoaWdub3JlIGIvYyBlcnJvcmluZyBpbiBDSSBidXQgbm90IG15IElERSkqL1xucmV0dXJuIEFtb3VudE1hdGgubWFrZUVtcHR5KGJyYW5kLGFzc2V0S2luZCk7XG4gfSxcbi8qKlxuICogUmV0dXJuIHRydWUgaWYgdGhlIEFtb3VudCBpcyBlbXB0eS4gT3RoZXJ3aXNlIGZhbHNlLlxuICpcbiAqIEBwYXJhbSB7QW1vdW50fSBhbW91bnRcbiAqIEBwYXJhbSB7QnJhbmQ9fSBicmFuZFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmlzRW1wdHk6KGFtb3VudCxicmFuZD11bmRlZmluZWQpPT57XG5hc3NlcnRSZWNvcmQoYW1vdW50LCdhbW91bnQnKTtcbmNvbnN0e2JyYW5kOmFsbGVnZWRCcmFuZCx2YWx1ZX09YW1vdW50O1xuYXNzZXJ0UmVtb3RhYmxlKGFsbGVnZWRCcmFuZCwnYnJhbmQnKTtcbm9wdGlvbmFsQnJhbmRDaGVjayhhbGxlZ2VkQnJhbmQsYnJhbmQpO1xuY29uc3QgaD1hc3NlcnRWYWx1ZUdldEhlbHBlcnModmFsdWUpO1xucmV0dXJuIGguZG9Jc0VtcHR5KGguZG9Db2VyY2UodmFsdWUpKTtcbiB9LFxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIGxlZnRBbW91bnQgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZVxuICogcmlnaHRBbW91bnQuIEZvciBub24tc2NhbGFycywgXCJncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG9cIiBkZXBlbmRzXG4gKiBvbiB0aGUga2luZCBvZiBhbW91bnQsIGFzIGRlZmluZWQgYnkgdGhlIE1hdGhIZWxwZXJzLiBGb3IgZXhhbXBsZSxcbiAqIHdoZXRoZXIgcmVjdGFuZ2xlIEEgaXMgZ3JlYXRlciB0aGFuIHJlY3RhbmdsZSBCIGRlcGVuZHMgb24gd2hldGhlciByZWN0YW5nbGVcbiAqIEEgaW5jbHVkZXMgcmVjdGFuZ2xlIEIgYXMgZGVmaW5lZCBieSB0aGUgbG9naWMgaW4gTWF0aEhlbHBlcnMuXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEBwYXJhbSB7QW1vdW50PEs+fSBsZWZ0QW1vdW50XG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gcmlnaHRBbW91bnRcbiAqIEBwYXJhbSB7QnJhbmQ8Sz49fSBicmFuZFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmlzR1RFOihsZWZ0QW1vdW50LHJpZ2h0QW1vdW50LGJyYW5kPXVuZGVmaW5lZCk9PntcbmNvbnN0IGg9Y2hlY2tMUkFuZEdldEhlbHBlcnMobGVmdEFtb3VudCxyaWdodEFtb3VudCxicmFuZCk7XG5yZXR1cm4gaC5kb0lzR1RFKC4uLmNvZXJjZUxSKGgsbGVmdEFtb3VudCxyaWdodEFtb3VudCkpO1xuIH0sXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbGVmdEFtb3VudCBlcXVhbHMgdGhlIHJpZ2h0QW1vdW50LiBXZSBhc3N1bWVcbiAqIHRoYXQgaWYgaXNHVEUgaXMgdHJ1ZSBpbiBib3RoIGRpcmVjdGlvbnMsIGlzRXF1YWwgaXMgYWxzbyB0cnVlXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEBwYXJhbSB7QW1vdW50PEs+fSBsZWZ0QW1vdW50XG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gcmlnaHRBbW91bnRcbiAqIEBwYXJhbSB7QnJhbmQ8Sz49fSBicmFuZFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmlzRXF1YWw6KGxlZnRBbW91bnQscmlnaHRBbW91bnQsYnJhbmQ9dW5kZWZpbmVkKT0+e1xuY29uc3QgaD1jaGVja0xSQW5kR2V0SGVscGVycyhsZWZ0QW1vdW50LHJpZ2h0QW1vdW50LGJyYW5kKTtcbnJldHVybiBoLmRvSXNFcXVhbCguLi5jb2VyY2VMUihoLGxlZnRBbW91bnQscmlnaHRBbW91bnQpKTtcbiB9LFxuLyoqXG4gKiBSZXR1cm5zIGEgbmV3IGFtb3VudCB0aGF0IGlzIHRoZSB1bmlvbiBvZiBib3RoIGxlZnRBbW91bnQgYW5kIHJpZ2h0QW1vdW50LlxuICpcbiAqIEZvciBmdW5naWJsZSBhbW91bnQgdGhpcyBtZWFucyBhZGRpbmcgdGhlIHZhbHVlcy4gRm9yIG90aGVyIGtpbmRzIG9mXG4gKiBhbW91bnQsIGl0IHVzdWFsbHkgbWVhbnMgaW5jbHVkaW5nIGFsbCBvZiB0aGUgZWxlbWVudHMgZnJvbSBib3RoXG4gKiBsZWZ0IGFuZCByaWdodC5cbiAqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHBhcmFtIHtBbW91bnQ8Sz59IGxlZnRBbW91bnRcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSByaWdodEFtb3VudFxuICogQHBhcmFtIHtCcmFuZDxLPj19IGJyYW5kXG4gKiBAcmV0dXJucyB7QW1vdW50PEs+fVxuICovXG5hZGQ6KGxlZnRBbW91bnQscmlnaHRBbW91bnQsYnJhbmQ9dW5kZWZpbmVkKT0+e1xuY29uc3QgaD1jaGVja0xSQW5kR2V0SGVscGVycyhsZWZ0QW1vdW50LHJpZ2h0QW1vdW50LGJyYW5kKTtcbmNvbnN0IHZhbHVlPWguZG9BZGQoLi4uY29lcmNlTFIoaCxsZWZ0QW1vdW50LHJpZ2h0QW1vdW50KSk7XG5yZXR1cm4gaGFyZGVuKHticmFuZDpsZWZ0QW1vdW50LmJyYW5kLHZhbHVlfSk7XG4gfSxcbi8qKlxuICogUmV0dXJucyBhIG5ldyBhbW91bnQgdGhhdCBpcyB0aGUgbGVmdEFtb3VudCBtaW51cyB0aGUgcmlnaHRBbW91bnRcbiAqIChpLmUuIGV2ZXJ5dGhpbmcgaW4gdGhlIGxlZnRBbW91bnQgdGhhdCBpcyBub3QgaW4gdGhlXG4gKiByaWdodEFtb3VudCkuIElmIGxlZnRBbW91bnQgZG9lc24ndCBpbmNsdWRlIHJpZ2h0QW1vdW50XG4gKiAoc3VidHJhY3Rpb24gcmVzdWx0cyBpbiBhIG5lZ2F0aXZlKSwgdGhyb3cgIGFuIGVycm9yLiBCZWNhdXNlIHRoZVxuICogbGVmdCBhbW91bnQgbXVzdCBpbmNsdWRlIHRoZSByaWdodCBhbW91bnQsIHRoaXMgaXMgTk9UIGVxdWl2YWxlbnRcbiAqIHRvIHNldCBzdWJ0cmFjdGlvbi5cbiAqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHBhcmFtIHtBbW91bnQ8Sz59IGxlZnRBbW91bnRcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSByaWdodEFtb3VudFxuICogQHBhcmFtIHtCcmFuZDxLPj19IGJyYW5kXG4gKiBAcmV0dXJucyB7QW1vdW50PEs+fVxuICovXG5zdWJ0cmFjdDoobGVmdEFtb3VudCxyaWdodEFtb3VudCxicmFuZD11bmRlZmluZWQpPT57XG5jb25zdCBoPWNoZWNrTFJBbmRHZXRIZWxwZXJzKGxlZnRBbW91bnQscmlnaHRBbW91bnQsYnJhbmQpO1xuY29uc3QgdmFsdWU9aC5kb1N1YnRyYWN0KC4uLmNvZXJjZUxSKGgsbGVmdEFtb3VudCxyaWdodEFtb3VudCkpO1xucmV0dXJuIGhhcmRlbih7YnJhbmQ6bGVmdEFtb3VudC5icmFuZCx2YWx1ZX0pO1xuIH0sXG4vKipcbiAqIFJldHVybnMgdGhlIG1pbiB2YWx1ZSBiZXR3ZWVuIHggYW5kIHkgdXNpbmcgaXNHVEVcbiAqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHBhcmFtIHtBbW91bnQ8Sz59IHhcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSB5XG4gKiBAcGFyYW0ge0JyYW5kPEs+PX0gYnJhbmRcbiAqIEByZXR1cm5zIHtBbW91bnQ8Sz59XG4gKi9cbm1pbjooeCx5LGJyYW5kPXVuZGVmaW5lZCk9PkFtb3VudE1hdGguaXNHVEUoeCx5LGJyYW5kKT95OngsXG4vKipcbiAqIFJldHVybnMgdGhlIG1heCB2YWx1ZSBiZXR3ZWVuIHggYW5kIHkgdXNpbmcgaXNHVEVcbiAqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHBhcmFtIHtBbW91bnQ8Sz59IHhcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSB5XG4gKiBAcGFyYW0ge0JyYW5kPEs+PX0gYnJhbmRcbiAqIEByZXR1cm5zIHtBbW91bnQ8Sz59XG4gKi9cbm1heDooeCx5LGJyYW5kPXVuZGVmaW5lZCk9PkFtb3VudE1hdGguaXNHVEUoeCx5LGJyYW5kKT94Onl9OyRo4oCNX29uY2UuQW1vdW50TWF0aChBbW91bnRNYXRoKTtcblxuaGFyZGVuKEFtb3VudE1hdGgpO1xuXG4vKipcbiAqXG4gKiBAcGFyYW0ge0Ftb3VudH0gYW1vdW50XG4gKi9cbmNvbnN0IGdldEFzc2V0S2luZD0oYW1vdW50KT0+e1xuYXNzZXJ0UmVjb3JkKGFtb3VudCwnYW1vdW50Jyk7XG5jb25zdHt2YWx1ZX09YW1vdW50O1xuLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0IChpZ25vcmUgYi9jIGVycm9yaW5nIGluIENJIGJ1dCBub3QgbXkgSURFKSovXG5yZXR1cm4gYXNzZXJ0VmFsdWVHZXRBc3NldEtpbmQodmFsdWUpO1xuIH07JGjigI1fb25jZS5nZXRBc3NldEtpbmQoZ2V0QXNzZXRLaW5kKTtcbmhhcmRlbihnZXRBc3NldEtpbmQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkFzc2V0S2luZCI6WyJBc3NldEtpbmQiXSwiYXNzZXJ0QXNzZXRLaW5kIjpbImFzc2VydEFzc2V0S2luZCJdLCJBbW91bnRNYXRoIjpbIkFtb3VudE1hdGgiXSwiZ2V0QXNzZXRLaW5kIjpbImdldEFzc2V0S2luZCJdLCJhc3NlcnRWYWx1ZUdldEhlbHBlcnMiOlsiYXNzZXJ0VmFsdWVHZXRIZWxwZXJzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAQxu6/2BQAA9gUAACcAAABAYWdvcmljL2VydHAtdjAuMTUuNS9zcmMvZGlzcGxheUluZm8uanN7ImltcG9ydHMiOlsiLi90eXBlR3VhcmRzLmpzIiwiQGFnb3JpYy9hc3NlcnQiLCJAYWdvcmljL3N0b3JlIl0sImV4cG9ydHMiOlsiY29lcmNlRGlzcGxheUluZm8iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0LFgsZml0LERpc3BsYXlJbmZvU2hhcGU7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9hc3NlcnRcIiwgW1tcImFzc2VydFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0ID0gJGjigI1fYSldXSxbXCJkZXRhaWxzXCIsIFskaOKAjV9hID0+IChYID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcImZpdFwiLCBbJGjigI1fYSA9PiAoZml0ID0gJGjigI1fYSldXV1dLFtcIi4vdHlwZUd1YXJkcy5qc1wiLCBbW1wiRGlzcGxheUluZm9TaGFwZVwiLCBbJGjigI1fYSA9PiAoRGlzcGxheUluZm9TaGFwZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuLyoqXG4gKiBAcGFyYW0ge0FkZGl0aW9uYWxEaXNwbGF5SW5mb30gYWxsZWdlZERpc3BsYXlJbmZvXG4gKiBAcGFyYW0ge0Fzc2V0S2luZH0gYXNzZXRLaW5kXG4gKiBAcmV0dXJucyB7RGlzcGxheUluZm99XG4gKi9cbmNvbnN0ICAgICAgICBjb2VyY2VEaXNwbGF5SW5mbz0oYWxsZWdlZERpc3BsYXlJbmZvLGFzc2V0S2luZCk9PntcbmZpdChhbGxlZ2VkRGlzcGxheUluZm8sRGlzcGxheUluZm9TaGFwZSwnZGlzcGxheUluZm8nKTtcblxuaWYoYWxsZWdlZERpc3BsYXlJbmZvLmFzc2V0S2luZCE9PXVuZGVmaW5lZCl7XG5hbGxlZ2VkRGlzcGxheUluZm8uYXNzZXRLaW5kPT09YXNzZXRLaW5kfHxcbmFzc2VydC5mYWlsKFxuWCBgZGlzcGxheUluZm8uYXNzZXRLaW5kIHdhcyBwcmVzZW50ICgke2FsbGVnZWREaXNwbGF5SW5mby5hc3NldEtpbmR9KSBhbmQgZGlkIG5vdCBtYXRjaCB0aGUgYXNzZXRLaW5kIGFyZ3VtZW50ICgke2Fzc2V0S2luZH0pYCk7XG5cbiB9XG5jb25zdCBkaXNwbGF5SW5mbz1oYXJkZW4oey4uLmFsbGVnZWREaXNwbGF5SW5mbyxhc3NldEtpbmR9KTtcblxuaWYoZGlzcGxheUluZm8uZGVjaW1hbFBsYWNlcyE9PXVuZGVmaW5lZCl7XG5OdW1iZXIuaXNTYWZlSW50ZWdlcihkaXNwbGF5SW5mby5kZWNpbWFsUGxhY2VzKXx8XG5hc3NlcnQuZmFpbChcblggYGRlY2ltYWxQbGFjZXMgJHtkaXNwbGF5SW5mby5kZWNpbWFsUGxhY2VzfSBpcyBub3QgYSBzYWZlIGludGVnZXJgKTtcblxuIH1cblxucmV0dXJuIGRpc3BsYXlJbmZvO1xuIH07JGjigI1fb25jZS5jb2VyY2VEaXNwbGF5SW5mbyhjb2VyY2VEaXNwbGF5SW5mbyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiY29lcmNlRGlzcGxheUluZm8iOlsiY29lcmNlRGlzcGxheUluZm8iXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAyb0sONMBAADTAQAAIQAAAEBhZ29yaWMvZXJ0cC12MC4xNS41L3NyYy9pbmRleC5qc3siaW1wb3J0cyI6WyIuL2Ftb3VudE1hdGguanMiLCIuL2lzc3VlcktpdC5qcyIsIi4vdHlwZUd1YXJkcy5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIi4vYW1vdW50TWF0aC5qcyIsIi4vaXNzdWVyS2l0LmpzIiwiLi90eXBlR3VhcmRzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9hbW91bnRNYXRoLmpzXCIsIFtdXSxbXCIuL2lzc3VlcktpdC5qc1wiLCBbXV0sW1wiLi90eXBlR3VhcmRzLmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABnzZ9foRoAAKEaAAAlAAAAQGFnb3JpYy9lcnRwLXYwLjE1LjUvc3JjL2lzc3VlcktpdC5qc3siaW1wb3J0cyI6WyIuL2Ftb3VudE1hdGguanMiLCIuL2Rpc3BsYXlJbmZvLmpzIiwiLi9wYXltZW50TGVkZ2VyLmpzIiwiLi90eXBlcy5qcyIsIkBhZ29yaWMvYXNzZXJ0IiwiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvdmF0LWRhdGEiXSwiZXhwb3J0cyI6WyJtYWtlRHVyYWJsZUlzc3VlcktpdCIsIm1ha2VJc3N1ZXJLaXQiLCJ2aXZpZnlJc3N1ZXJLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0LGFzc2VydFBhdHRlcm4sbWFrZVNjYWxhckJpZ01hcFN0b3JlLEFzc2V0S2luZCxhc3NlcnRBc3NldEtpbmQsY29lcmNlRGlzcGxheUluZm8sdml2aWZ5UGF5bWVudExlZGdlcjskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2Fzc2VydFwiLCBbW1wiYXNzZXJ0XCIsIFskaOKAjV9hID0+IChhc3NlcnQgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiYXNzZXJ0UGF0dGVyblwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGF0dGVybiA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJtYWtlU2NhbGFyQmlnTWFwU3RvcmVcIiwgWyRo4oCNX2EgPT4gKG1ha2VTY2FsYXJCaWdNYXBTdG9yZSA9ICRo4oCNX2EpXV1dXSxbXCIuL2Ftb3VudE1hdGguanNcIiwgW1tcIkFzc2V0S2luZFwiLCBbJGjigI1fYSA9PiAoQXNzZXRLaW5kID0gJGjigI1fYSldXSxbXCJhc3NlcnRBc3NldEtpbmRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydEFzc2V0S2luZCA9ICRo4oCNX2EpXV1dXSxbXCIuL2Rpc3BsYXlJbmZvLmpzXCIsIFtbXCJjb2VyY2VEaXNwbGF5SW5mb1wiLCBbJGjigI1fYSA9PiAoY29lcmNlRGlzcGxheUluZm8gPSAkaOKAjV9hKV1dXV0sW1wiLi9wYXltZW50TGVkZ2VyLmpzXCIsIFtbXCJ2aXZpZnlQYXltZW50TGVkZ2VyXCIsIFskaOKAjV9hID0+ICh2aXZpZnlQYXltZW50TGVkZ2VyID0gJGjigI1fYSldXV1dLFtcIi4vdHlwZXMuanNcIiwgW11dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BhZ29yaWMvdmF0LWRhdGEnKS5CYWdnYWdlfSBCYWdnYWdlICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gaXNzdWVyQmFnZ2FnZVxuICogQHBhcmFtIHtTaHV0ZG93bldpdGhGYWlsdXJlPX0gb3B0U2h1dGRvd25XaXRoRmFpbHVyZSBJZiB0aGlzIGlzc3VlciBmYWlsc1xuICogaW4gdGhlIG1pZGRsZSBvZiBhbiBhdG9taWMgYWN0aW9uICh3aGljaCBidHcgc2hvdWxkIG5ldmVyIGhhcHBlbiksIGl0XG4gKiBwb3RlbnRpYWxseSBsZWF2ZXMgaXRzIGxlZGdlciBpbiBhIGNvcnJ1cHRlZCBzdGF0ZS4gSWYgdGhpcyBmdW5jdGlvbiB3YXNcbiAqIHByb3ZpZGVkLCB0aGVuIHRoZSBmYWlsZWQgYXRvbWljIGFjdGlvbiB3aWxsIGNhbGwgaXQsIHNvIHRoYXQgc29tZVxuICogbGFyZ2VyIHVuaXQgb2YgY29tcHV0YXRpb24sIGxpa2UgdGhlIGVuY2xvc2luZyB2YXQsIGNhbiBiZSBzaHV0ZG93blxuICogYmVmb3JlIGFueXRoaW5nIGVsc2UgaXMgY29ycnVwdGVkIGJ5IHRoYXQgY29ycnVwdGVkIHN0YXRlLlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzQzNFxuICogQHJldHVybnMge0lzc3VlcktpdDxLPn1cbiAqL1xuY29uc3QgICAgICAgIHZpdmlmeUlzc3VlcktpdD0oXG5pc3N1ZXJCYWdnYWdlLFxub3B0U2h1dGRvd25XaXRoRmFpbHVyZT11bmRlZmluZWQpPT5cbntcbmNvbnN0IG5hbWU9aXNzdWVyQmFnZ2FnZS5nZXQoJ25hbWUnKTtcbmNvbnN0IGFzc2V0S2luZD1pc3N1ZXJCYWdnYWdlLmdldCgnYXNzZXRLaW5kJyk7XG5jb25zdCBkaXNwbGF5SW5mbz1pc3N1ZXJCYWdnYWdlLmdldCgnZGlzcGxheUluZm8nKTtcbmNvbnN0IGVsZW1lbnRTaGFwZT1pc3N1ZXJCYWdnYWdlLmdldCgnZWxlbWVudFNoYXBlJyk7XG5hc3NlcnQudHlwZW9mKG5hbWUsJ3N0cmluZycpO1xuYXNzZXJ0QXNzZXRLaW5kKGFzc2V0S2luZCk7XG5cbi8qIEFkZCBhc3NldEtpbmQgdG8gZGlzcGxheUluZm8sIG9yIG92ZXJyaWRlIGlmIHByZXNlbnQqL1xuY29uc3QgY2xlYW5EaXNwbGF5SW5mbz1jb2VyY2VEaXNwbGF5SW5mbyhkaXNwbGF5SW5mbyxhc3NldEtpbmQpO1xuaWYob3B0U2h1dGRvd25XaXRoRmFpbHVyZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnQudHlwZW9mKG9wdFNodXRkb3duV2l0aEZhaWx1cmUsJ2Z1bmN0aW9uJyk7XG4gfVxuXG5pZihlbGVtZW50U2hhcGUhPT11bmRlZmluZWQpe1xuYXNzZXJ0UGF0dGVybihlbGVtZW50U2hhcGUpO1xuIH1cblxuLyogQXR0ZW51YXRlIHRoZSBwb3dlcmZ1bCBhdXRob3JpdHkgdG8gbWludCBhbmQgY2hhbmdlIGJhbGFuY2VzKi9cbmNvbnN0e2lzc3VlcixtaW50LGJyYW5kfT12aXZpZnlQYXltZW50TGVkZ2VyKFxuaXNzdWVyQmFnZ2FnZSxcbm5hbWUsXG5hc3NldEtpbmQsXG5jbGVhbkRpc3BsYXlJbmZvLFxuZWxlbWVudFNoYXBlLFxub3B0U2h1dGRvd25XaXRoRmFpbHVyZSk7XG5cblxucmV0dXJuIGhhcmRlbih7XG5icmFuZCxcbmlzc3Vlcixcbm1pbnQsXG5kaXNwbGF5SW5mbzpjbGVhbkRpc3BsYXlJbmZvfSk7XG5cbiB9OyRo4oCNX29uY2Uudml2aWZ5SXNzdWVyS2l0KHZpdmlmeUlzc3VlcktpdCk7XG5oYXJkZW4odml2aWZ5SXNzdWVyS2l0KTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogVGhlIG5hbWUgYmVjb21lcyBwYXJ0IG9mIHRoZSBicmFuZCBpbiBhc3NldCBkZXNjcmlwdGlvbnMuXG4gKiBUaGUgbmFtZSBpcyB1c2VmdWwgZm9yIGRlYnVnZ2luZyBhbmQgZG91YmxlLWNoZWNraW5nXG4gKiBhc3N1bXB0aW9ucywgYnV0IHNob3VsZCBub3QgYmUgdHJ1c3RlZCB3cnQgYW55IGV4dGVybmFsIG5hbWVzcGFjZS5cbiAqIEZvciBleGFtcGxlLCBhbnlvbmUgY291bGQgY3JlYXRlIGEgbmV3IGlzc3VlciBraXQgd2l0aCBuYW1lICdCVEMnLCBidXRcbiAqIGl0IGlzIG5vdCBiaXRjb2luIG9yIGV2ZW4gcmVsYXRlZC4gSXQgaXMgb25seSB0aGUgbmFtZSBhY2NvcmRpbmdcbiAqIHRvIHRoYXQgaXNzdWVyIGFuZCBicmFuZC5cbiAqXG4gKiBUaGUgYXNzZXRLaW5kIHdpbGwgYmUgdXNlZCB0byBpbXBvcnQgYSBzcGVjaWZpYyBtYXRoSGVscGVyc1xuICogZnJvbSB0aGUgbWF0aEhlbHBlcnMgbGlicmFyeS4gRm9yIGV4YW1wbGUsIG5hdE1hdGhIZWxwZXJzLCB0aGVcbiAqIGRlZmF1bHQsIGlzIHVzZWQgZm9yIGJhc2ljIGZ1bmdpYmxlIHRva2Vucy5cbiAqXG4gKiAgYGRpc3BsYXlJbmZvYCBnaXZlcyBpbmZvcm1hdGlvbiB0byB0aGUgVUkgb24gaG93IHRvIGRpc3BsYXkgdGhlIGFtb3VudC5cbiAqXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGlzc3VlckJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge0t9IFthc3NldEtpbmQ9QXNzZXRLaW5kLk5BVF1cbiAqIEBwYXJhbSB7QWRkaXRpb25hbERpc3BsYXlJbmZvfSBbZGlzcGxheUluZm89e31dXG4gKiBAcGFyYW0ge1NodXRkb3duV2l0aEZhaWx1cmU9fSBvcHRTaHV0ZG93bldpdGhGYWlsdXJlIElmIHRoaXMgaXNzdWVyIGZhaWxzXG4gKiBpbiB0aGUgbWlkZGxlIG9mIGFuIGF0b21pYyBhY3Rpb24gKHdoaWNoIGJ0dyBzaG91bGQgbmV2ZXIgaGFwcGVuKSwgaXRcbiAqIHBvdGVudGlhbGx5IGxlYXZlcyBpdHMgbGVkZ2VyIGluIGEgY29ycnVwdGVkIHN0YXRlLiBJZiB0aGlzIGZ1bmN0aW9uIHdhc1xuICogcHJvdmlkZWQsIHRoZW4gdGhlIGZhaWxlZCBhdG9taWMgYWN0aW9uIHdpbGwgY2FsbCBpdCwgc28gdGhhdCBzb21lXG4gKiBsYXJnZXIgdW5pdCBvZiBjb21wdXRhdGlvbiwgbGlrZSB0aGUgZW5jbG9zaW5nIHZhdCwgY2FuIGJlIHNodXRkb3duXG4gKiBiZWZvcmUgYW55dGhpbmcgZWxzZSBpcyBjb3JydXB0ZWQgYnkgdGhhdCBjb3JydXB0ZWQgc3RhdGUuXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNDM0XG4gKiBAcGFyYW0ge1BhcnRpYWw8e2VsZW1lbnRTaGFwZTogUGF0dGVybn0+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtJc3N1ZXJLaXQ8Sz59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlRHVyYWJsZUlzc3VlcktpdD0oXG5pc3N1ZXJCYWdnYWdlLFxubmFtZSxcbi8qIEB0cy1leHBlY3QtZXJyb3IgSyBjb3VsZCBiZSBpbnN0YW50aWF0ZWQgd2l0aCBhIGRpZmZlcmVudCBzdWJ0eXBlIG9mIEFzc2V0S2luZCovXG5hc3NldEtpbmQ9QXNzZXRLaW5kLk5BVCxcbmRpc3BsYXlJbmZvPWhhcmRlbih7fSksXG5vcHRTaHV0ZG93bldpdGhGYWlsdXJlPXVuZGVmaW5lZCxcbntlbGVtZW50U2hhcGU9dW5kZWZpbmVkfT17fSk9Plxue1xuaXNzdWVyQmFnZ2FnZS5pbml0KCduYW1lJyxuYW1lKTtcbmlzc3VlckJhZ2dhZ2UuaW5pdCgnYXNzZXRLaW5kJyxhc3NldEtpbmQpO1xuaXNzdWVyQmFnZ2FnZS5pbml0KCdkaXNwbGF5SW5mbycsZGlzcGxheUluZm8pO1xuaXNzdWVyQmFnZ2FnZS5pbml0KCdlbGVtZW50U2hhcGUnLGVsZW1lbnRTaGFwZSk7XG5yZXR1cm4gdml2aWZ5SXNzdWVyS2l0KGlzc3VlckJhZ2dhZ2Usb3B0U2h1dGRvd25XaXRoRmFpbHVyZSk7XG4gfTskaOKAjV9vbmNlLm1ha2VEdXJhYmxlSXNzdWVyS2l0KG1ha2VEdXJhYmxlSXNzdWVyS2l0KTtcbmhhcmRlbihtYWtlRHVyYWJsZUlzc3VlcktpdCk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIFRoZSBuYW1lIGJlY29tZXMgcGFydCBvZiB0aGUgYnJhbmQgaW4gYXNzZXQgZGVzY3JpcHRpb25zLlxuICogVGhlIG5hbWUgaXMgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgYW5kIGRvdWJsZS1jaGVja2luZ1xuICogYXNzdW1wdGlvbnMsIGJ1dCBzaG91bGQgbm90IGJlIHRydXN0ZWQgd3J0IGFueSBleHRlcm5hbCBuYW1lc3BhY2UuXG4gKiBGb3IgZXhhbXBsZSwgYW55b25lIGNvdWxkIGNyZWF0ZSBhIG5ldyBpc3N1ZXIga2l0IHdpdGggbmFtZSAnQlRDJywgYnV0XG4gKiBpdCBpcyBub3QgYml0Y29pbiBvciBldmVuIHJlbGF0ZWQuIEl0IGlzIG9ubHkgdGhlIG5hbWUgYWNjb3JkaW5nXG4gKiB0byB0aGF0IGlzc3VlciBhbmQgYnJhbmQuXG4gKlxuICogVGhlIGFzc2V0S2luZCB3aWxsIGJlIHVzZWQgdG8gaW1wb3J0IGEgc3BlY2lmaWMgbWF0aEhlbHBlcnNcbiAqIGZyb20gdGhlIG1hdGhIZWxwZXJzIGxpYnJhcnkuIEZvciBleGFtcGxlLCBuYXRNYXRoSGVscGVycywgdGhlXG4gKiBkZWZhdWx0LCBpcyB1c2VkIGZvciBiYXNpYyBmdW5naWJsZSB0b2tlbnMuXG4gKlxuICogIGBkaXNwbGF5SW5mb2AgZ2l2ZXMgaW5mb3JtYXRpb24gdG8gdGhlIFVJIG9uIGhvdyB0byBkaXNwbGF5IHRoZSBhbW91bnQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7S30gW2Fzc2V0S2luZD1Bc3NldEtpbmQuTkFUXVxuICogQHBhcmFtIHtBZGRpdGlvbmFsRGlzcGxheUluZm99IFtkaXNwbGF5SW5mbz17fV1cbiAqIEBwYXJhbSB7U2h1dGRvd25XaXRoRmFpbHVyZT19IG9wdFNodXRkb3duV2l0aEZhaWx1cmUgSWYgdGhpcyBpc3N1ZXIgZmFpbHNcbiAqIGluIHRoZSBtaWRkbGUgb2YgYW4gYXRvbWljIGFjdGlvbiAod2hpY2ggYnR3IHNob3VsZCBuZXZlciBoYXBwZW4pLCBpdFxuICogcG90ZW50aWFsbHkgbGVhdmVzIGl0cyBsZWRnZXIgaW4gYSBjb3JydXB0ZWQgc3RhdGUuIElmIHRoaXMgZnVuY3Rpb24gd2FzXG4gKiBwcm92aWRlZCwgdGhlbiB0aGUgZmFpbGVkIGF0b21pYyBhY3Rpb24gd2lsbCBjYWxsIGl0LCBzbyB0aGF0IHNvbWVcbiAqIGxhcmdlciB1bml0IG9mIGNvbXB1dGF0aW9uLCBsaWtlIHRoZSBlbmNsb3NpbmcgdmF0LCBjYW4gYmUgc2h1dGRvd25cbiAqIGJlZm9yZSBhbnl0aGluZyBlbHNlIGlzIGNvcnJ1cHRlZCBieSB0aGF0IGNvcnJ1cHRlZCBzdGF0ZS5cbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM0MzRcbiAqIEBwYXJhbSB7UGFydGlhbDx7ZWxlbWVudFNoYXBlOiBQYXR0ZXJufT59IFtvcHRpb25zXVxuICogQHJldHVybnMge0lzc3VlcktpdDxLPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VJc3N1ZXJLaXQ9KFxubmFtZSxcbi8qIEB0cy1leHBlY3QtZXJyb3IgSyBjb3VsZCBiZSBpbnN0YW50aWF0ZWQgd2l0aCBhIGRpZmZlcmVudCBzdWJ0eXBlIG9mIEFzc2V0S2luZCovXG5hc3NldEtpbmQ9QXNzZXRLaW5kLk5BVCxcbmRpc3BsYXlJbmZvPWhhcmRlbih7fSksXG5vcHRTaHV0ZG93bldpdGhGYWlsdXJlPXVuZGVmaW5lZCxcbntlbGVtZW50U2hhcGU9dW5kZWZpbmVkfT17fSk9PlxuXG5tYWtlRHVyYWJsZUlzc3VlcktpdChcbm1ha2VTY2FsYXJCaWdNYXBTdG9yZSgnZHJvcHBlZCBpc3N1ZXIga2l0Jyx7ZHVyYWJsZTp0cnVlfSksXG5uYW1lLFxuYXNzZXRLaW5kLFxuZGlzcGxheUluZm8sXG5vcHRTaHV0ZG93bldpdGhGYWlsdXJlLFxue2VsZW1lbnRTaGFwZX0pOyRo4oCNX29uY2UubWFrZUlzc3VlcktpdChtYWtlSXNzdWVyS2l0KTtcblxuaGFyZGVuKG1ha2VJc3N1ZXJLaXQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InZpdmlmeUlzc3VlcktpdCI6WyJ2aXZpZnlJc3N1ZXJLaXQiXSwibWFrZUR1cmFibGVJc3N1ZXJLaXQiOlsibWFrZUR1cmFibGVJc3N1ZXJLaXQiXSwibWFrZUlzc3VlcktpdCI6WyJtYWtlSXNzdWVyS2l0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAFcGej55BQAAeQUAADoAAABAYWdvcmljL2VydHAtdjAuMTUuNS9zcmMvbWF0aEhlbHBlcnMvY29weUJhZ01hdGhIZWxwZXJzLmpzeyJpbXBvcnRzIjpbIi4uL3R5cGVzLmpzIiwiQGFnb3JpYy9zdG9yZSJdLCJleHBvcnRzIjpbImNvcHlCYWdNYXRoSGVscGVycyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBrZXlFUSxtYWtlQ29weUJhZyxmaXQsTSxnZXRDb3B5QmFnRW50cmllcyxiYWdJc1N1cGVyYmFnLGJhZ1VuaW9uLGJhZ0Rpc2pvaW50U3VidHJhY3Q7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wia2V5RVFcIiwgWyRo4oCNX2EgPT4gKGtleUVRID0gJGjigI1fYSldXSxbXCJtYWtlQ29weUJhZ1wiLCBbJGjigI1fYSA9PiAobWFrZUNvcHlCYWcgPSAkaOKAjV9hKV1dLFtcImZpdFwiLCBbJGjigI1fYSA9PiAoZml0ID0gJGjigI1fYSldXSxbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXSxbXCJnZXRDb3B5QmFnRW50cmllc1wiLCBbJGjigI1fYSA9PiAoZ2V0Q29weUJhZ0VudHJpZXMgPSAkaOKAjV9hKV1dLFtcImJhZ0lzU3VwZXJiYWdcIiwgWyRo4oCNX2EgPT4gKGJhZ0lzU3VwZXJiYWcgPSAkaOKAjV9hKV1dLFtcImJhZ1VuaW9uXCIsIFskaOKAjV9hID0+IChiYWdVbmlvbiA9ICRo4oCNX2EpXV0sW1wiYmFnRGlzam9pbnRTdWJ0cmFjdFwiLCBbJGjigI1fYSA9PiAoYmFnRGlzam9pbnRTdWJ0cmFjdCA9ICRo4oCNX2EpXV1dXSxbXCIuLi90eXBlcy5qc1wiLCBbXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlIHtDb3B5QmFnVmFsdWV9ICovXG5jb25zdCBlbXB0eT1tYWtlQ29weUJhZyhbXSk7XG5cbi8qKlxuICogQHR5cGUge0NvcHlCYWdNYXRoSGVscGVyc31cbiAqL1xuY29uc3QgICAgICAgIGNvcHlCYWdNYXRoSGVscGVycz1oYXJkZW4oe1xuZG9Db2VyY2U6KGJhZyk9PntcbmZpdChiYWcsTS5iYWcoKSwnYmFnIG9mIGFtb3VudCcpO1xucmV0dXJuIGJhZztcbiB9LFxuZG9NYWtlRW1wdHk6KCk9PmVtcHR5LFxuZG9Jc0VtcHR5OihiYWcpPT5nZXRDb3B5QmFnRW50cmllcyhiYWcpLmxlbmd0aD09PTAsXG5kb0lzR1RFOmJhZ0lzU3VwZXJiYWcsXG5kb0lzRXF1YWw6a2V5RVEsXG5kb0FkZDpiYWdVbmlvbixcbmRvU3VidHJhY3Q6YmFnRGlzam9pbnRTdWJ0cmFjdH0pOyRo4oCNX29uY2UuY29weUJhZ01hdGhIZWxwZXJzKGNvcHlCYWdNYXRoSGVscGVycyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiY29weUJhZ01hdGhIZWxwZXJzIjpbImNvcHlCYWdNYXRoSGVscGVycyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAs+ljtjQUAAI0FAAA6AAAAQGFnb3JpYy9lcnRwLXYwLjE1LjUvc3JjL21hdGhIZWxwZXJzL2NvcHlTZXRNYXRoSGVscGVycy5qc3siaW1wb3J0cyI6WyIuLi90eXBlcy5qcyIsIkBhZ29yaWMvc3RvcmUiXSwiZXhwb3J0cyI6WyJjb3B5U2V0TWF0aEhlbHBlcnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQga2V5RVEsbWFrZUNvcHlTZXQsZml0LE0sZ2V0Q29weVNldEtleXMsc2V0SXNTdXBlcnNldCxzZXREaXNqb2ludFVuaW9uLHNldERpc2pvaW50U3VidHJhY3Q7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wia2V5RVFcIiwgWyRo4oCNX2EgPT4gKGtleUVRID0gJGjigI1fYSldXSxbXCJtYWtlQ29weVNldFwiLCBbJGjigI1fYSA9PiAobWFrZUNvcHlTZXQgPSAkaOKAjV9hKV1dLFtcImZpdFwiLCBbJGjigI1fYSA9PiAoZml0ID0gJGjigI1fYSldXSxbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXSxbXCJnZXRDb3B5U2V0S2V5c1wiLCBbJGjigI1fYSA9PiAoZ2V0Q29weVNldEtleXMgPSAkaOKAjV9hKV1dLFtcInNldElzU3VwZXJzZXRcIiwgWyRo4oCNX2EgPT4gKHNldElzU3VwZXJzZXQgPSAkaOKAjV9hKV1dLFtcInNldERpc2pvaW50VW5pb25cIiwgWyRo4oCNX2EgPT4gKHNldERpc2pvaW50VW5pb24gPSAkaOKAjV9hKV1dLFtcInNldERpc2pvaW50U3VidHJhY3RcIiwgWyRo4oCNX2EgPT4gKHNldERpc2pvaW50U3VidHJhY3QgPSAkaOKAjV9hKV1dXV0sW1wiLi4vdHlwZXMuanNcIiwgW11dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZSB7Q29weVNldFZhbHVlfSAqL1xuY29uc3QgZW1wdHk9bWFrZUNvcHlTZXQoW10pO1xuXG4vKipcbiAqIEB0eXBlIHtDb3B5U2V0TWF0aEhlbHBlcnN9XG4gKi9cbmNvbnN0ICAgICAgICBjb3B5U2V0TWF0aEhlbHBlcnM9aGFyZGVuKHtcbmRvQ29lcmNlOihzZXQpPT57XG5maXQoc2V0LE0uc2V0KCksJ3NldCBvZiBhbW91bnQnKTtcbnJldHVybiBzZXQ7XG4gfSxcbmRvTWFrZUVtcHR5OigpPT5lbXB0eSxcbmRvSXNFbXB0eTooc2V0KT0+Z2V0Q29weVNldEtleXMoc2V0KS5sZW5ndGg9PT0wLFxuZG9Jc0dURTpzZXRJc1N1cGVyc2V0LFxuZG9Jc0VxdWFsOmtleUVRLFxuZG9BZGQ6c2V0RGlzam9pbnRVbmlvbixcbmRvU3VidHJhY3Q6c2V0RGlzam9pbnRTdWJ0cmFjdH0pOyRo4oCNX29uY2UuY29weVNldE1hdGhIZWxwZXJzKGNvcHlTZXRNYXRoSGVscGVycyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiY29weVNldE1hdGhIZWxwZXJzIjpbImNvcHlTZXRNYXRoSGVscGVycyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADtL0nCCQYAAAkGAAA2AAAAQGFnb3JpYy9lcnRwLXYwLjE1LjUvc3JjL21hdGhIZWxwZXJzL25hdE1hdGhIZWxwZXJzLmpzeyJpbXBvcnRzIjpbIi4uL3R5cGVzLmpzIiwiQGFnb3JpYy9uYXQiXSwiZXhwb3J0cyI6WyJuYXRNYXRoSGVscGVycyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBOYXQsaXNOYXQ7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9uYXRcIiwgW1tcIk5hdFwiLCBbJGjigI1fYSA9PiAoTmF0ID0gJGjigI1fYSldXSxbXCJpc05hdFwiLCBbJGjigI1fYSA9PiAoaXNOYXQgPSAkaOKAjV9hKV1dXV0sW1wiLi4vdHlwZXMuanNcIiwgW11dXSk7ICAgXG5cblxuXG5cblxuY29uc3R7ZGV0YWlsczpYfT1hc3NlcnQ7XG5jb25zdCBlbXB0eT0wbjtcblxuLyoqXG4gKiBGdW5naWJsZSBkaWdpdGFsIGFzc2V0cyB1c2UgdGhlIG5hdE1hdGhIZWxwZXJzIHRvIG1hbmFnZSBiYWxhbmNlcyAtXG4gKiB0aGUgb3BlcmF0aW9ucyBhcmUgbWVyZWx5IGFyaXRobWV0aWMgb24gbmF0dXJhbCwgbm9uLW5lZ2F0aXZlXG4gKiBudW1iZXJzLlxuICpcbiAqIE5hdHVyYWwgbnVtYmVycyBhcmUgdXNlZCBmb3IgZnVuZ2libGUgZXJpZ2h0cyBzdWNoIGFzIG1vbmV5IGJlY2F1c2VcbiAqIHJvdW5kaW5nIGlzc3VlcyBtYWtlIGZsb2F0cyBwcm9ibGVtYXRpYy4gQWxsIG9wZXJhdGlvbnMgc2hvdWxkIGJlXG4gKiBkb25lIHdpdGggdGhlIHNtYWxsZXN0IHdob2xlIHVuaXQgc3VjaCB0aGF0IHRoZSBOYXRNYXRoSGVscGVycyBuZXZlclxuICogZGVhbHMgd2l0aCBmcmFjdGlvbmFsIHBhcnRzLlxuICpcbiAqIEB0eXBlIHtOYXRNYXRoSGVscGVyc31cbiAqL1xuY29uc3QgICAgICAgIG5hdE1hdGhIZWxwZXJzPWhhcmRlbih7XG5kb0NvZXJjZToobmF0KT0+e1xuLyogVE9ETzogdGlnaHRlbiB0aGUgZGVmaW5pdGlvbiBvZiBOYXQgaW4gQGFnb3JpYy9uYXQgdG8gdGhyb3cgb24gYG51bWJlcmAqL1xuYXNzZXJ0LnR5cGVvZihuYXQsJ2JpZ2ludCcpO1xuYXNzZXJ0KGlzTmF0KG5hdCksWCBgdmFsdWUgJHtuYXR9IG11c3QgYmUgYSBuYXR1cmFsIG51bWJlcmApO1xucmV0dXJuIE5hdChuYXQpO1xuIH0sXG5kb01ha2VFbXB0eTooKT0+ZW1wdHksXG5kb0lzRW1wdHk6KG5hdCk9Pm5hdD09PWVtcHR5LFxuZG9Jc0dURToobGVmdCxyaWdodCk9PmxlZnQ+PXJpZ2h0LFxuZG9Jc0VxdWFsOihsZWZ0LHJpZ2h0KT0+bGVmdD09PXJpZ2h0LFxuLyogQmlnSW50cyBkb24ndCBvYnNlcnZhYmx5IG92ZXJmbG93Ki9cbmRvQWRkOihsZWZ0LHJpZ2h0KT0+bGVmdCtyaWdodCxcbmRvU3VidHJhY3Q6KGxlZnQscmlnaHQpPT5OYXQobGVmdC1yaWdodCl9KTskaOKAjV9vbmNlLm5hdE1hdGhIZWxwZXJzKG5hdE1hdGhIZWxwZXJzKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJuYXRNYXRoSGVscGVycyI6WyJuYXRNYXRoSGVscGVycyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAALGEQ+cwcAAHMHAAA2AAAAQGFnb3JpYy9lcnRwLXYwLjE1LjUvc3JjL21hdGhIZWxwZXJzL3NldE1hdGhIZWxwZXJzLmpzeyJpbXBvcnRzIjpbIi4uL3R5cGVzLmpzIiwiQGFnb3JpYy9zdG9yZSIsIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJzZXRNYXRoSGVscGVycyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBwYXNzU3R5bGVPZixhc3NlcnRLZXksZWxlbWVudHNJc1N1cGVyc2V0LGVsZW1lbnRzRGlzam9pbnRVbmlvbixlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QsY29lcmNlVG9FbGVtZW50cyxlbGVtZW50c0NvbXBhcmU7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcImFzc2VydEtleVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0S2V5ID0gJGjigI1fYSldXSxbXCJlbGVtZW50c0lzU3VwZXJzZXRcIiwgWyRo4oCNX2EgPT4gKGVsZW1lbnRzSXNTdXBlcnNldCA9ICRo4oCNX2EpXV0sW1wiZWxlbWVudHNEaXNqb2ludFVuaW9uXCIsIFskaOKAjV9hID0+IChlbGVtZW50c0Rpc2pvaW50VW5pb24gPSAkaOKAjV9hKV1dLFtcImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdFwiLCBbJGjigI1fYSA9PiAoZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0ID0gJGjigI1fYSldXSxbXCJjb2VyY2VUb0VsZW1lbnRzXCIsIFskaOKAjV9hID0+IChjb2VyY2VUb0VsZW1lbnRzID0gJGjigI1fYSldXSxbXCJlbGVtZW50c0NvbXBhcmVcIiwgWyRo4oCNX2EgPT4gKGVsZW1lbnRzQ29tcGFyZSA9ICRo4oCNX2EpXV1dXSxbXCIuLi90eXBlcy5qc1wiLCBbXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qIE9wZXJhdGlvbnMgZm9yIGFycmF5cyB3aXRoIHVuaXF1ZSBvYmplY3RzIGlkZW50aWZ5aW5nIGFuZCBwcm92aWRpbmcqL1xuLyogaW5mb3JtYXRpb24gYWJvdXQgZGlnaXRhbCBhc3NldHMuIFVzZWQgZm9yIFpvZSBpbnZpdGVzLiovXG4vKiogQHR5cGUge1NldFZhbHVlfSAqL1xuY29uc3QgZW1wdHk9aGFyZGVuKFtdKTtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBSZXBsYWNlIGFycmF5LWJhc2VkIFNldE1hdGggd2l0aCBDb3B5U2V0LWJhc2VkIENvcHlTZXRNYXRoXG4gKiBAdHlwZSB7U2V0TWF0aEhlbHBlcnN9XG4gKi9cbmNvbnN0ICAgICAgICBzZXRNYXRoSGVscGVycz1oYXJkZW4oe1xuZG9Db2VyY2U6KGxpc3QpPT57XG5saXN0PWNvZXJjZVRvRWxlbWVudHMobGlzdCk7XG4vKiBBc3NlcnQgdGhhdCBsaXN0IGNvbnRhaW5zIG9ubHkqL1xuLyogKiBwYXNzLWJ5LWNvcHkgcHJpbWl0aXZlcywqL1xuLyogKiBwYXNzLWJ5LWNvcHkgY29udGFpbmVycyBjb250YWluaW5nIGtleXMsKi9cbi8qICogcmVtb3RhYmxlcy4qL1xuYXNzZXJ0S2V5KGxpc3QpO1xucmV0dXJuIGxpc3Q7XG4gfSxcbmRvTWFrZUVtcHR5OigpPT5lbXB0eSxcbmRvSXNFbXB0eToobGlzdCk9PnBhc3NTdHlsZU9mKGxpc3QpPT09J2NvcHlBcnJheScmJmxpc3QubGVuZ3RoPT09MCxcbmRvSXNHVEU6ZWxlbWVudHNJc1N1cGVyc2V0LFxuZG9Jc0VxdWFsOih4LHkpPT5lbGVtZW50c0NvbXBhcmUoeCx5KT09PTAsXG5kb0FkZDplbGVtZW50c0Rpc2pvaW50VW5pb24sXG5kb1N1YnRyYWN0OmVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdH0pOyRo4oCNX29uY2Uuc2V0TWF0aEhlbHBlcnMoc2V0TWF0aEhlbHBlcnMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InNldE1hdGhIZWxwZXJzIjpbInNldE1hdGhIZWxwZXJzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAIOVFgWFBAAAhQQAACMAAABAYWdvcmljL2VydHAtdjAuMTUuNS9zcmMvcGF5bWVudC5qc3siaW1wb3J0cyI6WyJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy92YXQtZGF0YSJdLCJleHBvcnRzIjpbInZpdmlmeVBheW1lbnRLaW5kIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGluaXRFbXB0eSx2aXZpZnlGYXJDbGFzczskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJpbml0RW1wdHlcIiwgWyRo4oCNX2EgPT4gKGluaXRFbXB0eSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJ2aXZpZnlGYXJDbGFzc1wiLCBbJGjigI1fYSA9PiAodml2aWZ5RmFyQ2xhc3MgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAYWdvcmljL3ZhdC1kYXRhJykuQmFnZ2FnZX0gQmFnZ2FnZSAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGlzc3VlckJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge0JyYW5kPEs+fSBicmFuZFxuICogQHBhcmFtIHtJbnRlcmZhY2VHdWFyZH0gUGF5bWVudElcbiAqIEByZXR1cm5zIHsoKSA9PiBQYXltZW50PEs+fVxuICovXG5jb25zdCAgICAgICAgdml2aWZ5UGF5bWVudEtpbmQ9KGlzc3VlckJhZ2dhZ2UsbmFtZSxicmFuZCxQYXltZW50SSk9PntcbmNvbnN0IG1ha2VQYXltZW50PXZpdmlmeUZhckNsYXNzKFxuaXNzdWVyQmFnZ2FnZSxcbiBgJHtuYW1lfSBwYXltZW50YCxcblBheW1lbnRJLFxuaW5pdEVtcHR5LFxue1xuZ2V0QWxsZWdlZEJyYW5kKCl7XG5yZXR1cm4gYnJhbmQ7XG4gfX0pO1xuXG5cbnJldHVybiBtYWtlUGF5bWVudDtcbiB9OyRo4oCNX29uY2Uudml2aWZ5UGF5bWVudEtpbmQodml2aWZ5UGF5bWVudEtpbmQpO1xuaGFyZGVuKHZpdmlmeVBheW1lbnRLaW5kKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJ2aXZpZnlQYXltZW50S2luZCI6WyJ2aXZpZnlQYXltZW50S2luZCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABaYzNn4DwAAOA8AAApAAAAQGFnb3JpYy9lcnRwLXYwLjE1LjUvc3JjL3BheW1lbnRMZWRnZXIuanN7ImltcG9ydHMiOlsiLi9hbW91bnRNYXRoLmpzIiwiLi9wYXltZW50LmpzIiwiLi9wdXJzZS5qcyIsIi4vdHlwZUd1YXJkcy5qcyIsIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL3N0b3JlL2V4cG9ydGVkLmpzIiwiQGFnb3JpYy92YXQtZGF0YSIsIkBlbmRvL21hcnNoYWwiLCJAZW5kby9wcm9taXNlLWtpdCJdLCJleHBvcnRzIjpbInZpdmlmeVBheW1lbnRMZWRnZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgaXNQcm9taXNlLGFzc2VydENvcHlBcnJheSxmaXQsTSxwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSx2aXZpZnlGYXJJbnN0YW5jZSxBbW91bnRNYXRoLHZpdmlmeVBheW1lbnRLaW5kLHZpdmlmeVB1cnNlS2luZCxCcmFuZEksbWFrZUlzc3VlckludGVyZmFjZXM7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcImlzUHJvbWlzZVwiLCBbJGjigI1fYSA9PiAoaXNQcm9taXNlID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcImFzc2VydENvcHlBcnJheVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q29weUFycmF5ID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcImZpdFwiLCBbJGjigI1fYSA9PiAoZml0ID0gJGjigI1fYSldXSxbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcInByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlXCIsIFskaOKAjV9hID0+IChwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSA9ICRo4oCNX2EpXV0sW1widml2aWZ5RmFySW5zdGFuY2VcIiwgWyRo4oCNX2EgPT4gKHZpdmlmeUZhckluc3RhbmNlID0gJGjigI1fYSldXV1dLFtcIi4vYW1vdW50TWF0aC5qc1wiLCBbW1wiQW1vdW50TWF0aFwiLCBbJGjigI1fYSA9PiAoQW1vdW50TWF0aCA9ICRo4oCNX2EpXV1dXSxbXCIuL3BheW1lbnQuanNcIiwgW1tcInZpdmlmeVBheW1lbnRLaW5kXCIsIFskaOKAjV9hID0+ICh2aXZpZnlQYXltZW50S2luZCA9ICRo4oCNX2EpXV1dXSxbXCIuL3B1cnNlLmpzXCIsIFtbXCJ2aXZpZnlQdXJzZUtpbmRcIiwgWyRo4oCNX2EgPT4gKHZpdmlmeVB1cnNlS2luZCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlL2V4cG9ydGVkLmpzXCIsIFtdXSxbXCIuL3R5cGVHdWFyZHMuanNcIiwgW1tcIkJyYW5kSVwiLCBbJGjigI1fYSA9PiAoQnJhbmRJID0gJGjigI1fYSldXSxbXCJtYWtlSXNzdWVySW50ZXJmYWNlc1wiLCBbJGjigI1fYSA9PiAobWFrZUlzc3VlckludGVyZmFjZXMgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAYWdvcmljL3ZhdC1kYXRhJykuQmFnZ2FnZX0gQmFnZ2FnZSAqL1xuXG5jb25zdHtkZXRhaWxzOlgscXVvdGU6cX09YXNzZXJ0O1xuXG5jb25zdCBhbW91bnRTaGFwZUZyb21FbGVtZW50U2hhcGU9KGJyYW5kLGFzc2V0S2luZCxlbGVtZW50U2hhcGUpPT57XG5sZXQgdmFsdWVTaGFwZTtcbnN3aXRjaChhc3NldEtpbmQpe1xuY2FzZSduYXQnOntcbnZhbHVlU2hhcGU9TS5uYXQoKTtcbmVsZW1lbnRTaGFwZT09PXVuZGVmaW5lZHx8XG5hc3NlcnQuZmFpbChcblggYEZ1bmdpYmxlIGFzc2V0cyBjYW5ub3QgaGF2ZSBhbiBlbGVtZW50U2hhcGU6ICR7cShlbGVtZW50U2hhcGUpfWApO1xuXG5icmVhaztcbiB9XG5jYXNlJ3NldCc6e1xuaWYoZWxlbWVudFNoYXBlPT09dW5kZWZpbmVkKXtcbnZhbHVlU2hhcGU9TS5hcnJheU9mKE0ua2V5KCkpO1xuIH1lbHNle1xudmFsdWVTaGFwZT1NLmFycmF5T2YoTS5hbmQoTS5rZXkoKSxlbGVtZW50U2hhcGUpKTtcbiB9XG5icmVhaztcbiB9XG5jYXNlJ2NvcHlTZXQnOntcbmlmKGVsZW1lbnRTaGFwZT09PXVuZGVmaW5lZCl7XG52YWx1ZVNoYXBlPU0uc2V0KCk7XG4gfWVsc2V7XG52YWx1ZVNoYXBlPU0uc2V0T2YoZWxlbWVudFNoYXBlKTtcbiB9XG5icmVhaztcbiB9XG5jYXNlJ2NvcHlCYWcnOntcbmlmKGVsZW1lbnRTaGFwZT09PXVuZGVmaW5lZCl7XG52YWx1ZVNoYXBlPU0uYmFnKCk7XG4gfWVsc2V7XG52YWx1ZVNoYXBlPU0uYmFnT2YoZWxlbWVudFNoYXBlKTtcbiB9XG5icmVhaztcbiB9XG5kZWZhdWx0OntcbmFzc2VydC5mYWlsKFggYHVuZXhwZWN0ZWQgYXNzZXQga2luZCAke3EoYXNzZXRLaW5kKX1gKTtcbiB9fVxuXG5cbmNvbnN0IGFtb3VudFNoYXBlPWhhcmRlbih7XG5icmFuZCwvKiBtYXRjaGVzIG9ubHkgdGhpcyBleGFjdCBicmFuZCovXG52YWx1ZTp2YWx1ZVNoYXBlfSk7XG5cbnJldHVybiBhbW91bnRTaGFwZTtcbiB9O1xuXG4vKipcbiAqIE1ha2UgdGhlIHBheW1lbnRMZWRnZXIsIHRoZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIHRoZSBiYWxhbmNlcyBvZlxuICogcGF5bWVudHMuIEFsbCBtaW50aW5nIGFuZCB0cmFuc2ZlciBhdXRob3JpdHkgb3JpZ2luYXRlcyBoZXJlLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGlzc3VlckJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge0t9IGFzc2V0S2luZFxuICogQHBhcmFtIHtEaXNwbGF5SW5mb30gZGlzcGxheUluZm9cbiAqIEBwYXJhbSB7UGF0dGVybn0gZWxlbWVudFNoYXBlXG4gKiBAcGFyYW0ge1NodXRkb3duV2l0aEZhaWx1cmU9fSBvcHRTaHV0ZG93bldpdGhGYWlsdXJlXG4gKiBAcmV0dXJucyB7UGF5bWVudExlZGdlcn1cbiAqL1xuY29uc3QgICAgICAgIHZpdmlmeVBheW1lbnRMZWRnZXI9KFxuaXNzdWVyQmFnZ2FnZSxcbm5hbWUsXG5hc3NldEtpbmQsXG5kaXNwbGF5SW5mbyxcbmVsZW1lbnRTaGFwZSxcbm9wdFNodXRkb3duV2l0aEZhaWx1cmU9dW5kZWZpbmVkKT0+XG57XG4vKiogQHR5cGUge0JyYW5kfSAqL1xuY29uc3QgYnJhbmQ9dml2aWZ5RmFySW5zdGFuY2UoaXNzdWVyQmFnZ2FnZSwgYCR7bmFtZX0gYnJhbmRgLEJyYW5kSSx7XG5pc015SXNzdWVyKGFsbGVnZWRJc3N1ZXIpe1xuLyogQnJhbmRJIGRlbGF5cyBjYWxsaW5nIHRoaXMgbWV0aG9kIHVudGlsIGBhbGxlZ2VkSXNzdWVyYCBpcyBhIFJlbW90YWJsZSovXG5yZXR1cm4gYWxsZWdlZElzc3Vlcj09PWlzc3VlcjtcbiB9LFxuZ2V0QWxsZWdlZE5hbWUoKXtcbnJldHVybiBuYW1lO1xuIH0sXG4vKiBHaXZlIGluZm9ybWF0aW9uIHRvIFVJIG9uIGhvdyB0byBkaXNwbGF5IHRoZSBhbW91bnQuKi9cbmdldERpc3BsYXlJbmZvKCl7XG5yZXR1cm4gZGlzcGxheUluZm87XG4gfSxcbmdldEFtb3VudFNoYXBlKCl7XG5yZXR1cm4gYW1vdW50U2hhcGU7XG4gfX0pO1xuXG5cbmNvbnN0IGVtcHR5QW1vdW50PUFtb3VudE1hdGgubWFrZUVtcHR5KGJyYW5kLGFzc2V0S2luZCk7XG5jb25zdCBhbW91bnRTaGFwZT1hbW91bnRTaGFwZUZyb21FbGVtZW50U2hhcGUoXG5icmFuZCxcbmFzc2V0S2luZCxcbmVsZW1lbnRTaGFwZSk7XG5cblxuY29uc3R7SXNzdWVySSxNaW50SSxQYXltZW50SSxQdXJzZUlLaXR9PW1ha2VJc3N1ZXJJbnRlcmZhY2VzKFxuYnJhbmQsXG5hc3NldEtpbmQsXG5hbW91bnRTaGFwZSk7XG5cblxuY29uc3QgbWFrZVBheW1lbnQ9dml2aWZ5UGF5bWVudEtpbmQoaXNzdWVyQmFnZ2FnZSxuYW1lLGJyYW5kLFBheW1lbnRJKTtcblxuLyoqIEB0eXBlIHtTaHV0ZG93bldpdGhGYWlsdXJlfSAqL1xuY29uc3Qgc2h1dGRvd25MZWRnZXJXaXRoRmFpbHVyZT0ocmVhc29uKT0+e1xuLyogVE9ETyBUaGlzIHNob3VsZCBhbHNvIGRlc3Ryb3kgbGVkZ2VyIHN0YXRlLiovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNDM0Ki9cbmlmKG9wdFNodXRkb3duV2l0aEZhaWx1cmUhPT11bmRlZmluZWQpe1xudHJ5e1xub3B0U2h1dGRvd25XaXRoRmFpbHVyZShyZWFzb24pO1xuIH1jYXRjaChlcnJJblNodXRkb3duKXtcbmFzc2VydC5ub3RlKGVyckluU2h1dGRvd24sWCBgQ2F1c2VkIGJ5OiAke3JlYXNvbn1gKTtcbnRocm93IGVyckluU2h1dGRvd247XG4gfVxuIH1cbnRocm93IHJlYXNvbjtcbiB9O1xuXG4vKiogQHR5cGUge1dlYWtNYXBTdG9yZTxQYXltZW50LCBBbW91bnQ+fSAqL1xuY29uc3QgcGF5bWVudExlZGdlcj1wcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZShcbmlzc3VlckJhZ2dhZ2UsXG4ncGF5bWVudExlZGdlcicpO1xuXG5cbi8qKlxuICogQSB3aXRoZHJhd24gbGl2ZSBwYXltZW50IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVjb3Zlcnkgc2V0IG9mXG4gKiB0aGUgcHVyc2UgaXQgd2FzIHdpdGhkcmF3biBmcm9tLiBMZXQncyBjYWxsIHRoZXNlIFwicmVjb3ZlcmFibGVcIlxuICogcGF5bWVudHMuIEFsbCByZWNvdmVyYWJsZSBwYXltZW50cyBhcmUgbGl2ZSwgYnV0IG5vdCBhbGwgbGl2ZVxuICogcGF5bWVudHMgYXJlIHJlY292ZXJhYmxlLiBXZSBkbyB0aGUgYm9va2tlZXBpbmcgZm9yIHBheW1lbnQgcmVjb3ZlcnlcbiAqIHdpdGggdGhpcyB3ZWFrbWFwIGZyb20gcmVjb3ZlcmFibGUgcGF5bWVudHMgdG8gdGhlIHJlY292ZXJ5IHNldCB0aGV5IGFyZVxuICogaW4uXG4gKiBBIGJ1bmNoIG9mIGludGVyZXN0aW5nIGludmFyaWFudHMgaGVyZTpcbiAqICAgICogRXZlcnkgcGF5bWVudCB0aGF0IGlzIGEga2V5IGluIHRoZSBvdXRlciBgcGF5bWVudFJlY292ZXJ5U2V0c2BcbiAqICAgICAgd2Vha01hcCBpcyBhbHNvIGluIHRoZSByZWNvdmVyeSBzZXQgaW5kZXhlZCBieSB0aGF0IHBheW1lbnQuXG4gKiAgICAqIEltcGxpZWQgYnkgdGhlIGFib3ZlIGJ1dCB3b3J0aCBzdGF0aW5nOiB0aGUgcGF5bWVudCBpcyBvbmx5XG4gKiAgICAgIGluIGF0IG1vc3Qgb25lIHJlY292ZXJ5IHNldC5cbiAqICAgICogQSByZWNvdmVyeSBzZXQgb25seSBjb250YWlucyBzdWNoIHBheW1lbnRzLlxuICogICAgKiBFdmVyeSBwdXJzZSBpcyBhc3NvY2lhdGVkIHdpdGggZXhhY3RseSBvbmUgcmVjb3Zlcnkgc2V0IHVuaXF1ZSB0b1xuICogICAgICBpdC5cbiAqICAgICogQSBwdXJzZSdzIHJlY292ZXJ5IHNldCBvbmx5IGNvbnRhaW5zIHBheW1lbnRzIHdpdGhkcmF3biBmcm9tXG4gKiAgICAgIHRoYXQgcHVyc2UgYW5kIG5vdCB5ZXQgY29uc3VtZWQuXG4gKlxuICogQHR5cGUge1dlYWtNYXBTdG9yZTxQYXltZW50LCBTZXRTdG9yZTxQYXltZW50Pj59XG4gKi9cbmNvbnN0IHBheW1lbnRSZWNvdmVyeVNldHM9cHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUoXG5pc3N1ZXJCYWdnYWdlLFxuJ3BheW1lbnRSZWNvdmVyeVNldHMnKTtcblxuXG4vKipcbiAqIFRvIG1haW50YWluIHRoZSBpbnZhcmlhbnRzIGxpc3RlZCBpbiB0aGUgYHBheW1lbnRSZWNvdmVyeVNldHNgIGNvbW1lbnQsXG4gKiBgaW5pdFBheW1lbnRgIHNob3VsZCBjb250YWluIHRoZSBvbmx5XG4gKiBjYWxsIHRvIGBwYXltZW50TGVkZ2VyLmluaXRgLlxuICpcbiAqIEBwYXJhbSB7UGF5bWVudH0gcGF5bWVudFxuICogQHBhcmFtIHtBbW91bnR9IGFtb3VudFxuICogQHBhcmFtIHtTZXRTdG9yZTxQYXltZW50Pn0gW29wdFJlY292ZXJ5U2V0XVxuICovXG5jb25zdCBpbml0UGF5bWVudD0ocGF5bWVudCxhbW91bnQsb3B0UmVjb3ZlcnlTZXQ9dW5kZWZpbmVkKT0+e1xuaWYob3B0UmVjb3ZlcnlTZXQhPT11bmRlZmluZWQpe1xub3B0UmVjb3ZlcnlTZXQuYWRkKHBheW1lbnQpO1xucGF5bWVudFJlY292ZXJ5U2V0cy5pbml0KHBheW1lbnQsb3B0UmVjb3ZlcnlTZXQpO1xuIH1cbnBheW1lbnRMZWRnZXIuaW5pdChwYXltZW50LGFtb3VudCk7XG4gfTtcblxuLyoqXG4gKiBUbyBtYWludGFpbiB0aGUgaW52YXJpYW50cyBsaXN0ZWQgaW4gdGhlIGBwYXltZW50UmVjb3ZlcnlTZXRzYCBjb21tZW50LFxuICogYGRlbGV0ZVBheW1lbnRgIHNob3VsZCBjb250YWluIHRoZSBvbmx5XG4gKiBjYWxsIHRvIGBwYXltZW50TGVkZ2VyLmRlbGV0ZWAuXG4gKlxuICogQHBhcmFtIHtQYXltZW50fSBwYXltZW50XG4gKi9cbmNvbnN0IGRlbGV0ZVBheW1lbnQ9KHBheW1lbnQpPT57XG5wYXltZW50TGVkZ2VyLmRlbGV0ZShwYXltZW50KTtcbmlmKHBheW1lbnRSZWNvdmVyeVNldHMuaGFzKHBheW1lbnQpKXtcbmNvbnN0IHJlY292ZXJ5U2V0PXBheW1lbnRSZWNvdmVyeVNldHMuZ2V0KHBheW1lbnQpO1xucGF5bWVudFJlY292ZXJ5U2V0cy5kZWxldGUocGF5bWVudCk7XG5yZWNvdmVyeVNldC5kZWxldGUocGF5bWVudCk7XG4gfVxuIH07XG5cbi8qKiBAdHlwZSB7KGxlZnQ6IEFtb3VudCwgcmlnaHQ6IEFtb3VudCkgPT4gQW1vdW50IH0gKi9cbmNvbnN0IGFkZD0obGVmdCxyaWdodCk9PkFtb3VudE1hdGguYWRkKGxlZnQscmlnaHQsYnJhbmQpO1xuLyoqIEB0eXBlIHsobGVmdDogQW1vdW50LCByaWdodDogQW1vdW50KSA9PiBBbW91bnQgfSAqL1xuY29uc3Qgc3VidHJhY3Q9KGxlZnQscmlnaHQpPT5BbW91bnRNYXRoLnN1YnRyYWN0KGxlZnQscmlnaHQsYnJhbmQpO1xuLyoqIEB0eXBlIHsoYWxsZWdlZEFtb3VudDogQW1vdW50KSA9PiBBbW91bnR9ICovXG5jb25zdCBjb2VyY2U9KGFsbGVnZWRBbW91bnQpPT5BbW91bnRNYXRoLmNvZXJjZShicmFuZCxhbGxlZ2VkQW1vdW50KTtcbi8qKiBAdHlwZSB7KGxlZnQ6IEFtb3VudCwgcmlnaHQ6IEFtb3VudCkgPT4gYm9vbGVhbiB9ICovXG5jb25zdCBpc0VxdWFsPShsZWZ0LHJpZ2h0KT0+QW1vdW50TWF0aC5pc0VxdWFsKGxlZnQscmlnaHQsYnJhbmQpO1xuXG4vKipcbiAqIE1ldGhvZHMgbGlrZSBkZXBvc2l0KCkgaGF2ZSBhbiBvcHRpb25hbCBzZWNvbmQgcGFyYW1ldGVyXG4gKiBgb3B0QW1vdW50U2hhcGVgXG4gKiB3aGljaCwgaWYgcHJlc2VudCwgaXMgc3VwcG9zZWQgdG8gbWF0Y2ggdGhlIGJhbGFuY2Ugb2YgdGhlXG4gKiBwYXltZW50LiBUaGlzIGhlbHBlciBmdW5jdGlvbiBkb2VzIHRoYXQgY2hlY2suXG4gKlxuICogTm90ZTogYG9wdEFtb3VudFNoYXBlYCBpcyB1c2VyLXN1cHBsaWVkIHdpdGggbm8gcHJldmlvdXMgdmFsaWRhdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0Ftb3VudH0gcGF5bWVudEJhbGFuY2VcbiAqIEBwYXJhbSB7UGF0dGVybj19IG9wdEFtb3VudFNoYXBlXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuY29uc3QgYXNzZXJ0QW1vdW50Q29uc2lzdGVudD0ocGF5bWVudEJhbGFuY2Usb3B0QW1vdW50U2hhcGUpPT57XG5pZihvcHRBbW91bnRTaGFwZSE9PXVuZGVmaW5lZCl7XG5maXQocGF5bWVudEJhbGFuY2Usb3B0QW1vdW50U2hhcGUsJ2Ftb3VudCcpO1xuIH1cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UGF5bWVudH0gcGF5bWVudFxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmNvbnN0IGFzc2VydExpdmVQYXltZW50PShwYXltZW50KT0+e1xucGF5bWVudExlZGdlci5oYXMocGF5bWVudCl8fFxuYXNzZXJ0LmZhaWwoXG5YIGAke3BheW1lbnR9IHdhcyBub3QgYSBsaXZlIHBheW1lbnQgZm9yIGJyYW5kICR7cShcbmJyYW5kKVxuIH0uIEl0IGNvdWxkIGJlIGEgdXNlZC11cCBwYXltZW50LCBhIHBheW1lbnQgZm9yIGFub3RoZXIgYnJhbmQsIG9yIGl0IG1pZ2h0IG5vdCBiZSBhIHBheW1lbnQgYXQgYWxsLmApO1xuXG4gfTtcblxuLyoqXG4gKiBSZWFsbG9jYXRlIGFzc2V0cyBmcm9tIHRoZSBgcGF5bWVudHNgIHBhc3NlZCBpbiB0byBuZXcgcGF5bWVudHNcbiAqIGNyZWF0ZWQgYW5kIHJldHVybmVkLCB3aXRoIGJhbGFuY2VzIGZyb20gYG5ld1BheW1lbnRCYWxhbmNlc2AuXG4gKiBFbmZvcmNlcyB0aGF0IHRvdGFsIGFzc2V0cyBhcmUgY29uc2VydmVkLlxuICpcbiAqIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCB0aGUgb25seSBvcGVyYXRpb24gdGhhdCBtb3ZlcyBhc3NldHMuXG4gKiBgcHVyc2UuZGVwb3NpdGAgYW5kIGBwdXJzZS53aXRoZHJhd2AgbW92ZSBhc3NldHMgYmV0d2VlbiBhIHB1cnNlIGFuZFxuICogYSBwYXltZW50LCBhbmQgc28gbXVzdCBhbHNvIGVuZm9yY2UgY29uc2VydmF0aW9uIHRoZXJlLlxuICpcbiAqIEBwYXJhbSB7UGF5bWVudFtdfSBwYXltZW50c1xuICogQHBhcmFtIHtBbW91bnRbXX0gbmV3UGF5bWVudEJhbGFuY2VzXG4gKiBAcmV0dXJucyB7UGF5bWVudFtdfVxuICovXG5jb25zdCBtb3ZlQXNzZXRzPShwYXltZW50cyxuZXdQYXltZW50QmFsYW5jZXMpPT57XG5hc3NlcnRDb3B5QXJyYXkocGF5bWVudHMsJ3BheW1lbnRzJyk7XG5hc3NlcnRDb3B5QXJyYXkobmV3UGF5bWVudEJhbGFuY2VzLCduZXdQYXltZW50QmFsYW5jZXMnKTtcblxuLyogVGhlcmUgbWF5IGJlIHplcm8sIG9uZSwgb3IgbWFueSBwYXltZW50cyBhcyBpbnB1dCB0byovXG4vKiBtb3ZlQXNzZXRzLiBXZSB3YW50IHRvIHByb3RlY3QgYWdhaW5zdCBzb21lb25lIHBhc3NpbmcgaW4qL1xuLyogd2hhdCBhcHBlYXJzIHRvIGJlIG11bHRpcGxlIHBheW1lbnRzIHRoYXQgdHVybiBvdXQgdG8gYWN0dWFsbHkqL1xuLyogYmUgdGhlIHNhbWUgcGF5bWVudCAoYW4gYWxpYXNpbmcgaXNzdWUpLiBUaGUgYGNvbWJpbmVgIG1ldGhvZCovXG4vKiBsZWdpdGltYXRlbHkgbmVlZHMgdG8gdGFrZSBpbiBtdWx0aXBsZSBwYXltZW50cywgYnV0IHdlIGRvbid0Ki9cbi8qIG5lZWQgdG8gcGF5IHRoZSBjb3N0cyBvZiBwcm90ZWN0aW5nIGFnYWluc3QgYWxpYXNpbmcgZm9yIHRoZSovXG4vKiBvdGhlciB1c2VzLiovXG5cbmlmKHBheW1lbnRzLmxlbmd0aD4xKXtcbmNvbnN0IGFudGlBbGlhc2luZ1N0b3JlPW5ldyBTZXQoKTtcbnBheW1lbnRzLmZvckVhY2goKHBheW1lbnQpPT57XG4hYW50aUFsaWFzaW5nU3RvcmUuaGFzKHBheW1lbnQpfHxcbmFzc2VydC5mYWlsKFggYHNhbWUgcGF5bWVudCAke3BheW1lbnR9IHNlZW4gdHdpY2VgKTtcbmFudGlBbGlhc2luZ1N0b3JlLmFkZChwYXltZW50KTtcbiB9KTtcbiB9XG5cbmNvbnN0IHRvdGFsPXBheW1lbnRzLm1hcChwYXltZW50TGVkZ2VyLmdldCkucmVkdWNlKGFkZCxlbXB0eUFtb3VudCk7XG5cbmNvbnN0IG5ld1RvdGFsPW5ld1BheW1lbnRCYWxhbmNlcy5yZWR1Y2UoYWRkLGVtcHR5QW1vdW50KTtcblxuLyogSW52YXJpYW50IGNoZWNrKi9cbmlzRXF1YWwodG90YWwsbmV3VG90YWwpfHxcbmFzc2VydC5mYWlsKFggYHJpZ2h0cyB3ZXJlIG5vdCBjb25zZXJ2ZWQ6ICR7dG90YWx9IHZzICR7bmV3VG90YWx9YCk7XG5cbmxldCBuZXdQYXltZW50cztcbnRyeXtcbi8qIENPTU1JVCBQT0lOVCovXG5wYXltZW50cy5mb3JFYWNoKChwYXltZW50KT0+ZGVsZXRlUGF5bWVudChwYXltZW50KSk7XG5cbm5ld1BheW1lbnRzPW5ld1BheW1lbnRCYWxhbmNlcy5tYXAoKGJhbGFuY2UpPT57XG5jb25zdCBuZXdQYXltZW50PW1ha2VQYXltZW50KCk7XG5pbml0UGF5bWVudChuZXdQYXltZW50LGJhbGFuY2UsdW5kZWZpbmVkKTtcbnJldHVybiBuZXdQYXltZW50O1xuIH0pO1xuIH1jYXRjaChlcnIpe1xuc2h1dGRvd25MZWRnZXJXaXRoRmFpbHVyZShlcnIpO1xudGhyb3cgZXJyO1xuIH1cbnJldHVybiBoYXJkZW4obmV3UGF5bWVudHMpO1xuIH07XG5cbi8qKlxuICogVXNlZCBieSB0aGUgcHVyc2UgY29kZSB0byBpbXBsZW1lbnQgcHVyc2UuZGVwb3NpdFxuICpcbiAqIEBwYXJhbSB7QW1vdW50fSBjdXJyZW50QmFsYW5jZSAtIHRoZSBjdXJyZW50IGJhbGFuY2Ugb2YgdGhlIHB1cnNlXG4gKiBiZWZvcmUgYSBkZXBvc2l0XG4gKiBAcGFyYW0geyhuZXdQdXJzZUJhbGFuY2U6IEFtb3VudCkgPT4gdm9pZH0gdXBkYXRlUHVyc2VCYWxhbmNlIC1cbiAqIGNvbW1pdCB0aGUgcHVyc2UgYmFsYW5jZVxuICogQHBhcmFtIHtQYXltZW50fSBzcmNQYXltZW50XG4gKiBAcGFyYW0ge1BhdHRlcm49fSBvcHRBbW91bnRTaGFwZVxuICogQHJldHVybnMge0Ftb3VudH1cbiAqL1xuY29uc3QgZGVwb3NpdEludGVybmFsPShcbmN1cnJlbnRCYWxhbmNlLFxudXBkYXRlUHVyc2VCYWxhbmNlLFxuc3JjUGF5bWVudCxcbm9wdEFtb3VudFNoYXBlPXVuZGVmaW5lZCk9Plxue1xuYXNzZXJ0KFxuIWlzUHJvbWlzZShzcmNQYXltZW50KSxcbiBgZGVwb3NpdCBkb2VzIG5vdCBhY2NlcHQgcHJvbWlzZXMgYXMgZmlyc3QgYXJndW1lbnQuIEluc3RlYWQgb2YgcGFzc2luZyB0aGUgcHJvbWlzZSAoZGVwb3NpdChwYXltZW50UHJvbWlzZSkpLCBjb25zaWRlciB1bndyYXBwaW5nIHRoZSBwcm9taXNlIGZpcnN0OiBFLndoZW4ocGF5bWVudFByb21pc2UsIChhY3R1YWxQYXltZW50ID0+IGRlcG9zaXQoYWN0dWFsUGF5bWVudCkpYCxcblR5cGVFcnJvcik7XG5cbmFzc2VydExpdmVQYXltZW50KHNyY1BheW1lbnQpO1xuY29uc3Qgc3JjUGF5bWVudEJhbGFuY2U9cGF5bWVudExlZGdlci5nZXQoc3JjUGF5bWVudCk7XG5hc3NlcnRBbW91bnRDb25zaXN0ZW50KHNyY1BheW1lbnRCYWxhbmNlLG9wdEFtb3VudFNoYXBlKTtcbmNvbnN0IG5ld1B1cnNlQmFsYW5jZT1hZGQoc3JjUGF5bWVudEJhbGFuY2UsY3VycmVudEJhbGFuY2UpO1xudHJ5e1xuLyogQ09NTUlUIFBPSU5UKi9cbi8qIE1vdmUgdGhlIGFzc2V0cyBpbiBgc3JjUGF5bWVudGAgaW50byB0aGlzIHB1cnNlLCB1c2luZyB1cCB0aGUqL1xuLyogc291cmNlIHBheW1lbnQsIHN1Y2ggdGhhdCB0b3RhbCBhc3NldHMgYXJlIGNvbnNlcnZlZC4qL1xuZGVsZXRlUGF5bWVudChzcmNQYXltZW50KTtcbnVwZGF0ZVB1cnNlQmFsYW5jZShuZXdQdXJzZUJhbGFuY2UpO1xuIH1jYXRjaChlcnIpe1xuc2h1dGRvd25MZWRnZXJXaXRoRmFpbHVyZShlcnIpO1xudGhyb3cgZXJyO1xuIH1cbnJldHVybiBzcmNQYXltZW50QmFsYW5jZTtcbiB9O1xuXG4vKipcbiAqIFVzZWQgYnkgdGhlIHB1cnNlIGNvZGUgdG8gaW1wbGVtZW50IHB1cnNlLndpdGhkcmF3XG4gKlxuICogQHBhcmFtIHtBbW91bnR9IGN1cnJlbnRCYWxhbmNlIC0gdGhlIGN1cnJlbnQgYmFsYW5jZSBvZiB0aGUgcHVyc2VcbiAqIGJlZm9yZSBhIHdpdGhkcmF3YWxcbiAqIEBwYXJhbSB7KG5ld1B1cnNlQmFsYW5jZTogQW1vdW50KSA9PiB2b2lkfSB1cGRhdGVQdXJzZUJhbGFuY2UgLVxuICogY29tbWl0IHRoZSBwdXJzZSBiYWxhbmNlXG4gKiBAcGFyYW0ge0Ftb3VudH0gYW1vdW50IC0gdGhlIGFtb3VudCB0byBiZSB3aXRoZHJhd25cbiAqIEBwYXJhbSB7U2V0U3RvcmU8UGF5bWVudD59IHJlY292ZXJ5U2V0XG4gKiBAcmV0dXJucyB7UGF5bWVudH1cbiAqL1xuY29uc3Qgd2l0aGRyYXdJbnRlcm5hbD0oXG5jdXJyZW50QmFsYW5jZSxcbnVwZGF0ZVB1cnNlQmFsYW5jZSxcbmFtb3VudCxcbnJlY292ZXJ5U2V0KT0+XG57XG5hbW91bnQ9Y29lcmNlKGFtb3VudCk7XG5BbW91bnRNYXRoLmlzR1RFKGN1cnJlbnRCYWxhbmNlLGFtb3VudCl8fFxuYXNzZXJ0LmZhaWwoXG5YIGBXaXRoZHJhd2FsIG9mICR7YW1vdW50fSBmYWlsZWQgYmVjYXVzZSB0aGUgcHVyc2Ugb25seSBjb250YWluZWQgJHtjdXJyZW50QmFsYW5jZX1gKTtcblxuY29uc3QgbmV3UHVyc2VCYWxhbmNlPXN1YnRyYWN0KGN1cnJlbnRCYWxhbmNlLGFtb3VudCk7XG5cbmNvbnN0IHBheW1lbnQ9bWFrZVBheW1lbnQoKTtcbnRyeXtcbi8qIENPTU1JVCBQT0lOVCBNb3ZlIHRoZSB3aXRoZHJhd24gYXNzZXRzIGZyb20gdGhpcyBwdXJzZSBpbnRvKi9cbi8qIHBheW1lbnQuIFRvdGFsIGFzc2V0cyBtdXN0IHJlbWFpbiBjb25zZXJ2ZWQuKi9cbnVwZGF0ZVB1cnNlQmFsYW5jZShuZXdQdXJzZUJhbGFuY2UpO1xuaW5pdFBheW1lbnQocGF5bWVudCxhbW91bnQscmVjb3ZlcnlTZXQpO1xuIH1jYXRjaChlcnIpe1xuc2h1dGRvd25MZWRnZXJXaXRoRmFpbHVyZShlcnIpO1xudGhyb3cgZXJyO1xuIH1cbnJldHVybiBwYXltZW50O1xuIH07XG5cbmNvbnN0IG1ha2VFbXB0eVB1cnNlPXZpdmlmeVB1cnNlS2luZChcbmlzc3VlckJhZ2dhZ2UsXG5uYW1lLFxuYXNzZXRLaW5kLFxuYnJhbmQsXG5QdXJzZUlLaXQsXG5oYXJkZW4oe1xuZGVwb3NpdEludGVybmFsLFxud2l0aGRyYXdJbnRlcm5hbH0pKTtcblxuXG5cbi8qKiBAdHlwZSB7SXNzdWVyfSAqL1xuY29uc3QgaXNzdWVyPXZpdmlmeUZhckluc3RhbmNlKGlzc3VlckJhZ2dhZ2UsIGAke25hbWV9IGlzc3VlcmAsSXNzdWVySSx7XG5nZXRCcmFuZCgpe1xucmV0dXJuIGJyYW5kO1xuIH0sXG5nZXRBbGxlZ2VkTmFtZSgpe1xucmV0dXJuIG5hbWU7XG4gfSxcbmdldEFzc2V0S2luZCgpe1xucmV0dXJuIGFzc2V0S2luZDtcbiB9LFxuZ2V0RGlzcGxheUluZm8oKXtcbnJldHVybiBkaXNwbGF5SW5mbztcbiB9LFxubWFrZUVtcHR5UHVyc2UoKXtcbnJldHVybiBtYWtlRW1wdHlQdXJzZSgpO1xuIH0sXG5pc0xpdmUocGF5bWVudCl7XG4vKiBJc3N1ZXJJIGRlbGF5cyBjYWxsaW5nIHRoaXMgbWV0aG9kIHVudGlsIGBwYXltZW50YCBpcyBhIFJlbW90YWJsZSovXG5yZXR1cm4gcGF5bWVudExlZGdlci5oYXMocGF5bWVudCk7XG4gfSxcbmdldEFtb3VudE9mKHBheW1lbnQpe1xuLyogSXNzdWVySSBkZWxheXMgY2FsbGluZyB0aGlzIG1ldGhvZCB1bnRpbCBgcGF5bWVudGAgaXMgYSBSZW1vdGFibGUqL1xuYXNzZXJ0TGl2ZVBheW1lbnQocGF5bWVudCk7XG5yZXR1cm4gcGF5bWVudExlZGdlci5nZXQocGF5bWVudCk7XG4gfSxcblxuYnVybihwYXltZW50LG9wdEFtb3VudFNoYXBlPXVuZGVmaW5lZCl7XG4vKiBJc3N1ZXJJIGRlbGF5cyBjYWxsaW5nIHRoaXMgbWV0aG9kIHVudGlsIGBwYXltZW50YCBpcyBhIFJlbW90YWJsZSovXG5hc3NlcnRMaXZlUGF5bWVudChwYXltZW50KTtcbmNvbnN0IHBheW1lbnRCYWxhbmNlPXBheW1lbnRMZWRnZXIuZ2V0KHBheW1lbnQpO1xuYXNzZXJ0QW1vdW50Q29uc2lzdGVudChwYXltZW50QmFsYW5jZSxvcHRBbW91bnRTaGFwZSk7XG50cnl7XG4vKiBDT01NSVQgUE9JTlQuKi9cbmRlbGV0ZVBheW1lbnQocGF5bWVudCk7XG4gfWNhdGNoKGVycil7XG5zaHV0ZG93bkxlZGdlcldpdGhGYWlsdXJlKGVycik7XG50aHJvdyBlcnI7XG4gfVxucmV0dXJuIHBheW1lbnRCYWxhbmNlO1xuIH0sXG5jbGFpbShzcmNQYXltZW50LG9wdEFtb3VudFNoYXBlPXVuZGVmaW5lZCl7XG4vKiBJc3N1ZXJJIGRlbGF5cyBjYWxsaW5nIHRoaXMgbWV0aG9kIHVudGlsIGBzcmNQYXltZW50YCBpcyBhIFJlbW90YWJsZSovXG5hc3NlcnRMaXZlUGF5bWVudChzcmNQYXltZW50KTtcbmNvbnN0IHNyY1BheW1lbnRCYWxhbmNlPXBheW1lbnRMZWRnZXIuZ2V0KHNyY1BheW1lbnQpO1xuYXNzZXJ0QW1vdW50Q29uc2lzdGVudChzcmNQYXltZW50QmFsYW5jZSxvcHRBbW91bnRTaGFwZSk7XG4vKiBOb3RlIENPTU1JVCBQT0lOVCB3aXRoaW4gbW92ZUFzc2V0cy4qL1xuY29uc3RbcGF5bWVudF09bW92ZUFzc2V0cyhcbmhhcmRlbihbc3JjUGF5bWVudF0pLFxuaGFyZGVuKFtzcmNQYXltZW50QmFsYW5jZV0pKTtcblxucmV0dXJuIHBheW1lbnQ7XG4gfSxcbmNvbWJpbmUoZnJvbVBheW1lbnRzUEFycmF5LG9wdFRvdGFsQW1vdW50PXVuZGVmaW5lZCl7XG4vKiBJc3N1ZXJJIGRvZXMgKm5vdCogZGVsYXkgY2FsbGluZyBgY29tYmluZWAsIGJ1dCByYXRoZXIgbGVhdmVzIGl0Ki9cbi8qIHRvIGBjb21iaW5lYCB0byBkZWxheSBmdXJ0aGVyIHByb2Nlc3NpbmcgdW50aWwgYWxsIHRoZSBlbGVtZW50cyBvZiovXG4vKiBgZnJvbVBheW1lbnRzUEFycmF5YCBoYXZlIGZ1bGZpbGxlZC4qL1xuXG4vKiBQYXltZW50cyBpbiBgZnJvbVBheW1lbnRzUEFycmF5YCBtdXN0IGJlIGRpc3RpbmN0LiBBbGlhcyovXG4vKiBjaGVja2luZyBpcyBkZWxlZ2F0ZWQgdG8gdGhlIGBtb3ZlQXNzZXRzYCBmdW5jdGlvbi4qL1xucmV0dXJuIFByb21pc2UuYWxsKGZyb21QYXltZW50c1BBcnJheSkudGhlbigoZnJvbVBheW1lbnRzQXJyYXkpPT57XG5mcm9tUGF5bWVudHNBcnJheS5ldmVyeShhc3NlcnRMaXZlUGF5bWVudCk7XG5jb25zdCB0b3RhbFBheW1lbnRzQmFsYW5jZT1mcm9tUGF5bWVudHNBcnJheS5cbm1hcChwYXltZW50TGVkZ2VyLmdldCkuXG5yZWR1Y2UoYWRkLGVtcHR5QW1vdW50KTtcbmFzc2VydEFtb3VudENvbnNpc3RlbnQodG90YWxQYXltZW50c0JhbGFuY2Usb3B0VG90YWxBbW91bnQpO1xuLyogTm90ZSBDT01NSVQgUE9JTlQgd2l0aGluIG1vdmVBc3NldHMuKi9cbmNvbnN0W3BheW1lbnRdPW1vdmVBc3NldHMoXG5oYXJkZW4oZnJvbVBheW1lbnRzQXJyYXkpLFxuaGFyZGVuKFt0b3RhbFBheW1lbnRzQmFsYW5jZV0pKTtcblxucmV0dXJuIHBheW1lbnQ7XG4gfSk7XG4gfSxcbnNwbGl0KHNyY1BheW1lbnQscGF5bWVudEFtb3VudEEpe1xuLyogSXNzdWVySSBkZWxheXMgY2FsbGluZyB0aGlzIG1ldGhvZCB1bnRpbCBgc3JjUGF5bWVudGAgaXMgYSBSZW1vdGFibGUqL1xucGF5bWVudEFtb3VudEE9Y29lcmNlKHBheW1lbnRBbW91bnRBKTtcbmFzc2VydExpdmVQYXltZW50KHNyY1BheW1lbnQpO1xuY29uc3Qgc3JjUGF5bWVudEJhbGFuY2U9cGF5bWVudExlZGdlci5nZXQoc3JjUGF5bWVudCk7XG5jb25zdCBwYXltZW50QW1vdW50Qj1zdWJ0cmFjdChzcmNQYXltZW50QmFsYW5jZSxwYXltZW50QW1vdW50QSk7XG4vKiBOb3RlIENPTU1JVCBQT0lOVCB3aXRoaW4gbW92ZUFzc2V0cy4qL1xuY29uc3QgbmV3UGF5bWVudHM9bW92ZUFzc2V0cyhcbmhhcmRlbihbc3JjUGF5bWVudF0pLFxuaGFyZGVuKFtwYXltZW50QW1vdW50QSxwYXltZW50QW1vdW50Ql0pKTtcblxucmV0dXJuIG5ld1BheW1lbnRzO1xuIH0sXG5zcGxpdE1hbnkoc3JjUGF5bWVudCxhbW91bnRzKXtcbi8qIElzc3VlckkgZGVsYXlzIGNhbGxpbmcgdGhpcyBtZXRob2QgdW50aWwgYHNyY1BheW1lbnRgIGlzIGEgUmVtb3RhYmxlKi9cbmFzc2VydExpdmVQYXltZW50KHNyY1BheW1lbnQpO1xuYXNzZXJ0Q29weUFycmF5KGFtb3VudHMsJ2Ftb3VudHMnKTtcbmFtb3VudHM9YW1vdW50cy5tYXAoY29lcmNlKTtcbi8qIE5vdGUgQ09NTUlUIFBPSU5UIHdpdGhpbiBtb3ZlQXNzZXRzLiovXG5jb25zdCBuZXdQYXltZW50cz1tb3ZlQXNzZXRzKGhhcmRlbihbc3JjUGF5bWVudF0pLGhhcmRlbihhbW91bnRzKSk7XG5yZXR1cm4gbmV3UGF5bWVudHM7XG4gfX0pO1xuXG5cbi8qKiBAdHlwZSB7TWludH0gKi9cbmNvbnN0IG1pbnQ9dml2aWZ5RmFySW5zdGFuY2UoaXNzdWVyQmFnZ2FnZSwgYCR7bmFtZX0gbWludGAsTWludEkse1xuZ2V0SXNzdWVyKCl7XG5yZXR1cm4gaXNzdWVyO1xuIH0sXG5taW50UGF5bWVudChuZXdBbW91bnQpe1xubmV3QW1vdW50PWNvZXJjZShuZXdBbW91bnQpO1xuZml0KG5ld0Ftb3VudCxhbW91bnRTaGFwZSwnbWludGVkIGFtb3VudCcpO1xuY29uc3QgcGF5bWVudD1tYWtlUGF5bWVudCgpO1xuaW5pdFBheW1lbnQocGF5bWVudCxuZXdBbW91bnQsdW5kZWZpbmVkKTtcbnJldHVybiBwYXltZW50O1xuIH19KTtcblxuXG5jb25zdCBpc3N1ZXJLaXQ9aGFyZGVuKHtpc3N1ZXIsbWludCxicmFuZH0pO1xucmV0dXJuIGlzc3VlcktpdDtcbiB9OyRo4oCNX29uY2Uudml2aWZ5UGF5bWVudExlZGdlcih2aXZpZnlQYXltZW50TGVkZ2VyKTtcbmhhcmRlbih2aXZpZnlQYXltZW50TGVkZ2VyKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJ2aXZpZnlQYXltZW50TGVkZ2VyIjpbInZpdmlmeVBheW1lbnRMZWRnZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAuURUuO4OAADuDgAAIQAAAEBhZ29yaWMvZXJ0cC12MC4xNS41L3NyYy9wdXJzZS5qc3siaW1wb3J0cyI6WyIuL2Ftb3VudE1hdGguanMiLCIuL3RyYW5zaWVudE5vdGlmaWVyLmpzIiwiQGFnb3JpYy92YXQtZGF0YSJdLCJleHBvcnRzIjpbInZpdmlmeVB1cnNlS2luZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCB2aXZpZnlGYXJDbGFzc0tpdCxtYWtlU2NhbGFyQmlnU2V0U3RvcmUsQW1vdW50TWF0aCxtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQ7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1widml2aWZ5RmFyQ2xhc3NLaXRcIiwgWyRo4oCNX2EgPT4gKHZpdmlmeUZhckNsYXNzS2l0ID0gJGjigI1fYSldXSxbXCJtYWtlU2NhbGFyQmlnU2V0U3RvcmVcIiwgWyRo4oCNX2EgPT4gKG1ha2VTY2FsYXJCaWdTZXRTdG9yZSA9ICRo4oCNX2EpXV1dXSxbXCIuL2Ftb3VudE1hdGguanNcIiwgW1tcIkFtb3VudE1hdGhcIiwgWyRo4oCNX2EgPT4gKEFtb3VudE1hdGggPSAkaOKAjV9hKV1dXV0sW1wiLi90cmFuc2llbnROb3RpZmllci5qc1wiLCBbW1wibWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0XCIsIFskaOKAjV9hID0+IChtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cbmNvbnN0e2RldGFpbHM6WH09YXNzZXJ0O1xuXG5jb25zdCAgICAgICAgdml2aWZ5UHVyc2VLaW5kPShcbmlzc3VlckJhZ2dhZ2UsXG5uYW1lLFxuYXNzZXRLaW5kLFxuYnJhbmQsXG5QdXJzZUlLaXQsXG5wdXJzZU1ldGhvZHMpPT5cbntcbi8qIE5vdGU6IFZpcnR1YWwgZm9yIGhpZ2ggY2FyZGluYWxpdHksIGJ1dCAqbm90KiBkdXJhYmxlLCBhbmQgc28qL1xuLyogYnJva2VuIGFjcm9zcyBhbiB1cGdyYWRlLiovXG5jb25zdHtwcm92aWRlTm90aWZpZXIsdXBkYXRlOnVwZGF0ZUJhbGFuY2V9PW1ha2VUcmFuc2llbnROb3RpZmllcktpdCgpO1xuXG5jb25zdCB1cGRhdGVQdXJzZUJhbGFuY2U9KHN0YXRlLG5ld1B1cnNlQmFsYW5jZSxwdXJzZSk9PntcbnN0YXRlLmN1cnJlbnRCYWxhbmNlPW5ld1B1cnNlQmFsYW5jZTtcbnVwZGF0ZUJhbGFuY2UocHVyc2UscHVyc2UuZ2V0Q3VycmVudEFtb3VudCgpKTtcbiB9O1xuXG4vKiAtIFRoaXMga2luZCBpcyBhIHBhaXIgb2YgcHVyc2UgYW5kIGRlcG9zaXRGYWNldCB0aGF0IGhhdmUgYSAxOjEqL1xuLyogY29ycmVzcG9uZGVuY2UuKi9cbi8qIC0gVGhleSBhcmUgdmlydHVhbGl6ZWQgdG9nZXRoZXIgdG8gc2hhcmUgYSBzaW5nbGUgc3RhdGUgcmVjb3JkLiovXG4vKiAtIEFuIGFsdGVybmF0aXZlIGRlc2lnbiBjb25zaWRlcmVkIHdhcyB0byBoYXZlIHRoaXMgcmV0dXJuIGEgUHVyc2UgYWxvbmUqL1xuLyogdGhhdCBjcmVhdGVkIGRlcG9zaXRGYWNldCBhcyBuZWVkZWQuIEJ1dCB0aGlzIGFwcHJvYWNoIGVuc3VyZXMgYSBjb25zdGFudCovXG4vKiBpZGVudGl0eSBmb3IgdGhlIGZhY2V0IGFuZCBleGVyY2lzZXMgdGhlIG11bHRpLWZhY2V0ZWQgb2JqZWN0IHN0eWxlLiovXG5jb25zdHtkZXBvc2l0SW50ZXJuYWwsd2l0aGRyYXdJbnRlcm5hbH09cHVyc2VNZXRob2RzO1xuY29uc3QgbWFrZVB1cnNlS2l0PXZpdmlmeUZhckNsYXNzS2l0KFxuaXNzdWVyQmFnZ2FnZSxcbiBgJHtuYW1lfSBQdXJzZWAsXG5QdXJzZUlLaXQsXG4oKT0+e1xuY29uc3QgY3VycmVudEJhbGFuY2U9QW1vdW50TWF0aC5tYWtlRW1wdHkoYnJhbmQsYXNzZXRLaW5kKTtcblxuLyoqIEB0eXBlIHtTZXRTdG9yZTxQYXltZW50Pn0gKi9cbmNvbnN0IHJlY292ZXJ5U2V0PW1ha2VTY2FsYXJCaWdTZXRTdG9yZSgncmVjb3Zlcnkgc2V0Jyx7XG5kdXJhYmxlOnRydWV9KTtcblxuXG5yZXR1cm57XG5jdXJyZW50QmFsYW5jZSxcbnJlY292ZXJ5U2V0fTtcblxuIH0sXG57XG5wdXJzZTp7XG5kZXBvc2l0KHNyY1BheW1lbnQsb3B0QW1vdW50U2hhcGU9dW5kZWZpbmVkKXtcbi8qIFB1cnNlSSBkb2VzICpub3QqIGRlbGF5IGBkZXBvc2l0YCB1bnRpbCBgc3JjUGF5bWVudGAgaXMgZnVsZnVsbGVkLiovXG4vKiBTZWUgdGhlIGNvbW1lbnRzIG9uIFB1cnNlSS5kZXBvc2l0IGluIHR5cGVHdWFyZHMuanMqL1xuY29uc3R7c3RhdGV9PXRoaXM7XG4vKiBOb3RlIENPTU1JVCBQT0lOVCB3aXRoaW4gZGVwb3NpdC4qL1xucmV0dXJuIGRlcG9zaXRJbnRlcm5hbChcbnN0YXRlLmN1cnJlbnRCYWxhbmNlLFxuKG5ld1B1cnNlQmFsYW5jZSk9PlxudXBkYXRlUHVyc2VCYWxhbmNlKHN0YXRlLG5ld1B1cnNlQmFsYW5jZSx0aGlzLmZhY2V0cy5wdXJzZSksXG5zcmNQYXltZW50LFxub3B0QW1vdW50U2hhcGUsXG5zdGF0ZS5yZWNvdmVyeVNldCk7XG5cbiB9LFxud2l0aGRyYXcoYW1vdW50KXtcbmNvbnN0e3N0YXRlfT10aGlzO1xuLyogTm90ZSBDT01NSVQgUE9JTlQgd2l0aGluIHdpdGhkcmF3LiovXG5yZXR1cm4gd2l0aGRyYXdJbnRlcm5hbChcbnN0YXRlLmN1cnJlbnRCYWxhbmNlLFxuKG5ld1B1cnNlQmFsYW5jZSk9PlxudXBkYXRlUHVyc2VCYWxhbmNlKHN0YXRlLG5ld1B1cnNlQmFsYW5jZSx0aGlzLmZhY2V0cy5wdXJzZSksXG5hbW91bnQsXG5zdGF0ZS5yZWNvdmVyeVNldCk7XG5cbiB9LFxuZ2V0Q3VycmVudEFtb3VudCgpe1xucmV0dXJuIHRoaXMuc3RhdGUuY3VycmVudEJhbGFuY2U7XG4gfSxcbmdldEN1cnJlbnRBbW91bnROb3RpZmllcigpe1xucmV0dXJuIHByb3ZpZGVOb3RpZmllcih0aGlzLmZhY2V0cy5wdXJzZSk7XG4gfSxcbmdldEFsbGVnZWRCcmFuZCgpe1xucmV0dXJuIGJyYW5kO1xuIH0sXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuZ2V0RGVwb3NpdEZhY2V0KCl7XG5yZXR1cm4gdGhpcy5mYWNldHMuZGVwb3NpdEZhY2V0O1xuIH0sXG5cbmdldFJlY292ZXJ5U2V0KCl7XG5yZXR1cm4gdGhpcy5zdGF0ZS5yZWNvdmVyeVNldC5zbmFwc2hvdCgpO1xuIH0sXG5yZWNvdmVyQWxsKCl7XG5jb25zdHtzdGF0ZSxmYWNldHN9PXRoaXM7XG5sZXQgYW1vdW50PUFtb3VudE1hdGgubWFrZUVtcHR5KGJyYW5kLGFzc2V0S2luZCk7XG5mb3IoY29uc3QgcGF5bWVudCBvZiBzdGF0ZS5yZWNvdmVyeVNldC5rZXlzKCkpe1xuLyogVGhpcyBkb2VzIGNhdXNlIGRlbGV0aW9ucyBmcm9tIHRoZSBzZXQgd2hpbGUgaXRlcmF0aW5nLCovXG4vKiBidXQgdGhpcyBzcGVjaWFsIGNhc2UgaXMgYWxsb3dlZC4qL1xuY29uc3QgZGVsdGE9ZmFjZXRzLnB1cnNlLmRlcG9zaXQocGF5bWVudCk7XG5hbW91bnQ9QW1vdW50TWF0aC5hZGQoYW1vdW50LGRlbHRhLGJyYW5kKTtcbiB9XG5zdGF0ZS5yZWNvdmVyeVNldC5nZXRTaXplKCk9PT0wfHxcbmFzc2VydC5mYWlsKFxuWCBgaW50ZXJuYWw6IFJlbWFpbmluZyB1bnJlY292ZXJlZCBwYXltZW50czogJHtmYWNldHMucHVyc2UuZ2V0UmVjb3ZlcnlTZXQoKX1gKTtcblxucmV0dXJuIGFtb3VudDtcbiB9fSxcblxuZGVwb3NpdEZhY2V0OntcbnJlY2VpdmUoLi4uYXJncyl7XG5yZXR1cm4gdGhpcy5mYWNldHMucHVyc2UuZGVwb3NpdCguLi5hcmdzKTtcbiB9fX0pO1xuXG5cblxucmV0dXJuKCk9Pm1ha2VQdXJzZUtpdCgpLnB1cnNlO1xuIH07JGjigI1fb25jZS52aXZpZnlQdXJzZUtpbmQodml2aWZ5UHVyc2VLaW5kKTtcbmhhcmRlbih2aXZpZnlQdXJzZUtpbmQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InZpdmlmeVB1cnNlS2luZCI6WyJ2aXZpZnlQdXJzZUtpbmQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAiMuDvP8FAAD/BQAALQAAAEBhZ29yaWMvZXJ0cC12MC4xNS41L3NyYy90cmFuc2llbnROb3RpZmllci5qc3siaW1wb3J0cyI6WyJAYWdvcmljL25vdGlmaWVyIiwiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvdmF0LWRhdGEiXSwiZXhwb3J0cyI6WyJtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgbWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSxwcm92aWRlTGF6eSxtYWtlTm90aWZpZXJLaXQ7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1wibWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZVwiLCBbJGjigI1fYSA9PiAobWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJwcm92aWRlTGF6eVwiLCBbJGjigI1fYSA9PiAocHJvdmlkZUxhenkgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9ub3RpZmllclwiLCBbW1wibWFrZU5vdGlmaWVyS2l0XCIsIFskaOKAjV9hID0+IChtYWtlTm90aWZpZXJLaXQgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG4vKiBOb3RlOiBWaXJ0dWFsIGZvciBoaWdoIGNhcmRpbmFsaXR5LCBidXQgKm5vdCogZHVyYWJsZSwgYW5kIHNvKi9cbi8qIGJyb2tlbiBhY3Jvc3MgYW4gdXBncmFkZS4qL1xuY29uc3QgICAgICAgIG1ha2VUcmFuc2llbnROb3RpZmllcktpdD0oKT0+e1xuLyoqIEB0eXBlIHtXZWFrTWFwU3RvcmU8UHVyc2UsIE5vdGlmaWVyUmVjb3JkPGFueT4+fSAqL1xuY29uc3QgdHJhbnNpZW50Tm90aWZlcktpdHM9bWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZShcbid0cmFuc2llbnROb3RpZmVyS2l0cycpO1xuXG5cbmNvbnN0IHByb3ZpZGVOb3RpZmllcktpdD0oa2V5KT0+XG5wcm92aWRlTGF6eSh0cmFuc2llbnROb3RpZmVyS2l0cyxrZXksKCk9PlxubWFrZU5vdGlmaWVyS2l0KGtleS5nZXRDdXJyZW50QW1vdW50KCkpKTtcblxuXG5jb25zdCBwcm92aWRlTm90aWZpZXI9KGtleSk9PnByb3ZpZGVOb3RpZmllcktpdChrZXkpLm5vdGlmaWVyO1xuY29uc3QgdXBkYXRlPShrZXksbmV3VmFsdWUpPT57XG5pZih0cmFuc2llbnROb3RpZmVyS2l0cy5oYXMoa2V5KSl7XG5jb25zdHt1cGRhdGVyfT10cmFuc2llbnROb3RpZmVyS2l0cy5nZXQoa2V5KTtcbnVwZGF0ZXIudXBkYXRlU3RhdGUobmV3VmFsdWUpO1xuIH1cbiB9O1xuXG5yZXR1cm57cHJvdmlkZU5vdGlmaWVyLHVwZGF0ZX07XG4gfTskaOKAjV9vbmNlLm1ha2VUcmFuc2llbnROb3RpZmllcktpdChtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQpO1xuaGFyZGVuKG1ha2VUcmFuc2llbnROb3RpZmllcktpdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0IjpbIm1ha2VUcmFuc2llbnROb3RpZmllcktpdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAbc+q/dyYAAHcmAAAmAAAAQGFnb3JpYy9lcnRwLXYwLjE1LjUvc3JjL3R5cGVHdWFyZHMuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9zdG9yZSJdLCJleHBvcnRzIjpbIkFtb3VudFNoYXBlIiwiQXNzZXRLaW5kU2hhcGUiLCJCcmFuZEkiLCJCcmFuZFNoYXBlIiwiRGVwb3NpdEZhY2V0U2hhcGUiLCJEaXNwbGF5SW5mb1NoYXBlIiwiSXNzdWVyU2hhcGUiLCJNQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVMiLCJNaW50U2hhcGUiLCJQYXltZW50U2hhcGUiLCJQdXJzZVNoYXBlIiwiaXNDb3B5QmFnVmFsdWUiLCJpc0NvcHlTZXRWYWx1ZSIsImlzTmF0VmFsdWUiLCJpc1NldFZhbHVlIiwibWFrZUlzc3VlckludGVyZmFjZXMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgTSxtYXRjaGVzOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIk1cIiwgWyRo4oCNX2EgPT4gKE0gPSAkaOKAjV9hKV1dLFtcIm1hdGNoZXNcIiwgWyRo4oCNX2EgPT4gKG1hdGNoZXMgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuY29uc3QgICAgICAgIEJyYW5kU2hhcGU9TS5yZW1vdGFibGUoJ0JyYW5kJyk7JGjigI1fb25jZS5CcmFuZFNoYXBlKEJyYW5kU2hhcGUpO1xuY29uc3QgICAgICAgIElzc3VlclNoYXBlPU0ucmVtb3RhYmxlKCdJc3N1ZXInKTskaOKAjV9vbmNlLklzc3VlclNoYXBlKElzc3VlclNoYXBlKTtcbmNvbnN0ICAgICAgICBQYXltZW50U2hhcGU9TS5yZW1vdGFibGUoJ1BheW1lbnQnKTskaOKAjV9vbmNlLlBheW1lbnRTaGFwZShQYXltZW50U2hhcGUpO1xuY29uc3QgICAgICAgIFB1cnNlU2hhcGU9TS5yZW1vdGFibGUoJ1B1cnNlJyk7JGjigI1fb25jZS5QdXJzZVNoYXBlKFB1cnNlU2hhcGUpO1xuY29uc3QgICAgICAgIERlcG9zaXRGYWNldFNoYXBlPU0ucmVtb3RhYmxlKCdEZXBvc2l0RmFjZXQnKTskaOKAjV9vbmNlLkRlcG9zaXRGYWNldFNoYXBlKERlcG9zaXRGYWNldFNoYXBlKTtcbmNvbnN0IE5vdGlmaWVyU2hhcGU9TS5yZW1vdGFibGUoJ05vdGlmaWVyJyk7XG5jb25zdCAgICAgICAgTWludFNoYXBlPU0ucmVtb3RhYmxlKCdNaW50Jyk7XG5cbi8qKlxuICogV2hlbiB0aGUgQW1vdW50VmFsdWUgb2YgYW4gQW1vdW50IGZpdHMgdGhlIE5hdFZhbHVlU2hhcGUsIGkuZS4sIHdoZW4gaXQgaXNcbiAqIGEgbm9uLW5lZ2F0aXZlIGJpZ2ludCwgdGhlbiBpdCByZXByZXNlbnRzIHRoYXQgbWFueSB1bml0cyBvZiB0aGVcbiAqIGZ1bmdpYmxlIGFzc2V0IHJlcHJlc2VudGVkIGJ5IHRoYXQgYW1vdW50LiBUaGUgYnJhbmQgb2YgdGhhdCBhbW91bnRcbiAqIHNob3VsZCBpbmRlZWQgcmVwcmVzZW50IGEga2luZCBvZiBhc3NldCBjb25zaXN0aW5nIG9mIGEgY291bnRhYmxlXG4gKiBzZXQgb2YgZnVuZ2libGUgdW5pdHMuXG4gKi8kaOKAjV9vbmNlLk1pbnRTaGFwZShNaW50U2hhcGUpO1xuY29uc3QgTmF0VmFsdWVTaGFwZT1NLm5hdCgpO1xuXG4vKipcbiAqIFdoZW4gdGhlIEFtb3VudFZhbHVlIG9mIGFuIEFtb3VudCBmaXRzIHRoZSBDb3B5U2V0VmFsdWVTaGFwZSwgaS5lLiwgd2hlbiBpdFxuICogaXMgYSBDb3B5U2V0LCB0aGVuIGl0IHJlcHJlc2VudHMgdGhlIHNldCBvZiB0aG9zZVxuICoga2V5cywgd2hlcmUgZWFjaCBrZXkgcmVwcmVzZW50cyBzb21lIGluZGl2aWR1YWwgbm9uLWZ1bmdpYmxlXG4gKiBpdGVtLCBsaWtlIGEgY29uY2VydCB0aWNrZXQsIGZyb20gdGhlIG5vbi1mdW5naWJsZSBhc3NldCBjbGFzc1xuICogcmVwcmVzZW50ZWQgYnkgdGhhdCBhbW91bnQncyBicmFuZC4gVGhlIGFtb3VudCBpdHNlbGYgcmVwcmVzZW50c1xuICogdGhlIHNldCBvZiB0aGVzZSBpdGVtcywgYXMgb3Bwb3NlZCB0byBhbnkgb2YgdGhlIG90aGVyIGl0ZW1zXG4gKiBmcm9tIHRoZSBzYW1lIGFzc2V0IGNsYXNzLlxuICpcbiAqIElmIGEgZ2l2ZW4gdmFsdWUgY2xhc3MgcmVwcmVzZW50cyBjb25jZXJ0IHRpY2tldHMsIGl0IHNlZW1zIGJpemFycmVcbiAqIHRoYXQgd2UgY2FuIGZvcm0gYW1vdW50cyBvZiBhbnkga2V5LiBUaGUgaGFyZCBjb25zdHJhaW50IGlzIHRoYXRcbiAqIHRoZSBjb2RlIHRoYXQgaG9sZHMgdGhlIG1pbnQgZm9yIHRoYXQgYXNzZXQgY2xhc3MtLS10aGUgb25lIGFzc29jaWF0ZWRcbiAqIHdpdGggdGhhdCBicmFuZCwgb25seSBtaW50cyB0aGUgaXRlbXMgcmVwcmVzZW50aW5nIHRoZSByZWFsIHVuaXRzXG4gKiBvZiB0aGF0IGFzc2V0IGNsYXNzIGFzIGRlZmluZWQgYnkgaXQuIEFueW9uZSBlbHNlIGNhbiBwdXQgdG9nZXRoZXJcbiAqIGFuIGFtb3VudCBleHByZXNzaW5nLCBmb3IgZXhhbXBsZSwgdGhhdCB0aGV5IFwid2FudFwiIHNvbWUgaXRlbXMgdGhhdFxuICogd2lsbCBuZXZlciBiZSBtaW50ZWQuIFRoYXQgd2FudCB3aWxsIG5ldmVyIGJlIHNhdGlzZmllZC5cbiAqIFwiWW91IGNhbid0IGFsd2F5cyBnZXQuLi5cIlxuICovXG5jb25zdCBDb3B5U2V0VmFsdWVTaGFwZT1NLnNldCgpO1xuXG4vKipcbiAqIFdoZW4gdGhlIEFtb3VudFZhbHVlIG9mIGFuIEFtb3VudCBmaXRzIHRoZSBTZXRWYWx1ZVNoYXBlLCBpLmUuLCB3aGVuIGl0XG4gKiBpcyBhIENvcHlBcnJheSBvZiBwYXNzYWJsZSBLZXlzLiBUaGlzIHJlcHJlc2VudGF0aW9uIGlzIGRlcHJlY2F0ZWQuXG4gKlxuICogQGRlcHJlY2F0ZWQgUGxlYXNlIGNoYW5nZSBmcm9tIHVzaW5nIGFycmF5LWJhc2VkIFNldFZhbHVlcyB0byBDb3B5U2V0LWJhc2VkXG4gKiBDb3B5U2V0VmFsdWVzLlxuICovXG5jb25zdCBTZXRWYWx1ZVNoYXBlPU0uYXJyYXlPZihNLmtleSgpKTtcblxuLyoqXG4gKiBXaGVuIHRoZSBBbW91bnRWYWx1ZSBvZiBhbiBBbW91bnQgZml0cyB0aGUgQ29weUJhZ1ZhbHVlU2hhcGUsIGkuZS4sIHdoZW4gaXRcbiAqIGlzIGEgQ29weUJhZywgdGhlbiBpdCByZXByZXNlbnRzIHRoZSBiYWcgKG11bHRpc2V0KSBvZiB0aG9zZVxuICoga2V5cywgd2hlcmUgZWFjaCBrZXkgcmVwcmVzZW50cyBzb21lIGluZGl2aWR1YWwgc2VtaS1mdW5naWJsZVxuICogaXRlbSwgbGlrZSBhIGNvbmNlcnQgdGlja2V0LCBmcm9tIHRoZSBzZW1pLWZ1bmdpYmxlIGFzc2V0IGNsYXNzXG4gKiByZXByZXNlbnRlZCBieSB0aGF0IGFtb3VudCdzIGJyYW5kLiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoYXQga2V5XG4gKiBhcHBlYXJzIGluIHRoZSBiYWcgaXMgdGhlIG51bWJlciBvZiBmdW5naWJsZSB1bml0cyBvZiB0aGF0IGtleS5cbiAqIFRoZSBhbW91bnQgaXRzZWxmIHJlcHJlc2VudHNcbiAqIHRoZSBiYWcgb2YgdGhlc2UgaXRlbXMsIGFzIG9wcG9zZWQgdG8gYW55IG9mIHRoZSBvdGhlciBpdGVtc1xuICogZnJvbSB0aGUgc2FtZSBhc3NldCBjbGFzcy5cbiAqXG4gKiBJZiBhIGdpdmVuIHZhbHVlIGNsYXNzIHJlcHJlc2VudHMgY29uY2VydCB0aWNrZXRzLCBpdCBzZWVtcyBiaXphcnJlXG4gKiB0aGF0IHdlIGNhbiBmb3JtIGFtb3VudHMgb2YgYW55IGtleS4gVGhlIGhhcmQgY29uc3RyYWludCBpcyB0aGF0XG4gKiB0aGUgY29kZSB0aGF0IGhvbGRzIHRoZSBtaW50IGZvciB0aGF0IGFzc2V0IGNsYXNzLS0tdGhlIG9uZSBhc3NvY2lhdGVkXG4gKiB3aXRoIHRoYXQgYnJhbmQsIG9ubHkgbWludHMgdGhlIGl0ZW1zIHJlcHJlc2VudGluZyB0aGUgcmVhbCB1bml0c1xuICogb2YgdGhhdCBhc3NldCBjbGFzcyBhcyBkZWZpbmVkIGJ5IGl0LiBBbnlvbmUgZWxzZSBjYW4gcHV0IHRvZ2V0aGVyXG4gKiBhbiBhbW91bnQgZXhwcmVzc2luZywgZm9yIGV4YW1wbGUsIHRoYXQgdGhleSBcIndhbnRcIiBzb21lIGl0ZW1zIHRoYXRcbiAqIHdpbGwgbmV2ZXIgYmUgbWludGVkLiBUaGF0IHdhbnQgd2lsbCBuZXZlciBiZSBzYXRpc2ZpZWQuXG4gKiBcIllvdSBjYW4ndCBhbHdheXMgZ2V0Li4uXCJcbiAqL1xuY29uc3QgQ29weUJhZ1ZhbHVlU2hhcGU9TS5iYWcoKTtcblxuY29uc3QgQW1vdW50VmFsdWVTaGFwZT1NLm9yKFxuTmF0VmFsdWVTaGFwZSxcbkNvcHlTZXRWYWx1ZVNoYXBlLFxuU2V0VmFsdWVTaGFwZSxcbkNvcHlCYWdWYWx1ZVNoYXBlKTtcblxuXG5jb25zdCAgICAgICAgQW1vdW50U2hhcGU9aGFyZGVuKHtcbmJyYW5kOkJyYW5kU2hhcGUsXG52YWx1ZTpBbW91bnRWYWx1ZVNoYXBlfSk7XG5cblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdmFsdWUgaXMgYSBOYXQgYmlnaW50LlxuICpcbiAqIEBwYXJhbSB7QW1vdW50VmFsdWV9IHZhbHVlXG4gKiBAcmV0dXJucyB7dmFsdWUgaXMgTmF0VmFsdWV9XG4gKi8kaOKAjV9vbmNlLkFtb3VudFNoYXBlKEFtb3VudFNoYXBlKTtcbmNvbnN0ICAgICAgICBpc05hdFZhbHVlPSh2YWx1ZSk9Pm1hdGNoZXModmFsdWUsTmF0VmFsdWVTaGFwZSk7JGjigI1fb25jZS5pc05hdFZhbHVlKGlzTmF0VmFsdWUpO1xuaGFyZGVuKGlzTmF0VmFsdWUpO1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB2YWx1ZSBpcyBhIENvcHlTZXRcbiAqXG4gKiBAcGFyYW0ge0Ftb3VudFZhbHVlfSB2YWx1ZVxuICogQHJldHVybnMge3ZhbHVlIGlzIENvcHlTZXRWYWx1ZX1cbiAqL1xuY29uc3QgICAgICAgIGlzQ29weVNldFZhbHVlPSh2YWx1ZSk9Pm1hdGNoZXModmFsdWUsQ29weVNldFZhbHVlU2hhcGUpOyRo4oCNX29uY2UuaXNDb3B5U2V0VmFsdWUoaXNDb3B5U2V0VmFsdWUpO1xuaGFyZGVuKGlzQ29weVNldFZhbHVlKTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdmFsdWUgaXMgYSBwYXNzIGJ5IGNvcHkgYXJyYXkgc3RydWN0dXJlLiBEb2VzIG5vdFxuICogY2hlY2sgZm9yIGR1cGxpY2F0ZXMuIFRvIGNoZWNrIGZvciBkdXBsaWNhdGVzLCB1c2Ugc2V0TWF0aEhlbHBlcnMuY29lcmNlLlxuICpcbiAqIEBkZXByZWNhdGVkIFBsZWFzZSBjaGFuZ2UgZnJvbSB1c2luZyBhcnJheS1iYXNlZCBTZXRWYWx1ZXMgdG8gQ29weVNldC1iYXNlZFxuICogQ29weVNldFZhbHVlcy5cbiAqIEBwYXJhbSB7QW1vdW50VmFsdWV9IHZhbHVlXG4gKiBAcmV0dXJucyB7dmFsdWUgaXMgU2V0VmFsdWV9XG4gKi9cbmNvbnN0ICAgICAgICBpc1NldFZhbHVlPSh2YWx1ZSk9Pm1hdGNoZXModmFsdWUsU2V0VmFsdWVTaGFwZSk7JGjigI1fb25jZS5pc1NldFZhbHVlKGlzU2V0VmFsdWUpO1xuaGFyZGVuKGlzU2V0VmFsdWUpO1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB2YWx1ZSBpcyBhIENvcHlCYWdcbiAqXG4gKiBAcGFyYW0ge0Ftb3VudFZhbHVlfSB2YWx1ZVxuICogQHJldHVybnMge3ZhbHVlIGlzIENvcHlCYWdWYWx1ZX1cbiAqL1xuY29uc3QgICAgICAgIGlzQ29weUJhZ1ZhbHVlPSh2YWx1ZSk9Pm1hdGNoZXModmFsdWUsQ29weUJhZ1ZhbHVlU2hhcGUpOyRo4oCNX29uY2UuaXNDb3B5QmFnVmFsdWUoaXNDb3B5QmFnVmFsdWUpO1xuaGFyZGVuKGlzQ29weUJhZ1ZhbHVlKTtcblxuLyogT25lIEdPT0dPTHRoIHNob3VsZCBiZSBlbm91Z2ggZGVjaW1hbCBwbGFjZXMgZm9yIGFueWJvZHkuKi9cbmNvbnN0ICAgICAgICBNQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVM9MTAwOyRo4oCNX29uY2UuTUFYX0FCU09MVVRFX0RFQ0lNQUxfUExBQ0VTKE1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUyk7XG5cbmNvbnN0ICAgICAgICBBc3NldEtpbmRTaGFwZT1NLm9yKCduYXQnLCdzZXQnLCdjb3B5U2V0JywnY29weUJhZycpOyRo4oCNX29uY2UuQXNzZXRLaW5kU2hhcGUoQXNzZXRLaW5kU2hhcGUpO1xuXG5jb25zdCAgICAgICAgRGlzcGxheUluZm9TaGFwZT1NLnBhcnRpYWwoXG5oYXJkZW4oe1xuZGVjaW1hbFBsYWNlczpNLmFuZChcbk0uZ3RlKC1NQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVMpLFxuTS5sdGUoTUFYX0FCU09MVVRFX0RFQ0lNQUxfUExBQ0VTKSksXG5cbmFzc2V0S2luZDpBc3NldEtpbmRTaGFwZX0pLFxuXG5oYXJkZW4oe1xuLyogSW5jbHVkaW5nIHRoaXMgZW1wdHkgYHJlc3RgIGVuc3VyZXMgdGhhdCB0aGVyZSBhcmUgbm8gb3RoZXIqL1xuLyogcHJvcGVydGllcyBiZXlvbmQgdGhvc2UgaW4gdGhlIGBiYXNlYCByZWNvcmQuKi99KSk7XG5cblxuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gSW50ZXJmYWNlcyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovJGjigI1fb25jZS5EaXNwbGF5SW5mb1NoYXBlKERpc3BsYXlJbmZvU2hhcGUpO1xuXG5jb25zdCAgICAgICAgQnJhbmRJPU0uaW50ZXJmYWNlKCdCcmFuZCcse1xuaXNNeUlzc3VlcjpNLmNhbGxXaGVuKE0uYXdhaXQoSXNzdWVyU2hhcGUpKS5yZXR1cm5zKE0uYm9vbGVhbigpKSxcbmdldEFsbGVnZWROYW1lOk0uY2FsbCgpLnJldHVybnMoTS5zdHJpbmcoKSksXG5nZXREaXNwbGF5SW5mbzpNLmNhbGwoKS5yZXR1cm5zKERpc3BsYXlJbmZvU2hhcGUpLFxuZ2V0QW1vdW50U2hhcGU6TS5jYWxsKCkucmV0dXJucyhNLnBhdHRlcm4oKSl9KTtcblxuXG4vKipcbiAqIEBwYXJhbSB7UGF0dGVybn0gW2JyYW5kU2hhcGVdXG4gKiBAcGFyYW0ge1BhdHRlcm59IFthc3NldEtpbmRTaGFwZV1cbiAqIEBwYXJhbSB7UGF0dGVybn0gW2Ftb3VudFNoYXBlXVxuICovJGjigI1fb25jZS5CcmFuZEkoQnJhbmRJKTtcbmNvbnN0ICAgICAgICBtYWtlSXNzdWVySW50ZXJmYWNlcz0oXG5icmFuZFNoYXBlPUJyYW5kU2hhcGUsXG5hc3NldEtpbmRTaGFwZT1Bc3NldEtpbmRTaGFwZSxcbmFtb3VudFNoYXBlPUFtb3VudFNoYXBlKT0+XG57XG5jb25zdCBJc3N1ZXJJPU0uaW50ZXJmYWNlKCdJc3N1ZXInLHtcbmdldEJyYW5kOk0uY2FsbCgpLnJldHVybnMoYnJhbmRTaGFwZSksXG5nZXRBbGxlZ2VkTmFtZTpNLmNhbGwoKS5yZXR1cm5zKE0uc3RyaW5nKCkpLFxuZ2V0QXNzZXRLaW5kOk0uY2FsbCgpLnJldHVybnMoYXNzZXRLaW5kU2hhcGUpLFxuZ2V0RGlzcGxheUluZm86TS5jYWxsKCkucmV0dXJucyhEaXNwbGF5SW5mb1NoYXBlKSxcbm1ha2VFbXB0eVB1cnNlOk0uY2FsbCgpLnJldHVybnMoUHVyc2VTaGFwZSksXG5cbmlzTGl2ZTpNLmNhbGxXaGVuKE0uYXdhaXQoUGF5bWVudFNoYXBlKSkucmV0dXJucyhNLmJvb2xlYW4oKSksXG5nZXRBbW91bnRPZjpNLmNhbGxXaGVuKE0uYXdhaXQoUGF5bWVudFNoYXBlKSkucmV0dXJucyhhbW91bnRTaGFwZSksXG5idXJuOk0uY2FsbFdoZW4oTS5hd2FpdChQYXltZW50U2hhcGUpKS5cbm9wdGlvbmFsKE0ucGF0dGVybigpKS5cbnJldHVybnMoYW1vdW50U2hhcGUpLFxuY2xhaW06TS5jYWxsV2hlbihNLmF3YWl0KFBheW1lbnRTaGFwZSkpLlxub3B0aW9uYWwoTS5wYXR0ZXJuKCkpLlxucmV0dXJucyhQYXltZW50U2hhcGUpLFxuY29tYmluZTpNLmNhbGwoTS5hcnJheU9mKE0uZXJlZihQYXltZW50U2hhcGUpKSkuXG5vcHRpb25hbChhbW91bnRTaGFwZSkuXG5yZXR1cm5zKE0uZXJlZihQYXltZW50U2hhcGUpKSxcbnNwbGl0Ok0uY2FsbFdoZW4oTS5hd2FpdChQYXltZW50U2hhcGUpLGFtb3VudFNoYXBlKS5yZXR1cm5zKFxuTS5hcnJheU9mKFBheW1lbnRTaGFwZSkpLFxuXG5zcGxpdE1hbnk6TS5jYWxsV2hlbihcbk0uYXdhaXQoUGF5bWVudFNoYXBlKSxcbk0uYXJyYXlPZihhbW91bnRTaGFwZSkpLlxucmV0dXJucyhNLmFycmF5T2YoUGF5bWVudFNoYXBlKSl9KTtcblxuXG5jb25zdCBNaW50ST1NLmludGVyZmFjZSgnTWludCcse1xuZ2V0SXNzdWVyOk0uY2FsbCgpLnJldHVybnMoSXNzdWVyU2hhcGUpLFxubWludFBheW1lbnQ6TS5jYWxsKGFtb3VudFNoYXBlKS5yZXR1cm5zKFBheW1lbnRTaGFwZSl9KTtcblxuXG5jb25zdCBQYXltZW50ST1NLmludGVyZmFjZSgnUGF5bWVudCcse1xuZ2V0QWxsZWdlZEJyYW5kOk0uY2FsbCgpLnJldHVybnMoYnJhbmRTaGFwZSl9KTtcblxuXG5jb25zdCBQdXJzZUk9TS5pbnRlcmZhY2UoJ1B1cnNlJyx7XG5nZXRBbGxlZ2VkQnJhbmQ6TS5jYWxsKCkucmV0dXJucyhicmFuZFNoYXBlKSxcbmdldEN1cnJlbnRBbW91bnQ6TS5jYWxsKCkucmV0dXJucyhhbW91bnRTaGFwZSksXG5nZXRDdXJyZW50QW1vdW50Tm90aWZpZXI6TS5jYWxsKCkucmV0dXJucyhOb3RpZmllclNoYXBlKSxcbi8qIFB1cnNlSSBkb2VzICpub3QqIGRlbGF5IGBkZXBvc2l0YCB1bnRpbCBgc3JjUGF5bWVudGAgaXMgZnVsZnVsbGVkLiovXG4vKiBSYXRoZXIsIHRoZSBzZW1hbnRpY3Mgb2YgYGRlcG9zaXRgIHJlcXVpcmUgaXQgdG8gcHJvdmlkZSBpdHMqL1xuLyogY2FsbGVycyB3aXRoIGEgc3Ryb25nIGd1YXJhbnRlZSB0aGF0IGBkZXBvc2l0YCBtZXNzYWdlcyBhcmUqL1xuLyogcHJvY2Vzc2VkIHdpdGhvdXQgZnVydGhlciBkZWxheSBpbiB0aGUgb3JkZXIgdGhleSBhcnJpdmUuKi9cbi8qIFB1cnNlSSB0aGVyZWZvcmUgcmVxdWlyZXMgdGhhdCB0aGUgYHNyY1BheW1lbnRgIGFyZ3VtZW50IGFscmVhZHkqL1xuLyogYmUgYSByZW1vdGFibGUsIG5vdCBhIHByb21pc2UuKi9cbi8qIFB1cnNlSSBvbmx5IGNhbGxzIHRoaXMgcmF3IG1ldGhvZCBhZnRlciB2YWxpZGF0aW5nIHRoYXQqL1xuLyogYHNyY1BheW1lbnRgIGlzIGEgcmVtb3RhYmxlLCBsZWF2aW5nIGl0Ki9cbi8qIHRvIHRoaXMgcmF3IG1ldGhvZCB0byB2YWxpZGF0ZSB0aGF0IHRoaXMgcmVtb3RhYmxlIGlzIGFjdHVhbGx5Ki9cbi8qIGEgbGl2ZSBwYXltZW50IG9mIHRoZSBjb3JyZWN0IGJyYW5kIHdpdGggc3VmZmljaWVudCBmdW5kcy4qL1xuZGVwb3NpdDpNLmNhbGwoUGF5bWVudFNoYXBlKS5vcHRpb25hbChNLnBhdHRlcm4oKSkucmV0dXJucyhhbW91bnRTaGFwZSksXG5nZXREZXBvc2l0RmFjZXQ6TS5jYWxsKCkucmV0dXJucyhEZXBvc2l0RmFjZXRTaGFwZSksXG53aXRoZHJhdzpNLmNhbGwoYW1vdW50U2hhcGUpLnJldHVybnMoUGF5bWVudFNoYXBlKSxcbmdldFJlY292ZXJ5U2V0Ok0uY2FsbCgpLnJldHVybnMoTS5zZXRPZihQYXltZW50U2hhcGUpKSxcbnJlY292ZXJBbGw6TS5jYWxsKCkucmV0dXJucyhhbW91bnRTaGFwZSl9KTtcblxuXG5jb25zdCBEZXBvc2l0RmFjZXRJPU0uaW50ZXJmYWNlKCdEZXBvc2l0RmFjZXQnLHtcbnJlY2VpdmU6UHVyc2VJLm1ldGhvZEd1YXJkcy5kZXBvc2l0fSk7XG5cblxuY29uc3QgUHVyc2VJS2l0PWhhcmRlbih7XG5wdXJzZTpQdXJzZUksXG5kZXBvc2l0RmFjZXQ6RGVwb3NpdEZhY2V0SX0pO1xuXG5cbnJldHVybiBoYXJkZW4oe1xuSXNzdWVySSxcbk1pbnRJLFxuUGF5bWVudEksXG5QdXJzZUlLaXR9KTtcblxuIH07JGjigI1fb25jZS5tYWtlSXNzdWVySW50ZXJmYWNlcyhtYWtlSXNzdWVySW50ZXJmYWNlcyk7XG5oYXJkZW4obWFrZUlzc3VlckludGVyZmFjZXMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkJyYW5kU2hhcGUiOlsiQnJhbmRTaGFwZSJdLCJJc3N1ZXJTaGFwZSI6WyJJc3N1ZXJTaGFwZSJdLCJQYXltZW50U2hhcGUiOlsiUGF5bWVudFNoYXBlIl0sIlB1cnNlU2hhcGUiOlsiUHVyc2VTaGFwZSJdLCJEZXBvc2l0RmFjZXRTaGFwZSI6WyJEZXBvc2l0RmFjZXRTaGFwZSJdLCJNaW50U2hhcGUiOlsiTWludFNoYXBlIl0sIkFtb3VudFNoYXBlIjpbIkFtb3VudFNoYXBlIl0sImlzTmF0VmFsdWUiOlsiaXNOYXRWYWx1ZSJdLCJpc0NvcHlTZXRWYWx1ZSI6WyJpc0NvcHlTZXRWYWx1ZSJdLCJpc1NldFZhbHVlIjpbImlzU2V0VmFsdWUiXSwiaXNDb3B5QmFnVmFsdWUiOlsiaXNDb3B5QmFnVmFsdWUiXSwiTUFYX0FCU09MVVRFX0RFQ0lNQUxfUExBQ0VTIjpbIk1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUyJdLCJBc3NldEtpbmRTaGFwZSI6WyJBc3NldEtpbmRTaGFwZSJdLCJEaXNwbGF5SW5mb1NoYXBlIjpbIkRpc3BsYXlJbmZvU2hhcGUiXSwiQnJhbmRJIjpbIkJyYW5kSSJdLCJtYWtlSXNzdWVySW50ZXJmYWNlcyI6WyJtYWtlSXNzdWVySW50ZXJmYWNlcyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACi8pPw30MAAN9DAAAhAAAAQGFnb3JpYy9lcnRwLXYwLjE1LjUvc3JjL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIi8+Ki9cblxuLyoqXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLkludGVyZmFjZVNwZWN9IEludGVyZmFjZVNwZWNcbiAqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuTWFyc2hhbEdldEludGVyZmFjZU9mfSBHZXRJbnRlcmZhY2VPZlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IEFtb3VudFxuICogQW1vdW50cyBhcmUgZGVzY3JpcHRpb25zIG9mIGRpZ2l0YWwgYXNzZXRzLCBhbnN3ZXJpbmcgdGhlIHF1ZXN0aW9uc1xuICogXCJob3cgbXVjaFwiIGFuZCBcIm9mIHdoYXQga2luZFwiLiBBbW91bnRzIGFyZSB2YWx1ZXMgbGFiZWxlZCB3aXRoIGEgYnJhbmQuXG4gKiBBbW91bnRNYXRoIGV4ZWN1dGVzIHRoZSBsb2dpYyBvZiBob3cgYW1vdW50cyBhcmUgY2hhbmdlZCB3aGVuIGRpZ2l0YWxcbiAqIGFzc2V0cyBhcmUgbWVyZ2VkLCBzZXBhcmF0ZWQsIG9yIG90aGVyd2lzZSBtYW5pcHVsYXRlZC4gRm9yXG4gKiBleGFtcGxlLCBhIGRlcG9zaXQgb2YgMiBidWNrcyBpbnRvIGEgcHVyc2UgdGhhdCBhbHJlYWR5IGhhcyAzIGJ1Y2tzXG4gKiBnaXZlcyBhIG5ldyBwdXJzZSBiYWxhbmNlIG9mIDUgYnVja3MuIEFuIGVtcHR5IHB1cnNlIGhhcyAwIGJ1Y2tzLiBBbW91bnRNYXRoXG4gKiByZWxpZXMgaGVhdmlseSBvbiBwb2x5bW9ycGhpYyBNYXRoSGVscGVycywgd2hpY2ggbWFuaXB1bGF0ZSB0aGUgdW5icmFuZGVkXG4gKiBwb3J0aW9uLlxuICpcbiAqIEBwcm9wZXJ0eSB7QnJhbmQ8Sz59IGJyYW5kXG4gKiBAcHJvcGVydHkge0Fzc2V0VmFsdWVGb3JLaW5kPEs+fSB2YWx1ZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge05hdFZhbHVlIHwgU2V0VmFsdWUgfCBDb3B5U2V0VmFsdWUgfCBDb3B5QmFnVmFsdWV9IEFtb3VudFZhbHVlXG4gKiBBbiBgQW1vdW50VmFsdWVgIGRlc2NyaWJlcyBhIHNldCBvciBxdWFudGl0eSBvZiBhc3NldHMgdGhhdCBjYW4gYmUgb3duZWQgb3JcbiAqIHNoYXJlZC5cbiAqXG4gKiBBIGZ1bmdpYmxlIGBBbW91bnRWYWx1ZWAgdXNlcyBhIG5vbi1uZWdhdGl2ZSBiaWdpbnQgdG8gcmVwcmVzZW50IGEgcXVhbnRpdHlcbiAqIG9mIHRoYXQgbWFueSBhc3NldHMuXG4gKlxuICogQSBub24tZnVuZ2libGUgYEFtb3VudFZhbHVlYCB1c2VzIGFuIGFycmF5IG9yIENvcHlTZXQgb2YgYEtleWBzIHRvIHJlcHJlc2VudFxuICogYSBzZXQgb2Ygd2hhdGV2ZXIgYXNzZXQgZWFjaCBrZXkgcmVwcmVzZW50cy4gQSBgS2V5YCBpcyBhIHBhc3NhYmxlIHZhbHVlXG4gKiB0aGF0IGNhbiBiZSB1c2VkIGFzIGFuIGVsZW1lbnQgaW4gYSBzZXQgKFNldFN0b3JlIG9yIENvcHlTZXQpIG9yIGFzIHRoZVxuICoga2V5IGluIGEgbWFwIChNYXBTdG9yZSBvciBDb3B5TWFwKS5cbiAqXG4gKiBgU2V0VmFsdWVgIGlzIGZvciB0aGUgZGVwcmVjYXRlZCBzZXQgcmVwcmVzZW50YXRpb24sIHVzaW5nIGFuIGFycmF5IGRpcmVjdGx5XG4gKiB0byByZXByZXNlbnQgdGhlIGFycmF5IG9mIGl0cyBlbGVtZW50cy4gYENvcHlTZXRWYWx1ZWAgaXMgdGhlIHByb3BlclxuICogcmVwcmVzZW50YXRpb24gdXNpbmcgYSBDb3B5U2V0LlxuICpcbiAqIEEgc2VtaS1mdW5naWJsZSBgQ29weUJhZ1ZhbHVlYCBpcyByZXByZXNlbnRlZCBhcyBhXG4gKiBgQ29weUJhZ2Agb2YgYEtleWAgb2JqZWN0cy4gXCJCYWdcIiBpcyBzeW5vbnltb3VzIHdpdGggTXVsdGlTZXQsIHdoZXJlIGFuXG4gKiBlbGVtZW50IG9mIGEgYmFnIGNhbiBiZSBwcmVzZW50IG9uY2Ugb3IgbW9yZSB0aW1lcywgaS5lLiwgc29tZSBwb3NpdGl2ZVxuICogYmlnaW50IG51bWJlciBvZiB0aW1lcywgcmVwcmVzZW50aW5nIHRoYXQgcXVhbnRpdHkgb2YgdGhlIGFzc2V0IHJlcHJlc2VudGVkXG4gKiBieSB0aGF0IGtleS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtBbW91bnRWYWx1ZX0gVmFsdWVcbiAqIFwiVmFsdWVcIiBpcyBhIGRlcHJlY2F0ZWQgYWxpYXMgZm9yIFwiQW1vdW50VmFsdWVcIi4gUGxlYXNlIHVzZVxuICogXCJBbW91bnRWYWx1ZVwiIGluc3RlYWQuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7J25hdCcgfCAnc2V0JyB8ICdjb3B5U2V0JyB8ICdjb3B5QmFnJyB9IEFzc2V0S2luZFxuICpcbiAqIFNlZSBkb2MtY29tbWVudCBmb3IgYEFtb3VudFZhbHVlYC5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAdHlwZWRlZiB7SyBleHRlbmRzICduYXQnID8gTmF0VmFsdWUgOlxuICogSyBleHRlbmRzICdzZXQnID8gU2V0VmFsdWUgOlxuICogSyBleHRlbmRzICdjb3B5U2V0JyA/IENvcHlTZXRWYWx1ZTpcbiAqIEsgZXh0ZW5kcyAnY29weUJhZycgPyBDb3B5QmFnVmFsdWUgOlxuICogbmV2ZXJcbiAqIH0gQXNzZXRWYWx1ZUZvcktpbmRcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QW1vdW50VmFsdWV9IFZcbiAqIEB0eXBlZGVmIHtWIGV4dGVuZHMgTmF0VmFsdWUgPyAnbmF0JyA6XG4gKiAgViBleHRlbmRzIFNldFZhbHVlID8gJ3NldCcgOlxuICogIFYgZXh0ZW5kcyBDb3B5U2V0VmFsdWUgPyAnY29weVNldCcgOlxuICogIFYgZXh0ZW5kcyBDb3B5QmFnVmFsdWUgPyAnY29weUJhZycgOlxuICogIG5ldmVyfSBBc3NldEtpbmRGb3JWYWx1ZVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IERpc3BsYXlJbmZvXG4gKiBAcHJvcGVydHkge251bWJlcj19IGRlY2ltYWxQbGFjZXMgVGVsbHMgdGhlIGRpc3BsYXkgc29mdHdhcmUgaG93XG4gKiAgIG1hbnkgZGVjaW1hbCBwbGFjZXMgdG8gbW92ZSB0aGUgZGVjaW1hbCBvdmVyIHRvIHRoZSBsZWZ0LCBvciBpblxuICogICBvdGhlciB3b3Jkcywgd2hpY2ggcG9zaXRpb24gY29ycmVzcG9uZHMgdG8gd2hvbGUgbnVtYmVycy4gV2VcbiAqICAgcmVxdWlyZSBmdW5naWJsZSBkaWdpdGFsIGFzc2V0cyB0byBiZSByZXByZXNlbnRlZCBpbiBpbnRlZ2VycywgaW5cbiAqICAgdGhlIHNtYWxsZXN0IHVuaXQgKGkuZS4gVVNEIG1pZ2h0IGJlIHJlcHJlc2VudGVkIGluIG1pbGwsIGFcbiAqICAgdGhvdXNhbmR0aCBvZiBhIGRvbGxhci4gSW4gdGhhdCBjYXNlLCBgZGVjaW1hbFBsYWNlc2Agd291bGQgYmVcbiAqICAgMy4pIFRoaXMgcHJvcGVydHkgaXMgb3B0aW9uYWwsIGFuZCBmb3Igbm9uLWZ1bmdpYmxlIGRpZ2l0YWxcbiAqICAgYXNzZXRzLCBzaG91bGQgbm90IGJlIHNwZWNpZmllZC4gVGhlIGRlY2ltYWxQbGFjZXMgcHJvcGVydHlcbiAqICAgc2hvdWxkIGJlIHVzZWQgZm9yICpkaXNwbGF5IHB1cnBvc2VzIG9ubHkqLiBBbnkgb3RoZXIgdXNlIGlzIGFuXG4gKiAgIGFudGktcGF0dGVybi5cbiAqIEBwcm9wZXJ0eSB7S30gYXNzZXRLaW5kIC0gdGhlIGtpbmQgb2YgYXNzZXQsIGVpdGhlclxuICogICBBc3NldEtpbmQuTkFUIChmdW5naWJsZSkgb3JcbiAqICAgQXNzZXRLaW5kLlNFVCBvciBBc3NldEtpbmQuQ09QWV9TRVQgKG5vbi1mdW5naWJsZSlcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBCcmFuZFxuICogVGhlIGJyYW5kIGlkZW50aWZpZXMgdGhlIGtpbmQgb2YgaXNzdWVyLCBhbmQgaGFzIGEgZnVuY3Rpb24gdG8gZ2V0IHRoZVxuICogYWxsZWdlZCBuYW1lIGZvciB0aGUga2luZCBvZiBhc3NldCBkZXNjcmliZWQuIFRoZSBhbGxlZ2VkIG5hbWUgKHN1Y2hcbiAqIGFzICdCVEMnIG9yICdtb29sYScpIGlzIHByb3ZpZGVkIGJ5IHRoZSBtYWtlciBvZiB0aGUgaXNzdWVyIGFuZCBzaG91bGRcbiAqIG5vdCBiZSB0cnVzdGVkIGFzIGFjY3VyYXRlLlxuICpcbiAqIEV2ZXJ5IGFtb3VudCBjcmVhdGVkIGJ5IGEgcGFydGljdWxhciBBbW91bnRNYXRoIHdpbGwgc2hhcmUgdGhlIHNhbWUgYnJhbmQsXG4gKiBidXQgcmVjaXBpZW50cyBjYW5ub3QgcmVseSBvbiB0aGUgYnJhbmQgdG8gdmVyaWZ5IHRoYXQgYSBwdXJwb3J0ZWQgYW1vdW50XG4gKiByZXByZXNlbnRzIHRoZSBpc3N1ZXIgdGhleSBpbnRlbmRlZCwgc2luY2UgdGhlIHNhbWUgYnJhbmQgY2FuIGJlIHJldXNlZCBieVxuICogYSBtaXNiZWhhdmluZyBpc3N1ZXIuXG4gKlxuICogQHByb3BlcnR5IHsoYWxsZWdlZElzc3VlcjogRVJlZjxJc3N1ZXI+KSA9PiBQcm9taXNlPGJvb2xlYW4+fSBpc015SXNzdWVyXG4gKiBTaG91bGQgYmUgdXNlZCB3aXRoIGBpc3N1ZXIuZ2V0QnJhbmRgIHRvIGVuc3VyZSBhbiBpc3N1ZXIgYW5kIGJyYW5kIG1hdGNoLlxuICogQHByb3BlcnR5IHsoKSA9PiBzdHJpbmd9IGdldEFsbGVnZWROYW1lXG4gKiBAcHJvcGVydHkgeygpID0+IERpc3BsYXlJbmZvfSBnZXREaXNwbGF5SW5mb1xuICogR2l2ZSBpbmZvcm1hdGlvbiB0byBVSSBvbiBob3cgdG8gZGlzcGxheSB0aGUgYW1vdW50LlxuICogQHByb3BlcnR5IHsoKSA9PiBQYXR0ZXJufSBnZXRBbW91bnRTaGFwZVxuICovXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBJc3N1ZXIgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgSXNzdWVySXNMaXZlXG4gKlxuICogUmV0dXJuIHRydWUgaWYgdGhlIHBheW1lbnQgY29udGludWVzIHRvIGV4aXN0LlxuICpcbiAqIElmIHRoZSBwYXltZW50IGlzIGEgcHJvbWlzZSwgdGhlIG9wZXJhdGlvbiB3aWxsIHByb2NlZWQgdXBvblxuICogcmVzb2x1dGlvbi5cbiAqXG4gKiBAcGFyYW0ge0VSZWY8UGF5bWVudD59IHBheW1lbnRcbiAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fVxuICovXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAY2FsbGJhY2sgSXNzdWVyR2V0QW1vdW50T2ZcbiAqXG4gKiBHZXQgdGhlIGFtb3VudCBvZiBkaWdpdGFsIGFzc2V0cyBpbiB0aGUgcGF5bWVudC4gQmVjYXVzZSB0aGVcbiAqIHBheW1lbnQgaXMgbm90IHRydXN0ZWQsIHdlIGNhbm5vdCBjYWxsIGEgbWV0aG9kIG9uIGl0IGRpcmVjdGx5LCBhbmRcbiAqIG11c3QgdXNlIHRoZSBpc3N1ZXIgaW5zdGVhZC5cbiAqXG4gKiBJZiB0aGUgcGF5bWVudCBpcyBhIHByb21pc2UsIHRoZSBvcGVyYXRpb24gd2lsbCBwcm9jZWVkIHVwb25cbiAqIHJlc29sdXRpb24uXG4gKlxuICogQHBhcmFtIHtFUmVmPFBheW1lbnQ+fSBwYXltZW50XG4gKiBAcmV0dXJucyB7UHJvbWlzZTxBbW91bnQ8Sz4+fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIElzc3VlckJ1cm5cbiAqXG4gKiBCdXJuIGFsbCBvZiB0aGUgZGlnaXRhbCBhc3NldHMgaW4gdGhlXG4gKiBwYXltZW50LiBgb3B0QW1vdW50YCBpcyBvcHRpb25hbC4gSWYgYG9wdEFtb3VudGAgaXMgcHJlc2VudCwgdGhlXG4gKiBjb2RlIHdpbGwgaW5zaXN0IHRoYXQgdGhlIGFtb3VudCBvZiB0aGUgZGlnaXRhbCBhc3NldHMgaW4gdGhlXG4gKiBwYXltZW50IGlzIGVxdWFsIHRvIGBvcHRBbW91bnRgLCB0byBwcmV2ZW50IHNlbmRpbmcgdGhlIHdyb25nXG4gKiBwYXltZW50IGFuZCBvdGhlciBjb25mdXNpb24uXG4gKlxuICogSWYgdGhlIHBheW1lbnQgaXMgYSBwcm9taXNlLCB0aGUgb3BlcmF0aW9uIHdpbGwgcHJvY2VlZCB1cG9uXG4gKiByZXNvbHV0aW9uLlxuICpcbiAqIEBwYXJhbSB7RVJlZjxQYXltZW50Pn0gcGF5bWVudFxuICogQHBhcmFtIHtQYXR0ZXJuPX0gb3B0QW1vdW50U2hhcGVcbiAqIEByZXR1cm5zIHtQcm9taXNlPEFtb3VudD59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgSXNzdWVyQ2xhaW1cbiAqXG4gKiBUcmFuc2ZlciBhbGwgZGlnaXRhbCBhc3NldHMgZnJvbSB0aGUgcGF5bWVudCB0byBhIG5ldyBwYXltZW50IGFuZFxuICogZGVsZXRlIHRoZSBvcmlnaW5hbC4gYG9wdEFtb3VudGAgaXMgb3B0aW9uYWwuIElmIGBvcHRBbW91bnRgIGlzXG4gKiBwcmVzZW50LCB0aGUgY29kZSB3aWxsIGluc2lzdCB0aGF0IHRoZSBhbW91bnQgb2YgZGlnaXRhbCBhc3NldHMgaW5cbiAqIHRoZSBwYXltZW50IGlzIGVxdWFsIHRvIGBvcHRBbW91bnRgLCB0byBwcmV2ZW50IHNlbmRpbmcgdGhlIHdyb25nXG4gKiBwYXltZW50IGFuZCBvdGhlciBjb25mdXNpb24uXG4gKlxuICogSWYgdGhlIHBheW1lbnQgaXMgYSBwcm9taXNlLCB0aGUgb3BlcmF0aW9uIHdpbGwgcHJvY2VlZCB1cG9uXG4gKiByZXNvbHV0aW9uLlxuICpcbiAqIEBwYXJhbSB7RVJlZjxQYXltZW50Pn0gcGF5bWVudFxuICogQHBhcmFtIHtQYXR0ZXJuPX0gb3B0QW1vdW50U2hhcGVcbiAqIEByZXR1cm5zIHtQcm9taXNlPFBheW1lbnQ+fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIElzc3VlckNvbWJpbmVcbiAqXG4gKiBDb21iaW5lIG11bHRpcGxlIHBheW1lbnRzIGludG8gb25lIHBheW1lbnQuXG4gKlxuICogSWYgYW55IG9mIHRoZSBwYXltZW50cyBpcyBhIHByb21pc2UsIHRoZSBvcGVyYXRpb24gd2lsbCBwcm9jZWVkXG4gKiB1cG9uIHJlc29sdXRpb24uXG4gKlxuICogQHBhcmFtIHtFUmVmPFBheW1lbnQ+W119IHBheW1lbnRzQXJyYXlcbiAqIEBwYXJhbSB7QW1vdW50PX0gb3B0VG90YWxBbW91bnRcbiAqIEByZXR1cm5zIHtQcm9taXNlPFBheW1lbnQ+fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIElzc3VlclNwbGl0XG4gKlxuICogU3BsaXQgYSBzaW5nbGUgcGF5bWVudCBpbnRvIHR3byBwYXltZW50cyxcbiAqIEEgYW5kIEIsIGFjY29yZGluZyB0byB0aGUgcGF5bWVudEFtb3VudEEgcGFzc2VkIGluLlxuICpcbiAqIElmIHRoZSBwYXltZW50IGlzIGEgcHJvbWlzZSwgdGhlIG9wZXJhdGlvbiB3aWxsIHByb2NlZWQgdXBvblxuICogcmVzb2x1dGlvbi5cbiAqXG4gKiBAcGFyYW0ge0VSZWY8UGF5bWVudD59IHBheW1lbnRcbiAqIEBwYXJhbSB7QW1vdW50fSBwYXltZW50QW1vdW50QVxuICogQHJldHVybnMge1Byb21pc2U8UGF5bWVudFtdPn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBJc3N1ZXJTcGxpdE1hbnlcbiAqXG4gKiBTcGxpdCBhIHNpbmdsZSBwYXltZW50IGludG8gbWFueSBwYXltZW50cywgYWNjb3JkaW5nIHRvIHRoZSBhbW91bnRzXG4gKiBwYXNzZWQgaW4uXG4gKlxuICogSWYgdGhlIHBheW1lbnQgaXMgYSBwcm9taXNlLCB0aGUgb3BlcmF0aW9uIHdpbGwgcHJvY2VlZCB1cG9uXG4gKiByZXNvbHV0aW9uLlxuICpcbiAqIEBwYXJhbSB7RVJlZjxQYXltZW50Pn0gcGF5bWVudFxuICogQHBhcmFtIHtBbW91bnRbXX0gYW1vdW50c1xuICogQHJldHVybnMge1Byb21pc2U8UGF5bWVudFtdPn1cbiAqXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHR5cGVkZWYge29iamVjdH0gSXNzdWVyXG4gKlxuICogVGhlIGlzc3VlciBjYW5ub3QgbWludCBhIG5ldyBhbW91bnQsIGJ1dCBpdCBjYW4gY3JlYXRlIGVtcHR5IHB1cnNlc1xuICogYW5kIHBheW1lbnRzLiBUaGUgaXNzdWVyIGNhbiBhbHNvIHRyYW5zZm9ybSBwYXltZW50cyAoc3BsaXR0aW5nXG4gKiBwYXltZW50cywgY29tYmluaW5nIHBheW1lbnRzLCBidXJuaW5nIHBheW1lbnRzLCBhbmQgY2xhaW1pbmdcbiAqIHBheW1lbnRzIGV4Y2x1c2l2ZWx5KS4gVGhlIGlzc3VlciBzaG91bGQgYmUgZ290dGVuIGZyb20gYSB0cnVzdGVkXG4gKiBzb3VyY2UgYW5kIHRoZW4gcmVsaWVkIHVwb24gYXMgdGhlIGRlY2lkZXIgb2Ygd2hldGhlciBhbiB1bnRydXN0ZWRcbiAqIHBheW1lbnQgaXMgdmFsaWQuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBCcmFuZDxLPn0gZ2V0QnJhbmQgR2V0IHRoZSBCcmFuZCBmb3IgdGhpcyBJc3N1ZXIuIFRoZVxuICogQnJhbmQgaW5kaWNhdGVzIHRoZSB0eXBlIG9mIGRpZ2l0YWwgYXNzZXQgYW5kIGlzIHNoYXJlZCBieSB0aGVcbiAqIG1pbnQsIHRoZSBpc3N1ZXIsIGFuZCBhbnkgcHVyc2VzIGFuZCBwYXltZW50cyBvZiB0aGlzIHBhcnRpY3VsYXJcbiAqIGtpbmQuIFRoZSBicmFuZCBpcyBub3QgY2xvc2VseSBoZWxkLCBzbyB0aGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmVcbiAqIHRydXN0ZWQgdG8gaWRlbnRpZnkgYW4gaXNzdWVyIGFsb25lLiBGYWtlIGRpZ2l0YWwgYXNzZXRzIGFuZCBhbW91bnRcbiAqIGNhbiB1c2UgYW5vdGhlciBpc3N1ZXIncyBicmFuZC5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IHN0cmluZ30gZ2V0QWxsZWdlZE5hbWUgR2V0IHRoZSBhbGxlZ2VkTmFtZSBmb3JcbiAqIHRoaXMgbWludC9pc3N1ZXJcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gQXNzZXRLaW5kfSBnZXRBc3NldEtpbmQgR2V0IHRoZSBraW5kIG9mXG4gKiBNYXRoSGVscGVycyB1c2VkIGJ5IHRoaXMgSXNzdWVyLlxuICogQHByb3BlcnR5IHsoKSA9PiBEaXNwbGF5SW5mb30gZ2V0RGlzcGxheUluZm8gR2l2ZSBpbmZvcm1hdGlvbiB0byBVSVxuICogIG9uIGhvdyB0byBkaXNwbGF5IGFtb3VudHMgZm9yIHRoaXMgaXNzdWVyLlxuICogQHByb3BlcnR5IHsoKSA9PiBQdXJzZTxLPn0gbWFrZUVtcHR5UHVyc2UgTWFrZSBhbiBlbXB0eSBwdXJzZSBvZiB0aGlzXG4gKiBicmFuZC5cbiAqIEBwcm9wZXJ0eSB7SXNzdWVySXNMaXZlfSBpc0xpdmVcbiAqIEBwcm9wZXJ0eSB7SXNzdWVyR2V0QW1vdW50T2Y8Sz59IGdldEFtb3VudE9mXG4gKiBAcHJvcGVydHkge0lzc3VlckJ1cm59IGJ1cm5cbiAqIEBwcm9wZXJ0eSB7SXNzdWVyQ2xhaW19IGNsYWltXG4gKiBAcHJvcGVydHkge0lzc3VlckNvbWJpbmV9IGNvbWJpbmVcbiAqIEBwcm9wZXJ0eSB7SXNzdWVyU3BsaXR9IHNwbGl0XG4gKiBAcHJvcGVydHkge0lzc3VlclNwbGl0TWFueX0gc3BsaXRNYW55XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHR5cGVkZWYge29iamVjdH0gUGF5bWVudExlZGdlclxuICogQHByb3BlcnR5IHtNaW50PEs+fSBtaW50XG4gKiBAcHJvcGVydHkge0lzc3VlcjxLPn0gaXNzdWVyXG4gKiBAcHJvcGVydHkge0JyYW5kPEs+fSBicmFuZFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IElzc3VlcktpdFxuICogQHByb3BlcnR5IHtNaW50PEs+fSBtaW50XG4gKiBAcHJvcGVydHkge0lzc3VlcjxLPn0gaXNzdWVyXG4gKiBAcHJvcGVydHkge0JyYW5kPEs+fSBicmFuZFxuICogQHByb3BlcnR5IHtEaXNwbGF5SW5mb30gZGlzcGxheUluZm9cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEFkZGl0aW9uYWxEaXNwbGF5SW5mb1xuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyPX0gZGVjaW1hbFBsYWNlcyBUZWxscyB0aGUgZGlzcGxheSBzb2Z0d2FyZSBob3dcbiAqICAgbWFueSBkZWNpbWFsIHBsYWNlcyB0byBtb3ZlIHRoZSBkZWNpbWFsIG92ZXIgdG8gdGhlIGxlZnQsIG9yIGluXG4gKiAgIG90aGVyIHdvcmRzLCB3aGljaCBwb3NpdGlvbiBjb3JyZXNwb25kcyB0byB3aG9sZSBudW1iZXJzLiBXZVxuICogICByZXF1aXJlIGZ1bmdpYmxlIGRpZ2l0YWwgYXNzZXRzIHRvIGJlIHJlcHJlc2VudGVkIGluIGludGVnZXJzLCBpblxuICogICB0aGUgc21hbGxlc3QgdW5pdCAoaS5lLiBVU0QgbWlnaHQgYmUgcmVwcmVzZW50ZWQgaW4gbWlsbCwgYVxuICogICB0aG91c2FuZHRoIG9mIGEgZG9sbGFyLiBJbiB0aGF0IGNhc2UsIGBkZWNpbWFsUGxhY2VzYCB3b3VsZCBiZVxuICogICAzLikgVGhpcyBwcm9wZXJ0eSBpcyBvcHRpb25hbCwgYW5kIGZvciBub24tZnVuZ2libGUgZGlnaXRhbFxuICogICBhc3NldHMsIHNob3VsZCBub3QgYmUgc3BlY2lmaWVkLiBUaGUgZGVjaW1hbFBsYWNlcyBwcm9wZXJ0eVxuICogICBzaG91bGQgYmUgdXNlZCBmb3IgKmRpc3BsYXkgcHVycG9zZXMgb25seSouIEFueSBvdGhlciB1c2UgaXMgYW5cbiAqICAgYW50aS1wYXR0ZXJuLlxuICogQHByb3BlcnR5IHtBc3NldEtpbmQ9fSBhc3NldEtpbmRcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBTaHV0ZG93bldpdGhGYWlsdXJlXG4gKiBDYWxsZWQgdG8gc2h1dCBzb21ldGhpbmcgZG93biBiZWNhdXNlIHNvbWV0aGluZyB3ZW50IHdyb25nLCB3aGVyZSB0aGUgcmVhc29uXG4gKiBpcyBzdXBwb3NlZCB0byBiZSBhbiBFcnJvciB0aGF0IGRlc2NyaWJlcyB3aGF0IHdlbnQgd3JvbmcuIFNvbWUgdmFsaWRcbiAqIGltcGxlbWVudGF0aW9ucyBvZiBgU2h1dGRvd25XaXRoRmFpbHVyZWAgd2lsbCBuZXZlciByZXR1cm4sIGVpdGhlclxuICogYmVjYXVzZSB0aGV5IHRocm93IG9yIGJlY2F1c2UgdGhleSBpbW1lZGlhdGVseSBzaHV0ZG93biB0aGUgZW5jbG9zaW5nIHVuaXRcbiAqIG9mIGNvbXB1dGF0aW9uLiBIb3dldmVyLCB0aGV5IGFsc28gbWlnaHQgcmV0dXJuLCBzbyB0aGUgY2FsbGVyIHNob3VsZFxuICogZm9sbG93IHRoaXMgY2FsbCBieSB0aGVpciBvd24gZGVmZW5zaXZlIGB0aHJvdyByZWFzb247YCBpZiBhcHByb3ByaWF0ZS5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSByZWFzb25cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IE1pbnRcbiAqIEhvbGRpbmcgYSBNaW50IGNhcnJpZXMgdGhlIHJpZ2h0IHRvIGlzc3VlIG5ldyBkaWdpdGFsIGFzc2V0cy4gVGhlc2VcbiAqIGFzc2V0cyBhbGwgaGF2ZSB0aGUgc2FtZSBraW5kLCB3aGljaCBpcyBjYWxsZWQgYSBCcmFuZC5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IElzc3VlcjxLPn0gZ2V0SXNzdWVyIEdldHMgdGhlIElzc3VlciBmb3IgdGhpcyBtaW50LlxuICogQHByb3BlcnR5IHsobmV3QW1vdW50OiBBbW91bnQ8Sz4pID0+IFBheW1lbnQ8Sz59IG1pbnRQYXltZW50XG4gKiBDcmVhdGVzIGEgbmV3IFBheW1lbnQgY29udGFpbmluZyBuZXdseSBtaW50ZWQgYW1vdW50LlxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIERlcG9zaXRGYWNldFJlY2VpdmVcbiAqIEBwYXJhbSB7UGF5bWVudH0gcGF5bWVudFxuICogQHBhcmFtIHtQYXR0ZXJuPX0gb3B0QW1vdW50U2hhcGVcbiAqIEByZXR1cm5zIHtBbW91bnR9XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBEZXBvc2l0RmFjZXRcbiAqIEBwcm9wZXJ0eSB7RGVwb3NpdEZhY2V0UmVjZWl2ZX0gcmVjZWl2ZVxuICogRGVwb3NpdCBhbGwgdGhlIGNvbnRlbnRzIG9mIHBheW1lbnQgaW50byB0aGUgcHVyc2UgdGhhdCBtYWRlIHRoaXMgZmFjZXQsXG4gKiByZXR1cm5pbmcgdGhlIGFtb3VudC4gSWYgdGhlIG9wdGlvbmFsIGFyZ3VtZW50IGBvcHRBbW91bnRgIGRvZXMgbm90IGVxdWFsIHRoZVxuICogYW1vdW50IG9mIGRpZ2l0YWwgYXNzZXRzIGluIHRoZSBwYXltZW50LCB0aHJvdyBhbiBlcnJvci5cbiAqXG4gKiBJZiBwYXltZW50IGlzIGEgcHJvbWlzZSwgdGhyb3cgYW4gZXJyb3IuXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgUHVyc2VEZXBvc2l0XG4gKiBAcGFyYW0ge1BheW1lbnR9IHBheW1lbnRcbiAqIEBwYXJhbSB7UGF0dGVybj19IG9wdEFtb3VudFNoYXBlXG4gKiBAcmV0dXJucyB7QW1vdW50fVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFB1cnNlXG4gKiBQdXJzZXMgaG9sZCBhbW91bnQgb2YgZGlnaXRhbCBhc3NldHMgb2YgdGhlIHNhbWUgYnJhbmQsIGJ1dCB1bmxpa2UgUGF5bWVudHMsXG4gKiB0aGV5IGFyZSBub3QgbWVhbnQgdG8gYmUgc2VudCB0byBvdGhlcnMuIFRvIHRyYW5zZmVyIGRpZ2l0YWwgYXNzZXRzLCBhXG4gKiBQYXltZW50IHNob3VsZCBiZSB3aXRoZHJhd24gZnJvbSBhIFB1cnNlLiBUaGUgYW1vdW50IG9mIGRpZ2l0YWxcbiAqIGFzc2V0cyBpbiBhIHB1cnNlIGNhbiBjaGFuZ2UgdGhyb3VnaCB0aGUgYWN0aW9uIG9mIGRlcG9zaXQoKSBhbmQgd2l0aGRyYXcoKS5cbiAqXG4gKiBUaGUgcHJpbWFyeSB1c2UgZm9yIFB1cnNlcyBhbmQgUGF5bWVudHMgaXMgZm9yIGN1cnJlbmN5LWxpa2UgYW5kIGdvb2RzLWxpa2VcbiAqIGRpZ2l0YWwgYXNzZXRzLCBidXQgdGhleSBjYW4gYWxzbyBiZSB1c2VkIHRvIHJlcHJlc2VudCBvdGhlciBraW5kcyBvZiByaWdodHMsXG4gKiBzdWNoIGFzIHRoZSByaWdodCB0byBwYXJ0aWNpcGF0ZSBpbiBhIHBhcnRpY3VsYXIgY29udHJhY3QuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBCcmFuZDxLPn0gZ2V0QWxsZWdlZEJyYW5kIEdldCB0aGUgYWxsZWdlZCBCcmFuZCBmb3IgdGhpcyBQdXJzZVxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gQW1vdW50PEs+fSBnZXRDdXJyZW50QW1vdW50XG4gKiBHZXQgdGhlIGFtb3VudCBjb250YWluZWQgaW4gdGhpcyBwdXJzZS5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IE5vdGlmaWVyPEFtb3VudDxLPj59IGdldEN1cnJlbnRBbW91bnROb3RpZmllclxuICogR2V0IGEgbG9zc3kgbm90aWZpZXIgZm9yIGNoYW5nZXMgdG8gdGhpcyBwdXJzZSdzIGJhbGFuY2UuXG4gKlxuICogQHByb3BlcnR5IHtQdXJzZURlcG9zaXR9IGRlcG9zaXRcbiAqIERlcG9zaXQgYWxsIHRoZSBjb250ZW50cyBvZiBwYXltZW50IGludG8gdGhpcyBwdXJzZSwgcmV0dXJuaW5nIHRoZVxuICogYW1vdW50LiBJZiB0aGUgb3B0aW9uYWwgYXJndW1lbnQgYG9wdEFtb3VudGAgZG9lcyBub3QgZXF1YWwgdGhlXG4gKiBhbW91bnQgb2YgZGlnaXRhbCBhc3NldHMgaW4gdGhlIHBheW1lbnQsIHRocm93IGFuIGVycm9yLlxuICpcbiAqIElmIHBheW1lbnQgaXMgYSBwcm9taXNlLCB0aHJvdyBhbiBlcnJvci5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IERlcG9zaXRGYWNldH0gZ2V0RGVwb3NpdEZhY2V0XG4gKiBSZXR1cm4gYW4gb2JqZWN0IHdob3NlIGByZWNlaXZlYCBtZXRob2QgZGVwb3NpdHMgdG8gdGhlIGN1cnJlbnQgUHVyc2UuXG4gKlxuICogQHByb3BlcnR5IHsoYW1vdW50OiBBbW91bnQ8Sz4pID0+IFBheW1lbnR9IHdpdGhkcmF3XG4gKiBXaXRoZHJhdyBhbW91bnQgZnJvbSB0aGlzIHB1cnNlIGludG8gYSBuZXcgUGF5bWVudC5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IENvcHlTZXQ8UGF5bWVudDxLPj59IGdldFJlY292ZXJ5U2V0XG4gKiBUaGUgc2V0IG9mIHBheW1lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHB1cnNlIHRoYXQgYXJlIHN0aWxsIGxpdmUuIFRoZXNlXG4gKiBhcmUgdGhlIHBheW1lbnRzIHRoYXQgY2FuIHN0aWxsIGJlIHJlY292ZXJlZCBpbiBlbWVyZ2VuY2llcyBieSwgZm9yIGV4YW1wbGUsXG4gKiBkZXBvc2l0aW5nIGludG8gdGhpcyBwdXJzZS4gU3VjaCBhIGRlcG9zaXQgYWN0aW9uIGlzIGxpa2UgY2FuY2VsaW5nIGFuXG4gKiBvdXRzdGFuZGluZyBjaGVjayBiZWNhdXNlIHlvdSdyZSB0aXJlZCBvZiB3YWl0aW5nIGZvciBpdC4gT25jZSB5b3VyXG4gKiBjYW5jZWxsYXRpb24gaXMgYWNrbm93bGVkZ2VkLCB5b3UgY2FuIHNwZW5kIHRoZSBhc3NldHMgYXQgc3Rha2Ugb24gb3RoZXJcbiAqIHRoaW5ncy4gQWZ0ZXJ3YXJkcywgaWYgdGhlIHJlY2lwaWVudCBvZiB0aGUgb3JpZ2luYWwgY2hlY2sgZmluYWxseSBnZXRzXG4gKiBhcm91bmQgdG8gZGVwb3NpdGluZyBpdCwgdGhlaXIgZGVwb3NpdCBmYWlscy5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IEFtb3VudDxLPn0gcmVjb3ZlckFsbFxuICogRm9yIHVzZSBpbiBlbWVyZ2VuY2llcywgc3VjaCBhcyBjb21pbmcgYmFjayBmcm9tIGEgdHJhdW1hdGljIGNyYXNoIGFuZFxuICogdXBncmFkZS4gVGhpcyBkZXBvc2l0cyBhbGwgdGhlIHBheW1lbnRzIGluIHRoaXMgcHVyc2UncyByZWNvdmVyeSBzZXRcbiAqIGludG8gdGhlIHB1cnNlIGl0c2VsZiwgcmV0dXJuaW5nIHRoZSB0b3RhbCBhbW91bnQgb2YgYXNzZXRzIHJlY292ZXJlZC5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQYXltZW50XG4gKiBQYXltZW50cyBob2xkIGFtb3VudCBvZiBkaWdpdGFsIGFzc2V0cyBvZiB0aGUgc2FtZSBicmFuZCBpbiB0cmFuc2l0LiBQYXltZW50c1xuICogY2FuIGJlIGRlcG9zaXRlZCBpbiBwdXJzZXMsIHNwbGl0IGludG8gbXVsdGlwbGUgcGF5bWVudHMsIGNvbWJpbmVkLCBhbmRcbiAqIGNsYWltZWQgKGdldHRpbmcgYW4gZXhjbHVzaXZlIHBheW1lbnQpLiBQYXltZW50cyBhcmUgbGluZWFyLCBtZWFuaW5nXG4gKiB0aGF0IGVpdGhlciBhIHBheW1lbnQgaGFzIHRoZSBzYW1lIGFtb3VudCBvZiBkaWdpdGFsIGFzc2V0cyBpdFxuICogc3RhcnRlZCB3aXRoLCBvciBpdCBpcyB1c2VkIHVwIGVudGlyZWx5LiBJdCBpcyBpbXBvc3NpYmxlIHRvIHBhcnRpYWxseSB1c2UgYVxuICogcGF5bWVudC5cbiAqXG4gKiBQYXltZW50cyBhcmUgb2Z0ZW4gcmVjZWl2ZWQgZnJvbSBvdGhlciBhY3RvcnMgYW5kIHRoZXJlZm9yZSBzaG91bGRcbiAqIG5vdCBiZSB0cnVzdGVkIHRoZW1zZWx2ZXMuIFRvIGdldCB0aGUgYW1vdW50IG9mIGRpZ2l0YWwgYXNzZXRzIGluIGEgcGF5bWVudCxcbiAqIHVzZSB0aGUgdHJ1c3RlZCBpc3N1ZXI6IGlzc3Vlci5nZXRBbW91bnRPZihwYXltZW50KSxcbiAqXG4gKiBQYXltZW50cyBjYW4gYmUgY29udmVydGVkIHRvIFB1cnNlcyBieSBnZXR0aW5nIGEgdHJ1c3RlZCBpc3N1ZXIgYW5kXG4gKiBjYWxsaW5nIGBpc3N1ZXIubWFrZUVtcHR5UHVyc2UoKWAgdG8gY3JlYXRlIGEgcHVyc2UsIHRoZW5cbiAqIGBwdXJzZS5kZXBvc2l0KHBheW1lbnQpYC5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IEJyYW5kPEs+fSBnZXRBbGxlZ2VkQnJhbmRcbiAqIEdldCB0aGUgYWxsZWdlZEJyYW5kLCBpbmRpY2F0aW5nIHRoZSB0eXBlIG9mIGRpZ2l0YWwgYXNzZXQgdGhpc1xuICogcGF5bWVudCBwdXJwb3J0cyB0byBiZSwgYW5kIHdoaWNoIGlzc3VlciB0byB1c2UuIEJlY2F1c2UgcGF5bWVudHNcbiAqIGFyZSBub3QgdHJ1c3RlZCwgYW55IG1ldGhvZCBjYWxscyBvbiBwYXltZW50cyBzaG91bGQgYmUgdHJlYXRlZFxuICogd2l0aCBzdXNwaWNpb24gYW5kIHZlcmlmaWVkIGVsc2V3aGVyZS5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QW1vdW50VmFsdWV9IFZcbiAqIEB0eXBlZGVmIHtvYmplY3R9IE1hdGhIZWxwZXJzXG4gKiBBbGwgb2YgdGhlIGRpZmZlcmVuY2UgaW4gaG93IGRpZ2l0YWwgYXNzZXQgYW1vdW50IGFyZSBtYW5pcHVsYXRlZCBjYW4gYmVcbiAqIHJlZHVjZWQgdG8gdGhlIGJlaGF2aW9yIG9mIHRoZSBtYXRoIG9uIHZhbHVlcy4gV2UgZXh0cmFjdCB0aGlzXG4gKiBjdXN0b20gbG9naWMgaW50byBtYXRoSGVscGVycy4gTWF0aEhlbHBlcnMgYXJlIGFib3V0IHZhbHVlXG4gKiBhcml0aG1ldGljLCB3aGVyZWFzIEFtb3VudE1hdGggaXMgYWJvdXQgYW1vdW50cywgd2hpY2ggYXJlIHRoZVxuICogdmFsdWVzIGxhYmVsZWQgd2l0aCBhIGJyYW5kLiBBbW91bnRNYXRoIHVzZSBtYXRoSGVscGVycyB0byBkbyB0aGVpciB2YWx1ZVxuICogYXJpdGhtZXRpYywgYW5kIHRoZW4gYnJhbmQgdGhlIHJlc3VsdHMsIG1ha2luZyBhIG5ldyBhbW91bnQuXG4gKlxuICogVGhlIE1hdGhIZWxwZXJzIGFyZSBkZXNpZ25lZCB0byBiZSBjYWxsZWQgb25seSBmcm9tIEFtb3VudE1hdGgsIGFuZCBzb1xuICogYWxsIG1ldGhvZHMgYnV0IGNvZXJjZSBjYW4gYXNzdW1lIHRoZWlyIGlucHV0cyBhcmUgdmFsaWQuIFRoZXkgb25seVxuICogbmVlZCB0byBkbyBvdXRwdXQgdmFsaWRhdGlvbiwgYW5kIG9ubHkgd2hlbiB0aGVyZSBpcyBhIHBvc3NpYmlsaXR5IG9mXG4gKiBpbnZhbGlkIG91dHB1dC5cbiAqXG4gKiBAcHJvcGVydHkgeyhhbGxlZ2VkVmFsdWU6IFYpID0+IFZ9IGRvQ29lcmNlXG4gKiBDaGVjayB0aGUga2luZCBvZiB0aGlzIHZhbHVlIGFuZCB0aHJvdyBpZiBpdCBpcyBub3QgdGhlXG4gKiBleHBlY3RlZCBraW5kLlxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gVn0gZG9NYWtlRW1wdHlcbiAqIEdldCB0aGUgcmVwcmVzZW50YXRpb24gZm9yIHRoZSBpZGVudGl0eSBlbGVtZW50IChvZnRlbiAwIG9yIGFuXG4gKiBlbXB0eSBhcnJheSlcbiAqXG4gKiBAcHJvcGVydHkgeyh2YWx1ZTogVikgPT4gYm9vbGVhbn0gZG9Jc0VtcHR5XG4gKiBJcyB0aGUgdmFsdWUgdGhlIGlkZW50aXR5IGVsZW1lbnQ/XG4gKlxuICogQHByb3BlcnR5IHsobGVmdDogViwgcmlnaHQ6IFYpID0+IGJvb2xlYW59IGRvSXNHVEVcbiAqIElzIHRoZSBsZWZ0IGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgcmlnaHQ/XG4gKlxuICogQHByb3BlcnR5IHsobGVmdDogViwgcmlnaHQ6IFYpID0+IGJvb2xlYW59IGRvSXNFcXVhbFxuICogRG9lcyBsZWZ0IGVxdWFsIHJpZ2h0P1xuICpcbiAqIEBwcm9wZXJ0eSB7KGxlZnQ6IFYsIHJpZ2h0OiBWKSA9PiBWfSBkb0FkZFxuICogUmV0dXJuIHRoZSBsZWZ0IGNvbWJpbmVkIHdpdGggdGhlIHJpZ2h0LlxuICpcbiAqIEBwcm9wZXJ0eSB7KGxlZnQ6IFYsIHJpZ2h0OiBWKSA9PiBWfSBkb1N1YnRyYWN0XG4gKiBSZXR1cm4gd2hhdCByZW1haW5zIGFmdGVyIHJlbW92aW5nIHRoZSByaWdodCBmcm9tIHRoZSBsZWZ0LiBJZlxuICogc29tZXRoaW5nIGluIHRoZSByaWdodCB3YXMgbm90IGluIHRoZSBsZWZ0LCB3ZSB0aHJvdyBhbiBlcnJvci5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtiaWdpbnR9IE5hdFZhbHVlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7TWF0aEhlbHBlcnM8TmF0VmFsdWU+fSBOYXRNYXRoSGVscGVyc1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge0FycmF5PEtleT59IFNldFZhbHVlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7TWF0aEhlbHBlcnM8U2V0VmFsdWU+fSBTZXRNYXRoSGVscGVyc1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge0NvcHlTZXQ8S2V5Pn0gQ29weVNldFZhbHVlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7TWF0aEhlbHBlcnM8Q29weVNldFZhbHVlPn0gQ29weVNldE1hdGhIZWxwZXJzXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7Q29weUJhZzxLZXk+fSBDb3B5QmFnVmFsdWVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtNYXRoSGVscGVyczxDb3B5QmFnVmFsdWU+fSBDb3B5QmFnTWF0aEhlbHBlcnNcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRBc3NldEtpbmRcbiAqIEBwYXJhbSB7QXNzZXRLaW5kfSBhbGxlZ2VkQUtcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGrUljWgIAAAoCAAADIAAABAYWdvcmljL2dvdmVybmFuY2UtdjAuOS4zL3NyYy9iaW5hcnlWb3RlQ291bnRlci5qc3siaW1wb3J0cyI6WyIuL2Nsb3NpbmdSdWxlLmpzIiwiLi9xdWVzdGlvbi5qcyIsIi4vdHlwZUd1YXJkcy5qcyIsIkBhZ29yaWMvc3RvcmUiLCJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL3Byb21pc2Uta2l0Il0sImV4cG9ydHMiOlsibWFrZUJpbmFyeVZvdGVDb3VudGVyIiwic3RhcnQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRmFyLG1ha2VQcm9taXNlS2l0LG1ha2VIZWFwRmFySW5zdGFuY2Usa2V5RVEsbWFrZVN0b3JlLEUsYnVpbGRVbnJhbmtlZFF1ZXN0aW9uLENob2ljZU1ldGhvZCxjb2VyY2VRdWVzdGlvblNwZWMscG9zaXRpb25JbmNsdWRlZCxzY2hlZHVsZUNsb3NlLEJpbmFyeVZvdGVDb3VudGVyQWRtaW5JLEJpbmFyeVZvdGVDb3VudGVyQ2xvc2VJLEJpbmFyeVZvdGVDb3VudGVyUHVibGljSTskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wibWFrZVByb21pc2VLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VQcm9taXNlS2l0ID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIm1ha2VIZWFwRmFySW5zdGFuY2VcIiwgWyRo4oCNX2EgPT4gKG1ha2VIZWFwRmFySW5zdGFuY2UgPSAkaOKAjV9hKV1dLFtcImtleUVRXCIsIFskaOKAjV9hID0+IChrZXlFUSA9ICRo4oCNX2EpXV0sW1wibWFrZVN0b3JlXCIsIFskaOKAjV9hID0+IChtYWtlU3RvcmUgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXSxbXCIuL3F1ZXN0aW9uLmpzXCIsIFtbXCJidWlsZFVucmFua2VkUXVlc3Rpb25cIiwgWyRo4oCNX2EgPT4gKGJ1aWxkVW5yYW5rZWRRdWVzdGlvbiA9ICRo4oCNX2EpXV0sW1wiQ2hvaWNlTWV0aG9kXCIsIFskaOKAjV9hID0+IChDaG9pY2VNZXRob2QgPSAkaOKAjV9hKV1dLFtcImNvZXJjZVF1ZXN0aW9uU3BlY1wiLCBbJGjigI1fYSA9PiAoY29lcmNlUXVlc3Rpb25TcGVjID0gJGjigI1fYSldXSxbXCJwb3NpdGlvbkluY2x1ZGVkXCIsIFskaOKAjV9hID0+IChwb3NpdGlvbkluY2x1ZGVkID0gJGjigI1fYSldXV1dLFtcIi4vY2xvc2luZ1J1bGUuanNcIiwgW1tcInNjaGVkdWxlQ2xvc2VcIiwgWyRo4oCNX2EgPT4gKHNjaGVkdWxlQ2xvc2UgPSAkaOKAjV9hKV1dXV0sW1wiLi90eXBlR3VhcmRzLmpzXCIsIFtbXCJCaW5hcnlWb3RlQ291bnRlckFkbWluSVwiLCBbJGjigI1fYSA9PiAoQmluYXJ5Vm90ZUNvdW50ZXJBZG1pbkkgPSAkaOKAjV9hKV1dLFtcIkJpbmFyeVZvdGVDb3VudGVyQ2xvc2VJXCIsIFskaOKAjV9hID0+IChCaW5hcnlWb3RlQ291bnRlckNsb3NlSSA9ICRo4oCNX2EpXV0sW1wiQmluYXJ5Vm90ZUNvdW50ZXJQdWJsaWNJXCIsIFskaOKAjV9hID0+IChCaW5hcnlWb3RlQ291bnRlclB1YmxpY0kgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3R7ZGV0YWlsczpYfT1hc3NlcnQ7XG5cbmNvbnN0IG1ha2VRdW9ydW1Db3VudGVyPShxdW9ydW1UaHJlc2hvbGQpPT57XG5jb25zdCBjaGVjaz0oc3RhdHMpPT57XG5jb25zdCB2b3Rlcz1zdGF0cy5yZXN1bHRzLnJlZHVjZShcbihydW5uaW5nVG90YWwse3RvdGFsfSk9PnJ1bm5pbmdUb3RhbCt0b3RhbCxcbjBuKTtcblxucmV0dXJuIHZvdGVzPj1xdW9ydW1UaHJlc2hvbGQ7XG4gfTtcbi8qKiBAdHlwZSB7UXVvcnVtQ291bnRlcn0gKi9cbnJldHVybiBGYXIoJ2NoZWNrZXInLHtjaGVja30pO1xuIH07XG5cbmNvbnN0IHZhbGlkYXRlQmluYXJ5UXVlc3Rpb25TcGVjPShxdWVzdGlvblNwZWMpPT57XG5jb2VyY2VRdWVzdGlvblNwZWMocXVlc3Rpb25TcGVjKTtcblxuY29uc3QgcG9zaXRpb25zPXF1ZXN0aW9uU3BlYy5wb3NpdGlvbnM7XG5wb3NpdGlvbnMubGVuZ3RoPT09Mnx8XG5hc3NlcnQuZmFpbChcblggYEJpbmFyeSBxdWVzdGlvbnMgbXVzdCBoYXZlIGV4YWN0bHkgdHdvIHBvc2l0aW9ucy4gaGFkICR7cG9zaXRpb25zLmxlbmd0aH06ICR7cG9zaXRpb25zfWApO1xuXG5xdWVzdGlvblNwZWMubWF4Q2hvaWNlcz09PTF8fFxuYXNzZXJ0LmZhaWwoWCBgQ2FuIG9ubHkgY2hvb3NlIDEgaXRlbSBvbiBhIGJpbmFyeSBxdWVzdGlvbmApO1xucXVlc3Rpb25TcGVjLm1ldGhvZD09PUNob2ljZU1ldGhvZC5VTlJBTktFRHx8XG5hc3NlcnQuZmFpbChYIGAke3F1ZXN0aW9uU3BlYy5tZXRob2R9IG11c3QgYmUgVU5SQU5LRURgKTtcbi8qIFdlIGRvbid0IGNoZWNrIHRoZSBxdW9ydW1SdWxlIG9yIHF1b3J1bVRocmVzaG9sZCBoZXJlLiBUaGUgcXVvcnVtVGhyZXNob2xkKi9cbi8qIGlzIHByb3ZpZGVkIGJ5IHRoZSBFbGVjdG9yYXRlIHRoYXQgY3JlYXRlcyB0aGlzIHZvdGVDb3VudGVyLCBzaW5jZSBvbmx5IGl0Ki9cbi8qIGNhbiB0cmFuc2xhdGUgdGhlIHF1b3J1bVJ1bGUgdG8gYSByZXF1aXJlZCBudW1iZXIgb2Ygdm90ZXMuKi9cbiB9O1xuXG4vKiBOb3RpY2UgdGhhdCBCaW5hcnlWb3RlQ291bnRlciBpcyBkZXNpZ25lZCB0byBydW4gYXMgYSBab2UgY29udHJhY3QuIFRoZSovXG4vKiBidXNpbmVzcyBwYXJ0IG9mIHRoZSBjb250cmFjdCBpcyBleHRyYWN0ZWQgaGVyZSBzbyBpdCBjYW4gYmUgdGVzdGVkKi9cbi8qIGluZGVwZW5kZW50bHkuIFRoZSBzdGFuZGFyZCBab2Ugc3RhcnQgZnVuY3Rpb24gaXMgYXQgdGhlIGJvdHRvbSBvZiB0aGlzIGZpbGUuKi9cblxuLyoqIEB0eXBlIHtCdWlsZFZvdGVDb3VudGVyfSAqL1xuY29uc3QgbWFrZUJpbmFyeVZvdGVDb3VudGVyPShcbnF1ZXN0aW9uU3BlYyxcbnRocmVzaG9sZCxcbmluc3RhbmNlLFxucHVibGlzaGVyKT0+XG57XG52YWxpZGF0ZUJpbmFyeVF1ZXN0aW9uU3BlYyhxdWVzdGlvblNwZWMpO1xuXG5jb25zdCBxdWVzdGlvbj1idWlsZFVucmFua2VkUXVlc3Rpb24ocXVlc3Rpb25TcGVjLGluc3RhbmNlKTtcbmNvbnN0IGRldGFpbHM9cXVlc3Rpb24uZ2V0RGV0YWlscygpO1xuXG5sZXQgaXNPcGVuPXRydWU7XG5jb25zdCBwb3NpdGlvbnM9cXVlc3Rpb25TcGVjLnBvc2l0aW9ucztcbi8qKiBAdHlwZSB7IFByb21pc2VSZWNvcmQ8UG9zaXRpb24+IH0gKi9cbmNvbnN0IG91dGNvbWVQcm9taXNlPW1ha2VQcm9taXNlS2l0KCk7XG4vKiogQHR5cGUgeyBQcm9taXNlUmVjb3JkPFZvdGVTdGF0aXN0aWNzPiB9ICovXG5jb25zdCB0YWxseVByb21pc2U9bWFrZVByb21pc2VLaXQoKTtcbi8qIFRoZSBFbGVjdG9yYXRlIGlzIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyBhIHVuaXF1ZSBzZWF0IGZvciBlYWNoIHZvdGVyLiovXG4vKiBUaGlzIHZvdGVDb3VudGVyIGFsbG93cyB2b3RlcnMgdG8gcmUtdm90ZSwgYW5kIHJlcGxhY2VzIHRoZWlyIHByZXZpb3VzKi9cbi8qIGNob2ljZSB3aXRoIHRoZSBuZXcgc2VsZWN0aW9uLiovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUmVjb3JkZWRCYWxsb3RcbiAqIEBwcm9wZXJ0eSB7UG9zaXRpb259IGNob3NlblxuICogQHByb3BlcnR5IHtiaWdpbnR9IHNoYXJlc1xuICovXG4vKiogQHR5cGUge1N0b3JlPEhhbmRsZTwnVm90ZXInPixSZWNvcmRlZEJhbGxvdD4gfSAqL1xuY29uc3QgYWxsQmFsbG90cz1tYWtlU3RvcmUoJ3ZvdGVySGFuZGxlJyk7XG5cbmNvbnN0IGNvdW50Vm90ZXM9KCk9PntcbmFzc2VydCghaXNPcGVuLFggYGNhbid0IGNvdW50IHZvdGVzIHdoaWxlIHRoZSBlbGVjdGlvbiBpcyBvcGVuYCk7XG5cbi8qIHF1ZXN0aW9uIGhhcyBwb3NpdGlvbiBjaG9pY2VzOyBFYWNoIGJhbGxvdCBpbiBhbGxCYWxsb3RzIHNob3VsZCovXG4vKiBtYXRjaC4gY291bnQgdGhlIHZhbGlkIGJhbGxvdHMgYW5kIHJlcG9ydCByZXN1bHRzLiovXG5sZXQgc3BvaWxlZD0wbjtcbmNvbnN0IHRhbGx5PVswbiwwbl07XG5cbmZvcihjb25zdHtjaG9zZW4sc2hhcmVzfW9mIGFsbEJhbGxvdHMudmFsdWVzKCkpe1xuY29uc3QgY2hvaWNlPXBvc2l0aW9ucy5maW5kSW5kZXgoKHApPT5rZXlFUShwLGNob3NlbikpO1xuaWYoY2hvaWNlPDApe1xuc3BvaWxlZCs9c2hhcmVzO1xuIH1lbHNle1xudGFsbHlbY2hvaWNlXSs9c2hhcmVzO1xuIH1cbiB9XG5cbi8qKiBAdHlwZSB7IFZvdGVTdGF0aXN0aWNzIH0gKi9cbmNvbnN0IHN0YXRzPXtcbnNwb2lsZWQsXG52b3RlczphbGxCYWxsb3RzLmdldFNpemUoKSxcbnJlc3VsdHM6W1xue3Bvc2l0aW9uOnBvc2l0aW9uc1swXSx0b3RhbDp0YWxseVswXX0sXG57cG9zaXRpb246cG9zaXRpb25zWzFdLHRvdGFsOnRhbGx5WzFdfV19O1xuXG5cblxuLyogQ1JVQ0lBTDogY291bnRWb3RlcyBvbmx5IGdldHMgY2FsbGVkIG9uY2UgZm9yIGVhY2ggcXVlc3Rpb24uIFdlIHdhbnQgdG8qL1xuLyogZW5zdXJlIHRoYXQgdGFsbHlQcm9taXNlIGFuZCBvdXRjb21lUHJvbWlzZSBhbHdheXMgZ2V0IHJlc29sdmVkLiBUaGUqL1xuLyogdGFsbHkgZ2V0cyB0aGUgcmVzdWx0cyByZWdhcmRsZXNzIG9mIHRoZSBvdXRjb21lLiBvdXRjb21lUHJvbWlzZSBnZXRzIGEqL1xuLyogZGlmZmVyZW50IHJlc29sdXRpb24gZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlcmUgd2FzIG5vIHF1b3J1bSB0byBtYWtlIGEqL1xuLyogZGVjaXNpb24sIG9yIHRoZSBvdXRjb21lIGlzIGJhc2VkIG9uIGEgbWFqb3JpdHkgZWl0aGVyIHdheSwgb3IgYSB0aWUuKi9cbnRhbGx5UHJvbWlzZS5yZXNvbHZlKHN0YXRzKTtcblxuaWYoIW1ha2VRdW9ydW1Db3VudGVyKHRocmVzaG9sZCkuY2hlY2soc3RhdHMpKXtcbm91dGNvbWVQcm9taXNlLnJlamVjdCgnTm8gcXVvcnVtJyk7XG4vKiogQHR5cGUge091dGNvbWVSZWNvcmR9ICovXG5jb25zdCB2b3RlT3V0Y29tZT17XG5xdWVzdGlvbjpkZXRhaWxzLnF1ZXN0aW9uSGFuZGxlLFxub3V0Y29tZTonZmFpbCcsXG5yZWFzb246J05vIHF1b3J1bSd9O1xuXG5FKHB1Ymxpc2hlcikucHVibGlzaCh2b3RlT3V0Y29tZSk7XG5yZXR1cm47XG4gfVxuXG5pZih0YWxseVswXT50YWxseVsxXSl7XG5vdXRjb21lUHJvbWlzZS5yZXNvbHZlKHBvc2l0aW9uc1swXSk7XG4gfWVsc2UgaWYodGFsbHlbMV0+dGFsbHlbMF0pe1xub3V0Y29tZVByb21pc2UucmVzb2x2ZShwb3NpdGlvbnNbMV0pO1xuIH1lbHNle1xub3V0Y29tZVByb21pc2UucmVzb2x2ZShxdWVzdGlvblNwZWMudGllT3V0Y29tZSk7XG4gfVxuXG4vKiBYWFggaWYgd2Ugc2hvdWxkIGRpc3Rpbmd1aXNoIHRpZXMsIHB1Ymxpc2ggc2hvdWxkIGJlIGNhbGxlZCBpbiBpZiBhYm92ZSovXG5FLndoZW4ob3V0Y29tZVByb21pc2UucHJvbWlzZSwocG9zaXRpb24pPT57XG4vKiogQHR5cGUge091dGNvbWVSZWNvcmR9ICovXG5jb25zdCB2b3RlT3V0Y29tZT17XG5xdWVzdGlvbjpkZXRhaWxzLnF1ZXN0aW9uSGFuZGxlLFxucG9zaXRpb24sXG5vdXRjb21lOid3aW4nfTtcblxucmV0dXJuIEUocHVibGlzaGVyKS5wdWJsaXNoKHZvdGVPdXRjb21lKTtcbiB9KTtcbiB9O1xuXG5jb25zdCBjbG9zZUZhY2V0PW1ha2VIZWFwRmFySW5zdGFuY2UoXG4nQmluYXJ5Vm90ZUNvdW50ZXIgY2xvc2UnLFxuQmluYXJ5Vm90ZUNvdW50ZXJDbG9zZUksXG57XG5jbG9zZVZvdGluZygpe1xuaXNPcGVuPWZhbHNlO1xuY291bnRWb3RlcygpO1xuIH19KTtcblxuXG5cbmNvbnN0IGNyZWF0b3JGYWNldD1tYWtlSGVhcEZhckluc3RhbmNlKFxuJ0JpbmFyeVZvdGVDb3VudGVyIGNyZWF0b3InLFxuQmluYXJ5Vm90ZUNvdW50ZXJBZG1pbkksXG57XG5zdWJtaXRWb3RlKHZvdGVySGFuZGxlLGNob3NlblBvc2l0aW9ucyxzaGFyZXM9MW4pe1xuYXNzZXJ0KGNob3NlblBvc2l0aW9ucy5sZW5ndGg9PT0xLCdvbmx5IDEgcG9zaXRpb24gYWxsb3dlZCcpO1xuY29uc3RbcG9zaXRpb25dPWNob3NlblBvc2l0aW9ucztcbnBvc2l0aW9uSW5jbHVkZWQocG9zaXRpb25zLHBvc2l0aW9uKXx8XG5hc3NlcnQuZmFpbChcblggYFRoZSBzcGVjaWZpZWQgY2hvaWNlIGlzIG5vdCBhIGxlZ2FsIHBvc2l0aW9uOiAke3Bvc2l0aW9ufS5gKTtcblxuXG4vKiBDUlVDSUFMOiBJZiB0aGUgdm90ZXIgY2FzdCBhIHZhbGlkIGJhbGxvdCwgd2UnbGwgcmVjb3JkIGl0LCBidXQgd2UgbmVlZCovXG4vKiB0byBtYWtlIHN1cmUgdGhhdCBlYWNoIHZvdGVyJ3Mgdm90ZSBpcyByZWNvcmRlZCBvbmx5IG9uY2UuKi9cbmNvbnN0IGNvbXBsZXRlZEJhbGxvdD1oYXJkZW4oe2Nob3Nlbjpwb3NpdGlvbixzaGFyZXN9KTtcbmFsbEJhbGxvdHMuaGFzKHZvdGVySGFuZGxlKT9cbmFsbEJhbGxvdHMuc2V0KHZvdGVySGFuZGxlLGNvbXBsZXRlZEJhbGxvdCk6XG5hbGxCYWxsb3RzLmluaXQodm90ZXJIYW5kbGUsY29tcGxldGVkQmFsbG90KTtcbnJldHVybiBjb21wbGV0ZWRCYWxsb3Q7XG4gfX0pO1xuXG5cblxuY29uc3QgcHVibGljRmFjZXQ9bWFrZUhlYXBGYXJJbnN0YW5jZShcbidCaW5hcnlWb3RlQ291bnRlciBwdWJsaWMnLFxuQmluYXJ5Vm90ZUNvdW50ZXJQdWJsaWNJLFxue1xuZ2V0UXVlc3Rpb24oKXtcbnJldHVybiBxdWVzdGlvbjtcbiB9LFxuaXNPcGVuKCl7XG5yZXR1cm4gaXNPcGVuO1xuIH0sXG5nZXRPdXRjb21lKCl7XG5yZXR1cm4gb3V0Y29tZVByb21pc2UucHJvbWlzZTtcbiB9LFxuZ2V0U3RhdHMoKXtcbnJldHVybiB0YWxseVByb21pc2UucHJvbWlzZTtcbiB9LFxuZ2V0RGV0YWlscygpe1xucmV0dXJuIGRldGFpbHM7XG4gfSxcbmdldEluc3RhbmNlKCl7XG5yZXR1cm4gaW5zdGFuY2U7XG4gfX0pO1xuXG5cblxucmV0dXJuIGhhcmRlbih7XG5jcmVhdG9yRmFjZXQsXG5wdWJsaWNGYWNldCxcbmNsb3NlRmFjZXR9KTtcblxuIH07XG5cbi8qIFRoZSBjb250cmFjdCB3cmFwcGVyIGV4dHJhY3RzIHRoZSB0ZXJtcyBhbmQgcnVucyBtYWtlQmluYXJ5Vm90ZUNvdW50ZXIoKS4qL1xuLyogSXQgc2NoZWR1bGVzIHRoZSBjbG9zaW5nIG9mIHRoZSB2b3RlLCBmaW5hbGx5IGluc2VydGluZyB0aGUgY29udHJhY3QqL1xuLyogaW5zdGFuY2UgaW4gdGhlIHB1YmxpY0ZhY2V0IGJlZm9yZSByZXR1cm5pbmcgcHVibGljIGFuZCBjcmVhdG9yIGZhY2V0cy4qL1xuXG4vKipcbiAqIEBwYXJhbSB7WkNGPHtxdWVzdGlvblNwZWM6IFF1ZXN0aW9uU3BlYywgcXVvcnVtVGhyZXNob2xkOiBiaWdpbnR9Pn0gemNmXG4gKiBAcGFyYW0ge3tvdXRjb21lUHVibGlzaGVyOiBQdWJsaXNoZXI8T3V0Y29tZVJlY29yZD59fSBvdXRjb21lUHVibGlzaGVyXG4gKi8kaOKAjV9vbmNlLm1ha2VCaW5hcnlWb3RlQ291bnRlcihtYWtlQmluYXJ5Vm90ZUNvdW50ZXIpO1xuY29uc3Qgc3RhcnQ9KHpjZix7b3V0Y29tZVB1Ymxpc2hlcn0pPT57XG4vKiBUaGVyZSBhcmUgYSB2YXJpZXR5IG9mIHdheXMgb2YgY291bnRpbmcgcXVvcnVtcy4gVGhlIHBhcmFtZXRlcnMgbXVzdCBiZSovXG4vKiB2aXNpYmxlIGluIHRoZSB0ZXJtcy4gV2UncmUgZG9pbmcgYSBzaW1wbGUgdGhyZXNob2xkIGhlcmUuIElmIHdlIHdhbnRlZCB0byovXG4vKiBkaXNjb3VudCBhYnN0ZW50aW9ucywgd2UgY291bGQgcmVmYWN0b3IgdG8gcHJvdmlkZSB0aGUgcXVvcnVtQ291bnRlciBhcyBhKi9cbi8qIGNvbXBvbmVudC4qL1xuLyogVE9ETyhoaWJiZXJ0KSBjaGVja2luZyB0aGUgcXVvcnVtIHNob3VsZCBiZSBwbHVnZ2FibGUgYW5kIGxlZ2libGUuKi9cbmNvbnN0e3F1ZXN0aW9uU3BlYyxxdW9ydW1UaHJlc2hvbGR9PXpjZi5nZXRUZXJtcygpO1xuLyogVGhlIGNsb3NlRmFjZXQgaXMgZXhwb3NlZCBmb3IgdGVzdGluZywgYnV0IGRvZXNuJ3QgZXNjYXBlIGZyb20gYSBjb250cmFjdCovXG5jb25zdHtwdWJsaWNGYWNldCxjcmVhdG9yRmFjZXQsY2xvc2VGYWNldH09bWFrZUJpbmFyeVZvdGVDb3VudGVyKFxucXVlc3Rpb25TcGVjLFxucXVvcnVtVGhyZXNob2xkLFxuemNmLmdldEluc3RhbmNlKCksXG5vdXRjb21lUHVibGlzaGVyKTtcblxuXG5zY2hlZHVsZUNsb3NlKHF1ZXN0aW9uU3BlYy5jbG9zaW5nUnVsZSwoKT0+Y2xvc2VGYWNldC5jbG9zZVZvdGluZygpKTtcblxucmV0dXJue3B1YmxpY0ZhY2V0LGNyZWF0b3JGYWNldH07XG4gfTskaOKAjV9vbmNlLnN0YXJ0KHN0YXJ0KTtcblxuaGFyZGVuKHN0YXJ0KTtcbmhhcmRlbihtYWtlQmluYXJ5Vm90ZUNvdW50ZXIpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VCaW5hcnlWb3RlQ291bnRlciI6WyJtYWtlQmluYXJ5Vm90ZUNvdW50ZXIiXSwic3RhcnQiOlsic3RhcnQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAnYlGVAgDAAAIAwAALAAAAEBhZ29yaWMvZ292ZXJuYW5jZS12MC45LjMvc3JjL2Nsb3NpbmdSdWxlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsic2NoZWR1bGVDbG9zZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBFLEZhcjskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlIHtDbG9zZVZvdGluZ30gKi9cbmNvbnN0ICAgICAgICBzY2hlZHVsZUNsb3NlPShjbG9zaW5nUnVsZSxjbG9zZVZvdGluZyk9PntcbmNvbnN0e3RpbWVyLGRlYWRsaW5lfT1jbG9zaW5nUnVsZTtcbnZvaWQgRSh0aW1lcikuc2V0V2FrZXVwKFxuZGVhZGxpbmUsXG5GYXIoJ2Nsb3NlIHZvdGluZycse1xud2FrZTpjbG9zZVZvdGluZ30pKTtcblxuXG4gfTskaOKAjV9vbmNlLnNjaGVkdWxlQ2xvc2Uoc2NoZWR1bGVDbG9zZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsic2NoZWR1bGVDbG9zZSI6WyJzY2hlZHVsZUNsb3NlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHwEHBSoAwAAqAMAACoAAABAYWdvcmljL2dvdmVybmFuY2UtdjAuOS4zL3NyYy9jb25zdGFudHMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIlBhcmFtVHlwZXMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKipcbiAqIEVudW0gb2YgcGFyYW1ldGVyIHR5cGVzXG4gKlxuICogVU5LTk9XTiBpcyBhbiBlc2NhcGUgaGF0Y2ggZm9yIHR5cGVzIHdlIGhhdmVuJ3QgYWRkZWQgeWV0LiBJZiB5b3UgYXJlXG4gKiBkZXZlbG9waW5nIGEgbmV3IGNvbnRyYWN0IGFuZCB1c2UgVU5LTk9XTiwgcGxlYXNlIGFsc28gZmlsZSBhbiBpc3N1ZSB0byBhc2tcbiAqIHVzIHRvIHN1cHBvcnQgdGhlIG5ldyB0eXBlLlxuICovXG5jb25zdCAgICAgICAgUGFyYW1UeXBlcz0vKiogQHR5cGUge2NvbnN0fSAqL3tcbkFNT1VOVDonYW1vdW50JyxcbkJSQU5EOidicmFuZCcsXG5JTlNUQUxMQVRJT046J2luc3RhbGxhdGlvbicsXG5JTlNUQU5DRTonaW5zdGFuY2UnLFxuSU5WSVRBVElPTjonaW52aXRhdGlvbicsXG5OQVQ6J25hdCcsXG5SQVRJTzoncmF0aW8nLFxuU1RSSU5HOidzdHJpbmcnLFxuUEFTU0FCTEVfUkVDT1JEOidyZWNvcmQnLFxuVU5LTk9XTjondW5rbm93bid9OyRo4oCNX29uY2UuUGFyYW1UeXBlcyhQYXJhbVR5cGVzKTtcblxuXG5oYXJkZW4oUGFyYW1UeXBlcyk7XG4vKiogQHR5cGVkZWYge3R5cGVvZiBQYXJhbVR5cGVzW2tleW9mIHR5cGVvZiBQYXJhbVR5cGVzXX0gUGFyYW1UeXBlICovXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiUGFyYW1UeXBlcyI6WyJQYXJhbVR5cGVzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAN+qMXoZCQAAGQkAAD4AAABAYWdvcmljL2dvdmVybmFuY2UtdjAuOS4zL3NyYy9jb250cmFjdEdvdmVybmFuY2UvYXNzZXJ0aW9ucy5qc3siaW1wb3J0cyI6WyJAYWdvcmljL3pvZS9zcmMvY29udHJhY3RTdXBwb3J0L3JhdGlvLmpzIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbIm1ha2VBc3NlcnRCcmFuZGVkUmF0aW8iLCJtYWtlQXNzZXJ0SW5zdGFsbGF0aW9uIiwibWFrZUFzc2VydEluc3RhbmNlIiwibWFrZUxvb2tzTGlrZUJyYW5kIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGlzUmVtb3RhYmxlLGFzc2VydElzUmF0aW87JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiaXNSZW1vdGFibGVcIiwgWyRo4oCNX2EgPT4gKGlzUmVtb3RhYmxlID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvem9lL3NyYy9jb250cmFjdFN1cHBvcnQvcmF0aW8uanNcIiwgW1tcImFzc2VydElzUmF0aW9cIiwgWyRo4oCNX2EgPT4gKGFzc2VydElzUmF0aW8gPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuY29uc3R7ZGV0YWlsczpYfT1hc3NlcnQ7XG5cbmNvbnN0IG1ha2VMb29rc0xpa2VCcmFuZD0obmFtZSk9Pntcbi8qKiBAcGFyYW0ge0JyYW5kfSBicmFuZCAqL1xucmV0dXJuKGJyYW5kKT0+e1xuaXNSZW1vdGFibGUoYnJhbmQpfHxcbmFzc2VydC5mYWlsKFggYHZhbHVlIGZvciAke25hbWV9IG11c3QgYmUgYSBicmFuZCwgd2FzICR7YnJhbmR9YCk7XG4gfTtcbiB9OyRo4oCNX29uY2UubWFrZUxvb2tzTGlrZUJyYW5kKG1ha2VMb29rc0xpa2VCcmFuZCk7XG5oYXJkZW4obWFrZUxvb2tzTGlrZUJyYW5kKTtcblxuY29uc3QgbWFrZUFzc2VydEluc3RhbGxhdGlvbj0obmFtZSk9PntcbnJldHVybihpbnN0YWxsYXRpb24pPT57XG4vKiBUT0RPKDMzNDQpOiBhZGQgYSBiZXR0ZXIgYXNzZXJ0aW9uIG9uY2UgWm9lIHZhbGlkYXRlcyBpbnN0YWxsYXRpb25zKi9cbnR5cGVvZiBpbnN0YWxsYXRpb249PT0nb2JqZWN0J3x8XG5hc3NlcnQuZmFpbChcblggYHZhbHVlIGZvciAke25hbWV9IG11c3QgYmUgYW4gSW5zdGFsbGF0aW9uLCB3YXMgJHtpbnN0YWxsYXRpb259YCk7XG5cbiB9O1xuIH07JGjigI1fb25jZS5tYWtlQXNzZXJ0SW5zdGFsbGF0aW9uKG1ha2VBc3NlcnRJbnN0YWxsYXRpb24pO1xuaGFyZGVuKG1ha2VBc3NlcnRJbnN0YWxsYXRpb24pO1xuXG5jb25zdCBtYWtlQXNzZXJ0SW5zdGFuY2U9KG5hbWUpPT57XG5yZXR1cm4oaW5zdGFuY2UpPT57XG4vKiBUT0RPKDMzNDQpOiBhZGQgYSBiZXR0ZXIgYXNzZXJ0aW9uIG9uY2UgWm9lIHZhbGlkYXRlcyBpbnN0YW5jZXMqL1xudHlwZW9mIGluc3RhbmNlPT09J29iamVjdCd8fFxuYXNzZXJ0LmZhaWwoWCBgdmFsdWUgZm9yICR7bmFtZX0gbXVzdCBiZSBhbiBJbnN0YW5jZSwgd2FzICR7aW5zdGFuY2V9YCk7XG4gfTtcbiB9OyRo4oCNX29uY2UubWFrZUFzc2VydEluc3RhbmNlKG1ha2VBc3NlcnRJbnN0YW5jZSk7XG5oYXJkZW4obWFrZUFzc2VydEluc3RhbmNlKTtcblxuY29uc3QgbWFrZUFzc2VydEJyYW5kZWRSYXRpbz0obmFtZSxtb2RlbFJhdGlvKT0+e1xucmV0dXJuKHJhdGlvKT0+e1xuYXNzZXJ0SXNSYXRpbyhyYXRpbyk7XG5yYXRpby5udW1lcmF0b3IuYnJhbmQ9PT1tb2RlbFJhdGlvLm51bWVyYXRvci5icmFuZHx8XG5hc3NlcnQuZmFpbChcblggYE51bWVyYXRvciBicmFuZCBmb3IgJHtuYW1lfSBtdXN0IGJlICR7bW9kZWxSYXRpby5udW1lcmF0b3IuYnJhbmR9YCk7XG5cbnJhdGlvLmRlbm9taW5hdG9yLmJyYW5kPT09bW9kZWxSYXRpby5kZW5vbWluYXRvci5icmFuZHx8XG5hc3NlcnQuZmFpbChcblggYERlbm9taW5hdG9yIGJyYW5kIGZvciAke25hbWV9IG11c3QgYmUgJHttb2RlbFJhdGlvLmRlbm9taW5hdG9yLmJyYW5kfWApO1xuXG5yZXR1cm4gdHJ1ZTtcbiB9O1xuIH07JGjigI1fb25jZS5tYWtlQXNzZXJ0QnJhbmRlZFJhdGlvKG1ha2VBc3NlcnRCcmFuZGVkUmF0aW8pO1xuaGFyZGVuKG1ha2VBc3NlcnRCcmFuZGVkUmF0aW8pO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VMb29rc0xpa2VCcmFuZCI6WyJtYWtlTG9va3NMaWtlQnJhbmQiXSwibWFrZUFzc2VydEluc3RhbGxhdGlvbiI6WyJtYWtlQXNzZXJ0SW5zdGFsbGF0aW9uIl0sIm1ha2VBc3NlcnRJbnN0YW5jZSI6WyJtYWtlQXNzZXJ0SW5zdGFuY2UiXSwibWFrZUFzc2VydEJyYW5kZWRSYXRpbyI6WyJtYWtlQXNzZXJ0QnJhbmRlZFJhdGlvIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAH8pKUSoEQAAqBEAAD0AAABAYWdvcmljL2dvdmVybmFuY2UtdjAuOS4zL3NyYy9jb250cmFjdEdvdmVybmFuY2UvZ292ZXJuQXBpLmpzeyJpbXBvcnRzIjpbIi4uL3F1ZXN0aW9uLmpzIiwiQGFnb3JpYy9zdG9yZSIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsibWFrZUFwaUludm9jYXRpb25Qb3NpdGlvbnMiLCJzZXR1cEFwaUdvdmVybmFuY2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRSxGYXIsa2V5RVEsQ2hvaWNlTWV0aG9kLFF1b3J1bVJ1bGUsRWxlY3Rpb25UeXBlLGNvZXJjZVF1ZXN0aW9uU3BlYzskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcImtleUVRXCIsIFskaOKAjV9hID0+IChrZXlFUSA9ICRo4oCNX2EpXV1dXSxbXCIuLi9xdWVzdGlvbi5qc1wiLCBbW1wiQ2hvaWNlTWV0aG9kXCIsIFskaOKAjV9hID0+IChDaG9pY2VNZXRob2QgPSAkaOKAjV9hKV1dLFtcIlF1b3J1bVJ1bGVcIiwgWyRo4oCNX2EgPT4gKFF1b3J1bVJ1bGUgPSAkaOKAjV9hKV1dLFtcIkVsZWN0aW9uVHlwZVwiLCBbJGjigI1fYSA9PiAoRWxlY3Rpb25UeXBlID0gJGjigI1fYSldXSxbXCJjb2VyY2VRdWVzdGlvblNwZWNcIiwgWyRo4oCNX2EgPT4gKGNvZXJjZVF1ZXN0aW9uU3BlYyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3R7ZGV0YWlsczpYLHF1b3RlOnF9PWFzc2VydDtcblxuLyoqXG4gKiBNYWtlIGEgcGFpciBvZiBwb3NpdGlvbnMgZm9yIGEgcXVlc3Rpb24gYWJvdXQgd2hldGhlciB0byBpbnZva2UgYW4gQVBJLiBJZlxuICogdGhlIHZvdGUgcGFzc2VzLCB0aGUgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIG9uIHRoZSBnb3Zlcm5lZEFwaXMgZmFjZXQgd2l0aCB0aGVcbiAqIGFyZ3VtZW50cyB0aGF0IHdlcmUgcHJvdmlkZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFwaU1ldGhvZE5hbWVcbiAqIEBwYXJhbSB7dW5rbm93bltdfSBtZXRob2RBcmdzXG4gKi9cbmNvbnN0IG1ha2VBcGlJbnZvY2F0aW9uUG9zaXRpb25zPShhcGlNZXRob2ROYW1lLG1ldGhvZEFyZ3MpPT57XG5jb25zdCBwb3NpdGl2ZT1oYXJkZW4oe2FwaU1ldGhvZE5hbWUsbWV0aG9kQXJnc30pO1xuY29uc3QgbmVnYXRpdmU9aGFyZGVuKHtkb250SW52b2tlOmFwaU1ldGhvZE5hbWV9KTtcbnJldHVybntwb3NpdGl2ZSxuZWdhdGl2ZX07XG4gfTtcblxuLyoqXG4gKiBtYW5hZ2UgY29udHJhY3RzIHRoYXQgYWxsb3cgZ292ZXJuYW5jZSB0byBpbnZva2UgZnVuY3Rpb25zLlxuICpcbiAqIEBwYXJhbSB7RVJlZjxab2VTZXJ2aWNlPn0gem9lXG4gKiBAcGFyYW0ge0luc3RhbmNlfSBnb3Zlcm5lZEluc3RhbmNlXG4gKiBAcGFyYW0ge0VSZWY8eyBbbWV0aG9kTmFtZTogc3RyaW5nXTogKC4uLmFyZ3M6IGFueSkgPT4gdW5rbm93biB9Pn0gZ292ZXJuZWRBcGlzXG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZyB8IHN5bWJvbD59IGdvdmVybmVkTmFtZXMgbmFtZXMgb2YgdGhlIGdvdmVybmVkIEFQSSBtZXRob2RzXG4gKiBAcGFyYW0ge0VSZWY8VGltZXJTZXJ2aWNlPn0gdGltZXJcbiAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTxQb3NlckZhY2V0Pn0gZ2V0VXBkYXRlZFBvc2VyRmFjZXRcbiAqIEByZXR1cm5zIHtQcm9taXNlPEFwaUdvdmVybm9yPn1cbiAqLyRo4oCNX29uY2UubWFrZUFwaUludm9jYXRpb25Qb3NpdGlvbnMobWFrZUFwaUludm9jYXRpb25Qb3NpdGlvbnMpO1xuY29uc3Qgc2V0dXBBcGlHb3Zlcm5hbmNlPWFzeW5jKFxuem9lLFxuZ292ZXJuZWRJbnN0YW5jZSxcbmdvdmVybmVkQXBpcyxcbmdvdmVybmVkTmFtZXMsXG50aW1lcixcbmdldFVwZGF0ZWRQb3NlckZhY2V0KT0+XG57XG4vKiogQHR5cGUge1dlYWtTZXQ8SW5zdGFuY2U+fSAqL1xuY29uc3Qgdm90ZUNvdW50ZXJzPW5ldyBXZWFrU2V0KCk7XG5cbi8qKiBAdHlwZSB7Vm90ZU9uQXBpSW52b2NhdGlvbn0gKi9cbmNvbnN0IHZvdGVPbkFwaUludm9jYXRpb249YXN5bmMoXG5hcGlNZXRob2ROYW1lLFxubWV0aG9kQXJncyxcbnZvdGVDb3VudGVySW5zdGFsbGF0aW9uLFxuZGVhZGxpbmUpPT5cbntcbmdvdmVybmVkTmFtZXMuaW5jbHVkZXMoYXBpTWV0aG9kTmFtZSl8fFxuYXNzZXJ0LmZhaWwoWCBgJHthcGlNZXRob2ROYW1lfSBpcyBub3QgYSBnb3Zlcm5lZCBBUEkuYCk7XG5cbmNvbnN0e3Bvc2l0aXZlLG5lZ2F0aXZlfT1tYWtlQXBpSW52b2NhdGlvblBvc2l0aW9ucyhcbmFwaU1ldGhvZE5hbWUsXG5tZXRob2RBcmdzKTtcblxuXG4vKiogQHR5cGUge0FwaUludm9jYXRpb25Jc3N1ZX0gKi9cbmNvbnN0IGlzc3VlPWhhcmRlbih7YXBpTWV0aG9kTmFtZSxtZXRob2RBcmdzfSk7XG5jb25zdCBxdWVzdGlvblNwZWM9Y29lcmNlUXVlc3Rpb25TcGVjKHtcbm1ldGhvZDpDaG9pY2VNZXRob2QuVU5SQU5LRUQsXG5pc3N1ZSxcbnBvc2l0aW9uczpbcG9zaXRpdmUsbmVnYXRpdmVdLFxuZWxlY3Rpb25UeXBlOkVsZWN0aW9uVHlwZS5BUElfSU5WT0NBVElPTixcbm1heENob2ljZXM6MSxcbmNsb3NpbmdSdWxlOnt0aW1lcixkZWFkbGluZX0sXG5xdW9ydW1SdWxlOlF1b3J1bVJ1bGUuTUFKT1JJVFksXG50aWVPdXRjb21lOm5lZ2F0aXZlfSk7XG5cblxuY29uc3R7cHVibGljRmFjZXQ6Y291bnRlclB1YmxpY0ZhY2V0LGluc3RhbmNlOnZvdGVDb3VudGVyfT1hd2FpdCBFKFxuZ2V0VXBkYXRlZFBvc2VyRmFjZXQoKSkuXG5hZGRRdWVzdGlvbih2b3RlQ291bnRlckluc3RhbGxhdGlvbixxdWVzdGlvblNwZWMpO1xuXG52b3RlQ291bnRlcnMuYWRkKHZvdGVDb3VudGVyKTtcblxuLyogQ1JVQ0lBTDogSGVyZSB3ZSB3YWl0IGZvciB0aGUgdm90ZUNvdW50ZXIgdG8gZGVjbGFyZSBhbiBvdXRjb21lLCBhbmQgdGhlbiovXG4vKiBhdHRlbXB0IHRvIGludm9rZSB0aGUgQVBJIGlmIHRoYXQncyB3aGF0IHRoZSB2b3RlIGNhbGxlZCBmb3IuIFdlIG5lZWQgdG8qL1xuLyogbWFrZSBzdXJlIHRoYXQgb3V0Y29tZU9mVXBkYXRlUCBpcyB1cGRhdGVkIHdoYXRldmVyIGhhcHBlbnMuKi9cbi8qKi9cbi8qICogSWYgdGhlIHZvdGUgcGFzc2VkLCBpbnZva2UgdGhlIEFQSSwgYW5kIHJldHVybiB0aGUgcG9zaXRpdmUgcG9zaXRpb24qL1xuLyogKiBJZiB0aGUgdm90ZSB3YXMgbmVnYXRpdmUsIHJldHVybiB0aGUgbmVnYXRpdmUgcG9zaXRpb24qL1xuLyogKiBJZiB3ZSBjYW4ndCBkbyBlaXRoZXIsICh0aGUgdm90ZSBmYWlsZWQgb3IgdGhlIEFQSSBpbnZvY2F0aW9uIGZhaWxlZCkqL1xuLyogcmV0dXJuIGEgYnJva2VuIHByb21pc2UuKi9cbmNvbnN0IG91dGNvbWVPZlVwZGF0ZT1FKGNvdW50ZXJQdWJsaWNGYWNldCkuXG5nZXRPdXRjb21lKCkuXG50aGVuKFxuLyoqIEB0eXBlIHsob3V0Y29tZTogUG9zaXRpb24pID0+IEVSZWY8UG9zaXRpb24+fSAqL1xuKG91dGNvbWUpPT57XG5pZihrZXlFUShwb3NpdGl2ZSxvdXRjb21lKSl7XG5hc3NlcnQoXG5rZXlFUShvdXRjb21lLGhhcmRlbih7YXBpTWV0aG9kTmFtZSxtZXRob2RBcmdzfSkpLFxuWCBgVGhlIHF1ZXN0aW9uJ3MgbWV0aG9kIG5hbWUgKCR7cShcbmFwaU1ldGhvZE5hbWUpXG4gfSkgYW5kIGFyZ3MgKCR7bWV0aG9kQXJnc30pIGRpZG4ndCBtYXRjaCB0aGUgb3V0Y29tZSAke291dGNvbWV9YCk7XG5cblxuLyogRShyZW1vdGUpW25hbWVdKGFyZ3MpIGludm9rZXMgdGhlIG1ldGhvZCBuYW1lZCAnbmFtZScgb24gcmVtb3RlLiovXG5yZXR1cm4gRShnb3Zlcm5lZEFwaXMpW1xuYXBpTWV0aG9kTmFtZV0oLi4ubWV0aG9kQXJncykuXG50aGVuKCgpPT57XG5yZXR1cm4gcG9zaXRpdmU7XG4gfSk7XG4gfWVsc2V7XG5yZXR1cm4gbmVnYXRpdmU7XG4gfVxuIH0pO1xuXG5cbnJldHVybntcbm91dGNvbWVPZlVwZGF0ZSxcbmluc3RhbmNlOnZvdGVDb3VudGVyLFxuZGV0YWlsczpFKGNvdW50ZXJQdWJsaWNGYWNldCkuZ2V0RGV0YWlscygpfTtcblxuIH07XG5cbnJldHVybiBGYXIoJ3BhcmFtR292ZXJub3InLHtcbnZvdGVPbkFwaUludm9jYXRpb24sXG5jcmVhdGVkUXVlc3Rpb246KGIpPT52b3RlQ291bnRlcnMuaGFzKGIpfSk7XG5cbiB9OyRo4oCNX29uY2Uuc2V0dXBBcGlHb3Zlcm5hbmNlKHNldHVwQXBpR292ZXJuYW5jZSk7XG5cbmhhcmRlbihzZXR1cEFwaUdvdmVybmFuY2UpO1xuaGFyZGVuKG1ha2VBcGlJbnZvY2F0aW9uUG9zaXRpb25zKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlQXBpSW52b2NhdGlvblBvc2l0aW9ucyI6WyJtYWtlQXBpSW52b2NhdGlvblBvc2l0aW9ucyJdLCJzZXR1cEFwaUdvdmVybmFuY2UiOlsic2V0dXBBcGlHb3Zlcm5hbmNlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJ0/iqbRDwAA0Q8AAEAAAABAYWdvcmljL2dvdmVybmFuY2UtdjAuOS4zL3NyYy9jb250cmFjdEdvdmVybmFuY2UvZ292ZXJuRmlsdGVyLmpzeyJpbXBvcnRzIjpbIi4uL3F1ZXN0aW9uLmpzIiwiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvdmF0LWRhdGEiLCJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbIm1ha2VPZmZlckZpbHRlclBvc2l0aW9ucyIsInNldHVwRmlsdGVyR292ZXJuYW5jZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBFLEZhcixmaXQsa2V5RVEsTSxDaG9pY2VNZXRob2QsUXVvcnVtUnVsZSxFbGVjdGlvblR5cGUsY29lcmNlUXVlc3Rpb25TcGVjOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiZml0XCIsIFskaOKAjV9hID0+IChmaXQgPSAkaOKAjV9hKV1dLFtcImtleUVRXCIsIFskaOKAjV9hID0+IChrZXlFUSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXV1dLFtcIi4uL3F1ZXN0aW9uLmpzXCIsIFtbXCJDaG9pY2VNZXRob2RcIiwgWyRo4oCNX2EgPT4gKENob2ljZU1ldGhvZCA9ICRo4oCNX2EpXV0sW1wiUXVvcnVtUnVsZVwiLCBbJGjigI1fYSA9PiAoUXVvcnVtUnVsZSA9ICRo4oCNX2EpXV0sW1wiRWxlY3Rpb25UeXBlXCIsIFskaOKAjV9hID0+IChFbGVjdGlvblR5cGUgPSAkaOKAjV9hKV1dLFtcImNvZXJjZVF1ZXN0aW9uU3BlY1wiLCBbJGjigI1fYSA9PiAoY29lcmNlUXVlc3Rpb25TcGVjID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogTWFrZSBhIHBhaXIgb2YgcG9zaXRpb25zIGZvciBhIHF1ZXN0aW9uIGFib3V0IHdoZXRoZXIgdG8gdXBkYXRlIHRoZSBvZmZlclxuICogZmlsdGVyLiBJZiB0aGUgdm90ZSBwYXNzZXMsIHRoZSBsaXN0IG9mIGJsb2NrZWQgaW52aXRhdGlvbiBzdHJpbmdzIHdpbGwgYmVcbiAqIHVwZGF0ZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmdbXX0gc3RyaW5nc1xuICovXG5jb25zdCBtYWtlT2ZmZXJGaWx0ZXJQb3NpdGlvbnM9KHN0cmluZ3MpPT57XG5jb25zdCBwb3NpdGl2ZT1oYXJkZW4oe3N0cmluZ3N9KTtcbmNvbnN0IG5lZ2F0aXZlPWhhcmRlbih7ZG9udFVwZGF0ZTpzdHJpbmdzfSk7XG5yZXR1cm57cG9zaXRpdmUsbmVnYXRpdmV9O1xuIH07XG5cbi8qKlxuICogU2V0dXAgdG8gYWxsb3cgZ292ZXJuYW5jZSB0byBibG9jayBzb21lIGludml0YXRpb25zLlxuICpcbiAqIEBwYXJhbSB7RVJlZjxab2VTZXJ2aWNlPn0gem9lXG4gKiBAcGFyYW0ge0luc3RhbmNlfSBnb3Zlcm5lZEluc3RhbmNlXG4gKiBAcGFyYW0ge0VSZWY8VGltZXJTZXJ2aWNlPn0gdGltZXJcbiAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTxQb3NlckZhY2V0Pn0gZ2V0VXBkYXRlZFBvc2VyRmFjZXRcbiAqIEBwYXJhbSB7R292ZXJub3JGYWNldDx7fT59IGdvdmVybm9yRmFjZXRcbiAqIEByZXR1cm5zIHtQcm9taXNlPEZpbHRlckdvdmVybm9yPn1cbiAqLyRo4oCNX29uY2UubWFrZU9mZmVyRmlsdGVyUG9zaXRpb25zKG1ha2VPZmZlckZpbHRlclBvc2l0aW9ucyk7XG5jb25zdCBzZXR1cEZpbHRlckdvdmVybmFuY2U9YXN5bmMoXG56b2UsXG5nb3Zlcm5lZEluc3RhbmNlLFxudGltZXIsXG5nZXRVcGRhdGVkUG9zZXJGYWNldCxcbmdvdmVybm9yRmFjZXQpPT5cbntcbi8qKiBAdHlwZSB7V2Vha1NldDxJbnN0YW5jZT59ICovXG5jb25zdCB2b3RlQ291bnRlcnM9bmV3IFdlYWtTZXQoKTtcblxuLyoqIEB0eXBlIHtWb3RlT25PZmZlckZpbHRlcn0gKi9cbmNvbnN0IHZvdGVPbkZpbHRlcj1hc3luYyh2b3RlQ291bnRlckluc3RhbGxhdGlvbixkZWFkbGluZSxzdHJpbmdzKT0+e1xuZml0KHN0cmluZ3MsTS5hcnJheU9mKE0uc3RyaW5nKCkpKTtcbmNvbnN0e3Bvc2l0aXZlLG5lZ2F0aXZlfT1tYWtlT2ZmZXJGaWx0ZXJQb3NpdGlvbnMoc3RyaW5ncyk7XG5cbi8qKiBAdHlwZSB7T2ZmZXJGaWx0ZXJJc3N1ZX0gKi9cbmNvbnN0IGlzc3VlPWhhcmRlbih7c3RyaW5nc30pO1xuY29uc3QgcXVlc3Rpb25TcGVjPWNvZXJjZVF1ZXN0aW9uU3BlYyh7XG5tZXRob2Q6Q2hvaWNlTWV0aG9kLlVOUkFOS0VELFxuaXNzdWUsXG5wb3NpdGlvbnM6W3Bvc2l0aXZlLG5lZ2F0aXZlXSxcbmVsZWN0aW9uVHlwZTpFbGVjdGlvblR5cGUuT0ZGRVJfRklMVEVSLFxubWF4Q2hvaWNlczoxLFxuY2xvc2luZ1J1bGU6e3RpbWVyLGRlYWRsaW5lfSxcbnF1b3J1bVJ1bGU6UXVvcnVtUnVsZS5NQUpPUklUWSxcbnRpZU91dGNvbWU6bmVnYXRpdmV9KTtcblxuXG5jb25zdHtwdWJsaWNGYWNldDpjb3VudGVyUHVibGljRmFjZXQsaW5zdGFuY2U6dm90ZUNvdW50ZXJ9PWF3YWl0IEUoXG5nZXRVcGRhdGVkUG9zZXJGYWNldCgpKS5cbmFkZFF1ZXN0aW9uKHZvdGVDb3VudGVySW5zdGFsbGF0aW9uLHF1ZXN0aW9uU3BlYyk7XG5cbnZvdGVDb3VudGVycy5hZGQodm90ZUNvdW50ZXIpO1xuXG4vKiBDUlVDSUFMOiBIZXJlIHdlIHdhaXQgZm9yIHRoZSB2b3RlQ291bnRlciB0byBkZWNsYXJlIGFuIG91dGNvbWUsIGFuZCB0aGVuKi9cbi8qIGF0dGVtcHQgdG8gaW52b2tlIHRoZSBBUEkgaWYgdGhhdCdzIHdoYXQgdGhlIHZvdGUgY2FsbGVkIGZvci4gV2UgbmVlZCB0byovXG4vKiBtYWtlIHN1cmUgdGhhdCBvdXRjb21lT2ZVcGRhdGVQIGlzIHVwZGF0ZWQgd2hhdGV2ZXIgaGFwcGVucy4qL1xuLyoqL1xuLyogKiBJZiB0aGUgdm90ZSBwYXNzZWQsIGludm9rZSB0aGUgQVBJLCBhbmQgcmV0dXJuIHRoZSBwb3NpdGl2ZSBwb3NpdGlvbiovXG4vKiAqIElmIHRoZSB2b3RlIHdhcyBuZWdhdGl2ZSwgcmV0dXJuIHRoZSBuZWdhdGl2ZSBwb3NpdGlvbiovXG4vKiAqIElmIHdlIGNhbid0IGRvIGVpdGhlciwgKHRoZSB2b3RlIGZhaWxlZCBvciB0aGUgQVBJIGludm9jYXRpb24gZmFpbGVkKSovXG4vKiByZXR1cm4gYSBicm9rZW4gcHJvbWlzZS4qL1xuY29uc3Qgb3V0Y29tZU9mVXBkYXRlPUUoY291bnRlclB1YmxpY0ZhY2V0KS5cbmdldE91dGNvbWUoKS5cbnRoZW4oXG4vKiogQHR5cGUgeyhvdXRjb21lOiBQb3NpdGlvbikgPT4gRVJlZjxQb3NpdGlvbj59ICovXG4ob3V0Y29tZSk9PntcbmlmKGtleUVRKG91dGNvbWUscG9zaXRpdmUpKXtcbnJldHVybiBFKGdvdmVybm9yRmFjZXQpLlxuc2V0T2ZmZXJGaWx0ZXIoc3RyaW5ncykuXG50aGVuKCgpPT57XG5yZXR1cm4gcG9zaXRpdmU7XG4gfSk7XG4gfWVsc2UgaWYoa2V5RVEob3V0Y29tZSxuZWdhdGl2ZSkpe1xucmV0dXJuIG5lZ2F0aXZlO1xuIH1lbHNle1xuYXNzZXJ0LmZhaWwoJ3VucmVjb2duaXplZCBvdXRjb21lJyk7XG4gfVxuIH0pO1xuXG5cbnJldHVybiBoYXJkZW4oe1xub3V0Y29tZU9mVXBkYXRlLFxuaW5zdGFuY2U6dm90ZUNvdW50ZXIsXG5kZXRhaWxzOkUoY291bnRlclB1YmxpY0ZhY2V0KS5nZXREZXRhaWxzKCl9KTtcblxuIH07XG5cbnJldHVybiBGYXIoJ2ZpbHRlckdvdmVybm9yJyx7XG52b3RlT25GaWx0ZXIsXG5jcmVhdGVkRmlsdGVyUXVlc3Rpb246KGIpPT52b3RlQ291bnRlcnMuaGFzKGIpfSk7XG5cbiB9OyRo4oCNX29uY2Uuc2V0dXBGaWx0ZXJHb3Zlcm5hbmNlKHNldHVwRmlsdGVyR292ZXJuYW5jZSk7XG5cbmhhcmRlbihzZXR1cEZpbHRlckdvdmVybmFuY2UpO1xuaGFyZGVuKG1ha2VPZmZlckZpbHRlclBvc2l0aW9ucyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZU9mZmVyRmlsdGVyUG9zaXRpb25zIjpbIm1ha2VPZmZlckZpbHRlclBvc2l0aW9ucyJdLCJzZXR1cEZpbHRlckdvdmVybmFuY2UiOlsic2V0dXBGaWx0ZXJHb3Zlcm5hbmNlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAIc+935RFQAAURUAAD8AAABAYWdvcmljL2dvdmVybmFuY2UtdjAuOS4zL3NyYy9jb250cmFjdEdvdmVybmFuY2UvZ292ZXJuUGFyYW0uanN7ImltcG9ydHMiOlsiLi4vcXVlc3Rpb24uanMiLCIuLi90eXBlR3VhcmRzLmpzIiwiQGFnb3JpYy9zdG9yZSIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsiQ09OVFJBQ1RfRUxFQ1RPUkFURSIsImFzc2VydEJhbGxvdENvbmNlcm5zUGFyYW0iLCJtYWtlUGFyYW1DaGFuZ2VQb3NpdGlvbnMiLCJzZXR1cFBhcmFtR292ZXJuYW5jZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBFLGRlZXBseUZ1bGZpbGxlZCxGYXIsZml0LGtleUVRLENob2ljZU1ldGhvZCxjb2VyY2VRdWVzdGlvblNwZWMsRWxlY3Rpb25UeXBlLFF1b3J1bVJ1bGUsUGFyYW1DaGFuZ2VzUXVlc3Rpb25EZXRhaWxzU2hhcGU7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJkZWVwbHlGdWxmaWxsZWRcIiwgWyRo4oCNX2EgPT4gKGRlZXBseUZ1bGZpbGxlZCA9ICRo4oCNX2EpXV0sW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiZml0XCIsIFskaOKAjV9hID0+IChmaXQgPSAkaOKAjV9hKV1dLFtcImtleUVRXCIsIFskaOKAjV9hID0+IChrZXlFUSA9ICRo4oCNX2EpXV1dXSxbXCIuLi9xdWVzdGlvbi5qc1wiLCBbW1wiQ2hvaWNlTWV0aG9kXCIsIFskaOKAjV9hID0+IChDaG9pY2VNZXRob2QgPSAkaOKAjV9hKV1dLFtcImNvZXJjZVF1ZXN0aW9uU3BlY1wiLCBbJGjigI1fYSA9PiAoY29lcmNlUXVlc3Rpb25TcGVjID0gJGjigI1fYSldXSxbXCJFbGVjdGlvblR5cGVcIiwgWyRo4oCNX2EgPT4gKEVsZWN0aW9uVHlwZSA9ICRo4oCNX2EpXV0sW1wiUXVvcnVtUnVsZVwiLCBbJGjigI1fYSA9PiAoUXVvcnVtUnVsZSA9ICRo4oCNX2EpXV1dXSxbXCIuLi90eXBlR3VhcmRzLmpzXCIsIFtbXCJQYXJhbUNoYW5nZXNRdWVzdGlvbkRldGFpbHNTaGFwZVwiLCBbJGjigI1fYSA9PiAoUGFyYW1DaGFuZ2VzUXVlc3Rpb25EZXRhaWxzU2hhcGUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3R7ZGV0YWlsczpYfT1hc3NlcnQ7XG5cbi8qKlxuICogVGhlIGVsZWN0b3JhdGUgdGhhdCBnb3Zlcm5zIGNoYW5nZXMgdG8gdGhlIGNvbnRyYWN0J3MgcGFyYW1ldGVycy4gSXQgbXVzdCBiZVxuICogZGVjbGFyZWQgaW4gdGhlIGdvdmVybmVkIGNvbnRyYWN0LlxuICovXG5jb25zdCBDT05UUkFDVF9FTEVDVE9SQVRFPSdFbGVjdG9yYXRlJztcblxuLyoqXG4gKiBSZXR1cm4gYSByZWNvcmQgY29udGFpbmluZyB0aGUgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIHBvc2l0aW9ucyBmb3IgYVxuICogcXVlc3Rpb24gb24gY2hhbmdpbmcgdGhlIHBhcmFtIHRvIHRoZSBwcm9wb3NlZFZhbHVlLlxuICpcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgUGFyYW1WYWx1ZT59IGNoYW5nZXNcbiAqIEByZXR1cm5zIHtQYXJhbUNoYW5nZVBvc2l0aW9uc31cbiAqLyRo4oCNX29uY2UuQ09OVFJBQ1RfRUxFQ1RPUkFURShDT05UUkFDVF9FTEVDVE9SQVRFKTtcbmNvbnN0IG1ha2VQYXJhbUNoYW5nZVBvc2l0aW9ucz0oY2hhbmdlcyk9Pntcbi8qKiBAdHlwZSB7Q2hhbmdlUGFyYW1zUG9zaXRpb259ICovXG5jb25zdCBwb3NpdGl2ZT17Y2hhbmdlc307XG5jb25zdCBuYW1lc09ubHk9T2JqZWN0LmtleXMoY2hhbmdlcyk7XG5jb25zdCBuZWdhdGl2ZT17bm9DaGFuZ2U6bmFtZXNPbmx5fTtcbnJldHVybiBoYXJkZW4oe3Bvc2l0aXZlLG5lZ2F0aXZlfSk7XG4gfTtcblxuLyoqXG4gKiBhc3NlcnQgdGhhdCB0aGUgcGFyYW1ldGVyIGRlc2NyaWJlZCBieSBwYXJhbVNwZWMgaXMgcHJvcG9zZWQgdG8gYmUgY2hhbmdlZCBpblxuICogdGhlIHF1ZXN0aW9uIGRlc2NyaWJlZCBieSBxdWVzdGlvblNwZWMuXG4gKlxuICogQHBhcmFtIHt7IHBhcmFtZXRlck5hbWU6IHN0cmluZywgcGFyYW1QYXRoOiB1bmtub3dufX0gcGFyYW1TcGVjXG4gKiBAcGFyYW0ge1F1ZXN0aW9uU3BlYzxQYXJhbUNoYW5nZUlzc3VlPHVua25vd24+Pn0gcXVlc3Rpb25TcGVjXG4gKi8kaOKAjV9vbmNlLm1ha2VQYXJhbUNoYW5nZVBvc2l0aW9ucyhtYWtlUGFyYW1DaGFuZ2VQb3NpdGlvbnMpO1xuY29uc3QgYXNzZXJ0QmFsbG90Q29uY2VybnNQYXJhbT0ocGFyYW1TcGVjLHF1ZXN0aW9uU3BlYyk9PntcbmZpdChxdWVzdGlvblNwZWMsUGFyYW1DaGFuZ2VzUXVlc3Rpb25EZXRhaWxzU2hhcGUpO1xuXG5jb25zdHtwYXJhbWV0ZXJOYW1lLHBhcmFtUGF0aH09cGFyYW1TcGVjO1xuY29uc3R7aXNzdWV9PXF1ZXN0aW9uU3BlYztcbmlzc3VlLnNwZWMuY2hhbmdlc1twYXJhbWV0ZXJOYW1lXXx8XG5hc3NlcnQuZmFpbChcblggYFF1ZXN0aW9uICgke2lzc3VlLnNwZWMuY2hhbmdlc30pIGRvZXMgbm90IGNvbmNlcm4gJHtwYXJhbWV0ZXJOYW1lfWApO1xuXG5rZXlFUShpc3N1ZS5zcGVjLnBhcmFtUGF0aCxwYXJhbVBhdGgpfHxcbmFzc2VydC5mYWlsKFxuWCBgUXVlc3Rpb24gcGF0aCAoJHtpc3N1ZS5zcGVjLnBhcmFtUGF0aH0pIGRvZXNuJ3QgbWF0Y2ggcmVxdWVzdCAoJHtwYXJhbVBhdGh9KWApO1xuXG4gfTtcblxuLyoqIEB0eXBlIHtTZXR1cEdvdmVybmFuY2V9ICovJGjigI1fb25jZS5hc3NlcnRCYWxsb3RDb25jZXJuc1BhcmFtKGFzc2VydEJhbGxvdENvbmNlcm5zUGFyYW0pO1xuY29uc3Qgc2V0dXBQYXJhbUdvdmVybmFuY2U9YXN5bmMoXG56b2UsXG5wYXJhbU1hbmFnZXJSZXRyaWV2ZXIsXG5jb250cmFjdEluc3RhbmNlLFxudGltZXIsXG5nZXRVcGRhdGVkUG9zZXJGYWNldCk9Plxue1xuLyoqIEB0eXBlIHtXZWFrU2V0PEluc3RhbmNlPn0gKi9cbmNvbnN0IHZvdGVDb3VudGVycz1uZXcgV2Vha1NldCgpO1xuXG4vKiogQHR5cGUge1ZvdGVPblBhcmFtQ2hhbmdlc30gKi9cbmNvbnN0IHZvdGVPblBhcmFtQ2hhbmdlcz1hc3luYyhcbnZvdGVDb3VudGVySW5zdGFsbGF0aW9uLFxuZGVhZGxpbmUsXG5wYXJhbVNwZWMpPT5cbntcbmNvbnN0IHBhcmFtTWdyPWF3YWl0IEUocGFyYW1NYW5hZ2VyUmV0cmlldmVyKS5nZXQocGFyYW1TcGVjLnBhcmFtUGF0aCk7XG5jb25zdCBjaGFuZ2VQcz17fTtcbmZvcihjb25zdCBuYW1lIG9mIE9iamVjdC5rZXlzKHBhcmFtU3BlYy5jaGFuZ2VzKSl7XG5jb25zdCBwcm9wb3NlZFZhbHVlPUUocGFyYW1NZ3IpLmdldFZpc2libGVWYWx1ZShcbm5hbWUsXG5wYXJhbVNwZWMuY2hhbmdlc1tuYW1lXSk7XG5cbmNoYW5nZVBzW25hbWVdPXByb3Bvc2VkVmFsdWU7XG4gfVxuY29uc3QgY2hhbmdlcz1hd2FpdCBkZWVwbHlGdWxmaWxsZWQoaGFyZGVuKGNoYW5nZVBzKSk7XG5cbmNvbnN0e3Bvc2l0aXZlLG5lZ2F0aXZlfT1tYWtlUGFyYW1DaGFuZ2VQb3NpdGlvbnMoY2hhbmdlcyk7XG5cbi8qKiBAdHlwZSB7UGFyYW1DaGFuZ2VJc3N1ZTx1bmtub3duPn0gKi9cbmNvbnN0IGlzc3VlPWhhcmRlbih7XG5zcGVjOntcbnBhcmFtUGF0aDpwYXJhbVNwZWMucGFyYW1QYXRoLFxuY2hhbmdlc30sXG5cbmNvbnRyYWN0OmNvbnRyYWN0SW5zdGFuY2V9KTtcblxuXG5jb25zdCBxdWVzdGlvblNwZWM9Y29lcmNlUXVlc3Rpb25TcGVjKHtcbm1ldGhvZDpDaG9pY2VNZXRob2QuVU5SQU5LRUQsXG5pc3N1ZSxcbnBvc2l0aW9uczpbcG9zaXRpdmUsbmVnYXRpdmVdLFxuZWxlY3Rpb25UeXBlOkVsZWN0aW9uVHlwZS5QQVJBTV9DSEFOR0UsXG5tYXhDaG9pY2VzOjEsXG5jbG9zaW5nUnVsZTp7dGltZXIsZGVhZGxpbmV9LFxucXVvcnVtUnVsZTpRdW9ydW1SdWxlLk1BSk9SSVRZLFxudGllT3V0Y29tZTpuZWdhdGl2ZX0pO1xuXG5cbmNvbnN0e3B1YmxpY0ZhY2V0OmNvdW50ZXJQdWJsaWNGYWNldCxpbnN0YW5jZTp2b3RlQ291bnRlcn09YXdhaXQgRShcbmdldFVwZGF0ZWRQb3NlckZhY2V0KCkpLlxuYWRkUXVlc3Rpb24odm90ZUNvdW50ZXJJbnN0YWxsYXRpb24scXVlc3Rpb25TcGVjKTtcblxudm90ZUNvdW50ZXJzLmFkZCh2b3RlQ291bnRlcik7XG5cbi8qIENSVUNJQUw6IEhlcmUgd2Ugd2FpdCBmb3IgdGhlIHZvdGVDb3VudGVyIHRvIGRlY2xhcmUgYW4gb3V0Y29tZSwgYW5kIHRoZW4qL1xuLyogYXR0ZW1wdCB0byB1cGRhdGUgdGhlIHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIgaWYgdGhhdCdzIHdoYXQgdGhlIHZvdGUqL1xuLyogZGVjaWRlZC4gV2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCBvdXRjb21lT2ZVcGRhdGVQIGlzIHVwZGF0ZWQgd2hhdGV2ZXIqL1xuLyogaGFwcGVucy4qL1xuLyogKiBJZiB0aGUgdm90ZSB3YXMgbmVnYXRpdmUsIHJlc29sdmUgdG8gdGhlIG91dGNvbWUqL1xuLyogKiBJZiB3ZSB1cGRhdGUgdGhlIHZhbHVlLCBzYXkgc28qL1xuLyogKiBJZiB0aGUgdXBkYXRlIGZhaWxzLCByZWplY3QgdGhlIHByb21pc2UqL1xuLyogKiBpZiB0aGUgdm90ZSBvdXRjb21lIGZhaWxlZCwgcmVqZWN0IHRoZSBwcm9taXNlLiovXG5jb25zdCBvdXRjb21lT2ZVcGRhdGU9RShjb3VudGVyUHVibGljRmFjZXQpLlxuZ2V0T3V0Y29tZSgpLlxudGhlbihhc3luYyhvdXRjb21lKT0+e1xuaWYoa2V5RVEocG9zaXRpdmUsb3V0Y29tZSkpe1xucmV0dXJuIEUud2hlbihcbkUocGFyYW1NZ3IpLnVwZGF0ZVBhcmFtcyhwYXJhbVNwZWMuY2hhbmdlcyksXG4oKT0+cG9zaXRpdmUpO1xuXG4gfVxucmV0dXJuIG5lZ2F0aXZlO1xuIH0pO1xuXG5yZXR1cm57XG5vdXRjb21lT2ZVcGRhdGUsXG5pbnN0YW5jZTp2b3RlQ291bnRlcixcbmRldGFpbHM6RShjb3VudGVyUHVibGljRmFjZXQpLmdldERldGFpbHMoKX07XG5cbiB9O1xuXG5yZXR1cm4gRmFyKCdwYXJhbUdvdmVybm9yJyx7XG52b3RlT25QYXJhbUNoYW5nZXMsXG5jcmVhdGVkUXVlc3Rpb246KGIpPT52b3RlQ291bnRlcnMuaGFzKGIpfSk7XG5cbiB9OyRo4oCNX29uY2Uuc2V0dXBQYXJhbUdvdmVybmFuY2Uoc2V0dXBQYXJhbUdvdmVybmFuY2UpO1xuXG5oYXJkZW4oc2V0dXBQYXJhbUdvdmVybmFuY2UpO1xuaGFyZGVuKG1ha2VQYXJhbUNoYW5nZVBvc2l0aW9ucyk7XG5oYXJkZW4oYXNzZXJ0QmFsbG90Q29uY2VybnNQYXJhbSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQ09OVFJBQ1RfRUxFQ1RPUkFURSI6WyJDT05UUkFDVF9FTEVDVE9SQVRFIl0sIm1ha2VQYXJhbUNoYW5nZVBvc2l0aW9ucyI6WyJtYWtlUGFyYW1DaGFuZ2VQb3NpdGlvbnMiXSwiYXNzZXJ0QmFsbG90Q29uY2VybnNQYXJhbSI6WyJhc3NlcnRCYWxsb3RDb25jZXJuc1BhcmFtIl0sInNldHVwUGFyYW1Hb3Zlcm5hbmNlIjpbInNldHVwUGFyYW1Hb3Zlcm5hbmNlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAOLOwPj6OAAA+jgAAEAAAABAYWdvcmljL2dvdmVybmFuY2UtdjAuOS4zL3NyYy9jb250cmFjdEdvdmVybmFuY2UvcGFyYW1NYW5hZ2VyLmpzeyJpbXBvcnRzIjpbIi4uL2NvbnN0YW50cy5qcyIsIi4vYXNzZXJ0aW9ucy5qcyIsIi4vZ292ZXJuUGFyYW0uanMiLCJAYWdvcmljL2VydHAiLCJAYWdvcmljL25hdCIsIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL3pvZS9zcmMvY2xlYW5Qcm9wb3NhbC5qcyIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsiYXNzZXJ0RWxlY3RvcmF0ZU1hdGNoZXMiLCJtYWtlUGFyYW1NYW5hZ2VyQnVpbGRlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBGYXIscGFzc1N0eWxlT2YsQW1vdW50TWF0aCxhc3NlcnRLZXl3b3JkTmFtZSxOYXQsa2V5RVEsbWFrZVN0b3JlLEUsUGFyYW1UeXBlcyxtYWtlQXNzZXJ0QnJhbmRlZFJhdGlvLG1ha2VBc3NlcnRJbnN0YWxsYXRpb24sbWFrZUFzc2VydEluc3RhbmNlLG1ha2VMb29rc0xpa2VCcmFuZCxDT05UUkFDVF9FTEVDVE9SQVRFOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXSxbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9lcnRwXCIsIFtbXCJBbW91bnRNYXRoXCIsIFskaOKAjV9hID0+IChBbW91bnRNYXRoID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvem9lL3NyYy9jbGVhblByb3Bvc2FsLmpzXCIsIFtbXCJhc3NlcnRLZXl3b3JkTmFtZVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0S2V5d29yZE5hbWUgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9uYXRcIiwgW1tcIk5hdFwiLCBbJGjigI1fYSA9PiAoTmF0ID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcImtleUVRXCIsIFskaOKAjV9hID0+IChrZXlFUSA9ICRo4oCNX2EpXV0sW1wibWFrZVN0b3JlXCIsIFskaOKAjV9hID0+IChtYWtlU3RvcmUgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXSxbXCIuLi9jb25zdGFudHMuanNcIiwgW1tcIlBhcmFtVHlwZXNcIiwgWyRo4oCNX2EgPT4gKFBhcmFtVHlwZXMgPSAkaOKAjV9hKV1dXV0sW1wiLi9hc3NlcnRpb25zLmpzXCIsIFtbXCJtYWtlQXNzZXJ0QnJhbmRlZFJhdGlvXCIsIFskaOKAjV9hID0+IChtYWtlQXNzZXJ0QnJhbmRlZFJhdGlvID0gJGjigI1fYSldXSxbXCJtYWtlQXNzZXJ0SW5zdGFsbGF0aW9uXCIsIFskaOKAjV9hID0+IChtYWtlQXNzZXJ0SW5zdGFsbGF0aW9uID0gJGjigI1fYSldXSxbXCJtYWtlQXNzZXJ0SW5zdGFuY2VcIiwgWyRo4oCNX2EgPT4gKG1ha2VBc3NlcnRJbnN0YW5jZSA9ICRo4oCNX2EpXV0sW1wibWFrZUxvb2tzTGlrZUJyYW5kXCIsIFskaOKAjV9hID0+IChtYWtlTG9va3NMaWtlQnJhbmQgPSAkaOKAjV9hKV1dXV0sW1wiLi9nb3Zlcm5QYXJhbS5qc1wiLCBbW1wiQ09OVFJBQ1RfRUxFQ1RPUkFURVwiLCBbJGjigI1fYSA9PiAoQ09OVFJBQ1RfRUxFQ1RPUkFURSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0e2RldGFpbHM6WCxxdW90ZTpxfT1hc3NlcnQ7XG5cbi8qKlxuICogQHBhcmFtIHtQYXJhbU1hbmFnZXJCYXNlfSBwYXJhbU1hbmFnZXJcbiAqIEBwYXJhbSB7e1tDT05UUkFDVF9FTEVDVE9SQVRFXTogUGFyYW1WYWx1ZVR5cGVkPCdpbnZpdGF0aW9uJz59fSBnb3Zlcm5lZFBhcmFtc1xuICovXG5jb25zdCBhc3NlcnRFbGVjdG9yYXRlTWF0Y2hlcz0ocGFyYW1NYW5hZ2VyLGdvdmVybmVkUGFyYW1zKT0+e1xuY29uc3QgbWFuYWdlckVsZWN0b3JhdGU9XG5wYXJhbU1hbmFnZXIuZ2V0SW52aXRhdGlvbkFtb3VudChDT05UUkFDVF9FTEVDVE9SQVRFKTtcbmNvbnN0e1xuW0NPTlRSQUNUX0VMRUNUT1JBVEVdOnt2YWx1ZTpwYXJhbUVsZWN0b3JhdGV9fT1cbmdvdmVybmVkUGFyYW1zO1xucGFyYW1FbGVjdG9yYXRlfHxcbmFzc2VydC5mYWlsKFxuWCBgTWlzc2luZyAke3EoQ09OVFJBQ1RfRUxFQ1RPUkFURSl9IHRlcm0gaW4gJHtxKGdvdmVybmVkUGFyYW1zKX1gKTtcblxua2V5RVEobWFuYWdlckVsZWN0b3JhdGUscGFyYW1FbGVjdG9yYXRlKXx8XG5hc3NlcnQuZmFpbChcblggYEVsZWN0b3JhdGUgaW4gbWFuYWdlciAoJHttYW5hZ2VyRWxlY3RvcmF0ZX0pfSBpbmNvbXBhdGlibGUgd2l0aCB0ZXJtcyAoJHtwYXJhbUVsZWN0b3JhdGV9YCk7XG5cbiB9O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBhcmFtTWFuYWdlckJ1aWxkZXJcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZywgdmFsdWU6IEFtb3VudCkgPT4gUGFyYW1NYW5hZ2VyQnVpbGRlcn0gYWRkQW1vdW50XG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcsIHZhbHVlOiBCcmFuZCkgPT4gUGFyYW1NYW5hZ2VyQnVpbGRlcn0gYWRkQnJhbmRcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZywgdmFsdWU6IEluc3RhbGxhdGlvbikgPT4gUGFyYW1NYW5hZ2VyQnVpbGRlcn0gYWRkSW5zdGFsbGF0aW9uXG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcsIHZhbHVlOiBJbnN0YW5jZSkgPT4gUGFyYW1NYW5hZ2VyQnVpbGRlcn0gYWRkSW5zdGFuY2VcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZywgdmFsdWU6IEludml0YXRpb24pID0+IFByb21pc2U8UGFyYW1NYW5hZ2VyQnVpbGRlcj59IGFkZEludml0YXRpb25cbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZywgdmFsdWU6IGJpZ2ludCkgPT4gUGFyYW1NYW5hZ2VyQnVpbGRlcn0gYWRkTmF0XG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcsIHZhbHVlOiBSYXRpbykgPT4gUGFyYW1NYW5hZ2VyQnVpbGRlcn0gYWRkUmF0aW9cbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZywgdmFsdWU6IFhpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5Db3B5UmVjb3JkPHVua25vd24+KSA9PiBQYXJhbU1hbmFnZXJCdWlsZGVyfSBhZGRSZWNvcmRcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZykgPT4gUGFyYW1NYW5hZ2VyQnVpbGRlcn0gYWRkU3RyaW5nXG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpID0+IFBhcmFtTWFuYWdlckJ1aWxkZXJ9IGFkZFVua25vd25cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gQW55UGFyYW1NYW5hZ2VyfSBidWlsZFxuICovXG5cbi8qKlxuICogQHBhcmFtIHtYaW1wb3J0KCdAYWdvcmljL25vdGlmaWVyJykuU3RvcmVkUHVibGlzaGVyS2l0PEdvdmVybmFuY2VTdWJzY3JpcHRpb25TdGF0ZT59IHB1Ymxpc2hlcktpdFxuICogQHBhcmFtIHtFUmVmPFpvZVNlcnZpY2U+fSBbem9lXVxuICovJGjigI1fb25jZS5hc3NlcnRFbGVjdG9yYXRlTWF0Y2hlcyhhc3NlcnRFbGVjdG9yYXRlTWF0Y2hlcyk7XG5jb25zdCBtYWtlUGFyYW1NYW5hZ2VyQnVpbGRlcj0ocHVibGlzaGVyS2l0LHpvZSk9Pntcbi8qKiBAdHlwZSB7U3RvcmU8S2V5d29yZCwgYW55Pn0gKi9cbmNvbnN0IG5hbWVzVG9QYXJhbXM9bWFrZVN0b3JlKCdQYXJhbWV0ZXIgTmFtZScpO1xuY29uc3R7cHVibGlzaGVyLHN1YnNjcmliZXJ9PXB1Ymxpc2hlcktpdDtcbmFzc2VydChwdWJsaXNoZXIsJ21pc3NpbmcgcHVibGlzaGVyJyk7XG5hc3NlcnQoc3Vic2NyaWJlciwnbWlzc2luZyBzdWJzY3JpYmVyJyk7XG5cbmNvbnN0IGdldHRlcnM9e307XG5jb25zdCBzZXR0ZXJzPXt9O1xuXG5jb25zdCBwdWJsaXNoPSgpPT57XG4vKiogQHR5cGUge1BhcmFtU3RhdGVSZWNvcmR9ICovXG5jb25zdCBjdXJyZW50PU9iamVjdC5mcm9tRW50cmllcyhcblsuLi5uYW1lc1RvUGFyYW1zLmVudHJpZXMoKV0ubWFwKChbayx2XSk9PltrLHYubWFrZURlc2NyaXB0aW9uKCldKSk7XG5cbnB1Ymxpc2hlci51cGRhdGVTdGF0ZSh7Y3VycmVudH0pO1xuIH07XG5cbi8qKlxuICogU3VwcG9ydCBmb3IgcGFyYW1ldGVycyB0aGF0IGFyZSBjb3B5IG9iamVjdHNcbiAqXG4gKiBAc2VlIGJ1aWxkSW52aXRhdGlvblBhcmFtXG4gKlxuICogQHBhcmFtIHtLZXl3b3JkfSBuYW1lXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlXG4gKiBAcGFyYW0geyh2YWwpID0+IHZvaWR9IGFzc2VydGlvblxuICogQHBhcmFtIHtQYXJhbVR5cGV9IHR5cGVcbiAqL1xuY29uc3QgYnVpbGRDb3B5UGFyYW09KG5hbWUsdmFsdWUsYXNzZXJ0aW9uLHR5cGUpPT57XG5sZXQgY3VycmVudDtcbmFzc2VydEtleXdvcmROYW1lKG5hbWUpO1xuYXNzZXJ0KHZhbHVlIT09dW5kZWZpbmVkLFggYHBhcmFtICR7cShuYW1lKX0gbXVzdCBiZSBkZWZpbmVkYCk7XG5cbmNvbnN0IHNldFBhcmFtVmFsdWU9KG5ld1ZhbHVlKT0+e1xuYXNzZXJ0aW9uKG5ld1ZhbHVlKTtcbmN1cnJlbnQ9bmV3VmFsdWU7XG5yZXR1cm4gaGFyZGVuKHtbbmFtZV06bmV3VmFsdWV9KTtcbiB9O1xuc2V0UGFyYW1WYWx1ZSh2YWx1ZSk7XG5cbmNvbnN0IGdldFZpc2libGVWYWx1ZT0ocHJvcG9zZWQpPT57XG5hc3NlcnRpb24ocHJvcG9zZWQpO1xucmV0dXJuIHByb3Bvc2VkO1xuIH07XG5cbmNvbnN0IHB1YmxpY01ldGhvZHM9RmFyKCBgUGFyYW1ldGVyICR7bmFtZX1gLHtcbmdldFZhbHVlOigpPT5jdXJyZW50LFxuYXNzZXJ0VHlwZTphc3NlcnRpb24sXG5tYWtlRGVzY3JpcHRpb246KCk9Pih7dHlwZSx2YWx1ZTpjdXJyZW50fSksXG5nZXRWaXNpYmxlVmFsdWUsXG5nZXRUeXBlOigpPT50eXBlfSk7XG5cblxuLyogbmFtZXMgYXJlIGtleXdvcmRzIHNvIHRoZXkgd2lsbCBuZWNlc3NhcmlseSBiZSBUaXRsZUNhc2UqL1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbmdldHRlcnNbIGBnZXQke25hbWV9YF09KCk9PmdldFR5cGVkUGFyYW0odHlwZSxuYW1lKTtcbi8qIENSVUNJQUw6IGhlcmUgd2UncmUgY3JlYXRpbmcgdGhlIHVwZGF0ZSBmdW5jdGlvbnMgdGhhdCBjYW4gY2hhbmdlIHRoZSovXG4vKiB2YWx1ZXMgb2YgdGhlIGdvdmVybmVkIGNvbnRyYWN0J3MgcGFyYW1ldGVycy4gV2UnbGwgcmV0dXJuIHRoZSB1cGRhdGVGbnMqL1xuLyogdG8gb3VyIGNhbGxlci4gVGhleSBtdXN0IGhhbmRsZSB0aGVtIGNhcmVmdWxseSB0byBlbnN1cmUgdGhhdCB0aGV5IGVuZCB1cCovXG4vKiBpbiBhcHByb3ByaWF0ZSBoYW5kcy4qL1xuc2V0dGVyc1sgYHVwZGF0ZSR7bmFtZX1gXT1zZXRQYXJhbVZhbHVlO1xuc2V0dGVyc1sgYHByZXBhcmVUb1VwZGF0ZSR7bmFtZX1gXT0ocHJvcG9zZWRWYWx1ZSk9PnByb3Bvc2VkVmFsdWU7XG5uYW1lc1RvUGFyYW1zLmluaXQobmFtZSxwdWJsaWNNZXRob2RzKTtcbiB9O1xuXG4vKiBIQU5ETEVSUyBGT1IgRUFDSCBQQVJBTUVURVIgVFlQRSAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKiBAdHlwZSB7KG5hbWU6IHN0cmluZywgdmFsdWU6IEFtb3VudCwgYnVpbGRlcjogUGFyYW1NYW5hZ2VyQnVpbGRlcikgPT4gUGFyYW1NYW5hZ2VyQnVpbGRlcn0gKi9cbmNvbnN0IGFkZEFtb3VudD0obmFtZSx2YWx1ZSxidWlsZGVyKT0+e1xuY29uc3QgYXNzZXJ0QW1vdW50PShhKT0+e1xuYXNzZXJ0KGEuYnJhbmQsWCBgRXhwZWN0ZWQgYW4gQW1vdW50IGZvciAke3EobmFtZSl9LCBnb3Q6ICR7YX1gKTtcbnJldHVybiBBbW91bnRNYXRoLmNvZXJjZSh2YWx1ZS5icmFuZCxhKTtcbiB9O1xuYnVpbGRDb3B5UGFyYW0obmFtZSx2YWx1ZSxhc3NlcnRBbW91bnQsUGFyYW1UeXBlcy5BTU9VTlQpO1xucmV0dXJuIGJ1aWxkZXI7XG4gfTtcblxuLyoqIEB0eXBlIHsobmFtZTogc3RyaW5nLCB2YWx1ZTogQnJhbmQsIGJ1aWxkZXI6IFBhcmFtTWFuYWdlckJ1aWxkZXIpID0+IFBhcmFtTWFuYWdlckJ1aWxkZXJ9ICovXG5jb25zdCBhZGRCcmFuZD0obmFtZSx2YWx1ZSxidWlsZGVyKT0+e1xuY29uc3QgYXNzZXJ0QnJhbmQ9bWFrZUxvb2tzTGlrZUJyYW5kKG5hbWUpO1xuYnVpbGRDb3B5UGFyYW0obmFtZSx2YWx1ZSxhc3NlcnRCcmFuZCxQYXJhbVR5cGVzLkJSQU5EKTtcbnJldHVybiBidWlsZGVyO1xuIH07XG5cbi8qKiBAdHlwZSB7KG5hbWU6IHN0cmluZywgdmFsdWU6IEluc3RhbGxhdGlvbjx1bmtub3duPiwgYnVpbGRlcjogUGFyYW1NYW5hZ2VyQnVpbGRlcikgPT4gUGFyYW1NYW5hZ2VyQnVpbGRlcn0gKi9cbmNvbnN0IGFkZEluc3RhbGxhdGlvbj0obmFtZSx2YWx1ZSxidWlsZGVyKT0+e1xuY29uc3QgYXNzZXJ0SW5zdGFsbGF0aW9uPW1ha2VBc3NlcnRJbnN0YWxsYXRpb24obmFtZSk7XG5idWlsZENvcHlQYXJhbShuYW1lLHZhbHVlLGFzc2VydEluc3RhbGxhdGlvbixQYXJhbVR5cGVzLklOU1RBTExBVElPTik7XG5yZXR1cm4gYnVpbGRlcjtcbiB9O1xuXG4vKiogQHR5cGUgeyhuYW1lOiBzdHJpbmcsIHZhbHVlOiBJbnN0YW5jZSwgYnVpbGRlcjogUGFyYW1NYW5hZ2VyQnVpbGRlcikgPT4gUGFyYW1NYW5hZ2VyQnVpbGRlcn0gKi9cbmNvbnN0IGFkZEluc3RhbmNlPShuYW1lLHZhbHVlLGJ1aWxkZXIpPT57XG5jb25zdCBhc3NlcnRJbnN0YW5jZT1tYWtlQXNzZXJ0SW5zdGFuY2UobmFtZSk7XG5idWlsZENvcHlQYXJhbShuYW1lLHZhbHVlLGFzc2VydEluc3RhbmNlLFBhcmFtVHlwZXMuSU5TVEFOQ0UpO1xucmV0dXJuIGJ1aWxkZXI7XG4gfTtcblxuLyoqIEB0eXBlIHsobmFtZTogc3RyaW5nLCB2YWx1ZTogYmlnaW50LCBidWlsZGVyOiBQYXJhbU1hbmFnZXJCdWlsZGVyKSA9PiBQYXJhbU1hbmFnZXJCdWlsZGVyfSAqL1xuY29uc3QgYWRkTmF0PShuYW1lLHZhbHVlLGJ1aWxkZXIpPT57XG5jb25zdCBhc3NlcnROYXQ9KHYpPT57XG5hc3NlcnQudHlwZW9mKHYsJ2JpZ2ludCcpO1xuTmF0KHYpO1xucmV0dXJuIHRydWU7XG4gfTtcbmJ1aWxkQ29weVBhcmFtKG5hbWUsdmFsdWUsYXNzZXJ0TmF0LFBhcmFtVHlwZXMuTkFUKTtcbnJldHVybiBidWlsZGVyO1xuIH07XG5cbi8qKiBAdHlwZSB7KG5hbWU6IHN0cmluZywgdmFsdWU6IFJhdGlvLCBidWlsZGVyOiBQYXJhbU1hbmFnZXJCdWlsZGVyKSA9PiBQYXJhbU1hbmFnZXJCdWlsZGVyfSAqL1xuY29uc3QgYWRkUmF0aW89KG5hbWUsdmFsdWUsYnVpbGRlcik9PntcbmNvbnN0IGFzc2VydEJyYW5kZWRSYXRpbz1tYWtlQXNzZXJ0QnJhbmRlZFJhdGlvKG5hbWUsdmFsdWUpO1xuYnVpbGRDb3B5UGFyYW0obmFtZSx2YWx1ZSxhc3NlcnRCcmFuZGVkUmF0aW8sUGFyYW1UeXBlcy5SQVRJTyk7XG5yZXR1cm4gYnVpbGRlcjtcbiB9O1xuXG4vKiogQHR5cGUgeyhuYW1lOiBzdHJpbmcsIHZhbHVlOiBYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuQ29weVJlY29yZDx1bmtub3duPiwgYnVpbGRlcjogUGFyYW1NYW5hZ2VyQnVpbGRlcikgPT4gUGFyYW1NYW5hZ2VyQnVpbGRlcn0gKi9cbmNvbnN0IGFkZFJlY29yZD0obmFtZSx2YWx1ZSxidWlsZGVyKT0+e1xuY29uc3QgYXNzZXJ0UmVjb3JkPSh2KT0+e1xucGFzc1N0eWxlT2Yodik7XG5hc3NlcnQudHlwZW9mKHYsJ29iamVjdCcpO1xuIH07XG5idWlsZENvcHlQYXJhbShuYW1lLHZhbHVlLGFzc2VydFJlY29yZCxQYXJhbVR5cGVzLlBBU1NBQkxFX1JFQ09SRCk7XG5yZXR1cm4gYnVpbGRlcjtcbiB9O1xuXG4vKiogQHR5cGUgeyhuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcsIGJ1aWxkZXI6IFBhcmFtTWFuYWdlckJ1aWxkZXIpID0+IFBhcmFtTWFuYWdlckJ1aWxkZXJ9ICovXG5jb25zdCBhZGRTdHJpbmc9KG5hbWUsdmFsdWUsYnVpbGRlcik9PntcbmNvbnN0IGFzc2VydFN0cmluZz0odik9PmFzc2VydC50eXBlb2Yodiwnc3RyaW5nJyk7XG5idWlsZENvcHlQYXJhbShuYW1lLHZhbHVlLGFzc2VydFN0cmluZyxQYXJhbVR5cGVzLlNUUklORyk7XG5yZXR1cm4gYnVpbGRlcjtcbiB9O1xuXG4vKiogQHR5cGUgeyhuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnksIGJ1aWxkZXI6IFBhcmFtTWFuYWdlckJ1aWxkZXIpID0+IFBhcmFtTWFuYWdlckJ1aWxkZXJ9ICovXG5jb25zdCBhZGRVbmtub3duPShuYW1lLHZhbHVlLGJ1aWxkZXIpPT57XG5jb25zdCBhc3NlcnRVbmtub3duPShfdik9PnRydWU7XG5idWlsZENvcHlQYXJhbShuYW1lLHZhbHVlLGFzc2VydFVua25vd24sUGFyYW1UeXBlcy5VTktOT1dOKTtcbnJldHVybiBidWlsZGVyO1xuIH07XG5cbmNvbnN0IGFzc2VydEludml0YXRpb249YXN5bmMoaSk9PntcbmFzc2VydCh6b2UsWCBgem9lIG11c3QgYmUgcHJvdmlkZWQgZm9yIGdvdmVybmVkIEludml0YXRpb25zICR7em9lfWApO1xuY29uc3R7aW5zdGFuY2UsaW5zdGFsbGF0aW9ufT1hd2FpdCBFKHpvZSkuZ2V0SW52aXRhdGlvbkRldGFpbHMoaSk7XG5hc3NlcnQoaW5zdGFuY2UmJmluc3RhbGxhdGlvbiwnbXVzdCBiZSBhbiBpbnZpdGF0aW9uJyk7XG4gfTtcblxuLyoqXG4gKiBJbnZpdGF0aW9ucyBhcmUgY2xvc2VseSBoZWxkLCBzbyB3ZSBzaG91bGQgcHVibGljbHkgcmV2ZWFsIG9ubHkgdGhlIGFtb3VudC5cbiAqIFRoZSBhcHByb2FjaCBoZXJlIG1ha2VzIGl0IHBvc3NpYmxlIGZvciBjb250cmFjdHMgdG8gZ2V0IHRoZSBhY3R1YWxcbiAqIGludml0YXRpb24gcHJpdmF0ZWx5LCBhbmQgbGVnaWJseSBhc3N1cmUgY2xpZW50cyB0aGF0IGl0IG1hdGNoZXMgdGhlXG4gKiBwdWJsaWNseSB2aXNpYmxlIGludml0YXRpb24gYW1vdW50LiBDb250cmFjdCByZXZpZXdlcnMgc3RpbGwgaGF2ZSB0b1xuICogbWFudWFsbHkgdmVyaWZ5IHRoYXQgdGhlIGFjdHVhbCBpbnZpdGF0aW9uIGlzIGhhbmRsZWQgY2FyZWZ1bGx5LlxuICogYGdldEludGVybmFsVmFsdWUoKWAgd2lsbCBvbmx5IGJlIGFjY2Vzc2libGUgd2l0aGluIHRoZSBjb250cmFjdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtJbnZpdGF0aW9ufSBpbnZpdGF0aW9uXG4gKi9cbmNvbnN0IGJ1aWxkSW52aXRhdGlvblBhcmFtPWFzeW5jKG5hbWUsaW52aXRhdGlvbik9PntcbmFzc2VydCh6b2UsWCBgem9lIG11c3QgYmUgcHJvdmlkZWQgZm9yIGdvdmVybmVkIEludml0YXRpb25zICR7em9lfWApO1xubGV0IGN1cnJlbnRJbnZpdGF0aW9uO1xubGV0IGN1cnJlbnRBbW91bnQ7XG5cbi8qKlxuICogQHR5cGVkZWYge1tJbnZpdGF0aW9uLCBBbW91bnRdfSBTZXRJbnZpdGF0aW9uUGFyYW1cbiAqL1xuXG4vKipcbiAqIEFzeW5jIHBoYXNlIHRvIHByZXBhcmUgZm9yIHN5bmNocm9ub3VzIHNldHRpbmdcbiAqXG4gKiBAcGFyYW0ge0ludml0YXRpb259IGludml0ZVxuICogQHJldHVybnMge1Byb21pc2U8U2V0SW52aXRhdGlvblBhcmFtPn1cbiAqL1xuY29uc3QgcHJlcGFyZVRvU2V0SW52aXRhdGlvbj1hc3luYyhpbnZpdGUpPT57XG5jb25zdFtwcmVwYXJlZEFtb3VudF09YXdhaXQgUHJvbWlzZS5hbGwoW1xuRShFKHpvZSkuZ2V0SW52aXRhdGlvbklzc3VlcigpKS5nZXRBbW91bnRPZihpbnZpdGUpLFxuYXNzZXJ0SW52aXRhdGlvbihpbnZpdGUpXSk7XG5cblxucmV0dXJuW2ludml0ZSxwcmVwYXJlZEFtb3VudF07XG4gfTtcblxuLyoqXG4gKiBTeW5jaHJvbm91cyBwaGFzZSBvZiB2YWx1ZSBzZXR0aW5nXG4gKlxuICogQHBhcmFtIHtTZXRJbnZpdGF0aW9uUGFyYW19IHBhcmFtMFxuICovXG5jb25zdCBzZXRJbnZpdGF0aW9uPShbbmV3SW52aXRhdGlvbixhbW91bnRdKT0+e1xuY3VycmVudEFtb3VudD1hbW91bnQ7XG5jdXJyZW50SW52aXRhdGlvbj1uZXdJbnZpdGF0aW9uO1xucmV0dXJuIGhhcmRlbih7W25hbWVdOmN1cnJlbnRBbW91bnR9KTtcbiB9O1xuY29uc3QgaW52aXRlQW5kQW1vdW50PWF3YWl0IHByZXBhcmVUb1NldEludml0YXRpb24oaW52aXRhdGlvbik7XG5zZXRJbnZpdGF0aW9uKGludml0ZUFuZEFtb3VudCk7XG5cbmNvbnN0IG1ha2VEZXNjcmlwdGlvbj0oKT0+e1xucmV0dXJue3R5cGU6UGFyYW1UeXBlcy5JTlZJVEFUSU9OLHZhbHVlOmN1cnJlbnRBbW91bnR9O1xuIH07XG5cbmNvbnN0IGdldFZpc2libGVWYWx1ZT1hc3luYyhhbGxlZ2VkSW52aXRhdGlvbik9PlxuRShFKHpvZSkuZ2V0SW52aXRhdGlvbklzc3VlcigpKS5nZXRBbW91bnRPZihhbGxlZ2VkSW52aXRhdGlvbik7XG5cbmNvbnN0IHB1YmxpY01ldGhvZHM9RmFyKCBgUGFyYW1ldGVyICR7bmFtZX1gLHtcbmdldFZhbHVlOigpPT5jdXJyZW50QW1vdW50LFxuZ2V0SW50ZXJuYWxWYWx1ZTooKT0+Y3VycmVudEludml0YXRpb24sXG5hc3NlcnRUeXBlOmFzc2VydEludml0YXRpb24sXG5tYWtlRGVzY3JpcHRpb24sXG5nZXRUeXBlOigpPT5QYXJhbVR5cGVzLklOVklUQVRJT04sXG5nZXRWaXNpYmxlVmFsdWV9KTtcblxuXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuZ2V0dGVyc1sgYGdldCR7bmFtZX1gXT0oKT0+Z2V0VHlwZWRQYXJhbShQYXJhbVR5cGVzLklOVklUQVRJT04sbmFtZSk7XG4vKiBDUlVDSUFMOiBoZXJlIHdlJ3JlIGNyZWF0aW5nIHRoZSB1cGRhdGUgZnVuY3Rpb25zIHRoYXQgY2FuIGNoYW5nZSB0aGUqL1xuLyogdmFsdWVzIG9mIHRoZSBnb3Zlcm5lZCBjb250cmFjdCdzIHBhcmFtZXRlcnMuIFdlJ2xsIHJldHVybiB1cGRhdGVQYXJhbXMqL1xuLyogKHdoaWNoIGNhbiBpbnZva2UgYWxsIG9mIHRoZW0pIHRvIG91ciBjYWxsZXIuIFRoZXkgbXVzdCBoYW5kbGUgaXQqL1xuLyogY2FyZWZ1bGx5IHRvIGVuc3VyZSB0aGF0IHRoZXkgZW5kIHVwIGluIGFwcHJvcHJpYXRlIGhhbmRzLiovXG5zZXR0ZXJzWyBgcHJlcGFyZVRvVXBkYXRlJHtuYW1lfWBdPXByZXBhcmVUb1NldEludml0YXRpb247XG5zZXR0ZXJzWyBgdXBkYXRlJHtuYW1lfWBdPXNldEludml0YXRpb247XG5uYW1lc1RvUGFyYW1zLmluaXQobmFtZSxwdWJsaWNNZXRob2RzKTtcbnJldHVybiBuYW1lO1xuIH07XG5cbi8qKiBAdHlwZSB7KG5hbWU6IHN0cmluZywgdmFsdWU6IEludml0YXRpb24sIGJ1aWxkZXI6IFBhcmFtTWFuYWdlckJ1aWxkZXIpID0+IFByb21pc2U8UGFyYW1NYW5hZ2VyQnVpbGRlcj59ICovXG5jb25zdCBhZGRJbnZpdGF0aW9uPWFzeW5jKG5hbWUsdmFsdWUsYnVpbGRlcik9PntcbmFzc2VydEtleXdvcmROYW1lKG5hbWUpO1xuYXNzZXJ0KHZhbHVlIT09bnVsbCxYIGBwYXJhbSAke3EobmFtZSl9IG11c3QgYmUgZGVmaW5lZGApO1xuYXdhaXQgUHJvbWlzZS5hbGwoW1xuYXNzZXJ0SW52aXRhdGlvbih2YWx1ZSksXG5idWlsZEludml0YXRpb25QYXJhbShuYW1lLHZhbHVlKV0pO1xuXG5cbnJldHVybiBidWlsZGVyO1xuIH07XG5cbi8qIFBBUkFNIE1BTkFHRVIgTUVUSE9EUyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuY29uc3QgZ2V0VHlwZWRQYXJhbT0odHlwZSxuYW1lKT0+e1xuY29uc3QgcGFyYW09bmFtZXNUb1BhcmFtcy5nZXQobmFtZSk7XG5hc3NlcnQodHlwZT09PXBhcmFtLmdldFR5cGUoKSxYIGAke25hbWV9IGlzIG5vdCAke3R5cGV9YCk7XG5yZXR1cm4gcGFyYW0uZ2V0VmFsdWUoKTtcbiB9O1xuXG5jb25zdCBnZXRWaXNpYmxlVmFsdWU9KG5hbWUscHJvcG9zZWQpPT57XG5jb25zdCBwYXJhbT1uYW1lc1RvUGFyYW1zLmdldChuYW1lKTtcbnJldHVybiBwYXJhbS5nZXRWaXNpYmxlVmFsdWUocHJvcG9zZWQpO1xuIH07XG5cbi8qIHNob3VsZCBiZSBleHBvc2VkIHdpdGhpbiBjb250cmFjdHMsIGFuZCBub3QgZXh0ZXJuYWxseSwgZm9yIGludml0YXRpb25zKi9cbmNvbnN0IGdldEludGVybmFsUGFyYW1WYWx1ZT0obmFtZSk9PntcbnJldHVybiBuYW1lc1RvUGFyYW1zLmdldChuYW1lKS5nZXRJbnRlcm5hbFZhbHVlKCk7XG4gfTtcblxuY29uc3QgZ2V0UGFyYW1zPSgpPT57XG4vKiogQHR5cGUge1BhcmFtU3RhdGVSZWNvcmR9ICovXG5jb25zdCBkZXNjcmlwdGlvbnM9e307XG5mb3IoY29uc3RbbmFtZSxwYXJhbV1vZiBuYW1lc1RvUGFyYW1zLmVudHJpZXMoKSl7XG5kZXNjcmlwdGlvbnNbbmFtZV09cGFyYW0ubWFrZURlc2NyaXB0aW9uKCk7XG4gfVxucmV0dXJuIGhhcmRlbihkZXNjcmlwdGlvbnMpO1xuIH07XG5cbi8qKiBAdHlwZSB7VXBkYXRlUGFyYW1zfSAqL1xuY29uc3QgdXBkYXRlUGFyYW1zPWFzeW5jKHBhcmFtQ2hhbmdlcyk9PntcbmNvbnN0IHBhcmFtTmFtZXM9T2JqZWN0LmtleXMocGFyYW1DaGFuZ2VzKTtcblxuLyogcHJvbWlzZXMgdG8gcHJlcGFyZSBldmVyeSB1cGRhdGUqL1xuY29uc3QgYXN5bmNSZXN1bHRzPXBhcmFtTmFtZXMubWFwKChuYW1lKT0+XG5zZXR0ZXJzWyBgcHJlcGFyZVRvVXBkYXRlJHtuYW1lfWBdKHBhcmFtQ2hhbmdlc1tuYW1lXSkpO1xuXG4vKiBpZiBhbnkgdXBkYXRlIGRvZXNuJ3Qgc3VjY2VlZCwgZmFpbCB0aGUgcmVxdWVzdCovXG5jb25zdCBwcmVwYXJlZD1hd2FpdCBQcm9taXNlLmFsbChhc3luY1Jlc3VsdHMpO1xuXG4vKiBhY3R1YWxseSB1cGRhdGUqL1xucGFyYW1OYW1lcy5mb3JFYWNoKChuYW1lLGkpPT57XG5jb25zdCBzZXRGbj1zZXR0ZXJzWyBgdXBkYXRlJHtuYW1lfWBdO1xuc2V0Rm4ocHJlcGFyZWRbaV0pO1xuIH0pO1xucHVibGlzaCgpO1xuIH07XG5cbi8qIENhbGxlZCBhZnRlciBhbGwgcGFyYW1zIGhhdmUgYmVlbiBhZGRlZCB3aXRoIHRoZWlyIGluaXRpYWwgdmFsdWVzKi9cbmNvbnN0IGJ1aWxkPSgpPT57XG5wdWJsaXNoKCk7XG5cbi8qIENSVUNJQUw6IENvbnRyYWN0cyB0aGF0IGNhbGwgYnVpbGRQYXJhbU1hbmFnZXIgc2hvdWxkIG9ubHkgZXhwb3J0IHRoZSovXG4vKiByZXN1bHRpbmcgcGFyYW1NYW5hZ2VyIHRvIHRoZWlyIGNyZWF0b3JGYWNldCwgd2hlcmUgaXQgd2lsbCBiZSBwaWNrZWQgdXAgYnkqL1xuLyogY29udHJhY3RHb3Zlcm5vci4gVGhlIGdldFBhcmFtcyBtZXRob2QgY2FuIGJlIHNoYXJlZCB3aWRlbHkuKi9cbnJldHVybiBGYXIoJ3BhcmFtIG1hbmFnZXInLHtcbmdldFBhcmFtcyxcbmdldFN1YnNjcmlwdGlvbjooKT0+c3Vic2NyaWJlcixcbmdldEFtb3VudDoobmFtZSk9PmdldFR5cGVkUGFyYW0oUGFyYW1UeXBlcy5BTU9VTlQsbmFtZSksXG5nZXRCcmFuZDoobmFtZSk9PmdldFR5cGVkUGFyYW0oUGFyYW1UeXBlcy5CUkFORCxuYW1lKSxcbmdldEluc3RhbmNlOihuYW1lKT0+Z2V0VHlwZWRQYXJhbShQYXJhbVR5cGVzLklOU1RBTkNFLG5hbWUpLFxuZ2V0SW5zdGFsbGF0aW9uOihuYW1lKT0+Z2V0VHlwZWRQYXJhbShQYXJhbVR5cGVzLklOU1RBTExBVElPTixuYW1lKSxcbmdldEludml0YXRpb25BbW91bnQ6KG5hbWUpPT5nZXRUeXBlZFBhcmFtKFBhcmFtVHlwZXMuSU5WSVRBVElPTixuYW1lKSxcbmdldE5hdDoobmFtZSk9PmdldFR5cGVkUGFyYW0oUGFyYW1UeXBlcy5OQVQsbmFtZSksXG5nZXRSYXRpbzoobmFtZSk9PmdldFR5cGVkUGFyYW0oUGFyYW1UeXBlcy5SQVRJTyxuYW1lKSxcbmdldFJlY29yZDoobmFtZSk9PmdldFR5cGVkUGFyYW0oUGFyYW1UeXBlcy5QQVNTQUJMRV9SRUNPUkQsbmFtZSksXG5nZXRTdHJpbmc6KG5hbWUpPT5nZXRUeXBlZFBhcmFtKFBhcmFtVHlwZXMuU1RSSU5HLG5hbWUpLFxuZ2V0VW5rbm93bjoobmFtZSk9PmdldFR5cGVkUGFyYW0oUGFyYW1UeXBlcy5VTktOT1dOLG5hbWUpLFxuZ2V0VmlzaWJsZVZhbHVlLFxuZ2V0SW50ZXJuYWxQYXJhbVZhbHVlLFxuLyogR2V0dGVycyBhbmQgc2V0dGVycyBmb3IgZWFjaCBwYXJhbSB2YWx1ZSovXG4uLi5nZXR0ZXJzLFxudXBkYXRlUGFyYW1zLFxuLyogQ29sbGVjdGlvbiBvZiBhbGwgZ2V0dGVycyBmb3IgcGFzc2luZyB0byByZWFkLW9ubHkgY29udGV4dHMqL1xucmVhZG9ubHk6KCk9PmhhcmRlbihnZXR0ZXJzKX0pO1xuXG4gfTtcblxuLyoqIEB0eXBlIHtQYXJhbU1hbmFnZXJCdWlsZGVyfSAqL1xuY29uc3QgYnVpbGRlcj17XG5hZGRBbW91bnQ6KG4sdik9PmFkZEFtb3VudChuLHYsYnVpbGRlciksXG5hZGRCcmFuZDoobix2KT0+YWRkQnJhbmQobix2LGJ1aWxkZXIpLFxuYWRkSW5zdGFsbGF0aW9uOihuLHYpPT5hZGRJbnN0YWxsYXRpb24obix2LGJ1aWxkZXIpLFxuYWRkSW5zdGFuY2U6KG4sdik9PmFkZEluc3RhbmNlKG4sdixidWlsZGVyKSxcbmFkZFVua25vd246KG4sdik9PmFkZFVua25vd24obix2LGJ1aWxkZXIpLFxuYWRkSW52aXRhdGlvbjoobix2KT0+YWRkSW52aXRhdGlvbihuLHYsYnVpbGRlciksXG5hZGROYXQ6KG4sdik9PmFkZE5hdChuLHYsYnVpbGRlciksXG5hZGRSYXRpbzoobix2KT0+YWRkUmF0aW8obix2LGJ1aWxkZXIpLFxuYWRkUmVjb3JkOihuLHYpPT5hZGRSZWNvcmQobix2LGJ1aWxkZXIpLFxuYWRkU3RyaW5nOihuLHYpPT5hZGRTdHJpbmcobix2LGJ1aWxkZXIpLFxuYnVpbGR9O1xuXG5yZXR1cm4gYnVpbGRlcjtcbiB9OyRo4oCNX29uY2UubWFrZVBhcmFtTWFuYWdlckJ1aWxkZXIobWFrZVBhcmFtTWFuYWdlckJ1aWxkZXIpO1xuXG5oYXJkZW4oYXNzZXJ0RWxlY3RvcmF0ZU1hdGNoZXMpO1xuaGFyZGVuKG1ha2VQYXJhbU1hbmFnZXJCdWlsZGVyKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhc3NlcnRFbGVjdG9yYXRlTWF0Y2hlcyI6WyJhc3NlcnRFbGVjdG9yYXRlTWF0Y2hlcyJdLCJtYWtlUGFyYW1NYW5hZ2VyQnVpbGRlciI6WyJtYWtlUGFyYW1NYW5hZ2VyQnVpbGRlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACbGRK7BxUAAAcVAABFAAAAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjkuMy9zcmMvY29udHJhY3RHb3Zlcm5hbmNlL3R5cGVkUGFyYW1NYW5hZ2VyLmpzeyJpbXBvcnRzIjpbIi4uL2NvbnN0YW50cy5qcyIsIi4vZ292ZXJuUGFyYW0uanMiLCIuL3BhcmFtTWFuYWdlci5qcyJdLCJleHBvcnRzIjpbIm1ha2VQYXJhbU1hbmFnZXIiLCJtYWtlUGFyYW1NYW5hZ2VyRnJvbVRlcm1zIiwibWFrZVBhcmFtTWFuYWdlclN5bmMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgUGFyYW1UeXBlcyxDT05UUkFDVF9FTEVDVE9SQVRFLG1ha2VQYXJhbU1hbmFnZXJCdWlsZGVyOyRo4oCNX2ltcG9ydHMoW1tcIi4uL2NvbnN0YW50cy5qc1wiLCBbW1wiUGFyYW1UeXBlc1wiLCBbJGjigI1fYSA9PiAoUGFyYW1UeXBlcyA9ICRo4oCNX2EpXV1dXSxbXCIuL2dvdmVyblBhcmFtLmpzXCIsIFtbXCJDT05UUkFDVF9FTEVDVE9SQVRFXCIsIFskaOKAjV9hID0+IChDT05UUkFDVF9FTEVDVE9SQVRFID0gJGjigI1fYSldXV1dLFtcIi4vcGFyYW1NYW5hZ2VyLmpzXCIsIFtbXCJtYWtlUGFyYW1NYW5hZ2VyQnVpbGRlclwiLCBbJGjigI1fYSA9PiAobWFrZVBhcmFtTWFuYWdlckJ1aWxkZXIgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5jb25zdHtkZXRhaWxzOlgscXVvdGU6cX09YXNzZXJ0O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8S2V5d29yZCwgUGFyYW1UeXBlPn0gUGFyYW1UeXBlc01hcFxuICovXG4vKipcbiAqIEB0ZW1wbGF0ZSB7UGFyYW1TdGF0ZVJlY29yZH0gTVxuICogQHR5cGVkZWYge3sgW1IgaW4ga2V5b2YgTV06IE1bUl1bJ3R5cGUnXX19IFBhcmFtVHlwZXNNYXBGcm9tUmVjb3JkXG4gKi9cbi8qKlxuICogQHRlbXBsYXRlIHtQYXJhbVR5cGVzTWFwfSBNXG4gKiBAdHlwZWRlZiB7eyBbVCBpbiBrZXlvZiBNXTogeyB0eXBlOiBNW1RdLCB2YWx1ZTogUGFyYW1WYWx1ZUZvclR5cGU8TVtUXT4gfSB9fSBQYXJhbVJlY29yZHNGcm9tVHlwZXNcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7UGFyYW1UeXBlc01hcH0gTVxuICogQHR5cGVkZWYge3tcbiAqICAgW0sgaW4ga2V5b2YgTSBhcyBgZ2V0JHtzdHJpbmcgJiBLfWBdOiAoKSA9PiBQYXJhbVZhbHVlRm9yVHlwZTxNW0tdPlxuICogfX0gR2V0dGVyc1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtQYXJhbVR5cGVzTWFwfSBUXG4gKiBAdHlwZWRlZiB7e1xuICogICBbSyBpbiBrZXlvZiBUIGFzIGB1cGRhdGUke3N0cmluZyAmIEt9YF06ICh2YWx1ZTogUGFyYW1WYWx1ZUZvclR5cGU8VFtLXT4pID0+IHZvaWRcbiAqIH19IFVwZGF0ZXJzXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge1BhcmFtVHlwZXNNYXB9IE1cbiAqIEB0eXBlZGVmIHtQYXJhbU1hbmFnZXJCYXNlICYgR2V0dGVyczxNPiAmIFVwZGF0ZXJzPE0+ICYge3JlYWRvbmx5OiAoKSA9PiBHZXR0ZXJzPE0+fSAmIHt1cGRhdGVQYXJhbXM6IFVwZGF0ZVBhcmFtc319IFR5cGVkUGFyYW1NYW5hZ2VyXG4gKi9cblxuLyoqXG4gKiBAcGFyYW0ge1BhcmFtVHlwZX0gdHlwZVxuICovXG5jb25zdCBidWlsZGVyTWV0aG9kTmFtZT0odHlwZSk9PlxuIGBhZGQke3R5cGVbMF0udG9VcHBlckNhc2UoKSt0eXBlLnN1YnN0cmluZygxKX1gO1xuXG4vKiogQHR5cGUge1BhcnRpYWw8UmVjb3JkPFBhcmFtVHlwZSwgYm9vbGVhbj4+fSAqL1xuY29uc3QgaXNBc3luYz17XG5pbnZpdGF0aW9uOnRydWV9O1xuXG5cbi8qKlxuICogQHRlbXBsYXRlIHtQYXJhbVR5cGV9IFRcbiAqIEB0eXBlZGVmIHtbdHlwZTogVCwgdmFsdWU6IFBhcmFtVmFsdWVGb3JUeXBlPFQ+XX0gU1QgcGFyYW0gc3BlYyB0dXBsZVxuICovXG5cbi8qIFhYWCBiZXR0ZXIgdG8gdXNlIHRoZSBtYW5pZmVzdCBjb25zdGFudCBQYXJhbVR5cGVzKi9cbi8qIGJ1dCBpbXBvcnRpbmcgdGhhdCBoZXJlIHR1cm5zIHRoaXMgZmlsZSBpbnRvIGEgbW9kdWxlLCovXG4vKiBicmVha2luZyB0aGUgYW1iaWVudCB0eXBpbmcqL1xuLyoqXG4gKiBAdHlwZWRlZiB7U1Q8J2Ftb3VudCc+XG4gKiB8IFNUPCdicmFuZCc+XG4gKiB8IFNUPCdpbnN0YWxsYXRpb24nPlxuICogfCBTVDwnaW5zdGFuY2UnPlxuICogfCBTVDwnbmF0Jz5cbiAqIHwgU1Q8J3JhdGlvJz5cbiAqIHwgU1Q8J3N0cmluZyc+XG4gKiB8IFNUPCd1bmtub3duJz59IFN5bmNTcGVjVHVwbGVcbiAqXG4gKiBAdHlwZWRlZiB7WydpbnZpdGF0aW9uJywgSW52aXRhdGlvbl19IEFzeW5jU3BlY1R1cGxlXG4gKi9cblxuLyoqXG4gKiBAc2VlIG1ha2VQYXJhbU1hbmFnZXJTeW5jXG4gKiBAdGVtcGxhdGUge1JlY29yZDxLZXl3b3JkLCBBc3luY1NwZWNUdXBsZSB8IFN5bmNTcGVjVHVwbGU+fSBUXG4gKiBAcGFyYW0ge1hpbXBvcnQoJ0BhZ29yaWMvbm90aWZpZXInKS5TdG9yZWRQdWJsaXNoZXJLaXQ8R292ZXJuYW5jZVN1YnNjcmlwdGlvblN0YXRlPn0gcHVibGlzaGVyS2l0XG4gKiBAcGFyYW0ge1R9IHNwZWNcbiAqIEBwYXJhbSB7RVJlZjxab2VTZXJ2aWNlPn0gem9lXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxUeXBlZFBhcmFtTWFuYWdlcjx7W0sgaW4ga2V5b2YgVF06IFRbS11bMF19Pj59XG4gKi9cbmNvbnN0IG1ha2VQYXJhbU1hbmFnZXI9YXN5bmMocHVibGlzaGVyS2l0LHNwZWMsem9lKT0+e1xuY29uc3QgYnVpbGRlcj1tYWtlUGFyYW1NYW5hZ2VyQnVpbGRlcihwdWJsaXNoZXJLaXQsem9lKTtcblxuY29uc3QgcHJvbWlzZXM9W107XG5mb3IoY29uc3RbbmFtZSxbdHlwZSx2YWx1ZV1db2YgT2JqZWN0LmVudHJpZXMoc3BlYykpe1xuY29uc3QgYWRkPWJ1aWxkZXJbYnVpbGRlck1ldGhvZE5hbWUodHlwZSldO1xuaWYoaXNBc3luY1t0eXBlXSl7XG5wcm9taXNlcy5wdXNoKGFkZChuYW1lLHZhbHVlKSk7XG4gfWVsc2V7XG5hZGQobmFtZSx2YWx1ZSk7XG4gfVxuIH1cbmF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcblxuLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0Ki9cbnJldHVybiBidWlsZGVyLmJ1aWxkKCk7XG4gfTtcblxuLyoqXG4gKiBVc2VkIG9ubHkgd2hlbiB0aGUgY29udHJhY3QgaGFzIG11bHRpcGxlIHBhcmFtIG1hbmFnZXJzLlxuICogRXhhY3RseSBvbmUgbXVzdCBtYW5hZ2UgdGhlIGVsZWN0b3JhdGUsIHdoaWNoIHJlcXVpcmVzIHRoZSBhc3luYyB2ZXJzaW9uLlxuICpcbiAqIEBzZWUgbWFrZVBhcmFtTWFuYWdlclxuICogQHRlbXBsYXRlIHtSZWNvcmQ8S2V5d29yZCwgU3luY1NwZWNUdXBsZT59IFRcbiAqIEBwYXJhbSB7WGltcG9ydCgnQGFnb3JpYy9ub3RpZmllcicpLlN0b3JlZFB1Ymxpc2hlcktpdDxHb3Zlcm5hbmNlU3Vic2NyaXB0aW9uU3RhdGU+fSBwdWJsaXNoZXJLaXRcbiAqIEBwYXJhbSB7VH0gc3BlY1xuICogQHJldHVybnMge1R5cGVkUGFyYW1NYW5hZ2VyPHtbSyBpbiBrZXlvZiBUXTogVFtLXVswXX0+fVxuICovJGjigI1fb25jZS5tYWtlUGFyYW1NYW5hZ2VyKG1ha2VQYXJhbU1hbmFnZXIpO1xuY29uc3QgbWFrZVBhcmFtTWFuYWdlclN5bmM9KHB1Ymxpc2hlcktpdCxzcGVjKT0+e1xuY29uc3QgYnVpbGRlcj1tYWtlUGFyYW1NYW5hZ2VyQnVpbGRlcihwdWJsaXNoZXJLaXQpO1xuXG5mb3IoY29uc3RbbmFtZSxbdHlwZSx2YWx1ZV1db2YgT2JqZWN0LmVudHJpZXMoc3BlYykpe1xuY29uc3QgYWRkPWJ1aWxkZXJbYnVpbGRlck1ldGhvZE5hbWUodHlwZSldO1xuYXNzZXJ0KGFkZCxYIGBObyBidWlsZGVyIG1ldGhvZCBmb3IgcGFyYW0gdHlwZSAke3EodHlwZSl9YCk7XG5hZGQobmFtZSx2YWx1ZSk7XG4gfVxuXG4vKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xucmV0dXJuIGJ1aWxkZXIuYnVpbGQoKTtcbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7UGFyYW1UeXBlc01hcH0gTSBNYXAgb2YgdHlwZXMgb2YgY3VzdG9tIGdvdmVybmVkIHRlcm1zXG4gKiBAcGFyYW0ge1hpbXBvcnQoJ0BhZ29yaWMvbm90aWZpZXInKS5TdG9yZWRQdWJsaXNoZXJLaXQ8R292ZXJuYW5jZVN1YnNjcmlwdGlvblN0YXRlPn0gcHVibGlzaGVyS2l0XG4gKiBAcGFyYW0ge1pDRjxHb3Zlcm5hbmNlVGVybXM8TT4+fSB6Y2ZcbiAqIEBwYXJhbSB7UGF5bWVudH0gaW5pdGlhbFBvc2VySW52aXRhdGlvblxuICogQHBhcmFtIHtNfSBwYXJhbVR5cGVzTWFwXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxUeXBlZFBhcmFtTWFuYWdlcjxNICYge0VsZWN0b3JhdGU6ICdpbnZpdGF0aW9uJ30+Pn1cbiAqLyRo4oCNX29uY2UubWFrZVBhcmFtTWFuYWdlclN5bmMobWFrZVBhcmFtTWFuYWdlclN5bmMpO1xuY29uc3QgbWFrZVBhcmFtTWFuYWdlckZyb21UZXJtcz1hc3luYyhcbnB1Ymxpc2hlcktpdCxcbnpjZixcbmluaXRpYWxQb3Nlckludml0YXRpb24sXG5wYXJhbVR5cGVzTWFwKT0+XG57XG5jb25zdHtnb3Zlcm5lZFBhcmFtc309emNmLmdldFRlcm1zKCk7XG4vKiogQHR5cGUge0FycmF5PFtLZXl3b3JkLCBTeW5jU3BlY1R1cGxlIHwgQXN5bmNTcGVjVHVwbGVdPn0gKi9cbmNvbnN0IG1ha2VyU3BlY0VudHJpZXM9T2JqZWN0LmVudHJpZXMocGFyYW1UeXBlc01hcCkubWFwKFxuKFtwYXJhbUtleSxwYXJhbVR5cGVdKT0+W1xucGFyYW1LZXksXG4vKiogQHR5cGUge1N5bmNTcGVjVHVwbGV9ICovW1xucGFyYW1UeXBlLFxuZ292ZXJuZWRQYXJhbXNbcGFyYW1LZXldLnZhbHVlXV0pO1xuXG5cblxuLyogRXZlcnkgZ292ZXJuZWQgY29udHJhY3QgaGFzIGFuIEVsZWN0b3JhdGUgcGFyYW0gdGhhdCBzdGFydHMgYXMgYGluaXRpYWxQb3Nlckludml0YXRpb25gIHByaXZhdGUgYXJnKi9cbm1ha2VyU3BlY0VudHJpZXMucHVzaChbXG5DT05UUkFDVF9FTEVDVE9SQVRFLFxuW1BhcmFtVHlwZXMuSU5WSVRBVElPTixpbml0aWFsUG9zZXJJbnZpdGF0aW9uXV0pO1xuXG4vKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xucmV0dXJuIG1ha2VQYXJhbU1hbmFnZXIoXG5wdWJsaXNoZXJLaXQsXG5PYmplY3QuZnJvbUVudHJpZXMobWFrZXJTcGVjRW50cmllcyksXG56Y2YuZ2V0Wm9lU2VydmljZSgpKTtcblxuIH07JGjigI1fb25jZS5tYWtlUGFyYW1NYW5hZ2VyRnJvbVRlcm1zKG1ha2VQYXJhbU1hbmFnZXJGcm9tVGVybXMpO1xuXG5oYXJkZW4obWFrZVBhcmFtTWFuYWdlcik7XG5oYXJkZW4obWFrZVBhcmFtTWFuYWdlclN5bmMpO1xuaGFyZGVuKG1ha2VQYXJhbU1hbmFnZXJGcm9tVGVybXMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VQYXJhbU1hbmFnZXIiOlsibWFrZVBhcmFtTWFuYWdlciJdLCJtYWtlUGFyYW1NYW5hZ2VyU3luYyI6WyJtYWtlUGFyYW1NYW5hZ2VyU3luYyJdLCJtYWtlUGFyYW1NYW5hZ2VyRnJvbVRlcm1zIjpbIm1ha2VQYXJhbU1hbmFnZXJGcm9tVGVybXMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAALkHoXz8sAAA/LAAAMQAAAEBhZ29yaWMvZ292ZXJuYW5jZS12MC45LjMvc3JjL2NvbnRyYWN0R292ZXJub3IuanN7ImltcG9ydHMiOlsiLi9jb250cmFjdEdvdmVybmFuY2UvZ292ZXJuQXBpLmpzIiwiLi9jb250cmFjdEdvdmVybmFuY2UvZ292ZXJuRmlsdGVyLmpzIiwiLi9jb250cmFjdEdvdmVybmFuY2UvZ292ZXJuUGFyYW0uanMiLCIuL3R5cGVHdWFyZHMuanMiLCJAYWdvcmljL3N0b3JlIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJzdGFydCIsInZhbGlkYXRlUXVlc3Rpb25EZXRhaWxzIiwidmFsaWRhdGVRdWVzdGlvbkZyb21Db3VudGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEUsRmFyLGZpdCxDT05UUkFDVF9FTEVDVE9SQVRFLHNldHVwUGFyYW1Hb3Zlcm5hbmNlLHNldHVwQXBpR292ZXJuYW5jZSxzZXR1cEZpbHRlckdvdmVybmFuY2UsUGFyYW1DaGFuZ2VzUXVlc3Rpb25EZXRhaWxzU2hhcGU7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJmaXRcIiwgWyRo4oCNX2EgPT4gKGZpdCA9ICRo4oCNX2EpXV1dXSxbXCIuL2NvbnRyYWN0R292ZXJuYW5jZS9nb3Zlcm5QYXJhbS5qc1wiLCBbW1wiQ09OVFJBQ1RfRUxFQ1RPUkFURVwiLCBbJGjigI1fYSA9PiAoQ09OVFJBQ1RfRUxFQ1RPUkFURSA9ICRo4oCNX2EpXV0sW1wic2V0dXBQYXJhbUdvdmVybmFuY2VcIiwgWyRo4oCNX2EgPT4gKHNldHVwUGFyYW1Hb3Zlcm5hbmNlID0gJGjigI1fYSldXV1dLFtcIi4vY29udHJhY3RHb3Zlcm5hbmNlL2dvdmVybkFwaS5qc1wiLCBbW1wic2V0dXBBcGlHb3Zlcm5hbmNlXCIsIFskaOKAjV9hID0+IChzZXR1cEFwaUdvdmVybmFuY2UgPSAkaOKAjV9hKV1dXV0sW1wiLi9jb250cmFjdEdvdmVybmFuY2UvZ292ZXJuRmlsdGVyLmpzXCIsIFtbXCJzZXR1cEZpbHRlckdvdmVybmFuY2VcIiwgWyRo4oCNX2EgPT4gKHNldHVwRmlsdGVyR292ZXJuYW5jZSA9ICRo4oCNX2EpXV1dXSxbXCIuL3R5cGVHdWFyZHMuanNcIiwgW1tcIlBhcmFtQ2hhbmdlc1F1ZXN0aW9uRGV0YWlsc1NoYXBlXCIsIFskaOKAjV9hID0+IChQYXJhbUNoYW5nZXNRdWVzdGlvbkRldGFpbHNTaGFwZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdHtkZXRhaWxzOlh9PWFzc2VydDtcblxuLyoqXG4gKiBWYWxpZGF0ZSB0aGF0IHRoZSBxdWVzdGlvbiBkZXRhaWxzIGNvcnJlc3BvbmQgdG8gYSBwYXJhbWV0ZXIgY2hhbmdlIHF1ZXN0aW9uXG4gKiB0aGF0IHRoZSBlbGVjdG9yYXRlIGhvc3RzLCBhbmQgdGhhdCB0aGUgdm90ZUNvdW50ZXIgYW5kIG90aGVyIGRldGFpbHMgYXJlXG4gKiBjb25zaXN0ZW50IHdpdGggaXQuXG4gKlxuICogQHBhcmFtIHtFUmVmPFpvZVNlcnZpY2U+fSB6b2VcbiAqIEBwYXJhbSB7SW5zdGFuY2V9IGVsZWN0b3JhdGVcbiAqIEBwYXJhbSB7UGFyYW1DaGFuZ2VJc3N1ZURldGFpbHN9IGRldGFpbHNcbiAqL1xuY29uc3QgdmFsaWRhdGVRdWVzdGlvbkRldGFpbHM9YXN5bmMoem9lLGVsZWN0b3JhdGUsZGV0YWlscyk9PntcbmNvbnN0e1xuY291bnRlckluc3RhbmNlLFxuaXNzdWU6e2NvbnRyYWN0OmdvdmVybmVkSW5zdGFuY2V9fT1cbmRldGFpbHM7XG5maXQoZGV0YWlscyxQYXJhbUNoYW5nZXNRdWVzdGlvbkRldGFpbHNTaGFwZSk7XG5cbmNvbnN0IGdvdmVybm9ySW5zdGFuY2U9YXdhaXQgRS5nZXQoRSh6b2UpLmdldFRlcm1zKGdvdmVybmVkSW5zdGFuY2UpKS5cbmVsZWN0aW9uTWFuYWdlcjtcbi8qKiBAdHlwZSB7UHJvbWlzZTxHb3Zlcm5vclB1YmxpYz59ICovXG5jb25zdCBnb3Zlcm5vclB1YmxpYz1FKHpvZSkuZ2V0UHVibGljRmFjZXQoZ292ZXJub3JJbnN0YW5jZSk7XG5cbnJldHVybiBQcm9taXNlLmFsbChbXG5FKGdvdmVybm9yUHVibGljKS52YWxpZGF0ZVZvdGVDb3VudGVyKGNvdW50ZXJJbnN0YW5jZSksXG5FKGdvdmVybm9yUHVibGljKS52YWxpZGF0ZUVsZWN0b3JhdGUoZWxlY3RvcmF0ZSksXG5FKGdvdmVybm9yUHVibGljKS52YWxpZGF0ZVRpbWVyKGRldGFpbHMuY2xvc2luZ1J1bGUpXSk7XG5cbiB9O1xuXG4vKipcbiAqIFZhbGlkYXRlIHRoYXQgdGhlIHF1ZXN0aW9ucyBjb3VudGVkIGJ5IHRoZSB2b3RlQ291bnRlciBjb3JyZXNwb25kIHRvIGFcbiAqIHBhcmFtZXRlciBjaGFuZ2UgcXVlc3Rpb24gdGhhdCB0aGUgZWxlY3RvcmF0ZSBob3N0cywgYW5kIHRoYXQgdGhlXG4gKiB2b3RlQ291bnRlciBhbmQgb3RoZXIgZGV0YWlscyBhcmUgY29uc2lzdGVudC5cbiAqXG4gKiBAcGFyYW0ge0VSZWY8Wm9lU2VydmljZT59IHpvZVxuICogQHBhcmFtIHtJbnN0YW5jZX0gZWxlY3RvcmF0ZVxuICogQHBhcmFtIHtJbnN0YW5jZX0gdm90ZUNvdW50ZXJcbiAqLyRo4oCNX29uY2UudmFsaWRhdGVRdWVzdGlvbkRldGFpbHModmFsaWRhdGVRdWVzdGlvbkRldGFpbHMpO1xuY29uc3QgdmFsaWRhdGVRdWVzdGlvbkZyb21Db3VudGVyPWFzeW5jKHpvZSxlbGVjdG9yYXRlLHZvdGVDb3VudGVyKT0+e1xuY29uc3QgY291bnRlclB1YmxpY1A9RSh6b2UpLmdldFB1YmxpY0ZhY2V0KHZvdGVDb3VudGVyKTtcbmNvbnN0IHF1ZXN0aW9uRGV0YWlscz1hd2FpdCBFKGNvdW50ZXJQdWJsaWNQKS5nZXREZXRhaWxzKCk7XG5cbnJldHVybiB2YWxpZGF0ZVF1ZXN0aW9uRGV0YWlscyh6b2UsZWxlY3RvcmF0ZSxxdWVzdGlvbkRldGFpbHMpO1xuIH07XG5cbi8qKlxuICogQHR5cGVkZWYge1N0YW5kYXJkVGVybXN9IENvbnRyYWN0R292ZXJub3JUZXJtc1xuICogQHByb3BlcnR5IHtUaW1lclNlcnZpY2V9IHRpbWVyXG4gKiBAcHJvcGVydHkge0luc3RhbGxhdGlvbn0gZ292ZXJuZWRDb250cmFjdEluc3RhbGxhdGlvblxuICovXG5cbi8qKlxuICogQ29udHJhY3RHb3Zlcm5vciBpcyBhbiBFbGVjdGlvbk1hbmFnZXIgdGhhdCBzdGFydHMgdXAgYSBjb250cmFjdCBhbmQgaGFuZHNcbiAqIGl0cyBvd24gY3JlYXRvciBhIGZhY2V0IHRoYXQgYWxsb3dzIHRoZW0gdG8gbWFuYWdlIHRoYXQgY29udHJhY3QncyBBUElzLFxuICogb2ZmZXIgZmlsdGVycywgYW5kIHBhcmFtZXRlcnMuXG4gKlxuICogVGhlIHRlcm1zIGZvciB0aGlzIGNvbnRyYWN0IGluY2x1ZGUgdGhlIFRpbWVyLCBhbmQgdGhlIEluc3RhbGxhdGlvbiB0byBiZVxuICogc3RhcnRlZCwgYXMgd2VsbCBhcyBhbiBpc3N1ZXJLZXl3b3JkUmVjb3JkIG9yIHRlcm1zIG5lZWRlZCBieSB0aGUgZ292ZXJuZWRcbiAqIGNvbnRyYWN0LiBUaG9zZSBkZXRhaWxzIGZvciB0aGUgZ292ZXJuZWQgY29udHJhY3QgYXJlIGluY2x1ZGVkIGluIHRoaXNcbiAqIGNvbnRyYWN0J3MgdGVybXMgYXMgYSBcImdvdmVybmVkXCIgcmVjb3JkLiBJZiB0aGUgY29udHJhY3QgZXhwZWN0cyBwcml2YXRlQXJncyxcbiAqIHRob3NlIHdpbGwgYmUgcHJvdmlkZWQgaW4gdGhpcyBjb250cmFjdCdzIGBwcml2YXRlQXJnc2AgdW5kZXIgJ2dvdmVybmVkOicuXG4gKlxuICogdGVybXMgPSB7XG4gKiAgICB0aW1lcixcbiAqICAgIGdvdmVybmVkQ29udHJhY3RJbnN0YWxsYXRpb24sXG4gKiAgICBnb3Zlcm5lZDogeyBpc3N1ZXJLZXl3b3JkUmVjb3JkLCB0ZXJtcyB9LFxuICogfTtcbiAqXG4gKiBUaGUgZWxlY3RvcmF0ZSB0aGF0IHdpbGwgdm90ZSBvbiBnb3Zlcm5hbmNlIHF1ZXN0aW9ucyBpcyBpdHNlbGYgYSBnb3Zlcm5lZFxuICogcGFyYW1ldGVyLiBJdHMgdmFsdWUgaXMgYXZhaWxhYmxlIGZyb20gdGhlIHB1YmxpY0ZhY2V0IHVzaW5nXG4gKiBnZXRFbGVjdG9yYXRlSW5zdGFuY2UoKS4gV2hlbiBjcmVhdGluZyBuZXcgcXVlc3Rpb25zLCB3ZSB1c2VcbiAqIGdldFVwZGF0ZWRQb3NlckZhY2V0KCkgdG8gaW5mb3JtIHRoZSBlbGVjdG9yYXRlIGFib3V0IHRoZSBuZXcgcXVlc3Rpb24uXG4gKlxuICogVGhlIGdvdmVybmVkQ29udHJhY3QgaXMgcmVzcG9uc2libGUgZm9yIHN1cHBseWluZyBnZXRQYXJhbU1nclJldHJpZXZlcigpIGluXG4gKiBpdHMgY3JlYXRvckZhY2V0LiBnZXRQYXJhbU1nclJldHJpZXZlcigpIHRha2VzIGEgUGFyYW1TcGVjaWZpY2F0aW9uLCB3aGljaFxuICogaWRlbnRpZmllcyB0aGUgcGFyYW1ldGVyIHRvIGJlIHZvdGVkIG9uLiBBIG1pbmltYWwgUGFyYW1TcGVjaWZpY2F0aW9uXG4gKiBzcGVjaWZpZXMgdGhlIGtleSB3aGljaCBpZGVudGlmaWVzIGEgcGFydGljdWxhciBwYXJhbU1hbmFnZXIgKGV2ZW4gaWYgdGhlcmUnc1xuICogb25seSBvbmUpIGFuZCB0aGUgcGFyYW1ldGVyTmFtZS4gVGhlIGludGVycHJldGF0aW9uIG9mIFBhcmFtU3BlY2lmaWNhdGlvbiBpc1xuICogdXAgdG8gdGhlIGNvbnRyYWN0LlxuICpcbiAqIFRoZSBjb250cmFjdEdvdmVybm9yIGNyZWF0b3JGYWNldCBpbmNsdWRlcyBgdm90ZU9uUGFyYW1DaGFuZ2VzYCxcbiAqIGB2b3RlT25GaWx0ZXJgLCBhbmQgYHZvdGVPbkFwaUludm9jYXRpb25gLiBgdm90ZU9uUGFyYW1DaGFuZ2VzYCBpcyB1c2VkIHRvXG4gKiBjcmVhdGUgcXVlc3Rpb25zIHRoYXQgd2lsbCBhdXRvbWF0aWNhbGx5IHVwZGF0ZSBjb250cmFjdCBwYXJhbWV0ZXJzIGlmXG4gKiBwYXNzZWQuIGB2b3RlT25GaWx0ZXJgIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBxdWVzdGlvbnMgdGhhdCB3aWxsIHByZXZlbnQgdGhlXG4gKiBleGVyY2lzZSBvZiBjZXJ0YWluIGludml0YXRpb25zIGlmIHBhc3NlZC4gYHZvdGVPbkFwaUludm9jYXRpb25gIGNyZWF0ZXNcbiAqIHF1ZXN0aW9ucyB0aGF0IHdpbGwgaW52b2tlIHByZS1kZWZpbmVkIEFQSXMgaW4gdGhlIGNvbnRyYWN0LlxuICpcbiAqIFRoaXMgZmFjZXQgd2lsbCB1c3VhbGx5IGJlIGNsb3NlbHkgaGVsZC4gVGhlIGNyZWF0b3JGYWNldCBjYW4gYWxzbyBiZSB1c2VkIHRvXG4gKiByZXRyaWV2ZSB0aGUgZ292ZXJuZWQgaW5zdGFuY2UsIHB1YmxpY0ZhY2V0LCBhbmQgaXRzIGNyZWF0b3JGYWNldCB3aXRoXG4gKiB0aGUgdm90ZU9uKigpIG1ldGhvZHMgb21pdHRlZC5cbiAqXG4gKiBUaGUgZ292ZXJuZWQgY29udHJhY3QncyB0ZXJtcyBpbmNsdWRlIHRoZSBpbnN0YW5jZSBvZiB0aGlzIChnb3Zlcm5pbmcpXG4gKiBjb250cmFjdCAoYXMgZWxlY3Rpb25NYW5hZ2VyKSBzbyBjbGllbnRzIHdpbGwgYmUgYWJsZSB0byBsb29rIHVwIHRoZSBzdGF0ZVxuICogb2YgdGhlIGdvdmVybmVkIHBhcmFtZXRlcnMuXG4gKlxuICogdGVtcGxhdGUge3t9fSBQRiBQdWJsaWMgZmFjZXQgb2YgZ292ZXJuZWRcbiAqIHRlbXBsYXRlIHtDb250cmFjdFBvd2VyZnVsQ3JlYXRvckZhY2V0fSBDRiBDcmVhdG9yIGZhY2V0IG9mIGdvdmVybmVkXG4gKiB0eXBlIHtDb250cmFjdFN0YXJ0Rm48XG4gKiBHb3Zlcm5vclB1YmxpYyxcbiAqIEdvdmVybmVkQ29udHJhY3RGYWNldEFjY2VzczxQRixDRj4sXG4gKiB7XG4gKiAgIHRpbWVyOiBUaW1lclNlcnZpY2UsXG4gKiAgIGdvdmVybmVkQ29udHJhY3RJbnN0YWxsYXRpb246IEluc3RhbGxhdGlvbjxDRj4sXG4gKiAgIGdvdmVybmVkOiB7XG4gKiAgICAgaXNzdWVyS2V5d29yZFJlY29yZDogSXNzdWVyS2V5d29yZFJlY29yZCxcbiAqICAgICB0ZXJtczoge2dvdmVybmVkUGFyYW1zOiB7W0NPTlRSQUNUX0VMRUNUT1JBVEVdOiBBbW91bnQ8J3NldCc+fX0sXG4gKiAgICAgcHJpdmF0ZUFyZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICogICB9XG4gKiB9Pn1cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7KCkgPT4ge2NyZWF0b3JGYWNldDogR292ZXJub3JGYWNldDxhbnk+LCBwdWJsaWNGYWNldDogR292ZXJuZWRQdWJsaWNGYWNldE1ldGhvZHN9IH0gU0YgU3RhcnQgZnVuY3Rpb24gb2YgZ292ZXJuZWQgY29udHJhY3RcbiAqIEBwYXJhbSB7WkNGPHtcbiAqICAgdGltZXI6IFRpbWVyU2VydmljZSxcbiAqICAgZ292ZXJuZWRDb250cmFjdEluc3RhbGxhdGlvbjogSW5zdGFsbGF0aW9uPFNGPixcbiAqICAgZ292ZXJuZWQ6IHtcbiAqICAgICBpc3N1ZXJLZXl3b3JkUmVjb3JkOiBJc3N1ZXJLZXl3b3JkUmVjb3JkLFxuICogICAgIHRlcm1zOiB7Z292ZXJuZWRQYXJhbXM6IHtbQ09OVFJBQ1RfRUxFQ1RPUkFURV06IEFtb3VudDwnc2V0Jz59fSxcbiAqICAgICBwcml2YXRlQXJnczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gKiAgIH1cbiAqIH0+fSB6Y2ZcbiAqIEBwYXJhbSB7e1xuICogICBnb3Zlcm5lZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAqIH19IHByaXZhdGVBcmdzXG4gKi8kaOKAjV9vbmNlLnZhbGlkYXRlUXVlc3Rpb25Gcm9tQ291bnRlcih2YWxpZGF0ZVF1ZXN0aW9uRnJvbUNvdW50ZXIpO1xuY29uc3Qgc3RhcnQ9YXN5bmMoemNmLHByaXZhdGVBcmdzKT0+e1xuY29uc3Qgem9lPXpjZi5nZXRab2VTZXJ2aWNlKCk7XG5jb25zdHtcbnRpbWVyLFxuZ292ZXJuZWRDb250cmFjdEluc3RhbGxhdGlvbixcbmdvdmVybmVkOntcbmlzc3VlcktleXdvcmRSZWNvcmQ6Z292ZXJuZWRJc3N1ZXJLZXl3b3JkUmVjb3JkLFxudGVybXM6Y29udHJhY3RUZXJtc319PVxuXG56Y2YuZ2V0VGVybXMoKTtcbmNvbnRyYWN0VGVybXMuZ292ZXJuZWRQYXJhbXNbQ09OVFJBQ1RfRUxFQ1RPUkFURV18fFxuYXNzZXJ0LmZhaWwoXG5YIGBDb250cmFjdCBtdXN0IGRlY2xhcmUgJHtDT05UUkFDVF9FTEVDVE9SQVRFfSBhcyBhIGdvdmVybmVkIHBhcmFtZXRlcmApO1xuXG5cbmNvbnN0IGF1Z21lbnRlZFRlcm1zPWhhcmRlbih7XG4uLi5jb250cmFjdFRlcm1zLFxuZWxlY3Rpb25NYW5hZ2VyOnpjZi5nZXRJbnN0YW5jZSgpfSk7XG5cblxuY29uc3R7XG5jcmVhdG9yRmFjZXQ6Z292ZXJuZWRDRixcbmluc3RhbmNlOmdvdmVybmVkSW5zdGFuY2UsXG5wdWJsaWNGYWNldDpnb3Zlcm5lZFBGLFxuYWRtaW5GYWNldH09XG5hd2FpdCBFKHpvZSkuc3RhcnRJbnN0YW5jZShcbmdvdmVybmVkQ29udHJhY3RJbnN0YWxsYXRpb24sXG5nb3Zlcm5lZElzc3VlcktleXdvcmRSZWNvcmQsXG4vKiBAdHMtZXhwZWN0LWVycm9yIFhYWCBnb3Zlcm5hbmNlIHR5cGVzKi9cbmF1Z21lbnRlZFRlcm1zLFxucHJpdmF0ZUFyZ3MuZ292ZXJuZWQpO1xuXG5cbi8qKiBAdHlwZSB7KCkgPT4gUHJvbWlzZTxJbnN0YW5jZT59ICovXG5jb25zdCBnZXRFbGVjdG9yYXRlSW5zdGFuY2U9YXN5bmMoKT0+e1xuY29uc3QgaW52aXRhdGlvbkFtb3VudD1hd2FpdCBFKGdvdmVybmVkUEYpLmdldEludml0YXRpb25BbW91bnQoXG5DT05UUkFDVF9FTEVDVE9SQVRFKTtcblxucmV0dXJuIGludml0YXRpb25BbW91bnQudmFsdWVbMF0uaW5zdGFuY2U7XG4gfTtcblxuLyogQ1JVQ0lBTDogb25seSBjb250cmFjdEdvdmVybm9yIHNob3VsZCBnZXQgdGhlIGFiaWxpdHkgdG8gdXBkYXRlIHBhcmFtcyovXG5jb25zdCBsaW1pdGVkQ3JlYXRvckZhY2V0PUUoZ292ZXJuZWRDRikuZ2V0TGltaXRlZENyZWF0b3JGYWNldCgpO1xuXG5sZXQgY3VycmVudEludml0YXRpb247XG5sZXQgcG9zZXJGYWNldDtcbi8qKiBAdHlwZSB7KCkgPT4gUHJvbWlzZTxQb3NlckZhY2V0Pn0gKi9cbmNvbnN0IGdldFVwZGF0ZWRQb3NlckZhY2V0PWFzeW5jKCk9PntcbmNvbnN0IG5ld0ludml0YXRpb249YXdhaXQgRShcbkUoRShnb3Zlcm5lZENGKS5nZXRQYXJhbU1nclJldHJpZXZlcigpKS5nZXQoe2tleTonZ292ZXJuZWRQYXJhbXMnfSkpLlxuZ2V0SW50ZXJuYWxQYXJhbVZhbHVlKENPTlRSQUNUX0VMRUNUT1JBVEUpO1xuXG5pZihuZXdJbnZpdGF0aW9uIT09Y3VycmVudEludml0YXRpb24pe1xucG9zZXJGYWNldD1FKEUoem9lKS5vZmZlcihuZXdJbnZpdGF0aW9uKSkuZ2V0T2ZmZXJSZXN1bHQoKTtcbmN1cnJlbnRJbnZpdGF0aW9uPW5ld0ludml0YXRpb247XG4gfVxucmV0dXJuIHBvc2VyRmFjZXQ7XG4gfTtcbmF3YWl0IGdldFVwZGF0ZWRQb3NlckZhY2V0KCk7XG5hc3NlcnQocG9zZXJGYWNldCwncXVlc3Rpb24gcG9zZXIgZmFjZXQgbXVzdCBiZSBpbml0aWFsaXplZCcpO1xuXG4vKiBBbGwgZ292ZXJuZWQgY29udHJhY3RzIGhhdmUgYXQgbGVhc3QgYSBnb3Zlcm5lZCBlbGVjdG9yYXRlKi9cbmNvbnN0e3ZvdGVPblBhcmFtQ2hhbmdlcyxjcmVhdGVkUXVlc3Rpb246Y3JlYXRlZFBhcmFtUXVlc3Rpb259PVxuYXdhaXQgc2V0dXBQYXJhbUdvdmVybmFuY2UoXG56b2UsXG5FKGdvdmVybmVkQ0YpLmdldFBhcmFtTWdyUmV0cmlldmVyKCksXG5nb3Zlcm5lZEluc3RhbmNlLFxudGltZXIsXG5nZXRVcGRhdGVkUG9zZXJGYWNldCk7XG5cblxuY29uc3R7dm90ZU9uRmlsdGVyLGNyZWF0ZWRGaWx0ZXJRdWVzdGlvbn09YXdhaXQgc2V0dXBGaWx0ZXJHb3Zlcm5hbmNlKFxuem9lLFxuZ292ZXJuZWRJbnN0YW5jZSxcbnRpbWVyLFxuZ2V0VXBkYXRlZFBvc2VyRmFjZXQsXG5nb3Zlcm5lZENGKTtcblxuXG4vKipcbiAqIEBwYXJhbSB7SW52aXRhdGlvbn0gcG9zZXJJbnZpdGF0aW9uXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAqL1xuY29uc3QgcmVwbGFjZUVsZWN0b3JhdGU9KHBvc2VySW52aXRhdGlvbik9Pntcbi8qKiBAdHlwZSB7UHJvbWlzZTxYaW1wb3J0KCcuL2NvbnRyYWN0R292ZXJuYW5jZS90eXBlZFBhcmFtTWFuYWdlci5qcycpLlR5cGVkUGFyYW1NYW5hZ2VyPHsnRWxlY3RvcmF0ZSc6ICdpbnZpdGF0aW9uJ30+Pn0gKi9cbi8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCovXG5jb25zdCBwYXJhbU1ncj1FKEUoZ292ZXJuZWRDRikuZ2V0UGFyYW1NZ3JSZXRyaWV2ZXIoKSkuZ2V0KHtcbmtleTonZ292ZXJuZWRQYXJhbXMnfSk7XG5cblxuLyogVE9ETyB1c2UgdXBkYXRlRWxlY3RvcmF0ZSovXG5yZXR1cm4gRShwYXJhbU1ncikudXBkYXRlUGFyYW1zKHtcbkVsZWN0b3JhdGU6cG9zZXJJbnZpdGF0aW9ufSk7XG5cbiB9O1xuXG4vKiB0aGlzIGNvbmRpdGlvbmFsIHdhcyBleHRyYWN0ZWQgc28gYm90aCBzaWRlcyBhcmUgZXF1YWxseSBhc3luY2hyb25vdXMqL1xuLyoqIEB0eXBlIHsoKSA9PiBQcm9taXNlPEFwaUdvdmVybm9yPn0gKi9cbmNvbnN0IGluaXRBcGlHb3Zlcm5hbmNlPWFzeW5jKCk9PntcbmNvbnN0W2dvdmVybmVkQXBpcyxnb3Zlcm5lZE5hbWVzXT1hd2FpdCBQcm9taXNlLmFsbChbXG5FKGdvdmVybmVkQ0YpLmdldEdvdmVybmVkQXBpcygpLFxuRShnb3Zlcm5lZENGKS5nZXRHb3Zlcm5lZEFwaU5hbWVzKCldKTtcblxuaWYoZ292ZXJuZWROYW1lcy5sZW5ndGgpe1xucmV0dXJuIHNldHVwQXBpR292ZXJuYW5jZShcbnpvZSxcbmdvdmVybmVkSW5zdGFuY2UsXG5nb3Zlcm5lZEFwaXMsXG5nb3Zlcm5lZE5hbWVzLFxudGltZXIsXG5nZXRVcGRhdGVkUG9zZXJGYWNldCk7XG5cbiB9XG5cbi8qIGlmIHdlIGFyZW4ndCBnb3Zlcm5pbmcgQVBJcywgdm90ZU9uQXBpSW52b2NhdGlvbiBzaG91bGRuJ3QgYmUgY2FsbGVkKi9cbnJldHVybntcbnZvdGVPbkFwaUludm9jYXRpb246KCk9PntcbnRocm93IEVycm9yKCdhcGkgZ292ZXJuYW5jZSBub3QgY29uZmlndXJlZCcpO1xuIH0sXG5jcmVhdGVkUXVlc3Rpb246KCk9PmZhbHNlfTtcblxuIH07XG5cbmNvbnN0e3ZvdGVPbkFwaUludm9jYXRpb24sY3JlYXRlZFF1ZXN0aW9uOmNyZWF0ZWRBcGlRdWVzdGlvbn09XG5hd2FpdCBpbml0QXBpR292ZXJuYW5jZSgpO1xuXG5jb25zdCB2YWxpZGF0ZVZvdGVDb3VudGVyPWFzeW5jKHZvdGVDb3VudGVyKT0+e1xuY29uc3QgY3JlYXRlZFBhcmFtUT1hd2FpdCBFKGNyZWF0ZWRQYXJhbVF1ZXN0aW9uKSh2b3RlQ291bnRlcik7XG5jb25zdCBjcmVhdGVkQXBpUT1hd2FpdCBFKGNyZWF0ZWRBcGlRdWVzdGlvbikodm90ZUNvdW50ZXIpO1xuY29uc3QgY3JlYXRlZEZpbHRlclE9YXdhaXQgRShjcmVhdGVkRmlsdGVyUXVlc3Rpb24pKHZvdGVDb3VudGVyKTtcblxuYXNzZXJ0KFxuY3JlYXRlZFBhcmFtUXx8Y3JlYXRlZEFwaVF8fGNyZWF0ZWRGaWx0ZXJRLFxuJ1ZvdGVDb3VudGVyIHdhcyBub3QgY3JlYXRlZCBieSB0aGlzIGNvbnRyYWN0R292ZXJub3InKTtcblxucmV0dXJuIHRydWU7XG4gfTtcblxuLyoqIEBwYXJhbSB7Q2xvc2luZ1J1bGV9IGNsb3NpbmdSdWxlICovXG5jb25zdCB2YWxpZGF0ZVRpbWVyPShjbG9zaW5nUnVsZSk9PntcbmFzc2VydChjbG9zaW5nUnVsZS50aW1lcj09PXRpbWVyLCdjbG9zaW5nIHJ1bGUgbXVzdCB1c2UgbXkgdGltZXInKTtcbnJldHVybiB0cnVlO1xuIH07XG5cbmNvbnN0IHZhbGlkYXRlRWxlY3RvcmF0ZT1hc3luYyhyZWdQKT0+e1xucmV0dXJuIEUud2hlbihyZWdQLGFzeW5jKHJlZyk9PntcbmNvbnN0IGVsZWN0b3JhdGVJbnN0YW5jZT1hd2FpdCBnZXRFbGVjdG9yYXRlSW5zdGFuY2UoKTtcbmFzc2VydChcbnJlZz09PWVsZWN0b3JhdGVJbnN0YW5jZSxcblwiRWxlY3RvcmF0ZSBkb2Vzbid0IG1hdGNoIG15IEVsZWN0b3JhdGVcIik7XG5cbnJldHVybiB0cnVlO1xuIH0pO1xuIH07XG5cbmNvbnN0IGNyZWF0b3JGYWNldD1GYXIoJ2dvdmVybm9yIGNyZWF0b3JGYWNldCcse1xucmVwbGFjZUVsZWN0b3JhdGUsXG52b3RlT25QYXJhbUNoYW5nZXMsXG52b3RlT25BcGlJbnZvY2F0aW9uLFxudm90ZU9uT2ZmZXJGaWx0ZXI6dm90ZU9uRmlsdGVyLFxuZ2V0Q3JlYXRvckZhY2V0OigpPT5saW1pdGVkQ3JlYXRvckZhY2V0LFxuZ2V0QWRtaW5GYWNldDooKT0+YWRtaW5GYWNldCxcbmdldEluc3RhbmNlOigpPT5nb3Zlcm5lZEluc3RhbmNlLFxuZ2V0UHVibGljRmFjZXQ6KCk9PmdvdmVybmVkUEZ9KTtcblxuXG5jb25zdCBwdWJsaWNGYWNldD1GYXIoJ2NvbnRyYWN0IGdvdmVybm9yIHB1YmxpYycse1xuZ2V0RWxlY3RvcmF0ZTpnZXRFbGVjdG9yYXRlSW5zdGFuY2UsXG5nZXRHb3Zlcm5lZENvbnRyYWN0OigpPT5nb3Zlcm5lZEluc3RhbmNlLFxudmFsaWRhdGVWb3RlQ291bnRlcixcbnZhbGlkYXRlRWxlY3RvcmF0ZSxcbnZhbGlkYXRlVGltZXJ9KTtcblxuXG5yZXR1cm57Y3JlYXRvckZhY2V0LHB1YmxpY0ZhY2V0fTtcbiB9OyRo4oCNX29uY2Uuc3RhcnQoc3RhcnQpO1xuXG5oYXJkZW4oc3RhcnQpO1xuaGFyZGVuKHZhbGlkYXRlUXVlc3Rpb25EZXRhaWxzKTtcbmhhcmRlbih2YWxpZGF0ZVF1ZXN0aW9uRnJvbUNvdW50ZXIpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InZhbGlkYXRlUXVlc3Rpb25EZXRhaWxzIjpbInZhbGlkYXRlUXVlc3Rpb25EZXRhaWxzIl0sInZhbGlkYXRlUXVlc3Rpb25Gcm9tQ291bnRlciI6WyJ2YWxpZGF0ZVF1ZXN0aW9uRnJvbUNvdW50ZXIiXSwic3RhcnQiOlsic3RhcnQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAsVLxGnskAAB7JAAALwAAAEBhZ29yaWMvZ292ZXJuYW5jZS12MC45LjMvc3JjL2NvbnRyYWN0SGVscGVyLmpzeyJpbXBvcnRzIjpbIi4vY29udHJhY3RHb3Zlcm5hbmNlL3BhcmFtTWFuYWdlci5qcyIsIi4vY29udHJhY3RHb3Zlcm5hbmNlL3R5cGVkUGFyYW1NYW5hZ2VyLmpzIiwiQGFnb3JpYy9lcnRwIiwiQGFnb3JpYy9pbnRlcm5hbCIsIkBhZ29yaWMvbm90aWZpZXIiLCJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy92YXQtZGF0YSIsIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJHT1ZFUk5BTkNFX1NUT1JBR0VfS0VZIiwiaGFuZGxlUGFyYW1Hb3Zlcm5hbmNlIiwicHVibGljTWl4aW5BUEkiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRmFyLG1ha2VTdG9yZWRQdWJsaXNoZXJLaXQsZ2V0TWV0aG9kTmFtZXMsb2JqZWN0TWFwLGlnbm9yZUNvbnRleHQsa2V5RVEsTSxBbW91bnRTaGFwZSxCcmFuZFNoYXBlLGFzc2VydEVsZWN0b3JhdGVNYXRjaGVzLG1ha2VQYXJhbU1hbmFnZXJGcm9tVGVybXM7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9ub3RpZmllclwiLCBbW1wibWFrZVN0b3JlZFB1Ymxpc2hlcktpdFwiLCBbJGjigI1fYSA9PiAobWFrZVN0b3JlZFB1Ymxpc2hlcktpdCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsXCIsIFtbXCJnZXRNZXRob2ROYW1lc1wiLCBbJGjigI1fYSA9PiAoZ2V0TWV0aG9kTmFtZXMgPSAkaOKAjV9hKV1dLFtcIm9iamVjdE1hcFwiLCBbJGjigI1fYSA9PiAob2JqZWN0TWFwID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcImlnbm9yZUNvbnRleHRcIiwgWyRo4oCNX2EgPT4gKGlnbm9yZUNvbnRleHQgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wia2V5RVFcIiwgWyRo4oCNX2EgPT4gKGtleUVRID0gJGjigI1fYSldXSxbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvZXJ0cFwiLCBbW1wiQW1vdW50U2hhcGVcIiwgWyRo4oCNX2EgPT4gKEFtb3VudFNoYXBlID0gJGjigI1fYSldXSxbXCJCcmFuZFNoYXBlXCIsIFskaOKAjV9hID0+IChCcmFuZFNoYXBlID0gJGjigI1fYSldXV1dLFtcIi4vY29udHJhY3RHb3Zlcm5hbmNlL3BhcmFtTWFuYWdlci5qc1wiLCBbW1wiYXNzZXJ0RWxlY3RvcmF0ZU1hdGNoZXNcIiwgWyRo4oCNX2EgPT4gKGFzc2VydEVsZWN0b3JhdGVNYXRjaGVzID0gJGjigI1fYSldXV1dLFtcIi4vY29udHJhY3RHb3Zlcm5hbmNlL3R5cGVkUGFyYW1NYW5hZ2VyLmpzXCIsIFtbXCJtYWtlUGFyYW1NYW5hZ2VyRnJvbVRlcm1zXCIsIFskaOKAjV9hID0+IChtYWtlUGFyYW1NYW5hZ2VyRnJvbVRlcm1zID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0e2RldGFpbHM6WCxxdW90ZTpxfT1hc3NlcnQ7XG5cbmNvbnN0ICAgICAgICBHT1ZFUk5BTkNFX1NUT1JBR0VfS0VZPSdnb3Zlcm5hbmNlJzskaOKAjV9vbmNlLkdPVkVSTkFOQ0VfU1RPUkFHRV9LRVkoR09WRVJOQU5DRV9TVE9SQUdFX0tFWSk7XG5cbmNvbnN0IHB1YmxpY01peGluQVBJPWhhcmRlbih7XG5nZXRTdWJzY3JpcHRpb246TS5jYWxsKCkucmV0dXJucyhNLnJlbW90YWJsZSgnU3RvcmVkU3Vic2NyaXB0aW9uJykpLFxuZ2V0Q29udHJhY3RHb3Zlcm5vcjpNLmNhbGwoKS5yZXR1cm5zKE0ucmVtb3RhYmxlKCdJbnN0YW5jZScpKSxcbmdldEdvdmVybmVkUGFyYW1zOk0uY2FsbCgpLnJldHVybnMoTS5yZWNvcmQoKSksXG5nZXRBbW91bnQ6TS5jYWxsKCkucmV0dXJucyhBbW91bnRTaGFwZSksXG5nZXRCcmFuZDpNLmNhbGwoKS5yZXR1cm5zKEJyYW5kU2hhcGUpLFxuZ2V0SW5zdGFuY2U6TS5jYWxsKCkucmV0dXJucyhNLnJlbW90YWJsZSgnSW5zdGFuY2UnKSksXG5nZXRJbnN0YWxsYXRpb246TS5jYWxsKCkucmV0dXJucyhNLnJlbW90YWJsZSgnSW5zdGFsbGF0aW9uJykpLFxuZ2V0SW52aXRhdGlvbkFtb3VudDpNLmNhbGwoKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbmdldE5hdDpNLmNhbGwoKS5yZXR1cm5zKE0uYmlnaW50KCkpLFxuZ2V0UmF0aW86TS5jYWxsKCkucmV0dXJucyhNLnJlY29yZCgpKSxcbmdldFN0cmluZzpNLmNhbGwoKS5yZXR1cm5zKE0uc3RyaW5nKCkpLFxuZ2V0VW5rbm93bjpNLmNhbGwoKS5yZXR1cm5zKE0uYW55KCkpfSk7XG5cblxuLyoqXG4gKiBVdGlsaXR5IGZ1bmN0aW9uIGZvciBgbWFrZVBhcmFtR292ZXJuYW5jZWAuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7WkNGPEdvdmVybmFuY2VUZXJtczx7fT4gJiB7fT59IHpjZlxuICogQHBhcmFtIHtYaW1wb3J0KCcuL2NvbnRyYWN0R292ZXJuYW5jZS90eXBlZFBhcmFtTWFuYWdlcicpLlR5cGVkUGFyYW1NYW5hZ2VyPFQ+fSBwYXJhbU1hbmFnZXJcbiAqLyRo4oCNX29uY2UucHVibGljTWl4aW5BUEkocHVibGljTWl4aW5BUEkpO1xuY29uc3QgZmFjZXRIZWxwZXJzPSh6Y2YscGFyYW1NYW5hZ2VyKT0+e1xuY29uc3QgdGVybXM9emNmLmdldFRlcm1zKCk7XG5jb25zdHtnb3Zlcm5lZFBhcmFtc309dGVybXM7XG5hc3NlcnQoXG5rZXlFUShnb3Zlcm5lZFBhcmFtcyxwYXJhbU1hbmFnZXIuZ2V0UGFyYW1zKCkpLFxuWCBgVGVybXMgbXVzdCBpbmNsdWRlICR7cShwYXJhbU1hbmFnZXIuZ2V0UGFyYW1zKCkpfSwgYnV0IHdlcmUgJHtxKFxuZ292ZXJuZWRQYXJhbXMpXG4gfWApO1xuXG5hc3NlcnRFbGVjdG9yYXRlTWF0Y2hlcyhwYXJhbU1hbmFnZXIsZ292ZXJuZWRQYXJhbXMpO1xuXG5jb25zdCB0eXBlZEFjY2Vzc29ycz17XG5nZXRBbW91bnQ6cGFyYW1NYW5hZ2VyLmdldEFtb3VudCxcbmdldEJyYW5kOnBhcmFtTWFuYWdlci5nZXRCcmFuZCxcbmdldEluc3RhbmNlOnBhcmFtTWFuYWdlci5nZXRJbnN0YW5jZSxcbmdldEluc3RhbGxhdGlvbjpwYXJhbU1hbmFnZXIuZ2V0SW5zdGFsbGF0aW9uLFxuZ2V0SW52aXRhdGlvbkFtb3VudDpwYXJhbU1hbmFnZXIuZ2V0SW52aXRhdGlvbkFtb3VudCxcbmdldE5hdDpwYXJhbU1hbmFnZXIuZ2V0TmF0LFxuZ2V0UmF0aW86cGFyYW1NYW5hZ2VyLmdldFJhdGlvLFxuZ2V0U3RyaW5nOnBhcmFtTWFuYWdlci5nZXRTdHJpbmcsXG5nZXRVbmtub3duOnBhcmFtTWFuYWdlci5nZXRVbmtub3dufTtcblxuXG5jb25zdHtlbGVjdGlvbk1hbmFnZXJ9PXRlcm1zO1xuXG5jb25zdCBjb21tb25QdWJsaWNNZXRob2RzPXtcbmdldFN1YnNjcmlwdGlvbjooKT0+cGFyYW1NYW5hZ2VyLmdldFN1YnNjcmlwdGlvbigpLFxuZ2V0Q29udHJhY3RHb3Zlcm5vcjooKT0+ZWxlY3Rpb25NYW5hZ2VyLFxuZ2V0R292ZXJuZWRQYXJhbXM6KCk9PnBhcmFtTWFuYWdlci5nZXRQYXJhbXMoKX07XG5cblxuLyoqXG4gKiBBZGQgcmVxdWlyZWQgbWV0aG9kcyB0byBwdWJsaWNGYWNldFxuICpcbiAqIEB0ZW1wbGF0ZSB7e319IFBGIHB1YmxpYyBmYWNldFxuICogQHBhcmFtIHtQRn0gb3JpZ2luYWxQdWJsaWNGYWNldFxuICogQHJldHVybnMge0dvdmVybmVkUHVibGljRmFjZXQ8UEY+fVxuICovXG5jb25zdCBhdWdtZW50UHVibGljRmFjZXQ9KG9yaWdpbmFsUHVibGljRmFjZXQpPT57XG5yZXR1cm4gRmFyKCdwdWJsaWNGYWNldCcse1xuLi4ub3JpZ2luYWxQdWJsaWNGYWNldCxcbi4uLmNvbW1vblB1YmxpY01ldGhvZHMsXG4uLi50eXBlZEFjY2Vzc29yc30pO1xuXG4gfTtcblxuLyoqXG4gKiBBZGQgcmVxdWlyZWQgbWV0aG9kcyB0byBwdWJsaWNGYWNldCwgZm9yIGEgdmlydHVhbC9kdXJhYmxlIGNvbnRyYWN0XG4gKlxuICogQHBhcmFtIHtPUEZ9IG9yaWdpbmFsUHVibGljRmFjZXRcbiAqIEB0ZW1wbGF0ZSB7e319IE9QRlxuICovXG5jb25zdCBhdWdtZW50VmlydHVhbFB1YmxpY0ZhY2V0PShvcmlnaW5hbFB1YmxpY0ZhY2V0KT0+e1xucmV0dXJuIEZhcigncHVibGljRmFjZXQnLHtcbi4uLm9yaWdpbmFsUHVibGljRmFjZXQsXG4uLi5jb21tb25QdWJsaWNNZXRob2RzLFxuLi4ub2JqZWN0TWFwKHR5cGVkQWNjZXNzb3JzLGlnbm9yZUNvbnRleHQpfSk7XG5cbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7e319IENGIGNyZWF0b3IgZmFjZXRcbiAqIEBwYXJhbSB7Q0Z9IG9yaWdpbmFsQ3JlYXRvckZhY2V0XG4gKiBAcmV0dXJucyB7TGltaXRlZENyZWF0b3JGYWNldDxDRj59XG4gKi9cbmNvbnN0IG1ha2VMaW1pdGVkQ3JlYXRvckZhY2V0PShvcmlnaW5hbENyZWF0b3JGYWNldCk9PntcbnJldHVybiBGYXIoJ2dvdmVybmVkQ29udHJhY3QgY3JlYXRvciBmYWNldCcse1xuLi4ub3JpZ2luYWxDcmVhdG9yRmFjZXQsXG5nZXRDb250cmFjdEdvdmVybm9yOigpPT5lbGVjdGlvbk1hbmFnZXJ9KTtcblxuIH07XG5cbi8qKlxuICogQWRkIHJlcXVpcmVkIG1ldGhvZHMgdG8gYSBjcmVhdG9yRmFjZXRcbiAqXG4gKiBAdGVtcGxhdGUge3t9fSBDRiBjcmVhdG9yIGZhY2V0XG4gKiBAcGFyYW0ge0NGfSBvcmlnaW5hbENyZWF0b3JGYWNldFxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCAoLi4uYXJnczogYW55W10pID0+IGFueT59IGdvdmVybmVkQXBpc1xuICogQHJldHVybnMge0dvdmVybmVkQ3JlYXRvckZhY2V0PENGPn1cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7e319IENGXG4gKiBAcGFyYW0ge0NGfSBsaW1pdGVkQ3JlYXRvckZhY2V0XG4gKiBAcGFyYW0ge3t9fSBbZ292ZXJuZWRBcGlzXVxuICogQHJldHVybnMge0dvdmVybm9yRmFjZXQ8Q0Y+fVxuICovXG5jb25zdCBtYWtlRmFyR292ZXJub3JGYWNldD0obGltaXRlZENyZWF0b3JGYWNldCxnb3Zlcm5lZEFwaXM9e30pPT57XG5jb25zdCBnb3Zlcm5vckZhY2V0PUZhcignZ292ZXJub3JGYWNldCcse1xuZ2V0UGFyYW1NZ3JSZXRyaWV2ZXI6KCk9PlxuRmFyKCdwYXJhbVJldHJpZXZlcicse2dldDooKT0+cGFyYW1NYW5hZ2VyfSksXG5nZXRJbnZpdGF0aW9uOihuYW1lKT0+cGFyYW1NYW5hZ2VyLmdldEludGVybmFsUGFyYW1WYWx1ZShuYW1lKSxcbmdldExpbWl0ZWRDcmVhdG9yRmFjZXQ6KCk9PmxpbWl0ZWRDcmVhdG9yRmFjZXQsXG4vKiBUaGUgY29udHJhY3QgcHJvdmlkZXMgYSBmYWNldCB3aXRoIHRoZSBBUElzIHRoYXQgY2FuIGJlIGludm9rZWQgYnkqL1xuLyogZ292ZXJuYW5jZSovXG4vKiogQHR5cGUgeygpID0+IEdvdmVybmVkQXBpc30gKi9cbi8qIEB0cy1leHBlY3QtZXJyb3IgVFMgdGhpbmsgdGhpcyBpcyBhIFJlbW90YWJsZUJyYW5kPz8qL1xuZ2V0R292ZXJuZWRBcGlzOigpPT5GYXIoJ2dvdmVybmVkQVBJcycsZ292ZXJuZWRBcGlzKSxcbi8qIFRoZSBmYWNldCByZXR1cm5lZCBieSBnZXRHb3Zlcm5lZEFwaXMgaXMgRmFyLCBzbyB3ZSBjYW4ndCBzZWUgd2hhdCovXG4vKiBtZXRob2RzIGl0IGhhcy4gVGhlcmUncyBubyBjbGVhbiB3YXkgdG8gaGF2ZSBjb250cmFjdHMgc3BlY2lmeSB0aGUgQVBJcyovXG4vKiB3aXRob3V0IGFsc28gc2VwYXJhdGVseSBwcm92aWRpbmcgdGhlaXIgbmFtZXMuKi9cbmdldEdvdmVybmVkQXBpTmFtZXM6KCk9Pk9iamVjdC5rZXlzKGdvdmVybmVkQXBpcyksXG5zZXRPZmZlckZpbHRlcjooc3RyaW5ncyk9PnpjZi5zZXRPZmZlckZpbHRlcihzdHJpbmdzKX0pO1xuXG5cbi8qIGV4Y2x1c2l2ZWx5IGZvciBjb250cmFjdEdvdmVybm9yLCB3aGljaCBvbmx5IHJldmVhbHMgbGltaXRlZENyZWF0b3JGYWNldCovXG5yZXR1cm4gZ292ZXJub3JGYWNldDtcbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7e319IENGXG4gKiBAcGFyYW0ge0NGfSBvcmlnaW5hbENyZWF0b3JGYWNldFxuICogQHBhcmFtIHt7fX0gW2dvdmVybmVkQXBpc11cbiAqIEByZXR1cm5zIHtHb3Zlcm5vckZhY2V0PENGPn1cbiAqL1xuY29uc3QgbWFrZUdvdmVybm9yRmFjZXQ9KG9yaWdpbmFsQ3JlYXRvckZhY2V0LGdvdmVybmVkQXBpcz17fSk9PntcbmNvbnN0IGxpbWl0ZWRDcmVhdG9yRmFjZXQ9bWFrZUxpbWl0ZWRDcmVhdG9yRmFjZXQob3JpZ2luYWxDcmVhdG9yRmFjZXQpO1xucmV0dXJuIG1ha2VGYXJHb3Zlcm5vckZhY2V0KGxpbWl0ZWRDcmVhdG9yRmFjZXQsZ292ZXJuZWRBcGlzKTtcbiB9O1xuXG4vKipcbiAqIEFkZCByZXF1aXJlZCBtZXRob2RzIHRvIGEgY3JlYXRvckZhY2V0IGZvciBhIHZpcnR1YWwvZHVyYWJsZSBjb250cmFjdC5cbiAqXG4gKiBAcGFyYW0ge3sgW21ldGhvZE5hbWU6IHN0cmluZ106IChjb250ZXh0PzogdW5rbm93biwgLi4ucmVzdDogdW5rbm93bltdKSA9PiB1bmtub3dufX0gb3JpZ2luYWxDcmVhdG9yRmFjZXRcbiAqL1xuY29uc3QgbWFrZVZpcnR1YWxHb3Zlcm5vckZhY2V0PShvcmlnaW5hbENyZWF0b3JGYWNldCk9PntcbmNvbnN0IGxpbWl0ZWRDcmVhdG9yRmFjZXQ9bWFrZUxpbWl0ZWRDcmVhdG9yRmFjZXQob3JpZ2luYWxDcmVhdG9yRmFjZXQpO1xuXG4vKiogQHR5cGUge1hpbXBvcnQoJ0BhZ29yaWMvdmF0LWRhdGEvc3JjL3R5cGVzLmpzJykuRnVuY3Rpb25zUGx1c0NvbnRleHQ8dW5rbm93biwgR292ZXJub3JGYWNldDxvcmlnaW5hbENyZWF0b3JGYWNldD4+fSAqL1xuY29uc3QgZ292ZXJub3JGYWNldD1oYXJkZW4oe1xuZ2V0UGFyYW1NZ3JSZXRyaWV2ZXI6KCk9PlxuRmFyKCdwYXJhbVJldHJpZXZlcicse2dldDooKT0+cGFyYW1NYW5hZ2VyfSksXG5nZXRJbnZpdGF0aW9uOihfY29udGV4dCxuYW1lKT0+XG5wYXJhbU1hbmFnZXIuZ2V0SW50ZXJuYWxQYXJhbVZhbHVlKG5hbWUpLFxuZ2V0TGltaXRlZENyZWF0b3JGYWNldDooe2ZhY2V0c30pPT5mYWNldHMubGltaXRlZENyZWF0b3JGYWNldCxcbi8qIFRoZSBjb250cmFjdCBwcm92aWRlcyBhIGZhY2V0IHdpdGggdGhlIEFQSXMgdGhhdCBjYW4gYmUgaW52b2tlZCBieSovXG4vKiBnb3Zlcm5hbmNlKi9cbmdldEdvdmVybmVkQXBpczooe2ZhY2V0c30pPT5mYWNldHMuZ292ZXJuZWRBcGlzLFxuLyogVGhlIGZhY2V0IHJldHVybmVkIGJ5IGdldEdvdmVybmVkQXBpcyBpcyBGYXIsIHNvIHdlIGNhbid0IHNlZSB3aGF0Ki9cbi8qIG1ldGhvZHMgaXQgaGFzLiBUaGVyZSdzIG5vIGNsZWFuIHdheSB0byBoYXZlIGNvbnRyYWN0cyBzcGVjaWZ5IHRoZSBBUElzKi9cbi8qIHdpdGhvdXQgYWxzbyBzZXBhcmF0ZWx5IHByb3ZpZGluZyB0aGVpciBuYW1lcy4qL1xuZ2V0R292ZXJuZWRBcGlOYW1lczooe2ZhY2V0c30pPT5cbmdldE1ldGhvZE5hbWVzKGZhY2V0cy5nb3Zlcm5lZEFwaXN8fHt9KSxcbnNldE9mZmVyRmlsdGVyOihfY29udGV4dCxzdHJpbmdzKT0+emNmLnNldE9mZmVyRmlsdGVyKHN0cmluZ3MpfSk7XG5cblxucmV0dXJue2dvdmVybm9yRmFjZXQsbGltaXRlZENyZWF0b3JGYWNldH07XG4gfTtcblxucmV0dXJuIGhhcmRlbih7XG5wdWJsaWNNaXhpbjp7XG4uLi5jb21tb25QdWJsaWNNZXRob2RzLFxuLi4udHlwZWRBY2Nlc3NvcnN9LFxuXG5jcmVhdG9yTWl4aW46e1xuZ2V0Q29udHJhY3RHb3Zlcm5vcjooKT0+ZWxlY3Rpb25NYW5hZ2VyfSxcblxuYXVnbWVudFB1YmxpY0ZhY2V0LFxuYXVnbWVudFZpcnR1YWxQdWJsaWNGYWNldCxcbm1ha2VHb3Zlcm5vckZhY2V0LFxubWFrZVZpcnR1YWxHb3Zlcm5vckZhY2V0LFxubWFrZUZhckdvdmVybm9yRmFjZXQsXG5wYXJhbXM6cGFyYW1NYW5hZ2VyLnJlYWRvbmx5KCl9KTtcblxuIH07XG5cbi8qKlxuICogSGVscGVyIGZvciB0aGUgOTAlIG9mIGNvbnRyYWN0cyB0aGF0IHdpbGwgaGF2ZSBvbmx5IGEgc2luZ2xlIHNldCBvZlxuICogcGFyYW1ldGVycy4gVXNpbmcgdGhpcyBmb3IgbWFuYWdlZCBwYXJhbWV0ZXJzLCBhIGNvbnRyYWN0IG9ubHkgaGFzIHRvXG4gKlxuICogLSBEZWZpbmUgdGhlIHBhcmFtZXRlciB0ZW1wbGF0ZSwgd2hpY2ggaW5jbHVkZXMgbmFtZSwgdHlwZSBhbmQgdmFsdWVcbiAqIC0gQWRkIGFueSBtZXRob2RzIG5lZWRlZCBpbiB0aGUgcHVibGljIGFuZCBjcmVhdG9yIGZhY2V0cy5cbiAqXG4gKiBJdCdzIGFsc28gY3J1Y2lhbCB0aGF0IHRoZSBnb3Zlcm5lZCBjb250cmFjdCBub3QgaW50ZXJhY3Qgd2l0aCB0aGUgcHJvZHVjdCBvZlxuICogbWFrZUdvdmVybm9yRmFjZXQoKS4gVGhlIHdyYXBwZWQgY3JlYXRvckZhY2V0IGhhcyB0aGUgcG93ZXIgdG8gY2hhbmdlXG4gKiBwYXJhbWV0ZXIgdmFsdWVzLCBhbmQgdGhlIGdvdmVybmFuY2UgZ3VhcmFudGVlcyBvbmx5IGhvbGQgaWYgdGhleSdyZSBub3QgdXNlZFxuICogZGlyZWN0bHkgYnkgdGhlIGdvdmVybmVkIGNvbnRyYWN0LlxuICpcbiAqIEB0ZW1wbGF0ZSB7WGltcG9ydCgnLi9jb250cmFjdEdvdmVybmFuY2UvdHlwZWRQYXJhbU1hbmFnZXInKS5QYXJhbVR5cGVzTWFwfSBNXG4gKiAgIE1hcCBvZiB0eXBlcyBvZiBjdXN0b20gZ292ZXJuZWQgdGVybXNcbiAqIEBwYXJhbSB7WkNGPEdvdmVybmFuY2VUZXJtczxNPj59IHpjZlxuICogQHBhcmFtIHtJbnZpdGF0aW9ufSBpbml0aWFsUG9zZXJJbnZpdGF0aW9uXG4gKiBAcGFyYW0ge019IHBhcmFtVHlwZXNNYXBcbiAqIEBwYXJhbSB7RVJlZjxTdG9yYWdlTm9kZT59IFtzdG9yYWdlTm9kZV1cbiAqIEBwYXJhbSB7RVJlZjxNYXJzaGFsbGVyPn0gW21hcnNoYWxsZXJdXG4gKi9cbmNvbnN0IGhhbmRsZVBhcmFtR292ZXJuYW5jZT1hc3luYyhcbnpjZixcbmluaXRpYWxQb3Nlckludml0YXRpb24sXG5wYXJhbVR5cGVzTWFwLFxuc3RvcmFnZU5vZGUsXG5tYXJzaGFsbGVyKT0+XG57XG4vKiogQHR5cGUge1hpbXBvcnQoJ0BhZ29yaWMvbm90aWZpZXInKS5TdG9yZWRQdWJsaXNoZXJLaXQ8R292ZXJuYW5jZVN1YnNjcmlwdGlvblN0YXRlPn0gKi9cbmNvbnN0IHB1Ymxpc2hlcktpdD1tYWtlU3RvcmVkUHVibGlzaGVyS2l0KFxuc3RvcmFnZU5vZGUsXG5tYXJzaGFsbGVyLFxuR09WRVJOQU5DRV9TVE9SQUdFX0tFWSk7XG5cbmNvbnN0IHBhcmFtTWFuYWdlcj1hd2FpdCBtYWtlUGFyYW1NYW5hZ2VyRnJvbVRlcm1zKFxucHVibGlzaGVyS2l0LFxuemNmLFxuaW5pdGlhbFBvc2VySW52aXRhdGlvbixcbnBhcmFtVHlwZXNNYXApO1xuXG5cbnJldHVybiBmYWNldEhlbHBlcnMoemNmLHBhcmFtTWFuYWdlcik7XG4gfTskaOKAjV9vbmNlLmhhbmRsZVBhcmFtR292ZXJuYW5jZShoYW5kbGVQYXJhbUdvdmVybmFuY2UpO1xuXG5oYXJkZW4oaGFuZGxlUGFyYW1Hb3Zlcm5hbmNlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwdWJsaWNNaXhpbkFQSSI6WyJwdWJsaWNNaXhpbkFQSSJdLCJoYW5kbGVQYXJhbUdvdmVybmFuY2UiOlsiaGFuZGxlUGFyYW1Hb3Zlcm5hbmNlIl0sIkdPVkVSTkFOQ0VfU1RPUkFHRV9LRVkiOlsiR09WRVJOQU5DRV9TVE9SQUdFX0tFWSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC3bRQTbQ8AAG0PAAAmAAAAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjkuMy9zcmMvaW5kZXguanN7ImltcG9ydHMiOlsiLi9iaW5hcnlWb3RlQ291bnRlci5qcyIsIi4vY29uc3RhbnRzLmpzIiwiLi9jb250cmFjdEdvdmVybmFuY2UvZ292ZXJuUGFyYW0uanMiLCIuL2NvbnRyYWN0R292ZXJuYW5jZS9wYXJhbU1hbmFnZXIuanMiLCIuL2NvbnRyYWN0R292ZXJuYW5jZS90eXBlZFBhcmFtTWFuYWdlci5qcyIsIi4vY29udHJhY3RHb3Zlcm5vci5qcyIsIi4vY29udHJhY3RIZWxwZXIuanMiLCIuL3F1ZXN0aW9uLmpzIiwiLi90eXBlcy5qcyIsIi4vdmFsaWRhdG9ycy5qcyJdLCJleHBvcnRzIjpbIkNPTlRSQUNUX0VMRUNUT1JBVEUiLCJDaG9pY2VNZXRob2QiLCJFbGVjdGlvblR5cGUiLCJQYXJhbVR5cGVzIiwiUXVvcnVtUnVsZSIsImFzc2VydEJhbGxvdENvbmNlcm5zUGFyYW0iLCJhc3NlcnRDb250cmFjdEVsZWN0b3JhdGUiLCJhc3NlcnRDb250cmFjdEdvdmVybmFuY2UiLCJhc3NlcnRFbGVjdG9yYXRlTWF0Y2hlcyIsImJ1aWxkVW5yYW5rZWRRdWVzdGlvbiIsImNvZXJjZVF1ZXN0aW9uU3BlYyIsImhhbmRsZVBhcmFtR292ZXJuYW5jZSIsIm1ha2VCaW5hcnlWb3RlQ291bnRlciIsIm1ha2VQYXJhbUNoYW5nZVBvc2l0aW9ucyIsIm1ha2VQYXJhbU1hbmFnZXIiLCJtYWtlUGFyYW1NYW5hZ2VyQnVpbGRlciIsIm1ha2VQYXJhbU1hbmFnZXJTeW5jIiwicG9zaXRpb25JbmNsdWRlZCIsInB1YmxpY01peGluQVBJIiwic2V0dXBQYXJhbUdvdmVybmFuY2UiLCJ2YWxpZGF0ZVF1ZXN0aW9uRGV0YWlscyIsInZhbGlkYXRlUXVlc3Rpb25Gcm9tQ291bnRlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vdHlwZXMuanNcIiwgW11dLFtcIi4vcXVlc3Rpb24uanNcIiwgW1tcIkNob2ljZU1ldGhvZFwiLCBbJGjigI1fbGl2ZVtcIkNob2ljZU1ldGhvZFwiXV1dLFtcIkVsZWN0aW9uVHlwZVwiLCBbJGjigI1fbGl2ZVtcIkVsZWN0aW9uVHlwZVwiXV1dLFtcIlF1b3J1bVJ1bGVcIiwgWyRo4oCNX2xpdmVbXCJRdW9ydW1SdWxlXCJdXV0sW1wiY29lcmNlUXVlc3Rpb25TcGVjXCIsIFskaOKAjV9saXZlW1wiY29lcmNlUXVlc3Rpb25TcGVjXCJdXV0sW1wicG9zaXRpb25JbmNsdWRlZFwiLCBbJGjigI1fbGl2ZVtcInBvc2l0aW9uSW5jbHVkZWRcIl1dXSxbXCJidWlsZFVucmFua2VkUXVlc3Rpb25cIiwgWyRo4oCNX2xpdmVbXCJidWlsZFVucmFua2VkUXVlc3Rpb25cIl1dXV1dLFtcIi4vY29udHJhY3RHb3Zlcm5vci5qc1wiLCBbW1widmFsaWRhdGVRdWVzdGlvbkRldGFpbHNcIiwgWyRo4oCNX2xpdmVbXCJ2YWxpZGF0ZVF1ZXN0aW9uRGV0YWlsc1wiXV1dLFtcInZhbGlkYXRlUXVlc3Rpb25Gcm9tQ291bnRlclwiLCBbJGjigI1fbGl2ZVtcInZhbGlkYXRlUXVlc3Rpb25Gcm9tQ291bnRlclwiXV1dXV0sW1wiLi9jb250cmFjdEhlbHBlci5qc1wiLCBbW1wiaGFuZGxlUGFyYW1Hb3Zlcm5hbmNlXCIsIFskaOKAjV9saXZlW1wiaGFuZGxlUGFyYW1Hb3Zlcm5hbmNlXCJdXV0sW1wicHVibGljTWl4aW5BUElcIiwgWyRo4oCNX2xpdmVbXCJwdWJsaWNNaXhpbkFQSVwiXV1dXV0sW1wiLi9jb250cmFjdEdvdmVybmFuY2UvZ292ZXJuUGFyYW0uanNcIiwgW1tcImFzc2VydEJhbGxvdENvbmNlcm5zUGFyYW1cIiwgWyRo4oCNX2xpdmVbXCJhc3NlcnRCYWxsb3RDb25jZXJuc1BhcmFtXCJdXV0sW1wibWFrZVBhcmFtQ2hhbmdlUG9zaXRpb25zXCIsIFskaOKAjV9saXZlW1wibWFrZVBhcmFtQ2hhbmdlUG9zaXRpb25zXCJdXV0sW1wic2V0dXBQYXJhbUdvdmVybmFuY2VcIiwgWyRo4oCNX2xpdmVbXCJzZXR1cFBhcmFtR292ZXJuYW5jZVwiXV1dLFtcIkNPTlRSQUNUX0VMRUNUT1JBVEVcIiwgWyRo4oCNX2xpdmVbXCJDT05UUkFDVF9FTEVDVE9SQVRFXCJdXV1dXSxbXCIuL2NvbnRyYWN0R292ZXJuYW5jZS9wYXJhbU1hbmFnZXIuanNcIiwgW1tcImFzc2VydEVsZWN0b3JhdGVNYXRjaGVzXCIsIFskaOKAjV9saXZlW1wiYXNzZXJ0RWxlY3RvcmF0ZU1hdGNoZXNcIl1dXSxbXCJtYWtlUGFyYW1NYW5hZ2VyQnVpbGRlclwiLCBbJGjigI1fbGl2ZVtcIm1ha2VQYXJhbU1hbmFnZXJCdWlsZGVyXCJdXV1dXSxbXCIuL2NvbnRyYWN0R292ZXJuYW5jZS90eXBlZFBhcmFtTWFuYWdlci5qc1wiLCBbW1wibWFrZVBhcmFtTWFuYWdlclwiLCBbJGjigI1fbGl2ZVtcIm1ha2VQYXJhbU1hbmFnZXJcIl1dXSxbXCJtYWtlUGFyYW1NYW5hZ2VyU3luY1wiLCBbJGjigI1fbGl2ZVtcIm1ha2VQYXJhbU1hbmFnZXJTeW5jXCJdXV1dXSxbXCIuL3ZhbGlkYXRvcnMuanNcIiwgW1tcImFzc2VydENvbnRyYWN0R292ZXJuYW5jZVwiLCBbJGjigI1fbGl2ZVtcImFzc2VydENvbnRyYWN0R292ZXJuYW5jZVwiXV1dLFtcImFzc2VydENvbnRyYWN0RWxlY3RvcmF0ZVwiLCBbJGjigI1fbGl2ZVtcImFzc2VydENvbnRyYWN0RWxlY3RvcmF0ZVwiXV1dXV0sW1wiLi9jb25zdGFudHMuanNcIiwgW1tcIlBhcmFtVHlwZXNcIiwgWyRo4oCNX2xpdmVbXCJQYXJhbVR5cGVzXCJdXV1dXSxbXCIuL2JpbmFyeVZvdGVDb3VudGVyLmpzXCIsIFtbXCJtYWtlQmluYXJ5Vm90ZUNvdW50ZXJcIiwgWyRo4oCNX2xpdmVbXCJtYWtlQmluYXJ5Vm90ZUNvdW50ZXJcIl1dXV1dXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnsiQ2hvaWNlTWV0aG9kIjpbIkNob2ljZU1ldGhvZCIsZmFsc2VdLCJFbGVjdGlvblR5cGUiOlsiRWxlY3Rpb25UeXBlIixmYWxzZV0sIlF1b3J1bVJ1bGUiOlsiUXVvcnVtUnVsZSIsZmFsc2VdLCJjb2VyY2VRdWVzdGlvblNwZWMiOlsiY29lcmNlUXVlc3Rpb25TcGVjIixmYWxzZV0sInBvc2l0aW9uSW5jbHVkZWQiOlsicG9zaXRpb25JbmNsdWRlZCIsZmFsc2VdLCJidWlsZFVucmFua2VkUXVlc3Rpb24iOlsiYnVpbGRVbnJhbmtlZFF1ZXN0aW9uIixmYWxzZV0sInZhbGlkYXRlUXVlc3Rpb25EZXRhaWxzIjpbInZhbGlkYXRlUXVlc3Rpb25EZXRhaWxzIixmYWxzZV0sInZhbGlkYXRlUXVlc3Rpb25Gcm9tQ291bnRlciI6WyJ2YWxpZGF0ZVF1ZXN0aW9uRnJvbUNvdW50ZXIiLGZhbHNlXSwiaGFuZGxlUGFyYW1Hb3Zlcm5hbmNlIjpbImhhbmRsZVBhcmFtR292ZXJuYW5jZSIsZmFsc2VdLCJwdWJsaWNNaXhpbkFQSSI6WyJwdWJsaWNNaXhpbkFQSSIsZmFsc2VdLCJhc3NlcnRCYWxsb3RDb25jZXJuc1BhcmFtIjpbImFzc2VydEJhbGxvdENvbmNlcm5zUGFyYW0iLGZhbHNlXSwibWFrZVBhcmFtQ2hhbmdlUG9zaXRpb25zIjpbIm1ha2VQYXJhbUNoYW5nZVBvc2l0aW9ucyIsZmFsc2VdLCJzZXR1cFBhcmFtR292ZXJuYW5jZSI6WyJzZXR1cFBhcmFtR292ZXJuYW5jZSIsZmFsc2VdLCJDT05UUkFDVF9FTEVDVE9SQVRFIjpbIkNPTlRSQUNUX0VMRUNUT1JBVEUiLGZhbHNlXSwiYXNzZXJ0RWxlY3RvcmF0ZU1hdGNoZXMiOlsiYXNzZXJ0RWxlY3RvcmF0ZU1hdGNoZXMiLGZhbHNlXSwibWFrZVBhcmFtTWFuYWdlckJ1aWxkZXIiOlsibWFrZVBhcmFtTWFuYWdlckJ1aWxkZXIiLGZhbHNlXSwibWFrZVBhcmFtTWFuYWdlciI6WyJtYWtlUGFyYW1NYW5hZ2VyIixmYWxzZV0sIm1ha2VQYXJhbU1hbmFnZXJTeW5jIjpbIm1ha2VQYXJhbU1hbmFnZXJTeW5jIixmYWxzZV0sImFzc2VydENvbnRyYWN0R292ZXJuYW5jZSI6WyJhc3NlcnRDb250cmFjdEdvdmVybmFuY2UiLGZhbHNlXSwiYXNzZXJ0Q29udHJhY3RFbGVjdG9yYXRlIjpbImFzc2VydENvbnRyYWN0RWxlY3RvcmF0ZSIsZmFsc2VdLCJQYXJhbVR5cGVzIjpbIlBhcmFtVHlwZXMiLGZhbHNlXSwibWFrZUJpbmFyeVZvdGVDb3VudGVyIjpbIm1ha2VCaW5hcnlWb3RlQ291bnRlciIsZmFsc2VdfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAD9w6DRow8AAKMPAAApAAAAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjkuMy9zcmMvcXVlc3Rpb24uanN7ImltcG9ydHMiOlsiLi90eXBlR3VhcmRzLmpzIiwiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvem9lL3NyYy9tYWtlSGFuZGxlLmpzIl0sImV4cG9ydHMiOlsiQ2hvaWNlTWV0aG9kIiwiRWxlY3Rpb25UeXBlIiwiUXVvcnVtUnVsZSIsImJ1aWxkVW5yYW5rZWRRdWVzdGlvbiIsImNvZXJjZVF1ZXN0aW9uU3BlYyIsInBvc2l0aW9uSW5jbHVkZWQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgbWFrZUhlYXBGYXJJbnN0YW5jZSxmaXQsa2V5RVEsTSxtYWtlSGFuZGxlLFF1ZXN0aW9uSSxRdWVzdGlvblNwZWNTaGFwZTskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJtYWtlSGVhcEZhckluc3RhbmNlXCIsIFskaOKAjV9hID0+IChtYWtlSGVhcEZhckluc3RhbmNlID0gJGjigI1fYSldXSxbXCJmaXRcIiwgWyRo4oCNX2EgPT4gKGZpdCA9ICRo4oCNX2EpXV0sW1wia2V5RVFcIiwgWyRo4oCNX2EgPT4gKGtleUVRID0gJGjigI1fYSldXSxbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvem9lL3NyYy9tYWtlSGFuZGxlLmpzXCIsIFtbXCJtYWtlSGFuZGxlXCIsIFskaOKAjV9hID0+IChtYWtlSGFuZGxlID0gJGjigI1fYSldXV1dLFtcIi4vdHlwZUd1YXJkcy5qc1wiLCBbW1wiUXVlc3Rpb25JXCIsIFskaOKAjV9hID0+IChRdWVzdGlvbkkgPSAkaOKAjV9hKV1dLFtcIlF1ZXN0aW9uU3BlY1NoYXBlXCIsIFskaOKAjV9hID0+IChRdWVzdGlvblNwZWNTaGFwZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuLyogVG9waWNzIGJlaW5nIHZvdGVkIG9uIGFyZSAnUXVlc3Rpb25zJy4gQmVmb3JlIGEgUXVlc3Rpb24gaXMga25vd24gdG8gYSovXG4vKiBlbGVjdG9yYXRlLCB0aGUgcGFyYW1ldGVycyBjYW4gYmUgZGVzY3JpYmVkIHdpdGggYSBRdWVzdGlvblNwZWMuIE9uY2UgdGhlKi9cbi8qIHF1ZXN0aW9uIGhhcyBiZWVuIHByZXNlbnRlZCB0byBhbiBFbGVjdG9yYXRlLCB0aGVyZSBpcyBhIFF1ZXN0aW9uRGV0YWlscyovXG4vKiByZWNvcmQgdGhhdCBhbHNvIGluY2x1ZGVzIHRoZSBWb3RlQ291bnRlciB3aGljaCB3aWxsIGRldGVybWluZSB0aGUgb3V0Y29tZSovXG4vKiBhbmQgdGhlIHF1ZXN0aW9uSGFuZGxlIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyBpdC4qL1xuXG4vKipcbiAqIFwidW5yYW5rZWRcIiBpcyBtb3JlIGZvcm1hbGx5IGtub3duIGFzIFwiYXBwcm92YWxcIiB2b3RpbmcsIGJ1dCB0aGlzIGlzIGhhcmQgZm9yXG4gKiBwZW9wbGUgdG8gaW50dWl0IHdoZW4gdGhlcmUgYXJlIG9ubHkgdHdvIGFsdGVybmF0aXZlcy5cbiAqL1xuY29uc3QgQ2hvaWNlTWV0aG9kPS8qKiBAdHlwZSB7Y29uc3R9ICove1xuVU5SQU5LRUQ6J3VucmFua2VkJyxcbk9SREVSOidvcmRlcid9OyRo4oCNX29uY2UuQ2hvaWNlTWV0aG9kKENob2ljZU1ldGhvZCk7XG5cblxuY29uc3QgRWxlY3Rpb25UeXBlPS8qKiBAdHlwZSB7Y29uc3R9ICove1xuLyogQSBwYXJhbWV0ZXIgaXMgbmFtZWQsIGFuZCBhIG5ldyB2YWx1ZSBwcm9wb3NlZCovXG5QQVJBTV9DSEFOR0U6J3BhcmFtX2NoYW5nZScsXG4vKiBjaG9vc2Ugb25lIG9yIG11bHRpcGxlIHdpbm5lcnMsIGRlcGVuZGluZyBvbiBDaG9pY2VNZXRob2QqL1xuRUxFQ1RJT046J2VsZWN0aW9uJyxcblNVUlZFWTonc3VydmV5Jyxcbi8qIHdoZXRoZXIgb3Igbm90IHRvIGludm9rZSBhbiBBUEkgbWV0aG9kKi9cbkFQSV9JTlZPQ0FUSU9OOidhcGlfaW52b2NhdGlvbicsXG5PRkZFUl9GSUxURVI6J29mZmVyX2ZpbHRlcid9OyRo4oCNX29uY2UuRWxlY3Rpb25UeXBlKEVsZWN0aW9uVHlwZSk7XG5cblxuY29uc3QgUXVvcnVtUnVsZT0vKiogQHR5cGUge2NvbnN0fSAqL3tcbk1BSk9SSVRZOidtYWpvcml0eScsXG5OT19RVU9SVU06J25vX3F1b3J1bScsXG4vKiBUaGUgZWxlY3Rpb24gaXNuJ3QgdmFsaWQgdW5sZXNzIGFsbCB2b3RlcnMgdm90ZSovXG5BTEw6J2FsbCd9O1xuXG5cbi8qKiBAdHlwZSB7UG9zaXRpb25JbmNsdWRlZH0gKi8kaOKAjV9vbmNlLlF1b3J1bVJ1bGUoUXVvcnVtUnVsZSk7XG5jb25zdCBwb3NpdGlvbkluY2x1ZGVkPShwb3NpdGlvbnMscCk9PnBvc2l0aW9ucy5zb21lKChlKT0+a2V5RVEoZSxwKSk7XG5cbi8qKlxuICogQHBhcmFtIHtRdWVzdGlvblNwZWN9IGFsbGVnZWRRdWVzdGlvblNwZWNcbiAqIEByZXR1cm5zIHtRdWVzdGlvblNwZWN9XG4gKi8kaOKAjV9vbmNlLnBvc2l0aW9uSW5jbHVkZWQocG9zaXRpb25JbmNsdWRlZCk7XG5jb25zdCBjb2VyY2VRdWVzdGlvblNwZWM9KHtcbm1ldGhvZCxcbmlzc3VlLFxucG9zaXRpb25zLFxuZWxlY3Rpb25UeXBlLFxubWF4Q2hvaWNlcyxcbmNsb3NpbmdSdWxlLFxucXVvcnVtUnVsZSxcbnRpZU91dGNvbWV9KT0+XG57XG5jb25zdCBxdWVzdGlvbj1oYXJkZW4oe1xubWV0aG9kLFxuaXNzdWUsXG5wb3NpdGlvbnMsXG5tYXhDaG9pY2VzOk51bWJlcihtYXhDaG9pY2VzKSxcbmVsZWN0aW9uVHlwZSxcbmNsb3NpbmdSdWxlLFxucXVvcnVtUnVsZSxcbnRpZU91dGNvbWV9KTtcblxuXG5maXQocXVlc3Rpb24sUXVlc3Rpb25TcGVjU2hhcGUpO1xuXG4vKiBYWFggSXQgd291bGQgYmUgbmljZSB0byBlbmZvcmNlIHRoaXMgdXNpbmcgcGFyYW1ldGVyaXplZCB0eXBlcywgYnV0IHRoYXQqL1xuLyogc2VlbXMgdG8gb25seSBlbmZvcmNlIHR5cGUgY29uc3RyYWludHMsIChpLmUuIHRoZSB0aWVPdXRjb21lIHdpbGwgYmUgdGhlKi9cbi8qIHNhbWUgdHlwZSBhcyBhbnkgb2YgdGhlIHBvc2l0aW9ucykgdW5sZXNzIHlvdSBjYW4gcHJvdmlkZSB0aGUgY29uY3JldGUqL1xuLyogdmFsdWUgYXQgcGF0dGVybiBjcmVhdGlvbiB0aW1lLiovXG5maXQocXVlc3Rpb24udGllT3V0Y29tZSxNLm9yKC4uLnF1ZXN0aW9uLnBvc2l0aW9ucykpO1xuXG5yZXR1cm4gcXVlc3Rpb247XG4gfTtcblxuLyoqIEB0eXBlIHtCdWlsZFVucmFua2VkUXVlc3Rpb259ICovJGjigI1fb25jZS5jb2VyY2VRdWVzdGlvblNwZWMoY29lcmNlUXVlc3Rpb25TcGVjKTtcbmNvbnN0IGJ1aWxkVW5yYW5rZWRRdWVzdGlvbj0ocXVlc3Rpb25TcGVjLGNvdW50ZXJJbnN0YW5jZSk9PntcbmNvbnN0IHF1ZXN0aW9uSGFuZGxlPW1ha2VIYW5kbGUoJ1F1ZXN0aW9uJyk7XG5cbi8qKiBAdHlwZSB7UXVlc3Rpb259ICovXG5yZXR1cm4gbWFrZUhlYXBGYXJJbnN0YW5jZSgncXVlc3Rpb24gZGV0YWlscycsUXVlc3Rpb25JLHtcbmdldFZvdGVDb3VudGVyKCl7XG5yZXR1cm4gY291bnRlckluc3RhbmNlO1xuIH0sXG5nZXREZXRhaWxzKCl7XG5yZXR1cm4gaGFyZGVuKHtcbi4uLnF1ZXN0aW9uU3BlYyxcbnF1ZXN0aW9uSGFuZGxlLFxuY291bnRlckluc3RhbmNlfSk7XG5cbiB9fSk7XG5cbiB9OyRo4oCNX29uY2UuYnVpbGRVbnJhbmtlZFF1ZXN0aW9uKGJ1aWxkVW5yYW5rZWRRdWVzdGlvbik7XG5cbmhhcmRlbihidWlsZFVucmFua2VkUXVlc3Rpb24pO1xuaGFyZGVuKENob2ljZU1ldGhvZCk7XG5oYXJkZW4oRWxlY3Rpb25UeXBlKTtcbmhhcmRlbihjb2VyY2VRdWVzdGlvblNwZWMpO1xuaGFyZGVuKHBvc2l0aW9uSW5jbHVkZWQpO1xuaGFyZGVuKFF1b3J1bVJ1bGUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkNob2ljZU1ldGhvZCI6WyJDaG9pY2VNZXRob2QiXSwiRWxlY3Rpb25UeXBlIjpbIkVsZWN0aW9uVHlwZSJdLCJRdW9ydW1SdWxlIjpbIlF1b3J1bVJ1bGUiXSwicG9zaXRpb25JbmNsdWRlZCI6WyJwb3NpdGlvbkluY2x1ZGVkIl0sImNvZXJjZVF1ZXN0aW9uU3BlYyI6WyJjb2VyY2VRdWVzdGlvblNwZWMiXSwiYnVpbGRVbnJhbmtlZFF1ZXN0aW9uIjpbImJ1aWxkVW5yYW5rZWRRdWVzdGlvbiJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAbhfUz9DQAAPQ0AAArAAAAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjkuMy9zcmMvdHlwZUd1YXJkcy5qc3siaW1wb3J0cyI6WyJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy9zd2luZ3NldC12YXQvc3JjL3ZhdHMvdGltZXIvdHlwZUd1YXJkcy5qcyIsIkBhZ29yaWMvem9lL3NyYy90eXBlR3VhcmRzLmpzIl0sImV4cG9ydHMiOlsiQXBpSW52b2NhdGlvblBvc2l0aW9uc1NoYXBlIiwiQXBpSW52b2NhdGlvblF1ZXN0aW9uRGV0YWlsc1NoYXBlIiwiQXBpSW52b2NhdGlvblF1ZXN0aW9uU3BlY1NoYXBlIiwiQmluYXJ5Vm90ZUNvdW50ZXJBZG1pbkkiLCJCaW5hcnlWb3RlQ291bnRlckNsb3NlSSIsIkJpbmFyeVZvdGVDb3VudGVyUHVibGljSSIsIkNob2ljZU1ldGhvZFNoYXBlIiwiQ2xvc2luZ1J1bGVTaGFwZSIsIkVsZWN0aW9uVHlwZVNoYXBlIiwiRWxlY3RvcmF0ZUNyZWF0b3JJIiwiRWxlY3RvcmF0ZVB1YmxpY0kiLCJJbnZpdGF0aW9uU2hhcGUiLCJOb0FwaUludm9jYXRpb25Qb3NpdGlvblNoYXBlIiwiTm9PZmZlckZpbHRlclBvc2l0aW9uU2hhcGUiLCJOb1BhcmFtQ2hhbmdlc1Bvc2l0aW9uU2hhcGUiLCJOb1NpbXBsZVBvc2l0aW9uU2hhcGUiLCJPZmZlckZpbHRlcklzc3VlU2hhcGUiLCJPZmZlckZpbHRlclBvc2l0aW9uc1NoYXBlIiwiT2ZmZXJGaWx0ZXJRdWVzdGlvbkRldGFpbHNTaGFwZSIsIk9mZmVyRmlsdGVyUXVlc3Rpb25TcGVjU2hhcGUiLCJQYXJhbUNoYW5nZXNJc3N1ZVNoYXBlIiwiUGFyYW1DaGFuZ2VzUG9zaXRpb25zU2hhcGUiLCJQYXJhbUNoYW5nZXNRdWVzdGlvbkRldGFpbHNTaGFwZSIsIlBhcmFtQ2hhbmdlc1F1ZXN0aW9uU3BlY1NoYXBlIiwiUGFyYW1DaGFuZ2VzU3BlY1NoYXBlIiwiUGFyYW1QYXRoU2hhcGUiLCJQb3NpdGlvblNoYXBlIiwiUXVlc3Rpb25EZXRhaWxzU2hhcGUiLCJRdWVzdGlvbkhhbmRsZVNoYXBlIiwiUXVlc3Rpb25JIiwiUXVlc3Rpb25TcGVjU2hhcGUiLCJRdWVzdGlvblN0YXRzU2hhcGUiLCJRdW9ydW1SdWxlU2hhcGUiLCJTaW1wbGVJc3N1ZVNoYXBlIiwiU2ltcGxlUG9zaXRpb25zU2hhcGUiLCJTaW1wbGVRdWVzdGlvbkRldGFpbHNTaGFwZSIsIlNpbXBsZVF1ZXN0aW9uU3BlY1NoYXBlIiwiU3Vic2NyaWJlclNoYXBlIiwiVm90ZXJIYW5kbGUiLCJZZXNBcGlJbnZvY2F0aW9uUG9zaXRpb25TaGFwZSIsIlllc09mZmVyRmlsdGVyUG9zaXRpb25TaGFwZSIsIlllc1BhcmFtQ2hhbmdlc1Bvc2l0aW9uU2hhcGUiLCJZZXNTaW1wbGVQb3NpdGlvblNoYXBlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IE0sVGltZXN0YW1wU2hhcGUsSW5zdGFuY2VIYW5kbGVTaGFwZSxUaW1lclNoYXBlLG1ha2VIYW5kbGVTaGFwZTskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvc3dpbmdzZXQtdmF0L3NyYy92YXRzL3RpbWVyL3R5cGVHdWFyZHMuanNcIiwgW1tcIlRpbWVzdGFtcFNoYXBlXCIsIFskaOKAjV9hID0+IChUaW1lc3RhbXBTaGFwZSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3pvZS9zcmMvdHlwZUd1YXJkcy5qc1wiLCBbW1wiSW5zdGFuY2VIYW5kbGVTaGFwZVwiLCBbJGjigI1fYSA9PiAoSW5zdGFuY2VIYW5kbGVTaGFwZSA9ICRo4oCNX2EpXV0sW1wiVGltZXJTaGFwZVwiLCBbJGjigI1fYSA9PiAoVGltZXJTaGFwZSA9ICRo4oCNX2EpXV0sW1wibWFrZUhhbmRsZVNoYXBlXCIsIFskaOKAjV9hID0+IChtYWtlSGFuZGxlU2hhcGUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cbmNvbnN0ICAgICAgICBDaG9pY2VNZXRob2RTaGFwZT1NLm9yKCd1bnJhbmtlZCcsJ29yZGVyJyk7JGjigI1fb25jZS5DaG9pY2VNZXRob2RTaGFwZShDaG9pY2VNZXRob2RTaGFwZSk7XG5jb25zdCAgICAgICAgUXVvcnVtUnVsZVNoYXBlPU0ub3IoJ21ham9yaXR5Jywnbm9fcXVvcnVtJywnYWxsJyk7JGjigI1fb25jZS5RdW9ydW1SdWxlU2hhcGUoUXVvcnVtUnVsZVNoYXBlKTtcbmNvbnN0ICAgICAgICBFbGVjdGlvblR5cGVTaGFwZT1NLm9yKFxuJ3BhcmFtX2NoYW5nZScsXG4nZWxlY3Rpb24nLFxuJ3N1cnZleScsXG4nYXBpX2ludm9jYXRpb24nLFxuJ29mZmVyX2ZpbHRlcicpOyRo4oCNX29uY2UuRWxlY3Rpb25UeXBlU2hhcGUoRWxlY3Rpb25UeXBlU2hhcGUpO1xuXG5cbmNvbnN0ICAgICAgICBDbG9zaW5nUnVsZVNoYXBlPWhhcmRlbih7XG50aW1lcjpNLmVyZWYoVGltZXJTaGFwZSksXG5kZWFkbGluZTpUaW1lc3RhbXBTaGFwZX0pO1xuXG5cbi8qIGFsbCB0aGUgc3RyaW5ncyB0aGF0IHdpbGwgYmUgaW4gdGhlIGZpbHRlciBhZnRlciBwYXNzaW5nKi8kaOKAjV9vbmNlLkNsb3NpbmdSdWxlU2hhcGUoQ2xvc2luZ1J1bGVTaGFwZSk7XG5jb25zdCAgICAgICAgWWVzT2ZmZXJGaWx0ZXJQb3NpdGlvblNoYXBlPWhhcmRlbih7XG5zdHJpbmdzOk0uYXJyYXlPZihNLnN0cmluZygpKX0pOyRo4oCNX29uY2UuWWVzT2ZmZXJGaWx0ZXJQb3NpdGlvblNoYXBlKFllc09mZmVyRmlsdGVyUG9zaXRpb25TaGFwZSk7XG5cbmNvbnN0ICAgICAgICBOb09mZmVyRmlsdGVyUG9zaXRpb25TaGFwZT1oYXJkZW4oe1xuZG9udFVwZGF0ZTpNLmFycmF5T2YoTS5zdHJpbmcoKSl9KTskaOKAjV9vbmNlLk5vT2ZmZXJGaWx0ZXJQb3NpdGlvblNoYXBlKE5vT2ZmZXJGaWx0ZXJQb3NpdGlvblNoYXBlKTtcblxuY29uc3QgICAgICAgIE9mZmVyRmlsdGVyUG9zaXRpb25zU2hhcGU9aGFyZGVuKFtcblllc09mZmVyRmlsdGVyUG9zaXRpb25TaGFwZSxcbk5vT2ZmZXJGaWx0ZXJQb3NpdGlvblNoYXBlXSk7JGjigI1fb25jZS5PZmZlckZpbHRlclBvc2l0aW9uc1NoYXBlKE9mZmVyRmlsdGVyUG9zaXRpb25zU2hhcGUpO1xuXG5jb25zdCAgICAgICAgT2ZmZXJGaWx0ZXJJc3N1ZVNoYXBlPWhhcmRlbih7XG5zdHJpbmdzOk0uYXJyYXlPZihNLnN0cmluZygpKX0pOyRo4oCNX29uY2UuT2ZmZXJGaWx0ZXJJc3N1ZVNoYXBlKE9mZmVyRmlsdGVySXNzdWVTaGFwZSk7XG5cbmNvbnN0ICAgICAgICBPZmZlckZpbHRlclF1ZXN0aW9uU3BlY1NoYXBlPWhhcmRlbih7XG5tZXRob2Q6Q2hvaWNlTWV0aG9kU2hhcGUsXG5pc3N1ZTpPZmZlckZpbHRlcklzc3VlU2hhcGUsXG5wb3NpdGlvbnM6T2ZmZXJGaWx0ZXJQb3NpdGlvbnNTaGFwZSxcbmVsZWN0aW9uVHlwZTonb2ZmZXJfZmlsdGVyJyxcbm1heENob2ljZXM6MSxcbmNsb3NpbmdSdWxlOkNsb3NpbmdSdWxlU2hhcGUsXG5xdW9ydW1SdWxlOlF1b3J1bVJ1bGVTaGFwZSxcbnRpZU91dGNvbWU6Tm9PZmZlckZpbHRlclBvc2l0aW9uU2hhcGV9KTskaOKAjV9vbmNlLk9mZmVyRmlsdGVyUXVlc3Rpb25TcGVjU2hhcGUoT2ZmZXJGaWx0ZXJRdWVzdGlvblNwZWNTaGFwZSk7XG5cbmNvbnN0ICAgICAgICBPZmZlckZpbHRlclF1ZXN0aW9uRGV0YWlsc1NoYXBlPWhhcmRlbih7XG4uLi5PZmZlckZpbHRlclF1ZXN0aW9uU3BlY1NoYXBlLFxucXVlc3Rpb25IYW5kbGU6bWFrZUhhbmRsZVNoYXBlKCdRdWVzdGlvbicpLFxuY291bnRlckluc3RhbmNlOkluc3RhbmNlSGFuZGxlU2hhcGV9KTtcblxuXG4vKiBrZXlzIGFyZSBwYXJhbWV0ZXIgbmFtZXMsIHZhbHVlcyBhcmUgcHJvcG9zZWQgdmFsdWVzKi8kaOKAjV9vbmNlLk9mZmVyRmlsdGVyUXVlc3Rpb25EZXRhaWxzU2hhcGUoT2ZmZXJGaWx0ZXJRdWVzdGlvbkRldGFpbHNTaGFwZSk7XG5jb25zdCAgICAgICAgUGFyYW1DaGFuZ2VzU3BlY1NoYXBlPU0ucmVjb3JkT2YoTS5zdHJpbmcoKSxNLmFueSgpKTskaOKAjV9vbmNlLlBhcmFtQ2hhbmdlc1NwZWNTaGFwZShQYXJhbUNoYW5nZXNTcGVjU2hhcGUpO1xuY29uc3QgICAgICAgIFllc1BhcmFtQ2hhbmdlc1Bvc2l0aW9uU2hhcGU9UGFyYW1DaGFuZ2VzU3BlY1NoYXBlOyRo4oCNX29uY2UuWWVzUGFyYW1DaGFuZ2VzUG9zaXRpb25TaGFwZShZZXNQYXJhbUNoYW5nZXNQb3NpdGlvblNoYXBlKTtcbmNvbnN0ICAgICAgICBOb1BhcmFtQ2hhbmdlc1Bvc2l0aW9uU2hhcGU9aGFyZGVuKHtcbm5vQ2hhbmdlOk0uYXJyYXlPZihNLnN0cmluZygpKX0pOyRo4oCNX29uY2UuTm9QYXJhbUNoYW5nZXNQb3NpdGlvblNoYXBlKE5vUGFyYW1DaGFuZ2VzUG9zaXRpb25TaGFwZSk7XG5cbmNvbnN0ICAgICAgICBQYXJhbUNoYW5nZXNQb3NpdGlvbnNTaGFwZT1oYXJkZW4oW1xuWWVzUGFyYW1DaGFuZ2VzUG9zaXRpb25TaGFwZSxcbk5vUGFyYW1DaGFuZ2VzUG9zaXRpb25TaGFwZV0pOyRo4oCNX29uY2UuUGFyYW1DaGFuZ2VzUG9zaXRpb25zU2hhcGUoUGFyYW1DaGFuZ2VzUG9zaXRpb25zU2hhcGUpO1xuXG5jb25zdCAgICAgICAgUGFyYW1QYXRoU2hhcGU9aGFyZGVuKHtcbmtleTpNLmFueSgpfSk7JGjigI1fb25jZS5QYXJhbVBhdGhTaGFwZShQYXJhbVBhdGhTaGFwZSk7XG5cbmNvbnN0ICAgICAgICBQYXJhbUNoYW5nZXNJc3N1ZVNoYXBlPWhhcmRlbih7XG5zcGVjOntcbnBhcmFtUGF0aDpQYXJhbVBhdGhTaGFwZSxcbmNoYW5nZXM6UGFyYW1DaGFuZ2VzU3BlY1NoYXBlfSxcblxuY29udHJhY3Q6SW5zdGFuY2VIYW5kbGVTaGFwZX0pOyRo4oCNX29uY2UuUGFyYW1DaGFuZ2VzSXNzdWVTaGFwZShQYXJhbUNoYW5nZXNJc3N1ZVNoYXBlKTtcblxuY29uc3QgICAgICAgIFBhcmFtQ2hhbmdlc1F1ZXN0aW9uU3BlY1NoYXBlPWhhcmRlbih7XG5tZXRob2Q6J3VucmFua2VkJyxcbmlzc3VlOlBhcmFtQ2hhbmdlc0lzc3VlU2hhcGUsXG5wb3NpdGlvbnM6UGFyYW1DaGFuZ2VzUG9zaXRpb25zU2hhcGUsXG5lbGVjdGlvblR5cGU6J3BhcmFtX2NoYW5nZScsXG5tYXhDaG9pY2VzOjEsXG5jbG9zaW5nUnVsZTpDbG9zaW5nUnVsZVNoYXBlLFxucXVvcnVtUnVsZTonbWFqb3JpdHknLFxudGllT3V0Y29tZTpOb1BhcmFtQ2hhbmdlc1Bvc2l0aW9uU2hhcGV9KTskaOKAjV9vbmNlLlBhcmFtQ2hhbmdlc1F1ZXN0aW9uU3BlY1NoYXBlKFBhcmFtQ2hhbmdlc1F1ZXN0aW9uU3BlY1NoYXBlKTtcblxuXG5jb25zdCAgICAgICAgUGFyYW1DaGFuZ2VzUXVlc3Rpb25EZXRhaWxzU2hhcGU9aGFyZGVuKHtcbi4uLlBhcmFtQ2hhbmdlc1F1ZXN0aW9uU3BlY1NoYXBlLFxucXVlc3Rpb25IYW5kbGU6bWFrZUhhbmRsZVNoYXBlKCdRdWVzdGlvbicpLFxuY291bnRlckluc3RhbmNlOkluc3RhbmNlSGFuZGxlU2hhcGV9KTskaOKAjV9vbmNlLlBhcmFtQ2hhbmdlc1F1ZXN0aW9uRGV0YWlsc1NoYXBlKFBhcmFtQ2hhbmdlc1F1ZXN0aW9uRGV0YWlsc1NoYXBlKTtcblxuXG5jb25zdCBBcGlJbnZvY2F0aW9uU3BlY1NoYXBlPWhhcmRlbih7XG5hcGlNZXRob2ROYW1lOk0uc3RyaW5nKCksXG5tZXRob2RBcmdzOk0uYXJyYXlPZihNLmFueSgpKX0pO1xuXG5jb25zdCAgICAgICAgWWVzQXBpSW52b2NhdGlvblBvc2l0aW9uU2hhcGU9QXBpSW52b2NhdGlvblNwZWNTaGFwZTskaOKAjV9vbmNlLlllc0FwaUludm9jYXRpb25Qb3NpdGlvblNoYXBlKFllc0FwaUludm9jYXRpb25Qb3NpdGlvblNoYXBlKTtcbmNvbnN0ICAgICAgICBOb0FwaUludm9jYXRpb25Qb3NpdGlvblNoYXBlPWhhcmRlbih7XG5kb250SW52b2tlOk0uc3RyaW5nKCl9KTskaOKAjV9vbmNlLk5vQXBpSW52b2NhdGlvblBvc2l0aW9uU2hhcGUoTm9BcGlJbnZvY2F0aW9uUG9zaXRpb25TaGFwZSk7XG5cbmNvbnN0ICAgICAgICBBcGlJbnZvY2F0aW9uUG9zaXRpb25zU2hhcGU9aGFyZGVuKFtcblllc0FwaUludm9jYXRpb25Qb3NpdGlvblNoYXBlLFxuTm9BcGlJbnZvY2F0aW9uUG9zaXRpb25TaGFwZV0pOyRo4oCNX29uY2UuQXBpSW52b2NhdGlvblBvc2l0aW9uc1NoYXBlKEFwaUludm9jYXRpb25Qb3NpdGlvbnNTaGFwZSk7XG5cbmNvbnN0ICAgICAgICBBcGlJbnZvY2F0aW9uUXVlc3Rpb25TcGVjU2hhcGU9aGFyZGVuKHtcbm1ldGhvZDondW5yYW5rZWQnLFxuaXNzdWU6QXBpSW52b2NhdGlvblNwZWNTaGFwZSxcbnBvc2l0aW9uczpBcGlJbnZvY2F0aW9uUG9zaXRpb25zU2hhcGUsXG5lbGVjdGlvblR5cGU6J2FwaV9pbnZvY2F0aW9uJyxcbm1heENob2ljZXM6MSxcbmNsb3NpbmdSdWxlOkNsb3NpbmdSdWxlU2hhcGUsXG5xdW9ydW1SdWxlOlF1b3J1bVJ1bGVTaGFwZSxcbnRpZU91dGNvbWU6Tm9BcGlJbnZvY2F0aW9uUG9zaXRpb25TaGFwZX0pOyRo4oCNX29uY2UuQXBpSW52b2NhdGlvblF1ZXN0aW9uU3BlY1NoYXBlKEFwaUludm9jYXRpb25RdWVzdGlvblNwZWNTaGFwZSk7XG5cbmNvbnN0ICAgICAgICBBcGlJbnZvY2F0aW9uUXVlc3Rpb25EZXRhaWxzU2hhcGU9aGFyZGVuKHtcbi4uLkFwaUludm9jYXRpb25RdWVzdGlvblNwZWNTaGFwZSxcbnF1ZXN0aW9uSGFuZGxlOm1ha2VIYW5kbGVTaGFwZSgnUXVlc3Rpb24nKSxcbmNvdW50ZXJJbnN0YW5jZTpJbnN0YW5jZUhhbmRsZVNoYXBlfSk7JGjigI1fb25jZS5BcGlJbnZvY2F0aW9uUXVlc3Rpb25EZXRhaWxzU2hhcGUoQXBpSW52b2NhdGlvblF1ZXN0aW9uRGV0YWlsc1NoYXBlKTtcblxuXG5jb25zdCBTaW1wbGVTcGVjU2hhcGU9aGFyZGVuKHtcbnRleHQ6TS5zdHJpbmcoKX0pO1xuXG5jb25zdCAgICAgICAgWWVzU2ltcGxlUG9zaXRpb25TaGFwZT1oYXJkZW4oe3RleHQ6TS5zdHJpbmcoKX0pOyRo4oCNX29uY2UuWWVzU2ltcGxlUG9zaXRpb25TaGFwZShZZXNTaW1wbGVQb3NpdGlvblNoYXBlKTtcbmNvbnN0ICAgICAgICBOb1NpbXBsZVBvc2l0aW9uU2hhcGU9aGFyZGVuKHt0ZXh0Ok0uc3RyaW5nKCl9KTskaOKAjV9vbmNlLk5vU2ltcGxlUG9zaXRpb25TaGFwZShOb1NpbXBsZVBvc2l0aW9uU2hhcGUpO1xuY29uc3QgICAgICAgIFNpbXBsZVBvc2l0aW9uc1NoYXBlPWhhcmRlbihbXG5ZZXNTaW1wbGVQb3NpdGlvblNoYXBlLFxuTm9TaW1wbGVQb3NpdGlvblNoYXBlXSk7JGjigI1fb25jZS5TaW1wbGVQb3NpdGlvbnNTaGFwZShTaW1wbGVQb3NpdGlvbnNTaGFwZSk7XG5cbmNvbnN0ICAgICAgICBTaW1wbGVJc3N1ZVNoYXBlPVNpbXBsZVNwZWNTaGFwZTskaOKAjV9vbmNlLlNpbXBsZUlzc3VlU2hhcGUoU2ltcGxlSXNzdWVTaGFwZSk7XG5jb25zdCAgICAgICAgU2ltcGxlUXVlc3Rpb25TcGVjU2hhcGU9aGFyZGVuKHtcbm1ldGhvZDpDaG9pY2VNZXRob2RTaGFwZSxcbmlzc3VlOlNpbXBsZUlzc3VlU2hhcGUsXG5wb3NpdGlvbnM6U2ltcGxlUG9zaXRpb25zU2hhcGUsXG5lbGVjdGlvblR5cGU6TS5vcignZWxlY3Rpb24nLCdzdXJ2ZXknKSxcbm1heENob2ljZXM6TS5ndGUoMSksXG5jbG9zaW5nUnVsZTpDbG9zaW5nUnVsZVNoYXBlLFxucXVvcnVtUnVsZTpRdW9ydW1SdWxlU2hhcGUsXG50aWVPdXRjb21lOk5vU2ltcGxlUG9zaXRpb25TaGFwZX0pOyRo4oCNX29uY2UuU2ltcGxlUXVlc3Rpb25TcGVjU2hhcGUoU2ltcGxlUXVlc3Rpb25TcGVjU2hhcGUpO1xuXG5jb25zdCAgICAgICAgU2ltcGxlUXVlc3Rpb25EZXRhaWxzU2hhcGU9aGFyZGVuKHtcbi4uLlNpbXBsZVF1ZXN0aW9uU3BlY1NoYXBlLFxucXVlc3Rpb25IYW5kbGU6bWFrZUhhbmRsZVNoYXBlKCdRdWVzdGlvbicpLFxuY291bnRlckluc3RhbmNlOkluc3RhbmNlSGFuZGxlU2hhcGV9KTskaOKAjV9vbmNlLlNpbXBsZVF1ZXN0aW9uRGV0YWlsc1NoYXBlKFNpbXBsZVF1ZXN0aW9uRGV0YWlsc1NoYXBlKTtcblxuXG5jb25zdCAgICAgICAgUXVlc3Rpb25TcGVjU2hhcGU9TS5vcihcbkFwaUludm9jYXRpb25RdWVzdGlvblNwZWNTaGFwZSxcbk9mZmVyRmlsdGVyUXVlc3Rpb25TcGVjU2hhcGUsXG5QYXJhbUNoYW5nZXNRdWVzdGlvblNwZWNTaGFwZSxcblNpbXBsZVF1ZXN0aW9uU3BlY1NoYXBlKTskaOKAjV9vbmNlLlF1ZXN0aW9uU3BlY1NoYXBlKFF1ZXN0aW9uU3BlY1NoYXBlKTtcblxuXG5jb25zdCAgICAgICAgUG9zaXRpb25TaGFwZT1NLm9yKFxuWWVzQXBpSW52b2NhdGlvblBvc2l0aW9uU2hhcGUsXG5Ob0FwaUludm9jYXRpb25Qb3NpdGlvblNoYXBlLFxuWWVzT2ZmZXJGaWx0ZXJQb3NpdGlvblNoYXBlLFxuTm9PZmZlckZpbHRlclBvc2l0aW9uU2hhcGUsXG5ZZXNTaW1wbGVQb3NpdGlvblNoYXBlLFxuTm9TaW1wbGVQb3NpdGlvblNoYXBlLFxuWWVzUGFyYW1DaGFuZ2VzUG9zaXRpb25TaGFwZSxcbk5vUGFyYW1DaGFuZ2VzUG9zaXRpb25TaGFwZSk7JGjigI1fb25jZS5Qb3NpdGlvblNoYXBlKFBvc2l0aW9uU2hhcGUpO1xuXG5cbmNvbnN0ICAgICAgICBRdWVzdGlvbkhhbmRsZVNoYXBlPW1ha2VIYW5kbGVTaGFwZSgncXVlc3Rpb24nKTtcblxuLyogVE9ETyhoaWJiZXJ0KTogYWRkIGRldGFpbHM7IG1vdmUgdG8gYSBtb3JlIGFwcHJvcHJpYXRlIGxvY2F0aW9uKi8kaOKAjV9vbmNlLlF1ZXN0aW9uSGFuZGxlU2hhcGUoUXVlc3Rpb25IYW5kbGVTaGFwZSk7XG5jb25zdCAgICAgICAgU3Vic2NyaWJlclNoYXBlPU0ucmVtb3RhYmxlKCdTdWJzY3JpYmVyJyk7JGjigI1fb25jZS5TdWJzY3JpYmVyU2hhcGUoU3Vic2NyaWJlclNoYXBlKTtcbmNvbnN0ICAgICAgICBJbnZpdGF0aW9uU2hhcGU9TS5yZW1vdGFibGUoJ0ludml0YXRpb24nKTtcblxuLyogWFhYIEkgd2FudCB0byBhZGQgcXVlc3Rpb25IYW5kbGUgYW5kIGNvdW50ZXJJbnN0YW5jZSB0byovXG4vKiBQYXJhbUNoYW5nZXNRdWVzdGlvblNwZWNTaGFwZS4gSSBkb24ndCBzZWUgYW55IGFsdGVybmF0aXZlIHRvIGFkZGluZyB0aGUqL1xuLyogbWV0aG9kcyB0byBlYWNoIG1lbWJlciBzZXBhcmF0ZWx5Ki8kaOKAjV9vbmNlLkludml0YXRpb25TaGFwZShJbnZpdGF0aW9uU2hhcGUpO1xuY29uc3QgICAgICAgIFF1ZXN0aW9uRGV0YWlsc1NoYXBlPU0ub3IoXG5QYXJhbUNoYW5nZXNRdWVzdGlvbkRldGFpbHNTaGFwZSxcbkFwaUludm9jYXRpb25RdWVzdGlvbkRldGFpbHNTaGFwZSxcbk9mZmVyRmlsdGVyUXVlc3Rpb25EZXRhaWxzU2hhcGUsXG5TaW1wbGVRdWVzdGlvbkRldGFpbHNTaGFwZSk7JGjigI1fb25jZS5RdWVzdGlvbkRldGFpbHNTaGFwZShRdWVzdGlvbkRldGFpbHNTaGFwZSk7XG5cblxuY29uc3QgICAgICAgIEVsZWN0b3JhdGVQdWJsaWNJPU0uaW50ZXJmYWNlKCdDb21taXR0ZWUgUHVibGljRmFjZXQnLHtcbmdldFF1ZXN0aW9uU3Vic2NyaWJlcjpNLmNhbGwoKS5yZXR1cm5zKFN1YnNjcmliZXJTaGFwZSksXG5nZXRPcGVuUXVlc3Rpb25zOk0uY2FsbCgpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuZ2V0TmFtZTpNLmNhbGwoKS5yZXR1cm5zKE0uc3RyaW5nKCkpLFxuZ2V0SW5zdGFuY2U6TS5jYWxsKCkucmV0dXJucyhJbnN0YW5jZUhhbmRsZVNoYXBlKSxcbmdldFF1ZXN0aW9uOk0uY2FsbChRdWVzdGlvbkhhbmRsZVNoYXBlKS5yZXR1cm5zKE0ucHJvbWlzZSgpKX0pOyRo4oCNX29uY2UuRWxlY3RvcmF0ZVB1YmxpY0koRWxlY3RvcmF0ZVB1YmxpY0kpO1xuXG5jb25zdCBFbGVjdG9yYXRlUHVibGljU2hhcGU9TS5yZW1vdGFibGUoJ0VsZWN0b3JhdGVQdWJsaWMnKTtcblxuY29uc3QgICAgICAgIEVsZWN0b3JhdGVDcmVhdG9yST1NLmludGVyZmFjZSgnQ29tbWl0dGVlIEFkbWluRmFjZXQnLHtcbmdldFBvc2VySW52aXRhdGlvbjpNLmNhbGwoKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbmFkZFF1ZXN0aW9uOk0uY2FsbChJbnN0YW5jZUhhbmRsZVNoYXBlLFF1ZXN0aW9uU3BlY1NoYXBlKS5yZXR1cm5zKFxuTS5wcm9taXNlKCkpLFxuXG5nZXRWb3Rlckludml0YXRpb25zOk0uY2FsbCgpLnJldHVybnMoTS5hcnJheU9mKE0ucHJvbWlzZSgpKSksXG5nZXRRdWVzdGlvblN1YnNjcmliZXI6TS5jYWxsKCkucmV0dXJucyhTdWJzY3JpYmVyU2hhcGUpLFxuZ2V0UHVibGljRmFjZXQ6TS5jYWxsKCkucmV0dXJucyhFbGVjdG9yYXRlUHVibGljU2hhcGUpfSk7JGjigI1fb25jZS5FbGVjdG9yYXRlQ3JlYXRvckkoRWxlY3RvcmF0ZUNyZWF0b3JJKTtcblxuXG5jb25zdCAgICAgICAgUXVlc3Rpb25TdGF0c1NoYXBlPWhhcmRlbih7XG5zcG9pbGVkOk0ubmF0KCksXG52b3RlczpNLm5hdCgpLFxucmVzdWx0czpNLmFycmF5T2Yoe3Bvc2l0aW9uOlBvc2l0aW9uU2hhcGUsdG90YWw6TS5uYXQoKX0pfSk7JGjigI1fb25jZS5RdWVzdGlvblN0YXRzU2hhcGUoUXVlc3Rpb25TdGF0c1NoYXBlKTtcblxuXG5jb25zdCAgICAgICAgUXVlc3Rpb25JPU0uaW50ZXJmYWNlKCdRdWVzdGlvbicse1xuZ2V0Vm90ZUNvdW50ZXI6TS5jYWxsKCkucmV0dXJucyhJbnN0YW5jZUhhbmRsZVNoYXBlKSxcbmdldERldGFpbHM6TS5jYWxsKCkucmV0dXJucyhRdWVzdGlvbkRldGFpbHNTaGFwZSl9KTskaOKAjV9vbmNlLlF1ZXN0aW9uSShRdWVzdGlvbkkpO1xuXG5jb25zdCBRdWVzdGlvblNoYXBlPU0ucmVtb3RhYmxlKCdRdWVzdGlvbicpO1xuXG5jb25zdCAgICAgICAgQmluYXJ5Vm90ZUNvdW50ZXJQdWJsaWNJPU0uaW50ZXJmYWNlKFxuJ0JpbmFyeVZvdGVDb3VudGVyIFB1YmxpY0ZhY2V0JyxcbntcbmdldFF1ZXN0aW9uOk0uY2FsbCgpLnJldHVybnMoUXVlc3Rpb25TaGFwZSksXG5pc09wZW46TS5jYWxsKCkucmV0dXJucyhNLmJvb2xlYW4oKSksXG5nZXRPdXRjb21lOk0uY2FsbCgpLnJldHVybnMoTS5lcmVmKE0ucHJvbWlzZSgpKSksXG5nZXRTdGF0czpNLmNhbGwoKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbmdldERldGFpbHM6TS5jYWxsKCkucmV0dXJucyhRdWVzdGlvbkRldGFpbHNTaGFwZSksXG5nZXRJbnN0YW5jZTpNLmNhbGwoKS5yZXR1cm5zKEluc3RhbmNlSGFuZGxlU2hhcGUpfSk7JGjigI1fb25jZS5CaW5hcnlWb3RlQ291bnRlclB1YmxpY0koQmluYXJ5Vm90ZUNvdW50ZXJQdWJsaWNJKTtcblxuXG5cbmNvbnN0ICAgICAgICBWb3RlckhhbmRsZT1NLnJlbW90YWJsZSgpOyRo4oCNX29uY2UuVm90ZXJIYW5kbGUoVm90ZXJIYW5kbGUpO1xuY29uc3QgICAgICAgIEJpbmFyeVZvdGVDb3VudGVyQWRtaW5JPU0uaW50ZXJmYWNlKFxuJ0JpbmFyeVZvdGVDb3VudGVyIEFkbWluRmFjZXQnLFxue1xuc3VibWl0Vm90ZTpNLmNhbGwoVm90ZXJIYW5kbGUsTS5hcnJheU9mKFBvc2l0aW9uU2hhcGUpKS5cbm9wdGlvbmFsKE0ubmF0KCkpLlxucmV0dXJucyh7Y2hvc2VuOlBvc2l0aW9uU2hhcGUsc2hhcmVzOk0ubmF0KCl9KX0pOyRo4oCNX29uY2UuQmluYXJ5Vm90ZUNvdW50ZXJBZG1pbkkoQmluYXJ5Vm90ZUNvdW50ZXJBZG1pbkkpO1xuXG5cblxuY29uc3QgICAgICAgIEJpbmFyeVZvdGVDb3VudGVyQ2xvc2VJPU0uaW50ZXJmYWNlKFxuJ0JpbmFyeVZvdGVDb3VudGVyIENsb3NlRmFjZXQnLFxue1xuY2xvc2VWb3Rpbmc6TS5jYWxsKCkucmV0dXJucygpfSk7JGjigI1fb25jZS5CaW5hcnlWb3RlQ291bnRlckNsb3NlSShCaW5hcnlWb3RlQ291bnRlckNsb3NlSSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQ2hvaWNlTWV0aG9kU2hhcGUiOlsiQ2hvaWNlTWV0aG9kU2hhcGUiXSwiUXVvcnVtUnVsZVNoYXBlIjpbIlF1b3J1bVJ1bGVTaGFwZSJdLCJFbGVjdGlvblR5cGVTaGFwZSI6WyJFbGVjdGlvblR5cGVTaGFwZSJdLCJDbG9zaW5nUnVsZVNoYXBlIjpbIkNsb3NpbmdSdWxlU2hhcGUiXSwiWWVzT2ZmZXJGaWx0ZXJQb3NpdGlvblNoYXBlIjpbIlllc09mZmVyRmlsdGVyUG9zaXRpb25TaGFwZSJdLCJOb09mZmVyRmlsdGVyUG9zaXRpb25TaGFwZSI6WyJOb09mZmVyRmlsdGVyUG9zaXRpb25TaGFwZSJdLCJPZmZlckZpbHRlclBvc2l0aW9uc1NoYXBlIjpbIk9mZmVyRmlsdGVyUG9zaXRpb25zU2hhcGUiXSwiT2ZmZXJGaWx0ZXJJc3N1ZVNoYXBlIjpbIk9mZmVyRmlsdGVySXNzdWVTaGFwZSJdLCJPZmZlckZpbHRlclF1ZXN0aW9uU3BlY1NoYXBlIjpbIk9mZmVyRmlsdGVyUXVlc3Rpb25TcGVjU2hhcGUiXSwiT2ZmZXJGaWx0ZXJRdWVzdGlvbkRldGFpbHNTaGFwZSI6WyJPZmZlckZpbHRlclF1ZXN0aW9uRGV0YWlsc1NoYXBlIl0sIlBhcmFtQ2hhbmdlc1NwZWNTaGFwZSI6WyJQYXJhbUNoYW5nZXNTcGVjU2hhcGUiXSwiWWVzUGFyYW1DaGFuZ2VzUG9zaXRpb25TaGFwZSI6WyJZZXNQYXJhbUNoYW5nZXNQb3NpdGlvblNoYXBlIl0sIk5vUGFyYW1DaGFuZ2VzUG9zaXRpb25TaGFwZSI6WyJOb1BhcmFtQ2hhbmdlc1Bvc2l0aW9uU2hhcGUiXSwiUGFyYW1DaGFuZ2VzUG9zaXRpb25zU2hhcGUiOlsiUGFyYW1DaGFuZ2VzUG9zaXRpb25zU2hhcGUiXSwiUGFyYW1QYXRoU2hhcGUiOlsiUGFyYW1QYXRoU2hhcGUiXSwiUGFyYW1DaGFuZ2VzSXNzdWVTaGFwZSI6WyJQYXJhbUNoYW5nZXNJc3N1ZVNoYXBlIl0sIlBhcmFtQ2hhbmdlc1F1ZXN0aW9uU3BlY1NoYXBlIjpbIlBhcmFtQ2hhbmdlc1F1ZXN0aW9uU3BlY1NoYXBlIl0sIlBhcmFtQ2hhbmdlc1F1ZXN0aW9uRGV0YWlsc1NoYXBlIjpbIlBhcmFtQ2hhbmdlc1F1ZXN0aW9uRGV0YWlsc1NoYXBlIl0sIlllc0FwaUludm9jYXRpb25Qb3NpdGlvblNoYXBlIjpbIlllc0FwaUludm9jYXRpb25Qb3NpdGlvblNoYXBlIl0sIk5vQXBpSW52b2NhdGlvblBvc2l0aW9uU2hhcGUiOlsiTm9BcGlJbnZvY2F0aW9uUG9zaXRpb25TaGFwZSJdLCJBcGlJbnZvY2F0aW9uUG9zaXRpb25zU2hhcGUiOlsiQXBpSW52b2NhdGlvblBvc2l0aW9uc1NoYXBlIl0sIkFwaUludm9jYXRpb25RdWVzdGlvblNwZWNTaGFwZSI6WyJBcGlJbnZvY2F0aW9uUXVlc3Rpb25TcGVjU2hhcGUiXSwiQXBpSW52b2NhdGlvblF1ZXN0aW9uRGV0YWlsc1NoYXBlIjpbIkFwaUludm9jYXRpb25RdWVzdGlvbkRldGFpbHNTaGFwZSJdLCJZZXNTaW1wbGVQb3NpdGlvblNoYXBlIjpbIlllc1NpbXBsZVBvc2l0aW9uU2hhcGUiXSwiTm9TaW1wbGVQb3NpdGlvblNoYXBlIjpbIk5vU2ltcGxlUG9zaXRpb25TaGFwZSJdLCJTaW1wbGVQb3NpdGlvbnNTaGFwZSI6WyJTaW1wbGVQb3NpdGlvbnNTaGFwZSJdLCJTaW1wbGVJc3N1ZVNoYXBlIjpbIlNpbXBsZUlzc3VlU2hhcGUiXSwiU2ltcGxlUXVlc3Rpb25TcGVjU2hhcGUiOlsiU2ltcGxlUXVlc3Rpb25TcGVjU2hhcGUiXSwiU2ltcGxlUXVlc3Rpb25EZXRhaWxzU2hhcGUiOlsiU2ltcGxlUXVlc3Rpb25EZXRhaWxzU2hhcGUiXSwiUXVlc3Rpb25TcGVjU2hhcGUiOlsiUXVlc3Rpb25TcGVjU2hhcGUiXSwiUG9zaXRpb25TaGFwZSI6WyJQb3NpdGlvblNoYXBlIl0sIlF1ZXN0aW9uSGFuZGxlU2hhcGUiOlsiUXVlc3Rpb25IYW5kbGVTaGFwZSJdLCJTdWJzY3JpYmVyU2hhcGUiOlsiU3Vic2NyaWJlclNoYXBlIl0sIkludml0YXRpb25TaGFwZSI6WyJJbnZpdGF0aW9uU2hhcGUiXSwiUXVlc3Rpb25EZXRhaWxzU2hhcGUiOlsiUXVlc3Rpb25EZXRhaWxzU2hhcGUiXSwiRWxlY3RvcmF0ZVB1YmxpY0kiOlsiRWxlY3RvcmF0ZVB1YmxpY0kiXSwiRWxlY3RvcmF0ZUNyZWF0b3JJIjpbIkVsZWN0b3JhdGVDcmVhdG9ySSJdLCJRdWVzdGlvblN0YXRzU2hhcGUiOlsiUXVlc3Rpb25TdGF0c1NoYXBlIl0sIlF1ZXN0aW9uSSI6WyJRdWVzdGlvbkkiXSwiQmluYXJ5Vm90ZUNvdW50ZXJQdWJsaWNJIjpbIkJpbmFyeVZvdGVDb3VudGVyUHVibGljSSJdLCJWb3RlckhhbmRsZSI6WyJWb3RlckhhbmRsZSJdLCJCaW5hcnlWb3RlQ291bnRlckFkbWluSSI6WyJCaW5hcnlWb3RlQ291bnRlckFkbWluSSJdLCJCaW5hcnlWb3RlQ291bnRlckNsb3NlSSI6WyJCaW5hcnlWb3RlQ291bnRlckNsb3NlSSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACzawssFVcAABVXAAAmAAAAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjkuMy9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBAdHMtY2hlY2sqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsgJ3VucmFua2VkJyB8ICdvcmRlcicgfSBDaG9pY2VNZXRob2RcbiAqICogVU5SQU5LRUQ6IFwidW5yYW5rZWQgdm90aW5nXCIgbWVhbnMgdGhhdCB0aGUgdm90ZXIgc3BlY2lmaWVzIHNvbWUgbnVtYmVyIG9mXG4gKiAgICBwb3NpdGlvbnMsIGFuZCBpcyBlbmRvcnNpbmcgdGhlbSBlcXVhbGx5LlxuICogKiBPUkRFUjogVGhlIHZvdGVyIGFzc2lnbnMgb3JkaW5hbCBudW1iZXJzIHRvIHNvbWUgb2YgdGhlIHBvc2l0aW9ucy4gVGhlXG4gKiAgICBwb3NpdGlvbnMgd2lsbCBiZSB0cmVhdGVkIGFzIGFuIG9yZGVyZWQgbGlzdCB3aXRoIG5vIGdhcHMuXG4gKlxuICogV2hlbiB2b3RlcnMgYXJlIGxpbWl0ZWQgdG8gY2hvb3NpbmcgYSBzaW5nbGUgY2FuZGlkYXRlLCBlaXRoZXIgVU5SQU5LRUQgb3JcbiAqIE9SREVSIHdvdWxkIHdvcmsuIFVOUkFOS0VEIGhhcyBhIHNpbXBsZXIgcmVwcmVzZW50YXRpb24gc28gd2UgdXNlIHRoYXQuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7ICdwYXJhbV9jaGFuZ2UnIHwgJ2VsZWN0aW9uJyB8ICdzdXJ2ZXknIHwgJ2FwaV9pbnZvY2F0aW9uJyB8XG4gKiAgICdvZmZlcl9maWx0ZXInIH0gRWxlY3Rpb25UeXBlXG4gKiBwYXJhbV9jaGFuZ2UgaXMgdmVyeSBzcGVjaWZpYy4gU3VydmV5IG1lYW5zIG11bHRpcGxlIGFuc3dlcnMgYXJlIHBvc3NpYmxlLFxuICogRWxlY3Rpb24gbWVhbnMgc29tZSBjYW5kaWRhdGVzIGFyZSBnb2luZyB0byBcIndpblwiLiBJdCdzIG5vdCBjbGVhciB0aGVzZSBhcmVcbiAqIG9ydGhvZ29uYWwuIFRoZSBpbXBvcnRhbnQgZGlzdGluY3Rpb24gaXMgdGhhdCBwYXJhbV9jaGFuZ2UgaGFzIGEgc3RydWN0dXJlZFxuICogaXNzdWUsIHdoaWxlIHRoZSBvdGhlcnMgaGF2ZSBhIGlzc3VlIHByZXNlbnRlZCBhcyBhIHN0cmluZy5cbiAqL1xuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vY29uc3RhbnRzLmpzJykuUGFyYW1UeXBlfSBQYXJhbVR5cGUgKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7ICdtYWpvcml0eScgfCAnYWxsJyB8ICdub19xdW9ydW0nIH0gUXVvcnVtUnVsZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU2ltcGxlSXNzdWVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0ZXh0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7IEFtb3VudCB8IEJyYW5kIHwgSW5zdGFsbGF0aW9uIHwgSW5zdGFuY2UgfCBiaWdpbnQgfFxuICogICBSYXRpbyB8IHN0cmluZyB8IHVua25vd24gfSBQYXJhbVZhbHVlXG4gKi9cblxuLyogWFhYIGJldHRlciB0byB1c2UgdGhlIG1hbmlmZXN0IGNvbnN0YW50IFBhcmFtVHlwZXMqL1xuLyogYnV0IGltcG9ydGluZyB0aGF0IGhlcmUgdHVybnMgdGhpcyBmaWxlIGludG8gYSBtb2R1bGUsKi9cbi8qIGJyZWFraW5nIHRoZSBhbWJpZW50IHR5cGluZyovXG4vKipcbiAqIEB0ZW1wbGF0ZSB7UGFyYW1UeXBlfSBUXG4gKiBAdHlwZWRlZiB7VCBleHRlbmRzICdhbW91bnQnID8gQW1vdW50IDpcbiAqIFQgZXh0ZW5kcyAnYnJhbmQnID8gQnJhbmQgOlxuICogVCBleHRlbmRzICdpbnN0YWxsYXRpb24nID8gSW5zdGFsbGF0aW9uOlxuICogVCBleHRlbmRzICdpbnN0YW5jZScgPyBJbnN0YW5jZSA6XG4gKiBUIGV4dGVuZHMgJ2ludml0YXRpb24nID8gQW1vdW50IDogLy8gWFhYIHRoaXMgaXMgdGhlIGdldHRlciB2YWx1ZSBidXQgbm90IHRoZSBzZXR0ZXJcbiAqIFQgZXh0ZW5kcyAnbmF0JyA/IGJpZ2ludCA6XG4gKiBUIGV4dGVuZHMgJ3JhdGlvJyA/IFJhdGlvIDpcbiAqIFQgZXh0ZW5kcyAnc3RyaW5nJyA/IHN0cmluZyA6XG4gKiBUIGV4dGVuZHMgJ3Vua25vd24nID8gdW5rbm93biA6XG4gKiBuZXZlclxuICogfSBQYXJhbVZhbHVlRm9yVHlwZVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtQYXJhbVR5cGV9IFtUPVBhcmFtVHlwZV1cbiAqIEB0eXBlZGVmIHt7IHR5cGU6IFQsIHZhbHVlOiBQYXJhbVZhbHVlRm9yVHlwZTxUPiB9fSBQYXJhbVZhbHVlVHlwZWQ8VD5cbiAqL1xuXG4vKipcbiAqIFRlcm1zIGEgY29udHJhY3QgbXVzdCBwcm92aWRlIGluIG9yZGVyIHRvIGJlIGdvdmVybmVkLlxuICpcbiAqIEB0ZW1wbGF0ZSB7WGltcG9ydCgnLi9jb250cmFjdEdvdmVybmFuY2UvdHlwZWRQYXJhbU1hbmFnZXIuanMnKS5QYXJhbVR5cGVzTWFwfSBUIEdvdmVybmVkIHBhcmFtZXRlcnMgb2YgY29udHJhY3RcbiAqIEB0eXBlZGVmIHt7IGVsZWN0aW9uTWFuYWdlcjogSW5zdGFuY2UsIGdvdmVybmVkUGFyYW1zOiBYaW1wb3J0KCcuL2NvbnRyYWN0R292ZXJuYW5jZS90eXBlZFBhcmFtTWFuYWdlci5qcycpLlBhcmFtUmVjb3Jkc0Zyb21UeXBlczxUICYgeyBFbGVjdG9yYXRlOiAnaW52aXRhdGlvbicgfT4gfSB9IEdvdmVybmFuY2VUZXJtczxUPlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyBTaW1wbGVJc3N1ZSB8IFBhcmFtQ2hhbmdlSXNzdWU8dW5rbm93bj4gfCBBcGlJbnZvY2F0aW9uSXNzdWUgfFxuICogICBPZmZlckZpbHRlcklzc3VlIH0gSXNzdWVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFF1ZXN0aW9uVGVybXMgLSBRdWVzdGlvblNwZWMgcGx1cyB0aGUgRWxlY3RvcmF0ZSBJbnN0YW5jZSBhbmRcbiAqICAgYSBudW1lcmljYWwgdGhyZXNob2xkIGZvciB0aGUgcXVvcnVtLiAoVGhlIHZvdGVDb3VudGVyIGRvZXNuJ3Qga25vdyB0aGVcbiAqICAgc2l6ZSBvZiB0aGUgZWxlY3RvcmF0ZSwgc28gdGhlIEVsZWN0b3JhdGUgaGFzIHRvIHNheSB3aGF0IGxpbWl0IHRvIGVuZm9yY2UuKVxuICogQHByb3BlcnR5IHtRdWVzdGlvblNwZWN9IHF1ZXN0aW9uU3BlY1xuICogQHByb3BlcnR5IHtudW1iZXJ9IHF1b3J1bVRocmVzaG9sZFxuICogQHByb3BlcnR5IHtJbnN0YW5jZX0gZWxlY3RvcmF0ZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gVGV4dFBvc2l0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdGV4dFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyBUZXh0UG9zaXRpb24gfCBDaGFuZ2VQYXJhbXNQb3NpdGlvbiB8IE5vQ2hhbmdlUGFyYW1zUG9zaXRpb24gfCBJbnZva2VBcGlQb3NpdGlvbiB8IERvbnRJbnZva2VBcGlQb3NpdGlvbiB8XG4gKiAgICBPZmZlckZpbHRlclBvc2l0aW9uIHwgTm9DaGFuZ2VPZmZlckZpbHRlclBvc2l0aW9uIHwgSW52b2tlQXBpUG9zaXRpb24gfSBQb3NpdGlvblxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge3sgcXVlc3Rpb246IEhhbmRsZTwnUXVlc3Rpb24nPiB9ICYgKFxuICogICB7IG91dGNvbWU6ICd3aW4nLCBwb3NpdGlvbjogUG9zaXRpb24gfSB8XG4gKiAgIHsgb3V0Y29tZTogJ2ZhaWwnLCByZWFzb246ICdObyBxdW9ydW0nIH1cbiAqICl9IE91dGNvbWVSZWNvcmRcbiAqL1xuXG4vKipcbiAqIFNwZWNpZmljYXRpb24gd2hlbiByZXF1ZXN0aW5nIGNyZWF0aW9uIG9mIGEgUXVlc3Rpb25cbiAqXG4gKiBAdGVtcGxhdGUge0lzc3VlfSBbST1Jc3N1ZV1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFF1ZXN0aW9uU3BlY1xuICogQHByb3BlcnR5IHtDaG9pY2VNZXRob2R9IG1ldGhvZFxuICogQHByb3BlcnR5IHtJfSBpc3N1ZVxuICogQHByb3BlcnR5IHtQb3NpdGlvbltdfSBwb3NpdGlvbnNcbiAqIEBwcm9wZXJ0eSB7RWxlY3Rpb25UeXBlfSBlbGVjdGlvblR5cGVcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBtYXhDaG9pY2VzXG4gKiBAcHJvcGVydHkge0Nsb3NpbmdSdWxlfSBjbG9zaW5nUnVsZVxuICogQHByb3BlcnR5IHtRdW9ydW1SdWxlfSBxdW9ydW1SdWxlXG4gKiBAcHJvcGVydHkge1Bvc2l0aW9ufSB0aWVPdXRjb21lXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBRdWVzdGlvbkRldGFpbHNFeHRyYVByb3BlcnRpZXNcbiAqIEBwcm9wZXJ0eSB7SW5zdGFuY2V9IGNvdW50ZXJJbnN0YW5jZSAtIGluc3RhbmNlIG9mIHRoZSBWb3RlQ291bnRlclxuICogQHByb3BlcnR5IHtIYW5kbGU8J1F1ZXN0aW9uJz59IHF1ZXN0aW9uSGFuZGxlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7UXVlc3Rpb25TcGVjICYgUXVlc3Rpb25EZXRhaWxzRXh0cmFQcm9wZXJ0aWVzfSBRdWVzdGlvbkRldGFpbHNcbiAqICAgIGNvbXBsZXRlIHF1ZXN0aW9uIGRldGFpbHM6IHF1ZXN0aW9uU3BlYyBwbHVzIGNvdW50ZXIgYW5kIHF1ZXN0aW9uSGFuZGxlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBHb3Zlcm5hbmNlUGFpclxuICogQHByb3BlcnR5IHtJbnN0YW5jZX0gZ292ZXJub3JcbiAqIEBwcm9wZXJ0eSB7SW5zdGFuY2V9IGdvdmVybmVkXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBRdWVzdGlvblxuICogQHByb3BlcnR5IHsoKSA9PiBJbnN0YW5jZX0gZ2V0Vm90ZUNvdW50ZXJcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUXVlc3Rpb25EZXRhaWxzfSBnZXREZXRhaWxzXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBDb21wbGV0ZVVucmFua2VkUXVlc3Rpb25cbiAqIEBwcm9wZXJ0eSB7SGFuZGxlPCdRdWVzdGlvbic+fSBxdWVzdGlvbkhhbmRsZVxuICogQHByb3BlcnR5IHtQb3NpdGlvbltdfSBjaG9zZW4gLSBhIGxpc3Qgb2YgZXF1YWwtd2VpZ2h0IHByZWZlcnJlZCBwb3NpdGlvbnNcbiAqL1xuXG4vKiBub3QgeWV0IGluIHVzZSovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IENvbXBsZXRlV2VpZ2h0ZWRCYWxsb3RcbiAqIEBwcm9wZXJ0eSB7SGFuZGxlPCdRdWVzdGlvbic+fSBxdWVzdGlvbkhhbmRsZVxuICogQHByb3BlcnR5IHtbUG9zaXRpb24sYmlnaW50XVtdfSB3ZWlnaHRlZCAtIGxpc3Qgb2YgcG9zaXRpb25zIHdpdGhcbiAqICAgd2VpZ2h0cy4gVm90ZUNvdW50ZXIgbWF5IGxpbWl0IHdlaWdodHMgdG8gYSByYW5nZSBvciByZXF1aXJlIHVuaXF1ZW5lc3MuXG4gKi9cblxuLyogbm90IHlldCBpbiB1c2UqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBDb21wbGV0ZU9yZGVyZWRCYWxsb3RcbiAqIEBwcm9wZXJ0eSB7SGFuZGxlPCdRdWVzdGlvbic+fSBxdWVzdGlvbkhhbmRsZVxuICogQHByb3BlcnR5IHtQb3NpdGlvbltdfSBvcmRlcmVkIC0gb3JkZXJlZCBsaXN0IG9mIHBvc2l0aW9uIGZyb20gbW9zdCBwcmVmZXJyZWRcbiAqICAgdG8gbGVhc3QgcHJlZmVycmVkXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQb3NpdGlvbkNvdW50XG4gKiBAcHJvcGVydHkge1Bvc2l0aW9ufSBwb3NpdGlvblxuICogQHByb3BlcnR5IHtiaWdpbnR9IHRvdGFsXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBWb3RlU3RhdGlzdGljc1xuICogQHByb3BlcnR5IHtiaWdpbnR9IHNwb2lsZWRcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB2b3Rlc1xuICogQHByb3BlcnR5IHtQb3NpdGlvbkNvdW50W119IHJlc3VsdHNcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFF1b3J1bUNvdW50ZXJcbiAqIEBwcm9wZXJ0eSB7KHN0YXRzOiBWb3RlU3RhdGlzdGljcykgPT4gYm9vbGVhbn0gY2hlY2tcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBCdWlsZFVucmFua2VkUXVlc3Rpb25cbiAqIEBwYXJhbSB7UXVlc3Rpb25TcGVjfSBxdWVzdGlvblNwZWNcbiAqIEBwYXJhbSB7SW5zdGFuY2V9IGluc3RhbmNlIC0gdm90ZUNvdW50ZXIgaW5zdGFuY2VcbiAqIEByZXR1cm5zIHtRdWVzdGlvbn1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFZvdGVDb3VudGVyQ3JlYXRvckZhY2V0IC0gYSBmYWNldCB0aGF0IHRoZSBFbGVjdG9yYXRlIHNob3VsZFxuICogICBob2xkIHRpZ2h0bHkuIHN1Ym1pdFZvdGUoKSBpcyB0aGUgY29yZSBjYXBhYmlsaXR5IHRoYXQgYWxsb3dzIHRoZSBob2xkZXIgdG9cbiAqICAgc3BlY2lmeSB0aGUgaWRlbnRpdHkgYW5kIGNob2ljZSBvZiBhIHZvdGVyLiBUaGUgdm90ZUNvdW50ZXIgaXMgbWFraW5nIHRoYXRcbiAqICAgYXZhaWxhYmxlIHRvIHRoZSBFbGVjdG9yYXRlLCB3aGljaCBzaG91bGQgd3JhcCBhbmQgYXR0ZW51YXRlIGl0IHNvIGVhY2hcbiAqICAgdm90ZXIgZ2V0cyBvbmx5IHRoZSBhYmlsaXR5IHRvIGNhc3QgdGhlaXIgb3duIHZvdGUgYXQgYSB3ZWlnaHQgc3BlY2lmaWVkIGJ5XG4gKiAgIHRoZSBlbGVjdG9yYXRlLlxuICogQHByb3BlcnR5IHtTdWJtaXRWb3RlfSBzdWJtaXRWb3RlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBWb3RlQ291bnRlclB1YmxpY0ZhY2V0XG4gKiBAcHJvcGVydHkgeygpID0+IGJvb2xlYW59IGlzT3BlblxuICogQHByb3BlcnR5IHsoKSA9PiBRdWVzdGlvbn0gZ2V0UXVlc3Rpb25cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxQb3NpdGlvbj59IGdldE91dGNvbWVcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUXVlc3Rpb25EZXRhaWxzfSBnZXREZXRhaWxzXG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8Vm90ZVN0YXRpc3RpY3M+fSBnZXRTdGF0c1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gVm90ZUNvdW50ZXJDbG9zZUZhY2V0XG4gKiAgIFRFU1QgT05MWTogU2hvdWxkIG5vdCBiZSBhbGxvd2VkIHRvIGVzY2FwZSBmcm9tIGNvbnRyYWN0c1xuICogQHByb3BlcnR5IHsoKSA9PiB2b2lkfSBjbG9zZVZvdGluZ1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gVm90ZUNvdW50ZXJGYWNldHNcbiAqIEBwcm9wZXJ0eSB7Vm90ZUNvdW50ZXJQdWJsaWNGYWNldH0gcHVibGljRmFjZXRcbiAqIEBwcm9wZXJ0eSB7Vm90ZUNvdW50ZXJDcmVhdG9yRmFjZXR9IGNyZWF0b3JGYWNldFxuICogQHByb3BlcnR5IHtWb3RlQ291bnRlckNsb3NlRmFjZXR9IGNsb3NlRmFjZXRcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBCdWlsZFZvdGVDb3VudGVyXG4gKiBAcGFyYW0ge1F1ZXN0aW9uU3BlY30gcXVlc3Rpb25TcGVjXG4gKiBAcGFyYW0ge2JpZ2ludH0gdGhyZXNob2xkIC0gcXVlc3Rpb25TcGVjIGluY2x1ZGVzIHF1b3J1bVJ1bGU7IHRoZSBlbGVjdG9yYXRlXG4gKiAgICBjb252ZXJ0cyB0aGF0IHRvIGEgbnVtYmVyIHRoYXQgdGhlIGNvdW50ZXIgY2FuIGVuZm9yY2UuXG4gKiBAcGFyYW0ge0luc3RhbmNlfSBpbnN0YW5jZVxuICogQHBhcmFtIHtFUmVmPFB1Ymxpc2hlcjxPdXRjb21lUmVjb3JkPj59IHB1Ymxpc2hlclxuICogQHJldHVybnMge1ZvdGVDb3VudGVyRmFjZXRzfVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQ29tcGxldGVkQmFsbGV0XG4gKiBAcHJvcGVydHkge1Bvc2l0aW9ufSBjaG9zZW5cbiAqIEBwcm9wZXJ0eSB7YmlnaW50fSBzaGFyZXNcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBTdWJtaXRWb3RlXG4gKiBAcGFyYW0ge0hhbmRsZTwnVm90ZXInPn0gdm90ZXJIYW5kbGVcbiAqIEBwYXJhbSB7UG9zaXRpb25bXX0gY2hvc2VuUG9zaXRpb25zXG4gKiBAcGFyYW0ge2JpZ2ludD19IHdlaWdodFxuICogQHJldHVybnMge0NvbXBsZXRlZEJhbGxldH1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBHZXRPcGVuUXVlc3Rpb25zXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxIYW5kbGU8J1F1ZXN0aW9uJz5bXT59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgR2V0UXVlc3Rpb25cbiAqIEBwYXJhbSB7SGFuZGxlPCdRdWVzdGlvbic+fSBoXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxRdWVzdGlvbj59XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBFbGVjdG9yYXRlUHVibGljXG4gKiBAcHJvcGVydHkgeygpID0+IFN1YnNjcmliZXI8UXVlc3Rpb25EZXRhaWxzPn0gZ2V0UXVlc3Rpb25TdWJzY3JpYmVyXG4gKiBAcHJvcGVydHkge0dldE9wZW5RdWVzdGlvbnN9IGdldE9wZW5RdWVzdGlvbnMsXG4gKiBAcHJvcGVydHkgeygpID0+IEluc3RhbmNlfSBnZXRJbnN0YW5jZVxuICogQHByb3BlcnR5IHtHZXRRdWVzdGlvbn0gZ2V0UXVlc3Rpb25cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsgRWxlY3RvcmF0ZVB1YmxpYyAmIHttYWtlVm90ZXJJbnZpdGF0aW9uOiAoKSA9PiBFUmVmPEludml0YXRpb24+fSB9IENsYWltc0VsZWN0b3JhdGVQdWJsaWNcbiAqIEB0eXBlZGVmIHsgRWxlY3RvcmF0ZVB1YmxpYyAmIHtnZXROYW1lOiAoKSA9PiBzdHJpbmd9IH0gQ29tbWl0dGVlRWxlY3RvcmF0ZVB1YmxpY1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUG9zZXJGYWNldFxuICogQHByb3BlcnR5IHtBZGRRdWVzdGlvbn0gYWRkUXVlc3Rpb25cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEVsZWN0b3JhdGVDcmVhdG9yRmFjZXRcbiAqIEBwcm9wZXJ0eSB7QWRkUXVlc3Rpb259IGFkZFF1ZXN0aW9uIGNhbiBiZSB1c2VkIGRpcmVjdGx5IHdoZW4gdGhlIGNyZWF0b3IgZG9lc24ndCBuZWVkIGFueVxuICogIHJlYXNzdXJhbmNlLiBXaGVuIHNvbWVvbmUgbmVlZHMgdG8gY29ubmVjdCBhZGRRdWVzdGlvbiB0byB0aGUgRWxlY3RvcmF0ZVxuICogIGluc3RhbmNlLCBnZXRQb3Nlckludml0YXRpb24oKSBsZXRzIHRoZW0gZ2V0IGFkZFF1ZXN0aW9uIHdpdGggYXNzdXJhbmNlLlxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPEludml0YXRpb24+fSBnZXRQb3Nlckludml0YXRpb25cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gU3Vic2NyaWJlcjxRdWVzdGlvbkRldGFpbHM+fSBnZXRRdWVzdGlvblN1YnNjcmliZXJcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gRWxlY3RvcmF0ZVB1YmxpY30gZ2V0UHVibGljRmFjZXRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsgRWxlY3RvcmF0ZUNyZWF0b3JGYWNldCAmIHtcbiAqICAgZ2V0Vm90ZXJJbnZpdGF0aW9uczogKCkgPT4gUHJvbWlzZTxJbnZpdGF0aW9uPHsgdm90ZXI6IHsgY2FzdEJhbGxvdEZvcihoYW5kbGU6IGFueSwgY2hvaWNlPzogYW55LCApOiB2b2lkfX0+PltdXG4gKiB9fSBDb21taXR0ZWVFbGVjdG9yYXRlQ3JlYXRvckZhY2V0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBHZXRWb3Rlckludml0YXRpb25zXG4gKiBAcHJvcGVydHkgeygpID0+IEludml0YXRpb25bXX0gZ2V0Vm90ZXJJbnZpdGF0aW9uc1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gVm90ZXJGYWNldCAtIGEgZmFjZXQgdGhhdCB0aGUgRWxlY3RvcmF0ZSBzaG91bGQgaG9sZFxuICogICB0aWdodGx5LiBJdCBhbGxvd3Mgc3BlY2lmaWNhdGlvbiBvZiB0aGUgdm90ZSdzIHdlaWdodCwgc28gdGhlIEVsZWN0b3JhdGVcbiAqICAgc2hvdWxkIGRpc3RyaWJ1dGUgYW4gYXR0ZW51YXRlZCB3cmFwcGVyIHRoYXQgZG9lc24ndCBtYWtlIHRoYXQgYXZhaWxhYmxlIVxuICogQHByb3BlcnR5IHtTdWJtaXRWb3RlfSBzdWJtaXRWb3RlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBDbG9zaW5nUnVsZVxuICogQHByb3BlcnR5IHtFUmVmPFRpbWVyPn0gdGltZXJcbiAqIEBwcm9wZXJ0eSB7VGltZXN0YW1wfSBkZWFkbGluZVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIENsb3NlVm90aW5nXG4gKiBAcGFyYW0ge0Nsb3NpbmdSdWxlfSBjbG9zaW5nUnVsZVxuICogQHBhcmFtIHsoKSA9PiB2b2lkfSBjbG9zZVZvdGluZ1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQWRkUXVlc3Rpb25SZXR1cm5cbiAqIEBwcm9wZXJ0eSB7Vm90ZUNvdW50ZXJQdWJsaWNGYWNldH0gcHVibGljRmFjZXRcbiAqIEBwcm9wZXJ0eSB7Vm90ZUNvdW50ZXJDcmVhdG9yRmFjZXR9IGNyZWF0b3JGYWNldFxuICogQHByb3BlcnR5IHtJbnN0YW5jZX0gaW5zdGFuY2VcbiAqIEBwcm9wZXJ0eSB7VGltZXN0YW1wfSBkZWFkbGluZVxuICogQHByb3BlcnR5IHtIYW5kbGU8J1F1ZXN0aW9uJz59IHF1ZXN0aW9uSGFuZGxlXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQWRkUXVlc3Rpb25cbiAqIEBwYXJhbSB7RVJlZjxJbnN0YWxsYXRpb24+fSB2b3RlQ291bnRlclxuICogQHBhcmFtIHtRdWVzdGlvblNwZWN9IHF1ZXN0aW9uU3BlY1xuICogQHJldHVybnMge1Byb21pc2U8QWRkUXVlc3Rpb25SZXR1cm4+fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIENyZWF0ZVF1ZXN0aW9uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyIHRvIGNoYW5nZVxuICogQHBhcmFtIHtQYXJhbVZhbHVlfSBwcm9wb3NlZFZhbHVlIC0gdGhlIHByb3Bvc2VkIHZhbHVlIGZvciB0aGUgbmFtZWRcbiAqICAgcGFyYW1ldGVyXG4gKiBAcGFyYW0ge0luc3RhbGxhdGlvbn0gdm90ZUNvdW50ZXJJbnN0YWxsYXRpb24gLSB0aGUgdm90ZUNvdW50ZXIgdG9cbiAqICAgaW5zdGFudGlhdGUgdG8gY291bnQgdm90ZXMuIEV4cGVjdGVkIHRvIGJlIGEgYmluYXJ5Vm90ZUNvdW50ZXIuIE90aGVyXG4gKiAgIHZvdGVDb3VudGVycyBtaWdodCBiZSBhZGRlZCBoZXJlLCBvciBtaWdodCByZXF1aXJlIHNlcGFyYXRlIGdvdmVybm9ycy5cbiAqICAgdW5kZXIgbWFuYWdlbWVudCBzbyB1c2VycyBjYW4gdHJhY2UgaXQgYmFjayBhbmQgc2VlIHRoYXQgaXQgd291bGQgdXNlXG4gKiAgIHRoaXMgZWxlY3Rpb25NYW5hZ2VyIHRvIG1hbmFnZSBwYXJhbWV0ZXJzXG4gKiBAcGFyYW0ge0luc3RhbmNlfSBjb250cmFjdEluc3RhbmNlIC0gaW5jbHVkZSB0aGUgaW5zdGFuY2Ugb2YgdGhlIGNvbnRyYWN0XG4gKiBAcGFyYW0ge0Nsb3NpbmdSdWxlfSBjbG9zaW5nUnVsZSAtIGRlYWRsaW5lIGFuZCB0aW1lciBmb3IgY2xvc2luZyB2b3RpbmdcbiAqIEByZXR1cm5zIHtQcm9taXNlPFF1ZXN0aW9uRGV0YWlscz59XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgW1A9U3RhbmRhcmRQYXJhbVBhdGhdIHBhdGggZm9yIGEgcGFyYW1NYW5hZ2VyUmV0cmlldmVyXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQYXJhbUNoYW5nZUlzc3VlXG4gKiBAcHJvcGVydHkge1BhcmFtQ2hhbmdlc1NwZWM8UD59IHNwZWNcbiAqIEBwcm9wZXJ0eSB7SW5zdGFuY2V9IGNvbnRyYWN0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBBcGlJbnZvY2F0aW9uSXNzdWVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhcGlNZXRob2ROYW1lXG4gKiBAcHJvcGVydHkge3Vua25vd25bXX0gbWV0aG9kQXJnc1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gT2ZmZXJGaWx0ZXJJc3N1ZVxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gc3RyaW5nc1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUGFyYW1DaGFuZ2VQb3NpdGlvbnNcbiAqIEBwcm9wZXJ0eSB7Q2hhbmdlUGFyYW1zUG9zaXRpb259IHBvc2l0aXZlXG4gKiBAcHJvcGVydHkge05vQ2hhbmdlUGFyYW1zUG9zaXRpb259IG5lZ2F0aXZlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQYXJhbUNoYW5nZUlzc3VlRGV0YWlsc1xuICogICAgZGV0YWlscyBmb3IgYSBxdWVzdGlvbiB0aGF0IGNhbiBjaGFuZ2UgYSBjb250cmFjdCBwYXJhbWV0ZXJcbiAqIEBwcm9wZXJ0eSB7Q2hvaWNlTWV0aG9kfSBtZXRob2RcbiAqIEBwcm9wZXJ0eSB7UGFyYW1DaGFuZ2VJc3N1ZTx1bmtub3duPn0gaXNzdWVcbiAqIEBwcm9wZXJ0eSB7UGFyYW1DaGFuZ2VQb3NpdGlvbnN9IHBvc2l0aW9uc1xuICogQHByb3BlcnR5IHtFbGVjdGlvblR5cGV9IGVsZWN0aW9uVHlwZVxuICogQHByb3BlcnR5IHtudW1iZXJ9IG1heENob2ljZXNcbiAqIEBwcm9wZXJ0eSB7Q2xvc2luZ1J1bGV9IGNsb3NpbmdSdWxlXG4gKiBAcHJvcGVydHkge1F1b3J1bVJ1bGV9IHF1b3J1bVJ1bGVcbiAqIEBwcm9wZXJ0eSB7Tm9DaGFuZ2VQYXJhbXNQb3NpdGlvbn0gdGllT3V0Y29tZVxuICogQHByb3BlcnR5IHtJbnN0YW5jZX0gY291bnRlckluc3RhbmNlIC0gaW5zdGFuY2Ugb2YgdGhlIFZvdGVDb3VudGVyXG4gKiBAcHJvcGVydHkge0hhbmRsZTwnUXVlc3Rpb24nPn0gcXVlc3Rpb25IYW5kbGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8S2V5d29yZCwgUGFyYW1WYWx1ZVR5cGVkPn0gUGFyYW1TdGF0ZVJlY29yZCBhIFJlY29yZCBjb250YWluaW5nXG4gKiAgIGtleXdvcmQgcGFpcnMgd2l0aCBkZXNjcmlwdGlvbnMgb2YgcGFyYW1ldGVycyB1bmRlciBnb3Zlcm5hbmNlLlxuICovXG5cbi8qKiBAdHlwZWRlZiB7e2N1cnJlbnQ6IFBhcmFtU3RhdGVSZWNvcmR9fSBHb3Zlcm5hbmNlU3Vic2NyaXB0aW9uU3RhdGUgKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQYXJhbU1hbmFnZXJCYXNlIFRoZSBiYXNlIHBhcmFtTWFuYWdlciB3aXRoIHR5cGVkIGdldHRlcnNcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUGFyYW1TdGF0ZVJlY29yZH0gZ2V0UGFyYW1zXG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcpID0+IEFtb3VudH0gZ2V0QW1vdW50XG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcpID0+IEJyYW5kfSBnZXRCcmFuZFxuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nKSA9PiBJbnN0YW5jZX0gZ2V0SW5zdGFuY2VcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZykgPT4gSW5zdGFsbGF0aW9ufSBnZXRJbnN0YWxsYXRpb25cbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZykgPT4gQW1vdW50PCdzZXQnPn0gZ2V0SW52aXRhdGlvbkFtb3VudFxuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nKSA9PiBiaWdpbnR9IGdldE5hdFxuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nKSA9PiBSYXRpb30gZ2V0UmF0aW9cbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZykgPT4gc3RyaW5nfSBnZXRTdHJpbmdcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZykgPT4gYW55fSBnZXRVbmtub3duXG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcsIHByb3Bvc2VkVmFsdWU6IFBhcmFtVmFsdWUpID0+IFBhcmFtVmFsdWV9IGdldFZpc2libGVWYWx1ZSAtIGZvclxuICogICBtb3N0IHR5cGVzLCB0aGUgdmlzaWJsZSB2YWx1ZSBpcyB0aGUgc2FtZSBhcyBwcm9wb3NlZFZhbHVlLiBGb3IgSW52aXRhdGlvbnNcbiAqICAgdGhlIHZpc2libGUgdmFsdWUgaXMgdGhlIGFtb3VudCBvZiB0aGUgaW52aXRhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZykgPT4gUHJvbWlzZTxJbnZpdGF0aW9uPn0gZ2V0SW50ZXJuYWxQYXJhbVZhbHVlXG4gKiBAcHJvcGVydHkgeygpID0+IFN0b3JlZFN1YnNjcmlwdGlvbjxHb3Zlcm5hbmNlU3Vic2NyaXB0aW9uU3RhdGU+fSBnZXRTdWJzY3JpcHRpb25cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBVcGRhdGVQYXJhbXNcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZyxQYXJhbVZhbHVlPn0gcGFyYW1DaGFuZ2VzXG4gKi9cblxuLyoqXG4gKiBUaGVzZSBhcmUgdHlwZWQgYGFueWAgYmVjYXVzZSB0aGUgYnVpbGRlciBwYXR0ZXJuIG9mIHBhcmFtTWFuYWdlciBtYWtlcyBpdCB2ZXJ5XG4gKiBjb21wbGljYXRlZCBmb3IgdGhlIHR5cGUgc3lzdGVtIHRvIGtub3cgdGhlIHNldCBvZiBwYXJhbS1zcGVjaWZpYyBmdW5jdGlvbnNcbiAqIHJldHVybmVkIGJ5IGAuYnVpbGQoKWAuIEluc3RlYWQgd2UgbGV0IHBhcmFtTWFuYWdlciBjcmVhdGUgdGhlIGRlc2lyZWQgbWV0aG9kc1xuICogYW5kIHVzZSB0eXBlZFBhcmFtTWFuYWdlciB0byBjcmVhdGUgYSB2ZXJzaW9uIHRoYXQgaW5jbHVkZXMgdGhlIHN0YXRpYyB0eXBlcy5cbiAqXG4gKiBAdHlwZWRlZiB7UmVjb3JkPHN0cmluZywgYW55Pn0gUGFyYW1NYW5hZ2VyR2V0dGVyc0FuZFVwZGF0ZXJzXG4gKiBAdHlwZWRlZiB7UGFyYW1NYW5hZ2VyQmFzZSAmIFBhcmFtTWFuYWdlckdldHRlcnNBbmRVcGRhdGVycyAmIHt1cGRhdGVQYXJhbXM6IFVwZGF0ZVBhcmFtc319IEFueVBhcmFtTWFuYWdlclxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1JlY29yZDxzdHJpbmcsIHN0cmluZ1tdPn0gUGFyYW1ldGVyTmFtZUxpc3RcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRQYXJhbU1hbmFnZXJUeXBlXG4gKiBAcGFyYW0ge1BhcmFtVHlwZX0gdHlwZVxuICogQHBhcmFtIHtQYXJhbVZhbHVlfSB2YWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBCdWlsZFBhcmFtTWFuYWdlciAtIFBhcmFtTWFuYWdlciBpcyBhIGZhY2lsaXR5IHRoYXQgZ292ZXJuZWRcbiAqICAgY29udHJhY3RzIGNhbiB1c2UgdG8gbWFuYWdlIHRoZWlyIHZpc2libGUgc3RhdGUgaW4gYSB3YXkgdGhhdCBhbGxvd3MgdGhlXG4gKiAgIENvbnRyYWN0R292ZXJub3IgdG8gdXBkYXRlIHZhbHVlcyB1c2luZyBnb3Zlcm5hbmNlLiBXaGVuIHBhcmFtTWFuYWdlciBpc1xuICogICBpbnN0YW50aWF0ZWQgaW5zaWRlIHRoZSBjb250cmFjdCwgdGhlIGNvbnRyYWN0IGhhcyBzeW5jaHJvbm91cyBhY2Nlc3MgdG9cbiAqICAgdGhlIHZhbHVlcywgYW5kIGNsaWVudHMgb2YgdGhlIGNvbnRyYWN0IGNhbiB2ZXJpZnkgdGhhdCBhIENvbnRyYWN0R292ZXJub3JcbiAqICAgY2FuIGNoYW5nZSB0aGUgdmFsdWVzIGluIGEgbGVnaWJsZSB3YXkuXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFBhcmFtVmFsdWVUeXBlZD59IHBhcmFtRGVzY3JpcHRpb25zXG4gKiBAcmV0dXJucyB7QW55UGFyYW1NYW5hZ2VyfVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQ2hhbmdlUGFyYW1zUG9zaXRpb25cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZyxQYXJhbVZhbHVlPn0gY2hhbmdlcyBvbmUgb3IgbW9yZSBjaGFuZ2VzIHRvIHBhcmFtZXRlcnNcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IE9mZmVyRmlsdGVyUG9zaXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IHN0cmluZ3NcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IE5vQ2hhbmdlT2ZmZXJGaWx0ZXJQb3NpdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gZG9udFVwZGF0ZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gSW52b2tlQXBpUG9zaXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhcGlNZXRob2ROYW1lXG4gKiBAcHJvcGVydHkge3Vua25vd25bXX0gbWV0aG9kQXJnc1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRG9udEludm9rZUFwaVBvc2l0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZG9udEludm9rZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gTm9DaGFuZ2VQYXJhbXNQb3NpdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gbm9DaGFuZ2UgUGFyYW1ldGVycyBpbiB0aGUgcHJvcG9zYWwgdGhhdCB0aGlzIHBvc2l0aW9uXG4gKiAgIGlzIG9wcG9zZWQgdG9cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEdvdmVybm9yXG4gKiBAcHJvcGVydHkge0NyZWF0ZVF1ZXN0aW9ufSBjcmVhdGVRdWVzdGlvblxuICovXG5cbi8qKiBAdHlwZWRlZiB7eyBbbWV0aG9kTmFtZTogc3RyaW5nXTogKC4uLmFyZ3M6IGFueSkgPT4gdW5rbm93biB9fSBHb3Zlcm5lZEFwaXMgKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge3t9fSBDRlxuICogQHR5cGVkZWYge0dvdmVybmVkQ3JlYXRvckZhY2V0PENGPiAmIHtcbiAqIGdldEdvdmVybmVkQXBpczogKCkgPT4gRVJlZjxHb3Zlcm5lZEFwaXM+O1xuICogZ2V0R292ZXJuZWRBcGlOYW1lczogKCkgPT4gKHN0cmluZyB8IHN5bWJvbClbXTtcbiAqIHNldE9mZmVyRmlsdGVyOiAoc3RyaW5nczogc3RyaW5nW10pID0+IHZvaWQ7XG4gKiB9fSBHb3Zlcm5vckZhY2V0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBHb3Zlcm5vclB1YmxpY1xuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPEluc3RhbmNlPn0gZ2V0RWxlY3RvcmF0ZVxuICogQHByb3BlcnR5IHsoKSA9PiBJbnN0YW5jZX0gZ2V0R292ZXJuZWRDb250cmFjdFxuICogQHByb3BlcnR5IHsodm90ZUNvdW50ZXI6IEluc3RhbmNlKSA9PiBQcm9taXNlPGJvb2xlYW4+fSB2YWxpZGF0ZVZvdGVDb3VudGVyXG4gKiBAcHJvcGVydHkgeyhyZWdQOiBFUmVmPEluc3RhbmNlPikgPT4gUHJvbWlzZTxib29sZWFuPn0gdmFsaWRhdGVFbGVjdG9yYXRlXG4gKiBAcHJvcGVydHkgeyhjbG9zaW5nUnVsZTogQ2xvc2luZ1J1bGUpID0+IGJvb2xlYW59IHZhbGlkYXRlVGltZXJcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBhcmFtS2V5IGlkZW50aWZpZXIgZm9yIGEgcGFyYW1NYW5hZ2VyIHdpdGhpbiBhIGNvbnRyYWN0XG4gKiBAcHJvcGVydHkge3N0cmluZ30ga2V5XG4gKi9cblxuLyoqXG4gKiBEZXNjcmlwdGlvbiBvZiBhIHNldCBvZiBjb29yZGluYXRlZCBjaGFuZ2VzIGZvciBhIFBhcmFtTWFuYWdlclxuICpcbiAqIEB0ZW1wbGF0ZSBQIHBhdGggZm9yIGEgcGFyYW1NYW5hZ2VyUmV0cmlldmVyXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQYXJhbUNoYW5nZXNTcGVjPFA+XG4gKiBAcHJvcGVydHkge1B9IHBhcmFtUGF0aFxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBQYXJhbVZhbHVlPn0gY2hhbmdlcyBvbmUgb3IgbW9yZSBjaGFuZ2VzIHRvIHBhcmFtZXRlcnNcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IENvbnRyYWN0R292ZXJuYW5jZVZvdGVSZXN1bHRcbiAqIEBwcm9wZXJ0eSB7SW5zdGFuY2V9IGluc3RhbmNlIC0gaW5zdGFuY2Ugb2YgdGhlIFZvdGVDb3VudGVyXG4gKiBAcHJvcGVydHkge0VSZWY8UXVlc3Rpb25EZXRhaWxzPn0gZGV0YWlsc1xuICogQHByb3BlcnR5IHtQcm9taXNlPFBhcmFtVmFsdWU+fSBvdXRjb21lT2ZVcGRhdGUgLSBBIHByb21pc2UgZm9yIHRoZSByZXN1bHRcbiAqICAgIG9mIHVwZGF0aW5nIHRoZSBwYXJhbWV0ZXIgdmFsdWUuIFByaW1hcmlseSB1c2VmdWwgZm9yIGl0cyBiZWhhdmlvciBvblxuICogICAgcmVqZWN0aW9uLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHt7fX0gQ0ZcbiAqIEB0eXBlZGVmIHtDRn0gTGltaXRlZENyZWF0b3JGYWNldFxuICpcbiAqIFRoZSBjcmVhdG9yRmFjZXQgZm9yIHRoZSBnb3Zlcm5lZCBjb250cmFjdCB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZVxuICogcmVzcG9uc2libGUgcGFydHkuIEl0IGRvZXMgbm90IGhhdmUgYWNjZXNzIHRvIHRoZSBwYXJhbU1hbmFnZXIuXG4gKiBAcHJvcGVydHkgeygpID0+IEluc3RhbmNlfSBnZXRDb250cmFjdEdvdmVybm9yXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge3t9fSBQRiBQdWJsaWMgZmFjZXQgb2YgZ292ZXJuZWQgY29udHJhY3RcbiAqIEB0ZW1wbGF0ZSB7e319IENGIENyZWF0b3IgZmFjZXQgb2YgZ292ZXJuZWQgY29udHJhY3RcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEdvdmVybmVkQ29udHJhY3RGYWNldEFjY2Vzc1xuICogQHByb3BlcnR5IHtWb3RlT25QYXJhbUNoYW5nZXN9IHZvdGVPblBhcmFtQ2hhbmdlc1xuICogQHByb3BlcnR5IHtWb3RlT25BcGlJbnZvY2F0aW9ufSB2b3RlT25BcGlJbnZvY2F0aW9uXG4gKiBAcHJvcGVydHkge1ZvdGVPbk9mZmVyRmlsdGVyfSB2b3RlT25PZmZlckZpbHRlclxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPExpbWl0ZWRDcmVhdG9yRmFjZXQ8Q0Y+Pn0gZ2V0Q3JlYXRvckZhY2V0IC0gY3JlYXRvclxuICogICBmYWNldCBvZiB0aGUgZ292ZXJuZWQgY29udHJhY3QsIHdpdGhvdXQgdGhlIHRpZ2h0bHkgaGVsZCBhYmlsaXR5IHRvIGNoYW5nZVxuICogICBwYXJhbSB2YWx1ZXMuXG4gKiBAcHJvcGVydHkgeyhwb3Nlckludml0YXRpb246IEludml0YXRpb24pID0+IFByb21pc2U8dm9pZD59IHJlcGxhY2VFbGVjdG9yYXRlXG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8QWRtaW5GYWNldD59IGdldEFkbWluRmFjZXRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gR292ZXJuZWRQdWJsaWNGYWNldDxQRj59IGdldFB1YmxpY0ZhY2V0IC0gcHVibGljIGZhY2V0IG9mIHRoZSBnb3Zlcm5lZCBjb250cmFjdFxuICogQHByb3BlcnR5IHsoKSA9PiBJbnN0YW5jZX0gZ2V0SW5zdGFuY2UgLSBpbnN0YW5jZSBvZiB0aGUgZ292ZXJuZWRcbiAqICAgY29udHJhY3RcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEdvdmVybmVkUHVibGljRmFjZXRNZXRob2RzXG4gKiBAcHJvcGVydHkgeygpID0+IFN0b3JlZFN1YnNjcmlwdGlvbjxHb3Zlcm5hbmNlU3Vic2NyaXB0aW9uU3RhdGU+fSBnZXRTdWJzY3JpcHRpb25cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gSW5zdGFuY2V9IGdldENvbnRyYWN0R292ZXJub3JcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUGFyYW1TdGF0ZVJlY29yZH0gZ2V0R292ZXJuZWRQYXJhbXMgLSBnZXQgZGVzY3JpcHRpb25zIG9mXG4gKiAgIGFsbCB0aGUgZ292ZXJuZWQgcGFyYW1ldGVyc1xuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nKSA9PiBBbW91bnR9IGdldEFtb3VudFxuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nKSA9PiBCcmFuZH0gZ2V0QnJhbmRcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZykgPT4gSW5zdGFuY2V9IGdldEluc3RhbmNlXG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcpID0+IEluc3RhbGxhdGlvbn0gZ2V0SW5zdGFsbGF0aW9uXG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcpID0+IEFtb3VudH0gZ2V0SW52aXRhdGlvbkFtb3VudFxuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nKSA9PiBiaWdpbnR9IGdldE5hdFxuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nKSA9PiBSYXRpb30gZ2V0UmF0aW9cbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZykgPT4gc3RyaW5nfSBnZXRTdHJpbmdcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZykgPT4gYW55fSBnZXRVbmtub3duXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge29iamVjdH0gUEYgUHVibGljIGZhY2V0XG4gKiBAdHlwZWRlZiB7UEYgJiBHb3Zlcm5lZFB1YmxpY0ZhY2V0TWV0aG9kc30gR292ZXJuZWRQdWJsaWNGYWNldFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHt7fX0gQ0YgY3JlYXRvciBmYWNldFxuICogQHR5cGVkZWYgR292ZXJuZWRDcmVhdG9yRmFjZXRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUGFyYW1NYW5hZ2VyUmV0cmlldmVyfSBnZXRQYXJhbU1nclJldHJpZXZlciAtIGFsbG93cyBhY2Nlc3NpbmdcbiAqICAgYW5kIHVwZGF0aW5nIGdvdmVybmVkIHBhcmFtZXRlcnMuIFNob3VsZCBvbmx5IGJlIGRpcmVjdGx5IGFjY2Vzc2libGUgdG8gdGhlXG4gKiAgIGNvbnRyYWN0R292ZXJub3JcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gTGltaXRlZENyZWF0b3JGYWNldDxDRj59IGdldExpbWl0ZWRDcmVhdG9yRmFjZXQgLSB0aGUgY3JlYXRvclxuICogICBmYWNldCBvZiB0aGUgZ292ZXJuZWQgY29udHJhY3QuIERvZXNuJ3QgcHJvdmlkZSBhY2Nlc3MgdG8gYW55IGdvdmVybmFuY2VcbiAqICAgZnVuY3Rpb25hbGl0eVxuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nKSA9PiBQcm9taXNlPEludml0YXRpb24+fSBnZXRJbnZpdGF0aW9uXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgV3JhcFB1YmxpY0ZhY2V0XG4gKiBAcGFyYW0ge1R9IG9yaWdpbmFsUHVibGljRmFjZXRcbiAqIEByZXR1cm5zIHtUICYgR292ZXJuZWRQdWJsaWNGYWNldH1cbiAqIEB0ZW1wbGF0ZSBUXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgV3JhcENyZWF0b3JGYWNldFxuICogQHBhcmFtIHtUfSBvcmlnaW5hbENyZWF0b3JGYWNldFxuICogQHJldHVybnMge0dvdmVybmVkQ3JlYXRvckZhY2V0PFQ+fVxuICogQHRlbXBsYXRlIFRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHt7a2V5OiBzdHJpbmd9fSBTdGFuZGFyZFBhcmFtUGF0aFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUGFyYW1NYW5hZ2VyUmV0cmlldmVyXG4gKiBAcHJvcGVydHkgeyhwYXJhbUtleT86IFBhcmFtS2V5KSA9PiBBbnlQYXJhbU1hbmFnZXJ9IGdldFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFtQPVN0YW5kYXJkUGFyYW1QYXRoXVxuICpcbiAqIEBjYWxsYmFjayBWb3RlT25QYXJhbUNoYW5nZXNcbiAqIEBwYXJhbSB7SW5zdGFsbGF0aW9ufSB2b3RlQ291bnRlckluc3RhbGxhdGlvblxuICogQHBhcmFtIHtUaW1lc3RhbXB9IGRlYWRsaW5lXG4gKiBAcGFyYW0ge1BhcmFtQ2hhbmdlc1NwZWM8UD59IHBhcmFtU3BlY1xuICogQHJldHVybnMge0NvbnRyYWN0R292ZXJuYW5jZVZvdGVSZXN1bHR9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgVm90ZU9uQXBpSW52b2NhdGlvblxuICogQHBhcmFtIHtzdHJpbmd9IGFwaU1ldGhvZE5hbWVcbiAqIEBwYXJhbSB7dW5rbm93bltdfSBtZXRob2RBcmdzXG4gKiBAcGFyYW0ge0luc3RhbGxhdGlvbn0gdm90ZUNvdW50ZXJJbnN0YWxsYXRpb25cbiAqIEBwYXJhbSB7VGltZXN0YW1wfSBkZWFkbGluZVxuICogQHJldHVybnMge0NvbnRyYWN0R292ZXJuYW5jZVZvdGVSZXN1bHR9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgVm90ZU9uT2ZmZXJGaWx0ZXJcbiAqIEBwYXJhbSB7SW5zdGFsbGF0aW9ufSB2b3RlQ291bnRlckluc3RhbGxhdGlvblxuICogQHBhcmFtIHtUaW1lc3RhbXB9IGRlYWRsaW5lXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBzdHJpbmdzXG4gKiBAcmV0dXJucyB7Q29udHJhY3RHb3Zlcm5hbmNlVm90ZVJlc3VsdH1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBhcmFtR292ZXJub3JcbiAqIEBwcm9wZXJ0eSB7Vm90ZU9uUGFyYW1DaGFuZ2VzfSB2b3RlT25QYXJhbUNoYW5nZXNcbiAqIEBwcm9wZXJ0eSB7Q3JlYXRlZFF1ZXN0aW9ufSBjcmVhdGVkUXVlc3Rpb25cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEFwaUdvdmVybm9yXG4gKiBAcHJvcGVydHkge1ZvdGVPbkFwaUludm9jYXRpb259IHZvdGVPbkFwaUludm9jYXRpb25cbiAqIEBwcm9wZXJ0eSB7Q3JlYXRlZFF1ZXN0aW9ufSBjcmVhdGVkUXVlc3Rpb25cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEZpbHRlckdvdmVybm9yXG4gKiBAcHJvcGVydHkge1ZvdGVPbk9mZmVyRmlsdGVyfSB2b3RlT25GaWx0ZXJcbiAqIEBwcm9wZXJ0eSB7Q3JlYXRlZFF1ZXN0aW9ufSBjcmVhdGVkRmlsdGVyUXVlc3Rpb25cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBTZXR1cEdvdmVybmFuY2VcbiAqIEBwYXJhbSB7RVJlZjxab2VTZXJ2aWNlPn0gem9lXG4gKiBAcGFyYW0ge0VSZWY8UGFyYW1NYW5hZ2VyUmV0cmlldmVyPn0gcGFyYW1NYW5hZ2VyUmV0cmlldmVyXG4gKiBAcGFyYW0ge0luc3RhbmNlfSBjb250cmFjdEluc3RhbmNlXG4gKiBAcGFyYW0ge1RpbWVyU2VydmljZX0gdGltZXJcbiAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTxQb3NlckZhY2V0Pn0gZ2V0VXBkYXRlZFBvc2VyRmFjZXRcbiAqIEByZXR1cm5zIHtQYXJhbUdvdmVybm9yfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIENyZWF0ZWRRdWVzdGlvblxuICogICBXYXMgdGhpcyBxdWVzdGlvbiBjcmVhdGVkIGJ5IHRoaXMgQ29udHJhY3RHb3Zlcm5vcj9cbiAqIEBwYXJhbSB7SW5zdGFuY2V9IHF1ZXN0aW9uSW5zdGFuY2VcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFBvc2l0aW9uSW5jbHVkZWRcbiAqIEBwYXJhbSB7UG9zaXRpb25bXX0gcG9zaXRpb25zXG4gKiBAcGFyYW0ge1Bvc2l0aW9ufSBwb3NpdGlvblxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBHb3Zlcm5lZENvbnRyYWN0VGVybXNcbiAqIEBwcm9wZXJ0eSB7VGltZXJTZXJ2aWNlfSB0aW1lclxuICogQHByb3BlcnR5IHtJc3N1ZXJLZXl3b3JkUmVjb3JkfSBpc3N1ZXJLZXl3b3JkUmVjb3JkXG4gKiBAcHJvcGVydHkge29iamVjdH0gcHJpdmF0ZUFyZ3NcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRDb250cmFjdEdvdmVybmFuY2VcbiAqXG4gKiBAcGFyYW0ge0VSZWY8Wm9lU2VydmljZT59IHpvZVxuICogQHBhcmFtIHtJbnN0YW5jZX0gYWxsZWdlZEdvdmVybmVkXG4gKiBAcGFyYW0ge0luc3RhbmNlfSBhbGxlZ2VkR292ZXJub3JcbiAqIEBwYXJhbSB7SW5zdGFsbGF0aW9ufSBjb250cmFjdEdvdmVybm9ySW5zdGFsbGF0aW9uXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxHb3Zlcm5hbmNlUGFpcj59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0Q29udHJhY3RFbGVjdG9yYXRlIC0gYXNzZXJ0IHRoYXQgdGhlIGNvbnRyYWN0IHVzZXMgdGhlXG4gKiAgIGVsZWN0b3JhdGVcbiAqXG4gKiBAcGFyYW0ge0VSZWY8Wm9lU2VydmljZT59IHpvZVxuICogQHBhcmFtIHtJbnN0YW5jZX0gYWxsZWdlZEdvdmVybm9yXG4gKiBAcGFyYW0ge0luc3RhbmNlfSBhbGxlZ2VkRWxlY3RvcmF0ZVxuICovXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGou/DBlCgAAZQoAACsAAABAYWdvcmljL2dvdmVybmFuY2UtdjAuOS4zL3NyYy92YWxpZGF0b3JzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2V2ZW50dWFsLXNlbmQiXSwiZXhwb3J0cyI6WyJhc3NlcnRDb250cmFjdEVsZWN0b3JhdGUiLCJhc3NlcnRDb250cmFjdEdvdmVybmFuY2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRTskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5jb25zdHtkZXRhaWxzOlgscXVvdGU6cX09YXNzZXJ0O1xuXG4vKipcbiAqIEFzc2VydCB0aGF0IHRoZSBnb3Zlcm5lZCBjb250cmFjdCB3YXMgc3RhcnRlZCBieSB0aGUgZ292ZXJub3IuIFRocm93cyBpZlxuICogZWl0aGVyIGRpcmVjdGlvbiBjYW4ndCBiZSBlc3RhYmxpc2hlZC4gSWYgdGhlIGNhbGwgc3VjY2VlZHMsIHRoZW4gdGhlXG4gKiBnb3Zlcm5vciBnb3QgZXhjbHVzaXZlIGFjY2VzcyB0byB0aGUgZ292ZXJuZWQgY29udHJhY3QncyBjcmVhdG9yRmFjZXQsIGFuZFxuICogY2FuIGJlIHRydXN0ZWQgdG8gbWFuYWdlIGl0cyBwYXJhbWV0ZXJzLlxuICpcbiAqIEB0eXBlIHtBc3NlcnRDb250cmFjdEdvdmVybmFuY2V9XG4gKi9cbmNvbnN0IGFzc2VydENvbnRyYWN0R292ZXJuYW5jZT1hc3luYyhcbnpvZSxcbmFsbGVnZWRHb3Zlcm5lZCxcbmFsbGVnZWRHb3Zlcm5vcixcbmNvbnRyYWN0R292ZXJub3JJbnN0YWxsYXRpb24pPT5cbntcbmNvbnN0IGFsbGVnZWRHb3Zlcm5vclBGPUUoem9lKS5nZXRQdWJsaWNGYWNldChhbGxlZ2VkR292ZXJub3IpO1xuY29uc3QgcmVhbEdvdmVybmVkUD1FKGFsbGVnZWRHb3Zlcm5vclBGKS5nZXRHb3Zlcm5lZENvbnRyYWN0KCk7XG5jb25zdCBhbGxlZ2VkR292ZXJuZWRUZXJtc1A9RSh6b2UpLmdldFRlcm1zKGFsbGVnZWRHb3Zlcm5lZCk7XG5cbmNvbnN0W3tlbGVjdGlvbk1hbmFnZXI6cmVhbEdvdmVybm9ySW5zdGFuY2V9LHJlYWxHb3Zlcm5lZEluc3RhbmNlXT1cbmF3YWl0IFByb21pc2UuYWxsKFthbGxlZ2VkR292ZXJuZWRUZXJtc1AscmVhbEdvdmVybmVkUF0pO1xuXG5hc3NlcnQoXG5hbGxlZ2VkR292ZXJub3I9PT1yZWFsR292ZXJub3JJbnN0YW5jZSxcbidUaGUgYWxsZWdlZCBnb3Zlcm5vciBkaWQgbm90IG1hdGNoIHRoZSBnb3Zlcm5vciByZXRyaWV2ZWQgZnJvbSB0aGUgZ292ZXJuZWQgY29udHJhY3QnKTtcblxuXG5hc3NlcnQoXG5hbGxlZ2VkR292ZXJuZWQ9PT1yZWFsR292ZXJuZWRJbnN0YW5jZSxcbidUaGUgYWxsZWdlZCBnb3Zlcm5lZCBkaWQgbm90IG1hdGNoIHRoZSBnb3Zlcm5lZCBjb250cmFjdCByZXRyaWV2ZWQgZnJvbSB0aGUgZ292ZXJub3InKTtcblxuXG5jb25zdCBnb3Zlcm5vckluc3RhbGxhdGlvbkZyb21Hb3Zlcm5lZD1hd2FpdCBFKFxuem9lKS5cbmdldEluc3RhbGxhdGlvbkZvckluc3RhbmNlKHJlYWxHb3Zlcm5vckluc3RhbmNlKTtcblxuYXNzZXJ0KFxuZ292ZXJub3JJbnN0YWxsYXRpb25Gcm9tR292ZXJuZWQ9PT1jb250cmFjdEdvdmVybm9ySW5zdGFsbGF0aW9uLFxuJ1RoZSBnb3Zlcm5lZCBjb250cmFjdCBpcyBub3QgZ292ZXJuZWQgYnkgYW4gaW5zdGFuY2Ugb2YgdGhlIHByb3ZpZGVkIGluc3RhbGxhdGlvbi4nKTtcblxuXG5yZXR1cm57Z292ZXJub3I6cmVhbEdvdmVybm9ySW5zdGFuY2UsZ292ZXJuZWQ6cmVhbEdvdmVybmVkSW5zdGFuY2V9O1xuIH07XG5cbi8qKlxuICogQXNzZXJ0IHRoYXQgdGhlIGdvdmVybm9yIHJlZmVycyB0byB0aGUgaW5kaWNhdGVkIGVsZWN0b3JhdGUuXG4gKlxuICogQHR5cGUge0Fzc2VydENvbnRyYWN0RWxlY3RvcmF0ZX1cbiAqLyRo4oCNX29uY2UuYXNzZXJ0Q29udHJhY3RHb3Zlcm5hbmNlKGFzc2VydENvbnRyYWN0R292ZXJuYW5jZSk7XG5jb25zdCBhc3NlcnRDb250cmFjdEVsZWN0b3JhdGU9YXN5bmMoXG56b2UsXG5hbGxlZ2VkR292ZXJub3IsXG5hbGxlZ2VkRWxlY3RvcmF0ZSk9Plxue1xuY29uc3QgYWxsZWdlZEdvdmVybm9yUEY9RSh6b2UpLmdldFB1YmxpY0ZhY2V0KGFsbGVnZWRHb3Zlcm5vcik7XG5jb25zdCBlbGVjdG9yYXRlPWF3YWl0IEUoYWxsZWdlZEdvdmVybm9yUEYpLmdldEVsZWN0b3JhdGUoKTtcbmVsZWN0b3JhdGU9PT1hbGxlZ2VkRWxlY3RvcmF0ZXx8XG5hc3NlcnQuZmFpbChcblggYFRoZSBhbGxlZ2VkRWxlY3RvcmF0ZSBkaWRuJ3QgbWF0Y2ggdGhlIGFjdHVhbCAke3EoZWxlY3RvcmF0ZSl9YCk7XG5cblxucmV0dXJuIHRydWU7XG4gfTskaOKAjV9vbmNlLmFzc2VydENvbnRyYWN0RWxlY3RvcmF0ZShhc3NlcnRDb250cmFjdEVsZWN0b3JhdGUpO1xuXG5oYXJkZW4oYXNzZXJ0Q29udHJhY3RHb3Zlcm5hbmNlKTtcbmhhcmRlbihhc3NlcnRDb250cmFjdEVsZWN0b3JhdGUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFzc2VydENvbnRyYWN0R292ZXJuYW5jZSI6WyJhc3NlcnRDb250cmFjdEdvdmVybmFuY2UiXSwiYXNzZXJ0Q29udHJhY3RFbGVjdG9yYXRlIjpbImFzc2VydENvbnRyYWN0RWxlY3RvcmF0ZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA+jlAxCw8AAAsPAAA0AAAAQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4zL3NyYy9pbnRlcmNoYWluUG9vbC5qc3siaW1wb3J0cyI6WyIuL3Zwb29sLXh5ay1hbW0vcGFyYW1zLmpzIiwiQGFnb3JpYy9lcnRwIiwiQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC9pbmRleC5qcyIsIkBlbmRvL2ZhciJdLCJleHBvcnRzIjpbInN0YXJ0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEUsRmFyLEFtb3VudE1hdGgsQXNzZXRLaW5kLG1ha2VJc3N1ZXJLaXQsb2ZmZXJUbyxNSU5fSU5JVElBTF9QT09MX0xJUVVJRElUWV9LRVk7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXSxbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL2VydHBcIiwgW1tcIkFtb3VudE1hdGhcIiwgWyRo4oCNX2EgPT4gKEFtb3VudE1hdGggPSAkaOKAjV9hKV1dLFtcIkFzc2V0S2luZFwiLCBbJGjigI1fYSA9PiAoQXNzZXRLaW5kID0gJGjigI1fYSldXSxbXCJtYWtlSXNzdWVyS2l0XCIsIFskaOKAjV9hID0+IChtYWtlSXNzdWVyS2l0ID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvem9lL3NyYy9jb250cmFjdFN1cHBvcnQvaW5kZXguanNcIiwgW1tcIm9mZmVyVG9cIiwgWyRo4oCNX2EgPT4gKG9mZmVyVG8gPSAkaOKAjV9hKV1dXV0sW1wiLi92cG9vbC14eWstYW1tL3BhcmFtcy5qc1wiLCBbW1wiTUlOX0lOSVRJQUxfUE9PTF9MSVFVSURJVFlfS0VZXCIsIFskaOKAjV9hID0+IChNSU5fSU5JVElBTF9QT09MX0xJUVVJRElUWV9LRVkgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5jb25zdHtkZXRhaWxzOlgscXVvdGU6cX09YXNzZXJ0O1xuXG5jb25zdCBDT1NNT1NfREVDSU1BTFM9NjtcblxuLyoqXG4gKiBHaXZlbiBzdWZmaWNpZW50IElTVCwgY3JlYXRlIGFuIGlzc3VlciBmb3IgYW4gSUJDIGRlbm9tXG4gKiBhbmQgYW4gaW52aXRhdGlvbiB0byBhZGQgYSBwb29sIGZvciBpdCB0byB0aGUgQU1NLlxuICpcbiAqIEBwYXJhbSB7WkNGPEludGVyY2hhaW5Qb29sVGVybXM+fSB6Y2ZcbiAqIEBwYXJhbSB7e1xuICogICBiYW5rTWFuYWdlcjogRVJlZjxCYW5rTWFuYWdlcj4sXG4gKiB9fSBwcml2YXRlQXJnc1xuICpcbiAqIEB0eXBlZGVmIHt7XG4gKiAgIGFtbTogSW5zdGFuY2UsXG4gKiB9fSBJbnRlcmNoYWluUG9vbFRlcm1zXG4gKlxuICogQHR5cGVkZWYge3tcbiAqICAgZGVub206IHN0cmluZyxcbiAqICAgZGVjaW1hbFBsYWNlczogbnVtYmVyLFxuICogfX0gQXNzZXREZXRhaWxcbiAqL1xuY29uc3QgICAgICAgIHN0YXJ0PSh6Y2Yse2JhbmtNYW5hZ2VyfSk9PntcbmNvbnN0e2FtbX09emNmLmdldFRlcm1zKCk7XG5cbmNvbnN0IHpvZT16Y2YuZ2V0Wm9lU2VydmljZSgpO1xuLyoqIEB0eXBlIHtFUmVmPEdvdmVybmVkUHVibGljRmFjZXQ8WFlLQU1NUHVibGljRmFjZXQ+Pn0gKi9cbmNvbnN0IGFtbVB1Yj1FKHpvZSkuZ2V0UHVibGljRmFjZXQoYW1tKTtcblxubGV0IGt3Tm9uY2U9MDtcblxuLyoqXG4gKiBAcGFyYW0ge1pDRlNlYXR9IHNlYXRcbiAqIEBwYXJhbSB7QXNzZXREZXRhaWx9IGRldGFpbFxuICovXG5jb25zdCBzdGVwMUhhbmRsZXI9YXN5bmMoc2VhdCxkZXRhaWwpPT57XG5hc3NlcnQudHlwZW9mKFxuZGV0YWlsLFxuJ29iamVjdCcsXG4nb2ZmZXIgYXJnIG11c3QgYmUgeyBkZW5vbSwgZGVjaW1hbFBsYWNlcz8gfScpO1xuXG5jb25zdHtkZW5vbSxkZWNpbWFsUGxhY2VzPUNPU01PU19ERUNJTUFMU309ZGV0YWlsO1xuYXNzZXJ0LnR5cGVvZihkZW5vbSwnc3RyaW5nJyk7XG5hc3NlcnQudHlwZW9mKGRlY2ltYWxQbGFjZXMsJ251bWJlcicpO1xuXG5jb25zdCBtaW5pbXVtQ2VudHJhbD1hd2FpdCBFKGFtbVB1YikuZ2V0QW1vdW50KFxuTUlOX0lOSVRJQUxfUE9PTF9MSVFVSURJVFlfS0VZKTtcblxuXG5jb25zdHtcbmdpdmU6e0NlbnRyYWw6Y2VudHJhbEFtdH19PVxuc2VhdC5nZXRQcm9wb3NhbCgpO1xuQW1vdW50TWF0aC5pc0dURShjZW50cmFsQW10LG1pbmltdW1DZW50cmFsKXx8XG5hc3NlcnQuZmFpbChcblggYGF0IGxlYXN0ICR7cShtaW5pbXVtQ2VudHJhbCl9IHJlcXVpcmVkOyBvbmx5ICR7cShjZW50cmFsQW10KX0gZ2l2ZW5gKTtcblxuXG5jb25zdCBpbnRlckFzc2V0PW1ha2VJc3N1ZXJLaXQoXG5kZW5vbSxcbkFzc2V0S2luZC5OQVQsXG5oYXJkZW4oe2RlY2ltYWxQbGFjZXN9KSk7XG5cbmt3Tm9uY2UrPTE7XG5cbmF3YWl0IHpjZi5zYXZlSXNzdWVyKGludGVyQXNzZXQuaXNzdWVyLCBgSW50ZXJjaGFpbiR7a3dOb25jZX1gKTtcblxuLyoqIEB0eXBlIHsgT2ZmZXJIYW5kbGVyIH0gKi9cbmNvbnN0IHN0ZXAySGFuZGxlcj1hc3luYyhzZWF0Mik9PntcbmNvbnN0e1xuZ2l2ZTp7U2Vjb25kYXJ5OnNlY29uZGFyeUFtdH19PVxuc2VhdDIuZ2V0UHJvcG9zYWwoKTtcbkFtb3VudE1hdGguY29lcmNlKGludGVyQXNzZXQuYnJhbmQsc2Vjb25kYXJ5QW10KTtcblxuY29uc3QgbGlxdWlkaXR5SXNzdWVyPWF3YWl0IEUoYW1tUHViKS5hZGRJc3N1ZXIoXG5pbnRlckFzc2V0Lmlzc3VlcixcbiBgSW50ZXJjaGFpbiR7a3dOb25jZX1gKTtcblxuYXdhaXQgemNmLnNhdmVJc3N1ZXIobGlxdWlkaXR5SXNzdWVyLCBgTGlxdWlkaXR5JHtrd05vbmNlfWApO1xuXG5jb25zdCBwcm9wb3NhbD1oYXJkZW4oe1xuZ2l2ZTp7XG5DZW50cmFsOmNlbnRyYWxBbXQsXG5TZWNvbmRhcnk6c2Vjb25kYXJ5QW10fX0pO1xuXG5cblxuc2VhdDIuaW5jcmVtZW50Qnkoc2VhdC5kZWNyZW1lbnRCeShoYXJkZW4oe0NlbnRyYWw6Y2VudHJhbEFtdH0pKSk7XG56Y2YucmVhbGxvY2F0ZShzZWF0LHNlYXQyKTtcblxuY29uc3QgaW52aXRhdGlvbj1hd2FpdCBFKGFtbVB1YikuYWRkUG9vbEludml0YXRpb24oKTtcbmNvbnN0e3VzZXJTZWF0UHJvbWlzZSxkZXBvc2l0ZWR9PWF3YWl0IG9mZmVyVG8oXG56Y2YsXG5pbnZpdGF0aW9uLFxudW5kZWZpbmVkLFxucHJvcG9zYWwsXG5zZWF0Mik7XG5cbnJldHVybiBkZXBvc2l0ZWQudGhlbigoXyk9PntcbnNlYXQuZXhpdCgpO1xuc2VhdDIuZXhpdCgpO1xuXG5yZXR1cm4gRSh1c2VyU2VhdFByb21pc2UpLmdldE9mZmVyUmVzdWx0KCk7XG4gfSk7XG4gfTtcblxuY29uc3Qga2V5d29yZD1kZW5vbTsvKiBJU1NVRSAjNTQxMjogc2hvdWxkIG5vdCBzaG93IHVwIGluIGFsbCB3YWxsZXRzLiovXG5jb25zdCBwcm9wb3NlZE5hbWU9ZGVub207XG5jb25zdFtpbnZpdGF0aW9uXT1hd2FpdCBQcm9taXNlLmFsbChbXG56Y2YubWFrZUludml0YXRpb24oc3RlcDJIYW5kbGVyLCdpbnRlcmNoYWluIHBvb2wgc3RlcCAyJyksXG5FKGJhbmtNYW5hZ2VyKS5hZGRBc3NldChcbmRlbm9tLFxua2V5d29yZCxcbnByb3Bvc2VkTmFtZSxcbmludGVyQXNzZXQvKiB3aXRoIG1pbnQqLyldKTtcblxuXG5cbnJldHVybiBoYXJkZW4oe1xuaXNzdWVyOmludGVyQXNzZXQuaXNzdWVyLFxuaW52aXRhdGlvbn0pO1xuXG4gfTtcblxuY29uc3QgcHVibGljRmFjZXQ9RmFyKCdJbnRlcmNoYWluUG9vbEdhdGV3YXknLHtcbm1ha2VJbnRlcmNoYWluUG9vbEludml0YXRpb246KCk9PlxuemNmLm1ha2VJbnZpdGF0aW9uKHN0ZXAxSGFuZGxlciwnaW50ZXJjaGFpbiBwb29sIHN0ZXAgMScpfSk7XG5cbnJldHVybntwdWJsaWNGYWNldH07XG4gfTskaOKAjV9vbmNlLnN0YXJ0KHN0YXJ0KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJzdGFydCI6WyJzdGFydCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABRO4fxZAkAAGQJAAA6AAAAQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4zL3NyYy92cG9vbC14eWstYW1tL3BhcmFtcy5qc3siaW1wb3J0cyI6WyJAYWdvcmljL2dvdmVybmFuY2UiXSwiZXhwb3J0cyI6WyJNSU5fSU5JVElBTF9QT09MX0xJUVVJRElUWV9LRVkiLCJQT09MX0ZFRV9LRVkiLCJQUk9UT0NPTF9GRUVfS0VZIiwibWFrZUFtbVBhcmFtcyIsIm1ha2VBbW1UZXJtcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBDT05UUkFDVF9FTEVDVE9SQVRFLFBhcmFtVHlwZXM7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9nb3Zlcm5hbmNlXCIsIFtbXCJDT05UUkFDVF9FTEVDVE9SQVRFXCIsIFskaOKAjV9hID0+IChDT05UUkFDVF9FTEVDVE9SQVRFID0gJGjigI1fYSldXSxbXCJQYXJhbVR5cGVzXCIsIFskaOKAjV9hID0+IChQYXJhbVR5cGVzID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5jb25zdCAgICAgICAgUE9PTF9GRUVfS0VZPSdQb29sRmVlJzskaOKAjV9vbmNlLlBPT0xfRkVFX0tFWShQT09MX0ZFRV9LRVkpO1xuY29uc3QgICAgICAgIFBST1RPQ09MX0ZFRV9LRVk9J1Byb3RvY29sRmVlJzskaOKAjV9vbmNlLlBST1RPQ09MX0ZFRV9LRVkoUFJPVE9DT0xfRkVFX0tFWSk7XG5jb25zdCAgICAgICAgTUlOX0lOSVRJQUxfUE9PTF9MSVFVSURJVFlfS0VZPSdNaW5Jbml0aWFsUG9vbExpcXVpZGl0eSc7JGjigI1fb25jZS5NSU5fSU5JVElBTF9QT09MX0xJUVVJRElUWV9LRVkoTUlOX0lOSVRJQUxfUE9PTF9MSVFVSURJVFlfS0VZKTtcblxuY29uc3QgREVGQVVMVF9QT09MX0ZFRV9CUD0yNG47XG5jb25zdCBERUZBVUxUX1BST1RPQ09MX0ZFRV9CUD02bjtcblxuLyoqXG4gKiBAcGFyYW0ge0ludml0YXRpb259IGVsZWN0b3JhdGVJbnZpdGF0aW9uIC0gaW52aXRhdGlvbiBmb3IgdGhlIHF1ZXN0aW9uIHBvc2VyXG4gKiBAcGFyYW0ge2JpZ2ludH0gcHJvdG9jb2xGZWVCUFxuICogQHBhcmFtIHtiaWdpbnR9IHBvb2xGZWVCUFxuICogQHBhcmFtIHtBbW91bnQ8J25hdCc+fSBtaW5Jbml0aWFsTGlxdWlkaXR5XG4gKi9cbmNvbnN0IG1ha2VBbW1QYXJhbXM9KFxuZWxlY3RvcmF0ZUludml0YXRpb24sXG5wcm90b2NvbEZlZUJQLFxucG9vbEZlZUJQLFxubWluSW5pdGlhbExpcXVpZGl0eSk9Plxue1xucmV0dXJuIGhhcmRlbih7XG5bUE9PTF9GRUVfS0VZXTp7dHlwZTpQYXJhbVR5cGVzLk5BVCx2YWx1ZTpwb29sRmVlQlB9LFxuW1BST1RPQ09MX0ZFRV9LRVldOnt0eXBlOlBhcmFtVHlwZXMuTkFULHZhbHVlOnByb3RvY29sRmVlQlB9LFxuW01JTl9JTklUSUFMX1BPT0xfTElRVUlESVRZX0tFWV06e1xudHlwZTpQYXJhbVR5cGVzLkFNT1VOVCxcbnZhbHVlOm1pbkluaXRpYWxMaXF1aWRpdHl9LFxuXG5bQ09OVFJBQ1RfRUxFQ1RPUkFURV06e1xudHlwZTpQYXJhbVR5cGVzLklOVklUQVRJT04sXG52YWx1ZTplbGVjdG9yYXRlSW52aXRhdGlvbn19KTtcblxuXG4gfTtcblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAYWdvcmljL2dvdmVybmFuY2Uvc3JjL2NvbnRyYWN0R292ZXJuYW5jZS90eXBlZFBhcmFtTWFuYWdlcicpLlBhcmFtVHlwZXNNYXBGcm9tUmVjb3JkPFJldHVyblR5cGU8dHlwZW9mIG1ha2VBbW1QYXJhbXM+Pn0gQW1tUGFyYW1zICovJGjigI1fb25jZS5tYWtlQW1tUGFyYW1zKG1ha2VBbW1QYXJhbXMpO1xuXG5jb25zdCBtYWtlQW1tVGVybXM9KFxudGltZXIsXG5wb3Nlckludml0YXRpb25BbW91bnQsXG5taW5Jbml0aWFsTGlxdWlkaXR5LFxucHJvdG9jb2xGZWVCUD1ERUZBVUxUX1BST1RPQ09MX0ZFRV9CUCxcbnBvb2xGZWVCUD1ERUZBVUxUX1BPT0xfRkVFX0JQKT0+KFxue1xudGltZXIsXG5wb29sRmVlQlAsXG5wcm90b2NvbEZlZUJQLFxuZ292ZXJuZWRQYXJhbXM6bWFrZUFtbVBhcmFtcyhcbnBvc2VySW52aXRhdGlvbkFtb3VudCxcbnByb3RvY29sRmVlQlAsXG5wb29sRmVlQlAsXG5taW5Jbml0aWFsTGlxdWlkaXR5KX0pOyRo4oCNX29uY2UubWFrZUFtbVRlcm1zKG1ha2VBbW1UZXJtcyk7XG5cblxuXG5oYXJkZW4obWFrZUFtbVRlcm1zKTtcbmhhcmRlbihtYWtlQW1tUGFyYW1zKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlQW1tUGFyYW1zIjpbIm1ha2VBbW1QYXJhbXMiXSwibWFrZUFtbVRlcm1zIjpbIm1ha2VBbW1UZXJtcyJdLCJQT09MX0ZFRV9LRVkiOlsiUE9PTF9GRUVfS0VZIl0sIlBST1RPQ09MX0ZFRV9LRVkiOlsiUFJPVE9DT0xfRkVFX0tFWSJdLCJNSU5fSU5JVElBTF9QT09MX0xJUVVJRElUWV9LRVkiOlsiTUlOX0lOSVRJQUxfUE9PTF9MSVFVSURJVFlfS0VZIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAH44EWU6BAAAOgQAACUAAABAYWdvcmljL2ludGVybmFsLXYwLjIuMS9zcmMvY29uZmlnLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJCcmlkZ2VJZCIsIldhbGxldE5hbWUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBAdHMtY2hlY2sqL1xuLyoqIEBmaWxlXG4gKlxuICogU29tZSBvZiB0aGlzIGNvbmZpZyBpbmZvIG1heSBtYWtlIG1vcmUgc2Vuc2UgaW4gYSBwYXJ0aWN1bGFyIHBhY2thZ2UuIEhvd2V2ZXJcbiAqIGR1ZSB0byB0aGUgbWF4Tm9kZU1vZHVsZUpzRGVwdGggaGFjayBhbmQgb3VyIGdlbmVyYWwgbGF4IGRlcGVuZGVuY3kgZ3JhcGgsXG4gKiBzb21ldGltZXMgcmF0aW9uYWwgcGxhY2VtZW50cyBjYXVzZSB0eXBlIHJlc29sdXRpb24gZXJyb3JzLlxuICpcbiAqIFNvIGFzIGEgd29yay1hcm91bmQgc29tZSBjb25zdGFudHMgdGhhdCBuZWVkIGFjY2VzcyBmcm9tIG1vcmUgdGhhbiBvbmUgcGFja2FnZSBhcmUgcGxhY2VkIGhlcmUuXG4gKi9cblxuLyoqXG4gKiBFdmVudCBzb3VyY2UgaWRzIHVzZWQgYnkgdGhlIGJyaWRnZSBkZXZpY2UuXG4gKi9cbmNvbnN0ICAgICAgICBCcmlkZ2VJZD17XG5CQU5LOidiYW5rJyxcbkNPUkU6J2NvcmUnLFxuRElCQzonZGliYycsXG5TVE9SQUdFOidzdG9yYWdlJyxcblBST1ZJU0lPTjoncHJvdmlzaW9uJyxcbldBTExFVDond2FsbGV0J307JGjigI1fb25jZS5CcmlkZ2VJZChCcmlkZ2VJZCk7XG5cbmhhcmRlbihCcmlkZ2VJZCk7XG5cbmNvbnN0ICAgICAgICBXYWxsZXROYW1lPXtcbmRlcG9zaXRGYWNldDonZGVwb3NpdEZhY2V0J307JGjigI1fb25jZS5XYWxsZXROYW1lKFdhbGxldE5hbWUpO1xuXG5oYXJkZW4oV2FsbGV0TmFtZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQnJpZGdlSWQiOlsiQnJpZGdlSWQiXSwiV2FsbGV0TmFtZSI6WyJXYWxsZXROYW1lIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAK/0Jsh9AQAAfQEAACQAAABAYWdvcmljL2ludGVybmFsLXYwLjIuMS9zcmMvaW5kZXguanN7ImltcG9ydHMiOlsiLi9jb25maWcuanMiLCIuL3V0aWxzLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9jb25maWcuanMiLCIuL3V0aWxzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi91dGlscy5qc1wiLCBbXV0sW1wiLi9jb25maWcuanNcIiwgW11dXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAANQR7m4MAAAuDAAACQAAABAYWdvcmljL2ludGVybmFsLXYwLjIuMS9zcmMvdXRpbHMuanN7ImltcG9ydHMiOlsiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL21hcnNoYWwiLCJAZW5kby9wcm9taXNlLWtpdCJdLCJleHBvcnRzIjpbIlByb21pc2VBbGxPckVycm9ycyIsImFnZ3JlZ2F0ZVRyeUZpbmFsbHkiLCJhcHBseUxhYmVsaW5nRXJyb3IiLCJiaW5kQWxsTWV0aG9kcyIsImRlZXBseUZ1bGZpbGxlZE9iamVjdCIsImZyb21VbmlxdWVFbnRyaWVzIiwiZnNTdHJlYW1SZWFkeSIsImdldE1ldGhvZE5hbWVzIiwibGlzdERpZmZlcmVuY2UiLCJtYWtlQWdncmVnYXRlRXJyb3IiLCJtYWtlTWVhc3VyZVNlY29uZHMiLCJvYmplY3RNYXAiLCJ0aHJvd0xhYmVsZWQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRSxkZWVwbHlGdWxmaWxsZWQsaXNPYmplY3QsaXNQcm9taXNlOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiZGVlcGx5RnVsZmlsbGVkXCIsIFskaOKAjV9hID0+IChkZWVwbHlGdWxmaWxsZWQgPSAkaOKAjV9hKV1dLFtcImlzT2JqZWN0XCIsIFskaOKAjV9hID0+IChpc09iamVjdCA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wiaXNQcm9taXNlXCIsIFskaOKAjV9hID0+IChpc1Byb21pc2UgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsL3NyYy90eXBlcycpLlJlbW90YWJsZX0gUmVtb3RhYmxlICovXG5cbmNvbnN0e2dldFByb3RvdHlwZU9mLGNyZWF0ZSxlbnRyaWVzLGZyb21FbnRyaWVzfT1PYmplY3Q7XG5jb25zdHtvd25LZXlzLGFwcGx5fT1SZWZsZWN0O1xuXG5jb25zdHtkZXRhaWxzOlgscXVvdGU6cX09YXNzZXJ0O1xuXG4vKipcbiAqIFRocm93cyBpZiBtdWx0aXBsZSBlbnRyaWVzIHVzZSB0aGUgc2FtZSBwcm9wZXJ0eSBuYW1lLiBPdGhlcndpc2UgYWN0c1xuICogbGlrZSBgT2JqZWN0LmZyb21FbnRyaWVzYC4gVXNlIGl0IHRvIHByb3RlY3QgZnJvbSBwcm9wZXJ0eSBuYW1lc1xuICogY29tcHV0ZWQgZnJvbSB1c2VyLXByb3ZpZGVkIGRhdGEuXG4gKlxuICogQHRlbXBsYXRlIEssVlxuICogQHBhcmFtIHtJdGVyYWJsZTxbSyxWXT59IGFsbEVudHJpZXNcbiAqIEByZXR1cm5zIHt7W2s6IEtdOiBWfX1cbiAqL1xuY29uc3QgICAgICAgIGZyb21VbmlxdWVFbnRyaWVzPShhbGxFbnRyaWVzKT0+e1xuY29uc3QgZW50cmllc0FycmF5PVsuLi5hbGxFbnRyaWVzXTtcbmNvbnN0IHJlc3VsdD1mcm9tRW50cmllcyhlbnRyaWVzQXJyYXkpO1xuaWYob3duS2V5cyhyZXN1bHQpLmxlbmd0aD09PWVudHJpZXNBcnJheS5sZW5ndGgpe1xucmV0dXJuIHJlc3VsdDtcbiB9XG5jb25zdCBuYW1lcz1uZXcgU2V0KCk7XG5mb3IoY29uc3RbbmFtZSxfXW9mIGVudHJpZXNBcnJheSl7XG5pZihuYW1lcy5oYXMobmFtZSkpe1xuYXNzZXJ0LmZhaWwoWCBgY29sbGlzaW9uIG9uIHByb3BlcnR5IG5hbWUgJHtxKG5hbWUpfTogJHtlbnRyaWVzQXJyYXl9YCk7XG4gfVxubmFtZXMuYWRkKG5hbWUpO1xuIH1cbmFzc2VydC5mYWlsKFggYGludGVybmFsOiBmYWlsZWQgdG8gY3JlYXRlIG9iamVjdCBmcm9tIHVuaXF1ZSBlbnRyaWVzYCk7XG4gfTskaOKAjV9vbmNlLmZyb21VbmlxdWVFbnRyaWVzKGZyb21VbmlxdWVFbnRyaWVzKTtcbmhhcmRlbihmcm9tVW5pcXVlRW50cmllcyk7XG5cbi8qKlxuICogQnkgYW5hbG9neSB3aXRoIGhvdyBgQXJyYXkucHJvdG90eXBlLm1hcGAgd2lsbCBtYXAgdGhlIGVsZW1lbnRzIG9mXG4gKiBhbiBhcnJheSB0byB0cmFuc2Zvcm1lZCBlbGVtZW50cyBvZiBhbiBhcnJheSBvZiB0aGUgc2FtZSBzaGFwZSxcbiAqIGBvYmplY3RNYXBgIHdpbGwgZG8gbGlrZXdpc2UgZm9yIHRoZSBzdHJpbmctbmFtZWQgb3duIGVudW1lcmFibGVcbiAqIHByb3BlcnRpZXMgb2YgYW4gb2JqZWN0LlxuICpcbiAqIFR5cGljYWwgdXNhZ2UgYXBwbGllcyBgb2JqZWN0TWFwYCB0byBhIENvcHlSZWNvcmQsIGkuZS4sXG4gKiBhbiBvYmplY3QgZm9yIHdoaWNoIGBwYXNzU3R5bGVPZihvcmlnaW5hbCkgPT09ICdjb3B5UmVjb3JkJ2AuIEZvciB0aGVzZSxcbiAqIG5vbmUgb2YgdGhlIGZvbGxvd2luZyBlZGdlIGNhc2VzIGFyaXNlLiBUaGUgcmVzdWx0IHdpbGwgYmUgYSBDb3B5UmVjb3JkXG4gKiB3aXRoIGV4YWN0bHkgdGhlIHNhbWUgcHJvcGVydHkgbmFtZXMsIHdob3NlIHZhbHVlcyBhcmUgdGhlIG1hcHBlZCBmb3JtIG9mXG4gKiB0aGUgb3JpZ2luYWwncyB2YWx1ZXMuXG4gKlxuICogV2hlbiB0aGUgb3JpZ2luYWwgaXMgbm90IGEgQ29weVJlY29yZCwgc29tZSBlZGdlIGNhc2VzIHRvIGJlIGF3YXJlIG9mXG4gKiAgICAqIE5vIG1hdHRlciBob3cgbXV0YWJsZSB0aGUgb3JpZ2luYWwgb2JqZWN0LCB0aGUgcmV0dXJuZWQgb2JqZWN0IGlzXG4gKiAgICAgIGhhcmRlbmVkLlxuICogICAgKiBPbmx5IHRoZSBzdHJpbmctbmFtZWQgZW51bWVyYWJsZSBvd24gcHJvcGVydGllcyBvZiB0aGUgb3JpZ2luYWxcbiAqICAgICAgYXJlIG1hcHBlZC4gQWxsIG90aGVyIHByb3BlcnRpZXMgYXJlIGlnbm9yZWQuXG4gKiAgICAqIElmIGFueSBvZiB0aGUgb3JpZ2luYWwgcHJvcGVydGllcyB3ZXJlIGFjY2Vzc29ycywgYE9iamVjdC5lbnRyaWVzYFxuICogICAgICB3aWxsIGNhdXNlIGl0cyBgZ2V0dGVyYCB0byBiZSBjYWxsZWQgYW5kIHdpbGwgdXNlIHRoZSByZXN1bHRpbmdcbiAqICAgICAgdmFsdWUuXG4gKiAgICAqIE5vIG1hdHRlciB3aGV0aGVyIHRoZSBvcmlnaW5hbCBwcm9wZXJ0eSB3YXMgYW4gYWNjZXNzb3IsIHdyaXRhYmxlLFxuICogICAgICBvciBjb25maWd1cmFibGUsIGFsbCB0aGUgcHJvcGVydGllcyBvZiB0aGUgcmV0dXJuZWQgb2JqZWN0IHdpbGwgYmVcbiAqICAgICAgbm9uLXdyaXRhYmxlLCBub24tY29uZmlndXJhYmxlLCBkYXRhIHByb3BlcnRpZXMuXG4gKiAgICAqIE5vIG1hdHRlciB3aGF0IHRoZSBvcmlnaW5hbCBvYmplY3QgbWF5IGhhdmUgaW5oZXJpdGVkIGZyb20sIGFuZFxuICogICAgICBubyBtYXR0ZXIgd2hldGhlciBpdCB3YXMgYSBzcGVjaWFsIGtpbmQgb2Ygb2JqZWN0IHN1Y2ggYXMgYW4gYXJyYXksXG4gKiAgICAgIHRoZSByZXR1cm5lZCBvYmplY3Qgd2lsbCBhbHdheXMgYmUgYSBwbGFpbiBvYmplY3QgaW5oZXJpdGluZyBkaXJlY3RseVxuICogICAgICBmcm9tIGBPYmplY3QucHJvdG90eXBlYCBhbmQgd2hvc2Ugc3RhdGUgaXMgb25seSB0aGVzZSBuZXcgbWFwcGVkXG4gKiAgICAgIG93biBwcm9wZXJ0aWVzLlxuICpcbiAqIFdpdGggdGhlc2UgZGlmZmVyZW5jZXMsIGV2ZW4gaWYgdGhlIG9yaWdpbmFsIG9iamVjdCB3YXMgbm90IGEgQ29weVJlY29yZCxcbiAqIGlmIGFsbCB0aGUgbWFwcGVkIHZhbHVlcyBhcmUgUGFzc2FibGUsIHRoZW4gdGhlIHJldHVybmVkIG9iamVjdCB3aWxsIGJlXG4gKiBhIENvcHlSZWNvcmQuXG4gKlxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBPXG4gKiBAcGFyYW0ge099IG9yaWdpbmFsXG4gKiBAdGVtcGxhdGUgUiBtYXAgcmVzdWx0XG4gKiBAcGFyYW0geyh2YWx1ZTogT1trZXlvZiBPXSwga2V5OiBrZXlvZiBPKSA9PiBSfSBtYXBGblxuICogQHJldHVybnMge3sgW1AgaW4ga2V5b2YgT106IFJ9fVxuICovXG5jb25zdCAgICAgICAgb2JqZWN0TWFwPShvcmlnaW5hbCxtYXBGbik9PntcbmNvbnN0IGVudHM9ZW50cmllcyhvcmlnaW5hbCk7XG5jb25zdCBtYXBFbnRzPWVudHMubWFwKChbayx2XSk9PltrLG1hcEZuKHYsayldKTtcbnJldHVybiBoYXJkZW4oZnJvbUVudHJpZXMobWFwRW50cykpO1xuIH07JGjigI1fb25jZS5vYmplY3RNYXAob2JqZWN0TWFwKTtcbmhhcmRlbihvYmplY3RNYXApO1xuXG5jb25zdCAgICAgICAgbGlzdERpZmZlcmVuY2U9KGxlZnROYW1lcyxyaWdodE5hbWVzKT0+e1xuY29uc3QgcmlnaHRTZXQ9bmV3IFNldChyaWdodE5hbWVzKTtcbnJldHVybiBsZWZ0TmFtZXMuZmlsdGVyKChuYW1lKT0+IXJpZ2h0U2V0LmhhcyhuYW1lKSk7XG4gfTskaOKAjV9vbmNlLmxpc3REaWZmZXJlbmNlKGxpc3REaWZmZXJlbmNlKTtcbmhhcmRlbihsaXN0RGlmZmVyZW5jZSk7XG5cbi8qKlxuICogQHBhcmFtIHtFcnJvcn0gaW5uZXJFcnJcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gbGFiZWxcbiAqIEBwYXJhbSB7RXJyb3JDb25zdHJ1Y3Rvcj19IEVycm9yQ29uc3RydWN0b3JcbiAqIEByZXR1cm5zIHtuZXZlcn1cbiAqL1xuY29uc3QgICAgICAgIHRocm93TGFiZWxlZD0oaW5uZXJFcnIsbGFiZWwsRXJyb3JDb25zdHJ1Y3Rvcj11bmRlZmluZWQpPT57XG5pZih0eXBlb2YgbGFiZWw9PT0nbnVtYmVyJyl7XG5sYWJlbD0gYFske2xhYmVsfV1gO1xuIH1cbmNvbnN0IG91dGVyRXJyPWFzc2VydC5lcnJvcihcbiBgJHtsYWJlbH06ICR7aW5uZXJFcnIubWVzc2FnZX1gLFxuRXJyb3JDb25zdHJ1Y3Rvcik7XG5cbmFzc2VydC5ub3RlKG91dGVyRXJyLFggYENhdXNlZCBieSAke2lubmVyRXJyfWApO1xudGhyb3cgb3V0ZXJFcnI7XG4gfTskaOKAjV9vbmNlLnRocm93TGFiZWxlZCh0aHJvd0xhYmVsZWQpO1xuaGFyZGVuKHRocm93TGFiZWxlZCk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEEsUlxuICogQHBhcmFtIHsoLi4uYXJnczogQVtdKSA9PiBSfSBmdW5jXG4gKiBAcGFyYW0ge0FbXX0gYXJnc1xuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBbbGFiZWxdXG4gKiBAcmV0dXJucyB7Un1cbiAqL1xuY29uc3QgICAgICAgIGFwcGx5TGFiZWxpbmdFcnJvcj0oZnVuYyxhcmdzLGxhYmVsPXVuZGVmaW5lZCk9PntcbmlmKGxhYmVsPT09dW5kZWZpbmVkKXtcbnJldHVybiBmdW5jKC4uLmFyZ3MpO1xuIH1cbmxldCByZXN1bHQ7XG50cnl7XG5yZXN1bHQ9ZnVuYyguLi5hcmdzKTtcbiB9Y2F0Y2goZXJyKXtcbnRocm93TGFiZWxlZChlcnIsbGFiZWwpO1xuIH1cbmlmKGlzUHJvbWlzZShyZXN1bHQpKXtcbi8qIEB0cy1leHBlY3QtZXJyb3IgSWYgcmVzdWx0IGlzIGEgcmVqZWN0ZWQgcHJvbWlzZSwgdGhpcyB3aWxsKi9cbi8qIHJldHVybiBhIHByb21pc2Ugd2l0aCBhIGRpZmZlcmVudCByZWplY3Rpb24gcmVhc29uLiBCdXQgdGhpcyovXG4vKiBjb25mdXNlcyBUeXBlU2NyaXB0IGJlY2F1c2UgaXQgdHlwZXMgdGhhdCBjYXNlIGFzIGBQcm9taXNlPG5ldmVyPmAqL1xuLyogd2hpY2ggaXMgY29vbCBmb3IgYSBwcm9taXNlIHRoYXQgd2lsbCBuZXZlciBmdWxmbGwuKi9cbi8qIEJ1dCBUeXBlU2NyaXB0IGRvZXNuJ3QgdW5kZXJzdGFuZCB0aGF0IHRoaXMgd2lsbCBvbmx5IGhhcHBlbiovXG4vKiB3aGVuIGByZXN1bHRgIHdhcyBhIHJlamVjdGVkIHByb21pc2UuIEluIG9ubHkgdGhpcyBjYXNlIGBSYCovXG4vKiBzaG91bGQgYWxyZWFkeSBhbGxvdyBgUHJvbWlzZTxuZXZlcj5gIGFzIGEgc3VidHlwZS4qL1xucmV0dXJuIEUud2hlbihyZXN1bHQsdW5kZWZpbmVkLChyZWFzb24pPT50aHJvd0xhYmVsZWQocmVhc29uLGxhYmVsKSk7XG4gfWVsc2V7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbiB9OyRo4oCNX29uY2UuYXBwbHlMYWJlbGluZ0Vycm9yKGFwcGx5TGFiZWxpbmdFcnJvcik7XG5oYXJkZW4oYXBwbHlMYWJlbGluZ0Vycm9yKTtcblxuY29uc3QgY29tcGFyZVN0cmluZ2lmaWVkPShsZWZ0LHJpZ2h0KT0+e1xubGVmdD1TdHJpbmcobGVmdCk7XG5yaWdodD1TdHJpbmcocmlnaHQpO1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5lc3RlZC10ZXJuYXJ5Ki9cbnJldHVybiBsZWZ0PHJpZ2h0Py0xOmxlZnQ+cmlnaHQ/MTowO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IG9ialxuICogQHJldHVybnMgeyhzdHJpbmd8c3ltYm9sKVtdfVxuICovXG5jb25zdCAgICAgICAgZ2V0TWV0aG9kTmFtZXM9KG9iaik9PntcbmNvbnN0IHJlc3VsdD1bXTtcbndoaWxlKG9iaiE9PW51bGwmJm9iaiE9PU9iamVjdC5wcm90b3R5cGUpe1xuY29uc3QgbU5hbWVzPW93bktleXMob2JqKS5maWx0ZXIoKG5hbWUpPT50eXBlb2Ygb2JqW25hbWVdPT09J2Z1bmN0aW9uJyk7XG5yZXN1bHQucHVzaCguLi5tTmFtZXMpO1xub2JqPWdldFByb3RvdHlwZU9mKG9iaik7XG4gfVxucmVzdWx0LnNvcnQoY29tcGFyZVN0cmluZ2lmaWVkKTtcbnJldHVybiBoYXJkZW4ocmVzdWx0KTtcbiB9OyRo4oCNX29uY2UuZ2V0TWV0aG9kTmFtZXMoZ2V0TWV0aG9kTmFtZXMpO1xuaGFyZGVuKGdldE1ldGhvZE5hbWVzKTtcblxuLyoqXG4gKiBUT0RPIFRoaXMgZnVuY3Rpb24gZXhpc3RzIG9ubHkgdG8gZWFzZSB0aGVcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9wdWxsLzU5NzAgdHJhbnNpdGlvbiwgZnJvbSBhbGwgbWV0aG9kc1xuICogYmVpbmcgb3duIHByb3BlcnRpZXMgdG8gbWV0aG9kcyBiZWluZyBpbmhlcml0ZWQgZnJvbSBhIGNvbW1vbiBwcm90b3R5cGUuXG4gKiBUaGlzIHRyYW5zaXRpb24gYnJlYWtzIHR3byBwYXR0ZXJucyB1c2VkIGluIHByaW9yIGNvZGU6IGF1dG9iaW5kaW5nLFxuICogYW5kIGVudW1lcmF0aW5nIG1ldGhvZHMgYnkgZW51bWVyYXRpbmcgb3duIHByb3BlcnRpZXMuIEZvciBib3RoLCB0aGVcbiAqIHByZWZlcnJlZCByZXBhaXJzIGFyZVxuICogICAgKiBhdXRvYmluZGluZzogUmVwbGFjZSwgZm9yIGV4YW1wbGUsXG4gKiAgICAgIGBmb28ob2JqLm1ldGhvZClgIHdpdGggYGZvbyhhcmcgPT4gYG9iai5tZXRob2QoYXJnKSlgLiBJT1csIHN0b3AgcmVseWluZ1xuICogICAgICBvbiBleHByZXNzaW9ucyBsaWtlIGBvYmoubWV0aG9kYCB0byBleHRyYWN0IGEgbWV0aG9kIHN0aWxsIGJvdW5kIHRvIHRoZVxuICogICAgICBzdGF0ZSBvZiBgb2JqYCBiZWNhdXNlLCBmb3IgdmlydHVhbCBhbmQgZHVyYWJsZSBvYmplY3RzLFxuICogICAgICB0aGV5IG5vIGxvbmdlciB3aWxsIGFmdGVyICM1OTcwLlxuICogICAgKiBtZXRob2QgZW51bWVyYXRpb246IFJlcGxhY2UsIGZvciBleGFtcGxlXG4gKiAgICAgIGBSZWZsZWN0Lm93bktleXMob2JqKWAgd2l0aCBgZ2V0TWV0aG9kTmFtZXMob2JqKWAuXG4gKlxuICogT25jZSBhbGwgcHJvYmxlbWF0aWMgY2FzZXMgaGF2ZSBiZWVuIGNvbnZlcnRlZCBpbiB0aGlzIG1hbm5lciwgdGhpc1xuICogYGJpbmRBbGxNZXRob2RzYCBoYWNrIGNhbiBhbmQgVE9ETyBzaG91bGQgYmUgZGVsZXRlZC4gSG93ZXZlciwgd2UgY3VycmVudGx5XG4gKiBoYXZlIG5vIHJlbGlhYmxlIHN0YXRpYyB3YXkgdG8gdHJhY2sgZG93biBhbmQgZml4IGFsbCBhdXRvYmluZGluZyBzaXRlcy5cbiAqIEZvciB0aG9zZSBvYmplY3RzIHRoYXQgaGF2ZSBub3QgeWV0IGJlZW4gZnVsbHkgcmVwYWlyZWQgYnkgdGhlIGFib3ZlIHR3b1xuICogdGVjaG5pcXVlcywgYGJpbmRBbGxNZXRob2RzYCBjcmVhdGVzIGFuIG9iamVjdCB0aGF0IGFjdHMgbXVjaCBsaWtlIHRoZVxuICogcHJlLSM1OTcwIG9iamVjdHMsIHdpdGggYWxsIHRoZWlyIG1ldGhvZHMgYXMgaW5zdGFuY2UtYm91bmQgb3duIHByb3BlcnRpZXMuXG4gKiBJdCBkb2VzIHRoaXMgYnkgbWFraW5nIGEgbmV3IG9iamVjdCBpbmhlcml0aW5nIGZyb20gYG9iamAgd2hlcmUgdGhlIG5ld1xuICogb2JqZWN0IGhhcyBib3VuZCBvd24gbWV0aG9kcyBvdmVycmlkZGluZyBhbGwgdGhlIG1ldGhvZHMgaXQgd291bGQgaGF2ZVxuICogaW5oZXJpdGVkIGZyb20gYG9iamAuXG4gKlxuICogQHBhcmFtIHtSZW1vdGFibGV9IG9ialxuICogQHJldHVybnMge1JlbW90YWJsZX1cbiAqL1xuY29uc3QgICAgICAgIGJpbmRBbGxNZXRob2RzPShvYmopPT5cbmhhcmRlbihcbmNyZWF0ZShcbm9iaixcbmZyb21FbnRyaWVzKFxuZ2V0TWV0aG9kTmFtZXMob2JqKS5tYXAoKG5hbWUpPT5bXG5uYW1lLFxue1xudmFsdWU6KC4uLmFyZ3MpPT5hcHBseShvYmpbbmFtZV0sb2JqLGFyZ3MpLFxuZW51bWVyYWJsZTp0cnVlfV0pKSkpOyRo4oCNX29uY2UuYmluZEFsbE1ldGhvZHMoYmluZEFsbE1ldGhvZHMpO1xuXG5cblxuXG5cbmhhcmRlbihiaW5kQWxsTWV0aG9kcyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHt7fX0gVFxuICogQHR5cGVkZWYge3sgW0sgaW4ga2V5b2YgVF06IERlZXBseUF3YWl0ZWQ8VFtLXT4gfX0gRGVlcGx5QXdhaXRlZE9iamVjdFxuICovXG5cbi8qKlxuICogQ2F2ZWF0czpcbiAqIC0gZG9lc24ndCByZWN1ciB3aXRoaW4gUHJvbWlzZSByZXN1bHRzXG4gKiAtIHJlc3VsdGluZyB0eXBlIGhhcyB3cmFwcGVyIGluIGl0cyBuYW1lXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtUIGV4dGVuZHMgUHJvbWlzZUxpa2UgPyBBd2FpdGVkPFQ+IDogVCBleHRlbmRzIHt9ID8gRGVlcGx5QXdhaXRlZE9iamVjdDxUPiA6IEF3YWl0ZWQ8VD59IERlZXBseUF3YWl0ZWRcbiAqL1xuXG4vKipcbiAqIEEgbW9yZSBjb25zdHJhaW5lZCB2ZXJzaW9uIG9mIHtkZWVwbHlGdWxmaWxsZWR9IGZvciB0eXBlIHNhZmV0eSB1bnRpbCBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vaXNzdWVzLzEyNTdcbiAqIFVzZWZ1bCBpbiBzdGFydGluZyBjb250cmFjdHMgdGhhdCBuZWVkIGFsbCB0ZXJtcyB0byBiZSBmdWxmaWxsZWQgaW4gb3JkZXIgdG8gYmUgZHVyYWJsZS5cbiAqXG4gKiBAdHlwZSB7PFQgZXh0ZW5kcyB7fT4odW5mdWxmaWxsZWRUZXJtczogVCkgPT4gWGltcG9ydCgnQGVuZG8vZXZlbnR1YWwtc2VuZCcpLkVSZWY8RGVlcGx5QXdhaXRlZDxUPj59XG4gKi9cbmNvbnN0ICAgICAgICBkZWVwbHlGdWxmaWxsZWRPYmplY3Q9KG9iaik9PntcbmFzc2VydChpc09iamVjdChvYmopLCdwYXJhbSBtdXN0IGJlIGFuIG9iamVjdCcpO1xucmV0dXJuIGRlZXBseUZ1bGZpbGxlZChvYmopO1xuIH07XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgdXNlcyBhIG1pbGxpc2Vjb25kLWJhc2VkIHRpbWUtc2luY2UtZXBvY2ggY2FwYWJpbGl0eVxuICogKHN1Y2ggYXMgYHBlcmZvcm1hbmNlLm5vd2ApIHRvIG1lYXN1cmUgZXhlY3V0aW9uIHRpbWUgb2YgYW4gYXN5bmMgZnVuY3Rpb25cbiAqIGFuZCByZXBvcnQgdGhlIHJlc3VsdCBpbiBzZWNvbmRzIHRvIG1hdGNoIG91ciB0ZWxlbWV0cnkgc3RhbmRhcmQuXG4gKlxuICogQHBhcmFtIHt0eXBlb2YgWGltcG9ydCgncGVyZl9ob29rcycpLnBlcmZvcm1hbmNlLm5vd30gY3VycmVudFRpbWVNaWxsaXNlY1xuICogQHJldHVybnMgezxUPihmbjogKCkgPT4gUHJvbWlzZTxUPikgPT4gUHJvbWlzZTx7IHJlc3VsdDogVCwgZHVyYXRpb246IG51bWJlciB9Pn1cbiAqLyRo4oCNX29uY2UuZGVlcGx5RnVsZmlsbGVkT2JqZWN0KGRlZXBseUZ1bGZpbGxlZE9iamVjdCk7XG5jb25zdCAgICAgICAgbWFrZU1lYXN1cmVTZWNvbmRzPShjdXJyZW50VGltZU1pbGxpc2VjKT0+e1xuY29uc3QgbWVhc3VyZVNlY29uZHM9YXN5bmMoZm4pPT57XG5jb25zdCB0MD1jdXJyZW50VGltZU1pbGxpc2VjKCk7XG5jb25zdCByZXN1bHQ9YXdhaXQgZm4oKTtcbmNvbnN0IGR1cmF0aW9uTWlsbGlzZWM9Y3VycmVudFRpbWVNaWxsaXNlYygpLXQwO1xucmV0dXJue3Jlc3VsdCxkdXJhdGlvbjpkdXJhdGlvbk1pbGxpc2VjLzEwMDB9O1xuIH07XG5yZXR1cm4gbWVhc3VyZVNlY29uZHM7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge0Vycm9yW119IGVycm9yc1xuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXVxuICovJGjigI1fb25jZS5tYWtlTWVhc3VyZVNlY29uZHMobWFrZU1lYXN1cmVTZWNvbmRzKTtcbmNvbnN0ICAgICAgICBtYWtlQWdncmVnYXRlRXJyb3I9KGVycm9ycyxtZXNzYWdlKT0+e1xuY29uc3QgZXJyPW5ldyBFcnJvcihtZXNzYWdlKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGVycix7XG5uYW1lOntcbnZhbHVlOidBZ2dyZWdhdGVFcnJvcid9LFxuXG5lcnJvcnM6e1xudmFsdWU6ZXJyb3JzfX0pO1xuXG5cbnJldHVybiBlcnI7XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtyZWFkb25seSAoVCB8IFByb21pc2VMaWtlPFQ+KVtdfSB2YWx1ZXNcbiAqIEByZXR1cm5zIHtQcm9taXNlPFRbXT59XG4gKi8kaOKAjV9vbmNlLm1ha2VBZ2dyZWdhdGVFcnJvcihtYWtlQWdncmVnYXRlRXJyb3IpO1xuY29uc3QgICAgICAgIFByb21pc2VBbGxPckVycm9ycz1hc3luYyh2YWx1ZXMpPT57XG5yZXR1cm4gUHJvbWlzZS5hbGxTZXR0bGVkKHZhbHVlcykudGhlbigocmVzdWx0cyk9PntcbmNvbnN0IGVycm9ycz0vKiogQHR5cGUge1Byb21pc2VSZWplY3RlZFJlc3VsdFtdfSAqL1xucmVzdWx0cy5maWx0ZXIoKHtzdGF0dXN9KT0+c3RhdHVzPT09J3JlamVjdGVkJykuXG5tYXAoKHJlc3VsdCk9PnJlc3VsdC5yZWFzb24pO1xuaWYoIWVycm9ycy5sZW5ndGgpe1xucmV0dXJuICgvKiogQHR5cGUge1Byb21pc2VGdWxmaWxsZWRSZXN1bHQ8VD5bXX0gKi9yZXN1bHRzLm1hcChcbihyZXN1bHQpPT5yZXN1bHQudmFsdWUpKTtcblxuIH1lbHNlIGlmKGVycm9ycy5sZW5ndGg9PT0xKXtcbnRocm93IGVycm9yc1swXTtcbiB9ZWxzZXtcbnRocm93IG1ha2VBZ2dyZWdhdGVFcnJvcihlcnJvcnMpO1xuIH1cbiB9KTtcbiB9O1xuXG4vKipcbiAqIEB0eXBlIHs8VD4oXG4gKiAgIHRyaWVyOiAoKSA9PiBQcm9taXNlPFQ+LFxuICogIGZpbmFsaXplcjogKGVycm9yPzogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPixcbiAqICkgPT4gUHJvbWlzZTxUPn1cbiAqLyRo4oCNX29uY2UuUHJvbWlzZUFsbE9yRXJyb3JzKFByb21pc2VBbGxPckVycm9ycyk7Y29uc3QgYWdncmVnYXRlVHJ5RmluYWxseT1hc3luYyh0cmllcixmaW5hbGl6ZXIpPT5cbnRyaWVyKCkudGhlbihcbmFzeW5jKHJlc3VsdCk9PmZpbmFsaXplcigpLnRoZW4oKCk9PnJlc3VsdCksXG5hc3luYyh0cnlFcnJvcik9PlxuZmluYWxpemVyKHRyeUVycm9yKS5cbnRoZW4oXG4oKT0+dHJ5RXJyb3IsXG4oZmluYWxpemVFcnJvcik9Pm1ha2VBZ2dyZWdhdGVFcnJvcihbdHJ5RXJyb3IsZmluYWxpemVFcnJvcl0pKS5cblxudGhlbigoZXJyb3IpPT5Qcm9taXNlLnJlamVjdChlcnJvcikpKTtcblxuXG4vKipcbiAqIEBwYXJhbSB7WGltcG9ydChcImZzXCIpLlJlYWRTdHJlYW0gfCBYaW1wb3J0KFwiZnNcIikuV3JpdGVTdHJlYW19IHN0cmVhbVxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gKi8kaOKAjV9vbmNlLmFnZ3JlZ2F0ZVRyeUZpbmFsbHkoYWdncmVnYXRlVHJ5RmluYWxseSk7XG5jb25zdCAgICAgICAgZnNTdHJlYW1SZWFkeT0oc3RyZWFtKT0+XG5uZXcgUHJvbWlzZSgocmVzb2x2ZSxyZWplY3QpPT57XG5pZihzdHJlYW0uZGVzdHJveWVkKXtcbnJlamVjdChuZXcgRXJyb3IoJ1N0cmVhbSBhbHJlYWR5IGRlc3Ryb3llZCcpKTtcbnJldHVybjtcbiB9XG5cbmlmKCFzdHJlYW0ucGVuZGluZyl7XG5yZXNvbHZlKCk7XG5yZXR1cm47XG4gfVxuXG5jb25zdCBvblJlYWR5PSgpPT57XG5jbGVhbnVwKCk7LyogZXNsaW50LWRpc2FibGUtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5yZXNvbHZlKCk7XG4gfTtcblxuLyoqIEBwYXJhbSB7RXJyb3J9IGVyciAqL1xuY29uc3Qgb25FcnJvcj0oZXJyKT0+e1xuY2xlYW51cCgpOy8qIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xucmVqZWN0KGVycik7XG4gfTtcblxuY29uc3QgY2xlYW51cD0oKT0+e1xuc3RyZWFtLm9mZigncmVhZHknLG9uUmVhZHkpO1xuc3RyZWFtLm9mZignZXJyb3InLG9uRXJyb3IpO1xuIH07XG5cbnN0cmVhbS5vbigncmVhZHknLG9uUmVhZHkpO1xuc3RyZWFtLm9uKCdlcnJvcicsb25FcnJvcik7XG4gfSk7JGjigI1fb25jZS5mc1N0cmVhbVJlYWR5KGZzU3RyZWFtUmVhZHkpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImZyb21VbmlxdWVFbnRyaWVzIjpbImZyb21VbmlxdWVFbnRyaWVzIl0sIm9iamVjdE1hcCI6WyJvYmplY3RNYXAiXSwibGlzdERpZmZlcmVuY2UiOlsibGlzdERpZmZlcmVuY2UiXSwidGhyb3dMYWJlbGVkIjpbInRocm93TGFiZWxlZCJdLCJhcHBseUxhYmVsaW5nRXJyb3IiOlsiYXBwbHlMYWJlbGluZ0Vycm9yIl0sImdldE1ldGhvZE5hbWVzIjpbImdldE1ldGhvZE5hbWVzIl0sImJpbmRBbGxNZXRob2RzIjpbImJpbmRBbGxNZXRob2RzIl0sImRlZXBseUZ1bGZpbGxlZE9iamVjdCI6WyJkZWVwbHlGdWxmaWxsZWRPYmplY3QiXSwibWFrZU1lYXN1cmVTZWNvbmRzIjpbIm1ha2VNZWFzdXJlU2Vjb25kcyJdLCJtYWtlQWdncmVnYXRlRXJyb3IiOlsibWFrZUFnZ3JlZ2F0ZUVycm9yIl0sIlByb21pc2VBbGxPckVycm9ycyI6WyJQcm9taXNlQWxsT3JFcnJvcnMiXSwiYWdncmVnYXRlVHJ5RmluYWxseSI6WyJhZ2dyZWdhdGVUcnlGaW5hbGx5Il0sImZzU3RyZWFtUmVhZHkiOlsiZnNTdHJlYW1SZWFkeSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABS8904iAsAAIgLAAAiAAAAQGFnb3JpYy9uYXQtdjQuMS4wL2Rpc3QvbmF0LmVzbS5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiTmF0IiwiaXNOYXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoaXNOYXQsICduYW1lJywge3ZhbHVlOiBcImlzTmF0XCJ9KTskaOKAjV9vbmNlLmlzTmF0KGlzTmF0KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoTmF0LCAnbmFtZScsIHt2YWx1ZTogXCJOYXRcIn0pOyRo4oCNX29uY2UuTmF0KE5hdCk7ICAgLyogQ29weXJpZ2h0IChDKSAyMDExIEdvb2dsZSBJbmMuKi9cbi8qIENvcHlyaWdodCAoQykgMjAxOCBBZ29yaWMqL1xuLyoqL1xuLyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsqL1xuLyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiovXG4vKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQqL1xuLyoqL1xuLyogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKi9cbi8qKi9cbi8qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUqL1xuLyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLCovXG4vKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4qL1xuLyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCovXG4vKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4qL1xuXG4vKiBAdHMtY2hlY2sqL1xuXG4vKipcbiAqIElzIGBhbGxlZ2VkTnVtYCBhIG51bWJlciBpbiB0aGUgW2NvbnRpZ3VvdXMgcmFuZ2Ugb2YgZXhhY3RseSBhbmRcbiAqIHVuYW1iaWd1b3VzbHlcbiAqIHJlcHJlc2VudGFibGVdKGh0dHBzOi8vZXNkaXNjdXNzLm9yZy90b3BpYy9tb3JlLW51bWVyaWMtY29uc3RhbnRzLXBsZWFzZS1lc3BlY2lhbGx5LWVwc2lsb24jY29udGVudC0xNClcbiAqICBuYXR1cmFsIG51bWJlcnMgKG5vbi1uZWdhdGl2ZSBpbnRlZ2Vycyk/XG4gKlxuICogVG8gcXVhbGlmeSBgYWxsZWdlZE51bWAgbXVzdCBlaXRoZXIgYmUgYVxuICogbm9uLW5lZ2F0aXZlIGBiaWdpbnRgLCBvciBhIG5vbi1uZWdhdGl2ZSBgbnVtYmVyYCByZXByZXNlbnRpbmcgYW4gaW50ZWdlclxuICogd2l0aGluIHJhbmdlIG9mIFtpbnRlZ2VycyBzYWZlbHkgcmVwcmVzZW50YWJsZSBpblxuICogZmxvYXRpbmcgcG9pbnRdKGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbnVtYmVyLmlzc2FmZWludGVnZXIpLlxuICpcbiAqIEBwYXJhbSB7YW55fSBhbGxlZ2VkTnVtXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNOYXQoYWxsZWdlZE51bSl7XG5pZih0eXBlb2YgYWxsZWdlZE51bT09PSdiaWdpbnQnKXtcbnJldHVybiBhbGxlZ2VkTnVtPj0wO1xuIH1cblxucmV0dXJuIE51bWJlci5pc1NhZmVJbnRlZ2VyKGFsbGVnZWROdW0pJiZhbGxlZ2VkTnVtPj0wO1xuIH1cblxuLyoqXG4gKiBJZiBgYWxsZWdlZE51bWJlcmAgcGFzc2VzIHRoZSBgaXNOYXRgIHRlc3QsIHRoZW4gcmV0dXJuIGl0IGFzIGEgYmlnaW50LlxuICogT3RoZXJ3aXNlIHRocm93IGFuIGFwcHJvcHJpYXRlIGVycm9yLlxuICpcbiAqIElmIGBhbGxlZ2VkTnVtYCBpcyBuZWl0aGVyIGEgYmlnaW50IG5vciBhIG51bWJlciwgYE5hdGAgdGhyb3dzIGEgYFR5cGVFcnJvcmAuXG4gKiBPdGhlcndpc2UsIGlmIGl0IGlzIG5vdCBhIFtzYWZlbHlcbiAqIHJlcHJlc2VudGFibGVdKGh0dHBzOi8vZXNkaXNjdXNzLm9yZy90b3BpYy9tb3JlLW51bWVyaWMtY29uc3RhbnRzLXBsZWFzZS1lc3BlY2lhbGx5LWVwc2lsb24jY29udGVudC0xNClcbiAqIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyLCBgTmF0YCB0aHJvd3MgYSBgUmFuZ2VFcnJvcmAuXG4gKiBPdGhlcndpc2UsIGl0IGlzIGNvbnZlcnRlZCB0byBhIGJpZ2ludCBpZiBuZWNlc3NhcnkgYW5kIHJldHVybmVkLlxuICpcbiAqIEBwYXJhbSB7YmlnaW50IHwgbnVtYmVyfSBhbGxlZ2VkTnVtXG4gKiBAcmV0dXJucyB7YmlnaW50fVxuICovXG5mdW5jdGlvbiBOYXQoYWxsZWdlZE51bSl7XG5pZih0eXBlb2YgYWxsZWdlZE51bT09PSdiaWdpbnQnKXtcbmlmKGFsbGVnZWROdW08MCl7XG50aHJvdyBuZXcgUmFuZ2VFcnJvciggYCR7YWxsZWdlZE51bX0gaXMgbmVnYXRpdmVgKTtcbiB9XG5yZXR1cm4gYWxsZWdlZE51bTtcbiB9XG5cbmlmKHR5cGVvZiBhbGxlZ2VkTnVtPT09J251bWJlcicpe1xuaWYoIU51bWJlci5pc1NhZmVJbnRlZ2VyKGFsbGVnZWROdW0pKXtcbnRocm93IG5ldyBSYW5nZUVycm9yKCBgJHthbGxlZ2VkTnVtfSBub3QgYSBzYWZlIGludGVnZXJgKTtcbiB9XG5pZihhbGxlZ2VkTnVtPDApe1xudGhyb3cgbmV3IFJhbmdlRXJyb3IoIGAke2FsbGVnZWROdW19IGlzIG5lZ2F0aXZlYCk7XG4gfVxucmV0dXJuIEJpZ0ludChhbGxlZ2VkTnVtKTtcbiB9XG5cbnRocm93IG5ldyBUeXBlRXJyb3IoXG4gYCR7YWxsZWdlZE51bX0gaXMgYSAke3R5cGVvZiBhbGxlZ2VkTnVtfSBidXQgbXVzdCBiZSBhIGJpZ2ludCBvciBhIG51bWJlcmApO1xuXG4gfVxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzTmF0IjpbImlzTmF0Il0sIk5hdCI6WyJOYXQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAkcXQLkcBAABHAQAAIwAAAEBhZ29yaWMvbm90aWZpZXItdjAuNS4xL2V4cG9ydGVkLmpzeyJpbXBvcnRzIjpbIi4vc3JjL3R5cGVzLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vc3JjL3R5cGVzLmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACmzk7MWB0AAFgdAAAzAAAAQGFnb3JpYy9ub3RpZmllci12MC41LjEvc3JjL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzeyJpbXBvcnRzIjpbIi4vdHlwZXMuanMiLCJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbIm1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyIiwib2JzZXJ2ZUl0ZXJhdGlvbiIsIm9ic2VydmVJdGVyYXRvciIsIm9ic2VydmVOb3RpZmllciIsInVwZGF0ZUZyb21JdGVyYWJsZSIsInVwZGF0ZUZyb21Ob3RpZmllciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBFLEZhcjskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXV1dLFtcIi4vdHlwZXMuanNcIiwgW11dXSk7ICAgXG5cblxuXG5cblxuXG5cbi8qKlxuICogQWRhcHRvciBmcm9tIGEgbm90aWZpZXJQIHRvIGFuIGFzeW5jIGl0ZXJhYmxlLlxuICogVGhlIG5vdGlmaWVyUCBjYW4gYmUgYW55IG9iamVjdCB0aGF0IGhhcyBhbiBldmVudHVhbGx5IGludm9jYWJsZVxuICogYGdldFVwZGF0ZVNpbmNlYCBtZXRob2QgdGhhdCBiZWhhdmVzIGFjY29yZGluZyB0byB0aGUgbm90aWZpZXJcbiAqIHNwZWMuIFRoaXMgY2FuIGJlIGEgbm90aWZpZXIsIGEgcHJvbWlzZSBmb3IgYSBsb2NhbCBvciByZW1vdGVcbiAqIG5vdGlmaWVyLCBvciBhIHByZXNlbmNlIG9mIGEgcmVtb3RlIG5vdGlmaWVyLlxuICpcbiAqIEl0IGlzIGFsc28gdXNlZCBpbnRlcm5hbGx5IGJ5IG5vdGlmaWVyLmpzIHNvIHRoYXQgYSBub3RpZmllciBpdHNlbGYgaXMgYW5cbiAqIGFzeW5jIGl0ZXJhYmxlLlxuICpcbiAqIEFuIGFzeW5jIGl0ZXJhYmxlIGlzIGFuIG9iamVjdCB3aXRoIGEgYFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKWAgbWV0aG9kXG4gKiB0aGF0IHJldHVybnMgYW4gYXN5bmMgaXRlcmF0b3IuIFRoZSBhc3luYyBpdGVyYXRvciB3ZSByZXR1cm4gaGVyZSBoYXMgb25seVxuICogYSBgbmV4dCgpYCBtZXRob2QsIHdpdGhvdXQgdGhlIG9wdGlvbmFsIGByZXR1cm5gIGFuZCBgdGhyb3dgIG1ldGhvZHMuIFRoZVxuICogb21pdHRlZCBtZXRob2RzLCBpZiBwcmVzZW50LCB3b3VsZCBiZSB1c2VkIGJ5IHRoZSBmb3IvYXdhaXQvb2YgbG9vcCB0b1xuICogaW5mb3JtIHRoZSBpdGVyYXRvciBvZiBlYXJseSB0ZXJtaW5hdGlvbi4gQnV0IHRoaXMgYWRhcHRvciB3b3VsZCBub3QgZG9cbiAqIGFueXRoaW5nIHVzZWZ1bCBpbiByZWFjdGlvbiB0byB0aGlzIG5vdGlmaWNhdGlvbi5cbiAqXG4gKiBBbiBhc3luYyBpdGVyYXRvcidzIGBuZXh0KClgIG1ldGhvZCByZXR1cm5zIGEgcHJvbWlzZSBmb3IgYW4gaXRlcmF0aW9uXG4gKiByZXN1bHQuIEFuIGl0ZXJhdGlvbiByZXN1bHQgaXMgYSByZWNvcmQgd2l0aCBgdmFsdWVgIGFuZCBgZG9uZWAgcHJvcGVydGllcy5cbiAqXG4gKiBUaGUgcHVycG9zZSBvZiBidWlsZGluZyBvbiB0aGUgbm90aWZpZXIgcHJvdG9jb2wgaXMgdG8gaGF2ZSBhIGxvc3N5XG4gKiBhZGFwdG9yLCB3aGVyZSBpbnRlcm1lZGlhdGUgcmVzdWx0cyBjYW4gYmUgbWlzc2VkIGluIGZhdm9yIG9mIG1vcmUgcmVjZW50XG4gKiByZXN1bHRzIHdoaWNoIGFyZSB0aGVyZWZvcmUgbGVzcyBzdGFsZS4gU2VlXG4gKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2RvY3VtZW50YXRpb24vYmxvYi9tYXN0ZXIvbWFpbi9kaXN0cmlidXRlZC1wcm9ncmFtbWluZy5tZCNub3RpZmllcnNcbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPEJhc2VOb3RpZmllcjxUPj59IG5vdGlmaWVyUFxuICogQHJldHVybnMge0NvbnNpc3RlbnRBc3luY0l0ZXJhYmxlPFQ+fVxuICovXG5jb25zdCAgICAgICAgbWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXI9KG5vdGlmaWVyUCk9PntcbnJldHVybiBGYXIoJ2FzeW5jSXRlcmFibGVGcm9tTm90aWZpZXInLHtcbltTeW1ib2wuYXN5bmNJdGVyYXRvcl06KCk9Pntcbi8qKiBAdHlwZSB7VXBkYXRlQ291bnR9ICovXG5sZXQgbG9jYWxVcGRhdGVDb3VudDtcbi8qKiBAdHlwZSB7UHJvbWlzZTx7dmFsdWU6IFQsIGRvbmU6IGJvb2xlYW59PiB8IHVuZGVmaW5lZH0gKi9cbmxldCBteUl0ZXJhdGlvblJlc3VsdFA7XG5yZXR1cm4gRmFyKCdhc3luY0l0ZXJhdG9yRnJvbU5vdGlmaWVyJyx7XG5uZXh0OigpPT57XG5pZighbXlJdGVyYXRpb25SZXN1bHRQKXtcbi8qIEluIHRoaXMgYWRhcHRvciwgb25jZSBgbmV4dCgpYCBpcyBjYWxsZWQgYW5kIHJldHVybnMgYW4qL1xuLyogdW5yZXNvbHZlZCBwcm9taXNlLCBgbXlJdGVyYXRpb25SZXN1bHRQYCwgYW5kIHVudGlsKi9cbi8qIGBteUl0ZXJhdGlvblJlc3VsdFBgIGlzIGZ1bGZpbGxlZCB3aXRoIGFuKi9cbi8qIGl0ZXJhdGlvbiByZXN1bHQsIGZ1cnRoZXIgYG5leHQoKWAgY2FsbHMgd2lsbCByZXR1cm4gdGhlIHNhbWUqL1xuLyogYG15SXRlcmF0aW9uUmVzdWx0UGAgcHJvbWlzZSBhZ2FpbiB3aXRob3V0IGFza2luZyB0aGUgbm90aWZpZXIqL1xuLyogZm9yIG1vcmUgdXBkYXRlcy4gSWYgdGhlcmUncyBhbHJlYWR5IGFuIHVuYW5zd2VyZWQgYXNrIGluIHRoZSovXG4vKiBhaXIsIGFsbCBmdXJ0aGVyIGFza3Mgc2hvdWxkIGp1c3QgcmV1c2UgdGhlIHJlc3VsdCBvZiB0aGF0IG9uZS4qL1xuLyoqL1xuLyogVGhpcyByZXVzZSBiZWhhdmlvciBpcyBvbmx5IG5lZWRlZCBmb3IgY29kZSB0aGF0IHVzZXMgdGhlIGFzeW5jKi9cbi8qIGl0ZXJhdG9yIHByb3RvY29sIGV4cGxpY2l0bHkuIFdoZW4gdGhpcyBhc3luYyBpdGVyYXRvciBpcyovXG4vKiBjb25zdW1lZCBieSBhIGZvci9hd2FpdC9vZiBsb29wLCBgbmV4dCgpYCB3aWxsIG9ubHkgYmUgY2FsbGVkKi9cbi8qIGFmdGVyIHRoZSBwcm9taXNlIGZvciB0aGUgcHJldmlvdXMgaXRlcmF0aW9uIHJlc3VsdCBoYXMqL1xuLyogZnVsZmlsbGVkLiBJZiBpdCBmdWxmaWxscyB3aXRoIGBkb25lOiB0cnVlYCwgdGhlIGZvci9hd2FpdC9vZiovXG4vKiBsb29wIHdpbGwgbmV2ZXIgY2FsbCBgbmV4dCgpYCBhZ2Fpbi4qL1xuLyoqL1xuLyogU2VlKi9cbi8qIGh0dHBzOi8vMmFsaXR5LmNvbS8yMDE2LzEwL2FzeW5jaHJvbm91cy1pdGVyYXRpb24uaHRtbCNxdWV1aW5nLW5leHQoKS1pbnZvY2F0aW9ucyovXG4vKiBmb3IgYW4gZXhwbGljaXQgdXNlIHRoYXQgc2VuZHMgYG5leHQoKWAgd2l0aG91dCB3YWl0aW5nLiovXG5teUl0ZXJhdGlvblJlc3VsdFA9RShub3RpZmllclApLlxuZ2V0VXBkYXRlU2luY2UobG9jYWxVcGRhdGVDb3VudCkuXG50aGVuKCh7dmFsdWUsdXBkYXRlQ291bnR9KT0+e1xubG9jYWxVcGRhdGVDb3VudD11cGRhdGVDb3VudDtcbmNvbnN0IGRvbmU9bG9jYWxVcGRhdGVDb3VudD09PXVuZGVmaW5lZDtcbmlmKCFkb25lKXtcbi8qIE9uY2UgdGhlIG91dHN0YW5kaW5nIHF1ZXN0aW9uIGhhcyBiZWVuIGFuc3dlcmVkLCBzdG9wKi9cbi8qIHVzaW5nIHRoYXQgYW5zd2VyLCBzbyBhbnkgZnVydGhlciBgbmV4dCgpYCBxdWVzdGlvbnMqL1xuLyogY2F1c2UgYSBuZXcgYGdldFVwZGF0ZVNpbmNlYCByZXF1ZXN0LiovXG4vKiovXG4vKiBCdXQgb25seSBpZiBtb3JlIGFuc3dlcnMgYXJlIGV4cGVjdGVkLiBPbmNlIHRoZSBub3RpZmllciovXG4vKiBpcyBgZG9uZWAsIHRoYXQgd2FzIHRoZSBsYXN0IGFuc3dlciBzbyByZXVzZSBpdCBmb3JldmVyLiovXG5teUl0ZXJhdGlvblJlc3VsdFA9dW5kZWZpbmVkO1xuIH1cbnJldHVybiBoYXJkZW4oe3ZhbHVlLGRvbmV9KTtcbiB9KTtcbiB9XG5yZXR1cm4gbXlJdGVyYXRpb25SZXN1bHRQO1xuIH19KTtcblxuIH19KTtcblxuIH07XG5cbi8qKlxuICogVGhpcyBhZHZhbmNlcyBgYXN5bmNJdGVyYXRvclBgIHVwZGF0aW5nIGBpdGVyYXRpb25PYnNlcnZlcmAgd2l0aCBlYWNoXG4gKiBzdWNjZXNzaXZlIHZhbHVlLiBUaGUgYGl0ZXJhdGlvbk9ic2VydmVyYCBtYXkgb25seSBiZSBpbnRlcmVzdGVkIGluIGNlcnRhaW5cbiAqIG9jY3VycmVuY2VzIChgdXBkYXRlU3RhdGVgLCBgZmluaXNoYCwgYGZhaWxgKSwgc28gZm9yIGNvbnZlbmllbmNlLFxuICogYG9ic2VydmVJdGVyYXRvcmAgZmVhdHVyZSB0ZXN0cyBmb3IgdGhvc2UgbWV0aG9kcyBiZWZvcmUgY2FsbGluZyB0aGVtLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8QXN5bmNJdGVyYXRvcjxUPj59IGFzeW5jSXRlcmF0b3JQXG4gKiBAcGFyYW0ge1BhcnRpYWw8SXRlcmF0aW9uT2JzZXJ2ZXI8VD4+fSBpdGVyYXRpb25PYnNlcnZlclxuICogQHJldHVybnMge1Byb21pc2U8dW5kZWZpbmVkPn1cbiAqLyRo4oCNX29uY2UubWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIobWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIpO1xuY29uc3QgICAgICAgIG9ic2VydmVJdGVyYXRvcj0oYXN5bmNJdGVyYXRvclAsaXRlcmF0aW9uT2JzZXJ2ZXIpPT57XG5yZXR1cm4gbmV3IFByb21pc2UoKGFjayxvYnNlcnZlckVycm9yKT0+e1xuY29uc3QgcmVjdXI9KCk9PntcbkUud2hlbihcbkUoYXN5bmNJdGVyYXRvclApLm5leHQoKSxcbih7dmFsdWUsZG9uZX0pPT57XG5pZihkb25lKXtcbml0ZXJhdGlvbk9ic2VydmVyLmZpbmlzaCYmaXRlcmF0aW9uT2JzZXJ2ZXIuZmluaXNoKHZhbHVlKTtcbmFjayh1bmRlZmluZWQpO1xuIH1lbHNle1xuaXRlcmF0aW9uT2JzZXJ2ZXIudXBkYXRlU3RhdGUmJlxuaXRlcmF0aW9uT2JzZXJ2ZXIudXBkYXRlU3RhdGUodmFsdWUpO1xucmVjdXIoKTtcbiB9XG4gfSxcbihyZWFzb24pPT57XG5pdGVyYXRpb25PYnNlcnZlci5mYWlsJiZpdGVyYXRpb25PYnNlcnZlci5mYWlsKHJlYXNvbik7XG5hY2sodW5kZWZpbmVkKTtcbiB9KS5cbmNhdGNoKG9ic2VydmVyRXJyb3IpO1xuIH07XG5yZWN1cigpO1xuIH0pO1xuIH07XG5cbi8qKlxuICogVGhpcyByZWFkcyBmcm9tIGBhc3luY0l0ZXJhYmxlUGAgdXBkYXRpbmcgYGl0ZXJhdGlvbk9ic2VydmVyYCB3aXRoIGVhY2hcbiAqIHN1Y2Nlc3NpdmUgdmFsdWUuIFRoZSBgaXRlcmF0aW9uT2JzZXJ2ZXJgIG1heSBvbmx5IGJlIGludGVyZXN0ZWQgaW4gY2VydGFpblxuICogb2NjdXJyZW5jZXMgKGB1cGRhdGVTdGF0ZWAsIGBmaW5pc2hgLCBgZmFpbGApLCBzbyBmb3IgY29udmVuaWVuY2UsXG4gKiBgb2JzZXJ2ZUl0ZXJhdGlvbmAgZmVhdHVyZSB0ZXN0cyBmb3IgdGhvc2UgbWV0aG9kcyBiZWZvcmUgY2FsbGluZyB0aGVtLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8QXN5bmNJdGVyYWJsZTxUPj59IGFzeW5jSXRlcmFibGVQXG4gKiBAcGFyYW0ge1BhcnRpYWw8SXRlcmF0aW9uT2JzZXJ2ZXI8VD4+fSBpdGVyYXRpb25PYnNlcnZlclxuICogQHJldHVybnMge1Byb21pc2U8dW5kZWZpbmVkPn1cbiAqLyRo4oCNX29uY2Uub2JzZXJ2ZUl0ZXJhdG9yKG9ic2VydmVJdGVyYXRvcik7XG5jb25zdCAgICAgICAgb2JzZXJ2ZUl0ZXJhdGlvbj0oYXN5bmNJdGVyYWJsZVAsaXRlcmF0aW9uT2JzZXJ2ZXIpPT57XG5jb25zdCBpdGVyYXRvclA9RShhc3luY0l0ZXJhYmxlUClbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk7XG5yZXR1cm4gb2JzZXJ2ZUl0ZXJhdG9yKGl0ZXJhdG9yUCxpdGVyYXRpb25PYnNlcnZlcik7XG4gfTtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgYG9ic2VydmVJdGVyYXRpb25gIGluc3RlYWRcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1BhcnRpYWw8SXRlcmF0aW9uT2JzZXJ2ZXI8VD4+fSBpdGVyYXRpb25PYnNlcnZlclxuICogQHBhcmFtIHtFUmVmPEFzeW5jSXRlcmFibGU8VD4+fSBhc3luY0l0ZXJhYmxlUFxuICogQHJldHVybnMge1Byb21pc2U8dW5kZWZpbmVkPn1cbiAqLyRo4oCNX29uY2Uub2JzZXJ2ZUl0ZXJhdGlvbihvYnNlcnZlSXRlcmF0aW9uKTtcbmNvbnN0ICAgICAgICB1cGRhdGVGcm9tSXRlcmFibGU9KGl0ZXJhdGlvbk9ic2VydmVyLGFzeW5jSXRlcmFibGVQKT0+XG5vYnNlcnZlSXRlcmF0aW9uKGFzeW5jSXRlcmFibGVQLGl0ZXJhdGlvbk9ic2VydmVyKTtcblxuLyoqXG4gKiBBcyB1cGRhdGVzIGNvbWUgaW4gZnJvbSB0aGUgcG9zc2libHkgcmVtb3RlIGBub3RpZmllclBgLCB1cGRhdGVcbiAqIHRoZSBsb2NhbCBgdXBkYXRlcmAuIFNpbmNlIHRoZSB1cGRhdGVzIGNvbWUgZnJvbSBhIG5vdGlmaWVyLCB0aGV5XG4gKiBhcmUgbG9zc3ksIGkuZS4sIG9uY2UgYSBtb3JlIHJlY2VudCBzdGF0ZSBjYW4gYmUgcmVwb3J0ZWQsIGxlc3MgcmVjZW50XG4gKiBzdGF0ZXMgYXJlIGFzc3VtZWQgaXJyZWxldmFudCBhbmQgZHJvcHBlZC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPE5vdGlmaWVyPFQ+Pn0gbm90aWZpZXJQXG4gKiBAcGFyYW0ge1BhcnRpYWw8SXRlcmF0aW9uT2JzZXJ2ZXI8VD4+fSBpdGVyYXRpb25PYnNlcnZlclxuICogQHJldHVybnMge1Byb21pc2U8dW5kZWZpbmVkPn1cbiAqLyRo4oCNX29uY2UudXBkYXRlRnJvbUl0ZXJhYmxlKHVwZGF0ZUZyb21JdGVyYWJsZSk7XG5jb25zdCAgICAgICAgb2JzZXJ2ZU5vdGlmaWVyPShub3RpZmllclAsaXRlcmF0aW9uT2JzZXJ2ZXIpPT5cbm9ic2VydmVJdGVyYXRpb24obWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIobm90aWZpZXJQKSxpdGVyYXRpb25PYnNlcnZlcik7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlICdvYnNlcnZlTm90aWZpZXJgIGluc3RlYWQuXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtQYXJ0aWFsPEl0ZXJhdGlvbk9ic2VydmVyPFQ+Pn0gaXRlcmF0aW9uT2JzZXJ2ZXJcbiAqIEBwYXJhbSB7RVJlZjxOb3RpZmllcjxUPj59IG5vdGlmaWVyUFxuICogQHJldHVybnMge1Byb21pc2U8dW5kZWZpbmVkPn1cbiAqLyRo4oCNX29uY2Uub2JzZXJ2ZU5vdGlmaWVyKG9ic2VydmVOb3RpZmllcik7XG5jb25zdCAgICAgICAgdXBkYXRlRnJvbU5vdGlmaWVyPShpdGVyYXRpb25PYnNlcnZlcixub3RpZmllclApPT5cbm9ic2VydmVJdGVyYXRpb24obWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIobm90aWZpZXJQKSxpdGVyYXRpb25PYnNlcnZlcik7JGjigI1fb25jZS51cGRhdGVGcm9tTm90aWZpZXIodXBkYXRlRnJvbU5vdGlmaWVyKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllciI6WyJtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllciJdLCJvYnNlcnZlSXRlcmF0b3IiOlsib2JzZXJ2ZUl0ZXJhdG9yIl0sIm9ic2VydmVJdGVyYXRpb24iOlsib2JzZXJ2ZUl0ZXJhdGlvbiJdLCJ1cGRhdGVGcm9tSXRlcmFibGUiOlsidXBkYXRlRnJvbUl0ZXJhYmxlIl0sIm9ic2VydmVOb3RpZmllciI6WyJvYnNlcnZlTm90aWZpZXIiXSwidXBkYXRlRnJvbU5vdGlmaWVyIjpbInVwZGF0ZUZyb21Ob3RpZmllciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAdrlgy6gkAAOoJAAAkAAAAQGFnb3JpYy9ub3RpZmllci12MC41LjEvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vYXN5bmNJdGVyYWJsZUFkYXB0b3IuanMiLCIuL25vdGlmaWVyLmpzIiwiLi9wdWJsaXNoLWtpdC5qcyIsIi4vc3RvcmVzdWIuanMiLCIuL3N1YnNjcmliZXIuanMiXSwiZXhwb3J0cyI6WyJtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllciIsIm1ha2VOb3RpZmllciIsIm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlIiwibWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIiLCJtYWtlTm90aWZpZXJLaXQiLCJtYWtlUHVibGlzaEtpdCIsIm1ha2VTdWJzY3JpcHRpb24iLCJtYWtlU3Vic2NyaXB0aW9uS2l0Iiwib2JzZXJ2ZUl0ZXJhdGlvbiIsIm9ic2VydmVJdGVyYXRvciIsIm9ic2VydmVOb3RpZmllciIsInN1YnNjcmliZUVhY2giLCJzdWJzY3JpYmVMYXRlc3QiLCJ1cGRhdGVGcm9tSXRlcmFibGUiLCJ1cGRhdGVGcm9tTm90aWZpZXIiXSwicmVleHBvcnRzIjpbIi4vc3RvcmVzdWIuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3B1Ymxpc2gta2l0LmpzXCIsIFtbXCJtYWtlUHVibGlzaEtpdFwiLCBbJGjigI1fbGl2ZVtcIm1ha2VQdWJsaXNoS2l0XCJdXV0sW1wic3Vic2NyaWJlRWFjaFwiLCBbJGjigI1fbGl2ZVtcInN1YnNjcmliZUVhY2hcIl1dXSxbXCJzdWJzY3JpYmVMYXRlc3RcIiwgWyRo4oCNX2xpdmVbXCJzdWJzY3JpYmVMYXRlc3RcIl1dXV1dLFtcIi4vbm90aWZpZXIuanNcIiwgW1tcIm1ha2VOb3RpZmllclwiLCBbJGjigI1fbGl2ZVtcIm1ha2VOb3RpZmllclwiXV1dLFtcIm1ha2VOb3RpZmllcktpdFwiLCBbJGjigI1fbGl2ZVtcIm1ha2VOb3RpZmllcktpdFwiXV1dLFtcIm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlXCIsIFskaOKAjV9saXZlW1wibWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGVcIl1dXSxbXCJtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlclwiLCBbJGjigI1fbGl2ZVtcIm1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyXCJdXV1dXSxbXCIuL3N1YnNjcmliZXIuanNcIiwgW1tcIm1ha2VTdWJzY3JpcHRpb25cIiwgWyRo4oCNX2xpdmVbXCJtYWtlU3Vic2NyaXB0aW9uXCJdXV0sW1wibWFrZVN1YnNjcmlwdGlvbktpdFwiLCBbJGjigI1fbGl2ZVtcIm1ha2VTdWJzY3JpcHRpb25LaXRcIl1dXV1dLFtcIi4vYXN5bmNJdGVyYWJsZUFkYXB0b3IuanNcIiwgW1tcIm9ic2VydmVOb3RpZmllclwiLCBbJGjigI1fbGl2ZVtcIm9ic2VydmVOb3RpZmllclwiXV1dLFtcIm9ic2VydmVJdGVyYXRvclwiLCBbJGjigI1fbGl2ZVtcIm9ic2VydmVJdGVyYXRvclwiXV1dLFtcIm9ic2VydmVJdGVyYXRpb25cIiwgWyRo4oCNX2xpdmVbXCJvYnNlcnZlSXRlcmF0aW9uXCJdXV0sW1widXBkYXRlRnJvbUl0ZXJhYmxlXCIsIFskaOKAjV9saXZlW1widXBkYXRlRnJvbUl0ZXJhYmxlXCJdXV0sW1widXBkYXRlRnJvbU5vdGlmaWVyXCIsIFskaOKAjV9saXZlW1widXBkYXRlRnJvbU5vdGlmaWVyXCJdXV0sW1wibWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXJcIiwgWyRo4oCNX2xpdmVbXCJtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllclwiXV1dXV0sW1wiLi9zdG9yZXN1Yi5qc1wiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6eyJtYWtlUHVibGlzaEtpdCI6WyJtYWtlUHVibGlzaEtpdCIsZmFsc2VdLCJzdWJzY3JpYmVFYWNoIjpbInN1YnNjcmliZUVhY2giLGZhbHNlXSwic3Vic2NyaWJlTGF0ZXN0IjpbInN1YnNjcmliZUxhdGVzdCIsZmFsc2VdLCJtYWtlTm90aWZpZXIiOlsibWFrZU5vdGlmaWVyIixmYWxzZV0sIm1ha2VOb3RpZmllcktpdCI6WyJtYWtlTm90aWZpZXJLaXQiLGZhbHNlXSwibWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGUiOlsibWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGUiLGZhbHNlXSwibWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIiOlsibWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIiLGZhbHNlXSwibWFrZVN1YnNjcmlwdGlvbiI6WyJtYWtlU3Vic2NyaXB0aW9uIixmYWxzZV0sIm1ha2VTdWJzY3JpcHRpb25LaXQiOlsibWFrZVN1YnNjcmlwdGlvbktpdCIsZmFsc2VdLCJvYnNlcnZlTm90aWZpZXIiOlsib2JzZXJ2ZU5vdGlmaWVyIixmYWxzZV0sIm9ic2VydmVJdGVyYXRvciI6WyJvYnNlcnZlSXRlcmF0b3IiLGZhbHNlXSwib2JzZXJ2ZUl0ZXJhdGlvbiI6WyJvYnNlcnZlSXRlcmF0aW9uIixmYWxzZV0sInVwZGF0ZUZyb21JdGVyYWJsZSI6WyJ1cGRhdGVGcm9tSXRlcmFibGUiLGZhbHNlXSwidXBkYXRlRnJvbU5vdGlmaWVyIjpbInVwZGF0ZUZyb21Ob3RpZmllciIsZmFsc2VdLCJtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllciI6WyJtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllciIsZmFsc2VdfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAnojNNMioAADIqAAAnAAAAQGFnb3JpYy9ub3RpZmllci12MC41LjEvc3JjL25vdGlmaWVyLmpzeyJpbXBvcnRzIjpbIi4vYXN5bmNJdGVyYWJsZUFkYXB0b3IuanMiLCIuL3R5cGVzLmpzIiwiQGFnb3JpYy9hc3NlcnQiLCJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL3Byb21pc2Uta2l0Il0sImV4cG9ydHMiOlsibWFrZU5vdGlmaWVyIiwibWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGUiLCJtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlciIsIm1ha2VOb3RpZmllcktpdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnQsbWFrZVByb21pc2VLaXQsRSxGYXIsbWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXI7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9hc3NlcnRcIiwgW1tcImFzc2VydFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0ID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJtYWtlUHJvbWlzZUtpdFwiLCBbJGjigI1fYSA9PiAobWFrZVByb21pc2VLaXQgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV1dXSxbXCIuL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzXCIsIFtbXCJtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllclwiLCBbJGjigI1fYSA9PiAobWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIgPSAkaOKAjV9hKV1dXV0sW1wiLi90eXBlcy5qc1wiLCBbXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPEJhc2VOb3RpZmllcjxUPiB8IE5vdGlmaWVySW50ZXJuYWxzPFQ+Pn0gc2hhcmFibGVJbnRlcm5hbHNQXG4gKiBAcmV0dXJucyB7QXN5bmNJdGVyYWJsZTxUPiAmIFNoYXJhYmxlTm90aWZpZXI8VD59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlTm90aWZpZXI9KHNoYXJhYmxlSW50ZXJuYWxzUCk9PntcbmNvbnN0IGFzeW5jSXRlcmFibGU9bWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIoc2hhcmFibGVJbnRlcm5hbHNQKTtcblxuLyoqIEB0eXBlIHtBc3luY0l0ZXJhYmxlPFQ+ICYgU2hhcmFibGVOb3RpZmllcjxUPn0gKi9cbmNvbnN0IG5vdGlmaWVyPUZhcignbm90aWZpZXInLHtcbi4uLmFzeW5jSXRlcmFibGUsXG5cbi8qKlxuICogVXNlIHRoaXMgdG8gZGlzdHJpYnV0ZSBhIE5vdGlmaWVyIGVmZmljaWVudGx5IG92ZXIgdGhlIG5ldHdvcmssXG4gKiBieSBvYnRhaW5pbmcgdGhpcyBmcm9tIHRoZSBOb3RpZmllciB0byBiZSByZXBsaWNhdGVkLCBhbmQgYXBwbHlpbmdcbiAqIGBtYWtlTm90aWZpZXJgIHRvIGl0IGF0IHRoZSBuZXcgc2l0ZSB0byBnZXQgYW4gZXF1aXZhbGVudCBsb2NhbFxuICogTm90aWZpZXIgYXQgdGhhdCBzaXRlLlxuICovXG5nZXRTaGFyYWJsZU5vdGlmaWVySW50ZXJuYWxzOigpPT5zaGFyYWJsZUludGVybmFsc1AsXG5nZXRTdG9yZUtleTooKT0+aGFyZGVuKHtub3RpZmllcn0pfSk7XG5cbnJldHVybiBub3RpZmllcjtcbiB9O1xuXG4vKipcbiAqIFByb2R1Y2VzIGEgcGFpciBvZiBvYmplY3RzLCB3aGljaCBhbGxvdyBhIHNlcnZpY2UgdG8gcHJvZHVjZSBhIHN0cmVhbSBvZlxuICogdXBkYXRlIHByb21pc2VzLlxuICpcbiAqIFRoZSBpbml0aWFsIHN0YXRlIGFyZ3VtZW50IGhhcyB0byBiZSB0cnVseSBvcHRpb25hbCBldmVuIHRob3VnaCBpdCBjYW5cbiAqIGJlIGFueSBmaXJzdCBjbGFzcyB2YWx1ZSBpbmNsdWRpbmcgYHVuZGVmaW5lZGAuIFdlIG5lZWQgdG8gZGlzdGluZ3Vpc2ggdGhlXG4gKiBwcmVzZW5jZSB2cyB0aGUgYWJzZW5jZSBvZiBpdCwgd2hpY2ggd2UgY2Fubm90IGRvIHdpdGggdGhlIG9wdGlvbmFsIGFyZ3VtZW50XG4gKiBzeW50YXguIFJhdGhlciB3ZSB1c2UgdGhlIGFyaXR5IG9mIHRoZSBgaW5pdGlhbFN0YXRlQXJyYCBhcnJheS5cbiAqXG4gKiBJZiBubyBpbml0aWFsIHN0YXRlIGlzIHByb3ZpZGVkIHRvIGBtYWtlTm90aWZpZXJLaXRgLCB0aGVuIGl0IHN0YXJ0cyB3aXRob3V0XG4gKiBhbiBpbml0aWFsIHN0YXRlLiBJdHMgaW5pdGlhbCBzdGF0ZSB3aWxsIGluc3RlYWQgYmUgdGhlIHN0YXRlIG9mIHRoZSBmaXJzdFxuICogdXBkYXRlLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1tdIHwgW1RdfSBpbml0aWFsU3RhdGVBcnIgdGhlIGZpcnN0IHN0YXRlIHRvIGJlIHJldHVybmVkICh0eXBlZCBhcyByZXN0IGFycmF5IHRvIHBlcm1pdCBgdW5kZWZpbmVkYClcbiAqIEByZXR1cm5zIHtOb3RpZmllclJlY29yZDxUPn0gdGhlIG5vdGlmaWVyIGFuZCB1cGRhdGVyXG4gKi8kaOKAjV9vbmNlLm1ha2VOb3RpZmllcihtYWtlTm90aWZpZXIpO1xuY29uc3QgICAgICAgIG1ha2VOb3RpZmllcktpdD0oLi4uaW5pdGlhbFN0YXRlQXJyKT0+e1xuLyoqIEB0eXBlIHtQcm9taXNlUmVjb3JkPFVwZGF0ZVJlY29yZDxUPj58dW5kZWZpbmVkfSAqL1xubGV0IG9wdE5leHRQcm9taXNlS2l0O1xuLyoqIEB0eXBlIHtVcGRhdGVDb3VudCAmIChudW1iZXIgfCB1bmRlZmluZWQpfSAqL1xubGV0IGN1cnJlbnRVcGRhdGVDb3VudD0xOy8qIGF2b2lkIGZhbHN5IG51bWJlcnMqL1xuLyoqIEB0eXBlIHtVcGRhdGVSZWNvcmQ8VD58dW5kZWZpbmVkfSAqL1xubGV0IGN1cnJlbnRSZXNwb25zZTtcblxuY29uc3QgaGFzU3RhdGU9KCk9PmN1cnJlbnRSZXNwb25zZSE9PXVuZGVmaW5lZDtcblxuY29uc3QgZmluYWw9KCk9PmN1cnJlbnRVcGRhdGVDb3VudD09PXVuZGVmaW5lZDtcblxuY29uc3QgYmFzZU5vdGlmaWVyPUZhcignYmFzZU5vdGlmaWVyJyx7XG4vKiBOYU4gbWF0Y2hlcyBub3RoaW5nKi9cbmdldFVwZGF0ZVNpbmNlKHVwZGF0ZUNvdW50PU5hTil7XG5pZihcbmhhc1N0YXRlKCkmJihcbmZpbmFsKCl8fFxuY3VycmVudFJlc3BvbnNlJiZjdXJyZW50UmVzcG9uc2UudXBkYXRlQ291bnQhPT11cGRhdGVDb3VudCkpXG57XG4vKiBJZiBoYXNTdGF0ZSgpIGFuZCBlaXRoZXIgaXQgaXMgZmluYWwoKSBvciBpdCBpcyovXG4vKiBub3QgdGhlIHN0YXRlIG9mIHVwZGF0ZUNvdW50LCByZXR1cm4gdGhlIGN1cnJlbnQgc3RhdGUuKi9cbmFzc2VydChjdXJyZW50UmVzcG9uc2UhPT11bmRlZmluZWQpO1xucmV0dXJuIFByb21pc2UucmVzb2x2ZShjdXJyZW50UmVzcG9uc2UpO1xuIH1cbi8qIG90aGVyd2lzZSByZXR1cm4gYSBwcm9taXNlIGZvciB0aGUgbmV4dCBzdGF0ZS4qL1xuaWYoIW9wdE5leHRQcm9taXNlS2l0KXtcbm9wdE5leHRQcm9taXNlS2l0PW1ha2VQcm9taXNlS2l0KCk7XG4gfVxucmV0dXJuIG9wdE5leHRQcm9taXNlS2l0LnByb21pc2U7XG4gfX0pO1xuXG5cbmNvbnN0IG5vdGlmaWVyPUZhcignbm90aWZpZXInLHtcbi4uLm1ha2VOb3RpZmllcihiYXNlTm90aWZpZXIpLFxuLi4uYmFzZU5vdGlmaWVyfSk7XG5cblxuY29uc3QgdXBkYXRlcj1GYXIoJ3VwZGF0ZXInLHtcbnVwZGF0ZVN0YXRlKHN0YXRlKXtcbmlmKGZpbmFsKCkpe1xudGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgdXBkYXRlIHN0YXRlIGFmdGVyIHRlcm1pbmF0aW9uLicpO1xuIH1cblxuLyogYmVjb21lIGhhc1N0YXRlKCkgJiYgIWZpbmFsKCkqL1xuYXNzZXJ0KGN1cnJlbnRVcGRhdGVDb3VudCk7XG5jdXJyZW50VXBkYXRlQ291bnQrPTE7XG5jdXJyZW50UmVzcG9uc2U9aGFyZGVuKHtcbnZhbHVlOnN0YXRlLFxudXBkYXRlQ291bnQ6Y3VycmVudFVwZGF0ZUNvdW50fSk7XG5cbmlmKG9wdE5leHRQcm9taXNlS2l0KXtcbm9wdE5leHRQcm9taXNlS2l0LnJlc29sdmUoY3VycmVudFJlc3BvbnNlKTtcbm9wdE5leHRQcm9taXNlS2l0PXVuZGVmaW5lZDtcbiB9XG4gfSxcblxuZmluaXNoKGZpbmFsU3RhdGUpe1xuaWYoZmluYWwoKSl7XG50aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBmaW5pc2ggYWZ0ZXIgdGVybWluYXRpb24uJyk7XG4gfVxuXG4vKiBiZWNvbWUgaGFzU3RhdGUoKSAmJiBmaW5hbCgpKi9cbmN1cnJlbnRVcGRhdGVDb3VudD11bmRlZmluZWQ7XG5jdXJyZW50UmVzcG9uc2U9aGFyZGVuKHtcbnZhbHVlOmZpbmFsU3RhdGUsXG51cGRhdGVDb3VudDpjdXJyZW50VXBkYXRlQ291bnR9KTtcblxuaWYob3B0TmV4dFByb21pc2VLaXQpe1xub3B0TmV4dFByb21pc2VLaXQucmVzb2x2ZShjdXJyZW50UmVzcG9uc2UpO1xub3B0TmV4dFByb21pc2VLaXQ9dW5kZWZpbmVkO1xuIH1cbiB9LFxuXG5mYWlsKHJlYXNvbil7XG5pZihmaW5hbCgpKXtcbnRocm93IG5ldyBFcnJvcignQ2Fubm90IGZhaWwgYWZ0ZXIgdGVybWluYXRpb24uJyk7XG4gfVxuXG4vKiBiZWNvbWUgIWhhc1N0YXRlKCkgJiYgZmluYWwoKSovXG5jdXJyZW50VXBkYXRlQ291bnQ9dW5kZWZpbmVkO1xuY3VycmVudFJlc3BvbnNlPXVuZGVmaW5lZDtcbmlmKCFvcHROZXh0UHJvbWlzZUtpdCl7XG5vcHROZXh0UHJvbWlzZUtpdD1tYWtlUHJvbWlzZUtpdCgpO1xuIH1cbi8qIERvbid0IHRyaWdnZXIgTm9kZS5qcydzIFVuaGFuZGxlZFByb21pc2VSZWplY3Rpb25XYXJuaW5nKi9cbm9wdE5leHRQcm9taXNlS2l0LnByb21pc2UuY2F0Y2goKF8pPT57IH0pO1xub3B0TmV4dFByb21pc2VLaXQucmVqZWN0KHJlYXNvbik7XG4gfX0pO1xuXG5cbmFzc2VydChpbml0aWFsU3RhdGVBcnIubGVuZ3RoPD0xLCd0b28gbWFueSBhcmd1bWVudHMnKTtcbmlmKGluaXRpYWxTdGF0ZUFyci5sZW5ndGg9PT0xKXtcbnVwZGF0ZXIudXBkYXRlU3RhdGUoaW5pdGlhbFN0YXRlQXJyWzBdKTtcbiB9XG5cbi8qIG5vdGlmaWVyIGZhY2V0IGlzIHNlcGFyYXRlIHNvIGl0IGNhbiBiZSBoYW5kZWQgb3V0IHdoaWxlIHVwZGF0ZXIqL1xuLyogaXMgdGlnaHRseSBoZWxkKi9cbnJldHVybiBoYXJkZW4oe25vdGlmaWVyLHVwZGF0ZXJ9KTtcbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8U3Vic2NyaWJlcjxUPj59IHN1YnNjcmliZXJQXG4gKiBAcmV0dXJucyB7Tm90aWZpZXI8VD59XG4gKi8kaOKAjV9vbmNlLm1ha2VOb3RpZmllcktpdChtYWtlTm90aWZpZXJLaXQpO1xuY29uc3QgICAgICAgIG1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyPShzdWJzY3JpYmVyUCk9Pntcbi8qKiBAdHlwZSB7YmlnaW50fSAqL1xubGV0IGxhdGVzdEluYm91bmRDb3VudDtcbi8qKiBAdHlwZSB7VXBkYXRlQ291bnQgJiBiaWdpbnR9ICovXG5sZXQgbGF0ZXN0VXBkYXRlQ291bnQ9MG47XG4vKiogQHR5cGUge1dlYWtNYXA8UHVibGljYXRpb25SZWNvcmQ8VD4sIFByb21pc2U8VXBkYXRlUmVjb3JkPFQ+Pj59ICovXG5jb25zdCBvdXRib3VuZFJlc3VsdHM9bmV3IFdlYWtNYXAoKTtcblxuLyoqXG4gKiBAcGFyYW0ge1B1YmxpY2F0aW9uUmVjb3JkPFQ+fSByZWNvcmRcbiAqIEByZXR1cm5zIHtQcm9taXNlPFVwZGF0ZVJlY29yZDxUPj59XG4gKi9cbmNvbnN0IHRyYW5zbGF0ZUluYm91bmRQdWJsaWNhdGlvblJlY29yZD0ocmVjb3JkKT0+e1xuLyogTGV2ZXJhZ2UgaWRlbnRpdHkgcHJlc2VydmF0aW9uIG9mIGByZWNvcmRgLiovXG5jb25zdCBleGlzdGluZ091dGJvdW5kUmVzdWx0PW91dGJvdW5kUmVzdWx0cy5nZXQocmVjb3JkKTtcbmlmKGV4aXN0aW5nT3V0Ym91bmRSZXN1bHQpe1xucmV0dXJuIGV4aXN0aW5nT3V0Ym91bmRSZXN1bHQ7XG4gfVxuXG5sYXRlc3RJbmJvdW5kQ291bnQ9cmVjb3JkLnB1Ymxpc2hDb3VudDtcbmxhdGVzdFVwZGF0ZUNvdW50Kz0xbjtcbmNvbnN0IHJlc3VsdFA9RS53aGVuKHJlY29yZC5oZWFkLCh7dmFsdWUsZG9uZX0pPT57XG5pZihkb25lKXtcbi8qIEZpbmFsIHJlc3VsdHMgaGF2ZSB1bmRlZmluZWQgdXBkYXRlQ291bnQuKi9cbnJldHVybiBoYXJkZW4oe3ZhbHVlLHVwZGF0ZUNvdW50OnVuZGVmaW5lZH0pO1xuIH1cbnJldHVybiBoYXJkZW4oe3ZhbHVlLHVwZGF0ZUNvdW50OmxhdGVzdFVwZGF0ZUNvdW50fSk7XG4gfSk7XG5vdXRib3VuZFJlc3VsdHMuc2V0KHJlY29yZCxyZXN1bHRQKTtcbnJldHVybiByZXN1bHRQO1xuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlIHtCYXNlTm90aWZpZXI8VD59XG4gKi9cbmNvbnN0IGJhc2VOb3RpZmllcj1GYXIoJ2Jhc2VOb3RpZmllcicse1xuZ2V0VXBkYXRlU2luY2UodXBkYXRlQ291bnQ9LTFuKXtcbmFzc2VydChcbnVwZGF0ZUNvdW50PD1sYXRlc3RVcGRhdGVDb3VudCxcbidhcmd1bWVudCBtdXN0IGJlIGEgcHJldmlvdXNseS1pc3N1ZWQgdXBkYXRlQ291bnQuJyk7XG5cblxuaWYodXBkYXRlQ291bnQ8bGF0ZXN0VXBkYXRlQ291bnQpe1xuLyogUmV0dXJuIHRoZSBtb3N0IHJlY2VudCByZXN1bHQgcG9zc2libGUgd2l0aG91dCBpbXBvc2luZyBhbiB1bm5lY2Vzc2FyeSBkZWxheS4qL1xucmV0dXJuIEUoc3Vic2NyaWJlclApLlxuc3Vic2NyaWJlQWZ0ZXIoKS5cbnRoZW4odHJhbnNsYXRlSW5ib3VuZFB1YmxpY2F0aW9uUmVjb3JkKTtcbiB9XG5cbi8qIFJldHVybiBhIHJlc3VsdCB0aGF0IGZvbGxvd3MgdGhlIGxhc3QtcmV0dXJuZWQgcmVzdWx0LCovXG4vKiBza2lwcGluZyBvdmVyIGludGVybWVkaWF0ZSByZXN1bHRzIGlmIGxhdGVzdEluYm91bmRDb3VudCovXG4vKiBubyBsb25nZXIgY29ycmVzcG9uZHMgd2l0aCB0aGUgbGF0ZXN0IHJlc3VsdC4qL1xuLyogTm90ZSB0aGF0IHVubGlrZSBub3RpZmllcnMgYW5kIHN1YnNjcmliZXJzIHJlc3BlY3RpdmVseSByZXR1cm5lZCBieSovXG4vKiBtYWtlTm90aWZpZXJLaXQgYW5kIG1ha2VQdWJsaXNoS2l0LCB0aGlzIHJlc3VsdCBpcyBub3QgZ3VhcmFudGVlZCovXG4vKiB0byBmb2xsb3cgdGhlIHJlc3VsdCByZXR1cm5lZCB3aGVuIGEgbm9uLWxhdGVzdCB1cGRhdGVDb3VudCBpcyBwcm92aWRlZCovXG4vKiAoZS5nLiwgaXQgaXMgcG9zc2libGUgZm9yIGBub3RpZmllckZyb21TdWJzY3JpYmVyLmdldFVwZGF0ZVNpbmNlKClgIGFuZCovXG4vKiBgbm90aWZpZXJGcm9tU3Vic2NyaWJlci5nZXRVcGRhdGVTaW5jZShsYXRlc3RVcGRhdGVDb3VudClgIHRvIGJvdGgqL1xuLyogc2V0dGxlIHRvIHRoZSBzYW1lIG9iamVjdCBgbmV3TGF0ZXN0YCB3aGVyZSBgbmV3TGF0ZXN0LnVwZGF0ZUNvdW50YCovXG4vKiBpcyBvbmUgZ3JlYXRlciB0aGFuIGBsYXRlc3RVcGRhdGVDb3VudGApLiovXG5yZXR1cm4gRShzdWJzY3JpYmVyUCkuXG5zdWJzY3JpYmVBZnRlcihsYXRlc3RJbmJvdW5kQ291bnQpLlxudGhlbih0cmFuc2xhdGVJbmJvdW5kUHVibGljYXRpb25SZWNvcmQpO1xuIH19KTtcblxuXG4vKiogQHR5cGUge05vdGlmaWVyPFQ+fSAqL1xuY29uc3Qgbm90aWZpZXI9RmFyKCdub3RpZmllcicse1xuLi4ubWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIoYmFzZU5vdGlmaWVyKSxcbi4uLmJhc2VOb3RpZmllcixcblxuLyoqXG4gKiBVc2UgdGhpcyB0byBkaXN0cmlidXRlIGEgTm90aWZpZXIgZWZmaWNpZW50bHkgb3ZlciB0aGUgbmV0d29yayxcbiAqIGJ5IG9idGFpbmluZyB0aGlzIGZyb20gdGhlIE5vdGlmaWVyIHRvIGJlIHJlcGxpY2F0ZWQsIGFuZCBhcHBseWluZ1xuICogYG1ha2VOb3RpZmllcmAgdG8gaXQgYXQgdGhlIG5ldyBzaXRlIHRvIGdldCBhbiBlcXVpdmFsZW50IGxvY2FsXG4gKiBOb3RpZmllciBhdCB0aGF0IHNpdGUuXG4gKi9cbmdldFNoYXJhYmxlTm90aWZpZXJJbnRlcm5hbHM6KCk9PmJhc2VOb3RpZmllcixcbmdldFN0b3JlS2V5OigpPT5oYXJkZW4oe25vdGlmaWVyfSl9KTtcblxucmV0dXJuIG5vdGlmaWVyO1xuIH07JGjigI1fb25jZS5tYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlcihtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlcik7XG5oYXJkZW4obWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIpO1xuXG4vKipcbiAqIEFkYXB0b3IgZnJvbSBhc3luYyBpdGVyYWJsZSB0byBub3RpZmllci5cbiAqXG4gKiBAZGVwcmVjYXRlZCBUaGUgcmVzdWx0aW5nIG5vdGlmaWVyIGlzIGxvc3NsZXNzLCB3aGljaCBpcyBub3QgZGVzaXJhYmxlLlxuICogUHJlZmVyIG1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyLCBhbmQgcmVmZXIgdG9cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNTQxMyBhbmRcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9wdWxsLzU2OTUgZm9yIGNvbnRleHQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxBc3luY0l0ZXJhYmxlPFQ+Pn0gYXN5bmNJdGVyYWJsZVBcbiAqIEByZXR1cm5zIHtOb3RpZmllcjxUPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlPShhc3luY0l0ZXJhYmxlUCk9PntcbmNvbnN0IGl0ZXJhdG9yUD1FKGFzeW5jSXRlcmFibGVQKVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTtcblxuLyoqIEB0eXBlIHtQcm9taXNlPFVwZGF0ZVJlY29yZDxUPj58dW5kZWZpbmVkfSAqL1xubGV0IG9wdE5leHRQcm9taXNlO1xuLyoqIEB0eXBlIHtVcGRhdGVDb3VudCAmIGJpZ2ludH0gKi9cbmxldCBjdXJyZW50VXBkYXRlQ291bnQ9MG47XG4vKiogQHR5cGUge0VSZWY8VXBkYXRlUmVjb3JkPFQ+Pnx1bmRlZmluZWR9ICovXG5sZXQgY3VycmVudFJlc3BvbnNlO1xubGV0IGZpbmFsPWZhbHNlO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZSB7QmFzZU5vdGlmaWVyPFQ+fVxuICovXG5jb25zdCBiYXNlTm90aWZpZXI9RmFyKCdiYXNlTm90aWZpZXInLHtcbmdldFVwZGF0ZVNpbmNlKHVwZGF0ZUNvdW50PS0xbil7XG5pZih1cGRhdGVDb3VudDxjdXJyZW50VXBkYXRlQ291bnQpe1xuaWYoY3VycmVudFJlc3BvbnNlKXtcbnJldHVybiBQcm9taXNlLnJlc29sdmUoY3VycmVudFJlc3BvbnNlKTtcbiB9XG4gfWVsc2UgaWYodXBkYXRlQ291bnQhPT1jdXJyZW50VXBkYXRlQ291bnQpe1xudGhyb3cgbmV3IEVycm9yKFxuJ2dldFVwZGF0ZVNpbmNlIGFyZ3VtZW50IG11c3QgYmUgYSBwcmV2aW91c2x5LWlzc3VlZCB1cGRhdGVDb3VudC4nKTtcblxuIH1cblxuLyogUmV0dXJuIGEgZmluYWwgcmVzcG9uc2UgaWYgd2UgaGF2ZSBvbmUsIG90aGVyd2lzZSBhIHByb21pc2UgZm9yIHRoZSBuZXh0IHN0YXRlLiovXG5pZihmaW5hbCl7XG5hc3NlcnQoY3VycmVudFJlc3BvbnNlIT09dW5kZWZpbmVkKTtcbnJldHVybiBQcm9taXNlLnJlc29sdmUoY3VycmVudFJlc3BvbnNlKTtcbiB9XG5pZighb3B0TmV4dFByb21pc2Upe1xuY29uc3QgbmV4dEl0ZXJSZXN1bHRQPUUoaXRlcmF0b3JQKS5uZXh0KCk7XG5vcHROZXh0UHJvbWlzZT1FLndoZW4oXG5uZXh0SXRlclJlc3VsdFAsXG4oe2RvbmUsdmFsdWV9KT0+e1xuYXNzZXJ0KCFmaW5hbCk7XG5pZihkb25lKXtcbmZpbmFsPXRydWU7XG4gfVxuY3VycmVudFVwZGF0ZUNvdW50Kz0xbjtcbmN1cnJlbnRSZXNwb25zZT1oYXJkZW4oe1xudmFsdWUsXG51cGRhdGVDb3VudDpkb25lP3VuZGVmaW5lZDpjdXJyZW50VXBkYXRlQ291bnR9KTtcblxub3B0TmV4dFByb21pc2U9dW5kZWZpbmVkO1xucmV0dXJuIGN1cnJlbnRSZXNwb25zZTtcbiB9LFxuKF9yZWFzb24pPT57XG5maW5hbD10cnVlO1xuY3VycmVudFJlc3BvbnNlPVxuLyoqIEB0eXBlIHtQcm9taXNlPFVwZGF0ZVJlY29yZDxUPj59ICovXG5uZXh0SXRlclJlc3VsdFA7XG5vcHROZXh0UHJvbWlzZT11bmRlZmluZWQ7XG5yZXR1cm4gY3VycmVudFJlc3BvbnNlO1xuIH0pO1xuXG4gfVxucmV0dXJuIG9wdE5leHRQcm9taXNlO1xuIH19KTtcblxuXG4vKiogQHR5cGUge05vdGlmaWVyPFQ+fSAqL1xuY29uc3Qgbm90aWZpZXI9RmFyKCdub3RpZmllcicse1xuLyogRG9uJ3QgbGVhayB0aGUgb3JpZ2luYWwgYXN5bmNJdGVyYWJsZVAgc2luY2UgaXQgbWF5IGJlIHJlbW90ZSBhbmQgd2UgYWxzbyovXG4vKiB3YW50IHRoZSBzYW1lIHNlbWFudGljcyBmb3IgdGhpcyBleHBvc2VkIGl0ZXJhYmxlIGFuZCB0aGUgYmFzZU5vdGlmaWVyLiovXG4uLi5tYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllcihiYXNlTm90aWZpZXIpLFxuLi4uYmFzZU5vdGlmaWVyLFxuXG4vKipcbiAqIFVzZSB0aGlzIHRvIGRpc3RyaWJ1dGUgYSBOb3RpZmllciBlZmZpY2llbnRseSBvdmVyIHRoZSBuZXR3b3JrLFxuICogYnkgb2J0YWluaW5nIHRoaXMgZnJvbSB0aGUgTm90aWZpZXIgdG8gYmUgcmVwbGljYXRlZCwgYW5kIGFwcGx5aW5nXG4gKiBgbWFrZU5vdGlmaWVyYCB0byBpdCBhdCB0aGUgbmV3IHNpdGUgdG8gZ2V0IGFuIGVxdWl2YWxlbnQgbG9jYWxcbiAqIE5vdGlmaWVyIGF0IHRoYXQgc2l0ZS5cbiAqL1xuZ2V0U2hhcmFibGVOb3RpZmllckludGVybmFsczooKT0+YmFzZU5vdGlmaWVyLFxuZ2V0U3RvcmVLZXk6KCk9PmhhcmRlbih7bm90aWZpZXJ9KX0pO1xuXG5yZXR1cm4gbm90aWZpZXI7XG4gfTskaOKAjV9vbmNlLm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlKG1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlKTtcbmhhcmRlbihtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZU5vdGlmaWVyIjpbIm1ha2VOb3RpZmllciJdLCJtYWtlTm90aWZpZXJLaXQiOlsibWFrZU5vdGlmaWVyS2l0Il0sIm1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyIjpbIm1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyIl0sIm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlIjpbIm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACjL3999FwAAfRcAACoAAABAYWdvcmljL25vdGlmaWVyLXYwLjUuMS9zcmMvcHVibGlzaC1raXQuanN7ImltcG9ydHMiOlsiLi90eXBlcy5qcyIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9tYXJzaGFsIiwiQGVuZG8vcHJvbWlzZS1raXQiXSwiZXhwb3J0cyI6WyJtYWtlUHVibGlzaEtpdCIsInN1YnNjcmliZUVhY2giLCJzdWJzY3JpYmVMYXRlc3QiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgSGFuZGxlZFByb21pc2UsRSxtYWtlUHJvbWlzZUtpdCxGYXI7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiSGFuZGxlZFByb21pc2VcIiwgWyRo4oCNX2EgPT4gKEhhbmRsZWRQcm9taXNlID0gJGjigI1fYSldXSxbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJtYWtlUHJvbWlzZUtpdFwiLCBbJGjigI1fYSA9PiAobWFrZVByb21pc2VLaXQgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV0sW1wiLi90eXBlcy5qc1wiLCBbXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5jb25zdCBzaW5rPSgpPT57IH07XG5cbi8qKlxuICogQXN5bmNyb25vdXNseSBpdGVyYXRlcyBvdmVyIHRoZSBjb250ZW50cyBvZiBhIFB1YmxpY2F0aW9uTGlzdCBhcyBpdCBhcHBlYXJzLlxuICogQXMgaXQgcHJvY2VlZHMsIGl0IG11c3QgZHJvcCB0aGUgcGFydHMgb2YgdGhlIGxpc3QgaXQgbm8gbG9uZ2VyIG5lZWRzLlxuICogVGh1cywgaWYgbm8gb25lIGVsc2UgaXMgaG9sZGluZyBvbiB0byB0aG9zZSwgaXQgY2FuIGJlIGdhcmJhZ2UgY29sbGVjdGVkLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1B1YmxpY2F0aW9uTGlzdDxUPn0gcHViTGlzdFxuICogQHJldHVybnMge0FzeW5jSXRlcmF0b3I8VD59XG4gKi9cbmNvbnN0IG1ha2VFYWNoSXRlcmF0b3I9KHB1Ykxpc3QpPT57XG4vKiBUbyB1bmRlcnN0YW5kIHRoZSBpbXBsZW1lbnRhdGlvbiwgc3RhcnQgd2l0aCovXG4vKiBodHRwczovL3dlYi5hcmNoaXZlLm9yZy93ZWIvMjAxNjA0MDQxMjIyNTAvaHR0cDovL3dpa2kuZWNtYXNjcmlwdC5vcmcvZG9rdS5waHA/aWQ9c3RyYXdtYW46Y29uY3VycmVuY3kjaW5maW5pdGVfcXVldWUqL1xucmV0dXJuIEZhcignRWFjaEl0ZXJhdG9yJyx7XG5uZXh0OigpPT57XG5jb25zdCByZXN1bHRQPUUuZ2V0KHB1Ykxpc3QpLmhlYWQ7XG5wdWJMaXN0PUUuZ2V0KHB1Ykxpc3QpLnRhaWw7XG4vKiBXZSBleHBlY3QgdGhlIHRhaWwgdG8gYmUgdGhlIFwiY2Fubm90IHJlYWQgcGFzdCBlbmRcIiBlcnJvciBhdCB0aGUgZW5kKi9cbi8qIG9mIHRoZSBoYXBweSBwYXRoLiovXG4vKiBTaW5jZSB3ZSBhcmUgd3JhcHBpbmcgdGhhdCBlcnJvciB3aXRoIGV2ZW50dWFsIHNlbmQsIHdlIHNpbmsgdGhlKi9cbi8qIHJlamVjdGlvbiBoZXJlIHRvbyBzbyBpdCBkb2Vzbid0IGJlY29tZSBhbiBpbnZhbGlkIHVuaGFuZGxlZCByZWplY3Rpb24qL1xuLyogbGF0ZXIuKi9cbnZvaWQgRS53aGVuKHB1Ykxpc3Qsc2luayxzaW5rKTtcbnJldHVybiByZXN1bHRQO1xuIH19KTtcblxuIH07XG5cbi8qKlxuICogR2l2ZW4gYSBsb2NhbCBvciByZW1vdGUgc3Vic2NyaWJlciwgcmV0dXJucyBhIGxvY2FsIEFzeW5jSXRlcmFibGUgd2hpY2hcbiAqIHByb3ZpZGVzIFwicHJlZml4IGxvc3N5XCIgaXRlcmF0aW9ucyBvZiB0aGUgdW5kZXJseWluZyBQdWJsaWNhdGlvbkxpc3QuXG4gKiBCeSBcInByZWZpeCBsb3NzeVwiLCB3ZSBtZWFuIHRoYXQgeW91IG1heSBtaXNzIGV2ZXJ5dGhpbmcgcHVibGlzaGVkIGJlZm9yZVxuICogeW91IGFzayB0aGUgcmV0dXJuZWQgaXRlcmFibGUgZm9yIGFuIGl0ZXJhdG9yLiBCdXQgdGhlIHJldHVybmVkIGl0ZXJhdG9yXG4gKiB3aWxsIGVudW1lcmF0ZSBlYWNoIHRoaW5nIHB1Ymxpc2hlZCBmcm9tIHRoYXQgaXRlcmF0b3IncyBzdGFydGluZyBwb2ludC5cbiAqXG4gKiBJZiB0aGUgdW5kZXJseWluZyBQdWJsaWNhdGlvbkxpc3QgaXMgdGVybWluYXRlZCwgdGhhdCB0ZXJtaW5hbCB2YWx1ZSB3aWxsIGJlXG4gKiByZXBvcnRlZCBsb3NzbGVzc2x5LlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8U3Vic2NyaWJlcjxUPj59IHN1YnNjcmliZXJcbiAqIEByZXR1cm5zIHtBc3luY0l0ZXJhYmxlPFQ+fVxuICovXG5jb25zdCAgICAgICAgc3Vic2NyaWJlRWFjaD0oc3Vic2NyaWJlcik9PntcbmNvbnN0IGl0ZXJhYmxlPUZhcignRWFjaEl0ZXJhYmxlJyx7XG5bU3ltYm9sLmFzeW5jSXRlcmF0b3JdOigpPT57XG5jb25zdCBwdWJMaXN0PUUoc3Vic2NyaWJlcikuc3Vic2NyaWJlQWZ0ZXIoKTtcbnJldHVybiBtYWtlRWFjaEl0ZXJhdG9yKHB1Ykxpc3QpO1xuIH19KTtcblxucmV0dXJuIGl0ZXJhYmxlO1xuIH07JGjigI1fb25jZS5zdWJzY3JpYmVFYWNoKHN1YnNjcmliZUVhY2gpO1xuaGFyZGVuKHN1YnNjcmliZUVhY2gpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8U3Vic2NyaWJlcjxUPj59IHN1YnNjcmliZXJcbiAqIEByZXR1cm5zIHtBc3luY0l0ZXJhdG9yPFQ+fVxuICovXG5jb25zdCBtYWtlTGF0ZXN0SXRlcmF0b3I9KHN1YnNjcmliZXIpPT57XG5sZXQgbGF0ZXN0UHVibGlzaENvdW50O1xucmV0dXJuIEZhcignTGF0ZXN0SXRlcmF0b3InLHtcbm5leHQ6KCk9PntcbmNvbnN0IHB1Ykxpc3Q9RShzdWJzY3JpYmVyKS5zdWJzY3JpYmVBZnRlcihsYXRlc3RQdWJsaXNoQ291bnQpO1xuLyogV2l0aG91dCBhbiBvblJlamVjdGlvbiwgaWYgcHViTGlzdCBpcyBhIHJlamVjdGlvbiwgdGhpcyB3aWxsKi9cbi8qIHByb3BhZ2F0ZSB0aGUgcmVqZWN0aW9uIGFzIGl0IHNob3VsZC4qL1xucmV0dXJuIEUud2hlbihwdWJMaXN0LCh7aGVhZCxwdWJsaXNoQ291bnR9KT0+e1xubGF0ZXN0UHVibGlzaENvdW50PXB1Ymxpc2hDb3VudDtcbnJldHVybiBoZWFkO1xuIH0pO1xuIH19KTtcblxuIH07XG5cbi8qKlxuICogR2l2ZW4gYSBsb2NhbCBvciByZW1vdGUgc3Vic2NyaWJlciwgcmV0dXJucyBhIGxvY2FsIEFzeW5jSXRlcmFibGUgd2hpY2hcbiAqIHByb3ZpZGVzIFwibG9zc3lcIiBpdGVyYXRpb25zIG9mIHRoZSB1bmRlcmx5aW5nIFB1YmxpY2F0aW9uTGlzdC5cbiAqIEJ5IFwibG9zc3lcIiwgd2UgbWVhbiB0aGF0IHlvdSBtYXkgbWlzcyBhbnkgcHVibGlzaGVkIHN0YXRlIGlmIGEgbW9yZVxuICogcmVjZW50IHB1Ymxpc2hlZCBzdGF0ZSBjYW4gYmUgcmVwb3J0ZWQgaW5zdGVhZC5cbiAqXG4gKiBJZiB0aGUgdW5kZXJseWluZyBQdWJsaWNhdGlvbkxpc3QgaXMgdGVybWluYXRlZCwgdGhhdCB0ZXJtaW5hbCB2YWx1ZSB3aWxsIGJlXG4gKiByZXBvcnRlZCBsb3NzbGVzc2x5LlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8U3Vic2NyaWJlcjxUPj59IHN1YnNjcmliZXJcbiAqIEByZXR1cm5zIHtBc3luY0l0ZXJhYmxlPFQ+fVxuICovXG5jb25zdCAgICAgICAgc3Vic2NyaWJlTGF0ZXN0PShzdWJzY3JpYmVyKT0+e1xuY29uc3QgaXRlcmFibGU9RmFyKCdMYXRlc3RJdGVyYWJsZScse1xuW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTooKT0+bWFrZUxhdGVzdEl0ZXJhdG9yKHN1YnNjcmliZXIpfSk7XG5cbnJldHVybiBpdGVyYWJsZTtcbiB9OyRo4oCNX29uY2Uuc3Vic2NyaWJlTGF0ZXN0KHN1YnNjcmliZUxhdGVzdCk7XG5oYXJkZW4oc3Vic2NyaWJlTGF0ZXN0KTtcblxuLyoqXG4gKiBNYWtlcyBhIGB7IHB1Ymxpc2hlciwgc3Vic2NyaWJlciB9YCBwYWlyIGZvciBkb2luZyBlZmZpY2llbnRcbiAqIGRpc3RyaWJ1dGVkIHB1Yi9zdWIgc3VwcG9ydGluZyBib3RoIFwiZWFjaFwiIGFuZCBcImxhdGVzdFwiIGl0ZXJhdGlvblxuICogb2YgcHVibGlzaGVkIHZhbHVlcy5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHJldHVybnMge1B1Ymxpc2hLaXQ8VD59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlUHVibGlzaEtpdD0oKT0+e1xuLyoqIEB0eXBlIHtQcm9taXNlPFB1YmxpY2F0aW9uUmVjb3JkPFQ+Pn0gKi9cbmxldCB0YWlsUDtcbi8qKiBAdHlwZSB7dW5kZWZpbmVkIHwgKCh2YWx1ZTogRVJlZjxQdWJsaWNhdGlvblJlY29yZDxUPj4pID0+IHZvaWQpfSAqL1xubGV0IHRhaWxSO1xuKHtwcm9taXNlOnRhaWxQLHJlc29sdmU6dGFpbFJ9PW1ha2VQcm9taXNlS2l0KCkpO1xuXG5sZXQgY3VycmVudFB1Ymxpc2hDb3VudD0wbjtcbmxldCBjdXJyZW50UD10YWlsUDtcbmNvbnN0IGFkdmFuY2VDdXJyZW50PShkb25lLHZhbHVlLHJlamVjdGlvbik9PntcbmlmKHRhaWxSPT09dW5kZWZpbmVkKXtcbnRocm93IG5ldyBFcnJvcignQ2Fubm90IHVwZGF0ZSBzdGF0ZSBhZnRlciB0ZXJtaW5hdGlvbi4nKTtcbiB9XG5cbmN1cnJlbnRQdWJsaXNoQ291bnQrPTFuO1xuY3VycmVudFA9dGFpbFA7XG5jb25zdCByZXNvbHZlQ3VycmVudD10YWlsUjtcblxuaWYoZG9uZSl7XG50YWlsUD1IYW5kbGVkUHJvbWlzZS5yZWplY3QoXG5uZXcgRXJyb3IoJ0Nhbm5vdCByZWFkIHBhc3QgZW5kIG9mIGl0ZXJhdGlvbi4nKSk7XG5cbi8qIFN1cHByZXNzIHVuaGFuZGxlZCByZWplY3Rpb24gZXJyb3IuKi9cbnRhaWxQLmNhdGNoKCgpPT57IH0pO1xudGFpbFI9dW5kZWZpbmVkO1xuIH1lbHNle1xuKHtwcm9taXNlOnRhaWxQLHJlc29sdmU6dGFpbFJ9PW1ha2VQcm9taXNlS2l0KCkpO1xuIH1cblxuaWYocmVqZWN0aW9uKXtcbnJlc29sdmVDdXJyZW50KHJlamVjdGlvbik7XG4gfWVsc2V7XG5yZXNvbHZlQ3VycmVudChcbmhhcmRlbih7XG5oZWFkOnt2YWx1ZSxkb25lfSxcbnB1Ymxpc2hDb3VudDpjdXJyZW50UHVibGlzaENvdW50LFxudGFpbDp0YWlsUH0pKTtcblxuXG4gfVxuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlIHtTdWJzY3JpYmVyPFQ+fVxuICovXG5jb25zdCBzdWJzY3JpYmVyPUZhcignU3Vic2NyaWJlcicse1xuc3Vic2NyaWJlQWZ0ZXI6KHB1Ymxpc2hDb3VudD0tMW4pPT57XG5hc3NlcnQudHlwZW9mKHB1Ymxpc2hDb3VudCwnYmlnaW50Jyk7XG5pZihwdWJsaXNoQ291bnQ9PT1jdXJyZW50UHVibGlzaENvdW50KXtcbnJldHVybiB0YWlsUDtcbiB9ZWxzZSBpZihwdWJsaXNoQ291bnQ8Y3VycmVudFB1Ymxpc2hDb3VudCl7XG5yZXR1cm4gY3VycmVudFA7XG4gfWVsc2V7XG50aHJvdyBuZXcgRXJyb3IoXG4nc3Vic2NyaWJlQWZ0ZXIgYXJndW1lbnQgbXVzdCBiZSBhIHByZXZpb3VzbHktaXNzdWVkIHB1Ymxpc2hDb3VudC4nKTtcblxuIH1cbiB9fSk7XG5cblxuLyoqIEB0eXBlIHtQdWJsaXNoZXI8VD59ICovXG5jb25zdCBwdWJsaXNoZXI9RmFyKCdQdWJsaXNoZXInLHtcbnB1Ymxpc2g6KHZhbHVlKT0+e1xuYWR2YW5jZUN1cnJlbnQoZmFsc2UsdmFsdWUpO1xuIH0sXG5maW5pc2g6KGZpbmFsVmFsdWUpPT57XG5hZHZhbmNlQ3VycmVudCh0cnVlLGZpbmFsVmFsdWUpO1xuIH0sXG5mYWlsOihyZWFzb24pPT57XG5jb25zdCByZWplY3Rpb249SGFuZGxlZFByb21pc2UucmVqZWN0KHJlYXNvbik7XG4vKiBTdXBwcmVzcyB1bmhhbmRsZWQgcmVqZWN0aW9uIGVycm9yLiovXG5yZWplY3Rpb24uY2F0Y2goKCk9PnsgfSk7XG5hZHZhbmNlQ3VycmVudCh0cnVlLHVuZGVmaW5lZCxyZWplY3Rpb24pO1xuIH19KTtcblxucmV0dXJuIGhhcmRlbih7cHVibGlzaGVyLHN1YnNjcmliZXJ9KTtcbiB9OyRo4oCNX29uY2UubWFrZVB1Ymxpc2hLaXQobWFrZVB1Ymxpc2hLaXQpO1xuaGFyZGVuKG1ha2VQdWJsaXNoS2l0KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJzdWJzY3JpYmVFYWNoIjpbInN1YnNjcmliZUVhY2giXSwic3Vic2NyaWJlTGF0ZXN0IjpbInN1YnNjcmliZUxhdGVzdCJdLCJtYWtlUHVibGlzaEtpdCI6WyJtYWtlUHVibGlzaEtpdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACvAIBh3B0AANwdAAAnAAAAQGFnb3JpYy9ub3RpZmllci12MC41LjEvc3JjL3N0b3Jlc3ViLmpzeyJpbXBvcnRzIjpbIi4vYXN5bmNJdGVyYWJsZUFkYXB0b3IuanMiLCIuL3B1Ymxpc2gta2l0LmpzIiwiLi9zdWJzY3JpYmVyLmpzIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJtYWtlU3RvcmVkUHVibGlzaEtpdCIsIm1ha2VTdG9yZWRQdWJsaXNoZXJLaXQiLCJtYWtlU3RvcmVkU3Vic2NyaWJlciIsIm1ha2VTdG9yZWRTdWJzY3JpcHRpb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRSxGYXIsbWFrZU1hcnNoYWwsb2JzZXJ2ZUl0ZXJhdGlvbixtYWtlUHVibGlzaEtpdCxzdWJzY3JpYmVFYWNoLG1ha2VTdWJzY3JpcHRpb25LaXQ7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV0sW1wibWFrZU1hcnNoYWxcIiwgWyRo4oCNX2EgPT4gKG1ha2VNYXJzaGFsID0gJGjigI1fYSldXV1dLFtcIi4vYXN5bmNJdGVyYWJsZUFkYXB0b3IuanNcIiwgW1tcIm9ic2VydmVJdGVyYXRpb25cIiwgWyRo4oCNX2EgPT4gKG9ic2VydmVJdGVyYXRpb24gPSAkaOKAjV9hKV1dXV0sW1wiLi9wdWJsaXNoLWtpdC5qc1wiLCBbW1wibWFrZVB1Ymxpc2hLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VQdWJsaXNoS2l0ID0gJGjigI1fYSldXSxbXCJzdWJzY3JpYmVFYWNoXCIsIFskaOKAjV9hID0+IChzdWJzY3JpYmVFYWNoID0gJGjigI1fYSldXV1dLFtcIi4vc3Vic2NyaWJlci5qc1wiLCBbW1wibWFrZVN1YnNjcmlwdGlvbktpdFwiLCBbJGjigI1fYSA9PiAobWFrZVN1YnNjcmlwdGlvbktpdCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtTdWJzY3JpYmVyPFQ+fSBzdWJzY3JpYmVyXG4gKiBAcGFyYW0geyh2OiBUKSA9PiB2b2lkfSBjb25zdW1lVmFsdWVcbiAqL1xuY29uc3QgZm9yRWFjaFB1YmxpY2F0aW9uUmVjb3JkPWFzeW5jKHN1YnNjcmliZXIsY29uc3VtZVZhbHVlKT0+e1xuY29uc3QgaXRlcmF0b3JQPUUoc3Vic2NyaWJlRWFjaChzdWJzY3JpYmVyKSlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk7XG5cbmxldCBmaW5pc2hlZD1mYWxzZTtcbndoaWxlKCFmaW5pc2hlZCl7XG4vKiBBbGxvdyBuZXN0ZWQgYXdhaXRzIChpbiBsb29wKSBiZWNhdXNlIGl0J3Mgc2FmZSBmb3IgZWFjaCB0byBydW4gaW4gYSB0dXJuKi9cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hd2FpdC1pbi1sb29wLCBAamVzc2llLmpzL25vLW5lc3RlZC1hd2FpdCovXG5jb25zdHt2YWx1ZSxkb25lfT1hd2FpdCBFKGl0ZXJhdG9yUCkubmV4dCgpO1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWF3YWl0LWluLWxvb3AsIEBqZXNzaWUuanMvbm8tbmVzdGVkLWF3YWl0Ki9cbmF3YWl0IGNvbnN1bWVWYWx1ZSh2YWx1ZSk7XG5maW5pc2hlZD0hIWRvbmU7XG4gfVxuIH07XG5cbi8qKlxuICogQmVnaW4gaXRlcmF0aW5nIHRoZSBzb3VyY2UsIHN0b3Jpbmcgc2VyaWFsaXplZCBpdGVyYXRpb24gdmFsdWVzLiAgSWYgdGhlXG4gKiBzdG9yYWdlTm9kZSdzIGBzZXRWYWx1ZWAgb3BlcmF0aW9uIHJlamVjdHMsIG5vIGZ1cnRoZXIgd3JpdGVzIHRvIGl0IHdpbGxcbiAqIGJlIGF0dGVtcHRlZCAoYnV0IHJlc3VsdHMgd2lsbCByZW1haW4gYXZhaWxhYmxlIGZyb20gdGhlIHN1YnNjcmliZXIpLlxuICpcbiAqIFJldHVybnMgYSBTdG9yZWRTdWJzY3JpYmVyIHRoYXQgY2FuIGJlIHVzZWQgYnkgYSBjbGllbnQgdG8gZGlyZWN0bHkgZm9sbG93XG4gKiB0aGUgaXRlcmF0aW9uIHRoZW1zZWx2ZXMsIG9yIG9idGFpbiBpbmZvcm1hdGlvbiB0byBzdWJzY3JpYmUgdG8gdGhlIHN0b3JlZFxuICogZGF0YSBvdXQtb2YtYmFuZC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtTdWJzY3JpYmVyPFQ+fSBzdWJzY3JpYmVyXG4gKiBAcGFyYW0ge0VSZWY8U3RvcmFnZU5vZGU+fSBzdG9yYWdlTm9kZVxuICogQHBhcmFtIHtFUmVmPFJldHVyblR5cGU8dHlwZW9mIG1ha2VNYXJzaGFsPj59IG1hcnNoYWxsZXJcbiAqIEByZXR1cm5zIHtTdG9yZWRTdWJzY3JpYmVyPFQ+fVxuICovXG5jb25zdCAgICAgICAgbWFrZVN0b3JlZFN1YnNjcmliZXI9KHN1YnNjcmliZXIsc3RvcmFnZU5vZGUsbWFyc2hhbGxlcik9PntcbmFzc2VydChzdWJzY3JpYmVyJiZzdG9yYWdlTm9kZSYmbWFyc2hhbGxlciwnbWlzc2luZyBhcmd1bWVudCcpO1xuXG5jb25zdCBzdG9yZVZhbHVlPSh2YWx1ZSk9PlxuRShtYXJzaGFsbGVyKS5cbnNlcmlhbGl6ZSh2YWx1ZSkuXG50aGVuKChzZXJpYWxpemVkKT0+e1xuY29uc3QgZW5jb2RlZD1KU09OLnN0cmluZ2lmeShzZXJpYWxpemVkKTtcbnJldHVybiBFKHN0b3JhZ2VOb2RlKS5zZXRWYWx1ZShlbmNvZGVkKTtcbiB9KTtcblxuLyogU3RhcnQgcHVibGlzaGluZyB0aGUgc291cmNlLiovXG5mb3JFYWNoUHVibGljYXRpb25SZWNvcmQoc3Vic2NyaWJlcixzdG9yZVZhbHVlKS5jYXRjaCgoZXJyKT0+e1xuLyogVE9ETzogSG93IHNob3VsZCB3ZSBoYW5kbGUgYW5kL29yIHN1cmZhY2UgdGhpcyBmYWlsdXJlPyovXG4vKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvcHVsbC81NzY2I2Rpc2N1c3Npb25fcjkyMjQ5ODA4OCovXG5jb25zb2xlLmVycm9yKCdTdG9yZWRTdWJzY3JpYmVyIGZhaWxlZCB0byBpdGVyYXRlJyxlcnIpO1xuIH0pO1xuXG4vKiogQHR5cGUge1Vuc2VyaWFsaXplcn0gKi9cbmNvbnN0IHVuc2VyaWFsaXplcj1GYXIoJ3Vuc2VyaWFsaXplcicse1xudW5zZXJpYWxpemU6KGRhdGEpPT5FKG1hcnNoYWxsZXIpLnVuc2VyaWFsaXplKGRhdGEpfSk7XG5cblxuLyoqIEB0eXBlIHtTdG9yZWRTdWJzY3JpYmVyPFQ+fSAqL1xuY29uc3Qgc3RvcmVzdWI9RmFyKCdTdG9yZWRTdWJzY3JpYmVyJyx7XG4uLi5zdWJzY3JpYmVyLFxuZ2V0U3RvcmVLZXk6KCk9PkUoc3RvcmFnZU5vZGUpLmdldFN0b3JlS2V5KCksXG5nZXRVbnNlcmlhbGl6ZXI6KCk9PnVuc2VyaWFsaXplcn0pO1xuXG5yZXR1cm4gc3RvcmVzdWI7XG4gfTtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCB1c2UgbWFrZVN0b3JlZFN1YnNjcmliZXJcbiAqXG4gKiBCZWdpbiBpdGVyYXRpbmcgdGhlIHNvdXJjZSwgc3RvcmluZyBzZXJpYWxpemVkIGl0ZXJhdGlvbiB2YWx1ZXMuICBJZiB0aGVcbiAqIHN0b3JhZ2VOb2RlJ3MgYHNldFZhbHVlYCBvcGVyYXRpb24gcmVqZWN0cywgdGhlIGl0ZXJhdGlvbiB3aWxsIGJlIHRlcm1pbmF0ZWQuXG4gKlxuICogUmV0dXJucyBhIFN0b3JlZFN1YnNjcmlwdGlvbiB0aGF0IGNhbiBiZSB1c2VkIGJ5IGEgY2xpZW50IHRvIGRpcmVjdGx5IGZvbGxvd1xuICogdGhlIGl0ZXJhdGlvbiB0aGVtc2VsdmVzLCBvciBvYnRhaW4gaW5mb3JtYXRpb24gdG8gc3Vic2NyaWJlIHRvIHRoZSBzdG9yZWRcbiAqIGRhdGEgb3V0LW9mLWJhbmQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7U3Vic2NyaXB0aW9uPFQ+fSBzdWJzY3JpcHRpb25cbiAqIEBwYXJhbSB7RVJlZjxTdG9yYWdlTm9kZT59IFtzdG9yYWdlTm9kZV1cbiAqIEBwYXJhbSB7RVJlZjxSZXR1cm5UeXBlPHR5cGVvZiBtYWtlTWFyc2hhbD4+fSBbbWFyc2hhbGxlcl1cbiAqIEByZXR1cm5zIHtTdG9yZWRTdWJzY3JpcHRpb248VD59XG4gKi8kaOKAjV9vbmNlLm1ha2VTdG9yZWRTdWJzY3JpYmVyKG1ha2VTdG9yZWRTdWJzY3JpYmVyKTtcbmNvbnN0ICAgICAgICBtYWtlU3RvcmVkU3Vic2NyaXB0aW9uPShcbnN1YnNjcmlwdGlvbixcbnN0b3JhZ2VOb2RlLFxubWFyc2hhbGxlcj1tYWtlTWFyc2hhbCh1bmRlZmluZWQsdW5kZWZpbmVkLHtcbm1hcnNoYWxTYXZlRXJyb3I6KCk9PnsgfX0pKT0+XG5cbntcbi8qKiBAdHlwZSB7VW5zZXJpYWxpemVyfSAqL1xuY29uc3QgdW5zZXJpYWxpemVyPUZhcigndW5zZXJpYWxpemVyJyx7XG51bnNlcmlhbGl6ZTooZGF0YSk9PkUobWFyc2hhbGxlcikudW5zZXJpYWxpemUoZGF0YSl9KTtcblxuXG4vKiBBYm9ydCB0aGUgaXRlcmF0aW9uIG9uIHRoZSBuZXh0IG9ic2VydmF0aW9uIGlmIHRoZSBwdWJsaXNoZXIgZXZlciBmYWlscy4qL1xubGV0IHB1Ymxpc2hGYWlsZWQ9ZmFsc2U7XG5sZXQgcHVibGlzaEV4Y2VwdGlvbjtcblxuY29uc3QgZmFpbD0oZXJyKT0+e1xucHVibGlzaEZhaWxlZD10cnVlO1xucHVibGlzaEV4Y2VwdGlvbj1lcnI7XG4gfTtcblxuLyogTXVzdCAqbm90KiBiZSBhbiBhc3luYyBmdW5jdGlvbiwgYmVjYXVzZSBpdCBzb21ldGltZXMgbXVzdCB0aHJvdyB0byBhYm9ydCovXG4vKiB0aGUgaXRlcmF0aW9uLiovXG5jb25zdCBwdWJsaXNoVmFsdWU9KG9iaik9PntcbmFzc2VydChzdG9yYWdlTm9kZSk7XG5pZihwdWJsaXNoRmFpbGVkKXtcbi8qIFRvIHByb3Blcmx5IGFib3J0IHRoZSBpdGVyYXRpb24sIHRoaXMgbXVzdCBiZSBhIHN5bmNocm9ub3VzIGV4Y2VwdGlvbi4qL1xudGhyb3cgcHVibGlzaEV4Y2VwdGlvbjtcbiB9XG5cbi8qIFB1Ymxpc2ggdGhlIHZhbHVlLCBjYXB0dXJpbmcgYW55IGVycm9yLiovXG5FKG1hcnNoYWxsZXIpLlxuc2VyaWFsaXplKG9iaikuXG50aGVuKChzZXJpYWxpemVkKT0+e1xuY29uc3QgZW5jb2RlZD1KU09OLnN0cmluZ2lmeShzZXJpYWxpemVkKTtcbnJldHVybiBFKHN0b3JhZ2VOb2RlKS5zZXRWYWx1ZShlbmNvZGVkKTtcbiB9KS5cbmNhdGNoKGZhaWwpO1xuIH07XG5cbmlmKHN0b3JhZ2VOb2RlKXtcbi8qIFN0YXJ0IHB1Ymxpc2hpbmcgdGhlIHNvdXJjZS4qL1xub2JzZXJ2ZUl0ZXJhdGlvbihzdWJzY3JpcHRpb24se1xudXBkYXRlU3RhdGU6cHVibGlzaFZhbHVlLFxuZmluaXNoOnB1Ymxpc2hWYWx1ZX0pLlxuY2F0Y2goZmFpbCk7XG4gfVxuXG4vKiogQHR5cGUge1N0b3JlZFN1YnNjcmlwdGlvbjxUPn0gKi9cbi8qIEB0cy1leHBlY3QtZXJyb3IgZ2V0U3RvcmVLZXkgaW52YWxpZCwgZGVwcmVjYXRlZCB0eXBlKi9cbmNvbnN0IHN0b3Jlc3ViPUZhcignU3RvcmVkU3Vic2NyaXB0aW9uJyx7XG5nZXRTdG9yZUtleTphc3luYygpPT57XG5pZighc3RvcmFnZU5vZGUpe1xucmV0dXJuIGhhcmRlbih7c3Vic2NyaXB0aW9ufSk7XG4gfVxuY29uc3Qgc3RvcmVLZXk9YXdhaXQgRShzdG9yYWdlTm9kZSkuZ2V0U3RvcmVLZXkoKTtcbnJldHVybiBoYXJkZW4oey4uLnN0b3JlS2V5LHN1YnNjcmlwdGlvbn0pO1xuIH0sXG5nZXRVbnNlcmlhbGl6ZXI6KCk9PnVuc2VyaWFsaXplcixcbmdldFNoYXJhYmxlU3Vic2NyaXB0aW9uSW50ZXJuYWxzOlxuc3Vic2NyaXB0aW9uLmdldFNoYXJhYmxlU3Vic2NyaXB0aW9uSW50ZXJuYWxzLFxuW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTpzdWJzY3JpcHRpb25bU3ltYm9sLmFzeW5jSXRlcmF0b3JdfSk7XG5cbnJldHVybiBzdG9yZXN1YjtcbiB9OyRo4oCNX29uY2UubWFrZVN0b3JlZFN1YnNjcmlwdGlvbihtYWtlU3RvcmVkU3Vic2NyaXB0aW9uKTtcbmhhcmRlbihtYWtlU3RvcmVkU3Vic2NyaXB0aW9uKTtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCB1c2UgU3RvcmVkUHVibGlzaEtpdFxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN0b3JlZFB1Ymxpc2hlcktpdFxuICogQHByb3BlcnR5IHtTdG9yZWRTdWJzY3JpcHRpb248VD59IHN1YnNjcmliZXJcbiAqIEBwcm9wZXJ0eSB7SXRlcmF0aW9uT2JzZXJ2ZXI8VD59IHB1Ymxpc2hlclxuICovXG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgdXNlIG1ha2VTdG9yZWRQdWJsaXNoS2l0XG4gKlxuICogQHRlbXBsYXRlIFtUPXVua25vd25dXG4gKiBAcGFyYW0ge0VSZWY8U3RvcmFnZU5vZGU+fSBbc3RvcmFnZU5vZGVdXG4gKiBAcGFyYW0ge0VSZWY8TWFyc2hhbGxlcj59IFttYXJzaGFsbGVyXVxuICogQHBhcmFtIHtzdHJpbmd9IFtjaGlsZFBhdGhdXG4gKiBAcmV0dXJucyB7U3RvcmVkUHVibGlzaGVyS2l0PFQ+fVxuICovXG5jb25zdCAgICAgICAgbWFrZVN0b3JlZFB1Ymxpc2hlcktpdD0oc3RvcmFnZU5vZGUsbWFyc2hhbGxlcixjaGlsZFBhdGgpPT57XG5jb25zdHtwdWJsaWNhdGlvbixzdWJzY3JpcHRpb259PW1ha2VTdWJzY3JpcHRpb25LaXQoKTtcblxuaWYoc3RvcmFnZU5vZGUmJmNoaWxkUGF0aCl7XG5zdG9yYWdlTm9kZT1FKHN0b3JhZ2VOb2RlKS5tYWtlQ2hpbGROb2RlKGNoaWxkUGF0aCk7XG4gfVxuXG4vKiB3cmFwIHRoZSBzdWJzY3JpcHRpb24gdG8gdGVlIGV2ZW50cyB0byBzdG9yYWdlLCByZXBlYXRpbmcgdG8gdGhpcyBgc3Vic2NyaWJlcmAqL1xuY29uc3Qgc3Vic2NyaWJlcj1tYWtlU3RvcmVkU3Vic2NyaXB0aW9uKFxuc3Vic2NyaXB0aW9uLFxuc3RvcmFnZU5vZGUsXG5tYXJzaGFsbGVyKTtcblxuXG5yZXR1cm57XG5wdWJsaXNoZXI6cHVibGljYXRpb24sXG5zdWJzY3JpYmVyfTtcblxuIH07XG5cbi8qKlxuICogTGlrZSBtYWtlUHVibGlzaEtpdCB0aGlzIG1ha2VzIGEgYHsgcHVibGlzaGVyLCBzdWJzY3JpYmVyIH1gIHBhaXIgZm9yIGRvaW5nIGVmZmljaWVudFxuICogZGlzdHJpYnV0ZWQgcHViL3N1YiBzdXBwb3J0aW5nIGJvdGggXCJlYWNoXCIgYW5kIFwibGF0ZXN0XCIgaXRlcmF0aW9uXG4gKiBvZiBwdWJsaXNoZWQgdmFsdWVzLlxuICpcbiAqIFdoYXQncyBkaWZmZXJlbnQgaXMgYHN1YnNjcmliZXJgIHRlZXMgcmVjb3Jkcywgd3JpdGluZyBvdXQgdG8gc3RvcmFnZU5vZGUuXG4gKlxuICogQHRlbXBsYXRlIFtUPXVua25vd25dXG4gKiBAcGFyYW0ge0VSZWY8U3RvcmFnZU5vZGU+fSBzdG9yYWdlTm9kZVxuICogQHBhcmFtIHtFUmVmPE1hcnNoYWxsZXI+fSBtYXJzaGFsbGVyXG4gKiBAcmV0dXJucyB7U3RvcmVkUHVibGlzaEtpdDxUPn1cbiAqLyRo4oCNX29uY2UubWFrZVN0b3JlZFB1Ymxpc2hlcktpdChtYWtlU3RvcmVkUHVibGlzaGVyS2l0KTtcbmNvbnN0ICAgICAgICBtYWtlU3RvcmVkUHVibGlzaEtpdD0oc3RvcmFnZU5vZGUsbWFyc2hhbGxlcik9PntcbmNvbnN0e3B1Ymxpc2hlcixzdWJzY3JpYmVyfT1tYWtlUHVibGlzaEtpdCgpO1xuXG5yZXR1cm57XG5wdWJsaXNoZXIsXG4vKiB3cmFwIHRoZSBzdWJzY3JpYmVyIHRvIHRlZSBldmVudHMgdG8gc3RvcmFnZSovXG5zdWJzY3JpYmVyOm1ha2VTdG9yZWRTdWJzY3JpYmVyKHN1YnNjcmliZXIsc3RvcmFnZU5vZGUsbWFyc2hhbGxlcil9O1xuXG4gfTskaOKAjV9vbmNlLm1ha2VTdG9yZWRQdWJsaXNoS2l0KG1ha2VTdG9yZWRQdWJsaXNoS2l0KTtcbmhhcmRlbihtYWtlU3RvcmVkUHVibGlzaEtpdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVN0b3JlZFN1YnNjcmliZXIiOlsibWFrZVN0b3JlZFN1YnNjcmliZXIiXSwibWFrZVN0b3JlZFN1YnNjcmlwdGlvbiI6WyJtYWtlU3RvcmVkU3Vic2NyaXB0aW9uIl0sIm1ha2VTdG9yZWRQdWJsaXNoZXJLaXQiOlsibWFrZVN0b3JlZFB1Ymxpc2hlcktpdCJdLCJtYWtlU3RvcmVkUHVibGlzaEtpdCI6WyJtYWtlU3RvcmVkUHVibGlzaEtpdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAD2XbLEKwwAACsMAAApAAAAQGFnb3JpYy9ub3RpZmllci12MC41LjEvc3JjL3N1YnNjcmliZXIuanN7ImltcG9ydHMiOlsiLi9wdWJsaXNoLWtpdC5qcyIsIi4vdHlwZXMuanMiLCJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbIm1ha2VTdWJzY3JpcHRpb24iLCJtYWtlU3Vic2NyaXB0aW9uS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEUsRmFyLG1ha2VQdWJsaXNoS2l0OyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV0sW1wiLi9wdWJsaXNoLWtpdC5qc1wiLCBbW1wibWFrZVB1Ymxpc2hLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VQdWJsaXNoS2l0ID0gJGjigI1fYSldXV1dLFtcIi4vdHlwZXMuanNcIiwgW11dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8UHVibGljYXRpb25SZWNvcmQ8VD4+fSBzaGFyYWJsZUludGVybmFsc1BcbiAqIEByZXR1cm5zIHtTdWJzY3JpcHRpb248VD59XG4gKi9cbmNvbnN0IG1ha2VTdWJzY3JpcHRpb249KHNoYXJhYmxlSW50ZXJuYWxzUCk9PntcbmNvbnN0IHN1YnNjcmlwdGlvbj1GYXIoJ1N1YnNjcmlwdGlvbicse1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbltTeW1ib2wuYXN5bmNJdGVyYXRvcl06KCk9Pm1ha2VTdWJzY3JpcHRpb25JdGVyYXRvcihzaGFyYWJsZUludGVybmFsc1ApLFxuXG4vKipcbiAqIFVzZSB0aGlzIHRvIGRpc3RyaWJ1dGUgYSBTdWJzY3JpcHRpb24gZWZmaWNpZW50bHkgb3ZlciB0aGUgbmV0d29yayxcbiAqIGJ5IG9idGFpbmluZyB0aGlzIGZyb20gdGhlIFN1YnNjcmlwdGlvbiB0byBiZSByZXBsaWNhdGVkLCBhbmQgYXBwbHlpbmdcbiAqIGBtYWtlU3Vic2NyaXB0aW9uYCB0byBpdCBhdCB0aGUgbmV3IHNpdGUgdG8gZ2V0IGFuIGVxdWl2YWxlbnQgbG9jYWxcbiAqIFN1YnNjcmlwdGlvbiBhdCB0aGF0IHNpdGUuXG4gKlxuICogQHJldHVybnMge0VSZWY8UHVibGljYXRpb25SZWNvcmQ8VD4+fVxuICovXG5nZXRTaGFyYWJsZVN1YnNjcmlwdGlvbkludGVybmFsczooKT0+c2hhcmFibGVJbnRlcm5hbHNQLFxuXG5nZXRTdG9yZUtleTooKT0+aGFyZGVuKHtzdWJzY3JpcHRpb259KX0pO1xuXG5yZXR1cm4gc3Vic2NyaXB0aW9uO1xuIH07JGjigI1fb25jZS5tYWtlU3Vic2NyaXB0aW9uKG1ha2VTdWJzY3JpcHRpb24pO1xuaGFyZGVuKG1ha2VTdWJzY3JpcHRpb24pO1xuXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxQdWJsaWNhdGlvblJlY29yZDxUPj59IHRhaWxQXG4gKiBAcmV0dXJucyB7U3Vic2NyaXB0aW9uSXRlcmF0b3I8VD59XG4gKi9cbmNvbnN0IG1ha2VTdWJzY3JpcHRpb25JdGVyYXRvcj0odGFpbFApPT57XG4vKiBUbyB1bmRlcnN0YW5kIHRoZSBpbXBsZW1lbnRhdGlvbiwgc3RhcnQgd2l0aCovXG4vKiBodHRwczovL3dlYi5hcmNoaXZlLm9yZy93ZWIvMjAxNjA0MDQxMjIyNTAvaHR0cDovL3dpa2kuZWNtYXNjcmlwdC5vcmcvZG9rdS5waHA/aWQ9c3RyYXdtYW46Y29uY3VycmVuY3kjaW5maW5pdGVfcXVldWUqL1xucmV0dXJuIEZhcignU3Vic2NyaXB0aW9uSXRlcmF0b3InLHtcbnN1YnNjcmliZTooKT0+bWFrZVN1YnNjcmlwdGlvbih0YWlsUCksXG5bU3ltYm9sLmFzeW5jSXRlcmF0b3JdOigpPT5tYWtlU3Vic2NyaXB0aW9uSXRlcmF0b3IodGFpbFApLFxubmV4dDooKT0+e1xuY29uc3QgcmVzdWx0UD1FLmdldCh0YWlsUCkuaGVhZDtcbnRhaWxQPUUuZ2V0KHRhaWxQKS50YWlsO1xuUHJvbWlzZS5yZXNvbHZlKHRhaWxQKS5jYXRjaCgoKT0+eyB9KTsvKiBzdXBwcmVzcyB1bmhhbmRsZWQgcmVqZWN0aW9uIGVycm9yKi9cbnJldHVybiByZXN1bHRQO1xuIH19KTtcblxuIH07XG5cbi8qKlxuICogTWFrZXMgYSBgeyBwdWJsaWNhdGlvbiwgc3Vic2NyaXB0aW9uIH1gIGZvciBkb2luZyBsb3NzbGVzcyBlZmZpY2llbnRcbiAqIGRpc3RyaWJ1dGVkIHB1Yi9zdWIuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEByZXR1cm5zIHtTdWJzY3JpcHRpb25SZWNvcmQ8VD59XG4gKi9cbmNvbnN0IG1ha2VTdWJzY3JpcHRpb25LaXQ9KCk9PntcbmNvbnN0e3B1Ymxpc2hlcixzdWJzY3JpYmVyfT1tYWtlUHVibGlzaEtpdCgpO1xuXG4vKiBUaGUgcHVibGlzaCBraXQgc3Vic2NyaWJlciBpcyBwcmVmaXgtbG9zc3ksIHNvIG1ha2luZyAqdGhpcyogc3Vic2NyaWJlciBjb21wbGV0ZWx5Ki9cbi8qIGxvc3NsZXNzIHJlcXVpcmVzIGVhZ2VyIGNvbnN1bXB0aW9uIG9mIHRoZSBmb3JtZXIuKi9cbi8qIFN1Y2ggbG9zc2xlc3NuZXNzIGluaGliaXRzIEdDLCB3aGljaCBpcyB3aHkgd2UncmUgbW92aW5nIGF3YXkgZnJvbSBpdC4qL1xuY29uc3QgcHViTGlzdD1zdWJzY3JpYmVyLnN1YnNjcmliZUFmdGVyKCk7XG5jb25zdCBzdWJzY3JpcHRpb249bWFrZVN1YnNjcmlwdGlvbihwdWJMaXN0KTtcblxuLyoqIEB0eXBlIHtJdGVyYXRpb25PYnNlcnZlcjxUPn0gKi9cbmNvbnN0IHB1YmxpY2F0aW9uPUZhcigncHVibGljYXRpb24nLHtcbnVwZGF0ZVN0YXRlOnB1Ymxpc2hlci5wdWJsaXNoLFxuZmluaXNoOnB1Ymxpc2hlci5maW5pc2gsXG5mYWlsOnB1Ymxpc2hlci5mYWlsfSk7XG5cblxucmV0dXJuIGhhcmRlbih7cHVibGljYXRpb24sc3Vic2NyaXB0aW9ufSk7XG4gfTskaOKAjV9vbmNlLm1ha2VTdWJzY3JpcHRpb25LaXQobWFrZVN1YnNjcmlwdGlvbktpdCk7XG5oYXJkZW4obWFrZVN1YnNjcmlwdGlvbktpdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVN1YnNjcmlwdGlvbiI6WyJtYWtlU3Vic2NyaXB0aW9uIl0sIm1ha2VTdWJzY3JpcHRpb25LaXQiOlsibWFrZVN1YnNjcmlwdGlvbktpdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAomVeJtyEAALchAAAkAAAAQGFnb3JpYy9ub3RpZmllci12MC41LjEvc3JjL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQHRzLWNoZWNrKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL2ZhcicpLkVSZWY8VD59IEVSZWZcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vcHJvbWlzZS1raXQnKS5Qcm9taXNlS2l0PFQ+fSBQcm9taXNlS2l0XG4gKi9cblxuLyoqXG4gKiBEZXByZWNhdGVkLiBVc2UgUHJvbWlzZUtpdCBpbnN0ZWFkLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vcHJvbWlzZS1raXQnKS5Qcm9taXNlUmVjb3JkPFQ+fSBQcm9taXNlUmVjb3JkXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge3tcbiAqICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTogKCkgPT4gQXN5bmNJdGVyYXRvcjxULCBUPlxuICogfX0gQ29uc2lzdGVudEFzeW5jSXRlcmFibGVcbiAqIEFuIEFzeW5jSXRlcmFibGUgdGhhdCByZXR1cm5zIHRoZSBzYW1lIHR5cGUgYXMgaXQgeWllbGRzLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEl0ZXJhdGlvbk9ic2VydmVyPFQ+XG4gKiBBIHZhbGlkIHNlcXVlbmNlIG9mIGNhbGxzIHRvIHRoZSBtZXRob2RzIG9mIGFuIGBJdGVyYXRpb25PYnNlcnZlcmBcbiAqIHJlcHJlc2VudHMgYW4gaXRlcmF0aW9uLiBBIHZhbGlkIHNlcXVlbmNlIGNvbnNpc3RzIG9mIGFueSBudW1iZXIgb2YgY2FsbHNcbiAqIHRvIGB1cGRhdGVTdGF0ZWAgd2l0aCB0aGUgc3VjY2Vzc2l2ZSBub24tZmluYWwgdmFsdWVzLCBmb2xsb3dlZCBieSBhXG4gKiBmaW5hbCBjYWxsIHRvIGVpdGhlciBgZmluaXNoYCB3aXRoIGEgc3VjY2Vzc2Z1bCBgY29tcGxldGlvbmAgdmFsdWVcbiAqIG9yIGBmYWlsYCB3aXRoIHRoZSBhbGxlZ2VkIGByZWFzb25gIGZvciBmYWlsdXJlLiBBZnRlciBhdCBtb3N0IG9uZVxuICogdGVybWluYXRpbmcgY2FsbHMsIG5vIGZ1cnRoZXIgY2FsbHMgdG8gdGhlc2UgbWV0aG9kcyBhcmUgdmFsaWQgYW5kIG11c3QgYmVcbiAqIHJlamVjdGVkLlxuICogQHByb3BlcnR5IHsobm9uRmluYWxWYWx1ZTogVCkgPT4gdm9pZH0gdXBkYXRlU3RhdGVcbiAqIEBwcm9wZXJ0eSB7KGNvbXBsZXRpb246IFQpID0+IHZvaWR9IGZpbmlzaFxuICogQHByb3BlcnR5IHsocmVhc29uOiBhbnkpID0+IHZvaWR9IGZhaWxcbiAqL1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFB1YmxpY2F0aW9uUmVjb3JkXG4gKiBAcHJvcGVydHkge0l0ZXJhdG9yUmVzdWx0PFQ+fSBoZWFkXG4gKiBAcHJvcGVydHkge2JpZ2ludH0gcHVibGlzaENvdW50XG4gKiBAcHJvcGVydHkge1B1YmxpY2F0aW9uTGlzdDxUPn0gdGFpbFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtFUmVmPFB1YmxpY2F0aW9uUmVjb3JkPFQ+Pn0gUHVibGljYXRpb25MaXN0XG4gKiBXaWxsIGJlIHNoYXJlZCBiZXR3ZWVuIG1hY2hpbmVzLCBzbyBpdCBtdXN0IGJlIHNhZmUgdG8gZXhwb3NlLiBCdXQgb3RoZXJcbiAqIHNvZnR3YXJlIHNob3VsZCBjb25zaWRlciBpdCBvcGFxdWUsIG5vdCBkZXBlbmRpbmcgb24gaXRzIGludGVybmFsIHN0cnVjdHVyZS5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTdWJzY3JpYmVyXG4gKiBAcHJvcGVydHkgeyhwdWJsaXNoQ291bnQ/OiBiaWdpbnQpID0+IFB1YmxpY2F0aW9uTGlzdDxUPn0gc3Vic2NyaWJlQWZ0ZXJcbiAqIEludGVybmFsbHkgdXNlZCB0byBnZXQgdGhlIFwiY3VycmVudFwiIFNoYXJhYmxlU3Vic2NyaXB0aW9uSW50ZXJuYWxzXG4gKiBpbiBvcmRlciB0byBtYWtlIGEgc3Vic2NyaXB0aW9uIGl0ZXJhdG9yIHRoYXQgc3RhcnRzIHRoZXJlLlxuICogVGhlIGFuc3dlciBpcyBcImN1cnJlbnRcIiBpbiB0aGF0IGl0IHdhcyBhY2N1cmF0ZSBhdCBzb21lIG1vbWVudCBiZXR3ZWVuXG4gKiB3aGVuIHlvdSBhc2tlZCBhbmQgd2hlbiB5b3UgZ290IHRoZSBhbnN3ZXIuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gUHVibGlzaGVyXG4gKiBBIHZhbGlkIHNlcXVlbmNlIG9mIGNhbGxzIHRvIHRoZSBtZXRob2RzIG9mIGFuIGBJdGVyYXRpb25PYnNlcnZlcmBcbiAqIHJlcHJlc2VudHMgYW4gaXRlcmF0aW9uLiBBIHZhbGlkIHNlcXVlbmNlIGNvbnNpc3RzIG9mIGFueSBudW1iZXIgb2YgY2FsbHNcbiAqIHRvIGBwdWJsaXNoYCB3aXRoIHRoZSBzdWNjZXNzaXZlIG5vbi1maW5hbCB2YWx1ZXMsIGZvbGxvd2VkIGJ5IGFcbiAqIGZpbmFsIGNhbGwgdG8gZWl0aGVyIGBmaW5pc2hgIHdpdGggYSBzdWNjZXNzZnVsIGBjb21wbGV0aW9uYCB2YWx1ZVxuICogb3IgYGZhaWxgIHdpdGggdGhlIGFsbGVnZWQgYHJlYXNvbmAgZm9yIGZhaWx1cmUuIEFmdGVyIGF0IG1vc3Qgb25lXG4gKiB0ZXJtaW5hdGluZyBjYWxscywgbm8gZnVydGhlciBjYWxscyB0byB0aGVzZSBtZXRob2RzIGFyZSB2YWxpZCBhbmQgbXVzdCBiZVxuICogcmVqZWN0ZWQuXG4gKiBAcHJvcGVydHkgeyhub25GaW5hbFZhbHVlOiBUKSA9PiB2b2lkfSBwdWJsaXNoXG4gKiBAcHJvcGVydHkgeyhjb21wbGV0aW9uOiBUKSA9PiB2b2lkfSBmaW5pc2hcbiAqIEBwcm9wZXJ0eSB7KHJlYXNvbjogYW55KSA9PiB2b2lkfSBmYWlsXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge1BhcnRpYWw8UHVibGlzaGVyPFQ+Pn0gUHVibGlzaE9ic2VydmVyXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gUHVibGlzaEtpdDxUPlxuICogQHByb3BlcnR5IHtQdWJsaXNoZXI8VD59IHB1Ymxpc2hlclxuICogQHByb3BlcnR5IHtTdWJzY3JpYmVyPFQ+fSBzdWJzY3JpYmVyXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gU3RvcmVkUHVibGlzaEtpdDxUPlxuICogQHByb3BlcnR5IHtQdWJsaXNoZXI8VD59IHB1Ymxpc2hlclxuICogQHByb3BlcnR5IHtTdG9yZWRTdWJzY3JpYmVyPFQ+fSBzdWJzY3JpYmVyXG4gKi9cblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiBUT0RPOiBOYXJyb3cgdG8gZXhjbHVkZSBudW1iZXIuKi9cbi8qKlxuICogQHR5cGVkZWYge251bWJlciB8IGJpZ2ludCB8IHVuZGVmaW5lZH0gVXBkYXRlQ291bnQgYSB2YWx1ZSB1c2VkIHRvIG1hcmsgdGhlIHBvc2l0aW9uXG4gKiBpbiB0aGUgdXBkYXRlIHN0cmVhbS4gRm9yIHRoZSBsYXN0IHN0YXRlLCB0aGUgdXBkYXRlQ291bnQgaXMgdW5kZWZpbmVkLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFVwZGF0ZVJlY29yZDxUPlxuICogQHByb3BlcnR5IHtUfSB2YWx1ZSBpcyB3aGF0ZXZlciBzdGF0ZSB0aGUgc2VydmljZSB3YW50cyB0byBwdWJsaXNoXG4gKiBAcHJvcGVydHkge1VwZGF0ZUNvdW50fSB1cGRhdGVDb3VudCBpcyBhIHZhbHVlIHRoYXQgaWRlbnRpZmllcyB0aGUgdXBkYXRlXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQGNhbGxiYWNrIEdldFVwZGF0ZVNpbmNlPFQ+IENhbiBiZSBjYWxsZWQgcmVwZWF0ZWRseSB0byBnZXQgYSBzZXF1ZW5jZSBvZlxuICogdXBkYXRlIHJlY29yZHNcbiAqIEBwYXJhbSB7VXBkYXRlQ291bnR9IFt1cGRhdGVDb3VudF0gcmV0dXJuIHVwZGF0ZSByZWNvcmQgYXMgb2YgYW4gdXBkYXRlXG4gKiBjb3VudC4gSWYgdGhlIGB1cGRhdGVDb3VudGAgYXJndW1lbnQgaXMgb21pdHRlZCBvciBkaWZmZXJzIGZyb20gdGhlIGN1cnJlbnRcbiAqIHVwZGF0ZSBjb3VudCwgcmV0dXJuIHRoZSBjdXJyZW50IHJlY29yZC5cbiAqIE90aGVyd2lzZSwgYWZ0ZXIgdGhlIG5leHQgc3RhdGUgY2hhbmdlLCB0aGUgcHJvbWlzZSB3aWxsIHJlc29sdmUgdG8gdGhlXG4gKiB0aGVuLWN1cnJlbnQgdmFsdWUgb2YgdGhlIHJlY29yZC5cbiAqIEByZXR1cm5zIHtQcm9taXNlPFVwZGF0ZVJlY29yZDxUPj59IHJlc29sdmVzIHRvIHRoZSBjb3JyZXNwb25kaW5nXG4gKiB1cGRhdGVcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBCYXNlTm90aWZpZXI8VD4gYW4gb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8gZ2V0IHRoZVxuICogY3VycmVudCBzdGF0ZSBvciB1cGRhdGVzXG4gKiBAcHJvcGVydHkge0dldFVwZGF0ZVNpbmNlPFQ+fSBnZXRVcGRhdGVTaW5jZSByZXR1cm4gdXBkYXRlIHJlY29yZCBhcyBvZiBhblxuICogdXBkYXRlIGNvdW50LlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtCYXNlTm90aWZpZXI8VD59IE5vdGlmaWVySW50ZXJuYWxzIFdpbGwgYmUgc2hhcmVkIGJldHdlZW4gbWFjaGluZXMsXG4gKiBzbyBpdCBtdXN0IGJlIHNhZmUgdG8gZXhwb3NlLiBCdXQgb3RoZXIgc29mdHdhcmUgc2hvdWxkIGF2b2lkIGRlcGVuZGluZyBvblxuICogaXRzIGludGVybmFsIHN0cnVjdHVyZS5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7QmFzZU5vdGlmaWVyPFQ+ICZcbiAqICAgQ29uc2lzdGVudEFzeW5jSXRlcmFibGU8VD4gJlxuICogICBTaGFyYWJsZU5vdGlmaWVyPFQ+XG4gKiB9IE5vdGlmaWVyPFQ+IGFuIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvIGdldCB0aGUgY3VycmVudCBzdGF0ZSBvciB1cGRhdGVzXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gU2hhcmFibGVOb3RpZmllclxuICogQHByb3BlcnR5IHsoKSA9PiBFUmVmPE5vdGlmaWVySW50ZXJuYWxzPFQ+Pn0gZ2V0U2hhcmFibGVOb3RpZmllckludGVybmFsc1xuICogVXNlZCB0byByZXBsaWNhdGUgdGhlIG11bHRpY2FzdCB2YWx1ZXMgYXQgb3RoZXIgc2l0ZXMuIFRvIG1hbnVhbGx5IGNyZWF0ZSBhXG4gKiBsb2NhbCByZXByZXNlbnRhdGl2ZSBvZiBhIE5vdGlmaWNhdGlvbiwgZG9cbiAqIGBgYGpzXG4gKiBsb2NhbEl0ZXJhYmxlID1cbiAqICAgbWFrZU5vdGlmaWVyKEUocmVtb3RlSXRlcmFibGUpLmdldFNoYXJhYmxlTm90aWZpZXJJbnRlcm5hbHMoKSk7XG4gKiBgYGBcbiAqIFRoZSByZXN1bHRpbmcgYGxvY2FsSXRlcmFibGVgIGFsc28gc3VwcG9ydHMgc3VjaCByZW1vdGUgdXNlLCBhbmRcbiAqIHdpbGwgcmV0dXJuIGFjY2VzcyB0byB0aGUgc2FtZSByZXByZXNlbnRhdGlvbi5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBOb3RpZmllclJlY29yZDxUPiB0aGUgcHJvZHVjZWQgbm90aWZpZXIvdXBkYXRlciBwYWlyXG4gKiBAcHJvcGVydHkge0l0ZXJhdGlvbk9ic2VydmVyPFQ+fSB1cGRhdGVyIHRoZSAoY2xvc2VseS1oZWxkKSBub3RpZmllciBwcm9kdWNlclxuICogQHByb3BlcnR5IHtOb3RpZmllcjxUPn0gbm90aWZpZXIgdGhlICh3aWRlbHktaGVsZCkgbm90aWZpZXIgY29uc3VtZXJcbiAqL1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtDb25zaXN0ZW50QXN5bmNJdGVyYWJsZTxUPiAmXG4gKiAgIFNoYXJhYmxlU3Vic2NyaXB0aW9uPFQ+fSBTdWJzY3JpcHRpb248VD5cbiAqIEEgZm9ybSBvZiBBc3luY0l0ZXJhYmxlIHN1cHBvcnRpbmcgZGlzdHJpYnV0ZWQgYW5kIG11bHRpY2FzdCB1c2FnZS5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTaGFyYWJsZVN1YnNjcmlwdGlvblxuICogQHByb3BlcnR5IHsoKSA9PiBFUmVmPFB1YmxpY2F0aW9uUmVjb3JkPFQ+Pn0gZ2V0U2hhcmFibGVTdWJzY3JpcHRpb25JbnRlcm5hbHNcbiAqIFVzZWQgdG8gcmVwbGljYXRlIHRoZSBtdWx0aWNhc3QgdmFsdWVzIGF0IG90aGVyIHNpdGVzLiBUbyBtYW51YWxseSBjcmVhdGUgYVxuICogbG9jYWwgcmVwcmVzZW50YXRpdmUgb2YgYSBTdWJzY3JpcHRpb24sIGRvXG4gKiBgYGBqc1xuICogbG9jYWxJdGVyYWJsZSA9XG4gKiAgIG1ha2VTdWJzY3JpcHRpb24oRShyZW1vdGVJdGVyYWJsZSkuZ2V0U2hhcmFibGVTdWJzY3JpcHRpb25JbnRlcm5hbHMoKSk7XG4gKiBgYGBcbiAqIFRoZSByZXN1bHRpbmcgYGxvY2FsSXRlcmFibGVgIGFsc28gc3VwcG9ydHMgc3VjaCByZW1vdGUgdXNlLCBhbmRcbiAqIHdpbGwgcmV0dXJuIGFjY2VzcyB0byB0aGUgc2FtZSByZXByZXNlbnRhdGlvbi5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7QXN5bmNJdGVyYXRvcjxULCBUPiAmIENvbnNpc3RlbnRBc3luY0l0ZXJhYmxlPFQ+fSBTdWJzY3JpcHRpb25JdGVyYXRvcjxUPlxuICogYW4gQXN5bmNJdGVyYXRvciBzdXBwb3J0aW5nIGRpc3RyaWJ1dGVkIGFuZCBtdWx0aWNhc3QgdXNhZ2UuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBTdWJzY3JpcHRpb248VD59IHN1YnNjcmliZVxuICogR2V0IGEgbmV3IHN1YnNjcmlwdGlvbiB3aG9zZSBzdGFydGluZyBwb3NpdGlvbiBpcyB0aGlzIGl0ZXJhdG9yJ3MgY3VycmVudFxuICogcG9zaXRpb24uXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gU3Vic2NyaXB0aW9uUmVjb3JkPFQ+XG4gKiBAcHJvcGVydHkge0l0ZXJhdGlvbk9ic2VydmVyPFQ+fSBwdWJsaWNhdGlvblxuICogQHByb3BlcnR5IHtTdWJzY3JpcHRpb248VD59IHN1YnNjcmlwdGlvblxuICovXG5cbi8qKiBAdHlwZWRlZiB7UmV0dXJuVHlwZTx0eXBlb2YgWGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLm1ha2VNYXJzaGFsPn0gTWFyc2hhbGxlciAqL1xuLyoqIEB0eXBlZGVmIHtQaWNrPE1hcnNoYWxsZXIsICd1bnNlcmlhbGl6ZSc+fSBVbnNlcmlhbGl6ZXIgKi9cblxuLyoqXG4gKiBEZWZpbmVkIGJ5IHZzdG9yYWdlU3RvcmVLZXkgaW4gdnN0b3JhZ2UuZ29cbiAqXG4gKiBAdHlwZWRlZiBWU3RvcmFnZUtleVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHN0b3JlTmFtZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHN0b3JlU3Via2V5XG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGF0YVByZWZpeEJ5dGVzXG4gKi9cblxuLyoqXG4gKiBUaGlzIHJlcHJlc2VudHMgYSBub2RlIGluIGFuIElBVkwgdHJlZS5cbiAqXG4gKiBUaGUgYWN0aXZlIGltcGxlbWVudGF0aW9uIGlzIHgvdnN0b3JhZ2UsIGFuIEFnb3JpYyBleHRlbnNpb24gb2YgdGhlIENvc21vcyBTREsuXG4gKlxuICogVnN0b3JhZ2UgaXMgYSBoaWVyYXJjaGljYWwgZXh0ZXJuYWxseS1yZWFjaGFibGUgc3RvcmFnZSBzdHJ1Y3R1cmUgdGhhdFxuICogaWRlbnRpZmllcyBjaGlsZHJlbiBieSByZXN0cmljdGVkIEFTQ0lJIG5hbWUgYW5kIGlzIGFzc29jaWF0ZWQgd2l0aCBhcmJpdHJhcnlcbiAqIHN0cmluZy12YWx1ZWQgZGF0YSBmb3IgZWFjaCBub2RlLCBkZWZhdWx0aW5nIHRvIHRoZSBlbXB0eSBzdHJpbmcuXG4gKlxuICogQHR5cGVkZWYge29iamVjdH0gU3RvcmFnZU5vZGVcbiAqIEBwcm9wZXJ0eSB7KGRhdGE6IHN0cmluZykgPT4gdm9pZH0gc2V0VmFsdWUgcHVibGlzaGVzIHNvbWUgZGF0YVxuICogQHByb3BlcnR5IHsoKSA9PiBFUmVmPFZTdG9yYWdlS2V5Pn0gZ2V0U3RvcmVLZXkgZ2V0IHRoZVxuICogZXh0ZXJuYWxseS1yZWFjaGFibGUgc3RvcmUga2V5IGZvciB0aGlzIHN0b3JhZ2UgaXRlbVxuICogQHByb3BlcnR5IHsoc3ViUGF0aDogc3RyaW5nLCBvcHRpb25zPzoge3NlcXVlbmNlPzogYm9vbGVhbn0pID0+IFN0b3JhZ2VOb2RlfSBtYWtlQ2hpbGROb2RlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTdG9yZWRGYWNldFxuICogQHByb3BlcnR5IHtTdG9yYWdlTm9kZVsnZ2V0U3RvcmVLZXknXX0gZ2V0U3RvcmVLZXkgZ2V0IHRoZSBleHRlcm5hbGx5LXJlYWNoYWJsZSBzdG9yZSBrZXlcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gVW5zZXJpYWxpemVyfSBnZXRVbnNlcmlhbGl6ZXIgZ2V0IHRoZSB1bnNlcmlhbGl6ZXIgZm9yIHRoZSBzdG9yZWQgZGF0YVxuICovXG5cbi8qKlxuICogQGRlcHJlY2F0ZWRcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7U3Vic2NyaXB0aW9uPFQ+ICYgU3RvcmVkRmFjZXR9IFN0b3JlZFN1YnNjcmlwdGlvblxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtTdWJzY3JpYmVyPFQ+ICYgU3RvcmVkRmFjZXR9IFN0b3JlZFN1YnNjcmliZXJcbiAqL1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADW1iozlQEAAJUBAAAgAAAAQGFnb3JpYy9zdG9yZS12MC44LjUvZXhwb3J0ZWQuanN7ImltcG9ydHMiOlsiLi9zcmMvcGF0dGVybnMvaW50ZXJuYWwtdHlwZXMuanMiLCIuL3NyYy90eXBlcy5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3NyYy90eXBlcy5qc1wiLCBbXV0sW1wiLi9zcmMvcGF0dGVybnMvaW50ZXJuYWwtdHlwZXMuanNcIiwgW11dXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAQZq6gYIgAAGCIAACEAAABAYWdvcmljL3N0b3JlLXYwLjguNS9zcmMvaW5kZXguanN7ImltcG9ydHMiOlsiLi9rZXlzL2NoZWNrS2V5LmpzIiwiLi9rZXlzL2NvbXBhcmVLZXlzLmpzIiwiLi9rZXlzL2NvcHlCYWcuanMiLCIuL2tleXMvY29weVNldC5qcyIsIi4va2V5cy9tZXJnZS1iYWctb3BlcmF0b3JzLmpzIiwiLi9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanMiLCIuL2xlZ2FjeS9sZWdhY3lNYXAuanMiLCIuL2xlZ2FjeS9sZWdhY3lXZWFrTWFwLmpzIiwiLi9wYXR0ZXJucy9lbmNvZGVQYXNzYWJsZS5qcyIsIi4vcGF0dGVybnMvaW50ZXJmYWNlLXRvb2xzLmpzIiwiLi9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanMiLCIuL3BhdHRlcm5zL3JhbmtPcmRlci5qcyIsIi4vc3RvcmVzL3NjYWxhck1hcFN0b3JlLmpzIiwiLi9zdG9yZXMvc2NhbGFyU2V0U3RvcmUuanMiLCIuL3N0b3Jlcy9zY2FsYXJXZWFrTWFwU3RvcmUuanMiLCIuL3N0b3Jlcy9zY2FsYXJXZWFrU2V0U3RvcmUuanMiLCIuL3N0b3Jlcy9zdG9yZS11dGlscy5qcyJdLCJleHBvcnRzIjpbIk0iLCJhc3NlcnRLZXkiLCJhc3NlcnRLZXlQYXR0ZXJuIiwiYXNzZXJ0UGF0dGVybiIsImJhZ0NvbXBhcmUiLCJiYWdEaXNqb2ludFN1YnRyYWN0IiwiYmFnSW50ZXJzZWN0aW9uIiwiYmFnSXNTdXBlcmJhZyIsImJhZ1VuaW9uIiwiY29lcmNlVG9CYWdFbnRyaWVzIiwiY29lcmNlVG9FbGVtZW50cyIsImNvbXBhcmVLZXlzIiwiY29tcGFyZVJhbmsiLCJkZWZhdWx0IiwiZGVmZW5kUHJvdG90eXBlIiwiZGVmaW5lSGVhcEZhckNsYXNzIiwiZGVmaW5lSGVhcEZhckNsYXNzS2l0IiwiZWxlbWVudHNDb21wYXJlIiwiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0IiwiZWxlbWVudHNEaXNqb2ludFVuaW9uIiwiZWxlbWVudHNJbnRlcnNlY3Rpb24iLCJlbGVtZW50c0lzRGlzam9pbnQiLCJlbGVtZW50c0lzU3VwZXJzZXQiLCJlbGVtZW50c1VuaW9uIiwiZml0IiwiZ2V0Q29weUJhZ0VudHJpZXMiLCJnZXRDb3B5TWFwRW50cmllcyIsImdldENvcHlTZXRLZXlzIiwiZ2V0UmFua0NvdmVyIiwiaW5pdEVtcHR5IiwiaXNFbmNvZGVkUmVtb3RhYmxlIiwiaXNLZXkiLCJpc1BhdHRlcm4iLCJpc1JhbmtTb3J0ZWQiLCJrZXlFUSIsImtleUdUIiwia2V5R1RFIiwia2V5TFQiLCJrZXlMVEUiLCJtYWtlQ29weUJhZyIsIm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzIiwibWFrZUNvcHlNYXAiLCJtYWtlQ29weVNldCIsIm1ha2VEZWNvZGVQYXNzYWJsZSIsIm1ha2VFbmNvZGVQYXNzYWJsZSIsIm1ha2VIZWFwRmFySW5zdGFuY2UiLCJtYWtlTGVnYWN5TWFwIiwibWFrZUxlZ2FjeVdlYWtNYXAiLCJtYWtlU2NhbGFyTWFwIiwibWFrZVNjYWxhck1hcFN0b3JlIiwibWFrZVNjYWxhclNldFN0b3JlIiwibWFrZVNjYWxhcldlYWtNYXAiLCJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIiwibWFrZVNjYWxhcldlYWtTZXRTdG9yZSIsIm1ha2VTdG9yZSIsIm1ha2VXZWFrU3RvcmUiLCJtYXRjaGVzIiwicHJvdmlkZUxhenkiLCJzZXRDb21wYXJlIiwic2V0RGlzam9pbnRTdWJ0cmFjdCIsInNldERpc2pvaW50VW5pb24iLCJzZXRJbnRlcnNlY3Rpb24iLCJzZXRJc0Rpc2pvaW50Iiwic2V0SXNTdXBlcnNldCIsInNldFVuaW9uIiwic29ydEJ5UmFuayIsInplcm9QYWQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL2tleXMvY2hlY2tLZXkuanNcIiwgW1tcImlzS2V5XCIsIFskaOKAjV9saXZlW1wiaXNLZXlcIl1dXSxbXCJhc3NlcnRLZXlcIiwgWyRo4oCNX2xpdmVbXCJhc3NlcnRLZXlcIl1dXSxbXCJtYWtlQ29weVNldFwiLCBbJGjigI1fbGl2ZVtcIm1ha2VDb3B5U2V0XCJdXV0sW1wiZ2V0Q29weVNldEtleXNcIiwgWyRo4oCNX2xpdmVbXCJnZXRDb3B5U2V0S2V5c1wiXV1dLFtcIm1ha2VDb3B5QmFnXCIsIFskaOKAjV9saXZlW1wibWFrZUNvcHlCYWdcIl1dXSxbXCJtYWtlQ29weUJhZ0Zyb21FbGVtZW50c1wiLCBbJGjigI1fbGl2ZVtcIm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzXCJdXV0sW1wiZ2V0Q29weUJhZ0VudHJpZXNcIiwgWyRo4oCNX2xpdmVbXCJnZXRDb3B5QmFnRW50cmllc1wiXV1dLFtcIm1ha2VDb3B5TWFwXCIsIFskaOKAjV9saXZlW1wibWFrZUNvcHlNYXBcIl1dXSxbXCJnZXRDb3B5TWFwRW50cmllc1wiLCBbJGjigI1fbGl2ZVtcImdldENvcHlNYXBFbnRyaWVzXCJdXV1dXSxbXCIuL2tleXMvY29weVNldC5qc1wiLCBbW1wiY29lcmNlVG9FbGVtZW50c1wiLCBbJGjigI1fbGl2ZVtcImNvZXJjZVRvRWxlbWVudHNcIl1dXV1dLFtcIi4va2V5cy9jb3B5QmFnLmpzXCIsIFtbXCJjb2VyY2VUb0JhZ0VudHJpZXNcIiwgWyRo4oCNX2xpdmVbXCJjb2VyY2VUb0JhZ0VudHJpZXNcIl1dXV1dLFtcIi4va2V5cy9jb21wYXJlS2V5cy5qc1wiLCBbW1wiY29tcGFyZUtleXNcIiwgWyRo4oCNX2xpdmVbXCJjb21wYXJlS2V5c1wiXV1dLFtcImtleUxUXCIsIFskaOKAjV9saXZlW1wia2V5TFRcIl1dXSxbXCJrZXlMVEVcIiwgWyRo4oCNX2xpdmVbXCJrZXlMVEVcIl1dXSxbXCJrZXlFUVwiLCBbJGjigI1fbGl2ZVtcImtleUVRXCJdXV0sW1wia2V5R1RFXCIsIFskaOKAjV9saXZlW1wia2V5R1RFXCJdXV0sW1wia2V5R1RcIiwgWyRo4oCNX2xpdmVbXCJrZXlHVFwiXV1dXV0sW1wiLi9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanNcIiwgW1tcImVsZW1lbnRzSXNTdXBlcnNldFwiLCBbJGjigI1fbGl2ZVtcImVsZW1lbnRzSXNTdXBlcnNldFwiXV1dLFtcImVsZW1lbnRzSXNEaXNqb2ludFwiLCBbJGjigI1fbGl2ZVtcImVsZW1lbnRzSXNEaXNqb2ludFwiXV1dLFtcImVsZW1lbnRzQ29tcGFyZVwiLCBbJGjigI1fbGl2ZVtcImVsZW1lbnRzQ29tcGFyZVwiXV1dLFtcImVsZW1lbnRzVW5pb25cIiwgWyRo4oCNX2xpdmVbXCJlbGVtZW50c1VuaW9uXCJdXV0sW1wiZWxlbWVudHNEaXNqb2ludFVuaW9uXCIsIFskaOKAjV9saXZlW1wiZWxlbWVudHNEaXNqb2ludFVuaW9uXCJdXV0sW1wiZWxlbWVudHNJbnRlcnNlY3Rpb25cIiwgWyRo4oCNX2xpdmVbXCJlbGVtZW50c0ludGVyc2VjdGlvblwiXV1dLFtcImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdFwiLCBbJGjigI1fbGl2ZVtcImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdFwiXV1dLFtcInNldElzU3VwZXJzZXRcIiwgWyRo4oCNX2xpdmVbXCJzZXRJc1N1cGVyc2V0XCJdXV0sW1wic2V0SXNEaXNqb2ludFwiLCBbJGjigI1fbGl2ZVtcInNldElzRGlzam9pbnRcIl1dXSxbXCJzZXRDb21wYXJlXCIsIFskaOKAjV9saXZlW1wic2V0Q29tcGFyZVwiXV1dLFtcInNldFVuaW9uXCIsIFskaOKAjV9saXZlW1wic2V0VW5pb25cIl1dXSxbXCJzZXREaXNqb2ludFVuaW9uXCIsIFskaOKAjV9saXZlW1wic2V0RGlzam9pbnRVbmlvblwiXV1dLFtcInNldEludGVyc2VjdGlvblwiLCBbJGjigI1fbGl2ZVtcInNldEludGVyc2VjdGlvblwiXV1dLFtcInNldERpc2pvaW50U3VidHJhY3RcIiwgWyRo4oCNX2xpdmVbXCJzZXREaXNqb2ludFN1YnRyYWN0XCJdXV1dXSxbXCIuL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qc1wiLCBbW1wiYmFnSXNTdXBlcmJhZ1wiLCBbJGjigI1fbGl2ZVtcImJhZ0lzU3VwZXJiYWdcIl1dXSxbXCJiYWdDb21wYXJlXCIsIFskaOKAjV9saXZlW1wiYmFnQ29tcGFyZVwiXV1dLFtcImJhZ1VuaW9uXCIsIFskaOKAjV9saXZlW1wiYmFnVW5pb25cIl1dXSxbXCJiYWdJbnRlcnNlY3Rpb25cIiwgWyRo4oCNX2xpdmVbXCJiYWdJbnRlcnNlY3Rpb25cIl1dXSxbXCJiYWdEaXNqb2ludFN1YnRyYWN0XCIsIFskaOKAjV9saXZlW1wiYmFnRGlzam9pbnRTdWJ0cmFjdFwiXV1dXV0sW1wiLi9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanNcIiwgW1tcIk1cIiwgWyRo4oCNX2xpdmVbXCJNXCJdXV0sW1wiZ2V0UmFua0NvdmVyXCIsIFskaOKAjV9saXZlW1wiZ2V0UmFua0NvdmVyXCJdXV0sW1wiaXNQYXR0ZXJuXCIsIFskaOKAjV9saXZlW1wiaXNQYXR0ZXJuXCJdXV0sW1wiYXNzZXJ0UGF0dGVyblwiLCBbJGjigI1fbGl2ZVtcImFzc2VydFBhdHRlcm5cIl1dXSxbXCJhc3NlcnRLZXlQYXR0ZXJuXCIsIFskaOKAjV9saXZlW1wiYXNzZXJ0S2V5UGF0dGVyblwiXV1dLFtcIm1hdGNoZXNcIiwgWyRo4oCNX2xpdmVbXCJtYXRjaGVzXCJdXV0sW1wiZml0XCIsIFskaOKAjV9saXZlW1wiZml0XCJdXV1dXSxbXCIuL3BhdHRlcm5zL2ludGVyZmFjZS10b29scy5qc1wiLCBbW1wiZGVmZW5kUHJvdG90eXBlXCIsIFskaOKAjV9saXZlW1wiZGVmZW5kUHJvdG90eXBlXCJdXV0sW1wiaW5pdEVtcHR5XCIsIFskaOKAjV9saXZlW1wiaW5pdEVtcHR5XCJdXV0sW1wiZGVmaW5lSGVhcEZhckNsYXNzXCIsIFskaOKAjV9saXZlW1wiZGVmaW5lSGVhcEZhckNsYXNzXCJdXV0sW1wiZGVmaW5lSGVhcEZhckNsYXNzS2l0XCIsIFskaOKAjV9saXZlW1wiZGVmaW5lSGVhcEZhckNsYXNzS2l0XCJdXV0sW1wibWFrZUhlYXBGYXJJbnN0YW5jZVwiLCBbJGjigI1fbGl2ZVtcIm1ha2VIZWFwRmFySW5zdGFuY2VcIl1dXV1dLFtcIi4vcGF0dGVybnMvcmFua09yZGVyLmpzXCIsIFtbXCJjb21wYXJlUmFua1wiLCBbJGjigI1fbGl2ZVtcImNvbXBhcmVSYW5rXCJdXV0sW1wiaXNSYW5rU29ydGVkXCIsIFskaOKAjV9saXZlW1wiaXNSYW5rU29ydGVkXCJdXV0sW1wic29ydEJ5UmFua1wiLCBbJGjigI1fbGl2ZVtcInNvcnRCeVJhbmtcIl1dXV1dLFtcIi4vcGF0dGVybnMvZW5jb2RlUGFzc2FibGUuanNcIiwgW1tcIm1ha2VEZWNvZGVQYXNzYWJsZVwiLCBbJGjigI1fbGl2ZVtcIm1ha2VEZWNvZGVQYXNzYWJsZVwiXV1dLFtcIm1ha2VFbmNvZGVQYXNzYWJsZVwiLCBbJGjigI1fbGl2ZVtcIm1ha2VFbmNvZGVQYXNzYWJsZVwiXV1dLFtcImlzRW5jb2RlZFJlbW90YWJsZVwiLCBbJGjigI1fbGl2ZVtcImlzRW5jb2RlZFJlbW90YWJsZVwiXV1dLFtcInplcm9QYWRcIiwgWyRo4oCNX2xpdmVbXCJ6ZXJvUGFkXCJdXV1dXSxbXCIuL3N0b3Jlcy9zY2FsYXJXZWFrU2V0U3RvcmUuanNcIiwgW1tcIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmVcIiwgWyRo4oCNX2xpdmVbXCJtYWtlU2NhbGFyV2Vha1NldFN0b3JlXCJdXV1dXSxbXCIuL3N0b3Jlcy9zY2FsYXJTZXRTdG9yZS5qc1wiLCBbW1wibWFrZVNjYWxhclNldFN0b3JlXCIsIFskaOKAjV9saXZlW1wibWFrZVNjYWxhclNldFN0b3JlXCJdXV1dXSxbXCIuL3N0b3Jlcy9zY2FsYXJXZWFrTWFwU3RvcmUuanNcIiwgW1tcIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmVcIiwgWyRo4oCNX2xpdmVbXCJtYWtlU2NhbGFyV2Vha01hcFN0b3JlXCJdLCRo4oCNX2xpdmVbXCJtYWtlU2NhbGFyV2Vha01hcFN0b3JlXCJdLCRo4oCNX2xpdmVbXCJtYWtlU2NhbGFyV2Vha01hcFN0b3JlXCJdXV1dXSxbXCIuL3N0b3Jlcy9zY2FsYXJNYXBTdG9yZS5qc1wiLCBbW1wibWFrZVNjYWxhck1hcFN0b3JlXCIsIFskaOKAjV9saXZlW1wibWFrZVNjYWxhck1hcFN0b3JlXCJdLCRo4oCNX2xpdmVbXCJtYWtlU2NhbGFyTWFwU3RvcmVcIl0sJGjigI1fbGl2ZVtcIm1ha2VTY2FsYXJNYXBTdG9yZVwiXV1dXV0sW1wiLi9zdG9yZXMvc3RvcmUtdXRpbHMuanNcIiwgW1tcInByb3ZpZGVMYXp5XCIsIFskaOKAjV9saXZlW1wicHJvdmlkZUxhenlcIl1dXV1dLFtcIi4vbGVnYWN5L2xlZ2FjeU1hcC5qc1wiLCBbW1wibWFrZUxlZ2FjeU1hcFwiLCBbJGjigI1fbGl2ZVtcIm1ha2VMZWdhY3lNYXBcIl0sJGjigI1fbGl2ZVtcIm1ha2VMZWdhY3lNYXBcIl1dXV1dLFtcIi4vbGVnYWN5L2xlZ2FjeVdlYWtNYXAuanNcIiwgW1tcIm1ha2VMZWdhY3lXZWFrTWFwXCIsIFskaOKAjV9saXZlW1wibWFrZUxlZ2FjeVdlYWtNYXBcIl1dXV1dXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnsiaXNLZXkiOlsiaXNLZXkiLGZhbHNlXSwiYXNzZXJ0S2V5IjpbImFzc2VydEtleSIsZmFsc2VdLCJtYWtlQ29weVNldCI6WyJtYWtlQ29weVNldCIsZmFsc2VdLCJnZXRDb3B5U2V0S2V5cyI6WyJnZXRDb3B5U2V0S2V5cyIsZmFsc2VdLCJtYWtlQ29weUJhZyI6WyJtYWtlQ29weUJhZyIsZmFsc2VdLCJtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyI6WyJtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyIsZmFsc2VdLCJnZXRDb3B5QmFnRW50cmllcyI6WyJnZXRDb3B5QmFnRW50cmllcyIsZmFsc2VdLCJtYWtlQ29weU1hcCI6WyJtYWtlQ29weU1hcCIsZmFsc2VdLCJnZXRDb3B5TWFwRW50cmllcyI6WyJnZXRDb3B5TWFwRW50cmllcyIsZmFsc2VdLCJjb2VyY2VUb0VsZW1lbnRzIjpbImNvZXJjZVRvRWxlbWVudHMiLGZhbHNlXSwiY29lcmNlVG9CYWdFbnRyaWVzIjpbImNvZXJjZVRvQmFnRW50cmllcyIsZmFsc2VdLCJjb21wYXJlS2V5cyI6WyJjb21wYXJlS2V5cyIsZmFsc2VdLCJrZXlMVCI6WyJrZXlMVCIsZmFsc2VdLCJrZXlMVEUiOlsia2V5TFRFIixmYWxzZV0sImtleUVRIjpbImtleUVRIixmYWxzZV0sImtleUdURSI6WyJrZXlHVEUiLGZhbHNlXSwia2V5R1QiOlsia2V5R1QiLGZhbHNlXSwiZWxlbWVudHNJc1N1cGVyc2V0IjpbImVsZW1lbnRzSXNTdXBlcnNldCIsZmFsc2VdLCJlbGVtZW50c0lzRGlzam9pbnQiOlsiZWxlbWVudHNJc0Rpc2pvaW50IixmYWxzZV0sImVsZW1lbnRzQ29tcGFyZSI6WyJlbGVtZW50c0NvbXBhcmUiLGZhbHNlXSwiZWxlbWVudHNVbmlvbiI6WyJlbGVtZW50c1VuaW9uIixmYWxzZV0sImVsZW1lbnRzRGlzam9pbnRVbmlvbiI6WyJlbGVtZW50c0Rpc2pvaW50VW5pb24iLGZhbHNlXSwiZWxlbWVudHNJbnRlcnNlY3Rpb24iOlsiZWxlbWVudHNJbnRlcnNlY3Rpb24iLGZhbHNlXSwiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0IjpbImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCIsZmFsc2VdLCJzZXRJc1N1cGVyc2V0IjpbInNldElzU3VwZXJzZXQiLGZhbHNlXSwic2V0SXNEaXNqb2ludCI6WyJzZXRJc0Rpc2pvaW50IixmYWxzZV0sInNldENvbXBhcmUiOlsic2V0Q29tcGFyZSIsZmFsc2VdLCJzZXRVbmlvbiI6WyJzZXRVbmlvbiIsZmFsc2VdLCJzZXREaXNqb2ludFVuaW9uIjpbInNldERpc2pvaW50VW5pb24iLGZhbHNlXSwic2V0SW50ZXJzZWN0aW9uIjpbInNldEludGVyc2VjdGlvbiIsZmFsc2VdLCJzZXREaXNqb2ludFN1YnRyYWN0IjpbInNldERpc2pvaW50U3VidHJhY3QiLGZhbHNlXSwiYmFnSXNTdXBlcmJhZyI6WyJiYWdJc1N1cGVyYmFnIixmYWxzZV0sImJhZ0NvbXBhcmUiOlsiYmFnQ29tcGFyZSIsZmFsc2VdLCJiYWdVbmlvbiI6WyJiYWdVbmlvbiIsZmFsc2VdLCJiYWdJbnRlcnNlY3Rpb24iOlsiYmFnSW50ZXJzZWN0aW9uIixmYWxzZV0sImJhZ0Rpc2pvaW50U3VidHJhY3QiOlsiYmFnRGlzam9pbnRTdWJ0cmFjdCIsZmFsc2VdLCJNIjpbIk0iLGZhbHNlXSwiZ2V0UmFua0NvdmVyIjpbImdldFJhbmtDb3ZlciIsZmFsc2VdLCJpc1BhdHRlcm4iOlsiaXNQYXR0ZXJuIixmYWxzZV0sImFzc2VydFBhdHRlcm4iOlsiYXNzZXJ0UGF0dGVybiIsZmFsc2VdLCJhc3NlcnRLZXlQYXR0ZXJuIjpbImFzc2VydEtleVBhdHRlcm4iLGZhbHNlXSwibWF0Y2hlcyI6WyJtYXRjaGVzIixmYWxzZV0sImZpdCI6WyJmaXQiLGZhbHNlXSwiZGVmZW5kUHJvdG90eXBlIjpbImRlZmVuZFByb3RvdHlwZSIsZmFsc2VdLCJpbml0RW1wdHkiOlsiaW5pdEVtcHR5IixmYWxzZV0sImRlZmluZUhlYXBGYXJDbGFzcyI6WyJkZWZpbmVIZWFwRmFyQ2xhc3MiLGZhbHNlXSwiZGVmaW5lSGVhcEZhckNsYXNzS2l0IjpbImRlZmluZUhlYXBGYXJDbGFzc0tpdCIsZmFsc2VdLCJtYWtlSGVhcEZhckluc3RhbmNlIjpbIm1ha2VIZWFwRmFySW5zdGFuY2UiLGZhbHNlXSwiY29tcGFyZVJhbmsiOlsiY29tcGFyZVJhbmsiLGZhbHNlXSwiaXNSYW5rU29ydGVkIjpbImlzUmFua1NvcnRlZCIsZmFsc2VdLCJzb3J0QnlSYW5rIjpbInNvcnRCeVJhbmsiLGZhbHNlXSwibWFrZURlY29kZVBhc3NhYmxlIjpbIm1ha2VEZWNvZGVQYXNzYWJsZSIsZmFsc2VdLCJtYWtlRW5jb2RlUGFzc2FibGUiOlsibWFrZUVuY29kZVBhc3NhYmxlIixmYWxzZV0sImlzRW5jb2RlZFJlbW90YWJsZSI6WyJpc0VuY29kZWRSZW1vdGFibGUiLGZhbHNlXSwiemVyb1BhZCI6WyJ6ZXJvUGFkIixmYWxzZV0sIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmUiOlsibWFrZVNjYWxhcldlYWtTZXRTdG9yZSIsZmFsc2VdLCJtYWtlU2NhbGFyU2V0U3RvcmUiOlsibWFrZVNjYWxhclNldFN0b3JlIixmYWxzZV0sIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmUiOlsibWFrZVNjYWxhcldlYWtNYXBTdG9yZSIsZmFsc2VdLCJtYWtlU2NhbGFyV2Vha01hcCI6WyJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIixmYWxzZV0sIm1ha2VXZWFrU3RvcmUiOlsibWFrZVNjYWxhcldlYWtNYXBTdG9yZSIsZmFsc2VdLCJtYWtlU2NhbGFyTWFwU3RvcmUiOlsibWFrZVNjYWxhck1hcFN0b3JlIixmYWxzZV0sIm1ha2VTY2FsYXJNYXAiOlsibWFrZVNjYWxhck1hcFN0b3JlIixmYWxzZV0sIm1ha2VTdG9yZSI6WyJtYWtlU2NhbGFyTWFwU3RvcmUiLGZhbHNlXSwicHJvdmlkZUxhenkiOlsicHJvdmlkZUxhenkiLGZhbHNlXSwibWFrZUxlZ2FjeU1hcCI6WyJtYWtlTGVnYWN5TWFwIixmYWxzZV0sImRlZmF1bHQiOlsibWFrZUxlZ2FjeU1hcCIsZmFsc2VdLCJtYWtlTGVnYWN5V2Vha01hcCI6WyJtYWtlTGVnYWN5V2Vha01hcCIsZmFsc2VdfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABIqXdqhUMAAIVDAAApAAAAQGFnb3JpYy9zdG9yZS12MC44LjUvc3JjL2tleXMvY2hlY2tLZXkuanN7ImltcG9ydHMiOlsiLi4vcGF0dGVybnMvcmFua09yZGVyLmpzIiwiLi9jb3B5QmFnLmpzIiwiLi9jb3B5U2V0LmpzIiwiQGFnb3JpYy9hc3NlcnQiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsiYXNzZXJ0Q29weUJhZyIsImFzc2VydENvcHlNYXAiLCJhc3NlcnRDb3B5U2V0IiwiYXNzZXJ0S2V5IiwiYXNzZXJ0UHJpbWl0aXZlS2V5IiwiYXNzZXJ0U2NhbGFyS2V5IiwiY2hlY2tDb3B5QmFnIiwiY2hlY2tDb3B5TWFwIiwiY2hlY2tDb3B5U2V0IiwiY2hlY2tLZXkiLCJjaGVja1NjYWxhcktleSIsImNvcHlNYXBLZXlTZXQiLCJldmVyeUNvcHlCYWdFbnRyeSIsImV2ZXJ5Q29weU1hcEtleSIsImV2ZXJ5Q29weU1hcFZhbHVlIiwiZXZlcnlDb3B5U2V0S2V5IiwiZ2V0Q29weUJhZ0VudHJpZXMiLCJnZXRDb3B5TWFwRW50cmllcyIsImdldENvcHlNYXBLZXlzIiwiZ2V0Q29weU1hcFZhbHVlcyIsImdldENvcHlTZXRLZXlzIiwiaXNDb3B5QmFnIiwiaXNDb3B5TWFwIiwiaXNDb3B5U2V0IiwiaXNLZXkiLCJpc1ByaW1pdGl2ZUtleSIsImlzU2NhbGFyS2V5IiwibWFrZUNvcHlCYWciLCJtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyIsIm1ha2VDb3B5TWFwIiwibWFrZUNvcHlTZXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0Q2hlY2tlcixhc3NlcnRQYXNzYWJsZSxGYXIsZ2V0VGFnLGlzT2JqZWN0LG1ha2VUYWdnZWQscGFzc1N0eWxlT2YsaWRlbnRDaGVja2VyLGNoZWNrRWxlbWVudHMsbWFrZVNldE9mRWxlbWVudHMsY2hlY2tCYWdFbnRyaWVzLG1ha2VCYWdPZkVudHJpZXMsY29tcGFyZUFudGlSYW5rLG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0LHNvcnRCeVJhbms7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0UGFzc2FibGVcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhc3NhYmxlID0gJGjigI1fYSldXSxbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV0sW1wiZ2V0VGFnXCIsIFskaOKAjV9hID0+IChnZXRUYWcgPSAkaOKAjV9hKV1dLFtcImlzT2JqZWN0XCIsIFskaOKAjV9hID0+IChpc09iamVjdCA9ICRo4oCNX2EpXV0sW1wibWFrZVRhZ2dlZFwiLCBbJGjigI1fYSA9PiAobWFrZVRhZ2dlZCA9ICRo4oCNX2EpXV0sW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvYXNzZXJ0XCIsIFtbXCJpZGVudENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGlkZW50Q2hlY2tlciA9ICRo4oCNX2EpXV1dXSxbXCIuL2NvcHlTZXQuanNcIiwgW1tcImNoZWNrRWxlbWVudHNcIiwgWyRo4oCNX2EgPT4gKGNoZWNrRWxlbWVudHMgPSAkaOKAjV9hKV1dLFtcIm1ha2VTZXRPZkVsZW1lbnRzXCIsIFskaOKAjV9hID0+IChtYWtlU2V0T2ZFbGVtZW50cyA9ICRo4oCNX2EpXV1dXSxbXCIuL2NvcHlCYWcuanNcIiwgW1tcImNoZWNrQmFnRW50cmllc1wiLCBbJGjigI1fYSA9PiAoY2hlY2tCYWdFbnRyaWVzID0gJGjigI1fYSldXSxbXCJtYWtlQmFnT2ZFbnRyaWVzXCIsIFskaOKAjV9hID0+IChtYWtlQmFnT2ZFbnRyaWVzID0gJGjigI1fYSldXV1dLFtcIi4uL3BhdHRlcm5zL3JhbmtPcmRlci5qc1wiLCBbW1wiY29tcGFyZUFudGlSYW5rXCIsIFskaOKAjV9hID0+IChjb21wYXJlQW50aVJhbmsgPSAkaOKAjV9hKV1dLFtcIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0XCIsIFskaOKAjV9hID0+IChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCA9ICRo4oCNX2EpXV0sW1wic29ydEJ5UmFua1wiLCBbJGjigI1fYSA9PiAoc29ydEJ5UmFuayA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdHtkZXRhaWxzOlgscXVvdGU6cX09YXNzZXJ0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vIFByaW1pdGl2ZSBhbmQgU2NhbGFyIGtleXMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHZhbFxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrUHJpbWl0aXZlS2V5PSh2YWwsY2hlY2spPT57XG5pZihpc09iamVjdCh2YWwpKXtcbnJldHVybihcbmNoZWNrIT09aWRlbnRDaGVja2VyJiZcbmNoZWNrKGZhbHNlLFggYEEgJHtxKHR5cGVvZiB2YWwpfSBjYW5ub3QgYmUgYSBwcmltaXRpdmU6ICR7dmFsfWApKTtcblxuIH1cbi8qIFRPRE8gVGhlcmUgaXMgbm90IHlldCBhIGNoZWNrUGFzc2FibGUsIGJ1dCBwZXJoYXBzIHRoZXJlIHNob3VsZCBiZS4qL1xuLyogSWYgdGhhdCBoYXBwZW5zLCB3ZSBzaG91bGQgY2FsbCBpdCBoZXJlIGluc3RlYWQuKi9cbmFzc2VydFBhc3NhYmxlKHZhbCk7XG5yZXR1cm4gdHJ1ZTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHZhbFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBpc1ByaW1pdGl2ZUtleT0odmFsKT0+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+e1xuY29uc3QgY2hlY2tJdD0oY2hpbGQpPT5jaGVja0tleShjaGlsZCxjaGVjayk7XG5cbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZih2YWwpO1xuc3dpdGNoKHBhc3NTdHlsZSl7XG5jYXNlJ2NvcHlSZWNvcmQnOntcbi8qIEEgY29weVJlY29yZCBpcyBhIGtleSBpZmYgYWxsIGl0cyBjaGlsZHJlbiBhcmUga2V5cyovXG5yZXR1cm4gT2JqZWN0LnZhbHVlcyh2YWwpLmV2ZXJ5KGNoZWNrSXQpO1xuIH1cbmNhc2UnY29weUFycmF5Jzp7XG4vKiBBIGNvcHlBcnJheSBpcyBhIGtleSBpZmYgYWxsIGl0cyBjaGlsZHJlbiBhcmUga2V5cyovXG5yZXR1cm4gdmFsLmV2ZXJ5KGNoZWNrSXQpO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5jb25zdCB0YWc9Z2V0VGFnKHZhbCk7XG5zd2l0Y2godGFnKXtcbmNhc2UnY29weVNldCc6e1xucmV0dXJuIGNoZWNrQ29weVNldCh2YWwsY2hlY2spO1xuIH1cbmNhc2UnY29weUJhZyc6e1xucmV0dXJuIGNoZWNrQ29weUJhZyh2YWwsY2hlY2spO1xuIH1cbmNhc2UnY29weU1hcCc6e1xucmV0dXJuKFxuY2hlY2tDb3B5TWFwKHZhbCxjaGVjaykmJlxuLyogRm9yIGEgY29weU1hcCB0byBiZSBhIGtleSwgYWxsIGl0cyBrZXlzIGFuZCB2YWx1ZXMgbXVzdCovXG4vKiBiZSBrZXlzLiBLZXlzIGFscmVhZHkgY2hlY2tlZCBieSBgY2hlY2tDb3B5TWFwYCBzaW5jZSovXG4vKiB0aGF0J3MgYSBjb3B5TWFwIHJlcXVpcmVtZW50IGluIGdlbmVyYWwuKi9cbmV2ZXJ5Q29weU1hcFZhbHVlKHZhbCxjaGVja0l0KSk7XG5cbiB9XG5kZWZhdWx0OntcbnJldHVybihcbmNoZWNrIT09aWRlbnRDaGVja2VyJiZcbmNoZWNrKGZhbHNlLFggYEEgcGFzc2FibGUgdGFnZ2VkICR7cSh0YWcpfSBpcyBub3QgYSBrZXk6ICR7dmFsfWApKTtcblxuIH19XG5cbiB9XG5jYXNlJ3JlbW90YWJsZSc6e1xuLyogQWxsIHJlbW90YWJsZXMgYXJlIGtleXMuKi9cbnJldHVybiB0cnVlO1xuIH1cbmNhc2UnZXJyb3InOlxuY2FzZSdwcm9taXNlJzp7XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgQSAke3EocGFzc1N0eWxlKX0gY2Fubm90IGJlIGEga2V5YCk7XG4gfVxuZGVmYXVsdDp7XG4vKiBVbmV4cGVjdGVkIHRhZ3MgYXJlIGp1c3Qgbm9uLWtleXMsIGJ1dCBhbiB1bmV4cGVjdGVkIHBhc3NTdHlsZSovXG4vKiBpcyBhbHdheXMgYW4gZXJyb3IuKi9cbmFzc2VydC5mYWlsKFggYHVuZXhwZWN0ZWQgcGFzc1N0eWxlICR7cShwYXNzU3R5bGUpfTogJHt2YWx9YCk7XG4gfX1cblxuIH07XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNQcmltaXRpdmVLZXkiOlsiaXNQcmltaXRpdmVLZXkiXSwiYXNzZXJ0UHJpbWl0aXZlS2V5IjpbImFzc2VydFByaW1pdGl2ZUtleSJdLCJjaGVja1NjYWxhcktleSI6WyJjaGVja1NjYWxhcktleSJdLCJpc1NjYWxhcktleSI6WyJpc1NjYWxhcktleSJdLCJhc3NlcnRTY2FsYXJLZXkiOlsiYXNzZXJ0U2NhbGFyS2V5Il0sImNoZWNrS2V5IjpbImNoZWNrS2V5Il0sImlzS2V5IjpbImlzS2V5Il0sImFzc2VydEtleSI6WyJhc3NlcnRLZXkiXSwiY2hlY2tDb3B5U2V0IjpbImNoZWNrQ29weVNldCJdLCJpc0NvcHlTZXQiOlsiaXNDb3B5U2V0Il0sImFzc2VydENvcHlTZXQiOlsiYXNzZXJ0Q29weVNldCJdLCJnZXRDb3B5U2V0S2V5cyI6WyJnZXRDb3B5U2V0S2V5cyJdLCJldmVyeUNvcHlTZXRLZXkiOlsiZXZlcnlDb3B5U2V0S2V5Il0sIm1ha2VDb3B5U2V0IjpbIm1ha2VDb3B5U2V0Il0sImNoZWNrQ29weUJhZyI6WyJjaGVja0NvcHlCYWciXSwiaXNDb3B5QmFnIjpbImlzQ29weUJhZyJdLCJhc3NlcnRDb3B5QmFnIjpbImFzc2VydENvcHlCYWciXSwiZ2V0Q29weUJhZ0VudHJpZXMiOlsiZ2V0Q29weUJhZ0VudHJpZXMiXSwiZXZlcnlDb3B5QmFnRW50cnkiOlsiZXZlcnlDb3B5QmFnRW50cnkiXSwibWFrZUNvcHlCYWciOlsibWFrZUNvcHlCYWciXSwibWFrZUNvcHlCYWdGcm9tRWxlbWVudHMiOlsibWFrZUNvcHlCYWdGcm9tRWxlbWVudHMiXSwiY2hlY2tDb3B5TWFwIjpbImNoZWNrQ29weU1hcCJdLCJpc0NvcHlNYXAiOlsiaXNDb3B5TWFwIl0sImFzc2VydENvcHlNYXAiOlsiYXNzZXJ0Q29weU1hcCJdLCJnZXRDb3B5TWFwS2V5cyI6WyJnZXRDb3B5TWFwS2V5cyJdLCJnZXRDb3B5TWFwVmFsdWVzIjpbImdldENvcHlNYXBWYWx1ZXMiXSwiZ2V0Q29weU1hcEVudHJpZXMiOlsiZ2V0Q29weU1hcEVudHJpZXMiXSwiZXZlcnlDb3B5TWFwS2V5IjpbImV2ZXJ5Q29weU1hcEtleSJdLCJldmVyeUNvcHlNYXBWYWx1ZSI6WyJldmVyeUNvcHlNYXBWYWx1ZSJdLCJjb3B5TWFwS2V5U2V0IjpbImNvcHlNYXBLZXlTZXQiXSwibWFrZUNvcHlNYXAiOlsibWFrZUNvcHlNYXAiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAquMonQkaAAAJGgAALAAAAEBhZ29yaWMvc3RvcmUtdjAuOC41L3NyYy9rZXlzL2NvbXBhcmVLZXlzLmpzeyJpbXBvcnRzIjpbIi4uL3BhdHRlcm5zL3JhbmtPcmRlci5qcyIsIi4vY2hlY2tLZXkuanMiLCIuL21lcmdlLWJhZy1vcGVyYXRvcnMuanMiLCIuL21lcmdlLXNldC1vcGVyYXRvcnMuanMiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsiY29tcGFyZUtleXMiLCJrZXlFUSIsImtleUdUIiwia2V5R1RFIiwia2V5TFQiLCJrZXlMVEUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgcGFzc1N0eWxlT2YsZ2V0VGFnLGNvbXBhcmVSYW5rLHJlY29yZFBhcnRzLGFzc2VydEtleSxiYWdDb21wYXJlLHNldENvbXBhcmU7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXSxbXCJnZXRUYWdcIiwgWyRo4oCNX2EgPT4gKGdldFRhZyA9ICRo4oCNX2EpXV1dXSxbXCIuLi9wYXR0ZXJucy9yYW5rT3JkZXIuanNcIiwgW1tcImNvbXBhcmVSYW5rXCIsIFskaOKAjV9hID0+IChjb21wYXJlUmFuayA9ICRo4oCNX2EpXV0sW1wicmVjb3JkUGFydHNcIiwgWyRo4oCNX2EgPT4gKHJlY29yZFBhcnRzID0gJGjigI1fYSldXV1dLFtcIi4vY2hlY2tLZXkuanNcIiwgW1tcImFzc2VydEtleVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0S2V5ID0gJGjigI1fYSldXV1dLFtcIi4vbWVyZ2UtYmFnLW9wZXJhdG9ycy5qc1wiLCBbW1wiYmFnQ29tcGFyZVwiLCBbJGjigI1fYSA9PiAoYmFnQ29tcGFyZSA9ICRo4oCNX2EpXV1dXSxbXCIuL21lcmdlLXNldC1vcGVyYXRvcnMuanNcIiwgW1tcInNldENvbXBhcmVcIiwgWyRo4oCNX2EgPT4gKHNldENvbXBhcmUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cbmNvbnN0e2RldGFpbHM6WCxxdW90ZTpxfT1hc3NlcnQ7XG5cbi8qKiBAdHlwZSB7S2V5Q29tcGFyZX0gKi9cbmNvbnN0ICAgICAgICBjb21wYXJlS2V5cz0obGVmdCxyaWdodCk9PntcbmFzc2VydEtleShsZWZ0KTtcbmFzc2VydEtleShyaWdodCk7XG5jb25zdCBsZWZ0U3R5bGU9cGFzc1N0eWxlT2YobGVmdCk7XG5jb25zdCByaWdodFN0eWxlPXBhc3NTdHlsZU9mKHJpZ2h0KTtcbmlmKGxlZnRTdHlsZSE9PXJpZ2h0U3R5bGUpe1xuLyogRGlmZmVyZW50IHBhc3NTdHlsZXMgYXJlIGluY29tbWVuc3VyYXRlKi9cbnJldHVybiBOYU47XG4gfVxuc3dpdGNoKGxlZnRTdHlsZSl7XG5jYXNlJ3VuZGVmaW5lZCc6XG5jYXNlJ251bGwnOlxuY2FzZSdib29sZWFuJzpcbmNhc2UnYmlnaW50JzpcbmNhc2Unc3RyaW5nJzpcbmNhc2Unc3ltYm9sJzp7XG4vKiBmb3IgdGhlc2UsIGtleXMgY29tcGFyZSB0aGUgc2FtZSBhcyByYW5rKi9cbnJldHVybiBjb21wYXJlUmFuayhsZWZ0LHJpZ2h0KTtcbiB9XG5jYXNlJ251bWJlcic6e1xuY29uc3QgcmFua0NvbXA9Y29tcGFyZVJhbmsobGVmdCxyaWdodCk7XG5pZihyYW5rQ29tcD09PTApe1xucmV0dXJuIDA7XG4gfVxuaWYoTnVtYmVyLmlzTmFOKGxlZnQpfHxOdW1iZXIuaXNOYU4ocmlnaHQpKXtcbi8qIE5hTiBpcyBlcXVhbCB0byBpdHNlbGYsIGJ1dCBpbmNvbW1lbnN1cmF0ZSB3aXRoIGV2ZXJ5dGhpbmcgZWxzZSovXG5hc3NlcnQoIU51bWJlci5pc05hTihsZWZ0KXx8IU51bWJlci5pc05hTihyaWdodCkpO1xucmV0dXJuIE5hTjtcbiB9XG4vKiBBbW9uZyBub24tTmFOIG51bWJlcnMsIGtleSBvcmRlciBpcyB0aGUgc2FtZSBhcyByYW5rIG9yZGVyLiBOb3RlIHRoYXQqL1xuLyogaW4gYm90aCBvcmRlcnMsIGAtMGAgaXMgaW4gdGhlIHNhbWUgZXF1aXZhbGVuY2UgY2xhc3MgYXMgYDBgLiovXG5yZXR1cm4gcmFua0NvbXA7XG4gfVxuY2FzZSdyZW1vdGFibGUnOntcbmlmKGxlZnQ9PT1yaWdodCl7XG5yZXR1cm4gMDtcbiB9XG4vKiBJZiB0d28gcmVtb3RhYmxlcyBhcmUgbm90IGlkZW50aWNhbCwgdGhlbiBhcyBrZXlzIHRoZXkgYXJlKi9cbi8qIGluY29tbWVuc3VyYXRlLiovXG5yZXR1cm4gTmFOO1xuIH1cbmNhc2UnY29weUFycmF5Jzp7XG4vKiBMZXhpY29ncmFwaGljIGJ5IGtleSBvcmRlci4gUmFuayBvcmRlciBvZiBhcnJheXMgaXMgbGV4aWNvZ3JhcGhpYyBieSovXG4vKiByYW5rIG9yZGVyLiovXG4vKiBCZWNhdXNlIHRoZSBpbnZhcmlhbnRzIGFib3ZlIGFwcGx5IHRvIHRoZSBlbGVtZW50cyBvZiB0aGUgYXJyYXksKi9cbi8qIHRoZXkgYXBwbHkgdG8gdGhlIGFycmF5IGFzIGEgd2hvbGUuKi9cbmNvbnN0IGxlbj1NYXRoLm1pbihsZWZ0Lmxlbmd0aCxyaWdodC5sZW5ndGgpO1xuZm9yKGxldCBpPTA7aTxsZW47aSs9MSl7XG5jb25zdCByZXN1bHQ9Y29tcGFyZUtleXMobGVmdFtpXSxyaWdodFtpXSk7XG5pZihyZXN1bHQhPT0wKXtcbnJldHVybiByZXN1bHQ7XG4gfVxuIH1cbi8qIElmIGFsbCBtYXRjaGluZyBlbGVtZW50cyBhcmUga2V5RVEsIHRoZW4gYWNjb3JkaW5nIHRvIHRoZWlyIGxlbmd0aHMuKi9cbi8qIFRodXMsIGlmIGFycmF5IFggaXMgYSBwcmVmaXggb2YgYXJyYXkgWSwgdGhlbiBYIGlzIHNtYWxsZXIgdGhhbiBZLiovXG5yZXR1cm4gY29tcGFyZVJhbmsobGVmdC5sZW5ndGgscmlnaHQubGVuZ3RoKTtcbiB9XG5jYXNlJ2NvcHlSZWNvcmQnOntcbi8qIFBhcmV0byBwYXJ0aWFsIG9yZGVyIGNvbXBhcmlzb24uKi9cbmNvbnN0W2xlZnROYW1lcyxsZWZ0VmFsdWVzXT1yZWNvcmRQYXJ0cyhsZWZ0KTtcbmNvbnN0W3JpZ2h0TmFtZXMscmlnaHRWYWx1ZXNdPXJlY29yZFBhcnRzKHJpZ2h0KTtcblxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbmlmKCFrZXlFUShsZWZ0TmFtZXMscmlnaHROYW1lcykpe1xuLyogSWYgdGhleSBkbyBub3QgaGF2ZSBleGFjdGx5IHRoZSBzYW1lIHByb3BlcnRpZXMsKi9cbi8qIHRoZXkgYXJlIGluY29tbWVuc3VyYXRlLiovXG4vKiBOb3RlIHRoYXQgcmFuayBzb3J0aW5nIG9mIGNvcHlSZWNvcmRzIGdyb3VwcyBhbGwgY29weVJlY29yZHMgd2l0aCovXG4vKiB0aGUgc2FtZSBrZXlzIHRvZ2V0aGVyLCBlbmFibGluZyByYW5nZSBzZWFyY2hpbmcgb3ZlciBjb3B5UmVjb3JkcyovXG4vKiB0byBhdm9pZCBtb3JlIGlycmVsZXZhbnQgb25lcy4qL1xucmV0dXJuIE5hTjtcbiB9XG4vKiBQcmVzdW1lIHRoYXQgYm90aCBjb3B5UmVjb3JkcyBoYXZlIHRoZSBzYW1lIGtleSBvcmRlciovXG4vKiB1bnRpbCBlbmNvdW50ZXJpbmcgYSBwcm9wZXJ0eSBkaXNwcm92aW5nIHRoYXQgaHlwb3RoZXNpcy4qL1xubGV0IHJlc3VsdD0wO1xuZm9yKGxldCBpPTA7aTxsZWZ0VmFsdWVzLmxlbmd0aDtpKz0xKXtcbmNvbnN0IGNvbXA9Y29tcGFyZUtleXMobGVmdFZhbHVlc1tpXSxyaWdodFZhbHVlc1tpXSk7XG5pZihOdW1iZXIuaXNOYU4oY29tcCkpe1xucmV0dXJuIE5hTjtcbiB9XG5pZihyZXN1bHQhPT1jb21wJiZjb21wIT09MCl7XG5pZihyZXN1bHQ9PT0wKXtcbnJlc3VsdD1jb21wO1xuIH1lbHNle1xuYXNzZXJ0KFxucmVzdWx0PT09LTEmJmNvbXA9PT0xfHxyZXN1bHQ9PT0xJiZjb21wPT09LTEpO1xuXG5yZXR1cm4gTmFOO1xuIH1cbiB9XG4gfVxuLyogSWYgY29weVJlY29yZCBYIGlzIHNtYWxsZXIgdGhhbiBjb3B5UmVjb3JkIFksIHRoZW4gdGhleSBtdXN0IGhhdmUgdGhlKi9cbi8qIHNhbWUgcHJvcGVydHkgbmFtZXMgYW5kIGV2ZXJ5IHZhbHVlIGluIFggbXVzdCBiZSBzbWFsbGVyIG9yIGVxdWFsIHRvKi9cbi8qIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIGluIFkgKHdpdGggYXQgbGVhc3Qgb25lIHZhbHVlIHNtYWxsZXIpLiovXG4vKiBUaGUgcmFuayBvcmRlciBvZiBYIGFuZCBZIGlzIGJhc2VkIG9uIGxleGljb2dyYXBoaWMgcmFuayBvcmRlciBvZiovXG4vKiB0aGVpciB2YWx1ZXMsIGFzIG9yZ2FuaXplZCBieSByZXZlcnNlIGxleGljb2dyYXBoaWMgb3JkZXIgb2YgdGhlaXIqL1xuLyogcHJvcGVydHkgbmFtZXMuKi9cbi8qIFRodXMgaWYgY29tcGFyZUtleXMoWCxZKSA8IDAgdGhlbiBjb21wYXJlUmFuayhYLFkpIDwgMC4qL1xucmV0dXJuIHJlc3VsdDtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xuY29uc3QgbGVmdFRhZz1nZXRUYWcobGVmdCk7XG5jb25zdCByaWdodFRhZz1nZXRUYWcocmlnaHQpO1xuaWYobGVmdFRhZyE9PXJpZ2h0VGFnKXtcbi8qIGRpZmZlcmVudCB0YWdzIGFyZSBpbmNvbW1lbnN1cmF0ZSovXG5yZXR1cm4gTmFOO1xuIH1cbnN3aXRjaChsZWZ0VGFnKXtcbmNhc2UnY29weVNldCc6e1xuLyogY29weVNldCBYIGlzIHNtYWxsZXIgdGhhbiBjb3B5U2V0IFkgd2hlbiBldmVyeSBlbGVtZW50IG9mIFgqL1xuLyogaXMga2V5RVEgdG8gc29tZSBlbGVtZW50IG9mIFkgYW5kIHNvbWUgZWxlbWVudCBvZiBZIGlzKi9cbi8qIG5vdCBrZXlFUSB0byBhbnkgZWxlbWVudCBvZiBYLiovXG5yZXR1cm4gc2V0Q29tcGFyZShsZWZ0LHJpZ2h0KTtcbiB9XG5jYXNlJ2NvcHlCYWcnOntcbi8qIGNvcHlCYWcgWCBpcyBzbWFsbGVyIHRoYW4gY29weUJhZyBZIHdoZW4gZXZlcnkgZWxlbWVudCBvZiBYKi9cbi8qIG9jY3VycyBubyBtb3JlIHRoYW4gdGhlIGtleUVRIGVsZW1lbnQgb2YgWSwgYW5kIHNvbWUgZWxlbWVudCovXG4vKiBvZiBZIG9jY3VycyBtb3JlIHRoYW4gc29tZSBlbGVtZW50IG9mIFgsIHdoZXJlIGJlaW5nIGFic2VudCovXG4vKiBmcm9tIFggY291bnRzIGFzIG9jY3VycmluZyB6ZXJvIHRpbWVzLiovXG5yZXR1cm4gYmFnQ29tcGFyZShsZWZ0LHJpZ2h0KTtcbiB9XG5jYXNlJ2NvcHlNYXAnOntcbi8qIFR3byBjb3B5TWFwcyB0aGF0IGhhdmUgZGlmZmVyZW50IGtleXMgKGFjY29yZGluZyB0byBrZXlFUSkgYXJlKi9cbi8qIGluY29tbWVuc3VyYXRlLiBUaGUgcmVwcmVzZW50YXRpb24gb2YgY29weU1hcHMgaW5jbHVkZXMgdGhlIGtleXMqL1xuLyogZmlyc3QsIGluIHRoZSBzYW1lIHJldmVyc2UgcmFuayBvcmRlciB1c2VkIGJ5IHNldHMuIFRodXMsIGFsbCovXG4vKiBjb3B5TWFwcyB3aXRoIGtleXMgb2YgdGhlIHNhbWUgcmFuayAod2hpY2ggaXMqL1xuLyogbGVzcyBwcmVjaXNlISkgd2lsbCBiZSBncm91cGVkIHRvZ2V0aGVyIHdoZW4gY29weU1hcHMgYXJlIHNvcnRlZCovXG4vKiBieSByYW5rLCBtaW5pbWl6aW5nIHRoZSBudW1iZXIgb2YgbWlzc2VzIHdoZW4gcmFuZ2Ugc2VhcmNoaW5nLiovXG4vKiovXG4vKiBBbW9uZyBjb3B5TWFwcyB3aXRoIHRoZSBzYW1lIGtleXMgKGFjY29yZGluZyB0byBrZXlFUSksIHRoZXkqL1xuLyogY29tcGFyZSBieSBhIGNvcnJlc3BvbmRpbmcgY29tcGFyaXNvbiBvZiB0aGVpciB2YWx1ZXMuIFRodXMsIGFzKi9cbi8qIHdpdGggcmVjb3JkcywgZm9yIHR3byBjb3B5TWFwcyBYIGFuZCBZLCBpZiBgY29tcGFyZUtleXMoWCxZKSA8Ki9cbi8qIDBgIHRoZW4sIGJlY2F1c2UgdGhlc2UgdmFsdWVzIG9iZXkgdGhlIGFib3ZlIGludmFyaWFudHMsIG5vbmUgb2YqL1xuLyogdGhlIHZhbHVlcyBpbiBYIGhhdmUgYSBsYXRlciByYW5rIHRoYW4gdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUqL1xuLyogb2YgWS4gVGh1cywgYGNvbXBhcmVSYW5rKFgsWSkgPD0gMGAuIFRPRE8gaW1wbGVtZW50Ki9cbmFzc2VydC5mYWlsKFxuWCBgTWFwIGNvbXBhcmlzb24gbm90IHlldCBpbXBsZW1lbnRlZDogJHtsZWZ0fSB2cyAke3JpZ2h0fWApO1xuXG4gfVxuZGVmYXVsdDp7XG5hc3NlcnQuZmFpbChYIGB1bmV4cGVjdGVkIHRhZyAke3EobGVmdFRhZyl9OiAke2xlZnR9YCk7XG4gfX1cblxuIH1cbmRlZmF1bHQ6e1xuYXNzZXJ0LmZhaWwoWCBgdW5leHBlY3RlZCBwYXNzU3R5bGUgJHtxKGxlZnRTdHlsZSl9OiAke2xlZnR9YCk7XG4gfX1cblxuIH07JGjigI1fb25jZS5jb21wYXJlS2V5cyhjb21wYXJlS2V5cyk7XG5oYXJkZW4oY29tcGFyZUtleXMpO1xuXG5jb25zdCAgICAgICAga2V5TFQ9KGxlZnQscmlnaHQpPT5jb21wYXJlS2V5cyhsZWZ0LHJpZ2h0KTwwOyRo4oCNX29uY2Uua2V5TFQoa2V5TFQpO1xuaGFyZGVuKGtleUxUKTtcblxuY29uc3QgICAgICAgIGtleUxURT0obGVmdCxyaWdodCk9PmNvbXBhcmVLZXlzKGxlZnQscmlnaHQpPD0wOyRo4oCNX29uY2Uua2V5TFRFKGtleUxURSk7XG5oYXJkZW4oa2V5TFRFKTtcblxuY29uc3QgICAgICAgIGtleUVRPShsZWZ0LHJpZ2h0KT0+Y29tcGFyZUtleXMobGVmdCxyaWdodCk9PT0wOyRo4oCNX29uY2Uua2V5RVEoa2V5RVEpO1xuaGFyZGVuKGtleUVRKTtcblxuY29uc3QgICAgICAgIGtleUdURT0obGVmdCxyaWdodCk9PmNvbXBhcmVLZXlzKGxlZnQscmlnaHQpPj0wOyRo4oCNX29uY2Uua2V5R1RFKGtleUdURSk7XG5oYXJkZW4oa2V5R1RFKTtcblxuY29uc3QgICAgICAgIGtleUdUPShsZWZ0LHJpZ2h0KT0+Y29tcGFyZUtleXMobGVmdCxyaWdodCk+MDskaOKAjV9vbmNlLmtleUdUKGtleUdUKTtcbmhhcmRlbihrZXlHVCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiY29tcGFyZUtleXMiOlsiY29tcGFyZUtleXMiXSwia2V5TFQiOlsia2V5TFQiXSwia2V5TFRFIjpbImtleUxURSJdLCJrZXlFUSI6WyJrZXlFUSJdLCJrZXlHVEUiOlsia2V5R1RFIl0sImtleUdUIjpbImtleUdUIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMkbmzoSEwAAEhMAACgAAABAYWdvcmljL3N0b3JlLXYwLjguNS9zcmMva2V5cy9jb3B5QmFnLmpzeyJpbXBvcnRzIjpbIi4uL3BhdHRlcm5zL3JhbmtPcmRlci5qcyIsIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJhc3NlcnRCYWdFbnRyaWVzIiwiYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzIiwiY2hlY2tCYWdFbnRyaWVzIiwiY29lcmNlVG9CYWdFbnRyaWVzIiwibWFrZUJhZ09mRW50cmllcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnRDaGVja2VyLG1ha2VUYWdnZWQscGFzc1N0eWxlT2YsY29tcGFyZUFudGlSYW5rLGlzUmFua1NvcnRlZCxtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCxzb3J0QnlSYW5rOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dLFtcIm1ha2VUYWdnZWRcIiwgWyRo4oCNX2EgPT4gKG1ha2VUYWdnZWQgPSAkaOKAjV9hKV1dLFtcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV1dXSxbXCIuLi9wYXR0ZXJucy9yYW5rT3JkZXIuanNcIiwgW1tcImNvbXBhcmVBbnRpUmFua1wiLCBbJGjigI1fYSA9PiAoY29tcGFyZUFudGlSYW5rID0gJGjigI1fYSldXSxbXCJpc1JhbmtTb3J0ZWRcIiwgWyRo4oCNX2EgPT4gKGlzUmFua1NvcnRlZCA9ICRo4oCNX2EpXV0sW1wibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0ID0gJGjigI1fYSldXSxbXCJzb3J0QnlSYW5rXCIsIFskaOKAjV9hID0+IChzb3J0QnlSYW5rID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG4vKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG5jb25zdHtkZXRhaWxzOlh9PWFzc2VydDtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtbVCxiaWdpbnRdW119IGJhZ0VudHJpZXNcbiAqIEBwYXJhbSB7RnVsbENvbXBhcmUgfCB1bmRlZmluZWR9IGZ1bGxDb21wYXJlIElmIHByb3ZpZGVkIGFuZCBgYmFnRW50cmllc2AgaXMgYWxyZWFkeVxuICoga25vd24gdG8gYmUgc29ydGVkIGJ5IHRoaXMgYGZ1bGxDb21wYXJlYCwgdGhlbiB3ZSBzaG91bGQgZ2V0IGEgbWVtbyBoaXRcbiAqIHJhdGhlciB0aGFuIGEgcmVzb3J0aW5nLiBIb3dldmVyLCBjdXJyZW50bHksIHdlIHN0aWxsIGVudW1lcmF0ZSB0aGUgZW50aXJlXG4gKiBhcnJheSBlYWNoIHRpbWUuXG4gKlxuICogVE9ETzogSWYgZG9pbmcgdGhpcyByZWR1bnRhbnRseSB0dXJucyBvdXQgdG8gYmUgZXhwZW5zaXZlLCB3ZVxuICogY291bGQgbWVtb2l6ZSB0aGlzIG5vLWR1cGxpY2F0ZS1rZXlzIGZpbmRpbmcgYXMgd2VsbCwgaW5kZXBlbmRlbnRcbiAqIG9mIHRoZSBgZnVsbE9yZGVyYCB1c2UgdG8gcmVhY2ggdGhpcyBmaW5kaW5nLlxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrTm9EdXBsaWNhdGVLZXlzPShiYWdFbnRyaWVzLGZ1bGxDb21wYXJlLGNoZWNrKT0+e1xuLyogVGhpcyBmdWxsT3JkZXIgY29udGFpbnMgaGlzdG9yeSBkZXBlbmRlbnQgc3RhdGUuIEl0IGlzIHNwZWNpZmljKi9cbi8qIHRvIHRoaXMgb25lIGNhbGwgYW5kIGRvZXMgbm90IHN1cnZpdmUgaXQuKi9cbi8qIFRPRE8gT25jZSBhbGwgb3VyIHRvb2xpbmcgaXMgcmVhZHkgZm9yIGAmJj1gLCB0aGUgZm9sbG93aW5nKi9cbi8qIGxpbmUgc2hvdWxkIGJlIHJld3JpdHRlbiB1c2luZyBpdC4qL1xuZnVsbENvbXBhcmU9ZnVsbENvbXBhcmV8fG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KCkuYW50aUNvbXBhcmF0b3I7XG5cbi8qIFNpbmNlIHRoZSBrZXkgaXMgbW9yZSBzaWduaWZpY2FudCB0aGFuIHRoZSB2YWx1ZSAodGhlIGNvdW50KSwqL1xuLyogc29ydGluZyBieSBmdWxsT3JkZXIgaXMgZ3VhcmFudGVlZCB0byBtYWtlIGR1cGxpY2F0ZSBrZXlzKi9cbi8qIGFkamFjZW50IGluZGVwZW5kZW50IG9mIHRoZWlyIGNvdW50cy4qL1xuYmFnRW50cmllcz1zb3J0QnlSYW5rKGJhZ0VudHJpZXMsZnVsbENvbXBhcmUpO1xuY29uc3R7bGVuZ3RofT1iYWdFbnRyaWVzO1xuZm9yKGxldCBpPTE7aTxsZW5ndGg7aSs9MSl7XG5jb25zdCBrMD1iYWdFbnRyaWVzW2ktMV1bMF07XG5jb25zdCBrMT1iYWdFbnRyaWVzW2ldWzBdO1xuaWYoZnVsbENvbXBhcmUoazAsazEpPT09MCl7XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgdmFsdWUgaGFzIGR1cGxpY2F0ZSBrZXlzOiAke2swfWApO1xuIH1cbiB9XG5yZXR1cm4gdHJ1ZTtcbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1tULGJpZ2ludF1bXX0gYmFnRW50cmllc1xuICogQHBhcmFtIHtGdWxsQ29tcGFyZT19IGZ1bGxDb21wYXJlXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuY29uc3QgICAgICAgIGFzc2VydE5vRHVwbGljYXRlS2V5cz0oYmFnRW50cmllcyxmdWxsQ29tcGFyZT11bmRlZmluZWQpPT57XG5jaGVja05vRHVwbGljYXRlS2V5cyhiYWdFbnRyaWVzLGZ1bGxDb21wYXJlLGFzc2VydENoZWNrZXIpO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtbUGFzc2FibGUsYmlnaW50XVtdfSBiYWdFbnRyaWVzXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqLyRo4oCNX29uY2UuYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzKGFzc2VydE5vRHVwbGljYXRlS2V5cyk7XG5jb25zdCAgICAgICAgY2hlY2tCYWdFbnRyaWVzPShiYWdFbnRyaWVzLGNoZWNrKT0+e1xuaWYocGFzc1N0eWxlT2YoYmFnRW50cmllcykhPT0nY29weUFycmF5Jyl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYFRoZSBlbnRyaWVzIG9mIGEgY29weUJhZyBtdXN0IGJlIGEgY29weUFycmF5OiAke2JhZ0VudHJpZXN9YCk7XG5cbiB9XG5pZighaXNSYW5rU29ydGVkKGJhZ0VudHJpZXMsY29tcGFyZUFudGlSYW5rKSl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYFRoZSBlbnRyaWVzIG9mIGEgY29weUJhZyBtdXN0IGJlIHNvcnRlZCBpbiByZXZlcnNlIHJhbmsgb3JkZXI6ICR7YmFnRW50cmllc31gKTtcblxuIH1cbmZvcihjb25zdCBlbnRyeSBvZiBiYWdFbnRyaWVzKXtcbmlmKFxucGFzc1N0eWxlT2YoZW50cnkpIT09J2NvcHlBcnJheSd8fFxuZW50cnkubGVuZ3RoIT09Mnx8XG50eXBlb2YgZW50cnlbMV0hPT0nYmlnaW50JylcbntcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgRWFjaCBlbnRyeSBvZiBhIGNvcHlCYWcgbXVzdCBiZSBwYWlyIG9mIGEga2V5IGFuZCBhIGJpZ2ludCByZXByZXNlbnRpbmcgYSBjb3VudDogJHtlbnRyeX1gKTtcblxuIH1cbmlmKGVudHJ5WzFdPDEpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBFYWNoIGVudHJ5IG9mIGEgY29weUJhZyBtdXN0IGhhdmUgYSBwb3NpdGl2ZSBjb3VudDogJHtlbnRyeX1gKTtcblxuIH1cbiB9XG5yZXR1cm4gY2hlY2tOb0R1cGxpY2F0ZUtleXMoYmFnRW50cmllcyx1bmRlZmluZWQsY2hlY2spO1xuIH07JGjigI1fb25jZS5jaGVja0JhZ0VudHJpZXMoY2hlY2tCYWdFbnRyaWVzKTtcbmhhcmRlbihjaGVja0JhZ0VudHJpZXMpO1xuXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1yZXR1cm5zLWNoZWNrIC0tIGRvZXNuJ3QgdW5kZXJzdGFuZCBhc3NlcnRzKi9cbi8qKlxuICogQHBhcmFtIHtbUGFzc2FibGUsYmlnaW50XVtdfSBiYWdFbnRyaWVzXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBiYWdFbnRyaWVzIGlzIFtQYXNzYWJsZSxiaWdpbnRdW119XG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRCYWdFbnRyaWVzPShiYWdFbnRyaWVzKT0+e1xuY2hlY2tCYWdFbnRyaWVzKGJhZ0VudHJpZXMsYXNzZXJ0Q2hlY2tlcik7XG4gfTskaOKAjV9vbmNlLmFzc2VydEJhZ0VudHJpZXMoYXNzZXJ0QmFnRW50cmllcyk7XG5oYXJkZW4oYXNzZXJ0QmFnRW50cmllcyk7XG5cbmNvbnN0ICAgICAgICBjb2VyY2VUb0JhZ0VudHJpZXM9KGJhZ0VudHJpZXNMaXN0KT0+e1xuY29uc3QgYmFnRW50cmllcz1zb3J0QnlSYW5rKGJhZ0VudHJpZXNMaXN0LGNvbXBhcmVBbnRpUmFuayk7XG5hc3NlcnRCYWdFbnRyaWVzKGJhZ0VudHJpZXMpO1xucmV0dXJuIGJhZ0VudHJpZXM7XG4gfTskaOKAjV9vbmNlLmNvZXJjZVRvQmFnRW50cmllcyhjb2VyY2VUb0JhZ0VudHJpZXMpO1xuaGFyZGVuKGNvZXJjZVRvQmFnRW50cmllcyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7SXRlcmFibGU8W0ssIGJpZ2ludF0+fSBiYWdFbnRyeUl0ZXJcbiAqIEByZXR1cm5zIHtDb3B5QmFnPEs+fVxuICovXG5jb25zdCAgICAgICAgbWFrZUJhZ09mRW50cmllcz0oYmFnRW50cnlJdGVyKT0+XG5tYWtlVGFnZ2VkKCdjb3B5QmFnJyxjb2VyY2VUb0JhZ0VudHJpZXMoYmFnRW50cnlJdGVyKSk7JGjigI1fb25jZS5tYWtlQmFnT2ZFbnRyaWVzKG1ha2VCYWdPZkVudHJpZXMpO1xuaGFyZGVuKG1ha2VCYWdPZkVudHJpZXMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFzc2VydE5vRHVwbGljYXRlS2V5cyI6WyJhc3NlcnROb0R1cGxpY2F0ZUtleXMiXSwiY2hlY2tCYWdFbnRyaWVzIjpbImNoZWNrQmFnRW50cmllcyJdLCJhc3NlcnRCYWdFbnRyaWVzIjpbImFzc2VydEJhZ0VudHJpZXMiXSwiY29lcmNlVG9CYWdFbnRyaWVzIjpbImNvZXJjZVRvQmFnRW50cmllcyJdLCJtYWtlQmFnT2ZFbnRyaWVzIjpbIm1ha2VCYWdPZkVudHJpZXMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAH8WoYosPAACLDwAAKAAAAEBhZ29yaWMvc3RvcmUtdjAuOC41L3NyYy9rZXlzL2NvcHlTZXQuanN7ImltcG9ydHMiOlsiLi4vcGF0dGVybnMvcmFua09yZGVyLmpzIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbImFzc2VydEVsZW1lbnRzIiwiYXNzZXJ0Tm9EdXBsaWNhdGVzIiwiY2hlY2tFbGVtZW50cyIsImNvZXJjZVRvRWxlbWVudHMiLCJtYWtlU2V0T2ZFbGVtZW50cyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnRDaGVja2VyLG1ha2VUYWdnZWQscGFzc1N0eWxlT2YsY29tcGFyZUFudGlSYW5rLGlzUmFua1NvcnRlZCxtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCxzb3J0QnlSYW5rOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dLFtcIm1ha2VUYWdnZWRcIiwgWyRo4oCNX2EgPT4gKG1ha2VUYWdnZWQgPSAkaOKAjV9hKV1dLFtcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV1dXSxbXCIuLi9wYXR0ZXJucy9yYW5rT3JkZXIuanNcIiwgW1tcImNvbXBhcmVBbnRpUmFua1wiLCBbJGjigI1fYSA9PiAoY29tcGFyZUFudGlSYW5rID0gJGjigI1fYSldXSxbXCJpc1JhbmtTb3J0ZWRcIiwgWyRo4oCNX2EgPT4gKGlzUmFua1NvcnRlZCA9ICRo4oCNX2EpXV0sW1wibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0ID0gJGjigI1fYSldXSxbXCJzb3J0QnlSYW5rXCIsIFskaOKAjV9hID0+IChzb3J0QnlSYW5rID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG4vKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG5jb25zdHtkZXRhaWxzOlh9PWFzc2VydDtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUW119IGVsZW1lbnRzXG4gKiBAcGFyYW0ge0Z1bGxDb21wYXJlIHwgdW5kZWZpbmVkfSBmdWxsQ29tcGFyZSBJZiBwcm92aWRlZCBhbmQgYGVsZW1lbnRzYCBpcyBhbHJlYWR5IGtub3duXG4gKiB0byBiZSBzb3J0ZWQgYnkgdGhpcyBgZnVsbENvbXBhcmVgLCB0aGVuIHdlIHNob3VsZCBnZXQgYSBtZW1vIGhpdCByYXRoZXJcbiAqIHRoYW4gYSByZXNvcnRpbmcuIEhvd2V2ZXIsIGN1cnJlbnRseSwgd2Ugc3RpbGwgZW51bWVyYXRlIHRoZSBlbnRpcmUgYXJyYXlcbiAqIGVhY2ggdGltZS5cbiAqXG4gKiBUT0RPOiBJZiBkb2luZyB0aGlzIHJlZHVudGFudGx5IHR1cm5zIG91dCB0byBiZSBleHBlbnNpdmUsIHdlXG4gKiBjb3VsZCBtZW1vaXplIHRoaXMgbm8tZHVwbGljYXRlIGZpbmRpbmcgYXMgd2VsbCwgaW5kZXBlbmRlbnRcbiAqIG9mIHRoZSBgZnVsbE9yZGVyYCB1c2UgdG8gcmVhY2ggdGhpcyBmaW5kaW5nLlxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrTm9EdXBsaWNhdGVzPShlbGVtZW50cyxmdWxsQ29tcGFyZSxjaGVjayk9Pntcbi8qIFRoaXMgZnVsbE9yZGVyIGNvbnRhaW5zIGhpc3RvcnkgZGVwZW5kZW50IHN0YXRlLiBJdCBpcyBzcGVjaWZpYyovXG4vKiB0byB0aGlzIG9uZSBjYWxsIGFuZCBkb2VzIG5vdCBzdXJ2aXZlIGl0LiovXG4vKiBUT0RPIE9uY2UgYWxsIG91ciB0b29saW5nIGlzIHJlYWR5IGZvciBgJiY9YCwgdGhlIGZvbGxvd2luZyovXG4vKiBsaW5lIHNob3VsZCBiZSByZXdyaXR0ZW4gdXNpbmcgaXQuKi9cbmZ1bGxDb21wYXJlPWZ1bGxDb21wYXJlfHxtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCgpLmFudGlDb21wYXJhdG9yO1xuXG5lbGVtZW50cz1zb3J0QnlSYW5rKGVsZW1lbnRzLGZ1bGxDb21wYXJlKTtcbmNvbnN0e2xlbmd0aH09ZWxlbWVudHM7XG5mb3IobGV0IGk9MTtpPGxlbmd0aDtpKz0xKXtcbmNvbnN0IGswPWVsZW1lbnRzW2ktMV07XG5jb25zdCBrMT1lbGVtZW50c1tpXTtcbmlmKGZ1bGxDb21wYXJlKGswLGsxKT09PTApe1xucmV0dXJuIGNoZWNrKGZhbHNlLFggYHZhbHVlIGhhcyBkdXBsaWNhdGVzOiAke2swfWApO1xuIH1cbiB9XG5yZXR1cm4gdHJ1ZTtcbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1RbXX0gZWxlbWVudHNcbiAqIEBwYXJhbSB7RnVsbENvbXBhcmU9fSBmdWxsQ29tcGFyZVxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnROb0R1cGxpY2F0ZXM9KGVsZW1lbnRzLGZ1bGxDb21wYXJlPXVuZGVmaW5lZCk9PntcbmNoZWNrTm9EdXBsaWNhdGVzKGVsZW1lbnRzLGZ1bGxDb21wYXJlLGFzc2VydENoZWNrZXIpO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBlbGVtZW50c1xuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi8kaOKAjV9vbmNlLmFzc2VydE5vRHVwbGljYXRlcyhhc3NlcnROb0R1cGxpY2F0ZXMpO1xuY29uc3QgICAgICAgIGNoZWNrRWxlbWVudHM9KGVsZW1lbnRzLGNoZWNrKT0+e1xuaWYocGFzc1N0eWxlT2YoZWxlbWVudHMpIT09J2NvcHlBcnJheScpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBUaGUga2V5cyBvZiBhIGNvcHlTZXQgb3IgY29weU1hcCBtdXN0IGJlIGEgY29weUFycmF5OiAke2VsZW1lbnRzfWApO1xuXG4gfVxuaWYoIWlzUmFua1NvcnRlZChlbGVtZW50cyxjb21wYXJlQW50aVJhbmspKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgVGhlIGtleXMgb2YgYSBjb3B5U2V0IG9yIGNvcHlNYXAgbXVzdCBiZSBzb3J0ZWQgaW4gcmV2ZXJzZSByYW5rIG9yZGVyOiAke2VsZW1lbnRzfWApO1xuXG4gfVxucmV0dXJuIGNoZWNrTm9EdXBsaWNhdGVzKGVsZW1lbnRzLHVuZGVmaW5lZCxjaGVjayk7XG4gfTskaOKAjV9vbmNlLmNoZWNrRWxlbWVudHMoY2hlY2tFbGVtZW50cyk7XG5oYXJkZW4oY2hlY2tFbGVtZW50cyk7XG5cbmNvbnN0ICAgICAgICBhc3NlcnRFbGVtZW50cz0oZWxlbWVudHMpPT57XG5jaGVja0VsZW1lbnRzKGVsZW1lbnRzLGFzc2VydENoZWNrZXIpO1xuIH07JGjigI1fb25jZS5hc3NlcnRFbGVtZW50cyhhc3NlcnRFbGVtZW50cyk7XG5oYXJkZW4oYXNzZXJ0RWxlbWVudHMpO1xuXG5jb25zdCAgICAgICAgY29lcmNlVG9FbGVtZW50cz0oZWxlbWVudHNMaXN0KT0+e1xuY29uc3QgZWxlbWVudHM9c29ydEJ5UmFuayhlbGVtZW50c0xpc3QsY29tcGFyZUFudGlSYW5rKTtcbmFzc2VydEVsZW1lbnRzKGVsZW1lbnRzKTtcbnJldHVybiBlbGVtZW50cztcbiB9OyRo4oCNX29uY2UuY29lcmNlVG9FbGVtZW50cyhjb2VyY2VUb0VsZW1lbnRzKTtcbmhhcmRlbihjb2VyY2VUb0VsZW1lbnRzKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtJdGVyYWJsZTxLPn0gZWxlbWVudEl0ZXJcbiAqIEByZXR1cm5zIHtDb3B5U2V0PEs+fVxuICovXG5jb25zdCAgICAgICAgbWFrZVNldE9mRWxlbWVudHM9KGVsZW1lbnRJdGVyKT0+XG5tYWtlVGFnZ2VkKCdjb3B5U2V0Jyxjb2VyY2VUb0VsZW1lbnRzKGVsZW1lbnRJdGVyKSk7JGjigI1fb25jZS5tYWtlU2V0T2ZFbGVtZW50cyhtYWtlU2V0T2ZFbGVtZW50cyk7XG5oYXJkZW4obWFrZVNldE9mRWxlbWVudHMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFzc2VydE5vRHVwbGljYXRlcyI6WyJhc3NlcnROb0R1cGxpY2F0ZXMiXSwiY2hlY2tFbGVtZW50cyI6WyJjaGVja0VsZW1lbnRzIl0sImFzc2VydEVsZW1lbnRzIjpbImFzc2VydEVsZW1lbnRzIl0sImNvZXJjZVRvRWxlbWVudHMiOlsiY29lcmNlVG9FbGVtZW50cyJdLCJtYWtlU2V0T2ZFbGVtZW50cyI6WyJtYWtlU2V0T2ZFbGVtZW50cyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAnQiD2PSIAAD0iAAA0AAAAQGFnb3JpYy9zdG9yZS12MC44LjUvc3JjL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qc3siaW1wb3J0cyI6WyIuLi9wYXR0ZXJucy9yYW5rT3JkZXIuanMiLCIuL2NvcHlCYWcuanMiXSwiZXhwb3J0cyI6WyJiYWdDb21wYXJlIiwiYmFnRGlzam9pbnRTdWJ0cmFjdCIsImJhZ0ludGVyc2VjdGlvbiIsImJhZ0lzRGlzam9pbnQiLCJiYWdJc1N1cGVyYmFnIiwiYmFnVW5pb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0UmFua1NvcnRlZCxjb21wYXJlQW50aVJhbmssbWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQsc29ydEJ5UmFuayxhc3NlcnROb0R1cGxpY2F0ZUtleXMsbWFrZUJhZ09mRW50cmllczskaOKAjV9pbXBvcnRzKFtbXCIuLi9wYXR0ZXJucy9yYW5rT3JkZXIuanNcIiwgW1tcImFzc2VydFJhbmtTb3J0ZWRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFJhbmtTb3J0ZWQgPSAkaOKAjV9hKV1dLFtcImNvbXBhcmVBbnRpUmFua1wiLCBbJGjigI1fYSA9PiAoY29tcGFyZUFudGlSYW5rID0gJGjigI1fYSldXSxbXCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdFwiLCBbJGjigI1fYSA9PiAobWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQgPSAkaOKAjV9hKV1dLFtcInNvcnRCeVJhbmtcIiwgWyRo4oCNX2EgPT4gKHNvcnRCeVJhbmsgPSAkaOKAjV9hKV1dXV0sW1wiLi9jb3B5QmFnLmpzXCIsIFtbXCJhc3NlcnROb0R1cGxpY2F0ZUtleXNcIiwgWyRo4oCNX2EgPT4gKGFzc2VydE5vRHVwbGljYXRlS2V5cyA9ICRo4oCNX2EpXV0sW1wibWFrZUJhZ09mRW50cmllc1wiLCBbJGjigI1fYSA9PiAobWFrZUJhZ09mRW50cmllcyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuY29uc3R7ZGV0YWlsczpYLHF1b3RlOnF9PWFzc2VydDtcblxuLyogQmFzZWQgb24gbWVyZ2Utc2V0LW9wZXJhdG9ycy5qcywgYnV0IGFsdGVyZWQgZm9yIHRoZSBiYWcgcmVwcmVzZW50YXRpb24uKi9cbi8qIFRPRE8gc2hhcmUgbW9yZSBjb2RlIHdpdGggbWVyZ2Utc2V0LW9wZXJhdG9ycy5qcywgcmF0aGVyIHRoYW4qL1xuLyogZHVwbGljYXRpbmcgd2l0aCBjaGFuZ2VzLiovXG5cbi8qKlxuICogQXNzZXJ0cyB0aGF0IGBiYWdFbnRyaWVzYCBpcyBhbHJlYWR5IHJhbmsgc29ydGVkIGJ5IGByYW5rQ29tcGFyZWAsIHdoZXJlXG4gKiB0aGVyZVxuICogbWF5IGJlIGNvbnRpZ3VvdXMgcmVnaW9ucyBvZiBiYWdFbnRyaWVzIHdob3NlIGtleXMgYXJlIHRpZWQgZm9yIHRoZSBzYW1lXG4gKiByYW5rLlxuICogUmV0dXJucyBhbiBpdGVyYWJsZSB0aGF0IHdpbGwgZW51bWVyYXRlIGFsbCB0aGUgYmFnRW50cmllcyBpbiBvcmRlclxuICogYWNjb3JkaW5nIHRvIGBmdWxsT3JkZXJgLCB3aGljaCBzaG91bGQgZGlmZmVyIGZyb20gYHJhbmtPcmRlcmAgb25seVxuICogYnkgYmVpbmcgbW9yZSBwcmVjaXNlLlxuICpcbiAqIFRoaXMgc2hvdWxkIGJlIGVxdWl2YWxlbnQgdG8gcmVzb3J0aW5nIHRoZSBlbnRpcmUgYGJhZ0VudHJpZXNgIGFycmF5XG4gKiBhY2NvcmRpbmdcbiAqIHRvIGBmdWxsT3JkZXJgLiBIb3dldmVyLCBpdCBvcHRpbWl6ZXMgZm9yIHRoZSBjYXNlIHdoZXJlIHRoZXNlIGNvbnRpZ3VvdXNcbiAqIHJ1bnMgdGhhdCBuZWVkIHRvIGJlIHJlc29ydGVkIGFyZSBlaXRoZXIgYWJzZW50IG9yIHNtYWxsLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1tULGJpZ2ludF1bXX0gYmFnRW50cmllc1xuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gcmFua0NvbXBhcmVcbiAqIEBwYXJhbSB7RnVsbENvbXBhcmV9IGZ1bGxDb21wYXJlXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8W1QsYmlnaW50XT59XG4gKi9cbmNvbnN0IGJhZ1dpbmRvd1Jlc29ydD0oYmFnRW50cmllcyxyYW5rQ29tcGFyZSxmdWxsQ29tcGFyZSk9PntcbmFzc2VydFJhbmtTb3J0ZWQoYmFnRW50cmllcyxyYW5rQ29tcGFyZSk7XG5jb25zdHtsZW5ndGh9PWJhZ0VudHJpZXM7XG5sZXQgaT0wO1xubGV0IG9wdElubmVySXRlcmF0b3I7XG5yZXR1cm4gaGFyZGVuKHtcbltTeW1ib2wuaXRlcmF0b3JdOigpPT5cbmhhcmRlbih7XG5uZXh0OigpPT57XG5pZihvcHRJbm5lckl0ZXJhdG9yKXtcbmNvbnN0IHJlc3VsdD1vcHRJbm5lckl0ZXJhdG9yLm5leHQoKTtcbmlmKHJlc3VsdC5kb25lKXtcbm9wdElubmVySXRlcmF0b3I9dW5kZWZpbmVkO1xuLyogZmFsbCB0aHJvdWdoKi9cbiB9ZWxzZXtcbnJldHVybiByZXN1bHQ7XG4gfVxuIH1cbmlmKGk8bGVuZ3RoKXtcbmNvbnN0IGVudHJ5PWJhZ0VudHJpZXNbaV07XG5sZXQgaj1pKzE7XG53aGlsZShcbmo8bGVuZ3RoJiZcbnJhbmtDb21wYXJlKGVudHJ5WzBdLGJhZ0VudHJpZXNbal1bMF0pPT09MClcbntcbmorPTE7XG4gfVxuaWYoaj09PWkrMSl7XG5pPWo7XG5yZXR1cm4gaGFyZGVuKHtkb25lOmZhbHNlLHZhbHVlOmVudHJ5fSk7XG4gfVxuY29uc3Qgc2ltaWxhclJ1bj1iYWdFbnRyaWVzLnNsaWNlKGksaik7XG5pPWo7XG5jb25zdCByZXNvcnRlZD1zb3J0QnlSYW5rKHNpbWlsYXJSdW4sZnVsbENvbXBhcmUpO1xuLyogUHJvdmlkaW5nIHRoZSBzYW1lIGBmdWxsQ29tcGFyZWAgc2hvdWxkIGNhdXNlIGEgbWVtbyBoaXQqL1xuLyogd2l0aGluIGBhc3NlcnROb0R1cGxpY2F0ZXNgIGVuYWJsaW5nIGl0IHRvIGF2b2lkIGEqL1xuLyogcmVkdW5kYW50IHJlc29ydGluZy4qL1xuYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzKHJlc29ydGVkLGZ1bGxDb21wYXJlKTtcbi8qIFRoaXMgaXMgdGhlIHJhdyBKUyBhcnJheSBpdGVyYXRvciB3aG9zZSBgLm5leHQoKWAgbWV0aG9kKi9cbi8qIGRvZXMgbm90IGhhcmRlbiB0aGUgSXRlcmF0b3JSZXN1bHQsIGluIHZpb2xhdGlvbiBvZiBvdXIqL1xuLyogY29udmVudGlvbnMuIEZpeGluZyB0aGlzIGlzIGV4cGVuc2l2ZSBhbmQgSSdtIGNvbmZpZGVudCB0aGUqL1xuLyogdW5mcm96ZW4gdmFsdWUgZG9lcyBub3QgZXNjYXBlIHRoaXMgZmlsZSwgc28gSSdtIGxlYXZpbmcgdGhpcyovXG4vKiBhcyBpcy4qL1xub3B0SW5uZXJJdGVyYXRvcj1yZXNvcnRlZFtTeW1ib2wuaXRlcmF0b3JdKCk7XG5yZXR1cm4gb3B0SW5uZXJJdGVyYXRvci5uZXh0KCk7XG4gfWVsc2V7XG5yZXR1cm4gaGFyZGVuKHtkb25lOnRydWUsdmFsdWU6W251bGwsMG5dfSk7XG4gfVxuIH19KX0pO1xuXG5cbiB9O1xuXG4vKipcbiAqIFJldHVybnMgYW4gaXRlcmFibGUgd2hvc2UgaXRlcmF0aW9uIHJlc3VsdHMgYXJlIFtrZXksIHhDb3VudCwgeUNvdW50XSB0dXBsZXNcbiAqIHJlcHJlc2VudGluZyB0aGUgbmV4dCBrZXkgaW4gdGhlIGxvY2FsIGZ1bGwgb3JkZXIsIGFzIHdlbGwgYXMgaG93IG1hbnlcbiAqIHRpbWVzIGl0IG9jY3VycmVkIGluIHRoZSB4IGlucHV0IGl0ZXJhdG9yIGFuZCB0aGUgeSBpbnB1dCBpdGVyYXRvci5cbiAqXG4gKiBGb3Igc2V0cywgdGhlc2UgY291bnRzIGFyZSBhbHdheXMgMCBvciAxLCBidXQgdGhpcyByZXByZXNlbnRhdGlvblxuICogZ2VuZXJhbGl6ZXMgbmljZWx5IGZvciBiYWdzLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1tULGJpZ2ludF1bXX0geGJhZ0VudHJpZXNcbiAqIEBwYXJhbSB7W1QsYmlnaW50XVtdfSB5YmFnRW50cmllc1xuICogQHJldHVybnMge0l0ZXJhYmxlPFtULGJpZ2ludCxiaWdpbnRdPn1cbiAqL1xuY29uc3QgbWVyZ2U9KHhiYWdFbnRyaWVzLHliYWdFbnRyaWVzKT0+e1xuLyogVGhpcyBmdWxsT3JkZXIgY29udGFpbnMgaGlzdG9yeSBkZXBlbmRlbnQgc3RhdGUuIEl0IGlzIHNwZWNpZmljKi9cbi8qIHRvIHRoaXMgb25lIGBtZXJnZWAgY2FsbCBhbmQgZG9lcyBub3Qgc3Vydml2ZSBpdC4qL1xuY29uc3QgZnVsbENvbXBhcmU9bWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQoKS5hbnRpQ29tcGFyYXRvcjtcblxuY29uc3QgeHM9YmFnV2luZG93UmVzb3J0KHhiYWdFbnRyaWVzLGNvbXBhcmVBbnRpUmFuayxmdWxsQ29tcGFyZSk7XG5jb25zdCB5cz1iYWdXaW5kb3dSZXNvcnQoeWJhZ0VudHJpZXMsY29tcGFyZUFudGlSYW5rLGZ1bGxDb21wYXJlKTtcbnJldHVybiBoYXJkZW4oe1xuW1N5bWJvbC5pdGVyYXRvcl06KCk9Pntcbi8qIFRoZXNlIHNpeCBgbGV0YCB2YXJpYWJsZXMgYXJlIGJ1ZmZlcmluZyBvbmUgYWhlYWQgZnJvbSB0aGUgdW5kZXJseWluZyovXG4vKiBpdGVyYXRvcnMuIEVhY2ggaXRlcmF0aW9uIHJlcG9ydHMgb25lIG9yIHRoZSBvdGhlciBvciBib3RoLCBhbmQqL1xuLyogdGhlbiByZWZpbGxzIHRoZSBidWZmZXJzIG9mIHRob3NlIGl0IGFkdmFuY2VkLiovXG4vKiogQHR5cGUge1R9ICovXG5sZXQgeDtcbmxldCB4YztcbmxldCB4RG9uZTtcbi8qKiBAdHlwZSB7VH0gKi9cbmxldCB5O1xubGV0IHljO1xubGV0IHlEb25lO1xuXG5jb25zdCB4aT14c1tTeW1ib2wuaXRlcmF0b3JdKCk7XG5jb25zdCBuZXh0WD0oKT0+e1xuYXNzZXJ0KCF4RG9uZSxYIGBJbnRlcm5hbDogbmV4dFggc2hvdWxkIG5vdCBiZSBjYWxsZWQgb25jZSBkb25lYCk7XG4oe1xuZG9uZTp4RG9uZSxcbnZhbHVlOlt4LHhjXX09XG54aS5uZXh0KCkpO1xuIH07XG5uZXh0WCgpO1xuXG5jb25zdCB5aT15c1tTeW1ib2wuaXRlcmF0b3JdKCk7XG5jb25zdCBuZXh0WT0oKT0+e1xuYXNzZXJ0KCF5RG9uZSxYIGBJbnRlcm5hbDogbmV4dFkgc2hvdWxkIG5vdCBiZSBjYWxsZWQgb25jZSBkb25lYCk7XG4oe1xuZG9uZTp5RG9uZSxcbnZhbHVlOlt5LHljXX09XG55aS5uZXh0KCkpO1xuIH07XG5uZXh0WSgpO1xuXG5yZXR1cm4gaGFyZGVuKHtcbm5leHQ6KCk9Pntcbi8qKiBAdHlwZSB7Ym9vbGVhbn0gKi9cbmxldCBkb25lPWZhbHNlO1xuLyoqIEB0eXBlIHtbVCxiaWdpbnQsYmlnaW50XX0gKi9cbmxldCB2YWx1ZTtcbmlmKHhEb25lJiZ5RG9uZSl7XG5kb25lPXRydWU7XG4vKiBAdHMtZXhwZWN0LWVycm9yIEJlY2F1c2UgdGhlIHRlcm1pbmF0aW5nIHZhbHVlIGRvZXMgbm90IG1hdHRlciovXG52YWx1ZT1bbnVsbCwwbiwwbl07XG4gfWVsc2UgaWYoeERvbmUpe1xuLyogb25seSB5cyBhcmUgbGVmdCovXG52YWx1ZT1beSwwbix5Y107XG5uZXh0WSgpO1xuIH1lbHNlIGlmKHlEb25lKXtcbi8qIG9ubHkgeHMgYXJlIGxlZnQqL1xudmFsdWU9W3gseGMsMG5dO1xubmV4dFgoKTtcbiB9ZWxzZXtcbmNvbnN0IGNvbXA9ZnVsbENvbXBhcmUoeCx5KTtcbmlmKGNvbXA9PT0wKXtcbi8qIHggYW5kIHkgYXJlIGVxdWl2YWxlbnQsIHNvIHJlcG9ydCBib3RoKi9cbnZhbHVlPVt4LHhjLHljXTtcbm5leHRYKCk7XG5uZXh0WSgpO1xuIH1lbHNlIGlmKGNvbXA8MCl7XG4vKiB4IGlzIGVhcmxpZXIsIHNvIHJlcG9ydCBpdCovXG52YWx1ZT1beCx4Yywwbl07XG5uZXh0WCgpO1xuIH1lbHNle1xuLyogeSBpcyBlYXJsaWVyLCBzbyByZXBvcnQgaXQqL1xuYXNzZXJ0KGNvbXA+MCxYIGBJbnRlcm5hbDogVW5leHBlY3RlZCBjb21wICR7cShjb21wKX1gKTtcbnZhbHVlPVt5LDBuLHljXTtcbm5leHRZKCk7XG4gfVxuIH1cbnJldHVybiBoYXJkZW4oe2RvbmUsdmFsdWV9KTtcbiB9fSk7XG5cbiB9fSk7XG5cbiB9O1xuaGFyZGVuKG1lcmdlKTtcblxuLyogV2Ugc2hvdWxkIGJlIGFibGUgdG8gdXNlIHRoaXMgZm9yIGl0ZXJJc1N1cGVyc2V0IGFzIHdlbGwuKi9cbi8qIFRoZSBnZW5lcmFsaXphdGlvbiBpcyBmcmVlLiovXG5jb25zdCBiYWdJdGVySXNTdXBlcmJhZz0oeHlpKT0+e1xuZm9yKGNvbnN0W19tLHhjLHljXW9mIHh5aSl7XG5pZih4Yzx5Yyl7XG4vKiBzb21ldGhpbmcgaW4geSBpcyBub3QgaW4geCwgc28geCBpcyBub3QgYSBzdXBlcmJhZyBvZiB5Ki9cbnJldHVybiBmYWxzZTtcbiB9XG4gfVxucmV0dXJuIHRydWU7XG4gfTtcblxuLyogV2Ugc2hvdWxkIGJlIGFibGUgdG8gdXNlIHRoaXMgZm9yIGl0ZXJJc0Rpc2pvaW50IGFzIHdlbGwuKi9cbi8qIFRoZSBjb2RlIGlzIGlkZW50aWNhbC4qL1xuY29uc3QgYmFnSXRlcklzRGlzam9pbnQ9KHh5aSk9PntcbmZvcihjb25zdFtfbSx4Yyx5Y11vZiB4eWkpe1xuaWYoeGM+PTFuJiZ5Yz49MW4pe1xuLyogU29tZXRoaW5nIGluIGJvdGgsIHNvIG5vdCBkaXNqb2ludCovXG5yZXR1cm4gZmFsc2U7XG4gfVxuIH1cbnJldHVybiB0cnVlO1xuIH07XG5cbi8qIFdlIHNob3VsZCBiZSBhYmxlIHRvIHVzZSB0aGlzIGZvciBpdGVyQ29tcGFyZSBhcyB3ZWxsLiovXG4vKiBUaGUgZ2VuZXJhbGl6YXRpb24gaXMgZnJlZS4qL1xuY29uc3QgYmFnSXRlckNvbXBhcmU9KHh5aSk9PntcbmxldCBsb25lWT1mYWxzZTtcbmxldCBsb25lWD1mYWxzZTtcbmZvcihjb25zdFtfbSx4Yyx5Y11vZiB4eWkpe1xuaWYoeGM8eWMpe1xuLyogc29tZXRoaW5nIGluIHkgaXMgbm90IGluIHgsIHNvIHggaXMgbm90IGEgc3VwZXJiYWcgb2YgeSovXG5sb25lWT10cnVlO1xuIH1cbmlmKHhjPnljKXtcbi8qIHNvbWV0aGluZyBpbiB4IGlzIG5vdCBpbiB5LCBzbyB5IGlzIG5vdCBhIHN1cGVyYmFnIG9mIHgqL1xubG9uZVg9dHJ1ZTtcbiB9XG5pZihsb25lWCYmbG9uZVkpe1xucmV0dXJuIE5hTjtcbiB9XG4gfVxuaWYobG9uZVgpe1xucmV0dXJuIDE7XG4gfWVsc2UgaWYobG9uZVkpe1xucmV0dXJuLTE7XG4gfWVsc2V7XG4hbG9uZVgmJiFsb25lWXx8XG5hc3NlcnQuZmFpbChYIGBJbnRlcm5hbDogVW5leHBlY3RlZCBsb25lIHBhaXIgJHtxKFtsb25lWCxsb25lWV0pfWApO1xucmV0dXJuIDA7XG4gfVxuIH07XG5cbmNvbnN0IGJhZ0l0ZXJVbmlvbj0oeHlpKT0+e1xuY29uc3QgcmVzdWx0PVtdO1xuZm9yKGNvbnN0W20seGMseWNdb2YgeHlpKXtcbnJlc3VsdC5wdXNoKFttLHhjK3ljXSk7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG5jb25zdCBiYWdJdGVySW50ZXJzZWN0aW9uPSh4eWkpPT57XG5jb25zdCByZXN1bHQ9W107XG5mb3IoY29uc3RbbSx4Yyx5Y11vZiB4eWkpe1xuY29uc3QgbWM9eGM8PXljP3hjOnljO1xucmVzdWx0LnB1c2goW20sbWNdKTtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbmNvbnN0IGJhZ0l0ZXJEaXNqb2ludFN1YnRyYWN0PSh4eWkpPT57XG5jb25zdCByZXN1bHQ9W107XG5mb3IoY29uc3RbbSx4Yyx5Y11vZiB4eWkpe1xuY29uc3QgbWM9eGMteWM7XG5hc3NlcnQobWM+PTBuLFggYHJpZ2h0IGVsZW1lbnQgJHttfSB3YXMgbm90IGluIGxlZnRgKTtcbmlmKG1jPj0xbil7XG4vKiB0aGUgeCB3YXMgbm90IGluIHkqL1xucmVzdWx0LnB1c2goW20sbWNdKTtcbiB9XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG5jb25zdCBtZXJnZWlmeT0oYmFnSXRlck9wKT0+KHhiYWdFbnRyaWVzLHliYWdFbnRyaWVzKT0+XG5iYWdJdGVyT3AobWVyZ2UoeGJhZ0VudHJpZXMseWJhZ0VudHJpZXMpKTtcblxuY29uc3QgYmFnRW50cmllc0lzU3VwZXJiYWc9bWVyZ2VpZnkoYmFnSXRlcklzU3VwZXJiYWcpO1xuY29uc3QgYmFnRW50cmllc0lzRGlzam9pbnQ9bWVyZ2VpZnkoYmFnSXRlcklzRGlzam9pbnQpO1xuY29uc3QgYmFnRW50cmllc0NvbXBhcmU9bWVyZ2VpZnkoYmFnSXRlckNvbXBhcmUpO1xuY29uc3QgYmFnRW50cmllc1VuaW9uPW1lcmdlaWZ5KGJhZ0l0ZXJVbmlvbik7XG5jb25zdCBiYWdFbnRyaWVzSW50ZXJzZWN0aW9uPW1lcmdlaWZ5KGJhZ0l0ZXJJbnRlcnNlY3Rpb24pO1xuY29uc3QgYmFnRW50cmllc0Rpc2pvaW50U3VidHJhY3Q9bWVyZ2VpZnkoYmFnSXRlckRpc2pvaW50U3VidHJhY3QpO1xuXG5jb25zdCByYXdCYWdpZnk9KGJhZ0VudHJpZXNPcCk9Pih4YmFnLHliYWcpPT5cbmJhZ0VudHJpZXNPcCh4YmFnLnBheWxvYWQseWJhZy5wYXlsb2FkKTtcblxuY29uc3QgYmFnaWZ5PShiYWdFbnRyaWVzT3ApPT4oeGJhZyx5YmFnKT0+XG5tYWtlQmFnT2ZFbnRyaWVzKGJhZ0VudHJpZXNPcCh4YmFnLnBheWxvYWQseWJhZy5wYXlsb2FkKSk7XG5cbmNvbnN0ICAgICAgICBiYWdJc1N1cGVyYmFnPXJhd0JhZ2lmeShiYWdFbnRyaWVzSXNTdXBlcmJhZyk7JGjigI1fb25jZS5iYWdJc1N1cGVyYmFnKGJhZ0lzU3VwZXJiYWcpO1xuY29uc3QgICAgICAgIGJhZ0lzRGlzam9pbnQ9cmF3QmFnaWZ5KGJhZ0VudHJpZXNJc0Rpc2pvaW50KTskaOKAjV9vbmNlLmJhZ0lzRGlzam9pbnQoYmFnSXNEaXNqb2ludCk7XG5jb25zdCAgICAgICAgYmFnQ29tcGFyZT1yYXdCYWdpZnkoYmFnRW50cmllc0NvbXBhcmUpOyRo4oCNX29uY2UuYmFnQ29tcGFyZShiYWdDb21wYXJlKTtcbmNvbnN0ICAgICAgICBiYWdVbmlvbj1iYWdpZnkoYmFnRW50cmllc1VuaW9uKTskaOKAjV9vbmNlLmJhZ1VuaW9uKGJhZ1VuaW9uKTtcbmNvbnN0ICAgICAgICBiYWdJbnRlcnNlY3Rpb249YmFnaWZ5KGJhZ0VudHJpZXNJbnRlcnNlY3Rpb24pOyRo4oCNX29uY2UuYmFnSW50ZXJzZWN0aW9uKGJhZ0ludGVyc2VjdGlvbik7XG5jb25zdCAgICAgICAgYmFnRGlzam9pbnRTdWJ0cmFjdD1iYWdpZnkoYmFnRW50cmllc0Rpc2pvaW50U3VidHJhY3QpOyRo4oCNX29uY2UuYmFnRGlzam9pbnRTdWJ0cmFjdChiYWdEaXNqb2ludFN1YnRyYWN0KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJiYWdJc1N1cGVyYmFnIjpbImJhZ0lzU3VwZXJiYWciXSwiYmFnSXNEaXNqb2ludCI6WyJiYWdJc0Rpc2pvaW50Il0sImJhZ0NvbXBhcmUiOlsiYmFnQ29tcGFyZSJdLCJiYWdVbmlvbiI6WyJiYWdVbmlvbiJdLCJiYWdJbnRlcnNlY3Rpb24iOlsiYmFnSW50ZXJzZWN0aW9uIl0sImJhZ0Rpc2pvaW50U3VidHJhY3QiOlsiYmFnRGlzam9pbnRTdWJ0cmFjdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABuqAnd3CUAANwlAAA0AAAAQGFnb3JpYy9zdG9yZS12MC44LjUvc3JjL2tleXMvbWVyZ2Utc2V0LW9wZXJhdG9ycy5qc3siaW1wb3J0cyI6WyIuLi9wYXR0ZXJucy9yYW5rT3JkZXIuanMiLCIuL2NvcHlTZXQuanMiXSwiZXhwb3J0cyI6WyJlbGVtZW50c0NvbXBhcmUiLCJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QiLCJlbGVtZW50c0Rpc2pvaW50VW5pb24iLCJlbGVtZW50c0ludGVyc2VjdGlvbiIsImVsZW1lbnRzSXNEaXNqb2ludCIsImVsZW1lbnRzSXNTdXBlcnNldCIsImVsZW1lbnRzVW5pb24iLCJzZXRDb21wYXJlIiwic2V0RGlzam9pbnRTdWJ0cmFjdCIsInNldERpc2pvaW50VW5pb24iLCJzZXRJbnRlcnNlY3Rpb24iLCJzZXRJc0Rpc2pvaW50Iiwic2V0SXNTdXBlcnNldCIsInNldFVuaW9uIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydFJhbmtTb3J0ZWQsY29tcGFyZUFudGlSYW5rLG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0LHNvcnRCeVJhbmssYXNzZXJ0Tm9EdXBsaWNhdGVzLG1ha2VTZXRPZkVsZW1lbnRzOyRo4oCNX2ltcG9ydHMoW1tcIi4uL3BhdHRlcm5zL3JhbmtPcmRlci5qc1wiLCBbW1wiYXNzZXJ0UmFua1NvcnRlZFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UmFua1NvcnRlZCA9ICRo4oCNX2EpXV0sW1wiY29tcGFyZUFudGlSYW5rXCIsIFskaOKAjV9hID0+IChjb21wYXJlQW50aVJhbmsgPSAkaOKAjV9hKV1dLFtcIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0XCIsIFskaOKAjV9hID0+IChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCA9ICRo4oCNX2EpXV0sW1wic29ydEJ5UmFua1wiLCBbJGjigI1fYSA9PiAoc29ydEJ5UmFuayA9ICRo4oCNX2EpXV1dXSxbXCIuL2NvcHlTZXQuanNcIiwgW1tcImFzc2VydE5vRHVwbGljYXRlc1wiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Tm9EdXBsaWNhdGVzID0gJGjigI1fYSldXSxbXCJtYWtlU2V0T2ZFbGVtZW50c1wiLCBbJGjigI1fYSA9PiAobWFrZVNldE9mRWxlbWVudHMgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cbmNvbnN0e2RldGFpbHM6WCxxdW90ZTpxfT1hc3NlcnQ7XG5cbi8qKlxuICogQXNzZXJ0cyB0aGF0IGBlbGVtZW50c2AgaXMgYWxyZWFkeSByYW5rIHNvcnRlZCBieSBgcmFua0NvbXBhcmVgLCB3aGVyZSB0aGVyZVxuICogbWF5IGJlIGNvbnRpZ3VvdXMgcmVnaW9ucyBvZiBlbGVtZW50cyB0aWVkIGZvciB0aGUgc2FtZSByYW5rLlxuICogUmV0dXJucyBhbiBpdGVyYWJsZSB0aGF0IHdpbGwgZW51bWVyYXRlIGFsbCB0aGUgZWxlbWVudHMgaW4gb3JkZXJcbiAqIGFjY29yZGluZyB0byBgZnVsbE9yZGVyYCwgd2hpY2ggc2hvdWxkIGRpZmZlciBmcm9tIGByYW5rT3JkZXJgIG9ubHlcbiAqIGJ5IGJlaW5nIG1vcmUgcHJlY2lzZS5cbiAqXG4gKiBUaGlzIHNob3VsZCBiZSBlcXVpdmFsZW50IHRvIHJlc29ydGluZyB0aGUgZW50aXJlIGBlbGVtZW50c2AgYXJyYXkgYWNjb3JkaW5nXG4gKiAgdG8gYGZ1bGxPcmRlcmAuIEhvd2V2ZXIsIGl0IG9wdGltaXplcyBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlc2UgY29udGlndW91c1xuICogcnVucyB0aGF0IG5lZWQgdG8gYmUgcmVzb3J0ZWQgYXJlIGVpdGhlciBhYnNlbnQgb3Igc21hbGwuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7VFtdfSBlbGVtZW50c1xuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gcmFua0NvbXBhcmVcbiAqIEBwYXJhbSB7RnVsbENvbXBhcmV9IGZ1bGxDb21wYXJlXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8VD59XG4gKi9cbmNvbnN0IHdpbmRvd1Jlc29ydD0oZWxlbWVudHMscmFua0NvbXBhcmUsZnVsbENvbXBhcmUpPT57XG5hc3NlcnRSYW5rU29ydGVkKGVsZW1lbnRzLHJhbmtDb21wYXJlKTtcbmNvbnN0e2xlbmd0aH09ZWxlbWVudHM7XG5sZXQgaT0wO1xubGV0IG9wdElubmVySXRlcmF0b3I7XG5yZXR1cm4gaGFyZGVuKHtcbltTeW1ib2wuaXRlcmF0b3JdOigpPT5cbmhhcmRlbih7XG5uZXh0OigpPT57XG5pZihvcHRJbm5lckl0ZXJhdG9yKXtcbmNvbnN0IHJlc3VsdD1vcHRJbm5lckl0ZXJhdG9yLm5leHQoKTtcbmlmKHJlc3VsdC5kb25lKXtcbm9wdElubmVySXRlcmF0b3I9dW5kZWZpbmVkO1xuLyogZmFsbCB0aHJvdWdoKi9cbiB9ZWxzZXtcbnJldHVybiByZXN1bHQ7XG4gfVxuIH1cbmlmKGk8bGVuZ3RoKXtcbmNvbnN0IHZhbHVlPWVsZW1lbnRzW2ldO1xubGV0IGo9aSsxO1xud2hpbGUoajxsZW5ndGgmJnJhbmtDb21wYXJlKHZhbHVlLGVsZW1lbnRzW2pdKT09PTApe1xuais9MTtcbiB9XG5pZihqPT09aSsxKXtcbmk9ajtcbnJldHVybiBoYXJkZW4oe2RvbmU6ZmFsc2UsdmFsdWV9KTtcbiB9XG5jb25zdCBzaW1pbGFyUnVuPWVsZW1lbnRzLnNsaWNlKGksaik7XG5pPWo7XG5jb25zdCByZXNvcnRlZD1zb3J0QnlSYW5rKHNpbWlsYXJSdW4sZnVsbENvbXBhcmUpO1xuLyogUHJvdmlkaW5nIHRoZSBzYW1lIGBmdWxsQ29tcGFyZWAgc2hvdWxkIGNhdXNlIGEgbWVtbyBoaXQqL1xuLyogd2l0aGluIGBhc3NlcnROb0R1cGxpY2F0ZXNgIGVuYWJsaW5nIGl0IHRvIGF2b2lkIGEqL1xuLyogcmVkdW5kYW50IHJlc29ydGluZy4qL1xuYXNzZXJ0Tm9EdXBsaWNhdGVzKHJlc29ydGVkLGZ1bGxDb21wYXJlKTtcbi8qIFRoaXMgaXMgdGhlIHJhdyBKUyBhcnJheSBpdGVyYXRvciB3aG9zZSBgLm5leHQoKWAgbWV0aG9kKi9cbi8qIGRvZXMgbm90IGhhcmRlbiB0aGUgSXRlcmF0b3JSZXN1bHQsIGluIHZpb2xhdGlvbiBvZiBvdXIqL1xuLyogY29udmVudGlvbnMuIEZpeGluZyB0aGlzIGlzIGV4cGVuc2l2ZSBhbmQgSSdtIGNvbmZpZGVudCB0aGUqL1xuLyogdW5mcm96ZW4gdmFsdWUgZG9lcyBub3QgZXNjYXBlIHRoaXMgZmlsZSwgc28gSSdtIGxlYXZpbmcgdGhpcyovXG4vKiBhcyBpcy4qL1xub3B0SW5uZXJJdGVyYXRvcj1yZXNvcnRlZFtTeW1ib2wuaXRlcmF0b3JdKCk7XG5yZXR1cm4gb3B0SW5uZXJJdGVyYXRvci5uZXh0KCk7XG4gfWVsc2V7XG5yZXR1cm4gaGFyZGVuKHtkb25lOnRydWUsdmFsdWU6bnVsbH0pO1xuIH1cbiB9fSl9KTtcblxuXG4gfTtcblxuLyoqXG4gKiBSZXR1cm5zIGFuIGl0ZXJhYmxlIHdob3NlIGl0ZXJhdGlvbiByZXN1bHRzIGFyZSBba2V5LCB4Q291bnQsIHlDb3VudF0gdHVwbGVzXG4gKiByZXByZXNlbnRpbmcgdGhlIG5leHQga2V5IGluIHRoZSBsb2NhbCBmdWxsIG9yZGVyLCBhcyB3ZWxsIGFzIGhvdyBtYW55XG4gKiB0aW1lcyBpdCBvY2N1cnJlZCBpbiB0aGUgeCBpbnB1dCBpdGVyYXRvciBhbmQgdGhlIHkgaW5wdXQgaXRlcmF0b3IuXG4gKlxuICogRm9yIHNldHMsIHRoZXNlIGNvdW50cyBhcmUgYWx3YXlzIDAgb3IgMSwgYnV0IHRoaXMgcmVwcmVzZW50YXRpb25cbiAqIGdlbmVyYWxpemVzIG5pY2VseSBmb3IgYmFncy5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUW119IHhlbGVtZW50c1xuICogQHBhcmFtIHtUW119IHllbGVtZW50c1xuICogQHJldHVybnMge0l0ZXJhYmxlPFtULGJpZ2ludCxiaWdpbnRdPn1cbiAqL1xuY29uc3QgbWVyZ2U9KHhlbGVtZW50cyx5ZWxlbWVudHMpPT57XG4vKiBUaGlzIGZ1bGxPcmRlciBjb250YWlucyBoaXN0b3J5IGRlcGVuZGVudCBzdGF0ZS4gSXQgaXMgc3BlY2lmaWMqL1xuLyogdG8gdGhpcyBvbmUgYG1lcmdlYCBjYWxsIGFuZCBkb2VzIG5vdCBzdXJ2aXZlIGl0LiovXG5jb25zdCBmdWxsQ29tcGFyZT1tYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCgpLmFudGlDb21wYXJhdG9yO1xuXG5jb25zdCB4cz13aW5kb3dSZXNvcnQoeGVsZW1lbnRzLGNvbXBhcmVBbnRpUmFuayxmdWxsQ29tcGFyZSk7XG5jb25zdCB5cz13aW5kb3dSZXNvcnQoeWVsZW1lbnRzLGNvbXBhcmVBbnRpUmFuayxmdWxsQ29tcGFyZSk7XG5yZXR1cm4gaGFyZGVuKHtcbltTeW1ib2wuaXRlcmF0b3JdOigpPT57XG4vKiBUaGVzZSBmb3VyIGBsZXRgIHZhcmlhYmxlcyBhcmUgYnVmZmVyaW5nIG9uZSBhaGVhZCBmcm9tIHRoZSB1bmRlcmx5aW5nKi9cbi8qIGl0ZXJhdG9ycy4gRWFjaCBpdGVyYXRpb24gcmVwb3J0cyBvbmUgb3IgdGhlIG90aGVyIG9yIGJvdGgsIGFuZCovXG4vKiB0aGVuIHJlZmlsbHMgdGhlIGJ1ZmZlcnMgb2YgdGhvc2UgaXQgYWR2YW5jZWQuKi9cbi8qKiBAdHlwZSB7VH0gKi9cbmxldCB4O1xubGV0IHhEb25lO1xuLyoqIEB0eXBlIHtUfSAqL1xubGV0IHk7XG5sZXQgeURvbmU7XG5cbmNvbnN0IHhpPXhzW1N5bWJvbC5pdGVyYXRvcl0oKTtcbmNvbnN0IG5leHRYPSgpPT57XG5hc3NlcnQoIXhEb25lLFggYEludGVybmFsOiBuZXh0WCBzaG91bGQgbm90IGJlIGNhbGxlZCBvbmNlIGRvbmVgKTtcbih7ZG9uZTp4RG9uZSx2YWx1ZTp4fT14aS5uZXh0KCkpO1xuIH07XG5uZXh0WCgpO1xuXG5jb25zdCB5aT15c1tTeW1ib2wuaXRlcmF0b3JdKCk7XG5jb25zdCBuZXh0WT0oKT0+e1xuYXNzZXJ0KCF5RG9uZSxYIGBJbnRlcm5hbDogbmV4dFkgc2hvdWxkIG5vdCBiZSBjYWxsZWQgb25jZSBkb25lYCk7XG4oe2RvbmU6eURvbmUsdmFsdWU6eX09eWkubmV4dCgpKTtcbiB9O1xubmV4dFkoKTtcblxucmV0dXJuIGhhcmRlbih7XG5uZXh0OigpPT57XG4vKiogQHR5cGUge2Jvb2xlYW59ICovXG5sZXQgZG9uZT1mYWxzZTtcbi8qKiBAdHlwZSB7W1QsYmlnaW50LGJpZ2ludF19ICovXG5sZXQgdmFsdWU7XG5pZih4RG9uZSYmeURvbmUpe1xuZG9uZT10cnVlO1xuLyogQHRzLWV4cGVjdC1lcnJvciBCZWNhdXNlIHRoZSB0ZXJtaW5hdGluZyB2YWx1ZSBkb2VzIG5vdCBtYXR0ZXIqL1xudmFsdWU9W251bGwsMG4sMG5dO1xuIH1lbHNlIGlmKHhEb25lKXtcbi8qIG9ubHkgeXMgYXJlIGxlZnQqL1xudmFsdWU9W3ksMG4sMW5dO1xubmV4dFkoKTtcbiB9ZWxzZSBpZih5RG9uZSl7XG4vKiBvbmx5IHhzIGFyZSBsZWZ0Ki9cbnZhbHVlPVt4LDFuLDBuXTtcbm5leHRYKCk7XG4gfWVsc2V7XG5jb25zdCBjb21wPWZ1bGxDb21wYXJlKHgseSk7XG5pZihjb21wPT09MCl7XG4vKiB4IGFuZCB5IGFyZSBlcXVpdmFsZW50LCBzbyByZXBvcnQgYm90aCovXG52YWx1ZT1beCwxbiwxbl07XG5uZXh0WCgpO1xubmV4dFkoKTtcbiB9ZWxzZSBpZihjb21wPDApe1xuLyogeCBpcyBlYXJsaWVyLCBzbyByZXBvcnQgaXQqL1xudmFsdWU9W3gsMW4sMG5dO1xubmV4dFgoKTtcbiB9ZWxzZXtcbi8qIHkgaXMgZWFybGllciwgc28gcmVwb3J0IGl0Ki9cbmFzc2VydChjb21wPjAsWCBgSW50ZXJuYWw6IFVuZXhwZWN0ZWQgY29tcCAke3EoY29tcCl9YCk7XG52YWx1ZT1beSwwbiwxbl07XG5uZXh0WSgpO1xuIH1cbiB9XG5yZXR1cm4gaGFyZGVuKHtkb25lLHZhbHVlfSk7XG4gfX0pO1xuXG4gfX0pO1xuXG4gfTtcbmhhcmRlbihtZXJnZSk7XG5cbmNvbnN0IGl0ZXJJc1N1cGVyc2V0PSh4eWkpPT57XG5mb3IoY29uc3RbX20seGMsX3ljXW9mIHh5aSl7XG5pZih4Yz09PTBuKXtcbi8qIHNvbWV0aGluZyBpbiB5IGlzIG5vdCBpbiB4LCBzbyB4IGlzIG5vdCBhIHN1cGVyc2V0IG9mIHkqL1xucmV0dXJuIGZhbHNlO1xuIH1cbiB9XG5yZXR1cm4gdHJ1ZTtcbiB9O1xuXG5jb25zdCBpdGVySXNEaXNqb2ludD0oeHlpKT0+e1xuZm9yKGNvbnN0W19tLHhjLHljXW9mIHh5aSl7XG5pZih4Yz49MW4mJnljPj0xbil7XG4vKiBTb21ldGhpbmcgaW4gYm90aCwgc28gbm90IGRpc2pvaW50Ki9cbnJldHVybiBmYWxzZTtcbiB9XG4gfVxucmV0dXJuIHRydWU7XG4gfTtcblxuY29uc3QgaXRlckNvbXBhcmU9KHh5aSk9PntcbmxldCBsb25lWT1mYWxzZTtcbmxldCBsb25lWD1mYWxzZTtcbmZvcihjb25zdFtfbSx4Yyx5Y11vZiB4eWkpe1xuaWYoeGM9PT0wbil7XG4vKiBzb21ldGhpbmcgaW4geSBpcyBub3QgaW4geCwgc28geCBpcyBub3QgYSBzdXBlcnNldCBvZiB5Ki9cbmxvbmVZPXRydWU7XG4gfVxuaWYoeWM9PT0wbil7XG4vKiBzb21ldGhpbmcgaW4geCBpcyBub3QgaW4geSwgc28geSBpcyBub3QgYSBzdXBlcnNldCBvZiB4Ki9cbmxvbmVYPXRydWU7XG4gfVxuaWYobG9uZVgmJmxvbmVZKXtcbnJldHVybiBOYU47XG4gfVxuIH1cbmlmKGxvbmVYKXtcbnJldHVybiAxO1xuIH1lbHNlIGlmKGxvbmVZKXtcbnJldHVybi0xO1xuIH1lbHNle1xuIWxvbmVYJiYhbG9uZVl8fFxuYXNzZXJ0LmZhaWwoWCBgSW50ZXJuYWw6IFVuZXhwZWN0ZWQgbG9uZSBwYWlyICR7cShbbG9uZVgsbG9uZVldKX1gKTtcbnJldHVybiAwO1xuIH1cbiB9O1xuXG5jb25zdCBpdGVyVW5pb249KHh5aSk9PntcbmNvbnN0IHJlc3VsdD1bXTtcbmZvcihjb25zdFttLHhjLHljXW9mIHh5aSl7XG5pZih4Yz49MG4pe1xucmVzdWx0LnB1c2gobSk7XG4gfWVsc2V7XG5hc3NlcnQoeWM+PTBuLFggYEludGVybmFsOiBVbmV4cGVjdGVkIGNvdW50ICR7cSh5Yyl9YCk7XG4vKiBpZiB4IGFuZCB5IHdlcmUgYm90aCByZWFkeSwgdGhlbiB0aGV5IHdlcmUgZXF1aXZhbGVudCBhbmQqL1xuLyogYWJvdmUgY2xhdXNlIGFscmVhZHkgdG9vayBjYXJlIG9mIGl0LiBPdGhlcndpc2UgcHVzaCBoZXJlLiovXG5yZXN1bHQucHVzaChtKTtcbiB9XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG5jb25zdCBpdGVyRGlzam9pbnRVbmlvbj0oeHlpKT0+e1xuY29uc3QgcmVzdWx0PVtdO1xuZm9yKGNvbnN0W20seGMseWNdb2YgeHlpKXtcbmFzc2VydCh4Yz09PTBufHx5Yz09PTBuLFggYFNldHMgbXVzdCBub3QgaGF2ZSBjb21tb24gZWxlbWVudHM6ICR7bX1gKTtcbmlmKHhjPj0xbil7XG5yZXN1bHQucHVzaChtKTtcbiB9ZWxzZXtcbmFzc2VydCh5Yz49MW4sWCBgSW50ZXJuYWw6IFVuZXhwZWN0ZWQgY291bnQgJHtxKHljKX1gKTtcbnJlc3VsdC5wdXNoKG0pO1xuIH1cbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbmNvbnN0IGl0ZXJJbnRlcnNlY3Rpb249KHh5aSk9PntcbmNvbnN0IHJlc3VsdD1bXTtcbmZvcihjb25zdFttLHhjLHljXW9mIHh5aSl7XG5pZih4Yz49MW4mJnljPj0xbil7XG4vKiBJZiB0aGV5IGFyZSBib3RoIHByZXNlbnQsIHRoZW4gdGhleSB3ZXJlIGVxdWl2YWxlbnQqL1xucmVzdWx0LnB1c2gobSk7XG4gfVxuIH1cbnJldHVybiByZXN1bHQ7XG4gfTtcblxuY29uc3QgaXRlckRpc2pvaW50U3VidHJhY3Q9KHh5aSk9PntcbmNvbnN0IHJlc3VsdD1bXTtcbmZvcihjb25zdFttLHhjLHljXW9mIHh5aSl7XG5hc3NlcnQoeGM+PTFuLFggYHJpZ2h0IGVsZW1lbnQgJHttfSB3YXMgbm90IGluIGxlZnRgKTtcbmlmKHljPT09MG4pe1xuLyogdGhlIHggd2FzIG5vdCBpbiB5Ki9cbnJlc3VsdC5wdXNoKG0pO1xuIH1cbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbmNvbnN0IG1lcmdlaWZ5PShpdGVyT3ApPT4oeGVsZW1lbnRzLHllbGVtZW50cyk9PlxuaXRlck9wKG1lcmdlKHhlbGVtZW50cyx5ZWxlbWVudHMpKTtcblxuY29uc3QgICAgICAgIGVsZW1lbnRzSXNTdXBlcnNldD1tZXJnZWlmeShpdGVySXNTdXBlcnNldCk7JGjigI1fb25jZS5lbGVtZW50c0lzU3VwZXJzZXQoZWxlbWVudHNJc1N1cGVyc2V0KTtcbmNvbnN0ICAgICAgICBlbGVtZW50c0lzRGlzam9pbnQ9bWVyZ2VpZnkoaXRlcklzRGlzam9pbnQpOyRo4oCNX29uY2UuZWxlbWVudHNJc0Rpc2pvaW50KGVsZW1lbnRzSXNEaXNqb2ludCk7XG5jb25zdCAgICAgICAgZWxlbWVudHNDb21wYXJlPW1lcmdlaWZ5KGl0ZXJDb21wYXJlKTskaOKAjV9vbmNlLmVsZW1lbnRzQ29tcGFyZShlbGVtZW50c0NvbXBhcmUpO1xuY29uc3QgICAgICAgIGVsZW1lbnRzVW5pb249bWVyZ2VpZnkoaXRlclVuaW9uKTskaOKAjV9vbmNlLmVsZW1lbnRzVW5pb24oZWxlbWVudHNVbmlvbik7XG5jb25zdCAgICAgICAgZWxlbWVudHNEaXNqb2ludFVuaW9uPW1lcmdlaWZ5KGl0ZXJEaXNqb2ludFVuaW9uKTskaOKAjV9vbmNlLmVsZW1lbnRzRGlzam9pbnRVbmlvbihlbGVtZW50c0Rpc2pvaW50VW5pb24pO1xuY29uc3QgICAgICAgIGVsZW1lbnRzSW50ZXJzZWN0aW9uPW1lcmdlaWZ5KGl0ZXJJbnRlcnNlY3Rpb24pOyRo4oCNX29uY2UuZWxlbWVudHNJbnRlcnNlY3Rpb24oZWxlbWVudHNJbnRlcnNlY3Rpb24pO1xuY29uc3QgICAgICAgIGVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdD1tZXJnZWlmeShpdGVyRGlzam9pbnRTdWJ0cmFjdCk7JGjigI1fb25jZS5lbGVtZW50c0Rpc2pvaW50U3VidHJhY3QoZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0KTtcblxuY29uc3QgcmF3U2V0aWZ5PShlbGVtZW50c09wKT0+KHhzZXQseXNldCk9PlxuZWxlbWVudHNPcCh4c2V0LnBheWxvYWQseXNldC5wYXlsb2FkKTtcblxuY29uc3Qgc2V0aWZ5PShlbGVtZW50c09wKT0+KHhzZXQseXNldCk9PlxubWFrZVNldE9mRWxlbWVudHMoZWxlbWVudHNPcCh4c2V0LnBheWxvYWQseXNldC5wYXlsb2FkKSk7XG5cbmNvbnN0ICAgICAgICBzZXRJc1N1cGVyc2V0PXJhd1NldGlmeShlbGVtZW50c0lzU3VwZXJzZXQpOyRo4oCNX29uY2Uuc2V0SXNTdXBlcnNldChzZXRJc1N1cGVyc2V0KTtcbmNvbnN0ICAgICAgICBzZXRJc0Rpc2pvaW50PXJhd1NldGlmeShlbGVtZW50c0lzRGlzam9pbnQpOyRo4oCNX29uY2Uuc2V0SXNEaXNqb2ludChzZXRJc0Rpc2pvaW50KTtcbmNvbnN0ICAgICAgICBzZXRDb21wYXJlPXJhd1NldGlmeShlbGVtZW50c0NvbXBhcmUpOyRo4oCNX29uY2Uuc2V0Q29tcGFyZShzZXRDb21wYXJlKTtcbmNvbnN0ICAgICAgICBzZXRVbmlvbj1zZXRpZnkoZWxlbWVudHNVbmlvbik7JGjigI1fb25jZS5zZXRVbmlvbihzZXRVbmlvbik7XG5jb25zdCAgICAgICAgc2V0RGlzam9pbnRVbmlvbj1zZXRpZnkoZWxlbWVudHNEaXNqb2ludFVuaW9uKTskaOKAjV9vbmNlLnNldERpc2pvaW50VW5pb24oc2V0RGlzam9pbnRVbmlvbik7XG5jb25zdCAgICAgICAgc2V0SW50ZXJzZWN0aW9uPXNldGlmeShlbGVtZW50c0ludGVyc2VjdGlvbik7JGjigI1fb25jZS5zZXRJbnRlcnNlY3Rpb24oc2V0SW50ZXJzZWN0aW9uKTtcbmNvbnN0ICAgICAgICBzZXREaXNqb2ludFN1YnRyYWN0PXNldGlmeShlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QpOyRo4oCNX29uY2Uuc2V0RGlzam9pbnRTdWJ0cmFjdChzZXREaXNqb2ludFN1YnRyYWN0KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJlbGVtZW50c0lzU3VwZXJzZXQiOlsiZWxlbWVudHNJc1N1cGVyc2V0Il0sImVsZW1lbnRzSXNEaXNqb2ludCI6WyJlbGVtZW50c0lzRGlzam9pbnQiXSwiZWxlbWVudHNDb21wYXJlIjpbImVsZW1lbnRzQ29tcGFyZSJdLCJlbGVtZW50c1VuaW9uIjpbImVsZW1lbnRzVW5pb24iXSwiZWxlbWVudHNEaXNqb2ludFVuaW9uIjpbImVsZW1lbnRzRGlzam9pbnRVbmlvbiJdLCJlbGVtZW50c0ludGVyc2VjdGlvbiI6WyJlbGVtZW50c0ludGVyc2VjdGlvbiJdLCJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QiOlsiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0Il0sInNldElzU3VwZXJzZXQiOlsic2V0SXNTdXBlcnNldCJdLCJzZXRJc0Rpc2pvaW50IjpbInNldElzRGlzam9pbnQiXSwic2V0Q29tcGFyZSI6WyJzZXRDb21wYXJlIl0sInNldFVuaW9uIjpbInNldFVuaW9uIl0sInNldERpc2pvaW50VW5pb24iOlsic2V0RGlzam9pbnRVbmlvbiJdLCJzZXRJbnRlcnNlY3Rpb24iOlsic2V0SW50ZXJzZWN0aW9uIl0sInNldERpc2pvaW50U3VidHJhY3QiOlsic2V0RGlzam9pbnRTdWJ0cmFjdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAACAIfzRwsAAEcLAAAsAAAAQGFnb3JpYy9zdG9yZS12MC44LjUvc3JjL2xlZ2FjeS9sZWdhY3lNYXAuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9hc3NlcnQiXSwiZXhwb3J0cyI6WyJtYWtlTGVnYWN5TWFwIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydCxYLHE7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9hc3NlcnRcIiwgW1tcImFzc2VydFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0ID0gJGjigI1fYSldXSxbXCJkZXRhaWxzXCIsIFskaOKAjV9hID0+IChYID0gJGjigI1fYSldXSxbXCJxXCIsIFskaOKAjV9hID0+IChxID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG4vKipcbiAqIFRoaXMgbW9kdWxlIGFuZCBpdHMgZnJhdGVybmFsIHNpYmxpbmcgbGVnYWN5V2Vha01hcCBleGlzdCBvbmx5IHRvXG4gKiBlYXNlIGEgdHJhbnNpdGlvbiB0byB0aGUgbW9kZXJuIGBzdG9yZWAgc3lzdGVtLCBhcmUgZGVwcmVjYXRlZCxcbiAqIGFuZCB3aWxsIGV2ZW50dWFsbHkgZGlzYXBwZWFyLiBUaGV5IGFyZSBuZWVkZWQgZm9yIG5vdyB0byBzdXBwb3J0XG4gKiBzb21lIG9mIHRoZSB1c2VzIG9mIHRoZSBvbGQgYmVoYXZpb3IgdGhhdCBhcmUgbm90IGNvbXBhdGlibGUgd2l0aFxuICogdGhlIG5ldy4gVGhlIGNvbnN0cmFpbnQgaW1wb3NlZCBieSB0aGUgbmV3IGlzIHRoYXQgb25seSBwYXNzYWJsZXMgY2FuXG4gKiBiZSB1c2VkIGFzIHZhbHVlcywgYW5kIG9ubHkga2V5cyAocm91Z2hseSwgc3RydWN0dXJlcywgYWthIGNvbXBhcmFibGVzKVxuICogY2FuIGJlIHVzZWQgYXMgdmFsdWVzLlxuICpcbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvcHVsbC8zNTY3XG4gKiBUT0RPIE9uY2UgdGhhdCBQUiBpcyBtZXJnZWQsIGxpbmsgdG8gdGhlIGRvY3VtZW50cyByYXRoZXIgdGhhbiB0aGUgUFJzLlxuICpcbiAqIEVhY2ggb2YgdGhlc2Ugbm9uLWNvbmZvcm1pbmcgdXNlcyBzaG91bGQgYmUgbWFya2VkIHdpdGggYVxuICogYGBganNcbiAqIC8vIExlZ2FjeSBiZWNhdXNlLi4uXG4gKiBgYGBcbiAqIGNvbW1lbnQgZXhwbGFpbmluZyB0aGUgcHJvYmxlbSBpbmhpYml0aW5nIGNvbnZlcnNpb24gdG8gdGhlIG5ld1xuICogc3lzdGVtLiBTb21lIG9mIHRoZXNlIHByb2JsZW1zIGFzIG9mIHRoaXMgd3JpdGluZzpcbiAqICAgICogQSBwcm9taXNlS2l0IHVzZWQgYXMgYSB2YWx1ZSwgZXZlbiB0aG91Z2ggYSBwcm9taXNlS2l0IGlzIG5vdFxuICogICAgICBhIHBhc3NhYmxlLiBTb2x1dGlvbnMgYXJlIHRvIG1ha2UgaXQgYSBwYXNzYWJsZSwgb3IgdG8gY29udmVydFxuICogICAgICB0aGUgY29udGFpbmVyIGJhY2sgdG8gYSBjb252ZW50aW9uYWwgSmF2YVNjcmlwdCBNYXAuXG4gKiAgICAqIEEgbXV0YWJsZSBhcnJheSB1c2VkIGFzIGEgdmFsdWUsIHRoYXQgaXMgc3Vic2VxdWVudGx5IG11dGF0ZWQuXG4gKiAgICAgIEZyZWV6aW5nIHRoZSBhcnJheSB3b3VsZG4ndCB3b3JrIG9mIGNvdXJzZSBiZWNhdXNlIGl0IHdvdWxkIGJyZWFrXG4gKiAgICAgIHRoZSBzdWJzZXF1ZW50IG11dGF0aW9uLiBVc2luZyBhIGZhciBvYmplY3Qgd3JhcHBpbmcgYW4gYXJyYXkgd291bGRcbiAqICAgICAgbGlrZWx5IHdvcmsgZmluZS5cbiAqXG4gKiBAZGVwcmVjYXRlZCBzd2l0Y2ggdG8gU2NhbGFyTWFwIGlmIHBvc3NpYmxlLCBNYXAgb3RoZXJ3aXNlXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAcGFyYW0ge3N0cmluZ30gW3RhZz0na2V5J10gLSB0YWcgZm9yIGRlYnVnZ2luZ1xuICogQHJldHVybnMge0xlZ2FjeU1hcDxLLFY+fVxuICovXG5jb25zdCAgICAgICAgbWFrZUxlZ2FjeU1hcD0odGFnPSdrZXknKT0+e1xuY29uc3QgbT1uZXcgTWFwKCk7XG5jb25zdCBhc3NlcnRLZXlEb2VzTm90RXhpc3Q9KGtleSk9PlxuYXNzZXJ0KCFtLmhhcyhrZXkpLFggYCR7cSh0YWcpfSBhbHJlYWR5IHJlZ2lzdGVyZWQ6ICR7a2V5fWApO1xuY29uc3QgYXNzZXJ0S2V5RXhpc3RzPShrZXkpPT5cbmFzc2VydChtLmhhcyhrZXkpLFggYCR7cSh0YWcpfSBub3QgZm91bmQ6ICR7a2V5fWApO1xucmV0dXJuIGhhcmRlbih7XG5oYXM6KGtleSk9Pntcbi8qIENoZWNrIGlmIGEga2V5IGV4aXN0cy4gVGhlIGtleSBjYW4gYmUgYW55IEphdmFTY3JpcHQgdmFsdWUsKi9cbi8qIHRob3VnaCB0aGUgYW5zd2VyIHdpbGwgYWx3YXlzIGJlIGZhbHNlIGZvciBrZXlzIHRoYXQgY2Fubm90IGJlIGZvdW5kKi9cbi8qIGluIHRoaXMgbWFwLiovXG5yZXR1cm4gbS5oYXMoa2V5KTtcbiB9LFxuaW5pdDooa2V5LHZhbHVlKT0+e1xuYXNzZXJ0S2V5RG9lc05vdEV4aXN0KGtleSk7XG5tLnNldChrZXksdmFsdWUpO1xuIH0sXG5nZXQ6KGtleSk9PntcbmFzc2VydEtleUV4aXN0cyhrZXkpO1xucmV0dXJuIG0uZ2V0KGtleSk7XG4gfSxcbnNldDooa2V5LHZhbHVlKT0+e1xuYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG5tLnNldChrZXksdmFsdWUpO1xuIH0sXG5kZWxldGU6KGtleSk9PntcbmFzc2VydEtleUV4aXN0cyhrZXkpO1xubS5kZWxldGUoa2V5KTtcbiB9LFxua2V5czooKT0+bS5rZXlzKCksXG52YWx1ZXM6KCk9Pm0udmFsdWVzKCksXG5lbnRyaWVzOigpPT5tLmVudHJpZXMoKSxcbmdldFNpemU6KCk9Pm0uc2l6ZSxcbmNsZWFyOigpPT5tLmNsZWFyKCl9KTtcblxuIH07JGjigI1fb25jZS5tYWtlTGVnYWN5TWFwKG1ha2VMZWdhY3lNYXApO1xuaGFyZGVuKG1ha2VMZWdhY3lNYXApO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VMZWdhY3lNYXAiOlsibWFrZUxlZ2FjeU1hcCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAD+JKZc6wYAAOsGAAAwAAAAQGFnb3JpYy9zdG9yZS12MC44LjUvc3JjL2xlZ2FjeS9sZWdhY3lXZWFrTWFwLmpzeyJpbXBvcnRzIjpbIi4uL3R5cGVzLmpzIiwiQGFnb3JpYy9hc3NlcnQiXSwiZXhwb3J0cyI6WyJtYWtlTGVnYWN5V2Vha01hcCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnQsWCxxOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvYXNzZXJ0XCIsIFtbXCJhc3NlcnRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydCA9ICRo4oCNX2EpXV0sW1wiZGV0YWlsc1wiLCBbJGjigI1fYSA9PiAoWCA9ICRo4oCNX2EpXV0sW1wicVwiLCBbJGjigI1fYSA9PiAocSA9ICRo4oCNX2EpXV1dXSxbXCIuLi90eXBlcy5qc1wiLCBbXV1dKTsgICBcblxuXG5cblxuLyoqXG4gKiBTZWUgZG9jY29tbWVudCBpbiB0aGUgY2xvc2VseSByZWxhdGVkIGBsZWdhY3lNYXAuanNgIG1vZHVsZS5cbiAqXG4gKiBAZGVwcmVjYXRlZCBzd2l0Y2ggdG8gU2NhbGFyV2Vha01hcCBpZiBwb3NzaWJsZSwgV2Vha01hcCBvdGhlcndpc2VcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdGFnPSdrZXknXSAtIHRhZyBmb3IgZGVidWdnaW5nXG4gKiBAcmV0dXJucyB7TGVnYWN5V2Vha01hcDxLLFY+fVxuICovXG5jb25zdCAgICAgICAgbWFrZUxlZ2FjeVdlYWtNYXA9KHRhZz0na2V5Jyk9Pntcbi8qKiBAdHlwZSB7V2Vha01hcDxLICYgb2JqZWN0LCBWPn0gKi9cbmNvbnN0IHdtPW5ldyBXZWFrTWFwKCk7XG5jb25zdCBhc3NlcnRLZXlEb2VzTm90RXhpc3Q9KGtleSk9PlxuYXNzZXJ0KCF3bS5oYXMoa2V5KSxYIGAke3EodGFnKX0gYWxyZWFkeSByZWdpc3RlcmVkOiAke2tleX1gKTtcbmNvbnN0IGFzc2VydEtleUV4aXN0cz0oa2V5KT0+XG5hc3NlcnQod20uaGFzKGtleSksWCBgJHtxKHRhZyl9IG5vdCBmb3VuZDogJHtrZXl9YCk7XG5yZXR1cm4gaGFyZGVuKHtcbmhhczooa2V5KT0+e1xuLyogQ2hlY2sgaWYgYSBrZXkgZXhpc3RzLiBUaGUga2V5IGNhbiBiZSBhbnkgSmF2YVNjcmlwdCB2YWx1ZSwqL1xuLyogdGhvdWdoIHRoZSBhbnN3ZXIgd2lsbCBhbHdheXMgYmUgZmFsc2UgZm9yIGtleXMgdGhhdCBjYW5ub3QgYmUgZm91bmQqL1xuLyogaW4gdGhpcyBtYXAuKi9cbnJldHVybiB3bS5oYXMoa2V5KTtcbiB9LFxuaW5pdDooa2V5LHZhbHVlKT0+e1xuYXNzZXJ0S2V5RG9lc05vdEV4aXN0KGtleSk7XG53bS5zZXQoa2V5LHZhbHVlKTtcbiB9LFxuZ2V0OihrZXkpPT57XG5hc3NlcnRLZXlFeGlzdHMoa2V5KTtcbi8qIEhvdyB0byB0ZWxsIHR5cGVzY3JpcHQgSSBiZWxpZXZlIHRoZSBgZ2V0YCB3aWxsIHN1Y2NlZWQuKi9cbnJldHVybiAoLyoqIEB0eXBlIHtWfSAqL3dtLmdldChrZXkpKTtcbiB9LFxuc2V0OihrZXksdmFsdWUpPT57XG5hc3NlcnRLZXlFeGlzdHMoa2V5KTtcbndtLnNldChrZXksdmFsdWUpO1xuIH0sXG5kZWxldGU6KGtleSk9PntcbmFzc2VydEtleUV4aXN0cyhrZXkpO1xud20uZGVsZXRlKGtleSk7XG4gfX0pO1xuXG4gfTskaOKAjV9vbmNlLm1ha2VMZWdhY3lXZWFrTWFwKG1ha2VMZWdhY3lXZWFrTWFwKTtcbmhhcmRlbihtYWtlTGVnYWN5V2Vha01hcCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUxlZ2FjeVdlYWtNYXAiOlsibWFrZUxlZ2FjeVdlYWtNYXAiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAXpkLGxgzAAAYMwAAMwAAAEBhZ29yaWMvc3RvcmUtdjAuOC41L3NyYy9wYXR0ZXJucy9lbmNvZGVQYXNzYWJsZS5qc3siaW1wb3J0cyI6WyIuL3JhbmtPcmRlci5qcyIsIkBhZ29yaWMvYXNzZXJ0IiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbImlzRW5jb2RlZFJlbW90YWJsZSIsIm1ha2VEZWNvZGVQYXNzYWJsZSIsIm1ha2VFbmNvZGVQYXNzYWJsZSIsInplcm9QYWQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0LFgscSxwYXNzU3R5bGVPZixuYW1lRm9yUGFzc2FibGVTeW1ib2wscGFzc2FibGVTeW1ib2xGb3JOYW1lLGFzc2VydFJlY29yZCxnZXRUYWcsbWFrZVRhZ2dlZCxyZWNvcmRQYXJ0czskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2Fzc2VydFwiLCBbW1wiYXNzZXJ0XCIsIFskaOKAjV9hID0+IChhc3NlcnQgPSAkaOKAjV9hKV1dLFtcImRldGFpbHNcIiwgWyRo4oCNX2EgPT4gKFggPSAkaOKAjV9hKV1dLFtcInFcIiwgWyRo4oCNX2EgPT4gKHEgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXSxbXCJuYW1lRm9yUGFzc2FibGVTeW1ib2xcIiwgWyRo4oCNX2EgPT4gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9ICRo4oCNX2EpXV0sW1wicGFzc2FibGVTeW1ib2xGb3JOYW1lXCIsIFskaOKAjV9hID0+IChwYXNzYWJsZVN5bWJvbEZvck5hbWUgPSAkaOKAjV9hKV1dLFtcImFzc2VydFJlY29yZFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UmVjb3JkID0gJGjigI1fYSldXSxbXCJnZXRUYWdcIiwgWyRo4oCNX2EgPT4gKGdldFRhZyA9ICRo4oCNX2EpXV0sW1wibWFrZVRhZ2dlZFwiLCBbJGjigI1fYSA9PiAobWFrZVRhZ2dlZCA9ICRo4oCNX2EpXV1dXSxbXCIuL3JhbmtPcmRlci5qc1wiLCBbW1wicmVjb3JkUGFydHNcIiwgWyRo4oCNX2EgPT4gKHJlY29yZFBhcnRzID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3R7aXMsZnJvbUVudHJpZXN9PU9iamVjdDtcblxuY29uc3QgICAgICAgIHplcm9QYWQ9KG4sc2l6ZSk9PntcbmNvbnN0IG5TdHI9IGAke259YDtcbmFzc2VydChuU3RyLmxlbmd0aDw9c2l6ZSk7XG5jb25zdCBzdHI9IGAwMDAwMDAwMDAwMDAwMDAwMDAwMCR7blN0cn1gO1xuY29uc3QgcmVzdWx0PXN0ci5zdWJzdHJpbmcoc3RyLmxlbmd0aC1zaXplKTtcbmFzc2VydChyZXN1bHQubGVuZ3RoPT09c2l6ZSk7XG5yZXR1cm4gcmVzdWx0O1xuIH07JGjigI1fb25jZS56ZXJvUGFkKHplcm9QYWQpO1xuaGFyZGVuKHplcm9QYWQpO1xuXG4vKiBUaGlzIGlzIHRoZSBKYXZhU2NyaXB0IGFuYWxvZyB0byBhIEMgdW5pb246IGEgd2F5IHRvIG1hcCBiZXR3ZWVuIGEgZmxvYXQgYXMgYSovXG4vKiBudW1iZXIgYW5kIHRoZSBiaXRzIHRoYXQgcmVwcmVzZW50IHRoZSBmbG9hdCBhcyBhIGJ1ZmZlciBmdWxsIG9mIGJ5dGVzLiAgTm90ZSovXG4vKiB0aGF0IHRoZSBtdXRhdGlvbiBvZiBzdGF0aWMgc3RhdGUgaGVyZSBtYWtlcyB0aGlzIGludmFsaWQgSmVzc2llIGNvZGUsIGJ1dCovXG4vKiBkb2luZyBpdCB0aGlzIHdheSBzYXZlcyB0aGUgbnVnYXRvcnkgYW5kIGdyYXR1aXRvdXMgYWxsb2NhdGlvbnMgdGhhdCB3b3VsZCovXG4vKiBoYXBwZW4gZXZlcnkgdGltZSB5b3UgZG8gYSBjb252ZXJzaW9uIC0tIGFuZCBpbiBwcmFjdGljYWwgdGVybXMgaXQncyBzYWZlKi9cbi8qIGJlY2F1c2Ugd2UgcHV0IHRoZSB2YWx1ZSBpbiBvbmUgc2lkZSBhbmQgdGhlbiBpbW1lZGlhdGVseSB0YWtlIGl0IG91dCB0aGUqL1xuLyogb3RoZXI7IHRoZXJlIGlzIG5vIGFjdHVhbCBzdGF0ZSByZXRhaW5lZCBpbiB0aGUgY2xhc3NpYyBzZW5zZSBhbmQgdGh1cyBubyovXG4vKiByZS1lbnRyYW5jeSBpc3N1ZS4qL1xuY29uc3QgYXNOdW1iZXI9bmV3IEZsb2F0NjRBcnJheSgxKTtcbmNvbnN0IGFzQml0cz1uZXcgQmlnVWludDY0QXJyYXkoYXNOdW1iZXIuYnVmZmVyKTtcblxuLyogSmF2YVNjcmlwdCBudW1iZXJzIGFyZSBlbmNvZGVkIGJ5IG91dHB1dHRpbmcgdGhlIGJhc2UtMTYqL1xuLyogcmVwcmVzZW50YXRpb24gb2YgdGhlIGJpbmFyeSB2YWx1ZSBvZiB0aGUgdW5kZXJseWluZyBJRUVFIGZsb2F0aW5nIHBvaW50Ki9cbi8qIHJlcHJlc2VudGF0aW9uLiAgRm9yIG5lZ2F0aXZlIHZhbHVlcywgYWxsIGJpdHMgb2YgdGhpcyByZXByZXNlbnRhdGlvbiBhcmUqL1xuLyogY29tcGxlbWVudGVkIHByaW9yIHRvIHRoZSBiYXNlLTE2IGNvbnZlcnNpb24sIHdoaWxlIGZvciBwb3NpdGl2ZSB2YWx1ZXMsIHRoZSovXG4vKiBzaWduIGJpdCBpcyBjb21wbGVtZW50ZWQuICBUaGlzIGVuc3VyZXMgYm90aCB0aGF0IG5lZ2F0aXZlIHZhbHVlcyBzb3J0IGJlZm9yZSovXG4vKiBwb3NpdGl2ZSB2YWx1ZXMgYW5kIHRoYXQgbmVnYXRpdmUgdmFsdWVzIHNvcnQgYWNjb3JkaW5nIHRvIHRoZWlyIG5lZ2F0aXZlKi9cbi8qIG1hZ25pdHVkZSByYXRoZXIgdGhhbiB0aGVpciBwb3NpdGl2ZSBtYWduaXR1ZGUuICBUaGlzIHJlc3VsdHMgaW4gYW4gQVNDSUkqL1xuLyogZW5jb2Rpbmcgd2hvc2UgbGV4aWNvZ3JhcGhpYyBzb3J0IG9yZGVyIGlzIHRoZSBzYW1lIGFzIHRoZSBudW1lcmljIHNvcnQgb3JkZXIqL1xuLyogb2YgdGhlIGNvcnJlc3BvbmRpbmcgbnVtYmVycy4qL1xuXG4vKiBUT0RPIENob29zZSB0aGUgc2FtZSBjYW5vbmljYWwgTmFOIGVuY29kaW5nIHRoYXQgY29zbVdhc20gYW5kIGV3YXNtIGNob3NlLiovXG5jb25zdCBDYW5vbmljYWxOYU5CaXRzPSdmZmY4MDAwMDAwMDAwMDAwJztcblxuY29uc3QgZW5jb2RlQmluYXJ5NjQ9KG4pPT57XG4vKiBOb3JtYWxpemUgLTAgdG8gMCBhbmQgTmFOIHRvIGEgY2Fub25pY2FsIGVuY29kaW5nKi9cbmlmKGlzKG4sLTApKXtcbm49MDtcbiB9ZWxzZSBpZihpcyhuLE5hTikpe1xucmV0dXJuIGBmJHtDYW5vbmljYWxOYU5CaXRzfWA7XG4gfVxuYXNOdW1iZXJbMF09bjtcbmxldCBiaXRzPWFzQml0c1swXTtcbmlmKG48MCl7XG4vKiBYWFggV2h5IGlzIHRoZSBuby1iaXR3aXNlIGxpbnQgcnVsZSBldmVuIGEgdGhpbmc/PyovXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYml0d2lzZSovXG5iaXRzXj0weGZmZmZmZmZmZmZmZmZmZmZuO1xuIH1lbHNle1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWJpdHdpc2UqL1xuYml0c149MHg4MDAwMDAwMDAwMDAwMDAwbjtcbiB9XG5yZXR1cm4gYGYke3plcm9QYWQoYml0cy50b1N0cmluZygxNiksMTYpfWA7XG4gfTtcblxuY29uc3QgZGVjb2RlQmluYXJ5NjQ9KGVuY29kZWQpPT57XG5hc3NlcnQoZW5jb2RlZC5zdGFydHNXaXRoKCdmJyksWCBgRW5jb2RlZCBudW1iZXIgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gKTtcbmxldCBiaXRzPUJpZ0ludCggYDB4JHtlbmNvZGVkLnN1YnN0cmluZygxKX1gKTtcbmlmKGVuY29kZWRbMV08JzgnKXtcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1iaXR3aXNlKi9cbmJpdHNePTB4ZmZmZmZmZmZmZmZmZmZmZm47XG4gfWVsc2V7XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYml0d2lzZSovXG5iaXRzXj0weDgwMDAwMDAwMDAwMDAwMDBuO1xuIH1cbmFzQml0c1swXT1iaXRzO1xuY29uc3QgcmVzdWx0PWFzTnVtYmVyWzBdO1xuYXNzZXJ0KCFpcyhyZXN1bHQsLTApLFggYFVuZXhwZWN0ZWQgbmVnYXRpdmUgemVybzogJHtlbmNvZGVkfWApO1xucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG4vKiBKYXZhU2NyaXB0IGJpZ2ludHMgYXJlIGVuY29kZWQgdXNpbmcgYSB2YXJpYW50IG9mIEVsaWFzIGRlbHRhIGNvZGluZywgd2l0aCBhbiovXG4vKiBpbml0aWFsIGNvbXBvbmVudCBmb3IgdGhlIGxlbmd0aCBvZiB0aGUgZGlnaXQgY291bnQgYXMgYSB1bmFyeSBzdHJpbmcsIGEqL1xuLyogc2Vjb25kIGNvbXBvbmVudCBmb3IgdGhlIGRlY2ltYWwgZGlnaXQgY291bnQsIGFuZCBhIHRoaXJkIGNvbXBvbmVudCBmb3IgdGhlKi9cbi8qIGRlY2ltYWwgZGlnaXRzIHByZWNlZGVkIGJ5IGEgZ3JhdHVpdG91cyBzZXBhcmF0aW5nIGNvbG9uLiovXG4vKiBUbyBlbnN1cmUgdGhhdCB0aGUgbGV4aWNvZ3JhcGhpYyBzb3J0IG9yZGVyIG9mIGVuY29kZWQgdmFsdWVzIG1hdGNoZXMgdGhlKi9cbi8qIG51bWVyaWMgc29ydCBvcmRlciBvZiB0aGUgY29ycmVzcG9uZGluZyBudW1iZXJzLCB0aGUgY2hhcmFjdGVycyBvZiB0aGUgdW5hcnkqL1xuLyogcHJlZml4IGFyZSBkaWZmZXJlbnQgZm9yIG5lZ2F0aXZlIHZhbHVlcyAodHlwZSBcIm5cIiBmb2xsb3dlZCBieSBhbnkgbnVtYmVyIG9mKi9cbi8qIFwiI1wicyBbd2hpY2ggc29ydCBiZWZvcmUgZGVjaW1hbCBkaWdpdHNdKSB2cy4gcG9zaXRpdmUgYW5kIHplcm8gdmFsdWVzICh0eXBlKi9cbi8qIFwicFwiIGZvbGxvd2VkIGJ5IGFueSBudW1iZXIgb2YgXCJ+XCJzIFt3aGljaCBzb3J0IGFmdGVyIGRlY2ltYWwgZGlnaXRzXSkgYW5kKi9cbi8qIGVhY2ggZGVjaW1hbCBkaWdpdCBvZiB0aGUgZW5jb2RpbmcgZm9yIGEgbmVnYXRpdmUgdmFsdWUgaXMgcmVwbGFjZWQgd2l0aCBpdHMqL1xuLyogdGVuJ3MgY29tcGxlbWVudCAoc28gdGhhdCBuZWdhdGl2ZSB2YWx1ZXMgb2YgdGhlIHNhbWUgc2NhbGUgc29ydCBieSovXG4vKiAqZGVzY2VuZGluZyogYWJzb2x1dGUgdmFsdWUpLiovXG5jb25zdCBlbmNvZGVCaWdJbnQ9KG4pPT57XG5jb25zdCBhYnM9bjwwbj8tbjpuO1xuY29uc3QgbkRpZ2l0cz1hYnMudG9TdHJpbmcoKS5sZW5ndGg7XG5jb25zdCBsRGlnaXRzPW5EaWdpdHMudG9TdHJpbmcoKS5sZW5ndGg7XG5pZihuPDBuKXtcbnJldHVybiBgbiR7XG4vKiBBIFwiI1wiIGZvciBlYWNoIGRpZ2l0IGJleW9uZCB0aGUgZmlyc3QqL1xuLyogaW4gdGhlIGRlY2ltYWwgKmNvdW50KiBvZiBkZWNpbWFsIGRpZ2l0cy4qL1xuJyMnLnJlcGVhdChsRGlnaXRzLTEpXG4gfSR7XG4vKiBUaGUgdGVuJ3MgY29tcGxlbWVudCBvZiB0aGUgY291bnQgb2YgZGlnaXRzLiovXG4oMTAqKmxEaWdpdHMtbkRpZ2l0cykudG9TdHJpbmcoKS5wYWRTdGFydChsRGlnaXRzLCcwJylcbiB9OiR7XG4vKiBUaGUgdGVuJ3MgY29tcGxlbWVudCBvZiB0aGUgZGlnaXRzLiovXG4oMTBuKipCaWdJbnQobkRpZ2l0cykrbikudG9TdHJpbmcoKS5wYWRTdGFydChuRGlnaXRzLCcwJylcbiB9YDtcbiB9ZWxzZXtcbnJldHVybiBgcCR7XG4vKiBBIFwiflwiIGZvciBlYWNoIGRpZ2l0IGJleW9uZCB0aGUgZmlyc3QqL1xuLyogaW4gdGhlIGRlY2ltYWwgKmNvdW50KiBvZiBkZWNpbWFsIGRpZ2l0cy4qL1xuJ34nLnJlcGVhdChsRGlnaXRzLTEpXG4gfSR7XG4vKiBUaGUgY291bnQgb2YgZGlnaXRzLiovXG5uRGlnaXRzXG4gfToke1xuLyogVGhlIGRpZ2l0cy4qL1xublxuIH1gO1xuIH1cbiB9O1xuXG5jb25zdCBkZWNvZGVCaWdJbnQ9KGVuY29kZWQpPT57XG5jb25zdCB0eXBlUHJlZml4PWVuY29kZWRbMF07XG5sZXQgcmVtPWVuY29kZWQuc2xpY2UoMSk7XG50eXBlUHJlZml4PT09J3AnfHxcbnR5cGVQcmVmaXg9PT0nbid8fFxuYXNzZXJ0LmZhaWwoWCBgRW5jb2RlZCBiaWdpbnQgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gKTtcblxuY29uc3QgbERpZ2l0cz1yZW0uc2VhcmNoKC9bMC05XS8pKzE7XG5hc3NlcnQobERpZ2l0cz49MSxYIGBEaWdpdCBjb3VudCBleHBlY3RlZDogJHtlbmNvZGVkfWApO1xucmVtPXJlbS5zbGljZShsRGlnaXRzLTEpO1xuXG5hc3NlcnQocmVtLmxlbmd0aD49bERpZ2l0cyxYIGBDb21wbGV0ZSBkaWdpdCBjb3VudCBleHBlY3RlZDogJHtlbmNvZGVkfWApO1xuY29uc3Qgc25EaWdpdHM9cmVtLnNsaWNlKDAsbERpZ2l0cyk7XG5yZW09cmVtLnNsaWNlKGxEaWdpdHMpO1xuL15bMC05XSskLy50ZXN0KHNuRGlnaXRzKXx8XG5hc3NlcnQuZmFpbChYIGBEZWNpbWFsIGRpZ2l0IGNvdW50IGV4cGVjdGVkOiAke2VuY29kZWR9YCk7XG5sZXQgbkRpZ2l0cz1wYXJzZUludChzbkRpZ2l0cywxMCk7XG5pZih0eXBlUHJlZml4PT09J24nKXtcbi8qIFRPRE8gQXNzZXJ0IHRvIHJlamVjdCBmb3JiaWRkZW4gZW5jb2RpbmdzKi9cbi8qIGxpa2UgXCJuMDpcIiBhbmQgXCJuMDA64oCmXCIgYW5kIFwibjkxOuKAplwiIHRocm91Z2ggXCJuOTk64oCmXCI/Ki9cbm5EaWdpdHM9MTAqKmxEaWdpdHMtbkRpZ2l0cztcbiB9XG5cbmFzc2VydChyZW0uc3RhcnRzV2l0aCgnOicpLFggYFNlcGFyYXRvciBleHBlY3RlZDogJHtlbmNvZGVkfWApO1xucmVtPXJlbS5zbGljZSgxKTtcbnJlbS5sZW5ndGg9PT1uRGlnaXRzfHxcbmFzc2VydC5mYWlsKFggYEZpeGVkLWxlbmd0aCBkaWdpdCBzZXF1ZW5jZSBleHBlY3RlZDogJHtlbmNvZGVkfWApO1xubGV0IG49QmlnSW50KHJlbSk7XG5pZih0eXBlUHJlZml4PT09J24nKXtcbi8qIFRPRE8gQXNzZXJ0IHRvIHJlamVjdCBmb3JiaWRkZW4gZW5jb2RpbmdzKi9cbi8qIGxpa2UgXCJuOTowXCIgYW5kIFwibjg6MDBcIiBhbmQgXCJuODo5MVwiIHRocm91Z2ggXCJuODo5OVwiPyovXG5uPS0oMTBuKipCaWdJbnQobkRpZ2l0cyktbik7XG4gfVxuXG5yZXR1cm4gbjtcbiB9O1xuXG4vKiBgJ1xcdTAwMDAnYCBpcyB0aGUgdGVybWluYXRvciBhZnRlciBlbGVtZW50cy4qL1xuLyogYCdcXHUwMDAxJ2AgaXMgdGhlIGJhY2tzbGFzaC1saWtlIGVzY2FwZSBjaGFyYWN0ZXIsIGZvciovXG4vKiBlc2NhcGluZyBib3RoIG9mIHRoZXNlIGNoYXJhY3RlcnMuKi9cblxuY29uc3QgZW5jb2RlQXJyYXk9KGFycmF5LGVuY29kZVBhc3NhYmxlKT0+e1xuY29uc3QgY2hhcnM9WydbJ107XG5mb3IoY29uc3QgZWxlbWVudCBvZiBhcnJheSl7XG5jb25zdCBlbmM9ZW5jb2RlUGFzc2FibGUoZWxlbWVudCk7XG5mb3IoY29uc3QgYyBvZiBlbmMpe1xuaWYoYz09PSdcXHUwMDAwJ3x8Yz09PSdcXHUwMDAxJyl7XG5jaGFycy5wdXNoKCdcXHUwMDAxJyk7XG4gfVxuY2hhcnMucHVzaChjKTtcbiB9XG5jaGFycy5wdXNoKCdcXHUwMDAwJyk7XG4gfVxucmV0dXJuIGNoYXJzLmpvaW4oJycpO1xuIH07XG5cbmNvbnN0IGRlY29kZUFycmF5PShlbmNvZGVkLGRlY29kZVBhc3NhYmxlKT0+e1xuYXNzZXJ0KGVuY29kZWQuc3RhcnRzV2l0aCgnWycpLFggYEVuY29kZWQgYXJyYXkgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gKTtcbmNvbnN0IGVsZW1lbnRzPVtdO1xuY29uc3QgZWxlbUNoYXJzPVtdO1xuZm9yKGxldCBpPTE7aTxlbmNvZGVkLmxlbmd0aDtpKz0xKXtcbmNvbnN0IGM9ZW5jb2RlZFtpXTtcbmlmKGM9PT0nXFx1MDAwMCcpe1xuY29uc3QgZW5jb2RlZEVsZW1lbnQ9ZWxlbUNoYXJzLmpvaW4oJycpO1xuZWxlbUNoYXJzLmxlbmd0aD0wO1xuY29uc3QgZWxlbWVudD1kZWNvZGVQYXNzYWJsZShlbmNvZGVkRWxlbWVudCk7XG5lbGVtZW50cy5wdXNoKGVsZW1lbnQpO1xuIH1lbHNlIGlmKGM9PT0nXFx1MDAwMScpe1xuaSs9MTtcbmFzc2VydChpPGVuY29kZWQubGVuZ3RoLFggYHVuZXhwZWN0ZWQgZW5kIG9mIGVuY29kaW5nICR7ZW5jb2RlZH1gKTtcbmNvbnN0IGMyPWVuY29kZWRbaV07XG5jMj09PSdcXHUwMDAwJ3x8XG5jMj09PSdcXHUwMDAxJ3x8XG5hc3NlcnQuZmFpbChYIGBVbmV4cGVjdGVkIGNoYXJhY3RlciBhZnRlciB1MDAwMSBlc2NhcGU6ICR7YzJ9YCk7XG5lbGVtQ2hhcnMucHVzaChjMik7XG4gfWVsc2V7XG5lbGVtQ2hhcnMucHVzaChjKTtcbiB9XG4gfVxuYXNzZXJ0KGVsZW1DaGFycy5sZW5ndGg9PT0wLFggYGVuY29kaW5nIHRlcm1pbmF0ZWQgZWFybHk6ICR7ZW5jb2RlZH1gKTtcbnJldHVybiBoYXJkZW4oZWxlbWVudHMpO1xuIH07XG5cbmNvbnN0IGVuY29kZVJlY29yZD0ocmVjb3JkLGVuY29kZVBhc3NhYmxlKT0+e1xuY29uc3RbbmFtZXMsdmFsdWVzXT1yZWNvcmRQYXJ0cyhyZWNvcmQpO1xucmV0dXJuIGAoJHtlbmNvZGVBcnJheShoYXJkZW4oW25hbWVzLHZhbHVlc10pLGVuY29kZVBhc3NhYmxlKX1gO1xuIH07XG5cbmNvbnN0IGRlY29kZVJlY29yZD0oZW5jb2RlZCxkZWNvZGVQYXNzYWJsZSk9PntcbmFzc2VydChlbmNvZGVkLnN0YXJ0c1dpdGgoJygnKSk7XG5jb25zdCBrZXlzdmFscz1kZWNvZGVBcnJheShlbmNvZGVkLnN1YnN0cmluZygxKSxkZWNvZGVQYXNzYWJsZSk7XG5hc3NlcnQoa2V5c3ZhbHMubGVuZ3RoPT09MixYIGBleHBlY3RlZCBrZXlzLHZhbHVlcyBwYWlyOiAke2VuY29kZWR9YCk7XG5jb25zdFtrZXlzLHZhbHNdPWtleXN2YWxzO1xuYXNzZXJ0KFxucGFzc1N0eWxlT2Yoa2V5cyk9PT0nY29weUFycmF5JyYmXG5wYXNzU3R5bGVPZih2YWxzKT09PSdjb3B5QXJyYXknJiZcbmtleXMubGVuZ3RoPT09dmFscy5sZW5ndGgmJlxua2V5cy5ldmVyeSgoa2V5KT0+dHlwZW9mIGtleT09PSdzdHJpbmcnKSxcblggYG5vdCBhIHZhbGlkIHJlY29yZCBlbmNvZGluZzogJHtlbmNvZGVkfWApO1xuXG5jb25zdCBlbnRyaWVzPWtleXMubWFwKChrZXksaSk9PltrZXksdmFsc1tpXV0pO1xuY29uc3QgcmVjb3JkPWhhcmRlbihmcm9tRW50cmllcyhlbnRyaWVzKSk7XG5hc3NlcnRSZWNvcmQocmVjb3JkLCdkZWNvZGVkIHJlY29yZCcpO1xucmV0dXJuIHJlY29yZDtcbiB9O1xuXG5jb25zdCBlbmNvZGVUYWdnZWQ9KHRhZ2dlZCxlbmNvZGVQYXNzYWJsZSk9PlxuIGA6JHtlbmNvZGVBcnJheShoYXJkZW4oW2dldFRhZyh0YWdnZWQpLHRhZ2dlZC5wYXlsb2FkXSksZW5jb2RlUGFzc2FibGUpfWA7XG5cbmNvbnN0IGRlY29kZVRhZ2dlZD0oZW5jb2RlZCxkZWNvZGVQYXNzYWJsZSk9PntcbmFzc2VydChlbmNvZGVkLnN0YXJ0c1dpdGgoJzonKSk7XG5jb25zdCB0YWdwYXlsb2FkPWRlY29kZUFycmF5KGVuY29kZWQuc3Vic3RyaW5nKDEpLGRlY29kZVBhc3NhYmxlKTtcbmFzc2VydCh0YWdwYXlsb2FkLmxlbmd0aD09PTIsWCBgZXhwZWN0ZWQgdGFnLHBheWxvYWQgcGFpcjogJHtlbmNvZGVkfWApO1xuY29uc3RbdGFnLHBheWxvYWRdPXRhZ3BheWxvYWQ7XG5wYXNzU3R5bGVPZih0YWcpPT09J3N0cmluZyd8fFxuYXNzZXJ0LmZhaWwoWCBgbm90IGEgdmFsaWQgdGFnZ2VkIGVuY29kaW5nOiAke2VuY29kZWR9YCk7XG5yZXR1cm4gbWFrZVRhZ2dlZCh0YWcscGF5bG9hZCk7XG4gfTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBFbmNvZGVPcHRpb25zUmVjb3JkXG4gKiBAcHJvcGVydHkgeyhyZW1vdGFibGU6IG9iamVjdCkgPT4gc3RyaW5nfSBlbmNvZGVSZW1vdGFibGVcbiAqIEBwcm9wZXJ0eSB7KHByb21pc2U6IG9iamVjdCkgPT4gc3RyaW5nfSBlbmNvZGVQcm9taXNlXG4gKiBAcHJvcGVydHkgeyhlcnJvcjogb2JqZWN0KSA9PiBzdHJpbmd9IGVuY29kZUVycm9yXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7UGFydGlhbDxFbmNvZGVPcHRpb25zUmVjb3JkPn0gRW5jb2RlT3B0aW9uc1xuICovXG5cbi8qKlxuICogQHBhcmFtIHtFbmNvZGVPcHRpb25zPX0gZW5jb2RlT3B0aW9uc1xuICogQHJldHVybnMgeyhwYXNzYWJsZTogUGFzc2FibGUpID0+IHN0cmluZ31cbiAqL1xuY29uc3QgICAgICAgIG1ha2VFbmNvZGVQYXNzYWJsZT0oe1xuZW5jb2RlUmVtb3RhYmxlPShyZW0pPT5hc3NlcnQuZmFpbChYIGByZW1vdGFibGUgdW5leHBlY3RlZDogJHtyZW19YCksXG5lbmNvZGVQcm9taXNlPShwcm9tKT0+YXNzZXJ0LmZhaWwoWCBgcHJvbWlzZSB1bmV4cGVjdGVkOiAke3Byb219YCksXG5lbmNvZGVFcnJvcj0oZXJyKT0+YXNzZXJ0LmZhaWwoWCBgZXJyb3IgdW5leHBlY3RlZDogJHtlcnJ9YCl9PVxue30pPT57XG5jb25zdCBlbmNvZGVQYXNzYWJsZT0ocGFzc2FibGUpPT57XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YocGFzc2FibGUpO1xuc3dpdGNoKHBhc3NTdHlsZSl7XG5jYXNlJ251bGwnOntcbnJldHVybid2JztcbiB9XG5jYXNlJ3VuZGVmaW5lZCc6e1xucmV0dXJuJ3onO1xuIH1cbmNhc2UnbnVtYmVyJzp7XG5yZXR1cm4gZW5jb2RlQmluYXJ5NjQocGFzc2FibGUpO1xuIH1cbmNhc2Unc3RyaW5nJzp7XG5yZXR1cm4gYHMke3Bhc3NhYmxlfWA7XG4gfVxuY2FzZSdib29sZWFuJzp7XG5yZXR1cm4gYGIke3Bhc3NhYmxlfWA7XG4gfVxuY2FzZSdiaWdpbnQnOntcbnJldHVybiBlbmNvZGVCaWdJbnQocGFzc2FibGUpO1xuIH1cbmNhc2UncmVtb3RhYmxlJzp7XG5jb25zdCByZXN1bHQ9ZW5jb2RlUmVtb3RhYmxlKHBhc3NhYmxlKTtcbnJlc3VsdC5zdGFydHNXaXRoKCdyJyl8fFxuYXNzZXJ0LmZhaWwoXG5YIGBpbnRlcm5hbDogUmVtb3RhYmxlIGVuY29kaW5nIG11c3Qgc3RhcnQgd2l0aCBcInJcIjogJHtyZXN1bHR9YCk7XG5cbnJldHVybiByZXN1bHQ7XG4gfVxuY2FzZSdlcnJvcic6e1xuY29uc3QgcmVzdWx0PWVuY29kZUVycm9yKHBhc3NhYmxlKTtcbnJlc3VsdC5zdGFydHNXaXRoKCchJyl8fFxuYXNzZXJ0LmZhaWwoXG5YIGBpbnRlcm5hbDogRXJyb3IgZW5jb2RpbmcgbXVzdCBzdGFydCB3aXRoIFwiIVwiOiAke3Jlc3VsdH1gKTtcblxucmV0dXJuIHJlc3VsdDtcbiB9XG5jYXNlJ3Byb21pc2UnOntcbmNvbnN0IHJlc3VsdD1lbmNvZGVQcm9taXNlKHBhc3NhYmxlKTtcbnJlc3VsdC5zdGFydHNXaXRoKCc/Jyl8fFxuYXNzZXJ0LmZhaWwoXG5YIGBpbnRlcm5hbDogUHJvbWlzZSBlbmNvZGluZyBtdXN0IHN0YXJ0IHdpdGggXCJwXCI6ICR7cmVzdWx0fWApO1xuXG5yZXR1cm4gcmVzdWx0O1xuIH1cbmNhc2Unc3ltYm9sJzp7XG5yZXR1cm4gYHkke25hbWVGb3JQYXNzYWJsZVN5bWJvbChwYXNzYWJsZSl9YDtcbiB9XG5jYXNlJ2NvcHlBcnJheSc6e1xucmV0dXJuIGVuY29kZUFycmF5KHBhc3NhYmxlLGVuY29kZVBhc3NhYmxlKTtcbiB9XG5jYXNlJ2NvcHlSZWNvcmQnOntcbnJldHVybiBlbmNvZGVSZWNvcmQocGFzc2FibGUsZW5jb2RlUGFzc2FibGUpO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5yZXR1cm4gZW5jb2RlVGFnZ2VkKHBhc3NhYmxlLGVuY29kZVBhc3NhYmxlKTtcbiB9XG5kZWZhdWx0OntcbmFzc2VydC5mYWlsKFxuWCBgYSAke3EocGFzc1N0eWxlKX0gY2Fubm90IGJlIHVzZWQgYXMgYSBjb2xsZWN0aW9uIHBhc3NhYmxlYCk7XG5cbiB9fVxuXG4gfTtcbnJldHVybiBoYXJkZW4oZW5jb2RlUGFzc2FibGUpO1xuIH07JGjigI1fb25jZS5tYWtlRW5jb2RlUGFzc2FibGUobWFrZUVuY29kZVBhc3NhYmxlKTtcbmhhcmRlbihtYWtlRW5jb2RlUGFzc2FibGUpO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IERlY29kZU9wdGlvbnNSZWNvcmRcbiAqIEBwcm9wZXJ0eSB7KGVuY29kZWRSZW1vdGFibGU6IHN0cmluZykgPT4gb2JqZWN0fSBkZWNvZGVSZW1vdGFibGVcbiAqIEBwcm9wZXJ0eSB7KGVuY29kZWRQcm9taXNlOiBzdHJpbmcpID0+IFByb21pc2V9IGRlY29kZVByb21pc2VcbiAqIEBwcm9wZXJ0eSB7KGVuY29kZWRFcnJvcjogc3RyaW5nKSA9PiBFcnJvcn0gZGVjb2RlRXJyb3JcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtQYXJ0aWFsPERlY29kZU9wdGlvbnNSZWNvcmQ+fSBEZWNvZGVPcHRpb25zXG4gKi9cblxuLyoqXG4gKiBAcGFyYW0ge0RlY29kZU9wdGlvbnM9fSBkZWNvZGVPcHRpb25zXG4gKiBAcmV0dXJucyB7KGVuY29kZWQ6IHN0cmluZykgPT4gUGFzc2FibGV9XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlRGVjb2RlUGFzc2FibGU9KHtcbmRlY29kZVJlbW90YWJsZT0ocmVtKT0+YXNzZXJ0LmZhaWwoWCBgcmVtb3RhYmxlIHVuZXhwZWN0ZWQ6ICR7cmVtfWApLFxuZGVjb2RlUHJvbWlzZT0ocHJvbSk9PmFzc2VydC5mYWlsKFggYHByb21pc2UgdW5leHBlY3RlZDogJHtwcm9tfWApLFxuZGVjb2RlRXJyb3I9KGVycik9PmFzc2VydC5mYWlsKFggYGVycm9yIHVuZXhwZWN0ZWQ6ICR7ZXJyfWApfT1cbnt9KT0+e1xuY29uc3QgZGVjb2RlUGFzc2FibGU9KGVuY29kZWQpPT57XG5zd2l0Y2goZW5jb2RlZFswXSl7XG5jYXNlJ3YnOntcbnJldHVybiBudWxsO1xuIH1cbmNhc2Uneic6e1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG5jYXNlJ2YnOntcbnJldHVybiBkZWNvZGVCaW5hcnk2NChlbmNvZGVkKTtcbiB9XG5jYXNlJ3MnOntcbnJldHVybiBlbmNvZGVkLnN1YnN0cmluZygxKTtcbiB9XG5jYXNlJ2InOntcbnJldHVybiBlbmNvZGVkLnN1YnN0cmluZygxKSE9PSdmYWxzZSc7XG4gfVxuY2FzZSduJzpcbmNhc2UncCc6e1xucmV0dXJuIGRlY29kZUJpZ0ludChlbmNvZGVkKTtcbiB9XG5jYXNlJ3InOntcbnJldHVybiBkZWNvZGVSZW1vdGFibGUoZW5jb2RlZCk7XG4gfVxuY2FzZSc/Jzp7XG5yZXR1cm4gZGVjb2RlUHJvbWlzZShlbmNvZGVkKTtcbiB9XG5jYXNlJyEnOntcbnJldHVybiBkZWNvZGVFcnJvcihlbmNvZGVkKTtcbiB9XG5jYXNlJ3knOntcbnJldHVybiBwYXNzYWJsZVN5bWJvbEZvck5hbWUoZW5jb2RlZC5zdWJzdHJpbmcoMSkpO1xuIH1cbmNhc2UnWyc6e1xucmV0dXJuIGRlY29kZUFycmF5KGVuY29kZWQsZGVjb2RlUGFzc2FibGUpO1xuIH1cbmNhc2UnKCc6e1xucmV0dXJuIGRlY29kZVJlY29yZChlbmNvZGVkLGRlY29kZVBhc3NhYmxlKTtcbiB9XG5jYXNlJzonOntcbnJldHVybiBkZWNvZGVUYWdnZWQoZW5jb2RlZCxkZWNvZGVQYXNzYWJsZSk7XG4gfVxuZGVmYXVsdDp7XG5hc3NlcnQuZmFpbChYIGBpbnZhbGlkIGRhdGFiYXNlIGtleTogJHtlbmNvZGVkfWApO1xuIH19XG5cbiB9O1xucmV0dXJuIGhhcmRlbihkZWNvZGVQYXNzYWJsZSk7XG4gfTskaOKAjV9vbmNlLm1ha2VEZWNvZGVQYXNzYWJsZShtYWtlRGVjb2RlUGFzc2FibGUpO1xuaGFyZGVuKG1ha2VEZWNvZGVQYXNzYWJsZSk7XG5cbmNvbnN0ICAgICAgICBpc0VuY29kZWRSZW1vdGFibGU9KGVuY29kZWQpPT5lbmNvZGVkWzBdPT09J3InOyRo4oCNX29uY2UuaXNFbmNvZGVkUmVtb3RhYmxlKGlzRW5jb2RlZFJlbW90YWJsZSk7XG5oYXJkZW4oaXNFbmNvZGVkUmVtb3RhYmxlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJ6ZXJvUGFkIjpbInplcm9QYWQiXSwibWFrZUVuY29kZVBhc3NhYmxlIjpbIm1ha2VFbmNvZGVQYXNzYWJsZSJdLCJtYWtlRGVjb2RlUGFzc2FibGUiOlsibWFrZURlY29kZVBhc3NhYmxlIl0sImlzRW5jb2RlZFJlbW90YWJsZSI6WyJpc0VuY29kZWRSZW1vdGFibGUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAADHGOAdovAADaLwAANAAAAEBhZ29yaWMvc3RvcmUtdjAuOC41L3NyYy9wYXR0ZXJucy9pbnRlcmZhY2UtdG9vbHMuanN7ImltcG9ydHMiOlsiLi9wYXR0ZXJuTWF0Y2hlcnMuanMiLCJAYWdvcmljL2ludGVybmFsIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJkZWZlbmRQcm90b3R5cGUiLCJkZWZpbmVIZWFwRmFyQ2xhc3MiLCJkZWZpbmVIZWFwRmFyQ2xhc3NLaXQiLCJpbml0RW1wdHkiLCJtYWtlSGVhcEZhckluc3RhbmNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEZhcixFLGxpc3REaWZmZXJlbmNlLG9iamVjdE1hcCxmaXQ7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsXCIsIFtbXCJsaXN0RGlmZmVyZW5jZVwiLCBbJGjigI1fYSA9PiAobGlzdERpZmZlcmVuY2UgPSAkaOKAjV9hKV1dLFtcIm9iamVjdE1hcFwiLCBbJGjigI1fYSA9PiAob2JqZWN0TWFwID0gJGjigI1fYSldXV1dLFtcIi4vcGF0dGVybk1hdGNoZXJzLmpzXCIsIFtbXCJmaXRcIiwgWyRo4oCNX2EgPT4gKGZpdCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuY29uc3R7ZGV0YWlsczpYLHF1b3RlOnF9PWFzc2VydDtcbmNvbnN0e2FwcGx5LG93bktleXN9PVJlZmxlY3Q7XG5jb25zdHtkZWZpbmVQcm9wZXJ0aWVzLHNlYWwsZnJlZXplfT1PYmplY3Q7XG5cbmNvbnN0IGRlZmVuZFN5bmNBcmdzPShhcmdzLG1ldGhvZEd1YXJkLGxhYmVsKT0+e1xuY29uc3R7YXJnR3VhcmRzLG9wdGlvbmFsQXJnR3VhcmRzLHJlc3RBcmdHdWFyZH09bWV0aG9kR3VhcmQ7XG5pZihhcmdzLmxlbmd0aDxhcmdHdWFyZHMubGVuZ3RoKXtcbmFzc2VydC5mYWlsKFxuWCBgJHtsYWJlbH0gYXJnczogJHthcmdzfSAtIGV4cGVjdGVkICR7YXJnR3VhcmRzLmxlbmd0aH0gYXJndW1lbnRzYCk7XG5cbiB9XG5mb3IobGV0IGk9MDtpPGFyZ3MubGVuZ3RoO2krPTEpe1xuY29uc3QgYXJnPWFyZ3NbaV07XG5jb25zdCBhcmdMYWJlbD0gYCR7bGFiZWx9IGFyZyAke2l9YDtcbmlmKGk8YXJnR3VhcmRzLmxlbmd0aCl7XG5maXQoYXJnLGFyZ0d1YXJkc1tpXSxhcmdMYWJlbCk7XG4gfWVsc2UgaWYoXG5vcHRpb25hbEFyZ0d1YXJkcyYmXG5pPGFyZ0d1YXJkcy5sZW5ndGgrb3B0aW9uYWxBcmdHdWFyZHMubGVuZ3RoKVxue1xuaWYoYXJnIT09dW5kZWZpbmVkKXtcbi8qIEluIHRoZSBvcHRpb25hbCBzZWN0aW9uLCBhbiBgdW5kZWZpbmVkYCBhcmcgc3VjY2VlZHMqL1xuLyogdW5jb25kaXRpb25hbGx5Ki9cbmZpdChhcmcsb3B0aW9uYWxBcmdHdWFyZHNbaS1hcmdHdWFyZHMubGVuZ3RoXSxhcmdMYWJlbCk7XG4gfVxuIH1lbHNlIGlmKHJlc3RBcmdHdWFyZCl7XG5jb25zdCByZXN0QXJnPWhhcmRlbihhcmdzLnNsaWNlKGkpKTtcbmZpdChyZXN0QXJnLHJlc3RBcmdHdWFyZCwgYCR7bGFiZWx9IHJlc3RbJHtpfV1gKTtcbnJldHVybjtcbiB9ZWxzZXtcbmFzc2VydC5mYWlsKFxuWCBgJHthcmdMYWJlbH06ICR7YXJnc30gLSBleHBlY3RlZCBmZXdlciB0aGFuICR7aSsxfSBhcmd1bWVudHNgKTtcblxuIH1cbiB9XG5pZihyZXN0QXJnR3VhcmQpe1xuZml0KGhhcmRlbihbXSkscmVzdEFyZ0d1YXJkLCBgJHtsYWJlbH0gcmVzdFtdYCk7XG4gfVxuIH07XG5cbi8qKlxuICogQHBhcmFtIHtNZXRob2R9IG1ldGhvZFxuICogQHBhcmFtIHtNZXRob2RHdWFyZH0gbWV0aG9kR3VhcmRcbiAqIEBwYXJhbSB7c3RyaW5nfSBsYWJlbFxuICogQHJldHVybnMge01ldGhvZH1cbiAqL1xuY29uc3QgZGVmZW5kU3luY01ldGhvZD0obWV0aG9kLG1ldGhvZEd1YXJkLGxhYmVsKT0+e1xuY29uc3R7cmV0dXJuR3VhcmR9PW1ldGhvZEd1YXJkO1xuY29uc3R7c3luY01ldGhvZH09e1xuLyogTm90ZSBwdXJwb3NlZnVsIHVzZSBvZiBgdGhpc2AgYW5kIGNvbmNpc2UgbWV0aG9kIHN5bnRheCovXG5zeW5jTWV0aG9kKC4uLmFyZ3Mpe1xuZGVmZW5kU3luY0FyZ3MoaGFyZGVuKGFyZ3MpLG1ldGhvZEd1YXJkLGxhYmVsKTtcbmNvbnN0IHJlc3VsdD1hcHBseShtZXRob2QsdGhpcyxhcmdzKTtcbmZpdChoYXJkZW4ocmVzdWx0KSxyZXR1cm5HdWFyZCwgYCR7bGFiZWx9OiByZXN1bHRgKTtcbnJldHVybiByZXN1bHQ7XG4gfX07XG5cbnJldHVybiBzeW5jTWV0aG9kO1xuIH07XG5cbmNvbnN0IGlzQXdhaXRBcmdHdWFyZD0oYXJnR3VhcmQpPT5cbmFyZ0d1YXJkJiZ0eXBlb2YgYXJnR3VhcmQ9PT0nb2JqZWN0JyYmYXJnR3VhcmQua2xhc3M9PT0nYXdhaXRBcmcnO1xuXG5jb25zdCBkZXN5bmM9KG1ldGhvZEd1YXJkKT0+e1xuY29uc3R7YXJnR3VhcmRzLG9wdGlvbmFsQXJnR3VhcmRzPVtdLHJlc3RBcmdHdWFyZH09bWV0aG9kR3VhcmQ7XG4haXNBd2FpdEFyZ0d1YXJkKHJlc3RBcmdHdWFyZCl8fFxuYXNzZXJ0LmZhaWwoWCBgUmVzdCBhcmdzIG1heSBub3QgYmUgYXdhaXRlZDogJHtyZXN0QXJnR3VhcmR9YCk7XG5jb25zdCByYXdBcmdHdWFyZHM9Wy4uLmFyZ0d1YXJkcywuLi5vcHRpb25hbEFyZ0d1YXJkc107XG5cbmNvbnN0IGF3YWl0SW5kZXhlcz1bXTtcbmZvcihsZXQgaT0wO2k8cmF3QXJnR3VhcmRzLmxlbmd0aDtpKz0xKXtcbmNvbnN0IGFyZ0d1YXJkPXJhd0FyZ0d1YXJkc1tpXTtcbmlmKGlzQXdhaXRBcmdHdWFyZChhcmdHdWFyZCkpe1xucmF3QXJnR3VhcmRzW2ldPWFyZ0d1YXJkLmFyZ0d1YXJkO1xuYXdhaXRJbmRleGVzLnB1c2goaSk7XG4gfVxuIH1cbnJldHVybntcbmF3YWl0SW5kZXhlcyxcbnJhd01ldGhvZEd1YXJkOntcbmFyZ0d1YXJkczpyYXdBcmdHdWFyZHMuc2xpY2UoMCxhcmdHdWFyZHMubGVuZ3RoKSxcbm9wdGlvbmFsQXJnR3VhcmRzOnJhd0FyZ0d1YXJkcy5zbGljZShhcmdHdWFyZHMubGVuZ3RoKSxcbnJlc3RBcmdHdWFyZH19O1xuXG5cbiB9O1xuXG5jb25zdCBkZWZlbmRBc3luY01ldGhvZD0obWV0aG9kLG1ldGhvZEd1YXJkLGxhYmVsKT0+e1xuY29uc3R7cmV0dXJuR3VhcmR9PW1ldGhvZEd1YXJkO1xuY29uc3R7YXdhaXRJbmRleGVzLHJhd01ldGhvZEd1YXJkfT1kZXN5bmMobWV0aG9kR3VhcmQpO1xuY29uc3R7YXN5bmNNZXRob2R9PXtcbi8qIE5vdGUgcHVycG9zZWZ1bCB1c2Ugb2YgYHRoaXNgIGFuZCBjb25jaXNlIG1ldGhvZCBzeW50YXgqL1xuYXN5bmNNZXRob2QoLi4uYXJncyl7XG5jb25zdCBhd2FpdExpc3Q9YXdhaXRJbmRleGVzLm1hcCgoaSk9PmFyZ3NbaV0pO1xuY29uc3QgcD1Qcm9taXNlLmFsbChhd2FpdExpc3QpO1xuY29uc3QgcmF3QXJncz1bLi4uYXJnc107XG5jb25zdCByZXN1bHRQPUUud2hlbihwLChhd2FpdGVkQXJncyk9PntcbmZvcihsZXQgaj0wO2o8YXdhaXRJbmRleGVzLmxlbmd0aDtqKz0xKXtcbnJhd0FyZ3NbYXdhaXRJbmRleGVzW2pdXT1hd2FpdGVkQXJnc1tqXTtcbiB9XG5kZWZlbmRTeW5jQXJncyhyYXdBcmdzLHJhd01ldGhvZEd1YXJkLGxhYmVsKTtcbnJldHVybiBhcHBseShtZXRob2QsdGhpcyxyYXdBcmdzKTtcbiB9KTtcbnJldHVybiBFLndoZW4ocmVzdWx0UCwocmVzdWx0KT0+e1xuZml0KGhhcmRlbihyZXN1bHQpLHJldHVybkd1YXJkLCBgJHtsYWJlbH06IHJlc3VsdGApO1xucmV0dXJuIHJlc3VsdDtcbiB9KTtcbiB9fTtcblxucmV0dXJuIGFzeW5jTWV0aG9kO1xuIH07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7TWV0aG9kfSBtZXRob2RcbiAqIEBwYXJhbSB7TWV0aG9kR3VhcmR9IG1ldGhvZEd1YXJkXG4gKiBAcGFyYW0ge3N0cmluZ30gbGFiZWxcbiAqL1xuY29uc3QgZGVmZW5kTWV0aG9kPShtZXRob2QsbWV0aG9kR3VhcmQsbGFiZWwpPT57XG5jb25zdHtrbGFzcyxjYWxsS2luZH09bWV0aG9kR3VhcmQ7XG5hc3NlcnQoa2xhc3M9PT0nbWV0aG9kR3VhcmQnKTtcbmlmKGNhbGxLaW5kPT09J3N5bmMnKXtcbnJldHVybiBkZWZlbmRTeW5jTWV0aG9kKG1ldGhvZCxtZXRob2RHdWFyZCxsYWJlbCk7XG4gfWVsc2V7XG5hc3NlcnQoY2FsbEtpbmQ9PT0nYXN5bmMnKTtcbnJldHVybiBkZWZlbmRBc3luY01ldGhvZChtZXRob2QsbWV0aG9kR3VhcmQsbGFiZWwpO1xuIH1cbiB9O1xuXG4vKipcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kVGFnXG4gKiBAcGFyYW0ge1dlYWtNYXB9IGNvbnRleHRNYXBcbiAqIEBwYXJhbSB7TWV0aG9kfSBiZWhhdmlvck1ldGhvZFxuICogQHBhcmFtIHtib29sZWFufSBbdGhpc2Z1bE1ldGhvZHNdXG4gKiBAcGFyYW0ge01ldGhvZEd1YXJkfSBbbWV0aG9kR3VhcmRdXG4gKi9cbmNvbnN0IGJpbmRNZXRob2Q9KFxubWV0aG9kVGFnLFxuY29udGV4dE1hcCxcbmJlaGF2aW9yTWV0aG9kLFxudGhpc2Z1bE1ldGhvZHM9ZmFsc2UsXG5tZXRob2RHdWFyZD11bmRlZmluZWQpPT5cbntcbmFzc2VydC50eXBlb2YoYmVoYXZpb3JNZXRob2QsJ2Z1bmN0aW9uJyk7XG5cbmNvbnN0IGdldENvbnRleHQ9KHNlbGYpPT57XG5jb25zdCBjb250ZXh0PWNvbnRleHRNYXAuZ2V0KHNlbGYpO1xuY29udGV4dHx8XG5hc3NlcnQuZmFpbChcblggYCR7cShtZXRob2RUYWcpfSBtYXkgb25seSBiZSBhcHBsaWVkIHRvIGEgdmFsaWQgaW5zdGFuY2U6ICR7c2VsZn1gKTtcblxucmV0dXJuIGNvbnRleHQ7XG4gfTtcblxuLyogVmlvbGF0aW5nIGFsbCBKZXNzaWUgcnVsZXMgdG8gY3JlYXRlIHJlcHJlc2VudGF0aXZlcyB0aGF0IGluaGVyaXQqL1xuLyogbWV0aG9kcyBmcm9tIGEgc2hhcmVkIHByb3RvdHlwZS4gVGhlIGJvdW5kIG1ldGhvZCB0aGVyZWZvcmUgbmVlZHMqL1xuLyogdG8gbWVudGlvbiBgdGhpc2AuIFdlIGRlZmluZSBpdCB1c2luZyBjb25jaXNlIG1ldGhvZCBzeW50YXgqL1xuLyogc28gdGhhdCBpdCB3aWxsIGJlIGB0aGlzYCBzZW5zaXRpdmUgYnV0IG5vdCBjb25zdHJ1Y3RhYmxlLiovXG4vKiovXG4vKiBXZSBub3JtYWxseSBjb25zaWRlciBgdGhpc2AgdW5zYWZlIGJlY2F1c2Ugb2YgdGhlIGhhemFyZCBvZiBhKi9cbi8qIG1ldGhvZCBvZiBvbmUgYWJzdHJhY3Rpb24gYmVpbmcgYXBwbGllZCB0byBhbiBpbnN0YW5jZSBvZiovXG4vKiBhbm90aGVyIGFic3RyYWN0aW9uLiBUbyBwcmV2ZW50IHRoYXQgYXR0YWNrLCB0aGUgYm91bmQgbWV0aG9kKi9cbi8qIGNoZWNrcyB0aGF0IGl0cyBgdGhpc2AgaXMgaW4gdGhlIG1hcCBpbiB3aGljaCBpdHMgcmVwcmVzZW50YXRpdmVzKi9cbi8qIGFyZSByZWdpc3RlcmVkLiovXG5sZXR7bWV0aG9kfT10aGlzZnVsTWV0aG9kcz9cbntcbm1ldGhvZCguLi5hcmdzKXtcbmNvbnN0IGNvbnRleHQ9Z2V0Q29udGV4dCh0aGlzKTtcbnJldHVybiBhcHBseShiZWhhdmlvck1ldGhvZCxjb250ZXh0LGFyZ3MpO1xuIH19OlxuXG57XG5tZXRob2QoLi4uYXJncyl7XG5jb25zdCBjb250ZXh0PWdldENvbnRleHQodGhpcyk7XG5yZXR1cm4gYXBwbHkoYmVoYXZpb3JNZXRob2QsbnVsbCxbY29udGV4dCwuLi5hcmdzXSk7XG4gfX07XG5cbmlmKG1ldGhvZEd1YXJkKXtcbm1ldGhvZD1kZWZlbmRNZXRob2QobWV0aG9kLG1ldGhvZEd1YXJkLG1ldGhvZFRhZyk7XG4gfVxuZGVmaW5lUHJvcGVydGllcyhtZXRob2Qse1xubmFtZTp7dmFsdWU6bWV0aG9kVGFnfSxcbmxlbmd0aDp7XG52YWx1ZTp0aGlzZnVsTWV0aG9kcz9iZWhhdmlvck1ldGhvZC5sZW5ndGg6YmVoYXZpb3JNZXRob2QubGVuZ3RoLTF9fSk7XG5cblxucmV0dXJuIG1ldGhvZDtcbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgTWV0aG9kPn0gVFxuICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICogQHBhcmFtIHtXZWFrTWFwfSBjb250ZXh0TWFwXG4gKiBAcGFyYW0ge1R9IGJlaGF2aW9yTWV0aG9kc1xuICogQHBhcmFtIHtib29sZWFufSBbdGhpc2Z1bE1ldGhvZHNdXG4gKiBAcGFyYW0ge0ludGVyZmFjZUd1YXJkfSBbaW50ZXJmYWNlR3VhcmRdXG4gKiBAcmV0dXJucyB7VCAmIFhpbXBvcnQoJ0BlbmRvL2V2ZW50dWFsLXNlbmQnKS5SZW1vdGFibGVCcmFuZDx7fSwgVD59XG4gKi9cbmNvbnN0ICAgICAgICBkZWZlbmRQcm90b3R5cGU9KFxudGFnLFxuY29udGV4dE1hcCxcbmJlaGF2aW9yTWV0aG9kcyxcbnRoaXNmdWxNZXRob2RzPWZhbHNlLFxuaW50ZXJmYWNlR3VhcmQ9dW5kZWZpbmVkKT0+XG57XG5jb25zdCBwcm90b3R5cGU9e307XG5jb25zdCBtZXRob2ROYW1lcz1vd25LZXlzKGJlaGF2aW9yTWV0aG9kcykuZmlsdGVyKFxuLyogQnkgaWdub3JpbmcgYW55IG1ldGhvZCBuYW1lZCBcImNvbnN0cnVjdG9yXCIsIHdlIGNhbiB1c2UgYSovXG4vKiBjbGFzcy5wcm90b3R5cGUgYXMgYSBiZWhhdmlvck1ldGhvZHMuKi9cbihuYW1lKT0+bmFtZSE9PSdjb25zdHJ1Y3RvcicpO1xuXG5sZXQgbWV0aG9kR3VhcmRzO1xuaWYoaW50ZXJmYWNlR3VhcmQpe1xuY29uc3R7XG5rbGFzcyxcbmludGVyZmFjZU5hbWUsXG5tZXRob2RHdWFyZHM6bWcsXG5zbG9wcHk9ZmFsc2V9PVxuaW50ZXJmYWNlR3VhcmQ7XG5tZXRob2RHdWFyZHM9bWc7XG5hc3NlcnQuZXF1YWwoa2xhc3MsJ0ludGVyZmFjZScpO1xuYXNzZXJ0LnR5cGVvZihpbnRlcmZhY2VOYW1lLCdzdHJpbmcnKTtcbntcbmNvbnN0IG1ldGhvZEd1YXJkTmFtZXM9b3duS2V5cyhtZXRob2RHdWFyZHMpO1xuY29uc3QgdW5pbXBsZW1lbnRlZD1saXN0RGlmZmVyZW5jZShtZXRob2RHdWFyZE5hbWVzLG1ldGhvZE5hbWVzKTtcbnVuaW1wbGVtZW50ZWQubGVuZ3RoPT09MHx8XG5hc3NlcnQuZmFpbChcblggYG1ldGhvZHMgJHtxKHVuaW1wbGVtZW50ZWQpfSBub3QgaW1wbGVtZW50ZWQgYnkgJHtxKHRhZyl9YCk7XG5cbmlmKCFzbG9wcHkpe1xuY29uc3QgdW5ndWFyZGVkPWxpc3REaWZmZXJlbmNlKG1ldGhvZE5hbWVzLG1ldGhvZEd1YXJkTmFtZXMpO1xudW5ndWFyZGVkLmxlbmd0aD09PTB8fFxuYXNzZXJ0LmZhaWwoXG5YIGBtZXRob2RzICR7cSh1bmd1YXJkZWQpfSBub3QgZ3VhcmRlZCBieSAke3EoaW50ZXJmYWNlTmFtZSl9YCk7XG5cbiB9XG4gfVxuIH1cbmZvcihjb25zdCBwcm9wIG9mIG1ldGhvZE5hbWVzKXtcbnByb3RvdHlwZVtwcm9wXT1iaW5kTWV0aG9kKFxuIGBJbiAke3EocHJvcCl9IG1ldGhvZCBvZiAoJHt0YWd9KWAsXG5jb250ZXh0TWFwLFxuYmVoYXZpb3JNZXRob2RzW3Byb3BdLFxudGhpc2Z1bE1ldGhvZHMsXG4vKiBUT0RPIHNvbWUgdG9vbCBkb2VzIG5vdCB5ZXQgdW5kZXJzdGFuZCB0aGUgYD8uW2Agc3ludGF4Ki9cbm1ldGhvZEd1YXJkcyYmbWV0aG9kR3VhcmRzW3Byb3BdKTtcblxuIH1cbi8qIEB0cy1leHBlY3QtZXJyb3IgY291bGQgYmUgaW5zdGFudGlhdGVkIHdpdGggZGlmZmVyZW50IHN1YnR5cGUqL1xucmV0dXJuIEZhcih0YWcscHJvdG90eXBlKTtcbiB9OyRo4oCNX29uY2UuZGVmZW5kUHJvdG90eXBlKGRlZmVuZFByb3RvdHlwZSk7XG5oYXJkZW4oZGVmZW5kUHJvdG90eXBlKTtcblxuY29uc3QgZW1wdHlSZWNvcmQ9aGFyZGVuKHt9KTtcblxuLyoqXG4gKiBXaGVuIGNhbGxpbmcgYGRlZmluZUR1cmFibGVLaW5kYCBhbmRcbiAqIGl0cyBzaWJsaW5ncywgdXNlZCBhcyB0aGUgYGluaXRgIGZ1bmN0aW9uIGFyZ3VtZW50IHRvIGluZGljYXRlIHRoYXQgdGhlXG4gKiBzdGF0ZSByZWNvcmQgb2YgdGhlICh2aXJ0dWFsL2R1cmFibGUpIGluc3RhbmNlcyBvZiB0aGUga2luZC9mYXJDbGFzc1xuICogc2hvdWxkIGJlIGVtcHR5LCBhbmQgdGhhdCB0aGUgcmV0dXJuZWQgbWFrZXIgZnVuY3Rpb24gc2hvdWxkIGhhdmUgemVyb1xuICogcGFyYW1ldGVycy5cbiAqXG4gKiBAcmV0dXJucyB7e319XG4gKi9cbmNvbnN0ICAgICAgICBpbml0RW1wdHk9KCk9PmVtcHR5UmVjb3JkO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBbUyA9IGFueV1cbiAqIEB0ZW1wbGF0ZSBbVCA9IGFueV1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IENvbnRleHRcbiAqIEBwcm9wZXJ0eSB7U30gc3RhdGVcbiAqIEBwcm9wZXJ0eSB7VH0gc2VsZlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIEFcbiAqIEB0ZW1wbGF0ZSBTXG4gKiBAdGVtcGxhdGUge3t9fSBUXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gKiBAcGFyYW0ge2FueX0gaW50ZXJmYWNlR3VhcmRcbiAqIEBwYXJhbSB7KC4uLmFyZ3M6IEFbXSkgPT4gU30gaW5pdFxuICogQHBhcmFtIHtUfSBtZXRob2RzXG4gKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7KC4uLmFyZ3M6IEFbXSkgPT4gKFQgJiBYaW1wb3J0KCdAZW5kby9ldmVudHVhbC1zZW5kJykuUmVtb3RhYmxlQnJhbmQ8e30sIFQ+KX1cbiAqLyRo4oCNX29uY2UuaW5pdEVtcHR5KGluaXRFbXB0eSk7XG5jb25zdCAgICAgICAgZGVmaW5lSGVhcEZhckNsYXNzPShcbnRhZyxcbmludGVyZmFjZUd1YXJkLFxuaW5pdCxcbm1ldGhvZHMsXG5vcHRpb25zPXVuZGVmaW5lZCk9Plxue1xuLyoqIEB0eXBlIHtXZWFrTWFwPFQsQ29udGV4dDxTLCBUPj59ICovXG5jb25zdCBjb250ZXh0TWFwPW5ldyBXZWFrTWFwKCk7XG5jb25zdCBwcm90b3R5cGU9ZGVmZW5kUHJvdG90eXBlKFxudGFnLFxuY29udGV4dE1hcCxcbm1ldGhvZHMsXG50cnVlLFxuaW50ZXJmYWNlR3VhcmQpO1xuXG5jb25zdCBtYWtlSW5zdGFuY2U9KC4uLmFyZ3MpPT57XG4vKiBCZSBjYXJlZnVsIG5vdCB0byBmcmVlemUgdGhlIHN0YXRlIHJlY29yZCovXG5jb25zdCBzdGF0ZT1zZWFsKGluaXQoLi4uYXJncykpO1xuLyoqIEB0eXBlIHtUfSAqL1xuLyogQHRzLWV4cGVjdC1lcnJvciBjb3VsZCBiZSBpbnN0YW50aWF0ZWQgd2l0aCBkaWZmZXJlbnQgc3VidHlwZSovXG5jb25zdCBzZWxmPWhhcmRlbih7X19wcm90b19fOnByb3RvdHlwZX0pO1xuLyogQmUgY2FyZWZ1bCBub3QgdG8gZnJlZXplIHRoZSBzdGF0ZSByZWNvcmQqL1xuLyoqIEB0eXBlIHtDb250ZXh0PFMsVD59ICovXG5jb25zdCBjb250ZXh0PWZyZWV6ZSh7c3RhdGUsc2VsZn0pO1xuY29udGV4dE1hcC5zZXQoc2VsZixjb250ZXh0KTtcbmlmKG9wdGlvbnMpe1xuY29uc3R7ZmluaXNoPXVuZGVmaW5lZH09b3B0aW9ucztcbmlmKGZpbmlzaCl7XG5maW5pc2goY29udGV4dCk7XG4gfVxuIH1cbnJldHVybiBzZWxmO1xuIH07XG4vKiBAdHMtZXhwZWN0LWVycm9yIGNvdWxkIGJlIGluc3RhbnRpYXRlZCB3aXRoIGRpZmZlcmVudCBzdWJ0eXBlKi9cbnJldHVybiBoYXJkZW4obWFrZUluc3RhbmNlKTtcbiB9OyRo4oCNX29uY2UuZGVmaW5lSGVhcEZhckNsYXNzKGRlZmluZUhlYXBGYXJDbGFzcyk7XG5oYXJkZW4oZGVmaW5lSGVhcEZhckNsYXNzKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgQVxuICogQHRlbXBsYXRlIFNcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gRlxuICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICogQHBhcmFtIHthbnl9IGludGVyZmFjZUd1YXJkS2l0XG4gKiBAcGFyYW0geyguLi5hcmdzOiBBW10pID0+IFN9IGluaXRcbiAqIEBwYXJhbSB7Rn0gbWV0aG9kc0tpdFxuICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXVxuICogQHJldHVybnMgeyguLi5hcmdzOiBBW10pID0+IEZ9XG4gKi9cbmNvbnN0ICAgICAgICBkZWZpbmVIZWFwRmFyQ2xhc3NLaXQ9KFxudGFnLFxuaW50ZXJmYWNlR3VhcmRLaXQsXG5pbml0LFxubWV0aG9kc0tpdCxcbm9wdGlvbnM9dW5kZWZpbmVkKT0+XG57XG5jb25zdCBmYWNldE5hbWVzPW93bktleXMobWV0aG9kc0tpdCk7XG5jb25zdCBpbnRlcmZhY2VOYW1lcz1vd25LZXlzKGludGVyZmFjZUd1YXJkS2l0KTtcbmNvbnN0IGV4dHJhSW50ZXJmYWNlTmFtZXM9bGlzdERpZmZlcmVuY2UoZmFjZXROYW1lcyxpbnRlcmZhY2VOYW1lcyk7XG5leHRyYUludGVyZmFjZU5hbWVzLmxlbmd0aD09PTB8fFxuYXNzZXJ0LmZhaWwoXG5YIGBJbnRlcmZhY2VzICR7cShleHRyYUludGVyZmFjZU5hbWVzKX0gbm90IGltcGxlbWVudGVkIGJ5ICR7cSh0YWcpfWApO1xuXG5jb25zdCBleHRyYUZhY2V0TmFtZXM9bGlzdERpZmZlcmVuY2UoaW50ZXJmYWNlTmFtZXMsZmFjZXROYW1lcyk7XG5leHRyYUZhY2V0TmFtZXMubGVuZ3RoPT09MHx8XG5hc3NlcnQuZmFpbChcblggYEZhY2V0cyAke3EoZXh0cmFGYWNldE5hbWVzKX0gb2YgJHtxKHRhZyl9IG5vdCBndWFyZGVkIGJ5IGludGVyZmFjZXNgKTtcblxuXG5jb25zdCBjb250ZXh0TWFwS2l0PW9iamVjdE1hcChtZXRob2RzS2l0LCgpPT5uZXcgV2Vha01hcCgpKTtcbmNvbnN0IHByb3RvdHlwZUtpdD1vYmplY3RNYXAobWV0aG9kc0tpdCwobWV0aG9kcyxmYWNldE5hbWUpPT5cbmRlZmVuZFByb3RvdHlwZShcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLXRzLWV4cGVjdC1lcnJvciAtLSBkaWZmZXJlbnQgcGVyIHBhY2thZ2UgIzQ2MjAqL1xuLyogQHRzLWlnbm9yZSBjb3VsZCBiZSBzeW1ib2wqL1xuIGAke3RhZ30gJHtmYWNldE5hbWV9YCxcbmNvbnRleHRNYXBLaXRbZmFjZXROYW1lXSxcbm1ldGhvZHMsXG50cnVlLFxuaW50ZXJmYWNlR3VhcmRLaXRbZmFjZXROYW1lXSkpO1xuXG5cbmNvbnN0IG1ha2VJbnN0YW5jZUtpdD0oLi4uYXJncyk9Pntcbi8qIEJlIGNhcmVmdWwgbm90IHRvIGZyZWV6ZSB0aGUgc3RhdGUgcmVjb3JkKi9cbmNvbnN0IHN0YXRlPXNlYWwoaW5pdCguLi5hcmdzKSk7XG4vKiBEb24ndCBmcmVlemUgY29udGV4dCB1bnRpbCB3ZSBhZGQgZmFjZXRzKi9cbmNvbnN0IGNvbnRleHQ9e3N0YXRlfTtcbmNvbnN0IGZhY2V0cz1vYmplY3RNYXAocHJvdG90eXBlS2l0LChwcm90b3R5cGUsZmFjZXROYW1lKT0+e1xuY29uc3Qgc2VsZj1oYXJkZW4oe19fcHJvdG9fXzpwcm90b3R5cGV9KTtcbmNvbnRleHRNYXBLaXRbZmFjZXROYW1lXS5zZXQoc2VsZixjb250ZXh0KTtcbnJldHVybiBzZWxmO1xuIH0pO1xuY29udGV4dC5mYWNldHM9ZmFjZXRzO1xuLyogQmUgY2FyZWZ1bCBub3QgdG8gZnJlZXplIHRoZSBzdGF0ZSByZWNvcmQqL1xuZnJlZXplKGNvbnRleHQpO1xuaWYob3B0aW9ucyl7XG5jb25zdHtmaW5pc2g9dW5kZWZpbmVkfT1vcHRpb25zO1xuaWYoZmluaXNoKXtcbmZpbmlzaChjb250ZXh0KTtcbiB9XG4gfVxucmV0dXJuIGZhY2V0cztcbiB9O1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItdHMtZXhwZWN0LWVycm9yIC0tIGRpZmZlcmVudCBwZXIgcGFja2FnZSAjNDYyMCovXG4vKiBAdHMtaWdub3JlIHh4eCovXG5yZXR1cm4gaGFyZGVuKG1ha2VJbnN0YW5jZUtpdCk7XG4gfTskaOKAjV9vbmNlLmRlZmluZUhlYXBGYXJDbGFzc0tpdChkZWZpbmVIZWFwRmFyQ2xhc3NLaXQpO1xuaGFyZGVuKGRlZmluZUhlYXBGYXJDbGFzc0tpdCk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nLCBNZXRob2Q+fSBUXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gKiBAcGFyYW0ge0ludGVyZmFjZUd1YXJkIHwgdW5kZWZpbmVkfSBpbnRlcmZhY2VHdWFyZCBDQVZFQVQ6IHN0YXRpYyB0eXBpbmcgZG9lcyBub3QgeWV0IHN1cHBvcnQgYGNhbGxXaGVuYCB0cmFuc2Zvcm1hdGlvblxuICogQHBhcmFtIHtUfSBtZXRob2RzXG4gKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7VCAmIFhpbXBvcnQoJ0BlbmRvL2V2ZW50dWFsLXNlbmQnKS5SZW1vdGFibGVCcmFuZDx7fSwgVD59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlSGVhcEZhckluc3RhbmNlPShcbnRhZyxcbmludGVyZmFjZUd1YXJkLFxubWV0aG9kcyxcbm9wdGlvbnM9dW5kZWZpbmVkKT0+XG57XG5jb25zdCBtYWtlSW5zdGFuY2U9ZGVmaW5lSGVhcEZhckNsYXNzKFxudGFnLFxuaW50ZXJmYWNlR3VhcmQsXG5pbml0RW1wdHksXG5tZXRob2RzLFxub3B0aW9ucyk7XG5cbnJldHVybiBtYWtlSW5zdGFuY2UoKTtcbiB9OyRo4oCNX29uY2UubWFrZUhlYXBGYXJJbnN0YW5jZShtYWtlSGVhcEZhckluc3RhbmNlKTtcbmhhcmRlbihtYWtlSGVhcEZhckluc3RhbmNlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZlbmRQcm90b3R5cGUiOlsiZGVmZW5kUHJvdG90eXBlIl0sImluaXRFbXB0eSI6WyJpbml0RW1wdHkiXSwiZGVmaW5lSGVhcEZhckNsYXNzIjpbImRlZmluZUhlYXBGYXJDbGFzcyJdLCJkZWZpbmVIZWFwRmFyQ2xhc3NLaXQiOlsiZGVmaW5lSGVhcEZhckNsYXNzS2l0Il0sIm1ha2VIZWFwRmFySW5zdGFuY2UiOlsibWFrZUhlYXBGYXJJbnN0YW5jZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACC7OmyxwcAAMcHAAAzAAAAQGFnb3JpYy9zdG9yZS12MC44LjUvc3JjL3BhdHRlcm5zL2ludGVybmFsLXR5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQHRzLWNoZWNrKi9cblxuLyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIi8+Ki9cblxuLyogVE9ETyovXG4vKiBUaGUgZm9sbG93aW5nIGNvbW1lbnRlZCBvdXQgdHlwZSBzaG91bGQgYmUgaW4gdGhpcyBmaWxlLCBzaW5jZSB0aGUqL1xuLyogYE1hdGNoSGVscGVyYCB0eXBlIGlzIHB1cmVseSBpbnRlcm5hbCB0byB0aGlzIHBhY2thZ2UuIEhvd2V2ZXIsKi9cbi8qIGluIG9yZGVyIHRvIGdldCB0aGUgZ292ZXJuYW5jZSBhbmQgc29sbyBwYWNrYWdlcyBib3RoIHRvIHBhc3MgbGludCwqL1xuLyogSSBtb3ZlZCB0aGUgdHlwZSBkZWNsYXJhdGlvbiBpdHNlbGYgdG8gdHlwZXMuanMuIFNlZSB0aGUgY29tbWVudHMgdGhlcmUqL1xuLyogYW5kIGluIGV4cG9ydHMuanMqL1xuXG4vKiAvKioqL1xuLyogKiBAdHlwZWRlZiB7b2JqZWN0fSBNYXRjaEhlbHBlciovXG4vKiAqIFRoaXMgZmFjdG9ycyBvdXQgb25seSB0aGUgcGFydHMgc3BlY2lmaWMgdG8gZWFjaCBraW5kIG9mIE1hdGNoZXIuIEl0IGlzKi9cbi8qICogZW5jYXBzdWxhdGVkLCBhbmQgaXRzIG1ldGhvZHMgY2FuIG1ha2UgdGhlIHN0YXRlZCB1bmNoZWNrZXIgYXNzdW1wdGlvbnMqL1xuLyogKiBlbmZvcmNlZCBieSB0aGUgY29tbW9uIGNhbGxpbmcgbG9naWMuKi9cbi8qICoqL1xuLyogKiBAcHJvcGVydHkgeyhhbGxlZ2VkUGF5bG9hZDogUGFzc2FibGUsKi9cbi8qICogICAgICAgICAgICAgY2hlY2s6IENoZWNrZXIqL1xuLyogKiApID0+IGJvb2xlYW59IGNoZWNrSXNXZWxsRm9ybWVkKi9cbi8qICogQXNzdW1lcyB0aGlzIGlzIHRoZSBwYXlsb2FkIG9mIGEgQ29weVRhZ2dlZCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nKi9cbi8qICogbWF0Y2hUYWcuIElzIHRoaXMgYSB2YWxpZCBwYXlsb2FkIGZvciBhIE1hdGNoZXIgd2l0aCB0aGF0IHRhZz8qL1xuLyogKiovXG4vKiAqIEBwcm9wZXJ0eSB7KHNwZWNpbWVuOiBQYXNzYWJsZSwqL1xuLyogKiAgICAgICAgICAgICBtYXRjaGVyUGF5bG9hZDogUGFzc2FibGUsKi9cbi8qICogICAgICAgICAgICAgY2hlY2s6IENoZWNrZXIqL1xuLyogKiApID0+IGJvb2xlYW59IGNoZWNrTWF0Y2hlcyovXG4vKiAqIEFzc3VtaW5nIGEgdmFsaWQgTWF0Y2hlciBvZiB0aGlzIHR5cGUgd2l0aCBgbWF0Y2hlclBheWxvYWRgIGFzIGl0cyovXG4vKiAqIHBheWxvYWQsIGRvZXMgdGhpcyBzcGVjaW1lbiBtYXRjaCB0aGF0IE1hdGNoZXI/Ki9cbi8qICoqL1xuLyogKiBAcHJvcGVydHkgeyhwYXlsb2FkOiBQYXNzYWJsZSkgPT4gUmFua0NvdmVyfSBnZXRSYW5rQ292ZXIqL1xuLyogKiBBc3N1bWVzIHRoaXMgaXMgdGhlIHBheWxvYWQgb2YgYSBDb3B5VGFnZ2VkIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcqL1xuLyogKiBtYXRjaFRhZy4gUmV0dXJuIGEgUmFua0NvdmVyIHRvIGJvdW5kIGZyb20gYmVsb3cgYW5kIGFib3ZlLCovXG4vKiAqIGluIHJhbmsgb3JkZXIsIGFsbCBwb3NzaWJsZSBQYXNzYWJsZXMgdGhhdCB3b3VsZCBtYXRjaCB0aGlzIE1hdGNoZXIuKi9cbi8qICogVGhlIGxlZnQgZWxlbWVudCBtdXN0IGJlIGJlZm9yZSBvciB0aGUgc2FtZSByYW5rIGFzIGFueSBwb3NzaWJsZSovXG4vKiAqIG1hdGNoaW5nIHNwZWNpbWVuLiBUaGUgcmlnaHQgZWxlbWVudCBtdXN0IGJlIGFmdGVyIG9yIHRoZSBzYW1lKi9cbi8qICogcmFuayBhcyBhbnkgcG9zc2libGUgbWF0Y2hpbmcgc3BlY2ltZW4uKi9cbi8qICpYLyovXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAK8fzRmXtgAAl7YAADQAAABAYWdvcmljL3N0b3JlLXYwLjguNS9zcmMvcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzeyJpbXBvcnRzIjpbIi4uL2tleXMvY2hlY2tLZXkuanMiLCIuLi9rZXlzL2NvbXBhcmVLZXlzLmpzIiwiLi9yYW5rT3JkZXIuanMiLCJAYWdvcmljL2Fzc2VydCIsIkBhZ29yaWMvaW50ZXJuYWwiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsiTSIsImFzc2VydEtleVBhdHRlcm4iLCJhc3NlcnRQYXR0ZXJuIiwiY2hlY2tNYXRjaGVzIiwiZGVmYXVsdExpbWl0cyIsImZpdCIsImdldFJhbmtDb3ZlciIsImlzS2V5UGF0dGVybiIsImlzUGF0dGVybiIsIm1hdGNoZXMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0Q2hlY2tlcixGYXIsZ2V0VGFnLG1ha2VUYWdnZWQscGFzc1N0eWxlT2YsaGFzT3duUHJvcGVydHlPZixuYW1lRm9yUGFzc2FibGVTeW1ib2wsaWRlbnRDaGVja2VyLGFwcGx5TGFiZWxpbmdFcnJvcixsaXN0RGlmZmVyZW5jZSxjb21wYXJlUmFuayxnZXRQYXNzU3R5bGVDb3ZlcixpbnRlcnNlY3RSYW5rQ292ZXJzLHJlY29yZFBhcnRzLHVuaW9uUmFua0NvdmVycyxrZXlFUSxrZXlHVCxrZXlHVEUsa2V5TFQsa2V5TFRFLGFzc2VydEtleSxjaGVja0tleSxpc0tleSxjaGVja1NjYWxhcktleSxpc1NjYWxhcktleSxjaGVja0NvcHlTZXQsY2hlY2tDb3B5TWFwLGNvcHlNYXBLZXlTZXQsY2hlY2tDb3B5QmFnOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dLFtcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXSxbXCJnZXRUYWdcIiwgWyRo4oCNX2EgPT4gKGdldFRhZyA9ICRo4oCNX2EpXV0sW1wibWFrZVRhZ2dlZFwiLCBbJGjigI1fYSA9PiAobWFrZVRhZ2dlZCA9ICRo4oCNX2EpXV0sW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXSxbXCJoYXNPd25Qcm9wZXJ0eU9mXCIsIFskaOKAjV9hID0+IChoYXNPd25Qcm9wZXJ0eU9mID0gJGjigI1fYSldXSxbXCJuYW1lRm9yUGFzc2FibGVTeW1ib2xcIiwgWyRo4oCNX2EgPT4gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL2Fzc2VydFwiLCBbW1wiaWRlbnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChpZGVudENoZWNrZXIgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbFwiLCBbW1wiYXBwbHlMYWJlbGluZ0Vycm9yXCIsIFskaOKAjV9hID0+IChhcHBseUxhYmVsaW5nRXJyb3IgPSAkaOKAjV9hKV1dLFtcImxpc3REaWZmZXJlbmNlXCIsIFskaOKAjV9hID0+IChsaXN0RGlmZmVyZW5jZSA9ICRo4oCNX2EpXV1dXSxbXCIuL3JhbmtPcmRlci5qc1wiLCBbW1wiY29tcGFyZVJhbmtcIiwgWyRo4oCNX2EgPT4gKGNvbXBhcmVSYW5rID0gJGjigI1fYSldXSxbXCJnZXRQYXNzU3R5bGVDb3ZlclwiLCBbJGjigI1fYSA9PiAoZ2V0UGFzc1N0eWxlQ292ZXIgPSAkaOKAjV9hKV1dLFtcImludGVyc2VjdFJhbmtDb3ZlcnNcIiwgWyRo4oCNX2EgPT4gKGludGVyc2VjdFJhbmtDb3ZlcnMgPSAkaOKAjV9hKV1dLFtcInJlY29yZFBhcnRzXCIsIFskaOKAjV9hID0+IChyZWNvcmRQYXJ0cyA9ICRo4oCNX2EpXV0sW1widW5pb25SYW5rQ292ZXJzXCIsIFskaOKAjV9hID0+ICh1bmlvblJhbmtDb3ZlcnMgPSAkaOKAjV9hKV1dXV0sW1wiLi4va2V5cy9jb21wYXJlS2V5cy5qc1wiLCBbW1wia2V5RVFcIiwgWyRo4oCNX2EgPT4gKGtleUVRID0gJGjigI1fYSldXSxbXCJrZXlHVFwiLCBbJGjigI1fYSA9PiAoa2V5R1QgPSAkaOKAjV9hKV1dLFtcImtleUdURVwiLCBbJGjigI1fYSA9PiAoa2V5R1RFID0gJGjigI1fYSldXSxbXCJrZXlMVFwiLCBbJGjigI1fYSA9PiAoa2V5TFQgPSAkaOKAjV9hKV1dLFtcImtleUxURVwiLCBbJGjigI1fYSA9PiAoa2V5TFRFID0gJGjigI1fYSldXV1dLFtcIi4uL2tleXMvY2hlY2tLZXkuanNcIiwgW1tcImFzc2VydEtleVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0S2V5ID0gJGjigI1fYSldXSxbXCJjaGVja0tleVwiLCBbJGjigI1fYSA9PiAoY2hlY2tLZXkgPSAkaOKAjV9hKV1dLFtcImlzS2V5XCIsIFskaOKAjV9hID0+IChpc0tleSA9ICRo4oCNX2EpXV0sW1wiY2hlY2tTY2FsYXJLZXlcIiwgWyRo4oCNX2EgPT4gKGNoZWNrU2NhbGFyS2V5ID0gJGjigI1fYSldXSxbXCJpc1NjYWxhcktleVwiLCBbJGjigI1fYSA9PiAoaXNTY2FsYXJLZXkgPSAkaOKAjV9hKV1dLFtcImNoZWNrQ29weVNldFwiLCBbJGjigI1fYSA9PiAoY2hlY2tDb3B5U2V0ID0gJGjigI1fYSldXSxbXCJjaGVja0NvcHlNYXBcIiwgWyRo4oCNX2EgPT4gKGNoZWNrQ29weU1hcCA9ICRo4oCNX2EpXV0sW1wiY29weU1hcEtleVNldFwiLCBbJGjigI1fYSA9PiAoY29weU1hcEtleVNldCA9ICRo4oCNX2EpXV0sW1wiY2hlY2tDb3B5QmFnXCIsIFskaOKAjV9hID0+IChjaGVja0NvcHlCYWcgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qLyA8cmVmZXJlbmNlIHR5cGVzPVwic2VzXCIvPiovXG5cbmNvbnN0e3F1b3RlOnEsZGV0YWlsczpYfT1hc3NlcnQ7XG5jb25zdHtlbnRyaWVzLHZhbHVlc309T2JqZWN0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcblxuLyoqIEB0eXBlIFdlYWtTZXQ8UGF0dGVybj4gKi9cbmNvbnN0IHBhdHRlcm5NZW1vPW5ldyBXZWFrU2V0KCk7XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIE1hdGNoIEhlbHBlcnMgSGVscGVycyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKiBGb3IgZm9yd2FyZCByZWZlcmVuY2VzIHRvIGBNYCAqL1xubGV0IE1NO1xuXG4vKipcbiAqIFRoZSBhY3R1YWwgZGVmYXVsdCB2YWx1ZXMgaGVyZSBhcmUsIGF0IHRoZSBwcmVzZW50IHRpbWUsIGZhaXJseVxuICogYXJiaXRyYXJ5IGNob2ljZXMgYW5kIG1heSBjaGFuZ2UgYmVmb3JlIHRoZXkgc2V0dGxlIGRvd24uIE9mIGNvdXJzZVxuICogYXQgc29tZSBwb2ludCB3ZSdsbCBuZWVkIHRvIHN0b3AgY2hhbmdpbmcgdGhlbS4gQnV0IHdlIHNob3VsZCBmaXJzdFxuICogc2VlIGhvdyBvdXIgc3lzdGVtIGhvbGRzIHVwIHdpdGggdGhlc2UgY2hvaWNlcy4gVGhlIG1haW4gY3JpdGVyaWFcbiAqIGlzIHRoYXQgdGhleSBiZSBiaWcgZW5vdWdoIHRoYXQgXCJub3JtYWxcIiBpbm5vY2VudCBwcm9ncmFtcyByYXJlbHlcbiAqIGVuY291bnRlciB0aGVzZSBsaW1pdHMuXG4gKlxuICogRXhwb3J0ZWQgcHJpbWFyaWx5IGZvciB0ZXN0aW5nLlxuICovXG5jb25zdCAgICAgICAgZGVmYXVsdExpbWl0cz1oYXJkZW4oe1xuZGVjaW1hbERpZ2l0c0xpbWl0OjEwMCxcbnN0cmluZ0xlbmd0aExpbWl0OjEwMF8wMDAsXG5zeW1ib2xOYW1lTGVuZ3RoTGltaXQ6MTAwLFxubnVtUHJvcGVydGllc0xpbWl0OjgwLFxucHJvcGVydHlOYW1lTGVuZ3RoTGltaXQ6MTAwLFxuYXJyYXlMZW5ndGhMaW1pdDoxMF8wMDAsXG5udW1TZXRFbGVtZW50c0xpbWl0OjEwXzAwMCxcbm51bVVuaXF1ZUJhZ0VsZW1lbnRzTGltaXQ6MTBfMDAwLFxubnVtTWFwRW50cmllc0xpbWl0OjUwMDB9KTtcblxuXG4vKipcbiAqIFVzZSB0aGUgcmVzdWx0IG9ubHkgdG8gZ2V0IHRoZSBsaW1pdHMgeW91IG5lZWQgYnkgZGVzdHJ1Y3R1cmluZy5cbiAqIFRodXMsIHRoZSByZXN1bHQgb25seSBuZWVkcyB0byBzdXBwb3J0IGRlc3RydWN0dXJpbmcuIFRoZSBjdXJyZW50XG4gKiBpbXBsZW1lbnRhdGlvbiB1c2VzIGluaGVyaXRhbmNlIGFzIGEgY2hlYXAgaGFjay5cbiAqXG4gKiBAcGFyYW0ge0xpbWl0c30gW2xpbWl0c11cbiAqIEByZXR1cm5zIHtBbGxMaW1pdHN9XG4gKi8kaOKAjV9vbmNlLmRlZmF1bHRMaW1pdHMoZGVmYXVsdExpbWl0cyk7XG5jb25zdCBsaW1pdD0obGltaXRzPXt9KT0+XG4vKiogQHR5cGUge0FsbExpbWl0c30gKi9oYXJkZW4oe19fcHJvdG9fXzpkZWZhdWx0TGltaXRzLC4uLmxpbWl0c30pO1xuXG5jb25zdCBjaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdD0oXG5wYXlsb2FkLFxubWFpblBheWxvYWRTaGFwZSxcbmNoZWNrLFxubGFiZWwpPT5cbntcbmFzc2VydChBcnJheS5pc0FycmF5KG1haW5QYXlsb2FkU2hhcGUpKTtcbmlmKCFBcnJheS5pc0FycmF5KHBheWxvYWQpKXtcbnJldHVybiBjaGVjayhmYWxzZSxYIGAke3EobGFiZWwpfSBwYXlsb2FkIG11c3QgYmUgYW4gYXJyYXk6ICR7cGF5bG9hZH1gKTtcbiB9XG5cbi8qIFdhcyB0aGUgZm9sbG93aW5nLCBidXQgaXRzIG92ZXJ1c2Ugb2YgcGF0dGVybnMgY2F1c2VkIGFuIGluZmluaXRlIHJlZ3Jlc3MqL1xuLyogY29uc3QgcGF5bG9hZExpbWl0U2hhcGUgPSBoYXJkZW4oKi9cbi8qIE0uc3BsaXQoKi9cbi8qIG1haW5QYXlsb2FkU2hhcGUsKi9cbi8qIE0ucGFydGlhbChoYXJkZW4oW00ucmVjb3JkT2YoTS5zdHJpbmcoKSwgTS5udW1iZXIoKSldKSwgaGFyZGVuKFtdKSksKi9cbi8qICksKi9cbi8qICk7Ki9cbi8qIHJldHVybiBjaGVja01hdGNoZXMocGF5bG9hZCwgcGF5bG9hZExpbWl0U2hhcGUsIGNoZWNrLCBsYWJlbCk7Ki9cblxuY29uc3QgbWFpbkxlbmd0aD1tYWluUGF5bG9hZFNoYXBlLmxlbmd0aDtcbmlmKCEocGF5bG9hZC5sZW5ndGg9PT1tYWluTGVuZ3RofHxwYXlsb2FkLmxlbmd0aD09PW1haW5MZW5ndGgrMSkpe1xucmV0dXJuIGNoZWNrKGZhbHNlLFggYCR7cShsYWJlbCl9IHBheWxvYWQgdW5leHBlY3RlZCBzaXplOiAke3BheWxvYWR9YCk7XG4gfVxuY29uc3QgbGltaXRzPXBheWxvYWRbbWFpbkxlbmd0aF07XG5wYXlsb2FkPWhhcmRlbihwYXlsb2FkLnNsaWNlKDAsbWFpbkxlbmd0aCkpO1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbmlmKCFjaGVja01hdGNoZXMocGF5bG9hZCxtYWluUGF5bG9hZFNoYXBlLGNoZWNrLGxhYmVsKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuaWYobGltaXRzPT09dW5kZWZpbmVkKXtcbnJldHVybiB0cnVlO1xuIH1cbnJldHVybihcbihwYXNzU3R5bGVPZihsaW1pdHMpPT09J2NvcHlSZWNvcmQnfHxcbmNoZWNrKGZhbHNlLFggYExpbWl0cyBtdXN0IGJlIGEgcmVjb3JkOiAke3EobGltaXRzKX1gKSkmJlxuZW50cmllcyhsaW1pdHMpLmV2ZXJ5KFxuKFtrZXksdmFsdWVdKT0+XG5wYXNzU3R5bGVPZih2YWx1ZSk9PT0nbnVtYmVyJ3x8XG5jaGVjayhmYWxzZSxYIGBWYWx1ZSBvZiBsaW1pdCAke3Eoa2V5KX0gYnV0IGJlIGEgbnVtYmVyOiAke3EodmFsdWUpfWApKSk7XG5cblxuIH07XG5cbmNvbnN0IGNoZWNrRGVjaW1hbERpZ2l0c0xpbWl0PShzcGVjaW1lbixkZWNpbWFsRGlnaXRzTGltaXQsY2hlY2spPT57XG5pZihcbk1hdGguZmxvb3IoTWF0aC5sb2cxMChNYXRoLmFicyhOdW1iZXIoc3BlY2ltZW4pKSkpKzE8PVxuZGVjaW1hbERpZ2l0c0xpbWl0KVxue1xucmV0dXJuIHRydWU7XG4gfVxucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBiaWdpbnQgJHtzcGVjaW1lbn0gbXVzdCBub3QgaGF2ZSBtb3JlIHRoYW4gJHtkZWNpbWFsRGlnaXRzTGltaXR9IGRpZ2l0c2ApO1xuXG4gfTtcblxuLyoqXG4gKiBAcmV0dXJucyB7UGF0dGVybktpdH1cbiAqL1xuY29uc3QgbWFrZVBhdHRlcm5LaXQ9KCk9Pntcbi8qKlxuICogSWYgdGhpcyBpcyBhIHJlY29nbml6ZWQgbWF0Y2ggdGFnLCByZXR1cm4gdGhlIE1hdGNoSGVscGVyLlxuICogT3RoZXJ3aXNlIHJlc3VsdCB1bmRlZmluZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICogQHJldHVybnMge01hdGNoSGVscGVyPX1cbiAqL1xuY29uc3QgbWF5YmVNYXRjaEhlbHBlcj0odGFnKT0+XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuSGVscGVyc0J5TWF0Y2hUYWdbdGFnXTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7c3RyaW5nfSBLaW5kXG4gKiBJdCBpcyBlaXRoZXIgYSBQYXNzU3R5bGUgb3RoZXIgdGhhbiAndGFnZ2VkJywgb3IsIGlmIHRoZSB1bmRlcmx5aW5nXG4gKiBQYXNzU3R5bGUgaXMgJ3RhZ2dlZCcsIHRoZW4gdGhlIGBnZXRUYWdgIHZhbHVlIGZvciB0YWdzIHRoYXQgYXJlXG4gKiByZWNvZ25pemVkIGF0IHRoZSBzdG9yZSBsZXZlbCBvZiBhYnN0cmFjdGlvbi4gRm9yIGVhY2ggb2YgdGhvc2VcbiAqIHRhZ3MsIGEgdGFnZ2VkIHJlY29yZCBvbmx5IGhhcyB0aGF0IGtpbmQgaWYgaXQgc2F0aXNmaWVzIHRoZSBpbnZhcmlhbnRzXG4gKiB0aGF0IHRoZSBzdG9yZSBsZXZlbCBhc3NvY2lhdGVzIHdpdGggdGhhdCBraW5kLlxuICovXG5cbi8qKlxuICogQHR5cGUge1dlYWtNYXA8Q29weVRhZ2dlZCwgS2luZD59XG4gKiBPbmx5IGZvciB0YWdnZWQgcmVjb3JkcyBvZiByZWNvZ25pemVkIGtpbmRzIHdob3NlIHN0b3JlLWxldmVsIGludmFyaWFudHNcbiAqIGhhdmUgYWxyZWFkeSBiZWVuIGNoZWNrZWQuXG4gKi9cbmNvbnN0IHRhZ01lbW89bmV3IFdlYWtNYXAoKTtcblxuLyoqXG4gKiBDaGVja3Mgb25seSByZWNvZ25pemVkIHRhZ3MsIGFuZCBvbmx5IGlmIHRoZSB0YWdnZWRcbiAqIHBhc3NlcyB0aGUgaW52YXJpYW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCByZWNvZ25pdGlvbi5cbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB0YWdnZWRcbiAqIEBwYXJhbSB7S2luZH0gdGFnXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tUYWdnZWQ9KHRhZ2dlZCx0YWcsY2hlY2spPT57XG5jb25zdCBtYXRjaEhlbHBlcj1tYXliZU1hdGNoSGVscGVyKHRhZyk7XG5pZihtYXRjaEhlbHBlcil7XG4vKiBCdXJpZWQgaGVyZSBpcyB0aGUgaW1wb3J0YW50IGNhc2UsIHdoZXJlIHdlIHByb2Nlc3MqL1xuLyogdGhlIHZhcmlvdXMgcGF0dGVybk5vZGVzKi9cbnJldHVybiBtYXRjaEhlbHBlci5jaGVja0lzV2VsbEZvcm1lZCh0YWdnZWQucGF5bG9hZCxjaGVjayk7XG4gfVxuc3dpdGNoKHRhZyl7XG5jYXNlJ2NvcHlTZXQnOntcbnJldHVybiBjaGVja0NvcHlTZXQodGFnZ2VkLGNoZWNrKTtcbiB9XG5jYXNlJ2NvcHlCYWcnOntcbnJldHVybiBjaGVja0NvcHlCYWcodGFnZ2VkLGNoZWNrKTtcbiB9XG5jYXNlJ2NvcHlNYXAnOntcbnJldHVybiBjaGVja0NvcHlNYXAodGFnZ2VkLGNoZWNrKTtcbiB9XG5kZWZhdWx0OntcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgY2Fubm90IGNoZWNrIHVucmVjb2duaXplZCB0YWcgJHtxKHRhZyl9OiAke3RhZ2dlZH1gKTtcblxuIH19XG5cbiB9O1xuXG4vKipcbiAqIFJldHVybnMgb25seSBhIHJlY29nbml6ZWQga2luZCwgYW5kIG9ubHkgaWYgdGhlIHNwZWNpbWVuIHBhc3NlcyB0aGVcbiAqIGludmFyaWFudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgcmVjb2duaXRpb24uXG4gKiBPdGhlcndpc2UsIGBjaGVjayhmYWxzZSwgLi4uKWAgYW5kIHJldHVybnMgdW5kZWZpbmVkXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge0tpbmQgfCB1bmRlZmluZWR9XG4gKi9cbmNvbnN0IGtpbmRPZj0oc3BlY2ltZW4sY2hlY2s9aWRlbnRDaGVja2VyKT0+e1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHNwZWNpbWVuKTtcbmlmKHBhc3NTdHlsZSE9PSd0YWdnZWQnKXtcbnJldHVybiBwYXNzU3R5bGU7XG4gfVxuLyogQXQgdGhpcyBwb2ludCB3ZSBrbm93IHRoYXQgc3BlY2ltZW4gaXMgYSB3ZWxsIGZvcm1lZCovXG4vKiBhcyBhIHRhZ2dlZCByZWNvcmQsIHdoaWNoIGlzIGRlZmluZWQgYXQgdGhlIG1hcnNoYWwgbGV2ZWwgb2YgYWJzdHJhY3Rpb24sKi9cbi8qIHNpbmNlIGBwYXNzU3R5bGVPZmAgY2hlY2tzIHRob3NlIGludmFyaWFudHMuKi9cbmlmKHRhZ01lbW8uaGFzKHNwZWNpbWVuKSl7XG5yZXR1cm4gdGFnTWVtby5nZXQoc3BlY2ltZW4pO1xuIH1cbmNvbnN0IHRhZz1nZXRUYWcoc3BlY2ltZW4pO1xuaWYoY2hlY2tUYWdnZWQoc3BlY2ltZW4sdGFnLGNoZWNrKSl7XG50YWdNZW1vLnNldChzcGVjaW1lbix0YWcpO1xucmV0dXJuIHRhZztcbiB9XG5pZihjaGVjayE9PWlkZW50Q2hlY2tlcil7XG5jaGVjayhmYWxzZSxYIGBjYW5ub3QgY2hlY2sgdW5yZWNvZ25pemVkIHRhZyAke3EodGFnKX1gKTtcbiB9XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH07XG5oYXJkZW4oa2luZE9mKTtcblxuLyoqXG4gKiBDaGVja3Mgb25seSByZWNvZ25pemVkIGtpbmRzLCBhbmQgb25seSBpZiB0aGUgc3BlY2ltZW5cbiAqIHBhc3NlcyB0aGUgaW52YXJpYW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCByZWNvZ25pdGlvbi5cbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBzcGVjaW1lblxuICogQHBhcmFtIHtLaW5kfSBraW5kXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tLaW5kPShzcGVjaW1lbixraW5kLGNoZWNrKT0+e1xuY29uc3QgcmVhbEtpbmQ9a2luZE9mKHNwZWNpbWVuLGNoZWNrKTtcbmlmKGtpbmQ9PT1yZWFsS2luZCl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5pZihjaGVjayE9PWlkZW50Q2hlY2tlcil7XG4vKiBxdW90aW5nIHdpdGhvdXQgcXVvdGVzKi9cbmNvbnN0IGRldGFpbHM9WChbIGAke3JlYWxLaW5kfSBgLGAgLSBNdXN0IGJlIGEgJHtraW5kfWBdLHNwZWNpbWVuKTtcbmNoZWNrKGZhbHNlLGRldGFpbHMpO1xuIH1cbnJldHVybiBmYWxzZTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHNwZWNpbWVuXG4gKiBAcGFyYW0ge0tleX0ga2V5QXNQYXR0ZXJuXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tBc0tleVBhdHQ9KHNwZWNpbWVuLGtleUFzUGF0dGVybixjaGVjayk9PntcbmlmKGtleUVRKHNwZWNpbWVuLGtleUFzUGF0dGVybikpe1xucmV0dXJuIHRydWU7XG4gfVxucmV0dXJuKFxuY2hlY2shPT1pZGVudENoZWNrZXImJlxuY2hlY2soZmFsc2UsWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGJlOiAke2tleUFzUGF0dGVybn1gKSk7XG5cbiB9O1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBpc1BhdHRlcm4gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiogQHR5cGUge0NoZWNrUGF0dGVybn0gKi9cbmNvbnN0IGNoZWNrUGF0dGVybj0ocGF0dCxjaGVjayk9PntcbmlmKGlzS2V5KHBhdHQpKXtcbi8qIEFsbCBrZXlzIGFyZSBwYXR0ZXJucy4gRm9yIHRoZXNlLCB0aGUga2V5TWVtbyB3aWxsIGRvLiovXG4vKiBBbGwgcHJpbWl0aXZlcyB0aGF0IGFyZSBwYXR0ZXJucyBhcmUgYWxzbyBrZXlzLCB3aGljaCB0aGlzKi9cbi8qIGFsc28gdGFrZXMgY2FyZSBvZiB3aXRob3V0IG1lbW8uIFRoZSByZXN0IG9mIG91ciBjaGVja2luZyBsb2dpYyovXG4vKiBpcyBvbmx5IGNvbmNlcm5lZCB3aXRoIG5vbi1rZXkgcGF0dGVybnMuKi9cbnJldHVybiB0cnVlO1xuIH1cbmlmKHBhdHRlcm5NZW1vLmhhcyhwYXR0KSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuY29uc3QgcmVzdWx0PWNoZWNrUGF0dGVybkludGVybmFsKHBhdHQsY2hlY2spO1xuaWYocmVzdWx0KXtcbnBhdHRlcm5NZW1vLmFkZChwYXR0KTtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gcGF0dCAtIGtub3duIG5vdCB0byBiZSBhIGtleSwgYW5kIHRoZXJlZm9yZSBrbm93blxuICogbm90IHRvIGJlIHByaW1pdGl2ZS5cbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja1BhdHRlcm5JbnRlcm5hbD0ocGF0dCxjaGVjayk9Pntcbi8qIFB1cnBvc2VseSBwYXJhbGxlbHMgY2hlY2tLZXkuIFRPRE8gcmV1c2UgbW9yZSBsb2dpYyBiZXR3ZWVuIHRoZW0uKi9cbi8qIE1vc3Qgb2YgdGhlIHRleHQgb2YgdGhlIHN3aXRjaCBiZWxvdyBub3QgZGVhbGluZyB3aXRoIG1hdGNoZXJzIGlzKi9cbi8qIGVzc2VudGlhbGx5IGlkZW50aWNhbC4qL1xuY29uc3QgY2hlY2tJdD0oY2hpbGQpPT5jaGVja1BhdHRlcm4oY2hpbGQsY2hlY2spO1xuXG5jb25zdCBraW5kPWtpbmRPZihwYXR0LGNoZWNrKTtcbnN3aXRjaChraW5kKXtcbmNhc2UgdW5kZWZpbmVkOntcbnJldHVybiBmYWxzZTtcbiB9XG5jYXNlJ2NvcHlSZWNvcmQnOntcbi8qIEEgY29weVJlY29yZCBpcyBhIHBhdHRlcm4gaWZmIGFsbCBpdHMgY2hpbGRyZW4gYXJlKi9cbi8qIHBhdHRlcm5zKi9cbnJldHVybiB2YWx1ZXMocGF0dCkuZXZlcnkoY2hlY2tJdCk7XG4gfVxuY2FzZSdjb3B5QXJyYXknOntcbi8qIEEgY29weUFycmF5IGlzIGEgcGF0dGVybiBpZmYgYWxsIGl0cyBjaGlsZHJlbiBhcmUqL1xuLyogcGF0dGVybnMqL1xucmV0dXJuIHBhdHQuZXZlcnkoY2hlY2tJdCk7XG4gfVxuY2FzZSdjb3B5TWFwJzp7XG4vKiBBIGNvcHlNYXAncyBrZXlzIGFyZSBrZXlzIGFuZCB0aGVyZWZvcmUgYWxyZWFkeSBrbm93biB0byBiZSovXG4vKiBwYXR0ZXJucy4qL1xuLyogQSBjb3B5TWFwIGlzIGEgcGF0dGVybiBpZiBpdHMgdmFsdWVzIGFyZSBwYXR0ZXJucy4qL1xucmV0dXJuIGNoZWNrUGF0dGVybihwYXR0LnZhbHVlcyxjaGVjayk7XG4gfVxuY2FzZSdlcnJvcic6XG5jYXNlJ3Byb21pc2UnOntcbnJldHVybiBjaGVjayhmYWxzZSxYIGBBICR7cShraW5kKX0gY2Fubm90IGJlIGEgcGF0dGVybmApO1xuIH1cbmRlZmF1bHQ6e1xuaWYobWF5YmVNYXRjaEhlbHBlcihraW5kKSE9PXVuZGVmaW5lZCl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYEEgcGFzc2FibGUgb2Yga2luZCAke3Eoa2luZCl9IGlzIG5vdCBhIHBhdHRlcm46ICR7cGF0dH1gKTtcblxuIH19XG5cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHBhdHRcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBpc1BhdHRlcm49KHBhdHQpPT5jaGVja1BhdHRlcm4ocGF0dCxpZGVudENoZWNrZXIpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGF0dGVybn0gcGF0dFxuICovXG5jb25zdCBhc3NlcnRQYXR0ZXJuPShwYXR0KT0+e1xuY2hlY2tQYXR0ZXJuKHBhdHQsYXNzZXJ0Q2hlY2tlcik7XG4gfTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gaXNLZXlQYXR0ZXJuIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqIEB0eXBlIHtDaGVja0tleVBhdHRlcm59ICovXG5jb25zdCBjaGVja0tleVBhdHRlcm49KHBhdHQsY2hlY2spPT57XG5pZihpc0tleShwYXR0KSl7XG4vKiBJbiBwcmluY2lwbGUsIGFsbCBrZXlzIGFyZSBwYXR0ZXJucywgYnV0IG9ubHkgc2NhbGFycyBhcmUgY3VycmVudGx5Ki9cbi8qIHN1cHBvcnRlZCBhcyBrZXlzLiovXG5yZXR1cm4gY2hlY2soaXNTY2FsYXJLZXkocGF0dCksWCBgbm9uLXNjYWxhciBrZXlzIGFyZSBub3QgeWV0IHN1cHBvcnRlZGApO1xuIH1cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5yZXR1cm4gY2hlY2tLZXlQYXR0ZXJuSW50ZXJuYWwocGF0dCxjaGVjayk7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBwYXR0XG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tLZXlQYXR0ZXJuSW50ZXJuYWw9KHBhdHQsY2hlY2spPT57XG4vKiBQdXJwb3NlbHkgcGFyYWxsZWxzIGNoZWNrS2V5LiBUT0RPIHJldXNlIG1vcmUgbG9naWMgYmV0d2VlbiB0aGVtLiovXG4vKiBNb3N0IG9mIHRoZSB0ZXh0IG9mIHRoZSBzd2l0Y2ggYmVsb3cgbm90IGRlYWxpbmcgd2l0aCBtYXRjaGVycyBpcyovXG4vKiBlc3NlbnRpYWxseSBpZGVudGljYWwuKi9cbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihwYXR0KTtcbnN3aXRjaChwYXNzU3R5bGUpe1xuY2FzZSdjb3B5UmVjb3JkJzpcbmNhc2UnY29weUFycmF5Jzp7XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgbm9uLXNjYWxhciBrZXlzIGFyZSBub3QgeWV0IHN1cHBvcnRlZGApO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5jb25zdCB0YWc9Z2V0VGFnKHBhdHQpO1xuY29uc3QgbWF0Y2hIZWxwZXI9bWF5YmVNYXRjaEhlbHBlcih0YWcpO1xuaWYobWF0Y2hIZWxwZXIhPT11bmRlZmluZWQpe1xuLyogVGhpcyBjaGVjayBndWFyYW50ZWVzIHRoZSBwYXlsb2FkIGludmFyaWFudHMgYXNzdW1lZCBieSB0aGUgb3RoZXIqL1xuLyogbWF0Y2hIZWxwZXIgbWV0aG9kcy4qL1xucmV0dXJuIG1hdGNoSGVscGVyLmNoZWNrS2V5UGF0dGVybihwYXR0LnBheWxvYWQsY2hlY2spO1xuIH1cbnN3aXRjaCh0YWcpe1xuY2FzZSdjb3B5U2V0JzpcbmNhc2UnY29weU1hcCc6e1xucmV0dXJuIGNoZWNrKGZhbHNlLFggYG5vbi1zY2FsYXIga2V5cyBhcmUgbm90IHlldCBzdXBwb3J0ZWRgKTtcbiB9XG5kZWZhdWx0OntcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgQSBwYXNzYWJsZSB0YWdnZWQgJHtxKHRhZyl9IGlzIG5vdCBhIGtleTogJHtwYXR0fWApO1xuXG4gfX1cblxuIH1cbmNhc2UnZXJyb3InOlxuY2FzZSdwcm9taXNlJzp7XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgQSAke3EocGFzc1N0eWxlKX0gY2Fubm90IGJlIGEgcGF0dGVybmApO1xuIH1cbmRlZmF1bHQ6e1xuLyogVW5leHBlY3RlZCB0YWdzIGFyZSBqdXN0IG5vbi1wYXR0ZXJucywgYnV0IGFuIHVuZXhwZWN0ZWQgcGFzc1N0eWxlKi9cbi8qIGlzIGFsd2F5cyBhbiBlcnJvci4qL1xuYXNzZXJ0LmZhaWwoWCBgdW5leHBlY3RlZCBwYXNzU3R5bGUgJHtxKHBhc3NTdHlsZSl9OiAke3BhdHR9YCk7XG4gfX1cblxuIH07XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gcGF0dFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGlzS2V5UGF0dGVybj0ocGF0dCk9PmNoZWNrS2V5UGF0dGVybihwYXR0LGlkZW50Q2hlY2tlcik7XG5cbi8qKlxuICogQHBhcmFtIHtQYXR0ZXJufSBwYXR0XG4gKi9cbmNvbnN0IGFzc2VydEtleVBhdHRlcm49KHBhdHQpPT57XG5jaGVja0tleVBhdHRlcm4ocGF0dCxhc3NlcnRDaGVja2VyKTtcbiB9O1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBtYXRjaGVzIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHNwZWNpbWVuXG4gKiBAcGFyYW0ge1BhdHRlcm59IHBhdHRlcm5cbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gW2xhYmVsXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrTWF0Y2hlcz0oc3BlY2ltZW4scGF0dGVybixjaGVjayxsYWJlbD11bmRlZmluZWQpPT5cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5hcHBseUxhYmVsaW5nRXJyb3IoY2hlY2tNYXRjaGVzSW50ZXJuYWwsW3NwZWNpbWVuLHBhdHRlcm4sY2hlY2tdLGxhYmVsKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBzcGVjaW1lblxuICogQHBhcmFtIHtQYXR0ZXJufSBwYXR0XG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tNYXRjaGVzSW50ZXJuYWw9KHNwZWNpbWVuLHBhdHQsY2hlY2spPT57XG4vKiBXb3J0aCBiZWluZyBhIGJpdCB2ZXJib3NlIGFuZCByZXBldGl0aXZlIGluIG9yZGVyIHRvIG9wdGltaXplKi9cbmNvbnN0IHBhdHRlcm5LaW5kPWtpbmRPZihwYXR0LGNoZWNrKTtcbmNvbnN0IHNwZWNpbWVuS2luZD1raW5kT2Yoc3BlY2ltZW4pOy8qIG1heSBiZSB1bmRlZmluZWQqL1xuc3dpdGNoKHBhdHRlcm5LaW5kKXtcbmNhc2UgdW5kZWZpbmVkOntcbnJldHVybiBhc3NlcnQuZmFpbChYIGBwYXR0ZXJuIGV4cGVjdGVkOiAke3BhdHR9YCk7XG4gfVxuY2FzZSdwcm9taXNlJzp7XG5yZXR1cm4gYXNzZXJ0LmZhaWwoWCBgcHJvbWlzZXMgY2Fubm90IGJlIHBhdHRlcm5zOiAke3BhdHR9YCk7XG4gfVxuY2FzZSdlcnJvcic6e1xucmV0dXJuIGFzc2VydC5mYWlsKFggYGVycm9ycyBjYW5ub3QgYmUgcGF0dGVybnM6ICR7cGF0dH1gKTtcbiB9XG5jYXNlJ3VuZGVmaW5lZCc6XG5jYXNlJ251bGwnOlxuY2FzZSdib29sZWFuJzpcbmNhc2UnbnVtYmVyJzpcbmNhc2UnYmlnaW50JzpcbmNhc2Unc3RyaW5nJzpcbmNhc2Unc3ltYm9sJzpcbmNhc2UnY29weVNldCc6XG5jYXNlJ2NvcHlCYWcnOlxuY2FzZSdyZW1vdGFibGUnOntcbi8qIFRoZXNlIGtpbmRzIGFyZSBuZWNlc3NhcmlseSBrZXlzKi9cbnJldHVybiBjaGVja0FzS2V5UGF0dChzcGVjaW1lbixwYXR0LGNoZWNrKTtcbiB9XG5jYXNlJ2NvcHlBcnJheSc6e1xuaWYoaXNLZXkocGF0dCkpe1xuLyogVGFrZXMgY2FyZSBvZiBwYXR0ZXJucyB3aGljaCBhcmUga2V5cywgc28gdGhlIHJlc3Qgb2YgdGhpcyovXG4vKiBsb2dpYyBjYW4gYXNzdW1lIHBhdHRlcm5zIHRoYXQgYXJlIG5vdCBrZXlzLiovXG5yZXR1cm4gY2hlY2tBc0tleVBhdHQoc3BlY2ltZW4scGF0dCxjaGVjayk7XG4gfVxuaWYoc3BlY2ltZW5LaW5kIT09J2NvcHlBcnJheScpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGAke3NwZWNpbWVufSAtIE11c3QgYmUgYSBjb3B5QXJyYXkgdG8gbWF0Y2ggYSBjb3B5QXJyYXkgcGF0dGVybjogJHtwYXR0fWApO1xuXG4gfVxuY29uc3R7bGVuZ3RofT1wYXR0O1xuaWYoc3BlY2ltZW4ubGVuZ3RoIT09bGVuZ3RoKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgQXJyYXkgJHtzcGVjaW1lbn0gLSBNdXN0IGJlIGFzIGxvbmcgYXMgY29weUFycmF5IHBhdHRlcm46ICR7cGF0dH1gKTtcblxuIH1cbnJldHVybiBwYXR0LmV2ZXJ5KChwLGkpPT5jaGVja01hdGNoZXMoc3BlY2ltZW5baV0scCxjaGVjayxpKSk7XG4gfVxuY2FzZSdjb3B5UmVjb3JkJzp7XG5pZihpc0tleShwYXR0KSl7XG4vKiBUYWtlcyBjYXJlIG9mIHBhdHRlcm5zIHdoaWNoIGFyZSBrZXlzLCBzbyB0aGUgcmVzdCBvZiB0aGlzKi9cbi8qIGxvZ2ljIGNhbiBhc3N1bWUgcGF0dGVybnMgdGhhdCBhcmUgbm90IGtleXMuKi9cbnJldHVybiBjaGVja0FzS2V5UGF0dChzcGVjaW1lbixwYXR0LGNoZWNrKTtcbiB9XG5pZihzcGVjaW1lbktpbmQhPT0nY29weVJlY29yZCcpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGAke3NwZWNpbWVufSAtIE11c3QgYmUgYSBjb3B5UmVjb3JkIHRvIG1hdGNoIGEgY29weVJlY29yZCBwYXR0ZXJuOiAke3BhdHR9YCk7XG5cbiB9XG5jb25zdFtzcGVjaW1lbk5hbWVzLHNwZWNpbWVuVmFsdWVzXT1yZWNvcmRQYXJ0cyhzcGVjaW1lbik7XG5jb25zdFtwYXR0TmFtZXMscGF0dFZhbHVlc109cmVjb3JkUGFydHMocGF0dCk7XG5jb25zdCBtaXNzaW5nPWxpc3REaWZmZXJlbmNlKHBhdHROYW1lcyxzcGVjaW1lbk5hbWVzKTtcbmlmKG1pc3NpbmcubGVuZ3RoPj0xKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGhhdmUgbWlzc2luZyBwcm9wZXJ0aWVzICR7cShtaXNzaW5nKX1gKTtcblxuIH1cbmNvbnN0IHVuZXhwZWN0ZWQ9bGlzdERpZmZlcmVuY2Uoc3BlY2ltZW5OYW1lcyxwYXR0TmFtZXMpO1xuaWYodW5leHBlY3RlZC5sZW5ndGg+PTEpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGAke3NwZWNpbWVufSAtIE11c3Qgbm90IGhhdmUgdW5leHBlY3RlZCBwcm9wZXJ0aWVzOiAke3EoXG51bmV4cGVjdGVkKVxuIH1gKTtcblxuIH1cbnJldHVybiBwYXR0TmFtZXMuZXZlcnkoKGxhYmVsLGkpPT5cbmNoZWNrTWF0Y2hlcyhzcGVjaW1lblZhbHVlc1tpXSxwYXR0VmFsdWVzW2ldLGNoZWNrLGxhYmVsKSk7XG5cbiB9XG5jYXNlJ2NvcHlNYXAnOntcbmlmKGlzS2V5KHBhdHQpKXtcbi8qIFRha2VzIGNhcmUgb2YgcGF0dGVybnMgd2hpY2ggYXJlIGtleXMsIHNvIHRoZSByZXN0IG9mIHRoaXMqL1xuLyogbG9naWMgY2FuIGFzc3VtZSBwYXR0ZXJucyB0aGF0IGFyZSBub3Qga2V5cy4qL1xucmV0dXJuIGNoZWNrQXNLZXlQYXR0KHNwZWNpbWVuLHBhdHQsY2hlY2spO1xuIH1cbmlmKHNwZWNpbWVuS2luZCE9PSdjb3B5TWFwJyl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYCR7c3BlY2ltZW59IC0gTXVzdCBiZSBhIGNvcHlNYXAgdG8gbWF0Y2ggYSBjb3B5TWFwIHBhdHRlcm46ICR7cGF0dH1gKTtcblxuIH1cbmNvbnN0e3BheWxvYWQ6cGF0dFBheWxvYWR9PXBhdHQ7XG5jb25zdHtwYXlsb2FkOnNwZWNpbWVuUGF5bG9hZH09c3BlY2ltZW47XG5jb25zdCBwYXR0S2V5U2V0PWNvcHlNYXBLZXlTZXQocGF0dFBheWxvYWQpO1xuY29uc3Qgc3BlY2ltZW5LZXlTZXQ9Y29weU1hcEtleVNldChzcGVjaW1lblBheWxvYWQpO1xuLyogQ29tcGFyZSBrZXlzIGFzIGNvcHlTZXRzKi9cbmlmKCFjaGVja01hdGNoZXMoc3BlY2ltZW5LZXlTZXQscGF0dEtleVNldCxjaGVjaykpe1xucmV0dXJuIGZhbHNlO1xuIH1cbmNvbnN0IHBhdHRWYWx1ZXM9cGF0dFBheWxvYWQudmFsdWVzO1xuY29uc3Qgc3BlY2ltZW5WYWx1ZXM9c3BlY2ltZW5QYXlsb2FkLnZhbHVlcztcbi8qIGNvbXBhcmUgdmFsdWVzIGFzIGNvcHlBcnJheXMqL1xucmV0dXJuIGNoZWNrTWF0Y2hlcyhzcGVjaW1lblZhbHVlcyxwYXR0VmFsdWVzLGNoZWNrKTtcbiB9XG5kZWZhdWx0OntcbmNvbnN0IG1hdGNoSGVscGVyPW1heWJlTWF0Y2hIZWxwZXIocGF0dGVybktpbmQpO1xuaWYobWF0Y2hIZWxwZXIpe1xucmV0dXJuIG1hdGNoSGVscGVyLmNoZWNrTWF0Y2hlcyhzcGVjaW1lbixwYXR0LnBheWxvYWQsY2hlY2spO1xuIH1cbmFzc2VydC5mYWlsKFggYGludGVybmFsOiBzaG91bGQgaGF2ZSByZWNvZ25pemVkICR7cShwYXR0ZXJuS2luZCl9IGApO1xuIH19XG5cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHNwZWNpbWVuXG4gKiBAcGFyYW0ge1BhdHRlcm59IHBhdHRcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBtYXRjaGVzPShzcGVjaW1lbixwYXR0KT0+XG5jaGVja01hdGNoZXMoc3BlY2ltZW4scGF0dCxpZGVudENoZWNrZXIpO1xuXG4vKipcbiAqIFJldHVybmluZyBub3JtYWxseSBpbmRpY2F0ZXMgc3VjY2Vzcy4gTWF0Y2ggZmFpbHVyZSBpcyBpbmRpY2F0ZWQgYnlcbiAqIHRocm93aW5nLlxuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHNwZWNpbWVuXG4gKiBAcGFyYW0ge1BhdHRlcm59IHBhdHRcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gW2xhYmVsXVxuICovXG5jb25zdCBmaXQ9KHNwZWNpbWVuLHBhdHQsbGFiZWw9dW5kZWZpbmVkKT0+e1xuaWYoY2hlY2tNYXRjaGVzKHNwZWNpbWVuLHBhdHQsaWRlbnRDaGVja2VyLGxhYmVsKSl7XG5yZXR1cm47XG4gfVxuLyogc2hvdWxkIG9ubHkgdGhyb3cqL1xuY2hlY2tNYXRjaGVzKHNwZWNpbWVuLHBhdHQsYXNzZXJ0Q2hlY2tlcixsYWJlbCk7XG5hc3NlcnQuZmFpbChYIGBpbnRlcm5hbDogJHtsYWJlbH06IGluY29uc2lzdGVudCBwYXR0ZXJuIG1hdGNoOiAke3EocGF0dCl9YCk7XG4gfTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gZ2V0UmFua0NvdmVyIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqIEB0eXBlIHtHZXRSYW5rQ292ZXJ9ICovXG5jb25zdCBnZXRSYW5rQ292ZXI9KHBhdHQsZW5jb2RlUGFzc2FibGUpPT57XG5pZihpc0tleShwYXR0KSl7XG5jb25zdCBlbmNvZGVkPWVuY29kZVBhc3NhYmxlKHBhdHQpO1xuaWYoZW5jb2RlZCE9PXVuZGVmaW5lZCl7XG5yZXR1cm5bZW5jb2RlZCwgYCR7ZW5jb2RlZH1+YF07XG4gfVxuIH1cbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihwYXR0KTtcbnN3aXRjaChwYXNzU3R5bGUpe1xuY2FzZSdjb3B5QXJyYXknOntcbi8qIFhYWCB0aGlzIGRvZXNuJ3QgZ2V0IGFsb25nIHdpdGggdGhlIHdvcmxkIG9mIGNvdmVyID09PSBwYWlyIG9mKi9cbi8qIHN0cmluZ3MuIEluIHRoZSBtZWFudGltZSwgZmFsbCB0aHJvdWdoIHRvIHRoZSBkZWZhdWx0IHdoaWNoKi9cbi8qIHJldHVybnMgYSBjb3ZlciB0aGF0IGNvdmVycyBhbGwgY29weUFycmF5cy4qL1xuLyoqL1xuLyogY29uc3QgcmFua0NvdmVycyA9IHBhdHQubWFwKHAgPT4gZ2V0UmFua0NvdmVyKHAsIGVuY29kZVBhc3NhYmxlKSk7Ki9cbi8qIHJldHVybiBoYXJkZW4oWyovXG4vKiByYW5rQ292ZXJzLm1hcCgoW2xlZnQsIF9yaWdodF0pID0+IGxlZnQpLCovXG4vKiByYW5rQ292ZXJzLm1hcCgoW19sZWZ0LCByaWdodF0pID0+IHJpZ2h0KSwqL1xuLyogXSk7Ki9cbmJyZWFrO1xuIH1cbmNhc2UnY29weVJlY29yZCc6e1xuLyogWFhYIHRoaXMgZG9lc24ndCBnZXQgYWxvbmcgd2l0aCB0aGUgd29ybGQgb2YgY292ZXIgPT09IHBhaXIgb2YqL1xuLyogc3RyaW5ncy4gSW4gdGhlIG1lYW50aW1lLCBmYWxsIHRocm91Z2ggdG8gdGhlIGRlZmF1bHQgd2hpY2gqL1xuLyogcmV0dXJucyBhIGNvdmVyIHRoYXQgY292ZXJzIGFsbCBjb3B5UmVjb3Jkcy4qL1xuLyoqL1xuLyogY29uc3QgcGF0dEtleXMgPSBvd25LZXlzKHBhdHQpOyovXG4vKiBjb25zdCBwYXR0RW50cmllcyA9IGhhcmRlbihwYXR0S2V5cy5tYXAoa2V5ID0+IFtrZXksIHBhdHRba2V5XV0pKTsqL1xuLyogY29uc3QgW2xlZnRFbnRyaWVzTGltaXQsIHJpZ2h0RW50cmllc0xpbWl0XSA9Ki9cbi8qIGdldFJhbmtDb3ZlcihwYXR0RW50cmllcyk7Ki9cbi8qIHJldHVybiBoYXJkZW4oWyovXG4vKiBmcm9tRW50cmllcyhsZWZ0RW50cmllc0xpbWl0KSwqL1xuLyogZnJvbUVudHJpZXMocmlnaHRFbnRyaWVzTGltaXQpLCovXG4vKiBdKTsqL1xuYnJlYWs7XG4gfVxuY2FzZSd0YWdnZWQnOntcbmNvbnN0IHRhZz1nZXRUYWcocGF0dCk7XG5jb25zdCBtYXRjaEhlbHBlcj1tYXliZU1hdGNoSGVscGVyKHRhZyk7XG5pZihtYXRjaEhlbHBlcil7XG4vKiBCdXJpZWQgaGVyZSBpcyB0aGUgaW1wb3J0YW50IGNhc2UsIHdoZXJlIHdlIHByb2Nlc3MqL1xuLyogdGhlIHZhcmlvdXMgcGF0dGVybk5vZGVzKi9cbnJldHVybiBtYXRjaEhlbHBlci5nZXRSYW5rQ292ZXIocGF0dC5wYXlsb2FkLGVuY29kZVBhc3NhYmxlKTtcbiB9XG5zd2l0Y2godGFnKXtcbmNhc2UnY29weVNldCc6e1xuLyogWFhYIHRoaXMgZG9lc24ndCBnZXQgYWxvbmcgd2l0aCB0aGUgd29ybGQgb2YgY292ZXIgPT09IHBhaXIgb2YqL1xuLyogc3RyaW5ncy4gSW4gdGhlIG1lYW50aW1lLCBmYWxsIHRocm91Z2ggdG8gdGhlIGRlZmF1bHQgd2hpY2gqL1xuLyogcmV0dXJucyBhIGNvdmVyIHRoYXQgY292ZXJzIGFsbCBjb3B5U2V0cy4qL1xuLyoqL1xuLyogLy8gU2hvdWxkIGFscmVhZHkgYmUgdmFsaWRhdGVkIGJ5IGNoZWNrUGF0dGVybi4gQnV0IGJlY2F1c2UgdGhpcyovXG4vKiAvLyBpcyBhIGNoZWNrIHRoYXQgbWF5IGxvb3NlbiBvdmVyIHRpbWUsIHdlIGFsc28gYXNzZXJ0Ki9cbi8qIC8vIGV2ZXJ5d2hlcmUgd2Ugc3RpbGwgcmVseSBvbiB0aGUgcmVzdHJpY3Rpb24uKi9cbi8qIGFzc2VydCgqL1xuLyogcGF0dC5wYXlsb2FkLmxlbmd0aCA9PT0gMSwqL1xuLyogWGBOb24tc2luZ2xldG9uIGNvcHlTZXRzIHdpdGggbWF0Y2hlciBub3QgeWV0IGltcGxlbWVudGVkOiAke3BhdHR9YCwqL1xuLyogKTsqL1xuLyoqL1xuLyogY29uc3QgW2xlZnRFbGVtZW50TGltaXQsIHJpZ2h0RWxlbWVudExpbWl0XSA9IGdldFJhbmtDb3ZlcigqL1xuLyogcGF0dC5wYXlsb2FkWzBdLCovXG4vKiApOyovXG4vKiByZXR1cm4gaGFyZGVuKFsqL1xuLyogbWFrZUNvcHlTZXQoW2xlZnRFbGVtZW50TGltaXRdKSwqL1xuLyogbWFrZUNvcHlTZXQoW3JpZ2h0RWxlbWVudExpbWl0XSksKi9cbi8qIF0pOyovXG5icmVhaztcbiB9XG5jYXNlJ2NvcHlNYXAnOntcbi8qIFhYWCB0aGlzIGRvZXNuJ3QgZ2V0IGFsb25nIHdpdGggdGhlIHdvcmxkIG9mIGNvdmVyID09PSBwYWlyIG9mKi9cbi8qIHN0cmluZ3MuIEluIHRoZSBtZWFudGltZSwgZmFsbCB0aHJvdWdoIHRvIHRoZSBkZWZhdWx0IHdoaWNoKi9cbi8qIHJldHVybnMgYSBjb3ZlciB0aGF0IGNvdmVycyBhbGwgY29weU1hcHMuKi9cbi8qKi9cbi8qIC8vIEEgbWF0Y2hpbmcgY29weU1hcCBtdXN0IGhhdmUgdGhlIHNhbWUga2V5cywgb3IgYXQgbW9zdCBvbmUqL1xuLyogLy8gbm9uLWtleSBrZXkgcGF0dGVybi4gVGh1cyB3ZSBjYW4gYXNzdW1lIHRoYXQgdmFsdWUgcG9zaXRpb25zKi9cbi8qIC8vIG1hdGNoIDEtdG8tMS4qL1xuLyogLy8qL1xuLyogLy8gVE9ETyBJIG1heSBiZSBvdmVybG9va2luZyB0aGF0IHRoZSBsZXNzIHByZWNpc2UgcmFua09yZGVyKi9cbi8qIC8vIGVxdWl2YWxlbmNlIGNsYXNzIG1heSBjYXVzZSB2YWx1ZXMgdG8gYmUgb3V0IG9mIG9yZGVyLCovXG4vKiAvLyBtYWtpbmcgdGhpcyByYW5rQ292ZXIgbm90IGFjdHVhbGx5IGNvdmVyLiBJbiB0aGF0IGNhc2UsIGZvciovXG4vKiAvLyBhbGwgdGhlIHZhbHVlcyBmb3Iga2V5cyBhdCB0aGUgc2FtZSByYW5rLCB3ZSBzaG91bGQgdW5pb24gdGhlaXIqL1xuLyogLy8gcmFuayBjb3ZlcnMuIFRPRE8gUE9TU0lCTEUgU0lMRU5UIENPUlJFQ1RORVNTIEJVRyovXG4vKiAvLyovXG4vKiAvLyBJZiB0aGlzIGlzIGEgYnVnLCBpdCBwcm9iYWJseSBhZmZlY3RzIHRoZSBnZXRSYW5rQ292ZXIqL1xuLyogLy8gY2FzZXMgb2YgbWF0Y2hMVEVIZWxwZXIgYW5kIG1hdGNoR1RFSGVscGVyIG9uIGNvcHlNYXAgYXMqL1xuLyogLy8gd2VsbC4gU2VlIG1ha2VDb3B5TWFwIGZvciBhbiBpZGVhIG9uIGZpeGluZyovXG4vKiAvLyB0aGlzIGJ1Zy4qL1xuLyogY29uc3QgW2xlZnRQYXlsb2FkTGltaXQsIHJpZ2h0UGF5bG9hZExpbWl0XSA9IGdldFJhbmtDb3ZlcigqL1xuLyogcGF0dC5wYXlsb2FkLCovXG4vKiBlbmNvZGVQYXNzYWJsZSwqL1xuLyogKTsqL1xuLyogcmV0dXJuIGhhcmRlbihbKi9cbi8qIG1ha2VUYWdnZWQoJ2NvcHlNYXAnLCBsZWZ0UGF5bG9hZExpbWl0KSwqL1xuLyogbWFrZVRhZ2dlZCgnY29weU1hcCcsIHJpZ2h0UGF5bG9hZExpbWl0KSwqL1xuLyogXSk7Ki9cbmJyZWFrO1xuIH1cbmRlZmF1bHQ6e1xuYnJlYWs7LyogZmFsbCB0aHJvdWdoIHRvIGRlZmF1bHQqL1xuIH19XG5cbmJyZWFrOy8qIGZhbGwgdGhyb3VnaCB0byBkZWZhdWx0Ki9cbiB9XG5kZWZhdWx0OntcbmJyZWFrOy8qIGZhbGwgdGhyb3VnaCB0byBkZWZhdWx0Ki9cbiB9fVxuXG5yZXR1cm4gZ2V0UGFzc1N0eWxlQ292ZXIocGFzc1N0eWxlKTtcbiB9O1xuXG5jb25zdCBhcnJheUV2ZXJ5TWF0Y2hQYXR0ZXJuPShhcnJheSxwYXR0LGNoZWNrLGxhYmVsUHJlZml4PScnKT0+e1xuaWYoY2hlY2tLaW5kKHBhdHQsJ21hdGNoOmFueScsaWRlbnRDaGVja2VyKSl7XG4vKiBpZiB0aGUgcGF0dGVybiBpcyBNLmFueSgpLCB3ZSBrbm93IGl0cyB0cnVlKi9cbnJldHVybiB0cnVlO1xuIH1cbnJldHVybiBhcnJheS5ldmVyeSgoZWwsaSk9PlxuY2hlY2tNYXRjaGVzKGVsLHBhdHQsY2hlY2ssIGAke2xhYmVsUHJlZml4fVske2l9XWApKTtcblxuIH07XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIE1hdGNoIEhlbHBlcnMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaEFueUhlbHBlcj1GYXIoJ21hdGNoOmFueSBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooX3NwZWNpbWVuLF9tYXRjaGVyUGF5bG9hZCxfY2hlY2spPT50cnVlLFxuXG5jaGVja0lzV2VsbEZvcm1lZDoobWF0Y2hlclBheWxvYWQsY2hlY2spPT5cbm1hdGNoZXJQYXlsb2FkPT09dW5kZWZpbmVkfHxcbmNoZWNrKGZhbHNlLFggYG1hdGNoOmFueSBwYXlsb2FkOiAke21hdGNoZXJQYXlsb2FkfSAtIE11c3QgYmUgdW5kZWZpbmVkYCksXG5cbmdldFJhbmtDb3ZlcjooX21hdGNoUGF5bG9hZCxfZW5jb2RlUGFzc2FibGUpPT5bJycsJ3snXSxcblxuY2hlY2tLZXlQYXR0ZXJuOihfbWF0Y2hlclBheWxvYWQsX2NoZWNrKT0+dHJ1ZX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaEFuZEhlbHBlcj1GYXIoJ21hdGNoOmFuZCBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4scGF0dHMsY2hlY2spPT57XG5yZXR1cm4gcGF0dHMuZXZlcnkoKHBhdHQpPT5jaGVja01hdGNoZXMoc3BlY2ltZW4scGF0dCxjaGVjaykpO1xuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihhbGxlZ2VkUGF0dHMsY2hlY2spPT57XG5jb25zdCBjaGVja0l0PShwYXR0KT0+Y2hlY2tQYXR0ZXJuKHBhdHQsY2hlY2spO1xucmV0dXJuKFxuKHBhc3NTdHlsZU9mKGFsbGVnZWRQYXR0cyk9PT0nY29weUFycmF5J3x8XG5jaGVjayhmYWxzZSxYIGBOZWVkcyBhcnJheSBvZiBzdWItcGF0dGVybnM6ICR7YWxsZWdlZFBhdHRzfWApKSYmXG5hbGxlZ2VkUGF0dHMuZXZlcnkoY2hlY2tJdCkpO1xuXG4gfSxcblxuZ2V0UmFua0NvdmVyOihwYXR0cyxlbmNvZGVQYXNzYWJsZSk9PlxuaW50ZXJzZWN0UmFua0NvdmVycyhcbmNvbXBhcmVSYW5rLFxucGF0dHMubWFwKChwKT0+Z2V0UmFua0NvdmVyKHAsZW5jb2RlUGFzc2FibGUpKSksXG5cblxuY2hlY2tLZXlQYXR0ZXJuOihwYXR0cyxjaGVjayk9PntcbnJldHVybiBwYXR0cy5ldmVyeSgocGF0dCk9PmNoZWNrS2V5UGF0dGVybihwYXR0LGNoZWNrKSk7XG4gfX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaE9ySGVscGVyPUZhcignbWF0Y2g6b3IgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLHBhdHRzLGNoZWNrKT0+e1xuY29uc3R7bGVuZ3RofT1wYXR0cztcbmlmKGxlbmd0aD09PTApe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGAke3NwZWNpbWVufSAtIG5vIHBhdHRlcm4gZGlzanVuY3RzIHRvIG1hdGNoOiAke3BhdHRzfWApO1xuXG4gfVxuaWYocGF0dHMuc29tZSgocGF0dCk9Pm1hdGNoZXMoc3BlY2ltZW4scGF0dCkpKXtcbnJldHVybiB0cnVlO1xuIH1cbnJldHVybiBjaGVjayhmYWxzZSxYIGAke3NwZWNpbWVufSAtIE11c3QgbWF0Y2ggb25lIG9mICR7cGF0dHN9YCk7XG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6bWF0Y2hBbmRIZWxwZXIuY2hlY2tJc1dlbGxGb3JtZWQsXG5cbmdldFJhbmtDb3ZlcjoocGF0dHMsZW5jb2RlUGFzc2FibGUpPT5cbnVuaW9uUmFua0NvdmVycyhcbmNvbXBhcmVSYW5rLFxucGF0dHMubWFwKChwKT0+Z2V0UmFua0NvdmVyKHAsZW5jb2RlUGFzc2FibGUpKSksXG5cblxuY2hlY2tLZXlQYXR0ZXJuOihwYXR0cyxjaGVjayk9PntcbnJldHVybiBwYXR0cy5ldmVyeSgocGF0dCk9PmNoZWNrS2V5UGF0dGVybihwYXR0LGNoZWNrKSk7XG4gfX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaE5vdEhlbHBlcj1GYXIoJ21hdGNoOm5vdCBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4scGF0dCxjaGVjayk9PntcbmlmKG1hdGNoZXMoc3BlY2ltZW4scGF0dCkpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGAke3NwZWNpbWVufSAtIE11c3QgZmFpbCBuZWdhdGVkIHBhdHRlcm46ICR7cGF0dH1gKTtcblxuIH1lbHNle1xucmV0dXJuIHRydWU7XG4gfVxuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOmNoZWNrUGF0dGVybixcblxuZ2V0UmFua0NvdmVyOihfcGF0dCxfZW5jb2RlUGFzc2FibGUpPT5bJycsJ3snXSxcblxuY2hlY2tLZXlQYXR0ZXJufSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoU2NhbGFySGVscGVyPUZhcignbWF0Y2g6c2NhbGFyIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixfbWF0Y2hlclBheWxvYWQsY2hlY2spPT5cbmNoZWNrU2NhbGFyS2V5KHNwZWNpbWVuLGNoZWNrKSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6bWF0Y2hBbnlIZWxwZXIuY2hlY2tJc1dlbGxGb3JtZWQsXG5cbmdldFJhbmtDb3ZlcjooX21hdGNoUGF5bG9hZCxfZW5jb2RlUGFzc2FibGUpPT5bJ2EnLCd6fiddLFxuXG5jaGVja0tleVBhdHRlcm46KF9tYXRjaGVyUGF5bG9hZCxfY2hlY2spPT50cnVlfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoS2V5SGVscGVyPUZhcignbWF0Y2g6a2V5IGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixfbWF0Y2hlclBheWxvYWQsY2hlY2spPT5cbmNoZWNrS2V5KHNwZWNpbWVuLGNoZWNrKSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6bWF0Y2hBbnlIZWxwZXIuY2hlY2tJc1dlbGxGb3JtZWQsXG5cbmdldFJhbmtDb3ZlcjooX21hdGNoUGF5bG9hZCxfZW5jb2RlUGFzc2FibGUpPT5bJ2EnLCd6fiddLFxuXG5jaGVja0tleVBhdHRlcm46KF9tYXRjaGVyUGF5bG9hZCxfY2hlY2spPT50cnVlfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoUGF0dGVybkhlbHBlcj1GYXIoJ21hdGNoOnBhdHRlcm4gaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLF9tYXRjaGVyUGF5bG9hZCxjaGVjayk9PlxuY2hlY2tQYXR0ZXJuKHNwZWNpbWVuLGNoZWNrKSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6bWF0Y2hBbnlIZWxwZXIuY2hlY2tJc1dlbGxGb3JtZWQsXG5cbmdldFJhbmtDb3ZlcjooX21hdGNoUGF5bG9hZCxfZW5jb2RlUGFzc2FibGUpPT5bJ2EnLCd6fiddLFxuXG5jaGVja0tleVBhdHRlcm46KF9tYXRjaGVyUGF5bG9hZCxfY2hlY2spPT50cnVlfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoS2luZEhlbHBlcj1GYXIoJ21hdGNoOmtpbmQgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6Y2hlY2tLaW5kLFxuXG5jaGVja0lzV2VsbEZvcm1lZDooYWxsZWdlZEtleUtpbmQsY2hlY2spPT5cbnR5cGVvZiBhbGxlZ2VkS2V5S2luZD09PSdzdHJpbmcnfHxcbmNoZWNrKFxuZmFsc2UsXG5YIGBtYXRjaDpraW5kOiBwYXlsb2FkOiAke2FsbGVnZWRLZXlLaW5kfSAtIEEga2luZCBuYW1lIG11c3QgYmUgYSBzdHJpbmdgKSxcblxuXG5nZXRSYW5rQ292ZXI6KGtpbmQsX2VuY29kZVBhc3NhYmxlKT0+e1xubGV0IHN0eWxlO1xuc3dpdGNoKGtpbmQpe1xuY2FzZSdjb3B5U2V0JzpcbmNhc2UnY29weU1hcCc6e1xuc3R5bGU9J3RhZ2dlZCc7XG5icmVhaztcbiB9XG5kZWZhdWx0OntcbnN0eWxlPWtpbmQ7XG5icmVhaztcbiB9fVxuXG5yZXR1cm4gZ2V0UGFzc1N0eWxlQ292ZXIoc3R5bGUpO1xuIH0sXG5cbmNoZWNrS2V5UGF0dGVybjooa2luZCxjaGVjayk9PntcbnN3aXRjaChraW5kKXtcbmNhc2UnYm9vbGVhbic6XG5jYXNlJ251bWJlcic6XG5jYXNlJ2JpZ2ludCc6XG5jYXNlJ3N0cmluZyc6XG5jYXNlJ3N5bWJvbCc6XG5jYXNlJ3JlbW90YWJsZSc6XG5jYXNlJ3VuZGVmaW5lZCc6e1xucmV0dXJuIHRydWU7XG4gfVxuZGVmYXVsdDp7XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgJHtraW5kfSBrZXlzIGFyZSBub3Qgc3VwcG9ydGVkYCk7XG4gfX1cblxuIH19KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hCaWdpbnRIZWxwZXI9RmFyKCdtYXRjaDpiaWdpbnQgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLFtsaW1pdHM9dW5kZWZpbmVkXSxjaGVjayk9PntcbmNvbnN0e2RlY2ltYWxEaWdpdHNMaW1pdH09bGltaXQobGltaXRzKTtcbnJldHVybihcbmNoZWNrS2luZChzcGVjaW1lbiwnYmlnaW50JyxjaGVjaykmJlxuY2hlY2tEZWNpbWFsRGlnaXRzTGltaXQoc3BlY2ltZW4sZGVjaW1hbERpZ2l0c0xpbWl0LGNoZWNrKSk7XG5cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDoocGF5bG9hZCxjaGVjayk9PlxuY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG5wYXlsb2FkLFxuaGFyZGVuKFtdKSxcbmNoZWNrLFxuJ21hdGNoOmJpZ2ludCBwYXlsb2FkJyksXG5cblxuZ2V0UmFua0NvdmVyOihfbWF0Y2hQYXlsb2FkLF9lbmNvZGVQYXNzYWJsZSk9PlxuZ2V0UGFzc1N0eWxlQ292ZXIoJ2JpZ2ludCcpLFxuXG5jaGVja0tleVBhdHRlcm46KF9tYXRjaGVyUGF5bG9hZCxfY2hlY2spPT50cnVlfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoTmF0SGVscGVyPUZhcignbWF0Y2g6bmF0IGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixbbGltaXRzPXVuZGVmaW5lZF0sY2hlY2spPT57XG5jb25zdHtkZWNpbWFsRGlnaXRzTGltaXR9PWxpbWl0KGxpbWl0cyk7XG5yZXR1cm4oXG5jaGVja0tpbmQoc3BlY2ltZW4sJ2JpZ2ludCcsY2hlY2spJiZcbmNoZWNrKHNwZWNpbWVuPj0wbixYIGAke3NwZWNpbWVufSAtIE11c3QgYmUgbm9uLW5lZ2F0aXZlYCkmJlxuY2hlY2tEZWNpbWFsRGlnaXRzTGltaXQoc3BlY2ltZW4sZGVjaW1hbERpZ2l0c0xpbWl0LGNoZWNrKSk7XG5cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDoocGF5bG9hZCxjaGVjayk9PlxuY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG5wYXlsb2FkLFxuaGFyZGVuKFtdKSxcbmNoZWNrLFxuJ21hdGNoOm5hdCBwYXlsb2FkJyksXG5cblxuZ2V0UmFua0NvdmVyOihfbWF0Y2hQYXlsb2FkLF9lbmNvZGVQYXNzYWJsZSk9PlxuLyogVE9ETyBDb3VsZCBiZSBtb3JlIHByZWNpc2UqL1xuZ2V0UGFzc1N0eWxlQ292ZXIoJ2JpZ2ludCcpLFxuXG5jaGVja0tleVBhdHRlcm46KF9tYXRjaGVyUGF5bG9hZCxfY2hlY2spPT50cnVlfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoU3RyaW5nSGVscGVyPUZhcignbWF0Y2g6c3RyaW5nIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixbbGltaXRzPXVuZGVmaW5lZF0sY2hlY2spPT57XG5jb25zdHtzdHJpbmdMZW5ndGhMaW1pdH09bGltaXQobGltaXRzKTtcbnJldHVybihcbmNoZWNrS2luZChzcGVjaW1lbiwnc3RyaW5nJyxjaGVjaykmJihcbnNwZWNpbWVuLmxlbmd0aDw9c3RyaW5nTGVuZ3RoTGltaXR8fFxuY2hlY2soXG5mYWxzZSxcblggYHN0cmluZyAke3NwZWNpbWVufSBtdXN0IG5vdCBiZSBiaWdnZXIgdGhhbiAke3N0cmluZ0xlbmd0aExpbWl0fWApKSk7XG5cblxuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihwYXlsb2FkLGNoZWNrKT0+XG5jaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbnBheWxvYWQsXG5oYXJkZW4oW10pLFxuY2hlY2ssXG4nbWF0Y2g6c3RyaW5nIHBheWxvYWQnKSxcblxuXG5nZXRSYW5rQ292ZXI6KF9tYXRjaFBheWxvYWQsX2VuY29kZVBhc3NhYmxlKT0+XG5nZXRQYXNzU3R5bGVDb3Zlcignc3RyaW5nJyksXG5cbmNoZWNrS2V5UGF0dGVybjooX21hdGNoZXJQYXlsb2FkLF9jaGVjayk9PnRydWV9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hTeW1ib2xIZWxwZXI9RmFyKCdtYXRjaDpzeW1ib2wgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLFtsaW1pdHM9dW5kZWZpbmVkXSxjaGVjayk9PntcbmNvbnN0e3N5bWJvbE5hbWVMZW5ndGhMaW1pdH09bGltaXQobGltaXRzKTtcbmlmKCFjaGVja0tpbmQoc3BlY2ltZW4sJ3N5bWJvbCcsY2hlY2spKXtcbnJldHVybiBmYWxzZTtcbiB9XG5jb25zdCBzeW1ib2xOYW1lPW5hbWVGb3JQYXNzYWJsZVN5bWJvbChzcGVjaW1lbik7XG5hc3NlcnQudHlwZW9mKFxuc3ltYm9sTmFtZSxcbidzdHJpbmcnLFxuWCBgaW50ZXJuYWw6IFBhc3NhYmxlIHN5bWJvbCAke3NwZWNpbWVufSBtdXN0IGhhdmUgYSBwYXNzYWJsZSBuYW1lYCk7XG5cbnJldHVybiBjaGVjayhcbnN5bWJvbE5hbWUubGVuZ3RoPD1zeW1ib2xOYW1lTGVuZ3RoTGltaXQsXG5YIGBTeW1ib2wgbmFtZSAke3EoXG5zeW1ib2xOYW1lKVxuIH0gbXVzdCBub3QgYmUgYmlnZ2VyIHRoYW4gJHtzeW1ib2xOYW1lTGVuZ3RoTGltaXR9YCk7XG5cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDoocGF5bG9hZCxjaGVjayk9PlxuY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG5wYXlsb2FkLFxuaGFyZGVuKFtdKSxcbmNoZWNrLFxuJ21hdGNoOmJpZ2ludCBwYXlsb2FkJyksXG5cblxuZ2V0UmFua0NvdmVyOihfbWF0Y2hQYXlsb2FkLF9lbmNvZGVQYXNzYWJsZSk9PlxuZ2V0UGFzc1N0eWxlQ292ZXIoJ3N5bWJvbCcpLFxuXG5jaGVja0tleVBhdHRlcm46KF9tYXRjaGVyUGF5bG9hZCxfY2hlY2spPT50cnVlfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoUmVtb3RhYmxlSGVscGVyPUZhcignbWF0Y2g6cmVtb3RhYmxlIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixyZW1vdGFibGVEZXNjLGNoZWNrKT0+e1xuLyogVW5mb3J0dW5hdGUgZHVwbGljYXRpb24gb2YgY2hlY2tLaW5kIGxvZ2ljLCBidXQgbm8gYmV0dGVyIGNob2ljZXMuKi9cbmlmKGNoZWNrS2luZChzcGVjaW1lbiwncmVtb3RhYmxlJyxpZGVudENoZWNrZXIpKXtcbnJldHVybiB0cnVlO1xuIH1cbmlmKGNoZWNrPT09aWRlbnRDaGVja2VyKXtcbnJldHVybiBmYWxzZTtcbiB9XG5sZXQgc3BlY2ltZW5LaW5kPXBhc3NTdHlsZU9mKHNwZWNpbWVuKTtcbmlmKHNwZWNpbWVuS2luZD09PSd0YWdnZWQnKXtcbnNwZWNpbWVuS2luZD1nZXRUYWcoc3BlY2ltZW4pO1xuIH1cbmNvbnN0e2xhYmVsfT1yZW1vdGFibGVEZXNjO1xuXG4vKiBxdW90aW5nIHdpdGhvdXQgcXVvdGVzKi9cbmNvbnN0IGRldGFpbHM9WChcblsgYCR7c3BlY2ltZW5LaW5kfSBgLGAgLSBNdXN0IGJlIGEgcmVtb3RhYmxlICgke2xhYmVsfSlgXSxcbnNwZWNpbWVuKTtcblxucmV0dXJuIGNoZWNrKGZhbHNlLGRldGFpbHMpO1xuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihhbGxlZ2VkUmVtb3RhYmxlRGVzYyxjaGVjayk9PlxuY2hlY2tNYXRjaGVzKFxuYWxsZWdlZFJlbW90YWJsZURlc2MsXG5oYXJkZW4oe2xhYmVsOk1NLnN0cmluZygpfSksXG5jaGVjayxcbidtYXRjaDpyZW1vdGFibGUgcGF5bG9hZCcpLFxuXG5cbmdldFJhbmtDb3ZlcjooX3JlbW90YWJsZURlc2MsX2VuY29kZVBhc3NhYmxlKT0+XG5nZXRQYXNzU3R5bGVDb3ZlcigncmVtb3RhYmxlJyksXG5cbmNoZWNrS2V5UGF0dGVybjooX3JlbW90YWJsZURlc2MsX2NoZWNrKT0+dHJ1ZX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaExURUhlbHBlcj1GYXIoJ21hdGNoOmx0ZSBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4scmlnaHRPcGVyYW5kLGNoZWNrKT0+XG5rZXlMVEUoc3BlY2ltZW4scmlnaHRPcGVyYW5kKXx8XG5jaGVjayhmYWxzZSxYIGAke3NwZWNpbWVufSAtIE11c3QgYmUgPD0gJHtyaWdodE9wZXJhbmR9YCksXG5cbmNoZWNrSXNXZWxsRm9ybWVkOmNoZWNrS2V5LFxuXG5nZXRSYW5rQ292ZXI6KHJpZ2h0T3BlcmFuZCxlbmNvZGVQYXNzYWJsZSk9PntcbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihyaWdodE9wZXJhbmQpO1xuLyogVGhlIHByZWZlci1jb25zdCBtYWtlcyBubyBzZW5zZSB3aGVuIHNvbWUgb2YgdGhlIHZhcmlhYmxlcyBuZWVkKi9cbi8qIHRvIGJlIGBsZXRgKi9cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3QqL1xubGV0W2xlZnRCb3VuZCxyaWdodEJvdW5kXT1nZXRQYXNzU3R5bGVDb3ZlcihwYXNzU3R5bGUpO1xuY29uc3QgbmV3UmlnaHRCb3VuZD0gYCR7ZW5jb2RlUGFzc2FibGUocmlnaHRPcGVyYW5kKX1+YDtcbmlmKG5ld1JpZ2h0Qm91bmQhPT11bmRlZmluZWQpe1xucmlnaHRCb3VuZD1uZXdSaWdodEJvdW5kO1xuIH1cbnJldHVybltsZWZ0Qm91bmQscmlnaHRCb3VuZF07XG4gfSxcblxuY2hlY2tLZXlQYXR0ZXJuOihyaWdodE9wZXJhbmQsY2hlY2spPT5cbmNoZWNrS2V5UGF0dGVybihyaWdodE9wZXJhbmQsY2hlY2spfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoTFRIZWxwZXI9RmFyKCdtYXRjaDpsdCBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4scmlnaHRPcGVyYW5kLGNoZWNrKT0+XG5rZXlMVChzcGVjaW1lbixyaWdodE9wZXJhbmQpfHxcbmNoZWNrKGZhbHNlLFggYCR7c3BlY2ltZW59IC0gTXVzdCBiZSA8ICR7cmlnaHRPcGVyYW5kfWApLFxuXG5jaGVja0lzV2VsbEZvcm1lZDpjaGVja0tleSxcblxuZ2V0UmFua0NvdmVyOm1hdGNoTFRFSGVscGVyLmdldFJhbmtDb3ZlcixcblxuY2hlY2tLZXlQYXR0ZXJuOihyaWdodE9wZXJhbmQsY2hlY2spPT5cbmNoZWNrS2V5UGF0dGVybihyaWdodE9wZXJhbmQsY2hlY2spfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoR1RFSGVscGVyPUZhcignbWF0Y2g6Z3RlIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixyaWdodE9wZXJhbmQsY2hlY2spPT5cbmtleUdURShzcGVjaW1lbixyaWdodE9wZXJhbmQpfHxcbmNoZWNrKGZhbHNlLFggYCR7c3BlY2ltZW59IC0gTXVzdCBiZSA+PSAke3JpZ2h0T3BlcmFuZH1gKSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6Y2hlY2tLZXksXG5cbmdldFJhbmtDb3ZlcjoocmlnaHRPcGVyYW5kLGVuY29kZVBhc3NhYmxlKT0+e1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHJpZ2h0T3BlcmFuZCk7XG4vKiBUaGUgcHJlZmVyLWNvbnN0IG1ha2VzIG5vIHNlbnNlIHdoZW4gc29tZSBvZiB0aGUgdmFyaWFibGVzIG5lZWQqL1xuLyogdG8gYmUgYGxldGAqL1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdCovXG5sZXRbbGVmdEJvdW5kLHJpZ2h0Qm91bmRdPWdldFBhc3NTdHlsZUNvdmVyKHBhc3NTdHlsZSk7XG5jb25zdCBuZXdMZWZ0Qm91bmQ9ZW5jb2RlUGFzc2FibGUocmlnaHRPcGVyYW5kKTtcbmlmKG5ld0xlZnRCb3VuZCE9PXVuZGVmaW5lZCl7XG5sZWZ0Qm91bmQ9bmV3TGVmdEJvdW5kO1xuIH1cbnJldHVybltsZWZ0Qm91bmQscmlnaHRCb3VuZF07XG4gfSxcblxuY2hlY2tLZXlQYXR0ZXJuOihyaWdodE9wZXJhbmQsY2hlY2spPT5cbmNoZWNrS2V5UGF0dGVybihyaWdodE9wZXJhbmQsY2hlY2spfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoR1RIZWxwZXI9RmFyKCdtYXRjaDpndCBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4scmlnaHRPcGVyYW5kLGNoZWNrKT0+XG5rZXlHVChzcGVjaW1lbixyaWdodE9wZXJhbmQpfHxcbmNoZWNrKGZhbHNlLFggYCR7c3BlY2ltZW59IC0gTXVzdCBiZSA+ICR7cmlnaHRPcGVyYW5kfWApLFxuXG5jaGVja0lzV2VsbEZvcm1lZDpjaGVja0tleSxcblxuZ2V0UmFua0NvdmVyOm1hdGNoR1RFSGVscGVyLmdldFJhbmtDb3ZlcixcblxuY2hlY2tLZXlQYXR0ZXJuOihyaWdodE9wZXJhbmQsY2hlY2spPT5cbmNoZWNrS2V5UGF0dGVybihyaWdodE9wZXJhbmQsY2hlY2spfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoUmVjb3JkT2ZIZWxwZXI9RmFyKCdtYXRjaDpyZWNvcmRPZiBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooXG5zcGVjaW1lbixcbltrZXlQYXR0LHZhbHVlUGF0dCxsaW1pdHM9dW5kZWZpbmVkXSxcbmNoZWNrKT0+XG57XG5jb25zdHtudW1Qcm9wZXJ0aWVzTGltaXQscHJvcGVydHlOYW1lTGVuZ3RoTGltaXR9PWxpbWl0KGxpbWl0cyk7XG5yZXR1cm4oXG5jaGVja0tpbmQoc3BlY2ltZW4sJ2NvcHlSZWNvcmQnLGNoZWNrKSYmXG5jaGVjayhcbm93bktleXMoc3BlY2ltZW4pLmxlbmd0aDw9bnVtUHJvcGVydGllc0xpbWl0LFxuWCBgTXVzdCBub3QgaGF2ZSBtb3JlIHRoYW4gJHtxKFxubnVtUHJvcGVydGllc0xpbWl0KVxuIH0gcHJvcGVydGllczogJHtzcGVjaW1lbn1gKSYmXG5cbmVudHJpZXMoc3BlY2ltZW4pLmV2ZXJ5KFxuKFtrZXksdmFsdWVdKT0+XG5hcHBseUxhYmVsaW5nRXJyb3IoXG5jaGVjayxcbltcbmtleS5sZW5ndGg8PXByb3BlcnR5TmFtZUxlbmd0aExpbWl0LFxuWCBgUHJvcGVydHkgbmFtZSBtdXN0IG5vdCBiZSBsb25nZXIgdGhhbiAke3EoXG5wcm9wZXJ0eU5hbWVMZW5ndGhMaW1pdClcbiB9YF0sXG5cbmtleSkmJlxuXG5jaGVja01hdGNoZXMoXG5oYXJkZW4oW2tleSx2YWx1ZV0pLFxuaGFyZGVuKFtrZXlQYXR0LHZhbHVlUGF0dF0pLFxuY2hlY2ssXG5rZXkpKSk7XG5cblxuXG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KHBheWxvYWQsY2hlY2spPT5cbmNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxucGF5bG9hZCxcbmhhcmRlbihbTU0ucGF0dGVybigpLE1NLnBhdHRlcm4oKV0pLFxuY2hlY2ssXG4nbWF0Y2g6cmVjb3JkT2YgcGF5bG9hZCcpLFxuXG5cbmdldFJhbmtDb3ZlcjooX2VudHJ5UGF0dCk9PmdldFBhc3NTdHlsZUNvdmVyKCdjb3B5UmVjb3JkJyksXG5cbmNoZWNrS2V5UGF0dGVybjooX2VudHJ5UGF0dCxjaGVjayk9PlxuY2hlY2soZmFsc2UsWCBgUmVjb3JkcyBub3QgeWV0IHN1cHBvcnRlZCBhcyBrZXlzYCl9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hBcnJheU9mSGVscGVyPUZhcignbWF0Y2g6YXJyYXlPZiBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4sW3N1YlBhdHQsbGltaXRzPXVuZGVmaW5lZF0sY2hlY2spPT57XG5jb25zdHthcnJheUxlbmd0aExpbWl0fT1saW1pdChsaW1pdHMpO1xucmV0dXJuKFxuY2hlY2tLaW5kKHNwZWNpbWVuLCdjb3B5QXJyYXknLGNoZWNrKSYmKFxuc3BlY2ltZW4ubGVuZ3RoPD1hcnJheUxlbmd0aExpbWl0fHxcbmNoZWNrKFxuZmFsc2UsXG5YIGBBcnJheSBsZW5ndGggJHtzcGVjaW1lbi5sZW5ndGh9IG11c3QgYmUgPD0gbGltaXQgJHthcnJheUxlbmd0aExpbWl0fWApKSYmXG5cbmFycmF5RXZlcnlNYXRjaFBhdHRlcm4oc3BlY2ltZW4sc3ViUGF0dCxjaGVjaykpO1xuXG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KHBheWxvYWQsY2hlY2spPT5cbmNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxucGF5bG9hZCxcbmhhcmRlbihbTU0ucGF0dGVybigpXSksXG5jaGVjayxcbidtYXRjaDphcnJheU9mIHBheWxvYWQnKSxcblxuXG5nZXRSYW5rQ292ZXI6KCk9PmdldFBhc3NTdHlsZUNvdmVyKCdjb3B5QXJyYXknKSxcblxuY2hlY2tLZXlQYXR0ZXJuOihfLGNoZWNrKT0+XG5jaGVjayhmYWxzZSxYIGBBcnJheXMgbm90IHlldCBzdXBwb3J0ZWQgYXMga2V5c2ApfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoU2V0T2ZIZWxwZXI9RmFyKCdtYXRjaDpzZXRPZiBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4sW2tleVBhdHQsbGltaXRzPXVuZGVmaW5lZF0sY2hlY2spPT57XG5jb25zdHtudW1TZXRFbGVtZW50c0xpbWl0fT1saW1pdChsaW1pdHMpO1xucmV0dXJuKFxuY2hlY2tLaW5kKHNwZWNpbWVuLCdjb3B5U2V0JyxjaGVjaykmJlxuY2hlY2soXG5zcGVjaW1lbi5wYXlsb2FkLmxlbmd0aDxudW1TZXRFbGVtZW50c0xpbWl0LFxuWCBgU2V0IG11c3Qgbm90IGhhdmUgbW9yZSB0aGFuICR7cShudW1TZXRFbGVtZW50c0xpbWl0KX0gZWxlbWVudHM6ICR7XG5zcGVjaW1lbi5wYXlsb2FkLmxlbmd0aFxuIH1gKSYmXG5cbmFycmF5RXZlcnlNYXRjaFBhdHRlcm4oc3BlY2ltZW4ucGF5bG9hZCxrZXlQYXR0LGNoZWNrLCdzZXQgZWxlbWVudHMnKSk7XG5cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDoocGF5bG9hZCxjaGVjayk9PlxuY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG5wYXlsb2FkLFxuaGFyZGVuKFtNTS5wYXR0ZXJuKCldKSxcbmNoZWNrLFxuJ21hdGNoOnNldE9mIHBheWxvYWQnKSxcblxuXG5nZXRSYW5rQ292ZXI6KCk9PmdldFBhc3NTdHlsZUNvdmVyKCd0YWdnZWQnKSxcblxuY2hlY2tLZXlQYXR0ZXJuOihfLGNoZWNrKT0+XG5jaGVjayhmYWxzZSxYIGBDb3B5U2V0cyBub3QgeWV0IHN1cHBvcnRlZCBhcyBrZXlzYCl9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hCYWdPZkhlbHBlcj1GYXIoJ21hdGNoOmJhZ09mIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihcbnNwZWNpbWVuLFxuW2tleVBhdHQsY291bnRQYXR0LGxpbWl0cz11bmRlZmluZWRdLFxuY2hlY2spPT5cbntcbmNvbnN0e251bVVuaXF1ZUJhZ0VsZW1lbnRzTGltaXQsZGVjaW1hbERpZ2l0c0xpbWl0fT1saW1pdChsaW1pdHMpO1xucmV0dXJuKFxuY2hlY2tLaW5kKHNwZWNpbWVuLCdjb3B5QmFnJyxjaGVjaykmJlxuY2hlY2soXG5zcGVjaW1lbi5wYXlsb2FkLmxlbmd0aDw9bnVtVW5pcXVlQmFnRWxlbWVudHNMaW1pdCxcblggYEJhZyBtdXN0IG5vdCBoYXZlIG1vcmUgdGhhbiAke3EoXG5udW1VbmlxdWVCYWdFbGVtZW50c0xpbWl0KVxuIH0gdW5pcXVlIGVsZW1lbnRzOiAke3NwZWNpbWVufWApJiZcblxuc3BlY2ltZW4ucGF5bG9hZC5ldmVyeShcbihba2V5LGNvdW50XSxpKT0+XG5jaGVja01hdGNoZXMoa2V5LGtleVBhdHQsY2hlY2ssIGBiYWcga2V5c1ske2l9XWApJiZcbmFwcGx5TGFiZWxpbmdFcnJvcihcbmNoZWNrRGVjaW1hbERpZ2l0c0xpbWl0LFxuW2NvdW50LGRlY2ltYWxEaWdpdHNMaW1pdCxjaGVja10sXG4gYGJhZyBjb3VudHNbJHtpfV1gKSYmXG5cbmNoZWNrTWF0Y2hlcyhjb3VudCxjb3VudFBhdHQsY2hlY2ssIGBiYWcgY291bnRzWyR7aX1dYCkpKTtcblxuXG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KHBheWxvYWQsY2hlY2spPT5cbmNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxucGF5bG9hZCxcbmhhcmRlbihbTU0ucGF0dGVybigpLE1NLnBhdHRlcm4oKV0pLFxuY2hlY2ssXG4nbWF0Y2g6YmFnT2YgcGF5bG9hZCcpLFxuXG5cbmdldFJhbmtDb3ZlcjooKT0+Z2V0UGFzc1N0eWxlQ292ZXIoJ3RhZ2dlZCcpLFxuXG5jaGVja0tleVBhdHRlcm46KF8sY2hlY2spPT5cbmNoZWNrKGZhbHNlLFggYENvcHlCYWdzIG5vdCB5ZXQgc3VwcG9ydGVkIGFzIGtleXNgKX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaE1hcE9mSGVscGVyPUZhcignbWF0Y2g6bWFwT2YgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KFxuc3BlY2ltZW4sXG5ba2V5UGF0dCx2YWx1ZVBhdHQsbGltaXRzPXVuZGVmaW5lZF0sXG5jaGVjayk9Plxue1xuY29uc3R7bnVtTWFwRW50cmllc0xpbWl0fT1saW1pdChsaW1pdHMpO1xucmV0dXJuKFxuY2hlY2tLaW5kKHNwZWNpbWVuLCdjb3B5TWFwJyxjaGVjaykmJlxuY2hlY2soXG5zcGVjaW1lbi5wYXlsb2FkLmtleXMubGVuZ3RoPD1udW1NYXBFbnRyaWVzTGltaXQsXG5YIGBDb3B5TWFwIG11c3QgaGF2ZSBubyBtb3JlIHRoYW4gJHtxKFxubnVtTWFwRW50cmllc0xpbWl0KVxuIH0gZW50cmllczogJHtzcGVjaW1lbn1gKSYmXG5cbmFycmF5RXZlcnlNYXRjaFBhdHRlcm4oXG5zcGVjaW1lbi5wYXlsb2FkLmtleXMsXG5rZXlQYXR0LFxuY2hlY2ssXG4nbWFwIGtleXMnKSYmXG5cbmFycmF5RXZlcnlNYXRjaFBhdHRlcm4oXG5zcGVjaW1lbi5wYXlsb2FkLnZhbHVlcyxcbnZhbHVlUGF0dCxcbmNoZWNrLFxuJ21hcCB2YWx1ZXMnKSk7XG5cblxuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihwYXlsb2FkLGNoZWNrKT0+XG5jaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbnBheWxvYWQsXG5oYXJkZW4oW01NLnBhdHRlcm4oKSxNTS5wYXR0ZXJuKCldKSxcbmNoZWNrLFxuJ21hdGNoOm1hcE9mIHBheWxvYWQnKSxcblxuXG5nZXRSYW5rQ292ZXI6KF9lbnRyeVBhdHQpPT5nZXRQYXNzU3R5bGVDb3ZlcigndGFnZ2VkJyksXG5cbmNoZWNrS2V5UGF0dGVybjooX2VudHJ5UGF0dCxjaGVjayk9PlxuY2hlY2soZmFsc2UsWCBgQ29weU1hcCBub3QgeWV0IHN1cHBvcnRlZCBhcyBrZXlzYCl9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hTcGxpdEhlbHBlcj1GYXIoJ21hdGNoOnNwbGl0IGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixbYmFzZSxyZXN0PXVuZGVmaW5lZF0sY2hlY2spPT57XG5jb25zdCBiYXNlU3R5bGU9cGFzc1N0eWxlT2YoYmFzZSk7XG5pZighY2hlY2tLaW5kKHNwZWNpbWVuLGJhc2VTdHlsZSxjaGVjaykpe1xucmV0dXJuIGZhbHNlO1xuIH1cbmxldCBzcGVjQjtcbmxldCBzcGVjUjtcbmlmKGJhc2VTdHlsZT09PSdjb3B5QXJyYXknKXtcbmNvbnN0e2xlbmd0aDpiYXNlTGVufT1iYXNlO1xuLyogRnJvemVuIGJlbG93Ki9cbnNwZWNCPXNwZWNpbWVuLnNsaWNlKDAsYmFzZUxlbik7XG5zcGVjUj1zcGVjaW1lbi5zbGljZShiYXNlTGVuKTtcbiB9ZWxzZXtcbmFzc2VydChiYXNlU3R5bGU9PT0nY29weVJlY29yZCcpO1xuLyogTm90IHlldCBmcm96ZW4hIE11dGF0ZWQgaW4gcGxhY2UqL1xuc3BlY0I9e307XG5zcGVjUj17fTtcbmZvcihjb25zdFtuYW1lLHZhbHVlXW9mIGVudHJpZXMoc3BlY2ltZW4pKXtcbmlmKGhhc093blByb3BlcnR5T2YoYmFzZSxuYW1lKSl7XG5zcGVjQltuYW1lXT12YWx1ZTtcbiB9ZWxzZXtcbnNwZWNSW25hbWVdPXZhbHVlO1xuIH1cbiB9XG4gfVxuaGFyZGVuKHNwZWNCKTtcbmhhcmRlbihzcGVjUik7XG5yZXR1cm4oXG5jaGVja01hdGNoZXMoc3BlY0IsYmFzZSxjaGVjaywncmVxdWlyZWQtcGFydHMnKSYmKFxucmVzdD09PXVuZGVmaW5lZHx8Y2hlY2tNYXRjaGVzKHNwZWNSLHJlc3QsY2hlY2ssJ3Jlc3QtcGFydHMnKSkpO1xuXG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KHNwbGl0QXJncyxjaGVjayk9PntcbmlmKFxucGFzc1N0eWxlT2Yoc3BsaXRBcmdzKT09PSdjb3B5QXJyYXknJiYoXG5zcGxpdEFyZ3MubGVuZ3RoPT09MXx8c3BsaXRBcmdzLmxlbmd0aD09PTIpKVxue1xuY29uc3RbYmFzZSxyZXN0PXVuZGVmaW5lZF09c3BsaXRBcmdzO1xuY29uc3QgYmFzZVN0eWxlPXBhc3NTdHlsZU9mKGJhc2UpO1xuaWYoXG5pc1BhdHRlcm4oYmFzZSkmJihcbmJhc2VTdHlsZT09PSdjb3B5QXJyYXknfHxiYXNlU3R5bGU9PT0nY29weVJlY29yZCcpJiYoXG5yZXN0PT09dW5kZWZpbmVkfHxpc1BhdHRlcm4ocmVzdCkpKVxue1xucmV0dXJuIHRydWU7XG4gfVxuIH1cbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgTXVzdCBiZSBhbiBhcnJheSBvZiBhIGJhc2Ugc3RydWN0dXJlIGFuZCBhbiBvcHRpb25hbCByZXN0IHBhdHRlcm46ICR7c3BsaXRBcmdzfWApO1xuXG4gfSxcblxuZ2V0UmFua0NvdmVyOihbYmFzZSxfcmVzdD11bmRlZmluZWRdKT0+XG5nZXRQYXNzU3R5bGVDb3ZlcihwYXNzU3R5bGVPZihiYXNlKSksXG5cbmNoZWNrS2V5UGF0dGVybjooW2Jhc2UsX3Jlc3Q9dW5kZWZpbmVkXSxjaGVjayk9PlxuY2hlY2soZmFsc2UsWCBgJHtxKHBhc3NTdHlsZU9mKGJhc2UpKX0gbm90IHlldCBzdXBwb3J0ZWQgYXMga2V5c2ApfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoUGFydGlhbEhlbHBlcj1GYXIoJ21hdGNoOnBhcnRpYWwgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLFtiYXNlLHJlc3Q9dW5kZWZpbmVkXSxjaGVjayk9PntcbmNvbnN0IGJhc2VTdHlsZT1wYXNzU3R5bGVPZihiYXNlKTtcbmlmKCFjaGVja0tpbmQoc3BlY2ltZW4sYmFzZVN0eWxlLGNoZWNrKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxubGV0IHNwZWNCO1xubGV0IHNwZWNSO1xubGV0IG5ld0Jhc2U7XG5pZihiYXNlU3R5bGU9PT0nY29weUFycmF5Jyl7XG5jb25zdHtsZW5ndGg6c3BlY2ltZW5MZW59PXNwZWNpbWVuO1xuY29uc3R7bGVuZ3RoOmJhc2VMZW59PWJhc2U7XG5pZihzcGVjaW1lbkxlbjxiYXNlTGVuKXtcbm5ld0Jhc2U9aGFyZGVuKGJhc2Uuc2xpY2UoMCxzcGVjaW1lbkxlbikpO1xuc3BlY0I9c3BlY2ltZW47XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuc3BlY1I9W107XG4gfWVsc2V7XG5uZXdCYXNlPVsuLi5iYXNlXTtcbnNwZWNCPXNwZWNpbWVuLnNsaWNlKDAsYmFzZUxlbik7XG5zcGVjUj1zcGVjaW1lbi5zbGljZShiYXNlTGVuKTtcbiB9XG5mb3IobGV0IGk9MDtpPG5ld0Jhc2UubGVuZ3RoO2krPTEpe1xuLyogRm9yIHRoZSBvcHRpb25hbCBiYXNlIGFycmF5IHBhcnRzLCBhbiB1bmRlZmluZWQgc3BlY2ltZW4gZWxlbWVudCovXG4vKiBtYXRjaGVzIHVuY29uZGl0aW9uYWxseS4qL1xuaWYoc3BlY0JbaV09PT11bmRlZmluZWQpe1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbm5ld0Jhc2VbaV09TS5hbnkoKTtcbiB9XG4gfVxuIH1lbHNle1xuYXNzZXJ0KGJhc2VTdHlsZT09PSdjb3B5UmVjb3JkJyk7XG4vKiBOb3QgeWV0IGZyb3plbiEgTXV0YXRlZCBpbiBwbGFjZSovXG5zcGVjQj17fTtcbnNwZWNSPXt9O1xubmV3QmFzZT17fTtcbmZvcihjb25zdFtuYW1lLHZhbHVlXW9mIGVudHJpZXMoc3BlY2ltZW4pKXtcbmlmKGhhc093blByb3BlcnR5T2YoYmFzZSxuYW1lKSl7XG4vKiBGb3IgdGhlIG9wdGlvbmFsIGJhc2UgcmVjb3JkIHBhcnRzLCBhbiB1bmRlZmluZWQgc3BlY2ltZW4gdmFsdWUqL1xuLyogbWF0Y2hlcyB1bmNvbmRpdGlvbmFsbHkuKi9cbmlmKHZhbHVlIT09dW5kZWZpbmVkKXtcbnNwZWNCW25hbWVdPXZhbHVlO1xubmV3QmFzZVtuYW1lXT1iYXNlW25hbWVdO1xuIH1cbiB9ZWxzZXtcbnNwZWNSW25hbWVdPXZhbHVlO1xuIH1cbiB9XG4gfVxuaGFyZGVuKHNwZWNCKTtcbmhhcmRlbihzcGVjUik7XG5oYXJkZW4obmV3QmFzZSk7XG5yZXR1cm4oXG5jaGVja01hdGNoZXMoc3BlY0IsbmV3QmFzZSxjaGVjaywnb3B0aW9uYWwtcGFydHMnKSYmKFxucmVzdD09PXVuZGVmaW5lZHx8Y2hlY2tNYXRjaGVzKHNwZWNSLHJlc3QsY2hlY2ssJ3Jlc3QtcGFydHMnKSkpO1xuXG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6bWF0Y2hTcGxpdEhlbHBlci5jaGVja0lzV2VsbEZvcm1lZCxcblxuZ2V0UmFua0NvdmVyOm1hdGNoU3BsaXRIZWxwZXIuZ2V0UmFua0NvdmVyLFxuXG5jaGVja0tleVBhdHRlcm46bWF0Y2hTcGxpdEhlbHBlci5jaGVja0tleVBhdHRlcm59KTtcblxuXG4vKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIE1hdGNoSGVscGVyPn0gKi9cbmNvbnN0IEhlbHBlcnNCeU1hdGNoVGFnPWhhcmRlbih7XG4nbWF0Y2g6YW55JzptYXRjaEFueUhlbHBlcixcbidtYXRjaDphbmQnOm1hdGNoQW5kSGVscGVyLFxuJ21hdGNoOm9yJzptYXRjaE9ySGVscGVyLFxuJ21hdGNoOm5vdCc6bWF0Y2hOb3RIZWxwZXIsXG5cbidtYXRjaDpzY2FsYXInOm1hdGNoU2NhbGFySGVscGVyLFxuJ21hdGNoOmtleSc6bWF0Y2hLZXlIZWxwZXIsXG4nbWF0Y2g6cGF0dGVybic6bWF0Y2hQYXR0ZXJuSGVscGVyLFxuJ21hdGNoOmtpbmQnOm1hdGNoS2luZEhlbHBlcixcbidtYXRjaDpiaWdpbnQnOm1hdGNoQmlnaW50SGVscGVyLFxuJ21hdGNoOm5hdCc6bWF0Y2hOYXRIZWxwZXIsXG4nbWF0Y2g6c3RyaW5nJzptYXRjaFN0cmluZ0hlbHBlcixcbidtYXRjaDpzeW1ib2wnOm1hdGNoU3ltYm9sSGVscGVyLFxuJ21hdGNoOnJlbW90YWJsZSc6bWF0Y2hSZW1vdGFibGVIZWxwZXIsXG5cbidtYXRjaDpsdCc6bWF0Y2hMVEhlbHBlcixcbidtYXRjaDpsdGUnOm1hdGNoTFRFSGVscGVyLFxuJ21hdGNoOmd0ZSc6bWF0Y2hHVEVIZWxwZXIsXG4nbWF0Y2g6Z3QnOm1hdGNoR1RIZWxwZXIsXG5cbidtYXRjaDphcnJheU9mJzptYXRjaEFycmF5T2ZIZWxwZXIsXG4nbWF0Y2g6cmVjb3JkT2YnOm1hdGNoUmVjb3JkT2ZIZWxwZXIsXG4nbWF0Y2g6c2V0T2YnOm1hdGNoU2V0T2ZIZWxwZXIsXG4nbWF0Y2g6YmFnT2YnOm1hdGNoQmFnT2ZIZWxwZXIsXG4nbWF0Y2g6bWFwT2YnOm1hdGNoTWFwT2ZIZWxwZXIsXG4nbWF0Y2g6c3BsaXQnOm1hdGNoU3BsaXRIZWxwZXIsXG4nbWF0Y2g6cGFydGlhbCc6bWF0Y2hQYXJ0aWFsSGVscGVyfSk7XG5cblxuY29uc3QgbWFrZU1hdGNoZXI9KHRhZyxwYXlsb2FkKT0+e1xuY29uc3QgbWF0Y2hlcj1tYWtlVGFnZ2VkKHRhZyxwYXlsb2FkKTtcbmFzc2VydFBhdHRlcm4obWF0Y2hlcik7XG5yZXR1cm4gbWF0Y2hlcjtcbiB9O1xuXG5jb25zdCBtYWtlS2luZE1hdGNoZXI9KGtpbmQpPT5tYWtlTWF0Y2hlcignbWF0Y2g6a2luZCcsa2luZCk7XG5cbmNvbnN0IEFueVNoYXBlPW1ha2VNYXRjaGVyKCdtYXRjaDphbnknLHVuZGVmaW5lZCk7XG5jb25zdCBTY2FsYXJTaGFwZT1tYWtlTWF0Y2hlcignbWF0Y2g6c2NhbGFyJyx1bmRlZmluZWQpO1xuY29uc3QgS2V5U2hhcGU9bWFrZU1hdGNoZXIoJ21hdGNoOmtleScsdW5kZWZpbmVkKTtcbmNvbnN0IFBhdHRlcm5TaGFwZT1tYWtlTWF0Y2hlcignbWF0Y2g6cGF0dGVybicsdW5kZWZpbmVkKTtcbmNvbnN0IEJvb2xlYW5TaGFwZT1tYWtlS2luZE1hdGNoZXIoJ2Jvb2xlYW4nKTtcbmNvbnN0IE51bWJlclNoYXBlPW1ha2VLaW5kTWF0Y2hlcignbnVtYmVyJyk7XG5jb25zdCBCaWdJbnRTaGFwZT1tYWtlVGFnZ2VkKCdtYXRjaDpiaWdpbnQnLFtdKTtcbmNvbnN0IE5hdFNoYXBlPW1ha2VUYWdnZWQoJ21hdGNoOm5hdCcsW10pO1xuY29uc3QgU3RyaW5nU2hhcGU9bWFrZVRhZ2dlZCgnbWF0Y2g6c3RyaW5nJyxbXSk7XG5jb25zdCBTeW1ib2xTaGFwZT1tYWtlVGFnZ2VkKCdtYXRjaDpzeW1ib2wnLFtdKTtcbmNvbnN0IFJlY29yZFNoYXBlPW1ha2VUYWdnZWQoJ21hdGNoOnJlY29yZE9mJyxbQW55U2hhcGUsQW55U2hhcGVdKTtcbmNvbnN0IEFycmF5U2hhcGU9bWFrZVRhZ2dlZCgnbWF0Y2g6YXJyYXlPZicsW0FueVNoYXBlXSk7XG5jb25zdCBTZXRTaGFwZT1tYWtlVGFnZ2VkKCdtYXRjaDpzZXRPZicsW0FueVNoYXBlXSk7XG5jb25zdCBCYWdTaGFwZT1tYWtlVGFnZ2VkKCdtYXRjaDpiYWdPZicsW0FueVNoYXBlLEFueVNoYXBlXSk7XG5jb25zdCBNYXBTaGFwZT1tYWtlVGFnZ2VkKCdtYXRjaDptYXBPZicsW0FueVNoYXBlLEFueVNoYXBlXSk7XG5jb25zdCBSZW1vdGFibGVTaGFwZT1tYWtlS2luZE1hdGNoZXIoJ3JlbW90YWJsZScpO1xuY29uc3QgRXJyb3JTaGFwZT1tYWtlS2luZE1hdGNoZXIoJ2Vycm9yJyk7XG5jb25zdCBQcm9taXNlU2hhcGU9bWFrZUtpbmRNYXRjaGVyKCdwcm9taXNlJyk7XG5jb25zdCBVbmRlZmluZWRTaGFwZT1tYWtlS2luZE1hdGNoZXIoJ3VuZGVmaW5lZCcpO1xuXG4vKipcbiAqIEZvciB3aGVuIHRoZSBsYXN0IGVsZW1lbnQgb2YgdGhlIHBheWxvYWQgaXMgdGhlIG9wdGlvbmFsIGxpbWl0cyxcbiAqIHNvIHRoYXQgd2hlbiBpdCBpcyBgdW5kZWZpbmVkYCBpdCBpcyBkcm9wcGVkIGZyb20gdGhlIGVuZCBvZiB0aGVcbiAqIHBheWxvYWRzIGFycmF5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gcGF5bG9hZFxuICovXG5jb25zdCBtYWtlTGltaXRzTWF0Y2hlcj0odGFnLHBheWxvYWQpPT57XG5pZihwYXlsb2FkW3BheWxvYWQubGVuZ3RoLTFdPT09dW5kZWZpbmVkKXtcbnBheWxvYWQ9aGFyZGVuKHBheWxvYWQuc2xpY2UoMCxwYXlsb2FkLmxlbmd0aC0xKSk7XG4gfVxucmV0dXJuIG1ha2VNYXRjaGVyKHRhZyxwYXlsb2FkKTtcbiB9O1xuXG5jb25zdCBtYWtlUmVtb3RhYmxlTWF0Y2hlcj0obGFiZWw9dW5kZWZpbmVkKT0+XG5sYWJlbD09PXVuZGVmaW5lZD9cblJlbW90YWJsZVNoYXBlOlxubWFrZU1hdGNoZXIoJ21hdGNoOnJlbW90YWJsZScsaGFyZGVuKHtsYWJlbH0pKTtcblxuLyoqXG4gKiBAcGFyYW0geydzeW5jJ3wnYXN5bmMnfSBjYWxsS2luZFxuICogQHBhcmFtIHtBcmdHdWFyZFtdfSBhcmdHdWFyZHNcbiAqIEBwYXJhbSB7QXJnR3VhcmRbXX0gW29wdGlvbmFsQXJnR3VhcmRzXVxuICogQHBhcmFtIHtBcmdHdWFyZH0gW3Jlc3RBcmdHdWFyZF1cbiAqIEByZXR1cm5zIHtNZXRob2RHdWFyZE1ha2VyfVxuICovXG5jb25zdCBtYWtlTWV0aG9kR3VhcmRNYWtlcj0oXG5jYWxsS2luZCxcbmFyZ0d1YXJkcyxcbm9wdGlvbmFsQXJnR3VhcmRzPXVuZGVmaW5lZCxcbnJlc3RBcmdHdWFyZD11bmRlZmluZWQpPT5cblxuaGFyZGVuKHtcbm9wdGlvbmFsOiguLi5vcHRBcmdHdWFyZHMpPT57XG5vcHRpb25hbEFyZ0d1YXJkcz09PXVuZGVmaW5lZHx8XG5hc3NlcnQuZmFpbChYIGBDYW4gb25seSBoYXZlIG9uZSBzZXQgb2Ygb3B0aW9uYWwgZ3VhcmRzYCk7XG5yZXN0QXJnR3VhcmQ9PT11bmRlZmluZWR8fFxuYXNzZXJ0LmZhaWwoWCBgb3B0aW9uYWwgYXJnIGd1YXJkcyBtdXN0IGNvbWUgYmVmb3JlIHJlc3QgYXJnYCk7XG5yZXR1cm4gbWFrZU1ldGhvZEd1YXJkTWFrZXIoY2FsbEtpbmQsYXJnR3VhcmRzLG9wdEFyZ0d1YXJkcyk7XG4gfSxcbnJlc3Q6KHJBcmdHdWFyZCk9PntcbmFzc2VydChyZXN0QXJnR3VhcmQ9PT11bmRlZmluZWQsWCBgQ2FuIG9ubHkgaGF2ZSBvbmUgcmVzdCBhcmdgKTtcbnJldHVybiBtYWtlTWV0aG9kR3VhcmRNYWtlcihcbmNhbGxLaW5kLFxuYXJnR3VhcmRzLFxub3B0aW9uYWxBcmdHdWFyZHMsXG5yQXJnR3VhcmQpO1xuXG4gfSxcbnJldHVybnM6KHJldHVybkd1YXJkPVVuZGVmaW5lZFNoYXBlKT0+XG5oYXJkZW4oe1xua2xhc3M6J21ldGhvZEd1YXJkJyxcbmNhbGxLaW5kLFxuYXJnR3VhcmRzLFxub3B0aW9uYWxBcmdHdWFyZHMsXG5yZXN0QXJnR3VhcmQsXG5yZXR1cm5HdWFyZH0pfSk7XG5cblxuXG5jb25zdCBtYWtlQXdhaXRBcmdHdWFyZD0oYXJnR3VhcmQpPT5cbmhhcmRlbih7XG5rbGFzczonYXdhaXRBcmcnLFxuYXJnR3VhcmR9KTtcblxuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiogQHR5cGUge01hdGNoZXJOYW1lc3BhY2V9ICovXG5jb25zdCBNPWhhcmRlbih7XG5hbnk6KCk9PkFueVNoYXBlLFxuYW5kOiguLi5wYXR0cyk9Pm1ha2VNYXRjaGVyKCdtYXRjaDphbmQnLHBhdHRzKSxcbm9yOiguLi5wYXR0cyk9Pm1ha2VNYXRjaGVyKCdtYXRjaDpvcicscGF0dHMpLFxubm90OihzdWJQYXR0KT0+bWFrZU1hdGNoZXIoJ21hdGNoOm5vdCcsc3ViUGF0dCksXG5cbnNjYWxhcjooKT0+U2NhbGFyU2hhcGUsXG5rZXk6KCk9PktleVNoYXBlLFxucGF0dGVybjooKT0+UGF0dGVyblNoYXBlLFxua2luZDptYWtlS2luZE1hdGNoZXIsXG5ib29sZWFuOigpPT5Cb29sZWFuU2hhcGUsXG5udW1iZXI6KCk9Pk51bWJlclNoYXBlLFxuYmlnaW50OihsaW1pdHM9dW5kZWZpbmVkKT0+XG5saW1pdHM/bWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOmJpZ2ludCcsW2xpbWl0c10pOkJpZ0ludFNoYXBlLFxubmF0OihsaW1pdHM9dW5kZWZpbmVkKT0+XG5saW1pdHM/bWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOm5hdCcsW2xpbWl0c10pOk5hdFNoYXBlLFxuc3RyaW5nOihsaW1pdHM9dW5kZWZpbmVkKT0+XG5saW1pdHM/bWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOnN0cmluZycsW2xpbWl0c10pOlN0cmluZ1NoYXBlLFxuc3ltYm9sOihsaW1pdHM9dW5kZWZpbmVkKT0+XG5saW1pdHM/bWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOnN5bWJvbCcsW2xpbWl0c10pOlN5bWJvbFNoYXBlLFxucmVjb3JkOihsaW1pdHM9dW5kZWZpbmVkKT0+XG5saW1pdHM/TS5yZWNvcmRPZihNLmFueSgpLE0uYW55KCksbGltaXRzKTpSZWNvcmRTaGFwZSxcbmFycmF5OihsaW1pdHM9dW5kZWZpbmVkKT0+XG5saW1pdHM/TS5hcnJheU9mKE0uYW55KCksbGltaXRzKTpBcnJheVNoYXBlLFxuc2V0OihsaW1pdHM9dW5kZWZpbmVkKT0+bGltaXRzP00uc2V0T2YoTS5hbnkoKSxsaW1pdHMpOlNldFNoYXBlLFxuYmFnOihsaW1pdHM9dW5kZWZpbmVkKT0+XG5saW1pdHM/TS5iYWdPZihNLmFueSgpLE0uYW55KCksbGltaXRzKTpCYWdTaGFwZSxcbm1hcDoobGltaXRzPXVuZGVmaW5lZCk9PlxubGltaXRzP00ubWFwT2YoTS5hbnkoKSxNLmFueSgpLGxpbWl0cyk6TWFwU2hhcGUsXG5yZW1vdGFibGU6bWFrZVJlbW90YWJsZU1hdGNoZXIsXG5lcnJvcjooKT0+RXJyb3JTaGFwZSxcbnByb21pc2U6KCk9PlByb21pc2VTaGFwZSxcbnVuZGVmaW5lZDooKT0+VW5kZWZpbmVkU2hhcGUsXG5udWxsOigpPT5udWxsLFxuXG5sdDoocmlnaHRPcGVyYW5kKT0+bWFrZU1hdGNoZXIoJ21hdGNoOmx0JyxyaWdodE9wZXJhbmQpLFxubHRlOihyaWdodE9wZXJhbmQpPT5tYWtlTWF0Y2hlcignbWF0Y2g6bHRlJyxyaWdodE9wZXJhbmQpLFxuZXE6KGtleSk9PntcbmFzc2VydEtleShrZXkpO1xucmV0dXJuIGtleT09PXVuZGVmaW5lZD9NLnVuZGVmaW5lZCgpOmtleTtcbiB9LFxubmVxOihrZXkpPT5NLm5vdChNLmVxKGtleSkpLFxuZ3RlOihyaWdodE9wZXJhbmQpPT5tYWtlTWF0Y2hlcignbWF0Y2g6Z3RlJyxyaWdodE9wZXJhbmQpLFxuZ3Q6KHJpZ2h0T3BlcmFuZCk9Pm1ha2VNYXRjaGVyKCdtYXRjaDpndCcscmlnaHRPcGVyYW5kKSxcblxucmVjb3JkT2Y6KGtleVBhdHQ9TS5hbnkoKSx2YWx1ZVBhdHQ9TS5hbnkoKSxsaW1pdHM9dW5kZWZpbmVkKT0+XG5tYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6cmVjb3JkT2YnLFtrZXlQYXR0LHZhbHVlUGF0dCxsaW1pdHNdKSxcbmFycmF5T2Y6KHN1YlBhdHQ9TS5hbnkoKSxsaW1pdHM9dW5kZWZpbmVkKT0+XG5tYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6YXJyYXlPZicsW3N1YlBhdHQsbGltaXRzXSksXG5zZXRPZjooa2V5UGF0dD1NLmFueSgpLGxpbWl0cz11bmRlZmluZWQpPT5cbm1ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDpzZXRPZicsW2tleVBhdHQsbGltaXRzXSksXG5iYWdPZjooa2V5UGF0dD1NLmFueSgpLGNvdW50UGF0dD1NLmFueSgpLGxpbWl0cz11bmRlZmluZWQpPT5cbm1ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDpiYWdPZicsW2tleVBhdHQsY291bnRQYXR0LGxpbWl0c10pLFxubWFwT2Y6KGtleVBhdHQ9TS5hbnkoKSx2YWx1ZVBhdHQ9TS5hbnkoKSxsaW1pdHM9dW5kZWZpbmVkKT0+XG5tYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6bWFwT2YnLFtrZXlQYXR0LHZhbHVlUGF0dCxsaW1pdHNdKSxcbnNwbGl0OihiYXNlLHJlc3Q9dW5kZWZpbmVkKT0+XG5tYWtlTWF0Y2hlcignbWF0Y2g6c3BsaXQnLHJlc3Q9PT11bmRlZmluZWQ/W2Jhc2VdOltiYXNlLHJlc3RdKSxcbnBhcnRpYWw6KGJhc2UscmVzdD11bmRlZmluZWQpPT5cbm1ha2VNYXRjaGVyKCdtYXRjaDpwYXJ0aWFsJyxyZXN0PT09dW5kZWZpbmVkP1tiYXNlXTpbYmFzZSxyZXN0XSksXG5cbmVyZWY6KHQpPT5NLm9yKHQsTS5wcm9taXNlKCkpLFxub3B0Oih0KT0+TS5vcih0LE0udW5kZWZpbmVkKCkpLFxuXG5pbnRlcmZhY2U6KGludGVyZmFjZU5hbWUsbWV0aG9kR3VhcmRzLHtzbG9wcHk9ZmFsc2V9PXt9KT0+e1xuZm9yKGNvbnN0W18sbWV0aG9kR3VhcmRdb2YgZW50cmllcyhtZXRob2RHdWFyZHMpKXtcbm1ldGhvZEd1YXJkLmtsYXNzPT09J21ldGhvZEd1YXJkJ3x8XG5hc3NlcnQuZmFpbChYIGB1bnJlY29nbml6ZSBtZXRob2QgZ3VhcmQgJHttZXRob2RHdWFyZH1gKTtcbiB9XG5yZXR1cm4gaGFyZGVuKHtcbmtsYXNzOidJbnRlcmZhY2UnLFxuaW50ZXJmYWNlTmFtZSxcbm1ldGhvZEd1YXJkcyxcbnNsb3BweX0pO1xuXG4gfSxcbmNhbGw6KC4uLmFyZ0d1YXJkcyk9Pm1ha2VNZXRob2RHdWFyZE1ha2VyKCdzeW5jJyxhcmdHdWFyZHMpLFxuY2FsbFdoZW46KC4uLmFyZ0d1YXJkcyk9Pm1ha2VNZXRob2RHdWFyZE1ha2VyKCdhc3luYycsYXJnR3VhcmRzKSxcblxuYXdhaXQ6KGFyZ0d1YXJkKT0+bWFrZUF3YWl0QXJnR3VhcmQoYXJnR3VhcmQpfSk7XG5cblxucmV0dXJuIGhhcmRlbih7XG5jaGVja01hdGNoZXMsXG5tYXRjaGVzLFxuZml0LFxuYXNzZXJ0UGF0dGVybixcbmlzUGF0dGVybixcbmFzc2VydEtleVBhdHRlcm4sXG5pc0tleVBhdHRlcm4sXG5nZXRSYW5rQ292ZXIsXG5NfSk7XG5cbiB9O1xuXG4vKiBPbmx5IGluY2x1ZGUgdGhvc2Ugd2hvc2UgbWVhbmluZyBpcyBpbmRlcGVuZGVudCBvZiBhbiBpbXB1dGVkIHNvcnQgb3JkZXIqL1xuLyogb2YgcmVtb3RhYmxlcywgb3Igb2YgZW5jb2Rpbmcgb2YgcGFzc2FibGUgYXMgc29ydGFibGUgc3RyaW5ncy4gVGh1cywqL1xuLyogZ2V0UmFua0NvdmVyIGlzIG9taXR0ZWQuIFRvIGdldCBvbmUsIHlvdSdkIG5lZWQgdG8gaW5zdGFudGlhdGUqL1xuLyogYG1ha2VQYXR0ZXJuS2l0KClgIHlvdXJzZWxmLiBTaW5jZSB0aGVyZSBhcmUgY3VycmVudGx5IG5vIGV4dGVybmFsKi9cbi8qIHVzZXMgb2YgYGdldFJhbmtDb3ZlcmAsIGZvciBjbGFyaXR5IGR1cmluZyBkZXZlbG9wbWVudCwgYG1ha2VQYXR0ZXJuS2l0YCovXG4vKiBpcyBub3QgY3VycmVudGx5IGV4cG9ydGVkLiovXG5jb25zdCAgICAgICB7XG5jaGVja01hdGNoZXMsXG5tYXRjaGVzLFxuZml0LFxuYXNzZXJ0UGF0dGVybixcbmlzUGF0dGVybixcbmFzc2VydEtleVBhdHRlcm4sXG5pc0tleVBhdHRlcm4sXG5nZXRSYW5rQ292ZXIsXG5NfT1cbm1ha2VQYXR0ZXJuS2l0KCk7JGjigI1fb25jZS5jaGVja01hdGNoZXMoY2hlY2tNYXRjaGVzKTskaOKAjV9vbmNlLm1hdGNoZXMobWF0Y2hlcyk7JGjigI1fb25jZS5maXQoZml0KTskaOKAjV9vbmNlLmFzc2VydFBhdHRlcm4oYXNzZXJ0UGF0dGVybik7JGjigI1fb25jZS5pc1BhdHRlcm4oaXNQYXR0ZXJuKTskaOKAjV9vbmNlLmFzc2VydEtleVBhdHRlcm4oYXNzZXJ0S2V5UGF0dGVybik7JGjigI1fb25jZS5pc0tleVBhdHRlcm4oaXNLZXlQYXR0ZXJuKTskaOKAjV9vbmNlLmdldFJhbmtDb3ZlcihnZXRSYW5rQ292ZXIpOyRo4oCNX29uY2UuTShNKTtcblxuTU09TTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZhdWx0TGltaXRzIjpbImRlZmF1bHRMaW1pdHMiXSwiY2hlY2tNYXRjaGVzIjpbImNoZWNrTWF0Y2hlcyJdLCJtYXRjaGVzIjpbIm1hdGNoZXMiXSwiZml0IjpbImZpdCJdLCJhc3NlcnRQYXR0ZXJuIjpbImFzc2VydFBhdHRlcm4iXSwiaXNQYXR0ZXJuIjpbImlzUGF0dGVybiJdLCJhc3NlcnRLZXlQYXR0ZXJuIjpbImFzc2VydEtleVBhdHRlcm4iXSwiaXNLZXlQYXR0ZXJuIjpbImlzS2V5UGF0dGVybiJdLCJnZXRSYW5rQ292ZXIiOlsiZ2V0UmFua0NvdmVyIl0sIk0iOlsiTSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADiYI4kWDwAAFg8AAAuAAAAQGFnb3JpYy9zdG9yZS12MC44LjUvc3JjL3BhdHRlcm5zL3JhbmtPcmRlci5qc3siaW1wb3J0cyI6WyJAYWdvcmljL2Fzc2VydCIsIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJGdWxsUmFua0NvdmVyIiwiYXNzZXJ0UmFua1NvcnRlZCIsImNvbXBhcmF0b3JNaXJyb3JJbWFnZSIsImNvbXBhcmVBbnRpUmFuayIsImNvbXBhcmVSYW5rIiwiY292ZXJlZEVudHJpZXMiLCJnZXRJbmRleENvdmVyIiwiZ2V0UGFzc1N0eWxlQ292ZXIiLCJpbnRlcnNlY3RSYW5rQ292ZXJzIiwiaXNSYW5rU29ydGVkIiwibWFrZUNvbXBhcmF0b3JLaXQiLCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCIsInJlY29yZFBhcnRzIiwic29ydEJ5UmFuayIsInVuaW9uUmFua0NvdmVycyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnQsWCxxLGFzc2VydFJlY29yZCxnZXRUYWcsbmFtZUZvclBhc3NhYmxlU3ltYm9sLHBhc3NTdHlsZU9mOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvYXNzZXJ0XCIsIFtbXCJhc3NlcnRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydCA9ICRo4oCNX2EpXV0sW1wiZGV0YWlsc1wiLCBbJGjigI1fYSA9PiAoWCA9ICRo4oCNX2EpXV0sW1wicVwiLCBbJGjigI1fYSA9PiAocSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJhc3NlcnRSZWNvcmRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFJlY29yZCA9ICRo4oCNX2EpXV0sW1wiZ2V0VGFnXCIsIFskaOKAjV9hID0+IChnZXRUYWcgPSAkaOKAjV9hKV1dLFtcIm5hbWVGb3JQYXNzYWJsZVN5bWJvbFwiLCBbJGjigI1fYSA9PiAobmFtZUZvclBhc3NhYmxlU3ltYm9sID0gJGjigI1fYSldXSxbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLlBhc3NTdHlsZX0gUGFzc1N0eWxlICovXG5cbmNvbnN0e2Zyb21FbnRyaWVzLGVudHJpZXMsc2V0UHJvdG90eXBlT2YsaXN9PU9iamVjdDtcblxuY29uc3R7b3duS2V5c309UmVmbGVjdDtcblxuLyoqXG4gKiBUaGlzIGlzIHRoZSBlcXVhbGl0eSBjb21wYXJpc29uIHVzZWQgYnkgSmF2YVNjcmlwdCdzIE1hcCBhbmQgU2V0XG4gKiBhYnN0cmFjdGlvbnMsIHdoZXJlIE5hTiBpcyB0aGUgc2FtZSBhcyBOYU4gYW5kIC0wIGlzIHRoZSBzYW1lIGFzXG4gKiAwLiBNYXJzaGFsIHNlcmlhbGl6ZXMgLTAgYXMgemVybywgc28gdGhlIHNlbWFudGljcyBvZiBvdXIgZGlzdHJpYnV0ZWRcbiAqIG9iamVjdCBzeXN0ZW0gZG9lcyBub3QgZGlzdGluZ3Vpc2ggMCBmcm9tIC0wLlxuICpcbiAqIGBzYW1lVmFsdWVaZXJvYCBpcyB0aGUgRWNtYVNjcmlwdCBzcGVjIG5hbWUgZm9yIHRoaXMgZXF1YWxpdHkgY29tcGFyaXNvbixcbiAqIGJ1dCBUT0RPIHdlIG5lZWQgYSBiZXR0ZXIgbmFtZSBmb3IgdGhlIEFQSS5cbiAqXG4gKiBAcGFyYW0ge2FueX0geFxuICogQHBhcmFtIHthbnl9IHlcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBzYW1lVmFsdWVaZXJvPSh4LHkpPT54PT09eXx8aXMoeCx5KTtcblxuLyoqXG4gKiBAdHlwZSB7W1Bhc3NTdHlsZSwgUmFua0NvdmVyXVtdfVxuICovXG5jb25zdCBQYXNzU3R5bGVSYW5rQW5kQ292ZXI9aGFyZGVuKFtcbi8qICEgICovWydlcnJvcicsWychJywnIX4nXV0sXG4vKiAoICAqL1snY29weVJlY29yZCcsWycoJywnKH4nXV0sXG4vKiA6ICAqL1sndGFnZ2VkJyxbJzonLCc6fiddXSxcbi8qID8gICovWydwcm9taXNlJyxbJz8nLCc/fiddXSxcbi8qIFsgICovWydjb3B5QXJyYXknLFsnWycsJ1t+J11dLFxuLyogYiAgKi9bJ2Jvb2xlYW4nLFsnYicsJ2J+J11dLFxuLyogZiAgKi9bJ251bWJlcicsWydmJywnZn4nXV0sXG4vKiBucCAqL1snYmlnaW50JyxbJ24nLCdwfiddXSxcbi8qIHIgICovWydyZW1vdGFibGUnLFsncicsJ3J+J11dLFxuLyogcyAgKi9bJ3N0cmluZycsWydzJywndCddXSxcbi8qIHYgICovWydudWxsJyxbJ3YnLCd2fiddXSxcbi8qIHkgICovWydzeW1ib2wnLFsneScsJ3onXV0sXG4vKiB6ICAqL1sndW5kZWZpbmVkJyxbJ3onLCd7J11dXG4vKiB8IHJlbW90YWJsZS0+b3JkaW5hbCBtYXBwaW5nIHByZWZpeDogVGhpcyBpcyBub3QgdXNlZCBpbiBjb3ZlcnMgYnV0IGl0IGlzXG4gcmVzZXJ2ZWQgZnJvbSB0aGUgc2FtZSBzZXQgb2Ygc3RyaW5ncy4gTm90ZSB0aGF0IHRoZSBwcmVmaXggaXMgPiBhbnlcbiBwcmVmaXggdXNlZCBieSBhbnkgY292ZXIgc28gdGhhdCBvcmRpbmFsIG1hcHBpbmcga2V5cyBhcmUgYWx3YXlzIG91dHNpZGVcbiB0aGUgcmFuZ2Ugb2YgdmFsaWQgY29sbGVjdGlvbiBlbnRyeSBrZXlzLiAqL10pO1xuXG5cbmNvbnN0IFBhc3NTdHlsZVJhbms9ZnJvbUVudHJpZXMoXG5lbnRyaWVzKFBhc3NTdHlsZVJhbmtBbmRDb3ZlcikubWFwKChbaSx2XSk9Plt2WzBdLE51bWJlcihpKV0pKTtcblxuc2V0UHJvdG90eXBlT2YoUGFzc1N0eWxlUmFuayxudWxsKTtcbmhhcmRlbihQYXNzU3R5bGVSYW5rKTtcblxuLyoqIEB0eXBlIHtHZXRQYXNzU3R5bGVDb3Zlcn0gKi9cbmNvbnN0ICAgICAgICBnZXRQYXNzU3R5bGVDb3Zlcj0ocGFzc1N0eWxlKT0+XG5QYXNzU3R5bGVSYW5rQW5kQ292ZXJbUGFzc1N0eWxlUmFua1twYXNzU3R5bGVdXVsxXTskaOKAjV9vbmNlLmdldFBhc3NTdHlsZUNvdmVyKGdldFBhc3NTdHlsZUNvdmVyKTtcbmhhcmRlbihnZXRQYXNzU3R5bGVDb3Zlcik7XG5cbi8qKlxuICogQHR5cGUge1dlYWtNYXA8UmFua0NvbXBhcmUsV2Vha1NldDxQYXNzYWJsZVtdPj59XG4gKi9cbmNvbnN0IG1lbW9PZlNvcnRlZD1uZXcgV2Vha01hcCgpO1xuXG4vKipcbiAqIEB0eXBlIHtXZWFrTWFwPFJhbmtDb21wYXJlLFJhbmtDb21wYXJlPn1cbiAqL1xuY29uc3QgY29tcGFyYXRvck1pcnJvckltYWdlcz1uZXcgV2Vha01hcCgpO1xuXG5jb25zdCAgICAgICAgcmVjb3JkUGFydHM9KHJlY29yZCk9PntcbmFzc2VydFJlY29yZChyZWNvcmQpO1xuLyogVE9ETyBNZWFzdXJlIHdoaWNoIGlzIGZhc3RlcjogYSByZXZlcnNlIHNvcnQgYnkgc29ydGluZyBhbmQqL1xuLyogcmV2ZXJzaW5nLCBvciBieSBzb3J0aW5nIHdpdGggYW4gaW52ZXJzZSBjb21wYXJpc29uIGZ1bmN0aW9uLiovXG4vKiBJZiBpdCBtYWtlcyBhIHNpZ25pZmljYW50IGRpZmZlcmVuY2UsIHVzZSB0aGUgZmFzdGVyIG9uZS4qL1xuY29uc3QgbmFtZXM9b3duS2V5cyhyZWNvcmQpLnNvcnQoKS5yZXZlcnNlKCk7XG4vKiBAdHMtZXhwZWN0LWVycm9yIEl0IHRoaW5rcyBuYW1lIG1pZ2h0IGJlIGEgc3ltYm9sLCB3aGljaCBpdCBkb2Vzbid0IGxpa2UuKi9cbmNvbnN0IHZhbHM9bmFtZXMubWFwKChuYW1lKT0+cmVjb3JkW25hbWVdKTtcbnJldHVybiBoYXJkZW4oW25hbWVzLHZhbHNdKTtcbiB9OyRo4oCNX29uY2UucmVjb3JkUGFydHMocmVjb3JkUGFydHMpO1xuaGFyZGVuKHJlY29yZFBhcnRzKTtcblxuLyoqXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlPX0gY29tcGFyZVJlbW90YWJsZXNcbiAqIEFuIG9wdGlvbiB0byBjcmVhdGUgYSBjb21wYXJhdG9yIGluIHdoaWNoIGFuIGludGVybmFsIG9yZGVyIGlzXG4gKiBhc3NpZ25lZCB0byByZW1vdGFibGVzLiBUaGlzIGRlZmF1bHRzIHRvIGEgY29tcGFyYXRvciB0aGF0XG4gKiBhbHdheXMgcmV0dXJucyBgMGAsIG1lYW5pbmcgdGhhdCBhbGwgcmVtb3RhYmxlcyBhcmUgdGllZFxuICogZm9yIHRoZSBzYW1lIHJhbmsuXG4gKiBAcmV0dXJucyB7UmFua0NvbXBhcmF0b3JLaXR9XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlQ29tcGFyYXRvcktpdD0oY29tcGFyZVJlbW90YWJsZXM9KF94LF95KT0+MCk9Pntcbi8qKiBAdHlwZSB7UmFua0NvbXBhcmV9ICovXG5jb25zdCBjb21wYXJhdG9yPShsZWZ0LHJpZ2h0KT0+e1xuaWYoc2FtZVZhbHVlWmVybyhsZWZ0LHJpZ2h0KSl7XG5yZXR1cm4gMDtcbiB9XG5jb25zdCBsZWZ0U3R5bGU9cGFzc1N0eWxlT2YobGVmdCk7XG5jb25zdCByaWdodFN0eWxlPXBhc3NTdHlsZU9mKHJpZ2h0KTtcbmlmKGxlZnRTdHlsZSE9PXJpZ2h0U3R5bGUpe1xucmV0dXJuIGNvbXBhcmF0b3IoUGFzc1N0eWxlUmFua1tsZWZ0U3R5bGVdLFBhc3NTdHlsZVJhbmtbcmlnaHRTdHlsZV0pO1xuIH1cbnN3aXRjaChsZWZ0U3R5bGUpe1xuY2FzZSdyZW1vdGFibGUnOntcbnJldHVybiBjb21wYXJlUmVtb3RhYmxlcyhsZWZ0LHJpZ2h0KTtcbiB9XG5jYXNlJ3VuZGVmaW5lZCc6XG5jYXNlJ251bGwnOlxuY2FzZSdlcnJvcic6XG5jYXNlJ3Byb21pc2UnOntcbi8qIEZvciBlYWNoIG9mIHRoZXNlIHBhc3NTdHlsZXMsIGFsbCBtZW1iZXJzIG9mIHRoYXQgcGFzc1N0eWxlIGFyZSB0aWVkKi9cbi8qIGZvciB0aGUgc2FtZSByYW5rLiovXG5yZXR1cm4gMDtcbiB9XG5jYXNlJ2Jvb2xlYW4nOlxuY2FzZSdiaWdpbnQnOlxuY2FzZSdzdHJpbmcnOntcbi8qIFdpdGhpbiBlYWNoIG9mIHRoZXNlIHBhc3NTdHlsZXMsIHRoZSByYW5rIG9yZGVyaW5nIGFncmVlcyB3aXRoKi9cbi8qIEphdmFTY3JpcHQncyByZWxhdGlvbmFsIG9wZXJhdG9ycyBgPGAgYW5kIGA+YC4qL1xuaWYobGVmdDxyaWdodCl7XG5yZXR1cm4tMTtcbiB9ZWxzZXtcbmFzc2VydChsZWZ0PnJpZ2h0KTtcbnJldHVybiAxO1xuIH1cbiB9XG5jYXNlJ3N5bWJvbCc6e1xucmV0dXJuIGNvbXBhcmF0b3IoXG5uYW1lRm9yUGFzc2FibGVTeW1ib2wobGVmdCksXG5uYW1lRm9yUGFzc2FibGVTeW1ib2wocmlnaHQpKTtcblxuIH1cbmNhc2UnbnVtYmVyJzp7XG4vKiBgTmFOYCdzIHJhbmsgaXMgYWZ0ZXIgYWxsIG90aGVyIG51bWJlcnMuKi9cbmlmKE51bWJlci5pc05hTihsZWZ0KSl7XG5hc3NlcnQoIU51bWJlci5pc05hTihyaWdodCkpO1xucmV0dXJuIDE7XG4gfWVsc2UgaWYoTnVtYmVyLmlzTmFOKHJpZ2h0KSl7XG5yZXR1cm4tMTtcbiB9XG4vKiBUaGUgcmFuayBvcmRlcmluZyBvZiBub24tTmFOIG51bWJlcnMgYWdyZWVzIHdpdGggSmF2YVNjcmlwdCdzKi9cbi8qIHJlbGF0aW9uYWwgb3BlcmF0b3JzICc8JyBhbmQgJz4nLiovXG5pZihsZWZ0PHJpZ2h0KXtcbnJldHVybi0xO1xuIH1lbHNle1xuYXNzZXJ0KGxlZnQ+cmlnaHQpO1xucmV0dXJuIDE7XG4gfVxuIH1cbmNhc2UnY29weVJlY29yZCc6e1xuLyogTGV4aWNvZ3JhcGhpYyBieSBpbnZlcnNlIHNvcnRlZCBvcmRlciBvZiBwcm9wZXJ0eSBuYW1lcywgdGhlbiovXG4vKiBsZXhpY29ncmFwaGljIGJ5IGNvcnJlc3BvbmRpbmcgdmFsdWVzIGluIHRoYXQgc2FtZSBpbnZlcnNlKi9cbi8qIG9yZGVyIG9mIHRoZWlyIHByb3BlcnR5IG5hbWVzLiBDb21wYXJpbmcgbmFtZXMgYnkgdGhlbXNlbHZlcyBmaXJzdCwqL1xuLyogYWxsIHJlY29yZHMgd2l0aCB0aGUgZXhhY3Qgc2FtZSBzZXQgb2YgcHJvcGVydHkgbmFtZXMgc29ydCBuZXh0IHRvKi9cbi8qIGVhY2ggb3RoZXIgaW4gYSByYW5rLXNvcnQgb2YgY29weVJlY29yZHMuKi9cblxuLyogVGhlIGNvcHlSZWNvcmQgaW52YXJpYW50cyBlbmZvcmNlZCBieSBwYXNzU3R5bGVPZiBlbnN1cmUgdGhhdCovXG4vKiBhbGwgdGhlIHByb3BlcnR5IG5hbWVzIGFyZSBzdHJpbmdzLiBXZSBuZWVkIHRoZSByZXZlcnNlIHNvcnRlZCBvcmRlciovXG4vKiBvZiB0aGVzZSBuYW1lcywgd2hpY2ggd2UgdGhlbiBjb21wYXJlIGxleGljb2dyYXBoaWNhbGx5LiBUaGlzIGVuc3VyZXMqL1xuLyogdGhhdCBpZiB0aGUgbmFtZXMgb2YgcmVjb3JkIFggYXJlIGEgc3Vic2V0IG9mIHRoZSBuYW1lcyBvZiByZWNvcmQgWSwqL1xuLyogdGhlbiByZWNvcmQgWCB3aWxsIGhhdmUgYW4gZWFybGllciByYW5rIGFuZCBzb3J0IHRvIHRoZSBsZWZ0IG9mIFkuKi9cbmNvbnN0W2xlZnROYW1lcyxsZWZ0VmFsdWVzXT1yZWNvcmRQYXJ0cyhsZWZ0KTtcbmNvbnN0W3JpZ2h0TmFtZXMscmlnaHRWYWx1ZXNdPXJlY29yZFBhcnRzKHJpZ2h0KTtcblxuY29uc3QgcmVzdWx0PWNvbXBhcmF0b3IobGVmdE5hbWVzLHJpZ2h0TmFtZXMpO1xuaWYocmVzdWx0IT09MCl7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbnJldHVybiBjb21wYXJhdG9yKGxlZnRWYWx1ZXMscmlnaHRWYWx1ZXMpO1xuIH1cbmNhc2UnY29weUFycmF5Jzp7XG4vKiBMZXhpY29ncmFwaGljKi9cbmNvbnN0IGxlbj1NYXRoLm1pbihsZWZ0Lmxlbmd0aCxyaWdodC5sZW5ndGgpO1xuZm9yKGxldCBpPTA7aTxsZW47aSs9MSl7XG5jb25zdCByZXN1bHQ9Y29tcGFyYXRvcihsZWZ0W2ldLHJpZ2h0W2ldKTtcbmlmKHJlc3VsdCE9PTApe1xucmV0dXJuIHJlc3VsdDtcbiB9XG4gfVxuLyogSWYgYWxsIG1hdGNoaW5nIGVsZW1lbnRzIHdlcmUgdGllZCwgdGhlbiBhY2NvcmRpbmcgdG8gdGhlaXIgbGVuZ3Rocy4qL1xuLyogSWYgYXJyYXkgWCBpcyBhIHByZWZpeCBvZiBhcnJheSBZLCB0aGVuIFggaGFzIGFuIGVhcmxpZXIgcmFuayB0aGFuIFkuKi9cbnJldHVybiBjb21wYXJhdG9yKGxlZnQubGVuZ3RoLHJpZ2h0Lmxlbmd0aCk7XG4gfVxuY2FzZSd0YWdnZWQnOntcbi8qIExleGljb2dyYXBoaWMgYnkgYFtTeW1ib2wudG9TdHJpbmdUYWddYCB0aGVuIGAucGF5bG9hZGAuKi9cbmNvbnN0IGxhYmVsQ29tcD1jb21wYXJhdG9yKGdldFRhZyhsZWZ0KSxnZXRUYWcocmlnaHQpKTtcbmlmKGxhYmVsQ29tcCE9PTApe1xucmV0dXJuIGxhYmVsQ29tcDtcbiB9XG5yZXR1cm4gY29tcGFyYXRvcihsZWZ0LnBheWxvYWQscmlnaHQucGF5bG9hZCk7XG4gfVxuZGVmYXVsdDp7XG5hc3NlcnQuZmFpbChYIGBVbnJlY29nbml6ZWQgcGFzc1N0eWxlOiAke3EobGVmdFN0eWxlKX1gKTtcbiB9fVxuXG4gfTtcblxuLyoqIEB0eXBlIHtSYW5rQ29tcGFyZX0gKi9cbmNvbnN0IGFudGlDb21wYXJhdG9yPSh4LHkpPT5jb21wYXJhdG9yKHkseCk7XG5cbm1lbW9PZlNvcnRlZC5zZXQoY29tcGFyYXRvcixuZXcgV2Vha1NldCgpKTtcbm1lbW9PZlNvcnRlZC5zZXQoYW50aUNvbXBhcmF0b3IsbmV3IFdlYWtTZXQoKSk7XG5jb21wYXJhdG9yTWlycm9ySW1hZ2VzLnNldChjb21wYXJhdG9yLGFudGlDb21wYXJhdG9yKTtcbmNvbXBhcmF0b3JNaXJyb3JJbWFnZXMuc2V0KGFudGlDb21wYXJhdG9yLGNvbXBhcmF0b3IpO1xuXG5yZXR1cm4gaGFyZGVuKHtjb21wYXJhdG9yLGFudGlDb21wYXJhdG9yfSk7XG4gfTtcbi8qKlxuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyYXRvclxuICogQHJldHVybnMge1JhbmtDb21wYXJlPX1cbiAqLyRo4oCNX29uY2UubWFrZUNvbXBhcmF0b3JLaXQobWFrZUNvbXBhcmF0b3JLaXQpO1xuY29uc3QgICAgICAgIGNvbXBhcmF0b3JNaXJyb3JJbWFnZT0oY29tcGFyYXRvcik9PlxuY29tcGFyYXRvck1pcnJvckltYWdlcy5nZXQoY29tcGFyYXRvcik7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBwYXNzYWJsZXNcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovJGjigI1fb25jZS5jb21wYXJhdG9yTWlycm9ySW1hZ2UoY29tcGFyYXRvck1pcnJvckltYWdlKTtcbmNvbnN0ICAgICAgICBpc1JhbmtTb3J0ZWQ9KHBhc3NhYmxlcyxjb21wYXJlKT0+e1xuY29uc3Qgc3ViTWVtb09mU29ydGVkPW1lbW9PZlNvcnRlZC5nZXQoY29tcGFyZSk7XG5hc3NlcnQoc3ViTWVtb09mU29ydGVkIT09dW5kZWZpbmVkKTtcbmlmKHN1Yk1lbW9PZlNvcnRlZC5oYXMocGFzc2FibGVzKSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5hc3NlcnQocGFzc1N0eWxlT2YocGFzc2FibGVzKT09PSdjb3B5QXJyYXknKTtcbmZvcihsZXQgaT0xO2k8cGFzc2FibGVzLmxlbmd0aDtpKz0xKXtcbmlmKGNvbXBhcmUocGFzc2FibGVzW2ktMV0scGFzc2FibGVzW2ldKT49MSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuIH1cbnN1Yk1lbW9PZlNvcnRlZC5hZGQocGFzc2FibGVzKTtcbnJldHVybiB0cnVlO1xuIH07JGjigI1fb25jZS5pc1JhbmtTb3J0ZWQoaXNSYW5rU29ydGVkKTtcbmhhcmRlbihpc1JhbmtTb3J0ZWQpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gc29ydGVkXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRSYW5rU29ydGVkPShzb3J0ZWQsY29tcGFyZSk9PlxuYXNzZXJ0KFxuaXNSYW5rU29ydGVkKHNvcnRlZCxjb21wYXJlKSxcbi8qIFRPRE8gYXNzZXJ0IG9uIGJ1ZyBjb3VsZCBsZWFkIHRvIGluZmluaXRlIHJlY3Vyc2lvbi4gRml4LiovXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuWCBgTXVzdCBiZSByYW5rIHNvcnRlZDogJHtzb3J0ZWR9IHZzICR7c29ydEJ5UmFuayhzb3J0ZWQsY29tcGFyZSl9YCk7JGjigI1fb25jZS5hc3NlcnRSYW5rU29ydGVkKGFzc2VydFJhbmtTb3J0ZWQpO1xuXG5oYXJkZW4oYXNzZXJ0UmFua1NvcnRlZCk7XG5cbi8qKlxuICogVE9ETyBTRUNVUklUWSBCVUc6IGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNDI2MFxuICogc29ydEJ5UmFuayBjdXJyZW50bHkgdXNlcyBgQXJyYXkucHJvdG90eXBlLnNvcnRgIGRpcmVjdGx5LCBhbmRcbiAqIHNvIG9ubHkgd29ya3MgY29ycmVjdGx5IHdoZW4gZ2l2ZW4gYSBgY29tcGFyZWAgZnVuY3Rpb24gdGhhdCBjb25zaWRlcnNcbiAqIGB1bmRlZmluZWRgIHN0cmljdGx5IGJpZ2dlciAoYD5gKSB0aGFuIGV2ZXJ5dGhpbmcgZWxzZS4gVGhpcyBpc1xuICogYmVjYXVzZSBgQXJyYXkucHJvdG90eXBlLnNvcnRgIGJpemFycmVseSBtb3ZlcyBhbGwgYHVuZGVmaW5lZGBzIHRvXG4gKiB0aGUgZW5kIG9mIHRoZSBhcnJheSByZWdhcmRsZXNzLCB3aXRob3V0IGNvbnN1bHRpbmcgdGhlIGBjb21wYXJlYFxuICogZnVuY3Rpb24uIFRoaXMgaXMgYSBnZW51aW5lIGJ1ZyBmb3IgdXMgTk9XIGJlY2F1c2Ugc29tZXRpbWVzIHdlIHNvcnRcbiAqIGluIHJldmVyc2Ugb3JkZXIgYnkgcGFzc2luZyBhIHJldmVyc2VkIHJhbmsgY29tcGFyaXNvbiBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFBhc3NhYmxlPn0gcGFzc2FibGVzXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcmV0dXJucyB7UGFzc2FibGVbXX1cbiAqL1xuY29uc3QgICAgICAgIHNvcnRCeVJhbms9KHBhc3NhYmxlcyxjb21wYXJlKT0+e1xuaWYoQXJyYXkuaXNBcnJheShwYXNzYWJsZXMpKXtcbmhhcmRlbihwYXNzYWJsZXMpO1xuLyogQ2FsbGluZyBpc1JhbmtTb3J0ZWQgZ2l2ZXMgaXQgYSBjaGFuY2UgdG8gZ2V0IG1lbW9pemVkIGZvciovXG4vKiB0aGlzIGBjb21wYXJlYCBmdW5jdGlvbiBldmVuIGlmIGl0IHdhcyBhbHJlYWR5IG1lbW9pemVkIGZvciBhIGRpZmZlcmVudCovXG4vKiBgY29tcGFyZWAgZnVuY3Rpb24uKi9cbmlmKGlzUmFua1NvcnRlZChwYXNzYWJsZXMsY29tcGFyZSkpe1xucmV0dXJuIHBhc3NhYmxlcztcbiB9XG4gfVxuY29uc3QgdW5zb3J0ZWQ9Wy4uLnBhc3NhYmxlc107XG51bnNvcnRlZC5mb3JFYWNoKGhhcmRlbik7XG5jb25zdCBzb3J0ZWQ9aGFyZGVuKHVuc29ydGVkLnNvcnQoY29tcGFyZSkpO1xuY29uc3Qgc3ViTWVtb09mU29ydGVkPW1lbW9PZlNvcnRlZC5nZXQoY29tcGFyZSk7XG5hc3NlcnQoc3ViTWVtb09mU29ydGVkIT09dW5kZWZpbmVkKTtcbnN1Yk1lbW9PZlNvcnRlZC5hZGQoc29ydGVkKTtcbnJldHVybiBzb3J0ZWQ7XG4gfTskaOKAjV9vbmNlLnNvcnRCeVJhbmsoc29ydEJ5UmFuayk7XG5oYXJkZW4oc29ydEJ5UmFuayk7XG5cbi8qKlxuICogU2VlXG4gKiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CaW5hcnlfc2VhcmNoX2FsZ29yaXRobSNQcm9jZWR1cmVfZm9yX2ZpbmRpbmdfdGhlX2xlZnRtb3N0X2VsZW1lbnRcbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IHNvcnRlZFxuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHBhcmFtIHtQYXNzYWJsZX0ga2V5XG4gKiBAcGFyYW0geyhcImxlZnRNb3N0XCIgfCBcInJpZ2h0TW9zdFwiKT19IGJpYXNcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmNvbnN0IHJhbmtTZWFyY2g9KHNvcnRlZCxjb21wYXJlLGtleSxiaWFzPSdsZWZ0TW9zdCcpPT57XG5hc3NlcnRSYW5rU29ydGVkKHNvcnRlZCxjb21wYXJlKTtcbmxldCBsZWZ0PTA7XG5sZXQgcmlnaHQ9c29ydGVkLmxlbmd0aDtcbndoaWxlKGxlZnQ8cmlnaHQpe1xuY29uc3QgbT1NYXRoLmZsb29yKChsZWZ0K3JpZ2h0KS8yKTtcbmNvbnN0IGNvbXA9Y29tcGFyZShzb3J0ZWRbbV0sa2V5KTtcbmlmKGNvbXA8PS0xfHxjb21wPT09MCYmYmlhcz09PSdyaWdodE1vc3QnKXtcbmxlZnQ9bSsxO1xuIH1lbHNle1xuYXNzZXJ0KGNvbXA+PTF8fGNvbXA9PT0wJiZiaWFzPT09J2xlZnRNb3N0Jyk7XG5yaWdodD1tO1xuIH1cbiB9XG5yZXR1cm4gYmlhcz09PSdsZWZ0TW9zdCc/bGVmdDpyaWdodC0xO1xuIH07XG5cbi8qKiBAdHlwZSB7R2V0SW5kZXhDb3Zlcn0gKi9cbmNvbnN0ICAgICAgICBnZXRJbmRleENvdmVyPShzb3J0ZWQsY29tcGFyZSxbbGVmdEtleSxyaWdodEtleV0pPT57XG5hc3NlcnRSYW5rU29ydGVkKHNvcnRlZCxjb21wYXJlKTtcbmNvbnN0IGxlZnRJbmRleD1yYW5rU2VhcmNoKHNvcnRlZCxjb21wYXJlLGxlZnRLZXksJ2xlZnRNb3N0Jyk7XG5jb25zdCByaWdodEluZGV4PXJhbmtTZWFyY2goc29ydGVkLGNvbXBhcmUscmlnaHRLZXksJ3JpZ2h0TW9zdCcpO1xucmV0dXJuW2xlZnRJbmRleCxyaWdodEluZGV4XTtcbiB9OyRo4oCNX29uY2UuZ2V0SW5kZXhDb3ZlcihnZXRJbmRleENvdmVyKTtcbmhhcmRlbihnZXRJbmRleENvdmVyKTtcblxuLyoqIEB0eXBlIHtSYW5rQ292ZXJ9ICovXG5jb25zdCAgICAgICAgRnVsbFJhbmtDb3Zlcj1oYXJkZW4oWycnLCd7J10pO1xuXG4vKiogQHR5cGUge0NvdmVyZWRFbnRyaWVzfSAqLyRo4oCNX29uY2UuRnVsbFJhbmtDb3ZlcihGdWxsUmFua0NvdmVyKTtcbmNvbnN0ICAgICAgICBjb3ZlcmVkRW50cmllcz0oc29ydGVkLFtsZWZ0SW5kZXgscmlnaHRJbmRleF0pPT57XG4vKiogQHR5cGUge0l0ZXJhYmxlPFtudW1iZXIsIFBhc3NhYmxlXT59ICovXG5jb25zdCBpdGVyYWJsZT1oYXJkZW4oe1xuW1N5bWJvbC5pdGVyYXRvcl06KCk9PntcbmxldCBpPWxlZnRJbmRleDtcbnJldHVybiBoYXJkZW4oe1xubmV4dDooKT0+e1xuaWYoaTw9cmlnaHRJbmRleCl7XG5jb25zdCBlbGVtZW50PXNvcnRlZFtpXTtcbmkrPTE7XG5yZXR1cm4gaGFyZGVuKHt2YWx1ZTpbaSxlbGVtZW50XSxkb25lOmZhbHNlfSk7XG4gfWVsc2V7XG5yZXR1cm4gaGFyZGVuKHt2YWx1ZTp1bmRlZmluZWQsZG9uZTp0cnVlfSk7XG4gfVxuIH19KTtcblxuIH19KTtcblxucmV0dXJuIGl0ZXJhYmxlO1xuIH07JGjigI1fb25jZS5jb3ZlcmVkRW50cmllcyhjb3ZlcmVkRW50cmllcyk7XG5oYXJkZW4oY292ZXJlZEVudHJpZXMpO1xuXG4vKipcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGFcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGJcbiAqIEByZXR1cm5zIHtQYXNzYWJsZX1cbiAqL1xuY29uc3QgbWF4UmFuaz0oY29tcGFyZSxhLGIpPT5jb21wYXJlKGEsYik+PTA/YTpiO1xuXG4vKipcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGFcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGJcbiAqIEByZXR1cm5zIHtQYXNzYWJsZX1cbiAqL1xuY29uc3QgbWluUmFuaz0oY29tcGFyZSxhLGIpPT5jb21wYXJlKGEsYik8PTA/YTpiO1xuXG4vKipcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEBwYXJhbSB7UmFua0NvdmVyW119IGNvdmVyc1xuICogQHJldHVybnMge1JhbmtDb3Zlcn1cbiAqL1xuY29uc3QgICAgICAgIHVuaW9uUmFua0NvdmVycz0oY29tcGFyZSxjb3ZlcnMpPT57XG4vKipcbiAqIEBwYXJhbSB7UmFua0NvdmVyfSBhXG4gKiBAcGFyYW0ge1JhbmtDb3Zlcn0gYlxuICogQHJldHVybnMge1JhbmtDb3Zlcn1cbiAqL1xuY29uc3QgdW5pb25SYW5rQ292ZXJQYWlyPShbbGVmdEEscmlnaHRBXSxbbGVmdEIscmlnaHRCXSk9Pltcbm1pblJhbmsoY29tcGFyZSxsZWZ0QSxsZWZ0QiksXG5tYXhSYW5rKGNvbXBhcmUscmlnaHRBLHJpZ2h0QildO1xuXG5yZXR1cm4gY292ZXJzLnJlZHVjZSh1bmlvblJhbmtDb3ZlclBhaXIsWyd7JywnJ10pO1xuIH07JGjigI1fb25jZS51bmlvblJhbmtDb3ZlcnModW5pb25SYW5rQ292ZXJzKTtcbmhhcmRlbih1bmlvblJhbmtDb3ZlcnMpO1xuXG4vKipcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEBwYXJhbSB7UmFua0NvdmVyW119IGNvdmVyc1xuICogQHJldHVybnMge1JhbmtDb3Zlcn1cbiAqL1xuY29uc3QgICAgICAgIGludGVyc2VjdFJhbmtDb3ZlcnM9KGNvbXBhcmUsY292ZXJzKT0+e1xuLyoqXG4gKiBAcGFyYW0ge1JhbmtDb3Zlcn0gYVxuICogQHBhcmFtIHtSYW5rQ292ZXJ9IGJcbiAqIEByZXR1cm5zIHtSYW5rQ292ZXJ9XG4gKi9cbmNvbnN0IGludGVyc2VjdFJhbmtDb3ZlclBhaXI9KFtsZWZ0QSxyaWdodEFdLFtsZWZ0QixyaWdodEJdKT0+W1xubWF4UmFuayhjb21wYXJlLGxlZnRBLGxlZnRCKSxcbm1pblJhbmsoY29tcGFyZSxyaWdodEEscmlnaHRCKV07XG5cbnJldHVybiBjb3ZlcnMucmVkdWNlKGludGVyc2VjdFJhbmtDb3ZlclBhaXIsWycnLCd7J10pO1xuIH07JGjigI1fb25jZS5pbnRlcnNlY3RSYW5rQ292ZXJzKGludGVyc2VjdFJhbmtDb3ZlcnMpO1xuXG5jb25zdCAgICAgICB7Y29tcGFyYXRvcjpjb21wYXJlUmFuayxhbnRpQ29tcGFyYXRvcjpjb21wYXJlQW50aVJhbmt9PVxubWFrZUNvbXBhcmF0b3JLaXQoKTtcblxuLyoqXG4gKiBDcmVhdGUgYSBjb21wYXJhdG9yIGtpdCBpbiB3aGljaCByZW1vdGFibGVzIGFyZSBmdWxseSBvcmRlcmVkXG4gKiBieSB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBhcmUgZmlyc3Qgc2VlbiBieSAqdGhpcyogY29tcGFyYXRvciBraXQuXG4gKiBCRVdBUkU6IFRoaXMgaXMgb2JzZXJ2YWJsZSBtdXRhYmxlIHN0YXRlLCBzbyBzdWNoIGEgY29tcGFyYXRvciBraXRcbiAqIHNob3VsZCBuZXZlciBiZSBzaGFyZWQgYW1vbmcgc3Vic3lzdGVtcyB0aGF0IHNob3VsZCBub3QgYmUgYWJsZVxuICogdG8gY29tbXVuaWNhdGUuXG4gKlxuICogTm90ZSB0aGF0IHRoaXMgb3JkZXIgZG9lcyBub3QgbWVldCB0aGUgcmVxdWlyZW1lbnRzIGZvciBzdG9yZVxuICogb3JkZXJpbmcsIHNpbmNlIGl0IGhhcyBubyBtZW1vcnkgb2YgZGVsZXRlZCBrZXlzLlxuICpcbiAqIFRoZXNlIGZ1bGwgb3JkZXIgY29tcGFyYXRvciBraXQgaXMgc3RyaWN0bHkgbW9yZSBwcmVjaXNlIHRoYXQgdGhlXG4gKiByYW5rIG9yZGVyIGNvbXBhcmF0b3Iga2l0cyBhYm92ZS4gQXMgYSByZXN1bHQsIGFueSBhcnJheSB3aGljaCBpc1xuICogc29ydGVkIGJ5IHN1Y2ggYSBmdWxsIG9yZGVyIHdpbGwgcGFzcyB0aGUgaXNSYW5rU29ydGVkIHRlc3Qgd2l0aFxuICogYSBjb3JyZXNwb25kaW5nIHJhbmsgb3JkZXIuXG4gKlxuICogQW4gYXJyYXkgd2hpY2ggaXMgc29ydGVkIGJ5IGEgKmZyZXNoKiBmdWxsIG9yZGVyIGNvbXBhcmF0b3IsIGkuZS4sXG4gKiBvbmUgdGhhdCBoYXMgbm90IHlldCBzZWVuIGFueSByZW1vdGFibGVzLCB3aWxsIG9mIGNvdXJzZSByZW1haW5cbiAqIHNvcnRlZCBieSBhY2NvcmRpbmcgdG8gKnRoYXQqIGZ1bGwgb3JkZXIgY29tcGFyYXRvci4gQW4gYXJyYXkgKm9mXG4gKiBzY2FsYXJzKiBzb3J0ZWQgYnkgYSBmcmVzaCBmdWxsIG9yZGVyIHdpbGwgcmVtYWluIHNvcnRlZCBldmVuXG4gKiBhY2NvcmRpbmcgdG8gYSBuZXcgZnJlc2ggZnVsbCBvcmRlciBjb21wYXJhdG9yLCBzaW5jZSBpdCB3aWxsIHNlZVxuICogdGhlIHJlbW90YWJsZXMgaW4gdGhlIHNhbWUgb3JkZXIgYWdhaW4uIFVuZm9ydHVuYXRlbHksIHRoaXMgaXNcbiAqIG5vdCB0cnVlIG9mIGFycmF5cyBvZiBwYXNzYWJsZXMgaW4gZ2VuZXJhbC5cbiAqXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBsb25nTGl2ZWRcbiAqIEByZXR1cm5zIHtGdWxsQ29tcGFyYXRvcktpdH1cbiAqLyRo4oCNX29uY2UuY29tcGFyZVJhbmsoY29tcGFyZVJhbmspOyRo4oCNX29uY2UuY29tcGFyZUFudGlSYW5rKGNvbXBhcmVBbnRpUmFuayk7XG5jb25zdCAgICAgICAgbWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQ9KGxvbmdMaXZlZD1mYWxzZSk9PntcbmxldCBudW1TZWVuPTA7XG4vKiBXaGVuIGR5bmFtaWNhbGx5IGNyZWF0ZWQgd2l0aCBzaG9ydCBsaWZldGltZXMgKHRoZSBkZWZhdWx0KSBhIFdlYWtNYXAqL1xuLyogd291bGQgcGVyZm9ybSBwb29ybHksIGFuZCB0aGUgbGVhayBjcmVhdGVkIGJ5IGEgTWFwIG9ubHkgbGFzdHMgYXMgbG9uZyovXG4vKiBhcyB0aGUgTWFwLiovXG5jb25zdCBNYXBDb25zdHJ1Y3Rvcj1sb25nTGl2ZWQ/V2Vha01hcDpNYXA7XG5jb25zdCBzZWVuPW5ldyBNYXBDb25zdHJ1Y3RvcigpO1xuY29uc3QgdGFnPShyKT0+e1xuaWYoc2Vlbi5oYXMocikpe1xucmV0dXJuIHNlZW4uZ2V0KHIpO1xuIH1cbm51bVNlZW4rPTE7XG5zZWVuLnNldChyLG51bVNlZW4pO1xucmV0dXJuIG51bVNlZW47XG4gfTtcbmNvbnN0IGNvbXBhcmVSZW1vdGFibGVzPSh4LHkpPT5jb21wYXJlUmFuayh0YWcoeCksdGFnKHkpKTtcbnJldHVybiBtYWtlQ29tcGFyYXRvcktpdChjb21wYXJlUmVtb3RhYmxlcyk7XG4gfTskaOKAjV9vbmNlLm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KTtcbmhhcmRlbihtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZ2V0UGFzc1N0eWxlQ292ZXIiOlsiZ2V0UGFzc1N0eWxlQ292ZXIiXSwicmVjb3JkUGFydHMiOlsicmVjb3JkUGFydHMiXSwibWFrZUNvbXBhcmF0b3JLaXQiOlsibWFrZUNvbXBhcmF0b3JLaXQiXSwiY29tcGFyYXRvck1pcnJvckltYWdlIjpbImNvbXBhcmF0b3JNaXJyb3JJbWFnZSJdLCJpc1JhbmtTb3J0ZWQiOlsiaXNSYW5rU29ydGVkIl0sImFzc2VydFJhbmtTb3J0ZWQiOlsiYXNzZXJ0UmFua1NvcnRlZCJdLCJzb3J0QnlSYW5rIjpbInNvcnRCeVJhbmsiXSwiZ2V0SW5kZXhDb3ZlciI6WyJnZXRJbmRleENvdmVyIl0sIkZ1bGxSYW5rQ292ZXIiOlsiRnVsbFJhbmtDb3ZlciJdLCJjb3ZlcmVkRW50cmllcyI6WyJjb3ZlcmVkRW50cmllcyJdLCJ1bmlvblJhbmtDb3ZlcnMiOlsidW5pb25SYW5rQ292ZXJzIl0sImludGVyc2VjdFJhbmtDb3ZlcnMiOlsiaW50ZXJzZWN0UmFua0NvdmVycyJdLCJjb21wYXJlUmFuayI6WyJjb21wYXJlUmFuayJdLCJjb21wYXJlQW50aVJhbmsiOlsiY29tcGFyZUFudGlSYW5rIl0sIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0IjpbIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALQvHRL5FQAA+RUAADEAAABAYWdvcmljL3N0b3JlLXYwLjguNS9zcmMvc3RvcmVzL3NjYWxhck1hcFN0b3JlLmpzeyJpbXBvcnRzIjpbIi4uL2tleXMvY2hlY2tLZXkuanMiLCIuLi9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanMiLCIuLi9wYXR0ZXJucy9yYW5rT3JkZXIuanMiLCIuL3NjYWxhcldlYWtNYXBTdG9yZS5qcyIsIi4vc3RvcmUtdXRpbHMuanMiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsibWFrZU1hcFN0b3JlTWV0aG9kcyIsIm1ha2VTY2FsYXJNYXBTdG9yZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBGYXIsYXNzZXJ0UGFzc2FibGUsZmlsdGVySXRlcmFibGUsbWFwSXRlcmFibGUsY29tcGFyZVJhbmssYXNzZXJ0U2NhbGFyS2V5LG1ha2VDb3B5TWFwLG1hdGNoZXMsZml0LGFzc2VydFBhdHRlcm4sbWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMsbWFrZUN1cnJlbnRLZXlzS2l0OyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXSxbXCJhc3NlcnRQYXNzYWJsZVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGFzc2FibGUgPSAkaOKAjV9hKV1dLFtcImZpbHRlckl0ZXJhYmxlXCIsIFskaOKAjV9hID0+IChmaWx0ZXJJdGVyYWJsZSA9ICRo4oCNX2EpXV0sW1wibWFwSXRlcmFibGVcIiwgWyRo4oCNX2EgPT4gKG1hcEl0ZXJhYmxlID0gJGjigI1fYSldXV1dLFtcIi4uL3BhdHRlcm5zL3JhbmtPcmRlci5qc1wiLCBbW1wiY29tcGFyZVJhbmtcIiwgWyRo4oCNX2EgPT4gKGNvbXBhcmVSYW5rID0gJGjigI1fYSldXV1dLFtcIi4uL2tleXMvY2hlY2tLZXkuanNcIiwgW1tcImFzc2VydFNjYWxhcktleVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0U2NhbGFyS2V5ID0gJGjigI1fYSldXSxbXCJtYWtlQ29weU1hcFwiLCBbJGjigI1fYSA9PiAobWFrZUNvcHlNYXAgPSAkaOKAjV9hKV1dXV0sW1wiLi4vcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzXCIsIFtbXCJtYXRjaGVzXCIsIFskaOKAjV9hID0+IChtYXRjaGVzID0gJGjigI1fYSldXSxbXCJmaXRcIiwgWyRo4oCNX2EgPT4gKGZpdCA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0UGF0dGVyblwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGF0dGVybiA9ICRo4oCNX2EpXV1dXSxbXCIuL3NjYWxhcldlYWtNYXBTdG9yZS5qc1wiLCBbW1wibWFrZVdlYWtNYXBTdG9yZU1ldGhvZHNcIiwgWyRo4oCNX2EgPT4gKG1ha2VXZWFrTWFwU3RvcmVNZXRob2RzID0gJGjigI1fYSldXV1dLFtcIi4vc3RvcmUtdXRpbHMuanNcIiwgW1tcIm1ha2VDdXJyZW50S2V5c0tpdFwiLCBbJGjigI1fYSA9PiAobWFrZUN1cnJlbnRLZXlzS2l0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0e3F1b3RlOnF9PWFzc2VydDtcblxuLyoqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAcGFyYW0ge01hcDxLLFY+fSBqc21hcFxuICogQHBhcmFtIHsoazogSywgdjogVikgPT4gdm9pZH0gYXNzZXJ0S1ZPa1RvQWRkXG4gKiBAcGFyYW0geyhrOiBLLCB2OiBWKSA9PiB2b2lkfSBhc3NlcnRLVk9rVG9TZXRcbiAqIEBwYXJhbSB7KChrOiBLKSA9PiB2b2lkKT19IGFzc2VydEtleU9rVG9EZWxldGVcbiAqIEBwYXJhbSB7c3RyaW5nPX0gdGFnXG4gKiBAcmV0dXJucyB7TWFwU3RvcmU8SyxWPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VNYXBTdG9yZU1ldGhvZHM9KFxuanNtYXAsXG5hc3NlcnRLVk9rVG9BZGQsXG5hc3NlcnRLVk9rVG9TZXQsXG5hc3NlcnRLZXlPa1RvRGVsZXRlPXVuZGVmaW5lZCxcbnRhZz0na2V5Jyk9Plxue1xuY29uc3R7YXNzZXJ0VXBkYXRlT25BZGQsYXNzZXJ0VXBkYXRlT25EZWxldGUsaXRlcmFibGVLZXlzfT1cbm1ha2VDdXJyZW50S2V5c0tpdChcbigpPT5qc21hcC5rZXlzKCksXG4oayk9PmpzbWFwLmhhcyhrKSxcbmNvbXBhcmVSYW5rLFxuYXNzZXJ0S1ZPa1RvQWRkLFxuYXNzZXJ0S2V5T2tUb0RlbGV0ZSxcbnRhZyk7XG5cblxuLyoqXG4gKiBAcGFyYW0ge1BhdHRlcm49fSBrZXlQYXR0XG4gKiBAcGFyYW0ge1BhdHRlcm49fSB2YWx1ZVBhdHRcbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxLPn1cbiAqL1xuY29uc3Qga2V5cz0oa2V5UGF0dD11bmRlZmluZWQsdmFsdWVQYXR0PXVuZGVmaW5lZCk9PntcbmlmKGtleVBhdHQ9PT11bmRlZmluZWQmJnZhbHVlUGF0dD09PXVuZGVmaW5lZCl7XG5yZXR1cm4gaXRlcmFibGVLZXlzO1xuIH1cbmNvbnN0IGZpbHRlcj0oayk9PntcbmlmKGtleVBhdHQhPT11bmRlZmluZWQmJiFtYXRjaGVzKGssa2V5UGF0dCkpe1xucmV0dXJuIGZhbHNlO1xuIH1cbi8qIFVzZXMgdGhlIGN1cnJlbnQganNtYXAgdmFsdWUsIHNpbmNlIHRoZSBpdGVyYXRhdG9yIHN1cnZpdmVzIGAuc2V0YCovXG5pZih2YWx1ZVBhdHQhPT11bmRlZmluZWQmJiFtYXRjaGVzKGpzbWFwLmdldChrKSx2YWx1ZVBhdHQpKXtcbnJldHVybiBmYWxzZTtcbiB9XG5yZXR1cm4gdHJ1ZTtcbiB9O1xucmV0dXJuIGZpbHRlckl0ZXJhYmxlKGl0ZXJhYmxlS2V5cyxmaWx0ZXIpO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtQYXR0ZXJuPX0ga2V5UGF0dFxuICogQHBhcmFtIHtQYXR0ZXJuPX0gdmFsdWVQYXR0XG4gKiBAcmV0dXJucyB7SXRlcmFibGU8Vj59XG4gKi9cbmNvbnN0IHZhbHVlcz0oa2V5UGF0dD11bmRlZmluZWQsdmFsdWVQYXR0PXVuZGVmaW5lZCk9PlxubWFwSXRlcmFibGUoa2V5cyhrZXlQYXR0LHZhbHVlUGF0dCksKGspPT4vKiogQHR5cGUge1Z9ICovanNtYXAuZ2V0KGspKTtcblxuLyoqXG4gKiBAcGFyYW0ge1BhdHRlcm49fSBrZXlQYXR0XG4gKiBAcGFyYW0ge1BhdHRlcm49fSB2YWx1ZVBhdHRcbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxbSyxWXT59XG4gKi9cbmNvbnN0IGVudHJpZXM9KGtleVBhdHQ9dW5kZWZpbmVkLHZhbHVlUGF0dD11bmRlZmluZWQpPT5cbm1hcEl0ZXJhYmxlKGtleXMoa2V5UGF0dCx2YWx1ZVBhdHQpLChrKT0+W1xuayxcbi8qKiBAdHlwZSB7Vn0gKi9qc21hcC5nZXQoayldKTtcblxuXG5yZXR1cm4gaGFyZGVuKHtcbi4uLm1ha2VXZWFrTWFwU3RvcmVNZXRob2RzKFxuanNtYXAsXG4vKiogQHR5cGUgeyhrOiBLLCB2OiBWKSA9PiB2b2lkfSAqL2Fzc2VydFVwZGF0ZU9uQWRkLFxuYXNzZXJ0S1ZPa1RvU2V0LFxuYXNzZXJ0VXBkYXRlT25EZWxldGUsXG50YWcpLFxuXG5rZXlzLFxudmFsdWVzLFxuZW50cmllcyxcblxuc25hcHNob3Q6KGtleVBhdHQ9dW5kZWZpbmVkLHZhbHVlUGF0dD11bmRlZmluZWQpPT5cbm1ha2VDb3B5TWFwKGVudHJpZXMoa2V5UGF0dCx2YWx1ZVBhdHQpKSxcblxuZ2V0U2l6ZTooa2V5UGF0dD11bmRlZmluZWQsdmFsdWVQYXR0PXVuZGVmaW5lZCk9Plxua2V5UGF0dD09PXVuZGVmaW5lZCYmdmFsdWVQYXR0PT09dW5kZWZpbmVkP1xuanNtYXAuc2l6ZTpcblsuLi5rZXlzKGtleVBhdHQsdmFsdWVQYXR0KV0ubGVuZ3RoLFxuXG5jbGVhcjooa2V5UGF0dD11bmRlZmluZWQsdmFsdWVQYXR0PXVuZGVmaW5lZCk9PntcbmlmKGtleVBhdHQ9PT11bmRlZmluZWQmJnZhbHVlUGF0dD09PXVuZGVmaW5lZCl7XG5qc21hcC5jbGVhcigpO1xuIH1cbmZvcihjb25zdCBrZXkgb2Yga2V5cyhrZXlQYXR0LHZhbHVlUGF0dCkpe1xuanNtYXAuZGVsZXRlKGtleSk7XG4gfVxuIH19KTtcblxuIH07XG5cbi8qKlxuICogRGlzdGluZ3Vpc2hlcyBiZXR3ZWVuIGFkZGluZyBhIG5ldyBrZXkgKGluaXQpIGFuZCB1cGRhdGluZyBvclxuICogcmVmZXJlbmNpbmcgYSBrZXkgKGdldCwgc2V0LCBkZWxldGUpLlxuICpcbiAqIGBpbml0YCBpcyBvbmx5IGFsbG93ZWQgaWYgdGhlIGtleSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LiBgR2V0YCxcbiAqIGBzZXRgIGFuZCBgZGVsZXRlYCBhcmUgb25seSBhbGxvd2VkIGlmIHRoZSBrZXkgZG9lcyBhbHJlYWR5IGV4aXN0LlxuICpcbiAqIFRoaXMgaXMgYSAqc2NhbGFyKiBtYXAgaW4gdGhhdCB0aGUga2V5cyBjYW4gb25seSBiZSBhdG9taWMgdmFsdWVzLCBwcmltaXRpdmVzXG4gKiBvciByZW1vdGFibGVzLiBPdGhlciBzdG9yZU1hcHMgd2lsbCBhY2NlcHQsIGZvciBleGFtcGxlLCBjb3B5QXJyYXlzIGFuZFxuICogY29weVJlY29yZHMsIGFzIGtleXMgYW5kIGxvb2sgdGhlbSB1cCBiYXNlZCBvbiBlcXVhbGl0eSBvZiB0aGVpciBjb250ZW50cy5cbiAqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAcGFyYW0ge3N0cmluZ30gW3RhZz0na2V5J10gLSB0aGUgY29sdW1uIG5hbWUgZm9yIHRoZSBrZXlcbiAqIEBwYXJhbSB7U3RvcmVPcHRpb25zPX0gb3B0aW9uc1xuICogQHJldHVybnMge01hcFN0b3JlPEssVj59XG4gKi8kaOKAjV9vbmNlLm1ha2VNYXBTdG9yZU1ldGhvZHMobWFrZU1hcFN0b3JlTWV0aG9kcyk7XG5jb25zdCAgICAgICAgbWFrZVNjYWxhck1hcFN0b3JlPShcbnRhZz0na2V5JyxcbntrZXlTaGFwZT11bmRlZmluZWQsdmFsdWVTaGFwZT11bmRlZmluZWR9PXt9KT0+XG57XG5jb25zdCBqc21hcD1uZXcgTWFwKCk7XG5pZihrZXlTaGFwZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnRQYXR0ZXJuKGtleVNoYXBlKTtcbiB9XG5pZih2YWx1ZVNoYXBlIT09dW5kZWZpbmVkKXtcbmFzc2VydFBhdHRlcm4odmFsdWVTaGFwZSk7XG4gfVxuXG5jb25zdCBhc3NlcnRLVk9rVG9TZXQ9KF9rZXksdmFsdWUpPT57XG4vKiBUT0RPOiBKdXN0IGEgdHJhbnNpdGlvbiBrbHVkZ2UuIFJlbW92ZSB3aGVuIHBvc3NpYmxlLiovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNjA2Ki9cbmhhcmRlbih2YWx1ZSk7XG5cbmFzc2VydFBhc3NhYmxlKHZhbHVlKTtcbmlmKHZhbHVlU2hhcGUhPT11bmRlZmluZWQpe1xuZml0KHZhbHVlLHZhbHVlU2hhcGUsJ21hcFN0b3JlIHZhbHVlJyk7XG4gfVxuIH07XG5cbmNvbnN0IGFzc2VydEtWT2tUb0FkZD0oa2V5LHZhbHVlKT0+e1xuLyogVE9ETzogSnVzdCBhIHRyYW5zaXRpb24ga2x1ZGdlLiBSZW1vdmUgd2hlbiBwb3NzaWJsZS4qL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzYwNiovXG5oYXJkZW4oa2V5KTtcblxuYXNzZXJ0U2NhbGFyS2V5KGtleSk7XG5pZihrZXlTaGFwZSE9PXVuZGVmaW5lZCl7XG5maXQoa2V5LGtleVNoYXBlLCdtYXBTdG9yZSBrZXknKTtcbiB9XG5hc3NlcnRLVk9rVG9TZXQoa2V5LHZhbHVlKTtcbiB9O1xuXG5yZXR1cm4gRmFyKCBgc2NhbGFyIE1hcFN0b3JlIG9mICR7cSh0YWcpfWAse1xuLi4ubWFrZU1hcFN0b3JlTWV0aG9kcyhcbmpzbWFwLFxuYXNzZXJ0S1ZPa1RvQWRkLFxuYXNzZXJ0S1ZPa1RvU2V0LFxudW5kZWZpbmVkLFxudGFnKX0pO1xuXG5cbiB9OyRo4oCNX29uY2UubWFrZVNjYWxhck1hcFN0b3JlKG1ha2VTY2FsYXJNYXBTdG9yZSk7XG5oYXJkZW4obWFrZVNjYWxhck1hcFN0b3JlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlTWFwU3RvcmVNZXRob2RzIjpbIm1ha2VNYXBTdG9yZU1ldGhvZHMiXSwibWFrZVNjYWxhck1hcFN0b3JlIjpbIm1ha2VTY2FsYXJNYXBTdG9yZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABbwcSYbw8AAG8PAAAxAAAAQGFnb3JpYy9zdG9yZS12MC44LjUvc3JjL3N0b3Jlcy9zY2FsYXJTZXRTdG9yZS5qc3siaW1wb3J0cyI6WyIuLi9rZXlzL2NoZWNrS2V5LmpzIiwiLi4vcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzIiwiLi4vcGF0dGVybnMvcmFua09yZGVyLmpzIiwiLi9zY2FsYXJXZWFrU2V0U3RvcmUuanMiLCIuL3N0b3JlLXV0aWxzLmpzIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbIm1ha2VTY2FsYXJTZXRTdG9yZSIsIm1ha2VTZXRTdG9yZU1ldGhvZHMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRmFyLGZpbHRlckl0ZXJhYmxlLGNvbXBhcmVSYW5rLGFzc2VydFNjYWxhcktleSxtYWtlQ29weVNldCxtYXRjaGVzLGZpdCxhc3NlcnRQYXR0ZXJuLG1ha2VXZWFrU2V0U3RvcmVNZXRob2RzLG1ha2VDdXJyZW50S2V5c0tpdDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV0sW1wiZmlsdGVySXRlcmFibGVcIiwgWyRo4oCNX2EgPT4gKGZpbHRlckl0ZXJhYmxlID0gJGjigI1fYSldXV1dLFtcIi4uL3BhdHRlcm5zL3JhbmtPcmRlci5qc1wiLCBbW1wiY29tcGFyZVJhbmtcIiwgWyRo4oCNX2EgPT4gKGNvbXBhcmVSYW5rID0gJGjigI1fYSldXV1dLFtcIi4uL2tleXMvY2hlY2tLZXkuanNcIiwgW1tcImFzc2VydFNjYWxhcktleVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0U2NhbGFyS2V5ID0gJGjigI1fYSldXSxbXCJtYWtlQ29weVNldFwiLCBbJGjigI1fYSA9PiAobWFrZUNvcHlTZXQgPSAkaOKAjV9hKV1dXV0sW1wiLi4vcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzXCIsIFtbXCJtYXRjaGVzXCIsIFskaOKAjV9hID0+IChtYXRjaGVzID0gJGjigI1fYSldXSxbXCJmaXRcIiwgWyRo4oCNX2EgPT4gKGZpdCA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0UGF0dGVyblwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGF0dGVybiA9ICRo4oCNX2EpXV1dXSxbXCIuL3NjYWxhcldlYWtTZXRTdG9yZS5qc1wiLCBbW1wibWFrZVdlYWtTZXRTdG9yZU1ldGhvZHNcIiwgWyRo4oCNX2EgPT4gKG1ha2VXZWFrU2V0U3RvcmVNZXRob2RzID0gJGjigI1fYSldXV1dLFtcIi4vc3RvcmUtdXRpbHMuanNcIiwgW1tcIm1ha2VDdXJyZW50S2V5c0tpdFwiLCBbJGjigI1fYSA9PiAobWFrZUN1cnJlbnRLZXlzS2l0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuY29uc3R7cXVvdGU6cX09YXNzZXJ0O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAcGFyYW0ge1NldDxLPn0ganNzZXRcbiAqIEBwYXJhbSB7KGs6IEspID0+IHZvaWR9IGFzc2VydEtleU9rVG9BZGRcbiAqIEBwYXJhbSB7KChrOiBLKSA9PiB2b2lkKT19IGFzc2VydEtleU9rVG9EZWxldGVcbiAqIEBwYXJhbSB7c3RyaW5nPX0ga2V5TmFtZVxuICogQHJldHVybnMge1NldFN0b3JlPEs+fVxuICovXG5jb25zdCAgICAgICAgbWFrZVNldFN0b3JlTWV0aG9kcz0oXG5qc3NldCxcbmFzc2VydEtleU9rVG9BZGQsXG5hc3NlcnRLZXlPa1RvRGVsZXRlPXVuZGVmaW5lZCxcbmtleU5hbWU9J2tleScpPT5cbntcbmNvbnN0e2Fzc2VydFVwZGF0ZU9uQWRkLGFzc2VydFVwZGF0ZU9uRGVsZXRlLGl0ZXJhYmxlS2V5c309XG5tYWtlQ3VycmVudEtleXNLaXQoXG4oKT0+anNzZXQua2V5cygpLFxuKGspPT5qc3NldC5oYXMoayksXG5jb21wYXJlUmFuayxcbmFzc2VydEtleU9rVG9BZGQsXG5hc3NlcnRLZXlPa1RvRGVsZXRlLFxua2V5TmFtZSk7XG5cblxuLyoqXG4gKiBAcGFyYW0ge1BhdHRlcm49fSBrZXlQYXR0XG4gKiBAcmV0dXJucyB7SXRlcmFibGU8Sz59XG4gKi9cbmNvbnN0IGtleXM9KGtleVBhdHQ9dW5kZWZpbmVkKT0+XG5rZXlQYXR0PT09dW5kZWZpbmVkP1xuaXRlcmFibGVLZXlzOlxuZmlsdGVySXRlcmFibGUoaXRlcmFibGVLZXlzLChrKT0+bWF0Y2hlcyhrLGtleVBhdHQpKTtcblxucmV0dXJuIGhhcmRlbih7XG4uLi5tYWtlV2Vha1NldFN0b3JlTWV0aG9kcyhcbmpzc2V0LFxuYXNzZXJ0VXBkYXRlT25BZGQsXG5hc3NlcnRVcGRhdGVPbkRlbGV0ZSxcbmtleU5hbWUpLFxuXG5cbmtleXMsXG5cbnZhbHVlczprZXlzLFxuXG5zbmFwc2hvdDooa2V5UGF0dD11bmRlZmluZWQpPT5tYWtlQ29weVNldChrZXlzKGtleVBhdHQpKSxcblxuZ2V0U2l6ZTooa2V5UGF0dD11bmRlZmluZWQpPT5cbmtleVBhdHQ9PT11bmRlZmluZWQ/anNzZXQuc2l6ZTpbLi4ua2V5cyhrZXlQYXR0KV0ubGVuZ3RoLFxuXG5jbGVhcjooa2V5UGF0dD11bmRlZmluZWQpPT57XG5pZihrZXlQYXR0PT09dW5kZWZpbmVkKXtcbmpzc2V0LmNsZWFyKCk7XG4gfVxuZm9yKGNvbnN0IGtleSBvZiBrZXlzKGtleVBhdHQpKXtcbmpzc2V0LmRlbGV0ZShrZXkpO1xuIH1cbiB9fSk7XG5cbiB9O1xuXG4vKipcbiAqIERpc3Rpbmd1aXNoZXMgYmV0d2VlbiBhZGRpbmcgYSBuZXcga2V5IChpbml0KSBhbmQgdXBkYXRpbmcgb3JcbiAqIHJlZmVyZW5jaW5nIGEga2V5IChnZXQsIHNldCwgZGVsZXRlKS5cbiAqXG4gKiBgaW5pdGAgaXMgb25seSBhbGxvd2VkIGlmIHRoZSBrZXkgZG9lcyBub3QgYWxyZWFkeSBleGlzdC4gYEdldGAsXG4gKiBgc2V0YCBhbmQgYGRlbGV0ZWAgYXJlIG9ubHkgYWxsb3dlZCBpZiB0aGUga2V5IGRvZXMgYWxyZWFkeSBleGlzdC5cbiAqXG4gKiBUaGlzIGlzIGEgKnNjYWxhciogc2V0IGluIHRoYXQgdGhlIGtleXMgY2FuIG9ubHkgYmUgYXRvbWljIHZhbHVlcywgcHJpbWl0aXZlc1xuICogb3IgcmVtb3RhYmxlcy4gT3RoZXIgc3RvcmVTZXRzIHdpbGwgYWNjZXB0LCBmb3IgZXhhbXBsZSwgY29weUFycmF5cyBhbmRcbiAqIGNvcHlSZWNvcmRzLCBhcyBrZXlzIGFuZCBsb29rIHRoZW0gdXAgYmFzZWQgb24gZXF1YWxpdHkgb2YgdGhlaXIgY29udGVudHMuXG4gKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdGFnPSdrZXknXSAtIHRhZyBmb3IgZGVidWdnaW5nXG4gKiBAcGFyYW0ge1N0b3JlT3B0aW9ucz19IG9wdGlvbnNcbiAqIEByZXR1cm5zIHtTZXRTdG9yZTxLPn1cbiAqLyRo4oCNX29uY2UubWFrZVNldFN0b3JlTWV0aG9kcyhtYWtlU2V0U3RvcmVNZXRob2RzKTtcbmNvbnN0ICAgICAgICBtYWtlU2NhbGFyU2V0U3RvcmU9KFxudGFnPSdrZXknLFxue2tleVNoYXBlPXVuZGVmaW5lZH09e30pPT5cbntcbmNvbnN0IGpzc2V0PW5ldyBTZXQoKTtcbmlmKGtleVNoYXBlIT09dW5kZWZpbmVkKXtcbmFzc2VydFBhdHRlcm4oa2V5U2hhcGUpO1xuIH1cblxuY29uc3QgYXNzZXJ0S2V5T2tUb0FkZD0oa2V5KT0+e1xuLyogVE9ETzogSnVzdCBhIHRyYW5zaXRpb24ga2x1ZGdlLiBSZW1vdmUgd2hlbiBwb3NzaWJsZS4qL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzYwNiovXG5oYXJkZW4oa2V5KTtcblxuYXNzZXJ0U2NhbGFyS2V5KGtleSk7XG5pZihrZXlTaGFwZSE9PXVuZGVmaW5lZCl7XG5maXQoa2V5LGtleVNoYXBlLCdzZXRTdG9yZSBrZXknKTtcbiB9XG4gfTtcblxucmV0dXJuIEZhciggYHNjYWxhciBTZXRTdG9yZSBvZiAke3EodGFnKX1gLHtcbi4uLm1ha2VTZXRTdG9yZU1ldGhvZHMoanNzZXQsYXNzZXJ0S2V5T2tUb0FkZCx1bmRlZmluZWQsdGFnKX0pO1xuXG4gfTskaOKAjV9vbmNlLm1ha2VTY2FsYXJTZXRTdG9yZShtYWtlU2NhbGFyU2V0U3RvcmUpO1xuaGFyZGVuKG1ha2VTY2FsYXJTZXRTdG9yZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVNldFN0b3JlTWV0aG9kcyI6WyJtYWtlU2V0U3RvcmVNZXRob2RzIl0sIm1ha2VTY2FsYXJTZXRTdG9yZSI6WyJtYWtlU2NhbGFyU2V0U3RvcmUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA+6NmjsURAADFEQAANQAAAEBhZ29yaWMvc3RvcmUtdjAuOC41L3NyYy9zdG9yZXMvc2NhbGFyV2Vha01hcFN0b3JlLmpzeyJpbXBvcnRzIjpbIi4uL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qcyIsIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIiwibWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRmFyLGFzc2VydFBhc3NhYmxlLHBhc3NTdHlsZU9mLGZpdCxhc3NlcnRQYXR0ZXJuOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXSxbXCJhc3NlcnRQYXNzYWJsZVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGFzc2FibGUgPSAkaOKAjV9hKV1dLFtcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV1dXSxbXCIuLi9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanNcIiwgW1tcImZpdFwiLCBbJGjigI1fYSA9PiAoZml0ID0gJGjigI1fYSldXSxbXCJhc3NlcnRQYXR0ZXJuXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXR0ZXJuID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cbmNvbnN0e2RldGFpbHM6WCxxdW90ZTpxfT1hc3NlcnQ7XG5cbi8qKlxuICogQHRlbXBsYXRlIEssVlxuICogQHBhcmFtIHtXZWFrTWFwPEsgJiBvYmplY3QsIFY+fSBqc21hcFxuICogQHBhcmFtIHsoazogSywgdjogVikgPT4gdm9pZH0gYXNzZXJ0S1ZPa1RvQWRkXG4gKiBAcGFyYW0geyhrOiBLLCB2OiBWKSA9PiB2b2lkfSBhc3NlcnRLVk9rVG9TZXRcbiAqIEBwYXJhbSB7KChrOiBLKSA9PiB2b2lkKT19IGFzc2VydEtleU9rVG9EZWxldGVcbiAqIEBwYXJhbSB7c3RyaW5nPX0ga2V5TmFtZVxuICogQHJldHVybnMge1dlYWtNYXBTdG9yZTxLLFY+fVxuICovXG5jb25zdCAgICAgICAgbWFrZVdlYWtNYXBTdG9yZU1ldGhvZHM9KFxuanNtYXAsXG5hc3NlcnRLVk9rVG9BZGQsXG5hc3NlcnRLVk9rVG9TZXQsXG5hc3NlcnRLZXlPa1RvRGVsZXRlPXVuZGVmaW5lZCxcbmtleU5hbWU9J2tleScpPT5cbntcbmNvbnN0IGFzc2VydEtleURvZXNOb3RFeGlzdD0oa2V5KT0+XG5hc3NlcnQoIWpzbWFwLmhhcyhrZXkpLFggYCR7cShrZXlOYW1lKX0gYWxyZWFkeSByZWdpc3RlcmVkOiAke2tleX1gKTtcblxuY29uc3QgYXNzZXJ0S2V5RXhpc3RzPShrZXkpPT5cbmFzc2VydChqc21hcC5oYXMoa2V5KSxYIGAke3Eoa2V5TmFtZSl9IG5vdCBmb3VuZDogJHtrZXl9YCk7XG5cbnJldHVybiBoYXJkZW4oe1xuaGFzOihrZXkpPT57XG4vKiBDaGVjayBpZiBhIGtleSBleGlzdHMuIFRoZSBrZXkgY2FuIGJlIGFueSBKYXZhU2NyaXB0IHZhbHVlLCovXG4vKiB0aG91Z2ggdGhlIGFuc3dlciB3aWxsIGFsd2F5cyBiZSBmYWxzZSBmb3Iga2V5cyB0aGF0IGNhbm5vdCBiZSBmb3VuZCovXG4vKiBpbiB0aGlzIG1hcC4qL1xucmV0dXJuIGpzbWFwLmhhcyhrZXkpO1xuIH0sXG5nZXQ6KGtleSk9PntcbmFzc2VydEtleUV4aXN0cyhrZXkpO1xuLyogSG93IHRvIHRlbGwgdHlwZXNjcmlwdCBJIGJlbGlldmUgdGhlIGBnZXRgIHdpbGwgc3VjY2VlZC4qL1xucmV0dXJuICgvKiogQHR5cGUge1Z9ICovanNtYXAuZ2V0KGtleSkpO1xuIH0sXG5cbmluaXQ6KGtleSx2YWx1ZSk9PntcbmFzc2VydEtleURvZXNOb3RFeGlzdChrZXkpO1xuYXNzZXJ0S1ZPa1RvQWRkKGtleSx2YWx1ZSk7XG5qc21hcC5zZXQoa2V5LHZhbHVlKTtcbiB9LFxuc2V0OihrZXksdmFsdWUpPT57XG5hc3NlcnRLZXlFeGlzdHMoa2V5KTtcbmFzc2VydEtWT2tUb1NldChrZXksdmFsdWUpO1xuanNtYXAuc2V0KGtleSx2YWx1ZSk7XG4gfSxcbmRlbGV0ZTooa2V5KT0+e1xuYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG5pZihhc3NlcnRLZXlPa1RvRGVsZXRlIT09dW5kZWZpbmVkKXtcbmFzc2VydEtleU9rVG9EZWxldGUoa2V5KTtcbiB9XG5qc21hcC5kZWxldGUoa2V5KTtcbiB9LFxuXG5hZGRBbGw6KGVudHJpZXMpPT57XG5mb3IoY29uc3Rba2V5LHZhbHVlXW9mIGVudHJpZXMpe1xuLyogRG9uJ3QgYXNzZXJ0IHRoYXQgdGhlIGtleSBlaXRoZXIgZG9lcyBvciBkb2VzIG5vdCBleGlzdC4qL1xuYXNzZXJ0S1ZPa1RvQWRkKGtleSx2YWx1ZSk7XG5qc21hcC5zZXQoa2V5LHZhbHVlKTtcbiB9XG4gfX0pO1xuXG4gfTtcblxuLyoqXG4gKiBUaGlzIGlzIGEgKnNjYWxhciogbWFwU3RvcmUgaW4gdGhhdCB0aGUga2V5cyBjYW4gb25seSBiZSBhdG9taWMgdmFsdWVzOlxuICogcHJpbWl0aXZlcyBvciByZW1vdGFibGVzLlxuICogT3RoZXIgbWFwU3RvcmVzIHdpbGwgYWNjZXB0LCBmb3IgZXhhbXBsZSwgY29weUFycmF5cyBhbmRcbiAqIGNvcHlSZWNvcmRzIGFzIGtleXMgYW5kIGxvb2sgdGhlbSB1cCBiYXNlZCBvbiBlcXVhbGl0eSBvZiB0aGVpciBjb250ZW50cy5cbiAqXG4gKiBUT0RPIEZvciBub3csIHRoaXMgc2NhbGFyV2Vha01hcCBhY2NlcHRzIG9ubHkgcmVtb3RhYmxlcywgcmVmbGVjdGluZyB0aGVcbiAqIGNvbnN0cmFpbnRzIG9mIHRoZSB1bmRlcmx5aW5nIEphdmFTY3JpcHQgV2Vha01hcCBpdCB1c2VzIGludGVybmFsbHkuIEJ1dFxuICogaXQgc2hvdWxkIGFjY2VwdCB0aGUgcHJpbWl0aXZlcyBhcyB3ZWxsLCBzdG9yaW5nIHRoZW0gaW4gYSBzZXBhcmF0ZSBpbnRlcm5hbFxuICogbWFwLiBXaGF0IG1ha2VzIGl0IFwid2Vha1wiIGlzIHRoYXQgaXQgcHJvdmlkZXMgbm8gQVBJIGZvciBlbnVtZXJhdGluZyB3aGF0J3NcbiAqIHRoZXJlLiBUaG91Z2ggbm90ZSB0aGF0IHRoaXMgd291bGQgb25seSBlbmFibGVzIGNvbGxlY3Rpb24gb2YgdGhlXG4gKiByZW1vdGFibGVzLCBzaW5jZSB0aGUgb3RoZXIgcHJpbWl0aXZlcyBtYXkgYWx3YXlzIHJlYXBwZWFyLlxuICpcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdGFnPSdrZXknXSAtIHRhZyBmb3IgZGVidWdnaW5nXG4gKiBAcGFyYW0ge1N0b3JlT3B0aW9ucz19IG9wdGlvbnNcbiAqIEByZXR1cm5zIHtXZWFrTWFwU3RvcmU8SyxWPn1cbiAqLyRo4oCNX29uY2UubWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMobWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMpO1xuY29uc3QgICAgICAgIG1ha2VTY2FsYXJXZWFrTWFwU3RvcmU9KFxudGFnPSdrZXknLFxue2xvbmdMaXZlZD10cnVlLGtleVNoYXBlPXVuZGVmaW5lZCx2YWx1ZVNoYXBlPXVuZGVmaW5lZH09e30pPT5cbntcbmNvbnN0IGpzbWFwPW5ldyhsb25nTGl2ZWQ/V2Vha01hcDpNYXApKCk7XG5pZihrZXlTaGFwZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnRQYXR0ZXJuKGtleVNoYXBlKTtcbiB9XG5pZih2YWx1ZVNoYXBlIT09dW5kZWZpbmVkKXtcbmFzc2VydFBhdHRlcm4odmFsdWVTaGFwZSk7XG4gfVxuXG5jb25zdCBhc3NlcnRLVk9rVG9TZXQ9KF9rZXksdmFsdWUpPT57XG4vKiBUT0RPOiBKdXN0IGEgdHJhbnNpdGlvbiBrbHVkZ2UuIFJlbW92ZSB3aGVuIHBvc3NpYmxlLiovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNjA2Ki9cbmhhcmRlbih2YWx1ZSk7XG5cbmFzc2VydFBhc3NhYmxlKHZhbHVlKTtcbmlmKHZhbHVlU2hhcGUhPT11bmRlZmluZWQpe1xuZml0KHZhbHVlLHZhbHVlU2hhcGUsJ3dlYWtNYXBTdG9yZSB2YWx1ZScpO1xuIH1cbiB9O1xuXG5jb25zdCBhc3NlcnRLVk9rVG9BZGQ9KGtleSx2YWx1ZSk9Pntcbi8qIFRPRE86IEp1c3QgYSB0cmFuc2l0aW9uIGtsdWRnZS4gUmVtb3ZlIHdoZW4gcG9zc2libGUuKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM2MDYqL1xuaGFyZGVuKGtleSk7XG5wYXNzU3R5bGVPZihrZXkpPT09J3JlbW90YWJsZSd8fFxuYXNzZXJ0LmZhaWwoXG5YIGBPbmx5IHJlbW90YWJsZXMgY2FuIGJlIGtleXMgb2Ygc2NhbGFyIFdlYWtNYXBTdG9yZXM6ICR7a2V5fWApO1xuXG5pZihrZXlTaGFwZSE9PXVuZGVmaW5lZCl7XG5maXQoa2V5LGtleVNoYXBlLCd3ZWFrTWFwU3RvcmUga2V5Jyk7XG4gfVxuYXNzZXJ0S1ZPa1RvU2V0KGtleSx2YWx1ZSk7XG4gfTtcblxucmV0dXJuIEZhciggYHNjYWxhciBXZWFrTWFwU3RvcmUgb2YgJHtxKHRhZyl9YCx7XG4uLi5tYWtlV2Vha01hcFN0b3JlTWV0aG9kcyhcbmpzbWFwLFxuYXNzZXJ0S1ZPa1RvQWRkLFxuYXNzZXJ0S1ZPa1RvU2V0LFxudW5kZWZpbmVkLFxudGFnKX0pO1xuXG5cbiB9OyRo4oCNX29uY2UubWFrZVNjYWxhcldlYWtNYXBTdG9yZShtYWtlU2NhbGFyV2Vha01hcFN0b3JlKTtcbmhhcmRlbihtYWtlU2NhbGFyV2Vha01hcFN0b3JlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlV2Vha01hcFN0b3JlTWV0aG9kcyI6WyJtYWtlV2Vha01hcFN0b3JlTWV0aG9kcyJdLCJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIjpbIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAule5gX4NAAB+DQAANQAAAEBhZ29yaWMvc3RvcmUtdjAuOC41L3NyYy9zdG9yZXMvc2NhbGFyV2Vha1NldFN0b3JlLmpzeyJpbXBvcnRzIjpbIi4uL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qcyIsIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJtYWtlU2NhbGFyV2Vha1NldFN0b3JlIiwibWFrZVdlYWtTZXRTdG9yZU1ldGhvZHMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRmFyLHBhc3NTdHlsZU9mLGZpdCxhc3NlcnRQYXR0ZXJuOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXSxbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dXV0sW1wiLi4vcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzXCIsIFtbXCJmaXRcIiwgWyRo4oCNX2EgPT4gKGZpdCA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0UGF0dGVyblwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGF0dGVybiA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5jb25zdHtkZXRhaWxzOlgscXVvdGU6cX09YXNzZXJ0O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAcGFyYW0ge1dlYWtTZXQ8SyAmIG9iamVjdD59IGpzc2V0XG4gKiBAcGFyYW0geyhrOiBLKSA9PiB2b2lkfSBhc3NlcnRLZXlPa1RvQWRkXG4gKiBAcGFyYW0geygoazogSykgPT4gdm9pZCk9fSBhc3NlcnRLZXlPa1RvRGVsZXRlXG4gKiBAcGFyYW0ge3N0cmluZz19IGtleU5hbWVcbiAqIEByZXR1cm5zIHtXZWFrU2V0U3RvcmU8Sz59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlV2Vha1NldFN0b3JlTWV0aG9kcz0oXG5qc3NldCxcbmFzc2VydEtleU9rVG9BZGQsXG5hc3NlcnRLZXlPa1RvRGVsZXRlPXVuZGVmaW5lZCxcbmtleU5hbWU9J2tleScpPT5cbntcbmNvbnN0IGFzc2VydEtleUV4aXN0cz0oa2V5KT0+XG5hc3NlcnQoanNzZXQuaGFzKGtleSksWCBgJHtxKGtleU5hbWUpfSBub3QgZm91bmQ6ICR7a2V5fWApO1xuXG5yZXR1cm4gaGFyZGVuKHtcbmhhczooa2V5KT0+e1xuLyogQ2hlY2sgaWYgYSBrZXkgZXhpc3RzLiBUaGUga2V5IGNhbiBiZSBhbnkgSmF2YVNjcmlwdCB2YWx1ZSwqL1xuLyogdGhvdWdoIHRoZSBhbnN3ZXIgd2lsbCBhbHdheXMgYmUgZmFsc2UgZm9yIGtleXMgdGhhdCBjYW5ub3QgYmUgZm91bmQqL1xuLyogaW4gdGhpcyBzZXQuKi9cbnJldHVybiBqc3NldC5oYXMoa2V5KTtcbiB9LFxuXG5hZGQ6KGtleSk9PntcbmFzc2VydEtleU9rVG9BZGQoa2V5KTtcbmpzc2V0LmFkZChrZXkpO1xuIH0sXG5kZWxldGU6KGtleSk9PntcbmFzc2VydEtleUV4aXN0cyhrZXkpO1xuaWYoYXNzZXJ0S2V5T2tUb0RlbGV0ZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnRLZXlPa1RvRGVsZXRlKGtleSk7XG4gfVxuanNzZXQuZGVsZXRlKGtleSk7XG4gfSxcblxuYWRkQWxsOihrZXlzKT0+e1xuZm9yKGNvbnN0IGtleSBvZiBrZXlzKXtcbmFzc2VydEtleU9rVG9BZGQoa2V5KTtcbmpzc2V0LmFkZChrZXkpO1xuIH1cbiB9fSk7XG5cbiB9O1xuXG4vKipcbiAqIFRoaXMgaXMgYSAqc2NhbGFyKiBzZXQgaW4gdGhhdCB0aGUga2V5cyBjYW4gb25seSBiZSBhdG9taWMgdmFsdWVzLCBwcmltaXRpdmVzXG4gKiBvciByZW1vdGFibGVzLiBPdGhlciBzdG9yZVNldHMgd2lsbCBhY2NlcHQsIGZvciBleGFtcGxlLCBjb3B5QXJyYXlzIGFuZFxuICogY29weVJlY29yZHMsIGFzIGtleXMgYW5kIGxvb2sgdGhlbSB1cCBiYXNlZCBvbiBlcXVhbGl0eSBvZiB0aGVpciBjb250ZW50cy5cbiAqXG4gKiBUT0RPIEZvciBub3csIHRoaXMgc2NhbGFyV2Vha1NldCBhY2NlcHRzIG9ubHkgcmVtb3RhYmxlcywgcmVmbGVjdGluZyB0aGVcbiAqIGNvbnN0cmFpbnRzIG9mIHRoZSB1bmRlcmx5aW5nIEphdmFTY3JpcHQgV2Vha1NldCBpdCB1c2VzIGludGVybmFsbHkuIEJ1dFxuICogaXQgc2hvdWxkIGFjY2VwdCB0aGUgcHJpbWl0aXZlcyBhcyB3ZWxsLCBzdG9yaW5nIHRoZW0gaW4gYSBzZXBhcmF0ZSBpbnRlcm5hbFxuICogc2V0LiBXaGF0IG1ha2VzIGl0IFwid2Vha1wiIGlzIHRoYXQgaXQgcHJvdmlkZXMgbm8gQVBJIGZvciBlbnVtZXJhdGluZyB3aGF0J3NcbiAqIHRoZXJlLiBUaG91Z2ggbm90ZSB0aGF0IHRoaXMgd291bGQgb25seSBlbmFibGVzIGNvbGxlY3Rpb24gb2YgdGhlXG4gKiByZW1vdGFibGVzLCBzaW5jZSB0aGUgb3RoZXIgcHJpbWl0aXZlcyBtYXkgYWx3YXlzIGFwcGVhci5cbiAqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtzdHJpbmd9IFt0YWc9J2tleSddIC0gdGFnIGZvciBkZWJ1Z2dpbmdcbiAqIEBwYXJhbSB7U3RvcmVPcHRpb25zPX0gb3B0aW9uc1xuICogQHJldHVybnMge1dlYWtTZXRTdG9yZTxLPn1cbiAqLyRo4oCNX29uY2UubWFrZVdlYWtTZXRTdG9yZU1ldGhvZHMobWFrZVdlYWtTZXRTdG9yZU1ldGhvZHMpO1xuY29uc3QgICAgICAgIG1ha2VTY2FsYXJXZWFrU2V0U3RvcmU9KFxudGFnPSdrZXknLFxue2xvbmdMaXZlZD10cnVlLGtleVNoYXBlPXVuZGVmaW5lZH09e30pPT5cbntcbmNvbnN0IGpzc2V0PW5ldyhsb25nTGl2ZWQ/V2Vha1NldDpTZXQpKCk7XG5pZihrZXlTaGFwZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnRQYXR0ZXJuKGtleVNoYXBlKTtcbiB9XG5cbmNvbnN0IGFzc2VydEtleU9rVG9BZGQ9KGtleSk9Pntcbi8qIFRPRE86IEp1c3QgYSB0cmFuc2l0aW9uIGtsdWRnZS4gUmVtb3ZlIHdoZW4gcG9zc2libGUuKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM2MDYqL1xuaGFyZGVuKGtleSk7XG5wYXNzU3R5bGVPZihrZXkpPT09J3JlbW90YWJsZSd8fFxuYXNzZXJ0LmZhaWwoWCBgT25seSByZW1vdGFibGVzIGNhbiBiZSBrZXlzIG9mIHNjYWxhciBXZWFrU3RvcmVzOiAke2tleX1gKTtcbmlmKGtleVNoYXBlIT09dW5kZWZpbmVkKXtcbmZpdChrZXksa2V5U2hhcGUsJ3dlYWtTZXRTdG9yZSBrZXknKTtcbiB9XG4gfTtcblxucmV0dXJuIEZhciggYHNjYWxhciBXZWFrU2V0U3RvcmUgb2YgJHtxKHRhZyl9YCx7XG4uLi5tYWtlV2Vha1NldFN0b3JlTWV0aG9kcyhqc3NldCxhc3NlcnRLZXlPa1RvQWRkLHVuZGVmaW5lZCx0YWcpfSk7XG5cbiB9OyRo4oCNX29uY2UubWFrZVNjYWxhcldlYWtTZXRTdG9yZShtYWtlU2NhbGFyV2Vha1NldFN0b3JlKTtcbmhhcmRlbihtYWtlU2NhbGFyV2Vha1NldFN0b3JlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlV2Vha1NldFN0b3JlTWV0aG9kcyI6WyJtYWtlV2Vha1NldFN0b3JlTWV0aG9kcyJdLCJtYWtlU2NhbGFyV2Vha1NldFN0b3JlIjpbIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAqb5r/kATAABAEwAALgAAAEBhZ29yaWMvc3RvcmUtdjAuOC41L3NyYy9zdG9yZXMvc3RvcmUtdXRpbHMuanN7ImltcG9ydHMiOlsiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbIm1ha2VBdG9taWNQcm92aWRlciIsIm1ha2VDdXJyZW50S2V5c0tpdCIsInByb3ZpZGVMYXp5Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEZhcjskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuY29uc3R7ZGV0YWlsczpYLHF1b3RlOnF9PWFzc2VydDtcblxuLyoqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBDdXJyZW50S2V5c0tpdFxuICogQHByb3BlcnR5IHsoazogSywgdj86IFYpID0+IHZvaWR9IGFzc2VydFVwZGF0ZU9uQWRkXG4gKiBAcHJvcGVydHkgeyhrOiBLKSA9PiB2b2lkfSBhc3NlcnRVcGRhdGVPbkRlbGV0ZVxuICogQHByb3BlcnR5IHtJdGVyYWJsZTxLPn0gaXRlcmFibGVLZXlzXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAcGFyYW0geygpID0+IEl0ZXJhYmxlPEs+fSBnZXRSYXdLZXlzXG4gKiBAcGFyYW0geyhrOiBLKSA9PiBib29sZWFufSBjaGVja0hhc1xuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHBhcmFtIHsoazogSywgdj86IFYpID0+IHZvaWR9IGFzc2VydE9rVG9BZGRcbiAqIEBwYXJhbSB7KChrOiBLKSA9PiB2b2lkKT19IGFzc2VydE9rVG9EZWxldGVcbiAqIEBwYXJhbSB7c3RyaW5nPX0ga2V5TmFtZVxuICogQHJldHVybnMge0N1cnJlbnRLZXlzS2l0PEssVj59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlQ3VycmVudEtleXNLaXQ9KFxuZ2V0UmF3S2V5cyxcbmNoZWNrSGFzLFxuY29tcGFyZSxcbmFzc2VydE9rVG9BZGQsXG5hc3NlcnRPa1RvRGVsZXRlPXVuZGVmaW5lZCxcbmtleU5hbWU9J2tleScpPT5cbntcbmxldCB1cGRhdGVDb3VudD0wO1xubGV0IHNvcnRlZEtleXNNZW1vO1xuXG5jb25zdCBhc3NlcnRVcGRhdGVPbkFkZD0oayx2PXVuZGVmaW5lZCk9PntcbmFzc2VydE9rVG9BZGQoayx2KTtcbnVwZGF0ZUNvdW50Kz0xO1xuc29ydGVkS2V5c01lbW89dW5kZWZpbmVkO1xuIH07XG5cbmNvbnN0IGFzc2VydFVwZGF0ZU9uRGVsZXRlPShrKT0+YXNzZXJ0T2tUb0RlbGV0ZSYmYXNzZXJ0T2tUb0RlbGV0ZShrKTtcblxuY29uc3QgZ2V0U29ydGVkS2V5cz0oKT0+e1xuaWYoc29ydGVkS2V5c01lbW89PT11bmRlZmluZWQpe1xuc29ydGVkS2V5c01lbW89aGFyZGVuKFsuLi5nZXRSYXdLZXlzKCldLnNvcnQoY29tcGFyZSkpO1xuIH1cbnJldHVybiBzb3J0ZWRLZXlzTWVtbztcbiB9O1xuXG5jb25zdCBpdGVyYWJsZUtleXM9RmFyKCdJdGVyYWJsZSBvZiBrZXlzJyx7XG5bU3ltYm9sLml0ZXJhdG9yXTooKT0+e1xuY29uc3QgZ2VuZXJhdGlvbj11cGRhdGVDb3VudDtcbmdldFNvcnRlZEtleXMoKTtcbmNvbnN0IGxlbj1zb3J0ZWRLZXlzTWVtby5sZW5ndGg7XG5sZXQgaT0wO1xucmV0dXJuIEZhcignSXRlcmF0b3Igb2Yga2V5cycse1xubmV4dDooKT0+e1xuYXNzZXJ0LmVxdWFsKFxuZ2VuZXJhdGlvbixcbnVwZGF0ZUNvdW50LFxuWCBgU3RvcmUgJHtxKGtleU5hbWUpfSBjdXJzb3Igc3RhbGVgKTtcblxuLyogSWYgdGhleSdyZSBlcXVhbCwgdGhlbiB0aGUgc29ydGVkS2V5TWVtbyBpcyB0aGUgc2FtZSBvbmUqL1xuLyogd2Ugc3RhcnRlZCB3aXRoLiovXG5mb3IoOzspe1xuaWYoaTxsZW4pe1xuY29uc3QgdmFsdWU9c29ydGVkS2V5c01lbW9baV07XG5pKz0xO1xuaWYoY2hlY2tIYXModmFsdWUpKXtcbnJldHVybiBoYXJkZW4oe2RvbmU6ZmFsc2UsdmFsdWV9KTtcbiB9XG4gfWVsc2V7XG5yZXR1cm4gaGFyZGVuKHtkb25lOnRydWUsdmFsdWU6dW5kZWZpbmVkfSk7XG4gfVxuIH1cbiB9fSk7XG5cbiB9fSk7XG5cblxucmV0dXJuIGhhcmRlbih7XG5hc3NlcnRVcGRhdGVPbkFkZCxcbmFzc2VydFVwZGF0ZU9uRGVsZXRlLFxuaXRlcmFibGVLZXlzfSk7XG5cbiB9OyRo4oCNX29uY2UubWFrZUN1cnJlbnRLZXlzS2l0KG1ha2VDdXJyZW50S2V5c0tpdCk7XG5oYXJkZW4obWFrZUN1cnJlbnRLZXlzS2l0KTtcblxuLyoqXG4gKiBDYWxsIGBwcm92aWRlTGF6eWAgdG8gZ2V0IG9yIG1ha2UgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5LlxuICogSWYgdGhlcmUgYWxyZWFkeSBpcyBvbmUsIHJldHVybiB0aGF0LiBPdGhlcndpc2UsXG4gKiBjYWxsIGBtYWtlVmFsdWUoa2V5KWAsIHJlbWVtYmVyIGl0IGFzIHRoZSB2YWx1ZSBmb3JcbiAqIHRoYXQga2V5LCBhbmQgcmV0dXJuIGl0LlxuICpcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEBwYXJhbSB7V2Vha01hcFN0b3JlPEssVj59IG1hcFN0b3JlXG4gKiBAcGFyYW0ge0t9IGtleVxuICogQHBhcmFtIHsoa2V5OiBLKSA9PiBWfSBtYWtlVmFsdWVcbiAqIEByZXR1cm5zIHtWfVxuICovXG5jb25zdCAgICAgICAgcHJvdmlkZUxhenk9KG1hcFN0b3JlLGtleSxtYWtlVmFsdWUpPT57XG5pZighbWFwU3RvcmUuaGFzKGtleSkpe1xubWFwU3RvcmUuaW5pdChrZXksbWFrZVZhbHVlKGtleSkpO1xuIH1cbnJldHVybiBtYXBTdG9yZS5nZXQoa2V5KTtcbiB9OyRo4oCNX29uY2UucHJvdmlkZUxhenkocHJvdmlkZUxhenkpO1xuaGFyZGVuKHByb3ZpZGVMYXp5KTtcblxuLyoqXG4gKiBIZWxwZXIgZm9yIHVzZSBjYXNlcyBpbiB3aGljaCB0aGUgbWFrZXIgZnVuY3Rpb24gaXMgYXN5bmMuXG4gKiBGb3IgdHdvIHByb3ZpZGVMYXp5IGNhbGxzIHdpdGggdGhlIHNhbWUga2V5LCBvbmUgbWF5IGJlIG1ha2luZyB3aGVuIHRoZVxuICogb3RoZXIgY2FsbCBzdGFydHMgYW5kIGl0IHdvdWxkIG1ha2UgYWdhaW4uXG4gKiAoVGhlbiB0aGVyZSdkIGJlIGEgY29sbGlzaW9uIHdoZW4gdGhlIHNlY29uZCB0cmllcyB0byBzdG9yZVxuICogdGhlIGtleS4pIFRoaXMgcHJldmVudHMgdGhhdCByYWNlIGNvbmRpdGlvbiBieSBpbW1lZGlhdGVseSBzdG9yaW5nIGEgUHJvbWlzZVxuICogZm9yIHRoZSBtYWtlciBpbiBhbiBlcGhlbWVyYWwgc3RvcmUuXG4gKlxuICogV2hlbiB0aGUgYHN0b3JlYCBhcmd1bWVudCBpcyBkdXJhYmxlIHN0b3JhZ2UsIG5vdGUgdGhhdCBpdCdzIHBvc3NpYmxlIGZvclxuICogdGVybWluYXRpb24gdG8gaGFwcGVuIGFmdGVyIHRoZSBtYWtlIGNvbXBsZXRlcyBhbmQgYmVmb3JlIGl0IHJlYWNoZXMgZHVyYWJsZVxuICogc3RvcmFnZS5cbiAqXG4gKiBAdGVtcGxhdGUgS1xuICogQHRlbXBsYXRlIFZcbiAqIEBwYXJhbSB7V2Vha01hcFN0b3JlPEssIFY+fSBzdG9yZVxuICovXG5jb25zdCAgICAgICAgbWFrZUF0b21pY1Byb3ZpZGVyPShzdG9yZSk9Pntcbi8qKiBAdHlwZSB7TWFwPEssIFByb21pc2U8Vj4+fSAqL1xuY29uc3QgcGVuZGluZz1uZXcgTWFwKCk7XG5cbi8qKlxuICogQ2FsbCBgcHJvdmlkZUFzeW5jYCB0byBnZXQgb3IgbWFrZSB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXksXG4gKiB3aGVuIHRoZSBtYWtlciBpcyBhc3luY2hyb25vdXMuXG4gKiBJZiB0aGVyZSBhbHJlYWR5IGlzIG9uZSwgcmV0dXJuIHRoYXQuIE90aGVyd2lzZSxcbiAqIGNhbGwgYG1ha2VWYWx1ZShrZXkpYCwgcmVtZW1iZXIgaXQgYXMgdGhlIHZhbHVlIGZvclxuICogdGhhdCBrZXksIGFuZCByZXR1cm4gaXQuXG4gKlxuICogQHBhcmFtIHtLfSBrZXlcbiAqIEBwYXJhbSB7KGtleTogSykgPT4gUHJvbWlzZTxWPn0gbWFrZVZhbHVlIG1ha2UgdGhlIHZhbHVlIGZvciB0aGUgc3RvcmVcbiAqIGlmIGl0IGhhc24ndCBiZWVuIG1hZGUgeWV0IG9yIHRoZSBsYXN0IG1ha2UgZmFpbGVkXG4gKiBAcGFyYW0geyhrZXk6IEssIHZhbHVlOiBWKSA9PiBQcm9taXNlPHZvaWQ+fSBbZmluaXNoVmFsdWVdIHJ1bnMgZXhhY3RseVxuICogb25jZSBhZnRlciBhIG5ldyB2YWx1ZSBpcyBhZGRlZCB0byB0aGUgc3RvcmVcbiAqIEByZXR1cm5zIHtQcm9taXNlPFY+fVxuICovXG5jb25zdCBwcm92aWRlQXN5bmM9KGtleSxtYWtlVmFsdWUsZmluaXNoVmFsdWUpPT57XG5pZihzdG9yZS5oYXMoa2V5KSl7XG5yZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHN0b3JlLmdldChrZXkpKTtcbiB9XG5pZighcGVuZGluZy5oYXMoa2V5KSl7XG5jb25zdCB2YWxQPW1ha2VWYWx1ZShrZXkpLlxudGhlbigodik9PntcbnN0b3JlLmluaXQoa2V5LHYpO1xucmV0dXJuIHY7XG4gfSkuXG50aGVuKCh2KT0+e1xuaWYoZmluaXNoVmFsdWUpe1xucmV0dXJuIGZpbmlzaFZhbHVlKGtleSx2KS50aGVuKCgpPT52KTtcbiB9XG5yZXR1cm4gdjtcbiB9KS5cbmZpbmFsbHkoKCk9PntcbnBlbmRpbmcuZGVsZXRlKGtleSk7XG4gfSk7XG5wZW5kaW5nLnNldChrZXksdmFsUCk7XG4gfVxuY29uc3QgdmFsUD1wZW5kaW5nLmdldChrZXkpO1xuYXNzZXJ0KHZhbFApO1xucmV0dXJuIHZhbFA7XG4gfTtcblxucmV0dXJuIGhhcmRlbih7cHJvdmlkZUFzeW5jfSk7XG4gfTskaOKAjV9vbmNlLm1ha2VBdG9taWNQcm92aWRlcihtYWtlQXRvbWljUHJvdmlkZXIpO1xuaGFyZGVuKG1ha2VBdG9taWNQcm92aWRlcik7XG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAdGVtcGxhdGUgVlxuICogQHR5cGVkZWYge1JldHVyblR5cGU8dHlwZW9mIG1ha2VBdG9taWNQcm92aWRlcjxLLCBWPj59IEF0b21pY1Byb3ZpZGVyPEssIFY+XG4gKi9cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlQ3VycmVudEtleXNLaXQiOlsibWFrZUN1cnJlbnRLZXlzS2l0Il0sInByb3ZpZGVMYXp5IjpbInByb3ZpZGVMYXp5Il0sIm1ha2VBdG9taWNQcm92aWRlciI6WyJtYWtlQXRvbWljUHJvdmlkZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAzUHsEoRuAACEbgAAIQAAAEBhZ29yaWMvc3RvcmUtdjAuOC41L3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEB0cy1jaGVjayovXG5cbi8qLyA8cmVmZXJlbmNlIHR5cGVzPVwic2VzXCIvPiovXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLlBhc3NhYmxlfSBQYXNzYWJsZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuUGFzc1N0eWxlfSBQYXNzU3R5bGUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLkNvcHlUYWdnZWR9IENvcHlUYWdnZWQgKi9cbi8qKiBAdGVtcGxhdGUgVCBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLkNvcHlSZWNvcmQ8VD59IENvcHlSZWNvcmQgKi9cbi8qKiBAdGVtcGxhdGUgVCBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLkNvcHlBcnJheTxUPn0gQ29weUFycmF5ICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5DaGVja2VyfSBDaGVja2VyICovXG5cbi8qKlxuICogQHR5cGVkZWYge1Bhc3NhYmxlfSBLZXlcbiAqIEtleXMgYXJlIHBhc3MtYnktY29weSBzdHJ1Y3R1cmVzIChDb3B5QXJyYXksIENvcHlSZWNvcmQsXG4gKiBDb3B5U2V0LCBDb3B5QmFnLCBDb3B5TWFwKSB0aGF0IGVuZCBpbiBlaXRoZXIgcGFzc2FibGUgcHJpbWl0aXZlIGRhdGEgb3JcbiAqIFJlbW90YWJsZXMgKEZhciBvYmplY3RzIG9yIHRoZWlyIHJlbW90ZSBwcmVzZW5jZXMuKSBLZXlzIGFyZSBzbyBuYW1lZFxuICogYmVjYXVzZSB0aGV5IGNhbiBiZSB1c2VkIGFzIGtleXMgaW4gTWFwU3RvcmVzIGFuZCBDb3B5TWFwcywgYXMgd2VsbCBhc1xuICogdGhlIGVsZW1lbnRzIG9mIENvcHlTZXRzIGFuZCBDb3B5QmFncy5cbiAqXG4gKiBLZXlzIGNhbm5vdCBjb250YWluIHByb21pc2VzIG9yIGVycm9ycywgYXMgdGhlc2UgZG8gbm90IGhhdmUgYSB1c2VmdWxcbiAqIGRpc3RyaWJ1dGVkIGVxdWFsaXR5IHNlbWFudGljcy4gS2V5cyBhbHNvIGNhbm5vdCBjb250YWluIGFueSBDb3B5VGFnZ2VkXG4gKiBleGNlcHQgZm9yIHRob3NlIHJlY29nbml6ZWQgYXMgQ29weVNldHMsIENvcHlCYWdzLCBhbmQgQ29weU1hcHMuXG4gKlxuICogQmUgYXdhcmUgdGhhdCB3ZSBtYXkgcmVjb2duaXplIG1vcmUgQ29weVRhZ2dlZHMgb3ZlciB0aW1lLCBpbmNsdWRpbmdcbiAqIENvcHlUYWdnZWRzIHJlY29nbml6ZWQgYXMga2V5cy5cbiAqXG4gKiBEaXN0cmlidXRlZCBlcXVhbGl0eSBpcyBsb2NhdGlvbiBpbmRlcGVuZGVudC5cbiAqIFRoZSBzYW1lIHR3byBrZXlzLCBwYXNzZWQgdG8gYW5vdGhlciBsb2NhdGlvbiwgd2lsbCBiZSBga2V5RVFgIHRoZXJlIGlmZlxuICogdGhleSBhcmUgYGtleUVRYCBoZXJlLiAoYGtleUVRYCB0ZXN0cyBlcXVhbGl0eSBhY2NvcmRpbmcgdG8gdGhlXG4gKiBrZXkgZGlzdHJpYnV0ZWQgZXF1YWxpdHkgc2VtYW50aWNzLilcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtQYXNzYWJsZX0gUGF0dGVyblxuICogUGF0dGVybnMgYXJlIHBhc3MtYnktY29weSBzdHJ1Y3R1cmVzIChDb3B5QXJyYXksIENvcHlSZWNvcmQsXG4gKiBDb3B5U2V0LCBDb3B5QmFnLCBDb3B5TWFwKSB0aGF0IGVuZCBpbiBlaXRoZXIgS2V5cyBvciBNYXRjaGVycy4gRWFjaCBwYXR0ZXJuXG4gKiBhY3RzIGFzIGEgZGVjbGFyYXRpdmUgcGFzc2FibGUgcHJlZGljYXRlIG92ZXIgcGFzc2FibGVzLCB3aGVyZSBlYWNoIHBhc3NhYmxlXG4gKiBlaXRoZXIgcGFzc2VzIGEgZ2l2ZW4gcGF0dGVybiwgb3IgZG9lcyBub3QuIEV2ZXJ5IGtleSBpcyBhbHNvIGEgcGF0dGVybi5cbiAqIFVzZWQgYXMgYSBwYXR0ZXJuLCBhIGtleSBtYXRjaGVzIG9ubHkgXCJpdHNlbGZcIiwgaS5lLiwga2V5cyB0aGF0IGFyZVxuICogYGtleUVRYCB0byBpdCwgdGhhdCBpcywgZXF1YWwgYWNjb3JkaW5nIHRvIHRoZVxuICoga2V5IGRpc3RyaWJ1dGVkIGVxdWFsaXR5IHNlbWFudGljcy5cbiAqXG4gKiBQYXR0ZXJucyBjYW5ub3QgY29udGFpbiBwcm9taXNlcyBvciBlcnJvcnMsIGFzIHRoZXNlIGRvXG4gKiBub3QgaGF2ZSBhIHVzZWZ1bCBkaXN0cmlidXRlZCBlcXVhbGl0eSBvciBtYXRjaGluZyBzZW1hbnRpY3MuIExpa2V3aXNlLFxuICogbm8gcGF0dGVybiBjYW4gZGlzdGluZ3Vpc2ggYW1vbmcgcHJvbWlzZXMsIG9yIGRpc3Rpbmd1aXNoIGFtb25nIGVycm9ycy5cbiAqIFBhdHRlcm5zIGFsc28gY2Fubm90IGNvbnRhaW4gYW55IENvcHlUYWdnZWRzIGV4Y2VwdCBmb3IgdGhvc2UgcmVjb2duaXplZCBhc1xuICogQ29weVNldHMsIENvcHlCYWdzLCBDb3B5TWFwcywgb3IgTWF0Y2hlcnMuXG4gKlxuICogQmUgYXdhcmUgdGhhdCB3ZSBtYXkgcmVjb2duaXplIG1vcmUgQ29weVRhZ2dlZHMgb3ZlciB0aW1lLCBpbmNsdWRpbmdcbiAqIENvcHlUYWdnZWRzIHJlY29nbml6ZWQgYXMgcGF0dGVybnMuXG4gKlxuICogV2hldGhlciBhIHBhc3NhYmxlIG1hdGNoZXMgYSBnaXZlbiBwYXR0ZXJuIGlzIGxvY2F0aW9uIGluZGVwZW5kZW50LlxuICogRm9yIGEgcGFzc2FibGUgYW5kIGEgcGF0dGVybiwgYm90aCBwYXNzZWQgdG8gYW5vdGhlciBsb2NhdGlvbiwgdGhlIHBhc3NhYmxlXG4gKiB3aWxsIG1hdGNoIHRoZSBwYXR0ZXJuIHRoZXJlIGlmZiB0aGUgcGFzc2FibGUgbWF0Y2hlcyB0aGF0IHBhdHRlcm4gaGVyZS5cbiAqXG4gKiBQYXR0ZXJucyBhcmUgb2Z0ZW4gdXNlZCBpbiBhIHR5cGUtbGlrZSBtYW5uZXIsIHRvIHJlcHJlc2VudCB0aGUgY2F0ZWdvcnlcbiAqIG9mIHBhc3NhYmxlcyB0aGF0IGFyZSBpbnRlbmRlZCogdG8gbWF0Y2ggdGhhdCBwYXR0ZXJuLiBUbyBrZWVwIHRoaXNcbiAqIGRpc3RpbmN0aW9uIGNsZWFyLCB3ZSBvZnRlbiB1c2UgdGhlIHN1ZmZpeCBcIlNoYXBlXCIgcmF0aGVyIHRoYW4gXCJQYXR0ZXJuXCJcbiAqIHRvIGF2b2lkIHRoZSBsZXZlbHMgY29uZnVzaW9uIHdoZW4gdGhlIHBhdHRlcm4gaXRzZWxmIHJlcHJlc2VudHNcbiAqIHNvbWUgY2F0ZWdvcnkgb2YgcGF0dGVybi4gRm9yIGV4YW1wbGUsIGFuIFwiQW1vdW50U2hhcGVcIiByZXByZXNlbnRzIHRoZVxuICogY2F0ZWdvcnkgb2YgQW1vdW50cy4gQW5kIFwiQW1vdW50UGF0dGVyblNoYXBlXCIgcmVwcmVzZW50cyB0aGVcbiAqIGNhdGVnb3J5IG9mIHBhdHRlcm5zIG92ZXIgQW1vdW50cy5cbiAqXG4gKiAqIEkgc2F5IFwiaW50ZW5kZWRcIiBhYm92ZSBiZWNhdXNlIFBhdHRlcm5zLCBpbiBvcmRlciB0byBiZSBkZWNsYXJhdGl2ZVxuICogYW5kIHBhc3NhYmxlLCBjYW5ub3QgaGF2ZSB0aGUgZ2VuZXJhbGl0eSBvZiBwcmVkaWNhdGVzIHdyaXR0ZW4gaW4gYVxuICogVHVyaW5nLXVuaXZlcnNhbCBwcm9ncmFtbWluZyBsYW5ndWFnZS4gUmF0aGVyLCB0byByZXByZXNlbnQgdGhlIGNhdGVnb3J5IG9mXG4gKiB0aGluZ3MgaW50ZW5kZWQgdG8gYmUgYSBGb28sIGEgRm9vU2hhcGUgc2hvdWxkIHJlbGlhYmx5XG4gKiBhY2NlcHQgYWxsIEZvb3MgYW5kIHJlamVjdCBvbmx5IG5vbi1Gb29zLiBIb3dldmVyLCBhIEZvb1NoYXBlIG1heSBhbHNvIGFjY2VwdFxuICogbm9uLUZvb3MgdGhhdCBcImxvb2sgbGlrZVwiIG9yIGhhdmUgXCJ0aGUgc2FtZSBzaGFwZSBhc1wiIGdlbnVpbmUgRm9vcy4gVG8gd3JpdGVcbiAqIGFzIGFjY3VyYXRlIHByZWRpY2F0ZSwgZm9yIHVzZSwgZm9yIGV4YW1wbGUsIGZvciBpbnB1dCB2YWxpZGF0aW9uLCB3b3VsZFxuICogbmVlZCB0byBzdXBwbGVtZW50IHRoZSBwYXR0ZXJuIGNoZWNrIHdpdGggY29kZSB0byBjaGVjayBmb3IgdGhlIHJlc2lkdWFsXG4gKiBjYXNlcy5cbiAqIFdlIGhvcGUgdGhlIFwiU2hhcGVcIiBtZXRhcGhvciBoZWxwcyByZW1pbmQgdXMgb2YgdGhpcyB0eXBlLWxpa2UgaW1wcmVjaXNpb25cbiAqIG9mIHBhdHRlcm5zLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEB0eXBlZGVmIHtDb3B5VGFnZ2VkfSBDb3B5U2V0XG4gKi9cblxuLyogVE9ETyBwYXJhbWV0ZXJpemUgQ29weVRhZ2dlZCBzbyB0aGlzIGNhbiBpbmNsdWRlIGl0Ki9cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEB0eXBlZGVmIHt7XG4gKiAgIFtTeW1ib2wudG9TdHJpbmdUYWddOiBzdHJpbmc7XG4gKiAgIHBheWxvYWQ6IEFycmF5PFtLLCBiaWdpbnRdPjtcbiAqIH19IENvcHlCYWdcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEB0eXBlZGVmIHtDb3B5VGFnZ2VkfSBDb3B5TWFwXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7Q29weVRhZ2dlZH0gTWF0Y2hlclxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU3RvcmVPcHRpb25zXG4gKiBPZiB0aGUgZGltZW5zaW9ucyBvbiB3aGljaCBLZXllZFN0b3JlcyBjYW4gZGlmZmVyLCB3ZSBvbmx5IHJlcHJlc2VudCBhIGZld1xuICogb2YgdGhlbSBhcyBzdGFuZGFyZCBvcHRpb25zLiBBIGdpdmVuIHN0b3JlIG1ha2VyIHNob3VsZCBkb2N1bWVudCB3aGljaFxuICogb3B0aW9ucyBpdCBzdXBwb3J0cywgYXMgd2VsbCBhcyBpdHMgcG9zaXRpb25zIG9uIGRpbWVuc2lvbnMgZm9yIHdoaWNoIGl0XG4gKiBkb2VzIG5vdCBzdXBwb3J0IG9wdGlvbnMuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtsb25nTGl2ZWQ9dHJ1ZV0gV2hpY2ggd2F5IHRvIG9wdGltaXplIGEgd2VhayBzdG9yZS4gVHJ1ZSBtZWFuc1xuICogdGhhdCB3ZSBleHBlY3QgdGhpcyB3ZWFrIHN0b3JlIHRvIG91dGxpdmUgbW9zdCBvZiBpdHMga2V5cywgaW4gd2hpY2hcbiAqIGNhc2Ugd2UgaW50ZXJuYWxseSBtYXkgdXNlIGEgSmF2YVNjcmlwdCBgV2Vha01hcGAuIE90aGVyd2lzZSB3ZSBpbnRlcm5hbGx5XG4gKiBtYXkgdXNlIGEgSmF2YVNjcmlwdCBgTWFwYC5cbiAqIERlZmF1bHRzIHRvIHRydWUsIHNvIHBsZWFzZSBtYXJrIHNob3J0IGxpdmVkIHN0b3JlcyBleHBsaWNpdGx5LlxuICogQHByb3BlcnR5IHtib29sZWFufSBbZHVyYWJsZT1mYWxzZV0gIFRoZSBjb250ZW50cyBvZiB0aGlzIHN0b3JlIHN1cnZpdmUgdGVybWluYXRpb25cbiAqICAgb2YgaXRzIGNvbnRhaW5pbmcgcHJvY2VzcywgYWxsb3dpbmcgZm9yIHJlc3RhcnQgb3IgdXBncmFkZSBidXQgYXQgdGhlIGNvc3RcbiAqICAgb2YgZm9yYmlkZGluZyBzdG9yYWdlIG9mIHJlZmVyZW5jZXMgdG8gZXBoZW1lcmFsIGRhdGEuICBEZWZhdWx0cyB0byBmYWxzZS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2Zha2VEdXJhYmxlPWZhbHNlXSAgVGhpcyBzdG9yZSBwcmV0ZW5kcyB0byBiZSBhIGR1cmFibGUgc3RvcmVcbiAqICAgYnV0IGRvZXMgbm90IGVuZm9yY2UgdGhhdCB0aGUgdGhpbmdzIHN0b3JlZCBpbiBpdCBhY3R1YWxseSBiZSB0aGVtc2VsdmVzXG4gKiAgIGR1cmFibGUgKHdoZXJlYXMgYW4gYWN0dWFsIGR1cmFibGUgc3RvcmUgd291bGQgZm9yYmlkIHN0b3JhZ2Ugb2Ygc3VjaFxuICogICBpdGVtcykuICBUaGlzIGlzIGluIHNlcnZpY2Ugb2YgYWxsb3dpbmcgaW5jcmVtZW50YWwgdHJhbnNpdGlvbiB0byB1c2Ugb2ZcbiAqICAgZHVyYWJsZSBzdG9yZXMsIHRvIGVuYWJsZSBub3JtYWwgb3BlcmF0aW9uIGFuZCB0ZXN0aW5nIHdoZW4gc29tZSBzdHVmZlxuICogICBpbnRlbmRlZCB0byBldmVudHVhbGx5IGJlIGR1cmFibGUgaGFzIG5vdCB5ZXQgYmVlbiBtYWRlIGR1cmFibGUuICBBIHN0b3JlXG4gKiAgIG1hcmtlZCBhcyBmYWtlRHVyYWJsZSB3aWxsIGFwcGVhciB0byBvcGVyYXRlIG5vcm1hbGx5IGJ1dCBhbnkgYXR0ZW1wdCB0b1xuICogICB1cGdyYWRlIGl0cyBjb250YWluaW5nIHZhdCB3aWxsIGZhaWwgd2l0aCBhbiBlcnJvci5cbiAqIEBwcm9wZXJ0eSB7UGF0dGVybj19IGtleVNoYXBlXG4gKiBAcHJvcGVydHkge1BhdHRlcm49fSB2YWx1ZVNoYXBlXG4gKi9cblxuLyoqXG4gKiBNb3N0IHN0b3JlIG1ldGhvZHMgYXJlIGluIG9uZSBvZiB0aHJlZSBjYXRlZ29yaWVzXG4gKiAgICogbG9va3VwIG1ldGhvZHMgKGBoYXNgLGBnZXRgKVxuICogICAqIHVwZGF0ZSBtZXRob2RzIChgYWRkYCxgaW5pdGAsYHNldGAsYGRlbGV0ZWAsYGFkZEFsbGApXG4gKiAgICogcXVlcnkgbWV0aG9kcyAoYHNuYXBzaG90YCxga2V5c2AsYHZhbHVlc2AsYGVudHJpZXNgLGBnZXRTaXplYClcbiAqICAgKiBxdWVyeS11cGRhdGUgbWV0aG9kcyAoYGNsZWFyYClcbiAqXG4gKiBXZWFrU3RvcmVzIGhhdmUgdGhlIGxvb2t1cCBhbmQgdXBkYXRlIG1ldGhvZHMgYnV0IG5vdCB0aGUgcXVlcnlcbiAqIG9yIHF1ZXJ5LXVwZGF0ZSBtZXRob2RzLlxuICogTm9uLXdlYWsgU3RvcmVzIGFyZSBsaWtlIHRoZWlyIGNvcnJlc3BvbmRpbmcgV2Vha1N0b3JlLCBidXQgd2l0aCB0aGVcbiAqIGFkZGl0aW9uYWwgcXVlcnkgYW5kIHF1ZXJ5LXVwZGF0ZSBtZXRob2RzLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFdlYWtTZXRTdG9yZVxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiBib29sZWFufSBoYXNcbiAqIENoZWNrIGlmIGEga2V5IGV4aXN0cy4gVGhlIGtleSBjYW4gYmUgYW55IEphdmFTY3JpcHQgdmFsdWUsIHRob3VnaCB0aGVcbiAqIGFuc3dlciB3aWxsIGFsd2F5cyBiZSBmYWxzZSBmb3Iga2V5cyB0aGF0IGNhbm5vdCBiZSBmb3VuZCBpbiB0aGlzIHN0b3JlLlxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiB2b2lkfSBhZGRcbiAqIEFkZCB0aGUga2V5IHRvIHRoZSBzZXQgaWYgaXQgaXMgbm90IGFscmVhZHkgdGhlcmUuIERvIG5vdGhpbmcgc2lsZW50bHkgaWZcbiAqIGFscmVhZHkgdGhlcmUuXG4gKiBUaGUga2V5IG11c3QgYmUgb25lIGFsbG93ZWQgYnkgdGhpcyBzdG9yZS4gRm9yIGV4YW1wbGUgYSBzY2FsYXIgc3RvcmUgb25seVxuICogYWxsb3dzIHByaW1pdGl2ZXMgYW5kIHJlbW90YWJsZXMuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IHZvaWR9IGRlbGV0ZVxuICogUmVtb3ZlIHRoZSBrZXkuIFRocm93cyBpZiBub3QgZm91bmQuXG4gKiBAcHJvcGVydHkgeyhrZXlzOiBJdGVyYWJsZTxLPikgPT4gdm9pZH0gYWRkQWxsXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHR5cGVkZWYge29iamVjdH0gU2V0U3RvcmVcbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gYm9vbGVhbn0gaGFzXG4gKiBDaGVjayBpZiBhIGtleSBleGlzdHMuIFRoZSBrZXkgY2FuIGJlIGFueSBKYXZhU2NyaXB0IHZhbHVlLCB0aG91Z2ggdGhlXG4gKiBhbnN3ZXIgd2lsbCBhbHdheXMgYmUgZmFsc2UgZm9yIGtleXMgdGhhdCBjYW5ub3QgYmUgZm91bmQgaW4gdGhpcyBzdG9yZS5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gdm9pZH0gYWRkXG4gKiBBZGQgdGhlIGtleSB0byB0aGUgc2V0IGlmIGl0IGlzIG5vdCBhbHJlYWR5IHRoZXJlLiBEbyBub3RoaW5nIHNpbGVudGx5IGlmXG4gKiBhbHJlYWR5IHRoZXJlLlxuICogVGhlIGtleSBtdXN0IGJlIG9uZSBhbGxvd2VkIGJ5IHRoaXMgc3RvcmUuIEZvciBleGFtcGxlIGEgc2NhbGFyIHN0b3JlIG9ubHlcbiAqIGFsbG93cyBwcmltaXRpdmVzIGFuZCByZW1vdGFibGVzLlxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiB2b2lkfSBkZWxldGVcbiAqIFJlbW92ZSB0aGUga2V5LiBUaHJvd3MgaWYgbm90IGZvdW5kLlxuICogQHByb3BlcnR5IHsoa2V5czogSXRlcmFibGU8Sz4pID0+IHZvaWR9IGFkZEFsbFxuICogQHByb3BlcnR5IHsoa2V5UGF0dD86IFBhdHRlcm4pID0+IEl0ZXJhYmxlPEs+fSBrZXlzXG4gKiBAcHJvcGVydHkgeyhrZXlQYXR0PzogUGF0dGVybikgPT4gSXRlcmFibGU8Sz59IHZhbHVlc1xuICogQHByb3BlcnR5IHsoa2V5UGF0dD86IFBhdHRlcm4pID0+IENvcHlTZXQ8Sz59IHNuYXBzaG90XG4gKiBAcHJvcGVydHkgeyhrZXlQYXR0PzogUGF0dGVybikgPT4gbnVtYmVyfSBnZXRTaXplXG4gKiBAcHJvcGVydHkgeyhrZXlQYXR0PzogUGF0dGVybikgPT4gdm9pZH0gY2xlYXJcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFdlYWtNYXBTdG9yZVxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiBib29sZWFufSBoYXNcbiAqIENoZWNrIGlmIGEga2V5IGV4aXN0cy4gVGhlIGtleSBjYW4gYmUgYW55IEphdmFTY3JpcHQgdmFsdWUsIHRob3VnaCB0aGVcbiAqIGFuc3dlciB3aWxsIGFsd2F5cyBiZSBmYWxzZSBmb3Iga2V5cyB0aGF0IGNhbm5vdCBiZSBmb3VuZCBpbiB0aGlzIHN0b3JlLlxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiBWfSBnZXRcbiAqIFJldHVybiBhIHZhbHVlIGZvciB0aGUga2V5LiBUaHJvd3MgaWYgbm90IGZvdW5kLlxuICogQHByb3BlcnR5IHsoa2V5OiBLLCB2YWx1ZTogVikgPT4gdm9pZH0gaW5pdFxuICogSW5pdGlhbGl6ZSB0aGUga2V5IG9ubHkgaWYgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0LlxuICogVGhlIGtleSBtdXN0IGJlIG9uZSBhbGxvd2VkIGJ5IHRoaXMgc3RvcmUuIEZvciBleGFtcGxlIGEgc2NhbGFyIHN0b3JlIG9ubHlcbiAqIGFsbG93cyBwcmltaXRpdmVzIGFuZCByZW1vdGFibGVzLlxuICogQHByb3BlcnR5IHsoa2V5OiBLLCB2YWx1ZTogVikgPT4gdm9pZH0gc2V0XG4gKiBTZXQgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gdm9pZH0gZGVsZXRlXG4gKiBSZW1vdmUgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGVudHJpZXM6IEl0ZXJhYmxlPFtLLFZdPikgPT4gdm9pZH0gYWRkQWxsXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBNYXBTdG9yZVxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiBib29sZWFufSBoYXNcbiAqIENoZWNrIGlmIGEga2V5IGV4aXN0cy4gVGhlIGtleSBjYW4gYmUgYW55IEphdmFTY3JpcHQgdmFsdWUsIHRob3VnaCB0aGVcbiAqIGFuc3dlciB3aWxsIGFsd2F5cyBiZSBmYWxzZSBmb3Iga2V5cyB0aGF0IGNhbm5vdCBiZSBmb3VuZCBpbiB0aGlzIG1hcFxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiBWfSBnZXRcbiAqIFJldHVybiBhIHZhbHVlIGZvciB0aGUga2V5LiBUaHJvd3MgaWYgbm90IGZvdW5kLlxuICogQHByb3BlcnR5IHsoa2V5OiBLLCB2YWx1ZTogVikgPT4gdm9pZH0gaW5pdFxuICogSW5pdGlhbGl6ZSB0aGUga2V5IG9ubHkgaWYgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0LlxuICogVGhlIGtleSBtdXN0IGJlIG9uZSBhbGxvd2VkIGJ5IHRoaXMgc3RvcmUuIEZvciBleGFtcGxlIGEgc2NhbGFyIHN0b3JlIG9ubHlcbiAqIGFsbG93cyBwcmltaXRpdmVzIGFuZCByZW1vdGFibGVzLlxuICogQHByb3BlcnR5IHsoa2V5OiBLLCB2YWx1ZTogVikgPT4gdm9pZH0gc2V0XG4gKiBTZXQgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gdm9pZH0gZGVsZXRlXG4gKiBSZW1vdmUgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGVudHJpZXM6IEl0ZXJhYmxlPFtLLFZdPikgPT4gdm9pZH0gYWRkQWxsXG4gKiBAcHJvcGVydHkgeyhrZXlQYXR0PzogUGF0dGVybiwgdmFsdWVQYXR0PzogUGF0dGVybikgPT4gSXRlcmFibGU8Sz59IGtleXNcbiAqIEBwcm9wZXJ0eSB7KGtleVBhdHQ/OiBQYXR0ZXJuLCB2YWx1ZVBhdHQ/OiBQYXR0ZXJuKSA9PiBJdGVyYWJsZTxWPn0gdmFsdWVzXG4gKiBAcHJvcGVydHkgeyhcbiAqICAga2V5UGF0dD86IFBhdHRlcm4sXG4gKiAgIHZhbHVlUGF0dD86IFBhdHRlcm5cbiAqICkgPT4gSXRlcmFibGU8W0ssVl0+fSBlbnRyaWVzXG4gKiBAcHJvcGVydHkgeyhrZXlQYXR0PzogUGF0dGVybiwgdmFsdWVQYXR0PzogUGF0dGVybikgPT4gQ29weU1hcDxLLFY+fSBzbmFwc2hvdFxuICogQHByb3BlcnR5IHsoa2V5UGF0dD86IFBhdHRlcm4sIHZhbHVlUGF0dD86IFBhdHRlcm4pID0+IG51bWJlcn0gZ2V0U2l6ZVxuICogQHByb3BlcnR5IHsoa2V5UGF0dD86IFBhdHRlcm4sIHZhbHVlUGF0dD86IFBhdHRlcm4pID0+IHZvaWR9IGNsZWFyXG4gKi9cblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBEZXByZWNhdGVkIExlZ2FjeSAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEB0eXBlZGVmIHtXZWFrTWFwU3RvcmU8SyxWPn0gV2Vha1N0b3JlXG4gKiBEZXByZWNhdGVkIHR5cGUgbmFtZSBgV2Vha1N0b3JlYC4gVXNlIGBXZWFrTWFwU3RvcmVgIGluc3RlYWQuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAdHlwZWRlZiB7TWFwU3RvcmU8SyxWPn0gU3RvcmVcbiAqIERlcHJlY2F0ZWQgdHlwZSBuYW1lIGBTdG9yZWAuIFVzZSBgTWFwU3RvcmVgIGluc3RlYWQuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBMZWdhY3lXZWFrTWFwXG4gKiBMZWdhY3lXZWFrTWFwIGlzIGRlcHJlY2F0ZWQuIFVzZSBXZWFrTWFwU3RvcmUgaW5zdGVhZC5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gYm9vbGVhbn0gaGFzXG4gKiBDaGVjayBpZiBhIGtleSBleGlzdHNcbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gVn0gZ2V0XG4gKiBSZXR1cm4gYSB2YWx1ZSBmb3IgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSywgdmFsdWU6IFYpID0+IHZvaWR9IGluaXRcbiAqIEluaXRpYWxpemUgdGhlIGtleSBvbmx5IGlmIGl0XG4gKiBkb2Vzbid0IGFscmVhZHkgZXhpc3RcbiAqIEBwcm9wZXJ0eSB7KGtleTogSywgdmFsdWU6IFYpID0+IHZvaWR9IHNldFxuICogU2V0IHRoZSBrZXkuIFRocm93cyBpZiBub3QgZm91bmQuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IHZvaWR9IGRlbGV0ZVxuICogUmVtb3ZlIHRoZSBrZXkuIFRocm93cyBpZiBub3QgZm91bmQuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBMZWdhY3lNYXBcbiAqIExlZ2FjeVdlYWtNYXAgaXMgZGVwcmVjYXRlZC4gVXNlIFdlYWtNYXBTdG9yZSBpbnN0ZWFkLlxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiBib29sZWFufSBoYXNcbiAqIENoZWNrIGlmIGEga2V5IGV4aXN0c1xuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiBWfSBnZXRcbiAqIFJldHVybiBhIHZhbHVlIGZvciB0aGUga2V5LiBUaHJvd3MgaWYgbm90IGZvdW5kLlxuICogQHByb3BlcnR5IHsoa2V5OiBLLCB2YWx1ZTogVikgPT4gdm9pZH0gaW5pdFxuICogSW5pdGlhbGl6ZSB0aGUga2V5IG9ubHkgaWYgaXRcbiAqIGRvZXNuJ3QgYWxyZWFkeSBleGlzdFxuICogQHByb3BlcnR5IHsoa2V5OiBLLCB2YWx1ZTogVikgPT4gdm9pZH0gc2V0XG4gKiBTZXQgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gdm9pZH0gZGVsZXRlXG4gKiBSZW1vdmUgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gSXRlcmFibGU8Sz59IGtleXNcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gSXRlcmFibGU8Vj59IHZhbHVlc1xuICogQHByb3BlcnR5IHsoKSA9PiBJdGVyYWJsZTxbSyxWXT59IGVudHJpZXNcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gbnVtYmVyfSBnZXRTaXplXG4gKiBAcHJvcGVydHkgeygpID0+IHZvaWR9IGNsZWFyXG4gKi9cblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKipcbiAqIEB0eXBlZGVmIHstMSB8IDAgfCAxfSBSYW5rQ29tcGFyaXNvblxuICogVGhlIHJlc3VsdCBvZiBhIGBSYW5rQ29tcGFyZWAgZnVuY3Rpb24gdGhhdCBkZWZpbmVzIGEgcmFuay1vcmRlciwgaS5lLixcbiAqIGEgdG90YWwgcHJlb3JkZXIgaW4gd2hpY2ggZGlmZmVyZW50IGVsZW1lbnRzIGFyZSBhbHdheXMgY29tcGFyYWJsZSBidXRcbiAqIGNhbiBiZSB0aWVkIGZvciB0aGUgc2FtZSByYW5rLiBTZWUgYFJhbmtDb21wYXJlYC5cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBSYW5rQ29tcGFyZVxuICogUmV0dXJucyBgLTFgLCBgMGAsIG9yIGAxYCBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgcmFuayBvZiBgbGVmdGBcbiAqIGlzIGJlZm9yZSwgdGllZC13aXRoLCBvciBhZnRlciB0aGUgcmFuayBvZiBgcmlnaHRgLlxuICpcbiAqIFRoaXMgY29tcGFyaXNvbiBmdW5jdGlvbiBpcyB2YWxpZCBhcyBhcmd1bWVudCB0b1xuICogYEFycmF5LnByb3RvdHlwZS5zb3J0YC4gVGhpcyBpcyBzb21ldGltZXMgZGVzY3JpYmVkIGFzIGEgXCJ0b3RhbCBvcmRlclwiXG4gKiBidXQsIGRlcGVuZGluZyBvbiB5b3VyIGRlZmluaXRpb25zLCB0aGlzIGlzIHRlY2huaWNhbGx5IGluY29ycmVjdCBiZWNhdXNlXG4gKiBpdCBtYXkgcmV0dXJuIGAwYCB0byBpbmRpY2F0ZSB0aGF0IHR3byBkaXN0aW5ndWlzaGFibGUgZWxlbWVudHMgc3VjaCBhc1xuICogYC0wYCBhbmQgYDBgIGFyZSB0aWVkIChpLmUuLCBhcmUgaW4gdGhlIHNhbWUgZXF1aXZhbGVuY2UgY2xhc3NcbiAqIGZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBvcmRlcmluZykuIElmIGVhY2ggc3VjaCBlcXVpdmFsZW5jZSBjbGFzcyBpc1xuICogYSAqcmFuayogYW5kIHJhbmtzIGFyZSBkaXNqb2ludCwgdGhlbiB0aGlzIFwicmFuayBvcmRlclwiIGlzIGFcbiAqIHRydWUgdG90YWwgb3JkZXIgb3ZlciB0aGVzZSByYW5rcy4gSW4gbWF0aGVtYXRpY3MgdGhpcyBnb2VzIGJ5IHNldmVyYWxcbiAqIG90aGVyIG5hbWVzIHN1Y2ggYXMgXCJ0b3RhbCBwcmVvcmRlclwiLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gZXN0YWJsaXNoZXMgYSB0b3RhbCByYW5rIG9yZGVyIG92ZXIgYWxsIHBhc3NhYmxlcy5cbiAqIFRvIGRvIHNvIGl0IG1ha2VzIGFyYml0cmFyeSBjaG9pY2VzLCBzdWNoIGFzIHRoYXQgYWxsIHN0cmluZ3NcbiAqIGFyZSBhZnRlciBhbGwgbnVtYmVycy4gVGh1cywgdGhpcyBvcmRlciBpcyBub3QgaW50ZW5kZWQgdG8gYmVcbiAqIHVzZWQgZGlyZWN0bHkgYXMgYSBjb21wYXJpc29uIHdpdGggdXNlZnVsIHNlbWFudGljcy4gSG93ZXZlciwgaXQgbXVzdCBiZVxuICogY2xvc2VseSBlbm91Z2ggcmVsYXRlZCB0byBzdWNoIGNvbXBhcmlzb25zIHRvIGFpZCBpbiBpbXBsZW1lbnRpbmdcbiAqIGxvb2t1cHMgYmFzZWQgb24gdGhvc2UgY29tcGFyaXNvbnMuIEZvciBleGFtcGxlLCBpbiBvcmRlciB0byBnZXQgYSB0b3RhbFxuICogb3JkZXIgYW1vbmcgcmFua3MsIHdlIHB1dCBgTmFOYCBhZnRlciBhbGwgb3RoZXIgSmF2YVNjcmlwdCBcIm51bWJlclwiIHZhbHVlc1xuICogKGkuZS4sIElFRUUgNzU0IGZsb2F0aW5nLXBvaW50IHZhbHVlcykuIEJ1dCBvdGhlcndpc2UsIHdlIHJhbmsgSmF2YVNjcmlwdFxuICogbnVtYmVycyBieSBzaWduZWQgbWFnbml0dWRlLCB3aXRoIGAwYCBhbmQgYC0wYCB0aWVkLiBBIHNlbWFudGljYWxseSB1c2VmdWxcbiAqIG9yZGVyaW5nIHdvdWxkIGFsc28gY29tcGFyZSBtYWduaXR1ZGVzLCBhbmQgc28gYWdyZWUgd2l0aCB0aGUgcmFuayBvcmRlcmluZ1xuICogb2YgYWxsIHZhbHVlcyBvdGhlciB0aGFuIGBOYU5gLiBBbiBhcnJheSBzb3J0ZWQgYnkgcmFuayB3b3VsZCBlbmFibGUgcmFuZ2VcbiAqIHF1ZXJpZXMgYnkgbWFnbml0dWRlLlxuICogQHBhcmFtIHtQYXNzYWJsZX0gbGVmdFxuICogQHBhcmFtIHtQYXNzYWJsZX0gcmlnaHRcbiAqIEByZXR1cm5zIHtSYW5rQ29tcGFyaXNvbn1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSYW5rQ29tcGFyZX0gRnVsbENvbXBhcmVcbiAqIEEgYEZ1bGxDb21wYXJlYCBmdW5jdGlvbiBzYXRpc2ZpZXMgYWxsIHRoZSBpbnZhcmlhbnRzIHN0YXRlZCBiZWxvdyBmb3JcbiAqIGBSYW5rQ29tcGFyZWAncyByZWxhdGlvbiB3aXRoIEtleUNvbXBhcmUuXG4gKiBJbiBhZGRpdGlvbiwgaXRzIGVxdWFsaXR5IGlzIGFzIHByZWNpc2UgYXMgdGhlIGBLZXlDb21wYXJlYFxuICogY29tcGFyaXNvbiBkZWZpbmVkIGJlbG93LCBpbiB0aGF0LCBmb3IgYWxsIEtleXMgYHhgIGFuZCBgeWAsXG4gKiBgRnVsbENvbXBhcmUoeCwgeSkgPT09IDBgIGlmZiBgS2V5Q29tcGFyZSh4LCB5KSA9PT0gMGAuXG4gKlxuICogRm9yIG5vbi1rZXlzIGEgYEZ1bGxDb21wYXJlYCBzaG91bGQgYmUgZXhhY3RseSBhcyBpbXByZWNpc2UgYXNcbiAqIGBSYW5rQ29tcGFyZWAuIEZvciBleGFtcGxlLCBib3RoIHdpbGwgdHJlYXQgYWxsIGVycm9ycyBhcyBpbiB0aGUgc2FtZVxuICogZXF1aXZhbGVuY2UgY2xhc3MuIEJvdGggd2lsbCB0cmVhdCBhbGwgcHJvbWlzZXMgYXMgaW4gdGhlIHNhbWVcbiAqIGVxdWl2YWxlbmNlIGNsYXNzLiBCb3RoIHdpbGwgb3JkZXIgdGFnZ2VkcyB0aGUgc2FtZSB3YXksIHdoaWNoIGlzIGFkbWl0dGVkbHlcbiAqIHdlaXJkLCBhcyBzb21lIHRhZ2dlZHMgd2lsbCBiZSBjb25zaWRlcmVkIGtleXMgYW5kIG90aGVyIHRhZ2dlZHMgd2lsbCBiZVxuICogY29uc2lkZXJlZCBub24ta2V5cy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFJhbmtDb21wYXJhdG9yS2l0XG4gKiBAcHJvcGVydHkge1JhbmtDb21wYXJlfSBjb21wYXJhdG9yXG4gKiBAcHJvcGVydHkge1JhbmtDb21wYXJlfSBhbnRpQ29tcGFyYXRvclxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRnVsbENvbXBhcmF0b3JLaXRcbiAqIEBwcm9wZXJ0eSB7RnVsbENvbXBhcmV9IGNvbXBhcmF0b3JcbiAqIEBwcm9wZXJ0eSB7RnVsbENvbXBhcmV9IGFudGlDb21wYXJhdG9yXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7LTEgfCAwIHwgMSB8IE5hTn0gS2V5Q29tcGFyaXNvblxuICogVGhlIHJlc3VsdCBvZiBhIGBLZXlDb21wYXJlYCBmdW5jdGlvbiB0aGF0IGRlZmluZXMgYSBtZWFuaW5nZnVsXG4gKiBhbmQgbWVhbmluZ2Z1bGx5IHByZWNpc2UgcGFydGlhbCBvcmRlciBvZiBgS2V5YCB2YWx1ZXMuIFNlZSBgS2V5Q29tcGFyZWAuXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgS2V5Q29tcGFyZVxuICogYGNvbXBhcmVLZXlzYCBpbXBsZW1lbnRzIGEgcGFydGlhbCBvcmRlciBvdmVyIGtleXMuIEFzIHdpdGggdGhlXG4gKiByYW5rIG9yZGVyaW5nIHByb2R1Y2VkIGJ5IGBjb21wYXJlUmFua2AsIC0xLCAwLCBhbmQgMSBtZWFuXG4gKiBcImxlc3MgdGhhblwiLCBcImVxdWl2YWxlbnQgdG9cIiwgYW5kIFwiZ3JlYXRlciB0aGFuXCIgcmVzcGVjdGl2ZWx5LlxuICogTmFOIG1lYW5zIFwiaW5jb21wYXJhYmxlXCIgLS0tIHRoZSBmaXJzdCBrZXkgaXMgbm90IGxlc3MsIGVxdWl2YWxlbnQsXG4gKiBvciBncmVhdGVyIHRoYW4gdGhlIHNlY29uZC4gRm9yIGV4YW1wbGUsIHN1YnNldHMgb3ZlciBzZXRzIGlzXG4gKiBhIHBhcnRpYWwgb3JkZXIuXG4gKlxuICogQnkgdXNpbmcgTmFOIGZvciBcImluY29tcGFyYWJsZVwiLCB0aGUgbm9ybWFsIGVxdWl2YWxlbmNlIGZvciB1c2luZ1xuICogdGhlIHJldHVybiB2YWx1ZSBpbiBhIGNvbXBhcmlzb24gaXMgcHJlc2VydmVkLlxuICogYGNvbXBhcmVLZXlzKGxlZnQsIHJpZ2h0KSA+PSAwYCBpZmYgYGxlZnRgIGlzIGdyZWF0ZXIgdGhhbiBvclxuICogZXF1aXZhbGVudCB0byBgcmlnaHRgIGluIHRoZSBwYXJ0aWFsIG9yZGVyaW5nLlxuICpcbiAqIEtleSBvcmRlciAoYSBwYXJ0aWFsIG9yZGVyKSBhbmQgcmFuayBvcmRlciAoYSB0b3RhbCBwcmVvcmRlcikgYXJlXG4gKiBjby1kZXNpZ25lZCBzbyB0aGF0IHdlIHN0b3JlIHBhc3NhYmxlcyBpbiByYW5rIG9yZGVyIGFuZCBpbmRleCBpbnRvIHRoZW1cbiAqIHdpdGgga2V5cyBmb3Iga2V5LWJhc2VkIHF1ZXJpZXMuIFRvIGtlZXAgdGhlc2UgZGlzdGluY3QsIHdoZW4gc3BlYWtpbmdcbiAqIGluZm9ybWFsbHkgYWJvdXQgcmFuaywgd2UgdGFsayBhYm91dCBcImVhcmxpZXJcIiBhbmQgXCJsYXRlclwiLiBXaGVuIHNwZWFraW5nXG4gKiBpbmZvcm1hbGx5IGFib3V0IGtleXMsIHdlIHRhbGsgYWJvdXQgXCJzbWFsbGVyXCIgYW5kIFwiYmlnZ2VyXCIuXG4gKlxuICogSW4gYm90aCBvcmRlcnMsIHRoZSByZXR1cm4tMCBjYXNlIGRlZmluZXNcbiAqIGFuIGVxdWl2YWxlbmNlIGNsYXNzLCBpLmUuLCB0aG9zZSB0aGF0IGFyZSB0aWVkIGZvciB0aGUgc2FtZSBwbGFjZSBpbiB0aGVcbiAqIG9yZGVyLiBUaGUgZ2xvYmFsIGludmFyaWFudCB0aGF0IHdlIG5lZWQgYmV0d2VlbiB0aGUgdHdvIG9yZGVycyBpcyB0aGF0IHRoZVxuICoga2V5IG9yZGVyIGVxdWl2YWxlbmNlIGNsYXNzIGlzIGFsd2F5cyBhdCBsZWFzdCBhcyBwcmVjaXNlIGFzIHRoZVxuICogcmFuayBvcmRlciBlcXVpdmFsZW5jZSBjbGFzcy4gSU9XLCBpZiBgY29tcGFyZUtleXMoWCxZKSA9PT0gMGAgdGhlblxuICogYGNvbXBhcmVSYW5rKFgsWSkgPT09IDBgLiBCdXQgbm90IHZpY2UgdmVyc2EuIEZvciBleGFtcGxlLCB0d28gZGlmZmVyZW50XG4gKiByZW1vdGFibGVzIGFyZSB0aGUgc2FtZSByYW5rIGJ1dCBpbmNvbXBhcmFibGUgYXMga2V5cy5cbiAqXG4gKiBBIGZ1cnRoZXIgaW52YXJpYW50IGlzIGlmIGBjb21wYXJlS2V5cyhYLFkpIDwgMGAgdGhlblxuICogYGNvbXBhcmVSYW5rKFgsWSkgPCAwYCwgaS5lLiwgaWYgWCBpcyBzbWFsbGVyIHRoYW4gWSBpbiBrZXkgb3JkZXIsIHRoZW4gWFxuICogbXVzdCBiZSBlYXJsaWVyIHRoYW4gWSBpbiByYW5rIG9yZGVyLiBCdXQgbm90IHZpY2UgdmVyc2EuXG4gKiBYIGNhbiBiZSBlcXVpdmFsZW50IHRvIG9yIGVhcmxpZXIgdGhhbiBZIGluIHJhbmsgb3JkZXIgYW5kIHN0aWxsIGJlXG4gKiBpbmNvbXBhcmFibGUgd2l0aCBZIGluIGtleSBvcmRlci4gRm9yIGV4YW1wbGUsIHRoZSByZWNvcmQgYHtiOiAzLCBhOiA1fWAgaXNcbiAqIGVhcmxpZXIgdGhhbiB0aGUgcmVjb3JkIGB7YjogNSwgYTogM31gIGluIHJhbmsgb3JkZXIgYnV0IHRoZXkgYXJlXG4gKiBpbmNvbXBhcmFibGUgYXMga2V5cy4gQW5kIHR3byBkaXN0aW5jdCByZW1vdGFibGVzIHN1Y2ggYXMgYEZhcignWCcsIHt9KWAgYW5kXG4gKiBgRmFyKCdZJywge30pYCBhcmUgZXF1aXZhbGVudCBpbiByYW5rIG9yZGVyIGJ1dCBpbmNvbXBhcmFibGUgYXMga2V5cy5cbiAqXG4gKiBUaGlzIGxldHMgdXMgdHJhbnNsYXRlIGEgcmFuZ2Ugc2VhcmNoIG92ZXIgdGhlXG4gKiBwYXJ0aWFsIGtleSBvcmRlciBpbnRvIGEgcmFuZ2Ugc2VhcmNoIG92ZXIgcmFuayBvcmRlciBmb2xsb3dlZCBieSBmaWx0ZXJpbmdcbiAqIG91dCB0aG9zZSB0aGF0IGRvbid0IG1hdGNoLiBUbyBnZXQgdGhpcyBlZmZlY3QsIHdlIHN0b3JlIHRoZSBlbGVtZW50cyBvZlxuICogYSBzZXQgaW4gYW4gYXJyYXkgc29ydGVkIGluIHJldmVyc2UgcmFuayBvcmRlciwgZnJvbSBsYXRlciB0byBlYXJsaWVyLlxuICogQ29tYmluZWQgd2l0aCBvdXIgbGV4aWNvZ3JhcGhpYyBjb21wYXJpc29uIG9mIGFycmF5cywgaWYgc2V0IFggaXMgYSBzdWJzZXRcbiAqIG9mIHNldCBZIHRoZW4gdGhlIGFycmF5IHJlcHJlc2VudGluZyBzZXQgWCB3aWxsIGJlIGFuIGVhcmxpZXIgcmFuayB0aGF0IHRoZVxuICogYXJyYXkgcmVwcmVzZW50aW5nIHNldCBZLlxuICpcbiAqIEBwYXJhbSB7S2V5fSBsZWZ0XG4gKiBAcGFyYW0ge0tleX0gcmlnaHRcbiAqIEByZXR1cm5zIHtLZXlDb21wYXJpc29ufVxuICovXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLyBTaG91bGQgYmUgaW50ZXJuYWwgb25seSB0eXBlcyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7W3N0cmluZywgc3RyaW5nXX0gUmFua0NvdmVyXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7W251bWJlciwgbnVtYmVyXX0gSW5kZXhDb3ZlclxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEdldFBhc3NTdHlsZUNvdmVyXG4gKiBBc3NvY2lhdGUgd2l0aCBlYWNoIHBhc3NTdHlsZSBhIFJhbmtDb3ZlciB0aGF0IG1heSBiZSBhbiBvdmVyZXN0aW1hdGUsXG4gKiBhbmQgd2hvc2UgcmVzdWx0cyB0aGVyZWZvcmUgbmVlZCB0byBiZSBmaWx0ZXJlZCBkb3duLiBGb3IgZXhhbXBsZSwgYmVjYXVzZVxuICogdGhlcmUgaXMgbm90IGEgc21hbGxlc3Qgb3IgYmlnZ2VzdCBiaWdpbnQsIGJvdW5kIGl0IGJ5IGBOYU5gICh0aGUgbGFzdCBwbGFjZVxuICogbnVtYmVyKSBhbmQgYCcnYCAodGhlIGVtcHR5IHN0cmluZywgd2hpY2ggaXMgdGhlIGZpcnN0IHBsYWNlIHN0cmluZykuIFRodXMsXG4gKiBhIHJhbmdlIHF1ZXJ5IHVzaW5nIHRoaXMgcmFuZ2UgbWF5IGluY2x1ZGUgdGhlc2UgdmFsdWVzLCB3aGljaCB3b3VsZCB0aGVuXG4gKiBuZWVkIHRvIGJlIGZpbHRlcmVkIG91dC5cbiAqIEBwYXJhbSB7UGFzc1N0eWxlfSBwYXNzU3R5bGVcbiAqIEByZXR1cm5zIHtSYW5rQ292ZXJ9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgR2V0SW5kZXhDb3ZlclxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBzb3J0ZWRcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEBwYXJhbSB7UmFua0NvdmVyfSByYW5rQ292ZXJcbiAqIEByZXR1cm5zIHtJbmRleENvdmVyfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIENvdmVyZWRFbnRyaWVzXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IHNvcnRlZFxuICogQHBhcmFtIHtJbmRleENvdmVyfSBpbmRleENvdmVyXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8W251bWJlciwgUGFzc2FibGVdPn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBDaGVja1BhdHRlcm5cbiAqIEBwYXJhbSB7UGFzc2FibGV9IGFsbGVnZWRQYXR0ZXJuXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBDaGVja0tleVBhdHRlcm5cbiAqIEBwYXJhbSB7UGFzc2FibGV9IGFsbGVnZWRQYXR0ZXJuXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBLZXlUb0RCS2V5XG4gKiBJZiB0aGlzIGtleSBjYW4gYmUgZW5jb2RlZCBhcyBhIERCS2V5IHN0cmluZyB3aGljaCBzb3J0cyBjb3JyZWN0bHksXG4gKiByZXR1cm4gdGhhdCBzdHJpbmcuIEVsc2UgcmV0dXJuIGB1bmRlZmluZWRgLiBGb3IgZXhhbXBsZSwgYSBzY2FsYXItb25seVxuICogZW5jb2RlUGFzc2FibGUgd291bGQgcmV0dXJuIGB1bmRlZmluZWRgIGZvciBhbGwgbm9uLXNjYWxhciBrZXlzLlxuICogQHBhcmFtIHtQYXNzYWJsZX0ga2V5XG4gKiBAcmV0dXJucyB7c3RyaW5nPX1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBHZXRSYW5rQ292ZXJcbiAqIEBwYXJhbSB7UGF0dGVybn0gcGF0dGVyblxuICogQHBhcmFtIHtLZXlUb0RCS2V5fSBlbmNvZGVQYXNzYWJsZVxuICogQHJldHVybnMge1JhbmtDb3Zlcn1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEFsbExpbWl0c1xuICogQHByb3BlcnR5IHtudW1iZXJ9IGRlY2ltYWxEaWdpdHNMaW1pdFxuICogQHByb3BlcnR5IHtudW1iZXJ9IHN0cmluZ0xlbmd0aExpbWl0XG4gKiBAcHJvcGVydHkge251bWJlcn0gc3ltYm9sTmFtZUxlbmd0aExpbWl0XG4gKiBAcHJvcGVydHkge251bWJlcn0gbnVtUHJvcGVydGllc0xpbWl0XG4gKiBAcHJvcGVydHkge251bWJlcn0gcHJvcGVydHlOYW1lTGVuZ3RoTGltaXRcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBhcnJheUxlbmd0aExpbWl0XG4gKiBAcHJvcGVydHkge251bWJlcn0gbnVtU2V0RWxlbWVudHNMaW1pdFxuICogQHByb3BlcnR5IHtudW1iZXJ9IG51bVVuaXF1ZUJhZ0VsZW1lbnRzTGltaXRcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBudW1NYXBFbnRyaWVzTGltaXRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtQYXJ0aWFsPEFsbExpbWl0cz59IExpbWl0c1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gTWF0Y2hlck5hbWVzcGFjZVxuICogQHByb3BlcnR5IHsoKSA9PiBNYXRjaGVyfSBhbnlcbiAqIE1hdGNoZXMgYW55IHBhc3NhYmxlXG4gKiBAcHJvcGVydHkgeyguLi5wYXR0czogUGF0dGVybltdKSA9PiBNYXRjaGVyfSBhbmRcbiAqIE9ubHkgaWYgaXQgbWF0Y2hlcyBhbGwgdGhlIHN1Yi1wYXR0ZXJuc1xuICogQHByb3BlcnR5IHsoLi4ucGF0dHM6IFBhdHRlcm5bXSkgPT4gTWF0Y2hlcn0gb3JcbiAqIE9ubHkgaWYgaXQgbWF0Y2hlcyBhdCBsZWFzdCBvbmUgc3ViUGF0dGVyblxuICogQHByb3BlcnR5IHsoc3ViUGF0dDogUGF0dGVybikgPT4gTWF0Y2hlcn0gbm90XG4gKiBPbmx5IGlmIGl0IGRvZXMgbm90IG1hdGNoIHRoZSBzdWItcGF0dGVyblxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gTWF0Y2hlcn0gc2NhbGFyXG4gKiBUaGUgc2NhbGFycyBhcmUgdGhlIHByaW1pdGl2ZSB2YWx1ZXMgYW5kIFJlbW90YWJsZXMuXG4gKiBBbGwgc2NhbGFycyBhcmUga2V5cy5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gTWF0Y2hlcn0ga2V5XG4gKiBDYW4gYmUgaW4gYSBjb3B5U2V0IG9yIENvcHlCYWcsIG9yIHRoZSBrZXkgaW4gYSBDb3B5TWFwLlxuICogKFdpbGwgZXZlbnR1YWxseSBiZSBhYmxlIHRvIGEga2V5IGlzIGEgTWFwU3RvcmUuKVxuICogQWxsIGtleXMgYXJlIHBhdHRlcm5zIHRoYXQgbWF0Y2ggb25seSB0aGVtc2VsdmVzLlxuICogQHByb3BlcnR5IHsoKSA9PiBNYXRjaGVyfSBwYXR0ZXJuXG4gKiBJZiBpdCBtYXRjaGVzIE0ucGF0dGVybigpLCB0aGUgaXQgaXMgaXRzZWxmIGEgcGF0dGVybiB1c2VkXG4gKiB0byBtYXRjaCBvdGhlciBwYXNzYWJsZXMuIEEgcGF0dGVybiBjYW5ub3QgY29udGFpbiBlcnJvcnNcbiAqIG9yIHByb21pc2VzLCBhcyB0aGVzZSBhcmUgbm90IHN0YWJsZSBlbm91Z2ggdG8gdXNlZnVsbHkgbWF0Y2guXG4gKiBAcHJvcGVydHkgeyhraW5kOiBzdHJpbmcpID0+IE1hdGNoZXJ9IGtpbmRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gTWF0Y2hlcn0gYm9vbGVhblxuICogQHByb3BlcnR5IHsoKSA9PiBNYXRjaGVyfSBudW1iZXIgT25seSBmbG9hdGluZyBwb2ludCBudW1iZXJzXG4gKiBAcHJvcGVydHkgeyhsaW1pdHM/OiBMaW1pdHMpID0+IE1hdGNoZXJ9IGJpZ2ludFxuICogQHByb3BlcnR5IHsobGltaXRzPzogTGltaXRzKSA9PiBNYXRjaGVyfSBuYXRcbiAqIEBwcm9wZXJ0eSB7KGxpbWl0cz86IExpbWl0cykgPT4gTWF0Y2hlcn0gc3RyaW5nXG4gKiBAcHJvcGVydHkgeyhsaW1pdHM/OiBMaW1pdHMpID0+IE1hdGNoZXJ9IHN5bWJvbFxuICogT25seSByZWdpc3RlcmVkIGFuZCB3ZWxsLWtub3duIHN5bWJvbHMgYXJlIHBhc3NhYmxlXG4gKiBAcHJvcGVydHkgeyhsaW1pdHM/OiBMaW1pdHMpID0+IE1hdGNoZXJ9IHJlY29yZCBBIENvcHlSZWNvcmRcbiAqIEBwcm9wZXJ0eSB7KGxpbWl0cz86IExpbWl0cykgPT4gTWF0Y2hlcn0gYXJyYXkgQSBDb3B5QXJyYXlcbiAqIEBwcm9wZXJ0eSB7KGxpbWl0cz86IExpbWl0cykgPT4gTWF0Y2hlcn0gc2V0IEEgQ29weVNldFxuICogQHByb3BlcnR5IHsobGltaXRzPzogTGltaXRzKSA9PiBNYXRjaGVyfSBiYWcgQSBDb3B5QmFnXG4gKiBAcHJvcGVydHkgeyhsaW1pdHM/OiBMaW1pdHMpID0+IE1hdGNoZXJ9IG1hcCBBIENvcHlNYXBcbiAqIEBwcm9wZXJ0eSB7KGxhYmVsPzogc3RyaW5nKSA9PiBNYXRjaGVyfSByZW1vdGFibGVcbiAqIEEgZmFyIG9iamVjdCBvciBpdHMgcmVtb3RlIHByZXNlbmNlLiBUaGUgb3B0aW9uYWwgYGxhYmVsYCBpcyBwdXJlbHkgZm9yXG4gKiBkaWFnbm9zdGljIHB1cnBvc2UuIEl0IGRvZXMgbm90IGVuZm9yY2UgYW55IGNvbnN0cmFpbnQgYmV5b25kIHRoZVxuICogbXVzdC1iZS1hLXJlbW90YWJsZSBjb25zdHJhaW50LlxuICogQHByb3BlcnR5IHsoKSA9PiBNYXRjaGVyfSBlcnJvclxuICogRXJyb3Igb2JqZWN0cyBhcmUgcGFzc2FibGUsIGJ1dCBhcmUgbmVpdGhlciBrZXlzIG5vciBzeW1ib2xzLlxuICogVGhleSBkbyBub3QgaGF2ZSBhIHVzZWZ1bCBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gTWF0Y2hlcn0gcHJvbWlzZVxuICogUHJvbWlzZXMgYXJlIHBhc3NhYmxlLCBidXQgYXJlIG5laXRoZXIga2V5cyBub3Igc3ltYm9scy5cbiAqIFRoZXkgZG8gbm90IGhhdmUgYSB1c2VmdWwgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkgeygpID0+IE1hdGNoZXJ9IHVuZGVmaW5lZFxuICogQWxsIGtleXMgaW5jbHVkaW5nIGB1bmRlZmluZWRgIGFyZSBhbHJlYWR5IHZhbGlkIHBhdHRlcm5zIGFuZFxuICogc28gY2FuIHZhbGlkbHkgcmVwcmVzZW50IHRoZW1zZWx2ZXMuIEJ1dCBvcHRpb25hbCBwYXR0ZXJuIGFyZ3VtZW50c1xuICogYChwYXR0ZXJuID0gdW5kZWZpbmVkKSA9PiAuLi5gXG4gKiBjYW5ub3QgZGlzdGluZ3Vpc2ggYmV0d2VlbiBgdW5kZWZpbmVkYCBwYXNzZWQgYXMgYSBwYXR0ZXJuIHZzXG4gKiBvbWlzc2lvbiBvZiB0aGUgYXJndW1lbnQuIEl0IHdpbGwgaW50ZXJwcmV0IHRoZSBmaXJzdCBhcyB0aGVcbiAqIHNlY29uZC4gVGh1cywgd2hlbiBhIHBhc3NlZCBwYXR0ZXJuIGRvZXMgbm90IGFsc28gbmVlZCB0byBiZSBhIGtleSxcbiAqIHdlIHJlY29tbWVuZCBwYXNzaW5nIGBNLnVuZGVmaW5lZCgpYCBpbnN0ZWFkIG9mIGB1bmRlZmluZWRgLlxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gbnVsbH0gbnVsbFxuICpcbiAqIEBwcm9wZXJ0eSB7KHJpZ2h0T3BlcmFuZCA6S2V5KSA9PiBNYXRjaGVyfSBsdFxuICogTWF0Y2hlcyBpZiA8IHRoZSByaWdodCBvcGVyYW5kIGJ5IGNvbXBhcmVLZXlzXG4gKiBAcHJvcGVydHkgeyhyaWdodE9wZXJhbmQgOktleSkgPT4gTWF0Y2hlcn0gbHRlXG4gKiBNYXRjaGVzIGlmIDw9IHRoZSByaWdodCBvcGVyYW5kIGJ5IGNvbXBhcmVLZXlzXG4gKiBAcHJvcGVydHkgeyhrZXkgOktleSkgPT4gTWF0Y2hlcn0gZXFcbiAqIEBwcm9wZXJ0eSB7KGtleSA6S2V5KSA9PiBNYXRjaGVyfSBuZXFcbiAqIEBwcm9wZXJ0eSB7KHJpZ2h0T3BlcmFuZCA6S2V5KSA9PiBNYXRjaGVyfSBndGVcbiAqIE1hdGNoZXMgaWYgPj0gdGhlIHJpZ2h0IG9wZXJhbmQgYnkgY29tcGFyZUtleXNcbiAqIEBwcm9wZXJ0eSB7KHJpZ2h0T3BlcmFuZCA6S2V5KSA9PiBNYXRjaGVyfSBndFxuICogTWF0Y2hlcyBpZiA+IHRoZSByaWdodCBvcGVyYW5kIGJ5IGNvbXBhcmVLZXlzXG4gKlxuICogQHByb3BlcnR5IHsoc3ViUGF0dD86IFBhdHRlcm4sIGxpbWl0cz86IExpbWl0cykgPT4gTWF0Y2hlcn0gYXJyYXlPZlxuICogQHByb3BlcnR5IHsoa2V5UGF0dD86IFBhdHRlcm4sXG4gKiAgICAgICAgICAgICB2YWx1ZVBhdHQ/OiBQYXR0ZXJuLFxuICogICAgICAgICAgICAgbGltaXRzPzogTGltaXRzXG4gKiApID0+IE1hdGNoZXJ9IHJlY29yZE9mXG4gKiBAcHJvcGVydHkgeyhrZXlQYXR0PzogUGF0dGVybiwgbGltaXRzPzogTGltaXRzKSA9PiBNYXRjaGVyfSBzZXRPZlxuICogQHByb3BlcnR5IHsoa2V5UGF0dD86IFBhdHRlcm4sXG4gKiAgICAgICAgICAgICBjb3VudFBhdHQ/OiBQYXR0ZXJuLFxuICogICAgICAgICAgICAgbGltaXRzPzogTGltaXRzXG4gKiApID0+IE1hdGNoZXJ9IGJhZ09mXG4gKiBQYXJhbWV0ZXJpemVkIGJ5IGEga2V5UGF0dCB0aGF0IGlzIG1hdGNoZWQgYWdhaW5zdCBldmVyeSBlbGVtZW50IG9mIHRoZVxuICogYWJzdHJhY3QgYmFnLiBJbiB0ZXJtcyBvZiB0aGUgYmFnIHJlcHJlc2VudGF0aW9uLCBpdCBpcyBtYXRjaGVkIGFnYWluc3RcbiAqIHRoZSBmaXJzdCBlbGVtZW50IG9mIGVhY2ggcGFpci4gSWYgdGhlIHNlY29uZCBgY291bnRQYXR0YCBpcyBwcm92aWRlZCxcbiAqIGl0IGlzIG1hdGNoZWQgYWdhaW5zdCB0aGUgY2FyZGluYWxpdHkgb2YgZWFjaCBlbGVtZW50LiBUaGUgYGNvdW50UGF0dGBcbiAqIGlzIHJhcmVseSBleHBlY3RlZCB0byBiZSB1c2VmdWwsIGJ1dCBpcyBwcm92aWRlZCB0byBtaW5pbWl6ZSBzdXJwcmlzZS5cbiAqIEBwcm9wZXJ0eSB7KGtleVBhdHQ/OiBQYXR0ZXJuLFxuICogICAgICAgICAgICAgdmFsdWVQYXR0PzogUGF0dGVybixcbiAqICAgICAgICAgICAgIGxpbWl0cz86IExpbWl0c1xuICogKSA9PiBNYXRjaGVyfSBtYXBPZlxuICogQHByb3BlcnR5IHsoYmFzZTogQ29weVJlY29yZDwqPiB8IENvcHlBcnJheTwqPixcbiAqICAgICAgICAgICAgIHJlc3Q/OiBQYXR0ZXJuLFxuICogKSA9PiBNYXRjaGVyfSBzcGxpdFxuICogQW4gYXJyYXkgb3IgcmVjb3JkIGlzIHNwbGl0IGludG8gdGhlIGZpcnN0IHBhcnQgdGhhdCBtYXRjaGVzIHRoZVxuICogYmFzZSBwYXR0ZXJuLCBhbmQgdGhlIHJlbWFpbmRlciwgd2hpY2ggbWF0Y2hlcyBhZ2FpbnN0IHRoZSBvcHRpb25hbFxuICogcmVzdCBwYXR0ZXJuIGlmIHByZXNlbnQuXG4gKiBAcHJvcGVydHkgeyhiYXNlOiBDb3B5UmVjb3JkPCo+IHwgQ29weUFycmF5PCo+LFxuICogICAgICAgICAgICAgcmVzdD86IFBhdHRlcm4sXG4gKiApID0+IE1hdGNoZXJ9IHBhcnRpYWxcbiAqIEFuIGFycmF5IG9yIHJlY29yZCBpcyBzcGxpdCBpbnRvIHRoZSBmaXJzdCBwYXJ0IHRoYXQgbWF0Y2hlcyB0aGVcbiAqIGJhc2UgcGF0dGVybiwgYW5kIHRoZSByZW1haW5kZXIsIHdoaWNoIG1hdGNoZXMgYWdhaW5zdCB0aGUgb3B0aW9uYWxcbiAqIHJlc3QgcGF0dGVybiBpZiBwcmVzZW50LlxuICogVW5saWtlIGBNLnNwbGl0YCwgYE0ucGFydGlhbGAgaWdub3JlcyBwcm9wZXJ0aWVzIG9uIHRoZSBiYXNlXG4gKiBwYXR0ZXJuIHRoYXQgYXJlIG5vdCBwcmVzZW50IG9uIHRoZSBzcGVjaW1lbi5cbiAqXG4gKiBAcHJvcGVydHkgeyh0OiBQYXR0ZXJuKSA9PiBQYXR0ZXJufSBlcmVmXG4gKiBAcHJvcGVydHkgeyh0OiBQYXR0ZXJuKSA9PiBQYXR0ZXJufSBvcHRcbiAqXG4gKiBAcHJvcGVydHkgezxNIGV4dGVuZHMgUmVjb3JkPGFueSwgYW55Pj4oaW50ZXJmYWNlTmFtZTogc3RyaW5nLFxuICogICAgICAgICAgICAgbWV0aG9kR3VhcmRzOiBNLFxuICogICAgICAgICAgICAgb3B0aW9ucz86IHtzbG9wcHk/OiBib29sZWFufVxuICogKSA9PiBJbnRlcmZhY2VHdWFyZH0gaW50ZXJmYWNlXG4gKiBAcHJvcGVydHkgeyguLi5hcmdHdWFyZHM6IEFyZ0d1YXJkW10pID0+IE1ldGhvZEd1YXJkTWFrZXJ9IGNhbGxcbiAqIEBwcm9wZXJ0eSB7KC4uLmFyZ0d1YXJkczogQXJnR3VhcmRbXSkgPT4gTWV0aG9kR3VhcmRNYWtlcn0gY2FsbFdoZW5cbiAqXG4gKiBAcHJvcGVydHkgeyhhcmdHdWFyZDogQXJnR3VhcmQpID0+IEFyZ0d1YXJkfSBhd2FpdFxuICovXG5cbi8qKiBAdHlwZWRlZiB7KC4uLmFyZ3M6IGFueVtdKSA9PiBhbnl9IE1ldGhvZCAqL1xuXG4vKiBUT0RPIHBhcmFtZXRlcml6ZSB0aGlzIHRvIG1hdGNoIHRoZSBiZWhhdmlvciBvYmplY3QgaXQgZ3VhcmRzKi9cbi8qKlxuICogQHR5cGVkZWYge3tcbiAqIGtsYXNzOiAnSW50ZXJmYWNlJyxcbiAqIGludGVyZmFjZU5hbWU6IHN0cmluZyxcbiAqIG1ldGhvZEd1YXJkczogUmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgTWV0aG9kR3VhcmQ+XG4gKiBzbG9wcHk/OiBib29sZWFuXG4gKiB9fSBJbnRlcmZhY2VHdWFyZFxuICovXG5cbi8qKiBAdHlwZWRlZiB7YW55fSBNZXRob2RHdWFyZE1ha2VyICovXG4vKiogQHR5cGVkZWYge3sga2xhc3M6ICdtZXRob2RHdWFyZCcsIGNhbGxLaW5kOiAnc3luYycgfCAnYXN5bmMnLCByZXR1cm5HdWFyZDogdW5rbm93biB9fSBNZXRob2RHdWFyZCAqL1xuLyoqIEB0eXBlZGVmIHthbnl9IEFyZ0d1YXJkICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUGF0dGVybktpdFxuICogQHByb3BlcnR5IHsoc3BlY2ltZW46IFBhc3NhYmxlLFxuICogICAgICAgICAgICAgcGF0dDogUGFzc2FibGUsXG4gKiAgICAgICAgICAgICBjaGVjazogQ2hlY2tlcixcbiAqICAgICAgICAgICAgIGxhYmVsPzogc3RyaW5nfG51bWJlclxuICogKSA9PiBib29sZWFufSBjaGVja01hdGNoZXNcbiAqIEBwcm9wZXJ0eSB7KHNwZWNpbWVuOiBQYXNzYWJsZSwgcGF0dDogUGF0dGVybikgPT4gYm9vbGVhbn0gbWF0Y2hlc1xuICogQHByb3BlcnR5IHsoc3BlY2ltZW46IFBhc3NhYmxlLCBwYXR0OiBQYXR0ZXJuLCBsYWJlbD86IHN0cmluZ3xudW1iZXIpID0+IHZvaWR9IGZpdFxuICogQHByb3BlcnR5IHsocGF0dDogUGF0dGVybikgPT4gdm9pZH0gYXNzZXJ0UGF0dGVyblxuICogQHByb3BlcnR5IHsocGF0dDogUGFzc2FibGUpID0+IGJvb2xlYW59IGlzUGF0dGVyblxuICogQHByb3BlcnR5IHsocGF0dDogUGF0dGVybikgPT4gdm9pZH0gYXNzZXJ0S2V5UGF0dGVyblxuICogQHByb3BlcnR5IHsocGF0dDogUGFzc2FibGUpID0+IGJvb2xlYW59IGlzS2V5UGF0dGVyblxuICogQHByb3BlcnR5IHtHZXRSYW5rQ292ZXJ9IGdldFJhbmtDb3ZlclxuICogQHByb3BlcnR5IHtNYXRjaGVyTmFtZXNwYWNlfSBNXG4gKi9cblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiBUT0RPKi9cbi8qIFRoZSBmb2xsb3dpbmcgdHlwZSBzaG91bGQgYmUgaW4gaW50ZXJuYWwtdHlwZXMuanMsIHNpbmNlIHRoZSovXG4vKiBgTWF0Y2hIZWxwZXJgIHR5cGUgaXMgcHVyZWx5IGludGVybmFsIHRvIHRoaXMgcGFja2FnZS4gSG93ZXZlciwqL1xuLyogaW4gb3JkZXIgdG8gZ2V0IHRoZSBnb3Zlcm5hbmNlIGFuZCBzb2xvIHBhY2thZ2VzIGJvdGggdG8gcGFzcyBsaW50LCovXG4vKiBJIG1vdmVkIHRoZSB0eXBlIGRlY2xhcmF0aW9uIGl0c2VsZiB0byB0eXBlcy5qcy4gU2VlIHRoZSBjb21tZW50cyBpbiovXG4vKiBpbiBpbnRlcm5hbC10eXBlcy5qcyBhbmQgZXhwb3J0cy5qcyovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gTWF0Y2hIZWxwZXJcbiAqIFRoaXMgZmFjdG9ycyBvdXQgb25seSB0aGUgcGFydHMgc3BlY2lmaWMgdG8gZWFjaCBraW5kIG9mIE1hdGNoZXIuIEl0IGlzXG4gKiBlbmNhcHN1bGF0ZWQsIGFuZCBpdHMgbWV0aG9kcyBjYW4gbWFrZSB0aGUgc3RhdGVkIHVuY2hlY2tlciBhc3N1bXB0aW9uc1xuICogZW5mb3JjZWQgYnkgdGhlIGNvbW1vbiBjYWxsaW5nIGxvZ2ljLlxuICpcbiAqIEBwcm9wZXJ0eSB7KGFsbGVnZWRQYXlsb2FkOiBQYXNzYWJsZSxcbiAqICAgICAgICAgICAgIGNoZWNrOiBDaGVja2VyXG4gKiApID0+IGJvb2xlYW59IGNoZWNrSXNXZWxsRm9ybWVkXG4gKiBBc3N1bWVzIHRoaXMgaXMgdGhlIHBheWxvYWQgb2YgYSBDb3B5VGFnZ2VkIHdpdGggdGhlIGNvcnJlc3BvbmRpbmdcbiAqIG1hdGNoVGFnLiBJcyB0aGlzIGEgdmFsaWQgcGF5bG9hZCBmb3IgYSBNYXRjaGVyIHdpdGggdGhhdCB0YWc/XG4gKlxuICogQHByb3BlcnR5IHsoc3BlY2ltZW46IFBhc3NhYmxlLFxuICogICAgICAgICAgICAgbWF0Y2hlclBheWxvYWQ6IFBhc3NhYmxlLFxuICogICAgICAgICAgICAgY2hlY2s6IENoZWNrZXIsXG4gKiApID0+IGJvb2xlYW59IGNoZWNrTWF0Y2hlc1xuICogQXNzdW1pbmcgYSB2YWxpZCBNYXRjaGVyIG9mIHRoaXMgdHlwZSB3aXRoIGBtYXRjaGVyUGF5bG9hZGAgYXMgaXRzXG4gKiBwYXlsb2FkLCBkb2VzIHRoaXMgc3BlY2ltZW4gbWF0Y2ggdGhhdCBNYXRjaGVyP1xuICpcbiAqIEBwcm9wZXJ0eSB7KFxuICogICBwYXlsb2FkOiBQYXNzYWJsZSxcbiAqICAgZW5jb2RlUGFzc2FibGU6IEtleVRvREJLZXlcbiAqICkgPT4gUmFua0NvdmVyfSBnZXRSYW5rQ292ZXJcbiAqIEFzc3VtZXMgdGhpcyBpcyB0aGUgcGF5bG9hZCBvZiBhIENvcHlUYWdnZWQgd2l0aCB0aGUgY29ycmVzcG9uZGluZ1xuICogbWF0Y2hUYWcuIFJldHVybiBhIFJhbmtDb3ZlciB0byBib3VuZCBmcm9tIGJlbG93IGFuZCBhYm92ZSxcbiAqIGluIHJhbmsgb3JkZXIsIGFsbCBwb3NzaWJsZSBQYXNzYWJsZXMgdGhhdCB3b3VsZCBtYXRjaCB0aGlzIE1hdGNoZXIuXG4gKiBUaGUgbGVmdCBlbGVtZW50IG11c3QgYmUgYmVmb3JlIG9yIHRoZSBzYW1lIHJhbmsgYXMgYW55IHBvc3NpYmxlXG4gKiBtYXRjaGluZyBzcGVjaW1lbi4gVGhlIHJpZ2h0IGVsZW1lbnQgbXVzdCBiZSBhZnRlciBvciB0aGUgc2FtZVxuICogcmFuayBhcyBhbnkgcG9zc2libGUgbWF0Y2hpbmcgc3BlY2ltZW4uXG4gKlxuICogQHByb3BlcnR5IHsoYWxsZWdlZFBhdHRlcm46IFBhc3NhYmxlLFxuICogICAgICAgICAgICAgY2hlY2s6IENoZWNrZXJcbiAqICkgPT4gYm9vbGVhbn0gY2hlY2tLZXlQYXR0ZXJuXG4gKiBBc3N1bWVzIHRoaXMgaXMgdGhlIHBheWxvYWQgb2YgYSBDb3B5VGFnZ2VkIHdpdGggdGhlIGNvcnJlc3BvbmRpbmdcbiAqIG1hdGNoVGFnLiBJcyB0aGlzIGEgdmFsaWQgcGF0dGVybiBmb3IgdXNlIGFzIGEgcXVlcnkga2V5IG9yIGtleSBzaGFwZT9cbiAqL1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA/tfXZUgEAAFIBAAAoAAAAQGFnb3JpYy9zd2luZ3NldC12YXQtdjAuMzEuMC9leHBvcnRlZC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9zcmMvdmF0cy90aW1lci90eXBlc1wiLz4qL1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADfXiyK1wYAANcGAAA5AAAAQGFnb3JpYy9zd2luZ3NldC12YXQtdjAuMzEuMC9zcmMvdmF0cy90aW1lci90eXBlR3VhcmRzLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvc3RvcmUiXSwiZXhwb3J0cyI6WyJSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSIsIlJlbGF0aXZlVGltZVNoYXBlIiwiUmVsYXRpdmVUaW1lVmFsdWVTaGFwZSIsIlRpbWVyQnJhbmRTaGFwZSIsIlRpbWVzdGFtcFJlY29yZFNoYXBlIiwiVGltZXN0YW1wU2hhcGUiLCJUaW1lc3RhbXBWYWx1ZVNoYXBlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IE07JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiTVwiLCBbJGjigI1fYSA9PiAoTSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5jb25zdCAgICAgICAgVGltZXJCcmFuZFNoYXBlPU0ucmVtb3RhYmxlKCk7JGjigI1fb25jZS5UaW1lckJyYW5kU2hhcGUoVGltZXJCcmFuZFNoYXBlKTtcbmNvbnN0ICAgICAgICBUaW1lc3RhbXBWYWx1ZVNoYXBlPU0ubmF0KCk7JGjigI1fb25jZS5UaW1lc3RhbXBWYWx1ZVNoYXBlKFRpbWVzdGFtcFZhbHVlU2hhcGUpO1xuY29uc3QgICAgICAgIFJlbGF0aXZlVGltZVZhbHVlU2hhcGU9TS5uYXQoKTsvKiBTaG91bGQgd2UgYWxsb3cgbmVnYXRpdmVzPyovJGjigI1fb25jZS5SZWxhdGl2ZVRpbWVWYWx1ZVNoYXBlKFJlbGF0aXZlVGltZVZhbHVlU2hhcGUpO1xuXG5jb25zdCAgICAgICAgVGltZXN0YW1wUmVjb3JkU2hhcGU9aGFyZGVuKHtcbnRpbWVyQnJhbmQ6VGltZXJCcmFuZFNoYXBlLFxuYWJzVmFsdWU6VGltZXN0YW1wVmFsdWVTaGFwZX0pOyRo4oCNX29uY2UuVGltZXN0YW1wUmVjb3JkU2hhcGUoVGltZXN0YW1wUmVjb3JkU2hhcGUpO1xuXG5cbmNvbnN0ICAgICAgICBSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZT1oYXJkZW4oe1xudGltZXJCcmFuZDpUaW1lckJyYW5kU2hhcGUsXG5yZWxWYWx1ZTpSZWxhdGl2ZVRpbWVWYWx1ZVNoYXBlfSk7JGjigI1fb25jZS5SZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZShSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSk7XG5cblxuY29uc3QgICAgICAgIFRpbWVzdGFtcFNoYXBlPU0ub3IoVGltZXN0YW1wUmVjb3JkU2hhcGUsVGltZXN0YW1wVmFsdWVTaGFwZSk7JGjigI1fb25jZS5UaW1lc3RhbXBTaGFwZShUaW1lc3RhbXBTaGFwZSk7XG5jb25zdCAgICAgICAgUmVsYXRpdmVUaW1lU2hhcGU9TS5vcihcblJlbGF0aXZlVGltZVJlY29yZFNoYXBlLFxuUmVsYXRpdmVUaW1lVmFsdWVTaGFwZSk7JGjigI1fb25jZS5SZWxhdGl2ZVRpbWVTaGFwZShSZWxhdGl2ZVRpbWVTaGFwZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiVGltZXJCcmFuZFNoYXBlIjpbIlRpbWVyQnJhbmRTaGFwZSJdLCJUaW1lc3RhbXBWYWx1ZVNoYXBlIjpbIlRpbWVzdGFtcFZhbHVlU2hhcGUiXSwiUmVsYXRpdmVUaW1lVmFsdWVTaGFwZSI6WyJSZWxhdGl2ZVRpbWVWYWx1ZVNoYXBlIl0sIlRpbWVzdGFtcFJlY29yZFNoYXBlIjpbIlRpbWVzdGFtcFJlY29yZFNoYXBlIl0sIlJlbGF0aXZlVGltZVJlY29yZFNoYXBlIjpbIlJlbGF0aXZlVGltZVJlY29yZFNoYXBlIl0sIlRpbWVzdGFtcFNoYXBlIjpbIlRpbWVzdGFtcFNoYXBlIl0sIlJlbGF0aXZlVGltZVNoYXBlIjpbIlJlbGF0aXZlVGltZVNoYXBlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEOjYdqzHgAAsx4AAC4AAABAYWdvcmljL3ZhdC1kYXRhLXYwLjQuNS9zcmMvZmFyLWNsYXNzLXV0aWxzLmpzeyJpbXBvcnRzIjpbIi4va2luZC11dGlscy5qcyIsIi4vdmF0LWRhdGEtYmluZGluZ3MuanMiLCJAYWdvcmljL3N0b3JlIl0sImV4cG9ydHMiOlsiZGVmaW5lRHVyYWJsZUZhckNsYXNzIiwiZGVmaW5lRHVyYWJsZUZhckNsYXNzS2l0IiwiZGVmaW5lVmlydHVhbEZhckNsYXNzIiwiZGVmaW5lVmlydHVhbEZhckNsYXNzS2l0Iiwidml2aWZ5RmFyQ2xhc3MiLCJ2aXZpZnlGYXJDbGFzc0tpdCIsInZpdmlmeUZhckluc3RhbmNlIiwidml2aWZ5U2luZ2xldG9uIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGluaXRFbXB0eSxwcm92aWRlS2luZEhhbmRsZSxkZWZpbmVLaW5kLGRlZmluZUtpbmRNdWx0aSxkZWZpbmVEdXJhYmxlS2luZCxkZWZpbmVEdXJhYmxlS2luZE11bHRpLHByb3ZpZGU7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiaW5pdEVtcHR5XCIsIFskaOKAjV9hID0+IChpbml0RW1wdHkgPSAkaOKAjV9hKV1dXV0sW1wiLi9raW5kLXV0aWxzLmpzXCIsIFtbXCJwcm92aWRlS2luZEhhbmRsZVwiLCBbJGjigI1fYSA9PiAocHJvdmlkZUtpbmRIYW5kbGUgPSAkaOKAjV9hKV1dXV0sW1wiLi92YXQtZGF0YS1iaW5kaW5ncy5qc1wiLCBbW1wiZGVmaW5lS2luZFwiLCBbJGjigI1fYSA9PiAoZGVmaW5lS2luZCA9ICRo4oCNX2EpXV0sW1wiZGVmaW5lS2luZE11bHRpXCIsIFskaOKAjV9hID0+IChkZWZpbmVLaW5kTXVsdGkgPSAkaOKAjV9hKV1dLFtcImRlZmluZUR1cmFibGVLaW5kXCIsIFskaOKAjV9hID0+IChkZWZpbmVEdXJhYmxlS2luZCA9ICRo4oCNX2EpXV0sW1wiZGVmaW5lRHVyYWJsZUtpbmRNdWx0aVwiLCBbJGjigI1fYSA9PiAoZGVmaW5lRHVyYWJsZUtpbmRNdWx0aSA9ICRo4oCNX2EpXV0sW1wicHJvdmlkZVwiLCBbJGjigI1fYSA9PiAocHJvdmlkZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHRlbXBsYXRlIEwsUiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vZXZlbnR1YWwtc2VuZCcpLlJlbW90YWJsZUJyYW5kPEwsIFI+fSBSZW1vdGFibGVCcmFuZCAqL1xuLyoqIEB0ZW1wbGF0ZSBUIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9ldmVudHVhbC1zZW5kJykuRVJlZjxUPn0gRVJlZiAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQmFnZ2FnZX0gQmFnZ2FnZSAqL1xuLyoqIEB0ZW1wbGF0ZSBUIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuRGVmaW5lS2luZE9wdGlvbnM8VD59IERlZmluZUtpbmRPcHRpb25zICovXG4vKiogQHRlbXBsYXRlIFQgQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5LaW5kRmFjZXQ8VD59IEtpbmRGYWNldCAqL1xuLyoqIEB0ZW1wbGF0ZSBUIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuS2luZEZhY2V0czxUPn0gS2luZEZhY2V0cyAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuRHVyYWJsZUtpbmRIYW5kbGV9IER1cmFibGVLaW5kSGFuZGxlICovXG5cbi8qIFRPRE8gaW50ZXJmYWNlR3VhcmQgdHlwZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzYyMDYqL1xuLyoqXG4gKiBAdGVtcGxhdGUgQSxTLFRcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEBwYXJhbSB7YW55fSBpbnRlcmZhY2VHdWFyZFxuICogQHBhcmFtIHsoLi4uYXJnczogQVtdKSA9PiBTfSBpbml0XG4gKiBAcGFyYW0ge1R9IG1ldGhvZHNcbiAqIEBwYXJhbSB7RGVmaW5lS2luZE9wdGlvbnM8dW5rbm93bj59IFtvcHRpb25zXVxuICogQHJldHVybnMgeyguLi5hcmdzOiBBW10pID0+IChUICYgUmVtb3RhYmxlQnJhbmQ8e30sIFQ+KX1cbiAqL1xuY29uc3QgICAgICAgIGRlZmluZVZpcnR1YWxGYXJDbGFzcz0oXG50YWcsXG5pbnRlcmZhY2VHdWFyZCxcbmluaXQsXG5tZXRob2RzLFxub3B0aW9ucyk9PlxuXG4vKiBAdHMtZXhwZWN0LWVycm9yIFRoZSB1c2Ugb2YgYHRoaXNmdWxNZXRob2RzYCB0byBjaGFuZ2UqL1xuLyogdGhlIGFwcHJvcHJpYXRlIHN0YXRpYyB0eXBlIGlzIHRoZSB3aG9sZSBwb2ludCBvZiB0aGlzIG1ldGhvZC4qL1xuZGVmaW5lS2luZCh0YWcsaW5pdCxtZXRob2RzLHtcbi4uLm9wdGlvbnMsXG50aGlzZnVsTWV0aG9kczp0cnVlLFxuaW50ZXJmYWNlR3VhcmR9KTskaOKAjV9vbmNlLmRlZmluZVZpcnR1YWxGYXJDbGFzcyhkZWZpbmVWaXJ0dWFsRmFyQ2xhc3MpO1xuXG5oYXJkZW4oZGVmaW5lVmlydHVhbEZhckNsYXNzKTtcblxuLyogVE9ETyBpbnRlcmZhY2VHdWFyZCB0eXBlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNjIwNiovXG4vKipcbiAqIEB0ZW1wbGF0ZSBBLFMsVFxuICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICogQHBhcmFtIHthbnl9IGludGVyZmFjZUd1YXJkS2l0XG4gKiBAcGFyYW0geyguLi5hcmdzOiBBW10pID0+IFN9IGluaXRcbiAqIEBwYXJhbSB7VH0gZmFjZXRzXG4gKiBAcGFyYW0ge0RlZmluZUtpbmRPcHRpb25zPHVua25vd24+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHsoLi4uYXJnczogQVtdKSA9PiAoVCAmIFJlbW90YWJsZUJyYW5kPHt9LCBUPil9XG4gKi9cbmNvbnN0ICAgICAgICBkZWZpbmVWaXJ0dWFsRmFyQ2xhc3NLaXQ9KFxudGFnLFxuaW50ZXJmYWNlR3VhcmRLaXQsXG5pbml0LFxuZmFjZXRzLFxub3B0aW9ucyk9PlxuXG4vKiBAdHMtZXhwZWN0LWVycm9yIFRoZSB1c2Ugb2YgYHRoaXNmdWxNZXRob2RzYCB0byBjaGFuZ2UqL1xuLyogdGhlIGFwcHJvcHJpYXRlIHN0YXRpYyB0eXBlIGlzIHRoZSB3aG9sZSBwb2ludCBvZiB0aGlzIG1ldGhvZC4qL1xuZGVmaW5lS2luZE11bHRpKHRhZyxpbml0LGZhY2V0cyx7XG4uLi5vcHRpb25zLFxudGhpc2Z1bE1ldGhvZHM6dHJ1ZSxcbmludGVyZmFjZUd1YXJkOmludGVyZmFjZUd1YXJkS2l0fSk7JGjigI1fb25jZS5kZWZpbmVWaXJ0dWFsRmFyQ2xhc3NLaXQoZGVmaW5lVmlydHVhbEZhckNsYXNzS2l0KTtcblxuaGFyZGVuKGRlZmluZVZpcnR1YWxGYXJDbGFzc0tpdCk7XG5cbi8qIFRPRE8gaW50ZXJmYWNlR3VhcmQgdHlwZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzYyMDYqL1xuLyoqXG4gKiBAdGVtcGxhdGUgQSxTLFRcbiAqIEBwYXJhbSB7RHVyYWJsZUtpbmRIYW5kbGV9IGtpbmRIYW5kbGVcbiAqIEBwYXJhbSB7YW55fSBpbnRlcmZhY2VHdWFyZFxuICogQHBhcmFtIHsoLi4uYXJnczogQVtdKSA9PiBTfSBpbml0XG4gKiBAcGFyYW0ge1R9IG1ldGhvZHNcbiAqIEBwYXJhbSB7RGVmaW5lS2luZE9wdGlvbnM8dW5rbm93bj59IFtvcHRpb25zXVxuICogQHJldHVybnMgeyguLi5hcmdzOiBBW10pID0+IChUICYgUmVtb3RhYmxlQnJhbmQ8e30sIFQ+KX1cbiAqL1xuY29uc3QgICAgICAgIGRlZmluZUR1cmFibGVGYXJDbGFzcz0oXG5raW5kSGFuZGxlLFxuaW50ZXJmYWNlR3VhcmQsXG5pbml0LFxubWV0aG9kcyxcbm9wdGlvbnMpPT5cblxuLyogQHRzLWV4cGVjdC1lcnJvciBUaGUgdXNlIG9mIGB0aGlzZnVsTWV0aG9kc2AgdG8gY2hhbmdlKi9cbi8qIHRoZSBhcHByb3ByaWF0ZSBzdGF0aWMgdHlwZSBpcyB0aGUgd2hvbGUgcG9pbnQgb2YgdGhpcyBtZXRob2QuKi9cbmRlZmluZUR1cmFibGVLaW5kKGtpbmRIYW5kbGUsaW5pdCxtZXRob2RzLHtcbi4uLm9wdGlvbnMsXG50aGlzZnVsTWV0aG9kczp0cnVlLFxuaW50ZXJmYWNlR3VhcmR9KTskaOKAjV9vbmNlLmRlZmluZUR1cmFibGVGYXJDbGFzcyhkZWZpbmVEdXJhYmxlRmFyQ2xhc3MpO1xuXG5oYXJkZW4oZGVmaW5lRHVyYWJsZUZhckNsYXNzKTtcblxuLyogVE9ETyBpbnRlcmZhY2VHdWFyZCB0eXBlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNjIwNiovXG4vKipcbiAqIEB0ZW1wbGF0ZSBBLFMsVFxuICogQHBhcmFtIHtEdXJhYmxlS2luZEhhbmRsZX0ga2luZEhhbmRsZVxuICogQHBhcmFtIHthbnl9IGludGVyZmFjZUd1YXJkS2l0XG4gKiBAcGFyYW0geyguLi5hcmdzOiBBW10pID0+IFN9IGluaXRcbiAqIEBwYXJhbSB7VH0gZmFjZXRzXG4gKiBAcGFyYW0ge0RlZmluZUtpbmRPcHRpb25zPHVua25vd24+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHsoLi4uYXJnczogQVtdKSA9PiAoVCAmIFJlbW90YWJsZUJyYW5kPHt9LCBUPil9XG4gKi9cbmNvbnN0ICAgICAgICBkZWZpbmVEdXJhYmxlRmFyQ2xhc3NLaXQ9KFxua2luZEhhbmRsZSxcbmludGVyZmFjZUd1YXJkS2l0LFxuaW5pdCxcbmZhY2V0cyxcbm9wdGlvbnMpPT5cblxuLyogQHRzLWV4cGVjdC1lcnJvciBUaGUgdXNlIG9mIGB0aGlzZnVsTWV0aG9kc2AgdG8gY2hhbmdlKi9cbi8qIHRoZSBhcHByb3ByaWF0ZSBzdGF0aWMgdHlwZSBpcyB0aGUgd2hvbGUgcG9pbnQgb2YgdGhpcyBtZXRob2QuKi9cbmRlZmluZUR1cmFibGVLaW5kTXVsdGkoa2luZEhhbmRsZSxpbml0LGZhY2V0cyx7XG4uLi5vcHRpb25zLFxudGhpc2Z1bE1ldGhvZHM6dHJ1ZSxcbmludGVyZmFjZUd1YXJkOmludGVyZmFjZUd1YXJkS2l0fSk7JGjigI1fb25jZS5kZWZpbmVEdXJhYmxlRmFyQ2xhc3NLaXQoZGVmaW5lRHVyYWJsZUZhckNsYXNzS2l0KTtcblxuaGFyZGVuKGRlZmluZUR1cmFibGVGYXJDbGFzc0tpdCk7XG5cbi8qIFRPRE8gaW50ZXJmYWNlR3VhcmQgdHlwZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzYyMDYqL1xuLyoqXG4gKiBAdGVtcGxhdGUgQSxTLFRcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IGtpbmROYW1lXG4gKiBAcGFyYW0ge2FueX0gaW50ZXJmYWNlR3VhcmRcbiAqIEBwYXJhbSB7KC4uLmFyZ3M6IEFbXSkgPT4gU30gaW5pdFxuICogQHBhcmFtIHtUfSBtZXRob2RzXG4gKiBAcGFyYW0ge0RlZmluZUtpbmRPcHRpb25zPHVua25vd24+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHsoLi4uYXJnczogQVtdKSA9PiAoVCAmIFJlbW90YWJsZUJyYW5kPHt9LCBUPil9XG4gKi9cbmNvbnN0ICAgICAgICB2aXZpZnlGYXJDbGFzcz0oXG5iYWdnYWdlLFxua2luZE5hbWUsXG5pbnRlcmZhY2VHdWFyZCxcbmluaXQsXG5tZXRob2RzLFxub3B0aW9ucz11bmRlZmluZWQpPT5cblxuZGVmaW5lRHVyYWJsZUZhckNsYXNzKFxucHJvdmlkZUtpbmRIYW5kbGUoYmFnZ2FnZSxraW5kTmFtZSksXG5pbnRlcmZhY2VHdWFyZCxcbmluaXQsXG5tZXRob2RzLFxub3B0aW9ucyk7JGjigI1fb25jZS52aXZpZnlGYXJDbGFzcyh2aXZpZnlGYXJDbGFzcyk7XG5cbmhhcmRlbih2aXZpZnlGYXJDbGFzcyk7XG5cbi8qIFRPRE8gaW50ZXJmYWNlR3VhcmQgdHlwZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzYyMDYqL1xuLyoqXG4gKiBAdGVtcGxhdGUgQSxTLFRcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IGtpbmROYW1lXG4gKiBAcGFyYW0ge2FueX0gaW50ZXJmYWNlR3VhcmRLaXRcbiAqIEBwYXJhbSB7KC4uLmFyZ3M6IEFbXSkgPT4gU30gaW5pdFxuICogQHBhcmFtIHtUfSBmYWNldHNcbiAqIEBwYXJhbSB7RGVmaW5lS2luZE9wdGlvbnM8dW5rbm93bj59IFtvcHRpb25zXVxuICogQHJldHVybnMgeyguLi5hcmdzOiBBW10pID0+IChUICYgUmVtb3RhYmxlQnJhbmQ8e30sIFQ+KX1cbiAqL1xuY29uc3QgICAgICAgIHZpdmlmeUZhckNsYXNzS2l0PShcbmJhZ2dhZ2UsXG5raW5kTmFtZSxcbmludGVyZmFjZUd1YXJkS2l0LFxuaW5pdCxcbmZhY2V0cyxcbm9wdGlvbnM9dW5kZWZpbmVkKT0+XG5cbmRlZmluZUR1cmFibGVGYXJDbGFzc0tpdChcbnByb3ZpZGVLaW5kSGFuZGxlKGJhZ2dhZ2Usa2luZE5hbWUpLFxuaW50ZXJmYWNlR3VhcmRLaXQsXG5pbml0LFxuZmFjZXRzLFxub3B0aW9ucyk7JGjigI1fb25jZS52aXZpZnlGYXJDbGFzc0tpdCh2aXZpZnlGYXJDbGFzc0tpdCk7XG5cbmhhcmRlbih2aXZpZnlGYXJDbGFzc0tpdCk7XG5cbi8qIFRPRE8gaW50ZXJmYWNlR3VhcmQgdHlwZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzYyMDYqL1xuLyoqXG4gKiBAdGVtcGxhdGUgVCxNXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBraW5kTmFtZVxuICogQHBhcmFtIHthbnl9IGludGVyZmFjZUd1YXJkXG4gKiBAcGFyYW0ge019IG1ldGhvZHNcbiAqIEBwYXJhbSB7RGVmaW5lS2luZE9wdGlvbnM8dW5rbm93bj59IFtvcHRpb25zXVxuICogQHJldHVybnMge1QgJiBSZW1vdGFibGVCcmFuZDx7fSwgVD59XG4gKi9cbmNvbnN0ICAgICAgICB2aXZpZnlGYXJJbnN0YW5jZT0oXG5iYWdnYWdlLFxua2luZE5hbWUsXG5pbnRlcmZhY2VHdWFyZCxcbm1ldGhvZHMsXG5vcHRpb25zPXVuZGVmaW5lZCk9Plxue1xuY29uc3QgbWFrZVNpbmdsZXRvbj12aXZpZnlGYXJDbGFzcyhcbmJhZ2dhZ2UsXG5raW5kTmFtZSxcbmludGVyZmFjZUd1YXJkLFxuaW5pdEVtcHR5LFxubWV0aG9kcyxcbm9wdGlvbnMpO1xuXG5cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLXRzLWV4cGVjdC1lcnJvciAtLSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQ2MjAqL1xuLyogQHRzLWlnbm9yZSBjb3VsZCBiZSBpbnN0YW50aWF0ZWQgd2l0aCBhbiBhcmJpdHJhcnkgdHlwZSovXG5yZXR1cm4gcHJvdmlkZShiYWdnYWdlLCBgdGhlXyR7a2luZE5hbWV9YCwoKT0+bWFrZVNpbmdsZXRvbigpKTtcbiB9OyRo4oCNX29uY2Uudml2aWZ5RmFySW5zdGFuY2Uodml2aWZ5RmFySW5zdGFuY2UpO1xuaGFyZGVuKHZpdmlmeUZhckluc3RhbmNlKTtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2Ugdml2aWZ5RmFySW5zdGFuY2UgaW5zdGVhZC5cbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBraW5kTmFtZVxuICogQHBhcmFtIHtUfSBtZXRob2RzXG4gKiBAcGFyYW0ge0RlZmluZUtpbmRPcHRpb25zPHVua25vd24+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtUICYgUmVtb3RhYmxlQnJhbmQ8e30sIFQ+fVxuICovXG5jb25zdCAgICAgICAgdml2aWZ5U2luZ2xldG9uPShcbmJhZ2dhZ2UsXG5raW5kTmFtZSxcbm1ldGhvZHMsXG5vcHRpb25zPXVuZGVmaW5lZCk9Plxudml2aWZ5RmFySW5zdGFuY2UoYmFnZ2FnZSxraW5kTmFtZSx1bmRlZmluZWQsbWV0aG9kcyxvcHRpb25zKTskaOKAjV9vbmNlLnZpdmlmeVNpbmdsZXRvbih2aXZpZnlTaW5nbGV0b24pO1xuaGFyZGVuKHZpdmlmeVNpbmdsZXRvbik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmaW5lVmlydHVhbEZhckNsYXNzIjpbImRlZmluZVZpcnR1YWxGYXJDbGFzcyJdLCJkZWZpbmVWaXJ0dWFsRmFyQ2xhc3NLaXQiOlsiZGVmaW5lVmlydHVhbEZhckNsYXNzS2l0Il0sImRlZmluZUR1cmFibGVGYXJDbGFzcyI6WyJkZWZpbmVEdXJhYmxlRmFyQ2xhc3MiXSwiZGVmaW5lRHVyYWJsZUZhckNsYXNzS2l0IjpbImRlZmluZUR1cmFibGVGYXJDbGFzc0tpdCJdLCJ2aXZpZnlGYXJDbGFzcyI6WyJ2aXZpZnlGYXJDbGFzcyJdLCJ2aXZpZnlGYXJDbGFzc0tpdCI6WyJ2aXZpZnlGYXJDbGFzc0tpdCJdLCJ2aXZpZnlGYXJJbnN0YW5jZSI6WyJ2aXZpZnlGYXJJbnN0YW5jZSJdLCJ2aXZpZnlTaW5nbGV0b24iOlsidml2aWZ5U2luZ2xldG9uIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAI/LOT89BgAAPQYAACQAAABAYWdvcmljL3ZhdC1kYXRhLXYwLjQuNS9zcmMvaW5kZXguanN7ImltcG9ydHMiOlsiLi9mYXItY2xhc3MtdXRpbHMuanMiLCIuL2tpbmQtdXRpbHMuanMiLCIuL3ZhdC1kYXRhLWJpbmRpbmdzLmpzIl0sImV4cG9ydHMiOlsiZGVmaW5lRHVyYWJsZUZhckNsYXNzIiwiZGVmaW5lRHVyYWJsZUZhckNsYXNzS2l0IiwiZGVmaW5lVmlydHVhbEZhckNsYXNzIiwiZGVmaW5lVmlydHVhbEZhckNsYXNzS2l0Iiwidml2aWZ5RmFyQ2xhc3MiLCJ2aXZpZnlGYXJDbGFzc0tpdCIsInZpdmlmeUZhckluc3RhbmNlIiwidml2aWZ5U2luZ2xldG9uIl0sInJlZXhwb3J0cyI6WyIuL2tpbmQtdXRpbHMuanMiLCIuL3ZhdC1kYXRhLWJpbmRpbmdzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi92YXQtZGF0YS1iaW5kaW5ncy5qc1wiLCBbXV0sW1wiLi9raW5kLXV0aWxzLmpzXCIsIFtdXSxbXCIuL2Zhci1jbGFzcy11dGlscy5qc1wiLCBbW1wiZGVmaW5lVmlydHVhbEZhckNsYXNzXCIsIFskaOKAjV9saXZlW1wiZGVmaW5lVmlydHVhbEZhckNsYXNzXCJdXV0sW1wiZGVmaW5lVmlydHVhbEZhckNsYXNzS2l0XCIsIFskaOKAjV9saXZlW1wiZGVmaW5lVmlydHVhbEZhckNsYXNzS2l0XCJdXV0sW1wiZGVmaW5lRHVyYWJsZUZhckNsYXNzXCIsIFskaOKAjV9saXZlW1wiZGVmaW5lRHVyYWJsZUZhckNsYXNzXCJdXV0sW1wiZGVmaW5lRHVyYWJsZUZhckNsYXNzS2l0XCIsIFskaOKAjV9saXZlW1wiZGVmaW5lRHVyYWJsZUZhckNsYXNzS2l0XCJdXV0sW1widml2aWZ5RmFyQ2xhc3NcIiwgWyRo4oCNX2xpdmVbXCJ2aXZpZnlGYXJDbGFzc1wiXV1dLFtcInZpdmlmeUZhckNsYXNzS2l0XCIsIFskaOKAjV9saXZlW1widml2aWZ5RmFyQ2xhc3NLaXRcIl1dXSxbXCJ2aXZpZnlGYXJJbnN0YW5jZVwiLCBbJGjigI1fbGl2ZVtcInZpdmlmeUZhckluc3RhbmNlXCJdXV0sW1widml2aWZ5U2luZ2xldG9uXCIsIFskaOKAjV9saXZlW1widml2aWZ5U2luZ2xldG9uXCJdXV1dXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7ImRlZmluZVZpcnR1YWxGYXJDbGFzcyI6WyJkZWZpbmVWaXJ0dWFsRmFyQ2xhc3MiLGZhbHNlXSwiZGVmaW5lVmlydHVhbEZhckNsYXNzS2l0IjpbImRlZmluZVZpcnR1YWxGYXJDbGFzc0tpdCIsZmFsc2VdLCJkZWZpbmVEdXJhYmxlRmFyQ2xhc3MiOlsiZGVmaW5lRHVyYWJsZUZhckNsYXNzIixmYWxzZV0sImRlZmluZUR1cmFibGVGYXJDbGFzc0tpdCI6WyJkZWZpbmVEdXJhYmxlRmFyQ2xhc3NLaXQiLGZhbHNlXSwidml2aWZ5RmFyQ2xhc3MiOlsidml2aWZ5RmFyQ2xhc3MiLGZhbHNlXSwidml2aWZ5RmFyQ2xhc3NLaXQiOlsidml2aWZ5RmFyQ2xhc3NLaXQiLGZhbHNlXSwidml2aWZ5RmFySW5zdGFuY2UiOlsidml2aWZ5RmFySW5zdGFuY2UiLGZhbHNlXSwidml2aWZ5U2luZ2xldG9uIjpbInZpdmlmeVNpbmdsZXRvbiIsZmFsc2VdfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACyZOnmzwgAAM8IAAApAAAAQGFnb3JpYy92YXQtZGF0YS12MC40LjUvc3JjL2tpbmQtdXRpbHMuanN7ImltcG9ydHMiOlsiLi92YXQtZGF0YS1iaW5kaW5ncy5qcyJdLCJleHBvcnRzIjpbImlnbm9yZUNvbnRleHQiLCJwcm92aWRlS2luZEhhbmRsZSIsInZpdmlmeUtpbmQiLCJ2aXZpZnlLaW5kTXVsdGkiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgcHJvdmlkZSxkZWZpbmVEdXJhYmxlS2luZCxkZWZpbmVEdXJhYmxlS2luZE11bHRpLG1ha2VLaW5kSGFuZGxlOyRo4oCNX2ltcG9ydHMoW1tcIi4vdmF0LWRhdGEtYmluZGluZ3MuanNcIiwgW1tcInByb3ZpZGVcIiwgWyRo4oCNX2EgPT4gKHByb3ZpZGUgPSAkaOKAjV9hKV1dLFtcImRlZmluZUR1cmFibGVLaW5kXCIsIFskaOKAjV9hID0+IChkZWZpbmVEdXJhYmxlS2luZCA9ICRo4oCNX2EpXV0sW1wiZGVmaW5lRHVyYWJsZUtpbmRNdWx0aVwiLCBbJGjigI1fYSA9PiAoZGVmaW5lRHVyYWJsZUtpbmRNdWx0aSA9ICRo4oCNX2EpXV0sW1wibWFrZUtpbmRIYW5kbGVcIiwgWyRo4oCNX2EgPT4gKG1ha2VLaW5kSGFuZGxlID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5CYWdnYWdlfSBCYWdnYWdlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5EdXJhYmxlS2luZEhhbmRsZX0gRHVyYWJsZUtpbmRIYW5kbGUgKi9cblxuLyoqXG4gKiBNYWtlIGEgdmVyc2lvbiBvZiB0aGUgYXJndW1lbnQgZnVuY3Rpb24gdGhhdCB0YWtlcyBhIGtpbmQgY29udGV4dCBidXRcbiAqIGlnbm9yZXMgaXQuXG4gKlxuICogQHR5cGUgezxUIGV4dGVuZHMgRnVuY3Rpb24+KGZuOiBUKSA9PiBYaW1wb3J0KCcuL3R5cGVzLmpzJykuUGx1c0NvbnRleHQ8bmV2ZXIsIFQ+fVxuICovXG5jb25zdCAgICAgICAgaWdub3JlQ29udGV4dD1cbihmbik9PlxuKF9jb250ZXh0LC4uLmFyZ3MpPT5cbmZuKC4uLmFyZ3MpOyRo4oCNX29uY2UuaWdub3JlQ29udGV4dChpZ25vcmVDb250ZXh0KTtcbmhhcmRlbihpZ25vcmVDb250ZXh0KTtcblxuLyoqXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBraW5kTmFtZVxuICogQHJldHVybnMge0R1cmFibGVLaW5kSGFuZGxlfVxuICovXG5jb25zdCAgICAgICAgcHJvdmlkZUtpbmRIYW5kbGU9KGJhZ2dhZ2Usa2luZE5hbWUpPT5cbnByb3ZpZGUoYmFnZ2FnZSwgYCR7a2luZE5hbWV9X2tpbmRIYW5kbGVgLCgpPT5tYWtlS2luZEhhbmRsZShraW5kTmFtZSkpOyRo4oCNX29uY2UucHJvdmlkZUtpbmRIYW5kbGUocHJvdmlkZUtpbmRIYW5kbGUpO1xuaGFyZGVuKHByb3ZpZGVLaW5kSGFuZGxlKTtcblxuLyoqIEB0eXBlIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuVml2aWZ5S2luZH0gKi9cbmNvbnN0ICAgICAgICB2aXZpZnlLaW5kPShcbmJhZ2dhZ2UsXG5raW5kTmFtZSxcbmluaXQsXG5iZWhhdmlvcixcbm9wdGlvbnM9dW5kZWZpbmVkKT0+XG5cbmRlZmluZUR1cmFibGVLaW5kKFxucHJvdmlkZUtpbmRIYW5kbGUoYmFnZ2FnZSxraW5kTmFtZSksXG5pbml0LFxuYmVoYXZpb3IsXG5vcHRpb25zKTskaOKAjV9vbmNlLnZpdmlmeUtpbmQodml2aWZ5S2luZCk7XG5cbmhhcmRlbih2aXZpZnlLaW5kKTtcblxuLyoqIEB0eXBlIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuVml2aWZ5S2luZE11bHRpfSAqL1xuY29uc3QgICAgICAgIHZpdmlmeUtpbmRNdWx0aT0oXG5iYWdnYWdlLFxua2luZE5hbWUsXG5pbml0LFxuYmVoYXZpb3IsXG5vcHRpb25zPXVuZGVmaW5lZCk9PlxuXG5kZWZpbmVEdXJhYmxlS2luZE11bHRpKFxucHJvdmlkZUtpbmRIYW5kbGUoYmFnZ2FnZSxraW5kTmFtZSksXG5pbml0LFxuYmVoYXZpb3IsXG5vcHRpb25zKTskaOKAjV9vbmNlLnZpdmlmeUtpbmRNdWx0aSh2aXZpZnlLaW5kTXVsdGkpO1xuXG5oYXJkZW4odml2aWZ5S2luZE11bHRpKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpZ25vcmVDb250ZXh0IjpbImlnbm9yZUNvbnRleHQiXSwicHJvdmlkZUtpbmRIYW5kbGUiOlsicHJvdmlkZUtpbmRIYW5kbGUiXSwidml2aWZ5S2luZCI6WyJ2aXZpZnlLaW5kIl0sInZpdmlmeUtpbmRNdWx0aSI6WyJ2aXZpZnlLaW5kTXVsdGkiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAc2+Mc2EcAABhHAAAMAAAAEBhZ29yaWMvdmF0LWRhdGEtdjAuNC41L3NyYy92YXQtZGF0YS1iaW5kaW5ncy5qc3siaW1wb3J0cyI6WyJAYWdvcmljL2Fzc2VydCIsIkBhZ29yaWMvc3RvcmUiXSwiZXhwb3J0cyI6WyJNIiwiY2FuQmVEdXJhYmxlIiwiZGVmaW5lRHVyYWJsZUtpbmQiLCJkZWZpbmVEdXJhYmxlS2luZE11bHRpIiwiZGVmaW5lS2luZCIsImRlZmluZUtpbmRNdWx0aSIsIm1ha2VLaW5kSGFuZGxlIiwibWFrZVNjYWxhckJpZ01hcFN0b3JlIiwibWFrZVNjYWxhckJpZ1NldFN0b3JlIiwibWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSIsIm1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUiLCJtYWtlU2NhbGFyTWFwU3RvcmUiLCJtYWtlU2NhbGFyU2V0U3RvcmUiLCJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIiwibWFrZVNjYWxhcldlYWtTZXRTdG9yZSIsInBhcnRpYWxBc3NpZ24iLCJwaWNrRmFjZXQiLCJwcm92aWRlIiwicHJvdmlkZUR1cmFibGVNYXBTdG9yZSIsInByb3ZpZGVEdXJhYmxlU2V0U3RvcmUiLCJwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSIsInByb3ZpZGVQcm9taXNlV2F0Y2hlciIsIndhdGNoUHJvbWlzZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnQsTSxtYWtlU2NhbGFyTWFwU3RvcmUsbWFrZVNjYWxhcldlYWtNYXBTdG9yZSxtYWtlU2NhbGFyU2V0U3RvcmUsbWFrZVNjYWxhcldlYWtTZXRTdG9yZSxwcm92aWRlTGF6eTskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2Fzc2VydFwiLCBbW1wiYXNzZXJ0XCIsIFskaOKAjV9hID0+IChhc3NlcnQgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiTVwiLCBbJGjigI1fYSA9PiAoTSA9ICRo4oCNX2EpLCRo4oCNX2xpdmVbXCJNXCJdXV0sW1wibWFrZVNjYWxhck1hcFN0b3JlXCIsIFskaOKAjV9hID0+IChtYWtlU2NhbGFyTWFwU3RvcmUgPSAkaOKAjV9hKSwkaOKAjV9saXZlW1wibWFrZVNjYWxhck1hcFN0b3JlXCJdXV0sW1wibWFrZVNjYWxhcldlYWtNYXBTdG9yZVwiLCBbJGjigI1fYSA9PiAobWFrZVNjYWxhcldlYWtNYXBTdG9yZSA9ICRo4oCNX2EpLCRo4oCNX2xpdmVbXCJtYWtlU2NhbGFyV2Vha01hcFN0b3JlXCJdXV0sW1wibWFrZVNjYWxhclNldFN0b3JlXCIsIFskaOKAjV9hID0+IChtYWtlU2NhbGFyU2V0U3RvcmUgPSAkaOKAjV9hKSwkaOKAjV9saXZlW1wibWFrZVNjYWxhclNldFN0b3JlXCJdXV0sW1wibWFrZVNjYWxhcldlYWtTZXRTdG9yZVwiLCBbJGjigI1fYSA9PiAobWFrZVNjYWxhcldlYWtTZXRTdG9yZSA9ICRo4oCNX2EpLCRo4oCNX2xpdmVbXCJtYWtlU2NhbGFyV2Vha1NldFN0b3JlXCJdXV0sW1wicHJvdmlkZUxhenlcIiwgWyRo4oCNX2EgPT4gKHByb3ZpZGVMYXp5ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZSB7WGltcG9ydCgnLi90eXBlcycpLlZhdERhdGF9ICovXG5sZXQgVmF0RGF0YUdsb2JhbDtcbmlmKCdWYXREYXRhJ2luIGdsb2JhbFRoaXMpe1xuYXNzZXJ0KGdsb2JhbFRoaXMuVmF0RGF0YSwnVmF0RGF0YSBkZWZpbmVkIGluIGdsb2JhbCBhcyBudWxsIG9yIHVuZGVmaW5lZCcpO1xuVmF0RGF0YUdsb2JhbD1nbG9iYWxUaGlzLlZhdERhdGE7XG4gfWVsc2V7XG4vKiBYWFggdGhpcyBtb2R1bGUgaGFzIGJlZW4ga25vd24gdG8gZ2V0IGltcG9ydGVkICh0cmFuc2l0aXZlbHkpIGluIGNhc2VzIHRoYXQqL1xuLyogbmV2ZXIgdXNlIGl0IHNvIHdlIG1ha2UgYSB2ZXJzaW9uIHRoYXQgd2lsbCBzYXRpc2Z5IG1vZHVsZSByZXNvbHV0aW9uIGJ1dCovXG4vKiBmYWlsIGF0IHJ1bnRpbWUuKi9cbmNvbnN0IHVudmFpbGFibGU9KCk9PmFzc2VydC5mYWlsKCdWYXREYXRhIHVuYXZhaWxhYmxlJyk7XG5WYXREYXRhR2xvYmFsPXtcbmRlZmluZUtpbmQ6dW52YWlsYWJsZSxcbmRlZmluZUtpbmRNdWx0aTp1bnZhaWxhYmxlLFxuZGVmaW5lRHVyYWJsZUtpbmQ6dW52YWlsYWJsZSxcbmRlZmluZUR1cmFibGVLaW5kTXVsdGk6dW52YWlsYWJsZSxcbm1ha2VLaW5kSGFuZGxlOnVudmFpbGFibGUsXG5wcm92aWRlUHJvbWlzZVdhdGNoZXI6dW52YWlsYWJsZSxcbndhdGNoUHJvbWlzZTp1bnZhaWxhYmxlLFxubWFrZVNjYWxhckJpZ01hcFN0b3JlOnVudmFpbGFibGUsXG5tYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlOnVudmFpbGFibGUsXG5tYWtlU2NhbGFyQmlnU2V0U3RvcmU6dW52YWlsYWJsZSxcbm1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmU6dW52YWlsYWJsZSxcbmNhbkJlRHVyYWJsZTp1bnZhaWxhYmxlfTtcblxuIH1cblxuY29uc3QgICAgICAge1xuZGVmaW5lS2luZCxcbmRlZmluZUtpbmRNdWx0aSxcbmRlZmluZUR1cmFibGVLaW5kLFxuZGVmaW5lRHVyYWJsZUtpbmRNdWx0aSxcbm1ha2VLaW5kSGFuZGxlLFxucHJvdmlkZVByb21pc2VXYXRjaGVyLFxud2F0Y2hQcm9taXNlLFxubWFrZVNjYWxhckJpZ01hcFN0b3JlLFxubWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSxcbm1ha2VTY2FsYXJCaWdTZXRTdG9yZSxcbm1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUsXG5jYW5CZUR1cmFibGV9PVxuVmF0RGF0YUdsb2JhbDtcblxuLyoqXG4gKiBXaGVuIG1ha2luZyBhIG11bHRpLWZhY2V0IGtpbmQsIGl0J3MgY29tbW9uIHRvIHBpY2sgb25lIGZhY2V0IHRvIGV4cG9zZS4gRS5nLixcbiAqXG4gKiAgICAgY29uc3QgbWFrZUZvbyA9IChhLCBiLCBjLCBkKSA9PiBtYWtlRm9vQmFzZShhLCBiLCBjLCBkKS5zZWxmO1xuICpcbiAqIFRoaXMgaGVscGVyIHJlZHVjZXMgdGhlIGR1cGxpY2F0aW9uOlxuICpcbiAqICAgICBjb25zdCBtYWtlRm9vID0gcGlja0ZhY2V0KG1ha2VGb29CYXNlLCAnc2VsZicpO1xuICpcbiAqIEB0eXBlIHtYaW1wb3J0KCcuL3R5cGVzJykuUGlja0ZhY2V0fVxuICovJGjigI1fb25jZS5kZWZpbmVLaW5kKGRlZmluZUtpbmQpOyRo4oCNX29uY2UuZGVmaW5lS2luZE11bHRpKGRlZmluZUtpbmRNdWx0aSk7JGjigI1fb25jZS5kZWZpbmVEdXJhYmxlS2luZChkZWZpbmVEdXJhYmxlS2luZCk7JGjigI1fb25jZS5kZWZpbmVEdXJhYmxlS2luZE11bHRpKGRlZmluZUR1cmFibGVLaW5kTXVsdGkpOyRo4oCNX29uY2UubWFrZUtpbmRIYW5kbGUobWFrZUtpbmRIYW5kbGUpOyRo4oCNX29uY2UucHJvdmlkZVByb21pc2VXYXRjaGVyKHByb3ZpZGVQcm9taXNlV2F0Y2hlcik7JGjigI1fb25jZS53YXRjaFByb21pc2Uod2F0Y2hQcm9taXNlKTskaOKAjV9vbmNlLm1ha2VTY2FsYXJCaWdNYXBTdG9yZShtYWtlU2NhbGFyQmlnTWFwU3RvcmUpOyRo4oCNX29uY2UubWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZShtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlKTskaOKAjV9vbmNlLm1ha2VTY2FsYXJCaWdTZXRTdG9yZShtYWtlU2NhbGFyQmlnU2V0U3RvcmUpOyRo4oCNX29uY2UubWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZShtYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlKTskaOKAjV9vbmNlLmNhbkJlRHVyYWJsZShjYW5CZUR1cmFibGUpO1xuY29uc3QgICAgICAgIHBpY2tGYWNldD1cbihtYWtlcixmYWNldE5hbWUpPT5cbiguLi5hcmdzKT0+XG5tYWtlciguLi5hcmdzKVtmYWNldE5hbWVdOyRo4oCNX29uY2UucGlja0ZhY2V0KHBpY2tGYWNldCk7XG5oYXJkZW4ocGlja0ZhY2V0KTtcblxuLyoqXG4gKiBBc3NpZ24gdGhlIHZhbHVlcyBvZiBhbGwgb2YgdGhlIGVudW1lcmFibGUgb3duIHByb3BlcnRpZXMgZnJvbSB0aGUgc291cmNlXG4gKiBvYmplY3QgdG8gdGhlaXIga2V5cyBpbiB0aGUgdGFyZ2V0IG9iamVjdC5cbiAqXG4gKiBAdGVtcGxhdGUge3t9fSBUXG4gKiBAcGFyYW0ge1R9IHRhcmdldFxuICogQHBhcmFtIHtQYXJ0aWFsPFQ+fSBzb3VyY2VcbiAqL1xuY29uc3QgICAgICAgIHBhcnRpYWxBc3NpZ249KHRhcmdldCxzb3VyY2UpPT57XG5PYmplY3QuYXNzaWduKHRhcmdldCxzb3VyY2UpO1xuIH07JGjigI1fb25jZS5wYXJ0aWFsQXNzaWduKHBhcnRpYWxBc3NpZ24pO1xuaGFyZGVuKHBhcnRpYWxBc3NpZ24pO1xuXG4vKipcbiAqIFVubGlrZSBgcHJvdmlkZUxhenlgLCBgcHJvdmlkZWAgc2hvdWxkIGJlIGNhbGxlZCBhdCBtb3N0IG9uY2VcbiAqIHdpdGhpbiBhbnkgdmF0IGluY2FybmF0aW9uIHdpdGggYSBnaXZlbiBgYmFnZ2FnZWAsYGtleWAgcGFpci5cbiAqXG4gKiBgcHJvdmlkZWAgc2hvdWxkIG9ubHkgdG8gYmUgdXNlZCB0byBwb3B1bGF0ZSBiYWdnYWdlLFxuICogd2hlcmUgdGhlIHRvdGFsIG51bWJlciBvZiBjYWxscyB0byBgcHJvdmlkZWAgbXVzdCBiZVxuICogbG93IGNhcmRpbmFsaXR5LCBzaW5jZSB3ZSBrZWVwIHRoZSBib29ra2VlcGluZyB0byBkZXRlY3QgY29sbGlzaW9uc1xuICogaW4gbm9ybWFsIGxhbmd1YWdlLWhlYXAgbWVtb3J5LiBBbGwgdGhlIG90aGVyIGJhZ2dhZ2Utb3JpZW50ZWRcbiAqIGBwcm92aWRlKmAgYW5kIGB2aXZpZnkqYCBmdW5jdGlvbnMgY2FsbCBgcHJvdmlkZWAsXG4gKiBhbmQgc28gaW1wb3NlIHRoZSBzYW1lIGNvbnN0cmFpbnRzLiBUaGlzIGlzIGNvbnNpc3RlbnQgd2l0aFxuICogb3VyIGV4cGVjdGVkIGR1cmFiaWxpdHkgcGF0dGVybnM6IFdoYXQgd2Ugc3RvcmUgaW4gYmFnZ2FnZSBhcmVcbiAqICAgICoga2luZEhhbmRsZXMsIHdoaWNoIGFyZSBwZXIga2luZCwgd2hpY2ggbXVzdCBiZSBsb3cgY2FyZGluYWxpdHlcbiAqICAgICogZGF0YSBcInZhcmlhYmxlc1wiIGZvciByZWVzdGFibGlzaGluZyB0aGUgbGV4aWNhbCBzY29wZSwgZXNwZWNpYWxseVxuICogICAgICBvZiBzaW5nbGV0b25zXG4gKiAgICAqIG5hbWVkIG5vbi1iYWdnYWdlIGNvbGxlY3Rpb25zIGF0IHRoZSBsZWF2ZXMgb2YgdGhlIGJhZ2dhZ2UgdHJlZS5cbiAqXG4gKiBXaGF0IGlzIGV4cGVjdGVkIHRvIGJlIGhpZ2ggY2FyZGluYWxpdHkgYXJlIHRoZSBpbnN0YW5jZXMgb2YgdGhlIGtpbmRzLFxuICogYW5kIHRoZSBtZW1iZXJzIG9mIHRoZSBub24tYmFnZ2dhZ2UgY29sbGVjdGlvbnMuXG4gKlxuICogVE9ETyBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvcHVsbC81ODc1IDpcbiAqIEltcGxlbWVudCBkZXZlbG9wbWVudC10aW1lIGluc3RydW1lbnRhdGlvbiB0byBkZXRlY3Qgd2hlblxuICogYHByb3ZpZGVgIHZpb2xhdGVzIHRoZSBhYm92ZSBwcmVzY3JpcHRpb24sIGFuZCBpcyBjYWxsZWQgbW9yZVxuICogdGhhbiBvbmUgaW4gdGhlIHNhbWUgdmF0IGluY2FybmF0aW9uIHdpdGggdGhlIHNhbWVcbiAqIGJhZ2dhZ2Usa2V5IHBhaXIuXG4gKlxuICogQHRlbXBsYXRlIEssVlxuICogQHBhcmFtIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtLfSBrZXlcbiAqIEBwYXJhbSB7KGtleTogSykgPT4gVn0gbWFrZVZhbHVlXG4gKiBAcmV0dXJucyB7Vn1cbiAqL1xuY29uc3QgICAgICAgIHByb3ZpZGU9cHJvdmlkZUxhenk7JGjigI1fb25jZS5wcm92aWRlKHByb3ZpZGUpO1xuXG5jb25zdCAgICAgICAgcHJvdmlkZUR1cmFibGVNYXBTdG9yZT0oYmFnZ2FnZSxuYW1lKT0+XG5wcm92aWRlKGJhZ2dhZ2UsbmFtZSwoKT0+bWFrZVNjYWxhckJpZ01hcFN0b3JlKG5hbWUse2R1cmFibGU6dHJ1ZX0pKTskaOKAjV9vbmNlLnByb3ZpZGVEdXJhYmxlTWFwU3RvcmUocHJvdmlkZUR1cmFibGVNYXBTdG9yZSk7XG5oYXJkZW4ocHJvdmlkZUR1cmFibGVNYXBTdG9yZSk7XG5cbmNvbnN0ICAgICAgICBwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZT0oYmFnZ2FnZSxuYW1lKT0+XG5wcm92aWRlKGJhZ2dhZ2UsbmFtZSwoKT0+XG5tYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlKG5hbWUse2R1cmFibGU6dHJ1ZX0pKTskaOKAjV9vbmNlLnByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlKHByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlKTtcblxuaGFyZGVuKHByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlKTtcblxuY29uc3QgICAgICAgIHByb3ZpZGVEdXJhYmxlU2V0U3RvcmU9KGJhZ2dhZ2UsbmFtZSk9PlxucHJvdmlkZShiYWdnYWdlLG5hbWUsKCk9Pm1ha2VTY2FsYXJCaWdTZXRTdG9yZShuYW1lLHtkdXJhYmxlOnRydWV9KSk7JGjigI1fb25jZS5wcm92aWRlRHVyYWJsZVNldFN0b3JlKHByb3ZpZGVEdXJhYmxlU2V0U3RvcmUpO1xuaGFyZGVuKHByb3ZpZGVEdXJhYmxlU2V0U3RvcmUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7Ik0iOlsiTSIsZmFsc2VdLCJtYWtlU2NhbGFyTWFwU3RvcmUiOlsibWFrZVNjYWxhck1hcFN0b3JlIixmYWxzZV0sIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmUiOlsibWFrZVNjYWxhcldlYWtNYXBTdG9yZSIsZmFsc2VdLCJtYWtlU2NhbGFyU2V0U3RvcmUiOlsibWFrZVNjYWxhclNldFN0b3JlIixmYWxzZV0sIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmUiOlsibWFrZVNjYWxhcldlYWtTZXRTdG9yZSIsZmFsc2VdfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZmluZUtpbmQiOlsiZGVmaW5lS2luZCJdLCJkZWZpbmVLaW5kTXVsdGkiOlsiZGVmaW5lS2luZE11bHRpIl0sImRlZmluZUR1cmFibGVLaW5kIjpbImRlZmluZUR1cmFibGVLaW5kIl0sImRlZmluZUR1cmFibGVLaW5kTXVsdGkiOlsiZGVmaW5lRHVyYWJsZUtpbmRNdWx0aSJdLCJtYWtlS2luZEhhbmRsZSI6WyJtYWtlS2luZEhhbmRsZSJdLCJwcm92aWRlUHJvbWlzZVdhdGNoZXIiOlsicHJvdmlkZVByb21pc2VXYXRjaGVyIl0sIndhdGNoUHJvbWlzZSI6WyJ3YXRjaFByb21pc2UiXSwibWFrZVNjYWxhckJpZ01hcFN0b3JlIjpbIm1ha2VTY2FsYXJCaWdNYXBTdG9yZSJdLCJtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlIjpbIm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUiXSwibWFrZVNjYWxhckJpZ1NldFN0b3JlIjpbIm1ha2VTY2FsYXJCaWdTZXRTdG9yZSJdLCJtYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlIjpbIm1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUiXSwiY2FuQmVEdXJhYmxlIjpbImNhbkJlRHVyYWJsZSJdLCJwaWNrRmFjZXQiOlsicGlja0ZhY2V0Il0sInBhcnRpYWxBc3NpZ24iOlsicGFydGlhbEFzc2lnbiJdLCJwcm92aWRlIjpbInByb3ZpZGUiXSwicHJvdmlkZUR1cmFibGVNYXBTdG9yZSI6WyJwcm92aWRlRHVyYWJsZU1hcFN0b3JlIl0sInByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlIjpbInByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlIl0sInByb3ZpZGVEdXJhYmxlU2V0U3RvcmUiOlsicHJvdmlkZUR1cmFibGVTZXRTdG9yZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB8VWrpmwMAAJsDAAAfAAAAQGFnb3JpYy96b2UtdjAuMjUuNS9leHBvcnRlZC5qc3siaW1wb3J0cyI6WyIuL3NyYy9jb250cmFjdEZhY2V0L3R5cGVzLmpzIiwiLi9zcmMvY29udHJhY3RTdXBwb3J0L3R5cGVzLmpzIiwiLi9zcmMvY29udHJhY3RzL2V4cG9ydGVkLmpzIiwiLi9zcmMvdHlwZXMuanMiLCIuL3NyYy96b2VTZXJ2aWNlL3R5cGVzLmpzIiwiLi90b29scy90eXBlcy5qcyIsIkBhZ29yaWMvZXJ0cC9leHBvcnRlZC5qcyIsIkBhZ29yaWMvbm90aWZpZXIvZXhwb3J0ZWQuanMiLCJAYWdvcmljL3N0b3JlL2V4cG9ydGVkLmpzIiwiQGFnb3JpYy9zd2luZ3NldC12YXQvZXhwb3J0ZWQuanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9zcmMvY29udHJhY3RGYWNldC90eXBlcy5qc1wiLCBbXV0sW1wiLi9zcmMvem9lU2VydmljZS90eXBlcy5qc1wiLCBbXV0sW1wiLi9zcmMvY29udHJhY3RTdXBwb3J0L3R5cGVzLmpzXCIsIFtdXSxbXCIuL3NyYy9jb250cmFjdHMvZXhwb3J0ZWQuanNcIiwgW11dLFtcIi4vc3JjL3R5cGVzLmpzXCIsIFtdXSxbXCIuL3Rvb2xzL3R5cGVzLmpzXCIsIFtdXSxbXCJAYWdvcmljL25vdGlmaWVyL2V4cG9ydGVkLmpzXCIsIFtdXSxbXCJAYWdvcmljL2VydHAvZXhwb3J0ZWQuanNcIiwgW11dLFtcIkBhZ29yaWMvc3RvcmUvZXhwb3J0ZWQuanNcIiwgW11dLFtcIkBhZ29yaWMvc3dpbmdzZXQtdmF0L2V4cG9ydGVkLmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACpaDAHihwAAIocAAAoAAAAQGFnb3JpYy96b2UtdjAuMjUuNS9zcmMvY2xlYW5Qcm9wb3NhbC5qc3siaW1wb3J0cyI6WyIuLi9leHBvcnRlZC5qcyIsIi4vaW50ZXJuYWwtdHlwZXMuanMiLCIuL29iakFycmF5Q29udmVyc2lvbi5qcyIsIi4vdHlwZUd1YXJkcy5qcyIsIkBhZ29yaWMvYXNzZXJ0IiwiQGFnb3JpYy9lcnRwIiwiQGFnb3JpYy9zdG9yZSIsIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJNQVhfS0VZV09SRF9MRU5HVEgiLCJhc3NlcnRLZXl3b3JkTmFtZSIsImNsZWFuS2V5d29yZHMiLCJjbGVhblByb3Bvc2FsIiwiY29lcmNlQW1vdW50S2V5d29yZFJlY29yZCIsImNvZXJjZUFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydCxYLHEsQW1vdW50TWF0aCxnZXRBc3NldEtpbmQsYXNzZXJ0UmVjb3JkLGFzc2VydEtleSxhc3NlcnRQYXR0ZXJuLGZpdCxpc0tleSxGdWxsUHJvcG9zYWxTaGFwZSxhcnJheVRvT2JqOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvYXNzZXJ0XCIsIFtbXCJhc3NlcnRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydCA9ICRo4oCNX2EpXV0sW1wiZGV0YWlsc1wiLCBbJGjigI1fYSA9PiAoWCA9ICRo4oCNX2EpXV0sW1wicVwiLCBbJGjigI1fYSA9PiAocSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL2VydHBcIiwgW1tcIkFtb3VudE1hdGhcIiwgWyRo4oCNX2EgPT4gKEFtb3VudE1hdGggPSAkaOKAjV9hKV1dLFtcImdldEFzc2V0S2luZFwiLCBbJGjigI1fYSA9PiAoZ2V0QXNzZXRLaW5kID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcImFzc2VydFJlY29yZFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UmVjb3JkID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcImFzc2VydEtleVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0S2V5ID0gJGjigI1fYSldXSxbXCJhc3NlcnRQYXR0ZXJuXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXR0ZXJuID0gJGjigI1fYSldXSxbXCJmaXRcIiwgWyRo4oCNX2EgPT4gKGZpdCA9ICRo4oCNX2EpXV0sW1wiaXNLZXlcIiwgWyRo4oCNX2EgPT4gKGlzS2V5ID0gJGjigI1fYSldXV1dLFtcIi4vdHlwZUd1YXJkcy5qc1wiLCBbW1wiRnVsbFByb3Bvc2FsU2hhcGVcIiwgWyRo4oCNX2EgPT4gKEZ1bGxQcm9wb3NhbFNoYXBlID0gJGjigI1fYSldXV1dLFtcIi4vb2JqQXJyYXlDb252ZXJzaW9uLmpzXCIsIFtbXCJhcnJheVRvT2JqXCIsIFskaOKAjV9hID0+IChhcnJheVRvT2JqID0gJGjigI1fYSldXV1dLFtcIi4uL2V4cG9ydGVkLmpzXCIsIFtdXSxbXCIuL2ludGVybmFsLXR5cGVzLmpzXCIsIFtdXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5cbmNvbnN0ICAgICAgICBNQVhfS0VZV09SRF9MRU5HVEg9MTAwOyRo4oCNX29uY2UuTUFYX0tFWVdPUkRfTEVOR1RIKE1BWF9LRVlXT1JEX0xFTkdUSCk7XG5cbmNvbnN0IGZpcnN0Q2FwQVNDSUk9L15bQS1aXVthLXpBLVowLTlfJF0qJC87XG5cbi8qIFdlIGFkb3B0IHNpbXBsZSByZXF1aXJlbWVudHMgb24ga2V5d29yZHMgc28gdGhhdCB0aGV5IGRvIG5vdCBhY2NpZGVudGFsbHkqL1xuLyogY29uZmxpY3Qgd2l0aCBleGlzdGluZyBwcm9wZXJ0eSBuYW1lcy4qL1xuLyogV2UgcmVxdWlyZSBrZXl3b3JkcyB0byBiZSBzdHJpbmdzLCBhc2NpaSBpZGVudGlmaWVycyBiZWdpbm5pbmcgd2l0aCBhbiovXG4vKiB1cHBlciBjYXNlIGxldHRlciwgYW5kIGRpc3RpbmN0IGZyb20gdGhlIHN0cmluZ2lmaWVkIGZvcm0gb2YgYW55IG51bWJlci4qL1xuLyoqL1xuLyogT2YgbnVtYmVycywgb25seSBOYU4gYW5kIEluZmluaXR5LCB3aGVuIHN0cmluZ2lmaWVkIHRvIGEgcHJvcGVydHkgbmFtZSwqL1xuLyogcHJvZHVjZSBhbiBhc2NpaSBpZGVudGlmaWVyIGJlZ2lubmluZyB3aXRoIGFuIHVwcGVyIGNhc2UgbGV0dGVyLiovXG4vKiBXaXRoIHRoaXMgcnVsZSwgYSBjb21wdXRlZCBpbmRleGluZyBleHByZXNzaW9uIGxpa2UgYGFbK2ldYCBjYW5ub3QqL1xuLyogbG9va3VwIGEga2V5d29yZC1uYW1lZCBwcm9wZXJ0eSBubyBtYXR0ZXIgd2hhdCBgaWAgaXMuKi9cbmNvbnN0ICAgICAgICBhc3NlcnRLZXl3b3JkTmFtZT0oa2V5d29yZCk9PntcbmFzc2VydC50eXBlb2Yoa2V5d29yZCwnc3RyaW5nJyk7XG5rZXl3b3JkLmxlbmd0aDw9TUFYX0tFWVdPUkRfTEVOR1RIfHxcbmFzc2VydC5mYWlsKFxuWCBga2V5d29yZCAke3Eoa2V5d29yZCl9IGV4Y2VlZGVkIG1heGltdW0gbGVuZ3RoICR7cShcbk1BWF9LRVlXT1JEX0xFTkdUSClcbiB9IGNoYXJhY3RlcnM7IGdvdCAke2tleXdvcmQubGVuZ3RofWApO1xuXG5hc3NlcnQoXG5maXJzdENhcEFTQ0lJLnRlc3Qoa2V5d29yZCksXG5YIGBrZXl3b3JkICR7cShcbmtleXdvcmQpXG4gfSBtdXN0IGJlIGFuIGFzY2lpIGlkZW50aWZpZXIgc3RhcnRpbmcgd2l0aCB1cHBlciBjYXNlLmApO1xuXG5rZXl3b3JkIT09J05hTicmJmtleXdvcmQhPT0nSW5maW5pdHknfHxcbmFzc2VydC5mYWlsKFggYGtleXdvcmQgJHtxKGtleXdvcmQpfSBtdXN0IG5vdCBiZSBhIG51bWJlcidzIG5hbWVgKTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7e1tuYW1lOiBzdHJpbmddOiBhbnl9fSB1bmNsZWFuS2V5d29yZFJlY29yZFxuICogQHJldHVybnMge3N0cmluZ1tdfVxuICovJGjigI1fb25jZS5hc3NlcnRLZXl3b3JkTmFtZShhc3NlcnRLZXl3b3JkTmFtZSk7XG5jb25zdCAgICAgICAgY2xlYW5LZXl3b3Jkcz0odW5jbGVhbktleXdvcmRSZWNvcmQpPT57XG5oYXJkZW4odW5jbGVhbktleXdvcmRSZWNvcmQpO1xuYXNzZXJ0UmVjb3JkKHVuY2xlYW5LZXl3b3JkUmVjb3JkLCdrZXl3b3JkUmVjb3JkJyk7XG5jb25zdCBrZXl3b3Jkcz1vd25LZXlzKHVuY2xlYW5LZXl3b3JkUmVjb3JkKTtcblxuLyogQXNzZXJ0IGFsbCBuYW1lcyBhcmUgYXNjaWkgaWRlbnRpZmllcnMgc3RhcnRpbmcgd2l0aCovXG4vKiBhbiB1cHBlciBjYXNlIGxldHRlci4qL1xua2V5d29yZHMuZm9yRWFjaChhc3NlcnRLZXl3b3JkTmFtZSk7XG5cbnJldHVybiAoLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9rZXl3b3Jkcyk7XG4gfTskaOKAjV9vbmNlLmNsZWFuS2V5d29yZHMoY2xlYW5LZXl3b3Jkcyk7XG5cbmNvbnN0ICAgICAgICBjb2VyY2VBbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZD0oXG5hbGxlZ2VkQW1vdW50S2V5d29yZFJlY29yZCxcbmdldEFzc2V0S2luZEJ5QnJhbmQpPT5cbntcbmNvbnN0IGtleXdvcmRzPWNsZWFuS2V5d29yZHMoYWxsZWdlZEFtb3VudEtleXdvcmRSZWNvcmQpO1xuXG5jb25zdCBhbW91bnRzPU9iamVjdC52YWx1ZXMoYWxsZWdlZEFtb3VudEtleXdvcmRSZWNvcmQpO1xuLyogQ2hlY2sgdGhhdCBlYWNoIHZhbHVlIGNhbiBiZSBjb2VyY2VkIHVzaW5nIHRoZSBBbW91bnRNYXRoKi9cbi8qIGluZGljYXRlZCBieSBicmFuZC4gYEFtb3VudE1hdGguY29lcmNlYCB0aHJvd3MgaWYgY29lcmNpb24gZmFpbHMuKi9cbmNvbnN0IGNvZXJjZWRBbW91bnRzPWFtb3VudHMubWFwKChhbW91bnQpPT57XG5pZihpc0tleShhbW91bnQpKXtcbmNvbnN0IGJyYW5kQXNzZXRLaW5kPWdldEFzc2V0S2luZEJ5QnJhbmQoYW1vdW50LmJyYW5kKTtcbmNvbnN0IGFzc2V0S2luZD1nZXRBc3NldEtpbmQoYW1vdW50KTtcbi8qIFRPRE86IHJlcGxhY2UgdGhpcyBhc3NlcnRpb24gd2l0aCBhIGNoZWNrIG9mIHRoZSBhc3NldEtpbmQqL1xuLyogcHJvcGVydHkgb24gdGhlIGJyYW5kLCB3aGVuIHRoYXQgZXhpc3RzLiovXG5hc3NldEtpbmQ9PT1icmFuZEFzc2V0S2luZHx8XG5hc3NlcnQuZmFpbChcblggYFRoZSBhbW91bnQgJHthbW91bnR9IGRpZCBub3QgaGF2ZSB0aGUgYXNzZXRLaW5kIG9mIHRoZSBicmFuZCAke2JyYW5kQXNzZXRLaW5kfWApO1xuXG5yZXR1cm4gQW1vdW50TWF0aC5jb2VyY2UoYW1vdW50LmJyYW5kLGFtb3VudCk7XG4gfWVsc2V7XG5hc3NlcnRQYXR0ZXJuKGFtb3VudCk7XG5yZXR1cm4gYW1vdW50O1xuIH1cbiB9KTtcblxuLyogUmVjcmVhdGUgdGhlIGFtb3VudEtleXdvcmRSZWNvcmQgd2l0aCBjb2VyY2VkQW1vdW50cy4qL1xucmV0dXJuIGhhcmRlbihhcnJheVRvT2JqKGNvZXJjZWRBbW91bnRzLGtleXdvcmRzKSk7XG4gfTskaOKAjV9vbmNlLmNvZXJjZUFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkKGNvZXJjZUFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkKTtcblxuY29uc3QgICAgICAgIGNvZXJjZUFtb3VudEtleXdvcmRSZWNvcmQ9KFxuYWxsZWdlZEFtb3VudEtleXdvcmRSZWNvcmQsXG5nZXRBc3NldEtpbmRCeUJyYW5kKT0+XG57XG5jb25zdCByZXN1bHQ9Y29lcmNlQW1vdW50UGF0dGVybktleXdvcmRSZWNvcmQoXG5hbGxlZ2VkQW1vdW50S2V5d29yZFJlY29yZCxcbmdldEFzc2V0S2luZEJ5QnJhbmQpO1xuXG5hc3NlcnRLZXkocmVzdWx0KTtcbnJldHVybiByZXN1bHQ7XG4gfTtcblxuLyoqXG4gKiBKdXN0IGNoZWNrcyByZXNpZHVhbCBpc3N1ZXMgYWZ0ZXIgbWF0Y2hpbmcgUHJvcG9zYWxTaGFwZS5cbiAqIE9ubHkga25vd24gcmVzaWR1YWwgaXNzdWUgaXMgdmVyaWZ5aW5nIHRoYXQgaXQgb25seSBoYXMgb25lIG9mIHRoZVxuICogb3B0aW9uYWwgcHJvcGVydGllcy5cbiAqXG4gKiBAcGFyYW0ge0V4aXRSdWxlfSBleGl0XG4gKi8kaOKAjV9vbmNlLmNvZXJjZUFtb3VudEtleXdvcmRSZWNvcmQoY29lcmNlQW1vdW50S2V5d29yZFJlY29yZCk7XG5jb25zdCBhc3NlcnRFeGl0PShleGl0KT0+XG5hc3NlcnQob3duS2V5cyhleGl0KS5sZW5ndGg9PT0xLFggYGV4aXQgJHtleGl0fSBzaG91bGQgb25seSBoYXZlIG9uZSBrZXlgKTtcblxuLyoqXG4gKiBjaGVjayB0aGF0IGtleXdvcmQgaXMgbm90IGluIGJvdGggJ3dhbnQnIGFuZCAnZ2l2ZScuXG4gKlxuICogQHBhcmFtIHtQcm9wb3NhbFJlY29yZFtcIndhbnRcIl19IHdhbnRcbiAqIEBwYXJhbSB7UHJvcG9zYWxSZWNvcmRbXCJnaXZlXCJdfSBnaXZlXG4gKi9cbmNvbnN0IGFzc2VydEtleXdvcmROb3RJbkJvdGg9KHdhbnQsZ2l2ZSk9PntcbmNvbnN0IHdhbnRLZXl3b3JkU2V0PW5ldyBTZXQob3duS2V5cyh3YW50KSk7XG5jb25zdCBnaXZlS2V5d29yZHM9b3duS2V5cyhnaXZlKTtcblxuZ2l2ZUtleXdvcmRzLmZvckVhY2goKGtleXdvcmQpPT57XG4hd2FudEtleXdvcmRTZXQuaGFzKGtleXdvcmQpfHxcbmFzc2VydC5mYWlsKFggYGEga2V5d29yZCBjYW5ub3QgYmUgaW4gYm90aCAnd2FudCcgYW5kICdnaXZlJ2ApO1xuIH0pO1xuIH07XG5cbi8qKlxuICogY2xlYW5Qcm9wb3NhbCBjaGVja3MgdGhlIGtleXMgYW5kIHZhbHVlcyBvZiB0aGUgcHJvcG9zYWwsIGluY2x1ZGluZ1xuICogdGhlIGtleXMgYW5kIHZhbHVlcyBvZiB0aGUgaW50ZXJuYWwgb2JqZWN0cy4gVGhlIHByb3Bvc2FsIG1heSBoYXZlXG4gKiB0aGUgZm9sbG93aW5nIGtleXM6IGBnaXZlYCwgYHdhbnRgLCBhbmQgYGV4aXRgLiBUaGVzZSBrZXlzIG1heSBiZVxuICogb21pdHRlZCBpbiB0aGUgYHByb3Bvc2FsYCBhcmd1bWVudCBwYXNzZWQgdG8gY2xlYW5Qcm9wb3NhbCwgYnV0XG4gKiBhbnl0aGluZyBvdGhlciB0aGFuIHRoZXNlIGtleXMgaXMgbm90IGFsbG93ZWQuIFRoZSB2YWx1ZXMgb2YgYGdpdmVgXG4gKiBhbmQgYHdhbnRgIG11c3QgYmUgXCJhbW91bnRLZXl3b3JkUmVjb3Jkc1wiLCBtZWFuaW5nIHRoYXQgdGhlIGtleXNcbiAqIG11c3QgYmUga2V5d29yZHMgYW5kIHRoZSB2YWx1ZXMgbXVzdCBiZSBhbW91bnRzLiBUaGUgdmFsdWUgb2ZcbiAqIGBleGl0YCwgaWYgcHJlc2VudCwgbXVzdCBiZSBhIHJlY29yZCBvZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBmb3JtczpcbiAqIGB7IHdhaXZlZDogbnVsbCB9YCBgeyBvbkRlbWFuZDogbnVsbCB9YCBgeyBhZnRlckRlYWRsaW5lOiB7IHRpbWVyXG4gKiA6VGltZXIsIGRlYWRsaW5lIDpiaWdpbnQgfSB9XG4gKlxuICogQHBhcmFtIHtQcm9wb3NhbH0gcHJvcG9zYWxcbiAqIEBwYXJhbSB7R2V0QXNzZXRLaW5kQnlCcmFuZH0gZ2V0QXNzZXRLaW5kQnlCcmFuZFxuICogQHJldHVybnMge1Byb3Bvc2FsUmVjb3JkfVxuICovXG5jb25zdCAgICAgICAgY2xlYW5Qcm9wb3NhbD0ocHJvcG9zYWwsZ2V0QXNzZXRLaW5kQnlCcmFuZCk9PntcbmFzc2VydFJlY29yZChwcm9wb3NhbCwncHJvcG9zYWwnKTtcbi8qIFdlIGZpbGwgaW4gdGhlIGRlZmF1bHQgdmFsdWVzIGlmIHRoZSBrZXlzIGFyZSBhYnNlbnQgb3IgdW5kZWZpbmVkLiovXG5jb25zdHtcbndhbnQ9aGFyZGVuKHt9KSxcbmdpdmU9aGFyZGVuKHt9KSxcbmV4aXQ9aGFyZGVuKHtvbkRlbWFuZDpudWxsfSksXG4uLi5yZXN0fT1cbnByb3Bvc2FsO1xub3duS2V5cyhyZXN0KS5sZW5ndGg9PT0wfHxcbmFzc2VydC5mYWlsKFxuWCBgJHtwcm9wb3NhbH0gLSBNdXN0IG9ubHkgaGF2ZSB3YW50OiwgZ2l2ZTosIGV4aXQ6IHByb3BlcnRpZXM6ICR7cmVzdH1gKTtcblxuXG5jb25zdCBjbGVhbmVkV2FudD1jb2VyY2VBbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZChcbndhbnQsXG5nZXRBc3NldEtpbmRCeUJyYW5kKTtcblxuY29uc3QgY2xlYW5lZEdpdmU9Y29lcmNlQW1vdW50S2V5d29yZFJlY29yZChnaXZlLGdldEFzc2V0S2luZEJ5QnJhbmQpO1xuXG5jb25zdCBjbGVhbmVkUHJvcG9zYWw9aGFyZGVuKHtcbndhbnQ6Y2xlYW5lZFdhbnQsXG5naXZlOmNsZWFuZWRHaXZlLFxuZXhpdH0pO1xuXG5maXQoY2xlYW5lZFByb3Bvc2FsLEZ1bGxQcm9wb3NhbFNoYXBlLCdwcm9wb3NhbCcpO1xuYXNzZXJ0RXhpdChleGl0KTtcbmFzc2VydEtleXdvcmROb3RJbkJvdGgoY2xlYW5lZFdhbnQsY2xlYW5lZEdpdmUpO1xucmV0dXJuIGNsZWFuZWRQcm9wb3NhbDtcbiB9OyRo4oCNX29uY2UuY2xlYW5Qcm9wb3NhbChjbGVhblByb3Bvc2FsKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJNQVhfS0VZV09SRF9MRU5HVEgiOlsiTUFYX0tFWVdPUkRfTEVOR1RIIl0sImFzc2VydEtleXdvcmROYW1lIjpbImFzc2VydEtleXdvcmROYW1lIl0sImNsZWFuS2V5d29yZHMiOlsiY2xlYW5LZXl3b3JkcyJdLCJjb2VyY2VBbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZCI6WyJjb2VyY2VBbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZCJdLCJjb2VyY2VBbW91bnRLZXl3b3JkUmVjb3JkIjpbImNvZXJjZUFtb3VudEtleXdvcmRSZWNvcmQiXSwiY2xlYW5Qcm9wb3NhbCI6WyJjbGVhblByb3Bvc2FsIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGeLEXurEAAAqxAAADQAAABAYWdvcmljL3pvZS12MC4yNS41L3NyYy9jb250cmFjdEZhY2V0L29mZmVyU2FmZXR5LmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvZXJ0cCJdLCJleHBvcnRzIjpbImlzT2ZmZXJTYWZlIiwic2F0aXNmaWVzV2FudCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBBbW91bnRNYXRoOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvZXJ0cFwiLCBbW1wiQW1vdW50TWF0aFwiLCBbJGjigI1fYSA9PiAoQW1vdW50TWF0aCA9ICRo4oCNX2EpXV1dXV0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShpc09mZmVyU2FmZSwgJ25hbWUnLCB7dmFsdWU6IFwiaXNPZmZlclNhZmVcIn0pOyRo4oCNX29uY2UuaXNPZmZlclNhZmUoaXNPZmZlclNhZmUpOyAgIFxuXG5cblxuLyoqXG4gKiBIZWxwZXIgdG8gcGVyZm9ybSBzYXRpc2ZpZXNXYW50IGFuZCBzYXRpc2ZpZXNHaXZlLiBJc1xuICogYWxsb2NhdGlvbkFtb3VudCBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gcmVxdWlyZWRBbW91bnQgZm9yIGV2ZXJ5XG4gKiBrZXl3b3JkIG9mIGdpdmVPcldhbnQ/XG4gKlxuICogVG8gcHJlcGFyZSBmb3IgbXVsdGlwbGVzLCBzYXRpc2ZpZXNXYW50IGFuZCBzYXRpc2ZpZXNHaXZlIHJldHVybiAwIG9yIDEuXG4gKiBpc09mZmVyU2FmZSB3aWxsIHN0aWxsIGJlIGJvb2xlYW4uIFdoZW4gd2UgaGF2ZSBNdWx0aXBsZXMsIHNhdGlzZmllc1dhbnQgYW5kXG4gKiBzYXRpc2ZpZXNHaXZlIHdpbGwgdGVsbCBob3cgbWFueSB0aW1lcyB0aGUgb2ZmZXIgd2FzIG1hdGNoZWQuXG4gKlxuICogQHBhcmFtIHtBbW91bnRLZXl3b3JkUmVjb3JkfSBnaXZlT3JXYW50XG4gKiBAcGFyYW0ge0Ftb3VudEtleXdvcmRSZWNvcmR9IGFsbG9jYXRpb25cbiAqIEByZXR1cm5zIHswfDF9XG4gKi9cbmNvbnN0IHNhdGlzZmllc0ludGVybmFsPShnaXZlT3JXYW50PXt9LGFsbG9jYXRpb24pPT57XG5jb25zdCBpc0dURUJ5S2V5d29yZD0oW2tleXdvcmQscmVxdWlyZWRBbW91bnRdKT0+e1xuLyogSWYgdGhlcmUgaXMgbm8gYWxsb2NhdGlvbiBmb3IgYSBrZXl3b3JkLCB3ZSBrbm93IHRoZSBnaXZlT3JXYW50Ki9cbi8qIGlzIG5vdCBzYXRpc2ZpZWQgd2l0aG91dCBjaGVja2luZyBmdXJ0aGVyLiovXG5pZihhbGxvY2F0aW9uW2tleXdvcmRdPT09dW5kZWZpbmVkKXtcbnJldHVybiAwO1xuIH1cbmNvbnN0IGFsbG9jYXRpb25BbW91bnQ9YWxsb2NhdGlvbltrZXl3b3JkXTtcbnJldHVybiBBbW91bnRNYXRoLmlzR1RFKGFsbG9jYXRpb25BbW91bnQscmVxdWlyZWRBbW91bnQpPzE6MDtcbiB9O1xucmV0dXJuIE9iamVjdC5lbnRyaWVzKGdpdmVPcldhbnQpLmV2ZXJ5KGlzR1RFQnlLZXl3b3JkKT8xOjA7XG4gfTtcblxuLyoqXG4gKiBGb3IgdGhpcyBhbGxvY2F0aW9uIHRvIHNhdGlzZnkgd2hhdCB0aGUgdXNlciB3YW50ZWQsIHRoZWlyXG4gKiBhbGxvY2F0ZWQgYW1vdW50cyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBwcm9wb3NhbC53YW50LlxuICpcbiAqIEBwYXJhbSB7UHJvcG9zYWxSZWNvcmR9IHByb3Bvc2FsIC0gdGhlIHJ1bGVzIHRoYXQgYWNjb21wYW5pZWQgdGhlXG4gKiBlc2Nyb3cgb2YgcGF5bWVudHMgdGhhdCBkaWN0YXRlIHdoYXQgdGhlIHVzZXIgZXhwZWN0ZWQgdG8gZ2V0IGJhY2tcbiAqIGZyb20gWm9lLiBBIHByb3Bvc2FsIGlzIGEgcmVjb3JkIHdpdGgga2V5cyBgZ2l2ZWAsIGB3YW50YCwgYW5kXG4gKiBgZXhpdGAuIGBnaXZlYCBhbmQgYHdhbnRgIGFyZSByZWNvcmRzIHdpdGgga2V5d29yZHMgYXMga2V5cyBhbmRcbiAqIGFtb3VudHMgYXMgdmFsdWVzLiBUaGUgcHJvcG9zYWwgaXMgYSB1c2VyJ3MgdW5kZXJzdGFuZGluZyBvZiB0aGVcbiAqIGNvbnRyYWN0IHRoYXQgdGhleSBhcmUgZW50ZXJpbmcgd2hlbiB0aGV5IG1ha2UgYW4gb2ZmZXIuXG4gKiBAcGFyYW0ge0Ftb3VudEtleXdvcmRSZWNvcmR9IGFsbG9jYXRpb24gLSBhIHJlY29yZCB3aXRoIGtleXdvcmRzXG4gKiBhcyBrZXlzIGFuZCBhbW91bnRzIGFzIHZhbHVlcy4gVGhlc2UgYW1vdW50cyBhcmUgdGhlIHJlYWxsb2NhdGlvblxuICogdG8gYmUgZ2l2ZW4gdG8gYSB1c2VyLlxuICovXG5jb25zdCBzYXRpc2ZpZXNXYW50PShwcm9wb3NhbCxhbGxvY2F0aW9uKT0+XG5zYXRpc2ZpZXNJbnRlcm5hbChwcm9wb3NhbC53YW50LGFsbG9jYXRpb24pO1xuXG4vKipcbiAqIEZvciB0aGlzIGFsbG9jYXRpb24gdG8gY291bnQgYXMgYSBmdWxsIHJlZnVuZCwgdGhlIGFsbG9jYXRlZFxuICogYW1vdW50cyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB3aGF0IHdhcyBvcmlnaW5hbGx5XG4gKiBvZmZlcmVkIChwcm9wb3NhbC5naXZlKS5cbiAqXG4gKiBAcGFyYW0gIHtQcm9wb3NhbFJlY29yZH0gcHJvcG9zYWwgLSB0aGUgcnVsZXMgdGhhdCBhY2NvbXBhbmllZCB0aGVcbiAqIGVzY3JvdyBvZiBwYXltZW50cyB0aGF0IGRpY3RhdGUgd2hhdCB0aGUgdXNlciBleHBlY3RlZCB0byBnZXQgYmFja1xuICogZnJvbSBab2UuIEEgcHJvcG9zYWwgaXMgYSByZWNvcmQgd2l0aCBrZXlzIGBnaXZlYCwgYHdhbnRgLCBhbmRcbiAqIGBleGl0YC4gYGdpdmVgIGFuZCBgd2FudGAgYXJlIHJlY29yZHMgd2l0aCBrZXl3b3JkcyBhcyBrZXlzIGFuZFxuICogYW1vdW50cyBhcyB2YWx1ZXMuIFRoZSBwcm9wb3NhbCBpcyBhIHVzZXIncyB1bmRlcnN0YW5kaW5nIG9mIHRoZVxuICogY29udHJhY3QgdGhhdCB0aGV5IGFyZSBlbnRlcmluZyB3aGVuIHRoZXkgbWFrZSBhbiBvZmZlci5cbiAqIEBwYXJhbSAge0Ftb3VudEtleXdvcmRSZWNvcmR9IGFsbG9jYXRpb24gLSBhIHJlY29yZCB3aXRoIGtleXdvcmRzXG4gKiBhcyBrZXlzIGFuZCBhbW91bnRzIGFzIHZhbHVlcy4gVGhlc2UgYW1vdW50cyBhcmUgdGhlIHJlYWxsb2NhdGlvblxuICogdG8gYmUgZ2l2ZW4gdG8gYSB1c2VyLlxuICovJGjigI1fb25jZS5zYXRpc2ZpZXNXYW50KHNhdGlzZmllc1dhbnQpO1xuY29uc3Qgc2F0aXNmaWVzR2l2ZT0ocHJvcG9zYWwsYWxsb2NhdGlvbik9Plxuc2F0aXNmaWVzSW50ZXJuYWwocHJvcG9zYWwuZ2l2ZSxhbGxvY2F0aW9uKTtcblxuLyoqXG4gKiBgaXNPZmZlclNhZmVgIGNoZWNrcyBvZmZlciBzYWZldHkgZm9yIGEgc2luZ2xlIG9mZmVyLlxuICpcbiAqIE5vdGU6IFRoaXMgaW1wbGVtZW50YXRpb24gY2hlY2tzIHdoZXRoZXIgd2UgZnVsbHkgc2F0aXNmeVxuICogYHByb3Bvc2FsLmdpdmVgIChnaXZpbmcgYSByZWZ1bmQpIG9yIHdoZXRoZXIgd2UgZnVsbHkgc2F0aXNmeVxuICogYHByb3Bvc2FsLndhbnRgLiBCb3RoIGNhbiBiZSBmdWxseSBzYXRpc2ZpZWQuXG4gKlxuICogQHBhcmFtICB7UHJvcG9zYWxSZWNvcmR9IHByb3Bvc2FsIC0gdGhlIHJ1bGVzIHRoYXQgYWNjb21wYW5pZWQgdGhlXG4gKiBlc2Nyb3cgb2YgcGF5bWVudHMgdGhhdCBkaWN0YXRlIHdoYXQgdGhlIHVzZXIgZXhwZWN0ZWQgdG8gZ2V0IGJhY2tcbiAqIGZyb20gWm9lLiBBIHByb3Bvc2FsIGlzIGEgcmVjb3JkIHdpdGgga2V5cyBgZ2l2ZWAsIGB3YW50YCwgYW5kXG4gKiBgZXhpdGAuIGBnaXZlYCBhbmQgYHdhbnRgIGFyZSByZWNvcmRzIHdpdGgga2V5d29yZHMgYXMga2V5cyBhbmRcbiAqIGFtb3VudHMgYXMgdmFsdWVzLiBUaGUgcHJvcG9zYWwgaXMgYSB1c2VyJ3MgdW5kZXJzdGFuZGluZyBvZiB0aGVcbiAqIGNvbnRyYWN0IHRoYXQgdGhleSBhcmUgZW50ZXJpbmcgd2hlbiB0aGV5IG1ha2UgYW4gb2ZmZXIuXG4gKiBAcGFyYW0gIHtBbW91bnRLZXl3b3JkUmVjb3JkfSBhbGxvY2F0aW9uIC0gYSByZWNvcmQgd2l0aCBrZXl3b3Jkc1xuICogYXMga2V5cyBhbmQgYW1vdW50cyBhcyB2YWx1ZXMuIFRoZXNlIGFtb3VudHMgYXJlIHRoZSByZWFsbG9jYXRpb25cbiAqIHRvIGJlIGdpdmVuIHRvIGEgdXNlci5cbiAqL1xuZnVuY3Rpb24gaXNPZmZlclNhZmUocHJvcG9zYWwsYWxsb2NhdGlvbil7XG5yZXR1cm4oXG5zYXRpc2ZpZXNHaXZlKHByb3Bvc2FsLGFsbG9jYXRpb24pPjB8fFxuc2F0aXNmaWVzV2FudChwcm9wb3NhbCxhbGxvY2F0aW9uKT4wKTtcblxuIH1cblxuaGFyZGVuKGlzT2ZmZXJTYWZlKTtcbmhhcmRlbihzYXRpc2ZpZXNXYW50KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJzYXRpc2ZpZXNXYW50IjpbInNhdGlzZmllc1dhbnQiXSwiaXNPZmZlclNhZmUiOlsiaXNPZmZlclNhZmUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA6ZhB6vIjAADyIwAALgAAAEBhZ29yaWMvem9lLXYwLjI1LjUvc3JjL2NvbnRyYWN0RmFjZXQvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG4vKiBYWFggY2FuIGJlIHRpZ2h0ZXIgdGhhbiAnYW55JyovXG4vKipcbiAqIEB0eXBlZGVmIHthbnl9IENvbXBsZXRpb25cbiAqIEFueSBwYXNzYWJsZSBub24tdGhlbmFibGUuIE9mdGVuIGFuIGV4cGxhbmF0b3J5IHN0cmluZy5cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBaQ0ZNYWtlRW1wdHlTZWF0S2l0XG4gKiBAcGFyYW0ge0V4aXRSdWxlPX0gZXhpdFxuICogQHJldHVybnMge1pjZlNlYXRLaXR9XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge29iamVjdH0gW0NUPVJlY29yZDxzdHJpbmcsIHVua25vd24+XSBDb250cmFjdCdzIGN1c3RvbSB0ZXJtc1xuICogQHR5cGVkZWYge29iamVjdH0gWkNGIFpvZSBDb250cmFjdCBGYWNldFxuICpcbiAqIFRoZSBab2UgaW50ZXJmYWNlIHNwZWNpZmljIHRvIGEgY29udHJhY3QgaW5zdGFuY2UuIFRoZSBab2UgQ29udHJhY3RcbiAqIEZhY2V0IGlzIGFuIEFQSSBvYmplY3QgdXNlZCBieSBydW5uaW5nIGNvbnRyYWN0IGluc3RhbmNlcyB0byBhY2Nlc3NcbiAqIHRoZSBab2Ugc3RhdGUgZm9yIHRoYXQgaW5zdGFuY2UuIFRoZSBab2UgQ29udHJhY3QgRmFjZXQgaXMgYWNjZXNzZWRcbiAqIHN5bmNocm9ub3VzbHkgZnJvbSB3aXRoaW4gdGhlIGNvbnRyYWN0LCBhbmQgdXN1YWxseSBpcyByZWZlcnJlZCB0b1xuICogaW4gY29kZSBhcyB6Y2YuXG4gKlxuICogQHByb3BlcnR5IHtSZWFsbG9jYXRlfSByZWFsbG9jYXRlIC0gcmVhbGxvY2F0ZSBhbW91bnRzIGFtb25nIHNlYXRzXG4gKiBAcHJvcGVydHkgeyhrZXl3b3JkOiBLZXl3b3JkKSA9PiB2b2lkfSBhc3NlcnRVbmlxdWVLZXl3b3JkIC0gY2hlY2tcbiAqIHdoZXRoZXIgYSBrZXl3b3JkIGlzIHZhbGlkIGFuZCB1bmlxdWUgYW5kIGNvdWxkIGJlIGFkZGVkIGluXG4gKiBgc2F2ZUlzc3VlcmBcbiAqIEBwcm9wZXJ0eSB7U2F2ZUlzc3Vlcn0gc2F2ZUlzc3VlciAtIHNhdmUgYW4gaXNzdWVyIHRvIFpDRiBhbmQgWm9lXG4gKiBhbmQgZ2V0IHRoZSBBbW91bnRNYXRoIGFuZCBicmFuZCBzeW5jaHJvbm91c2x5IGFjY2Vzc2libGUgYWZ0ZXJcbiAqIHNhdmluZ1xuICogQHByb3BlcnR5IHtNYWtlSW52aXRhdGlvbn0gbWFrZUludml0YXRpb25cbiAqIEBwcm9wZXJ0eSB7KGNvbXBsZXRpb246IENvbXBsZXRpb24pID0+IHZvaWR9IHNodXRkb3duXG4gKiBAcHJvcGVydHkge1NodXRkb3duV2l0aEZhaWx1cmV9IHNodXRkb3duV2l0aEZhaWx1cmVcbiAqIEBwcm9wZXJ0eSB7QXNzZXJ0fSBhc3NlcnRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gRVJlZjxab2VTZXJ2aWNlPn0gZ2V0Wm9lU2VydmljZVxuICogQHByb3BlcnR5IHsoKSA9PiBJc3N1ZXJ9IGdldEludml0YXRpb25Jc3N1ZXJcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gU3RhbmRhcmRUZXJtcyAmIENUfSBnZXRUZXJtc1xuICogQHByb3BlcnR5IHsoaXNzdWVyOiBJc3N1ZXIpID0+IEJyYW5kfSBnZXRCcmFuZEZvcklzc3VlclxuICogQHByb3BlcnR5IHsoYnJhbmQ6IEJyYW5kKSA9PiBJc3N1ZXJ9IGdldElzc3VlckZvckJyYW5kXG4gKiBAcHJvcGVydHkge0dldEFzc2V0S2luZEJ5QnJhbmR9IGdldEFzc2V0S2luZFxuICogQHByb3BlcnR5IHs8SyBleHRlbmRzIEFzc2V0S2luZCA9ICduYXQnPihrZXl3b3JkOiBLZXl3b3JkLCBhc3NldEtpbmQ/OiBLLCBkaXNwbGF5SW5mbz86IEFkZGl0aW9uYWxEaXNwbGF5SW5mbykgPT4gUHJvbWlzZTxaQ0ZNaW50PEs+Pn0gbWFrZVpDRk1pbnRcbiAqIEBwcm9wZXJ0eSB7WkNGUmVnaXN0ZXJGZWVNaW50fSByZWdpc3RlckZlZU1pbnRcbiAqIEBwcm9wZXJ0eSB7WkNGTWFrZUVtcHR5U2VhdEtpdH0gbWFrZUVtcHR5U2VhdEtpdFxuICogQHByb3BlcnR5IHtTZXRUZXN0SmlnfSBzZXRUZXN0SmlnXG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8dm9pZD59IHN0b3BBY2NlcHRpbmdPZmZlcnNcbiAqIEBwcm9wZXJ0eSB7KHN0cmluZ3M6IEFycmF5PHN0cmluZz4pID0+IHZvaWR9IHNldE9mZmVyRmlsdGVyXG4gKiBAcHJvcGVydHkgeygpID0+IEluc3RhbmNlfSBnZXRJbnN0YW5jZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyhzZWF0MTogWkNGU2VhdCwgc2VhdDI6IFpDRlNlYXQsIC4uLnNlYXRSZXN0OlxuICogQXJyYXk8WkNGU2VhdD4pID0+IHZvaWR9IFJlYWxsb2NhdGVcbiAqXG4gKiBUaGUgY29udHJhY3QgY2FuIHJlYWxsb2NhdGUgb3ZlciBzZWF0cywgd2hpY2ggY29tbWl0cyB0aGUgc3RhZ2VkXG4gKiBhbGxvY2F0aW9uIGZvciBlYWNoIHNlYXQuIE9uIGNvbW1pdCwgdGhlIHN0YWdlZCBhbGxvY2F0aW9uIGJlY29tZXNcbiAqIHRoZSBjdXJyZW50IGFsbG9jYXRpb24gYW5kIHRoZSBzdGFnZWQgYWxsb2NhdGlvbiBpcyBkZWxldGVkLlxuICpcbiAqIFRoZSByZWFsbG9jYXRpb24gd2lsbCBvbmx5IHN1Y2NlZWQgaWYgdGhlIHJlYWxsb2NhdGlvbiAxKSBjb25zZXJ2ZXNcbiAqIHJpZ2h0cyAodGhlIGFtb3VudHMgc3BlY2lmaWVkIGhhdmUgdGhlIHNhbWUgdG90YWwgdmFsdWUgYXMgdGhlXG4gKiBjdXJyZW50IHRvdGFsIGFtb3VudCksIGFuZCAyKSBpcyAnb2ZmZXItc2FmZScgZm9yIGFsbCBwYXJ0aWVzXG4gKiBpbnZvbHZlZC4gQWxsIHNlYXRzIHRoYXQgaGF2ZSBzdGFnZWQgYWxsb2NhdGlvbnMgbXVzdCBiZSBpbmNsdWRlZFxuICogYXMgYXJndW1lbnRzIHRvIGByZWFsbG9jYXRlYCwgb3IgYW4gZXJyb3IgaXMgdGhyb3duLiBBZGRpdGlvbmFsbHksXG4gKiBhbiBlcnJvciBpcyB0aHJvd24gaWYgYW55IHNlYXRzIGluY2x1ZGVkIGluIGByZWFsbG9jYXRlYCBkbyBub3RcbiAqIGhhdmUgYSBzdGFnZWQgYWxsb2NhdGlvbi5cbiAqXG4gKiBUaGUgcmVhbGxvY2F0aW9uIGlzIHBhcnRpYWwsIG1lYW5pbmcgdGhhdCBpdCBhcHBsaWVzIG9ubHkgdG8gdGhlXG4gKiBzZWF0cyBwYXNzZWQgaW4gYXMgYXJndW1lbnRzLiBCeSBpbmR1Y3Rpb24sIGlmIHJpZ2h0cyBjb25zZXJ2YXRpb25cbiAqIGFuZCBvZmZlciBzYWZldHkgaG9sZCBiZWZvcmUsIHRoZXkgd2lsbCBob2xkIGFmdGVyIGEgc2FmZVxuICogcmVhbGxvY2F0aW9uLCBldmVuIHRob3VnaCB3ZSBvbmx5IHJlLXZhbGlkYXRlIGZvciB0aGUgc2VhdHMgd2hvc2VcbiAqIGFsbG9jYXRpb25zIHdpbGwgY2hhbmdlLiBTaW5jZSByaWdodHMgYXJlIGNvbnNlcnZlZCBmb3IgdGhlIGNoYW5nZSxcbiAqIG92ZXJhbGwgcmlnaHRzIHdpbGwgYmUgdW5jaGFuZ2VkLCBhbmQgYSByZWFsbG9jYXRpb24gY2FuIG9ubHlcbiAqIGVmZmVjdCBvZmZlciBzYWZldHkgZm9yIHNlYXRzIHdob3NlIGFsbG9jYXRpb25zIGNoYW5nZS5cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBTYXZlSXNzdWVyXG4gKlxuICogSW5mb3JtcyBab2UgYWJvdXQgYW4gaXNzdWVyIGFuZCByZXR1cm5zIGEgcHJvbWlzZSBmb3IgYWNrbm93bGVkZ2luZ1xuICogd2hlbiB0aGUgaXNzdWVyIGlzIGFkZGVkIGFuZCByZWFkeS5cbiAqXG4gKiBAcGFyYW0ge0VSZWY8SXNzdWVyPn0gaXNzdWVyUCBQcm9taXNlIGZvciBpc3N1ZXJcbiAqIEBwYXJhbSB7S2V5d29yZH0ga2V5d29yZCBLZXl3b3JkIGZvciBhZGRlZCBpc3N1ZXJcbiAqIEByZXR1cm5zIHtQcm9taXNlPElzc3VlclJlY29yZD59IElzc3VlciBpcyBhZGRlZCBhbmQgcmVhZHlcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHs8UmVzdWx0PihcbiAqICAgb2ZmZXJIYW5kbGVyOiBPZmZlckhhbmRsZXI8UmVzdWx0PixcbiAqICAgZGVzY3JpcHRpb246IHN0cmluZyxcbiAqICAgY3VzdG9tUHJvcGVydGllcz86IG9iamVjdCxcbiAqICAgcHJvcG9zYWxTaGFwZT86IFBhdHRlcm4sXG4gKiApID0+IFByb21pc2U8SW52aXRhdGlvbjxBd2FpdGVkPFJlc3VsdD4+PlxuICogfSBNYWtlSW52aXRhdGlvblxuICpcbiAqIE1ha2UgYSBjcmVkaWJsZSBab2UgaW52aXRhdGlvbiBmb3IgYSBwYXJ0aWN1bGFyIHNtYXJ0IGNvbnRyYWN0XG4gKiBpbmRpY2F0ZWQgYnkgdGhlIGBpbnN0YW5jZWAgaW4gdGhlIGRldGFpbHMgb2YgdGhlIGludml0YXRpb24uIFpvZVxuICogYWxzbyBwdXRzIHRoZSBgaW5zdGFsbGF0aW9uYCBhbmQgYSB1bmlxdWUgYGhhbmRsZWAgaW4gdGhlIGRldGFpbHNcbiAqIG9mIHRoZSBpbnZpdGF0aW9uLiBUaGUgY29udHJhY3QgbXVzdCBwcm92aWRlIGEgYGRlc2NyaXB0aW9uYCBmb3JcbiAqIHRoZSBpbnZpdGF0aW9uIGFuZCBzaG91bGQgaW5jbHVkZSB3aGF0ZXZlciBpbmZvcm1hdGlvbiBpcyBuZWNlc3NhcnlcbiAqIGZvciBhIHBvdGVudGlhbCBidXllciBvZiB0aGUgaW52aXRhdGlvbiB0byBrbm93IHdoYXQgdGhleSBhcmVcbiAqIGdldHRpbmcgaW4gdGhlIGBjdXN0b21Qcm9wZXJ0aWVzYC4gYGN1c3RvbVByb3BlcnRpZXNgIHdpbGwgYmVcbiAqIHBsYWNlZCBpbiB0aGUgZGV0YWlscyBvZiB0aGUgaW52aXRhdGlvbi5cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBaQ0ZSZWdpc3RlckZlZU1pbnRcbiAqIEBwYXJhbSB7S2V5d29yZH0ga2V5d29yZFxuICogQHBhcmFtIHtGZWVNaW50QWNjZXNzfSBhbGxlZ2VkRmVlTWludEFjY2VzcyAtIGFuIG9iamVjdCB0aGF0XG4gKiBwdXJwb3J0cyB0byBiZSB0aGUgb2JqZWN0IHRoYXQgZ3JhbnRzIGFjY2VzcyB0byB0aGUgZmVlIG1pbnRcbiAqIEByZXR1cm5zIHtQcm9taXNlPFpDRk1pbnQ8J25hdCc+Pn1cbiAqL1xuXG4vKipcbiAqIFByb3ZpZGUgYSBqaWcgb2JqZWN0IGZvciB0ZXN0aW5nIHB1cnBvc2VzIG9ubHkuXG4gKlxuICogVGhlIGNvbnRyYWN0IGNvZGUgcHJvdmlkZXMgYSBjYWxsYmFjayB3aG9zZSByZXR1cm4gcmVzdWx0IHdpbGxcbiAqIGJlIG1hZGUgYXZhaWxhYmxlIHRvIHRoZSB0ZXN0IHRoYXQgc3RhcnRlZCB0aGlzIGNvbnRyYWN0LiBUaGVcbiAqIHN1cHBsaWVkIGNhbGxiYWNrIHdpbGwgb25seSBiZSBjYWxsZWQgaW4gYSB0ZXN0aW5nIGNvbnRleHQsXG4gKiBuZXZlciBpbiBwcm9kdWN0aW9uOyBpLmUuLCBpdCBpcyBvbmx5IGNhbGxlZCBpZiBgdGVzdEppZ1NldHRlcmBcbiAqIHdhcyBzdXBwbGllZC5cbiAqXG4gKiBJZiBubywgYHRlc3RGbmAgaXMgc3VwcGxpZWQsIHRoZW4gYW4gZW1wdHkgamlnIHdpbGwgYmUgdXNlZC5cbiAqIEFuIGFkZGl0aW9uYWwgYHpjZmAgcHJvcGVydHkgc2V0IHRvIHRoZSBjdXJyZW50IENvbnRyYWN0RmFjZXRcbiAqIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIHJldHVybmVkIGppZyBvYmplY3QgKG92ZXJyaWRpbmcgYW55XG4gKiBwcm92aWRlZCBieSB0aGUgYHRlc3RGbmApLlxuICpcbiAqIEBjYWxsYmFjayBTZXRUZXN0SmlnXG4gKiBAcGFyYW0geygpID0+IFJlY29yZDxzdHJpbmcsIHVua25vd24+fSB0ZXN0Rm5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFpDRk1pbnRNaW50R2FpbnNcbiAqIEBwYXJhbSB7QW1vdW50S2V5d29yZFJlY29yZH0gZ2FpbnNcbiAqIEBwYXJhbSB7WkNGU2VhdD19IHpjZlNlYXRcbiAqIEByZXR1cm5zIHtaQ0ZTZWF0fVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFpDRk1pbnRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gSXNzdWVyUmVjb3JkPEs+fSBnZXRJc3N1ZXJSZWNvcmRcbiAqIEBwcm9wZXJ0eSB7WkNGTWludE1pbnRHYWluc30gbWludEdhaW5zXG4gKiBBbGwgdGhlIGFtb3VudHMgaW4gZ2FpbnMgbXVzdCBiZSBvZiB0aGlzIFpDRk1pbnQncyBicmFuZC5cbiAqIFRoZSBnYWlucycga2V5d29yZHMgYXJlIGluIHRoZSBuYW1lc3BhY2Ugb2YgdGhhdCBzZWF0LlxuICogQWRkIHRoZSBnYWlucyB0byB0aGF0IHNlYXQncyBhbGxvY2F0aW9uLlxuICogVGhlIHJlc3VsdGluZyBzdGF0ZSBtdXN0IGJlIG9mZmVyIHNhZmUuIChDdXJyZW50bHksIGluY3JlYXNpbmcgYXNzZXRzIGNhblxuICogbmV2ZXIgdmlvbGF0ZSBvZmZlciBzYWZldHkgYW55d2F5LilcbiAqXG4gKiBNaW50IHRoYXQgYW1vdW50IG9mIGFzc2V0cyBpbnRvIHRoZSBwb29sZWQgcHVyc2UuXG4gKiBJZiBhIHNlYXQgaXMgcHJvdmlkZWQsIGl0IGlzIHJldHVybmVkLiBPdGhlcndpc2UgYSBuZXcgc2VhdCBpc1xuICogcmV0dXJuZWQuXG4gKiBUT0RPIHVuaW1wbGVtZW50ZWRcbiAqIFRoaXMgY3JlYXRpb24tb24tZGVtYW5kIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQuXG4gKlxuICogQHByb3BlcnR5IHsobG9zc2VzOiBBbW91bnRLZXl3b3JkUmVjb3JkLFxuICogICAgICAgICAgICAgemNmU2VhdDogWkNGU2VhdCxcbiAqICAgICAgICAgICAgKSA9PiB2b2lkfSBidXJuTG9zc2VzXG4gKiBBbGwgdGhlIGFtb3VudHMgaW4gbG9zc2VzIG11c3QgYmUgb2YgdGhpcyBaQ0ZNaW50J3MgYnJhbmQuXG4gKiBUaGUgbG9zc2VzJyBrZXl3b3JkcyBhcmUgaW4gdGhlIG5hbWVzcGFjZSBvZiB0aGF0IHNlYXQuXG4gKiBTdWJ0cmFjdCBsb3NzZXMgZnJvbSB0aGF0IHNlYXQncyBhbGxvY2F0aW9uLlxuICogVGhlIHJlc3VsdGluZyBzdGF0ZSBtdXN0IGJlIG9mZmVyIHNhZmUuXG4gKlxuICogQnVybiB0aGF0IGFtb3VudCBvZiBhc3NldHMgZnJvbSB0aGUgcG9vbGVkIHB1cnNlLlxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFpDRlNlYXRGYWlsXG4gKlxuICogZmFpbCBjYWxsZWQgd2l0aCB0aGUgcmVhc29uIGZvciB0aGlzIGZhaWx1cmUsIHdoZXJlIHJlYXNvbiBpc1xuICogbm9ybWFsbHkgYW4gaW5zdGFuY2VvZiBFcnJvci5cbiAqIEBwYXJhbSB7RXJyb3J9IHJlYXNvblxuICogQHJldHVybnMge0Vycm9yfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFpDRkdldEFtb3VudEFsbG9jYXRlZFxuICogVGhlIGJyYW5kIGlzIHVzZWQgZm9yIGZpbGxpbmcgaW4gYW4gZW1wdHkgYW1vdW50IGlmIHRoZSBga2V5d29yZGBcbiAqIGlzIG5vdCBwcmVzZW50IGluIHRoZSBhbGxvY2F0aW9uXG4gKiBAcGFyYW0ge0tleXdvcmR9IGtleXdvcmRcbiAqIEBwYXJhbSB7QnJhbmQ9fSBicmFuZFxuICogQHJldHVybnMge0Ftb3VudH1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFpDRlNlYXRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gdm9pZH0gZXhpdFxuICogQHByb3BlcnR5IHtaQ0ZTZWF0RmFpbH0gZmFpbFxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPE5vdGlmaWVyPEFsbG9jYXRpb24+Pn0gZ2V0Tm90aWZpZXJcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gYm9vbGVhbn0gaGFzRXhpdGVkXG4gKiBAcHJvcGVydHkgeygpID0+IFByb3Bvc2FsUmVjb3JkfSBnZXRQcm9wb3NhbFxuICogQHByb3BlcnR5IHtaQ0ZHZXRBbW91bnRBbGxvY2F0ZWR9IGdldEFtb3VudEFsbG9jYXRlZFxuICogQHByb3BlcnR5IHsoKSA9PiBBbGxvY2F0aW9ufSBnZXRDdXJyZW50QWxsb2NhdGlvblxuICogQHByb3BlcnR5IHsoKSA9PiBBbGxvY2F0aW9ufSBnZXRTdGFnZWRBbGxvY2F0aW9uXG4gKiBAcHJvcGVydHkgeygpID0+IGJvb2xlYW59IGhhc1N0YWdlZEFsbG9jYXRpb25cbiAqIEBwcm9wZXJ0eSB7KG5ld0FsbG9jYXRpb246IEFsbG9jYXRpb24pID0+IGJvb2xlYW59IGlzT2ZmZXJTYWZlXG4gKiBAcHJvcGVydHkgeyhhbW91bnRLZXl3b3JkUmVjb3JkOiBBbW91bnRLZXl3b3JkUmVjb3JkKSA9PiBBbW91bnRLZXl3b3JkUmVjb3JkfSBpbmNyZW1lbnRCeVxuICogQHByb3BlcnR5IHsoYW1vdW50S2V5d29yZFJlY29yZDogQW1vdW50S2V5d29yZFJlY29yZCkgPT4gQW1vdW50S2V5d29yZFJlY29yZH0gZGVjcmVtZW50QnlcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gdm9pZH0gY2xlYXJcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHt7IHpjZlNlYXQ6IFpDRlNlYXQsIHVzZXJTZWF0OiBFUmVmPFVzZXJTZWF0Pn19IFpjZlNlYXRLaXRcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7b2JqZWN0fSBPUiBPZmZlciByZXN1bHRzXG4gKiBAdHlwZWRlZiB7KHNlYXQ6IFpDRlNlYXQsIG9mZmVyQXJncz86IG9iamVjdCkgPT4gT1J9IEhhbmRsZU9mZmVyXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge29iamVjdH0gW09SPXVua25vd25dIE9mZmVyIHJlc3VsdHNcbiAqIEB0eXBlZGVmIHtIYW5kbGVPZmZlcjxPUj4gfCB7IGhhbmRsZTogSGFuZGxlT2ZmZXI8T1I+IH19IE9mZmVySGFuZGxlclxuICovXG5cbi8qKlxuICogQVBJIGZvciBhIGNvbnRyYWN0IHN0YXJ0IGZ1bmN0aW9uLlxuICpcbiAqIENBVkVBVDogYXNzdW1lcyBzeW5jaHJvbm91c1xuICpcbiAqIEBkZXByZWNhdGVkIGRlZmluZSBmdW5jdGlvbiBzaWduYXR1cmUgZGlyZWN0bHlcbiAqXG4gKiBAdGVtcGxhdGUge29iamVjdH0gW1BGPWFueV0gUHVibGljIGZhY2V0XG4gKiBAdGVtcGxhdGUge29iamVjdH0gW0NGPWFueV0gQ3JlYXRvciBmYWNldFxuICogQHRlbXBsYXRlIHtvYmplY3R9IFtDVD1hbnldIEN1c3RvbSB0ZXJtc1xuICogQHRlbXBsYXRlIHtvYmplY3R9IFtQQT1hbnldIFByaXZhdGUgYXJnc1xuICogQGNhbGxiYWNrIENvbnRyYWN0U3RhcnRGblxuICogQHBhcmFtIHtaQ0Y8Q1Q+fSB6Y2ZcbiAqIEBwYXJhbSB7UEF9IHByaXZhdGVBcmdzXG4gKiBAcmV0dXJucyB7Q29udHJhY3RTdGFydEZuUmVzdWx0PFBGLCBDRj59XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgUEYgUHVibGljIGZhY2V0XG4gKiBAdGVtcGxhdGUgQ0YgQ3JlYXRvciBmYWNldFxuICogQHR5cGVkZWYge29iamVjdH0gQ29udHJhY3RTdGFydEZuUmVzdWx0XG4gKiBAcHJvcGVydHkge1BGfSBwdWJsaWNGYWNldFxuICogQHByb3BlcnR5IHtDRn0gY3JlYXRvckZhY2V0XG4gKiBAcHJvcGVydHkge1Byb21pc2U8SW52aXRhdGlvbj49fSBbY3JlYXRvckludml0YXRpb25dXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgU1xuICogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3pvZVNlcnZpY2UvdXRpbHMnKS5Db250cmFjdE9mPFM+fSBDb250cmFjdE9mXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vem9lU2VydmljZS91dGlscycpLkFkbWluRmFjZXR9IEFkbWluRmFjZXRcbiAqL1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACD0BK/5BsAAOQbAAA4AAAAQGFnb3JpYy96b2UtdjAuMjUuNS9zcmMvY29udHJhY3RTdXBwb3J0L2JvbmRpbmdDdXJ2ZXMuanN7ImltcG9ydHMiOlsiLi9zYWZlTWF0aC5qcyIsIkBhZ29yaWMvbmF0Il0sImV4cG9ydHMiOlsiY2FsY0xpcVZhbHVlVG9NaW50IiwiY2FsY1NlY29uZGFyeVJlcXVpcmVkIiwiY2FsY1ZhbHVlVG9SZW1vdmUiLCJnZXRJbnB1dFByaWNlIiwiZ2V0T3V0cHV0UHJpY2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgTmF0LG5hdFNhZmVNYXRoOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvbmF0XCIsIFtbXCJOYXRcIiwgWyRo4oCNX2EgPT4gKE5hdCA9ICRo4oCNX2EpXV1dXSxbXCIuL3NhZmVNYXRoLmpzXCIsIFtbXCJuYXRTYWZlTWF0aFwiLCBbJGjigI1fYSA9PiAobmF0U2FmZU1hdGggPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuY29uc3R7c3VidHJhY3QsYWRkLG11bHRpcGx5LGZsb29yRGl2aWRlfT1uYXRTYWZlTWF0aDtcbmNvbnN0e2RldGFpbHM6WH09YXNzZXJ0O1xuXG5jb25zdCBCQVNJU19QT0lOVFM9MTAwMDBuOy8qIFRPRE8gY2hhbmdlIHRvIDEwXzAwMG4gb25jZSB0b29saW5nIGNvcGVzLiovXG5cbi8qKlxuICogQ2FsY3VsYXRpb25zIGZvciBjb25zdGFudCBwcm9kdWN0IG1hcmtldHMgbGlrZSBVbmlzd2FwLlxuICogaHR0cHM6Ly9naXRodWIuY29tL3J1bnRpbWV2ZXJpZmljYXRpb24vdmVyaWZpZWQtc21hcnQtY29udHJhY3RzL2Jsb2IvdW5pc3dhcC91bmlzd2FwL3gteS1rLnBkZlxuICovXG5cbi8qKlxuICogQ29udGFpbnMgdGhlIGxvZ2ljIGZvciBjYWxjdWxhdGluZyBob3cgbXVjaCBzaG91bGQgYmUgZ2l2ZW5cbiAqIGJhY2sgdG8gdGhlIHVzZXIgaW4gZXhjaGFuZ2UgZm9yIHdoYXQgdGhleSBzZW50IGluLiBSZXVzZWQgaW5cbiAqIHNldmVyYWwgZGlmZmVyZW50IHBsYWNlcywgaW5jbHVkaW5nIHRvIGNoZWNrIHdoZXRoZXIgYW4gb2ZmZXJcbiAqIGlzIHZhbGlkLCBnZXR0aW5nIHRoZSBjdXJyZW50IHByaWNlIGZvciBhbiBhc3NldCBvbiB1c2VyXG4gKiByZXF1ZXN0LCBhbmQgdG8gZG8gdGhlIGFjdHVhbCByZWFsbG9jYXRpb24gYWZ0ZXIgYW4gb2ZmZXIgaGFzXG4gKiBiZWVuIG1hZGUuXG4gKlxuICogQHBhcmFtIHthbnl9IGlucHV0VmFsdWUgLSB0aGUgdmFsdWUgb2YgdGhlIGFzc2V0IHNlbnRcbiAqIGluIHRvIGJlIHN3YXBwZWRcbiAqIEBwYXJhbSB7YW55fSBpbnB1dFJlc2VydmUgLSB0aGUgdmFsdWUgaW4gdGhlIGxpcXVpZGl0eVxuICogcG9vbCBvZiB0aGUga2luZCBvZiBhc3NldCBzZW50IGluXG4gKiBAcGFyYW0ge2FueX0gb3V0cHV0UmVzZXJ2ZSAtIHRoZSB2YWx1ZSBpbiB0aGUgbGlxdWlkaXR5XG4gKiBwb29sIG9mIHRoZSBraW5kIG9mIGFzc2V0IHRvIGJlIHNlbnQgb3V0XG4gKiBAcGFyYW0ge2JpZ2ludH0gW2ZlZUJhc2lzUG9pbnRzPTMwbl0gLSB0aGUgZmVlIHRha2VuIGluXG4gKiBiYXNpcyBwb2ludHMuIFRoZSBkZWZhdWx0IGlzIDAuMyUgb3IgMzAgYmFzaXMgcG9pbnRzLiBUaGUgZmVlXG4gKiBpcyB0YWtlbiBmcm9tIGlucHV0VmFsdWVcbiAqIEByZXR1cm5zIHtOYXRWYWx1ZX0gb3V0cHV0VmFsdWUgLSB0aGUgY3VycmVudCBwcmljZSwgaW4gdmFsdWUgZm9ybVxuICovXG5jb25zdCAgICAgICAgZ2V0SW5wdXRQcmljZT0oXG5pbnB1dFZhbHVlLFxuaW5wdXRSZXNlcnZlLFxub3V0cHV0UmVzZXJ2ZSxcbmZlZUJhc2lzUG9pbnRzPTMwbik9Plxue1xuaW5wdXRWYWx1ZT1OYXQoaW5wdXRWYWx1ZSk7XG5pbnB1dFJlc2VydmU9TmF0KGlucHV0UmVzZXJ2ZSk7XG5vdXRwdXRSZXNlcnZlPU5hdChvdXRwdXRSZXNlcnZlKTtcbmFzc2VydChpbnB1dFZhbHVlPjBuLFggYGlucHV0VmFsdWUgJHtpbnB1dFZhbHVlfSBtdXN0IGJlIHBvc2l0aXZlYCk7XG5hc3NlcnQoaW5wdXRSZXNlcnZlPjBuLFggYGlucHV0UmVzZXJ2ZSAke2lucHV0UmVzZXJ2ZX0gbXVzdCBiZSBwb3NpdGl2ZWApO1xub3V0cHV0UmVzZXJ2ZT4wbnx8XG5hc3NlcnQuZmFpbChYIGBvdXRwdXRSZXNlcnZlICR7b3V0cHV0UmVzZXJ2ZX0gbXVzdCBiZSBwb3NpdGl2ZWApO1xuXG5jb25zdCBvbmVNaW51c0ZlZVNjYWxlZD1zdWJ0cmFjdChCQVNJU19QT0lOVFMsZmVlQmFzaXNQb2ludHMpO1xuY29uc3QgaW5wdXRXaXRoRmVlPW11bHRpcGx5KGlucHV0VmFsdWUsb25lTWludXNGZWVTY2FsZWQpO1xuY29uc3QgbnVtZXJhdG9yPW11bHRpcGx5KGlucHV0V2l0aEZlZSxvdXRwdXRSZXNlcnZlKTtcbmNvbnN0IGRlbm9taW5hdG9yPWFkZChtdWx0aXBseShpbnB1dFJlc2VydmUsQkFTSVNfUE9JTlRTKSxpbnB1dFdpdGhGZWUpO1xucmV0dXJuIGZsb29yRGl2aWRlKG51bWVyYXRvcixkZW5vbWluYXRvcik7XG4gfTtcblxuLyoqXG4gKiBDb250YWlucyB0aGUgbG9naWMgZm9yIGNhbGN1bGF0aW5nIGhvdyBtdWNoIHNob3VsZCBiZSB0YWtlblxuICogZnJvbSB0aGUgdXNlciBpbiBleGNoYW5nZSBmb3Igd2hhdCB0aGV5IHdhbnQgdG8gb2J0YWluLiBSZXVzZWQgaW5cbiAqIHNldmVyYWwgZGlmZmVyZW50IHBsYWNlcywgaW5jbHVkaW5nIHRvIGNoZWNrIHdoZXRoZXIgYW4gb2ZmZXJcbiAqIGlzIHZhbGlkLCBnZXR0aW5nIHRoZSBjdXJyZW50IHByaWNlIGZvciBhbiBhc3NldCBvbiB1c2VyXG4gKiByZXF1ZXN0LCBhbmQgdG8gZG8gdGhlIGFjdHVhbCByZWFsbG9jYXRpb24gYWZ0ZXIgYW4gb2ZmZXIgaGFzXG4gKiBiZWVuIG1hZGUuXG4gKlxuICogQHBhcmFtIHthbnl9IG91dHB1dFZhbHVlIC0gdGhlIHZhbHVlIG9mIHRoZSBhc3NldCB0aGUgdXNlciB3YW50c1xuICogdG8gZ2V0XG4gKiBAcGFyYW0ge2FueX0gaW5wdXRSZXNlcnZlIC0gdGhlIHZhbHVlIGluIHRoZSBsaXF1aWRpdHlcbiAqIHBvb2wgb2YgdGhlIGFzc2V0IGJlaW5nIHNwZW50XG4gKiBAcGFyYW0ge2FueX0gb3V0cHV0UmVzZXJ2ZSAtIHRoZSB2YWx1ZSBpbiB0aGUgbGlxdWlkaXR5XG4gKiBwb29sIG9mIHRoZSBraW5kIG9mIGFzc2V0IHRvIGJlIHNlbnQgb3V0XG4gKiBAcGFyYW0ge2JpZ2ludH0gW2ZlZUJhc2lzUG9pbnRzPTMwbl0gLSB0aGUgZmVlIHRha2VuIGluXG4gKiBiYXNpcyBwb2ludHMuIFRoZSBkZWZhdWx0IGlzIDAuMyUgb3IgMzAgYmFzaXMgcG9pbnRzLiBUaGUgZmVlIGlzIHRha2VuIGZyb21cbiAqIG91dHB1dFZhbHVlXG4gKiBAcmV0dXJucyB7TmF0VmFsdWV9IGlucHV0VmFsdWUgLSB0aGUgdmFsdWUgb2YgaW5wdXQgcmVxdWlyZWQgdG8gcHVyY2hhc2Ugb3V0cHV0XG4gKi8kaOKAjV9vbmNlLmdldElucHV0UHJpY2UoZ2V0SW5wdXRQcmljZSk7XG5jb25zdCAgICAgICAgZ2V0T3V0cHV0UHJpY2U9KFxub3V0cHV0VmFsdWUsXG5pbnB1dFJlc2VydmUsXG5vdXRwdXRSZXNlcnZlLFxuZmVlQmFzaXNQb2ludHM9MzBuKT0+XG57XG5vdXRwdXRWYWx1ZT1OYXQob3V0cHV0VmFsdWUpO1xuaW5wdXRSZXNlcnZlPU5hdChpbnB1dFJlc2VydmUpO1xub3V0cHV0UmVzZXJ2ZT1OYXQob3V0cHV0UmVzZXJ2ZSk7XG5cbmFzc2VydChpbnB1dFJlc2VydmU+MG4sWCBgaW5wdXRSZXNlcnZlICR7aW5wdXRSZXNlcnZlfSBtdXN0IGJlIHBvc2l0aXZlYCk7XG5vdXRwdXRSZXNlcnZlPjBufHxcbmFzc2VydC5mYWlsKFggYG91dHB1dFJlc2VydmUgJHtvdXRwdXRSZXNlcnZlfSBtdXN0IGJlIHBvc2l0aXZlYCk7XG5vdXRwdXRSZXNlcnZlPm91dHB1dFZhbHVlfHxcbmFzc2VydC5mYWlsKFxuWCBgb3V0cHV0UmVzZXJ2ZSAke291dHB1dFJlc2VydmV9IG11c3QgYmUgZ3JlYXRlciB0aGFuIG91dHB1dFZhbHVlICR7b3V0cHV0VmFsdWV9YCk7XG5cblxuY29uc3Qgb25lTWludXNGZWVTY2FsZWQ9c3VidHJhY3QoQkFTSVNfUE9JTlRTLGZlZUJhc2lzUG9pbnRzKTtcbmNvbnN0IG51bWVyYXRvcj1tdWx0aXBseShtdWx0aXBseShvdXRwdXRWYWx1ZSxpbnB1dFJlc2VydmUpLEJBU0lTX1BPSU5UUyk7XG5jb25zdCBkZW5vbWluYXRvcj1tdWx0aXBseShcbnN1YnRyYWN0KG91dHB1dFJlc2VydmUsb3V0cHV0VmFsdWUpLFxub25lTWludXNGZWVTY2FsZWQpO1xuXG5yZXR1cm4gYWRkKGZsb29yRGl2aWRlKG51bWVyYXRvcixkZW5vbWluYXRvciksMW4pO1xuIH07XG5cbi8qKlxuICogQ2FsY3VsYXRlIGhvdyBtYW55IGxpcXVpZGl0eSB0b2tlbnMgd2Ugc2hvdWxkIGJlIG1pbnRpbmcgdG8gc2VuZCBiYWNrIHRvIHRoZVxuICogdXNlciB3aGVuIGFkZGluZyBsaXF1aWRpdHkuIFdlIHByb3ZpZGUgbmV3IGxpcXVpZGl0eSBlcXVhbCB0byB0aGUgZXhpc3RpbmdcbiAqIGxpcXVpZGl0eSBtdWx0aXBsaWVkIGJ5IHRoZSByYXRpbyBvZiBuZXcgY2VudHJhbCB0b2tlbnMgdG8gY2VudHJhbCB0b2tlbnNcbiAqIGFscmVhZHkgaGVsZC4gSWYgdGhlIGN1cnJlbnQgc3VwcGx5IGlzIHplcm8sIHJldHVybiB0aGUgaW5wdXRWYWx1ZSBhcyB0aGVcbiAqIGluaXRpYWwgbGlxdWlkaXR5IHRvIG1pbnQgaXMgYXJiaXRyYXJ5LlxuICpcbiAqIEBwYXJhbSB7YmlnaW50fSBsaXFUb2tlblN1cHBseVxuICogQHBhcmFtIHtiaWdpbnR9IGlucHV0VmFsdWVcbiAqIEBwYXJhbSB7YmlnaW50fSBpbnB1dFJlc2VydmVcbiAqIEByZXR1cm5zIHtOYXRWYWx1ZX1cbiAqLyRo4oCNX29uY2UuZ2V0T3V0cHV0UHJpY2UoZ2V0T3V0cHV0UHJpY2UpO1xuY29uc3QgICAgICAgIGNhbGNMaXFWYWx1ZVRvTWludD0oXG5saXFUb2tlblN1cHBseSxcbmlucHV0VmFsdWUsXG5pbnB1dFJlc2VydmUpPT5cbntcbmxpcVRva2VuU3VwcGx5PU5hdChsaXFUb2tlblN1cHBseSk7XG5pbnB1dFZhbHVlPU5hdChpbnB1dFZhbHVlKTtcbmlucHV0UmVzZXJ2ZT1OYXQoaW5wdXRSZXNlcnZlKTtcblxuaWYobGlxVG9rZW5TdXBwbHk9PT0wbil7XG5yZXR1cm4gaW5wdXRWYWx1ZTtcbiB9XG5yZXR1cm4gZmxvb3JEaXZpZGUobXVsdGlwbHkoaW5wdXRWYWx1ZSxsaXFUb2tlblN1cHBseSksaW5wdXRSZXNlcnZlKTtcbiB9O1xuXG4vKipcbiAqIENhbGN1bGF0ZSBob3cgbXVjaCBvZiB0aGUgc2Vjb25kYXJ5IHRva2VuIGlzIHJlcXVpcmVkIGZyb20gdGhlIHVzZXIgd2hlblxuICogYWRkaW5nIGxpcXVpZGl0eS4gV2UgcmVxdWlyZSB0aGF0IHRoZSBkZXBvc2l0ZWQgcmF0aW8gb2YgY2VudHJhbCB0byBzZWNvbmRhcnlcbiAqIG1hdGNoIHRoZSBjdXJyZW50IHJhdGlvIG9mIGhvbGRpbmdzIGluIHRoZSBwb29sLlxuICpcbiAqIEBwYXJhbSB7YW55fSBjZW50cmFsSW4gLSBUaGUgdmFsdWUgb2YgY2VudHJhbCBhc3NldHMgYmVpbmcgZGVwb3NpdGVkXG4gKiBAcGFyYW0ge2FueX0gY2VudHJhbFBvb2wgLSBUaGUgdmFsdWUgb2YgY2VudHJhbCBhc3NldHMgaW4gdGhlIHBvb2xcbiAqIEBwYXJhbSB7YW55fSBzZWNvbmRhcnlQb29sIC0gVGhlIHZhbHVlIG9mIHNlY29uZGFyeSBhc3NldHMgaW4gdGhlIHBvb2xcbiAqIEBwYXJhbSB7YW55fSBzZWNvbmRhcnlJbiAtIFRoZSB2YWx1ZSBvZiBzZWNvbmRhcnkgYXNzZXRzIHByb3ZpZGVkLiBJZlxuICogdGhlIHBvb2wgaXMgZW1wdHksIHRoZSBlbnRpcmUgYW1vdW50IHdpbGwgYmUgYWNjZXB0ZWRcbiAqIEByZXR1cm5zIHtOYXRWYWx1ZX0gLSB0aGUgYW1vdW50IG9mIHNlY29uZGFyeSByZXF1aXJlZFxuICovJGjigI1fb25jZS5jYWxjTGlxVmFsdWVUb01pbnQoY2FsY0xpcVZhbHVlVG9NaW50KTtcbmNvbnN0ICAgICAgICBjYWxjU2Vjb25kYXJ5UmVxdWlyZWQ9KFxuY2VudHJhbEluLFxuY2VudHJhbFBvb2wsXG5zZWNvbmRhcnlQb29sLFxuc2Vjb25kYXJ5SW4pPT5cbntcbmNlbnRyYWxJbj1OYXQoY2VudHJhbEluKTtcbmNlbnRyYWxQb29sPU5hdChjZW50cmFsUG9vbCk7XG5zZWNvbmRhcnlQb29sPU5hdChzZWNvbmRhcnlQb29sKTtcbnNlY29uZGFyeUluPU5hdChzZWNvbmRhcnlJbik7XG5cbmlmKGNlbnRyYWxQb29sPT09MG58fHNlY29uZGFyeVBvb2w9PT0wbil7XG5yZXR1cm4gc2Vjb25kYXJ5SW47XG4gfVxuXG5jb25zdCBzY2FsZWRTZWNvbmRhcnk9Zmxvb3JEaXZpZGUoXG5tdWx0aXBseShjZW50cmFsSW4sc2Vjb25kYXJ5UG9vbCksXG5jZW50cmFsUG9vbCk7XG5cbmNvbnN0IGV4YWN0PVxubXVsdGlwbHkoY2VudHJhbEluLHNlY29uZGFyeVBvb2wpPT09XG5tdWx0aXBseShzY2FsZWRTZWNvbmRhcnksY2VudHJhbFBvb2wpO1xuXG4vKiBkb2Vzbid0IG1hdGNoIHRoZSB4LXktay5wZGYgcGFwZXIsIGJ1dCBtb3JlIGNvcnJlY3QuIFdoZW4gdGhlIHJhdGlvcyBhcmUqL1xuLyogZXhhY3RseSBlcXVhbCwgbFByaW1lIGlzIGV4YWN0bHkgbCAqICgxICsgYWxwaGEpIGFuZCBhZGRpbmcgb25lIGlzIHdyb25nKi9cbnJldHVybiBleGFjdD9zY2FsZWRTZWNvbmRhcnk6MW4rc2NhbGVkU2Vjb25kYXJ5O1xuIH07XG5cbi8qIENhbGN1bGF0ZSBob3cgbWFueSB1bmRlcmx5aW5nIHRva2VucyAoaW4gdGhlIGZvcm0gb2YgYSB2YWx1ZSkgc2hvdWxkIGJlKi9cbi8qIHJldHVybmVkIHdoZW4gcmVtb3ZpbmcgbGlxdWlkaXR5LiovJGjigI1fb25jZS5jYWxjU2Vjb25kYXJ5UmVxdWlyZWQoY2FsY1NlY29uZGFyeVJlcXVpcmVkKTtcbmNvbnN0ICAgICAgICBjYWxjVmFsdWVUb1JlbW92ZT0oXG5saXFUb2tlblN1cHBseSxcbnBvb2xWYWx1ZSxcbmxpcXVpZGl0eVZhbHVlSW4pPT5cbntcbmxpcVRva2VuU3VwcGx5PU5hdChsaXFUb2tlblN1cHBseSk7XG5saXF1aWRpdHlWYWx1ZUluPU5hdChsaXF1aWRpdHlWYWx1ZUluKTtcbnBvb2xWYWx1ZT1OYXQocG9vbFZhbHVlKTtcblxucmV0dXJuIGZsb29yRGl2aWRlKG11bHRpcGx5KGxpcXVpZGl0eVZhbHVlSW4scG9vbFZhbHVlKSxsaXFUb2tlblN1cHBseSk7XG4gfTskaOKAjV9vbmNlLmNhbGNWYWx1ZVRvUmVtb3ZlKGNhbGNWYWx1ZVRvUmVtb3ZlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJnZXRJbnB1dFByaWNlIjpbImdldElucHV0UHJpY2UiXSwiZ2V0T3V0cHV0UHJpY2UiOlsiZ2V0T3V0cHV0UHJpY2UiXSwiY2FsY0xpcVZhbHVlVG9NaW50IjpbImNhbGNMaXFWYWx1ZVRvTWludCJdLCJjYWxjU2Vjb25kYXJ5UmVxdWlyZWQiOlsiY2FsY1NlY29uZGFyeVJlcXVpcmVkIl0sImNhbGNWYWx1ZVRvUmVtb3ZlIjpbImNhbGNWYWx1ZVRvUmVtb3ZlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADRDt37rEQAA6xEAADAAAABAYWdvcmljL3pvZS12MC4yNS41L3NyYy9jb250cmFjdFN1cHBvcnQvaW5kZXguanN7ImltcG9ydHMiOlsiLi9ib25kaW5nQ3VydmVzLmpzIiwiLi9wcmljZUF1dGhvcml0eS5qcyIsIi4vcHJpY2VRdW90ZS5qcyIsIi4vcmF0aW8uanMiLCIuL3NhZmVNYXRoLmpzIiwiLi9zdGF0ZU1hY2hpbmUuanMiLCIuL3N0YXRpc3RpY3MuanMiLCIuL3pvZUhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJhZGRSYXRpb3MiLCJhc3NlcnRJc1JhdGlvIiwiYXNzZXJ0SXNzdWVyS2V5d29yZHMiLCJhc3NlcnROYXRBc3NldEtpbmQiLCJhc3NlcnRQcm9wb3NhbFNoYXBlIiwiY2FsY0xpcVZhbHVlVG9NaW50IiwiY2FsY1NlY29uZGFyeVJlcXVpcmVkIiwiY2FsY1ZhbHVlVG9SZW1vdmUiLCJjZWlsRGl2aWRlQnkiLCJjZWlsTXVsdGlwbHlCeSIsImNoZWNrWkNGIiwiZGVmYXVsdEFjY2VwdGFuY2VNc2ciLCJkZXBvc2l0VG9TZWF0IiwiZml0UHJvcG9zYWxTaGFwZSIsImZsb29yRGl2aWRlQnkiLCJmbG9vck11bHRpcGx5QnkiLCJnZXRBbW91bnRJbiIsImdldEFtb3VudE91dCIsImdldElucHV0UHJpY2UiLCJnZXRPdXRwdXRQcmljZSIsImdldFByaWNlRGVzY3JpcHRpb24iLCJnZXRUaW1lc3RhbXAiLCJpbnZlcnRSYXRpbyIsIm1ha2VSYXRpbyIsIm1ha2VSYXRpb0Zyb21BbW91bnRzIiwibWFrZVN0YXRlTWFjaGluZSIsIm11bHRpcGx5UmF0aW9zIiwibmF0U2FmZU1hdGgiLCJvZmZlclRvIiwib25lTWludXMiLCJzYXRpc2ZpZXMiLCJzYXZlQWxsSXNzdWVycyIsInN3YXAiLCJzd2FwRXhhY3QiLCJ3aXRoZHJhd0Zyb21TZWF0Il0sInJlZXhwb3J0cyI6WyIuL3ByaWNlQXV0aG9yaXR5LmpzIiwiLi9zdGF0aXN0aWNzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9ib25kaW5nQ3VydmVzLmpzXCIsIFtbXCJnZXRJbnB1dFByaWNlXCIsIFskaOKAjV9saXZlW1wiZ2V0SW5wdXRQcmljZVwiXV1dLFtcImdldE91dHB1dFByaWNlXCIsIFskaOKAjV9saXZlW1wiZ2V0T3V0cHV0UHJpY2VcIl1dXSxbXCJjYWxjTGlxVmFsdWVUb01pbnRcIiwgWyRo4oCNX2xpdmVbXCJjYWxjTGlxVmFsdWVUb01pbnRcIl1dXSxbXCJjYWxjVmFsdWVUb1JlbW92ZVwiLCBbJGjigI1fbGl2ZVtcImNhbGNWYWx1ZVRvUmVtb3ZlXCJdXV0sW1wiY2FsY1NlY29uZGFyeVJlcXVpcmVkXCIsIFskaOKAjV9saXZlW1wiY2FsY1NlY29uZGFyeVJlcXVpcmVkXCJdXV1dXSxbXCIuL3ByaWNlQXV0aG9yaXR5LmpzXCIsIFtdXSxbXCIuL3ByaWNlUXVvdGUuanNcIiwgW1tcImdldEFtb3VudEluXCIsIFskaOKAjV9saXZlW1wiZ2V0QW1vdW50SW5cIl1dXSxbXCJnZXRBbW91bnRPdXRcIiwgWyRo4oCNX2xpdmVbXCJnZXRBbW91bnRPdXRcIl1dXSxbXCJnZXRUaW1lc3RhbXBcIiwgWyRo4oCNX2xpdmVbXCJnZXRUaW1lc3RhbXBcIl1dXSxbXCJnZXRQcmljZURlc2NyaXB0aW9uXCIsIFskaOKAjV9saXZlW1wiZ2V0UHJpY2VEZXNjcmlwdGlvblwiXV1dXV0sW1wiLi9zYWZlTWF0aC5qc1wiLCBbW1wibmF0U2FmZU1hdGhcIiwgWyRo4oCNX2xpdmVbXCJuYXRTYWZlTWF0aFwiXV1dXV0sW1wiLi9zdGF0ZU1hY2hpbmUuanNcIiwgW1tcIm1ha2VTdGF0ZU1hY2hpbmVcIiwgWyRo4oCNX2xpdmVbXCJtYWtlU3RhdGVNYWNoaW5lXCJdXV1dXSxbXCIuL3N0YXRpc3RpY3MuanNcIiwgW11dLFtcIi4vem9lSGVscGVycy5qc1wiLCBbW1wiZGVmYXVsdEFjY2VwdGFuY2VNc2dcIiwgWyRo4oCNX2xpdmVbXCJkZWZhdWx0QWNjZXB0YW5jZU1zZ1wiXV1dLFtcInN3YXBcIiwgWyRo4oCNX2xpdmVbXCJzd2FwXCJdXV0sW1wiZml0UHJvcG9zYWxTaGFwZVwiLCBbJGjigI1fbGl2ZVtcImZpdFByb3Bvc2FsU2hhcGVcIl1dXSxbXCJhc3NlcnRQcm9wb3NhbFNoYXBlXCIsIFskaOKAjV9saXZlW1wiYXNzZXJ0UHJvcG9zYWxTaGFwZVwiXV1dLFtcImFzc2VydElzc3VlcktleXdvcmRzXCIsIFskaOKAjV9saXZlW1wiYXNzZXJ0SXNzdWVyS2V5d29yZHNcIl1dXSxbXCJzYXRpc2ZpZXNcIiwgWyRo4oCNX2xpdmVbXCJzYXRpc2ZpZXNcIl1dXSxbXCJhc3NlcnROYXRBc3NldEtpbmRcIiwgWyRo4oCNX2xpdmVbXCJhc3NlcnROYXRBc3NldEtpbmRcIl1dXSxbXCJzd2FwRXhhY3RcIiwgWyRo4oCNX2xpdmVbXCJzd2FwRXhhY3RcIl1dXSxbXCJkZXBvc2l0VG9TZWF0XCIsIFskaOKAjV9saXZlW1wiZGVwb3NpdFRvU2VhdFwiXV1dLFtcIndpdGhkcmF3RnJvbVNlYXRcIiwgWyRo4oCNX2xpdmVbXCJ3aXRoZHJhd0Zyb21TZWF0XCJdXV0sW1wic2F2ZUFsbElzc3VlcnNcIiwgWyRo4oCNX2xpdmVbXCJzYXZlQWxsSXNzdWVyc1wiXV1dLFtcIm9mZmVyVG9cIiwgWyRo4oCNX2xpdmVbXCJvZmZlclRvXCJdXV0sW1wiY2hlY2taQ0ZcIiwgWyRo4oCNX2xpdmVbXCJjaGVja1pDRlwiXV1dXV0sW1wiLi9yYXRpby5qc1wiLCBbW1wibWFrZVJhdGlvXCIsIFskaOKAjV9saXZlW1wibWFrZVJhdGlvXCJdXV0sW1wibWFrZVJhdGlvRnJvbUFtb3VudHNcIiwgWyRo4oCNX2xpdmVbXCJtYWtlUmF0aW9Gcm9tQW1vdW50c1wiXV1dLFtcImZsb29yTXVsdGlwbHlCeVwiLCBbJGjigI1fbGl2ZVtcImZsb29yTXVsdGlwbHlCeVwiXV1dLFtcImZsb29yRGl2aWRlQnlcIiwgWyRo4oCNX2xpdmVbXCJmbG9vckRpdmlkZUJ5XCJdXV0sW1wiY2VpbE11bHRpcGx5QnlcIiwgWyRo4oCNX2xpdmVbXCJjZWlsTXVsdGlwbHlCeVwiXV1dLFtcImNlaWxEaXZpZGVCeVwiLCBbJGjigI1fbGl2ZVtcImNlaWxEaXZpZGVCeVwiXV1dLFtcImFzc2VydElzUmF0aW9cIiwgWyRo4oCNX2xpdmVbXCJhc3NlcnRJc1JhdGlvXCJdXV0sW1wiaW52ZXJ0UmF0aW9cIiwgWyRo4oCNX2xpdmVbXCJpbnZlcnRSYXRpb1wiXV1dLFtcIm9uZU1pbnVzXCIsIFskaOKAjV9saXZlW1wib25lTWludXNcIl1dXSxbXCJhZGRSYXRpb3NcIiwgWyRo4oCNX2xpdmVbXCJhZGRSYXRpb3NcIl1dXSxbXCJtdWx0aXBseVJhdGlvc1wiLCBbJGjigI1fbGl2ZVtcIm11bHRpcGx5UmF0aW9zXCJdXV1dXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7ImdldElucHV0UHJpY2UiOlsiZ2V0SW5wdXRQcmljZSIsZmFsc2VdLCJnZXRPdXRwdXRQcmljZSI6WyJnZXRPdXRwdXRQcmljZSIsZmFsc2VdLCJjYWxjTGlxVmFsdWVUb01pbnQiOlsiY2FsY0xpcVZhbHVlVG9NaW50IixmYWxzZV0sImNhbGNWYWx1ZVRvUmVtb3ZlIjpbImNhbGNWYWx1ZVRvUmVtb3ZlIixmYWxzZV0sImNhbGNTZWNvbmRhcnlSZXF1aXJlZCI6WyJjYWxjU2Vjb25kYXJ5UmVxdWlyZWQiLGZhbHNlXSwiZ2V0QW1vdW50SW4iOlsiZ2V0QW1vdW50SW4iLGZhbHNlXSwiZ2V0QW1vdW50T3V0IjpbImdldEFtb3VudE91dCIsZmFsc2VdLCJnZXRUaW1lc3RhbXAiOlsiZ2V0VGltZXN0YW1wIixmYWxzZV0sImdldFByaWNlRGVzY3JpcHRpb24iOlsiZ2V0UHJpY2VEZXNjcmlwdGlvbiIsZmFsc2VdLCJuYXRTYWZlTWF0aCI6WyJuYXRTYWZlTWF0aCIsZmFsc2VdLCJtYWtlU3RhdGVNYWNoaW5lIjpbIm1ha2VTdGF0ZU1hY2hpbmUiLGZhbHNlXSwiZGVmYXVsdEFjY2VwdGFuY2VNc2ciOlsiZGVmYXVsdEFjY2VwdGFuY2VNc2ciLGZhbHNlXSwic3dhcCI6WyJzd2FwIixmYWxzZV0sImZpdFByb3Bvc2FsU2hhcGUiOlsiZml0UHJvcG9zYWxTaGFwZSIsZmFsc2VdLCJhc3NlcnRQcm9wb3NhbFNoYXBlIjpbImFzc2VydFByb3Bvc2FsU2hhcGUiLGZhbHNlXSwiYXNzZXJ0SXNzdWVyS2V5d29yZHMiOlsiYXNzZXJ0SXNzdWVyS2V5d29yZHMiLGZhbHNlXSwic2F0aXNmaWVzIjpbInNhdGlzZmllcyIsZmFsc2VdLCJhc3NlcnROYXRBc3NldEtpbmQiOlsiYXNzZXJ0TmF0QXNzZXRLaW5kIixmYWxzZV0sInN3YXBFeGFjdCI6WyJzd2FwRXhhY3QiLGZhbHNlXSwiZGVwb3NpdFRvU2VhdCI6WyJkZXBvc2l0VG9TZWF0IixmYWxzZV0sIndpdGhkcmF3RnJvbVNlYXQiOlsid2l0aGRyYXdGcm9tU2VhdCIsZmFsc2VdLCJzYXZlQWxsSXNzdWVycyI6WyJzYXZlQWxsSXNzdWVycyIsZmFsc2VdLCJvZmZlclRvIjpbIm9mZmVyVG8iLGZhbHNlXSwiY2hlY2taQ0YiOlsiY2hlY2taQ0YiLGZhbHNlXSwibWFrZVJhdGlvIjpbIm1ha2VSYXRpbyIsZmFsc2VdLCJtYWtlUmF0aW9Gcm9tQW1vdW50cyI6WyJtYWtlUmF0aW9Gcm9tQW1vdW50cyIsZmFsc2VdLCJmbG9vck11bHRpcGx5QnkiOlsiZmxvb3JNdWx0aXBseUJ5IixmYWxzZV0sImZsb29yRGl2aWRlQnkiOlsiZmxvb3JEaXZpZGVCeSIsZmFsc2VdLCJjZWlsTXVsdGlwbHlCeSI6WyJjZWlsTXVsdGlwbHlCeSIsZmFsc2VdLCJjZWlsRGl2aWRlQnkiOlsiY2VpbERpdmlkZUJ5IixmYWxzZV0sImFzc2VydElzUmF0aW8iOlsiYXNzZXJ0SXNSYXRpbyIsZmFsc2VdLCJpbnZlcnRSYXRpbyI6WyJpbnZlcnRSYXRpbyIsZmFsc2VdLCJvbmVNaW51cyI6WyJvbmVNaW51cyIsZmFsc2VdLCJhZGRSYXRpb3MiOlsiYWRkUmF0aW9zIixmYWxzZV0sIm11bHRpcGx5UmF0aW9zIjpbIm11bHRpcGx5UmF0aW9zIixmYWxzZV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALRYJWGCJQAAgiUAADkAAABAYWdvcmljL3pvZS12MC4yNS41L3NyYy9jb250cmFjdFN1cHBvcnQvcHJpY2VBdXRob3JpdHkuanN7ImltcG9ydHMiOlsiLi4vLi4vZXhwb3J0ZWQuanMiLCJAYWdvcmljL2Fzc2VydCIsIkBhZ29yaWMvZXJ0cCIsIkBhZ29yaWMvbm90aWZpZXIiLCJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL3Byb21pc2Uta2l0Il0sImV4cG9ydHMiOlsibWFrZU9uZXdheVByaWNlQXV0aG9yaXR5S2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEUsRmFyLGFzc2VydCxYLG1ha2VQcm9taXNlS2l0LEFtb3VudE1hdGgsbWFrZU5vdGlmaWVyOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9hc3NlcnRcIiwgW1tcImFzc2VydFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0ID0gJGjigI1fYSldXSxbXCJkZXRhaWxzXCIsIFskaOKAjV9hID0+IChYID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJtYWtlUHJvbWlzZUtpdFwiLCBbJGjigI1fYSA9PiAobWFrZVByb21pc2VLaXQgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9lcnRwXCIsIFtbXCJBbW91bnRNYXRoXCIsIFskaOKAjV9hID0+IChBbW91bnRNYXRoID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvbm90aWZpZXJcIiwgW1tcIm1ha2VOb3RpZmllclwiLCBbJGjigI1fYSA9PiAobWFrZU5vdGlmaWVyID0gJGjigI1fYSldXV1dLFtcIi4uLy4uL2V4cG9ydGVkLmpzXCIsIFtdXV0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShtYWtlT25ld2F5UHJpY2VBdXRob3JpdHlLaXQsICduYW1lJywge3ZhbHVlOiBcIm1ha2VPbmV3YXlQcmljZUF1dGhvcml0eUtpdFwifSk7JGjigI1fb25jZS5tYWtlT25ld2F5UHJpY2VBdXRob3JpdHlLaXQobWFrZU9uZXdheVByaWNlQXV0aG9yaXR5S2l0KTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAY2FsbGJhY2sgQ29tcGFyZUFtb3VudFxuICogQHBhcmFtIHtBbW91bnR9IGFtb3VudFxuICogQHBhcmFtIHtBbW91bnR9IGFtb3VudExpbWl0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuXG4vKiogQHR5cGUge0NvbXBhcmVBbW91bnR9ICovXG5jb25zdCBpc0xUPShhbW91bnQsYW1vdW50TGltaXQpPT4hQW1vdW50TWF0aC5pc0dURShhbW91bnQsYW1vdW50TGltaXQpO1xuXG4vKiogQHR5cGUge0NvbXBhcmVBbW91bnR9ICovXG5jb25zdCBpc0xURT0oYW1vdW50LGFtb3VudExpbWl0KT0+QW1vdW50TWF0aC5pc0dURShhbW91bnRMaW1pdCxhbW91bnQpO1xuXG4vKiogQHR5cGUge0NvbXBhcmVBbW91bnR9ICovXG5jb25zdCBpc0dURT0oYW1vdW50LGFtb3VudExpbWl0KT0+QW1vdW50TWF0aC5pc0dURShhbW91bnQsYW1vdW50TGltaXQpO1xuXG4vKiogQHR5cGUge0NvbXBhcmVBbW91bnR9ICovXG5jb25zdCBpc0dUPShhbW91bnQsYW1vdW50TGltaXQpPT4hQW1vdW50TWF0aC5pc0dURShhbW91bnRMaW1pdCxhbW91bnQpO1xuXG4vKipcbiAqIEBjYWxsYmFjayBUcmlnZ2VyXG4gKiBAcGFyYW0ge1ByaWNlUXVvdGVDcmVhdGV9IGNyZWF0ZUluc3RhbnRRdW90ZVxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gKi9cblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0c1xuICogQHBhcmFtIHtJc3N1ZXJ9IG9wdHMucXVvdGVJc3N1ZXJcbiAqIEBwYXJhbSB7RVJlZjxOb3RpZmllcjx1bmtub3duPj59IG9wdHMubm90aWZpZXJcbiAqIEBwYXJhbSB7RVJlZjxUaW1lclNlcnZpY2U+fSBvcHRzLnRpbWVyXG4gKiBAcGFyYW0ge1ByaWNlUXVvdGVDcmVhdGV9IG9wdHMuY3JlYXRlUXVvdGVcbiAqIEBwYXJhbSB7QnJhbmR9IG9wdHMuYWN0dWFsQnJhbmRJblxuICogQHBhcmFtIHtCcmFuZH0gb3B0cy5hY3R1YWxCcmFuZE91dFxuICogQHJldHVybnMge1ByaWNlQXV0aG9yaXR5S2l0fVxuICovXG5mdW5jdGlvbiAgICAgICAgbWFrZU9uZXdheVByaWNlQXV0aG9yaXR5S2l0KG9wdHMpe1xuY29uc3R7XG50aW1lcixcbmNyZWF0ZVF1b3RlLFxuYWN0dWFsQnJhbmRJbixcbmFjdHVhbEJyYW5kT3V0LFxucXVvdGVJc3N1ZXIsXG5ub3RpZmllcn09XG5vcHRzO1xuXG5sZXQgaGF2ZUZpcnN0UXVvdGU9ZmFsc2U7XG5cbkUobm90aWZpZXIpLlxuZ2V0VXBkYXRlU2luY2UoKS5cbnRoZW4oKF8pPT5oYXZlRmlyc3RRdW90ZT10cnVlKTtcblxuLyoqIEB0eXBlIHtTZXQ8VHJpZ2dlcj59ICovXG5jb25zdCB0cmlnZ2Vycz1uZXcgU2V0KCk7XG5jb25zdCBtdXRhYmxlVHJpZ2dlcnM9bmV3IE1hcCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7UHJpY2VRdW90ZUNyZWF0ZX0gdHJpZ2dlckNyZWF0ZVF1b3RlXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAqL1xuY29uc3QgZmlyZVRyaWdnZXJzPWFzeW5jKHRyaWdnZXJDcmVhdGVRdW90ZSk9PntcbmlmKCFoYXZlRmlyc3RRdW90ZSl7XG5yZXR1cm47XG4gfVxuYXdhaXQgUHJvbWlzZS5hbGwoXG5bLi4udHJpZ2dlcnMsLi4uQXJyYXkuZnJvbShtdXRhYmxlVHJpZ2dlcnMudmFsdWVzKCkpXS5tYXAoKHRyaWdnZXIpPT5cbnRyaWdnZXIodHJpZ2dlckNyZWF0ZVF1b3RlKSkpO1xuXG5cbiB9O1xuXG4vKipcbiAqIENyZWF0ZSBhIHF1b3RlV2hlbiogZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHtDb21wYXJlQW1vdW50fSBjb21wYXJlQW1vdW50c0ZuXG4gKi9cbmNvbnN0IG1ha2VRdW90ZVdoZW5PdXQ9KGNvbXBhcmVBbW91bnRzRm4pPT5cbi8qKlxuICogUmV0dXJuIGEgcXVvdGUgd2hlbiB0cmlnZ2VyV2hlbiBpcyB0cnVlIG9mIHRoZSBhcmd1bWVudHMuXG4gKlxuICogQHBhcmFtIHtBbW91bnR9IGFtb3VudEluIHRoZSBpbnB1dCB2YWx1ZSB0byB0aGUgY2FsY0Ftb3VudFRyaWdnZXJcbiAqIEBwYXJhbSB7QW1vdW50fSBhbW91bnRPdXRMaW1pdCB0aGUgdmFsdWUgdG8gY29tcGFyZSB3aXRoIHRoZSBvdXRwdXRcbiAqIG9mIGNhbGNBbW91bnRUcmlnZ2VyXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHF1b3RlV2hlbk91dFRyaWdnZXIoYW1vdW50SW4sYW1vdW50T3V0TGltaXQpe1xuYW1vdW50SW49QW1vdW50TWF0aC5jb2VyY2UoYWN0dWFsQnJhbmRJbixhbW91bnRJbik7XG5hbW91bnRPdXRMaW1pdD1BbW91bnRNYXRoLmNvZXJjZShhY3R1YWxCcmFuZE91dCxhbW91bnRPdXRMaW1pdCk7XG5cbi8qKiBAdHlwZSB7UHJvbWlzZVJlY29yZDxQcmljZVF1b3RlPn0gKi9cbmNvbnN0IHRyaWdnZXJQSz1tYWtlUHJvbWlzZUtpdCgpO1xuXG4vKiogQHR5cGUge1ByaWNlUXVvdGVUcmlnZ2VyfSAqL1xuY29uc3QgdHJpZ2dlcj1hc3luYyhjcmVhdGVJbnN0YW50UXVvdGUpPT57XG50cnl7XG5jb25zdCBxdW90ZVA9Y3JlYXRlSW5zdGFudFF1b3RlKChjYWxjQW1vdW50T3V0KT0+e1xuaWYoIXRyaWdnZXJzLmhhcyh0cmlnZ2VyKSl7XG4vKiBBbHJlYWR5IGZpcmVkLiovXG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cbmNvbnN0IGFtb3VudE91dD1jYWxjQW1vdW50T3V0KGFtb3VudEluKTtcblxuaWYoIWNvbXBhcmVBbW91bnRzRm4oYW1vdW50T3V0LGFtb3VudE91dExpbWl0KSl7XG4vKiBEb24ndCBmaXJlIHRoZSB0cmlnZ2VyIHlldC4qL1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG5cbi8qIEdlbmVyYXRlIHRoZSBxdW90ZS4qL1xucmV0dXJue2Ftb3VudEluLGFtb3VudE91dH07XG4gfSk7XG5cbmlmKCFxdW90ZVApe1xuLyogV2Ugc2hvdWxkbid0IHJlc29sdmUgeWV0LiovXG5yZXR1cm47XG4gfVxuXG50cmlnZ2Vycy5kZWxldGUodHJpZ2dlcik7XG50cmlnZ2VyUEsucmVzb2x2ZShxdW90ZVApO1xuIH1jYXRjaChlKXtcbi8qIFRyaWdnZXIgZmFpbGVkLCBzbyByZWplY3QgYW5kIGRyb3AuKi9cbnRyaWdnZXJQSy5yZWplY3QoZSk7XG50cmlnZ2Vycy5kZWxldGUodHJpZ2dlcik7XG4gfVxuIH07XG5cbnRyaWdnZXJzLmFkZCh0cmlnZ2VyKTtcblxuLyogRmlyZSBub3csIGp1c3QgaW4gY2FzZS4qL1xuYXdhaXQgdHJpZ2dlcihjcmVhdGVRdW90ZSk7XG5cbnJldHVybiB0cmlnZ2VyUEsucHJvbWlzZTtcbiB9O1xuXG4vKipcbiAqIENyZWF0ZSBhIG11dGFibGVRdW90ZVdoZW4qIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7Q29tcGFyZUFtb3VudH0gY29tcGFyZUFtb3VudHNGblxuICovXG5jb25zdCBtYWtlTXV0YWJsZVF1b3RlPShjb21wYXJlQW1vdW50c0ZuKT0+XG4vKipcbiAqIEBwYXJhbSB7QW1vdW50fSBhbW91bnRJblxuICogQHBhcmFtIHtBbW91bnR9IGFtb3VudE91dExpbWl0XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIG11dGFibGVRdW90ZVdoZW5PdXRUcmlnZ2VyKGFtb3VudEluLGFtb3VudE91dExpbWl0KXtcbkFtb3VudE1hdGguY29lcmNlKGFjdHVhbEJyYW5kSW4sYW1vdW50SW4pO1xuQW1vdW50TWF0aC5jb2VyY2UoYWN0dWFsQnJhbmRPdXQsYW1vdW50T3V0TGltaXQpO1xuXG4vKiogQHR5cGUge1Byb21pc2VSZWNvcmQ8UHJpY2VRdW90ZT59ICovXG5jb25zdCB0cmlnZ2VyUEs9bWFrZVByb21pc2VLaXQoKTtcblxuLyoqIEB0eXBlIHtNdXRhYmxlUXVvdGV9ICovXG5jb25zdCBtdXRhYmxlUXVvdGU9RmFyKCdNdXRhYmxlUXVvdGUnLHtcbmNhbmNlbDooZSk9PnRyaWdnZXJQSy5yZWplY3QoZSksXG51cGRhdGVMZXZlbDoobmV3QW1vdW50SW4sbmV3QW1vdW50T3V0TGltaXQpPT57XG5jb25zdCBjb2VyY2VkQW1vdW50SW49QW1vdW50TWF0aC5jb2VyY2UoYWN0dWFsQnJhbmRJbixuZXdBbW91bnRJbik7XG5jb25zdCBjb2VyY2VkQW1vdW50T3V0TGltaXQ9QW1vdW50TWF0aC5jb2VyY2UoXG5hY3R1YWxCcmFuZE91dCxcbm5ld0Ftb3VudE91dExpbWl0KTtcblxuYW1vdW50SW49Y29lcmNlZEFtb3VudEluO1xuYW1vdW50T3V0TGltaXQ9Y29lcmNlZEFtb3VudE91dExpbWl0O1xuZmlyZVRyaWdnZXJzKGNyZWF0ZVF1b3RlKTtcbiB9LFxuZ2V0UHJvbWlzZTooKT0+dHJpZ2dlclBLLnByb21pc2V9KTtcblxuXG4vKiogQHR5cGUge1ByaWNlUXVvdGVUcmlnZ2VyfSAqL1xuY29uc3QgbXV0YWJsZVRyaWdnZXI9YXN5bmMoY3JlYXRlSW5zdGFudFF1b3RlKT0+e1xudHJ5e1xuY29uc3QgcXVvdGVQPWNyZWF0ZUluc3RhbnRRdW90ZSgoY2FsY0Ftb3VudE91dCk9PntcbmlmKCFtdXRhYmxlVHJpZ2dlcnMuaGFzKG11dGFibGVRdW90ZSkpe1xuLyogQWxyZWFkeSBmaXJlZC4qL1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG5jb25zdCBhbW91bnRPdXQ9Y2FsY0Ftb3VudE91dChhbW91bnRJbik7XG5cbmlmKCFjb21wYXJlQW1vdW50c0ZuKGFtb3VudE91dCxhbW91bnRPdXRMaW1pdCkpe1xuLyogRG9uJ3QgZmlyZSB0aGUgbXV0YWJsZVRyaWdnZXIgeWV0LiovXG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cblxuLyogR2VuZXJhdGUgdGhlIHF1b3RlLiovXG5yZXR1cm57YW1vdW50SW4sYW1vdW50T3V0fTtcbiB9KTtcblxuaWYoIXF1b3RlUCl7XG4vKiBXZSBzaG91bGRuJ3QgcmVzb2x2ZSB5ZXQuKi9cbnJldHVybjtcbiB9XG5cbm11dGFibGVUcmlnZ2Vycy5kZWxldGUobXV0YWJsZVF1b3RlKTtcbnRyaWdnZXJQSy5yZXNvbHZlKHF1b3RlUCk7XG4gfWNhdGNoKGUpe1xuLyogVHJpZ2dlciBmYWlsZWQsIHNvIHJlamVjdCBhbmQgZHJvcC4qL1xudHJpZ2dlclBLLnJlamVjdChlKTtcbm11dGFibGVUcmlnZ2Vycy5kZWxldGUobXV0YWJsZVF1b3RlKTtcbiB9XG4gfTtcblxubXV0YWJsZVRyaWdnZXJzLnNldChtdXRhYmxlUXVvdGUsbXV0YWJsZVRyaWdnZXIpO1xuXG4vKiBGaXJlIG5vdywganVzdCBpbiBjYXNlLiovXG5hd2FpdCBtdXRhYmxlVHJpZ2dlcihjcmVhdGVRdW90ZSk7XG5cbnJldHVybiBtdXRhYmxlUXVvdGU7XG4gfTtcblxuLyoqXG4gKiBFbnN1cmUgdGhhdCB0aGUgYnJhbmRJbi9icmFuZE91dCBwYWlyIGlzIHN1cHBvcnRlZC5cbiAqXG4gKiBAcGFyYW0ge0JyYW5kfSBicmFuZEluXG4gKiBAcGFyYW0ge0JyYW5kfSBicmFuZE91dFxuICovXG5jb25zdCBhc3NlcnRCcmFuZHM9KGJyYW5kSW4sYnJhbmRPdXQpPT57XG5hc3NlcnQuZXF1YWwoXG5icmFuZEluLFxuYWN0dWFsQnJhbmRJbixcblggYERlc2lyZWQgYnJhbmRJbiAke2JyYW5kSW59IG11c3QgbWF0Y2ggJHthY3R1YWxCcmFuZElufWApO1xuXG5hc3NlcnQuZXF1YWwoXG5icmFuZE91dCxcbmFjdHVhbEJyYW5kT3V0LFxuWCBgRGVzaXJlZCBicmFuZE91dCAke2JyYW5kT3V0fSBtdXN0IG1hdGNoICR7YWN0dWFsQnJhbmRPdXR9YCk7XG5cbiB9O1xuXG4vKiogQHR5cGUge1ByaWNlQXV0aG9yaXR5fSAqL1xuY29uc3QgcHJpY2VBdXRob3JpdHk9RmFyKCdQcmljZUF1dGhvcml0eScse1xuZ2V0UXVvdGVJc3N1ZXIoYnJhbmRJbixicmFuZE91dCl7XG5hc3NlcnRCcmFuZHMoYnJhbmRJbixicmFuZE91dCk7XG5yZXR1cm4gcXVvdGVJc3N1ZXI7XG4gfSxcbmdldFRpbWVyU2VydmljZShicmFuZEluLGJyYW5kT3V0KXtcbmFzc2VydEJyYW5kcyhicmFuZEluLGJyYW5kT3V0KTtcbnJldHVybiB0aW1lcjtcbiB9LFxubWFrZVF1b3RlTm90aWZpZXIoYW1vdW50SW4sYnJhbmRPdXQpe1xuQW1vdW50TWF0aC5jb2VyY2UoYWN0dWFsQnJhbmRJbixhbW91bnRJbik7XG5hc3NlcnRCcmFuZHMoYW1vdW50SW4uYnJhbmQsYnJhbmRPdXQpO1xuXG4vKiBXcmFwIG91ciB1bmRlcmx5aW5nIG5vdGlmaWVyIHdpdGggc3BlY2lmaWMgcXVvdGVzLiovXG5jb25zdCBzcGVjaWZpY0Jhc2VOb3RpZmllcj1oYXJkZW4oe1xuICAgICAgYXN5bmMgZ2V0VXBkYXRlU2luY2UodXBkYXRlQ291bnQ9dW5kZWZpbmVkKXtcbi8qIFdlIHVzZSB0aGUgc2FtZSB1cGRhdGVDb3VudCBhcyBvdXIgdW5kZXJseWluZyBub3RpZmllci4qL1xuY29uc3QgcmVjb3JkPWF3YWl0IEUobm90aWZpZXIpLmdldFVwZGF0ZVNpbmNlKHVwZGF0ZUNvdW50KTtcblxuLyogV2UgY3JlYXRlIGEgcXVvdGUgaW5saW5lLiovXG5jb25zdCBxdW90ZT1jcmVhdGVRdW90ZSgoY2FsY0Ftb3VudE91dCk9Pih7XG5hbW91bnRJbixcbmFtb3VudE91dDpjYWxjQW1vdW50T3V0KGFtb3VudEluKX0pKTtcblxuYXNzZXJ0KHF1b3RlKTtcblxuY29uc3QgdmFsdWU9YXdhaXQgcXVvdGU7XG5yZXR1cm4gaGFyZGVuKHtcbnZhbHVlLFxudXBkYXRlQ291bnQ6cmVjb3JkLnVwZGF0ZUNvdW50fSk7XG5cbiB9fSk7XG5cblxuLyoqIEB0eXBlIHtOb3RpZmllcjxQcmljZVF1b3RlPn0gKi9cbmNvbnN0IHNwZWNpZmljTm90aWZpZXI9RmFyKCdRdW90ZU5vdGlmaWVyJyx7XG4uLi5tYWtlTm90aWZpZXIoc3BlY2lmaWNCYXNlTm90aWZpZXIpLFxuLyogVE9ETyBzdG9wIGV4cG9zaW5nIGJhc2VOb3RpZmllciBtZXRob2RzIGRpcmVjdGx5LiovXG4uLi5zcGVjaWZpY0Jhc2VOb3RpZmllcn0pO1xuXG5yZXR1cm4gc3BlY2lmaWNOb3RpZmllcjtcbiB9LFxuICAgICAgYXN5bmMgcXVvdGVHaXZlbihhbW91bnRJbixicmFuZE91dCl7XG5BbW91bnRNYXRoLmNvZXJjZShhY3R1YWxCcmFuZEluLGFtb3VudEluKTtcbmFzc2VydEJyYW5kcyhhbW91bnRJbi5icmFuZCxicmFuZE91dCk7XG5cbmF3YWl0IEUobm90aWZpZXIpLmdldFVwZGF0ZVNpbmNlKCk7XG5jb25zdCBxdW90ZT1jcmVhdGVRdW90ZSgoY2FsY0Ftb3VudE91dCk9Pih7XG5hbW91bnRJbixcbmFtb3VudE91dDpjYWxjQW1vdW50T3V0KGFtb3VudEluKX0pKTtcblxuYXNzZXJ0KHF1b3RlKTtcbnJldHVybiBxdW90ZTtcbiB9LFxuICAgICAgYXN5bmMgcXVvdGVXYW50ZWQoYnJhbmRJbixhbW91bnRPdXQpe1xuQW1vdW50TWF0aC5jb2VyY2UoYWN0dWFsQnJhbmRPdXQsYW1vdW50T3V0KTtcbmFzc2VydEJyYW5kcyhicmFuZEluLGFtb3VudE91dC5icmFuZCk7XG5cbmF3YWl0IEUobm90aWZpZXIpLmdldFVwZGF0ZVNpbmNlKCk7XG5jb25zdCBxdW90ZT1jcmVhdGVRdW90ZSgoY2FsY0Ftb3VudE91dCxjYWxjQW1vdW50SW4pPT57XG4vKiBXZSBuZWVkIHRvIGRldGVybWluZSBhbiBhbW91bnRJbiB0aGF0IGd1YXJhbnRlZXMgYXQgbGVhc3QgdGhlIGFtb3VudE91dC4qL1xuY29uc3QgYW1vdW50SW49Y2FsY0Ftb3VudEluKGFtb3VudE91dCk7XG5jb25zdCBhY3R1YWxBbW91bnRPdXQ9Y2FsY0Ftb3VudE91dChhbW91bnRJbik7XG5BbW91bnRNYXRoLmlzR1RFKGFjdHVhbEFtb3VudE91dCxhbW91bnRPdXQpfHxcbmFzc2VydC5mYWlsKFxuWCBgQ2FsY3VsYXRpb24gb2YgJHthY3R1YWxBbW91bnRPdXR9IGRpZG4ndCBjb3ZlciBleHBlY3RlZCAke2Ftb3VudE91dH1gKTtcblxucmV0dXJue2Ftb3VudEluLGFtb3VudE91dH07XG4gfSk7XG5hc3NlcnQocXVvdGUpO1xucmV0dXJuIHF1b3RlO1xuIH0sXG4gICAgICBhc3luYyBxdW90ZUF0VGltZShkZWFkbGluZSxhbW91bnRJbixicmFuZE91dCl7XG5hc3NlcnQudHlwZW9mKGRlYWRsaW5lLCdiaWdpbnQnKTtcbkFtb3VudE1hdGguY29lcmNlKGFjdHVhbEJyYW5kSW4sYW1vdW50SW4pO1xuYXNzZXJ0QnJhbmRzKGFtb3VudEluLmJyYW5kLGJyYW5kT3V0KTtcblxuYXdhaXQgRShub3RpZmllcikuZ2V0VXBkYXRlU2luY2UoKTtcbmNvbnN0IHF1b3RlUEs9bWFrZVByb21pc2VLaXQoKTtcbmF3YWl0IEUodGltZXIpLnNldFdha2V1cChcbmRlYWRsaW5lLFxuRmFyKCd3YWtlT2JqJyx7XG4gICAgICBhc3luYyB3YWtlKHRpbWVzdGFtcCl7XG50cnl7XG5jb25zdCBxdW90ZVA9Y3JlYXRlUXVvdGUoKGNhbGNBbW91bnRPdXQpPT4oe1xuYW1vdW50SW4sXG5hbW91bnRPdXQ6Y2FsY0Ftb3VudE91dChhbW91bnRJbiksXG50aW1lc3RhbXB9KSk7XG5cblxuLyogV2UgZG9uJ3Qgd2FpdCBmb3IgdGhlIHF1b3RlIHRvIGJlIGF1dGhlbnRpY2F0ZWQ7IHJlc29sdmUqL1xuLyogaW1tZWRpYXRlbHkuKi9cbnF1b3RlUEsucmVzb2x2ZShxdW90ZVApO1xuYXdhaXQgcXVvdGVQSy5wcm9taXNlO1xuIH1jYXRjaChlKXtcbnF1b3RlUEsucmVqZWN0KGUpO1xuIH1cbiB9fSkpO1xuXG5cblxuLyogV2FpdCB1bnRpbCB0aGUgd2FrZXVwIHBhc3Nlcy4qL1xucmV0dXJuIHF1b3RlUEsucHJvbWlzZTtcbiB9LFxucXVvdGVXaGVuTFQ6bWFrZVF1b3RlV2hlbk91dChpc0xUKSxcbnF1b3RlV2hlbkxURTptYWtlUXVvdGVXaGVuT3V0KGlzTFRFKSxcbnF1b3RlV2hlbkdURTptYWtlUXVvdGVXaGVuT3V0KGlzR1RFKSxcbnF1b3RlV2hlbkdUOm1ha2VRdW90ZVdoZW5PdXQoaXNHVCksXG5tdXRhYmxlUXVvdGVXaGVuTFQ6bWFrZU11dGFibGVRdW90ZShpc0xUKSxcbm11dGFibGVRdW90ZVdoZW5MVEU6bWFrZU11dGFibGVRdW90ZShpc0xURSksXG5tdXRhYmxlUXVvdGVXaGVuR1Q6bWFrZU11dGFibGVRdW90ZShpc0dUKSxcbm11dGFibGVRdW90ZVdoZW5HVEU6bWFrZU11dGFibGVRdW90ZShpc0dURSl9KTtcblxuXG5yZXR1cm57cHJpY2VBdXRob3JpdHksYWRtaW5GYWNldDp7ZmlyZVRyaWdnZXJzfX07XG4gfVxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VPbmV3YXlQcmljZUF1dGhvcml0eUtpdCI6WyJtYWtlT25ld2F5UHJpY2VBdXRob3JpdHlLaXQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAApK9Lw7AIAACwCAAANQAAAEBhZ29yaWMvem9lLXYwLjI1LjUvc3JjL2NvbnRyYWN0U3VwcG9ydC9wcmljZVF1b3RlLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvZXJ0cCIsIkBhZ29yaWMvbmF0IiwiQGVuZG8vZXZlbnR1YWwtc2VuZCJdLCJleHBvcnRzIjpbImdldEFtb3VudEluIiwiZ2V0QW1vdW50T3V0IiwiZ2V0UHJpY2VEZXNjcmlwdGlvbiIsImdldFRpbWVzdGFtcCIsInVuaXRBbW91bnQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgQW1vdW50TWF0aCxOYXQsRTskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2VydHBcIiwgW1tcIkFtb3VudE1hdGhcIiwgWyRo4oCNX2EgPT4gKEFtb3VudE1hdGggPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9uYXRcIiwgW1tcIk5hdFwiLCBbJGjigI1fYSA9PiAoTmF0ID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG4vKiBQcmljZUF1dGhvcml0aWVzIHJldHVybiBxdW90ZXMgYXMgYSBwYWlyIG9mIGFuIGFtb3VudCBhbmQgYSBwYXltZW50LCBib3RoKi9cbi8qIHdpdGggdGhlIHNhbWUgdmFsdWUuIFRoZSB1bmRlcmx5aW5nIGFtb3VudCB3cmFwcyBhbW91bnRJbiwgYW1vdW50T3V0LCB0aW1lciovXG4vKiBhbmQgdGltZXN0YW1wLiBUaGUgcGF5bWVudCBpcyBpc3N1ZWQgYnkgdGhlIHF1b3RlSXNzdWVyIHRvIHN1cHBvcnQgdmVyYWNpdHkqL1xuLyogY2hlY2tpbmcuIFRoZXNlIGhlbHBlcnMgbWFrZSBpdCBlYXNpZXIgdG8gZXh0cmFjdCB0aGUgY29tcG9uZW50cyBvZiB0aGUgUXVvdGUqL1xuXG4vKipcbiAqIEBwYXJhbSB7UHJpY2VRdW90ZX0gcXVvdGVcbiAqIEByZXR1cm5zIHtQcmljZURlc2NyaXB0aW9ufVxuICovXG5jb25zdCAgICAgICAgZ2V0UHJpY2VEZXNjcmlwdGlvbj0ocXVvdGUpPT57XG5hc3NlcnQoXG5xdW90ZS5xdW90ZUFtb3VudC52YWx1ZS5sZW5ndGg9PT0xLFxuJ3F1b3RlQW1vdW50IHNldCBtdXN0IGhhdmUgb25lIG1lbWJlcicpO1xuXG5yZXR1cm4gcXVvdGUucXVvdGVBbW91bnQudmFsdWVbMF07XG4gfTtcblxuLyoqIEBwYXJhbSB7UHJpY2VRdW90ZX0gcXVvdGUgKi8kaOKAjV9vbmNlLmdldFByaWNlRGVzY3JpcHRpb24oZ2V0UHJpY2VEZXNjcmlwdGlvbik7XG5jb25zdCAgICAgICAgZ2V0QW1vdW50SW49KHF1b3RlKT0+Z2V0UHJpY2VEZXNjcmlwdGlvbihxdW90ZSkuYW1vdW50SW47XG4vKiogQHBhcmFtIHtQcmljZVF1b3RlfSBxdW90ZSAqLyRo4oCNX29uY2UuZ2V0QW1vdW50SW4oZ2V0QW1vdW50SW4pO1xuY29uc3QgICAgICAgIGdldEFtb3VudE91dD0ocXVvdGUpPT5nZXRQcmljZURlc2NyaXB0aW9uKHF1b3RlKS5hbW91bnRPdXQ7XG4vKiogQHR5cGUgeyhxdW90ZTogUHJpY2VRdW90ZSkgPT4gVGltZXN0YW1wfSAqLyRo4oCNX29uY2UuZ2V0QW1vdW50T3V0KGdldEFtb3VudE91dCk7XG5jb25zdCAgICAgICAgZ2V0VGltZXN0YW1wPShxdW90ZSk9PmdldFByaWNlRGVzY3JpcHRpb24ocXVvdGUpLnRpbWVzdGFtcDtcblxuLyoqIEBwYXJhbSB7QnJhbmQ8J25hdCc+fSBicmFuZCAqLyRo4oCNX29uY2UuZ2V0VGltZXN0YW1wKGdldFRpbWVzdGFtcCk7XG5jb25zdCAgICAgICAgdW5pdEFtb3VudD1hc3luYyhicmFuZCk9Pntcbi8qIEJyYW5kIG1ldGhvZHMgYXJlIHJlbW90ZSovXG5jb25zdCBkaXNwbGF5SW5mbz1hd2FpdCBFKGJyYW5kKS5nZXREaXNwbGF5SW5mbygpO1xuY29uc3QgZGVjaW1hbFBsYWNlcz1kaXNwbGF5SW5mby5kZWNpbWFsUGxhY2VzPz8wO1xucmV0dXJuIEFtb3VudE1hdGgubWFrZShicmFuZCwxMG4qKk5hdChkZWNpbWFsUGxhY2VzKSk7XG4gfTskaOKAjV9vbmNlLnVuaXRBbW91bnQodW5pdEFtb3VudCk7XG5oYXJkZW4odW5pdEFtb3VudCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZ2V0UHJpY2VEZXNjcmlwdGlvbiI6WyJnZXRQcmljZURlc2NyaXB0aW9uIl0sImdldEFtb3VudEluIjpbImdldEFtb3VudEluIl0sImdldEFtb3VudE91dCI6WyJnZXRBbW91bnRPdXQiXSwiZ2V0VGltZXN0YW1wIjpbImdldFRpbWVzdGFtcCJdLCJ1bml0QW1vdW50IjpbInVuaXRBbW91bnQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA53tL910zAABdMwAAMAAAAEBhZ29yaWMvem9lLXYwLjI1LjUvc3JjL2NvbnRyYWN0U3VwcG9ydC9yYXRpby5qc3siaW1wb3J0cyI6WyIuL3NhZmVNYXRoLmpzIiwiLi90eXBlcy5qcyIsIkBhZ29yaWMvYXNzZXJ0IiwiQGFnb3JpYy9lcnRwIiwiQGFnb3JpYy9uYXQiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsiYWRkUmF0aW9zIiwiYXNzZXJ0SXNSYXRpbyIsImNlaWxEaXZpZGVCeSIsImNlaWxNdWx0aXBseUJ5IiwiZGl2aWRlQnkiLCJmbG9vckRpdmlkZUJ5IiwiZmxvb3JNdWx0aXBseUJ5IiwiaW52ZXJ0UmF0aW8iLCJtYWtlUmF0aW8iLCJtYWtlUmF0aW9Gcm9tQW1vdW50cyIsIm11bHRpcGx5QnkiLCJtdWx0aXBseVJhdGlvcyIsIm9uZU1pbnVzIiwicGFyc2VSYXRpbyIsInF1YW50aXplIiwicmF0aW9HVEUiLCJyYXRpb3NTYW1lIiwic3VidHJhY3RSYXRpb3MiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0LFgscSxBbW91bnRNYXRoLGFzc2VydFJlY29yZCxpc05hdCxuYXRTYWZlTWF0aDskaOKAjV9pbXBvcnRzKFtbXCIuL3R5cGVzLmpzXCIsIFtdXSxbXCJAYWdvcmljL2Fzc2VydFwiLCBbW1wiYXNzZXJ0XCIsIFskaOKAjV9hID0+IChhc3NlcnQgPSAkaOKAjV9hKV1dLFtcImRldGFpbHNcIiwgWyRo4oCNX2EgPT4gKFggPSAkaOKAjV9hKV1dLFtcInFcIiwgWyRo4oCNX2EgPT4gKHEgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9lcnRwXCIsIFtbXCJBbW91bnRNYXRoXCIsIFskaOKAjV9hID0+IChBbW91bnRNYXRoID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcImFzc2VydFJlY29yZFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UmVjb3JkID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvbmF0XCIsIFtbXCJpc05hdFwiLCBbJGjigI1fYSA9PiAoaXNOYXQgPSAkaOKAjV9hKV1dXV0sW1wiLi9zYWZlTWF0aC5qc1wiLCBbW1wibmF0U2FmZU1hdGhcIiwgWyRo4oCNX2EgPT4gKG5hdFNhZmVNYXRoID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5jb25zdHttdWx0aXBseSxmbG9vckRpdmlkZSxjZWlsRGl2aWRlLGJhbmtlcnNEaXZpZGUsYWRkLHN1YnRyYWN0fT1cbm5hdFNhZmVNYXRoO1xuXG4vKiBtYWtlIGEgUmF0aW8sIHdoaWNoIHJlcHJlc2VudHMgYSBmcmFjdGlvbi4gSXQgaXMgYSBwYXNzLWJ5LWNvcHkgcmVjb3JkLiovXG4vKiovXG4vKiBUaGUgbmF0dXJhbCBzeW50YXggZm9yIHRoZSBtb3N0IGNvbW1vbiBvcGVyYXRpb25zIHdlIHdhbnQgdG8gc3VwcG9ydCovXG4vKiBhcmUgQW1vdW50ICogUmF0aW8gYW5kIEFtb3VudCAvIFJhdGlvLiBTaW5jZSB0aGUgb3BlcmF0aW9ucyB3YW50IHRvIGFkaGVyZSB0byovXG4vKiB0aGUgcmF0aW8gcmF0aGVyIHRoYW4gdGhlIGFtb3VudCwgd2Ugc2V0dGxlZCBvbiBhIGNhbGxpbmcgY29udmVudGlvbiBvZiovXG4vKiBbY2VpbHxmbG9vcl1NdWx0aXBseUJ5KEFtb3VudCwgUmF0aW8pIGFuZCBbY2VpbHxmbG9vcl1EaXZpZGVCeShBbW91bnQsIFJhdGlvKSovXG4vKiovXG4vKiBUaGUgbW9zdCBjb21tb24ga2luZCBvZiBSYXRpbyBjYW4gYmUgYXBwbGllZCB0byBBbW91bnRzIG9mIGEgcGFydGljdWxhciovXG4vKiBicmFuZCwgYW5kIHByb2R1Y2VzIHJlc3VsdHMgb2YgdGhlIHNhbWUgYnJhbmQuIFRoaXMgcmVwcmVzZW50cyBhIG11bHRpcGxpZXIqL1xuLyogdGhhdCBpcyBvbmx5IGFwcGxpY2FibGUgdG8gdGhhdCBicmFuZC4gVGhlIGxlc3MgY29tbW9uIGtpbmQgb2YgUmF0aW8gY2FuIGJlKi9cbi8qIGFwcGxpZWQgdG8gb25lIHBhcnRpY3VsYXIgYnJhbmQgb2YgYW1vdW50cywgYW5kIHByb2R1Y2VzIHJlc3VsdHMgb2YgYW5vdGhlciovXG4vKiBwYXJ0aWN1bGFyIGJyYW5kLiBUaGlzIHJlcHJlc2VudHMgc29tZSBraW5kIG9mIGV4Y2hhbmdlIHJhdGUuIFRoZSovXG4vKiBicmFuZC1jaGVja2luZyBoZWxwcyB1cyBlbnN1cmUgdGhhdCBub3JtYWwgUmF0aW9zIGFyZW4ndCBhcHBsaWVkIHRvIGFtb3VudHMqL1xuLyogb2YgdGhlIHdyb25nIGJyYW5kLCBhbmQgdGhhdCBleGNoYW5nZSByYXRlcyBhcmUgb25seSB1c2VkIGluIHRoZSBhcHByb3ByaWF0ZSovXG4vKiBkaXJlY3Rpb24uKi9cbi8qKi9cbi8qIFNpbmNlIHRoZSByYXRpb3MgYXJlIHJlcHJlc2VudGVkIGJ5IGEgbnVtZXJhdG9yIGFuZCBhIGRlbm9taW5hdG9yLCBldmVyeSovXG4vKiBtdWx0aXBsaWNhdGlvbiBvciBkaXZpc2lvbiBvcGVyYXRpb24gdGhhdCBwcm9kdWNlcyBhbiBhbW91bnQgZW5kcyB3aXRoIGEqL1xuLyogZGl2aXNpb24gb2YgdGhlIHVuZGVybHlpbmcgYmlnaW50cywgYW5kIGludGVnZXIgZGl2aXNpb24gcmVxdWlyZXMgYSBtb2RlKi9cbi8qIG9mIFtyb3VuZGluZyB0byBpbnRlZ2VyXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Sb3VuZGluZyNSb3VuZGluZ190b19pbnRlZ2VyKS4qL1xuLyogQmVjYXVzZSBgUmF0aW9gIG9ubHkgd29yayB3aXRoIE5hdHVyYWwgbnVtYmVycywganVzdCB0aHJlZSBtb2RlcyBzdWZmaWNlOiovXG4vKiAtIGZsb29yIHJvdW5kcyBkb3duKi9cbi8qIC0gY2VpbCByb3VuZHMgdXAqL1xuLyogLSBkZWZhdWx0ICh3aXRob3V0IHByZWZpeCkgbWluaW1pemVzIGJpYXMgYnkgcm91bmRpbmcgaGFsZiB0byBldmVuKi9cblxuY29uc3QgUEVSQ0VOVD0xMDBuO1xuXG5jb25zdCByYXRpb1Byb3BlcnR5TmFtZXM9WydudW1lcmF0b3InLCdkZW5vbWluYXRvciddO1xuXG5jb25zdCAgICAgICAgYXNzZXJ0SXNSYXRpbz0ocmF0aW8pPT57XG5hc3NlcnRSZWNvcmQocmF0aW8sJ3JhdGlvJyk7XG5jb25zdCBrZXlzPU9iamVjdC5rZXlzKHJhdGlvKTtcbmFzc2VydChrZXlzLmxlbmd0aD09PTIsWCBgUmF0aW8gJHtyYXRpb30gbXVzdCBiZSBhIHJlY29yZCB3aXRoIDIgZmllbGRzLmApO1xuZm9yKGNvbnN0IG5hbWUgb2Yga2V5cyl7XG5yYXRpb1Byb3BlcnR5TmFtZXMuaW5jbHVkZXMobmFtZSl8fFxuYXNzZXJ0LmZhaWwoXG5YIGBQYXJhbWV0ZXIgbXVzdCBiZSBhIFJhdGlvIHJlY29yZCwgYnV0ICR7cmF0aW99IGhhcyAke3EobmFtZSl9YCk7XG5cbiB9XG5jb25zdCBudW1lcmF0b3JWYWx1ZT1yYXRpby5udW1lcmF0b3IudmFsdWU7XG5jb25zdCBkZW5vbWluYXRvclZhbHVlPXJhdGlvLmRlbm9taW5hdG9yLnZhbHVlO1xuaXNOYXQobnVtZXJhdG9yVmFsdWUpfHxcbmFzc2VydC5mYWlsKFxuWCBgVGhlIG51bWVyYXRvciB2YWx1ZSBtdXN0IGJlIGEgTmF0VmFsdWUsIG5vdCAke251bWVyYXRvclZhbHVlfWApO1xuXG5pc05hdChkZW5vbWluYXRvclZhbHVlKXx8XG5hc3NlcnQuZmFpbChcblggYFRoZSBkZW5vbWluYXRvciB2YWx1ZSBtdXN0IGJlIGEgTmF0VmFsdWUsIG5vdCAke2Rlbm9taW5hdG9yVmFsdWV9YCk7XG5cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7YmlnaW50fSBudW1lcmF0b3JcbiAqIEBwYXJhbSB7QnJhbmR9IG51bWVyYXRvckJyYW5kXG4gKiBAcGFyYW0ge2JpZ2ludD19IGRlbm9taW5hdG9yIFRoZSBkZWZhdWx0IGRlbm9taW5hdG9yIGlzIDEwMFxuICogQHBhcmFtIHtCcmFuZD19IGRlbm9taW5hdG9yQnJhbmQgVGhlIGRlZmF1bHQgaXMgdG8gcmV1c2UgdGhlIG51bWVyYXRvckJyYW5kXG4gKiBAcmV0dXJucyB7UmF0aW99XG4gKi8kaOKAjV9vbmNlLmFzc2VydElzUmF0aW8oYXNzZXJ0SXNSYXRpbyk7XG5jb25zdCAgICAgICAgbWFrZVJhdGlvPShcbm51bWVyYXRvcixcbm51bWVyYXRvckJyYW5kLFxuZGVub21pbmF0b3I9UEVSQ0VOVCxcbmRlbm9taW5hdG9yQnJhbmQ9bnVtZXJhdG9yQnJhbmQpPT5cbntcbmRlbm9taW5hdG9yPjBufHxcbmFzc2VydC5mYWlsKFxuWCBgTm8gaW5maW5pdGUgcmF0aW9zISBEZW5vbWluYXRvciB3YXMgMC8ke3EoZGVub21pbmF0b3JCcmFuZCl9YCk7XG5cblxucmV0dXJuIGhhcmRlbih7XG5udW1lcmF0b3I6QW1vdW50TWF0aC5tYWtlKG51bWVyYXRvckJyYW5kLG51bWVyYXRvciksXG5kZW5vbWluYXRvcjpBbW91bnRNYXRoLm1ha2UoZGVub21pbmF0b3JCcmFuZCxkZW5vbWluYXRvcil9KTtcblxuIH07XG5cbi8qKlxuICogQHBhcmFtIHtBbW91bnR9IG51bWVyYXRvckFtb3VudFxuICogQHBhcmFtIHtBbW91bnR9IGRlbm9taW5hdG9yQW1vdW50XG4gKiBAcmV0dXJucyB7UmF0aW99XG4gKi8kaOKAjV9vbmNlLm1ha2VSYXRpbyhtYWtlUmF0aW8pO1xuY29uc3QgICAgICAgIG1ha2VSYXRpb0Zyb21BbW91bnRzPShudW1lcmF0b3JBbW91bnQsZGVub21pbmF0b3JBbW91bnQpPT57XG5BbW91bnRNYXRoLmNvZXJjZShudW1lcmF0b3JBbW91bnQuYnJhbmQsbnVtZXJhdG9yQW1vdW50KTtcbkFtb3VudE1hdGguY29lcmNlKGRlbm9taW5hdG9yQW1vdW50LmJyYW5kLGRlbm9taW5hdG9yQW1vdW50KTtcbnJldHVybiBtYWtlUmF0aW8oXG4vKiBAdHMtZXhwZWN0LWVycm9yIHZhbHVlIGNhbiBiZSBhbnkgQW1vdW50VmFsdWUgYnV0IG1ha2VSYXRpbygpIHN1cHBvcnRzIG9ubHkgYmlnaW50Ki9cbm51bWVyYXRvckFtb3VudC52YWx1ZSxcbm51bWVyYXRvckFtb3VudC5icmFuZCxcbmRlbm9taW5hdG9yQW1vdW50LnZhbHVlLFxuZGVub21pbmF0b3JBbW91bnQuYnJhbmQpO1xuXG4gfTskaOKAjV9vbmNlLm1ha2VSYXRpb0Zyb21BbW91bnRzKG1ha2VSYXRpb0Zyb21BbW91bnRzKTtcblxuY29uc3QgbXVsdGlwbHlIZWxwZXI9KGFtb3VudCxyYXRpbyxkaXZpZGVPcCk9PntcbkFtb3VudE1hdGguY29lcmNlKGFtb3VudC5icmFuZCxhbW91bnQpO1xuYXNzZXJ0SXNSYXRpbyhyYXRpbyk7XG5hc3NlcnQoXG5hbW91bnQuYnJhbmQ9PT1yYXRpby5kZW5vbWluYXRvci5icmFuZCxcblggYGFtb3VudCdzIGJyYW5kICR7cShhbW91bnQuYnJhbmQpfSBtdXN0IG1hdGNoIHJhdGlvJ3MgZGVub21pbmF0b3IgJHtxKFxucmF0aW8uZGVub21pbmF0b3IuYnJhbmQpXG4gfWApO1xuXG5cbnJldHVybiBBbW91bnRNYXRoLm1ha2UoXG5yYXRpby5udW1lcmF0b3IuYnJhbmQsXG5kaXZpZGVPcChcbm11bHRpcGx5KGFtb3VudC52YWx1ZSxyYXRpby5udW1lcmF0b3IudmFsdWUpLFxucmF0aW8uZGVub21pbmF0b3IudmFsdWUpKTtcblxuXG4gfTtcblxuLyoqIEB0eXBlIHtTY2FsZUFtb3VudH0gKi9cbmNvbnN0ICAgICAgICBmbG9vck11bHRpcGx5Qnk9KGFtb3VudCxyYXRpbyk9PntcbnJldHVybiBtdWx0aXBseUhlbHBlcihhbW91bnQscmF0aW8sZmxvb3JEaXZpZGUpO1xuIH07XG5cbi8qKiBAdHlwZSB7U2NhbGVBbW91bnR9ICovJGjigI1fb25jZS5mbG9vck11bHRpcGx5QnkoZmxvb3JNdWx0aXBseUJ5KTtcbmNvbnN0ICAgICAgICBjZWlsTXVsdGlwbHlCeT0oYW1vdW50LHJhdGlvKT0+e1xucmV0dXJuIG11bHRpcGx5SGVscGVyKGFtb3VudCxyYXRpbyxjZWlsRGl2aWRlKTtcbiB9O1xuXG4vKiogQHR5cGUge1NjYWxlQW1vdW50fSAqLyRo4oCNX29uY2UuY2VpbE11bHRpcGx5QnkoY2VpbE11bHRpcGx5QnkpO1xuY29uc3QgICAgICAgIG11bHRpcGx5Qnk9KGFtb3VudCxyYXRpbyk9PntcbnJldHVybiBtdWx0aXBseUhlbHBlcihhbW91bnQscmF0aW8sYmFua2Vyc0RpdmlkZSk7XG4gfTskaOKAjV9vbmNlLm11bHRpcGx5QnkobXVsdGlwbHlCeSk7XG5cbmNvbnN0IGRpdmlkZUhlbHBlcj0oYW1vdW50LHJhdGlvLGRpdmlkZU9wKT0+e1xuQW1vdW50TWF0aC5jb2VyY2UoYW1vdW50LmJyYW5kLGFtb3VudCk7XG5hc3NlcnRJc1JhdGlvKHJhdGlvKTtcbmFzc2VydChcbmFtb3VudC5icmFuZD09PXJhdGlvLm51bWVyYXRvci5icmFuZCxcblggYGFtb3VudCdzIGJyYW5kICR7cShhbW91bnQuYnJhbmQpfSBtdXN0IG1hdGNoIHJhdGlvJ3MgbnVtZXJhdG9yICR7cShcbnJhdGlvLm51bWVyYXRvci5icmFuZClcbiB9YCk7XG5cblxucmV0dXJuIEFtb3VudE1hdGgubWFrZShcbnJhdGlvLmRlbm9taW5hdG9yLmJyYW5kLFxuZGl2aWRlT3AoXG5tdWx0aXBseShhbW91bnQudmFsdWUscmF0aW8uZGVub21pbmF0b3IudmFsdWUpLFxucmF0aW8ubnVtZXJhdG9yLnZhbHVlKSk7XG5cblxuIH07XG5cbi8qKiBAdHlwZSB7U2NhbGVBbW91bnR9ICovXG5jb25zdCAgICAgICAgZmxvb3JEaXZpZGVCeT0oYW1vdW50LHJhdGlvKT0+e1xucmV0dXJuIGRpdmlkZUhlbHBlcihhbW91bnQscmF0aW8sZmxvb3JEaXZpZGUpO1xuIH07XG5cbi8qKiBAdHlwZSB7U2NhbGVBbW91bnR9ICovJGjigI1fb25jZS5mbG9vckRpdmlkZUJ5KGZsb29yRGl2aWRlQnkpO1xuY29uc3QgICAgICAgIGNlaWxEaXZpZGVCeT0oYW1vdW50LHJhdGlvKT0+e1xucmV0dXJuIGRpdmlkZUhlbHBlcihhbW91bnQscmF0aW8sY2VpbERpdmlkZSk7XG4gfTtcblxuLyoqIEB0eXBlIHtTY2FsZUFtb3VudH0gKi8kaOKAjV9vbmNlLmNlaWxEaXZpZGVCeShjZWlsRGl2aWRlQnkpO1xuY29uc3QgICAgICAgIGRpdmlkZUJ5PShhbW91bnQscmF0aW8pPT57XG5yZXR1cm4gZGl2aWRlSGVscGVyKGFtb3VudCxyYXRpbyxiYW5rZXJzRGl2aWRlKTtcbiB9O1xuXG4vKipcbiAqXG4gKiBAcGFyYW0ge1JhdGlvfSByYXRpb1xuICogQHJldHVybnMge1JhdGlvfVxuICovJGjigI1fb25jZS5kaXZpZGVCeShkaXZpZGVCeSk7XG5jb25zdCAgICAgICAgaW52ZXJ0UmF0aW89KHJhdGlvKT0+e1xuYXNzZXJ0SXNSYXRpbyhyYXRpbyk7XG5cbnJldHVybiBtYWtlUmF0aW8oXG4vKiogQHR5cGUge05hdFZhbHVlfSAqL3JhdGlvLmRlbm9taW5hdG9yLnZhbHVlLFxucmF0aW8uZGVub21pbmF0b3IuYnJhbmQsXG4vKiogQHR5cGUge05hdFZhbHVlfSAqL3JhdGlvLm51bWVyYXRvci52YWx1ZSxcbnJhdGlvLm51bWVyYXRvci5icmFuZCk7XG5cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UmF0aW99IGxlZnRcbiAqIEBwYXJhbSB7UmF0aW99IHJpZ2h0XG4gKiBAcmV0dXJucyB7UmF0aW99XG4gKi8kaOKAjV9vbmNlLmludmVydFJhdGlvKGludmVydFJhdGlvKTtcbmNvbnN0ICAgICAgICBhZGRSYXRpb3M9KGxlZnQscmlnaHQpPT57XG5hc3NlcnRJc1JhdGlvKHJpZ2h0KTtcbmFzc2VydElzUmF0aW8obGVmdCk7XG5hc3NlcnQuZXF1YWwoXG5sZWZ0Lm51bWVyYXRvci5icmFuZCxcbnJpZ2h0Lm51bWVyYXRvci5icmFuZCxcblggYG51bWVyYXRvciBicmFuZHMgbXVzdCBtYXRjaDogJHtxKGxlZnQpfSAke3EocmlnaHQpfWApO1xuXG5hc3NlcnQuZXF1YWwoXG5sZWZ0LmRlbm9taW5hdG9yLmJyYW5kLFxucmlnaHQuZGVub21pbmF0b3IuYnJhbmQsXG5YIGBkZW5vbWluYXRvciBicmFuZHMgbXVzdCBtYXRjaDogJHtxKGxlZnQpfSAke3EocmlnaHQpfWApO1xuXG5cbi8qIFNpbXBsaWZ5aW5nIHRoZSBleHByZXNzaW9uOiovXG4vKiAoYW5kICsgYm5kKSAvIHkgZCoqMiovXG4vKiAoYSArIGIpIG5kIC8geSBkKioyKi9cbi8qICgoYSArIGIpIG4gLyB5IGQpICogKGQgLyBkKSovXG4vKiAoYSArIGIpIG4gLyB5ZCovXG5yZXR1cm4gbWFrZVJhdGlvKFxuYWRkKFxubXVsdGlwbHkobGVmdC5udW1lcmF0b3IudmFsdWUscmlnaHQuZGVub21pbmF0b3IudmFsdWUpLC8qIGEgbmQqL1xubXVsdGlwbHkobGVmdC5kZW5vbWluYXRvci52YWx1ZSxyaWdodC5udW1lcmF0b3IudmFsdWUpLyogYiBuZCovKSxcbi8qIChhICsgYikgbmQqL1xubGVmdC5udW1lcmF0b3IuYnJhbmQsXG5tdWx0aXBseShsZWZ0LmRlbm9taW5hdG9yLnZhbHVlLHJpZ2h0LmRlbm9taW5hdG9yLnZhbHVlKSwvKiB5IGQqKjIqL1xubGVmdC5kZW5vbWluYXRvci5icmFuZCk7XG5cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UmF0aW99IGxlZnRcbiAqIEBwYXJhbSB7UmF0aW99IHJpZ2h0XG4gKiBAcmV0dXJucyB7UmF0aW99XG4gKi8kaOKAjV9vbmNlLmFkZFJhdGlvcyhhZGRSYXRpb3MpO1xuY29uc3QgICAgICAgIHN1YnRyYWN0UmF0aW9zPShsZWZ0LHJpZ2h0KT0+e1xuYXNzZXJ0SXNSYXRpbyhyaWdodCk7XG5hc3NlcnRJc1JhdGlvKGxlZnQpO1xuYXNzZXJ0LmVxdWFsKFxubGVmdC5udW1lcmF0b3IuYnJhbmQsXG5yaWdodC5udW1lcmF0b3IuYnJhbmQsXG5YIGBudW1lcmF0b3IgYnJhbmRzIG11c3QgbWF0Y2g6ICR7cShsZWZ0KX0gJHtxKHJpZ2h0KX1gKTtcblxuYXNzZXJ0LmVxdWFsKFxubGVmdC5kZW5vbWluYXRvci5icmFuZCxcbnJpZ2h0LmRlbm9taW5hdG9yLmJyYW5kLFxuWCBgZGVub21pbmF0b3IgYnJhbmRzIG11c3QgbWF0Y2g6ICR7cShsZWZ0KX0gJHtxKHJpZ2h0KX1gKTtcblxuXG5yZXR1cm4gbWFrZVJhdGlvKFxuc3VidHJhY3QoXG5tdWx0aXBseShsZWZ0Lm51bWVyYXRvci52YWx1ZSxyaWdodC5kZW5vbWluYXRvci52YWx1ZSksLyogYSBuZCovXG5tdWx0aXBseShsZWZ0LmRlbm9taW5hdG9yLnZhbHVlLHJpZ2h0Lm51bWVyYXRvci52YWx1ZSkvKiBiIG5kKi8pLFxuLyogKGEgLSBiKSBuZCovXG5sZWZ0Lm51bWVyYXRvci5icmFuZCxcbm11bHRpcGx5KGxlZnQuZGVub21pbmF0b3IudmFsdWUscmlnaHQuZGVub21pbmF0b3IudmFsdWUpLC8qIHkgZCoqMiovXG5sZWZ0LmRlbm9taW5hdG9yLmJyYW5kKTtcblxuIH07XG5cbi8qKlxuICogQHBhcmFtIHtSYXRpb30gbGVmdFxuICogQHBhcmFtIHtSYXRpb30gcmlnaHRcbiAqIEByZXR1cm5zIHtSYXRpb31cbiAqLyRo4oCNX29uY2Uuc3VidHJhY3RSYXRpb3Moc3VidHJhY3RSYXRpb3MpO1xuY29uc3QgICAgICAgIG11bHRpcGx5UmF0aW9zPShsZWZ0LHJpZ2h0KT0+e1xuYXNzZXJ0SXNSYXRpbyhyaWdodCk7XG5hc3NlcnRJc1JhdGlvKGxlZnQpO1xuXG5jb25zdCBnZXRSZW1haW5pbmdCcmFuZHM9KCk9Pntcbi8qIFByZWZlciByZXN1bHRzIHRoYXQgaGF2ZSB0aGUgc2FtZSBicmFuZCBhcyB0aGUgbGVmdCBvcGVyYW5kLiovXG5pZihyaWdodC5udW1lcmF0b3IuYnJhbmQ9PT1yaWdodC5kZW5vbWluYXRvci5icmFuZCl7XG5yZXR1cm5bbGVmdC5udW1lcmF0b3IuYnJhbmQsbGVmdC5kZW5vbWluYXRvci5icmFuZF07XG4gfVxuaWYocmlnaHQubnVtZXJhdG9yLmJyYW5kPT09bGVmdC5kZW5vbWluYXRvci5icmFuZCl7XG5yZXR1cm5bbGVmdC5udW1lcmF0b3IuYnJhbmQscmlnaHQuZGVub21pbmF0b3IuYnJhbmRdO1xuIH1cbmlmKGxlZnQubnVtZXJhdG9yLmJyYW5kPT09cmlnaHQuZGVub21pbmF0b3IuYnJhbmQpe1xucmV0dXJuW3JpZ2h0Lm51bWVyYXRvci5icmFuZCxsZWZ0LmRlbm9taW5hdG9yLmJyYW5kXTtcbiB9XG5pZihsZWZ0Lm51bWVyYXRvci5icmFuZD09PWxlZnQuZGVub21pbmF0b3IuYnJhbmQpe1xucmV0dXJuW3JpZ2h0Lm51bWVyYXRvci5icmFuZCxyaWdodC5kZW5vbWluYXRvci5icmFuZF07XG4gfVxuYXNzZXJ0LmZhaWwoWCBgYXQgbGVhc3Qgb25lIGJyYW5kIG11c3QgY2FuY2VsIG91dDogJHtxKGxlZnQpfSAke3EocmlnaHQpfWApO1xuIH07XG5cbmNvbnN0W251bWVyYXRvckJyYW5kLGRlbm9taW5hdG9yQnJhbmRdPWdldFJlbWFpbmluZ0JyYW5kcygpO1xucmV0dXJuIG1ha2VSYXRpbyhcbm11bHRpcGx5KGxlZnQubnVtZXJhdG9yLnZhbHVlLHJpZ2h0Lm51bWVyYXRvci52YWx1ZSksXG5udW1lcmF0b3JCcmFuZCxcbm11bHRpcGx5KGxlZnQuZGVub21pbmF0b3IudmFsdWUscmlnaHQuZGVub21pbmF0b3IudmFsdWUpLFxuZGVub21pbmF0b3JCcmFuZCk7XG5cbiB9O1xuXG4vKipcbiAqIElmIHJhdGlvIGlzIGJldHdlZW4gMCBhbmQgMSwgc3VidHJhY3QgZnJvbSAxLlxuICpcbiAqIEBwYXJhbSB7UmF0aW99IHJhdGlvXG4gKiBAcmV0dXJucyB7UmF0aW99XG4gKi8kaOKAjV9vbmNlLm11bHRpcGx5UmF0aW9zKG11bHRpcGx5UmF0aW9zKTtcbmNvbnN0ICAgICAgICBvbmVNaW51cz0ocmF0aW8pPT57XG5hc3NlcnRJc1JhdGlvKHJhdGlvKTtcbnJhdGlvLm51bWVyYXRvci5icmFuZD09PXJhdGlvLmRlbm9taW5hdG9yLmJyYW5kfHxcbmFzc2VydC5mYWlsKFxuWCBgb25lTWludXMgb25seSBzdXBwb3J0cyByYXRpb3Mgd2l0aCBhIHNpbmdsZSBicmFuZCwgYnV0ICR7cmF0aW8ubnVtZXJhdG9yLmJyYW5kfSBkb2Vzbid0IG1hdGNoICR7cmF0aW8uZGVub21pbmF0b3IuYnJhbmR9YCk7XG5cbnJhdGlvLm51bWVyYXRvci52YWx1ZTw9cmF0aW8uZGVub21pbmF0b3IudmFsdWV8fFxuYXNzZXJ0LmZhaWwoXG5YIGBQYXJhbWV0ZXIgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMTogJHtyYXRpby5udW1lcmF0b3IudmFsdWV9LyR7cmF0aW8uZGVub21pbmF0b3IudmFsdWV9YCk7XG5cbnJldHVybiBtYWtlUmF0aW8oXG5zdWJ0cmFjdChyYXRpby5kZW5vbWluYXRvci52YWx1ZSxyYXRpby5udW1lcmF0b3IudmFsdWUpLFxucmF0aW8ubnVtZXJhdG9yLmJyYW5kLFxucmF0aW8uZGVub21pbmF0b3IudmFsdWUsXG5yYXRpby5udW1lcmF0b3IuYnJhbmQpO1xuXG4gfTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHtSYXRpb30gbGVmdFxuICogQHBhcmFtIHtSYXRpb30gcmlnaHRcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovJGjigI1fb25jZS5vbmVNaW51cyhvbmVNaW51cyk7XG5jb25zdCAgICAgICAgcmF0aW9HVEU9KGxlZnQscmlnaHQpPT57XG5pZihsZWZ0Lm51bWVyYXRvci5icmFuZD09PXJpZ2h0Lm51bWVyYXRvci5icmFuZCl7XG5hc3NlcnQuZXF1YWwoXG5sZWZ0LmRlbm9taW5hdG9yLmJyYW5kLFxucmlnaHQuZGVub21pbmF0b3IuYnJhbmQsXG5YIGBudW1lcmF0b3IgYnJhbmRzIG1hdGNoLCBidXQgZGVub21pbmF0b3IgYnJhbmRzIGRvbid0OiAke3EobGVmdCl9ICR7cShcbnJpZ2h0KVxuIH1gKTtcblxuIH1lbHNlIGlmKGxlZnQubnVtZXJhdG9yLmJyYW5kPT09bGVmdC5kZW5vbWluYXRvci5icmFuZCl7XG5hc3NlcnQuZXF1YWwoXG5yaWdodC5udW1lcmF0b3IuYnJhbmQsXG5yaWdodC5kZW5vbWluYXRvci5icmFuZCxcblggYGxlZnRoYW5kIGJyYW5kcyBtYXRjaCwgYnV0IHJpZ2h0aGFuZCBicmFuZHMgZG9uJ3Q6ICR7cShsZWZ0KX0gJHtxKFxucmlnaHQpXG4gfWApO1xuXG4gfVxucmV0dXJuIG5hdFNhZmVNYXRoLmlzR1RFKFxubXVsdGlwbHkobGVmdC5udW1lcmF0b3IudmFsdWUscmlnaHQuZGVub21pbmF0b3IudmFsdWUpLFxubXVsdGlwbHkocmlnaHQubnVtZXJhdG9yLnZhbHVlLGxlZnQuZGVub21pbmF0b3IudmFsdWUpKTtcblxuIH07XG5cbi8qKlxuICogVHJ1ZSBpZmYgdGhlIHJhdGlvcyBhcmUgdGhlIHNhbWUgdmFsdWVzIChlcXVhbCBvciBlcXVpdmFsYW50IG1heSByZXR1cm4gZmFsc2UpXG4gKlxuICogQHBhcmFtIHtSYXRpb30gbGVmdFxuICogQHBhcmFtIHtSYXRpb30gcmlnaHRcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovJGjigI1fb25jZS5yYXRpb0dURShyYXRpb0dURSk7XG5jb25zdCAgICAgICAgcmF0aW9zU2FtZT0obGVmdCxyaWdodCk9PntcbnJldHVybihcbkFtb3VudE1hdGguaXNFcXVhbChsZWZ0Lm51bWVyYXRvcixyaWdodC5udW1lcmF0b3IpJiZcbkFtb3VudE1hdGguaXNFcXVhbChsZWZ0LmRlbm9taW5hdG9yLHJpZ2h0LmRlbm9taW5hdG9yKSk7XG5cbiB9O1xuXG4vKipcbiAqIE1ha2UgYW4gZXF1aXZhbGFudCByYXRpbyB3aXRoIGEgbmV3IGRlbm9taW5hdG9yXG4gKlxuICogQHBhcmFtIHtSYXRpb30gcmF0aW9cbiAqIEBwYXJhbSB7YmlnaW50fSBuZXdEZW5cbiAqIEByZXR1cm5zIHtSYXRpb31cbiAqLyRo4oCNX29uY2UucmF0aW9zU2FtZShyYXRpb3NTYW1lKTtcbmNvbnN0ICAgICAgICBxdWFudGl6ZT0ocmF0aW8sbmV3RGVuKT0+e1xuY29uc3Qgb2xkRGVuPXJhdGlvLmRlbm9taW5hdG9yLnZhbHVlO1xuY29uc3Qgb2xkTnVtPXJhdGlvLm51bWVyYXRvci52YWx1ZTtcbmNvbnN0IG5ld051bT1cbm5ld0Rlbj09PW9sZERlbj9vbGROdW06YmFua2Vyc0RpdmlkZShvbGROdW0qbmV3RGVuLG9sZERlbik7XG5yZXR1cm4gbWFrZVJhdGlvKFxubmV3TnVtLFxucmF0aW8ubnVtZXJhdG9yLmJyYW5kLFxubmV3RGVuLFxucmF0aW8uZGVub21pbmF0b3IuYnJhbmQpO1xuXG4gfTtcblxuLyoqXG4gKiBDcmVhdGUgYSByYXRpbyBmcm9tIGEgZ2l2ZW4gbnVtZXJpYyB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlciB8IGJpZ2ludH0gbnVtZXJpY1xuICogQHBhcmFtIHtCcmFuZH0gbnVtZXJhdG9yQnJhbmRcbiAqIEBwYXJhbSB7QnJhbmR9IFtkZW5vbWluYXRvckJyYW5kXVxuICogQHJldHVybnMge1JhdGlvfVxuICovJGjigI1fb25jZS5xdWFudGl6ZShxdWFudGl6ZSk7XG5jb25zdCAgICAgICAgcGFyc2VSYXRpbz0oXG5udW1lcmljLFxubnVtZXJhdG9yQnJhbmQsXG5kZW5vbWluYXRvckJyYW5kPW51bWVyYXRvckJyYW5kKT0+XG57XG5jb25zdCBtYXRjaD0gYCR7bnVtZXJpY31gLm1hdGNoKC9eKFxcZFxcZCopKD86XFwuKFxcZCopKT8kLyk7XG5hc3NlcnQobWF0Y2gsWCBgSW52YWxpZCBudW1lcmljIGRhdGE6ICR7bnVtZXJpY31gKTtcblxuY29uc3Rbd2hvbGUscGFydD0nJ109W21hdGNoWzFdLG1hdGNoWzJdXTtcbnJldHVybiBtYWtlUmF0aW8oXG5CaWdJbnQoIGAke3dob2xlfSR7cGFydH1gKSxcbm51bWVyYXRvckJyYW5kLFxuMTBuKipCaWdJbnQocGFydC5sZW5ndGgpLFxuZGVub21pbmF0b3JCcmFuZCk7XG5cbiB9OyRo4oCNX29uY2UucGFyc2VSYXRpbyhwYXJzZVJhdGlvKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhc3NlcnRJc1JhdGlvIjpbImFzc2VydElzUmF0aW8iXSwibWFrZVJhdGlvIjpbIm1ha2VSYXRpbyJdLCJtYWtlUmF0aW9Gcm9tQW1vdW50cyI6WyJtYWtlUmF0aW9Gcm9tQW1vdW50cyJdLCJmbG9vck11bHRpcGx5QnkiOlsiZmxvb3JNdWx0aXBseUJ5Il0sImNlaWxNdWx0aXBseUJ5IjpbImNlaWxNdWx0aXBseUJ5Il0sIm11bHRpcGx5QnkiOlsibXVsdGlwbHlCeSJdLCJmbG9vckRpdmlkZUJ5IjpbImZsb29yRGl2aWRlQnkiXSwiY2VpbERpdmlkZUJ5IjpbImNlaWxEaXZpZGVCeSJdLCJkaXZpZGVCeSI6WyJkaXZpZGVCeSJdLCJpbnZlcnRSYXRpbyI6WyJpbnZlcnRSYXRpbyJdLCJhZGRSYXRpb3MiOlsiYWRkUmF0aW9zIl0sInN1YnRyYWN0UmF0aW9zIjpbInN1YnRyYWN0UmF0aW9zIl0sIm11bHRpcGx5UmF0aW9zIjpbIm11bHRpcGx5UmF0aW9zIl0sIm9uZU1pbnVzIjpbIm9uZU1pbnVzIl0sInJhdGlvR1RFIjpbInJhdGlvR1RFIl0sInJhdGlvc1NhbWUiOlsicmF0aW9zU2FtZSJdLCJxdWFudGl6ZSI6WyJxdWFudGl6ZSJdLCJwYXJzZVJhdGlvIjpbInBhcnNlUmF0aW8iXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAXAxaDMUFAADFBQAAMwAAAEBhZ29yaWMvem9lLXYwLjI1LjUvc3JjL2NvbnRyYWN0U3VwcG9ydC9zYWZlTWF0aC5qc3siaW1wb3J0cyI6WyJAYWdvcmljL25hdCJdLCJleHBvcnRzIjpbIm5hdFNhZmVNYXRoIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IE5hdDskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL25hdFwiLCBbW1wiTmF0XCIsIFskaOKAjV9hID0+IChOYXQgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cbi8qKlxuICogVGhlc2Ugb3BlcmF0aW9ucyBzaG91bGQgYmUgdXNlZCBmb3IgY2FsY3VsYXRpb25zIHdpdGggdGhlIHZhbHVlcyBvZlxuICogYmFzaWMgZnVuZ2libGUgdG9rZW5zLlxuICpcbiAqIG5hdFNhZmVNYXRoIGlzIGRlc2lnbmVkIHRvIGJlIHVzZWQgZGlyZWN0bHksIGFuZCBzbyBpdCBuZWVkcyB0b1xuICogdmFsaWRhdGUgdGhlIGlucHV0cywgYXMgd2VsbCBhcyB0aGUgb3V0cHV0cyB3aGVuIG5lY2Vzc2FyeS5cbiAqL1xuY29uc3QgICAgICAgIG5hdFNhZmVNYXRoPWhhcmRlbih7XG4vKiBCaWdJbnRzIGRvbid0IG9ic2VydmFibHkgb3ZlcmZsb3cqL1xuYWRkOih4LHkpPT5OYXQoeCkrTmF0KHkpLFxuc3VidHJhY3Q6KHgseSk9Pk5hdChOYXQoeCktTmF0KHkpKSxcbm11bHRpcGx5Oih4LHkpPT5OYXQoeCkqTmF0KHkpLFxuZmxvb3JEaXZpZGU6KHgseSk9Pk5hdCh4KS9OYXQoeSksXG5jZWlsRGl2aWRlOih4LHkpPT57XG55PU5hdCh5KTtcbnJldHVybiBOYXQoTmF0KHgpK3ktMW4pL3k7XG4gfSxcbi8qKlxuICogRGl2aWRlIHVzaW5nIGhhbGYtdG8tZXZlbiAoYWthIEJhbmtlcidzIFJvdW5kaW5nKSBhcyBpbiBJRUVFIDc3NCBkZWZhdWx0IHJvdW5kaW5nXG4gKlxuICogQHBhcmFtIHtOYXRWYWx1ZX0gYVxuICogQHBhcmFtIHtOYXRWYWx1ZX0gYlxuICovXG5iYW5rZXJzRGl2aWRlOihhLGIpPT57XG5hPU5hdChhKTtcbmI9TmF0KGIpO1xuXG5jb25zdCBkaXY9YS9iO1xuY29uc3QgcmVtPWElYjtcbi8qIGlmIHJlbWFpbmRlciA+IGhhbGYgZGl2aXNvciwgc2hvdWxkIGhhdmUgcm91bmRlZCB1cCBpbnN0ZWFkIG9mIGRvd24sIHNvIGFkZCAxKi9cbmlmKHJlbSoybj5iKXtcbnJldHVybiBkaXYrMW47XG4gfWVsc2UgaWYocmVtKjJuPT09Yil7XG4vKiBBZGQgMSBpZiByZXN1bHQgaXMgb2RkIHRvIGdldCBhbiBldmVuIHJldHVybiB2YWx1ZSovXG5pZihkaXYlMm49PT0xbilyZXR1cm4gZGl2KzFuO1xuIH1cbnJldHVybiBkaXY7XG4gfSxcbmlzR1RFOih4LHkpPT5OYXQoeCk+PU5hdCh5KX0pOyRo4oCNX29uY2UubmF0U2FmZU1hdGgobmF0U2FmZU1hdGgpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im5hdFNhZmVNYXRoIjpbIm5hdFNhZmVNYXRoIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAOY8s+qJBAAAiQQAADcAAABAYWdvcmljL3pvZS12MC4yNS41L3NyYy9jb250cmFjdFN1cHBvcnQvc3RhdGVNYWNoaW5lLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvYXNzZXJ0Il0sImV4cG9ydHMiOlsibWFrZVN0YXRlTWFjaGluZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnQ7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9hc3NlcnRcIiwgW1tcImFzc2VydFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG4vKiBhbGxvd2VkVHJhbnNpdGlvbnMgaXMgYW4gYXJyYXkgb2YgYXJyYXlzIHdoaWNoIGdldHMgdHVybmVkIGludG8gYVxuICogbWFwLiBUaGUgbWFwIG1hcHMgc3RyaW5nIHN0YXRlcyB0byBhbiBhcnJheSBvZiBwb3RlbnRpYWwgbmV4dFxuICogc3RhdGVzLiBGb3IgZXhhbXBsZSxcbiAqIGNvbnN0IGFsbG93ZWRUcmFuc2l0aW9ucyA9IFtcbiBbJ29wZW4nLCBbJ2Nsb3NlZCddXSxcbiBbJ2Nsb3NlZCcsIFtdXSxcbiAqIF07XG4qL1xuY29uc3QgbWFrZVN0YXRlTWFjaGluZT0oaW5pdGlhbFN0YXRlLGFsbG93ZWRUcmFuc2l0aW9uc0FycmF5KT0+e1xubGV0IHN0YXRlPWluaXRpYWxTdGF0ZTtcbmNvbnN0IGFsbG93ZWRUcmFuc2l0aW9ucz1uZXcgTWFwKGFsbG93ZWRUcmFuc2l0aW9uc0FycmF5KTtcbnJldHVybiBoYXJkZW4oe1xuY2FuVHJhbnNpdGlvblRvOihuZXh0U3RhdGUpPT5cbmFsbG93ZWRUcmFuc2l0aW9ucy5nZXQoc3RhdGUpLmluY2x1ZGVzKG5leHRTdGF0ZSksXG50cmFuc2l0aW9uVG86KG5leHRTdGF0ZSk9PntcbmFzc2VydChhbGxvd2VkVHJhbnNpdGlvbnMuZ2V0KHN0YXRlKS5pbmNsdWRlcyhuZXh0U3RhdGUpKTtcbnN0YXRlPW5leHRTdGF0ZTtcbiB9LFxuZ2V0U3RhdHVzOihfKT0+c3RhdGV9KTtcblxuIH07JGjigI1fb25jZS5tYWtlU3RhdGVNYWNoaW5lKG1ha2VTdGF0ZU1hY2hpbmUpO1xuaGFyZGVuKG1ha2VTdGF0ZU1hY2hpbmUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VTdGF0ZU1hY2hpbmUiOlsibWFrZVN0YXRlTWFjaGluZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABAimz3XwUAAF8FAAA1AAAAQGFnb3JpYy96b2UtdjAuMjUuNS9zcmMvY29udHJhY3RTdXBwb3J0L3N0YXRpc3RpY3MuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImNhbGN1bGF0ZU1lZGlhbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFR5cGVkTWF0aFxuICogQHByb3BlcnR5IHsoYTogVCwgYjogVCkgPT4gVH0gYWRkXG4gKiBAcHJvcGVydHkgeyhhOiBULCBiOiBiaWdpbnQpID0+IFR9IGRpdmlkZVxuICogQHByb3BlcnR5IHsoYTogVCwgYjogVCkgPT4gYm9vbGVhbn0gaXNHVEVcbiAqL1xuXG4vKipcbiAqIENhbGN1bGF0ZSB0aGUgbWVkaWFuIG9mIGEgc2V0IG9mIHNhbXBsZXNcbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtBcnJheTxUPn0gc2FtcGxlcyB0aGUgaW5wdXQgbWVhc3VyZW1lbnRzXG4gKiBAcGFyYW0ge1R5cGVkTWF0aDxUPn0gbWF0aFxuICogQHJldHVybnMge1Q9fSB0aGUgbWVkaWFuICh1bmRlZmluZWQgaWYgbm8gc2FtcGxlcylcbiAqL1xuY29uc3QgICAgICAgIGNhbGN1bGF0ZU1lZGlhbj0oc2FtcGxlcyxtYXRoKT0+e1xuY29uc3Qgc29ydGVkPXNhbXBsZXMuc29ydCgoYSxiKT0+e1xuaWYoIW1hdGguaXNHVEUoYSxiKSl7XG5yZXR1cm4tMTtcbiB9ZWxzZSBpZighbWF0aC5pc0dURShiLGEpKXtcbnJldHVybiAxO1xuIH1cbnJldHVybiAwO1xuIH0pO1xuXG5pZihzb3J0ZWQubGVuZ3RoPT09MCl7XG4vKiBObyB2YWxpZCBzYW1wbGVzLCBkb24ndCByZXBvcnQgYW55dGhpbmcuKi9cbnJldHVybiB1bmRlZmluZWQ7XG4gfVxuXG5pZihzb3J0ZWQubGVuZ3RoJTIhPT0wKXtcbi8qIE9kZCBsZW5ndGgsIGp1c3QgcGljayB0aGUgbWlkZGxlIGVsZW1lbnQuKi9cbnJldHVybiBzb3J0ZWRbKHNvcnRlZC5sZW5ndGgtMSkvMl07XG4gfVxuXG4vKiBFdmVuIGxlbmd0aCwgdGFrZSB0aGUgbWVhbiBvZiB0aGUgdHdvIG1pZGRsZSB2YWx1ZXMuKi9cbmNvbnN0IHNlY29uZEluZGV4PXNvcnRlZC5sZW5ndGgvMjtcbmNvbnN0IHN1bT1tYXRoLmFkZChzb3J0ZWRbc2Vjb25kSW5kZXgtMV0sc29ydGVkW3NlY29uZEluZGV4XSk7XG5yZXR1cm4gbWF0aC5kaXZpZGUoc3VtLDJuKTtcbiB9OyRo4oCNX29uY2UuY2FsY3VsYXRlTWVkaWFuKGNhbGN1bGF0ZU1lZGlhbik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiY2FsY3VsYXRlTWVkaWFuIjpbImNhbGN1bGF0ZU1lZGlhbiJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADEtdRjtgsAALYLAAAwAAAAQGFnb3JpYy96b2UtdjAuMjUuNS9zcmMvY29udHJhY3RTdXBwb3J0L3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQHRzLWNoZWNrKi9cbi8qLyA8cmVmZXJlbmNlIHR5cGVzPVwic2VzXCIvPiovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU2VhdEdhaW5zTG9zc2VzUmVjb3JkXG4gKiBAcHJvcGVydHkge1pDRlNlYXR9IHNlYXRcbiAqIEBwcm9wZXJ0eSB7QW1vdW50S2V5d29yZFJlY29yZH0gZ2FpbnMgLSB3aGF0IHRoZSBzZWF0IHdpbGxcbiAqIGdhaW4gYXMgYSByZXN1bHQgb2YgdGhpcyB0cmFkZVxuICogQHByb3BlcnR5IHtBbW91bnRLZXl3b3JkUmVjb3JkPX0gbG9zc2VzIC0gd2hhdCB0aGUgc2VhdCB3aWxsXG4gKiBnaXZlIHVwIGFzIGEgcmVzdWx0IG9mIHRoaXMgdHJhZGUuIExvc3NlcyBpcyBvcHRpb25hbCwgYnV0IGNhblxuICogb25seSBiZSBvbWl0dGVkIGlmIHRoZSBrZXl3b3JkcyBmb3IgYm90aCBzZWF0cyBhcmUgdGhlIHNhbWUuXG4gKiBJZiBsb3NzZXMgaXMgbm90IGRlZmluZWQsIHRoZSBnYWlucyBvZiB0aGUgb3RoZXIgc2VhdCBpc1xuICogc3VidHJhY3RlZC5cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBTd2FwXG4gKiBJZiB0d28gc2VhdHMgY2FuIHNhdGlzZnkgZWFjaCBvdGhlcidzIHdhbnRzLCB0cmFkZSBlbm91Z2ggdG9cbiAqIHNhdGlzZnkgdGhlIHdhbnRzIG9mIGJvdGggc2VhdHMgYW5kIGV4aXQgYm90aCBzZWF0cy5cbiAqXG4gKiBUaGUgc3VycGx1cyByZW1haW5zIHdpdGggdGhlIG9yaWdpbmFsIHNlYXQuIEZvciBleGFtcGxlIGlmIHNlYXQgQVxuICogZ2l2ZXMgNSBtb29sYSBhbmQgc2VhdCBCIG9ubHkgd2FudHMgMyBtb29sYSwgc2VhdCBBIHJldGFpbnMgMlxuICogbW9vbGEuXG4gKlxuICogSWYgdGhlIHN3YXAgZmFpbHMsIG5vIGFzc2V0cyBhcmUgdHJhbnNmZXJyZWQsIGJvdGggc2VhdHMgd2lsbCBmYWlsLFxuICogYW5kIHRoZSBmdW5jdGlvbiB0aHJvd3MuXG4gKlxuICogVGhlIGtleXdvcmRzIGZvciBib3RoIHNlYXRzIG11c3QgbWF0Y2guXG4gKlxuICogQHBhcmFtIHtaQ0Z9IHpjZlxuICogQHBhcmFtIHtaQ0ZTZWF0fSBsZWZ0U2VhdFxuICogQHBhcmFtIHtaQ0ZTZWF0fSByaWdodFNlYXRcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgU3dhcEV4YWN0XG4gKlxuICogU3dhcCBzdWNoIHRoYXQgYm90aCBzZWF0cyBnYWluIHdoYXQgdGhleSB3YW50IGFuZCBsb3NlIGV2ZXJ5dGhpbmdcbiAqIHRoYXQgdGhleSBnYXZlLiBPbmx5IGdvb2QgZm9yIGV4YWN0IGFuZCBlbnRpcmUgc3dhcHMgd2hlcmUgZWFjaFxuICogc2VhdCB3YW50cyBldmVyeXRoaW5nIHRoYXQgdGhlIG90aGVyIHNlYXQgaGFzLiBUaGUgYmVuZWZpdCBvZiB1c2luZ1xuICogdGhpcyBtZXRob2QgaXMgdGhhdCB0aGUga2V5d29yZHMgb2YgZWFjaCBzZWF0IGRvIG5vdCBtYXR0ZXIuXG4gKlxuICogSWYgdGhlIHN3YXAgZmFpbHMsIG5vIGFzc2V0cyBhcmUgdHJhbnNmZXJyZWQsIGJvdGggc2VhdHMgd2lsbCBmYWlsLFxuICogYW5kIHRoZSBmdW5jdGlvbiB0aHJvd3MuXG4gKlxuICogQHBhcmFtIHtaQ0Z9IHpjZlxuICogQHBhcmFtIHtaQ0ZTZWF0fSBsZWZ0U2VhdFxuICogQHBhcmFtIHtaQ0ZTZWF0fSByaWdodFNlYXRcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7UmVjb3JkPEtleXdvcmQsS2V5d29yZD59IEtleXdvcmRLZXl3b3JkUmVjb3JkXG4gKlxuICogQSBtYXBwaW5nIG9mIGtleXdvcmRzIHRvIGtleXdvcmRzLlxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFJldmVyc2VcbiAqXG4gKiBHaXZlbiBhIG1hcHBpbmcgb2Yga2V5d29yZHMgdG8ga2V5d29yZHMsIGludmVydCB0aGUga2V5cyBhbmRcbiAqIHZhbHVlcy4gVGhpcyBpcyB1c2VkIHRvIG1hcCB0aGUgb2ZmZXJzIG1hZGUgdG8gYW5vdGhlciBjb250cmFjdFxuICogYmFjayB0byB0aGUga2V5d29yZHMgdXNlZCBpbiB0aGUgZmlyc3QgY29udHJhY3QuXG4gKiBAcGFyYW0ge0tleXdvcmRLZXl3b3JkUmVjb3JkPX0ga2V5d29yZFJlY29yZFxuICogQHJldHVybnMge0tleXdvcmRLZXl3b3JkUmVjb3JkIH1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBNYXBLZXl3b3Jkc1xuICpcbiAqIFJlbWFwIHRoZSBrZXl3b3JkcyBvZiBhbiBhbW91bnRLZXl3b3JkUmVjb3JkLCBpc3N1ZXJLZXl3b3JkUmVjb3JkLCBvciBhXG4gKiBQYXltZW50UEtleXdvcmRSZWNvcmQgYWNjb3JkaW5nIHRvIGEgbWFwcGluZy4gVGhpcyBpcyB1c2VkIHRvIHJlbWFwXG4gKiBmcm9tIGtleXdvcmRzIHVzZWQgaW4gY29udHJhY3RBIHRvIGtleXdvcmRzIHVzZWQgaW4gY29udHJhY3RCIGFuZFxuICogdmljZSB2ZXJzYSBpbiBgb2ZmZXJUb2BcbiAqXG4gKiBAcGFyYW0ge0Ftb3VudEtleXdvcmRSZWNvcmQgfCBQYXltZW50UEtleXdvcmRSZWNvcmQgfCBJc3N1ZXJLZXl3b3JkUmVjb3JkIHwgdW5kZWZpbmVkIH0ga2V5d29yZFJlY29yZFxuICogQHBhcmFtIHtLZXl3b3JkS2V5d29yZFJlY29yZH0ga2V5d29yZE1hcHBpbmdcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFJhdGlvXG4gKiBAcHJvcGVydHkge0Ftb3VudDwnbmF0Jz59IG51bWVyYXRvclxuICogQHByb3BlcnR5IHtBbW91bnQ8J25hdCc+fSBkZW5vbWluYXRvclxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFNjYWxlQW1vdW50XG4gKiBAcGFyYW0ge0Ftb3VudH0gYW1vdW50XG4gKiBAcGFyYW0ge1JhdGlvfSByYXRpb1xuICogQHJldHVybnMge0Ftb3VudDwnbmF0Jz59XG4gKi9cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAA3Jb5SQ7AAAkOwAANQAAAEBhZ29yaWMvem9lLXYwLjI1LjUvc3JjL2NvbnRyYWN0U3VwcG9ydC96b2VIZWxwZXJzLmpzeyJpbXBvcnRzIjpbIi4uLy4uL2V4cG9ydGVkLmpzIiwiLi4vY29udHJhY3RGYWNldC9vZmZlclNhZmV0eS5qcyIsIkBhZ29yaWMvZXJ0cCIsIkBhZ29yaWMvaW50ZXJuYWwiLCJAYWdvcmljL3N0b3JlIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL3Byb21pc2Uta2l0Il0sImV4cG9ydHMiOlsiYXNzZXJ0SXNzdWVyS2V5d29yZHMiLCJhc3NlcnROYXRBc3NldEtpbmQiLCJhc3NlcnRQcm9wb3NhbFNoYXBlIiwiY2hlY2taQ0YiLCJkZWZhdWx0QWNjZXB0YW5jZU1zZyIsImRlcG9zaXRUb1NlYXQiLCJkZXBvc2l0VG9TZWF0U3VjY2Vzc01zZyIsImZpdFByb3Bvc2FsU2hhcGUiLCJtYXBLZXl3b3JkcyIsIm9mZmVyVG8iLCJzYXRpc2ZpZXMiLCJzYXZlQWxsSXNzdWVycyIsInN3YXAiLCJzd2FwRXhhY3QiLCJ3aXRoZHJhd0Zyb21TZWF0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGZpdCxrZXlFUSxFLG1ha2VQcm9taXNlS2l0LEFzc2V0S2luZCxmcm9tVW5pcXVlRW50cmllcyxzYXRpc2ZpZXNXYW50OyRo4oCNX2ltcG9ydHMoW1tcIi4uLy4uL2V4cG9ydGVkLmpzXCIsIFtdXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJmaXRcIiwgWyRo4oCNX2EgPT4gKGZpdCA9ICRo4oCNX2EpXV0sW1wia2V5RVFcIiwgWyRo4oCNX2EgPT4gKGtleUVRID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcIm1ha2VQcm9taXNlS2l0XCIsIFskaOKAjV9hID0+IChtYWtlUHJvbWlzZUtpdCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL2VydHBcIiwgW1tcIkFzc2V0S2luZFwiLCBbJGjigI1fYSA9PiAoQXNzZXRLaW5kID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWxcIiwgW1tcImZyb21VbmlxdWVFbnRyaWVzXCIsIFskaOKAjV9hID0+IChmcm9tVW5pcXVlRW50cmllcyA9ICRo4oCNX2EpXV1dXSxbXCIuLi9jb250cmFjdEZhY2V0L29mZmVyU2FmZXR5LmpzXCIsIFtbXCJzYXRpc2ZpZXNXYW50XCIsIFskaOKAjV9hID0+IChzYXRpc2ZpZXNXYW50ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5jb25zdCAgICAgICAgZGVmYXVsdEFjY2VwdGFuY2VNc2c9IGBUaGUgb2ZmZXIgaGFzIGJlZW4gYWNjZXB0ZWQuIE9uY2UgdGhlIGNvbnRyYWN0IGhhcyBiZWVuIGNvbXBsZXRlZCwgcGxlYXNlIGNoZWNrIHlvdXIgcGF5b3V0YDskaOKAjV9vbmNlLmRlZmF1bHRBY2NlcHRhbmNlTXNnKGRlZmF1bHRBY2NlcHRhbmNlTXNnKTtcblxuY29uc3R7ZGV0YWlsczpYfT1hc3NlcnQ7XG5cbmNvbnN0IGdldEtleXNTb3J0ZWQ9KG9iaik9PmhhcmRlbihSZWZsZWN0Lm93bktleXMob2JqfHx7fSkuc29ydCgpKTtcblxuY29uc3QgICAgICAgIGFzc2VydElzc3VlcktleXdvcmRzPSh6Y2YsZXhwZWN0ZWQpPT57XG5jb25zdHtpc3N1ZXJzfT16Y2YuZ2V0VGVybXMoKTtcbmNvbnN0IGFjdHVhbD1nZXRLZXlzU29ydGVkKGlzc3VlcnMpO1xuZXhwZWN0ZWQ9Wy4uLmV4cGVjdGVkXTsvKiBpbiBjYXNlIGhhcmRlbmVkKi9cbmV4cGVjdGVkLnNvcnQoKTtcbmtleUVRKGFjdHVhbCxoYXJkZW4oZXhwZWN0ZWQpKXx8XG5hc3NlcnQuZmFpbChYIGBrZXl3b3JkczogJHthY3R1YWx9IHdlcmUgbm90IGFzIGV4cGVjdGVkOiAke2V4cGVjdGVkfWApO1xuIH07XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gWmNmU2VhdFBhcnRpYWxcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvcG9zYWxSZWNvcmR9IGdldFByb3Bvc2FsXG4gKiBAcHJvcGVydHkgeygpID0+IEFsbG9jYXRpb259IGdldEN1cnJlbnRBbGxvY2F0aW9uXG4gKi9cblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIGFuIHVwZGF0ZSB0byBjdXJyZW50QWxsb2NhdGlvbiBzYXRpc2ZpZXNcbiAqIHByb3Bvc2FsLndhbnQuIE5vdGUgdGhhdCB0aGlzIGlzIGhhbGYgb2YgdGhlIG9mZmVyIHNhZmV0eVxuICogY2hlY2s7IHdoZXRoZXIgdGhlIGFsbG9jYXRpb24gY29uc3RpdHV0ZXMgYSByZWZ1bmQgaXMgbm90XG4gKiBjaGVja2VkLiBUaGUgdXBkYXRlIGlzIG1lcmdlZCB3aXRoIGN1cnJlbnRBbGxvY2F0aW9uXG4gKiAodXBkYXRlJ3MgdmFsdWVzIHByZXZhaWxpbmcgaWYgdGhlIGtleXdvcmRzIGFyZSB0aGUgc2FtZSlcbiAqIHRvIHByb2R1Y2UgdGhlIG5ld0FsbG9jYXRpb24uIFRoZSByZXR1cm4gdmFsdWUgaXMgMCBmb3JcbiAqIGZhbHNlIGFuZCAxIGZvciB0cnVlLiBXaGVuIG11bHRpcGxlcyBhcmUgaW50cm9kdWNlZCwgYW55XG4gKiBwb3NpdGl2ZSByZXR1cm4gdmFsdWUgd2lsbCBtZWFuIHRydWUuXG4gKlxuICogQHBhcmFtIHtaQ0Z9IHpjZlxuICogQHBhcmFtIHtaY2ZTZWF0UGFydGlhbH0gc2VhdFxuICogQHBhcmFtIHtBbW91bnRLZXl3b3JkUmVjb3JkfSB1cGRhdGVcbiAqIEByZXR1cm5zIHswfDF9XG4gKi8kaOKAjV9vbmNlLmFzc2VydElzc3VlcktleXdvcmRzKGFzc2VydElzc3VlcktleXdvcmRzKTtcbmNvbnN0ICAgICAgICBzYXRpc2ZpZXM9KHpjZixzZWF0LHVwZGF0ZSk9PntcbmNvbnN0IGN1cnJlbnRBbGxvY2F0aW9uPXNlYXQuZ2V0Q3VycmVudEFsbG9jYXRpb24oKTtcbmNvbnN0IG5ld0FsbG9jYXRpb249ey4uLmN1cnJlbnRBbGxvY2F0aW9uLC4uLnVwZGF0ZX07XG5jb25zdCBwcm9wb3NhbD1zZWF0LmdldFByb3Bvc2FsKCk7XG5yZXR1cm4gc2F0aXNmaWVzV2FudChwcm9wb3NhbCxuZXdBbGxvY2F0aW9uKTtcbiB9O1xuXG4vKiogQHR5cGUge1N3YXB9ICovJGjigI1fb25jZS5zYXRpc2ZpZXMoc2F0aXNmaWVzKTtcbmNvbnN0ICAgICAgICBzd2FwPSh6Y2YsbGVmdFNlYXQscmlnaHRTZWF0KT0+e1xudHJ5e1xucmlnaHRTZWF0LmRlY3JlbWVudEJ5KGhhcmRlbihsZWZ0U2VhdC5nZXRQcm9wb3NhbCgpLndhbnQpKTtcbmxlZnRTZWF0LmluY3JlbWVudEJ5KGhhcmRlbihsZWZ0U2VhdC5nZXRQcm9wb3NhbCgpLndhbnQpKTtcblxubGVmdFNlYXQuZGVjcmVtZW50QnkoaGFyZGVuKHJpZ2h0U2VhdC5nZXRQcm9wb3NhbCgpLndhbnQpKTtcbnJpZ2h0U2VhdC5pbmNyZW1lbnRCeShoYXJkZW4ocmlnaHRTZWF0LmdldFByb3Bvc2FsKCkud2FudCkpO1xuXG56Y2YucmVhbGxvY2F0ZShsZWZ0U2VhdCxyaWdodFNlYXQpO1xuIH1jYXRjaChlcnIpe1xubGVmdFNlYXQuZmFpbChlcnIpO1xucmlnaHRTZWF0LmZhaWwoZXJyKTtcbnRocm93IGVycjtcbiB9XG5cbmxlZnRTZWF0LmV4aXQoKTtcbnJpZ2h0U2VhdC5leGl0KCk7XG5yZXR1cm4gZGVmYXVsdEFjY2VwdGFuY2VNc2c7XG4gfTtcblxuLyoqIEB0eXBlIHtTd2FwRXhhY3R9ICovJGjigI1fb25jZS5zd2FwKHN3YXApO1xuY29uc3QgICAgICAgIHN3YXBFeGFjdD0oemNmLGxlZnRTZWF0LHJpZ2h0U2VhdCk9PntcbnRyeXtcbnJpZ2h0U2VhdC5kZWNyZW1lbnRCeShoYXJkZW4ocmlnaHRTZWF0LmdldFByb3Bvc2FsKCkuZ2l2ZSkpO1xubGVmdFNlYXQuaW5jcmVtZW50QnkoaGFyZGVuKGxlZnRTZWF0LmdldFByb3Bvc2FsKCkud2FudCkpO1xuXG5sZWZ0U2VhdC5kZWNyZW1lbnRCeShoYXJkZW4obGVmdFNlYXQuZ2V0UHJvcG9zYWwoKS5naXZlKSk7XG5yaWdodFNlYXQuaW5jcmVtZW50QnkoaGFyZGVuKHJpZ2h0U2VhdC5nZXRQcm9wb3NhbCgpLndhbnQpKTtcblxuemNmLnJlYWxsb2NhdGUobGVmdFNlYXQscmlnaHRTZWF0KTtcbiB9Y2F0Y2goZXJyKXtcbmxlZnRTZWF0LmZhaWwoZXJyKTtcbnJpZ2h0U2VhdC5mYWlsKGVycik7XG50aHJvdyBlcnI7XG4gfVxuXG5sZWZ0U2VhdC5leGl0KCk7XG5yaWdodFNlYXQuZXhpdCgpO1xucmV0dXJuIGRlZmF1bHRBY2NlcHRhbmNlTXNnO1xuIH07XG5cbi8qKlxuICogQHR5cGVkZWYgRXhwZWN0ZWRSZWNvcmRcbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPEtleXdvcmQsIG51bGw+fSBbd2FudF1cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPEtleXdvcmQsIG51bGw+fSBbZ2l2ZV1cbiAqIEBwcm9wZXJ0eSB7UGFydGlhbDxSZWNvcmQ8a2V5b2YgUHJvcG9zYWxSZWNvcmRbJ2V4aXQnXSwgbnVsbD4+fSBbZXhpdF1cbiAqL1xuXG4vKipcbiAqIENoZWNrIHRoZSBzZWF0J3MgcHJvcG9zYWwgYWdhaW5zdCBgcHJvcG9zYWxTaGFwZWAuXG4gKiBJZiB0aGUgY2xpZW50IHN1Ym1pdHMgYW4gb2ZmZXIgd2hpY2ggZG9lcyBub3QgbWF0Y2hcbiAqIHRoZXNlIGV4cGVjdGF0aW9ucywgdGhlIHNlYXQgd2lsbCBiZSBleGl0ZWQgKGFuZCBwYXltZW50cyByZWZ1bmRlZCkuXG4gKlxuICogQHBhcmFtIHtaQ0ZTZWF0fSBzZWF0XG4gKiBAcGFyYW0ge1BhdHRlcm59IHByb3Bvc2FsU2hhcGVcbiAqLyRo4oCNX29uY2Uuc3dhcEV4YWN0KHN3YXBFeGFjdCk7XG5jb25zdCAgICAgICAgZml0UHJvcG9zYWxTaGFwZT0oc2VhdCxwcm9wb3NhbFNoYXBlKT0+XG4vKiBUT0RPIHJlbW92ZSB0aGlzIGhhcmRlbiwgb2JsaWdhdGluZyBvdXIgY2FsbGVyIHRvIGhhcmRlbi4qL1xuZml0KHNlYXQuZ2V0UHJvcG9zYWwoKSxoYXJkZW4ocHJvcG9zYWxTaGFwZSksJ3Byb3Bvc2FsJyk7XG5cbi8qKlxuICogQ2hlY2sgdGhlIHNlYXQncyBwcm9wb3NhbCBhZ2FpbnN0IGFuIGBleHBlY3RlZGAgcmVjb3JkIHRoYXQgc2F5c1xuICogd2hhdCBcInNoYXBlXCIgb2YgcHJvcG9zYWwgaXMgYWNjZXB0YWJsZS5cbiAqXG4gKiBOb3RlIHRoYXQgYnkgb3VyIGN1cnJlbnQgdGVybWlub2xvZ3ksIHRoaXMgZnVuY3Rpb24gaXMgbWlzbmFtZWQgYmVjYXVzZVxuICogd2UgdXNlXG4gKiBbXCJTaGFwZVwiIHRvIHJlZmVyIHRvIHBhdHRlcm5zXShodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvYmxvYi9tYXN0ZXIvcGFja2FnZXMvc3RvcmUvc3JjL3R5cGVzLmpzI0w1Ni1MNzQpLFxuICogYW5kIHRoZSBgZXhwZWN0ZWRgIGFyZ3VtZW50IGlzIG5vdCBzdWNoIGEgcGF0dGVybi4gUmF0aGVyIGl0IGlzIGFuIGFkLWhvY1xuICogcGF0dGVybi1saWtlIHNwZWNpYWwgY2FzZSByZWNvcmQgdGhhdCBpcyBkaWZmZXJlbnQgYW5kIG11Y2ggbGVzcyBleHByZXNzaXZlLlxuICpcbiAqIFRoaXMgRXhwZWN0ZWRSZWNvcmQgaXMgbGlrZSBhIFByb3Bvc2FsLCBidXQgdGhlIGFtb3VudHMgaW4gJ3dhbnQnXG4gKiBhbmQgJ2dpdmUnIHNob3VsZCBiZSBudWxsOyB0aGUgZXhpdCBjbGF1c2Ugc2hvdWxkIHNwZWNpZnkgYSBydWxlIHdpdGhcbiAqIG51bGwgY29udGVudHMuIElmIHRoZSBjbGllbnQgc3VibWl0cyBhbiBvZmZlciB3aGljaCBkb2VzIG5vdCBtYXRjaFxuICogdGhlc2UgZXhwZWN0YXRpb25zLCB0aGUgc2VhdCB3aWxsIGJlIGV4aXRlZCAoYW5kIHBheW1lbnRzIHJlZnVuZGVkKS5cbiAqXG4gKiBAZGVwcmVjYXRlZCBVc2Ugb3B0aW9uYWwgYHByb3Bvc2FsU2hhcGVgIGFyZ3VtZW50IHRvIGBtYWtlSW52aXRhdGlvbmAgd2l0aFxuICogYSBnZW51aW5lIHBhdHRlcm4uXG4gKiBAcGFyYW0ge1pDRlNlYXR9IHNlYXRcbiAqIEBwYXJhbSB7RXhwZWN0ZWRSZWNvcmR9IGV4cGVjdGVkXG4gKi8kaOKAjV9vbmNlLmZpdFByb3Bvc2FsU2hhcGUoZml0UHJvcG9zYWxTaGFwZSk7XG5jb25zdCAgICAgICAgYXNzZXJ0UHJvcG9zYWxTaGFwZT0oc2VhdCxleHBlY3RlZCk9PntcbmFzc2VydC50eXBlb2YoZXhwZWN0ZWQsJ29iamVjdCcpO1xuYXNzZXJ0KCFBcnJheS5pc0FycmF5KGV4cGVjdGVkKSwnRXhwZWN0ZWQgbXVzdCBiZSBhbiBub24tYXJyYXkgb2JqZWN0Jyk7XG5jb25zdCBhc3NlcnRWYWx1ZXNOdWxsPShlKT0+e1xuaWYoZSE9PXVuZGVmaW5lZCl7XG5PYmplY3QudmFsdWVzKGUpLmZvckVhY2goKHZhbHVlKT0+XG5hc3NlcnQoXG52YWx1ZT09PW51bGwsXG5YIGBUaGUgdmFsdWUgb2YgdGhlIGV4cGVjdGVkIHJlY29yZCBtdXN0IGJlIG51bGwgYnV0IHdhcyAke3ZhbHVlfWApKTtcblxuXG4gfVxuIH07XG5cbi8qIEFzc2VydCB2YWx1ZXMgb2YgdGhlIGV4cGVjdGVkIHJlY29yZCBhcmUgYWxsIG51bGwuIFdlIGRvIG5vdCovXG4vKiBjaGVjayB0aGUgdmFsdWVzIG9mIHRoZSBhY3R1YWwgcHJvcG9zYWwuKi9cbmFzc2VydFZhbHVlc051bGwoZXhwZWN0ZWQuZ2l2ZSk7XG5hc3NlcnRWYWx1ZXNOdWxsKGV4cGVjdGVkLndhbnQpO1xuYXNzZXJ0VmFsdWVzTnVsbChleHBlY3RlZC5leGl0KTtcblxuY29uc3QgYWN0dWFsPXNlYXQuZ2V0UHJvcG9zYWwoKTtcbmNvbnN0IGFzc2VydEtleXM9KGEsZSk9PntcbmlmKGUhPT11bmRlZmluZWQpe1xua2V5RVEoZ2V0S2V5c1NvcnRlZChhKSxnZXRLZXlzU29ydGVkKGUpKXx8XG5hc3NlcnQuZmFpbChYIGBhY3R1YWwgJHthfSBkaWQgbm90IG1hdGNoIGV4cGVjdGVkICR7ZX1gKTtcbiB9XG4gfTtcbmFzc2VydEtleXMoYWN0dWFsLmdpdmUsZXhwZWN0ZWQuZ2l2ZSk7XG5hc3NlcnRLZXlzKGFjdHVhbC53YW50LGV4cGVjdGVkLndhbnQpO1xuYXNzZXJ0S2V5cyhhY3R1YWwuZXhpdCxleHBlY3RlZC5leGl0KTtcbiB9O1xuXG4vKiBHaXZlbiBhIGJyYW5kLCBhc3NlcnQgdGhhdCBicmFuZCBpcyBBc3NldEtpbmQuTkFULiAqLyRo4oCNX29uY2UuYXNzZXJ0UHJvcG9zYWxTaGFwZShhc3NlcnRQcm9wb3NhbFNoYXBlKTtcbmNvbnN0ICAgICAgICBhc3NlcnROYXRBc3NldEtpbmQ9KHpjZixicmFuZCk9PntcbmFzc2VydChcbnpjZi5nZXRBc3NldEtpbmQoYnJhbmQpPT09QXNzZXRLaW5kLk5BVCxcbidicmFuZCBtdXN0IGJlIEFzc2V0S2luZC5OQVQnKTtcblxuIH07JGjigI1fb25jZS5hc3NlcnROYXRBc3NldEtpbmQoYXNzZXJ0TmF0QXNzZXRLaW5kKTtcblxuY29uc3QgICAgICAgIGRlcG9zaXRUb1NlYXRTdWNjZXNzTXNnPSBgRGVwb3NpdCBhbmQgcmVhbGxvY2F0aW9uIHN1Y2Nlc3NmdWwuYDtcblxuLyoqXG4gKiBEZXBvc2l0IHBheW1lbnRzIHN1Y2ggdGhhdCB0aGVpciBhbW91bnRzIGFyZSByZWFsbG9jYXRlZCB0byBhIHNlYXQuXG4gKiBUaGUgYGFtb3VudHNgIGFuZCBgcGF5bWVudHNgIHJlY29yZHMgbXVzdCBoYXZlIGNvcnJlc3BvbmRpbmdcbiAqIGtleXdvcmRzLlxuICpcbiAqIEBwYXJhbSB7WkNGfSB6Y2ZcbiAqIEBwYXJhbSB7WkNGU2VhdH0gcmVjaXBpZW50U2VhdFxuICogQHBhcmFtIHtBbW91bnRLZXl3b3JkUmVjb3JkfSBhbW91bnRzXG4gKiBAcGFyYW0ge1BheW1lbnRQS2V5d29yZFJlY29yZH0gcGF5bWVudHNcbiAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IGBEZXBvc2l0IGFuZCByZWFsbG9jYXRpb24gc3VjY2Vzc2Z1bC5gXG4gKi8kaOKAjV9vbmNlLmRlcG9zaXRUb1NlYXRTdWNjZXNzTXNnKGRlcG9zaXRUb1NlYXRTdWNjZXNzTXNnKTtcbmNvbnN0ICAgICAgICBkZXBvc2l0VG9TZWF0PWFzeW5jKHpjZixyZWNpcGllbnRTZWF0LGFtb3VudHMscGF5bWVudHMpPT57XG5hc3NlcnQoIXJlY2lwaWVudFNlYXQuaGFzRXhpdGVkKCksJ1RoZSByZWNpcGllbnRTZWF0IGNhbm5vdCBoYXZlIGV4aXRlZC4nKTtcblxuLyogV2Ugd2lsbCBjcmVhdGUgYSB0ZW1wb3Jhcnkgb2ZmZXIgdG8gYmUgYWJsZSB0byBlc2Nyb3cgb3VyIHBheW1lbnRzKi9cbi8qIHdpdGggWm9lLiovXG5jb25zdCByZWFsbG9jYXRlQWZ0ZXJEZXBvc2l0PSh0ZW1wU2VhdCk9Pntcbi8qIEFmdGVyIHRoZSBhc3NldHMgYXJlIGRlcG9zaXRlZCwgcmVhbGxvY2F0ZSB0aGVtIG9udG8gdGhlIHJlY2lwaWVudCBzZWF0IGFuZCovXG4vKiBleGl0IHRoZSB0ZW1wb3Jhcnkgc2VhdC4gTm90ZSB0aGF0IHRoZSBvZmZlclJlc3VsdCBpcyB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoaXMqL1xuLyogZnVuY3Rpb24sIHNvIHRoaXMgc3luY2hyb25vdXMgdHJhZGUgbXVzdCBoYXBwZW4gYmVmb3JlIHRoZSovXG4vKiBvZmZlclJlc3VsdCByZXNvbHZlcy4qL1xudGVtcFNlYXQuZGVjcmVtZW50QnkoaGFyZGVuKGFtb3VudHMpKTtcbnJlY2lwaWVudFNlYXQuaW5jcmVtZW50QnkoaGFyZGVuKGFtb3VudHMpKTtcbnpjZi5yZWFsbG9jYXRlKHRlbXBTZWF0LHJlY2lwaWVudFNlYXQpO1xudGVtcFNlYXQuZXhpdCgpO1xucmV0dXJuIGRlcG9zaXRUb1NlYXRTdWNjZXNzTXNnO1xuIH07XG5jb25zdCBpbnZpdGF0aW9uPXpjZi5tYWtlSW52aXRhdGlvbihcbnJlYWxsb2NhdGVBZnRlckRlcG9zaXQsXG4ndGVtcG9yYXJ5IHNlYXQgZm9yIGRlcG9zaXQnKTtcblxuY29uc3QgcHJvcG9zYWw9aGFyZGVuKHtnaXZlOmFtb3VudHN9KTtcbmhhcmRlbihwYXltZW50cyk7XG4vKiBUbyBlc2Nyb3cgdGhlIHBheW1lbnQsIHdlIG11c3QgZ2V0IHRoZSBab2UgU2VydmljZSBmYWNldCBhbmQqL1xuLyogbWFrZSBhbiBvZmZlciovXG5jb25zdCB6b2U9emNmLmdldFpvZVNlcnZpY2UoKTtcbmNvbnN0IHRlbXBVc2VyU2VhdD1FKHpvZSkub2ZmZXIoaW52aXRhdGlvbixwcm9wb3NhbCxwYXltZW50cyk7XG4vKiBUaGlzIHdpbGwgYmUgYSBwcm9taXNlIGZvciB0aGUgc3RyaW5nOiBgRGVwb3NpdCBhbmQgcmVhbGxvY2F0aW9uKi9cbi8qIHN1Y2Nlc3NmdWwuYCBJdCB3aWxsIG9ubHkgZnVsZmlsbCBhZnRlciB0aGUgYXNzZXRzIGhhdmUgYmVlbiovXG4vKiBzdWNjZXNzZnVsbHkgcmVhbGxvY2F0ZWQgdG8gdGhlIHJlY2lwaWVudCBzZWF0LiovXG5yZXR1cm4gRSh0ZW1wVXNlclNlYXQpLmdldE9mZmVyUmVzdWx0KCk7XG4gfTtcblxuLyoqXG4gKiBXaXRoZHJhdyBwYXltZW50cyBmcm9tIGEgc2VhdC4gTm90ZSB0aGF0IHdpdGhkcmF3aW5nIHRoZSBhbW91bnRzIG9mXG4gKiB0aGUgcGF5bWVudHMgbXVzdCBub3QgYW5kIGNhbm5vdCB2aW9sYXRlIG9mZmVyIHNhZmV0eSBmb3IgdGhlIHNlYXQuIFRoZVxuICogYGFtb3VudHNgIGFuZCBgcGF5bWVudHNgIHJlY29yZHMgbXVzdCBoYXZlIGNvcnJlc3BvbmRpbmcga2V5d29yZHMuXG4gKlxuICogQHBhcmFtIHtaQ0Z9IHpjZlxuICogQHBhcmFtIHtaQ0ZTZWF0fSBzZWF0XG4gKiBAcGFyYW0ge0Ftb3VudEtleXdvcmRSZWNvcmR9IGFtb3VudHNcbiAqIEByZXR1cm5zIHtQcm9taXNlPFBheW1lbnRQS2V5d29yZFJlY29yZD59XG4gKi8kaOKAjV9vbmNlLmRlcG9zaXRUb1NlYXQoZGVwb3NpdFRvU2VhdCk7XG5jb25zdCAgICAgICAgd2l0aGRyYXdGcm9tU2VhdD1hc3luYyh6Y2Ysc2VhdCxhbW91bnRzKT0+e1xuYXNzZXJ0KCFzZWF0Lmhhc0V4aXRlZCgpLCdUaGUgc2VhdCBjYW5ub3QgaGF2ZSBleGl0ZWQuJyk7XG5jb25zdHt6Y2ZTZWF0OnRlbXBTZWF0LHVzZXJTZWF0OnRlbXBVc2VyU2VhdFB9PXpjZi5tYWtlRW1wdHlTZWF0S2l0KCk7XG5zZWF0LmRlY3JlbWVudEJ5KGhhcmRlbihhbW91bnRzKSk7XG50ZW1wU2VhdC5pbmNyZW1lbnRCeShoYXJkZW4oYW1vdW50cykpO1xuemNmLnJlYWxsb2NhdGUodGVtcFNlYXQsc2VhdCk7XG50ZW1wU2VhdC5leGl0KCk7XG5yZXR1cm4gRSh0ZW1wVXNlclNlYXRQKS5nZXRQYXlvdXRzKCk7XG4gfTtcblxuLyoqXG4gKiBTYXZlIGFsbCBvZiB0aGUgaXNzdWVycyBpbiBhbiBpc3N1ZXJzS2V5d29yZFJlY29yZCB0byBaQ0YsIHVzaW5nXG4gKiB0aGUgbWV0aG9kIGB6Y2Yuc2F2ZUlzc3VlcmAuIFRoaXMgZG9lcyBub3QgZXJyb3IgaWYgYW55IG9mIHRoZSBrZXl3b3Jkc1xuICogYWxyZWFkeSBleGlzdC4gSWYgdGhlIGtleXdvcmQgaXMgYWxyZWFkeSBwcmVzZW50LCBpdCBpcyBpZ25vcmVkLlxuICpcbiAqIEBwYXJhbSB7WkNGfSB6Y2ZcbiAqIEBwYXJhbSB7SXNzdWVyS2V5d29yZFJlY29yZH0gaXNzdWVyS2V5d29yZFJlY29yZCBJc3N1ZXJzIHRvIHNhdmUgdG9cbiAqIFpDRlxuICovJGjigI1fb25jZS53aXRoZHJhd0Zyb21TZWF0KHdpdGhkcmF3RnJvbVNlYXQpO1xuY29uc3QgICAgICAgIHNhdmVBbGxJc3N1ZXJzPWFzeW5jKHpjZixpc3N1ZXJLZXl3b3JkUmVjb3JkPWhhcmRlbih7fSkpPT57XG5jb25zdHtpc3N1ZXJzfT16Y2YuZ2V0VGVybXMoKTtcbmNvbnN0IGlzc3VlcnNQU2F2ZWQ9T2JqZWN0LmVudHJpZXMoaXNzdWVyS2V5d29yZFJlY29yZCkubWFwKFxuKFtrZXl3b3JkLGlzc3Vlcl0pPT57XG4vKiBJZiB0aGUga2V5d29yZCBkb2VzIG5vdCB5ZXQgZXhpc3QsIGFkZCBpdCBhbmQgdGhlKi9cbi8qIGFzc29jaWF0ZWQgaXNzdWVyLiovXG5pZihpc3N1ZXJzW2tleXdvcmRdPT09dW5kZWZpbmVkKXtcbnJldHVybiB6Y2Yuc2F2ZUlzc3Vlcihpc3N1ZXIsa2V5d29yZCk7XG4gfVxucmV0dXJuIHVuZGVmaW5lZDtcbiB9KTtcblxucmV0dXJuIFByb21pc2UuYWxsKGlzc3VlcnNQU2F2ZWQpO1xuIH07XG5cbi8qKiBAdHlwZSB7TWFwS2V5d29yZHN9ICovJGjigI1fb25jZS5zYXZlQWxsSXNzdWVycyhzYXZlQWxsSXNzdWVycyk7XG5jb25zdCAgICAgICAgbWFwS2V5d29yZHM9KGtleXdvcmRSZWNvcmQ9e30sa2V5d29yZE1hcHBpbmcpPT57XG5yZXR1cm4gaGFyZGVuKFxuZnJvbVVuaXF1ZUVudHJpZXMoXG5PYmplY3QuZW50cmllcyhrZXl3b3JkUmVjb3JkKS5tYXAoKFtrZXl3b3JkLHZhbHVlXSk9PntcbmlmKGtleXdvcmRNYXBwaW5nW2tleXdvcmRdPT09dW5kZWZpbmVkKXtcbnJldHVybltrZXl3b3JkLHZhbHVlXTtcbiB9XG5yZXR1cm5ba2V5d29yZE1hcHBpbmdba2V5d29yZF0sdmFsdWVdO1xuIH0pKSk7XG5cblxuIH07XG4vKiogQHR5cGUge1JldmVyc2V9ICovJGjigI1fb25jZS5tYXBLZXl3b3JkcyhtYXBLZXl3b3Jkcyk7XG5jb25zdCByZXZlcnNlPShrZXl3b3JkUmVjb3JkPXt9KT0+e1xucmV0dXJuIGhhcmRlbihcbmZyb21VbmlxdWVFbnRyaWVzKFxuT2JqZWN0LmVudHJpZXMoa2V5d29yZFJlY29yZCkubWFwKChba2V5LHZhbHVlXSk9Plt2YWx1ZSxrZXldKSkpO1xuXG5cbiB9O1xuXG4vKipcbiAqIE1ha2UgYW4gb2ZmZXIgdG8gYW5vdGhlciBjb250cmFjdCBpbnN0YW5jZSAobGFiZWxlZCBjb250cmFjdEIgYmVsb3cpLFxuICogd2l0aGRyYXdpbmcgdGhlIHBheW1lbnRzIGZvciB0aGUgb2ZmZXIgZnJvbSBhIHNlYXQgaW4gdGhlIGN1cnJlbnRcbiAqIGNvbnRyYWN0IGluc3RhbmNlIChjb250cmFjdEEpIGFuZCBkZXBvc2l0aW5nIHRoZSBwYXlvdXRzIGluIGFub3RoZXJcbiAqIHNlYXQgaW4gdGhlIGN1cnJlbnQgY29udHJhY3QgaW5zdGFuY2UgKGNvbnRyYWN0QSkuXG4gKlxuICogQHBhcmFtIHtaQ0Z9IHpjZlxuICogICBab2UgQ29udHJhY3QgRmFjZXQgZm9yIGNvbnRyYWN0QVxuICpcbiAqIEBwYXJhbSB7RVJlZjxJbnZpdGF0aW9uPFJlc3VsdCwgQXJncz4+fSBpbnZpdGF0aW9uXG4gKiAgIEludml0YXRpb24gdG8gY29udHJhY3RCXG4gKlxuICogQHBhcmFtIHtLZXl3b3JkS2V5d29yZFJlY29yZCB8IHVuZGVmaW5lZH0ga2V5d29yZE1hcHBpbmdcbiAqICAgTWFwcGluZyBvZiBrZXl3b3JkcyB1c2VkIGluIGNvbnRyYWN0QSB0byBrZXl3b3JkcyB0byBiZSB1c2VkIGluXG4gKiAgIGNvbnRyYWN0Qi4gTm90ZSB0aGF0IHRoZSBwYXRod2F5IHRvIGRlcG9zaXQgdGhlIHBheW91dCBiYWNrIHRvXG4gKiAgIGNvbnRyYWN0QSByZXZlcnNlcyB0aGlzIG1hcHBpbmcuXG4gKlxuICogQHBhcmFtIHtQcm9wb3NhbH0gcHJvcG9zYWxcbiAqICAgVGhlIHByb3Bvc2FsIGZvciB0aGUgb2ZmZXIgdG8gYmUgbWFkZSB0byBjb250cmFjdEJcbiAqXG4gKiBAcGFyYW0ge1pDRlNlYXR9IGZyb21TZWF0XG4gKiAgIFRoZSBzZWF0IGluIGNvbnRyYWN0QSB0byB0YWtlIHRoZSBvZmZlciBwYXltZW50cyBmcm9tLlxuICpcbiAqIEBwYXJhbSB7WkNGU2VhdD19IFt0b1NlYXQ9ZnJvbVNlYXRdXG4gKiAgIFRoZSBzZWF0IGluIGNvbnRyYWN0QSB0byBkZXBvc2l0IHRoZSBwYXlvdXQgb2YgdGhlIG9mZmVyIHRvLlxuICogICBJZiBgdG9TZWF0YCBpcyBub3QgcHJvdmlkZWQsIHRoaXMgZGVmYXVsdHMgdG8gdGhlIGBmcm9tU2VhdGAuXG4gKlxuICogQHBhcmFtIHtBcmdzfSBbb2ZmZXJBcmdzXVxuICogICBBZGRpdGlvbmFsIGNvbnRyYWN0LXNwZWNpZmljIG9wdGlvbmFsIGFyZ3VtZW50cyBpbiBhIHJlY29yZC5cbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx7dXNlclNlYXRQcm9taXNlOiBQcm9taXNlPFVzZXJTZWF0PFJlc3VsdD4+LCBkZXBvc2l0ZWQ6IFByb21pc2U8QW1vdW50S2V5d29yZFJlY29yZD59Pn1cbiAqICAgQSBwcm9taXNlIGZvciB0aGUgdXNlclNlYXQgZm9yIHRoZSBvZmZlciB0byB0aGUgb3RoZXIgY29udHJhY3QsIGFuZCBhXG4gKiAgIHByb21pc2UgKGBkZXBvc2l0ZWRgKSB3aGljaCByZXNvbHZlcyB3aGVuIHRoZSBwYXlvdXQgZm9yIHRoZSBvZmZlciBoYXMgYmVlblxuICogICBkZXBvc2l0ZWQgdG8gdGhlIGB0b1NlYXRgLlxuICogICBBbnkgZmFpbHVyZXMgb2YgdGhlIGludml0YXRpb24gd2lsbCBiZSByZXR1cm5lZCBieSBgdXNlclNlYXRQcm9taXNlLmdldE9mZmVyUmVzdWx0KClgLlxuICpcbiAqIEB0ZW1wbGF0ZSB7b2JqZWN0PX0gQXJncyBPZmZlciBhcmdzXG4gKiBAdGVtcGxhdGUge29iamVjdD19IFJlc3VsdCBPZmZlciByZXN1bHRcbiAqL1xuY29uc3QgICAgICAgIG9mZmVyVG89YXN5bmMoXG56Y2YsXG5pbnZpdGF0aW9uLFxua2V5d29yZE1hcHBpbmcsXG5wcm9wb3NhbCxcbmZyb21TZWF0LFxudG9TZWF0LFxub2ZmZXJBcmdzKT0+XG57XG5pZihrZXl3b3JkTWFwcGluZz09PXVuZGVmaW5lZCl7XG5rZXl3b3JkTWFwcGluZz1oYXJkZW4oe30pO1xuIH1cblxuY29uc3QgZGVmaW5lZFRvU2VhdD10b1NlYXQhPT11bmRlZmluZWQ/dG9TZWF0OmZyb21TZWF0O1xuXG5jb25zdCB6b2U9emNmLmdldFpvZVNlcnZpY2UoKTtcbmNvbnN0IG1hcHBpbmdSZXZlcnNlZD1yZXZlcnNlKGtleXdvcmRNYXBwaW5nKTtcblxuY29uc3QgbmV3S2V5d29yZHM9XG5wcm9wb3NhbCE9PXVuZGVmaW5lZD9cbm1hcEtleXdvcmRzKHByb3Bvc2FsLmdpdmUsbWFwcGluZ1JldmVyc2VkKTpcbmhhcmRlbih7fSk7XG5cbi8qIHRoZSBwcm9wb3NhbCBpcyBpbiB0aGUgb3RoZXIgY29udHJhY3QncyBrZXl3b3JkcywgYnV0IHdlIHdhbnQgdG8qL1xuLyogdXNlIGBwcm9wb3NhbC5naXZlYCB0byB3aXRoZHJhdyovXG5jb25zdCBwYXltZW50cz1hd2FpdCB3aXRoZHJhd0Zyb21TZWF0KHpjZixmcm9tU2VhdCxuZXdLZXl3b3Jkcyk7XG5cbi8qIE1hcCB0byB0aGUgb3RoZXIgY29udHJhY3QncyBrZXl3b3JkcyovXG5jb25zdCBwYXltZW50c0Zvck90aGVyQ29udHJhY3Q9bWFwS2V5d29yZHMocGF5bWVudHMsa2V5d29yZE1hcHBpbmcpO1xuXG5jb25zdCB1c2VyU2VhdFByb21pc2U9RSh6b2UpLm9mZmVyKFxuaW52aXRhdGlvbixcbnByb3Bvc2FsLFxucGF5bWVudHNGb3JPdGhlckNvbnRyYWN0LFxub2ZmZXJBcmdzKTtcblxuXG5jb25zdCBkZXBvc2l0ZWRQcm9taXNlS2l0PW1ha2VQcm9taXNlS2l0KCk7XG5cbmNvbnN0IGRvRGVwb3NpdD1hc3luYyhwYXlvdXRQYXltZW50cyk9Pntcbi8qIGFmdGVyIGdldFBheW91dHMoKSwgZ2V0RmluYWxBbGxvY2F0aW9uKCkgcmVzb2x2ZXMgcHJvbXB0bHkuKi9cbmNvbnN0IGFtb3VudHM9YXdhaXQgRSh1c2VyU2VhdFByb21pc2UpLmdldEZpbmFsQWxsb2NhdGlvbigpO1xuXG4vKiBNYXAgYmFjayB0byB0aGUgb3JpZ2luYWwgY29udHJhY3QncyBrZXl3b3JkcyovXG5jb25zdCBtYXBwZWRBbW91bnRzPW1hcEtleXdvcmRzKGFtb3VudHMsbWFwcGluZ1JldmVyc2VkKTtcbmNvbnN0IG1hcHBlZFBheW1lbnRzPW1hcEtleXdvcmRzKHBheW91dFBheW1lbnRzLG1hcHBpbmdSZXZlcnNlZCk7XG5hd2FpdCBkZXBvc2l0VG9TZWF0KHpjZixkZWZpbmVkVG9TZWF0LG1hcHBlZEFtb3VudHMsbWFwcGVkUGF5bWVudHMpO1xuZGVwb3NpdGVkUHJvbWlzZUtpdC5yZXNvbHZlKG1hcHBlZEFtb3VudHMpO1xuIH07XG5cbkUodXNlclNlYXRQcm9taXNlKS5nZXRQYXlvdXRzKCkudGhlbihkb0RlcG9zaXQpO1xuXG4vKiBUT0RPIHJlbmFtZSByZXR1cm4ga2V5OyB1c2VyU2VhdFByb21pc2UgaXMgYSByZW1vdGUgVXNlclNlYXQqL1xucmV0dXJuIGhhcmRlbih7dXNlclNlYXRQcm9taXNlLGRlcG9zaXRlZDpkZXBvc2l0ZWRQcm9taXNlS2l0LnByb21pc2V9KTtcbiB9O1xuXG4vKipcbiAqIENyZWF0ZSBhIHdyYXBwZWQgdmVyc2lvbiBvZiB6Y2YgdGhhdCBhc3NlcnRzIGFuIGludmFyaWFudFxuICogYmVmb3JlIHBlcmZvcm1pbmcgYSByZWFsbG9jYXRpb24uXG4gKlxuICogQHBhcmFtIHtaQ0Z9IHpjZlxuICogQHBhcmFtIHsoc2VhdHM6IFpDRlNlYXRbXSkgPT4gdm9pZH0gYXNzZXJ0Rm4gLSBhbiBhc3NlcnRpb25cbiAqIHRoYXQgbXVzdCBiZSB0cnVlIGZvciB0aGUgcmVhbGxvY2F0ZSB0byBvY2N1clxuICogQHJldHVybnMge1pDRn1cbiAqLyRo4oCNX29uY2Uub2ZmZXJUbyhvZmZlclRvKTtcbmNvbnN0ICAgICAgICBjaGVja1pDRj0oemNmLGFzc2VydEZuKT0+e1xuY29uc3QgY2hlY2tlZFpDRj1oYXJkZW4oe1xuLi4uemNmLFxucmVhbGxvY2F0ZTooLi4uc2VhdHMpPT57XG5hc3NlcnRGbihzZWF0cyk7XG4vKiBAdHMtZXhwZWN0LWVycm9yIFRoZSB0eXBlcyBhcmVuJ3QgcmlnaHQgZm9yIHNwcmVhZGluZyovXG56Y2YucmVhbGxvY2F0ZSguLi5zZWF0cyk7XG4gfX0pO1xuXG5yZXR1cm4gY2hlY2tlZFpDRjtcbiB9OyRo4oCNX29uY2UuY2hlY2taQ0YoY2hlY2taQ0YpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZmF1bHRBY2NlcHRhbmNlTXNnIjpbImRlZmF1bHRBY2NlcHRhbmNlTXNnIl0sImFzc2VydElzc3VlcktleXdvcmRzIjpbImFzc2VydElzc3VlcktleXdvcmRzIl0sInNhdGlzZmllcyI6WyJzYXRpc2ZpZXMiXSwic3dhcCI6WyJzd2FwIl0sInN3YXBFeGFjdCI6WyJzd2FwRXhhY3QiXSwiZml0UHJvcG9zYWxTaGFwZSI6WyJmaXRQcm9wb3NhbFNoYXBlIl0sImFzc2VydFByb3Bvc2FsU2hhcGUiOlsiYXNzZXJ0UHJvcG9zYWxTaGFwZSJdLCJhc3NlcnROYXRBc3NldEtpbmQiOlsiYXNzZXJ0TmF0QXNzZXRLaW5kIl0sImRlcG9zaXRUb1NlYXRTdWNjZXNzTXNnIjpbImRlcG9zaXRUb1NlYXRTdWNjZXNzTXNnIl0sImRlcG9zaXRUb1NlYXQiOlsiZGVwb3NpdFRvU2VhdCJdLCJ3aXRoZHJhd0Zyb21TZWF0IjpbIndpdGhkcmF3RnJvbVNlYXQiXSwic2F2ZUFsbElzc3VlcnMiOlsic2F2ZUFsbElzc3VlcnMiXSwibWFwS2V5d29yZHMiOlsibWFwS2V5d29yZHMiXSwib2ZmZXJUbyI6WyJvZmZlclRvIl0sImNoZWNrWkNGIjpbImNoZWNrWkNGIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAOYk1x8qBwAAKgcAADUAAABAYWdvcmljL3pvZS12MC4yNS41L3NyYy9jb250cmFjdHMvY2FsbFNwcmVhZC90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qKlxuICogQHR5cGVkZWYgeydsb25nJyB8ICdzaG9ydCd9IFBvc2l0aW9uS2luZFxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIE1ha2VPcHRpb25JbnZpdGF0aW9uXG4gKiBAcGFyYW0ge1Bvc2l0aW9uS2luZH0gcG9zaXRpb25LaW5kXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxQYXltZW50Pn1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBheW9mZkhhbmRsZXJcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gdm9pZH0gc2NoZWR1bGVQYXlvZmZzXG4gKiBAcHJvcGVydHkgIHtNYWtlT3B0aW9uSW52aXRhdGlvbn0gbWFrZU9wdGlvbkludml0YXRpb25cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IENhbGN1bGF0ZVNoYXJlc1JldHVyblxuICogUmV0dXJuIHZhbHVlIGZyb20gY2FsY3VsYXRlU2hhcmVzLCB3aGljaCByZXByZXNlbnRzIHRoZSBwb3J0aW9ucyBhc3NpZ25lZCB0b1xuICogdGhlIGxvbmcgYW5kIHNob3J0IHNpZGUgb2YgYSB0cmFuc2FjdGlvbi4gVGhlc2Ugd2lsbCBiZSB0d28gbm9uLW5lZ2F0aXZlXG4gKiBpbnRlZ2VycyB0aGF0IHN1bSB0byAxMDAuXG4gKiBAcHJvcGVydHkge1JhdGlvfSBsb25nU2hhcmVcbiAqIEBwcm9wZXJ0eSB7UmF0aW99IHNob3J0U2hhcmVcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBDYWxjdWxhdGVTaGFyZXNcbiAqIGNhbGN1bGF0ZSB0aGUgcG9ydGlvbiAoYXMgYSBwZXJjZW50YWdlKSBvZiB0aGUgY29sbGF0ZXJhbCB0aGF0IHNob3VsZCBiZVxuICogYWxsb2NhdGVkIHRvIHRoZSBsb25nIHNpZGUgb2YgYSBjYWxsIHNwcmVhZCBjb250cmFjdC4gcHJpY2UgZ2l2ZXMgdGhlIHZhbHVlXG4gKiBvZiB0aGUgdW5kZXJseWluZyBhc3NldCBhdCBjbG9zaW5nIHRoYXQgZGV0ZXJtaW5lcyB0aGUgcGF5b3V0cyB0byB0aGUgcGFydGllc1xuICpcbiAqIGlmIHByaWNlIDw9IHN0cmlrZVByaWNlMSwgcmV0dXJuIFJhdGlvIHJlcHJlc2VudGluZyAwXG4gKiBpZiBwcmljZSA+PSBzdHJpa2VQcmljZTIsIHJldHVybiBSYXRpbyByZXByZXNlbnRpbmcgMS5cbiAqIE90aGVyd2lzZSByZXR1cm4gbG9uZ1NoYXJlIGFuZCBzaG9ydFNoYXJlIHJlcHJlc2VudGluZyByYXRpb3MgYmV0d2VlbiAwJSBhbmRcbiAqIDEwMCUgcmVmbGVjdGluZyB0aGUgcG9zaXRpb24gb2YgdGhlIHByaWNlIGluIHRoZSByYW5nZSBmcm9tIHN0cmlrZVByaWNlMSB0b1xuICogc3RyaWtlUHJpY2UyLlxuICogQHBhcmFtIHtCcmFuZH0gY29sbGF0ZXJhbEJyYW5kXG4gKiBAcGFyYW0ge0Ftb3VudH0gcHJpY2VcbiAqIEBwYXJhbSB7QW1vdW50fSBzdHJpa2VQcmljZTFcbiAqIEBwYXJhbSB7QW1vdW50fSBzdHJpa2VQcmljZTJcbiAqIEByZXR1cm5zIHtDYWxjdWxhdGVTaGFyZXNSZXR1cm59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgTWFrZTEwMFBlcmNlbnRcbiAqIEBwYXJhbSB7QnJhbmR9IGJyYW5kXG4gKiBAcmV0dXJucyB7UmF0aW99XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgTWFrZTBQZXJjZW50XG4gKiBAcGFyYW0ge0JyYW5kfSBicmFuZFxuICogQHJldHVybnMge1JhdGlvfVxuICovXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAABmGvenjAQAA4wEAAC0AAABAYWdvcmljL3pvZS12MC4yNS41L3NyYy9jb250cmFjdHMvZXhwb3J0ZWQuanN7ImltcG9ydHMiOlsiLi9jYWxsU3ByZWFkL3R5cGVzLmpzIiwiLi9sb2FuL3R5cGVzLmpzIiwiLi9wcmljZUFnZ3JlZ2F0b3JUeXBlcy5qcyIsIi4vdHlwZXMuanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi90eXBlcy5qc1wiLCBbXV0sW1wiLi9sb2FuL3R5cGVzLmpzXCIsIFtdXSxbXCIuL3ByaWNlQWdncmVnYXRvclR5cGVzLmpzXCIsIFtdXSxbXCIuL2NhbGxTcHJlYWQvdHlwZXMuanNcIiwgW11dXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKkak2C4GQAAuBkAAC8AAABAYWdvcmljL3pvZS12MC4yNS41L3NyYy9jb250cmFjdHMvbG9hbi90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qKlxuICogQHR5cGVkZWYge05vdGlmaWVyPFRpbWVzdGFtcD59IFBlcmlvZE5vdGlmaWVyXG4gKlxuICogIFRoZSBOb3RpZmllciB0aGF0IHByb3ZpZGVzIG5vdGlmaWNhdGlvbnMgdGhhdCBwZXJpb2RzIGhhdmUgcGFzc2VkLlxuICogIFNpbmNlIG5vdGlmaWVycyBjYW4ndCBiZSByZWxpZWQgb24gdG8gcHJvZHVjZSBhbiBvdXRwdXQgZXZlcnkgdGltZVxuICogIHRoZXkgc2hvdWxkLCB3ZSdsbCB0cmFjayB0aGUgdGltZSBvZiBsYXN0IHBheW1lbnQsIGFuZCBjYXRjaCB1cCBpZlxuICogIGFueSB0aW1lcyBoYXZlIGJlZW4gbWlzc2VkLiBDb21wb3VuZCBpbnRlcmVzdCB3aWxsIGJlIGNhbGN1bGF0ZWRcbiAqICB1c2luZyB0aGUgaW50ZXJlc3RSYXRlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge0luc3RhbmNlfSBBdXRvc3dhcEluc3RhbmNlXG4gKiAgIFRoZSBydW5uaW5nIGNvbnRyYWN0IGluc3RhbmNlIGZvciBhbiBBdXRvc3dhcCBvciBjb25zdGFudCBwcm9kdWN0XG4gKiAgIEFNTSBpbnN0YWxsYXRpb24uICBUaGUgcHVibGljRmFjZXQgZnJvbSB0aGUgQXV0b3N3YXBcbiAqICAgaW5zdGFuY2UgaXMgdXNlZCBmb3IgcHJvZHVjaW5nIGFuIGludml0YXRpb24gdG8gc2VsbCB0aGVcbiAqICAgY29sbGF0ZXJhbCBvbiBsaXF1aWRhdGlvbi5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIExvYW5UZXJtc1xuICpcbiAqIEBwcm9wZXJ0eSB7UmF0aW99IG1tciAtIE1haW50ZW5hbmNlIE1hcmdpbiBSZXF1aXJlbWVudCwgYSBSYXRpbyByZWNvcmQuXG4gKiBEZWZhdWx0IGlzIDE1MCVcbiAqXG4gKiBAcHJvcGVydHkge0F1dG9zd2FwSW5zdGFuY2V9IGF1dG9zd2FwSW5zdGFuY2VcbiAqXG4gKiBAcHJvcGVydHkge1ByaWNlQXV0aG9yaXR5fSBwcmljZUF1dGhvcml0eVxuICpcbiAqICAgVXNlZCBmb3IgZ2V0dGluZyB0aGUgY3VycmVudCB2YWx1ZSBvZiBjb2xsYXRlcmFsIGFuZCBzZXR0aW5nXG4gKiAgIGxpcXVpZGF0aW9uIHRyaWdnZXJzLlxuICpcbiAqIEBwcm9wZXJ0eSB7UGVyaW9kTm90aWZpZXJ9IHBlcmlvZE5vdGlmaWVyXG4gKlxuICogQHByb3BlcnR5IHtSYXRpb30gaW50ZXJlc3RSYXRlXG4gKiAgIFRoZSByYXRlIGluIGJhc2lzIHBvaW50cyB0aGF0IHdpbGwgYmUgbXVsdGlwbGllZCB3aXRoIHRoZSBkZWJ0IG9uXG4gKiAgIGV2ZXJ5IHBlcmlvZCB0byBjb21wb3VuZCBpbnRlcmVzdC5cbiAqXG4gKiBAcHJvcGVydHkge1JlbGF0aXZlVGltZX0gaW50ZXJlc3RQZXJpb2RcbiAqXG4gKiBAcHJvcGVydHkge0JyYW5kfSBsb2FuQnJhbmRcbiAqIEBwcm9wZXJ0eSB7QnJhbmR9IGNvbGxhdGVyYWxCcmFuZFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgTGVuZGVyU2VhdFByb3BlcnR5XG4gKiBAcHJvcGVydHkge1pDRlNlYXR9IGxlbmRlclNlYXRcbiAqXG4gKiAgIFRoZSBaQ0ZTZWF0IHJlcHJlc2VudGluZyB0aGUgbGVuZGVyJ3MgcG9zaXRpb24gaW4gdGhlIGNvbnRyYWN0LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge0xvYW5UZXJtcyAmIExlbmRlclNlYXRQcm9wZXJ0eX0gTG9hbkNvbmZpZ1dpdGhMZW5kZXJcbiAqXG4gKiBUaGUgbG9hbiBub3cgaGFzIGEgbGVuZGVyU2VhdCwgd2hpY2ggaXMgYWRkZWQgdG8gdGhlIGNvbmZpZy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEJvcnJvd2VyQ29uZmlnUHJvcGVydGllc1xuICpcbiAqIEBwcm9wZXJ0eSB7WkNGU2VhdH0gY29sbGF0ZXJhbFNlYXRcbiAqXG4gKiAgIFRoZSBaQ0ZTZWF0IGhvbGRpbmcgdGhlIGNvbGxhdGVyYWwgaW4gZXNjcm93IGFmdGVyIHRoZSBib3Jyb3dlclxuICogICBlc2Nyb3dzIGl0XG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBBbW91bnR9IGdldERlYnRcbiAqXG4gKiAgIEEgZnVuY3Rpb24gdG8gZ2V0IHRoZSBjdXJyZW50IGRlYnRcbiAqXG4gKiBAcHJvcGVydHkge1Byb21pc2VSZWNvcmQ8UHJpY2VRdW90ZT59IGxpcXVpZGF0aW9uUHJvbWlzZUtpdFxuICpcbiAqICAgUHJvbWlzZUtpdCB0aGF0IGluY2x1ZGVzIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGEgUHJpY2VRdW90ZVxuICogICB3aGVuIGxpcXVpZGF0aW9uIGlzIHRyaWdnZXJlZFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgQm9ycm93ZXJDb25maWdQcm9wZXJ0aWVzTWludXNEZWJ0XG4gKlxuICogQHByb3BlcnR5IHtaQ0ZTZWF0fSBjb2xsYXRlcmFsU2VhdFxuICpcbiAqICAgVGhlIFpDRlNlYXQgaG9sZGluZyB0aGUgY29sbGF0ZXJhbCBpbiBlc2Nyb3cgYWZ0ZXIgdGhlIGJvcnJvd2VyXG4gKiAgIGVzY3Jvd3MgaXRcbiAqXG4gKiBAcHJvcGVydHkge1Byb21pc2VSZWNvcmQ8UHJpY2VRdW90ZT59IGxpcXVpZGF0aW9uUHJvbWlzZUtpdFxuICpcbiAqICAgUHJvbWlzZUtpdCB0aGF0IGluY2x1ZGVzIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGEgUHJpY2VRdW90ZVxuICogICB3aGVuIGxpcXVpZGF0aW9uIGlzIHRyaWdnZXJlZFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge0xvYW5Db25maWdXaXRoTGVuZGVyICYgQm9ycm93ZXJDb25maWdQcm9wZXJ0aWVzIH0gTG9hbkNvbmZpZ1dpdGhCb3Jyb3dlclxuICpcbiAqIFRoZSBsb2FuIGhhcyBhIGxlbmRlciwgYSBib3Jyb3dlciwgYW5kIGNvbGxhdGVyYWwgZXNjcm93ZWQuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7TG9hbkNvbmZpZ1dpdGhMZW5kZXIgJiBCb3Jyb3dlckNvbmZpZ1Byb3BlcnRpZXNNaW51c0RlYnRcbiAqIH0gTG9hbkNvbmZpZ1dpdGhCb3Jyb3dlck1pbnVzRGVidFxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFNjaGVkdWxlTGlxdWlkYXRpb25cbiAqIEBwYXJhbSB7WkNGfSB6Y2ZcbiAqIEBwYXJhbSB7TG9hbkNvbmZpZ1dpdGhCb3Jyb3dlcn0gY29uZmlnXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgTWFrZUxlbmRJbnZpdGF0aW9uXG4gKiBAcGFyYW0ge1pDRn0gemNmXG4gKiBAcGFyYW0ge0xvYW5UZXJtc30gY29uZmlnXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxJbnZpdGF0aW9uPn0gbGVuZEludml0YXRpb25cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBNYWtlQm9ycm93SW52aXRhdGlvblxuICogQHBhcmFtIHtaQ0Z9IHpjZlxuICogQHBhcmFtIHtMb2FuQ29uZmlnV2l0aExlbmRlcn0gY29uZmlnXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxJbnZpdGF0aW9uPn0gYm9ycm93SW52aXRhdGlvblxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIE1ha2VDbG9zZUxvYW5JbnZpdGF0aW9uXG4gKiBAcGFyYW0ge1pDRn0gemNmXG4gKiBAcGFyYW0ge0xvYW5Db25maWdXaXRoQm9ycm93ZXJ9IGNvbmZpZ1xuICogQHJldHVybnMge1Byb21pc2U8SW52aXRhdGlvbj59IGNsb3NlTG9hbkludml0YXRpb25cbiAqL1xuXG4vKipcbiAqIEFsbG93cyBob2xkZXIgdG8gYWRkIGNvbGxhdGVyYWwgdG8gdGhlIGNvbnRyYWN0LiBFeGl0cyB0aGUgc2VhdFxuICogYWZ0ZXIgYWRkaW5nLlxuICpcbiAqIEBjYWxsYmFjayBNYWtlQWRkQ29sbGF0ZXJhbEludml0YXRpb25cbiAqIEBwYXJhbSB7WkNGfSB6Y2ZcbiAqIEBwYXJhbSB7TG9hbkNvbmZpZ1dpdGhCb3Jyb3dlcn0gY29uZmlnXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxJbnZpdGF0aW9uPn0gYWRkQ29sbGF0ZXJhbEludml0YXRpb25cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBMaXF1aWRhdGVcbiAqIEBwYXJhbSB7WkNGfSB6Y2ZcbiAqIEBwYXJhbSB7TG9hbkNvbmZpZ1dpdGhCb3Jyb3dlcn0gY29uZmlnXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBNYWtlRGVidENhbGN1bGF0b3JcbiAqIEBwYXJhbSB7RGVidENhbGN1bGF0b3JDb25maWd9IGRlYnRDYWxjdWxhdG9yQ29uZmlnXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQ2FsY0ludGVyZXN0Rm5cbiAqIEBwYXJhbSB7QW1vdW50fSBvbGREZWJ0XG4gKiBAcGFyYW0ge1JhdGlvfSBpbnRlcmVzdFJhdGVcbiAqIEByZXR1cm5zIHtBbW91bnR9IGludGVyZXN0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBEZWJ0Q2FsY3VsYXRvckNvbmZpZ1xuICogQHByb3BlcnR5IHtDYWxjSW50ZXJlc3RGbn0gY2FsY0ludGVyZXN0Rm5cbiAqXG4gKiAgIEEgZnVuY3Rpb24gdG8gY2FsY3VsYXRlIHRoZSBpbnRlcmVzdCwgZ2l2ZW4gdGhlIGRlYnQgdmFsdWUgYW5kIGFuXG4gKiAgIGludGVyZXN0IHJhdGUgaW4gYmFzaXMgcG9pbnRzLlxuICpcbiAqIEBwcm9wZXJ0eSB7QW1vdW50fSBvcmlnaW5hbERlYnRcbiAqXG4gKiAgIFRoZSBkZWJ0IGF0IHRoZSBzdGFydCBvZiB0aGUgbG9hbiwgaW4gTG9hbiBicmFuZFxuICpcbiAqIEBwcm9wZXJ0eSB7UGVyaW9kTm90aWZpZXJ9IHBlcmlvZE5vdGlmaWVyXG4gKlxuICogICBUaGUgQXN5bmNJdGVyYWJsZSB0byBub3RpZnkgd2hlbiBhIHBlcmlvZCBoYXMgb2NjdXJyZWRcbiAqXG4gKiBAcHJvcGVydHkge1JhdGlvfSBpbnRlcmVzdFJhdGVcbiAqIEBwcm9wZXJ0eSB7UmVsYXRpdmVUaW1lfSBpbnRlcmVzdFBlcmlvZFxuICpcbiAqICB0aGUgcGVyaW9kIGF0IHdoaWNoIHRoZSBvdXRzdGFuZGluZyBkZWJ0IGluY3JlYXNlcyBieSB0aGUgaW50ZXJlc3RSYXRlXG4gKlxuICogQHByb3BlcnR5IHtaQ0Z9IHpjZlxuICpcbiAqIEBwcm9wZXJ0eSB7TG9hbkNvbmZpZ1dpdGhCb3Jyb3dlck1pbnVzRGVidH0gY29uZmlnTWludXNHZXREZWJ0XG4gKiBAcHJvcGVydHkge1RpbWVzdGFtcH0gYmFzZXRpbWUgVGhlIHN0YXJ0aW5nIHBvaW50IGZyb20gd2hpY2ggdG8gY2FsY3VsYXRlXG4gKiBpbnRlcmVzdC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IENvbmZpZ01pbnVzR2V0RGVidFxuICogQHByb3BlcnR5IHtaQ0ZTZWF0fSBjb2xsYXRlcmFsU2VhdFxuICogQHByb3BlcnR5IHtQcm9taXNlUmVjb3JkPGFueT59IGxpcXVpZGF0aW9uUHJvbWlzZUtpdFxuICogQHByb3BlcnR5IHtiaWdpbnR9IFttbXJdXG4gKiBAcHJvcGVydHkge0hhbmRsZTwnSW5zdGFuY2UnPn0gYXV0b3N3YXBJbnN0YW5jZVxuICogQHByb3BlcnR5IHtQcmljZUF1dGhvcml0eX0gcHJpY2VBdXRob3JpdHlcbiAqIEBwcm9wZXJ0eSB7UGVyaW9kTm90aWZpZXJ9IHBlcmlvZE5vdGlmaWVyXG4gKiBAcHJvcGVydHkge2JpZ2ludH0gaW50ZXJlc3RSYXRlXG4gKiBAcHJvcGVydHkge1JlbGF0aXZlVGltZX0gaW50ZXJlc3RQZXJpb2RcbiAqIEBwcm9wZXJ0eSB7WkNGU2VhdH0gbGVuZGVyU2VhdFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQm9ycm93RmFjZXRcbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8SW52aXRhdGlvbj59IG1ha2VDbG9zZUxvYW5JbnZpdGF0aW9uXG4gKlxuICogTWFrZSBhbiBpbnZpdGF0aW9uIHRvIGNsb3NlIHRoZSBsb2FuIGJ5IHJlcGF5aW5nIHRoZSBkZWJ0XG4gKiAgIChpbmNsdWRpbmcgaW50ZXJlc3QpLlxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxJbnZpdGF0aW9uPn0gbWFrZUFkZENvbGxhdGVyYWxJbnZpdGF0aW9uXG4gKlxuICogTWFrZSBhbiBpbnZpdGF0aW9uIHRvIGFkZCBjb2xsYXRlcmFsIHRvIHByb3RlY3QgYWdhaW5zdCBsaXF1aWRhdGlvblxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxQcmljZVF1b3RlPn0gZ2V0TGlxdWlkYXRpb25Qcm9taXNlXG4gKlxuICogR2V0IGEgcHJvbWlzZSBmb3IgYSBwcmljZVF1b3RlIHRoYXQgd2lsbCByZXNvbHZlIGlmIGxpcXVpZGF0aW9uXG4gKiBvY2N1cnMuIFRoZSBwcmljZVF1b3RlIGlzIGZvciB0aGUgdmFsdWUgb2YgdGhlIGNvbGxhdGVyYWwgdGhhdFxuICogdHJpZ2dlcmVkIHRoZSBsaXF1aWRhdGlvbi4gVGhpcyBtYXkgYmUgbG93ZXIgdGhhbiBleHBlY3RlZCBpZiB0aGVcbiAqIHByaWNlIGlzIG1vdmluZyBxdWlja2x5LlxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gVGltZXN0YW1wfSBnZXRMYXN0Q2FsY3VsYXRpb25UaW1lc3RhbXBcbiAqXG4gKiBHZXQgdGhlIHRpbWVzdGFtcCBhdCB3aGljaCB0aGUgZGVidCB3YXMgbW9zdCByZWNlbnRseSByZWNhbGN1bGF0ZWQuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBOb3RpZmllcjxBbW91bnQ+fSBnZXREZWJ0Tm90aWZpZXJcbiAqXG4gKiBHZXQgYSBOb3RpZmllciB0aGF0IHdpbGwgYmUgdXBkYXRlZCB3aGVuIHRoZSBjdXJyZW50IGRlYnQgKGFuIEFtb3VudCB3aXRoIHRoZSBMb2FuXG4gKiBCcmFuZCkgY2hhbmdlcy4gVGhpcyB3aWxsIGluY3JlYXNlIGFzIGludGVyZXN0IGlzIGFkZGVkLlxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gQW1vdW50fSBnZXRSZWNlbnRDb2xsYXRlcmFsQW1vdW50XG4gKlxuICogR2V0IGEgcmVjZW50IHJlcG9ydCBvZiB0aGUgYW1vdW50IG9mIGNvbGxhdGVyYWwgaW4gdGhlIGxvYW5cbiAqL1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABkN4g7qAwAAKgMAAA5AAAAQGFnb3JpYy96b2UtdjAuMjUuNS9zcmMvY29udHJhY3RzL3ByaWNlQWdncmVnYXRvclR5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBPcmFjbGVBZG1pblxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPHZvaWQ+fSBkZWxldGVcbiAqIFJlbW92ZSB0aGUgb3JhY2xlIGZyb20gdGhlIGFnZ3JlZ2F0b3JcbiAqIEBwcm9wZXJ0eSB7KHJlc3VsdDogYW55KSA9PiBQcm9taXNlPHZvaWQ+fSBwdXNoUmVzdWx0XG4gKiBSYXRoZXIgdGhhbiB3YWl0aW5nIGZvciB0aGUgcG9sbGluZyBxdWVyeSwgcHVzaCBhIHJlc3VsdCBkaXJlY3RseSBmcm9tIHRoaXMgb3JhY2xlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7e30gfCBzdHJpbmd9IE9yYWNsZUtleVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFByaWNlQWdncmVnYXRvckNyZWF0b3JGYWNldEluaXRPcmFjbGVcbiAqIEBwYXJhbSB7SW5zdGFuY2UgfCBzdHJpbmd9IFtvcmFjbGVJbnN0YW5jZV1cbiAqIEBwYXJhbSB7dW5rbm93bn0gW3F1ZXJ5XVxuICogQHJldHVybnMge1Byb21pc2U8T3JhY2xlQWRtaW4+fVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1BpY2s8WGltcG9ydChcIi4vcHJpY2VBZ2dyZWdhdG9yXCIpLlByaWNlQWdncmVnYXRvckNvbnRyYWN0LCAnY3JlYXRvckZhY2V0JyB8ICdwdWJsaWNGYWNldCc+fSBQcmljZUFnZ3JlZ2F0b3JLaXRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtiaWdpbnQgfCBudW1iZXIgfCBzdHJpbmd9IFBhcnNhYmxlTnVtYmVyXG4gKiBAdHlwZWRlZiB7UmVhZG9ubHk8UGFyc2FibGVOdW1iZXIgfCB7IGRhdGE6IFBhcnNhYmxlTnVtYmVyIH0+fSBPcmFjbGVQcmljZVN1Ym1pc3Npb25cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiAmIHtcbiAqIGtpbmQ/OiBzdHJpbmcsXG4gKiBpbmNyZW1lbnQ/OiBiaWdpbnQsXG4gKiB9fSBPcmFjbGVRdWVyeVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gT3JhY2xlUHVibGljRmFjZXRcbiAqIFRoZSBwdWJsaWMgbWV0aG9kcyBhY2Nlc3NpYmxlIGZyb20gdGhlIGNvbnRyYWN0IGluc3RhbmNlXG4gKiBAcHJvcGVydHkgeyhxdWVyeTogT3JhY2xlUXVlcnkpID0+IEVSZWY8SW52aXRhdGlvbj59IG1ha2VRdWVyeUludml0YXRpb25cbiAqIENyZWF0ZSBhbiBpbnZpdGF0aW9uIGZvciBhbiBvcmFjbGUgcXVlcnlcbiAqIEBwcm9wZXJ0eSB7KHF1ZXJ5OiBPcmFjbGVRdWVyeSkgPT4gRVJlZjx1bmtub3duPn0gcXVlcnlcbiAqIE1ha2UgYW4gdW5wYWlkIHF1ZXJ5XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgT3JhY2xlQ3JlYXRvckZhY2V0TWFrZVdpdGhkcmF3SW52aXRhdGlvblxuICogQHBhcmFtIHtib29sZWFuPX0gdG90YWxcbiAqIEByZXR1cm5zIHtFUmVmPEludml0YXRpb24+fVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gT3JhY2xlQ3JlYXRvckZhY2V0XG4gKiBUaGUgcHJpdmF0ZSBtZXRob2RzIGFjY2Vzc2libGUgZnJvbSB0aGUgY29udHJhY3QgaW5zdGFuY2VcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gQW1vdW50S2V5d29yZFJlY29yZH0gZ2V0Q3VycmVudEZlZXNcbiAqIEdldCB0aGUgY3VycmVudCBmZWUgYW1vdW50c1xuICogQHByb3BlcnR5IHtPcmFjbGVDcmVhdG9yRmFjZXRNYWtlV2l0aGRyYXdJbnZpdGF0aW9ufSBtYWtlV2l0aGRyYXdJbnZpdGF0aW9uXG4gKiBDcmVhdGUgYW4gaW52aXRhdGlvbiB0byB3aXRoZHJhdyBmZWVzXG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8SW52aXRhdGlvbj59IG1ha2VTaHV0ZG93bkludml0YXRpb25cbiAqIE1ha2UgYW4gaW52aXRhdGlvbiB0byB3aXRoZHJhdyBhbGwgZmVlcyBhbmQgc2h1dGRvd25cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IE9yYWNsZVByaXZhdGVQYXJhbWV0ZXJzXG4gKiBAcHJvcGVydHkge09yYWNsZUhhbmRsZXJ9IG9yYWNsZUhhbmRsZXJcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IE9yYWNsZUluaXRpYWxpemF0aW9uRmFjZXRcbiAqIEBwcm9wZXJ0eSB7KHByaXZhdGVQYXJhbXM6IE9yYWNsZVByaXZhdGVQYXJhbWV0ZXJzXG4gKiApID0+IE9yYWNsZUNyZWF0b3JGYWNldH0gaW5pdGlhbGl6ZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gT3JhY2xlU3RhcnRGblJlc3VsdFxuICogQHByb3BlcnR5IHtPcmFjbGVJbml0aWFsaXphdGlvbkZhY2V0fSBjcmVhdG9yRmFjZXRcbiAqIEBwcm9wZXJ0eSB7T3JhY2xlUHVibGljRmFjZXR9IHB1YmxpY0ZhY2V0XG4gKiBAcHJvcGVydHkge0luc3RhbmNlfSBpbnN0YW5jZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gT3JhY2xlS2l0XG4gKiBAcHJvcGVydHkge09yYWNsZUNyZWF0b3JGYWNldH0gY3JlYXRvckZhY2V0XG4gKiBAcHJvcGVydHkge09yYWNsZVB1YmxpY0ZhY2V0fSBwdWJsaWNGYWNldFxuICogQHByb3BlcnR5IHtJbnN0YW5jZX0gaW5zdGFuY2VcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IE9yYWNsZVJlcGx5XG4gKiBAcHJvcGVydHkge2FueX0gcmVwbHlcbiAqIEBwcm9wZXJ0eSB7QW1vdW50fSBbcmVxdWlyZWRGZWVdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBPcmFjbGVIYW5kbGVyXG4gKiBAcHJvcGVydHkgeyhxdWVyeTogT3JhY2xlUXVlcnksIGZlZTogQW1vdW50KSA9PiBQcm9taXNlPE9yYWNsZVJlcGx5Pn0gb25RdWVyeVxuICogQ2FsbGJhY2sgdG8gcmVwbHkgdG8gYSBxdWVyeVxuICogQHByb3BlcnR5IHsocXVlcnk6IE9yYWNsZVF1ZXJ5LCByZWFzb246IHVua25vd24pID0+IHZvaWR9IG9uRXJyb3JcbiAqIE5vdGljZSBhbiBlcnJvclxuICogQHByb3BlcnR5IHsocXVlcnk6IE9yYWNsZVF1ZXJ5LFxuICogICAgICAgICAgICAgcmVwbHk6IHVua25vd24sXG4gKiAgICAgICAgICAgICByZXF1aXJlZEZlZTogQW1vdW50IHwgdW5kZWZpbmVkXG4gKiApID0+IHZvaWR9IG9uUmVwbHlcbiAqIE5vdGljZSBhIHN1Y2Nlc3NmdWwgcmVwbHlcbiAqL1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC2UO1PvQsAAL0LAAAqAAAAQGFnb3JpYy96b2UtdjAuMjUuNS9zcmMvY29udHJhY3RzL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTZWxsSXRlbXNQdWJsaWNGYWNldFxuICogQHByb3BlcnR5IHsoKSA9PiBJc3N1ZXJ9IGdldEl0ZW1zSXNzdWVyXG4gKiBAcHJvcGVydHkgeygpID0+IEFtb3VudH0gZ2V0QXZhaWxhYmxlSXRlbXNcbiAqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTZWxsSXRlbXNDcmVhdG9yT25seVxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPEludml0YXRpb24+fSBtYWtlQnV5ZXJJbnZpdGF0aW9uXG4gKlxuICogQHR5cGVkZWYge1NlbGxJdGVtc1B1YmxpY0ZhY2V0ICYgU2VsbEl0ZW1zQ3JlYXRvck9ubHl9IFNlbGxJdGVtc0NyZWF0b3JGYWNldFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU2VsbEl0ZW1zUGFyYW1ldGVyc1xuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBjdXN0b21WYWx1ZVByb3BlcnRpZXNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBjb3VudFxuICogQHByb3BlcnR5IHtJc3N1ZXJ9IG1vbmV5SXNzdWVyXG4gKiBAcHJvcGVydHkge0luc3RhbGxhdGlvbn0gc2VsbEl0ZW1zSW5zdGFsbGF0aW9uXG4gKiBAcHJvcGVydHkge0Ftb3VudH0gcHJpY2VQZXJJdGVtXG4gKlxuICogQHR5cGVkZWYge29iamVjdH0gU2VsbEl0ZW1zUmVzdWx0XG4gKiBAcHJvcGVydHkge1VzZXJTZWF0fSBzZWxsSXRlbXNDcmVhdG9yU2VhdFxuICogQHByb3BlcnR5IHtTZWxsSXRlbXNDcmVhdG9yRmFjZXR9IHNlbGxJdGVtc0NyZWF0b3JGYWNldFxuICogQHByb3BlcnR5IHtJbnN0YW5jZX0gc2VsbEl0ZW1zSW5zdGFuY2VcbiAqIEBwcm9wZXJ0eSB7U2VsbEl0ZW1zUHVibGljRmFjZXR9IHNlbGxJdGVtc1B1YmxpY0ZhY2V0XG4gKlxuICogQHR5cGVkZWYge29iamVjdH0gTWludEFuZFNlbGxORlRDcmVhdG9yRmFjZXRcbiAqIEBwcm9wZXJ0eSB7KHNlbGxQYXJhbXM6IFNlbGxJdGVtc1BhcmFtZXRlcnMpID0+IFByb21pc2U8U2VsbEl0ZW1zUmVzdWx0Pn0gc2VsbFRva2Vuc1xuICogQHByb3BlcnR5IHsoKSA9PiBJc3N1ZXJ9IGdldElzc3VlclxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQXV0b21hdGljUmVmdW5kUHVibGljRmFjZXRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gYmlnaW50fSBnZXRPZmZlcnNDb3VudFxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPEludml0YXRpb24+fSBtYWtlSW52aXRhdGlvblxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQXV0b3N3YXBQdWJsaWNGYWNldFxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPEludml0YXRpb24+fSBtYWtlU3dhcEludml0YXRpb24gc3lub255bSBmb3JcbiAqIG1ha2VTd2FwSW5JbnZpdGF0aW9uXG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8SW52aXRhdGlvbj59IG1ha2VTd2FwSW5JbnZpdGF0aW9uIG1ha2UgYW4gaW52aXRhdGlvblxuICogdGhhdCBhbGxvd3Mgb25lIHRvIGRvIGEgc3dhcCBpbiB3aGljaCB0aGUgSW4gYW1vdW50IGlzIHNwZWNpZmllZCBhbmQgdGhlIE91dFxuICogYW1vdW50IGlzIGNhbGN1bGF0ZWRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxJbnZpdGF0aW9uPn0gbWFrZVN3YXBPdXRJbnZpdGF0aW9uIG1ha2UgYW4gaW52aXRhdGlvblxuICogdGhhdCBhbGxvd3Mgb25lIHRvIGRvIGEgc3dhcCBpbiB3aGljaCB0aGUgT3V0IGFtb3VudCBpcyBzcGVjaWZpZWQgYW5kIHRoZSBJblxuICogYW1vdW50IGlzIGNhbGN1bGF0ZWRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxJbnZpdGF0aW9uPn0gbWFrZUFkZExpcXVpZGl0eUludml0YXRpb24gbWFrZSBhblxuICogaW52aXRhdGlvbiB0aGF0IGFsbG93cyBvbmUgdG8gYWRkIGxpcXVpZGl0eSB0byB0aGUgcG9vbC5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxJbnZpdGF0aW9uPn0gbWFrZVJlbW92ZUxpcXVpZGl0eUludml0YXRpb24gbWFrZSBhblxuICogaW52aXRhdGlvbiB0aGF0IGFsbG93cyBvbmUgdG8gcmVtb3ZlIGxpcXVpZGl0eSBmcm9tIHRoZSBwb29sLlxuICogQHByb3BlcnR5IHsoKSA9PiBJc3N1ZXJ9IGdldExpcXVpZGl0eUlzc3VlclxuICogQHByb3BlcnR5IHsoKSA9PiBiaWdpbnR9IGdldExpcXVpZGl0eVN1cHBseSBnZXQgdGhlIGN1cnJlbnQgdmFsdWUgb2ZcbiAqIGxpcXVpZGl0eSBoZWxkIGJ5IGludmVzdG9ycy5cbiAqIEBwcm9wZXJ0eSB7KGFtb3VudEluOiBBbW91bnQsIGJyYW5kT3V0OiBCcmFuZCkgPT4gQW1vdW50fSBnZXRJbnB1dFByaWNlXG4gKiBjYWxjdWxhdGUgdGhlIGFtb3VudCBvZiBicmFuZE91dCB0aGF0IHdpbGwgYmUgcmV0dXJuZWQgaWYgdGhlIGFtb3VudEluIGlzXG4gKiBvZmZlcmVkIHVzaW5nIG1ha2VTd2FwSW5JbnZpdGF0aW9uIGF0IHRoZSBjdXJyZW50IHByaWNlLlxuICogQHByb3BlcnR5IHsoYW1vdW50T3V0OiBBbW91bnQsIGJyYW5kSW46IEJyYW5kKSA9PiBBbW91bnR9IGdldE91dHB1dFByaWNlXG4gKiBjYWxjdWxhdGUgdGhlIGFtb3VudCBvZiBicmFuZEluIHRoYXQgaXMgcmVxdWlyZWQgaW4gb3JkZXIgdG8gZ2V0IGFtb3VudE91dFxuICogdXNpbmcgbWFrZVN3YXBPdXRJbnZpdGF0aW9uIGF0IHRoZSBjdXJyZW50IHByaWNlXG4gKiBAcHJvcGVydHkgeygpID0+IFJlY29yZDxzdHJpbmcsIEFtb3VudD59IGdldFBvb2xBbGxvY2F0aW9uIGdldCBhblxuICogQW1vdW50S2V5d29yZFJlY29yZCBzaG93aW5nIHRoZSBjdXJyZW50IGJhbGFuY2VzIGluIHRoZSBwb29sLlxuICovXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAFE0izmEKQAAhCkAACkAAABAYWdvcmljL3pvZS12MC4yNS41L3NyYy9pbnRlcm5hbC10eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEB0cy1jaGVjayovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFNlYXREYXRhXG4gKiBAcHJvcGVydHkge1Byb3Bvc2FsUmVjb3JkfSBwcm9wb3NhbFxuICogQHByb3BlcnR5IHtBbGxvY2F0aW9ufSBpbml0aWFsQWxsb2NhdGlvblxuICogQHByb3BlcnR5IHtTZWF0SGFuZGxlfSBzZWF0SGFuZGxlXG4gKiBAcHJvcGVydHkge29iamVjdD19IG9mZmVyQXJnc1xuICovXG5cbi8qKlxuICogR2l2ZW4gYW4gYWxsb2NhdGlvbiwgd2l0aGRyYXcgcGF5bWVudHMgdG8gY3JlYXRlIGEgcGF5b3V0XG4gKlxuICogQGNhbGxiYWNrIFdpdGhkcmF3UGF5bWVudHNcbiAqIEBwYXJhbSB7QWxsb2NhdGlvbn0gYWxsb2NhdGlvblxuICogQHJldHVybnMge1BheW1lbnRQS2V5d29yZFJlY29yZH1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFpvZVNlYXRBZG1pbktpdFxuICogQHByb3BlcnR5IHtVc2VyU2VhdH0gdXNlclNlYXRcbiAqIEBwcm9wZXJ0eSB7Wm9lU2VhdEFkbWlufSB6b2VTZWF0QWRtaW5cbiAqIEBwcm9wZXJ0eSB7Tm90aWZpZXI8QWxsb2NhdGlvbj59IG5vdGlmaWVyXG4gKlxuICogQGNhbGxiYWNrIE1ha2Vab2VTZWF0QWRtaW5LaXRcbiAqIE1ha2UgdGhlIFpvZSBzZWF0IGFkbWluLCB1c2VyIHNlYXQgYW5kIGEgbm90aWZpZXJcbiAqIEBwYXJhbSB7QWxsb2NhdGlvbn0gaW5pdGlhbEFsbG9jYXRpb25cbiAqIEBwYXJhbSB7KHpvZVNlYXRBZG1pbjogWm9lU2VhdEFkbWluKSA9PiB2b2lkfSBleGl0Wm9lU2VhdEFkbWluXG4gKiBAcGFyYW0geyh6b2VTZWF0QWRtaW46IFpvZVNlYXRBZG1pbikgPT4gYm9vbGVhbn0gaGFzRXhpdGVkXG4gKiBAcGFyYW0ge1Byb3Bvc2FsUmVjb3JkfSBwcm9wb3NhbFxuICogQHBhcmFtIHtXaXRoZHJhd1BheW1lbnRzfSB3aXRoZHJhd1BheW1lbnRzXG4gKiBAcGFyYW0ge0VSZWY8RXhpdE9iaj59IGV4aXRPYmpcbiAqIEBwYXJhbSB7RVJlZjx1bmtub3duPn0gW29mZmVyUmVzdWx0XVxuICogQHJldHVybnMge1pvZVNlYXRBZG1pbktpdH1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBab2VTZWF0QWRtaW5FeGl0XG4gKiBAcGFyYW0ge0NvbXBsZXRpb249fSBjb21wbGV0aW9uXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFpvZVNlYXRBZG1pblxuICogQHByb3BlcnR5IHsoYWxsb2NhdGlvbjogQWxsb2NhdGlvbikgPT4gdm9pZH0gcmVwbGFjZUFsbG9jYXRpb25cbiAqIEBwcm9wZXJ0eSB7Wm9lU2VhdEFkbWluRXhpdH0gZXhpdFxuICogQHByb3BlcnR5IHtTaHV0ZG93bldpdGhGYWlsdXJlfSBmYWlsIGNhbGxlZCB3aXRoIHRoZSByZWFzb25cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxOb3RpZmllcjxBbGxvY2F0aW9uPj4gfSBnZXROb3RpZmllclxuICogZm9yIGNhbGxpbmcgZmFpbCBvbiB0aGlzIHNlYXQsIHdoZXJlIHJlYXNvbiBpcyBub3JtYWxseSBhbiBpbnN0YW5jZW9mIEVycm9yLlxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIHsoYnJhbmQ6IEJyYW5kKSA9PiBBc3NldEtpbmR9IEdldEFzc2V0S2luZFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gSGFuZGxlT2ZmZXJSZXN1bHRcbiAqIEBwcm9wZXJ0eSB7UHJvbWlzZTxhbnk+fSBvZmZlclJlc3VsdFByb21pc2VcbiAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBleGl0T2JqXG4gKi9cblxuLyoqXG4gKiBUaGUgc2VhdEhhbmRsZSBtYXkgYmUgY3JlYXRlZCBpbiBlaXRoZXIgdGhlIFpvZSBvciBaQ0YgdmF0LFxuICogZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIHNlYXQgY29tZXMgZnJvbSBhIG5vcm1hbCBvZmZlciBvciBhXG4gKiByZXF1ZXN0IGJ5IHRoZSBjb250cmFjdCBmb3IgYW4gXCJlbXB0eVwiIHNlYXQuXG4gKlxuICogQHR5cGVkZWYge29iamVjdH0gSW5zdGFuY2VBZG1pblxuICogQHByb3BlcnR5IHsoKSA9PiB2b2lkfSBhc3NlcnRBY2NlcHRpbmdPZmZlcnNcbiAqIEBwcm9wZXJ0eSB7KGludml0YXRpb25IYW5kbGU6IEludml0YXRpb25IYW5kbGUsXG4gKiAgICAgaW5pdGlhbEFsbG9jYXRpb246IEFsbG9jYXRpb24sXG4gKiAgICAgcHJvcG9zYWw6IFByb3Bvc2FsUmVjb3JkLFxuICogICAgIG9mZmVyQXJncz86IG9iamVjdCxcbiAqICkgPT4gVXNlclNlYXQgfSBtYWtlVXNlclNlYXRcbiAqIEBwcm9wZXJ0eSB7TWFrZU5vRXNjcm93U2VhdEtpdH0gbWFrZU5vRXNjcm93U2VhdEtpdFxuICogQHByb3BlcnR5IHsoKSA9PiBJbnN0YW5jZX0gZ2V0SW5zdGFuY2VcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gb2JqZWN0fSBnZXRQdWJsaWNGYWNldFxuICogQHByb3BlcnR5IHsoKSA9PiBJc3N1ZXJLZXl3b3JkUmVjb3JkfSBnZXRJc3N1ZXJzXG4gKiBAcHJvcGVydHkgeygpID0+IEJyYW5kS2V5d29yZFJlY29yZH0gZ2V0QnJhbmRzXG4gKiBAcHJvcGVydHkgeygpID0+IG9iamVjdH0gZ2V0VGVybXNcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gc3RyaW5nW119IGdldE9mZmVyRmlsdGVyXG4gKiBAcHJvcGVydHkgeygpID0+IEluc3RhbGxhdGlvbn0gZ2V0SW5zdGFsbGF0aW9uRm9ySW5zdGFuY2VcbiAqIEBwcm9wZXJ0eSB7KGNvbXBsZXRpb246IENvbXBsZXRpb24pID0+IHZvaWR9IGV4aXRBbGxTZWF0c1xuICogQHByb3BlcnR5IHtTaHV0ZG93bldpdGhGYWlsdXJlfSBmYWlsQWxsU2VhdHNcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gdm9pZH0gc3RvcEFjY2VwdGluZ09mZmVyc1xuICogQHByb3BlcnR5IHsoc3RyaW5nOiBzdHJpbmcpID0+IGJvb2xlYW59IGlzQmxvY2tlZFxuICovXG5cbi8qKlxuICogVGhlIHNlYXRIYW5kbGUgbWF5IGJlIGNyZWF0ZWQgaW4gZWl0aGVyIHRoZSBab2Ugb3IgWkNGIHZhdCxcbiAqIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBzZWF0IGNvbWVzIGZyb20gYSBub3JtYWwgb2ZmZXIgb3IgYVxuICogcmVxdWVzdCBieSB0aGUgY29udHJhY3QgZm9yIGFuIFwiZW1wdHlcIiBzZWF0LlxuICpcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEhhbmRsZU9mZmVyT2JqXG4gKiBAcHJvcGVydHkgeyhpbnZpdGF0aW9uSGFuZGxlOiBJbnZpdGF0aW9uSGFuZGxlLFxuICogICAgICAgICAgICAgc2VhdERhdGE6IFNlYXREYXRhLFxuICogICAgICAgICAgICApID0+IEhhbmRsZU9mZmVyUmVzdWx0fSBoYW5kbGVPZmZlclxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFpvZUluc3RhbmNlQWRtaW5NYWtlSW52aXRhdGlvblxuICogQHBhcmFtIHtJbnZpdGF0aW9uSGFuZGxlfSBpbnZpdGF0aW9uSGFuZGxlXG4gKiBAcGFyYW0ge3N0cmluZ30gZGVzY3JpcHRpb25cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pj19IGN1c3RvbVByb3BlcnRpZXNcbiAqIEBwYXJhbSB7UGF0dGVybn0gW3Byb3Bvc2FsU2hhcGVdXG4gKiBAcmV0dXJucyB7UGF5bWVudH1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFpvZUluc3RhbmNlQWRtaW5cbiAqIEBwcm9wZXJ0eSB7Wm9lSW5zdGFuY2VBZG1pbk1ha2VJbnZpdGF0aW9ufSBtYWtlSW52aXRhdGlvblxuICogQHByb3BlcnR5IHsoaXNzdWVyUDogRVJlZjxJc3N1ZXI+LFxuICogICAgICAgICAgICAga2V5d29yZDogS2V5d29yZFxuICogICAgICAgICAgICApID0+IFByb21pc2U8SXNzdWVyUmVjb3JkPn0gc2F2ZUlzc3VlclxuICogQHByb3BlcnR5IHtNYWtlWm9lTWludH0gbWFrZVpvZU1pbnRcbiAqIEBwcm9wZXJ0eSB7UmVnaXN0ZXJGZWVNaW50fSByZWdpc3RlckZlZU1pbnRcbiAqIEBwcm9wZXJ0eSB7TWFrZU5vRXNjcm93U2VhdEtpdH0gbWFrZU5vRXNjcm93U2VhdEtpdFxuICogQHByb3BlcnR5IHtSZXBsYWNlQWxsb2NhdGlvbnN9IHJlcGxhY2VBbGxvY2F0aW9uc1xuICogQHByb3BlcnR5IHsoY29tcGxldGlvbjogQ29tcGxldGlvbikgPT4gdm9pZH0gZXhpdEFsbFNlYXRzXG4gKiBAcHJvcGVydHkge1NodXRkb3duV2l0aEZhaWx1cmV9IGZhaWxBbGxTZWF0c1xuICogQHByb3BlcnR5IHsoc2VhdEhhbmRsZTogU2VhdEhhbmRsZSwgY29tcGxldGlvbjogQ29tcGxldGlvbikgPT4gdm9pZH0gZXhpdFNlYXRcbiAqIEBwcm9wZXJ0eSB7KHNlYXRIYW5kbGU6IFNlYXRIYW5kbGUsIHJlYXNvbjogRXJyb3IpID0+IHZvaWR9IGZhaWxTZWF0XG4gKiBAcHJvcGVydHkgeyhzZWF0SGFuZGxlOiBTZWF0SGFuZGxlKSA9PiBQcm9taXNlPE5vdGlmaWVyPEFsbG9jYXRpb24+Pn0gZ2V0U2VhdE5vdGlmaWVyXG4gKiBAcHJvcGVydHkgeygpID0+IHZvaWR9IHN0b3BBY2NlcHRpbmdPZmZlcnNcbiAqIEBwcm9wZXJ0eSB7KHN0cmluZ3M6IEFycmF5PHN0cmluZz4pID0+IHZvaWR9IHNldE9mZmVyRmlsdGVyXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgUmVnaXN0ZXJGZWVNaW50XG4gKiBAcGFyYW0ge0tleXdvcmR9IGtleXdvcmQgLSB0aGUga2V5d29yZCB0byB1c2UgZm9yIHRoZSBpc3N1ZXJcbiAqIEBwYXJhbSB7RmVlTWludEFjY2Vzc30gYWxsZWdlZEZlZU1pbnRBY2Nlc3MgLSBhbiBvYmplY3QgdGhhdFxuICogcHVycG9ydHMgdG8gYmUgdGhlIG9iamVjdCB0aGF0IGFsbG93cyBhY2Nlc3MgdG8gdGhlIGZlZU1pbnRcbiAqIEByZXR1cm5zIHtab2VNaW50fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFdyYXBJc3N1ZXJLaXRXaXRoWm9lTWludFxuICogQHBhcmFtIHtLZXl3b3JkfSBrZXl3b3JkIC0gdGhlIGtleXdvcmQgdG8gdXNlIGZvciB0aGUgaXNzdWVyXG4gKiBAcGFyYW0ge0lzc3VlcktpdH0gbG9jYWxJc3N1ZXJLaXQgLSBhbiBpc3N1ZXIga2l0IHRoYXQgb3JpZ2luYXRlc1xuICogd2l0aGluIFpvZVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIE1ha2Vab2VNaW50XG4gKiBAcGFyYW0ge0tleXdvcmR9IGtleXdvcmRcbiAqIEBwYXJhbSB7QXNzZXRLaW5kPX0gYXNzZXRLaW5kXG4gKiBAcGFyYW0ge0FkZGl0aW9uYWxEaXNwbGF5SW5mbz19IGRpc3BsYXlJbmZvXG4gKiBAcGFyYW0ge1BhcnRpYWw8e2VsZW1lbnRTaGFwZTogUGF0dGVybn0+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtab2VNaW50fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIE1ha2VOb0VzY3Jvd1NlYXRLaXRcbiAqIEBwYXJhbSB7QWxsb2NhdGlvbn0gaW5pdGlhbEFsbG9jYXRpb25cbiAqIEBwYXJhbSB7UHJvcG9zYWxSZWNvcmR9IHByb3Bvc2FsXG4gKiBAcGFyYW0ge0V4aXRPYmp9IGV4aXRPYmpcbiAqIEBwYXJhbSB7U2VhdEhhbmRsZX0gc2VhdEhhbmRsZVxuICogQHJldHVybnMge3t1c2VyU2VhdDogVXNlclNlYXQsIG5vdGlmaWVyOiBOb3RpZmllcjxBbGxvY2F0aW9uPn19XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgUmVwbGFjZUFsbG9jYXRpb25zXG4gKiBAcGFyYW0ge1NlYXRIYW5kbGVBbGxvY2F0aW9uW119IHNlYXRIYW5kbGVBbGxvY2F0aW9uc1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU2VhdEhhbmRsZUFsbG9jYXRpb25cbiAqIEBwcm9wZXJ0eSB7U2VhdEhhbmRsZX0gc2VhdEhhbmRsZVxuICogQHByb3BlcnR5IHtBbGxvY2F0aW9ufSBhbGxvY2F0aW9uXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBab2VNaW50XG4gKiBAcHJvcGVydHkgeygpID0+IElzc3VlclJlY29yZH0gZ2V0SXNzdWVyUmVjb3JkXG4gKiBAcHJvcGVydHkgeyh0b3RhbFRvTWludDogQW1vdW50KSA9PiB2b2lkfSBtaW50QW5kRXNjcm93XG4gKiBAcHJvcGVydHkgeyh0b3RhbFRvQnVybjogQW1vdW50KSA9PiB2b2lkfSB3aXRoZHJhd0FuZEJ1cm5cbiAqIE5vdGUgdGhhdCB0aGUgYnVybmluZyBpcyBhc3luY2hyb25vdXMsIGFuZCBzbyBtYXkgbm90IGhhdmUgaGFwcGVuZWQgYnlcbiAqIHRoZSB0aW1lIHdpdGhkcmF3QW5kQnVybiByZXR1cm5zLiBXZSByZWx5IG9uIG91ciBvdGhlciBib29ra2VlcGluZyBzbyB0aGF0XG4gKiB0aGVzZSBhc3NldHMgYXJlIGFzc3VtZWQgYnVybmVkIGVsc2V3aGVyZSwgc28gbm8gb25lIHdpbGwgdHJ5IHRvIGFjY2Vzc1xuICogdGhlbSBldmVuIGJlZm9yZSB0aGV5IGFyZSBhY3R1YWxseSBidXJuZWQuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBaQ0ZSb290XG4gKiBAcHJvcGVydHkge1N0YXJ0WmNmfSBzdGFydFpjZlxuICogQHByb3BlcnR5IHtSZXN0YXJ0Q29udHJhY3R9IHJlc3RhcnRDb250cmFjdFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRXhlY3V0ZUNvbnRyYWN0UmVzdWx0XG4gKiBAcHJvcGVydHkge29iamVjdH0gY3JlYXRvckZhY2V0XG4gKiBAcHJvcGVydHkge1Byb21pc2U8SW52aXRhdGlvbj59IGNyZWF0b3JJbnZpdGF0aW9uXG4gKiBAcHJvcGVydHkge29iamVjdH0gcHVibGljRmFjZXRcbiAqIEBwcm9wZXJ0eSB7SGFuZGxlT2ZmZXJPYmp9IGhhbmRsZU9mZmVyT2JqXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgU3RhcnRaY2ZcbiAqIEBwYXJhbSB7RVJlZjxab2VJbnN0YW5jZUFkbWluPn0gem9lSW5zdGFuY2VBZG1pblxuICogQHBhcmFtIHtJbnN0YW5jZVJlY29yZH0gaW5zdGFuY2VSZWNvcmRGcm9tWm9lXG4gKiBAcGFyYW0ge0lzc3VlclJlY29yZHN9IGlzc3VlclN0b3JhZ2VGcm9tWm9lXG4gKiBAcGFyYW0ge29iamVjdD19IHByaXZhdGVBcmdzXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxFeGVjdXRlQ29udHJhY3RSZXN1bHQ+fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFJlc3RhcnRDb250cmFjdFxuICogQHBhcmFtIHtvYmplY3Q9fSBwcml2YXRlQXJnc1xuICogQHJldHVybnMge1Byb21pc2U8RXhlY3V0ZVVwZ3JhZGVhYmxlQ29udHJhY3RSZXN1bHQ+fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIE1ha2VFeGl0T2JqXG4gKiBAcGFyYW0ge1Byb3Bvc2FsUmVjb3JkfSBwcm9wb3NhbFxuICogQHBhcmFtIHtaQ0ZTZWF0fSB6b2VTZWF0QWRtaW5cbiAqIEByZXR1cm5zIHtFeGl0T2JqfVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRXhpdE9ialxuICogQHByb3BlcnR5IHsoKSA9PiB2b2lkfSBleGl0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7SGFuZGxlPCdTZWF0Jz59IFNlYXRIYW5kbGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFJvb3RBbmRBZG1pbk5vZGVcbiAqIEBwcm9wZXJ0eSB7b2JqZWN0fSByb290XG4gKiBAcHJvcGVydHkge0FkbWluTm9kZX0gYWRtaW5Ob2RlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBBZG1pbk5vZGVcbiAqIEEgcG93ZXJmdWwgb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8gdGVybWluYXRlIHRoZSB2YXQgaW4gd2hpY2ggYSBjb250cmFjdFxuICogaXMgcnVubmluZywgdG8gZ2V0IHN0YXRpc3RpY3MsIG9yIHRvIGJlIG5vdGlmaWVkIHdoZW4gaXQgdGVybWluYXRlcy5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8Q29tcGxldGlvbj59IGRvbmVcbiAqIHJldHVybnMgYSBwcm9taXNlIHRoYXQgd2lsbCBiZSBmdWxmaWxsZWQgb3IgcmVqZWN0ZWQgd2hlbiB0aGUgY29udHJhY3QgaXNcbiAqIHRlcm1pbmF0ZWQuIElmIHRoZSBjb250cmFjdCB0ZXJtaW5hdGVzIHdpdGggYSBmYWlsdXJlLCB0aGUgcHJvbWlzZSB3aWxsIGJlXG4gKiByZWplY3RlZCB3aXRoIHRoZSByZWFzb24uIElmIHRoZSBjb250cmFjdCB0ZXJtaW5hdGVzIHN1Y2Nlc3NmdWxseSwgdGhlXG4gKiBwcm9taXNlIHdpbGwgZnVsZmlsbCB0byB0aGUgY29tcGxldGlvbiB2YWx1ZS5cbiAqIEBwcm9wZXJ0eSB7U2h1dGRvd25XaXRoRmFpbHVyZX0gdGVybWluYXRlV2l0aEZhaWx1cmVcbiAqIFRlcm1pbmF0ZSB0aGUgdmF0IGluIHdoaWNoIHRoZSBjb250cmFjdCBpcyBydW5uaW5nIGFzIGEgZmFpbHVyZS5cbiAqIEBwcm9wZXJ0eSB7KGJ1bmRsZUNhcDogQnVuZGxlQ2FwLCBvcHRpb25zPzogUmVjb3JkPHN0cmluZywgYW55PikgPT4gUHJvbWlzZTxSb290QW5kQWRtaW5Ob2RlPn0gdXBncmFkZVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEdldEFzc2V0S2luZEJ5QnJhbmRcbiAqIEdldCB0aGUgYXNzZXRLaW5kIGZvciBhIGJyYW5kIGtub3duIGJ5IFpvZVxuICpcbiAqIFRvIGJlIGRlbGV0ZWQgd2hlbiBicmFuZHMgaGF2ZSBhIHByb3BlcnR5IGZvciBhc3NldEtpbmRcbiAqXG4gKiBAcGFyYW0ge0JyYW5kfSBicmFuZFxuICogQHJldHVybnMge0Fzc2V0S2luZH1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtBcnJheTxJc3N1ZXJSZWNvcmQ+fSBJc3N1ZXJSZWNvcmRzXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgTWFrZVpDRlNlYXRcbiAqIEBwYXJhbSB7U2VhdERhdGF9IHNlYXREYXRhXG4gKiBAcmV0dXJucyB7WkNGU2VhdH1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBEcm9wQWxsUmVmZXJlbmNlc1xuICpcbiAqIERyb3BzIGFsbCBvZiB0aGUgcmVmZXJlbmNlcyBpbiB0aGUgc2VhdC1yZWxhdGVkIHdlYWtTdG9yZXMgYnlcbiAqIGRyb3BwaW5nIHRoZSBzdG9yZXNcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFJlYWxsb2NhdGVGb3JaQ0ZNaW50XG4gKiBAcGFyYW0ge1pDRlNlYXR9IHpjZlNlYXRcbiAqIEBwYXJhbSB7QWxsb2NhdGlvbn0gbmV3QWxsb2NhdGlvblxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cblxuLyoqXG4gKlxuICogQGNhbGxiYWNrIENyZWF0ZVNlYXRNYW5hZ2VyXG4gKlxuICogVGhlIFNlYXRNYW5hZ2VyIGhvbGRzIHRoZSBhY3RpdmUgemNmU2VhdHMgYW5kIGNhbiByZWFsbG9jYXRlIGFuZFxuICogbWFrZSBuZXcgemNmU2VhdHMuXG4gKlxuICogQHBhcmFtIHtFUmVmPFpvZUluc3RhbmNlQWRtaW4+fSB6b2VJbnN0YW5jZUFkbWluXG4gKiBAcGFyYW0ge0dldEFzc2V0S2luZEJ5QnJhbmR9IGdldEFzc2V0S2luZEJ5QnJhbmRcbiAqIEBwYXJhbSB7U2h1dGRvd25XaXRoRmFpbHVyZX0gc2h1dGRvd25XaXRoRmFpbHVyZVxuICogQHBhcmFtIHtYaW1wb3J0KCdAYWdvcmljL3ZhdC1kYXRhJykuQmFnZ2FnZX0gemNmQmFnZ2FnZVxuICogQHJldHVybnMge3sgbWFrZVpDRlNlYXQ6IE1ha2VaQ0ZTZWF0LFxuIHJlYWxsb2NhdGU6IFJlYWxsb2NhdGUsXG4gcmVhbGxvY2F0ZUZvclpDRk1pbnQ6IFJlYWxsb2NhdGVGb3JaQ0ZNaW50LFxuIGRyb3BBbGxSZWZlcmVuY2VzOiBEcm9wQWxsUmVmZXJlbmNlcyB9fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFkZElzc3VlclRvSW5zdGFuY2VSZWNvcmRcbiAqXG4gKiBBZGQgYW4gaXNzdWVyIGFuZCBpdHMga2V5d29yZCB0byB0aGUgaW5zdGFuY2VSZWNvcmQgZm9yIHRoZVxuICogY29udHJhY3QgaW5zdGFuY2VcbiAqXG4gKiBAcGFyYW0ge0tleXdvcmR9IGtleXdvcmRcbiAqIEBwYXJhbSB7SXNzdWVyUmVjb3JkfSBpc3N1ZXJSZWNvcmRcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEluc3RhbmNlUmVjb3JkTWFuYWdlckdldFRlcm1zXG4gKiBAcmV0dXJucyB7QW55VGVybXN9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgSW5zdGFuY2VSZWNvcmRNYW5hZ2VyR2V0SW5zdGFsbGF0aW9uRm9ySW5zdGFuY2VcbiAqIEByZXR1cm5zIHtJbnN0YWxsYXRpb259XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgSW5zdGFuY2VSZWNvcmRHZXRJc3N1ZXJzXG4gKiBAcmV0dXJucyB7SXNzdWVyS2V5d29yZFJlY29yZH1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBJbnN0YW5jZVJlY29yZEdldEJyYW5kc1xuICogQHJldHVybnMge0JyYW5kS2V5d29yZFJlY29yZH1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEluc3RhbmNlUmVjb3JkTWFuYWdlclxuICogQHByb3BlcnR5IHtBZGRJc3N1ZXJUb0luc3RhbmNlUmVjb3JkfSBhZGRJc3N1ZXJUb0luc3RhbmNlUmVjb3JkXG4gKiBAcHJvcGVydHkge0dldEluc3RhbmNlUmVjb3JkfSBnZXRJbnN0YW5jZVJlY29yZFxuICogQHByb3BlcnR5IHtJbnN0YW5jZVJlY29yZE1hbmFnZXJHZXRUZXJtc30gZ2V0VGVybXNcbiAqIEBwcm9wZXJ0eSB7SW5zdGFuY2VSZWNvcmRNYW5hZ2VyR2V0SW5zdGFsbGF0aW9uRm9ySW5zdGFuY2V9IGdldEluc3RhbGxhdGlvbkZvckluc3RhbmNlXG4gKiBAcHJvcGVydHkge0luc3RhbmNlUmVjb3JkR2V0SXNzdWVyc30gZ2V0SXNzdWVyc1xuICogQHByb3BlcnR5IHtJbnN0YW5jZVJlY29yZEdldEJyYW5kc30gZ2V0QnJhbmRzXG4gKiBAcHJvcGVydHkgeyhrZXl3b3JkOiBLZXl3b3JkKSA9PiB2b2lkfSBhc3NlcnRVbmlxdWVLZXl3b3JkXG4gKiBAcHJvcGVydHkgeyhzdGFydGluZ0luc3RhbmNlUmVjb3JkOiBJbnN0YW5jZVJlY29yZCkgPT4gdm9pZH0gaW5zdGFudGlhdGVcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBHZXRJbnN0YW5jZVJlY29yZFxuICogQHJldHVybnMge0luc3RhbmNlUmVjb3JkfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIElzc3VlclN0b3JhZ2VHZXRJc3N1ZXJSZWNvcmRzXG4gKiBAcGFyYW0ge0lzc3VlcltdfSBpc3N1ZXJzXG4gKiBAcmV0dXJucyB7SXNzdWVyUmVjb3Jkc31cbiAqL1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACVjilIEAgAABAIAAAlAAAAQGFnb3JpYy96b2UtdjAuMjUuNS9zcmMvbWFrZUhhbmRsZS5qc3siaW1wb3J0cyI6WyJAYWdvcmljL2Fzc2VydCIsIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL3ZhdC1kYXRhIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbImRlZmluZUR1cmFibGVIYW5kbGUiLCJtYWtlSGFuZGxlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydCxpbml0RW1wdHkscHJvdmlkZSxkZWZpbmVEdXJhYmxlS2luZCxtYWtlS2luZEhhbmRsZSxGYXI7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9hc3NlcnRcIiwgW1tcImFzc2VydFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0ID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcImluaXRFbXB0eVwiLCBbJGjigI1fYSA9PiAoaW5pdEVtcHR5ID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcInByb3ZpZGVcIiwgWyRo4oCNX2EgPT4gKHByb3ZpZGUgPSAkaOKAjV9hKV1dLFtcImRlZmluZUR1cmFibGVLaW5kXCIsIFskaOKAjV9hID0+IChkZWZpbmVEdXJhYmxlS2luZCA9ICRo4oCNX2EpXV0sW1wibWFrZUtpbmRIYW5kbGVcIiwgWyRo4oCNX2EgPT4gKG1ha2VLaW5kSGFuZGxlID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BhZ29yaWMvdmF0LWRhdGEnKS5CYWdnYWdlfSBCYWdnYWdlICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtzdHJpbmd9IEhcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtIfSBoYW5kbGVUeXBlXG4gKiBAcmV0dXJucyB7KCkgPT4gSGFuZGxlPEg+fVxuICovXG5jb25zdCAgICAgICAgZGVmaW5lRHVyYWJsZUhhbmRsZT0oYmFnZ2FnZSxoYW5kbGVUeXBlKT0+e1xuYXNzZXJ0LnR5cGVvZihoYW5kbGVUeXBlLCdzdHJpbmcnLCdoYW5kbGVUeXBlIG11c3QgYmUgYSBzdHJpbmcnKTtcbmNvbnN0IGR1cmFibGVIYW5kbGVLaW5kSGFuZGxlPXByb3ZpZGUoXG5iYWdnYWdlLFxuIGAke2hhbmRsZVR5cGV9S2luZEhhbmRsZWAsXG4oKT0+bWFrZUtpbmRIYW5kbGUoIGAke2hhbmRsZVR5cGV9SGFuZGxlYCkpO1xuXG5jb25zdCBtYWtlSGFuZGxlPWRlZmluZUR1cmFibGVLaW5kKGR1cmFibGVIYW5kbGVLaW5kSGFuZGxlLGluaXRFbXB0eSx7fSk7XG5yZXR1cm4gKC8qKiBAdHlwZSB7KCkgPT4gSGFuZGxlPEg+fSAqL21ha2VIYW5kbGUpO1xuIH07JGjigI1fb25jZS5kZWZpbmVEdXJhYmxlSGFuZGxlKGRlZmluZUR1cmFibGVIYW5kbGUpO1xuaGFyZGVuKGRlZmluZUR1cmFibGVIYW5kbGUpO1xuXG4vKipcbiAqIENyZWF0ZSBhbiBvcGFxdWUgaGFuZGxlIG9iamVjdC5cbiAqXG4gKiBAdGVtcGxhdGUge3N0cmluZ30gSFxuICogQHBhcmFtIHtIfSBoYW5kbGVUeXBlIHRoZSBzdHJpbmcgbGl0ZXJhbCB0eXBlIG9mIHRoZSBoYW5kbGVcbiAqIEByZXR1cm5zIHtIYW5kbGU8SD59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlSGFuZGxlPShoYW5kbGVUeXBlKT0+e1xuYXNzZXJ0LnR5cGVvZihoYW5kbGVUeXBlLCdzdHJpbmcnLCdoYW5kbGVUeXBlIG11c3QgYmUgYSBzdHJpbmcnKTtcbi8qIFJldHVybiB0aGUgaW50ZXJzZWN0aW9uIHR5cGUgKHJlYWxseSBqdXN0IGFuIGVtcHR5IG9iamVjdCkuKi9cbnJldHVybiAoLyoqIEB0eXBlIHtIYW5kbGU8SD59ICovRmFyKGAke2hhbmRsZVR5cGV9SGFuZGxlYCkpO1xuIH07JGjigI1fb25jZS5tYWtlSGFuZGxlKG1ha2VIYW5kbGUpO1xuaGFyZGVuKG1ha2VIYW5kbGUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZmluZUR1cmFibGVIYW5kbGUiOlsiZGVmaW5lRHVyYWJsZUhhbmRsZSJdLCJtYWtlSGFuZGxlIjpbIm1ha2VIYW5kbGUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAcok+9qgFAACoBQAALQAAAEBhZ29yaWMvem9lLXYwLjI1LjUvc3JjL29iakFycmF5Q29udmVyc2lvbi5qc3siaW1wb3J0cyI6WyJAYWdvcmljL2Fzc2VydCJdLCJleHBvcnRzIjpbImFycmF5VG9PYmoiLCJhc3NlcnRTdWJzZXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0LFgscTskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2Fzc2VydFwiLCBbW1wiYXNzZXJ0XCIsIFskaOKAjV9hID0+IChhc3NlcnQgPSAkaOKAjV9hKV1dLFtcImRldGFpbHNcIiwgWyRo4oCNX2EgPT4gKFggPSAkaOKAjV9hKV1dLFtcInFcIiwgWyRo4oCNX2EgPT4gKHEgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cbi8qKlxuICogQHR5cGVkZWYge2JpZ2ludHxib29sZWFufG51bGx8bnVtYmVyfHN0cmluZ3xzeW1ib2x8dW5kZWZpbmVkfSBQcmltaXRpdmVcbiAqIEB0eXBlZGVmIHtzdHJpbmd8bnVtYmVyfHN5bWJvbH0gUHJvcGVydHlOYW1lXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHRlbXBsYXRlIHtQcm9wZXJ0eU5hbWV9IFVcbiAqIEBwYXJhbSB7VFtdfSBhcnJheVxuICogQHBhcmFtIHtVW119IGtleXNcbiAqL1xuY29uc3QgICAgICAgIGFycmF5VG9PYmo9KGFycmF5LGtleXMpPT57XG5hcnJheS5sZW5ndGg9PT1rZXlzLmxlbmd0aHx8XG5hc3NlcnQuZmFpbChYIGBhcnJheSBhbmQga2V5cyBtdXN0IGJlIG9mIGVxdWFsIGxlbmd0aGApO1xuY29uc3Qgb2JqPVxuLyoqIEB0eXBlIHtSZWNvcmQ8VSwgVD59ICovXG57fTtcbmtleXMuZm9yRWFjaCgoa2V5LGkpPT5vYmpba2V5XT1hcnJheVtpXSk7XG5yZXR1cm4gaGFyZGVuKG9iaik7XG4gfTtcblxuLyoqXG4gKiBBc3NlcnQgYWxsIHZhbHVlcyBmcm9tIGBwYXJ0YCBhcHBlYXIgaW4gYHdob2xlYC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSB3aG9sZVxuICogQHBhcmFtIHtzdHJpbmdbXX0gcGFydFxuICovJGjigI1fb25jZS5hcnJheVRvT2JqKGFycmF5VG9PYmopO1xuY29uc3QgICAgICAgIGFzc2VydFN1YnNldD0od2hvbGUscGFydCk9PntcbnBhcnQuZm9yRWFjaCgoa2V5KT0+e1xuYXNzZXJ0LnR5cGVvZihrZXksJ3N0cmluZycpO1xud2hvbGUuaW5jbHVkZXMoa2V5KXx8XG5hc3NlcnQuZmFpbChcblggYGtleSAke3Eoa2V5KX0gd2FzIG5vdCBvbmUgb2YgdGhlIGV4cGVjdGVkIGtleXMgJHtxKHdob2xlKX1gKTtcblxuIH0pO1xuIH07JGjigI1fb25jZS5hc3NlcnRTdWJzZXQoYXNzZXJ0U3Vic2V0KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhcnJheVRvT2JqIjpbImFycmF5VG9PYmoiXSwiYXNzZXJ0U3Vic2V0IjpbImFzc2VydFN1YnNldCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADNeMS4xBEAAMQRAAAlAAAAQGFnb3JpYy96b2UtdjAuMjUuNS9zcmMvdHlwZUd1YXJkcy5qc3siaW1wb3J0cyI6WyJAYWdvcmljL2VydHAiLCJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy9zd2luZ3NldC12YXQvc3JjL3ZhdHMvdGltZXIvdHlwZUd1YXJkcy5qcyJdLCJleHBvcnRzIjpbIkFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSIsIkFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkU2hhcGUiLCJGdWxsUHJvcG9zYWxTaGFwZSIsIkluc3RhbGxhdGlvblNoYXBlIiwiSW5zdGFuY2VIYW5kbGVTaGFwZSIsIkludml0YXRpb25FbGVtZW50U2hhcGUiLCJJbnZpdGF0aW9uSGFuZGxlU2hhcGUiLCJJbnZpdGF0aW9uU2hhcGUiLCJPZmZlckhhbmRsZXJJIiwiUHJvcG9zYWxTaGFwZSIsIlNlYXRTaGFwZSIsIlRpbWVyU2hhcGUiLCJpc0FmdGVyRGVhZGxpbmVFeGl0UnVsZSIsImlzT25EZW1hbmRFeGl0UnVsZSIsImlzV2FpdmVkRXhpdFJ1bGUiLCJtYWtlSGFuZGxlU2hhcGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgQW1vdW50U2hhcGUsTSxUaW1lc3RhbXBWYWx1ZVNoYXBlOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvZXJ0cFwiLCBbW1wiQW1vdW50U2hhcGVcIiwgWyRo4oCNX2EgPT4gKEFtb3VudFNoYXBlID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIk1cIiwgWyRo4oCNX2EgPT4gKE0gPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zd2luZ3NldC12YXQvc3JjL3ZhdHMvdGltZXIvdHlwZUd1YXJkcy5qc1wiLCBbW1wiVGltZXN0YW1wVmFsdWVTaGFwZVwiLCBbJGjigI1fYSA9PiAoVGltZXN0YW1wVmFsdWVTaGFwZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cbmNvbnN0ICAgICAgICBJbnZpdGF0aW9uSGFuZGxlU2hhcGU9TS5yZW1vdGFibGUoJ0ludml0YXRpb25IYW5kbGUnKTskaOKAjV9vbmNlLkludml0YXRpb25IYW5kbGVTaGFwZShJbnZpdGF0aW9uSGFuZGxlU2hhcGUpO1xuY29uc3QgICAgICAgIEludml0YXRpb25TaGFwZT1NLnJlbW90YWJsZSgnSW52aXRhdGlvbicpOyRo4oCNX29uY2UuSW52aXRhdGlvblNoYXBlKEludml0YXRpb25TaGFwZSk7XG5jb25zdCAgICAgICAgSW5zdGFuY2VIYW5kbGVTaGFwZT1NLnJlbW90YWJsZSgnSW5zdGFuY2VIYW5kbGUnKTskaOKAjV9vbmNlLkluc3RhbmNlSGFuZGxlU2hhcGUoSW5zdGFuY2VIYW5kbGVTaGFwZSk7XG5jb25zdCAgICAgICAgSW5zdGFsbGF0aW9uU2hhcGU9TS5yZW1vdGFibGUoJ0luc3RhbGxhdGlvbicpOyRo4oCNX29uY2UuSW5zdGFsbGF0aW9uU2hhcGUoSW5zdGFsbGF0aW9uU2hhcGUpO1xuY29uc3QgICAgICAgIFNlYXRTaGFwZT1NLnJlbW90YWJsZSgnU2VhdCcpOyRo4oCNX29uY2UuU2VhdFNoYXBlKFNlYXRTaGFwZSk7XG5cbmNvbnN0ICAgICAgICBBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGU9TS5yZWNvcmRPZihNLnN0cmluZygpLEFtb3VudFNoYXBlKTskaOKAjV9vbmNlLkFtb3VudEtleXdvcmRSZWNvcmRTaGFwZShBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUpO1xuY29uc3QgICAgICAgIEFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkU2hhcGU9TS5yZWNvcmRPZihcbk0uc3RyaW5nKCksXG5NLnBhdHRlcm4oKSk7JGjigI1fb25jZS5BbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZFNoYXBlKEFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkU2hhcGUpO1xuXG5cbmNvbnN0ICAgICAgICBtYWtlSGFuZGxlU2hhcGU9KG5hbWUpPT5NLnJlbW90YWJsZSggYCR7bmFtZX1IYW5kbGVgKTskaOKAjV9vbmNlLm1ha2VIYW5kbGVTaGFwZShtYWtlSGFuZGxlU2hhcGUpO1xuY29uc3QgICAgICAgIFRpbWVyU2hhcGU9bWFrZUhhbmRsZVNoYXBlKCd0aW1lcicpO1xuXG4vKipcbiAqIEFmdGVyIGRlZmF1bHRzIGFyZSBmaWxsZWQgaW5cbiAqXG4gKiBAc2VlIHtQcm9wb3NhbFJlY29yZH0gdHlwZVxuICovJGjigI1fb25jZS5UaW1lclNoYXBlKFRpbWVyU2hhcGUpO1xuY29uc3QgICAgICAgIEZ1bGxQcm9wb3NhbFNoYXBlPWhhcmRlbih7XG53YW50OkFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkU2hhcGUsXG5naXZlOkFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSxcbi8qIFRvIGFjY2VwdCBvbmx5IG9uZSwgd2UgY291bGQgdXNlIE0ub3IgcmF0aGVyIHRoYW4gTS5wYXJ0aWFsLCovXG4vKiBidXQgdGhlIGVycm9yIG1lc3NhZ2VzIHdvdWxkIGhhdmUgYmVlbiB3b3JzZS4gUmF0aGVyLCovXG4vKiBjbGVhblByb3Bvc2FsJ3MgYXNzZXJ0RXhpdCBjaGVja3MgdGhhdCB0aGVyZSdzIGV4YWN0bHkgb25lLiovXG5leGl0Ok0ucGFydGlhbChcbntcbm9uRGVtYW5kOm51bGwsXG53YWl2ZWQ6bnVsbCxcbmFmdGVyRGVhZGxpbmU6e1xudGltZXI6TS5lcmVmKFRpbWVyU2hhcGUpLFxuZGVhZGxpbmU6VGltZXN0YW1wVmFsdWVTaGFwZX19LFxuXG5cbnt9KX0pO1xuXG5cbi8qKiBAc2VlIHtQcm9wb3NhbH0gdHlwZSAqLyRo4oCNX29uY2UuRnVsbFByb3Bvc2FsU2hhcGUoRnVsbFByb3Bvc2FsU2hhcGUpO1xuY29uc3QgICAgICAgIFByb3Bvc2FsU2hhcGU9TS5wYXJ0aWFsKEZ1bGxQcm9wb3NhbFNoYXBlKTskaOKAjV9vbmNlLlByb3Bvc2FsU2hhcGUoUHJvcG9zYWxTaGFwZSk7XG5cbmNvbnN0ICAgICAgICBpc09uRGVtYW5kRXhpdFJ1bGU9KGV4aXQpPT57XG5jb25zdFtleGl0S2V5XT1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhleGl0KTtcbnJldHVybiBleGl0S2V5PT09J29uRGVtYW5kJztcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7RXhpdFJ1bGV9IGV4aXRcbiAqIEByZXR1cm5zIHtleGl0IGlzIFdhaXZlZEV4aXRSdWxlfVxuICovJGjigI1fb25jZS5pc09uRGVtYW5kRXhpdFJ1bGUoaXNPbkRlbWFuZEV4aXRSdWxlKTtcbmNvbnN0ICAgICAgICBpc1dhaXZlZEV4aXRSdWxlPShleGl0KT0+e1xuY29uc3RbZXhpdEtleV09T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZXhpdCk7XG5yZXR1cm4gZXhpdEtleT09PSd3YWl2ZWQnO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtFeGl0UnVsZX0gZXhpdFxuICogQHJldHVybnMge2V4aXQgaXMgQWZ0ZXJEZWFkbGluZUV4aXRSdWxlfVxuICovJGjigI1fb25jZS5pc1dhaXZlZEV4aXRSdWxlKGlzV2FpdmVkRXhpdFJ1bGUpO1xuY29uc3QgICAgICAgIGlzQWZ0ZXJEZWFkbGluZUV4aXRSdWxlPShleGl0KT0+e1xuY29uc3RbZXhpdEtleV09T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZXhpdCk7XG5yZXR1cm4gZXhpdEtleT09PSdhZnRlckRlYWRsaW5lJztcbiB9OyRo4oCNX29uY2UuaXNBZnRlckRlYWRsaW5lRXhpdFJ1bGUoaXNBZnRlckRlYWRsaW5lRXhpdFJ1bGUpO1xuXG5jb25zdCAgICAgICAgSW52aXRhdGlvbkVsZW1lbnRTaGFwZT1NLnNwbGl0KHtcbmRlc2NyaXB0aW9uOk0uc3RyaW5nKCksXG5oYW5kbGU6SW52aXRhdGlvbkhhbmRsZVNoYXBlLFxuaW5zdGFuY2U6SW5zdGFuY2VIYW5kbGVTaGFwZSxcbmluc3RhbGxhdGlvbjpJbnN0YWxsYXRpb25TaGFwZX0pOyRo4oCNX29uY2UuSW52aXRhdGlvbkVsZW1lbnRTaGFwZShJbnZpdGF0aW9uRWxlbWVudFNoYXBlKTtcblxuXG5jb25zdCAgICAgICAgT2ZmZXJIYW5kbGVyST1NLmludGVyZmFjZSgnT2ZmZXJIYW5kbGVyJyx7XG5oYW5kbGU6TS5jYWxsKFNlYXRTaGFwZSkub3B0aW9uYWwoTS5hbnkoKSkucmV0dXJucyhNLnN0cmluZygpKX0pOyRo4oCNX29uY2UuT2ZmZXJIYW5kbGVySShPZmZlckhhbmRsZXJJKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJJbnZpdGF0aW9uSGFuZGxlU2hhcGUiOlsiSW52aXRhdGlvbkhhbmRsZVNoYXBlIl0sIkludml0YXRpb25TaGFwZSI6WyJJbnZpdGF0aW9uU2hhcGUiXSwiSW5zdGFuY2VIYW5kbGVTaGFwZSI6WyJJbnN0YW5jZUhhbmRsZVNoYXBlIl0sIkluc3RhbGxhdGlvblNoYXBlIjpbIkluc3RhbGxhdGlvblNoYXBlIl0sIlNlYXRTaGFwZSI6WyJTZWF0U2hhcGUiXSwiQW1vdW50S2V5d29yZFJlY29yZFNoYXBlIjpbIkFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSJdLCJBbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZFNoYXBlIjpbIkFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkU2hhcGUiXSwibWFrZUhhbmRsZVNoYXBlIjpbIm1ha2VIYW5kbGVTaGFwZSJdLCJUaW1lclNoYXBlIjpbIlRpbWVyU2hhcGUiXSwiRnVsbFByb3Bvc2FsU2hhcGUiOlsiRnVsbFByb3Bvc2FsU2hhcGUiXSwiUHJvcG9zYWxTaGFwZSI6WyJQcm9wb3NhbFNoYXBlIl0sImlzT25EZW1hbmRFeGl0UnVsZSI6WyJpc09uRGVtYW5kRXhpdFJ1bGUiXSwiaXNXYWl2ZWRFeGl0UnVsZSI6WyJpc1dhaXZlZEV4aXRSdWxlIl0sImlzQWZ0ZXJEZWFkbGluZUV4aXRSdWxlIjpbImlzQWZ0ZXJEZWFkbGluZUV4aXRSdWxlIl0sIkludml0YXRpb25FbGVtZW50U2hhcGUiOlsiSW52aXRhdGlvbkVsZW1lbnRTaGFwZSJdLCJPZmZlckhhbmRsZXJJIjpbIk9mZmVySGFuZGxlckkiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAhMgXjgQHAAAEBwAAIAAAAEBhZ29yaWMvem9lLXYwLjI1LjUvc3JjL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIi8+Ki9cblxuLyoqXG4gKiBAdGVtcGxhdGUge3N0cmluZ30gSCAtIHRoZSBuYW1lIG9mIHRoZSBoYW5kbGVcbiAqIEB0eXBlZGVmIHtIICYge319IEhhbmRsZSBBIHR5cGUgY29uc3RydWN0b3IgZm9yIGFuIG9wYXF1ZSB0eXBlXG4gKiBpZGVudGlmaWVkIGJ5IHRoZSBIIHN0cmluZy4gVGhpcyB1c2VzIGFuIGludGVyc2VjdGlvbiB0eXBlXG4gKiAoJ015SGFuZGxlJyAmIHt9KSB0byB0YWcgdGhlIGhhbmRsZSdzIHR5cGUgZXZlbiB0aG91Z2ggdGhlIGFjdHVhbFxuICogdmFsdWUgaXMganVzdCBhbiBlbXB0eSBvYmplY3QuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7c3RyaW5nfSBLZXl3b3JkXG4gKiBAdHlwZWRlZiB7SGFuZGxlPCdJbnZpdGF0aW9uJz59IEludml0YXRpb25IYW5kbGUgLSBhbiBvcGFxdWUgaGFuZGxlIGZvciBhbiBpbnZpdGF0aW9uXG4gKiBAdHlwZWRlZiB7UmVjb3JkPEtleXdvcmQsSXNzdWVyPn0gSXNzdWVyS2V5d29yZFJlY29yZFxuICogQHR5cGVkZWYge1JlY29yZDxLZXl3b3JkLEVSZWY8SXNzdWVyPj59IElzc3VlclBLZXl3b3JkUmVjb3JkXG4gKiBAdHlwZWRlZiB7UmVjb3JkPEtleXdvcmQsQnJhbmQ+fSBCcmFuZEtleXdvcmRSZWNvcmRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN0YW5kYXJkVGVybXNcbiAqIEBwcm9wZXJ0eSB7SXNzdWVyS2V5d29yZFJlY29yZH0gaXNzdWVycyAtIHJlY29yZCB3aXRoXG4gKiBrZXl3b3JkcyBrZXlzLCBpc3N1ZXIgdmFsdWVzXG4gKiBAcHJvcGVydHkge0JyYW5kS2V5d29yZFJlY29yZH0gYnJhbmRzIC0gcmVjb3JkIHdpdGgga2V5d29yZHNcbiAqIGtleXMsIGJyYW5kIHZhbHVlc1xuICpcbiAqIEB0eXBlZGVmIHtTdGFuZGFyZFRlcm1zICYgUmVjb3JkPHN0cmluZywgYW55Pn0gQW55VGVybXNcbiAqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBJbnN0YW5jZVJlY29yZFxuICogQHByb3BlcnR5IHtJbnN0YWxsYXRpb259IGluc3RhbGxhdGlvblxuICogQHByb3BlcnR5IHtJbnN0YW5jZX0gaW5zdGFuY2VcbiAqIEBwcm9wZXJ0eSB7QW55VGVybXN9IHRlcm1zIC0gY29udHJhY3QgcGFyYW1ldGVyc1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IElzc3VlclJlY29yZFxuICogQHByb3BlcnR5IHtCcmFuZDxLPn0gYnJhbmRcbiAqIEBwcm9wZXJ0eSB7SXNzdWVyPEs+fSBpc3N1ZXJcbiAqIEBwcm9wZXJ0eSB7S30gYXNzZXRLaW5kXG4gKiBAcHJvcGVydHkge2FueX0gW2Rpc3BsYXlJbmZvXVxuICpcbiAqIEB0eXBlZGVmIHtBbW91bnRLZXl3b3JkUmVjb3JkfSBBbGxvY2F0aW9uXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge29iamVjdH0gW1I9dW5rbm93bl0gT2ZmZXIgcmVzdWx0XG4gKiBAdGVtcGxhdGUge29iamVjdH0gW0E9bmV2ZXJdIE9mZmVyIGFyZ3NcbiAqIEB0eXBlZGVmIHtQYXltZW50PCdzZXQnPn0gSW52aXRhdGlvblxuICovXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAFnLWrERLQAAES0AACsAAABAYWdvcmljL3pvZS12MC4yNS41L3NyYy96b2VTZXJ2aWNlL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIi8+Ki9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBab2VTZXJ2aWNlXG4gKlxuICogWm9lIHByb3ZpZGVzIGEgZnJhbWV3b3JrIGZvciBkZXBsb3lpbmcgYW5kIHdvcmtpbmcgd2l0aCBzbWFydFxuICogY29udHJhY3RzLiBJdCBpcyBhY2Nlc3NlZCBhcyBhIGxvbmctbGl2ZWQgYW5kIHdlbGwtdHJ1c3RlZCBzZXJ2aWNlXG4gKiB0aGF0IGVuZm9yY2VzIG9mZmVyIHNhZmV0eSBmb3IgdGhlIGNvbnRyYWN0cyB0aGF0IHVzZSBpdC4gWm9lIGhhcyBhXG4gKiBzaW5nbGUgYGludml0YXRpb25Jc3N1ZXJgIGZvciB0aGUgZW50aXJldHkgb2YgaXRzIGxpZmV0aW1lLiBCeVxuICogaGF2aW5nIGEgcmVmZXJlbmNlIHRvIFpvZSwgYSB1c2VyIGNhbiBnZXQgdGhlIGBpbnZpdGF0aW9uSXNzdWVyYFxuICogYW5kIHRodXMgdmFsaWRhdGUgYW55IGBpbnZpdGF0aW9uYCB0aGV5IHJlY2VpdmUgZnJvbSBzb21lb25lIGVsc2UuXG4gKlxuICogWm9lIGhhcyB0d28gZGlmZmVyZW50IGZhY2V0czogdGhlIHB1YmxpYyBab2Ugc2VydmljZSBhbmQgdGhlXG4gKiBjb250cmFjdCBmYWNldCAoWkNGKS4gRWFjaCBjb250cmFjdCBpbnN0YW5jZSBoYXMgYSBjb3B5IG9mIFpDRlxuICogd2l0aGluIGl0cyB2YXQuIFRoZSBjb250cmFjdCBhbmQgWkNGIG5ldmVyIGhhdmUgZGlyZWN0IGFjY2VzcyB0b1xuICogdGhlIHVzZXJzJyBwYXltZW50cyBvciB0aGUgWm9lIHB1cnNlcy5cbiAqXG4gKiBAcHJvcGVydHkge0dldEludml0YXRpb25Jc3N1ZXJ9IGdldEludml0YXRpb25Jc3N1ZXJcbiAqXG4gKiBab2UgaGFzIGEgc2luZ2xlIGBpbnZpdGF0aW9uSXNzdWVyYCBmb3IgdGhlIGVudGlyZXR5IG9mIGl0c1xuICogbGlmZXRpbWUuIEJ5IGhhdmluZyBhIHJlZmVyZW5jZSB0byBab2UsIGEgdXNlciBjYW4gZ2V0IHRoZVxuICogYGludml0YXRpb25Jc3N1ZXJgIGFuZCB0aHVzIHZhbGlkYXRlIGFueSBgaW52aXRhdGlvbmAgdGhleSByZWNlaXZlXG4gKiBmcm9tIHNvbWVvbmUgZWxzZS4gVGhlIG1pbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBpbnZpdGF0aW9uSXNzdWVyXG4gKiBjcmVhdGVzIHRoZSBFUlRQIHBheW1lbnRzIHRoYXQgcmVwcmVzZW50IHRoZSByaWdodCB0byBpbnRlcmFjdCB3aXRoXG4gKiBhIHNtYXJ0IGNvbnRyYWN0IGluIHBhcnRpY3VsYXIgd2F5cy5cbiAqXG4gKiBAcHJvcGVydHkge0luc3RhbGxCdW5kbGV9IGluc3RhbGxcbiAqIEBwcm9wZXJ0eSB7SW5zdGFsbEJ1bmRsZUlEfSBpbnN0YWxsQnVuZGxlSURcbiAqIEBwcm9wZXJ0eSB7WGltcG9ydCgnLi91dGlscycpLlN0YXJ0SW5zdGFuY2V9IHN0YXJ0SW5zdGFuY2VcbiAqIEBwcm9wZXJ0eSB7T2ZmZXJ9IG9mZmVyXG4gKiBAcHJvcGVydHkge0dldFB1YmxpY0ZhY2V0fSBnZXRQdWJsaWNGYWNldFxuICogQHByb3BlcnR5IHtHZXRJc3N1ZXJzfSBnZXRJc3N1ZXJzXG4gKiBAcHJvcGVydHkge0dldEJyYW5kc30gZ2V0QnJhbmRzXG4gKiBAcHJvcGVydHkge0dldFRlcm1zfSBnZXRUZXJtc1xuICogQHByb3BlcnR5IHtHZXRPZmZlckZpbHRlcn0gZ2V0T2ZmZXJGaWx0ZXJcbiAqIEBwcm9wZXJ0eSB7R2V0SW5zdGFsbGF0aW9uRm9ySW5zdGFuY2V9IGdldEluc3RhbGxhdGlvbkZvckluc3RhbmNlXG4gKiBAcHJvcGVydHkge0dldEluc3RhbmNlfSBnZXRJbnN0YW5jZVxuICogQHByb3BlcnR5IHtHZXRJbnN0YWxsYXRpb259IGdldEluc3RhbGxhdGlvblxuICogQHByb3BlcnR5IHtHZXRJbnZpdGF0aW9uRGV0YWlsc30gZ2V0SW52aXRhdGlvbkRldGFpbHNcbiAqIFJldHVybiBhbiBvYmplY3Qgd2l0aCB0aGUgaW5zdGFuY2UsIGluc3RhbGxhdGlvbiwgZGVzY3JpcHRpb24sIGludml0YXRpb25cbiAqIGhhbmRsZSwgYW5kIGFueSBjdXN0b20gcHJvcGVydGllcyBzcGVjaWZpYyB0byB0aGUgY29udHJhY3QuXG4gKiBAcHJvcGVydHkge0dldEZlZUlzc3Vlcn0gZ2V0RmVlSXNzdWVyXG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8UHVyc2U+fSBtYWtlRmVlUHVyc2VcbiAqIERlcHJlY2F0ZWQuIERvZXMgbm90aGluZyB1c2VmdWwgYnV0IHByb3ZpZGVkIGR1cmluZyB0cmFuc2l0aW9uIHNvIGxlc3Mgb2xkXG4gKiBjb2RlIGJyZWFrcy5cbiAqIEBwcm9wZXJ0eSB7KGRlZmF1bHRGZWVQdXJzZTogRVJlZjxQdXJzZT4pID0+IFpvZVNlcnZpY2V9IGJpbmREZWZhdWx0RmVlUHVyc2VcbiAqIERlcHJlY2F0ZWQuIERvZXMgbm90aGluZyB1c2VmdWwgYnV0IHByb3ZpZGVkIGR1cmluZyB0cmFuc2l0aW9uIHNvIGxlc3Mgb2xkXG4gKiBjb2RlIGJyZWFrcy5cbiAqIEBwcm9wZXJ0eSB7R2V0Q29uZmlndXJhdGlvbn0gZ2V0Q29uZmlndXJhdGlvblxuICogQHByb3BlcnR5IHtHZXRCdW5kbGVJREZyb21JbnN0YWxsYXRpb259IGdldEJ1bmRsZUlERnJvbUluc3RhbGxhdGlvblxuICogQHByb3BlcnR5IHsoaW52aXRhdGlvbkhhbmRsZTogSW52aXRhdGlvbkhhbmRsZSkgPT4gUGF0dGVybiB8IHVuZGVmaW5lZH0gZ2V0UHJvcG9zYWxTaGFwZUZvckludml0YXRpb25cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBHZXRJbnZpdGF0aW9uSXNzdWVyXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxJc3N1ZXI+fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEdldEZlZUlzc3VlclxuICogQHJldHVybnMge1Byb21pc2U8SXNzdWVyPn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBHZXRDb25maWd1cmF0aW9uXG4gKiBAcmV0dXJucyB7e1xuICogICBmZWVJc3N1ZXJDb25maWc6IEZlZUlzc3VlckNvbmZpZyxcbiAqIH19XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgR2V0UHVibGljRmFjZXRcbiAqIEBwYXJhbSB7RVJlZjxJbnN0YW5jZT59IGluc3RhbmNlUFxuICogQHJldHVybnMge1Byb21pc2U8b2JqZWN0Pn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBHZXRJc3N1ZXJzXG4gKiBAcGFyYW0ge0luc3RhbmNlfSBpbnN0YW5jZVxuICogQHJldHVybnMge1Byb21pc2U8SXNzdWVyS2V5d29yZFJlY29yZD59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgR2V0QnJhbmRzXG4gKiBAcGFyYW0ge0luc3RhbmNlfSBpbnN0YW5jZVxuICogQHJldHVybnMge1Byb21pc2U8QnJhbmRLZXl3b3JkUmVjb3JkPn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBHZXRUZXJtc1xuICogQHBhcmFtIHtJbnN0YW5jZX0gaW5zdGFuY2VcbiAqIEByZXR1cm5zIHtQcm9taXNlPEFueVRlcm1zPn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBHZXRPZmZlckZpbHRlclxuICogQHBhcmFtIHtJbnN0YW5jZX0gaW5zdGFuY2VcbiAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBHZXRJbnN0YWxsYXRpb25Gb3JJbnN0YW5jZVxuICogQHBhcmFtIHtJbnN0YW5jZX0gaW5zdGFuY2VcbiAqIEByZXR1cm5zIHtQcm9taXNlPEluc3RhbGxhdGlvbj59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgR2V0SW5zdGFuY2VcbiAqIEBwYXJhbSB7RVJlZjxJbnZpdGF0aW9uPn0gaW52aXRhdGlvblxuICogQHJldHVybnMge1Byb21pc2U8SW5zdGFuY2U+fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEdldEluc3RhbGxhdGlvblxuICogQHBhcmFtIHtFUmVmPEludml0YXRpb24+fSBpbnZpdGF0aW9uXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxJbnN0YWxsYXRpb24+fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEdldEludml0YXRpb25EZXRhaWxzXG4gKiBAcGFyYW0ge0VSZWY8SW52aXRhdGlvbj59IGludml0YXRpb25cbiAqIEByZXR1cm5zIHtQcm9taXNlPEludml0YXRpb25EZXRhaWxzPn1cbiAqL1xuXG4vKiBUT0RPIHJlbW92ZSBzdXBwb3J0IGZvciBzb3VyY2UgYnVuZGxlcywgbGVhdmluZyBvbmx5IHN1cHBvcnQgZm9yIGhhc2ggYnVuZGxlcy4qL1xuLyogaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80NTY1Ki9cbi8qKlxuICogQGNhbGxiYWNrIEluc3RhbGxCdW5kbGVcbiAqXG4gKiBDcmVhdGUgYW4gaW5zdGFsbGF0aW9uIGJ5IHNhZmVseSBldmFsdWF0aW5nIHRoZSBjb2RlIGFuZFxuICogcmVnaXN0ZXJpbmcgaXQgd2l0aCBab2UuIFJldHVybnMgYW4gaW5zdGFsbGF0aW9uLlxuICpcbiAqIEBwYXJhbSB7QnVuZGxlIHwgU291cmNlQnVuZGxlfSBidW5kbGVcbiAqIEByZXR1cm5zIHtQcm9taXNlPEluc3RhbGxhdGlvbj59XG4gKi9cblxuLyogVE9ETyBjb25zb2xpZGF0ZSBpbnN0YWxsQnVuZGxlSUQgaW50byBpbnN0YWxsLiovXG4vKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQ5NzQqL1xuLyoqXG4gKiBAY2FsbGJhY2sgSW5zdGFsbEJ1bmRsZUlEXG4gKlxuICogQ3JlYXRlIGFuIGluc3RhbGxhdGlvbiBmcm9tIGEgQnVuZGxlIElELiBSZXR1cm5zIGFuIGluc3RhbGxhdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0J1bmRsZUlEfSBidW5kbGVJRFxuICogQHJldHVybnMge1Byb21pc2U8SW5zdGFsbGF0aW9uPn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBHZXRCdW5kbGVJREZyb21JbnN0YWxsYXRpb25cbiAqXG4gKiBWZXJpZnkgdGhhdCBhbiBhbGxlZ2VkIEludml0YXRpb24gaXMgcmVhbCwgYW5kIHJldHVybiB0aGUgQnVuZGxlIElEIGl0XG4gKiB3aWxsIHVzZSBmb3IgY29udHJhY3QgY29kZS5cbiAqXG4gKiBAcGFyYW0ge0VSZWY8SW5zdGFsbGF0aW9uPn0gYWxsZWdlZEluc3RhbGxhdGlvblxuICogQHJldHVybnMge1Byb21pc2U8QnVuZGxlSUQ+fVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgezxBcmdzLCBSZXN1bHQ+KFxuICogICBpbnZpdGF0aW9uOiBFUmVmPEludml0YXRpb248UmVzdWx0LCBBcmdzPj4sXG4gKiAgIHByb3Bvc2FsPzogUHJvcG9zYWwsXG4gKiAgIHBheW1lbnRLZXl3b3JkUmVjb3JkPzogUGF5bWVudFBLZXl3b3JkUmVjb3JkLFxuICogICBvZmZlckFyZ3M/OiBBcmdzLFxuICogICApID0+IFByb21pc2U8VXNlclNlYXQ8UmVzdWx0Pj5cbiAqIH0gT2ZmZXJcbiAqXG4gKiBUbyByZWRlZW0gYW4gaW52aXRhdGlvbiwgdGhlIHVzZXIgbm9ybWFsbHkgcHJvdmlkZXMgYSBwcm9wb3NhbCAodGhlaXJcbiAqIHJ1bGVzIGZvciB0aGUgb2ZmZXIpIGFzIHdlbGwgYXMgcGF5bWVudHMgdG8gYmUgZXNjcm93ZWQgYnkgWm9lLiAgSWZcbiAqIGVpdGhlciB0aGUgcHJvcG9zYWwgb3IgcGF5bWVudHMgd291bGQgYmUgZW1wdHksIGluZGljYXRlIHRoaXMgYnlcbiAqIG9taXR0aW5nIHRoYXQgYXJndW1lbnQgb3IgcGFzc2luZyB1bmRlZmluZWQsIHJhdGhlciB0aGFuIHBhc3NpbmcgYW5cbiAqIGVtcHR5IHJlY29yZC5cbiAqXG4gKiBUaGUgcHJvcG9zYWwgaGFzIHRocmVlIHBhcnRzOiBgd2FudGAgYW5kIGBnaXZlYCBhcmUgdXNlZCBieSBab2UgdG9cbiAqIGVuZm9yY2Ugb2ZmZXIgc2FmZXR5LCBhbmQgYGV4aXRgIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgcGFydGljdWxhclxuICogcGF5b3V0LWxpdmVuZXNzIHBvbGljeSB0aGF0IFpvZSBjYW4gZ3VhcmFudGVlLiBgd2FudGAgYW5kIGBnaXZlYFxuICogYXJlIG9iamVjdHMgd2l0aCBrZXl3b3JkcyBhcyBrZXlzIGFuZCBhbW91bnRzIGFzIHZhbHVlcy5cbiAqIGBwYXltZW50S2V5d29yZFJlY29yZGAgaXMgYSByZWNvcmQgd2l0aCBrZXl3b3JkcyBhcyBrZXlzLCBhbmQgdGhlXG4gKiB2YWx1ZXMgYXJlIHRoZSBhY3R1YWwgcGF5bWVudHMgdG8gYmUgZXNjcm93ZWQuIEEgcGF5bWVudCBpc1xuICogZXhwZWN0ZWQgZm9yIGV2ZXJ5IHJ1bGUgdW5kZXIgYGdpdmVgLlxuICovXG5cbi8qKlxuICogWm9lIHVzZXMgc2VhdHMgdG8gYWNjZXNzIG9yIG1hbmlwdWxhdGUgb2ZmZXJzLiBUaGV5IGxldCBjb250cmFjdHMgYW5kIHVzZXJzXG4gKiBpbnRlcmFjdCB3aXRoIHRoZW0uIFpvZSBoYXMgdHdvIGtpbmRzIG9mIHNlYXRzLiBaQ0ZTZWF0cyBhcmUgdXNlZCB3aXRoaW5cbiAqIGNvbnRyYWN0cyBhbmQgd2l0aCB6Y2YgbWV0aG9kcy4gVXNlclNlYXRzIHJlcHJlc2VudCBvZmZlcnMgZXh0ZXJuYWwgdG8gWm9lXG4gKiBhbmQgdGhlIGNvbnRyYWN0LiBUaGUgcGFydHkgd2hvIGV4ZXJjaXNlcyBhbiBpbnZpdGF0aW9uIGFuZCBzZW5kcyB0aGUgb2ZmZXIoKVxuICogbWVzc2FnZSB0byBab2UgZ2V0cyBhIFVzZXJTZWF0IHRoYXQgY2FuIGNoZWNrIHBheW91dHMnIHN0YXR1cyBvciByZXRyaWV2ZSB0aGVcbiAqIHJlc3VsdCBvZiBwcm9jZXNzaW5nIHRoZSBvZmZlciBpbiB0aGUgY29udHJhY3QuIFRoaXMgdmFyaWVzLCBidXQgZXhhbXBsZXMgYXJlXG4gKiBhIHN0cmluZyBhbmQgYW4gaW52aXRhdGlvbiBmb3IgYW5vdGhlciBzZWF0LlxuICpcbiAqIEFsc28sIGEgVXNlclNlYXQgY2FuIGJlIGhhbmRlZCB0byBhbiBhZ2VudCBvdXRzaWRlIFpvZSBhbmQgdGhlIGNvbnRyYWN0LFxuICogbGV0dGluZyB0aGVtIHF1ZXJ5IG9yIG1vbml0b3IgdGhlIGN1cnJlbnQgc3RhdGUsIGFjY2VzcyB0aGUgcGF5b3V0cyBhbmRcbiAqIHJlc3VsdCwgYW5kLCBpZiBpdCdzIGFsbG93ZWQgZm9yIHRoaXMgc2VhdCwgY2FsbCB0cnlFeGl0KCkuXG4gKlxuICogU2luY2UgYW55b25lIGNhbiBhdHRlbXB0IHRvIGV4aXQgdGhlIHNlYXQgaWYgdGhleSBoYXZlIGEgcmVmZXJlbmNlIHRvIGl0LCB5b3VcbiAqIHNob3VsZCBvbmx5IHNoYXJlIGEgVXNlclNlYXQgd2l0aCB0cnVzdGVkIHBhcnRpZXMuXG4gKlxuICogVXNlclNlYXQgaW5jbHVkZXMgcXVlcmllcyBmb3IgdGhlIGFzc29jaWF0ZWQgb2ZmZXIncyBjdXJyZW50IHN0YXRlIGFuZCBhblxuICogb3BlcmF0aW9uIHRvIHJlcXVlc3QgdGhhdCB0aGUgb2ZmZXIgZXhpdCwgYXMgZm9sbG93czpcbiAqXG4gKiBAc2VlIHtAbGluayBodHRwczovL2RvY3MuYWdvcmljLmNvbS96b2UvYXBpL3pvZS5odG1sI3VzZXJzZWF0LW9iamVjdH19XG4gKiBAdGVtcGxhdGUge29iamVjdH0gW09SPXVua25vd25dXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBVc2VyU2VhdFxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPFByb3Bvc2FsUmVjb3JkPn0gZ2V0UHJvcG9zYWxcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxQYXltZW50UEtleXdvcmRSZWNvcmQ+fSBnZXRQYXlvdXRzXG4gKiBAcHJvcGVydHkgeyhrZXl3b3JkOiBLZXl3b3JkKSA9PiBQcm9taXNlPFBheW1lbnQ+fSBnZXRQYXlvdXRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxPUj59IGdldE9mZmVyUmVzdWx0XG4gKiBAcHJvcGVydHkgeygpID0+IHZvaWR9IFt0cnlFeGl0XVxuICogTm90ZTogT25seSB3b3JrcyBpZiB0aGUgc2VhdCdzIGBwcm9wb3NhbGAgaGFzIGFuIGBPbkRlbWFuZGAgYGV4aXRgIGNsYXVzZS4gWm9lJ3NcbiAqIG9mZmVyLXNhZmV0eSBndWFyYW50ZWUgYXBwbGllcyBubyBtYXR0ZXIgaG93IGEgc2VhdCdzIGludGVyYWN0aW9uIHdpdGggYVxuICogY29udHJhY3QgZW5kcy4gVW5kZXIgbm9ybWFsIGNpcmN1bXN0YW5jZXMsIHRoZSBwYXJ0aWNpcGFudCBtaWdodCBiZSBhYmxlIHRvXG4gKiBjYWxsIGB0cnlFeGl0KClgLCBvciB0aGUgY29udHJhY3QgbWlnaHQgZG8gc29tZXRoaW5nIGV4cGxpY2l0bHkuIE9uIGV4aXRpbmcsXG4gKiB0aGUgc2VhdCBob2xkZXIgZ2V0cyBpdHMgY3VycmVudCBgYWxsb2NhdGlvbmAgYW5kIHRoZSBgc2VhdGAgY2FuIG5vIGxvbmdlclxuICogaW50ZXJhY3Qgd2l0aCB0aGUgY29udHJhY3QuXG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8Ym9vbGVhbj59IGhhc0V4aXRlZFxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBzZWF0IGhhcyBleGl0ZWQsIGZhbHNlIGlmIGl0IGlzIHN0aWxsIGFjdGl2ZS5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTwwfDE+fSBudW1XYW50c1NhdGlzZmllZFxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxBbGxvY2F0aW9uPn0gZ2V0Q3VycmVudEFsbG9jYXRpb25KaWdcbiAqIExhYmVsbGVkIFwiSmlnXCIgYmVjYXVzZSBpdCAqc2hvdWxkKiBvbmx5IGJlIHVzZWQgZm9yIHRlc3RzLCB0aG91Z2hcbiAqIG5vdGhpbmcgcHJldmVudHMgaXQgZnJvbSBiZWluZyB1c2VkIG90aGVyd2lzZS5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxOb3RpZmllcjxBbGxvY2F0aW9uPj59IGdldEFsbG9jYXRpb25Ob3RpZmllckppZ1xuICogTGFiZWxsZWQgXCJKaWdcIiBiZWNhdXNlIGl0ICpzaG91bGQqIG9ubHkgYmUgdXNlZCBmb3IgdGVzdHMsIHRob3VnaFxuICogbm90aGluZyBwcmV2ZW50cyBpdCBmcm9tIGJlaW5nIHVzZWQgb3RoZXJ3aXNlLlxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPEFsbG9jYXRpb24+fSBnZXRGaW5hbEFsbG9jYXRpb25cbiAqIHJldHVybiBhIHByb21pc2UgZm9yIHRoZSBmaW5hbCBhbGxvY2F0aW9uLiBJZiBjYWxsZWQgYWZ0ZXIgdGhlIHNlYXQgaGFzXG4gKiBleGl0ZWQsIGl0IHdpbGwgcHJvbXB0bHkgcmVzb2x2ZSB0byBhbiBBbGxvY2F0aW9uLlxuICovXG5cbi8qKlxuICpcbiAqIEB0eXBlZGVmIHtQYXJ0aWFsPFByb3Bvc2FsUmVjb3JkPn0gUHJvcG9zYWxcbiAqXG4gKiBAdHlwZWRlZiB7e2dpdmU6IEFtb3VudEtleXdvcmRSZWNvcmQsXG4gKiAgICAgICAgICAgIHdhbnQ6IEFtb3VudEtleXdvcmRSZWNvcmQsXG4gKiAgICAgICAgICAgIGV4aXQ6IEV4aXRSdWxlXG4gKiAgICAgICAgICAgfX0gUHJvcG9zYWxSZWNvcmRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8S2V5d29yZCxBbW91bnQ+fSBBbW91bnRLZXl3b3JkUmVjb3JkXG4gKlxuICogVGhlIGtleXMgYXJlIGtleXdvcmRzLCBhbmQgdGhlIHZhbHVlcyBhcmUgYW1vdW50cy4gRm9yIGV4YW1wbGU6XG4gKiB7IEFzc2V0OiBBbW91bnRNYXRoLm1ha2UoYXNzZXRCcmFuZCwgNW4pLCBQcmljZTpcbiAqIEFtb3VudE1hdGgubWFrZShwcmljZUJyYW5kLCA5bikgfVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gV2FrZXJcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gdm9pZH0gd2FrZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1RpbWVzdGFtcH0gRGVhZGxpbmVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFRpbWVyXG4gKiBAcHJvcGVydHkgeyhkZWFkbGluZTogRGVhZGxpbmUsIHdha2VyUDogRVJlZjxXYWtlcj4pID0+IHZvaWR9IHNldFdha2V1cFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gT25EZW1hbmRFeGl0UnVsZVxuICogQHByb3BlcnR5IHtudWxsfSBvbkRlbWFuZFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gV2FpdmVkRXhpdFJ1bGVcbiAqIEBwcm9wZXJ0eSB7bnVsbH0gd2FpdmVkXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBBZnRlckRlYWRsaW5lRXhpdFJ1bGVcbiAqIEBwcm9wZXJ0eSB7e3RpbWVyOlRpbWVyLCBkZWFkbGluZTpEZWFkbGluZX19IGFmdGVyRGVhZGxpbmVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPbkRlbWFuZEV4aXRSdWxlIHwgV2FpdmVkRXhpdFJ1bGUgfCBBZnRlckRlYWRsaW5lRXhpdFJ1bGV9IEV4aXRSdWxlXG4gKlxuICogVGhlIHBvc3NpYmxlIGtleXMgYXJlICd3YWl2ZWQnLCAnb25EZW1hbmQnLCBhbmQgJ2FmdGVyRGVhZGxpbmUnLlxuICogYHRpbWVyYCBhbmQgYGRlYWRsaW5lYCBvbmx5IGFyZSB1c2VkIGZvciB0aGUgYGFmdGVyRGVhZGxpbmVgIGtleS5cbiAqIFRoZSBwb3NzaWJsZSByZWNvcmRzIGFyZTpcbiAqIGB7IHdhaXZlZDogbnVsbCB9YFxuICogYHsgb25EZW1hbmQ6IG51bGwgfWBcbiAqIGB7IGFmdGVyRGVhZGxpbmU6IHsgdGltZXIgOlRpbWVyPERlYWRsaW5lPiwgZGVhZGxpbmUgOkRlYWRsaW5lIH0gfVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge0hhbmRsZTwnSW5zdGFuY2UnPn0gSW5zdGFuY2VcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFZhdEFkbWluU3ZjXG4gKiBAcHJvcGVydHkgeyhpZDogQnVuZGxlSUQpID0+IEVSZWY8QnVuZGxlQ2FwPn0gd2FpdEZvckJ1bmRsZUNhcFxuICogQHByb3BlcnR5IHsoaWQ6IEJ1bmRsZUlEKSA9PiBFUmVmPEJ1bmRsZUNhcD59IGdldEJ1bmRsZUNhcFxuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nKSA9PiBFUmVmPEJ1bmRsZUNhcD59IGdldE5hbWVkQnVuZGxlQ2FwXG4gKiBAcHJvcGVydHkgeyhidW5kbGVDYXA6IEJ1bmRsZUNhcCwgb3B0aW9ucz86IFJlY29yZDxzdHJpbmcsIGFueT4pID0+IEVSZWY8Um9vdEFuZEFkbWluTm9kZT59IGNyZWF0ZVZhdFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge3tidW5kbGVDYXA6IEJ1bmRsZUNhcCB9IHwge25hbWU6IHN0cmluZ30gfCB7aWQ6IEJ1bmRsZUlEfX0gWkNGU3BlY1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1JlY29yZDxzdHJpbmcsIGFueT59IFNvdXJjZUJ1bmRsZVxuICogT3BhcXVlIHR5cGUgZm9yIGEgSlNPTmFibGUgc291cmNlIGJ1bmRsZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1JlY29yZDxLZXl3b3JkLEVSZWY8UGF5bWVudD4+fSBQYXltZW50UEtleXdvcmRSZWNvcmRcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8S2V5d29yZCxQYXltZW50Pn0gUGF5bWVudEtleXdvcmRSZWNvcmRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN0YW5kYXJkSW52aXRhdGlvbkRldGFpbHNcbiAqIEBwcm9wZXJ0eSB7SW5zdGFsbGF0aW9ufSBpbnN0YWxsYXRpb25cbiAqIEBwcm9wZXJ0eSB7SW5zdGFuY2V9IGluc3RhbmNlXG4gKiBAcHJvcGVydHkge0ludml0YXRpb25IYW5kbGV9IGhhbmRsZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRlc2NyaXB0aW9uXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7U3RhbmRhcmRJbnZpdGF0aW9uRGV0YWlscyAmIFJlY29yZDxzdHJpbmcsIGFueT59IEludml0YXRpb25EZXRhaWxzXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgW1NGPWFueV0gY29udHJhY3Qgc3RhcnQgZnVuY3Rpb25cbiAqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3V0aWxzJykuSW5zdGFsbGF0aW9uPFNGPn0gSW5zdGFsbGF0aW9uXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0luc3RhbGxhdGlvbn0gSVxuICogQHR5cGVkZWYge1hpbXBvcnQoJy4vdXRpbHMnKS5JbnN0YWxsYXRpb25TdGFydDxJPn0gSW5zdGFsbGF0aW9uU3RhcnRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEZlZUlzc3VlckNvbmZpZ1xuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWVcbiAqIEBwcm9wZXJ0eSB7QXNzZXRLaW5kfSBhc3NldEtpbmRcbiAqIEBwcm9wZXJ0eSB7RGlzcGxheUluZm99IGRpc3BsYXlJbmZvXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBab2VGZWVzQ29uZmlnXG4gKiBAcHJvcGVydHkge05hdFZhbHVlfSBnZXRQdWJsaWNGYWNldEZlZVxuICovXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMvaQAgkFAAAJBQAACIAAABAYWdvcmljL3pvZS12MC4yNS41L3Rvb2xzL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQcmljZVF1b3RlXG4gKiBAcHJvcGVydHkge0Ftb3VudDwnc2V0Jz59IHF1b3RlQW1vdW50XG4gKiBBbW91bnQgd2hvc2UgdmFsdWUgaXMgYSBQcmljZVF1b3RlVmFsdWVcbiAqIEBwcm9wZXJ0eSB7RVJlZjxQYXltZW50PCdzZXQnPj59IHF1b3RlUGF5bWVudFxuICogVGhlIGBxdW90ZUFtb3VudGAgd3JhcHBlZCBhcyBhIHBheW1lbnRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtbUHJpY2VEZXNjcmlwdGlvbl19IFByaWNlUXVvdGVWYWx1ZVxuICogQSBzaW5nbGUtdmFsdWVkIHNldCBvZiBQcmljZURlc2NyaXB0aW9ucy4gIFRoaXMgaXMgdGhlIGB2YWx1ZWAgaW5cbiAqIFByaWNlUXVvdGUucXVvdGVBbW91bnQgKGB7IGJyYW5kLCB2YWx1ZTogUHJpY2VRdW90ZVZhbHVlIH1gKS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFByaWNlRGVzY3JpcHRpb25cbiAqIEEgZGVzY3JpcHRpb24gb2YgYSBzaW5nbGUgcXVvdGVcbiAqIEBwcm9wZXJ0eSB7QW1vdW50fSBhbW91bnRJblxuICogVGhlIGFtb3VudCBzdXBwbGllZCB0byBhIHRyYWRlXG4gKiBAcHJvcGVydHkge0Ftb3VudH0gYW1vdW50T3V0XG4gKiBUaGUgcXVvdGVkIHJlc3VsdCBvZiB0cmFkaW5nIGBhbW91bnRJbmBcbiAqIEBwcm9wZXJ0eSB7VGltZXJTZXJ2aWNlfSB0aW1lclxuICogVGhlIHNlcnZpY2UgdGhhdCBnYXZlIHRoZSBgdGltZXN0YW1wYFxuICogQHByb3BlcnR5IHtUaW1lc3RhbXB9IHRpbWVzdGFtcFxuICogQSB0aW1lc3RhbXAgYWNjb3JkaW5nIHRvIGB0aW1lcmAgZm9yIHRoZSBxdW90ZVxuICogQHByb3BlcnR5IHthbnk9fSBjb25kaXRpb25zXG4gKiBBZGRpdGlvbmFsIGNvbmRpdGlvbnMgZm9yIHRoZSBxdW90ZVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFByaWNlUXVvdGVDcmVhdGVcbiAqIEBwYXJhbSB7UHJpY2VRdWVyeX0gcHJpY2VRdWVyeVxuICogQHJldHVybnMge0VSZWY8UHJpY2VRdW90ZT4gfCB1bmRlZmluZWR9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgUHJpY2VRdW90ZVRyaWdnZXJcbiAqIEBwYXJhbSB7UHJpY2VRdW90ZUNyZWF0ZX0gY3JlYXRlUXVvdGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFByaWNlQXV0aG9yaXR5QWRtaW5cbiAqIEBwcm9wZXJ0eSB7KGNyZWF0ZVF1b3RlOiBQcmljZVF1b3RlQ3JlYXRlKSA9PiBQcm9taXNlPHZvaWQ+fSBmaXJlVHJpZ2dlcnNcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFByaWNlQXV0aG9yaXR5S2l0XG4gKiBAcHJvcGVydHkge1ByaWNlQXV0aG9yaXR5fSBwcmljZUF1dGhvcml0eVxuICogQHByb3BlcnR5IHtQcmljZUF1dGhvcml0eUFkbWlufSBhZG1pbkZhY2V0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBNdXRhYmxlUXVvdGVcbiAqIEBwcm9wZXJ0eSB7KHJlYXNvbj86IGFueSkgPT4gdm9pZH0gY2FuY2VsXG4gKiBAcHJvcGVydHkgeyhhbW91bnRJbjogQW1vdW50LCBhbW91bnRPdXQ6IEFtb3VudCkgPT4gdm9pZH0gdXBkYXRlTGV2ZWxcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gRVJlZjxQcmljZVF1b3RlPn0gZ2V0UHJvbWlzZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUHJpY2VBdXRob3JpdHlcbiAqIEFuIG9iamVjdCB0aGF0IG1pbnRzIFByaWNlUXVvdGVzIGFuZCBoYW5kbGVzXG4gKiB0cmlnZ2VycyBhbmQgbm90aWZpZXJzIGZvciBjaGFuZ2VzIGluIHRoZSBwcmljZVxuICpcbiAqIEBwcm9wZXJ0eSB7KGJyYW5kSW46IEJyYW5kLCBicmFuZE91dDogQnJhbmQpID0+IEVSZWY8SXNzdWVyPn0gZ2V0UXVvdGVJc3N1ZXJcbiAqIEdldCB0aGUgRVJUUCBpc3N1ZXIgb2YgUHJpY2VRdW90ZXMgZm9yIGEgZ2l2ZW4gYnJhbmRJbi9icmFuZE91dCBwYWlyXG4gKlxuICogQHByb3BlcnR5IHsoYnJhbmRJbjogQnJhbmQsXG4gKiAgICAgICAgICAgICBicmFuZE91dDogQnJhbmRcbiAqICkgPT4gRVJlZjxUaW1lclNlcnZpY2U+fSBnZXRUaW1lclNlcnZpY2VcbiAqIEdldCB0aGUgdGltZXIgdXNlZCBpbiBQcmljZVF1b3RlcyBmb3IgYSBnaXZlbiBicmFuZEluL2JyYW5kT3V0IHBhaXJcbiAqXG4gKiBAcHJvcGVydHkgeyhhbW91bnRJbjogQW1vdW50LFxuICogICAgICAgICAgICAgYnJhbmRPdXQ6IEJyYW5kXG4gKiAgICAgICAgICAgICkgPT4gRVJlZjxOb3RpZmllcjxQcmljZVF1b3RlPj59IG1ha2VRdW90ZU5vdGlmaWVyXG4gKiBCZSBub3RpZmllZCBvZiB0aGUgbGF0ZXN0IFByaWNlUXVvdGVzIGZvciBhIGdpdmVuXG4gKiBgYW1vdW50SW5gLiAgVGhlIHJhdGUgYXQgd2hpY2ggdGhlc2UgYXJlIGlzc3VlZCBtYXkgYmUgdmVyeSBkaWZmZXJlbnQgYmV0d2VlblxuICogYHByaWNlQXV0aG9yaXRpZXNgLlxuICpcbiAqIEBwcm9wZXJ0eSB7KGRlYWRsaW5lOiBUaW1lc3RhbXAsXG4gKiAgICAgICAgICAgICBhbW91bnRJbjogQW1vdW50LFxuICogICAgICAgICAgICAgYnJhbmRPdXQ6IEJyYW5kXG4gKiApID0+IFByb21pc2U8UHJpY2VRdW90ZT59IHF1b3RlQXRUaW1lXG4gKiBSZXNvbHZlcyBhZnRlciBgZGVhZGxpbmVgIHBhc3NlcyBvbiB0aGVcbiAqIHByaWNlQXV0aG9yaXR5J3MgdGltZXJTZXJ2aWNlIHdpdGggdGhlIHByaWNlIHF1b3RlIG9mIGBhbW91bnRJbmAgYXQgdGhhdCB0aW1lXG4gKlxuICogQHByb3BlcnR5IHsoYW1vdW50SW46IEFtb3VudCxcbiAqICAgICAgICAgICAgIGJyYW5kT3V0OiBCcmFuZFxuICogKSA9PiBQcm9taXNlPFByaWNlUXVvdGU+fSBxdW90ZUdpdmVuXG4gKiBHZXQgYSBxdW90ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgYW1vdW50SW5cbiAqXG4gKiBAcHJvcGVydHkgeyhicmFuZEluOiBCcmFuZCxcbiAqICAgICAgICAgICAgIGFtb3VudE91dDogQW1vdW50KSA9PiBQcm9taXNlPFByaWNlUXVvdGU+fSBxdW90ZVdhbnRlZFxuICogR2V0IGEgcXVvdGUgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGFtb3VudE91dFxuICpcbiAqIEBwcm9wZXJ0eSB7KGFtb3VudEluOiBBbW91bnQsXG4gKiAgICAgICAgICAgICBhbW91bnRPdXRMaW1pdDogQW1vdW50XG4gKiApID0+IFByb21pc2U8UHJpY2VRdW90ZT59IHF1b3RlV2hlbkdUXG4gKiBSZXNvbHZlIHdoZW4gYSBwcmljZSBxdW90ZSBvZiBgYW1vdW50SW5gIGV4Y2VlZHMgYGFtb3VudE91dExpbWl0YFxuICpcbiAqIEBwcm9wZXJ0eSB7KGFtb3VudEluOiBBbW91bnQsXG4gKiAgICAgICAgICAgICBhbW91bnRPdXRMaW1pdDogQW1vdW50XG4gKiApID0+IFByb21pc2U8UHJpY2VRdW90ZT59IHF1b3RlV2hlbkdURVxuICogUmVzb2x2ZSB3aGVuIGEgcHJpY2UgcXVvdGUgb2YgYGFtb3VudEluYCByZWFjaGVzIG9yIGV4Y2VlZHMgYGFtb3VudE91dExpbWl0YFxuICpcbiAqIEBwcm9wZXJ0eSB7KGFtb3VudEluOiBBbW91bnQsXG4gKiAgICAgICAgICAgICBhbW91bnRPdXRMaW1pdDogQW1vdW50XG4gKiApID0+IFByb21pc2U8UHJpY2VRdW90ZT59IHF1b3RlV2hlbkxURVxuICogUmVzb2x2ZSB3aGVuIGEgcHJpY2UgcXVvdGUgb2YgYGFtb3VudEluYCByZWFjaGVzIG9yIGRyb3BzIGJlbG93XG4gKiBgYW1vdW50T3V0TGltaXRgXG4gKlxuICogQHByb3BlcnR5IHsoYW1vdW50SW46IEFtb3VudCxcbiAqICAgICAgICAgICAgIGFtb3VudE91dExpbWl0OiBBbW91bnRcbiAqICkgPT4gUHJvbWlzZTxQcmljZVF1b3RlPn0gcXVvdGVXaGVuTFRcbiAqIFJlc29sdmUgd2hlbiB0aGUgcHJpY2UgcXVvdGUgb2YgYGFtb3VudEluYCBkcm9wcyBiZWxvdyBgYW1vdW50T3V0TGltaXRgXG4gKlxuICogQHByb3BlcnR5IHsoYW1vdW50SW46IEFtb3VudCxcbiAqICAgICAgICAgICAgIGFtb3VudE91dExpbWl0OiBBbW91bnRcbiAqICkgPT4gRVJlZjxNdXRhYmxlUXVvdGU+fSBtdXRhYmxlUXVvdGVXaGVuR1RcbiAqIFJlc29sdmUgd2hlbiBhIHByaWNlIHF1b3RlIG9mIGBhbW91bnRJbmAgZXhjZWVkcyBgYW1vdW50T3V0TGltaXRgXG4gKlxuICogQHByb3BlcnR5IHsoYW1vdW50SW46IEFtb3VudCxcbiAqICAgICAgICAgICAgIGFtb3VudE91dExpbWl0OiBBbW91bnRcbiAqICkgPT4gRVJlZjxNdXRhYmxlUXVvdGU+fSBtdXRhYmxlUXVvdGVXaGVuR1RFXG4gKiBSZXNvbHZlIHdoZW4gYSBwcmljZSBxdW90ZSBvZiBgYW1vdW50SW5gIHJlYWNoZXMgb3IgZXhjZWVkc1xuICogYGFtb3VudE91dExpbWl0YFxuICpcbiAqIEBwcm9wZXJ0eSB7KGFtb3VudEluOiBBbW91bnQsXG4gKiAgICAgICAgICAgICBhbW91bnRPdXRMaW1pdDogQW1vdW50XG4gKiApID0+IEVSZWY8TXV0YWJsZVF1b3RlPn0gbXV0YWJsZVF1b3RlV2hlbkxURVxuICogUmVzb2x2ZSB3aGVuIGEgcHJpY2UgcXVvdGUgb2YgYGFtb3VudEluYCByZWFjaGVzIG9yIGRyb3BzIGJlbG93XG4gKiBgYW1vdW50T3V0TGltaXRgXG4gKlxuICogQHByb3BlcnR5IHsoYW1vdW50SW46IEFtb3VudCxcbiAqICAgICAgICAgICAgIGFtb3VudE91dExpbWl0OiBBbW91bnRcbiAqICkgPT4gRVJlZjxNdXRhYmxlUXVvdGU+fSBtdXRhYmxlUXVvdGVXaGVuTFRcbiAqIFJlc29sdmUgd2hlbiB0aGUgcHJpY2UgcXVvdGUgb2YgYGFtb3VudEluYCBkcm9wcyBiZWxvdyBgYW1vdW50T3V0TGltaXRgXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KGFtb3VudDogQW1vdW50KSA9PiBBbW91bnR9IFByaWNlQ2FsY3VsYXRvclxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFByaWNlUXVlcnlcbiAqIEBwYXJhbSB7UHJpY2VDYWxjdWxhdG9yfSBjYWxjQW1vdW50SW5cbiAqIEBwYXJhbSB7UHJpY2VDYWxjdWxhdG9yfSBjYWxjQW1vdW50T3V0XG4gKiBAcmV0dXJucyB7eyBhbW91bnRJbjogQW1vdW50LCBhbW91bnRPdXQ6IEFtb3VudCwgdGltZXN0YW1wPzogVGltZXN0YW1wIH09fVxuICovXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPoP7V/rEQAA6xEAACQAAABAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE2LjUvc3JjL0UuanN7ImltcG9ydHMiOlsiLi90cmFjay10dXJucy5qcyJdLCJleHBvcnRzIjpbImRlZmF1bHQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgdHJhY2tUdXJuczskaOKAjV9pbXBvcnRzKFtbXCIuL3RyYWNrLXR1cm5zLmpzXCIsIFtbXCJ0cmFja1R1cm5zXCIsIFskaOKAjV9hID0+ICh0cmFja1R1cm5zID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuLyovIDxyZWZlcmVuY2UgcGF0aD1cImluZGV4LmQudHNcIiAvPiovXG5cbmNvbnN0e2RldGFpbHM6WCxxdW90ZTpxfT1hc3NlcnQ7XG5cbi8qKiBAdHlwZSB7UHJveHlIYW5kbGVyPGFueT59ICovXG5jb25zdCBiYXNlRnJlZXphYmxlUHJveHlIYW5kbGVyPXtcbnNldChfdGFyZ2V0LF9wcm9wLF92YWx1ZSl7XG5yZXR1cm4gZmFsc2U7XG4gfSxcbmlzRXh0ZW5zaWJsZShfdGFyZ2V0KXtcbnJldHVybiBmYWxzZTtcbiB9LFxuc2V0UHJvdG90eXBlT2YoX3RhcmdldCxfdmFsdWUpe1xucmV0dXJuIGZhbHNlO1xuIH0sXG5kZWxldGVQcm9wZXJ0eShfdGFyZ2V0LF9wcm9wKXtcbnJldHVybiBmYWxzZTtcbiB9fTtcblxuXG4vKiBFIFByb3h5IGhhbmRsZXJzIHByZXRlbmQgdGhhdCBhbnkgcHJvcGVydHkgZXhpc3RzIG9uIHRoZSB0YXJnZXQgYW5kIHJldHVybnMqL1xuLyogYSBmdW5jdGlvbiBmb3IgdGhlaXIgdmFsdWUuIFdoaWxlIHRoaXMgZnVuY3Rpb24gaXMgXCJib3VuZFwiIGJ5IGNvbnRleHQsIGl0IGlzKi9cbi8qIG1lYW50IHRvIGJlIGNhbGxlZCBhcyBhIG1ldGhvZC4gRm9yIHRoYXQgcmVhc29uLCB0aGUgcmV0dXJuZWQgZnVuY3Rpb24qL1xuLyogaW5jbHVkZXMgYSBjaGVjayB0aGF0IHRoZSBgdGhpc2AgYXJndW1lbnQgY29ycmVzcG9uZHMgdG8gdGhlIGluaXRpYWwqL1xuLyogcmVjZWl2ZXIgd2hlbiB0aGUgZnVuY3Rpb24gd2FzIHJldHJpZXZlZC4qL1xuLyogRSBQcm94eSBoYW5kbGVycyBhbHNvIGZvcndhcmQgZGlyZWN0IGNhbGxzIHRvIHRoZSB0YXJnZXQgaW4gY2FzZSB0aGUgcmVtb3RlKi9cbi8qIGlzIGEgZnVuY3Rpb24gaW5zdGVhZCBvZiBhbiBvYmplY3QuIE5vIHN1Y2ggcmVjZWl2ZXIgY2hlY2tzIGFyZSBuZWNlc3NhcnkgaW4qL1xuLyogdGhhdCBjYXNlLiovXG5cbi8qKlxuICogQSBQcm94eSBoYW5kbGVyIGZvciBFKHgpLlxuICpcbiAqIEBwYXJhbSB7Kn0geCBBbnkgdmFsdWUgcGFzc2VkIHRvIEUoeClcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi9pbmRleCcpLkhhbmRsZWRQcm9taXNlQ29uc3RydWN0b3J9IEhhbmRsZWRQcm9taXNlXG4gKiBAcmV0dXJucyB7UHJveHlIYW5kbGVyfSB0aGUgUHJveHkgaGFuZGxlclxuICovXG5mdW5jdGlvbiBFUHJveHlIYW5kbGVyKHgsSGFuZGxlZFByb21pc2Upe1xucmV0dXJuIGhhcmRlbih7XG4uLi5iYXNlRnJlZXphYmxlUHJveHlIYW5kbGVyLFxuZ2V0KF90YXJnZXQscCxyZWNlaXZlcil7XG5yZXR1cm4gaGFyZGVuKFxue1xuLyogVGhpcyBmdW5jdGlvbiBwdXJwb3NlbHkgY2hlY2tzIHRoZSBgdGhpc2AgdmFsdWUgKHNlZSBhYm92ZSkqL1xuLyogSW4gb3JkZXIgdG8gYmUgYHRoaXNgIHNlbnNpdGl2ZSBpdCBpcyBkZWZpbmVkIHVzaW5nIGNvbmNpc2UgbWV0aG9kKi9cbi8qIHN5bnRheCByYXRoZXIgdGhhbiBhcyBhbiBhcnJvdyBmdW5jdGlvbi4gVG8gZW5zdXJlIHRoZSBmdW5jdGlvbiovXG4vKiBpcyBub3QgY29uc3RydWN0YWJsZSwgaXQgYWxzbyBhdm9pZHMgdGhlIGBmdW5jdGlvbmAgc3ludGF4LiovXG5bcF0oLi4uYXJncyl7XG5pZih0aGlzIT09cmVjZWl2ZXIpe1xuLyogUmVqZWN0IHRoZSBhc3luYyBmdW5jdGlvbiBjYWxsKi9cbnJldHVybiBIYW5kbGVkUHJvbWlzZS5yZWplY3QoXG5hc3NlcnQuZXJyb3IoXG5YIGBVbmV4cGVjdGVkIHJlY2VpdmVyIGZvciBcIiR7cH1cIiBtZXRob2Qgb2YgRSgke3EoeCl9KWApKTtcblxuXG4gfVxuXG5yZXR1cm4gSGFuZGxlZFByb21pc2UuYXBwbHlNZXRob2QoeCxwLGFyZ3MpO1xuIH1cbi8qIEB0cy1leHBlY3QtZXJyb3IgaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy81MDMxOSovfVtcbnBdKTtcblxuIH0sXG5hcHBseShfdGFyZ2V0LF90aGlzQXJnLGFyZ0FycmF5PVtdKXtcbnJldHVybiBIYW5kbGVkUHJvbWlzZS5hcHBseUZ1bmN0aW9uKHgsYXJnQXJyYXkpO1xuIH0sXG5oYXMoX3RhcmdldCxfcCl7XG4vKiBXZSBqdXN0IHByZXRlbmQgZXZlcnl0aGluZyBleGlzdHMuKi9cbnJldHVybiB0cnVlO1xuIH19KTtcblxuIH1cblxuLyoqXG4gKiBBIFByb3h5IGhhbmRsZXIgZm9yIEUuc2VuZE9ubHkoeClcbiAqIEl0IGlzIGEgdmFyaWFudCBvbiB0aGUgRSh4KSBQcm94eSBoYW5kbGVyLlxuICpcbiAqIEBwYXJhbSB7Kn0geCBBbnkgdmFsdWUgcGFzc2VkIHRvIEUuc2VuZE9ubHkoeClcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi9pbmRleCcpLkhhbmRsZWRQcm9taXNlQ29uc3RydWN0b3J9IEhhbmRsZWRQcm9taXNlXG4gKiBAcmV0dXJucyB7UHJveHlIYW5kbGVyfSB0aGUgUHJveHkgaGFuZGxlclxuICovXG5mdW5jdGlvbiBFc2VuZE9ubHlQcm94eUhhbmRsZXIoeCxIYW5kbGVkUHJvbWlzZSl7XG5yZXR1cm4gaGFyZGVuKHtcbi4uLmJhc2VGcmVlemFibGVQcm94eUhhbmRsZXIsXG5nZXQoX3RhcmdldCxwLHJlY2VpdmVyKXtcbnJldHVybiBoYXJkZW4oXG57XG4vKiBUaGlzIGZ1bmN0aW9uIHB1cnBvc2VseSBjaGVja3MgdGhlIGB0aGlzYCB2YWx1ZSAoc2VlIGFib3ZlKSovXG4vKiBJbiBvcmRlciB0byBiZSBgdGhpc2Agc2Vuc2l0aXZlIGl0IGlzIGRlZmluZWQgdXNpbmcgY29uY2lzZSBtZXRob2QqL1xuLyogc3ludGF4IHJhdGhlciB0aGFuIGFzIGFuIGFycm93IGZ1bmN0aW9uLiBUbyBlbnN1cmUgdGhlIGZ1bmN0aW9uKi9cbi8qIGlzIG5vdCBjb25zdHJ1Y3RhYmxlLCBpdCBhbHNvIGF2b2lkcyB0aGUgYGZ1bmN0aW9uYCBzeW50YXguKi9cbltwXSguLi5hcmdzKXtcbi8qIFRocm93IHNpbmNlIHRoZSBmdW5jdGlvbiByZXR1cm5zIG5vdGhpbmcqL1xuYXNzZXJ0LmVxdWFsKFxudGhpcyxcbnJlY2VpdmVyLFxuWCBgVW5leHBlY3RlZCByZWNlaXZlciBmb3IgXCIke3B9XCIgbWV0aG9kIG9mIEUuc2VuZE9ubHkoJHtxKHgpfSlgKTtcblxuSGFuZGxlZFByb21pc2UuYXBwbHlNZXRob2RTZW5kT25seSh4LHAsYXJncyk7XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cbi8qIEB0cy1leHBlY3QtZXJyb3IgaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy81MDMxOSovfVtcbnBdKTtcblxuIH0sXG5hcHBseShfdGFyZ2V0LF90aGlzQXJnLGFyZ3NBcnJheT1bXSl7XG5IYW5kbGVkUHJvbWlzZS5hcHBseUZ1bmN0aW9uU2VuZE9ubHkoeCxhcmdzQXJyYXkpO1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9LFxuaGFzKF90YXJnZXQsX3Ape1xuLyogV2UganVzdCBwcmV0ZW5kIHRoYXQgZXZlcnl0aGluZyBleGlzdHMuKi9cbnJldHVybiB0cnVlO1xuIH19KTtcblxuIH1cblxuLyoqXG4gKiBAcGFyYW0ge1hpbXBvcnQoJy4vaW5kZXgnKS5IYW5kbGVkUHJvbWlzZUNvbnN0cnVjdG9yfSBIYW5kbGVkUHJvbWlzZVxuICogQHJldHVybnMge1hpbXBvcnQoJy4vaW5kZXgnKS5FUHJveHl9XG4gKi9cbmZ1bmN0aW9uICAgICAgICAgICAgICAgIG1ha2VFKEhhbmRsZWRQcm9taXNlKXtcbmZ1bmN0aW9uIEUoeCl7XG5jb25zdCBoYW5kbGVyPUVQcm94eUhhbmRsZXIoeCxIYW5kbGVkUHJvbWlzZSk7XG5yZXR1cm4gaGFyZGVuKG5ldyBQcm94eSgoKT0+eyB9LGhhbmRsZXIpKTtcbiB9XG5cbmNvbnN0IG1ha2VFR2V0dGVyUHJveHk9KHgpPT5cbm5ldyBQcm94eShPYmplY3QuY3JlYXRlKG51bGwpLHtcbi4uLmJhc2VGcmVlemFibGVQcm94eUhhbmRsZXIsXG5oYXMoX3RhcmdldCxfcHJvcCl7XG5yZXR1cm4gdHJ1ZTtcbiB9LFxuZ2V0KF90YXJnZXQscHJvcCl7XG5yZXR1cm4gSGFuZGxlZFByb21pc2UuZ2V0KHgscHJvcCk7XG4gfX0pO1xuXG5cbkUuZ2V0PW1ha2VFR2V0dGVyUHJveHk7XG5FLnJlc29sdmU9SGFuZGxlZFByb21pc2UucmVzb2x2ZTtcbkUuc2VuZE9ubHk9KHgpPT57XG5jb25zdCBoYW5kbGVyPUVzZW5kT25seVByb3h5SGFuZGxlcih4LEhhbmRsZWRQcm9taXNlKTtcbnJldHVybiBoYXJkZW4obmV3IFByb3h5KCgpPT57IH0saGFuZGxlcikpO1xuIH07XG5cbkUud2hlbj0oeCxvbmZ1bGZpbGxlZCxvbnJlamVjdGVkKT0+e1xuY29uc3Rbb25zdWNjZXNzLG9uZmFpbHVyZV09dHJhY2tUdXJucyhbb25mdWxmaWxsZWQsb25yZWplY3RlZF0pO1xucmV0dXJuIEhhbmRsZWRQcm9taXNlLnJlc29sdmUoeCkudGhlbihvbnN1Y2Nlc3Msb25mYWlsdXJlKTtcbiB9O1xuXG5yZXR1cm4gaGFyZGVuKEUpO1xuIH0kaOKAjV9vbmNlLmRlZmF1bHQoICAgICBtYWtlRSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmYXVsdCI6WyJkZWZhdWx0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAK01mz0IAgAACAIAACoAAABAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE2LjUvc3JjL25vLXNoaW0uanN7ImltcG9ydHMiOlsiLi9FLmpzIl0sImV4cG9ydHMiOlsiRSIsIkhhbmRsZWRQcm9taXNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IG1ha2VFOyRo4oCNX2ltcG9ydHMoW1tcIi4vRS5qc1wiLCBbW1wiZGVmYXVsdFwiLCBbJGjigI1fYSA9PiAobWFrZUUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuY29uc3QgaHA9SGFuZGxlZFByb21pc2U7JGjigI1fb25jZS5ocChocCk7XG5jb25zdCAgICAgICAgRT1tYWtlRShIYW5kbGVkUHJvbWlzZSk7JGjigI1fb25jZS5FKEUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkhhbmRsZWRQcm9taXNlIjpbImhwIl0sIkUiOlsiRSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACPJygn0g8AANIPAAAuAAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNi41L3NyYy90cmFjay10dXJucy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsidHJhY2tUdXJucyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIGdsb2JhbCBnbG9iYWxUaGlzICovXG4vKiBAdHMtbm9jaGVjayovXG5cbi8qIE5PVEU6IFdlIGNhbid0IGltcG9ydCB0aGVzZSBiZWNhdXNlIHRoZXkncmUgbm90IGluIHNjb3BlIGJlZm9yZSBsb2NrZG93bi4qL1xuLyogaW1wb3J0IHsgYXNzZXJ0LCBkZXRhaWxzIGFzIFggfSBmcm9tICdAYWdvcmljL2Fzc2VydCc7Ki9cblxuLyogV0FSTklORzogR2xvYmFsIE11dGFibGUgU3RhdGUhKi9cbi8qIFRoaXMgc3RhdGUgaXMgY29tbXVuaWNhdGVkIHRvIGBhc3NlcnRgIHRoYXQgbWFrZXMgaXQgYXZhaWxhYmxlIHRvIHRoZSovXG4vKiBjYXVzYWwgY29uc29sZSwgd2hpY2ggYWZmZWN0cyB0aGUgY29uc29sZSBsb2cgb3V0cHV0LiBOb3JtYWxseSB3ZSovXG4vKiByZWdhcmQgdGhlIGFiaWxpdHkgdG8gc2VlIGNvbnNvbGUgbG9nIG91dHB1dCBhcyBhIG1ldGEtbGV2ZWwgcHJpdmlsZWdlKi9cbi8qIGFuYWxvZ291cyB0byB0aGUgYWJpbGl0eSB0byBkZWJ1Zy4gQXNpZGUgZnJvbSB0aGF0LCB0aGlzIG1vZHVsZSBzaG91bGQqL1xuLyogbm90IGhhdmUgYW55IG9ic2VydmFibHkgbXV0YWJsZSBzdGF0ZS4qL1xuXG5sZXQgaGlkZGVuUHJpb3JFcnJvcjtcbmxldCBoaWRkZW5DdXJyZW50VHVybj0wO1xubGV0IGhpZGRlbkN1cnJlbnRFdmVudD0wO1xuXG4vKiBUT0RPIFVzZSBlbnZpcm9ubWVudC1vcHRpb25zLmpzIGN1cnJlbnRseSBpbiBzZXMvc3JjIGFmdGVyIGZhY3RvcmluZyBpdCBvdXQqL1xuLyogdG8gYSBuZXcgcGFja2FnZS4qL1xuY29uc3QgZW52PShnbG9iYWxUaGlzLnByb2Nlc3N8fHt9KS5lbnZ8fHt9O1xuXG4vKiBUdXJuIG9uIGlmIHlvdSBzZWVtIHRvIGJlIGxvc2luZyBlcnJvciBsb2dnaW5nIGF0IHRoZSB0b3Agb2YgdGhlIGV2ZW50IGxvb3AqL1xuY29uc3QgVkVSQk9TRT0oZW52LkRFQlVHfHwnJykuc3BsaXQoJzonKS5pbmNsdWRlcygndHJhY2stdHVybnMnKTtcblxuLyogVHJhY2stdHVybnMgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCBhbmQgY2FuIGJlIGVuYWJsZWQgYnkgYW4gZW52aXJvbm1lbnQqL1xuLyogb3B0aW9uLiBXZSBpbnRlbmQgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IGFmdGVyIHZlcmlmeWluZyB0aGF0IGhhdmluZyovXG4vKiB0aGUgZmVhdHVyZSBlbmFibGVkIGluIHByb2R1Y3Rpb24gZG9lcyBub3QgY2F1c2UgbWVtb3J5IHRvIGxlYWsuKi9cbmNvbnN0IEVOQUJMRUQ9ZW52LlRSQUNLX1RVUk5TPT09J2VuYWJsZWQnO1xuXG4vKiBXZSBob2lzdCB0aGVzZSBmdW5jdGlvbnMgb3V0IG9mIHRyYWNrVHVybnMoKSB0byBkaXNjb3VyYWdlIHRoZSovXG4vKiBjbG9zdXJlcyBmcm9tIGhvbGRpbmcgb250byAnYXJncycgb3IgJ2Z1bmMnIGxvbmdlciB0aGFuIG5lY2Vzc2FyeSwqL1xuLyogd2hpY2ggd2UndmUgc2VlbiBjYXVzZSBIYW5kbGVkUHJvbWlzZSBhcmd1bWVudHMgdG8gYmUgcmV0YWluZWQgZm9yKi9cbi8qIGEgc3VycHJpc2luZ2x5IGxvbmcgdGltZS4qL1xuXG5jb25zdCBhZGRSZWplY3Rpb25Ob3RlPShkZXRhaWxzTm90ZSk9PihyZWFzb24pPT57XG5pZihyZWFzb24gaW5zdGFuY2VvZiBFcnJvcil7XG5hc3NlcnQubm90ZShyZWFzb24sZGV0YWlsc05vdGUpO1xuIH1cbmlmKFZFUkJPU0Upe1xuY29uc29sZS5sb2coJ1JFSkVDVEVEIGF0IHRvcCBvZiBldmVudCBsb29wJyxyZWFzb24pO1xuIH1cbiB9O1xuXG5jb25zdCB3cmFwRnVuY3Rpb249KGZ1bmMsc2VuZGluZ0Vycm9yLFgpPT4oLi4uYXJncyk9PntcbmhpZGRlblByaW9yRXJyb3I9c2VuZGluZ0Vycm9yO1xuaGlkZGVuQ3VycmVudFR1cm4rPTE7XG5oaWRkZW5DdXJyZW50RXZlbnQ9MDtcbnRyeXtcbmxldCByZXN1bHQ7XG50cnl7XG5yZXN1bHQ9ZnVuYyguLi5hcmdzKTtcbiB9Y2F0Y2goZXJyKXtcbmlmKGVyciBpbnN0YW5jZW9mIEVycm9yKXtcbmFzc2VydC5ub3RlKFxuZXJyLFxuWCBgVGhyb3duIGZyb206ICR7aGlkZGVuUHJpb3JFcnJvcn06JHtoaWRkZW5DdXJyZW50VHVybn0uJHtoaWRkZW5DdXJyZW50RXZlbnR9YCk7XG5cbiB9XG5pZihWRVJCT1NFKXtcbmNvbnNvbGUubG9nKCdUSFJPV04gdG8gdG9wIG9mIGV2ZW50IGxvb3AnLGVycik7XG4gfVxudGhyb3cgZXJyO1xuIH1cbi8qIE11c3QgY2FwdHVyZSB0aGlzIG5vdywgbm90IHdoZW4gdGhlIGNhdGNoIHRyaWdnZXJzLiovXG5jb25zdCBkZXRhaWxzTm90ZT1YIGBSZWplY3Rpb24gZnJvbTogJHtoaWRkZW5QcmlvckVycm9yfToke2hpZGRlbkN1cnJlbnRUdXJufS4ke2hpZGRlbkN1cnJlbnRFdmVudH1gO1xuUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCkuY2F0Y2goYWRkUmVqZWN0aW9uTm90ZShkZXRhaWxzTm90ZSkpO1xucmV0dXJuIGhhcmRlbihyZXN1bHQpO1xuIH1maW5hbGx5e1xuaGlkZGVuUHJpb3JFcnJvcj11bmRlZmluZWQ7XG4gfVxuIH07XG5cbi8qKlxuICogQHR5cGVkZWYgeygoLi4uYXJnczogYW55W10pID0+IGFueSkgfCB1bmRlZmluZWR9IFR1cm5TdGFydGVyRm5cbiAqIEFuIG9wdGlvbmFsIGZ1bmN0aW9uIHRoYXQgaXMgbm90IHRoaXMtc2Vuc2l0aXZlLCBleHBlY3RlZCB0byBiZSBjYWxsZWQgYXRcbiAqIGJvdHRvbSBvZiBzdGFjayB0byBzdGFydCBhIG5ldyB0dXJuLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtUdXJuU3RhcnRlckZuW119IFRcbiAqIEdpdmVuIGEgbGlzdCBvZiBgVHVyblN0YXJ0ZXJGbmBzLCByZXR1cm5zIGEgbGlzdCBvZiBgVHVyblN0YXJ0ZXJGbmBzIHdob3NlXG4gKiBgdGhpc2AtZnJlZSBjYWxsIGJlaGF2aW9ycyBhcmUgbm90IG9ic2VydmFibHkgZGlmZmVyZW50IHRvIHRob3NlIHRoYXRcbiAqIGNhbm5vdCBzZWUgY29uc29sZSBvdXRwdXQuIFRoZSBvbmx5IHB1cnBvc2UgaXMgdG8gY2F1c2UgYWRkaXRpb25hbFxuICogaW5mb3JtYXRpb24gdG8gYXBwZWFyIG9uIHRoZSBjb25zb2xlLlxuICpcbiAqIFRoZSBjYWxsIHRvIGB0cmFja1R1cm5zYCBpcyBpdHNlbGYgYSBzZW5kaW5nIGV2ZW50LCB0aGF0IG9jY3VycyBpbiBzb21lIGNhbGxcbiAqIHN0YWNrIGluIHNvbWUgdHVybiBudW1iZXIgYXQgc29tZSBldmVudCBudW1iZXIgd2l0aGluIHRoYXQgdHVybi4gRWFjaCBjYWxsXG4gKiB0byBhbnkgb2YgdGhlIHJldHVybmVkIGBUdXJuU3RhcnRGbmBzIGlzIGEgcmVjZWl2aW5nIGV2ZW50IHRoYXQgYmVnaW5zIGEgbmV3XG4gKiB0dXJuLiBUaGlzIHNlbmRpbmcgZXZlbnQgY2F1c2VkIGVhY2ggb2YgdGhvc2UgcmVjZWl2aW5nIGV2ZW50cy5cbiAqXG4gKiBAcGFyYW0ge1R9IGZ1bmNzXG4gKiBAcmV0dXJucyB7VH1cbiAqL1xuY29uc3QgICAgICAgIHRyYWNrVHVybnM9KGZ1bmNzKT0+e1xuaWYoIUVOQUJMRUR8fHR5cGVvZiBnbG9iYWxUaGlzPT09J3VuZGVmaW5lZCd8fCFnbG9iYWxUaGlzLmFzc2VydCl7XG5yZXR1cm4gZnVuY3M7XG4gfVxuY29uc3R7ZGV0YWlsczpYfT1hc3NlcnQ7XG5cbmhpZGRlbkN1cnJlbnRFdmVudCs9MTtcbmNvbnN0IHNlbmRpbmdFcnJvcj1uZXcgRXJyb3IoXG4gYEV2ZW50OiAke2hpZGRlbkN1cnJlbnRUdXJufS4ke2hpZGRlbkN1cnJlbnRFdmVudH1gKTtcblxuaWYoaGlkZGVuUHJpb3JFcnJvciE9PXVuZGVmaW5lZCl7XG5hc3NlcnQubm90ZShzZW5kaW5nRXJyb3IsWCBgQ2F1c2VkIGJ5OiAke2hpZGRlblByaW9yRXJyb3J9YCk7XG4gfVxuXG5yZXR1cm4gZnVuY3MubWFwKChmdW5jKT0+ZnVuYyYmd3JhcEZ1bmN0aW9uKGZ1bmMsc2VuZGluZ0Vycm9yLFgpKTtcbiB9OyRo4oCNX29uY2UudHJhY2tUdXJucyh0cmFja1R1cm5zKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJ0cmFja1R1cm5zIjpbInRyYWNrVHVybnMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAPuWAXrYCAAC2AgAAHgAAAEBlbmRvL2Zhci12MC4yLjExL3NyYy9pbmRleC5qc3siaW1wb3J0cyI6WyJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbIkUiLCJGYXIiLCJnZXRJbnRlcmZhY2VPZiIsInBhc3NTdHlsZU9mIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLCBbJGjigI1fbGl2ZVtcIkVcIl1dXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLCBbJGjigI1fbGl2ZVtcIkZhclwiXV1dLFtcImdldEludGVyZmFjZU9mXCIsIFskaOKAjV9saXZlW1wiZ2V0SW50ZXJmYWNlT2ZcIl1dXSxbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fbGl2ZVtcInBhc3NTdHlsZU9mXCJdXV1dXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7IkUiOlsiRSIsZmFsc2VdLCJGYXIiOlsiRmFyIixmYWxzZV0sImdldEludGVyZmFjZU9mIjpbImdldEludGVyZmFjZU9mIixmYWxzZV0sInBhc3NTdHlsZU9mIjpbInBhc3NTdHlsZU9mIixmYWxzZV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAITWh/C/EAAAvxAAAB0AAABAZW5kby9tYXJzaGFsLXYwLjcuNS9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy9kZWVwbHlGdWxmaWxsZWQuanMiLCIuL3NyYy9lbmNvZGVUb0NhcERhdGEuanMiLCIuL3NyYy9oZWxwZXJzL2Vycm9yLmpzIiwiLi9zcmMvaGVscGVycy9pdGVyLWhlbHBlcnMuanMiLCIuL3NyYy9oZWxwZXJzL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9zcmMvaGVscGVycy9yZW1vdGFibGUuanMiLCIuL3NyYy9oZWxwZXJzL3N5bWJvbC5qcyIsIi4vc3JjL21ha2UtZmFyLmpzIiwiLi9zcmMvbWFrZVRhZ2dlZC5qcyIsIi4vc3JjL21hcnNoYWwtanVzdGluLmpzIiwiLi9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanMiLCIuL3NyYy9tYXJzaGFsLmpzIiwiLi9zcmMvcGFzc1N0eWxlT2YuanMiLCIuL3NyYy90eXBlR3VhcmRzLmpzIiwiLi9zcmMvdHlwZXMuanMiXSwiZXhwb3J0cyI6WyJGYXIiLCJQQVNTX1NUWUxFIiwiUUNMQVNTIiwiUmVtb3RhYmxlIiwiVG9GYXJGdW5jdGlvbiIsImFzc2VydENoZWNrZXIiLCJhc3NlcnRDb3B5QXJyYXkiLCJhc3NlcnRQYXNzYWJsZSIsImFzc2VydFJlY29yZCIsImFzc2VydFJlbW90YWJsZSIsImRlY29kZVRvSnVzdGluIiwiZGVlcGx5RnVsZmlsbGVkIiwiZmlsdGVySXRlcmFibGUiLCJnZXRFcnJvckNvbnN0cnVjdG9yIiwiZ2V0SW50ZXJmYWNlT2YiLCJnZXRUYWciLCJoYXNPd25Qcm9wZXJ0eU9mIiwiaXNDb3B5QXJyYXkiLCJpc09iamVjdCIsImlzUmVjb3JkIiwiaXNSZW1vdGFibGUiLCJtYWtlTWFyc2hhbCIsIm1ha2VUYWdnZWQiLCJtYXBJdGVyYWJsZSIsIm5hbWVGb3JQYXNzYWJsZVN5bWJvbCIsInBhcnNlIiwicGFzc1N0eWxlT2YiLCJwYXNzYWJsZVN5bWJvbEZvck5hbWUiLCJzdHJpbmdpZnkiLCJ0b1Bhc3NhYmxlRXJyb3IiXSwicmVleHBvcnRzIjpbIi4vc3JjL3R5cGVzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9zcmMvaGVscGVycy9pdGVyLWhlbHBlcnMuanNcIiwgW1tcIm1hcEl0ZXJhYmxlXCIsIFskaOKAjV9saXZlW1wibWFwSXRlcmFibGVcIl1dXSxbXCJmaWx0ZXJJdGVyYWJsZVwiLCBbJGjigI1fbGl2ZVtcImZpbHRlckl0ZXJhYmxlXCJdXV1dXSxbXCIuL3NyYy9oZWxwZXJzL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJQQVNTX1NUWUxFXCIsIFskaOKAjV9saXZlW1wiUEFTU19TVFlMRVwiXV1dLFtcImlzT2JqZWN0XCIsIFskaOKAjV9saXZlW1wiaXNPYmplY3RcIl1dXSxbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9saXZlW1wiYXNzZXJ0Q2hlY2tlclwiXV1dLFtcImdldFRhZ1wiLCBbJGjigI1fbGl2ZVtcImdldFRhZ1wiXV1dLFtcImhhc093blByb3BlcnR5T2ZcIiwgWyRo4oCNX2xpdmVbXCJoYXNPd25Qcm9wZXJ0eU9mXCJdXV1dXSxbXCIuL3NyYy9oZWxwZXJzL2Vycm9yLmpzXCIsIFtbXCJnZXRFcnJvckNvbnN0cnVjdG9yXCIsIFskaOKAjV9saXZlW1wiZ2V0RXJyb3JDb25zdHJ1Y3RvclwiXV1dLFtcInRvUGFzc2FibGVFcnJvclwiLCBbJGjigI1fbGl2ZVtcInRvUGFzc2FibGVFcnJvclwiXV1dXV0sW1wiLi9zcmMvaGVscGVycy9yZW1vdGFibGUuanNcIiwgW1tcImdldEludGVyZmFjZU9mXCIsIFskaOKAjV9saXZlW1wiZ2V0SW50ZXJmYWNlT2ZcIl1dXV1dLFtcIi4vc3JjL2hlbHBlcnMvc3ltYm9sLmpzXCIsIFtbXCJuYW1lRm9yUGFzc2FibGVTeW1ib2xcIiwgWyRo4oCNX2xpdmVbXCJuYW1lRm9yUGFzc2FibGVTeW1ib2xcIl1dXSxbXCJwYXNzYWJsZVN5bWJvbEZvck5hbWVcIiwgWyRo4oCNX2xpdmVbXCJwYXNzYWJsZVN5bWJvbEZvck5hbWVcIl1dXV1dLFtcIi4vc3JjL3Bhc3NTdHlsZU9mLmpzXCIsIFtbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fbGl2ZVtcInBhc3NTdHlsZU9mXCJdXV0sW1wiYXNzZXJ0UGFzc2FibGVcIiwgWyRo4oCNX2xpdmVbXCJhc3NlcnRQYXNzYWJsZVwiXV1dXV0sW1wiLi9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzXCIsIFtbXCJkZWVwbHlGdWxmaWxsZWRcIiwgWyRo4oCNX2xpdmVbXCJkZWVwbHlGdWxmaWxsZWRcIl1dXV1dLFtcIi4vc3JjL21ha2VUYWdnZWQuanNcIiwgW1tcIm1ha2VUYWdnZWRcIiwgWyRo4oCNX2xpdmVbXCJtYWtlVGFnZ2VkXCJdXV1dXSxbXCIuL3NyYy9tYWtlLWZhci5qc1wiLCBbW1wiUmVtb3RhYmxlXCIsIFskaOKAjV9saXZlW1wiUmVtb3RhYmxlXCJdXV0sW1wiRmFyXCIsIFskaOKAjV9saXZlW1wiRmFyXCJdXV0sW1wiVG9GYXJGdW5jdGlvblwiLCBbJGjigI1fbGl2ZVtcIlRvRmFyRnVuY3Rpb25cIl1dXV1dLFtcIi4vc3JjL2VuY29kZVRvQ2FwRGF0YS5qc1wiLCBbW1wiUUNMQVNTXCIsIFskaOKAjV9saXZlW1wiUUNMQVNTXCJdXV1dXSxbXCIuL3NyYy9tYXJzaGFsLmpzXCIsIFtbXCJtYWtlTWFyc2hhbFwiLCBbJGjigI1fbGl2ZVtcIm1ha2VNYXJzaGFsXCJdXV1dXSxbXCIuL3NyYy9tYXJzaGFsLXN0cmluZ2lmeS5qc1wiLCBbW1wic3RyaW5naWZ5XCIsIFskaOKAjV9saXZlW1wic3RyaW5naWZ5XCJdXV0sW1wicGFyc2VcIiwgWyRo4oCNX2xpdmVbXCJwYXJzZVwiXV1dXV0sW1wiLi9zcmMvbWFyc2hhbC1qdXN0aW4uanNcIiwgW1tcImRlY29kZVRvSnVzdGluXCIsIFskaOKAjV9saXZlW1wiZGVjb2RlVG9KdXN0aW5cIl1dXV1dLFtcIi4vc3JjL3R5cGVHdWFyZHMuanNcIiwgW1tcImFzc2VydFJlY29yZFwiLCBbJGjigI1fbGl2ZVtcImFzc2VydFJlY29yZFwiXV1dLFtcImFzc2VydENvcHlBcnJheVwiLCBbJGjigI1fbGl2ZVtcImFzc2VydENvcHlBcnJheVwiXV1dLFtcImFzc2VydFJlbW90YWJsZVwiLCBbJGjigI1fbGl2ZVtcImFzc2VydFJlbW90YWJsZVwiXV1dLFtcImlzUmVtb3RhYmxlXCIsIFskaOKAjV9saXZlW1wiaXNSZW1vdGFibGVcIl1dXSxbXCJpc1JlY29yZFwiLCBbJGjigI1fbGl2ZVtcImlzUmVjb3JkXCJdXV0sW1wiaXNDb3B5QXJyYXlcIiwgWyRo4oCNX2xpdmVbXCJpc0NvcHlBcnJheVwiXV1dXV0sW1wiLi9zcmMvdHlwZXMuanNcIiwgW11dXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnsibWFwSXRlcmFibGUiOlsibWFwSXRlcmFibGUiLGZhbHNlXSwiZmlsdGVySXRlcmFibGUiOlsiZmlsdGVySXRlcmFibGUiLGZhbHNlXSwiUEFTU19TVFlMRSI6WyJQQVNTX1NUWUxFIixmYWxzZV0sImlzT2JqZWN0IjpbImlzT2JqZWN0IixmYWxzZV0sImFzc2VydENoZWNrZXIiOlsiYXNzZXJ0Q2hlY2tlciIsZmFsc2VdLCJnZXRUYWciOlsiZ2V0VGFnIixmYWxzZV0sImhhc093blByb3BlcnR5T2YiOlsiaGFzT3duUHJvcGVydHlPZiIsZmFsc2VdLCJnZXRFcnJvckNvbnN0cnVjdG9yIjpbImdldEVycm9yQ29uc3RydWN0b3IiLGZhbHNlXSwidG9QYXNzYWJsZUVycm9yIjpbInRvUGFzc2FibGVFcnJvciIsZmFsc2VdLCJnZXRJbnRlcmZhY2VPZiI6WyJnZXRJbnRlcmZhY2VPZiIsZmFsc2VdLCJuYW1lRm9yUGFzc2FibGVTeW1ib2wiOlsibmFtZUZvclBhc3NhYmxlU3ltYm9sIixmYWxzZV0sInBhc3NhYmxlU3ltYm9sRm9yTmFtZSI6WyJwYXNzYWJsZVN5bWJvbEZvck5hbWUiLGZhbHNlXSwicGFzc1N0eWxlT2YiOlsicGFzc1N0eWxlT2YiLGZhbHNlXSwiYXNzZXJ0UGFzc2FibGUiOlsiYXNzZXJ0UGFzc2FibGUiLGZhbHNlXSwiZGVlcGx5RnVsZmlsbGVkIjpbImRlZXBseUZ1bGZpbGxlZCIsZmFsc2VdLCJtYWtlVGFnZ2VkIjpbIm1ha2VUYWdnZWQiLGZhbHNlXSwiUmVtb3RhYmxlIjpbIlJlbW90YWJsZSIsZmFsc2VdLCJGYXIiOlsiRmFyIixmYWxzZV0sIlRvRmFyRnVuY3Rpb24iOlsiVG9GYXJGdW5jdGlvbiIsZmFsc2VdLCJRQ0xBU1MiOlsiUUNMQVNTIixmYWxzZV0sIm1ha2VNYXJzaGFsIjpbIm1ha2VNYXJzaGFsIixmYWxzZV0sInN0cmluZ2lmeSI6WyJzdHJpbmdpZnkiLGZhbHNlXSwicGFyc2UiOlsicGFyc2UiLGZhbHNlXSwiZGVjb2RlVG9KdXN0aW4iOlsiZGVjb2RlVG9KdXN0aW4iLGZhbHNlXSwiYXNzZXJ0UmVjb3JkIjpbImFzc2VydFJlY29yZCIsZmFsc2VdLCJhc3NlcnRDb3B5QXJyYXkiOlsiYXNzZXJ0Q29weUFycmF5IixmYWxzZV0sImFzc2VydFJlbW90YWJsZSI6WyJhc3NlcnRSZW1vdGFibGUiLGZhbHNlXSwiaXNSZW1vdGFibGUiOlsiaXNSZW1vdGFibGUiLGZhbHNlXSwiaXNSZWNvcmQiOlsiaXNSZWNvcmQiLGZhbHNlXSwiaXNDb3B5QXJyYXkiOlsiaXNDb3B5QXJyYXkiLGZhbHNlXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAqjT9gkIMAABCDAAAKwAAAEBlbmRvL21hcnNoYWwtdjAuNy41L3NyYy9kZWVwbHlGdWxmaWxsZWQuanN7ImltcG9ydHMiOlsiLi9oZWxwZXJzL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9tYWtlVGFnZ2VkLmpzIiwiLi9wYXNzU3R5bGVPZi5qcyIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9wcm9taXNlLWtpdCJdLCJleHBvcnRzIjpbImRlZXBseUZ1bGZpbGxlZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBFLGlzUHJvbWlzZSxnZXRUYWcsaXNPYmplY3QsbWFrZVRhZ2dlZCxwYXNzU3R5bGVPZjskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJpc1Byb21pc2VcIiwgWyRo4oCNX2EgPT4gKGlzUHJvbWlzZSA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImdldFRhZ1wiLCBbJGjigI1fYSA9PiAoZ2V0VGFnID0gJGjigI1fYSldXSxbXCJpc09iamVjdFwiLCBbJGjigI1fYSA9PiAoaXNPYmplY3QgPSAkaOKAjV9hKV1dXV0sW1wiLi9tYWtlVGFnZ2VkLmpzXCIsIFtbXCJtYWtlVGFnZ2VkXCIsIFskaOKAjV9hID0+IChtYWtlVGFnZ2VkID0gJGjigI1fYSldXV1dLFtcIi4vcGFzc1N0eWxlT2YuanNcIiwgW1tcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUGFzc2FibGV9IFBhc3NhYmxlICovXG4vKiogQHRlbXBsYXRlIFQgQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL2V2ZW50dWFsLXNlbmQnKS5FUmVmPFQ+fSBFUmVmICovXG5cbmNvbnN0e2RldGFpbHM6WCxxdW90ZTpxfT1hc3NlcnQ7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7ZnJvbUVudHJpZXN9PU9iamVjdDtcblxuLyoqXG4gKiBHaXZlbiBhIFBhc3NhYmxlIGB2YWxgIHdob3NlIHBhc3MtYnktY29weSBzdHJ1Y3R1cmUgbWF5IGNvbnRhaW4gbGVhZlxuICogcHJvbWlzZXMsIHJldHVybiBlaXRoZXIgYSByZXBsYWNlbWVudCBQYXNzYWJsZSwgb3IgYSBwcm9taXNlIGZvciB0aGF0XG4gKiByZXBsYWNlbWVudCwgd2hlcmUgdGhhdCByZXBsYWNlbWVudCBpcyAqZGVlcGx5IGZ1bGZpbGxlZCosIGkuZS4sIGl0c1xuICogcGFzcy1ieS1jb3B5IHN0cnVjdHVyZSBkb2VzIG5vdCBjb250YWluIGFueSBwcm9taXNlcy5cbiAqXG4gKiBUaGlzIGlzIGEgZGVlcCBmb3JtIG9mIGBQcm9taXNlLmFsbGAgc3BlY2lhbGl6ZWQgZm9yIFBhc3NhYmxlcy4gRm9yIGVhY2hcbiAqIGVuY291bnRlcmVkIHByb21pc2UsIHJlcGxhY2UgaXQgd2l0aCB0aGUgZGVlcGx5IGZ1bGZpbGxlZCBmb3JtIG9mXG4gKiBpdHMgZnVsZmlsbG1lbnQuXG4gKiBJZiBhbnkgb2YgdGhlIHByb21pc2VzIHJlamVjdCwgdGhlbiB0aGUgcHJvbWlzZSBmb3IgdGhlIHJlcGxhY2VtZW50XG4gKiByZWplY3RzLiBJZiBhbnkgb2YgdGhlIHByb21pc2VzIG5ldmVyIHNldHRsZSwgdGhlbiB0aGUgcHJvbWlzZSBmb3JcbiAqIHRoZSByZXBsYWNlbWVudCBuZXZlciBzZXR0bGVzLlxuICpcbiAqIElmIGB2YWxgIG9yIGl0cyBwYXJ0cyBhcmUgbm9uLWtleSBwYXNzYWJsZXMgKmJlY2F1c2UqIHRoZXkgY29udGFpbnNcbiAqIHByb21pc2VzLCB0aGUgZGVlcGx5IGZ1bGZpbGxlZCBmb3JtcyBvZiB2YWwgb3IgaXRzIHBhcnRzIG1heSBiZSBrZXlzLiBUaGlzXG4gKiBpcyBmb3IgdGhlIGhpZ2hlciBcInN0b3JlXCIgbGV2ZWwgb2YgYWJzdHJhY3Rpb24gdG8gZGV0ZXJtaW5lLCBiZWNhdXNlIGl0XG4gKiBkZWZpbmVzIHRoZSBcImtleVwiIG5vdGlvbiBpbiBxdWVzdGlvbi5cbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB2YWxcbiAqIEByZXR1cm5zIHtFUmVmPFBhc3NhYmxlPn1cbiAqL1xuY29uc3QgICAgICAgIGRlZXBseUZ1bGZpbGxlZD0odmFsKT0+e1xuaWYoIWlzT2JqZWN0KHZhbCkpe1xucmV0dXJuIHZhbDtcbiB9XG5pZihpc1Byb21pc2UodmFsKSl7XG5yZXR1cm4gRS53aGVuKHZhbCwobm9ucCk9PmRlZXBseUZ1bGZpbGxlZChub25wKSk7XG4gfVxuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHZhbCk7XG5zd2l0Y2gocGFzc1N0eWxlKXtcbmNhc2UnY29weVJlY29yZCc6e1xuY29uc3QgbmFtZXM9b3duS2V5cyh2YWwpO1xuY29uc3QgdmFsUHM9bmFtZXMubWFwKChuYW1lKT0+ZGVlcGx5RnVsZmlsbGVkKHZhbFtuYW1lXSkpO1xucmV0dXJuIEUud2hlbihQcm9taXNlLmFsbCh2YWxQcyksKHZhbHMpPT5cbmhhcmRlbihmcm9tRW50cmllcyh2YWxzLm1hcCgoYyxpKT0+W25hbWVzW2ldLGNdKSkpKTtcblxuIH1cbmNhc2UnY29weUFycmF5Jzp7XG5jb25zdCB2YWxQcz12YWwubWFwKChwKT0+ZGVlcGx5RnVsZmlsbGVkKHApKTtcbnJldHVybiBFLndoZW4oUHJvbWlzZS5hbGwodmFsUHMpLCh2YWxzKT0+aGFyZGVuKHZhbHMpKTtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xuY29uc3QgdGFnPWdldFRhZyh2YWwpO1xucmV0dXJuIEUud2hlbihkZWVwbHlGdWxmaWxsZWQodmFsLnBheWxvYWQpLChwYXlsb2FkKT0+XG5tYWtlVGFnZ2VkKHRhZyxwYXlsb2FkKSk7XG5cbiB9XG5jYXNlJ3JlbW90YWJsZSc6e1xucmV0dXJuIHZhbDtcbiB9XG5jYXNlJ2Vycm9yJzp7XG5yZXR1cm4gdmFsO1xuIH1cbmNhc2UncHJvbWlzZSc6e1xucmV0dXJuIEUud2hlbih2YWwsKG5vbnApPT5kZWVwbHlGdWxmaWxsZWQobm9ucCkpO1xuIH1cbmRlZmF1bHQ6e1xuYXNzZXJ0LmZhaWwoWCBgVW5leHBlY3RlZCBwYXNzU3R5bGUgJHtxKHBhc3NTdHlsZSl9YCxUeXBlRXJyb3IpO1xuIH19XG5cbiB9OyRo4oCNX29uY2UuZGVlcGx5RnVsZmlsbGVkKGRlZXBseUZ1bGZpbGxlZCk7XG5oYXJkZW4oZGVlcGx5RnVsZmlsbGVkKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWVwbHlGdWxmaWxsZWQiOlsiZGVlcGx5RnVsZmlsbGVkIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGqWz6/6OwAA+jsAACsAAABAZW5kby9tYXJzaGFsLXYwLjcuNS9zcmMvZW5jb2RlVG9DYXBEYXRhLmpzeyJpbXBvcnRzIjpbIi4vaGVscGVycy9lcnJvci5qcyIsIi4vaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vaGVscGVycy9zeW1ib2wuanMiLCIuL21ha2VUYWdnZWQuanMiLCIuL3Bhc3NTdHlsZU9mLmpzIl0sImV4cG9ydHMiOlsiUUNMQVNTIiwibWFrZURlY29kZUZyb21DYXBEYXRhIiwibWFrZUVuY29kZVRvQ2FwRGF0YSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBwYXNzU3R5bGVPZixFcnJvckhlbHBlcixtYWtlVGFnZ2VkLGlzT2JqZWN0LGdldFRhZyxoYXNPd25Qcm9wZXJ0eU9mLGFzc2VydFBhc3NhYmxlU3ltYm9sLG5hbWVGb3JQYXNzYWJsZVN5bWJvbCxwYXNzYWJsZVN5bWJvbEZvck5hbWU7JGjigI1faW1wb3J0cyhbW1wiLi9wYXNzU3R5bGVPZi5qc1wiLCBbW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXV1dLFtcIi4vaGVscGVycy9lcnJvci5qc1wiLCBbW1wiRXJyb3JIZWxwZXJcIiwgWyRo4oCNX2EgPT4gKEVycm9ySGVscGVyID0gJGjigI1fYSldXV1dLFtcIi4vbWFrZVRhZ2dlZC5qc1wiLCBbW1wibWFrZVRhZ2dlZFwiLCBbJGjigI1fYSA9PiAobWFrZVRhZ2dlZCA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImlzT2JqZWN0XCIsIFskaOKAjV9hID0+IChpc09iamVjdCA9ICRo4oCNX2EpXV0sW1wiZ2V0VGFnXCIsIFskaOKAjV9hID0+IChnZXRUYWcgPSAkaOKAjV9hKV1dLFtcImhhc093blByb3BlcnR5T2ZcIiwgWyRo4oCNX2EgPT4gKGhhc093blByb3BlcnR5T2YgPSAkaOKAjV9hKV1dXV0sW1wiLi9oZWxwZXJzL3N5bWJvbC5qc1wiLCBbW1wiYXNzZXJ0UGFzc2FibGVTeW1ib2xcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhc3NhYmxlU3ltYm9sID0gJGjigI1fYSldXSxbXCJuYW1lRm9yUGFzc2FibGVTeW1ib2xcIiwgWyRo4oCNX2EgPT4gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9ICRo4oCNX2EpXV0sW1wicGFzc2FibGVTeW1ib2xGb3JOYW1lXCIsIFskaOKAjV9hID0+IChwYXNzYWJsZVN5bWJvbEZvck5hbWUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlBhc3NhYmxlfSBQYXNzYWJsZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuRW5jb2Rpbmd9IEVuY29kaW5nICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5SZW1vdGFibGV9IFJlbW90YWJsZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuRW5jb2RpbmdVbmlvbn0gRW5jb2RpbmdVbmlvbiAqL1xuXG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7aXNBcnJheX09QXJyYXk7XG5jb25zdHtcbmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMsXG5kZWZpbmVQcm9wZXJ0aWVzLFxuaXMsXG5mcm9tRW50cmllcyxcbmZyZWV6ZX09XG5PYmplY3Q7XG5jb25zdHtkZXRhaWxzOlgscXVvdGU6cX09YXNzZXJ0O1xuXG4vKipcbiAqIFNwZWNpYWwgcHJvcGVydHkgbmFtZSB0aGF0IGluZGljYXRlcyBhbiBlbmNvZGluZyB0aGF0IG5lZWRzIHNwZWNpYWxcbiAqIGRlY29kaW5nLlxuICovXG5jb25zdCBRQ0xBU1M9J0BxY2xhc3MnOyRo4oCNX29uY2UuUUNMQVNTKFFDTEFTUyk7XG5cblxuLyoqXG4gKiBAcGFyYW0ge0VuY29kaW5nfSBlbmNvZGVkXG4gKiBAcmV0dXJucyB7ZW5jb2RlZCBpcyBFbmNvZGluZ1VuaW9ufVxuICovXG5jb25zdCBoYXNRQ2xhc3M9KGVuY29kZWQpPT5oYXNPd25Qcm9wZXJ0eU9mKGVuY29kZWQsUUNMQVNTKTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBFbmNvZGVUb0NhcERhdGFPcHRpb25zXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgcmVtb3RhYmxlOiBSZW1vdGFibGUsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IEVuY29kaW5nXG4gKiApID0+IEVuY29kaW5nfSBbZW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIHByb21pc2U6IFByb21pc2UsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IEVuY29kaW5nXG4gKiApID0+IEVuY29kaW5nfSBbZW5jb2RlUHJvbWlzZVRvQ2FwRGF0YV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlcnJvcjogRXJyb3IsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IEVuY29kaW5nXG4gKiApID0+IEVuY29kaW5nfSBbZW5jb2RlRXJyb3JUb0NhcERhdGFdXG4gKi9cblxuY29uc3QgZG9udEVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YT0ocmVtKT0+XG5hc3NlcnQuZmFpbChYIGByZW1vdGFibGUgdW5leHBlY3RlZDogJHtyZW19YCk7XG5cbmNvbnN0IGRvbnRFbmNvZGVQcm9taXNlVG9DYXBEYXRhPShwcm9tKT0+XG5hc3NlcnQuZmFpbChYIGBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7cHJvbX1gKTtcblxuY29uc3QgZG9udEVuY29kZUVycm9yVG9DYXBEYXRhPShlcnIpPT5cbmFzc2VydC5mYWlsKFggYGVycm9yIG9iamVjdCB1bmV4cGVjdGVkOiAke2Vycn1gKTtcblxuLyoqXG4gKiBAcGFyYW0ge0VuY29kZVRvQ2FwRGF0YU9wdGlvbnN9IFtlbmNvZGVPcHRpb25zXVxuICogQHJldHVybnMgeyhwYXNzYWJsZTogUGFzc2FibGUpID0+IEVuY29kaW5nfVxuICovXG5jb25zdCAgICAgICAgbWFrZUVuY29kZVRvQ2FwRGF0YT0oe1xuZW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhPWRvbnRFbmNvZGVSZW1vdGFibGVUb0NhcERhdGEsXG5lbmNvZGVQcm9taXNlVG9DYXBEYXRhPWRvbnRFbmNvZGVQcm9taXNlVG9DYXBEYXRhLFxuZW5jb2RlRXJyb3JUb0NhcERhdGE9ZG9udEVuY29kZUVycm9yVG9DYXBEYXRhfT1cbnt9KT0+e1xuLyoqXG4gKiBNdXN0IGVuY29kZSBgdmFsYCBpbnRvIHBsYWluIEpTT04gZGF0YSAqY2Fub25pY2FsbHkqLCBzdWNoIHRoYXRcbiAqIGBKU09OLnN0cmluZ2lmeShlbmNvZGUodjEpKSA9PT0gSlNPTi5zdHJpbmdpZnkoZW5jb2RlKHYxKSlgLiBGb3IgbW9zdFxuICogZW5jb2RpbmdzLCB0aGUgb3JkZXIgb2YgcHJvcGVydGllcyBvZiBlYWNoIG5vZGUgb2YgdGhlIG91dHB1dFxuICogc3RydWN0dXJlIGlzIGRldGVybWluZWQgYnkgdGhlIGFsZ29yaXRobSBiZWxvdyB3aXRob3V0IHNwZWNpYWxcbiAqIGFycmFuZ2VtZW50LCB1c3VhbGx5IGJ5IGJlaW5nIGV4cHJlc3NlZCBkaXJlY3RseSBhcyBhbiBvYmplY3QgbGl0ZXJhbC5cbiAqIFRoZSBleGNlcHRpb24gaXMgY29weVJlY29yZHMsIHdob3NlIG5hdHVyYWwgZW51bWVyYXRpb24gb3JkZXJcbiAqIGNhbiBkaWZmZXIgYmV0d2VlbiBjb3B5UmVjb3JkcyB0aGF0IG91ciBkaXN0cmlidXRlZCBvYmplY3Qgc2VtYW50aWNzXG4gKiBjb25zaWRlcnMgdG8gYmUgZXF1aXZhbGVudC5cbiAqIFNpbmNlLCBmb3IgZWFjaCBjb3B5UmVjb3JkLCB3ZSBvbmx5IGFjY2VwdCBzdHJpbmcgcHJvcGVydHkgbmFtZXMsXG4gKiBub3Qgc3ltYm9scywgd2UgY2FuIGNhbm9uaWNhbGx5IHNvcnQgdGhlIG5hbWVzIGZpcnN0LlxuICogSlNPTi5zdHJpbmdpZnkgd2lsbCB0aGVuIHZpc2l0IHRoZXNlIGluIHRoYXQgc29ydGVkIG9yZGVyLlxuICpcbiAqIEVuY29kaW5nIHdpdGggYSBjYW5vbmljYWwtSlNPTiBlbmNvZGVyIHdvdWxkIGFsc28gc29sdmUgdGhpcyBjYW5vbmljYWxuZXNzXG4gKiBwcm9ibGVtIGluIGEgbW9yZSBtb2R1bGFyIGFuZCBlbmNhcHN1bGF0ZWQgbWFubmVyLiBOb3RlIHRoYXQgdGhlXG4gKiBhY3R1YWwgb3JkZXIgcHJvZHVjZWQgaGVyZSwgdGhvdWdoIGl0IGFncmVlcyB3aXRoIGNhbm9uaWNhbC1KU09OIG9uXG4gKiBjb3B5UmVjb3JkIHByb3BlcnR5IG9yZGVyaW5nLCBkaWZmZXJzIGZyb20gY2Fub25pY2FsLUpTT04gYXMgYSB3aG9sZVxuICogaW4gdGhhdCB0aGUgb3RoZXIgcmVjb3JkIHByb3BlcnRpZXMgYXJlIHZpc2l0ZWQgaW4gdGhlIG9yZGVyIGluIHdoaWNoXG4gKiB0aGV5IGFyZSBsaXRlcmFsbHkgd3JpdHRlbiBiZWxvdy4gVE9ETyBwZXJoYXBzIHdlIHNob3VsZCBpbmRlZWQgc3dpdGNoXG4gKiB0byBhIGNhbm9uaWNhbCBKU09OIGVuY29kZXIsIGFuZCBub3QgZGVsaWNhdGV0bHkgZGVwZW5kIG9uIHRoZSBvcmRlclxuICogaW4gd2hpY2ggdGhlc2Ugb2JqZWN0IGxpdGVyYWxzIGFyZSB3cml0dGVuLlxuICpcbiAqIFJlYWRlcnMgbXVzdCBub3QgY2FyZSBhYm91dCB0aGlzIG9yZGVyIGFueXdheS4gV2UgaW1wb3NlIHRoaXMgcmVxdWlyZW1lbnRcbiAqIG1haW5seSB0byByZWR1Y2Ugbm9uLWRldGVybWluaXNtIGV4cG9zZWQgb3V0c2lkZSBhIHZhdC5cbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBwYXNzYWJsZVxuICogQHJldHVybnMge0VuY29kaW5nfSBleGNlcHQgdGhhdCBgZW5jb2RlVG9DYXBEYXRhYCBkb2VzIG5vdCBnZW5lcmFsbHlcbiAqIGBoYXJkZW5gIHRoaXMgcmVzdWx0IGJlZm9yZSByZXR1cm5pbmcuIFJhdGhlciwgYGVuY29kZVRvQ2FwRGF0YWAgaXMgbm90XG4gKiBkaXJlY3RseSBleHBvc2VkLlxuICogV2hhdCdzIGV4cG9zZWQgaW5zdGVhZCBpcyBhIHdyYXBwZXIgdGhhdCBmcmVlemVzIHRoZSBvdXRwdXQgYmVmb3JlXG4gKiByZXR1cm5pbmcuIElmIHRoaXMgdHVybnMgb3V0IHRvIGltcGVkZSBzdGF0aWMgYW5hbHlzaXMgZm9yIGBoYXJkZW5gIHNhZmV0eSxcbiAqIHdlIGNhbiBhbHdheXMgcHV0IHRoZSAobm93IHJlZHVuZGFudCkgaGFyZGVucyBiYWNrIGluLiBUaGV5IGRvbid0IGh1cnQuXG4gKi9cbmNvbnN0IGVuY29kZVRvQ2FwRGF0YVJlY3VyPShwYXNzYWJsZSk9Pntcbi8qIEZpcnN0IHdlIGhhbmRsZSBhbGwgcHJpbWl0aXZlcy4gU29tZSBjYW4gYmUgcmVwcmVzZW50ZWQgZGlyZWN0bHkgYXMqL1xuLyogSlNPTiwgYW5kIHNvbWUgbXVzdCBiZSBlbmNvZGVkIGFzIFtRQ0xBU1NdIGNvbXBvc2l0ZXMuKi9cbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihwYXNzYWJsZSk7XG5zd2l0Y2gocGFzc1N0eWxlKXtcbmNhc2UnbnVsbCc6e1xucmV0dXJuIG51bGw7XG4gfVxuY2FzZSd1bmRlZmluZWQnOntcbnJldHVybntbUUNMQVNTXTondW5kZWZpbmVkJ307XG4gfVxuY2FzZSdzdHJpbmcnOlxuY2FzZSdib29sZWFuJzp7XG5yZXR1cm4gcGFzc2FibGU7XG4gfVxuY2FzZSdudW1iZXInOntcbmlmKE51bWJlci5pc05hTihwYXNzYWJsZSkpe1xucmV0dXJue1tRQ0xBU1NdOidOYU4nfTtcbiB9XG5pZihpcyhwYXNzYWJsZSwtMCkpe1xucmV0dXJuIDA7XG4gfVxuaWYocGFzc2FibGU9PT1JbmZpbml0eSl7XG5yZXR1cm57W1FDTEFTU106J0luZmluaXR5J307XG4gfVxuaWYocGFzc2FibGU9PT0tSW5maW5pdHkpe1xucmV0dXJue1tRQ0xBU1NdOictSW5maW5pdHknfTtcbiB9XG5yZXR1cm4gcGFzc2FibGU7XG4gfVxuY2FzZSdiaWdpbnQnOntcbnJldHVybntcbltRQ0xBU1NdOidiaWdpbnQnLFxuZGlnaXRzOlN0cmluZyhwYXNzYWJsZSl9O1xuXG4gfVxuY2FzZSdzeW1ib2wnOntcbmFzc2VydFBhc3NhYmxlU3ltYm9sKHBhc3NhYmxlKTtcbmNvbnN0IG5hbWU9LyoqIEB0eXBlIHtzdHJpbmd9ICovbmFtZUZvclBhc3NhYmxlU3ltYm9sKHBhc3NhYmxlKTtcbnJldHVybntcbltRQ0xBU1NdOidzeW1ib2wnLFxubmFtZX07XG5cbiB9XG5jYXNlJ2NvcHlSZWNvcmQnOntcbmlmKGhhc093blByb3BlcnR5T2YocGFzc2FibGUsUUNMQVNTKSl7XG4vKiBIaWxiZXJ0IGhvdGVsKi9cbmNvbnN0e1tRQ0xBU1NdOnFjbGFzc1ZhbHVlLC4uLnJlc3R9PXBhc3NhYmxlO1xuLyoqIEB0eXBlIHtFbmNvZGluZ30gKi9cbmNvbnN0IHJlc3VsdD17XG5bUUNMQVNTXTonaGlsYmVydCcsXG5vcmlnaW5hbDplbmNvZGVUb0NhcERhdGFSZWN1cihxY2xhc3NWYWx1ZSl9O1xuXG5pZihvd25LZXlzKHJlc3QpLmxlbmd0aD49MSl7XG4vKiBXZSBoYXJkZW4gdGhlIGVudGlyZSBjYXBEYXRhIGVuY29kaW5nIGJlZm9yZSB3ZSByZXR1cm4gaXQuKi9cbi8qIGBlbmNvZGVUb0NhcERhdGFgIHJlcXVpcmVzIHRoYXQgaXRzIGlucHV0IGJlIFBhc3NhYmxlLCBhbmQqL1xuLyogdGhlcmVmb3JlIGhhcmRlbmVkLiovXG4vKiBUaGUgYGZyZWV6ZWAgaGVyZSBpcyBuZWVkZWQgYW55d2F5LCBiZWNhdXNlIHRoZSBgcmVzdGAgaXMqL1xuLyogZnJlc2hseSBjb25zdHJ1Y3RlZCBieSB0aGUgYC4uLmAgYWJvdmUsIGFuZCB3ZSdyZSB1c2luZyBpdCovXG4vKiBhcyBpbXB1dCBpbiBhbm90aGVyIGNhbGwgdG8gYGVuY29kZVRvQ2FwRGF0YWAuKi9cbnJlc3VsdC5yZXN0PWVuY29kZVRvQ2FwRGF0YVJlY3VyKGZyZWV6ZShyZXN0KSk7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9XG4vKiBDdXJyZW50bHkgY29weVJlY29yZCBhbGxvd3Mgb25seSBzdHJpbmcga2V5cyBzbyB0aGlzIHdpbGwqL1xuLyogd29yay4gSWYgd2UgYWxsb3cgc29ydGFibGUgc3ltYm9sIGtleXMsIHRoaXMgd2lsbCBuZWVkIHRvKi9cbi8qIGJlY29tZSBtb3JlIGludGVyZXN0aW5nLiovXG5jb25zdCBuYW1lcz1vd25LZXlzKHBhc3NhYmxlKS5zb3J0KCk7XG5yZXR1cm4gZnJvbUVudHJpZXMoXG5uYW1lcy5tYXAoKG5hbWUpPT5bbmFtZSxlbmNvZGVUb0NhcERhdGFSZWN1cihwYXNzYWJsZVtuYW1lXSldKSk7XG5cbiB9XG5jYXNlJ2NvcHlBcnJheSc6e1xucmV0dXJuIHBhc3NhYmxlLm1hcChlbmNvZGVUb0NhcERhdGFSZWN1cik7XG4gfVxuY2FzZSd0YWdnZWQnOntcbnJldHVybntcbltRQ0xBU1NdOid0YWdnZWQnLFxudGFnOmdldFRhZyhwYXNzYWJsZSksXG5wYXlsb2FkOmVuY29kZVRvQ2FwRGF0YVJlY3VyKHBhc3NhYmxlLnBheWxvYWQpfTtcblxuIH1cbmNhc2UncmVtb3RhYmxlJzp7XG5yZXR1cm4gZW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhKHBhc3NhYmxlLGVuY29kZVRvQ2FwRGF0YVJlY3VyKTtcbiB9XG5jYXNlJ2Vycm9yJzp7XG5yZXR1cm4gZW5jb2RlRXJyb3JUb0NhcERhdGEocGFzc2FibGUsZW5jb2RlVG9DYXBEYXRhUmVjdXIpO1xuIH1cbmNhc2UncHJvbWlzZSc6e1xucmV0dXJuIGVuY29kZVByb21pc2VUb0NhcERhdGEocGFzc2FibGUsZW5jb2RlVG9DYXBEYXRhUmVjdXIpO1xuIH1cbmRlZmF1bHQ6e1xuYXNzZXJ0LmZhaWwoXG5YIGBpbnRlcm5hbDogVW5yZWNvZ25pemVkIHBhc3NTdHlsZSAke3EocGFzc1N0eWxlKX1gLFxuVHlwZUVycm9yKTtcblxuIH19XG5cbiB9O1xuY29uc3QgZW5jb2RlVG9DYXBEYXRhPShwYXNzYWJsZSk9PntcbmlmKEVycm9ySGVscGVyLmNhbkJlVmFsaWQocGFzc2FibGUsKHgpPT54KSl7XG4vKiBXZSBwdWxsIG91dCB0aGlzIHNwZWNpYWwgY2FzZSB0byBhY2NvbW1vZGF0ZSBlcnJvcnMgdGhhdCBhcmUgbm90Ki9cbi8qIHZhbGlkIFBhc3NhYmxlcy4gRm9yIGV4YW1wbGUsIGJlY2F1c2UgdGhleSdyZSBub3QgZnJvemVuLiovXG4vKiBUaGUgc3BlY2lhbCBjYXNlIGNhbiBvbmx5IGV2ZXIgYXBwbHkgYXQgdGhlIHJvb3QsIGFuZCB0aGVyZWZvcmUqL1xuLyogb3V0c2lkZSB0aGUgcmVjdXJzaW9uLCBzaW5jZSBhbiBlcnJvciBjb3VsZCBvbmx5IGJlIGRlZXBlciBpbiovXG4vKiBhIHBhc3NhYmxlIHN0cnVjdHVyZSBpZiBpdCB3ZXJlIHBhc3NhYmxlLiovXG4vKiovXG4vKiBXZSBwdWxsIG91dCB0aGlzIHNwZWNpYWwgY2FzZSBiZWNhdXNlLCBmb3IgdGhlc2UgZXJyb3JzLCB3ZSdyZSBtdWNoKi9cbi8qIG1vcmUgaW50ZXJlc3RlZCBpbiByZXBvcnRpbmcgd2hhdGV2ZXIgZGlhZ25vc3RpYyBpbmZvcm1hdGlvbiB0aGV5Ki9cbi8qIGNhcnJ5IHRoYW4gd2UgYXJlIGFib3V0IHJlcG9ydGluZyBwcm9ibGVtcyBlbmNvdW50ZXJlZCBpbiByZXBvcnRpbmcqL1xuLyogdGhpcyBpbmZvcm1hdGlvbi4qL1xucmV0dXJuIGhhcmRlbihlbmNvZGVFcnJvclRvQ2FwRGF0YShwYXNzYWJsZSxlbmNvZGVUb0NhcERhdGFSZWN1cikpO1xuIH1cbnJldHVybiBoYXJkZW4oZW5jb2RlVG9DYXBEYXRhUmVjdXIocGFzc2FibGUpKTtcbiB9O1xucmV0dXJuIGhhcmRlbihlbmNvZGVUb0NhcERhdGEpO1xuIH07JGjigI1fb25jZS5tYWtlRW5jb2RlVG9DYXBEYXRhKG1ha2VFbmNvZGVUb0NhcERhdGEpO1xuaGFyZGVuKG1ha2VFbmNvZGVUb0NhcERhdGEpO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IERlY29kZU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkUmVtb3RhYmxlOiBFbmNvZGluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlOiBFbmNvZGluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gKFByb21pc2V8UmVtb3RhYmxlKX0gW2RlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRQcm9taXNlOiBFbmNvZGluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlOiBFbmNvZGluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gKFByb21pc2V8UmVtb3RhYmxlKX0gW2RlY29kZVByb21pc2VGcm9tQ2FwRGF0YV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkRXJyb3I6IEVuY29kaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGU6IEVuY29kaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiBFcnJvcn0gW2RlY29kZUVycm9yRnJvbUNhcERhdGFdXG4gKi9cblxuY29uc3QgZG9udERlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhPShzbG90RW5jb2RpbmcpPT5cbmFzc2VydC5mYWlsKFggYHJlbW90YWJsZSBvciBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7c2xvdEVuY29kaW5nfWApO1xuY29uc3QgZG9udERlY29kZUVycm9yRnJvbUNhcERhdGE9KGVycm9yRW5jb2RpbmcpPT5cbmFzc2VydC5mYWlsKFggYGVycm9yIHVuZXhwZWN0ZWQ6ICR7ZXJyb3JFbmNvZGluZ31gKTtcblxuLyoqXG4gKiBUaGUgY3VycmVudCBlbmNvZGluZyBkb2VzIG5vdCBnaXZlIHRoZSBkZWNvZGVyIGVub3VnaCBpbnRvIHRvIGRpc3Rpbmd1aXNoXG4gKiB3aGV0aGVyIGEgc2xvdCByZXByZXNlbnRzIGEgcHJvbWlzZSBvciBhIHJlbW90YWJsZS4gQXMgYW4gaW1wbGVtZW50YXRpb25cbiAqIHJlc3RyaWN0aW9uIHVudGlsIHRoaXMgaXMgZml4ZWQsIGlmIGVpdGhlciBpcyBwcm92aWRlZCwgYm90aCBtdXN0IGJlXG4gKiBwcm92aWRlZCBhbmQgdGhleSBtdXN0IGJlIHRoZSBzYW1lLlxuICpcbiAqIFRoaXMgc2VlbXMgbGlrZSB0aGUgYmVzdCBzdGFydGluZyBwb2ludCB0byBpbmNyZW1lbnRhbGx5IGV2b2x2ZSB0byBhblxuICogQVBJIHdoZXJlIHRoZXNlIGNhbiByZWxpYWJseSBkaWZmZXIuXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80MzM0XG4gKlxuICogQHBhcmFtIHtEZWNvZGVPcHRpb25zfSBbZGVjb2RlT3B0aW9uc11cbiAqIEByZXR1cm5zIHsoZW5jb2RlZDogRW5jb2RpbmcpID0+IFBhc3NhYmxlfVxuICovXG5jb25zdCAgICAgICAgbWFrZURlY29kZUZyb21DYXBEYXRhPSh7XG5kZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YT1kb250RGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGEsXG5kZWNvZGVQcm9taXNlRnJvbUNhcERhdGE9ZG9udERlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhLFxuZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YT1kb250RGVjb2RlRXJyb3JGcm9tQ2FwRGF0YX09XG57fSk9PntcbmFzc2VydChcbmRlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhPT09ZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhLFxuWCBgQW4gaW1wbGVtZW50YXRpb24gcmVzdHJpY3Rpb24gZm9yIG5vdzogSWYgZWl0aGVyIGRlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhIG9yIGRlY29kZVByb21pc2VGcm9tQ2FwRGF0YSBpcyBwcm92aWRlZCwgYm90aCBtdXN0IGJlIHByb3ZpZGVkIGFuZCB0aGV5IG11c3QgYmUgdGhlIHNhbWU6ICR7cShcbmRlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhKVxuIH0gdnMgJHtxKGRlY29kZVByb21pc2VGcm9tQ2FwRGF0YSl9YCk7XG5cblxuLyoqXG4gKiBgZGVjb2RlRnJvbUNhcERhdGFgIG1heSByZWx5IG9uIGBqc29uRW5jb2RlZGAgYmVpbmcgdGhlIHJlc3VsdCBvZiBhXG4gKiBwbGFpbiBjYWxsIHRvIEpTT04ucGFyc2UuIEhvd2V2ZXIsIGl0ICpjYW5ub3QqIHJlbHkgb24gYGpzb25FbmNvZGVkYFxuICogaGF2aW5nIGJlZW4gcHJvZHVjZWQgYnkgSlNPTi5zdHJpbmdpZnkgb24gdGhlIG91dHB1dCBvZiBgZW5jb2RlVG9DYXBEYXRhYFxuICogYWJvdmUsIGkuZS4sIGBkZWNvZGVGcm9tQ2FwRGF0YWAgY2Fubm90IHJlbHkgb24gYGpzb25FbmNvZGVkYCBiZWluZyBhXG4gKiB2YWxpZCBtYXJzaGFsbGVkIHJlcHJlc2VudGF0aW9uLiBSYXRoZXIsIGBkZWNvZGVGcm9tQ2FwRGF0YWAgbXVzdFxuICogdmFsaWRhdGUgdGhhdC5cbiAqXG4gKiBAcGFyYW0ge0VuY29kaW5nfSBqc29uRW5jb2RlZCBtdXN0IGJlIGhhcmRlbmVkXG4gKi9cbmNvbnN0IGRlY29kZUZyb21DYXBEYXRhPShqc29uRW5jb2RlZCk9PntcbmlmKCFpc09iamVjdChqc29uRW5jb2RlZCkpe1xuLyogcHJpbWl0aXZlcyBwYXNzIHRocm91Z2gqL1xucmV0dXJuIGpzb25FbmNvZGVkO1xuIH1cbi8qIEFzc2VydGlvbnMgb2YgdGhlIGFib3ZlIHRvIG5hcnJvdyB0aGUgdHlwZS4qL1xuYXNzZXJ0KGlzT2JqZWN0KGpzb25FbmNvZGVkKSk7XG5pZihoYXNRQ2xhc3MoanNvbkVuY29kZWQpKXtcbmNvbnN0IHFjbGFzcz1qc29uRW5jb2RlZFtRQ0xBU1NdO1xuYXNzZXJ0LnR5cGVvZihcbnFjbGFzcyxcbidzdHJpbmcnLFxuWCBgaW52YWxpZCBxY2xhc3MgdHlwZW9mICR7cSh0eXBlb2YgcWNsYXNzKX1gKTtcblxuYXNzZXJ0KCFpc0FycmF5KGpzb25FbmNvZGVkKSk7XG5zd2l0Y2gocWNsYXNzKXtcbi8qIEVuY29kaW5nIG9mIHByaW1pdGl2ZXMgbm90IGhhbmRsZWQgYnkgSlNPTiovXG5jYXNlJ3VuZGVmaW5lZCc6e1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG5jYXNlJ05hTic6e1xucmV0dXJuIE5hTjtcbiB9XG5jYXNlJ0luZmluaXR5Jzp7XG5yZXR1cm4gSW5maW5pdHk7XG4gfVxuY2FzZSctSW5maW5pdHknOntcbnJldHVybi1JbmZpbml0eTtcbiB9XG5jYXNlJ2JpZ2ludCc6e1xuLyogVXNpbmcgQHRzLWlnbm9yZSByYXRoZXIgdGhhbiBAdHMtZXhwZWN0LWVycm9yIGJlbG93IGJlY2F1c2UqL1xuLyogd2l0aCBAdHMtZXhwZWN0LWVycm9yIEkgZ2V0IGEgcmVkIHVuZGVybGluZSBpbiB2c2NvZGUsIGJ1dCovXG4vKiB3aXRob3V0IGl0IEkgZ2V0IGVycm9ycyBmcm9tIGB5YXJuIGxpbnRgLiovXG4vKiBAdHMtaWdub3JlIGluYWRlcXVhdGUgdHlwZSBpbmZlcmVuY2UqL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzEyNTkjZGlzY3Vzc2lvbl9yOTU0NTYxOTAxKi9cbmNvbnN0e2RpZ2l0c309anNvbkVuY29kZWQ7XG5hc3NlcnQudHlwZW9mKFxuZGlnaXRzLFxuJ3N0cmluZycsXG5YIGBpbnZhbGlkIGRpZ2l0cyB0eXBlb2YgJHtxKHR5cGVvZiBkaWdpdHMpfWApO1xuXG5yZXR1cm4gQmlnSW50KGRpZ2l0cyk7XG4gfVxuY2FzZSdAQGFzeW5jSXRlcmF0b3InOntcbi8qIERlcHJlY2F0ZWQgcWNsYXNzLiBUT0RPIG1ha2UgY29uZGl0aW9uYWwqL1xuLyogb24gZW52aXJvbm1lbnQgdmFyaWFibGUuIEV2ZW50dWFsbHkgcmVtb3ZlLCBidXQgYWZ0ZXIgY29uZmlkZW50Ki9cbi8qIHRoYXQgdGhlcmUgYXJlIG5vIG1vcmUgc3VwcG9ydGVkIHNlbmRlcnMuKi9cbi8qKi9cbi8qIFVzaW5nIEB0cy1pZ25vcmUgcmF0aGVyIHRoYW4gQHRzLWV4cGVjdC1lcnJvciBiZWxvdyBiZWNhdXNlKi9cbi8qIHdpdGggQHRzLWV4cGVjdC1lcnJvciBJIGdldCBhIHJlZCB1bmRlcmxpbmUgaW4gdnNjb2RlLCBidXQqL1xuLyogd2l0aG91dCBpdCBJIGdldCBlcnJvcnMgZnJvbSBgeWFybiBsaW50YC4qL1xuLyogQHRzLWlnbm9yZSBpbmFkZXF1YXRlIHR5cGUgaW5mZXJlbmNlKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xMjU5I2Rpc2N1c3Npb25fcjk1NDU2MTkwMSovXG5yZXR1cm4gU3ltYm9sLmFzeW5jSXRlcmF0b3I7XG4gfVxuY2FzZSdzeW1ib2wnOntcbi8qIFVzaW5nIEB0cy1pZ25vcmUgcmF0aGVyIHRoYW4gQHRzLWV4cGVjdC1lcnJvciBiZWxvdyBiZWNhdXNlKi9cbi8qIHdpdGggQHRzLWV4cGVjdC1lcnJvciBJIGdldCBhIHJlZCB1bmRlcmxpbmUgaW4gdnNjb2RlLCBidXQqL1xuLyogd2l0aG91dCBpdCBJIGdldCBlcnJvcnMgZnJvbSBgeWFybiBsaW50YC4qL1xuLyogQHRzLWlnbm9yZSBpbmFkZXF1YXRlIHR5cGUgaW5mZXJlbmNlKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xMjU5I2Rpc2N1c3Npb25fcjk1NDU2MTkwMSovXG5jb25zdHtuYW1lfT1qc29uRW5jb2RlZDtcbnJldHVybiBwYXNzYWJsZVN5bWJvbEZvck5hbWUobmFtZSk7XG4gfVxuXG5jYXNlJ3RhZ2dlZCc6e1xuLyogVXNpbmcgQHRzLWlnbm9yZSByYXRoZXIgdGhhbiBAdHMtZXhwZWN0LWVycm9yIGJlbG93IGJlY2F1c2UqL1xuLyogd2l0aCBAdHMtZXhwZWN0LWVycm9yIEkgZ2V0IGEgcmVkIHVuZGVybGluZSBpbiB2c2NvZGUsIGJ1dCovXG4vKiB3aXRob3V0IGl0IEkgZ2V0IGVycm9ycyBmcm9tIGB5YXJuIGxpbnRgLiovXG4vKiBAdHMtaWdub3JlIGluYWRlcXVhdGUgdHlwZSBpbmZlcmVuY2UqL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzEyNTkjZGlzY3Vzc2lvbl9yOTU0NTYxOTAxKi9cbmNvbnN0e3RhZyxwYXlsb2FkfT1qc29uRW5jb2RlZDtcbnJldHVybiBtYWtlVGFnZ2VkKHRhZyxkZWNvZGVGcm9tQ2FwRGF0YShwYXlsb2FkKSk7XG4gfVxuXG5jYXNlJ2Vycm9yJzp7XG5yZXR1cm4gZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YShqc29uRW5jb2RlZCxkZWNvZGVGcm9tQ2FwRGF0YSk7XG4gfVxuXG5jYXNlJ3Nsb3QnOntcbi8qIFNlZSBub3RlIGFib3ZlIGFib3V0IGhvdyB0aGUgY3VycmVudCBlbmNvZGluZyBjYW5ub3QgcmVsaWFibHkqL1xuLyogZGlzdGluZ3Vpc2ggd2hpY2ggd2Ugc2hvdWxkIGNhbGwsIHNvIGluIHRoZSBub24tZGVmYXVsdCBjYXNlKi9cbi8qIGJvdGggbXVzdCBiZSB0aGUgc2FtZSBhbmQgaXQgZG9lc24ndCBtYXR0ZXIgd2hpY2ggd2UgY2FsbC4qL1xucmV0dXJuIGRlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhKGpzb25FbmNvZGVkLGRlY29kZUZyb21DYXBEYXRhKTtcbiB9XG5cbmNhc2UnaGlsYmVydCc6e1xuLyogVXNpbmcgQHRzLWlnbm9yZSByYXRoZXIgdGhhbiBAdHMtZXhwZWN0LWVycm9yIGJlbG93IGJlY2F1c2UqL1xuLyogd2l0aCBAdHMtZXhwZWN0LWVycm9yIEkgZ2V0IGEgcmVkIHVuZGVybGluZSBpbiB2c2NvZGUsIGJ1dCovXG4vKiB3aXRob3V0IGl0IEkgZ2V0IGVycm9ycyBmcm9tIGB5YXJuIGxpbnRgLiovXG4vKiBAdHMtaWdub3JlIGluYWRlcXVhdGUgdHlwZSBpbmZlcmVuY2UqL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzEyNTkjZGlzY3Vzc2lvbl9yOTU0NTYxOTAxKi9cbmNvbnN0e29yaWdpbmFsLHJlc3R9PWpzb25FbmNvZGVkO1xuaGFzT3duUHJvcGVydHlPZihqc29uRW5jb2RlZCwnb3JpZ2luYWwnKXx8XG5hc3NlcnQuZmFpbChYIGBJbnZhbGlkIEhpbGJlcnQgSG90ZWwgZW5jb2RpbmcgJHtqc29uRW5jb2RlZH1gKTtcbi8qIERvbid0IGhhcmRlbiBzaW5jZSB3ZSdyZSBub3QgZG9uZSBtdXRhdGluZyBpdCovXG5jb25zdCByZXN1bHQ9e1tRQ0xBU1NdOmRlY29kZUZyb21DYXBEYXRhKG9yaWdpbmFsKX07XG5pZihoYXNPd25Qcm9wZXJ0eU9mKGpzb25FbmNvZGVkLCdyZXN0Jykpe1xuYXNzZXJ0KFxudHlwZW9mIHJlc3Q9PT0nb2JqZWN0JyYmXG5yZXN0IT09bnVsbCYmXG5vd25LZXlzKHJlc3QpLmxlbmd0aD49MSxcblggYFJlc3QgZW5jb2RpbmcgbXVzdCBiZSBhIG5vbi1lbXB0eSBvYmplY3Q6ICR7cmVzdH1gKTtcblxuY29uc3QgcmVzdE9iaj1kZWNvZGVGcm9tQ2FwRGF0YShyZXN0KTtcbi8qIFRPRE8gcmVhbGx5IHNob3VsZCBhc3NlcnQgdGhhdCBgcGFzc1N0eWxlT2YocmVzdClgIGlzKi9cbi8qIGAnY29weVJlY29yZCdgIGJ1dCB3ZSdkIGhhdmUgdG8gaGFyZGVuIGl0IGFuZCBpdCBpcyB0b28qL1xuLyogZWFybHkgdG8gZG8gdGhhdC4qL1xuIWhhc093blByb3BlcnR5T2YocmVzdE9iaixRQ0xBU1MpfHxcbmFzc2VydC5mYWlsKFxuWCBgUmVzdCBtdXN0IG5vdCBjb250YWluIGl0cyBvd24gZGVmaW5pdGlvbiBvZiAke3EoUUNMQVNTKX1gKTtcblxuZGVmaW5lUHJvcGVydGllcyhyZXN1bHQsZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhyZXN0T2JqKSk7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9XG5cbi8qIEB0cy1leHBlY3QtZXJyb3IgVGhpcyBpcyB0aGUgZXJyb3IgY2FzZSB3ZSdyZSB0ZXN0aW5nIGZvciovXG5jYXNlJ2liaWQnOntcbmFzc2VydC5mYWlsKFxuWCBgVGhlIGNhcERhdGEgcHJvdG9jb2wgbm8gbG9uZ2VyIHN1cHBvcnRzICR7cShRQ0xBU1MpfSAke3EoXG5xY2xhc3MpXG4gfWApO1xuXG4gfVxuZGVmYXVsdDp7XG5hc3NlcnQuZmFpbChYIGB1bnJlY29nbml6ZWQgJHtxKFFDTEFTUyl9ICR7cShxY2xhc3MpfWAsVHlwZUVycm9yKTtcbiB9fVxuXG4gfWVsc2UgaWYoaXNBcnJheShqc29uRW5jb2RlZCkpe1xuY29uc3QgcmVzdWx0PVtdO1xuY29uc3R7bGVuZ3RofT1qc29uRW5jb2RlZDtcbmZvcihsZXQgaT0wO2k8bGVuZ3RoO2krPTEpe1xucmVzdWx0W2ldPWRlY29kZUZyb21DYXBEYXRhKGpzb25FbmNvZGVkW2ldKTtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH1lbHNle1xuYXNzZXJ0KHR5cGVvZiBqc29uRW5jb2RlZD09PSdvYmplY3QnJiZqc29uRW5jb2RlZCE9PW51bGwpO1xuY29uc3QgcmVzdWx0PXt9O1xuZm9yKGNvbnN0IG5hbWUgb2Ygb3duS2V5cyhqc29uRW5jb2RlZCkpe1xuYXNzZXJ0LnR5cGVvZihcbm5hbWUsXG4nc3RyaW5nJyxcblggYFByb3BlcnR5ICR7bmFtZX0gb2YgJHtqc29uRW5jb2RlZH0gbXVzdCBiZSBhIHN0cmluZ2ApO1xuXG5yZXN1bHRbbmFtZV09ZGVjb2RlRnJvbUNhcERhdGEoanNvbkVuY29kZWRbbmFtZV0pO1xuIH1cbnJldHVybiByZXN1bHQ7XG4gfVxuIH07XG5yZXR1cm4gaGFyZGVuKGRlY29kZUZyb21DYXBEYXRhKTtcbiB9OyRo4oCNX29uY2UubWFrZURlY29kZUZyb21DYXBEYXRhKG1ha2VEZWNvZGVGcm9tQ2FwRGF0YSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiUUNMQVNTIjpbIlFDTEFTUyJdLCJtYWtlRW5jb2RlVG9DYXBEYXRhIjpbIm1ha2VFbmNvZGVUb0NhcERhdGEiXSwibWFrZURlY29kZUZyb21DYXBEYXRhIjpbIm1ha2VEZWNvZGVGcm9tQ2FwRGF0YSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADOBwY+Sj4AAEo+AAAtAAAAQGVuZG8vbWFyc2hhbC12MC43LjUvc3JjL2VuY29kZVRvU21hbGxjYXBzLmpzeyJpbXBvcnRzIjpbIi4vaGVscGVycy9lcnJvci5qcyIsIi4vaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vaGVscGVycy9zeW1ib2wuanMiLCIuL21ha2VUYWdnZWQuanMiLCIuL3Bhc3NTdHlsZU9mLmpzIl0sImV4cG9ydHMiOlsibWFrZURlY29kZUZyb21TbWFsbGNhcHMiLCJtYWtlRW5jb2RlVG9TbWFsbGNhcHMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgcGFzc1N0eWxlT2YsRXJyb3JIZWxwZXIsbWFrZVRhZ2dlZCxnZXRUYWcsaGFzT3duUHJvcGVydHlPZixhc3NlcnRQYXNzYWJsZVN5bWJvbCxuYW1lRm9yUGFzc2FibGVTeW1ib2wscGFzc2FibGVTeW1ib2xGb3JOYW1lOyRo4oCNX2ltcG9ydHMoW1tcIi4vcGFzc1N0eWxlT2YuanNcIiwgW1tcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvZXJyb3IuanNcIiwgW1tcIkVycm9ySGVscGVyXCIsIFskaOKAjV9hID0+IChFcnJvckhlbHBlciA9ICRo4oCNX2EpXV1dXSxbXCIuL21ha2VUYWdnZWQuanNcIiwgW1tcIm1ha2VUYWdnZWRcIiwgWyRo4oCNX2EgPT4gKG1ha2VUYWdnZWQgPSAkaOKAjV9hKV1dXV0sW1wiLi9oZWxwZXJzL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJnZXRUYWdcIiwgWyRo4oCNX2EgPT4gKGdldFRhZyA9ICRo4oCNX2EpXV0sW1wiaGFzT3duUHJvcGVydHlPZlwiLCBbJGjigI1fYSA9PiAoaGFzT3duUHJvcGVydHlPZiA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvc3ltYm9sLmpzXCIsIFtbXCJhc3NlcnRQYXNzYWJsZVN5bWJvbFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGFzc2FibGVTeW1ib2wgPSAkaOKAjV9hKV1dLFtcIm5hbWVGb3JQYXNzYWJsZVN5bWJvbFwiLCBbJGjigI1fYSA9PiAobmFtZUZvclBhc3NhYmxlU3ltYm9sID0gJGjigI1fYSldXSxbXCJwYXNzYWJsZVN5bWJvbEZvck5hbWVcIiwgWyRo4oCNX2EgPT4gKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlBhc3NhYmxlfSBQYXNzYWJsZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUmVtb3RhYmxlfSBSZW1vdGFibGUgKi9cbi8qIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuU21hbGxjYXBzRW5jb2Rpbmd9IFNtYWxsY2Fwc0VuY29kaW5nICpYLyovXG4vKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlNtYWxsY2Fwc0VuY29kaW5nVW5pb259IFNtYWxsY2Fwc0VuY29kaW5nVW5pb24gKlgvKi9cbi8qKiBAdHlwZWRlZiB7YW55fSBTbWFsbGNhcHNFbmNvZGluZyAqL1xuLyoqIEB0eXBlZGVmIHthbnl9IFNtYWxsY2Fwc0VuY29kaW5nVW5pb24gKi9cblxuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2lzQXJyYXl9PUFycmF5O1xuY29uc3R7aXMsZnJvbUVudHJpZXN9PU9iamVjdDtcbmNvbnN0e2RldGFpbHM6WCxxdW90ZTpxfT1hc3NlcnQ7XG5cbmNvbnN0IEJBTkc9JyEnLmNoYXJDb2RlQXQoMCk7XG5jb25zdCBEQVNIPSctJy5jaGFyQ29kZUF0KDApO1xuXG4vKipcbiAqIEFuIGBlbmNvZGVUb1NtYWxsY2Fwc2AgZnVuY3Rpb24gdGFrZXMgYSBwYXNzYWJsZSBhbmQgcmV0dXJucyBhXG4gKiBKU09OLXJlcHJlc2VudGFibGUgb2JqZWN0IChpLmUuLCByb3VuZC10cmlwcGluZyBpdCB0aHJvdWdoXG4gKiBgSlNPTi5zdHJpbmdpZnlgIGFuZCBgSlNPTi5wYXJzZWAgd2l0aCBubyByZXBsYWNlcnMgb3IgcmV2aXZlcnNcbiAqIHJldHVybnMgYW4gZXF1aXZhbGVudCBzdHJ1Y3R1cmUgZXhjZXB0IGZvciBvYmplY3QgaWRlbnRpdHkpLlxuICogV2UgY2FsbCB0aGlzIHJlcHJlc2VudGF0aW9uIGEgU21hbGxjYXBzIEVuY29kaW5nLlxuICpcbiAqIEEgYGRlY29kZUZyb21TbWFsbGNhcHNgIGZ1bmN0aW9uIHRha2VzIGFzIGFyZ3VtZW50IHdoYXQgaXRcbiAqICphc3N1bWVzKiBpcyB0aGUgcmVzdWx0IG9mIGEgcGxhaW4gYEpTT04ucGFyc2VgIHdpdGggbm8gcmVzb2x2ZXIuIEl0IHRoZW5cbiAqIG11c3QgdmFsaWRhdGUgdGhhdCBpdCBpcyBhIHZhbGlkIFNtYWxsY2FwcyBFbmNvZGluZywgYW5kIGlmIGl0IGlzLFxuICogcmV0dXJuIGEgY29ycmVzcG9uZGluZyBwYXNzYWJsZS5cbiAqXG4gKiBTbWFsbGNhcHMgY29uc2lkZXJzIHRoZSBjaGFyYWN0ZXJzIGJldHdlZW4gYCFgIChhc2NpaSBjb2RlIDMzLCBCQU5HKVxuICogYW5kIGAtYCAoYXNjaWkgY29kZSA0NSwgREFTSCkgdG8gYmUgc3BlY2lhbCBwcmVmaXhlcyBhbGxvd2luZ1xuICogcmVwcmVzZW50YXRpb24gb2YgSlNPTi1pbmNvbXBhdGlibGUgZGF0YSB1c2luZyBzdHJpbmdzLlxuICogVGhlc2UgY2hhcmFjdGVycywgaW4gb3JkZXIsIGFyZSBgIVwiIyQlJicoKSorLC1gXG4gKiBPZiB0aGVzZSwgc21hbGxjYXBzIGN1cnJlbnRseSB1c2VzIHRoZSBmb2xsb3dpbmc6XG4gKlxuICogICogYCFgIC0gZXNjYXBlZCBzdHJpbmdcbiAqICAqIGArYCAtIG5vbi1uZWdhdGl2ZSBiaWdpbnRcbiAqICAqIGAtYCAtIG5lZ2F0aXZlIGJpZ2ludFxuICogICogYCNgIC0gbWFuaWZlc3QgY29uc3RhbnRcbiAqICAqIGAlYCAtIHN5bWJvbFxuICogICogYCRgIC0gcmVtb3RhYmxlXG4gKiAgKiBgJmAgLSBwcm9taXNlXG4gKlxuICogQWxsIG90aGVyIHNwZWNpYWwgY2hhcmFjdGVycyAoYFwiJygpKixgKSBhcmUgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuXG4gKlxuICogVGhlIG1hbmlmZXN0IGNvbnN0YW50cyB0aGF0IHNtYWxsY2FwcyBjdXJyZW50bHkgdXNlcyBmb3IgdmFsdWVzOlxuICogICogYCN1bmRlZmluZWRgXG4gKiAgKiBgI05hTmBcbiAqICAqIGAjSW5maW5pdHlgXG4gKiAgKiBgIy1JbmZpbml0eWBcbiAqXG4gKiBhbmQgZm9yIHByb3BlcnR5IG5hbWVzIGFuYWxvZ291cyB0byBjYXBkYXRhIEBxY2xhc3M6XG4gKiAgKiBgI3RhZ2BcbiAqICAqIGAjZXJyb3JgXG4gKlxuICogQWxsIG90aGVyIGVuY29kZWQgc3RyaW5ncyBiZWdpbm5pbmcgd2l0aCBgI2AgYXJlIHJlc2VydmVkIGZvclxuICogZnV0dXJlIHVzZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5jb2RlZFN0clxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IHN0YXJ0c1NwZWNpYWw9KGVuY29kZWRTdHIpPT57XG5pZihlbmNvZGVkU3RyPT09Jycpe1xucmV0dXJuIGZhbHNlO1xuIH1cbi8qIGNoYXJDb2RlQXQoMCkgYW5kIG51bWJlciBjb21wYXJlIGlzIGEgYml0IGZhc3Rlci4qL1xuY29uc3QgY29kZT1lbmNvZGVkU3RyLmNoYXJDb2RlQXQoMCk7XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgeW9kYSovXG5yZXR1cm4gQkFORzw9Y29kZSYmY29kZTw9REFTSDtcbiB9O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEVuY29kZVRvU21hbGxjYXBzT3B0aW9uc1xuICogQHByb3BlcnR5IHsoXG4gKiAgIHJlbW90YWJsZTogUmVtb3RhYmxlLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBTbWFsbGNhcHNFbmNvZGluZ1xuICogKSA9PiBTbWFsbGNhcHNFbmNvZGluZ30gW2VuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIHByb21pc2U6IFByb21pc2UsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IFNtYWxsY2Fwc0VuY29kaW5nXG4gKiApID0+IFNtYWxsY2Fwc0VuY29kaW5nfSBbZW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVycm9yOiBFcnJvcixcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gU21hbGxjYXBzRW5jb2RpbmdcbiAqICkgPT4gU21hbGxjYXBzRW5jb2Rpbmd9IFtlbmNvZGVFcnJvclRvU21hbGxjYXBzXVxuICovXG5cbmNvbnN0IGRvbnRFbmNvZGVSZW1vdGFibGVUb1NtYWxsY2Fwcz0ocmVtKT0+XG5hc3NlcnQuZmFpbChYIGByZW1vdGFibGUgdW5leHBlY3RlZDogJHtyZW19YCk7XG5cbmNvbnN0IGRvbnRFbmNvZGVQcm9taXNlVG9TbWFsbGNhcHM9KHByb20pPT5cbmFzc2VydC5mYWlsKFggYHByb21pc2UgdW5leHBlY3RlZDogJHtwcm9tfWApO1xuXG5jb25zdCBkb250RW5jb2RlRXJyb3JUb1NtYWxsY2Fwcz0oZXJyKT0+XG5hc3NlcnQuZmFpbChYIGBlcnJvciBvYmplY3QgdW5leHBlY3RlZDogJHtxKGVycil9YCk7XG5cbi8qKlxuICogQHBhcmFtIHtFbmNvZGVUb1NtYWxsY2Fwc09wdGlvbnN9IFtlbmNvZGVPcHRpb25zXVxuICogQHJldHVybnMgeyhwYXNzYWJsZTogUGFzc2FibGUpID0+IFNtYWxsY2Fwc0VuY29kaW5nfVxuICovXG5jb25zdCAgICAgICAgbWFrZUVuY29kZVRvU21hbGxjYXBzPSh7XG5lbmNvZGVSZW1vdGFibGVUb1NtYWxsY2Fwcz1kb250RW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHMsXG5lbmNvZGVQcm9taXNlVG9TbWFsbGNhcHM9ZG9udEVuY29kZVByb21pc2VUb1NtYWxsY2FwcyxcbmVuY29kZUVycm9yVG9TbWFsbGNhcHM9ZG9udEVuY29kZUVycm9yVG9TbWFsbGNhcHN9PVxue30pPT57XG4vKipcbiAqIE11c3QgZW5jb2RlIGB2YWxgIGludG8gcGxhaW4gSlNPTiBkYXRhICpjYW5vbmljYWxseSosIHN1Y2ggdGhhdFxuICogYEpTT04uc3RyaW5naWZ5KGVuY29kZSh2MSkpID09PSBKU09OLnN0cmluZ2lmeShlbmNvZGUodjEpKWAuIEZvciBtb3N0XG4gKiBlbmNvZGluZ3MsIHRoZSBvcmRlciBvZiBwcm9wZXJ0aWVzIG9mIGVhY2ggbm9kZSBvZiB0aGUgb3V0cHV0XG4gKiBzdHJ1Y3R1cmUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgYWxnb3JpdGhtIGJlbG93IHdpdGhvdXQgc3BlY2lhbFxuICogYXJyYW5nZW1lbnQsIHVzdWFsbHkgYnkgYmVpbmcgZXhwcmVzc2VkIGRpcmVjdGx5IGFzIGFuIG9iamVjdCBsaXRlcmFsLlxuICogVGhlIGV4Y2VwdGlvbiBpcyBjb3B5UmVjb3Jkcywgd2hvc2UgbmF0dXJhbCBlbnVtZXJhdGlvbiBvcmRlclxuICogY2FuIGRpZmZlciBiZXR3ZWVuIGNvcHlSZWNvcmRzIHRoYXQgb3VyIGRpc3RyaWJ1dGVkIG9iamVjdCBzZW1hbnRpY3NcbiAqIGNvbnNpZGVycyB0byBiZSBlcXVpdmFsZW50LlxuICogU2luY2UsIGZvciBlYWNoIGNvcHlSZWNvcmQsIHdlIG9ubHkgYWNjZXB0IHN0cmluZyBwcm9wZXJ0eSBuYW1lcyxcbiAqIG5vdCBzeW1ib2xzLCB3ZSBjYW4gY2Fub25pY2FsbHkgc29ydCB0aGUgbmFtZXMgZmlyc3QuXG4gKiBKU09OLnN0cmluZ2lmeSB3aWxsIHRoZW4gdmlzaXQgdGhlc2UgaW4gdGhhdCBzb3J0ZWQgb3JkZXIuXG4gKlxuICogU21hbGxjYXBzRW5jb2Rpbmcgd2l0aCBhIGNhbm9uaWNhbC1KU09OIGVuY29kZXIgd291bGQgYWxzbyBzb2x2ZVxuICogdGhpcyBjYW5vbmljYWxuZXNzXG4gKiBwcm9ibGVtIGluIGEgbW9yZSBtb2R1bGFyIGFuZCBlbmNhcHN1bGF0ZWQgbWFubmVyLiBOb3RlIHRoYXQgdGhlXG4gKiBhY3R1YWwgb3JkZXIgcHJvZHVjZWQgaGVyZSwgdGhvdWdoIGl0IGFncmVlcyB3aXRoIGNhbm9uaWNhbC1KU09OIG9uXG4gKiBjb3B5UmVjb3JkIHByb3BlcnR5IG9yZGVyaW5nLCBkaWZmZXJzIGZyb20gY2Fub25pY2FsLUpTT04gYXMgYSB3aG9sZVxuICogaW4gdGhhdCB0aGUgb3RoZXIgcmVjb3JkIHByb3BlcnRpZXMgYXJlIHZpc2l0ZWQgaW4gdGhlIG9yZGVyIGluIHdoaWNoXG4gKiB0aGV5IGFyZSBsaXRlcmFsbHkgd3JpdHRlbiBiZWxvdy4gVE9ETyBwZXJoYXBzIHdlIHNob3VsZCBpbmRlZWQgc3dpdGNoXG4gKiB0byBhIGNhbm9uaWNhbCBKU09OIGVuY29kZXIsIGFuZCBub3QgZGVsaWNhdGV0bHkgZGVwZW5kIG9uIHRoZSBvcmRlclxuICogaW4gd2hpY2ggdGhlc2Ugb2JqZWN0IGxpdGVyYWxzIGFyZSB3cml0dGVuLlxuICpcbiAqIFJlYWRlcnMgbXVzdCBub3QgY2FyZSBhYm91dCB0aGlzIG9yZGVyIGFueXdheS4gV2UgaW1wb3NlIHRoaXMgcmVxdWlyZW1lbnRcbiAqIG1haW5seSB0byByZWR1Y2Ugbm9uLWRldGVybWluaXNtIGV4cG9zZWQgb3V0c2lkZSBhIHZhdC5cbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBwYXNzYWJsZVxuICogQHJldHVybnMge1NtYWxsY2Fwc0VuY29kaW5nfSBleGNlcHQgdGhhdCBgZW5jb2RlVG9TbWFsbGNhcHNgIGRvZXMgbm90IGdlbmVyYWxseVxuICogYGhhcmRlbmAgdGhpcyByZXN1bHQgYmVmb3JlIHJldHVybmluZy4gUmF0aGVyLCBgZW5jb2RlVG9TbWFsbGNhcHNgIGlzIG5vdFxuICogZGlyZWN0bHkgZXhwb3NlZC5cbiAqIFdoYXQncyBleHBvc2VkIGluc3RlYWQgaXMgYSB3cmFwcGVyIHRoYXQgZnJlZXplcyB0aGUgb3V0cHV0IGJlZm9yZVxuICogcmV0dXJuaW5nLiBJZiB0aGlzIHR1cm5zIG91dCB0byBpbXBlZGUgc3RhdGljIGFuYWx5c2lzIGZvciBgaGFyZGVuYCBzYWZldHksXG4gKiB3ZSBjYW4gYWx3YXlzIHB1dCB0aGUgKG5vdyByZWR1bmRhbnQpIGhhcmRlbnMgYmFjayBpbi4gVGhleSBkb24ndCBodXJ0LlxuICovXG5jb25zdCBlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyPShwYXNzYWJsZSk9Pntcbi8qIEZpcnN0IHdlIGhhbmRsZSBhbGwgcHJpbWl0aXZlcy4gU29tZSBjYW4gYmUgcmVwcmVzZW50ZWQgZGlyZWN0bHkgYXMqL1xuLyogSlNPTiwgYW5kIHNvbWUgbXVzdCBiZSBlbmNvZGVkIGludG8gc21hbGxjYXBzIHN0cmluZ3MuKi9cbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihwYXNzYWJsZSk7XG5zd2l0Y2gocGFzc1N0eWxlKXtcbmNhc2UnbnVsbCc6XG5jYXNlJ2Jvb2xlYW4nOntcbi8qIHBhc3MgdGhyb3VnaCB0byBKU09OKi9cbnJldHVybiBwYXNzYWJsZTtcbiB9XG5jYXNlJ3N0cmluZyc6e1xuaWYoc3RhcnRzU3BlY2lhbChwYXNzYWJsZSkpe1xuLyogU3RyaW5ncyB0aGF0IHN0YXJ0IHdpdGggYSBzcGVjaWFsIGNoYXIgYXJlIHF1b3RlZCB3aXRoIGAhYC4qL1xuLyogU2luY2UgYCFgIGlzIGl0c2VsZiBhIHNwZWNpYWwgY2hhcmFjdGVyLCB0aGlzIHRyaXZpYWxseSBkb2VzKi9cbi8qIHRoZSBIaWxiZXJ0IGhvdGVsLiBBbHNvLCBzaW5jZSB0aGUgc3BlY2lhbCBjaGFyYWN0ZXJzIGFyZSovXG4vKiBhIGNvbnRpbnVvdXMgc3VicmFuZ2Ugb2YgYXNjaWksIHRoaXMgcXVvdGluZyBpcyBzb3J0LW9yZGVyKi9cbi8qIHByZXNlcnZpbmcuKi9cbnJldHVybiBgISR7cGFzc2FibGV9YDtcbiB9XG4vKiBBbGwgb3RoZXIgc3RyaW5ncyBwYXNzIHRocm91Z2ggdG8gSlNPTiovXG5yZXR1cm4gcGFzc2FibGU7XG4gfVxuY2FzZSdzeW1ib2wnOntcbi8qIEF0IHRoZSBzbWFsbGNhcHMgbGV2ZWwsIHdlIHByZWZpeCBzeW1ib2wgbmFtZXMgd2l0aCBgJWAuKi9cbi8qIEJ5IFwic3ltYm9sIG5hbWVcIiwgd2UgbWVhbiBhY2NvcmRpbmcgdG8gYG5hbWVGb3JQYXNzYWJsZVN5bWJvbGAqL1xuLyogd2hpY2ggZG9lcyBzb21lIGZ1cnRoZXIgZXNjYXBpbmcuIFNlZSBjb21tZW50IG9uIHRoYXQgZnVuY3Rpb24uKi9cbmFzc2VydFBhc3NhYmxlU3ltYm9sKHBhc3NhYmxlKTtcbmNvbnN0IG5hbWU9LyoqIEB0eXBlIHtzdHJpbmd9ICovbmFtZUZvclBhc3NhYmxlU3ltYm9sKHBhc3NhYmxlKTtcbnJldHVybiBgJSR7bmFtZX1gO1xuIH1cbmNhc2UndW5kZWZpbmVkJzp7XG5yZXR1cm4nI3VuZGVmaW5lZCc7XG4gfVxuY2FzZSdudW1iZXInOntcbmlmKE51bWJlci5pc05hTihwYXNzYWJsZSkpe1xucmV0dXJuJyNOYU4nO1xuIH1cbmlmKGlzKHBhc3NhYmxlLC0wKSl7XG5yZXR1cm4gMDtcbiB9XG5pZihwYXNzYWJsZT09PUluZmluaXR5KXtcbnJldHVybicjSW5maW5pdHknO1xuIH1cbmlmKHBhc3NhYmxlPT09LUluZmluaXR5KXtcbnJldHVybicjLUluZmluaXR5JztcbiB9XG4vKiBBbGwgb3RoZXIgbnVtYmVycyBwYXNzIHRocm91Z2ggdG8gSlNPTiovXG5yZXR1cm4gcGFzc2FibGU7XG4gfVxuY2FzZSdiaWdpbnQnOntcbmNvbnN0IHN0cj1TdHJpbmcocGFzc2FibGUpO1xucmV0dXJuIHBhc3NhYmxlPDBuP3N0cjogYCske3N0cn1gO1xuIH1cbmNhc2UnY29weVJlY29yZCc6e1xuLyogQ3VycmVudGx5IGNvcHlSZWNvcmQgYWxsb3dzIG9ubHkgc3RyaW5nIGtleXMgc28gdGhpcyB3aWxsKi9cbi8qIHdvcmsuIElmIHdlIGFsbG93IHNvcnRhYmxlIHN5bWJvbCBrZXlzLCB0aGlzIHdpbGwgbmVlZCB0byovXG4vKiBiZWNvbWUgbW9yZSBpbnRlcmVzdGluZy4qL1xuY29uc3QgbmFtZXM9b3duS2V5cyhwYXNzYWJsZSkuc29ydCgpO1xucmV0dXJuIGZyb21FbnRyaWVzKFxubmFtZXMubWFwKChuYW1lKT0+W1xuZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihuYW1lKSxcbmVuY29kZVRvU21hbGxjYXBzUmVjdXIocGFzc2FibGVbbmFtZV0pXSkpO1xuXG5cbiB9XG5jYXNlJ2NvcHlBcnJheSc6e1xucmV0dXJuIHBhc3NhYmxlLm1hcChlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKTtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xucmV0dXJue1xuJyN0YWcnOmVuY29kZVRvU21hbGxjYXBzUmVjdXIoZ2V0VGFnKHBhc3NhYmxlKSksXG5wYXlsb2FkOmVuY29kZVRvU21hbGxjYXBzUmVjdXIocGFzc2FibGUucGF5bG9hZCl9O1xuXG4gfVxuY2FzZSdyZW1vdGFibGUnOntcbmNvbnN0IHJlc3VsdD1lbmNvZGVSZW1vdGFibGVUb1NtYWxsY2FwcyhcbnBhc3NhYmxlLFxuZW5jb2RlVG9TbWFsbGNhcHNSZWN1cik7XG5cbmlmKHR5cGVvZiByZXN1bHQ9PT0nc3RyaW5nJyYmcmVzdWx0LnN0YXJ0c1dpdGgoJyQnKSl7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbmFzc2VydC5mYWlsKFxuWCBgaW50ZXJuYWw6IFJlbW90YWJsZSBlbmNvZGluZyBtdXN0IHN0YXJ0IHdpdGggXCIkXCI6ICR7cmVzdWx0fWApO1xuXG4gfVxuY2FzZSdwcm9taXNlJzp7XG5jb25zdCByZXN1bHQ9ZW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzKFxucGFzc2FibGUsXG5lbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKTtcblxuaWYodHlwZW9mIHJlc3VsdD09PSdzdHJpbmcnJiZyZXN1bHQuc3RhcnRzV2l0aCgnJicpKXtcbnJldHVybiByZXN1bHQ7XG4gfVxuYXNzZXJ0LmZhaWwoXG5YIGBpbnRlcm5hbDogUHJvbWlzZSBlbmNvZGluZyBtdXN0IHN0YXJ0IHdpdGggXCImXCI6ICR7cmVzdWx0fWApO1xuXG4gfVxuY2FzZSdlcnJvcic6e1xuY29uc3QgcmVzdWx0PWVuY29kZUVycm9yVG9TbWFsbGNhcHMocGFzc2FibGUsZW5jb2RlVG9TbWFsbGNhcHNSZWN1cik7XG5pZih0eXBlb2YgcmVzdWx0PT09J29iamVjdCcmJmhhc093blByb3BlcnR5T2YocmVzdWx0LCcjZXJyb3InKSl7XG5jb25zdCBtZXNzYWdlPXJlc3VsdFsnI2Vycm9yJ107XG5pZihcbnR5cGVvZiBtZXNzYWdlPT09J3N0cmluZycmJihcbi8qIGNoZWNrIHRoYXQgaXQgZGVjb2RlcyB0byBhIHN0cmluZyovXG4hc3RhcnRzU3BlY2lhbChtZXNzYWdlKXx8bWVzc2FnZS5zdGFydHNXaXRoKCchJykpKVxue1xucmV0dXJuIHJlc3VsdDtcbiB9XG5hc3NlcnQuZmFpbChcblggYGludGVybmFsOiBFcnJvciBlbmNvZGluZyBtdXN0IGhhdmUgc3RyaW5nIG1lc3NhZ2U6ICR7cShtZXNzYWdlKX1gKTtcblxuIH1cbmFzc2VydC5mYWlsKFxuWCBgaW50ZXJuYWw6IEVycm9yIGVuY29kaW5nIG11c3QgaGF2ZSBcIiNlcnJvclwiIHByb3BlcnR5OiAke3EocmVzdWx0KX1gKTtcblxuIH1cbmRlZmF1bHQ6e1xuYXNzZXJ0LmZhaWwoXG5YIGBpbnRlcm5hbDogVW5yZWNvZ25pemVkIHBhc3NTdHlsZSAke3EocGFzc1N0eWxlKX1gLFxuVHlwZUVycm9yKTtcblxuIH19XG5cbiB9O1xuY29uc3QgZW5jb2RlVG9TbWFsbGNhcHM9KHBhc3NhYmxlKT0+e1xuaWYoRXJyb3JIZWxwZXIuY2FuQmVWYWxpZChwYXNzYWJsZSwoeCk9PngpKXtcbi8qIFdlIHB1bGwgb3V0IHRoaXMgc3BlY2lhbCBjYXNlIHRvIGFjY29tbW9kYXRlIGVycm9ycyB0aGF0IGFyZSBub3QqL1xuLyogdmFsaWQgUGFzc2FibGVzLiBGb3IgZXhhbXBsZSwgYmVjYXVzZSB0aGV5J3JlIG5vdCBmcm96ZW4uKi9cbi8qIFRoZSBzcGVjaWFsIGNhc2UgY2FuIG9ubHkgZXZlciBhcHBseSBhdCB0aGUgcm9vdCwgYW5kIHRoZXJlZm9yZSovXG4vKiBvdXRzaWRlIHRoZSByZWN1cnNpb24sIHNpbmNlIGFuIGVycm9yIGNvdWxkIG9ubHkgYmUgZGVlcGVyIGluKi9cbi8qIGEgcGFzc2FibGUgc3RydWN0dXJlIGlmIGl0IHdlcmUgcGFzc2FibGUuKi9cbi8qKi9cbi8qIFdlIHB1bGwgb3V0IHRoaXMgc3BlY2lhbCBjYXNlIGJlY2F1c2UsIGZvciB0aGVzZSBlcnJvcnMsIHdlJ3JlIG11Y2gqL1xuLyogbW9yZSBpbnRlcmVzdGVkIGluIHJlcG9ydGluZyB3aGF0ZXZlciBkaWFnbm9zdGljIGluZm9ybWF0aW9uIHRoZXkqL1xuLyogY2FycnkgdGhhbiB3ZSBhcmUgYWJvdXQgcmVwb3J0aW5nIHByb2JsZW1zIGVuY291bnRlcmVkIGluIHJlcG9ydGluZyovXG4vKiB0aGlzIGluZm9ybWF0aW9uLiovXG5jb25zdCByZXN1bHQ9aGFyZGVuKFxuZW5jb2RlRXJyb3JUb1NtYWxsY2FwcyhwYXNzYWJsZSxlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKSk7XG5cbmlmKHR5cGVvZiByZXN1bHQ9PT0nb2JqZWN0JyYmaGFzT3duUHJvcGVydHlPZihyZXN1bHQsJyNlcnJvcicpKXtcbmNvbnN0IG1lc3NhZ2U9cmVzdWx0WycjZXJyb3InXTtcbmlmKFxudHlwZW9mIG1lc3NhZ2U9PT0nc3RyaW5nJyYmKFxuLyogY2hlY2sgdGhhdCBpdCBkZWNvZGVzIHRvIGEgc3RyaW5nKi9cbiFzdGFydHNTcGVjaWFsKG1lc3NhZ2UpfHxtZXNzYWdlLnN0YXJ0c1dpdGgoJyEnKSkpXG57XG5yZXR1cm4gcmVzdWx0O1xuIH1cbmFzc2VydC5mYWlsKFxuWCBgaW50ZXJuYWw6IEVycm9yIGVuY29kaW5nIG11c3Qgc3RyaW5nIG1lc3NhZ2U6ICR7cShtZXNzYWdlKX1gKTtcblxuIH1cbmFzc2VydC5mYWlsKFxuWCBgaW50ZXJuYWw6IEVycm9yIGVuY29kaW5nIG11c3QgaGF2ZSBcIiNlcnJvclwiIHByb3BlcnR5OiAke3EocmVzdWx0KX1gKTtcblxuIH1cbnJldHVybiBoYXJkZW4oZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihwYXNzYWJsZSkpO1xuIH07XG5yZXR1cm4gaGFyZGVuKGVuY29kZVRvU21hbGxjYXBzKTtcbiB9OyRo4oCNX29uY2UubWFrZUVuY29kZVRvU21hbGxjYXBzKG1ha2VFbmNvZGVUb1NtYWxsY2Fwcyk7XG5oYXJkZW4obWFrZUVuY29kZVRvU21hbGxjYXBzKTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBEZWNvZGVGcm9tU21hbGxjYXBzT3B0aW9uc1xuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRSZW1vdGFibGU6IFNtYWxsY2Fwc0VuY29kaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGUgOlNtYWxsY2Fwc0VuY29kaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiBSZW1vdGFibGV9IFtkZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRQcm9taXNlOiBTbWFsbGNhcHNFbmNvZGluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlIDpTbWFsbGNhcHNFbmNvZGluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gUHJvbWlzZX0gW2RlY29kZVByb21pc2VGcm9tU21hbGxjYXBzXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRFcnJvcjogU21hbGxjYXBzRW5jb2RpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZSA6U21hbGxjYXBzRW5jb2RpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IEVycm9yfSBbZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzXVxuICovXG5cbmNvbnN0IGRvbnREZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzPShlbmNvZGluZyk9PlxuYXNzZXJ0LmZhaWwoWCBgcmVtb3RhYmxlIHVuZXhwZWN0ZWQ6ICR7ZW5jb2Rpbmd9YCk7XG5jb25zdCBkb250RGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHM9KGVuY29kaW5nKT0+XG5hc3NlcnQuZmFpbChYIGBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7ZW5jb2Rpbmd9YCk7XG5jb25zdCBkb250RGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzPShlbmNvZGluZyk9PlxuYXNzZXJ0LmZhaWwoWCBgZXJyb3IgdW5leHBlY3RlZDogJHtxKGVuY29kaW5nKX1gKTtcblxuLyoqXG4gKiBAcGFyYW0ge0RlY29kZUZyb21TbWFsbGNhcHNPcHRpb25zPX0gZGVjb2RlT3B0aW9uc1xuICogQHJldHVybnMgeyhlbmNvZGVkOiBTbWFsbGNhcHNFbmNvZGluZykgPT4gUGFzc2FibGV9XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlRGVjb2RlRnJvbVNtYWxsY2Fwcz0oe1xuZGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2Fwcz1kb250RGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2FwcyxcbmRlY29kZVByb21pc2VGcm9tU21hbGxjYXBzPWRvbnREZWNvZGVQcm9taXNlRnJvbVNtYWxsY2FwcyxcbmRlY29kZUVycm9yRnJvbVNtYWxsY2Fwcz1kb250RGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzfT1cbnt9KT0+e1xuLyoqXG4gKiBgZGVjb2RlRnJvbVNtYWxsY2Fwc2AgbWF5IHJlbHkgb24gYGVuY29kaW5nYCBiZWluZyB0aGUgcmVzdWx0IG9mIGFcbiAqIHBsYWluIGNhbGwgdG8gSlNPTi5wYXJzZS4gSG93ZXZlciwgaXQgKmNhbm5vdCogcmVseSBvbiBgZW5jb2RpbmdgXG4gKiBoYXZpbmcgYmVlbiBwcm9kdWNlZCBieSBKU09OLnN0cmluZ2lmeSBvbiB0aGUgb3V0cHV0IG9mIGBlbmNvZGVUb1NtYWxsY2Fwc2BcbiAqIGFib3ZlLCBpLmUuLCBgZGVjb2RlRnJvbVNtYWxsY2Fwc2AgY2Fubm90IHJlbHkgb24gYGVuY29kaW5nYCBiZWluZyBhXG4gKiB2YWxpZCBtYXJzaGFsbGVkIHJlcHJlc2VudGF0aW9uLiBSYXRoZXIsIGBkZWNvZGVGcm9tU21hbGxjYXBzYCBtdXN0XG4gKiB2YWxpZGF0ZSB0aGF0LlxuICpcbiAqIEBwYXJhbSB7U21hbGxjYXBzRW5jb2Rpbmd9IGVuY29kaW5nIG11c3QgYmUgaGFyZGVuZWRcbiAqL1xuY29uc3QgZGVjb2RlRnJvbVNtYWxsY2Fwcz0oZW5jb2RpbmcpPT57XG5zd2l0Y2godHlwZW9mIGVuY29kaW5nKXtcbmNhc2UnYm9vbGVhbic6XG5jYXNlJ251bWJlcic6e1xucmV0dXJuIGVuY29kaW5nO1xuIH1cbmNhc2Unc3RyaW5nJzp7XG5pZighc3RhcnRzU3BlY2lhbChlbmNvZGluZykpe1xucmV0dXJuIGVuY29kaW5nO1xuIH1cbmNvbnN0IGM9ZW5jb2RpbmcuY2hhckF0KDApO1xuc3dpdGNoKGMpe1xuY2FzZSchJzp7XG4vKiB1bi1oaWxiZXJ0LWlmeSB0aGUgc3RyaW5nKi9cbnJldHVybiBlbmNvZGluZy5zbGljZSgxKTtcbiB9XG5jYXNlJyUnOntcbnJldHVybiBwYXNzYWJsZVN5bWJvbEZvck5hbWUoZW5jb2Rpbmcuc2xpY2UoMSkpO1xuIH1cbmNhc2UnIyc6e1xuc3dpdGNoKGVuY29kaW5nKXtcbmNhc2UnI3VuZGVmaW5lZCc6e1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG5jYXNlJyNOYU4nOntcbnJldHVybiBOYU47XG4gfVxuY2FzZScjSW5maW5pdHknOntcbnJldHVybiBJbmZpbml0eTtcbiB9XG5jYXNlJyMtSW5maW5pdHknOntcbnJldHVybi1JbmZpbml0eTtcbiB9XG5kZWZhdWx0OntcbmFzc2VydC5mYWlsKFggYHVua25vd24gY29uc3RhbnQgXCIke3EoZW5jb2RpbmcpfVwiYCxUeXBlRXJyb3IpO1xuIH19XG5cbiB9XG5jYXNlJysnOlxuY2FzZSctJzp7XG5yZXR1cm4gQmlnSW50KGVuY29kaW5nKTtcbiB9XG5jYXNlJyQnOntcbmNvbnN0IHJlc3VsdD1kZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzKFxuZW5jb2RpbmcsXG5kZWNvZGVGcm9tU21hbGxjYXBzKTtcblxuaWYocGFzc1N0eWxlT2YocmVzdWx0KSE9PSdyZW1vdGFibGUnKXtcbmFzc2VydC5mYWlsKFxuWCBgaW50ZXJuYWw6IGRlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHMgb3B0aW9uIG11c3QgcmV0dXJuIGEgcmVtb3RhYmxlOiAke3Jlc3VsdH1gKTtcblxuIH1cbnJldHVybiByZXN1bHQ7XG4gfVxuY2FzZScmJzp7XG5jb25zdCByZXN1bHQ9ZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHMoXG5lbmNvZGluZyxcbmRlY29kZUZyb21TbWFsbGNhcHMpO1xuXG5pZihwYXNzU3R5bGVPZihyZXN1bHQpIT09J3Byb21pc2UnKXtcbmFzc2VydC5mYWlsKFxuWCBgaW50ZXJuYWw6IGRlY29kZVByb21pc2VGcm9tU21hbGxjYXBzIG9wdGlvbiBtdXN0IHJldHVybiBhIHByb21pc2U6ICR7cmVzdWx0fWApO1xuXG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9XG5kZWZhdWx0OntcbmFzc2VydC5mYWlsKFxuWCBgU3BlY2lhbCBjaGFyICR7cShjKX0gcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2U6ICR7ZW5jb2Rpbmd9YCk7XG5cbiB9fVxuXG4gfVxuY2FzZSdvYmplY3QnOntcbmlmKGVuY29kaW5nPT09bnVsbCl7XG5yZXR1cm4gZW5jb2Rpbmc7XG4gfVxuXG5pZihpc0FycmF5KGVuY29kaW5nKSl7XG5yZXR1cm4gZW5jb2RpbmcubWFwKCh2YWwpPT5kZWNvZGVGcm9tU21hbGxjYXBzKHZhbCkpO1xuIH1cblxuaWYoaGFzT3duUHJvcGVydHlPZihlbmNvZGluZywnI3RhZycpKXtcbmNvbnN0eycjdGFnJzp0YWcscGF5bG9hZCwuLi5yZXN0fT1lbmNvZGluZztcbnR5cGVvZiB0YWc9PT0nc3RyaW5nJ3x8XG5hc3NlcnQuZmFpbChcblggYFZhbHVlIG9mIFwiI3RhZ1wiLCB0aGUgdGFnLCBtdXN0IGJlIGEgc3RyaW5nOiAke2VuY29kaW5nfWApO1xuXG5vd25LZXlzKHJlc3QpLmxlbmd0aD09PTB8fFxuYXNzZXJ0LmZhaWwoXG5YIGAjdGFnIHJlY29yZCB1bmV4cGVjdGVkIHByb3BlcnRpZXM6ICR7cShvd25LZXlzKHJlc3QpKX1gKTtcblxucmV0dXJuIG1ha2VUYWdnZWQoXG5kZWNvZGVGcm9tU21hbGxjYXBzKHRhZyksXG5kZWNvZGVGcm9tU21hbGxjYXBzKHBheWxvYWQpKTtcblxuIH1cblxuaWYoaGFzT3duUHJvcGVydHlPZihlbmNvZGluZywnI2Vycm9yJykpe1xuY29uc3QgcmVzdWx0PWRlY29kZUVycm9yRnJvbVNtYWxsY2FwcyhcbmVuY29kaW5nLFxuZGVjb2RlRnJvbVNtYWxsY2Fwcyk7XG5cbnBhc3NTdHlsZU9mKHJlc3VsdCk9PT0nZXJyb3InfHxcbmFzc2VydC5mYWlsKFxuWCBgaW50ZXJuYWw6IGRlY29kZUVycm9yRnJvbVNtYWxsY2FwcyBvcHRpb24gbXVzdCByZXR1cm4gYW4gZXJyb3I6ICR7cmVzdWx0fWApO1xuXG5yZXR1cm4gcmVzdWx0O1xuIH1cblxuY29uc3QgcmVzdWx0PXt9O1xuZm9yKGNvbnN0IGVuY29kZWROYW1lIG9mIG93bktleXMoZW5jb2RpbmcpKXtcbi8qIFR5cGVTY3JpcHQgY29uZnVzZWQgYWJvdXQgYHx8YCBjb250cm9sIGZsb3cgc28gdXNlIGBpZmAgaW5zdGVhZCovXG4vKiBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzUwNzM5Ki9cbmlmKHR5cGVvZiBlbmNvZGVkTmFtZSE9PSdzdHJpbmcnKXtcbmFzc2VydC5mYWlsKFxuWCBgUHJvcGVydHkgbmFtZSAke3EoXG5lbmNvZGVkTmFtZSlcbiB9IG9mICR7ZW5jb2Rpbmd9IG11c3QgYmUgYSBzdHJpbmdgKTtcblxuIH1cbiFlbmNvZGVkTmFtZS5zdGFydHNXaXRoKCcjJyl8fFxuYXNzZXJ0LmZhaWwoXG5YIGBVbnJlY29nbml6ZWQgcmVjb3JkIHR5cGUgJHtxKGVuY29kZWROYW1lKX06ICR7ZW5jb2Rpbmd9YCk7XG5cbmNvbnN0IG5hbWU9ZGVjb2RlRnJvbVNtYWxsY2FwcyhlbmNvZGVkTmFtZSk7XG50eXBlb2YgbmFtZT09PSdzdHJpbmcnfHxcbmFzc2VydC5mYWlsKFxuWCBgRGVjb2RlZCBwcm9wZXJ0eSBuYW1lICR7bmFtZX0gZnJvbSAke2VuY29kaW5nfSBtdXN0IGJlIGEgc3RyaW5nYCk7XG5cbnJlc3VsdFtuYW1lXT1kZWNvZGVGcm9tU21hbGxjYXBzKGVuY29kaW5nW2VuY29kZWROYW1lXSk7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9XG5kZWZhdWx0OntcbmFzc2VydC5mYWlsKFxuWCBgaW50ZXJuYWw6IHVucmVjb2duaXplZCBKU09OIHR5cGVvZiAke3EoXG50eXBlb2YgZW5jb2RpbmcpXG4gfTogJHtlbmNvZGluZ31gLFxuVHlwZUVycm9yKTtcblxuIH19XG5cbiB9O1xucmV0dXJuIGhhcmRlbihkZWNvZGVGcm9tU21hbGxjYXBzKTtcbiB9OyRo4oCNX29uY2UubWFrZURlY29kZUZyb21TbWFsbGNhcHMobWFrZURlY29kZUZyb21TbWFsbGNhcHMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VFbmNvZGVUb1NtYWxsY2FwcyI6WyJtYWtlRW5jb2RlVG9TbWFsbGNhcHMiXSwibWFrZURlY29kZUZyb21TbWFsbGNhcHMiOlsibWFrZURlY29kZUZyb21TbWFsbGNhcHMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAVEHkhegGAADoBgAALQAAAEBlbmRvL21hcnNoYWwtdjAuNy41L3NyYy9oZWxwZXJzL2NvcHlBcnJheS5qc3siaW1wb3J0cyI6WyIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiQ29weUFycmF5SGVscGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydENoZWNrZXIsY2hlY2tOb3JtYWxQcm9wZXJ0eTskaOKAjV9pbXBvcnRzKFtbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXSxbXCJjaGVja05vcm1hbFByb3BlcnR5XCIsIFskaOKAjV9hID0+IChjaGVja05vcm1hbFByb3BlcnR5ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuY29uc3R7ZGV0YWlsczpYfT1hc3NlcnQ7XG5jb25zdHtnZXRQcm90b3R5cGVPZn09T2JqZWN0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2lzQXJyYXkscHJvdG90eXBlOmFycmF5UHJvdG90eXBlfT1BcnJheTtcblxuLyoqXG4gKlxuICogQHR5cGUge1hpbXBvcnQoJy4vaW50ZXJuYWwtdHlwZXMuanMnKS5QYXNzU3R5bGVIZWxwZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBDb3B5QXJyYXlIZWxwZXI9aGFyZGVuKHtcbnN0eWxlTmFtZTonY29weUFycmF5JyxcblxuY2FuQmVWYWxpZDooY2FuZGlkYXRlLGNoZWNrKT0+XG5jaGVjayhpc0FycmF5KGNhbmRpZGF0ZSksWCBgQXJyYXkgZXhwZWN0ZWQ6ICR7Y2FuZGlkYXRlfWApLFxuXG5hc3NlcnRWYWxpZDooY2FuZGlkYXRlLHBhc3NTdHlsZU9mUmVjdXIpPT57XG5Db3B5QXJyYXlIZWxwZXIuY2FuQmVWYWxpZChjYW5kaWRhdGUsYXNzZXJ0Q2hlY2tlcik7XG5hc3NlcnQoXG5nZXRQcm90b3R5cGVPZihjYW5kaWRhdGUpPT09YXJyYXlQcm90b3R5cGUsXG5YIGBNYWxmb3JtZWQgYXJyYXk6ICR7Y2FuZGlkYXRlfWAsXG5UeXBlRXJyb3IpO1xuXG4vKiBTaW5jZSB3ZSdyZSBhbHJlYWR5IGVuc3VyZWQgY2FuZGlkYXRlIGlzIGFuIGFycmF5LCBpdCBzaG91bGQgbm90IGJlKi9cbi8qIHBvc3NpYmxlIGZvciB0aGUgZm9sbG93aW5nIHRlc3QgdG8gZmFpbCovXG5jaGVja05vcm1hbFByb3BlcnR5KGNhbmRpZGF0ZSwnbGVuZ3RoJywnc3RyaW5nJyxmYWxzZSxhc3NlcnRDaGVja2VyKTtcbmNvbnN0IGxlbj1jYW5kaWRhdGUubGVuZ3RoO1xuZm9yKGxldCBpPTA7aTxsZW47aSs9MSl7XG5jaGVja05vcm1hbFByb3BlcnR5KGNhbmRpZGF0ZSxpLCdudW1iZXInLHRydWUsYXNzZXJ0Q2hlY2tlcik7XG4gfVxuYXNzZXJ0KFxuLyogKzEgZm9yIHRoZSAnbGVuZ3RoJyBwcm9wZXJ0eSBpdHNlbGYuKi9cbm93bktleXMoY2FuZGlkYXRlKS5sZW5ndGg9PT1sZW4rMSxcblggYEFycmF5cyBtdXN0IG5vdCBoYXZlIG5vbi1pbmRleGVzOiAke2NhbmRpZGF0ZX1gLFxuVHlwZUVycm9yKTtcblxuLyogUmVjdXJzaXZlbHkgdmFsaWRhdGUgdGhhdCBlYWNoIG1lbWJlciBpcyBwYXNzYWJsZS4qL1xuY2FuZGlkYXRlLmV2ZXJ5KCh2KT0+ISFwYXNzU3R5bGVPZlJlY3VyKHYpKTtcbiB9fSk7JGjigI1fb25jZS5Db3B5QXJyYXlIZWxwZXIoQ29weUFycmF5SGVscGVyKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJDb3B5QXJyYXlIZWxwZXIiOlsiQ29weUFycmF5SGVscGVyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAABNsHFDSBwAA0gcAAC4AAABAZW5kby9tYXJzaGFsLXYwLjcuNS9zcmMvaGVscGVycy9jb3B5UmVjb3JkLmpzeyJpbXBvcnRzIjpbIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJDb3B5UmVjb3JkSGVscGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydENoZWNrZXIsY2FuQmVNZXRob2QsY2hlY2tOb3JtYWxQcm9wZXJ0eTskaOKAjV9pbXBvcnRzKFtbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXSxbXCJjYW5CZU1ldGhvZFwiLCBbJGjigI1fYSA9PiAoY2FuQmVNZXRob2QgPSAkaOKAjV9hKV1dLFtcImNoZWNrTm9ybWFsUHJvcGVydHlcIiwgWyRo4oCNX2EgPT4gKGNoZWNrTm9ybWFsUHJvcGVydHkgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cbmNvbnN0e2RldGFpbHM6WH09YXNzZXJ0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e1xuZ2V0UHJvdG90eXBlT2YsXG5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzLFxucHJvdG90eXBlOm9iamVjdFByb3RvdHlwZX09XG5PYmplY3Q7XG5cbi8qKlxuICpcbiAqIEB0eXBlIHtYaW1wb3J0KCcuL2ludGVybmFsLXR5cGVzLmpzJykuUGFzc1N0eWxlSGVscGVyfVxuICovXG5jb25zdCAgICAgICAgQ29weVJlY29yZEhlbHBlcj1oYXJkZW4oe1xuc3R5bGVOYW1lOidjb3B5UmVjb3JkJyxcblxuY2FuQmVWYWxpZDooY2FuZGlkYXRlLGNoZWNrKT0+e1xuY29uc3QgcHJvdG89Z2V0UHJvdG90eXBlT2YoY2FuZGlkYXRlKTtcbmlmKHByb3RvIT09b2JqZWN0UHJvdG90eXBlJiZwcm90byE9PW51bGwpe1xucmV0dXJuIGNoZWNrKGZhbHNlLFggYFVuZXhwZWN0ZWQgcHJvdG90eXBlIGZvcjogJHtjYW5kaWRhdGV9YCk7XG4gfVxuY29uc3QgZGVzY3M9Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhjYW5kaWRhdGUpO1xuY29uc3QgZGVzY0tleXM9b3duS2V5cyhkZXNjcyk7XG5cbmZvcihjb25zdCBkZXNjS2V5IG9mIGRlc2NLZXlzKXtcbmlmKHR5cGVvZiBkZXNjS2V5IT09J3N0cmluZycpe1xuLyogUGFzcyBieSBjb3B5Ki9cbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgUmVjb3JkcyBjYW4gb25seSBoYXZlIHN0cmluZy1uYW1lZCBvd24gcHJvcGVydGllczogJHtjYW5kaWRhdGV9YCk7XG5cbiB9XG5jb25zdCBkZXNjPWRlc2NzW2Rlc2NLZXldO1xuaWYoY2FuQmVNZXRob2QoZGVzYy52YWx1ZSkpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBSZWNvcmRzIGNhbm5vdCBjb250YWluIG5vbi1mYXIgZnVuY3Rpb25zIGJlY2F1c2UgdGhleSBtYXkgYmUgbWV0aG9kcyBvZiBhbiBpbXBsaWNpdCBSZW1vdGFibGU6ICR7Y2FuZGlkYXRlfWApO1xuXG4gfVxuIH1cbnJldHVybiB0cnVlO1xuIH0sXG5cbmFzc2VydFZhbGlkOihjYW5kaWRhdGUscGFzc1N0eWxlT2ZSZWN1cik9PntcbkNvcHlSZWNvcmRIZWxwZXIuY2FuQmVWYWxpZChjYW5kaWRhdGUsYXNzZXJ0Q2hlY2tlcik7XG5mb3IoY29uc3QgbmFtZSBvZiBvd25LZXlzKGNhbmRpZGF0ZSkpe1xuY2hlY2tOb3JtYWxQcm9wZXJ0eShjYW5kaWRhdGUsbmFtZSwnc3RyaW5nJyx0cnVlLGFzc2VydENoZWNrZXIpO1xuIH1cbi8qIFJlY3Vyc2l2ZWx5IHZhbGlkYXRlIHRoYXQgZWFjaCBtZW1iZXIgaXMgcGFzc2FibGUuKi9cbk9iamVjdC52YWx1ZXMoY2FuZGlkYXRlKS5ldmVyeSgodik9PiEhcGFzc1N0eWxlT2ZSZWN1cih2KSk7XG4gfX0pOyRo4oCNX29uY2UuQ29weVJlY29yZEhlbHBlcihDb3B5UmVjb3JkSGVscGVyKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJDb3B5UmVjb3JkSGVscGVyIjpbIkNvcHlSZWNvcmRIZWxwZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAwwT8XyQRAAAkEQAAKQAAAEBlbmRvL21hcnNoYWwtdjAuNy41L3NyYy9oZWxwZXJzL2Vycm9yLmpzeyJpbXBvcnRzIjpbIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJFcnJvckhlbHBlciIsImdldEVycm9yQ29uc3RydWN0b3IiLCJ0b1Bhc3NhYmxlRXJyb3IiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0Q2hlY2tlcjskaOKAjV9pbXBvcnRzKFtbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL2ludGVybmFsLXR5cGVzLmpzJykuUGFzc1N0eWxlSGVscGVyfSBQYXNzU3R5bGVIZWxwZXIgKi9cblxuY29uc3R7ZGV0YWlsczpYfT1hc3NlcnQ7XG5jb25zdHtnZXRQcm90b3R5cGVPZixnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzfT1PYmplY3Q7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuXG4vKiBUT0RPOiBNYWludGVuYW5jZSBoYXphcmQ6IENvb3JkaW5hdGUgd2l0aCB0aGUgbGlzdCBvZiBlcnJvcnMgaW4gdGhlIFNFUyovXG4vKiB3aGlsZWxpc3QuIEN1cnJlbnRseSwgYm90aCBvbWl0IEFnZ3JlZ2F0ZUVycm9yLCB3aGljaCBpcyBub3cgc3RhbmRhcmQuIEJvdGgqL1xuLyogbXVzdCBldmVudHVhbGx5IGluY2x1ZGUgaXQuKi9cbmNvbnN0IGVycm9yQ29uc3RydWN0b3JzPW5ldyBNYXAoW1xuWydFcnJvcicsRXJyb3JdLFxuWydFdmFsRXJyb3InLEV2YWxFcnJvcl0sXG5bJ1JhbmdlRXJyb3InLFJhbmdlRXJyb3JdLFxuWydSZWZlcmVuY2VFcnJvcicsUmVmZXJlbmNlRXJyb3JdLFxuWydTeW50YXhFcnJvcicsU3ludGF4RXJyb3JdLFxuWydUeXBlRXJyb3InLFR5cGVFcnJvcl0sXG5bJ1VSSUVycm9yJyxVUklFcnJvcl1dKTtcblxuXG5jb25zdCAgICAgICAgZ2V0RXJyb3JDb25zdHJ1Y3Rvcj0obmFtZSk9PmVycm9yQ29uc3RydWN0b3JzLmdldChuYW1lKTskaOKAjV9vbmNlLmdldEVycm9yQ29uc3RydWN0b3IoZ2V0RXJyb3JDb25zdHJ1Y3Rvcik7XG5oYXJkZW4oZ2V0RXJyb3JDb25zdHJ1Y3Rvcik7XG5cbi8qKlxuICogVmFsaWRhdGluZyBlcnJvciBvYmplY3RzIGFyZSBwYXNzYWJsZSByYWlzZXMgYSB0ZW5zaW9uIGJldHdlZW4gc2VjdXJpdHlcbiAqIHZzIHByZXNlcnZpbmcgZGlhZ25vc3RpYyBpbmZvcm1hdGlvbi4gRm9yIGVycm9ycywgd2UgbmVlZCB0byByZW1lbWJlclxuICogdGhlIGVycm9yIGl0c2VsZiBleGlzdHMgdG8gaGVscCB1cyBkaWFnbm9zZSBhIGJ1ZyB0aGF0J3MgbGlrZWx5IG1vcmVcbiAqIHByZXNzaW5nIHRoYW4gYSB2YWxpZGl0eSBidWcgaW4gdGhlIGVycm9yIGl0c2VsZi4gVGh1cywgd2hlbmV2ZXIgaXQgaXMgc2FmZVxuICogdG8gZG8gc28sIHdlIHByZWZlciB0byBsZXQgdGhlIGVycm9yIHRlc3Qgc3VjY2VlZCBhbmQgdG8gY291Y2ggdGhlc2VcbiAqIGNvbXBsYWludHMgYXMgbm90ZXMgb24gdGhlIGVycm9yLlxuICpcbiAqIFRvIHJlc29sdmUgdGhpcywgc3VjaCBhIG1hbGZvcm1lZCBlcnJvciBvYmplY3Qgd2lsbCBzdGlsbCBwYXNzXG4gKiBgY2FuQmVWYWxpZChlcnIsIHggPT4geClgIHNvIG1hcnNoYWwgY2FuIHVzZSB0aGlzIGZvciB0b3BcbiAqIGxldmVsIGVycm9yIHRvIHJlcG9ydCBmcm9tLCBldmVuIGlmIGl0IHdvdWxkIG5vdCBhY3R1YWxseSB2YWxpZGF0ZS5cbiAqIEluc3RlYWQsIHRoZSBkaWFnbm9zdGljcyB0aGF0IGBhc3NlcnRFcnJvcmAgd291bGQgaGF2ZSByZXBvcnRlZCBhcmVcbiAqIGF0dGFjaGVkIGFzIG5vdGVzIHRvIHRoZSBtYWxmb3JtZWQgZXJyb3IuIFRodXMsIGEgbWFsZm9ybWVkXG4gKiBlcnJvciBpcyBwYXNzYWJsZSBieSBpdHNlbGYsIGJ1dCBub3QgYXMgcGFydCBvZiBhIHBhc3NhYmxlIHN0cnVjdHVyZS5cbiAqXG4gKiBAdHlwZSB7UGFzc1N0eWxlSGVscGVyfVxuICovXG5jb25zdCAgICAgICAgRXJyb3JIZWxwZXI9aGFyZGVuKHtcbnN0eWxlTmFtZTonZXJyb3InLFxuXG5jYW5CZVZhbGlkOihjYW5kaWRhdGUsY2hlY2spPT57XG4vKiBUT0RPOiBOZWVkIGEgYmV0dGVyIHRlc3QgdGhhbiBpbnN0YW5jZW9mKi9cbmlmKCEoY2FuZGlkYXRlIGluc3RhbmNlb2YgRXJyb3IpKXtcbnJldHVybiBjaGVjayhmYWxzZSxYIGBFcnJvciBleHBlY3RlZDogJHtjYW5kaWRhdGV9YCk7XG4gfVxuY29uc3QgcHJvdG89Z2V0UHJvdG90eXBlT2YoY2FuZGlkYXRlKTtcbmNvbnN0e25hbWV9PXByb3RvO1xuY29uc3QgRUM9Z2V0RXJyb3JDb25zdHJ1Y3RvcihuYW1lKTtcbmlmKCFFQ3x8RUMucHJvdG90eXBlIT09cHJvdG8pe1xuY29uc3Qgbm90ZT1YIGBFcnJvcnMgbXVzdCBpbmhlcml0IGZyb20gYW4gZXJyb3IgY2xhc3MgLnByb3RvdHlwZSAke2NhbmRpZGF0ZX1gO1xuLyogT25seSB0ZXJtaW5hdGUgaWYgY2hlY2sgdGhyb3dzKi9cbmNoZWNrKGZhbHNlLG5vdGUpO1xuYXNzZXJ0Lm5vdGUoY2FuZGlkYXRlLG5vdGUpO1xuIH1cblxuY29uc3R7XG4vKiBNdXN0IGFsbG93IGBjYXVzZWAsIGBlcnJvcnNgKi9cbm1lc3NhZ2U6bURlc2MsXG4vKiBBbGxvdyBidXQgaWdub3JlIG9ubHkgZXh0cmFuZW91cyBvd24gYHN0YWNrYCBwcm9wZXJ0eS4qL1xuc3RhY2s6X29wdFN0YWNrRGVzYyxcbi4uLnJlc3REZXNjc309XG5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKGNhbmRpZGF0ZSk7XG5pZihvd25LZXlzKHJlc3REZXNjcykubGVuZ3RoPj0xKXtcbmNvbnN0IG5vdGU9WCBgUGFzc2VkIEVycm9yIGhhcyBleHRyYSB1bnBhc3NlZCBwcm9wZXJ0aWVzICR7cmVzdERlc2NzfWA7XG4vKiBPbmx5IHRlcm1pbmF0ZSBpZiBjaGVjayB0aHJvd3MqL1xuY2hlY2soZmFsc2Usbm90ZSk7XG5hc3NlcnQubm90ZShjYW5kaWRhdGUsbm90ZSk7XG4gfVxuaWYobURlc2Mpe1xuaWYodHlwZW9mIG1EZXNjLnZhbHVlIT09J3N0cmluZycpe1xuY29uc3Qgbm90ZT1YIGBQYXNzZWQgRXJyb3IgXCJtZXNzYWdlXCIgJHttRGVzY30gbXVzdCBiZSBhIHN0cmluZy12YWx1ZWQgZGF0YSBwcm9wZXJ0eS5gO1xuLyogT25seSB0ZXJtaW5hdGUgaWYgY2hlY2sgdGhyb3dzKi9cbmNoZWNrKGZhbHNlLG5vdGUpO1xuYXNzZXJ0Lm5vdGUoY2FuZGlkYXRlLG5vdGUpO1xuIH1cbmlmKG1EZXNjLmVudW1lcmFibGUpe1xuY29uc3Qgbm90ZT1YIGBQYXNzZWQgRXJyb3IgXCJtZXNzYWdlXCIgJHttRGVzY30gbXVzdCBub3QgYmUgZW51bWVyYWJsZWA7XG4vKiBPbmx5IHRlcm1pbmF0ZSBpZiBjaGVjayB0aHJvd3MqL1xuY2hlY2soZmFsc2Usbm90ZSk7XG5hc3NlcnQubm90ZShjYW5kaWRhdGUsbm90ZSk7XG4gfVxuIH1cbnJldHVybiB0cnVlO1xuIH0sXG5cbmFzc2VydFZhbGlkOihjYW5kaWRhdGUpPT57XG5FcnJvckhlbHBlci5jYW5CZVZhbGlkKGNhbmRpZGF0ZSxhc3NlcnRDaGVja2VyKTtcbiB9fSk7XG5cblxuLyoqXG4gKiBSZXR1cm4gYSBuZXcgcGFzc2FibGUgZXJyb3IgdGhhdCBwcm9wYWdhdGVzIHRoZSBkaWFnbm9zdGljIGluZm8gb2YgdGhlXG4gKiBvcmlnaW5hbCwgYW5kIGlzIGxpbmtlZCB0byB0aGUgb3JpZ2luYWwgYXMgYSBub3RlLlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IGVyclxuICogQHJldHVybnMge0Vycm9yfVxuICovJGjigI1fb25jZS5FcnJvckhlbHBlcihFcnJvckhlbHBlcik7XG5jb25zdCAgICAgICAgdG9QYXNzYWJsZUVycm9yPShlcnIpPT57XG5jb25zdHtuYW1lLG1lc3NhZ2V9PWVycjtcblxuY29uc3QgRUM9Z2V0RXJyb3JDb25zdHJ1Y3RvciggYCR7bmFtZX1gKXx8RXJyb3I7XG5jb25zdCBuZXdFcnJvcj1oYXJkZW4obmV3IEVDKCBgJHttZXNzYWdlfWApKTtcbi8qIEV2ZW4gdGhlIGNsZWFuZWQgdXAgZXJyb3IgY29weSwgaWYgc2VudCB0byB0aGUgY29uc29sZSwgc2hvdWxkKi9cbi8qIGNhdXNlIGhpZGRlbiBkaWFnbm9zdGljIGluZm9ybWF0aW9uIG9mIHRoZSBvcmlnaW5hbCBlcnJvciovXG4vKiB0byBiZSBsb2dnZWQuKi9cbmFzc2VydC5ub3RlKG5ld0Vycm9yLFggYGNvcGllZCBmcm9tIGVycm9yICR7ZXJyfWApO1xucmV0dXJuIG5ld0Vycm9yO1xuIH07JGjigI1fb25jZS50b1Bhc3NhYmxlRXJyb3IodG9QYXNzYWJsZUVycm9yKTtcbmhhcmRlbih0b1Bhc3NhYmxlRXJyb3IpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImdldEVycm9yQ29uc3RydWN0b3IiOlsiZ2V0RXJyb3JDb25zdHJ1Y3RvciJdLCJFcnJvckhlbHBlciI6WyJFcnJvckhlbHBlciJdLCJ0b1Bhc3NhYmxlRXJyb3IiOlsidG9QYXNzYWJsZUVycm9yIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANExutlGCAAARggAADAAAABAZW5kby9tYXJzaGFsLXYwLjcuNS9zcmMvaGVscGVycy9pdGVyLWhlbHBlcnMuanN7ImltcG9ydHMiOlsiLi4vbWFrZS1mYXIuanMiXSwiZXhwb3J0cyI6WyJmaWx0ZXJJdGVyYWJsZSIsIm1hcEl0ZXJhYmxlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEZhcjskaOKAjV9pbXBvcnRzKFtbXCIuLi9tYWtlLWZhci5qc1wiLCBbW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cbi8qKlxuICogVGhlIHJlc3VsdCBpdGVyYXRvciBoYXMgYXMgbWFueSBlbGVtZW50cyBhcyB0aGUgYGJhc2VJdGVyYXRvcmAgYW5kXG4gKiBoYXZlIHRoZSBzYW1lIHRlcm1pbmF0aW9uIC0tIHRoZSBzYW1lIGNvbXBsZXRpb24gdmFsdWUgb3IgZmFpbHVyZVxuICogcmVhc29uLiBCdXQgdGhlIG5vbi1maW5hbCB2YWx1ZXMgYXJlIHRoZSBjb3JyZXNwb25kaW5nIG5vbi1maW5hbFxuICogdmFsdWVzIGZyb20gYGJhc2VJdGVyYXRvcmAgYXMgdHJhbnNmb3JtZWQgYnkgYGZ1bmNgLlxuICpcbiAqIEB0ZW1wbGF0ZSBULFVcbiAqIEBwYXJhbSB7SXRlcmFibGU8VD59IGJhc2VJdGVyYWJsZVxuICogQHBhcmFtIHsodmFsdWU6IFQpID0+IFV9IGZ1bmNcbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxVPn1cbiAqL1xuY29uc3QgICAgICAgIG1hcEl0ZXJhYmxlPShiYXNlSXRlcmFibGUsZnVuYyk9PlxuLyoqIEB0eXBlIHtJdGVyYWJsZTxVPn0gKi9cbkZhcignbWFwcGVkIGl0ZXJhYmxlJyx7XG5bU3ltYm9sLml0ZXJhdG9yXTooKT0+e1xuY29uc3QgYmFzZUl0ZXJhdG9yPWJhc2VJdGVyYWJsZVtTeW1ib2wuaXRlcmF0b3JdKCk7XG5yZXR1cm4gRmFyKCdtYXBwZWQgaXRlcmF0b3InLHtcbm5leHQ6KCk9PntcbmNvbnN0e3ZhbHVlOmJhc2VWYWx1ZSxkb25lfT1iYXNlSXRlcmF0b3IubmV4dCgpO1xuY29uc3QgdmFsdWU9ZG9uZT9iYXNlVmFsdWU6ZnVuYyhiYXNlVmFsdWUpO1xucmV0dXJuIGhhcmRlbih7dmFsdWUsZG9uZX0pO1xuIH19KTtcblxuIH19KTskaOKAjV9vbmNlLm1hcEl0ZXJhYmxlKG1hcEl0ZXJhYmxlKTtcblxuaGFyZGVuKG1hcEl0ZXJhYmxlKTtcblxuLyoqXG4gKiBUaGUgcmVzdWx0IGl0ZXJhdG9yIGhhcyBhIHN1YnNldCBvZiB0aGUgbm9uLWZpbmFsIHZhbHVlcyBmcm9tIHRoZVxuICogYGJhc2VJdGVyYXRvcmAgLS0tIHRob3NlIGZvciB3aGljaCBgcHJlZCh2YWx1ZSlgIHdhcyB0cnV0aHkuIFRoZSByZXN1bHRcbiAqIGhhcyB0aGUgc2FtZSB0ZXJtaW5hdGlvbiBhcyB0aGUgYGJhc2VJdGVyYXRvcmAgLS0gdGhlIHNhbWUgY29tcGxldGlvbiB2YWx1ZVxuICogb3IgZmFpbHVyZSByZWFzb24uXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8VD59IGJhc2VJdGVyYWJsZVxuICogQHBhcmFtIHsodmFsdWU6IFQpID0+IGJvb2xlYW59IHByZWRcbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxUPn1cbiAqL1xuY29uc3QgICAgICAgIGZpbHRlckl0ZXJhYmxlPShiYXNlSXRlcmFibGUscHJlZCk9PlxuLyoqIEB0eXBlIHtJdGVyYWJsZTxVPn0gKi9cbkZhcignZmlsdGVyZWQgaXRlcmFibGUnLHtcbltTeW1ib2wuaXRlcmF0b3JdOigpPT57XG5jb25zdCBiYXNlSXRlcmF0b3I9YmFzZUl0ZXJhYmxlW1N5bWJvbC5pdGVyYXRvcl0oKTtcbnJldHVybiBGYXIoJ2ZpbHRlcmVkIGl0ZXJhdG9yJyx7XG5uZXh0OigpPT57XG5mb3IoOzspe1xuY29uc3QgcmVzdWx0PWJhc2VJdGVyYXRvci5uZXh0KCk7XG5jb25zdHt2YWx1ZSxkb25lfT1yZXN1bHQ7XG5pZihkb25lfHxwcmVkKHZhbHVlKSl7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbiB9XG4gfX0pO1xuXG4gfX0pOyRo4oCNX29uY2UuZmlsdGVySXRlcmFibGUoZmlsdGVySXRlcmFibGUpO1xuXG5oYXJkZW4oZmlsdGVySXRlcmFibGUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1hcEl0ZXJhYmxlIjpbIm1hcEl0ZXJhYmxlIl0sImZpbHRlckl0ZXJhYmxlIjpbImZpbHRlckl0ZXJhYmxlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALx4OMxoEgAAaBIAADUAAABAZW5kby9tYXJzaGFsLXYwLjcuNS9zcmMvaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiUEFTU19TVFlMRSIsImFzc2VydENoZWNrZXIiLCJjYW5CZU1ldGhvZCIsImNoZWNrTm9ybWFsUHJvcGVydHkiLCJjaGVja1RhZ1JlY29yZCIsImdldFRhZyIsImhhc093blByb3BlcnR5T2YiLCJpc09iamVjdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEB0cy1jaGVjayovXG5cbi8qLyA8cmVmZXJlbmNlIHR5cGVzPVwic2VzXCIvPiovXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMuanMnKS5DaGVja2VyfSBDaGVja2VyICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzLmpzJykuUGFzc1N0eWxlfSBQYXNzU3R5bGUgKi9cblxuY29uc3R7ZGV0YWlsczpYLHF1b3RlOnF9PWFzc2VydDtcbmNvbnN0e1xuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLFxuaGFzT3duUHJvcGVydHk6b2JqZWN0SGFzT3duUHJvcGVydHksXG5pc0Zyb3plbn09XG5PYmplY3Q7XG5jb25zdHthcHBseX09UmVmbGVjdDtcbmNvbnN0e2lzQXJyYXl9PUFycmF5O1xuXG5jb25zdCAgICAgICAgaGFzT3duUHJvcGVydHlPZj0ob2JqLHByb3ApPT5cbmFwcGx5KG9iamVjdEhhc093blByb3BlcnR5LG9iaixbcHJvcF0pOyRo4oCNX29uY2UuaGFzT3duUHJvcGVydHlPZihoYXNPd25Qcm9wZXJ0eU9mKTtcbmhhcmRlbihoYXNPd25Qcm9wZXJ0eU9mKTtcblxuY29uc3QgICAgICAgIGlzT2JqZWN0PSh2YWwpPT5PYmplY3QodmFsKT09PXZhbDskaOKAjV9vbmNlLmlzT2JqZWN0KGlzT2JqZWN0KTtcbmhhcmRlbihpc09iamVjdCk7XG5cbmNvbnN0ICAgICAgICBQQVNTX1NUWUxFPVN5bWJvbC5mb3IoJ3Bhc3NTdHlsZScpO1xuXG4vKipcbiAqIEZvciBhIGZ1bmN0aW9uIHRvIGJlIGEgdmFsaWQgbWV0aG9kLCBpdCBtdXN0IG5vdCBiZSBwYXNzYWJsZS5cbiAqIE90aGVyd2lzZSwgd2UgcmlzayBjb25mdXNpbmcgcGFzcy1ieS1jb3B5IGRhdGEgY2FycnlpbmdcbiAqIGZhciBmdW5jdGlvbnMgd2l0aCBhdHRlbXB0cyBhdCBmYXIgb2JqZWN0cyB3aXRoIG1ldGhvZHMuXG4gKlxuICogVE9ETyBIQVpBUkQgQmVjYXVzZSB3ZSBjaGVjayB0aGlzIG9uIHRoZSB3YXkgdG8gaGFyZGVuaW5nIGEgcmVtb3RhYmxlLFxuICogd2UgY2Fubm90IHlldCBjaGVjayB0aGF0IGBmdW5jYCBpcyBoYXJkZW5lZC4gSG93ZXZlciwgd2l0aG91dFxuICogZG9pbmcgc28sIGl0J3MgaW5oZXJpdGFuY2UgbWlnaHQgY2hhbmdlIGFmdGVyIHRoZSBgUEFTU19TVFlMRWBcbiAqIGNoZWNrIGJlbG93LlxuICpcbiAqIEBwYXJhbSB7YW55fSBmdW5jXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqLyRo4oCNX29uY2UuUEFTU19TVFlMRShQQVNTX1NUWUxFKTtcbmNvbnN0ICAgICAgICBjYW5CZU1ldGhvZD0oZnVuYyk9PlxudHlwZW9mIGZ1bmM9PT0nZnVuY3Rpb24nJiYhKFBBU1NfU1RZTEUgaW4gZnVuYyk7JGjigI1fb25jZS5jYW5CZU1ldGhvZChjYW5CZU1ldGhvZCk7XG5oYXJkZW4oY2FuQmVNZXRob2QpO1xuXG4vKipcbiAqIEJlbG93IHdlIGhhdmUgYSBzZXJpZXMgb2YgcHJlZGljYXRlIGZ1bmN0aW9ucyBhbmQgdGhlaXIgKGN1cnJpZWQpIGFzc2VydGlvblxuICogZnVuY3Rpb25zLiBUaGUgc2VtYW50aWNzIG9mIHRoZSBhc3NlcnRpb24gZnVuY3Rpb24gaXMganVzdCB0byBhc3NlcnQgdGhhdFxuICogdGhlIGNvcnJlc3BvbmRpbmcgcHJlZGljYXRlIGZ1bmN0aW9uIHdvdWxkIGhhdmUgcmV0dXJuZWQgdHJ1ZS4gQnV0IGl0XG4gKiByZXByb2R1Y2VzIHRoZSBpbnRlcm5hbCB0ZXN0cyBzbyBmYWlsdXJlcyBjYW4gZ2l2ZSBhIGJldHRlciBlcnJvciBtZXNzYWdlLlxuICpcbiAqIEB0eXBlIHtDaGVja2VyfVxuICovXG5jb25zdCAgICAgICAgYXNzZXJ0Q2hlY2tlcj0oY29uZCxkZXRhaWxzKT0+e1xuYXNzZXJ0KGNvbmQsZGV0YWlscyk7XG5yZXR1cm4gdHJ1ZTtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0Q2hlY2tlcihhc3NlcnRDaGVja2VyKTtcbmhhcmRlbihhc3NlcnRDaGVja2VyKTtcblxuLyoqXG4gKiBAcGFyYW0ge09iamVjdH0gY2FuZGlkYXRlXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ8c3ltYm9sfSBwcm9wZXJ0eU5hbWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lVHlwZVxuICogQHBhcmFtIHtib29sZWFufSBzaG91bGRCZUVudW1lcmFibGVcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgY2hlY2tOb3JtYWxQcm9wZXJ0eT0oXG5jYW5kaWRhdGUsXG5wcm9wZXJ0eU5hbWUsXG5uYW1lVHlwZSxcbnNob3VsZEJlRW51bWVyYWJsZSxcbmNoZWNrKT0+XG57XG5jb25zdCBkZXNjPWdldE93blByb3BlcnR5RGVzY3JpcHRvcihjYW5kaWRhdGUscHJvcGVydHlOYW1lKTtcbmlmKGRlc2M9PT11bmRlZmluZWQpe1xucmV0dXJuIGNoZWNrKGZhbHNlLFggYCR7cShwcm9wZXJ0eU5hbWUpfSBwcm9wZXJ0eSBleHBlY3RlZDogJHtjYW5kaWRhdGV9YCk7XG4gfVxucmV0dXJuKFxuY2hlY2soXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdmFsaWQtdHlwZW9mKi9cbm5hbWVUeXBlPT09dW5kZWZpbmVkfHx0eXBlb2YgcHJvcGVydHlOYW1lPT09bmFtZVR5cGUsXG5YIGAke3EocHJvcGVydHlOYW1lKX0gbXVzdCBiZSBhICR7cShcbm5hbWVUeXBlKVxuIH0tbmFtZWQgcHJvcGVydHk6ICR7Y2FuZGlkYXRlfWApJiYoXG5cbmhhc093blByb3BlcnR5T2YoZGVzYywndmFsdWUnKXx8XG5jaGVjayhcbmZhbHNlLFxuWCBgJHtxKHByb3BlcnR5TmFtZSl9IG11c3Qgbm90IGJlIGFuIGFjY2Vzc29yIHByb3BlcnR5OiAke2NhbmRpZGF0ZX1gKSkmJihcblxuc2hvdWxkQmVFbnVtZXJhYmxlP1xuY2hlY2soXG4hIWRlc2MuZW51bWVyYWJsZSxcblggYCR7cShwcm9wZXJ0eU5hbWUpfSBtdXN0IGJlIGFuIGVudW1lcmFibGUgcHJvcGVydHk6ICR7Y2FuZGlkYXRlfWApOlxuXG5jaGVjayhcbiFkZXNjLmVudW1lcmFibGUsXG5YIGAke3EoXG5wcm9wZXJ0eU5hbWUpXG4gfSBtdXN0IG5vdCBiZSBhbiBlbnVtZXJhYmxlIHByb3BlcnR5OiAke2NhbmRpZGF0ZX1gKSkpO1xuXG5cbiB9OyRo4oCNX29uY2UuY2hlY2tOb3JtYWxQcm9wZXJ0eShjaGVja05vcm1hbFByb3BlcnR5KTtcbmhhcmRlbihjaGVja05vcm1hbFByb3BlcnR5KTtcblxuY29uc3QgICAgICAgIGdldFRhZz0odGFnUmVjb3JkKT0+dGFnUmVjb3JkW1N5bWJvbC50b1N0cmluZ1RhZ107JGjigI1fb25jZS5nZXRUYWcoZ2V0VGFnKTtcbmhhcmRlbihnZXRUYWcpO1xuXG4vKipcbiAqIEBwYXJhbSB7eyBbUEFTU19TVFlMRV06IHN0cmluZyB9fSB0YWdSZWNvcmRcbiAqIEBwYXJhbSB7UGFzc1N0eWxlfSBwYXNzU3R5bGVcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgY2hlY2tUYWdSZWNvcmQ9KHRhZ1JlY29yZCxwYXNzU3R5bGUsY2hlY2spPT57XG5yZXR1cm4oXG4odHlwZW9mIHRhZ1JlY29yZD09PSdvYmplY3QnJiZ0YWdSZWNvcmQhPT1udWxsfHxcbmNoZWNrKGZhbHNlLFggYEEgbm9uLW9iamVjdCBjYW5ub3QgYmUgYSB0YWdSZWNvcmQ6ICR7dGFnUmVjb3JkfWApKSYmXG5jaGVjayhpc0Zyb3plbih0YWdSZWNvcmQpLFggYEEgdGFnUmVjb3JkIG11c3QgYmUgZnJvemVuOiAke3RhZ1JlY29yZH1gKSYmKFxuIWlzQXJyYXkodGFnUmVjb3JkKXx8XG5jaGVjayhmYWxzZSxYIGBBbiBhcnJheSBjYW5ub3QgYmUgYSB0YWdSZWNvcmRzOiAke3RhZ1JlY29yZH1gKSkmJlxuY2hlY2tOb3JtYWxQcm9wZXJ0eSh0YWdSZWNvcmQsUEFTU19TVFlMRSwnc3ltYm9sJyxmYWxzZSxjaGVjaykmJlxuY2hlY2soXG50YWdSZWNvcmRbUEFTU19TVFlMRV09PT1wYXNzU3R5bGUsXG5YIGBFeHBlY3RlZCAke3EocGFzc1N0eWxlKX0sIG5vdCAke3EoXG50YWdSZWNvcmRbUEFTU19TVFlMRV0pXG4gfTogJHt0YWdSZWNvcmR9YCkmJlxuXG5jaGVja05vcm1hbFByb3BlcnR5KFxudGFnUmVjb3JkLFxuU3ltYm9sLnRvU3RyaW5nVGFnLFxuJ3N5bWJvbCcsXG5mYWxzZSxcbmNoZWNrKSYmKFxuXG50eXBlb2YgZ2V0VGFnKHRhZ1JlY29yZCk9PT0nc3RyaW5nJ3x8XG5jaGVjayhcbmZhbHNlLFxuWCBgQSBbU3ltYm9sLnRvU3RyaW5nXS1uYW1lZCBwcm9wZXJ0eSBtdXN0IGJlIGEgc3RyaW5nOiAke3RhZ1JlY29yZH1gKSkpO1xuXG5cbiB9OyRo4oCNX29uY2UuY2hlY2tUYWdSZWNvcmQoY2hlY2tUYWdSZWNvcmQpO1xuaGFyZGVuKGNoZWNrVGFnUmVjb3JkKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJoYXNPd25Qcm9wZXJ0eU9mIjpbImhhc093blByb3BlcnR5T2YiXSwiaXNPYmplY3QiOlsiaXNPYmplY3QiXSwiUEFTU19TVFlMRSI6WyJQQVNTX1NUWUxFIl0sImNhbkJlTWV0aG9kIjpbImNhbkJlTWV0aG9kIl0sImFzc2VydENoZWNrZXIiOlsiYXNzZXJ0Q2hlY2tlciJdLCJjaGVja05vcm1hbFByb3BlcnR5IjpbImNoZWNrTm9ybWFsUHJvcGVydHkiXSwiZ2V0VGFnIjpbImdldFRhZyJdLCJjaGVja1RhZ1JlY29yZCI6WyJjaGVja1RhZ1JlY29yZCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAgIflr3h4AAN4eAAAtAAAAQGVuZG8vbWFyc2hhbC12MC43LjUvc3JjL2hlbHBlcnMvcmVtb3RhYmxlLmpzeyJpbXBvcnRzIjpbIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJSZW1vdGFibGVIZWxwZXIiLCJhc3NlcnRJZmFjZSIsImdldEludGVyZmFjZU9mIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydENoZWNrZXIsY2FuQmVNZXRob2QsaGFzT3duUHJvcGVydHlPZixQQVNTX1NUWUxFLGNoZWNrVGFnUmVjb3JkLGlzT2JqZWN0LGdldFRhZzskaOKAjV9pbXBvcnRzKFtbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXSxbXCJjYW5CZU1ldGhvZFwiLCBbJGjigI1fYSA9PiAoY2FuQmVNZXRob2QgPSAkaOKAjV9hKV1dLFtcImhhc093blByb3BlcnR5T2ZcIiwgWyRo4oCNX2EgPT4gKGhhc093blByb3BlcnR5T2YgPSAkaOKAjV9hKV1dLFtcIlBBU1NfU1RZTEVcIiwgWyRo4oCNX2EgPT4gKFBBU1NfU1RZTEUgPSAkaOKAjV9hKV1dLFtcImNoZWNrVGFnUmVjb3JkXCIsIFskaOKAjV9hID0+IChjaGVja1RhZ1JlY29yZCA9ICRo4oCNX2EpXV0sW1wiaXNPYmplY3RcIiwgWyRo4oCNX2EgPT4gKGlzT2JqZWN0ID0gJGjigI1fYSldXSxbXCJnZXRUYWdcIiwgWyRo4oCNX2EgPT4gKGdldFRhZyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzLmpzJykuQ2hlY2tlcn0gQ2hlY2tlciAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcy5qcycpLkludGVyZmFjZVNwZWN9IEludGVyZmFjZVNwZWMgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMuanMnKS5NYXJzaGFsR2V0SW50ZXJmYWNlT2Z9IE1hcnNoYWxHZXRJbnRlcmZhY2VPZiAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL2ludGVybmFsLXR5cGVzLmpzJykuUGFzc1N0eWxlSGVscGVyfSBQYXNzU3R5bGVIZWxwZXIgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMuanMnKS5SZW1vdGFibGV9IFJlbW90YWJsZSAqL1xuXG5jb25zdHtkZXRhaWxzOlgscXVvdGU6cX09YXNzZXJ0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e3Byb3RvdHlwZTpmdW5jdGlvblByb3RvdHlwZX09RnVuY3Rpb247XG5jb25zdHtpc0FycmF5fT1BcnJheTtcbmNvbnN0e1xuZ2V0UHJvdG90eXBlT2YsXG5pc0Zyb3plbixcbnByb3RvdHlwZTpvYmplY3RQcm90b3R5cGUsXG5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzfT1cbk9iamVjdDtcblxuLyoqXG4gKiBAcGFyYW0ge0ludGVyZmFjZVNwZWN9IGlmYWNlXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKi9cbmNvbnN0IGNoZWNrSWZhY2U9KGlmYWNlLGNoZWNrKT0+e1xucmV0dXJuKFxuLyogVE9ETyBvdGhlciBwb3NzaWJsZSBpZmFjZXMsIG9uY2Ugd2UgaGF2ZSB0aGlyZCBwYXJ0eSB2ZXJhY2l0eSovXG4odHlwZW9mIGlmYWNlPT09J3N0cmluZyd8fFxuY2hlY2soXG5mYWxzZSxcblggYEZvciBub3csIGludGVyZmFjZSAke2lmYWNlfSBtdXN0IGJlIGEgc3RyaW5nOyB1bmltcGxlbWVudGVkYCkpJiZcblxuY2hlY2soXG5pZmFjZT09PSdSZW1vdGFibGUnfHxpZmFjZS5zdGFydHNXaXRoKCdBbGxlZ2VkOiAnKSxcblggYEZvciBub3csIGlmYWNlICR7cShcbmlmYWNlKVxuIH0gbXVzdCBiZSBcIlJlbW90YWJsZVwiIG9yIGJlZ2luIHdpdGggXCJBbGxlZ2VkOiBcIjsgdW5pbXBsZW1lbnRlZGApKTtcblxuXG4gfTtcblxuLyoqXG4gKiBBbiBgaWZhY2VgIG11c3QgYmUgcHVyZS4gUmlnaHQgbm93IGl0IG11c3QgYmUgYSBzdHJpbmcsIHdoaWNoIGlzIHB1cmUuXG4gKiBMYXRlciB3ZSBleHBlY3QgdG8gaW5jbHVkZSBzb21lIG90aGVyIHZhbHVlcyB0aGF0IHF1YWxpZnkgYXMgYFB1cmVEYXRhYCxcbiAqIHdoaWNoIGlzIGEgcGFzcy1ieS1jb3B5IHN1cGVyc3RydWN0dXJlIGVuZGluZyBvbmx5IGluIHByaW1pdGl2ZXMgb3JcbiAqIGVtcHR5IHBhc3MtYnktY29weSBjb21wb3NpdGVzLiBObyByZW1vdGFibGVzLCBwcm9taXNlcywgb3IgZXJyb3JzLlxuICogV2UgKmFzc3VtZSogZm9yIG5vdyB0aGF0IHRoZSBwYXNzLWJ5LWNvcHkgc3VwZXJzdHJ1Y3R1cmUgY29udGFpbnMgbm9cbiAqIHByb3hpZXMuXG4gKlxuICogQHBhcmFtIHtJbnRlcmZhY2VTcGVjfSBpZmFjZVxuICovXG5jb25zdCAgICAgICAgYXNzZXJ0SWZhY2U9KGlmYWNlKT0+Y2hlY2tJZmFjZShpZmFjZSxhc3NlcnRDaGVja2VyKTskaOKAjV9vbmNlLmFzc2VydElmYWNlKGFzc2VydElmYWNlKTtcbmhhcmRlbihhc3NlcnRJZmFjZSk7XG5cbi8qKlxuICogQHBhcmFtIHthbnl9IG9yaWdpbmFsXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tSZW1vdGFibGVQcm90b09mPShvcmlnaW5hbCxjaGVjayk9Pntcbi8qIEEgdmFsaWQgcmVtb3RhYmxlIG9iamVjdCBtdXN0IGluaGVyaXQgZnJvbSBhIFwidGFnIHJlY29yZFwiIC0tIGEqL1xuLyogcGxhaW4tb2JqZWN0IHByb3RvdHlwZSBjb25zaXN0aW5nIG9mIG9ubHkqL1xuLyogYSBzdWl0YWJsZSBgUEFTU19TVFlMRWAgcHJvcGVydHkgYW5kIGEgc3VpdGFibGUgYFN5bWJvbC50b1N0cmluZ1RhZ2AqL1xuLyogcHJvcGVydHkuIFRoZSByZW1vdGFibGUgY291bGQgaW5oZXJpdCBkaXJlY3RseSBmcm9tIHN1Y2ggYSB0YWcgcmVjb3JkLCBvciovXG4vKiBpdCBjb3VsZCBpbmhlcml0IGZyb20gYW5vdGhlciB2YWxpZCByZW1vdGFibGUsIHRoYXQgdGhlcmVmb3JlIGl0c2VsZiovXG4vKiBpbmhlcml0cyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGZyb20gc3VjaCBhIHRhZyByZWNvcmQuKi9cbi8qKi9cbi8qIFRPRE86IEl0IHdvdWxkIGJlIG5pY2UgdG8gdHlwZWRlZiB0aGlzIHNoYXBlLCBidXQgd2UgY2FuJ3QgZGVjbGFyZSBhIHR5cGUqL1xuLyogd2l0aCBQQVNTX1NUWUxFIGZyb20gSlNEb2MuKi9cbi8qKi9cbi8qIEB0eXBlIHt7IFtQQVNTX1NUWUxFXTogc3RyaW5nLCovXG4vKiBbU3ltYm9sLnRvU3RyaW5nVGFnXTogc3RyaW5nLCovXG4vKiB9fSovXG4vKiovXG5jb25zdCBwcm90bz1nZXRQcm90b3R5cGVPZihvcmlnaW5hbCk7XG5jb25zdCBwcm90b1Byb3RvPXByb3RvPT09bnVsbD9udWxsOmdldFByb3RvdHlwZU9mKHByb3RvKTtcbmlmKFxudHlwZW9mIG9yaWdpbmFsPT09J29iamVjdCcmJlxucHJvdG8hPT1vYmplY3RQcm90b3R5cGUmJlxucHJvdG9Qcm90byE9PW9iamVjdFByb3RvdHlwZSYmXG5wcm90b1Byb3RvIT09bnVsbClcbntcbnJldHVybihcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5SZW1vdGFibGVIZWxwZXIuY2FuQmVWYWxpZChwcm90byxjaGVjaykmJmNoZWNrUmVtb3RhYmxlKHByb3RvLGNoZWNrKSk7XG5cbiB9XG5cbmlmKFxuIShcbmNoZWNrKFxuLyogU2luY2Ugd2UncmUgd29ya2luZyB3aXRoIFR5cGVTY3JpcHQncyB1bnNvdW5kIHR5cGUgc3lzdGVtLCBtb3N0bHkqL1xuLyogdG8gY2F0Y2ggYWNjaWRlbnRzIGFuZCB0byBwcm92aWRlIElERSBzdXBwb3J0LCB3ZSB0eXBlIGFyZ3VtZW50cyovXG4vKiBsaWtlIGB2YWxgIGFjY29yZGluZyB0byB3aGF0IHRoZXkgYXJlIHN1cHBvc2VkIHRvIGJlLiBUaGUgZm9sbG93aW5nKi9cbi8qIHRlc3RzIGZvciBhIHBhcnRpY3VsYXIgdmlvbGF0aW9uLiBIb3dldmVyLCBUeXBlU2NyaXB0IGNvbXBsYWlucyovXG4vKiBiZWNhdXNlICppZiB0aGUgZGVjbGFyZWQgdHlwZSB3ZXJlIGFjY3VyYXRlKiwgdGhlbiB0aGUgY29uZGl0aW9uKi9cbi8qIHdvdWxkIGFsd2F5cyByZXR1cm4gdHJ1ZS4qL1xuLyogQHRzLWlnbm9yZSBUeXBlU2NyaXB0IGFzc3VtZXMgd2hhdCB3ZSdyZSB0cnlpbmcgdG8gY2hlY2sqL1xucHJvdG8hPT1vYmplY3RQcm90b3R5cGUsXG5YIGBSZW1vdGFibGVzIG11c3QgYmUgZXhwbGljaXRseSBkZWNsYXJlZDogJHtxKG9yaWdpbmFsKX1gKSYmXG5jaGVja1RhZ1JlY29yZChwcm90bywncmVtb3RhYmxlJyxjaGVjaykpKVxuXG57XG5yZXR1cm4gZmFsc2U7XG4gfVxuXG5pZih0eXBlb2Ygb3JpZ2luYWw9PT0nb2JqZWN0Jyl7XG5pZihcbiFjaGVjayhcbnByb3RvUHJvdG89PT1vYmplY3RQcm90b3R5cGV8fHByb3RvUHJvdG89PT1udWxsLFxuWCBgVGhlIFJlbW90YWJsZSBQcm90byBtYXJrZXIgY2Fubm90IGluaGVyaXQgZnJvbSBhbnl0aGluZyB1bnVzdWFsYCkpXG5cbntcbnJldHVybiBmYWxzZTtcbiB9XG4gfWVsc2UgaWYodHlwZW9mIG9yaWdpbmFsPT09J2Z1bmN0aW9uJyl7XG5pZihcbiFjaGVjayhcbnByb3RvUHJvdG89PT1mdW5jdGlvblByb3RvdHlwZXx8XG5nZXRQcm90b3R5cGVPZihwcm90b1Byb3RvKT09PWZ1bmN0aW9uUHJvdG90eXBlLFxuWCBgRm9yIGZhciBmdW5jdGlvbnMsIHRoZSBSZW1vdGFibGUgUHJvdG8gbWFya2VyIG11c3QgaW5oZXJpdCBmcm9tIEZ1bmN0aW9uLnByb3RvdHlwZSwgaW4gJHtvcmlnaW5hbH1gKSlcblxue1xucmV0dXJuIGZhbHNlO1xuIH1cbiB9ZWxzZXtcbmFzc2VydC5mYWlsKFggYHVucmVjb2duaXplZCB0eXBlb2YgJHtvcmlnaW5hbH1gKTtcbiB9XG5cbmNvbnN0e1xuW1BBU1NfU1RZTEVdOl9wYXNzU3R5bGUsXG5bU3ltYm9sLnRvU3RyaW5nVGFnXTppZmFjZSxcbi4uLnJlc3R9PVxucHJvdG87XG5cbnJldHVybihcbihvd25LZXlzKHJlc3QpLmxlbmd0aD09PTB8fFxuY2hlY2soXG5mYWxzZSxcblggYFVuZXhwZWN0ZWQgcHJvcGVydGllcyBvbiBSZW1vdGFibGUgUHJvdG8gJHtvd25LZXlzKHJlc3QpfWApKSYmXG5cbmNoZWNrSWZhY2UoaWZhY2UsY2hlY2spKTtcblxuIH07XG5cbi8qKlxuICogQHBhcmFtIHtSZW1vdGFibGV9IHZhbFxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrUmVtb3RhYmxlPSh2YWwsY2hlY2spPT57XG5jb25zdCBub3Q9KGNvbmQsZGV0YWlscyk9PiFjaGVjayhjb25kLGRldGFpbHMpO1xuaWYobm90KGlzRnJvemVuKHZhbCksWCBgY2Fubm90IHNlcmlhbGl6ZSBub24tZnJvemVuIG9iamVjdHMgbGlrZSAke3ZhbH1gKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbmlmKCFSZW1vdGFibGVIZWxwZXIuY2FuQmVWYWxpZCh2YWwsY2hlY2spKXtcbnJldHVybiBmYWxzZTtcbiB9XG5yZXR1cm4gY2hlY2tSZW1vdGFibGVQcm90b09mKHZhbCxjaGVjayk7XG4gfTtcblxuY29uc3QgaXNSZW1vdGFibGU9KHZhbCk9PmNoZWNrUmVtb3RhYmxlKHZhbCwoeCk9PngpO1xuXG4vKiogQHR5cGUge01hcnNoYWxHZXRJbnRlcmZhY2VPZn0gKi9cbmNvbnN0ICAgICAgICBnZXRJbnRlcmZhY2VPZj0odmFsKT0+e1xuY29uc3QgdHlwZXN0cj10eXBlb2YgdmFsO1xuaWYoXG50eXBlc3RyIT09J29iamVjdCcmJnR5cGVzdHIhPT0nZnVuY3Rpb24nfHxcbnZhbD09PW51bGx8fFxudmFsW1BBU1NfU1RZTEVdIT09J3JlbW90YWJsZSd8fFxuIWlzUmVtb3RhYmxlKHZhbCkpXG57XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cbnJldHVybiBnZXRUYWcodmFsKTtcbiB9OyRo4oCNX29uY2UuZ2V0SW50ZXJmYWNlT2YoZ2V0SW50ZXJmYWNlT2YpO1xuaGFyZGVuKGdldEludGVyZmFjZU9mKTtcblxuLyoqXG4gKlxuICogQHR5cGUge1Bhc3NTdHlsZUhlbHBlcn1cbiAqL1xuY29uc3QgICAgICAgIFJlbW90YWJsZUhlbHBlcj1oYXJkZW4oe1xuc3R5bGVOYW1lOidyZW1vdGFibGUnLFxuXG5jYW5CZVZhbGlkOihjYW5kaWRhdGUsY2hlY2spPT57XG5pZihcbiEoXG4oaXNPYmplY3QoY2FuZGlkYXRlKXx8XG5jaGVjayhmYWxzZSxYIGBjYW5ub3Qgc2VyaWFsaXplIG5vbi1vYmplY3RzIGxpa2UgJHtjYW5kaWRhdGV9YCkpJiZcbmNoZWNrKCFpc0FycmF5KGNhbmRpZGF0ZSksWCBgQXJyYXlzIGNhbm5vdCBiZSBwYXNzLWJ5LXJlbW90ZWApKSlcblxue1xucmV0dXJuIGZhbHNlO1xuIH1cblxuY29uc3QgZGVzY3M9Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhjYW5kaWRhdGUpO1xuaWYodHlwZW9mIGNhbmRpZGF0ZT09PSdvYmplY3QnKXtcbmNvbnN0IGtleXM9b3duS2V5cyhkZXNjcyk7LyogZW51bWVyYWJsZS1hbmQtbm90LCBzdHJpbmctb3ItU3ltYm9sKi9cbnJldHVybiBrZXlzLmV2ZXJ5KFxuKGtleSk9PlxuLyogVHlwZWNhc3QgbmVlZGVkIGR1ZSB0byBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzE4NjMqL1xuY2hlY2soXG5oYXNPd25Qcm9wZXJ0eU9mKGRlc2NzWy8qKiBAdHlwZSB7c3RyaW5nfSAqL2tleV0sJ3ZhbHVlJyksXG5YIGBjYW5ub3Qgc2VyaWFsaXplIFJlbW90YWJsZXMgd2l0aCBhY2Nlc3NvcnMgbGlrZSAke3EoXG5TdHJpbmcoa2V5KSlcbiB9IGluICR7Y2FuZGlkYXRlfWApJiZcblxuY2hlY2soXG5jYW5CZU1ldGhvZChjYW5kaWRhdGVba2V5XSksXG5YIGBjYW5ub3Qgc2VyaWFsaXplIFJlbW90YWJsZXMgd2l0aCBub24tbWV0aG9kcyBsaWtlICR7cShcblN0cmluZyhrZXkpKVxuIH0gaW4gJHtjYW5kaWRhdGV9YCkmJihcblxua2V5IT09UEFTU19TVFlMRXx8XG5jaGVjayhmYWxzZSxYIGBBIHBhc3MtYnktcmVtb3RlIGNhbm5vdCBzaGFkb3cgJHtxKFBBU1NfU1RZTEUpfWApKSk7XG5cbiB9ZWxzZSBpZih0eXBlb2YgY2FuZGlkYXRlPT09J2Z1bmN0aW9uJyl7XG4vKiBGYXIgZnVuY3Rpb25zIGNhbm5vdCBiZSBtZXRob2RzLCBhbmQgY2Fubm90IGhhdmUgbWV0aG9kcy4qL1xuLyogVGhleSBtdXN0IGhhdmUgZXhhY3RseSBleHBlY3RlZCBgLm5hbWVgIGFuZCBgLmxlbmd0aGAgcHJvcGVydGllcyovXG5jb25zdHtuYW1lOm5hbWVEZXNjLGxlbmd0aDpsZW5ndGhEZXNjLC4uLnJlc3REZXNjc309ZGVzY3M7XG5jb25zdCByZXN0S2V5cz1vd25LZXlzKHJlc3REZXNjcyk7XG5yZXR1cm4oXG5jaGVjayhcbm5hbWVEZXNjJiZ0eXBlb2YgbmFtZURlc2MudmFsdWU9PT0nc3RyaW5nJyxcblggYEZhciBmdW5jdGlvbiBuYW1lIG11c3QgYmUgYSBzdHJpbmcsIGluICR7Y2FuZGlkYXRlfWApJiYoXG5cbmxlbmd0aERlc2MmJnR5cGVvZiBsZW5ndGhEZXNjLnZhbHVlPT09J251bWJlcid8fFxuY2hlY2soXG5mYWxzZSxcblggYEZhciBmdW5jdGlvbiBsZW5ndGggbXVzdCBiZSBhIG51bWJlciwgaW4gJHtjYW5kaWRhdGV9YCkpJiYoXG5cbnJlc3RLZXlzLmxlbmd0aD09PTB8fFxuY2hlY2soXG5mYWxzZSxcblggYEZhciBmdW5jdGlvbnMgdW5leHBlY3RlZCBwcm9wZXJ0aWVzIGJlc2lkZXMgLm5hbWUgYW5kIC5sZW5ndGggJHtyZXN0S2V5c31gKSkpO1xuXG5cbiB9ZWxzZXtcbnJldHVybiBjaGVjayhmYWxzZSxYIGB1bnJlY29nbml6ZWQgdHlwZW9mICR7Y2FuZGlkYXRlfWApO1xuIH1cbiB9LFxuXG5hc3NlcnRWYWxpZDooY2FuZGlkYXRlKT0+e1xuUmVtb3RhYmxlSGVscGVyLmNhbkJlVmFsaWQoY2FuZGlkYXRlLGFzc2VydENoZWNrZXIpO1xuY2hlY2tSZW1vdGFibGUoY2FuZGlkYXRlLGFzc2VydENoZWNrZXIpO1xuIH0sXG5cbmV2ZXJ5OihfcGFzc2FibGUsX2ZuKT0+dHJ1ZX0pOyRo4oCNX29uY2UuUmVtb3RhYmxlSGVscGVyKFJlbW90YWJsZUhlbHBlcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYXNzZXJ0SWZhY2UiOlsiYXNzZXJ0SWZhY2UiXSwiZ2V0SW50ZXJmYWNlT2YiOlsiZ2V0SW50ZXJmYWNlT2YiXSwiUmVtb3RhYmxlSGVscGVyIjpbIlJlbW90YWJsZUhlbHBlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAFyiDZIg8AACIPAAAwAAAAQGVuZG8vbWFyc2hhbC12MC43LjUvc3JjL2hlbHBlcnMvc2FmZS1wcm9taXNlLmpzeyJpbXBvcnRzIjpbIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiLCJAZW5kby9wcm9taXNlLWtpdCJdLCJleHBvcnRzIjpbImFzc2VydFNhZmVQcm9taXNlIiwiaXNTYWZlUHJvbWlzZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBpc1Byb21pc2UsYXNzZXJ0Q2hlY2tlcixoYXNPd25Qcm9wZXJ0eU9mOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJpc1Byb21pc2VcIiwgWyRo4oCNX2EgPT4gKGlzUHJvbWlzZSA9ICRo4oCNX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXSxbXCJoYXNPd25Qcm9wZXJ0eU9mXCIsIFskaOKAjV9hID0+IChoYXNPd25Qcm9wZXJ0eU9mID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzLmpzJykuQ2hlY2tlcn0gQ2hlY2tlciAqL1xuXG5jb25zdHtkZXRhaWxzOlgscXVvdGU6cX09YXNzZXJ0O1xuY29uc3R7aXNGcm96ZW4sZ2V0UHJvdG90eXBlT2Z9PU9iamVjdDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5cbi8qKlxuICogQHBhcmFtIHtQcm9taXNlfSBwciBUaGUgdmFsdWUgdG8gZXhhbWluZVxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge3ByIGlzIFByb21pc2V9IFdoZXRoZXIgaXQgaXMgYSBzYWZlIHByb21pc2VcbiAqL1xuY29uc3QgY2hlY2tQcm9taXNlT3duS2V5cz0ocHIsY2hlY2spPT57XG5jb25zdCBrZXlzPW93bktleXMocHIpO1xuXG5pZihrZXlzLmxlbmd0aD09PTApe1xucmV0dXJuIHRydWU7XG4gfVxuXG5jb25zdCB1bmtub3duS2V5cz1rZXlzLmZpbHRlcihcbihrZXkpPT50eXBlb2Yga2V5IT09J3N5bWJvbCd8fCFoYXNPd25Qcm9wZXJ0eU9mKFByb21pc2UucHJvdG90eXBlLGtleSkpO1xuXG5cbmlmKHVua25vd25LZXlzLmxlbmd0aCE9PTApe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGAke3ByfSAtIE11c3Qgbm90IGhhdmUgYW55IG93biBwcm9wZXJ0aWVzOiAke3EodW5rbm93bktleXMpfWApO1xuXG4gfVxuXG4vKipcbiAqIEF0IHRoZSB0aW1lIG9mIHRoaXMgd3JpdGluZywgTm9kZSdzIGFzeW5jX2hvb2tzIGNvbnRhaW5zIHRoZVxuICogZm9sbG93aW5nIGNvZGUsIHdoaWNoIHdlIGNhbiBhbHNvIHNhZmVseSB0b2xlcmF0ZVxuICpcbiAqIGBgYGpzXG4gKiBmdW5jdGlvbiBkZXN0cm95VHJhY2tpbmcocHJvbWlzZSwgcGFyZW50KSB7XG4gKiB0cmFja1Byb21pc2UocHJvbWlzZSwgcGFyZW50KTtcbiAqICAgY29uc3QgYXN5bmNJZCA9IHByb21pc2VbYXN5bmNfaWRfc3ltYm9sXTtcbiAqICAgY29uc3QgZGVzdHJveWVkID0geyBkZXN0cm95ZWQ6IGZhbHNlIH07XG4gKiAgIHByb21pc2VbZGVzdHJveWVkU3ltYm9sXSA9IGRlc3Ryb3llZDtcbiAqICAgcmVnaXN0ZXJEZXN0cm95SG9vayhwcm9taXNlLCBhc3luY0lkLCBkZXN0cm95ZWQpO1xuICogfVxuICogYGBgXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8c3ltYm9sfSBrZXlcbiAqL1xuY29uc3QgY2hlY2tTYWZlQXN5bmNIb29rc0tleT0oa2V5KT0+e1xuY29uc3QgdmFsPXByW2tleV07XG5pZih2YWw9PT11bmRlZmluZWR8fHR5cGVvZiB2YWw9PT0nbnVtYmVyJyl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5pZihcbnR5cGVvZiB2YWw9PT0nb2JqZWN0JyYmXG52YWwhPT1udWxsJiZcbmlzRnJvemVuKHZhbCkmJlxuZ2V0UHJvdG90eXBlT2YodmFsKT09PU9iamVjdC5wcm90b3R5cGUpXG57XG5jb25zdCBzdWJLZXlzPW93bktleXModmFsKTtcbmlmKHN1YktleXMubGVuZ3RoPT09MCl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5cbmlmKFxuc3ViS2V5cy5sZW5ndGg9PT0xJiZcbnN1YktleXNbMF09PT0nZGVzdHJveWVkJyYmXG52YWwuZGVzdHJveWVkPT09ZmFsc2UpXG57XG5yZXR1cm4gdHJ1ZTtcbiB9XG4gfVxucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBVbmV4cGVjdGVkIE5vZGUgYXN5bmNfaG9va3MgYWRkaXRpb25zIHRvIHByb21pc2U6ICR7cHJ9LiR7cShcblN0cmluZyhrZXkpKVxuIH0gaXMgJHt2YWx9YCk7XG5cbiB9O1xuXG5yZXR1cm4ga2V5cy5ldmVyeShjaGVja1NhZmVBc3luY0hvb2tzS2V5KTtcbiB9O1xuXG4vKipcbiAqIFVuZGVyIEhhcmRlbmVkIEpTIGEgcHJvbWlzZSBpcyBcInNhZmVcIiBpZiBpdHMgYHRoZW5gIG1ldGhvZCBjYW4gYmUgY2FsbGVkXG4gKiBzeW5jaHJvbm91c2x5IHdpdGhvdXQgZ2l2aW5nIHRoZSBwcm9taXNlIGFuIG9wcG9ydHVuaXR5IGZvciBhXG4gKiByZWVudHJhbmN5IGF0dGFjayBkdXJpbmcgdGhhdCBjYWxsLlxuICpcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvOVxuICogcmFpc2VzIHRoZSBpc3N1ZSBvZiB0ZXN0aW5nIHRoYXQgYSBzcGVjaW1lbiBpcyBhIHNhZmUgcHJvbWlzZVxuICogc3VjaCB0aGF0IHRoZSB0ZXN0IGFsc28gZG9lcyBub3QgZ2l2ZSB0aGUgc3BlY2ltZW4gYVxuICogcmVlbnRyYW5jeSBvcHBvcnR1bml0eS4gVGhhdCBpcyB3ZWxsIGJleW9uZCB0aGUgYW1iaXRpb24gaGVyZS5cbiAqIFRPRE8gVGhvdWdoIGlmIHdlIGZpZ3VyZSBvdXQgYSBuaWNlIHNvbHV0aW9uLCBpdCBtaWdodCBiZSBnb29kIHRvXG4gKiB1c2UgaXQgaGVyZSBhcyB3ZWxsLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gcHIgVGhlIHZhbHVlIHRvIGV4YW1pbmVcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtwciBpcyBQcm9taXNlfSBXaGV0aGVyIGl0IGlzIGEgc2FmZSBwcm9taXNlXG4gKi9cbmNvbnN0IGNoZWNrU2FmZVByb21pc2U9KHByLGNoZWNrKT0+XG5jaGVjayhpc0Zyb3plbihwciksWCBgJHtwcn0gLSBNdXN0IGJlIGZyb3plbmApJiZcbmNoZWNrKGlzUHJvbWlzZShwciksWCBgJHtwcn0gLSBNdXN0IGJlIGEgcHJvbWlzZWApJiYoXG5nZXRQcm90b3R5cGVPZihwcik9PT1Qcm9taXNlLnByb3RvdHlwZXx8XG5jaGVjayhcbmZhbHNlLFxuWCBgJHtwcn0gLSBNdXN0IGluaGVyaXQgZnJvbSBQcm9taXNlLnByb3RvdHlwZTogJHtxKGdldFByb3RvdHlwZU9mKHByKSl9YCkpJiZcblxuY2hlY2tQcm9taXNlT3duS2V5cygvKiogQHR5cGUge1Byb21pc2V9ICovcHIsY2hlY2spO1xuaGFyZGVuKGNoZWNrU2FmZVByb21pc2UpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiB0aGUgYXJndW1lbnQgaXMgYSBQcm9taXNlLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gcHIgVGhlIHZhbHVlIHRvIGV4YW1pbmVcbiAqIEByZXR1cm5zIHtwciBpcyBQcm9taXNlfSBXaGV0aGVyIGl0IGlzIGEgcHJvbWlzZVxuICovXG5jb25zdCAgICAgICAgaXNTYWZlUHJvbWlzZT0ocHIpPT5jaGVja1NhZmVQcm9taXNlKHByLCh4KT0+eCk7JGjigI1fb25jZS5pc1NhZmVQcm9taXNlKGlzU2FmZVByb21pc2UpO1xuaGFyZGVuKGlzU2FmZVByb21pc2UpO1xuXG5jb25zdCAgICAgICAgYXNzZXJ0U2FmZVByb21pc2U9KHByKT0+Y2hlY2tTYWZlUHJvbWlzZShwcixhc3NlcnRDaGVja2VyKTskaOKAjV9vbmNlLmFzc2VydFNhZmVQcm9taXNlKGFzc2VydFNhZmVQcm9taXNlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc1NhZmVQcm9taXNlIjpbImlzU2FmZVByb21pc2UiXSwiYXNzZXJ0U2FmZVByb21pc2UiOlsiYXNzZXJ0U2FmZVByb21pc2UiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA8VX/HtgSAADYEgAAKgAAAEBlbmRvL21hcnNoYWwtdjAuNy41L3NyYy9oZWxwZXJzL3N5bWJvbC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiQXRBdFByZWZpeFBhdHRlcm4iLCJhc3NlcnRQYXNzYWJsZVN5bWJvbCIsImlzUGFzc2FibGVTeW1ib2wiLCJuYW1lRm9yUGFzc2FibGVTeW1ib2wiLCJwYXNzYWJsZVN5bWJvbEZvck5hbWUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBAdHMtY2hlY2sqL1xuXG5jb25zdHtkZXRhaWxzOlgscXVvdGU6cX09YXNzZXJ0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcblxuLyoqXG4gKiBUaGUgd2VsbCBrbm93biBzeW1ib2xzIGFyZSBzdGF0aWMgc3ltYm9sIHZhbHVlcyBvbiB0aGUgYFN5bWJvbGAgY29uc3RydWN0b3IuXG4gKi9cbmNvbnN0IHdlbGxLbm93blN5bWJvbE5hbWVzPW5ldyBNYXAoXG5vd25LZXlzKFN5bWJvbCkuXG5maWx0ZXIoXG4obmFtZSk9PnR5cGVvZiBuYW1lPT09J3N0cmluZycmJnR5cGVvZiBTeW1ib2xbbmFtZV09PT0nc3ltYm9sJykuXG5cbmZpbHRlcigobmFtZSk9PntcbmFzc2VydChcbi8qIEB0cy1pZ25vcmUgSXQgZG9lc24ndCBrbm93IG5hbWUgY2Fubm90IGJlIGEgc3ltYm9sKi9cbiFuYW1lLnN0YXJ0c1dpdGgoJ0BAJyksXG5YIGBEaWQgbm90IGV4cGVjdCBTeW1ib2wgdG8gaGF2ZSBhIHN5bWJvbC12YWx1ZWQgcHJvcGVydHkgbmFtZSBzdGFydGluZyB3aXRoIFwiQEBcIiAke3EoXG5uYW1lKVxuIH1gKTtcblxucmV0dXJuIHRydWU7XG4gfSlcbi8qIEB0cy1pZ25vcmUgSXQgZG9lc24ndCBrbm93IG5hbWUgY2Fubm90IGJlIGEgc3ltYm9sKi8uXG5tYXAoKG5hbWUpPT5bU3ltYm9sW25hbWVdLCBgQEAke25hbWV9YF0pKTtcblxuXG4vKipcbiAqIFRoZSBwYXNzYWJsZSBzeW1ib2xzIGFyZSB0aGUgd2VsbCBrbm93biBzeW1ib2xzICh0aGUgc3ltYm9sIHZhbHVlc1xuICogb2Ygc3RhdGljIHByb3BlcnRpZXMgb2YgdGhlIGBTeW1ib2xgIGNvbnN0cnVjdG9yKSBhbmQgdGhlIHJlZ2lzdGVyZWRcbiAqIHN5bWJvbHMuXG4gKlxuICogQHBhcmFtIHthbnl9IHN5bVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBpc1Bhc3NhYmxlU3ltYm9sPShzeW0pPT5cbnR5cGVvZiBzeW09PT0nc3ltYm9sJyYmKFxudHlwZW9mIFN5bWJvbC5rZXlGb3Ioc3ltKT09PSdzdHJpbmcnfHx3ZWxsS25vd25TeW1ib2xOYW1lcy5oYXMoc3ltKSk7JGjigI1fb25jZS5pc1Bhc3NhYmxlU3ltYm9sKGlzUGFzc2FibGVTeW1ib2wpO1xuaGFyZGVuKGlzUGFzc2FibGVTeW1ib2wpO1xuXG5jb25zdCAgICAgICAgYXNzZXJ0UGFzc2FibGVTeW1ib2w9KHN5bSk9PlxuaXNQYXNzYWJsZVN5bWJvbChzeW0pfHxcbmFzc2VydC5mYWlsKFxuWCBgT25seSByZWdpc3RlcmVkIHN5bWJvbHMgb3Igd2VsbC1rbm93biBzeW1ib2xzIGFyZSBwYXNzYWJsZTogJHtxKHN5bSl9YCk7JGjigI1fb25jZS5hc3NlcnRQYXNzYWJsZVN5bWJvbChhc3NlcnRQYXNzYWJsZVN5bWJvbCk7XG5cbmhhcmRlbihhc3NlcnRQYXNzYWJsZVN5bWJvbCk7XG5cbi8qKlxuICogSWYgYHN5bWAgaXMgYSBwYXNzYWJsZSBzeW1ib2wsIHJldHVybiBhIHN0cmluZyB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhpc1xuICogc3ltYm9sLiBJZiBgc3ltYCBpcyBhIG5vbi1wYXNzYWJsZSBzeW1ib2wsIHJldHVybiBgdW5kZWZpbmVkYC5cbiAqXG4gKiBUaGUgcGFzc2FibGUgc3ltYm9scyBhcmUgdGhlIHdlbGwga25vd24gc3ltYm9scyAodGhlIHN5bWJvbCB2YWx1ZXNcbiAqIG9mIHN0YXRpYyBwcm9wZXJ0aWVzIG9mIHRoZSBgU3ltYm9sYCBjb25zdHJ1Y3RvcikgYW5kIHRoZSByZWdpc3RlcmVkXG4gKiBzeW1ib2xzLiBTaW5jZSB0aGUgcmVnaXN0cmF0aW9uIHN0cmluZyBvZiBhIHJlZ2lzdGVyZWQgc3ltYm9sIGNhbiBiZSBhbnlcbiAqIHN0cmluZywgaWYgd2Ugc2ltcGx5IHVzZWQgdGhhdCB0byBpZGVudGlmeSB0aG9zZSBzeW1ib2xzLCB0aGVyZSB3b3VsZCBub3RcbiAqIGJlIGFueSByZW1haW5pbmcgc3RyaW5ncyBsZWZ0IG92ZXIgdG8gaWRlbnRpZnkgdGhlIHdlbGwta25vd24gc3ltYm9scy5cbiAqIEluc3RlYWQsIHdlIHJlc2VydmUgc3RyaW5ncyBiZWdpbm5pbmcgd2l0aCBgXCJAQFwiYCBmb3IgcHVycG9zZXMgb2YgdGhpc1xuICogZW5jb2RpbmcuIFdlIGlkZW50aWZ5IGEgd2VsbCBrbm93biBzeW1ib2wgc3VjaCBhcyBgU3ltYm9sLml0ZXJhdG9yYFxuICogYnkgcHJlZml4aW5nIHRoZSBwcm9wZXJ0eSBuYW1lIHdpdGggYFwiQEBcImAsIHN1Y2ggYXMgYFwiQEBpdGVyYXRvclwiYC5cbiAqIEZvciByZWdpc3RlcmVkIHN5bWJvbHMgd2hvc2UgbmFtZSBoYXBwZW5zIHRvIGJlZ2luIHdpdGggYFwiQEBcImAsIHN1Y2hcbiAqIGFzIGBTeW1ib2wuZm9yKCdAQGl0ZXJhdG9yJylgIG9yIGBTeW1ib2wuZm9yKCdAQGZvbycpYCwgd2UgaWRlbnRpZnlcbiAqIHRoZW0gYnkgcHJlZml4aW5nIHRoZW0gd2l0aCBhbiBleHRyYSBgXCJAQFwiYCwgc3VjaCBhc1xuICogYFwiQEBAQGl0ZXJhdG9yXCJgIG9yIGBcIkBAQEBmb29cImAuIChUaGlzIGlzIHRoZSBIaWxiZXJ0IEhvdGVsIGVuY29kaW5nXG4gKiB0ZWNobmlxdWUuKVxuICpcbiAqIEBwYXJhbSB7c3ltYm9sfSBzeW1cbiAqIEByZXR1cm5zIHtzdHJpbmc9fVxuICovXG5jb25zdCAgICAgICAgbmFtZUZvclBhc3NhYmxlU3ltYm9sPShzeW0pPT57XG5jb25zdCBuYW1lPVN5bWJvbC5rZXlGb3Ioc3ltKTtcbmlmKG5hbWU9PT11bmRlZmluZWQpe1xucmV0dXJuIHdlbGxLbm93blN5bWJvbE5hbWVzLmdldChzeW0pO1xuIH1cbmlmKG5hbWUuc3RhcnRzV2l0aCgnQEAnKSl7XG5yZXR1cm4gYEBAJHtuYW1lfWA7XG4gfVxucmV0dXJuIG5hbWU7XG4gfTskaOKAjV9vbmNlLm5hbWVGb3JQYXNzYWJsZVN5bWJvbChuYW1lRm9yUGFzc2FibGVTeW1ib2wpO1xuaGFyZGVuKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCk7XG5cbmNvbnN0ICAgICAgICBBdEF0UHJlZml4UGF0dGVybj0vXkBAKC4qKSQvOyRo4oCNX29uY2UuQXRBdFByZWZpeFBhdHRlcm4oQXRBdFByZWZpeFBhdHRlcm4pO1xuaGFyZGVuKEF0QXRQcmVmaXhQYXR0ZXJuKTtcblxuLyoqXG4gKiBJZiBgbmFtZWAgaXMgYSBzdHJpbmcgdGhhdCBjb3VsZCBoYXZlIGJlZW4gcHJvZHVjZWQgYnlcbiAqIGBuYW1lRm9yUGFzc2FibGVTeW1ib2xgLCByZXR1cm4gdGhlIHN5bWJvbCBhcmd1bWVudCBpdCB3YXMgcHJvZHVjZWQgdG9cbiAqIHJlcHJlc2VudC5cbiAqXG4gKiAgICBJZiBgbmFtZWAgZG9lcyBub3QgYmVnaW4gd2l0aCBgXCJAQFwiYCwgdGhlbiBqdXN0IHRoZSBjb3JyZXNwb25kaW5nXG4gKiAgICAgIHJlZ2lzdGVyZWQgc3ltYm9sLCBgU3ltYm9sLmZvcihuYW1lKWAuXG4gKiAgICBJZiBgbmFtZWAgaXMgYFwiQEBcImAgZm9sbG93ZWQgYnkgYSB3ZWxsIGtub3duIHN5bWJvbCdzIHByb3BlcnR5IG5hbWUgb25cbiAqICAgICAgYFN5bWJvbGAgc3VjaCBgXCJAQGl0ZXJhdG9yXCIsIHJldHVybiB0aGF0IHdlbGwga25vd24gc3ltYm9sIHN1Y2ggYXNcbiAqICAgICAgYFN5bWJvbC5pdGVyYXRvcmBcbiAqICAgIElmIGBuYW1lYCBiZWdpbnMgd2l0aCBgXCJAQEBAXCJgIGl0IGVuY29kZXMgdGhlIHJlZ2lzdGVyZWQgc3ltYm9sIHdob3NlXG4gKiAgICAgIG5hbWUgYmVnaW5zIHdpdGggYFwiQEBcImAgaW5zdGVhZC5cbiAqICAgIE90aGVyd2lzZSwgaWYgbmFtZSBiZWdpbnMgd2l0aCBgXCJAQFwiYCBpdCBtYXkgZW5jb2RlIGEgcmVnaXN0ZXJlZCBzeW1ib2xcbiAqICAgICAgZnJvbSBhIGZ1dHVyZSB2ZXJzaW9uIG9mIEphdmFTY3JpcHQsIGJ1dCBpdCBpcyBub3Qgb25lIHdlIGNhbiBkZWNvZGVcbiAqICAgICAgeWV0LCBzbyB0aHJvdy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHJldHVybnMge3N5bWJvbD19XG4gKi9cbmNvbnN0ICAgICAgICBwYXNzYWJsZVN5bWJvbEZvck5hbWU9KG5hbWUpPT57XG5pZih0eXBlb2YgbmFtZSE9PSdzdHJpbmcnKXtcbnJldHVybiB1bmRlZmluZWQ7XG4gfVxuY29uc3QgbWF0Y2g9QXRBdFByZWZpeFBhdHRlcm4uZXhlYyhuYW1lKTtcbmlmKG1hdGNoKXtcbmNvbnN0IHN1ZmZpeD1tYXRjaFsxXTtcbmlmKHN1ZmZpeC5zdGFydHNXaXRoKCdAQCcpKXtcbnJldHVybiBTeW1ib2wuZm9yKHN1ZmZpeCk7XG4gfWVsc2V7XG5jb25zdCBzeW09U3ltYm9sW3N1ZmZpeF07XG5pZih0eXBlb2Ygc3ltPT09J3N5bWJvbCcpe1xucmV0dXJuIHN5bTtcbiB9XG5hc3NlcnQuZmFpbChYIGBSZXNlcnZlZCBmb3Igd2VsbCBrbm93biBzeW1ib2wgJHtxKHN1ZmZpeCl9OiAke3EobmFtZSl9YCk7XG4gfVxuIH1cbnJldHVybiBTeW1ib2wuZm9yKG5hbWUpO1xuIH07JGjigI1fb25jZS5wYXNzYWJsZVN5bWJvbEZvck5hbWUocGFzc2FibGVTeW1ib2xGb3JOYW1lKTtcbmhhcmRlbihwYXNzYWJsZVN5bWJvbEZvck5hbWUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzUGFzc2FibGVTeW1ib2wiOlsiaXNQYXNzYWJsZVN5bWJvbCJdLCJhc3NlcnRQYXNzYWJsZVN5bWJvbCI6WyJhc3NlcnRQYXNzYWJsZVN5bWJvbCJdLCJuYW1lRm9yUGFzc2FibGVTeW1ib2wiOlsibmFtZUZvclBhc3NhYmxlU3ltYm9sIl0sIkF0QXRQcmVmaXhQYXR0ZXJuIjpbIkF0QXRQcmVmaXhQYXR0ZXJuIl0sInBhc3NhYmxlU3ltYm9sRm9yTmFtZSI6WyJwYXNzYWJsZVN5bWJvbEZvck5hbWUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAADLiZB/wGAAD8BgAAKgAAAEBlbmRvL21hcnNoYWwtdjAuNy41L3NyYy9oZWxwZXJzL3RhZ2dlZC5qc3siaW1wb3J0cyI6WyIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiVGFnZ2VkSGVscGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydENoZWNrZXIsY2hlY2tUYWdSZWNvcmQsUEFTU19TVFlMRSxjaGVja05vcm1hbFByb3BlcnR5OyRo4oCNX2ltcG9ydHMoW1tcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dLFtcImNoZWNrVGFnUmVjb3JkXCIsIFskaOKAjV9hID0+IChjaGVja1RhZ1JlY29yZCA9ICRo4oCNX2EpXV0sW1wiUEFTU19TVFlMRVwiLCBbJGjigI1fYSA9PiAoUEFTU19TVFlMRSA9ICRo4oCNX2EpXV0sW1wiY2hlY2tOb3JtYWxQcm9wZXJ0eVwiLCBbJGjigI1fYSA9PiAoY2hlY2tOb3JtYWxQcm9wZXJ0eSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdHtkZXRhaWxzOlh9PWFzc2VydDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtnZXRQcm90b3R5cGVPZixwcm90b3R5cGU6b2JqZWN0UHJvdG90eXBlfT1PYmplY3Q7XG5cbi8qKlxuICpcbiAqIEB0eXBlIHtYaW1wb3J0KCcuL2ludGVybmFsLXR5cGVzLmpzJykuUGFzc1N0eWxlSGVscGVyfVxuICovXG5jb25zdCAgICAgICAgVGFnZ2VkSGVscGVyPWhhcmRlbih7XG5zdHlsZU5hbWU6J3RhZ2dlZCcsXG5cbmNhbkJlVmFsaWQ6KGNhbmRpZGF0ZSxjaGVjayk9PmNoZWNrVGFnUmVjb3JkKGNhbmRpZGF0ZSwndGFnZ2VkJyxjaGVjayksXG5cbmFzc2VydFZhbGlkOihjYW5kaWRhdGUscGFzc1N0eWxlT2ZSZWN1cik9PntcblRhZ2dlZEhlbHBlci5jYW5CZVZhbGlkKGNhbmRpZGF0ZSxhc3NlcnRDaGVja2VyKTtcbmFzc2VydC5lcXVhbChcbmdldFByb3RvdHlwZU9mKGNhbmRpZGF0ZSksXG5vYmplY3RQcm90b3R5cGUsXG5YIGBVbmV4cGVjdGVkIHByb3RvdHlwZSBmb3I6ICR7Y2FuZGlkYXRlfWApO1xuXG5cbmNvbnN0e1xuW1BBU1NfU1RZTEVdOl9wYXNzU3R5bGUsLyogY2hlY2tUYWdSZWNvcmQgYWxyZWFkeSBjaGVja2VkKi9cbltTeW1ib2wudG9TdHJpbmdUYWddOl9sYWJlbCwvKiBjaGVja1RhZ1JlY29yZCBhbHJlYWR5IGNoZWNrZWQqL1xucGF5bG9hZDpfcGF5bG9hZCwvKiB2YWx1ZSBjaGVja2VkIGJ5IHJlY3Vyc2l2ZSB3YWxrIGF0IHRoZSBlbmQqL1xuLi4ucmVzdH09XG5jYW5kaWRhdGU7XG5vd25LZXlzKHJlc3QpLmxlbmd0aD09PTB8fFxuYXNzZXJ0LmZhaWwoWCBgVW5leHBlY3RlZCBwcm9wZXJ0aWVzIG9uIFJlbW90YWJsZSBQcm90byAke293bktleXMocmVzdCl9YCk7XG5cbmNoZWNrTm9ybWFsUHJvcGVydHkoY2FuZGlkYXRlLCdwYXlsb2FkJywnc3RyaW5nJyx0cnVlLGFzc2VydENoZWNrZXIpO1xuXG4vKiBSZWN1cnNpdmVseSB2YWxpZGF0ZSB0aGF0IGVhY2ggbWVtYmVyIGlzIHBhc3NhYmxlLiovXG4hIXBhc3NTdHlsZU9mUmVjdXIoY2FuZGlkYXRlLnBheWxvYWQpO1xuIH19KTskaOKAjV9vbmNlLlRhZ2dlZEhlbHBlcihUYWdnZWRIZWxwZXIpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlRhZ2dlZEhlbHBlciI6WyJUYWdnZWRIZWxwZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAHVJxOUoZAABKGQAAJAAAAEBlbmRvL21hcnNoYWwtdjAuNy41L3NyYy9tYWtlLWZhci5qc3siaW1wb3J0cyI6WyIuL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanMiLCIuL2hlbHBlcnMvcmVtb3RhYmxlLmpzIl0sImV4cG9ydHMiOlsiRmFyIiwiUmVtb3RhYmxlIiwiVG9GYXJGdW5jdGlvbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnRDaGVja2VyLFBBU1NfU1RZTEUsYXNzZXJ0SWZhY2UsZ2V0SW50ZXJmYWNlT2YsUmVtb3RhYmxlSGVscGVyOyRo4oCNX2ltcG9ydHMoW1tcIi4vaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV0sW1wiUEFTU19TVFlMRVwiLCBbJGjigI1fYSA9PiAoUEFTU19TVFlMRSA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvcmVtb3RhYmxlLmpzXCIsIFtbXCJhc3NlcnRJZmFjZVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0SWZhY2UgPSAkaOKAjV9hKV1dLFtcImdldEludGVyZmFjZU9mXCIsIFskaOKAjV9hID0+IChnZXRJbnRlcmZhY2VPZiA9ICRo4oCNX2EpXV0sW1wiUmVtb3RhYmxlSGVscGVyXCIsIFskaOKAjV9hID0+IChSZW1vdGFibGVIZWxwZXIgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuSW50ZXJmYWNlU3BlY30gSW50ZXJmYWNlU3BlYyAqL1xuLyoqIEB0ZW1wbGF0ZSBMLFIgQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL2V2ZW50dWFsLXNlbmQnKS5SZW1vdGFibGVCcmFuZDxMLCBSPn0gUmVtb3RhYmxlQnJhbmQgKi9cblxuY29uc3R7cXVvdGU6cSxkZXRhaWxzOlh9PWFzc2VydDtcblxuY29uc3R7cHJvdG90eXBlOmZ1bmN0aW9uUHJvdG90eXBlfT1GdW5jdGlvbjtcbmNvbnN0e1xuZ2V0UHJvdG90eXBlT2YsXG5zZXRQcm90b3R5cGVPZixcbmNyZWF0ZSxcbmlzRnJvemVuLFxucHJvdG90eXBlOm9iamVjdFByb3RvdHlwZX09XG5PYmplY3Q7XG5cbi8qKlxuICogTm93IHRoYXQgdGhlIHJlbW90YWJsZVByb3RvIGRvZXMgbm90IHByb3ZpZGUgaXRzIG93biBgdG9TdHJpbmdgIG1ldGhvZCxcbiAqIGVuc3VyZSBpdCBhbHdheXMgaW5oZXJpdHMgZnJvbSBzb21ldGhpbmcuIFRoZSBvcmlnaW5hbCBwcm90b3R5cGUgb2ZcbiAqIGByZW1vdGFibGVgIGlmIHRoZXJlIHdhcyBvbmUsIG9yIGBPYmplY3QucHJvdG90eXBlYCBvdGhlcndpc2UuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHJlbW90YWJsZVxuICogQHBhcmFtIHtJbnRlcmZhY2VTcGVjfSBpZmFjZVxuICogQHJldHVybnMge09iamVjdH1cbiAqL1xuY29uc3QgbWFrZVJlbW90YWJsZVByb3RvPShyZW1vdGFibGUsaWZhY2UpPT57XG5sZXQgb2xkUHJvdG89Z2V0UHJvdG90eXBlT2YocmVtb3RhYmxlKTtcbmlmKHR5cGVvZiByZW1vdGFibGU9PT0nb2JqZWN0Jyl7XG5pZihvbGRQcm90bz09PW51bGwpe1xub2xkUHJvdG89b2JqZWN0UHJvdG90eXBlO1xuIH1cbm9sZFByb3RvPT09b2JqZWN0UHJvdG90eXBlfHxcbm9sZFByb3RvPT09bnVsbHx8XG5hc3NlcnQuZmFpbChcblggYEZvciBub3csIHJlbW90YWJsZXMgY2Fubm90IGluaGVyaXQgZnJvbSBhbnl0aGluZyB1bnVzdWFsLCBpbiAke3JlbW90YWJsZX1gKTtcblxuIH1lbHNlIGlmKHR5cGVvZiByZW1vdGFibGU9PT0nZnVuY3Rpb24nKXtcbm9sZFByb3RvIT09bnVsbHx8XG5hc3NlcnQuZmFpbChcblggYE9yaWdpbmFsIGZ1bmN0aW9uIG11c3Qgbm90IGluaGVyaXQgZnJvbSBudWxsOiAke3JlbW90YWJsZX1gKTtcblxuYXNzZXJ0KFxub2xkUHJvdG89PT1mdW5jdGlvblByb3RvdHlwZXx8XG5nZXRQcm90b3R5cGVPZihvbGRQcm90byk9PT1mdW5jdGlvblByb3RvdHlwZSxcblggYEZhciBmdW5jdGlvbnMgbXVzdCBvcmlnaW5hbGx5IGluaGVyaXQgZnJvbSBGdW5jdGlvbi5wcm90b3R5cGUsIGluICR7cmVtb3RhYmxlfWApO1xuXG4gfWVsc2V7XG5hc3NlcnQuZmFpbChYIGB1bnJlY29nbml6ZWQgdHlwZW9mICR7cmVtb3RhYmxlfWApO1xuIH1cbnJldHVybiBoYXJkZW4oXG5jcmVhdGUob2xkUHJvdG8se1xuW1BBU1NfU1RZTEVdOnt2YWx1ZToncmVtb3RhYmxlJ30sXG5bU3ltYm9sLnRvU3RyaW5nVGFnXTp7dmFsdWU6aWZhY2V9fSkpO1xuXG5cbiB9O1xuXG5jb25zdCBhc3NlcnRDYW5CZVJlbW90YWJsZT0oY2FuZGlkYXRlKT0+XG5SZW1vdGFibGVIZWxwZXIuY2FuQmVWYWxpZChjYW5kaWRhdGUsYXNzZXJ0Q2hlY2tlcik7XG5cbi8qKlxuICogQ3JlYXRlIGFuZCByZWdpc3RlciBhIFJlbW90YWJsZS4gIEFmdGVyIHRoaXMsIGdldEludGVyZmFjZU9mKHJlbW90YWJsZSlcbiAqIHJldHVybnMgaWZhY2UuXG4gKlxuICogLy8gaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy84MDRcbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJbnRlcmZhY2VTcGVjfSBbaWZhY2U9J1JlbW90YWJsZSddIFRoZSBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbiBmb3JcbiAqIHRoZSByZW1vdGFibGUuIEZvciBub3csIGEgc3RyaW5nIGlmYWNlIG11c3QgYmUgXCJSZW1vdGFibGVcIiBvciBiZWdpbiB3aXRoXG4gKiBcIkFsbGVnZWQ6IFwiLCB0byBzZXJ2ZSBhcyB0aGUgYWxsZWdlZCBuYW1lLiBNb3JlIGdlbmVyYWwgaWZhY2VzIGFyZSBub3QgeWV0XG4gKiBpbXBsZW1lbnRlZC4gVGhpcyBpcyB0ZW1wb3JhcnkuIFdlIGluY2x1ZGUgdGhlXG4gKiBcIkFsbGVnZWRcIiBhcyBhIHJlbWluZGVyIHRoYXQgd2UgZG8gbm90IHlldCBoYXZlIFN3aW5nU2V0IG9yIENvbW1zIFZhdFxuICogc3VwcG9ydCBmb3IgZW5zdXJpbmcgdGhpcyBpcyBhY2NvcmRpbmcgdG8gdGhlIHZhdCBob3N0aW5nIHRoZSBvYmplY3QuXG4gKiBDdXJyZW50bHksIEFsaWNlIGNhbiB0ZWxsIEJvYiBhYm91dCBDYXJvbCwgd2hlcmUgVmF0QSAob24gQWxpY2UncyBiZWhhbGYpXG4gKiBtaXNyZXByZXNlbnRzIENhcm9sJ3MgYGlmYWNlYC4gVmF0QiBhbmQgdGhlcmVmb3JlIEJvYiB3aWxsIHRoZW4gc2VlXG4gKiBDYXJvbCdzIGBpZmFjZWAgYXMgbWlzcmVwcmVzZW50ZWQgYnkgVmF0QS5cbiAqIEBwYXJhbSB7dW5kZWZpbmVkfSBbcHJvcHM9dW5kZWZpbmVkXSBDdXJyZW50bHkgbWF5IG9ubHkgYmUgdW5kZWZpbmVkLlxuICogVGhhdCBwbGFuIGlzIHRoYXQgb3duLXByb3BlcnRpZXMgYXJlIGNvcGllZCB0byB0aGUgcmVtb3RhYmxlXG4gKiBAcGFyYW0ge1R9IFtyZW1vdGFibGU9e31dIFRoZSBvYmplY3QgdXNlZCBhcyB0aGUgcmVtb3RhYmxlXG4gKiBAcmV0dXJucyB7VCAmIFJlbW90YWJsZUJyYW5kPHt9LCBUPn0gcmVtb3RhYmxlLCBtb2RpZmllZCBmb3IgZGVidWdnYWJpbGl0eVxuICovXG5jb25zdCAgICAgICAgUmVtb3RhYmxlPShcbmlmYWNlPSdSZW1vdGFibGUnLFxucHJvcHM9dW5kZWZpbmVkLFxucmVtb3RhYmxlPS8qKiBAdHlwZSB7VH0gKi97fSk9Plxue1xuYXNzZXJ0SWZhY2UoaWZhY2UpO1xuYXNzZXJ0KGlmYWNlKTtcbi8qIFRPRE86IFdoZW4gaWZhY2UgaXMgcmljaGVyIHRoYW4ganVzdCBzdHJpbmcsIHdlIG5lZWQgdG8gZ2V0IHRoZSBhbGxlZ2VkTmFtZSovXG4vKiBpbiBhIGRpZmZlcmVudCB3YXkuKi9cbmFzc2VydChwcm9wcz09PXVuZGVmaW5lZCxYIGBSZW1vdGFibGUgcHJvcHMgbm90IHlldCBpbXBsZW1lbnRlZCAke3Byb3BzfWApO1xuXG4vKiBGYWlsIGZhc3Q6IGNoZWNrIHRoYXQgdGhlIHVubW9kaWZpZWQgb2JqZWN0IGlzIGFibGUgdG8gYmVjb21lIGEgUmVtb3RhYmxlLiovXG5hc3NlcnRDYW5CZVJlbW90YWJsZShyZW1vdGFibGUpO1xuXG4vKiBFbnN1cmUgdGhhdCB0aGUgcmVtb3RhYmxlIGlzbid0IGFscmVhZHkgbWFya2VkLiovXG5hc3NlcnQoXG4hKFBBU1NfU1RZTEUgaW4gcmVtb3RhYmxlKSxcblggYFJlbW90YWJsZSAke3JlbW90YWJsZX0gaXMgYWxyZWFkeSBtYXJrZWQgYXMgYSAke3EoXG5yZW1vdGFibGVbUEFTU19TVFlMRV0pXG4gfWApO1xuXG4vKiBFbnN1cmUgdGhhdCB0aGUgcmVtb3RhYmxlIGlzbid0IGFscmVhZHkgZnJvemVuLiovXG5hc3NlcnQoIWlzRnJvemVuKHJlbW90YWJsZSksWCBgUmVtb3RhYmxlICR7cmVtb3RhYmxlfSBpcyBhbHJlYWR5IGZyb3plbmApO1xuY29uc3QgcmVtb3RhYmxlUHJvdG89bWFrZVJlbW90YWJsZVByb3RvKHJlbW90YWJsZSxpZmFjZSk7XG5cbi8qIFRha2UgYSBzdGF0aWMgY29weSBvZiB0aGUgZW51bWVyYWJsZSBvd24gcHJvcGVydGllcyBhcyBkYXRhIHByb3BlcnRpZXMuKi9cbi8qIGNvbnN0IHByb3BEZXNjcyA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoeyAuLi5wcm9wcyB9KTsqL1xuY29uc3QgbXV0YXRlSGFyZGVuQW5kQ2hlY2s9KHRhcmdldCk9Pntcbi8qIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wRGVzY3MpOyovXG5zZXRQcm90b3R5cGVPZih0YXJnZXQscmVtb3RhYmxlUHJvdG8pO1xuaGFyZGVuKHRhcmdldCk7XG5hc3NlcnRDYW5CZVJlbW90YWJsZSh0YXJnZXQpO1xuIH07XG5cbi8qIEZhaWwgZmFzdDogY2hlY2sgYSBmcmVzaCByZW1vdGFibGUgdG8gc2VlIGlmIG91ciBydWxlcyBmaXQuKi9cbm11dGF0ZUhhcmRlbkFuZENoZWNrKHt9KTtcblxuLyogQWN0dWFsbHkgZmluaXNoIHRoZSBuZXcgcmVtb3RhYmxlLiovXG5tdXRhdGVIYXJkZW5BbmRDaGVjayhyZW1vdGFibGUpO1xuXG4vKiBDT01NSVRURUQhKi9cbi8qIFdlJ3JlIGNvbW1pdHRlZCwgc28ga2VlcCB0aGUgaW50ZXJmYWNlIGZvciBmdXR1cmUgcmVmZXJlbmNlLiovXG5hc3NlcnQoaWZhY2UhPT11bmRlZmluZWQpOy8qIFRvIG1ha2UgVHlwZVNjcmlwdCBoYXBweSovXG5yZXR1cm4gKC8qKiBAdHlwZSB7VCAmIFJlbW90YWJsZUJyYW5kPHt9LCBUPn0gKi9yZW1vdGFibGUpO1xuIH07JGjigI1fb25jZS5SZW1vdGFibGUoUmVtb3RhYmxlKTtcbmhhcmRlbihSZW1vdGFibGUpO1xuXG4vKipcbiAqIEEgY29uY2lzZSBjb252ZW5pZW5jZSBmb3IgdGhlIG1vc3QgY29tbW9uIGBSZW1vdGFibGVgIHVzZS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtzdHJpbmd9IGZhck5hbWUgVGhpcyBuYW1lIHdpbGwgYmUgcHJlcGVuZGVkIHdpdGggYEFsbGVnZWQ6IGBcbiAqIGZvciBub3cgdG8gZm9ybSB0aGUgYFJlbW90YWJsZWAgYGlmYWNlYCBhcmd1bWVudC5cbiAqIEBwYXJhbSB7VH0gW3JlbW90YWJsZT17fV0gVGhlIG9iamVjdCB1c2VkIGFzIHRoZSByZW1vdGFibGVcbiAqL1xuY29uc3QgICAgICAgIEZhcj0oZmFyTmFtZSxyZW1vdGFibGU9dW5kZWZpbmVkKT0+e1xuY29uc3Qgcj1yZW1vdGFibGU9PT11bmRlZmluZWQ/LyoqIEB0eXBlIHtUfSAqL3t9OnJlbW90YWJsZTtcbnJldHVybiBSZW1vdGFibGUoIGBBbGxlZ2VkOiAke2Zhck5hbWV9YCx1bmRlZmluZWQscik7XG4gfTskaOKAjV9vbmNlLkZhcihGYXIpO1xuaGFyZGVuKEZhcik7XG5cbi8qKlxuICogQ29lcmNlIGBmdW5jYCB0byBhIGZhciBmdW5jdGlvbiB0aGF0IHByZXNlcnZlcyBpdHMgY2FsbCBiZWhhdmlvci5cbiAqIElmIGl0IGlzIGFscmVhZHkgYSBmYXIgZnVuY3Rpb24sIHJldHVybiBpdC4gT3RoZXJ3aXNlIG1ha2UgYW5kIHJldHVybiBhXG4gKiBuZXcgZmFyIGZ1bmN0aW9uIHRoYXQgd3JhcHMgYGZ1bmNgIGFuZCBmb3J3YXJkcyBjYWxscyB0byBpdC4gVGhpc1xuICogd29ya3MgZXZlbiBpZiBgZnVuY2AgaXMgYWxyZWFkeSBmcm96ZW4uIGBUb0ZhckZ1bmN0aW9uYCBpcyB0byBiZSB1c2VkXG4gKiB3aGVuIHRoZSBmdW5jdGlvbiBjb21lcyBmcm9tIGVsc2V3aGVyZSB1bmRlciBsZXNzIGNvbnRyb2wuIEZvciBmdW5jdGlvbnNcbiAqIHlvdSBhdXRob3IgaW4gcGxhY2UsIGJldHRlciB0byB1c2UgYEZhcmAgb24gdGhlaXIgZnVuY3Rpb24gbGl0ZXJhbCBkaXJlY3RseS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZmFyTmFtZSB0byBiZSB1c2VkIG9ubHkgaWYgYGZ1bmNgIGlzIG5vdCBhbHJlYWR5IGFcbiAqIGZhciBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7KC4uLmFyZ3M6IGFueVtdKSA9PiBhbnl9IGZ1bmNcbiAqL1xuY29uc3QgICAgICAgIFRvRmFyRnVuY3Rpb249KGZhck5hbWUsZnVuYyk9PntcbmlmKGdldEludGVyZmFjZU9mKGZ1bmMpIT09dW5kZWZpbmVkKXtcbnJldHVybiBmdW5jO1xuIH1cbnJldHVybiBGYXIoZmFyTmFtZSwoLi4uYXJncyk9PmZ1bmMoLi4uYXJncykpO1xuIH07JGjigI1fb25jZS5Ub0ZhckZ1bmN0aW9uKFRvRmFyRnVuY3Rpb24pO1xuaGFyZGVuKFRvRmFyRnVuY3Rpb24pO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlJlbW90YWJsZSI6WyJSZW1vdGFibGUiXSwiRmFyIjpbIkZhciJdLCJUb0ZhckZ1bmN0aW9uIjpbIlRvRmFyRnVuY3Rpb24iXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAW/MDZykEAAApBAAAJgAAAEBlbmRvL21hcnNoYWwtdjAuNy41L3NyYy9tYWtlVGFnZ2VkLmpzeyJpbXBvcnRzIjpbIi4vaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vcGFzc1N0eWxlT2YuanMiXSwiZXhwb3J0cyI6WyJtYWtlVGFnZ2VkIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IFBBU1NfU1RZTEUsYXNzZXJ0UGFzc2FibGU7JGjigI1faW1wb3J0cyhbW1wiLi9oZWxwZXJzL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJQQVNTX1NUWUxFXCIsIFskaOKAjV9hID0+IChQQVNTX1NUWUxFID0gJGjigI1fYSldXV1dLFtcIi4vcGFzc1N0eWxlT2YuanNcIiwgW1tcImFzc2VydFBhc3NhYmxlXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXNzYWJsZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuY29uc3R7Y3JlYXRlLHByb3RvdHlwZTpvYmplY3RQcm90b3R5cGV9PU9iamVjdDtcbmNvbnN0e2RldGFpbHM6WH09YXNzZXJ0O1xuXG5jb25zdCAgICAgICAgbWFrZVRhZ2dlZD0odGFnLHBheWxvYWQpPT57XG5hc3NlcnQudHlwZW9mKFxudGFnLFxuJ3N0cmluZycsXG5YIGBUaGUgdGFnIG9mIGEgdGFnZ2VkIHJlY29yZCBtdXN0IGJlIGEgc3RyaW5nOiAke3RhZ31gKTtcblxuYXNzZXJ0UGFzc2FibGUoaGFyZGVuKHBheWxvYWQpKTtcbnJldHVybiBoYXJkZW4oXG5jcmVhdGUob2JqZWN0UHJvdG90eXBlLHtcbltQQVNTX1NUWUxFXTp7dmFsdWU6J3RhZ2dlZCd9LFxuW1N5bWJvbC50b1N0cmluZ1RhZ106e3ZhbHVlOnRhZ30sXG5wYXlsb2FkOnt2YWx1ZTpwYXlsb2FkLGVudW1lcmFibGU6dHJ1ZX19KSk7XG5cblxuIH07JGjigI1fb25jZS5tYWtlVGFnZ2VkKG1ha2VUYWdnZWQpO1xuaGFyZGVuKG1ha2VUYWdnZWQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VUYWdnZWQiOlsibWFrZVRhZ2dlZCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACSnzjR2igAANooAAAqAAAAQGVuZG8vbWFyc2hhbC12MC43LjUvc3JjL21hcnNoYWwtanVzdGluLmpzeyJpbXBvcnRzIjpbIi4vZW5jb2RlVG9DYXBEYXRhLmpzIiwiLi9oZWxwZXJzL2Vycm9yLmpzIiwiLi9oZWxwZXJzL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9oZWxwZXJzL3N5bWJvbC5qcyIsIkBlbmRvL25hdCJdLCJleHBvcnRzIjpbImRlY29kZVRvSnVzdGluIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IE5hdCxRQ0xBU1MsZ2V0RXJyb3JDb25zdHJ1Y3Rvcixpc09iamVjdCxBdEF0UHJlZml4UGF0dGVybixwYXNzYWJsZVN5bWJvbEZvck5hbWU7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbmF0XCIsIFtbXCJOYXRcIiwgWyRo4oCNX2EgPT4gKE5hdCA9ICRo4oCNX2EpXV1dXSxbXCIuL2VuY29kZVRvQ2FwRGF0YS5qc1wiLCBbW1wiUUNMQVNTXCIsIFskaOKAjV9hID0+IChRQ0xBU1MgPSAkaOKAjV9hKV1dXV0sW1wiLi9oZWxwZXJzL2Vycm9yLmpzXCIsIFtbXCJnZXRFcnJvckNvbnN0cnVjdG9yXCIsIFskaOKAjV9hID0+IChnZXRFcnJvckNvbnN0cnVjdG9yID0gJGjigI1fYSldXV1dLFtcIi4vaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiaXNPYmplY3RcIiwgWyRo4oCNX2EgPT4gKGlzT2JqZWN0ID0gJGjigI1fYSldXV1dLFtcIi4vaGVscGVycy9zeW1ib2wuanNcIiwgW1tcIkF0QXRQcmVmaXhQYXR0ZXJuXCIsIFskaOKAjV9hID0+IChBdEF0UHJlZml4UGF0dGVybiA9ICRo4oCNX2EpXV0sW1wicGFzc2FibGVTeW1ib2xGb3JOYW1lXCIsIFskaOKAjV9hID0+IChwYXNzYWJsZVN5bWJvbEZvck5hbWUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuRW5jb2Rpbmd9IEVuY29kaW5nICovXG5cbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtpc0FycmF5fT1BcnJheTtcbmNvbnN0e3N0cmluZ2lmeTpxdW90ZX09SlNPTjtcbmNvbnN0e3F1b3RlOnEsZGV0YWlsczpYfT1hc3NlcnQ7XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSW5kZW50ZXJcbiAqIEBwcm9wZXJ0eSB7KG9wZW5CcmFja2V0OiBzdHJpbmcpID0+IG51bWJlcn0gb3BlblxuICogQHByb3BlcnR5IHsoKSA9PiBudW1iZXJ9IGxpbmVcbiAqIEBwcm9wZXJ0eSB7KHRva2VuOiBzdHJpbmcpID0+IG51bWJlcn0gbmV4dFxuICogQHByb3BlcnR5IHsoY2xvc2VCcmFja2V0OiBzdHJpbmcpID0+IG51bWJlcn0gY2xvc2VcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gc3RyaW5nfSBkb25lXG4gKi9cblxuLyoqXG4gKiBHZW5lcm91cyB3aGl0ZXNwYWNlIGZvciByZWFkYWJpbGl0eVxuICpcbiAqIEByZXR1cm5zIHtJbmRlbnRlcn1cbiAqL1xuY29uc3QgbWFrZVllc0luZGVudGVyPSgpPT57XG5jb25zdCBzdHJpbmdzPVtdO1xubGV0IGxldmVsPTA7XG5sZXQgbmVlZFNwYWNlPWZhbHNlO1xuY29uc3QgbGluZT0oKT0+e1xubmVlZFNwYWNlPWZhbHNlO1xucmV0dXJuIHN0cmluZ3MucHVzaCgnXFxuJywnICAnLnJlcGVhdChsZXZlbCkpO1xuIH07XG5yZXR1cm4gaGFyZGVuKHtcbm9wZW46KG9wZW5CcmFja2V0KT0+e1xubGV2ZWwrPTE7XG5pZihuZWVkU3BhY2Upe1xuc3RyaW5ncy5wdXNoKCcgJyk7XG4gfVxubmVlZFNwYWNlPWZhbHNlO1xucmV0dXJuIHN0cmluZ3MucHVzaChvcGVuQnJhY2tldCk7XG4gfSxcbmxpbmUsXG5uZXh0Oih0b2tlbik9PntcbmlmKG5lZWRTcGFjZSYmdG9rZW4hPT0nLCcpe1xuc3RyaW5ncy5wdXNoKCcgJyk7XG4gfVxubmVlZFNwYWNlPXRydWU7XG5yZXR1cm4gc3RyaW5ncy5wdXNoKHRva2VuKTtcbiB9LFxuY2xvc2U6KGNsb3NlQnJhY2tldCk9PntcbmFzc2VydChsZXZlbD49MSk7XG5sZXZlbC09MTtcbmxpbmUoKTtcbnJldHVybiBzdHJpbmdzLnB1c2goY2xvc2VCcmFja2V0KTtcbiB9LFxuZG9uZTooKT0+e1xuYXNzZXJ0LmVxdWFsKGxldmVsLDApO1xucmV0dXJuIHN0cmluZ3Muam9pbignJyk7XG4gfX0pO1xuXG4gfTtcblxuLyoqXG4gKiBJZiB0aGUgbGFzdCBjaGFyYWN0ZXIgb2Ygb25lIHRva2VuIHRvZ2V0aGVyIHdpdGggdGhlIGZpcnN0IGNoYXJhY3RlclxuICogb2YgdGhlIG5leHQgdG9rZW4gbWF0Y2hlcyB0aGlzIHBhdHRlcm4sIHRoZW4gdGhlIHR3byB0b2tlbnMgbXVzdCBiZVxuICogc2VwYXJhdGVkIGJ5IHdoaXRlc3BhY2UgdG8gcHJlc2VydmUgdGhlaXIgbWVhbmluZy4gT3RoZXJ3aXNlIHRoZVxuICogd2hpdGVzcGFjZSBpbiB1bm5lY2Vzc2FyeS5cbiAqXG4gKiBUaGUgYDwhYCBhbmQgYC0+YCBjYXNlcyBwcmV2ZW50IHRoZSBhY2NpZGVudGFsIGZvcm1hdGlvbiBvZiBhblxuICogaHRtbC1saWtlIGNvbW1lbnQuIEkgZG9uJ3QgdGhpbmsgdGhlIGRvdWJsZSBhbmdsZSBicmFja2V0cyBhcmUgYWN0dWFsbHlcbiAqIG5lZWRlZCBidXQgSSBoYXZlbid0IHRob3VnaHQgYWJvdXQgaXQgZW5vdWdoIHRvIHJlbW92ZSB0aGVtLlxuICovXG5jb25zdCBiYWRQYWlyUGF0dGVybj0vXig/Olxcd1xcd3w8PHw+PnxcXCtcXCt8LS18PCF8LT4pJC87XG5cbi8qKlxuICogTWluaW11bSB3aGl0ZXNwYWNlIG5lZWRlZCB0byBwcmVzZXZlIG1lYW5pbmcuXG4gKlxuICogQHJldHVybnMge0luZGVudGVyfVxuICovXG5jb25zdCBtYWtlTm9JbmRlbnRlcj0oKT0+e1xuY29uc3Qgc3RyaW5ncz1bXTtcbnJldHVybiBoYXJkZW4oe1xub3Blbjoob3BlbkJyYWNrZXQpPT5zdHJpbmdzLnB1c2gob3BlbkJyYWNrZXQpLFxubGluZTooKT0+c3RyaW5ncy5sZW5ndGgsXG5uZXh0Oih0b2tlbik9PntcbmlmKHN0cmluZ3MubGVuZ3RoPj0xKXtcbmNvbnN0IGxhc3Q9c3RyaW5nc1tzdHJpbmdzLmxlbmd0aC0xXTtcbmlmKGxhc3QubGVuZ3RoPj0xJiZ0b2tlbi5sZW5ndGg+PTEpe1xuY29uc3QgcGFpcj0gYCR7bGFzdFtsYXN0Lmxlbmd0aC0xXX0ke3Rva2VuWzBdfWA7XG5pZihiYWRQYWlyUGF0dGVybi50ZXN0KHBhaXIpKXtcbnN0cmluZ3MucHVzaCgnICcpO1xuIH1cbiB9XG4gfVxucmV0dXJuIHN0cmluZ3MucHVzaCh0b2tlbik7XG4gfSxcbmNsb3NlOihjbG9zZUJyYWNrZXQpPT57XG5pZihzdHJpbmdzLmxlbmd0aD49MSYmc3RyaW5nc1tzdHJpbmdzLmxlbmd0aC0xXT09PScsJyl7XG5zdHJpbmdzLnBvcCgpO1xuIH1cbnJldHVybiBzdHJpbmdzLnB1c2goY2xvc2VCcmFja2V0KTtcbiB9LFxuZG9uZTooKT0+c3RyaW5ncy5qb2luKCcnKX0pO1xuXG4gfTtcblxuY29uc3QgaWRlbnRQYXR0ZXJuPS9eW2EtekEtWl1cXHcqJC87XG5cbi8qKlxuICogQHBhcmFtIHtFbmNvZGluZ30gZW5jb2RpbmdcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IHNob3VsZEluZGVudFxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgZGVjb2RlVG9KdXN0aW49KGVuY29kaW5nLHNob3VsZEluZGVudD1mYWxzZSk9Pntcbi8qKlxuICogVGhlIGZpcnN0IHBhc3MgZG9lcyBzb21lIGlucHV0IHZhbGlkYXRpb24uXG4gKiBJdHMgY29udHJvbCBmbG93IHNob3VsZCBtaXJyb3IgYHJlY3VyYCBhcyBjbG9zZWx5IGFzIHBvc3NpYmxlXG4gKiBhbmQgdGhlIHR3byBzaG91bGQgYmUgbWFpbnRhaW5lZCB0b2dldGhlci4gVGhleSBtdXN0IHZpc2l0IGV2ZXJ5dGhpbmdcbiAqIGluIHRoZSBzYW1lIG9yZGVyLlxuICpcbiAqIFRPRE8gbm93IHRoYXQgaWJpZHMgYXJlIGdvbmUsIHdlIHNob3VsZCBmb2xkIHRoaXMgYmFjayB0b2dldGhlciBpbnRvXG4gKiBvbmUgdmFsaWRhdGluZyBwYXNzLlxuICpcbiAqIEBwYXJhbSB7RW5jb2Rpbmd9IHJhd1RyZWVcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5jb25zdCBwcmVwYXJlPShyYXdUcmVlKT0+e1xuaWYoIWlzT2JqZWN0KHJhd1RyZWUpKXtcbnJldHVybjtcbiB9XG4vKiBBc3NlcnRpb25zIG9mIHRoZSBhYm92ZSB0byBuYXJyb3cgdGhlIHR5cGUuKi9cbmFzc2VydC50eXBlb2YocmF3VHJlZSwnb2JqZWN0Jyk7XG5hc3NlcnQocmF3VHJlZSE9PW51bGwpO1xuaWYoUUNMQVNTIGluIHJhd1RyZWUpe1xuY29uc3QgcWNsYXNzPXJhd1RyZWVbUUNMQVNTXTtcbmFzc2VydC50eXBlb2YoXG5xY2xhc3MsXG4nc3RyaW5nJyxcblggYGludmFsaWQgcWNsYXNzIHR5cGVvZiAke3EodHlwZW9mIHFjbGFzcyl9YCk7XG5cbmFzc2VydCghaXNBcnJheShyYXdUcmVlKSk7XG5zd2l0Y2gocmF3VHJlZVsnQHFjbGFzcyddKXtcbmNhc2UndW5kZWZpbmVkJzpcbmNhc2UnTmFOJzpcbmNhc2UnSW5maW5pdHknOlxuY2FzZSctSW5maW5pdHknOntcbnJldHVybjtcbiB9XG5jYXNlJ2JpZ2ludCc6e1xuY29uc3R7ZGlnaXRzfT1yYXdUcmVlO1xuYXNzZXJ0LnR5cGVvZihcbmRpZ2l0cyxcbidzdHJpbmcnLFxuWCBgaW52YWxpZCBkaWdpdHMgdHlwZW9mICR7cSh0eXBlb2YgZGlnaXRzKX1gKTtcblxucmV0dXJuO1xuIH1cbmNhc2UnQEBhc3luY0l0ZXJhdG9yJzp7XG5yZXR1cm47XG4gfVxuY2FzZSdzeW1ib2wnOntcbmNvbnN0e25hbWV9PXJhd1RyZWU7XG5jb25zdCBzeW09cGFzc2FibGVTeW1ib2xGb3JOYW1lKG5hbWUpO1xuYXNzZXJ0LnR5cGVvZihzeW0sJ3N5bWJvbCcpO1xucmV0dXJuO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5jb25zdHt0YWcscGF5bG9hZH09cmF3VHJlZTtcbmFzc2VydC50eXBlb2YodGFnLCdzdHJpbmcnKTtcbnByZXBhcmUocGF5bG9hZCk7XG5yZXR1cm47XG4gfVxuY2FzZSdzbG90Jzp7XG5jb25zdHtpbmRleCxpZmFjZX09cmF3VHJlZTtcbmFzc2VydC50eXBlb2YoaW5kZXgsJ251bWJlcicpO1xuTmF0KGluZGV4KTtcbmlmKGlmYWNlIT09dW5kZWZpbmVkKXtcbmFzc2VydC50eXBlb2YoaWZhY2UsJ3N0cmluZycpO1xuIH1cbnJldHVybjtcbiB9XG5jYXNlJ2hpbGJlcnQnOntcbmNvbnN0e29yaWdpbmFsLHJlc3R9PXJhd1RyZWU7XG4nb3JpZ2luYWwnaW4gcmF3VHJlZXx8XG5hc3NlcnQuZmFpbChYIGBJbnZhbGlkIEhpbGJlcnQgSG90ZWwgZW5jb2RpbmcgJHtyYXdUcmVlfWApO1xucHJlcGFyZShvcmlnaW5hbCk7XG5pZigncmVzdCdpbiByYXdUcmVlKXtcbmFzc2VydC50eXBlb2YoXG5yZXN0LFxuJ29iamVjdCcsXG5YIGBSZXN0ICR7cmVzdH0gZW5jb2RpbmcgbXVzdCBiZSBhbiBvYmplY3RgKTtcblxuYXNzZXJ0KHJlc3QhPT1udWxsLFggYFJlc3QgJHtyZXN0fSBlbmNvZGluZyBtdXN0IG5vdCBiZSBudWxsYCk7XG4haXNBcnJheShyZXN0KXx8XG5hc3NlcnQuZmFpbChYIGBSZXN0ICR7cmVzdH0gZW5jb2RpbmcgbXVzdCBub3QgYmUgYW4gYXJyYXlgKTtcbiEoUUNMQVNTIGluIHJlc3QpfHxcbmFzc2VydC5mYWlsKFxuWCBgUmVzdCBlbmNvZGluZyAke3Jlc3R9IG11c3Qgbm90IGNvbnRhaW4gJHtxKFFDTEFTUyl9YCk7XG5cbmNvbnN0IG5hbWVzPW93bktleXMocmVzdCk7XG5mb3IoY29uc3QgbmFtZSBvZiBuYW1lcyl7XG5hc3NlcnQudHlwZW9mKFxubmFtZSxcbidzdHJpbmcnLFxuWCBgUHJvcGVydHkgbmFtZSAke25hbWV9IG9mICR7cmF3VHJlZX0gbXVzdCBiZSBhIHN0cmluZ2ApO1xuXG5wcmVwYXJlKHJlc3RbbmFtZV0pO1xuIH1cbiB9XG5yZXR1cm47XG4gfVxuY2FzZSdlcnJvcic6e1xuY29uc3R7bmFtZSxtZXNzYWdlfT1yYXdUcmVlO1xuYXNzZXJ0LnR5cGVvZihcbm5hbWUsXG4nc3RyaW5nJyxcblggYGludmFsaWQgZXJyb3IgbmFtZSB0eXBlb2YgJHtxKHR5cGVvZiBuYW1lKX1gKTtcblxuZ2V0RXJyb3JDb25zdHJ1Y3RvcihuYW1lKSE9PXVuZGVmaW5lZHx8XG5hc3NlcnQuZmFpbChYIGBNdXN0IGJlIHRoZSBuYW1lIG9mIGFuIEVycm9yIGNvbnN0cnVjdG9yICR7bmFtZX1gKTtcbmFzc2VydC50eXBlb2YoXG5tZXNzYWdlLFxuJ3N0cmluZycsXG5YIGBpbnZhbGlkIGVycm9yIG1lc3NhZ2UgdHlwZW9mICR7cSh0eXBlb2YgbWVzc2FnZSl9YCk7XG5cbnJldHVybjtcbiB9XG5cbmRlZmF1bHQ6e1xuYXNzZXJ0LmZhaWwoWCBgdW5yZWNvZ25pemVkICR7cShRQ0xBU1MpfSAke3EocWNsYXNzKX1gLFR5cGVFcnJvcik7XG4gfX1cblxuIH1lbHNlIGlmKGlzQXJyYXkocmF3VHJlZSkpe1xuY29uc3R7bGVuZ3RofT1yYXdUcmVlO1xuZm9yKGxldCBpPTA7aTxsZW5ndGg7aSs9MSl7XG5wcmVwYXJlKHJhd1RyZWVbaV0pO1xuIH1cbiB9ZWxzZXtcbmNvbnN0IG5hbWVzPW93bktleXMocmF3VHJlZSk7XG5mb3IoY29uc3QgbmFtZSBvZiBuYW1lcyl7XG5hc3NlcnQudHlwZW9mKFxubmFtZSxcbidzdHJpbmcnLFxuWCBgUHJvcGVydHkgbmFtZSAke25hbWV9IG9mICR7cmF3VHJlZX0gbXVzdCBiZSBhIHN0cmluZ2ApO1xuXG5wcmVwYXJlKHJhd1RyZWVbbmFtZV0pO1xuIH1cbiB9XG4gfTtcblxuY29uc3QgbWFrZUluZGVudGVyPXNob3VsZEluZGVudD9tYWtlWWVzSW5kZW50ZXI6bWFrZU5vSW5kZW50ZXI7XG5jb25zdCBvdXQ9bWFrZUluZGVudGVyKCk7XG5cbi8qKlxuICogVGhpcyBpcyB0aGUgc2Vjb25kIHBhc3MgcmVjdXJzaW9uIGFmdGVyIHRoZSBmaXJzdCBwYXNzIGBwcmVwYXJlYC5cbiAqIFRoZSBmaXJzdCBwYXNzIGRpZCBzb21lIGlucHV0IHZhbGlkYXRpb24gc29cbiAqIGhlcmUgd2UgY2FuIHNhZmVseSBhc3N1bWUgZXZlcnl0aGluZyB0aG9zZSB0aGluZ3MgYXJlIHZhbGlkYXRlZC5cbiAqXG4gKiBAcGFyYW0ge0VuY29kaW5nfSByYXdUcmVlXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5jb25zdCBkZWNvZGU9KHJhd1RyZWUpPT57XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xucmV0dXJuIHJlY3VyKHJhd1RyZWUpO1xuIH07XG5cbmNvbnN0IGRlY29kZVByb3BlcnR5PShuYW1lLHZhbHVlKT0+e1xub3V0LmxpbmUoKTtcbmlmKG5hbWU9PT0nX19wcm90b19fJyl7XG4vKiBKYXZhU2NyaXB0IGludGVycHJldHMgYHtfX3Byb3RvX186IHgsIC4uLn1gKi9cbi8qIGFzIG1ha2luZyBhbiBvYmplY3QgaW5oZXJpdGluZyBmcm9tIGB4YCwgd2hlcmVhcyovXG4vKiBpbiBKU09OIGl0IGlzIHNpbXBseSBhIHByb3BlcnR5IG5hbWUuIFByZXNlcnZlIHRoZSovXG4vKiBKU09OIG1lYW5pbmcuKi9cbm91dC5uZXh0KCBgW1wiX19wcm90b19fXCJdOmApO1xuIH1lbHNlIGlmKGlkZW50UGF0dGVybi50ZXN0KG5hbWUpKXtcbm91dC5uZXh0KCBgJHtuYW1lfTpgKTtcbiB9ZWxzZXtcbm91dC5uZXh0KCBgJHtxdW90ZShuYW1lKX06YCk7XG4gfVxuZGVjb2RlKHZhbHVlKTtcbm91dC5uZXh0KCcsJyk7XG4gfTtcblxuLyoqXG4gKiBNb2RlbGVkIGFmdGVyIGBmdWxsUmV2aXZlYCBpbiBtYXJzaGFsLmpzXG4gKlxuICogQHBhcmFtIHtFbmNvZGluZ30gcmF3VHJlZVxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuY29uc3QgcmVjdXI9KHJhd1RyZWUpPT57XG5pZighaXNPYmplY3QocmF3VHJlZSkpe1xuLyogcHJpbWl0aXZlcyBnZXQgcXVvdGVkKi9cbnJldHVybiBvdXQubmV4dChxdW90ZShyYXdUcmVlKSk7XG4gfVxuLyogQXNzZXJ0aW9ucyBvZiB0aGUgYWJvdmUgdG8gbmFycm93IHRoZSB0eXBlLiovXG5hc3NlcnQudHlwZW9mKHJhd1RyZWUsJ29iamVjdCcpO1xuYXNzZXJ0KHJhd1RyZWUhPT1udWxsKTtcbmlmKFFDTEFTUyBpbiByYXdUcmVlKXtcbmNvbnN0IHFjbGFzcz1yYXdUcmVlW1FDTEFTU107XG5hc3NlcnQudHlwZW9mKHFjbGFzcywnc3RyaW5nJyk7XG5hc3NlcnQoIWlzQXJyYXkocmF3VHJlZSkpO1xuLyogU3dpdGNoaW5nIG9uIGBlbmNvZGVkW1FDTEFTU11gIChvciBhbnl0aGluZyBsZXNzIGRpcmVjdCwgbGlrZSovXG4vKiBgcWNsYXNzYCkgZG9lcyBub3QgZGlzY3JpbWluYXRlIHJhd1RyZWUgaW4gdHlwZXNjcmlwdEA0LjIuMyBhbmQqL1xuLyogZWFybGllci4qL1xuc3dpdGNoKHJhd1RyZWVbJ0BxY2xhc3MnXSl7XG4vKiBFbmNvZGluZyBvZiBwcmltaXRpdmVzIG5vdCBoYW5kbGVkIGJ5IEpTT04qL1xuY2FzZSd1bmRlZmluZWQnOlxuY2FzZSdOYU4nOlxuY2FzZSdJbmZpbml0eSc6XG5jYXNlJy1JbmZpbml0eSc6e1xuLyogVGhlaXIgcWNsYXNzIGlzIHRoZWlyIGV4cHJlc3Npb24gc291cmNlLiovXG5yZXR1cm4gb3V0Lm5leHQocWNsYXNzKTtcbiB9XG5jYXNlJ2JpZ2ludCc6e1xuY29uc3R7ZGlnaXRzfT1yYXdUcmVlO1xucmV0dXJuIG91dC5uZXh0KCBgJHtCaWdJbnQoZGlnaXRzKX1uYCk7XG4gfVxuY2FzZSdAQGFzeW5jSXRlcmF0b3InOntcbi8qIFRPRE8gZGVwcmVjYXRlZC4gRXZlbnR1YWxseSByZW1vdmUuKi9cbnJldHVybiBvdXQubmV4dCgnU3ltYm9sLmFzeW5jSXRlcmF0b3InKTtcbiB9XG5jYXNlJ3N5bWJvbCc6e1xuY29uc3R7bmFtZX09cmF3VHJlZTtcbmNvbnN0IHN5bT1wYXNzYWJsZVN5bWJvbEZvck5hbWUobmFtZSk7XG5hc3NlcnQudHlwZW9mKHN5bSwnc3ltYm9sJyk7XG5jb25zdCByZWdpc3RlcmVkTmFtZT1TeW1ib2wua2V5Rm9yKHN5bSk7XG5pZihyZWdpc3RlcmVkTmFtZT09PXVuZGVmaW5lZCl7XG5jb25zdCBtYXRjaD1BdEF0UHJlZml4UGF0dGVybi5leGVjKG5hbWUpO1xuYXNzZXJ0KG1hdGNoIT09bnVsbCk7XG5jb25zdCBzdWZmaXg9bWF0Y2hbMV07XG5hc3NlcnQoU3ltYm9sW3N1ZmZpeF09PT1zeW0pO1xuYXNzZXJ0KGlkZW50UGF0dGVybi50ZXN0KHN1ZmZpeCkpO1xucmV0dXJuIG91dC5uZXh0KCBgU3ltYm9sLiR7c3VmZml4fWApO1xuIH1cbnJldHVybiBvdXQubmV4dCggYFN5bWJvbC5mb3IoJHtxdW90ZShyZWdpc3RlcmVkTmFtZSl9KWApO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5jb25zdHt0YWcscGF5bG9hZH09cmF3VHJlZTtcbm91dC5uZXh0KCBgbWFrZVRhZ2dlZCgke3F1b3RlKHRhZyl9LGApO1xuZGVjb2RlKHBheWxvYWQpO1xucmV0dXJuIG91dC5uZXh0KCcpJyk7XG4gfVxuXG5jYXNlJ3Nsb3QnOntcbmxldHtpbmRleCxpZmFjZX09cmF3VHJlZTtcbmluZGV4PU51bWJlcihOYXQoaW5kZXgpKTtcbmlmKGlmYWNlPT09dW5kZWZpbmVkKXtcbnJldHVybiBvdXQubmV4dCggYHNsb3QoJHtpbmRleH0pYCk7XG4gfWVsc2V7XG5pZmFjZT1xdW90ZShpZmFjZSk7XG5yZXR1cm4gb3V0Lm5leHQoIGBzbG90KCR7aW5kZXh9LCR7aWZhY2V9KWApO1xuIH1cbiB9XG5cbmNhc2UnaGlsYmVydCc6e1xuY29uc3R7b3JpZ2luYWwscmVzdH09cmF3VHJlZTtcbm91dC5vcGVuKCd7Jyk7XG5kZWNvZGVQcm9wZXJ0eShRQ0xBU1Msb3JpZ2luYWwpO1xuaWYoJ3Jlc3QnaW4gcmF3VHJlZSl7XG5hc3NlcnQudHlwZW9mKHJlc3QsJ29iamVjdCcpO1xuYXNzZXJ0KHJlc3QhPT1udWxsKTtcbmNvbnN0IG5hbWVzPW93bktleXMocmVzdCk7XG5mb3IoY29uc3QgbmFtZSBvZiBuYW1lcyl7XG5hc3NlcnQudHlwZW9mKFxubmFtZSxcbidzdHJpbmcnLFxuWCBgUHJvcGVydHkgbmFtZSAke25hbWV9IG9mICR7cmVzdH0gbXVzdCBiZSBhIHN0cmluZ2ApO1xuXG5kZWNvZGVQcm9wZXJ0eShuYW1lLHJlc3RbbmFtZV0pO1xuIH1cbiB9XG5yZXR1cm4gb3V0LmNsb3NlKCd9Jyk7XG4gfVxuXG5jYXNlJ2Vycm9yJzp7XG5jb25zdHtuYW1lLG1lc3NhZ2V9PXJhd1RyZWU7XG5yZXR1cm4gb3V0Lm5leHQoIGAke25hbWV9KCR7cXVvdGUobWVzc2FnZSl9KWApO1xuIH1cblxuZGVmYXVsdDp7XG5hc3NlcnQuZmFpbChYIGB1bnJlY29nbml6ZWQgJHtxKFFDTEFTUyl9ICR7cShxY2xhc3MpfWAsVHlwZUVycm9yKTtcbiB9fVxuXG4gfWVsc2UgaWYoaXNBcnJheShyYXdUcmVlKSl7XG5jb25zdHtsZW5ndGh9PXJhd1RyZWU7XG5pZihsZW5ndGg9PT0wKXtcbnJldHVybiBvdXQubmV4dCgnW10nKTtcbiB9ZWxzZXtcbm91dC5vcGVuKCdbJyk7XG5mb3IobGV0IGk9MDtpPGxlbmd0aDtpKz0xKXtcbm91dC5saW5lKCk7XG5kZWNvZGUocmF3VHJlZVtpXSk7XG5vdXQubmV4dCgnLCcpO1xuIH1cbnJldHVybiBvdXQuY2xvc2UoJ10nKTtcbiB9XG4gfWVsc2V7XG4vKiByYXdUcmVlIGlzIGFuIGBFbmNvZGluZ1JlY29yZGAgd2hpY2ggb25seSBoYXMgc3RyaW5nIGtleXMsKi9cbi8qIGJ1dCBzaW5jZSBvd25LZXlzIGlzIG5vdCBnZW5lcmljLCBpdCBjYW4ndCBwcm9wYWdhdGUgdGhhdCovXG5jb25zdCBuYW1lcz0vKiogQHR5cGUge3N0cmluZ1tdfSAqL293bktleXMocmF3VHJlZSk7XG5pZihuYW1lcy5sZW5ndGg9PT0wKXtcbnJldHVybiBvdXQubmV4dCgne30nKTtcbiB9ZWxzZXtcbm91dC5vcGVuKCd7Jyk7XG5mb3IoY29uc3QgbmFtZSBvZiBuYW1lcyl7XG5kZWNvZGVQcm9wZXJ0eShuYW1lLHJhd1RyZWVbbmFtZV0pO1xuIH1cbnJldHVybiBvdXQuY2xvc2UoJ30nKTtcbiB9XG4gfVxuIH07XG5wcmVwYXJlKGVuY29kaW5nKTtcbmRlY29kZShlbmNvZGluZyk7XG5yZXR1cm4gb3V0LmRvbmUoKTtcbiB9OyRo4oCNX29uY2UuZGVjb2RlVG9KdXN0aW4oZGVjb2RlVG9KdXN0aW4pO1xuaGFyZGVuKGRlY29kZVRvSnVzdGluKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWNvZGVUb0p1c3RpbiI6WyJkZWNvZGVUb0p1c3RpbiJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABeFZV2oQYAAKEGAAAtAAAAQGVuZG8vbWFyc2hhbC12MC43LjUvc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzeyJpbXBvcnRzIjpbIi4vbWFyc2hhbC5qcyJdLCJleHBvcnRzIjpbInBhcnNlIiwic3RyaW5naWZ5Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IG1ha2VNYXJzaGFsOyRo4oCNX2ltcG9ydHMoW1tcIi4vbWFyc2hhbC5qc1wiLCBbW1wibWFrZU1hcnNoYWxcIiwgWyRo4oCNX2EgPT4gKG1ha2VNYXJzaGFsID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlBhc3NhYmxlfSBQYXNzYWJsZSAqL1xuXG5jb25zdHtkZXRhaWxzOlh9PWFzc2VydDtcblxuLyoqIEB0eXBlIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQ29udmVydFZhbFRvU2xvdDxhbnk+fSAqL1xuY29uc3QgZG9Ob3RDb252ZXJ0VmFsVG9TbG90PSh2YWwpPT5cbmFzc2VydC5mYWlsKFggYE1hcnNoYWwncyBzdHJpbmdpZnkgcmVqZWN0cyBwcmVzZW5jZXMgYW5kIHByb21pc2VzICR7dmFsfWApO1xuXG4vKiogQHR5cGUge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5Db252ZXJ0U2xvdFRvVmFsPGFueT59ICovXG5jb25zdCBkb05vdENvbnZlcnRTbG90VG9WYWw9KHNsb3QsX2lmYWNlKT0+XG5hc3NlcnQuZmFpbChYIGBNYXJzaGFsJ3MgcGFyc2UgbXVzdCBub3QgZW5jb2RlIGFueSBzbG90cyAke3Nsb3R9YCk7XG5cbmNvbnN0IGJhZEFycmF5SGFuZGxlcj1oYXJkZW4oe1xuZ2V0OihfdGFyZ2V0LG5hbWUsX3JlY2VpdmVyKT0+e1xuaWYobmFtZT09PSdsZW5ndGgnKXtcbnJldHVybiAwO1xuIH1cbmFzc2VydC5mYWlsKFggYE1hcnNoYWwncyBwYXJzZSBtdXN0IG5vdCBlbmNvZGUgYW55IHNsb3QgcG9zaXRpb25zICR7bmFtZX1gKTtcbiB9fSk7XG5cblxuY29uc3QgYmFkQXJyYXk9aGFyZGVuKG5ldyBQcm94eShoYXJkZW4oW10pLGJhZEFycmF5SGFuZGxlcikpO1xuXG5jb25zdHtzZXJpYWxpemUsdW5zZXJpYWxpemV9PW1ha2VNYXJzaGFsKFxuZG9Ob3RDb252ZXJ0VmFsVG9TbG90LFxuZG9Ob3RDb252ZXJ0U2xvdFRvVmFsLFxue1xuZXJyb3JUYWdnaW5nOidvZmYnLFxuLyogVE9ETyBmaXggdGVzdHMgdG8gd29ya3Mgd2l0aCBzbWFsbGNhcHMuKi9cbnNlcmlhbGl6ZUJvZHlGb3JtYXQ6J2NhcGRhdGEnfSk7XG5cblxuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHZhbFxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3Qgc3RyaW5naWZ5PSh2YWwpPT5zZXJpYWxpemUodmFsKS5ib2R5OyRo4oCNX29uY2Uuc3RyaW5naWZ5KHN0cmluZ2lmeSk7XG5oYXJkZW4oc3RyaW5naWZ5KTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gKiBAcmV0dXJucyB7UGFzc2FibGV9XG4gKi9cbmNvbnN0IHBhcnNlPShzdHIpPT5cbnVuc2VyaWFsaXplKFxuaGFyZGVuKHtcbmJvZHk6c3RyLFxuc2xvdHM6YmFkQXJyYXl9KSk7JGjigI1fb25jZS5wYXJzZShwYXJzZSk7XG5cblxuaGFyZGVuKHBhcnNlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJzdHJpbmdpZnkiOlsic3RyaW5naWZ5Il0sInBhcnNlIjpbInBhcnNlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPi7+3hlMgAAZTIAACMAAABAZW5kby9tYXJzaGFsLXYwLjcuNS9zcmMvbWFyc2hhbC5qc3siaW1wb3J0cyI6WyIuL2VuY29kZVRvQ2FwRGF0YS5qcyIsIi4vZW5jb2RlVG9TbWFsbGNhcHMuanMiLCIuL2hlbHBlcnMvZXJyb3IuanMiLCIuL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanMiLCIuL2hlbHBlcnMvcmVtb3RhYmxlLmpzIiwiLi9wYXNzU3R5bGVPZi5qcyIsIkBlbmRvL25hdCJdLCJleHBvcnRzIjpbIm1ha2VNYXJzaGFsIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IE5hdCxhc3NlcnRQYXNzYWJsZSxnZXRJbnRlcmZhY2VPZixnZXRFcnJvckNvbnN0cnVjdG9yLFFDTEFTUyxtYWtlRW5jb2RlVG9DYXBEYXRhLG1ha2VEZWNvZGVGcm9tQ2FwRGF0YSxtYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyxtYWtlRW5jb2RlVG9TbWFsbGNhcHMsaGFzT3duUHJvcGVydHlPZjskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9uYXRcIiwgW1tcIk5hdFwiLCBbJGjigI1fYSA9PiAoTmF0ID0gJGjigI1fYSldXV1dLFtcIi4vcGFzc1N0eWxlT2YuanNcIiwgW1tcImFzc2VydFBhc3NhYmxlXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXNzYWJsZSA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvcmVtb3RhYmxlLmpzXCIsIFtbXCJnZXRJbnRlcmZhY2VPZlwiLCBbJGjigI1fYSA9PiAoZ2V0SW50ZXJmYWNlT2YgPSAkaOKAjV9hKV1dXV0sW1wiLi9oZWxwZXJzL2Vycm9yLmpzXCIsIFtbXCJnZXRFcnJvckNvbnN0cnVjdG9yXCIsIFskaOKAjV9hID0+IChnZXRFcnJvckNvbnN0cnVjdG9yID0gJGjigI1fYSldXV1dLFtcIi4vZW5jb2RlVG9DYXBEYXRhLmpzXCIsIFtbXCJRQ0xBU1NcIiwgWyRo4oCNX2EgPT4gKFFDTEFTUyA9ICRo4oCNX2EpXV0sW1wibWFrZUVuY29kZVRvQ2FwRGF0YVwiLCBbJGjigI1fYSA9PiAobWFrZUVuY29kZVRvQ2FwRGF0YSA9ICRo4oCNX2EpXV0sW1wibWFrZURlY29kZUZyb21DYXBEYXRhXCIsIFskaOKAjV9hID0+IChtYWtlRGVjb2RlRnJvbUNhcERhdGEgPSAkaOKAjV9hKV1dXV0sW1wiLi9lbmNvZGVUb1NtYWxsY2Fwcy5qc1wiLCBbW1wibWFrZURlY29kZUZyb21TbWFsbGNhcHNcIiwgWyRo4oCNX2EgPT4gKG1ha2VEZWNvZGVGcm9tU21hbGxjYXBzID0gJGjigI1fYSldXSxbXCJtYWtlRW5jb2RlVG9TbWFsbGNhcHNcIiwgWyRo4oCNX2EgPT4gKG1ha2VFbmNvZGVUb1NtYWxsY2FwcyA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImhhc093blByb3BlcnR5T2ZcIiwgWyRo4oCNX2EgPT4gKGhhc093blByb3BlcnR5T2YgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuTWFrZU1hcnNoYWxPcHRpb25zfSBNYWtlTWFyc2hhbE9wdGlvbnMgKi9cbi8qKiBAdGVtcGxhdGUgU2xvdCBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkNvbnZlcnRTbG90VG9WYWw8U2xvdD59IENvbnZlcnRTbG90VG9WYWwgKi9cbi8qKiBAdGVtcGxhdGUgU2xvdCBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkNvbnZlcnRWYWxUb1Nsb3Q8U2xvdD59IENvbnZlcnRWYWxUb1Nsb3QgKi9cbi8qKiBAdGVtcGxhdGUgU2xvdCBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlNlcmlhbGl6ZTxTbG90Pn0gU2VyaWFsaXplICovXG4vKiogQHRlbXBsYXRlIFNsb3QgQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5VbnNlcmlhbGl6ZTxTbG90Pn0gVW5zZXJpYWxpemUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlBhc3NhYmxlfSBQYXNzYWJsZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuSW50ZXJmYWNlU3BlY30gSW50ZXJmYWNlU3BlYyAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuRW5jb2Rpbmd9IEVuY29kaW5nICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5SZW1vdGFibGV9IFJlbW90YWJsZSAqL1xuXG5jb25zdHtpc0FycmF5fT1BcnJheTtcbmNvbnN0e2RldGFpbHM6WCxxdW90ZTpxfT1hc3NlcnQ7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuXG4vKiogQHR5cGUge0NvbnZlcnRWYWxUb1Nsb3Q8YW55Pn0gKi9cbmNvbnN0IGRlZmF1bHRWYWxUb1Nsb3RGbj0oeCk9Png7XG4vKiogQHR5cGUge0NvbnZlcnRTbG90VG9WYWw8YW55Pn0gKi9cbmNvbnN0IGRlZmF1bHRTbG90VG9WYWxGbj0oeCxfKT0+eDtcblxuLyoqXG4gKiBAdGVtcGxhdGUgU2xvdFxuICogQHBhcmFtIHtDb252ZXJ0VmFsVG9TbG90PFNsb3Q+fSBbY29udmVydFZhbFRvU2xvdF1cbiAqIEBwYXJhbSB7Q29udmVydFNsb3RUb1ZhbDxTbG90Pn0gW2NvbnZlcnRTbG90VG9WYWxdXG4gKiBAcGFyYW0ge01ha2VNYXJzaGFsT3B0aW9uc30gW29wdGlvbnNdXG4gKi9cbmNvbnN0ICAgICAgICBtYWtlTWFyc2hhbD0oXG5jb252ZXJ0VmFsVG9TbG90PWRlZmF1bHRWYWxUb1Nsb3RGbixcbmNvbnZlcnRTbG90VG9WYWw9ZGVmYXVsdFNsb3RUb1ZhbEZuLFxue1xuZXJyb3JUYWdnaW5nPSdvbicsXG5tYXJzaGFsTmFtZT0nYW5vbi1tYXJzaGFsJyxcbi8qIFRPRE8gVGVtcG9yYXJ5IGhhY2suKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzI3ODAqL1xuZXJyb3JJZE51bT0xMDAwMCxcbi8qIFdlIHByZWZlciB0aGF0IHRoZSBjYWxsZXIgaW5zdGVhZCBsb2cgdG8gc29tZXdoZXJlIGhpZGRlbiovXG4vKiB0byBiZSByZXZlYWxlZCB3aGVuIGNvcnJlbGF0aW5nIHdpdGggdGhlIHJlY2VpdmVkIGVycm9yLiovXG5tYXJzaGFsU2F2ZUVycm9yPShlcnIpPT5cbmNvbnNvbGUubG9nKCdUZW1wb3JhcnkgbG9nZ2luZyBvZiBzZW50IGVycm9yJyxlcnIpLFxuLyogRGVmYXVsdCB0byAnY2FwZGF0YScgYmVjYXVzZSBpdCB3YXMgaW1wbGVtZW50ZWQgZmlyc3QuKi9cbi8qIFNvbWV0aW1lcywgb250b2dlbnkgZG9lcyByZWNhcGl0dWxhdGUgcGh5bG9nZW55IDspKi9cbnNlcmlhbGl6ZUJvZHlGb3JtYXQ9J2NhcGRhdGEnfT1cbnt9KT0+XG57XG5hc3NlcnQudHlwZW9mKG1hcnNoYWxOYW1lLCdzdHJpbmcnKTtcbmVycm9yVGFnZ2luZz09PSdvbid8fFxuZXJyb3JUYWdnaW5nPT09J29mZid8fFxuYXNzZXJ0LmZhaWwoXG5YIGBUaGUgZXJyb3JUYWdnaW5nIG9wdGlvbiBjYW4gb25seSBiZSBcIm9uXCIgb3IgXCJvZmZcIiAke2Vycm9yVGFnZ2luZ31gKTtcblxuY29uc3QgbmV4dEVycm9ySWQ9KCk9PntcbmVycm9ySWROdW0rPTE7XG5yZXR1cm4gYGVycm9yOiR7bWFyc2hhbE5hbWV9IyR7ZXJyb3JJZE51bX1gO1xuIH07XG5cbi8qKlxuICogQHR5cGUge1NlcmlhbGl6ZTxTbG90Pn1cbiAqL1xuY29uc3Qgc2VyaWFsaXplPShyb290KT0+e1xuY29uc3Qgc2xvdHM9W107XG4vKiBtYXBzIHZhbCAocHJvbWlzZSBvciByZW1vdGFibGUpIHRvIGluZGV4IG9mIHNsb3RzW10qL1xuY29uc3Qgc2xvdE1hcD1uZXcgTWFwKCk7XG5cbi8qKlxuICogQHBhcmFtIHtSZW1vdGFibGUgfCBQcm9taXNlfSBwYXNzYWJsZVxuICogQHJldHVybnMge3tpbmRleDogbnVtYmVyLCByZXBlYXQ6IGJvb2xlYW59fVxuICovXG5jb25zdCBlbmNvZGVTbG90Q29tbW9uPShwYXNzYWJsZSk9PntcbmxldCBpbmRleD1zbG90TWFwLmdldChwYXNzYWJsZSk7XG5pZihpbmRleCE9PXVuZGVmaW5lZCl7XG4vKiBUT0RPIGFzc2VydCB0aGF0IGl0J3MgdGhlIHNhbWUgaWZhY2UgYXMgYmVmb3JlKi9cbmFzc2VydC50eXBlb2YoaW5kZXgsJ251bWJlcicpO1xucmV0dXJuIGhhcmRlbih7aW5kZXgscmVwZWF0OnRydWV9KTtcbiB9XG5cbmluZGV4PXNsb3RzLmxlbmd0aDtcbmNvbnN0IHNsb3Q9Y29udmVydFZhbFRvU2xvdChwYXNzYWJsZSk7XG5zbG90cy5wdXNoKHNsb3QpO1xuc2xvdE1hcC5zZXQocGFzc2FibGUsaW5kZXgpO1xucmV0dXJuIGhhcmRlbih7aW5kZXgscmVwZWF0OmZhbHNlfSk7XG4gfTtcblxuLyoqXG4gKiBFdmVuIGlmIGFuIEVycm9yIGlzIG5vdCBhY3R1YWxseSBwYXNzYWJsZSwgd2UnZCByYXRoZXIgc2VuZFxuICogaXQgYW55d2F5IGJlY2F1c2UgdGhlIGRpYWdub3N0aWMgaW5mbyBjYXJyaWVkIGJ5IHRoZSBlcnJvclxuICogaXMgbW9yZSB2YWx1YWJsZSB0aGFuIGRpYWdub3Npbmcgd2h5IHRoZSBlcnJvciBpc24ndFxuICogcGFzc2FibGUuIFNlZSBjb21tZW50cyBpbiBFcnJvckhlbHBlci5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJcbiAqIEBwYXJhbSB7KHA6IFBhc3NhYmxlKSA9PiB1bmtub3dufSBlbmNvZGVSZWN1clxuICogQHJldHVybnMge3tlcnJvcklkPzogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmcsIG5hbWU6IHN0cmluZ319XG4gKi9cbmNvbnN0IGVuY29kZUVycm9yQ29tbW9uPShlcnIsZW5jb2RlUmVjdXIpPT57XG5jb25zdCBtZXNzYWdlPWVuY29kZVJlY3VyKCBgJHtlcnIubWVzc2FnZX1gKTtcbmFzc2VydC50eXBlb2YobWVzc2FnZSwnc3RyaW5nJyk7XG5jb25zdCBuYW1lPWVuY29kZVJlY3VyKCBgJHtlcnIubmFtZX1gKTtcbmFzc2VydC50eXBlb2YobmFtZSwnc3RyaW5nJyk7XG4vKiBNdXN0IGVuY29kZSBgY2F1c2VgLCBgZXJyb3JzYC4qL1xuLyogbmVzdGVkIG5vbi1wYXNzYWJsZSBlcnJvcnMgbXVzdCBiZSBvayBmcm9tIGhlcmUuKi9cbmlmKGVycm9yVGFnZ2luZz09PSdvbicpe1xuLyogV2UgZGVsaWJlcmF0ZWx5IGRvIG5vdCBzaGFyZSB0aGUgc3RhY2ssIGJ1dCBpdCB3b3VsZCovXG4vKiBiZSB1c2VmdWwgdG8gbG9nIHRoZSBzdGFjayBsb2NhbGx5IHNvIHNvbWVvbmUgd2hvIGhhcyovXG4vKiBwcml2aWxlZ2VkIGFjY2VzcyB0byB0aGUgdGhyb3dpbmcgVmF0IGNhbiBjb3JyZWxhdGUqL1xuLyogdGhlIHByb2JsZW0gd2l0aCB0aGUgcmVtb3RlIFZhdCB0aGF0IGdldHMgdGhpcyovXG4vKiBzdW1tYXJ5LiBJZiB3ZSBkbyB0aGF0LCB3ZSBjb3VsZCBhbGxvY2F0ZSBzb21lIHJhbmRvbSovXG4vKiBpZGVudGlmaWVyIGFuZCBpbmNsdWRlIGl0IGluIHRoZSBtZXNzYWdlLCB0byBoZWxwKi9cbi8qIHdpdGggdGhlIGNvcnJlbGF0aW9uLiovXG5jb25zdCBlcnJvcklkPWVuY29kZVJlY3VyKG5leHRFcnJvcklkKCkpO1xuYXNzZXJ0LnR5cGVvZihlcnJvcklkLCdzdHJpbmcnKTtcbmFzc2VydC5ub3RlKGVycixYIGBTZW50IGFzICR7ZXJyb3JJZH1gKTtcbm1hcnNoYWxTYXZlRXJyb3IoZXJyKTtcbnJldHVybiBoYXJkZW4oe2Vycm9ySWQsbWVzc2FnZSxuYW1lfSk7XG4gfWVsc2V7XG5yZXR1cm4gaGFyZGVuKHttZXNzYWdlLG5hbWV9KTtcbiB9XG4gfTtcblxuaWYoc2VyaWFsaXplQm9keUZvcm1hdD09PSdjYXBkYXRhJyl7XG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHBhc3NhYmxlXG4gKiBAcGFyYW0ge0ludGVyZmFjZVNwZWN9IFtpZmFjZV1cbiAqIEByZXR1cm5zIHtFbmNvZGluZ31cbiAqL1xuY29uc3QgZW5jb2RlU2xvdFRvQ2FwRGF0YT0ocGFzc2FibGUsaWZhY2U9dW5kZWZpbmVkKT0+e1xuY29uc3R7aW5kZXgscmVwZWF0fT1lbmNvZGVTbG90Q29tbW9uKHBhc3NhYmxlKTtcblxuaWYocmVwZWF0PT09dHJ1ZXx8aWZhY2U9PT11bmRlZmluZWQpe1xucmV0dXJuIGhhcmRlbih7W1FDTEFTU106J3Nsb3QnLGluZGV4fSk7XG4gfWVsc2V7XG5yZXR1cm4gaGFyZGVuKHtbUUNMQVNTXTonc2xvdCcsaWZhY2UsaW5kZXh9KTtcbiB9XG4gfTtcblxuY29uc3QgZW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhPSh2YWwsX2VuY29kZVJlY3VyKT0+XG5lbmNvZGVTbG90VG9DYXBEYXRhKHZhbCxnZXRJbnRlcmZhY2VPZih2YWwpKTtcblxuY29uc3QgZW5jb2RlUHJvbWlzZVRvQ2FwRGF0YT0ocHJvbWlzZSxfZW5jb2RlUmVjdXIpPT5cbmVuY29kZVNsb3RUb0NhcERhdGEocHJvbWlzZSk7XG5cbi8qKlxuICogRXZlbiBpZiBhbiBFcnJvciBpcyBub3QgYWN0dWFsbHkgcGFzc2FibGUsIHdlJ2QgcmF0aGVyIHNlbmRcbiAqIGl0IGFueXdheSBiZWNhdXNlIHRoZSBkaWFnbm9zdGljIGluZm8gY2FycmllZCBieSB0aGUgZXJyb3JcbiAqIGlzIG1vcmUgdmFsdWFibGUgdGhhbiBkaWFnbm9zaW5nIHdoeSB0aGUgZXJyb3IgaXNuJ3RcbiAqIHBhc3NhYmxlLiBTZWUgY29tbWVudHMgaW4gRXJyb3JIZWxwZXIuXG4gKlxuICogQHBhcmFtIHtFcnJvcn0gZXJyXG4gKiBAcGFyYW0geyhwOiBQYXNzYWJsZSkgPT4gRW5jb2Rpbmd9IGVuY29kZVJlY3VyXG4gKiBAcmV0dXJucyB7RW5jb2Rpbmd9XG4gKi9cbmNvbnN0IGVuY29kZUVycm9yVG9DYXBEYXRhPShlcnIsZW5jb2RlUmVjdXIpPT57XG5jb25zdCBlcnJEYXRhPWVuY29kZUVycm9yQ29tbW9uKGVycixlbmNvZGVSZWN1cik7XG5yZXR1cm4gaGFyZGVuKHtbUUNMQVNTXTonZXJyb3InLC4uLmVyckRhdGF9KTtcbiB9O1xuXG5jb25zdCBlbmNvZGVUb0NhcERhdGE9bWFrZUVuY29kZVRvQ2FwRGF0YSh7XG5lbmNvZGVSZW1vdGFibGVUb0NhcERhdGEsXG5lbmNvZGVQcm9taXNlVG9DYXBEYXRhLFxuZW5jb2RlRXJyb3JUb0NhcERhdGF9KTtcblxuXG5jb25zdCBlbmNvZGVkPWVuY29kZVRvQ2FwRGF0YShyb290KTtcbmNvbnN0IGJvZHk9SlNPTi5zdHJpbmdpZnkoZW5jb2RlZCk7XG5yZXR1cm4gaGFyZGVuKHtcbmJvZHksXG5zbG90c30pO1xuXG4gfWVsc2UgaWYoc2VyaWFsaXplQm9keUZvcm1hdD09PSdzbWFsbGNhcHMnKXtcbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHByZWZpeFxuICogQHBhcmFtIHtQYXNzYWJsZX0gcGFzc2FibGVcbiAqIEBwYXJhbSB7SW50ZXJmYWNlU3BlY30gW2lmYWNlXVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgZW5jb2RlU2xvdFRvU21hbGxjYXBzPShwcmVmaXgscGFzc2FibGUsaWZhY2U9dW5kZWZpbmVkKT0+e1xuY29uc3R7aW5kZXgscmVwZWF0fT1lbmNvZGVTbG90Q29tbW9uKHBhc3NhYmxlKTtcblxuLyogVE9ETyBleHBsb3JlIHJlbW92aW5nIHRoaXMgc3BlY2lhbCBjYXNlKi9cbmlmKHJlcGVhdD09PXRydWV8fGlmYWNlPT09dW5kZWZpbmVkKXtcbnJldHVybiBgJHtwcmVmaXh9JHtpbmRleH1gO1xuIH1cbnJldHVybiBgJHtwcmVmaXh9JHtpbmRleH0uJHtpZmFjZX1gO1xuIH07XG5cbmNvbnN0IGVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzPShyZW1vdGFibGUsX2VuY29kZVJlY3VyKT0+XG5lbmNvZGVTbG90VG9TbWFsbGNhcHMoJyQnLHJlbW90YWJsZSxnZXRJbnRlcmZhY2VPZihyZW1vdGFibGUpKTtcblxuY29uc3QgZW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzPShwcm9taXNlLF9lbmNvZGVSZWN1cik9PlxuZW5jb2RlU2xvdFRvU21hbGxjYXBzKCcmJyxwcm9taXNlKTtcblxuY29uc3QgZW5jb2RlRXJyb3JUb1NtYWxsY2Fwcz0oZXJyLGVuY29kZVJlY3VyKT0+e1xuY29uc3QgZXJyRGF0YT1lbmNvZGVFcnJvckNvbW1vbihlcnIsZW5jb2RlUmVjdXIpO1xuY29uc3R7bWVzc2FnZSwuLi5yZXN0fT1lcnJEYXRhO1xucmV0dXJuIGhhcmRlbih7JyNlcnJvcic6bWVzc2FnZSwuLi5yZXN0fSk7XG4gfTtcblxuY29uc3QgZW5jb2RlVG9TbWFsbGNhcHM9bWFrZUVuY29kZVRvU21hbGxjYXBzKHtcbmVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzLFxuZW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzLFxuZW5jb2RlRXJyb3JUb1NtYWxsY2Fwc30pO1xuXG5cbmNvbnN0IGVuY29kZWQ9ZW5jb2RlVG9TbWFsbGNhcHMocm9vdCk7XG5jb25zdCBzbWFsbGNhcHNCb2R5PUpTT04uc3RyaW5naWZ5KGVuY29kZWQpO1xucmV0dXJuIGhhcmRlbih7XG4vKiBWYWxpZCBKU09OIGNhbm5vdCBiZWdpbiB3aXRoIGEgJyMnLCBzbyB0aGlzIGlzIGEgdmFsaWQgc2lnbmFsKi9cbi8qIGluZGljYXRpbmcgc21hbGxjYXBzIGZvcm1hdC4qL1xuYm9keTogYCMke3NtYWxsY2Fwc0JvZHl9YCxcbnNsb3RzfSk7XG5cbiB9ZWxzZXtcbmFzc2VydC5mYWlsKFxuWCBgVW5yZWNvZ25pemVkIHNlcmlhbGl6ZUJvZHlGb3JtYXQ6ICR7cShzZXJpYWxpemVCb2R5Rm9ybWF0KX1gKTtcblxuIH1cbiB9O1xuXG5jb25zdCBtYWtlRnVsbFJldml2ZT0oc2xvdHMpPT57XG4vKiogQHR5cGUge01hcDxudW1iZXIsIFBhc3NhYmxlPn0gKi9cbmNvbnN0IHZhbE1hcD1uZXcgTWFwKCk7XG5cbi8qKlxuICogQHBhcmFtIHt7aWZhY2U/OiBzdHJpbmcsIGluZGV4OiBudW1iZXJ9fSBzbG90RGF0YVxuICogQHJldHVybnMge1JlbW90YWJsZSB8IFByb21pc2V9XG4gKi9cbmNvbnN0IGRlY29kZVNsb3RDb21tb249KHNsb3REYXRhKT0+e1xuY29uc3R7aWZhY2U9dW5kZWZpbmVkLGluZGV4LC4uLnJlc3R9PXNsb3REYXRhO1xub3duS2V5cyhyZXN0KS5sZW5ndGg9PT0wfHxcbmFzc2VydC5mYWlsKFggYHVuZXhwZWN0ZWQgZW5jb2RlZCBzbG90IHByb3BlcnRpZXMgJHtxKG93bktleXMocmVzdCkpfWApO1xuaWYodmFsTWFwLmhhcyhpbmRleCkpe1xucmV0dXJuIHZhbE1hcC5nZXQoaW5kZXgpO1xuIH1cbi8qIFRPRE8gU0VDVVJJVFkgSEFaQVJEOiBtdXN0IGVuZm9jZSB0aGF0IHJlbW90YWJsZSB2cyBwcm9taXNlKi9cbi8qIGlzIGFjY29yZGluZyB0byB0aGUgZW5jb2RlZCBzdHJpbmcuKi9cbmNvbnN0IHNsb3Q9c2xvdHNbTnVtYmVyKE5hdChpbmRleCkpXTtcbmNvbnN0IHZhbD1jb252ZXJ0U2xvdFRvVmFsKHNsb3QsaWZhY2UpO1xudmFsTWFwLnNldChpbmRleCx2YWwpO1xucmV0dXJuIHZhbDtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7e2Vycm9ySWQ/OiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZywgbmFtZTogc3RyaW5nfX0gZXJyRGF0YVxuICogQHBhcmFtIHsoZTogdW5rbm93bikgPT4gUGFzc2FibGV9IGRlY29kZVJlY3VyXG4gKiBAcmV0dXJucyB7RXJyb3J9XG4gKi9cbmNvbnN0IGRlY29kZUVycm9yQ29tbW9uPShlcnJEYXRhLGRlY29kZVJlY3VyKT0+e1xuY29uc3R7ZXJyb3JJZD11bmRlZmluZWQsbWVzc2FnZSxuYW1lLC4uLnJlc3R9PWVyckRhdGE7XG5vd25LZXlzKHJlc3QpLmxlbmd0aD09PTB8fFxuYXNzZXJ0LmZhaWwoWCBgdW5leHBlY3RlZCBlbmNvZGVkIGVycm9yIHByb3BlcnRpZXMgJHtxKG93bktleXMocmVzdCkpfWApO1xuLyogVE9ETyBNdXN0IGRlY29kZSBgY2F1c2VgIGFuZCBgZXJyb3JzYCBwcm9wZXJ0aWVzKi9cbi8qIGNhcERhdGEgZG9lcyBub3QgdHJhbnNmb3JtIHN0cmluZ3MuIFRoZSBjYWxscyB0byBgZGVjb2RlUmVjdXJgKi9cbi8qIGFyZSBmb3IgcmV1c2UgYnkgb3RoZXIgZW5jb2RpbmdzIHRoYXQgZG8sIHN1Y2ggYXMgc21hbGxjYXBzLiovXG5jb25zdCBkTmFtZT1kZWNvZGVSZWN1cihuYW1lKTtcbmNvbnN0IGRNZXNzYWdlPWRlY29kZVJlY3VyKG1lc3NhZ2UpO1xuY29uc3QgZEVycm9ySWQ9ZXJyb3JJZCYmZGVjb2RlUmVjdXIoZXJyb3JJZCk7XG50eXBlb2YgZE5hbWU9PT0nc3RyaW5nJ3x8XG5hc3NlcnQuZmFpbChYIGBpbnZhbGlkIGVycm9yIG5hbWUgdHlwZW9mICR7cSh0eXBlb2YgZE5hbWUpfWApO1xudHlwZW9mIGRNZXNzYWdlPT09J3N0cmluZyd8fFxuYXNzZXJ0LmZhaWwoWCBgaW52YWxpZCBlcnJvciBtZXNzYWdlIHR5cGVvZiAke3EodHlwZW9mIGRNZXNzYWdlKX1gKTtcbmNvbnN0IEVDPWdldEVycm9yQ29uc3RydWN0b3IoZE5hbWUpfHxFcnJvcjtcbi8qIGVycm9ySWQgaXMgYSBsYXRlIGFkZGl0aW9uIHNvIGJlIHRvbGVyYW50IG9mIGl0cyBhYnNlbmNlLiovXG5jb25zdCBlcnJvck5hbWU9XG5kRXJyb3JJZD09PXVuZGVmaW5lZD9cbiBgUmVtb3RlJHtFQy5uYW1lfWA6XG4gYFJlbW90ZSR7RUMubmFtZX0oJHtkRXJyb3JJZH0pYDtcbmNvbnN0IGVycm9yPWFzc2VydC5lcnJvcihkTWVzc2FnZSxFQyx7ZXJyb3JOYW1lfSk7XG5yZXR1cm4gaGFyZGVuKGVycm9yKTtcbiB9O1xuXG4vKiBUaGUgY3VycmVudCBlbmNvZGluZyBkb2VzIG5vdCBnaXZlIHRoZSBkZWNvZGVyIGVub3VnaCBpbnRvIHRvIGRpc3Rpbmd1aXNoKi9cbi8qIHdoZXRoZXIgYSBzbG90IHJlcHJlc2VudHMgYSBwcm9taXNlIG9yIGEgcmVtb3RhYmxlLiBBcyBhbiBpbXBsZW1lbnRhdGlvbiovXG4vKiByZXN0cmljdGlvbiB1bnRpbCB0aGlzIGlzIGZpeGVkLCBpZiBlaXRoZXIgaXMgcHJvdmlkZWQsIGJvdGggbXVzdCBiZSovXG4vKiBwcm92aWRlZCBhbmQgdGhleSBtdXN0IGJlIHRoZSBzYW1lLiovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80MzM0Ki9cbmNvbnN0IGRlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhPShyYXdUcmVlLF9kZWNvZGVSZWN1cik9PntcbmNvbnN0e1tRQ0xBU1NdOl8sLi4uc2xvdERhdGF9PXJhd1RyZWU7XG5yZXR1cm4gZGVjb2RlU2xvdENvbW1vbihzbG90RGF0YSk7XG4gfTtcblxuY29uc3QgZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YT0ocmF3VHJlZSxkZWNvZGVSZWN1cik9PntcbmNvbnN0e1tRQ0xBU1NdOl8sLi4uZXJyRGF0YX09cmF3VHJlZTtcbnJldHVybiBkZWNvZGVFcnJvckNvbW1vbihlcnJEYXRhLGRlY29kZVJlY3VyKTtcbiB9O1xuXG5jb25zdCByZXZpdmVGcm9tQ2FwRGF0YT1tYWtlRGVjb2RlRnJvbUNhcERhdGEoe1xuZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGE6ZGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGEsXG5kZWNvZGVQcm9taXNlRnJvbUNhcERhdGE6ZGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGEsXG5kZWNvZGVFcnJvckZyb21DYXBEYXRhfSk7XG5cblxuY29uc3QgbWFrZURlY29kZVNsb3RGcm9tU21hbGxjYXBzPShwcmVmaXgpPT57XG5yZXR1cm4oc3RyaW5nRW5jb2RpbmcsX2RlY29kZVJlY3VyKT0+e1xuYXNzZXJ0KHN0cmluZ0VuY29kaW5nLnN0YXJ0c1dpdGgocHJlZml4KSk7XG4vKiBzbG90czogJHNsb3RJbmRleC5pZmFjZSBvciAkc2xvdEluZGV4Ki9cbmNvbnN0IGk9c3RyaW5nRW5jb2RpbmcuaW5kZXhPZignLicpO1xuY29uc3QgaW5kZXg9TnVtYmVyKHN0cmluZ0VuY29kaW5nLnNsaWNlKDEsaTwwP3VuZGVmaW5lZDppKSk7XG4vKiBpIDwgMCBtZWFucyB0aGVyZSB3YXMgbm8gaWZhY2UgaW5jbHVkZWQuKi9cbmNvbnN0IGlmYWNlPWk8MD91bmRlZmluZWQ6c3RyaW5nRW5jb2Rpbmcuc2xpY2UoaSsxKTtcbnJldHVybiBkZWNvZGVTbG90Q29tbW9uKHtpZmFjZSxpbmRleH0pO1xuIH07XG4gfTtcbmNvbnN0IGRlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHM9bWFrZURlY29kZVNsb3RGcm9tU21hbGxjYXBzKCckJyk7XG5jb25zdCBkZWNvZGVQcm9taXNlRnJvbVNtYWxsY2Fwcz1tYWtlRGVjb2RlU2xvdEZyb21TbWFsbGNhcHMoJyYnKTtcblxuY29uc3QgZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzPShlbmNvZGluZyxkZWNvZGVSZWN1cik9PntcbmNvbnN0eycjZXJyb3InOm1lc3NhZ2UsLi4ucmVzdEVyckRhdGF9PWVuY29kaW5nO1xuIWhhc093blByb3BlcnR5T2YocmVzdEVyckRhdGEsJ21lc3NhZ2UnKXx8XG5hc3NlcnQuZmFpbChYIGB1bmV4cGVjdGVkIGVuY29kZWQgZXJyb3IgcHJvcGVydHkgJHtxKCdtZXNzYWdlJyl9YCk7XG5yZXR1cm4gZGVjb2RlRXJyb3JDb21tb24oe21lc3NhZ2UsLi4ucmVzdEVyckRhdGF9LGRlY29kZVJlY3VyKTtcbiB9O1xuXG5jb25zdCByZXZpdmVGcm9tU21hbGxjYXBzPW1ha2VEZWNvZGVGcm9tU21hbGxjYXBzKHtcbmRlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHMsXG5kZWNvZGVQcm9taXNlRnJvbVNtYWxsY2FwcyxcbmRlY29kZUVycm9yRnJvbVNtYWxsY2Fwc30pO1xuXG5cbnJldHVybiBoYXJkZW4oe3Jldml2ZUZyb21DYXBEYXRhLHJldml2ZUZyb21TbWFsbGNhcHN9KTtcbiB9O1xuXG4vKipcbiAqIEB0eXBlIHtVbnNlcmlhbGl6ZTxTbG90Pn1cbiAqL1xuY29uc3QgdW5zZXJpYWxpemU9KGRhdGEpPT57XG5jb25zdHtib2R5LHNsb3RzfT1kYXRhO1xudHlwZW9mIGJvZHk9PT0nc3RyaW5nJ3x8XG5hc3NlcnQuZmFpbChcblggYHVuc2VyaWFsaXplKCkgZ2l2ZW4gbm9uLWNhcGRhdGEgKC5ib2R5IGlzICR7Ym9keX0sIG5vdCBzdHJpbmcpYCk7XG5cbmlzQXJyYXkoZGF0YS5zbG90cyl8fFxuYXNzZXJ0LmZhaWwoWCBgdW5zZXJpYWxpemUoKSBnaXZlbiBub24tY2FwZGF0YSAoLnNsb3RzIGFyZSBub3QgQXJyYXkpYCk7XG5jb25zdHtyZXZpdmVGcm9tQ2FwRGF0YSxyZXZpdmVGcm9tU21hbGxjYXBzfT1tYWtlRnVsbFJldml2ZShzbG90cyk7XG5sZXQgcmVzdWx0O1xuLyogSlNPTiBjYW5ub3QgYmVnaW4gd2l0aCBhICcjJywgc28gdGhpcyBpcyBhbiB1bmFtYmlndW91cyBzaWduYWwuKi9cbmlmKGJvZHkuc3RhcnRzV2l0aCgnIycpKXtcbmNvbnN0IHNtYWxsY2Fwc0JvZHk9Ym9keS5zbGljZSgxKTtcbmNvbnN0IGVuY29kaW5nPWhhcmRlbihKU09OLnBhcnNlKHNtYWxsY2Fwc0JvZHkpKTtcbnJlc3VsdD1oYXJkZW4ocmV2aXZlRnJvbVNtYWxsY2FwcyhlbmNvZGluZykpO1xuIH1lbHNle1xuY29uc3QgcmF3VHJlZT1oYXJkZW4oSlNPTi5wYXJzZShib2R5KSk7XG5yZXN1bHQ9aGFyZGVuKHJldml2ZUZyb21DYXBEYXRhKHJhd1RyZWUpKTtcbiB9XG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80MzM3Ki9cbi8qIHdoaWNoIHNob3VsZCBiZSBjb25zaWRlcmVkIGZpeGVkIG9uY2Ugd2UndmUgY29tcGxldGVkIHRoZSBzd2l0Y2gqL1xuLyogdG8gc21hbGxjYXBzLiovXG5hc3NlcnRQYXNzYWJsZShyZXN1bHQpO1xucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG5yZXR1cm4gaGFyZGVuKHtcbnNlcmlhbGl6ZSxcbnVuc2VyaWFsaXplfSk7XG5cbiB9OyRo4oCNX29uY2UubWFrZU1hcnNoYWwobWFrZU1hcnNoYWwpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VNYXJzaGFsIjpbIm1ha2VNYXJzaGFsIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJNAMRhJGwAASRsAACcAAABAZW5kby9tYXJzaGFsLXYwLjcuNS9zcmMvcGFzc1N0eWxlT2YuanN7ImltcG9ydHMiOlsiLi9oZWxwZXJzL2NvcHlBcnJheS5qcyIsIi4vaGVscGVycy9jb3B5UmVjb3JkLmpzIiwiLi9oZWxwZXJzL2Vycm9yLmpzIiwiLi9oZWxwZXJzL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9oZWxwZXJzL3JlbW90YWJsZS5qcyIsIi4vaGVscGVycy9zYWZlLXByb21pc2UuanMiLCIuL2hlbHBlcnMvc3ltYm9sLmpzIiwiLi9oZWxwZXJzL3RhZ2dlZC5qcyIsIkBlbmRvL3Byb21pc2Uta2l0Il0sImV4cG9ydHMiOlsiYXNzZXJ0UGFzc2FibGUiLCJwYXNzU3R5bGVPZiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBpc1Byb21pc2UsaXNPYmplY3QsUEFTU19TVFlMRSxDb3B5QXJyYXlIZWxwZXIsQ29weVJlY29yZEhlbHBlcixUYWdnZWRIZWxwZXIsUmVtb3RhYmxlSGVscGVyLEVycm9ySGVscGVyLGFzc2VydFBhc3NhYmxlU3ltYm9sLGFzc2VydFNhZmVQcm9taXNlOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJpc1Byb21pc2VcIiwgWyRo4oCNX2EgPT4gKGlzUHJvbWlzZSA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImlzT2JqZWN0XCIsIFskaOKAjV9hID0+IChpc09iamVjdCA9ICRo4oCNX2EpXV0sW1wiUEFTU19TVFlMRVwiLCBbJGjigI1fYSA9PiAoUEFTU19TVFlMRSA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvY29weUFycmF5LmpzXCIsIFtbXCJDb3B5QXJyYXlIZWxwZXJcIiwgWyRo4oCNX2EgPT4gKENvcHlBcnJheUhlbHBlciA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvY29weVJlY29yZC5qc1wiLCBbW1wiQ29weVJlY29yZEhlbHBlclwiLCBbJGjigI1fYSA9PiAoQ29weVJlY29yZEhlbHBlciA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvdGFnZ2VkLmpzXCIsIFtbXCJUYWdnZWRIZWxwZXJcIiwgWyRo4oCNX2EgPT4gKFRhZ2dlZEhlbHBlciA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvcmVtb3RhYmxlLmpzXCIsIFtbXCJSZW1vdGFibGVIZWxwZXJcIiwgWyRo4oCNX2EgPT4gKFJlbW90YWJsZUhlbHBlciA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvZXJyb3IuanNcIiwgW1tcIkVycm9ySGVscGVyXCIsIFskaOKAjV9hID0+IChFcnJvckhlbHBlciA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvc3ltYm9sLmpzXCIsIFtbXCJhc3NlcnRQYXNzYWJsZVN5bWJvbFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGFzc2FibGVTeW1ib2wgPSAkaOKAjV9hKV1dXV0sW1wiLi9oZWxwZXJzL3NhZmUtcHJvbWlzZS5qc1wiLCBbW1wiYXNzZXJ0U2FmZVByb21pc2VcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFNhZmVQcm9taXNlID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vaGVscGVycy9pbnRlcm5hbC10eXBlcy5qcycpLlBhc3NTdHlsZUhlbHBlcn0gUGFzc1N0eWxlSGVscGVyICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlBhc3NTdHlsZX0gUGFzc1N0eWxlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5QYXNzU3R5bGVPZn0gUGFzc1N0eWxlT2YgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlByaW1pdGl2ZVN0eWxlfSBQcmltaXRpdmVTdHlsZSAqL1xuXG4vKiogQHR5cGVkZWYge0V4Y2x1ZGU8UGFzc1N0eWxlLCBQcmltaXRpdmVTdHlsZSB8IFwicHJvbWlzZVwiPn0gSGVscGVyUGFzc1N0eWxlICovXG5cbmNvbnN0e2RldGFpbHM6WCxxdW90ZTpxfT1hc3NlcnQ7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7aXNGcm96ZW59PU9iamVjdDtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NTdHlsZUhlbHBlcltdfSBwYXNzU3R5bGVIZWxwZXJzXG4gKiBAcmV0dXJucyB7UmVjb3JkPEhlbHBlclBhc3NTdHlsZSwgUGFzc1N0eWxlSGVscGVyPiB9XG4gKi9cblxuY29uc3QgbWFrZUhlbHBlclRhYmxlPShwYXNzU3R5bGVIZWxwZXJzKT0+e1xuLyoqIEB0eXBlIHtSZWNvcmQ8SGVscGVyUGFzc1N0eWxlLCBhbnk+ICYge19fcHJvdG9fXzogbnVsbH19ICovXG5jb25zdCBIZWxwZXJUYWJsZT17XG5fX3Byb3RvX186bnVsbCxcbmNvcHlBcnJheTp1bmRlZmluZWQsXG5jb3B5UmVjb3JkOnVuZGVmaW5lZCxcbnRhZ2dlZDp1bmRlZmluZWQsXG5yZW1vdGFibGU6dW5kZWZpbmVkLFxuZXJyb3I6dW5kZWZpbmVkfTtcblxuZm9yKGNvbnN0IGhlbHBlciBvZiBwYXNzU3R5bGVIZWxwZXJzKXtcbmNvbnN0e3N0eWxlTmFtZX09aGVscGVyO1xuYXNzZXJ0KHN0eWxlTmFtZSBpbiBIZWxwZXJUYWJsZSxYIGBVbnJlY29nbml6ZWQgaGVscGVyOiAke3Eoc3R5bGVOYW1lKX1gKTtcbmFzc2VydC5lcXVhbChcbkhlbHBlclRhYmxlW3N0eWxlTmFtZV0sXG51bmRlZmluZWQsXG5YIGBjb25mbGljdGluZyBoZWxwZXJzIGZvciAke3Eoc3R5bGVOYW1lKX1gKTtcblxuSGVscGVyVGFibGVbc3R5bGVOYW1lXT1oZWxwZXI7XG4gfVxuZm9yKGNvbnN0IHN0eWxlTmFtZSBvZiBvd25LZXlzKEhlbHBlclRhYmxlKSl7XG5IZWxwZXJUYWJsZVtzdHlsZU5hbWVdIT09dW5kZWZpbmVkfHxcbmFzc2VydC5mYWlsKFggYG1pc3NpbmcgaGVscGVyIGZvciAke3Eoc3R5bGVOYW1lKX1gKTtcbiB9XG5cbnJldHVybiBoYXJkZW4oSGVscGVyVGFibGUpO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzU3R5bGVIZWxwZXJbXX0gcGFzc1N0eWxlSGVscGVycyBUaGUgcGFzc1N0eWxlSGVscGVycyB0byByZWdpc3RlcixcbiAqIGluIHByaW9yaXR5IG9yZGVyLlxuICogTk9URSBUaGVzZSBtdXN0IGFsbCBiZSBcInRydXN0ZWRcIixcbiAqIGNvbXBsZXRlLCBhbmQgbm9uLWNvbGxpZGluZy4gYG1ha2VQYXNzU3R5bGVPZmAgbWF5ICphc3N1bWUqIHRoYXQgZWFjaCBoZWxwZXJcbiAqIGRvZXMgd2hhdCBpdCBpcyBzdXBwb3NlZCB0byBkby4gYG1ha2VQYXNzU3R5bGVPZmAgaXMgbm90IHRyeWluZyB0byBkZWZlbmRcbiAqIGl0c2VsZiBhZ2FpbnN0IG1hbGljaW91cyBoZWxwZXJzLCB0aG91Z2ggaXQgZG9lcyBkZWZlbmQgYWdhaW5zdCBzb21lXG4gKiBhY2NpZGVudHMuXG4gKiBAcmV0dXJucyB7UGFzc1N0eWxlT2Z9XG4gKi9cbmNvbnN0IG1ha2VQYXNzU3R5bGVPZj0ocGFzc1N0eWxlSGVscGVycyk9PntcbmNvbnN0IEhlbHBlclRhYmxlPW1ha2VIZWxwZXJUYWJsZShwYXNzU3R5bGVIZWxwZXJzKTtcbmNvbnN0IHJlbW90YWJsZUhlbHBlcj1IZWxwZXJUYWJsZS5yZW1vdGFibGU7XG5cbi8qKlxuICogUHVyZWx5IGZvciBwZXJmb3JtYW5jZS4gSG93ZXZlciBpdCBpcyBtdXRhYmxlIHN0YXRpYyBzdGF0ZSwgYW5kXG4gKiBpdCBkb2VzIGhhdmUgc29tZSBvYnNlcnZhYmlsaXR5IG9uIHByb3hpZXMuIFRPRE8gbmVlZCB0byBhc3Nlc3NcbiAqIHdoZXRoZXIgdGhpcyBjcmVhdGVzIGEgc3RhdGljIGNvbW11bmljYXRpb25zIGNoYW5uZWwuXG4gKlxuICogcGFzc1N0eWxlT2YgZG9lcyBhIGZ1bGwgcmVjdXJzaXZlIHdhbGsgb2YgcGFzcy1ieS1jb3B5XG4gKiBzdHJ1Y3R1cmVzLCBpbiBvcmRlciB0byB2YWxpZGF0ZSB0aGF0IHRoZXkgYXJlIGFjeWNsaWMuIEluIGFkZGl0aW9uXG4gKiBpdCBpcyB1c2VkIGJ5IG90aGVyIGFsZ29yaXRobXMgdG8gcmVjdXJzaXZlbHkgd2FsayB0aGVzZSBwYXNzLWJ5LWNvcHlcbiAqIHN0cnVjdHVyZXMsIHNvIHdpdGhvdXQgdGhpcyBjYWNoZSwgdGhlc2UgYWxnb3JpdGhtcyBjb3VsZCBiZVxuICogTyhOKioyKSBvciB3b3JzZS5cbiAqXG4gKiBAdHlwZSB7V2Vha01hcDxQYXNzYWJsZSwgUGFzc1N0eWxlPn1cbiAqL1xuY29uc3QgcGFzc1N0eWxlTWVtbz1uZXcgV2Vha01hcCgpO1xuXG4vKipcbiAqIEB0eXBlIHtQYXNzU3R5bGVPZn1cbiAqL1xuY29uc3QgcGFzc1N0eWxlT2Y9KHBhc3NhYmxlKT0+e1xuLyogRXZlbiB3aGVuIGEgV2Vha1NldCBpcyBjb3JyZWN0LCB3aGVuIHRoZSBzZXQgaGFzIGEgc2hvcnRlciBsaWZldGltZSovXG4vKiB0aGFuIGl0cyBrZXlzLCB3ZSBwcmVmZXIgYSBTZXQgZHVlIHRvIGV4cGVjdGVkIGltcGxlbWVudGF0aW9uKi9cbi8qIHRyYWRlb2Zmcy4qL1xuY29uc3QgaW5Qcm9ncmVzcz1uZXcgU2V0KCk7XG5cbi8qKlxuICogQHR5cGUge1Bhc3NTdHlsZU9mfVxuICovXG5jb25zdCBwYXNzU3R5bGVPZlJlY3VyPShpbm5lcik9PntcbmNvbnN0IGlubmVySXNPYmplY3Q9aXNPYmplY3QoaW5uZXIpO1xuaWYoaW5uZXJJc09iamVjdCl7XG5pZihwYXNzU3R5bGVNZW1vLmhhcyhpbm5lcikpe1xuLyogQHRzLWlnbm9yZSBUeXBlU2NyaXB0IGRvZXNuJ3Qga25vdyB0aGF0IGBnZXRgIGFmdGVyIGBoYXNgIGlzIHNhZmUqL1xucmV0dXJuIHBhc3NTdHlsZU1lbW8uZ2V0KGlubmVyKTtcbiB9XG4haW5Qcm9ncmVzcy5oYXMoaW5uZXIpfHxcbmFzc2VydC5mYWlsKFggYFBhc3MtYnktY29weSBkYXRhIGNhbm5vdCBiZSBjeWNsaWMgJHtpbm5lcn1gKTtcbmluUHJvZ3Jlc3MuYWRkKGlubmVyKTtcbiB9XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mSW50ZXJuYWwoaW5uZXIpO1xuaWYoaW5uZXJJc09iamVjdCl7XG5wYXNzU3R5bGVNZW1vLnNldChpbm5lcixwYXNzU3R5bGUpO1xuaW5Qcm9ncmVzcy5kZWxldGUoaW5uZXIpO1xuIH1cbnJldHVybiBwYXNzU3R5bGU7XG4gfTtcblxuLyoqXG4gKiBAdHlwZSB7UGFzc1N0eWxlT2Z9XG4gKi9cbmNvbnN0IHBhc3NTdHlsZU9mSW50ZXJuYWw9KGlubmVyKT0+e1xuY29uc3QgdHlwZXN0cj10eXBlb2YgaW5uZXI7XG5zd2l0Y2godHlwZXN0cil7XG5jYXNlJ3VuZGVmaW5lZCc6XG5jYXNlJ3N0cmluZyc6XG5jYXNlJ2Jvb2xlYW4nOlxuY2FzZSdudW1iZXInOlxuY2FzZSdiaWdpbnQnOntcbnJldHVybiB0eXBlc3RyO1xuIH1cbmNhc2Unc3ltYm9sJzp7XG5hc3NlcnRQYXNzYWJsZVN5bWJvbChpbm5lcik7XG5yZXR1cm4nc3ltYm9sJztcbiB9XG5jYXNlJ29iamVjdCc6e1xuaWYoaW5uZXI9PT1udWxsKXtcbnJldHVybidudWxsJztcbiB9XG5pc0Zyb3plbihpbm5lcil8fFxuYXNzZXJ0LmZhaWwoXG5YIGBDYW5ub3QgcGFzcyBub24tZnJvemVuIG9iamVjdHMgbGlrZSAke2lubmVyfS4gVXNlIGhhcmRlbigpYCk7XG5cbmlmKGlzUHJvbWlzZShpbm5lcikpe1xuYXNzZXJ0U2FmZVByb21pc2UoaW5uZXIpO1xucmV0dXJuJ3Byb21pc2UnO1xuIH1cbnR5cGVvZiBpbm5lci50aGVuIT09J2Z1bmN0aW9uJ3x8XG5hc3NlcnQuZmFpbChYIGBDYW5ub3QgcGFzcyBub24tcHJvbWlzZSB0aGVuYWJsZXNgKTtcbmNvbnN0IHBhc3NTdHlsZVRhZz1pbm5lcltQQVNTX1NUWUxFXTtcbmlmKHBhc3NTdHlsZVRhZyE9PXVuZGVmaW5lZCl7XG5hc3NlcnQudHlwZW9mKHBhc3NTdHlsZVRhZywnc3RyaW5nJyk7XG5jb25zdCBoZWxwZXI9SGVscGVyVGFibGVbcGFzc1N0eWxlVGFnXTtcbmhlbHBlciE9PXVuZGVmaW5lZHx8XG5hc3NlcnQuZmFpbChYIGBVbnJlY29nbml6ZWQgUGFzc1N0eWxlOiAke3EocGFzc1N0eWxlVGFnKX1gKTtcbmhlbHBlci5hc3NlcnRWYWxpZChpbm5lcixwYXNzU3R5bGVPZlJlY3VyKTtcbnJldHVybiAoLyoqIEB0eXBlIHtQYXNzU3R5bGV9ICovcGFzc1N0eWxlVGFnKTtcbiB9XG5mb3IoY29uc3QgaGVscGVyIG9mIHBhc3NTdHlsZUhlbHBlcnMpe1xuaWYoaGVscGVyLmNhbkJlVmFsaWQoaW5uZXIsKHgpPT54KSl7XG5oZWxwZXIuYXNzZXJ0VmFsaWQoaW5uZXIscGFzc1N0eWxlT2ZSZWN1cik7XG5yZXR1cm4gaGVscGVyLnN0eWxlTmFtZTtcbiB9XG4gfVxucmVtb3RhYmxlSGVscGVyLmFzc2VydFZhbGlkKGlubmVyLHBhc3NTdHlsZU9mUmVjdXIpO1xucmV0dXJuJ3JlbW90YWJsZSc7XG4gfVxuY2FzZSdmdW5jdGlvbic6e1xuaXNGcm96ZW4oaW5uZXIpfHxcbmFzc2VydC5mYWlsKFxuWCBgQ2Fubm90IHBhc3Mgbm9uLWZyb3plbiBvYmplY3RzIGxpa2UgJHtpbm5lcn0uIFVzZSBoYXJkZW4oKWApO1xuXG50eXBlb2YgaW5uZXIudGhlbiE9PSdmdW5jdGlvbid8fFxuYXNzZXJ0LmZhaWwoWCBgQ2Fubm90IHBhc3Mgbm9uLXByb21pc2UgdGhlbmFibGVzYCk7XG5yZW1vdGFibGVIZWxwZXIuYXNzZXJ0VmFsaWQoaW5uZXIscGFzc1N0eWxlT2ZSZWN1cik7XG5yZXR1cm4ncmVtb3RhYmxlJztcbiB9XG5kZWZhdWx0OntcbmFzc2VydC5mYWlsKFggYFVucmVjb2duaXplZCB0eXBlb2YgJHtxKHR5cGVzdHIpfWAsVHlwZUVycm9yKTtcbiB9fVxuXG4gfTtcblxucmV0dXJuIHBhc3NTdHlsZU9mUmVjdXIocGFzc2FibGUpO1xuIH07XG5yZXR1cm4gaGFyZGVuKHBhc3NTdHlsZU9mKTtcbiB9O1xuXG5jb25zdCAgICAgICAgcGFzc1N0eWxlT2Y9bWFrZVBhc3NTdHlsZU9mKFtcbkNvcHlBcnJheUhlbHBlcixcbkNvcHlSZWNvcmRIZWxwZXIsXG5UYWdnZWRIZWxwZXIsXG5SZW1vdGFibGVIZWxwZXIsXG5FcnJvckhlbHBlcl0pOyRo4oCNX29uY2UucGFzc1N0eWxlT2YocGFzc1N0eWxlT2YpO1xuXG5cbmNvbnN0ICAgICAgICBhc3NlcnRQYXNzYWJsZT0odmFsKT0+e1xucGFzc1N0eWxlT2YodmFsKTsvKiB0aHJvd3MgaWYgdmFsIGlzIG5vdCBhIHBhc3NhYmxlKi9cbiB9OyRo4oCNX29uY2UuYXNzZXJ0UGFzc2FibGUoYXNzZXJ0UGFzc2FibGUpO1xuaGFyZGVuKGFzc2VydFBhc3NhYmxlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwYXNzU3R5bGVPZiI6WyJwYXNzU3R5bGVPZiJdLCJhc3NlcnRQYXNzYWJsZSI6WyJhc3NlcnRQYXNzYWJsZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABJlAh+IA0AACANAAAmAAAAQGVuZG8vbWFyc2hhbC12MC43LjUvc3JjL3R5cGVHdWFyZHMuanN7ImltcG9ydHMiOlsiLi9wYXNzU3R5bGVPZi5qcyJdLCJleHBvcnRzIjpbImFzc2VydENvcHlBcnJheSIsImFzc2VydFJlY29yZCIsImFzc2VydFJlbW90YWJsZSIsImlzQ29weUFycmF5IiwiaXNSZWNvcmQiLCJpc1JlbW90YWJsZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBwYXNzU3R5bGVPZjskaOKAjV9pbXBvcnRzKFtbXCIuL3Bhc3NTdHlsZU9mLmpzXCIsIFtbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlBhc3NhYmxlfSBQYXNzYWJsZSAqL1xuLyoqIEB0ZW1wbGF0ZSBUIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQ29weUFycmF5PFQ+fSBDb3B5QXJyYXkgKi9cbi8qKiBAdGVtcGxhdGUgVCBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkNvcHlSZWNvcmQ8VD59IENvcHlSZWNvcmQgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlJlbW90YWJsZX0gUmVtb3RhYmxlICovXG5cbmNvbnN0e2RldGFpbHM6WCxxdW90ZTpxfT1hc3NlcnQ7XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciB0aGUgYXJndW1lbnQgaXMgYSBwYXNzLWJ5LWNvcHkgYXJyYXksIEFLQSBhIFwiY29weUFycmF5XCJcbiAqIGluIEBlbmRvL21hcnNoYWwgdGVybXNcbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBhcnJheVxuICogQHJldHVybnMge2FycmF5IGlzIENvcHlBcnJheTxhbnk+fVxuICovXG5jb25zdCBpc0NvcHlBcnJheT0oYXJyYXkpPT5wYXNzU3R5bGVPZihhcnJheSk9PT0nY29weUFycmF5JzskaOKAjV9vbmNlLmlzQ29weUFycmF5KGlzQ29weUFycmF5KTtcbmhhcmRlbihpc0NvcHlBcnJheSk7XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciB0aGUgYXJndW1lbnQgaXMgYSBwYXNzLWJ5LWNvcHkgcmVjb3JkLCBBS0EgYVxuICogXCJjb3B5UmVjb3JkXCIgaW4gQGVuZG8vbWFyc2hhbCB0ZXJtc1xuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHJlY29yZFxuICogQHJldHVybnMge3JlY29yZCBpcyBDb3B5UmVjb3JkPGFueT59XG4gKi9cbmNvbnN0IGlzUmVjb3JkPShyZWNvcmQpPT5wYXNzU3R5bGVPZihyZWNvcmQpPT09J2NvcHlSZWNvcmQnOyRo4oCNX29uY2UuaXNSZWNvcmQoaXNSZWNvcmQpO1xuaGFyZGVuKGlzUmVjb3JkKTtcblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIHRoZSBhcmd1bWVudCBpcyBhIHJlbW90YWJsZS5cbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSByZW1vdGFibGVcbiAqIEByZXR1cm5zIHtyZW1vdGFibGUgaXMgUmVtb3RhYmxlfVxuICovXG5jb25zdCBpc1JlbW90YWJsZT0ocmVtb3RhYmxlKT0+cGFzc1N0eWxlT2YocmVtb3RhYmxlKT09PSdyZW1vdGFibGUnOyRo4oCNX29uY2UuaXNSZW1vdGFibGUoaXNSZW1vdGFibGUpO1xuaGFyZGVuKGlzUmVtb3RhYmxlKTtcblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0QXJyYXlcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGFycmF5XG4gKiBAcGFyYW0ge3N0cmluZz19IG9wdE5hbWVPZkFycmF5XG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBhcnJheSBpcyBDb3B5QXJyYXk8YW55Pn1cbiAqL1xuXG4vKiogQHR5cGUge0Fzc2VydEFycmF5fSAqL1xuY29uc3QgYXNzZXJ0Q29weUFycmF5PShhcnJheSxvcHROYW1lT2ZBcnJheT0nQWxsZWdlZCBhcnJheScpPT57XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YoYXJyYXkpO1xuYXNzZXJ0KFxucGFzc1N0eWxlPT09J2NvcHlBcnJheScsXG5YIGAke3Eob3B0TmFtZU9mQXJyYXkpfSAke2FycmF5fSBtdXN0IGJlIGEgcGFzcy1ieS1jb3B5IGFycmF5LCBub3QgJHtxKFxucGFzc1N0eWxlKVxuIH1gKTtcblxuIH07JGjigI1fb25jZS5hc3NlcnRDb3B5QXJyYXkoYXNzZXJ0Q29weUFycmF5KTtcbmhhcmRlbihhc3NlcnRDb3B5QXJyYXkpO1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRSZWNvcmRcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHJlY29yZFxuICogQHBhcmFtIHtzdHJpbmc9fSBvcHROYW1lT2ZSZWNvcmRcbiAqIEByZXR1cm5zIHthc3NlcnRzIHJlY29yZCBpcyBDb3B5UmVjb3JkPGFueT59XG4gKi9cblxuLyoqIEB0eXBlIHtBc3NlcnRSZWNvcmR9ICovXG5jb25zdCBhc3NlcnRSZWNvcmQ9KHJlY29yZCxvcHROYW1lT2ZSZWNvcmQ9J0FsbGVnZWQgcmVjb3JkJyk9PntcbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihyZWNvcmQpO1xuYXNzZXJ0KFxucGFzc1N0eWxlPT09J2NvcHlSZWNvcmQnLFxuWCBgJHtxKG9wdE5hbWVPZlJlY29yZCl9ICR7cmVjb3JkfSBtdXN0IGJlIGEgcGFzcy1ieS1jb3B5IHJlY29yZCwgbm90ICR7cShcbnBhc3NTdHlsZSlcbiB9YCk7XG5cbiB9OyRo4oCNX29uY2UuYXNzZXJ0UmVjb3JkKGFzc2VydFJlY29yZCk7XG5oYXJkZW4oYXNzZXJ0UmVjb3JkKTtcblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0UmVtb3RhYmxlXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSByZW1vdGFibGVcbiAqIEBwYXJhbSB7c3RyaW5nPX0gb3B0TmFtZU9mUmVtb3RhYmxlXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyByZW1vdGFibGUgaXMgUmVtb3RhYmxlfVxuICovXG5cbi8qKiBAdHlwZSB7QXNzZXJ0UmVtb3RhYmxlfSAqL1xuY29uc3QgYXNzZXJ0UmVtb3RhYmxlPShcbnJlbW90YWJsZSxcbm9wdE5hbWVPZlJlbW90YWJsZT0nQWxsZWdlZCByZW1vdGFibGUnKT0+XG57XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YocmVtb3RhYmxlKTtcbmFzc2VydChcbnBhc3NTdHlsZT09PSdyZW1vdGFibGUnLFxuWCBgJHtxKG9wdE5hbWVPZlJlbW90YWJsZSl9ICR7cmVtb3RhYmxlfSBtdXN0IGJlIGEgcmVtb3RhYmxlLCBub3QgJHtxKFxucGFzc1N0eWxlKVxuIH1gKTtcblxuIH07JGjigI1fb25jZS5hc3NlcnRSZW1vdGFibGUoYXNzZXJ0UmVtb3RhYmxlKTtcbmhhcmRlbihhc3NlcnRSZW1vdGFibGUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzQ29weUFycmF5IjpbImlzQ29weUFycmF5Il0sImlzUmVjb3JkIjpbImlzUmVjb3JkIl0sImlzUmVtb3RhYmxlIjpbImlzUmVtb3RhYmxlIl0sImFzc2VydENvcHlBcnJheSI6WyJhc3NlcnRDb3B5QXJyYXkiXSwiYXNzZXJ0UmVjb3JkIjpbImFzc2VydFJlY29yZCJdLCJhc3NlcnRSZW1vdGFibGUiOlsiYXNzZXJ0UmVtb3RhYmxlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALtXDvcfAQAAHwEAACEAAABAZW5kby9tYXJzaGFsLXYwLjcuNS9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA/woqT7oLAAC6CwAAHgAAAEBlbmRvL25hdC12NC4xLjIwL3NyYy9pbmRleC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiTmF0IiwiaXNOYXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoaXNOYXQsICduYW1lJywge3ZhbHVlOiBcImlzTmF0XCJ9KTskaOKAjV9vbmNlLmlzTmF0KGlzTmF0KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoTmF0LCAnbmFtZScsIHt2YWx1ZTogXCJOYXRcIn0pOyRo4oCNX29uY2UuTmF0KE5hdCk7ICAgLyogQ29weXJpZ2h0IChDKSAyMDExIEdvb2dsZSBJbmMuKi9cbi8qIENvcHlyaWdodCAoQykgMjAxOCBBZ29yaWMqL1xuLyoqL1xuLyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsqL1xuLyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiovXG4vKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQqL1xuLyoqL1xuLyogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKi9cbi8qKi9cbi8qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUqL1xuLyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLCovXG4vKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4qL1xuLyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCovXG4vKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4qL1xuXG4vKiBAdHMtY2hlY2sqL1xuXG4vKipcbiAqIElzIGBhbGxlZ2VkTnVtYCBhIG51bWJlciBpbiB0aGUgW2NvbnRpZ3VvdXMgcmFuZ2Ugb2YgZXhhY3RseSBhbmRcbiAqIHVuYW1iaWd1b3VzbHlcbiAqIHJlcHJlc2VudGFibGVdKGh0dHBzOi8vZXNkaXNjdXNzLm9yZy90b3BpYy9tb3JlLW51bWVyaWMtY29uc3RhbnRzLXBsZWFzZS1lc3BlY2lhbGx5LWVwc2lsb24jY29udGVudC0xNClcbiAqICBuYXR1cmFsIG51bWJlcnMgKG5vbi1uZWdhdGl2ZSBpbnRlZ2Vycyk/XG4gKlxuICogVG8gcXVhbGlmeSBgYWxsZWdlZE51bWAgbXVzdCBlaXRoZXIgYmUgYVxuICogbm9uLW5lZ2F0aXZlIGBiaWdpbnRgLCBvciBhIG5vbi1uZWdhdGl2ZSBgbnVtYmVyYCByZXByZXNlbnRpbmcgYW4gaW50ZWdlclxuICogd2l0aGluIHJhbmdlIG9mIFtpbnRlZ2VycyBzYWZlbHkgcmVwcmVzZW50YWJsZSBpblxuICogZmxvYXRpbmcgcG9pbnRdKGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbnVtYmVyLmlzc2FmZWludGVnZXIpLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gYWxsZWdlZE51bVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzTmF0KGFsbGVnZWROdW0pe1xuaWYodHlwZW9mIGFsbGVnZWROdW09PT0nYmlnaW50Jyl7XG5yZXR1cm4gYWxsZWdlZE51bT49MDtcbiB9XG5pZih0eXBlb2YgYWxsZWdlZE51bSE9PSdudW1iZXInKXtcbnJldHVybiBmYWxzZTtcbiB9XG5cbnJldHVybiBOdW1iZXIuaXNTYWZlSW50ZWdlcihhbGxlZ2VkTnVtKSYmYWxsZWdlZE51bT49MDtcbiB9XG5cbi8qKlxuICogSWYgYGFsbGVnZWROdW1iZXJgIHBhc3NlcyB0aGUgYGlzTmF0YCB0ZXN0LCB0aGVuIHJldHVybiBpdCBhcyBhIGJpZ2ludC5cbiAqIE90aGVyd2lzZSB0aHJvdyBhbiBhcHByb3ByaWF0ZSBlcnJvci5cbiAqXG4gKiBJZiBgYWxsZWdlZE51bWAgaXMgbmVpdGhlciBhIGJpZ2ludCBub3IgYSBudW1iZXIsIGBOYXRgIHRocm93cyBhIGBUeXBlRXJyb3JgLlxuICogT3RoZXJ3aXNlLCBpZiBpdCBpcyBub3QgYSBbc2FmZWx5XG4gKiByZXByZXNlbnRhYmxlXShodHRwczovL2VzZGlzY3Vzcy5vcmcvdG9waWMvbW9yZS1udW1lcmljLWNvbnN0YW50cy1wbGVhc2UtZXNwZWNpYWxseS1lcHNpbG9uI2NvbnRlbnQtMTQpXG4gKiBub24tbmVnYXRpdmUgaW50ZWdlciwgYE5hdGAgdGhyb3dzIGEgYFJhbmdlRXJyb3JgLlxuICogT3RoZXJ3aXNlLCBpdCBpcyBjb252ZXJ0ZWQgdG8gYSBiaWdpbnQgaWYgbmVjZXNzYXJ5IGFuZCByZXR1cm5lZC5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IGFsbGVnZWROdW1cbiAqIEByZXR1cm5zIHtiaWdpbnR9XG4gKi9cbmZ1bmN0aW9uIE5hdChhbGxlZ2VkTnVtKXtcbmlmKHR5cGVvZiBhbGxlZ2VkTnVtPT09J2JpZ2ludCcpe1xuaWYoYWxsZWdlZE51bTwwKXtcbnRocm93IG5ldyBSYW5nZUVycm9yKCBgJHthbGxlZ2VkTnVtfSBpcyBuZWdhdGl2ZWApO1xuIH1cbnJldHVybiBhbGxlZ2VkTnVtO1xuIH1cblxuaWYodHlwZW9mIGFsbGVnZWROdW09PT0nbnVtYmVyJyl7XG5pZighTnVtYmVyLmlzU2FmZUludGVnZXIoYWxsZWdlZE51bSkpe1xudGhyb3cgbmV3IFJhbmdlRXJyb3IoIGAke2FsbGVnZWROdW19IG5vdCBhIHNhZmUgaW50ZWdlcmApO1xuIH1cbmlmKGFsbGVnZWROdW08MCl7XG50aHJvdyBuZXcgUmFuZ2VFcnJvciggYCR7YWxsZWdlZE51bX0gaXMgbmVnYXRpdmVgKTtcbiB9XG5yZXR1cm4gQmlnSW50KGFsbGVnZWROdW0pO1xuIH1cblxudGhyb3cgbmV3IFR5cGVFcnJvcihcbiBgJHthbGxlZ2VkTnVtfSBpcyBhICR7dHlwZW9mIGFsbGVnZWROdW19IGJ1dCBtdXN0IGJlIGEgYmlnaW50IG9yIGEgbnVtYmVyYCk7XG5cbiB9XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNOYXQiOlsiaXNOYXQiXSwiTmF0IjpbIk5hdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC2AMyrXQkAAF0JAAAiAAAAQGVuZG8vcHJvbWlzZS1raXQtdjAuMi40OS9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy9pcy1wcm9taXNlLmpzIiwiLi9zcmMvbWVtby1yYWNlLmpzIiwiLi9zcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanMiLCIuL3NyYy90eXBlcy5qcyJdLCJleHBvcnRzIjpbIm1ha2VQcm9taXNlS2l0IiwicmFjZVByb21pc2VzIl0sInJlZXhwb3J0cyI6WyIuL3NyYy9pcy1wcm9taXNlLmpzIiwiLi9zcmMvdHlwZXMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgbWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0LG1lbW9SYWNlOyRo4oCNX2ltcG9ydHMoW1tcIi4vc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzXCIsIFtbXCJtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCA9ICRo4oCNX2EpXV1dXSxbXCIuL3NyYy9tZW1vLXJhY2UuanNcIiwgW1tcIm1lbW9SYWNlXCIsIFskaOKAjV9hID0+IChtZW1vUmFjZSA9ICRo4oCNX2EpXV1dXSxbXCIuL3NyYy9pcy1wcm9taXNlLmpzXCIsIFtdXSxbXCIuL3NyYy90eXBlcy5qc1wiLCBbXV1dKTtPYmplY3QuZGVmaW5lUHJvcGVydHkobWFrZVByb21pc2VLaXQsICduYW1lJywge3ZhbHVlOiBcIm1ha2VQcm9taXNlS2l0XCJ9KTskaOKAjV9vbmNlLm1ha2VQcm9taXNlS2l0KG1ha2VQcm9taXNlS2l0KTtPYmplY3QuZGVmaW5lUHJvcGVydHkocmFjZVByb21pc2VzLCAnbmFtZScsIHt2YWx1ZTogXCJyYWNlUHJvbWlzZXNcIn0pOyRo4oCNX29uY2UucmFjZVByb21pc2VzKHJhY2VQcm9taXNlcyk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlIHtQcm9taXNlQ29uc3RydWN0b3J9ICovXG5jb25zdCBCZXN0UGlwZWxpbmFibGVQcm9taXNlPWdsb2JhbFRoaXMuSGFuZGxlZFByb21pc2V8fFByb21pc2U7XG5cbi8qKlxuICogbWFrZVByb21pc2VLaXQoKSBidWlsZHMgYSBQcm9taXNlIG9iamVjdCwgYW5kIHJldHVybnMgYSByZWNvcmRcbiAqIGNvbnRhaW5pbmcgdGhlIHByb21pc2UgaXRzZWxmLCBhcyB3ZWxsIGFzIHNlcGFyYXRlIGZhY2V0cyBmb3IgcmVzb2x2aW5nXG4gKiBhbmQgcmVqZWN0aW5nIGl0LlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcmV0dXJucyB7WGltcG9ydCgnLi9zcmMvdHlwZXMuanMnKS5Qcm9taXNlS2l0PFQ+fVxuICovXG5mdW5jdGlvbiAgICAgICAgbWFrZVByb21pc2VLaXQoKXtcbmNvbnN0e3Jlc29sdmUscmVqZWN0LGV4ZWN1dG9yfT1tYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQoKTtcblxuY29uc3QgcHJvbWlzZT1uZXcgQmVzdFBpcGVsaW5hYmxlUHJvbWlzZShleGVjdXRvcik7XG5cbnJldHVybiBoYXJkZW4oe3Byb21pc2UscmVzb2x2ZSxyZWplY3R9KTtcbiB9XG5oYXJkZW4obWFrZVByb21pc2VLaXQpO1xuXG4vKiBOQjogQW5vdGhlciBpbXBsZW1lbnRhdGlvbiBmb3IgUHJvbWlzZS5yYWNlIHdvdWxkIGJlIHRvIHVzZSB0aGUgcmVsZWFzaW5nIGV4ZWN1dG9yLCovXG4vKiBIb3dldmVyIHdoaWxlIGl0IHdvdWxkIG5vIGxvbmdlciBsZWFrIHRoZSByYWNlZCBwcm9taXNlIG9iamVjdHMgdGhlbXNlbHZlcywgaXQgd291bGQqL1xuLyogc3RpbGwgbGVhayByZWFjdGlvbnMgb24gdGhlIG5vbi1yZXNvbHZlZCBwcm9taXNlcyBjb250ZW5kaW5nIGZvciB0aGUgcmFjZS4qL1xuXG4vKipcbiAqIENyZWF0ZXMgYSBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgb3IgcmVqZWN0ZWQgd2hlbiBhbnkgb2YgdGhlIHByb3ZpZGVkIFByb21pc2VzIGFyZSByZXNvbHZlZFxuICogb3IgcmVqZWN0ZWQuXG4gKlxuICogVW5saWtlIGBQcm9taXNlLnJhY2VgIGl0IGNsZWFucyB1cCBhZnRlciBpdHNlbGYgc28gYSBub24tcmVzb2x2ZWQgdmFsdWUgZG9lc24ndCBob2xkIG9udG9cbiAqIHRoZSByZXN1bHQgcHJvbWlzZS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxUPn0gdmFsdWVzIEFuIGl0ZXJhYmxlIG9mIFByb21pc2VzLlxuICogQHJldHVybnMge1Byb21pc2U8QXdhaXRlZDxUPj59IEEgbmV3IFByb21pc2UuXG4gKi9cbmZ1bmN0aW9uICAgICAgICByYWNlUHJvbWlzZXModmFsdWVzKXtcbnJldHVybiBoYXJkZW4obWVtb1JhY2UuY2FsbChCZXN0UGlwZWxpbmFibGVQcm9taXNlLHZhbHVlcykpO1xuIH1cbmhhcmRlbihyYWNlUHJvbWlzZXMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VQcm9taXNlS2l0IjpbIm1ha2VQcm9taXNlS2l0Il0sInJhY2VQcm9taXNlcyI6WyJyYWNlUHJvbWlzZXMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAVPSFpdwCAADcAgAAKwAAAEBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNDkvc3JjL2lzLXByb21pc2UuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImlzUHJvbWlzZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShpc1Byb21pc2UsICduYW1lJywge3ZhbHVlOiBcImlzUHJvbWlzZVwifSk7JGjigI1fb25jZS5pc1Byb21pc2UoaXNQcm9taXNlKTsgICAvKiBAdHMtY2hlY2sqL1xuXG4vKipcbiAqIERldGVybWluZSBpZiB0aGUgYXJndW1lbnQgaXMgYSBQcm9taXNlLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gbWF5YmVQcm9taXNlIFRoZSB2YWx1ZSB0byBleGFtaW5lXG4gKiBAcmV0dXJucyB7bWF5YmVQcm9taXNlIGlzIFByb21pc2V9IFdoZXRoZXIgaXQgaXMgYSBwcm9taXNlXG4gKi9cbmZ1bmN0aW9uICAgICAgICBpc1Byb21pc2UobWF5YmVQcm9taXNlKXtcbnJldHVybiBQcm9taXNlLnJlc29sdmUobWF5YmVQcm9taXNlKT09PW1heWJlUHJvbWlzZTtcbiB9XG5oYXJkZW4oaXNQcm9taXNlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc1Byb21pc2UiOlsiaXNQcm9taXNlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGB2jU+5EgAAuRIAACoAAABAZW5kby9wcm9taXNlLWtpdC12MC4yLjQ5L3NyYy9tZW1vLXJhY2UuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIm1lbW9SYWNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQHRzLWNoZWNrKi9cbi8qIEluaXRpYWwgdmVyc2lvbiBhdXRob3JlZCBieSBCcmlhbiBLaW06XG5odHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvaXNzdWVzLzE3NDY5I2lzc3VlY29tbWVudC02ODUyMTY3NzdcbiBUaGlzIGlzIGZyZWUgYW5kIHVuZW5jdW1iZXJlZCBzb2Z0d2FyZSByZWxlYXNlZCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluLlxuIEFueW9uZSBpcyBmcmVlIHRvIGNvcHksIG1vZGlmeSwgcHVibGlzaCwgdXNlLCBjb21waWxlLCBzZWxsLCBvclxuZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLCBlaXRoZXIgaW4gc291cmNlIGNvZGUgZm9ybSBvciBhcyBhIGNvbXBpbGVkXG5iaW5hcnksIGZvciBhbnkgcHVycG9zZSwgY29tbWVyY2lhbCBvciBub24tY29tbWVyY2lhbCwgYW5kIGJ5IGFueVxubWVhbnMuXG4gSW4ganVyaXNkaWN0aW9ucyB0aGF0IHJlY29nbml6ZSBjb3B5cmlnaHQgbGF3cywgdGhlIGF1dGhvciBvciBhdXRob3JzXG5vZiB0aGlzIHNvZnR3YXJlIGRlZGljYXRlIGFueSBhbmQgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGVcbnNvZnR3YXJlIHRvIHRoZSBwdWJsaWMgZG9tYWluLiBXZSBtYWtlIHRoaXMgZGVkaWNhdGlvbiBmb3IgdGhlIGJlbmVmaXRcbm9mIHRoZSBwdWJsaWMgYXQgbGFyZ2UgYW5kIHRvIHRoZSBkZXRyaW1lbnQgb2Ygb3VyIGhlaXJzIGFuZFxuc3VjY2Vzc29ycy4gV2UgaW50ZW5kIHRoaXMgZGVkaWNhdGlvbiB0byBiZSBhbiBvdmVydCBhY3Qgb2ZcbnJlbGlucXVpc2htZW50IGluIHBlcnBldHVpdHkgb2YgYWxsIHByZXNlbnQgYW5kIGZ1dHVyZSByaWdodHMgdG8gdGhpc1xuc29mdHdhcmUgdW5kZXIgY29weXJpZ2h0IGxhdy5cbiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELFxuRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG5NRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuXG5JTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUlxuT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsXG5BUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1Jcbk9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cbiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIHJlZmVyIHRvIDxodHRwOi8vdW5saWNlbnNlLm9yZy8+XG4qL1xuXG5cblxuXG5cblxuXG5jb25zdCBpc09iamVjdD0odmFsdWUpPT5PYmplY3QodmFsdWUpPT09dmFsdWU7XG5cbi8qKlxuICogQHRlbXBsYXRlIFtUPWFueV1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IERlZmVycmVkXG4gKiBAcHJvcGVydHkgeyh2YWx1ZT86IFhpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkVSZWY8VD4gKSA9PiB2b2lkfSByZXNvbHZlXG4gKiBAcHJvcGVydHkgeyhlcnI/OiBhbnkgKSA9PiB2b2lkfSByZWplY3RcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsgbmV2ZXJcbiAqICB8IHtzZXR0bGVkOiBmYWxzZSwgZGVmZXJyZWRzOiBTZXQ8RGVmZXJyZWQ+fVxuICogIHwge3NldHRsZWQ6IHRydWUsIGRlZmVycmVkcz86IHVuZGVmaW5lZH1cbiAqIH0gUHJvbWlzZU1lbW9SZWNvcmRcbiAqL1xuXG4vKiBLZXlzIGFyZSB0aGUgdmFsdWVzIHBhc3NlZCB0byByYWNlLCB2YWx1ZXMgYXJlIGEgcmVjb3JkIG9mIGRhdGEgY29udGFpbmluZyBhKi9cbi8qIHNldCBvZiBkZWZlcnJlZHMgYW5kIHdoZXRoZXIgdGhlIHZhbHVlIGhhcyBzZXR0bGVkLiovXG4vKiogQHR5cGUge1dlYWtNYXA8b2JqZWN0LCBQcm9taXNlTWVtb1JlY29yZD59ICovXG5jb25zdCBrbm93blByb21pc2VzPW5ldyBXZWFrTWFwKCk7XG5cbi8qKlxuICogQHBhcmFtIHtQcm9taXNlTWVtb1JlY29yZCB8IHVuZGVmaW5lZH0gcmVjb3JkXG4gKiBAcmV0dXJucyB7U2V0PERlZmVycmVkPn1cbiAqL1xuY29uc3QgbWFya1NldHRsZWQ9KHJlY29yZCk9PntcbmlmKCFyZWNvcmR8fHJlY29yZC5zZXR0bGVkKXtcbnJldHVybiBuZXcgU2V0KCk7XG4gfVxuXG5jb25zdHtkZWZlcnJlZHN9PXJlY29yZDtcbk9iamVjdC5hc3NpZ24ocmVjb3JkLHtcbmRlZmVycmVkczp1bmRlZmluZWQsXG5zZXR0bGVkOnRydWV9KTtcblxuT2JqZWN0LmZyZWV6ZShyZWNvcmQpO1xucmV0dXJuIGRlZmVycmVkcztcbiB9O1xuXG4vKipcbiAqXG4gKiBAcGFyYW0ge2FueX0gdmFsdWVcbiAqIEByZXR1cm5zIHtQcm9taXNlTWVtb1JlY29yZH1cbiAqL1xuY29uc3QgZ2V0TWVtb1JlY29yZD0odmFsdWUpPT57XG5pZighaXNPYmplY3QodmFsdWUpKXtcbi8qIElmIHRoZSBjb250ZW5kZXIgaXMgYSBwcmltaXRpdmUsIGF0dGVtcHRpbmcgdG8gdXNlIGl0IGFzIGEga2V5IGluIHRoZSovXG4vKiB3ZWFrbWFwIHdvdWxkIHRocm93IGFuIGVycm9yLiBMdWNraWx5LCBpdCBpcyBzYWZlIHRvIGNhbGwqL1xuLyogYFByb21pc2UucmVzb2x2ZShjb250ZW5kZXIpLnRoZW5gIG9uIGEgcHJpbWl0aXZlIHZhbHVlIG11bHRpcGxlIHRpbWVzKi9cbi8qIGJlY2F1c2UgdGhlIHByb21pc2UgZnVsZmlsbHMgaW1tZWRpYXRlbHkuIFNvIHdlIGZha2UgYSBzZXR0bGVkIHJlY29yZC4qL1xucmV0dXJuIGhhcmRlbih7c2V0dGxlZDp0cnVlfSk7XG4gfVxuXG5sZXQgcmVjb3JkPWtub3duUHJvbWlzZXMuZ2V0KHZhbHVlKTtcblxuaWYoIXJlY29yZCl7XG5yZWNvcmQ9e2RlZmVycmVkczpuZXcgU2V0KCksc2V0dGxlZDpmYWxzZX07XG5rbm93blByb21pc2VzLnNldCh2YWx1ZSxyZWNvcmQpO1xuLyogVGhpcyBjYWxsIHRvIGB0aGVuYCBoYXBwZW5zIG9uY2UgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgdmFsdWUuKi9cblByb21pc2UucmVzb2x2ZSh2YWx1ZSkudGhlbihcbih2YWwpPT57XG5mb3IoY29uc3R7cmVzb2x2ZX1vZiBtYXJrU2V0dGxlZChyZWNvcmQpKXtcbnJlc29sdmUodmFsKTtcbiB9XG4gfSxcbihlcnIpPT57XG5mb3IoY29uc3R7cmVqZWN0fW9mIG1hcmtTZXR0bGVkKHJlY29yZCkpe1xucmVqZWN0KGVycik7XG4gfVxuIH0pO1xuXG4gfVxucmV0dXJuIHJlY29yZDtcbiB9O1xuXG5jb25zdHtyYWNlfT17XG4vKipcbiAqIENyZWF0ZXMgYSBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgb3IgcmVqZWN0ZWQgd2hlbiBhbnkgb2YgdGhlIHByb3ZpZGVkIFByb21pc2VzIGFyZSByZXNvbHZlZFxuICogb3IgcmVqZWN0ZWQuXG4gKlxuICogVW5saWtlIGBQcm9taXNlLnJhY2VgIGl0IGNsZWFucyB1cCBhZnRlciBpdHNlbGYgc28gYSBub24tcmVzb2x2ZWQgdmFsdWUgZG9lc24ndCBob2xkIG9udG9cbiAqIHRoZSByZXN1bHQgcHJvbWlzZS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHRlbXBsYXRlIHtQcm9taXNlQ29uc3RydWN0b3J9IFtQPVByb21pc2VDb25zdHJ1Y3Rvcl1cbiAqIEB0aGlzIHtQfVxuICogQHBhcmFtIHtJdGVyYWJsZTxUPn0gdmFsdWVzIEFuIGl0ZXJhYmxlIG9mIFByb21pc2VzLlxuICogQHJldHVybnMge1Byb21pc2U8QXdhaXRlZDxUPj59IEEgbmV3IFByb21pc2UuXG4gKi9cbnJhY2UodmFsdWVzKXtcbmxldCBkZWZlcnJlZDtcbi8qKiBAdHlwZSB7VFtdfSAqL1xuY29uc3QgY2FjaGVkVmFsdWVzPVtdO1xuY29uc3QgQz10aGlzO1xuY29uc3QgcmVzdWx0PW5ldyBDKChyZXNvbHZlLHJlamVjdCk9PntcbmRlZmVycmVkPXtyZXNvbHZlLHJlamVjdH07XG5mb3IoY29uc3QgdmFsdWUgb2YgdmFsdWVzKXtcbmNhY2hlZFZhbHVlcy5wdXNoKHZhbHVlKTtcbmNvbnN0e3NldHRsZWQsZGVmZXJyZWRzfT1nZXRNZW1vUmVjb3JkKHZhbHVlKTtcbmlmKHNldHRsZWQpe1xuLyogSWYgdGhlIGNvbnRlbmRlciBpcyBzZXR0bGVkIChpbmNsdWRpbmcgcHJpbWl0aXZlcyksIGl0IGlzIHNhZmUqL1xuLyogdG8gY2FsbCBgUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuYCBvbiBpdC4qL1xuQy5yZXNvbHZlKHZhbHVlKS50aGVuKHJlc29sdmUscmVqZWN0KTtcbiB9ZWxzZXtcbmRlZmVycmVkcy5hZGQoZGVmZXJyZWQpO1xuIH1cbiB9XG4gfSk7XG5cbi8qIFRoZSBmaW5hbGx5IGNhbGxiYWNrIGV4ZWN1dGVzIHdoZW4gYW55IHZhbHVlIHNldHRsZXMsIHByZXZlbnRpbmcgYW55IG9mKi9cbi8qIHRoZSB1bnJlc29sdmVkIHZhbHVlcyBmcm9tIHJldGFpbmluZyBhIHJlZmVyZW5jZSB0byB0aGUgcmVzb2x2ZWQgdmFsdWUuKi9cbnJldHVybiByZXN1bHQuZmluYWxseSgoKT0+e1xuZm9yKGNvbnN0IHZhbHVlIG9mIGNhY2hlZFZhbHVlcyl7XG5jb25zdHtkZWZlcnJlZHN9PWdldE1lbW9SZWNvcmQodmFsdWUpO1xuaWYoZGVmZXJyZWRzKXtcbmRlZmVycmVkcy5kZWxldGUoZGVmZXJyZWQpO1xuIH1cbiB9XG4gfSk7XG4gfX07JGjigI1fb25jZS5yYWNlKHJhY2UpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1lbW9SYWNlIjpbInJhY2UiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAQ4Jx5mYHAABmBwAANQAAAEBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNDkvc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBAdHMtY2hlY2sqL1xuXG4vKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAY2FsbGJhY2sgUHJvbWlzZUV4ZWN1dG9yIFRoZSBwcm9taXNlIGV4ZWN1dG9yXG4gKiBAcGFyYW0geyh2YWx1ZTogWGltcG9ydCgnLi90eXBlcy5qcycpLkVSZWY8VD4pID0+IHZvaWR9IHJlc29sdmVcbiAqIEBwYXJhbSB7KHJlYXNvbjogYW55KSA9PiB2b2lkfSByZWplY3RcbiAqL1xuXG4vKipcbiAqIG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCgpIGJ1aWxkcyByZXNvbHZlL3JlamVjdCBmdW5jdGlvbnMgd2hpY2ggZHJvcCByZWZlcmVuY2VzXG4gKiB0byB0aGUgcmVzb2x2ZS9yZWplY3QgZnVuY3Rpb25zIGdhdGhlcmVkIGZyb20gYW4gZXhlY3V0b3IgdG8gYmUgdXNlZCB3aXRoIGFcbiAqIHByb21pc2UgY29uc3RydWN0b3IuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEByZXR1cm5zIHtQaWNrPFhpbXBvcnQoJy4vdHlwZXMuanMnKS5Qcm9taXNlS2l0PFQ+LCAncmVzb2x2ZScgfCAncmVqZWN0Jz4gJiB7IGV4ZWN1dG9yOiBQcm9taXNlRXhlY3V0b3I8VD59fVxuICovXG5jb25zdCAgICAgICAgbWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0PSgpPT57XG4vKiogQHR5cGUge251bGwgfCB1bmRlZmluZWQgfCAoKHZhbHVlOiBYaW1wb3J0KCcuL3R5cGVzLmpzJykuRVJlZjxUPikgPT4gdm9pZCl9ICovXG5sZXQgaW50ZXJuYWxSZXNvbHZlO1xuLyoqIEB0eXBlIHtudWxsIHwgdW5kZWZpbmVkIHwgKChyZWFzb246IHVua25vd24pID0+IHZvaWQpfSAqL1xubGV0IGludGVybmFsUmVqZWN0O1xuXG4vKiogQHBhcmFtIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuRVJlZjxUPn0gdmFsdWUgKi9cbmNvbnN0IHJlc29sdmU9KHZhbHVlKT0+e1xuaWYoaW50ZXJuYWxSZXNvbHZlKXtcbmludGVybmFsUmVzb2x2ZSh2YWx1ZSk7XG5pbnRlcm5hbFJlc29sdmU9bnVsbDtcbmludGVybmFsUmVqZWN0PW51bGw7XG4gfWVsc2V7XG5hc3NlcnQoaW50ZXJuYWxSZXNvbHZlPT09bnVsbCk7XG4gfVxuIH07XG5cbi8qKiBAcGFyYW0ge3Vua25vd259IHJlYXNvbiAqL1xuY29uc3QgcmVqZWN0PShyZWFzb24pPT57XG5pZihpbnRlcm5hbFJlamVjdCl7XG5pbnRlcm5hbFJlamVjdChyZWFzb24pO1xuaW50ZXJuYWxSZXNvbHZlPW51bGw7XG5pbnRlcm5hbFJlamVjdD1udWxsO1xuIH1lbHNle1xuYXNzZXJ0KGludGVybmFsUmVqZWN0PT09bnVsbCk7XG4gfVxuIH07XG5cbmNvbnN0IGV4ZWN1dG9yPShyZXMscmVqKT0+e1xuYXNzZXJ0KGludGVybmFsUmVzb2x2ZT09PXVuZGVmaW5lZCYmaW50ZXJuYWxSZWplY3Q9PT11bmRlZmluZWQpO1xuaW50ZXJuYWxSZXNvbHZlPXJlcztcbmludGVybmFsUmVqZWN0PXJlajtcbiB9O1xuXG5yZXR1cm4gaGFyZGVuKHtyZXNvbHZlLHJlamVjdCxleGVjdXRvcn0pO1xuIH07JGjigI1fb25jZS5tYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQobWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KTtcbmhhcmRlbihtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCI6WyJtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAu1cO9x8BAAAfAQAAJgAAAEBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNDkvc3JjL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwECHgMKAAAAAAAAAAAA+tWxCZ/8AACf/AAAFAAAAAAAAAAAAAAApIEAAAAAY29tcGFydG1lbnQtbWFwLmpzb25QSwECHgMKAAAAAAAAAAAAIDyfD+cKAADnCgAAIwAAAAAAAAAAAAAApIHR/AAAQGFnb3JpYy9hc3NlcnQtdjAuNS4xL3NyYy9hc3NlcnQuanNQSwECHgMKAAAAAAAAAAAAALbpZesnAADrJwAAIgAAAAAAAAAAAAAApIH5BwEAQGFnb3JpYy9hc3NlcnQtdjAuNS4xL3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAACRxdAuRwEAAEcBAAAgAAAAAAAAAAAAAACkgSQwAQBAYWdvcmljL2VydHAtdjAuMTUuNS9leHBvcnRlZC5qc1BLAQIeAwoAAAAAAAAAAAA/OW00rDgAAKw4AAAmAAAAAAAAAAAAAACkgakxAQBAYWdvcmljL2VydHAtdjAuMTUuNS9zcmMvYW1vdW50TWF0aC5qc1BLAQIeAwoAAAAAAAAAAAAEMbuv9gUAAPYFAAAnAAAAAAAAAAAAAACkgZlqAQBAYWdvcmljL2VydHAtdjAuMTUuNS9zcmMvZGlzcGxheUluZm8uanNQSwECHgMKAAAAAAAAAAAAyb0sONMBAADTAQAAIQAAAAAAAAAAAAAApIHUcAEAQGFnb3JpYy9lcnRwLXYwLjE1LjUvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAGfNn1+hGgAAoRoAACUAAAAAAAAAAAAAAKSB5nIBAEBhZ29yaWMvZXJ0cC12MC4xNS41L3NyYy9pc3N1ZXJLaXQuanNQSwECHgMKAAAAAAAAAAAAVwZ6PnkFAAB5BQAAOgAAAAAAAAAAAAAApIHKjQEAQGFnb3JpYy9lcnRwLXYwLjE1LjUvc3JjL21hdGhIZWxwZXJzL2NvcHlCYWdNYXRoSGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAAAs+ljtjQUAAI0FAAA6AAAAAAAAAAAAAACkgZuTAQBAYWdvcmljL2VydHAtdjAuMTUuNS9zcmMvbWF0aEhlbHBlcnMvY29weVNldE1hdGhIZWxwZXJzLmpzUEsBAh4DCgAAAAAAAAAAAO0vScIJBgAACQYAADYAAAAAAAAAAAAAAKSBgJkBAEBhZ29yaWMvZXJ0cC12MC4xNS41L3NyYy9tYXRoSGVscGVycy9uYXRNYXRoSGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAAALGEQ+cwcAAHMHAAA2AAAAAAAAAAAAAACkgd2fAQBAYWdvcmljL2VydHAtdjAuMTUuNS9zcmMvbWF0aEhlbHBlcnMvc2V0TWF0aEhlbHBlcnMuanNQSwECHgMKAAAAAAAAAAAAg5UWBYUEAACFBAAAIwAAAAAAAAAAAAAApIGkpwEAQGFnb3JpYy9lcnRwLXYwLjE1LjUvc3JjL3BheW1lbnQuanNQSwECHgMKAAAAAAAAAAAAWmMzZ+A8AADgPAAAKQAAAAAAAAAAAAAApIFqrAEAQGFnb3JpYy9lcnRwLXYwLjE1LjUvc3JjL3BheW1lbnRMZWRnZXIuanNQSwECHgMKAAAAAAAAAAAAuURUuO4OAADuDgAAIQAAAAAAAAAAAAAApIGR6QEAQGFnb3JpYy9lcnRwLXYwLjE1LjUvc3JjL3B1cnNlLmpzUEsBAh4DCgAAAAAAAAAAAIjLg7z/BQAA/wUAAC0AAAAAAAAAAAAAAKSBvvgBAEBhZ29yaWMvZXJ0cC12MC4xNS41L3NyYy90cmFuc2llbnROb3RpZmllci5qc1BLAQIeAwoAAAAAAAAAAAAbc+q/dyYAAHcmAAAmAAAAAAAAAAAAAACkgQj/AQBAYWdvcmljL2VydHAtdjAuMTUuNS9zcmMvdHlwZUd1YXJkcy5qc1BLAQIeAwoAAAAAAAAAAACi8pPw30MAAN9DAAAhAAAAAAAAAAAAAACkgcMlAgBAYWdvcmljL2VydHAtdjAuMTUuNS9zcmMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAAatSWNaAgAACgIAAAMgAAAAAAAAAAAAAApIHhaQIAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjkuMy9zcmMvYmluYXJ5Vm90ZUNvdW50ZXIuanNQSwECHgMKAAAAAAAAAAAAnYlGVAgDAAAIAwAALAAAAAAAAAAAAAAApIHRigIAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjkuMy9zcmMvY2xvc2luZ1J1bGUuanNQSwECHgMKAAAAAAAAAAAAfAQcFKgDAACoAwAAKgAAAAAAAAAAAAAApIEjjgIAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjkuMy9zcmMvY29uc3RhbnRzLmpzUEsBAh4DCgAAAAAAAAAAAN+qMXoZCQAAGQkAAD4AAAAAAAAAAAAAAKSBE5ICAEBhZ29yaWMvZ292ZXJuYW5jZS12MC45LjMvc3JjL2NvbnRyYWN0R292ZXJuYW5jZS9hc3NlcnRpb25zLmpzUEsBAh4DCgAAAAAAAAAAAH8pKUSoEQAAqBEAAD0AAAAAAAAAAAAAAKSBiJsCAEBhZ29yaWMvZ292ZXJuYW5jZS12MC45LjMvc3JjL2NvbnRyYWN0R292ZXJuYW5jZS9nb3Zlcm5BcGkuanNQSwECHgMKAAAAAAAAAAAAnT+KptEPAADRDwAAQAAAAAAAAAAAAAAApIGLrQIAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjkuMy9zcmMvY29udHJhY3RHb3Zlcm5hbmNlL2dvdmVybkZpbHRlci5qc1BLAQIeAwoAAAAAAAAAAACHPvd+URUAAFEVAAA/AAAAAAAAAAAAAACkgbq9AgBAYWdvcmljL2dvdmVybmFuY2UtdjAuOS4zL3NyYy9jb250cmFjdEdvdmVybmFuY2UvZ292ZXJuUGFyYW0uanNQSwECHgMKAAAAAAAAAAAA4s7A+Po4AAD6OAAAQAAAAAAAAAAAAAAApIFo0wIAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjkuMy9zcmMvY29udHJhY3RHb3Zlcm5hbmNlL3BhcmFtTWFuYWdlci5qc1BLAQIeAwoAAAAAAAAAAACbGRK7BxUAAAcVAABFAAAAAAAAAAAAAACkgcAMAwBAYWdvcmljL2dvdmVybmFuY2UtdjAuOS4zL3NyYy9jb250cmFjdEdvdmVybmFuY2UvdHlwZWRQYXJhbU1hbmFnZXIuanNQSwECHgMKAAAAAAAAAAAALkHoXz8sAAA/LAAAMQAAAAAAAAAAAAAApIEqIgMAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjkuMy9zcmMvY29udHJhY3RHb3Zlcm5vci5qc1BLAQIeAwoAAAAAAAAAAACxUvEaeyQAAHskAAAvAAAAAAAAAAAAAACkgbhOAwBAYWdvcmljL2dvdmVybmFuY2UtdjAuOS4zL3NyYy9jb250cmFjdEhlbHBlci5qc1BLAQIeAwoAAAAAAAAAAAC3bRQTbQ8AAG0PAAAmAAAAAAAAAAAAAACkgYBzAwBAYWdvcmljL2dvdmVybmFuY2UtdjAuOS4zL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAAD9w6DRow8AAKMPAAApAAAAAAAAAAAAAACkgTGDAwBAYWdvcmljL2dvdmVybmFuY2UtdjAuOS4zL3NyYy9xdWVzdGlvbi5qc1BLAQIeAwoAAAAAAAAAAAAbhfUz9DQAAPQ0AAArAAAAAAAAAAAAAACkgRuTAwBAYWdvcmljL2dvdmVybmFuY2UtdjAuOS4zL3NyYy90eXBlR3VhcmRzLmpzUEsBAh4DCgAAAAAAAAAAALNrCywVVwAAFVcAACYAAAAAAAAAAAAAAKSBWMgDAEBhZ29yaWMvZ292ZXJuYW5jZS12MC45LjMvc3JjL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAAGou/DBlCgAAZQoAACsAAAAAAAAAAAAAAKSBsR8EAEBhZ29yaWMvZ292ZXJuYW5jZS12MC45LjMvc3JjL3ZhbGlkYXRvcnMuanNQSwECHgMKAAAAAAAAAAAAPo5QMQsPAAALDwAANAAAAAAAAAAAAAAApIFfKgQAQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4zL3NyYy9pbnRlcmNoYWluUG9vbC5qc1BLAQIeAwoAAAAAAAAAAABRO4fxZAkAAGQJAAA6AAAAAAAAAAAAAACkgbw5BABAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjMvc3JjL3Zwb29sLXh5ay1hbW0vcGFyYW1zLmpzUEsBAh4DCgAAAAAAAAAAAH44EWU6BAAAOgQAACUAAAAAAAAAAAAAAKSBeEMEAEBhZ29yaWMvaW50ZXJuYWwtdjAuMi4xL3NyYy9jb25maWcuanNQSwECHgMKAAAAAAAAAAAAr/QmyH0BAAB9AQAAJAAAAAAAAAAAAAAApIH1RwQAQGFnb3JpYy9pbnRlcm5hbC12MC4yLjEvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAANQR7m4MAAAuDAAACQAAAAAAAAAAAAAAKSBtEkEAEBhZ29yaWMvaW50ZXJuYWwtdjAuMi4xL3NyYy91dGlscy5qc1BLAQIeAwoAAAAAAAAAAABS8904iAsAAIgLAAAiAAAAAAAAAAAAAACkga56BABAYWdvcmljL25hdC12NC4xLjAvZGlzdC9uYXQuZXNtLmpzUEsBAh4DCgAAAAAAAAAAAJHF0C5HAQAARwEAACMAAAAAAAAAAAAAAKSBdoYEAEBhZ29yaWMvbm90aWZpZXItdjAuNS4xL2V4cG9ydGVkLmpzUEsBAh4DCgAAAAAAAAAAAKbOTsxYHQAAWB0AADMAAAAAAAAAAAAAAKSB/ocEAEBhZ29yaWMvbm90aWZpZXItdjAuNS4xL3NyYy9hc3luY0l0ZXJhYmxlQWRhcHRvci5qc1BLAQIeAwoAAAAAAAAAAAAdrlgy6gkAAOoJAAAkAAAAAAAAAAAAAACkgaelBABAYWdvcmljL25vdGlmaWVyLXYwLjUuMS9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAJ6IzTTIqAAAyKgAAJwAAAAAAAAAAAAAApIHTrwQAQGFnb3JpYy9ub3RpZmllci12MC41LjEvc3JjL25vdGlmaWVyLmpzUEsBAh4DCgAAAAAAAAAAACjL3999FwAAfRcAACoAAAAAAAAAAAAAAKSBStoEAEBhZ29yaWMvbm90aWZpZXItdjAuNS4xL3NyYy9wdWJsaXNoLWtpdC5qc1BLAQIeAwoAAAAAAAAAAACvAIBh3B0AANwdAAAnAAAAAAAAAAAAAACkgQ/yBABAYWdvcmljL25vdGlmaWVyLXYwLjUuMS9zcmMvc3RvcmVzdWIuanNQSwECHgMKAAAAAAAAAAAA9l2yxCsMAAArDAAAKQAAAAAAAAAAAAAApIEwEAUAQGFnb3JpYy9ub3RpZmllci12MC41LjEvc3JjL3N1YnNjcmliZXIuanNQSwECHgMKAAAAAAAAAAAAKJlXibchAAC3IQAAJAAAAAAAAAAAAAAApIGiHAUAQGFnb3JpYy9ub3RpZmllci12MC41LjEvc3JjL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAANbWKjOVAQAAlQEAACAAAAAAAAAAAAAAAKSBmz4FAEBhZ29yaWMvc3RvcmUtdjAuOC41L2V4cG9ydGVkLmpzUEsBAh4DCgAAAAAAAAAAAAQZq6gYIgAAGCIAACEAAAAAAAAAAAAAAKSBbkAFAEBhZ29yaWMvc3RvcmUtdjAuOC41L3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAABIqXdqhUMAAIVDAAApAAAAAAAAAAAAAACkgcViBQBAYWdvcmljL3N0b3JlLXYwLjguNS9zcmMva2V5cy9jaGVja0tleS5qc1BLAQIeAwoAAAAAAAAAAACq4yidCRoAAAkaAAAsAAAAAAAAAAAAAACkgZGmBQBAYWdvcmljL3N0b3JlLXYwLjguNS9zcmMva2V5cy9jb21wYXJlS2V5cy5qc1BLAQIeAwoAAAAAAAAAAADJG5s6EhMAABITAAAoAAAAAAAAAAAAAACkgeTABQBAYWdvcmljL3N0b3JlLXYwLjguNS9zcmMva2V5cy9jb3B5QmFnLmpzUEsBAh4DCgAAAAAAAAAAAB/FqGKLDwAAiw8AACgAAAAAAAAAAAAAAKSBPNQFAEBhZ29yaWMvc3RvcmUtdjAuOC41L3NyYy9rZXlzL2NvcHlTZXQuanNQSwECHgMKAAAAAAAAAAAAJ0Ig9j0iAAA9IgAANAAAAAAAAAAAAAAApIEN5AUAQGFnb3JpYy9zdG9yZS12MC44LjUvc3JjL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qc1BLAQIeAwoAAAAAAAAAAABuqAnd3CUAANwlAAA0AAAAAAAAAAAAAACkgZwGBgBAYWdvcmljL3N0b3JlLXYwLjguNS9zcmMva2V5cy9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzUEsBAh4DCgAAAAAAAAAAAAIAh/NHCwAARwsAACwAAAAAAAAAAAAAAKSByiwGAEBhZ29yaWMvc3RvcmUtdjAuOC41L3NyYy9sZWdhY3kvbGVnYWN5TWFwLmpzUEsBAh4DCgAAAAAAAAAAAP4kplzrBgAA6wYAADAAAAAAAAAAAAAAAKSBWzgGAEBhZ29yaWMvc3RvcmUtdjAuOC41L3NyYy9sZWdhY3kvbGVnYWN5V2Vha01hcC5qc1BLAQIeAwoAAAAAAAAAAABemQsbGDMAABgzAAAzAAAAAAAAAAAAAACkgZQ/BgBAYWdvcmljL3N0b3JlLXYwLjguNS9zcmMvcGF0dGVybnMvZW5jb2RlUGFzc2FibGUuanNQSwECHgMKAAAAAAAAAAAADHGOAdovAADaLwAANAAAAAAAAAAAAAAApIH9cgYAQGFnb3JpYy9zdG9yZS12MC44LjUvc3JjL3BhdHRlcm5zL2ludGVyZmFjZS10b29scy5qc1BLAQIeAwoAAAAAAAAAAACC7OmyxwcAAMcHAAAzAAAAAAAAAAAAAACkgSmjBgBAYWdvcmljL3N0b3JlLXYwLjguNS9zcmMvcGF0dGVybnMvaW50ZXJuYWwtdHlwZXMuanNQSwECHgMKAAAAAAAAAAAArx/NGZe2AACXtgAANAAAAAAAAAAAAAAApIFBqwYAQGFnb3JpYy9zdG9yZS12MC44LjUvc3JjL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qc1BLAQIeAwoAAAAAAAAAAADiYI4kWDwAAFg8AAAuAAAAAAAAAAAAAACkgSpiBwBAYWdvcmljL3N0b3JlLXYwLjguNS9zcmMvcGF0dGVybnMvcmFua09yZGVyLmpzUEsBAh4DCgAAAAAAAAAAALQvHRL5FQAA+RUAADEAAAAAAAAAAAAAAKSBzp4HAEBhZ29yaWMvc3RvcmUtdjAuOC41L3NyYy9zdG9yZXMvc2NhbGFyTWFwU3RvcmUuanNQSwECHgMKAAAAAAAAAAAAW8HEmG8PAABvDwAAMQAAAAAAAAAAAAAApIEWtQcAQGFnb3JpYy9zdG9yZS12MC44LjUvc3JjL3N0b3Jlcy9zY2FsYXJTZXRTdG9yZS5qc1BLAQIeAwoAAAAAAAAAAAD7o2aOxREAAMURAAA1AAAAAAAAAAAAAACkgdTEBwBAYWdvcmljL3N0b3JlLXYwLjguNS9zcmMvc3RvcmVzL3NjYWxhcldlYWtNYXBTdG9yZS5qc1BLAQIeAwoAAAAAAAAAAAC6V7mBfg0AAH4NAAA1AAAAAAAAAAAAAACkgezWBwBAYWdvcmljL3N0b3JlLXYwLjguNS9zcmMvc3RvcmVzL3NjYWxhcldlYWtTZXRTdG9yZS5qc1BLAQIeAwoAAAAAAAAAAACpvmv+QBMAAEATAAAuAAAAAAAAAAAAAACkgb3kBwBAYWdvcmljL3N0b3JlLXYwLjguNS9zcmMvc3RvcmVzL3N0b3JlLXV0aWxzLmpzUEsBAh4DCgAAAAAAAAAAAM1B7BKEbgAAhG4AACEAAAAAAAAAAAAAAKSBSfgHAEBhZ29yaWMvc3RvcmUtdjAuOC41L3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAAA/tfXZUgEAAFIBAAAoAAAAAAAAAAAAAACkgQxnCABAYWdvcmljL3N3aW5nc2V0LXZhdC12MC4zMS4wL2V4cG9ydGVkLmpzUEsBAh4DCgAAAAAAAAAAAN9eLIrXBgAA1wYAADkAAAAAAAAAAAAAAKSBpGgIAEBhZ29yaWMvc3dpbmdzZXQtdmF0LXYwLjMxLjAvc3JjL3ZhdHMvdGltZXIvdHlwZUd1YXJkcy5qc1BLAQIeAwoAAAAAAAAAAABDo2Hasx4AALMeAAAuAAAAAAAAAAAAAACkgdJvCABAYWdvcmljL3ZhdC1kYXRhLXYwLjQuNS9zcmMvZmFyLWNsYXNzLXV0aWxzLmpzUEsBAh4DCgAAAAAAAAAAAI/LOT89BgAAPQYAACQAAAAAAAAAAAAAAKSB0Y4IAEBhZ29yaWMvdmF0LWRhdGEtdjAuNC41L3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAACyZOnmzwgAAM8IAAApAAAAAAAAAAAAAACkgVCVCABAYWdvcmljL3ZhdC1kYXRhLXYwLjQuNS9zcmMva2luZC11dGlscy5qc1BLAQIeAwoAAAAAAAAAAABzb4xzYRwAAGEcAAAwAAAAAAAAAAAAAACkgWaeCABAYWdvcmljL3ZhdC1kYXRhLXYwLjQuNS9zcmMvdmF0LWRhdGEtYmluZGluZ3MuanNQSwECHgMKAAAAAAAAAAAAfFVq6ZsDAACbAwAAHwAAAAAAAAAAAAAApIEVuwgAQGFnb3JpYy96b2UtdjAuMjUuNS9leHBvcnRlZC5qc1BLAQIeAwoAAAAAAAAAAACpaDAHihwAAIocAAAoAAAAAAAAAAAAAACkge2+CABAYWdvcmljL3pvZS12MC4yNS41L3NyYy9jbGVhblByb3Bvc2FsLmpzUEsBAh4DCgAAAAAAAAAAAGeLEXurEAAAqxAAADQAAAAAAAAAAAAAAKSBvdsIAEBhZ29yaWMvem9lLXYwLjI1LjUvc3JjL2NvbnRyYWN0RmFjZXQvb2ZmZXJTYWZldHkuanNQSwECHgMKAAAAAAAAAAAA6ZhB6vIjAADyIwAALgAAAAAAAAAAAAAApIG67AgAQGFnb3JpYy96b2UtdjAuMjUuNS9zcmMvY29udHJhY3RGYWNldC90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAACD0BK/5BsAAOQbAAA4AAAAAAAAAAAAAACkgfgQCQBAYWdvcmljL3pvZS12MC4yNS41L3NyYy9jb250cmFjdFN1cHBvcnQvYm9uZGluZ0N1cnZlcy5qc1BLAQIeAwoAAAAAAAAAAAA0Q7d+6xEAAOsRAAAwAAAAAAAAAAAAAACkgTItCQBAYWdvcmljL3pvZS12MC4yNS41L3NyYy9jb250cmFjdFN1cHBvcnQvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAtFglYYIlAACCJQAAOQAAAAAAAAAAAAAApIFrPwkAQGFnb3JpYy96b2UtdjAuMjUuNS9zcmMvY29udHJhY3RTdXBwb3J0L3ByaWNlQXV0aG9yaXR5LmpzUEsBAh4DCgAAAAAAAAAAAKSvS8OwCAAAsAgAADUAAAAAAAAAAAAAAKSBRGUJAEBhZ29yaWMvem9lLXYwLjI1LjUvc3JjL2NvbnRyYWN0U3VwcG9ydC9wcmljZVF1b3RlLmpzUEsBAh4DCgAAAAAAAAAAAOd7S/ddMwAAXTMAADAAAAAAAAAAAAAAAKSBR24JAEBhZ29yaWMvem9lLXYwLjI1LjUvc3JjL2NvbnRyYWN0U3VwcG9ydC9yYXRpby5qc1BLAQIeAwoAAAAAAAAAAABcDFoMxQUAAMUFAAAzAAAAAAAAAAAAAACkgfKhCQBAYWdvcmljL3pvZS12MC4yNS41L3NyYy9jb250cmFjdFN1cHBvcnQvc2FmZU1hdGguanNQSwECHgMKAAAAAAAAAAAA5jyz6okEAACJBAAANwAAAAAAAAAAAAAApIEIqAkAQGFnb3JpYy96b2UtdjAuMjUuNS9zcmMvY29udHJhY3RTdXBwb3J0L3N0YXRlTWFjaGluZS5qc1BLAQIeAwoAAAAAAAAAAABAimz3XwUAAF8FAAA1AAAAAAAAAAAAAACkgeasCQBAYWdvcmljL3pvZS12MC4yNS41L3NyYy9jb250cmFjdFN1cHBvcnQvc3RhdGlzdGljcy5qc1BLAQIeAwoAAAAAAAAAAADEtdRjtgsAALYLAAAwAAAAAAAAAAAAAACkgZiyCQBAYWdvcmljL3pvZS12MC4yNS41L3NyYy9jb250cmFjdFN1cHBvcnQvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAAA3Jb5SQ7AAAkOwAANQAAAAAAAAAAAAAApIGcvgkAQGFnb3JpYy96b2UtdjAuMjUuNS9zcmMvY29udHJhY3RTdXBwb3J0L3pvZUhlbHBlcnMuanNQSwECHgMKAAAAAAAAAAAA5iTXHyoHAAAqBwAANQAAAAAAAAAAAAAApIET+gkAQGFnb3JpYy96b2UtdjAuMjUuNS9zcmMvY29udHJhY3RzL2NhbGxTcHJlYWQvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAAGYa96eMBAADjAQAALQAAAAAAAAAAAAAApIGQAQoAQGFnb3JpYy96b2UtdjAuMjUuNS9zcmMvY29udHJhY3RzL2V4cG9ydGVkLmpzUEsBAh4DCgAAAAAAAAAAAKkak2C4GQAAuBkAAC8AAAAAAAAAAAAAAKSBvgMKAEBhZ29yaWMvem9lLXYwLjI1LjUvc3JjL2NvbnRyYWN0cy9sb2FuL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAAGQ3iDuoDAAAqAwAADkAAAAAAAAAAAAAAKSBwx0KAEBhZ29yaWMvem9lLXYwLjI1LjUvc3JjL2NvbnRyYWN0cy9wcmljZUFnZ3JlZ2F0b3JUeXBlcy5qc1BLAQIeAwoAAAAAAAAAAAC2UO1PvQsAAL0LAAAqAAAAAAAAAAAAAACkgcIqCgBAYWdvcmljL3pvZS12MC4yNS41L3NyYy9jb250cmFjdHMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAAUTSLOYQpAACEKQAAKQAAAAAAAAAAAAAApIHHNgoAQGFnb3JpYy96b2UtdjAuMjUuNS9zcmMvaW50ZXJuYWwtdHlwZXMuanNQSwECHgMKAAAAAAAAAAAAlY4pSBAIAAAQCAAAJQAAAAAAAAAAAAAApIGSYAoAQGFnb3JpYy96b2UtdjAuMjUuNS9zcmMvbWFrZUhhbmRsZS5qc1BLAQIeAwoAAAAAAAAAAAByiT72qAUAAKgFAAAtAAAAAAAAAAAAAACkgeVoCgBAYWdvcmljL3pvZS12MC4yNS41L3NyYy9vYmpBcnJheUNvbnZlcnNpb24uanNQSwECHgMKAAAAAAAAAAAAzXjEuMQRAADEEQAAJQAAAAAAAAAAAAAApIHYbgoAQGFnb3JpYy96b2UtdjAuMjUuNS9zcmMvdHlwZUd1YXJkcy5qc1BLAQIeAwoAAAAAAAAAAACEyBeOBAcAAAQHAAAgAAAAAAAAAAAAAACkgd+ACgBAYWdvcmljL3pvZS12MC4yNS41L3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAABZy1qxES0AABEtAAArAAAAAAAAAAAAAACkgSGICgBAYWdvcmljL3pvZS12MC4yNS41L3NyYy96b2VTZXJ2aWNlL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAAMvaQAgkFAAAJBQAACIAAAAAAAAAAAAAAKSBe7UKAEBhZ29yaWMvem9lLXYwLjI1LjUvdG9vbHMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAA+g/tX+sRAADrEQAAJAAAAAAAAAAAAAAApIHfyQoAQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNi41L3NyYy9FLmpzUEsBAh4DCgAAAAAAAAAAAK01mz0IAgAACAIAACoAAAAAAAAAAAAAAKSBDNwKAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTYuNS9zcmMvbm8tc2hpbS5qc1BLAQIeAwoAAAAAAAAAAACPJygn0g8AANIPAAAuAAAAAAAAAAAAAACkgVzeCgBAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE2LjUvc3JjL3RyYWNrLXR1cm5zLmpzUEsBAh4DCgAAAAAAAAAAAD7lgF62AgAAtgIAAB4AAAAAAAAAAAAAAKSBeu4KAEBlbmRvL2Zhci12MC4yLjExL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAACE1ofwvxAAAL8QAAAdAAAAAAAAAAAAAACkgWzxCgBAZW5kby9tYXJzaGFsLXYwLjcuNS9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAACqNP2CQgwAAEIMAAArAAAAAAAAAAAAAACkgWYCCwBAZW5kby9tYXJzaGFsLXYwLjcuNS9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzUEsBAh4DCgAAAAAAAAAAAGqWz6/6OwAA+jsAACsAAAAAAAAAAAAAAKSB8Q4LAEBlbmRvL21hcnNoYWwtdjAuNy41L3NyYy9lbmNvZGVUb0NhcERhdGEuanNQSwECHgMKAAAAAAAAAAAAzgcGPko+AABKPgAALQAAAAAAAAAAAAAApIE0SwsAQGVuZG8vbWFyc2hhbC12MC43LjUvc3JjL2VuY29kZVRvU21hbGxjYXBzLmpzUEsBAh4DCgAAAAAAAAAAAFRB5IXoBgAA6AYAAC0AAAAAAAAAAAAAAKSByYkLAEBlbmRvL21hcnNoYWwtdjAuNy41L3NyYy9oZWxwZXJzL2NvcHlBcnJheS5qc1BLAQIeAwoAAAAAAAAAAAATbBxQ0gcAANIHAAAuAAAAAAAAAAAAAACkgfyQCwBAZW5kby9tYXJzaGFsLXYwLjcuNS9zcmMvaGVscGVycy9jb3B5UmVjb3JkLmpzUEsBAh4DCgAAAAAAAAAAAMME/F8kEQAAJBEAACkAAAAAAAAAAAAAAKSBGpkLAEBlbmRvL21hcnNoYWwtdjAuNy41L3NyYy9oZWxwZXJzL2Vycm9yLmpzUEsBAh4DCgAAAAAAAAAAANExutlGCAAARggAADAAAAAAAAAAAAAAAKSBhaoLAEBlbmRvL21hcnNoYWwtdjAuNy41L3NyYy9oZWxwZXJzL2l0ZXItaGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAAC8eDjMaBIAAGgSAAA1AAAAAAAAAAAAAACkgRmzCwBAZW5kby9tYXJzaGFsLXYwLjcuNS9zcmMvaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAAAgIflr3h4AAN4eAAAtAAAAAAAAAAAAAACkgdTFCwBAZW5kby9tYXJzaGFsLXYwLjcuNS9zcmMvaGVscGVycy9yZW1vdGFibGUuanNQSwECHgMKAAAAAAAAAAAABcog2SIPAAAiDwAAMAAAAAAAAAAAAAAApIH95AsAQGVuZG8vbWFyc2hhbC12MC43LjUvc3JjL2hlbHBlcnMvc2FmZS1wcm9taXNlLmpzUEsBAh4DCgAAAAAAAAAAAPFV/x7YEgAA2BIAACoAAAAAAAAAAAAAAKSBbfQLAEBlbmRvL21hcnNoYWwtdjAuNy41L3NyYy9oZWxwZXJzL3N5bWJvbC5qc1BLAQIeAwoAAAAAAAAAAAAMuJkH/AYAAPwGAAAqAAAAAAAAAAAAAACkgY0HDABAZW5kby9tYXJzaGFsLXYwLjcuNS9zcmMvaGVscGVycy90YWdnZWQuanNQSwECHgMKAAAAAAAAAAAAHVJxOUoZAABKGQAAJAAAAAAAAAAAAAAApIHRDgwAQGVuZG8vbWFyc2hhbC12MC43LjUvc3JjL21ha2UtZmFyLmpzUEsBAh4DCgAAAAAAAAAAAFvzA2cpBAAAKQQAACYAAAAAAAAAAAAAAKSBXSgMAEBlbmRvL21hcnNoYWwtdjAuNy41L3NyYy9tYWtlVGFnZ2VkLmpzUEsBAh4DCgAAAAAAAAAAAJKfONHaKAAA2igAACoAAAAAAAAAAAAAAKSByiwMAEBlbmRvL21hcnNoYWwtdjAuNy41L3NyYy9tYXJzaGFsLWp1c3Rpbi5qc1BLAQIeAwoAAAAAAAAAAABeFZV2oQYAAKEGAAAtAAAAAAAAAAAAAACkgexVDABAZW5kby9tYXJzaGFsLXYwLjcuNS9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanNQSwECHgMKAAAAAAAAAAAA+Lv7eGUyAABlMgAAIwAAAAAAAAAAAAAApIHYXAwAQGVuZG8vbWFyc2hhbC12MC43LjUvc3JjL21hcnNoYWwuanNQSwECHgMKAAAAAAAAAAAAk0AxGEkbAABJGwAAJwAAAAAAAAAAAAAApIF+jwwAQGVuZG8vbWFyc2hhbC12MC43LjUvc3JjL3Bhc3NTdHlsZU9mLmpzUEsBAh4DCgAAAAAAAAAAAEmUCH4gDQAAIA0AACYAAAAAAAAAAAAAAKSBDKsMAEBlbmRvL21hcnNoYWwtdjAuNy41L3NyYy90eXBlR3VhcmRzLmpzUEsBAh4DCgAAAAAAAAAAALtXDvcfAQAAHwEAACEAAAAAAAAAAAAAAKSBcLgMAEBlbmRvL21hcnNoYWwtdjAuNy41L3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAAD/CipPugsAALoLAAAeAAAAAAAAAAAAAACkgc65DABAZW5kby9uYXQtdjQuMS4yMC9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAtgDMq10JAABdCQAAIgAAAAAAAAAAAAAApIHExQwAQGVuZG8vcHJvbWlzZS1raXQtdjAuMi40OS9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAABU9IWl3AIAANwCAAArAAAAAAAAAAAAAACkgWHPDABAZW5kby9wcm9taXNlLWtpdC12MC4yLjQ5L3NyYy9pcy1wcm9taXNlLmpzUEsBAh4DCgAAAAAAAAAAAGB2jU+5EgAAuRIAACoAAAAAAAAAAAAAAKSBhtIMAEBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNDkvc3JjL21lbW8tcmFjZS5qc1BLAQIeAwoAAAAAAAAAAABDgnHmZgcAAGYHAAA1AAAAAAAAAAAAAACkgYflDABAZW5kby9wcm9taXNlLWtpdC12MC4yLjQ5L3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qc1BLAQIeAwoAAAAAAAAAAAC7Vw73HwEAAB8BAAAmAAAAAAAAAAAAAACkgUDtDABAZW5kby9wcm9taXNlLWtpdC12MC4yLjQ5L3NyYy90eXBlcy5qc1BLBQYAAAAAhACEAGouAACj7gwAAAA=","endoZipBase64Sha512":"ffb0e1d89891737dd4853d9ac8f8b0c9a55422845670d2d96bbca3aacc026d8c5ca27297faca33c81adc9d4a2b6d61cd7e0b601404521cb2262dc18cc3472741"};
|