@willbooster/wbfy 20.17.3 → 20.18.1
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/configs/releaseAgeGate.json +10 -0
- package/dist/index.js +4 -3
- package/package.json +6 -6
package/dist/index.js
CHANGED
|
@@ -58,7 +58,8 @@ alwaysApply: true
|
|
|
58
58
|
- Ensure tests are idempotent and independent (e.g., reset persistent data) so they can run repeatedly or in parallel.
|
|
59
59
|
- Avoid fixed waits in E2E tests; wait for conditions instead.
|
|
60
60
|
- When fixing issues (including test failures), investigate the root cause first (e.g., via debug logs or screenshots) and fix it instead of applying workarounds.
|
|
61
|
-
- After making changes, run \`bun run verify\` (type checking and linting; up to 10 minutes),
|
|
61
|
+
- After making changes, as a rule, run only what is necessary for the change locally, \`bun run verify\` (type checking and linting; up to 10 minutes) and the relevant tests, and leave the full test suite (\`bun run verify-full\`; up to 1 hour) to the PR's CI. If PR CI does not run the full suite, run it locally. Fix errors, including CI failures, and re-run until they pass.
|
|
62
|
+
- Run relevant tests with \`bun wb test test/unit/example.test.ts --grep 'case name'\` (omit \`--grep\` for the whole file; use \`-w packages/example\` in a monorepo). \`bun wb verify --full <test-path> --grep 'case name'\` combines verification with selected tests.
|
|
62
63
|
- Wait for it to finish without restarting it: prefer completion notifications, otherwise the longest permitted wait; no output does not mean it has stopped. If the displayed excerpt is insufficient, read the indicated log file before rerunning. If the environment kills long-running commands, run them detached with a saved log and exit status.
|
|
63
64
|
- Once verified, commit and push to the current (non-main) branch, and create a PR via \`gh\` if none exists for the branch.
|
|
64
65
|
- Follow the Conventional Commits format (e.g., \`feat:\`, \`fix:\`).${g}
|
|
@@ -100,7 +101,7 @@ ${l}
|
|
|
100
101
|
`.replaceAll(/\.\n\n+-/g,`.
|
|
101
102
|
-`).replaceAll(/\n{3,}/g,`
|
|
102
103
|
|
|
103
|
-
`).trim()}function Lr(e){return e.some(e=>e.depending.playwrightTest)}var Rr=7,zr=`@exercode/problem-utils.@exercode/problem-utils-browser.@exercode/problem-utils-llm.@openai/codex.@willbooster-private/agentic-workflows.@willbooster-private/ai-ocr.@willbooster-private/code-analyzer.@willbooster-private/judge.@willbooster-private/llm-proxy.@willbooster-private/review-booster.@willbooster/babel-configs.@willbooster/biome-config.@willbooster/eslint-config-blitz-next.@willbooster/eslint-config-js.@willbooster/eslint-config-js-react.@willbooster/eslint-config-next.@willbooster/eslint-config-ts.@willbooster/eslint-config-ts-react.@willbooster/monaco-loader.@willbooster/monaco-react.@willbooster/oxfmt-config.@willbooster/oxlint-config.@willbooster/prettier-config.@willbooster/react-frame-component.@willbooster/renovate-config.@willbooster/shared-lib.@willbooster/shared-lib-blitz-next.@willbooster/shared-lib-next.@willbooster/shared-lib-node.@willbooster/shared-lib-react.@willbooster/wb.@willbooster/wbfy.agent-runtime-kit.at-decorators.better-auth-email-otp-reliable.build-ts.code-gauge.code-gauge-darwin-arm64.code-gauge-darwin-x64.code-gauge-linux-arm64-gnu.code-gauge-linux-arm64-musl.code-gauge-linux-x64-gnu.code-gauge-linux-x64-musl.code-gauge-win32-x64-msvc.gen-i18n-ts.minimal-promise-pool.one-way-git-sync.slidev-check.vinext-progress.wbfy.yarn-plugin-auto-install`.split(`.`);const Br=Rr*24*60*60,Vr=zr;function Hr(n){let r=t.resolve(n,`bunfig.toml`);if(e.existsSync(r))return Jr(e.readFileSync(r,`utf8`))?.install?.globalStore}function Ur(e,t,n){let r=Wr(e);return n?t??r:r}function Wr(e){return!e.some(e=>e.depending.next||e.depending.blitz||e.depending.slidev)}async function Gr(n,r){return E.functionIgnoringException(`generateBunfigToml`,async()=>{let i=t.resolve(n.dirPath,`bunfig.toml`),a=e.existsSync(i)?e.readFileSync(i,`utf8`):void 0,o=Kr(a,r);await k.run(()=>O.generateFile(i,o))})}const Kr=(e,t)=>{let n=Jr(e),r=t?`globalStore = true`:`globalStore = false`;return`env = false
|
|
104
|
+
`).trim()}function Lr(e){return e.some(e=>e.depending.playwrightTest)}var Rr=7,zr=`@anthropic-ai/claude-agent-sdk.@anthropic-ai/claude-agent-sdk-darwin-arm64.@anthropic-ai/claude-agent-sdk-darwin-x64.@anthropic-ai/claude-agent-sdk-linux-arm64.@anthropic-ai/claude-agent-sdk-linux-arm64-musl.@anthropic-ai/claude-agent-sdk-linux-x64.@anthropic-ai/claude-agent-sdk-linux-x64-musl.@anthropic-ai/claude-agent-sdk-win32-arm64.@anthropic-ai/claude-agent-sdk-win32-x64.@exercode/problem-utils.@exercode/problem-utils-browser.@exercode/problem-utils-llm.@openai/codex.@openai/codex-sdk.@willbooster-private/agentic-workflows.@willbooster-private/ai-ocr.@willbooster-private/code-analyzer.@willbooster-private/judge.@willbooster-private/llm-proxy.@willbooster-private/review-booster.@willbooster/babel-configs.@willbooster/biome-config.@willbooster/eslint-config-blitz-next.@willbooster/eslint-config-js.@willbooster/eslint-config-js-react.@willbooster/eslint-config-next.@willbooster/eslint-config-ts.@willbooster/eslint-config-ts-react.@willbooster/monaco-loader.@willbooster/monaco-react.@willbooster/oxfmt-config.@willbooster/oxlint-config.@willbooster/prettier-config.@willbooster/react-frame-component.@willbooster/renovate-config.@willbooster/shared-lib.@willbooster/shared-lib-blitz-next.@willbooster/shared-lib-next.@willbooster/shared-lib-node.@willbooster/shared-lib-react.@willbooster/wb.@willbooster/wbfy.agent-runtime-kit.at-decorators.better-auth-email-otp-reliable.build-ts.code-gauge.code-gauge-darwin-arm64.code-gauge-darwin-x64.code-gauge-linux-arm64-gnu.code-gauge-linux-arm64-musl.code-gauge-linux-x64-gnu.code-gauge-linux-x64-musl.code-gauge-win32-x64-msvc.gen-i18n-ts.minimal-promise-pool.one-way-git-sync.slidev-check.vinext-progress.wbfy.yarn-plugin-auto-install`.split(`.`);const Br=Rr*24*60*60,Vr=zr;function Hr(n){let r=t.resolve(n,`bunfig.toml`);if(e.existsSync(r))return Jr(e.readFileSync(r,`utf8`))?.install?.globalStore}function Ur(e,t,n){let r=Wr(e);return n?t??r:r}function Wr(e){return!e.some(e=>e.depending.next||e.depending.blitz||e.depending.slidev)}async function Gr(n,r){return E.functionIgnoringException(`generateBunfigToml`,async()=>{let i=t.resolve(n.dirPath,`bunfig.toml`),a=e.existsSync(i)?e.readFileSync(i,`utf8`):void 0,o=Kr(a,r);await k.run(()=>O.generateFile(i,o))})}const Kr=(e,t)=>{let n=Jr(e),r=t?`globalStore = true`:`globalStore = false`;return`env = false
|
|
104
105
|
telemetry = false
|
|
105
106
|
|
|
106
107
|
${qr(e)}[install]
|
|
@@ -513,4 +514,4 @@ ${ce(se)}
|
|
|
513
514
|
`);throw Error(`Disallowed Git dependency sources found.\nOnly WillBooster and WillBoosterLab GitHub dependencies are allowed.\n${r}`)}function eu(e){let t=e.packageJson;if(!t)return[];let n=[];for(let r of Xl){let i=t[r];if(i)for(let[t,a]of Object.entries(i))a&&tu(a)&&(ru(a)||n.push({dependencyName:t,dirPath:e.dirPath,sectionName:r,specifier:a}))}return n}function tu(e){return nu(e)||/^(?:bitbucket|gist|github|gitlab):/u.test(e)||/^https?:\/\/(?:bitbucket\.org|github\.com|gitlab\.com)\//u.test(e)||/^(?:https?|ssh):\/\/\S+\.git(?:#\S+)?$/u.test(e)||/^[^@\s]+@[^:\s]+:\S+(?:#\S+)?$/u.test(e)||e.startsWith(`git:`)||e.startsWith(`git+`)||e.startsWith(`ssh://git@`)}function nu(e){return/^[a-zA-Z0-9][\w.-]*\/[\w.-]+(?:#\S+)?$/u.test(e)}function ru(e){return Ql.some(t=>t.test(e))}const iu=`apply-release-age-gate`,au=`generate-user-agent-configs`;async function ou(){let e=await o(process.argv.slice(2)).command(iu,`Apply only the organization's minimum-release-age policy to this machine's global package-manager configs`).command(au,`Overwrite this user's agent instruction files (~/.codex/AGENTS.md, ~/.claude/CLAUDE.md, ~/.gemini/GEMINI.md) with the organization's fixed content and merge the organization's settings into ~/.claude/settings.json and ~/.gemini/settings.json`).command(`$0 [paths..]`,`Make a given project follow the WillBooster standard`,e=>{e.positional(`paths`,{describe:`project paths to be wbfied`,array:!0,type:`string`,default:[`.`]})}).options({force:{description:`Apply wbfy even when the repository already records this wbfy version`,type:`boolean`,default:!1,alias:`f`},skipDeps:{description:"Skip adding managed dependencies and the linker probe (the final `bun install` refreshing the lockfile still runs)",type:`boolean`,default:!1,alias:`d`},verbose:{description:`Whether or not to enable verbose mode`,type:`boolean`,default:!1,alias:`v`}}).version(gi()).strict().argv;if(T.isVerbose=e.verbose,e._[0]===iu){ji()||(process.exitCode=1);return}if(e._[0]===au){await il()||(process.exitCode=1);return}let t=!1;try{t=await su(e.paths,e.skipDeps,e.force)}finally{await je()}t&&(process.exitCode=1)}async function su(n,r,i){ji();let a=Bun.version;if(Bun.semver.order(a,`1.4.0`)<0)return console.error(`wbfy requires Bun >= 1.4.0 (found ${a}). Upgrade Bun and re-run.`),!0;let o=vi(),s=!i&&o&&!o.endsWith(`-dirty-local`)?o:void 0,c=!1;for(let i of n){let n=t.resolve(i);if(O.setRootDirPath(e.existsSync(n)?n:void 0),s&&await rc(n)===s){console.info(`Skip ${n}: wbfy ${s} is already applied. Pass --force to re-apply.`);continue}let a=t.join(n,`packages`),o=(await ue(()=>e.promises.readdir(a,{withFileTypes:!0}))??[]).filter(e=>e.isDirectory()).map(e=>t.resolve(a,e.name)),l=Jt({dirPath:n,packageJson:le(()=>JSON.parse(e.readFileSync(t.resolve(n,`package.json`),`utf8`)))??{},doesContainSubPackageJsons:o.some(n=>e.existsSync(t.resolve(n,`package.json`)))}),u=[...new Set([...o,...l])].filter(e=>e!==t.resolve(n)),d=[...[`.gitattributes`,`bunfig.toml`,`lefthook.yml`,`package.json`,`tsconfig.json`].map(e=>t.resolve(n,e)),...u.flatMap(e=>[`package.json`,`tsconfig.json`].map(n=>t.resolve(e,n)))];if((await Promise.all(d.map(e=>O.isConfinedWritablePath(e)))).includes(!1)){console.error(`Skip ${n}: a managed config file is a symlink or resolves outside the repository.`),c=!0;continue}let f=[n,...u].flatMap(n=>{let r=t.resolve(n,`package.json`);if(!e.existsSync(r))return[];try{let t=rr({packageJson:JSON.parse(e.readFileSync(r,`utf8`))});return t?[`${n}: ${t}`]:[]}catch{return[`${r} is invalid`]}});if(f.length>0){console.error(`Skip ${n}:\n${f.join(`
|
|
514
515
|
`)}`),c=!0;continue}let p=await tr(n);if(T.isVerbose,!p){console.error(`there is no valid package.json in ${n}`),c=!0;continue}let m=await Promise.all(u.map(e=>tr(e,{isRoot:!1}))),h=u.find((n,r)=>!m[r]&&e.existsSync(t.join(n,`package.json`)));if(h){console.error(`Skip ${n}: ${h}/package.json is invalid.`),c=!0;continue}let g=[p,...m.filter(e=>!!e)],_=g.some(e=>e.isCloudflare)?R(`git`,[`-c`,`core.quotePath=false`,`ls-files`,`--`,`.env.cloudflare`,`*/.env.cloudflare`],p.dirPath).split(`
|
|
515
516
|
`).filter(Boolean).map(e=>t.resolve(p.dirPath,e)):[];if(_.length>0){console.error(`SECURITY ERROR: Cloudflare credentials must be untracked. Remove ${_.join(`, `)} from Git, purge the token from history, and rotate CLOUDFLARE_API_TOKEN before rerunning wbfy.`),c=!0;continue}let v=Dn(p);if(await Fl(g),T.isVerbose)for(let e of g)console.info(e);$l(g);let y=Hr(n),ee=Ur(g,y,r);await Gr(p,ee),await Ol(p),await mt(p),await ul(p,g),await k.promiseAll(),!r&&p.doesContainPackageJson&&!cu(n,p,y,ee)&&console.warn(`bun install currently fails in ${n} under the isolated linker.`);let b=!F(p.repository)&&(p.repository?.startsWith(`github:WillBooster/`)||p.repository?.startsWith(`github:WillBoosterLab/`)),te=!b&&!F(p.repository)&&!!p.repository?.startsWith(`github:`)&&p.isRoot;await Promise.all([v.then(()=>ic(p)),ni(p),ii(p),si(p,g),li(p),Yl(p),Ni(p),Xs(p),Tc(p),xc(p),...b?[fn(p)]:[],...te?[yl(p,g)]:[],Ll(p),Vl(p),Gl(p),...p.isRoot?[Es(p,g)]:[]]),await k.promiseAll(),await Ar(p,g),await k.promiseAll();let x=[];for(let e of g)e.depending.playwrightTest&&x.push(Ke(e)),e.depending.next&&x.push(Pe(e)),e.depending.chakra&&x.push(Ve(e)),await fi(e,p),await k.promiseAll(),(e.isRoot||e.doesContainPackageJson)&&(Mi(e)&&await qs(e),await Xa(e,p,r),e.doesContainVscodeSettingsJson&&x.push(sl(e)),H(e)?(x.push(kc(e)),x.push(Vs(e)),x.push(Ws(e,p))):!e.isRoot&&e.doesContainPackageJson&&H(p)&&x.push(Ws(e,p)),e.depending.pyright&&x.push(Ys(e)));await Promise.all(x),await k.promiseAll(),ui(n);try{uu(n)}catch(e){console.error(`Failed to refresh the Bun lockfile:`,e?.message??e),c=!0}try{let e=Se(n);e&&console.info(`Removed Takumi Guard proxy URLs from ${e} to keep it registry-agnostic.`)}catch(e){console.error(`Failed to normalize the Bun lockfile:`,e?.message??e),c=!0}Yn(`bun`,[`cleanup`],n)}return c}function cu(e,t,n,r){return n!==r&&lu(e,t),Xn(`bun`,[`install`],e,1)===0||(lu(e,t),!1)}function lu(n,r){let i=[t.resolve(n,`node_modules`),...[...Yo(r).values()].map(e=>t.resolve(n,e,`node_modules`))],a=e.realpathSync(n);for(let n of i){let r=le(()=>e.realpathSync(t.dirname(n)));r&&(r===a||r.startsWith(a+t.sep))&&e.rmSync(n,{recursive:!0,force:!0})}}function uu(e){let t=Xn(`bun`,[`install`],e,1);if(t!==0)throw Error(`Failed to refresh Bun lockfile: bun install exited with status ${t}`)}await ou();
|
|
516
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6WyJmcyIsImZzIiwicGFyc2VKc29uYyIsImZzcCIsInJlbGVhc2VBZ2VHYXRlLmRheXMiLCJyZWxlYXNlQWdlR2F0ZS5leGNsdWRlcyIsIm5ld0NvbnRlbnQiLCJjb21tb25Db250ZW50IiwibmV3Q29udGVudCIsImNoaWxkX3Byb2Nlc3MiLCJjb21tb25Db250ZW50IiwiY2hpbGRfcHJvY2VzcyIsInNvcnRPYmplY3RLZXlzIiwiZ2l0SG9va3MiLCJkZXRlY3ROZXdsaW5lIiwiZGVwZW5kZW5jeVNlY3Rpb25LZXlzIiwiY29yZSIsIm1hbmFnZWRDb25maWdCbG9ja3MiLCJnZXRDb25maWdDb250ZW50Il0sInNvdXJjZXMiOlsiLi4vLi4vc2hhcmVkLWxpYi9zcmMvZ2l0aHViVGVtcGxhdGVzLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi9zcmMvc2xlZXAudHMiLCIuLi8uLi9zaGFyZWQtbGliL3NyYy9lcnJvci50cyIsIi4uLy4uL3NoYXJlZC1saWIvc3JjL3RleHQudHMiLCIuLi8uLi9zaGFyZWQtbGliL3NyYy90ZXN0aW5nUnVsZXMudHMiLCIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL2J1bldvcmtzcGFjZXMudHMiLCIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL2J1bkxvY2tmaWxlLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9kb2NrZXJmaWxlLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9nbG9iLnRzIiwiLi4vc3JjL29wdGlvbnMudHMiLCIuLi9zcmMvbG9nZ2VyLnRzIiwiLi4vc3JjL3V0aWxzL2ZzVXRpbC50cyIsIi4uL3NyYy91dGlscy9wcm9taXNlUG9vbC50cyIsIi4uL3NyYy91dGlscy90eXBlc2NyaXB0QXBpLnRzIiwiLi4vc3JjL2ZpeGVycy9uZXh0Q29uZmlnLnRzIiwiLi4vc3JjL2ZpeGVycy9jaGFrcmFUb2FzdGVyLnRzIiwiLi4vc3JjL2ZpeGVycy9wbGF5d3JpZ2h0Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZm5veFRvbWwudHMiLCIuLi9zcmMvdXRpbHMvbWVyZ2VVdGlsLnRzIiwiLi4vc3JjL3V0aWxzL29iamVjdFV0aWwudHMiLCIuLi9zcmMvdXRpbHMvd29ya3NwYWNlVXRpbC50cyIsIi4uL3NyYy91dGlscy9wcml2YXRlUGFja2FnZXMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy93b3JrZmxvd1J1bm5lclBvbGljeS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3dvcmtmbG93LnRzIiwiLi4vc3JjL2ZpeGVycy90eXBvcy50cyIsIi4uL3NyYy91dGlscy9naXRodWJVdGlsLnRzIiwiLi4vc3JjL3V0aWxzL2pzb25jVXRpbC50cyIsIi4uL3NyYy91dGlscy9tYW5hZ2VkU2NyaXB0U2VnbWVudC50cyIsIi4uL3NyYy91dGlscy9zcGF3blV0aWwudHMiLCIuLi9zcmMvcGFja2FnZUNvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2FnZW50cy50cyIsIi4uL2NvbmZpZ3MvcmVsZWFzZUFnZUdhdGUuanNvbiIsIi4uL3NyYy9nZW5lcmF0b3JzL2J1bmZpZy50cyIsIi4uL3NyYy91dGlscy9pZ25vcmVGaWxlVXRpbC50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2RvY2tlcmlnbm9yZS50cyIsIi4uL3NyYy91dGlscy9leHRlbnNpb25zLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZWRpdG9yY29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2VtaW5pQ29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2l0YXR0cmlidXRlcy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2dpdGlnbm9yZS50cyIsIi4uL3NyYy91dGlscy92ZXJzaW9uLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2xvYmFsUmVsZWFzZUFnZUdhdGUudHMiLCIuLi9zcmMvdXRpbHMvcGFja2FnZUNhcGFiaWxpdGllcy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2lkZWEudHMiLCIuLi9zcmMvdXRpbHMvZ2VuSTE4blRzLnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLmJ1bi9pbnN0YWxsL2NhY2hlL2xpbmtzL3NvcnQtb2JqZWN0LWtleXNAMi4xLjAtMThkZjJmODM3ZTZlYzI5YS9ub2RlX21vZHVsZXMvc29ydC1vYmplY3Qta2V5cy9pbmRleC5qcyIsIi4uLy4uLy4uLy4uLy4uLy4uLy5idW4vaW5zdGFsbC9jYWNoZS9saW5rcy9kZXRlY3QtaW5kZW50QDcuMC4yLTZiNzVkYzBmNTY1MzNiZDkvbm9kZV9tb2R1bGVzL2RldGVjdC1pbmRlbnQvaW5kZXguanMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uYnVuL2luc3RhbGwvY2FjaGUvbGlua3MvZGV0ZWN0LW5ld2xpbmVANC4wLjEtNWRhOWRmNjUxMjVlZTc5NS9ub2RlX21vZHVsZXMvZGV0ZWN0LW5ld2xpbmUvaW5kZXguanMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uYnVuL2luc3RhbGwvY2FjaGUvbGlua3MvZ2l0LWhvb2tzLWxpc3RANC4yLjEtNmNhMmIyNjlkOTE2MzMyZS9ub2RlX21vZHVsZXMvZ2l0LWhvb2tzLWxpc3QvaW5kZXguanNvbiIsIi4uLy4uLy4uLy4uLy4uLy4uLy5idW4vaW5zdGFsbC9jYWNoZS9saW5rcy9pcy1wbGFpbi1vYmpANC4xLjAtNDdmZGRkNzcwNjQ4ZTU3Ny9ub2RlX21vZHVsZXMvaXMtcGxhaW4tb2JqL2luZGV4LmpzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLmJ1bi9pbnN0YWxsL2NhY2hlL2xpbmtzL3NvcnQtcGFja2FnZS1qc29uQDQuMC4wLTgzZDBhZmZjYmI5YjNjODUvbm9kZV9tb2R1bGVzL3NvcnQtcGFja2FnZS1qc29uL2luZGV4LmpzIiwiLi4vc3JjL2dpdGh1Yi9jb21taXQudHMiLCIuLi9zcmMvdXRpbHMvdHNjb25maWdCYXNlLnRzIiwiLi4vc3JjL3V0aWxzL3dpbGxib29zdGVyQ29uZmlnc1V0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9wYWNrYWdlSnNvbi50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2xlZnRob29rLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvY29uZmlnQ29udGVudC50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL21hbmFnZWRDb25maWdCbG9jay50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL294Zm10Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvb3hsaW50Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcHJldHRpZXJpZ25vcmUudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9weXJpZ2h0Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmFpbHdheWlnbm9yZS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3JlYWRtZS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3JlbGVhc2VyYy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3Jlbm92YXRlSnNvbmMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy90c2NvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3VzZXJBZ2VudENvbmZpZ3MudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy92c2NvZGVTZXR0aW5ncy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3diRW52LnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvc2VsZkNvbnRhaW5lZFdvcmtmbG93LnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvbWlzZVRvbWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9ucG1yYy50cyIsIi4uL3NyYy9naXRodWIvbGFiZWwudHMiLCIuLi9zcmMvZ2l0aHViL3J1bGVzZXQudHMiLCIuLi9zcmMvZ2l0aHViL3NldHRpbmdzLnRzIiwiLi4vc3JjL2dpdGh1Yi90ZW1wbGF0ZS50cyIsIi4uL3NyYy91dGlscy9kZXBlbmRlbmN5U291cmNlUG9saWN5LnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQSBzZWN0aW9uIG9mIGEgUFIgb3IgaXNzdWUgYm9keTogaXRzIGhlYWRpbmcgYW5kIHdoYXQgdGhlIHNlY3Rpb24gbXVzdCBzdGF0ZS4gYHJlcXVpcmVtZW50YFxuICogc3RhcnRzIGxvd2VyY2FzZSBhbmQgZW5kcyB3aXRob3V0IHB1bmN0dWF0aW9uLCBzbyB0aGF0IGl0IHJlYWRzIGJvdGggYXMgYSBwbGFjZWhvbGRlciBzZW50ZW5jZVxuICogKGNhcGl0YWxpemVkLCB3aXRoIGEgcGVyaW9kIGFwcGVuZGVkKSBhbmQgYXMgYSBjaGVja2xpc3QgY2xhdXNlIGFmdGVyIHRoZSBoZWFkaW5nLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRlbXBsYXRlU2VjdGlvbiB7XG4gIHJlYWRvbmx5IGhlYWRpbmc6IHN0cmluZztcbiAgcmVhZG9ubHkgcmVxdWlyZW1lbnQ6IHN0cmluZztcbn1cblxuLyoqIFNlY3Rpb25zIG9mIGEgcHVsbCByZXF1ZXN0IGJvZHksIGluIHRoZSBvcmRlciB0aGV5IGFwcGVhciBpbiB0aGUgUFIgdGVtcGxhdGUuICovXG5leHBvcnQgY29uc3QgUFVMTF9SRVFVRVNUX1NFQ1RJT05TOiByZWFkb25seSBUZW1wbGF0ZVNlY3Rpb25bXSA9IFtcbiAge1xuICAgIGhlYWRpbmc6ICdXaHknLFxuICAgIHJlcXVpcmVtZW50OiAndGhlIHByb2JsZW0sIHdpdGggdGhlIG51bWJlcnMgb3Igb2JzZXJ2YXRpb25zIGJlaGluZCBpdCwgYW5kIHdoeSB0aGlzIGFwcHJvYWNoIG92ZXIgdGhlIGFsdGVybmF0aXZlcycsXG4gIH0sXG4gIHtcbiAgICBoZWFkaW5nOiAnUmVxdWlyZW1lbnRzJyxcbiAgICByZXF1aXJlbWVudDpcbiAgICAgIFwidGhlIHJlcXVpcmVtZW50cyB0aGUgY2hhbmdlIG11c3Qgc2F0aXNmeSBhbmQgdGhlIGd1YXJhbnRlZXMgaXQgbXVzdCBrZWVwIGFzIHRoZXkgc3RhbmQgbm93LCBvbmUgcGVyIGxpbmUsIGVhY2ggbWFya2VkIGByZXF1aXJlZGAgKGFza2VkIGZvciBieSB0aGUgcmVxdWVzdGVyLCBvciBhbiBleGlzdGluZyBjb250cmFjdCBjYWxsZXJzIGRlcGVuZCBvbikgb3IgYGNob3NlbmAgKHRoZSBpbXBsZW1lbnRlcidzIG93biBkZWNpc2lvbiB3aXRoIHRoZSByZWFzb24gdGhhdCBkZWNpZGVkIGl0LCB3aGljaCBhIHNpbXBsZXIgZGVzaWduIG1heSByZXBsYWNlKTsgc3RhdGUgdGhlIHJlcXVlc3RlcidzIGluc3RydWN0aW9ucyBpbiB0aGUgcmVxdWVzdGVyJ3MgdGVybXMsIHdoZXRoZXIgdGhleSBjYW1lIGZyb20gYW4gaXNzdWUgb3IgYSBjb252ZXJzYXRpb24sIGFuZCBrZWVwIGVhY2ggbGluZSBhcyBpdCBpcyB1bnRpbCB0aGUgcmVxdWVzdGVyIG92ZXJyaWRlcyBvciB3aXRoZHJhd3MgdGhlIGluc3RydWN0aW9uIGJlaGluZCBpdCBvciB0aGUgZGVjaXNpb24gYmVoaW5kIGl0IGNoYW5nZXMsIGFuZCB0aGVuIHJld3JpdGUgb3IgcmVtb3ZlIHRoYXQgbGluZSBpbnN0ZWFkIG9mIGFkZGluZyBvbmUgYmVzaWRlIGl0XCIsXG4gIH0sXG4gIHtcbiAgICBoZWFkaW5nOiAnQ3VzdG9tZXIgU3VtbWFyeScsXG4gICAgcmVxdWlyZW1lbnQ6XG4gICAgICAnYmVoYXZpb3IsIHdvcmtmbG93LCBvciB1c2VyLXZpc2libGUgY2hhbmdlcywgd3JpdHRlbiBmb3IgcmVhZGVycyB3aG8ga25vdyBub3RoaW5nIGFib3V0IHRoZSBpbXBsZW1lbnRhdGlvbicsXG4gIH0sXG4gIHtcbiAgICBoZWFkaW5nOiAnVGVjaG5pY2FsIFN1bW1hcnknLFxuICAgIHJlcXVpcmVtZW50OlxuICAgICAgJ2RlY2lzaW9ucyBhbmQgdGhlaXIgcmVhc29ucywgZGF0YSBmbG93LCB3aGVyZSB0byBsb29rICh0aGUgZmlsZXMgdGhhdCBtYXR0ZXIgbW9zdCksIGFuZCB3aGF0IHRvIGNoZWNrIGhhcmRlc3Q6IHRoZSBwYXJ0cyB3aG9zZSBjb3JyZWN0bmVzcyBpcyBhcmd1ZWQgcmF0aGVyIHRoYW4gcHJvdmVuJyxcbiAgfSxcbiAge1xuICAgIGhlYWRpbmc6ICdUZXN0aW5nJyxcbiAgICByZXF1aXJlbWVudDogJ2NvbW1hbmRzIHJ1biwgdGVzdHMgYWRkZWQsIGFuZCB3aGF0IHdhcyBOT1QgZXhlcmNpc2VkIGFuZCB3aHknLFxuICB9LFxuICB7XG4gICAgaGVhZGluZzogJ05vdGVzJyxcbiAgICByZXF1aXJlbWVudDogJ2tub3duIGxpbWl0YXRpb25zLCBjb21wYXRpYmlsaXR5IGFuZCBtaWdyYXRpb24sIGZvbGxvdy11cCB3b3JrOyBkZWxldGUgdGhpcyBzZWN0aW9uIGlmIHRoZXJlIGlzIG5vbmUnLFxuICB9LFxuXTtcblxuLyoqXG4gKiBIb3cgYSB0b29sIHRoYXQgd3JpdGVzIG9yIHJld3JpdGVzIGEgUFIgYm9keSBkZXJpdmVzIGl0IGZyb20gdGhlIHJlcG9zaXRvcnkncyBQUiB0ZW1wbGF0ZSwgYXNcbiAqIG1hcmtkb3duIGJ1bGxldHMgZm9yIGFuIGFnZW50J3MgaW5zdHJ1Y3Rpb25zLiBTdGF0ZWQgb25jZSBoZXJlIGFuZCByZW5kZXJlZCBieSBldmVyeSB3cml0ZXIgKHRoZVxuICogZ2VuZXJhdGVkIGFnZW50IGluc3RydWN0aW9ucywgdGhlIFBSLWRyYWZ0aW5nIHNraWxscykgc28gdGhlIHdyaXRlcnMgY2Fubm90IGRyaWZ0IGFwYXJ0OyB0aGVcbiAqIHRlbXBsYXRlLWxlc3MgYnJhbmNoIGxldHMgdGhlIHNhbWUgdGV4dCBzZXJ2ZSByZXBvc2l0b3JpZXMgb3V0c2lkZSB0aGUgb3JnYW5pemF0aW9uLlxuICovXG5jb25zdCBQVUxMX1JFUVVFU1RfVEVNUExBVEVfUlVMRVMgPSBgLSBCYXNlIHRoZSBQUiBib2R5IG9uIFxcYC5naXRodWIvcHVsbF9yZXF1ZXN0X3RlbXBsYXRlLm1kXFxgIHdoZW4gY3JlYXRpbmcgb3IgdXBkYXRpbmcgYSBQUiwgZXZlbiB3aGVuIGEgc2tpbGwgb3Igd29ya2Zsb3cgc3VwcGxpZXMgaXRzIG93biBza2VsZXRvbjoga2VlcCB0aGUgdGVtcGxhdGUncyBoZWFkaW5ncyBpbiBvcmRlciwgZmlsbCBlYWNoIHNlY3Rpb24gd2l0aCB3aGF0IGl0cyBwbGFjZWhvbGRlciBjb21tZW50IGFza3MgZm9yIGF0IGEgbGVuZ3RoIGZpdHRpbmcgdGhlIGNoYW5nZSAoYSBzZW50ZW5jZSBmb3IgYSBzbWFsbCBjaGFuZ2UsIG51bWJlcmVkIHN1YnNlY3Rpb25zIGZvciBhIGxhcmdlIG9uZSksIGFuZCBkZWxldGUgdGhlIHBsYWNlaG9sZGVyIGNvbW1lbnRzIGFuZCBhbiBlbXB0eSBOb3RlcyBzZWN0aW9uLiBXaXRob3V0IGEgdGVtcGxhdGUsIHVzZSBubyBmaXhlZCBoZWFkaW5nczogc3RhdGUgdGhlIHNjb3BlLCB0aGUgbW90aXZhdGlvbiwgYW5kIHRoZSB2ZXJpZmljYXRpb24gY29uY2lzZWx5LlxuLSBTdGFydCB0aGUgYm9keSB3aXRoIFxcYENsb3NlICM8bj5cXGAgb25seSB3aGVuIHRoZSBQUiByZXNvbHZlcyBhbiBleGlzdGluZyBpc3N1ZS5gO1xuXG4vKipcbiAqIEhvdyBhIHRvb2wgdGhhdCB3cml0ZXMgb3IgcmV3cml0ZXMgYSBQUiBib2R5IGZpbGxzIHRoZSBSZXF1aXJlbWVudHMgc2VjdGlvbiBvZlxuICogYFBVTExfUkVRVUVTVF9TRUNUSU9OU2AsIGFzIG1hcmtkb3duIGJ1bGxldHMgZm9yIGFuIGFnZW50J3MgaW5zdHJ1Y3Rpb25zLiBTa2lsbHMgdGhhdCBkcmFmdCBQUlxuICogYm9kaWVzIHJlbmRlciB0aGlzIHRleHQgaW5zdGVhZCBvZiByZXN0YXRpbmcgaXQsIHNvIHRoZSB3cml0ZXJzIGFuZCB0aGUgcmV2aWV3ZXJzIHRoYXQgcmVhZCB0aGVcbiAqIHNlY3Rpb24gYXMgdGhlIGJvdW5kYXJ5IGEgZml4IG11c3Qga2VlcCBuZXZlciBkaXNhZ3JlZSBvbiB3aGF0IGEgbGluZSBtZWFucy5cbiAqL1xuZXhwb3J0IGNvbnN0IFBVTExfUkVRVUVTVF9SRVFVSVJFTUVOVFNfUlVMRVMgPSBgLSBSZXF1aXJlbWVudHMgc2VjdGlvbjogdGhlIHJlcXVpcmVtZW50cyBpbiBmb3JjZSBub3csIG9uZSBsaW5lIHBlciByZXF1aXJlbWVudCwgdGFrZW4gZnJvbSB0aGUgcmVxdWVzdGVyJ3MgaW5zdHJ1Y3Rpb25zIGluIHRoZSByZXF1ZXN0ZXIncyB0ZXJtcyAodGhlIGlzc3VlLCB0aGUgY29udmVyc2F0aW9uIHRoYXQgYXNrZWQgZm9yIHRoZSBjaGFuZ2UpLCBlYWNoIG1hcmtlZCBcXGByZXF1aXJlZFxcYCAoYXNrZWQgZm9yLCBvciBhbiBleGlzdGluZyBjb250cmFjdCBjYWxsZXJzIGRlcGVuZCBvbikgb3IgXFxgY2hvc2VuXFxgICh5b3VyIG93biBkZWNpc2lvbiB3aXRoIHRoZSByZWFzb24gdGhhdCBkZWNpZGVkIGl0LCB3aGljaCBhIHNpbXBsZXIgZGVzaWduIG1heSByZXBsYWNlKS4gTmV2ZXIgaW5mZXIgYSByZXF1aXJlbWVudCBmcm9tIHRoZSBkaWZmOiB3aGVuIG5vIGlzc3VlLCBQUiBtZXNzYWdlLCBvciBjb252ZXJzYXRpb24gc3RhdGVzIHRoZSByZXF1ZXN0LCB3cml0ZSBcXGByZXF1aXJlZDogbm90IHJlY29yZGVkIOKAlCBhc2sgdGhlIHJlcXVlc3RlclxcYCBhcyB0aGUgb25seSByZXF1ZXN0LWRlcml2ZWQgbGluZSAoYSBcXGByZXF1aXJlZFxcYCBsaW5lIGZvciBhbiBleGlzdGluZyBjb250cmFjdCBjYWxsZXJzIGRlcGVuZCBvbiBtYXkgc3RpbGwgYmUgbGlzdGVkKSBhbmQgc2F5IHNvIGluIE5vdGVzLlxuLSBDdXJyZW50LXN0YXRlIHJ1bGU6IGFuIGV4aXN0aW5nIFJlcXVpcmVtZW50cyBzZWN0aW9uIHJlY29yZHMgd2hhdCB0aGUgcmVxdWVzdGVyIGFza2VkIGZvciBhbmQgd2hhdCB3YXMgZGVjaWRlZCBhcyBpdCBzdGFuZHMgbm93OyBpdCBpcyBuZWl0aGVyIGEgZGVzY3JpcHRpb24gb2YgdGhlIGRpZmYgbm9yIGEgbG9nIG9mIGhvdyB0aGUgcmVxdWVzdCBldm9sdmVkLiBLZWVwIGVhY2ggbGluZSBhcyBpdCBpcyB1bnRpbCB0aGUgcmVxdWVzdGVyIG92ZXJyaWRlcyBvciB3aXRoZHJhd3MgdGhlIGluc3RydWN0aW9uIGJlaGluZCBpdCBvciB0aGUgZGVjaXNpb24gYmVoaW5kIGl0IGNoYW5nZXMsIGFuZCB0aGVuIHJld3JpdGUgb3IgcmVtb3ZlIHRoYXQgbGluZSBpbnN0ZWFkIG9mIGFwcGVuZGluZyBhIGxpbmUgYmVzaWRlIGl0OyB3aXRoIG5vIGluc3RydWN0aW9ucyBhdmFpbGFibGUsIGtlZXAgdGhlIHJlcXVlc3Rlci1kZXJpdmVkIGxpbmVzIHVuY2hhbmdlZC4gTmV2ZXIgbWFyayB3aGVuIGEgbGluZSB3YXMgYWRkZWQgKGUuZy4sIFwiKGFkZGVkKVwiKSwgYW5kIGFkZCBhIFxcYGNob3NlblxcYCBsaW5lIGZvciBlYWNoIG5ldyBkZWNpc2lvbi4gV2hlbiB0aGUgY3VycmVudCBkZXNpZ24gY2Fubm90IGJlIHVuZGVyc3Rvb2Qgd2l0aG91dCB0aGUgY2hhbmdlIG9mIGRpcmVjdGlvbiwgc3RhdGUgaXQgaW4gb25lIHNlbnRlbmNlIGluIE5vdGVzLiBBIHNlY3Rpb24gdGhhdCBtZXJlbHkgZGVzY3JpYmVzIHRoZSBpbXBsZW1lbnRhdGlvbiwgb3IgaG9sZHMgb25seSB0aGUgdGVtcGxhdGUncyBwbGFjZWhvbGRlciBvciBhIFxcYHJlcXVpcmVkOiBub3QgcmVjb3JkZWRcXGAgbGluZSwgaXMgbm90IGEgcmVjb3JkOiB3cml0ZSBpdCBhZnJlc2ggYnkgdGhlIHJ1bGUgYWJvdmUuXG4tIFBsYWNlIHRoZSBzZWN0aW9uIHdoZXJlIHRoZSB0ZW1wbGF0ZSBwdXRzIGl0OyB3aGVuIHRoZSB0ZW1wbGF0ZSBoYXMgbm8gc3VjaCBoZWFkaW5nLCByaWdodCBhZnRlciB0aGUgaXNzdWUtY2xvc2luZyBsaW5lLCBvciBhdCB0aGUgdG9wIG9mIHRoZSBib2R5IHdoZW4gdGhlcmUgaXMgbm9uZS5cbi0gTmV2ZXIgZHJvcCBvciB3ZWFrZW4gYSBcXGByZXF1aXJlZFxcYCBsaW5lIHRvIGZpdCB3aGF0IHdhcyBpbXBsZW1lbnRlZDogd2hlbiBvbmUgY2Fubm90IGhvbGQgaW4gdGhlIGRpZmYsIGtlZXAgaXQgYW5kIHNheSBzbyBpbiBOb3Rlcy5gO1xuXG4vKiogVGhlIGNvbXBsZXRlIHJ1bGVzIGZvciB3cml0aW5nIGEgUFIgYm9keTogdGhlIHRlbXBsYXRlIHJ1bGVzIGZvbGxvd2VkIGJ5IHRoZSBSZXF1aXJlbWVudHMgcnVsZXMuICovXG5leHBvcnQgY29uc3QgUFVMTF9SRVFVRVNUX0JPRFlfUlVMRVMgPSBgJHtQVUxMX1JFUVVFU1RfVEVNUExBVEVfUlVMRVN9XFxuJHtQVUxMX1JFUVVFU1RfUkVRVUlSRU1FTlRTX1JVTEVTfWA7XG5cbi8qKlxuICogSG93IGEgdG9vbCB0aGF0IGNyZWF0ZXMgYW4gaXNzdWUgZGVyaXZlcyBpdCBmcm9tIHRoZSByZXBvc2l0b3J5J3MgaXNzdWUgdGVtcGxhdGVzLCBhcyBtYXJrZG93blxuICogYnVsbGV0cyBmb3IgYW4gYWdlbnQncyBpbnN0cnVjdGlvbnM7IHNoYXJlZCBieSB0aGUgc2FtZSB3cml0ZXJzIGFzIGBQVUxMX1JFUVVFU1RfQk9EWV9SVUxFU2AuXG4gKiBHdWlkYW5jZSB0aGUgdGVtcGxhdGVzIHN0YXRlIGluIHRoZWlyIG93biBwbGFjZWhvbGRlciBjb21tZW50cyAod2hpY2ggc2VjdGlvbnMgdG8ga2VlcCwgZGVsZXRpbmdcbiAqIHRoZSBjb21tZW50cykgaXMgZGVsaWJlcmF0ZWx5IG5vdCByZXBlYXRlZCBoZXJlLCBzaW5jZSB0aGUgd3JpdGVyIHJlYWRzIHRoZSB0ZW1wbGF0ZSBhbnl3YXkuXG4gKi9cbmV4cG9ydCBjb25zdCBJU1NVRV9URU1QTEFURV9SVUxFUyA9IGAtIEZvbGxvdyB0aGUgY2xvc2VzdCB0ZW1wbGF0ZSB1bmRlciBcXGAuZ2l0aHViL0lTU1VFX1RFTVBMQVRFL1xcYDogXFxgYnVnLm1kXFxgIGZvciB3cm9uZyBiZWhhdmlvciwgXFxgY2hhbmdlLm1kXFxgIGZvciBhbnl0aGluZyB0byBidWlsZCBvciBhbHRlcjsgYSBxdWVzdGlvbiBvciBub3RlIGZpdHRpbmcgbmVpdGhlciwgb3IgYSByZXBvc2l0b3J5IHdpdGhvdXQgdGVtcGxhdGVzLCBuZWVkcyBubyB0ZW1wbGF0ZS5cbi0gVGl0bGU6IGEgQ29udmVudGlvbmFsIENvbW1pdHMgcHJlZml4IGZvciB0aGUgdHlwZSB0aGF0IGZpdHMgdGhlIGNoYW5nZSAoXFxgZmVhdDpcXGAsIFxcYGZpeDpcXGAsIFxcYHJlZmFjdG9yOlxcYCwgXFxgZG9jczpcXGAsIFxcYGNob3JlOlxcYCwgLi4uKTsgd2hlbiBpdCBkaWZmZXJzIGZyb20gdGhlIHRlbXBsYXRlJ3MgXFxgdGl0bGVcXGAgcHJlZml4LCByZXBsYWNlIHRoZSB0ZW1wbGF0ZSdzIHR5cGUgbGFiZWwgKFxcYHQ6IC4uLlxcYCkgd2l0aCB0aGUgb25lIG1hdGNoaW5nIHRoZSB0eXBlLlxuLSBUaGUgWUFNTCBmcm9udCBtYXR0ZXIgYmV0d2VlbiB0aGUgXFxgLS0tXFxgIGxpbmVzIGlzIG1ldGFkYXRhLCBub3QgYm9keSB0ZXh0OiBwYXNzIGl0cyBcXGBsYWJlbHNcXGAgdmlhIFxcYC0tbGFiZWxcXGAgYW5kIHN1Ym1pdCBvbmx5IHRoZSBjb250ZW50IGJlbG93IHRoZSBjbG9zaW5nIFxcYC0tLVxcYCBhcyB0aGUgYm9keS5gO1xuXG4vKiogU2VjdGlvbnMgb2YgYSBidWcgcmVwb3J0LCBpbiB0aGUgb3JkZXIgdGhleSBhcHBlYXIgaW4gdGhlIGlzc3VlIHRlbXBsYXRlLiAqL1xuZXhwb3J0IGNvbnN0IEJVR19JU1NVRV9TRUNUSU9OUzogcmVhZG9ubHkgVGVtcGxhdGVTZWN0aW9uW10gPSBbXG4gIHsgaGVhZGluZzogJ1Byb2JsZW0nLCByZXF1aXJlbWVudDogJ3doYXQgaGFwcGVucywgYW5kIHdoYXQgc2hvdWxkIGhhcHBlbiBpbnN0ZWFkJyB9LFxuICB7IGhlYWRpbmc6ICdFdmlkZW5jZScsIHJlcXVpcmVtZW50OiAncmVwcm9kdWN0aW9uIHN0ZXBzLCBsb2dzLCBydW4gSURzLCBvciBsaW5rcycgfSxcbiAgeyBoZWFkaW5nOiAnSW1wYWN0JywgcmVxdWlyZW1lbnQ6ICd3aG8gb3Igd2hhdCBpcyBhZmZlY3RlZCwgYW5kIGhvdyBiYWRseScgfSxcbiAgeyBoZWFkaW5nOiAnUHJvcG9zYWwnLCByZXF1aXJlbWVudDogJ3RoZSBmaXggeW91IGhhdmUgaW4gbWluZCwgYW5kIHRoZSByb290IGNhdXNlIGlmIGtub3duJyB9LFxuXTtcblxuLyoqXG4gKiBTZWN0aW9ucyBhIGNoYW5nZSBzcGVjaWZpY2F0aW9uIG11c3Qgc2V0dGxlIGJlZm9yZSBhIHRoaXJkIHBhcnR5IGNhbiBpbXBsZW1lbnQgaXQsIGRlZmluZWRcbiAqIG9uY2Ugc28gdGhhdCB0aGUgaXNzdWUgdGVtcGxhdGUgYW5kIGFueSB0b29sIHRoYXQgZHJhZnRzIG9yIHJldmlld3Mgc3BlY2lmaWNhdGlvbnMgYWdhaW5zdFxuICogdGhlc2Ugc2VjdGlvbnMgY2Fubm90IGRyaWZ0IGFwYXJ0OyBjaGVja2xpc3QgY29uc3VtZXJzIHJlbmRlciBpdCB3aXRoIGByZW5kZXJTZWN0aW9uQ2hlY2tsaXN0YC5cbiAqIFRoZSBmaXJzdCB0aHJlZSBzZWN0aW9ucyBzdWZmaWNlIGZvciBhIHNtYWxsIGNoYW5nZSwgc28gdGhleSBjb21lIGZpcnN0LlxuICovXG5leHBvcnQgY29uc3QgQ0hBTkdFX0lTU1VFX1NFQ1RJT05TOiByZWFkb25seSBUZW1wbGF0ZVNlY3Rpb25bXSA9IFtcbiAge1xuICAgIGhlYWRpbmc6ICdCYWNrZ3JvdW5kIGFuZCBnb2FsJyxcbiAgICByZXF1aXJlbWVudDogJ3RoZSBwcm9ibGVtIGJlaW5nIHNvbHZlZCwgZm9yIHdob20sIGFuZCB3aGF0IG91dGNvbWUgY291bnRzIGFzIHN1Y2Nlc3MnLFxuICB9LFxuICB7XG4gICAgaGVhZGluZzogJ0JlaGF2aW9yJyxcbiAgICByZXF1aXJlbWVudDpcbiAgICAgICdldmVyeSB1c2VyLSBvciBjYWxsZXItb2JzZXJ2YWJsZSBiZWhhdmlvciwgaW5jbHVkaW5nIGlucHV0cywgb3V0cHV0cywgZXJyb3IgY2FzZXMsIGVkZ2UgY2FzZXMsIGFuZCBpbnRlcmFjdGlvbnMgd2l0aCBleGlzdGluZyBiZWhhdmlvciwgc3RhdGVkIHByZWNpc2VseSBlbm91Z2ggdGhhdCB0d28gaW1wbGVtZW50ZXJzIHdvdWxkIGJ1aWxkIHRoZSBzYW1lIHRoaW5nJyxcbiAgfSxcbiAge1xuICAgIGhlYWRpbmc6ICdBY2NlcHRhbmNlIGNyaXRlcmlhJyxcbiAgICByZXF1aXJlbWVudDpcbiAgICAgICdjaGVja2FibGUgY29uZGl0aW9ucyAoR2l2ZW4vV2hlbi9UaGVuIG9yIGFuIGVxdWl2YWxlbnQpIHRoYXQgZGVjaWRlIHdoZXRoZXIgdGhlIGltcGxlbWVudGF0aW9uIGlzIGRvbmUnLFxuICB9LFxuICB7XG4gICAgaGVhZGluZzogJ1Njb3BlIGFuZCBub24tZ29hbHMnLFxuICAgIHJlcXVpcmVtZW50OiAnd2hhdCB0aGUgY2hhbmdlIGNvdmVycyBhbmQgd2hhdCBpdCBkZWxpYmVyYXRlbHkgbGVhdmVzIG91dCwgc28gYW4gaW1wbGVtZW50ZXIga25vd3Mgd2hlcmUgdG8gc3RvcCcsXG4gIH0sXG4gIHtcbiAgICBoZWFkaW5nOiAnRGVzaWduIGNvbnN0cmFpbnRzJyxcbiAgICByZXF1aXJlbWVudDpcbiAgICAgICd0aGUgZGF0YSwgQVBJLCBzY2hlbWEsIFVJLCBhbmQgY29uZmlndXJhdGlvbiBjaGFuZ2VzLCBuYW1pbmcsIGFuZCB0aGUgZXhpc3RpbmcgY29kZSBvciBjb252ZW50aW9ucyB0aGUgaW1wbGVtZW50YXRpb24gbXVzdCBmaXQg4oCUIGFzIGZhciBhcyB0aGUgd3JpdGVyIGludGVuZHMgdG8gY29uc3RyYWluIHRoZW0sIHdpdGggZXZlcnl0aGluZyBlbHNlIGV4cGxpY2l0bHkgbGVmdCB0byB0aGUgaW1wbGVtZW50ZXInLFxuICB9LFxuICB7XG4gICAgaGVhZGluZzogJ0NvbXBhdGliaWxpdHkgYW5kIG1pZ3JhdGlvbicsXG4gICAgcmVxdWlyZW1lbnQ6ICd3aGF0IGV4aXN0aW5nIGRhdGEsIHVzZXJzLCBjYWxsZXJzLCBvciBjb25maWd1cmF0aW9ucyBhcmUgYWZmZWN0ZWQgYW5kIGhvdyB0aGUgdHJhbnNpdGlvbiBoYXBwZW5zJyxcbiAgfSxcbiAge1xuICAgIGhlYWRpbmc6ICdWZXJpZmljYXRpb24nLFxuICAgIHJlcXVpcmVtZW50OiAnaG93IHRoZSBjaGFuZ2UgaXMgdGVzdGVkIG9yIGRlbW9uc3RyYXRlZCwgaW5jbHVkaW5nIHdoYXQgbmVlZHMgbm8gdGVzdCBhbmQgd2h5JyxcbiAgfSxcbiAge1xuICAgIGhlYWRpbmc6ICdPcGVuIHF1ZXN0aW9ucycsXG4gICAgcmVxdWlyZW1lbnQ6ICd1bmRlY2lkZWQgcG9pbnRzLCBlYWNoIHdpdGggaXRzIG9wdGlvbnM7IGVtcHR5IG9uY2UgdGhlIHNwZWNpZmljYXRpb24gaXMgaW1wbGVtZW50YWJsZScsXG4gIH0sXG5dO1xuXG4vKiogUmVuZGVycyBzZWN0aW9ucyBhcyBtYXJrZG93biBidWxsZXRzIChgLSAqKkhlYWRpbmcqKjogcmVxdWlyZW1lbnRgKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJTZWN0aW9uQ2hlY2tsaXN0KHNlY3Rpb25zOiByZWFkb25seSBUZW1wbGF0ZVNlY3Rpb25bXSk6IHN0cmluZyB7XG4gIHJldHVybiBzZWN0aW9ucy5tYXAoKHNlY3Rpb24pID0+IGAtICoqJHtzZWN0aW9uLmhlYWRpbmd9Kio6ICR7c2VjdGlvbi5yZXF1aXJlbWVudH1gKS5qb2luKCdcXG4nKTtcbn1cblxuLyoqIFJlbmRlcnMgc2VjdGlvbnMgYXMgbWFya2Rvd24gaGVhZGluZ3MsIGVhY2ggZm9sbG93ZWQgYnkgaXRzIHJlcXVpcmVtZW50IGFzIGEgcGxhY2Vob2xkZXIgY29tbWVudC4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJTZWN0aW9uVGVtcGxhdGUoc2VjdGlvbnM6IHJlYWRvbmx5IFRlbXBsYXRlU2VjdGlvbltdKTogc3RyaW5nIHtcbiAgcmV0dXJuIHNlY3Rpb25zXG4gICAgLm1hcChcbiAgICAgIChzZWN0aW9uKSA9PlxuICAgICAgICBgIyMgJHtzZWN0aW9uLmhlYWRpbmd9XFxuXFxuPCEtLSAke3NlY3Rpb24ucmVxdWlyZW1lbnQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCl9JHtzZWN0aW9uLnJlcXVpcmVtZW50LnNsaWNlKDEpfS4gLS0+YFxuICAgIClcbiAgICAuam9pbignXFxuXFxuJyk7XG59XG4iLCJleHBvcnQgYXN5bmMgZnVuY3Rpb24gc2xlZXAobWlsbGlzZWNvbmRzOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1pbGxpc2Vjb25kcykpO1xufVxuIiwiaW1wb3J0IHsgc2xlZXAgfSBmcm9tICcuL3NsZWVwLmpzJztcblxuLyoqXG4gKiBDb252ZXJ0IGFuIG9iamVjdCB0byBhbiBlcnJvci5cbiAqIEBwYXJhbSBvYmogVGhlIG9iamVjdCB0byBjb252ZXJ0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXJyb3JpZnkob2JqOiB1bmtub3duKTogRXJyb3Ige1xuICBpZiAob2JqIGluc3RhbmNlb2YgRXJyb3IpIHJldHVybiBvYmo7XG4gIGlmICh0eXBlb2Ygb2JqID09PSAnc3RyaW5nJykgcmV0dXJuIG5ldyBFcnJvcihvYmopO1xuICAvLyBgSlNPTi5zdHJpbmdpZnlgIGFuc3dlcnMgYHVuZGVmaW5lZGAgZm9yIGB1bmRlZmluZWRgLCBhIHN5bWJvbCBhbmQgYSBmdW5jdGlvbiwgYW5kIHRocm93c1xuICAvLyBvbiBhIGJpZ2ludCBvciBhIGN5Y2xlOyBgbmV3IEVycm9yKHVuZGVmaW5lZClgIGhhcyBhbiBlbXB0eSBtZXNzYWdlLCB3aGljaCB3b3VsZCBkcm9wIHRoZVxuICAvLyBvbmx5IGRpYWdub3N0aWMgYSBjYWxsZXIgaGFzIGFib3V0IHN1Y2ggYSB0aHJvd24gdmFsdWUuIE5laXRoZXIgcmVwcmVzZW50YXRpb24gbWF5IHRocm93XG4gIC8vIG91dCBvZiBoZXJlOiB0aGlzIHJ1bnMgaW4gYSBjYXRjaCBibG9jaywgd2hlcmUgaXQgd291bGQgcmVwbGFjZSB0aGUgZXJyb3IgaXQgY29udmVydHMuXG4gIHJldHVybiBuZXcgRXJyb3IoaWdub3JlRXJyb3IoKCkgPT4gSlNPTi5zdHJpbmdpZnkob2JqKSkgPz8gaWdub3JlRXJyb3IoKCkgPT4gU3RyaW5nKG9iaikpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlnbm9yZUVycm9yPFQ+KGZuOiAoKSA9PiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaWdub3JlRW5vZW50PFQ+KGZuOiAoKSA9PiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgJiYgJ2NvZGUnIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFcnJvckFzeW5jPFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaWdub3JlRW5vZW50QXN5bmM8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXRyeU9wdGlvbnMge1xuICBiZWZvcmVSZXRyeT86IChlcnJvcjogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgaGFuZGxlRXJyb3I/OiAoZXJyb3I6IHVua25vd24pID0+IFByb21pc2U8dm9pZD47XG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgdG90YWwgYXR0ZW1wdHMsIGluY2x1ZGluZyB0aGUgaW5pdGlhbCBhdHRlbXB0LlxuICAgKiBGb3IgZXhhbXBsZSwgYHJldHJ5Q291bnQ6IDNgIHJ1bnMgdGhlIGZ1bmN0aW9uIGF0IG1vc3QgMyB0aW1lczogMSBpbml0aWFsIGF0dGVtcHQgYW5kIHVwIHRvIDIgcmV0cmllcy5cbiAgICovXG4gIHJldHJ5Q291bnQ/OiBudW1iZXI7XG4gIHJldHJ5TG9nZ2VyPzogKG1lc3NhZ2U6IHN0cmluZykgPT4gdm9pZDtcbiAgc2hvdWxkUmV0cnk/OiAoZXJyb3I6IHVua25vd24pID0+IGJvb2xlYW47XG4gIC8qKlxuICAgKiBEZWNpZGVzIGhvdyBsb25nIHRvIHdhaXQgYmVmb3JlIHJldHJ5aW5nIGFmdGVyIGBlcnJvcmAsIGdpdmVuIHRoZSBiYWNrb2ZmIGBzbGVlcE1pbGxpc2Vjb25kc2AgaXQgd291bGQgb3RoZXJ3aXNlIHdhaXQsXG4gICAqIGUuZy4gYChlcnJvciwgbXMpID0+IE1hdGgubWF4KG1zLCByZXRyeUF0T2YoZXJyb3IpIC0gRGF0ZS5ub3coKSlgIHRvIGhvbm9yIGEgcmV0cnkgdGltZSBzZW50IGJ5IGEgc2VydmVyLlxuICAgKiBJdCBkb2VzIG5vdCBhZmZlY3QgdGhlIGJhY2tvZmYgdGhhdCBgdXBkYXRlU2xlZXBNaWxsaXNlY29uZHNgIGFkdmFuY2VzLlxuICAgKi9cbiAgZ2V0U2xlZXBNaWxsaXNlY29uZHM/OiAoZXJyb3I6IHVua25vd24sIHNsZWVwTWlsbGlzZWNvbmRzOiBudW1iZXIpID0+IG51bWJlcjtcbiAgc2xlZXBNaWxsaXNlY29uZHM/OiBudW1iZXI7XG4gIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzPzogKHNsZWVwTWlsbGlzZWNvbmRzOiBudW1iZXIpID0+IG51bWJlcjtcbn1cblxuLyoqXG4gKiBSZXRyeSB0aGUgZ2l2ZW4gZnVuY3Rpb24uXG4gKiBAcGFyYW0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmV0cnkuXG4gKiBAcGFyYW0gYmVmb3JlUmV0cnkgVGhlIGZ1bmN0aW9uIHRvIGNhbGwgaW1tZWRpYXRlbHkgYmVmb3JlIHJldHJ5aW5nLlxuICogQHBhcmFtIGhhbmRsZUVycm9yIFRoZSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gYW4gZXJyb3Igb2NjdXJzLlxuICogQHBhcmFtIHJldHJ5Q291bnQgVGhlIG1heGltdW0gbnVtYmVyIG9mIHRvdGFsIGF0dGVtcHRzLCBpbmNsdWRpbmcgdGhlIGluaXRpYWwgYXR0ZW1wdC5cbiAqIEBwYXJhbSByZXRyeUxvZ2dlciBUaGUgZnVuY3Rpb24gdG8gbG9nIHJldHJ5aW5nLlxuICogQHBhcmFtIHNsZWVwTWlsbGlzZWNvbmRzIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHNsZWVwIGJlZm9yZSByZXRyeWluZy5cbiAqIEBwYXJhbSB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcyBUaGUgZnVuY3Rpb24gdG8gdXBkYXRlIHNsZWVwIG1pbGxpc2Vjb25kcyBhZnRlciBlYWNoIHJldHJ5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2l0aFJldHJ5PFQ+KFxuICBmdW5jOiAoZmFpbGVkQ291bnQ6IG51bWJlcikgPT4gVCB8IFByb21pc2U8VD4sXG4gIHtcbiAgICBiZWZvcmVSZXRyeSxcbiAgICBoYW5kbGVFcnJvcixcbiAgICByZXRyeUNvdW50ID0gMyxcbiAgICByZXRyeUxvZ2dlcixcbiAgICBzaG91bGRSZXRyeSxcbiAgICBnZXRTbGVlcE1pbGxpc2Vjb25kcyxcbiAgICBzbGVlcE1pbGxpc2Vjb25kcyA9IDAsXG4gICAgdXBkYXRlU2xlZXBNaWxsaXNlY29uZHMsXG4gIH06IFJldHJ5T3B0aW9ucyA9IHt9XG4pOiBQcm9taXNlPFQ+IHtcbiAgbGV0IGZhaWxlZENvdW50ID0gMDtcbiAgZm9yICg7Oykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZnVuYyhmYWlsZWRDb3VudCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGF3YWl0IGhhbmRsZUVycm9yPy4oZXJyb3IpO1xuICAgICAgZmFpbGVkQ291bnQrKztcbiAgICAgIGlmIChmYWlsZWRDb3VudCA+PSByZXRyeUNvdW50KSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgaWYgKHNob3VsZFJldHJ5ICYmICFzaG91bGRSZXRyeShlcnJvcikpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBjb25zdCBjdXJyZW50U2xlZXBNaWxsaXNlY29uZHMgPSBnZXRTbGVlcE1pbGxpc2Vjb25kcz8uKGVycm9yLCBzbGVlcE1pbGxpc2Vjb25kcykgPz8gc2xlZXBNaWxsaXNlY29uZHM7XG4gICAgICBpZiAoY3VycmVudFNsZWVwTWlsbGlzZWNvbmRzID4gMCkge1xuICAgICAgICBhd2FpdCBzbGVlcChjdXJyZW50U2xlZXBNaWxsaXNlY29uZHMpO1xuICAgICAgfVxuICAgICAgaWYgKHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzKSB7XG4gICAgICAgIHNsZWVwTWlsbGlzZWNvbmRzID0gdXBkYXRlU2xlZXBNaWxsaXNlY29uZHMoc2xlZXBNaWxsaXNlY29uZHMpO1xuICAgICAgfVxuICAgICAgcmV0cnlMb2dnZXI/LihgUmV0cnkgZHVlIHRvOiAke2Vycm9yfVxuJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gJy0tLVxcbicgKyAoZXJyb3Iuc3RhY2sgPz8gJycpIDogJyd9YCk7XG4gICAgICBhd2FpdCBiZWZvcmVSZXRyeT8uKGVycm9yKTtcbiAgICB9XG4gIH1cbn1cbiIsIi8qKiBFc2NhcGVzIGV2ZXJ5IFJlZ0V4cCBtZXRhY2hhcmFjdGVyIHNvIHRoZSB0ZXh0IG1hdGNoZXMgaXRzZWxmIGxpdGVyYWxseS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlc2NhcGVSZWdFeHAodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRleHQucmVwbGFjZUFsbCgvWyQoKSorLj9bXFxcXFxcXV57fH1dL2d1LCBTdHJpbmcucmF3YFxcJCZgKTtcbn1cblxuLyoqIEEgUE9TSVggc2hlbGwgd29yZDogc2FmZSBjaGFyYWN0ZXJzIHBhc3MgdGhyb3VnaCwgYW55dGhpbmcgZWxzZSBpcyBzaW5nbGUtcXVvdGVkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHF1b3RlRm9yU2hlbGwodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiAvXltcXHcuLy1dKyQvdS50ZXN0KHZhbHVlKSA/IHZhbHVlIDogYCcke3ZhbHVlLnJlcGxhY2VBbGwoXCInXCIsIFN0cmluZy5yYXdgJ1xcJydgKX0nYDtcbn1cblxuLyoqXG4gKiBXcmFwcyB0ZXh0IGluIGEgTWFya2Rvd24gY29kZSBibG9jayBmZW5jZWQgd2l0aCB0aWxkZXMsIHdoaWNoIGFyZSByYXJlciB0aGFuIGJhY2t0aWNrcyBpbiBNYXJrZG93biBjb250ZW50LlxuICogVGhlIGZlbmNlIGlzIGxvbmdlciB0aGFuIGFueSBydW4gb2YgdGlsZGVzIGluIHRoZSB0ZXh0IHNvIHRoYXQgdGhlIHRleHQgY2Fubm90IGNsb3NlIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9UaWxkZUNvZGVCbG9jayh0ZXh0OiBzdHJpbmcsIGxhbmd1YWdlID0gJycpOiBzdHJpbmcge1xuICByZXR1cm4gdG9GZW5jZWRDb2RlQmxvY2soJ34nLCB0ZXh0LCBsYW5ndWFnZSk7XG59XG5cbi8qKlxuICogV3JhcHMgdGV4dCBpbiBhIE1hcmtkb3duIGNvZGUgYmxvY2sgZmVuY2VkIHdpdGggYmFja3RpY2tzLlxuICogVGhlIGZlbmNlIGlzIGxvbmdlciB0aGFuIGFueSBydW4gb2YgYmFja3RpY2tzIGluIHRoZSB0ZXh0IHNvIHRoYXQgdGhlIHRleHQgY2Fubm90IGNsb3NlIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9Db2RlQmxvY2sodGV4dDogc3RyaW5nLCBsYW5ndWFnZSA9ICcnKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRvRmVuY2VkQ29kZUJsb2NrKCdgJywgdGV4dCwgbGFuZ3VhZ2UpO1xufVxuXG5mdW5jdGlvbiB0b0ZlbmNlZENvZGVCbG9jayhmZW5jZUNoYXI6IHN0cmluZywgdGV4dDogc3RyaW5nLCBsYW5ndWFnZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgc2hvcnRlc3RGZW5jZSA9IGZlbmNlQ2hhci5yZXBlYXQoMyk7XG4gIGxldCBsb25nZXN0UnVuID0gMjtcbiAgbGV0IHN0YXJ0ID0gdGV4dC5pbmRleE9mKHNob3J0ZXN0RmVuY2UpO1xuICB3aGlsZSAoc3RhcnQgIT09IC0xKSB7XG4gICAgbGV0IGVuZCA9IHN0YXJ0ICsgMztcbiAgICB3aGlsZSAodGV4dFtlbmRdID09PSBmZW5jZUNoYXIpIGVuZCsrO1xuICAgIGxvbmdlc3RSdW4gPSBNYXRoLm1heChsb25nZXN0UnVuLCBlbmQgLSBzdGFydCk7XG4gICAgc3RhcnQgPSB0ZXh0LmluZGV4T2Yoc2hvcnRlc3RGZW5jZSwgZW5kKTtcbiAgfVxuICBsZXQgbGFuZ3VhZ2VTdGFydCA9IDA7XG4gIHdoaWxlIChsYW5ndWFnZVtsYW5ndWFnZVN0YXJ0XSA9PT0gZmVuY2VDaGFyKSBsYW5ndWFnZVN0YXJ0Kys7XG4gIGNvbnN0IGZlbmNlID0gZmVuY2VDaGFyLnJlcGVhdChsb25nZXN0UnVuICsgMSArIGxhbmd1YWdlU3RhcnQpO1xuICByZXR1cm4gYCR7ZmVuY2V9JHtsYW5ndWFnZS5zbGljZShsYW5ndWFnZVN0YXJ0KX1cXG4ke3RleHR9JHt0ZXh0LmVuZHNXaXRoKCdcXG4nKSA/ICcnIDogJ1xcbid9JHtmZW5jZX1gO1xufVxuIiwiLyoqXG4gKiBXaGVuIHRvIHdyaXRlIGEgdGVzdCBhbmQgd2hhdCBhIHRlc3QgbWF5IGFzc2VydCwgYXMgbWFya2Rvd24gYnVsbGV0cyBmb3IgYW4gYWdlbnQncyBpbnN0cnVjdGlvbnMuXG4gKiBTdGF0ZWQgb25jZSBoZXJlIGFuZCByZW5kZXJlZCBieSB0aGUgZ2VuZXJhdGVkIGFnZW50IGluc3RydWN0aW9ucyBhbmQgdGhlIHRlc3Rpbmcgc2tpbGwgc28gdGhlXG4gKiB0d28gY2Fubm90IGRyaWZ0IGFwYXJ0LlxuICovXG5leHBvcnQgY29uc3QgVEVTVF9XUklUSU5HX1JVTEVTID0gYC0gV3JpdGUgYSB0ZXN0IG9ubHkgd2hlbiBleHBsaWNpdGx5IHJlcXVlc3RlZCwgb3Igd2hlbiBhIGJlaGF2aW9yIGlzIGxpa2VseSB0byByZWdyZXNzIGFuZCBubyBleGlzdGluZyBhdXRvbWF0aWMgY2hlY2sgKHR5cGUgY2hlY2tpbmcsIGxpbnRpbmcsIGFuIGV4aXN0aW5nIHRlc3Qgb3IgQ0kgY2hlY2spIHdvdWxkIGNhdGNoIHRoZSBicmVha2FnZS4gTmV2ZXIgYWRkIGEgdGVzdCB0aGF0IG1lcmVseSByZXN0YXRlcyBhIG1hcHBpbmcgZnJvbSBjb25kaXRpb25zIHRvIGNvbnN0YW50IG91dHB1dHMgKGl0IGZhaWxzIG9ubHkgb24gaW50ZW50aW9uYWwgZWRpdHMpIG9yIHRoYXQgb25seSBjb25maXJtcyBhbiBleHRlcm5hbCBmYWN0IChhIGxpYnJhcnkncyBiZWhhdmlvciwgd2hldGhlciBhIHZlcnNpb24gZml4ZXMgYW4gaXNzdWUpOyB2ZXJpZnkgdGhvc2Ugb25jZSBtYW51YWxseS5cbi0gVGVzdCBleHRlcm5hbGx5IG9ic2VydmFibGUgYmVoYXZpb3IgKGUuZy4sIGVtaXR0ZWQgZmlsZXMsIENMSSBvdXRwdXQsIHJlbmRlcmVkIHJlc3VsdHMpIGF0IHRoZSBzeXN0ZW0gYm91bmRhcnksIG5vdCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzOiBkbyBub3QgbWlycm9yIHByb2R1Y3Rpb24gbG9naWMsIGFzc2VydCB0aGF0IGEgYnJhbmNoIGlzIHRha2VuLCBvciBmZWVkIGhhbmQtYXNzZW1ibGVkIGludGVybmFsIG9iamVjdHMgdG8gaW50ZXJuYWwgZnVuY3Rpb25zLlxuLSBQcmVmZXIgYWN0dWFsIEFQSSBjYWxscyBvdmVyIG1vY2tzLCB1bmxlc3MgYWN0dWFsIGNhbGxzIGFyZSBpbXByYWN0aWNhbCwgaGF2ZSB1bmludGVuZGVkIHNpZGUgZWZmZWN0cywgb3IgbW9ja3MgYXJlIGV4cGxpY2l0bHkgcmVxdWVzdGVkLlxuLSBFbnN1cmUgdGVzdHMgYXJlIGlkZW1wb3RlbnQgYW5kIGluZGVwZW5kZW50IChlLmcuLCByZXNldCBwZXJzaXN0ZW50IGRhdGEpIHNvIHRoZXkgY2FuIHJ1biByZXBlYXRlZGx5IG9yIGluIHBhcmFsbGVsLlxuLSBBdm9pZCBmaXhlZCB3YWl0cyBpbiBFMkUgdGVzdHM7IHdhaXQgZm9yIGNvbmRpdGlvbnMgaW5zdGVhZC5gO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYic7XG5cbi8qKiBUaGUgYHdvcmtzcGFjZXNgIGZpZWxkIG9mIGEgcm9vdCBwYWNrYWdlLmpzb246IHRoZSBhcnJheSBmb3JtIG9yIFlhcm4gdjEncyBvYmplY3QgZm9ybS4gKi9cbmV4cG9ydCB0eXBlIFdvcmtzcGFjZXNEZWNsYXJhdGlvbiA9IHN0cmluZ1tdIHwgeyBwYWNrYWdlcz86IHN0cmluZ1tdIH0gfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogRXZlcnkgd29ya3NwYWNlIHBhY2thZ2UuanNvbiBwYXRoIChyZWxhdGl2ZSB0byB0aGUgbW9ub3JlcG8gcm9vdCwgc29ydGVkKSB0aGF0IEJ1biB3b3VsZCBsaW5rXG4gKiBmb3IgdGhlIGdpdmVuIHJvb3QgcGFja2FnZS5qc29uIGB3b3Jrc3BhY2VzYCBkZWNsYXJhdGlvbi4gQ2Fub25pY2FsaXplcyB0aGUgZGVjbGFyZWQgcGF0dGVybnNcbiAqIChzZWUgZ2V0TWVhbmluZ2Z1bERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMpLCBkcm9wcyBwYXR0ZXJucyBlc2NhcGluZyB0aGUgcmVwb3NpdG9yeSAoc2VlXG4gKiBpc0luUmVwb3NpdG9yeVdvcmtzcGFjZVBhdHRlcm4pLCBhbmQgcmVzb2x2ZXMgdGhlIHJlc3Qgd2l0aCBCdW4ncyBzZXF1ZW50aWFsIHNlbWFudGljcyAoc2VlXG4gKiByZXNvbHZlV29ya3NwYWNlUGFja2FnZUpzb25QYXRocykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlQnVuV29ya3NwYWNlUGFja2FnZUpzb25QYXRocyh3b3Jrc3BhY2VzOiBXb3Jrc3BhY2VzRGVjbGFyYXRpb24sIHJvb3REaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiByZXNvbHZlV29ya3NwYWNlUGFja2FnZUpzb25QYXRocyhcbiAgICBnZXRNZWFuaW5nZnVsRGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyh3b3Jrc3BhY2VzKS5maWx0ZXIoKHdvcmtzcGFjZVBhdHRlcm4pID0+XG4gICAgICBpc0luUmVwb3NpdG9yeVdvcmtzcGFjZVBhdHRlcm4od29ya3NwYWNlUGF0dGVybilcbiAgICApLFxuICAgIHJvb3REaXJQYXRoXG4gICk7XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgd29ya3NwYWNlIHBhdHRlcm5zIHRvIHBhY2thZ2UuanNvbiBwYXRocyBtaW1pY2tpbmcgQnVuJ3MgU0VRVUVOVElBTCBldmFsdWF0aW9uLFxuICogZGVyaXZlZCBlbXBpcmljYWxseSB3aXRoIEJ1biAxLjMuMTQgKGZpeHR1cmUgcmVwb3Mgb2JzZXJ2ZWQgdmlhIGBidW4gaW5zdGFsbCAtLWxvY2tmaWxlLW9ubHlgO1xuICogV2lsbEJvb3N0ZXIvc2hhcmVkIzEwMDQgLyBXaWxsQm9vc3Rlci9zaGFyZWQjMTAwNSk6XG4gKiAxLiBQYXR0ZXJucyBhcmUgZXZhbHVhdGVkIGluIGRlY2xhcmF0aW9uIG9yZGVyIGludG8gYW4gYWNjdW11bGF0aW5nIHNldDogYSBwb3NpdGl2ZSBnbG9iXG4gKiAgICBwYXR0ZXJuIGFkZHMgZXZlcnkgcGFja2FnZS5qc29uIGl0IG1hdGNoZXM7IGEgbmVnYXRpb24gZGVsZXRlcyBpdHMgbWF0Y2hlcyBmcm9tIHRoZSBzZXRcbiAqICAgIGFjY3VtdWxhdGVkIFNPIEZBUiwgc28gYSBsYXRlciBwb3NpdGl2ZSByZS1hZGRzIHRoZW0gKGBbXCIhYXBwcy9leGNsdWRlZFwiLCBcImFwcHMvKlwiXWAgbGlua3NcbiAqICAgIGFwcHMvZXhjbHVkZWQsIHdoaWxlIGBbXCJhcHBzLypcIiwgXCIhYXBwcy9leGNsdWRlZFwiXWAgZG9lcyBub3QpLlxuICogMi4gQSBuZWdhdGlvbiB3aG9zZSBub3JtYWxpemVkIGJvZHkgaGFzIEVYQUNUTFkgdHdvIHNlZ21lbnRzLCB3aG9zZSBsYXN0IHNlZ21lbnQgaXMgYSBzdGFyLXJ1blxuICogICAgKGAqYCwgYCoqYCwgYCoqKmAsIOKApiksIGFuZCB3aG9zZSBmaXJzdCBzZWdtZW50IGlzIE5PVCBpdHNlbGYgYSBzdGFyLXJ1biBmaXJzdCBzZWVkcyB0aGVcbiAqICAgIGltcGxpY2l0IGJhc2VsaW5lIGludG8gdGhlIHNldCwgdGhlbiBkZWxldGVzIGl0cyBvd24gbWF0Y2hlczogYSBgKipgIGxhc3Qgc2VnbWVudCBzZWVkc1xuICogICAgYCoqYCAocGFja2FnZXMgYXQgYW55IGRlcHRoKSwgYW55IG90aGVyIHN0YXItcnVuIHNlZWRzIGAqXFwvKmAgKGRlcHRoIDIgb25seSkuIFNlZWRpbmdcbiAqICAgIGhhcHBlbnMgZXZlbiBhbG9uZ3NpZGUgcG9zaXRpdmUgcGF0dGVybnMgKGBbXCJhcHBzLypcIiwgXCIhb3RoZXIvKlwiXWAgbGlua3MgZXZlcnkgZGVwdGgtMlxuICogICAgcGFja2FnZSBvdXRzaWRlIG90aGVyLykuIE5vIG90aGVyIG5lZ2F0aW9uIHNoYXBlIHNlZWRzOiBgISpgLCBgISoqYCwgYCEqXFwvKmAsIGAhKlxcLyoqYCxcbiAqICAgIGAhKipcXC8qYCwgYCFhL2IvKmAsIGAhYS9iLyoqYCwgYCFkaXJgLCBhbmQgYCFkaXIvKnhgIGVhY2ggbGluayBub3RoaW5nIG9uIHRoZWlyIG93bi5cbiAqICAgIGA/YCwgYnJhY2UsIGFuZCBjaGFyYWN0ZXItY2xhc3MgbGFzdCBzZWdtZW50cyBiZWhhdmUgRVJSQVRJQ0FMTFkgKGBbXCIhb3RoZXIvP1wiXWAgbGlua3NcbiAqICAgIHBhY2thZ2VzL2EgeWV0IG5vdCB0aGUgZXF1YWxseSBiYXNlbGluZS1zaGFwZWQgb3RoZXIveXksIGBbXCIhb3RoZXIvPz9cIl1gIGxpbmtzIG5vdGhpbmcsIGFuZFxuICogICAgYFtcIiE/Lz9cIl1gIGxpbmtzIHRoZSB2ZXJ5IG90aGVyL3ggaXQgbWF0Y2hlcyksIHNvIG5vIGNvbnNpc3RlbnQgcnVsZSBjYW4gbW9kZWwgdGhlbTsgdGhleVxuICogICAgYXJlIGRlbGliZXJhdGVseSB0cmVhdGVkIGFzIG5vdCBzZWVkaW5nIOKAlCBzZWUgaGFzSW1wbGljaXRXb3Jrc3BhY2VCYXNlbGluZSBhbmQgIzEwMDUuXG4gKiAzLiBBIG5vbi1nbG9iIHBvc2l0aXZlIHBhdHRlcm4gUElOUyBpdHMgZGlyZWN0b3J5OiBpdCBzdGF5cyBhIHdvcmtzcGFjZSByZWdhcmRsZXNzIG9mIHdoZXJlIGFcbiAqICAgIG1hdGNoaW5nIG5lZ2F0aW9uIGFwcGVhcnMgKGBbXCJvdGhlci94XCIsIFwiIW90aGVyL3hcIl1gIGFuZCBgW1wiIW90aGVyL3hcIiwgXCJvdGhlci94XCJdYCBib3RoXG4gKiAgICBsaW5rIG90aGVyL3gpLlxuICogNC4gYCoqYCBtYXRjaGVzIHplcm8gb3IgbW9yZSBwYXRoIHNlZ21lbnRzIChgW1wiYXBwcy8qKlwiXWAgbGlua3MgdGhlIHBhY2thZ2UgYXQgYXBwcyBpdHNlbGYsIGFuZFxuICogICAgYCFhcHBzLyoqYCBkZWxldGVzIGl0KSwgbWF0Y2hpbmcgZmFzdC1nbG9iJ3MgZmlsZS1nbG9iIHNlbWFudGljcy5cbiAqIERvIG5vdCBhcHBseSBnbG9iSWdub3JlIGhlcmU6IHdvcmtzcGFjZSBtZW1iZXJzaGlwIGlzIGRlZmluZWQgc29sZWx5IGJ5IHRoZSBkZWNsYXJlZCBwYXR0ZXJucyxcbiAqIGFuZCBzb3VyY2Utc2Nhbm5pbmcgaWdub3JlcyBzdWNoIGFzIGBidWlsZGAgb3IgYGRpc3RgIHdvdWxkIGhpZGUgbGVnaXRpbWF0ZWx5IG5hbWVkIHdvcmtzcGFjZVxuICogZGlyZWN0b3JpZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlV29ya3NwYWNlUGFja2FnZUpzb25QYXRocyh3b3Jrc3BhY2VQYXR0ZXJuczogc3RyaW5nW10sIHJvb3REaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIC8vIGZvbGxvd1N5bWJvbGljTGlua3M6IGZhbHNlIHN0b3BzIEdMT0IgdHJhdmVyc2FsIHRocm91Z2ggc3ltbGlua3MsIGJ1dCBhIG5vbi1nbG9iIHBhdHRlcm5cbiAgLy8gbmFtaW5nIGEgc3ltbGlua2VkIGRpcmVjdG9yeSAoZS5nLiBgbGlua2VkYCB3aXRoIGBsaW5rZWQgLT4gLi4vb3RoZXItcmVwb2ApIHN0aWxsIG1hdGNoZXMg4oCUXG4gIC8vIGZhc3QtZ2xvYiByZXNvbHZlcyBzdGF0aWMgcGF0dGVybnMgd2l0aCBkaXJlY3QgZnMgY2hlY2tzLCBhbmQgQnVuIGRvZXMgbGluayBzdWNoIGEgd29ya3NwYWNlLlxuICAvLyBEZWxpYmVyYXRlbHkgZGl2ZXJnZSBmcm9tIEJ1biB0aGVyZTogY29uc3VtZXJzIHN1Y2ggYXMgbm9kZV9tb2R1bGVzIGNsZWFudXAgYW5kIG1hbmlmZXN0XG4gIC8vIHJld3JpdGluZyB3b3VsZCBvdGhlcndpc2UgZGVsZXRlIGFuZCByZXdyaXRlIGZpbGVzIGluIEFOT1RIRVIgcmVwb3NpdG9yeSB0aHJvdWdoIHRoZSBzeW1saW5rLFxuICAvLyBzbyBrZWVwIG9ubHkgbWFuaWZlc3RzIHdob3NlIHJlYWwgcGF0aCBzdGF5cyBpbnNpZGUgdGhlIHJlcG9zaXRvcnkncyByZWFsIHJvb3QuIFNjYW5uaW5nIGVhY2hcbiAgLy8gcGF0dGVybiBzZXBhcmF0ZWx5IChubyBjcm9zcy1wYXR0ZXJuIGNhY2hpbmcpIGlzIGRlbGliZXJhdGU6IGRlY2xhcmF0aW9ucyBob2xkIGEgaGFuZGZ1bCBvZlxuICAvLyBwYXR0ZXJucywgc28gYSBjYWNoZSB3b3VsZCBjb21wbGljYXRlIHRoaXMgc2hhcmVkIGNvZGUgd2l0aG91dCBtZWFzdXJhYmxlIGdhaW4uXG4gIGNvbnN0IGdsb2JNYW5pZmVzdFBhdGhzID0gKHBhdHRlcm46IHN0cmluZyk6IHN0cmluZ1tdID0+IHtcbiAgICAvLyBCdW4gbGlua3MgZG90LWRpcmVjdG9yeSBwYWNrYWdlcyBvbmx5IHRocm91Z2ggZnVsbHkgc3RhdGljIHBhdHRlcm5zOiB3aXRoIEJ1biAxLjMuMTQsXG4gICAgLy8gYC5oaWRkZW4veGAgcGlucyB0aGUgcGFja2FnZSB3aGlsZSBgLmhpZGRlbi8qYCwgYC4qLypgLCBhbmQgYCoqYCBhbGwgbGluayBub3RoaW5nIHVuZGVyXG4gICAgLy8gLmhpZGRlbiDigJQgZXZlbiB3aGVuIHRoZSBkb3R0ZWQgc2VnbWVudCBpdHNlbGYgaXMgbGl0ZXJhbCDigJQgc28gYW55IGR5bmFtaWMgcGF0dGVybiBtdXN0XG4gICAgLy8gZHJvcCBtYXRjaGVzIGNvbnRhaW5pbmcgYSBkb3QtbGVkIHNlZ21lbnQgKGZhc3QtZ2xvYidzIGBkb3Q6IGZhbHNlYCBvbmx5IGNvdmVycyBzZWdtZW50c1xuICAgIC8vIGEgd2lsZGNhcmQgbWF0Y2hlcykuXG4gICAgY29uc3QgZXhjbHVkZXNEb3RTZWdtZW50cyA9IGZnLmlzRHluYW1pY1BhdHRlcm4ocGF0dGVybik7XG4gICAgY29uc3QgZ2xvYk9wdGlvbnMgPSB7IGN3ZDogcm9vdERpclBhdGgsIGZvbGxvd1N5bWJvbGljTGlua3M6IGZhbHNlLCBpZ25vcmU6IFsnKiovbm9kZV9tb2R1bGVzLyoqJ10gfTtcbiAgICAvLyBmYXN0LWdsb2IgMy4zLjMgcmV0dXJucyBubyBtYXRjaGVzIGZvciBmaWxlIGdsb2JzIHdpdGggYSBsb25lLWA/YCBzZWdtZW50IChlLmcuXG4gICAgLy8gYHBhY2thZ2VzLz8vcGFja2FnZS5qc29uYCksIGFsdGhvdWdoIG1pY3JvbWF0Y2ggbWF0Y2hlcyB0aGVtIGFuZCBCdW4gMS4zLjE0IGxpbmtzIHN1Y2hcbiAgICAvLyB3b3Jrc3BhY2VzOyBmb3IgYD9gLWNhcnJ5aW5nIHBhdHRlcm5zIG9ubHkgKGEgZGlyZWN0b3J5IGdsb2IgZm9yIGUuZy4gYCoqYCB3b3VsZCBzY2FuIGV2ZXJ5XG4gICAgLy8gZGlyZWN0b3J5IGluIHRoZSByZXBvc2l0b3J5KSwgZ2xvYmJpbmcgdGhlIGRpcmVjdG9yaWVzICh3aGVyZSBgP2Agd29ya3MpIGFuZCBjaGVja2luZyB0aGVpclxuICAgIC8vIG1hbmlmZXN0cyBjb21wbGVtZW50cyB0aGUgbWFuaWZlc3QgZ2xvYiwgd2hpY2ggc3RheXMgbmVjZXNzYXJ5IGZvciBgKipgJ3MgemVyby1zZWdtZW50XG4gICAgLy8gbWF0Y2hlcyDigJQgYGRpci8qKmAgZG9lcyBub3QgcmV0dXJuIGRpciBpdHNlbGYgYXMgYSBkaXJlY3RvcnkuXG4gICAgY29uc3QgbWFuaWZlc3RQYXRocyA9IG5ldyBTZXQoZmcuZ2xvYlN5bmMocGF0aC5wb3NpeC5qb2luKHBhdHRlcm4sICdwYWNrYWdlLmpzb24nKSwgZ2xvYk9wdGlvbnMpKTtcbiAgICBpZiAocGF0dGVybi5pbmNsdWRlcygnPycpKSB7XG4gICAgICBmb3IgKGNvbnN0IGRpclBhdGggb2YgZmcuZ2xvYlN5bmMocGF0dGVybiwgeyAuLi5nbG9iT3B0aW9ucywgb25seURpcmVjdG9yaWVzOiB0cnVlIH0pKSB7XG4gICAgICAgIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGgucG9zaXguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihyb290RGlyUGF0aCwgcGFja2FnZUpzb25QYXRoKSkpIG1hbmlmZXN0UGF0aHMuYWRkKHBhY2thZ2VKc29uUGF0aCk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIEEgemVyby1zZWdtZW50IGAqKmAgbWF0Y2ggcmVhY2hlcyB0aGUgcm9vdCdzIG93biBtYW5pZmVzdCwgYnV0IEJ1biBuZXZlciB0cmVhdHMgdGhlXG4gICAgLy8gbW9ub3JlcG8gcm9vdCBhcyBpdHMgb3duIHdvcmtzcGFjZS5cbiAgICByZXR1cm4gWy4uLm1hbmlmZXN0UGF0aHNdLmZpbHRlcihcbiAgICAgIChwYWNrYWdlSnNvblBhdGgpID0+XG4gICAgICAgIHBhY2thZ2VKc29uUGF0aCAhPT0gJ3BhY2thZ2UuanNvbicgJiZcbiAgICAgICAgKCFleGNsdWRlc0RvdFNlZ21lbnRzIHx8ICFwYWNrYWdlSnNvblBhdGguc3BsaXQoJy8nKS5zb21lKChzZWdtZW50KSA9PiBzZWdtZW50LnN0YXJ0c1dpdGgoJy4nKSkpICYmXG4gICAgICAgIGlzSW5zaWRlUmVhbFJvb3QocGFja2FnZUpzb25QYXRoKVxuICAgICk7XG4gIH07XG4gIGxldCByZWFsUm9vdERpclBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgY29uc3QgaXNJbnNpZGVSZWFsUm9vdCA9IChwYWNrYWdlSnNvblBhdGg6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICAgIHRyeSB7XG4gICAgICByZWFsUm9vdERpclBhdGggPz89IGZzLnJlYWxwYXRoU3luYyhyb290RGlyUGF0aCk7XG4gICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKHJlYWxSb290RGlyUGF0aCwgZnMucmVhbHBhdGhTeW5jKHBhdGguam9pbihyb290RGlyUGF0aCwgcGFja2FnZUpzb25QYXRoKSkpO1xuICAgICAgLy8gQ29tcGFyZSB3aG9sZSBzZWdtZW50cywgbm90IGEgYC4uYCBwcmVmaXg6IGEgZGlyZWN0b3J5IGxpdGVyYWxseSBuYW1lZCBlLmcuIGAuLnBrZ2AgaXNcbiAgICAgIC8vIGluc2lkZSB0aGUgcm9vdCwgd2hpbGUgYSBwbGFpbiBzdGFydHNXaXRoKCcuLicpIHdvdWxkIG1pc3JlYWQgaXQgYXMgcGFyZW50IHRyYXZlcnNhbC5cbiAgICAgIHJldHVybiByZWxhdGl2ZVBhdGggIT09ICcuLicgJiYgIXJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuLi8nKSAmJiAhcGF0aC5pc0Fic29sdXRlKHJlbGF0aXZlUGF0aCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBBIG1hbmlmZXN0IHRoYXQgdmFuaXNoZWQgYmV0d2VlbiB0aGUgZ2xvYiBhbmQgdGhlIHJlYWxwYXRoIGNhbGwgaXMgbm90IGEgd29ya3NwYWNlLlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgYWNjdW11bGF0ZWRQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBwaW5uZWRQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IHdvcmtzcGFjZVBhdHRlcm4gb2Ygd29ya3NwYWNlUGF0dGVybnMpIHtcbiAgICBjb25zdCBpc05lZ2F0aXZlID0gd29ya3NwYWNlUGF0dGVybi5zdGFydHNXaXRoKCchJyk7XG4gICAgY29uc3QgcGF0dGVybkJvZHkgPSBub3JtYWxpemVXb3Jrc3BhY2VQYXR0ZXJuQm9keShpc05lZ2F0aXZlID8gd29ya3NwYWNlUGF0dGVybi5zbGljZSgxKSA6IHdvcmtzcGFjZVBhdHRlcm4pO1xuICAgIGlmIChpc05lZ2F0aXZlKSB7XG4gICAgICBjb25zdCBiYXNlbGluZUdsb2IgPSBnZXRTZWVkZWRCYXNlbGluZUdsb2IocGF0dGVybkJvZHkpO1xuICAgICAgaWYgKGJhc2VsaW5lR2xvYiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGZvciAoY29uc3QgcGFja2FnZUpzb25QYXRoIG9mIGdsb2JNYW5pZmVzdFBhdGhzKGJhc2VsaW5lR2xvYikpIGFjY3VtdWxhdGVkUGF0aHMuYWRkKHBhY2thZ2VKc29uUGF0aCk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IHBhY2thZ2VKc29uUGF0aCBvZiBnbG9iTWFuaWZlc3RQYXRocyhwYXR0ZXJuQm9keSkpIGFjY3VtdWxhdGVkUGF0aHMuZGVsZXRlKHBhY2thZ2VKc29uUGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHRhcmdldFBhdGhzID0gZmcuaXNEeW5hbWljUGF0dGVybihwYXR0ZXJuQm9keSkgPyBhY2N1bXVsYXRlZFBhdGhzIDogcGlubmVkUGF0aHM7XG4gICAgICBmb3IgKGNvbnN0IHBhY2thZ2VKc29uUGF0aCBvZiBnbG9iTWFuaWZlc3RQYXRocyhwYXR0ZXJuQm9keSkpIHtcbiAgICAgICAgdGFyZ2V0UGF0aHMuYWRkKHBhY2thZ2VKc29uUGF0aCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBbLi4ubmV3IFNldChbLi4uYWNjdW11bGF0ZWRQYXRocywgLi4ucGlubmVkUGF0aHNdKV0udG9Tb3J0ZWQoKTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSBkZWNsYXJhdGlvbiBzZWVkcyBCdW4ncyBpbXBsaWNpdCB3b3Jrc3BhY2UgYmFzZWxpbmU6IGl0IGNvbnRhaW5zIGF0IGxlYXN0IG9uZVxuICogbmVnYXRpb24gb2YgdGhlIHNlZWRpbmcgc2hhcGUgKHNlZSByZXNvbHZlV29ya3NwYWNlUGFja2FnZUpzb25QYXRocyBydWxlIDIpLiBNZWFzdXJlZCB3aXRoIEJ1blxuICogMS4zLjE0LCBzZWVkaW5nIGlzIHBlci1uZWdhdGlvbiBhbmQgaGFwcGVucyBldmVuIGFsb25nc2lkZSBwb3NpdGl2ZSBwYXR0ZXJuczsgY29uY3JldGUgb3JcbiAqIG1peGVkLWxpdGVyYWwgbGFzdCBzZWdtZW50cyAoYCFhcHBzL2V4Y2x1ZGVkYCwgYCFhcHBzLypkYCkgbmV2ZXIgc2VlZCwgYW5kIGA/YCwgYnJhY2UsIGFuZFxuICogY2hhcmFjdGVyLWNsYXNzIGxhc3Qgc2VnbWVudHMgYmVoYXZlZCBpbmNvbnNpc3RlbnRseSBhY3Jvc3MgZml4dHVyZXMgKHNvbWV0aW1lcyBkcm9wcGluZyBldmVuXG4gKiB1bnJlbGF0ZWQgc2libGluZyB3b3Jrc3BhY2VzKSwgc28gdGhleSBhcmUgY29uc2VydmF0aXZlbHkgdHJlYXRlZCBhcyBub3Qgc2VlZGluZzsgc2VlXG4gKiBXaWxsQm9vc3Rlci9zaGFyZWQjMTAwNS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc0ltcGxpY2l0V29ya3NwYWNlQmFzZWxpbmUod29ya3NwYWNlczogV29ya3NwYWNlc0RlY2xhcmF0aW9uKTogYm9vbGVhbiB7XG4gIHJldHVybiBnZXRNZWFuaW5nZnVsRGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyh3b3Jrc3BhY2VzKS5zb21lKFxuICAgICh3b3Jrc3BhY2VQYXR0ZXJuKSA9PlxuICAgICAgd29ya3NwYWNlUGF0dGVybi5zdGFydHNXaXRoKCchJykgJiZcbiAgICAgIGdldFNlZWRlZEJhc2VsaW5lR2xvYihub3JtYWxpemVXb3Jrc3BhY2VQYXR0ZXJuQm9keSh3b3Jrc3BhY2VQYXR0ZXJuLnNsaWNlKDEpKSkgIT09IHVuZGVmaW5lZFxuICApO1xufVxuXG4vKipcbiAqIERlY2xhcmVkIHdvcmtzcGFjZSBwYXR0ZXJucyB3aXRob3V0IEJ1bidzIG5vLW9wIG9uZXMgKGBcIlwiYCwgYSBsb25lIGBcIiFcImAsIGFuZCBgXCIuXCJgKSwgd2hpY2ggQnVuXG4gKiBpZ25vcmVzIGVudGlyZWx5IOKAlCBhIGxvbmUgYFwiIVwiYCBtdXN0IG5vdCBhY3RpdmF0ZSB0aGUgbmVnYXRpdmUtb25seSBpbXBsaWNpdCBiYXNlbGluZSwgYW5kIGBcIlwiYFxuICogbXVzdCBub3QgbWFrZSB0aGUgcmVwb3NpdG9yeSByb290IGl0c2VsZiBhIGRpc2NvdmVyZWQgd29ya3NwYWNlLiBEZWNsYXJhdGlvbiBvcmRlciBhbmRcbiAqIGR1cGxpY2F0ZXMgYXJlIHByZXNlcnZlZCDigJQgQnVuIGV2YWx1YXRlcyB0aGUgcGF0dGVybnMgc2VxdWVudGlhbGx5LCBzbyBwb3NpdGlvbiBtYXR0ZXJzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWVhbmluZ2Z1bERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMod29ya3NwYWNlczogV29ya3NwYWNlc0RlY2xhcmF0aW9uKTogc3RyaW5nW10ge1xuICByZXR1cm4gZ2V0RGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyh3b3Jrc3BhY2VzKVxuICAgIC5tYXAoKHdvcmtzcGFjZVBhdHRlcm4pID0+IHtcbiAgICAgIC8vIEJ1biBhcHBsaWVzIGxlYWRpbmctYmFuZyBQQVJJVFkgKHZlcmlmaWVkIHdpdGggQnVuIDEuMy4xNCk6IGAhIXBgIGlzIHRoZSBwb3NpdGl2ZSBgcGBcbiAgICAgIC8vIGFuZCBgISEhcGAgdGhlIG5lZ2F0aW9uIGAhcGAsIHNvIGNhbm9uaWNhbGl6ZSB0byBhdCBtb3N0IG9uZSBiYW5nLlxuICAgICAgY29uc3QgYmFuZ0NvdW50ID0gL14hKi91LmV4ZWMod29ya3NwYWNlUGF0dGVybikhWzBdLmxlbmd0aDtcbiAgICAgIGNvbnN0IHBhdHRlcm5Cb2R5ID0gd29ya3NwYWNlUGF0dGVybi5zbGljZShiYW5nQ291bnQpO1xuICAgICAgcmV0dXJuIGJhbmdDb3VudCAlIDIgPT09IDEgPyBgISR7cGF0dGVybkJvZHl9YCA6IHBhdHRlcm5Cb2R5O1xuICAgIH0pXG4gICAgLmZpbHRlcigod29ya3NwYWNlUGF0dGVybikgPT4ge1xuICAgICAgY29uc3QgcGF0dGVybkJvZHkgPSB3b3Jrc3BhY2VQYXR0ZXJuLnN0YXJ0c1dpdGgoJyEnKSA/IHdvcmtzcGFjZVBhdHRlcm4uc2xpY2UoMSkgOiB3b3Jrc3BhY2VQYXR0ZXJuO1xuICAgICAgLy8gTm9ybWFsaXplIHNvIHNwZWxsaW5ncyBsaWtlIGAuL2AsIGAuLy5gLCBhbmQgYCEuL2AgYXJlIHJlY29nbml6ZWQgYXMgdGhlIHNhbWUgbm8tb3BzXG4gICAgICAvLyAocGF0aC5wb3NpeC5ub3JtYWxpemUoJycpID09PSAnLicsIHNvIHRoZSBlbXB0eSBwYXR0ZXJuIGlzIGNvdmVyZWQgdG9vKS5cbiAgICAgIHJldHVybiBub3JtYWxpemVXb3Jrc3BhY2VQYXR0ZXJuQm9keShwYXR0ZXJuQm9keSkgIT09ICcuJztcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBDb2xsYXBzZXMgYC8vYCwgcmVzb2x2ZXMgYC4vYCwgYW5kIHN0cmlwcyB0cmFpbGluZyBzbGFzaGVzLCBtaXJyb3JpbmcgQnVuJ3MgcGF0aCBoYW5kbGluZy5cbiAqIEEgcHVyZSBzdGFyLXJ1biBzZWdtZW50IG9mIHRocmVlIG9yIG1vcmUgc3RhcnMgYmVoYXZlcyBsaWtlIGAqYCB1bmRlciBCdW4gKGAhb3RoZXIvKioqYFxuICogbWF0Y2hlcyBvdGhlci94KSBidXQgbm90IHVuZGVyIGZhc3QtZ2xvYiwgc28gY2Fub25pY2FsaXplIGl0IHRvIGAqYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVdvcmtzcGFjZVBhdHRlcm5Cb2R5KHBhdHRlcm5Cb2R5OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcGF0aC5wb3NpeFxuICAgIC5ub3JtYWxpemUocGF0dGVybkJvZHkpXG4gICAgLnJlcGxhY2UoL1xcLyskL3UsICcnKVxuICAgIC5zcGxpdCgnLycpXG4gICAgLm1hcCgoc2VnbWVudCkgPT4gKC9eXFwqezMsfSQvdS50ZXN0KHNlZ21lbnQpID8gJyonIDogc2VnbWVudCkpXG4gICAgLmpvaW4oJy8nKTtcbn1cblxuLyoqIFRoZSBpbXBsaWNpdCBiYXNlbGluZSBnbG9iIGEgbmVnYXRpb24gc2VlZHMgdW5kZXIgQnVuJ3MgcnVsZSAyIGFib3ZlLCBvciB1bmRlZmluZWQgaWYgbm9uZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTZWVkZWRCYXNlbGluZUdsb2IobmVnYXRpb25Cb2R5OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBzZWdtZW50cyA9IG5lZ2F0aW9uQm9keS5zcGxpdCgnLycpO1xuICBpZiAoc2VnbWVudHMubGVuZ3RoICE9PSAyKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBbZmlyc3RTZWdtZW50LCBsYXN0U2VnbWVudF0gPSBzZWdtZW50cyBhcyBbc3RyaW5nLCBzdHJpbmddO1xuICBpZiAoIS9eXFwqKyQvdS50ZXN0KGxhc3RTZWdtZW50KSB8fCAvXlxcKiskL3UudGVzdChmaXJzdFNlZ21lbnQpKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gbGFzdFNlZ21lbnQgPT09ICcqKicgPyAnKionIDogJyovKic7XG59XG5cbi8qKiBXb3Jrc3BhY2UgcGF0dGVybnMgZnJvbSBlaXRoZXIgdGhlIGFycmF5IGZvcm0gb3IgWWFybiB2MSdzIGB7IHBhY2thZ2VzOiBb4oCmXSB9YCBvYmplY3QgZm9ybS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zKHdvcmtzcGFjZXM6IFdvcmtzcGFjZXNEZWNsYXJhdGlvbik6IHN0cmluZ1tdIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkod29ya3NwYWNlcykpIHJldHVybiB3b3Jrc3BhY2VzO1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh3b3Jrc3BhY2VzPy5wYWNrYWdlcykgPyB3b3Jrc3BhY2VzLnBhY2thZ2VzIDogW107XG59XG5cbi8qKlxuICogV2hldGhlciBhIGRlY2xhcmVkIHdvcmtzcGFjZSBwYXR0ZXJuIChuZWdhdGl2ZSBvbmVzIGluY2x1ZGVkKSBzdGF5cyBpbnNpZGUgdGhlIHJlcG9zaXRvcnk6XG4gKiBhYnNvbHV0ZSBvciBgLi5gLXRyYXZlcnNpbmcgcGF0dGVybnMgd291bGQgbWFrZSBjb25zdW1lcnMgc3VjaCBhcyBub2RlX21vZHVsZXMgY2xlYW51cCBvcGVyYXRlXG4gKiBvbiBhbm90aGVyIHJlcG9zaXRvcnkncyBmaWxlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzSW5SZXBvc2l0b3J5V29ya3NwYWNlUGF0dGVybih3b3Jrc3BhY2VQYXR0ZXJuOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcGF0dGVybkJvZHkgPSB3b3Jrc3BhY2VQYXR0ZXJuLnN0YXJ0c1dpdGgoJyEnKSA/IHdvcmtzcGFjZVBhdHRlcm4uc2xpY2UoMSkgOiB3b3Jrc3BhY2VQYXR0ZXJuO1xuICByZXR1cm4gIXBhdGgucG9zaXguaXNBYnNvbHV0ZShwYXR0ZXJuQm9keSkgJiYgIXBhdHRlcm5Cb2R5LnNwbGl0KCcvJykuaW5jbHVkZXMoJy4uJyk7XG59XG4iLCJpbXBvcnQgY3J5cHRvIGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbi8qKlxuICogQW5jaG9yZWQgdG8gYFwiLCBgIHNvIG9ubHkgYSByZWdpc3RyeSBlbnRyeSdzIGByZXNvbHZlZGAgc2xvdCBpcyBjbGVhcmVkLiBBIGRpcmVjdCB0YXJiYWxsXG4gKiBkZXBlbmRlbmN5IGNhcnJpZXMgaXRzIFVSTCBpbiB0aGUgd29ya3NwYWNlIGRlc2NyaXB0b3IgYW5kIHR1cGxlIGlkZW50aWZpZXIgaW5zdGVhZCwgYW5kIHRob3NlXG4gKiBVUkxzIG11c3QgcmVtYWluIGludGFjdC5cbiAqL1xuY29uc3QgZ3VhcmRSZXNvbHZlZFVybFBhdHRlcm4gPSAvKFwiLCApXCJodHRwczpcXC9cXC9ucG1cXC5mbGF0dFxcLnRlY2hcXC9bXlwiXSpcIi9nO1xuXG4vKipcbiAqIFJlbW92ZSBUYWt1bWkgR3VhcmQgcHJveHkgVVJMcyBmcm9tIHRoZSBuZWFyZXN0IGVuY2xvc2luZyBidW4ubG9jay5cbiAqXG4gKiBCdW4gd3JpdGVzIHRoZSB3b3Jrc3BhY2Ugcm9vdCdzIGxvY2tmaWxlIGV2ZW4gd2hlbiBhbiBpbnN0YWxsIHJ1bnMgZnJvbSBhIGNoaWxkIHBhY2thZ2UuIEluIGFcbiAqIEdpdCBjaGVja291dCB0aGUgc2VhcmNoIGNsaW1icyB0byB0aGF0IHJvb3Q7IHdpdGhvdXQgYSBjaGVja291dCBib3VuZGFyeSBpdCBpbnNwZWN0cyBvbmx5IHRoZVxuICogc3RhcnRpbmcgZGlyZWN0b3J5IHNvIGl0IGNhbm5vdCByZXdyaXRlIGFuIHVucmVsYXRlZCBhbmNlc3RvcidzIGxvY2tmaWxlLiBUaGUgcHJveHkgaXNcbiAqIGluc3RhbGwtdGltZSBwb2xpY3kgcmF0aGVyIHRoYW4gcmVwb3NpdG9yeSBzdGF0ZTogYW4gZW1wdHkgcmVzb2x2ZWQgc2xvdCBzdGlsbCBtYWtlcyBCdW4gdXNlIHRoZVxuICogY29uZmlndXJlZCBkZWZhdWx0IHJlZ2lzdHJ5LlxuICpcbiAqIEByZXR1cm5zIFRoZSBub3JtYWxpemVkIGxvY2tmaWxlIHBhdGgsIG9yIHVuZGVmaW5lZCB3aGVuIG5vIGNoYW5nZSB3YXMgbmVlZGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplQnVuTG9ja2ZpbGUoc3RhcnREaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBsb2NrZmlsZVBhdGggPSBmaW5kQnVuTG9ja2ZpbGVQYXRoKHN0YXJ0RGlyUGF0aCk7XG4gIGlmICghbG9ja2ZpbGVQYXRoKSByZXR1cm47XG5cbiAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhsb2NrZmlsZVBhdGgsICd1dGY4Jyk7XG4gIGNvbnN0IG5vcm1hbGl6ZWRDb250ZW50ID0gY29udGVudC5yZXBsYWNlQWxsKGd1YXJkUmVzb2x2ZWRVcmxQYXR0ZXJuLCAnJDFcIlwiJyk7XG4gIGlmIChub3JtYWxpemVkQ29udGVudCA9PT0gY29udGVudCkgcmV0dXJuO1xuXG4gIC8vIEEgc2libGluZyB0ZW1wIGZpbGUgbWFrZXMgdGhlIHJlcGxhY2VtZW50IGFuIGF0b21pYyBzYW1lLWRpcmVjdG9yeSByZW5hbWUsIHNvIGFuIGludGVycnVwdGVkXG4gIC8vIHdyaXRlIGNhbm5vdCBsZWF2ZSBhIHRydW5jYXRlZCBidW4ubG9jayBiZWhpbmQuXG4gIGNvbnN0IHRlbXBvcmFyeVBhdGggPSBgJHtsb2NrZmlsZVBhdGh9Lm5vcm1hbGl6aW5nLiR7cHJvY2Vzcy5waWR9LiR7Y3J5cHRvLnJhbmRvbVVVSUQoKX1gO1xuICB0cnkge1xuICAgIC8vIHN0YXQncyBtb2RlIGluY2x1ZGVzIGZpbGUtdHlwZSBiaXRzLCB3aGljaCBjaG1vZCBpcyBub3Qgc3BlY2lmaWVkIHRvIGFjY2VwdC5cbiAgICBjb25zdCBtb2RlID0gZnMuc3RhdFN5bmMobG9ja2ZpbGVQYXRoKS5tb2RlICYgMG83Nzc7XG4gICAgZnMud3JpdGVGaWxlU3luYyh0ZW1wb3JhcnlQYXRoLCBub3JtYWxpemVkQ29udGVudCwgeyBtb2RlIH0pO1xuICAgIC8vIHdyaXRlRmlsZVN5bmMncyBtb2RlIGlzIG1hc2tlZCBieSB0aGUgcHJvY2VzcyB1bWFzazsgY2htb2QgcmVzdG9yZXMgdGhlIGV4YWN0IG9yaWdpbmFsIGJpdHMuXG4gICAgZnMuY2htb2RTeW5jKHRlbXBvcmFyeVBhdGgsIG1vZGUpO1xuICAgIGZzLnJlbmFtZVN5bmModGVtcG9yYXJ5UGF0aCwgbG9ja2ZpbGVQYXRoKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBmcy5ybVN5bmModGVtcG9yYXJ5UGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgfVxuICByZXR1cm4gbG9ja2ZpbGVQYXRoO1xufVxuXG5mdW5jdGlvbiBmaW5kQnVuTG9ja2ZpbGVQYXRoKHN0YXJ0RGlyUGF0aDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcmVzb2x2ZWRTdGFydERpclBhdGggPSBwYXRoLnJlc29sdmUoc3RhcnREaXJQYXRoKTtcbiAgY29uc3QgcmVwb3NpdG9yeVJvb3REaXJQYXRoID0gZmluZFJlcG9zaXRvcnlSb290RGlyUGF0aChyZXNvbHZlZFN0YXJ0RGlyUGF0aCk7XG4gIGlmICghcmVwb3NpdG9yeVJvb3REaXJQYXRoKSB7XG4gICAgY29uc3QgbG9ja2ZpbGVQYXRoID0gcGF0aC5qb2luKHJlc29sdmVkU3RhcnREaXJQYXRoLCAnYnVuLmxvY2snKTtcbiAgICByZXR1cm4gZnMuZXhpc3RzU3luYyhsb2NrZmlsZVBhdGgpID8gbG9ja2ZpbGVQYXRoIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgbGV0IGRpclBhdGggPSByZXNvbHZlZFN0YXJ0RGlyUGF0aDtcbiAgd2hpbGUgKHRydWUpIHtcbiAgICBjb25zdCBsb2NrZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgJ2J1bi5sb2NrJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMobG9ja2ZpbGVQYXRoKSkgcmV0dXJuIGxvY2tmaWxlUGF0aDtcbiAgICBpZiAoZGlyUGF0aCA9PT0gcmVwb3NpdG9yeVJvb3REaXJQYXRoKSByZXR1cm47XG5cbiAgICBkaXJQYXRoID0gcGF0aC5kaXJuYW1lKGRpclBhdGgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmRSZXBvc2l0b3J5Um9vdERpclBhdGgoc3RhcnREaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBsZXQgZGlyUGF0aCA9IHN0YXJ0RGlyUGF0aDtcbiAgd2hpbGUgKHRydWUpIHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJy5naXQnKSkpIHJldHVybiBkaXJQYXRoO1xuXG4gICAgY29uc3QgcGFyZW50RGlyUGF0aCA9IHBhdGguZGlybmFtZShkaXJQYXRoKTtcbiAgICBpZiAocGFyZW50RGlyUGF0aCA9PT0gZGlyUGF0aCkgcmV0dXJuO1xuICAgIGRpclBhdGggPSBwYXJlbnREaXJQYXRoO1xuICB9XG59XG4iLCIvKiogV2hldGhlciBhIERvY2tlcmZpbGUgY29uc3VtZXMgd2IncyBnZW5lcmF0ZWQgbm9uLXNlY3JldCBlbnZpcm9ubWVudCBkaXJlY3RseSBvciB0aHJvdWdoIGl0cyBoZWxwZXIuICovXG5leHBvcnQgZnVuY3Rpb24gY29uc3VtZXNEb2NrZXJFbnYoZG9ja2VyZmlsZVRleHQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZG9ja2VyZmlsZVRleHRcbiAgICAuc3BsaXQoJ1xcbicpXG4gICAgLnNvbWUoKGxpbmUpID0+ICEvXlxccyojL3UudGVzdChsaW5lKSAmJiAobGluZS5pbmNsdWRlcygnLmRvY2tlci5lbnYnKSB8fCBsaW5lLmluY2x1ZGVzKCdhcHBseS1kb2NrZXItZW52LnNoJykpKTtcbn1cbiIsImV4cG9ydCBjb25zdCBnbG9iSWdub3JlID0gW1xuICAnKiovbm9kZV9tb2R1bGVzLyoqJyxcbiAgJyoqLy5hbnRpZ3Jhdml0eWNsaS8qKicsXG4gIC8vIEdpdCdzIG9iamVjdCBzdG9yZSBob2xkcyBjb3BpZXMgb2YgdHJhY2tlZCBmaWxlcyAoYW5kIGBkb3Q6IHRydWVgIG1ha2VzIHRoZW0gdmlzaWJsZSksIHNvXG4gIC8vIHNjYW5uaW5nIGl0IHdvdWxkIGJvdGggc2xvdyBldmVyeSBnbG9iIGRvd24gYW5kIGxldCBzdGFsZSBibG9icyBpbmZsdWVuY2UgZGV0ZWN0aW9uLlxuICAnKiovLmdpdC8qKicsXG4gIC8vIFRoZSBvcmctc3RhbmRhcmQgdGVtcG9yYXJ5IGRpcmVjdG9yeTsgc3RhbGUgY29waWVzIHVuZGVyIGl0IChlLmcuIHJldmlldyBzY3JhdGNoIGRpcnMpIG11c3RcbiAgLy8gbm90IGluZmx1ZW5jZSBsYW5ndWFnZSBkZXRlY3Rpb24uXG4gICcqKi8udG1wLyoqJyxcbiAgJyoqLy50bXAtKi8qKicsXG4gIC8vIExvY2FsIGNhY2hlcyBjYW4gY29udGFpbiBjb21wbGV0ZSB0aGlyZC1wYXJ0eSBzb3VyY2UgY2hlY2tvdXRzLiBUcmVhdGluZyB0aG9zZSBhcyByZXBvc2l0b3J5XG4gIC8vIGNvZGUgZ2VuZXJhdGVzIHdvcmtmbG93cyBmb3IgcGF0aHMgdGhhdCBhcmUgZ2l0aWdub3JlZCBhbmQgYWJzZW50IGZyb20gZnJlc2ggQ0kgY2hlY2tvdXRzLlxuICAnKiovLmNhY2hlLyoqJyxcbiAgJyoqLy52ZW52LyoqJyxcbiAgJyoqL3Rlc3QtZml4dHVyZXMvKionLFxuICAnKiovdGVzdC9maXh0dXJlcy8qKicsXG4gICcqKi9kaXN0LyoqJyxcbiAgJyoqL2J1aWxkLyoqJyxcbiAgJyoqL3RhcmdldC8qKicsXG4gICcqKi90ZW1wLyoqJyxcbiAgJyoqL3RtcC8qKicsXG5dO1xuIiwiY2xhc3MgT3B0aW9ucyB7XG4gIGlzVmVyYm9zZSA9IGZhbHNlO1xufVxuXG5leHBvcnQgY29uc3Qgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7XG4iLCJpbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi9vcHRpb25zLmpzJztcblxuY2xhc3MgTG9nZ2VyIHtcbiAgYXN5bmMgZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbihuYW1lOiBzdHJpbmcsIGZ1bmM6ICgpID0+IFByb21pc2U8dm9pZD4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgLS0tLS0tLS0tICR7bmFtZX0gc3RhcnQgLS0tLS0tLS0tYCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmdW5jKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRXJyb3Igb2NjdXJyZWQgaW4gJHtuYW1lfTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3Iuc3RhY2sgOiBTdHJpbmcoZXJyb3IpfX1gKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYC0tLS0tLS0tLS0gJHtuYW1lfSBlbmQgLS0tLS0tLS0tLWApO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgbG9nZ2VyID0gbmV3IExvZ2dlcigpO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxubGV0IHJlYWxSb290RGlyUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG5leHBvcnQgY29uc3QgZnNVdGlsID0ge1xuICAvKiogQ29uZmluZXMgZ2VuZXJhdGVGaWxlIHdyaXRlcyB0byB0aGUgcmVwb3NpdG9yeSByb290ZWQgYXQgcm9vdERpclBhdGggKHVuZGVmaW5lZCBkaXNhYmxlcyBpdCkuICovXG4gIHNldFJvb3REaXJQYXRoKHJvb3REaXJQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICByZWFsUm9vdERpclBhdGggPSByb290RGlyUGF0aCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogZnMucmVhbHBhdGhTeW5jKHJvb3REaXJQYXRoKTtcbiAgfSxcbiAgLyoqXG4gICAqIFJldHVybnMgdW5kZWZpbmVkIG9ubHkgd2hlbiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdC4gT3RoZXIgZmFpbHVyZXMgKGUuZy4gcGVybWlzc2lvbnMpIGFyZVxuICAgKiByZXRocm93biBzbyBjYWxsZXJzIHJlZ2VuZXJhdGluZyBjb25maWcgZmlsZXMgbmV2ZXIgb3ZlcndyaXRlIGNvbnRlbnQgdGhleSBjb3VsZCBub3QgcmVhZC5cbiAgICovXG4gIGFzeW5jIHJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKChlcnJvciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb24pLmNvZGUgPT09ICdFTk9FTlQnKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9LFxuICAvKiogVGVsbHMgd2hldGhlciBhIHdyaXRlIHRvIGZpbGVQYXRoIHdvdWxkIHBhc3MgdGhlIHN5bWxpbmsvcmVwb3NpdG9yeS1jb250YWlubWVudCBndWFyZHMuICovXG4gIGFzeW5jIGlzQ29uZmluZWRXcml0YWJsZVBhdGgoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiBhd2FpdCBpc0NvbmZpbmVkV3JpdGFibGVQYXRoKGZpbGVQYXRoKTtcbiAgfSxcbiAgLyoqXG4gICAqIFJlYWRzIGEgc291cmNlIGZpbGUsIHJldHVybmluZyB1bmRlZmluZWQgd2hlbiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCBPUiB3aGVuIGl0XG4gICAqIHJlc29sdmVzIG91dHNpZGUgdGhlIHJlcG9zaXRvcnkg4oCUIGEgY29tbWl0dGVkIHN5bWxpbmsgcG9pbnRpbmcgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeSBtdXN0XG4gICAqIG5vdCBnZXQgaXRzIHRhcmdldCdzIGNvbnRlbnQgY29waWVkIGludG8gYSB0cmFja2VkIGZpbGUuIEEgc3ltbGluayB3aG9zZSByZXNvbHZlZCB0YXJnZXRcbiAgICogc3RheXMgaW5zaWRlIHRoZSByZXBvc2l0b3J5IGlzIGxlZ2l0aW1hdGUgKGUuZy4gYC5ub2RlLXZlcnNpb24gLT4gLm52bXJjYCkgYW5kIGlzIHJlYWQuXG4gICAqL1xuICBhc3luYyByZWFkRmlsZUNvbmZpbmVkSWZFeGlzdHMoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmcy5wcm9taXNlcy5sc3RhdChmaWxlUGF0aCkuY2F0Y2goKCkgPT4ge30pO1xuICAgIGlmICghc3RhdHMpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKHN0YXRzLmlzU3ltYm9saWNMaW5rKCkpIHtcbiAgICAgIGxldCByZWFsRmlsZVBhdGg6IHN0cmluZztcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlYWxGaWxlUGF0aCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWxwYXRoKGZpbGVQYXRoKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgcmVhZGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIGl0IGlzIGEgZGFuZ2xpbmcgc3ltYm9saWMgbGluay5gKTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgcmVhbFJvb3REaXJQYXRoICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgcmVhbEZpbGVQYXRoICE9PSByZWFsUm9vdERpclBhdGggJiZcbiAgICAgICAgIXJlYWxGaWxlUGF0aC5zdGFydHNXaXRoKHJlYWxSb290RGlyUGF0aCArIHBhdGguc2VwKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCByZWFkaW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgaXQgcmVzb2x2ZXMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeS5gKTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gICAgfVxuICAgIGlmICghKGF3YWl0IGhhc0NvbmZpbmVkUGFyZW50KGZpbGVQYXRoKSkpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCByZWFkaW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgaXQgcmVzb2x2ZXMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeS5gKTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gIH0sXG4gIC8qKlxuICAgKiBSZW1vdmVzIGZpbGVQYXRoIChmb3JjZSwgb3B0aW9uYWxseSByZWN1cnNpdmUpIG9ubHkgd2hlbiBpdHMgUEFSRU5UIGRpcmVjdG9yeSByZXNvbHZlcyBpbnNpZGVcbiAgICogdGhlIHJlcG9zaXRvcnksIHNvIGEgc3ltbGlua2VkIGRpcmVjdG9yeSAoZS5nLiBhIGNvbW1pdHRlZCAuZ2l0aHViL3dvcmtmbG93cyBsaW5rKSBjYW4gbmV2ZXJcbiAgICogbWFrZSBjbGVhbnVwIGRlbGV0ZSBmaWxlcyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LiBSZW1vdmluZyBhIHN5bWxpbmsgZW50cnkgaXRzZWxmIGlzIGFsbG93ZWQ6XG4gICAqIHRoYXQgZGVsZXRlcyBvbmx5IHRoZSBsaW5rLCBuZXZlciBpdHMgdGFyZ2V0LiBSZXR1cm5zIHdoZXRoZXIgdGhlIHJlbW92YWwgd2FzIHBlcmZvcm1lZC5cbiAgICovXG4gIGFzeW5jIHJlbW92ZUNvbmZpbmVkKGZpbGVQYXRoOiBzdHJpbmcsIG9wdGlvbnM/OiB7IHJlY3Vyc2l2ZT86IGJvb2xlYW4gfSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICghKGF3YWl0IGhhc0NvbmZpbmVkUGFyZW50KGZpbGVQYXRoKSkpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCByZW1vdmluZyAke2ZpbGVQYXRofSBiZWNhdXNlIGl0IHJlc29sdmVzIG91dHNpZGUgdGhlIHJlcG9zaXRvcnkuYCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IG9wdGlvbnM/LnJlY3Vyc2l2ZSA/PyBmYWxzZSB9KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgLyoqIFdyaXRlcyBjb250ZW50IHZlcmJhdGltLCBhcHBseWluZyB0aGUgc2FtZSBzeW1saW5rL3JlcG9zaXRvcnktY29udGFpbm1lbnQgZ3VhcmRzIGFzIGdlbmVyYXRlRmlsZS4gKi9cbiAgYXN5bmMgd3JpdGVGaWxlQ29uZmluZWQoZmlsZVBhdGg6IHN0cmluZywgY29udGVudDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKCEoYXdhaXQgaXNDb25maW5lZFdyaXRhYmxlUGF0aChmaWxlUGF0aCkpKSByZXR1cm4gZmFsc2U7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGZpbGVQYXRoLCBjb250ZW50KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgLyoqIFJldHVybnMgd2hldGhlciB0aGUgZmlsZSB3YXMgYWN0dWFsbHkgZ2VuZXJhdGVkIChmYWxzZSB3aGVuIHRoZSBjb25maW5lbWVudCBndWFyZHMgc2tpcCBpdCkuICovXG4gIGFzeW5jIGdlbmVyYXRlRmlsZShmaWxlUGF0aDogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcsIGxpbmVFbmRpbmc6ICdcXG4nIHwgJ1xcclxcbicgPSAnXFxuJyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICghKGF3YWl0IGlzQ29uZmluZWRXcml0YWJsZVBhdGgoZmlsZVBhdGgpKSkgcmV0dXJuIGZhbHNlO1xuICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHBhdGguZGlybmFtZShmaWxlUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIC8vIGB0cmltYCB0cmVhdHMgYSBCT00gYXMgd2hpdGVzcGFjZSwgc28gaXQgaXMgcmVhdHRhY2hlZCBhdCBwb3NpdGlvbiAwOiBkcm9wcGluZyBpdCB3b3VsZFxuICAgIC8vIHJld3JpdGUgdGhlIGVuY29kaW5nIG1hcmtlciBvZiBhIGZpbGUgdGhlIGdlbmVyYXRvciB3YXMgb25seSBhc2tlZCB0byB1cGRhdGUuXG4gICAgY29uc3QgYnl0ZU9yZGVyTWFyayA9IGNvbnRlbnQuc3RhcnRzV2l0aCgn77u/JykgPyAn77u/JyA6ICcnO1xuICAgIGxldCBub3JtYWxpemVkQ29udGVudCA9IGNvbnRlbnQudHJpbSgpO1xuICAgIGlmIChub3JtYWxpemVkQ29udGVudCkge1xuICAgICAgbm9ybWFsaXplZENvbnRlbnQgPSBgJHtieXRlT3JkZXJNYXJrfSR7bm9ybWFsaXplZENvbnRlbnR9JHtsaW5lRW5kaW5nfWA7XG4gICAgfVxuICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShmaWxlUGF0aCwgbm9ybWFsaXplZENvbnRlbnQpO1xuICAgIGNvbnNvbGUubG9nKGBHZW5lcmF0ZWQvVXBkYXRlZCAke2ZpbGVQYXRofWApO1xuICAgIHJldHVybiB0cnVlO1xuICB9LFxufTtcblxuYXN5bmMgZnVuY3Rpb24gaXNDb25maW5lZFdyaXRhYmxlUGF0aChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIC8vIE5ldmVyIHdyaXRlIHRocm91Z2ggYSBzeW1saW5rOiBhIChwb3NzaWJseSBkYW5nbGluZykgbGluayBjb21taXR0ZWQgaW4gdGhlIHRhcmdldCByZXBvc2l0b3J5XG4gIC8vIGNvdWxkIHJlZGlyZWN0IHRoZSB3cml0ZSBvdXRzaWRlIGl0LlxuICBjb25zdCBzdGF0cyA9IGF3YWl0IGZzLnByb21pc2VzLmxzdGF0KGZpbGVQYXRoKS5jYXRjaCgoKSA9PiB7fSk7XG4gIGlmIChzdGF0cz8uaXNTeW1ib2xpY0xpbmsoKSkge1xuICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCB3cml0aW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgaXQgaXMgYSBzeW1ib2xpYyBsaW5rLmApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoIShhd2FpdCBoYXNDb25maW5lZFBhcmVudChmaWxlUGF0aCkpKSB7XG4gICAgY29uc29sZS53YXJuKGBTa2lwcGVkIHdyaXRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSBpdCByZXNvbHZlcyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LmApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLy8gQSBzeW1saW5rZWQgcGFyZW50IGRpcmVjdG9yeSB3b3VsZCByZWRpcmVjdCByZWFkcywgd3JpdGVzLCBhbmQgcmVtb3ZhbHMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeSxcbi8vIHNvIHJlcXVpcmUgdGhlIGNsb3Nlc3QgZXhpc3RpbmcgYW5jZXN0b3IgdG8gcmVzb2x2ZSBpbnNpZGUgdGhlIHJvb3Qgc2V0IGJ5IHRoZSBDTEkgZW50cnkgcG9pbnQuXG5hc3luYyBmdW5jdGlvbiBoYXNDb25maW5lZFBhcmVudChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGlmIChyZWFsUm9vdERpclBhdGggPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRydWU7XG4gIGxldCBhbmNlc3RvclBhdGggPSBwYXRoLmRpcm5hbWUoZmlsZVBhdGgpO1xuICB3aGlsZSAoIWZzLmV4aXN0c1N5bmMoYW5jZXN0b3JQYXRoKSkge1xuICAgIGFuY2VzdG9yUGF0aCA9IHBhdGguZGlybmFtZShhbmNlc3RvclBhdGgpO1xuICB9XG4gIGNvbnN0IHJlYWxBbmNlc3RvclBhdGggPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFscGF0aChhbmNlc3RvclBhdGgpO1xuICByZXR1cm4gcmVhbEFuY2VzdG9yUGF0aCA9PT0gcmVhbFJvb3REaXJQYXRoIHx8IHJlYWxBbmNlc3RvclBhdGguc3RhcnRzV2l0aChyZWFsUm9vdERpclBhdGggKyBwYXRoLnNlcCk7XG59XG4iLCJpbXBvcnQgeyBQcm9taXNlUG9vbCB9IGZyb20gJ21pbmltYWwtcHJvbWlzZS1wb29sJztcblxuZXhwb3J0IGNvbnN0IHByb21pc2VQb29sID0gbmV3IFByb21pc2VQb29sKCk7XG4iLCJpbXBvcnQgeyBBUEkgfSBmcm9tICd0eXBlc2NyaXB0L3Vuc3RhYmxlL2FzeW5jJztcbmltcG9ydCB0eXBlIHsgU291cmNlRmlsZSB9IGZyb20gJ3R5cGVzY3JpcHQvdW5zdGFibGUvYXN0JztcblxuLy8gVHlwZVNjcmlwdCA3IHNoaXBzIHRoZSBuYXRpdmUgKEdvKSBjb21waWxlciBhcyB0aGUgYHR5cGVzY3JpcHRgIHBhY2thZ2UgYW5kIG5vXG4vLyBsb25nZXIgZXhwb3NlcyBhbiBpbi1wcm9jZXNzIHBhcnNlciBzdWNoIGFzIGB0cy5jcmVhdGVTb3VyY2VGaWxlYC4gUGFyc2luZyBub3dcbi8vIGhhcHBlbnMgaW4gYSBzcGF3bmVkIGNvbXBpbGVyIHNlcnZlciByZWFjaGVkIHRocm91Z2ggdGhlIGFzeW5jaHJvbm91cyBBUEksIHNvIHdlXG4vLyBrZWVwIGEgc2luZ2xlIGxhemlseS1jcmVhdGVkIGluc3RhbmNlIGFuZCByZXVzZSBpdCBhY3Jvc3MgZXZlcnkgZml4ZXIgdG8gYXZvaWRcbi8vIHBheWluZyB0aGUgcHJvY2Vzcy1zcGF3biBjb3N0IHBlciBmaWxlLlxubGV0IGFwaTogQVBJIHwgdW5kZWZpbmVkO1xubGV0IGNvbm5lY3RlZDogUHJvbWlzZTx1bmtub3duPiB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBQYXJzZXMgYSBzb3VyY2UgZmlsZSBpbnRvIGEgVHlwZVNjcmlwdCBBU1QgdXNpbmcgdGhlIGJ1bmRsZWQgbmF0aXZlIGNvbXBpbGVyLlxuICogUmV0dXJucyBgdW5kZWZpbmVkYCB3aGVuIHRoZSBjb21waWxlciBjYW5ub3QgbG9hZCB0aGUgZmlsZSAoZS5nLiBpdCBpcyBtaXNzaW5nXG4gKiBvciB1bnBhcnNhYmxlKSBzbyBjYWxsZXJzIGNhbiBmYWxsIGJhY2sgdG8gY29uc2VydmF0aXZlIGJlaGF2aW9yLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcGFyc2VTb3VyY2VGaWxlKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPFNvdXJjZUZpbGUgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBhcGkgPSBhd2FpdCBnZXRBcGkoKTtcbiAgICBjb25zdCBzbmFwc2hvdCA9IGF3YWl0IGFwaS51cGRhdGVTbmFwc2hvdCh7IG9wZW5GaWxlczogW2ZpbGVQYXRoXSB9KTtcbiAgICBjb25zdCBwcm9qZWN0ID0gYXdhaXQgc25hcHNob3QuZ2V0RGVmYXVsdFByb2plY3RGb3JGaWxlKGZpbGVQYXRoKTtcbiAgICByZXR1cm4gYXdhaXQgcHJvamVjdD8ucHJvZ3JhbS5nZXRTb3VyY2VGaWxlKGZpbGVQYXRoKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIFNodXRzIGRvd24gdGhlIHNwYXduZWQgY29tcGlsZXIgc2VydmVyLiBUaGUgc2VydmVyIGtlZXBzIGFuIG9wZW4gSVBDIGNoYW5uZWxcbiAqIHRoYXQgd291bGQgb3RoZXJ3aXNlIGtlZXAgdGhlIHJ1bnRpbWUgZXZlbnQgbG9vcCBhbGl2ZSwgc28gd2JmeSBtdXN0IGNhbGwgdGhpc1xuICogb25jZSBpdHMgcnVuIGZpbmlzaGVzIGZvciB0aGUgcHJvY2VzcyB0byBleGl0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGlzcG9zZVR5cGVTY3JpcHRBcGkoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGFwaT8uY2xvc2UoKTtcbiAgYXBpID0gdW5kZWZpbmVkO1xuICBjb25uZWN0ZWQgPSB1bmRlZmluZWQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEFwaSgpOiBQcm9taXNlPEFQST4ge1xuICBhcGkgPz89IG5ldyBBUEkoeyBjd2Q6IHByb2Nlc3MuY3dkKCkgfSk7XG4gIC8vIFRoZSBjbGllbnQgbWFya3MgaXRzZWxmIGNvbm5lY3RlZCBvbmx5IG9uY2UgaXRzIGZpcnN0IHNwYXduIGNvbXBsZXRlcywgc28gY29uY3VycmVudFxuICAvLyBmaXJzdCByZXF1ZXN0cyAodGhlIGZpeGVycyBydW4gaW4gcGFyYWxsZWwpIHdvdWxkIGVhY2ggc3Bhd24gYSBjb21waWxlciBzZXJ2ZXI7IHRoZVxuICAvLyBleHRyYSBzZXJ2ZXJzIGFyZSBuZXZlciBjbG9zZWQgYW5kIGtlZXAgdGhlIHByb2Nlc3MgYWxpdmUgYWZ0ZXIgYGRpc3Bvc2VUeXBlU2NyaXB0QXBpYC5cbiAgLy8gVGhlIGZpcnN0IHJlcXVlc3QgaXMgdGhlcmVmb3JlIGF3YWl0ZWQgb25jZSBiZWZvcmUgYW55IG90aGVyIGlzIHNlbnQ7IGEgZmFpbGVkIG9uZSBpc1xuICAvLyBmb3Jnb3R0ZW4gc28gdGhhdCB0aGUgbmV4dCByZXF1ZXN0IGNvbm5lY3RzIGFnYWluIGluc3RlYWQgb2YgZmFpbGluZyBmb3IgdGhlIHdob2xlIHJ1bi5cbiAgY29ubmVjdGVkID8/PSBhcGkudXBkYXRlU25hcHNob3QoKS5jYXRjaCgoZXJyb3I6IHVua25vd24pID0+IHtcbiAgICBjb25uZWN0ZWQgPSB1bmRlZmluZWQ7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH0pO1xuICBhd2FpdCBjb25uZWN0ZWQ7XG4gIHJldHVybiBhcGk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgKiBhcyBhc3QgZnJvbSAndHlwZXNjcmlwdC91bnN0YWJsZS9hc3QnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBwYXJzZVNvdXJjZUZpbGUgfSBmcm9tICcuLi91dGlscy90eXBlc2NyaXB0QXBpLmpzJztcblxuLy8gU2V0dGluZ3MgZXZlcnkgV2lsbEJvb3N0ZXIgTmV4dC5qcyBwcm9qZWN0IHNob3VsZCBjYXJyeS4gYG5hbWVgIGlzIHRoZSB0b3AtbGV2ZWxcbi8vIHByb3BlcnR5IGtleSB1c2VkIHRvIGRldGVjdCB3aGV0aGVyIHRoZSBzZXR0aW5nIGFscmVhZHkgZXhpc3RzOyBgdGV4dGAgaXMgaW5zZXJ0ZWRcbi8vIHZlcmJhdGltIChhIHdob2xlIGBrZXk6IHZhbHVlYCBwYWlyKSB3aGVuIHRoZSBrZXkgaXMgbWlzc2luZy5cbmNvbnN0IG1hbmFnZWRQcm9wZXJ0aWVzOiByZWFkb25seSB7IG5hbWU6IHN0cmluZzsgdGV4dDogc3RyaW5nIH1bXSA9IFtcbiAgeyBuYW1lOiAncmVhY3RDb21waWxlcicsIHRleHQ6ICdyZWFjdENvbXBpbGVyOiB0cnVlJyB9LFxuICB7IG5hbWU6ICdyZWFjdFN0cmljdE1vZGUnLCB0ZXh0OiAncmVhY3RTdHJpY3RNb2RlOiB0cnVlJyB9LFxuICB7IG5hbWU6ICd0eXBlc2NyaXB0JywgdGV4dDogJ3R5cGVzY3JpcHQ6IHsgaWdub3JlQnVpbGRFcnJvcnM6IHRydWUgfScgfSxcbl07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhOZXh0Q29uZmlnSnNvbihjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhOZXh0Q29uZmlnSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IFsndHMnLCAnbXRzJywgJ2N0cycsICdqcycsICdtanMnLCAnY2pzJ11cbiAgICAgIC5tYXAoKGV4dCkgPT4gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBgbmV4dC5jb25maWcuJHtleHR9YCkpXG4gICAgICAuZmluZCgocCkgPT4gZnMuZXhpc3RzU3luYyhwKSk7XG4gICAgaWYgKCFmaWxlUGF0aCkgcmV0dXJuO1xuXG4gICAgY29uc3QgZXh0cmFjdGVkID0gYXdhaXQgZ2V0TmV4dENvbmZpZ09iamVjdExpdGVyYWwoZmlsZVBhdGgpO1xuICAgIGlmICghZXh0cmFjdGVkKSByZXR1cm47XG4gICAgY29uc3QgeyBzb3VyY2UsIG9iamVjdExpdGVyYWwgfSA9IGV4dHJhY3RlZDtcblxuICAgIC8vIGBwcm9wZXJ0aWVzYCBpbmNsdWRlcyBzcHJlYWQgYXNzaWdubWVudHMgKGAuLi5yZXN0YCkgdGhhdCBjYXJyeSBubyBuYW1lLCBzbyBndWFyZCBiZWZvcmUgcmVhZGluZyBpdC5cbiAgICBjb25zdCBleGlzdGluZ1Byb3BlcnRpZXMgPSBuZXcgU2V0KFxuICAgICAgb2JqZWN0TGl0ZXJhbC5wcm9wZXJ0aWVzLm1hcCgocHJvcGVydHkpID0+XG4gICAgICAgICduYW1lJyBpbiBwcm9wZXJ0eSAmJiBwcm9wZXJ0eS5uYW1lID8gZ2V0UHJvcGVydHlLZXkocHJvcGVydHkubmFtZSwgc291cmNlKSA6IHVuZGVmaW5lZFxuICAgICAgKVxuICAgICk7XG4gICAgY29uc3QgcHJvcGVydHlUZXh0cyA9IG1hbmFnZWRQcm9wZXJ0aWVzXG4gICAgICAuZmlsdGVyKChwcm9wZXJ0eSkgPT4gIWV4aXN0aW5nUHJvcGVydGllcy5oYXMocHJvcGVydHkubmFtZSkpXG4gICAgICAubWFwKChwcm9wZXJ0eSkgPT4gcHJvcGVydHkudGV4dCk7XG4gICAgaWYgKHByb3BlcnR5VGV4dHMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICBjb25zdCBvbGRDb250ZW50ID0gc291cmNlLnRleHQ7XG4gICAgY29uc3QgaW5zZXJ0aW9uUG9pbnQgPSBvYmplY3RMaXRlcmFsLmdldEVuZCgpIC0gMTtcbiAgICAvLyBUaGUgbmF0aXZlIFRTIEFTVCBkb2VzIG5vdCByZWxpYWJseSBleHBvc2UgYHByb3BlcnRpZXMuaGFzVHJhaWxpbmdDb21tYWAsIHNvIHNjYW4gdGhlIHNvdXJjZVxuICAgIC8vIGJldHdlZW4gdGhlIGxhc3QgcHJvcGVydHkgYW5kIHRoZSBjbG9zaW5nIGJyYWNlLiBTdHJpcCBjb21tZW50cyBmaXJzdCBzbyBhIGNvbW1hIGluc2lkZSBhXG4gICAgLy8gdHJhaWxpbmcgY29tbWVudCAoZS5nLiBgZm9vOiAxIC8vIGEsIGJgKSBpcyBub3QgbWlzdGFrZW4gZm9yIGEgcmVhbCB0cmFpbGluZyBjb21tYS5cbiAgICBjb25zdCBsYXN0UHJvcGVydHkgPSBvYmplY3RMaXRlcmFsLnByb3BlcnRpZXMuYXQoLTEpO1xuICAgIGNvbnN0IGhhc1RyYWlsaW5nQ29tbWEgPSBsYXN0UHJvcGVydHlcbiAgICAgID8gc3RyaXBDb21tZW50cyhvbGRDb250ZW50LnNsaWNlKGxhc3RQcm9wZXJ0eS5nZXRFbmQoKSwgaW5zZXJ0aW9uUG9pbnQpKS5pbmNsdWRlcygnLCcpXG4gICAgICA6IGZhbHNlO1xuICAgIGNvbnN0IHByZWZpeCA9IG9iamVjdExpdGVyYWwucHJvcGVydGllcy5sZW5ndGggPiAwICYmICFoYXNUcmFpbGluZ0NvbW1hID8gJywgJyA6ICcnO1xuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBgJHtvbGRDb250ZW50LnNsaWNlKDAsIGluc2VydGlvblBvaW50KX0ke3ByZWZpeH0ke3Byb3BlcnR5VGV4dHMuam9pbignLCAnKX0ke29sZENvbnRlbnQuc2xpY2UoXG4gICAgICBpbnNlcnRpb25Qb2ludFxuICAgICl9YDtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0TmV4dENvbmZpZ09iamVjdExpdGVyYWwoXG4gIGZpbGVQYXRoOiBzdHJpbmdcbik6IFByb21pc2U8eyBzb3VyY2U6IGFzdC5Tb3VyY2VGaWxlOyBvYmplY3RMaXRlcmFsOiBhc3QuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24gfSB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBzb3VyY2UgPSBhd2FpdCBwYXJzZVNvdXJjZUZpbGUoZmlsZVBhdGgpO1xuICBpZiAoIXNvdXJjZSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAvLyBUaGUgV2lsbEJvb3N0ZXIgc3RhbmRhcmQgZGVjbGFyZXMgdGhlIGNvbmZpZyBhcyBgY29uc3QgbmV4dENvbmZpZzogTmV4dENvbmZpZyA9IHsgLi4uIH1gIGFuZFxuICAvLyBleHBvcnRzIGl0IChwb3NzaWJseSB3cmFwcGVkLCBlLmcuIGB3aXRoU2VudHJ5Q29uZmlnKC4uLilgKSwgc28gdGhlIG9iamVjdCBsaXRlcmFsIGlzIHJhcmVseVxuICAvLyB0aGUgZGlyZWN0IG9wZXJhbmQgb2YgYGV4cG9ydCBkZWZhdWx0YC9gbW9kdWxlLmV4cG9ydHNgLiBDb2xsZWN0IGV2ZXJ5IGNhbmRpZGF0ZSBhbmQgcGljayB0aGVcbiAgLy8gbW9zdCBhdXRob3JpdGF0aXZlIG9uZSBiZWxvdy5cbiAgbGV0IGRpcmVjdE9iamVjdExpdGVyYWw6IGFzdC5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbiB8IHVuZGVmaW5lZDtcbiAgbGV0IGV4cG9ydGVkSWRlbnRpZmllcjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBjb25zdCB2YXJpYWJsZU9iamVjdExpdGVyYWxzID0gbmV3IE1hcDxzdHJpbmcsIGFzdC5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbj4oKTtcbiAgY29uc3QgdHlwZWRDb25maWdPYmplY3RMaXRlcmFsczogYXN0Lk9iamVjdExpdGVyYWxFeHByZXNzaW9uW10gPSBbXTtcblxuICBjb25zdCB2aXNpdCA9IChub2RlOiBhc3QuTm9kZSk6IHZvaWQgPT4ge1xuICAgIGlmIChhc3QuaXNFeHBvcnRBc3NpZ25tZW50KG5vZGUpKSB7XG4gICAgICBjb25zdCBvYmplY3RMaXRlcmFsID0gdW53cmFwT2JqZWN0TGl0ZXJhbChub2RlLmV4cHJlc3Npb24pO1xuICAgICAgaWYgKG9iamVjdExpdGVyYWwpIHtcbiAgICAgICAgZGlyZWN0T2JqZWN0TGl0ZXJhbCA/Pz0gb2JqZWN0TGl0ZXJhbDtcbiAgICAgIH0gZWxzZSBpZiAoYXN0LmlzSWRlbnRpZmllcihub2RlLmV4cHJlc3Npb24pKSB7XG4gICAgICAgIGV4cG9ydGVkSWRlbnRpZmllciA/Pz0gbm9kZS5leHByZXNzaW9uLmdldFRleHQoc291cmNlKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgYXN0LmlzQmluYXJ5RXhwcmVzc2lvbihub2RlKSAmJlxuICAgICAgbm9kZS5vcGVyYXRvclRva2VuLmtpbmQgPT09IGFzdC5TeW50YXhLaW5kLkVxdWFsc1Rva2VuICYmXG4gICAgICBub2RlLmxlZnQuZ2V0VGV4dChzb3VyY2UpID09PSAnbW9kdWxlLmV4cG9ydHMnXG4gICAgKSB7XG4gICAgICBjb25zdCBvYmplY3RMaXRlcmFsID0gdW53cmFwT2JqZWN0TGl0ZXJhbChub2RlLnJpZ2h0KTtcbiAgICAgIGlmIChvYmplY3RMaXRlcmFsKSB7XG4gICAgICAgIGRpcmVjdE9iamVjdExpdGVyYWwgPz89IG9iamVjdExpdGVyYWw7XG4gICAgICB9IGVsc2UgaWYgKGFzdC5pc0lkZW50aWZpZXIobm9kZS5yaWdodCkpIHtcbiAgICAgICAgZXhwb3J0ZWRJZGVudGlmaWVyID8/PSBub2RlLnJpZ2h0LmdldFRleHQoc291cmNlKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGFzdC5pc1ZhcmlhYmxlRGVjbGFyYXRpb24obm9kZSkgJiYgbm9kZS5pbml0aWFsaXplcikge1xuICAgICAgY29uc3Qgb2JqZWN0TGl0ZXJhbCA9IHVud3JhcE9iamVjdExpdGVyYWwobm9kZS5pbml0aWFsaXplcik7XG4gICAgICBpZiAob2JqZWN0TGl0ZXJhbCAmJiBhc3QuaXNJZGVudGlmaWVyKG5vZGUubmFtZSkpIHtcbiAgICAgICAgdmFyaWFibGVPYmplY3RMaXRlcmFscy5zZXQobm9kZS5uYW1lLmdldFRleHQoc291cmNlKSwgb2JqZWN0TGl0ZXJhbCk7XG4gICAgICAgIC8vIFRoZSBgOiBOZXh0Q29uZmlnYCBhbm5vdGF0aW9uIHdiZnkgd3JpdGVzIG1hcmtzIHRoZSBjYW5vbmljYWwgY29uZmlnIG9iamVjdCAoYWNjZXB0aW5nXG4gICAgICAgIC8vIHF1YWxpZmllZCBuYW1lcyBzdWNoIGFzIGBpbXBvcnQoJ25leHQnKS5OZXh0Q29uZmlnYCkuXG4gICAgICAgIGNvbnN0IGFubm90YXRpb25UeXBlID0gbm9kZS50eXBlPy5nZXRUZXh0KHNvdXJjZSk7XG4gICAgICAgIGlmIChhbm5vdGF0aW9uVHlwZSAhPT0gdW5kZWZpbmVkICYmIGlzTmV4dENvbmZpZ1R5cGUoYW5ub3RhdGlvblR5cGUpKSB7XG4gICAgICAgICAgdHlwZWRDb25maWdPYmplY3RMaXRlcmFscy5wdXNoKG9iamVjdExpdGVyYWwpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIG5vZGUuZm9yRWFjaENoaWxkKHZpc2l0KTtcbiAgfTtcbiAgc291cmNlLmZvckVhY2hDaGlsZCh2aXNpdCk7XG5cbiAgY29uc3Qgb2JqZWN0TGl0ZXJhbCA9XG4gICAgdHlwZWRDb25maWdPYmplY3RMaXRlcmFsc1swXSA/P1xuICAgIGRpcmVjdE9iamVjdExpdGVyYWwgPz9cbiAgICAoZXhwb3J0ZWRJZGVudGlmaWVyID8gdmFyaWFibGVPYmplY3RMaXRlcmFscy5nZXQoZXhwb3J0ZWRJZGVudGlmaWVyKSA6IHVuZGVmaW5lZCkgPz9cbiAgICB2YXJpYWJsZU9iamVjdExpdGVyYWxzLmdldCgnbmV4dENvbmZpZycpO1xuICByZXR1cm4gb2JqZWN0TGl0ZXJhbCA/IHsgc291cmNlLCBvYmplY3RMaXRlcmFsIH0gOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHVud3JhcE9iamVjdExpdGVyYWwobm9kZTogYXN0LkV4cHJlc3Npb24pOiBhc3QuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24gfCB1bmRlZmluZWQge1xuICBjb25zdCBjdXJyZW50ID0gdW53cmFwUGFyZW50aGVzZXMobm9kZSk7XG4gIHJldHVybiBhc3QuaXNPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihjdXJyZW50KSA/IGN1cnJlbnQgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHVud3JhcFBhcmVudGhlc2VzKG5vZGU6IGFzdC5FeHByZXNzaW9uKTogYXN0LkV4cHJlc3Npb24ge1xuICBsZXQgY3VycmVudCA9IG5vZGU7XG4gIHdoaWxlIChhc3QuaXNQYXJlbnRoZXNpemVkRXhwcmVzc2lvbihjdXJyZW50KSkge1xuICAgIGN1cnJlbnQgPSBjdXJyZW50LmV4cHJlc3Npb247XG4gIH1cbiAgcmV0dXJuIGN1cnJlbnQ7XG59XG5cbi8vIE1hdGNoIGJvdGggdGhlIGJhcmUgYE5leHRDb25maWdgIGFuZCBxdWFsaWZpZWQgZm9ybXMgbGlrZSBgaW1wb3J0KCduZXh0JykuTmV4dENvbmZpZ2AuXG5mdW5jdGlvbiBpc05leHRDb25maWdUeXBlKHR5cGVUZXh0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVUZXh0ID09PSAnTmV4dENvbmZpZycgfHwgdHlwZVRleHQuZW5kc1dpdGgoJy5OZXh0Q29uZmlnJyk7XG59XG5cbi8vIFJldHVybiBhIHByb3BlcnR5IGtleSB3aXRob3V0IHN1cnJvdW5kaW5nIHF1b3Rlcywgc28gYCdyZWFjdENvbXBpbGVyJ2AgbWF0Y2hlcyBgcmVhY3RDb21waWxlcmAuXG4vLyBJZGVudGlmaWVyLCBzdHJpbmctbGl0ZXJhbCBhbmQgbnVtZXJpYy1saXRlcmFsIG5hbWVzIGFsbCBleHBvc2UgdGhlIHVucXVvdGVkIHZhbHVlIHZpYSBgLnRleHRgLlxuZnVuY3Rpb24gZ2V0UHJvcGVydHlLZXkobmFtZTogYXN0LlByb3BlcnR5TmFtZSwgc291cmNlOiBhc3QuU291cmNlRmlsZSk6IHN0cmluZyB7XG4gIHJldHVybiAndGV4dCcgaW4gbmFtZSAmJiB0eXBlb2YgbmFtZS50ZXh0ID09PSAnc3RyaW5nJyA/IG5hbWUudGV4dCA6IG5hbWUuZ2V0VGV4dChzb3VyY2UpO1xufVxuXG5mdW5jdGlvbiBzdHJpcENvbW1lbnRzKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB0ZXh0LnJlcGxhY2VBbGwoL1xcL1xcL1teXFxuXSp8XFwvXFwqW1xcc1xcU10qP1xcKlxcLy9nLCAnJyk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5cbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4Q2hha3JhVG9hc3Rlcihjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhDaGFrcmFUb2FzdGVyJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghY29uZmlnLmRlcGVuZGluZy5jaGFrcmEpIHJldHVybjtcblxuICAgIGNvbnN0IGZpbGVQYXRocyA9IGF3YWl0IGZnLmdsb2IoJyoqL3RvYXN0ZXIue3RzLHRzeH0nLCB7XG4gICAgICBhYnNvbHV0ZTogdHJ1ZSxcbiAgICAgIGN3ZDogY29uZmlnLmRpclBhdGgsXG4gICAgICBpZ25vcmU6IFsnKiovLiovKionLCAnKiovbm9kZV9tb2R1bGVzLyoqJ10sXG4gICAgfSk7XG4gICAgZm9yIChjb25zdCBmaWxlUGF0aCBvZiBmaWxlUGF0aHMpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGlmIChcbiAgICAgICAgY29udGVudC5pbmNsdWRlcygnQ3JlYXRlVG9hc3RlclJldHVybicpIHx8XG4gICAgICAgICFjb250ZW50LmluY2x1ZGVzKFwiZnJvbSAnQGNoYWtyYS11aS9yZWFjdCdcIikgfHxcbiAgICAgICAgIWNvbnRlbnQuaW5jbHVkZXMoJ2V4cG9ydCBjb25zdCB0b2FzdGVyID0gY3JlYXRlVG9hc3RlcignKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgdXBkYXRlZENvbnRlbnQgPSBjb250ZW50XG4gICAgICAgIC5yZXBsYWNlKFxuICAgICAgICAgIC9eaW1wb3J0IC4qIGZyb20gJ0BjaGFrcmEtdWlcXC9yZWFjdCc7JC9tdSxcbiAgICAgICAgICBcIiQmXFxuaW1wb3J0IHR5cGUgeyBDcmVhdGVUb2FzdGVyUmV0dXJuIH0gZnJvbSAnQGNoYWtyYS11aS9yZWFjdCc7XCJcbiAgICAgICAgKVxuICAgICAgICAucmVwbGFjZSgnZXhwb3J0IGNvbnN0IHRvYXN0ZXIgPSBjcmVhdGVUb2FzdGVyKCcsICdleHBvcnQgY29uc3QgdG9hc3RlcjogQ3JlYXRlVG9hc3RlclJldHVybiA9IGNyZWF0ZVRvYXN0ZXIoJyk7XG4gICAgICBpZiAodXBkYXRlZENvbnRlbnQgIT09IGNvbnRlbnQpIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIHVwZGF0ZWRDb250ZW50KTtcbiAgICB9XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0ICogYXMgYXN0IGZyb20gJ3R5cGVzY3JpcHQvdW5zdGFibGUvYXN0JztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgcGFyc2VTb3VyY2VGaWxlIH0gZnJvbSAnLi4vdXRpbHMvdHlwZXNjcmlwdEFwaS5qcyc7XG5cbnR5cGUgUGFyc2VkVmFsdWUgPVxuICB8IHsga2luZDogJ2FycmF5JzsgdmFsdWU6IFBhcnNlZFZhbHVlW10gfVxuICB8IHsga2luZDogJ2xpdGVyYWwnOyB2YWx1ZTogc3RyaW5nIH1cbiAgfCB7IGtpbmQ6ICdvYmplY3QnOyB2YWx1ZTogUGFyc2VkT2JqZWN0IH07XG50eXBlIE9iamVjdE1lbWJlciA9IHsga2luZDogJ2V4dHJhJzsgaW5kZXg6IG51bWJlciB9IHwgeyBraW5kOiAncHJvcGVydHknOyBrZXk6IHN0cmluZyB9O1xuaW50ZXJmYWNlIFBhcnNlZE9iamVjdCB7XG4gIGV4dHJhTWVtYmVyczogc3RyaW5nW107XG4gIG1lbWJlck9yZGVyOiBPYmplY3RNZW1iZXJbXTtcbiAgcHJvcGVydGllczogUmVjb3JkPHN0cmluZywgUGFyc2VkVmFsdWU+O1xufVxuaW50ZXJmYWNlIEV4dHJhY3RlZE9iamVjdExpdGVyYWwge1xuICBzb3VyY2U6IGFzdC5Tb3VyY2VGaWxlO1xuICBub2RlOiBhc3QuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb247XG59XG5jb25zdCBsaXRlcmFsID0gKHZhbHVlOiBzdHJpbmcpOiBQYXJzZWRWYWx1ZSA9PiAoeyBraW5kOiAnbGl0ZXJhbCcsIHZhbHVlIH0pO1xuY29uc3QgYXNBcnJheSA9ICh2YWx1ZTogUGFyc2VkVmFsdWVbXSk6IFBhcnNlZFZhbHVlID0+ICh7IGtpbmQ6ICdhcnJheScsIHZhbHVlIH0pO1xuY29uc3QgYXNPYmplY3QgPSAocHJvcGVydGllczogUmVjb3JkPHN0cmluZywgUGFyc2VkVmFsdWU+LCBleHRyYU1lbWJlcnM6IHN0cmluZ1tdID0gW10pOiBQYXJzZWRWYWx1ZSA9PiAoe1xuICBraW5kOiAnb2JqZWN0JyxcbiAgdmFsdWU6IHRvUGFyc2VkT2JqZWN0KHByb3BlcnRpZXMsIGV4dHJhTWVtYmVycyksXG59KTtcblxuZnVuY3Rpb24gY3JlYXRlRGVmYXVsdENvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcsIHNob3VsZFVzZUFwcFNlcnZlckRlZmF1bHRzOiBib29sZWFuKTogUGFyc2VkT2JqZWN0IHtcbiAgY29uc3QgdXNlID0gdG9QYXJzZWRPYmplY3Qoe1xuICAgIHRyYWNlOiBsaXRlcmFsKFwicHJvY2Vzcy5lbnYuQ0kgPyAnb24tZmlyc3QtcmV0cnknIDogJ3JldGFpbi1vbi1mYWlsdXJlJ1wiKSxcbiAgICBzY3JlZW5zaG90OiBsaXRlcmFsKFwicHJvY2Vzcy5lbnYuQ0kgPyAnb25seS1vbi1mYWlsdXJlJyA6ICdvbidcIiksXG4gICAgdmlkZW86IGxpdGVyYWwoXCJwcm9jZXNzLmVudi5DSSA/ICdvbi1maXJzdC1yZXRyeScgOiAncmV0YWluLW9uLWZhaWx1cmUnXCIpLFxuICB9KTtcblxuICBpZiAoc2hvdWxkVXNlQXBwU2VydmVyRGVmYXVsdHMpIHtcbiAgICB1c2UucHJvcGVydGllcy5iYXNlVVJMID0gbGl0ZXJhbCgncHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfQkFTRV9VUkwnKTtcbiAgICB1c2UubWVtYmVyT3JkZXIudW5zaGlmdCh7IGtpbmQ6ICdwcm9wZXJ0eScsIGtleTogJ2Jhc2VVUkwnIH0pO1xuICB9XG5cbiAgcmV0dXJuIHRvUGFyc2VkT2JqZWN0KHtcbiAgICBmb3JiaWRPbmx5OiBsaXRlcmFsKCchIXByb2Nlc3MuZW52LkNJJyksXG4gICAgcmV0cmllczogbGl0ZXJhbCgncHJvY2Vzcy5lbnYuUFdERUJVRyA/IDAgOiBwcm9jZXNzLmVudi5DSSA/IDUgOiAxJyksXG4gICAgdXNlOiB7IGtpbmQ6ICdvYmplY3QnLCB2YWx1ZTogdXNlIH0sXG4gICAgLi4uKHNob3VsZFVzZUFwcFNlcnZlckRlZmF1bHRzXG4gICAgICA/IHtcbiAgICAgICAgICB3ZWJTZXJ2ZXI6IGFzT2JqZWN0KHtcbiAgICAgICAgICAgIGNvbW1hbmQ6IGxpdGVyYWwoZ2V0V2JTdGFydFRlc3RDb21tYW5kKCkpLFxuICAgICAgICAgICAgdXJsOiBsaXRlcmFsKCdwcm9jZXNzLmVudi5ORVhUX1BVQkxJQ19CQVNFX1VSTCcpLFxuICAgICAgICAgICAgcmV1c2VFeGlzdGluZ1NlcnZlcjogbGl0ZXJhbCgnISFwcm9jZXNzLmVudi5DSScpLFxuICAgICAgICAgICAgdGltZW91dDogbGl0ZXJhbCgnMzAwXzAwMCcpLFxuICAgICAgICAgICAgc3Rkb3V0OiBsaXRlcmFsKFwiJ3BpcGUnXCIpLFxuICAgICAgICAgICAgc3RkZXJyOiBsaXRlcmFsKFwiJ3BpcGUnXCIpLFxuICAgICAgICAgICAgZW52OiBsaXRlcmFsKGB7XG4gIC4uLnByb2Nlc3MuZW52LFxuICBQUklTTUFfVVNFUl9DT05TRU5UX0ZPUl9EQU5HRVJPVVNfQUlfQUNUSU9OOiAndHJ1ZScsXG59YCksXG4gICAgICAgICAgICBncmFjZWZ1bFNodXRkb3duOiBsaXRlcmFsKGB7XG4gIHNpZ25hbDogJ1NJR1RFUk0nLFxuICB0aW1lb3V0OiA1MDAsXG59YCksXG4gICAgICAgICAgfSksXG4gICAgICAgIH1cbiAgICAgIDoge30pLFxuICB9KTtcbn1cblxuZnVuY3Rpb24gdG9QYXJzZWRPYmplY3QocHJvcGVydGllczogUmVjb3JkPHN0cmluZywgUGFyc2VkVmFsdWU+LCBleHRyYU1lbWJlcnM6IHN0cmluZ1tdID0gW10pOiBQYXJzZWRPYmplY3Qge1xuICByZXR1cm4ge1xuICAgIGV4dHJhTWVtYmVycyxcbiAgICBtZW1iZXJPcmRlcjogW1xuICAgICAgLi4uT2JqZWN0LmtleXMocHJvcGVydGllcykubWFwKChrZXkpOiBPYmplY3RNZW1iZXIgPT4gKHsga2luZDogJ3Byb3BlcnR5Jywga2V5IH0pKSxcbiAgICAgIC4uLmV4dHJhTWVtYmVycy5tYXAoKF8sIGluZGV4KTogT2JqZWN0TWVtYmVyID0+ICh7IGtpbmQ6ICdleHRyYScsIGluZGV4IH0pKSxcbiAgICBdLFxuICAgIHByb3BlcnRpZXMsXG4gIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhQbGF5d3JpZ2h0Q29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgYHBsYXl3cmlnaHQuY29uZmlnLnRzYCk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHJldHVybjtcblxuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFBsYXl3cmlnaHRDb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbCA9IGF3YWl0IGV4dHJhY3REZWZpbmVDb25maWdPYmplY3RMaXRlcmFsKGZpbGVQYXRoKTtcbiAgICBpZiAoIWV4dHJhY3RlZE9iamVjdExpdGVyYWwpIHJldHVybjtcblxuICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbC5ub2RlLCBleHRyYWN0ZWRPYmplY3RMaXRlcmFsLnNvdXJjZSk7XG4gICAgaWYgKCFwYXJzZWQpIHJldHVybjtcblxuICAgIC8vIHdiIGRlcml2ZXMgTkVYVF9QVUJMSUNfQkFTRV9VUkwgZnJvbSB0aGUgcmVzb2x2ZWQgcG9ydCBmb3IgTmV4dC5qcy92aW5leHQgYXBwcyAodmluZXh0XG4gICAgLy8gYXBwcyBhbHNvIGRlcGVuZCBvbiBuZXh0LCBzbyBgZGVwZW5kaW5nLm5leHRgIGNvdmVycyBib3RoKSwgc28gdGhvc2UgbmVlZCBubyBkZWNsYXJlZFxuICAgIC8vIHZhcmlhYmxlOyBvdGhlciBwYWNrYWdlcyBzdGlsbCByZXF1aXJlIGEgZGVjbGFyYXRpb24uXG4gICAgY29uc3Qgc2hvdWxkVXNlQXBwU2VydmVyRGVmYXVsdHMgPVxuICAgICAgc2hvdWxkTWFuYWdlQXBwU2VydmVyRGVmYXVsdHMoY29uZmlnLCBwYXJzZWQpICYmXG4gICAgICAoY29uZmlnLmRlcGVuZGluZy5uZXh0IHx8IChhd2FpdCBkb2VzRGVmaW5lTmV4dFB1YmxpY0Jhc2VVcmwoY29uZmlnLmRpclBhdGgpKSk7XG4gICAgY29uc3QgZGVmYXVsdENvbmZpZyA9IGNyZWF0ZURlZmF1bHRDb25maWcoY29uZmlnLCBzaG91bGRVc2VBcHBTZXJ2ZXJEZWZhdWx0cyk7XG4gICAgY29uc3QgbWVyZ2VkID0gbWVyZ2VQYXJzZWRPYmplY3RzKGRlZmF1bHRDb25maWcsIHBhcnNlZCk7XG4gICAgYXBwbHlNYW5hZ2VkVXNlRGVmYXVsdHMobWVyZ2VkLCBkZWZhdWx0Q29uZmlnKTtcbiAgICBzZXRXZWJTZXJ2ZXJDb21tYW5kKG1lcmdlZCk7XG5cbiAgICBjb25zdCBuZXdPYmplY3RMaXRlcmFsID0gc3RyaW5naWZ5VmFsdWUoeyBraW5kOiAnb2JqZWN0JywgdmFsdWU6IG1lcmdlZCB9LCAwKTtcbiAgICBjb25zdCBvbGRDb250ZW50ID0gZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbC5zb3VyY2UudGV4dDtcbiAgICBjb25zdCBzdGFydCA9IGV4dHJhY3RlZE9iamVjdExpdGVyYWwubm9kZS5nZXRTdGFydChleHRyYWN0ZWRPYmplY3RMaXRlcmFsLnNvdXJjZSk7XG4gICAgY29uc3QgZW5kID0gZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbC5ub2RlLmdldEVuZCgpO1xuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBgJHtvbGRDb250ZW50LnNsaWNlKDAsIHN0YXJ0KX0ke25ld09iamVjdExpdGVyYWx9JHtvbGRDb250ZW50LnNsaWNlKGVuZCl9YDtcblxuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBtZXJnZVBhcnNlZE9iamVjdHMoYmFzZTogUGFyc2VkT2JqZWN0LCBvdmVycmlkZTogUGFyc2VkT2JqZWN0KTogUGFyc2VkT2JqZWN0IHtcbiAgY29uc3Qgb3ZlcnJpZGVQcm9wZXJ0eUtleXMgPSBuZXcgU2V0KE9iamVjdC5rZXlzKG92ZXJyaWRlLnByb3BlcnRpZXMpKTtcbiAgY29uc3QgZXh0cmFNZW1iZXJzID0gWy4uLmJhc2UuZXh0cmFNZW1iZXJzLCAuLi5vdmVycmlkZS5leHRyYU1lbWJlcnNdO1xuICAvLyBLZWVwIGRlZmF1bHQtb25seSBtZW1iZXJzIGJlZm9yZSBwYXJzZWQgbWVtYmVycyBzbyBzcHJlYWRzIGFuZCBleHBsaWNpdCBsb2NhbCBwcm9wZXJ0aWVzIHJldGFpbiBwcmVjZWRlbmNlLlxuICBjb25zdCBtZW1iZXJPcmRlciA9IFtcbiAgICAuLi5iYXNlLm1lbWJlck9yZGVyLmZpbHRlcigobWVtYmVyKSA9PiBtZW1iZXIua2luZCAhPT0gJ3Byb3BlcnR5JyB8fCAhb3ZlcnJpZGVQcm9wZXJ0eUtleXMuaGFzKG1lbWJlci5rZXkpKSxcbiAgICAuLi5vdmVycmlkZS5tZW1iZXJPcmRlci5tYXAoKG1lbWJlcik6IE9iamVjdE1lbWJlciA9PiB7XG4gICAgICBpZiAobWVtYmVyLmtpbmQgPT09ICdwcm9wZXJ0eScpIHJldHVybiBtZW1iZXI7XG4gICAgICByZXR1cm4geyBraW5kOiAnZXh0cmEnLCBpbmRleDogYmFzZS5leHRyYU1lbWJlcnMubGVuZ3RoICsgbWVtYmVyLmluZGV4IH07XG4gICAgfSksXG4gIF07XG4gIGNvbnN0IHByb3BlcnRpZXMgPSB7IC4uLmJhc2UucHJvcGVydGllcyB9O1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvdmVycmlkZS5wcm9wZXJ0aWVzKSkge1xuICAgIHByb3BlcnRpZXNba2V5XSA9IG1lcmdlUGFyc2VkVmFsdWUocHJvcGVydGllc1trZXldLCB2YWx1ZSk7XG4gIH1cbiAgcmV0dXJuIHsgZXh0cmFNZW1iZXJzLCBtZW1iZXJPcmRlciwgcHJvcGVydGllcyB9O1xufVxuXG5mdW5jdGlvbiBtZXJnZVBhcnNlZFZhbHVlKGJhc2U6IFBhcnNlZFZhbHVlIHwgdW5kZWZpbmVkLCBvdmVycmlkZTogUGFyc2VkVmFsdWUpOiBQYXJzZWRWYWx1ZSB7XG4gIGlmIChiYXNlPy5raW5kID09PSAnb2JqZWN0JyAmJiBvdmVycmlkZS5raW5kID09PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiB7IGtpbmQ6ICdvYmplY3QnLCB2YWx1ZTogbWVyZ2VQYXJzZWRPYmplY3RzKGJhc2UudmFsdWUsIG92ZXJyaWRlLnZhbHVlKSB9O1xuICB9XG4gIHJldHVybiBvdmVycmlkZTtcbn1cblxuZnVuY3Rpb24gYXBwbHlNYW5hZ2VkVXNlRGVmYXVsdHMoY29uZmlnOiBQYXJzZWRPYmplY3QsIGRlZmF1bHRDb25maWc6IFBhcnNlZE9iamVjdCk6IHZvaWQge1xuICBjb25zdCB1c2UgPSBjb25maWcucHJvcGVydGllcy51c2U7XG4gIGNvbnN0IGRlZmF1bHRVc2UgPSBkZWZhdWx0Q29uZmlnLnByb3BlcnRpZXMudXNlO1xuICBpZiAodXNlPy5raW5kICE9PSAnb2JqZWN0JyB8fCBkZWZhdWx0VXNlPy5raW5kICE9PSAnb2JqZWN0JykgcmV0dXJuO1xuXG4gIGZvciAoY29uc3Qga2V5IG9mIFsndHJhY2UnLCAnc2NyZWVuc2hvdCcsICd2aWRlbyddKSB7XG4gICAgY29uc3QgZGVmYXVsdFZhbHVlID0gZGVmYXVsdFVzZS52YWx1ZS5wcm9wZXJ0aWVzW2tleV07XG4gICAgaWYgKGRlZmF1bHRWYWx1ZSkge1xuICAgICAgdXNlLnZhbHVlLnByb3BlcnRpZXNba2V5XSA9IGRlZmF1bHRWYWx1ZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvdWxkTWFuYWdlQXBwU2VydmVyRGVmYXVsdHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBwYXJzZWQ6IFBhcnNlZE9iamVjdCk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIGNvbmZpZy5kZXBlbmRpbmcubmV4dCB8fFxuICAgIHBhcnNlZC5wcm9wZXJ0aWVzLndlYlNlcnZlciAhPT0gdW5kZWZpbmVkIHx8XG4gICAgZG9lc09iamVjdEhhdmVCYXNlVXJsKHBhcnNlZC5wcm9wZXJ0aWVzLnVzZSkgfHxcbiAgICBkb2VzVmFsdWVDb250YWluTGl0ZXJhbCh7IGtpbmQ6ICdvYmplY3QnLCB2YWx1ZTogcGFyc2VkIH0sICdORVhUX1BVQkxJQ19CQVNFX1VSTCcpXG4gICk7XG59XG5cbmZ1bmN0aW9uIGRvZXNPYmplY3RIYXZlQmFzZVVybCh2YWx1ZTogUGFyc2VkVmFsdWUgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIHZhbHVlPy5raW5kID09PSAnb2JqZWN0JyAmJiB2YWx1ZS52YWx1ZS5wcm9wZXJ0aWVzLmJhc2VVUkwgIT09IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZG9lc1ZhbHVlQ29udGFpbkxpdGVyYWwodmFsdWU6IFBhcnNlZFZhbHVlLCBsaXRlcmFsVGV4dDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmICh2YWx1ZS5raW5kID09PSAnbGl0ZXJhbCcpIHJldHVybiB2YWx1ZS52YWx1ZS5pbmNsdWRlcyhsaXRlcmFsVGV4dCk7XG4gIGlmICh2YWx1ZS5raW5kID09PSAnYXJyYXknKSByZXR1cm4gdmFsdWUudmFsdWUuc29tZSgoY2hpbGQpID0+IGRvZXNWYWx1ZUNvbnRhaW5MaXRlcmFsKGNoaWxkLCBsaXRlcmFsVGV4dCkpO1xuICByZXR1cm4gKFxuICAgIHZhbHVlLnZhbHVlLmV4dHJhTWVtYmVycy5zb21lKChtZW1iZXIpID0+IG1lbWJlci5pbmNsdWRlcyhsaXRlcmFsVGV4dCkpIHx8XG4gICAgT2JqZWN0LnZhbHVlcyh2YWx1ZS52YWx1ZS5wcm9wZXJ0aWVzKS5zb21lKChjaGlsZCkgPT4gZG9lc1ZhbHVlQ29udGFpbkxpdGVyYWwoY2hpbGQsIGxpdGVyYWxUZXh0KSlcbiAgKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZG9lc0RlZmluZU5leHRQdWJsaWNCYXNlVXJsKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBmb3IgKGNvbnN0IGVudkZpbGVQYXRoIG9mIGdldEVudkZpbGVQYXRocyhkaXJQYXRoKSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZW52RmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBpZiAoL05FWFRfUFVCTElDX0JBU0VfVVJMXFxzKj0vbS50ZXN0KGNvbnRlbnQpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gTWlzc2luZyBlbnYgZmlsZXMgYXJlIGV4cGVjdGVkIGluIHNvbWUgcmVwb3MuXG4gICAgfVxuICB9XG5cbiAgLy8gU29tZSBQbGF5d3JpZ2h0IGNvbmZpZ3Mgb25seSBkZWZpbmUgYnJvd3NlciBwcm9qZWN0cyBvciBmaXh0dXJlcyBhbmQgZG8gbm90XG4gIC8vIHN0YXJ0IGEgd2ViIGFwcC4gQXZvaWQgZm9yY2luZyBhbiBhcHAtc2VydmVyIFVSTCBpbnRvIHRob3NlIHBhY2thZ2VzLlxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGdldEVudkZpbGVQYXRocyhkaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGVudkZpbGVOYW1lcyA9IFsnZm5veC50b21sJywgJ21pc2UudG9tbCcsICdtaXNlLnRlc3QudG9tbCddO1xuICBjb25zdCBlbnZGaWxlUGF0aHM6IHN0cmluZ1tdID0gW107XG5cbiAgZm9yIChsZXQgY3VycmVudERpclBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCk7IDsgY3VycmVudERpclBhdGggPSBwYXRoLmRpcm5hbWUoY3VycmVudERpclBhdGgpKSB7XG4gICAgZW52RmlsZVBhdGhzLnB1c2goLi4uZW52RmlsZU5hbWVzLm1hcCgoZmlsZU5hbWUpID0+IHBhdGgucmVzb2x2ZShjdXJyZW50RGlyUGF0aCwgZmlsZU5hbWUpKSk7XG5cbiAgICAvLyBQbGF5d3JpZ2h0IGNvbmZpZ3Mgb2Z0ZW4gbGl2ZSBpbiBwYWNrYWdlcy8qIHdoaWxlIHNoYXJlZCBlbnYgZmlsZXMgbGl2ZSBhdCB0aGVcbiAgICAvLyByZXBvc2l0b3J5IHJvb3QsIHNvIHdhbGsgdXB3YXJkIHVudGlsIHRoZSB0YXJnZXQgcmVwbyBib3VuZGFyeS5cbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY3VycmVudERpclBhdGgsICcuZ2l0JykpKSBicmVhaztcblxuICAgIGNvbnN0IHBhcmVudERpclBhdGggPSBwYXRoLmRpcm5hbWUoY3VycmVudERpclBhdGgpO1xuICAgIGlmIChwYXJlbnREaXJQYXRoID09PSBjdXJyZW50RGlyUGF0aCkgYnJlYWs7XG4gIH1cblxuICByZXR1cm4gZW52RmlsZVBhdGhzO1xufVxuXG5mdW5jdGlvbiBzZXRXZWJTZXJ2ZXJDb21tYW5kKG9iamVjdDogUGFyc2VkT2JqZWN0KTogdm9pZCB7XG4gIGNvbnN0IHdlYlNlcnZlciA9IG9iamVjdC5wcm9wZXJ0aWVzLndlYlNlcnZlcjtcbiAgaWYgKHdlYlNlcnZlcj8ua2luZCAhPT0gJ29iamVjdCcpIHJldHVybjtcblxuICBjb25zdCBjb21tYW5kID0gd2ViU2VydmVyLnZhbHVlLnByb3BlcnRpZXMuY29tbWFuZDtcbiAgLy8gTGlicmFyaWVzIGNhbiB1c2UgUGxheXdyaWdodCdzIHdlYlNlcnZlciB0byBidWlsZCBhbmQgbGF1bmNoIGEgZml4dHVyZSBldmVuIHRob3VnaCBgd2Igc3RhcnRgXG4gIC8vIGludGVudGlvbmFsbHkgaGFzIG5vIHRlc3Qgc2VydmVyIGZvciB0aGUgbGlicmFyeSBpdHNlbGYuIFByZXNlcnZlIHRob3NlIGN1c3RvbSBsaWZlY3ljbGVcbiAgLy8gY29tbWFuZHM7IG9ubHkgYWRkIHRoZSBjb21tYW5kIHdoZW4gd2JmeSBhbHJlYWR5IG93bnMgaXQuXG4gIGlmIChjb21tYW5kICYmICFpc0dlbmVyYXRlZFdiU3RhcnRUZXN0Q29tbWFuZChjb21tYW5kKSkgcmV0dXJuO1xuXG4gIC8vIFBsYXl3cmlnaHQgcmVxdWlyZXMgYGNvbW1hbmRgIHdoZW5ldmVyIGB3ZWJTZXJ2ZXJgIGV4aXN0czsgYW4gZXh0ZXJuYWxseSBtYW5hZ2VkIHNlcnZlciBzaG91bGRcbiAgLy8gb21pdCBgd2ViU2VydmVyYCBpbnN0ZWFkLiBLZWVwIGZpbGxpbmcgdGhpcyByZXF1aXJlZCBmaWVsZCB3aGVuIGEgcGFydGlhbCBtYW5hZ2VkIGJsb2NrIGxhY2tzIGl0LlxuICB3ZWJTZXJ2ZXIudmFsdWUucHJvcGVydGllcy5jb21tYW5kID0gbGl0ZXJhbChnZXRXYlN0YXJ0VGVzdENvbW1hbmQoKSk7XG59XG5cbmZ1bmN0aW9uIGlzR2VuZXJhdGVkV2JTdGFydFRlc3RDb21tYW5kKGNvbW1hbmQ6IFBhcnNlZFZhbHVlKTogYm9vbGVhbiB7XG4gIGlmIChjb21tYW5kLmtpbmQgIT09ICdsaXRlcmFsJykgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gY29tbWFuZC52YWx1ZS50cmltKCkgPT09IGdldFdiU3RhcnRUZXN0Q29tbWFuZCgpO1xufVxuXG5mdW5jdGlvbiBnZXRXYlN0YXJ0VGVzdENvbW1hbmQoKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAnYnVuIHdiIHN0YXJ0IC0tbW9kZSB0ZXN0J2A7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGV4dHJhY3REZWZpbmVDb25maWdPYmplY3RMaXRlcmFsKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPEV4dHJhY3RlZE9iamVjdExpdGVyYWwgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3Qgc291cmNlID0gYXdhaXQgcGFyc2VTb3VyY2VGaWxlKGZpbGVQYXRoKTtcbiAgaWYgKCFzb3VyY2UpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgLy8gVHlwZVNjcmlwdCBhbHJlYWR5IHVuZGVyc3RhbmRzIG5lc3RlZCBvYmplY3QgbGl0ZXJhbHMgYW5kIHRlbXBsYXRlIHN0cmluZ3MsIHNvIHVzZVxuICAvLyBpdHMgQVNUIHJhbmdlcyBpbnN0ZWFkIG9mIGEgcmVnZXggdGhhdCBjYW4gc3RvcCBhdCB0aGUgZmlyc3QgaW5uZXIgY2xvc2luZyBicmFjZS5cbiAgbGV0IGZvdW5kOiBhc3QuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24gfCB1bmRlZmluZWQ7XG4gIGNvbnN0IHZpc2l0ID0gKG5vZGU6IGFzdC5Ob2RlKTogdm9pZCA9PiB7XG4gICAgaWYgKGZvdW5kKSByZXR1cm47XG4gICAgaWYgKGFzdC5pc0NhbGxFeHByZXNzaW9uKG5vZGUpICYmIG5vZGUuZXhwcmVzc2lvbi5nZXRUZXh0KHNvdXJjZSkgPT09ICdkZWZpbmVDb25maWcnKSB7XG4gICAgICBjb25zdCBmaXJzdEFyZ3VtZW50ID0gbm9kZS5hcmd1bWVudHNbMF07XG4gICAgICBpZiAoZmlyc3RBcmd1bWVudCAmJiBhc3QuaXNPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihmaXJzdEFyZ3VtZW50KSkge1xuICAgICAgICBmb3VuZCA9IGZpcnN0QXJndW1lbnQ7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgbm9kZS5mb3JFYWNoQ2hpbGQodmlzaXQpO1xuICB9O1xuICBzb3VyY2UuZm9yRWFjaENoaWxkKHZpc2l0KTtcblxuICByZXR1cm4gZm91bmQgPyB7IHNvdXJjZSwgbm9kZTogZm91bmQgfSA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gcGFyc2VFeHByZXNzaW9uKGV4cHJlc3Npb246IGFzdC5FeHByZXNzaW9uLCBzb3VyY2U6IGFzdC5Tb3VyY2VGaWxlKTogUGFyc2VkVmFsdWUgfCB1bmRlZmluZWQge1xuICBpZiAoYXN0LmlzT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oZXhwcmVzc2lvbikpIHtcbiAgICBjb25zdCBwYXJzZWRPYmplY3QgPSBwYXJzZU9iamVjdExpdGVyYWxFeHByZXNzaW9uKGV4cHJlc3Npb24sIHNvdXJjZSk7XG4gICAgcmV0dXJuIHBhcnNlZE9iamVjdCA/IHsga2luZDogJ29iamVjdCcsIHZhbHVlOiBwYXJzZWRPYmplY3QgfSA6IGxpdGVyYWwoZXhwcmVzc2lvbi5nZXRUZXh0KHNvdXJjZSkpO1xuICB9XG4gIGlmIChhc3QuaXNBcnJheUxpdGVyYWxFeHByZXNzaW9uKGV4cHJlc3Npb24pKSB7XG4gICAgY29uc3QgZWxlbWVudHMgPSBleHByZXNzaW9uLmVsZW1lbnRzLm1hcCgoZWxlbWVudCkgPT4gcGFyc2VFeHByZXNzaW9uKGVsZW1lbnQsIHNvdXJjZSkpO1xuICAgIGlmIChlbGVtZW50cy5zb21lKChlbGVtZW50KTogZWxlbWVudCBpcyB1bmRlZmluZWQgPT4gZWxlbWVudCA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgcmV0dXJuIGxpdGVyYWwoZXhwcmVzc2lvbi5nZXRUZXh0KHNvdXJjZSkpO1xuICAgIH1cbiAgICByZXR1cm4gYXNBcnJheShlbGVtZW50cyBhcyBQYXJzZWRWYWx1ZVtdKTtcbiAgfVxuICByZXR1cm4gbGl0ZXJhbChleHByZXNzaW9uLmdldFRleHQoc291cmNlKSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oXG4gIG9iamVjdExpdGVyYWw6IGFzdC5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbixcbiAgc291cmNlOiBhc3QuU291cmNlRmlsZVxuKTogUGFyc2VkT2JqZWN0IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcGFyc2VkOiBQYXJzZWRPYmplY3QgPSB7IGV4dHJhTWVtYmVyczogW10sIG1lbWJlck9yZGVyOiBbXSwgcHJvcGVydGllczoge30gfTtcbiAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBvYmplY3RMaXRlcmFsLnByb3BlcnRpZXMpIHtcbiAgICBpZiAoYXN0LmlzU2hvcnRoYW5kUHJvcGVydHlBc3NpZ25tZW50KHByb3BlcnR5KSkge1xuICAgICAgY29uc3Qga2V5ID0gcHJvcGVydHkubmFtZS5nZXRUZXh0KHNvdXJjZSk7XG4gICAgICBwYXJzZWQucHJvcGVydGllc1trZXldID0gbGl0ZXJhbChrZXkpO1xuICAgICAgcGFyc2VkLm1lbWJlck9yZGVyLnB1c2goeyBraW5kOiAncHJvcGVydHknLCBrZXkgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgIWFzdC5pc1Byb3BlcnR5QXNzaWdubWVudChwcm9wZXJ0eSkgfHxcbiAgICAgICghYXN0LmlzSWRlbnRpZmllcihwcm9wZXJ0eS5uYW1lKSAmJiAhYXN0LmlzU3RyaW5nTGl0ZXJhbChwcm9wZXJ0eS5uYW1lKSlcbiAgICApIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gcGFyc2VkLmV4dHJhTWVtYmVycy5wdXNoKHByb3BlcnR5LmdldFRleHQoc291cmNlKSkgLSAxO1xuICAgICAgcGFyc2VkLm1lbWJlck9yZGVyLnB1c2goeyBraW5kOiAnZXh0cmEnLCBpbmRleCB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZSA9IHBhcnNlRXhwcmVzc2lvbihwcm9wZXJ0eS5pbml0aWFsaXplciwgc291cmNlKTtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgIGNvbnN0IGtleSA9IHByb3BlcnR5Lm5hbWUuZ2V0VGV4dChzb3VyY2UpO1xuICAgIHBhcnNlZC5wcm9wZXJ0aWVzW2tleV0gPSB2YWx1ZTtcbiAgICBwYXJzZWQubWVtYmVyT3JkZXIucHVzaCh7IGtpbmQ6ICdwcm9wZXJ0eScsIGtleSB9KTtcbiAgfVxuICByZXR1cm4gcGFyc2VkO1xufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnlWYWx1ZSh2YWx1ZTogUGFyc2VkVmFsdWUsIGxldmVsOiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCBjbG9zaW5nSW5kZW50ID0gJyAgJy5yZXBlYXQobGV2ZWwpO1xuICBpZiAodmFsdWUua2luZCA9PT0gJ2FycmF5Jykge1xuICAgIGlmICh2YWx1ZS52YWx1ZS5sZW5ndGggPT09IDApIHJldHVybiAnW10nO1xuICAgIGNvbnN0IGluZGVudCA9ICcgICcucmVwZWF0KGxldmVsICsgMSk7XG4gICAgY29uc3QgbGluZXMgPSB2YWx1ZS52YWx1ZS5tYXAoKGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IHN0cmluZ2lmaWVkID0gc3RyaW5naWZ5VmFsdWUoaXRlbSwgbGV2ZWwgKyAxKS5zcGxpdCgnXFxuJyk7XG4gICAgICBzdHJpbmdpZmllZFtzdHJpbmdpZmllZC5sZW5ndGggLSAxXSA9IGAke3N0cmluZ2lmaWVkLmF0KC0xKX0sYDtcbiAgICAgIGlmIChpdGVtLmtpbmQgPT09ICdsaXRlcmFsJykge1xuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDE7IGluZGV4IDwgc3RyaW5naWZpZWQubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICAgICAgc3RyaW5naWZpZWRbaW5kZXhdID0gYCR7aW5kZW50fSR7c3RyaW5naWZpZWRbaW5kZXhdfWA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHN0cmluZ2lmaWVkWzBdID0gYCR7aW5kZW50fSR7c3RyaW5naWZpZWRbMF19YDtcbiAgICAgIHJldHVybiBzdHJpbmdpZmllZC5qb2luKCdcXG4nKTtcbiAgICB9KTtcbiAgICByZXR1cm4gYFtcXG4ke2xpbmVzLmpvaW4oJ1xcbicpfVxcbiR7Y2xvc2luZ0luZGVudH1dYDtcbiAgfVxuICBpZiAodmFsdWUua2luZCA9PT0gJ2xpdGVyYWwnKSByZXR1cm4gdmFsdWUudmFsdWU7XG5cbiAgY29uc3QgaW5kZW50ID0gJyAgJy5yZXBlYXQobGV2ZWwgKyAxKTtcbiAgY29uc3QgZW1pdHRlZFByb3BlcnRpZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgbGFzdFByb3BlcnR5SW5kZXhCeUtleSA9IGdldExhc3RQcm9wZXJ0eUluZGV4QnlLZXkodmFsdWUudmFsdWUubWVtYmVyT3JkZXIpO1xuICBjb25zdCBsaW5lcyA9IHZhbHVlLnZhbHVlLm1lbWJlck9yZGVyLmZsYXRNYXAoKG1lbWJlciwgaW5kZXgpID0+IHtcbiAgICBpZiAobWVtYmVyLmtpbmQgPT09ICdleHRyYScpIHtcbiAgICAgIHJldHVybiBbc3RyaW5naWZ5T2JqZWN0TWVtYmVyKHZhbHVlLnZhbHVlLmV4dHJhTWVtYmVyc1ttZW1iZXIuaW5kZXhdID8/ICcnLCBpbmRlbnQpXTtcbiAgICB9XG5cbiAgICBpZiAobGFzdFByb3BlcnR5SW5kZXhCeUtleS5nZXQobWVtYmVyLmtleSkgIT09IGluZGV4KSByZXR1cm4gW107XG4gICAgY29uc3QgaXRlbSA9IHZhbHVlLnZhbHVlLnByb3BlcnRpZXNbbWVtYmVyLmtleV07XG4gICAgaWYgKCFpdGVtIHx8IGVtaXR0ZWRQcm9wZXJ0aWVzLmhhcyhtZW1iZXIua2V5KSkgcmV0dXJuIFtdO1xuICAgIGVtaXR0ZWRQcm9wZXJ0aWVzLmFkZChtZW1iZXIua2V5KTtcbiAgICByZXR1cm4gW3N0cmluZ2lmeU9iamVjdFByb3BlcnR5KG1lbWJlci5rZXksIGl0ZW0sIGxldmVsLCBpbmRlbnQpXTtcbiAgfSk7XG4gIGxpbmVzLnB1c2goXG4gICAgLi4uT2JqZWN0LmVudHJpZXModmFsdWUudmFsdWUucHJvcGVydGllcylcbiAgICAgIC5maWx0ZXIoKFtrZXldKSA9PiAhZW1pdHRlZFByb3BlcnRpZXMuaGFzKGtleSkpXG4gICAgICAubWFwKChba2V5LCBpdGVtXSkgPT4gc3RyaW5naWZ5T2JqZWN0UHJvcGVydHkoa2V5LCBpdGVtLCBsZXZlbCwgaW5kZW50KSlcbiAgKTtcbiAgaWYgKGxpbmVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGB7XFxuJHtjbG9zaW5nSW5kZW50fX1gO1xuICByZXR1cm4gYHtcXG4ke2xpbmVzLmpvaW4oJ1xcbicpfVxcbiR7Y2xvc2luZ0luZGVudH19YDtcbn1cblxuZnVuY3Rpb24gZ2V0TGFzdFByb3BlcnR5SW5kZXhCeUtleShtZW1iZXJPcmRlcjogT2JqZWN0TWVtYmVyW10pOiBNYXA8c3RyaW5nLCBudW1iZXI+IHtcbiAgY29uc3QgbGFzdFByb3BlcnR5SW5kZXhCeUtleSA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gIGZvciAoY29uc3QgW2luZGV4LCBtZW1iZXJdIG9mIG1lbWJlck9yZGVyLmVudHJpZXMoKSkge1xuICAgIGlmIChtZW1iZXIua2luZCA9PT0gJ3Byb3BlcnR5Jykge1xuICAgICAgbGFzdFByb3BlcnR5SW5kZXhCeUtleS5zZXQobWVtYmVyLmtleSwgaW5kZXgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbGFzdFByb3BlcnR5SW5kZXhCeUtleTtcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5T2JqZWN0UHJvcGVydHkoa2V5OiBzdHJpbmcsIGl0ZW06IFBhcnNlZFZhbHVlLCBsZXZlbDogbnVtYmVyLCBpbmRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHN0cmluZ2lmaWVkID0gc3RyaW5naWZ5VmFsdWUoaXRlbSwgbGV2ZWwgKyAxKS5zcGxpdCgnXFxuJyk7XG4gIHN0cmluZ2lmaWVkW3N0cmluZ2lmaWVkLmxlbmd0aCAtIDFdID0gYCR7c3RyaW5naWZpZWQuYXQoLTEpfSxgO1xuICBpZiAoaXRlbS5raW5kID09PSAnbGl0ZXJhbCcpIHtcbiAgICBmb3IgKGxldCBpbmRleCA9IDE7IGluZGV4IDwgc3RyaW5naWZpZWQubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICBzdHJpbmdpZmllZFtpbmRleF0gPSBgJHtpbmRlbnR9JHtzdHJpbmdpZmllZFtpbmRleF19YDtcbiAgICB9XG4gIH1cbiAgc3RyaW5naWZpZWRbMF0gPSBgJHtpbmRlbnR9JHtrZXl9OiAke3N0cmluZ2lmaWVkWzBdfWA7XG4gIHJldHVybiBzdHJpbmdpZmllZC5qb2luKCdcXG4nKTtcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5T2JqZWN0TWVtYmVyKG1lbWJlcjogc3RyaW5nLCBpbmRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHN0cmluZ2lmaWVkID0gbWVtYmVyLnNwbGl0KCdcXG4nKTtcbiAgc3RyaW5naWZpZWRbc3RyaW5naWZpZWQubGVuZ3RoIC0gMV0gPSBgJHtzdHJpbmdpZmllZC5hdCgtMSl9LGA7XG4gIGZvciAoY29uc3QgW2luZGV4LCBsaW5lXSBvZiBzdHJpbmdpZmllZC5lbnRyaWVzKCkpIHtcbiAgICBzdHJpbmdpZmllZFtpbmRleF0gPSBgJHtpbmRlbnR9JHtsaW5lfWA7XG4gIH1cbiAgcmV0dXJuIHN0cmluZ2lmaWVkLmpvaW4oJ1xcbicpO1xufVxuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBvcyBmcm9tICdub2RlOm9zJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5cbnR5cGUgV2lsbEJvb3N0ZXJPcmdhbml6YXRpb24gPSAnV2lsbEJvb3N0ZXInIHwgJ1dpbGxCb29zdGVyTGFiJztcbnR5cGUgUmVwb3NpdG9yeUZ1bGxOYW1lID0gYCR7V2lsbEJvb3N0ZXJPcmdhbml6YXRpb259LyR7c3RyaW5nfWA7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm5veFJlcG9zaXRvcnlTY29wZSB7XG4gIG9yZ2FuaXphdGlvbnM/OiByZWFkb25seSBXaWxsQm9vc3Rlck9yZ2FuaXphdGlvbltdO1xuICByZXBvc2l0b3JpZXM/OiByZWFkb25seSBSZXBvc2l0b3J5RnVsbE5hbWVbXTtcbiAgLy8gUmVzdHJpY3RzIHRoZSBzY29wZSB0byByZXBvc2l0b3JpZXMgb2YgdGhlIGdpdmVuIHZpc2liaWxpdHkuIFB1YmxpYyByZXBvc2l0b3JpZXMgcHVibGlzaCB0aGVpclxuICAvLyBjaXBoZXJ0ZXh0cyB0byB0aGUgd29ybGQsIHNvIHRoZXkgbXVzdCB1c2UgYSBDSSBpZGVudGl0eSBzZXBhcmF0ZSBmcm9tIHRoZSBvcmctaW50ZXJuYWwgb25lOlxuICAvLyBsZWFraW5nIGVpdGhlciBDSSBrZXkgbXVzdCBub3QgZXhwb3NlIHRoZSBvdGhlciBzaWRlJ3Mgc2VjcmV0cy5cbiAgdmlzaWJpbGl0eT86ICdwdWJsaWMnIHwgJ3ByaXZhdGUnO1xufVxuXG5pbnRlcmZhY2UgRm5veEFnZVByaW5jaXBhbCB7XG4gIG5hbWU6IHN0cmluZztcbiAgcHVibGljS2V5czogcmVhZG9ubHkgc3RyaW5nW107XG4gIHJlcG9zaXRvcnlTY29wZTogRm5veFJlcG9zaXRvcnlTY29wZTtcbiAgLy8gTWFya3MgdGhlIHByaW5jaXBhbCBhcyBhIENJIGlkZW50aXR5IGFuZCBuYW1lcyB0aGUgR2l0SHViIHNlY3JldCBob2xkaW5nIGl0cyBwcml2YXRlIGtleS5cbiAgLy8gRXZlcnkgZm5veC1tYW5hZ2VkIHJlcG9zaXRvcnkgbXVzdCByZXNvbHZlIG9uZSAoZ2VuZXJhdGVGbm94VG9tbCBmYWlscyBjbG9zZWQgb3RoZXJ3aXNlOiBhXG4gIC8vIHJvc3RlciB3aXRob3V0IGEgQ0kgcmVjaXBpZW50IHdvdWxkIHJlLWVuY3J5cHQgc2VjcmV0cyB0aGF0IENJIGNhbiBuZXZlciBkZWNyeXB0IGFnYWluKSwgYW5kXG4gIC8vIHRoZSB3b3JrZmxvdyBnZW5lcmF0b3IgZGVyaXZlcyBpdHMgY2FsbGVyIG1hcHBpbmdzIGZyb20gdGhlIHNhbWUgcmVzb2x1dGlvbiBzbyB0aGUgdHdvIGNhblxuICAvLyBuZXZlciBkaXNhZ3JlZSBvbiB3aGljaCBDSSBpZGVudGl0eSBhcHBsaWVzLlxuICBjaUFnZUtleVNlY3JldE5hbWU/OiAnRk5PWF9BR0VfS0VZJyB8ICdQVUJMSUNfRk5PWF9BR0VfS0VZJztcbn1cblxuaW50ZXJmYWNlIEZub3hBZ2VSZWNpcGllbnQge1xuICBuYW1lOiBzdHJpbmc7XG4gIHB1YmxpY0tleTogc3RyaW5nO1xufVxuXG4vLyBUaGUgYWdlIHByaW5jaXBhbHMgYXV0aG9yaXplZCB0byBkZWNyeXB0IGVhY2ggZm5veC1tYW5hZ2VkIHJlcG9zaXRvcnkuIFRvIGdyYW50IGFjY2VzcywgYWRkIHRoZVxuLy8gcHJpbmNpcGFsJ3MgcHVibGljIGtleXMgYW5kIHJlcG9zaXRvcnkgc2NvcGUgaGVyZS4gT3JnYW5pemF0aW9uIHNjb3BlcyBpbmNsdWRlIGV2ZXJ5IGN1cnJlbnQgYW5kXG4vLyBmdXR1cmUgcmVwb3NpdG9yeSBpbiB0aGF0IG9yZ2FuaXphdGlvbjsgdXNlIHJlcG9zaXRvcmllcyBmb3IgZXhhY3Qgb3duZXIvcmVwb3NpdG9yeSBncmFudHMuIFRoZVxuLy8gbmV4dCB3YmZ5IHJ1biBvbiBlYWNoIG1hdGNoaW5nIHJlcG9zaXRvcnkgcmV3cml0ZXMgZXZlcnkgbWFuYWdlZCBmbm94LnRvbWwgYW5kIHJlLWVuY3J5cHRzIGl0c1xuLy8gY29tbWl0dGVkIHNlY3JldHMgZm9yIHRoZSByZXN1bHRpbmcgcmVjaXBpZW50IHNldC4gQSBzY29wZSdzIG9wdGlvbmFsIHZpc2liaWxpdHkgY29uc3RyYWludFxuLy8gc2VsZWN0cyBvbmx5IHB1YmxpYyBvciBvbmx5IHByaXZhdGUgcmVwb3NpdG9yaWVzICh1c2VkIHRvIGtlZXAgdGhlIG9yZy1pbnRlcm5hbCBhbmQgdGhlXG4vLyBwdWJsaWMtcmVwb3NpdG9yeSBDSSBpZGVudGl0aWVzIGFwYXJ0KS4gUmVtb3ZpbmcgYSBzY29wZSBjYW5ub3QgcmV2b2tlIGNpcGhlcnRleHRcbi8vIGFscmVhZHkgYXZhaWxhYmxlIGZyb20gR2l0IGhpc3RvcnksIHNvIHJvdGF0ZSB0aGUgc2VjcmV0IHZhbHVlcyB0aGF0IHByaW5jaXBhbCBjb3VsZCBkZWNyeXB0LlxuLy8gT25seSBwdWJsaWMga2V5cyBtYXkgYXBwZWFyIGhlcmU7IGEgQ0kgaWRlbnRpdHkncyBwcml2YXRlIGtleSBzdXBwbGllcyB0aGUgRk5PWF9BR0VfS0VZIChvcixcbi8vIGZvciBwdWJsaWMgcmVwb3NpdG9yaWVzLCBQVUJMSUNfRk5PWF9BR0VfS0VZKSBvcmdhbml6YXRpb24gc2VjcmV0LlxuZXhwb3J0IGNvbnN0IEZOT1hfQUdFX1BSSU5DSVBBTFMgPSBbXG4gIHtcbiAgICBuYW1lOiAnZXhrYXp1dScsXG4gICAgcHVibGljS2V5czogWydhZ2UxajIzNTR4aHZtM2Z2OXk3N3Q1ZzZ5M3E4bWV4Z2sybWYwMHRncmt6Z3A3M3R5bnJ2ejU1czhhdWF5dyddLFxuICAgIHJlcG9zaXRvcnlTY29wZTogeyBvcmdhbml6YXRpb25zOiBbJ1dpbGxCb29zdGVyJywgJ1dpbGxCb29zdGVyTGFiJ10gfSxcbiAgfSxcbiAge1xuICAgIG5hbWU6ICdwb25oYXJ1JyxcbiAgICBwdWJsaWNLZXlzOiBbXG4gICAgICAnYWdlMThydWdsZGY5aHRjNnVtNWVwbHB4MjdrNTNlcDR6bjBsaHp3ZmZnbnh6aHJxMGM3emd2eXEzemNjZHknLFxuICAgICAgJ2FnZTFuejJuOTljcmpyN25wOXhqZ2x3ZmZmYzNkdWQ0NWRoZXdxenFmenB6dGtkd3U0aGo3NGdxNmVsNTMzJyxcbiAgICBdLFxuICAgIHJlcG9zaXRvcnlTY29wZTogeyBvcmdhbml6YXRpb25zOiBbJ1dpbGxCb29zdGVyJywgJ1dpbGxCb29zdGVyTGFiJ10gfSxcbiAgfSxcbiAge1xuICAgIC8vIFRoZSBvcmctaW50ZXJuYWwgQ0kgaWRlbnRpdHkgKHRoZSBGTk9YX0FHRV9LRVkgb3JnYW5pemF0aW9uIHNlY3JldCAvIH4vLmNvbmZpZy9mbm94L2FnZS1jaS13Yi50eHQpLlxuICAgIG5hbWU6ICdjaScsXG4gICAgcHVibGljS2V5czogWydhZ2UxYTJjNmVmNmFobDZtbWtoZ3F0eGcwbWd0ZDd5c3NwbnRxN3J4dXN2MjZlZnhobnVobGNkc3I5ZHBhayddLFxuICAgIHJlcG9zaXRvcnlTY29wZTogeyBvcmdhbml6YXRpb25zOiBbJ1dpbGxCb29zdGVyJywgJ1dpbGxCb29zdGVyTGFiJ10sIHZpc2liaWxpdHk6ICdwcml2YXRlJyB9LFxuICAgIGNpQWdlS2V5U2VjcmV0TmFtZTogJ0ZOT1hfQUdFX0tFWScsXG4gIH0sXG4gIHtcbiAgICAvLyBUaGUgQ0kgaWRlbnRpdHkgZGVkaWNhdGVkIHRvIHB1YmxpYyByZXBvc2l0b3JpZXMgKHRoZSBQVUJMSUNfRk5PWF9BR0VfS0VZIG9yZ2FuaXphdGlvblxuICAgIC8vIHNlY3JldCAvIH4vLmNvbmZpZy9mbm94L2FnZS1jaS13Yi1wdWJsaWMudHh0KS4gU2NvcGVkIHRvIFdpbGxCb29zdGVyIG9ubHkgYmVjYXVzZSB0aGVcbiAgICAvLyBQVUJMSUNfRk5PWF9BR0VfS0VZIHNlY3JldCBpcyByZWdpc3RlcmVkIGluIHRoYXQgb3JnYW5pemF0aW9uIGFsb25lOyBhIHB1YmxpY1xuICAgIC8vIFdpbGxCb29zdGVyTGFiIHJlcG9zaXRvcnkgcmVzb2x2ZXMgTk8gQ0kgaWRlbnRpdHkgYW5kIGdlbmVyYXRlRm5veFRvbWwgZmFpbHMgY2xvc2VkIG9uIGl0XG4gICAgLy8gKFdpbGxCb29zdGVyTGFiIGRvZXMgb3duIHB1YmxpYyByZXBvc2l0b3JpZXMsIGUuZy4gaXRzIHJldXNhYmxlLXdvcmtmbG93cyBzeW5jIG1pcnJvciwgYnV0XG4gICAgLy8gbm9uZSBvZiB0aGVtIHVzZSBmbm94IOKAlCByZWdpc3RlciB0aGUgc2VjcmV0IHRoZXJlIGFuZCBleHRlbmQgdGhpcyBzY29wZSBpZiBvbmUgZXZlciBkb2VzKS5cbiAgICBuYW1lOiAnY2ktcHVibGljJyxcbiAgICBwdWJsaWNLZXlzOiBbJ2FnZTFmaGVhODV4andwODlsd3EzamNud2ozMnN3aDN2MjRwd3BhcnFoNWw3cWtndmM0YXgzcDBxbDZkdTM2J10sXG4gICAgcmVwb3NpdG9yeVNjb3BlOiB7IG9yZ2FuaXphdGlvbnM6IFsnV2lsbEJvb3N0ZXInXSwgdmlzaWJpbGl0eTogJ3B1YmxpYycgfSxcbiAgICBjaUFnZUtleVNlY3JldE5hbWU6ICdQVUJMSUNfRk5PWF9BR0VfS0VZJyxcbiAgfSxcbiAge1xuICAgIG5hbWU6ICdyZW1pbicsXG4gICAgcHVibGljS2V5czogWydhZ2UxbXc0cHo5ZHVqeTlkbWhrMHBhbHFhd2prajdtNGs3eng3OHlyOWZqdDYzc2E1bDNlNDN1cTZudzAwNCddLFxuICAgIHJlcG9zaXRvcnlTY29wZTogeyBvcmdhbml6YXRpb25zOiBbJ1dpbGxCb29zdGVyJywgJ1dpbGxCb29zdGVyTGFiJ10gfSxcbiAgfSxcbiAge1xuICAgIG5hbWU6ICdhcmllcycsXG4gICAgcHVibGljS2V5czogWydhZ2Uxbm4wZWh5YWVueXE4a21ucTQyOTRrenpneHY1ZG5mNnBlcDJjZGtyYXh6ZnFsazd4Z3NycXFuNm5uOSddLFxuICAgIHJlcG9zaXRvcnlTY29wZToge1xuICAgICAgcmVwb3NpdG9yaWVzOiBbXG4gICAgICAgICdXaWxsQm9vc3Rlci9hZ2VudC1jaGFsbGVuZ2VzJyxcbiAgICAgICAgJ1dpbGxCb29zdGVyL2FnZW50aWMtd29ya2Zsb3dzLWRhc2hib2FyZCcsXG4gICAgICAgICdXaWxsQm9vc3Rlci9jaGVlcmxpbmdzJyxcbiAgICAgICAgJ1dpbGxCb29zdGVyL2Nob2Z1LXdhbGtpbmcnLFxuICAgICAgICAnV2lsbEJvb3N0ZXIvcHJvbXB0LXN0dWR5JyxcbiAgICAgICAgJ1dpbGxCb29zdGVyL2V4ZXJjb2RlJyxcbiAgICAgICAgJ1dpbGxCb29zdGVyL2p1ZGdlJyxcbiAgICAgIF0sXG4gICAgfSxcbiAgfSxcbiAge1xuICAgIG5hbWU6ICdzdW5hZ2EnLFxuICAgIHB1YmxpY0tleXM6IFsnYWdlMXVseHpuNnk2OGt1MzRjcHg1ZnlhNWdmN3Jucnd6MHVmbG55ZTZ1eHVoZzM0cDJuamhna3FtZzczZzQnXSxcbiAgICByZXBvc2l0b3J5U2NvcGU6IHtcbiAgICAgIHJlcG9zaXRvcmllczogWydXaWxsQm9vc3Rlci9haS1vY3InLCAnV2lsbEJvb3N0ZXIvZXhlcmNvZGUnLCAnV2lsbEJvb3N0ZXIvanVkZ2UnXSxcbiAgICB9LFxuICB9LFxuICB7XG4gICAgbmFtZTogJ2F5YW1lJyxcbiAgICBwdWJsaWNLZXlzOiBbJ2FnZTF2eG0yZ3MwMDNydXdtOHA2aDNodjd4YXNqdTJzOGs0bXhtYzM0em02Z3Jkd3pucnMwOW5xNnh6NXZ6J10sXG4gICAgcmVwb3NpdG9yeVNjb3BlOiB7XG4gICAgICByZXBvc2l0b3JpZXM6IFsnV2lsbEJvb3N0ZXIvYWktb2NyJywgJ1dpbGxCb29zdGVyL2Nob2Z1LXdhbGtpbmcnLCAnV2lsbEJvb3N0ZXIvZXhlcmNvZGUnLCAnV2lsbEJvb3N0ZXIvanVkZ2UnXSxcbiAgICB9LFxuICB9LFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgRm5veEFnZVByaW5jaXBhbFtdO1xuXG5pbnRlcmZhY2UgRm5veFRvbWwge1xuICBpbXBvcnQ/OiB1bmtub3duO1xuICBwcm92aWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZD47XG4gIHByb2ZpbGVzPzogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ+O1xuICBba2V5OiBzdHJpbmddOiB1bmtub3duO1xufVxuXG5sZXQgZm5veFN5bmNGYWlsZWQgPSBmYWxzZTtcbmxldCBtaWdyYXRpb25NYXJrZXJQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5sZXQgbWlncmF0aW9uTWFya2VyT3duZWQgPSBmYWxzZTtcblxuLyoqIFdoZXRoZXIgYW55IGZub3ggcmVjaXBpZW50IHN5bmNocm9uaXphdGlvbiBmYWlsZWQgaW4gdGhlIGN1cnJlbnQgcmVwb3NpdG9yeTsgc2V0dXBTZWNyZXRzIG11c3Qgbm90IHVwbG9hZCB0aGVuLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc0Zub3hTeW5jRmFpbGVkKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gZm5veFN5bmNGYWlsZWQ7XG59XG5cbi8qKlxuICogU3luY2hyb25pemVzIHRoZSBhZ2UgcmVjaXBpZW50cyBpbiBldmVyeSBmbm94LnRvbWwgd2l0aCB0aGUgcHJpbmNpcGFscyBhdXRob3JpemVkIGZvciB0aGlzXG4gKiByZXBvc2l0b3J5IGFuZCByZS1lbmNyeXB0cyB0aGUgY29tbWl0dGVkIHNlY3JldHMgd2hlbiB0aGUgcmVjaXBpZW50IHNldCBjaGFuZ2VkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVGbm94VG9tbChyb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVGbm94VG9tbCcsIGFzeW5jICgpID0+IHtcbiAgICAvLyBUaGUgZmFpbHVyZSBmbGFnIGlzIHBlciByZXBvc2l0b3J5OiB3YmZ5IGNhbiBwcm9jZXNzIG11bHRpcGxlIHdvcmtpbmcgZGlyZWN0b3JpZXMgaW4gb25lXG4gICAgLy8gaW52b2NhdGlvbiwgYW5kIGFuIGVhcmxpZXIgcmVwb3NpdG9yeSdzIGZhaWx1cmUgbXVzdCBub3QgdmV0byBhIGxhdGVyIHJlcG9zaXRvcnkncyB1cGxvYWQuXG4gICAgZm5veFN5bmNGYWlsZWQgPSBmYWxzZTtcbiAgICAvLyBBIHJlcG9zaXRvcnkgb3V0c2lkZSBXaWxsQm9vc3Rlci9XaWxsQm9vc3RlckxhYiBtYW5hZ2VzIGl0cyBvd24gcmVjaXBpZW50IHNldCAoZS5nLiBhXG4gICAgLy8gcGVyc29uYWwgcmVwb3NpdG9yeSB3aXRoIGl0cyBvd24gQ0kgaWRlbnRpdHkpLCBzbyByZXdyaXRpbmcgaXQgdG8gdGhlIG9yZyByb3N0ZXIgd291bGQgZ3JhbnRcbiAgICAvLyBvcmcgbWVtYmVycyBhY2Nlc3MgYW5kIHJlLWVuY3J5cHQgc2VjcmV0cyBmb3IgYSBDSSBrZXkgdGhhdCByZXBvc2l0b3J5IGRvZXMgbm90IHVzZS5cbiAgICAvLyBzZXR1cFNlY3JldHMgbmV2ZXIgdXBsb2FkcyBzZWNyZXRzIGZvciBzdWNoIHJlcG9zaXRvcmllcyBlaXRoZXIsIHNvIHNraXAgZW50aXJlbHkuXG4gICAgaWYgKCFyb290Q29uZmlnLmlzV2lsbEJvb3N0ZXJSZXBvKSByZXR1cm47XG4gICAgY29uc3QgYWdlUmVjaXBpZW50cyA9IGdldEZub3hBZ2VSZWNpcGllbnRzKHJvb3RDb25maWcpO1xuICAgIGNvbnN0IHJvb3REaXJQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCk7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShyb290RGlyUGF0aCwgJ2Zub3gudG9tbCcpKSkge1xuICAgICAgLy8gQSBuZXN0ZWQtb25seSBmbm94IGxheW91dCBpcyB1bnN1cHBvcnRlZDogc2V0dXBTZWNyZXRzIHdvdWxkIHRha2UgdGhlIGRvdGVudiBwYXRoIGFuZFxuICAgICAgLy8gZGVsZXRlIEZOT1hfQUdFX0tFWSBldmVuIHRob3VnaCB0aGUgbmVzdGVkIGNvbmZpZydzIENJIHN0aWxsIG5lZWRzIGl0LlxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gT25seSBhZ2UtdXNpbmcgY29uZmlncyBjYXJyeSB0aGF0IHJpc2suIFdpdGhvdXQgYSByb290IHByb3ZpZGluZyB0aGUgYWdlIHByb3ZpZGVyLCBhXG4gICAgICAgIC8vIHN0cmF5IGNvbmZpZyB0aGF0IGRlY2xhcmVzIG5vbmUgdXNlcyBubyBhZ2UgZW5jcnlwdGlvbiBhdCBhbGwgKGUuZy4gYSBwbGFpbnRleHQgdGVzdFxuICAgICAgICAvLyBmaXh0dXJlIG9yIGV4YW1wbGUgY29uZmlnIGFueSByZXBvc2l0b3J5IG1heSBsZWdpdGltYXRlbHkgY29tbWl0KSwgc28gaXQgbmVpdGhlciBuZWVkc1xuICAgICAgICAvLyByZWNpcGllbnQgc3luY2hyb25pemF0aW9uIG5vciBvd25zIGFuIEZOT1hfQUdFX0tFWSBhbmQgbXVzdCBub3QgYmxvY2sgdGhlIHJ1bi5cbiAgICAgICAgY29uc3Qgc3RyYXlGaWxlUGF0aHMgPSBsaXN0Rm5veExpa2VGaWxlUGF0aHMocm9vdERpclBhdGgpLmZpbHRlcigoZmlsZVBhdGgpID0+XG4gICAgICAgICAgZGVjbGFyZXNGbm94QWdlUHJvdmlkZXIoZmlsZVBhdGgpXG4gICAgICAgICk7XG4gICAgICAgIGlmIChzdHJheUZpbGVQYXRocy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgZmFpbEZub3hTeW5jKFxuICAgICAgICAgICAgYEZhaWxlZCB0byBzeW5jaHJvbml6ZSBmbm94IGFnZSByZWNpcGllbnRzIGJlY2F1c2UgZm5veCBjb25maWdzIGV4aXN0IHdpdGhvdXQgYSByb290IGZub3gudG9tbDogJHtzdHJheUZpbGVQYXRocy5qb2luKCcsICcpfS4gQWRkIGEgcm9vdCBmbm94LnRvbWwuYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIEZhaWwgY2xvc2VkOiB3aXRob3V0IGdpdCBpbmZvcm1hdGlvbiBhIG5lc3RlZC1vbmx5IGZub3ggbGF5b3V0IGNhbm5vdCBiZSBydWxlZCBvdXQsIGFuZFxuICAgICAgICAvLyBzZXR1cFNlY3JldHMgd291bGQgb3RoZXJ3aXNlIHRha2UgdGhlIGRvdGVudiBwYXRoIGFuZCBkZWxldGUgRk5PWF9BR0VfS0VZLlxuICAgICAgICBmYWlsRm5veFN5bmMoXG4gICAgICAgICAgYEZhaWxlZCB0byBjaGVjayBmb3IgbmVzdGVkIGZub3ggY29uZmlncyBkdWUgdG86ICR7KGVycm9yIGFzIEVycm9yIHwgdW5kZWZpbmVkKT8ubWVzc2FnZSA/PyBlcnJvcn1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIEEgZmFpbGVkIHZpc2liaWxpdHkgbG9va3VwIGNvbGxhcHNlcyBpc1B1YmxpY1JlcG8gdG8gZmFsc2UsIHdoaWNoIHdvdWxkIHNpbGVudGx5IHJlLWVuY3J5cHRcbiAgICAvLyBhIHB1YmxpYyByZXBvc2l0b3J5J3Mgd29ybGQtcmVhZGFibGUgY2lwaGVydGV4dHMgdG8gdGhlIG9yZy1pbnRlcm5hbCBDSSBpZGVudGl0eSAoYW5kIHZpY2VcbiAgICAvLyB2ZXJzYSBkcm9wIHRoZSBwdWJsaWMgb25lKS4gRmFpbCBpbnN0ZWFkIG9mIGd1ZXNzaW5nIHdoZW5ldmVyIHZpc2liaWxpdHkgY2hhbmdlcyB0aGUgcm9zdGVyLlxuICAgIGlmICghcm9vdENvbmZpZy5pc1JlcG9WaXNpYmlsaXR5S25vd24gJiYgZG9lc0Zub3hSZWNpcGllbnRTZXREZXBlbmRPblZpc2liaWxpdHkocm9vdENvbmZpZykpIHtcbiAgICAgIGZhaWxGbm94U3luYyhcbiAgICAgICAgYEZhaWxlZCB0byBzeW5jaHJvbml6ZSBmbm94IGFnZSByZWNpcGllbnRzIGJlY2F1c2UgdGhlIHZpc2liaWxpdHkgb2YgJHtyb290Q29uZmlnLnJlcG9BdXRob3J9LyR7cm9vdENvbmZpZy5yZXBvTmFtZX0gY291bGQgbm90IGJlIGRldGVybWluZWQgKEdpdEh1YiBsb29rdXAgZmFpbGVkKSBhbmQgdGhlIENJIHJlY2lwaWVudCBkZXBlbmRzIG9uIGl0LiBDaGVjayBuZXR3b3JrIGFuZCBnaCBhdXRoZW50aWNhdGlvbiwgdGhlbiByZXJ1biB3YmZ5LmBcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIEJvdGggQ0kgaWRlbnRpdGllcyBhcmUgdmlzaWJpbGl0eS1jb25zdHJhaW5lZCwgc28gYSByZXBvc2l0b3J5IGNhbiBmYWxsIHRocm91Z2ggQk9USCAoZS5nLiBhXG4gICAgLy8gcHVibGljIFdpbGxCb29zdGVyTGFiIHJlcG9zaXRvcnksIHdob3NlIG9yZ2FuaXphdGlvbiBoYXMgbm8gUFVCTElDX0ZOT1hfQUdFX0tFWSBzZWNyZXQpLlxuICAgIC8vIFJlLWVuY3J5cHRpbmcgZm9yIGEgcm9zdGVyIHdpdGhvdXQgYSBDSSBpZGVudGl0eSB3b3VsZCBsZWF2ZSBDSSB1bmFibGUgdG8gZGVjcnlwdCBhbnl0aGluZyxcbiAgICAvLyBmYWlsaW5nIG9ubHkgYXQgcnVudGltZSBpbiBBY3Rpb25zOyBmYWlsIGxvdWRseSBoZXJlIGluc3RlYWQuXG4gICAgaWYgKCFyZXNvbHZlRm5veENpQWdlS2V5U2VjcmV0TmFtZShyb290Q29uZmlnKSkge1xuICAgICAgZmFpbEZub3hTeW5jKFxuICAgICAgICBgRmFpbGVkIHRvIHN5bmNocm9uaXplIGZub3ggYWdlIHJlY2lwaWVudHMgYmVjYXVzZSBubyBDSSBpZGVudGl0eSBpcyBzY29wZWQgdG8gJHtyb290Q29uZmlnLnJlcG9BdXRob3J9LyR7cm9vdENvbmZpZy5yZXBvTmFtZX0gKHB1YmxpYyByZXBvc2l0b3JpZXMgYXJlIHN1cHBvcnRlZCBvbmx5IGluIHRoZSBXaWxsQm9vc3RlciBvcmdhbml6YXRpb24pLiBQcm92aXNpb24gdGhlIG1hdGNoaW5nIG9yZ2FuaXphdGlvbiBzZWNyZXQgYW5kIGV4dGVuZCB0aGUgQ0kgc2NvcGVzIGluIHdiZnkgZmlyc3QuYFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gVGhlIG1pZ3JhdGlvbiBpcyB0cmFuc2FjdGlvbmFsIG92ZXIgZXZlcnkgbWFuYWdlZCBmbm94LnRvbWw6IHJlcnVucyBtdXN0IHJldHJ5IGZyb20gdGhlXG4gICAgLy8gb3JpZ2luYWwgc3RhdGUsIGFuZCBhIHBhcnRpYWxseSBtaWdyYXRlZCB0cmVlIGNvdWxkIG90aGVyd2lzZSBiZWNvbWUgdW5kZWNyeXB0YWJsZSBmb3IgdGhlXG4gICAgLy8gaWRlbnRpdHkgcGVyZm9ybWluZyBhIGxhdGVyIHJldHJ5IChlLmcuIHdoZW4gYSByZWNpcGllbnQgaXMgYmVpbmcgcmVtb3ZlZCkuXG4gICAgY29uc3Qgc25hcHNob3RzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgICAvLyBBIGZhaWxlZCBzeW5jaHJvbml6YXRpb24gbXVzdCBmYWlsIHRoZSB3aG9sZSB3YmZ5IHJ1bjogZXhpdGluZyB6ZXJvIHdpdGggc3RhbGUgcmVjaXBpZW50c1xuICAgIC8vIHdvdWxkIGxlYXZlIHNlY3JldHMgdW5kZWNyeXB0YWJsZSBmb3IgbmV3IHJlY2lwaWVudHMgd2hpbGUgbG9va2luZyBzdWNjZXNzZnVsLlxuICAgIHRyeSB7XG4gICAgICAvLyBBbnkgZm5veCBjb25maWcgKGluY2x1ZGluZyBhbGlhc2VzIGFuZCBsb2NhbCBvdmVycmlkZXMpIGluIGFuIGFuY2VzdG9yIGRpcmVjdG9yeSB3b3VsZFxuICAgICAgLy8gbWVyZ2UgaW50byAoYW5kIHBvc3NpYmx5IGJlIFJFV1JJVFRFTiBieSkgdGhpcyByZXBvc2l0b3J5J3MgYGZub3ggcmVlbmNyeXB0YCB0aHJvdWdoXG4gICAgICAvLyBoaWVyYXJjaGljYWwgbG9hZGluZywgdXNpbmcgdGhpcyByZXBvc2l0b3J5J3MgcmVjaXBpZW50IHNldCBmb3IgZm9yZWlnbiBzZWNyZXRzLlxuICAgICAgZm9yIChsZXQgZGlyUGF0aCA9IHBhdGguZGlybmFtZShyb290RGlyUGF0aCk7IDsgZGlyUGF0aCA9IHBhdGguZGlybmFtZShkaXJQYXRoKSkge1xuICAgICAgICBjb25zdCBhbmNlc3RvckZub3hGaWxlTmFtZXMgPSBsaXN0Rm5veExpa2VGaWxlTmFtZXMoZGlyUGF0aCk7XG4gICAgICAgIGlmIChhbmNlc3RvckZub3hGaWxlTmFtZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGZhaWxGbm94U3luYyhcbiAgICAgICAgICAgIGBGYWlsZWQgdG8gc3luY2hyb25pemUgZm5veCBhZ2UgcmVjaXBpZW50cyBiZWNhdXNlIGFuIGFuY2VzdG9yIGRpcmVjdG9yeSBjb250YWlucyBmbm94IGNvbmZpZ3MgdGhhdCBmbm94IHdvdWxkIGhpZXJhcmNoaWNhbGx5IG1lcmdlIGFuZCByZXdyaXRlOiAke2FuY2VzdG9yRm5veEZpbGVOYW1lc1xuICAgICAgICAgICAgICAubWFwKChuYW1lKSA9PiBwYXRoLmpvaW4oZGlyUGF0aCwgbmFtZSkpXG4gICAgICAgICAgICAgIC5qb2luKCcsICcpfS4gUmVtb3ZlIHRoZW0gb3IgbW92ZSB0aGUgcmVwb3NpdG9yeS5gXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhdGguZGlybmFtZShkaXJQYXRoKSA9PT0gZGlyUGF0aCkgYnJlYWs7XG4gICAgICB9XG4gICAgICAvLyBmbm94IGFsc28gbG9hZHMgY29tbWl0dGVkIGNvbmZpZyBhbGlhc2VzIHRoaXMgZ2VuZXJhdG9yIGNhbm5vdCBrZWVwIGluIHN5bmMuXG4gICAgICBjb25zdCBmbm94TGlrZUZpbGVQYXRocyA9IGxpc3RGbm94TGlrZUZpbGVQYXRocyhyb290RGlyUGF0aCk7XG4gICAgICBjb25zdCB1bnN1cHBvcnRlZEZpbGVQYXRocyA9IGZub3hMaWtlRmlsZVBhdGhzLmZpbHRlcigoZmlsZVBhdGgpID0+IHBhdGguYmFzZW5hbWUoZmlsZVBhdGgpICE9PSAnZm5veC50b21sJyk7XG4gICAgICBpZiAodW5zdXBwb3J0ZWRGaWxlUGF0aHMubGVuZ3RoID4gMCkge1xuICAgICAgICBmYWlsRm5veFN5bmMoXG4gICAgICAgICAgYEZhaWxlZCB0byBzeW5jaHJvbml6ZSBmbm94IGFnZSByZWNpcGllbnRzIGJlY2F1c2Ugb25seSBmbm94LnRvbWwgZmlsZXMgYXJlIHN1cHBvcnRlZDogJHt1bnN1cHBvcnRlZEZpbGVQYXRocy5qb2luKCcsICcpfS4gTWVyZ2UgdGhlbSBpbnRvIHRoZSBhZGphY2VudCBmbm94LnRvbWwuYFxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBkaXJQYXRocyA9IGxpc3RGbm94VG9tbERpclBhdGhzKGZub3hMaWtlRmlsZVBhdGhzKTtcbiAgICAgIGlmICghZGlyUGF0aHMuaW5jbHVkZXMocm9vdERpclBhdGgpKSB7XG4gICAgICAgIGZhaWxGbm94U3luYyhcbiAgICAgICAgICBgRmFpbGVkIHRvIHN5bmNocm9uaXplIGZub3ggYWdlIHJlY2lwaWVudHMgYmVjYXVzZSAke3BhdGgucmVzb2x2ZShyb290RGlyUGF0aCwgJ2Zub3gudG9tbCcpfSBpcyBpbnZpc2libGUgdG8gZ2l0IChnaXRpZ25vcmVkPykuIENvbW1pdCBpdCBvciByZW1vdmUgaXQuYFxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBHaXQtYmFzZWQgZGlzY292ZXJ5IGNhbm5vdCBzZWUgZ2l0aWdub3JlZCBmaWxlcywgc28gYWxzbyBpbnNwZWN0IGV2ZXJ5IGRpcmVjdG9yeSBpbiBlYWNoXG4gICAgICAvLyBtYW5hZ2VkIGNvbmZpZydzIGhpZXJhcmNoeSB0aHJvdWdoIHRoZSBmaWxlc3lzdGVtOiBhIGdpdGlnbm9yZWQgYWxpYXMgKGUuZy4gLmZub3gudG9tbClcbiAgICAgIC8vIG9yIGEgZ2l0aWdub3JlZCBmbm94LnRvbWwgaW4gYW4gaW50ZXJtZWRpYXRlIGRpcmVjdG9yeSB3b3VsZCBzdGlsbCBiZSBsb2FkZWQgYnkgZm5veCBhbmRcbiAgICAgIC8vIGNvdWxkIG92ZXJyaWRlIHRoZSBwcm92aWRlciB1c2VkIGZvciBuZXN0ZWQgcmUtZW5jcnlwdGlvbi5cbiAgICAgIGNvbnN0IG1hbmFnZWREaXJQYXRocyA9IG5ldyBTZXQoZGlyUGF0aHMpO1xuICAgICAgZm9yIChjb25zdCBkaXJQYXRoIG9mIGRpclBhdGhzKSB7XG4gICAgICAgIGZvciAoY29uc3QgaGllcmFyY2h5RGlyUGF0aCBvZiBsaXN0QW5jZXN0b3JEaXJQYXRocyhkaXJQYXRoLCByb290RGlyUGF0aCkpIHtcbiAgICAgICAgICBjb25zdCBzdHJheUZpbGVOYW1lcyA9IGxpc3RGbm94TGlrZUZpbGVOYW1lcyhoaWVyYXJjaHlEaXJQYXRoKS5maWx0ZXIoXG4gICAgICAgICAgICAobmFtZSkgPT4gbmFtZSAhPT0gJ2Zub3gubG9jYWwudG9tbCcgJiYgIShuYW1lID09PSAnZm5veC50b21sJyAmJiBtYW5hZ2VkRGlyUGF0aHMuaGFzKGhpZXJhcmNoeURpclBhdGgpKVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKHN0cmF5RmlsZU5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZhaWxGbm94U3luYyhcbiAgICAgICAgICAgICAgYEZhaWxlZCB0byBzeW5jaHJvbml6ZSBmbm94IGFnZSByZWNpcGllbnRzIGJlY2F1c2UgZm5veCB3b3VsZCBsb2FkIHVubWFuYWdlZCAoZ2l0aWdub3JlZD8pIGNvbmZpZ3M6ICR7c3RyYXlGaWxlTmFtZXNcbiAgICAgICAgICAgICAgICAubWFwKChuYW1lKSA9PiBwYXRoLmpvaW4oaGllcmFyY2h5RGlyUGF0aCwgbmFtZSkpXG4gICAgICAgICAgICAgICAgLmpvaW4oJywgJyl9LiBDb21taXQgdGhlbSBhcyBmbm94LnRvbWwgb3IgcmVtb3ZlIHRoZW0uYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gQSBmbm94LmxvY2FsLnRvbWwgYW55d2hlcmUgaW4gdGhlIG1lcmdlZCBoaWVyYXJjaHkgKG5vdCBvbmx5IG5leHQgdG8gYSBtYW5hZ2VkXG4gICAgICAgICAgLy8gY29uZmlnKSBjYW4gb3ZlcnJpZGUgcHJvdmlkZXJzLlxuICAgICAgICAgIGNvbnN0IGxvY2FsSXNzdWUgPSBmaW5kRm5veExvY2FsVG9tbElzc3VlKGhpZXJhcmNoeURpclBhdGgpO1xuICAgICAgICAgIGlmIChsb2NhbElzc3VlKSB7XG4gICAgICAgICAgICBmYWlsRm5veFN5bmMoXG4gICAgICAgICAgICAgIGBGYWlsZWQgdG8gc3luY2hyb25pemUgZm5veCBhZ2UgcmVjaXBpZW50cyBiZWNhdXNlICR7bG9jYWxJc3N1ZX0uIEtlZXAgb25seSBtYWNoaW5lLWxvY2FsIHNlY3JldCBvdmVycmlkZXMgdGhlcmUuYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIFRoZSBpbi1tZW1vcnkgc25hcHNob3RzIGRvIG5vdCBzdXJ2aXZlIGEga2lsbGVkIHByb2Nlc3MsIHNvIGEgZHVyYWJsZSBtYXJrZXIgaXMgd3JpdHRlblxuICAgICAgLy8gYmVmb3JlIHRoZSBmaXJzdCBtdXRhdGlvbiBhbmQgcmVtb3ZlZCBvbmx5IHdoZW4gdGhlIHRyZWUgaXMgY29uc2lzdGVudCBhZ2Fpbi4gQSBsZWZ0b3ZlclxuICAgICAgLy8gbWFya2VyIG1lYW5zIGEgcHJldmlvdXMgcnVuIHdhcyBraWxsZWQgbWlkLW1pZ3JhdGlvbiAob3IgY291bGQgbm90IHJlc3RvcmUpOiBzb21lXG4gICAgICAvLyBjaXBoZXJ0ZXh0cyBtYXkgbm90IG1hdGNoIHRoZSByZWNpcGllbnRzLCBvciBtYXkgZXZlbiBiZSB1bmRlY3J5cHRhYmxlIGZvciB0aGUgZXhlY3V0b3Inc1xuICAgICAgLy8gaWRlbnRpdHkgd2hlbiBhIHJlY2lwaWVudCB3YXMgYmVpbmcgcmVtb3ZlZCDigJQgc3RhdGVzIHRoaXMgY29kZSBjYW5ub3QgcmVwYWlyIHNhZmVseVxuICAgICAgLy8gYmVjYXVzZSB0aGUgd29ya2luZyB0cmVlIG1heSBoYXZlIGNoYW5nZWQgc2luY2UgKGJyYW5jaCBzd2l0Y2hlcywgbWFudWFsIGVkaXRzKS4gVGhlXG4gICAgICAvLyBmbm94LnRvbWwgZmlsZXMgYXJlIGdpdC10cmFja2VkLCBzbyB0aGUgdXNlciByZXN0b3JlcyB0aGVtIHZpYSBnaXQgYW5kIGNsZWFycyB0aGUgbWFya2VyLlxuICAgICAgbWlncmF0aW9uTWFya2VyUGF0aCA9IHBhdGgucmVzb2x2ZShyb290RGlyUGF0aCwgJy50bXAnLCAnd2JmeS1mbm94LW1pZ3JhdGlvbi1tYXJrZXInKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKG1pZ3JhdGlvbk1hcmtlclBhdGgpKSB7XG4gICAgICAgIGZhaWxGbm94U3luYyhcbiAgICAgICAgICBgRmFpbGVkIHRvIHN5bmNocm9uaXplIGZub3ggYWdlIHJlY2lwaWVudHMgYmVjYXVzZSBhIHByZXZpb3VzIG1pZ3JhdGlvbiB3YXMgaW50ZXJydXB0ZWQuIFJlc3RvcmUgdGhlIGZub3gudG9tbCBmaWxlcyB2aWEgZ2l0IChlLmcuIFxcYGdpdCBzdGF0dXNcXGAgYW5kIFxcYGdpdCByZXN0b3JlIC0tICcqZm5veCoudG9tbCdcXGAgaWYgeW91IGhhdmUgbm8gaW50ZW50aW9uYWwgbG9jYWwgY2hhbmdlcyksIHRoZW4gZGVsZXRlICR7bWlncmF0aW9uTWFya2VyUGF0aH0gYW5kIHJlcnVuIHdiZnkuYFxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIEEgdHJhY2tlZCBzeW1saW5rIG5hbWVkIGZub3gudG9tbCAob3IgYSBzeW1saW5rZWQgcGFyZW50IGRpcmVjdG9yeSkgd291bGQgbWFrZSB0aGVcbiAgICAgIC8vIHJld3JpdGUgYW5kIGBmbm94IHJlZW5jcnlwdGAgcmVhZCBhbmQgTU9ESUZZIGZpbGVzIG91dHNpZGUgdGhpcyByZXBvc2l0b3J5LlxuICAgICAgY29uc3QgcmVhbFJvb3REaXJQYXRoID0gZnMucmVhbHBhdGhTeW5jKHJvb3REaXJQYXRoKTtcbiAgICAgIGZvciAoY29uc3QgZGlyUGF0aCBvZiBkaXJQYXRocykge1xuICAgICAgICBjb25zdCBmbm94VG9tbFBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2Zub3gudG9tbCcpO1xuICAgICAgICBjb25zdCByZWFsUGF0aCA9IGZzLnJlYWxwYXRoU3luYyhmbm94VG9tbFBhdGgpO1xuICAgICAgICBpZiAoZnMubHN0YXRTeW5jKGZub3hUb21sUGF0aCkuaXNTeW1ib2xpY0xpbmsoKSB8fCAhcmVhbFBhdGguc3RhcnRzV2l0aChyZWFsUm9vdERpclBhdGggKyBwYXRoLnNlcCkpIHtcbiAgICAgICAgICBmYWlsRm5veFN5bmMoXG4gICAgICAgICAgICBgRmFpbGVkIHRvIHN5bmNocm9uaXplIGZub3ggYWdlIHJlY2lwaWVudHMgYmVjYXVzZSAke2Zub3hUb21sUGF0aH0gaXMgYSBzeW1saW5rIG9yIHJlc29sdmVzIG91dHNpZGUgdGhlIHJlcG9zaXRvcnkgKCR7cmVhbFBhdGh9KS4gUmVwbGFjZSBpdCB3aXRoIGEgcmVndWxhciBpbi1yZXBvc2l0b3J5IGZpbGUuYFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHNuYXBzaG90cy5zZXQoZm5veFRvbWxQYXRoLCBmcy5yZWFkRmlsZVN5bmMoZm5veFRvbWxQYXRoLCAndXRmOCcpKTtcbiAgICAgIH1cblxuICAgICAgLy8gU29ydGVkIG9yZGVyIHByb2Nlc3NlcyBhbmNlc3RvcnMgYmVmb3JlIGRlc2NlbmRhbnRzLCBzbyBjb25maWdzIGluaGVyaXRpbmcgYW4gdXBkYXRlZFxuICAgICAgLy8gcHJvdmlkZXIgcmUtZW5jcnlwdCBhZ2FpbnN0IHRoZSBhbHJlYWR5LXVwZGF0ZWQgcmVjaXBpZW50cy5cbiAgICAgIGNvbnN0IGNoYW5nZWREaXJQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgICAgIGxldCBhbnlGYWlsZWQgPSBmYWxzZTtcbiAgICAgIGZvciAoY29uc3QgZGlyUGF0aCBvZiBkaXJQYXRocykge1xuICAgICAgICBjb25zdCBhbmNlc3RvckNoYW5nZWQgPSBjaGFuZ2VkRGlyUGF0aHMuc29tZSgoY2hhbmdlZERpclBhdGgpID0+IGRpclBhdGguc3RhcnRzV2l0aChjaGFuZ2VkRGlyUGF0aCArIHBhdGguc2VwKSk7XG4gICAgICAgIC8vIEV2ZXJ5IGRpclBhdGggd2FzIHNuYXBzaG90dGVkIGFib3ZlLiBBIG1pc3Npbmcgc25hcHNob3QgbXVzdCBmYWlsIGhhcmQ6IGZhbGxpbmcgYmFjayB0b1xuICAgICAgICAvLyBhbiBlbXB0eSBzdHJpbmcgd291bGQgZmxvdyBpbnRvIHJlcGxhY2VBZ2VSZWNpcGllbnRzIGFuZCBvdmVyd3JpdGUgdGhlIHJlYWwgZm5veC50b21sXG4gICAgICAgIC8vIHdpdGggYSByZWNpcGllbnRzLW9ubHkgZmlsZSwgZGVzdHJveWluZyBldmVyeSBjb21taXR0ZWQgc2VjcmV0LlxuICAgICAgICBjb25zdCBzbmFwc2hvdENvbnRlbnQgPSBzbmFwc2hvdHMuZ2V0KHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnZm5veC50b21sJykpO1xuICAgICAgICBpZiAoc25hcHNob3RDb250ZW50ID09PSB1bmRlZmluZWQpIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBmbm94LnRvbWwgc25hcHNob3QgZm9yICR7ZGlyUGF0aH0uYCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN5bmNocm9uaXplRm5veEFnZVJlY2lwaWVudHMoXG4gICAgICAgICAgZGlyUGF0aCxcbiAgICAgICAgICByb290RGlyUGF0aCxcbiAgICAgICAgICBkaXJQYXRoID09PSByb290RGlyUGF0aCxcbiAgICAgICAgICBhbmNlc3RvckNoYW5nZWQsXG4gICAgICAgICAgc25hcHNob3RDb250ZW50LFxuICAgICAgICAgIGFnZVJlY2lwaWVudHNcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gJ2NoYW5nZWQnKSBjaGFuZ2VkRGlyUGF0aHMucHVzaChkaXJQYXRoKTtcbiAgICAgICAgYW55RmFpbGVkIHx8PSByZXN1bHQgPT09ICdmYWlsZWQnO1xuICAgICAgfVxuICAgICAgaWYgKGFueUZhaWxlZCkge1xuICAgICAgICAvLyBBIGZhaWxlZCByZS1lbmNyeXB0aW9uIG1heSBoYXZlIHJld3JpdHRlbiBzb21lIGNpcGhlcnRleHRzLCBzbyByZXN0b3JlIHVuY29uZGl0aW9uYWxseS5cbiAgICAgICAgLy8gVGhlIG1hcmtlciBpcyByZW1vdmVkIG9ubHkgd2hlbiByZXN0b3JhdGlvbiBmdWxseSBzdWNjZWVkZWQgYW5kIHRoZSB0cmVlIGlzIGNvbnNpc3RlbnQuXG4gICAgICAgIC8vIFJlc3RvcmUgT05MWSB3aGVuIHRoaXMgcnVuIG93bnMgdGhlIG1hcmtlcjogZXZlcnkgY29tbWl0dGVkLWNvbmZpZyBtdXRhdGlvbiBoYXBwZW5zXG4gICAgICAgIC8vIGFmdGVyIG1hcmtlciBhY3F1aXNpdGlvbiwgc28gYSBub24tb3duZXIgKGUuZy4gbG9zaW5nIGEgcmFjZSBhZ2FpbnN0IGEgY29uY3VycmVudCB3YmZ5KVxuICAgICAgICAvLyBoYXMgY2hhbmdlZCBub3RoaW5nIGFuZCBtdXN0IG5vdCBvdmVyd3JpdGUgdGhlIG93bmVyJ3MgaW4tcHJvZ3Jlc3MgbWlncmF0aW9uLlxuICAgICAgICBpZiAobWlncmF0aW9uTWFya2VyT3duZWQgJiYgcmVzdG9yZVNuYXBzaG90cyhzbmFwc2hvdHMpKSByZW1vdmVPd25lZE1pZ3JhdGlvbk1hcmtlcigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVtb3ZlT3duZWRNaWdyYXRpb25NYXJrZXIoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKG1pZ3JhdGlvbk1hcmtlck93bmVkICYmIHJlc3RvcmVTbmFwc2hvdHMoc25hcHNob3RzKSkge1xuICAgICAgICByZW1vdmVPd25lZE1pZ3JhdGlvbk1hcmtlcigpO1xuICAgICAgfVxuICAgICAgZmFpbEZub3hTeW5jKGBGYWlsZWQgdG8gc3luY2hyb25pemUgZm5veCBhZ2UgcmVjaXBpZW50cyBkdWUgdG86ICR7KGVycm9yIGFzIEVycm9yIHwgdW5kZWZpbmVkKT8uc3RhY2sgPz8gZXJyb3J9YCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIG1pZ3JhdGlvbk1hcmtlclBhdGggPSB1bmRlZmluZWQ7XG4gICAgICBtaWdyYXRpb25NYXJrZXJPd25lZCA9IGZhbHNlO1xuICAgIH1cbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN5bmNocm9uaXplRm5veEFnZVJlY2lwaWVudHMoXG4gIGRpclBhdGg6IHN0cmluZyxcbiAgcm9vdERpclBhdGg6IHN0cmluZyxcbiAgaXNSb290OiBib29sZWFuLFxuICBhbmNlc3RvclJlY2lwaWVudHNDaGFuZ2VkOiBib29sZWFuLFxuICBvcmlnaW5hbENvbnRlbnQ6IHN0cmluZyxcbiAgYWdlUmVjaXBpZW50czogcmVhZG9ubHkgRm5veEFnZVJlY2lwaWVudFtdXG4pOiBQcm9taXNlPCdjaGFuZ2VkJyB8ICd1bmNoYW5nZWQnIHwgJ2ZhaWxlZCc+IHtcbiAgY29uc3QgZm5veFRvbWxQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdmbm94LnRvbWwnKTtcblxuICAvLyBSZWNpcGllbnQgc3luY2hyb25pemF0aW9uIG9ubHkgdW5kZXJzdGFuZHMgdGhlIHN0YW5kYXJkIHNpbmdsZS1maWxlIGxheW91dCB3aXRoIG9uZVxuICAvLyB0b3AtbGV2ZWwgYWdlIHByb3ZpZGVyIG5hbWVkIGBhZ2VgLiBHaXRpZ25vcmVkIGNvbmZpZyBhbGlhc2VzIChlLmcuIC5mbm94LmxvY2FsLnRvbWwpIHRoYXRcbiAgLy8gZ2l0LWJhc2VkIGRpc2NvdmVyeSBjYW5ub3Qgc2VlLCBpbXBvcnRzLCBkaWZmZXJlbnRseSBuYW1lZCBhZ2UgcHJvdmlkZXJzLCBvciBwcm92aWRlclxuICAvLyBvdmVycmlkZXMgd291bGQga2VlcCB1c2luZyByZWNpcGllbnQgc2V0cyB0aGlzIGdlbmVyYXRvciBkb2VzIG5vdCByZXdyaXRlLCBzbyB0aGVpciBzZWNyZXRzXG4gIC8vIHdvdWxkIHNpbGVudGx5IHN0YXkgdW5kZWNyeXB0YWJsZSBmb3IgbmV3IHJlY2lwaWVudHM7IGZhaWwgaW5zdGVhZCBvZiBwcm9jZWVkaW5nLiBUaGVcbiAgLy8gZ2l0aWdub3JlZCBmbm94LmxvY2FsLnRvbWwgaXMgYSBzdXBwb3J0ZWQgbWFjaGluZS1sb2NhbCBvdmVycmlkZSwgYnV0IG9ubHkgd2hpbGUgaXQgbGVhdmVzXG4gIC8vIHByb3ZpZGVycyBhbG9uZS5cbiAgY29uc3QgdW5zdXBwb3J0ZWRGaWxlTmFtZXMgPSBsaXN0Rm5veExpa2VGaWxlTmFtZXMoZGlyUGF0aCkuZmlsdGVyKFxuICAgIChuYW1lKSA9PiBuYW1lICE9PSAnZm5veC50b21sJyAmJiBuYW1lICE9PSAnZm5veC5sb2NhbC50b21sJ1xuICApO1xuICBpZiAodW5zdXBwb3J0ZWRGaWxlTmFtZXMubGVuZ3RoID4gMCkge1xuICAgIGZhaWxGbm94U3luYyhcbiAgICAgIGBGYWlsZWQgdG8gc3luY2hyb25pemUgZm5veCBhZ2UgcmVjaXBpZW50cyBpbiAke2RpclBhdGh9IGJlY2F1c2Ugb25seSBmbm94LnRvbWwgYW5kIGZub3gubG9jYWwudG9tbCBhcmUgc3VwcG9ydGVkOiAke3Vuc3VwcG9ydGVkRmlsZU5hbWVzLmpvaW4oJywgJyl9LiBNZXJnZSB0aGVtIGludG8gZm5veC50b21sLmBcbiAgICApO1xuICAgIHJldHVybiAnZmFpbGVkJztcbiAgfVxuICAvLyBBIHN0YWxlIGJhY2t1cCBsZWZ0IGJ5IGFuIGludGVycnVwdGVkIGVhcmxpZXIgcnVuIG11c3QgYmUgcmVzdG9yZWQgc28gdGhlIHVzZXIncyBsb2NhbFxuICAvLyBvdmVycmlkZXMgYXJlIG5ldmVyIHNpbGVudGx5IGxvc3QgKHRoZSBtaWdyYXRpb24gbWFya2VyIHNlcGFyYXRlbHkgYmxvY2tzIHRoaXMgcnVuIHdoZW4gdGhlXG4gIC8vIGludGVycnVwdGlvbiBsZWZ0IHRoZSBtaWdyYXRpb24gaXRzZWxmIGluY29tcGxldGUpLlxuICByZWNvdmVyU3RhbGVGbm94TG9jYWxCYWNrdXAocm9vdERpclBhdGgsIGRpclBhdGgpO1xuXG4gIGNvbnN0IGxheW91dElzc3VlID0gZmluZEZub3hMYXlvdXRJc3N1ZShvcmlnaW5hbENvbnRlbnQpO1xuICBpZiAobGF5b3V0SXNzdWUpIHtcbiAgICBmYWlsRm5veFN5bmMoYEZhaWxlZCB0byBzeW5jaHJvbml6ZSBmbm94IGFnZSByZWNpcGllbnRzIGJlY2F1c2UgJHtmbm94VG9tbFBhdGh9ICR7bGF5b3V0SXNzdWV9LmApO1xuICAgIHJldHVybiAnZmFpbGVkJztcbiAgfVxuICBjb25zdCBzZXR0aW5ncyA9IEJ1bi5UT01MLnBhcnNlKG9yaWdpbmFsQ29udGVudCkgYXMgRm5veFRvbWw7XG4gIGNvbnN0IHByb2ZpbGVOYW1lcyA9IE9iamVjdC5rZXlzKHNldHRpbmdzLnByb2ZpbGVzID8/IHt9KTtcbiAgY29uc3QgY3VycmVudFJlY2lwaWVudHMgPSByZWFkRm5veEFnZVJlY2lwaWVudHMob3JpZ2luYWxDb250ZW50KTtcblxuICAvLyBBIG5lc3RlZCBmbm94LnRvbWwgd2l0aG91dCBpdHMgb3duIGFnZSBwcm92aWRlciBpbmhlcml0cyB0aGUgbmVhcmVzdCBhbmNlc3RvcidzIG9uZSB0aHJvdWdoXG4gIC8vIGZub3gncyBoaWVyYXJjaGljYWwgbG9hZGluZywgc28gb25seSB0aGUgcm9vdCBjb25maWcgbXVzdCBkZWNsYXJlIHRoZSBwcm92aWRlciDigJQgYnV0IHRoZVxuICAvLyBuZXN0ZWQgY29uZmlnJ3Mgb3duIGNpcGhlcnRleHRzIHN0aWxsIG11c3QgYmUgcmUtZW5jcnlwdGVkIHdoZW5ldmVyIGFuIGFuY2VzdG9yJ3MgcmVjaXBpZW50c1xuICAvLyBjaGFuZ2VkLCBhbmQgdGhhdCBvbmx5IGhhcHBlbnMgd2hlbiBgZm5veCByZWVuY3J5cHRgIHJ1bnMgZnJvbSB0aGUgbmVzdGVkIGRpcmVjdG9yeS5cbiAgaWYgKCFpc1Jvb3QgJiYgIWN1cnJlbnRSZWNpcGllbnRzKSB7XG4gICAgaWYgKGFuY2VzdG9yUmVjaXBpZW50c0NoYW5nZWQpIHtcbiAgICAgIHdyaXRlTWlncmF0aW9uTWFya2VyKCk7XG4gICAgICBpZiAoIXJlZW5jcnlwdEZub3hTZWNyZXRzKGRpclBhdGgsIHJvb3REaXJQYXRoLCBwcm9maWxlTmFtZXMpKSB7XG4gICAgICAgIGZhaWxGbm94U3luYyhcbiAgICAgICAgICBgRmFpbGVkIHRvIHJlLWVuY3J5cHQgZm5veCBzZWNyZXRzIGluICR7ZGlyUGF0aH0gZm9yIHRoZSB1cGRhdGVkIHJlY2lwaWVudHMuIEZpeCB0aGUgZXJyb3IgYW5kIHJlcnVuIHdiZnkuYFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gJ2ZhaWxlZCc7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAndW5jaGFuZ2VkJztcbiAgfVxuXG4gIGlmIChcbiAgICBjdXJyZW50UmVjaXBpZW50cyAmJlxuICAgIGN1cnJlbnRSZWNpcGllbnRzLnNpemUgPT09IGFnZVJlY2lwaWVudHMubGVuZ3RoICYmXG4gICAgYWdlUmVjaXBpZW50cy5ldmVyeSgocmVjaXBpZW50KSA9PiBjdXJyZW50UmVjaXBpZW50cy5oYXMocmVjaXBpZW50LnB1YmxpY0tleSkpXG4gICkge1xuICAgIHJldHVybiAndW5jaGFuZ2VkJztcbiAgfVxuXG4gIC8vIFJld3JpdGUgb25seSB0aGUgcmVjaXBpZW50cyBhc3NpZ25tZW50IHNvIHVzZXItYXV0aG9yZWQgY29tbWVudHMgYW5kIGZvcm1hdHRpbmcgc3Vydml2ZS5cbiAgLy8gUmUtcGFyc2UgYmVmb3JlIHdyaXRpbmc6IGFuIHVudXN1YWwgbGF5b3V0IChlLmcuIGRvdHRlZCBrZXlzKSBjb3VsZCBtYWtlIHRoZSB0ZXh0dWFsIGVkaXRcbiAgLy8gcHJvZHVjZSBhIGR1cGxpY2F0ZSB0YWJsZSBvciBsZWF2ZSB0aGUgb2xkIHJlY2lwaWVudHMgaW4gZWZmZWN0LlxuICBjb25zdCB1cGRhdGVkQ29udGVudCA9IHJlcGxhY2VBZ2VSZWNpcGllbnRzKG9yaWdpbmFsQ29udGVudCwgYWdlUmVjaXBpZW50cyk7XG4gIGNvbnN0IHVwZGF0ZWRSZWNpcGllbnRzID0gWy4uLihyZWFkRm5veEFnZVJlY2lwaWVudHModXBkYXRlZENvbnRlbnQpID8/IFtdKV07XG4gIGlmIChcbiAgICB1cGRhdGVkUmVjaXBpZW50cy5sZW5ndGggIT09IGFnZVJlY2lwaWVudHMubGVuZ3RoIHx8XG4gICAgIWFnZVJlY2lwaWVudHMuZXZlcnkoKHJlY2lwaWVudCkgPT4gdXBkYXRlZFJlY2lwaWVudHMuaW5jbHVkZXMocmVjaXBpZW50LnB1YmxpY0tleSkpXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcihgUmV3cml0aW5nIHRoZSBhZ2UgcmVjaXBpZW50cyBpbiAke2Zub3hUb21sUGF0aH0gZGlkIG5vdCB0YWtlIGVmZmVjdDsgdXBkYXRlIHRoZW0gbWFudWFsbHkuYCk7XG4gIH1cbiAgd3JpdGVNaWdyYXRpb25NYXJrZXIoKTtcbiAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmbm94VG9tbFBhdGgsIHVwZGF0ZWRDb250ZW50KTtcblxuICBpZiAoIXJlZW5jcnlwdEZub3hTZWNyZXRzKGRpclBhdGgsIHJvb3REaXJQYXRoLCBwcm9maWxlTmFtZXMpKSB7XG4gICAgLy8gUmVzdG9yZSB0aGUgb3JpZ2luYWwgY29uZmlnOiBrZWVwaW5nIHRoZSBuZXcgcmVjaXBpZW50cyB3aXRoIG9sZCBjaXBoZXJ0ZXh0cyB3b3VsZCBtYWtlXG4gICAgLy8gdGhpcyBnZW5lcmF0b3Igc2tpcCByZS1lbmNyeXB0aW9uIGZvcmV2ZXIgYW5kIGxldCBzZXR1cFNlY3JldHMgdXBsb2FkIGEgQ0kga2V5IHRoYXRcbiAgICAvLyBjYW5ub3QgZGVjcnlwdCBhbnl0aGluZy4gVGhlIG9sZCBjaXBoZXJ0ZXh0cyByZW1haW4gdmFsaWQgZm9yIHRoZSBvbGQgcmVjaXBpZW50cy5cbiAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZub3hUb21sUGF0aCwgb3JpZ2luYWxDb250ZW50KTtcbiAgICBmYWlsRm5veFN5bmMoXG4gICAgICBgRmFpbGVkIHRvIHJlLWVuY3J5cHQgZm5veCBzZWNyZXRzIGluICR7ZGlyUGF0aH0gZm9yIHRoZSB1cGRhdGVkIHJlY2lwaWVudHMuIEZpeCB0aGUgZXJyb3IgYW5kIHJlcnVuIHdiZnkuYFxuICAgICk7XG4gICAgcmV0dXJuICdmYWlsZWQnO1xuICB9XG4gIHJldHVybiAnY2hhbmdlZCc7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGRlc2NyaXB0aW9uIG9mIGEgZm5veC50b21sIGxheW91dCB0aGF0IHJlY2lwaWVudCBzeW5jaHJvbml6YXRpb24gYW5kIHRoZSBDSS1rZXlcbiAqIHZlcmlmaWNhdGlvbiBjYW5ub3QgY292ZXIsIG9yIHVuZGVmaW5lZCB3aGVuIHRoZSBzdGFuZGFyZCBzaW5nbGUtZmlsZSwgc2luZ2xlLWFnZS1wcm92aWRlclxuICogbGF5b3V0IGlzIHVzZWQuXG4gKi9cbmZ1bmN0aW9uIGZpbmRGbm94TGF5b3V0SXNzdWUoZm5veFRvbWxDb250ZW50OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIGNvbnN0IHNldHRpbmdzID0gQnVuLlRPTUwucGFyc2UoZm5veFRvbWxDb250ZW50KSBhcyBGbm94VG9tbDtcbiAgICBpZiAoc2V0dGluZ3MuaW1wb3J0ICE9PSB1bmRlZmluZWQpIHJldHVybiAndXNlcyB0aGUgdW5zdXBwb3J0ZWQgYGltcG9ydGAgc2V0dGluZyc7XG4gICAgY29uc3Qgbm9uU3RhbmRhcmRBZ2VQcm92aWRlck5hbWVzID0gT2JqZWN0LmVudHJpZXMoc2V0dGluZ3MucHJvdmlkZXJzID8/IHt9KVxuICAgICAgLmZpbHRlcigoW25hbWUsIHByb3ZpZGVyXSkgPT4gKHByb3ZpZGVyPy50eXBlID09PSAnYWdlJykgIT09IChuYW1lID09PSAnYWdlJykpXG4gICAgICAubWFwKChbbmFtZV0pID0+IG5hbWUpO1xuICAgIGlmIChub25TdGFuZGFyZEFnZVByb3ZpZGVyTmFtZXMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIGBkZWNsYXJlcyBhZ2UgcHJvdmlkZXJzIG5vdCBuYW1lZCBcXGBhZ2VcXGAgKG9yIGFuIFxcYGFnZVxcYCBwcm92aWRlciBvZiBhbm90aGVyIHR5cGUpOiAke25vblN0YW5kYXJkQWdlUHJvdmlkZXJOYW1lcy5qb2luKCcsICcpfWA7XG4gICAgfVxuICAgIGNvbnN0IHByb2ZpbGVzV2l0aFByb3ZpZGVycyA9IE9iamVjdC5lbnRyaWVzKHNldHRpbmdzLnByb2ZpbGVzID8/IHt9KVxuICAgICAgLmZpbHRlcigoWywgcHJvZmlsZV0pID0+IHByb2ZpbGU/LnByb3ZpZGVycylcbiAgICAgIC5tYXAoKFtuYW1lXSkgPT4gbmFtZSk7XG4gICAgaWYgKHByb2ZpbGVzV2l0aFByb3ZpZGVycy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gYGRlY2xhcmVzIHVuc3VwcG9ydGVkIHByb2ZpbGUtc3BlY2lmaWMgcHJvdmlkZXJzOiAke3Byb2ZpbGVzV2l0aFByb3ZpZGVycy5qb2luKCcsICcpfWA7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiAnY2Fubm90IGJlIHBhcnNlZCBhcyBUT01MJztcbiAgfVxufVxuXG4vKipcbiAqIFJlYWRzIHRoZSBbcHJvdmlkZXJzLmFnZV0ucmVjaXBpZW50cyBvZiBhIGZub3gudG9tbCwgb3IgdW5kZWZpbmVkIHdoZW4gdGhlIGNvbmZpZyBkZWNsYXJlcyBub1xuICogYWdlIHByb3ZpZGVyIChuZXN0ZWQgY29uZmlncyB0aGVuIGluaGVyaXQgdGhlIHJvb3Qgb25lKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRGbm94QWdlUmVjaXBpZW50cyhmbm94VG9tbENvbnRlbnQ6IHN0cmluZyk6IFNldDxzdHJpbmc+IHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzZXR0aW5ncyA9IEJ1bi5UT01MLnBhcnNlKGZub3hUb21sQ29udGVudCkgYXMgRm5veFRvbWw7XG4gICAgaWYgKCFzZXR0aW5ncy5wcm92aWRlcnM/LmFnZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCByZWNpcGllbnRzID0gc2V0dGluZ3MucHJvdmlkZXJzLmFnZS5yZWNpcGllbnRzO1xuICAgIHJldHVybiBuZXcgU2V0KEFycmF5LmlzQXJyYXkocmVjaXBpZW50cykgPyByZWNpcGllbnRzLmZpbHRlcigocik6IHIgaXMgc3RyaW5nID0+IHR5cGVvZiByID09PSAnc3RyaW5nJykgOiBbXSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIEFuIHVucGFyc2FibGUgZm5veC50b21sIHlpZWxkcyBubyByZWNpcGllbnRzLCBzbyB0aGUgY2FsbGVyIHJlcG9ydHMgYW4gZXJyb3IuXG4gICAgcmV0dXJuIG5ldyBTZXQoKTtcbiAgfVxufVxuXG50eXBlIEZub3hSZXBvc2l0b3J5SWRlbnRpdHkgPSBQaWNrPFBhY2thZ2VDb25maWcsICdyZXBvQXV0aG9yJyB8ICdyZXBvTmFtZScgfCAnaXNQdWJsaWNSZXBvJyB8ICdpc1JlcG9WaXNpYmlsaXR5S25vd24nPjtcblxuLyoqXG4gKiBUaGUgR2l0SHViIHNlY3JldCBob2xkaW5nIHRoZSBwcml2YXRlIGtleSBvZiB0aGUgQ0kgaWRlbnRpdHkgc2NvcGVkIHRvIHRoZSByZXBvc2l0b3J5LCBvclxuICogdW5kZWZpbmVkIHdoZW4gbm9uZSBpcyAoYW4gdW5rbm93biB2aXNpYmlsaXR5LCBvciBhIHJlcG9zaXRvcnkgbm8gQ0kgc2NvcGUgY292ZXJzKS4gVGhlIHNpbmdsZVxuICogc291cmNlIG9mIHRydXRoIHNoYXJlZCBieSB0aGUgcmVjaXBpZW50IHN5bmMgYW5kIHRoZSB3b3JrZmxvdyBnZW5lcmF0b3IncyBjYWxsZXIgbWFwcGluZ3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlRm5veENpQWdlS2V5U2VjcmV0TmFtZShcbiAgY29uZmlnOiBGbm94UmVwb3NpdG9yeUlkZW50aXR5XG4pOiAnRk5PWF9BR0VfS0VZJyB8ICdQVUJMSUNfRk5PWF9BR0VfS0VZJyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGNpUHJpbmNpcGFsOiBGbm94QWdlUHJpbmNpcGFsIHwgdW5kZWZpbmVkID0gRk5PWF9BR0VfUFJJTkNJUEFMUy5maW5kKFxuICAgIChwcmluY2lwYWw6IEZub3hBZ2VQcmluY2lwYWwpID0+XG4gICAgICBwcmluY2lwYWwuY2lBZ2VLZXlTZWNyZXROYW1lICYmIG1hdGNoZXNGbm94UmVwb3NpdG9yeVNjb3BlKHByaW5jaXBhbC5yZXBvc2l0b3J5U2NvcGUsIGNvbmZpZylcbiAgKTtcbiAgcmV0dXJuIGNpUHJpbmNpcGFsPy5jaUFnZUtleVNlY3JldE5hbWU7XG59XG5cbi8qKiBXaGV0aGVyIHRoZSByZWNpcGllbnQgc2V0IGRpZmZlcnMgYmV0d2VlbiB0aGUgcHVibGljIGFuZCBwcml2YXRlIHJlYWRpbmcgb2YgdGhlIHJlcG9zaXRvcnkuICovXG5leHBvcnQgZnVuY3Rpb24gZG9lc0Zub3hSZWNpcGllbnRTZXREZXBlbmRPblZpc2liaWxpdHkoXG4gIHJvb3RDb25maWc6IFBpY2s8UGFja2FnZUNvbmZpZywgJ3JlcG9BdXRob3InIHwgJ3JlcG9OYW1lJz5cbik6IGJvb2xlYW4ge1xuICBjb25zdCBwdWJsaWNLZXlzRm9yID0gKGlzUHVibGljUmVwbzogYm9vbGVhbik6IHN0cmluZyA9PlxuICAgIGdldEZub3hBZ2VSZWNpcGllbnRzKHsgLi4ucm9vdENvbmZpZywgaXNQdWJsaWNSZXBvLCBpc1JlcG9WaXNpYmlsaXR5S25vd246IHRydWUgfSlcbiAgICAgIC5tYXAoKHsgcHVibGljS2V5IH0pID0+IHB1YmxpY0tleSlcbiAgICAgIC5qb2luKCdcXG4nKTtcbiAgcmV0dXJuIHB1YmxpY0tleXNGb3IodHJ1ZSkgIT09IHB1YmxpY0tleXNGb3IoZmFsc2UpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm5veEFnZVJlY2lwaWVudHMocm9vdENvbmZpZzogRm5veFJlcG9zaXRvcnlJZGVudGl0eSk6IEZub3hBZ2VSZWNpcGllbnRbXSB7XG4gIHJldHVybiBGTk9YX0FHRV9QUklOQ0lQQUxTLmZpbHRlcigocHJpbmNpcGFsKSA9PlxuICAgIG1hdGNoZXNGbm94UmVwb3NpdG9yeVNjb3BlKHByaW5jaXBhbC5yZXBvc2l0b3J5U2NvcGUsIHJvb3RDb25maWcpXG4gICkuZmxhdE1hcCgocHJpbmNpcGFsKSA9PlxuICAgIHByaW5jaXBhbC5wdWJsaWNLZXlzLm1hcCgocHVibGljS2V5LCBpbmRleCkgPT4gKHtcbiAgICAgIG5hbWU6IHByaW5jaXBhbC5wdWJsaWNLZXlzLmxlbmd0aCA9PT0gMSA/IHByaW5jaXBhbC5uYW1lIDogYCR7cHJpbmNpcGFsLm5hbWV9JHtpbmRleCArIDF9YCxcbiAgICAgIHB1YmxpY0tleSxcbiAgICB9KSlcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1hdGNoZXNGbm94UmVwb3NpdG9yeVNjb3BlKHNjb3BlOiBGbm94UmVwb3NpdG9yeVNjb3BlLCByZXBvc2l0b3J5OiBGbm94UmVwb3NpdG9yeUlkZW50aXR5KTogYm9vbGVhbiB7XG4gIGNvbnN0IG93bmVyID0gcmVwb3NpdG9yeS5yZXBvQXV0aG9yPy50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBuYW1lID0gcmVwb3NpdG9yeS5yZXBvTmFtZT8udG9Mb3dlckNhc2UoKTtcbiAgaWYgKCFvd25lciB8fCAhbmFtZSkgcmV0dXJuIGZhbHNlO1xuXG4gIC8vIEFuIHVua25vd24gdmlzaWJpbGl0eSAoZmFpbGVkIEdpdEh1YiBsb29rdXApIG1hdGNoZXMgbm8gdmlzaWJpbGl0eS1jb25zdHJhaW5lZCBzY29wZTogY2FsbGVyc1xuICAvLyB0aGF0IHdvdWxkIHJld3JpdGUgcmVjaXBpZW50cyBmYWlsIGluc3RlYWQgb2YgZW5jcnlwdGluZyB0byB0aGUgd3JvbmcgQ0kgaWRlbnRpdHkuXG4gIGlmIChcbiAgICBzY29wZS52aXNpYmlsaXR5ICYmXG4gICAgKCFyZXBvc2l0b3J5LmlzUmVwb1Zpc2liaWxpdHlLbm93biB8fCAoc2NvcGUudmlzaWJpbGl0eSA9PT0gJ3B1YmxpYycpICE9PSByZXBvc2l0b3J5LmlzUHVibGljUmVwbylcbiAgKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIChcbiAgICAoc2NvcGUub3JnYW5pemF0aW9ucz8uc29tZSgob3JnYW5pemF0aW9uKSA9PiBvcmdhbml6YXRpb24udG9Mb3dlckNhc2UoKSA9PT0gb3duZXIpID8/IGZhbHNlKSB8fFxuICAgIChzY29wZS5yZXBvc2l0b3JpZXM/LnNvbWUoKGZ1bGxOYW1lKSA9PiBmdWxsTmFtZS50b0xvd2VyQ2FzZSgpID09PSBgJHtvd25lcn0vJHtuYW1lfWApID8/IGZhbHNlKVxuICApO1xufVxuXG5mdW5jdGlvbiByZXBsYWNlQWdlUmVjaXBpZW50cyhjb250ZW50OiBzdHJpbmcsIGFnZVJlY2lwaWVudHM6IHJlYWRvbmx5IEZub3hBZ2VSZWNpcGllbnRbXSk6IHN0cmluZyB7XG4gIC8vIFRyYWlsaW5nIG5hbWUgY29tbWVudHMgbGV0IGh1bWFucyB0ZWxsIHdob3NlIGtleSBlYWNoIHJlY2lwaWVudCBpcyB3aXRob3V0IGNvbnN1bHRpbmcgd2JmeS5cbiAgY29uc3QgcmVjaXBpZW50c1RleHQgPSBgcmVjaXBpZW50cyA9IFtcXG4ke2FnZVJlY2lwaWVudHNcbiAgICAubWFwKChyZWNpcGllbnQpID0+IGAgIFwiJHtyZWNpcGllbnQucHVibGljS2V5fVwiLCAjICR7cmVjaXBpZW50Lm5hbWV9YClcbiAgICAuam9pbignXFxuJyl9XFxuXWA7XG4gIC8vIHdiZnkgd3JpdGVzIGEgW3Byb3ZpZGVycy5hZ2VdIHRhYmxlIChwb3NzaWJseSB3aXRoIGEgdHJhaWxpbmcgY29tbWVudCkuIFNjYW4gbGluZS13aXNlIHNvIHRoYXRcbiAgLy8gYSBgW2AgaW5zaWRlIGEgY29tbWVudCBvciBhIHN0cmluZyBuZXZlciB0ZXJtaW5hdGVzIHRoZSB0YWJsZSBlYXJseTsgdGhlIHRhYmxlIGVuZHMgYXQgdGhlXG4gIC8vIG5leHQgbGluZS1zdGFydCB0YWJsZSBoZWFkZXIuIFRoZSBhc3NpZ25tZW50IG1hdGNoIGlzIGxpbmUtYW5jaG9yZWQgc28gYSBjb21tZW50ZWQtb3V0XG4gIC8vIGAjIHJlY2lwaWVudHMgPSBbLi4uXWAgaXMgbmV2ZXIgbWlzdGFrZW4gZm9yIHRoZSByZWFsIG9uZSwgd2hpbGUgbXVsdGlsaW5lIGFycmF5cyBzdGlsbCBtYXRjaFxuICAvLyBiZWNhdXNlIHRoZSBuZWdhdGVkIGNsYXNzIFteXFxdXSAodW5saWtlIGAuYCkgc3BhbnMgbmV3bGluZXMuIEFueSBvdGhlciBzcGVsbGluZyBmYWxscyB0aHJvdWdoXG4gIC8vIHRvIHRoZSBjYWxsZXIncyByZS1wYXJzZSB2YWxpZGF0aW9uLCB3aGljaCBmYWlscyB0aGUgcnVuIHNhZmVseSB3aXRoIGluc3RydWN0aW9ucyBpbnN0ZWFkIG9mXG4gIC8vIGNvcnJ1cHRpbmcgdGhlIGZpbGUuXG4gIGNvbnN0IGxpbmVzID0gY29udGVudC5zcGxpdCgnXFxuJyk7XG4gIGNvbnN0IGhlYWRlckluZGV4ID0gbGluZXMuZmluZEluZGV4KChsaW5lKSA9PiAvXlxccypcXFtwcm92aWRlcnNcXC5hZ2VcXF1cXHMqKD86Iy4qKT8kL3UudGVzdChsaW5lKSk7XG4gIGlmIChoZWFkZXJJbmRleCAhPT0gLTEpIHtcbiAgICBsZXQgZW5kSW5kZXggPSBsaW5lcy5sZW5ndGg7XG4gICAgZm9yIChsZXQgaW5kZXggPSBoZWFkZXJJbmRleCArIDE7IGluZGV4IDwgbGluZXMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICBpZiAoL15cXHMqXFxbL3UudGVzdChsaW5lc1tpbmRleF0gPz8gJycpKSB7XG4gICAgICAgIGVuZEluZGV4ID0gaW5kZXg7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBzZWN0aW9uID0gbGluZXMuc2xpY2UoaGVhZGVySW5kZXgsIGVuZEluZGV4KS5qb2luKCdcXG4nKTtcbiAgICBjb25zdCByZXBsYWNlZFNlY3Rpb24gPSBzZWN0aW9uLnJlcGxhY2UoL15cXHMqcmVjaXBpZW50c1xccyo9XFxzKlxcW1teXFxdXSpcXF0vbXUsIHJlY2lwaWVudHNUZXh0KTtcbiAgICBjb25zdCBuZXdTZWN0aW9uID1cbiAgICAgIHJlcGxhY2VkU2VjdGlvbiA9PT0gc2VjdGlvblxuICAgICAgICA/IFtsaW5lc1toZWFkZXJJbmRleF0sIHJlY2lwaWVudHNUZXh0LCAuLi5saW5lcy5zbGljZShoZWFkZXJJbmRleCArIDEsIGVuZEluZGV4KV0uam9pbignXFxuJylcbiAgICAgICAgOiByZXBsYWNlZFNlY3Rpb247XG4gICAgcmV0dXJuIFsuLi5saW5lcy5zbGljZSgwLCBoZWFkZXJJbmRleCksIG5ld1NlY3Rpb24sIC4uLmxpbmVzLnNsaWNlKGVuZEluZGV4KV0uam9pbignXFxuJyk7XG4gIH1cbiAgcmV0dXJuIGAke2NvbnRlbnQudHJpbUVuZCgpfVxcblxcbltwcm92aWRlcnMuYWdlXVxcbnR5cGUgPSBcImFnZVwiXFxuJHtyZWNpcGllbnRzVGV4dH1cXG5gO1xufVxuXG4vLyBSZS1lbmNyeXB0cyB0aGUgYmFzZSBzZWNyZXRzIGFuZCBlYWNoIHByb2ZpbGUncyBvd24gc2VjcmV0cyAoLS1uby1kZWZhdWx0cyBrZWVwcyB0aGUgbWVyZ2VkXG4vLyBiYXNlIHNlY3JldHMgZnJvbSBiZWluZyBkdXBsaWNhdGVkIGludG8gcHJvZmlsZSB0YWJsZXMpIGZvciB0aGUgY3VycmVudCByZWNpcGllbnQgc2V0LiBUaGVcbi8vIHNwYXduZWQgZm5veCBydW5zIHdpdGggYW4gaXNvbGF0ZWQgSE9NRS9YREdfQ09ORklHX0hPTUUgYmVjYXVzZSBmbm94IG1lcmdlcyB0aGUgdXNlci1nbG9iYWxcbi8vIH4vLmNvbmZpZy9mbm94L2NvbmZpZy50b21sIGludG8gZXZlcnkgcHJvamVjdCBjb25maWcg4oCUIGEgcGxhaW4gcmVlbmNyeXB0IHdvdWxkIHJld3JpdGUgdGhlXG4vLyB1c2VyJ3MgZ2xvYmFsIHNlY3JldHMgdG9vLiBEZWNyeXB0aW9uIHRoZXJlZm9yZSBuZWVkcyB0aGUgcGVyc29uYWwgaWRlbnRpdHkgcGFzc2VkIGV4cGxpY2l0bHlcbi8vIHZpYSBGTk9YX0FHRV9LRVk7IEZOT1hfUFJPRklMRSBpcyBzdHJpcHBlZCBzbyBpdCBjYW5ub3QgcmVkaXJlY3QgdGhlIGJhc2UgKG5vIC1QKSBydW4uXG5mdW5jdGlvbiByZWVuY3J5cHRGbm94U2VjcmV0cyhkaXJQYXRoOiBzdHJpbmcsIHJvb3REaXJQYXRoOiBzdHJpbmcsIHByb2ZpbGVOYW1lczogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgLy8gVGhlIGlkZW50aXR5IGlzIG9wdGlvbmFsOiBhIHBsYWludGV4dC1vbmx5IGNvbmZpZyBoYXMgbm90aGluZyB0byBkZWNyeXB0IGFuZCBmbm94IHN1Y2NlZWRzXG4gIC8vIHdpdGhvdXQgb25lLCB3aGlsZSBleGlzdGluZyBjaXBoZXJ0ZXh0cyBtYWtlIGZub3ggZmFpbCBsb3VkbHkgb24gaXRzIG93bi5cbiAgY29uc3QgaWRlbnRpdHkgPSByZWFkUGVyc29uYWxBZ2VTZWNyZXRLZXkoKSA/PyBwcm9jZXNzLmVudi5GTk9YX0FHRV9LRVk7XG4gIGNvbnN0IGZub3hDb21tYW5kID0gcmVzb2x2ZUZub3hDb21tYW5kKGRpclBhdGgpO1xuICBjb25zdCBpc29sYXRlZEhvbWVEaXJQYXRoID0gZnMubWtkdGVtcFN5bmMocGF0aC5qb2luKG9zLnRtcGRpcigpLCAnd2JmeS1mbm94LWhvbWUtJykpO1xuICB0cnkge1xuICAgIC8vIEhpZGUgdGhlIGxvY2FsIG92ZXJyaWRlcyBvZiBFVkVSWSBkaXJlY3RvcnkgZm5veCBtZXJnZXMgaGllcmFyY2hpY2FsbHkgKGZyb20gdGhlIGNvbW1hbmRcbiAgICAvLyBkaXJlY3RvcnkgdXAgdG8gdGhlIHJlcG9zaXRvcnkgcm9vdCk6IGFuIGFuY2VzdG9yJ3MgZm5veC5sb2NhbC50b21sIHdvdWxkIG90aGVyd2lzZSBzaGFkb3dcbiAgICAvLyBjb21taXR0ZWQgc2VjcmV0cyBvciBpdHNlbGYgZ2V0IHJld3JpdHRlbiBieSB0aGUgcmUtZW5jcnlwdGlvbi5cbiAgICByZXR1cm4gd2l0aEZub3hMb2NhbHNIaWRkZW4ocm9vdERpclBhdGgsIGxpc3RBbmNlc3RvckRpclBhdGhzKGRpclBhdGgsIHJvb3REaXJQYXRoKSwgKCkgPT4ge1xuICAgICAgY29uc3QgZW52ID0ge1xuICAgICAgICAuLi5PYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMocHJvY2Vzcy5lbnYpLmZpbHRlcigoW2tleV0pID0+ICFrZXkuc3RhcnRzV2l0aCgnRk5PWF8nKSkpLFxuICAgICAgICAuLi4oaWRlbnRpdHkgPyB7IEZOT1hfQUdFX0tFWTogaWRlbnRpdHkgfSA6IHt9KSxcbiAgICAgICAgSE9NRTogaXNvbGF0ZWRIb21lRGlyUGF0aCxcbiAgICAgICAgWERHX0NPTkZJR19IT01FOiBpc29sYXRlZEhvbWVEaXJQYXRoLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHByb2ZpbGVBcmdzTGlzdCA9IFtbXSwgLi4ucHJvZmlsZU5hbWVzLm1hcCgobmFtZSkgPT4gWyctLW5vLWRlZmF1bHRzJywgYC0tcHJvZmlsZT0ke25hbWV9YF0pXTtcbiAgICAgIGZvciAoY29uc3QgcHJvZmlsZUFyZ3Mgb2YgcHJvZmlsZUFyZ3NMaXN0KSB7XG4gICAgICAgIGNvbnN0IGFyZ3MgPSBbJ3JlZW5jcnlwdCcsICctLWZvcmNlJywgJy0tbm8tZGFlbW9uJywgJy0tcHJvdmlkZXInLCAnYWdlJywgLi4ucHJvZmlsZUFyZ3NdO1xuICAgICAgICBjb25zb2xlLmxvZyhgJCAke2Zub3hDb21tYW5kfSAke2FyZ3Muam9pbignICcpfSBhdCAke2RpclBhdGh9YCk7XG4gICAgICAgIGNvbnN0IHByb2MgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhmbm94Q29tbWFuZCwgYXJncywge1xuICAgICAgICAgIGN3ZDogZGlyUGF0aCxcbiAgICAgICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgICAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgICAgICAgZW52LFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKChwcm9jLnN0YXR1cyA/PyAxKSAhPT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG4gIH0gZmluYWxseSB7XG4gICAgZnMucm1TeW5jKGlzb2xhdGVkSG9tZURpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgfVxufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBhY3R1YWwgZm5veCBiaW5hcnkuIGBmbm94YCBvbiBQQVRIIGlzIG9mdGVuIGEgbWlzZSBzaGltLCBhbmQgbWlzZSByZWZ1c2VzIHRvIHJ1blxuICogb25jZSBIT01FL1hER19DT05GSUdfSE9NRSBwb2ludCBhdCB0aGUgaXNvbGF0ZWQgZGlyZWN0b3J5IChpdHMgdHJ1c3Qgc3RhdGUgZGlzYXBwZWFycyksIHNvIHRoZVxuICogaXNvbGF0ZWQgc3Bhd25zIG5lZWQgdGhlIHNoaW0gcmVzb2x2ZWQgdG8gdGhlIHJlYWwgZXhlY3V0YWJsZSBiZWZvcmVoYW5kLlxuICovXG5mdW5jdGlvbiByZXNvbHZlRm5veENvbW1hbmQoZGlyUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcHJvYyA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKCdtaXNlJywgWyd3aGljaCcsICdmbm94J10sIHsgY3dkOiBkaXJQYXRoLCBlbmNvZGluZzogJ3V0ZjgnLCBzdGRpbzogJ3BpcGUnIH0pO1xuICBjb25zdCByZXNvbHZlZCA9IHByb2Muc3RhdHVzID09PSAwID8gcHJvYy5zdGRvdXQudHJpbSgpIDogJyc7XG4gIHJldHVybiByZXNvbHZlZCB8fCAnZm5veCc7XG59XG5cbi8vIFRoZSBwZXJzb25hbCBpZGVudGl0eSBmaWxlIGlzIG1hY2hpbmUtZ2xvYmFsLCBzbyBpdCBpcyByZWFkIG9uY2UgcGVyIHByb2Nlc3MuXG5sZXQgaGFzUmVhZFBlcnNvbmFsQWdlU2VjcmV0S2V5ID0gZmFsc2U7XG5sZXQgY2FjaGVkUGVyc29uYWxBZ2VTZWNyZXRLZXk6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuZnVuY3Rpb24gcmVhZFBlcnNvbmFsQWdlU2VjcmV0S2V5KCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChoYXNSZWFkUGVyc29uYWxBZ2VTZWNyZXRLZXkpIHJldHVybiBjYWNoZWRQZXJzb25hbEFnZVNlY3JldEtleTtcbiAgaGFzUmVhZFBlcnNvbmFsQWdlU2VjcmV0S2V5ID0gdHJ1ZTtcbiAgdHJ5IHtcbiAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihvcy5ob21lZGlyKCksICcuY29uZmlnJywgJ2Zub3gnLCAnYWdlLnR4dCcpLCAndXRmOCcpO1xuICAgIGNhY2hlZFBlcnNvbmFsQWdlU2VjcmV0S2V5ID0gY29udGVudFxuICAgICAgLnNwbGl0KCdcXG4nKVxuICAgICAgLmZpbmQoKGxpbmUpID0+IGxpbmUudHJpbSgpLnN0YXJ0c1dpdGgoJ0FHRS1TRUNSRVQtS0VZLScpKVxuICAgICAgPy50cmltKCk7XG4gIH0gY2F0Y2gge1xuICAgIGNhY2hlZFBlcnNvbmFsQWdlU2VjcmV0S2V5ID0gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiBjYWNoZWRQZXJzb25hbEFnZVNlY3JldEtleTtcbn1cblxuLyoqXG4gKiBSdW5zIGEgZnVuY3Rpb24gd2hpbGUgdGhlIG1hY2hpbmUtbG9jYWwgZm5veC5sb2NhbC50b21sIGZpbGVzIG9mIHRoZSBnaXZlbiBkaXJlY3RvcmllcyBhcmVcbiAqIHRlbXBvcmFyaWx5IG1vdmVkIGFzaWRlOiBmbm94IGxvYWRzIHRoZW0gYXQgaGlnaGVyIHByaW9yaXR5IHRoYW4gdGhlIGNvbW1pdHRlZCBmbm94LnRvbWwsIHNvIGFcbiAqIGxvY2FsIG92ZXJyaWRlIHNoYWRvd2luZyBhIGNvbW1pdHRlZCBzZWNyZXQgd291bGQgbWFrZSBgZm5veCByZWVuY3J5cHRgIHNraXAgdGhhdCBzZWNyZXQuXG4gKi9cbmZ1bmN0aW9uIHdpdGhGbm94TG9jYWxzSGlkZGVuPFQ+KHJvb3REaXJQYXRoOiBzdHJpbmcsIGRpclBhdGhzOiBzdHJpbmdbXSwgZnVuYzogKCkgPT4gVCk6IFQge1xuICBjb25zdCBoaWRkZW5EaXJQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgdHJ5IHtcbiAgICBmb3IgKGNvbnN0IGRpclBhdGggb2YgZGlyUGF0aHMpIHtcbiAgICAgIHJlY292ZXJTdGFsZUZub3hMb2NhbEJhY2t1cChyb290RGlyUGF0aCwgZGlyUGF0aCk7XG4gICAgICBjb25zdCBsb2NhbFBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2Zub3gubG9jYWwudG9tbCcpO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMobG9jYWxQYXRoKSkge1xuICAgICAgICBjb25zdCBiYWNrdXBQYXRoID0gZm5veExvY2FsQmFja3VwUGF0aChyb290RGlyUGF0aCwgZGlyUGF0aCk7XG4gICAgICAgIGVuc3VyZVNhZmVGbm94TG9jYWxCYWNrdXBEaXIocm9vdERpclBhdGgsIGJhY2t1cFBhdGgpO1xuICAgICAgICBmcy5yZW5hbWVTeW5jKGxvY2FsUGF0aCwgYmFja3VwUGF0aCk7XG4gICAgICAgIGhpZGRlbkRpclBhdGhzLnB1c2goZGlyUGF0aCk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IGZ1bmMoKTtcbiAgICAvLyBBIHJlc3RvcmF0aW9uIGNvbmZsaWN0IHRocm93cyBoZXJlIGFuZCB0aGVyZWJ5IGludmFsaWRhdGVzIHRoZSBzZWVtaW5nbHkgc3VjY2Vzc2Z1bCByZXN1bHQ6XG4gICAgLy8gYSByZWNyZWF0ZWQgb3ZlcnJpZGUgbWF5IGhhdmUgc2hhZG93ZWQgY29tbWl0dGVkIHNlY3JldHMgZHVyaW5nIHRoZSBmbm94IHJ1biwgc28gdGhlIG91dGVyXG4gICAgLy8gdHJhbnNhY3Rpb24gbXVzdCByZXN0b3JlIGV2ZXJ5IGNvbW1pdHRlZCBmbm94LnRvbWwgaW5zdGVhZCBvZiBjb21taXR0aW5nIHRoZSBtaWdyYXRpb24uXG4gICAgcmVzdG9yZUhpZGRlbkZub3hMb2NhbHMocm9vdERpclBhdGgsIGhpZGRlbkRpclBhdGhzKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vIFRoZSBvcmlnaW5hbCBmYWlsdXJlIG11c3Qgd2luOyBhIHJlc3RvcmF0aW9uIGNvbmZsaWN0IG9uIHRoaXMgcGF0aCBpcyBvbmx5IHJlcG9ydGVkIHNvIGl0XG4gICAgLy8gY2Fubm90IG1hc2sgdGhlIHJvb3QgY2F1c2UuXG4gICAgdHJ5IHtcbiAgICAgIHJlc3RvcmVIaWRkZW5Gbm94TG9jYWxzKHJvb3REaXJQYXRoLCBoaWRkZW5EaXJQYXRocyk7XG4gICAgfSBjYXRjaCAocmVzdG9yZUVycm9yKSB7XG4gICAgICBmYWlsRm5veFN5bmMoKHJlc3RvcmVFcnJvciBhcyBFcnJvciB8IHVuZGVmaW5lZCk/Lm1lc3NhZ2UgPz8gU3RyaW5nKHJlc3RvcmVFcnJvcikpO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG4vLyBNb3ZlcyB0aGUgaGlkZGVuIGZub3gubG9jYWwudG9tbCBmaWxlcyBiYWNrLCBjbGVhcmluZyB0aGUgZ2l2ZW4gbGlzdCBzbyBhIHNlY29uZCBjYWxsIGlzIGFcbi8vIG5vLW9wLiBOZXZlciBjbG9iYmVycyBhIGZub3gubG9jYWwudG9tbCByZWNyZWF0ZWQgKGUuZy4gYnkgYW4gZWRpdG9yKSB3aGlsZSBmbm94IHdhcyBydW5uaW5nOlxuLy8gdGhlIGJhY2t1cCBpcyBrZXB0IGFuZCByZXBvcnRlZCBmb3IgYSBtYW51YWwgbWVyZ2UuXG5mdW5jdGlvbiByZXN0b3JlSGlkZGVuRm5veExvY2Fscyhyb290RGlyUGF0aDogc3RyaW5nLCBoaWRkZW5EaXJQYXRoczogc3RyaW5nW10pOiB2b2lkIHtcbiAgY29uc3QgY29uZmxpY3RpbmdMb2NhbFBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGRpclBhdGggb2YgaGlkZGVuRGlyUGF0aHMuc3BsaWNlKDApKSB7XG4gICAgY29uc3QgbG9jYWxQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdmbm94LmxvY2FsLnRvbWwnKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhsb2NhbFBhdGgpKSB7XG4gICAgICBjb25mbGljdGluZ0xvY2FsUGF0aHMucHVzaChsb2NhbFBhdGgpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGZzLnJlbmFtZVN5bmMoZm5veExvY2FsQmFja3VwUGF0aChyb290RGlyUGF0aCwgZGlyUGF0aCksIGxvY2FsUGF0aCk7XG4gIH1cbiAgaWYgKGNvbmZsaWN0aW5nTG9jYWxQYXRocy5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFRoZSBmb2xsb3dpbmcgZm5veC5sb2NhbC50b21sIGZpbGVzIHdlcmUgcmVjcmVhdGVkIHdoaWxlIGZub3ggd2FzIHJ1bm5pbmcgKG9yaWdpbmFsIGZpbGVzIGFyZSBwcmVzZXJ2ZWQgdW5kZXIgJHtwYXRoLnJlc29sdmUocm9vdERpclBhdGgsICcudG1wJywgJ3diZnktZm5veC1sb2NhbC1iYWNrdXAnKX0g4oCUIG1lcmdlIHRoZW0gbWFudWFsbHkpOiAke2NvbmZsaWN0aW5nTG9jYWxQYXRocy5qb2luKCcsICcpfWBcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogUmVzdG9yZXMgYSBmbm94LmxvY2FsLnRvbWwgYmFja3VwIGxlZnQgYnkgYW4gaW50ZXJydXB0ZWQgZWFybGllciBydW4gc28gdGhlIHVzZXIncyBsb2NhbFxuICogb3ZlcnJpZGVzIGFyZSBuZXZlciBzaWxlbnRseSBsb3N0LlxuICovXG5mdW5jdGlvbiByZWNvdmVyU3RhbGVGbm94TG9jYWxCYWNrdXAocm9vdERpclBhdGg6IHN0cmluZywgZGlyUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGxvY2FsUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnZm5veC5sb2NhbC50b21sJyk7XG4gIGNvbnN0IGJhY2t1cFBhdGggPSBmbm94TG9jYWxCYWNrdXBQYXRoKHJvb3REaXJQYXRoLCBkaXJQYXRoKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGJhY2t1cFBhdGgpKSByZXR1cm47XG4gIGlmIChmcy5leGlzdHNTeW5jKGxvY2FsUGF0aCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEJvdGggJHtsb2NhbFBhdGh9IGFuZCBpdHMgYmFja3VwICR7YmFja3VwUGF0aH0gZXhpc3Q7IHJlc29sdmUgdGhlIGxlZnRvdmVyIGJhY2t1cCBtYW51YWxseS5gKTtcbiAgfVxuICBlbnN1cmVTYWZlRm5veExvY2FsQmFja3VwRGlyKHJvb3REaXJQYXRoLCBiYWNrdXBQYXRoKTtcbiAgZnMucmVuYW1lU3luYyhiYWNrdXBQYXRoLCBsb2NhbFBhdGgpO1xufVxuXG4vLyBDcmVhdGVzIHRoZSBiYWNrdXAgZGlyZWN0b3J5IGFuZCBwcm92ZXMgbm8gcGF0aCBjb21wb25lbnQgYmVsb3cgdGhlIHJlcG9zaXRvcnkgcm9vdCBpcyBhXG4vLyBzeW1saW5rOiBhIHJlcG9zaXRvcnktY29udHJvbGxlZCBzeW1saW5rIChlLmcuIGEgdHJhY2tlZCAudG1wL3diZnktZm5veC1sb2NhbC1iYWNrdXAgbGluaylcbi8vIGNvdWxkIG90aGVyd2lzZSBtb3ZlIHRoZSBwbGFpbnRleHQgbG9jYWwgc2VjcmV0cyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LCBvciByZXNvbHZlIHRoZSBiYWNrdXBcbi8vIGJhY2sgb250byB0aGUgc291cmNlIGZpbGUgYW5kIHR1cm4gdGhlIGhpZGUgcmVuYW1lIGludG8gYSBuby1vcC5cbmZ1bmN0aW9uIGVuc3VyZVNhZmVGbm94TG9jYWxCYWNrdXBEaXIocm9vdERpclBhdGg6IHN0cmluZywgYmFja3VwUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGJhY2t1cERpclBhdGggPSBwYXRoLmRpcm5hbWUoYmFja3VwUGF0aCk7XG4gIGZzLm1rZGlyU3luYyhiYWNrdXBEaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgY29uc3QgZXhwZWN0ZWRSZWFsUGF0aCA9IHBhdGguam9pbihmcy5yZWFscGF0aFN5bmMocm9vdERpclBhdGgpLCBwYXRoLnJlbGF0aXZlKHJvb3REaXJQYXRoLCBiYWNrdXBEaXJQYXRoKSk7XG4gIGlmIChmcy5yZWFscGF0aFN5bmMoYmFja3VwRGlyUGF0aCkgIT09IGV4cGVjdGVkUmVhbFBhdGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7YmFja3VwRGlyUGF0aH0gcmVzb2x2ZXMgdGhyb3VnaCBhIHN5bWxpbms7IHJlbW92ZSB0aGUgc3ltbGlua2VkIGNvbXBvbmVudC5gKTtcbiAgfVxufVxuXG4vLyBUaGUgYmFja3VwIGxpdmVzIHVuZGVyIHRoZSBnaXRpZ25vcmVkIC50bXAgc28gYSBoaWRkZW4gZm5veC5sb2NhbC50b21sIGNhbiBuZXZlciBiZWNvbWVcbi8vIHN0YWdlYWJsZSAoYSBzaWJsaW5nIHJlbmFtZSBsaWtlIGZub3gubG9jYWwudG9tbC53YmZ5LWJhayB3b3VsZCBubyBsb25nZXIgbWF0Y2ggdGhlIGRvY3VtZW50ZWRcbi8vIGBmbm94LmxvY2FsLnRvbWxgIGlnbm9yZSBlbnRyeSBhbmQgY291bGQgYmUgY29tbWl0dGVkIGJ5IGBnaXQgYWRkIC1BYCkuXG5mdW5jdGlvbiBmbm94TG9jYWxCYWNrdXBQYXRoKHJvb3REaXJQYXRoOiBzdHJpbmcsIGRpclBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBwYXRoLnJlc29sdmUoXG4gICAgcm9vdERpclBhdGgsXG4gICAgJy50bXAnLFxuICAgICd3YmZ5LWZub3gtbG9jYWwtYmFja3VwJyxcbiAgICBwYXRoLnJlbGF0aXZlKHJvb3REaXJQYXRoLCBkaXJQYXRoKSxcbiAgICAnZm5veC5sb2NhbC50b21sJ1xuICApO1xufVxuXG5mdW5jdGlvbiB3cml0ZU1pZ3JhdGlvbk1hcmtlcigpOiB2b2lkIHtcbiAgaWYgKCFtaWdyYXRpb25NYXJrZXJQYXRoIHx8IG1pZ3JhdGlvbk1hcmtlck93bmVkKSByZXR1cm47XG4gIGNvbnN0IHRtcERpclBhdGggPSBwYXRoLmRpcm5hbWUobWlncmF0aW9uTWFya2VyUGF0aCk7XG4gIGZzLm1rZGlyU3luYyh0bXBEaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgLy8gUmVmdXNlIHRvIHdyaXRlIHRocm91Z2ggc3ltbGlua3M6IGEgcmVwb3NpdG9yeS1jb250cm9sbGVkIC50bXAgc3ltbGluayBjb3VsZCBvdGhlcndpc2VcbiAgLy8gcmVkaXJlY3QgdGhlIG1hcmtlciB3cml0ZSBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LiBUaGUgYHd4YCBmbGFnIG1ha2VzIHRoZSBvcGVuIGl0c2VsZiBmYWlsXG4gIC8vIG9uIGFueSBwcmUtZXhpc3RpbmcgcGF0aCwgaW5jbHVkaW5nIGEgZGFuZ2xpbmcgc3ltbGluayDigJQgd2hpY2ggYWxzbyBhY3F1aXJlcyB0aGUgbWFya2VyXG4gIC8vIGF0b21pY2FsbHksIHNvIGEgY29uY3VycmVudCB3YmZ5IHJ1biBjYW5ub3Qgc3RhcnQgYSBzZWNvbmQgbWlncmF0aW9uLlxuICBpZiAoZnMubHN0YXRTeW5jKHRtcERpclBhdGgpLmlzU3ltYm9saWNMaW5rKCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dG1wRGlyUGF0aH0gaXMgYSBzeW1saW5rOyByZXBsYWNlIGl0IHdpdGggYSByZWd1bGFyIGRpcmVjdG9yeS5gKTtcbiAgfVxuICB0cnkge1xuICAgIGZzLndyaXRlRmlsZVN5bmMoXG4gICAgICBtaWdyYXRpb25NYXJrZXJQYXRoLFxuICAgICAgJ3diZnkgZm5veCBtaWdyYXRpb24gaW4gcHJvZ3Jlc3M7IGEgbGVmdG92ZXIgbWFya2VyIGJsb2NrcyBuZXcgbWlncmF0aW9uc1xcbicsXG4gICAgICB7XG4gICAgICAgIGZsYWc6ICd3eCcsXG4gICAgICB9XG4gICAgKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEFub3RoZXIgd2JmeSBwcm9jZXNzIGFwcGVhcnMgdG8gYmUgbWlncmF0aW5nICgke21pZ3JhdGlvbk1hcmtlclBhdGh9IGV4aXN0cyk6ICR7ZXJyb3J9YCk7XG4gIH1cbiAgbWlncmF0aW9uTWFya2VyT3duZWQgPSB0cnVlO1xufVxuXG4vLyBPbmx5IHRoZSBydW4gdGhhdCBhY3F1aXJlZCB0aGUgbWFya2VyIG1heSByZW1vdmUgaXQ6IGRlbGV0aW5nIGEgZm9yZWlnbiBtYXJrZXIgd291bGQgZGlzYWJsZVxuLy8gaW50ZXJydXB0ZWQtbWlncmF0aW9uIGRldGVjdGlvbiBmb3IgYSBjb25jdXJyZW50bHkgcnVubmluZyB3YmZ5LlxuZnVuY3Rpb24gcmVtb3ZlT3duZWRNaWdyYXRpb25NYXJrZXIoKTogdm9pZCB7XG4gIGlmICghbWlncmF0aW9uTWFya2VyT3duZWQgfHwgIW1pZ3JhdGlvbk1hcmtlclBhdGgpIHJldHVybjtcbiAgZnMucm1TeW5jKG1pZ3JhdGlvbk1hcmtlclBhdGgsIHsgZm9yY2U6IHRydWUgfSk7XG4gIG1pZ3JhdGlvbk1hcmtlck93bmVkID0gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHJlc3RvcmVTbmFwc2hvdHMoc25hcHNob3RzOiBNYXA8c3RyaW5nLCBzdHJpbmc+KTogYm9vbGVhbiB7XG4gIGxldCBzdWNjZWVkZWQgPSB0cnVlO1xuICBmb3IgKGNvbnN0IFtmaWxlUGF0aCwgY29udGVudF0gb2Ygc25hcHNob3RzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMoZmlsZVBhdGgsIGNvbnRlbnQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBmYWlsRm5veFN5bmMoYEZhaWxlZCB0byByZXN0b3JlICR7ZmlsZVBhdGh9IGFmdGVyIGEgZmFpbGVkIG1pZ3JhdGlvbjogJHtlcnJvcn1gKTtcbiAgICAgIHN1Y2NlZWRlZCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc3VjY2VlZGVkO1xufVxuXG5mdW5jdGlvbiBmYWlsRm5veFN5bmMobWVzc2FnZTogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7XG4gIHByb2Nlc3MuZXhpdENvZGUgPSAxO1xuICBmbm94U3luY0ZhaWxlZCA9IHRydWU7XG59XG5cbi8vIFJldHVybnMgYSBkZXNjcmlwdGlvbiBvZiBhbiB1bnN1cHBvcnRlZCBmbm94LmxvY2FsLnRvbWwgaW4gdGhlIGRpcmVjdG9yeSwgb3IgdW5kZWZpbmVkLiBMb2NhbFxuLy8gb3ZlcnJpZGVzIG1heSBvbmx5IGhvbGQgbWFjaGluZS1sb2NhbCBzZWNyZXQgdmFsdWVzOyBpbXBvcnRzIG9yIHByb3ZpZGVyIChyZSlkZWZpbml0aW9ucyB3b3VsZFxuLy8gc2lsZW50bHkgY2hhbmdlIHdoaWNoIHJlY2lwaWVudCBzZXQgZ292ZXJucyByZS1lbmNyeXB0aW9uLlxuZnVuY3Rpb24gZmluZEZub3hMb2NhbFRvbWxJc3N1ZShkaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBsb2NhbFRvbWxQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdmbm94LmxvY2FsLnRvbWwnKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGxvY2FsVG9tbFBhdGgpKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBsb2NhbFNldHRpbmdzID0gQnVuLlRPTUwucGFyc2UoZnMucmVhZEZpbGVTeW5jKGxvY2FsVG9tbFBhdGgsICd1dGY4JykpIGFzIEZub3hUb21sO1xuICBjb25zdCBkZWZpbmVzUHJvdmlkZXJzID1cbiAgICBsb2NhbFNldHRpbmdzLmltcG9ydCAhPT0gdW5kZWZpbmVkIHx8XG4gICAgbG9jYWxTZXR0aW5ncy5wcm92aWRlcnMgIT09IHVuZGVmaW5lZCB8fFxuICAgIE9iamVjdC52YWx1ZXMobG9jYWxTZXR0aW5ncy5wcm9maWxlcyA/PyB7fSkuc29tZSgocHJvZmlsZSkgPT4gcHJvZmlsZT8ucHJvdmlkZXJzICE9PSB1bmRlZmluZWQpO1xuICByZXR1cm4gZGVmaW5lc1Byb3ZpZGVycyA/IGAke2xvY2FsVG9tbFBhdGh9IGRlZmluZXMgaW1wb3J0cywgcHJvdmlkZXJzLCBvciBwcm9maWxlIHByb3ZpZGVyc2AgOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogTGlzdHMgZXZlcnkgZGlyZWN0b3J5IGNvbnRhaW5pbmcgYSBjb21taXR0ZWQgKG9yIGNvbW1pdHRhYmxlKSBmbm94LnRvbWwgYW1vbmcgdGhlIGdpdmVuXG4gKiBnaXQtZGlzY292ZXJlZCBjb25maWcgcGF0aHMgKHNlZSBsaXN0Rm5veExpa2VGaWxlUGF0aHM6IGdpdC1iYXNlZCBkaXNjb3ZlcnkgZXhjbHVkZXMgZ2l0aWdub3JlZFxuICogdHJlZXMgc3VjaCBhcyBub2RlX21vZHVsZXMgd2l0aG91dCBleGNsdWRpbmcgbGVnaXRpbWF0ZSBwYWNrYWdlcyBuYW1lZCBsaWtlIGJ1aWxkIG91dHB1dHMpLlxuICovXG5mdW5jdGlvbiBsaXN0Rm5veFRvbWxEaXJQYXRocyhmbm94TGlrZUZpbGVQYXRoczogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gIHJldHVybiBbXG4gICAgLi4ubmV3IFNldChcbiAgICAgIGZub3hMaWtlRmlsZVBhdGhzXG4gICAgICAgIC5maWx0ZXIoKGZpbGVQYXRoKSA9PiBwYXRoLmJhc2VuYW1lKGZpbGVQYXRoKSA9PT0gJ2Zub3gudG9tbCcpXG4gICAgICAgIC5tYXAoKGZpbGVQYXRoKSA9PiBwYXRoLmRpcm5hbWUoZmlsZVBhdGgpKVxuICAgICksXG4gIF0udG9Tb3J0ZWQoKTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGEgZm5veCBjb25maWcgZGVjbGFyZXMgaXRzIG93biBgW3Byb3ZpZGVycy5hZ2VdYCwgaS5lLiBwYXJ0aWNpcGF0ZXMgaW4gYWdlIGVuY3J5cHRpb24uXG4gKiBBIGNvbmZpZyB3aXRob3V0IG9uZSBlaXRoZXIgaW5oZXJpdHMgYSBtYW5hZ2VkIHJvb3QncyBwcm92aWRlciAoaGFuZGxlZCBieSB0aGUgcm9vdC1leGlzdHMgcGF0aClcbiAqIG9yLCB3aGVuIG5vIHJvb3QgZXhpc3RzLCB1c2VzIG5vIGFnZSBlbmNyeXB0aW9uIGF0IGFsbCDigJQgc28gaXQgbmVlZHMgbm8gcmVjaXBpZW50IHN5bmNocm9uaXphdGlvblxuICogYW5kIG93bnMgbm8gRk5PWF9BR0VfS0VZLlxuICovXG5mdW5jdGlvbiBkZWNsYXJlc0Zub3hBZ2VQcm92aWRlcihmaWxlUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGxldCBjb250ZW50OiBzdHJpbmc7XG4gIHRyeSB7XG4gICAgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gRmFpbCBjbG9zZWQ6IGFuIHVucmVhZGFibGUgY29uZmlnIG1pZ2h0IGRlY2xhcmUgYW4gYWdlIHByb3ZpZGVyLlxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHRyeSB7XG4gICAgcmV0dXJuIEJvb2xlYW4oKEJ1bi5UT01MLnBhcnNlKGNvbnRlbnQpIGFzIEZub3hUb21sKS5wcm92aWRlcnM/LmFnZSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIEZhaWwgY2xvc2VkOiBhbiB1bnBhcnNhYmxlIGNvbmZpZyBtaWdodCBkZWNsYXJlIGFuIGFnZSBwcm92aWRlci5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG4vKipcbiAqIFdoZXRoZXIgYSBmbm94IGNvbmZpZyBwYXRoIGxpZXMgaW5zaWRlIGEgdGVzdC1maXh0dXJlIHRyZWUgKHRlc3QvZml4dHVyZXMsIHRlc3QtZml4dHVyZXMsXG4gKiBfX3Rlc3RzX18pOiBmaXh0dXJlIGNvbmZpZ3MgYXJlIHRlc3QgSU5QVVRTLCBub3QgcmVwb3NpdG9yeSBjb25maWd1cmF0aW9uLiBmbm94IG5ldmVyIGxvYWRzXG4gKiB0aGVtIGZvciByZWFsIGNvbW1hbmRzIChoaWVyYXJjaGljYWwgbG9hZGluZyBvbmx5IHdhbGtzIGN3ZCBhbmNlc3RvcnMpLCByZWNpcGllbnRcbiAqIHN5bmNocm9uaXphdGlvbiBtdXN0IG5vdCByZXdyaXRlIG9yIHJlLWVuY3J5cHQgdGhlbSAoc2hhcmVkLWxpYi1ub2RlJ3MgdW5kZWNyeXB0YWJsZSBmaXh0dXJlXG4gKiBleGlzdHMgcHJlY2lzZWx5IHRvIHN0YXkgdW5kZWNyeXB0YWJsZSksIGFuZCBhIGZpeHR1cmUgbXVzdCBub3QgZmFpbCB0aGUgc3RyYXktbmVzdGVkLWNvbmZpZ1xuICogY2hlY2sgaW4gcmVwb3NpdG9yaWVzIHdpdGhvdXQgYSByb290IGZub3gudG9tbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVGVzdEZpeHR1cmVGbm94UGF0aChmaWxlUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vIGBmaXh0dXJlc2AgY291bnRzIG9ubHkgZGlyZWN0bHkgdW5kZXIgYSB0ZXN0IGRpcmVjdG9yeTogd2JmeSBzdXBwb3J0cyBhcmJpdHJhcnkgd29ya3NwYWNlcyxcbiAgLy8gc28gYSBsZWdpdGltYXRlIGBwYWNrYWdlcy9maXh0dXJlcy9gIHdvcmtzcGFjZSBtdXN0IHN0YXkgbWFuYWdlZCBhbmQgdmVyaWZpZWQuXG4gIGNvbnN0IHNlZ21lbnRzID0gZmlsZVBhdGguc3BsaXQoJy8nKTtcbiAgcmV0dXJuIHNlZ21lbnRzLnNvbWUoXG4gICAgKHNlZ21lbnQsIGluZGV4KSA9PlxuICAgICAgc2VnbWVudCA9PT0gJ3Rlc3QtZml4dHVyZXMnIHx8XG4gICAgICBzZWdtZW50ID09PSAnX190ZXN0c19fJyB8fFxuICAgICAgKHNlZ21lbnQgPT09ICdmaXh0dXJlcycgJiYgKHNlZ21lbnRzW2luZGV4IC0gMV0gPT09ICd0ZXN0JyB8fCBzZWdtZW50c1tpbmRleCAtIDFdID09PSAndGVzdHMnKSlcbiAgKTtcbn1cblxuZnVuY3Rpb24gbGlzdEZub3hMaWtlRmlsZVBhdGhzKHJvb3REaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIC8vIC16IHByaW50cyBOVUwtZGVsaW1pdGVkIHZlcmJhdGltIHBhdGhzOyB3aXRob3V0IGl0LCBjb3JlLnF1b3RlUGF0aCBDLXF1b3RlcyBub24tQVNDSUkgcGF0aHNcbiAgLy8gKGUuZy4gXCJcXDM0NlxcMjI3XFwyNDUuLi5cIiksIHdoaWNoIHdvdWxkIG1ha2UgdGhlIGJhc2VuYW1lIGZpbHRlciBzaWxlbnRseSBza2lwIHRob3NlIGNvbmZpZ3MuXG4gIGNvbnN0IHByb2MgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhcbiAgICAnZ2l0JyxcbiAgICBbJ2xzLWZpbGVzJywgJy16JywgJy0tY2FjaGVkJywgJy0tb3RoZXJzJywgJy0tZXhjbHVkZS1zdGFuZGFyZCcsICctLScsICcqZm5veCoudG9tbCddLFxuICAgIHsgY3dkOiByb290RGlyUGF0aCwgZW5jb2Rpbmc6ICd1dGY4Jywgc3RkaW86ICdwaXBlJyB9XG4gICk7XG4gIC8vIEZhaWwgY2xvc2VkOiB0cmVhdGluZyBhIGdpdCBmYWlsdXJlIGFzIFwibm8gZm5veCBjb25maWdzXCIgd291bGQgc2tpcCBzeW5jaHJvbml6YXRpb24gYW5kIGxldFxuICAvLyBzZXR1cFNlY3JldHMgdXBsb2FkIGEga2V5IHRoYXQgd2FzIG5ldmVyIHZlcmlmaWVkIGFnYWluc3QgdGhlIHJlcG9zaXRvcnkncyBjaXBoZXJ0ZXh0cy5cbiAgaWYgKHByb2Muc3RhdHVzICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBnaXQgbHMtZmlsZXMgZmFpbGVkIGluICR7cm9vdERpclBhdGh9OiAkeyhwcm9jLnN0ZGVyciB8fCBwcm9jLmVycm9yPy5tZXNzYWdlIHx8ICcnKS50cmltKCl9YCk7XG4gIH1cbiAgcmV0dXJuIHByb2Muc3Rkb3V0XG4gICAgLnNwbGl0KCdcXDAnKVxuICAgIC5maWx0ZXIoKGxpbmUpID0+IC9eXFwuP2Zub3goXFwuLispP1xcLnRvbWwkL3UudGVzdChwYXRoLmJhc2VuYW1lKGxpbmUpKSAmJiAhaXNUZXN0Rml4dHVyZUZub3hQYXRoKGxpbmUpKVxuICAgIC5tYXAoKGxpbmUpID0+IHBhdGgucmVzb2x2ZShyb290RGlyUGF0aCwgbGluZSkpO1xufVxuXG5mdW5jdGlvbiBsaXN0Rm5veExpa2VGaWxlTmFtZXMoZGlyUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICB0cnkge1xuICAgIHJldHVybiBmc1xuICAgICAgLnJlYWRkaXJTeW5jKGRpclBhdGgpXG4gICAgICAuZmlsdGVyKChuYW1lKSA9PiAvXlxcLj9mbm94KFxcLi4rKT9cXC50b21sJC91LnRlc3QobmFtZSkpXG4gICAgICAudG9Tb3J0ZWQoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoKGVycm9yIGFzIHsgY29kZT86IHN0cmluZyB9IHwgdW5kZWZpbmVkKT8uY29kZSA9PT0gJ0VOT0VOVCcpIHJldHVybiBbXTtcbiAgICAvLyBGYWlsIGNsb3NlZDogZm5veCBjYW4gc3RpbGwgbG9hZCBhIGNvbmZpZyBmcm9tIGEgZGlyZWN0b3J5IHRoaXMgcHJvY2VzcyBjYW5ub3QgZW51bWVyYXRlXG4gICAgLy8gKGUuZy4gZXhlY3V0ZS1vbmx5IHBlcm1pc3Npb24pLCBzbyBhbiBlbnVtZXJhdGlvbiBmYWlsdXJlIG11c3Qgbm90IHJlYWQgYXMgXCJubyBjb25maWdzXCIuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgaW5zcGVjdCAke2RpclBhdGh9IGZvciBmbm94IGNvbmZpZ3M6ICR7ZXJyb3J9YCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbGlzdEFuY2VzdG9yRGlyUGF0aHMoZGlyUGF0aDogc3RyaW5nLCByb290RGlyUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBkaXJQYXRocyA9IFtkaXJQYXRoXTtcbiAgd2hpbGUgKGRpclBhdGhzLmF0KC0xKSAhPT0gcm9vdERpclBhdGgpIHtcbiAgICBjb25zdCBwYXJlbnQgPSBwYXRoLmRpcm5hbWUoZGlyUGF0aHMuYXQoLTEpID8/ICcnKTtcbiAgICBpZiAocGFyZW50ID09PSBkaXJQYXRocy5hdCgtMSkpIGJyZWFrO1xuICAgIGRpclBhdGhzLnB1c2gocGFyZW50KTtcbiAgfVxuICByZXR1cm4gZGlyUGF0aHM7XG59XG4iLCJpbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuZXhwb3J0IGZ1bmN0aW9uIG92ZXJ3cml0ZU1lcmdlPFQ+KGRlc3RpbmF0aW9uQXJyYXk6IFRbXSwgc291cmNlQXJyYXk6IFRbXSk6IFRbXSB7XG4gIHJldHVybiBzb3VyY2VBcnJheTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbWJpbmVNZXJnZSh0YXJnZXQ6IHVua25vd25bXSwgc291cmNlOiB1bmtub3duW10sIG9wdGlvbnM6IG1lcmdlLkFycmF5TWVyZ2VPcHRpb25zKTogdW5rbm93bltdIHtcbiAgY29uc3QgZGVzdGluYXRpb24gPSBbLi4udGFyZ2V0XTtcblxuICBmb3IgKGNvbnN0IFtpbmRleCwgaXRlbV0gb2Ygc291cmNlLmVudHJpZXMoKSkge1xuICAgIGlmIChkZXN0aW5hdGlvbltpbmRleF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgZGVzdGluYXRpb25baW5kZXhdID0gY2xvbmVVbmxlc3NPdGhlcndpc2VTcGVjaWZpZWQoaXRlbSwgb3B0aW9ucyk7XG4gICAgfSBlbHNlIGlmIChpc01lcmdlYWJsZU9iamVjdCh0YXJnZXRbaW5kZXhdLCBvcHRpb25zKSAmJiBpc01lcmdlYWJsZU9iamVjdChpdGVtLCBvcHRpb25zKSkge1xuICAgICAgZGVzdGluYXRpb25baW5kZXhdID0gbWVyZ2UodGFyZ2V0W2luZGV4XSwgaXRlbSwgb3B0aW9ucyk7XG4gICAgfSBlbHNlIGlmICghdGFyZ2V0LmluY2x1ZGVzKGl0ZW0pKSB7XG4gICAgICBkZXN0aW5hdGlvbi5wdXNoKGl0ZW0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGVzdGluYXRpb247XG59XG5cbmZ1bmN0aW9uIGNsb25lVW5sZXNzT3RoZXJ3aXNlU3BlY2lmaWVkKHZhbHVlOiB1bmtub3duLCBvcHRpb25zOiBtZXJnZS5BcnJheU1lcmdlT3B0aW9ucyk6IHVua25vd24ge1xuICByZXR1cm4gaXNNZXJnZWFibGVPYmplY3QodmFsdWUsIG9wdGlvbnMpID8gb3B0aW9ucy5jbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZCh2YWx1ZSwgb3B0aW9ucykgOiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gaXNNZXJnZWFibGVPYmplY3QodmFsdWU6IHVua25vd24sIG9wdGlvbnM6IG1lcmdlLkFycmF5TWVyZ2VPcHRpb25zKTogdmFsdWUgaXMgb2JqZWN0IHtcbiAgcmV0dXJuICEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiBvcHRpb25zLmlzTWVyZ2VhYmxlT2JqZWN0KHZhbHVlKTtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBtb3ZlVG9Cb3R0b208VE9iaiBleHRlbmRzIFJlY29yZDxUS2V5LCB1bmtub3duPiwgVEtleSBleHRlbmRzIHN0cmluZyB8IG51bWJlciB8IHN5bWJvbD4oXG4gIG9iajogVE9iaixcbiAga2V5OiBUS2V5XG4pOiBUT2JqIHtcbiAgY29uc3QgdmFsdWUgPSBvYmpba2V5XTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZVxuICBkZWxldGUgb2JqW2tleV07XG4gIChvYmogYXMgUmVjb3JkPFRLZXksIHVua25vd24+KVtrZXldID0gdmFsdWU7XG4gIHJldHVybiBvYmo7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzb3J0S2V5czxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KG9iajogVCk6IFQge1xuICBjb25zdCBrZXlBbmRWYWx1ZXMgPSBPYmplY3QuZW50cmllcyhvYmopLnRvU29ydGVkKChba2V5MV0sIFtrZXkyXSkgPT4ga2V5MS5sb2NhbGVDb21wYXJlKGtleTIpKTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2Yga2V5QW5kVmFsdWVzKSB7XG4gICAgLy8gcGFja2FnZS5qc29uLXN0eWxlIGtleXMgYXJlIG5vbi1hcnJheS1pbmRleCBrZXlzLCBzbyBKU09OLnN0cmluZ2lmeSBwcmVzZXJ2ZXMgdGhpcyBpbnNlcnRpb24gb3JkZXIuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZVxuICAgIGRlbGV0ZSBvYmpba2V5XTtcbiAgICAob2JqIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldID0gdmFsdWU7XG5cbiAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHNvcnRLZXlzKHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG9iajtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7XG4gIGdldE1lYW5pbmdmdWxEZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zLFxuICBnZXRTZWVkZWRCYXNlbGluZUdsb2IsXG4gIGhhc0ltcGxpY2l0V29ya3NwYWNlQmFzZWxpbmUsXG4gIGlzSW5SZXBvc2l0b3J5V29ya3NwYWNlUGF0dGVybixcbiAgbm9ybWFsaXplV29ya3NwYWNlUGF0dGVybkJvZHksXG4gIHJlc29sdmVXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzLFxufSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuLy8gVGhlIEJ1bi1leGFjdCByZXNvbHV0aW9uIHByaW1pdGl2ZXMgbGl2ZSBpbiBAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlIChzcmMvYnVuV29ya3NwYWNlcy50cylcbi8vIHNvIHdiJ3MgcmVsZWFzZSBjb2RlIHNoYXJlcyB0aGVtOyByZS1leHBvcnQgdGhlIG9uZXMgd2JmeSBtb2R1bGVzIGFuZCB0ZXN0cyBjb25zdW1lLlxuZXhwb3J0IHtcbiAgZ2V0RGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyxcbiAgZ2V0TWVhbmluZ2Z1bERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMsXG4gIGhhc0ltcGxpY2l0V29ya3NwYWNlQmFzZWxpbmUsXG59IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcblxuLyoqIFRoZSBzdWJzZXQgb2YgUGFja2FnZUNvbmZpZyB0aGF0IHdvcmtzcGFjZSBkaXNjb3ZlcnkgbmVlZHMsIHNvIGl0IGNhbiBydW4gYmVmb3JlIGNvbmZpZ3MgZXhpc3QuICovXG5leHBvcnQgdHlwZSBXb3Jrc3BhY2VSb290TGlrZSA9IFBpY2s8UGFja2FnZUNvbmZpZywgJ2RpclBhdGgnIHwgJ2RvZXNDb250YWluU3ViUGFja2FnZUpzb25zJyB8ICdwYWNrYWdlSnNvbic+O1xuXG4vKipcbiAqIEV2ZXJ5IGRlY2xhcmVkIHdvcmtzcGFjZSBkaXJlY3RvcnkgKGFic29sdXRlLCBkZWR1cGxpY2F0ZWQpIG9mIHRoZSBtb25vcmVwbyByb290LCBjb3ZlcmluZ1xuICogbm9uLXBhY2thZ2VzLyogbGF5b3V0cyBzdWNoIGFzIGFwcHMvKi4gVW5jYWNoZWQgYmVjYXVzZSBpbmRleC50cyBjYWxscyBpdCBiZWZvcmUgd2JmeSBtdXRhdGVzXG4gKiB0aGUgcm9vdCBwYWNrYWdlLmpzb24gKGdldFdvcmtzcGFjZVBhY2thZ2VEaXJzIGNhY2hlcyB0aGUgcG9zdC1tdXRhdGlvbiBzdGF0ZSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRXb3Jrc3BhY2VTdWJEaXJQYXRocyhyb290TGlrZTogV29ya3NwYWNlUm9vdExpa2UpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBbXG4gICAgLi4ubmV3IFNldChcbiAgICAgIGdldFdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMocm9vdExpa2UpLm1hcCgocGFja2FnZUpzb25QYXRoKSA9PlxuICAgICAgICBwYXRoLnJlc29sdmUocm9vdExpa2UuZGlyUGF0aCwgcGF0aC5wb3NpeC5kaXJuYW1lKHBhY2thZ2VKc29uUGF0aCkpXG4gICAgICApXG4gICAgKSxcbiAgXS50b1NvcnRlZCgpO1xufVxuXG4vKipcbiAqIEV2ZXJ5IHdvcmtzcGFjZSBwYWNrYWdlLmpzb24gcGF0aCAocmVsYXRpdmUgdG8gdGhlIG1vbm9yZXBvIHJvb3QsIHNvcnRlZCksIGluY2x1ZGluZyBtYW5pZmVzdHNcbiAqIHdpdGhvdXQgYSBgbmFtZWAgZmllbGQg4oCUIHdiZnkgbmFtZXMgdGhvc2UgbGF0ZXIsIHNvIGRlcGVuZGVuY3kgc2NhbnMgbXVzdCBub3Qgc2tpcCB0aGVtLlxuICogUmVzb2x1dGlvbiBtaW1pY3MgQnVuJ3Mgc2VxdWVudGlhbCBwYXR0ZXJuIGV2YWx1YXRpb247IHNlZSByZXNvbHZlV29ya3NwYWNlUGFja2FnZUpzb25QYXRocy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMocm9vdENvbmZpZzogV29ya3NwYWNlUm9vdExpa2UpOiBzdHJpbmdbXSB7XG4gIHJldHVybiByZXNvbHZlV29ya3NwYWNlUGFja2FnZUpzb25QYXRocyhnZXRTYW5pdGl6ZWRXb3Jrc3BhY2VQYXR0ZXJucyhyb290Q29uZmlnKSwgcm9vdENvbmZpZy5kaXJQYXRoKTtcbn1cblxuaW50ZXJmYWNlIFdvcmtzcGFjZURpclBhdHRlcm5zIHtcbiAgLyoqIERpcmVjdG9yeSBzdWJ0cmVlcyAob3IgcGFja2FnZS1vd25lZCBzdWJwYXRocykgbWF0Y2hlZCBieSBlZmZlY3RpdmUgbmVnYXRpb25zLCBmb3IgdHNjb25maWcgYGV4Y2x1ZGVgIGVudHJpZXMuICovXG4gIGV4Y2x1ZGVzOiBzdHJpbmdbXTtcbiAgLyoqIFBvc2l0aXZlIGRpcmVjdG9yeSBwYXR0ZXJucyAob3IgY29uY3JldGUgZGlyZWN0b3JpZXMgZm9yIEJ1bi1vbmx5IGdsb2Igc3ludGF4KS4gKi9cbiAgaW5jbHVkZXM6IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFNvcnRlZCB3b3Jrc3BhY2UgZGlyZWN0b3J5IHBhdHRlcm5zIChwb3NpeCwgcmVsYXRpdmUgdG8gdGhlIG1vbm9yZXBvIHJvb3QpIGZvciBnZW5lcmF0b3JzIHRoYXRcbiAqIG5lZWQgcGF0dGVybi1zaGFwZWQgZ2xvYnMgY292ZXJpbmcgZXZlcnkgd29ya3NwYWNlIGxheW91dCDigJQgZS5nLiB0aGUgcm9vdCB0c2NvbmZpZydzIGBhcHBzLypgXG4gKiBpbmNsdWRlIGVudHJpZXMg4oCUIGluc3RlYWQgb2YgY29uY3JldGUgZGlyZWN0b3JpZXMsIHdoaWNoIHdvdWxkIGNodXJuIGdlbmVyYXRlZCBmaWxlcyB3aGVuZXZlciBhXG4gKiB3b3Jrc3BhY2UgcGFja2FnZSBpcyBhZGRlZCBvciByZW1vdmVkLiBFdmVyeSByZXR1cm5lZCBwYXR0ZXJuIGlzIHZhbGlkIHRzY29uZmlnIGdsb2Igc3ludGF4LlxuICogQSBwYXR0ZXJuIGNhbiBtYXRjaCBhIHNpYmxpbmcgZGlyZWN0b3J5IHdpdGhvdXQgYSBwYWNrYWdlLmpzb24gKG5vdCBhIHdvcmtzcGFjZSB0byBCdW4pOyB0aGF0XG4gKiBpcyBkZWxpYmVyYXRlLCBtaXJyb3JpbmcgdGhlIGxvbmctc3RhbmRpbmcgYHBhY2thZ2VzLypgIGVudHJpZXMnIGJlaGF2aW9yIGluIGZhdm9yIG9mIHN0YWJsZVxuICogZ2VuZXJhdGVkIG91dHB1dC4gTmVnYXRpb25zIGZvbGxvdyBCdW4ncyBzZXF1ZW50aWFsIHNlbWFudGljcyAoc2VlXG4gKiByZXNvbHZlV29ya3NwYWNlUGFja2FnZUpzb25QYXRocyk6IGEgbmVnYXRpb24gc3RheXMgcGF0dGVybi1zaGFwZWQgd2hpbGUgaXQgZXhjbHVkZXMgZXhhY3RseVxuICogd2hhdCBpdCBtYXRjaGVzLCBidXQgaXMgY29uY3JldGl6ZWQgcGVyIG1hdGNoZWQgZGlyZWN0b3J5IHdoZW4gYSBtYXRjaGVkIGRpcmVjdG9yeSBlbmRzIHVwIGFcbiAqIHdvcmtzcGFjZSBhbnl3YXkgKHJlLWluY2x1ZGVkIGJ5IGEgbGF0ZXIgcG9zaXRpdmUsIGEgcGlubmVkIGNvbmNyZXRlIHBvc2l0aXZlLCBvciBhIHNlZWRlZFxuICogYmFzZWxpbmU7ICMxMDA1KSBvciBpcyBhbiBhbmNlc3RvciBvZiBhIHdvcmtzcGFjZSBkaXJlY3RvcnksIHdoZXJlIEJ1biBleGNsdWRlcyBvbmx5IHRoZVxuICogcGFja2FnZSBBVCB0aGF0IGRpcmVjdG9yeSwgc28gb25seSBpdHMgcGFja2FnZS1vd25lZCBzdWJwYXRocyBhcmUgZXhjbHVkZWQgKCMxMDA0KS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFdvcmtzcGFjZURpclBhdHRlcm5zKHJvb3RMaWtlOiBXb3Jrc3BhY2VSb290TGlrZSk6IFdvcmtzcGFjZURpclBhdHRlcm5zIHtcbiAgLy8gVW5saWtlIGRpc2NvdmVyeSwgZ2VuZXJhdGVkIG91dHB1dCBtdXN0IG5vdCBjb250YWluIGEgbmV2ZXItbWF0Y2hpbmcgYHBhY2thZ2VzLypgIGZhbGxiYWNrOlxuICAvLyBhbiBhcHBzLyotb25seSBtb25vcmVwbyB3b3VsZCBnZXQgZGVhZCBnbG9icyBjb21taXR0ZWQgaW50byBpdHMgcm9vdCB0c2NvbmZpZy4gTWlycm9yXG4gIC8vIGFwcGx5UGFja2FnZUpzb25Db252ZW50aW9ucywgd2hpY2ggZm9yY2VzIGBwYWNrYWdlcy8qYCBvbmx5IHdoZW4gYSBtYW5pZmVzdCBhY3R1YWxseSBtYXRjaGVzLlxuICBjb25zdCBoYXNQYWNrYWdlc0xheW91dCA9XG4gICAgcm9vdExpa2UuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMgJiZcbiAgICAvLyBNaXJyb3IgYXBwbHlQYWNrYWdlSnNvbkNvbnZlbnRpb25zJyBiYXNlbGluZSBnYXRlIHRvbzogd2l0aCBhbiBpbXBsaWNpdCBiYXNlbGluZSBzZWVkZWQsXG4gICAgLy8gYHBhY2thZ2VzLypgIGVudHJpZXMgd291bGQgYmUgZGVhZCBnbG9icyBzdWJzdW1lZCBieSB0aGUgYmFzZWxpbmUtZGVyaXZlZCBvbmVzLlxuICAgICFoYXNJbXBsaWNpdFdvcmtzcGFjZUJhc2VsaW5lKHJvb3RMaWtlLnBhY2thZ2VKc29uPy53b3Jrc3BhY2VzKSAmJlxuICAgIGZnLmdsb2JTeW5jKCdwYWNrYWdlcy8qL3BhY2thZ2UuanNvbicsIHtcbiAgICAgIGN3ZDogcm9vdExpa2UuZGlyUGF0aCxcbiAgICAgIGZvbGxvd1N5bWJvbGljTGlua3M6IGZhbHNlLFxuICAgICAgaWdub3JlOiBbJyoqL25vZGVfbW9kdWxlcy8qKiddLFxuICAgIH0pLmxlbmd0aCA+IDA7XG4gIGNvbnN0IHdvcmtzcGFjZVBhdHRlcm5zID0gZ2V0U2FuaXRpemVkV29ya3NwYWNlUGF0dGVybnMoe1xuICAgIC4uLnJvb3RMaWtlLFxuICAgIGRvZXNDb250YWluU3ViUGFja2FnZUpzb25zOiBoYXNQYWNrYWdlc0xheW91dCxcbiAgfSk7XG4gIGNvbnN0IHdvcmtzcGFjZURpclBhdGhzID0gbmV3IFNldChcbiAgICByZXNvbHZlV29ya3NwYWNlUGFja2FnZUpzb25QYXRocyh3b3Jrc3BhY2VQYXR0ZXJucywgcm9vdExpa2UuZGlyUGF0aCkubWFwKChwYWNrYWdlSnNvblBhdGgpID0+XG4gICAgICBwYXRoLnBvc2l4LmRpcm5hbWUocGFja2FnZUpzb25QYXRoKVxuICAgIClcbiAgKTtcbiAgY29uc3QgaW5jbHVkZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgbmVnYXRpb25Cb2RpZXM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3Qgd29ya3NwYWNlUGF0dGVybiBvZiB3b3Jrc3BhY2VQYXR0ZXJucykge1xuICAgIGNvbnN0IGlzTmVnYXRpdmUgPSB3b3Jrc3BhY2VQYXR0ZXJuLnN0YXJ0c1dpdGgoJyEnKTtcbiAgICBjb25zdCBwYXR0ZXJuQm9keSA9IG5vcm1hbGl6ZVdvcmtzcGFjZVBhdHRlcm5Cb2R5KGlzTmVnYXRpdmUgPyB3b3Jrc3BhY2VQYXR0ZXJuLnNsaWNlKDEpIDogd29ya3NwYWNlUGF0dGVybik7XG4gICAgaWYgKGlzTmVnYXRpdmUpIHtcbiAgICAgIC8vIEEgc2VlZGluZyBuZWdhdGlvbiBtYWtlcyBCdW4gbGluayBiYXNlbGluZS1tYXRjaGVkIGRpcmVjdG9yaWVzLCBzbyB0aGUgYmFzZWxpbmUgbXVzdFxuICAgICAgLy8gZW50ZXIgdGhlIGdlbmVyYXRlZCBpbmNsdWRlIHBhdHRlcm5zIGV2ZW4gd2hlbiBldmVyeSBkZWNsYXJlZCBwYXR0ZXJuIGlzIGEgbmVnYXRpb24uXG4gICAgICBjb25zdCBiYXNlbGluZUdsb2IgPSBnZXRTZWVkZWRCYXNlbGluZUdsb2IocGF0dGVybkJvZHkpO1xuICAgICAgaWYgKGJhc2VsaW5lR2xvYiAhPT0gdW5kZWZpbmVkKSBpbmNsdWRlcy5hZGQoYmFzZWxpbmVHbG9iKTtcbiAgICAgIG5lZ2F0aW9uQm9kaWVzLnB1c2gocGF0dGVybkJvZHkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGNvbnN0IGRpclBhdHRlcm4gb2YgdG9Uc2NvbmZpZ0NvbXBhdGlibGVEaXJQYXR0ZXJucyhwYXR0ZXJuQm9keSwgcm9vdExpa2UuZGlyUGF0aCkpIHtcbiAgICAgICAgaW5jbHVkZXMuYWRkKGRpclBhdHRlcm4pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjb25zdCBleGNsdWRlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IG5lZ2F0aW9uQm9keSBvZiBuZWdhdGlvbkJvZGllcykge1xuICAgIGZvciAoY29uc3QgZXhjbHVkZUVudHJ5IG9mIHRvRXhjbHVkZUVudHJpZXMobmVnYXRpb25Cb2R5LCB3b3Jrc3BhY2VEaXJQYXRocywgcm9vdExpa2UuZGlyUGF0aCkpIHtcbiAgICAgIGV4Y2x1ZGVzLmFkZChleGNsdWRlRW50cnkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4geyBleGNsdWRlczogWy4uLmV4Y2x1ZGVzXS50b1NvcnRlZCgpLCBpbmNsdWRlczogWy4uLmluY2x1ZGVzXS50b1NvcnRlZCgpIH07XG59XG5cbi8qKlxuICogdHNjb25maWcgZXhjbHVkZSBlbnRyaWVzIGZvciBvbmUgbmVnYXRpb24uIFBhdHRlcm4tc2hhcGVkIHdoZW4gdGhlIG5lZ2F0aW9uIGV4Y2x1ZGVzIGV4YWN0bHlcbiAqIHdoYXQgaXQgbWF0Y2hlcyAoc3RhYmxlIG91dHB1dCk7IHBlci1kaXJlY3Rvcnkgb3RoZXJ3aXNlOiBhIGRpcmVjdG9yeSB0aGF0IGlzIGEgd29ya3NwYWNlXG4gKiBkZXNwaXRlIHRoZSBuZWdhdGlvbiBpcyBub3QgZXhjbHVkZWQgYXQgYWxsLCBhbmQgbmVpdGhlciBpcyBhIFBMQUlOIChwYWNrYWdlLmpzb24tbGVzcylcbiAqIGRlc2NlbmRhbnQgb2YgYSB3b3Jrc3BhY2UgZGlyZWN0b3J5IOKAlCBuZWdhdGluZyBhIG5vbi1wYWNrYWdlIGRpcmVjdG9yeSBpcyBhIG5vLW9wIGZvciBCdW4sXG4gKiBhbmQgdGhlIGVuY2xvc2luZyB3b3Jrc3BhY2Ugc3RheXMgYWN0aXZlIChlLmcuIGBbJ2FwcHMvKionLCAnIWFwcHMvKionLCAnYXBwcy93ZWInXWBcbiAqIHJlLWluY2x1ZGVzIGFwcHMvd2ViLCB3aG9zZSBzcmMgbXVzdCBrZWVwIHR5cGUtY2hlY2tpbmc7IGEgdHNjb25maWcgZXhjbHVkZSB3b3VsZCBvdmVycmlkZVxuICogdGhlIGluY2x1ZGUpLiBBIGRlc2NlbmRhbnQgd2l0aCBpdHMgb3duIG1hbmlmZXN0IHRoYXQgdGhlIG5lZ2F0aW9uIGtlZXBzIG91dCBvZiB0aGUgd29ya3NwYWNlXG4gKiBzZXQgaXMgYW4gZXhjbHVkZWQgbmVzdGVkIHBhY2thZ2UgYW5kIHN0YXlzIGV4Y2x1ZGVkLiBBIGRpcmVjdG9yeSB0aGF0IGlzIGFuXG4gKiBhbmNlc3RvciBvZiBhIHdvcmtzcGFjZSBkaXJlY3RvcnkgZ2V0cyBvbmx5IGl0cyBwYWNrYWdlLW93bmVkIHN1YnBhdGhzIGV4Y2x1ZGVkLCBiZWNhdXNlIEJ1blxuICogZXhjbHVkZXMgb25seSB0aGUgcGFja2FnZSBBVCB0aGF0IGRpcmVjdG9yeSB3aGlsZSBrZWVwaW5nIGRlc2NlbmRhbnQgd29ya3NwYWNlcyAoIzEwMDQpLlxuICovXG5mdW5jdGlvbiB0b0V4Y2x1ZGVFbnRyaWVzKG5lZ2F0aW9uQm9keTogc3RyaW5nLCB3b3Jrc3BhY2VEaXJQYXRoczogU2V0PHN0cmluZz4sIHJvb3REaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGlzV29ya3NwYWNlQW5jZXN0b3IgPSAoZGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiA9PlxuICAgIFsuLi53b3Jrc3BhY2VEaXJQYXRoc10uc29tZSgod29ya3NwYWNlRGlyUGF0aCkgPT4gd29ya3NwYWNlRGlyUGF0aC5zdGFydHNXaXRoKGAke2RpclBhdGh9L2ApKTtcbiAgLy8gT25seSBQTEFJTiBkaXJlY3RvcmllcyAobm8gcGFja2FnZS5qc29uIG9mIHRoZWlyIG93bikgYXJlIHByb3RlY3RlZCBieSB0aGUgZW5jbG9zaW5nXG4gIC8vIHdvcmtzcGFjZTogYSBtYXRjaGVkIGRpcmVjdG9yeSB0aGF0IGNhcnJpZXMgaXRzIG93biBtYW5pZmVzdCB5ZXQgaXMgYWJzZW50IGZyb20gdGhlIGZpbmFsXG4gIC8vIHdvcmtzcGFjZSBzZXQgaXMgYW4gZXhjbHVkZWQgbmVzdGVkIHBhY2thZ2UsIGFuZCBpdHMgZXhjbHVzaW9uIG11c3Qgc3Vydml2ZS5cbiAgY29uc3QgaXNQcm90ZWN0ZWRXb3Jrc3BhY2VEZXNjZW5kYW50ID0gKGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4gPT5cbiAgICBbLi4ud29ya3NwYWNlRGlyUGF0aHNdLnNvbWUoKHdvcmtzcGFjZURpclBhdGgpID0+IGRpclBhdGguc3RhcnRzV2l0aChgJHt3b3Jrc3BhY2VEaXJQYXRofS9gKSkgJiZcbiAgICAhZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocm9vdERpclBhdGgsIGRpclBhdGgsICdwYWNrYWdlLmpzb24nKSk7XG4gIGNvbnN0IG1hdGNoZWREaXJQYXRocyA9IGdldE1hdGNoZWREaXJQYXRocyhuZWdhdGlvbkJvZHksIHJvb3REaXJQYXRoKTtcbiAgaWYgKFxuICAgICFtYXRjaGVkRGlyUGF0aHMuc29tZShcbiAgICAgIChkaXJQYXRoKSA9PlxuICAgICAgICB3b3Jrc3BhY2VEaXJQYXRocy5oYXMoZGlyUGF0aCkgfHwgaXNXb3Jrc3BhY2VBbmNlc3RvcihkaXJQYXRoKSB8fCBpc1Byb3RlY3RlZFdvcmtzcGFjZURlc2NlbmRhbnQoZGlyUGF0aClcbiAgICApXG4gICkge1xuICAgIHJldHVybiB0b1RzY29uZmlnQ29tcGF0aWJsZURpclBhdHRlcm5zKG5lZ2F0aW9uQm9keSwgcm9vdERpclBhdGgpO1xuICB9XG4gIHJldHVybiBtYXRjaGVkRGlyUGF0aHMuZmxhdE1hcCgoZGlyUGF0aCkgPT4ge1xuICAgIC8vIFRoZSBkZXNjZW5kYW50IGNoZWNrIHByZWNlZGVzIHRoZSBhbmNlc3RvciBvbmU6IGEgZGlyZWN0b3J5IGluc2lkZSBvbmUgd29ya3NwYWNlIGJ1dCBhYm92ZVxuICAgIC8vIGEgbmVzdGVkIG9uZSAoZS5nLiBhcHBzL3dlYi9wbHVnaW5zIGJldHdlZW4gd29ya3NwYWNlcyBhcHBzL3dlYiBhbmQgYXBwcy93ZWIvcGx1Z2lucy94KVxuICAgIC8vIHN0aWxsIGJlbG9uZ3MgdG8gdGhlIGVuY2xvc2luZyBhY3RpdmUgd29ya3NwYWNlLCBzbyBub3RoaW5nIG9mIGl0IG1heSBiZSBleGNsdWRlZC5cbiAgICBpZiAod29ya3NwYWNlRGlyUGF0aHMuaGFzKGRpclBhdGgpIHx8IGlzUHJvdGVjdGVkV29ya3NwYWNlRGVzY2VuZGFudChkaXJQYXRoKSkgcmV0dXJuIFtdO1xuICAgIGlmIChpc1dvcmtzcGFjZUFuY2VzdG9yKGRpclBhdGgpKSB7XG4gICAgICByZXR1cm4gW2Ake2RpclBhdGh9LyouY29uZmlnLnRzYCwgYCR7ZGlyUGF0aH0vc2NyaXB0c2AsIGAke2RpclBhdGh9L3NyY2AsIGAke2RpclBhdGh9L3Rlc3RgXTtcbiAgICB9XG4gICAgcmV0dXJuIFtkaXJQYXRoXTtcbiAgfSk7XG59XG5cbi8qKlxuICogRGlyZWN0b3JpZXMgYSBuZWdhdGlvbiBtYXRjaGVzLiBUaGUgbWFuaWZlc3QtYmFzZWQgZ2xvYiBjb21wbGVtZW50cyBvbmx5RGlyZWN0b3JpZXMgYmVjYXVzZVxuICogZmFzdC1nbG9iJ3MgYGRpci8qKmAgZG9lcyBub3QgcmV0dXJuIGBkaXJgIGl0c2VsZiBhcyBhIGRpcmVjdG9yeSwgd2hpbGUgYm90aCBCdW4gYW5kIHRoZVxuICogbWFuaWZlc3QgZ2xvYiB0cmVhdCBgKipgIGFzIHplcm8gb3IgbW9yZSBzZWdtZW50cyAoYGFwcHMvKipgIGNvdmVycyB0aGUgcGFja2FnZSBhdCBhcHBzKS5cbiAqL1xuZnVuY3Rpb24gZ2V0TWF0Y2hlZERpclBhdGhzKG5lZ2F0aW9uQm9keTogc3RyaW5nLCByb290RGlyUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBnbG9iT3B0aW9ucyA9IHsgY3dkOiByb290RGlyUGF0aCwgZm9sbG93U3ltYm9saWNMaW5rczogZmFsc2UsIGlnbm9yZTogWycqKi9ub2RlX21vZHVsZXMvKionXSB9O1xuICByZXR1cm4gW1xuICAgIC4uLm5ldyBTZXQoW1xuICAgICAgLi4uZmcuZ2xvYlN5bmMobmVnYXRpb25Cb2R5LCB7IC4uLmdsb2JPcHRpb25zLCBvbmx5RGlyZWN0b3JpZXM6IHRydWUgfSksXG4gICAgICAuLi5mZ1xuICAgICAgICAuZ2xvYlN5bmMocGF0aC5wb3NpeC5qb2luKG5lZ2F0aW9uQm9keSwgJ3BhY2thZ2UuanNvbicpLCBnbG9iT3B0aW9ucylcbiAgICAgICAgLm1hcCgocGFja2FnZUpzb25QYXRoKSA9PiBwYXRoLnBvc2l4LmRpcm5hbWUocGFja2FnZUpzb25QYXRoKSlcbiAgICAgICAgLy8gQSB6ZXJvLXNlZ21lbnQgYCoqYCBtYXRjaCByZWFjaGVzIHRoZSByb290IGl0c2VsZiwgd2hpY2ggaXMgbmV2ZXIgYSB3b3Jrc3BhY2UuXG4gICAgICAgIC5maWx0ZXIoKGRpclBhdGgpID0+IGRpclBhdGggIT09ICcuJyksXG4gICAgXSksXG4gIF0udG9Tb3J0ZWQoKTtcbn1cblxuLyoqXG4gKiB0c2NvbmZpZyBpbmNsdWRlL2V4Y2x1ZGUgc3VwcG9ydCBvbmx5IHRoZSBgKmAsIGA/YCwgYW5kIGAqKmAgd2lsZGNhcmRzLCB3aGlsZSBCdW4gd29ya3NwYWNlc1xuICogYWNjZXB0IGZ1bGwgZ2xvYiBzeW50YXggKGJyYWNlIGV4cGFuc2lvbiwgY2hhcmFjdGVyIGNsYXNzZXMsIOKApiksIHNvIGV4cGFuZCBCdW4tb25seSBwYXR0ZXJucyB0b1xuICogdGhlIGNvbmNyZXRlIGRpcmVjdG9yaWVzIHRoZXkgbWF0Y2ggdG8ga2VlcCB0aGUgZ2VuZXJhdGVkIGdsb2JzIHZhbGlkIGZvciBUeXBlU2NyaXB0LlxuICovXG5mdW5jdGlvbiB0b1RzY29uZmlnQ29tcGF0aWJsZURpclBhdHRlcm5zKHBhdHRlcm5Cb2R5OiBzdHJpbmcsIHJvb3REaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGlmICghL1soKVtcXF17fV0vdS50ZXN0KHBhdHRlcm5Cb2R5KSkgcmV0dXJuIFtwYXR0ZXJuQm9keV07XG4gIHJldHVybiBmZy5nbG9iU3luYyhwYXR0ZXJuQm9keSwge1xuICAgIGN3ZDogcm9vdERpclBhdGgsXG4gICAgZm9sbG93U3ltYm9saWNMaW5rczogZmFsc2UsXG4gICAgaWdub3JlOiBbJyoqL25vZGVfbW9kdWxlcy8qKiddLFxuICAgIG9ubHlEaXJlY3RvcmllczogdHJ1ZSxcbiAgfSk7XG59XG5cbi8qKlxuICogRGVjbGFyZWQgd29ya3NwYWNlIHBhdHRlcm5zIChuZWdhdGl2ZSBvbmVzIGluY2x1ZGVkKSB0aGF0IHN0YXkgaW5zaWRlIHRoZSByZXBvc2l0b3J5OiBhYnNvbHV0ZVxuICogb3IgYC4uYC10cmF2ZXJzaW5nIHBhdHRlcm5zIHdvdWxkIG1ha2UgY29uc3VtZXJzIHN1Y2ggYXMgcmVtb3ZlTm9kZU1vZHVsZXMgb3BlcmF0ZSBvbiBhbm90aGVyXG4gKiByZXBvc2l0b3J5J3MgZmlsZXMuIERlY2xhcmF0aW9uIG9yZGVyIGFuZCBkdXBsaWNhdGVzIGFyZSBwcmVzZXJ2ZWQg4oCUIEJ1biBldmFsdWF0ZXMgdGhlXG4gKiBwYXR0ZXJucyBzZXF1ZW50aWFsbHksIHNvIHBvc2l0aW9uIG1hdHRlcnMuXG4gKi9cbmZ1bmN0aW9uIGdldFNhbml0aXplZFdvcmtzcGFjZVBhdHRlcm5zKHJvb3RMaWtlOiBXb3Jrc3BhY2VSb290TGlrZSk6IHN0cmluZ1tdIHtcbiAgY29uc3QgZGVjbGFyZWRQYXR0ZXJucyA9IGdldE1lYW5pbmdmdWxEZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zKHJvb3RMaWtlLnBhY2thZ2VKc29uPy53b3Jrc3BhY2VzKTtcbiAgLy8gYXBwbHlQYWNrYWdlSnNvbkNvbnZlbnRpb25zIGZvcmNlcyBgcGFja2FnZXMvKmAgaW50byBhIG1vbm9yZXBvJ3Mgd29ya3NwYWNlcyB3aGVuIGFcbiAgLy8gcGFja2FnZXMvKi9wYWNrYWdlLmpzb24gYWN0dWFsbHkgbWF0Y2hlcywgYnV0IGl0IG1heSBub3QgaGF2ZSB3cml0dGVuIHRoZSByb290IHBhY2thZ2UuanNvblxuICAvLyB5ZXQsIHNvIG1pcnJvciB0aGF0IG5vcm1hbGl6YXRpb24gaGVyZSDigJQgUFJFUEVOREVEIGxpa2UgdGhlcmUsIGJlY2F1c2UgYSBwb3NpdGl2ZSBwYXR0ZXJuXG4gIC8vIHBsYWNlZCBhZnRlciBhIHVzZXIgbmVnYXRpb24gd291bGQgcmUtaW5jbHVkZSB0aGUgbmVnYXRlZCBwYWNrYWdlcyB1bmRlciBCdW4ncyBzZXF1ZW50aWFsXG4gIC8vIGV2YWx1YXRpb24uIERpc2NvdmVyeSBjYWxsZXJzIHBhc3MgdGhlIGZhbGxiYWNrIHVuY29uZGl0aW9uYWxseSBmb3IgbW9ub3JlcG9zIOKAlCBhXG4gIC8vIG5ldmVyLW1hdGNoaW5nIHBhdHRlcm4gY29udHJpYnV0ZXMgbm8gcGF0aHMgdGhlcmUg4oCUIHdoaWxlIHBhdHRlcm4tc2hhcGVkIGNhbGxlcnNcbiAgLy8gKGdldFdvcmtzcGFjZURpclBhdHRlcm5zKSBnYXRlIGl0IG9uIGFuIGFjdHVhbCBtYXRjaC5cbiAgY29uc3Qgd29ya3NwYWNlUGF0dGVybnMgPVxuICAgIHJvb3RMaWtlLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zICYmICFoYXNEZWNsYXJlZFBhY2thZ2VzU3RhclBhdHRlcm4ocm9vdExpa2UucGFja2FnZUpzb24/LndvcmtzcGFjZXMpXG4gICAgICA/IFsncGFja2FnZXMvKicsIC4uLmRlY2xhcmVkUGF0dGVybnNdXG4gICAgICA6IGRlY2xhcmVkUGF0dGVybnM7XG4gIHJldHVybiB3b3Jrc3BhY2VQYXR0ZXJucy5maWx0ZXIoKHdvcmtzcGFjZVBhdHRlcm4pID0+IGlzSW5SZXBvc2l0b3J5V29ya3NwYWNlUGF0dGVybih3b3Jrc3BhY2VQYXR0ZXJuKSk7XG59XG5cbi8qKlxuICogV2hldGhlciBhIGRlY2xhcmVkIHBvc2l0aXZlIHBhdHRlcm4gYWxyZWFkeSBjb3ZlcnMgYHBhY2thZ2VzLypgIHVuZGVyIHBhdGggbm9ybWFsaXphdGlvblxuICogKGUuZy4gYC4vcGFja2FnZXMvKmAgb3IgYSB0cmFpbGluZy1zbGFzaCBzcGVsbGluZyk6IGZvcmNpbmcgYSB0ZXh0dWFsIGBwYWNrYWdlcy8qYCBuZXh0IHRvXG4gKiBzdWNoIGEgc3BlbGxpbmcgd291bGQgcGVyc2lzdCBkdXBsaWNhdGUgZXF1aXZhbGVudCBwYXR0ZXJucyBhbmQgcmUtc2NhbiB0aGUgc2FtZSBkaXJlY3Rvcmllcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc0RlY2xhcmVkUGFja2FnZXNTdGFyUGF0dGVybih3b3Jrc3BhY2VzOiBQYWNrYWdlSnNvblsnd29ya3NwYWNlcyddKTogYm9vbGVhbiB7XG4gIHJldHVybiBnZXRNZWFuaW5nZnVsRGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyh3b3Jrc3BhY2VzKS5zb21lKFxuICAgICh3b3Jrc3BhY2VQYXR0ZXJuKSA9PlxuICAgICAgIXdvcmtzcGFjZVBhdHRlcm4uc3RhcnRzV2l0aCgnIScpICYmXG4gICAgICAvLyBBIGAuLmAtdHJhdmVyc2luZyBvciBhYnNvbHV0ZSBzcGVsbGluZyAoZS5nLiBgeC8uLi9wYWNrYWdlcy8qYCkgaXMgZGlzY2FyZGVkIGJ5XG4gICAgICAvLyBnZXRTYW5pdGl6ZWRXb3Jrc3BhY2VQYXR0ZXJucywgc28gaXQgbXVzdCBub3QgY291bnQgYXMgY292ZXJpbmcgcGFja2FnZXMvKiDigJQgdGhhdCB3b3VsZFxuICAgICAgLy8gc3VwcHJlc3MgdGhlIGZhbGxiYWNrIEFORCBsb3NlIHRoZSBwYXR0ZXJuLCBsZWF2aW5nIG5vIGRpc2NvdmVyZWQgd29ya3NwYWNlcy5cbiAgICAgIGlzSW5SZXBvc2l0b3J5V29ya3NwYWNlUGF0dGVybih3b3Jrc3BhY2VQYXR0ZXJuKSAmJlxuICAgICAgbm9ybWFsaXplV29ya3NwYWNlUGF0dGVybkJvZHkod29ya3NwYWNlUGF0dGVybikgPT09ICdwYWNrYWdlcy8qJ1xuICApO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5pbXBvcnQgeyBnZXRXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzIH0gZnJvbSAnLi93b3Jrc3BhY2VVdGlsLmpzJztcblxuY29uc3QgUFJJVkFURV9TQ09QRSA9ICdAd2lsbGJvb3N0ZXItcHJpdmF0ZS8nO1xuXG5jb25zdCBwcml2YXRlUmVnaXN0cnlIb3N0ID0gJ3ZlcmRhY2Npby1wcm9kdWN0aW9uLWUzODkudXAucmFpbHdheS5hcHAnO1xuZXhwb3J0IGNvbnN0IHByaXZhdGVSZWdpc3RyeVNjb3BlTWFwcGluZyA9IGBAd2lsbGJvb3N0ZXItcHJpdmF0ZTpyZWdpc3RyeT1odHRwczovLyR7cHJpdmF0ZVJlZ2lzdHJ5SG9zdH0vYDtcblxuLyoqXG4gKiBXaGV0aGVyIHRoaXMgcmVwb3NpdG9yeSBkZWFscyB3aXRoIGBAd2lsbGJvb3N0ZXItcHJpdmF0ZS8qYCBwYWNrYWdlcyDigJQgYnkgY29udmVudGlvbiB0aGF0IHNjb3BlXG4gKiBsaXZlcyBleGNsdXNpdmVseSBvbiB0aGUgcHJpdmF0ZSBWZXJkYWNjaW8gcmVnaXN0cnksIHNvIGV4YWN0bHkgdGhlc2UgcmVwb3NpdG9yaWVzIG5lZWQgdGhlXG4gKiBWRVJEQUNDSU9fVE9LRU4gcGFzcy10aHJvdWdoIGluIHRoZWlyIHJldXNhYmxlLXdvcmtmbG93IGNhbGxlcnMuXG4gKlxuICogQSByZXBvc2l0b3J5IHF1YWxpZmllcyB3aGVuIGFueSB3b3Jrc3BhY2UgcGFja2FnZS5qc29uIERFQ0xBUkVTIGEgZGVwZW5kZW5jeSBpbiB0aGUgc2NvcGUgKGFueVxuICogZGVwZW5kZW5jeSBmaWVsZCksIG9yIGlzIGl0c2VsZiBOQU1FRCBpbiB0aGUgc2NvcGUgKGl0IHB1Ymxpc2hlcyB0byBWZXJkYWNjaW8sIGFuZCByZWxlYXNlLnltbFxuICogZGVyaXZlcyBpdHMgbnBtIGF1dGggZnJvbSB0aGUgc2FtZSBzZWNyZXQpLiBOb3RoaW5nIGVsc2UgaXMgc2Nhbm5lZDogbG9ja2ZpbGVzIG9ubHkgbWlycm9yIHRoZVxuICogZGVjbGFyZWQgZGVwZW5kZW5jaWVzLCBhbmQgYnVuZmlnLnRvbWwncyBgbWluaW11bVJlbGVhc2VBZ2VFeGNsdWRlc2AgbWVudGlvbnMgdGhlIHNjb3BlIGV2ZW4gaW5cbiAqIHJlcG9zaXRvcmllcyB0aGF0IGRvIG5vdCBkZXBlbmQgb24gaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXBvUmVzb2x2ZXNQcml2YXRlUGFja2FnZXMoXG4gIGNvbmZpZzogUGljazxQYWNrYWdlQ29uZmlnLCAnZGlyUGF0aCcgfCAnZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMnIHwgJ3BhY2thZ2VKc29uJz5cbik6IGJvb2xlYW4ge1xuICBjb25zdCBtYW5pZmVzdFJlbFBhdGhzID0gbmV3IFNldChbJ3BhY2thZ2UuanNvbicsIC4uLmdldFdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMoY29uZmlnKV0pO1xuICByZXR1cm4gWy4uLm1hbmlmZXN0UmVsUGF0aHNdLnNvbWUoKHJlbFBhdGgpID0+IHtcbiAgICBjb25zdCBtYW5pZmVzdCA9IHJlYWRQYWNrYWdlSnNvbklmRXhpc3RzKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgcmVsUGF0aCkpO1xuICAgIGlmICghbWFuaWZlc3QpIHJldHVybiBmYWxzZTtcbiAgICBpZiAobWFuaWZlc3QubmFtZT8uc3RhcnRzV2l0aChQUklWQVRFX1NDT1BFKSkgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIFtcbiAgICAgIG1hbmlmZXN0LmRlcGVuZGVuY2llcyxcbiAgICAgIG1hbmlmZXN0LmRldkRlcGVuZGVuY2llcyxcbiAgICAgIG1hbmlmZXN0LnBlZXJEZXBlbmRlbmNpZXMsXG4gICAgICBtYW5pZmVzdC5vcHRpb25hbERlcGVuZGVuY2llcyxcbiAgICBdLnNvbWUoKGRlcGVuZGVuY2llcykgPT4gT2JqZWN0LmtleXMoZGVwZW5kZW5jaWVzID8/IHt9KS5zb21lKChuYW1lKSA9PiBuYW1lLnN0YXJ0c1dpdGgoUFJJVkFURV9TQ09QRSkpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJlYWRQYWNrYWdlSnNvbklmRXhpc3RzKGZpbGVQYXRoOiBzdHJpbmcpOiBQYWNrYWdlSnNvbiB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmOCcpKSBhcyBQYWNrYWdlSnNvbjtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0ICogYXMgeWFtbCBmcm9tICdqcy15YW1sJztcbmltcG9ydCB7IHogfSBmcm9tICd6b2QnO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuY29uc3QgcnVubmVyU2NoZW1hID0gei51bmlvbihbei5zdHJpbmcoKSwgei5hcnJheSh6LnN0cmluZygpKV0pO1xuY29uc3Qgd29ya2Zsb3dTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIGpvYnM6IHoucmVjb3JkKFxuICAgIHouc3RyaW5nKCksXG4gICAgelxuICAgICAgLm9iamVjdCh7XG4gICAgICAgICdydW5zLW9uJzogcnVubmVyU2NoZW1hLm9wdGlvbmFsKCksXG4gICAgICAgIHN0cmF0ZWd5OiB6Lm9iamVjdCh7IG1hdHJpeDogei5yZWNvcmQoei5zdHJpbmcoKSwgei51bmtub3duKCkpIH0pLm9wdGlvbmFsKCksXG4gICAgICB9KVxuICAgICAgLm51bGxhYmxlKClcbiAgKSxcbn0pO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXNzZXJ0UHJpdmF0ZVdvcmtmbG93UnVubmVycyhjb25maWc6IFBhY2thZ2VDb25maWcsIHdvcmtmbG93c1BhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoY29uZmlnLmlzUHVibGljUmVwbyB8fCAhY29uZmlnLmlzUmVwb1Zpc2liaWxpdHlLbm93bikgcmV0dXJuO1xuICBjb25zdCBlbnRyaWVzID0gYXdhaXQgZnMucmVhZGRpcih3b3JrZmxvd3NQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkuY2F0Y2goKGVycm9yOiBOb2RlSlMuRXJybm9FeGNlcHRpb24pID0+IHtcbiAgICBpZiAoZXJyb3IuY29kZSA9PT0gJ0VOT0VOVCcpIHJldHVybiBbXTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfSk7XG4gIGZvciAoY29uc3QgeyBuYW1lOiBmaWxlTmFtZSB9IG9mIGVudHJpZXMuZmlsdGVyKChlbnRyeSkgPT4gZW50cnkuaXNGaWxlKCkgJiYgL1xcLnlhP21sJC91LnRlc3QoZW50cnkubmFtZSkpKSB7XG4gICAgY29uc3Qgd29ya2Zsb3cgPSB3b3JrZmxvd1NjaGVtYS5wYXJzZSh5YW1sLmxvYWQoYXdhaXQgZnMucmVhZEZpbGUocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsIGZpbGVOYW1lKSwgJ3V0ZjgnKSkpO1xuICAgIGZvciAoY29uc3QgW2pvYk5hbWUsIGpvYl0gb2YgT2JqZWN0LmVudHJpZXMod29ya2Zsb3cuam9icykpIHtcbiAgICAgIGlmICgham9iPy5bJ3J1bnMtb24nXSkgY29udGludWU7XG4gICAgICBjb25zdCBydW5uZXIgPSBqb2JbJ3J1bnMtb24nXTtcbiAgICAgIGlmIChpc1NlbGZIb3N0ZWQocnVubmVyKSkgY29udGludWU7XG4gICAgICBjb25zdCBtYXRjaCA9IHR5cGVvZiBydW5uZXIgPT09ICdzdHJpbmcnICYmIC9eXFwkXFx7XFx7XFxzKm1hdHJpeFxcLihcXHcrKVxccypcXH1cXH0kL3UuZXhlYyhydW5uZXIpO1xuICAgICAgY29uc3QgY2FuZGlkYXRlczogdW5rbm93bltdID0gW107XG4gICAgICBpZiAobWF0Y2ggJiYgam9iLnN0cmF0ZWd5KSB7XG4gICAgICAgIGNvbnN0IGtleSA9IG1hdGNoWzFdITtcbiAgICAgICAgY29uc3QgbWF0cml4ID0gam9iLnN0cmF0ZWd5Lm1hdHJpeDtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gei5hcnJheSh6LnVua25vd24oKSkuc2FmZVBhcnNlKG1hdHJpeFtrZXldKTtcbiAgICAgICAgaWYgKHZhbHVlcy5zdWNjZXNzKSBjYW5kaWRhdGVzLnB1c2goLi4udmFsdWVzLmRhdGEpO1xuICAgICAgICBjb25zdCBpbmNsdWRlID0gei5hcnJheSh6LnJlY29yZCh6LnN0cmluZygpLCB6LnVua25vd24oKSkpLnNhZmVQYXJzZShtYXRyaXguaW5jbHVkZSk7XG4gICAgICAgIGlmIChpbmNsdWRlLnN1Y2Nlc3MpXG4gICAgICAgICAgY2FuZGlkYXRlcy5wdXNoKC4uLmluY2x1ZGUuZGF0YS5tYXAoKHJvdykgPT4gcm93W2tleV0pLmZpbHRlcigodmFsdWUpID0+IHZhbHVlICE9PSB1bmRlZmluZWQpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhbmRpZGF0ZXMucHVzaChydW5uZXIpO1xuICAgICAgfVxuICAgICAgY29uc3QgYWxsb3dlZCA9XG4gICAgICAgIGNhbmRpZGF0ZXMubGVuZ3RoID4gMCAmJlxuICAgICAgICBjYW5kaWRhdGVzLmV2ZXJ5KFxuICAgICAgICAgIChjYW5kaWRhdGUpID0+XG4gICAgICAgICAgICBpc1NlbGZIb3N0ZWQoY2FuZGlkYXRlKSB8fFxuICAgICAgICAgICAgKGNvbmZpZy5yZXBvc2l0b3J5Py50b0xvd2VyQ2FzZSgpID09PSAnZ2l0aHViOndpbGxib29zdGVyL2NoZWVybGluZ3MnICYmXG4gICAgICAgICAgICAgIGZpbGVOYW1lID09PSAnYnVpbGQtZGVza3RvcC1hcHBzLnltbCcgJiZcbiAgICAgICAgICAgICAgam9iTmFtZSA9PT0gJ2J1aWxkJyAmJlxuICAgICAgICAgICAgICBjYW5kaWRhdGUgPT09ICd3aW5kb3dzLWxhdGVzdCcpXG4gICAgICAgICk7XG4gICAgICBpZiAoIWFsbG93ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGAke2ZpbGVOYW1lfTogam9icy4ke2pvYk5hbWV9LnJ1bnMtb24gbXVzdCBzZWxlY3Qgc2VsZi1ob3N0ZWQgcnVubmVycyBpbiBhIHByaXZhdGUgcmVwb3NpdG9yeS4gRml4IHRoZSB3b3JrZmxvdyBiZWZvcmUgcnVubmluZyB3YmZ5LmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNTZWxmSG9zdGVkKHJ1bm5lcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICBjb25zdCBsYWJlbHMgPSBydW5uZXJTY2hlbWEuc2FmZVBhcnNlKHJ1bm5lcik7XG4gIGlmICghbGFiZWxzLnN1Y2Nlc3MpIHJldHVybiBmYWxzZTtcbiAgaWYgKEFycmF5LmlzQXJyYXkobGFiZWxzLmRhdGEpKSByZXR1cm4gbGFiZWxzLmRhdGEuaW5jbHVkZXMoJ3NlbGYtaG9zdGVkJyk7XG4gIHJldHVybiBsYWJlbHMuZGF0YSA9PT0gJ3NlbGYtaG9zdGVkJztcbn1cbiIsIi8vIEdpdEh1YiBBY3Rpb25zIHZhbHVlbGVzcyBldmVudHMgc3VjaCBhcyBgcHVsbF9yZXF1ZXN0OmAgcmVxdWlyZSBZQU1MIG51bGwgdmFsdWVzLlxuLyogZXNsaW50LWRpc2FibGUgdW5pY29ybi9uby1udWxsICovXG5cbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0ICogYXMgeWFtbCBmcm9tICdqcy15YW1sJztcbmltcG9ydCB7IHogfSBmcm9tICd6b2QnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgaGFzRm5veFN5bmNGYWlsZWQsIHJlc29sdmVGbm94Q2lBZ2VLZXlTZWNyZXROYW1lIH0gZnJvbSAnLi9mbm94VG9tbC5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBjb21iaW5lTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgbW92ZVRvQm90dG9tLCBzb3J0S2V5cyB9IGZyb20gJy4uL3V0aWxzL29iamVjdFV0aWwuanMnO1xuaW1wb3J0IHsgcmVwb1Jlc29sdmVzUHJpdmF0ZVBhY2thZ2VzIH0gZnJvbSAnLi4vdXRpbHMvcHJpdmF0ZVBhY2thZ2VzLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgYXNzZXJ0UHJpdmF0ZVdvcmtmbG93UnVubmVycyB9IGZyb20gJy4vd29ya2Zsb3dSdW5uZXJQb2xpY3kuanMnO1xuXG5pbnRlcmZhY2UgV29ya2Zsb3cge1xuICBuYW1lPzogc3RyaW5nO1xuICBvbj86IE9uO1xuICBjb25jdXJyZW5jeT86IENvbmN1cnJlbmN5O1xuICBwZXJtaXNzaW9ucz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIGpvYnM6IFJlY29yZDxzdHJpbmcsIEpvYj47XG59XG5cbmludGVyZmFjZSBDb25jdXJyZW5jeSB7XG4gIGdyb3VwOiBzdHJpbmc7XG4gICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiBib29sZWFuO1xuICBxdWV1ZT86ICdzaW5nbGUnIHwgJ21heCc7XG59XG5cbmludGVyZmFjZSBPbiB7XG4gIC8vIEdpdEh1YiBBY3Rpb25zIHRyZWF0cyBgZXZlbnQ6IG51bGxgIGFzIGEgdmFsdWVsZXNzIGV2ZW50IG1hcHBpbmcsIGUuZy5cbiAgLy8gYHB1bGxfcmVxdWVzdDpgLiBgdW5kZWZpbmVkYCB3b3VsZCBvbWl0IHRoZSBldmVudCBlbnRpcmVseSB3aGVuIGR1bXBpbmcgWUFNTC5cbiAgaXNzdWVzPzogVHlwZXMgfCBudWxsO1xuICBwdWxsX3JlcXVlc3Q/OiBQdWxsUmVxdWVzdCB8IG51bGw7XG4gIHB1bGxfcmVxdWVzdF90YXJnZXQ/OiBUeXBlcyB8IG51bGw7XG4gIHB1c2g/OiBQdXNoO1xuICBzY2hlZHVsZT86IFNjaGVkdWxlW107XG4gIHdvcmtmbG93X2Rpc3BhdGNoPzogbnVsbDtcbn1cblxuaW50ZXJmYWNlIFB1bGxSZXF1ZXN0IHtcbiAgJ3BhdGhzLWlnbm9yZSc/OiBzdHJpbmdbXTtcbiAgdHlwZXM/OiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIFB1c2gge1xuICBicmFuY2hlczogc3RyaW5nW107XG4gICdwYXRocy1pZ25vcmUnPzogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBTY2hlZHVsZSB7XG4gIGNyb246IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFR5cGVzIHtcbiAgdHlwZXM6IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgSm9iIHtcbiAgJ3J1bnMtb24nPzogc3RyaW5nO1xuICBlbnY/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBwZXJtaXNzaW9ucz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIHN0ZXBzPzogU3RlcFtdO1xuICB1c2VzPzogc3RyaW5nO1xuICBpZj86IHN0cmluZztcbiAgc2VjcmV0cz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgJ2luaGVyaXQnO1xuICB3aXRoPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbmludGVyZmFjZSBTdGVwIHtcbiAgdXNlcz86IHN0cmluZztcbiAgd2l0aD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBydW4/OiBzdHJpbmc7XG59XG5cbmNvbnN0IHdvcmtmbG93cyA9IHtcbiAgdGVzdDoge1xuICAgIG5hbWU6ICdUZXN0JyxcbiAgICBvbjoge1xuICAgICAgcHVsbF9yZXF1ZXN0OiBudWxsLFxuICAgICAgcHVzaDoge1xuICAgICAgICBicmFuY2hlczogWydtYWluJ10sXG4gICAgICB9LFxuICAgICAgLy8gTGV0IG1haW50YWluZXJzIHJlLXJ1biB0aGUgdGVzdHMgYnkgaGFuZC5cbiAgICAgIHdvcmtmbG93X2Rpc3BhdGNoOiBudWxsLFxuICAgIH0sXG4gICAgLy8gY2YuIGh0dHBzOi8vZG9jcy5naXRodWIuY29tL2VuL2FjdGlvbnMvdXNpbmctam9icy91c2luZy1jb25jdXJyZW5jeSNleGFtcGxlLW9ubHktY2FuY2VsLWluLXByb2dyZXNzLWpvYnMtb3ItcnVucy1mb3ItdGhlLWN1cnJlbnQtd29ya2Zsb3dcbiAgICBjb25jdXJyZW5jeToge1xuICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19LSR7eyBnaXRodWIucmVmIH19JyxcbiAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiB0cnVlLFxuICAgIH0sXG4gICAgLy8gTm9uZSBvZiB0aGVzZSBtYXkgYmUgbmFycm93ZWQganVzdCBiZWNhdXNlIHRoZSByZXVzYWJsZSB0ZXN0IHdvcmtmbG93IG5ldmVyIHB1c2hlczpcbiAgICBwZXJtaXNzaW9uczoge1xuICAgICAgLy8gZm9yIHRoZSB0ZXN0IGpvYidzIHNraXAtZHVwbGljYXRlLWFjdGlvbnMgY2FsbCB3aXRoIGNhbmNlbF9vdGhlcnM6IHRydWUgKHRoZSByZXVzYWJsZVxuICAgICAgLy8gdGVzdCB3b3JrZmxvdyBkZWNsYXJlcyBubyBwZXJtaXNzaW9ucyBvZiBpdHMgb3duLCBzbyBpdHMgam9icyBydW4gb24gdGhpcyB0b2tlbilcbiAgICAgIGFjdGlvbnM6ICd3cml0ZScsXG4gICAgICAvLyBmb3IgYHNlbWFudGljLXJlbGVhc2UgLS1kcnktcnVuYCwgd2hpY2ggZG9lcyBhIGBnaXQgcHVzaCAtLWRyeS1ydW5gIHRvIHZlcmlmeSB3cml0ZVxuICAgICAgLy8gYWNjZXNzIGFuZCBhYm9ydHMgd2l0aCBFR0lUTk9QRVJNSVNTSU9OIHdpdGhvdXQgaXRcbiAgICAgIGNvbnRlbnRzOiAnd3JpdGUnLFxuICAgICAgLy8gZm9yIHBrZy1wcmVmbGlnaHQgUFIgZmlsZSBsaXN0aW5nXG4gICAgICAncHVsbC1yZXF1ZXN0cyc6ICdyZWFkJyxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgIHRlc3Q6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy90ZXN0LnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ3Rlc3QtcnVzdCc6IHtcbiAgICBuYW1lOiAnVGVzdCBSdXN0JyxcbiAgICBvbjoge1xuICAgICAgcHVsbF9yZXF1ZXN0OiBudWxsLFxuICAgICAgcHVzaDoge1xuICAgICAgICBicmFuY2hlczogWydtYWluJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgY29uY3VycmVuY3k6IHtcbiAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fS0ke3sgZ2l0aHViLnJlZiB9fScsXG4gICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogdHJ1ZSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgICd0ZXN0LXJ1c3QnOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvdGVzdC1ydXN0LnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgcmVsZWFzZToge1xuICAgIG5hbWU6ICdSZWxlYXNlJyxcbiAgICBvbjoge1xuICAgICAgcHVzaDoge1xuICAgICAgICBicmFuY2hlczogW10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgLy8gYHF1ZXVlOiBtYXhgIGhlcmUgdG9vICgjOTc0KTogR2l0SHViJ3MgZGVmYXVsdCBxdWV1ZSAoYHNpbmdsZWApIGNhbmNlbHMgYW4gYWxyZWFkeS1QRU5ESU5HXG4gICAgLy8gY2FsbGVyIHJ1biB3aGVuIGFub3RoZXIgb25lIHF1ZXVlcyDigJQgYmVmb3JlIGl0cyBqb2IgKGFuZCB0aGUgcmV1c2FibGUgd29ya2Zsb3cncyBvd25cbiAgICAvLyBqb2ItbGV2ZWwgYHF1ZXVlOiBtYXhgKSBldmVyIHN0YXJ0cyDigJQgc2lsZW50bHkgZHJvcHBpbmcgdGhhdCByZWxlYXNlIHRyaWdnZXIuXG4gICAgLy8gVGhlIGNhbGxlci1sZXZlbCBncm91cCBtdXN0IE5PVCByZXVzZSB0aGUgcmV1c2FibGUgd29ya2Zsb3cncyBqb2ItbGV2ZWwgZ3JvdXAgbmFtZVxuICAgIC8vIChgcmVsZWFzZS0ke3sgZ2l0aHViLnJlcG9zaXRvcnkgfX1gKTogd29ya2Zsb3ctbGV2ZWwgYW5kIGpvYi1sZXZlbCBncm91cHMgc2hhcmUgb25lXG4gICAgLy8gcmVwb3NpdG9yeS13aWRlIG5hbWVzcGFjZSwgYW5kIGlkZW50aWNhbCBuYW1lcyBkZWFkbG9jayB0aGUgcnVuIChcIkNhbmNlbGluZyBzaW5jZSBhXG4gICAgLy8gZGVhZGxvY2sgZm9yIGNvbmN1cnJlbmN5IGdyb3VwIC4uLiB3YXMgZGV0ZWN0ZWQgYmV0d2VlbiAndG9wIGxldmVsIHdvcmtmbG93JyBhbmQgJzxqb2I+J1wiKS5cbiAgICBjb25jdXJyZW5jeToge1xuICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19JyxcbiAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiBmYWxzZSxcbiAgICAgIHF1ZXVlOiAnbWF4JyxcbiAgICB9LFxuICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAvLyBodHRwczovL2RvY3MubnBtanMuY29tL3RydXN0ZWQtcHVibGlzaGVycyNzdGVwLTItY29uZmlndXJlLXlvdXItY2ljZC13b3JrZmxvd1xuICAgICAgJ2lkLXRva2VuJzogJ3dyaXRlJyxcbiAgICAgIC8vIGZvciBzZW1hbnRpYy1yZWxlYXNlXG4gICAgICBjb250ZW50czogJ3dyaXRlJyxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgIHJlbGVhc2U6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9yZWxlYXNlLnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ3NlbWFudGljLXByJzoge1xuICAgIG5hbWU6ICdMaW50IFBSIHRpdGxlJyxcbiAgICBvbjoge1xuICAgICAgcHVsbF9yZXF1ZXN0X3RhcmdldDoge1xuICAgICAgICB0eXBlczogWydvcGVuZWQnLCAnZWRpdGVkJywgJ3N5bmNocm9uaXplJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ3NlbWFudGljLXByJzoge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3NlbWFudGljLXByLnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgc3luYzoge1xuICAgIG5hbWU6ICdTeW5jJyxcbiAgICBvbjoge30sXG4gICAgcGVybWlzc2lvbnM6IHtcbiAgICAgIC8vIGZvciBjb21taXRpbmcgY2hhbmdlc1xuICAgICAgY29udGVudHM6ICd3cml0ZScsXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICBzeW5jOiB7IHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3Mvc3luYy55bWxAbWFpbicgfSxcbiAgICB9LFxuICB9LFxuICAnY2xvc2UtY29tbWVudCc6IHtcbiAgICBuYW1lOiAnQWRkIGNsb3NlIGNvbW1lbnQnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3Q6IHtcbiAgICAgICAgdHlwZXM6IFsnb3BlbmVkJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ2Nsb3NlLWNvbW1lbnQnOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvY2xvc2UtY29tbWVudC55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG59IGFzIGNvbnN0O1xuXG50eXBlIEtub3duS2luZCA9IGtleW9mIHR5cGVvZiB3b3JrZmxvd3MgfCAnZGVwbG95JztcblxuLyoqXG4gKiBQYXJzZXMgYSBgdXNlczpgIHZhbHVlIGNhbGxpbmcgb25lIG9mIFdpbGxCb29zdGVyJ3Mgb3duIHJldXNhYmxlIHdvcmtmbG93cyAob3IgdGhlXG4gKiBXaWxsQm9vc3RlckxhYiBzeW5jIG1pcnJvcikgaW50byB0aGUgd29ya2Zsb3cgbmFtZSAod2l0aG91dCBleHRlbnNpb24pIGFuZCBnaXQgcmVmLiBPbmx5IHRob3NlXG4gKiBmb2xsb3cgdGhlIGNvbnRyYWN0IHdiZnkgZW5mb3JjZXMg4oCUIGNhbGxlcnMgb2YgYW5vdGhlciBvcmdhbml6YXRpb24ncyBzYW1lLW5hbWVkIHJlcG9zaXRvcnkgYXJlXG4gKiBsZWZ0IGFsb25lLiBHaXRIdWIgdHJlYXRzIG93bmVyL3JlcG9zaXRvcnkgbmFtZXMgY2FzZS1pbnNlbnNpdGl2ZWx5LCBzbyB0aGUgY29tcGFyaXNvbiBkb2VzXG4gKiB0b28sIHdoaWxlIHRoZSB3b3JrZmxvdyBwYXRoIGFuZCByZWYgc3RheSBjYXNlLXNlbnNpdGl2ZS5cbiAqL1xuZnVuY3Rpb24gcGFyc2VPcmdSZXVzYWJsZVdvcmtmbG93Q2FsbChcbiAgdXNlczogc3RyaW5nIHwgdW5kZWZpbmVkXG4pOiB7IHdvcmtmbG93TmFtZTogc3RyaW5nOyBleHRlbnNpb246IHN0cmluZzsgcmVmOiBzdHJpbmcgfSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IG1hdGNoID0gL14oW14vXSspXFwvKFteL10rKVxcL1xcLmdpdGh1YlxcL3dvcmtmbG93c1xcLyhbXi9AXSs/KVxcLih5YT9tbClAKC4rKSQvdS5leGVjKHVzZXMgPz8gJycpO1xuICBpZiAoIW1hdGNoKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBvd25lciA9IG1hdGNoWzFdIS50b0xvd2VyQ2FzZSgpO1xuICBpZiAoKG93bmVyICE9PSAnd2lsbGJvb3N0ZXInICYmIG93bmVyICE9PSAnd2lsbGJvb3N0ZXJsYWInKSB8fCBtYXRjaFsyXSEudG9Mb3dlckNhc2UoKSAhPT0gJ3JldXNhYmxlLXdvcmtmbG93cycpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiB7IHdvcmtmbG93TmFtZTogbWF0Y2hbM10hLCBleHRlbnNpb246IG1hdGNoWzRdISwgcmVmOiBtYXRjaFs1XSEgfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlV29ya2Zsb3dzKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFyb290Q29uZmlnLmlzUmVwb1Zpc2liaWxpdHlLbm93bikge1xuICAgIGNvbnNvbGUud2FybignU2tpcHBlZCB3b3JrZmxvdyBnZW5lcmF0aW9uIGJlY2F1c2UgcmVwb3NpdG9yeSB2aXNpYmlsaXR5IGlzIHVua25vd24uJyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHdvcmtmbG93c1BhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicsICd3b3JrZmxvd3MnKTtcbiAgaWYgKCFpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyhyb290Q29uZmlnLnJlcG9zaXRvcnkpICYmIChhd2FpdCBmc1V0aWwuaXNDb25maW5lZFdyaXRhYmxlUGF0aCh3b3JrZmxvd3NQYXRoKSkpIHtcbiAgICBhd2FpdCBhc3NlcnRQcml2YXRlV29ya2Zsb3dSdW5uZXJzKHJvb3RDb25maWcsIHdvcmtmbG93c1BhdGgpO1xuICB9XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVXb3JrZmxvdycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8ocm9vdENvbmZpZy5yZXBvc2l0b3J5KSkge1xuICAgICAgLy8gRG9uJ3QgdG91Y2ggcmV1c2FibGUtd29ya2Zsb3dzIHJlcG8gYmVjYXVzZSBpdCBob3N0cyB1cHN0cmVhbSB3b3JrZmxvdyBkZWZpbml0aW9ucy5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBXaXRoIC5naXRodWIgb3IgLmdpdGh1Yi93b3JrZmxvd3Mgc3ltbGlua2VkIG91dHNpZGUgdGhlIHJlcG9zaXRvcnksIHdyaXRlWWFtbCdzIGd1YXJkc1xuICAgIC8vIGFscmVhZHkgcmVmdXNlIHRoZSB3cml0ZXMsIGJ1dCByZWFkZGlyL3JtIGJlbG93IHdvdWxkIHN0aWxsIGVudW1lcmF0ZSBhbmQgREVMRVRFIGZpbGVzXG4gICAgLy8gb3V0c2lkZSB0aGUgcmVwb3NpdG9yeSDigJQgc28gcmVxdWlyZSB0aGUgZGlyZWN0b3J5IHRvIHJlc29sdmUgaW5zaWRlIGl0IGJlZm9yZSBhbnlcbiAgICAvLyB0cmF2ZXJzYWwsIG1rZGlyLCBvciBjbGVhbnVwLlxuICAgIGlmICghKGF3YWl0IGZzVXRpbC5pc0NvbmZpbmVkV3JpdGFibGVQYXRoKHdvcmtmbG93c1BhdGgpKSkge1xuICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIGdlbmVyYXRpbmcgd29ya2Zsb3dzIGJlY2F1c2UgJHt3b3JrZmxvd3NQYXRofSByZXNvbHZlcyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2Rpcih3b3JrZmxvd3NQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIGNvbnN0IGVudHJpZXMgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKHdvcmtmbG93c1BhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICAvLyB3YmZ5IHdyaXRlcyAueW1sIHdvcmtmbG93cywgc28gZWFjaCBraW5kIG1hcHMgdG8gaXRzIC55bWwgZmlsZS5cbiAgICBjb25zdCBmaWxlTmFtZXNCeUtpbmQgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgaWYgKCFlbnRyeS5pc0ZpbGUoKSB8fCAhZW50cnkubmFtZS5lbmRzV2l0aCgnLnltbCcpKSBjb250aW51ZTtcbiAgICAgIGZpbGVOYW1lc0J5S2luZC5zZXQoZW50cnkubmFtZS5zbGljZSgwLCAtJy55bWwnLmxlbmd0aCksIGVudHJ5Lm5hbWUpO1xuICAgIH1cbiAgICBjb25zdCBtYW5kYXRvcnlLaW5kcyA9IFsndGVzdCcsICdzZW1hbnRpYy1wcicsICdjbG9zZS1jb21tZW50J107XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLnNlbWFudGljUmVsZWFzZSkge1xuICAgICAgbWFuZGF0b3J5S2luZHMucHVzaCgncmVsZWFzZScpO1xuICAgIH1cbiAgICBpZiAocm9vdENvbmZpZy5jYXJnb1RvbWxEaXJQYXRocy5sZW5ndGggPiAwKSB7XG4gICAgICBtYW5kYXRvcnlLaW5kcy5wdXNoKCd0ZXN0LXJ1c3QnKTtcbiAgICB9XG4gICAgLy8gQSBwcmV2aW91cyBydW4gbWF5IGhhdmUgbWlzdGFrZW4gYSBnaXRpZ25vcmVkIHRoaXJkLXBhcnR5IGNoZWNrb3V0IGZvciByZXBvc2l0b3J5IFJ1c3QgY29kZS5cbiAgICAvLyBSZW1vdmUgb25seSB0aGUgZ2VuZXJhdGVkLXN0eWxlIGNhbGxlcjogYSBzYW1lLW5hbWVkIGN1c3RvbSB3b3JrZmxvdyB3aXRoIGFueSBvdGhlciBqb2Igc3RheXMuXG4gICAgaWYgKHJvb3RDb25maWcuY2FyZ29Ub21sRGlyUGF0aHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zdCB0ZXN0UnVzdEZpbGVOYW1lID0gZmlsZU5hbWVzQnlLaW5kLmdldCgndGVzdC1ydXN0Jyk7XG4gICAgICBpZiAodGVzdFJ1c3RGaWxlTmFtZSAmJiBqb2JzQWxsQ2FsbFJldXNhYmxlV29ya2Zsb3cod29ya2Zsb3dzUGF0aCwgdGVzdFJ1c3RGaWxlTmFtZSwgJ3Rlc3QtcnVzdCcpKSB7XG4gICAgICAgIGZpbGVOYW1lc0J5S2luZC5kZWxldGUoJ3Rlc3QtcnVzdCcpO1xuICAgICAgICBhd2FpdCBmc1V0aWwucmVtb3ZlQ29uZmluZWQocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsIHRlc3RSdXN0RmlsZU5hbWUpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZmlsZU5hbWVzQnlLaW5kLmRlbGV0ZSgnd2JmeScpO1xuICAgIGZvciAoY29uc3Qga2luZCBvZiBtYW5kYXRvcnlLaW5kcykge1xuICAgICAgaWYgKCFmaWxlTmFtZXNCeUtpbmQuaGFzKGtpbmQpKSB7XG4gICAgICAgIGZpbGVOYW1lc0J5S2luZC5zZXQoa2luZCwgYCR7a2luZH0ueW1sYCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChmaWxlTmFtZXNCeUtpbmQuaGFzKCdzeW5jJykpIHtcbiAgICAgIC8vIFRoZSBzeW5jIHdvcmtmbG93J3MgZ2VuZXJhdGlvbiBvd25zIHRoZSBmb3JjZS1zeW5jIHdvcmtmbG93LCBzbyBwcm9jZXNzaW5nIGl0IGFzIGFuXG4gICAgICAvLyBpbmRlcGVuZGVudCBraW5kIHdvdWxkIHJhY2UgY29uY3VycmVudCB3cml0ZXMgb24gdGhlIHNhbWUgcGF0aC5cbiAgICAgIGZpbGVOYW1lc0J5S2luZC5kZWxldGUoJ3N5bmMtZm9yY2UnKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtraW5kLCBmaWxlTmFtZV0gb2YgZmlsZU5hbWVzQnlLaW5kKSB7XG4gICAgICAvLyDlrp/pmpvjga9Lbm93bktpbmTku6XlpJbjga7lgKTjgoLku6PlhaXjgZXjgozjgovjgZPjgajjgavms6jmhI9cbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiB3cml0ZVdvcmtmbG93WWFtbChyb290Q29uZmlnLCB3b3JrZmxvd3NQYXRoLCBraW5kIGFzIEtub3duS2luZCwgZmlsZU5hbWUpKTtcbiAgICB9XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8ocmVwb3NpdG9yeT86IHN0cmluZyk6IGJvb2xlYW4ge1xuICAvLyBDYXNlLWluc2Vuc2l0aXZlOiBHaXRIdWIgcmVwb3NpdG9yeSBuYW1lcyBhcmUsIGFuZCBhIHJlbW90ZSBtYXkgc3BlbGwgdGhpcyBvbmUgYW55IHdheS4gR2V0dGluZyBpdCB3cm9uZ1xuICAvLyBsZXRzIHdiZnkgcmV3cml0ZSB0aGUgcmVwb3NpdG9yeSB0aGF0IGhvc3RzIHRoZSB1cHN0cmVhbSB3b3JrZmxvdyBkZWZpbml0aW9ucy5cbiAgcmV0dXJuIHJlcG9zaXRvcnk/LnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoJy9yZXVzYWJsZS13b3JrZmxvd3MnKSA/PyBmYWxzZTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGV2ZXJ5IGpvYiBvZiB0aGUgd29ya2Zsb3cgZmlsZSBjYWxscyB0aGUgbmFtZWQgV2lsbEJvb3N0ZXIgcmV1c2FibGUgd29ya2Zsb3cgKG93bmVyXG4gKiByZXN0cmljdGVkIHZpYSBwYXJzZU9yZ1JldXNhYmxlV29ya2Zsb3dDYWxsKS4gVXNlZCB0byBkZWNpZGUgd2hldGhlciB3YmZ5IG93bnMgYSBmaWxlIGVub3VnaCB0b1xuICogZGVsZXRlIGl0OiB1bnBhcnNhYmxlIGZpbGVzIGFuZCBmaWxlcyB3aXRoIGFueSBvdGhlciBqb2IgcmV0dXJuIGZhbHNlIOKAlCBkZWxldGluZyBhIHdob2xlXG4gKiB3b3JrZmxvdyBvbiBhIGxvb3NlIG1hdGNoIHdvdWxkIGJlIHRvbyBhZ2dyZXNzaXZlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gam9ic0FsbENhbGxSZXVzYWJsZVdvcmtmbG93KHdvcmtmbG93c1BhdGg6IHN0cmluZywgZmlsZU5hbWU6IHN0cmluZywgd29ya2Zsb3dOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKCFmaWxlTmFtZS5lbmRzV2l0aCgnLnltbCcpKSByZXR1cm4gZmFsc2U7XG4gIGxldCBjb250ZW50OiBzdHJpbmc7XG4gIHRyeSB7XG4gICAgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgZmlsZU5hbWUpLCAndXRmOCcpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgaXNUYXJnZXRDYWxsID0gKHVzZXM6IHVua25vd24pOiBib29sZWFuID0+XG4gICAgdHlwZW9mIHVzZXMgPT09ICdzdHJpbmcnICYmIHBhcnNlT3JnUmV1c2FibGVXb3JrZmxvd0NhbGwodXNlcyk/LndvcmtmbG93TmFtZSA9PT0gd29ya2Zsb3dOYW1lO1xuICB0cnkge1xuICAgIGNvbnN0IHdvcmtmbG93ID0geWFtbC5sb2FkKGNvbnRlbnQpIGFzIFdvcmtmbG93IHwgdW5kZWZpbmVkO1xuICAgIGlmICh3b3JrZmxvdyAmJiB0eXBlb2Ygd29ya2Zsb3cgPT09ICdvYmplY3QnICYmIHdvcmtmbG93LmpvYnMgJiYgdHlwZW9mIHdvcmtmbG93LmpvYnMgPT09ICdvYmplY3QnKSB7XG4gICAgICBjb25zdCBqb2JzID0gT2JqZWN0LnZhbHVlcyh3b3JrZmxvdy5qb2JzKTtcbiAgICAgIHJldHVybiBqb2JzLmxlbmd0aCA+IDAgJiYgam9icy5ldmVyeSgoam9iKSA9PiBpc1RhcmdldENhbGwoam9iPy51c2VzKSk7XG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICAvLyBVbnBhcnNhYmxlIGNvbnRlbnQgaXMgbm90IHByb3ZhYmx5IGEgY2FsbGVyIG9mIHRoZSBuYW1lZCB3b3JrZmxvdy5cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlV29ya2Zsb3dZYW1sKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHdvcmtmbG93c1BhdGg6IHN0cmluZyxcbiAga2luZDogS25vd25LaW5kLFxuICBmaWxlTmFtZSA9IGAke2tpbmR9LnltbGBcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCBmaWxlTmFtZSk7XG4gIGNvbnN0IGRlcGxveVByb2R1Y3Rpb25GaWxlTmFtZSA9IGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsICdkZXBsb3ktcHJvZHVjdGlvbi55bWwnKSlcbiAgICA/ICdkZXBsb3ktcHJvZHVjdGlvbi55bWwnXG4gICAgOiB1bmRlZmluZWQ7XG5cbiAgLy8gQSBub24tZ2VuZXJhdGVkIHRlc3QtcnVzdC55bWwgaW4gYSByZXBvIHdpdGhvdXQgUnVzdCBjb2RlIG1lcmVseSBzaGFyZXMgdGhlIG5hbWU7IGxlYXZlIGl0IGFsb25lLlxuICBpZiAoa2luZCA9PT0gJ3Rlc3QtcnVzdCcgJiYgY29uZmlnLmNhcmdvVG9tbERpclBhdGhzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gIGxldCBuZXdTZXR0aW5ncyA9IHN0cnVjdHVyZWRDbG9uZShraW5kIGluIHdvcmtmbG93cyA/IHdvcmtmbG93c1traW5kIGFzIGtleW9mIHR5cGVvZiB3b3JrZmxvd3NdIDoge30pIGFzIFdvcmtmbG93O1xuICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpO1xuICBpZiAob2xkQ29udGVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgbGV0IG9sZFNldHRpbmdzOiBXb3JrZmxvdztcbiAgICB0cnkge1xuICAgICAgb2xkU2V0dGluZ3MgPSB5YW1sLmxvYWQob2xkQ29udGVudCkgYXMgV29ya2Zsb3c7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBBbiBleGlzdGluZyB3b3JrZmxvdyB3YmZ5IGNhbm5vdCBwYXJzZSBtdXN0IGJlIGxlZnQgdW50b3VjaGVkOiB3cml0aW5nIHRoZSB0ZW1wbGF0ZVxuICAgICAgLy8gd2l0aG91dCBtZXJnaW5nIHdvdWxkIHNpbGVudGx5IGRpc2NhcmQgdGhlIHJlcG9zaXRvcnkncyB3b3JrZmxvdy5cbiAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCBnZW5lcmF0aW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgdGhlIGV4aXN0aW5nIGNvbnRlbnQgaXMgbm90IHBhcnNhYmxlIGFzIFlBTUwuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIHlhbWwubG9hZCByZXR1cm5zIHVuZGVmaW5lZCBmb3IgZW1wdHkvY29tbWVudC1vbmx5IGZpbGVzIGFuZCBub24tb2JqZWN0cyBmb3Igc2NhbGFyXG4gICAgLy8gZG9jdW1lbnRzIHdpdGhvdXQgdGhyb3dpbmc7IGRlZXBtZXJnZSB3b3VsZCBjcmFzaCBvbiB0aGVtLlxuICAgIGlmICh0eXBlb2Ygb2xkU2V0dGluZ3MgIT09ICdvYmplY3QnIHx8IG9sZFNldHRpbmdzID09PSBudWxsIHx8IEFycmF5LmlzQXJyYXkob2xkU2V0dGluZ3MpKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgZ2VuZXJhdGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIHRoZSBleGlzdGluZyBjb250ZW50IGlzIG5vdCBhIHdvcmtmbG93LmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHsgYXJyYXlNZXJnZTogY29tYmluZU1lcmdlIH0pIGFzIFdvcmtmbG93O1xuICB9XG5cbiAgaWYgKCEoJ2pvYnMnIGluIG5ld1NldHRpbmdzKSkgcmV0dXJuO1xuXG4gIGlmIChraW5kLnN0YXJ0c1dpdGgoJ2RlcGxveScpKSB7XG4gICAgbmV3U2V0dGluZ3MgPSB7XG4gICAgICAuLi5uZXdTZXR0aW5ncyxcbiAgICAgIC8vIFVubGlrZSB0aGUgcmVsZWFzZSBjYWxsZXIsIHRoZSBkZWZhdWx0IHF1ZXVlIChgc2luZ2xlYCkgaXMgaW50ZW50aW9uYWwgaGVyZTogYSBwZW5kaW5nXG4gICAgICAvLyBkZXBsb3kgdGhhdCBpcyBjYW5jZWxsZWQgYW5kIHJlcGxhY2VkIGJ5IGEgbmV3ZXIgb25lIGxvc2VzIG5vdGhpbmcg4oCUIHRoZSBuZXdlciBkZXBsb3lcbiAgICAgIC8vIGNvbnZlcmdlcyB0aGUgZW52aXJvbm1lbnQgdG8gdGhlIGxhdGVzdCBzdGF0ZSBhbnl3YXkuXG4gICAgICBjb25jdXJyZW5jeToge1xuICAgICAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0nLFxuICAgICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogZmFsc2UsXG4gICAgICB9LFxuICAgIH07XG4gICAgbW92ZVRvQm90dG9tKG5ld1NldHRpbmdzLCAnam9icycpO1xuICAgIGlmIChuZXdTZXR0aW5ncy5vbj8ucHVzaCkge1xuICAgICAgbmV3U2V0dGluZ3Mub24ucHVzaFsncGF0aHMtaWdub3JlJ10gPSBbXG4gICAgICAgIC4uLm5ldyBTZXQoWycqKi5tZCcsICcqKi9kb2NzLyoqJywgLi4uKG5ld1NldHRpbmdzLm9uLnB1c2hbJ3BhdGhzLWlnbm9yZSddID8/IFtdKV0pLFxuICAgICAgXTtcbiAgICB9XG4gIH1cblxuICBpZiAoa2luZCA9PT0gJ3JlbGVhc2UnICYmIG5ld1NldHRpbmdzLmpvYnMucmVsZWFzZSAmJiBkZXBsb3lQcm9kdWN0aW9uRmlsZU5hbWUpIHtcbiAgICBuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucyA/Pz0ge307XG4gICAgbmV3U2V0dGluZ3MucGVybWlzc2lvbnMuYWN0aW9ucyA9ICd3cml0ZSc7XG4gICAgbmV3U2V0dGluZ3Muam9icy5yZWxlYXNlLndpdGggPz89IHt9O1xuICAgIG5ld1NldHRpbmdzLmpvYnMucmVsZWFzZS53aXRoLnRyaWdnZXJfZGVwbG95X3dvcmtmbG93ID0gZGVwbG95UHJvZHVjdGlvbkZpbGVOYW1lO1xuICB9XG5cbiAgbGV0IGlzUmV1c2FibGVXb3JrZmxvdyA9IGZhbHNlO1xuICBmb3IgKGNvbnN0IGpvYiBvZiBPYmplY3QudmFsdWVzKG5ld1NldHRpbmdzLmpvYnMpKSB7XG4gICAgLy8gSWdub3JlIGVtcHR5IGpvYnMgKGEgYmFyZSBgam9iTmFtZTpgIHBhcnNlcyBhcyBudWxsKSwgbm9uLXJldXNhYmxlIHdvcmtmbG93cywgYW5kIG90aGVyXG4gICAgLy8gb3JnYW5pemF0aW9ucycgcmV1c2FibGUgd29ya2Zsb3dzOiBhIHNhbWUtbmFtZWQgYHJldXNhYmxlLXdvcmtmbG93c2AgcmVwb3NpdG9yeSBlbHNld2hlcmVcbiAgICAvLyBmb2xsb3dzIGEgZGlmZmVyZW50IGNvbnRyYWN0LCBhbmQgbm9ybWFsaXppbmcgaXRzIGNhbGxlcnMgKHNlY3JldCBpbmplY3Rpb24vcmVtb3ZhbCxcbiAgICAvLyBwZXJtaXNzaW9ucykgY291bGQgYnJlYWsgdGhlbS5cbiAgICBpZiAoIWpvYiB8fCAhcGFyc2VPcmdSZXVzYWJsZVdvcmtmbG93Q2FsbChqb2IudXNlcykpIGNvbnRpbnVlO1xuXG4gICAgbm9ybWFsaXplSm9iKGNvbmZpZywgam9iLCBraW5kKTtcbiAgICBpc1JldXNhYmxlV29ya2Zsb3cgPSB0cnVlO1xuICB9XG4gIGlmICghaXNSZXVzYWJsZVdvcmtmbG93KSByZXR1cm47XG5cbiAgLy8gRGVwbG95IGNhbGxlcnMgbmVlZCBubyByZXBvc2l0b3J5IHdyaXRlczogdGhlIGNhbGxlZCByZXVzYWJsZSB3b3JrZmxvdyBpbmhlcml0cyB0aGUgY2FsbGVyJ3NcbiAgLy8gdG9rZW4gcGVybWlzc2lvbnMsIHJlcG9zaXRvcmllcyBkZWZhdWx0IHRoZSB0b2tlbiB0byB3cml0ZSwgYW5kIHRoZSByZXVzYWJsZSBkZXBsb3kgd29ya2Zsb3dcbiAgLy8gYXQgbWFpbiBwZXJmb3JtcyBubyBHSVRIVUJfVE9LRU4gd3JpdGVzLiBUaGUgcmVhZC1vbmx5IGRlZmF1bHQgaXMgaW5qZWN0ZWQgYXQgdGhlIEpPQiBsZXZlbFxuICAvLyAoam9iIHBlcm1pc3Npb25zIGRvIG5vdCBhZmZlY3Qgc2libGluZyBqb2JzLCBzbyBpbmxpbmUgam9icyBvciBwaW5uZWQgY2FsbGVlcyDigJQgd2hvc2Ugd3JpdGVcbiAgLy8gbmVlZHMgYXJlIHVuYXVkaXRlZCDigJQga2VlcCB0aGVpcnMpLCBhbmQgb25seSB3aGVuIG5laXRoZXIgdGhlIHdvcmtmbG93IG5vciB0aGUgam9iIGRlY2xhcmVzXG4gIC8vIGl0cyBvd24gcGVybWlzc2lvbnMgKE9JREMgZGVwbG95cyBhbHdheXMgZG8sIGZvciBpZC10b2tlbikuIHJ1bi1zY3JpcHQgY2FsbGVycyBhcmUgZXhjbHVkZWRcbiAgLy8gYmVjYXVzZSBhcmJpdHJhcnkgcGFja2FnZSBzY3JpcHRzIG1heSBwdXNoIGNvbW1pdHMuXG4gIGlmICghbmV3U2V0dGluZ3MucGVybWlzc2lvbnMpIHtcbiAgICBmb3IgKGNvbnN0IGpvYiBvZiBPYmplY3QudmFsdWVzKG5ld1NldHRpbmdzLmpvYnMpKSB7XG4gICAgICBpZiAoIWpvYikgY29udGludWU7XG4gICAgICBjb25zdCBjYWxsID0gcGFyc2VPcmdSZXVzYWJsZVdvcmtmbG93Q2FsbChqb2IudXNlcyk7XG4gICAgICBpZiAoIWpvYi5wZXJtaXNzaW9ucyAmJiBjYWxsPy53b3JrZmxvd05hbWUgPT09ICdkZXBsb3knICYmIGNhbGwucmVmID09PSAnbWFpbicpIHtcbiAgICAgICAgam9iLnBlcm1pc3Npb25zID0geyBjb250ZW50czogJ3JlYWQnIH07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc3dpdGNoIChraW5kKSB7XG4gICAgY2FzZSAncmVsZWFzZSc6IHtcbiAgICAgIGlmIChuZXdTZXR0aW5ncy5vbj8uc2NoZWR1bGUpIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLm9uLnB1c2g7XG4gICAgICB9IGVsc2UgaWYgKG5ld1NldHRpbmdzLm9uPy5wdXNoICYmIGNvbmZpZy5yZWxlYXNlLmJyYW5jaGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbmV3U2V0dGluZ3Mub24ucHVzaC5icmFuY2hlcyA9IGNvbmZpZy5yZWxlYXNlLmJyYW5jaGVzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXdhaXQgZnNVdGlsLnJlbW92ZUNvbmZpbmVkKGZpbGVQYXRoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5pc1B1YmxpY1JlcG8pIHtcbiAgICAgICAgbmV3U2V0dGluZ3MucGVybWlzc2lvbnMgPz89IHt9O1xuICAgICAgICBuZXdTZXR0aW5ncy5wZXJtaXNzaW9uc1snaWQtdG9rZW4nXSA9ICd3cml0ZSc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3MucGVybWlzc2lvbnM/LlsnaWQtdG9rZW4nXTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlICd0ZXN0JzpcbiAgICBjYXNlICd0ZXN0LXJ1c3QnOiB7XG4gICAgICAvLyBEb24ndCB1c2UgYHBhdGhzLWlnbm9yZWAgZm9yIHRlc3QgYmVjYXVzZSBHaXRIdWIncyBCcmFuY2ggUHJvdGVjdGlvbiBhbmQgUnVsZXNldHMgcmVxdWlyZSBqb2IgcnVubmluZy5cbiAgICAgIGlmIChuZXdTZXR0aW5ncy5vbj8ucHVsbF9yZXF1ZXN0KSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5vbi5wdWxsX3JlcXVlc3RbJ3BhdGhzLWlnbm9yZSddO1xuICAgICAgfVxuICAgICAgaWYgKG5ld1NldHRpbmdzLm9uPy5wdXNoKSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5vbi5wdXNoWydwYXRocy1pZ25vcmUnXTtcbiAgICAgICAgbmV3U2V0dGluZ3Mub24ucHVzaC5icmFuY2hlcyA9IG5ld1NldHRpbmdzLm9uLnB1c2guYnJhbmNoZXMuZmlsdGVyKChicmFuY2gpID0+IGJyYW5jaCAhPT0gJ3Jlbm92YXRlLyoqJyk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgYXdhaXQgd3JpdGVZYW1sKG5ld1NldHRpbmdzLCBmaWxlUGF0aCk7XG5cbiAgaWYgKGtpbmQgPT09ICdzeW5jJykge1xuICAgIGlmICghbmV3U2V0dGluZ3Muam9icy5zeW5jPy53aXRoKSByZXR1cm47XG5cbiAgICAvLyBHZW5lcmF0ZSB0aGUgZm9yY2Utc3luYyB3b3JrZmxvdyBiYXNlZCBvbiB0aGUgc3luYyB3b3JrZmxvdyBpZiBpdCBleGlzdHMuXG4gICAgbmV3U2V0dGluZ3Muam9ic1snc3luYy1mb3JjZSddID0gbmV3U2V0dGluZ3Muam9icy5zeW5jO1xuICAgIGNvbnN0IHBhcmFtcyA9IG5ld1NldHRpbmdzLmpvYnMuc3luYy53aXRoLnN5bmNfcGFyYW1zX3dpdGhvdXRfZGVzdDtcbiAgICBpZiAodHlwZW9mIHBhcmFtcyAhPT0gJ3N0cmluZycpIHJldHVybjtcblxuICAgIG5ld1NldHRpbmdzLmpvYnMuc3luYy53aXRoLnN5bmNfcGFyYW1zX3dpdGhvdXRfZGVzdCA9IGAtLWZvcmNlICR7cGFyYW1zfWA7XG4gICAgbmV3U2V0dGluZ3MubmFtZSA9ICdGb3JjZSB0byBTeW5jJztcbiAgICBuZXdTZXR0aW5ncy5vbiA9IHsgd29ya2Zsb3dfZGlzcGF0Y2g6IG51bGwgfTtcbiAgICBkZWxldGUgbmV3U2V0dGluZ3Muam9icy5zeW5jO1xuICAgIGF3YWl0IHdyaXRlWWFtbChuZXdTZXR0aW5ncywgcGF0aC5qb2luKHdvcmtmbG93c1BhdGgsICdzeW5jLWZvcmNlLnltbCcpKTtcbiAgfVxufVxuXG4vLyB3YidzIGdsb2JhbCBvcHRpb25zIHRoYXQgY29uc3VtZSBhIGZvbGxvd2luZyB2YWx1ZSB0b2tlbiAoZnJvbSBzaGFyZWRPcHRpb25zQnVpbGRlciBwbHVzXG4vLyB5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52KTsgZXZlcnkgb3RoZXIgYC1gLXByZWZpeGVkIHRva2VuIGJlZm9yZSB0aGUgc3ViY29tbWFuZCBpcyBhIGJvb2xlYW4uXG5jb25zdCB3Ykdsb2JhbFZhbHVlT3B0aW9ucyA9IG5ldyBTZXQoWyctLXdvcmtpbmctZGlyJywgJy13JywgJy0tZW52JywgJy0tY2FzY2FkZS1lbnYnXSk7XG5cbi8vIFN1YmNvbW1hbmRzIHRoYXQgcnVuIGEgQklOQVJZIChzbyB0aGUgZm9sbG93aW5nIHRva2VuIGNhbiBiZSB0aGUgd2IgZXhlY3V0YWJsZSksIHBlciBydW5uZXI6IGJ1blxuLy8gcmVzZXJ2ZXMgb25seSBgeGAgKGBidW4gZGx4YC9gYnVuIGV4ZWNgIHJ1biBhIHBhY2thZ2Ugc2NyaXB0IG9mIHRoYXQgbmFtZSksIG5wbSBoYXMgYGV4ZWNgL2B4YCxcbi8vIGFuZCBwbnBtL3lhcm4gKEJlcnJ5KSBoYXZlIGBleGVjYC9gZGx4YC5cbmNvbnN0IHJ1bm5lckV4ZWN1dG9yU3ViY29tbWFuZHNCeVJ1bm5lcjogUmVjb3JkPHN0cmluZywgU2V0PHN0cmluZz4+ID0ge1xuICBucG06IG5ldyBTZXQoWydleGVjJywgJ3gnXSksXG4gIHBucG06IG5ldyBTZXQoWydleGVjJywgJ2RseCddKSxcbiAgeWFybjogbmV3IFNldChbJ2V4ZWMnLCAnZGx4J10pLFxuICBidW46IG5ldyBTZXQoWyd4J10pLFxufTtcblxuLy8gUnVubmVyIG9wdGlvbnMgdGhhdCBjb25zdW1lIHRoZSBGT0xMT1dJTkcgdG9rZW4gYXMgdGhlaXIgdmFsdWUsIHNvIGl0IGlzIG5vdCB0aGUgd2IgZXhlY3V0YWJsZVxuLy8gKGUuZy4gYGJ1biAtLWN3ZCBkaXIgd2IgZGVwbG95YCwgYG5weCAtcCBwa2cgd2IgZGVwbG95YCkuIEEgY29uc2VydmF0aXZlIHN1cGVyc2V0IGFjcm9zc1xuLy8gbnBtL3BucG0veWFybi9idW4gYW5kIHRoZSBucHgvYnVueCBwYWNrYWdlIGV4ZWN1dG9ycy5cbmNvbnN0IHJ1bm5lclZhbHVlT3B0aW9ucyA9IG5ldyBTZXQoW1xuICAnLS1jd2QnLFxuICAnLUMnLFxuICAnLS1wcmVmaXgnLFxuICAnLS1maWx0ZXInLFxuICAnLUYnLFxuICAnLS13b3Jrc3BhY2UnLFxuICAnLXcnLFxuICAnLS1kaXInLFxuICAnLXAnLFxuICAnLS1wYWNrYWdlJyxcbiAgJy1jJyxcbiAgJy0tY2FsbCcsXG5dKTtcblxuLyoqIEFkdmFuY2UgcGFzdCBhIHJ1bm5lcidzIG9wdGlvbnMsIGNvbnN1bWluZyBhIHNlcGFyYXRlIHZhbHVlIHRva2VuIHdoZXJlIG9uZSBhcHBsaWVzLiAqL1xuZnVuY3Rpb24gc2tpcFJ1bm5lck9wdGlvbnModG9rZW5zOiBzdHJpbmdbXSwgc3RhcnRJbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgbGV0IGluZGV4ID0gc3RhcnRJbmRleDtcbiAgd2hpbGUgKGluZGV4IDwgdG9rZW5zLmxlbmd0aCAmJiAodG9rZW5zW2luZGV4XSA/PyAnJykuc3RhcnRzV2l0aCgnLScpKSB7XG4gICAgY29uc3Qgb3B0aW9uID0gdG9rZW5zW2luZGV4XSA/PyAnJztcbiAgICBpbmRleCsrO1xuICAgIGlmICghb3B0aW9uLmluY2x1ZGVzKCc9JykgJiYgcnVubmVyVmFsdWVPcHRpb25zLmhhcyhvcHRpb24pICYmIGluZGV4IDwgdG9rZW5zLmxlbmd0aCkgaW5kZXgrKztcbiAgfVxuICByZXR1cm4gaW5kZXg7XG59XG5cbi8qKlxuICogVG9rZW5pemUgYSBzaGVsbCBjb21tYW5kIGxpbmUgaW50byBjb21tYW5kIHNlZ21lbnRzLCBlYWNoIGEgbGlzdCBvZiB0b2tlbnMgd2l0aCBxdW90ZXMgcmVtb3ZlZC5cbiAqIEEgbmV3IHNlZ21lbnQgc3RhcnRzIGF0IGFuIHVucXVvdGVkIGAmJmAvYHx8YC9gO2AvYHxgL2AmYDsgYW4gdW5xdW90ZWQgYCNgIHN0YXJ0cyBhIGNvbW1lbnQgdG9cbiAqIGVuZCBvZiBsaW5lOyBhIGJhY2tzbGFzaCBlc2NhcGVzIHRoZSBuZXh0IGNoYXJhY3RlciAoc28gYFxcO2AgaXMgYSBsaXRlcmFsLCBub3QgYSBzZXBhcmF0b3IpO1xuICogZ3JvdXBpbmcgcGFyZW50aGVzZXMgYChgL2ApYCBhcmUgdG9rZW4gc2VwYXJhdG9ycywgc28gYCh3YiBkZXBsb3kpYCB0b2tlbml6ZXMgYXMgYHdiIGRlcGxveWAuXG4gKiBTZWdtZW50cy90b2tlbnMgbW9kZWwgY29tbWFuZCBzdHJ1Y3R1cmUgcHJlY2lzZWx5IGVub3VnaCB0aGF0IHF1b3RlZCBvcGVyYXRvcnMsIGVzY2FwZWRcbiAqIG9wZXJhdG9ycywgY29tbWVudHMsIGFuZCBzdWJzaGVsbCBncm91cHMgbmVpdGhlciBmYWJyaWNhdGUgbm9yIGhpZGUgYSBgd2IgZGVwbG95YCBpbnZvY2F0aW9uLlxuICovXG5mdW5jdGlvbiB0b2tlbml6ZVNoZWxsQ29tbWFuZChzY3JpcHQ6IHN0cmluZyk6IHsgc2VnbWVudHM6IHN0cmluZ1tdW107IHNhd0hlcmVkb2M6IGJvb2xlYW4gfSB7XG4gIGNvbnN0IHNlZ21lbnRzOiBzdHJpbmdbXVtdID0gW107XG4gIGxldCB0b2tlbnM6IHN0cmluZ1tdID0gW107XG4gIGxldCBjdXJyZW50ID0gJyc7XG4gIGxldCBpblRva2VuID0gZmFsc2U7XG4gIGxldCBxdW90ZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAvLyBXaGV0aGVyIHRoZSBzY3JpcHQgdXNlcyBhbnkgaGVyZWRvYy4gRmFpdGhmdWxseSBjbGFzc2lmeWluZyB3aGljaCBib2R5IGxpbmVzIGFyZSBkYXRhICh0aGVcbiAgLy8gZGVsaW1pdGVyIHdvcmQgY2FuIGJlIHF1b3RlZC9iYWNrc2xhc2gtZXNjYXBlZCwgYDw8LWAgc3RyaXBzIGxlYWRpbmcgdGFicywgdGVybWluYXRvcnMgbWF0Y2hcbiAgLy8gZXhhY3RseSkgaXMgbW9yZSB0aGFuIHRoaXMgcGFyc2VyIG1vZGVscywgc28gYSBoZXJlZG9jIGFueXdoZXJlIG1ha2VzIGRldGVjdGlvbiByZXR1cm4gZmFsc2UuXG4gIGxldCBzYXdIZXJlZG9jID0gZmFsc2U7XG4gIC8vIEhlcmVkb2MgZGVsaW1pdGVycyB3aG9zZSBib2RpZXMgYmVnaW4gYXQgdGhlIE5FWFQgbmV3bGluZTogYGNhdCA8PEEgPDxCYCBxdWV1ZXMgQSB0aGVuIEIsIGFuZFxuICAvLyB0aGUgY29tbWFuZHMgQUZURVIgdGhlIGA8PGAgaGVhZGVyIG9uIHRoZSBzYW1lIGxpbmUgc3RpbGwgZXhlY3V0ZSwgc28gdGhlIGhlYWRlciBpcyByZWNvcmRlZFxuICAvLyBoZXJlIGFuZCB0aGUgYm9kaWVzIGFyZSBza2lwcGVkIG9ubHkgd2hlbiB0aGUgbGluZSdzIG5ld2xpbmUgaXMgcmVhY2hlZC5cbiAgbGV0IHBlbmRpbmdIZXJlZG9jRGVsaW1pdGVyczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3Qgc2tpcEhlcmVkb2NCb2RpZXMgPSAoZnJvbUluZGV4OiBudW1iZXIpOiBudW1iZXIgPT4ge1xuICAgIGxldCBjdXJzb3IgPSBmcm9tSW5kZXg7XG4gICAgZm9yIChjb25zdCBkZWxpbWl0ZXIgb2YgcGVuZGluZ0hlcmVkb2NEZWxpbWl0ZXJzKSB7XG4gICAgICB3aGlsZSAoY3Vyc29yIDwgc2NyaXB0Lmxlbmd0aCkge1xuICAgICAgICBjb25zdCBsaW5lU3RhcnQgPSBjdXJzb3IgKyAxO1xuICAgICAgICBsZXQgbGluZUVuZCA9IGxpbmVTdGFydDtcbiAgICAgICAgd2hpbGUgKGxpbmVFbmQgPCBzY3JpcHQubGVuZ3RoICYmIHNjcmlwdFtsaW5lRW5kXSAhPT0gJ1xcbicpIGxpbmVFbmQrKztcbiAgICAgICAgY3Vyc29yID0gbGluZUVuZDtcbiAgICAgICAgaWYgKHNjcmlwdC5zbGljZShsaW5lU3RhcnQsIGxpbmVFbmQpLnRyaW0oKSA9PT0gZGVsaW1pdGVyKSBicmVhaztcbiAgICAgICAgaWYgKGxpbmVFbmQgPj0gc2NyaXB0Lmxlbmd0aCkgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHBlbmRpbmdIZXJlZG9jRGVsaW1pdGVycyA9IFtdO1xuICAgIHJldHVybiBjdXJzb3I7XG4gIH07XG4gIGNvbnN0IGVuZFRva2VuID0gKCk6IHZvaWQgPT4ge1xuICAgIGlmIChpblRva2VuKSB0b2tlbnMucHVzaChjdXJyZW50KTtcbiAgICBjdXJyZW50ID0gJyc7XG4gICAgaW5Ub2tlbiA9IGZhbHNlO1xuICB9O1xuICBjb25zdCBlbmRTZWdtZW50ID0gKCk6IHZvaWQgPT4ge1xuICAgIGVuZFRva2VuKCk7XG4gICAgc2VnbWVudHMucHVzaCh0b2tlbnMpO1xuICAgIHRva2VucyA9IFtdO1xuICB9O1xuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgc2NyaXB0Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgIGNvbnN0IGNoYXJhY3RlciA9IHNjcmlwdFtpbmRleF0gPz8gJyc7XG4gICAgaWYgKHF1b3RlKSB7XG4gICAgICBpZiAoY2hhcmFjdGVyID09PSAnXFxcXCcgJiYgcXVvdGUgPT09ICdcIicpIHtcbiAgICAgICAgLy8gSW5zaWRlIGRvdWJsZSBxdW90ZXMsIGJhY2tzbGFzaC1uZXdsaW5lIGlzIHN0aWxsIGEgbGluZSBjb250aW51YXRpb24gKGJvdGggcmVtb3ZlZCk7XG4gICAgICAgIC8vIGFueSBvdGhlciBlc2NhcGVkIGNoYXJhY3RlciBjb250cmlidXRlcyBsaXRlcmFsbHkuXG4gICAgICAgIGlmIChzY3JpcHRbaW5kZXggKyAxXSA9PT0gJ1xcbicpIGluZGV4Kys7XG4gICAgICAgIGVsc2UgY3VycmVudCArPSBzY3JpcHRbKytpbmRleF0gPz8gJyc7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGNoYXJhY3RlciA9PT0gcXVvdGUpIHF1b3RlID0gdW5kZWZpbmVkO1xuICAgICAgZWxzZSBjdXJyZW50ICs9IGNoYXJhY3RlcjtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoY2hhcmFjdGVyID09PSAnXFxcXCcpIHtcbiAgICAgIC8vIEJhY2tzbGFzaC1uZXdsaW5lIGlzIGEgbGluZSBjb250aW51YXRpb246IHRoZSBzaGVsbCByZW1vdmVzIGJvdGgsIGpvaW5pbmcgdGhlIGxpbmVzXG4gICAgICAvLyB3aXRob3V0IGludHJvZHVjaW5nIGEgdG9rZW4gYm91bmRhcnkuIEFueSBvdGhlciBlc2NhcGVkIGNoYXJhY3RlciBpcyBhIGxpdGVyYWwuXG4gICAgICBpZiAoc2NyaXB0W2luZGV4ICsgMV0gPT09ICdcXG4nKSB7XG4gICAgICAgIGluZGV4Kys7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY3VycmVudCArPSBzY3JpcHRbKytpbmRleF0gPz8gJyc7XG4gICAgICBpblRva2VuID0gdHJ1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoY2hhcmFjdGVyID09PSBcIidcIiB8fCBjaGFyYWN0ZXIgPT09ICdcIicpIHtcbiAgICAgIHF1b3RlID0gY2hhcmFjdGVyO1xuICAgICAgaW5Ub2tlbiA9IHRydWU7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgLy8gQSBgPDxgL2A8PC1gIGhlcmVkb2MgcmVkaXJlY3Rpb246IGl0cyBib2R5IGxpbmVzICh1cCB0byB0aGUgZGVsaW1pdGVyIGxpbmUpIGFyZSBEQVRBLCBub3RcbiAgICAvLyBjb21tYW5kcywgc28gYGNhdCA8PCdFT0YnXFxud2IgZGVwbG95XFxuRU9GYCBtdXN0IG5vdCByZWFkIGB3YiBkZXBsb3lgIGFzIGFuIGludm9jYXRpb24uIFNpbmNlXG4gICAgLy8gdGhlIGNhbGxlciBkZWNsaW5lcyBvbiBBTlkgaGVyZWRvYywgZmxhZyBpdCB0aGUgaW5zdGFudCBgPDxgIGFwcGVhcnMg4oCUIGJlZm9yZSBwYXJzaW5nIHRoZVxuICAgIC8vIGRlbGltaXRlciB3b3JkIOKAlCBzbyBhbiBleG90aWMgZGVsaW1pdGVyIChgPDwrYCkgdGhlIHdvcmQgc2Nhbm5lciBjYW5ub3QgcmVhZCBzdGlsbCBkZWNsaW5lcy5cbiAgICBpZiAoY2hhcmFjdGVyID09PSAnPCcgJiYgc2NyaXB0W2luZGV4ICsgMV0gPT09ICc8Jykge1xuICAgICAgc2F3SGVyZWRvYyA9IHRydWU7XG4gICAgICBsZXQgY3Vyc29yID0gaW5kZXggKyAyO1xuICAgICAgaWYgKHNjcmlwdFtjdXJzb3JdID09PSAnLScpIGN1cnNvcisrO1xuICAgICAgd2hpbGUgKC9bIFxcdF0vdS50ZXN0KHNjcmlwdFtjdXJzb3JdID8/ICcnKSkgY3Vyc29yKys7XG4gICAgICBsZXQgZGVsaW1pdGVyID0gJyc7XG4gICAgICAvLyBUaGUgZGVsaW1pdGVyIHdvcmQgbWF5IGJlIHF1b3RlZCAoYDw8J0VPRidgKSBvciBiYWNrc2xhc2gtZXNjYXBlZCAoYDw8XFxFT0ZgKTsgZWl0aGVyIGZvcm1cbiAgICAgIC8vIGp1c3QgZGlzYWJsZXMgYm9keSBleHBhbnNpb24sIHNvIGNvbGxlY3QgdGhlIGJhcmUgd29yZC4gTWlzc2luZyB0aGUgZXNjYXBlZCBmb3JtIHdvdWxkIGRyb3BcbiAgICAgIC8vIGBzYXdIZXJlZG9jYCBhbmQgcmVhZCB0aGUgaGVyZWRvYyBib2R5IGFzIGNvbW1hbmRzLlxuICAgICAgbGV0IGRlbGltaXRlclF1b3RlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICB3aGlsZSAoY3Vyc29yIDwgc2NyaXB0Lmxlbmd0aCkge1xuICAgICAgICBjb25zdCBkZWxpbWl0ZXJDaGFyID0gc2NyaXB0W2N1cnNvcl0gPz8gJyc7XG4gICAgICAgIGlmIChkZWxpbWl0ZXJRdW90ZSkge1xuICAgICAgICAgIGlmIChkZWxpbWl0ZXJDaGFyID09PSBkZWxpbWl0ZXJRdW90ZSkgZGVsaW1pdGVyUXVvdGUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgZWxzZSBkZWxpbWl0ZXIgKz0gZGVsaW1pdGVyQ2hhcjtcbiAgICAgICAgfSBlbHNlIGlmIChkZWxpbWl0ZXJDaGFyID09PSAnXFxcXCcpIHtcbiAgICAgICAgICAvLyBBIGJhY2tzbGFzaCBxdW90ZXMgdGhlIG5leHQgY2hhcmFjdGVyIGludG8gdGhlIGRlbGltaXRlciB3b3JkIChgPDxcXEVPRmAg4oaSIGBFT0ZgKS5cbiAgICAgICAgICBjdXJzb3IrKztcbiAgICAgICAgICBkZWxpbWl0ZXIgKz0gc2NyaXB0W2N1cnNvcl0gPz8gJyc7XG4gICAgICAgIH0gZWxzZSBpZiAoZGVsaW1pdGVyQ2hhciA9PT0gXCInXCIgfHwgZGVsaW1pdGVyQ2hhciA9PT0gJ1wiJykge1xuICAgICAgICAgIGRlbGltaXRlclF1b3RlID0gZGVsaW1pdGVyQ2hhcjtcbiAgICAgICAgfSBlbHNlIGlmICgvW1xcdy4tXS91LnRlc3QoZGVsaW1pdGVyQ2hhcikpIHtcbiAgICAgICAgICBkZWxpbWl0ZXIgKz0gZGVsaW1pdGVyQ2hhcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjdXJzb3IrKztcbiAgICAgIH1cbiAgICAgIGlmIChkZWxpbWl0ZXIpIHtcbiAgICAgICAgLy8gVGhlIGA8PGRlbGltYCBoZWFkZXIgaXMgYSByZWRpcmVjdGlvbiAobm90IGEgdG9rZW4pOyByZWNvcmQgdGhlIGRlbGltaXRlciBhbmQga2VlcFxuICAgICAgICAvLyBwYXJzaW5nIHRoZSByZXN0IG9mIHRoaXMgbGluZSDigJQgaXRzIGJvZHkgaXMgc2tpcHBlZCB3aGVuIHRoZSBuZXdsaW5lIGlzIHJlYWNoZWQuXG4gICAgICAgIGVuZFRva2VuKCk7XG4gICAgICAgIHBlbmRpbmdIZXJlZG9jRGVsaW1pdGVycy5wdXNoKGRlbGltaXRlcik7XG4gICAgICAgIGluZGV4ID0gY3Vyc29yIC0gMTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjaGFyYWN0ZXIgPT09ICcjJyAmJiAhaW5Ub2tlbikge1xuICAgICAgLy8gQ29tbWVudCBydW5zIHRvIGVuZCBvZiBsaW5lOyBlbmQgdGhlIGN1cnJlbnQgY29tbWFuZCBzZWdtZW50IGFuZCBsZXQgdGhlIGxvb3AgcmVzdW1lIGF0XG4gICAgICAvLyB0aGUgbmV3bGluZSBzbyB0aGUgbmV4dCBsaW5lIGlzIHBhcnNlZCBhcyBpdHMgb3duIHNlZ21lbnQuXG4gICAgICBlbmRTZWdtZW50KCk7XG4gICAgICB3aGlsZSAoaW5kZXggKyAxIDwgc2NyaXB0Lmxlbmd0aCAmJiBzY3JpcHRbaW5kZXggKyAxXSAhPT0gJ1xcbicpIGluZGV4Kys7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGNoYXJhY3RlciA9PT0gJyYnIHx8IGNoYXJhY3RlciA9PT0gJ3wnIHx8IGNoYXJhY3RlciA9PT0gJzsnIHx8IGNoYXJhY3RlciA9PT0gJ1xcbicpIHtcbiAgICAgIGVuZFNlZ21lbnQoKTtcbiAgICAgIGlmICgoY2hhcmFjdGVyID09PSAnJicgfHwgY2hhcmFjdGVyID09PSAnfCcpICYmIHNjcmlwdFtpbmRleCArIDFdID09PSBjaGFyYWN0ZXIpIGluZGV4Kys7XG4gICAgICAvLyBBIG5ld2xpbmUgdGhhdCBjbG9zZXMgYSBoZXJlZG9jIGhlYWRlciBsaW5lIGNvbnN1bWVzIHRoZSBxdWV1ZWQgYm9kaWVzIGJlZm9yZSB0aGUgbmV4dFxuICAgICAgLy8gY29tbWFuZC5cbiAgICAgIGlmIChjaGFyYWN0ZXIgPT09ICdcXG4nICYmIHBlbmRpbmdIZXJlZG9jRGVsaW1pdGVycy5sZW5ndGggPiAwKSBpbmRleCA9IHNraXBIZXJlZG9jQm9kaWVzKGluZGV4KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoY2hhcmFjdGVyID09PSAnKCcgfHwgY2hhcmFjdGVyID09PSAnKScpIHtcbiAgICAgIGVuZFRva2VuKCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKC9cXHMvdS50ZXN0KGNoYXJhY3RlcikpIHtcbiAgICAgIGVuZFRva2VuKCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY3VycmVudCArPSBjaGFyYWN0ZXI7XG4gICAgaW5Ub2tlbiA9IHRydWU7XG4gIH1cbiAgZW5kU2VnbWVudCgpO1xuICByZXR1cm4geyBzZWdtZW50cywgc2F3SGVyZWRvYyB9O1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYSBkZXBsb3kgc2NyaXB0IGludm9rZXMgYHdiIOKApiBkZXBsb3lgIGF0IGNvbW1hbmQgcG9zaXRpb24uIEVudiBhc3NpZ25tZW50cywgcGFja2FnZVxuICogcnVubmVycywgYW5kIGdsb2JhbCB5YXJncyBvcHRpb25zICh3aXRoIHRoZWlyIHZhbHVlIHRva2VucykgbWF5IHByZWNlZGUgdGhlIGRlcGxveSBjb21tYW5kO1xuICogc2hlbGwgcXVvdGluZywgZXNjYXBpbmcsIGNvbW1lbnRzLCBhbmQgZ3JvdXBpbmcgYXJlIGhvbm9yZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnZva2VzV2JEZXBsb3koZGVwbG95U2NyaXB0OiBzdHJpbmcsIHNjcmlwdE5hbWVzOiBSZWFkb25seVNldDxzdHJpbmc+KTogYm9vbGVhbiB7XG4gIGNvbnN0IHsgc2VnbWVudHMsIHNhd0hlcmVkb2MgfSA9IHRva2VuaXplU2hlbGxDb21tYW5kKGRlcGxveVNjcmlwdCk7XG4gIC8vIEEgaGVyZWRvYyBtYWtlcyBib2R5LXZzLWNvbW1hbmQgY2xhc3NpZmljYXRpb24gdW5yZWxpYWJsZSAoc2VlIHRva2VuaXplU2hlbGxDb21tYW5kKS5cbiAgaWYgKHNhd0hlcmVkb2MpIHJldHVybiBmYWxzZTtcbiAgZm9yIChjb25zdCB0b2tlbnMgb2Ygc2VnbWVudHMpIHtcbiAgICBsZXQgaW5kZXggPSAwO1xuICAgIHdoaWxlIChpbmRleCA8IHRva2Vucy5sZW5ndGggJiYgL15bQS1aYS16X11bQS1aYS16MC05X10qPS91LnRlc3QodG9rZW5zW2luZGV4XSA/PyAnJykpIGluZGV4Kys7XG4gICAgLy8gTGVhZGluZyBsYXVuY2hlcnMgcnVuIHRoZSBmb2xsb3dpbmcgY29tbWFuZDogYGVudmAgKHdpdGggb3B0aW9ucyArIEtFWT12YWx1ZSBhc3NpZ25tZW50cylcbiAgICAvLyBhbmQgdGhlIFBPU0lYIGBjb21tYW5kYCBidWlsdGluICh3aXRoIGl0cyBgLXBgL2AtdmAvYC1WYCBvcHRpb25zKS4gQ29tbWFuZC1wb3NpdGlvbiBzaGVsbFxuICAgIC8vIHJlc2VydmVkIHdvcmRzIGFuZCBvdGhlciBsYXVuY2hlcnMgKGBpZmAvYHRoZW5gL2Bmb3JgL2B0aW1lYC9gZXhlY2AvYCFgL2JyYWNlIGdyb3Vwcywg4oCmKSBhcmVcbiAgICAvLyBOT1QgbW9kZWxlZDogdGhleSBsZWF2ZSBhIG5vbi1gd2JgIGZpcnN0IHRva2VuLCBzbyB0aGUgc2VnbWVudCBzaW1wbHkgZG9lcyBub3QgbWF0Y2guIFRoaXMgaXNcbiAgICAvLyBhIGRlbGliZXJhdGUgZmFsc2UtbmVnYXRpdmUgZm9yIGdlbmVyYXRlZCBndWlkYW5jZS5cbiAgICBpZiAodG9rZW5zW2luZGV4XSA9PT0gJ2VudicpIHtcbiAgICAgIGluZGV4Kys7XG4gICAgICB3aGlsZSAoaW5kZXggPCB0b2tlbnMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHRva2VuID0gdG9rZW5zW2luZGV4XSA/PyAnJztcbiAgICAgICAgaWYgKC9eW0EtWmEtel9dW0EtWmEtejAtOV9dKj0vdS50ZXN0KHRva2VuKSkgaW5kZXgrKztcbiAgICAgICAgLy8gZW52J3MgZGlyZWN0b3J5IHZhbHVlIG1heSBiZSBzZXBhcmF0ZSBvciBhdHRhY2hlZCAoYC1DZGlyYCwgYC0tY2hkaXI9ZGlyYCkuIEl0IGNoYW5nZXNcbiAgICAgICAgLy8gd2hlcmUgd2IgcnVucyBidXQgbm90IHdoZXRoZXIgdGhlIGNvbW1hbmQgaW52b2tlcyB3YiBkZXBsb3kuXG4gICAgICAgIGVsc2UgaWYgKHRva2VuID09PSAnLUMnIHx8IHRva2VuID09PSAnLS1jaGRpcicpIGluZGV4ICs9IDI7XG4gICAgICAgIGVsc2UgaWYgKHRva2VuLnN0YXJ0c1dpdGgoJy1DJykgfHwgdG9rZW4uc3RhcnRzV2l0aCgnLS1jaGRpcj0nKSkgaW5kZXgrKztcbiAgICAgICAgZWxzZSBpZiAodG9rZW4gPT09ICctdScpIGluZGV4ICs9IDI7XG4gICAgICAgIGVsc2UgaWYgKHRva2VuLnN0YXJ0c1dpdGgoJy0nKSkgaW5kZXgrKztcbiAgICAgICAgZWxzZSBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gYGNvbW1hbmQgQ01EYCBleGVjdXRlcyBDTUQsIGJ1dCBgY29tbWFuZCAtdmAvYC1WIENNRGAgb25seSBRVUVSWSBpdHMgYXZhaWxhYmlsaXR5IHdpdGhvdXRcbiAgICAvLyBydW5uaW5nIGl0LCBzbyBhIGRlcGxveSBiZWhpbmQgdGhlbSBkb2VzIG5vdCBydW4uIFRoZSBgdmAvYFZgIGZsYWcgbWF5IGJlIGNsdXN0ZXJlZCB3aXRoXG4gICAgLy8gb3RoZXIgb3B0aW9uIGxldHRlcnMgKGBjb21tYW5kIC1wdiB3YmApLCBzbyBtYXRjaCBhbnkgb3B0aW9uIGxldHRlciBjbHVzdGVyIGNvbnRhaW5pbmcgaXQuXG4gICAgd2hpbGUgKHRva2Vuc1tpbmRleF0gPT09ICdjb21tYW5kJykge1xuICAgICAgaW5kZXgrKztcbiAgICAgIGxldCBxdWVyaWVzT25seSA9IGZhbHNlO1xuICAgICAgd2hpbGUgKGluZGV4IDwgdG9rZW5zLmxlbmd0aCAmJiAodG9rZW5zW2luZGV4XSA/PyAnJykuc3RhcnRzV2l0aCgnLScpKSB7XG4gICAgICAgIGlmICgvXi1bQS1aYS16XSpbdlZdW0EtWmEtel0qJC91LnRlc3QodG9rZW5zW2luZGV4XSA/PyAnJykpIHF1ZXJpZXNPbmx5ID0gdHJ1ZTtcbiAgICAgICAgaW5kZXgrKztcbiAgICAgIH1cbiAgICAgIGlmIChxdWVyaWVzT25seSkge1xuICAgICAgICBpbmRleCA9IC0xO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGluZGV4IDwgMCkgY29udGludWU7XG4gICAgLy8gUmVzb2x2ZSBhIHJ1bm5lciBwcmVmaXggdG8gd2hldGhlciB0aGUgZm9sbG93aW5nIHRva2VuIGlzIGEgQklOQVJZICh0aGUgd2IgZXhlY3V0YWJsZSkgb3IgYVxuICAgIC8vIHBhY2thZ2UgU0NSSVBUIG5hbWUuIGBidW54YC9gbnB4YCBhbmQgYDxwbT4geHxkbHh8ZXhlY2AgcnVuIGEgYmluYXJ5OyBgPHBtPiBydW58cnVuLXNjcmlwdGBcbiAgICAvLyAoYW5kIGJhcmUgYG5wbSA8bmFtZT5gLCBvciBhbnkgcnVubmVyIGZvbGxvd2VkIGJ5IGAtLWApIHJ1biBhIHBhY2thZ2Ugc2NyaXB0IOKAlCBzb1xuICAgIC8vIGBucG0gcnVuIHdiIGRlcGxveWAgZXhlY3V0ZXMgdGhlIHNjcmlwdCBuYW1lZCBgd2JgLCBub3QgdGhlIHdiIGJpbmFyeSwgYW5kIG11c3QgYmUgcmVqZWN0ZWQuXG4gICAgaWYgKFsnbnBtJywgJ3BucG0nLCAneWFybicsICdidW4nXS5pbmNsdWRlcyh0b2tlbnNbaW5kZXhdID8/ICcnKSkge1xuICAgICAgY29uc3QgcnVubmVyID0gdG9rZW5zW2luZGV4XSA/PyAnJztcbiAgICAgIGluZGV4ID0gc2tpcFJ1bm5lck9wdGlvbnModG9rZW5zLCBpbmRleCArIDEpO1xuICAgICAgY29uc3Qgc3ViY29tbWFuZCA9IHRva2Vuc1tpbmRleF0gPz8gJyc7XG4gICAgICBpZiAoWydydW4nLCAncnVuLXNjcmlwdCddLmluY2x1ZGVzKHN1YmNvbW1hbmQpKSBjb250aW51ZTsgLy8gcnVucyBhIHBhY2thZ2Ugc2NyaXB0LCBub3Qgd2JcbiAgICAgIC8vIEV4ZWN1dG9yIHN1YmNvbW1hbmRzIGFyZSBydW5uZXItU1BFQ0lGSUM6IGJ1biByZXNlcnZlcyBvbmx5IGB4YCAoYGJ1biBkbHhgL2BidW4gZXhlY2AgcnVuIGFcbiAgICAgIC8vIHBhY2thZ2Ugc2NyaXB0IG5hbWVkIGRseC9leGVjKS4gUmVhbCBidWlsdC1pbiBleGVjdXRvcnMgKGBleGVjYC9geGAsIGFuZCBgZGx4YCBmb3IgcG5wbSlcbiAgICAgIC8vIHRha2UgcHJlY2VkZW5jZSBvdmVyIGEgc2FtZS1uYW1lZCBzY3JpcHQsIHNvIHRoZXkgYXJlIE5PVCBzaGFkb3ctY2hlY2tlZC4gT25seSBgeWFybiBkbHhgIGlzXG4gICAgICAvLyBhbWJpZ3VvdXMg4oCUIGEgQmVycnkgYnVpbHQtaW4gYnV0IGEgcGFja2FnZSBTQ1JJUFQgaW4gWWFybiBDbGFzc2ljIOKAlCBzbyBhIGRlY2xhcmVkIGBkbHhgXG4gICAgICAvLyBzY3JpcHQgbWFrZXMgYHlhcm4gZGx4YCBkZWNsaW5lIChmYWxsIHRocm91Z2ggdG8gdGhlIHBhY2thZ2Utc2NyaXB0IGNoZWNrcykuXG4gICAgICBjb25zdCBpc1lhcm5EbHhTaGFkb3dlZEJ5U2NyaXB0ID0gcnVubmVyID09PSAneWFybicgJiYgc3ViY29tbWFuZCA9PT0gJ2RseCcgJiYgc2NyaXB0TmFtZXMuaGFzKCdkbHgnKTtcbiAgICAgIGlmIChydW5uZXJFeGVjdXRvclN1YmNvbW1hbmRzQnlSdW5uZXJbcnVubmVyXT8uaGFzKHN1YmNvbW1hbmQpICYmICFpc1lhcm5EbHhTaGFkb3dlZEJ5U2NyaXB0KSB7XG4gICAgICAgIGluZGV4Kys7IC8vIGJpbmFyeSBydW5uZXIgKHBucG0gZGx4LCBidW4geCwgYG5wbSBleGVjIC0tIHdiIOKApmApXG4gICAgICAgIGlmICh0b2tlbnNbaW5kZXhdID09PSAnLS0nKSBpbmRleCsrOyAvLyB0aGUgZXhlY3V0b3IncyBvcHRpb25hbCBgLS1gIGJlZm9yZSB0aGUgY29tbWFuZFxuICAgICAgfSBlbHNlIGlmIChydW5uZXIgPT09ICducG0nKSB7XG4gICAgICAgIGNvbnRpbnVlOyAvLyBiYXJlIGBucG0gd2JgIG5ldmVyIHJ1bnMgYSBiaW5hcnlcbiAgICAgIH0gZWxzZSBpZiAodG9rZW5zW2luZGV4XSA9PT0gJ3diJyAmJiBzY3JpcHROYW1lcy5oYXMoJ3diJykpIHtcbiAgICAgICAgLy8gQmFyZSBgYnVuL3BucG0veWFybiB3YmAgcnVucyBhIHBhY2thZ2UgU0NSSVBUIG5hbWVkIGB3YmAgd2hlbiBvbmUgZXhpc3RzIChwYXNzaW5nIGBkZXBsb3lgXG4gICAgICAgIC8vIGFzIGl0cyBhcmd1bWVudCksIG5vdCB0aGUgd2IgYmluYXJ5LlxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFsnYnVueCcsICducHgnXS5pbmNsdWRlcyh0b2tlbnNbaW5kZXhdID8/ICcnKSkge1xuICAgICAgaW5kZXggPSBza2lwUnVubmVyT3B0aW9ucyh0b2tlbnMsIGluZGV4ICsgMSk7XG4gICAgfVxuICAgIGlmICh0b2tlbnNbaW5kZXhdICE9PSAnd2InKSBjb250aW51ZTtcbiAgICBjb25zdCB3YkFyZ3MgPSB0b2tlbnMuc2xpY2UoaW5kZXggKyAxKTtcbiAgICAvLyBTa2lwIGdsb2JhbCBvcHRpb25zIChhbmQgYW55IHZhbHVlIHRva2VuIGEgdmFsdWUtYmVhcmluZyBvcHRpb24gY29uc3VtZXMpIHNvIHRoZSBGSVJTVFxuICAgIC8vIGNvbW1hbmQgdG9rZW4gZGVjaWRlczogYHdiIC0tY2FzY2FkZS1lbnYgcHJvZHVjdGlvbiBkZXBsb3lgIGFuZCBgd2IgLXcgcGFja2FnZXMvYXBpIGRlcGxveWBcbiAgICAvLyBtYXRjaCwgd2hpbGUgc3ViY29tbWFuZHMgb3duaW5nIHRoZWlyIG93biBgZGVwbG95YCAoYHdiIHByaXNtYSBkZXBsb3lgLCBgd2IgcmV0cnkgZGVwbG95YClcbiAgICAvLyBkbyBub3QuIGAtLW9wdD12YWx1ZWAgY2FycmllcyBpdHMgdmFsdWUgaW5saW5lLCBzbyBvbmx5IHRoZSBzcGFjZS1zZXBhcmF0ZWQgZm9ybSBza2lwcyBvbmUuXG4gICAgbGV0IGNvbW1hbmRJbmRleCA9IDA7XG4gICAgd2hpbGUgKGNvbW1hbmRJbmRleCA8IHdiQXJncy5sZW5ndGggJiYgKHdiQXJnc1tjb21tYW5kSW5kZXhdID8/ICcnKS5zdGFydHNXaXRoKCctJykpIHtcbiAgICAgIGNvbnN0IGZsYWcgPSB3YkFyZ3NbY29tbWFuZEluZGV4XSA/PyAnJztcbiAgICAgIGNvbW1hbmRJbmRleCsrO1xuICAgICAgaWYgKHdiR2xvYmFsVmFsdWVPcHRpb25zLmhhcyhmbGFnKSAmJiBjb21tYW5kSW5kZXggPCB3YkFyZ3MubGVuZ3RoKSBjb21tYW5kSW5kZXgrKztcbiAgICB9XG4gICAgaWYgKHdiQXJnc1tjb21tYW5kSW5kZXhdICE9PSAnZGVwbG95JykgY29udGludWU7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIHdvcmtmbG93cyBkaXJlY3RvcnkgaG9sZHMgYSBsaXZlIGNhbGxlciBvZiB0aGUgcmV1c2FibGUgQ2xvdWRmbGFyZSBkZXBsb3kgd29ya2Zsb3cuXG4gKiBZQU1MIGlzIHBhcnNlZCBhbmQgb25seSBgam9icy4qLnVzZXNgIHZhbHVlcyBhcmUgaW5zcGVjdGVkIChhIHJhdy10ZXh0IHNlYXJjaCB3b3VsZCBtYXRjaFxuICogY29tbWVudHMgb3IgYHJ1bjpgIHN0cmluZ3MpLCB3aXRoIGEgYGRlcGxveSpgLWZpbGVuYW1lIHNob3J0Y3V0IGFuZCBhIGNvbnNlcnZhdGl2ZSByYXctdGV4dFxuICogZmFsbGJhY2sgZm9yIHVucGFyc2VhYmxlIGZpbGVzLiBVc2VkIGJ5IHRoZSBhZ2VudC1pbnN0cnVjdGlvbiBnZW5lcmF0b3Igc28gZ2VuZXJhdGVkIGd1aWRhbmNlXG4gKiBkZXNjcmliZXMgb25seSB3b3JrZmxvd3MgdGhhdCBleGlzdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc0Nsb3VkZmxhcmVEZXBsb3lXb3JrZmxvdyh3b3JrZmxvd3NEaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgbGV0IGVudHJpZXM6IGZzLkRpcmVudFtdO1xuICB0cnkge1xuICAgIGVudHJpZXMgPSBmcy5yZWFkZGlyU3luYyh3b3JrZmxvd3NEaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvLyBDYXNlLWluc2Vuc2l0aXZlIG93bmVyL3JlcG9zaXRvcnkgKEdpdEh1YiB0cmVhdHMgdGhlbSBzbyksIGNhc2Utc2Vuc2l0aXZlIHBhdGgvcmVmIOKAlCBtYXRjaGluZ1xuICAvLyBwYXJzZU9yZ1JldXNhYmxlV29ya2Zsb3dDYWxsLCB1c2VkIGZvciB0aGUgdW5wYXJzZWFibGUtWUFNTCByYXctdGV4dCBmYWxsYmFjayBvbmx5LlxuICBjb25zdCBkZXBsb3lDYWxsUGF0dGVybiA9IC9bXi9dK1xcL3JldXNhYmxlLXdvcmtmbG93c1xcL1xcLmdpdGh1YlxcL3dvcmtmbG93c1xcL2RlcGxveVxcLnlhP21sQC9pdTtcbiAgY29uc3QgY2FsbHNEZXBsb3lXb3JrZmxvdyA9ICh1c2VzOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuID0+XG4gICAgcGFyc2VPcmdSZXVzYWJsZVdvcmtmbG93Q2FsbCh1c2VzKT8ud29ya2Zsb3dOYW1lID09PSAnZGVwbG95JztcbiAgcmV0dXJuIGVudHJpZXMuc29tZSgoZW50cnkpID0+IHtcbiAgICBpZiAoIWVudHJ5LmlzRmlsZSgpIHx8ICEvXFwueWE/bWwkL3UudGVzdChlbnRyeS5uYW1lKSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChlbnRyeS5uYW1lLnN0YXJ0c1dpdGgoJ2RlcGxveScpKSByZXR1cm4gdHJ1ZTtcbiAgICBsZXQgY29udGVudDogc3RyaW5nO1xuICAgIHRyeSB7XG4gICAgICBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbih3b3JrZmxvd3NEaXJQYXRoLCBlbnRyeS5uYW1lKSwgJ3V0ZjgnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHdvcmtmbG93ID0geWFtbC5sb2FkKGNvbnRlbnQpIGFzIFdvcmtmbG93IHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKHdvcmtmbG93ICYmIHR5cGVvZiB3b3JrZmxvdyA9PT0gJ29iamVjdCcgJiYgd29ya2Zsb3cuam9icyAmJiB0eXBlb2Ygd29ya2Zsb3cuam9icyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXMod29ya2Zsb3cuam9icykuc29tZSgoam9iKSA9PiBjYWxsc0RlcGxveVdvcmtmbG93KGpvYj8udXNlcykpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGRlcGxveUNhbGxQYXR0ZXJuLnRlc3QoY29udGVudCk7XG4gICAgfVxuICB9KTtcbn1cblxuLy8gVGhlIHJldXNhYmxlIHdvcmtmbG93cyB0aGF0IGRlY2xhcmUgRk5PWF9BR0VfS0VZIGFuZCBWRVJEQUNDSU9fVE9LRU4gdW5kZXJcbi8vIG9uLndvcmtmbG93X2NhbGwuc2VjcmV0cyAoc2VlIFdpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cykuIFBhc3NpbmcgZWl0aGVyIHNlY3JldCB0byBhbnlcbi8vIG90aGVyIGNhbGxlZSBpcyBhIEdpdEh1YiBlcnJvci5cbmNvbnN0IGluc3RhbGxDYXBhYmxlUmV1c2FibGVXb3JrZmxvd3MgPSBuZXcgU2V0KFsnZGVwbG95JywgJ3JlbGVhc2UnLCAncnVuLXNjcmlwdCcsICd0ZXN0J10pO1xuY29uc3QgcmV1c2FibGVXb3JrZmxvd1Blcm1pc3Npb25zOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiA9IHtcbiAgLy8gc2tpcC1kdXBsaWNhdGUtYWN0aW9ucyByZWFkcyB3b3JrZmxvdyBydW5zOyBjYW5jZWxfb3RoZXJzIGlzIGZhbHNlLCBzbyByZWFkIGlzIGVub3VnaC5cbiAgJ3Rlc3QtcnVzdCc6IHsgYWN0aW9uczogJ3JlYWQnLCBjb250ZW50czogJ3JlYWQnIH0sXG4gICdzZW1hbnRpYy1wcic6IHsgJ3B1bGwtcmVxdWVzdHMnOiAncmVhZCcsIHN0YXR1c2VzOiAnd3JpdGUnIH0sXG4gICdjbG9zZS1jb21tZW50JzogeyAncHVsbC1yZXF1ZXN0cyc6ICd3cml0ZScgfSxcbn07XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUpvYihjb25maWc6IFBhY2thZ2VDb25maWcsIGpvYjogSm9iLCBraW5kOiBLbm93bktpbmQpOiB2b2lkIHtcbiAgam9iLndpdGggPz89IHt9O1xuICAvLyBgc2VjcmV0czogaW5oZXJpdGAgKHBhcnNlZCBieSBqcy15YW1sIGFzIGEgcGxhaW4gc3RyaW5nKSBhbHJlYWR5IGZvcndhcmRzIGV2ZXJ5IGNhbGxlciBzZWNyZXRcbiAgLy8gaW5jbHVkaW5nIHRoZSBvbmVzIGluamVjdGVkIGJlbG93LCBzbyBwcmVzZXJ2ZSBpdCB1bnRvdWNoZWQg4oCUIHByb3BlcnR5IGFzc2lnbm1lbnRzIG9uIHRoZVxuICAvLyBzdHJpbmcgd291bGQgdGhyb3cuIENhdmVhdDogYGluaGVyaXRgIGZvcndhcmRzIHNlY3JldHMgdW5kZXIgdGhlaXIgZXhpc3RpbmcgTkFNRVMsIHNvIGl0IGNhblxuICAvLyBuZXZlciBmZWVkIFBVQkxJQ19GTk9YX0FHRV9LRVkgaW50byB0aGUgY2FsbGVlJ3MgZGVjbGFyZWQgRk5PWF9BR0VfS0VZOyBhIGhhbmQtd3JpdHRlblxuICAvLyBpbmhlcml0IGNhbGxlciBpbiBhIFBVQkxJQyBmbm94IHJlcG9zaXRvcnkgbXVzdCBiZSBjb252ZXJ0ZWQgdG8gYW4gZXhwbGljaXQgbWFwcGluZyBtYW51YWxseVxuICAvLyAod2JmeSBuZXZlciBnZW5lcmF0ZXMgdGhlIGluaGVyaXQgZm9ybSwgYW5kIGhhbmQtd3JpdHRlbiBkZXZpYXRpb25zIGFyZSBmaXhlZCBpbiB0aGUgdGFyZ2V0XG4gIC8vIHJlcG9zaXRvcnkgYnkgcG9saWN5KS5cbiAgY29uc3Qgc2VjcmV0cyA9IGpvYi5zZWNyZXRzID09PSAnaW5oZXJpdCcgPyB1bmRlZmluZWQgOiAoam9iLnNlY3JldHMgPSBqb2Iuc2VjcmV0cyA/PyB7fSk7XG5cbiAgaWYgKHNlY3JldHMgJiYgKGtpbmQgPT09ICd0ZXN0JyB8fCBraW5kID09PSAncmVsZWFzZScpKSB7XG4gICAgc2VjcmV0cy5HSF9UT0tFTiA9ICcke3sgc2VjcmV0cy5HSVRIVUJfVE9LRU4gfX0nO1xuICB9XG5cbiAgLy8gZm5veC50b21sIGNhcnJpZXMgYWdlLWVuY3J5cHRlZCBhcHAgc2VjcmV0czsgQ0kgZGVjcnlwdHMgdGhlbSB3aXRoIHRoZSBGTk9YX0FHRV9LRVkgKG9yLCBmb3JcbiAgLy8gcHVibGljIHJlcG9zaXRvcmllcywgUFVCTElDX0ZOT1hfQUdFX0tFWSkgb3JnYW5pemF0aW9uIHNlY3JldC5cbiAgLy8gS2V5IHRoZSBpbmplY3Rpb24gb24gdGhlICpjYWxsZWQqIHJldXNhYmxlIHdvcmtmbG93LCBub3QgdGhlIGNhbGxlcidzIGZpbGVuYW1lOiBjYWxsZXJzIG1heSBoYXZlXG4gIC8vIGFyYml0cmFyeSBuYW1lcyAoZS5nLiBzY2hlZHVsZWQgcnVuLXNjcmlwdCBjYWxsZXJzKSwgYW5kIEdpdEh1YiByZWplY3RzIHBhc3NpbmcgYSBzZWNyZXQgdGhhdCB0aGVcbiAgLy8gY2FsbGVlIGRvZXMgbm90IGRlY2xhcmUuXG4gIC8vIE9ubHkgYW4gQG1haW4gY2FsbGVlIGlzIGtub3duIHRvIGZvbGxvdyB0aGUgY3VycmVudCBzZWNyZXQgY29udHJhY3Q6IGEgd29ya2Zsb3cgcGlubmVkIHRvIGFuXG4gIC8vIG9sZGVyIHRhZyBvciBTSEEgbWF5IHN0aWxsIGRlY2xhcmUgTlBNX1RPS0VOIChhbmQgbm90IFZFUkRBQ0NJT19UT0tFTiksIGFuZCBHaXRIdWIgcmVqZWN0cyBhXG4gIC8vIGNhbGxlciB3aG9zZSBzZWNyZXRzIGRvIG5vdCBtYXRjaCB0aGUgc2VsZWN0ZWQgcmV2aXNpb24ncyBkZWNsYXJhdGlvbnMsIHNvIHBpbm5lZCBjYWxsZXJzIGtlZXBcbiAgLy8gdGhlaXIgc2VjcmV0cyB1bnRvdWNoZWQuXG4gIGNvbnN0IG9yZ1dvcmtmbG93Q2FsbCA9IHBhcnNlT3JnUmV1c2FibGVXb3JrZmxvd0NhbGwoam9iLnVzZXMpO1xuICBjb25zdCBjYWxsZWRSZXVzYWJsZVdvcmtmbG93ID0gb3JnV29ya2Zsb3dDYWxsPy5yZWYgPT09ICdtYWluJyA/IG9yZ1dvcmtmbG93Q2FsbC53b3JrZmxvd05hbWUgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHJlcXVpcmVkUGVybWlzc2lvbnMgPSBjYWxsZWRSZXVzYWJsZVdvcmtmbG93ID8gcmV1c2FibGVXb3JrZmxvd1Blcm1pc3Npb25zW2NhbGxlZFJldXNhYmxlV29ya2Zsb3ddIDogdW5kZWZpbmVkO1xuICBpZiAocmVxdWlyZWRQZXJtaXNzaW9ucykgam9iLnBlcm1pc3Npb25zID0geyAuLi5yZXF1aXJlZFBlcm1pc3Npb25zIH07XG4gIGlmIChzZWNyZXRzICYmIGNhbGxlZFJldXNhYmxlV29ya2Zsb3cgJiYgaW5zdGFsbENhcGFibGVSZXVzYWJsZVdvcmtmbG93cy5oYXMoY2FsbGVkUmV1c2FibGVXb3JrZmxvdykpIHtcbiAgICAvLyBUaGUgY2FsbGVlIHJvdXRlcyBwdWJsaWMgKGRlZmF1bHQtcmVnaXN0cnkpIGluc3RhbGxzIHRocm91Z2ggdGhlIFRha3VtaSBHdWFyZFxuICAgIC8vIG1hbGljaW91cy1wYWNrYWdlLWJsb2NraW5nIHByb3h5IHdoZW4gdGhpcyB0b2tlbiByZXNvbHZlczsgYW4gdW5zZXQgb3JnYW5pemF0aW9uIHNlY3JldFxuICAgIC8vIGV4cGFuZHMgdG8gJycgYW5kIHRoZSBjYWxsZWUgdHJlYXRzIHRoYXQgYXMgXCJmZWF0dXJlIG9mZlwiLCBzbyBwYXNzaW5nIGl0IGlzIGFsd2F5cyBzYWZlLlxuICAgIHNlY3JldHMuVEFLVU1JX0dVQVJEX1RPS0VOID0gJyR7eyBzZWNyZXRzLlRBS1VNSV9HVUFSRF9UT0tFTiB9fSc7XG4gICAgLy8gVGhlIGNhbGxlZSBnZW5lcmF0ZXMgdGhlIHdvcmtzcGFjZSAubnBtcmMgZm9yIEB3aWxsYm9vc3Rlci1wcml2YXRlLyogZnJvbSBWRVJEQUNDSU9fVE9LRU5cbiAgICAvLyBiZWZvcmUgaW5zdGFsbGluZyBkZXBlbmRlbmNpZXMuIE9ubHkgcmVwb3NpdG9yaWVzIHRoYXQgYWN0dWFsbHkgcmVzb2x2ZSBwcml2YXRlIHBhY2thZ2VzXG4gICAgLy8gKG9yIHB1Ymxpc2ggdG8gVmVyZGFjY2lvKSBnZXQgdGhlIHBhc3MtdGhyb3VnaDogZXZlcnl3aGVyZSBlbHNlIHRoZSBjcmVkZW50aWFsIHdvdWxkIGZsb3dcbiAgICAvLyBpbnRvIENJIHJ1bnMgdGhhdCBuZXZlciB1c2UgaXQsIHNvIHRoZSBsaW5lIGlzIHJlbW92ZWQgaW5zdGVhZC4gVGhlIEdpdEh1YiBzZWNyZXQgaXRzZWxmIGlzXG4gICAgLy8gYWx3YXlzIHJlZ2lzdGVyZWQgbWFudWFsbHkgYW5kIHN0YXlzIHJlZ2lzdGVyZWQgZWl0aGVyIHdheS5cbiAgICBpZiAocmVwb1Jlc29sdmVzUHJpdmF0ZVBhY2thZ2VzKGNvbmZpZykpIHtcbiAgICAgIHNlY3JldHMuVkVSREFDQ0lPX1RPS0VOID0gJyR7eyBzZWNyZXRzLlZFUkRBQ0NJT19UT0tFTiB9fSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZSBzZWNyZXRzLlZFUkRBQ0NJT19UT0tFTjtcbiAgICB9XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnZm5veC50b21sJykpKSB7XG4gICAgICAvLyBQdWJsaWMgcmVwb3NpdG9yaWVzIGNvbW1pdCB3b3JsZC1yZWFkYWJsZSBjaXBoZXJ0ZXh0cywgc28gdGhleSBkZWNyeXB0IHdpdGggYSBkZWRpY2F0ZWRcbiAgICAgIC8vIENJIGlkZW50aXR5ICh0aGUgUFVCTElDX0ZOT1hfQUdFX0tFWSBvcmdhbml6YXRpb24gc2VjcmV0KSBpbnN0ZWFkIG9mIHRoZSBvcmctaW50ZXJuYWxcbiAgICAgIC8vIG9uZTsgdGhlIGNhbGxlZSBzdGlsbCByZWNlaXZlcyBpdCB1bmRlciBpdHMgZGVjbGFyZWQgRk5PWF9BR0VfS0VZIG5hbWUuIFdoZW4gbm8gQ0lcbiAgICAgIC8vIGlkZW50aXR5IHJlc29sdmVzIChzZWUgZm5veEFnZUtleU1hcHBpbmcpLCBsZWF2ZSBhbnkgZXhpc3RpbmcgbWFwcGluZyB1bnRvdWNoZWQgYW5kIGFkZFxuICAgICAgLy8gbm9uZTogY3JlYXRpbmcgb3IgcmV3cml0aW5nIG9uZSBvbiBpbmNvbXBsZXRlIGluZm9ybWF0aW9uIHdvdWxkIG1hcCBhIHBvc3NpYmx5LXB1YmxpY1xuICAgICAgLy8gcmVwb3NpdG9yeSB0byB0aGUgd3JvbmcgaWRlbnRpdHksIGFuZCBhIGZub3ggcmVjaXBpZW50IHN5bmMgZmFpbHVyZSBkb2VzIG5vdCBzdG9wIHRoaXNcbiAgICAgIC8vIGdlbmVyYXRvciBmcm9tIHdyaXRpbmcgZmlsZXMg4oCUIHRoZSBmYWlsZWQgcnVuJ3MgcmVydW4gZmlsbHMgdGhlIG1hcHBpbmcgaW4uXG4gICAgICBjb25zdCBtYXBwaW5nID0gZm5veEFnZUtleU1hcHBpbmcoY29uZmlnKTtcbiAgICAgIGlmIChtYXBwaW5nKSB7XG4gICAgICAgIHNlY3JldHMuRk5PWF9BR0VfS0VZID0gbWFwcGluZztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKGtpbmQgPT09ICd0ZXN0LXJ1c3QnKSB7XG4gICAgY29uc3QgW3J1c3REaXJQYXRoXSA9IGNvbmZpZy5jYXJnb1RvbWxEaXJQYXRocztcbiAgICBpZiAocnVzdERpclBhdGggJiYgcnVzdERpclBhdGggIT09ICcuJykge1xuICAgICAgam9iLndpdGgud29ya2luZ19kaXJlY3RvcnkgPSBydXN0RGlyUGF0aDtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIGpvYi53aXRoLndvcmtpbmdfZGlyZWN0b3J5O1xuICAgIH1cbiAgfVxuXG4gIC8vIFJlY29uc3RydWN0IGZyb20gdGhlIHBhcnNlZCBjYWxsIHNvIGEgZGlmZmVyZW50bHkgY2FzZWQgb3duZXIgKEdpdEh1YiBpcyBjYXNlLWluc2Vuc2l0aXZlXG4gIC8vIHRoZXJlKSBpcyBhbHNvIG5vcm1hbGl6ZWQgdG8gdGhlIHJlcG9zaXRvcnkncyBvd24gb3JnYW5pemF0aW9uIC8gbWlycm9yLlxuICBpZiAob3JnV29ya2Zsb3dDYWxsICYmIGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXIvJykpIHtcbiAgICBqb2IudXNlcyA9IGBXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvJHtvcmdXb3JrZmxvd0NhbGwud29ya2Zsb3dOYW1lfS4ke29yZ1dvcmtmbG93Q2FsbC5leHRlbnNpb259QCR7b3JnV29ya2Zsb3dDYWxsLnJlZn1gO1xuICB9IGVsc2UgaWYgKG9yZ1dvcmtmbG93Q2FsbCAmJiBjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyTGFiLycpKSB7XG4gICAgam9iLnVzZXMgPSBgV2lsbEJvb3N0ZXJMYWIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzLyR7b3JnV29ya2Zsb3dDYWxsLndvcmtmbG93TmFtZX0uJHtvcmdXb3JrZmxvd0NhbGwuZXh0ZW5zaW9ufUAke29yZ1dvcmtmbG93Q2FsbC5yZWZ9YDtcbiAgfVxuXG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5Eb2NrZXJmaWxlICYmICFqb2Iud2l0aC5jaV9sYWJlbCAmJiBraW5kLnN0YXJ0c1dpdGgoJ3Rlc3QnKSkge1xuICAgIGpvYi53aXRoLmNpX2xhYmVsID0gJ2xhcmdlJztcbiAgfVxuICBjb25zdCBhY2NlcHRzUnVubmVySW5wdXQgPSBbJ3Rlc3QnLCAndGVzdC1ydXN0JywgJ2RlcGxveScsICdyZWxlYXNlJywgJ3J1bi1zY3JpcHQnXS5pbmNsdWRlcyhcbiAgICBvcmdXb3JrZmxvd0NhbGw/LndvcmtmbG93TmFtZSA/PyAnJ1xuICApO1xuICBpZiAoY29uZmlnLmlzUmVwb1Zpc2liaWxpdHlLbm93bikge1xuICAgIGlmIChjb25maWcuaXNQdWJsaWNSZXBvICYmIGFjY2VwdHNSdW5uZXJJbnB1dCkge1xuICAgICAgam9iLndpdGguZ2l0aHViX2hvc3RlZF9ydW5uZXIgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgam9iLndpdGguZ2l0aHViX2hvc3RlZF9ydW5uZXI7XG4gICAgfVxuICAgIGlmICghY29uZmlnLmlzUHVibGljUmVwbyAmJiBqb2Iud2l0aC5ydW5zX29uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGxhYmVscyA9IHpcbiAgICAgICAgLnN0cmluZygpXG4gICAgICAgIC50cmFuc2Zvcm0oKHZhbHVlLCBjdHgpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UodmFsdWUpIGFzIHVua25vd247XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICBjdHguYWRkSXNzdWUoeyBjb2RlOiAnY3VzdG9tJywgbWVzc2FnZTogJ0V4cGVjdGVkIEpTT04gcnVubmVyIGxhYmVscycgfSk7XG4gICAgICAgICAgICByZXR1cm4gei5ORVZFUjtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5waXBlKHouYXJyYXkoei5zdHJpbmcoKSkpXG4gICAgICAgIC5zYWZlUGFyc2Uoam9iLndpdGgucnVuc19vbik7XG4gICAgICBpZiAobGFiZWxzLnN1Y2Nlc3MgJiYgbGFiZWxzLmRhdGEuaW5jbHVkZXMoJ3NlbGYtaG9zdGVkJykpIHtcbiAgICAgICAgam9iLndpdGgucnVuc19vbiA9IEpTT04uc3RyaW5naWZ5KGxhYmVscy5kYXRhKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgUmVtb3ZlZCBydW5zX29uIGZyb20gJHtqb2IudXNlc306IHByaXZhdGUgcmVwb3NpdG9yaWVzIHJlcXVpcmUgYSBzZWxmLWhvc3RlZCBsYWJlbCBhcnJheS5gKTtcbiAgICAgICAgZGVsZXRlIGpvYi53aXRoLnJ1bnNfb247XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKE9iamVjdC5rZXlzKGpvYi53aXRoKS5sZW5ndGggPiAwKSB7XG4gICAgc29ydEtleXMoam9iLndpdGgpO1xuICB9IGVsc2Uge1xuICAgIGRlbGV0ZSBqb2Iud2l0aDtcbiAgfVxuICBpZiAoc2VjcmV0cykge1xuICAgIGlmIChPYmplY3Qua2V5cyhzZWNyZXRzKS5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBuZXdTZWNyZXRzID0gc29ydEtleXMoc2VjcmV0cyk7XG4gICAgICBkZWxldGUgam9iLnNlY3JldHM7XG4gICAgICBqb2Iuc2VjcmV0cyA9IG5ld1NlY3JldHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZSBqb2Iuc2VjcmV0cztcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgc2VjcmV0IGV4cHJlc3Npb24gdGhlIGNhbGxlciBtYXBzIGludG8gdGhlIGNhbGxlZSdzIGRlY2xhcmVkIEZOT1hfQUdFX0tFWSwgb3IgdW5kZWZpbmVkXG4gKiB3aGVuIHRoZSByZXBvc2l0b3J5IHN0YXRlIGRvZXMgbm90IGlkZW50aWZ5IGEgdXNhYmxlIENJIGlkZW50aXR5IOKAlCBhbiB1bmtub3duIHZpc2liaWxpdHksIGFcbiAqIHJlcG9zaXRvcnkgbm8gQ0kgc2NvcGUgY292ZXJzIChkZXJpdmluZyBmcm9tIHRoZSBzYW1lIHByaW5jaXBhbCByb3N0ZXIgYXMgdGhlIHJlY2lwaWVudCBzeW5jXG4gKiBrZWVwcyB0aGUgdHdvIGZyb20gZXZlciBkaXNhZ3JlZWluZyksIG9yIGEgZmFpbGVkIGZub3ggcmVjaXBpZW50IHN5bmMsIHdob3NlIGNpcGhlcnRleHRzIG1heVxuICogc3RpbGwgdGFyZ2V0IHRoZSBwcmV2aW91cyBpZGVudGl0eS4gVGhlIGNhbGxlciBtdXN0IHRoZW4gcHJlc2VydmUgYW55IGV4aXN0aW5nIG1hcHBpbmcuXG4gKi9cbmZ1bmN0aW9uIGZub3hBZ2VLZXlNYXBwaW5nKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghY29uZmlnLmlzUmVwb1Zpc2liaWxpdHlLbm93biB8fCBoYXNGbm94U3luY0ZhaWxlZCgpKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBzZWNyZXROYW1lID0gcmVzb2x2ZUZub3hDaUFnZUtleVNlY3JldE5hbWUoY29uZmlnKTtcbiAgcmV0dXJuIHNlY3JldE5hbWUgJiYgYFxcJHt7IHNlY3JldHMuJHtzZWNyZXROYW1lfSB9fWA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlWWFtbChuZXdTZXR0aW5nczogV29ya2Zsb3csIGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgLy8gQSBwZXJtaXNzaW9ucyBvYmplY3QgZW1wdGllZCBieSB0aGUgcGVyLWtpbmQgZGVsZXRpb25zIChlLmcuIGFuIGV4aXN0aW5nIHRlc3QtcnVzdCBjYWxsZXJcbiAgLy8gd2hvc2Ugb25seSBlbnRyeSB3YXMgYGFjdGlvbnNgKSBtdXN0IGJlIGRyb3BwZWQgZW50aXJlbHk6IGBwZXJtaXNzaW9uczoge31gIHN0cmlwcyBFVkVSWVxuICAvLyB0b2tlbiBwZXJtaXNzaW9uIGZyb20gdGhlIHdvcmtmbG93LCB1bmxpa2UgdGhlIGFic2VudCBrZXkgd2hpY2gga2VlcHMgdGhlIGRlZmF1bHRzLlxuICBpZiAobmV3U2V0dGluZ3MucGVybWlzc2lvbnMgJiYgT2JqZWN0LmtleXMobmV3U2V0dGluZ3MucGVybWlzc2lvbnMpLmxlbmd0aCA9PT0gMCkge1xuICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucztcbiAgfVxuICBjb25zdCB5YW1sVGV4dCA9IHlhbWwuZHVtcChuZXdTZXR0aW5ncywgeyBsaW5lV2lkdGg6IC0xIH0pO1xuICBhd2FpdCBmc1V0aWwud3JpdGVGaWxlQ29uZmluZWQoZmlsZVBhdGgsIHlhbWxUZXh0KTtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGdsb2JJZ25vcmUgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcblxuaW1wb3J0IHsgaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8gfSBmcm9tICcuLi9nZW5lcmF0b3JzL3dvcmtmbG93LmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IGdldFdvcmtzcGFjZURpclBhdHRlcm5zIH0gZnJvbSAnLi4vdXRpbHMvd29ya3NwYWNlVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhUeXBvcyhwYWNrYWdlQ29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4VHlwb3MnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHBhY2thZ2VDb25maWcucmVwb3NpdG9yeSkpIHJldHVybjtcblxuICAgIGNvbnN0IGRpclBhdGggPSBwYWNrYWdlQ29uZmlnLmRpclBhdGg7XG4gICAgY29uc3QgZG9jRmlsZXMgPSBhd2FpdCBmZy5nbG9iKCcqKi8qLm1kJywgeyBkb3Q6IHRydWUsIGN3ZDogZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH0pO1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBGb3VuZCAke2RvY0ZpbGVzLmxlbmd0aH0gbWFya2Rvd24gZmlsZXMgaW4gJHtkaXJQYXRofWApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IG1kRmlsZSBvZiBkb2NGaWxlcykge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgbWRGaWxlKTtcbiAgICAgIHZvaWQgcHJvbWlzZVBvb2wucnVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgICAgICAgaWYgKGNvbnRlbnQgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgICAgICBsZXQgbmV3Q29udGVudCA9IGZpeFR5cG9zSW5UZXh0KGNvbnRlbnQpO1xuICAgICAgICBuZXdDb250ZW50ID0gcmVwbGFjZVdpdGhDb25maWcobmV3Q29udGVudCwgcGFja2FnZUNvbmZpZywgJ2RvYycpO1xuICAgICAgICBpZiAoY29udGVudCAhPT0gbmV3Q29udGVudCkge1xuICAgICAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBmaXhUeXBvcyBydW5zIG9uY2Ugb24gdGhlIHJvb3QgY29uZmlnLCBzbyB0aGlzIGdsb2Igc2V0IG11c3QgY292ZXIgZXZlcnkgZGVjbGFyZWQgd29ya3NwYWNlXG4gICAgLy8gbGF5b3V0IChlLmcuIGFwcHMvKiksIG5vdCBqdXN0IHRoZSBjb252ZW50aW9uYWwgcGFja2FnZXMvKiBkaXJlY3Rvcnkg4oCUIHdoaWxlIGhvbm9yaW5nXG4gICAgLy8gZGVjbGFyZWQgbmVnYXRpb25zIChlLmcuIGAhYXBwcy9leGNsdWRlZGApLCB3aG9zZSBzb3VyY2VzIGFyZSBub3QgcGFydCBvZiB0aGUgbW9ub3JlcG8uXG4gICAgY29uc3Qgd29ya3NwYWNlRGlyUGF0dGVybnMgPSBnZXRXb3Jrc3BhY2VEaXJQYXR0ZXJucyhwYWNrYWdlQ29uZmlnKTtcbiAgICBjb25zdCB0c0ZpbGVzID0gYXdhaXQgZmcuZ2xvYihcbiAgICAgIFtcbiAgICAgICAgJ3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3gsY3RzLG10cyx0cyx0c3h9JyxcbiAgICAgICAgJ3BhY2thZ2VzLyoqL3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3gsY3RzLG10cyx0cyx0c3h9JyxcbiAgICAgICAgLi4ud29ya3NwYWNlRGlyUGF0dGVybnMuaW5jbHVkZXMubWFwKFxuICAgICAgICAgIChkaXJQYXR0ZXJuKSA9PiBgJHtkaXJQYXR0ZXJufS8qKi97YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4LGN0cyxtdHMsdHMsdHN4fWBcbiAgICAgICAgKSxcbiAgICAgIF0sXG4gICAgICB7XG4gICAgICAgIGRvdDogdHJ1ZSxcbiAgICAgICAgY3dkOiBkaXJQYXRoLFxuICAgICAgICBpZ25vcmU6IFsuLi5nbG9iSWdub3JlLCAuLi53b3Jrc3BhY2VEaXJQYXR0ZXJucy5leGNsdWRlcy5tYXAoKGRpclBhdHRlcm4pID0+IGAke2RpclBhdHRlcm59LyoqYCldLFxuICAgICAgfVxuICAgICk7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYEZvdW5kICR7dHNGaWxlcy5sZW5ndGh9IFR5cGVTY3JpcHQgZmlsZXMgaW4gJHtkaXJQYXRofWApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHRzRmlsZSBvZiB0c0ZpbGVzKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCB0c0ZpbGUpO1xuICAgICAgdm9pZCBwcm9taXNlUG9vbC5ydW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpO1xuICAgICAgICBpZiAob2xkQ29udGVudCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgICAgIGxldCBuZXdDb250ZW50ID0gZml4VHlwb3NJbkNvZGUob2xkQ29udGVudCk7XG4gICAgICAgIG5ld0NvbnRlbnQgPSByZXBsYWNlV2l0aENvbmZpZyhuZXdDb250ZW50LCBwYWNrYWdlQ29uZmlnLCAndHMnKTtcblxuICAgICAgICBpZiAob2xkQ29udGVudCAhPT0gbmV3Q29udGVudCkge1xuICAgICAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCB0ZXh0QmFzZWRGaWxlcyA9IGF3YWl0IGZnLmdsb2IoJyoqLyoue2NzdixodG0saHRtbCx0c3YseG1sLHlhbWwseW1sfScsIHtcbiAgICAgIGRvdDogdHJ1ZSxcbiAgICAgIGN3ZDogZGlyUGF0aCxcbiAgICAgIGlnbm9yZTogZ2xvYklnbm9yZSxcbiAgICB9KTtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRm91bmQgJHt0ZXh0QmFzZWRGaWxlcy5sZW5ndGh9IHRleHQtYmFzZWQgZmlsZXMgaW4gJHtkaXJQYXRofWApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgdGV4dEJhc2VkRmlsZXMpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIGZpbGUpO1xuICAgICAgdm9pZCBwcm9taXNlUG9vbC5ydW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpO1xuICAgICAgICBpZiAob2xkQ29udGVudCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgICAgIGxldCBuZXdDb250ZW50ID0gZml4VHlwb3NJblRleHQob2xkQ29udGVudCk7XG4gICAgICAgIG5ld0NvbnRlbnQgPSByZXBsYWNlV2l0aENvbmZpZyhuZXdDb250ZW50LCBwYWNrYWdlQ29uZmlnLCAndGV4dCcpO1xuXG4gICAgICAgIGlmIChvbGRDb250ZW50ICE9PSBuZXdDb250ZW50KSB7XG4gICAgICAgICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaXhUeXBvc0luVGV4dChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gY29udGVudFxuICAgIC5yZXBsYWNlQWxsKC9cXGJjXFwuZlxcLig/PVxcc3wkKS9nLCAnY2YuJylcbiAgICAucmVwbGFjZUFsbCgvXFxiZWdcXC4oPz1cXHN8JCkvZywgJ2UuZy4nKVxuICAgIC5yZXBsYWNlQWxsKC9cXGJpZVxcLig/PVxccykvZywgJ2kuZS4nKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpeFR5cG9zSW5Db2RlKGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiAoXG4gICAgY29udGVudFxuICAgICAgLnJlcGxhY2VBbGwoL1xcL1xcKltcXHNcXFNdKj9cXCpcXC8vZywgKGNvbW1lbnQpID0+IGZpeFR5cG9zSW5UZXh0KGNvbW1lbnQpKVxuICAgICAgLy8gVGhlIHdvcmQgYm91bmRhcnkgYW5kIHRyYWlsaW5nLXdoaXRlc3BhY2UgZ3VhcmQga2VlcCB3b3JkcyBtZXJlbHkgZW5kaW5nIGluIHRoZVxuICAgICAgLy8gYWJicmV2aWF0aW9uIGxldHRlcnMgKGUuZy4gXCJjb29raWUuXCIsIFwibGVnLlwiKSBpbnRhY3QuXG4gICAgICAucmVwbGFjZUFsbCgvKF58XFxzKVxcL1xcLyguKj8pXFxiY1xcLmZcXC4oPz1cXHN8JCkvZywgJyQxLy8kMmNmLicpXG4gICAgICAucmVwbGFjZUFsbCgvKF58XFxzKVxcL1xcLyguKj8pXFxiZWdcXC4oPz1cXHN8JCkvZywgJyQxLy8kMmUuZy4nKVxuICAgICAgLnJlcGxhY2VBbGwoLyhefFxccylcXC9cXC8oLio/KVxcYmllXFwuKD89XFxzfCQpL2csICckMS8vJDJpLmUuJylcbiAgKTtcbn1cblxuZnVuY3Rpb24gcmVwbGFjZVdpdGhDb25maWcobmV3Q29udGVudDogc3RyaW5nLCBwYWNrYWdlQ29uZmlnOiBQYWNrYWdlQ29uZmlnLCBwcm9wTmFtZTogJ2RvYycgfCAndHMnIHwgJ3RleHQnKTogc3RyaW5nIHtcbiAgZm9yIChjb25zdCBbYmVmb3JlLCBhZnRlcl0gb2YgT2JqZWN0LmVudHJpZXMocGFja2FnZUNvbmZpZy53YmZ5SnNvbj8udHlwb3M/LmFsbCA/PyB7fSkpIHtcbiAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlQWxsKGJlZm9yZSwgYWZ0ZXIpO1xuICB9XG4gIGZvciAoY29uc3QgW2JlZm9yZSwgYWZ0ZXJdIG9mIE9iamVjdC5lbnRyaWVzKHBhY2thZ2VDb25maWcud2JmeUpzb24/LnR5cG9zPy5bcHJvcE5hbWVdID8/IHt9KSkge1xuICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2VBbGwoYmVmb3JlLCBhZnRlcik7XG4gIH1cbiAgcmV0dXJuIG5ld0NvbnRlbnQ7XG59XG4iLCJpbXBvcnQgY2hpbGRQcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmltcG9ydCB7IE9jdG9raXQgfSBmcm9tICdAb2N0b2tpdC9jb3JlJztcblxuY2xhc3MgR2l0SHViVXRpbCB7XG4gIGdldE9yZ0FuZE5hbWUodXJsT3JGdWxsTmFtZTogc3RyaW5nKTogW3N0cmluZywgc3RyaW5nXSB7XG4gICAgY29uc3QgdXJsV2l0aG91dFByb3RvY29sID0gdXJsT3JGdWxsTmFtZS5zcGxpdCgnOicpLmF0KC0xKTtcbiAgICBjb25zdCBuYW1lcyA9IHVybFdpdGhvdXRQcm90b2NvbD8uc3BsaXQoJy8nKTtcbiAgICBjb25zdCBvcmcgPSBuYW1lcz8uYXQoLTIpID8/ICcnO1xuICAgIC8vIFRoZSBkb3QgbXVzdCBiZSBlc2NhcGVkOiBhbiB1bmVzY2FwZWQgYC5gIG1hdGNoZXMgQU5ZIGNoYXJhY3Rlciwgc28gYGxlZ2l0YCBsb3N0IGl0cyBgbGAgYW5kIGBlYC5cbiAgICBjb25zdCBuYW1lID0gbmFtZXM/LmF0KC0xKT8ucmVwbGFjZSgvXFwuZ2l0JC91LCAnJykgPz8gJyc7XG4gICAgcmV0dXJuIFtvcmcsIG5hbWVdO1xuICB9XG59XG5leHBvcnQgY29uc3QgZ2l0SHViVXRpbCA9IG5ldyBHaXRIdWJVdGlsKCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0dpdEh1YlBlcm1pc3Npb25PclZpc2liaWxpdHlFcnJvcihlcnJvcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAoIWVycm9yIHx8IHR5cGVvZiBlcnJvciAhPT0gJ29iamVjdCcpIHJldHVybiBmYWxzZTtcbiAgY29uc3Qgc3RhdHVzID0gKGVycm9yIGFzIHsgc3RhdHVzPzogbnVtYmVyIH0pLnN0YXR1cztcbiAgcmV0dXJuIHN0YXR1cyA9PT0gNDAxIHx8IHN0YXR1cyA9PT0gNDAzIHx8IHN0YXR1cyA9PT0gNDA0O1xufVxuXG5jb25zdCBvY3Rva2l0Q2FjaGUgPSBuZXcgTWFwPHN0cmluZywgT2N0b2tpdD4oKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldE9jdG9raXQob3duZXI/OiBzdHJpbmcpOiBPY3Rva2l0IHtcbiAgLy8gR2l0SHViIG93bmVyIG5hbWVzIGFyZSBjYXNlLWluc2Vuc2l0aXZlLCBzbyBjcmVkZW50aWFsIHNlbGVjdGlvbiAoYW5kIHRoZSBjYWNoZSBrZXkpIG11c3RcbiAgLy8gbm90IGRlcGVuZCBvbiBob3cgYSByZW1vdGUgVVJMIGhhcHBlbnMgdG8gc3BlbGwgdGhlIG9yZ2FuaXphdGlvbi5cbiAgY29uc3Qga2V5ID0gb3duZXI/LnRvTG93ZXJDYXNlKCkgPz8gJyc7XG4gIGNvbnN0IGNhY2hlZCA9IG9jdG9raXRDYWNoZS5nZXQoa2V5KTtcbiAgaWYgKGNhY2hlZCkgcmV0dXJuIGNhY2hlZDtcblxuICBjb25zdCBvY3Rva2l0ID0gbmV3IE9jdG9raXQoe1xuICAgIGF1dGg6IGdldEdpdEh1YlRva2VuKG93bmVyKSB8fCB1bmRlZmluZWQsXG4gIH0pO1xuICBvY3Rva2l0Q2FjaGUuc2V0KGtleSwgb2N0b2tpdCk7XG4gIHJldHVybiBvY3Rva2l0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzR2l0SHViVG9rZW4ob3duZXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gISFnZXRHaXRIdWJUb2tlbihvd25lcik7XG59XG5cbmZ1bmN0aW9uIGdldEdpdEh1YlRva2VuKG93bmVyPzogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgLy8gQ2FzZS1pbnNlbnNpdGl2ZSBvbiBwdXJwb3NlOiBhIG5vbmNhbm9uaWNhbGx5IGNhc2VkIHJlbW90ZSAoZS5nLiBnaXRodWIuY29tL3dpbGxib29zdGVybGFiL+KApilcbiAgLy8gbXVzdCBzdGlsbCBzZWxlY3QgdGhlIG9yZ2FuaXphdGlvbidzIG93biBQQVQg4oCUIGZhbGxpbmcgdGhyb3VnaCB0byB0aGUgZ2VuZXJpYyBicmFuY2ggd291bGRcbiAgLy8gcHJlZmVyIHRoZSBPVEhFUiBvcmdhbml6YXRpb24ncyBQQVQsIHdoaWNoIGNhbm5vdCByZWFkIHRoaXMgb3JnYW5pemF0aW9uJ3MgcHJpdmF0ZVxuICAvLyByZXBvc2l0b3JpZXMuXG4gIGNvbnN0IG5vcm1hbGl6ZWRPd25lciA9IG93bmVyPy50b0xvd2VyQ2FzZSgpO1xuICBpZiAobm9ybWFsaXplZE93bmVyID09PSAnd2lsbGJvb3N0ZXInKSB7XG4gICAgcmV0dXJuIHByb2Nlc3MuZW52LkdIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSIHx8IGdldEdpdEh1YkNsaVRva2VuKCk7XG4gIH1cbiAgaWYgKG5vcm1hbGl6ZWRPd25lciA9PT0gJ3dpbGxib29zdGVybGFiJykge1xuICAgIHJldHVybiBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUkxBQiB8fCBnZXRHaXRIdWJDbGlUb2tlbigpO1xuICB9XG4gIHJldHVybiAoXG4gICAgcHJvY2Vzcy5lbnYuR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVIgfHxcbiAgICBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUkxBQiB8fFxuICAgIHByb2Nlc3MuZW52LkdIX1RPS0VOIHx8XG4gICAgcHJvY2Vzcy5lbnYuR0lUSFVCX1RPS0VOIHx8XG4gICAgZ2V0R2l0SHViQ2xpVG9rZW4oKVxuICApO1xufVxuXG5sZXQgZ2l0SHViQ2xpVG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuZnVuY3Rpb24gZ2V0R2l0SHViQ2xpVG9rZW4oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGdpdEh1YkNsaVRva2VuICE9PSB1bmRlZmluZWQpIHJldHVybiBnaXRIdWJDbGlUb2tlbiB8fCB1bmRlZmluZWQ7XG5cbiAgdHJ5IHtcbiAgICAvLyBTb21lIGxvY2FsIHJ1bnMgcmVseSBvbiBHaXRIdWIgQ0xJIGF1dGhlbnRpY2F0aW9uIGluc3RlYWQgb2YgZXhwb3J0ZWQgZW52IHRva2Vucy5cbiAgICBnaXRIdWJDbGlUb2tlbiA9XG4gICAgICBjaGlsZFByb2Nlc3NcbiAgICAgICAgLmV4ZWNGaWxlU3luYygnZ2gnLCBbJ2F1dGgnLCAndG9rZW4nXSwge1xuICAgICAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgICAgICAgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAnaWdub3JlJ10sXG4gICAgICAgIH0pXG4gICAgICAgIC50cmltKCkgfHwgJyc7XG4gIH0gY2F0Y2gge1xuICAgIGdpdEh1YkNsaVRva2VuID0gJyc7XG4gIH1cbiAgcmV0dXJuIGdpdEh1YkNsaVRva2VuIHx8IHVuZGVmaW5lZDtcbn1cbiIsImltcG9ydCB0eXBlIHsgUGFyc2VFcnJvciB9IGZyb20gJ2pzb25jLXBhcnNlcic7XG5pbXBvcnQgeyBhcHBseUVkaXRzLCBjcmVhdGVTY2FubmVyLCBmaW5kTm9kZUF0TG9jYXRpb24sIG1vZGlmeSwgcGFyc2UgYXMgcGFyc2VKc29uYywgcGFyc2VUcmVlIH0gZnJvbSAnanNvbmMtcGFyc2VyJztcblxuLy8ganNvbmMtcGFyc2VyIGRlY2xhcmVzIFN5bnRheEtpbmQvU2NhbkVycm9yIGFzIGFtYmllbnQgY29uc3QgZW51bXMsIHdoaWNoIGNhbm5vdCBiZSBpbXBvcnRlZFxuLy8gdW5kZXIgdmVyYmF0aW1Nb2R1bGVTeW50YXg7IG1pcnJvciB0aGUgbmVlZGVkIG1lbWJlciB2YWx1ZXMgbG9jYWxseS5cbmNvbnN0IHN5bnRheEtpbmQgPSB7IGxpbmVDb21tZW50VHJpdmlhOiAxMiwgYmxvY2tDb21tZW50VHJpdmlhOiAxMywgbGluZUJyZWFrVHJpdmlhOiAxNCwgdHJpdmlhOiAxNSwgZW9mOiAxNyB9O1xuY29uc3Qgc2NhbkVycm9yTm9uZSA9IDA7XG5cbmV4cG9ydCBjb25zdCBqc29uY1V0aWwgPSB7XG4gIC8qKlxuICAgKiBUZWxscyB3aGV0aGVyIHRoZSBjb250ZW50IGhvbGRzIG5vIGNvbmZpZ3VyYXRpb24gYXQgYWxsIOKAlCBvbmx5IHdoaXRlc3BhY2UsIGNvbXBsZXRlIGNvbW1lbnRzLFxuICAgKiBhbmQvb3IgYSBCT00uIHRzYyB0cmVhdHMgc3VjaCBhIHRzY29uZmlnLmpzb24gYXMgYW4gZW1wdHkgY29uZmlnLCBzbyBnZW5lcmF0b3JzIHNob3VsZCB0cmVhdFxuICAgKiBpdCBsaWtlIGEgbWlzc2luZyBmaWxlIChhbmQgZ2VuZXJhdGUgZGVmYXVsdHMpIGluc3RlYWQgb2YgcmVmdXNpbmcgdG8gbWFuYWdlIGl0LiBMZXhpY2FsbHlcbiAgICogYnJva2VuIHRyaXZpYSAoZS5nLiBhbiB1bnRlcm1pbmF0ZWQgYmxvY2sgY29tbWVudCkgaXMgTk9UIHRyaXZpYS1vbmx5OiB0aGUgZmlsZSBtdXN0IGJlIGxlZnRcbiAgICogdW50b3VjaGVkIHJhdGhlciB0aGFuIG92ZXJ3cml0dGVuIHdpdGggZGVmYXVsdHMuXG4gICAqL1xuICBpc1RyaXZpYU9ubHkoY29udGVudDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc2Nhbm5lciA9IGNyZWF0ZVNjYW5uZXIoY29udGVudC5yZXBsYWNlKC9eXFx1RkVGRi8sICcnKSk7XG4gICAgZm9yIChsZXQga2luZDogbnVtYmVyID0gc2Nhbm5lci5zY2FuKCk7IGtpbmQgIT09IHN5bnRheEtpbmQuZW9mOyBraW5kID0gc2Nhbm5lci5zY2FuKCkpIHtcbiAgICAgIGlmIChcbiAgICAgICAgKHNjYW5uZXIuZ2V0VG9rZW5FcnJvcigpIGFzIG51bWJlcikgIT09IHNjYW5FcnJvck5vbmUgfHxcbiAgICAgICAgKGtpbmQgIT09IHN5bnRheEtpbmQubGluZUNvbW1lbnRUcml2aWEgJiZcbiAgICAgICAgICBraW5kICE9PSBzeW50YXhLaW5kLmJsb2NrQ29tbWVudFRyaXZpYSAmJlxuICAgICAgICAgIGtpbmQgIT09IHN5bnRheEtpbmQudHJpdmlhICYmXG4gICAgICAgICAga2luZCAhPT0gc3ludGF4S2luZC5saW5lQnJlYWtUcml2aWEpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgLyoqXG4gICAqIFBhcnNlcyBhIEpTT05DIChKU09OIHdpdGggY29tbWVudHMpIG9iamVjdCBmcm9tIGNvbmZpZyBmaWxlcyBzdWNoIGFzIHRzY29uZmlnLmpzb24sXG4gICAqIHB5cmlnaHRjb25maWcuanNvbiwgcmVub3ZhdGUuanNvbiwgLnZzY29kZS9zZXR0aW5ncy5qc29uLCBhbmQgd3JhbmdsZXIuanNvbmMuXG4gICAqXG4gICAqIGpzb25jLXBhcnNlciBpcyBmYXVsdCB0b2xlcmFudCBhbmQgcmV0dXJucyBhIHBhcnRpYWwgb2JqZWN0IGZvciBtYWxmb3JtZWQgaW5wdXQsIHdoaWNoIG11c3RcbiAgICogbm90IGJlIHRyZWF0ZWQgYXMgdGhlIGZpbGUncyBjb25maWd1cmF0aW9uOyByZWplY3QgYW55IHBhcnNlIGVycm9yIGluc3RlYWQuIEEgbGVhZGluZyBCT00gaXNcbiAgICogc3RyaXBwZWQgYmVjYXVzZSBUeXBlU2NyaXB0IGFjY2VwdHMgQk9NJ2QgY29uZmlnIGZpbGVzIHdoaWxlIGpzb25jLXBhcnNlciByZXBvcnRzIHRoZSBCT00gYXNcbiAgICogYSBwYXJzZSBlcnJvci4gQ2FsbGVycyB3aG9zZSByZWFkZXIgcmVqZWN0cyB0cmFpbGluZyBjb21tYXMgdHVybiBgYWxsb3dUcmFpbGluZ0NvbW1hYFxuICAgKiBvZmYgc28gc3VjaCBhIGZpbGUgaXMgcmVwb3J0ZWQgYXMgbWFsZm9ybWVkIGhlcmUgdG9vLlxuICAgKi9cbiAgcGFyc2VPYmplY3RJZ25vcmluZ0Vycm9yPFQgZXh0ZW5kcyBvYmplY3Q+KGNvbnRlbnQ6IHN0cmluZywgYWxsb3dUcmFpbGluZ0NvbW1hID0gdHJ1ZSk6IFQgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHBhcnNlRXJyb3JzOiBQYXJzZUVycm9yW10gPSBbXTtcbiAgICBjb25zdCB2YWx1ZSA9IHBhcnNlSnNvbmMoY29udGVudC5yZXBsYWNlKC9eXFx1RkVGRi8sICcnKSwgcGFyc2VFcnJvcnMsIHsgYWxsb3dUcmFpbGluZ0NvbW1hIH0pIGFzIFQgfCB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHBhcnNlRXJyb3JzLmxlbmd0aCA9PT0gMCAmJiAhIXZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpXG4gICAgICA/IHZhbHVlXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgfSxcbiAgLyoqIFRlbGxzIHdoZXRoZXIgdGhlIGNvbnRlbnQgY2FycmllcyBhdCBsZWFzdCBvbmUgY29tbWVudCwgaS5lLiBjb250ZW50IEpTT04uc3RyaW5naWZ5IHdvdWxkIGRyb3AuICovXG4gIGNvbnRhaW5zQ29tbWVudChjb250ZW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBzY2FubmVyID0gY3JlYXRlU2Nhbm5lcihjb250ZW50LnJlcGxhY2UoL15cXHVGRUZGLywgJycpKTtcbiAgICBmb3IgKGxldCBraW5kOiBudW1iZXIgPSBzY2FubmVyLnNjYW4oKTsga2luZCAhPT0gc3ludGF4S2luZC5lb2Y7IGtpbmQgPSBzY2FubmVyLnNjYW4oKSkge1xuICAgICAgLy8gQSBsZXhpY2FsIGVycm9yIG1lYW5zIHRoZSByZW1haW5pbmcgdG9rZW5zIGFyZSB1bnJlbGlhYmxlOyByZXBvcnQgbm8gY29tbWVudCByYXRoZXIgdGhhblxuICAgICAgLy8gZ3Vlc3NpbmcuIEEgY2FsbGVyIHRoYXQgb25seSB3YXJucyBhYm91dCBkcm9wcGVkIGNvbW1lbnRzIGxvc2VzIG5vdGhpbmcsIGFuZCBvbmUgdGhhdFxuICAgICAgLy8gcmVmdXNlcyBhIGNvbW1lbnRlZCBmaWxlIGZvciBhIHN0cmljdC1KU09OIHJlYWRlciBzdGlsbCByZWplY3RzIHN1Y2ggY29udGVudCB3aGVuIGl0XG4gICAgICAvLyBwYXJzZXMgaXQuXG4gICAgICBpZiAoKHNjYW5uZXIuZ2V0VG9rZW5FcnJvcigpIGFzIG51bWJlcikgIT09IHNjYW5FcnJvck5vbmUpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmIChraW5kID09PSBzeW50YXhLaW5kLmxpbmVDb21tZW50VHJpdmlhIHx8IGtpbmQgPT09IHN5bnRheEtpbmQuYmxvY2tDb21tZW50VHJpdmlhKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuICAvKipcbiAgICogU2VyaWFsaXplcyBgc2V0dGluZ3NgIGludG8gYG9sZENvbnRlbnRgLCBlZGl0aW5nIG9ubHkgdGhlIHRvcC1sZXZlbCBwcm9wZXJ0aWVzIHdob3NlIHZhbHVlc1xuICAgKiBjaGFuZ2VkIHNvIHRoZSBjb21tZW50cyBhbmQgZm9ybWF0dGluZyBvZiBhbiBleGlzdGluZyBmaWxlIHN1cnZpdmUuIENhbGxlcnMgbmV2ZXIgZHJvcFxuICAgKiBwcm9wZXJ0aWVzIChnZW5lcmF0ZWQgc2V0dGluZ3MgYXJlIG1lcmdlZCBPTiBUT1Agb2YgdGhlIGV4aXN0aW5nIG9uZXMpLCBzbyByZW1vdmFscyBhcmUgbm90XG4gICAqIGhhbmRsZWQ6IGEgcHJvcGVydHkgbWlzc2luZyBmcm9tIGBzZXR0aW5nc2AgaXMgbGVmdCB1bnRvdWNoZWQgcmF0aGVyIHRoYW4gZGVsZXRlZC5cbiAgICpcbiAgICogVHJpdmlhLW9ubHkgY29udGVudCBrZWVwcyBpdHMgY29tbWVudHMgYXMgYSBoZWFkZXIgYWJvdmUgdGhlIGdlbmVyYXRlZCBvYmplY3QsIHJhdGhlciB0aGFuXG4gICAqIGJlaW5nIHJlcGxhY2VkIG91dHJpZ2h0IG9yIHJ1biB0aHJvdWdoIG1vZGlmeSgpICh3aGljaCB3b3VsZCBtb3ZlIHRoZSBvYmplY3QgaW4gZnJvbnQgb2YgdGhlbSkuXG4gICAqL1xuICBzdHJpbmdpZnlQcmVzZXJ2aW5nVHJpdmlhKFxuICAgIG9sZENvbnRlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBzZXR0aW5nczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKTogeyBjb250ZW50OiBzdHJpbmc7IGtleXNMb3NpbmdDb21tZW50czogc3RyaW5nW10gfSB7XG4gICAgaWYgKG9sZENvbnRlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHsgY29udGVudDogSlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MsIHVuZGVmaW5lZCwgMiksIGtleXNMb3NpbmdDb21tZW50czogW10gfTtcbiAgICB9XG5cbiAgICBjb25zdCBvbGRTZXR0aW5ncyA9IGpzb25jVXRpbC5wYXJzZU9iamVjdElnbm9yaW5nRXJyb3I8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KG9sZENvbnRlbnQpO1xuICAgIC8vIERyb3AgYSBsZWFkaW5nIEJPTTogbW9kaWZ5KCkgaW5zZXJ0cyB0aGUgZ2VuZXJhdGVkIG9iamVjdCBCRUZPUkUgYW55IGxlYWRpbmcgdHJpdmlhLCB3aGljaFxuICAgIC8vIHdvdWxkIGxlYXZlIHRoZSBCT00gc3RyYW5kZWQgbWlkLWZpbGUgd2hlcmUgaXQgaXMgYSBzeW50YXggZXJyb3IgcmF0aGVyIHRoYW4gYW4gaWdub3JlZCBtYXJrLlxuICAgIGxldCBjb250ZW50ID0gb2xkQ29udGVudC5yZXBsYWNlKC9eXFx1RkVGRi8sICcnKTtcbiAgICBpZiAoanNvbmNVdGlsLmlzVHJpdmlhT25seShjb250ZW50KSkge1xuICAgICAgY29uc3QgaGVhZGVyID0gY29udGVudC50cmltKCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBgJHtoZWFkZXIgPyBoZWFkZXIgKyAnXFxuJyA6ICcnfSR7SlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MsIHVuZGVmaW5lZCwgMil9YCxcbiAgICAgICAga2V5c0xvc2luZ0NvbW1lbnRzOiBbXSxcbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IG1vZGlmeU9wdGlvbnMgPSB7IGZvcm1hdHRpbmdPcHRpb25zOiBkZXRlY3RGb3JtYXR0aW5nT3B0aW9ucyhjb250ZW50KSB9O1xuICAgIGNvbnN0IGtleXNMb3NpbmdDb21tZW50czogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBuZXdFbnRyaWVzOiBbc3RyaW5nLCB1bmtub3duXVtdID0gW107XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc2V0dGluZ3MpKSB7XG4gICAgICBjb25zdCBvbGRWYWx1ZSA9IG9sZFNldHRpbmdzPy5ba2V5XTtcbiAgICAgIC8vIENvbXBhcmUgc2VyaWFsaXplZCBmb3JtcyBzbyBkZWVwLWVxdWFsIHZhbHVlcyAoZS5nLiBhIHJlLW1lcmdlZCBgZXh0ZW5kc2AgYXJyYXkpIGRvIG5vdFxuICAgICAgLy8gcmV3cml0ZSB0aGUgcHJvcGVydHkgYW5kIHJlZmxvdyBpdHMgZm9ybWF0dGluZy5cbiAgICAgIGlmIChKU09OLnN0cmluZ2lmeShvbGRWYWx1ZSkgPT09IEpTT04uc3RyaW5naWZ5KHZhbHVlKSkgY29udGludWU7XG4gICAgICBpZiAob2xkVmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBuZXdFbnRyaWVzLnB1c2goW2tleSwgdmFsdWVdKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICAvLyBSZXBsYWNpbmcgYSB3aG9sZSBhcnJheSB3b3VsZCBkaXNjYXJkIHRoZSBjb21tZW50cyBiZXR3ZWVuIGl0cyBlbGVtZW50cywgc28gZ3JvdyBpdCB3aXRoXG4gICAgICAvLyBwZXItZWxlbWVudCBpbnNlcnRpb25zIHdoZW5ldmVyIHRoZSBuZXcgdmFsdWUgb25seSBhZGRzIHRvIGl0LlxuICAgICAgY29uc3QgaW5zZXJ0aW9ucyA9IEFycmF5LmlzQXJyYXkob2xkVmFsdWUpICYmIEFycmF5LmlzQXJyYXkodmFsdWUpID8gZmluZEluc2VydGlvbnMob2xkVmFsdWUsIHZhbHVlKSA6IHVuZGVmaW5lZDtcbiAgICAgIGZvciAoY29uc3QgaW5zZXJ0aW9uIG9mIGluc2VydGlvbnMgPz8gW10pIHtcbiAgICAgICAgY29udGVudCA9IGFwcGx5RWRpdHMoXG4gICAgICAgICAgY29udGVudCxcbiAgICAgICAgICBtb2RpZnkoY29udGVudCwgW2tleSwgaW5zZXJ0aW9uLmluZGV4XSwgaW5zZXJ0aW9uLnZhbHVlLCB7IC4uLm1vZGlmeU9wdGlvbnMsIGlzQXJyYXlJbnNlcnRpb246IHRydWUgfSlcbiAgICAgICAgKTtcbiAgICAgICAgY29udGVudCA9IHJlc3RvcmVUcmFpbGluZ0NvbW1lbnQoY29udGVudCwga2V5LCBpbnNlcnRpb24uaW5kZXgpO1xuICAgICAgfVxuICAgICAgaWYgKGluc2VydGlvbnMpIGNvbnRpbnVlO1xuICAgICAgLy8gUmV3cml0aW5nIHRoZSB3aG9sZSB2YWx1ZSBpcyB0aGUgb25seSBvcHRpb24gbGVmdCAodGhlIG5ldyBvbmUgZHJvcHMgb3IgcmVvcmRlcnMgZWxlbWVudHMpLFxuICAgICAgLy8gYW5kIGl0IHRha2VzIGFueSBjb21tZW50IG5lc3RlZCBpbnNpZGUgaXQgYWxvbmcuIFJlcG9ydCB0aGF0IHJhdGhlciB0aGFuIGxvc2luZyBpdCBxdWlldGx5LlxuICAgICAgY29uc3QgcmVwbGFjZWRUZXh0ID0gdmFsdWVUZXh0T2YoY29udGVudCwga2V5KTtcbiAgICAgIGlmIChyZXBsYWNlZFRleHQgIT09IHVuZGVmaW5lZCAmJiBqc29uY1V0aWwuY29udGFpbnNDb21tZW50KHJlcGxhY2VkVGV4dCkpIGtleXNMb3NpbmdDb21tZW50cy5wdXNoKGtleSk7XG4gICAgICBjb250ZW50ID0gYXBwbHlFZGl0cyhjb250ZW50LCBtb2RpZnkoY29udGVudCwgW2tleV0sIHZhbHVlLCBtb2RpZnlPcHRpb25zKSk7XG4gICAgfVxuICAgIC8vIFByZXBlbmQgcmF0aGVyIHRoYW4gYXBwZW5kIHRoZSBwcm9wZXJ0aWVzIHRoYXQgYXJlIG5ldzogYXBwZW5kaW5nIGRldGFjaGVzIGEgdHJhaWxpbmdcbiAgICAvLyBzYW1lLWxpbmUgY29tbWVudCBmcm9tIHRoZSBsYXN0IHByb3BlcnR5LCBsZWF2aW5nIGl0IHRvIGRlc2NyaWJlIHRoZSBnZW5lcmF0ZWQgdmFsdWVcbiAgICAvLyBpbnN0ZWFkLiBJbnNlcnRpbmcgaW4gcmV2ZXJzZSBrZWVwcyB0aGUgb3JkZXIgdGhlIHNldHRpbmdzIGRlY2xhcmUgdGhlbSBpbi5cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBuZXdFbnRyaWVzLnRvUmV2ZXJzZWQoKSkge1xuICAgICAgY29udGVudCA9IGFwcGx5RWRpdHMoY29udGVudCwgbW9kaWZ5KGNvbnRlbnQsIFtrZXldLCB2YWx1ZSwgeyAuLi5tb2RpZnlPcHRpb25zLCBnZXRJbnNlcnRpb25JbmRleDogKCkgPT4gMCB9KSk7XG4gICAgfVxuICAgIHJldHVybiB7IGNvbnRlbnQsIGtleXNMb3NpbmdDb21tZW50cyB9O1xuICB9LFxufTtcblxuLyoqIFJldHVybnMgdGhlIHNvdXJjZSB0ZXh0IG9mIGEgdG9wLWxldmVsIHByb3BlcnR5J3MgdmFsdWUsIGNvbW1lbnRzIGFuZCBhbGwuICovXG5mdW5jdGlvbiB2YWx1ZVRleHRPZihjb250ZW50OiBzdHJpbmcsIGtleTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgcm9vdCA9IHBhcnNlVHJlZShjb250ZW50KTtcbiAgY29uc3Qgbm9kZSA9IHJvb3QgJiYgZmluZE5vZGVBdExvY2F0aW9uKHJvb3QsIFtrZXldKTtcbiAgcmV0dXJuIG5vZGUgJiYgY29udGVudC5zbGljZShub2RlLm9mZnNldCwgbm9kZS5vZmZzZXQgKyBub2RlLmxlbmd0aCk7XG59XG5cbi8vIFRoZSB3aG9sZSBzYW1lLWxpbmUgY29tbWVudCBzZXF1ZW5jZSwgbm90IGp1c3QgdGhlIGZpcnN0IG9uZTogYSBsaW5lIGNvbW1lbnQgZW5kcyBpdCAoaXQgcnVucyB0b1xuLy8gdGhlIG5ld2xpbmUpLCBidXQgYW55IG51bWJlciBvZiBibG9jayBjb21tZW50cyBjYW4gcHJlY2VkZSBpdCwgYW5kIG1vdmluZyBvbmx5IHRoZSBmaXJzdCB3b3VsZFxuLy8gbGVhdmUgdGhlIHJlc3QgZGVzY3JpYmluZyB0aGUgd3JvbmcgZWxlbWVudC5cbmNvbnN0IHRyYWlsaW5nQ29tbWVudFBhdHRlcm4gPSAvXig/OlteXFxTXFxuXSpcXC9cXCpbXFxTXFxzXSo/XFwqXFwvKSooPzpbXlxcU1xcbl0qXFwvXFwvW15cXG5dKik/L3U7XG5cbi8qKlxuICogUmVhdHRhY2hlcyBhIHNhbWUtbGluZSBjb21tZW50IHRvIHRoZSBlbGVtZW50IGl0IGRlc2NyaWJlcy4gSW5zZXJ0aW5nIGludG8gYW4gYXJyYXkgcGxhY2VzIHRoZVxuICogbmV3IGVsZW1lbnQgQkVGT1JFIHRoZSB0cml2aWEgdGhhdCBmb2xsb3dzIGl0cyBwcmVkZWNlc3Nvciwgc28gYXBwZW5kaW5nIGFmdGVyXG4gKiBgeyAuLi4gfSAvLyB3aHkgdGhpcyBydWxlIGV4aXN0c2AgbGVhdmVzIHRoYXQgY29tbWVudCBleHBsYWluaW5nIHRoZSBnZW5lcmF0ZWQgZWxlbWVudCBpbnN0ZWFkLlxuICogQSBmcmVzaGx5IHNlcmlhbGl6ZWQgZWxlbWVudCBuZXZlciBjYXJyaWVzIGEgY29tbWVudCBvZiBpdHMgb3duLCBzbyBhbnl0aGluZyB0cmFpbGluZyB0aGVcbiAqIGluc2VydGlvbiBiZWxvbmdlZCB0byB0aGUgZWxlbWVudCBiZWZvcmUgaXQuXG4gKi9cbmZ1bmN0aW9uIHJlc3RvcmVUcmFpbGluZ0NvbW1lbnQoY29udGVudDogc3RyaW5nLCBrZXk6IHN0cmluZywgaW5zZXJ0ZWRJbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgaWYgKGluc2VydGVkSW5kZXggPT09IDApIHJldHVybiBjb250ZW50O1xuICBjb25zdCByb290ID0gcGFyc2VUcmVlKGNvbnRlbnQpO1xuICBjb25zdCBlbGVtZW50cyA9IChyb290ICYmIGZpbmROb2RlQXRMb2NhdGlvbihyb290LCBba2V5XSkpPy5jaGlsZHJlbjtcbiAgY29uc3QgaW5zZXJ0ZWQgPSBlbGVtZW50cz8uW2luc2VydGVkSW5kZXhdO1xuICBjb25zdCBwcmV2aW91cyA9IGVsZW1lbnRzPy5baW5zZXJ0ZWRJbmRleCAtIDFdO1xuICBpZiAoIWluc2VydGVkIHx8ICFwcmV2aW91cykgcmV0dXJuIGNvbnRlbnQ7XG4gIGNvbnN0IGluc2VydGVkRW5kID0gaW5zZXJ0ZWQub2Zmc2V0ICsgaW5zZXJ0ZWQubGVuZ3RoO1xuICBjb25zdCBjb21tZW50ID0gdHJhaWxpbmdDb21tZW50UGF0dGVybi5leGVjKGNvbnRlbnQuc2xpY2UoaW5zZXJ0ZWRFbmQpKT8uWzBdO1xuICBpZiAoIWNvbW1lbnQpIHJldHVybiBjb250ZW50O1xuICAvLyBMYW5kIHRoZSBjb21tZW50IGFmdGVyIHRoZSBzZXBhcmF0aW5nIGNvbW1hIHNvIHRoZSBlbGVtZW50IGtlZXBzIGl0cyBvd24gbGluZSBpbnRhY3QuXG4gIGNvbnN0IHByZXZpb3VzRW5kID0gcHJldmlvdXMub2Zmc2V0ICsgcHJldmlvdXMubGVuZ3RoO1xuICBjb25zdCByZXN0b3JlT2Zmc2V0ID0gcHJldmlvdXNFbmQgKyAoL15cXHMqLC91LmV4ZWMoY29udGVudC5zbGljZShwcmV2aW91c0VuZCkpPy5bMF0ubGVuZ3RoID8/IDApO1xuICByZXR1cm4gKFxuICAgIGNvbnRlbnQuc2xpY2UoMCwgcmVzdG9yZU9mZnNldCkgK1xuICAgIGNvbW1lbnQgK1xuICAgIGNvbnRlbnQuc2xpY2UocmVzdG9yZU9mZnNldCwgaW5zZXJ0ZWRFbmQpICtcbiAgICBjb250ZW50LnNsaWNlKGluc2VydGVkRW5kICsgY29tbWVudC5sZW5ndGgpXG4gICk7XG59XG5cbi8qKlxuICogTWlycm9ycyB0aGUgaW5kZW50YXRpb24gdGhlIGZpbGUgYWxyZWFkeSB1c2VzLCBzbyBhIHNlbWFudGljIGNoYW5nZSBkb2VzIG5vdCByZWluZGVudCB1bnJlbGF0ZWRcbiAqIGxpbmVzLiBUaGUgZmlyc3QgcHJvcGVydHkgaXMgbWVhc3VyZWQgcmF0aGVyIHRoYW4gdGhlIGZpcnN0IGluZGVudGVkIGxpbmUsIGJlY2F1c2UgYSBkZWNvcmF0ZWRcbiAqIGJsb2NrIGNvbW1lbnQgKGAgKiAuLi5gKSB3b3VsZCBvdGhlcndpc2UgcGFzcyBmb3IgdGhlIGZpbGUncyBpbmRlbnRhdGlvbi4gRmFsbHMgYmFjayB0byB0aGUgdHdvXG4gKiBzcGFjZXMgZXZlcnkgZ2VuZXJhdGVkIGNvbmZpZyB1c2VzLlxuICovXG5mdW5jdGlvbiBkZXRlY3RGb3JtYXR0aW5nT3B0aW9ucyhjb250ZW50OiBzdHJpbmcpOiB7IGluc2VydFNwYWNlczogYm9vbGVhbjsgdGFiU2l6ZTogbnVtYmVyIH0ge1xuICBjb25zdCBmaXJzdFByb3BlcnR5ID0gcGFyc2VUcmVlKGNvbnRlbnQpPy5jaGlsZHJlbj8uWzBdO1xuICBjb25zdCBpbmRlbnRhdGlvbiA9XG4gICAgZmlyc3RQcm9wZXJ0eSAmJiBjb250ZW50LnNsaWNlKGNvbnRlbnQubGFzdEluZGV4T2YoJ1xcbicsIGZpcnN0UHJvcGVydHkub2Zmc2V0KSArIDEsIGZpcnN0UHJvcGVydHkub2Zmc2V0KTtcbiAgaWYgKCFpbmRlbnRhdGlvbiB8fCAhL15bXFx0IF0rJC91LnRlc3QoaW5kZW50YXRpb24pKSByZXR1cm4geyBpbnNlcnRTcGFjZXM6IHRydWUsIHRhYlNpemU6IDIgfTtcbiAgaWYgKGluZGVudGF0aW9uLnN0YXJ0c1dpdGgoJ1xcdCcpKSByZXR1cm4geyBpbnNlcnRTcGFjZXM6IGZhbHNlLCB0YWJTaXplOiAxIH07XG4gIHJldHVybiB7IGluc2VydFNwYWNlczogdHJ1ZSwgdGFiU2l6ZTogaW5kZW50YXRpb24ubGVuZ3RoIH07XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZWxlbWVudHMgdG8gaW5zZXJ0IGludG8gYG9sZFZhbHVlYCB0byB0dXJuIGl0IGludG8gYG5ld1ZhbHVlYCwgb3IgdW5kZWZpbmVkIHdoZW5cbiAqIHRoYXQgaXMgaW1wb3NzaWJsZSBiZWNhdXNlIGBuZXdWYWx1ZWAgZHJvcHMgb3IgcmVvcmRlcnMgYW4gZXhpc3RpbmcgZWxlbWVudCAodGhlIGNhbGxlciBtdXN0XG4gKiB0aGVuIHJlcGxhY2UgdGhlIGFycmF5IHdob2xlc2FsZSkuIEluZGljZXMgYWRkcmVzcyB0aGUgYXJyYXkgYXMgaXQgZ3Jvd3MsIHNvIGFwcGx5aW5nIHRoZVxuICogaW5zZXJ0aW9ucyBsZWZ0IHRvIHJpZ2h0IHlpZWxkcyBgbmV3VmFsdWVgLlxuICovXG5mdW5jdGlvbiBmaW5kSW5zZXJ0aW9ucyhvbGRWYWx1ZTogdW5rbm93bltdLCBuZXdWYWx1ZTogdW5rbm93bltdKTogeyBpbmRleDogbnVtYmVyOyB2YWx1ZTogdW5rbm93biB9W10gfCB1bmRlZmluZWQge1xuICBjb25zdCBpbnNlcnRpb25zOiB7IGluZGV4OiBudW1iZXI7IHZhbHVlOiB1bmtub3duIH1bXSA9IFtdO1xuICBsZXQgb2xkSW5kZXggPSAwO1xuICBmb3IgKGNvbnN0IFtuZXdJbmRleCwgZWxlbWVudF0gb2YgbmV3VmFsdWUuZW50cmllcygpKSB7XG4gICAgaWYgKG9sZEluZGV4IDwgb2xkVmFsdWUubGVuZ3RoICYmIEpTT04uc3RyaW5naWZ5KG9sZFZhbHVlW29sZEluZGV4XSkgPT09IEpTT04uc3RyaW5naWZ5KGVsZW1lbnQpKSB7XG4gICAgICBvbGRJbmRleCsrO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGluc2VydGlvbnMucHVzaCh7IGluZGV4OiBuZXdJbmRleCwgdmFsdWU6IGVsZW1lbnQgfSk7XG4gIH1cbiAgcmV0dXJuIG9sZEluZGV4ID09PSBvbGRWYWx1ZS5sZW5ndGggPyBpbnNlcnRpb25zIDogdW5kZWZpbmVkO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbi8qKlxuICogUmVjb2duaXplcyB0aGUgbWFuYWdlZCBgd2IgZ2VuLWNvZGVgIHNlZ21lbnQsIGEgb25lLWxldmVsIHBhY2thZ2Utc2NyaXB0IHdyYXBwZXIgYXJvdW5kIGl0LCBhbmRcbiAqIGN1c3RvbSBzZWdtZW50cyB0aGF0IHdiZnkgbGVhdmVzIGFsb25lLlxuICovXG50eXBlIFNjcmlwdFNlZ21lbnRLaW5kID0gJ2N1c3RvbScgfCAnZ2VuQ29kZScgfCAnZ2VuQ29kZVdyYXBwZXInO1xuXG5jb25zdCBnZW5Db2RlU2VnbWVudFBhdHRlcm4gPSAvXmJ1blxccyt3YlxccytnZW4tY29kZSQvdTtcblxuLy8gQSBydW5uZXIgZGVsZWdhdGluZyB0byBvbmUgb2YgdGhpcyBwYWNrYWdlJ3Mgb3duIHNjcmlwdHMsIGUuZy4gYGJ1biBydW4gZ2VuLXR5cGVzYC5cbmNvbnN0IHNjcmlwdFJ1bm5lclBhdHRlcm4gPSAvXmJ1blxccytydW5cXHMrKFxcUyspJC91O1xuXG4vLyBBbnl0aGluZyB3YmZ5J3MgYCYmYCBzcGxpdCBjYW5ub3QgbW9kZWwgKHBpcGVzLCBzZXF1ZW5jaW5nLCByZWRpcmVjdGlvbnMsIHF1b3RpbmcsIHN1YnN0aXR1dGlvbnMsIGRpcmVjdG9yeVxuLy8gY2hhbmdlcykuIFNjcmlwdHMgY29udGFpbmluZyBpdCBhcmUgbGVmdCB1bnRvdWNoZWQgaW5zdGVhZCBvZiBiZWluZyByZXdyaXR0ZW4gZnJvbSBhIHdyb25nIHBhcnNlLlxuY29uc3QgdW5zdXBwb3J0ZWRTaGVsbFN5bnRheFBhdHRlcm4gPSAvW1xcbjt8PD5gJCdcIigpXXxcXGJjZFxccy91O1xuXG4vKipcbiAqIFNwbGl0cyBhIHNjcmlwdCBpbnRvIGAmJmAtc2VwYXJhdGVkIHNlZ21lbnRzLCBvciByZXR1cm5zIHVuZGVmaW5lZCB3aGVuIHRoZSBzY3JpcHQgdXNlcyBzaGVsbCBzeW50YXggd2JmeVxuICogZGVsaWJlcmF0ZWx5IGRvZXMgbm90IG1vZGVsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3BsaXRTY3JpcHRTZWdtZW50cyhzY3JpcHQ6IHN0cmluZyk6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHVuc3VwcG9ydGVkU2hlbGxTeW50YXhQYXR0ZXJuLnRlc3Qoc2NyaXB0KSkgcmV0dXJuO1xuICByZXR1cm4gc2NyaXB0XG4gICAgLnNwbGl0KCcmJicpXG4gICAgLm1hcCgoc2VnbWVudCkgPT4gc2VnbWVudC50cmltKCkpXG4gICAgLmZpbHRlcihCb29sZWFuKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsYXNzaWZ5U2NyaXB0U2VnbWVudChcbiAgc2VnbWVudDogc3RyaW5nLFxuICBzY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzLFxuICBmb2xsb3dzV3JhcHBlciA9IHRydWVcbik6IFNjcmlwdFNlZ21lbnRLaW5kIHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IHNlZ21lbnQudHJpbSgpLnJlcGxhY2VBbGwoL1xccysvZ3UsICcgJyk7XG4gIGlmIChnZW5Db2RlU2VnbWVudFBhdHRlcm4udGVzdChub3JtYWxpemVkKSkgcmV0dXJuICdnZW5Db2RlJztcbiAgLy8gQSBvbmUtbGV2ZWwgd3JhcHBlciBsb29rdXAgY292ZXJzIGBcInBvc3RpbnN0YWxsXCI6IFwiYnVuIHJ1biBnZW4tdHlwZXNcImAsIHRoZSBzaGFwZSB0aGVzZSByZXBvc2l0b3JpZXMgdXNlO1xuICAvLyBkZWVwZXIgY2hhaW5zIHN0YXkgY3VzdG9tIHNvIHdiZnkgY2Fubm90IGxvb3Agb24gYSBzZWxmLXJlZmVyZW50aWFsIHNjcmlwdC5cbiAgY29uc3Qgc2NyaXB0TmFtZSA9IGZvbGxvd3NXcmFwcGVyID8gc2NyaXB0UnVubmVyUGF0dGVybi5leGVjKG5vcm1hbGl6ZWQpPy5bMV0gOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHRhcmdldCA9IHNjcmlwdE5hbWUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHNjcmlwdHNbc2NyaXB0TmFtZV07XG4gIGlmICghdGFyZ2V0KSByZXR1cm4gJ2N1c3RvbSc7XG4gIGNvbnN0IHNlZ21lbnRzID0gc3BsaXRTY3JpcHRTZWdtZW50cyh0YXJnZXQpO1xuICAvLyBBIHdyYXBwZXIgYXJvdW5kIGEgQ1VTVE9NSVpFRCBnZW4tY29kZSAoYGJ1biB3YiBnZW4tY29kZSAmJiBidW4gcnVuIGJ1aWxkLWFzc2V0c2ApIHN0aWxsIHBlcmZvcm1zIHRoZSBtYW5hZ2VkXG4gIC8vIGdlbmVyYXRpb24sIHNvIGl0IGNvdW50cyBhcyBnZW4tY29kZTsgdHJlYXRpbmcgaXQgYXMgY3VzdG9tIHdvdWxkIGFwcGVuZCBhIHNlY29uZCBgd2IgZ2VuLWNvZGVgIGFuZCBydW4gZXZlcnlcbiAgLy8gZ2VuZXJhdG9yIHR3aWNlIHBlciBpbnN0YWxsLlxuICBpZiAoc2VnbWVudHM/Lmxlbmd0aCAhPT0gMSkge1xuICAgIC8vIEEgd3JhcHBlciBhcm91bmQgYSBDVVNUT01JWkVEIGdlbi1jb2RlIChgYnVuIHdiIGdlbi1jb2RlICYmIGJ1biBydW4gYnVpbGQtYXNzZXRzYCkgYWxyZWFkeSBwZXJmb3JtcyB0aGVcbiAgICAvLyBtYW5hZ2VkIGdlbmVyYXRpb24gQU5EIHRoZSBwcm9qZWN0J3Mgb3duIHN0ZXBzLCBzbyBpdCBpcyB0aGUgaW5zdGFsbC10aW1lIGVudHJ5IHBvaW50OiBpdCBtdXN0IGJlIGtlcHQgYXNcbiAgICAvLyB3cml0dGVuLiBSZXBsYWNpbmcgaXQgd2l0aCBhIGJhcmUgYHdiIGdlbi1jb2RlYCB3b3VsZCBkcm9wIHRob3NlIHN0ZXBzOyBhcHBlbmRpbmcgb25lIHdvdWxkIHJ1biBldmVyeVxuICAgIC8vIGdlbmVyYXRvciB0d2ljZS5cbiAgICByZXR1cm4gc2VnbWVudHM/LnNvbWUoKGlubmVyKSA9PiBnZW5Db2RlU2VnbWVudFBhdHRlcm4udGVzdChpbm5lci50cmltKCkucmVwbGFjZUFsbCgvXFxzKy9ndSwgJyAnKSkpXG4gICAgICA/ICdnZW5Db2RlV3JhcHBlcidcbiAgICAgIDogJ2N1c3RvbSc7XG4gIH1cbiAgcmV0dXJuIGNsYXNzaWZ5U2NyaXB0U2VnbWVudChzZWdtZW50c1swXSA/PyAnJywgc2NyaXB0cywgZmFsc2UpO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBTcGF3blN5bmNPcHRpb25zIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3blN5bmMoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcsIHJldHJ5ID0gMCk6IHZvaWQge1xuICBzcGF3blN5bmNBbmRSZXR1cm5TdGF0dXMoY29tbWFuZCwgYXJncywgY3dkLCByZXRyeSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3blN5bmNBbmRSZXR1cm5TdGF0dXMoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcsIHJldHJ5ID0gMCk6IG51bWJlciB7XG4gIGRvIHtcbiAgICBjb25zdCBbbmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zXSA9IGdldFNwYXduU3luY0FyZ3MoY29tbWFuZCwgYXJncywgY3dkKTtcbiAgICBjb25zb2xlLmxvZyhgJCAke25ld0NtZH0gJHtuZXdBcmdzLmpvaW4oJyAnKX0gYXQgJHtjd2R9YCk7XG4gICAgY29uc3QgcmV0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMobmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zKTtcbiAgICBjb25zdCBzdGF0dXMgPSByZXQuc3RhdHVzID8/IDE7XG4gICAgaWYgKHN0YXR1cyA9PT0gMCkgYnJlYWs7XG4gICAgaWYgKHJldHJ5IDw9IDApIHJldHVybiBzdGF0dXM7XG4gIH0gd2hpbGUgKC0tcmV0cnkgPj0gMCk7XG4gIHJldHVybiAwO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHNwYXduU3luY0FuZFJldHVyblN0ZG91dEludGVybmFsKGNvbW1hbmQsIGFyZ3MsIGN3ZClbMV07XG59XG5cbmZ1bmN0aW9uIHNwYXduU3luY0FuZFJldHVyblN0ZG91dEludGVybmFsKGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nKTogW251bWJlciwgc3RyaW5nXSB7XG4gIGNvbnN0IFtuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnNdID0gZ2V0U3Bhd25TeW5jQXJncyhjb21tYW5kLCBhcmdzLCBjd2QpO1xuICBvcHRpb25zLnN0ZGlvID0gJ3BpcGUnO1xuICBjb25zdCBwcm9jID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMobmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zKTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb24gLS0gc3Bhd25TeW5jIHJldHVybnMgbnVsbCBzdGRlcnIgb24gRU5PRU5ULlxuICBjb25zdCBzdGRlcnIgPSBwcm9jLnN0ZGVyciA/PyAnJztcbiAgY29uc3QgZXJyb3IgPSB0eXBlb2Ygc3RkZXJyID09PSAnc3RyaW5nJyA/IHN0ZGVyci50cmltKCkgOiBzdGRlcnIudG9TdHJpbmcoKS50cmltKCk7XG4gIGlmIChwcm9jLmVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihgJHtuZXdDbWR9IFske25ld0FyZ3MubWFwKChzKSA9PiBgXCIke3N9XCJgKS5qb2luKCcsICcpfV0gZmFpbGVkIHdpdGg6ICR7cHJvYy5lcnJvci5tZXNzYWdlfWApO1xuICB9IGVsc2UgaWYgKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihcbiAgICAgIGAke25ld0NtZH0gWyR7bmV3QXJncy5tYXAoKHMpID0+IGBcIiR7c31cImApLmpvaW4oJywgJyl9XSBvdXRwdXRzIHRoZSBmb2xsb3dpbmcgY29udGVudCB0byBzdGRlcnI6XFxuJHtlcnJvcn1gXG4gICAgKTtcbiAgfVxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvbiAtLSBzcGF3blN5bmMgcmV0dXJucyBudWxsIHN0ZG91dCBvbiBFTk9FTlQuXG4gIGNvbnN0IHN0ZG91dCA9IHByb2Muc3Rkb3V0ID8/ICcnO1xuICBjb25zdCBzdGRvdXRUZXh0ID0gdHlwZW9mIHN0ZG91dCA9PT0gJ3N0cmluZycgPyBzdGRvdXQgOiBzdGRvdXQudG9TdHJpbmcoKTtcbiAgcmV0dXJuIFtwcm9jLnN0YXR1cyA/PyAxLCBzdGRvdXRUZXh0LnRyaW0oKV07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTcGF3blN5bmNBcmdzKGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nKTogW3N0cmluZywgc3RyaW5nW10sIFNwYXduU3luY09wdGlvbnNdIHtcbiAgY29uc3QgZW52ID0geyAuLi5wcm9jZXNzLmVudiB9O1xuICBpZiAoZW52LlBBVEggJiYgZW52LkJFUlJZX0JJTl9GT0xERVIpIHtcbiAgICBlbnYuUEFUSCA9IGVudi5QQVRILnNwbGl0KCc6JylcbiAgICAgIC5maWx0ZXIoKHApID0+IHAgIT09IGVudi5CRVJSWV9CSU5fRk9MREVSKVxuICAgICAgLmpvaW4oJzonKTtcbiAgfVxuXG4gIHJldHVybiBbXG4gICAgY29tbWFuZCxcbiAgICBhcmdzLFxuICAgIHtcbiAgICAgIGN3ZCxcbiAgICAgIGVudixcbiAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgICBzaGVsbDogZmFsc2UsXG4gICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIH0sXG4gIF07XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgZnNwIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgZXNjYXBlUmVnRXhwIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWIvc3JjJztcbmltcG9ydCB7IGdsb2JJZ25vcmUgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5cbmltcG9ydCB7IGdldE9jdG9raXQsIGdpdEh1YlV0aWwgfSBmcm9tICcuL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuaW1wb3J0IHsganNvbmNVdGlsIH0gZnJvbSAnLi91dGlscy9qc29uY1V0aWwuanMnO1xuaW1wb3J0IHsgY2xhc3NpZnlTY3JpcHRTZWdtZW50LCBzcGxpdFNjcmlwdFNlZ21lbnRzIH0gZnJvbSAnLi91dGlscy9tYW5hZ2VkU2NyaXB0U2VnbWVudC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQgfSBmcm9tICcuL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5pbXBvcnQgeyBnZXRXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzLCBnZXRXb3Jrc3BhY2VTdWJEaXJQYXRocyB9IGZyb20gJy4vdXRpbHMvd29ya3NwYWNlVXRpbC5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFja2FnZUNvbmZpZyB7XG4gIGRpclBhdGg6IHN0cmluZztcbiAgZG9ja2VyZmlsZTogc3RyaW5nO1xuICBpc1Jvb3Q6IGJvb2xlYW47XG4gIGlzUHVibGljUmVwbzogYm9vbGVhbjtcbiAgLy8gV2hldGhlciBpc1B1YmxpY1JlcG8gY29tZXMgZnJvbSBhbiBhY3R1YWwgR2l0SHViIEFQSSByZXNwb25zZTogYSBmYWlsZWQgbG9va3VwIChvZmZsaW5lLFxuICAvLyByYXRlLWxpbWl0ZWQsIGJhZCBjcmVkZW50aWFsKSBjb2xsYXBzZXMgdG8gaXNQdWJsaWNSZXBvPWZhbHNlLCB3aGljaCB2aXNpYmlsaXR5LXNlbnNpdGl2ZVxuICAvLyBnZW5lcmF0b3JzIG11c3Qgbm90IG1pc3Rha2UgZm9yIGEgY29uZmlybWVkIHByaXZhdGUgcmVwb3NpdG9yeS5cbiAgaXNSZXBvVmlzaWJpbGl0eUtub3duOiBib29sZWFuO1xuICBpc1JlZmVycmVkQnlPdGhlclJlcG86IGJvb2xlYW47XG4gIHJlcG9zaXRvcnk/OiBzdHJpbmc7XG4gIHJlcG9BdXRob3I/OiBzdHJpbmc7XG4gIHJlcG9OYW1lPzogc3RyaW5nO1xuICBpc1dpbGxCb29zdGVyUmVwbzogYm9vbGVhbjtcbiAgaXNDbG91ZGZsYXJlOiBib29sZWFuO1xuICBkb2VzQ29udGFpbldyYW5nbGVyQ29uZmlnOiBib29sZWFuO1xuICBpc1JhaWx3YXk6IGJvb2xlYW47XG4gIGlzRXNtUGFja2FnZTogYm9vbGVhbjtcbiAgaXNXaWxsQm9vc3RlckNvbmZpZ3M6IGJvb2xlYW47XG4gIC8qKiBEaXJlY3RvcmllcyBjb250YWluaW5nIENhcmdvLnRvbWwgKHJlbGF0aXZlIHRvIGRpclBhdGgsIHJvb3QtbW9zdCBmaXJzdCkuIEVtcHR5IGlmIHRoZSByZXBvIGhhcyBubyBSdXN0IGNvZGUuICovXG4gIGNhcmdvVG9tbERpclBhdGhzOiBzdHJpbmdbXTtcbiAgZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluRG9ja2VyZmlsZTogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5HZW1maWxlOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkdvTW9kOiBib29sZWFuO1xuICBkb2VzQ29udGFpblBhY2thZ2VKc29uOiBib29sZWFuO1xuICBkb2VzQ29udGFpblBvZXRyeUxvY2s6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVXZMb2NrOiBib29sZWFuO1xuICAvKiogV2hldGhlciBhIFB5dGhvbiBsb2NrZmlsZSAocG9ldHJ5LmxvY2sgLyB1di5sb2NrKSBleGlzdHMgYW55d2hlcmUgaW4gdGhlIGRpcmVjdG9yeSB0cmVlLiAqL1xuICBkb2VzQ29udGFpblB5dGhvbkxvY2tBbnl3aGVyZTogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Qb21YbWw6IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIGEgTWF2ZW4gcG9tLnhtbCBleGlzdHMgYW55d2hlcmUgaW4gdGhlIGRpcmVjdG9yeSB0cmVlLiAqL1xuICBkb2VzQ29udGFpblBvbVhtbEFueXdoZXJlOiBib29sZWFuO1xuICBkb2VzQ29udGFpblB1YnNwZWNZYW1sOiBib29sZWFuO1xuICAvKiogV2hldGhlciBhIFNsaWRldiBkZWNrIChgKi5zbGlkZXYubWRgKSBleGlzdHMgYW55d2hlcmUgaW4gdGhlIGRpcmVjdG9yeSB0cmVlLiAqL1xuICBkb2VzQ29udGFpblNsaWRldk1kOiBib29sZWFuO1xuICBkb2VzQ29udGFpblRhdXJpQ29uZmlnOiBib29sZWFuO1xuICBkb2VzQ29udGFpblRhdXJpQ29uZmlnSW5QYWNrYWdlczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5UZW1wbGF0ZVlhbWw6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVnNjb2RlU2V0dGluZ3NKc29uOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkphdmFTY3JpcHQ6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVHlwZVNjcmlwdDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Kc3hPclRzeDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5KYXZhOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkphdmFTY3JpcHRJblBhY2thZ2VzOiBib29sZWFuO1xuICBkb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkpzeE9yVHN4SW5QYWNrYWdlczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5KYXZhSW5QYWNrYWdlczogYm9vbGVhbjtcblxuICBkZXBlbmRpbmc6IHtcbiAgICBibGl0ejogYm9vbGVhbjtcbiAgICBmaXJlYmFzZTogYm9vbGVhbjtcbiAgICBnZW5JMThuVHM6IGJvb2xlYW47XG4gICAgbGl0ZXN0cmVhbTogYm9vbGVhbjtcbiAgICBuZXh0OiBib29sZWFuO1xuICAgIHBsYXl3cmlnaHRUZXN0OiBib29sZWFuO1xuICAgIHBsYXl3cmlnaHRSdW50aW1lOiBib29sZWFuO1xuICAgIHByaXNtYTogYm9vbGVhbjtcbiAgICBweXJpZ2h0OiBib29sZWFuO1xuICAgIHJlYWN0OiBib29sZWFuO1xuICAgIHJlYWN0TmF0aXZlOiBib29sZWFuO1xuICAgIHNlbWFudGljUmVsZWFzZTogYm9vbGVhbjtcbiAgICBzbGlkZXY6IGJvb2xlYW47XG4gICAgc3Rvcnlib29rOiBib29sZWFuO1xuICAgIHRhdXJpOiBib29sZWFuO1xuICAgIHZpbmV4dDogYm9vbGVhbjtcbiAgICB2aXRlOiBib29sZWFuO1xuICAgIHdiOiBib29sZWFuO1xuICAgIGNoYWtyYTogYm9vbGVhbjtcbiAgICBkcml6emxlOiBib29sZWFuO1xuICB9O1xuICByZWxlYXNlOiB7XG4gICAgYnJhbmNoZXM6IHN0cmluZ1tdO1xuICAgIGdpdGh1YjogYm9vbGVhbjtcbiAgICBucG06IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQW4gZXhwbGljaXQgYEBzZW1hbnRpYy1yZWxlYXNlL25wbWAgcGx1Z2luIGVudHJ5IHB1Ymxpc2hlcyB0aGUgcm9vdCBtYW5pZmVzdCBpdHNlbGZcbiAgICAgKiAobm8gcGtnUm9vdCByZWRpcmVjdGlvbiBhbmQgbnBtUHVibGlzaCBub3QgZGlzYWJsZWQpLlxuICAgICAqL1xuICAgIG5wbVB1Ymxpc2hlc1Jvb3Q6IGJvb2xlYW47XG4gIH07XG4gIG1pc2VUYXNrczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgcGFja2FnZUpzb24/OiBQYWNrYWdlSnNvbjtcbiAgd2JmeUpzb24/OiBXYmZ5SnNvbjtcbn1cblxudHlwZSBXYmZ5SnNvbiA9IHouaW5mZXI8dHlwZW9mIHdiZnlKc29uU2NoZW1hPjtcblxuY29uc3Qgd2JmeUpzb25TY2hlbWEgPSB6Lm9iamVjdCh7XG4gIHR5cG9zOiB6XG4gICAgLm9iamVjdCh7XG4gICAgICBhbGw6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgICBkb2M6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgICB0czogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICAgIHRleHQ6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgfSlcbiAgICAub3B0aW9uYWwoKSxcbn0pO1xuXG4vKipcbiAqIFRoZSBzZW1hbnRpYy1yZWxlYXNlIGNvbmZpZyBmaWxlcyB3YmZ5IGV4cGVjdHMsIGluIGNvc21pY29uZmlnJ3MgcmVzb2x1dGlvbiBvcmRlciAodGhlIGxlYWRpbmdcbiAqIHBhY2thZ2UuanNvbiBlbnRyeSBpcyBjaGVja2VkIGJ5IHRoZSBjYWxsZXIpLiB3YmZ5IGdlbmVyYXRlcyAucmVsZWFzZXJjLmpzb247IHRoZSBvdGhlciBzcGVsbGluZ3NcbiAqIGFyZSBsaXN0ZWQgb25seSB0byBkZXRlY3QgYSBoYW5kLXdyaXR0ZW4gY29uZmlnLCB3aG9zZSBmb3JtYXQgSlNPTi5wYXJzZSBjYW5ub3QgcmVhZCBhbmQgd2hvc2VcbiAqIHBsdWdpbiBsaXN0IGlzIHRoZXJlZm9yZSBzdGF0aWNhbGx5IHVuaW5zcGVjdGFibGUuXG4gKi9cbmNvbnN0IHNlbWFudGljUmVsZWFzZUNvbmZpZ1NlYXJjaFBsYWNlczogeyBmaWxlTmFtZTogc3RyaW5nOyBqc29uUGFyc2VhYmxlOiBib29sZWFuIH1bXSA9IFtcbiAgeyBmaWxlTmFtZTogJy5yZWxlYXNlcmMnLCBqc29uUGFyc2VhYmxlOiB0cnVlIH0sXG4gIHsgZmlsZU5hbWU6ICcucmVsZWFzZXJjLmpzb24nLCBqc29uUGFyc2VhYmxlOiB0cnVlIH0sXG4gIHsgZmlsZU5hbWU6ICcucmVsZWFzZXJjLnlhbWwnLCBqc29uUGFyc2VhYmxlOiBmYWxzZSB9LFxuICB7IGZpbGVOYW1lOiAnLnJlbGVhc2VyYy55bWwnLCBqc29uUGFyc2VhYmxlOiBmYWxzZSB9LFxuICB7IGZpbGVOYW1lOiAnLnJlbGVhc2VyYy5qcycsIGpzb25QYXJzZWFibGU6IGZhbHNlIH0sXG4gIHsgZmlsZU5hbWU6ICdyZWxlYXNlLmNvbmZpZy5qcycsIGpzb25QYXJzZWFibGU6IGZhbHNlIH0sXG5dO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UGFja2FnZUNvbmZpZyhcbiAgZGlyUGF0aDogc3RyaW5nLFxuICBvcHRpb25zPzogeyBpc1Jvb3Q/OiBib29sZWFuIH1cbik6IFByb21pc2U8UGFja2FnZUNvbmZpZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICB0cnkge1xuICAgIGNvbnN0IGRvZXNDb250YWluUGFja2FnZUpzb24gPSBmcy5leGlzdHNTeW5jKHBhY2thZ2VKc29uUGF0aCk7XG4gICAgbGV0IGRlcGVuZGVuY2llczogUGFja2FnZUpzb25bJ2RlcGVuZGVuY2llcyddID0ge307XG4gICAgbGV0IGRldkRlcGVuZGVuY2llczogUGFja2FnZUpzb25bJ2RldkRlcGVuZGVuY2llcyddID0ge307XG4gICAgbGV0IHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiA9IHt9O1xuICAgIGxldCBlc21QYWNrYWdlID0gZmFsc2U7XG4gICAgaWYgKGRvZXNDb250YWluUGFja2FnZUpzb24pIHtcbiAgICAgIGNvbnN0IHBhY2thZ2VKc29uVGV4dCA9IGZzLnJlYWRGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgsICd1dGY4Jyk7XG4gICAgICBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UocGFja2FnZUpzb25UZXh0KSBhcyBQYWNrYWdlSnNvbjtcbiAgICAgIGRlcGVuZGVuY2llcyA9IHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICAgIGRldkRlcGVuZGVuY2llcyA9IHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICAgIGVzbVBhY2thZ2UgPSBwYWNrYWdlSnNvbi50eXBlID09PSAnbW9kdWxlJztcbiAgICB9XG5cbiAgICBsZXQgcmVsZWFzZUJyYW5jaGVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCByZWxlYXNlUGx1Z2luczogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgcmVsZWFzZVBsdWdpbnNBcmVFeHBsaWNpdCA9IGZhbHNlO1xuICAgIGxldCByZWxlYXNlTnBtUGx1Z2luUHVibGlzaGVzUm9vdCA9IGZhbHNlO1xuICAgIC8vIFRoZSBGSVJTVCBleGlzdGluZyBzZWFyY2ggcGxhY2Ugd2lucyAoY29zbWljb25maWcgc2hvcnQtY2lyY3VpdHMpLCBzbyBhIEpTL1lBTUwvVFMgY29uZmlnXG4gICAgLy8gb3IgYW4gYGV4dGVuZHNgIHByZXNldCBtYWtlcyB0aGUgZWZmZWN0aXZlIHBsdWdpbiBsaXN0IHN0YXRpY2FsbHkgdW5pbnNwZWN0YWJsZSAobWlycm9yc1xuICAgIC8vIHJlYWRFeHBsaWNpdFNlbWFudGljUmVsZWFzZVBsdWdpbnMgaW4gd2IncyByZWxlYXNlLnRzKS4gVHJlYXRpbmcgaXQgYXMgdW5rbm93biBrZWVwc1xuICAgIC8vIGByZWxlYXNlLm5wbWAgY29uc2VydmF0aXZlbHkgdHJ1ZSwgc28gYXBwbHlQYWNrYWdlSnNvbkNvbnZlbnRpb25zIG5ldmVyIGZvcmNlc1xuICAgIC8vIGBwcml2YXRlOiB0cnVlYCBvbiBhIG1vbm9yZXBvIHRoYXQgYWN0dWFsbHkgcHVibGlzaGVzIHRvIG5wbS5cbiAgICBsZXQgcmVsZWFzZVBsdWdpbnNBcmVVbmtub3duID0gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgIHR5cGUgUmVsZWFzZUNvbmZpZyA9XG4gICAgICAgIHwge1xuICAgICAgICAgICAgYnJhbmNoZXM/OiB1bmtub3duO1xuICAgICAgICAgICAgcGx1Z2lucz86IChzdHJpbmcgfCBbc3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPl0pW107XG4gICAgICAgICAgICBleHRlbmRzPzogdW5rbm93bjtcbiAgICAgICAgICB9XG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgLy8gY29zbWljb25maWcgc2VhcmNoZXMgcGFja2FnZS5qc29uJ3MgYHJlbGVhc2VgIGtleSBCRUZPUkUgYW55IHJjL2NvbmZpZyBmaWxlXG4gICAgICAvLyAoc2VtYW50aWMtcmVsZWFzZSAyNSBkZWxlZ2F0ZXMgdG8gY29zbWljb25maWcgOSdzIGRlZmF1bHQgc2VhcmNoUGxhY2VzKS5cbiAgICAgIGxldCByZWxlYXNlQ29uZmlnID0gKHBhY2thZ2VKc29uIGFzIHsgcmVsZWFzZT86IFJlbGVhc2VDb25maWcgfSkucmVsZWFzZTtcbiAgICAgIGlmIChyZWxlYXNlQ29uZmlnID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZm9yIChjb25zdCB7IGZpbGVOYW1lLCBqc29uUGFyc2VhYmxlIH0gb2Ygc2VtYW50aWNSZWxlYXNlQ29uZmlnU2VhcmNoUGxhY2VzKSB7XG4gICAgICAgICAgY29uc3QgcmVsZWFzZXJjUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCBmaWxlTmFtZSk7XG4gICAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHJlbGVhc2VyY1BhdGgpKSBjb250aW51ZTtcbiAgICAgICAgICBpZiAoIWpzb25QYXJzZWFibGUpIHtcbiAgICAgICAgICAgIHJlbGVhc2VQbHVnaW5zQXJlVW5rbm93biA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gYC5yZWxlYXNlcmNgIGFuZCBgLmNvbmZpZy9yZWxlYXNlcmNgIG1heSBhbHNvIGhvbGQgWUFNTDsgYSBKU09OLnBhcnNlIGZhaWx1cmUgbGFuZHNcbiAgICAgICAgICAvLyBpbiB0aGUgY2F0Y2ggYmVsb3cgYW5kIG1hcmtzIHRoZSBwbHVnaW4gbGlzdCB1bmtub3duIGluc3RlYWQgb2Ygc2lsZW50bHkgcmVwb3J0aW5nXG4gICAgICAgICAgLy8gXCJubyBwbHVnaW5zXCIuXG4gICAgICAgICAgcmVsZWFzZUNvbmZpZyA9IEpTT04ucGFyc2UoYXdhaXQgZnNwLnJlYWRGaWxlKHJlbGVhc2VyY1BhdGgsICd1dGY4JykpIGFzIFJlbGVhc2VDb25maWc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIHNlbWFudGljLXJlbGVhc2UgYWNjZXB0cyBhIHNjYWxhciBicmFuY2ggb3IgYnJhbmNoIG9iamVjdHMgKHsgbmFtZSwgcHJlcmVsZWFzZSwgLi4uIH0pO1xuICAgICAgLy8gbm9ybWFsaXplIHRvIHBsYWluIGJyYW5jaCBuYW1lcyBmb3IgY29uc3VtZXJzIHN1Y2ggYXMgdGhlIHdvcmtmbG93IGdlbmVyYXRvci5cbiAgICAgIGNvbnN0IHJhd0JyYW5jaGVzID0gcmVsZWFzZUNvbmZpZz8uYnJhbmNoZXM7XG4gICAgICByZWxlYXNlQnJhbmNoZXMgPSAoQXJyYXkuaXNBcnJheShyYXdCcmFuY2hlcykgPyByYXdCcmFuY2hlcyA6IHJhd0JyYW5jaGVzID09PSB1bmRlZmluZWQgPyBbXSA6IFtyYXdCcmFuY2hlc10pXG4gICAgICAgIC5tYXAoKGJyYW5jaDogdW5rbm93bikgPT5cbiAgICAgICAgICB0eXBlb2YgYnJhbmNoID09PSAnc3RyaW5nJyA/IGJyYW5jaCA6IChicmFuY2ggYXMgeyBuYW1lPzogdW5rbm93biB9IHwgdW5kZWZpbmVkKT8ubmFtZVxuICAgICAgICApXG4gICAgICAgIC5maWx0ZXIoKGJyYW5jaE5hbWUpOiBicmFuY2hOYW1lIGlzIHN0cmluZyA9PiB0eXBlb2YgYnJhbmNoTmFtZSA9PT0gJ3N0cmluZycpO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVsZWFzZUNvbmZpZz8ucGx1Z2lucykpIHtcbiAgICAgICAgcmVsZWFzZVBsdWdpbnNBcmVFeHBsaWNpdCA9IHRydWU7XG4gICAgICAgIGZvciAoY29uc3QgcGx1Z2luRW50cnkgb2YgcmVsZWFzZUNvbmZpZy5wbHVnaW5zKSB7XG4gICAgICAgICAgY29uc3QgW3BsdWdpbk5hbWUsIHBsdWdpbk9wdGlvbnNdID0gQXJyYXkuaXNBcnJheShwbHVnaW5FbnRyeSkgPyBwbHVnaW5FbnRyeSA6IFtwbHVnaW5FbnRyeSwgdW5kZWZpbmVkXTtcbiAgICAgICAgICBpZiAodHlwZW9mIHBsdWdpbk5hbWUgIT09ICdzdHJpbmcnKSBjb250aW51ZTtcbiAgICAgICAgICByZWxlYXNlUGx1Z2lucy5wdXNoKHBsdWdpbk5hbWUpO1xuICAgICAgICAgIGlmIChwbHVnaW5OYW1lICE9PSAnQHNlbWFudGljLXJlbGVhc2UvbnBtJykgY29udGludWU7XG4gICAgICAgICAgLy8gV2l0aCBwa2dSb290IHRoZSBwbHVnaW4gcHVibGlzaGVzIGFub3RoZXIgbWFuaWZlc3QgKGl0IHJlc29sdmVzIHBrZ1Jvb3QgYWdhaW5zdCB0aGVcbiAgICAgICAgICAvLyByZXBvIHJvb3QsIHNvIGAuYCBhbmQgYC4vYCBib3RoIG1lYW4gdGhlIHJvb3QgaXRzZWxmKSwgYW5kIG5wbVB1Ymxpc2g6IGZhbHNlXG4gICAgICAgICAgLy8gZGlzYWJsZXMgcHVibGlzaGluZyBlbnRpcmVseTsgb25seSB0aGUgcmVtYWluaW5nIHNoYXBlIHByb3ZlcyB0aGUgUk9PVCBpcyBwdWJsaXNoZWQuXG4gICAgICAgICAgY29uc3QgcGtnUm9vdCA9IHBsdWdpbk9wdGlvbnM/LnBrZ1Jvb3Q7XG4gICAgICAgICAgY29uc3QgcHVibGlzaGVzUm9vdCA9XG4gICAgICAgICAgICBwbHVnaW5PcHRpb25zPy5ucG1QdWJsaXNoICE9PSBmYWxzZSAmJlxuICAgICAgICAgICAgKHBrZ1Jvb3QgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgICAodHlwZW9mIHBrZ1Jvb3QgPT09ICdzdHJpbmcnICYmIHBhdGgucmVzb2x2ZShkaXJQYXRoLCBwa2dSb290KSA9PT0gcGF0aC5yZXNvbHZlKGRpclBhdGgpKSk7XG4gICAgICAgICAgcmVsZWFzZU5wbVBsdWdpblB1Ymxpc2hlc1Jvb3QgfHw9IHB1Ymxpc2hlc1Jvb3Q7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAocmVsZWFzZUNvbmZpZyAmJiByZWxlYXNlQ29uZmlnLmV4dGVuZHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZWxlYXNlUGx1Z2luc0FyZVVua25vd24gPSB0cnVlO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgcmVsZWFzZVBsdWdpbnNBcmVVbmtub3duID0gdHJ1ZTtcbiAgICB9XG4gICAgLy8gV2l0aG91dCBhbiBleHBsaWNpdCBwbHVnaW4gbGlzdCwgc2VtYW50aWMtcmVsZWFzZSdzIGRlZmF1bHQgbGlzdCBhcHBsaWVzLCB3aGljaCBpbmNsdWRlc1xuICAgIC8vIEBzZW1hbnRpYy1yZWxlYXNlL25wbSBhbmQgQHNlbWFudGljLXJlbGVhc2UvZ2l0aHViIChtaXJyb3JzIHJlbGVhc2VQdWJsaXNoZXNUb05wbSBpbiB3YidzXG4gICAgLy8gcmVsZWFzZS50cykuXG4gICAgY29uc3QgdXNlc1NlbWFudGljUmVsZWFzZSA9ICEhKFxuICAgICAgZGV2RGVwZW5kZW5jaWVzWydzZW1hbnRpYy1yZWxlYXNlJ10gfHxcbiAgICAgIHJlbGVhc2VCcmFuY2hlcy5sZW5ndGggPiAwIHx8XG4gICAgICByZWxlYXNlUGx1Z2lucy5sZW5ndGggPiAwIHx8XG4gICAgICByZWxlYXNlUGx1Z2luc0FyZVVua25vd25cbiAgICApO1xuXG4gICAgLy8gVGhlIGNhbGxlciBtYXkgY2xhc3NpZnkgZXhwbGljaXRseSAoaW5kZXgudHMgcGFzc2VzIGZhbHNlIGZvciBldmVyeSBkaXNjb3ZlcmVkIHdvcmtzcGFjZSxcbiAgICAvLyBpbmNsdWRpbmcgbm9uLXBhY2thZ2VzLyogbGF5b3V0cyBzdWNoIGFzIGFwcHMvKik7IHRoZSBoZXVyaXN0aWMgY2xhc3NpZmllcyB0aGUgQ0xJIGVudHJ5XG4gICAgLy8gcGF0aCBpdHNlbGYsIHNvIGB3YmZ5IDxyZXBvPi9wYWNrYWdlcy88YXBwPmAgYW5kIGB3YmZ5IDxyZXBvPi9hcHBzLzxhcHA+YCBrZWVwIHRoZWlyIGNoaWxkXG4gICAgLy8gY2xhc3NpZmljYXRpb24uXG4gICAgY29uc3QgaXNSb290ID0gb3B0aW9ucz8uaXNSb290ID8/ICFpc1dvcmtzcGFjZU9mRW5jbG9zaW5nUm9vdChkaXJQYXRoKTtcblxuICAgIGxldCByZXBvSW5mbzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgLy8gRmV0Y2ggdmlzaWJpbGl0eSBmb3IgdGhlIENMSSBlbnRyeSBldmVuIHdoZW4gaXQgaXMgYSB3b3Jrc3BhY2UgY2hpbGQgKGB3YmZ5XG4gICAgLy8gPHJlcG8+L3BhY2thZ2VzLzxhcHA+YCk6IGdlbmVyYXRvcnMgcmVhZCBpc1B1YmxpY1JlcG8gZnJvbSB0aGVpciByb290Q29uZmlnIHBhcmFtZXRlcixcbiAgICAvLyB3aGljaCBJUyB0aGUgY2hpbGQgY29uZmlnIGluIHRoYXQgaW52b2NhdGlvbiwgc28gYSBzdHViIGBmYWxzZWAgdGhlcmUgd291bGQgZHJvcCB0aGVcbiAgICAvLyBwdWJsaWMtcmVwbyBwdWJsaXNoQ29uZmlnIGhhbmRsaW5nLiBEaXNjb3ZlcmVkIGNoaWxkcmVuIChvcHRpb25zLmlzUm9vdCA9PT0gZmFsc2UpIHN0aWxsXG4gICAgLy8gc2tpcCB0aGUgZmV0Y2gg4oCUIHRoZXkgaW5oZXJpdCB0aGUgZW5jbG9zaW5nIHJvb3QncyB2aXNpYmlsaXR5IHZpYSByb290Q29uZmlnIGluc3RlYWQuXG4gICAgaWYgKG9wdGlvbnM/LmlzUm9vdCAhPT0gZmFsc2UpIHtcbiAgICAgIHJlcG9JbmZvID0gYXdhaXQgZmV0Y2hSZXBvSW5mbyhkaXJQYXRoLCBwYWNrYWdlSnNvbik7XG4gICAgfVxuXG4gICAgbGV0IGRvY2tlcmZpbGUgPSAnJztcbiAgICB0cnkge1xuICAgICAgZG9ja2VyZmlsZSA9IGF3YWl0IGZzcC5yZWFkRmlsZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ0RvY2tlcmZpbGUnKSwgJ3V0ZjgnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICBjb25zdCB3YmZ5SnNvblBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3diZnkuanNvbicpO1xuICAgIGxldCB3YmZ5SnNvbjogV2JmeUpzb24gfCB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHdiZnlKc29uVGV4dCA9IGF3YWl0IGZzcC5yZWFkRmlsZSh3YmZ5SnNvblBhdGgsICd1dGY4Jyk7XG4gICAgICB3YmZ5SnNvbiA9IHdiZnlKc29uU2NoZW1hLnBhcnNlKEpTT04ucGFyc2Uod2JmeUpzb25UZXh0KSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgY29uc3QgcmVwb0Z1bGxOYW1lID0gdHlwZW9mIHJlcG9JbmZvPy5mdWxsX25hbWUgPT09ICdzdHJpbmcnID8gcmVwb0luZm8uZnVsbF9uYW1lIDogdW5kZWZpbmVkO1xuICAgIGxldCByZXBvQXV0aG9yOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHJlcG9OYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHJlcG9GdWxsTmFtZSkge1xuICAgICAgY29uc3QgcmVwb1BhcnRzID0gcmVwb0Z1bGxOYW1lLnNwbGl0KCcvJyk7XG4gICAgICBpZiAocmVwb1BhcnRzLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgIHJlcG9BdXRob3IgPSByZXBvUGFydHNbMF07XG4gICAgICAgIHJlcG9OYW1lID0gcmVwb1BhcnRzWzFdO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBPbmx5IHRoZSByb290IGZldGNoZXMgcmVwbyBpbmZvLCBhbmQgdGhhdCBmZXRjaCBuZWVkcyBuZXR3b3JrIGFuZCBhIHRva2VuLCBzbyBpZGVudGl0eS1kZXJpdmVkXG4gICAgLy8gZmxhZ3MgYmVsb3cgd291bGQgb3RoZXJ3aXNlIGJlIGZhbHNlIGZvciBldmVyeSB3b3Jrc3BhY2UgcGFja2FnZSBhbmQgZm9yIGV2ZXJ5IG9mZmxpbmUgb3JcbiAgICAvLyByYXRlLWxpbWl0ZWQgcnVuLiBUaGUgZ2l0IHJlbW90ZSBhbnN3ZXJzIHRoZSBzYW1lIHF1ZXN0aW9uIGxvY2FsbHksIGZvciBldmVyeSBwYWNrYWdlLlxuICAgIGlmICghcmVwb0F1dGhvciB8fCAhcmVwb05hbWUpIHtcbiAgICAgIFtyZXBvQXV0aG9yLCByZXBvTmFtZV0gPSBhd2FpdCByZXNvbHZlTG9jYWxSZXBvSWRlbnRpdHkoZGlyUGF0aCwgcGFja2FnZUpzb24pO1xuICAgIH1cbiAgICAvLyBCdWlsdCBmcm9tIHRoZSBSRVNPTFZFRCBpZGVudGl0eSBzbyB3b3Jrc3BhY2UgcGFja2FnZXMgYW5kIG9mZmxpbmUgcnVucyBhbHNvIGdldCBpdDsgY29uc3VtZXJzIGRlcml2ZVxuICAgIC8vIHRoZSBvd25lciBmcm9tIHRoaXMgZmllbGQgKGUuZy4gdG8gc2V0IGBhdXRob3JgKS5cbiAgICBjb25zdCByZXBvc2l0b3J5ID0gcmVwb0F1dGhvciAmJiByZXBvTmFtZSA/IGBnaXRodWI6JHtyZXBvQXV0aG9yfS8ke3JlcG9OYW1lfWAgOiB1bmRlZmluZWQ7XG4gICAgLy8gVGF1cmkgb2ZmaWNpYWxseSBzdXBwb3J0cyBKU09OLCBKU09ONSwgYW5kIFRPTUwgY29uZmlndXJhdGlvbiBmb3JtYXRzLlxuICAgIGNvbnN0IGRvZXNDb250YWluVGF1cmlDb25maWcgPSBbJ3RhdXJpLmNvbmYuanNvbicsICd0YXVyaS5jb25mLmpzb241JywgJ1RhdXJpLnRvbWwnXS5zb21lKChmaWxlTmFtZSkgPT5cbiAgICAgIGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdzcmMtdGF1cmknLCBmaWxlTmFtZSkpXG4gICAgKTtcbiAgICAvLyBSb290LWxldmVsIFwiSW5QYWNrYWdlc1wiIHNpZ25hbHMgbXVzdCBzZWUgZXZlcnkgZGVjbGFyZWQgd29ya3NwYWNlIGxheW91dCAoZS5nLiBhcHBzLyopLCBub3RcbiAgICAvLyBqdXN0IHRoZSBjb252ZW50aW9uYWwgcGFja2FnZXMvKiBkaXJlY3RvcnksIHNvIHNjYW4gZWFjaCBkaXNjb3ZlcmVkIHdvcmtzcGFjZSBkaXJlY3RvcnkuXG4gICAgY29uc3Qgd29ya3NwYWNlU3ViRGlyUGF0aHMgPSBnZXRXb3Jrc3BhY2VTdWJEaXJQYXRocyh7XG4gICAgICBkaXJQYXRoLFxuICAgICAgcGFja2FnZUpzb24sXG4gICAgICBkb2VzQ29udGFpblN1YlBhY2thZ2VKc29uczogY29udGFpbnNBbnkoJ3BhY2thZ2VzLyovcGFja2FnZS5qc29uJywgZGlyUGF0aCksXG4gICAgfSk7XG4gICAgY29uc3QgY29udGFpbnNBbnlJbldvcmtzcGFjZXMgPSAocGF0dGVybjogc3RyaW5nKTogYm9vbGVhbiA9PlxuICAgICAgd29ya3NwYWNlU3ViRGlyUGF0aHMuc29tZSgod29ya3NwYWNlU3ViRGlyUGF0aCkgPT4gY29udGFpbnNBbnkocGF0dGVybiwgd29ya3NwYWNlU3ViRGlyUGF0aCkpO1xuICAgIGNvbnN0IGRvZXNDb250YWluV3JhbmdsZXJDb25maWcgPSBkZXRlY3RXcmFuZ2xlckNvbmZpZyhkaXJQYXRoKTtcbiAgICBjb25zdCB3b3JrZmxvd0NvbnRlbnRzID0gcmVhZFdvcmtmbG93RmlsZUNvbnRlbnRzKGRpclBhdGgpO1xuICAgIGNvbnN0IGltcG9ydHNQbGF5d3JpZ2h0QXRSdW50aW1lID0gZGV0ZWN0UGxheXdyaWdodFJ1bnRpbWVJbXBvcnQoZGlyUGF0aCk7XG4gICAgY29uc3QgY29uZmlnOiBQYWNrYWdlQ29uZmlnID0ge1xuICAgICAgZGlyUGF0aCxcbiAgICAgIGRvY2tlcmZpbGUsXG4gICAgICBpc1Jvb3QsXG4gICAgICBpc1B1YmxpY1JlcG86IHJlcG9JbmZvPy5wcml2YXRlID09PSBmYWxzZSxcbiAgICAgIGlzUmVwb1Zpc2liaWxpdHlLbm93bjogdHlwZW9mIHJlcG9JbmZvPy5wcml2YXRlID09PSAnYm9vbGVhbicsXG4gICAgICBpc1JlZmVycmVkQnlPdGhlclJlcG86ICEhcGFja2FnZUpzb24uZmlsZXMsXG4gICAgICByZXBvc2l0b3J5LFxuICAgICAgcmVwb0F1dGhvcixcbiAgICAgIHJlcG9OYW1lLFxuICAgICAgaXNXaWxsQm9vc3RlclJlcG86IEJvb2xlYW4oXG4gICAgICAgIHJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3Rlci8nKSB8fCByZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJylcbiAgICAgICksXG4gICAgICBpc0Nsb3VkZmxhcmU6IGRldGVjdENsb3VkZmxhcmUocGFja2FnZUpzb24sIGRvZXNDb250YWluV3JhbmdsZXJDb25maWcsIHdvcmtmbG93Q29udGVudHMpLFxuICAgICAgZG9lc0NvbnRhaW5XcmFuZ2xlckNvbmZpZyxcbiAgICAgIGlzUmFpbHdheTogZGV0ZWN0UmFpbHdheShkaXJQYXRoLCBwYWNrYWdlSnNvbiwgd29ya2Zsb3dDb250ZW50cyksXG4gICAgICBpc0VzbVBhY2thZ2U6IGVzbVBhY2thZ2UsXG4gICAgICBpc1dpbGxCb29zdGVyQ29uZmlnczogZGV0ZWN0SXNXaWxsQm9vc3RlckNvbmZpZ3MoZGlyUGF0aCwgcGFja2FnZUpzb25QYXRoLCByZXBvTmFtZSksXG4gICAgICBjYXJnb1RvbWxEaXJQYXRoczogZmluZENhcmdvVG9tbERpclBhdGhzKGRpclBhdGgpLFxuICAgICAgLy8gQWxzbyBob25vciBkZWNsYXJlZCB3b3Jrc3BhY2UgcGF0dGVybnMgYmV5b25kIHBhY2thZ2VzLyogKGUuZy4gYXBwcy8qKTogdHJlYXRpbmcgYW5cbiAgICAgIC8vIGFwcHMvKi1vbmx5IG1vbm9yZXBvIGFzIGEgcGxhaW4gcGFja2FnZSB3b3VsZCBkZWxldGUgaXRzIGB3b3Jrc3BhY2VzYCBkZWNsYXJhdGlvbiBpblxuICAgICAgLy8gZ2VuZXJhdGVQYWNrYWdlSnNvbiBhbmQgc2tpcCBtb25vcmVwby1vbmx5IGNvbnZlbnRpb25zIHN1Y2ggYXMgcm9vdCBgcHJpdmF0ZTogdHJ1ZWAuXG4gICAgICBkb2VzQ29udGFpblN1YlBhY2thZ2VKc29uczogY29udGFpbnNBbnkoJ3BhY2thZ2VzLyoqL3BhY2thZ2UuanNvbicsIGRpclBhdGgpIHx8IHdvcmtzcGFjZVN1YkRpclBhdGhzLmxlbmd0aCA+IDAsXG4gICAgICBkb2VzQ29udGFpbkRvY2tlcmZpbGU6ICEhZG9ja2VyZmlsZSB8fCBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnZG9ja2VyLWNvbXBvc2UueW1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5HZW1maWxlOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnR2VtZmlsZScpKSxcbiAgICAgIGRvZXNDb250YWluR29Nb2Q6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdnby5tb2QnKSksXG4gICAgICBkb2VzQ29udGFpblBhY2thZ2VKc29uLFxuICAgICAgZG9lc0NvbnRhaW5Qb2V0cnlMb2NrOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncG9ldHJ5LmxvY2snKSksXG4gICAgICBkb2VzQ29udGFpblV2TG9jazogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3V2LmxvY2snKSksXG4gICAgICAvLyBSZWN1cnNpdmUgbGlrZSBkb2VzQ29udGFpbkphdmE6IG11bHRpLWxhbmd1YWdlIHJlcG9zaXRvcmllcyBrZWVwIGxhbmd1YWdlIGRpcmVjdG9yaWVzXG4gICAgICAvLyAoZS5nLiBQeXRob24gdG9vbGluZyBvciBNYXZlbiBtb2R1bGVzKSBvdXRzaWRlIHRoZSByb290IGFuZCBvdXRzaWRlIGRlY2xhcmVkIHdvcmtzcGFjZXMuXG4gICAgICBkb2VzQ29udGFpblB5dGhvbkxvY2tBbnl3aGVyZTogY29udGFpbnNBbnkoJyoqL3twb2V0cnkubG9jayx1di5sb2NrfScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5Qb21YbWw6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwb20ueG1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5Qb21YbWxBbnl3aGVyZTogY29udGFpbnNBbnkoJyoqL3BvbS54bWwnLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluUHVic3BlY1lhbWw6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwdWJzcGVjLnlhbWwnKSksXG4gICAgICBkb2VzQ29udGFpblNsaWRldk1kOiBjb250YWluc0FueSgnKiovKi5zbGlkZXYubWQnLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluVGF1cmlDb25maWcsXG4gICAgICBkb2VzQ29udGFpblRhdXJpQ29uZmlnSW5QYWNrYWdlczogY29udGFpbnNBbnlJbldvcmtzcGFjZXMoXG4gICAgICAgICdzcmMtdGF1cmkve3RhdXJpLmNvbmYuanNvbix0YXVyaS5jb25mLmpzb241LFRhdXJpLnRvbWx9J1xuICAgICAgKSxcbiAgICAgIGRvZXNDb250YWluVGVtcGxhdGVZYW1sOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAndGVtcGxhdGUueWFtbCcpKSxcbiAgICAgIGRvZXNDb250YWluVnNjb2RlU2V0dGluZ3NKc29uOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLnZzY29kZScsICdzZXR0aW5ncy5qc29uJykpLFxuICAgICAgZG9lc0NvbnRhaW5KYXZhU2NyaXB0OiBjb250YWluc0FueSgne2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjanMsbWpzLGpzLGpzeH0nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluVHlwZVNjcmlwdDogY29udGFpbnNBbnkoJ3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y3RzLG10cyx0cyx0c3h9JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbkpzeE9yVHN4OiBjb250YWluc0FueSgne2FwcCxzcmMsdGVzdH0vKiovKi57dCxqfXN4JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbkphdmE6IGNvbnRhaW5zQW55KCcqKi8qLmphdmEnLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluSmF2YVNjcmlwdEluUGFja2FnZXM6IGNvbnRhaW5zQW55SW5Xb3Jrc3BhY2VzKCd7YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4fScpLFxuICAgICAgZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlczogY29udGFpbnNBbnlJbldvcmtzcGFjZXMoJ3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y3RzLG10cyx0cyx0c3h9JyksXG4gICAgICBkb2VzQ29udGFpbkpzeE9yVHN4SW5QYWNrYWdlczogY29udGFpbnNBbnlJbldvcmtzcGFjZXMoJ3thcHAsc3JjLHRlc3R9LyoqLyoue3Qsan1zeCcpLFxuICAgICAgZG9lc0NvbnRhaW5KYXZhSW5QYWNrYWdlczogY29udGFpbnNBbnlJbldvcmtzcGFjZXMoJyoqLyouamF2YScpLFxuICAgICAgZGVwZW5kaW5nOiB7XG4gICAgICAgIGJsaXR6OiAhIWRlcGVuZGVuY2llcy5ibGl0eixcbiAgICAgICAgY2hha3JhOiAhIWRldkRlcGVuZGVuY2llc1snQGNoYWtyYS11aS9jbGknXSxcbiAgICAgICAgZHJpenpsZTogISFkZXBlbmRlbmNpZXNbJ2RyaXp6bGUtb3JtJ10gfHwgISFkZXZEZXBlbmRlbmNpZXNbJ2RyaXp6bGUta2l0J10sXG4gICAgICAgIGZpcmViYXNlOiAhIWRldkRlcGVuZGVuY2llc1snZmlyZWJhc2UtdG9vbHMnXSxcbiAgICAgICAgZ2VuSTE4blRzOiAhIWRlcGVuZGVuY2llc1snZ2VuLWkxOG4tdHMnXSB8fCAhIWRldkRlcGVuZGVuY2llc1snZ2VuLWkxOG4tdHMnXSxcbiAgICAgICAgbGl0ZXN0cmVhbTogZG9ja2VyZmlsZS5pbmNsdWRlcygnaW5zdGFsbC1saXRlc3RyZWFtLnNoJyksXG4gICAgICAgIHJlYWN0OiAhIWRlcGVuZGVuY2llcy5yZWFjdCxcbiAgICAgICAgbmV4dDogISFkZXBlbmRlbmNpZXMubmV4dCxcbiAgICAgICAgcGxheXdyaWdodFRlc3Q6XG4gICAgICAgICAgISFkZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXSB8fCAhIWRldkRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddIHx8ICEhZGV2RGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQsXG4gICAgICAgIHBsYXl3cmlnaHRSdW50aW1lOiBpbXBvcnRzUGxheXdyaWdodEF0UnVudGltZSxcbiAgICAgICAgcHJpc21hOiAhIWRlcGVuZGVuY2llc1snQHByaXNtYS9jbGllbnQnXSB8fCAhIWRldkRlcGVuZGVuY2llcy5wcmlzbWEsXG4gICAgICAgIHB5cmlnaHQ6ICEhZGV2RGVwZW5kZW5jaWVzLnB5cmlnaHQsXG4gICAgICAgIHJlYWN0TmF0aXZlOiAhIWRlcGVuZGVuY2llc1sncmVhY3QtbmF0aXZlJ10sXG4gICAgICAgIHNlbWFudGljUmVsZWFzZTogdXNlc1NlbWFudGljUmVsZWFzZSxcbiAgICAgICAgc2xpZGV2OiAhIWRlcGVuZGVuY2llc1snQHNsaWRldi9jbGknXSB8fCAhIWRldkRlcGVuZGVuY2llc1snQHNsaWRldi9jbGknXSxcbiAgICAgICAgc3Rvcnlib29rOiAhIWRldkRlcGVuZGVuY2llc1snQHN0b3J5Ym9vay9yZWFjdCddLFxuICAgICAgICB0YXVyaTpcbiAgICAgICAgICAhIWRlcGVuZGVuY2llc1snQHRhdXJpLWFwcHMvYXBpJ10gfHxcbiAgICAgICAgICAhIWRldkRlcGVuZGVuY2llc1snQHRhdXJpLWFwcHMvYXBpJ10gfHxcbiAgICAgICAgICAhIWRlcGVuZGVuY2llc1snQHRhdXJpLWFwcHMvY2xpJ10gfHxcbiAgICAgICAgICAhIWRldkRlcGVuZGVuY2llc1snQHRhdXJpLWFwcHMvY2xpJ10gfHxcbiAgICAgICAgICBkb2VzQ29udGFpblRhdXJpQ29uZmlnLFxuICAgICAgICB2aW5leHQ6ICEhZGVwZW5kZW5jaWVzLnZpbmV4dCB8fCAhIWRldkRlcGVuZGVuY2llcy52aW5leHQsXG4gICAgICAgIHZpdGU6ICEhZGVwZW5kZW5jaWVzLnZpdGUgfHwgISFkZXZEZXBlbmRlbmNpZXMudml0ZSxcbiAgICAgICAgd2I6ICEhZGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvd2InXSB8fCAhIWRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3diJ10sXG4gICAgICB9LFxuICAgICAgcmVsZWFzZToge1xuICAgICAgICBicmFuY2hlczogcmVsZWFzZUJyYW5jaGVzLFxuICAgICAgICBnaXRodWI6IHJlbGVhc2VQbHVnaW5zQXJlRXhwbGljaXRcbiAgICAgICAgICA/IHJlbGVhc2VQbHVnaW5zLmluY2x1ZGVzKCdAc2VtYW50aWMtcmVsZWFzZS9naXRodWInKSB8fCByZWxlYXNlUGx1Z2luc0FyZVVua25vd25cbiAgICAgICAgICA6IHVzZXNTZW1hbnRpY1JlbGVhc2UsXG4gICAgICAgIG5wbTogcmVsZWFzZVBsdWdpbnNBcmVFeHBsaWNpdFxuICAgICAgICAgID8gcmVsZWFzZVBsdWdpbnMuaW5jbHVkZXMoJ0BzZW1hbnRpYy1yZWxlYXNlL25wbScpIHx8IHJlbGVhc2VQbHVnaW5zQXJlVW5rbm93blxuICAgICAgICAgIDogdXNlc1NlbWFudGljUmVsZWFzZSxcbiAgICAgICAgbnBtUHVibGlzaGVzUm9vdDogcmVsZWFzZU5wbVBsdWdpblB1Ymxpc2hlc1Jvb3QsXG4gICAgICB9LFxuICAgICAgbWlzZVRhc2tzOiBhd2FpdCByZWFkTWlzZVRhc2tzKGRpclBhdGgpLFxuICAgICAgcGFja2FnZUpzb24sXG4gICAgICB3YmZ5SnNvbixcbiAgICB9O1xuICAgIGlmIChcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbkdlbWZpbGUgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbkdvTW9kIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbiB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jayB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluVXZMb2NrIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5Qb21YbWwgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5UYXVyaUNvbmZpZyB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluVGVtcGxhdGVZYW1sIHx8XG4gICAgICAvLyBBIHJlcG9zaXRvcnkgY2FuIGxlZ2l0aW1hdGVseSBjb250YWluIG9ubHkgZG9jdW1lbnRhdGlvbi4gSXRzIEdpdCBtZXRhZGF0YSBpcyBlbm91Z2ggdG9cbiAgICAgIC8vIGVzdGFibGlzaCB0aGF0IHRoZSBDTEkgdGFyZ2V0IGlzIGEgcHJvamVjdCByb290OyByZXF1aXJpbmcgYSBsYW5ndWFnZSBtYW5pZmVzdCBoZXJlIHdvdWxkXG4gICAgICAvLyBtYWtlIHdiZnkgdW5hYmxlIHRvIGNyZWF0ZSB0aGUgcGFja2FnZS5qc29uIHRoYXQgaXQgbWFuYWdlcyBmb3Igc3VjaCByZXBvc2l0b3JpZXMuIEJvdGhcbiAgICAgIC8vIG9yZGluYXJ5IGNoZWNrb3V0cyAoYC5naXRgIGRpcmVjdG9yeSkgYW5kIHdvcmt0cmVlcyAoYC5naXRgIGZpbGUpIHNhdGlzZnkgdGhpcyBjaGVjay5cbiAgICAgIChjb25maWcuaXNSb290ICYmIGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICcuZ2l0JykpKVxuICAgICkge1xuICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG4vKipcbiAqIFRlbGxzIHdoZXRoZXIgd2JmeSBtYW5hZ2VzIHdvcmtlci1jb25maWd1cmF0aW9uLmQudHMgZm9yIHRoZSBwYWNrYWdlLiBUaGUgZmlsZSBpcyBnaXRpZ25vcmVkIGFuZCB1bnRyYWNrZWRcbiAqIGJlY2F1c2UgdGhlIGB3YiBnZW4tY29kZWAgcG9zdGluc3RhbGwgcmVnZW5lcmF0ZXMgaXQgb24gZXZlcnkgaW5zdGFsbCwgc28gdGhlIHBhY2thZ2UgaGFzIHRvIG93biBhIHdyYW5nbGVyXG4gKiBjb25maWcgKGB3cmFuZ2xlciB0eXBlc2AgZXhpdHMgbm9uLXplcm8gd2l0aG91dCBvbmUpLCB0byBkZXBlbmQgb24gd3JhbmdsZXIgKGEgcGFja2FnZSBkZXBsb3lpbmcgdmlhIGFcbiAqIENJIGFjdGlvbiBjYW5ub3QgcmVzb2x2ZSB0aGUgY29tbWFuZCksIGFuZCB0byBjb25zdW1lIHRoZSBnZW5lcmF0ZWQgZmlsZS5cbiAqXG4gKiBJTlZBUklBTlQg4oCUIHRoaXMgZGVjaXNpb24gbXVzdCBjb252ZXJnZSBhY3Jvc3MgbWFjaGluZXMgaG9sZGluZyB0aGUgc2FtZSBjb21taXQuIEl0IG11c3QgTkVWRVIgY29uc3VsdFxuICogZ2l0aWdub3JlZCBmaWxlcyAoYC5kZXYudmFycypgLCBgLmVudipgLCAuLi4pLCB3aGljaCBgd2Igc3RhcnRgIGFuZCBgd2IgZGVwbG95YCBjcmVhdGUgcm91dGluZWx5IGFuZCB3aGljaFxuICogdGhlcmVmb3JlIHN0YXkgdW50cmFja2VkIG9uIGRldiBtYWNoaW5lcyBmb3JldmVyOiBhIGZvcm1lciBjaGVjayB0aGF0IHRyZWF0ZWQgdGhlbSBhcyBpcnJlcHJvZHVjaWJsZSBpbnB1dHNcbiAqIG1hZGUgd2JmeSBydW5zIG9uIGRldiBtYWNoaW5lcyByZS10cmFjayB0aGUgfjE1ay1saW5lIGdlbmVyYXRlZCBmaWxlIHRoYXQgcnVucyBmcm9tIGNsZWFuIGNoZWNrb3V0cyBoYWRcbiAqIHVudHJhY2tlZCwgb3NjaWxsYXRpbmcgZXRlcm5hbGx5IChlLmcuIGFpLWdhbWUtYnVpbGRlciAjNjg0IOKGkiAjNzQ2KS4gUmVhZGluZyBjb21taXR0YWJsZSByZXBvc2l0b3J5IGZpbGVzXG4gKiBmcm9tIHRoZSB3b3JraW5nIHRyZWUgKHRoZSB3cmFuZ2xlciBjb25maWcsIHBhY2thZ2UuanNvbiwgdHNjb25maWcg4oCUIGFzIGV2ZXJ5IHdiZnkgZ2VuZXJhdG9yIGRvZXMpIGlzIGZpbmU6XG4gKiBhbnkgZGl2ZXJnZW5jZSB0aGVyZSBpcyB0cmFuc2llbnQgYW5kIGRpc2FwcGVhcnMgb25jZSB0aGUgZmlsZSBpcyBjb21taXR0ZWQgb3IgcmVtb3ZlZC5cbiAqIFRoZSBoYXphcmQgdGhhdCBjaGVjayBndWFyZGVkIGFnYWluc3Qgbm8gbG9uZ2VyIGV4aXN0czogYHdiIGdlbi1jb2RlYCBydW5zIGB3cmFuZ2xlciB0eXBlcyAtLWVudi1maWxlYCB3aXRoXG4gKiBhIGtleSBzdHViIGRlcml2ZWQgc29sZWx5IGZyb20gdGhlIGNvbW1pdHRlZCBmbm94LnRvbWwgKHNlZSB3YidzIHdyaXRlV29ya2VyVHlwZXNFbnZTdHViKSwgc28gbG9jYWwgZG90ZW52XG4gKiBmaWxlcyBuZXZlciBpbmZsdWVuY2UgdGhlIGdlbmVyYXRlZCBgRW52YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlc1dvcmtlclR5cGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICBjb25zdCBwYWNrYWdlSnNvbiA9IGNvbmZpZy5wYWNrYWdlSnNvbjtcbiAgcmV0dXJuIGNvbmZpZy5kb2VzQ29udGFpbldyYW5nbGVyQ29uZmlnICYmIGhhc1dyYW5nbGVyRGVwZW5kZW5jeShwYWNrYWdlSnNvbikgJiYgY29uc3VtZXNHZW5lcmF0ZWRXb3JrZXJUeXBlcyhjb25maWcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0V29ya2VyVHlwZXNTY3JpcHRFcnJvcihjb25maWc6IFBpY2s8UGFja2FnZUNvbmZpZywgJ3BhY2thZ2VKc29uJz4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBzY3JpcHRzID0gY29uZmlnLnBhY2thZ2VKc29uPy5zY3JpcHRzID8/IHt9O1xuICBmb3IgKGNvbnN0IFtuYW1lLCBzY3JpcHRdIG9mIE9iamVjdC5lbnRyaWVzKHNjcmlwdHMpKSB7XG4gICAgaWYgKHNjcmlwdCA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICBjb25zdCBzZWdtZW50cyA9IHNwbGl0U2NyaXB0U2VnbWVudHMoc2NyaXB0KTtcbiAgICBjb25zdCBoYXNOb25DYW5vbmljYWxXYkdlbkNvZGUgPSBzZWdtZW50cz8uc29tZSgoc2VnbWVudCkgPT4ge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IHNlZ21lbnQudHJpbSgpLnJlcGxhY2VBbGwoL1xccysvZ3UsICcgJyk7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAvXig/Oig/OmJ1bnxidW54KSg/OiAtLWJ1bik/KD86IHJ1bik/ICk/d2IgZ2VuLWNvZGUkL3UudGVzdChub3JtYWxpemVkKSAmJlxuICAgICAgICBjbGFzc2lmeVNjcmlwdFNlZ21lbnQoc2VnbWVudCwgc2NyaXB0cywgdHJ1ZSkgPT09ICdjdXN0b20nXG4gICAgICApO1xuICAgIH0pO1xuICAgIGlmIChoYXNOb25DYW5vbmljYWxXYkdlbkNvZGUpIHJldHVybiBgJHtuYW1lfSBtdXN0IHVzZSB0aGUgY2Fub25pY2FsIGJ1biB3YiBnZW4tY29kZSBjb21tYW5kYDtcbiAgfVxuICAvLyBPbmx5IGBidW4gcnVuIDxzY3JpcHQ+YCBpcyByZWNvZ25pemVkIGFzIGEgd3JhcHBlcjsgYW5vdGhlciBydW5uZXIgc3BlbGxpbmcgd291bGQgZ2V0IGEgbWFuYWdlZFxuICAvLyBnZW5lcmF0aW9uIGFwcGVuZGVkIG5leHQgdG8gaXQgYW5kIHJ1biBldmVyeSBnZW5lcmF0b3IgdHdpY2UgcGVyIGluc3RhbGwuIFdpdGhvdXQgYSBnZW4tY29kZVxuICAvLyBwaXBlbGluZSBub3RoaW5nIGlzIGFwcGVuZGVkLCBzbyB0aGUgc3BlbGxpbmcgaXMgaXJyZWxldmFudCB0aGVyZS5cbiAgZm9yIChjb25zdCBzZWdtZW50IG9mIHNwbGl0U2NyaXB0U2VnbWVudHMoc2NyaXB0cy5wb3N0aW5zdGFsbCA/PyAnJykgPz8gW10pIHtcbiAgICBjb25zdCBzY3JpcHROYW1lID0gL14oPzpidW58YnVueCkoPzpcXHMrLS1idW4pPyg/OlxccytydW4pP1xccysoXFxTKykkL3UuZXhlYyhzZWdtZW50KT8uWzFdO1xuICAgIGNvbnN0IHRhcmdldCA9IHNjcmlwdE5hbWUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHNjcmlwdHNbc2NyaXB0TmFtZV07XG4gICAgaWYgKFxuICAgICAgdGFyZ2V0ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIHNlZ21lbnQgIT09IGBidW4gcnVuICR7c2NyaXB0TmFtZX1gICYmXG4gICAgICAoc2NyaXB0c1snZ2VuLWNvZGUnXSAhPT0gdW5kZWZpbmVkIHx8IHRhcmdldC5pbmNsdWRlcygnd2IgZ2VuLWNvZGUnKSlcbiAgICApIHtcbiAgICAgIHJldHVybiBgcG9zdGluc3RhbGwgbXVzdCBpbnZva2UgdGhlICR7c2NyaXB0TmFtZX0gc2NyaXB0IGFzIGJ1biBydW4gJHtzY3JpcHROYW1lfWA7XG4gICAgfVxuICB9XG4gIGlmIChcbiAgICAvKD86XnwmJilcXHMqKD86bnBtfG5weHxwbnBtfHlhcm4pXFxzKyg/OnJ1big/Oi1zY3JpcHQpP1xccyspPyg/Omdlbi1jb2RlfHdiXFxzK2dlbi1jb2RlKVxccyooPzomJnwkKS91LnRlc3QoXG4gICAgICBzY3JpcHRzLnBvc3RpbnN0YWxsID8/ICcnXG4gICAgKVxuICApIHtcbiAgICByZXR1cm4gJ3Bvc3RpbnN0YWxsIG11c3QgdXNlIGJ1biB3YiBnZW4tY29kZSBpbnN0ZWFkIG9mIGEgbm9uLUJ1biBnZW4tY29kZSBydW5uZXInO1xuICB9XG4gIGZvciAoY29uc3QgW25hbWUsIHNjcmlwdF0gb2YgT2JqZWN0LmVudHJpZXMoc2NyaXB0cykpIHtcbiAgICBpZiAoc2NyaXB0ID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgIGlmICh3cmFuZ2xlclR5cGVzVGV4dFBhdHRlcm4udGVzdChzY3JpcHQpKSByZXR1cm4gYCR7bmFtZX0gbXVzdCB1c2UgYnVuIHdiIGdlbi1jb2RlIGluc3RlYWQgb2Ygd3JhbmdsZXIgdHlwZXNgO1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhc1dyYW5nbGVyRGVwZW5kZW5jeShwYWNrYWdlSnNvbjogUGFja2FnZUpzb24gfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIFtcbiAgICBwYWNrYWdlSnNvbj8uZGVwZW5kZW5jaWVzLFxuICAgIHBhY2thZ2VKc29uPy5kZXZEZXBlbmRlbmNpZXMsXG4gICAgcGFja2FnZUpzb24/Lm9wdGlvbmFsRGVwZW5kZW5jaWVzLFxuICAgIHBhY2thZ2VKc29uPy5wZWVyRGVwZW5kZW5jaWVzLFxuICBdLnNvbWUoKGRlcGVuZGVuY2llcykgPT4gZGVwZW5kZW5jaWVzPy53cmFuZ2xlciAhPT0gdW5kZWZpbmVkKTtcbn1cblxuY29uc3Qgc2hlbGxXb3JkUGF0dGVybiA9IFN0cmluZy5yYXdgKD86XCIoPzpcXFxcLnxbXlwiXFxcXF0pKlwifCcoPzpcXFxcLnxbXidcXFxcXSkqJ3woPzpcXFxcLnxbXlxcc1wiJ1xcXFxdKSspYDtcbmNvbnN0IHdyYW5nbGVyT3B0aW9uUGF0dGVybiA9IFN0cmluZy5yYXdgXFxzKy0tP1tBLVphLXpdW1xcdy1dKig/Oj0ke3NoZWxsV29yZFBhdHRlcm59fFxccysoPyEtfHR5cGVzXFxiKSR7c2hlbGxXb3JkUGF0dGVybn0pP2A7XG5jb25zdCB3cmFuZ2xlclR5cGVzVGV4dFBhdHRlcm4gPSBuZXcgUmVnRXhwKFxuICBTdHJpbmcucmF3YFtcIiddP1xcYndyYW5nbGVyKD86QFteXFxzXCInXSspP1xcYltcIiddPyg/OiR7d3JhbmdsZXJPcHRpb25QYXR0ZXJufSkqXFxzK3R5cGVzXFxiYCxcbiAgJ3UnXG4pO1xuXG4vKipcbiAqIEEgcGFja2FnZSB3aG9zZSBUeXBlU2NyaXB0IHByb2plY3QgY2Fubm90IGluY2x1ZGUgd29ya2VyLWNvbmZpZ3VyYXRpb24uZC50cyAoZS5nLiBvbmUgb24gYSBoYW5kLW1haW50YWluZWRcbiAqIG1pbmltYWwgYEVudmAgd2l0aCBgdHlwZXM6IFtcImJ1blwiXWAsIHRoZSBzdGFuZGFyZCBlc2NhcGUgd2hlbiB0aGUgYW1iaWVudCB3cmFuZ2xlciBnbG9iYWxzIGNvbmZsaWN0IHdpdGggdGhlXG4gKiBgQHR5cGVzL2J1bmAgZ2xvYmFscyBpdHMgdGVzdHMgbmVlZCkgZ2FpbnMgbm90aGluZyBmcm9tIHJlZ2VuZXJhdGluZyB0aGUgfjUwMEtCIGZpbGUgb24gZXZlcnkgaW5zdGFsbCwgc28gd2JmeVxuICogbGVhdmVzIHN1Y2ggcGFja2FnZXMgdW5tYW5hZ2VkIGluc3RlYWQgb2YgcmUtYWRkaW5nIHRoZSBnZW5lcmF0aW9uIHN0ZXAuIENvbnN1bXB0aW9uIGlzIGRldGVjdGVkIHR3byB3YXlzOlxuICogYSB0ZXh0dWFsIGB3b3JrZXItY29uZmlndXJhdGlvbmAgcmVmZXJlbmNlIGluIGFueSB0cmFja2VkIGZpbGUgb2YgdGhlIHBhY2thZ2UgKGNvdmVycyBpbXBvcnRzLCB0cmlwbGUtc2xhc2hcbiAqIHJlZmVyZW5jZXMsIGFuZCBleHBsaWNpdCB0c2NvbmZpZyBlbnRyaWVzKSwgb3IgYSBgZmlsZXNgL2BpbmNsdWRlYC9gZXhjbHVkZWAgc2V0IHRoYXQgY2FuIG1hdGNoIHRoZSBmaWxlIOKAlFxuICogcmVzb2x2ZWQgdGhyb3VnaCByZWxhdGl2ZSBgZXh0ZW5kc2AgY2hhaW5zIHdpdGggZWFjaCBwYXR0ZXJuIGtlcHQgcmVsYXRpdmUgdG8gdGhlIGNvbmZpZyB0aGF0IGRlY2xhcmVkIGl0LFxuICogbWF0Y2hpbmcgdHNjLiBXaGVuZXZlciB0aGUgZWZmZWN0aXZlIHNldCBjYW5ub3QgYmUgZGV0ZXJtaW5lZCAobWlzc2luZyBvciB1bnBhcnNlYWJsZSB0c2NvbmZpZywgcGFja2FnZS1uYW1lXG4gKiBgZXh0ZW5kc2AgcHJlc2V0cywgb3IgVHlwZVNjcmlwdCdzIGRlZmF1bHQgYCoqYCBpbmNsdXNpb24pLCB0aGUgY3VycmVudCBtYW5hZ2VkIGJlaGF2aW9yIGlzIGtlcHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25zdW1lc0dlbmVyYXRlZFdvcmtlclR5cGVzKGNvbmZpZzogUGljazxQYWNrYWdlQ29uZmlnLCAnZGlyUGF0aCc+KTogYm9vbGVhbiB7XG4gIC8vIGBnaXQgZ3JlcGAgc2VhcmNoZXMgdHJhY2tlZCBmaWxlcyBvbmx5LCBzbyB0aGUgZ2l0aWdub3JlZCBnZW5lcmF0ZWQgZmlsZSBpdHNlbGYgbmV2ZXIgbWF0Y2hlcy5cbiAgLy8gd2JmeSdzIG93biBtYW5hZ2VkIGFydGlmYWN0cyBhcmUgZXhjbHVkZWQ6IHRoZSBgLmdpdGlnbm9yZWAgcnVsZSAoYC93b3JrZXItY29uZmlndXJhdGlvbi5kLnRzYClcbiAgLy8gd2JmeSBjb21taXR0ZWQgd2hpbGUgaXQgbWFuYWdlZCB0aGUgcGFja2FnZSBtdXN0IG5vdCBjb3VudCBhcyBjb25zdW1wdGlvbiwgb3IgYSBvbmNlLW1hbmFnZWRcbiAgLy8gcGFja2FnZSBjb3VsZCBuZXZlciBvcHQgb3V0LlxuICBjb25zdCBncmVwUmVzdWx0ID0gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KFxuICAgICdnaXQnLFxuICAgIC8vIHRzY29uZmlnIGZpbGVzIGFyZSBjbGFzc2lmaWVkIGJ5IHRoZSByZXNvbHZlZCBmaWxlcy9pbmNsdWRlL2V4Y2x1ZGUgbG9naWMgYmVsb3cg4oCUIGEgdGV4dHVhbFxuICAgIC8vIGhpdCB0aGVyZSAoZS5nLiBhbiBgZXhjbHVkZWAgZW50cnkpIG11c3Qgbm90IGNvdW50IGFzIGNvbnN1bXB0aW9uLlxuICAgIFtcbiAgICAgICdncmVwJyxcbiAgICAgICctbCcsXG4gICAgICAnd29ya2VyLWNvbmZpZ3VyYXRpb24nLFxuICAgICAgJy0tJyxcbiAgICAgICcuJyxcbiAgICAgICc6KGV4Y2x1ZGUpLmdpdGlnbm9yZScsXG4gICAgICAnOihleGNsdWRlKS5naXRhdHRyaWJ1dGVzJyxcbiAgICAgIFN0cmluZy5yYXdgOihnbG9iLGV4Y2x1ZGUpKiovdHNjb25maWcqLmpzb25gLFxuICAgIF0sXG4gICAgY29uZmlnLmRpclBhdGhcbiAgKTtcbiAgaWYgKGdyZXBSZXN1bHQudHJpbSgpKSByZXR1cm4gdHJ1ZTtcblxuICBjb25zdCB3b3JrZXJUeXBlc1BhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICd3b3JrZXItY29uZmlndXJhdGlvbi5kLnRzJyk7XG4gIGNvbnN0IGZpbGVTZXQgPSByZXNvbHZlVHNjb25maWdGaWxlU2V0KHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3RzY29uZmlnLmpzb24nKSwgY29uZmlnLmRpclBhdGgsIDUpO1xuICBpZiAoIWZpbGVTZXQpIHJldHVybiB0cnVlO1xuICBjb25zdCBtYXRjaGVzID0gKHBhdHRlcm5TZXQ6IFRzY29uZmlnUGF0dGVyblNldCB8IHVuZGVmaW5lZCk6IGJvb2xlYW4gPT4ge1xuICAgIGlmICghcGF0dGVyblNldCB8fCAhQXJyYXkuaXNBcnJheShwYXR0ZXJuU2V0LnBhdHRlcm5zKSkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUocGF0dGVyblNldC5iYXNlRGlyUGF0aCwgd29ya2VyVHlwZXNQYXRoKS5yZXBsYWNlQWxsKCdcXFxcJywgJy8nKTtcbiAgICByZXR1cm4gcGF0dGVyblNldC5wYXR0ZXJucy5zb21lKChwYXR0ZXJuKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHBhdHRlcm4gIT09ICdzdHJpbmcnKSByZXR1cm4gZmFsc2U7XG4gICAgICAvLyBgJHtjb25maWdEaXJ9YC1wcmVmaXhlZCBwYXR0ZXJucyB3ZXJlIGV4cGFuZGVkIHRvIGFic29sdXRlIHBhdGhzIGF0IHJlc29sdmUgdGltZS5cbiAgICAgIGlmIChwYXRoLmlzQWJzb2x1dGUocGF0dGVybikpIHtcbiAgICAgICAgcmV0dXJuIHRzY29uZmlnUGF0dGVybkNvdWxkTWF0Y2hQYXRoKHBhdHRlcm4sIHdvcmtlclR5cGVzUGF0aCwgcGF0dGVyblNldC5leHBhbmRzRGlyZWN0b3JpZXMpO1xuICAgICAgfVxuICAgICAgaWYgKHJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuLicpKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gdHNjb25maWdQYXR0ZXJuQ291bGRNYXRjaFBhdGgocGF0dGVybiwgcmVsYXRpdmVQYXRoLCBwYXR0ZXJuU2V0LmV4cGFuZHNEaXJlY3Rvcmllcyk7XG4gICAgfSk7XG4gIH07XG4gIC8vIGBmaWxlc2AgZW50cmllcyBhcmUgYWx3YXlzIHBhcnQgb2YgdGhlIHByb2dyYW0sIGV2ZW4gd2hlbiBgZXhjbHVkZWAgbWF0Y2hlcyB0aGVtLlxuICBpZiAobWF0Y2hlcyhmaWxlU2V0LmZpbGVzKSkgcmV0dXJuIHRydWU7XG4gIGlmIChtYXRjaGVzKGZpbGVTZXQuZXhjbHVkZSkpIHJldHVybiBmYWxzZTtcbiAgLy8gTmVpdGhlciBpbmNsdWRlIG5vciBmaWxlcyBkZWNsYXJlZDogVHlwZVNjcmlwdCdzIGRlZmF1bHQgYCoqYCBpbmNsdXNpb24gY292ZXJzIHRoZSBmaWxlLlxuICBpZiAoIWZpbGVTZXQuaW5jbHVkZSAmJiAhZmlsZVNldC5maWxlcykgcmV0dXJuIHRydWU7XG4gIHJldHVybiBtYXRjaGVzKGZpbGVTZXQuaW5jbHVkZSk7XG59XG5cbmludGVyZmFjZSBUc2NvbmZpZ1BhdHRlcm5TZXQge1xuICAvKiogRGlyZWN0b3J5IG9mIHRoZSBjb25maWcgdGhhdCBkZWNsYXJlZCB0aGUgcGF0dGVybnM7IHRzYyByZXNvbHZlcyB0aGVtIHJlbGF0aXZlIHRvIGl0LiAqL1xuICBiYXNlRGlyUGF0aDogc3RyaW5nO1xuICAvKiogaW5jbHVkZS9leGNsdWRlIHRyZWF0IGFuIGV4dGVuc2lvbmxlc3Mgbm9uLWdsb2IgcGF0dGVybiBhcyBhIGRpcmVjdG9yeSBzdWJ0cmVlOyBgZmlsZXNgIGRvZXMgbm90LiAqL1xuICBleHBhbmRzRGlyZWN0b3JpZXM6IGJvb2xlYW47XG4gIHBhdHRlcm5zOiB1bmtub3duO1xufVxuXG5pbnRlcmZhY2UgVHNjb25maWdGaWxlU2V0IHtcbiAgZXhjbHVkZT86IFRzY29uZmlnUGF0dGVyblNldDtcbiAgZmlsZXM/OiBUc2NvbmZpZ1BhdHRlcm5TZXQ7XG4gIGluY2x1ZGU/OiBUc2NvbmZpZ1BhdHRlcm5TZXQ7XG59XG5cbi8qKiBSZXNvbHZlcyBmaWxlcy9pbmNsdWRlL2V4Y2x1ZGUgdGhyb3VnaCByZWxhdGl2ZSBgZXh0ZW5kc2AgY2hhaW5zOyB1bmRlZmluZWQgd2hlbiB1bnJlYWRhYmxlLiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVRzY29uZmlnRmlsZVNldChcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgY29uc3VtZXJEaXJQYXRoOiBzdHJpbmcsXG4gIHJlbWFpbmluZ0RlcHRoOiBudW1iZXJcbik6IFRzY29uZmlnRmlsZVNldCB8IHVuZGVmaW5lZCB7XG4gIGlmIChyZW1haW5pbmdEZXB0aCA8PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICBsZXQgY29udGVudDogc3RyaW5nO1xuICB0cnkge1xuICAgIGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGY4Jyk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgY29uc3QgdHNjb25maWcgPSBqc29uY1V0aWwucGFyc2VPYmplY3RJZ25vcmluZ0Vycm9yPHtcbiAgICBleGNsdWRlPzogdW5rbm93bjtcbiAgICBleHRlbmRzPzogdW5rbm93bjtcbiAgICBmaWxlcz86IHVua25vd247XG4gICAgaW5jbHVkZT86IHVua25vd247XG4gIH0+KGNvbnRlbnQpO1xuICBpZiAoIXRzY29uZmlnKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBkaXJQYXRoID0gcGF0aC5kaXJuYW1lKGZpbGVQYXRoKTtcbiAgLy8gYCR7Y29uZmlnRGlyfWAgcmVzb2x2ZXMgdG8gdGhlIGRpcmVjdG9yeSBvZiB0aGUgUk9PVCAoY29uc3VtaW5nKSBjb25maWcsIHdoZXJldmVyIGl0IGFwcGVhcnMuXG4gIGNvbnN0IHRvUGF0dGVyblNldCA9IChwYXR0ZXJuczogdW5rbm93biwgZXhwYW5kc0RpcmVjdG9yaWVzOiBib29sZWFuKTogVHNjb25maWdQYXR0ZXJuU2V0IHwgdW5kZWZpbmVkID0+XG4gICAgQXJyYXkuaXNBcnJheShwYXR0ZXJucylcbiAgICAgID8ge1xuICAgICAgICAgIGJhc2VEaXJQYXRoOiBkaXJQYXRoLFxuICAgICAgICAgIGV4cGFuZHNEaXJlY3RvcmllcyxcbiAgICAgICAgICBwYXR0ZXJuczogcGF0dGVybnMubWFwKChwYXR0ZXJuKSA9PlxuICAgICAgICAgICAgdHlwZW9mIHBhdHRlcm4gPT09ICdzdHJpbmcnICYmIHBhdHRlcm4uc3RhcnRzV2l0aCgnJHtjb25maWdEaXJ9JylcbiAgICAgICAgICAgICAgPyBwYXRoLmpvaW4oY29uc3VtZXJEaXJQYXRoLCBwYXR0ZXJuLnNsaWNlKCcke2NvbmZpZ0Rpcn0nLmxlbmd0aCkpXG4gICAgICAgICAgICAgIDogcGF0dGVyblxuICAgICAgICAgICksXG4gICAgICAgIH1cbiAgICAgIDogdW5kZWZpbmVkO1xuICBjb25zdCBmaWxlU2V0OiBUc2NvbmZpZ0ZpbGVTZXQgPSB7XG4gICAgZXhjbHVkZTogdG9QYXR0ZXJuU2V0KHRzY29uZmlnLmV4Y2x1ZGUsIHRydWUpLFxuICAgIGZpbGVzOiB0b1BhdHRlcm5TZXQodHNjb25maWcuZmlsZXMsIGZhbHNlKSxcbiAgICBpbmNsdWRlOiB0b1BhdHRlcm5TZXQodHNjb25maWcuaW5jbHVkZSwgdHJ1ZSksXG4gIH07XG4gIGNvbnN0IHBhcmVudHMgPVxuICAgIHR5cGVvZiB0c2NvbmZpZy5leHRlbmRzID09PSAnc3RyaW5nJyA/IFt0c2NvbmZpZy5leHRlbmRzXSA6IEFycmF5LmlzQXJyYXkodHNjb25maWcuZXh0ZW5kcykgPyB0c2NvbmZpZy5leHRlbmRzIDogW107XG4gIC8vIFdpdGggYW4gYGV4dGVuZHNgIGFycmF5LCBsYXRlciBlbnRyaWVzIG92ZXJyaWRlIGVhcmxpZXIgb25lcywgYW5kIHRoZSBjaGlsZCBvdmVycmlkZXMgYWxsIOKAlFxuICAvLyBzbyBmaWxsIGVhY2ggc3RpbGwtbWlzc2luZyBrZXkgZnJvbSB0aGUgbGFzdCBwYXJlbnQgdGhhdCBkZWZpbmVzIGl0LlxuICBmb3IgKGNvbnN0IHBhcmVudCBvZiBwYXJlbnRzLnRvUmV2ZXJzZWQoKSkge1xuICAgIGlmIChmaWxlU2V0LmV4Y2x1ZGUgJiYgZmlsZVNldC5maWxlcyAmJiBmaWxlU2V0LmluY2x1ZGUpIGJyZWFrO1xuICAgIC8vIFBhY2thZ2UtbmFtZSBleHRlbmRzIChlLmcuIGBAdHNjb25maWcvYnVuYCkgYXJlIGNvbXBpbGVyT3B0aW9ucyBwcmVzZXRzIHdpdGhvdXQgZmlsZSBzZXRzLlxuICAgIGlmICh0eXBlb2YgcGFyZW50ICE9PSAnc3RyaW5nJyB8fCAhcGFyZW50LnN0YXJ0c1dpdGgoJy4nKSkgY29udGludWU7XG4gICAgbGV0IHBhcmVudFBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgcGFyZW50KTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMocGFyZW50UGF0aCkgJiYgZnMuZXhpc3RzU3luYyhgJHtwYXJlbnRQYXRofS5qc29uYCkpIHBhcmVudFBhdGggKz0gJy5qc29uJztcbiAgICBjb25zdCBwYXJlbnRGaWxlU2V0ID0gcmVzb2x2ZVRzY29uZmlnRmlsZVNldChwYXJlbnRQYXRoLCBjb25zdW1lckRpclBhdGgsIHJlbWFpbmluZ0RlcHRoIC0gMSk7XG4gICAgaWYgKCFwYXJlbnRGaWxlU2V0KSBjb250aW51ZTtcbiAgICBmaWxlU2V0LmV4Y2x1ZGUgPz89IHBhcmVudEZpbGVTZXQuZXhjbHVkZTtcbiAgICBmaWxlU2V0LmZpbGVzID8/PSBwYXJlbnRGaWxlU2V0LmZpbGVzO1xuICAgIGZpbGVTZXQuaW5jbHVkZSA/Pz0gcGFyZW50RmlsZVNldC5pbmNsdWRlO1xuICB9XG4gIHJldHVybiBmaWxlU2V0O1xufVxuXG5mdW5jdGlvbiB0c2NvbmZpZ1BhdHRlcm5Db3VsZE1hdGNoUGF0aChwYXR0ZXJuOiBzdHJpbmcsIHRhcmdldFBhdGg6IHN0cmluZywgZXhwYW5kc0RpcmVjdG9yaWVzOiBib29sZWFuKTogYm9vbGVhbiB7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBwYXR0ZXJuLnJlcGxhY2UoL15cXC5cXC8vdSwgJycpO1xuICAvLyBBIGJhcmUgYC5gIGluY2x1ZGUgY292ZXJzIGV2ZXJ5dGhpbmcgdW5kZXIgdGhlIGNvbmZpZydzIGRpcmVjdG9yeS5cbiAgaWYgKG5vcm1hbGl6ZWQgPT09ICcnIHx8IG5vcm1hbGl6ZWQgPT09ICcuJykgcmV0dXJuIHRydWU7XG4gIC8vIEFic29sdXRlIHBhdHRlcm5zIChleHBhbmRlZCBgJHtjb25maWdEaXJ9YCkgYXJlIG1hdGNoZWQgYWdhaW5zdCB0aGUgYWJzb2x1dGUgdGFyZ2V0OyBkcm9wIHRoZVxuICAvLyBsZWFkaW5nIHNsYXNoZXMgZnJvbSBib3RoIHNvIHRoZSBzZWdtZW50LWJ1aWx0IHJlZ2V4IGFuY2hvcnMgaWRlbnRpY2FsbHkuXG4gIHRhcmdldFBhdGggPSB0YXJnZXRQYXRoLnJlcGxhY2UoL15cXC8rL3UsICcnKTtcbiAgY29uc3Qgc2VnbWVudHMgPSBub3JtYWxpemVkLnNwbGl0KCcvJykuZmlsdGVyKChzZWdtZW50KSA9PiBzZWdtZW50ICE9PSAnJyk7XG4gIGNvbnN0IHJlZ2V4U291cmNlID0gc2VnbWVudHNcbiAgICAubWFwKChzZWdtZW50LCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgaXNMYXN0ID0gaW5kZXggPT09IHNlZ21lbnRzLmxlbmd0aCAtIDE7XG4gICAgICBpZiAoc2VnbWVudCA9PT0gJyoqJykgcmV0dXJuIGlzTGFzdCA/ICcuKicgOiBTdHJpbmcucmF3YCg/OlteL10rLykqYDtcbiAgICAgIGNvbnN0IHNlZ21lbnRTb3VyY2UgPSBzZWdtZW50XG4gICAgICAgIC5yZXBsYWNlQWxsKC9bLiteJHt9KCl8W1xcXVxcXFxdL2d1LCBTdHJpbmcucmF3YFxcJCZgKVxuICAgICAgICAucmVwbGFjZUFsbCgnKicsIFN0cmluZy5yYXdgW14vXSpgKVxuICAgICAgICAucmVwbGFjZUFsbCgnPycsIFN0cmluZy5yYXdgW14vXWApO1xuICAgICAgcmV0dXJuIGlzTGFzdCA/IHNlZ21lbnRTb3VyY2UgOiBgJHtzZWdtZW50U291cmNlfS9gO1xuICAgIH0pXG4gICAgLmpvaW4oJycpO1xuICAvLyB0c2MgdHJlYXRzIGFuIGV4dGVuc2lvbmxlc3Mgbm9uLWdsb2IgaW5jbHVkZS9leGNsdWRlIGVudHJ5IGFzIGEgZGlyZWN0b3J5IHdob3NlIHN1YnRyZWUgaXMgaW5jbHVkZWQuXG4gIGNvbnN0IGxhc3RTZWdtZW50ID0gc2VnbWVudHMuYXQoLTEpID8/ICcnO1xuICBjb25zdCBkaXJlY3RvcnlTdWZmaXggPVxuICAgIGV4cGFuZHNEaXJlY3RvcmllcyAmJiAhL1sqP10vdS50ZXN0KGxhc3RTZWdtZW50KSAmJiAhbGFzdFNlZ21lbnQuaW5jbHVkZXMoJy4nKSA/IFN0cmluZy5yYXdgKD86Ly4qKT9gIDogJyc7XG4gIHJldHVybiBuZXcgUmVnRXhwKGBeJHtyZWdleFNvdXJjZX0ke2RpcmVjdG9yeVN1ZmZpeH0kYCwgJ3UnKS50ZXN0KHRhcmdldFBhdGgpO1xufVxuXG4vKipcbiAqIFRlbGxzIHdoZXRoZXIgdGhlIGRpcmVjdG9yeSBvd25zIGEgV29ya2VyLCB1bmxpa2UgdGhlIGlzQ2xvdWRmbGFyZSBoZXVyaXN0aWMsIHdoaWNoIGFsc28gbWF0Y2hlcyBhIHBhY2thZ2UgdGhhdFxuICogbWVyZWx5IG1lbnRpb25zIHdyYW5nbGVyIGluIGEgc2NyaXB0IG9yIHdvcmtmbG93IChlLmcuIHRoZSByb290IG9mIGEgbW9ub3JlcG8gd2hvc2UgV29ya2VyIGxpdmVzIGluIGEgc3ViLXBhY2thZ2UpLlxuICovXG5mdW5jdGlvbiBkZXRlY3RXcmFuZ2xlckNvbmZpZyhkaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIFsnd3JhbmdsZXIuanNvbmMnLCAnd3JhbmdsZXIuanNvbicsICd3cmFuZ2xlci50b21sJ10uc29tZSgoZmlsZU5hbWUpID0+XG4gICAgZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgZmlsZU5hbWUpKVxuICApO1xufVxuXG4vKipcbiAqIERldGVjdHMgd2hldGhlciBkaXJQYXRoIGJlbG9uZ3MgdG8gdGhlIHdpbGxib29zdGVyLWNvbmZpZ3MgcmVwb3NpdG9yeS4gUHJlZmVycyB0aGUgYXV0aG9yaXRhdGl2ZVxuICogR2l0SHViIHJlcG8gbmFtZSwgd2hpY2ggaXMgaW1tdW5lIHRvIHRoZSBsb2NhbCBkaXJlY3RvcnkgbGF5b3V0LiBUaGF0IG5hbWUgaXMgZmV0Y2hlZCBvbmx5IGZvciB0aGVcbiAqIHJvb3QsIHNvIHN1Yi1wYWNrYWdlcyAoYW5kIG9mZmxpbmUgcm9vdHMpIHdhbGsgdXAgdG8gdGhlIG5lYXJlc3QgZ2l0IHJvb3QgYW5kIG1hdGNoIGl0cyBkaXJlY3RvcnlcbiAqIG5hbWU6IGEgc2libGluZyByZXBvIGNsb25lZCB1bmRlciBhIHBhcmVudCBkaXJlY3RvcnkgbmFtZWQgd2lsbGJvb3N0ZXItY29uZmlncyBzdG9wcyBhdCBpdHMgb3duXG4gKiBgLmdpdGAsIHNvIGl0IGlzIG5vdCBtaXNjbGFzc2lmaWVkLiBUaGUgcGF0aCBzZWdtZW50IHJlbWFpbnMgYSBsYXN0IHJlc29ydCB3aGVuIG5vIGdpdCByb290IGV4aXN0cy5cbiAqL1xuZnVuY3Rpb24gZGV0ZWN0SXNXaWxsQm9vc3RlckNvbmZpZ3MoZGlyUGF0aDogc3RyaW5nLCBwYWNrYWdlSnNvblBhdGg6IHN0cmluZywgcmVwb05hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICBpZiAocmVwb05hbWUpIHJldHVybiByZXBvTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnd2lsbGJvb3N0ZXItY29uZmlncyc7XG4gIGxldCBjdXJyZW50ID0gcGF0aC5yZXNvbHZlKGRpclBhdGgpO1xuICB3aGlsZSAoY3VycmVudCAhPT0gcGF0aC5kaXJuYW1lKGN1cnJlbnQpKSB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGN1cnJlbnQsICcuZ2l0JykpKSB7XG4gICAgICByZXR1cm4gcGF0aC5iYXNlbmFtZShjdXJyZW50KS50b0xvd2VyQ2FzZSgpID09PSAnd2lsbGJvb3N0ZXItY29uZmlncyc7XG4gICAgfVxuICAgIGN1cnJlbnQgPSBwYXRoLmRpcm5hbWUoY3VycmVudCk7XG4gIH1cbiAgcmV0dXJuIHBhY2thZ2VKc29uUGF0aC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCcvd2lsbGJvb3N0ZXItY29uZmlncy8nKTtcbn1cblxuZnVuY3Rpb24gZGV0ZWN0Q2xvdWRmbGFyZShcbiAgcGFja2FnZUpzb246IFBhY2thZ2VKc29uLFxuICBkb2VzQ29udGFpbldyYW5nbGVyQ29uZmlnOiBib29sZWFuLFxuICB3b3JrZmxvd0NvbnRlbnRzOiBzdHJpbmdbXVxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IHNjcmlwdHMgPSBwYWNrYWdlSnNvbi5zY3JpcHRzO1xuICBpZiAoc2NyaXB0cyAmJiBPYmplY3QudmFsdWVzKHNjcmlwdHMpLnNvbWUoKHNjcmlwdCkgPT4gdHlwZW9mIHNjcmlwdCA9PT0gJ3N0cmluZycgJiYgc2NyaXB0LmluY2x1ZGVzKCd3cmFuZ2xlcicpKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGRvZXNDb250YWluV3JhbmdsZXJDb25maWcpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiB3b3JrZmxvd0NvbnRlbnRzLnNvbWUoKGNvbnRlbnQpID0+IC9jbG91ZGZsYXJlfHdyYW5nbGVyL2l1LnRlc3QoY29udGVudCkpO1xufVxuXG5mdW5jdGlvbiBkZXRlY3RSYWlsd2F5KGRpclBhdGg6IHN0cmluZywgcGFja2FnZUpzb246IFBhY2thZ2VKc29uLCB3b3JrZmxvd0NvbnRlbnRzOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICBjb25zdCBzY3JpcHRzID0gcGFja2FnZUpzb24uc2NyaXB0cztcbiAgaWYgKHNjcmlwdHMgJiYgT2JqZWN0LnZhbHVlcyhzY3JpcHRzKS5zb21lKChzY3JpcHQpID0+IHR5cGVvZiBzY3JpcHQgPT09ICdzdHJpbmcnICYmIHNjcmlwdC5pbmNsdWRlcygncmFpbHdheScpKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKFxuICAgIGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICcucmFpbHdheWlnbm9yZScpKSB8fFxuICAgIGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdyYWlsd2F5Lmpzb24nKSkgfHxcbiAgICBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncmFpbHdheS50b21sJykpXG4gICkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIHdvcmtmbG93Q29udGVudHMuc29tZSgoY29udGVudCkgPT4gL3JhaWx3YXkvaXUudGVzdChjb250ZW50KSk7XG59XG5cbi8qKiBDb250ZW50cyBvZiB0aGUgcmVhZGFibGUgLmdpdGh1Yi93b3JrZmxvd3MgWUFNTCBmaWxlcywgcmVhZCBvbmNlIGZvciBldmVyeSBkZXRlY3RvciBuZWVkaW5nIHRoZW0uICovXG5mdW5jdGlvbiByZWFkV29ya2Zsb3dGaWxlQ29udGVudHMoZGlyUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCB3b3JrZmxvd3NQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICcuZ2l0aHViJywgJ3dvcmtmbG93cycpO1xuICB0cnkge1xuICAgIHJldHVybiBmc1xuICAgICAgLnJlYWRkaXJTeW5jKHdvcmtmbG93c1BhdGgpXG4gICAgICAuZmlsdGVyKChmaWxlTmFtZSkgPT4gL1xcLnlhP21sJC9pdS50ZXN0KGZpbGVOYW1lKSlcbiAgICAgIC5mbGF0TWFwKChmaWxlTmFtZSkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBbZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCBmaWxlTmFtZSksICd1dGY4JyldO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gW107XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZE1pc2VUYXNrcyhkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+IHtcbiAgY29uc3QgdGFza3M6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgZm9yIChjb25zdCBmaWxlTmFtZSBvZiBbJ21pc2UudG9tbCcsICcubWlzZS50b21sJ10pIHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCBmaWxlTmFtZSk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNldHRpbmdzID0gQnVuLlRPTUwucGFyc2UoYXdhaXQgZnNwLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpKSBhcyB7IHRhc2tzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfTtcbiAgICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhzZXR0aW5ncy50YXNrcyA/PyB7fSkpIHtcbiAgICAgICAgdGFza3NbbmFtZV0gPSByZWFkTWlzZVRhc2tDb21tYW5kKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIE1pc3Npbmcgb3IgdGVtcG9yYXJpbHkgaW52YWxpZCBtaXNlIGZpbGVzIHNob3VsZCBub3QgYmxvY2sgb3RoZXIgd2JmeSBnZW5lcmF0b3JzLlxuICAgIH1cbiAgfVxuICByZXR1cm4gdGFza3M7XG59XG5cbmZ1bmN0aW9uIHJlYWRNaXNlVGFza0NvbW1hbmQodmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgcmV0dXJuIHZhbHVlO1xuICAvLyBQcmVzZXJ2ZSBhcnJheS1mb3JtIG1pc2UgY29tbWFuZHMgc28gcmVjdXJzaW9uIGNoZWNrcyBjYW4gc3RpbGwgc2VlIHBhY2thZ2Ugc2NyaXB0IGNhbGxzLlxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiB2YWx1ZS5maWx0ZXIoKGNvbW1hbmQpOiBjb21tYW5kIGlzIHN0cmluZyA9PiB0eXBlb2YgY29tbWFuZCA9PT0gJ3N0cmluZycpLmpvaW4oJ1xcbicpO1xuICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JykgcmV0dXJuIHJlYWRNaXNlVGFza0NvbW1hbmQoKHZhbHVlIGFzIHsgcnVuPzogdW5rbm93biB9KS5ydW4pO1xuICByZXR1cm4gJyc7XG59XG5cbi8qKlxuICogV2hldGhlciBkaXJQYXRoIGlzIGEgY2hpbGQgd29ya3NwYWNlIG9mIGFuIGVuY2xvc2luZyBtb25vcmVwbyByb290OiBlaXRoZXIgdGhlIGNvbnZlbnRpb25hbFxuICogYDxyb290Pi9wYWNrYWdlcy88bmFtZT5gIGxheW91dCwgb3IgYSBkaXJlY3RvcnkgbWF0Y2hpbmcgYSB3b3Jrc3BhY2UgcGF0dGVybiBkZWNsYXJlZCBieSBhblxuICogYW5jZXN0b3IgcGFja2FnZS5qc29uIChwYXR0ZXJucyBtYXkgYmUgYXJiaXRyYXJpbHkgZGVlcCwgZS5nLiBgZXhhbXBsZXMvKipgKS4gVGhlIHdhbGsgc3RvcHNcbiAqIGF0IHRoZSBmaXJzdCBnaXQgcmVwb3NpdG9yeSBib3VuZGFyeSBzbyBhbiB1bnJlbGF0ZWQgZW5jbG9zaW5nIHJlcG9zaXRvcnkncyB3b3Jrc3BhY2VzIGNhblxuICogbmV2ZXIgcmVjbGFzc2lmeSBhbiBpbmRlcGVuZGVudCByZXBvc2l0b3J5IGFzIGEgY2hpbGQuXG4gKi9cbmZ1bmN0aW9uIGlzV29ya3NwYWNlT2ZFbmNsb3NpbmdSb290KGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCByZXNvbHZlZERpclBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCk7XG4gIC8vIEEgZGlyZWN0b3J5IHdpdGggaXRzIG93biAuZ2l0IGlzIGEgcmVwb3NpdG9yeSBpbiBpdHMgb3duIHJpZ2h0LCBuZXZlciBhIGNoaWxkIHdvcmtzcGFjZSDigJRcbiAgLy8gY2hlY2tlZCBGSVJTVCBzbyBhbiBpbmRlcGVuZGVudCByZXBvc2l0b3J5IHVuZGVyIHNvbWUgYHBhY2thZ2VzL2AgZGlyZWN0b3J5IHN0YXlzIGEgcm9vdC5cbiAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKHJlc29sdmVkRGlyUGF0aCwgJy5naXQnKSkpIHJldHVybiBmYWxzZTtcbiAgaWYgKFxuICAgIHBhdGguYmFzZW5hbWUocGF0aC5yZXNvbHZlKHJlc29sdmVkRGlyUGF0aCwgJy4uJykpID09PSAncGFja2FnZXMnICYmXG4gICAgZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUocmVzb2x2ZWREaXJQYXRoLCAnLi4nLCAnLi4nLCAncGFja2FnZS5qc29uJykpXG4gICkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGZvciAoXG4gICAgbGV0IGNhbmRpZGF0ZVJvb3REaXJQYXRoID0gcGF0aC5kaXJuYW1lKHJlc29sdmVkRGlyUGF0aCk7XG4gICAgO1xuICAgIGNhbmRpZGF0ZVJvb3REaXJQYXRoID0gcGF0aC5kaXJuYW1lKGNhbmRpZGF0ZVJvb3REaXJQYXRoKVxuICApIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgcm9vdFBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShcbiAgICAgICAgZnMucmVhZEZpbGVTeW5jKHBhdGgucmVzb2x2ZShjYW5kaWRhdGVSb290RGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpXG4gICAgICApIGFzIFBhY2thZ2VKc29uO1xuICAgICAgY29uc3QgcmVsYXRpdmVEaXJQYXRoID0gcGF0aC5yZWxhdGl2ZShjYW5kaWRhdGVSb290RGlyUGF0aCwgcmVzb2x2ZWREaXJQYXRoKS5yZXBsYWNlQWxsKCdcXFxcJywgJy8nKTtcbiAgICAgIGNvbnN0IHdvcmtzcGFjZURpclBhdGhzID0gZ2V0V29ya3NwYWNlUGFja2FnZUpzb25QYXRocyh7XG4gICAgICAgIGRpclBhdGg6IGNhbmRpZGF0ZVJvb3REaXJQYXRoLFxuICAgICAgICBwYWNrYWdlSnNvbjogcm9vdFBhY2thZ2VKc29uLFxuICAgICAgICBkb2VzQ29udGFpblN1YlBhY2thZ2VKc29uczogZmFsc2UsXG4gICAgICB9KS5tYXAoKHBhY2thZ2VKc29uUGF0aCkgPT4gcGF0aC5wb3NpeC5kaXJuYW1lKHBhY2thZ2VKc29uUGF0aCkpO1xuICAgICAgaWYgKHdvcmtzcGFjZURpclBhdGhzLmluY2x1ZGVzKHJlbGF0aXZlRGlyUGF0aCkpIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gTm8gb3IgdW5wYXJzYWJsZSBtYW5pZmVzdCBhdCB0aGlzIGFuY2VzdG9yOiBrZWVwIHdhbGtpbmcuXG4gICAgfVxuICAgIGNvbnN0IGlzUmVwb0JvdW5kYXJ5ID0gZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY2FuZGlkYXRlUm9vdERpclBhdGgsICcuZ2l0JykpO1xuICAgIGNvbnN0IGlzRmlsZXN5c3RlbVJvb3QgPSBjYW5kaWRhdGVSb290RGlyUGF0aCA9PT0gcGF0aC5kaXJuYW1lKGNhbmRpZGF0ZVJvb3REaXJQYXRoKTtcbiAgICBpZiAoaXNSZXBvQm91bmRhcnkgfHwgaXNGaWxlc3lzdGVtUm9vdCkgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbnRhaW5zQW55KHBhdHRlcm46IHN0cmluZywgZGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBmZy5nbG9iU3luYyhwYXR0ZXJuLCB7IGRvdDogdHJ1ZSwgY3dkOiBkaXJQYXRoLCBpZ25vcmU6IGdsb2JJZ25vcmUgfSkubGVuZ3RoID4gMDtcbn1cblxuZnVuY3Rpb24gZmluZENhcmdvVG9tbERpclBhdGhzKGRpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIGZnXG4gICAgLmdsb2JTeW5jKCcqKi9DYXJnby50b21sJywgeyBkb3Q6IHRydWUsIGN3ZDogZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH0pXG4gICAgLm1hcCgoZmlsZVBhdGgpID0+IHBhdGguZGlybmFtZShmaWxlUGF0aCkpXG4gICAgLnRvU29ydGVkKChhLCBiKSA9PiBhLnNwbGl0KCcvJykubGVuZ3RoIC0gYi5zcGxpdCgnLycpLmxlbmd0aCB8fCBhLmxvY2FsZUNvbXBhcmUoYikpO1xufVxuXG5mdW5jdGlvbiBkZXRlY3RQbGF5d3JpZ2h0UnVudGltZUltcG9ydChkaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgZmlsZXMgPSBmZy5nbG9iU3luYygne2FwcCxzcmN9LyoqLyoue2NqcyxjdHMsanMsanN4LG1qcyxtdHMsdHMsdHN4fScsIHtcbiAgICBkb3Q6IHRydWUsXG4gICAgY3dkOiBkaXJQYXRoLFxuICAgIGlnbm9yZTogWy4uLmdsb2JJZ25vcmUsICcqKi9fX3Rlc3RzX18vKionLCAnKiovKi5zcGVjLionLCAnKiovKi50ZXN0LionLCAnKiovcGxheXdyaWdodC5jb25maWcuKiddLFxuICB9KTtcbiAgY29uc3QgcGxheXdyaWdodEltcG9ydFBhdHRlcm4gPSBidWlsZFJ1bnRpbWVJbXBvcnRSZWdFeHAoJ3BsYXl3cmlnaHQnKTtcbiAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgZmlsZSksICd1dGY4Jyk7XG4gICAgaWYgKHBsYXl3cmlnaHRJbXBvcnRQYXR0ZXJuLnRlc3QoY29udGVudCkpIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gYnVpbGRSdW50aW1lSW1wb3J0UmVnRXhwKHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBSZWdFeHAge1xuICAvLyBNYXRjaCB0aGUgYmFyZSBzcGVjaWZpZXIgb3IgYW55IHN1YnBhdGggb2YgaXQgKGBwa2dgIC8gYHBrZy9zdWJgKSwgYnV0IG5ldmVyIGEgZGlmZmVyZW50IHBhY2thZ2VcbiAgLy8gdGhhdCBtZXJlbHkgc2hhcmVzIHRoZSBwcmVmaXggKGBwa2ctb3RoZXJgKSwgc2luY2UgdGhlIGNoYXIgYWZ0ZXIgdGhlIG5hbWUgbXVzdCBiZSBgL2Agb3IgYSBxdW90ZS5cbiAgY29uc3Qgc3BlY2lmaWVyID0gU3RyaW5nLnJhd2BbJ1wiXSR7ZXNjYXBlUmVnRXhwKHBhY2thZ2VOYW1lKX0oPzovW14nXCJdKik/WydcIl1gO1xuICByZXR1cm4gbmV3IFJlZ0V4cChcbiAgICBTdHJpbmcucmF3YFxcYmZyb21cXHMrJHtzcGVjaWZpZXJ9fFxcYmltcG9ydFxccypcXChcXHMqJHtzcGVjaWZpZXJ9XFxzKlxcKXxcXGJyZXF1aXJlXFxzKlxcKFxccyoke3NwZWNpZmllcn1cXHMqXFwpYCxcbiAgICAndSdcbiAgKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hSZXBvSW5mbyhkaXJQYXRoOiBzdHJpbmcsIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgcmVtb3RlVXJsID0gZ2V0T3JpZ2luUmVtb3RlVXJsKGRpclBhdGgpO1xuICBpZiAocmVtb3RlVXJsKSB7XG4gICAgY29uc3QganNvbiA9IGF3YWl0IHJlcXVlc3RSZXBvSW5mbyhyZW1vdGVVcmwpO1xuICAgIGlmIChqc29uKSByZXR1cm4ganNvbjtcbiAgfVxuXG4gIGNvbnN0IHVybCA9IHR5cGVvZiBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5ID09PSAnc3RyaW5nJyA/IHBhY2thZ2VKc29uLnJlcG9zaXRvcnkgOiBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5Py51cmw7XG4gIGlmICh1cmwpIHtcbiAgICBjb25zdCBqc29uID0gYXdhaXQgcmVxdWVzdFJlcG9JbmZvKHVybCk7XG4gICAgaWYgKGpzb24gJiYganNvbi5tZXNzYWdlICE9PSAnTm90IEZvdW5kJykgcmV0dXJuIGpzb247XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVxdWVzdFJlcG9JbmZvKHVybE9yRnVsbE5hbWU6IHN0cmluZyk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgW29yZywgbmFtZV0gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUodXJsT3JGdWxsTmFtZSk7XG4gIGlmICghb3JnIHx8ICFuYW1lKSByZXR1cm47XG5cbiAgdHJ5IHtcbiAgICAvLyBNZXRhZGF0YSBwZXJtaXNzaW9uLiBUaGUgb3duZXIgTVVTVCBiZSBwYXNzZWQ6IGdldE9jdG9raXQoKSB3aXRob3V0IGl0IHByZWZlcnMgdGhlXG4gICAgLy8gV2lsbEJvb3N0ZXIgUEFULCB3aGljaCBjYW5ub3QgcmVhZCBwcml2YXRlIFdpbGxCb29zdGVyTGFiIHJlcG9zaXRvcmllcywgY29sbGFwc2luZyB0aGVpclxuICAgIC8vIHZpc2liaWxpdHkgdG8gdW5rbm93biAoYW5kIGUuZy4gc2tpcHBpbmcgdGhlIHdiZnkgY2FsbGVyIGdlbmVyYXRpb24gaW5kZWZpbml0ZWx5KS5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGdldE9jdG9raXQob3JnKS5yZXF1ZXN0KCdHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99Jywge1xuICAgICAgb3duZXI6IG9yZyxcbiAgICAgIHJlcG86IG5hbWUsXG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3BvbnNlLmRhdGE7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3QgcmVkaXJlY3RlZEZ1bGxOYW1lID0gZ2V0UmVkaXJlY3RlZFJlcG9GdWxsTmFtZShlcnJvcik7XG4gICAgaWYgKHJlZGlyZWN0ZWRGdWxsTmFtZSkge1xuICAgICAgLy8gUmUtZmV0Y2ggdW5kZXIgdGhlIHJlZGlyZWN0ZWQgaWRlbnRpdHkgc28gYSByZW5hbWVkIHJlcG9zaXRvcnkgc3RpbGwgZ2V0cyBjb21wbGV0ZVxuICAgICAgLy8gbWV0YWRhdGEgKHZpc2liaWxpdHkgaW5jbHVkZWQpIGluc3RlYWQgb2YgYSBiYXJlIGZ1bGxfbmFtZSB0aGF0IHdvdWxkIGxlYXZlXG4gICAgICAvLyBpc1JlcG9WaXNpYmlsaXR5S25vd24gZmFsc2Ugb24gZXZlcnkgc3Vic2VxdWVudCBydW4gd2l0aCB0aGUgc3RhbGUgcmVtb3RlIFVSTC5cbiAgICAgIGNvbnN0IFtyZWRpcmVjdGVkT3JnLCByZWRpcmVjdGVkTmFtZV0gPSByZWRpcmVjdGVkRnVsbE5hbWUuc3BsaXQoJy8nKTtcbiAgICAgIGlmIChyZWRpcmVjdGVkT3JnICYmIHJlZGlyZWN0ZWROYW1lKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBnZXRPY3Rva2l0KHJlZGlyZWN0ZWRPcmcpLnJlcXVlc3QoJ0dFVCAvcmVwb3Mve293bmVyfS97cmVwb30nLCB7XG4gICAgICAgICAgICBvd25lcjogcmVkaXJlY3RlZE9yZyxcbiAgICAgICAgICAgIHJlcG86IHJlZGlyZWN0ZWROYW1lLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiByZXNwb25zZS5kYXRhO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBGYWxsIGJhY2sgdG8gdGhlIGJhcmUgaWRlbnRpdHkgYmVsb3c6IHRoZSByZXBvc2l0b3J5IGlzIHN0aWxsIGNhbm9uaWNhbGl6ZWQsIG9ubHlcbiAgICAgICAgICAvLyBpdHMgdmlzaWJpbGl0eSBzdGF5cyB1bmtub3duLlxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4geyBmdWxsX25hbWU6IHJlZGlyZWN0ZWRGdWxsTmFtZSB9O1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRSZWRpcmVjdGVkUmVwb0Z1bGxOYW1lKGVycm9yOiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFlcnJvciB8fCB0eXBlb2YgZXJyb3IgIT09ICdvYmplY3QnKSByZXR1cm47XG5cbiAgY29uc3QgcmVzcG9uc2UgPVxuICAgICdyZXNwb25zZScgaW4gZXJyb3JcbiAgICAgID8gKGVycm9yIGFzIHsgcmVzcG9uc2U/OiB7IHN0YXR1cz86IG51bWJlcjsgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4gfSB9KS5yZXNwb25zZVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlPy5zdGF0dXMgPz8gKGVycm9yIGFzIHsgc3RhdHVzPzogbnVtYmVyIH0pLnN0YXR1cztcbiAgaWYgKHN0YXR1cyAhPT0gMzAxICYmIHN0YXR1cyAhPT0gMzAyKSByZXR1cm47XG5cbiAgY29uc3QgbG9jYXRpb24gPSByZXNwb25zZT8uaGVhZGVycz8ubG9jYXRpb247XG4gIGlmICh0eXBlb2YgbG9jYXRpb24gIT09ICdzdHJpbmcnKSByZXR1cm47XG5cbiAgY29uc3QgW29yZywgbmFtZV0gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUobG9jYXRpb24pO1xuICBpZiAoIW9yZyB8fCAhbmFtZSkgcmV0dXJuO1xuXG4gIHJldHVybiBgJHtvcmd9LyR7bmFtZX1gO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIGA8b3JnPi88bmFtZT5gIGZyb20gdGhlIGdpdCByZW1vdGUgKGZhbGxpbmcgYmFjayB0byBwYWNrYWdlLmpzb24ncyBgcmVwb3NpdG9yeWApIHdpdGhvdXRcbiAqIGNhbGxpbmcgdGhlIEdpdEh1YiBBUEkuIEl0IHdvcmtzIGZvciBldmVyeSB3b3Jrc3BhY2UgcGFja2FnZSwgbm90IGp1c3QgdGhlIHJvb3Qg4oCUIG9ubHkgdGhlIHJvb3RcbiAqIGZldGNoZXMgcmVwbyBpbmZvIOKAlCBhbmQgaXQga2VlcHMgd29ya2luZyBvZmZsaW5lIG9yIHJhdGUtbGltaXRlZCwgd2hlcmUgYW4gdW5kZWZpbmVkIGlkZW50aXR5XG4gKiB3b3VsZCBzaWxlbnRseSByZWNsYXNzaWZ5IHRoZSByZXBvc2l0b3J5IChlLmcuIG1ha2luZyB3YmZ5IHdyaXRlIHdpbGxib29zdGVyLWNvbmZpZ3MnIFJlbm92YXRlXG4gKiBwcmVzZXQgaW50byB0aGUgcHJlc2V0IGl0c2VsZiBhZ2FpbikuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVMb2NhbFJlcG9JZGVudGl0eShcbiAgZGlyUGF0aDogc3RyaW5nLFxuICBwYWNrYWdlSnNvbjogUGFja2FnZUpzb25cbik6IFByb21pc2U8W3N0cmluZyB8IHVuZGVmaW5lZCwgc3RyaW5nIHwgdW5kZWZpbmVkXT4ge1xuICBjb25zdCByZW1vdGVVcmwgPSBnZXRPcmlnaW5SZW1vdGVVcmwoZGlyUGF0aCk7XG4gIGlmIChyZW1vdGVVcmwpIHtcbiAgICBjb25zdCBpZGVudGl0eSA9IHJlYWRHaXRIdWJJZGVudGl0eShyZW1vdGVVcmwpO1xuICAgIGlmIChpZGVudGl0eSkgcmV0dXJuIGlkZW50aXR5O1xuICB9XG4gIGNvbnN0IHVybCA9IHR5cGVvZiBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5ID09PSAnc3RyaW5nJyA/IHBhY2thZ2VKc29uLnJlcG9zaXRvcnkgOiBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5Py51cmw7XG4gIGlmICh1cmwpIHtcbiAgICBjb25zdCBpZGVudGl0eSA9IHJlYWRHaXRIdWJJZGVudGl0eSh1cmwpO1xuICAgIGlmIChpZGVudGl0eSkgcmV0dXJuIGlkZW50aXR5O1xuICB9XG4gIHJldHVybiBbdW5kZWZpbmVkLCB1bmRlZmluZWRdO1xufVxuXG5mdW5jdGlvbiBnZXRPcmlnaW5SZW1vdGVVcmwoZGlyUGF0aDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHNwYXduU3luY0FuZFJldHVyblN0ZG91dCgnZ2l0JywgWydjb25maWcnLCAnLS1nZXQnLCAncmVtb3RlLm9yaWdpbi51cmwnXSwgZGlyUGF0aCkgfHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIGBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWVgIGlzIGhvc3QtYWdub3N0aWMsIHNvIGl0IGhhcHBpbHkgdHVybnMgYSBHaXRMYWIgVVJMIGludG8gYW4gYDxvcmc+LzxyZXBvPmAgcGFpci5cbiAqIEV2ZXJ5dGhpbmcgZG93bnN0cmVhbSB0cmVhdHMgdGhlIHJlc3VsdGluZyBpZGVudGl0eSBhcyBHaXRIdWIgKHRoZSBgZ2l0aHViOmAgcmVwb3NpdG9yeSBmaWVsZCBpcyByZXdyaXR0ZW5cbiAqIGludG8gcGFja2FnZS5qc29uKSwgc28gdGhlIGhvc3QgbXVzdCBiZSB2ZXJpZmllZCBmaXJzdDsgYSBub24tR2l0SHViIHJlbW90ZSB5aWVsZHMgbm8gaWRlbnRpdHksIGFzIGJlZm9yZS5cbiAqL1xuZnVuY3Rpb24gcmVhZEdpdEh1YklkZW50aXR5KHVybDogc3RyaW5nKTogW3N0cmluZywgc3RyaW5nXSB8IHVuZGVmaW5lZCB7XG4gIGlmICghdGFyZ2V0c0dpdEh1Yih1cmwpKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBbb3JnLCBuYW1lXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZSh1cmwpO1xuICByZXR1cm4gb3JnICYmIG5hbWUgPyBbY2Fub25pY2FsaXplT3duZXIob3JnKSwgbmFtZV0gOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgVVJMJ3MgSE9TVCBpcyBnaXRodWIuY29tLiBQYXJzZWQgcmF0aGVyIHRoYW4gc3Vic3RyaW5nLW1hdGNoZWQ6IGEgcGF0aCBzdWNoIGFzXG4gKiBgaHR0cHM6Ly9naXRsYWIuY29tL2dpdGh1Yi5jb20vb3duZXIvcmVwby5naXRgIHdvdWxkIG90aGVyd2lzZSBiZSB0YWtlbiBmb3IgR2l0SHViLCBhbmQgYW4gdXBwZXJjYXNlXG4gKiBgR0lUSFVCLkNPTWAgd291bGQgYmUgcmVqZWN0ZWQuIGBnaXRodWI6b3duZXIvcmVwb2AgaXMgbnBtJ3Mgc2hvcnRoYW5kIGFuZCBuYW1lcyBubyBob3N0LCBzbyBpdCBpc1xuICogcmVjb2duaXplZCBzZXBhcmF0ZWx5OyBub3JtYWxpemVSZXBvc2l0b3J5VXJsRm9yUGFja2FnZUpzb24gYWNjZXB0cyB0aGUgc2FtZSBzaG9ydGhhbmQuXG4gKi9cbmZ1bmN0aW9uIHRhcmdldHNHaXRIdWIodXJsOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKC9eZ2l0aHViOi9pdS50ZXN0KHVybCkpIHJldHVybiB0cnVlO1xuICAvLyBzY3Atc3R5bGUgcmVtb3RlcyAoYGdpdEBnaXRodWIuY29tOm93bmVyL3JlcG8uZ2l0YCkgYXJlIG5vdCB2YWxpZCBVUkxzLlxuICBjb25zdCBzY3BIb3N0ID0gL15bXi9AXSpAKFteOi9dKyk6L3UuZXhlYyh1cmwpPy5bMV07XG4gIGlmIChzY3BIb3N0KSByZXR1cm4gc2NwSG9zdC50b0xvd2VyQ2FzZSgpID09PSAnZ2l0aHViLmNvbSc7XG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBVUkwodXJsLnJlcGxhY2UoL15naXRcXCsvdSwgJycpKS5ob3N0bmFtZS50b0xvd2VyQ2FzZSgpID09PSAnZ2l0aHViLmNvbSc7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIEdpdEh1YiBvd25lciBuYW1lcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZSwgYW5kIGEgcmVtb3RlIG9yIG1hbmlmZXN0IFVSTCBtYXkgc3BlbGwgdGhlbSBhbnkgd2F5LCBidXQgdGhlIEFQSSdzXG4gKiBgZnVsbF9uYW1lYCBhbHdheXMgcmV0dXJuZWQgdGhlIGNhbm9uaWNhbCBzcGVsbGluZyDigJQgd2hpY2ggdGhlIG1hbnkgZXhhY3QgYD09PSAnV2lsbEJvb3N0ZXInYCBwb2xpY3kgY2hlY2tzXG4gKiAob3JnYW5pemF0aW9uIHdvcmtmbG93cywgYXV0aG9yIG1ldGFkYXRhLCB0aGUgV2lsbEJvb3N0ZXJMYWIgcHJlLXB1c2ggZ3VhcmQpIGRlcGVuZCBvbi4gQ2Fub25pY2FsaXplIGhlcmUgc29cbiAqIHRoZSBsb2NhbCBmYWxsYmFjayB5aWVsZHMgdGhlIHNhbWUgaWRlbnRpdHkgdGhlIEFQSSBkaWQsIGluc3RlYWQgb2Ygc2lsZW50bHkgc2tpcHBpbmcgdGhvc2UgcG9saWNpZXMuXG4gKi9cbmZ1bmN0aW9uIGNhbm9uaWNhbGl6ZU93bmVyKG93bmVyOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBjYW5vbmljYWxPd25lcnMgPSBbJ1dpbGxCb29zdGVyJywgJ1dpbGxCb29zdGVyTGFiJ107XG4gIHJldHVybiBjYW5vbmljYWxPd25lcnMuZmluZCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUudG9Mb3dlckNhc2UoKSA9PT0gb3duZXIudG9Mb3dlckNhc2UoKSkgPz8gb3duZXI7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBJU1NVRV9URU1QTEFURV9SVUxFUywgUFVMTF9SRVFVRVNUX0JPRFlfUlVMRVMsIFRFU1RfV1JJVElOR19SVUxFUyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliL3NyYyc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlc1dvcmtlclR5cGVzIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBoYXNDbG91ZGZsYXJlRGVwbG95V29ya2Zsb3csIGludm9rZXNXYkRlcGxveSB9IGZyb20gJy4vd29ya2Zsb3cuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucyhyb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLCBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghcm9vdENvbmZpZy5pc1Jvb3QpIHJldHVybjtcblxuICAgIGNvbnN0IGV4dHJhQ29udGVudCA9IGF3YWl0IHJlYWRBZ2VudHNFeHRyYUNvbnRlbnQocm9vdENvbmZpZy5kaXJQYXRoKTtcblxuICAgIGZvciAoY29uc3QgW2ZpbGVOYW1lLCB0b29sTmFtZV0gb2YgW1xuICAgICAgWydBR0VOVFMubWQnLCAnQ29kZXggQ0xJJ10sXG4gICAgICBbJ0NMQVVERS5tZCcsICdDbGF1ZGUgQ29kZSddLFxuICAgICAgWydHRU1JTkkubWQnLCAnR2VtaW5pIENMSSddLFxuICAgIF0gYXMgY29uc3QpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb24ocm9vdENvbmZpZywgYWxsQ29uZmlncywgdG9vbE5hbWUsIGV4dHJhQ29udGVudCk7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsIGZpbGVOYW1lKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb250ZW50KSk7XG4gICAgfVxuXG4gICAgY29uc3QgY3Vyc29yUnVsZXNQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5jdXJzb3IvcnVsZXMvZ2VuZXJhbC5tZGMnKTtcbiAgICBjb25zdCBjdXJzb3JSdWxlc0NvbnRlbnQgPSBnZW5lcmF0ZUN1cnNvckdlbmVyYWxNZGNDb250ZW50KHJvb3RDb25maWcsIGFsbENvbmZpZ3MsIGV4dHJhQ29udGVudCk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoY3Vyc29yUnVsZXNQYXRoLCBjdXJzb3JSdWxlc0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmNvbnN0IGFnZW50c0V4dHJhQ29udGVudENhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4oKTtcblxuLyoqXG4gKiBSZWFkcyB0aGUgcm9vdCdzIHVzZXItYXV0aG9yZWQgQUdFTlRTX0VYVFJBLm1kIG9uY2UgcGVyIHByb2Nlc3M6IHdiZnkgbmV2ZXIgcmV3cml0ZXMgdGhlIGZpbGUsXG4gKiBhbmQgYm90aCB0aGUgYWdlbnQtaW5zdHJ1Y3Rpb24gYW5kIEdlbWluaSBnZW5lcmF0b3JzIG5lZWQgaXRzIGNvbnRlbnQuIENhY2hpbmcgdGhlIHJlc29sdmVkXG4gKiB2YWx1ZSAobm90IHRoZSBQcm9taXNlKSBpcyByYWNlLWZyZWUgYmVjYXVzZSB0aGUgdHdvIGNhbGxlcnMgcnVuIHNlcXVlbnRpYWxseSBpbiBpbmRleC50cy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRBZ2VudHNFeHRyYUNvbnRlbnQocm9vdERpclBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGFnZW50c0V4dHJhUGF0aCA9IHBhdGgucmVzb2x2ZShyb290RGlyUGF0aCwgJ0FHRU5UU19FWFRSQS5tZCcpO1xuICBpZiAoIWFnZW50c0V4dHJhQ29udGVudENhY2hlLmhhcyhhZ2VudHNFeHRyYVBhdGgpKSB7XG4gICAgYWdlbnRzRXh0cmFDb250ZW50Q2FjaGUuc2V0KGFnZW50c0V4dHJhUGF0aCwgYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoYWdlbnRzRXh0cmFQYXRoKSk7XG4gIH1cbiAgcmV0dXJuIGFnZW50c0V4dHJhQ29udGVudENhY2hlLmdldChhZ2VudHNFeHRyYVBhdGgpO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUN1cnNvckdlbmVyYWxNZGNDb250ZW50KFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSxcbiAgZXh0cmFDb250ZW50Pzogc3RyaW5nXG4pOiBzdHJpbmcge1xuICBjb25zdCBmcm9udG1hdHRlciA9IGAtLS1cXG5kZXNjcmlwdGlvbjogR2VuZXJhbCBDb2RpbmcgUnVsZXNcXG5nbG9iczpcXG5hbHdheXNBcHBseTogdHJ1ZVxcbi0tLWA7XG4gIGNvbnN0IGJvZHkgPSBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb24oY29uZmlnLCBhbGxDb25maWdzLCAnQ3Vyc29yJywgZXh0cmFDb250ZW50KTtcbiAgcmV0dXJuIGAke2Zyb250bWF0dGVyfVxcblxcbiR7Ym9keX1gO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb24oXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSxcbiAgdG9vbE5hbWU6IHN0cmluZyxcbiAgZXh0cmFDb250ZW50Pzogc3RyaW5nXG4pOiBzdHJpbmcge1xuICBjb25zdCBwYWNrYWdlTWFuYWdlciA9ICdidW4nO1xuICBjb25zdCBkZXNjcmlwdGlvbiA9IHJvb3RDb25maWcucGFja2FnZUpzb24/LmRlc2NyaXB0aW9uO1xuICBjb25zdCBmbm94SW5zdHJ1Y3Rpb24gPSBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICdmbm94LnRvbWwnKSlcbiAgICA/IGBcXG4tIEVudmlyb25tZW50IHZhcmlhYmxlcyBhbmQgc2VjcmV0cyBsaXZlIGluIFxcYGZub3gudG9tbFxcYCAobWlzZSArIGZub3gpOyBuZXZlciBjcmVhdGUgXFxgLmVudlxcYCwgXFxgLmVudi4qXFxgLCBvciBcXGAuZGV2LnZhcnNcXGAgZmlsZXMuIFJ1biBjb21tYW5kcyB0aHJvdWdoIFxcYCR7cGFja2FnZU1hbmFnZXJ9IHdiIC4uLlxcYCBvciBcXGBmbm94IHJ1biAtUCA8cHJvZmlsZT4gLS0gPGNvbW1hbmQ+XFxgLiBQcm9maWxlIHNlY3JldHMgbG9hZCBvbmx5IHdoZW4gYSBwcm9maWxlIGlzIHNlbGVjdGVkOiBtb2RlLWF3YXJlIHdiIGNvbW1hbmRzIChlLmcuIFxcYHdiIHN0YXJ0XFxgLCBcXGB3YiB0ZXN0XFxgKSBhbmQgXFxgd2IgZG90ZW52XFxgIHNlbGVjdCBpdCB0aGVtc2VsdmVzIChcXGB3YiBkb3RlbnZcXGAgdXNlcyBcXGBXQl9FTlZcXGAsIGVsc2UgXFxgRk5PWF9QUk9GSUxFXFxgLCBlbHNlIFxcYE5PREVfRU5WXFxgLCBlbHNlIHRoZSBkZXZlbG9wbWVudCBwcm9maWxlOyBcXGBXQl9FTlZcXGAgYWNjZXB0cyBvbmx5IFxcYGRldmVsb3BtZW50XFxgL1xcYHRlc3RcXGAvXFxgc3RhZ2luZ1xcYC9cXGBwcm9kdWN0aW9uXFxgLCBzbyB1c2UgXFxgRk5PWF9QUk9GSUxFXFxgIGZvciBhbnkgb3RoZXIgcHJvZmlsZSksIHdoaWxlIGJhcmUgXFxgZm5veCBydW5cXGAgbmVlZHMgYW4gZXhwbGljaXQgXFxgLVAgPHByb2ZpbGU+XFxgLmBcbiAgICA6ICcnO1xuICAvLyBtaXNlIG93bnMgdGhlIHBpbm5lZCB0b29sIHZlcnNpb25zLCBzbyBhIHZlcnNpb24gbWlzbWF0Y2ggaXMgZml4ZWQgYnkgZWRpdGluZyBtaXNlLnRvbWwg4oCUIG5vdFxuICAvLyBieSBpbnN0YWxsaW5nIGEgZGlmZmVyZW50IHZlcnNpb24gZ2xvYmFsbHksIHdoaWNoIHRoZSBuZXh0IGBtaXNlIGluc3RhbGxgIHNpbGVudGx5IG92ZXJyaWRlcy5cbiAgY29uc3QgbWlzZUluc3RydWN0aW9uID0gZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnbWlzZS50b21sJykpXG4gICAgPyAnXFxuLSBUb29sIHZlcnNpb25zIChlLmcuLCBub2RlKSBhcmUgcGlubmVkIGluIGBtaXNlLnRvbWxgOyBydW4gYG1pc2UgaW5zdGFsbGAgYWZ0ZXIgY2hhbmdpbmcgaXQgYW5kIG5ldmVyIGluc3RhbGwgdGhvc2UgdG9vbHMgZ2xvYmFsbHkgaW5zdGVhZC4nXG4gICAgOiAnJztcbiAgLy8gSXNvbGF0ZWQgaW5zdGFsbHMgYXJlIHRoZSBvcmcgc3RhbmRhcmQgKHdiZnkgZ2VuZXJhdGVzIG5vIG90aGVyIGxpbmtlcikgYW5kIHRoZSBtb3N0XG4gIC8vIGFnZW50LWhvc3RpbGUgcGFydCBvZiB0aGUgc3RhY2s6IGEgcGFja2FnZSB0aGF0IGlzIG9ubHkgcmVhY2hhYmxlIGJlY2F1c2UgYSBkZXBlbmRlbmN5IGhvaXN0ZWRcbiAgLy8gaXQgbm8gbG9uZ2VyIHJlc29sdmVzLCBhbmQgdGhlIHJlZmxleCBmaXggKHN3aXRjaGluZyB0aGUgbGlua2VyIGJhY2spIHNpbGVudGx5IHJlaW50cm9kdWNlc1xuICAvLyB0aGUgcGhhbnRvbSBkZXBlbmRlbmNpZXMgdGhlIGxheW91dCBleGlzdHMgdG8gY2F0Y2guXG4gIGNvbnN0IGlzb2xhdGVkSW5zdGFsbEluc3RydWN0aW9uID0gYFxcbi0gXFxgYnVuZmlnLnRvbWxcXGAgdXNlcyBCdW4ncyBpc29sYXRlZCBsaW5rZXIsIHNvIG9ubHkgZGVjbGFyZWQgZGVwZW5kZW5jaWVzIHJlc29sdmUuIElmIGFuIGltcG9ydCBmYWlscyB0byByZXNvbHZlLCBkZWNsYXJlIHRoYXQgcGFja2FnZSBpbiB0aGUgXFxgcGFja2FnZS5qc29uXFxgIHRoYXQgaW1wb3J0cyBpdDsgbmV2ZXIgc3dpdGNoIFxcYGxpbmtlclxcYCB0byBcXGBob2lzdGVkXFxgIG9yIGFkZCB0byBcXGBwdWJsaWNIb2lzdFBhdHRlcm5cXGAgdG8gd29yayBhcm91bmQgaXQuYDtcbiAgLy8gRXZlcnkgY2xhdXNlIHN0YXRlcyBvbmx5IGEgdmVyaWZpZWQgZmFjdCwgcmV1c2luZyB0aGUgd29ya2Zsb3cgZ2VuZXJhdG9yJ3Mgb3duIGRldGVjdG9yczogdGhlXG4gIC8vIHdyYW5nbGVyLWNvbmZpZyBjbGF1c2UgbmVlZHMgYW4gYWN0dWFsIGNvbmZpZyBmaWxlIChpc0Nsb3VkZmxhcmUgYWxzbyBtYXRjaGVzIGEgbWVyZSB3cmFuZ2xlclxuICAvLyBtZW50aW9uIGluIGEgc2NyaXB0IG9yIHdvcmtmbG93KSwgdGhlIHdvcmtmbG93IGNsYXVzZSBuZWVkcyBhIGxpdmUgcmV1c2FibGUtZGVwbG95IGNhbGxlclxuICAvLyAoWUFNTC1wYXJzZWQgam9icy4qLnVzZXMsIG5vdCBhIHJhdy10ZXh0L2NvbW1lbnQgbWF0Y2gpLCBhbmQgdGhlIGB3YiBkZXBsb3lgIGNsYXVzZSBuZWVkcyBhXG4gIC8vIGRlcGxveSBzY3JpcHQgd2hvc2UgY29tbWFuZCB0b2tlbiBpcyBgd2Ig4oCmIGRlcGxveWAuXG4gIGNvbnN0IG93bnNXcmFuZ2xlckNvbmZpZyA9IGFsbENvbmZpZ3Muc29tZSgoY29uZmlnKSA9PiBjb25maWcuZG9lc0NvbnRhaW5XcmFuZ2xlckNvbmZpZyk7XG4gIC8vIE9ubHkgY2xhaW0gdGhlIGZpbGUgaXMgZ2VuZXJhdGVkIHdoZXJlIGl0IGFjdHVhbGx5IGlzOiBhIHBhY2thZ2UgdGhhdCBoYW5kLW1haW50YWlucyBpdHMgYEVudmAgKGUuZy4gdW5kZXJcbiAgLy8gYHR5cGVzOiBbXCJidW5cIl1gKSBpcyBkZWxpYmVyYXRlbHkgbGVmdCB1bm1hbmFnZWQsIGFuZCB0ZWxsaW5nIGFuIGFnZW50IHRvIHJ1biBgd2IgZ2VuLWNvZGVgIHRoZXJlIHdvdWxkIHNlbmRcbiAgLy8gaXQgYWZ0ZXIgYSBmaWxlIHRoYXQgbmV2ZXIgYXBwZWFycyDigJQgYW5kIGF3YXkgZnJvbSB0aGUgYEVudmAgaXQgc2hvdWxkIGJlIGVkaXRpbmcuXG4gIGNvbnN0IG93bnNHZW5lcmF0ZWRXb3JrZXJUeXBlcyA9IGFsbENvbmZpZ3Muc29tZSgoY29uZmlnKSA9PiBnZW5lcmF0ZXNXb3JrZXJUeXBlcyhjb25maWcpKTtcbiAgY29uc3QgaGFzRGVwbG95V29ya2Zsb3cgPSBoYXNDbG91ZGZsYXJlRGVwbG95V29ya2Zsb3cocGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5naXRodWIvd29ya2Zsb3dzJykpO1xuICBjb25zdCB1c2VzV2JEZXBsb3kgPSBhbGxDb25maWdzLnNvbWUoKGNvbmZpZykgPT4ge1xuICAgIGNvbnN0IGRlcGxveVNjcmlwdCA9IGNvbmZpZy5wYWNrYWdlSnNvbj8uc2NyaXB0cz8uWydkZXBsb3knXTtcbiAgICByZXR1cm4gKFxuICAgICAgdHlwZW9mIGRlcGxveVNjcmlwdCA9PT0gJ3N0cmluZycgJiZcbiAgICAgIGludm9rZXNXYkRlcGxveShkZXBsb3lTY3JpcHQsIG5ldyBTZXQoT2JqZWN0LmtleXMoY29uZmlnLnBhY2thZ2VKc29uPy5zY3JpcHRzID8/IHt9KSkpXG4gICAgKTtcbiAgfSk7XG4gIC8vIEluZGVwZW5kZW50IGZhY3RzIHN0YXkgc2VwYXJhdGUgc2VudGVuY2VzOiB0aGUgd29ya2Zsb3cncyBvd24gZGVwbG95IG1lY2hhbmlzbSBpcyBub3RcbiAgLy8gaW5zcGVjdGVkLCBzbyB0aGUgd2ItZGVwbG95IGNsYXVzZSBtdXN0IG5vdCBjbGFpbSB0aGUgd29ya2Zsb3cgaW52b2tlcyBpdC5cbiAgY29uc3QgY2xvdWRmbGFyZUluc3RydWN0aW9uID0gb3duc1dyYW5nbGVyQ29uZmlnXG4gICAgPyBgXFxuLSBUaGlzIHByb2plY3QgcnVucyBvbiBDbG91ZGZsYXJlIFdvcmtlcnM6IHRoZSB3cmFuZ2xlciBjb25maWd1cmF0aW9uIGZpbGUgaG9sZHMgdGhlIFdvcmtlcidzIGNvbmZpZ3VyYXRpb24sIGluY2x1ZGluZyBiaW5kaW5ncyBhbmQgcGVyLWVudmlyb25tZW50IG92ZXJyaWRlcy4ke2hhc0RlcGxveVdvcmtmbG93ID8gJyBUaGUgZGVwbG95IHdvcmtmbG93cyB1bmRlciBgLmdpdGh1Yi93b3JrZmxvd3NgIHBlcmZvcm0gZGVwbG95bWVudHMuJyA6ICcnfSR7dXNlc1diRGVwbG95ID8gJyBUaGUgYGRlcGxveWAgcGFja2FnZSBzY3JpcHQgcnVucyBgd2IgZGVwbG95YC4nIDogJyd9JHtvd25zR2VuZXJhdGVkV29ya2VyVHlwZXMgPyBgXFxuLSBcXGB3b3JrZXItY29uZmlndXJhdGlvbi5kLnRzXFxgIGlzIGdpdGlnbm9yZWQgYW5kIGdlbmVyYXRlZCBieSBcXGAke3BhY2thZ2VNYW5hZ2VyfSB3YiBnZW4tY29kZVxcYDsgYWZ0ZXIgY2hhbmdpbmcgYmluZGluZ3Mgb3IgdmFycyBpbiB0aGUgd3JhbmdsZXIgY29uZmlndXJhdGlvbiwgcmUtcnVuIGl0IGluc3RlYWQgb2YgZWRpdGluZyB0aGUgZmlsZSBieSBoYW5kLmAgOiAnJ31gXG4gICAgOiAnJztcbiAgLy8gV2lsbEJvb3N0ZXIgUmFpbHdheSBwcm9qZWN0IGlkZW50aWZpZXJzIGFyZSBtYW5hZ2VkIGluIGRlcGxveSB3b3JrZmxvdyBzZXR0aW5ncy5cbiAgY29uc3QgcmFpbHdheUluc3RydWN0aW9uID0gcm9vdENvbmZpZy5pc1JhaWx3YXlcbiAgICA/ICdcXG4tIFJhaWx3YXkgcHJvamVjdCBpbmZvcm1hdGlvbiBpcyBpbiB0aGUgZGVwbG95IHdvcmtmbG93cyB1bmRlciBgLmdpdGh1Yi93b3JrZmxvd3NgLidcbiAgICA6ICcnO1xuICBjb25zdCBwbGF5d3JpZ2h0VGVzdFNlcnZlckluc3RydWN0aW9uID0gaGFzUGxheXdyaWdodFRlc3RTZXJ2ZXIoYWxsQ29uZmlncylcbiAgICA/IGBcXG4tIFVzZSBcXGAke3BhY2thZ2VNYW5hZ2VyfSB3YiBzdGFydCAtLW1vZGUgdGVzdFxcYCB0byBsYXVuY2ggYSB3ZWIgc2VydmVyIGZvciBkZWJ1Z2dpbmcgb3IgdGVzdGluZy5gXG4gICAgOiAnJztcbiAgY29uc3QgY29BdXRob3JJbnN0cnVjdGlvbiA9IHJvb3RDb25maWcuaXNXaWxsQm9vc3RlclJlcG9cbiAgICA/IGBcXG4gIC0gRW5kIHlvdXIgY29tbWl0IG1lc3NhZ2Ugd2l0aCBhIGJsYW5rIGxpbmUgZm9sbG93ZWQgYnkgXFxgQ28tYXV0aG9yZWQtYnk6IFdpbGxCb29zdGVyICgke3Rvb2xOYW1lfSkgPGFnZW50QHdpbGxib29zdGVyLmNvbT5cXGAsIHRoZSBvbmx5IEFJIGF0dHJpYnV0aW9uIHRvIGFkZC5gXG4gICAgOiAnJztcbiAgLy8gS2V5ZWQgb24gdGhlIHJlcG9zaXRvcnkgY2xhc3NpZmljYXRpb24gcmF0aGVyIHRoYW4gb24gdGhlIHRlbXBsYXRlIGZpbGVzJyBwcmVzZW5jZTogdGhlIHNhbWVcbiAgLy8gcnVuIHdyaXRlcyB0aGUgdGVtcGxhdGVzIGZvciBXaWxsQm9vc3RlciAvIFdpbGxCb29zdGVyTGFiIHJlcG9zaXRvcmllcyBiZWZvcmUgdGhpcyBnZW5lcmF0b3JcbiAgLy8gcnVucywgYW5kIGhhbmQtYWRkZWQgdGVtcGxhdGVzIGVsc2V3aGVyZSBiZWxvbmcgdG8gQUdFTlRTX0VYVFJBLm1kLlxuICBjb25zdCBwclRlbXBsYXRlSW5zdHJ1Y3Rpb24gPSByb290Q29uZmlnLmlzV2lsbEJvb3N0ZXJSZXBvXG4gICAgPyBgXFxuJHtQVUxMX1JFUVVFU1RfQk9EWV9SVUxFUy5yZXBsYWNlQWxsKC9eL2dtLCAnICAnKX1gXG4gICAgOiAnJztcbiAgLy8gR2F0ZWQgbGlrZSBwclRlbXBsYXRlSW5zdHJ1Y3Rpb246IHRoZSBzZWN0aW9uIGl0IG5hbWVzIGV4aXN0cyBvbmx5IHdoZXJlIHRoZSB0ZW1wbGF0ZSBpcyBnZW5lcmF0ZWQuXG4gIGNvbnN0IHJlcXVpcmVtZW50c0V4ZW1wdGlvbiA9IHJvb3RDb25maWcuaXNXaWxsQm9vc3RlclJlcG9cbiAgICA/IFwiIG90aGVyIHRoYW4gdGhlIFBSIGJvZHkncyBSZXF1aXJlbWVudHMgc2VjdGlvbiAod2hpY2ggc3RhdGVzIHdoYXQgaXMgY3VycmVudGx5IGFza2VkIGZvciByYXRoZXIgdGhhbiB3aGF0IHRoZSBjb2RlIGNvbnRhaW5zKVwiXG4gICAgOiAnJztcbiAgY29uc3QgaXNzdWVUZW1wbGF0ZUluc3RydWN0aW9uID0gcm9vdENvbmZpZy5pc1dpbGxCb29zdGVyUmVwb1xuICAgID8gYFxcbi0gV2hlbiBjcmVhdGluZyBhbiBpc3N1ZTpcXG4ke0lTU1VFX1RFTVBMQVRFX1JVTEVTLnJlcGxhY2VBbGwoL14vZ20sICcgICcpfWBcbiAgICA6ICcnO1xuICBjb25zdCBsYW5ndWFnZUluc3RydWN0aW9uID1cbiAgICBnZXREZWZhdWx0UHJvc2VMYW5ndWFnZShyb290Q29uZmlnKSA9PT0gJ0phcGFuZXNlJ1xuICAgICAgPyAnXFxuLSBVbmxlc3MgaW5zdHJ1Y3RlZCBvdGhlcndpc2UsIHdyaXRlIGlzc3VlcywgUFJzLCByZXZpZXcgY29tbWVudHMsIGFuZCBkb2N1bWVudGF0aW9uIGZvciBwZW9wbGUgKFJFQURNRSwgYGRvY3MvYCkgaW4gSmFwYW5lc2UsIGFuZCBldmVyeSBvdGhlciBhcnRpZmFjdCAoaW5jbHVkaW5nIGNvZGUgY29tbWVudHMsIEpTRG9jLCBhbmQgYWdlbnQgaW5zdHJ1Y3Rpb25zKSBleGNlcHQgeW91ciBjb252ZXJzYXRpb25hbCByZXBsaWVzIGFuZCBwcm9kdWN0LWZhY2luZyB0ZXh0IGluIEVuZ2xpc2guJ1xuICAgICAgOiAnXFxuLSBVbmxlc3MgaW5zdHJ1Y3RlZCBvdGhlcndpc2UsIHdyaXRlIGV2ZXJ5IGFydGlmYWN0IGV4Y2VwdCB5b3VyIGNvbnZlcnNhdGlvbmFsIHJlcGxpZXMgYW5kIHByb2R1Y3QtZmFjaW5nIHRleHQgaW4gRW5nbGlzaC4nO1xuICBjb25zdCBydW5uZXJJbnN0cnVjdGlvbiA9IHJvb3RDb25maWcuaXNXaWxsQm9vc3RlclJlcG9cbiAgICA/ICdcXG4tIFByaXZhdGUgcmVwb3NpdG9yaWVzIHVzZSBzZWxmLWhvc3RlZCBDSSBydW5uZXJzLiBLZWVwIE9TL3NpemUgY29uc3RyYWludHMgaW4gYW4gZXhwbGljaXQgc2VsZi1ob3N0ZWQgbGFiZWwgYXJyYXk7IGZpeCBtaXNzaW5nIHJ1bm5lciBjYXBhYmlsaXRpZXMgaW5zdGVhZCBvZiBzd2l0Y2hpbmcgdG8gR2l0SHViLWhvc3RlZCBydW5uZXJzLiBUaGUgc29sZSBhcHByb3ZlZCBleGNlcHRpb24gaXMgdGhlIFdpbmRvd3MgZGVza3RvcCBidWlsZCBpbiBXaWxsQm9vc3Rlci9jaGVlcmxpbmdzLidcbiAgICA6ICcnO1xuICBjb25zdCBwcm9qZWN0TmFtZSA9IHJvb3RDb25maWcucGFja2FnZUpzb24/Lm5hbWUgfHwgcGF0aC5iYXNlbmFtZShwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoKSk7XG4gIGNvbnN0IGJhc2VDb250ZW50ID0gYFxuIyMgUHJvamVjdCBJbmZvcm1hdGlvblxuXG4tIE5hbWU6IFxcYCR7cHJvamVjdE5hbWV9XFxgJHtkZXNjcmlwdGlvbiA/IGBcXG4tIERlc2NyaXB0aW9uOiAke2Rlc2NyaXB0aW9ufWAgOiAnJ31cbi0gUGFja2FnZSBNYW5hZ2VyOiAke3BhY2thZ2VNYW5hZ2VyfVxuXG4jIyBHZW5lcmFsIEluc3RydWN0aW9uc1xuXG4tIElmIG9uIFxcYG1haW5cXGAsIGNyZWF0ZSBhIG5ldyBicmFuY2g7IG90aGVyd2lzZSB3b3JrIG9uIHRoZSBjdXJyZW50IGJyYW5jaC5cbi0gUnVuIFxcYGdpdFxcYCBjb21tYW5kcyBvbmUgYXQgYSB0aW1lIHRvIGF2b2lkIFxcYGluZGV4LmxvY2tcXGAgY29uZmxpY3RzLiR7bGFuZ3VhZ2VJbnN0cnVjdGlvbn1cbiR7VEVTVF9XUklUSU5HX1JVTEVTfVxuLSBXaGVuIGZpeGluZyBpc3N1ZXMgKGluY2x1ZGluZyB0ZXN0IGZhaWx1cmVzKSwgaW52ZXN0aWdhdGUgdGhlIHJvb3QgY2F1c2UgZmlyc3QgKGUuZy4sIHZpYSBkZWJ1ZyBsb2dzIG9yIHNjcmVlbnNob3RzKSBhbmQgZml4IGl0IGluc3RlYWQgb2YgYXBwbHlpbmcgd29ya2Fyb3VuZHMuXG4tIEFmdGVyIG1ha2luZyBjaGFuZ2VzLCBydW4gXFxgJHtwYWNrYWdlTWFuYWdlcn0gcnVuIHZlcmlmeVxcYCAodHlwZSBjaGVja2luZyBhbmQgbGludGluZzsgdXAgdG8gMTAgbWludXRlcyksIG9yIFxcYCR7cGFja2FnZU1hbmFnZXJ9IHJ1biB2ZXJpZnktZnVsbFxcYCAoYWxsIHRlc3RzOyB1cCB0byAxIGhvdXIpIGlmIHlvdSBjaGFuZ2VkIHJ1bnRpbWUgYmVoYXZpb3Igb3IgdGVzdHMuIEZpeCBlcnJvcnMgYW5kIHJlLXJ1biB1bnRpbCBpdCBwYXNzZXMuXG4gIC0gV2FpdCBmb3IgaXQgdG8gZmluaXNoIHdpdGhvdXQgcmVzdGFydGluZyBpdDogcHJlZmVyIGNvbXBsZXRpb24gbm90aWZpY2F0aW9ucywgb3RoZXJ3aXNlIHRoZSBsb25nZXN0IHBlcm1pdHRlZCB3YWl0OyBubyBvdXRwdXQgZG9lcyBub3QgbWVhbiBpdCBoYXMgc3RvcHBlZC4gSWYgdGhlIGRpc3BsYXllZCBleGNlcnB0IGlzIGluc3VmZmljaWVudCwgcmVhZCB0aGUgaW5kaWNhdGVkIGxvZyBmaWxlIGJlZm9yZSByZXJ1bm5pbmcuIElmIHRoZSBlbnZpcm9ubWVudCBraWxscyBsb25nLXJ1bm5pbmcgY29tbWFuZHMsIHJ1biB0aGVtIGRldGFjaGVkIHdpdGggYSBzYXZlZCBsb2cgYW5kIGV4aXQgc3RhdHVzLlxuLSBPbmNlIHZlcmlmaWVkLCBjb21taXQgYW5kIHB1c2ggdG8gdGhlIGN1cnJlbnQgKG5vbi1tYWluKSBicmFuY2gsIGFuZCBjcmVhdGUgYSBQUiB2aWEgXFxgZ2hcXGAgaWYgbm9uZSBleGlzdHMgZm9yIHRoZSBicmFuY2guXG4gIC0gRm9sbG93IHRoZSBDb252ZW50aW9uYWwgQ29tbWl0cyBmb3JtYXQgKGUuZy4sIFxcYGZlYXQ6XFxgLCBcXGBmaXg6XFxgKS4ke2NvQXV0aG9ySW5zdHJ1Y3Rpb259XG4gIC0gQWx3YXlzIGNyZWF0ZSBuZXcgY29tbWl0czsgYXZvaWQgXFxgLS1hbWVuZFxcYC4ke3ByVGVtcGxhdGVJbnN0cnVjdGlvbn0ke2lzc3VlVGVtcGxhdGVJbnN0cnVjdGlvbn1cbi0gSW4gYW55IGV4cGxhbmF0b3J5IHRleHQgKGNvbW1pdCBtZXNzYWdlcywgUFIgZGVzY3JpcHRpb25zLCBkb2N1bWVudGF0aW9uLCBjb2RlIGNvbW1lbnRzLCBldGMuKSR7cmVxdWlyZW1lbnRzRXhlbXB0aW9ufSwgZGVzY3JpYmUgb25seSB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbjogZHJvcCBhbnkgc3RhdGVtZW50IG5hbWluZyBhbiBpZGVudGlmaWVyLCBmZWF0dXJlLCBvciBjb25jZXB0IHlvdSBjYW5ub3QgY29uZmlybSBleGlzdHMgaW4gdGhlIGZpbmFsIGRpZmYgb3IgdGhlIGN1cnJlbnQgY29kZWJhc2UgKGUuZy4sIG9uZSBhZGRlZCBhbmQgbGF0ZXIgcmVtb3ZlZCBvciByZW5hbWVkIGFsb25nIHRoZSB3YXkpLiBXaGVuZXZlciBkb2N1bWVudGF0aW9uIG9yIGNvbW1lbnRzIG5vIGxvbmdlciBtYXRjaCB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiAocmVtb3ZlZCBvcHRpb25zLCBkZXByZWNhdGVkIHVzYWdlLCBvdXRkYXRlZCBiZWhhdmlvciksIGRlbGV0ZSBvciByZXdyaXRlIHRoZW0sIGV2ZW4gaW4gZmlsZXMgeW91IGFyZSBub3Qgb3RoZXJ3aXNlIGNoYW5naW5nLiBNZW50aW9uIGEgcGFzdCBzdGF0ZSBvbmx5IHdoZXJlIGl0IGlzIG5lZWRlZCB0byB1bmRlcnN0YW5kIHdoeSB0aGUgY3VycmVudCBkZXNpZ24gaXMgYXMgaXQgaXMsIG9yIHdoZW4gZXhwbGljaXRseSBhc2tlZDsgZmlsZXMgdGhhdCByZWNvcmQgaGlzdG9yeSBieSBkZXNpZ24gKGUuZy4sIGEgY2hhbmdlbG9nKSBhcmUgZXhlbXB0LlxuLSBVc2UgaGVyZWRvYyBmb3IgbXVsdGktbGluZSBjb21tYW5kIGlucHV0IChlLmcuLCBcXGBnaXQgY29tbWl0IC1GIC1cXGAsIFxcYGdoIHByIGNyZWF0ZSAtLWJvZHktZmlsZSAtXFxgLCBcXGBnaCBpc3N1ZSBjcmVhdGUgLS1ib2R5LWZpbGUgLVxcYCkuXG4tIFB1dCB0ZW1wb3JhcnkgZmlsZXMgaW4gXFxgLnRtcFxcYDsgdXNlIFxcYC90bXBcXGAgb25seSBmb3IgZmlsZXMgdGhhdCBtdXN0IGxpdmUgb3V0c2lkZSB0aGUgcmVwby5cbi0gXFxgQUdFTlRTLm1kXFxgLCBcXGBDTEFVREUubWRcXGAsIFxcYEdFTUlOSS5tZFxcYCwgXFxgLmN1cnNvci9ydWxlcy9nZW5lcmFsLm1kY1xcYCwgYW5kIFxcYC5nZW1pbmkvc3R5bGVndWlkZS5tZFxcYCBhcmUgZ2VuZXJhdGVkIGZyb20gXFxgQUdFTlRTX0VYVFJBLm1kXFxgIGFuZCBvdmVyd3JpdHRlbiBvbiBldmVyeSBcXGB3YmZ5XFxgIHJ1bjsgdG8gY2hhbmdlIGFnZW50IGluc3RydWN0aW9ucywgZWRpdCBvbmx5IFxcYEFHRU5UU19FWFRSQS5tZFxcYC4ke21pc2VJbnN0cnVjdGlvbn0ke2lzb2xhdGVkSW5zdGFsbEluc3RydWN0aW9ufSR7Zm5veEluc3RydWN0aW9ufSR7Y2xvdWRmbGFyZUluc3RydWN0aW9ufSR7cmFpbHdheUluc3RydWN0aW9ufSR7cGxheXdyaWdodFRlc3RTZXJ2ZXJJbnN0cnVjdGlvbn0ke3J1bm5lckluc3RydWN0aW9ufVxuXG4ke2dlbmVyYXRlQWdlbnRDb2RpbmdTdHlsZShyb290Q29uZmlnLCBhbGxDb25maWdzKX1cbmBcbiAgICAucmVwbGFjZUFsbCgvXFwuXFxuXFxuKy0vZywgJy5cXG4tJylcbiAgICAucmVwbGFjZUFsbCgvXFxuezMsfS9nLCAnXFxuXFxuJylcbiAgICAudHJpbSgpO1xuXG4gIGNvbnN0IGhhc05ld1NlY3Rpb24gPSBleHRyYUNvbnRlbnQ/LnRyaW0oKS5zdGFydHNXaXRoKCcjJyk7XG4gIGNvbnN0IG5vcm1hbGl6ZWRFeHRyYUNvbnRlbnQgPSBleHRyYUNvbnRlbnRcbiAgICA/IGhhc05ld1NlY3Rpb25cbiAgICAgID8gJ1xcblxcbicgKyBleHRyYUNvbnRlbnQudHJpbSgpXG4gICAgICA6ICdcXG4nICsgZXh0cmFDb250ZW50XG4gICAgOiAnJztcbiAgcmV0dXJuIGJhc2VDb250ZW50ICsgbm9ybWFsaXplZEV4dHJhQ29udGVudDtcbn1cblxuLyoqXG4gKiBUaGUgbGFuZ3VhZ2UgaXNzdWVzLCBQUnMsIHJldmlldyBjb21tZW50cywgYW5kIGRvY3VtZW50YXRpb24gZGVmYXVsdCB0bzogSmFwYW5lc2Ugb25seSBpbiBhXG4gKiBXaWxsQm9vc3RlciAvIFdpbGxCb29zdGVyTGFiIHJlcG9zaXRvcnkgY29uZmlybWVkIHByaXZhdGUuIEFuIHVua25vd24gdmlzaWJpbGl0eSAob2ZmbGluZSBydW4sXG4gKiBmYWlsZWQgbG9va3VwKSB5aWVsZHMgRW5nbGlzaCBzbyB0aGF0IGEgSmFwYW5lc2UgZGVmYXVsdCBpcyBuZXZlciB3cml0dGVuIGludG8gYSBwdWJsaWMgcmVwb3NpdG9yeS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERlZmF1bHRQcm9zZUxhbmd1YWdlKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiAnRW5nbGlzaCcgfCAnSmFwYW5lc2UnIHtcbiAgcmV0dXJuIHJvb3RDb25maWcuaXNXaWxsQm9vc3RlclJlcG8gJiYgcm9vdENvbmZpZy5pc1JlcG9WaXNpYmlsaXR5S25vd24gJiYgIXJvb3RDb25maWcuaXNQdWJsaWNSZXBvXG4gICAgPyAnSmFwYW5lc2UnXG4gICAgOiAnRW5nbGlzaCc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUFnZW50Q29kaW5nU3R5bGUocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZywgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogc3RyaW5nIHtcbiAgLy8gVGF1cmkgZGVza3RvcCBhcHBzIHNoaXAgV2luZG93cyBidWlsZHMsIGFuZCB0aGUgYm91bmRhcnkgYmV0d2VlbiBhcHAgY29kZSBhbmQgc2hhcmVkIGNvZGUgaXNcbiAgLy8gdG9vIGZ1enp5IHRvIHNjb3BlIHRoZSBtYWNPUy9MaW51eC1vbmx5IHJ1bGUgcGVyIHBhY2thZ2UsIHNvIHN1Y2ggcmVwb3NpdG9yaWVzIHRhcmdldCBhbGxcbiAgLy8gdGhyZWUgT1NlcyBpbnN0ZWFkLlxuICBjb25zdCBoYXNEZXNrdG9wQXBwID0gYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRlcGVuZGluZy50YXVyaSB8fCBjLmRvZXNDb250YWluVGF1cmlDb25maWdJblBhY2thZ2VzKTtcbiAgLy8gQSBwdWJsaWMgcmVwb3NpdG9yeSB3aXRoIG5vIGBAd2lsbGJvb3N0ZXIvYCBwYWNrYWdlIGlzIE9TUyBmb3IgdGhlIGdlbmVyYWwgcHVibGljLCB3aG9zZSB1c2Vyc1xuICAvLyBtYXkgcnVuIFdpbmRvd3MsIHNvIG5vIE9TIHJlc3RyaWN0aW9uIGFwcGxpZXMgdGhlcmUuIEFuIHVua25vd24gdmlzaWJpbGl0eSBjb2xsYXBzZXMgdG9cbiAgLy8gaXNQdWJsaWNSZXBvPWZhbHNlIGFuZCB0aGVyZWZvcmUga2VlcHMgdGhlIHJlc3RyaWN0aXZlIGRlZmF1bHQuXG4gIGNvbnN0IGlzR2VuZXJhbFB1YmxpY09zcyA9XG4gICAgcm9vdENvbmZpZy5pc1B1YmxpY1JlcG8gJiYgYWxsQ29uZmlncy5ldmVyeSgoYykgPT4gIWMucGFja2FnZUpzb24/Lm5hbWU/LnN0YXJ0c1dpdGgoJ0B3aWxsYm9vc3Rlci8nKSk7XG4gIC8vIE9ubHkgcHVibGljIHJlcG9zaXRvcmllcyBwdWJsaXNoIHBhY2thZ2VzIHRvIHRoZSBwdWJsaWMgbnBtIHJlZ2lzdHJ5LCB3aG9zZSB1c2VycyByZWFkIHRoZVxuICAvLyBKU0RvYyB3aXRob3V0IHRoZSBzb3VyY2U7IHByaXZhdGUgcmVwb3NpdG9yaWVzIGFyZSByZWFkIG9ubHkgYnkgYWdlbnRzIHRoYXQgaGF2ZSB0aGUgc291cmNlLlxuICBjb25zdCBucG1BcGlFeGNlcHRpb24gPSByb290Q29uZmlnLmlzUHVibGljUmVwb1xuICAgID8gJyBFeGNlcHRpb246IHRoZSBleHBvcnRlZCBBUEkgb2YgYSBwYWNrYWdlIHB1Ymxpc2hlZCB0byBucG0gbWF5IGNhcnJ5IEpTRG9jIGRlc2NyaWJpbmcgd2hhdCBpdCBkb2VzIGFuZCBob3cgdG8gY2FsbCBpdCwgYmVjYXVzZSBpdHMgdXNlcnMgcmVhZCBpdCB3aXRob3V0IHRoZSBzb3VyY2UuJ1xuICAgIDogJyc7XG4gIGNvbnN0IGNvbW1lbnRJbnN0cnVjdGlvbiA9IGAtIENvbW1lbnRzIGFuZCBKU0RvYzogZXZlcnkgcmVhZGVyIGhhcyB0aGUgc291cmNlLCBzbyBuZXZlciByZXN0YXRlIHdoYXQgdGhlIGNvZGUsIGl0cyBuYW1lcywgb3IgaXRzIHR5cGVzIGFscmVhZHkgc2F5IChlLmcuLCBcXGBAcGFyYW0gbmFtZSBUaGUgbmFtZVxcYCkuIFdyaXRlIG9uZSBvbmx5IHdoZW4gYSBwbGF1c2libGUgZWRpdCB3b3VsZCBicmVhayBzb21ldGhpbmcgd2l0aG91dCB0aGF0IGtub3dsZWRnZSBhbmQgbm8gdHlwZSBjaGVjaywgbGludCBydWxlLCBvciB0ZXN0IHdvdWxkIGNhdGNoIGl0OyBmaXJzdCBlbmNvZGUgdGhlIGtub3dsZWRnZSBpbiBjb2RlIChhIG5hbWUsIGEgdHlwZSwgYW4gXFxgYXNzZXJ0XFxgLCBhIHRlc3QpIGFuZCBjb21tZW50IG9ubHkgd2hhdCBjYW5ub3QgYmUgZW5jb2RlZDogYW4gb2RkLWxvb2tpbmcgd29ya2Fyb3VuZCwgYSBkZXBlbmRlbmN5IG9uIGEgZmFjdCBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LCBvciBhIHJlamVjdGVkIGFsdGVybmF0aXZlIGFuZCB3aHkuIFB1dCBhIGNvbnRyYWN0IG9mIHRoZSBkZWNsYXJlZCBzeW1ib2wgaW4gSlNEb2MgYW5kIGxpbmUtc3BlY2lmaWMga25vd2xlZGdlIGluIGFuIGlubGluZSBjb21tZW50LiBEZWxldGUgY29tbWVudHMgdGhhdCBmYWlsIHRoaXMgdGVzdCBpbiBmaWxlcyB5b3UgdG91Y2guJHtucG1BcGlFeGNlcHRpb259YDtcbiAgY29uc3Qgb3NDb21wYXRpYmlsaXR5SW5zdHJ1Y3Rpb24gPSBpc0dlbmVyYWxQdWJsaWNPc3NcbiAgICA/ICcnXG4gICAgOiBoYXNEZXNrdG9wQXBwXG4gICAgICA/ICctIEVuc3VyZSBjb21wYXRpYmlsaXR5IHdpdGggV2luZG93cywgbWFjT1MsIGFuZCBMaW51eC4nXG4gICAgICA6ICctIEVuc3VyZSBjb21wYXRpYmlsaXR5IG9ubHkgd2l0aCBtYWNPUyBhbmQgTGludXg7IGRvIG5vdCBpbmNsdWRlIFdpbmRvd3Mtc3BlY2lmaWMgY29kZS4nO1xuICAvLyBDbG91ZGZsYXJlIFdvcmtlcnMgZXhlY3V0ZSBhY3Jvc3MgbWFueSBlcGhlbWVyYWwgaXNvbGF0ZXMgYW5kIHR3byByZXF1ZXN0cyBhcmUgbm90IGd1YXJhbnRlZWRcbiAgLy8gdG8gaGl0IHRoZSBzYW1lIGluc3RhbmNlLCBzbyB0aGUgc2luZ2xlLWluc3RhbmNlIHNpbXBsaWZpY2F0aW9uIHNpbGVudGx5IGxvc2VzIHN0YXRlIHRoZXJlIOKAlFxuICAvLyBidXQgV29ya2VycyBkZWxpYmVyYXRlbHkgcmV1c2UgZXhlY3V0aW9uIGNvbnRleHRzLCBzbyBiZXN0LWVmZm9ydCBpc29sYXRlLWxvY2FsIGNhY2hlcyBzdGF5XG4gIC8vIGxlZ2l0aW1hdGUgKGh0dHBzOi8vZGV2ZWxvcGVycy5jbG91ZGZsYXJlLmNvbS93b3JrZXJzL3JlZmVyZW5jZS9ob3ctd29ya2Vycy13b3Jrcy8pLiBUaGVcbiAgLy8gc2lnbmFscyBhcmUgY29ycmVsYXRlZCBQRVIgUEFDS0FHRTogYSBtb25vcmVwbyBjYW4gaG9zdCBhIHNpbmdsZS1pbnN0YW5jZSBzZXJ2ZXIgYXBwIG5leHQgdG9cbiAgLy8gYW4gdW5yZWxhdGVkIFdvcmtlciwgYW5kIG5laXRoZXIgbWF5IG92ZXJyaWRlIHRoZSBvdGhlcidzIHJ1bGUuIGRvZXNDb250YWluV3JhbmdsZXJDb25maWcgaXNcbiAgLy8gdGhlIGFjY3VyYXRlIFdvcmtlcnMgc2lnbmFsIChpc0Nsb3VkZmxhcmUgYWxzbyBtYXRjaGVzIGEgbWVyZSB3cmFuZ2xlciBtZW50aW9uIGluIGEgc2NyaXB0IG9yXG4gIC8vIHdvcmtmbG93KS5cbiAgY29uc3QgaGFzV29ya2Vyc0FwcCA9IGFsbENvbmZpZ3Muc29tZSgoYykgPT4gYy5kb2VzQ29udGFpbldyYW5nbGVyQ29uZmlnKTtcbiAgY29uc3QgaGFzU2luZ2xlSW5zdGFuY2VTZXJ2ZXJBcHAgPSBhbGxDb25maWdzLnNvbWUoXG4gICAgKGMpID0+IChjLmRlcGVuZGluZy5uZXh0IHx8IGMuZGVwZW5kaW5nLnZpbmV4dCkgJiYgIWMuZG9lc0NvbnRhaW5XcmFuZ2xlckNvbmZpZ1xuICApO1xuICBjb25zdCB3b3JrZXJzSW5zdHJ1Y3Rpb24gPVxuICAgICctIENsb3VkZmxhcmUgV29ya2VycyBydW4gYWNyb3NzIG1hbnkgZXBoZW1lcmFsIGlzb2xhdGVzLCBzbyB0d28gcmVxdWVzdHMgbWF5IGhpdCBkaWZmZXJlbnQgaW5zdGFuY2VzOiBuZXZlciBsZXQgY29ycmVjdG5lc3MgZGVwZW5kIG9uIG1vZHVsZS1sZXZlbCBtdXRhYmxlIHN0YXRlOyBwZXJzaXN0IGF1dGhvcml0YXRpdmUgc2hhcmVkIHN0YXRlIGluIGJpbmRpbmdzIChEMSwgS1YsIFIyLCBEdXJhYmxlIE9iamVjdHMpLiBCZXN0LWVmZm9ydCBpc29sYXRlLWxvY2FsIGNhY2hlcyBvZiBub24tcmVxdWVzdC1zY29wZWQgZGF0YSBhcmUgZmluZS4nO1xuICBjb25zdCBzZXJ2ZXJJbnN0YW5jZUluc3RydWN0aW9uID0gaGFzV29ya2Vyc0FwcFxuICAgID8gaGFzU2luZ2xlSW5zdGFuY2VTZXJ2ZXJBcHBcbiAgICAgID8gYCR7d29ya2Vyc0luc3RydWN0aW9ufSBUaGlzIGFwcGxpZXMgdG8gYWxsIGNvZGUgcnVubmluZyBvbiBDbG91ZGZsYXJlIFdvcmtlcnMgKHRoZSB3cmFuZ2xlci1jb25maWd1cmVkIHBhY2thZ2VzIGFuZCBhbnkgd29ya3NwYWNlIHBhY2thZ2UgdGhleSBpbXBvcnQpOyBhc3N1bWUgYSBzaW5nbGUgc2VydmVyIGluc3RhbmNlIGZvciB0aGUgb3RoZXIgc2VydmVyIGFwcHMuYFxuICAgICAgOiB3b3JrZXJzSW5zdHJ1Y3Rpb25cbiAgICA6IGhhc1NpbmdsZUluc3RhbmNlU2VydmVyQXBwXG4gICAgICA/ICctIEFzc3VtZSBhIHNpbmdsZSBzZXJ2ZXIgaW5zdGFuY2UuJ1xuICAgICAgOiAnJztcbiAgLy8gS2VlcCB0b3AtZG93biBvcmRlcmluZyBndWlkYW5jZSBmdW5jdGlvbi1vbmx5IGJlY2F1c2UgY2xhc3NlcyBhcmUgbm90IGhvaXN0ZWQgYW5kIGNhbiBmYWlsIHdoZW4gaW5oZXJpdGFuY2Ugb3IgdG9wLWxldmVsIGluc3RhbnRpYXRpb24gZGVwZW5kcyBvbiBkZWNsYXJhdGlvbiBvcmRlci5cbiAgcmV0dXJuIGBcbiMjIENvZGluZyBTdHlsZVxuXG4tIFVzZSBjYW1lbENhc2UgZmlsZSBuYW1lcyBmb3IgSmF2YVNjcmlwdC9UeXBlU2NyaXB0IChQYXNjYWxDYXNlIGZvciBSZWFjdCBjb21wb25lbnRzKS5cbi0gU2ltcGxpZnkgY29kZSBhcyBtdWNoIGFzIHBvc3NpYmxlIHRvIGVsaW1pbmF0ZSByZWR1bmRhbmN5LlxuLSBEZXNpZ24gbW9kdWxlcyBhbmQgZGlyZWN0b3JpZXMgd2l0aCBoaWdoIGNvaGVzaW9uIGFuZCBsb3cgY291cGxpbmc7IHNwbGl0IGxhcmdlIG1vZHVsZXMgd2hlbiBuZWVkZWQuXG4tIFBsYWNlIGNhbGxpbmcgZnVuY3Rpb25zIGFib3ZlIHRoZSBmdW5jdGlvbnMgdGhleSBjYWxsICh0b3AtZG93biBvcmRlcik7IHBsYWNlIHZhcmlhYmxlIGFuZCB0eXBlIGRlY2xhcmF0aW9ucyBhYm92ZSB0aGVpciB1c2FnZS5cbiR7Y29tbWVudEluc3RydWN0aW9ufVxuLSBOZXZlciBleHBsYWluIGhvdyBXaWxsQm9vc3RlcidzIGluLWhvdXNlIHRvb2xzIChlLmcuLCBcXGB3YlxcYCwgXFxgd2JmeVxcYCkgd29yayBpbiBjb2RlIGNvbW1lbnRzIG9yIGRvY3VtZW50cyBvdXRzaWRlIHRoZSB0b29sJ3Mgb3duIHBhY2thZ2UsIGV4Y2VwdCBpbiBpbnN0cnVjdGlvbnMgZm9yIEFJIGFnZW50cyAoZS5nLiwgZG8gbm90IG5vdGUgdGhhdCBcXGBQT1JUXFxgIGlzIHVuc2V0IGJlY2F1c2UgXFxgd2JcXGAgcGlja3MgYSBmcmVlIHBvcnQpLlxuLSBJZiBsaW50IGVycm9ycyBvciB3YXJuaW5ncyBjYW5ub3QgYmUgZml4ZWQsIHVzZSBpZ25vcmUgY29tbWVudHMgd2l0aCByZWFzb25zIChlLmcuLCBcXGAvLyBveGxpbnQtZGlzYWJsZS1uZXh0LWxpbmUgPHJ1bGU+IC0tIDxyZWFzb24+XFxgKS5cbi0gUHJlZmVyIFxcYHVuZGVmaW5lZFxcYCBvdmVyIFxcYG51bGxcXGAgdW5sZXNzIHJlcXVpcmVkIGJ5IEFQSXMgb3IgbGlicmFyaWVzLlxuLSBWYWxpZGF0ZSBKYXZhU2NyaXB0IG9iamVjdHMgKGUuZy4sIHBhcnNlZCBKU09OLCBBUEkgcmVzcG9uc2VzKSB3aXRoIFxcYHpvZFxcYCB3aGVuZXZlciBwb3NzaWJsZSBpbnN0ZWFkIG9mIGhhbmQtd3JpdHRlbiBjaGVja3Mgb3IgdHlwZSBhc3NlcnRpb25zLlxuLSBCdWlsZCBwcm9tcHRzIGFzIGEgc2luZ2xlIHRlbXBsYXRlIGxpdGVyYWwgaW5zdGVhZCBvZiBcXGBqb2luKClcXGAgb24gYSBwcmUtY29tcHV0YWJsZSBhcnJheSBvZiBzdHJpbmdzLlxuLSBBc3N1bWUgYWxsIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgZGVmaW5lZDsgaWYgdmFsaWRhdGlvbiBpcyBuZWVkZWQsIFxcYGFzc2VydFxcYCB0aGVtIGF0IHN0YXJ0dXAgdG8gZmFpbCBmYXN0LlxuLSBBc3N1bWUgbG9jYWwgdG9vbHMgc3VjaCBhcyBcXGBnaXRcXGAsIFxcYGdoXFxgLCBhbmQgXFxgZ2hxXFxgIGFyZSBpbnN0YWxsZWQgYW5kIGF1dGhlbnRpY2F0ZWQuXG4ke29zQ29tcGF0aWJpbGl0eUluc3RydWN0aW9ufVxuJHtcbiAgYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRlcGVuZGluZy5nZW5JMThuVHMpXG4gICAgPyBgLSBSZWdpc3RlciBzdHJpbmcgbGl0ZXJhbHMgZm9yIFJlYWN0IGNvbXBvbmVudHMgaW4gdGhlIFxcYGkxOG5cXGAgcmVzb3VyY2UgZmlsZXMgKGUuZy4sIFxcYGkxOG4vamEtSlAuanNvblxcYCkgYW5kIHJlZmVyZW5jZSB0aGVtIHZpYSB0aGUgXFxgaTE4blxcYCB1dGlsaXR5IChlLmcuLCBcXGBpMThuLnBhZ2VzLmhvbWUudGl0bGUoKVxcYCBmb3IgXFxgeyBcInBhZ2VzXCI6IHsgXCJob21lXCI6IHsgXCJ0aXRsZVwiOiBcIk15IEFwcFwiIH0gfSB9XFxgKS5gXG4gICAgOiAnJ1xufVxuXG4ke1xuICBhbGxDb25maWdzLnNvbWUoKGMpID0+IGMuZGVwZW5kaW5nLnJlYWN0IHx8IGMuZGVwZW5kaW5nLm5leHQgfHwgYy5kZXBlbmRpbmcudmluZXh0KVxuICAgID8gYC0gUHJlZmVyIGxhbWJkYSBvdmVyIFxcYGZ1bmN0aW9uXFxgIGZvciBSZWFjdCBjb21wb25lbnRzLCBlLmcuLCBcXGBjb25zdCBCdXR0b246IFJlYWN0LkZDID0gKCkgPT4ge1xcYC5cbi0gUHJlZmVyIFxcYHVzZUltbWVyXFxgIG92ZXIgXFxgdXNlU3RhdGVcXGAgZm9yIGFycmF5cyBhbmQgb2JqZWN0cy5cbi0gVXNlIFxcYGF1dG9Gb2N1c1xcYCB3aGVyZSBpdCByZWR1Y2VzIHVzZXIgZWZmb3J0LmBcbiAgICA6ICcnXG59XG4ke1xuICAvLyB2aW5leHQgaXMgdGhlIG9yZydzIGN1cnJlbnQgd2ViLWFwcCBmcmFtZXdvcmsgYW5kIGVuYWJsZXMgdGhlIFJlYWN0IENvbXBpbGVyIGp1c3QgYXMgTmV4dC5qc1xuICAvLyBkb2VzLCBzbyBpdCBtdXN0IG5vdCBtaXNzIHRoaXMgcnVsZS5cbiAgYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRlcGVuZGluZy5uZXh0IHx8IGMuZGVwZW5kaW5nLnZpbmV4dClcbiAgICA/IGBcbi0gVGhpcyBwcm9qZWN0IHVzZXMgdGhlIFJlYWN0IENvbXBpbGVyLCBzbyBcXGB1c2VDYWxsYmFja1xcYCBhbmQgXFxgdXNlTWVtb1xcYCBhcmUgdW5uZWNlc3NhcnkgZm9yIHBlcmZvcm1hbmNlLlxuYFxuICAgIDogJydcbn1cbiR7c2VydmVySW5zdGFuY2VJbnN0cnVjdGlvbn1cbmBcbiAgICAucmVwbGFjZUFsbCgvXFwuXFxuXFxuKy0vZywgJy5cXG4tJylcbiAgICAucmVwbGFjZUFsbCgvXFxuezMsfS9nLCAnXFxuXFxuJylcbiAgICAudHJpbSgpO1xufVxuXG5mdW5jdGlvbiBoYXNQbGF5d3JpZ2h0VGVzdFNlcnZlcihjb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBib29sZWFuIHtcbiAgcmV0dXJuIGNvbmZpZ3Muc29tZSgoY29uZmlnKSA9PiBjb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRUZXN0KTtcbn1cbiIsIiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCByZWxlYXNlQWdlR2F0ZSBmcm9tICcuLi8uLi9jb25maWdzL3JlbGVhc2VBZ2VHYXRlLmpzb24nIHdpdGggeyB0eXBlOiAnanNvbicgfTtcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW50ZXJmYWNlIEJ1bmZpZ1RvbWwge1xuICBpbnN0YWxsPzoge1xuICAgIGV4YWN0PzogYm9vbGVhbjtcbiAgICBnbG9iYWxTdG9yZT86IGJvb2xlYW47XG4gICAgbGlua2VyPzogc3RyaW5nO1xuICB9O1xufVxuXG4vLyBjb25maWdzL3JlbGVhc2VBZ2VHYXRlLmpzb24gaXMgdGhlIG9yZ2FuaXphdGlvbidzIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIHRoZSBwb2xpY3k6IHRoZVxuLy8gbWFjaGluZXMnIGdsb2JhbCBjb25maWdzIGdldCBpdCB0aHJvdWdoIGNvbmZpZ3MvYXBwbHlSZWxlYXNlQWdlR2F0ZS5zaCAocnVuIGJ5IHdiZnkgaXRzZWxmLCBieVxuLy8gcmV1c2FibGUtd29ya2Zsb3dzIG9uIENJLCBhbmQgYnkgc2VsZi1ob3N0LXV0aWxzIG9uIHRoZSBydW5uZXJzKSwgYW5kIHJlcG9zaXRvcmllcyBnZXQgaXQgaGVyZS5cbi8vIE9ubHkgb3VyIG93biBwYWNrYWdlcyBhcmUgZXhlbXB0OiB3ZSBjb250cm9sIHdobyBwdWJsaXNoZXMgdGhlbSwgc28gYSBjb21wcm9taXNlZCByZWxlYXNlIGNhbm5vdFxuLy8gcmVhY2ggdXMgdGhyb3VnaCBhbiB1cHN0cmVhbSBtYWludGFpbmVyJ3Mgc3RvbGVuIGNyZWRlbnRpYWxzLiBUaGF0IGNvdmVycyBldmVyeVxuLy8gQHdpbGxib29zdGVyLXByaXZhdGUgcGFja2FnZSAodGhlIHNjb3BlIHJlc29sdmVzIG9ubHkgZnJvbSBvdXIgb3duIHJlZ2lzdHJ5KSwgYnV0IGJ1biwgbnBtLCBhbmRcbi8vIFlhcm4gbWF0Y2ggZXhjbHVkZSBlbnRyaWVzIGJ5IGV4YWN0IG5hbWUg4oCUIG5vIEBzY29wZS8qIHBhdHRlcm5zIOKAlCBzbyBlYWNoIG5ldyBwYWNrYWdlIGluIHRoZVxuLy8gc2NvcGUgbXVzdCBiZSBhZGRlZCB0byBjb25maWdzL3JlbGVhc2VBZ2VHYXRlLmpzb24gd2hlbiBpdCBpcyBmaXJzdCBwdWJsaXNoZWQuIFRoaXJkLXBhcnR5XG4vLyBwYWNrYWdlcyDigJQgaW5jbHVkaW5nXG4vLyB0b29saW5nIHdiZnkgcGlucyBpdHNlbGYg4oCUIHN0YXkgYWdlLWdhdGVkOyBnZXRMYXRlc3RBZ2VHYXRlZERlcGVuZGVuY3lWZXJzaW9uIGluIHBhY2thZ2VKc29uLnRzXG4vLyBwaW5zIHRoZSBuZXdlc3QgcmVsZWFzZSBvbGQgZW5vdWdoIHRvIHBhc3MgdGhlIGdhdGUsIHNvIHBpbm5pbmcga2VlcHMgd29ya2luZyB3aXRob3V0IGFuIGV4ZW1wdGlvbi5cbmV4cG9ydCBjb25zdCBidW5NaW5pbXVtUmVsZWFzZUFnZVNlY29uZHMgPSByZWxlYXNlQWdlR2F0ZS5kYXlzICogMjQgKiA2MCAqIDYwO1xuZXhwb3J0IGNvbnN0IGJ1bk1pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXMgPSByZWxlYXNlQWdlR2F0ZS5leGNsdWRlcztcblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRCdW5HbG9iYWxTdG9yZShyb290RGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3REaXJQYXRoLCAnYnVuZmlnLnRvbWwnKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIHBhcnNlQnVuZmlnVG9tbChmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGY4JykpPy5pbnN0YWxsPy5nbG9iYWxTdG9yZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVCdW5HbG9iYWxTdG9yZShcbiAgY29uZmlnczogUGFja2FnZUNvbmZpZ1tdLFxuICBwcmV2aW91c0dsb2JhbFN0b3JlOiBib29sZWFuIHwgdW5kZWZpbmVkLFxuICBza2lwRGVwczogYm9vbGVhblxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IGRlZmF1bHRVc2VHbG9iYWxTdG9yZSA9IHNob3VsZFVzZUJ1bkdsb2JhbFN0b3JlKGNvbmZpZ3MpO1xuICByZXR1cm4gc2tpcERlcHMgPyAocHJldmlvdXNHbG9iYWxTdG9yZSA/PyBkZWZhdWx0VXNlR2xvYmFsU3RvcmUpIDogZGVmYXVsdFVzZUdsb2JhbFN0b3JlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2hvdWxkVXNlQnVuR2xvYmFsU3RvcmUoY29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogYm9vbGVhbiB7XG4gIC8vIEJsaXR6IGJ1aWxkcyBvbiBOZXh0LmpzIGJ1dCBuZWVkIG5vdCBkZWNsYXJlIGl0IGRpcmVjdGx5LCBhbmQgaXRzIGNvZGVnZW4gYWxzbyBwYXRjaGVzIE5leHRcbiAgLy8gaW5zaWRlIG5vZGVfbW9kdWxlcy4gQm90aCBmcmFtZXdvcmtzIHRoZXJlZm9yZSByZXF1aXJlIHByb2plY3QtbG9jYWwgaXNvbGF0ZWQgaW5zdGFsbHMuXG4gIC8vIFNsaWRldiBsb2FkcyBvcHRpb25hbCBWdWUgY29tcGlsZXIgcGVlcnMgdGhyb3VnaCBsb2NhbC1wa2cuIFRoZSBnbG9iYWwgc3RvcmUgcmVhbHBhdGhzXG4gIC8vIGxvY2FsLXBrZyBvdXRzaWRlIHRoZSBwcm9qZWN0LCBzbyBOb2RlIGNhbm5vdCByZXNvbHZlIGEgY29tcGlsZXIgZGVjbGFyZWQgYnkgdGhlIHByb2plY3QuXG4gIHJldHVybiAhY29uZmlncy5zb21lKChjb25maWcpID0+IGNvbmZpZy5kZXBlbmRpbmcubmV4dCB8fCBjb25maWcuZGVwZW5kaW5nLmJsaXR6IHx8IGNvbmZpZy5kZXBlbmRpbmcuc2xpZGV2KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQnVuZmlnVG9tbChjb25maWc6IFBhY2thZ2VDb25maWcsIHVzZUdsb2JhbFN0b3JlOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVCdW5maWdUb21sJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnYnVuZmlnLnRvbWwnKTtcbiAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSA/IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBjb250ZW50ID0gbmV3Q29udGVudChleGlzdGluZ0NvbnRlbnQsIHVzZUdsb2JhbFN0b3JlKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgY29udGVudCkpO1xuICB9KTtcbn1cblxuY29uc3QgbmV3Q29udGVudCA9IChleGlzdGluZ0NvbnRlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZCwgdXNlR2xvYmFsU3RvcmU6IGJvb2xlYW4pOiBzdHJpbmcgPT4ge1xuICBjb25zdCBidW5maWdUb21sID0gcGFyc2VCdW5maWdUb21sKGV4aXN0aW5nQ29udGVudCk7XG4gIC8vIG1pbmltdW1SZWxlYXNlQWdlIGFuZCBtaW5pbXVtUmVsZWFzZUFnZUV4Y2x1ZGVzIGFyZSBvcmcgcG9saWN5LCBuZXZlciByZXBvc2l0b3J5IHBvbGljeTogYm90aFxuICAvLyBhcmUgcmV3cml0dGVuIHRvIGNvbmZpZ3MvcmVsZWFzZUFnZUdhdGUuanNvbidzIHZhbHVlcyBvbiBldmVyeSBydW4sIHNvIGEgaGFuZC1lZGl0ZWQgKHdlYWtlbmVkKVxuICAvLyBnYXRlIGNhbm5vdCBzdXJ2aXZlIHJlZ2VuZXJhdGlvbi4gRHJvcHBpbmcgcmVwb3NpdG9yeS1zcGVjaWZpYyBleGNsdWRlIGVudHJpZXMgaXMgZmFpbC1zYWZlIOKAlCBhblxuICAvLyB1bmNvdmVyZWQgcGFja2FnZSBiZWNvbWVzIGFnZS1nYXRlZCBhbmQgc3VyZmFjZXMgYXQgaW5zdGFsbCB0aW1lIGluc3RlYWQgb2Ygd2Vha2VuaW5nIHRoZSBnYXRlLlxuICAvLyBUdXJib3BhY2sgcmVqZWN0cyBnbG9iYWwtc3RvcmUgc3ltbGlua3MgYmVjYXVzZSB0aGV5IHJlc29sdmUgb3V0c2lkZSBpdHMgZmlsZXN5c3RlbSByb290LlxuICAvLyBLZWVwaW5nIE5leHQuanMgaW5zdGFsbHMgcHJvamVjdC1sb2NhbCBhdm9pZHMgd2lkZW5pbmcgdGhhdCByb290IHRvICRIT01FIChvciBgL2AgaW4gRG9ja2VyKSxcbiAgLy8gd2hpY2ggd291bGQgZXhwYW5kIGRldmVsb3BtZW50IGZpbGVzeXN0ZW0gd2F0Y2hpbmcgYW5kIGJ5cGFzcyB0aGUgYm91bmRhcnkncyBjYWNoZSBiZW5lZml0cy5cbiAgY29uc3QgZ2xvYmFsU3RvcmVMaW5lID0gdXNlR2xvYmFsU3RvcmUgPyAnZ2xvYmFsU3RvcmUgPSB0cnVlJyA6ICdnbG9iYWxTdG9yZSA9IGZhbHNlJztcbiAgLy8gTm8gYFtydW5dIGJ1biA9IHRydWVgOiBpdHMgbm9kZS0+YnVuIFBBVEggc2hpbSBsZWFrcyBpbnRvIGV2ZXJ5IGNoaWxkIHByb2Nlc3MgYW5kIGJyZWFrc1xuICAvLyB0b29scyByZXF1aXJpbmcgcmVhbCBOb2RlLmpzIChQbGF5d3JpZ2h0LCB3cmFuZ2xlciwgdmluZXh0KTsgYW55IGV4aXN0aW5nIHNldHRpbmcgaXMgZHJvcHBlZC5cbiAgLy8gcHVibGljSG9pc3RQYXR0ZXJuIOKAlCB0c3g6IGJ1aWxkLXRzIHVuZGVyIE5vZGUuanMgc3Bhd25zIGBub2RlIC0taW1wb3J0IHRzeGAsIHdoaWNoIHJlc29sdmVzXG4gIC8vIHRzeCBmcm9tIHRoZSBjb25zdW1lciBwYWNrYWdlJ3MgZGlyZWN0b3J5LCBub3QgZnJvbSBidWlsZC10cydzIG93biBkZXBlbmRlbmNpZXMuXG4gIC8vIHVuZGljaS10eXBlczogYnVuLXR5cGVzIHJlZmVyZW5jZXMgaXQgd2l0aG91dCBkZWNsYXJpbmcgaXQgYXMgYSBkZXBlbmRlbmN5IChvdmVuLXNoL2J1biMyMjgwNSk7XG4gIC8vIGdlbmVyYXRlZCB0c2NvbmZpZ3MgYWxzbyBtYXAgdW5kaWNpLXR5cGVzIHRvIHRoZSBob2lzdGVkIGNvcHkgKHNlZSB0c2NvbmZpZy50cykgYmVjYXVzZSB0aGVcbiAgLy8gZ2xvYmFsIHN0b3JlIHJlYWxwYXRocyBidW4tdHlwZXMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeS5cbiAgcmV0dXJuIGBlbnYgPSBmYWxzZVxudGVsZW1ldHJ5ID0gZmFsc2VcblxuJHtleHRyYWN0UmF3VGVzdFNlY3Rpb25zKGV4aXN0aW5nQ29udGVudCl9W2luc3RhbGxdXG5leGFjdCA9ICR7YnVuZmlnVG9tbD8uaW5zdGFsbD8uZXhhY3QgPT09IGZhbHNlID8gJ2ZhbHNlJyA6ICd0cnVlJ31cbiR7Z2xvYmFsU3RvcmVMaW5lfVxubGlua2VyID0gXCJpc29sYXRlZFwiXG5wdWJsaWNIb2lzdFBhdHRlcm4gPSBbXCJ0c3hcIiwgXCJ1bmRpY2ktdHlwZXNcIl1cbm1pbmltdW1SZWxlYXNlQWdlID0gJHtidW5NaW5pbXVtUmVsZWFzZUFnZVNlY29uZHN9XG5taW5pbXVtUmVsZWFzZUFnZUV4Y2x1ZGVzID0gW1xuJHtidW5NaW5pbXVtUmVsZWFzZUFnZUV4Y2x1ZGVzLm1hcCgocGFja2FnZU5hbWUpID0+IGAgICAgXCIke3BhY2thZ2VOYW1lfVwiLGApLmpvaW4oJ1xcbicpfVxuXVxuYDtcbn07XG5cbi8qKlxuICogUHJlc2VydmUgdGhlIHByb2plY3QncyBgW3Rlc3RdYCBzZWN0aW9ucyAoZS5nLiBwcmVsb2FkIHNjcmlwdHMgc3dhcHBpbmcgYSBDbG91ZGZsYXJlIEQxIGNsaWVudFxuICogZm9yIGEgbG9jYWwgU1FMaXRlIG9uZSkgdmVyYmF0aW0sIGNvbW1lbnRzIGluY2x1ZGVkOyB3YmZ5IG1hbmFnZXMgb25seSB0aGUgb3RoZXIgc2VjdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0UmF3VGVzdFNlY3Rpb25zKGNvbnRlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIGlmICghY29udGVudCkgcmV0dXJuICcnO1xuXG4gIGNvbnN0IHByZXNlcnZlZExpbmVzOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgaW5UZXN0U2VjdGlvbiA9IGZhbHNlO1xuICBmb3IgKGNvbnN0IGxpbmUgb2YgY29udGVudC5zcGxpdCgnXFxuJykpIHtcbiAgICBjb25zdCBzZWN0aW9uTWF0Y2ggPSAvXlxccypcXFsoW15cXF1dKylcXF0vLmV4ZWMobGluZSk7XG4gICAgaWYgKHNlY3Rpb25NYXRjaCkge1xuICAgICAgaW5UZXN0U2VjdGlvbiA9IHNlY3Rpb25NYXRjaFsxXSA9PT0gJ3Rlc3QnIHx8IChzZWN0aW9uTWF0Y2hbMV0gYXMgc3RyaW5nKS5zdGFydHNXaXRoKCd0ZXN0LicpO1xuICAgIH1cbiAgICBpZiAoaW5UZXN0U2VjdGlvbiAmJiBsaW5lLnRyaW0oKSkge1xuICAgICAgcHJlc2VydmVkTGluZXMucHVzaChsaW5lKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHByZXNlcnZlZExpbmVzLmxlbmd0aCA+IDAgPyBgJHtwcmVzZXJ2ZWRMaW5lcy5qb2luKCdcXG4nKX1cXG5cXG5gIDogJyc7XG59XG5cbmZ1bmN0aW9uIHBhcnNlQnVuZmlnVG9tbChjb250ZW50OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBCdW5maWdUb21sIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFjb250ZW50KSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBCdW4uVE9NTC5wYXJzZShjb250ZW50KSBhcyBCdW5maWdUb21sO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5cbmNvbnN0IHVzZXJDb250ZW50SGVhZGVyID0gJyMgUHJvamVjdC1zcGVjaWZpYyBzZXR0aW5ncyc7XG5jb25zdCB1c2VyQ29udGVudEhlYWRlclJlZ2V4ID0gLyMgUHJvamVjdC1zcGVjaWZpYyBzZXR0aW5nc1teXFxuXSpcXG4vZ207XG5jb25zdCBzZXBhcmF0b3IgPSAnIyBHZW5lcmF0ZWQgYnkgd2JmeSc7XG5jb25zdCBzZXBhcmF0b3JQcmVmaXggPSAnIyBHZW5lcmF0ZWQgYnkgJztcbmNvbnN0IGRlZmF1bHRIZWFkVXNlckNvbnRlbnQgPSBgJHt1c2VyQ29udGVudEhlYWRlcn0gKGhlYWQpXG5cblxuJHtzZXBhcmF0b3J9XG5gO1xuY29uc3QgZGVmYXVsdFRhaWxVc2VyQ29udGVudCA9IGBcbiR7dXNlckNvbnRlbnRIZWFkZXJ9ICh0YWlsKVxuYDtcblxuZXhwb3J0IGNvbnN0IGlnbm9yZUZpbGVVdGlsID0ge1xuICBzZXBhcmF0b3IsXG4gIHNlcGFyYXRvclByZWZpeCxcbiAgZGVmYXVsdEhlYWRVc2VyQ29udGVudCxcbiAgZGVmYXVsdFRhaWxVc2VyQ29udGVudCxcbiAgYXN5bmMgcmVhZEdpdGlnbm9yZVdpdGhvdXRTZXBhcmF0b3JzKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIHRyeSB7XG4gICAgICBsZXQgY29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3QgbGFzdEhlYWRlckluZGV4ID0gZ2V0SW5kZXhPZlRhaWxVc2VyQ29udGVudEhlYWRlcihjb250ZW50KTtcbiAgICAgIGlmIChsYXN0SGVhZGVySW5kZXggPiAwKSB7XG4gICAgICAgIGNvbnRlbnQgPSBjb250ZW50LnNsaWNlKDAsIGxhc3RIZWFkZXJJbmRleCAtIDEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIChcbiAgICAgICAgY29udGVudFxuICAgICAgICAgIC5yZXBsYWNlQWxsKHVzZXJDb250ZW50SGVhZGVyUmVnZXgsICcnKVxuICAgICAgICAgIC5yZXBsYWNlQWxsKC8jIEdlbmVyYXRlZCBieSBbXlxcbl0qXFxuL2dtLCAnJylcbiAgICAgICAgICAucmVwbGFjZUFsbCgvXFxyP1xcblxccj9cXG4oXFxyP1xcbikrL2dtLCAnXFxuXFxuJylcbiAgICAgICAgICAudHJpbSgpICsgJ1xcbidcbiAgICAgICk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICB9LFxuICBnZXRIZWFkVXNlckNvbnRlbnQoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBpbmRleCA9IGNvbnRlbnQuaW5kZXhPZih0aGlzLnNlcGFyYXRvclByZWZpeCk7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgcmV0dXJuIGNvbnRlbnRcbiAgICAgICAgLnNsaWNlKDAsIGNvbnRlbnQuaW5kZXhPZignXFxuJywgaW5kZXgpICsgMSlcbiAgICAgICAgLnJlcGxhY2VBbGwodXNlckNvbnRlbnRIZWFkZXJSZWdleCwgYCR7dXNlckNvbnRlbnRIZWFkZXJ9IChoZWFkKVxcbmApO1xuICAgIH1cbiAgICByZXR1cm4gZGVmYXVsdEhlYWRVc2VyQ29udGVudDtcbiAgfSxcbiAgZ2V0VGFpbFVzZXJDb250ZW50KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgbGFzdEhlYWRlckluZGV4ID0gZ2V0SW5kZXhPZlRhaWxVc2VyQ29udGVudEhlYWRlcihjb250ZW50KTtcbiAgICBpZiAobGFzdEhlYWRlckluZGV4ID4gMCkge1xuICAgICAgcmV0dXJuIGNvbnRlbnQuc2xpY2UobGFzdEhlYWRlckluZGV4IC0gMSk7XG4gICAgfVxuICAgIHJldHVybiBkZWZhdWx0VGFpbFVzZXJDb250ZW50O1xuICB9LFxuICBhc3luYyBpc0JlcnJ5WmVyb0luc3RhbGxFbmFibGVkKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgcmV0dXJuIGNvbnRlbnQuaW5jbHVkZXMoJ1xcbiEueWFybi9jYWNoZScpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSxcbn07XG5cbmZ1bmN0aW9uIGdldEluZGV4T2ZUYWlsVXNlckNvbnRlbnRIZWFkZXIoY29udGVudDogc3RyaW5nKTogbnVtYmVyIHtcbiAgY29uc3QgaW5kZXggPSBjb250ZW50LmluZGV4T2YodXNlckNvbnRlbnRIZWFkZXIpO1xuICBjb25zdCBsYXN0SW5kZXggPSBjb250ZW50Lmxhc3RJbmRleE9mKHVzZXJDb250ZW50SGVhZGVyKTtcbiAgcmV0dXJuIGxhc3RJbmRleCA+IGluZGV4ID8gbGFzdEluZGV4IDogLTE7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgaWdub3JlRmlsZVV0aWwgfSBmcm9tICcuLi91dGlscy9pZ25vcmVGaWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuLy8gRXhlcmNvZGUgZGVwbG95cyBHaXQtYmFzZWQgcHJpdmF0ZSBwYWNrYWdlcyBmcm9tIG5vZGVfbW9kdWxlcywgYnV0IHRoZSBEb2NrZXIgY29udGV4dCBzaG91bGQgc3RheSBuYXJyb3cuXG5jb25zdCBpbmNsdWRlZE5vZGVNb2R1bGVzUGF0dGVybnMgPSBbJ0B3aWxsYm9vc3RlciddO1xuXG5jb25zdCBjb21tb25Db250ZW50ID0gYFxuLmVudipcbioqLy5EU19TdG9yZVxuKiovLmNhY2hlXG4qKi8uY2xhdWRlXG4qKi8uY3Vyc29yXG4qKi8uZWRpdG9yY29uZmlnXG4qKi8uZXNsaW50Y2FjaGVcbioqLy5nZW1pbmlcbioqLy5naXRcbioqLy5naXRhdHRyaWJ1dGVzXG4qKi8uZ2l0aHViXG4qKi8uZ2l0aWdub3JlXG4qKi8uaWRlYVxuKiovLmxlZnRob29rXG4qKi8ubXlweV9jYWNoZVxuKiovLm5leHQvY2FjaGVcbioqLy5ucG1cbioqLy5wYXJjZWwtY2FjaGVcbioqLy5wbnBtLXN0b3JlXG4qKi8ucHl0ZXN0X2NhY2hlXG4qKi8ucmFpbHdheWlnbm9yZVxuKiovLnJlbGVhc2VyYy5qc29uXG4qKi8ucnVmZl9jYWNoZVxuKiovLnRtcFxuKiovLnRtcC0qLyoqXG4qKi8udHVyYm9cbioqLy50b3hcbioqLy52c2NvZGVcbioqLy55YXJuL2NhY2hlXG4qKi8qLnNxbGl0ZTMqXG4qKi8ueWFybi9pbnN0YWxsLXN0YXRlLmd6XG4qKi8udmVudlxuKiovX19weWNhY2hlX19cbioqLyoubG9nXG4qKi8qLnB5Y1xuKiovKi50c2J1aWxkaW5mb1xuKiovY292ZXJhZ2VcbioqL25vZGVfbW9kdWxlcy8qKlxuJHtpbmNsdWRlZE5vZGVNb2R1bGVzUGF0dGVybnNcbiAgLm1hcChcbiAgICAocGF0dGVybikgPT4gYCEqKi9ub2RlX21vZHVsZXMvJHtwYXR0ZXJufVxuISoqL25vZGVfbW9kdWxlcy8ke3BhdHRlcm59LyoqYFxuICApXG4gIC5qb2luKCdcXG4nKX1cbioqL25vZGVfbW9kdWxlcy8uY2FjaGVcbioqL3BsYXl3cmlnaHQtcmVwb3J0XG4qKi9zdG9yeWJvb2stc3RhdGljXG4qKi90YXJnZXRcbioqL3Rlc3QtcmVzdWx0c1xuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRG9ja2VyaWdub3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlRG9ja2VyaWdub3JlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmRvY2tlcmlnbm9yZScpO1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Eb2NrZXJmaWxlKSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gKGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKSkgPz8gJyc7XG4gICAgICBjb25zdCBoZWFkVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRIZWFkVXNlckNvbnRlbnQoY29udGVudCk7XG4gICAgICBjb25zdCB0YWlsVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRUYWlsVXNlckNvbnRlbnQoY29udGVudCk7XG5cbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBoZWFkVXNlckNvbnRlbnQgKyBjb21tb25Db250ZW50ICsgdGFpbFVzZXJDb250ZW50O1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgfVxuICB9KTtcbn1cbiIsImV4cG9ydCBjb25zdCBleHRlbnNpb25zID0ge1xuICBjb2RlV2l0aDJJbmRlbnRTaXplOiBbXG4gICAgJ2NqcycsXG4gICAgJ21qcycsXG4gICAgJ2pzJyxcbiAgICAnanN4JyxcbiAgICAnY3RzJyxcbiAgICAnbXRzJyxcbiAgICAndHMnLFxuICAgICd0c3gnLFxuICAgICdqc29uJyxcbiAgICAnanNvbjUnLFxuICAgICdqc29uYycsXG4gICAgJ2NwcCcsXG4gICAgJ2RhcnQnLFxuICAgICdodG0nLFxuICAgICdodG1sJyxcbiAgICAncHUnLFxuICAgICdwdW1sJyxcbiAgICAncmInLFxuICAgICd2dWUnLFxuICAgICd4bWwnLFxuICAgICd5YW1sJyxcbiAgICAneW1sJyxcbiAgICAnc2gnLFxuICBdLnRvU29ydGVkKCksXG4gIGNvZGVXaXRoNEluZGVudFNpemU6IFsnZ28nLCAnZ3JhZGxlJywgJ2phdmEnLCAncHknXS50b1NvcnRlZCgpLFxuICBtYXJrZG93bkxpa2U6IFsnbWQnXS50b1NvcnRlZCgpLFxuICBveGxpbnQ6IFsnYXN0cm8nLCAnY2pzJywgJ2N0cycsICdqcycsICdqc3gnLCAnbWpzJywgJ210cycsICdzdmVsdGUnLCAndHMnLCAndHN4JywgJ3Z1ZSddLnRvU29ydGVkKCksXG4gIG94Zm10OiBbXG4gICAgJ2FzdHJvJyxcbiAgICAnY2pzJyxcbiAgICAnY3NzJyxcbiAgICAnY3RzJyxcbiAgICAnZ3FsJyxcbiAgICAnZ3JhcGhxbCcsXG4gICAgJ2hicycsXG4gICAgJ2h0bScsXG4gICAgJ2h0bWwnLFxuICAgICdqcycsXG4gICAgJ2pzb24nLFxuICAgICdqc29uNScsXG4gICAgJ2pzb25jJyxcbiAgICAnanN4JyxcbiAgICAnbGVzcycsXG4gICAgJ21kJyxcbiAgICAnbWR4JyxcbiAgICAnbWpzJyxcbiAgICAnbXRzJyxcbiAgICAnc2NzcycsXG4gICAgJ3N2ZWx0ZScsXG4gICAgJ3RvbWwnLFxuICAgICd0cycsXG4gICAgJ3RzeCcsXG4gICAgJ3Z1ZScsXG4gICAgJ3lhbWwnLFxuICAgICd5bWwnLFxuICBdLnRvU29ydGVkKCksXG4gIHByZXR0aWVyT25seTogWydqYXZhJ10udG9Tb3J0ZWQoKSxcbn07XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IG5ld0NvbnRlbnQgPSBgcm9vdCA9IHRydWVcblxuWypdXG5jaGFyc2V0ID0gdXRmLThcbmVuZF9vZl9saW5lID0gbGZcbmluc2VydF9maW5hbF9uZXdsaW5lID0gdHJ1ZVxudHJpbV90cmFpbGluZ193aGl0ZXNwYWNlID0gdHJ1ZVxuXG4ke2dlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zLmNvZGVXaXRoMkluZGVudFNpemUpfVxuaW5kZW50X3NpemUgPSAyXG5pbmRlbnRfc3R5bGUgPSBzcGFjZVxuXG4ke2dlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zLmNvZGVXaXRoNEluZGVudFNpemUpfVxuaW5kZW50X3NpemUgPSA0XG5pbmRlbnRfc3R5bGUgPSBzcGFjZVxuXG4ke2dlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zLm1hcmtkb3duTGlrZSl9XG5tYXhfbGluZV9sZW5ndGggPSBvZmZcbnRyaW1fdHJhaWxpbmdfd2hpdGVzcGFjZSA9IGZhbHNlXG5cblt7TWFrZWZpbGUsKi5ta31dXG5pbmRlbnRfc3R5bGUgPSB0YWJcbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUVkaXRvcmNvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUVkaXRvcmNvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lZGl0b3Jjb25maWcnKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGV4dGVuc2lvbnMubGVuZ3RoID4gMSA/IGBbKi57JHtleHRlbnNpb25zLmpvaW4oJywnKX19XWAgOiBgWyouJHtleHRlbnNpb25zWzBdfV1gO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW1wb3J0IHsgZ2VuZXJhdGVBZ2VudENvZGluZ1N0eWxlLCBnZXREZWZhdWx0UHJvc2VMYW5ndWFnZSwgcmVhZEFnZW50c0V4dHJhQ29udGVudCB9IGZyb20gJy4vYWdlbnRzLmpzJztcblxuY29uc3QgZGVmYXVsdENvbmZpZyA9IHtcbiAgaGF2ZV9mdW46IHRydWUsXG4gIGNvZGVfcmV2aWV3OiB7XG4gICAgZGlzYWJsZTogZmFsc2UsXG4gICAgY29tbWVudF9zZXZlcml0eV90aHJlc2hvbGQ6ICdNRURJVU0nLFxuICAgIG1heF9yZXZpZXdfY29tbWVudHM6IC0xLFxuICAgIHB1bGxfcmVxdWVzdF9vcGVuZWQ6IHtcbiAgICAgIGhlbHA6IGZhbHNlLFxuICAgICAgc3VtbWFyeTogdHJ1ZSxcbiAgICAgIGNvZGVfcmV2aWV3OiB0cnVlLFxuICAgIH0sXG4gIH0sXG4gIGlnbm9yZV9wYXR0ZXJuczogWycqKi9fX2dlbmVyYXRlZF9fJ10sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHZW1pbmlDb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdlbWluaUNvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWNvbmZpZy5pc1Jvb3QpIHJldHVybjtcblxuICAgIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2VtaW5pJyk7XG4gICAgY29uc3QgY29uZmlnRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2NvbmZpZy55YW1sJyk7XG4gICAgY29uc3Qgbm9uQ2Fub25pY2FsQ29uZmlnRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2NvbmZpZy55bWwnKTtcbiAgICBjb25zdCBzdHlsZWd1aWRlRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3N0eWxlZ3VpZGUubWQnKTtcblxuICAgIGNvbnN0IGhhc05vbkNhbm9uaWNhbENvbmZpZyA9ICEhKGF3YWl0IGZzLnByb21pc2VzLmxzdGF0KG5vbkNhbm9uaWNhbENvbmZpZ0ZpbGVQYXRoKS5jYXRjaCgoKSA9PiB7fSkpO1xuICAgIGlmIChoYXNOb25DYW5vbmljYWxDb25maWcpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFNraXBwZWQgZ2VuZXJhdGluZyAke2NvbmZpZ0ZpbGVQYXRofSBiZWNhdXNlICR7bm9uQ2Fub25pY2FsQ29uZmlnRmlsZVBhdGh9IGlzIG5vdCBhIHN1cHBvcnRlZCBHZW1pbmkgY29uZmlnIGxvY2F0aW9uLiBSZW5hbWUgaXQgbWFudWFsbHkuYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBsZXQgbmV3Q29uZmlnOiBvYmplY3QgPSBzdHJ1Y3R1cmVkQ2xvbmUoZGVmYXVsdENvbmZpZyk7XG4gICAgY29uc3Qgb2xkQ29udGVudCA9IGhhc05vbkNhbm9uaWNhbENvbmZpZyA/IHVuZGVmaW5lZCA6IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUNvbmZpbmVkSWZFeGlzdHMoY29uZmlnRmlsZVBhdGgpO1xuICAgIGlmIChvbGRDb250ZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IG9sZENvbmZpZyA9IEJ1bi5ZQU1MLnBhcnNlKG9sZENvbnRlbnQpO1xuICAgICAgICAvLyBNZXJnZSBvbmx5IGEgbWFwcGluZzogZW1wdHksIGNvbW1lbnQtb25seSwgb3Igc2NhbGFyIFlBTUwgd291bGQgZWl0aGVyIHRocm93IGluXG4gICAgICAgIC8vIG1lcmdlLmFsbCBvciBwb2xsdXRlIHRoZSBjb25maWcgd2l0aCBpbmRleCBrZXlzLlxuICAgICAgICBpZiAob2xkQ29uZmlnICYmIHR5cGVvZiBvbGRDb25maWcgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KG9sZENvbmZpZykpIHtcbiAgICAgICAgICBuZXdDb25maWcgPSBtZXJnZS5hbGwoW25ld0NvbmZpZywgb2xkQ29uZmlnLCBuZXdDb25maWddLCB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH0pO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gZG8gbm90aGluZyAtIGZpbGUgY2FuJ3QgYmUgcGFyc2VkXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgeWFtbENvbnRlbnQgPSBCdW4uWUFNTC5zdHJpbmdpZnkobmV3Q29uZmlnLCB1bmRlZmluZWQsIDIpO1xuXG4gICAgY29uc3QgZXh0cmFDb250ZW50ID0gYXdhaXQgcmVhZEFnZW50c0V4dHJhQ29udGVudChjb25maWcuZGlyUGF0aCk7XG4gICAgY29uc3QgY29kaW5nUnVsZUV4dHJhQ29udGVudCA9IGV4dHJhQ29udGVudD8udHJpbVN0YXJ0KCkuc3RhcnRzV2l0aCgnIycpID8gdW5kZWZpbmVkIDogZXh0cmFDb250ZW50O1xuICAgIGNvbnN0IHN0eWxlZ3VpZGVDb250ZW50ID0gYFJldmlldyBpbiAke2dldERlZmF1bHRQcm9zZUxhbmd1YWdlKGNvbmZpZyl9IGJhc2VkIG9uIHRoZSBmb2xsb3dpbmcgY29kaW5nIHN0YW5kYXJkcy5cXG5cXG4ke2dlbmVyYXRlQWdlbnRDb2RpbmdTdHlsZShjb25maWcsIGFsbENvbmZpZ3MpfSR7XG4gICAgICBjb2RpbmdSdWxlRXh0cmFDb250ZW50ID8gYFxcbiR7Y29kaW5nUnVsZUV4dHJhQ29udGVudC50cmltRW5kKCl9YCA6ICcnXG4gICAgfWA7XG5cbiAgICBjb25zdCBwcm9taXNlcyA9IFtcbiAgICAgIC4uLihoYXNOb25DYW5vbmljYWxDb25maWcgPyBbXSA6IFtwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShjb25maWdGaWxlUGF0aCwgeWFtbENvbnRlbnQpKV0pLFxuICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoc3R5bGVndWlkZUZpbGVQYXRoLCBzdHlsZWd1aWRlQ29udGVudCkpLFxuICAgIF07XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICB9KTtcbn1cbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGdpdE91dHB1dE1heEJ1ZmZlciA9IDY0ICogMTAyNCAqIDEwMjQ7XG5cbi8vIGNmLiBodHRwczovL2J1bi5zaC9ndWlkZXMvaW5zdGFsbC9naXQtZGlmZi1idW4tbG9ja2ZpbGVcbi8vIGAuZ2l0aWdub3JlIC10ZXh0YCBrZWVwcyB0aGUgbWFjT1MgdGVtcGxhdGUncyBgSWNvblxcclxccmAgcnVsZSBpbnRhY3Q6IGB0ZXh0PWF1dG9gIG5vcm1hbGl6YXRpb25cbi8vIHN0cmlwcyBvbmUgQ1IgcGVyIGNoZWNraW4sIGRlZ3JhZGluZyB0aGUgcnVsZSB1bnRpbCBpdCBtYXRjaGVzIG5vdGhpbmcuXG5jb25zdCBuZXdDb250ZW50ID0gYCogdGV4dD1hdXRvXG5cbi5naXRpZ25vcmUgLXRleHRcblxuKi5sb2NrYiBiaW5hcnkgZGlmZj1sb2NrYlxuKi52Y3Byb2ogdGV4dCBlb2w9Y3JsZlxuXG4ke1suLi5leHRlbnNpb25zLmNvZGVXaXRoMkluZGVudFNpemUsIC4uLmV4dGVuc2lvbnMuY29kZVdpdGg0SW5kZW50U2l6ZSwgLi4uZXh0ZW5zaW9ucy5tYXJrZG93bkxpa2VdXG4gIC5tYXAoKGV4dCkgPT4gYCouJHtleHR9IHRleHQgZW9sPWxmYClcbiAgLmpvaW4oJ1xcbicpfVxuXG5kaXN0LyoqIGxpbmd1aXN0LWdlbmVyYXRlZD10cnVlXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlR2l0YXR0cmlidXRlcycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRhdHRyaWJ1dGVzJyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW5vcm1hbGl6ZVRyYWNrZWRUZXh0RmlsZXMoZGlyUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIGxldCBvdXRwdXQ6IHN0cmluZztcbiAgdHJ5IHtcbiAgICBvdXRwdXQgPSBjaGlsZF9wcm9jZXNzLmV4ZWNGaWxlU3luYygnZ2l0JywgWydscy1maWxlcycsICctLWVvbCcsICcteiddLCB7XG4gICAgICBjd2Q6IGRpclBhdGgsXG4gICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgICAgbWF4QnVmZmVyOiBnaXRPdXRwdXRNYXhCdWZmZXIsXG4gICAgICBzdGRpbzogWydpZ25vcmUnLCAncGlwZScsICdwaXBlJ10sXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS53YXJuKGBTa2lwcGVkIHRyYWNrZWQgbGluZS1lbmRpbmcgcmVub3JtYWxpemF0aW9uOiAkeyhlcnJvciBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICByZXR1cm47XG4gIH1cbiAgbGV0IHJlbm9ybWFsaXplZENvdW50ID0gMDtcbiAgZm9yIChjb25zdCByZWNvcmQgb2Ygb3V0cHV0LnNwbGl0KCdcXDAnKSkge1xuICAgIGNvbnN0IHNlcGFyYXRvckluZGV4ID0gcmVjb3JkLmluZGV4T2YoJ1xcdCcpO1xuICAgIGlmIChzZXBhcmF0b3JJbmRleCA9PT0gLTEpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgYXR0cmlidXRlcyA9IHJlY29yZC5zbGljZSgwLCBzZXBhcmF0b3JJbmRleCk7XG4gICAgaWYgKCEvXmlcXC8oPzpjcmxmfG1peGVkKVxccy91LnRlc3QoYXR0cmlidXRlcykgfHwgIS9hdHRyXFwvLipcXGJlb2w9KD86bGZ8Y3JsZikoPzpcXHN8JCkvdS50ZXN0KGF0dHJpYnV0ZXMpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCByZWxhdGl2ZVBhdGggPSByZWNvcmQuc2xpY2Uoc2VwYXJhdG9ySW5kZXggKyAxKTtcbiAgICBjb25zdCB0cmFja2VkRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgcmVsYXRpdmVQYXRoKTtcbiAgICBjb25zdCBzdGF0cyA9IGZzLmxzdGF0U3luYyh0cmFja2VkRmlsZVBhdGgsIHsgdGhyb3dJZk5vRW50cnk6IGZhbHNlIH0pO1xuICAgIGlmICghc3RhdHM/LmlzRmlsZSgpKSBjb250aW51ZTtcblxuICAgIC8vIEdpdCdzIHN0YXQgY2FjaGUgY2FuIGhpZGUgcHJlLWV4aXN0aW5nIENSTEYgYmxvYnMgYWZ0ZXIgd2JmeSBpbnRyb2R1Y2VzIHRleHQgYXR0cmlidXRlcy5cbiAgICAvLyBOb3JtYWxpemUgYnl0ZXMgaW4gdGhlIHdvcmt0cmVlIHNvIHRoZSBjYWxsZXIncyBub3JtYWwgYGdpdCBhZGQgLUFgIHJlY29yZHMgdGhlIGNhbm9uaWNhbFxuICAgIC8vIGJsb2I7IHRoaXMgYWxzbyBwcmV2ZW50cyBQcmV0dGllcidzIG1ldGFkYXRhIGNhY2hlIGZyb20gc2tpcHBpbmcgdGhlIG5ld2x5IGNoYW5nZWQgZmlsZS5cbiAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHRyYWNrZWRGaWxlUGF0aCk7XG4gICAgZnMud3JpdGVGaWxlU3luYyh0cmFja2VkRmlsZVBhdGgsIEJ1ZmZlci5mcm9tKGNvbnRlbnQudG9TdHJpbmcoJ2JpbmFyeScpLnJlcGxhY2VBbGwoJ1xcclxcbicsICdcXG4nKSwgJ2JpbmFyeScpKTtcbiAgICByZW5vcm1hbGl6ZWRDb3VudCsrO1xuICB9XG4gIGlmIChyZW5vcm1hbGl6ZWRDb3VudCA+IDApIHtcbiAgICBjb25zb2xlLmluZm8oYFJlbm9ybWFsaXplZCBsaW5lIGVuZGluZ3MgaW4gJHtyZW5vcm1hbGl6ZWRDb3VudH0gdHJhY2tlZCBmaWxlKHMpLmApO1xuICB9XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgb3MgZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4uL29wdGlvbnMuanMnO1xuaW1wb3J0IHsgY29uc3VtZXNHZW5lcmF0ZWRXb3JrZXJUeXBlcywgZ2VuZXJhdGVzV29ya2VyVHlwZXMsIHR5cGUgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbi8vIERvIG5vdCByZW1vdmUgYHdpbmRvd3NgOiBnZW5lcmF0ZWQgLmdpdGlnbm9yZSBmaWxlcyBtdXN0IGtlZXAgaWdub3JpbmcgV2luZG93cy1jcmVhdGVkIGxvY2FsIGFydGlmYWN0cy5cbmNvbnN0IGRlZmF1bHROYW1lcyA9IFsnd2luZG93cycsICdtYWNvcycsICdsaW51eCcsICdqZXRicmFpbnMnLCAndmlzdWFsc3R1ZGlvY29kZScsICdlbWFjcycsICd2aW0nLCAneWFybiddO1xuXG5jb25zdCBjb21tb25Db250ZW50ID0gYFxuX19nZW5lcmF0ZWRfXy9cbiEua2VlcFxuLmFpZGVyKlxuLmFudGlncmF2aXR5Y2xpL1xuLmNsYXVkZS8qLmxvY2FsLipcbi5jbGF1ZGUvc2NoZWR1bGVkX3Rhc2tzLmxvY2tcbi5kZXZjb250YWluZXIvXG4uZG9ja2VyLmVudlxuLmVudipcbi5pZGVhL0F1Z21lbnRXZWJ2aWV3U3RhdGVTdG9yZS54bWxcbi5pZGVhL2NvcGlsb3QuKlxuLmlkZWEvY29waWxvdC9jaGF0U2Vzc2lvbnMvXG4ucGxheXdyaWdodC1jbGkvXG4ucGxheXdyaWdodC1tY3AvXG4uc2VyZW5hL1xuLnRtcC9cbi50bXAtKi9cbi50b2tlbnNhdmUvXG4ud2IvXG5Ad2lsbGJvb3N0ZXIvXG5Ad2lsbGJvb3N0ZXItcHJpdmF0ZS9cbiovbW91bnQvKi5oYXNoXG5DTEFVREUubG9jYWwubWRcbmRpc3QvXG5kcml6emxlL21vdW50L1xudGVtcC9cbnRtcC9cbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUdpdGlnbm9yZShjb25maWc6IFBhY2thZ2VDb25maWcsIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdpdGlnbm9yZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRpZ25vcmUnKTtcbiAgICBjb25zdCBjb250ZW50ID0gKGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKSkgPz8gJyc7XG4gICAgbGV0IGhlYWRVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldEhlYWRVc2VyQ29udGVudChjb250ZW50KSArIGNvbW1vbkNvbnRlbnQ7XG4gICAgY29uc3QgdGFpbFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0VGFpbFVzZXJDb250ZW50KGNvbnRlbnQpO1xuXG4gICAgY29uc3QgbmFtZXMgPSBbLi4uZGVmYXVsdE5hbWVzXTtcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluR2VtZmlsZSkge1xuICAgICAgbmFtZXMucHVzaCgncnVieScpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluR29Nb2QpIHtcbiAgICAgIG5hbWVzLnB1c2goJ2dvJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYCR7cGF0aC5iYXNlbmFtZShjb25maWcuZGlyUGF0aCl9XG5gO1xuICAgIH1cbiAgICAvLyBFdmVyeSBhY2NlcHRlZCByZXBvc2l0b3J5IHJvb3QgcmVjZWl2ZXMgYSBtYW5hZ2VkIHBhY2thZ2UuanNvbiBsYXRlciBpbiB0aGUgc2FtZSBydW4sIHNvIGl0c1xuICAgIC8vIGRlcGVuZGVuY3kgdHJlZSBtdXN0IGJlIGlnbm9yZWQgZXZlbiB3aGVuIHRoZSBtYW5pZmVzdCBkaWQgbm90IGV4aXN0IGF0IGNvbmZpZy1kZXRlY3Rpb24gdGltZS5cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24gfHwgY29uZmlnLmlzUm9vdCkge1xuICAgICAgbmFtZXMucHVzaCgnbm9kZScpO1xuICAgIH1cbiAgICAvLyBSZWN1cnNpdmUgZGV0ZWN0aW9uIChub3QganVzdCBhIHJvb3QgcG9tLnhtbCk6IGEgbXVsdGktbGFuZ3VhZ2UgcmVwb3NpdG9yeSBrZWVwcyBpdHMgTWF2ZW5cbiAgICAvLyBtb2R1bGVzIGluIHN1YmRpcmVjdG9yaWVzLCBhbmQgZHJvcHBpbmcgdGhlIG1hdmVuIHRlbXBsYXRlIHdvdWxkIGxldCB0YXJnZXQvIGdldCB0cmFja2VkLlxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb21YbWxBbnl3aGVyZSkge1xuICAgICAgbmFtZXMucHVzaCgnbWF2ZW4nKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLmlkZWEvZ29vZ2xlLWphdmEtZm9ybWF0LnhtbFxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBuYW1lcy5wdXNoKCdmbHV0dGVyJywgJ0FuZHJvaWRTdHVkaW8nLCAncnVieScpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuZmx1dHRlci1wbHVnaW5zLWRlcGVuZGVuY2llc1xuYW5kcm9pZC9rZXkucHJvcGVydGllc1xuaW9zLy5idW5kbGVcbi5pZGVhL3J1bkNvbmZpZ3VyYXRpb25zLnhtbFxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblRlbXBsYXRlWWFtbCkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuYXdzLXNhbS9cbnBhY2thZ2VkLnlhbWxcbmA7XG4gICAgfVxuICAgIC8vIEJlY2F1c2UgLnZlbnYgc2hvdWxkIGJlIGlnbm9yZWQgb24gcm9vdCBkaXJlY3RvcnkuIFJlY3Vyc2l2ZSBkZXRlY3Rpb24gKG5vdCBqdXN0IGEgcm9vdFxuICAgIC8vIGxvY2tmaWxlKTogYSBtdWx0aS1sYW5ndWFnZSByZXBvc2l0b3J5IGtlZXBzIFB5dGhvbiBkaXJlY3RvcmllcyBpbiBzdWJkaXJlY3RvcmllcywgYW5kXG4gICAgLy8gZHJvcHBpbmcgdGhlIHB5dGhvbiB0ZW1wbGF0ZSB3b3VsZCBsZXQgX19weWNhY2hlX18vIGFuZCAudmVudi8gZ2V0IHRyYWNrZWQuXG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB5dGhvbkxvY2tBbnl3aGVyZSkge1xuICAgICAgbmFtZXMucHVzaCgncHl0aG9uJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC52ZW52L1xuYDtcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eikge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuYmxpdHovXG4uYmxpdHoqKlxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgbmFtZXMucHVzaCgnbmV4dGpzJyk7XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5maXJlYmFzZSB8fCBjb25maWcuZGVwZW5kaW5nLmZpcmViYXNlKSB7XG4gICAgICBuYW1lcy5wdXNoKCdmaXJlYmFzZScpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEgfHwgY29uZmlnLmRlcGVuZGluZy5kcml6emxlKSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYCouc3FsaXRlMypcbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRUZXN0KSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYHBsYXl3cmlnaHQtcmVwb3J0L1xudGVzdC1yZXN1bHRzL1xuYDtcbiAgICB9XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlIHx8IGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICAgIG5hbWVzLnB1c2goJ3JlYWN0bmF0aXZlJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYGdvb2dsZS1zZXJ2aWNlcy5qc29uXG5hbmRyb2lkL2FwcC9zcmMvbWFpbi9hc3NldHMvXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5zdG9yeWJvb2spIHtcbiAgICAgIG5hbWVzLnB1c2goJ3N0b3J5Ym9va2pzJyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnRhdXJpKSB7XG4gICAgICBuYW1lcy5wdXNoKCdydXN0Jyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5UYXVyaUNvbmZpZykge1xuICAgICAgLy8gIUNhcmdvLmxvY2sgb3ZlcnJpZGVzIGFueSBwcmUtZXhpc3RpbmcgdW5hbmNob3JlZCBDYXJnby5sb2NrIHJ1bGUgZnJvbSBhXG4gICAgICAvLyBwYXJlbnQgLmdpdGlnbm9yZSwgc28gdGhlIGFwcGxpY2F0aW9uIGxvY2tmaWxlIHN0YXlzIGNvbW1pdHRhYmxlLlxuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAhQ2FyZ28ubG9ja1xuc3JjLXRhdXJpL2dlbi9zY2hlbWFzL1xuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubGl0ZXN0cmVhbSkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGBnY3Atc2Eta2V5Lmpzb25cbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuaXNDbG91ZGZsYXJlIHx8IHJvb3RDb25maWcuaXNDbG91ZGZsYXJlKSB7XG4gICAgICAvLyAuZGV2LnZhcnMqIGhvbGQgbG9jYWwgc2VjcmV0cyBmb3Igd3JhbmdsZXIgZGV2IGFuZCBtdXN0IG5ldmVyIGJlIGNvbW1pdHRlZC5cbiAgICAgIC8vIC5lbnYuY2xvdWRmbGFyZSBjYXJyaWVzIENMT1VERkxBUkVfQVBJX1RPS0VOOiBDSSB3cml0ZXMgaXQgZnJvbSBhIHNlY3JldCwgYW5kIGEgbG9jYWxcbiAgICAgIC8vIGB3YiBkZXBsb3lgIG5lZWRzIGEgcmVhbCB0b2tlbiBpbiBpdCwgc28gY29tbWl0dGluZyBpdCB3b3VsZCBsZWFrIGFjY291bnQgY3JlZGVudGlhbHMuXG4gICAgICAvLyBJdCBpcyBsaXN0ZWQgZXhwbGljaXRseSBzbyB0aGUgQ2xvdWRmbGFyZS1zcGVjaWZpYyBjcmVkZW50aWFsIHBvbGljeSByZW1haW5zIHZpc2libGUuXG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5kZXYudmFycypcbi5lbnYuY2xvdWRmbGFyZVxuLndyYW5nbGVyL1xuYDtcbiAgICB9XG4gICAgLy8gSWdub3JlZCBvbmx5IHdoZXJlIHBvc3RpbnN0YWxsIHJlZ2VuZXJhdGVzIGl0LCBzbyB3YmZ5IG5ldmVyIGlnbm9yZXMgYSBmaWxlIHRoYXQgbm90aGluZyByZWNyZWF0ZXMuIFRoaXMga2VlcHNcbiAgICAvLyBpdHMgdGhvdXNhbmRzIG9mIGxpbmVzIG91dCBvZiBldmVyeSB3cmFuZ2xlciBidW1wJ3MgZGlmZi4gQW5jaG9yZWQgd2l0aCBhIGxlYWRpbmcgc2xhc2ggYmVjYXVzZSBgd3JhbmdsZXIgdHlwZXNgXG4gICAgLy8gYW5kIHRoZSBvcHQtb3V0IGRlbGV0aW9uIGJlbG93IG9ubHkgZXZlciB0b3VjaCB0aGlzIHBhY2thZ2UncyBvd24gZmlsZSwgbm90IGEgbmVzdGVkIG9uZSBhdCBhbnkgZGVwdGguXG4gICAgaWYgKGdlbmVyYXRlc1dvcmtlclR5cGVzKGNvbmZpZykpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgL3dvcmtlci1jb25maWd1cmF0aW9uLmQudHNcbmA7XG4gICAgfSBlbHNlIGlmIChjb25maWcuZG9lc0NvbnRhaW5XcmFuZ2xlckNvbmZpZyAmJiAhY29uc3VtZXNHZW5lcmF0ZWRXb3JrZXJUeXBlcyhjb25maWcpKSB7XG4gICAgICAvLyBPbiBhIGdlbnVpbmUgd29ya2VyLXR5cGVzIG9wdC1vdXQgKG5vdGhpbmcgY29uc3VtZXMgdGhlIGdlbmVyYXRlZCBmaWxlOyBnZW5lcmF0ZXNXb3JrZXJUeXBlc1xuICAgICAgLy8gYWxvbmUgaXMgZmFsc2UgZm9yIHVucmVsYXRlZCByZWFzb25zIHN1Y2ggYXMgYSBtaXNzaW5nIGxvY2FsIHdyYW5nbGVyIGRlcGVuZGVuY3ksIHdoZXJlIHRoZVxuICAgICAgLy8gZmlsZSBtYXkgc3RpbGwgYmUgY29uc3VtZWQpIHRoZSBpZ25vcmUgcnVsZVxuICAgICAgLy8gYWJvdmUgZGlzYXBwZWFycywgc28gYW4gYWxyZWFkeS1nZW5lcmF0ZWQgZmlsZSB3b3VsZCBzdXJmYWNlIGFzIHVudHJhY2tlZCBub2lzZSBvbiBldmVyeVxuICAgICAgLy8gY2hlY2tvdXQg4oCUIGRlbGV0ZSBpdC4gTm8gcmVwb3NpdG9yeSB0cmFja3MgdGhlIGZpbGUgKGRvY3MvZXhwZWN0ZWQtcmVwb3NpdG9yeS1ydWxlcy5tZCksXG4gICAgICAvLyBzbyBhbiBleGlzdGluZyBjb3B5IGlzIGFsd2F5cyBhIGRpc3Bvc2FibGUgZ2VuZXJhdGVkIG9uZS5cbiAgICAgIGNvbnN0IHdvcmtlclR5cGVzUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3dvcmtlci1jb25maWd1cmF0aW9uLmQudHMnKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKHdvcmtlclR5cGVzUGF0aCkpIHtcbiAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHdvcmtlclR5cGVzUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy52aW5leHQgfHwgY29uZmlnLmRlcGVuZGluZy52aW5leHQpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLnZpbmV4dC9cbmA7XG4gICAgfVxuXG4gICAgbGV0IGdlbmVyYXRlZCA9ICcnO1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykge1xuICAgICAgbGV0IGNvbnRlbnQgPSAoYXdhaXQgcmVhZENhY2hlKG5hbWUpKSA/PyAnJztcbiAgICAgIGlmICghY29udGVudCkge1xuICAgICAgICBjb25zdCB1cmwgPSBgaHR0cHM6Ly93d3cudG9wdGFsLmNvbS9kZXZlbG9wZXJzL2dpdGlnbm9yZS9hcGkvJHtuYW1lfWA7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsKTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2VUZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgICBpZiAoIXJlc3BvbnNlLm9rIHx8IHJlc3BvbnNlVGV4dC5pbmNsdWRlcygnQXR0ZW50aW9uIFJlcXVpcmVkIScpIHx8IHJlc3BvbnNlVGV4dC5pbmNsdWRlcygnPHRpdGxlPicpKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGZldGNoICR7dXJsfWApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb250ZW50ID0gcmVzcG9uc2VUZXh0LnRyaW0oKTtcbiAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IHdyaXRlQ2FjaGUobmFtZSwgY29udGVudCkpO1xuICAgICAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oYEZldGNoZWQgJHt1cmx9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChnZW5lcmF0ZWQpIGdlbmVyYXRlZCArPSAnXFxuJztcbiAgICAgIGdlbmVyYXRlZCArPSBjb250ZW50ICsgJ1xcbic7XG4gICAgfVxuICAgIGlmICghKGF3YWl0IGlnbm9yZUZpbGVVdGlsLmlzQmVycnlaZXJvSW5zdGFsbEVuYWJsZWQoZmlsZVBhdGgpKSkge1xuICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2UoJyEueWFybi9jYWNoZScsICcjICEueWFybi9jYWNoZScpLnJlcGxhY2UoJyMgLnBucC4qJywgJy5wbnAuKicpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9tWG1sQW55d2hlcmUgfHwgY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZFxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9hcnRpZmFjdHMkL2dtLCAnLmlkZWEvYXJ0aWZhY3RzJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvY29tcGlsZXIueG1sJC9nbSwgJy5pZGVhL2NvbXBpbGVyLnhtbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL2phclJlcG9zaXRvcmllcy54bWwkL2dtLCAnLmlkZWEvamFyUmVwb3NpdG9yaWVzLnhtbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL21vZHVsZXMueG1sJC9nbSwgJy5pZGVhL21vZHVsZXMueG1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvKi5pbWwkL2dtLCAnLmlkZWEvKi5pbWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9tb2R1bGVzJC9nbSwgJy5pZGVhL21vZHVsZXMnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgKi5pbWwkL2dtLCAnKi5pbWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgKi5pcHIkL2dtLCAnKi5pcHInKTtcbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZUFsbCgvXi5pZGVhXFwvbW9kdWxlcy54bWwkL2dtLCAnIyAuaWRlYS9tb2R1bGVzLnhtbCcpO1xuICAgICAgfVxuICAgIH1cbiAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZUFsbCgvXi5pZGVhXFwvPyQvZ20sICcjIC5pZGVhJyk7XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcudGF1cmkpIHtcbiAgICAgIC8vIFRoZSBydXN0IHRlbXBsYXRlJ3MgdW5hbmNob3JlZCBkZWJ1Zy8gd291bGQgYWxzbyBoaWRlIGZyb250ZW5kIHNvdXJjZVxuICAgICAgLy8gZGlyZWN0b3JpZXMgc3VjaCBhcyBzcmMvZGVidWcvOyBjYXJnbyBvdXRwdXQgaXMgYWxyZWFkeSBjb3ZlcmVkIGJ5IHRhcmdldC8uXG4gICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZUFsbCgvXmRlYnVnXFwvJC9nbSwgJyMgZGVidWcvJyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5UYXVyaUNvbmZpZyB8fCBjb25maWcuZG9lc0NvbnRhaW5UYXVyaUNvbmZpZ0luUGFja2FnZXMpIHtcbiAgICAgIC8vIFRoZSBydXN0IHRlbXBsYXRlIGlnbm9yZXMgQ2FyZ28ubG9jaywgYnV0IGEgc3JjLXRhdXJpIGNvbmZpZ3VyYXRpb24gbWFya3MgYW5cbiAgICAgIC8vIGFwcGxpY2F0aW9uLCB3aG9zZSBDYXJnby5sb2NrIG11c3QgYmUgY29tbWl0dGVkIGZvciByZXByb2R1Y2libGUgYnVpbGRzLiBUaGVcbiAgICAgIC8vIHJ1bGUgaXMgYWxzbyBkaXNhYmxlZCB3aGVuIGEgc3ViIHBhY2thZ2UgY29udGFpbnMgYSBUYXVyaSBhcHBsaWNhdGlvbiwgYmVjYXVzZVxuICAgICAgLy8gYW4gdW5hbmNob3JlZCBDYXJnby5sb2NrIHJ1bGUgaW4gYSBwYXJlbnQgLmdpdGlnbm9yZSB3b3VsZCBoaWRlIHRoZSBuZXN0ZWRcbiAgICAgIC8vIGFwcGxpY2F0aW9uJ3MgbG9ja2ZpbGUuIFRhdXJpIHBsdWdpbiBsaWJyYXJpZXMgKGRldGVjdGVkIG9ubHkgdmlhXG4gICAgICAvLyBAdGF1cmktYXBwcy8qIGRlcGVuZGVuY2llcykga2VlcCB0aGUgdGVtcGxhdGUncyBwb2xpY3kgb2YgaWdub3JpbmcgQ2FyZ28ubG9jay5cbiAgICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZC5yZXBsYWNlQWxsKC9eQ2FyZ29cXC5sb2NrJC9nbSwgJyMgQ2FyZ28ubG9jaycpO1xuICAgIH1cbiAgICBpZiAocm9vdENvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUgfHwgY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSB8fCBjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2VBbGwoL14oLmlkZWFcXC8uKykkL2dtLCAnJDFcXG5hbmRyb2lkLyQxJyk7XG4gICAgfVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBoZWFkVXNlckNvbnRlbnQgKyAnXFxuJyArIGdlbmVyYXRlZCArIHRhaWxVc2VyQ29udGVudDtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuY29uc3QgZGlyUGF0aCA9IHBhdGguam9pbihvcy5ob21lZGlyKCksICcuY2FjaGUnLCAnd2JmeScsICdnaXRpZ25vcmUnKTtcblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVDYWNoZShuYW1lOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihkaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGguam9pbihkaXJQYXRoLCBuYW1lKSwgY29udGVudCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRDYWNoZShuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IHN0YXQgPSBhd2FpdCBmcy5wcm9taXNlcy5zdGF0KHBhdGguam9pbihkaXJQYXRoLCBuYW1lKSk7XG4gICAgaWYgKERhdGUubm93KCkgLSBzdGF0Lm10aW1lTXMgPiA2ICogNjAgKiA2MCAqIDEwMDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHBhdGguam9pbihkaXJQYXRoLCBuYW1lKSwgJ3V0ZjgnKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IGZpbGVVUkxUb1BhdGggfSBmcm9tICdub2RlOnVybCc7XG5cbi8qKlxuICogVGhlIHZlcnNpb24gd2JmeSdzIG93biBwYWNrYWdlLmpzb24gY2FycmllcyBpbiB0aGUgcmVwb3NpdG9yeS4gYEBzZW1hbnRpYy1yZWxlYXNlL25wbWAgcmV3cml0ZXNcbiAqIGl0IGluIHRoZSBwdWJsaXNoZWQgdGFyYmFsbCBvbmx5IChpdCBpcyBuZXZlciBjb21taXR0ZWQgYmFjayksIHNvIGEgd2JmeSBydW4gc3RhcnRlZCBmcm9tIGEgZ2l0XG4gKiBjaGVja291dCByZXBvcnRzIHRoaXMgcGxhY2Vob2xkZXIgaW5zdGVhZCBvZiBhIHJlYWwgdmVyc2lvbi5cbiAqL1xuY29uc3QgdW5yZWxlYXNlZFZlcnNpb25QcmVmaXggPSAnMC4wLjAtJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFdiZnlWZXJzaW9uKCk6IHN0cmluZyB7XG4gIHJldHVybiByZWFkV2JmeVBhY2thZ2VKc29uKCkudmVyc2lvbjtcbn1cblxuLyoqIHdiZnkncyBsb2NhdGlvbiBpbnNpZGUgaXRzIG93biByZXBvc2l0b3J5LCByZWxhdGl2ZSB0byB0aGUgcmVwb3NpdG9yeSByb290LiAqL1xuY29uc3Qgd2JmeURpclBhdGhJblJlcG8gPSBwYXRoLmpvaW4oJ3BhY2thZ2VzJywgJ3diZnknKTtcblxuLyoqXG4gKiBJZGVudGlmaWVzIHRoZSB3YmZ5IGJ1aWxkIHRoYXQgcHJvZHVjZWQgdGhlIGdlbmVyYXRlZCBmaWxlczogdGhlIHJlbGVhc2VkIHZlcnNpb24sIG9yXG4gKiBgPHNob3J0IGNvbW1pdCBoYXNoPlstZGlydHldLWxvY2FsYCB3aGVuIHdiZnkgcnVucyBmcm9tIGl0cyBvd24gZ2l0IGNoZWNrb3V0LiBVbmRlZmluZWQgd2hlblxuICogbmVpdGhlciBpcyBhdmFpbGFibGUgKGUuZy4gYW4gdW5yZWxlYXNlZCBidWlsZCBleHRyYWN0ZWQgZnJvbSBhIHNvdXJjZSBhcmNoaXZlKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFdiZnlWZXJzaW9uTGFiZWwoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgLy8gTmVpdGhlciB0aGUgaW5zdGFsbGVkIHBhY2thZ2UuanNvbiBub3IgdGhlIGdpdCBzdGF0ZSBvZiB3YmZ5J3Mgb3duIGNoZWNrb3V0IGNhbiBjaGFuZ2VcbiAgLy8gbWlkLXJ1biwgYW5kIGNvbXB1dGluZyB0aGUgbGFiZWwgc3Bhd25zIHNldmVyYWwgZ2l0IHN1YnByb2Nlc3Nlcywgc28gaXQgaXMgY29tcHV0ZWQgb25jZS5cbiAgaWYgKCFoYXNDb21wdXRlZFZlcnNpb25MYWJlbCkge1xuICAgIGNhY2hlZFZlcnNpb25MYWJlbCA9IGNvbXB1dGVXYmZ5VmVyc2lvbkxhYmVsKCk7XG4gICAgaGFzQ29tcHV0ZWRWZXJzaW9uTGFiZWwgPSB0cnVlO1xuICB9XG4gIHJldHVybiBjYWNoZWRWZXJzaW9uTGFiZWw7XG59XG5cbmxldCBoYXNDb21wdXRlZFZlcnNpb25MYWJlbCA9IGZhbHNlO1xubGV0IGNhY2hlZFZlcnNpb25MYWJlbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBjb21wdXRlV2JmeVZlcnNpb25MYWJlbCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCB7IG5hbWUsIHZlcnNpb24sIGRpclBhdGggfSA9IHJlYWRXYmZ5UGFja2FnZUpzb24oKTtcbiAgaWYgKCF2ZXJzaW9uLnN0YXJ0c1dpdGgodW5yZWxlYXNlZFZlcnNpb25QcmVmaXgpKSByZXR1cm4gdmVyc2lvbjtcblxuICAvLyBnaXQgcmVzb2x2ZXMgdGhlIE5FQVJFU1QgZW5jbG9zaW5nIHJlcG9zaXRvcnksIHdoaWNoIGZvciBhbiB1bnJlbGVhc2VkIGJ1aWxkIHBsYWNlZCB1bmRlciBhXG4gIC8vIHRhcmdldCByZXBvc2l0b3J5IChub2RlX21vZHVsZXMsIG9yIGEgdmVuZG9yZWQvZXh0cmFjdGVkIHNvdXJjZSB0cmVlKSBpcyB0aGF0IHJlcG9zaXRvcnkg4oCUIGl0c1xuICAvLyBjb21taXQgc2F5cyBub3RoaW5nIGFib3V0IHRoZSB3YmZ5IGJ1aWxkIHRoYXQgcmFuLiBPbmx5IHdiZnkncyBvd24gbG9jYXRpb24gaW5zaWRlIGl0cyBvd25cbiAgLy8gcmVwb3NpdG9yeSBpZGVudGlmaWVzIGEgZ2VudWluZSBjaGVja291dCwgc28gYW55dGhpbmcgZWxzZSBmYWxscyBiYWNrIHRvIHRoZSB2ZXJzaW9uLWxlc3MgbGFiZWwuXG4gIGNvbnN0IGdpdFJvb3REaXJQYXRoID0gcnVuR2l0KFsncmV2LXBhcnNlJywgJy0tc2hvdy10b3BsZXZlbCddLCBkaXJQYXRoKTtcbiAgaWYgKFxuICAgICFnaXRSb290RGlyUGF0aCB8fFxuICAgIHBhdGgucmVsYXRpdmUoZ2l0Um9vdERpclBhdGgsIGRpclBhdGgpICE9PSB3YmZ5RGlyUGF0aEluUmVwbyB8fFxuICAgICFpc1diZnlSZXBvc2l0b3J5KGdpdFJvb3REaXJQYXRoKVxuICApIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGNvbnN0IGNvbW1pdEhhc2ggPSBydW5HaXQoWydyZXYtcGFyc2UnLCAnLS1zaG9ydD04JywgJ0hFQUQnXSwgZGlyUGF0aCk7XG4gIGlmICghY29tbWl0SGFzaCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgLy8gVGhlIGNvbW1pdCBhbG9uZSB3b3VsZCBtaXNpZGVudGlmeSBhIGJ1aWxkIG1hZGUgZnJvbSBhbiBlZGl0ZWQgY2hlY2tvdXQsIHNvIHVuY29tbWl0dGVkIGNoYW5nZXNcbiAgLy8gYXJlIHJlcG9ydGVkIHRvbyDigJQgYnV0IG9ubHkgdW5kZXIgcGFja2FnZXMvKi9zcmMsIHBhY2thZ2VzLyovYmluIGFuZCBwYWNrYWdlcy8qL2NvbmZpZ3MsIHRoZVxuICAvLyBzb3VyY2UsIGVudHJ5LXBvaW50IHdyYXBwZXIgYW5kIHBvbGljeSBmaWxlcyB3YmZ5IGFuZCBpdHMgd29ya3NwYWNlIGRlcGVuZGVuY2llcyBhY3R1YWxseSBydW5cbiAgLy8gZnJvbS4gRXZlcnl0aGluZyB3YmZ5IEdFTkVSQVRFUyB3aGVuIGl0IHRhcmdldHMgaXRzIG93biByZXBvc2l0b3J5IGxpdmVzIG91dHNpZGUgdGhvc2UgKHRoZVxuICAvLyByb290IFJFQURNRSB0aGlzIGxhYmVsIGdvZXMgaW50bywgYW5kIGVhY2ggcGFja2FnZSdzIC5naXRpZ25vcmUsIHBhY2thZ2UuanNvbiwgdHNjb25maWcsIOKApiksIHNvXG4gIC8vIGEgZmlyc3QgcnVuIGNhbm5vdCBtYWtlIHRoZSBuZXh0IG9uZSByZWxhYmVsIHRoZSBiYWRnZSBgLWRpcnR5LWxvY2FsYCBieSBpdHNlbGYuXG4gIC8vIE1hbmlmZXN0cyBzdGF5IG91dCBvbiBwdXJwb3NlLCBldmVuIHRob3VnaCBhbiBlZGl0ZWQgYGV4cG9ydHNgIG1hcCBjYW4gcmVkaXJlY3Qgd2hpY2ggY29kZVxuICAvLyBsb2Fkczogd2JmeSBHRU5FUkFURVMgcGFja2FnZS5qc29uLCBzbyBpbmNsdWRpbmcgaXQgd291bGQgbWFrZSBldmVyeSBydW4gcmVwb3J0IGl0c2VsZiBkaXJ0eS5cbiAgLy8gVGhlIGxhYmVsIGlzIGJlc3QtZWZmb3J0IGJ1aWxkIHByb3ZlbmFuY2UsIG5vdCBhIHJlcHJvZHVjaWJsZS1idWlsZCBhdHRlc3RhdGlvbi5cbiAgY29uc3QgaXNEaXJ0eSA9IGdldEdpdERpcnR5U3RhdGUoZ2l0Um9vdERpclBhdGgpO1xuICBpZiAoaXNEaXJ0eSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAoaXNEaXJ0eSkgcmV0dXJuIGAke2NvbW1pdEhhc2h9LWRpcnR5LWxvY2FsYDtcbiAgLy8gQW4gdW5tb2RpZmllZCBjaGVja291dCBzaXR0aW5nIG9uIGEgcmVsZWFzZSB0YWcgcnVucyBleGFjdGx5IHRoZSBjb2RlIHRoYXQgd2FzIHB1Ymxpc2hlZCB1bmRlclxuICAvLyB0aGF0IHZlcnNpb24sIHNvIGl0IGlzIGxhYmVsZWQgd2l0aCB0aGUgdmVyc2lvbiBpbnN0ZWFkIG9mIHRoZSBjb21taXQgdGhhdCBvbmx5IHdiZnkgZGV2ZWxvcGVyc1xuICAvLyBjb3VsZCByZXNvbHZlIGJhY2sgdG8gb25lLlxuICByZXR1cm4gZmluZFJlbGVhc2VkVmVyc2lvbkF0SGVhZChuYW1lLCBkaXJQYXRoKSA/PyBgJHtjb21taXRIYXNofS1sb2NhbGA7XG59XG5cbi8qKiBgQHNlbWFudGljLXJlbGVhc2UvbnBtYCB0YWdzIGVhY2ggcmVsZWFzZSBgPHBhY2thZ2UgbmFtZT5APHZlcnNpb24+YC4gKi9cbmZ1bmN0aW9uIGZpbmRSZWxlYXNlZFZlcnNpb25BdEhlYWQocGFja2FnZU5hbWU6IHN0cmluZywgY3dkOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCB0YWdQcmVmaXggPSBgJHtwYWNrYWdlTmFtZX1AYDtcbiAgLy8gQSBjb21taXQgY2FycmllcyBhdCBtb3N0IG9uZSByZWxlYXNlIHRhZyBwZXIgcGFja2FnZSwgc28gdGhlIGZpcnN0IG1hdGNoIGlzIHRoZSBvbmx5IG1hdGNoLlxuICByZXR1cm4gcnVuR2l0KFsndGFnJywgJy0tcG9pbnRzLWF0JywgJ0hFQUQnXSwgY3dkKVxuICAgID8uc3BsaXQoJ1xcbicpXG4gICAgLmZpbmQoKHRhZykgPT4gdGFnLnN0YXJ0c1dpdGgodGFnUHJlZml4KSlcbiAgICA/LnNsaWNlKHRhZ1ByZWZpeC5sZW5ndGgpO1xufVxuXG5mdW5jdGlvbiBpc1diZnlSZXBvc2l0b3J5KGdpdFJvb3REaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgLy8gRXZlcnkgcmVtb3RlIGNvdW50cywgbm90IGp1c3QgYG9yaWdpbmA6IGEgZm9yayBjaGVja291dCBjYXJyaWVzIHRoZSBjYW5vbmljYWwgcmVwb3NpdG9yeSBhc1xuICAvLyBgdXBzdHJlYW1gLCBhbmQgaXQgaXMgc3RpbGwgYSBnZW51aW5lIHdiZnkgY2hlY2tvdXQgd2hvc2UgY29tbWl0IGlkZW50aWZpZXMgdGhlIGJ1aWxkLlxuICBjb25zdCByZW1vdGVVcmxzID0gcnVuR2l0KFsncmVtb3RlJywgJy12J10sIGdpdFJvb3REaXJQYXRoKTtcbiAgcmV0dXJuICEhcmVtb3RlVXJscz8uc3BsaXQoJ1xcbicpLnNvbWUoKGxpbmUpID0+IGlzQ2Fub25pY2FsUmVtb3RlVXJsKGxpbmUuc3BsaXQoL1sgXFx0XSsvdSlbMV0gPz8gJycpKTtcbn1cblxuY29uc3QgY2Fub25pY2FsUmVwb3NpdG9yeVBhdGggPSAvXlxcLz9XaWxsQm9vc3RlclxcL3NoYXJlZCg/OlxcLmdpdCk/JC9pdTtcblxuLyoqXG4gKiBXaGV0aGVyIHRoZSByZW1vdGUgVVJMIHBvaW50cyBhdCB3YmZ5J3Mgb3duIHJlcG9zaXRvcnkuIFRoZSBob3N0IGlzIGNvbXBhcmVkIGFmdGVyIFBBUlNJTkcgcmF0aGVyXG4gKiB0aGFuIG1hdGNoZWQgaW5zaWRlIHRoZSBzdHJpbmc6IGFueSBwYXR0ZXJuIGxvb3NlIGVub3VnaCB0byBhY2NlcHQgZXZlcnkgVVJMIGZvcm0gZ2l0IHN1cHBvcnRzXG4gKiBhbHNvIGFjY2VwdGVkIGEgbG9va2FsaWtlIHRoYXQgbWVyZWx5IGNvbnRhaW5zIHRoZSBob3N0LCBzdWNoIGFzXG4gKiBgaHR0cHM6Ly9ldmlsLmV4YW1wbGUvL2dpdGh1Yi5jb20vV2lsbEJvb3N0ZXIvc2hhcmVkLmdpdGAsIGxldHRpbmcgYW4gdW5yZWxhdGVkIGNoZWNrb3V0IGNsYWltIHRvXG4gKiBiZSBhIGdlbnVpbmUgd2JmeSBidWlsZC5cbiAqL1xuZnVuY3Rpb24gaXNDYW5vbmljYWxSZW1vdGVVcmwodXJsOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgLy8gc2NwLXN0eWxlIChgZ2l0QGdpdGh1Yi5jb206V2lsbEJvb3N0ZXIvc2hhcmVkLmdpdGApIGlzIG5vdCBhIFVSTCwgc28gaXQgaXMgbWF0Y2hlZCBzZXBhcmF0ZWx5LlxuICAvLyBUaGUgbG9va2FoZWFkIGtlZXBzIGEgc2NoZW1lJ3MgYDovL2AgZnJvbSBiZWluZyByZWFkIGFzIHRoZSBgaG9zdDpwYXRoYCBzZXBhcmF0b3IuXG4gIGNvbnN0IHNjcE1hdGNoID0gL14oPzpbXkAvXStAKT8oW14vOl0rKTooPyFcXC8pKC4qKSQvdS5leGVjKHVybCk7XG4gIGlmIChzY3BNYXRjaCkge1xuICAgIHJldHVybiBzY3BNYXRjaFsxXSEudG9Mb3dlckNhc2UoKSA9PT0gJ2dpdGh1Yi5jb20nICYmIGNhbm9uaWNhbFJlcG9zaXRvcnlQYXRoLnRlc3Qoc2NwTWF0Y2hbMl0hKTtcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IHsgaG9zdG5hbWUsIHBhdGhuYW1lIH0gPSBuZXcgVVJMKHVybCk7XG4gICAgcmV0dXJuIGhvc3RuYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdnaXRodWIuY29tJyAmJiBjYW5vbmljYWxSZXBvc2l0b3J5UGF0aC50ZXN0KHBhdGhuYW1lKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldEdpdERpcnR5U3RhdGUoZ2l0Um9vdERpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICBjb25zdCBwcm9jID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoXG4gICAgJ2dpdCcsXG4gICAgW1xuICAgICAgJ3N0YXR1cycsXG4gICAgICAnLS1wb3JjZWxhaW4nLFxuICAgICAgJy0tdW50cmFja2VkLWZpbGVzPWFsbCcsXG4gICAgICAnLS0nLFxuICAgICAgYDooZ2xvYikke3BhdGguZGlybmFtZSh3YmZ5RGlyUGF0aEluUmVwbyl9Lyovc3JjLyoqYCxcbiAgICAgIGA6KGdsb2IpJHtwYXRoLmRpcm5hbWUod2JmeURpclBhdGhJblJlcG8pfS8qL2Jpbi8qKmAsXG4gICAgICBgOihnbG9iKSR7cGF0aC5kaXJuYW1lKHdiZnlEaXJQYXRoSW5SZXBvKX0vKi9jb25maWdzLyoqYCxcbiAgICBdLFxuICAgIHsgY3dkOiBnaXRSb290RGlyUGF0aCwgZW5jb2Rpbmc6ICd1dGY4Jywgc3RkaW86ICdwaXBlJyB9XG4gICk7XG4gIHJldHVybiBwcm9jLnN0YXR1cyA9PT0gMCA/ICEhcHJvYy5zdGRvdXQudHJpbSgpIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBydW5HaXQoYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcHJvYyA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKCdnaXQnLCBhcmdzLCB7IGN3ZCwgZW5jb2Rpbmc6ICd1dGY4Jywgc3RkaW86ICdwaXBlJyB9KTtcbiAgcmV0dXJuIHByb2Muc3RhdHVzID09PSAwID8gcHJvYy5zdGRvdXQudHJpbSgpIHx8IHVuZGVmaW5lZCA6IHVuZGVmaW5lZDtcbn1cblxubGV0IGNhY2hlZFdiZnlQYWNrYWdlSnNvbjogeyBuYW1lOiBzdHJpbmc7IHZlcnNpb246IHN0cmluZzsgZGlyUGF0aDogc3RyaW5nIH0gfCB1bmRlZmluZWQ7XG5cbi8qKiBSZXR1cm5zIHdiZnkncyBvd24gcGFja2FnZSBkaXJlY3RvcnksIHdoaWNoIGFsc28gaG9sZHMgaXRzIGNvbmZpZ3MgKGUuZy4gcmVsZWFzZUFnZUdhdGUuanNvbikuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0V2JmeURpclBhdGgoKTogc3RyaW5nIHtcbiAgcmV0dXJuIHJlYWRXYmZ5UGFja2FnZUpzb24oKS5kaXJQYXRoO1xufVxuXG5mdW5jdGlvbiByZWFkV2JmeVBhY2thZ2VKc29uKCk6IHsgbmFtZTogc3RyaW5nOyB2ZXJzaW9uOiBzdHJpbmc7IGRpclBhdGg6IHN0cmluZyB9IHtcbiAgaWYgKGNhY2hlZFdiZnlQYWNrYWdlSnNvbikgcmV0dXJuIGNhY2hlZFdiZnlQYWNrYWdlSnNvbjtcbiAgLy8gZmlsZVVSTFRvUGF0aCwgbm90IFVSTC5wYXRobmFtZTogdGhlIGxhdHRlciBrZWVwcyBwZXJjZW50LWVuY29kaW5nLCBzbyBhbiBpbnN0YWxsYXRpb24gcGF0aFxuICAvLyBjb250YWluaW5nIGUuZy4gYSBzcGFjZSB3b3VsZCByZXNvbHZlIHRvIGEgbm9uZXhpc3RlbnQgZGlyZWN0b3J5IGFuZCB0aGUgc2VhcmNoIHdvdWxkIHdhbGsgdXBcbiAgLy8gdG8gYW4gdW5yZWxhdGVkIHBhY2thZ2UuXG4gIGxldCBkaXJQYXRoID0gcGF0aC5kaXJuYW1lKGZpbGVVUkxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKSk7XG4gIHdoaWxlICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgIGNvbnN0IHBhcmVudERpclBhdGggPSBwYXRoLmRpcm5hbWUoZGlyUGF0aCk7XG4gICAgLy8gcGF0aC5kaXJuYW1lKCcvJykgPT09ICcvJywgc28gdGhlIHNlYXJjaCBtdXN0IHN0b3AgZXhwbGljaXRseSBhdCB0aGUgZmlsZXN5c3RlbSByb290LlxuICAgIGlmIChwYXJlbnREaXJQYXRoID09PSBkaXJQYXRoKSB0aHJvdyBuZXcgRXJyb3IoXCJ3YmZ5J3Mgb3duIHBhY2thZ2UuanNvbiBpcyBtaXNzaW5nLlwiKTtcbiAgICBkaXJQYXRoID0gcGFyZW50RGlyUGF0aDtcbiAgfVxuICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJyksICd1dGY4JykpIGFzIHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgdmVyc2lvbjogc3RyaW5nO1xuICB9O1xuICBjYWNoZWRXYmZ5UGFja2FnZUpzb24gPSB7IG5hbWU6IHBhY2thZ2VKc29uLm5hbWUsIHZlcnNpb246IHBhY2thZ2VKc29uLnZlcnNpb24sIGRpclBhdGggfTtcbiAgcmV0dXJuIGNhY2hlZFdiZnlQYWNrYWdlSnNvbjtcbn1cbiIsImltcG9ydCB7IHNwYXduU3luYyB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBnZXRXYmZ5RGlyUGF0aCB9IGZyb20gJy4uL3V0aWxzL3ZlcnNpb24uanMnO1xuXG4vKipcbiAqIEFwcGxpZXMgdGhlIG9yZ2FuaXphdGlvbidzIG1pbmltdW0tcmVsZWFzZS1hZ2UgcG9saWN5IHRvIHRoZSBkZXZlbG9wZXIgbWFjaGluZSdzIEdMT0JBTFxuICogcGFja2FnZS1tYW5hZ2VyIGNvbmZpZ3MuIFJlcG9zaXRvcnkgY29uZmlncyBndWFyZCBvbmx5IHdiZmllZCByZXBvc2l0b3JpZXM7IGEgYnJhbmQtbmV3IGxvY2FsXG4gKiBwcm9qZWN0IGhhcyBubyBidW5maWcudG9tbCB5ZXQsIHNvIHRoZSBnbG9iYWwgZmlsZXMgYXJlIHRoZSBvbmx5IGdhdGUgYmV0d2VlbiBgYnVuIGNyZWF0ZWAgL1xuICogYG5wbSBpbml0YCBhbmQgYSBmcmVzaGx5IGNvbXByb21pc2VkIHJlbGVhc2UuIFRoZSBzYW1lIHNjcmlwdCBydW5zIG9uIENJIGFuZCBvbiB0aGUgc2VsZi1ob3N0ZWRcbiAqIHJ1bm5lcnMsIHNvIGV2ZXJ5IG1hY2hpbmUgZW5kcyB1cCB3aXRoIGJ5dGUtaWRlbnRpY2FsIHNldHRpbmdzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5zdXJlR2xvYmFsUmVsZWFzZUFnZUdhdGVzKCk6IGJvb2xlYW4ge1xuICBjb25zdCB7IHN0YXR1cyB9ID0gc3Bhd25TeW5jKCdiYXNoJywgW3BhdGguam9pbihnZXRXYmZ5RGlyUGF0aCgpLCAnY29uZmlncycsICdhcHBseVJlbGVhc2VBZ2VHYXRlLnNoJyldLCB7XG4gICAgc3RkaW86ICdpbmhlcml0JyxcbiAgfSk7XG4gIGlmIChzdGF0dXMgPT09IDApIHJldHVybiB0cnVlO1xuXG4gIGNvbnNvbGUud2FybignRmFpbGVkIHRvIGFwcGx5IHRoZSBtaW5pbXVtLXJlbGVhc2UtYWdlIHBvbGljeSB0byB0aGUgZ2xvYmFsIHBhY2thZ2UtbWFuYWdlciBjb25maWdzLicpO1xuICByZXR1cm4gZmFsc2U7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGRvZXNDb250YWluSnNPclRzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIGNvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHQgfHxcbiAgICBjb25maWcuZG9lc0NvbnRhaW5KYXZhU2NyaXB0SW5QYWNrYWdlcyB8fFxuICAgIGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHxcbiAgICBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlc1xuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZG9lc0NvbnRhaW5KYXZhKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gY29uZmlnLmRvZXNDb250YWluSmF2YSB8fCBjb25maWcuZG9lc0NvbnRhaW5KYXZhSW5QYWNrYWdlcztcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBkb2VzQ29udGFpbkphdmEsIGRvZXNDb250YWluSnNPclRzIH0gZnJvbSAnLi4vdXRpbHMvcGFja2FnZUNhcGFiaWxpdGllcy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuLy8gS2VlcCBwYWNrYWdlLW1hbmFnZXIgc2hpbXMgaW4gdGhlIEZpbGUgV2F0Y2hlciBwcm9ncmFtIGZpZWxkIHNvIG5vZGUgZG9lcyBub3Rcbi8vIHBhcnNlIHdyYXBwZXIgc2NyaXB0cyBwYXNzZWQgdGhyb3VnaCBhcmd1bWVudHMuXG5jb25zdCBveGZtdFByb2dyYW0gPSAnJFByb2plY3RGaWxlRGlyJC9ub2RlX21vZHVsZXMvLmJpbi9veGZtdCc7XG5jb25zdCBwcmV0dGllclByb2dyYW0gPSAnJFByb2plY3RGaWxlRGlyJC9ub2RlX21vZHVsZXMvLmJpbi9wcmV0dGllcic7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUlkZWFTZXR0aW5ncyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUlkZWFTZXR0aW5ncycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmlkZWEnKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhkaXJQYXRoKSkge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3dhdGNoZXJUYXNrcy54bWwnKTtcbiAgICAgIGF3YWl0IChkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpIHx8IGRvZXNDb250YWluSmF2YShjb25maWcpXG4gICAgICAgID8gcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGdldFdhdGNoZXJUYXNrc0NvbnRlbnQoY29uZmlnKSkpXG4gICAgICAgIDogcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKSk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0V2F0Y2hlclRhc2tzQ29udGVudChjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBjb25zdCB0YXNrT3B0aW9ucyA9IFtcbiAgICB7XG4gICAgICBhcmdzOiAnLS13cml0ZSAtLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuICEqKi9wYWNrYWdlLmpzb24nLFxuICAgICAgY29uZGl0aW9uOiBkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpLFxuICAgICAgZXh0ZW5zaW9uczogZXh0ZW5zaW9ucy5veGZtdCxcbiAgICAgIG5hbWU6ICdPeGZtdCcsXG4gICAgICBwcm9ncmFtOiBveGZtdFByb2dyYW0sXG4gICAgfSxcbiAgICB7XG4gICAgICBhcmdzOiAnLS1jYWNoZSAtLXdyaXRlJyxcbiAgICAgIGNvbmRpdGlvbjogZG9lc0NvbnRhaW5KYXZhKGNvbmZpZyksXG4gICAgICBleHRlbnNpb25zOiBleHRlbnNpb25zLnByZXR0aWVyT25seSxcbiAgICAgIG5hbWU6ICdQcmV0dGllcicsXG4gICAgICBwcm9ncmFtOiBwcmV0dGllclByb2dyYW0sXG4gICAgfSxcbiAgXVxuICAgIC5maWx0ZXIoKHRhc2spID0+IHRhc2suY29uZGl0aW9uKVxuICAgIC5mbGF0TWFwKCh0YXNrKSA9PiB0YXNrLmV4dGVuc2lvbnMubWFwKChleHQpID0+IGNyZWF0ZVRhc2tPcHRpb25zKHRhc2sucHJvZ3JhbSwgdGFzay5hcmdzLCB0YXNrLm5hbWUsIGV4dCkpKTtcblxuICByZXR1cm4gYDw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuPHByb2plY3QgdmVyc2lvbj1cIjRcIj5cbiAgPGNvbXBvbmVudCBuYW1lPVwiUHJvamVjdFRhc2tzT3B0aW9uc1wiPlxuICAgICR7dGFza09wdGlvbnMuam9pbignJyl9XG4gIDwvY29tcG9uZW50PlxuPC9wcm9qZWN0PlxuYDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlVGFza09wdGlvbnMocnVubmVyOiBzdHJpbmcsIGFyZ3M6IHN0cmluZywgbmFtZTogc3RyaW5nLCBleHRlbnNpb246IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgICAgIDxUYXNrT3B0aW9ucyBpc0VuYWJsZWQ9XCJ0cnVlXCI+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJhcmd1bWVudHNcIiB2YWx1ZT1cIiR7YXJnc30gJEZpbGVQYXRoUmVsYXRpdmVUb1Byb2plY3RSb290JFwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJjaGVja1N5bnRheEVycm9yc1wiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiZGVzY3JpcHRpb25cIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiZXhpdENvZGVCZWhhdmlvclwiIHZhbHVlPVwiRVJST1JcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiZmlsZUV4dGVuc2lvblwiIHZhbHVlPVwiJHtleHRlbnNpb259XCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImltbWVkaWF0ZVN5bmNcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cIm5hbWVcIiB2YWx1ZT1cIiR7bmFtZX0gKC4ke2V4dGVuc2lvbn0pXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cIm91dHB1dFwiIHZhbHVlPVwiJEZpbGVQYXRoUmVsYXRpdmVUb1Byb2plY3RSb290JFwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJvdXRwdXRGaWx0ZXJzXCI+XG4gICAgICAgIDxhcnJheSAvPlxuICAgICAgPC9vcHRpb24+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJvdXRwdXRGcm9tU3Rkb3V0XCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJwcm9ncmFtXCIgdmFsdWU9XCIke3J1bm5lcn1cIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwicnVuT25FeHRlcm5hbENoYW5nZXNcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cInNjb3BlTmFtZVwiIHZhbHVlPVwiUHJvamVjdCBGaWxlc1wiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJ0cmFja09ubHlSb290XCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJ3b3JraW5nRGlyXCIgdmFsdWU9XCIkUHJvamVjdEZpbGVEaXIkXCIgLz5cbiAgICAgIDxlbnZzIC8+XG4gICAgPC9UYXNrT3B0aW9ucz5cbmA7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRHZW5JMThuVHNDb21tYW5kKFxuICBjb25maWc6IFBpY2s8UGFja2FnZUNvbmZpZywgJ2RlcGVuZGluZyc+LFxuICBzY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzIHwgdW5kZWZpbmVkXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIWNvbmZpZy5kZXBlbmRpbmcuZ2VuSTE4blRzIHx8ICFzY3JpcHRzPy5bJ2dlbi1pMThuLXRzJ10pIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiAnYnVuIHJ1biBnZW4taTE4bi10cyA+IC9kZXYvbnVsbCc7XG59XG4iLCJjb25zdCBoYXMgPSAob2JqZWN0LCBrZXkpID0+IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSlcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc29ydE9iamVjdEJ5S2V5TmFtZUxpc3Qob2JqZWN0LCBzb3J0V2l0aCkge1xuICBsZXQga2V5cywgc29ydEZuLCBrZXlcblxuICBpZiAodHlwZW9mIHNvcnRXaXRoID09PSAnZnVuY3Rpb24nKSB7XG4gICAgc29ydEZuID0gc29ydFdpdGhcbiAgfSBlbHNlIHtcbiAgICBrZXlzID0gc29ydFdpdGhcbiAgfVxuXG4gIGNvbnN0IHRvdGFsID0ge31cbiAgY29uc3Qgb2JqZWN0S2V5cyA9IFsuLi4oa2V5cyA/PyBbXSksIC4uLk9iamVjdC5rZXlzKG9iamVjdCkuc29ydChzb3J0Rm4pXVxuXG4gIGZvciAoa2V5IG9mIG9iamVjdEtleXMpIHtcbiAgICBpZiAoaGFzKG9iamVjdCwga2V5KSkge1xuICAgICAgdG90YWxba2V5XSA9IG9iamVjdFtrZXldXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRvdGFsXG59XG4iLCIvLyBEZXRlY3QgZWl0aGVyIHNwYWNlcyBvciB0YWJzIGJ1dCBub3QgYm90aCB0byBwcm9wZXJseSBoYW5kbGUgdGFicyBmb3IgaW5kZW50YXRpb24gYW5kIHNwYWNlcyBmb3IgYWxpZ25tZW50XG5jb25zdCBJTkRFTlRfUkVHRVggPSAvXig/OiggKSt8XFx0KykvO1xuXG5jb25zdCBJTkRFTlRfVFlQRV9TUEFDRSA9ICdzcGFjZSc7XG5jb25zdCBJTkRFTlRfVFlQRV9UQUIgPSAndGFiJztcblxuLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNoZWNrIGlmIHdlIHNob3VsZCBpZ25vcmUgc2luZ2xlIHNwYWNlIHBhdHRlcm5zXG5mdW5jdGlvbiBzaG91bGRJZ25vcmVTaW5nbGVTcGFjZShpZ25vcmVTaW5nbGVTcGFjZXMsIGluZGVudFR5cGUsIHZhbHVlKSB7XG5cdHJldHVybiBpZ25vcmVTaW5nbGVTcGFjZXMgJiYgaW5kZW50VHlwZSA9PT0gSU5ERU5UX1RZUEVfU1BBQ0UgJiYgdmFsdWUgPT09IDE7XG59XG5cbi8qKlxuTWFrZSBhIE1hcCB0aGF0IGNvdW50cyBob3cgbWFueSBpbmRlbnRzL3VuaW5kZW50cyBoYXZlIG9jY3VycmVkIGZvciBhIGdpdmVuIHNpemUgYW5kIGhvdyBtYW55IGxpbmVzIGZvbGxvdyBhIGdpdmVuIGluZGVudGF0aW9uLlxuXG5UaGUga2V5IGlzIGEgY29uY2F0ZW5hdGlvbiBvZiB0aGUgaW5kZW50YXRpb24gdHlwZSAocyA9IHNwYWNlIGFuZCB0ID0gdGFiKSBhbmQgdGhlIHNpemUgb2YgdGhlIGluZGVudHMvdW5pbmRlbnRzLlxuXG5gYGBcbmluZGVudHMgPSB7XG5cdHQzOiBbMSwgMF0sXG5cdHQ0OiBbMSwgNV0sXG5cdHM1OiBbMSwgMF0sXG5cdHMxMjogWzEsIDBdLFxufVxuYGBgXG4qL1xuZnVuY3Rpb24gbWFrZUluZGVudHNNYXAoc3RyaW5nLCBpZ25vcmVTaW5nbGVTcGFjZXMpIHtcblx0Y29uc3QgaW5kZW50cyA9IG5ldyBNYXAoKTtcblxuXHQvLyBSZW1lbWJlciB0aGUgc2l6ZSBvZiBwcmV2aW91cyBsaW5lJ3MgaW5kZW50YXRpb25cblx0bGV0IHByZXZpb3VzU2l6ZSA9IDA7XG5cdGxldCBwcmV2aW91c0luZGVudFR5cGU7XG5cblx0Ly8gSW5kZW50cyBrZXkgKGlkZW50IHR5cGUgKyBzaXplIG9mIHRoZSBpbmRlbnRzL3VuaW5kZW50cylcblx0bGV0IGtleTtcblxuXHRmb3IgKGNvbnN0IGxpbmUgb2Ygc3RyaW5nLnNwbGl0KC9cXG4vZykpIHtcblx0XHRpZiAoIWxpbmUpIHtcblx0XHRcdC8vIElnbm9yZSBlbXB0eSBsaW5lc1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXG5cdFx0Y29uc3QgbWF0Y2hlcyA9IGxpbmUubWF0Y2goSU5ERU5UX1JFR0VYKTtcblxuXHRcdGlmIChtYXRjaGVzID09PSBudWxsKSB7XG5cdFx0XHRwcmV2aW91c1NpemUgPSAwO1xuXHRcdFx0cHJldmlvdXNJbmRlbnRUeXBlID0gJyc7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IGluZGVudCA9IG1hdGNoZXNbMF0ubGVuZ3RoO1xuXHRcdFx0Y29uc3QgaW5kZW50VHlwZSA9IG1hdGNoZXNbMV0gPyBJTkRFTlRfVFlQRV9TUEFDRSA6IElOREVOVF9UWVBFX1RBQjtcblxuXHRcdFx0Ly8gSWdub3JlIHNpbmdsZSBzcGFjZSB1bmxlc3MgaXQncyB0aGUgb25seSBpbmRlbnQgZGV0ZWN0ZWQgdG8gcHJldmVudCBjb21tb24gZmFsc2UgcG9zaXRpdmVzXG5cdFx0XHRpZiAoc2hvdWxkSWdub3JlU2luZ2xlU3BhY2UoaWdub3JlU2luZ2xlU3BhY2VzLCBpbmRlbnRUeXBlLCBpbmRlbnQpKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoaW5kZW50VHlwZSAhPT0gcHJldmlvdXNJbmRlbnRUeXBlKSB7XG5cdFx0XHRcdHByZXZpb3VzU2l6ZSA9IDA7XG5cdFx0XHR9XG5cblx0XHRcdHByZXZpb3VzSW5kZW50VHlwZSA9IGluZGVudFR5cGU7XG5cblx0XHRcdGxldCB1c2UgPSAxO1xuXHRcdFx0bGV0IHdlaWdodCA9IDA7XG5cblx0XHRcdGNvbnN0IGluZGVudERpZmZlcmVuY2UgPSBpbmRlbnQgLSBwcmV2aW91c1NpemU7XG5cdFx0XHRwcmV2aW91c1NpemUgPSBpbmRlbnQ7XG5cblx0XHRcdC8vIFByZXZpb3VzIGxpbmUgaGF2ZSBzYW1lIGluZGVudD9cblx0XHRcdGlmIChpbmRlbnREaWZmZXJlbmNlID09PSAwKSB7XG5cdFx0XHRcdC8vIE5vdCBhIG5ldyBcInVzZVwiIG9mIHRoZSBjdXJyZW50IGluZGVudDpcblx0XHRcdFx0dXNlID0gMDtcblx0XHRcdFx0Ly8gQnV0IGRvIGFkZCBhIGJpdCB0byBpdCBmb3IgYnJlYWtpbmcgdGllczpcblx0XHRcdFx0d2VpZ2h0ID0gMTtcblx0XHRcdFx0Ly8gV2UgdXNlIHRoZSBrZXkgZnJvbSBwcmV2aW91cyBsb29wXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBhYnNvbHV0ZUluZGVudERpZmZlcmVuY2UgPSBNYXRoLmFicyhpbmRlbnREaWZmZXJlbmNlKTtcblxuXHRcdFx0XHQvLyBJZ25vcmUgc2luZ2xlIHNwYWNlIGNoYW5nZXMgd2hlbiBpZ25vcmVTaW5nbGVTcGFjZXMgaXMgdHJ1ZVxuXHRcdFx0XHQvLyBUaGlzIHByZXZlbnRzIGNvbW1vbiBmYWxzZSBwb3NpdGl2ZXMgZnJvbSB0aGluZ3MgbGlrZSBhbGlnbmVkIGNvbW1lbnRzXG5cdFx0XHRcdGlmIChzaG91bGRJZ25vcmVTaW5nbGVTcGFjZShpZ25vcmVTaW5nbGVTcGFjZXMsIGluZGVudFR5cGUsIGFic29sdXRlSW5kZW50RGlmZmVyZW5jZSkpIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGtleSA9IGVuY29kZUluZGVudHNLZXkoaW5kZW50VHlwZSwgYWJzb2x1dGVJbmRlbnREaWZmZXJlbmNlKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gVXBkYXRlIHRoZSBzdGF0c1xuXHRcdFx0Y29uc3QgZW50cnkgPSBpbmRlbnRzLmdldChrZXkpO1xuXHRcdFx0aW5kZW50cy5zZXQoa2V5LCBlbnRyeSA9PT0gdW5kZWZpbmVkID8gWzEsIDBdIDogW2VudHJ5WzBdICsgdXNlLCBlbnRyeVsxXSArIHdlaWdodF0pO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBpbmRlbnRzO1xufVxuXG4vLyBFbmNvZGUgdGhlIGluZGVudCB0eXBlIGFuZCBhbW91bnQgYXMgYSBzdHJpbmcgKGUuZy4gJ3M0JykgZm9yIHVzZSBhcyBhIGNvbXBvdW5kIGtleSBpbiB0aGUgaW5kZW50cyBNYXAuXG5mdW5jdGlvbiBlbmNvZGVJbmRlbnRzS2V5KGluZGVudFR5cGUsIGluZGVudEFtb3VudCkge1xuXHRjb25zdCB0eXBlQ2hhcmFjdGVyID0gaW5kZW50VHlwZSA9PT0gSU5ERU5UX1RZUEVfU1BBQ0UgPyAncycgOiAndCc7XG5cdHJldHVybiB0eXBlQ2hhcmFjdGVyICsgU3RyaW5nKGluZGVudEFtb3VudCk7XG59XG5cbi8vIEV4dHJhY3QgdGhlIGluZGVudCB0eXBlIGFuZCBhbW91bnQgZnJvbSBhIGtleSBvZiB0aGUgaW5kZW50cyBNYXAuXG5mdW5jdGlvbiBkZWNvZGVJbmRlbnRzS2V5KGluZGVudHNLZXkpIHtcblx0Y29uc3Qga2V5SGFzVHlwZVNwYWNlID0gaW5kZW50c0tleVswXSA9PT0gJ3MnO1xuXHRjb25zdCB0eXBlID0ga2V5SGFzVHlwZVNwYWNlID8gSU5ERU5UX1RZUEVfU1BBQ0UgOiBJTkRFTlRfVFlQRV9UQUI7XG5cblx0Y29uc3QgYW1vdW50ID0gTnVtYmVyKGluZGVudHNLZXkuc2xpY2UoMSkpO1xuXG5cdHJldHVybiB7dHlwZSwgYW1vdW50fTtcbn1cblxuLy8gUmV0dXJuIHRoZSBrZXkgKGUuZy4gJ3M0JykgZnJvbSB0aGUgaW5kZW50cyBNYXAgdGhhdCByZXByZXNlbnRzIHRoZSBtb3N0IGNvbW1vbiBpbmRlbnQsXG4vLyBvciByZXR1cm4gdW5kZWZpbmVkIGlmIHRoZXJlIGFyZSBubyBpbmRlbnRzLlxuZnVuY3Rpb24gZ2V0TW9zdFVzZWRLZXkoaW5kZW50cykge1xuXHRsZXQgcmVzdWx0O1xuXHRsZXQgbWF4VXNlZCA9IDA7XG5cdGxldCBtYXhXZWlnaHQgPSAwO1xuXG5cdGZvciAoY29uc3QgW2tleSwgW3VzZWRDb3VudCwgd2VpZ2h0XV0gb2YgaW5kZW50cykge1xuXHRcdGlmICh1c2VkQ291bnQgPiBtYXhVc2VkIHx8ICh1c2VkQ291bnQgPT09IG1heFVzZWQgJiYgd2VpZ2h0ID4gbWF4V2VpZ2h0KSkge1xuXHRcdFx0bWF4VXNlZCA9IHVzZWRDb3VudDtcblx0XHRcdG1heFdlaWdodCA9IHdlaWdodDtcblx0XHRcdHJlc3VsdCA9IGtleTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBtYWtlSW5kZW50U3RyaW5nKHR5cGUsIGFtb3VudCkge1xuXHRjb25zdCBpbmRlbnRDaGFyYWN0ZXIgPSB0eXBlID09PSBJTkRFTlRfVFlQRV9TUEFDRSA/ICcgJyA6ICdcXHQnO1xuXHRyZXR1cm4gaW5kZW50Q2hhcmFjdGVyLnJlcGVhdChhbW91bnQpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBkZXRlY3RJbmRlbnQoc3RyaW5nKSB7XG5cdGlmICh0eXBlb2Ygc3RyaW5nICE9PSAnc3RyaW5nJykge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIGEgc3RyaW5nJyk7XG5cdH1cblxuXHQvLyBJZGVudGlmeSBpbmRlbnRzIHdoaWxlIHNraXBwaW5nIHNpbmdsZSBzcGFjZSBpbmRlbnRzIHRvIGF2b2lkIGNvbW1vbiBlZGdlIGNhc2VzIChlLmcuIGNvZGUgY29tbWVudHMpXG5cdC8vIElmIG5vIGluZGVudHMgYXJlIGlkZW50aWZpZWQsIHJ1biBhZ2FpbiBhbmQgaW5jbHVkZSBhbGwgaW5kZW50cyBmb3IgY29tcHJlaGVuc2l2ZSBkZXRlY3Rpb25cblx0bGV0IGluZGVudHMgPSBtYWtlSW5kZW50c01hcChzdHJpbmcsIHRydWUpO1xuXHRpZiAoaW5kZW50cy5zaXplID09PSAwKSB7XG5cdFx0aW5kZW50cyA9IG1ha2VJbmRlbnRzTWFwKHN0cmluZywgZmFsc2UpO1xuXHR9XG5cblx0Y29uc3Qga2V5T2ZNb3N0VXNlZEluZGVudCA9IGdldE1vc3RVc2VkS2V5KGluZGVudHMpO1xuXG5cdGxldCB0eXBlO1xuXHRsZXQgYW1vdW50ID0gMDtcblx0bGV0IGluZGVudCA9ICcnO1xuXG5cdGlmIChrZXlPZk1vc3RVc2VkSW5kZW50ICE9PSB1bmRlZmluZWQpIHtcblx0XHQoe3R5cGUsIGFtb3VudH0gPSBkZWNvZGVJbmRlbnRzS2V5KGtleU9mTW9zdFVzZWRJbmRlbnQpKTtcblx0XHRpbmRlbnQgPSBtYWtlSW5kZW50U3RyaW5nKHR5cGUsIGFtb3VudCk7XG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdGFtb3VudCxcblx0XHR0eXBlLFxuXHRcdGluZGVudCxcblx0fTtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBkZXRlY3ROZXdsaW5lKHN0cmluZykge1xuXHRpZiAodHlwZW9mIHN0cmluZyAhPT0gJ3N0cmluZycpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBhIHN0cmluZycpO1xuXHR9XG5cblx0Y29uc3QgbmV3bGluZXMgPSBzdHJpbmcubWF0Y2goLyg/Olxccj9cXG4pL2cpIHx8IFtdO1xuXG5cdGlmIChuZXdsaW5lcy5sZW5ndGggPT09IDApIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRjb25zdCBjcmxmID0gbmV3bGluZXMuZmlsdGVyKG5ld2xpbmUgPT4gbmV3bGluZSA9PT0gJ1xcclxcbicpLmxlbmd0aDtcblx0Y29uc3QgbGYgPSBuZXdsaW5lcy5sZW5ndGggLSBjcmxmO1xuXG5cdHJldHVybiBjcmxmID4gbGYgPyAnXFxyXFxuJyA6ICdcXG4nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGV0ZWN0TmV3bGluZUdyYWNlZnVsKHN0cmluZykge1xuXHRyZXR1cm4gKHR5cGVvZiBzdHJpbmcgPT09ICdzdHJpbmcnICYmIGRldGVjdE5ld2xpbmUoc3RyaW5nKSkgfHwgJ1xcbic7XG59XG4iLCIiLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc1BsYWluT2JqZWN0KHZhbHVlKSB7XG5cdGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IHZhbHVlID09PSBudWxsKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0Y29uc3QgcHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKTtcblx0cmV0dXJuIChwcm90b3R5cGUgPT09IG51bGwgfHwgcHJvdG90eXBlID09PSBPYmplY3QucHJvdG90eXBlIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90b3R5cGUpID09PSBudWxsKSAmJiAhKFN5bWJvbC50b1N0cmluZ1RhZyBpbiB2YWx1ZSkgJiYgIShTeW1ib2wuaXRlcmF0b3IgaW4gdmFsdWUpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnXG5pbXBvcnQgc29ydE9iamVjdEtleXMgZnJvbSAnc29ydC1vYmplY3Qta2V5cydcbmltcG9ydCBkZXRlY3RJbmRlbnQgZnJvbSAnZGV0ZWN0LWluZGVudCdcbmltcG9ydCB7IGRldGVjdE5ld2xpbmVHcmFjZWZ1bCBhcyBkZXRlY3ROZXdsaW5lIH0gZnJvbSAnZGV0ZWN0LW5ld2xpbmUnXG5pbXBvcnQgZ2l0SG9va3MgZnJvbSAnZ2l0LWhvb2tzLWxpc3QnXG5pbXBvcnQgaXNQbGFpbk9iamVjdCBmcm9tICdpcy1wbGFpbi1vYmonXG5pbXBvcnQgc2VtdmVyQ29tcGFyZSBmcm9tICdzZW12ZXIvZnVuY3Rpb25zL2NvbXBhcmUuanMnXG5pbXBvcnQgc2VtdmVyTWluVmVyc2lvbiBmcm9tICdzZW12ZXIvcmFuZ2VzL21pbi12ZXJzaW9uLmpzJ1xuXG5jb25zdCBwaXBlID1cbiAgKGZucykgPT5cbiAgKHgsIC4uLmFyZ3MpID0+XG4gICAgZm5zLnJlZHVjZSgocmVzdWx0LCBmbikgPT4gZm4ocmVzdWx0LCAuLi5hcmdzKSwgeClcbmNvbnN0IG9uQXJyYXkgPSAoZm4pID0+ICh4KSA9PiAoQXJyYXkuaXNBcnJheSh4KSA/IGZuKHgpIDogeClcbmNvbnN0IG9uU3RyaW5nQXJyYXkgPSAoZm4pID0+ICh4KSA9PlxuICBBcnJheS5pc0FycmF5KHgpICYmIHguZXZlcnkoKGl0ZW0pID0+IHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJykgPyBmbih4KSA6IHhcbmNvbnN0IHVuaXEgPSBvblN0cmluZ0FycmF5KCh4cykgPT4gWy4uLm5ldyBTZXQoeHMpXSlcbmNvbnN0IHNvcnRBcnJheSA9IG9uU3RyaW5nQXJyYXkoKGFycmF5KSA9PiBhcnJheS50b1NvcnRlZCgpKVxuY29uc3QgdW5pcUFuZFNvcnRBcnJheSA9IHBpcGUoW3VuaXEsIHNvcnRBcnJheV0pXG5jb25zdCBvbk9iamVjdCA9XG4gIChmbikgPT5cbiAgKHgsIC4uLmFyZ3MpID0+XG4gICAgaXNQbGFpbk9iamVjdCh4KSA/IGZuKHgsIC4uLmFyZ3MpIDogeFxuY29uc3Qgc29ydE9iamVjdEJ5ID0gKGNvbXBhcmF0b3IsIGRlZXApID0+IHtcbiAgY29uc3Qgb3ZlciA9IG9uT2JqZWN0KChvYmplY3QpID0+IHtcbiAgICBpZiAoZGVlcCkge1xuICAgICAgb2JqZWN0ID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBPYmplY3QuZW50cmllcyhvYmplY3QpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBba2V5LCBvdmVyKHZhbHVlKV0pLFxuICAgICAgKVxuICAgIH1cblxuICAgIHJldHVybiBzb3J0T2JqZWN0S2V5cyhvYmplY3QsIGNvbXBhcmF0b3IpXG4gIH0pXG5cbiAgcmV0dXJuIG92ZXJcbn1cbmNvbnN0IHNvcnRPYmplY3QgPSBzb3J0T2JqZWN0QnkoKVxuY29uc3Qgc29ydFVSTE9iamVjdCA9IHNvcnRPYmplY3RCeShbJ3R5cGUnLCAndXJsJ10pXG5jb25zdCBzb3J0UGVvcGxlT2JqZWN0ID0gc29ydE9iamVjdEJ5KFsnbmFtZScsICdlbWFpbCcsICd1cmwnXSlcbmNvbnN0IHNvcnREaXJlY3RvcmllcyA9IHNvcnRPYmplY3RCeShbXG4gICdsaWInLFxuICAnYmluJyxcbiAgJ21hbicsXG4gICdkb2MnLFxuICAnZXhhbXBsZScsXG4gICd0ZXN0Jyxcbl0pXG5jb25zdCBvdmVyUHJvcGVydHkgPSAocHJvcGVydHksIG92ZXIpID0+XG4gIG9uT2JqZWN0KChvYmplY3QsIC4uLmFyZ3MpID0+XG4gICAgT2JqZWN0Lmhhc093bihvYmplY3QsIHByb3BlcnR5KVxuICAgICAgPyB7IC4uLm9iamVjdCwgW3Byb3BlcnR5XTogb3ZlcihvYmplY3RbcHJvcGVydHldLCAuLi5hcmdzKSB9XG4gICAgICA6IG9iamVjdCxcbiAgKVxuY29uc3Qgc29ydEdpdEhvb2tzID0gc29ydE9iamVjdEJ5KGdpdEhvb2tzKVxuXG5jb25zdCBwYXJzZU5hbWVBbmRWZXJzaW9uUmFuZ2UgPSAoc3BlY2lmaWVyKSA9PiB7XG4gIC8vIElnbm9yZSBhbnl0aGluZyBhZnRlciA+ICYgcmVseSBvbiBmYWxsYmFjayBhbHBoYW51bWVyaWMgc29ydGluZyBmb3IgdGhhdFxuICBjb25zdCBbbmFtZUFuZFZlcnNpb25dID0gc3BlY2lmaWVyLnNwbGl0KCc+JylcbiAgY29uc3QgYXRNYXRjaGVzID0gWy4uLm5hbWVBbmRWZXJzaW9uLm1hdGNoQWxsKCdAJyldXG4gIGlmIChcbiAgICAhYXRNYXRjaGVzLmxlbmd0aCB8fFxuICAgIChhdE1hdGNoZXMubGVuZ3RoID09PSAxICYmIGF0TWF0Y2hlc1swXS5pbmRleCA9PT0gMClcbiAgKSB7XG4gICAgcmV0dXJuIHsgbmFtZTogc3BlY2lmaWVyIH1cbiAgfVxuICBjb25zdCBzcGxpdEluZGV4ID0gYXRNYXRjaGVzLnBvcCgpLmluZGV4XG4gIHJldHVybiB7XG4gICAgbmFtZTogbmFtZUFuZFZlcnNpb24uc3Vic3RyaW5nKDAsIHNwbGl0SW5kZXgpLFxuICAgIHJhbmdlOiBuYW1lQW5kVmVyc2lvbi5zdWJzdHJpbmcoc3BsaXRJbmRleCArIDEpLFxuICB9XG59XG5cbmNvbnN0IHNvcnRPYmplY3RCeVNlbXZlciA9IHNvcnRPYmplY3RCeSgoYSwgYikgPT4ge1xuICBjb25zdCB7IG5hbWU6IGFOYW1lLCByYW5nZTogYVJhbmdlIH0gPSBwYXJzZU5hbWVBbmRWZXJzaW9uUmFuZ2UoYSlcbiAgY29uc3QgeyBuYW1lOiBiTmFtZSwgcmFuZ2U6IGJSYW5nZSB9ID0gcGFyc2VOYW1lQW5kVmVyc2lvblJhbmdlKGIpXG5cbiAgaWYgKGFOYW1lICE9PSBiTmFtZSkge1xuICAgIHJldHVybiBhTmFtZS5sb2NhbGVDb21wYXJlKGJOYW1lLCAnZW4nKVxuICB9XG4gIGlmICghYVJhbmdlKSB7XG4gICAgcmV0dXJuIC0xXG4gIH1cbiAgaWYgKCFiUmFuZ2UpIHtcbiAgICByZXR1cm4gMVxuICB9XG4gIHJldHVybiBzZW12ZXJDb21wYXJlKHNlbXZlck1pblZlcnNpb24oYVJhbmdlKSwgc2VtdmVyTWluVmVyc2lvbihiUmFuZ2UpKVxufSlcblxuY29uc3QgZ2V0UGFja2FnZU5hbWUgPSAoaWRlbnQpID0+IHtcbiAgY29uc3QgaW5kZXggPSBpZGVudC5pbmRleE9mKCdAJywgaWRlbnQuc3RhcnRzV2l0aCgnQCcpID8gMSA6IDApXG4gIC8vIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4sIHVubGVzcyB1c2VyIG1hbnVhbGx5IGVkaXQgdGhlIHBhY2thZ2UuanNvbiBmaWxlXG4gIHJldHVybiBpbmRleCA9PT0gLTEgPyBpZGVudCA6IGlkZW50LnNsaWNlKDAsIGluZGV4KVxufVxuXG5jb25zdCBzb3J0T2JqZWN0QnlJZGVudCA9IChhLCBiKSA9PiB7XG4gIGNvbnN0IHBhY2thZ2VOYW1lQSA9IGdldFBhY2thZ2VOYW1lKGEpXG4gIGNvbnN0IHBhY2thZ2VOYW1lQiA9IGdldFBhY2thZ2VOYW1lKGIpXG5cbiAgaWYgKHBhY2thZ2VOYW1lQSA8IHBhY2thZ2VOYW1lQikgcmV0dXJuIC0xXG4gIGlmIChwYWNrYWdlTmFtZUEgPiBwYWNrYWdlTmFtZUIpIHJldHVybiAxXG4gIHJldHVybiAwXG59XG5cbi8vIENhY2hlIGJ5IGBwcm9jZXNzLmN3ZCgpYCBpbnN0ZWFkIG9mIGEgdmFyaWFibGUgdG8gYWxsb3cgdXNlciBjYWxsIGBwcm9jZXNzLmNoZGlyKClgXG5jb25zdCBjYWNoZSA9IG5ldyBNYXAoKVxuY29uc3QgaGFzWWFybk9yUG5wbUZpbGVzID0gKCkgPT4ge1xuICBjb25zdCBjd2QgPSBwcm9jZXNzLmN3ZCgpXG4gIGlmICghY2FjaGUuaGFzKGN3ZCkpIHtcbiAgICBjYWNoZS5zZXQoXG4gICAgICBjd2QsXG4gICAgICBmcy5leGlzdHNTeW5jKCd5YXJuLmxvY2snKSB8fFxuICAgICAgICBmcy5leGlzdHNTeW5jKCcueWFybi8nKSB8fFxuICAgICAgICBmcy5leGlzdHNTeW5jKCcueWFybnJjLnltbCcpIHx8XG4gICAgICAgIGZzLmV4aXN0c1N5bmMoJ3BucG0tbG9jay55YW1sJykgfHxcbiAgICAgICAgZnMuZXhpc3RzU3luYygncG5wbS13b3Jrc3BhY2UueWFtbCcpLFxuICAgIClcbiAgfVxuICByZXR1cm4gY2FjaGUuZ2V0KGN3ZClcbn1cblxuLyoqXG4gKiBEZXRlY3RzIHRoZSBwYWNrYWdlIG1hbmFnZXIgZnJvbSBwYWNrYWdlLmpzb24gYW5kIGxvY2sgZmlsZXNcbiAqIEBwYXJhbSB7b2JqZWN0fSBwYWNrYWdlSnNvbiAtIFRoZSBwYXJzZWQgcGFja2FnZS5qc29uIG9iamVjdFxuICogQHJldHVybnMge2Jvb2xlYW59IC0gVGhlIGRldGVjdGVkIHBhY2thZ2UgbWFuYWdlci4gRGVmYXVsdCB0byBucG0gaWYgbm90IGRldGVjdGVkLlxuICovXG5mdW5jdGlvbiBzaG91bGRTb3J0RGVwZW5kZW5jaWVzTGlrZU5wbShwYWNrYWdlSnNvbikge1xuICAvLyBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL2NvcmVwYWNrXG4gIGlmICh0eXBlb2YgcGFja2FnZUpzb24ucGFja2FnZU1hbmFnZXIgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHBhY2thZ2VKc29uLnBhY2thZ2VNYW5hZ2VyLnN0YXJ0c1dpdGgoJ25wbUAnKVxuICB9XG5cbiAgaWYgKHBhY2thZ2VKc29uLmRldkVuZ2luZXM/LnBhY2thZ2VNYW5hZ2VyPy5uYW1lKSB7XG4gICAgcmV0dXJuIHBhY2thZ2VKc29uLmRldkVuZ2luZXMucGFja2FnZU1hbmFnZXIubmFtZSA9PT0gJ25wbSdcbiAgfVxuXG4gIGlmIChwYWNrYWdlSnNvbi5wbnBtKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvLyBPcHRpbWlzYXRpb246IENoZWNrIGlmIG5wbSBpcyBleHBsaWNpdCBiZWZvcmUgcmVhZGluZyBGUy5cbiAgaWYgKHBhY2thZ2VKc29uLmVuZ2luZXM/Lm5wbSkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBpZiAoaGFzWWFybk9yUG5wbUZpbGVzKCkpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG5cbi8qKlxuICogU29ydCBkZXBlbmRlbmNpZXMgYWxwaGFiZXRpY2FsbHksIGRldGVjdGluZyBwYWNrYWdlIG1hbmFnZXIgdG8gdXNlIHRoZVxuICogYXBwcm9wcmlhdGUgY29tcGFyaXNvbi4gbnBtIHVzZXMgbG9jYWxlLWF3YXJlIGNvbXBhcmlzb24sIHlhcm4gYW5kIHBucG0gdXNlXG4gKiBzaW1wbGUgc3RyaW5nIGNvbXBhcmlzb25cbiAqL1xuY29uc3Qgc29ydERlcGVuZGVuY2llcyA9IG9uT2JqZWN0KChkZXBlbmRlbmNpZXMsIHBhY2thZ2VKc29uKSA9PiB7XG4gIC8vIEF2b2lkIGZpbGUgYWNjZXNzXG4gIGlmIChPYmplY3Qua2V5cyhkZXBlbmRlbmNpZXMpLmxlbmd0aCA8IDIpIHtcbiAgICByZXR1cm4gZGVwZW5kZW5jaWVzXG4gIH1cblxuICAvLyBzb3J0IGRlcHMgbGlrZSB0aGUgbnBtIENMSSBkb2VzICh2aWEgdGhlIHBhY2thZ2UgQG5wbWNsaS9wYWNrYWdlLWpzb24pXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ucG0vcGFja2FnZS1qc29uL2Jsb2IvYjY0NjVmNDRjNzI3ZDY1MTNkYjY4OThjN2NiZTQxZGQzNTVjZWJlOC9saWIvdXBkYXRlLWRlcGVuZGVuY2llcy5qcyNMOC1MMjFcbiAgaWYgKHNob3VsZFNvcnREZXBlbmRlbmNpZXNMaWtlTnBtKHBhY2thZ2VKc29uKSkge1xuICAgIHJldHVybiBzb3J0T2JqZWN0S2V5cyhkZXBlbmRlbmNpZXMsIChhLCBiKSA9PiBhLmxvY2FsZUNvbXBhcmUoYiwgJ2VuJykpXG4gIH1cblxuICByZXR1cm4gc29ydE9iamVjdEtleXMoZGVwZW5kZW5jaWVzKVxufSlcblxuLyoqXG4gKiBcIndvcmtzcGFjZXNcIiBjYW4gYmUgYW4gYXJyYXkgKG5wbSBvciB5YXJuIGNsYXNzaWMpIG9yIGFuIG9iamVjdCAocG5wbS9idW4pLlxuICogSW4gdGhlIGNhc2Ugb2YgYW4gYXJyYXksIHdlIGRvIG5vdCB3YW50IHRvIGFscGhhYmV0aWNhbGx5IHNvcnQgaXQgaW4gY2FzZVxuICogc2NyaXB0cyBuZWVkIHRvIHJ1biBpbiBhIHNwZWNpZmljIG9yZGVyLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLm5wbWpzLmNvbS9jbGkvdjcvdXNpbmctbnBtL3dvcmtzcGFjZXM/dj10cnVlI3J1bm5pbmctY29tbWFuZHMtaW4tdGhlLWNvbnRleHQtb2Ytd29ya3NwYWNlc1xuICovXG5jb25zdCBzb3J0V29ya3NwYWNlcyA9IHBpcGUoW1xuICBzb3J0T2JqZWN0QnkoWydwYWNrYWdlcycsICdjYXRhbG9nJ10pLFxuICBvdmVyUHJvcGVydHkoJ3BhY2thZ2VzJywgdW5pcUFuZFNvcnRBcnJheSksXG4gIG92ZXJQcm9wZXJ0eSgnY2F0YWxvZycsIHNvcnREZXBlbmRlbmNpZXMpLFxuXSlcblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2VzbGludC9lc2xpbnQvYmxvYi9hY2MwZTQ3NTcyYTkzOTAyOTJiNGUzMTNiNGE0YmYzNjBkMjM2MzU4L2NvbmYvY29uZmlnLXNjaGVtYS5qc1xuY29uc3QgZXNsaW50QmFzZUNvbmZpZ1Byb3BlcnRpZXMgPSBbXG4gIC8vIGBmaWxlc2AgYW5kIGBleGNsdWRlZEZpbGVzYCBhcmUgb25seSBvbiBgb3ZlcnJpZGVzW11gXG4gIC8vIGZvciBlYXNpZXIgc29ydCBgb3ZlcnJpZGVzW11gLFxuICAvLyBhZGQgdGhlbSB0byBoZXJlLCBzbyB3ZSBkb24ndCBuZWVkIHNvcnQgYG92ZXJyaWRlc1tdYCB0d2ljZVxuICAnZmlsZXMnLFxuICAnZXhjbHVkZWRGaWxlcycsXG4gIC8vIGJhc2VDb25maWdcbiAgJ2VudicsXG4gICdwYXJzZXInLFxuICAncGFyc2VyT3B0aW9ucycsXG4gICdzZXR0aW5ncycsXG4gICdwbHVnaW5zJyxcbiAgJ2V4dGVuZHMnLFxuICAncnVsZXMnLFxuICAnb3ZlcnJpZGVzJyxcbiAgJ2dsb2JhbHMnLFxuICAncHJvY2Vzc29yJyxcbiAgJ25vSW5saW5lQ29uZmlnJyxcbiAgJ3JlcG9ydFVudXNlZERpc2FibGVEaXJlY3RpdmVzJyxcbl1cbmNvbnN0IHNvcnRFc2xpbnRDb25maWcgPSBwaXBlKFtcbiAgc29ydE9iamVjdEJ5KGVzbGludEJhc2VDb25maWdQcm9wZXJ0aWVzKSxcbiAgb3ZlclByb3BlcnR5KCdlbnYnLCBzb3J0T2JqZWN0KSxcbiAgb3ZlclByb3BlcnR5KCdnbG9iYWxzJywgc29ydE9iamVjdCksXG4gIG92ZXJQcm9wZXJ0eShcbiAgICAnb3ZlcnJpZGVzJyxcbiAgICBvbkFycmF5KChvdmVycmlkZXMpID0+IG92ZXJyaWRlcy5tYXAoc29ydEVzbGludENvbmZpZykpLFxuICApLFxuICBvdmVyUHJvcGVydHkoJ3BhcnNlck9wdGlvbnMnLCBzb3J0T2JqZWN0KSxcbiAgb3ZlclByb3BlcnR5KFxuICAgICdydWxlcycsXG4gICAgc29ydE9iamVjdEJ5KFxuICAgICAgKHJ1bGUxLCBydWxlMikgPT5cbiAgICAgICAgcnVsZTEuc3BsaXQoJy8nKS5sZW5ndGggLSBydWxlMi5zcGxpdCgnLycpLmxlbmd0aCB8fFxuICAgICAgICBydWxlMS5sb2NhbGVDb21wYXJlKHJ1bGUyKSxcbiAgICApLFxuICApLFxuICBvdmVyUHJvcGVydHkoJ3NldHRpbmdzJywgc29ydE9iamVjdCksXG5dKVxuY29uc3Qgc29ydFZTQ29kZUJhZGdlT2JqZWN0ID0gc29ydE9iamVjdEJ5KFsnZGVzY3JpcHRpb24nLCAndXJsJywgJ2hyZWYnXSlcblxuY29uc3Qgc29ydFByZXR0aWVyQ29uZmlnID0gcGlwZShbXG4gIC8vIHNvcnQga2V5cyBhbHBoYWJldGljYWxseSwgYnV0IHB1dCBgb3ZlcnJpZGVzYCBhdCBib3R0b21cbiAgb25PYmplY3QoKGNvbmZpZykgPT5cbiAgICBzb3J0T2JqZWN0S2V5cyhjb25maWcsIFtcbiAgICAgIC4uLk9iamVjdC5rZXlzKGNvbmZpZylcbiAgICAgICAgLmZpbHRlcigoa2V5KSA9PiBrZXkgIT09ICdvdmVycmlkZXMnKVxuICAgICAgICAuc29ydCgpLFxuICAgICAgJ292ZXJyaWRlcycsXG4gICAgXSksXG4gICksXG4gIC8vIGlmIGBjb25maWcub3ZlcnJpZGVzYCBleGlzdHNcbiAgb3ZlclByb3BlcnR5KFxuICAgICdvdmVycmlkZXMnLFxuICAgIC8vIGFuZCBgY29uZmlnLm92ZXJyaWRlc2AgaXMgYW4gYXJyYXlcbiAgICBvbkFycmF5KChvdmVycmlkZXMpID0+XG4gICAgICBvdmVycmlkZXMubWFwKFxuICAgICAgICBwaXBlKFtcbiAgICAgICAgICAvLyBzb3J0IGBjb25maWcub3ZlcnJpZGVzW11gIGFscGhhYmV0aWNhbGx5XG4gICAgICAgICAgc29ydE9iamVjdCxcbiAgICAgICAgICAvLyBzb3J0IGBjb25maWcub3ZlcnJpZGVzW10ub3B0aW9uc2AgYWxwaGFiZXRpY2FsbHlcbiAgICAgICAgICBvdmVyUHJvcGVydHkoJ29wdGlvbnMnLCBzb3J0T2JqZWN0KSxcbiAgICAgICAgXSksXG4gICAgICApLFxuICAgICksXG4gICksXG5dKVxuXG5jb25zdCBzb3J0Vm9sdGEgPSBzb3J0T2JqZWN0QnkoWydub2RlJywgJ25wbScsICd5YXJuJ10pXG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvd2lyZWl0XG5jb25zdCB3aXJlaXRTY3JpcHRQcm9wZXJ0aWVzID0gWydjb21tYW5kJywgJ2RlcGVuZGVuY2llcycsICdmaWxlcycsICdvdXRwdXQnXVxuY29uc3Qgc29ydFdpcmVpdFNjcmlwdCA9IHBpcGUoW1xuICBzb3J0T2JqZWN0Qnkod2lyZWl0U2NyaXB0UHJvcGVydGllcyksXG4gIG92ZXJQcm9wZXJ0eShcbiAgICAnZGVwZW5kZW5jaWVzJyxcbiAgICBvbkFycmF5KChkZXBzKSA9PiBkZXBzLm1hcChzb3J0T2JqZWN0QnkoWydzY3JpcHQnLCAnY2FzY2FkZSddKSkpLFxuICApLFxuICBvdmVyUHJvcGVydHkoXG4gICAgJ2VudicsXG4gICAgb25PYmplY3QoKGVudikgPT5cbiAgICAgIHNvcnRPYmplY3RLZXlzKFxuICAgICAgICBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgT2JqZWN0LmVudHJpZXMoZW52KS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gW1xuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgc29ydE9iamVjdEJ5KFsnZXh0ZXJuYWwnLCAnZGVmYXVsdCddKSh2YWx1ZSksXG4gICAgICAgICAgXSksXG4gICAgICAgICksXG4gICAgICApLFxuICAgICksXG4gICksXG4gIG92ZXJQcm9wZXJ0eShcbiAgICAnc2VydmljZScsXG4gICAgcGlwZShbc29ydE9iamVjdEJ5KFsncmVhZHlXaGVuJ10pLCBvdmVyUHJvcGVydHkoJ3JlYWR5V2hlbicsIHNvcnRPYmplY3QpXSksXG4gICksXG5dKVxuY29uc3Qgc29ydFdpcmVpdCA9IG9uT2JqZWN0KCh3aXJlaXQpID0+XG4gIHNvcnRPYmplY3RLZXlzKFxuICAgIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIE9iamVjdC5lbnRyaWVzKHdpcmVpdCkubWFwKChbbmFtZSwgY29uZmlnXSkgPT4gW1xuICAgICAgICBuYW1lLFxuICAgICAgICBzb3J0V2lyZWl0U2NyaXB0KGNvbmZpZyksXG4gICAgICBdKSxcbiAgICApLFxuICApLFxuKVxuY29uc3Qgc29ydERldkVuZ2luZXMgPSBvdmVyUHJvcGVydHkoXG4gICdwYWNrYWdlTWFuYWdlcicsXG4gIHNvcnRPYmplY3RCeShbJ25hbWUnLCAndmVyc2lvbicsICdvbkZhaWwnXSksXG4pXG5cbmNvbnN0IHBucG1CYXNlQ29uZmlnUHJvcGVydGllcyA9IFtcbiAgJ3BlZXJEZXBlbmRlbmN5UnVsZXMnLFxuICAnbmV2ZXJCdWlsdERlcGVuZGVuY2llcycsXG4gICdvbmx5QnVpbHREZXBlbmRlbmNpZXMnLFxuICAnb25seUJ1aWx0RGVwZW5kZW5jaWVzRmlsZScsXG4gICdhbGxvd2VkRGVwcmVjYXRlZFZlcnNpb25zJyxcbiAgJ2FsbG93Tm9uQXBwbGllZFBhdGNoZXMnLFxuICAndXBkYXRlQ29uZmlnJyxcbiAgJ2F1ZGl0Q29uZmlnJyxcbiAgJ3JlcXVpcmVkU2NyaXB0cycsXG4gICdzdXBwb3J0ZWRBcmNoaXRlY3R1cmVzJyxcbiAgJ292ZXJyaWRlcycsXG4gICdwYXRjaGVkRGVwZW5kZW5jaWVzJyxcbiAgJ3BhY2thZ2VFeHRlbnNpb25zJyxcbl1cblxuY29uc3Qgc29ydFBucG1Db25maWcgPSBwaXBlKFtcbiAgc29ydE9iamVjdEJ5KHBucG1CYXNlQ29uZmlnUHJvcGVydGllcywgdHJ1ZSksXG4gIG92ZXJQcm9wZXJ0eSgnb3ZlcnJpZGVzJywgc29ydE9iamVjdEJ5U2VtdmVyKSxcbl0pXG5cbi8vIFNlZSBodHRwczovL2RvY3MubnBtanMuY29tL21pc2Mvc2NyaXB0c1xuY29uc3QgZGVmYXVsdE5wbVNjcmlwdHMgPSBuZXcgU2V0KFtcbiAgJ2luc3RhbGwnLFxuICAncGFjaycsXG4gICdwcmVwYXJlJyxcbiAgJ3B1Ymxpc2gnLFxuICAncmVzdGFydCcsXG4gICdzaHJpbmt3cmFwJyxcbiAgJ3N0YXJ0JyxcbiAgJ3N0b3AnLFxuICAndGVzdCcsXG4gICd1bmluc3RhbGwnLFxuICAndmVyc2lvbicsXG5dKVxuXG5jb25zdCBoYXNEZXZEZXBlbmRlbmN5ID0gKGRlcGVuZGVuY3ksIHBhY2thZ2VKc29uKSA9PiB7XG4gIHJldHVybiAoXG4gICAgT2JqZWN0Lmhhc093bihwYWNrYWdlSnNvbiwgJ2RldkRlcGVuZGVuY2llcycpICYmXG4gICAgT2JqZWN0Lmhhc093bihwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMsIGRlcGVuZGVuY3kpXG4gIClcbn1cblxuY29uc3QgcnVuU1JlZ0V4cCA9XG4gIC8oPzw9XnxbXFxzJjs8PnwoXSkoPzpydW4tc3xucG0tcnVuLWFsbDI/IC4qKD86LS1zZXF1ZW50aWFsfC0tc2VyaWFsfC1zKSkoPz0kfFtcXHMmOzw+fCldKS9cblxuY29uc3QgaXNTZXF1ZW50aWFsU2NyaXB0ID0gKGNvbW1hbmQpID0+XG4gIGNvbW1hbmQuaW5jbHVkZXMoJyonKSAmJiBydW5TUmVnRXhwLnRlc3QoY29tbWFuZClcblxuY29uc3QgaGFzU2VxdWVudGlhbFNjcmlwdCA9IChwYWNrYWdlSnNvbikgPT4ge1xuICBpZiAoXG4gICAgIWhhc0RldkRlcGVuZGVuY3koJ25wbS1ydW4tYWxsJywgcGFja2FnZUpzb24pICYmXG4gICAgIWhhc0RldkRlcGVuZGVuY3koJ25wbS1ydW4tYWxsMicsIHBhY2thZ2VKc29uKVxuICApIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuICBjb25zdCBzY3JpcHRzID0gWydzY3JpcHRzJywgJ2JldHRlclNjcmlwdHMnXS5mbGF0TWFwKChmaWVsZCkgPT5cbiAgICBwYWNrYWdlSnNvbltmaWVsZF0gPyBPYmplY3QudmFsdWVzKHBhY2thZ2VKc29uW2ZpZWxkXSkgOiBbXSxcbiAgKVxuICByZXR1cm4gc2NyaXB0cy5zb21lKChzY3JpcHQpID0+IGlzU2VxdWVudGlhbFNjcmlwdChzY3JpcHQpKVxufVxuXG5mdW5jdGlvbiBzb3J0U2NyaXB0TmFtZXMoa2V5cywgcHJlZml4ID0gJycpIHtcbiAgY29uc3QgZ3JvdXBNYXAgPSBuZXcgTWFwKClcbiAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgIGNvbnN0IHJlc3QgPSBwcmVmaXggPyBrZXkuc2xpY2UocHJlZml4Lmxlbmd0aCArIDEpIDoga2V5XG4gICAgY29uc3QgaWR4ID0gcmVzdC5pbmRleE9mKCc6JylcbiAgICBpZiAoaWR4ID4gMCkge1xuICAgICAgY29uc3QgYmFzZSA9IGtleS5zbGljZSgwLCAocHJlZml4ID8gcHJlZml4Lmxlbmd0aCArIDEgOiAwKSArIGlkeClcbiAgICAgIGlmICghZ3JvdXBNYXAuaGFzKGJhc2UpKSBncm91cE1hcC5zZXQoYmFzZSwgW10pXG4gICAgICBncm91cE1hcC5nZXQoYmFzZSkucHVzaChrZXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghZ3JvdXBNYXAuaGFzKGtleSkpIGdyb3VwTWFwLnNldChrZXksIFtdKVxuICAgICAgZ3JvdXBNYXAuZ2V0KGtleSkucHVzaChrZXkpXG4gICAgfVxuICB9XG4gIHJldHVybiBBcnJheS5mcm9tKGdyb3VwTWFwLmtleXMoKSlcbiAgICAuc29ydCgpXG4gICAgLmZsYXRNYXAoKGdyb3VwS2V5KSA9PiB7XG4gICAgICBjb25zdCBjaGlsZHJlbiA9IGdyb3VwTWFwLmdldChncm91cEtleSlcbiAgICAgIGlmIChcbiAgICAgICAgY2hpbGRyZW4ubGVuZ3RoID4gMSAmJlxuICAgICAgICBjaGlsZHJlbi5zb21lKChrKSA9PiBrICE9PSBncm91cEtleSAmJiBrLnN0YXJ0c1dpdGgoZ3JvdXBLZXkgKyAnOicpKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGRpcmVjdCA9IGNoaWxkcmVuXG4gICAgICAgICAgLmZpbHRlcigoaykgPT4gayA9PT0gZ3JvdXBLZXkgfHwgIWsuc3RhcnRzV2l0aChncm91cEtleSArICc6JykpXG4gICAgICAgICAgLnNvcnQoKVxuICAgICAgICBjb25zdCBuZXN0ZWQgPSBjaGlsZHJlbi5maWx0ZXIoKGspID0+IGsuc3RhcnRzV2l0aChncm91cEtleSArICc6JykpXG4gICAgICAgIHJldHVybiBbLi4uZGlyZWN0LCAuLi5zb3J0U2NyaXB0TmFtZXMobmVzdGVkLCBncm91cEtleSldXG4gICAgICB9XG4gICAgICByZXR1cm4gY2hpbGRyZW4uc29ydCgpXG4gICAgfSlcbn1cblxuY29uc3Qgc29ydFNjcmlwdHMgPSBvbk9iamVjdCgoc2NyaXB0cywgcGFja2FnZUpzb24pID0+IHtcbiAgbGV0IG5hbWVzID0gT2JqZWN0LmtleXMoc2NyaXB0cylcbiAgY29uc3QgcHJlZml4YWJsZSA9IG5ldyBTZXQoKVxuXG4gIG5hbWVzID0gbmFtZXMubWFwKChuYW1lKSA9PiB7XG4gICAgY29uc3Qgb21pdHRlZCA9IG5hbWUucmVwbGFjZSgvXig/OnByZXxwb3N0KS8sICcnKVxuICAgIGlmIChkZWZhdWx0TnBtU2NyaXB0cy5oYXMob21pdHRlZCkgfHwgbmFtZXMuaW5jbHVkZXMob21pdHRlZCkpIHtcbiAgICAgIHByZWZpeGFibGUuYWRkKG9taXR0ZWQpXG4gICAgICByZXR1cm4gb21pdHRlZFxuICAgIH1cbiAgICByZXR1cm4gbmFtZVxuICB9KVxuXG4gIGlmICghaGFzU2VxdWVudGlhbFNjcmlwdChwYWNrYWdlSnNvbikpIHtcbiAgICBuYW1lcyA9IHNvcnRTY3JpcHROYW1lcyhuYW1lcylcbiAgfVxuICBuYW1lcyA9IG5hbWVzLmZsYXRNYXAoKGtleSkgPT5cbiAgICBwcmVmaXhhYmxlLmhhcyhrZXkpID8gW2BwcmUke2tleX1gLCBrZXksIGBwb3N0JHtrZXl9YF0gOiBba2V5XSxcbiAgKVxuICByZXR1cm4gc29ydE9iamVjdEtleXMoc2NyaXB0cywgbmFtZXMpXG59KVxuXG4vKlxuLSBNb3ZlIGBkZWZhdWx0YCBjb25kaXRpb24gdG8gYm90dG9tXG4qL1xuY29uc3Qgc29ydENvbmRpdGlvbnMgPSAoY29uZGl0aW9ucykgPT4ge1xuICBjb25zdCB7IGRlZmF1bHRDb25kaXRpb25zID0gW10sIHJlc3RDb25kaXRpb25zID0gW10gfSA9IE9iamVjdC5ncm91cEJ5KFxuICAgIGNvbmRpdGlvbnMsXG4gICAgKGNvbmRpdGlvbikgPT4ge1xuICAgICAgaWYgKGNvbmRpdGlvbiA9PT0gJ2RlZmF1bHQnKSB7XG4gICAgICAgIHJldHVybiAnZGVmYXVsdENvbmRpdGlvbnMnXG4gICAgICB9XG5cbiAgICAgIHJldHVybiAncmVzdENvbmRpdGlvbnMnXG4gICAgfSxcbiAgKVxuXG4gIHJldHVybiBbLi4ucmVzdENvbmRpdGlvbnMsIC4uLmRlZmF1bHRDb25kaXRpb25zXVxufVxuXG5jb25zdCBzb3J0RXhwb3J0cyA9IG9uT2JqZWN0KChleHBvcnRzKSA9PiB7XG4gIGNvbnN0IHsgcGF0aHMgPSBbXSwgY29uZGl0aW9ucyA9IFtdIH0gPSBPYmplY3QuZ3JvdXBCeShcbiAgICBPYmplY3Qua2V5cyhleHBvcnRzKSxcbiAgICAoa2V5KSA9PiAoa2V5LnN0YXJ0c1dpdGgoJy4nKSA/ICdwYXRocycgOiAnY29uZGl0aW9ucycpLFxuICApXG5cbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBbLi4ucGF0aHMsIC4uLnNvcnRDb25kaXRpb25zKGNvbmRpdGlvbnMpXS5tYXAoKGtleSkgPT4gW1xuICAgICAga2V5LFxuICAgICAgc29ydEV4cG9ydHMoZXhwb3J0c1trZXldKSxcbiAgICBdKSxcbiAgKVxufSlcblxuLy8gZmllbGRzIG1hcmtlZCBgdnNjb2RlYCBhcmUgZm9yIGBWaXN1YWwgU3R1ZGlvIENvZGUgZXh0ZW5zaW9uIG1hbmlmZXN0YCBvbmx5XG4vLyBodHRwczovL2NvZGUudmlzdWFsc3R1ZGlvLmNvbS9hcGkvcmVmZXJlbmNlcy9leHRlbnNpb24tbWFuaWZlc3Rcbi8vIFN1cHBvcnRlZCBmaWVsZHM6XG4vLyBwdWJsaXNoZXIsIGRpc3BsYXlOYW1lLCBjYXRlZ29yaWVzLCBnYWxsZXJ5QmFubmVyLCBwcmV2aWV3LCBjb250cmlidXRlcyxcbi8vIGFjdGl2YXRpb25FdmVudHMsIGJhZGdlcywgbWFya2Rvd24sIHFuYSwgZXh0ZW5zaW9uUGFjayxcbi8vIGV4dGVuc2lvbkRlcGVuZGVuY2llcywgaWNvblxuXG4vLyBmaWVsZC5rZXl7c3RyaW5nfTogZmllbGQgbmFtZVxuLy8gZmllbGQub3ZlcntmdW5jdGlvbn06IHNvcnQgZmllbGQgc3ViS2V5XG5jb25zdCBmaWVsZHMgPSBbXG4gIHsga2V5OiAnJHNjaGVtYScgfSxcbiAgeyBrZXk6ICduYW1lJyB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdkaXNwbGF5TmFtZScgfSxcbiAgeyBrZXk6ICd2ZXJzaW9uJyB9LFxuICAvKiB5YXJuICovIHsga2V5OiAnc3RhYmxlVmVyc2lvbicgfSxcbiAgeyBrZXk6ICdwcml2YXRlJyB9LFxuICB7IGtleTogJ2Rlc2NyaXB0aW9uJyB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdjYXRlZ29yaWVzJywgb3ZlcjogdW5pcSB9LFxuICB7IGtleTogJ2tleXdvcmRzJywgb3ZlcjogdW5pcSB9LFxuICB7IGtleTogJ2hvbWVwYWdlJyB9LFxuICB7IGtleTogJ2J1Z3MnLCBvdmVyOiBzb3J0T2JqZWN0QnkoWyd1cmwnLCAnZW1haWwnXSkgfSxcbiAgeyBrZXk6ICdyZXBvc2l0b3J5Jywgb3Zlcjogc29ydFVSTE9iamVjdCB9LFxuICB7IGtleTogJ2Z1bmRpbmcnLCBvdmVyOiBzb3J0VVJMT2JqZWN0IH0sXG4gIHsga2V5OiAnbGljZW5zZScsIG92ZXI6IHNvcnRVUkxPYmplY3QgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAncW5hJyB9LFxuICB7IGtleTogJ2F1dGhvcicsIG92ZXI6IHNvcnRQZW9wbGVPYmplY3QgfSxcbiAge1xuICAgIGtleTogJ21haW50YWluZXJzJyxcbiAgICBvdmVyOiBvbkFycmF5KChtYWludGFpbmVycykgPT4gbWFpbnRhaW5lcnMubWFwKHNvcnRQZW9wbGVPYmplY3QpKSxcbiAgfSxcbiAge1xuICAgIGtleTogJ2NvbnRyaWJ1dG9ycycsXG4gICAgb3Zlcjogb25BcnJheSgoY29udHJpYnV0b3JzKSA9PiBjb250cmlidXRvcnMubWFwKHNvcnRQZW9wbGVPYmplY3QpKSxcbiAgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAncHVibGlzaGVyJyB9LFxuICB7IGtleTogJ3NpZGVFZmZlY3RzJyB9LFxuICB7IGtleTogJ3R5cGUnIH0sXG4gIHsga2V5OiAnaW1wb3J0cycgfSxcbiAgeyBrZXk6ICdleHBvcnRzJywgb3Zlcjogc29ydEV4cG9ydHMgfSxcbiAgeyBrZXk6ICdtYWluJyB9LFxuICB7IGtleTogJ3N2ZWx0ZScgfSxcbiAgeyBrZXk6ICd1bWQ6bWFpbicgfSxcbiAgeyBrZXk6ICdqc2RlbGl2cicgfSxcbiAgeyBrZXk6ICd1bnBrZycgfSxcbiAgeyBrZXk6ICdtb2R1bGUnIH0sXG4gIHsga2V5OiAnc291cmNlJyB9LFxuICB7IGtleTogJ2pzbmV4dDptYWluJyB9LFxuICB7IGtleTogJ2Jyb3dzZXInIH0sXG4gIHsga2V5OiAncmVhY3QtbmF0aXZlJyB9LFxuICB7IGtleTogJ3R5cGVzJyB9LFxuICB7IGtleTogJ3R5cGVzVmVyc2lvbnMnIH0sXG4gIHsga2V5OiAndHlwaW5ncycgfSxcbiAgeyBrZXk6ICdzdHlsZScgfSxcbiAgeyBrZXk6ICdleGFtcGxlJyB9LFxuICB7IGtleTogJ2V4YW1wbGVzdHlsZScgfSxcbiAgeyBrZXk6ICdhc3NldHMnIH0sXG4gIHsga2V5OiAnYmluJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ21hbicgfSxcbiAgeyBrZXk6ICdkaXJlY3RvcmllcycsIG92ZXI6IHNvcnREaXJlY3RvcmllcyB9LFxuICB7IGtleTogJ2ZpbGVzJywgb3ZlcjogdW5pcSB9LFxuICB7IGtleTogJ3dvcmtzcGFjZXMnLCBvdmVyOiBzb3J0V29ya3NwYWNlcyB9LFxuICAvLyBub2RlLXByZS1neXAgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2Uvbm9kZS1wcmUtZ3lwIzEtYWRkLW5ldy1lbnRyaWVzLXRvLXlvdXItcGFja2FnZWpzb25cbiAge1xuICAgIGtleTogJ2JpbmFyeScsXG4gICAgb3Zlcjogc29ydE9iamVjdEJ5KFtcbiAgICAgICdtb2R1bGVfbmFtZScsXG4gICAgICAnbW9kdWxlX3BhdGgnLFxuICAgICAgJ3JlbW90ZV9wYXRoJyxcbiAgICAgICdwYWNrYWdlX25hbWUnLFxuICAgICAgJ2hvc3QnLFxuICAgIF0pLFxuICB9LFxuICB7IGtleTogJ3NjcmlwdHMnLCBvdmVyOiBzb3J0U2NyaXB0cyB9LFxuICB7IGtleTogJ2JldHRlclNjcmlwdHMnLCBvdmVyOiBzb3J0U2NyaXB0cyB9LFxuICB7IGtleTogJ3dpcmVpdCcsIG92ZXI6IHNvcnRXaXJlaXQgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnbDEwbicgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnY29udHJpYnV0ZXMnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2FjdGl2YXRpb25FdmVudHMnLCBvdmVyOiB1bmlxIH0sXG4gIHsga2V5OiAnaHVza3knLCBvdmVyOiBvdmVyUHJvcGVydHkoJ2hvb2tzJywgc29ydEdpdEhvb2tzKSB9LFxuICB7IGtleTogJ3NpbXBsZS1naXQtaG9va3MnLCBvdmVyOiBzb3J0R2l0SG9va3MgfSxcbiAgeyBrZXk6ICdwcmUtY29tbWl0JyB9LFxuICB7IGtleTogJ2NvbW1pdGxpbnQnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnbGludC1zdGFnZWQnIH0sXG4gIHsga2V5OiAnbmFuby1zdGFnZWQnIH0sXG4gIHsga2V5OiAnY29uZmlnJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ25vZGVtb25Db25maWcnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnYnJvd3NlcmlmeScsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdiYWJlbCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdicm93c2Vyc2xpc3QnIH0sXG4gIHsga2V5OiAneG8nLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAncHJldHRpZXInLCBvdmVyOiBzb3J0UHJldHRpZXJDb25maWcgfSxcbiAgeyBrZXk6ICdlc2xpbnRDb25maWcnLCBvdmVyOiBzb3J0RXNsaW50Q29uZmlnIH0sXG4gIHsga2V5OiAnZXNsaW50SWdub3JlJyB9LFxuICB7IGtleTogJ25wbXBrZ2pzb25saW50Jywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ25wbVBhY2thZ2VKc29uTGludENvbmZpZycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICducG1wYWNrYWdlanNvbmxpbnQnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAncmVsZWFzZScsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdyZW1hcmtDb25maWcnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnc3R5bGVsaW50JyB9LFxuICB7IGtleTogJ2F2YScsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdqZXN0Jywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2plc3QtanVuaXQnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnamVzdC1zdGFyZScsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdtb2NoYScsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdueWMnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnYzgnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAndGFwJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ29jbGlmJywgb3Zlcjogc29ydE9iamVjdEJ5KHVuZGVmaW5lZCwgdHJ1ZSkgfSxcbiAgeyBrZXk6ICdyZXNvbHV0aW9ucycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdvdmVycmlkZXMnLCBvdmVyOiBzb3J0RGVwZW5kZW5jaWVzIH0sXG4gIHsga2V5OiAnZGVwZW5kZW5jaWVzJywgb3Zlcjogc29ydERlcGVuZGVuY2llcyB9LFxuICB7IGtleTogJ2RldkRlcGVuZGVuY2llcycsIG92ZXI6IHNvcnREZXBlbmRlbmNpZXMgfSxcbiAgeyBrZXk6ICdkZXBlbmRlbmNpZXNNZXRhJywgb3Zlcjogc29ydE9iamVjdEJ5KHNvcnRPYmplY3RCeUlkZW50LCB0cnVlKSB9LFxuICB7IGtleTogJ3BlZXJEZXBlbmRlbmNpZXMnLCBvdmVyOiBzb3J0RGVwZW5kZW5jaWVzIH0sXG4gIC8vIFRPRE86IG9ubHkgc29ydCBkZXB0aCA9IDJcbiAgeyBrZXk6ICdwZWVyRGVwZW5kZW5jaWVzTWV0YScsIG92ZXI6IHNvcnRPYmplY3RCeSh1bmRlZmluZWQsIHRydWUpIH0sXG4gIHsga2V5OiAnb3B0aW9uYWxEZXBlbmRlbmNpZXMnLCBvdmVyOiBzb3J0RGVwZW5kZW5jaWVzIH0sXG4gIHsga2V5OiAnYnVuZGxlZERlcGVuZGVuY2llcycsIG92ZXI6IHVuaXFBbmRTb3J0QXJyYXkgfSxcbiAgeyBrZXk6ICdidW5kbGVEZXBlbmRlbmNpZXMnLCBvdmVyOiB1bmlxQW5kU29ydEFycmF5IH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2V4dGVuc2lvblBhY2snLCBvdmVyOiB1bmlxQW5kU29ydEFycmF5IH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2V4dGVuc2lvbkRlcGVuZGVuY2llcycsIG92ZXI6IHVuaXFBbmRTb3J0QXJyYXkgfSxcbiAgeyBrZXk6ICdmbGF0JyB9LFxuICB7IGtleTogJ3BhY2thZ2VNYW5hZ2VyJyB9LFxuICB7IGtleTogJ2VuZ2luZXMnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnZW5naW5lU3RyaWN0Jywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2RldkVuZ2luZXMnLCBvdmVyOiBzb3J0RGV2RW5naW5lcyB9LFxuICB7IGtleTogJ3ZvbHRhJywgb3Zlcjogc29ydFZvbHRhIH0sXG4gIHsga2V5OiAnbGFuZ3VhZ2VOYW1lJyB9LFxuICB7IGtleTogJ29zJyB9LFxuICB7IGtleTogJ2NwdScgfSxcbiAgeyBrZXk6ICdwcmVmZXJHbG9iYWwnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAncHVibGlzaENvbmZpZycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnaWNvbicgfSxcbiAgLyogdnNjb2RlICovIHtcbiAgICBrZXk6ICdiYWRnZXMnLFxuICAgIG92ZXI6IG9uQXJyYXkoKGJhZGdlKSA9PiBiYWRnZS5tYXAoc29ydFZTQ29kZUJhZGdlT2JqZWN0KSksXG4gIH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2dhbGxlcnlCYW5uZXInLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ3ByZXZpZXcnIH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ21hcmtkb3duJyB9LFxuICB7IGtleTogJ3BucG0nLCBvdmVyOiBzb3J0UG5wbUNvbmZpZyB9LFxuXVxuXG5jb25zdCBkZWZhdWx0U29ydE9yZGVyID0gZmllbGRzLm1hcCgoeyBrZXkgfSkgPT4ga2V5KVxuY29uc3Qgb3ZlckZpZWxkcyA9IHBpcGUoXG4gIGZpZWxkc1xuICAgIC5tYXAoKHsga2V5LCBvdmVyIH0pID0+IChvdmVyID8gb3ZlclByb3BlcnR5KGtleSwgb3ZlcikgOiB1bmRlZmluZWQpKVxuICAgIC5maWx0ZXIoQm9vbGVhbiksXG4pXG5cbmZ1bmN0aW9uIGVkaXRTdHJpbmdKU09OKGpzb24sIG92ZXIpIHtcbiAgaWYgKHR5cGVvZiBqc29uID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IHsgaW5kZW50LCB0eXBlIH0gPSBkZXRlY3RJbmRlbnQoanNvbilcbiAgICBjb25zdCBlbmRDaGFyYWN0ZXJzID0ganNvbi5zbGljZSgtMSkgPT09ICdcXG4nID8gJ1xcbicgOiAnJ1xuICAgIGNvbnN0IG5ld2xpbmUgPSBkZXRlY3ROZXdsaW5lKGpzb24pXG4gICAganNvbiA9IEpTT04ucGFyc2UoanNvbilcblxuICAgIGxldCByZXN1bHQgPVxuICAgICAgSlNPTi5zdHJpbmdpZnkob3Zlcihqc29uKSwgbnVsbCwgdHlwZSA9PT0gJ3RhYicgPyAnXFx0JyA6IGluZGVudCkgK1xuICAgICAgZW5kQ2hhcmFjdGVyc1xuICAgIGlmIChuZXdsaW5lID09PSAnXFxyXFxuJykge1xuICAgICAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoL1xcbi9nLCBuZXdsaW5lKVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICByZXR1cm4gb3Zlcihqc29uKVxufVxuXG5mdW5jdGlvbiBzb3J0UGFja2FnZUpzb24oanNvbklzaCwgb3B0aW9ucyA9IHt9KSB7XG4gIHJldHVybiBlZGl0U3RyaW5nSlNPTihcbiAgICBqc29uSXNoLFxuICAgIG9uT2JqZWN0KChqc29uKSA9PiB7XG4gICAgICBsZXQgc29ydE9yZGVyID0gb3B0aW9ucy5zb3J0T3JkZXIgfHwgZGVmYXVsdFNvcnRPcmRlclxuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShzb3J0T3JkZXIpKSB7XG4gICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhqc29uKVxuICAgICAgICBjb25zdCB7IHByaXZhdGVLZXlzID0gW10sIHB1YmxpY0tleXMgPSBbXSB9ID0gT2JqZWN0Lmdyb3VwQnkoXG4gICAgICAgICAga2V5cyxcbiAgICAgICAgICAoa2V5KSA9PiAoa2V5WzBdID09PSAnXycgPyAncHJpdmF0ZUtleXMnIDogJ3B1YmxpY0tleXMnKSxcbiAgICAgICAgKVxuICAgICAgICBzb3J0T3JkZXIgPSBbXG4gICAgICAgICAgLi4uc29ydE9yZGVyLFxuICAgICAgICAgIC4uLmRlZmF1bHRTb3J0T3JkZXIsXG4gICAgICAgICAgLi4ucHVibGljS2V5cy5zb3J0KCksXG4gICAgICAgICAgLi4ucHJpdmF0ZUtleXMuc29ydCgpLFxuICAgICAgICBdXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvdmVyRmllbGRzKHNvcnRPYmplY3RLZXlzKGpzb24sIHNvcnRPcmRlciksIGpzb24pXG4gICAgfSksXG4gIClcbn1cblxuZXhwb3J0IGRlZmF1bHQgc29ydFBhY2thZ2VKc29uXG5leHBvcnQgeyBzb3J0UGFja2FnZUpzb24sIGRlZmF1bHRTb3J0T3JkZXIgYXMgc29ydE9yZGVyIH1cbiIsImltcG9ydCB7IHNwYXduU3luY0FuZFJldHVyblN0ZG91dCB9IGZyb20gJy4uL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMYXRlc3RDb21taXRIYXNoKG9yZ2FuaXphdGlvbjogc3RyaW5nLCByZXBvOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICB0cnkge1xuICAgIGNvbnN0IHJlcG9VcmwgPSBgZ2l0QGdpdGh1Yi5jb206JHtvcmdhbml6YXRpb259LyR7cmVwb30uZ2l0YDtcbiAgICBjb25zdCBvdXRwdXQgPSBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoJ2dpdCcsIFsnbHMtcmVtb3RlJywgcmVwb1VybCwgJ0hFQUQnXSwgcHJvY2Vzcy5jd2QoKSk7XG4gICAgY29uc3QgY29tbWl0SGFzaCA9IG91dHB1dC5zcGxpdCgvXFxzKy8pWzBdO1xuICAgIGlmICghY29tbWl0SGFzaCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBjb21taXRzIGZvdW5kIGZvciAke29yZ2FuaXphdGlvbn0vJHtyZXBvfWApO1xuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGNvbW1pdEhhc2gpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYEZhaWxlZCB0byBmZXRjaCBjb21taXRzIGZvciAke29yZ2FuaXphdGlvbn0vJHtyZXBvfTogJHtTdHJpbmcoZXJyb3IpfWApKTtcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmV4cG9ydCBjb25zdCBtYW5hZ2VkVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzID0gW1xuICAnQHRzY29uZmlnL2J1bicsXG4gICdAdHNjb25maWcvbm9kZS1sdHMnLFxuICAnQHRzY29uZmlnL25vZGUtdHMnLFxuICAnQHRzY29uZmlnL3JlYWN0LW5hdGl2ZScsXG5dO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHNjb25maWdFeHRlbmRzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgLy8gUmVhY3QgTmF0aXZlIG5lZWRzIE1ldHJvLWNvbXBhdGlibGUgc2V0dGluZ3MgKGpzeDogcmVhY3QtbmF0aXZlLCBub2RlIHJlc29sdXRpb24pLCB3aGljaFxuICAvLyBAdHNjb25maWcvYnVuIHdvdWxkIG92ZXJyaWRlIGV2ZW4gdGhvdWdoIHRoZSByZXBvIHVzZXMgQnVuIGFzIGl0cyBwYWNrYWdlIG1hbmFnZXIuXG4gIGlmIChjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgcmV0dXJuICdAdHNjb25maWcvcmVhY3QtbmF0aXZlL3RzY29uZmlnLmpzb24nO1xuICB9XG4gIHJldHVybiAnQHRzY29uZmlnL2J1bi90c2NvbmZpZy5qc29uJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmdbXSB7XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6IHx8IGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBpZiAoY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgIHJldHVybiBbJ0B0c2NvbmZpZy9yZWFjdC1uYXRpdmUnXTtcbiAgfVxuICByZXR1cm4gWydAdHNjb25maWcvYnVuJ107XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBtb2R1bGUgc3BlY2lmaWVyIGEgZ2VuZXJhdGVkIGNvbmZpZyBmaWxlIHNob3VsZCB1c2UgdG8gbG9hZCBhXG4gKiB3aWxsYm9vc3Rlci1jb25maWdzIGNvbmZpZyBwYWNrYWdlIHN1Y2ggYXMgYEB3aWxsYm9vc3Rlci9veGxpbnQtY29uZmlnYC5cbiAqXG4gKiBPdXRzaWRlIHdpbGxib29zdGVyLWNvbmZpZ3MgdGhpcyBpcyBzaW1wbHkgdGhlIHB1Ymxpc2hlZCBwYWNrYWdlIG5hbWUuIEluc2lkZVxuICogd2lsbGJvb3N0ZXItY29uZmlncyB0aGUgcGFja2FnZSBtdXN0IG5vdCBiZSBkZWNsYXJlZCBhcyBhIGRlcGVuZGVuY3k6IHRoZVxuICogY29uZmlnIHBhY2thZ2VzIGltcG9ydCBvbmUgYW5vdGhlciAoZS5nLiBveGZtdC1jb25maWcncyBveGxpbnQuY29uZmlnLnRzXG4gKiBpbXBvcnRzIG94bGludC1jb25maWcgYW5kIHZpY2UgdmVyc2EpLCBzbyBhIGRlY2xhcmVkIGVkZ2Ugd291bGQgZm9ybSBhXG4gKiBkZXBlbmRlbmN5IGN5Y2xlIHRoYXQgbXVsdGktc2VtYW50aWMtcmVsZWFzZSBjYW5ub3QgdG9wb2xvZ2ljYWxseSBzb3J0LiBTaW5jZVxuICogdGhlIGVkZ2UgaXMgYWJzZW50LCBpc29sYXRlZCBpbnN0YWxscyBjYW5ub3QgcmVzb2x2ZSB0aGUgYmFyZSBwYWNrYWdlIG5hbWUsIHNvXG4gKiBpbXBvcnQgdGhlIGNvbW1pdHRlZCBgY29uZmlnLm1qc2AgYnVpbGQgb3V0cHV0IHRocm91Z2ggYSByZWxhdGl2ZSBwYXRoIGluc3RlYWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlV2lsbGJvb3N0ZXJDb25maWdNb2R1bGUoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBjb25maWdQYWNrYWdlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCFjb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3MpIHJldHVybiBjb25maWdQYWNrYWdlTmFtZTtcblxuICAvLyBlLmcuICdAd2lsbGJvb3N0ZXIvb3hsaW50LWNvbmZpZycgLT4gJ294bGludC1jb25maWcnLCB3aGljaCBpcyBpdHMgZGlyZWN0b3J5IHVuZGVyIGBwYWNrYWdlcy9gLlxuICBjb25zdCBjb25maWdQYWNrYWdlRGlyID0gY29uZmlnUGFja2FnZU5hbWUuc3BsaXQoJy8nKS5wb3AoKSA/PyAnJztcbiAgLy8gRGVyaXZlIHRoZSB3aWxsYm9vc3Rlci1jb25maWdzIHJvb3QgZnJvbSB0aGUgcGFja2FnZSBiZWluZyBnZW5lcmF0ZWQsIG5vdCBmcm9tIHRoZSBDTEkgZW50cnlcbiAgLy8gcGF0aDogYHdiZnkgPHJlcG8+L3BhY2thZ2VzLzxwa2c+YCBpcyBhIHN1cHBvcnRlZCBpbnZvY2F0aW9uIHdob3NlIGVudHJ5IGNvbmZpZyBpcyB0aGUgY2hpbGRcbiAgLy8gcGFja2FnZSByYXRoZXIgdGhhbiB0aGUgcmVwbyByb290LCBzbyByZWx5aW5nIG9uIHRoZSBlbnRyeSB3b3VsZCBlbWl0IGEgbmVzdGVkLCB1bnJlc29sdmFibGVcbiAgLy8gcGF0aCBmb3IgYSBkaXJlY3RseSB0YXJnZXRlZCBjb25maWcgcGFja2FnZS4gRXZlcnkgd2lsbGJvb3N0ZXItY29uZmlncyBwYWNrYWdlIGlzIGVpdGhlciB0aGVcbiAgLy8gcm9vdCBvciBhIGRpcmVjdCBjaGlsZCB1bmRlciBgcGFja2FnZXMvYCwgc28gdGhlIHJvb3QgaXMgdGhlIHBhY2thZ2UgZGlyIGl0c2VsZiBvciBpdHMgZ3JhbmRwYXJlbnQuXG4gIGNvbnN0IHJlcG9Sb290RGlyUGF0aCA9IGNvbmZpZy5pc1Jvb3QgPyBjb25maWcuZGlyUGF0aCA6IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy4uJywgJy4uJyk7XG4gIGNvbnN0IGxvY2FsRW50cnkgPSBwYXRoLnJlc29sdmUocmVwb1Jvb3REaXJQYXRoLCAncGFja2FnZXMnLCBjb25maWdQYWNrYWdlRGlyLCAnY29uZmlnLm1qcycpO1xuICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKGNvbmZpZy5kaXJQYXRoLCBsb2NhbEVudHJ5KTtcbiAgcmV0dXJuIHJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuJykgPyByZWxhdGl2ZVBhdGggOiBgLi8ke3JlbGF0aXZlUGF0aH1gO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNQdWJsaXNoZWRXaWxsYm9vc3RlckNvbmZpZ3NQYWNrYWdlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIGNvbmZpZy5pc1dpbGxCb29zdGVyQ29uZmlncyAmJlxuICAgICFjb25maWcuaXNSb290ICYmXG4gICAgY29uZmlnLnBhY2thZ2VKc29uPy5wcml2YXRlICE9PSB0cnVlICYmXG4gICAgQXJyYXkuaXNBcnJheShjb25maWcucGFja2FnZUpzb24/LmZpbGVzKSAmJlxuICAgIGNvbmZpZy5wYWNrYWdlSnNvbi5maWxlcy5sZW5ndGggPiAwXG4gICk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBlc2NhcGVSZWdFeHAsIHF1b3RlRm9yU2hlbGwgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi9zcmMnO1xuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYic7XG5pbXBvcnQgc2VtdmVyIGZyb20gJ3NlbXZlcic7XG5pbXBvcnQgeyBzb3J0UGFja2FnZUpzb24gfSBmcm9tICdzb3J0LXBhY2thZ2UtanNvbic7XG5pbXBvcnQgKiBhcyBhc3QgZnJvbSAndHlwZXNjcmlwdC91bnN0YWJsZS9hc3QnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiwgU2V0UmVxdWlyZWQgfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBnZXRMYXRlc3RDb21taXRIYXNoIH0gZnJvbSAnLi4vZ2l0aHViL2NvbW1pdC5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVzV29ya2VyVHlwZXMsIGdldFdvcmtlclR5cGVzU2NyaXB0RXJyb3IsIHR5cGUgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgY2xhc3NpZnlTY3JpcHRTZWdtZW50LCBzcGxpdFNjcmlwdFNlZ21lbnRzIH0gZnJvbSAnLi4vdXRpbHMvbWFuYWdlZFNjcmlwdFNlZ21lbnQuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGdpdEh1YlV0aWwgfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcbmltcG9ydCB7IGNvbWJpbmVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBkb2VzQ29udGFpbkphdmEsIGRvZXNDb250YWluSnNPclRzIH0gZnJvbSAnLi4vdXRpbHMvcGFja2FnZUNhcGFiaWxpdGllcy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHNwYXduU3luYywgc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0IH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcbmltcG9ydCB7IGdldFRzY29uZmlnQmFzZURlcGVuZGVuY2llcywgbWFuYWdlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyB9IGZyb20gJy4uL3V0aWxzL3RzY29uZmlnQmFzZS5qcyc7XG5pbXBvcnQgeyBwYXJzZVNvdXJjZUZpbGUgfSBmcm9tICcuLi91dGlscy90eXBlc2NyaXB0QXBpLmpzJztcbmltcG9ydCB7IGlzUHVibGlzaGVkV2lsbGJvb3N0ZXJDb25maWdzUGFja2FnZSB9IGZyb20gJy4uL3V0aWxzL3dpbGxib29zdGVyQ29uZmlnc1V0aWwuanMnO1xuaW1wb3J0IHtcbiAgZ2V0RGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyxcbiAgZ2V0V29ya3NwYWNlUGFja2FnZUpzb25QYXRocyxcbiAgaGFzRGVjbGFyZWRQYWNrYWdlc1N0YXJQYXR0ZXJuLFxuICBoYXNJbXBsaWNpdFdvcmtzcGFjZUJhc2VsaW5lLFxufSBmcm9tICcuLi91dGlscy93b3Jrc3BhY2VVdGlsLmpzJztcbmltcG9ydCB7IGJ1bk1pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXMsIGJ1bk1pbmltdW1SZWxlYXNlQWdlU2Vjb25kcyB9IGZyb20gJy4vYnVuZmlnLmpzJztcblxuY29uc3Qgb3hsaW50RGVwcyA9IFsnQHdpbGxib29zdGVyL294Zm10LWNvbmZpZycsICdAd2lsbGJvb3N0ZXIvb3hsaW50LWNvbmZpZycsICdveGZtdCcsICdveGxpbnQnLCAnb3hsaW50LXRzZ29saW50J107XG5jb25zdCB0eXBlc2NyaXB0RGVwZW5kZW5jeSA9ICd0eXBlc2NyaXB0Jztcbi8vIFR5cGVTY3JpcHQgNydzIGB0eXBlc2NyaXB0YCBwYWNrYWdlIGlzIHRoZSB0c2dvIG5hdGl2ZSBjb21waWxlciBhbmQgZXhwb3NlcyBub1xuLy8gcHJvZ3JhbW1hdGljIEFQSS4gTmV4dC5qcydzIGJ1aWxkLXRpbWUgYHZlcmlmeVR5cGVTY3JpcHRTZXR1cGAgbmVlZHMgdGhhdCBBUEksIHNvXG4vLyBgbmV4dCBidWlsZGAgZmFpbHMgKFwidHJ5aW5nIHRvIHVzZSBUeXBlU2NyaXB0IGJ1dCBkbyBub3QgaGF2ZSB0aGUgcmVxdWlyZWQgcGFja2FnZShzKVwiKVxuLy8gd2l0aCBvbmx5IGB0eXBlc2NyaXB0YCB2NyBpbnN0YWxsZWQuIE5leHQuanMgcmVzb2x2ZXMgdGhlIHRzZ28gYmluYXJ5IHRocm91Z2ggdGhlXG4vLyBzZXBhcmF0ZSBgQHR5cGVzY3JpcHQvbmF0aXZlLXByZXZpZXdgIHBhY2thZ2UsIHNvIE5leHQuanMtZmFtaWx5IHJlcG9zIG11c3QgaW5zdGFsbFxuLy8gYm90aDsgb3RoZXIgcmVwb3Mgb25seSBuZWVkIGB0eXBlc2NyaXB0YCBmb3IgYHRzY2AgdHlwZWNoZWNrcy5cbmNvbnN0IHR5cGVzY3JpcHRHb0RlcGVuZGVuY3kgPSAnQHR5cGVzY3JpcHQvbmF0aXZlLXByZXZpZXcnO1xuY29uc3Qgd2JEZXBlbmRlbmN5ID0gJ0B3aWxsYm9vc3Rlci93Yic7XG5jb25zdCBidWlsZFRzRGVwZW5kZW5jeSA9ICdidWlsZC10cyc7XG5jb25zdCBsZWZ0aG9va0RlcGVuZGVuY3kgPSAnbGVmdGhvb2snO1xuY29uc3QgbWFuYWdlZERlcGVuZGVuY3lOYW1lcyA9IG5ldyBTZXQoW1xuICB3YkRlcGVuZGVuY3ksXG4gIGJ1aWxkVHNEZXBlbmRlbmN5LFxuICBsZWZ0aG9va0RlcGVuZGVuY3ksXG4gIHR5cGVzY3JpcHREZXBlbmRlbmN5LFxuICB0eXBlc2NyaXB0R29EZXBlbmRlbmN5LFxuICAnc29ydC1wYWNrYWdlLWpzb24nLFxuICAvLyBNaXhlZCBAdHlwZXMvYnVuIHZlcnNpb25zIGFjcm9zcyBhIG1vbm9yZXBvIGxvYWQgdHdvIGJ1bi10eXBlcyBjb3BpZXMsIHdoaWNoXG4gIC8vIGJyZWFrcyBnbG9iYWwgaW50ZXJmYWNlIG1lcmdpbmcgKGUuZy4gUmVzcG9uc2UvSGVhZGVycykgZHVyaW5nIHR5cGUgY2hlY2tpbmcuXG4gICdAdHlwZXMvYnVuJyxcbiAgLi4ub3hsaW50RGVwcyxcbl0pO1xuY29uc3QgbGF0ZXN0RGVwZW5kZW5jeVZlcnNpb25DYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG5jb25zdCBwYWNrYWdlQWdlR2F0ZU1zID0gYnVuTWluaW11bVJlbGVhc2VBZ2VTZWNvbmRzICogMTAwMDtcbmNvbnN0IG5wbVBhY2thZ2VUaW1lc0NhY2hlID0gbmV3IE1hcDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KCk7XG5jb25zdCBkZXBlbmRlbmN5U2VjdGlvbktleXMgPSBbJ2RlcGVuZGVuY2llcycsICdkZXZEZXBlbmRlbmNpZXMnLCAnb3B0aW9uYWxEZXBlbmRlbmNpZXMnLCAncGVlckRlcGVuZGVuY2llcyddIGFzIGNvbnN0O1xuXG50eXBlIFdyaXRhYmxlUGFja2FnZUpzb24gPSBTZXRSZXF1aXJlZDxcbiAgUGFja2FnZUpzb24sXG4gICdzY3JpcHRzJyB8ICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcycgfCAncGVlckRlcGVuZGVuY2llcydcbj47XG5cbmludGVyZmFjZSBEZXBlbmRlbmN5VXBkYXRlcyB7XG4gIGRlcGVuZGVuY2llczogc3RyaW5nW107XG4gIGRldkRlcGVuZGVuY2llczogc3RyaW5nW107XG4gIHB5dGhvbkRldkRlcGVuZGVuY2llczogc3RyaW5nW107XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVBhY2thZ2VKc29uKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHNraXBBZGRpbmdEZXBzOiBib29sZWFuXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVBhY2thZ2VKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IGNvcmUoY29uZmlnLCByb290Q29uZmlnLCBza2lwQWRkaW5nRGVwcyk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZywgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZywgc2tpcEFkZGluZ0RlcHM6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qgd29ya2VyVHlwZXNTY3JpcHRFcnJvciA9IGdldFdvcmtlclR5cGVzU2NyaXB0RXJyb3IoY29uZmlnKTtcbiAgaWYgKHdvcmtlclR5cGVzU2NyaXB0RXJyb3IpIHRocm93IG5ldyBFcnJvcih3b3JrZXJUeXBlc1NjcmlwdEVycm9yKTtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgY29uc3QganNvbk9iaiA9IGF3YWl0IHJlYWRQYWNrYWdlSnNvbihmaWxlUGF0aCk7XG4gIHVwZGF0ZVNjcmlwdHMoY29uZmlnLCBqc29uT2JqKTtcbiAgYXdhaXQgZW5zdXJlVHJ1c3RlZERlcGVuZGVuY2llcyhjb25maWcsIGpzb25PYmopO1xuICBtb3ZlTWFuYWdlZFRvb2xEZXBlbmRlbmNpZXNUb0RldkRlcGVuZGVuY2llcyhqc29uT2JqKTtcbiAgcHJ1bmVDYXBhYmlsaXR5RGVwZW5kZW50Q29tcGlsZXJEZXBlbmRlbmNpZXMoY29uZmlnLCBqc29uT2JqKTtcbiAgY29uc3QgZGVwZW5kZW5jeVVwZGF0ZXMgPSBhd2FpdCBhcHBseVBhY2thZ2VKc29uQ29udmVudGlvbnMoY29uZmlnLCByb290Q29uZmlnLCBqc29uT2JqKTtcbiAgYXdhaXQgbm9ybWFsaXplUGFja2FnZU1ldGFkYXRhKGNvbmZpZywgcm9vdENvbmZpZywganNvbk9iaiwgZGVwZW5kZW5jeVVwZGF0ZXMpO1xuICAvLyBPbiBhIGZpcnN0IHJ1biB0aGVyZSBpcyBubyBtYW5pZmVzdCBmb3IgYGJ1biBhZGRgIHRvIHVwZGF0ZSByZWxpYWJseS4gV3JpdGUgdGhlIHJlc29sdmVkXG4gIC8vIGRlcGVuZGVuY3kgdmVyc2lvbnMgaW50byB0aGUgbmV3IG1hbmlmZXN0IGRpcmVjdGx5OyB0aGUgZmluYWwgcmVwb3NpdG9yeS13aWRlIGBidW4gaW5zdGFsbGBcbiAgLy8gdGhlbiBpbnN0YWxscyB0aGVtIGFuZCByZW1haW5zIHRoZSBhdXRob3JpdGF0aXZlIGZhaWx1cmUgY2hlY2suXG4gIGFkZERlcGVuZGVuY3lWZXJzaW9uc1RvUGFja2FnZUpzb24oXG4gICAgY29uZmlnLFxuICAgIHJvb3RDb25maWcsXG4gICAganNvbk9iaixcbiAgICBkZXBlbmRlbmN5VXBkYXRlcyxcbiAgICBza2lwQWRkaW5nRGVwcyB8fCAhY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb25cbiAgKTtcbiAgYXdhaXQgdXBkYXRlUHJpdmF0ZVBhY2thZ2VzKGpzb25PYmopO1xuICByZW1vdmVFbXB0eURlcGVuZGVuY3lTZWN0aW9ucyhqc29uT2JqKTtcblxuICBkZWxldGUganNvbk9iai5wYWNrYWdlTWFuYWdlcjtcbiAgLy8gWWFybiByZWFkcyBwYWNrYWdlLmpzb24gZnJvbSBkaXNrIGJlZm9yZSBkZWNpZGluZyB3aGV0aGVyIGB5YXJuIGFkZCAtRGBcbiAgLy8gY29uZmxpY3RzIHdpdGggYW4gZXhpc3RpbmcgcmVndWxhciBkZXBlbmRlbmN5LCBzbyB0aGlzIHdyaXRlIG11c3QgZmluaXNoXG4gIC8vIGJlZm9yZSBpbnN0YWxsaW5nIHRoZSBtYW5hZ2VkIGRlcGVuZGVuY3kgdXBkYXRlcyBiZWxvdy4gS2VlcCB0aGlzIGdlbmVyYXRlZFxuICAvLyBmaWxlIHNvcnRlZCBldmVuIHdoZW4gd2UgbGF0ZXIgcnVuIHRoZSB0YXJnZXQgcmVwb3NpdG9yeSdzIGZvcm1hdHRlciBzbyBhXG4gIC8vIG1pZC1ydW4gaW50ZXJydXB0aW9uIG5ldmVyIGxlYXZlcyBwYWNrYWdlLmpzb24gaW4gYSBwYXJ0aWFsbHkgbWFuYWdlZCBvcmRlci5cbiAgLy8gQSByZWZ1c2VkIHdyaXRlIChlLmcuIGEgc3ltbGlua2VkIHBhY2thZ2UuanNvbikgbXVzdCBhbHNvIGFib3J0IHRoZSBkZXBlbmRlbmN5IGluc3RhbGxhdGlvblxuICAvLyBiZWxvdzogYGJ1biBhZGRgIGZvbGxvd3MgdGhlIHN5bWxpbmsgYW5kIHdvdWxkIG1vZGlmeSB0aGUgZmlsZSBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LlxuICBpZiAoIShhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBzZXJpYWxpemVQYWNrYWdlSnNvbihqc29uT2JqKSkpKSByZXR1cm47XG5cbiAgaWYgKCFza2lwQWRkaW5nRGVwcykge1xuICAgIGluc3RhbGxEZXBlbmRlbmN5VXBkYXRlcyhjb25maWcsIHJvb3RDb25maWcsIGpzb25PYmosIGRlcGVuZGVuY3lVcGRhdGVzKTtcbiAgICAvLyBBIG5ld2x5IGNyZWF0ZWQgbWFuaWZlc3QgaXMgYWxyZWFkeSBzb3J0ZWQgYnkgd2JmeSdzIGJ1bmRsZWQgc2VyaWFsaXplcjsgdGhlIHRhcmdldCBmb3JtYXR0ZXJcbiAgICAvLyBpcyBhdmFpbGFibGUgd2l0aG91dCBhbiBleHRyYSBmZXRjaCBvbmx5IHdoZW4gdGhpcyBydW4gc3RhcnRlZCB3aXRoIHBhY2thZ2UuanNvbi5cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24pIHtcbiAgICAgIGZvcm1hdFBhY2thZ2VKc29uV2l0aFByb2plY3RGb3JtYXR0ZXIoY29uZmlnLCBmaWxlUGF0aCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNlcmlhbGl6ZVBhY2thZ2VKc29uKGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24pOiBzdHJpbmcge1xuICAvLyBmc1V0aWwuZ2VuZXJhdGVGaWxlKCkgbm9ybWFsaXplcyB0aGUgdHJhaWxpbmcgbmV3bGluZSwgc28ga2VlcCB0aGUgc2VyaWFsaXplclxuICAvLyBmb2N1c2VkIG9uIHRoZSBKU09OIHBheWxvYWQgaXRzZWxmLlxuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoc29ydFBhY2thZ2VKc29uKGpzb25PYmopLCB1bmRlZmluZWQsIDIpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkUGFja2FnZUpzb24oZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8V3JpdGFibGVQYWNrYWdlSnNvbj4ge1xuICBsZXQganNvbk9iajogUGFja2FnZUpzb24gPSB7fTtcbiAgdHJ5IHtcbiAgICBjb25zdCBqc29uVGV4dCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgIGpzb25PYmogPSBKU09OLnBhcnNlKGpzb25UZXh0KSBhcyBQYWNrYWdlSnNvbjtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyBEb2N1bWVudGF0aW9uLW9ubHkgcmVwb3NpdG9yaWVzIGhhdmUgbm8gbWFuaWZlc3Qgb24gdGhlaXIgZmlyc3Qgd2JmeSBydW4uIFN0YXJ0aW5nIGZyb20gYW5cbiAgICAvLyBlbXB0eSBvYmplY3QgbGV0cyB0aGUgbm9ybWFsIGdlbmVyYXRvciBlc3RhYmxpc2ggdGhlIHNhbWUgbWFuYWdlZCBiYXNlbGluZSBhcyBldmVyeSBvdGhlclxuICAgIC8vIHJlcG9zaXRvcnk7IG1hbGZvcm1lZCBvciB1bnJlYWRhYmxlIGV4aXN0aW5nIG1hbmlmZXN0cyBtdXN0IHN0aWxsIGZhaWwgbG91ZGx5LlxuICAgIGlmICgoZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlICE9PSAnRU5PRU5UJykgdGhyb3cgZXJyb3I7XG4gIH1cbiAganNvbk9iai5zY3JpcHRzID0ganNvbk9iai5zY3JpcHRzID8/IHt9O1xuICBqc29uT2JqLmRlcGVuZGVuY2llcyA9IGpzb25PYmouZGVwZW5kZW5jaWVzID8/IHt9O1xuICBqc29uT2JqLmRldkRlcGVuZGVuY2llcyA9IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICBqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXMgPSBqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXMgPz8ge307XG4gIHJldHVybiBqc29uT2JqIGFzIFdyaXRhYmxlUGFja2FnZUpzb247XG59XG5cbmZ1bmN0aW9uIHBydW5lQ2FwYWJpbGl0eURlcGVuZGVudENvbXBpbGVyRGVwZW5kZW5jaWVzKGNvbmZpZzogUGFja2FnZUNvbmZpZywganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbik6IHZvaWQge1xuICAvLyBSdW4gYmVmb3JlIGFwcGx5UGFja2FnZUpzb25Db252ZW50aW9ucywgd2hpY2ggcmUtYWRkcyB0c2dvIG9ubHkgZm9yIGN1cnJlbnQgTmV4dC5qcy1mYW1pbHkgcmVwb3NpdG9yaWVzLlxuICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXNbdHlwZXNjcmlwdEdvRGVwZW5kZW5jeV07XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1t0eXBlc2NyaXB0R29EZXBlbmRlbmN5XTtcbiAgaWYgKCFjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0ICYmICFjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llc1t0eXBlc2NyaXB0RGVwZW5kZW5jeV07XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW3R5cGVzY3JpcHREZXBlbmRlbmN5XTtcbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVTY3JpcHRzKGNvbmZpZzogUGFja2FnZUNvbmZpZywganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbik6IHZvaWQge1xuICBqc29uT2JqLnNjcmlwdHMgPSB7IC4uLmpzb25PYmouc2NyaXB0cywgLi4uZ2VuZXJhdGVTY3JpcHRzKGNvbmZpZywganNvbk9iai5zY3JpcHRzKSB9O1xufVxuXG4vKipcbiAqIEtlZXBzIHRoZSBwcm9qZWN0J3Mgb3duIHNlZ21lbnRzIGluIG9yZGVyLCByZXBsYWNpbmcgdGhlIGZpcnN0IG1hbmFnZWQgZ2VuLWNvZGUgc3BlbGxpbmcgd2l0aFxuICogYGJ1biB3YiBnZW4tY29kZWAgYW5kIGRyb3BwaW5nIGxhdGVyIGR1cGxpY2F0ZXMuIEFwcGVuZHMgZ2VuZXJhdGlvbiBvbmx5IHdoZW4gdGhlIHNjcmlwdFxuICogY29udGFpbmVkIG5vbmUsIHNvIG5vdGhpbmcgaXMgcmVvcmRlcmVkLlxuICovXG5mdW5jdGlvbiByZWJ1aWxkUG9zdGluc3RhbGxTZWdtZW50cyhzZWdtZW50czogc3RyaW5nW10sIHNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGtpbmRzID0gc2VnbWVudHMubWFwKChzZWdtZW50KSA9PiBjbGFzc2lmeVNjcmlwdFNlZ21lbnQoc2VnbWVudCwgc2NyaXB0cywgdHJ1ZSkpO1xuICAvLyBBIHdyYXBwZXIgYXJvdW5kIGEgY3VzdG9taXplZCBnZW4tY29kZSBhbHJlYWR5IGdlbmVyYXRlczsgYWRkaW5nIGFub3RoZXIgaW52b2NhdGlvbiB3b3VsZCBydW4gZXZlcnlcbiAgLy8gZ2VuZXJhdG9yIHR3aWNlLlxuICBsZXQgZ2VuZXJhdGlvblBsYWNlZCA9IGtpbmRzLmluY2x1ZGVzKCdnZW5Db2RlV3JhcHBlcicpO1xuICBjb25zdCByZXN1bHQ6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgW2luZGV4LCBzZWdtZW50XSBvZiBzZWdtZW50cy5lbnRyaWVzKCkpIHtcbiAgICBjb25zdCBraW5kID0ga2luZHNbaW5kZXhdO1xuICAgIGlmIChraW5kID09PSAnY3VzdG9tJyB8fCBraW5kID09PSAnZ2VuQ29kZVdyYXBwZXInKSB7XG4gICAgICByZXN1bHQucHVzaChzZWdtZW50KTtcbiAgICB9IGVsc2UgaWYgKCFnZW5lcmF0aW9uUGxhY2VkKSB7XG4gICAgICByZXN1bHQucHVzaCgnYnVuIHdiIGdlbi1jb2RlJyk7XG4gICAgICBnZW5lcmF0aW9uUGxhY2VkID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgaWYgKCFnZW5lcmF0aW9uUGxhY2VkKSByZXN1bHQucHVzaCgnYnVuIHdiIGdlbi1jb2RlJyk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBtYW5hZ2VkIGdlbi1jb2RlIHNlZ21lbnRzIHdoaWxlIGtlZXBpbmcgdGhlIGZpcnN0IHNlZ21lbnQncyBwb3NpdGlvbiBzbyBhIGN1c3RvbVxuICogc3RlcCB0aGF0IGNvbnN1bWVzIGdlbmVyYXRlZCBvdXRwdXQgc3RpbGwgcnVucyBhZnRlciBpdC4gUmV0dXJucyB3aXRob3V0IGNoYW5naW5nIGFuXG4gKiB1bnBhcnNlYWJsZSBzY3JpcHQuXG4gKi9cbmZ1bmN0aW9uIHVwZGF0ZVBvc3RpbnN0YWxsU2NyaXB0KHNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMsIG1hbmFnZXNXb3JrZXJUeXBlczogYm9vbGVhbik6IHZvaWQge1xuICAvLyBgYnVuIHdiIGdlbi1jb2RlYCByZWdlbmVyYXRlcyB3b3JrZXItY29uZmlndXJhdGlvbi5kLnRzIGl0c2VsZiwgc28gYSBwYWNrYWdlIHdpdGggYVxuICAvLyBjb2RlLWdlbmVyYXRpb24gb3Igd29ya2VyLXR5cGVzIHBpcGVsaW5lIGdldHMgb25lIG1hbmFnZWQgZ2VuZXJhdGlvbiBzZWdtZW50LlxuICBpZiAoc2NyaXB0c1snZ2VuLWNvZGUnXSB8fCBtYW5hZ2VzV29ya2VyVHlwZXMpIHtcbiAgICAvLyBQcm9qZWN0LW93bmVkIHN0ZXBzIGFyZSBuZXZlciBkcm9wcGVkLCBhbmQgdGhlaXIgUE9TSVRJT04gcmVsYXRpdmUgdG8gZ2VuZXJhdGlvbiBpcyBwcmVzZXJ2ZWQ6IGEgc3RlcFxuICAgIC8vIGJlZm9yZSBpdCBtYXkgcHJvZHVjZSBgd3JhbmdsZXIgdHlwZXNgJyBpbnB1dHMgKGEgd3JhbmdsZXIgY29uZmlnLCBgLmRldi52YXJzYCksIHdoaWxlIG9uZSBhZnRlciBpdCBtYXlcbiAgICAvLyBjb25zdW1lIHRoZSBnZW5lcmF0ZWQgdHlwZXMuIFNvIHRoZSBtYW5hZ2VkIGdlbmVyYXRpb24gcmVwbGFjZXMgdGhlIGZpcnN0IG1hbmFnZWQgc2VnbWVudCBpbiBwbGFjZSwgYW5kIGlzXG4gICAgLy8gYXBwZW5kZWQgb25seSB3aGVuIHRoZSBzY3JpcHQgaGFkIG5vbmUuIEEgd3JhcHBlciBhcm91bmQgYSBjdXN0b21pemVkIGdlbi1jb2RlIGFscmVhZHkgcGVyZm9ybXMgdGhlXG4gICAgLy8gZ2VuZXJhdGlvbiBwbHVzIHRoZSBwcm9qZWN0J3Mgb3duIHN0ZXBzLCBzbyBpdCBzdXBwcmVzc2VzIHRoZSByZXBsYWNlbWVudCBlbnRpcmVseS5cbiAgICBjb25zdCBzZWdtZW50cyA9IHNjcmlwdHMucG9zdGluc3RhbGwgPT09IHVuZGVmaW5lZCA/IFtdIDogc3BsaXRTY3JpcHRTZWdtZW50cyhzY3JpcHRzLnBvc3RpbnN0YWxsKTtcbiAgICBjb25zdCBrZXB0U2VnbWVudHMgPSBzZWdtZW50cyAmJiByZWJ1aWxkUG9zdGluc3RhbGxTZWdtZW50cyhzZWdtZW50cywgc2NyaXB0cyk7XG4gICAgaWYgKGtlcHRTZWdtZW50cykge1xuICAgICAgc2NyaXB0cy5wb3N0aW5zdGFsbCA9IGtlcHRTZWdtZW50cy5qb2luKCcgJiYgJyk7XG4gICAgfVxuICAgIC8vIEFueSBvdGhlciB1bnBhcnNlYWJsZSBwb3N0aW5zdGFsbCBpcyBsZWZ0IHRvIGEgaHVtYW4gcmF0aGVyIHRoYW4gcmV3cml0dGVuIGZyb20gYSB3cm9uZyBwYXJzZS5cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBhcHBseVBhY2thZ2VKc29uQ29udmVudGlvbnMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvblxuKTogUHJvbWlzZTxEZXBlbmRlbmN5VXBkYXRlcz4ge1xuICBjb25zdCBkZXBlbmRlbmNpZXM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IGRldkRlcGVuZGVuY2llcyA9IFsnc29ydC1wYWNrYWdlLWpzb24nXTtcbiAgY29uc3QgcHl0aG9uRGV2RGVwZW5kZW5jaWVzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBoYXNKYXZhID0gZG9lc0NvbnRhaW5KYXZhKGNvbmZpZyk7XG5cbiAgaWYgKFxuICAgIGhhc0phdmEgJiZcbiAgICAhZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocm9vdENvbmZpZy5kaXJQYXRoLCAnLnByZXR0aWVycmMuanNvbicpKSAmJlxuICAgICFmcy5leGlzdHNTeW5jKHBhdGguam9pbihjb25maWcuZGlyUGF0aCwgJy5wcmV0dGllcnJjLmpzb24nKSlcbiAgKSB7XG4gICAganNvbk9iai5wcmV0dGllciA9ICdAd2lsbGJvb3N0ZXIvcHJldHRpZXItY29uZmlnJztcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgncHJldHRpZXItcGx1Z2luLWphdmEnLCAnQHdpbGxib29zdGVyL3ByZXR0aWVyLWNvbmZpZycpO1xuICB9XG4gIGlmIChoYXNKYXZhKSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ3ByZXR0aWVyJyk7XG4gIH1cblxuICBpZiAoY29uZmlnLmlzUm9vdCkge1xuICAgIC8vIExlZnRob29rIGdlbmVyYXRpb24gaXMgYmVzdC1lZmZvcnQgYW5kIC5sZWZ0aG9vayBpcyBhYnNlbnQgZnJvbSBEb2NrZXIgYnVpbGQgY29udGV4dHMsIHNvIGFcbiAgICAvLyBtaXNzaW5nIG5vcm1hbGl6ZXIgaXMgdmFsaWQuIE9uY2UgcHJlc2VudCwgaXRzIGZhaWx1cmUgbXVzdCBhYm9ydCBpbnN0YWxsIHJhdGhlciB0aGFuIGxlYXZlIGFcbiAgICAvLyBHdWFyZC1waW5uZWQgbG9ja2ZpbGUgYmVoaW5kOyBrZWVwIHRoYXQgZmFpbC1mYXN0IGdyb3VwaW5nIGV4cGxpY2l0IGJlZm9yZSBhbnkgd29ya3NwYWNlIGJ1aWxkLlxuICAgIGpzb25PYmouc2NyaXB0cy5wcmVwYXJlID1cbiAgICAgICcoYnVuIGxlZnRob29rIGluc3RhbGwgfHwgdHJ1ZSkgJiYgKHRlc3QgISAtZiAubGVmdGhvb2svbm9ybWFsaXplLWJ1bi1sb2NrZmlsZS5zaCB8fCBiYXNoIC5sZWZ0aG9vay9ub3JtYWxpemUtYnVuLWxvY2tmaWxlLnNoKSc7XG4gICAgLy8gV2hlbiBAd2lsbGJvb3N0ZXIvd2IgaXMgYSB3b3Jrc3BhY2Ugb2YgdGhpcyByZXBvc2l0b3J5LCB0aGUgZ2VuZXJhdGVkIGBidW4gd2Ig4oCmYCBzY3JpcHRzIHJ1blxuICAgIC8vIGl0cyBnaXRpZ25vcmVkIGRpc3QgYnVpbGQgKGJpbi9pbmRleC5qcyBpbXBvcnRzIC4uL2Rpc3QvaW5kZXguanMpLCBzbyBhIGZyZXNoIGNoZWNrb3V0IG11c3RcbiAgICAvLyBidWlsZCBpdCBkdXJpbmcgaW5zdGFsbDsgcmVnaXN0cnkgaW5zdGFsbHMgc2hpcCBhIHByZWJ1aWx0IGRpc3QgYW5kIG5lZWQgbm8gZXh0cmEgc3RlcC5cbiAgICBjb25zdCB3YldvcmtzcGFjZURpciA9IGdldFdvcmtzcGFjZVBhY2thZ2VEaXJzKHJvb3RDb25maWcpLmdldCh3YkRlcGVuZGVuY3kpO1xuICAgIGlmICh3YldvcmtzcGFjZURpcikge1xuICAgICAgLy8gUXVvdGVkIHVubGVzcyB0aGUgbmFtZSBjYXJyaWVzIG5vIHNoZWxsIG1lYW5pbmcsIHNvIHRoYXQgYCQo4oCmKWAgb3IgYSB2YXJpYWJsZSBhIGhvc3RpbGVcbiAgICAgIC8vIGRpcmVjdG9yeSBuYW1lIGNvdWxkIHNtdWdnbGUgaW50byB0aGUgZ2VuZXJhdGVkIHNjcmlwdCBuZXZlciByZWFjaGVzIHRoZSBzaGVsbCB1bnF1b3RlZC5cbiAgICAgIGpzb25PYmouc2NyaXB0cy5wcmVwYXJlICs9IGAgJiYgYnVuIHJ1biAtLWN3ZCAke3F1b3RlRm9yU2hlbGwod2JXb3Jrc3BhY2VEaXIpfSBidWlsZGA7XG4gICAgfVxuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKGxlZnRob29rRGVwZW5kZW5jeSk7XG5cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5zZW1hbnRpY1JlbGVhc2UpIHtcbiAgICAgIGlmIChkb2VzUmVsZWFzZVNjcmlwdEluc3RhbGxTZW1hbnRpY1JlbGVhc2UoanNvbk9iai5zY3JpcHRzLnJlbGVhc2UpKSB7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snc2VtYW50aWMtcmVsZWFzZSddO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydzZW1hbnRpYy1yZWxlYXNlJ10gJiZcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydtdWx0aS1zZW1hbnRpYy1yZWxlYXNlJ10gJiZcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAcWl3aS9tdWx0aS1zZW1hbnRpYy1yZWxlYXNlJ11cbiAgICAgICkge1xuICAgICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnc2VtYW50aWMtcmVsZWFzZScpO1xuICAgICAgfVxuICAgICAganNvbk9iai52ZXJzaW9uID0gJzAuMC4wLXNlbWFudGljYWxseS1yZWxlYXNlZCc7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpIHtcbiAgICAgIC8vIFNpbmNlIGFydGlsbGVyeSByZXF1aXJlcyBhIHNwZWNpZmljIHZlcnNpb24gb2YgQHBsYXl3cmlnaHQvdGVzdFxuICAgICAgY29uc3QgaGFzQXJ0aWxsZXJ5ID0ganNvbk9iai5kZXBlbmRlbmNpZXMuYXJ0aWxsZXJ5IHx8IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLmFydGlsbGVyeTtcbiAgICAgIC8vIFNpbmNlIGxsbS10b29sYm94IHJlcXVpcmVzIEBwbGF5d3JpZ2h0L3Rlc3QgaW4gZGVwZW5kZW5jaWVzXG4gICAgICBpZiAoIWhhc0FydGlsbGVyeSAmJiAhanNvbk9iai5kZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXSkge1xuICAgICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnQHBsYXl3cmlnaHQvdGVzdCcpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFJ1bnRpbWUpIHtcbiAgICAgICAgLy8gUnVudGltZSBpbXBvcnRzIG5lZWQgdGhlIHN0YW5kYWxvbmUgcGFja2FnZSBhZnRlciBEb2NrZXIgcHJ1bmluZyByZW1vdmVzIGRldkRlcGVuZGVuY2llcy5cbiAgICAgICAganNvbk9iai5kZXBlbmRlbmNpZXMucGxheXdyaWdodCA/Pz1cbiAgICAgICAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5wbGF5d3JpZ2h0ID8/XG4gICAgICAgICAganNvbk9iai5kZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXSA/P1xuICAgICAgICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAcGxheXdyaWdodC90ZXN0J107XG4gICAgICAgIGRlcGVuZGVuY2llcy5wdXNoKCdwbGF5d3JpZ2h0Jyk7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5wbGF5d3JpZ2h0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQ7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5wbGF5d3JpZ2h0O1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMpIHtcbiAgICAgIC8vIFdlIGRvbid0IGFsbG93IG5vbi1hcnJheSB3b3Jrc3BhY2VzIGluIG1vbm9yZXBvLiBZYXJuIHYxJ3Mgb2JqZWN0IGZvcm0ga2VlcHMgaXRzXG4gICAgICAvLyBkZWNsYXJlZCBwYXR0ZXJucyAod29ya3NwYWNlcy5wYWNrYWdlcyk7IG9ubHkgZXh0cmFzIHN1Y2ggYXMgbm9ob2lzdCBhcmUgZHJvcHBlZC5cbiAgICAgIC8vIEZvcmNlIGBwYWNrYWdlcy8qYCBvbmx5IHdoZW4gaXQgYWN0dWFsbHkgbWF0Y2hlcyBhIHdvcmtzcGFjZSBtYW5pZmVzdDogYW4gYXBwcy8qLW9ubHlcbiAgICAgIC8vIG1vbm9yZXBvIG11c3Qgbm90IGdldCBhIG5ldmVyLW1hdGNoaW5nIHBhdHRlcm4gYXBwZW5kZWQgdG8gaXRzIGRlY2xhcmF0aW9uLiBBXG4gICAgICAvLyBiYXNlbGluZS1zZWVkaW5nIGRlY2xhcmF0aW9uIG5lZWRzIG5vIGZvcmNlZCBwYXR0ZXJuIGF0IGFsbCDigJQgdGhlIHNlZWRlZCBiYXNlbGluZVxuICAgICAgLy8gKGAqLypgIG9yIGAqKmApIGFscmVhZHkgY292ZXJzIHBhY2thZ2VzLyouIFRoZSBmb3JjZWQgcGF0dGVybiBpcyBQUkVQRU5ERUQ6IEJ1blxuICAgICAgLy8gZXZhbHVhdGVzIHdvcmtzcGFjZSBwYXR0ZXJucyBzZXF1ZW50aWFsbHksIHNvIGEgcG9zaXRpdmUgcGF0dGVybiBwbGFjZWQgYWZ0ZXIgYSB1c2VyXG4gICAgICAvLyBuZWdhdGlvbiB3b3VsZCByZS1pbmNsdWRlIHRoZSBuZWdhdGVkIHBhY2thZ2VzLiBBIGRlY2xhcmF0aW9uIHRoYXQgYWxyZWFkeSBjb3ZlcnNcbiAgICAgIC8vIHBhY2thZ2VzLyogdW5kZXIgbm9ybWFsaXphdGlvbiAoZS5nLiBgLi9wYWNrYWdlcy8qYCkgaXMga2VwdCB2ZXJiYXRpbTogZm9yY2luZyBhIHRleHR1YWxcbiAgICAgIC8vIGBwYWNrYWdlcy8qYCBuZXh0IHRvIGl0IHdvdWxkIHBlcnNpc3QgYSBkdXBsaWNhdGUgZXF1aXZhbGVudCBwYXR0ZXJuLlxuICAgICAgY29uc3QgZm9yY2VkUGF0dGVybnMgPVxuICAgICAgICAhaGFzSW1wbGljaXRXb3Jrc3BhY2VCYXNlbGluZShqc29uT2JqLndvcmtzcGFjZXMpICYmXG4gICAgICAgICFoYXNEZWNsYXJlZFBhY2thZ2VzU3RhclBhdHRlcm4oanNvbk9iai53b3Jrc3BhY2VzKSAmJlxuICAgICAgICBmZy5nbG9iU3luYygncGFja2FnZXMvKi9wYWNrYWdlLmpzb24nLCB7IGN3ZDogY29uZmlnLmRpclBhdGgsIGlnbm9yZTogWycqKi9ub2RlX21vZHVsZXMvKionXSB9KS5sZW5ndGggPiAwXG4gICAgICAgICAgPyBbJ3BhY2thZ2VzLyonXVxuICAgICAgICAgIDogW107XG4gICAgICBqc29uT2JqLndvcmtzcGFjZXMgPSBtZXJnZS5hbGwoW2ZvcmNlZFBhdHRlcm5zLCBnZXREZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zKGpzb25PYmoud29ya3NwYWNlcyldLCB7XG4gICAgICAgIGFycmF5TWVyZ2U6IGNvbWJpbmVNZXJnZSxcbiAgICAgIH0pO1xuICAgICAgLy8gQm90aCBpbnB1dHMgY2FuIGJlIGVtcHR5IChlLmcuIHBhY2thZ2VzL3BhY2thZ2UuanNvbiB3aXRob3V0IGFueSBwYWNrYWdlcy8qL3BhY2thZ2UuanNvblxuICAgICAgLy8gYW5kIG5vIGRlY2xhcmVkIHdvcmtzcGFjZXMpOyBkbyBub3QgcGVyc2lzdCBhIG1lYW5pbmdsZXNzIGB3b3Jrc3BhY2VzOiBbXWAuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShqc29uT2JqLndvcmtzcGFjZXMpICYmIGpzb25PYmoud29ya3NwYWNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgZGVsZXRlIGpzb25PYmoud29ya3NwYWNlcztcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoanNvbk9iai53b3Jrc3BhY2VzKSkge1xuICAgICAganNvbk9iai53b3Jrc3BhY2VzID0ganNvbk9iai53b3Jrc3BhY2VzLmZpbHRlcihcbiAgICAgICAgKHdvcmtzcGFjZSkgPT5cbiAgICAgICAgICBmZy5nbG9iU3luYyh3b3Jrc3BhY2UsIHtcbiAgICAgICAgICAgIGRvdDogdHJ1ZSxcbiAgICAgICAgICAgIGN3ZDogY29uZmlnLmRpclBhdGgsXG4gICAgICAgICAgICBpZ25vcmU6IGdsb2JJZ25vcmUsXG4gICAgICAgICAgfSkubGVuZ3RoID4gMFxuICAgICAgKTtcbiAgICAgIGlmIChqc29uT2JqLndvcmtzcGFjZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLndvcmtzcGFjZXM7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gZml4ZXJzL25leHRDb25maWcudHMgZW5hYmxlcyBgcmVhY3RDb21waWxlcjogdHJ1ZWAgZm9yIGV2ZXJ5IE5leHQuanMgcHJvamVjdCwgYW5kIE5leHQuanNcbiAgLy8gcmVzb2x2ZXMgYGJhYmVsLXBsdWdpbi1yZWFjdC1jb21waWxlcmAgYXQgYnVpbGQgdGltZSB3aGVuIFJlYWN0IENvbXBpbGVyIGlzIG9uLiBBZGQgaXQgaGVyZSBzb1xuICAvLyB0aGUgbWFuYWdlZCBuZXh0LmNvbmZpZyBuZXZlciBicmVha3MgYG5leHQgYnVpbGRgIHdpdGggYW4gdW5yZXNvbHZlZC1wYWNrYWdlIGVycm9yLlxuICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ2JhYmVsLXBsdWdpbi1yZWFjdC1jb21waWxlcicpO1xuICB9XG5cbiAgLy8gYHdiIHZlcmlmeSAtLWZ1bGxgIGF1ZGl0cyBldmVyeSBgKi5zbGlkZXYubWRgIGRlY2sgd2l0aCBzbGlkZXYtY2hlY2ssIHNvIHRoZSBjaGVja2VyIGhhcyB0byBiZVxuICAvLyBpbnN0YWxsZWQgd2hlcmV2ZXIgYSBkZWNrIGxpdmVzLlxuICBpZiAoY29uZmlnLmRvZXNDb250YWluU2xpZGV2TWQpIHtcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnc2xpZGV2LWNoZWNrJyk7XG4gIH1cblxuICBpZiAoIWlzV2JQYWNrYWdlKGpzb25PYmopKSB7XG4gICAgLy8gQSBgd29ya3NwYWNlOmAgc3BlY2lmaWVyIGRlcGVuZHMgb24gdGhlIHdiIGRldmVsb3BlZCBpbiB0aGlzIHJlcG9zaXRvcnkgKGUuZy5cbiAgICAvLyBXaWxsQm9vc3Rlci9zaGFyZWQgaXRzZWxmKTsgaW5zdGFsbGluZyB0aGUgbGF0ZXN0IHJlZ2lzdHJ5IHJlbGVhc2Ugb3ZlciBpdCB3b3VsZCBzaWxlbnRseVxuICAgIC8vIHJlcGxhY2UgdGhlIGxvY2FsIGJ1aWxkIHdpdGggYSBwdWJsaXNoZWQgb25lLCBzbyBsZWF2ZSBzdWNoIGEgZGVjbGFyYXRpb24gdW50b3VjaGVkLlxuICAgIGNvbnN0IHdiU3BlY2lmaWVyID0ganNvbk9iai5kZXBlbmRlbmNpZXNbd2JEZXBlbmRlbmN5XSA/PyBqc29uT2JqLmRldkRlcGVuZGVuY2llc1t3YkRlcGVuZGVuY3ldO1xuICAgIGlmICghd2JTcGVjaWZpZXI/LnN0YXJ0c1dpdGgoJ3dvcmtzcGFjZTonKSkge1xuICAgICAgaWYgKHNob3VsZEtlZXBXYkFzUnVudGltZURlcGVuZGVuY3koanNvbk9iaikpIHtcbiAgICAgICAgZGVwZW5kZW5jaWVzLnB1c2god2JEZXBlbmRlbmN5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKHdiRGVwZW5kZW5jeSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8vIGJ1aWxkLXRzIG93bnMgVHlwZVNjcmlwdCBleGVjdXRpb24gYW5kIGRlY2xhcmF0aW9uIGVtaXQuIHdiZnkgbXVzdCBhbHdheXNcbiAgLy8ga2VlcCBleGlzdGluZyBidWlsZC10cyB1c2VycyBjdXJyZW50IGJlY2F1c2Ugb2xkZXIgcmVsZWFzZXMgY2FuIGVtaXQgLmQudHNcbiAgLy8gZmlsZXMgYXQgcGF0aHMgdGhhdCBubyBsb25nZXIgbWF0Y2ggcGFja2FnZSBleHBvcnRzLlxuICBpZiAoXG4gICAganNvbk9iai5kZXBlbmRlbmNpZXNbYnVpbGRUc0RlcGVuZGVuY3ldIHx8XG4gICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbYnVpbGRUc0RlcGVuZGVuY3ldIHx8XG4gICAgT2JqZWN0LnZhbHVlcyhqc29uT2JqLnNjcmlwdHMpLnNvbWUoKHNjcmlwdCkgPT4gc2NyaXB0Py5pbmNsdWRlcyhidWlsZFRzRGVwZW5kZW5jeSkpXG4gICkge1xuICAgIGlmIChzaG91bGRLZWVwQnVpbGRUc0FzUnVudGltZURlcGVuZGVuY3koanNvbk9iaikpIHtcbiAgICAgIGRlcGVuZGVuY2llcy5wdXNoKGJ1aWxkVHNEZXBlbmRlbmN5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goYnVpbGRUc0RlcGVuZGVuY3kpO1xuICAgIH1cbiAgfVxuICBpZiAoZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKSkge1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKC4uLm94bGludERlcHMpO1xuICAgIC8vIFRoZSBnZW5lcmF0ZWQgKi5jb25maWcudHMgZmlsZXMgYXJlIHR5cGUtY2hlY2tlZCBieSB0aGUgbGludCBwcm9qZWN0IGV2ZW4gaW4gSmF2YVNjcmlwdC1vbmx5XG4gICAgLy8gcmVwb3NpdG9yaWVzLiBSZWFjdCBOYXRpdmUgcmVsaWVzIG9uIEB0c2NvbmZpZy9yZWFjdC1uYXRpdmUncyBhbWJpZW50IHR5cGVzIGluc3RlYWQuXG4gICAgaWYgKCFjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnQHR5cGVzL2J1bicpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHRzY29uZmlnQmFzZURlcGVuZGVuY2llcyA9IGRvZXNDb250YWluSnNPclRzKGNvbmZpZykgPyBnZXRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMoY29uZmlnKSA6IFtdO1xuICBhd2FpdCByZW1vdmVVbnVzZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMoY29uZmlnLCBqc29uT2JqLCB0c2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMpO1xuICBkZXZEZXBlbmRlbmNpZXMucHVzaCguLi50c2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMpO1xuXG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzKSB7XG4gICAgLy8gVHlwZVNjcmlwdCA3IHNoaXBzIHRoZSBuYXRpdmUgY29tcGlsZXIgYXMgdGhlIGB0eXBlc2NyaXB0YCBwYWNrYWdlLCBzbyBpdCBpc1xuICAgIC8vIG5vdyB0aGUgbWFuYWdlZCBjb21waWxlciBmb3IgZXZlcnkgVHlwZVNjcmlwdCByZXBvICh0eXBlY2hlY2tpbmcgcnVucyBgdHNjYCkuXG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2godHlwZXNjcmlwdERlcGVuZGVuY3kpO1xuICAgIC8vIE5leHQuanMncyBgbmV4dCBidWlsZGAgaW5zcGVjdHMgYEB0eXBlc2NyaXB0L25hdGl2ZS1wcmV2aWV3YCAodHNnbykgdG8gcnVuIGl0cyB0eXBlXG4gICAgLy8gY2hlY2s7IHRoZSBgdHlwZXNjcmlwdGAgdjcgcGFja2FnZSBhbG9uZSBsYWNrcyB0aGUgQVBJIG5leHQgbmVlZHMsIHNvIGtlZXAgYm90aFxuICAgIC8vIGluc3RhbGxlZCBmb3IgTmV4dC5qcy1mYW1pbHkgcmVwb3MuIFNlZSB0aGUgdHlwZXNjcmlwdEdvRGVwZW5kZW5jeSBjb21tZW50IGFib3ZlLlxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLm5leHQgfHwgY29uZmlnLmRlcGVuZGluZy5ibGl0eiB8fCBjb25maWcuZGVwZW5kaW5nLnZpbmV4dCkge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2godHlwZXNjcmlwdEdvRGVwZW5kZW5jeSk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGpzb25PYmouZGVwZW5kZW5jaWVzLmplc3QgfHxcbiAgICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLmplc3QgfHxcbiAgICAgIGpzb25PYmouZGVwZW5kZW5jaWVzWydAamVzdC9nbG9iYWxzJ10gfHxcbiAgICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAamVzdC9nbG9iYWxzJ10gfHxcbiAgICAgIGpzb25PYmouZGVwZW5kZW5jaWVzWyd0cy1qZXN0J10gfHxcbiAgICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWyd0cy1qZXN0J11cbiAgICApIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAdHlwZXMvamVzdCcpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3MpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZGVwZW5kZW5jaWVzOiBkZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFkZXAuaW5jbHVkZXMoJ0B3aWxsYm9vc3Rlci8nKSksXG4gICAgICBkZXZEZXBlbmRlbmNpZXM6IGRldkRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWRlcC5pbmNsdWRlcygnQHdpbGxib29zdGVyLycpKSxcbiAgICAgIHB5dGhvbkRldkRlcGVuZGVuY2llcyxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHsgZGVwZW5kZW5jaWVzLCBkZXZEZXBlbmRlbmNpZXMsIHB5dGhvbkRldkRlcGVuZGVuY2llcyB9O1xufVxuXG5mdW5jdGlvbiBkb2VzUmVsZWFzZVNjcmlwdEluc3RhbGxTZW1hbnRpY1JlbGVhc2Uoc2NyaXB0OiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmICh0eXBlb2Ygc2NyaXB0ICE9PSAnc3RyaW5nJykgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gL1xcYig/OmJ1bnh8bnB4fHBucG1cXHMrZGx4fHlhcm5cXHMrZGx4KVxccytzZW1hbnRpYy1yZWxlYXNlKD86QFxcUyspP1xcYi91LnRlc3Qoc2NyaXB0KTtcbn1cblxuZnVuY3Rpb24gbW92ZU1hbmFnZWRUb29sRGVwZW5kZW5jaWVzVG9EZXZEZXBlbmRlbmNpZXMoanNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbik6IHZvaWQge1xuICBmb3IgKGNvbnN0IFtkZXBlbmRlbmN5LCBrZWVwQXNSdW50aW1lXSBvZiBbXG4gICAgW3diRGVwZW5kZW5jeSwgc2hvdWxkS2VlcFdiQXNSdW50aW1lRGVwZW5kZW5jeShqc29uT2JqKV0sXG4gICAgW2J1aWxkVHNEZXBlbmRlbmN5LCBzaG91bGRLZWVwQnVpbGRUc0FzUnVudGltZURlcGVuZGVuY3koanNvbk9iaildLFxuICBdIGFzIGNvbnN0KSB7XG4gICAgaWYgKGtlZXBBc1J1bnRpbWUpIHtcbiAgICAgIGNvbnN0IGRldlZlcnNpb24gPSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XTtcbiAgICAgIGlmICghZGV2VmVyc2lvbikgY29udGludWU7XG4gICAgICBjb25zdCBydW50aW1lVmVyc2lvbiA9IGpzb25PYmouZGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldO1xuICAgICAgaWYgKCFydW50aW1lVmVyc2lvbiB8fCBpc05ld2VyUGFja2FnZVZlcnNpb24oZGV2VmVyc2lvbiwgcnVudGltZVZlcnNpb24pKSB7XG4gICAgICAgIGpzb25PYmouZGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldID0gZGV2VmVyc2lvbjtcbiAgICAgIH1cbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XTtcbiAgICB9IGVsc2UgaWYgKGpzb25PYmouZGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldKSB7XG4gICAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSA/Pz0ganNvbk9iai5kZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV07XG4gICAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV07XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNob3VsZEtlZXBXYkFzUnVudGltZURlcGVuZGVuY3koanNvbk9iajogUGFja2FnZUpzb24pOiBib29sZWFuIHtcbiAgLy8gUHJvZHVjdGlvbiBpbWFnZXMgcnVuIG1pZ3JhdGlvbnMgYWZ0ZXIgZGV2RGVwZW5kZW5jaWVzIGFyZSBwcnVuZWQsIGp1c3QgYXMgcGFja2FnZSBtYW5hZ2Vyc1xuICAvLyBydW4gcG9zdGluc3RhbGwgZHVyaW5nIHByb2R1Y3Rpb24gaW5zdGFsbHMsIHNvIGJvdGggZW50cnkgcG9pbnRzIG11c3QgcmV0YWluIHRoZSB3YiBiaW5hcnkuXG4gIC8vIEtlZXAgdGhlIHdvcmQgbWF0Y2ggY29uc2VydmF0aXZlOiBzdXBwb3J0ZWQgY3VzdG9tIHdyYXBwZXJzIGNhbiBwdXQgd2IgaW5zaWRlIHNoZWxsIGxvb3BzIHRoYXRcbiAgLy8gdGhlIGNvbW1hbmQtcG9zaXRpb24gcGFyc2VyIGNhbm5vdCBjbGFzc2lmeSwgd2hpbGUgYSBmYWxzZSBwb3NpdGl2ZSBvbmx5IHJldGFpbnMgdGhlIENMSS5cbiAgcmV0dXJuIFtqc29uT2JqLnNjcmlwdHM/LnBvc3RpbnN0YWxsLCBqc29uT2JqLnNjcmlwdHM/LlsnZGItbWlncmF0ZSddXS5zb21lKFxuICAgIChzY3JpcHQpID0+IHR5cGVvZiBzY3JpcHQgPT09ICdzdHJpbmcnICYmIC9cXGJ3YlxcYi91LnRlc3Qoc2NyaXB0KVxuICApO1xufVxuXG5mdW5jdGlvbiBzaG91bGRLZWVwQnVpbGRUc0FzUnVudGltZURlcGVuZGVuY3koanNvbk9iajogUGFja2FnZUpzb24pOiBib29sZWFuIHtcbiAgY29uc3QgcHJpc21hID0ganNvbk9iai5wcmlzbWEgYXMgeyBzZWVkPzogdW5rbm93biB9IHwgdW5kZWZpbmVkO1xuICByZXR1cm4gZG9lc1NlZWRDb21tYW5kVXNlQnVpbGRUcyhwcmlzbWE/LnNlZWQpIHx8IGRvZXNTZWVkQ29tbWFuZFVzZUJ1aWxkVHMoanNvbk9iai5zY3JpcHRzPy5zZWVkKTtcbn1cblxuZnVuY3Rpb24gZG9lc1NlZWRDb21tYW5kVXNlQnVpbGRUcyhzZWVkQ29tbWFuZDogdW5rbm93bik6IGJvb2xlYW4ge1xuICAvLyBQcm9kdWN0aW9uIERvY2tlciBpbWFnZXMgcnVuIHNlZWQgc2NyaXB0cyBhZnRlciBkZXZEZXBlbmRlbmNpZXMgYXJlIHBydW5lZCxcbiAgLy8gc28gVHlwZVNjcmlwdCBzZWVkIHJ1bm5lcnMgbXVzdCByZW1haW4gYXZhaWxhYmxlIGF0IHJ1bnRpbWUuXG4gIHJldHVybiB0eXBlb2Ygc2VlZENvbW1hbmQgPT09ICdzdHJpbmcnICYmIC8oPzwhW1xcdy1dKWJ1aWxkLXRzKD8hW1xcdy1dKS91LnRlc3Qoc2VlZENvbW1hbmQpO1xufVxuXG5jb25zdCBkZXBlbmRlbmN5RGVjbGFyYXRpb25TZWN0aW9ucyA9IFtcbiAgJ2RlcGVuZGVuY2llcycsXG4gICdkZXZEZXBlbmRlbmNpZXMnLFxuICAnb3B0aW9uYWxEZXBlbmRlbmNpZXMnLFxuICAncGVlckRlcGVuZGVuY2llcycsXG5dIGFzIGNvbnN0O1xuXG4vKipcbiAqIEZvcmNlcyBzdG9yZS1pbmNvbXBhdGlibGUgcGFja2FnZXMgdG8gc3RheSBwcm9qZWN0LWxvY2FsIHdoZW4gdGhlIGdlbmVyYXRlZCBidW5maWcudG9tbCBlbmFibGVzXG4gKiBCdW4ncyBnbG9iYWwgc3RvcmU6IGBjaGFrcmEgdHlwZWdlbmAgKHJ1biBieSBgd2IgZ2VuLWNvZGVgKVxuICogd3JpdGVzIGdlbmVyYXRlZCB0eXBlcyBpbnRvIHRoZSBpbnN0YWxsZWQgQGNoYWtyYS11aS9yZWFjdCBwYWNrYWdlLCB3aGljaCB3b3VsZCBvdGhlcndpc2VcbiAqIG11dGF0ZSB0aGUgbWFjaGluZS13aWRlIHN0b3JlIHNoYXJlZCBhY3Jvc3MgcmVwb3NpdG9yaWVzLCBhbmQgZHJpenpsZS1raXQgcmVxdWlyZXMgZHJpenpsZS1vcm1cbiAqIHdpdGhvdXQgZGVjbGFyaW5nIGl0LCB3aGljaCB0aGUgc3RvcmUgcmVhbHBhdGggcGxhY2VzIGJleW9uZCBhIHBsYWluIG5vZGVfbW9kdWxlcyB3YWxrLXVwLlxuICogTGlzdGluZyB0aGVtIGluIGB0cnVzdGVkRGVwZW5kZW5jaWVzYCBtYWtlcyBCdW4gbWF0ZXJpYWxpemUgYSBwZXItcHJvamVjdCBjb3B5IHVuZGVyXG4gKiBgbm9kZV9tb2R1bGVzLy5idW4vYCwgd2hvc2Ugc2libGluZyBgbm9kZV9tb2R1bGVzLy5idW4vbm9kZV9tb2R1bGVzL2AgbGlua3MgZXZlcnkgaW5zdGFsbGVkXG4gKiBwYWNrYWdlIGFuZCB0aGVyZWZvcmUgcmVzb2x2ZXMgdGhlIHVuZGVjbGFyZWQgcmVxdWlyZXMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGVuc3VyZVRydXN0ZWREZXBlbmRlbmNpZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uKTogUHJvbWlzZTx2b2lkPiB7XG4gIC8vIEJ1biBjb25zdWx0cyB0cnVzdGVkRGVwZW5kZW5jaWVzIGluIHRoZSB3b3Jrc3BhY2Ugcm9vdCdzIHBhY2thZ2UuanNvbiBvbmx5LCBzbyB0aGUgbGlzdCBpc1xuICAvLyBtYW5hZ2VkIHRoZXJlIGFuZCBtdXN0IGNvdmVyIGRlcGVuZGVuY2llcyBkZWNsYXJlZCBhbnl3aGVyZSBpbiB0aGUgcmVwb3NpdG9yeS5cbiAgaWYgKCFjb25maWcuaXNSb290KSByZXR1cm47XG4gIGNvbnN0IGJ1bkpzb25PYmogPSBqc29uT2JqIGFzIFdyaXRhYmxlUGFja2FnZUpzb24gJiB7IHRydXN0ZWREZXBlbmRlbmNpZXM/OiBzdHJpbmdbXSB9O1xuICAvLyBCdW4gaW5zdGFsbHMgb3B0aW9uYWwgYW5kIHBlZXIgZGVwZW5kZW5jaWVzIGJ5IGRlZmF1bHQsIHNvIGFsbCBkZWNsYXJhdGlvbiBzZWN0aW9ucyBjb3VudC5cbiAgLy8gRXZlcnkgZGVjbGFyZWQgcmFuZ2UgaXMga2VwdCBwZXIgcGFja2FnZTogYSByb290IGRlY2xhcmF0aW9uIG11c3Qgbm90IG1hc2sgYSB3b3Jrc3BhY2Ugb25lXG4gIC8vIChlLmcuIHJvb3QgQGNoYWtyYS11aS9jbGkgdjIgYWxvbmdzaWRlIGEgd29ya3NwYWNlIG9uIHYzKS5cbiAgY29uc3QgZGVjbGFyZWREZXBlbmRlbmNpZXMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nW10+KCk7XG4gIGNvbnN0IGFkZERlY2xhcmVkRGVwZW5kZW5jaWVzID0gKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IHZvaWQgPT4ge1xuICAgIGZvciAoY29uc3Qgc2VjdGlvbiBvZiBkZXBlbmRlbmN5RGVjbGFyYXRpb25TZWN0aW9ucykge1xuICAgICAgZm9yIChjb25zdCBbZGVwZW5kZW5jeU5hbWUsIHZlcnNpb25SYW5nZV0gb2YgT2JqZWN0LmVudHJpZXMocGFja2FnZUpzb25bc2VjdGlvbl0gPz8ge30pKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmVyc2lvblJhbmdlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGNvbnN0IHZlcnNpb25SYW5nZXMgPSBkZWNsYXJlZERlcGVuZGVuY2llcy5nZXQoZGVwZW5kZW5jeU5hbWUpO1xuICAgICAgICAgIGlmICh2ZXJzaW9uUmFuZ2VzKSB7XG4gICAgICAgICAgICB2ZXJzaW9uUmFuZ2VzLnB1c2godmVyc2lvblJhbmdlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGVjbGFyZWREZXBlbmRlbmNpZXMuc2V0KGRlcGVuZGVuY3lOYW1lLCBbdmVyc2lvblJhbmdlXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBhZGREZWNsYXJlZERlcGVuZGVuY2llcyhqc29uT2JqKTtcbiAgZm9yIChjb25zdCBwYWNrYWdlSnNvblBhdGggb2YgZ2V0V29ya3NwYWNlUGFja2FnZUpzb25QYXRocyhjb25maWcpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGFkZERlY2xhcmVkRGVwZW5kZW5jaWVzKFxuICAgICAgICBKU09OLnBhcnNlKGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgcGFja2FnZUpzb25QYXRoKSwgJ3V0ZjgnKSkgYXMgUGFja2FnZUpzb25cbiAgICAgICk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBpZ25vcmUgdW5yZWFkYWJsZSB3b3Jrc3BhY2UgcGFja2FnZS5qc29uXG4gICAgfVxuICB9XG4gIC8vIE9ubHkgQGNoYWtyYS11aS9jbGkgdjMncyBgY2hha3JhIHR5cGVnZW5gIHdyaXRlcyBpbnRvIHRoZSBpbnN0YWxsZWQgQGNoYWtyYS11aS9yZWFjdDtcbiAgLy8gdjIncyBgY2hha3JhLWNsaSB0b2tlbnNgIHdyaXRlcyBpbnRvIEBjaGFrcmEtdWkvc3R5bGVkLXN5c3RlbSBpbnN0ZWFkLCBzbyB0cnVzdGluZ1xuICAvLyBAY2hha3JhLXVpL3JlYWN0IHRoZXJlIHdvdWxkIGZvcmNlIGEgdXNlbGVzcyBwcm9qZWN0LWxvY2FsIGNvcHkgd2l0aG91dCBmaXhpbmcgZ2VuLWNvZGUuXG4gIC8vIE1pcnJvciB3YiBnZW4tY29kZSdzIGNsYXNzaWZpY2F0aW9uOiBvbmx5IGEgcmFuZ2Ugd2hvc2UgbGVhZGluZyBtYWpvciBwYXJzZXMgdG8gMiBzZWxlY3RzIHRoZVxuICAvLyB2MiBjb21tYW5kLCBzbyBkaWdpdGxlc3Mgc3BlY3MgbGlrZSBgbGF0ZXN0YCBvciBjYXRhbG9nIHJlZmVyZW5jZXMgY291bnQgYXMgdjMuXG4gIGNvbnN0IGhhc0NoYWtyYUNsaVYzID0gKGRlY2xhcmVkRGVwZW5kZW5jaWVzLmdldCgnQGNoYWtyYS11aS9jbGknKSA/PyBbXSkuc29tZShcbiAgICAodmVyc2lvblJhbmdlKSA9PiAvXFxkKy91LmV4ZWModmVyc2lvblJhbmdlKT8uWzBdICE9PSAnMidcbiAgKTtcbiAgY29uc3QgcmVxdWlyZWRXYmZ5UGFja2FnZXMgPSBbXG4gICAgLi4uKGhhc0NoYWtyYUNsaVYzICYmIGRlY2xhcmVkRGVwZW5kZW5jaWVzLmhhcygnQGNoYWtyYS11aS9yZWFjdCcpID8gWydAY2hha3JhLXVpL3JlYWN0J10gOiBbXSksXG4gICAgLi4uKGRlY2xhcmVkRGVwZW5kZW5jaWVzLmhhcygnZHJpenpsZS1raXQnKSA/IFsnZHJpenpsZS1raXQnXSA6IFtdKSxcbiAgICAvLyBUaGVzZSBnaXQtZGVwZW5kZW5jeSBidWlsZHMgaW1wb3J0IHBhY2thZ2VzIHRoZXkgZG8gbm90IGRlY2xhcmUgKGUuZy4gem9kKSwgd2hpY2ggdGhlXG4gICAgLy8gZ2xvYmFsLXN0b3JlIGxheW91dCBwbGFjZXMgYmV5b25kIHRoZWlyIHdhbGstdXA7IGEgcHJvamVjdC1sb2NhbCBjb3B5IHVuZGVyXG4gICAgLy8gbm9kZV9tb2R1bGVzLy5idW4gcmVzb2x2ZXMgdGhlbSAob2JzZXJ2ZWQgaW4gV2lsbEJvb3N0ZXIvcHJvbXB0LXN0dWR5KS5cbiAgICAuLi4oZGVjbGFyZWREZXBlbmRlbmNpZXMuaGFzKCdAd2lsbGJvb3N0ZXIvanVkZ2UnKSA/IFsnQHdpbGxib29zdGVyL2p1ZGdlJ10gOiBbXSksXG4gICAgLi4uKGRlY2xhcmVkRGVwZW5kZW5jaWVzLmhhcygnQHdpbGxib29zdGVyL2xsbS1wcm94eScpID8gWydAd2lsbGJvb3N0ZXIvbGxtLXByb3h5J10gOiBbXSksXG4gICAgLy8gYmxpdHogYW5kIEBibGl0empzL2F1dGggcmVxdWlyZSByZWFjdCAoYW5kIG90aGVyIHBlZXJzKSB3aXRob3V0IGRlY2xhcmluZyB0aGVtLCByZWx5aW5nIG9uXG4gICAgLy8gaG9pc3RpbmcsIHdoaWNoIHRoZSBnbG9iYWwtc3RvcmUgbGF5b3V0IHBsYWNlcyBiZXlvbmQgdGhlaXIgd2Fsay11cCAob2JzZXJ2ZWQgaW5cbiAgICAvLyBXaWxsQm9vc3Rlci9zdXJ2ZXktc3lzdGVtOiBgbmV4dCBidWlsZGAgcGFnZS1kYXRhIGNvbGxlY3Rpb24gZGllcyB3aXRoIFwiQ2Fubm90IGZpbmQgbW9kdWxlXG4gICAgLy8gJ3JlYWN0J1wiIGZyb20gQGJsaXR6anMvYXV0aCkuIEBibGl0empzL3JwYyBpcyBOT1QgbGlzdGVkIGJlY2F1c2UgaXQgcHJvcGVybHkgZGVjbGFyZXMgaXRzXG4gICAgLy8gcmVhY3QvQHRhbnN0YWNrIHBlZXJzLCBzbyBCdW4gbGlua3MgdGhlbSBpbnRvIGl0cyBzdG9yZSBlbnRyeS4gQGJsaXR6anMvbmV4dCBpc1xuICAgIC8vIGRlbGliZXJhdGVseSBOT1QgbGlzdGVkIGVpdGhlcjogdHJ1c3RpbmcgaXQgd291bGQgcnVuIGl0cyBwb3N0aW5zdGFsbCAoYGJsaXR6IGNvZGVnZW5gKSxcbiAgICAvLyB3aGljaCBwYXRjaGVzIHRoZSBpbnN0YWxsZWQgbmV4dCBwYWNrYWdlIGluIHBsYWNlIOKAlCByZXBvc2l0b3JpZXMgcGF0Y2ggb3V0IHRoYXQgcG9zdGluc3RhbGxcbiAgICAvLyB3aXRoIGBidW4gcGF0Y2hgIGluc3RlYWQsIHdoaWNoIGFsc28ga2VlcHMgdGhlIHBhY2thZ2UgcHJvamVjdC1sb2NhbC5cbiAgICAuLi4oZGVjbGFyZWREZXBlbmRlbmNpZXMuaGFzKCdibGl0eicpID8gWydibGl0eiddIDogW10pLFxuICAgIC4uLihkZWNsYXJlZERlcGVuZGVuY2llcy5oYXMoJ0BibGl0empzL2F1dGgnKSA/IFsnQGJsaXR6anMvYXV0aCddIDogW10pLFxuICAgIC8vIEJ1biBkb2VzIG5vdCBsaW5rIEBob29rZm9ybS9yZXNvbHZlcnMnIE9QVElPTkFMIHZhbGlkYXRvciBwZWVycyAoZS5nLiB6b2QpIGludG8gaXRzXG4gICAgLy8gZ2xvYmFsLXN0b3JlIGVudHJ5IGV2ZW4gd2hlbiB0aGUgcHJvamVjdCBpbnN0YWxscyB0aGVtLCBzbyBpdHMgc2VydmVyLXNpZGVcbiAgICAvLyBgaW1wb3J0ICd6b2QnYCBmYWlscyBmcm9tIHRoZSBzdG9yZSAob2JzZXJ2ZWQgaW4gV2lsbEJvb3N0ZXIvc3VydmV5LXN5c3RlbSkuXG4gICAgLi4uKGRlY2xhcmVkRGVwZW5kZW5jaWVzLmhhcygnQGhvb2tmb3JtL3Jlc29sdmVycycpID8gWydAaG9va2Zvcm0vcmVzb2x2ZXJzJ10gOiBbXSksXG4gICAgLy8gQHpvb20vcnRtcyBpbnN0YWxscyBpdHMgbmF0aXZlIHJ0bXMubm9kZSBiaW5kaW5nIGluIGEgbGlmZWN5Y2xlIHNjcmlwdC4gV2l0aG91dCBleHBsaWNpdFxuICAgIC8vIHRydXN0LCBCdW4gc2tpcHMgdGhhdCBzY3JpcHQgYW5kIHRoZSBwYWNrYWdlIGZhaWxzIGFzIHNvb24gYXMgdGhlIFpvb20gYm90IGltcG9ydHMgaXRcbiAgICAvLyAob2JzZXJ2ZWQgaW4gV2lsbEJvb3N0ZXIvc21hcnRzZS16b29tLWJvdCkuXG4gICAgLi4uKGRlY2xhcmVkRGVwZW5kZW5jaWVzLmhhcygnQHpvb20vcnRtcycpID8gWydAem9vbS9ydG1zJ10gOiBbXSksXG4gIF07XG5cbiAgLy8gd2JmeSBmdWxseSBvd25zIHRoaXMgZmllbGQ6IGEgcGFja2FnZSB3aG9zZSBsaWZlY3ljbGUgc2NyaXB0cyBtdXN0IHJ1biBnZXRzIGFkZGVkIHRvIHdiZnlcbiAgLy8gaXRzZWxmIGluc3RlYWQgb2YgdG8gaW5kaXZpZHVhbCByZXBvc2l0b3JpZXMsIHNvIHVubWFuYWdlZCBlbnRyaWVzIGFyZSBhbHdheXMgcmVtb3ZlZCDigJRcbiAgLy8gaW5jbHVkaW5nIGFuIGV4cGxpY2l0bHkgZW1wdHkgZGVueS1hbGwgbGlzdCwgd2hvc2UgZGVsZXRpb24gZGVsaWJlcmF0ZWx5IHJlc3RvcmVzIEJ1bidzXG4gIC8vIGRlZmF1bHQgYWxsb3ctbGlzdCAodGhlIG93bmVyc2hpcCBwb2xpY3kgY2hvc2VuIGluICM5NzUpLlxuICBjb25zdCBleGlzdGluZ1RydXN0ZWQgPSBidW5Kc29uT2JqLnRydXN0ZWREZXBlbmRlbmNpZXM7XG4gIGlmIChyZXF1aXJlZFdiZnlQYWNrYWdlcy5sZW5ndGggPT09IDApIHtcbiAgICBpZiAoZXhpc3RpbmdUcnVzdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIERlbGV0aW5nIHRoZSBmaWVsZCByZXN0b3JlcyBCdW4ncyBmdWxsIGRlZmF1bHQgYWxsb3ctbGlzdCwgc28gb25seSBlbnRyaWVzIG91dHNpZGUgdGhhdFxuICAgICAgLy8gbGlzdCBhY3R1YWxseSBsb3NlIHRoZWlyIGxpZmVjeWNsZSBzY3JpcHRzLlxuICAgICAgd2FybkFib3V0UmVtb3ZlZFRydXN0ZWREZXBlbmRlbmNpZXMoY29uZmlnLCBleGlzdGluZ1RydXN0ZWQsIG5ldyBTZXQoKSk7XG4gICAgICBkZWxldGUgYnVuSnNvbk9iai50cnVzdGVkRGVwZW5kZW5jaWVzO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBBbiBleHBsaWNpdCB0cnVzdGVkRGVwZW5kZW5jaWVzIGxpc3QgUkVQTEFDRVMgQnVuJ3MgZGVmYXVsdCBhbGxvdy1saXN0IGluc3RlYWQgb2YgZXh0ZW5kaW5nXG4gIC8vIGl0LCBhbmQgQnVuIHByaW50cyBubyB3YXJuaW5nIGZvciB0aGUgcG9zdGluc3RhbGxzIGl0IGNvbnNlcXVlbnRseSBza2lwcyAoZS5nLiBAcmFpbHdheS9jbGlcbiAgLy8gZG93bmxvYWRzIGl0cyBiaW5hcnkgaW4gcG9zdGluc3RhbGwgYW5kIGV4aXRzIDEgd2l0aG91dCBvbmUpLiBJbmNsdWRlIHRoZSBFTlRJUkUgZGVmYXVsdCBsaXN0OlxuICAvLyBlbnRyaWVzIGZvciBwYWNrYWdlcyB0aGF0IGFyZSBub3QgaW5zdGFsbGVkIGFyZSBpbmVydCwgYW5kIHRoaXMgaXMgdGhlIG9ubHkgcmVwcmVzZW50YXRpb25cbiAgLy8gdGhhdCBzdGF5cyBjb3JyZWN0IGZvciB0cmFuc2l0aXZlIGRlcGVuZGVuY2llcyB0aGUgZmluYWwgYGJ1biBpbnN0YWxsYCByZXNvbHZlcyBhZnRlciB0aGlzXG4gIC8vIHJ1bnMg4oCUIGFuIGludGVyc2VjdGlvbiB3aXRoIGEgbWlzc2luZyBvciBzdGFsZSBsb2NrZmlsZSB3b3VsZCBzaWxlbnRseSBkcm9wIHRoZW0uXG4gIGNvbnN0IGRlZmF1bHRUcnVzdGVkRGVwZW5kZW5jaWVzID0gZ2V0RGVmYXVsdFRydXN0ZWREZXBlbmRlbmNpZXMoY29uZmlnKTtcbiAgLy8gbGVmdGhvb2sgaXMgYXBwZW5kZWQgZXhwbGljaXRseSBzbyB0aGUgZGVmYXVsdC1saXN0IGxvb2t1cCBmYWlsaW5nIGNhbm5vdCBkcm9wIGl0OiBpdCBpc1xuICAvLyByZXF1aXJlZCBpbiBldmVyeSBtYW5hZ2VkIHJlcG9zaXRvcnkuXG4gIGNvbnN0IG5ld1RydXN0ZWRQYWNrYWdlcyA9IG5ldyBTZXQoW1xuICAgIC4uLnJlcXVpcmVkV2JmeVBhY2thZ2VzLFxuICAgIGxlZnRob29rRGVwZW5kZW5jeSxcbiAgICAuLi4oZGVmYXVsdFRydXN0ZWREZXBlbmRlbmNpZXMgPz8gW10pLFxuICBdKTtcbiAgd2FybkFib3V0UmVtb3ZlZFRydXN0ZWREZXBlbmRlbmNpZXMoY29uZmlnLCBleGlzdGluZ1RydXN0ZWQgPz8gW10sIG5ld1RydXN0ZWRQYWNrYWdlcyk7XG4gIGJ1bkpzb25PYmoudHJ1c3RlZERlcGVuZGVuY2llcyA9IFsuLi5uZXdUcnVzdGVkUGFja2FnZXNdLnRvU29ydGVkKCk7XG59XG5cbi8vIFRoZSBwYWNrYWdlcyB3YmZ5IGl0c2VsZiBtYXkgd3JpdGUgaW50byB0cnVzdGVkRGVwZW5kZW5jaWVzOyB0aGVpciByZW1vdmFsIGlzIG1hbmFnZWQgY2xlYW51cCxcbi8vIG5ldmVyIGEgbG9zcyBvZiB1c2VyIHBvbGljeS5cbmNvbnN0IHdiZnlNYW5hZ2VkVHJ1c3RlZERlcGVuZGVuY2llcyA9IG5ldyBTZXQoW1xuICAnQGJsaXR6anMvYXV0aCcsXG4gICdAY2hha3JhLXVpL3JlYWN0JyxcbiAgJ0Bob29rZm9ybS9yZXNvbHZlcnMnLFxuICAnQHdpbGxib29zdGVyL2p1ZGdlJyxcbiAgJ0B3aWxsYm9vc3Rlci9sbG0tcHJveHknLFxuICAnQHpvb20vcnRtcycsXG4gICdibGl0eicsXG4gICdkcml6emxlLWtpdCcsXG4gIGxlZnRob29rRGVwZW5kZW5jeSxcbl0pO1xuXG5mdW5jdGlvbiB3YXJuQWJvdXRSZW1vdmVkVHJ1c3RlZERlcGVuZGVuY2llcyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBleGlzdGluZ1RydXN0ZWQ6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBrZXB0UGFja2FnZXM6IFJlYWRvbmx5U2V0PHN0cmluZz5cbik6IHZvaWQge1xuICAvLyBBIGRlZmF1bHQtdHJ1c3RlZCBlbnRyeSBuZXZlciBsb3NlcyBhbnl0aGluZyBieSByZW1vdmFsOiB3aGlsZSB0aGUgcGFja2FnZSBpcyBpbnN0YWxsZWQgdGhlXG4gIC8vIGtlcHQgbGlzdCAob3IsIHdoZW4gdGhlIGZpZWxkIGlzIGRlbGV0ZWQsIEJ1bidzIG93biBkZWZhdWx0IGxpc3QpIHN0aWxsIHRydXN0cyBpdC5cbiAgY29uc3QgZGVmYXVsdFRydXN0ZWREZXBlbmRlbmNpZXMgPSBnZXREZWZhdWx0VHJ1c3RlZERlcGVuZGVuY2llcyhjb25maWcpO1xuICBjb25zdCByZW1vdmVkUGFja2FnZXMgPSBleGlzdGluZ1RydXN0ZWQuZmlsdGVyKFxuICAgIChwa2cpID0+ICFrZXB0UGFja2FnZXMuaGFzKHBrZykgJiYgIXdiZnlNYW5hZ2VkVHJ1c3RlZERlcGVuZGVuY2llcy5oYXMocGtnKSAmJiAhZGVmYXVsdFRydXN0ZWREZXBlbmRlbmNpZXM/Lmhhcyhwa2cpXG4gICk7XG4gIGlmIChyZW1vdmVkUGFja2FnZXMubGVuZ3RoID4gMCkge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgIGBSZW1vdmluZyB1bm1hbmFnZWQgdHJ1c3RlZERlcGVuZGVuY2llcyBlbnRyaWVzOiAke3JlbW92ZWRQYWNrYWdlcy5qb2luKCcsICcpfS4gd2JmeSBvd25zIHRoaXMgZmllbGQ7IGlmIHRoZWlyIGxpZmVjeWNsZSBzY3JpcHRzIGFyZSByZXF1aXJlZCwgYWRkIHRoZSBwYWNrYWdlcyB0byB3YmZ5IGl0c2VsZi5gXG4gICAgKTtcbiAgfVxufVxuXG5sZXQgY2FjaGVkRGVmYXVsdFRydXN0ZWREZXBlbmRlbmNpZXM6IFNldDxzdHJpbmc+IHwgdW5kZWZpbmVkO1xuXG4vKiogRmV0Y2hlcyBCdW4ncyBkZWZhdWx0IHRydXN0ZWQtZGVwZW5kZW5jeSBhbGxvdy1saXN0IGZyb20gdGhlIEJ1biB2ZXJzaW9uIGluc3RhbGxpbmcgdGhlIHJlcG9zaXRvcnkuICovXG5mdW5jdGlvbiBnZXREZWZhdWx0VHJ1c3RlZERlcGVuZGVuY2llcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBTZXQ8c3RyaW5nPiB8IHVuZGVmaW5lZCB7XG4gIGlmICghY2FjaGVkRGVmYXVsdFRydXN0ZWREZXBlbmRlbmNpZXMpIHtcbiAgICAvLyBCdW4gY29sb3JpemVzIHRoZSBsaXN0IG1hcmtlcnMgd2hlbiBGT1JDRV9DT0xPUiBpcyBzZXQgKGUuZy4gYnkgdGVzdCBydW5uZXJzIG9uIENJKSwgc29cbiAgICAvLyBBTlNJIGVzY2FwZSBzZXF1ZW5jZXMgbXVzdCBiZSBzdHJpcHBlZCBiZWZvcmUgcGFyc2luZy5cbiAgICBjb25zdCBzdGRvdXQgPSBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoJ2J1bicsIFsncG0nLCAnZGVmYXVsdC10cnVzdGVkJ10sIGNvbmZpZy5kaXJQYXRoKS5yZXBsYWNlQWxsKFxuICAgICAgLy8gb3hsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnRyb2wtcmVnZXggLS0gbWF0Y2hpbmcgQU5TSSBlc2NhcGUgc2VxdWVuY2VzIHJlcXVpcmVzIHRoZSBFU0MgY29udHJvbCBjaGFyYWN0ZXJcbiAgICAgIC9cXHUwMDFCXFxbWzAtOTtdKm0vZ3UsXG4gICAgICAnJ1xuICAgICk7XG4gICAgY29uc3QgcGFyc2VkRGVwZW5kZW5jaWVzID0gbmV3IFNldChbLi4uc3Rkb3V0Lm1hdGNoQWxsKC9eXFxzKi1cXHMrKFxcUyspJC9nbXUpXS5tYXAoKG1hdGNoKSA9PiBtYXRjaFsxXSBhcyBzdHJpbmcpKTtcbiAgICBpZiAocGFyc2VkRGVwZW5kZW5jaWVzLnNpemUgPT09IDApIHtcbiAgICAgIC8vIERvIG5vdCBjYWNoZSB0aGUgZmFpbHVyZTogYSB0YXJnZXQtbG9jYWwgcHJvYmxlbSAoZS5nLiBhbiB1bnJlYWRhYmxlIHBhY2thZ2UuanNvbikgbXVzdFxuICAgICAgLy8gbm90IGRlbnkgdGhlIGRlZmF1bHQgbGlzdCB0byBldmVyeSBsYXRlciB0YXJnZXQgb2YgYSBtdWx0aS1wYXRoIHJ1bi5cbiAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIHJlYWQgdGhlIGRlZmF1bHQgYWxsb3ctbGlzdCB2aWEgYGJ1biBwbSBkZWZhdWx0LXRydXN0ZWRgLicpO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY2FjaGVkRGVmYXVsdFRydXN0ZWREZXBlbmRlbmNpZXMgPSBwYXJzZWREZXBlbmRlbmNpZXM7XG4gIH1cbiAgcmV0dXJuIGNhY2hlZERlZmF1bHRUcnVzdGVkRGVwZW5kZW5jaWVzO1xufVxuXG5hc3luYyBmdW5jdGlvbiBub3JtYWxpemVQYWNrYWdlTWV0YWRhdGEoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbixcbiAgZGVwZW5kZW5jeVVwZGF0ZXM6IERlcGVuZGVuY3lVcGRhdGVzXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFqc29uT2JqLm5hbWUpIHtcbiAgICBqc29uT2JqLm5hbWUgPSBwYXRoLmJhc2VuYW1lKGNvbmZpZy5kaXJQYXRoKTtcbiAgfVxuXG4gIC8vIEV4cGxpY2l0IHJvb3QgcHVibGlzaGluZyBpbnRlbnQgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIHdiZnkncyBwcml2YXRlIG1vbm9yZXBvLXJvb3QgZGVmYXVsdC5cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucyAmJiAoY29uZmlnLnJlbGVhc2UubnBtUHVibGlzaGVzUm9vdCB8fCBqc29uT2JqLnB1Ymxpc2hDb25maWcpKSB7XG4gICAgZGVsZXRlIGpzb25PYmoucHJpdmF0ZTtcbiAgfSBlbHNlIGlmIChjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMgJiYgIWNvbmZpZy5yZWxlYXNlLm5wbSAmJiAhanNvbk9iai5wdWJsaXNoQ29uZmlnKSB7XG4gICAganNvbk9iai5wcml2YXRlID0gdHJ1ZTtcbiAgfVxuICBpZiAoIWpzb25PYmoubGljZW5zZSkge1xuICAgIGpzb25PYmoubGljZW5zZSA9ICdVTkxJQ0VOU0VEJztcbiAgfVxuICBpZiAoIWpzb25PYmoucHJpdmF0ZSAmJiBqc29uT2JqLmxpY2Vuc2UgIT09ICdVTkxJQ0VOU0VEJyAmJiByb290Q29uZmlnLmlzUHVibGljUmVwbykge1xuICAgIGpzb25PYmoucHVibGlzaENvbmZpZyA/Pz0ge307XG4gICAganNvbk9iai5wdWJsaXNoQ29uZmlnLmFjY2VzcyA/Pz0gJ3B1YmxpYyc7XG4gICAgLy8gV2l0aG91dCBhbiBleHBsaWNpdCByZWdpc3RyeSwgbnBtIHJlc29sdmVzIHRoZSBwdWJsaXNoIHRhcmdldCBmcm9tIHRoZSB3b3Jrc3BhY2UgLm5wbXJjLFxuICAgIC8vIHdob3NlIGRlZmF1bHQgcmVnaXN0cnkgb24gQ0kgbWF5IGJlIHRoZSBUYWt1bWkgR3VhcmQgaW5zdGFsbCBwcm94eSDigJQgd2hpY2ggcmVqZWN0c1xuICAgIC8vIGBucG0gcHVibGlzaGAgd2l0aCA0MDUgKHNoYXJlZCMxMDcyKS4gYD8/PWAga2VlcHMgYSBkZWxpYmVyYXRlbHkgZGlmZmVyZW50IHJlZ2lzdHJ5LlxuICAgIGpzb25PYmoucHVibGlzaENvbmZpZy5yZWdpc3RyeSA/Pz0gJ2h0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnLyc7XG4gIH1cbiAgY29uc3Qgb3duZXIgPSBjb25maWcucmVwb0F1dGhvcjtcbiAgaWYgKG93bmVyID09PSAnV2lsbEJvb3N0ZXInIHx8IG93bmVyID09PSAnV2lsbEJvb3N0ZXJMYWInKSB7XG4gICAganNvbk9iai5hdXRob3IgPSAnV2lsbEJvb3N0ZXIgSW5jLic7XG4gIH1cbiAgYXdhaXQgbm9ybWFsaXplUHVibGlzaGVkQ29uZmlnUGFja2FnZU1ldGFkYXRhKGNvbmZpZywganNvbk9iaik7XG4gIGlmICghY29uZmlnLmlzUm9vdCAmJiBqc29uT2JqLnByaXZhdGUgJiYgIWpzb25PYmoubWFpbikge1xuICAgIC8vIE1ha2UgVlNDb2RlIHBvc3NpYmxlIHRvIHJlZmFjdG9yIGNvZGUgYWNyb3NzIHN1YnBhY2thZ2VzLlxuICAgIGpzb25PYmoubWFpbiA9ICcuL3NyYyc7XG4gIH1cblxuICBpZiAoIWNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucykge1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgICAganNvbk9iai5zY3JpcHRzLmxpbnQgPSAnZmx1dHRlciBhbmFseXplJztcbiAgICAgIGpzb25PYmouc2NyaXB0c1snbGludC1maXgnXSA9ICdidW4gcnVuIGxpbnQnO1xuICAgICAgY29uc3QgZGlycyA9IFsnbGliJywgJ3Rlc3QnLCAndGVzdF9kcml2ZXInXS5maWx0ZXIoKGRpcikgPT4gZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGRpcikpKTtcbiAgICAgIGlmIChkaXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAganNvbk9iai5zY3JpcHRzWydmb3JtYXQtY29kZSddID0gYGRhcnQgZm9ybWF0ICQoZmluZCAke2RpcnMuam9pbihcbiAgICAgICAgICAnICdcbiAgICAgICAgKX0gLW5hbWUgZ2VuZXJhdGVkIC1wcnVuZSAtbyAtbmFtZSAnKi5mcmVlemVkLmRhcnQnIC1wcnVuZSAtbyAtbmFtZSAnKi5nLmRhcnQnIC1wcnVuZSAtbyAtbmFtZSAnKi5kYXJ0JyAtcHJpbnQpYDtcbiAgICAgICAganNvbk9iai5zY3JpcHRzLmZvcm1hdCA9IGFwcGVuZEZvcm1hdENvZGVDb21tYW5kKGpzb25PYmouc2NyaXB0cy5mb3JtYXQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHB5dGhvblBhY2thZ2VNYW5hZ2VyID0gZ2V0UHl0aG9uUGFja2FnZU1hbmFnZXIoY29uZmlnKTtcbiAgICBpZiAocHl0aG9uUGFja2FnZU1hbmFnZXIpIHtcbiAgICAgIGNvbnN0IHNjcmlwdFJ1bm5lciA9ICdidW4gcnVuJztcbiAgICAgIGpzb25PYmouc2NyaXB0c1snY29tbW9uL2NpLXNldHVwJ10gPSBgJHtzY3JpcHRSdW5uZXJ9IHNldHVwLSR7cHl0aG9uUGFja2FnZU1hbmFnZXJ9YDtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbYHNldHVwLSR7cHl0aG9uUGFja2FnZU1hbmFnZXIgPT09ICdwb2V0cnknID8gJ3V2JyA6ICdwb2V0cnknfWBdO1xuICAgICAganNvbk9iai5zY3JpcHRzW2BzZXR1cC0ke3B5dGhvblBhY2thZ2VNYW5hZ2VyfWBdID0gZ2V0UHl0aG9uU2V0dXBDb21tYW5kKHB5dGhvblBhY2thZ2VNYW5hZ2VyKTtcbiAgICAgIGNvbnN0IHB5dGhvbkZpbGVzID0gYXdhaXQgZmcuZ2xvYignKiovKi5weScsIHtcbiAgICAgICAgY3dkOiBjb25maWcuZGlyUGF0aCxcbiAgICAgICAgZG90OiB0cnVlLFxuICAgICAgICBpZ25vcmU6IGdsb2JJZ25vcmUsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGRpck5hbWVTZXQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgIGZvciAoY29uc3QgcHl0aG9uRmlsZSBvZiBweXRob25GaWxlcykge1xuICAgICAgICBjb25zdCBbZmlyc3QsIHNlY29uZF0gPSBweXRob25GaWxlLnNwbGl0KCcvJyk7XG4gICAgICAgIGlmIChmaXJzdCAmJiBzZWNvbmQpIHtcbiAgICAgICAgICBkaXJOYW1lU2V0LmFkZChmaXJzdCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChkaXJOYW1lU2V0LnNpemUgPiAwKSB7XG4gICAgICAgIGNvbnN0IGRpck5hbWVzU3RyID0gWy4uLmRpck5hbWVTZXRdLmpvaW4oJyAnKTtcbiAgICAgICAgY29uc3QgcHl0aG9uUnVubmVyID0gYCR7cHl0aG9uUGFja2FnZU1hbmFnZXJ9IHJ1bmA7XG4gICAgICAgIGpzb25PYmouc2NyaXB0c1snZm9ybWF0LWNvZGUnXSA9XG4gICAgICAgICAgYCR7cHl0aG9uUnVubmVyfSBpc29ydCAtLXByb2ZpbGUgYmxhY2sgJHtkaXJOYW1lc1N0cn0gJiYgJHtweXRob25SdW5uZXJ9IGJsYWNrICR7ZGlyTmFtZXNTdHJ9YDtcbiAgICAgICAgaWYgKGpzb25PYmouc2NyaXB0cy5saW50KSB7XG4gICAgICAgICAganNvbk9iai5zY3JpcHRzLmxpbnQgPSBgJHtweXRob25SdW5uZXJ9IGZsYWtlOCAke2Rpck5hbWVzU3RyfSAmJiAke2pzb25PYmouc2NyaXB0cy5saW50fWA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAganNvbk9iai5zY3JpcHRzLmxpbnQgPSBgJHtweXRob25SdW5uZXJ9IGZsYWtlOCAke2Rpck5hbWVzU3RyfWA7XG4gICAgICAgICAganNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddID0gYCR7c2NyaXB0UnVubmVyfSBsaW50YDtcbiAgICAgICAgfVxuICAgICAgICBqc29uT2JqLnNjcmlwdHMuZm9ybWF0ID0gYXBwZW5kRm9ybWF0Q29kZUNvbW1hbmQoanNvbk9iai5zY3JpcHRzLmZvcm1hdCk7XG4gICAgICAgIGRlcGVuZGVuY3lVcGRhdGVzLnB5dGhvbkRldkRlcGVuZGVuY2llcy5wdXNoKCdibGFjaycsICdpc29ydCcsICdmbGFrZTgnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlnLnJlcG9zaXRvcnkgfHwganNvbk9iai5yZXBvc2l0b3J5KSB7XG4gICAganNvbk9iai5yZXBvc2l0b3J5ID0gZm9ybWF0UmVwb3NpdG9yeUZvclBhY2thZ2VKc29uKGNvbmZpZy5yZXBvc2l0b3J5ID8/IGpzb25PYmoucmVwb3NpdG9yeSwganNvbk9iai5yZXBvc2l0b3J5KTtcbiAgfVxuXG4gIGNvbnN0IGdlbkNvZGVTY3JpcHQgPSBqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ107XG4gIGlmIChzaG91bGRHZW5lcmF0ZVdiR2VuQ29kZVNjcmlwdChjb25maWcpKSB7XG4gICAgLy8gUHJlc2VydmUgcHJvamVjdC1zcGVjaWZpYyBzdGVwcyBhIHJlcG8gYXBwZW5kZWQgdG8gdGhlIG1hbmFnZWQgYGJ1biB3YiBnZW4tY29kZWAgKGUuZy4gYnVpbGRpbmcgZXh0cmEgZGVwbG95XG4gICAgLy8gYXNzZXRzKSBpbnN0ZWFkIG9mIGRpc2NhcmRpbmcgdGhlbTsgb25seSB0aGUgbWFuYWdlZCBnZW4tY29kZSBzZWdtZW50IGlzIHdiZnkncyB0b1xuICAgIC8vIHJlZ2VuZXJhdGUuIEFuIHVucGFyc2VhYmxlIHNjcmlwdCBpcyBsZWZ0IGFsb25lIHJhdGhlciB0aGFuIHJld3JpdHRlbiBmcm9tIGEgd3JvbmcgcGFyc2UuXG4gICAgY29uc3Qgc2VnbWVudHMgPSBnZW5Db2RlU2NyaXB0ID09PSB1bmRlZmluZWQgPyBbXSA6IHNwbGl0U2NyaXB0U2VnbWVudHMoZ2VuQ29kZVNjcmlwdCk7XG4gICAgY29uc3QgY3VzdG9tU2VnbWVudHMgPSBzZWdtZW50cz8uZmlsdGVyKFxuICAgICAgKHNlZ21lbnQpID0+IGNsYXNzaWZ5U2NyaXB0U2VnbWVudChzZWdtZW50LCBqc29uT2JqLnNjcmlwdHMsIHRydWUpID09PSAnY3VzdG9tJ1xuICAgICk7XG4gICAgaWYgKGN1c3RvbVNlZ21lbnRzKSB7XG4gICAgICBqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10gPSBbJ2J1biB3YiBnZW4tY29kZScsIC4uLmN1c3RvbVNlZ21lbnRzXS5qb2luKCcgJiYgJyk7XG4gICAgfVxuICB9XG4gIHVwZGF0ZVBvc3RpbnN0YWxsU2NyaXB0KGpzb25PYmouc2NyaXB0cywgZ2VuZXJhdGVzV29ya2VyVHlwZXMoY29uZmlnKSk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZEdlbmVyYXRlV2JHZW5Db2RlU2NyaXB0KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gY29uZmlnLmRlcGVuZGluZy5ibGl0eiB8fCBjb25maWcuZGVwZW5kaW5nLmNoYWtyYSB8fCBjb25maWcuZGVwZW5kaW5nLmdlbkkxOG5UcyB8fCBjb25maWcuZGVwZW5kaW5nLnByaXNtYTtcbn1cblxuZnVuY3Rpb24gYXBwZW5kRm9ybWF0Q29kZUNvbW1hbmQoZm9ybWF0U2NyaXB0OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICByZXR1cm4gZm9ybWF0U2NyaXB0ID8gYCR7Zm9ybWF0U2NyaXB0fSAmJiBidW4gcnVuIGZvcm1hdC1jb2RlYCA6ICdidW4gcnVuIGZvcm1hdC1jb2RlJztcbn1cblxuYXN5bmMgZnVuY3Rpb24gbm9ybWFsaXplUHVibGlzaGVkQ29uZmlnUGFja2FnZU1ldGFkYXRhKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb25cbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIWlzUHVibGlzaGVkV2lsbGJvb3N0ZXJDb25maWdzUGFja2FnZShjb25maWcpKSByZXR1cm47XG5cbiAgY29uc3QgY29uZmlnTWpzUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2NvbmZpZy5tanMnKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGNvbmZpZ01qc1BhdGgpKSByZXR1cm47XG5cbiAganNvbk9iai50eXBlID0gJ21vZHVsZSc7XG5cbiAgY29uc3QgY29uZmlnRHRzUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2NvbmZpZy5kLnRzJyk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhjb25maWdEdHNQYXRoKSkgcmV0dXJuO1xuXG4gIGpzb25PYmouZmlsZXMgPSBbLi4ubmV3IFNldChbLi4uKGpzb25PYmouZmlsZXMgPz8gW10pLCAnY29uZmlnLmQubXRzJ10pXTtcbiAgLy8gTm9kZU5leHQgcmVzb2x2ZXMgYSByZWxhdGl2ZSBgLi9jb25maWcubWpzYCBpbXBvcnQgdG8gYGNvbmZpZy5kLm10c2AsIG5vdFxuICAvLyB0aGUgcGFja2FnZS1sZXZlbCBgdHlwZXNgIGZpZWxkLiBLZWVwIHRoZSBwdWJsaXNoZWQgY29uZmlnIGltcG9ydGFibGUgZnJvbVxuICAvLyBwYWNrYWdlLWxvY2FsIFR5cGVTY3JpcHQgbGludGVyIHNldHRpbmdzLlxuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdjb25maWcuZC5tdHMnKSwgY29uZmlnRG10c0NvbnRlbnQpKTtcbn1cblxuY29uc3QgY29uZmlnRG10c0NvbnRlbnQgPSBgZXhwb3J0IHsgZGVmYXVsdCB9IGZyb20gJy4vY29uZmlnLmpzJztcbmA7XG5cbmZ1bmN0aW9uIGFkZERlcGVuZGVuY3lWZXJzaW9uc1RvUGFja2FnZUpzb24oXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbixcbiAgZGVwZW5kZW5jeVVwZGF0ZXM6IERlcGVuZGVuY3lVcGRhdGVzLFxuICBza2lwQWRkaW5nRGVwczogYm9vbGVhblxuKTogdm9pZCB7XG4gIGNvbnN0IHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXBlbmRlbmNpZXM7XG4gIGNvbnN0IHBhY2thZ2VKc29uRGV2RGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXZEZXBlbmRlbmNpZXM7XG4gIGRlcGVuZGVuY3lVcGRhdGVzLmRlcGVuZGVuY2llcyA9IGFkZFBhY2thZ2VKc29uRGVwZW5kZW5jaWVzKFxuICAgIGNvbmZpZyxcbiAgICByb290Q29uZmlnLFxuICAgIGpzb25PYmosXG4gICAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXMsXG4gICAgWy4uLmRlcGVuZGVuY3lVcGRhdGVzLmRlcGVuZGVuY2llcywgLi4uZ2V0RXhpc3RpbmdNYW5hZ2VkRGVwZW5kZW5jaWVzKHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzLCBqc29uT2JqKV0sXG4gICAgc2tpcEFkZGluZ0RlcHNcbiAgKTtcbiAgZGVwZW5kZW5jeVVwZGF0ZXMuZGV2RGVwZW5kZW5jaWVzID0gZGVwZW5kZW5jeVVwZGF0ZXMuZGV2RGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwXSk7XG4gIGRlcGVuZGVuY3lVcGRhdGVzLmRldkRlcGVuZGVuY2llcyA9IGFkZFBhY2thZ2VKc29uRGVwZW5kZW5jaWVzKFxuICAgIGNvbmZpZyxcbiAgICByb290Q29uZmlnLFxuICAgIGpzb25PYmosXG4gICAgcGFja2FnZUpzb25EZXZEZXBlbmRlbmNpZXMsXG4gICAgWy4uLmRlcGVuZGVuY3lVcGRhdGVzLmRldkRlcGVuZGVuY2llcywgLi4uZ2V0RXhpc3RpbmdNYW5hZ2VkRGVwZW5kZW5jaWVzKHBhY2thZ2VKc29uRGV2RGVwZW5kZW5jaWVzLCBqc29uT2JqKV0sXG4gICAgc2tpcEFkZGluZ0RlcHNcbiAgKTtcbn1cblxuZnVuY3Rpb24gZ2V0RXhpc3RpbmdNYW5hZ2VkRGVwZW5kZW5jaWVzKFxuICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llczogUGFydGlhbDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PixcbiAganNvbk9iajogUGFja2FnZUpzb25cbik6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzKS5maWx0ZXIoXG4gICAgKGRlcGVuZGVuY3kpID0+XG4gICAgICBtYW5hZ2VkRGVwZW5kZW5jeU5hbWVzLmhhcyhkZXBlbmRlbmN5KSAmJlxuICAgICAgLy8gQSBwdWJsaWMgcGFja2FnZSdzIGB3b3Jrc3BhY2U6YCBzcGVjaWZpZXIgbXVzdCBuZXZlciBiZSByZS1tYW5hZ2VkIHZpYSBhIHJlZ2lzdHJ5IGluc3RhbGxcbiAgICAgIC8vIChwcml2YXRlIG9uZXMgYXJlIG5vcm1hbGl6ZWQgdG8gYHdvcmtzcGFjZToqYCBsYXRlcikuIFRoaXMgYWxzbyBjb3ZlcnMgcnVubmluZyB3YmZ5IG9uIGFcbiAgICAgIC8vIG1vbm9yZXBvIFNVQkRJUkVDVE9SWSwgd2hlcmUgdGhlIHBhcmVudCdzIHdvcmtzcGFjZXMgYXJlIGludmlzaWJsZSBhbmQgdGhlIHdvcmtzcGFjZS1tYXBcbiAgICAgIC8vIGd1YXJkIGluIGFkZFBhY2thZ2VKc29uRGVwZW5kZW5jaWVzIGNhbm5vdCBwcm90ZWN0IHRoZSBzcGVjaWZpZXIuXG4gICAgICAoanNvbk9iai5wcml2YXRlIHx8ICFwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XT8uc3RhcnRzV2l0aCgnd29ya3NwYWNlOicpKVxuICApO1xufVxuXG5mdW5jdGlvbiByZW1vdmVFbXB0eURlcGVuZGVuY3lTZWN0aW9ucyhqc29uT2JqOiBQYWNrYWdlSnNvbik6IHZvaWQge1xuICBmb3IgKGNvbnN0IGtleSBvZiBkZXBlbmRlbmN5U2VjdGlvbktleXMpIHtcbiAgICBjb25zdCBzZWN0aW9uID0ganNvbk9ialtrZXldO1xuICAgIGlmIChzZWN0aW9uICYmIE9iamVjdC5rZXlzKHNlY3Rpb24pLmxlbmd0aCA9PT0gMCkge1xuICAgICAgUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShqc29uT2JqLCBrZXkpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpbnN0YWxsRGVwZW5kZW5jeVVwZGF0ZXMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogUGFja2FnZUpzb24sXG4gIGRlcGVuZGVuY3lVcGRhdGVzOiBEZXBlbmRlbmN5VXBkYXRlc1xuKTogdm9pZCB7XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbikge1xuICAgIGNvbnN0IGRlcGVuZGVuY2llcyA9IGRlcGVuZGVuY3lVcGRhdGVzLmRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzPy5bZGVwXSk7XG4gICAgaW5zdGFsbE5wbURlcGVuZGVuY2llcyhjb25maWcsIHJvb3RDb25maWcsIGRlcGVuZGVuY2llcywgZmFsc2UpO1xuXG4gICAgY29uc3QgZGV2RGVwZW5kZW5jaWVzID0gZGVwZW5kZW5jeVVwZGF0ZXMuZGV2RGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhanNvbk9iai5kZXBlbmRlbmNpZXM/LltkZXBdKTtcbiAgICBpbnN0YWxsTnBtRGVwZW5kZW5jaWVzKGNvbmZpZywgcm9vdENvbmZpZywgZGV2RGVwZW5kZW5jaWVzLCB0cnVlKTtcbiAgfVxuXG4gIGNvbnN0IHB5dGhvblBhY2thZ2VNYW5hZ2VyID0gZ2V0UHl0aG9uUGFja2FnZU1hbmFnZXIoY29uZmlnKTtcbiAgaWYgKHB5dGhvblBhY2thZ2VNYW5hZ2VyICYmIGRlcGVuZGVuY3lVcGRhdGVzLnB5dGhvbkRldkRlcGVuZGVuY2llcy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgZGVwZW5kZW5jaWVzID0gWy4uLm5ldyBTZXQoZGVwZW5kZW5jeVVwZGF0ZXMucHl0aG9uRGV2RGVwZW5kZW5jaWVzKV07XG4gICAgaWYgKHB5dGhvblBhY2thZ2VNYW5hZ2VyID09PSAncG9ldHJ5Jykge1xuICAgICAgc3Bhd25TeW5jKCdwb2V0cnknLCBbJ2FkZCcsICctLWdyb3VwJywgJ2RldicsIC4uLmRlcGVuZGVuY2llc10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3Bhd25TeW5jKCd1dicsIFsnYWRkJywgJy0tZGV2JywgLi4uZGVwZW5kZW5jaWVzXSwgY29uZmlnLmRpclBhdGgpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRQeXRob25QYWNrYWdlTWFuYWdlcihjb25maWc6IFBhY2thZ2VDb25maWcpOiAncG9ldHJ5JyB8ICd1dicgfCB1bmRlZmluZWQge1xuICBpZiAoY29uZmlnLmRvZXNDb250YWluVXZMb2NrKSByZXR1cm4gJ3V2JztcbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2spIHJldHVybiAncG9ldHJ5Jztcbn1cblxuZnVuY3Rpb24gZ2V0UHl0aG9uU2V0dXBDb21tYW5kKHBhY2thZ2VNYW5hZ2VyOiAncG9ldHJ5JyB8ICd1dicpOiBzdHJpbmcge1xuICBpZiAocGFja2FnZU1hbmFnZXIgPT09ICd1dicpIHJldHVybiAndXYgc3luYyAtLWZyb3plbic7XG4gIC8vIGBtaXNlIHdoaWNoIHB5dGhvbmAgeWllbGRzIHRoZSBzaW5nbGUgYWN0aXZlIGludGVycHJldGVyIHBhdGg7IGBtaXNlIGN1cnJlbnQgcHl0aG9uYCBjYW5cbiAgLy8gcHJpbnQgbXVsdGlwbGUgc3BhY2Utc2VwYXJhdGVkIHZlcnNpb25zIChtaXNlIHN1cHBvcnRzIG11bHRpLXZlcnNpb24gcGlucyksIHdoaWNoIHdvdWxkIHBhc3NcbiAgLy8gZXh0cmEgcG9zaXRpb25hbCBhcmd1bWVudHMgdG8gYHBvZXRyeSBlbnYgdXNlYC4gV2hlbiBtaXNlIGlzIG1pc3Npbmcgb3IgcHl0aG9uIGlzXG4gIC8vIHVuY29uZmlndXJlZCwgc2tpcCBgcG9ldHJ5IGVudiB1c2VgIGFuZCBmYWxsIGJhY2sgdG8gcG9ldHJ5J3MgZGVmYXVsdCBpbnRlcnByZXRlciBpbnN0ZWFkIG9mXG4gIC8vIGFib3J0aW5nIHRoZSBjaGFpbi5cbiAgLy8gVGhlIGB8fCB0cnVlYCBjb3ZlcnMgb25seSB0aGUgbWlzZSByZXNvbHV0aW9uOiBhIG1pc3NpbmcvdW5jb25maWd1cmVkIG1pc2UgZmFsbHMgYmFjayB0b1xuICAvLyBwb2V0cnkncyBkZWZhdWx0IGludGVycHJldGVyLCB3aGlsZSBhIGZhaWxpbmcgYHBvZXRyeSBlbnYgdXNlYCBzdGlsbCBhYm9ydHMgdGhlIGNoYWluLlxuICByZXR1cm4gJ3BvZXRyeSBjb25maWcgdmlydHVhbGVudnMuaW4tcHJvamVjdCB0cnVlICYmIHsgcHl0aG9uX3BhdGg9XCIkKG1pc2Ugd2hpY2ggcHl0aG9uIDI+L2Rldi9udWxsKVwiIHx8IHRydWU7IH0gJiYgeyBbIC16IFwiJHB5dGhvbl9wYXRoXCIgXSB8fCBwb2V0cnkgZW52IHVzZSBcIiRweXRob25fcGF0aFwiOyB9ICYmIHBvZXRyeSBydW4gcGlwIGluc3RhbGwgLS11cGdyYWRlIHBpcCAmJiBwb2V0cnkgaW5zdGFsbCc7XG59XG5cbmZ1bmN0aW9uIGluc3RhbGxOcG1EZXBlbmRlbmNpZXMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgZGVwZW5kZW5jaWVzOiBzdHJpbmdbXSxcbiAgZGV2OiBib29sZWFuXG4pOiB2b2lkIHtcbiAgaWYgKGRlcGVuZGVuY2llcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICBjb25zdCBkZXBlbmRlbmN5U3BlY2lmaWVycyA9IFtcbiAgICAuLi5uZXcgU2V0KGRlcGVuZGVuY2llcy5tYXAoKGRlcGVuZGVuY3kpID0+IGdldEluc3RhbGxEZXBlbmRlbmN5U3BlY2lmaWVyKGNvbmZpZywgcm9vdENvbmZpZywgZGVwZW5kZW5jeSkpKSxcbiAgXTtcbiAgc3Bhd25TeW5jKCdidW4nLCBbJ2FkZCcsIC4uLihkZXYgPyBbJy1EJ10gOiBbXSksICctLWV4YWN0JywgLi4uZGVwZW5kZW5jeVNwZWNpZmllcnNdLCBjb25maWcuZGlyUGF0aCk7XG59XG5cbmZ1bmN0aW9uIGFkZFBhY2thZ2VKc29uRGVwZW5kZW5jaWVzKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24sXG4gIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzOiBQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+LFxuICBkZXBlbmRlbmNpZXM6IHN0cmluZ1tdLFxuICBza2lwQWRkaW5nRGVwczogYm9vbGVhblxuKTogc3RyaW5nW10ge1xuICBjb25zdCBkZXBlbmRlbmNpZXNUb0luc3RhbGw6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiBuZXcgU2V0KGRlcGVuZGVuY2llcykpIHtcbiAgICAvLyBBIHByaXZhdGUgcGFja2FnZSB3aG9zZSBtb25vcmVwbyBjb250YWlucyB0aGlzIGRlcGVuZGVuY3kgYXMgYSB3b3Jrc3BhY2UgbXVzdCByZWZlcmVuY2UgaXRcbiAgICAvLyB2aWEgdGhlIHdvcmtzcGFjZSBwcm90b2NvbDogcGlubmluZyBhIHJlZ2lzdHJ5IHZlcnNpb24gbWFrZXMgQnVuIHNoYWRvdyB0aGUgc2FtZS1uYW1lXG4gICAgLy8gd29ya3NwYWNlIGFuZCBza2lwIGluc3RhbGxpbmcgdGhlIHdvcmtzcGFjZSdzIG93biBkZXBlbmRlbmNpZXMuIChQdWJsaXNoZWQgcGFja2FnZXMgaW5zdGVhZFxuICAgIC8vIHBpbiBhIGNvbmNyZXRlIHZlcnNpb24gYmVjYXVzZSBgbnBtIHB1Ymxpc2hgIHJlamVjdHMgYHdvcmtzcGFjZToqYCBzcGVjaWZpZXJzIOKAlCBidXQgYW5cbiAgICAvLyBFWElTVElORyBgd29ya3NwYWNlOmAgZGVjbGFyYXRpb24gaXMgYWx3YXlzIGtlcHQ6IG92ZXJ3cml0aW5nIGl0IHdpdGggYSByZWdpc3RyeSByZWxlYXNlXG4gICAgLy8gd291bGQgc2lsZW50bHkgYnJlYWsgdGhlIGxvY2FsIHdvcmtzcGFjZSBsaW5rLilcblxuICAgIC8vIEEgZGVjbGFyZWQgYHdvcmtzcGFjZTpgIHNwZWNpZmllciBhbHdheXMgd2lucywgd2hldGhlciBvciBub3QgdGhlIHdvcmtzcGFjZSBtYXAgc2VlcyB0aGVcbiAgICAvLyBwYWNrYWdlOiBydW5uaW5nIHdiZnkgb24gYSBtb25vcmVwbyBTVUJESVJFQ1RPUlkgaGlkZXMgdGhlIHBhcmVudCdzIHdvcmtzcGFjZXMsIHNvIHRoZSBtYXBcbiAgICAvLyBhbG9uZSBjYW5ub3QgYmUgdHJ1c3RlZCB0byBkZXRlY3QgYSBsb2NhbCB3b3Jrc3BhY2UgbGluay5cbiAgICBpZiAocGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0/LnN0YXJ0c1dpdGgoJ3dvcmtzcGFjZTonKSkge1xuICAgICAgaWYgKGpzb25PYmoucHJpdmF0ZSkge1xuICAgICAgICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSA9ICd3b3Jrc3BhY2U6Kic7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGpzb25PYmoucHJpdmF0ZSAmJiBnZXRXb3Jrc3BhY2VQYWNrYWdlRGlycyhyb290Q29uZmlnKS5oYXMoZGVwZW5kZW5jeSkpIHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nU3BlY2lmaWVyID0gcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV07XG4gICAgICBpZiAoIWV4aXN0aW5nU3BlY2lmaWVyIHx8IGV4aXN0aW5nU3BlY2lmaWVyLnN0YXJ0c1dpdGgoJ3dvcmtzcGFjZTonKSkge1xuICAgICAgICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSA9ICd3b3Jrc3BhY2U6Kic7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgLy8gQW4gZXhpc3RpbmcgQ09OQ1JFVEUgcGluIG9uIGEgd29ya3NwYWNlIHBhY2thZ2UgaXMgYSBkZWxpYmVyYXRlIGNob2ljZSBhbmQgbXVzdCBub3QgYmVcbiAgICAgIC8vIGNvbnZlcnRlZCB0byB0aGUgd29ya3NwYWNlIHByb3RvY29sLiBOb3RlIHRoZSB0cmFkZS1vZmYgZWl0aGVyIHdheTogbnBtICh3aGljaFxuICAgICAgLy8gc2VtYW50aWMtcmVsZWFzZSdzIG5wbSBwbHVnaW4gc2hlbGxzIG91dCB0bykgY2Fubm90IHBhcnNlIGB3b3Jrc3BhY2U6YCBzcGVjaWZpZXJzLCB3aGlsZVxuICAgICAgLy8gYSByZWdpc3RyeSBwaW4gbWFrZXMgYSBjb2xkIGJ1biBpbnN0YWxsIHNoYWRvdyB0aGUgd29ya3NwYWNlIGFuZCBza2lwIGl0cyBkZXBlbmRlbmNpZXMg4oCUXG4gICAgICAvLyBXaWxsQm9vc3Rlci9zaGFyZWQga2VlcHMgYHdvcmtzcGFjZToqYCBhbmQgc3RyaXBzIHRoZSBwcm90b2NvbCBvbiB0aGUgQ0kgY2hlY2tvdXQgcmlnaHRcbiAgICAgIC8vIGJlZm9yZSByZWxlYXNpbmcgKHNjcmlwdHMvc3RyaXBXb3Jrc3BhY2VQcm90b2NvbC5tanMpLiBGYWxsIHRocm91Z2ggc28gYSBjb25jcmV0ZSBwaW5cbiAgICAgIC8vIGtlZXBzIGJlaW5nIGJ1bXBlZCBsaWtlIGFueSBtYW5hZ2VkIGRlcGVuZGVuY3kuXG4gICAgfVxuICAgIGNvbnN0IHNob3VsZFVwZGF0ZUV4aXN0aW5nRGVwZW5kZW5jeSA9IHNob3VsZFVwZGF0ZUV4aXN0aW5nTWFuYWdlZERlcGVuZGVuY3koXG4gICAgICBjb25maWcsXG4gICAgICByb290Q29uZmlnLFxuICAgICAgZGVwZW5kZW5jeSxcbiAgICAgIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldXG4gICAgKTtcbiAgICBpZiAoc2hvdWxkVXBkYXRlRXhpc3RpbmdEZXBlbmRlbmN5KSB7XG4gICAgICBjb25zdCBtYW5hZ2VkVmVyc2lvbiA9IGdldE1hbmFnZWREZXBlbmRlbmN5VmVyc2lvbihjb25maWcsIHJvb3RDb25maWcsIGRlcGVuZGVuY3kpO1xuICAgICAgaWYgKHNob3VsZERvd25ncmFkZUFnZUdhdGVkTWFuYWdlZERlcGVuZGVuY3koZGVwZW5kZW5jeSwgcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0sIG1hbmFnZWRWZXJzaW9uKSkge1xuICAgICAgICAvLyBgYnVuIGFkZCBkZXBlbmRlbmN5YCBwcmVzZXJ2ZXMgYW4gZXhpc3RpbmcgZXhhY3QgcGluLCBzbyB3cml0ZSB0aGUgYWdlLWNsZWFyZWQgdmVyc2lvblxuICAgICAgICAvLyBkaXJlY3RseS4gVGhlIGZpbmFsIHJlcG9zaXRvcnktd2lkZSBpbnN0YWxsIHJlZnJlc2hlcyB0aGUgbG9ja2ZpbGUgYWZ0ZXIgZXZlcnkgcGFja2FnZVxuICAgICAgICAvLyBtYW5pZmVzdCBoYXMgY29udmVyZ2VkIG9uIHRoZSBnZW5lcmF0ZWQgcmVsZWFzZS1hZ2UgcG9saWN5LlxuICAgICAgICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSA9IG1hbmFnZWRWZXJzaW9uO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGRlcGVuZGVuY2llc1RvSW5zdGFsbC5wdXNoKGRlcGVuZGVuY3kpO1xuICAgICAgaWYgKCFza2lwQWRkaW5nRGVwcykgY29udGludWU7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldICYmXG4gICAgICAhc2hvdWxkVXBkYXRlRXhpc3RpbmdEZXBlbmRlbmN5ICYmXG4gICAgICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSAhPT0gJyonXG4gICAgKVxuICAgICAgY29udGludWU7XG4gICAgY29uc3QgbGF0ZXN0VmVyc2lvbiA9IGdldE1hbmFnZWREZXBlbmRlbmN5VmVyc2lvbihjb25maWcsIHJvb3RDb25maWcsIGRlcGVuZGVuY3kpO1xuICAgIGlmIChsYXRlc3RWZXJzaW9uID09PSAnKicgJiYgcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0pIGNvbnRpbnVlO1xuICAgIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldID0gbGF0ZXN0VmVyc2lvbjtcbiAgfVxuICByZXR1cm4gZGVwZW5kZW5jaWVzVG9JbnN0YWxsO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRQYWNrYWdlSnNvbldpdGhQcm9qZWN0Rm9ybWF0dGVyKGNvbmZpZzogUGFja2FnZUNvbmZpZywgZmlsZVBhdGg6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCByZWxhdGl2ZUZpbGVQYXRoID0gcGF0aC5yZWxhdGl2ZShjb25maWcuZGlyUGF0aCwgZmlsZVBhdGgpO1xuICBpZiAoIXJlbGF0aXZlRmlsZVBhdGgpIHJldHVybjtcblxuICAvLyBSZXVzZSB0aGUgdGFyZ2V0IHJlcG9zaXRvcnkncyBvd24gZm9ybWF0dGVyIGFmdGVyIGRlcGVuZGVuY3kgaW5zdGFsbGF0aW9uIHNvXG4gIC8vIHBhY2thZ2UuanNvbiBtYXRjaGVzIHdoYXRldmVyIGl0cyBjdXJyZW50IHNvcnQtcGFja2FnZS1qc29uIHZlcnNpb24gZXhwZWN0cy5cbiAgLy8gVGhpcyBhdm9pZHMgZm9sbG93LXVwIGF1dG9maXggY29tbWl0cyBjYXVzZWQgb25seSBieSBmb3JtYXR0ZXIgdmVyc2lvbiBkcmlmdFxuICAvLyBiZXR3ZWVuIHdiZnkgYW5kIHRoZSBwcm9qZWN0IGJlaW5nIHVwZGF0ZWQuXG4gIHNwYXduU3luYygnYnVueCcsIFsnc29ydC1wYWNrYWdlLWpzb24nLCByZWxhdGl2ZUZpbGVQYXRoXSwgY29uZmlnLmRpclBhdGgpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZW1vdmVVbnVzZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbixcbiAgdXNlZERlcGVuZGVuY2llczogc3RyaW5nW11cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB1c2VkRGVwZW5kZW5jeVNldCA9IG5ldyBTZXQodXNlZERlcGVuZGVuY2llcyk7XG4gIGNvbnN0IGV4aXN0aW5nVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzID0gYXdhaXQgZ2V0RXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMoY29uZmlnKTtcbiAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIG1hbmFnZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMpIHtcbiAgICBpZiAodXNlZERlcGVuZGVuY3lTZXQuaGFzKGRlcGVuZGVuY3kpIHx8IGV4aXN0aW5nVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzLmhhcyhkZXBlbmRlbmN5KSkgY29udGludWU7XG4gICAgLy8gd2JmeSBvd25zIHRoZXNlIGJhc2UtY29uZmlnIHBhY2thZ2VzLiBSZW1vdmUgc3RhbGUgdmFyaWFudHMgd2hlbiByZXBvXG4gICAgLy8gY2FwYWJpbGl0aWVzIGNoYW5nZSwgc3VjaCBhcyBOZXh0LmpzIHRha2luZyBvd25lcnNoaXAgb2YgdHNjb25maWcuanNvbi5cbiAgICBmb3IgKGNvbnN0IHNlY3Rpb24gb2YgZ2V0RGVwZW5kZW5jeVNlY3Rpb25zKGpzb25PYmopKSB7XG4gICAgICBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KHNlY3Rpb24sIGRlcGVuZGVuY3kpO1xuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRFeGlzdGluZ1RzY29uZmlnQmFzZURlcGVuZGVuY2llcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPFNldDxzdHJpbmc+PiB7XG4gIGNvbnN0IGV4aXN0aW5nVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IGZpbGVQYXRocyA9IGF3YWl0IGZnLmdsb2IoJyoqL3RzY29uZmlnKi5qc29uJywge1xuICAgIGN3ZDogY29uZmlnLmRpclBhdGgsXG4gICAgZG90OiB0cnVlLFxuICAgIGlnbm9yZTogZ2xvYklnbm9yZSxcbiAgfSk7XG5cbiAgZm9yIChjb25zdCBmaWxlUGF0aCBvZiBmaWxlUGF0aHMpIHtcbiAgICBjb25zdCBhYnNvbHV0ZUZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBmaWxlUGF0aCk7XG4gICAgLy8gVHlwZVNjcmlwdCA3J3MgbmF0aXZlIGNvbXBpbGVyIGRyb3BwZWQgdGhlIGluLXByb2Nlc3MgYHBhcnNlQ29uZmlnRmlsZVRleHRUb0pzb25gXG4gICAgLy8gaGVscGVyLCBzbyBwYXJzZSB0aGUgdHNjb25maWcgaW50byBhbiBBU1QgYW5kIHJlYWQgaXRzIHRvcC1sZXZlbCBgZXh0ZW5kc2AgZGlyZWN0bHkuXG4gICAgY29uc3Qgc291cmNlID0gYXdhaXQgcGFyc2VTb3VyY2VGaWxlKGFic29sdXRlRmlsZVBhdGgpO1xuICAgIGlmICghc291cmNlKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFByZXNlcnZlIG1hbmFnZWQgQHRzY29uZmlnIGRlcGVuZGVuY2llcyBiZWNhdXNlICR7YWJzb2x1dGVGaWxlUGF0aH0gY291bGQgbm90IGJlIHBhcnNlZC5gKTtcbiAgICAgIHJldHVybiBuZXcgU2V0KG1hbmFnZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHJlYWRUc2NvbmZpZ0V4dGVuZHMoc291cmNlKSkge1xuICAgICAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIG1hbmFnZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSBkZXBlbmRlbmN5IHx8IHZhbHVlLnN0YXJ0c1dpdGgoYCR7ZGVwZW5kZW5jeX0vYCkpIHtcbiAgICAgICAgICBleGlzdGluZ1RzY29uZmlnQmFzZURlcGVuZGVuY2llcy5hZGQoZGVwZW5kZW5jeSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gZXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXM7XG59XG5cbi8qKiBSZWFkcyB0aGUgdG9wLWxldmVsIGBleHRlbmRzYCBlbnRyaWVzIChhIHN0cmluZyBvciBhcnJheSBvZiBzdHJpbmdzKSBmcm9tIGEgcGFyc2VkIHRzY29uZmlnLiAqL1xuZnVuY3Rpb24gcmVhZFRzY29uZmlnRXh0ZW5kcyhzb3VyY2U6IGFzdC5Tb3VyY2VGaWxlKTogc3RyaW5nW10ge1xuICBjb25zdCB2YWx1ZXM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgcHJvcGVydHkgb2YgZ2V0VHNjb25maWdSb290UHJvcGVydGllcyhzb3VyY2UpKSB7XG4gICAgaWYgKGFzdC5pc1Byb3BlcnR5QXNzaWdubWVudChwcm9wZXJ0eSkgJiYgYXN0LmlzU3RyaW5nTGl0ZXJhbChwcm9wZXJ0eS5uYW1lKSAmJiBwcm9wZXJ0eS5uYW1lLnRleHQgPT09ICdleHRlbmRzJykge1xuICAgICAgY29sbGVjdFN0cmluZ0xpdGVyYWxWYWx1ZXMocHJvcGVydHkuaW5pdGlhbGl6ZXIsIHZhbHVlcyk7XG4gICAgfVxuICB9XG4gIHJldHVybiB2YWx1ZXM7XG59XG5cbmZ1bmN0aW9uIGdldFRzY29uZmlnUm9vdFByb3BlcnRpZXMoc291cmNlOiBhc3QuU291cmNlRmlsZSk6IHJlYWRvbmx5IGFzdC5PYmplY3RMaXRlcmFsRWxlbWVudExpa2VbXSB7XG4gIGZvciAoY29uc3Qgc3RhdGVtZW50IG9mIHNvdXJjZS5zdGF0ZW1lbnRzKSB7XG4gICAgaWYgKGFzdC5pc0V4cHJlc3Npb25TdGF0ZW1lbnQoc3RhdGVtZW50KSAmJiBhc3QuaXNPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihzdGF0ZW1lbnQuZXhwcmVzc2lvbikpIHtcbiAgICAgIHJldHVybiBzdGF0ZW1lbnQuZXhwcmVzc2lvbi5wcm9wZXJ0aWVzO1xuICAgIH1cbiAgfVxuICByZXR1cm4gW107XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RTdHJpbmdMaXRlcmFsVmFsdWVzKG5vZGU6IGFzdC5FeHByZXNzaW9uLCB2YWx1ZXM6IHN0cmluZ1tdKTogdm9pZCB7XG4gIGlmIChhc3QuaXNTdHJpbmdMaXRlcmFsKG5vZGUpKSB7XG4gICAgdmFsdWVzLnB1c2gobm9kZS50ZXh0KTtcbiAgfSBlbHNlIGlmIChhc3QuaXNBcnJheUxpdGVyYWxFeHByZXNzaW9uKG5vZGUpKSB7XG4gICAgZm9yIChjb25zdCBlbGVtZW50IG9mIG5vZGUuZWxlbWVudHMpIHtcbiAgICAgIGNvbGxlY3RTdHJpbmdMaXRlcmFsVmFsdWVzKGVsZW1lbnQsIHZhbHVlcyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldERlcGVuZGVuY3lTZWN0aW9ucyhqc29uT2JqOiBQYWNrYWdlSnNvbik6IFBhcnRpYWw8UmVjb3JkPHN0cmluZywgc3RyaW5nPj5bXSB7XG4gIHJldHVybiBkZXBlbmRlbmN5U2VjdGlvbktleXNcbiAgICAubWFwKChrZXkpID0+IGpzb25PYmpba2V5XSlcbiAgICAuZmlsdGVyKChzZWN0aW9uKTogc2VjdGlvbiBpcyBQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+ID0+ICEhc2VjdGlvbik7XG59XG5cbmZ1bmN0aW9uIGdldExhdGVzdERlcGVuZGVuY3lWZXJzaW9uKGRlcGVuZGVuY3k6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGNhY2hlZFZlcnNpb24gPSBsYXRlc3REZXBlbmRlbmN5VmVyc2lvbkNhY2hlLmdldChkZXBlbmRlbmN5KTtcbiAgaWYgKGNhY2hlZFZlcnNpb24pIHJldHVybiBjYWNoZWRWZXJzaW9uO1xuXG4gIGNvbnN0IHZlcnNpb24gPSBnZXREZXBlbmRlbmN5VmVyc2lvbkZyb21OcG0oZGVwZW5kZW5jeSk7XG4gIGxhdGVzdERlcGVuZGVuY3lWZXJzaW9uQ2FjaGUuc2V0KGRlcGVuZGVuY3ksIHZlcnNpb24pO1xuICByZXR1cm4gdmVyc2lvbjtcbn1cblxuZnVuY3Rpb24gZ2V0RGVwZW5kZW5jeVZlcnNpb25Gcm9tTnBtKGRlcGVuZGVuY3k6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICghc2hvdWxkQXBwbHlQYWNrYWdlQWdlR2F0ZShkZXBlbmRlbmN5KSkge1xuICAgIHJldHVybiBnZXRSYXdEZXBlbmRlbmN5VmVyc2lvbkZyb21OcG0oZGVwZW5kZW5jeSk7XG4gIH1cblxuICByZXR1cm4gZ2V0TGF0ZXN0QWdlR2F0ZWREZXBlbmRlbmN5VmVyc2lvbihkZXBlbmRlbmN5KTtcbn1cblxuZnVuY3Rpb24gZ2V0TGF0ZXN0QWdlR2F0ZWREZXBlbmRlbmN5VmVyc2lvbihkZXBlbmRlbmN5OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCB0aW1lcyA9IGdldE5wbVBhY2thZ2VUaW1lcyhkZXBlbmRlbmN5KTtcbiAgY29uc3QgbGF0ZXN0VmVyc2lvbiA9IGdldFJhd0RlcGVuZGVuY3lWZXJzaW9uRnJvbU5wbShkZXBlbmRlbmN5KTtcbiAgaWYgKGxhdGVzdFZlcnNpb24gIT09ICcqJyAmJiBpc1B1Ymxpc2hlZEJlZm9yZUFnZUdhdGUodGltZXNbbGF0ZXN0VmVyc2lvbl0pKSB7XG4gICAgcmV0dXJuIGxhdGVzdFZlcnNpb247XG4gIH1cblxuICByZXR1cm4gZ2V0QWdlR2F0ZWRWZXJzaW9uc0Rlc2NlbmRpbmcodGltZXMpWzBdID8/ICcqJztcbn1cblxuLyoqIEV2ZXJ5IHN0YWJsZSByZWxlYXNlIGluIGB0aW1lc2AgdGhhdCBhbHJlYWR5IGNsZWFyZWQgdGhlIGFnZSBnYXRlLCBuZXdlc3QgZmlyc3QuICovXG5mdW5jdGlvbiBnZXRBZ2VHYXRlZFZlcnNpb25zRGVzY2VuZGluZyh0aW1lczogUmVjb3JkPHN0cmluZywgc3RyaW5nPik6IHN0cmluZ1tdIHtcbiAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHRpbWVzKVxuICAgIC5maWx0ZXIoKFt2ZXJzaW9uXSkgPT4gc2VtdmVyLnZhbGlkKHZlcnNpb24pKVxuICAgIC5maWx0ZXIoKFt2ZXJzaW9uXSkgPT4gKHNlbXZlci5wcmVyZWxlYXNlKHZlcnNpb24pPy5sZW5ndGggPz8gMCkgPT09IDApXG4gICAgLmZpbHRlcigoWywgcHVibGlzaGVkQXRdKSA9PiBOdW1iZXIuaXNGaW5pdGUoRGF0ZS5wYXJzZShwdWJsaXNoZWRBdCkpKVxuICAgIC5maWx0ZXIoKFssIHB1Ymxpc2hlZEF0XSkgPT4gbm93IC0gRGF0ZS5wYXJzZShwdWJsaXNoZWRBdCkgPj0gcGFja2FnZUFnZUdhdGVNcylcbiAgICAudG9Tb3J0ZWQoKFt2ZXJzaW9uQV0sIFt2ZXJzaW9uQl0pID0+IHNlbXZlci5yY29tcGFyZSh2ZXJzaW9uQSwgdmVyc2lvbkIpKVxuICAgIC5tYXAoKFt2ZXJzaW9uXSkgPT4gdmVyc2lvbik7XG59XG5cbmZ1bmN0aW9uIGlzUHVibGlzaGVkQmVmb3JlQWdlR2F0ZShwdWJsaXNoZWRBdDogc3RyaW5nIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIGlmICghcHVibGlzaGVkQXQpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgcHVibGlzaGVkVGltZSA9IERhdGUucGFyc2UocHVibGlzaGVkQXQpO1xuICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKHB1Ymxpc2hlZFRpbWUpICYmIERhdGUubm93KCkgLSBwdWJsaXNoZWRUaW1lID49IHBhY2thZ2VBZ2VHYXRlTXM7XG59XG5cbmZ1bmN0aW9uIGdldE5wbVBhY2thZ2VUaW1lcyhkZXBlbmRlbmN5OiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgcGFja2FnZU5hbWUgPSBkZXBlbmRlbmN5LnJlcGxhY2UoL0BbXkAvXSskL3UsICcnKTtcbiAgY29uc3QgY2FjaGVkVGltZXMgPSBucG1QYWNrYWdlVGltZXNDYWNoZS5nZXQocGFja2FnZU5hbWUpO1xuICBpZiAoY2FjaGVkVGltZXMpIHJldHVybiBjYWNoZWRUaW1lcztcblxuICBjb25zdCBzdGRvdXQgPSBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoXG4gICAgJ25wbScsXG4gICAgWydzaG93JywgcGFja2FnZU5hbWUsICd0aW1lJywgJy0tanNvbicsICctLXdvcmtzcGFjZXM9ZmFsc2UnXSxcbiAgICBwcm9jZXNzLmN3ZCgpXG4gICk7XG4gIGlmICghc3Rkb3V0KSByZXR1cm4ge307XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHN0ZG91dCkgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IFtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XTtcbiAgICBjb25zdCB0aW1lcyA9IEFycmF5LmlzQXJyYXkocGFyc2VkKSA/IHBhcnNlZFswXSA6IHBhcnNlZDtcbiAgICBpZiAoIXRpbWVzKSByZXR1cm4ge307XG4gICAgbnBtUGFja2FnZVRpbWVzQ2FjaGUuc2V0KHBhY2thZ2VOYW1lLCB0aW1lcyk7XG4gICAgcmV0dXJuIHRpbWVzO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4ge307XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvdWxkQXBwbHlQYWNrYWdlQWdlR2F0ZShkZXBlbmRlbmN5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgLy8gS2VlcCBtYW5hZ2VkIGZpcnN0LXBhcnR5IHBhY2thZ2VzIGFsaWduZWQgd2l0aCBCdW4ncyBleHBsaWNpdCBleGVtcHRpb25zLiB3YmZ5J3MgZ2VuZXJhdGVkXG4gIC8vIGNvbmZpZ3VyYXRpb24gY2FuIHJlbHkgb24gdGhlIGN1cnJlbnQgd2IgY29udHJhY3QsIHNvIGluZGVwZW5kZW50bHkgc29ha2luZyBvciBkb3duZ3JhZGluZyB3YlxuICAvLyB3b3VsZCBwYWlyIG5ldyBnZW5lcmF0ZWQgZmlsZXMgd2l0aCBhbiBpbmNvbXBhdGlibGUgb2xkIENMSS4gVGhvc2UgcGFja2FnZXMgYXJlIHJlbGVhc2VkIGFuZFxuICAvLyBmaXhlZCBhdCB0aGVpciBzb3VyY2UgaW5zdGVhZDsgb25seSBwYWNrYWdlcyBCdW4gaXRzZWxmIGdhdGVzIG1heSBiZSBzZWxlY3RlZCBmcm9tIG9sZGVyIHRhZ3MuXG4gIHJldHVybiAhYnVuTWluaW11bVJlbGVhc2VBZ2VFeGNsdWRlcy5zb21lKChwYXR0ZXJuKSA9PiBkb2VzUGFja2FnZVBhdHRlcm5NYXRjaChwYXR0ZXJuLCBkZXBlbmRlbmN5KSk7XG59XG5cbmZ1bmN0aW9uIGRvZXNQYWNrYWdlUGF0dGVybk1hdGNoKHBhdHRlcm46IHN0cmluZywgZGVwZW5kZW5jeTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmIChwYXR0ZXJuID09PSBkZXBlbmRlbmN5KSByZXR1cm4gdHJ1ZTtcbiAgaWYgKCFwYXR0ZXJuLmluY2x1ZGVzKCcqJykpIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBlc2NhcGVkUGF0dGVybiA9IHBhdHRlcm4ucmVwbGFjZUFsbCgvWy4rP14ke30oKXxbXFxdXFxcXF0vZ3UsIFN0cmluZy5yYXdgXFwkJmApLnJlcGxhY2VBbGwoJyonLCAnLionKTtcbiAgcmV0dXJuIG5ldyBSZWdFeHAoYF4ke2VzY2FwZWRQYXR0ZXJufSRgLCAndScpLnRlc3QoZGVwZW5kZW5jeSk7XG59XG5cbmZ1bmN0aW9uIGdldFJhd0RlcGVuZGVuY3lWZXJzaW9uRnJvbU5wbShkZXBlbmRlbmN5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBObyBjYWNoZSBoZXJlOiB0aGUgb25seSBjYWxsZXIgY2hhaW4gZ29lcyB0aHJvdWdoIGdldExhdGVzdERlcGVuZGVuY3lWZXJzaW9uLCB3aGljaCBhbHJlYWR5XG4gIC8vIG1lbW9pemVzIHBlciBkZXBlbmRlbmN5LCBzbyB0aGlzIGNhbiBydW4gYXQgbW9zdCBvbmNlIHBlciBkZXBlbmRlbmN5LlxuICByZXR1cm4gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KCducG0nLCBbJ3Nob3cnLCBkZXBlbmRlbmN5LCAndmVyc2lvbicsICctLXdvcmtzcGFjZXM9ZmFsc2UnXSwgcHJvY2Vzcy5jd2QoKSkgfHwgJyonO1xufVxuXG5mdW5jdGlvbiBnZXRJbnN0YWxsRGVwZW5kZW5jeVNwZWNpZmllcihjb25maWc6IFBhY2thZ2VDb25maWcsIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsIGRlcGVuZGVuY3k6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIFR5cGVTY3JpcHQgaXMgdmVyc2lvbi1jYXBwZWQgaW4gQmxpdHogcmVwb3NpdG9yaWVzLCBzbyBpdHMgaW5zdGFsbCBzcGVjaWZpZXIgbXVzdCBjYXJyeSB0aGVcbiAgLy8gbWFuYWdlZCB2ZXJzaW9uIOKAlCBhIGJhcmUgYGJ1biBhZGRgIHdvdWxkIGluc3RhbGwgdGhlIGluY29tcGF0aWJsZSBsYXRlc3QuXG4gIGlmIChkZXBlbmRlbmN5ID09PSB0eXBlc2NyaXB0RGVwZW5kZW5jeSAmJiBpc0JsaXR6UmVwb3NpdG9yeShjb25maWcsIHJvb3RDb25maWcpKSB7XG4gICAgcmV0dXJuIGAke2RlcGVuZGVuY3l9QCR7Z2V0TWFuYWdlZERlcGVuZGVuY3lWZXJzaW9uKGNvbmZpZywgcm9vdENvbmZpZywgZGVwZW5kZW5jeSl9YDtcbiAgfVxuICByZXR1cm4gZGVwZW5kZW5jeTtcbn1cblxuLyoqIFdoZXRoZXIgdGhlIHJlcG9zaXRvcnkgY29udGFpbnMgYSBCbGl0eiBhcHAgKHRoZSBjdXJyZW50IHBhY2thZ2Ugb3IgdGhlIHdvcmtzcGFjZSByb290KS4gKi9cbmZ1bmN0aW9uIGlzQmxpdHpSZXBvc2l0b3J5KGNvbmZpZzogUGFja2FnZUNvbmZpZywgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gY29uZmlnLmRlcGVuZGluZy5ibGl0eiB8fCByb290Q29uZmlnLmRlcGVuZGluZy5ibGl0ejtcbn1cblxuY29uc3Qgd29ya3NwYWNlUGFja2FnZURpcnNDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBzdHJpbmc+PigpO1xuXG4vKiogTWFwIGZyb20gZWFjaCB3b3Jrc3BhY2UgcGFja2FnZSdzIG5hbWUgdG8gaXRzIGRpcmVjdG9yeSAocmVsYXRpdmUgdG8gdGhlIG1vbm9yZXBvIHJvb3QpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFdvcmtzcGFjZVBhY2thZ2VEaXJzKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBNYXA8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgY2FjaGVkID0gd29ya3NwYWNlUGFja2FnZURpcnNDYWNoZS5nZXQocm9vdENvbmZpZy5kaXJQYXRoKTtcbiAgaWYgKGNhY2hlZCkgcmV0dXJuIGNhY2hlZDtcblxuICBjb25zdCB3b3Jrc3BhY2VEaXJzQnlOYW1lID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBwYWNrYWdlSnNvblBhdGggb2YgZ2V0V29ya3NwYWNlUGFja2FnZUpzb25QYXRocyhyb290Q29uZmlnKSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB3b3Jrc3BhY2VQYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoXG4gICAgICAgIGZzLnJlYWRGaWxlU3luYyhwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCBwYWNrYWdlSnNvblBhdGgpLCAndXRmOCcpXG4gICAgICApIGFzIFBhY2thZ2VKc29uO1xuICAgICAgaWYgKHdvcmtzcGFjZVBhY2thZ2VKc29uLm5hbWUpIHtcbiAgICAgICAgd29ya3NwYWNlRGlyc0J5TmFtZS5zZXQod29ya3NwYWNlUGFja2FnZUpzb24ubmFtZSwgcGF0aC5wb3NpeC5kaXJuYW1lKHBhY2thZ2VKc29uUGF0aCkpO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gaWdub3JlIHVucGFyc2FibGUgd29ya3NwYWNlIHBhY2thZ2UuanNvblxuICAgIH1cbiAgfVxuICB3b3Jrc3BhY2VQYWNrYWdlRGlyc0NhY2hlLnNldChyb290Q29uZmlnLmRpclBhdGgsIHdvcmtzcGFjZURpcnNCeU5hbWUpO1xuICByZXR1cm4gd29ya3NwYWNlRGlyc0J5TmFtZTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkVXBkYXRlRXhpc3RpbmdNYW5hZ2VkRGVwZW5kZW5jeShcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBkZXBlbmRlbmN5OiBzdHJpbmcsXG4gIGN1cnJlbnRWZXJzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWRcbik6IGJvb2xlYW4ge1xuICBpZiAoIWN1cnJlbnRWZXJzaW9uKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKGN1cnJlbnRWZXJzaW9uID09PSAnKicpIHJldHVybiB0cnVlO1xuICBpZiAoaXNXb3Jrc3BhY2VQcm90b2NvbFJhbmdlKGN1cnJlbnRWZXJzaW9uKSkgcmV0dXJuIHRydWU7XG4gIGlmICghbWFuYWdlZERlcGVuZGVuY3lOYW1lcy5oYXMoZGVwZW5kZW5jeSkpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgbWFuYWdlZFZlcnNpb24gPSBnZXRNYW5hZ2VkRGVwZW5kZW5jeVZlcnNpb24oY29uZmlnLCByb290Q29uZmlnLCBkZXBlbmRlbmN5KTtcbiAgY29uc3QgY3VycmVudFZhbGlkVmVyc2lvbiA9IHNlbXZlci52YWxpZChjdXJyZW50VmVyc2lvbik7XG4gIC8vIEEgVHlwZVNjcmlwdCA3IHBpbiBpbiBhIEJsaXR6IHJlcG9zaXRvcnkgaXMgbGlrZXdpc2UgaW5jb21wYXRpYmxlIChgbmV4dCBidWlsZGAgZmFpbHMgb25cbiAgLy8gdGhlIE5leHQuanMgMTUgdGhhdCBCbGl0eiBwaW5zIOKAlCBzZWUgZ2V0TWFuYWdlZERlcGVuZGVuY3lWZXJzaW9uKSwgc28gcmV3cml0ZSBpdCB0byB0aGVcbiAgLy8gY2FwcGVkIHJlbGVhc2UgaW5zdGVhZCBvZiBwcmVzZXJ2aW5nIGl0IHZpYSB0aGUgbm8tZG93bmdyYWRlIHJ1bGUgYmVsb3cuIFRoZSBwaW4gbWF5IGJlIGFcbiAgLy8gUkFOR0UgKGUuZy4gYF43LjAuMGApLCB3aGljaCBzZW12ZXIudmFsaWQgcmVqZWN0cyDigJQganVkZ2UgdGhlIG1ham9yIGZyb20gdGhlIHJhbmdlIG1pbmltdW0uXG4gIGNvbnN0IGN1cnJlbnRUeXBlc2NyaXB0VmVyc2lvbiA9XG4gICAgY3VycmVudFZhbGlkVmVyc2lvbiA/PyAoc2VtdmVyLnZhbGlkUmFuZ2UoY3VycmVudFZlcnNpb24pID8gc2VtdmVyLm1pblZlcnNpb24oY3VycmVudFZlcnNpb24pPy52ZXJzaW9uIDogdW5kZWZpbmVkKTtcbiAgaWYgKFxuICAgIGRlcGVuZGVuY3kgPT09IHR5cGVzY3JpcHREZXBlbmRlbmN5ICYmXG4gICAgaXNCbGl0elJlcG9zaXRvcnkoY29uZmlnLCByb290Q29uZmlnKSAmJlxuICAgIGN1cnJlbnRUeXBlc2NyaXB0VmVyc2lvbiAmJlxuICAgIHNlbXZlci5tYWpvcihjdXJyZW50VHlwZXNjcmlwdFZlcnNpb24pID49IDcgJiZcbiAgICBzZW12ZXIudmFsaWQobWFuYWdlZFZlcnNpb24pICYmXG4gICAgaXNOZXdlclBhY2thZ2VWZXJzaW9uKGN1cnJlbnRWZXJzaW9uLCBtYW5hZ2VkVmVyc2lvbilcbiAgKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgLy8gVGhlIGdlbmVyYXRlZCBidW5maWcgYXBwbGllcyB0aGUgb3JnYW5pemF0aW9uIGFnZSBnYXRlIGV2ZW4gdG8gZXhhY3QgcGlucy4gSWYgYSBtYW5hZ2VkXG4gIC8vIHRoaXJkLXBhcnR5IHRvb2wgaXMgbmV3ZXIgdGhhbiB0aGUgbmV3ZXN0IHJlbGVhc2UgdGhhdCBjbGVhcmVkIHRoYXQgZ2F0ZSwgcHJlc2VydmluZyB0aGUgcGluXG4gIC8vIHByb2R1Y2VzIGEgcGFja2FnZS5qc29uIHRoYXQgYSBmcmVzaCBpbnN0YWxsIHdpdGhvdXQgdGhlIG9sZCBsb2NrZmlsZSBjYW5ub3QgcmVzb2x2ZSAobm90YWJseVxuICAvLyBvcHRpbWl6ZWQgRG9ja2VyIGJ1aWxkcykuIEtlZXAgdGhlIG5vLWRvd25ncmFkZSBwb2xpY3kgb25seSB3aGVuIHRoZSBkZXBlbmRlbmN5IGlzIGV4ZW1wdCBmcm9tXG4gIC8vIHRoZSBnYXRlOyBhZ2UtZ2F0ZWQgbWFuYWdlZCB0b29scyBtdXN0IGNvbnZlcmdlIG9uIHRoZSB2ZXJzaW9uIHRoZSBnZW5lcmF0ZWQgYnVuZmlnIGFjY2VwdHMuXG4gIGlmIChzaG91bGREb3duZ3JhZGVBZ2VHYXRlZE1hbmFnZWREZXBlbmRlbmN5KGRlcGVuZGVuY3ksIGN1cnJlbnRWZXJzaW9uLCBtYW5hZ2VkVmVyc2lvbikpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvLyB3YmZ5IG93bnMgdGhlc2UgdG9vbCBkZXBlbmRlbmNpZXMsIGJ1dCBhcHBseWluZyB3YmZ5IHNob3VsZCBub3QgZG93bmdyYWRlIGFcbiAgLy8gcmVwb3NpdG9yeSB0aGF0IGFscmVhZHkgcGlucyBhIG5ld2VyIHJldmlld2VkIHJlbGVhc2Ugd2hlbiB0aGUgb3JnIHBvbGljeSBleGVtcHRzIGl0LlxuICByZXR1cm4gaXNOZXdlclBhY2thZ2VWZXJzaW9uKG1hbmFnZWRWZXJzaW9uLCBjdXJyZW50VmVyc2lvbik7XG59XG5cbmZ1bmN0aW9uIHNob3VsZERvd25ncmFkZUFnZUdhdGVkTWFuYWdlZERlcGVuZGVuY3koXG4gIGRlcGVuZGVuY3k6IHN0cmluZyxcbiAgY3VycmVudFZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgbWFuYWdlZFZlcnNpb246IHN0cmluZ1xuKTogY3VycmVudFZlcnNpb24gaXMgc3RyaW5nIHtcbiAgaWYgKCFjdXJyZW50VmVyc2lvbikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCB2YWxpZEN1cnJlbnRWZXJzaW9uID0gc2VtdmVyLnZhbGlkKGN1cnJlbnRWZXJzaW9uKTtcbiAgY29uc3QgdmFsaWRNYW5hZ2VkVmVyc2lvbiA9IHNlbXZlci52YWxpZChtYW5hZ2VkVmVyc2lvbik7XG4gIHJldHVybiAoXG4gICAgc2hvdWxkQXBwbHlQYWNrYWdlQWdlR2F0ZShkZXBlbmRlbmN5KSAmJlxuICAgIHZhbGlkQ3VycmVudFZlcnNpb24gIT09IG51bGwgJiZcbiAgICB2YWxpZE1hbmFnZWRWZXJzaW9uICE9PSBudWxsICYmXG4gICAgc2VtdmVyLmd0KHZhbGlkQ3VycmVudFZlcnNpb24sIHZhbGlkTWFuYWdlZFZlcnNpb24pXG4gICk7XG59XG5cbi8vIFRoZSBuZXdlc3QgVHlwZVNjcmlwdCA2IHJlbGVhc2UgYXQgdGhlIHRpbWUgdGhlIEJsaXR6IGNhcCBzaGlwcGVkOyB1c2VkIG9ubHkgd2hlbiB0aGUgcmVnaXN0cnlcbi8vIGxvb2t1cCBmb3IgdGhlIGFjdHVhbCBuZXdlc3QgcHJlLXY3IHJlbGVhc2UgZmFpbHMgKHNlZSBnZXRNYW5hZ2VkRGVwZW5kZW5jeVZlcnNpb24pLlxuY29uc3QgbGFzdEtub3duUHJlVjdUeXBlc2NyaXB0VmVyc2lvbiA9ICc2LjAuMyc7XG5cbmZ1bmN0aW9uIGdldE1hbmFnZWREZXBlbmRlbmN5VmVyc2lvbihjb25maWc6IFBhY2thZ2VDb25maWcsIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsIGRlcGVuZGVuY3k6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGxhdGVzdFZlcnNpb24gPSBnZXRMYXRlc3REZXBlbmRlbmN5VmVyc2lvbihkZXBlbmRlbmN5KTtcbiAgaWYgKGRlcGVuZGVuY3kgPT09IHR5cGVzY3JpcHREZXBlbmRlbmN5ICYmIGlzQmxpdHpSZXBvc2l0b3J5KGNvbmZpZywgcm9vdENvbmZpZykpIHtcbiAgICAvLyBCbGl0eiBwaW5zIE5leHQuanMgMTUsIHdob3NlIGJ1aWxkLXRpbWUgYHZlcmlmeVR5cGVTY3JpcHRTZXR1cGAgcmVxdWlyZXMgdGhlIGNsYXNzaWNcbiAgICAvLyBgdHlwZXNjcmlwdGAgY29tcGlsZXIgQVBJOyB0aGUgVHlwZVNjcmlwdCA3IGB0eXBlc2NyaXB0YCBwYWNrYWdlIGlzIHRoZSB0c2dvIGJpbmFyeVxuICAgIC8vIHdpdGhvdXQgdGhhdCBBUEksIHNvIGBuZXh0IGJ1aWxkYCBhYm9ydHMgd2l0aCBcIkZhaWxlZCB0byBpbnN0YWxsIHJlcXVpcmVkIFR5cGVTY3JpcHRcbiAgICAvLyBkZXBlbmRlbmNpZXNcIiAob2JzZXJ2ZWQgaW4gV2lsbEJvb3N0ZXIvc3VydmV5LXN5c3RlbSkuIENhcCBgdHlwZXNjcmlwdGAgYmVsb3cgNyB1bnRpbFxuICAgIC8vIEJsaXR6IHN1cHBvcnRzIGEgTmV4dC5qcyByZWxlYXNlIHRoYXQgdW5kZXJzdGFuZHMgdHNnby4gQSBmYWlsZWQgcmVnaXN0cnkgbG9va3VwIG11c3RcbiAgICAvLyByZXNvbHZlIHRvIGEga25vd24tY29tcGF0aWJsZSByZWxlYXNlIOKAlCBmYWxsaW5nIGJhY2sgdG8gbGF0ZXN0VmVyc2lvbiB3b3VsZCByZWluc3RhbGwgdGhlXG4gICAgLy8gaW5jb21wYXRpYmxlIFR5cGVTY3JpcHQgNy5cbiAgICBjb25zdCB2YWxpZExhdGVzdFZlcnNpb24gPSBzZW12ZXIudmFsaWQobGF0ZXN0VmVyc2lvbik7XG4gICAgaWYgKHZhbGlkTGF0ZXN0VmVyc2lvbiAmJiBzZW12ZXIubWFqb3IodmFsaWRMYXRlc3RWZXJzaW9uKSA8IDcpIHJldHVybiBsYXRlc3RWZXJzaW9uO1xuICAgIC8vIFRoZSBjYXBwZWQgbG9va3VwIG11c3QgcmVzcGVjdCB0aGUgYWdlIGdhdGUgdG9vOiB0aGlzIHZlcnNpb24gaXMgd3JpdHRlbiBhcyBhbiBleGFjdCBwaW4sXG4gICAgLy8gYW5kIEJ1biByZWZ1c2VzIHRvIHJlc29sdmUgb25lIHB1Ymxpc2hlZCBpbnNpZGUgdGhlIG1pbmltdW0tcmVsZWFzZS1hZ2Ugd2luZG93LiBUaGVyZSBpcyBub1xuICAgIC8vIHVuZ2F0ZWQgZmFsbGJhY2sg4oCUIHdpdGhvdXQgcHVibGljYXRpb24gbWV0YWRhdGEgdGhlIGFnZSBvZiBhIHJhbmdlIHJlc3VsdCBpcyB1bmtub3duLCBzbyBhXG4gICAgLy8gcGFydGlhbCByZWdpc3RyeSBmYWlsdXJlIHdvdWxkIG90aGVyd2lzZSB3cml0ZSBhIHZlcnNpb24gQnVuIHRoZW4gcmVmdXNlcyB0byBpbnN0YWxsLlxuICAgIHJldHVybiBnZXRMYXRlc3RBZ2VHYXRlZFZlcnNpb25CZWxvdyh0eXBlc2NyaXB0RGVwZW5kZW5jeSwgJzcuMC4wJykgPz8gbGFzdEtub3duUHJlVjdUeXBlc2NyaXB0VmVyc2lvbjtcbiAgfVxuICByZXR1cm4gbGF0ZXN0VmVyc2lvbjtcbn1cblxuLyoqXG4gKiBUaGUgaGlnaGVzdCByZWxlYXNlIG9mIGBwYWNrYWdlTmFtZWAgYmVsb3cgYGV4Y2x1c2l2ZVVwcGVyQm91bmRgIHRoYXQgYWxyZWFkeSBjbGVhcmVkIHRoZSBhZ2VcbiAqIGdhdGUsIG9yIHVuZGVmaW5lZCB3aGVuIHRoZSByZWdpc3RyeSBsb29rdXAgZmFpbHMgb3Igbm8gc3VjaCByZWxlYXNlIGV4aXN0cyB5ZXQuXG4gKi9cbmZ1bmN0aW9uIGdldExhdGVzdEFnZUdhdGVkVmVyc2lvbkJlbG93KHBhY2thZ2VOYW1lOiBzdHJpbmcsIGV4Y2x1c2l2ZVVwcGVyQm91bmQ6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBnZXRBZ2VHYXRlZFZlcnNpb25zRGVzY2VuZGluZyhnZXROcG1QYWNrYWdlVGltZXMocGFja2FnZU5hbWUpKS5maW5kKCh2ZXJzaW9uKSA9PlxuICAgIHNlbXZlci5sdCh2ZXJzaW9uLCBleGNsdXNpdmVVcHBlckJvdW5kKVxuICApO1xufVxuXG5mdW5jdGlvbiBpc05ld2VyUGFja2FnZVZlcnNpb24oY2FuZGlkYXRlVmVyc2lvbjogc3RyaW5nLCBjdXJyZW50VmVyc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHZhbGlkTGF0ZXN0VmVyc2lvbiA9IHNlbXZlci52YWxpZChjYW5kaWRhdGVWZXJzaW9uKTtcbiAgY29uc3QgdmFsaWRDdXJyZW50VmVyc2lvbiA9IHNlbXZlci52YWxpZChjdXJyZW50VmVyc2lvbik7XG4gIHJldHVybiAhdmFsaWRMYXRlc3RWZXJzaW9uIHx8ICF2YWxpZEN1cnJlbnRWZXJzaW9uIHx8IHNlbXZlci5ndCh2YWxpZExhdGVzdFZlcnNpb24sIHZhbGlkQ3VycmVudFZlcnNpb24pO1xufVxuXG5mdW5jdGlvbiBpc1dvcmtzcGFjZVByb3RvY29sUmFuZ2UodmVyc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiB2ZXJzaW9uLnN0YXJ0c1dpdGgoJ3dvcmtzcGFjZTonKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0UmVwb3NpdG9yeUZvclBhY2thZ2VKc29uKFxuICByZXBvc2l0b3J5OiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddLFxuICBleGlzdGluZ1JlcG9zaXRvcnk/OiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddXG4pOiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddIHtcbiAgY29uc3Qgbm9ybWFsaXplZFJlcG9zaXRvcnkgPSBub3JtYWxpemVSZXBvc2l0b3J5VXJsRm9yUGFja2FnZUpzb24ocmVwb3NpdG9yeSk7XG4gIGlmIChub3JtYWxpemVkUmVwb3NpdG9yeSkge1xuICAgIHJldHVybiBidWlsZE5vcm1hbGl6ZWRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24obm9ybWFsaXplZFJlcG9zaXRvcnksIHJlcG9zaXRvcnksIGV4aXN0aW5nUmVwb3NpdG9yeSk7XG4gIH1cblxuICBjb25zdCBub3JtYWxpemVkRXhpc3RpbmdSZXBvc2l0b3J5ID0gbm9ybWFsaXplUmVwb3NpdG9yeVVybEZvclBhY2thZ2VKc29uKGV4aXN0aW5nUmVwb3NpdG9yeSk7XG4gIGlmIChub3JtYWxpemVkRXhpc3RpbmdSZXBvc2l0b3J5KSB7XG4gICAgcmV0dXJuIGJ1aWxkTm9ybWFsaXplZFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbihub3JtYWxpemVkRXhpc3RpbmdSZXBvc2l0b3J5LCBleGlzdGluZ1JlcG9zaXRvcnkpO1xuICB9XG5cbiAgcmV0dXJuIHJlcG9zaXRvcnk7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVJlcG9zaXRvcnlVcmxGb3JQYWNrYWdlSnNvbihyZXBvc2l0b3J5OiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHR5cGVvZiByZXBvc2l0b3J5ID09PSAnc3RyaW5nJykge1xuICAgIGlmICghcmVwb3NpdG9yeS5zdGFydHNXaXRoKCdnaXRodWI6JykpIHJldHVybjtcblxuICAgIGNvbnN0IFtvd25lciwgcmVwb10gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUocmVwb3NpdG9yeSk7XG4gICAgaWYgKCFvd25lciB8fCAhcmVwbykgcmV0dXJuO1xuICAgIHJldHVybiBgZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS8ke293bmVyfS8ke3JlcG99LmdpdGA7XG4gIH1cblxuICBjb25zdCByZXBvc2l0b3J5VXJsID0gcmVwb3NpdG9yeT8udXJsO1xuICBpZiAodHlwZW9mIHJlcG9zaXRvcnlVcmwgIT09ICdzdHJpbmcnKSByZXR1cm47XG5cbiAgY29uc3QgbWF0Y2hlZCA9IC9eKD86Z2l0XFwrKT9odHRwczpcXC9cXC9naXRodWJcXC5jb21cXC8oW14vXSspXFwvKFteL10rPykoPzpcXC5naXQpPyQvdS5leGVjKHJlcG9zaXRvcnlVcmwpO1xuICBpZiAoIW1hdGNoZWQpIHJldHVybjtcblxuICBjb25zdCBbLCBvd25lciwgcmVwb10gPSBtYXRjaGVkO1xuICByZXR1cm4gYGdpdCtodHRwczovL2dpdGh1Yi5jb20vJHtvd25lcn0vJHtyZXBvfS5naXRgO1xufVxuXG5mdW5jdGlvbiBidWlsZE5vcm1hbGl6ZWRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24oXG4gIG5vcm1hbGl6ZWRVcmw6IHN0cmluZyxcbiAgcmVwb3NpdG9yeTogUGFja2FnZUpzb25bJ3JlcG9zaXRvcnknXSxcbiAgZXhpc3RpbmdSZXBvc2l0b3J5PzogUGFja2FnZUpzb25bJ3JlcG9zaXRvcnknXVxuKTogUGFja2FnZUpzb25bJ3JlcG9zaXRvcnknXSB7XG4gIGNvbnN0IHJlcG9zaXRvcnlPYmogPVxuICAgIHR5cGVvZiByZXBvc2l0b3J5ID09PSAnb2JqZWN0J1xuICAgICAgPyByZXBvc2l0b3J5XG4gICAgICA6IHR5cGVvZiBleGlzdGluZ1JlcG9zaXRvcnkgPT09ICdvYmplY3QnXG4gICAgICAgID8gZXhpc3RpbmdSZXBvc2l0b3J5XG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gIHJldHVybiB7XG4gICAgLi4ucmVwb3NpdG9yeU9iaixcbiAgICB0eXBlOiAnZ2l0JyxcbiAgICB1cmw6IG5vcm1hbGl6ZWRVcmwsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVNjcmlwdHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBvbGRTY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IGhhc1R5cGVjaGVjayA9IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXM7XG4gIGNvbnN0IHNjcmlwdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgLy8gTm8gYC0tYnVuYDogaXRzIG5vZGUtPmJ1biBQQVRIIHNoaW0gbGVha3MgaW50byBldmVyeSBjaGlsZCBwcm9jZXNzIGFuZCBicmVha3MgdG9vbHNcbiAgICAvLyByZXF1aXJpbmcgcmVhbCBOb2RlLmpzIChQbGF5d3JpZ2h0LCB3cmFuZ2xlciwgdmluZXh0KS5cbiAgICBjbGVhbnVwOiAnYnVuIHdiIGxpbnQgLS1maXggLS1mb3JtYXQnLFxuICAgIGZvcm1hdDogYGJ1biB3YiBsaW50IC0tZm9ybWF0YCxcbiAgICBsaW50OiBgYnVuIHdiIGxpbnRgLFxuICAgICdsaW50LWZpeCc6ICdidW4gd2IgbGludCAtLWZpeCcsXG4gICAgdGVzdDogJ2J1biB3YiB0ZXN0JyxcbiAgICB0eXBlY2hlY2s6ICdidW4gd2IgdHlwZWNoZWNrJyxcbiAgICB2ZXJpZnk6ICdidW4gd2IgdmVyaWZ5JyxcbiAgICAndmVyaWZ5LWZ1bGwnOiAnYnVuIHdiIHZlcmlmeSAtLWZ1bGwnLFxuICB9O1xuICBpZiAoY29uZmlnLmlzUm9vdCkge1xuICAgIGFwcGx5VGVzdE9uQ2lTY3JpcHQoc2NyaXB0cywgb2xkU2NyaXB0cyk7XG4gIH1cbiAgYXBwbHlUZXN0U2NyaXB0KGNvbmZpZywgc2NyaXB0cywgb2xkU2NyaXB0cyk7XG4gIGtlZXBHZW5lcmF0ZWRTY3JpcHRXcmFwcGVycyhzY3JpcHRzLCBvbGRTY3JpcHRzLCBbJ3Rlc3QnLCAndmVyaWZ5LWZ1bGwnXSk7XG4gIGFwcGx5RGF0YWJhc2VTY3JpcHRzKGNvbmZpZywgc2NyaXB0cywgb2xkU2NyaXB0cywgYGJ1biAke2dldFdiRGF0YWJhc2VDb21tYW5kKGNvbmZpZyl9YCk7XG4gIGFwcGx5TWlzZVRhc2tTY3JpcHRzKGNvbmZpZywgc2NyaXB0cywgb2xkU2NyaXB0cywgWydidWlsZCcsICdkZXYnLCAnc3RhcnQnLCAndGVzdCcsICd0eXBlY2hlY2snXSk7XG4gIGlmICghaGFzVHlwZWNoZWNrKSB7XG4gICAgZGVsZXRlIHNjcmlwdHMudHlwZWNoZWNrO1xuICB9IGVsc2UgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHlyaWdodCkge1xuICAgIHNjcmlwdHMudHlwZWNoZWNrICs9ICcgJiYgcHlyaWdodCc7XG4gIH1cbiAgcmV0dXJuIHNjcmlwdHM7XG59XG5cbi8vIENJIHdvcmtmbG93cyAoYm90aCB0aGUgcmV1c2FibGUgdGVzdCB3b3JrZmxvdyBhbmQgdGhlIHNlbGYtY29udGFpbmVkIHZhcmlhbnQgZm9yIG5vbi1XaWxsQm9vc3RlclxuLy8gcmVwb3NpdG9yaWVzKSBwcmVmZXIgYHRlc3QvY2lgIG92ZXIgYHRlc3RgLCBzbyBzdGFuZGFyZGl6ZSBpdCBvbiBgd2IgdGVzdC1vbi1jaWAgYXQgdGhlIHJvb3Qg4oCUXG4vLyBgd2IgdGVzdC1vbi1jaWAgYWxyZWFkeSBpdGVyYXRlcyB3b3Jrc3BhY2UgcGFja2FnZXMgaXRzZWxmLlxuZnVuY3Rpb24gYXBwbHlUZXN0T25DaVNjcmlwdChzY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LCBvbGRTY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzKTogdm9pZCB7XG4gIGNvbnN0IG9sZFNjcmlwdCA9IG9sZFNjcmlwdHNbJ3Rlc3QvY2knXTtcbiAgLy8gU29tZSByZXBvc2l0b3JpZXMgd3JhcCBDSSB0ZXN0cyB3aXRoIGV4dHJhIHN0ZXBzIChlLmcuIHNlbGVjdGluZyBzcGVjIGZpbGVzIG9yIHJ1bm5pbmcgcmF3XG4gIC8vIFBsYXl3cmlnaHQpIHRoYXQgd2IgY2Fubm90IGluZmVyIGdlbmVyaWNhbGx5OyBzdWNoIHdyYXBwZXJzIGFyZSBwcmVzZXJ2ZWQuXG4gIHNjcmlwdHNbJ3Rlc3QvY2knXSA9IG9sZFNjcmlwdCAmJiAhaXNHZW5lcmF0ZWRUZXN0T25DaVNjcmlwdChvbGRTY3JpcHQpID8gb2xkU2NyaXB0IDogJ2J1biB3YiB0ZXN0LW9uLWNpJztcbn1cblxuLyoqIFdoZXRoZXIgYSBzY3JpcHQgYm9keSBpcyBvbmUgb2YgdGhlIGdlbmVyYXRlZCBgd2IgdGVzdC1vbi1jaWAgaW52b2NhdGlvbnMuICovXG5mdW5jdGlvbiBpc0dlbmVyYXRlZFRlc3RPbkNpU2NyaXB0KHNjcmlwdDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBzY3JpcHQudHJpbSgpID09PSAnYnVuIHdiIHRlc3Qtb24tY2knO1xufVxuXG4vKipcbiAqIGB3YiB0ZXN0YCBydW5zIEphdmFTY3JpcHQvVHlwZVNjcmlwdCB0ZXN0IHJ1bm5lcnMgb25seSwgc28gcmVwbGFjaW5nIHRoZSBgdGVzdGAgc2NyaXB0IG9mIGFcbiAqIHBhY2thZ2Ugd3JpdHRlbiBpbiBhbm90aGVyIGxhbmd1YWdlIChlLmcuIGEgTWF2ZW4gb3IgYW4gUlNwZWMgcGFja2FnZSBpbiBhIHBvbHlnbG90IG1vbm9yZXBvKVxuICogc2lsZW50bHkgZHJvcHMgaXRzIHdob2xlIHN1aXRlOiB0aGUgZ2VuZXJhdGVkIHNjcmlwdCB0aGVuIHN1Y2NlZWRzIHdpdGhvdXQgcnVubmluZyBhbnl0aGluZy5cbiAqIFN1Y2ggYSBwYWNrYWdlIGtlZXBzIGl0cyBvd24gYHRlc3RgIHNjcmlwdDsgSlMvVFMgcGFja2FnZXMgYXJlIHN0YW5kYXJkaXplZCBhcyB1c3VhbC5cbiAqL1xuZnVuY3Rpb24gYXBwbHlUZXN0U2NyaXB0KFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHNjcmlwdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIG9sZFNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHNcbik6IHZvaWQge1xuICBjb25zdCBvbGRTY3JpcHQgPSBvbGRTY3JpcHRzLnRlc3Q/LnRyaW0oKTtcbiAgaWYgKCFvbGRTY3JpcHQgfHwgZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKSB8fCBpc0dlbmVyYXRlZFRlc3RTY3JpcHQob2xkU2NyaXB0KSkgcmV0dXJuO1xuICBzY3JpcHRzLnRlc3QgPSBvbGRTY3JpcHQ7XG59XG5cbi8qKiBXaGV0aGVyIGEgc2NyaXB0IGJvZHkgaXMgb25lIG9mIHRoZSBLTk9XTiBnZW5lcmF0ZWQgYHdiIHRlc3RgIGludm9jYXRpb25zLiAqL1xuZnVuY3Rpb24gaXNHZW5lcmF0ZWRUZXN0U2NyaXB0KHNjcmlwdDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBzY3JpcHQudHJpbSgpID09PSAnYnVuIHdiIHRlc3QnO1xufVxuXG4vKipcbiAqIEtlZXBzIGEgc2NyaXB0IHRoYXQgQ0hBSU5TIGV4dHJhIGNvbW1hbmRzIG9udG8gdGhlIGdlbmVyYXRlZCBvbmUgKGUuZy4gYSBwb2x5Z2xvdCBtb25vcmVwb1xuICogYXBwZW5kaW5nIGl0cyBNYXZlbiBhbmQgUlNwZWMgc3VpdGVzIHRvIGB3YiB0ZXN0YCwgd2hpY2ggcnVucyBKYXZhU2NyaXB0L1R5cGVTY3JpcHQgcnVubmVyc1xuICogb25seSkuIFN1Y2ggYSB3cmFwcGVyIHN0aWxsIHJ1bnMgdGhlIGdlbmVyYXRlZCBjb21tYW5kLCBzbyByZXBsYWNpbmcgaXQgd291bGQgc2lsZW50bHkgZHJvcCB0aGVcbiAqIHJlcG9zaXRvcnkncyBvd24gc3RlcHMg4oCUIHRoZSBzYW1lIHJlYXNvbmluZyBhcyBgYXBwbHlUZXN0T25DaVNjcmlwdGAuIEFuIHVucmVjb2duaXplZCBjaGFpbmVkXG4gKiBzY3JpcHQgaXMga2VwdCB3aG9sZXNhbGUgcmF0aGVyIHRoYW4gbG9zaW5nIGl0cyBwcm9qZWN0LW93bmVkIGNvbW1hbmRzLlxuICovXG5mdW5jdGlvbiBrZWVwR2VuZXJhdGVkU2NyaXB0V3JhcHBlcnMoXG4gIHNjcmlwdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIG9sZFNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMsXG4gIHNjcmlwdE5hbWVzOiBzdHJpbmdbXVxuKTogdm9pZCB7XG4gIGZvciAoY29uc3Qgc2NyaXB0TmFtZSBvZiBzY3JpcHROYW1lcykge1xuICAgIGNvbnN0IG9sZFNjcmlwdCA9IG9sZFNjcmlwdHNbc2NyaXB0TmFtZV0/LnRyaW0oKTtcbiAgICBjb25zdCBnZW5lcmF0ZWRTY3JpcHQgPSBzY3JpcHRzW3NjcmlwdE5hbWVdO1xuICAgIGlmICghb2xkU2NyaXB0IHx8ICFnZW5lcmF0ZWRTY3JpcHQgfHwgb2xkU2NyaXB0ID09PSBnZW5lcmF0ZWRTY3JpcHQpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGhlYWRSZWdFeHAgPSBuZXcgUmVnRXhwKFxuICAgICAgYF4ke2VzY2FwZVJlZ0V4cChnZW5lcmF0ZWRTY3JpcHQpLnJlcGxhY2VBbGwoJyAnLCBTdHJpbmcucmF3YFsgXFx0XStgKX0oPz1bIFxcXFx0XSooPzomJnxcXFxcfFxcXFx8fDt8XFxcXG4pKWAsXG4gICAgICAndSdcbiAgICApO1xuICAgIC8vIEEgbmV3bGluZSBzZXBhcmF0ZXMgc2hlbGwgY29tbWFuZHMganVzdCBsaWtlICYmLCB8fCBhbmQgOy5cbiAgICBpZiAoaGVhZFJlZ0V4cC50ZXN0KG9sZFNjcmlwdCkpIHtcbiAgICAgIC8vIEEgZnVuY3Rpb24gcmVwbGFjZW1lbnQga2VlcHMgYCRgLXNoYXBlZCBjaGFyYWN0ZXJzIGluIHRoZSBnZW5lcmF0ZWQgY29tbWFuZCBsaXRlcmFsLlxuICAgICAgc2NyaXB0c1tzY3JpcHROYW1lXSA9IG9sZFNjcmlwdC5yZXBsYWNlKGhlYWRSZWdFeHAsICgpID0+IGdlbmVyYXRlZFNjcmlwdCk7XG4gICAgfSBlbHNlIGlmICgvKD86JiZ8XFx8XFx8fDt8XFxuKS91LnRlc3Qob2xkU2NyaXB0KSkge1xuICAgICAgc2NyaXB0c1tzY3JpcHROYW1lXSA9IG9sZFNjcmlwdDtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYXBwbHlEYXRhYmFzZVNjcmlwdHMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgb2xkU2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cyxcbiAgd2JEYkNvbW1hbmQ6IHN0cmluZ1xuKTogdm9pZCB7XG4gIGlmICghY29uZmlnLmRlcGVuZGluZy5wcmlzbWEgJiYgIWNvbmZpZy5kZXBlbmRpbmcuZHJpenpsZSkgcmV0dXJuO1xuXG4gIGFwcGx5RGF0YWJhc2VTY3JpcHQoc2NyaXB0cywgb2xkU2NyaXB0cywgJ2RiLWNyZWF0ZS1taWdyYXRpb24nLCBgJHt3YkRiQ29tbWFuZH0gbWlncmF0ZS1kZXZgLCAnbWlncmF0ZS1kZXYnKTtcbiAgYXBwbHlEYXRhYmFzZVNjcmlwdChcbiAgICBzY3JpcHRzLFxuICAgIG9sZFNjcmlwdHMsXG4gICAgJ2RiLW1pZ3JhdGUnLFxuICAgIGAke3diRGJDb21tYW5kfSBtaWdyYXRlIC0tY2hlY2staWRlbXBvdGVuY3lgLFxuICAgICdtaWdyYXRlIC0tY2hlY2staWRlbXBvdGVuY3knXG4gICk7XG4gIGFwcGx5RGF0YWJhc2VTY3JpcHQoc2NyaXB0cywgb2xkU2NyaXB0cywgJ2RiLXZpZXcnLCBgJHt3YkRiQ29tbWFuZH0gc3R1ZGlvYCwgJ3N0dWRpbycpO1xufVxuXG5mdW5jdGlvbiBhcHBseURhdGFiYXNlU2NyaXB0KFxuICBzY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBvbGRTY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzLFxuICBuYW1lOiBzdHJpbmcsXG4gIGdlbmVyYXRlZFNjcmlwdDogc3RyaW5nLFxuICBnZW5lcmF0ZWRBcmd1bWVudHM6IHN0cmluZ1xuKTogdm9pZCB7XG4gIGNvbnN0IG9sZFNjcmlwdCA9IG9sZFNjcmlwdHNbbmFtZV07XG4gIC8vIFNvbWUgcmVwb3NpdG9yaWVzIHdyYXAgbWlncmF0aW9uIGNvbW1hbmRzIHRvIHByZXBhcmUgU1FMaXRlIGRpcmVjdG9yaWVzLFxuICAvLyBmYW4gb3V0IG92ZXIgdGVuYW50cywgb3IgcGVyZm9ybSBjbGVhbnVwIHRoYXQgd2IgY2Fubm90IGluZmVyIGdlbmVyaWNhbGx5LlxuICBjb25zdCBnZW5lcmF0ZWRCb2RpZXMgPSBbYGJ1biB3YiBkYiAke2dlbmVyYXRlZEFyZ3VtZW50c31gLCBgYnVuIHdiIHByaXNtYSAke2dlbmVyYXRlZEFyZ3VtZW50c31gXTtcbiAgc2NyaXB0c1tuYW1lXSA9IG9sZFNjcmlwdCAmJiAhZ2VuZXJhdGVkQm9kaWVzLmluY2x1ZGVzKG9sZFNjcmlwdC50cmltKCkpID8gb2xkU2NyaXB0IDogZ2VuZXJhdGVkU2NyaXB0O1xufVxuXG5mdW5jdGlvbiBnZXRXYkRhdGFiYXNlQ29tbWFuZChjb25maWc6IFBhY2thZ2VDb25maWcpOiAnd2IgZGInIHwgJ3diIHByaXNtYScge1xuICBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEpIHJldHVybiAnd2IgcHJpc21hJztcbiAgcmV0dXJuICd3YiBkYic7XG59XG5cbmZ1bmN0aW9uIGlzV2JQYWNrYWdlKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gcGFja2FnZUpzb24/Lm5hbWUgPT09IHdiRGVwZW5kZW5jeTtcbn1cblxuZnVuY3Rpb24gYXBwbHlNaXNlVGFza1NjcmlwdHMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgb2xkU2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cyxcbiAgbmFtZXM6IHN0cmluZ1tdXG4pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7XG4gICAgaWYgKCFoYXNNaXNlVGFzayhjb25maWcsIG5hbWUpKSBjb250aW51ZTtcbiAgICBpZiAoZG9lc01pc2VUYXNrQ2FsbFBhY2thZ2VTY3JpcHQoY29uZmlnLCBuYW1lKSkgY29udGludWU7XG4gICAgLy8gUHJlc2VydmUgYSBsZWFkaW5nIGBLRVk9VkFMVUUgYCBlbnYgcHJlZml4IChlLmcuIGBNSVNFX0VOVj10ZXN0YCkgb24gYW4gZXhpc3RpbmcgbWlzZSBicmlkZ2UuXG4gICAgLy8gU3VjaCBhIHByZWZpeCBpcyByZXF1aXJlZCBmb3IgbWlzZSBjb25maWcgZW52aXJvbm1lbnRzIChtaXNlLjxNSVNFX0VOVj4udG9tbCksIHdoaWNoIGFyZVxuICAgIC8vIHNlbGVjdGVkIGZyb20gTUlTRV9FTlYgKmJlZm9yZSogbWlzZSBzdGFydHMgYW5kIGNhbm5vdCBiZSBzd2l0Y2hlZCBmcm9tIGluc2lkZSBhIHRhc2s7IGRyb3BwaW5nXG4gICAgLy8gaXQgd291bGQgc2lsZW50bHkgcnVuIHRoZSB0YXNrIGluIHRoZSBkZWZhdWx0IGVudmlyb25tZW50LlxuICAgIGNvbnN0IGVudlByZWZpeCA9IGV4dHJhY3RNaXNlQnJpZGdlRW52UHJlZml4KG9sZFNjcmlwdHNbbmFtZV0sIG5hbWUpO1xuICAgIGlmIChlbnZQcmVmaXggPT09IHVuZGVmaW5lZCAmJiBvbGRTY3JpcHRzW25hbWVdICYmICEobmFtZSBpbiBzY3JpcHRzKSkgY29udGludWU7XG4gICAgc2NyaXB0c1tuYW1lXSA9IGAke2VudlByZWZpeCA/PyAnJ31taXNlIHJ1biAke25hbWV9YDtcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGxlYWRpbmcgYEtFWT1WQUxVRSBgIGVudi12YXIgcHJlZml4IG9mIGFuIGV4aXN0aW5nIGBtaXNlIHJ1biA8bmFtZT5gIGJyaWRnZSBzY3JpcHRcbiAqIChwb3NzaWJseSBhbiBlbXB0eSBzdHJpbmcgd2hlbiB0aGUgYnJpZGdlIGhhcyBubyBwcmVmaXgpLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZSBzY3JpcHQgaXMgbm90IGFcbiAqIG1pc2UgYnJpZGdlIGZvciB0aGUgZ2l2ZW4gdGFzay5cbiAqL1xuZnVuY3Rpb24gZXh0cmFjdE1pc2VCcmlkZ2VFbnZQcmVmaXgoc2NyaXB0OiB1bmtub3duLCBuYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAodHlwZW9mIHNjcmlwdCAhPT0gJ3N0cmluZycpIHJldHVybiB1bmRlZmluZWQ7XG4gIC8vIEVhY2ggYXNzaWdubWVudCB2YWx1ZSBtYXkgYmUgZG91YmxlLXF1b3RlZCwgc2luZ2xlLXF1b3RlZCwgb3IgYW4gdW5xdW90ZWQgcnVuIG9mIG5vbi13aGl0ZXNwYWNlLFxuICAvLyBzbyBwcmVmaXhlcyBsaWtlIGBNSVNFX0VOVj1cImEgYlwiYCAod2hvc2UgdmFsdWUgY29udGFpbnMgc3BhY2VzKSBhcmUgbWF0Y2hlZCBpbnN0ZWFkIG9mIGRyb3BwZWQuXG4gIGNvbnN0IG1hdGNoID0gbmV3IFJlZ0V4cChTdHJpbmcucmF3YF4oKD86XFx3Kz0oPzpcIlteXCJdKlwifCdbXiddKid8XFxTKylcXHMrKSopbWlzZSBydW4gJHtlc2NhcGVSZWdFeHAobmFtZSl9JGAsICd1JykuZXhlYyhcbiAgICBzY3JpcHQudHJpbSgpXG4gICk7XG4gIHJldHVybiBtYXRjaD8uWzFdO1xufVxuXG5mdW5jdGlvbiBoYXNNaXNlVGFzayhjb25maWc6IFBhY2thZ2VDb25maWcsIG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gT2JqZWN0Lmhhc093bihjb25maWcubWlzZVRhc2tzLCBuYW1lKTtcbn1cblxuZnVuY3Rpb24gZG9lc01pc2VUYXNrQ2FsbFBhY2thZ2VTY3JpcHQoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgdGFzayA9IGNvbmZpZy5taXNlVGFza3NbbmFtZV07XG4gIGlmICghdGFzaykgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBwYWNrYWdlTWFuYWdlcnMgPSBbJ2J1bicsICd5YXJuJywgJ25wbScsICdwbnBtJ107XG4gIHJldHVybiBwYWNrYWdlTWFuYWdlcnMuc29tZSgocGFja2FnZU1hbmFnZXIpID0+XG4gICAgbmV3IFJlZ0V4cChTdHJpbmcucmF3YFxcYiR7cGFja2FnZU1hbmFnZXJ9XFxzKyg/OnJ1blxccyspPyR7ZXNjYXBlUmVnRXhwKG5hbWUpfSg/IVthLXpBLVowLTlfXFwtOi5dKWAsICd1JykudGVzdCh0YXNrKVxuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVQcml2YXRlUGFja2FnZXMoanNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwYWNrYWdlTmFtZXMgPSBuZXcgU2V0KFsuLi5PYmplY3Qua2V5cyhqc29uT2JqLmRlcGVuZGVuY2llcyksIC4uLk9iamVjdC5rZXlzKGpzb25PYmouZGV2RGVwZW5kZW5jaWVzKV0pO1xuICBjb25zdCBwcml2YXRlUGFja2FnZXM6IHtcbiAgICBwYWNrYWdlTmFtZTogc3RyaW5nO1xuICAgIG9yZzogc3RyaW5nO1xuICAgIHJlcG86IHN0cmluZztcbiAgICB0YXJnZXQ6ICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcyc7XG4gIH1bXSA9IFtcbiAgICB7IHBhY2thZ2VOYW1lOiAnQHdpbGxib29zdGVyL2NvZGUtYW5hbHl6ZXInLCBvcmc6ICdXaWxsQm9vc3RlcicsIHJlcG86ICdjb2RlLWFuYWx5emVyJywgdGFyZ2V0OiAnZGV2RGVwZW5kZW5jaWVzJyB9LFxuICAgIHsgcGFja2FnZU5hbWU6ICdAd2lsbGJvb3N0ZXIvanVkZ2UnLCBvcmc6ICdXaWxsQm9vc3RlckxhYicsIHJlcG86ICdqdWRnZScsIHRhcmdldDogJ2RlcGVuZGVuY2llcycgfSxcbiAgICB7IHBhY2thZ2VOYW1lOiAnQHdpbGxib29zdGVyL2xsbS1wcm94eScsIG9yZzogJ1dpbGxCb29zdGVyTGFiJywgcmVwbzogJ2xsbS1wcm94eScsIHRhcmdldDogJ2RlcGVuZGVuY2llcycgfSxcbiAgXTtcblxuICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICBwcml2YXRlUGFja2FnZXMubWFwKGFzeW5jICh7IG9yZywgcGFja2FnZU5hbWUsIHJlcG8sIHRhcmdldCB9KSA9PiB7XG4gICAgICBpZiAoIXBhY2thZ2VOYW1lcy5oYXMocGFja2FnZU5hbWUpIHx8IGlzV29ya3NwYWNlUGFja2FnZShqc29uT2JqLCBwYWNrYWdlTmFtZSkpIHJldHVybjtcblxuICAgICAgY29uc3QgZXhpc3RpbmdTcGVjaWZpZXIgPSBqc29uT2JqLmRlcGVuZGVuY2llc1twYWNrYWdlTmFtZV0gPz8ganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbcGFja2FnZU5hbWVdO1xuICAgICAgY29uc3Qgb3RoZXJUYXJnZXQgPSB0YXJnZXQgPT09ICdkZXBlbmRlbmNpZXMnID8gJ2RldkRlcGVuZGVuY2llcycgOiAnZGVwZW5kZW5jaWVzJztcbiAgICAgIC8vIFRoZSBsaW50IHJ1bGUgZGlzYWxsb3dzIGBkZWxldGVgIHdpdGggY29tcHV0ZWQgcGFja2FnZSBuYW1lczsgUmVmbGVjdCBoYXMgdGhlIHNhbWUgZGVsZXRpb24gc2VtYW50aWNzIGhlcmUuXG4gICAgICBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KGpzb25PYmpbb3RoZXJUYXJnZXRdLCBwYWNrYWdlTmFtZSk7XG4gICAgICBqc29uT2JqW3RhcmdldF1bcGFja2FnZU5hbWVdID0gaXNQaW5uZWRQcml2YXRlUGFja2FnZVNwZWNpZmllcihleGlzdGluZ1NwZWNpZmllciwgb3JnLCByZXBvKVxuICAgICAgICA/IGV4aXN0aW5nU3BlY2lmaWVyXG4gICAgICAgIDogYXdhaXQgZ2V0TGF0ZXN0UHJpdmF0ZVBhY2thZ2VTcGVjaWZpZXIob3JnLCByZXBvKTtcbiAgICB9KVxuICApO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIGV4aXN0aW5nIHNwZWNpZmllciBhbHJlYWR5IHBpbnMgYSBnaXQgcmVmIG9mIHRoZSBleHBlY3RlZCBwcml2YXRlIHJlcG9zaXRvcnkuXG4gKiB3YmZ5IG11c3Qgbm90IGJ1bXAgc3VjaCBwaW5zOiBhIHJ1biBpbnRlbmRlZCBhcyBjb25maWd1cmF0aW9uL3BhY2thZ2UtbWFuYWdlciBtYWludGVuYW5jZVxuICogd291bGQgb3RoZXJ3aXNlIGNoYW5nZSB0aGUgZGVwZW5kZW5jeSdzIHZlcnNpb24gYXMgYSBzaWRlIGVmZmVjdCAodXBkYXRpbmcgcGlucyBpcyBSZW5vdmF0ZSdzXG4gKiBqb2IpLCBwb3NzaWJseSB0byBhIGNvbW1pdCB3aG9zZSBwcmVidWlsdCBhcnRpZmFjdHMgYXJlIG1pc3NpbmcuXG4gKi9cbmZ1bmN0aW9uIGlzUGlubmVkUHJpdmF0ZVBhY2thZ2VTcGVjaWZpZXIoXG4gIHNwZWNpZmllcjogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBvcmc6IHN0cmluZyxcbiAgcmVwbzogc3RyaW5nXG4pOiBzcGVjaWZpZXIgaXMgc3RyaW5nIHtcbiAgaWYgKCFzcGVjaWZpZXIpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIG5ldyBSZWdFeHAoU3RyaW5nLnJhd2AoPzpefFs6L10pJHtvcmd9LyR7cmVwb30oPzpcXC5naXQpPyNcXFMrJGAsICd1JykudGVzdChzcGVjaWZpZXIpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRMYXRlc3RQcml2YXRlUGFja2FnZVNwZWNpZmllcihvcmc6IHN0cmluZywgcmVwbzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgY29tbWl0SGFzaCA9IGF3YWl0IGdldExhdGVzdENvbW1pdEhhc2gob3JnLCByZXBvKTtcbiAgcmV0dXJuIGBnaXRAZ2l0aHViLmNvbToke29yZ30vJHtyZXBvfS5naXQjJHtjb21taXRIYXNofWA7XG59XG5cbmZ1bmN0aW9uIGlzV29ya3NwYWNlUGFja2FnZShqc29uT2JqOiBQYWNrYWdlSnNvbiwgcGFja2FnZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gKGpzb25PYmouZGV2RGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdIHx8IGpzb25PYmouZGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdIHx8ICcnKS5pbmNsdWRlcygnd29ya3NwYWNlJyk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBxdW90ZUZvclNoZWxsIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWIvc3JjJztcbmltcG9ydCAqIGFzIHlhbWwgZnJvbSAnanMteWFtbCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBnZXRHZW5JMThuVHNDb21tYW5kIH0gZnJvbSAnLi4vdXRpbHMvZ2VuSTE4blRzLmpzJztcbmltcG9ydCB7IGRvZXNDb250YWluSmF2YSwgZG9lc0NvbnRhaW5Kc09yVHMgfSBmcm9tICcuLi91dGlscy9wYWNrYWdlQ2FwYWJpbGl0aWVzLmpzJztcblxuaW1wb3J0IHsgZ2VuZXJhdGVTY3JpcHRzIH0gZnJvbSAnLi9wYWNrYWdlSnNvbi5qcyc7XG5cbmludGVyZmFjZSBMZWZ0aG9va1NldHRpbmdzIHtcbiAgZ2xvYl9tYXRjaGVyOiAnZG91Ymxlc3Rhcic7XG4gICdwb3N0LW1lcmdlJzoge1xuICAgIGpvYnM6IExlZnRob29rSm9iW107XG4gIH07XG4gICdwcmUtY29tbWl0Jzoge1xuICAgIGpvYnM6IExlZnRob29rSm9iW107XG4gIH07XG4gICdwcmUtcHVzaCc6IHtcbiAgICBqb2JzOiBMZWZ0aG9va0pvYltdO1xuICB9O1xufVxuXG5pbnRlcmZhY2UgTGVmdGhvb2tKb2Ige1xuICBuYW1lOiBzdHJpbmc7XG4gIGdsb2I/OiBzdHJpbmc7XG4gIHJ1bj86IHN0cmluZztcbiAgc2NyaXB0Pzogc3RyaW5nO1xuICBydW5uZXI/OiAnYmFzaCc7XG4gIHN0YWdlX2ZpeGVkPzogdHJ1ZTtcbn1cblxuY29uc3QgYmFzZVNldHRpbmdzOiBPbWl0PExlZnRob29rU2V0dGluZ3MsICdwcmUtY29tbWl0Jz4gPSB7XG4gIGdsb2JfbWF0Y2hlcjogJ2RvdWJsZXN0YXInLFxuICAncG9zdC1tZXJnZSc6IHtcbiAgICBqb2JzOiBbXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdwcmVwYXJlJyxcbiAgICAgICAgc2NyaXB0OiAncHJlcGFyZS5zaCcsXG4gICAgICAgIHJ1bm5lcjogJ2Jhc2gnLFxuICAgICAgfSxcbiAgICBdLFxuICB9LFxuICAncHJlLXB1c2gnOiB7XG4gICAgam9iczogW1xuICAgICAge1xuICAgICAgICBuYW1lOiAnY2hlY2snLFxuICAgICAgICBzY3JpcHQ6ICdjaGVjay5zaCcsXG4gICAgICAgIHJ1bm5lcjogJ2Jhc2gnLFxuICAgICAgfSxcbiAgICBdLFxuICB9LFxufTtcblxuLy8gTGVmdGhvb2sgZXhwYW5kcyB7c3RhZ2VkX2ZpbGVzfSBhcyBzaGVsbC1lc2NhcGVkIGFyZ3MsIHNvIHRoZSB1bnF1b3RlZCBsb29wcyBiZWxvdyBrZWVwIHBhdGhzXG4vLyB3aXRoIHNwYWNlcyBpbnRhY3QuXG5jb25zdCBwcmVDb21taXRTZXR0aW5nczogTGVmdGhvb2tTZXR0aW5nc1sncHJlLWNvbW1pdCddID0ge1xuICBqb2JzOiBbXG4gICAge1xuICAgICAgbmFtZTogJ2NsZWFudXAnLFxuICAgICAgZ2xvYjogJycsXG4gICAgICBydW46ICcnLFxuICAgICAgc3RhZ2VfZml4ZWQ6IHRydWUsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnY2hlY2stbWlncmF0aW9ucycsXG4gICAgICBnbG9iOiAnKiovbWlncmF0aW9uLnNxbCcsXG4gICAgICBydW46IGBcbmZhaWxlZD0wXG5mb3IgZmlsZSBpbiB7c3RhZ2VkX2ZpbGVzfTsgZG9cbiAgaWYgZ3JlcCAtcSAnV2FybmluZ3M6JyBcIiRmaWxlXCI7IHRoZW5cbiAgICBlY2hvIFwiTWlncmF0aW9uIFNRTCBmaWxlICgkZmlsZSkgY29udGFpbnMgd2FybmluZ3MhIFBsZWFzZSBzb2x2ZSB0aGUgd2FybmluZ3MgYW5kIGNvbW1pdCBhZ2Fpbi5cIlxuICAgIGZhaWxlZD0xXG4gIGZpXG5kb25lXG5leGl0IFwiJGZhaWxlZFwiXG5gLnRyaW0oKSxcbiAgICB9LFxuICAgIHtcbiAgICAgIC8vIGJ1biByZWNvcmRzIGFuIGFic29sdXRlIGByZXNvbHZlZGAgVVJMIGZvciBhbiBhbHJlYWR5LWxvY2tlZCBwYWNrYWdlIHdoZW5ldmVyIHRoZVxuICAgICAgLy8gY29uZmlndXJlZCByZWdpc3RyeSBkb2VzIG5vdCBzZXJ2ZSB0aGUgdGFyYmFsbCBob3N0IGluIHRoZSBwYWNrYWdlIG1ldGFkYXRhIOKAlCB3aGljaCBpc1xuICAgICAgLy8gZXhhY3RseSB3aGF0IHRoZSBUYWt1bWkgR3VhcmQgcHJveHkgZG9lcy4gU28gYW4gaW5zdGFsbCBydW4gd2l0aCBHdWFyZCBhcyB0aGUgZGVmYXVsdFxuICAgICAgLy8gcmVnaXN0cnkgKENJLCBvciBhIGRldmVsb3BlciB3aG8gcHV0IGl0IGluIH4vLm5wbXJjKSBiYWtlcyBucG0uZmxhdHQudGVjaCBVUkxzIGludG9cbiAgICAgIC8vIGJ1bi5sb2NrLCBhbmQgY29tbWl0dGluZyB0aGVtIHBpbnMgYSBTSEFSRUQgbG9ja2ZpbGUgdG8gb25lIGVudmlyb25tZW50J3MgbWlycm9yOiBldmVyeVxuICAgICAgLy8gbGF0ZXIgaW5zdGFsbCBkb3dubG9hZHMgdGhyb3VnaCB0aGUgcHJveHksIGFuZCBhIGNvbGQtY2FjaGUgaW5zdGFsbCBmYWlscyBvdXRyaWdodCB3aXRoXG4gICAgICAvLyA0MDEgZm9yIGFueW9uZSB3aG9zZSBucG1yYyBjYXJyaWVzIGEgcmVnaXN0cnkubnBtanMub3JnIHRva2VuLCBiZWNhdXNlIGJ1biBzZW5kcyB0aGVcbiAgICAgIC8vIGRlZmF1bHQgcmVnaXN0cnkncyBjcmVkZW50aWFscyB0byB3aGF0ZXZlciBob3N0IHRoZSBsb2NrZmlsZSBuYW1lcy4gR3VhcmQgY292ZXJhZ2UgZG9lc1xuICAgICAgLy8gbm90IGRlcGVuZCBvbiB0aGVzZSBVUkxzIOKAlCB3aXRoIGFuIGVtcHR5IGByZXNvbHZlZGAsIGJ1biBkZXJpdmVzIHRoZSBkb3dubG9hZCBVUkwgZnJvbVxuICAgICAgLy8gdGhlIGNvbmZpZ3VyZWQgcmVnaXN0cnkg4oCUIHNvIHN0cmlwIHRoZW0uIE9ubHkgdGhlIEd1YXJkIGhvc3QgaXMgc3RyaXBwZWQ6IGEgc2NvcGVkXG4gICAgICAvLyByZWdpc3RyeSBzdWNoIGFzIFZlcmRhY2NpbyBsZWdpdGltYXRlbHkgcmVjb3JkcyBpdHMgb3duIFVSTCBmb3IgcHJpdmF0ZSBwYWNrYWdlcy5cbiAgICAgIG5hbWU6ICdub3JtYWxpemUtYnVuLWxvY2tmaWxlJyxcbiAgICAgIGdsb2I6ICdidW4ubG9jaycsXG4gICAgICBydW46ICdiYXNoIC5sZWZ0aG9vay9ub3JtYWxpemUtYnVuLWxvY2tmaWxlLnNoIHtzdGFnZWRfZmlsZXN9JyxcbiAgICAgIHN0YWdlX2ZpeGVkOiB0cnVlLFxuICAgIH0sXG4gICAge1xuICAgICAgLy8gT25seSB3aWxsYm9vc3Rlci1jb25maWdzIGdldHMgdGhpcyBqb2I6IGV2ZXJ5IG90aGVyIHJlcG9zaXRvcnkncyByZW5vdmF0ZS5qc29uYyBtZXJlbHlcbiAgICAgIC8vIGV4dGVuZHMgdGhlIHNoYXJlZCBwcmVzZXQsIGFuZCB0aGUgdmFsaWRhdG9yIGRvZXMgbm90IHJlc29sdmUgcmVtb3RlIHByZXNldHMsIHNvIHJ1bm5pbmcgaXRcbiAgICAgIC8vIHRoZXJlIHdvdWxkIHZhbGlkYXRlIHR3byBsaW5lcyBhbmQgY2F0Y2ggbm90aGluZy4gYC0tbm8tZ2xvYmFsYCB2YWxpZGF0ZXMgdGhlIHByZXNldCBhcyBhXG4gICAgICAvLyByZXBvIGNvbmZpZyBpbnN0ZWFkIG9mIGEgc2VsZi1ob3N0ZWQgZ2xvYmFsIGNvbmZpZywgYW5kIGBAbGF0ZXN0YCBrZWVwcyBucG0gZnJvbSBzaWxlbnRseVxuICAgICAgLy8gaW5zdGFsbGluZyBhbiBhbmNpZW50IFJlbm92YXRlIHRoYXQgY2Fubm90IGV2ZW4gcGFyc2UgSlNPTkMgd2hlbiB0aGUgbG9jYWwgTm9kZSBsYWdzIGJlaGluZC5cbiAgICAgIC8vIFN0YWdpbmcgYSBkZWxldGlvbiBvZiByZW5vdmF0ZS5qc29uYyBsZWF2ZXMgbm8gZmlsZSBmb3IgaW5zcGVjdGlvbiwgc28gTGVmdGhvb2sgc2tpcHMgdGhpc1xuICAgICAgLy8gam9iIGluc3RlYWQgb2YgcnVubmluZyB0aGUgdmFsaWRhdG9yIG9uIGEgbWlzc2luZyBwYXRoIOKAlCBkZWxpYmVyYXRlbHksIGJlY2F1c2UgZGVsZXRpbmcgdGhlXG4gICAgICAvLyBzaGFyZWQgcHJlc2V0IGlzIG5vdCBhbiBvcGVyYXRpb24gdGhpcyBob29rIG5lZWRzIHRvIGd1YXJkLlxuICAgICAgbmFtZTogJ3ZhbGlkYXRlLXJlbm92YXRlLWNvbmZpZycsXG4gICAgICBnbG9iOiAncmVub3ZhdGUuanNvbmMnLFxuICAgICAgcnVuOiAnbnB4IC0teWVzIC0tcGFja2FnZSByZW5vdmF0ZUBsYXRlc3QgLS0gcmVub3ZhdGUtY29uZmlnLXZhbGlkYXRvciAtLXN0cmljdCAtLW5vLWdsb2JhbCB7c3RhZ2VkX2ZpbGVzfScsXG4gICAgfSxcbiAgXSxcbn07XG5cbmNvbnN0IHNjcmlwdHMgPSB7XG4gIC8vIHByZXBhcmUgY2FsbHMgdGhpcyB3aXRob3V0IGFyZ3VtZW50cyBhZnRlciBCdW4gc2F2ZXMgdGhlIHJvb3QgbG9ja2ZpbGU7IExlZnRob29rIHBhc3NlcyBpdHNcbiAgLy8gc3RhZ2VkIHBhdGguIFRoZSB1bnByZWRpY3RhYmxlIHNpYmxpbmcgZmlsZSBtYWtlcyByZXBsYWNlbWVudCBhdG9taWMsIGBjcCAtcGAgcHJlc2VydmVzIGl0c1xuICAvLyBtb2RlLCBhbmQgdGhlIGFuY2hvcmVkIHBhdHRlcm4gY2Fubm90IGVyYXNlIGEgZGlyZWN0IHRhcmJhbGwgZGVwZW5kZW5jeSBVUkwuXG4gIG5vcm1hbGl6ZUJ1bkxvY2tmaWxlOiBgXG4jIS9iaW4vYmFzaFxuc2V0IC1lXG5cbmlmIFtbIFwiJCNcIiAtZXEgMCBdXTsgdGhlblxuICBzZXQgLS0gYnVuLmxvY2tcbmZpXG5cbm5vcm1hbGl6ZWQ9XCJcIlxudHJhcCAnW1sgLXogXCIkbm9ybWFsaXplZFwiIF1dIHx8IHJtIC1mIFwiJG5vcm1hbGl6ZWRcIicgRVhJVFxuZm9yIGZpbGUgaW4gXCIkQFwiOyBkb1xuICBbWyAtZiBcIiRmaWxlXCIgXV0gfHwgY29udGludWVcbiAgbm9ybWFsaXplZD1cIiQobWt0ZW1wIFwiJGZpbGUud2JmeS1ub3JtYWxpemluZy5YWFhYWFhcIilcIlxuICBjcCAtcCBcIiRmaWxlXCIgXCIkbm9ybWFsaXplZFwiXG4gIHNlZCAtRSAncyMoXCIsIClcImh0dHBzOi8vbnBtXFxcXC5mbGF0dFxcXFwudGVjaC9bXlwiXSpcIiNcXFxcMVwiXCIjZycgXCIkZmlsZVwiID4gXCIkbm9ybWFsaXplZFwiXG4gIGlmICEgY21wIC1zIFwiJGZpbGVcIiBcIiRub3JtYWxpemVkXCI7IHRoZW5cbiAgICBtdiBcIiRub3JtYWxpemVkXCIgXCIkZmlsZVwiXG4gICAgZWNobyBcIlJlbW92ZWQgVGFrdW1pIEd1YXJkIHByb3h5IFVSTHMgZnJvbSAkZmlsZSBzbyB0aGUgbG9ja2ZpbGUgc3RheXMgcmVnaXN0cnktYWdub3N0aWMuXCJcbiAgZmlcbiAgcm0gLWYgXCIkbm9ybWFsaXplZFwiXG4gIG5vcm1hbGl6ZWQ9XCJcIlxuZG9uZVxuYC50cmltKCksXG4gIHBvc3RNZXJnZTogYFxuIyEvYmluL2Jhc2hcblxuY2hhbmdlZF9maWxlcz1cIiQoZ2l0IGRpZmYtdHJlZSAtciAtLW5hbWUtb25seSAtLW5vLWNvbW1pdC1pZCBPUklHX0hFQUQgSEVBRClcIlxuXG5ydW5faWZfY2hhbmdlZCgpIHtcbiAgaWYgZWNobyBcIiRjaGFuZ2VkX2ZpbGVzXCIgfCBncmVwIC0tcXVpZXQgLUUgXCIkMVwiOyB0aGVuXG4gICAgZXZhbCBcIiQyXCJcbiAgZmlcbn1cbmAudHJpbSgpLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlTGVmdGhvb2soY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10gPSBbY29uZmlnXSk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlTGVmdGhvb2snLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgY29yZShjb25maWcsIGFsbENvbmZpZ3MpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29yZShjb25maWc6IFBhY2thZ2VDb25maWcsIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmxlZnRob29rJyk7XG4gIGNvbnN0IHsgbGludCB9ID0gZ2VuZXJhdGVTY3JpcHRzKGNvbmZpZywge30pO1xuICBjb25zdCBzZXR0aW5nczogUGFydGlhbDxMZWZ0aG9va1NldHRpbmdzPiA9IHtcbiAgICAuLi5iYXNlU2V0dGluZ3MsXG4gICAgJ3ByZS1jb21taXQnOiB7XG4gICAgICBqb2JzOiBnZXRQcmVDb21taXRKb2JzKGNvbmZpZyksXG4gICAgfSxcbiAgfTtcbiAgaWYgKCFsaW50KSB7XG4gICAgZGVsZXRlIHNldHRpbmdzWydwcmUtcHVzaCddO1xuICB9XG4gIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICBmc1V0aWwud3JpdGVGaWxlQ29uZmluZWQocGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAnbGVmdGhvb2sueW1sJyksIHlhbWwuZHVtcChzZXR0aW5ncywgeyBsaW5lV2lkdGg6IC0xIH0pKSxcbiAgICBmcy5wcm9taXNlcy5ybShkaXJQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSksXG4gIF0pO1xuXG4gIGlmIChsaW50KSB7XG4gICAgY29uc3QgcHJlUHVzaCA9IGdldFByZVB1c2hTY3JpcHQoY29uZmlnKTtcbiAgICBmcy5ta2RpclN5bmMocGF0aC5qb2luKGRpclBhdGgsICdwcmUtcHVzaCcpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKGRpclBhdGgsICdwcmUtcHVzaCcsICdjaGVjay5zaCcpLCBwcmVQdXNoICsgJ1xcbicsIHtcbiAgICAgIG1vZGU6IDBvNzU1LFxuICAgIH0pO1xuICB9XG4gIGNvbnN0IHBvc3RNZXJnZUNvbW1hbmQgPSBgJHtzY3JpcHRzLnBvc3RNZXJnZX1cXG5cXG4ke2dlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMoY29uZmlnLCBhbGxDb25maWdzKS5qb2luKCdcXG4nKX1cXG5gO1xuICBmcy5ta2RpclN5bmMoZGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ25vcm1hbGl6ZS1idW4tbG9ja2ZpbGUuc2gnKSwgc2NyaXB0cy5ub3JtYWxpemVCdW5Mb2NrZmlsZSArICdcXG4nLCB7XG4gICAgbW9kZTogMG83NTUsXG4gIH0pO1xuICBmcy5ta2RpclN5bmMocGF0aC5qb2luKGRpclBhdGgsICdwb3N0LW1lcmdlJyksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwb3N0LW1lcmdlJywgJ3ByZXBhcmUuc2gnKSwgcG9zdE1lcmdlQ29tbWFuZCwge1xuICAgIG1vZGU6IDBvNzU1LFxuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0UHJlUHVzaFNjcmlwdChjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICAvLyBCdW4gcmVwb3MgcmVjZWl2ZSB3YiBhcyBwYXJ0IG9mIHdiZnkncyBtYW5hZ2VkIHRvb2xjaGFpbiwgc28gZ2VuZXJhdGUgdGhlXG4gIC8vIGZpbmFsIGhvb2sgY29tbWFuZCBvbiB0aGUgZmlyc3QgcnVuIGluc3RlYWQgb2YgY2hhbmdpbmcgaXQgb24gdGhlIHNlY29uZC5cbiAgY29uc3QgcXVpZXRMaW50Q29tbWFuZCA9ICdidW4gd2IgbGludCAtLXF1aWV0JztcbiAgLy8gTm8gc2VwYXJhdGUgdHlwZWNoZWNrIHN0ZXAgbmVlZGVkIOKAlCB0aGUgbGludCBjb21tYW5kIGFscmVhZHkgaW5jbHVkZXMgdHlwZWNoZWNraW5nLlxuICBpZiAoY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKSkge1xuICAgIHJldHVybiBgXG4jIS9iaW4vYmFzaFxuXG5pZiBbICQoZ2l0IGJyYW5jaCAtLXNob3ctY3VycmVudCkgPSBcIm1haW5cIiBdICYmIFsgJChnaXQgY29uZmlnIHVzZXIuZW1haWwpICE9IFwiZXhrYXp1dUBnbWFpbC5jb21cIiBdOyB0aGVuXG4gIGVjaG8gXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIlxuICBlY2hvIFwiKioqIERvbid0IHB1c2ggbWFpbiBicmFuY2ggZGlyZWN0bHkuIFVzZSBQUiEgKioqXCJcbiAgZWNobyBcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiXG4gIGV4aXQgMVxuZmlcblxuJHtxdWlldExpbnRDb21tYW5kfVxuYC50cmltKCk7XG4gIH1cbiAgcmV0dXJuIHF1aWV0TGludENvbW1hbmQ7XG59XG5cbmZ1bmN0aW9uIGdldFByZUNvbW1pdEpvYnMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogTGVmdGhvb2tKb2JbXSB7XG4gIHJldHVybiBwcmVDb21taXRTZXR0aW5ncy5qb2JzXG4gICAgLmZpbHRlcigoam9iKSA9PiBqb2IubmFtZSAhPT0gJ3ZhbGlkYXRlLXJlbm92YXRlLWNvbmZpZycgfHwgY29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzKVxuICAgIC5tYXAoKGpvYikgPT5cbiAgICAgIGpvYi5uYW1lID09PSAnY2xlYW51cCdcbiAgICAgICAgPyB7XG4gICAgICAgICAgICAuLi5qb2IsXG4gICAgICAgICAgICBnbG9iOiBnZXRDbGVhbnVwR2xvYnMoY29uZmlnKSxcbiAgICAgICAgICAgIHJ1bjogZ2V0Q2xlYW51cENvbW1hbmQoY29uZmlnKSxcbiAgICAgICAgICB9XG4gICAgICAgIDogam9iXG4gICAgKTtcbn1cblxuZnVuY3Rpb24gZ2V0Q2xlYW51cEdsb2JzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIC8vIExldCBgd2IgbGludCAtLWZvcm1hdGAgZGVjaWRlIHdoZXRoZXIgUHJldHRpZXIgaXMgYXZhaWxhYmxlOyB0aGUgaG9va1xuICAvLyBzdGlsbCBuZWVkcyB0byB0cmlnZ2VyIHdoZW4gYWRkaW5nIHRoZSBmaXJzdCBwcmV0dGllci1vbmx5IGZpbGUuXG4gIGNvbnN0IHN1cHBvcnRlZEV4dGVuc2lvbnMgPSBbLi4uZXh0ZW5zaW9ucy5wcmV0dGllck9ubHldO1xuICBpZiAoZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKSkge1xuICAgIHN1cHBvcnRlZEV4dGVuc2lvbnMucHVzaCguLi5leHRlbnNpb25zLm94Zm10LCAuLi5leHRlbnNpb25zLm94bGludCk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2sgfHwgY29uZmlnLmRvZXNDb250YWluVXZMb2NrKSB7XG4gICAgc3VwcG9ydGVkRXh0ZW5zaW9ucy5wdXNoKCdweScpO1xuICB9XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgIHN1cHBvcnRlZEV4dGVuc2lvbnMucHVzaCgnZGFydCcpO1xuICB9XG4gIGNvbnN0IGZpbHRlcmVkRXh0ZW5zaW9ucyA9IFsuLi5uZXcgU2V0KHN1cHBvcnRlZEV4dGVuc2lvbnMpXS50b1NvcnRlZCgpO1xuICByZXR1cm4gYCoqLyoueyR7ZmlsdGVyZWRFeHRlbnNpb25zLmpvaW4oJywnKX19YDtcbn1cblxuZnVuY3Rpb24gZ2V0Q2xlYW51cENvbW1hbmQoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgaWYgKGhhc0xvY2FsV2JXb3Jrc3BhY2UoY29uZmlnKSkge1xuICAgIHJldHVybiBTdHJpbmcucmF3YFxuYnVuIHJ1biAtLWN3ZCBwYWNrYWdlcy93YiBzdGFydCAtLXdvcmtpbmctZGlyIFwiJChnaXQgcmV2LXBhcnNlIC0tc2hvdy10b3BsZXZlbClcIiBsaW50IC0tZml4IC0tZm9ybWF0IC0tIHtzdGFnZWRfZmlsZXN9XG5gLnRyaW0oKTtcbiAgfVxuICAvLyBQeXRob24tb25seSBCdW4gcmVwb3MgaW5zdGFsbCB3YiBmb3Igc2hhcmVkIHNjcmlwdHMgYnV0IG5vdCBPeGxpbnQsIHNvXG4gIC8vIHN0YWdlZC1maWxlIGhvb2tzIG11c3QgdXNlIHRoZSBsYW5ndWFnZS1zcGVjaWZpYyBmb3JtYXR0ZXIgcGF0aCBiZWxvdy5cbiAgY29uc3QgY2FuVXNlV2JGb3JTdGFnZWRGaWxlcyA9IGRvZXNDb250YWluSnNPclRzKGNvbmZpZykgfHwgZG9lc0NvbnRhaW5KYXZhKGNvbmZpZyk7XG4gIGlmIChjYW5Vc2VXYkZvclN0YWdlZEZpbGVzKSB7XG4gICAgcmV0dXJuIGBcbmJ1biB3YiBsaW50IC0tZml4IC0tZm9ybWF0IC0tIHtzdGFnZWRfZmlsZXN9XG5gLnRyaW0oKTtcbiAgfVxuXG4gIHJldHVybiBTdHJpbmcucmF3YFxucGFja2FnZV9qc29uX2ZpbGVzPVwiJChwcmludGYgJyVzXFxuJyB7c3RhZ2VkX2ZpbGVzfSB8IGdyZXAgLUUgJyhefC8pcGFja2FnZVxcLmpzb24kJyB8fCB0cnVlKVwiXG4ke2hhc1B5dGhvblBhY2thZ2VNYW5hZ2VyKGNvbmZpZykgPyBTdHJpbmcucmF3YHB5dGhvbl9maWxlcz1cIiQocHJpbnRmICclc1xcbicge3N0YWdlZF9maWxlc30gfCBncmVwIC1FICdcXC5weSQnIHx8IHRydWUpXCJgIDogJyd9XG4ke2NvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sID8gU3RyaW5nLnJhd2BkYXJ0X2ZpbGVzPVwiJChwcmludGYgJyVzXFxuJyB7c3RhZ2VkX2ZpbGVzfSB8IGdyZXAgLUUgJ1xcLmRhcnQkJyB8IGdyZXAgLXYgJ2dlbmVyYXRlZCcgfCBncmVwIC12ICdcXC5mcmVlemVkXFwuZGFydCQnIHwgZ3JlcCAtdiAnXFwuZ1xcLmRhcnQkJyB8fCB0cnVlKVwiYCA6ICcnfVxuXG5pZiBbIC1uIFwiJHBhY2thZ2VfanNvbl9maWxlc1wiIF07IHRoZW5cbiAgYnVuIHNvcnQtcGFja2FnZS1qc29uICRwYWNrYWdlX2pzb25fZmlsZXNcbmZpXG4ke1xuICBoYXNQeXRob25QYWNrYWdlTWFuYWdlcihjb25maWcpXG4gICAgPyBgaWYgWyAtbiBcIiRweXRob25fZmlsZXNcIiBdOyB0aGVuXG4gICR7Z2V0UHl0aG9uUnVubmVyKGNvbmZpZyl9IGlzb3J0IC0tcHJvZmlsZSBibGFjayAtLWZpbHRlci1maWxlcyAkcHl0aG9uX2ZpbGVzXG4gICR7Z2V0UHl0aG9uUnVubmVyKGNvbmZpZyl9IGJsYWNrICRweXRob25fZmlsZXNcbiAgJHtnZXRQeXRob25SdW5uZXIoY29uZmlnKX0gZmxha2U4ICRweXRob25fZmlsZXNcbmZpYFxuICAgIDogJydcbn1cbiR7XG4gIGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sXG4gICAgPyBgaWYgWyAtbiBcIiRkYXJ0X2ZpbGVzXCIgXTsgdGhlblxuICBkYXJ0IGZvcm1hdCAkZGFydF9maWxlc1xuZmlgXG4gICAgOiAnJ1xufVxuYC50cmltKCk7XG59XG5cbmZ1bmN0aW9uIGhhc0xvY2FsV2JXb3Jrc3BhY2UoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIGlmICghY29uZmlnLmlzUm9vdCkgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IGxvY2FsV2JQYWNrYWdlSnNvblBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdwYWNrYWdlcycsICd3YicsICdwYWNrYWdlLmpzb24nKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGxvY2FsV2JQYWNrYWdlSnNvblBhdGgpKSByZXR1cm4gZmFsc2U7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKGxvY2FsV2JQYWNrYWdlSnNvblBhdGgsICd1dGY4JykpIGFzIHsgbmFtZT86IHN0cmluZyB9O1xuICAgIHJldHVybiBwYWNrYWdlSnNvbi5uYW1lID09PSAnQHdpbGxib29zdGVyL3diJztcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHBvc3RNZXJnZUNvbW1hbmRzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCB0b29sc0NoYW5nZWRQYXR0ZXJuID0gU3RyaW5nLnJhd2AobWlzZVxcLnRvbWx8XFwubWlzZVxcLnRvbWwpYDtcbiAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiJHt0b29sc0NoYW5nZWRQYXR0ZXJufVwiIFwibWlzZSBpbnN0YWxsXCJgKTtcbiAgLy8gYG1pc2UgYWN0aXZhdGVgIHVwZGF0ZXMgUEFUSCBvbmx5IHdoZW4gdGhlIHByb21wdCBpcyBkcmF3biwgc28gdGhlIGhvb2sgaW5oZXJpdHMgdGhlIHRvb2xcbiAgLy8gdmVyc2lvbnMgcGlubmVkIGJlZm9yZSB0aGUgbWVyZ2U7IHJlZnJlc2ggUEFUSCBzbyBhIHB1bGxlZCBCdW4gcGluIGluc3RhbGxzIHdpdGggdGhhdCBCdW4uXG4gIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goJ2V2YWwgXCIkKG1pc2UgZW52IC1zIGJhc2gpXCInKTtcbiAgY29uc3QgaW5zdGFsbENvbW1hbmQgPSAnYnVuIGluc3RhbGwnO1xuICAvLyBEbyBOT1QgYWRkIGAudmluZXh0YCBoZXJlOiBpdCBob2xkcyBvbmx5IHZpbmV4dCdzIGNvbnRlbnQtaGFzaGVkIGZvbnQgY2FjaGUgYW5kIHRoZSBkZXZcbiAgLy8gc2VydmVyJ3MgbG9jayBmaWxlIChkZWxldGluZyB0aGUgbG9jayBkaXNhYmxlcyB0aGUgZHVwbGljYXRlLWRldi1zZXJ2ZXIgZ3VhcmQgZm9yIGEgcnVubmluZ1xuICAvLyBzZXJ2ZXIpLiB2aW5leHQncyBidWlsZCBvdXRwdXQgZ29lcyB0byBgZGlzdC9gLCBhbmQgVml0ZSdzIGRlcGVuZGVuY3kgY2FjaGUgaXMgaGFuZGxlZCBieVxuICAvLyB0aGUgc2VwYXJhdGUgaW5zdGFsbC1sYXlvdXQgaG9vayBiZWxvdy5cbiAgLy8gU2NhbiBldmVyeSB3b3Jrc3BhY2UgY29uZmlnIChub3QganVzdCB0aGUgcm9vdCk6IGluIGEgbW9ub3JlcG8gdGhlIGFwcCB1c3VhbGx5IGxpdmVzIGluXG4gIC8vIHBhY2thZ2VzLzxhcHA+IG9yIGFwcHMvPGFwcD4sIGFuZCB0aGUgY2FjaGUgZGlyZWN0b3JpZXMgYXJlIHdvcmtzcGFjZS1yZWxhdGl2ZS5cbiAgY29uc3QgbmV4dENhY2hlRGlyUGF0aHMgPSBjb2xsZWN0V29ya3NwYWNlUmVsYXRpdmVEaXJQYXRocyhcbiAgICBjb25maWcsXG4gICAgYWxsQ29uZmlncyxcbiAgICAod29ya3NwYWNlQ29uZmlnKSA9PiB3b3Jrc3BhY2VDb25maWcuZGVwZW5kaW5nLmJsaXR6IHx8IHdvcmtzcGFjZUNvbmZpZy5kZXBlbmRpbmcubmV4dCxcbiAgICAnLm5leHQnXG4gICk7XG4gIGNvbnN0IHJtTmV4dERpcmVjdG9yaWVzID1cbiAgICBuZXh0Q2FjaGVEaXJQYXRocy5sZW5ndGggPiAwID8gYCAmJiBybSAtUmYgLS0gJHtuZXh0Q2FjaGVEaXJQYXRocy5tYXAocXVvdGVGb3JFdmFsdWF0ZWRTaGVsbCkuam9pbignICcpfWAgOiAnJztcbiAgLy8gQnVuIGRvZXMgbm90IHJlbGluayBhbiBleGlzdGluZyBpc29sYXRlZCB0cmVlIHdoZW4gZ2xvYmFsU3RvcmUvbGlua2VyIHNldHRpbmdzIGNoYW5nZS4gSW5zcGVjdFxuICAvLyB0aG9zZSBrZXlzIHJhdGhlciB0aGFuIGV2ZXJ5IGJ1bmZpZyBjaGFuZ2U6IG1pbmltdW1SZWxlYXNlQWdlIHVwZGF0ZXMgbXVzdCBub3QgZGVzdHJveSBhXG4gIC8vIGNvbnRyaWJ1dG9yJ3Mgd29ya2luZyBpbnN0YWxsIGJlZm9yZSBhIHBvdGVudGlhbGx5IG5ldHdvcmstZGVwZW5kZW50IHJlcGxhY2VtZW50IHN1Y2NlZWRzLlxuICBjb25zdCBub2RlTW9kdWxlc0RpclBhdGhzID0gY29sbGVjdFdvcmtzcGFjZVJlbGF0aXZlRGlyUGF0aHMoY29uZmlnLCBhbGxDb25maWdzLCAoKSA9PiB0cnVlLCAnbm9kZV9tb2R1bGVzJyk7XG4gIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goXG4gICAgU3RyaW5nLnJhd2BpZiBnaXQgZGlmZiAtLW5vLWNvbG9yIC1VMCBPUklHX0hFQUQgSEVBRCAtLSAnKmJ1bmZpZy50b21sJyB8IGdyZXAgLS1xdWlldCAtRSAnXlsrLV0gKihnbG9iYWxTdG9yZXxsaW5rZXJ8cHVibGljSG9pc3RQYXR0ZXJuKSc7IHRoZW4gcm0gLVJmIC0tICR7bm9kZU1vZHVsZXNEaXJQYXRocy5tYXAocXVvdGVGb3JTaGVsbCkuam9pbignICcpfTsgZmlgXG4gICk7XG4gIC8vIGJ1bi5sb2NrLW9ubHkgbWVyZ2VzIChSZW5vdmF0ZSBsb2NrZmlsZSBtYWludGVuYW5jZSksIGJ1bmZpZy50b21sIC8gLm5wbXJjIGNoYW5nZXMgKGxpbmtlcixcbiAgLy8gcmVnaXN0cnksIGhvaXN0aW5nKSwgYW5kIHBhdGNoIGVkaXRzIGFsbCBjaGFuZ2UgdGhlIGluc3RhbGxlZCB0cmVlIHdpdGhvdXQgdG91Y2hpbmcgcGFja2FnZS5qc29uLlxuICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFxuICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIocGFja2FnZVxcLmpzb258YnVuXFwubG9ja3xidW5maWdcXC50b21sfFxcLm5wbXJjfHBhdGNoZXMvKVwiIFwiJHtpbnN0YWxsQ29tbWFuZH0ke3JtTmV4dERpcmVjdG9yaWVzfVwiYFxuICApO1xuICAvLyBWaXRlJ3MgZGVwZW5kZW5jeSBjYWNoZSBpbiBub2RlX21vZHVsZXMvLnZpdGUgc2VsZi1pbnZhbGlkYXRlcyBvbiBsb2NrZmlsZSAvIHBhdGNoZXMgL1xuICAvLyBjb25maWcgLyBOT0RFX0VOViBjaGFuZ2VzIChzZWUgVml0ZSdzIGRlcCBwcmUtYnVuZGxpbmcgZG9jcyksIHNvIHRoZSByZXNpZHVhbCBzdGFsZSBjYXNlIGlzXG4gIC8vIGluc3RhbGwtbGF5b3V0IGNoYW5nZXMgKGJ1bmZpZy50b21sIGxpbmtlciwgLm5wbXJjKTogdGhleSBjaGFuZ2UgdGhlIGluc3RhbGxlZCB0cmVlIHdpdGhvdXRcbiAgLy8gdG91Y2hpbmcgdGhlIGxvY2tmaWxlLCBhbmQgdGhleSBhcmUgYWJzZW50IGZyb20gVml0ZSdzIGNhY2hlIGtleS5cbiAgY29uc3Qgcm1WaXRlQ2FjaGVEaXJlY3RvcmllcyA9IGNvbGxlY3RXb3Jrc3BhY2VSZWxhdGl2ZURpclBhdGhzKFxuICAgIGNvbmZpZyxcbiAgICBhbGxDb25maWdzLFxuICAgICh3b3Jrc3BhY2VDb25maWcpID0+IHdvcmtzcGFjZUNvbmZpZy5kZXBlbmRpbmcudmluZXh0IHx8IHdvcmtzcGFjZUNvbmZpZy5kZXBlbmRpbmcudml0ZSxcbiAgICAnbm9kZV9tb2R1bGVzLy52aXRlJ1xuICApO1xuICBpZiAocm1WaXRlQ2FjaGVEaXJlY3Rvcmllcy5sZW5ndGggPiAwKSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIoYnVuZmlnXFwudG9tbHxcXC5ucG1yYylcIiBcInJtIC1SZiAtLSAke3JtVml0ZUNhY2hlRGlyZWN0b3JpZXMubWFwKHF1b3RlRm9yRXZhbHVhdGVkU2hlbGwpLmpvaW4oJyAnKX1cImBcbiAgICApO1xuICB9XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrKSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwicG9ldHJ5XFwubG9ja1wiIFwicG9ldHJ5IGluc3RhbGxcImApO1xuICB9XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5VdkxvY2spIHtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCJ1dlxcLmxvY2tcIiBcInV2IHN5bmMgLS1mcm96ZW5cImApO1xuICB9XG4gIC8vIEJsaXR6IHJlcG9zaXRvcmllcyBkZWxpYmVyYXRlbHkgZ2V0IHRoZSBzYW1lIHdiLWRyaXZlbiBwcmlzbWEgY29tbWFuZHMgYXMgZXZlcnlvbmUgZWxzZTpcbiAgLy8gdGhlIGJsaXR6IENMSSdzIGNvZGVnZW4gcGF0Y2hlcyB0aGUgaW5zdGFsbGVkIG5leHQgcGFja2FnZSBpbiBwbGFjZSwgd2hpY2ggbXVzdCBuZXZlciBydW5cbiAgLy8gdW5kZXIgQnVuJ3Mgc2hhcmVkIGdsb2JhbCBzdG9yZS4gWWFybi1lcmEgQmxpdHogcmVwb3MgZ2V0IHRoZWlyIHJvdXRlIG1hbmlmZXN0IGZyb21cbiAgLy8gYHdiIGdlbi1jb2RlYCdzIGBibGl0eiBjb2RlZ2VuYCBzdGVwLCBhbmQgY3VycmVudCB3YiByb3V0ZXMgb25seSBgd2IgcHJpc21hIHNlZWRgIHRocm91Z2hcbiAgLy8gdGhlIGJsaXR6IENMSSwgb25seSBmb3Igbm9uLUJ1biByZXBvcyAoc2VlIHBhY2thZ2VzL3diL3NyYy9zY3JpcHRzL3ByaXNtYVNjcmlwdHMudHMpOyB0aGVcbiAgLy8gcG9zdC1tZXJnZSBob29rcyBzdGF5IHdiLWRyaXZlbiBiZWNhdXNlIGBwcmlzbWEgZGVwbG95YC9gZ2VuZXJhdGVgIG5lZWQgbm8gYmxpdHogbG9hZGVyLlxuICBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEpIHtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIi4qXFwucHJpc21hXCIgXCJidW4gd2IgcHJpc21hIGRlcGxveVwiYCxcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIuKlxcLnByaXNtYVwiIFwiYnVuIHdiIHByaXNtYSBnZW5lcmF0ZVwiYFxuICAgICk7XG4gIH1cbiAgY29uc3QgZ2VuSTE4blRzQ29tbWFuZCA9IGdldEdlbkkxOG5Uc0NvbW1hbmQoY29uZmlnLCBjb25maWcucGFja2FnZUpzb24/LnNjcmlwdHMpO1xuICBpZiAoZ2VuSTE4blRzQ29tbWFuZCkge1xuICAgIC8vIGdlbi1pMThuLXRzIG91dHB1dHMgYXJlIGNvbW1vbmx5IGlnbm9yZWQsIHNvIHBvc3QtbWVyZ2UgcmVnZW5lcmF0ZXMgdGhlbSBhZnRlciBwdWxsZWQgcmVzb3VyY2UgY2hhbmdlcy5cbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIoXnwvKWkxOG4vLipcXC5qc29uJFwiIFwiJHtnZW5JMThuVHNDb21tYW5kfVwiYCk7XG4gIH1cbiAgcmV0dXJuIHBvc3RNZXJnZUNvbW1hbmRzO1xufVxuXG4vLyBUaGUgZ2VuZXJhdGVkIGNvbW1hbmQgcGFzc2VzIHRocm91Z2ggVFdPIHNoZWxsIHBhcnNpbmcgc3RhZ2VzOiB0aGUgcHJlcGFyZS5zaCBsaW5lIHBhcnNlcyBpdCBhc1xuLy8gYSBkb3VibGUtcXVvdGVkIGFyZ3VtZW50IChwcm9jZXNzaW5nIFxcLCBgLCAkIGFuZCBcIiBpbW1lZGlhdGVseSksIGFuZCBydW5faWZfY2hhbmdlZCB0aGVuIGV2YWwnc1xuLy8gaXQgKHdvcmQtc3BsaXR0aW5nIGFuZCBnbG9iYmluZykuIEFuIHVucXVvdGVkIHBhdGggY29udGFpbmluZyBzcGFjZXMgKGUuZy4gYGFwcHMvbXkgYXBwLy5uZXh0YClcbi8vIHdvdWxkIHdvcmQtc3BsaXQgaW50byB1bnJlbGF0ZWQgcm0gdGFyZ2V0cywgYW5kIGAkYC9iYWNrdGljayB3b3VsZCBleHBhbmQgYXQgdGhlIGZpcnN0IHN0YWdlLlxuLy8gU286IHF1b3RlIGZvciB0aGUgZXZhbCBzdGFnZSDigJQgYHF1b3RlRm9yU2hlbGxgIGxlYXZlcyBvbmx5IHdvcmRzIHRoYXQgY2Fycnkgbm8gc2hlbGwgbWVhbmluZ1xuLy8gdW5xdW90ZWQg4oCUIHRoZW4gYmFja3NsYXNoLWVzY2FwZSB0aGUgZG91YmxlLXF1b3RlLWNvbnRleHQgc3BlY2lhbHMuXG5mdW5jdGlvbiBxdW90ZUZvckV2YWx1YXRlZFNoZWxsKGZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBldmFsUXVvdGVkID0gcXVvdGVGb3JTaGVsbChmaWxlUGF0aCk7XG4gIHJldHVybiBldmFsUXVvdGVkLnJlcGxhY2VBbGwoL1tcXFxcYCRcIl0vZ3UsIFN0cmluZy5yYXdgXFwkJmApO1xufVxuXG4vKipcbiAqIFRoZSB3b3Jrc3BhY2UtcmVsYXRpdmUgZGlyZWN0b3JpZXMgKHJvb3QgZmlyc3QsIGRlZHVwbGljYXRlZCwgYDxzdWJEaXJOYW1lPmAgYXBwZW5kZWQpIG9mIGV2ZXJ5XG4gKiB3b3Jrc3BhY2Ugd2hvc2UgY29uZmlnIG1hdGNoZXMgdGhlIHByZWRpY2F0ZS4gVGhlIGhvb2sgc2NyaXB0IHJ1bnMgYXQgdGhlIHJlcG9zaXRvcnkgcm9vdCwgc29cbiAqIHBhdGhzIGFyZSByZWxhdGl2ZSB0byB0aGUgcm9vdCBjb25maWcncyBkaXJlY3RvcnkuXG4gKi9cbmZ1bmN0aW9uIGNvbGxlY3RXb3Jrc3BhY2VSZWxhdGl2ZURpclBhdGhzKFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10sXG4gIHByZWRpY2F0ZTogKGNvbmZpZzogUGFja2FnZUNvbmZpZykgPT4gYm9vbGVhbixcbiAgc3ViRGlyTmFtZTogc3RyaW5nXG4pOiBzdHJpbmdbXSB7XG4gIHJldHVybiBbXG4gICAgLi4ubmV3IFNldChcbiAgICAgIGFsbENvbmZpZ3NcbiAgICAgICAgLmZpbHRlcigoY29uZmlnKSA9PiBwcmVkaWNhdGUoY29uZmlnKSlcbiAgICAgICAgLm1hcCgoY29uZmlnKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVsYXRpdmVEaXJQYXRoID0gcGF0aC5yZWxhdGl2ZShyb290Q29uZmlnLmRpclBhdGgsIGNvbmZpZy5kaXJQYXRoKS5yZXBsYWNlQWxsKCdcXFxcJywgJy8nKTtcbiAgICAgICAgICByZXR1cm4gcmVsYXRpdmVEaXJQYXRoID8gcGF0aC5wb3NpeC5qb2luKHJlbGF0aXZlRGlyUGF0aCwgc3ViRGlyTmFtZSkgOiBzdWJEaXJOYW1lO1xuICAgICAgICB9KVxuICAgICksXG4gIF0udG9Tb3J0ZWQoKTtcbn1cblxuZnVuY3Rpb24gaGFzUHl0aG9uUGFja2FnZU1hbmFnZXIoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIHJldHVybiBjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrIHx8IGNvbmZpZy5kb2VzQ29udGFpblV2TG9jaztcbn1cblxuZnVuY3Rpb24gZ2V0UHl0aG9uUnVubmVyKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6ICdwb2V0cnkgcnVuJyB8ICd1diBydW4nIHtcbiAgcmV0dXJuIGNvbmZpZy5kb2VzQ29udGFpblV2TG9jayA/ICd1diBydW4nIDogJ3BvZXRyeSBydW4nO1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUNvbmZpZ0NvbnRlbnQoY29udGVudDogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGNvbnRlbnQ/LnRyaW0oKTtcbn1cbiIsImltcG9ydCB7IGVzY2FwZVJlZ0V4cCB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliL3NyYyc7XG5leHBvcnQgdHlwZSBDb25maWdCbG9ja05hbWUgPSAnYmFzZScgfCAnZXhwb3J0JztcblxuaW50ZXJmYWNlIE1hbmFnZWRDb25maWdCbG9ja3NPcHRpb25zIHtcbiAgYmxvY2tOYW1lczogcmVhZG9ubHkgQ29uZmlnQmxvY2tOYW1lW107XG4gIG1hcmtlclByZWZpeDogc3RyaW5nO1xuICB0b29sTmFtZTogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgR2V0Q29uZmlnQ29udGVudE9wdGlvbnMge1xuICBkZXNpcmVkQ29udGVudDogc3RyaW5nO1xuICBleGlzdGluZ0NvbnRlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgZmlsZVBhdGg6IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIE1hbmFnZWRDb25maWdCbG9ja3Mge1xuICBwcml2YXRlIHJlYWRvbmx5IGJsb2NrTmFtZXM6IHJlYWRvbmx5IENvbmZpZ0Jsb2NrTmFtZVtdO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgbWFya2VyUHJlZml4OiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSByZWFkb25seSB0b29sTmFtZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IE1hbmFnZWRDb25maWdCbG9ja3NPcHRpb25zKSB7XG4gICAgdGhpcy5ibG9ja05hbWVzID0gb3B0aW9ucy5ibG9ja05hbWVzO1xuICAgIHRoaXMubWFya2VyUHJlZml4ID0gb3B0aW9ucy5tYXJrZXJQcmVmaXg7XG4gICAgdGhpcy50b29sTmFtZSA9IG9wdGlvbnMudG9vbE5hbWU7XG4gIH1cblxuICBnZXRDb25maWdDb250ZW50KG9wdGlvbnM6IEdldENvbmZpZ0NvbnRlbnRPcHRpb25zKTogc3RyaW5nIHtcbiAgICBpZiAoIW9wdGlvbnMuZXhpc3RpbmdDb250ZW50KSByZXR1cm4gb3B0aW9ucy5kZXNpcmVkQ29udGVudDtcbiAgICBpZiAodGhpcy5oYXNNYW5hZ2VkQmxvY2tzKG9wdGlvbnMuZXhpc3RpbmdDb250ZW50KSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVwbGFjZU1hbmFnZWRCbG9ja3Mob3B0aW9ucy5leGlzdGluZ0NvbnRlbnQsIG9wdGlvbnMuZGVzaXJlZENvbnRlbnQsIG9wdGlvbnMuZmlsZVBhdGgpO1xuICAgIH1cbiAgICByZXR1cm4gb3B0aW9ucy5kZXNpcmVkQ29udGVudDtcbiAgfVxuXG4gIGdldEJsb2NrKGJsb2NrTmFtZTogQ29uZmlnQmxvY2tOYW1lLCBjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLmdldFN0YXJ0TWFya2VyKGJsb2NrTmFtZSl9XG4ke2NvbnRlbnR9XG4ke3RoaXMuZ2V0RW5kTWFya2VyKGJsb2NrTmFtZSl9YDtcbiAgfVxuXG4gIGhhc01hbmFnZWRCbG9ja3MoY29udGVudDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuYmxvY2tOYW1lcy5zb21lKChibG9ja05hbWUpID0+IGNvbnRlbnQuaW5jbHVkZXModGhpcy5nZXRTdGFydE1hcmtlcihibG9ja05hbWUpKSk7XG4gIH1cblxuICBwcml2YXRlIHJlcGxhY2VNYW5hZ2VkQmxvY2tzKGV4aXN0aW5nQ29udGVudDogc3RyaW5nLCBkZXNpcmVkQ29udGVudDogc3RyaW5nLCBmaWxlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBsZXQgY29udGVudCA9IGV4aXN0aW5nQ29udGVudDtcbiAgICBmb3IgKGNvbnN0IGJsb2NrTmFtZSBvZiB0aGlzLmJsb2NrTmFtZXMpIHtcbiAgICAgIGNvbnN0IHJlcGxhY2VtZW50ID0gdGhpcy5leHRyYWN0TWFuYWdlZEJsb2NrKGRlc2lyZWRDb250ZW50LCBibG9ja05hbWUpO1xuICAgICAgaWYgKCFyZXBsYWNlbWVudCkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IG5leHRDb250ZW50ID0gdGhpcy5yZXBsYWNlTWFuYWdlZEJsb2NrKGNvbnRlbnQsIGJsb2NrTmFtZSwgcmVwbGFjZW1lbnQpO1xuICAgICAgaWYgKCFuZXh0Q29udGVudCkge1xuICAgICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgdXBkYXRpbmcgaW5jb21wbGV0ZSAke2Jsb2NrTmFtZX0gYmxvY2sgaW4gJHt0aGlzLnRvb2xOYW1lfSBjb25maWc6ICR7ZmlsZVBhdGh9YCk7XG4gICAgICAgIHJldHVybiBleGlzdGluZ0NvbnRlbnQ7XG4gICAgICB9XG4gICAgICBjb250ZW50ID0gbmV4dENvbnRlbnQ7XG4gICAgfVxuICAgIHJldHVybiBjb250ZW50O1xuICB9XG5cbiAgcHJpdmF0ZSBleHRyYWN0TWFuYWdlZEJsb2NrKGNvbnRlbnQ6IHN0cmluZywgYmxvY2tOYW1lOiBDb25maWdCbG9ja05hbWUpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmdldE1hbmFnZWRCbG9ja1JlZ0V4cChibG9ja05hbWUpLmV4ZWMoY29udGVudCk/LlswXTtcbiAgfVxuXG4gIHByaXZhdGUgcmVwbGFjZU1hbmFnZWRCbG9jayhjb250ZW50OiBzdHJpbmcsIGJsb2NrTmFtZTogQ29uZmlnQmxvY2tOYW1lLCByZXBsYWNlbWVudDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBwYXR0ZXJuID0gdGhpcy5nZXRNYW5hZ2VkQmxvY2tSZWdFeHAoYmxvY2tOYW1lKTtcbiAgICBpZiAoIXBhdHRlcm4udGVzdChjb250ZW50KSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gY29udGVudC5yZXBsYWNlKHBhdHRlcm4sIHJlcGxhY2VtZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TWFuYWdlZEJsb2NrUmVnRXhwKGJsb2NrTmFtZTogQ29uZmlnQmxvY2tOYW1lKTogUmVnRXhwIHtcbiAgICByZXR1cm4gbmV3IFJlZ0V4cChcbiAgICAgIGAke2VzY2FwZVJlZ0V4cCh0aGlzLmdldFN0YXJ0TWFya2VyKGJsb2NrTmFtZSkpfVtcXFxcc1xcXFxTXSo/JHtlc2NhcGVSZWdFeHAodGhpcy5nZXRFbmRNYXJrZXIoYmxvY2tOYW1lKSl9YFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGdldFN0YXJ0TWFya2VyKGJsb2NrTmFtZTogQ29uZmlnQmxvY2tOYW1lKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYC8vIHdiZnk6c3RhcnQgJHt0aGlzLm1hcmtlclByZWZpeH0tJHtibG9ja05hbWV9YDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RW5kTWFya2VyKGJsb2NrTmFtZTogQ29uZmlnQmxvY2tOYW1lKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYC8vIHdiZnk6ZW5kICR7dGhpcy5tYXJrZXJQcmVmaXh9LSR7YmxvY2tOYW1lfWA7XG4gIH1cbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyByZXNvbHZlV2lsbGJvb3N0ZXJDb25maWdNb2R1bGUgfSBmcm9tICcuLi91dGlscy93aWxsYm9vc3RlckNvbmZpZ3NVdGlsLmpzJztcblxuaW1wb3J0IHsgbm9ybWFsaXplQ29uZmlnQ29udGVudCB9IGZyb20gJy4vY29uZmlnQ29udGVudC5qcyc7XG5pbXBvcnQgeyBNYW5hZ2VkQ29uZmlnQmxvY2tzIH0gZnJvbSAnLi9tYW5hZ2VkQ29uZmlnQmxvY2suanMnO1xuXG5jb25zdCBtYW5hZ2VkQ29uZmlnQmxvY2tzID0gbmV3IE1hbmFnZWRDb25maWdCbG9ja3Moe1xuICBibG9ja05hbWVzOiBbJ2Jhc2UnLCAnZXhwb3J0J10sXG4gIG1hcmtlclByZWZpeDogJ294Zm10JyxcbiAgdG9vbE5hbWU6ICdveGZtdCcsXG59KTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlT3hmbXRDb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVPeGZtdENvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ294Zm10LmNvbmZpZy50cycpO1xuICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgICBjb25zdCBkZXNpcmVkQ29udGVudCA9IG1hbmFnZWRDb25maWdCbG9ja3MuZ2V0Q29uZmlnQ29udGVudCh7XG4gICAgICBkZXNpcmVkQ29udGVudDogZ2V0Q29uZmlnQ29udGVudChjb25maWcpLFxuICAgICAgZXhpc3RpbmdDb250ZW50LFxuICAgICAgZmlsZVBhdGgsXG4gICAgfSk7XG4gICAgaWYgKG5vcm1hbGl6ZUNvbmZpZ0NvbnRlbnQoZXhpc3RpbmdDb250ZW50KSAhPT0gbm9ybWFsaXplQ29uZmlnQ29udGVudChkZXNpcmVkQ29udGVudCkpIHtcbiAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGRlc2lyZWRDb250ZW50KTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRDb25maWdDb250ZW50KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIGNvbnN0IG94Zm10QmFzZUNvbmZpZ01vZHVsZSA9IHJlc29sdmVXaWxsYm9vc3RlckNvbmZpZ01vZHVsZShjb25maWcsICdAd2lsbGJvb3N0ZXIvb3hmbXQtY29uZmlnJyk7XG5cbiAgLy8gQ29tbW9uSlMgcGFja2FnZXMgbmVlZCByZXF1aXJlL21vZHVsZS5leHBvcnRzIGhlcmU6IG94Zm10IGNvbmZpZyBmaWxlcyBhcmVcbiAgLy8gb25seSBhdXRvLWRpc2NvdmVyZWQgYXMgLnRzLCBhbmQgdGhlIHNoYXJlZCBjb25maWcgcGFja2FnZSBpcyBFU00tb25seS5cbiAgLy8gTm8gLy8vIDxyZWZlcmVuY2UgdHlwZXM+IGxpbmU6IHRoZSB3YmZ5LWdlbmVyYXRlZCB0c2NvbmZpZyBhbHJlYWR5IGNvdmVycyAqLmNvbmZpZy50cyB3aXRoXG4gIC8vIHR5cGVzIFtcImJ1blwiXSwgd2hpY2ggdHlwZXMgcmVxdWlyZS9tb2R1bGUuZXhwb3J0cywgd2hpbGUgYSBcIm5vZGVcIiByZWZlcmVuY2UgYnJlYWtzIHVuZGVyXG4gIC8vIEJ1bidzIGlzb2xhdGVkIGxpbmtlciB3aGVyZSB0aGUgdW5kZWNsYXJlZCBAdHlwZXMvbm9kZSBpcyB1bnJlc29sdmFibGUgKFRTMjY4OCkuXG4gIGlmICghY29uZmlnLmlzRXNtUGFja2FnZSkge1xuICAgIHJldHVybiBgJHttYW5hZ2VkQ29uZmlnQmxvY2tzLmdldEJsb2NrKFxuICAgICAgJ2Jhc2UnLFxuICAgICAgYGltcG9ydCB0eXBlIHsgT3hmbXRDb25maWcgfSBmcm9tICdveGZtdCc7XG5cbi8vIG94bGludC1kaXNhYmxlIHVuaWNvcm4vcHJlZmVyLW1vZHVsZSAtLSBPeGZtdCBjb25maWcgZmlsZXMgYXJlIG9ubHkgYXV0by1kaXNjb3ZlcmVkIGFzIC50cywgYW5kIENvbW1vbkpTIGF2b2lkcyBFU00gcGFja2FnZSBsb2FkaW5nIGlzc3Vlcy5cbmNvbnN0IG94Zm10Q29uZmlnID0gcmVxdWlyZSgnJHtveGZtdEJhc2VDb25maWdNb2R1bGV9Jyk7XG5cbmNvbnN0IG94Zm10UmVzb2x2ZWRDb25maWc6IE94Zm10Q29uZmlnID0gb3hmbXRDb25maWcuZGVmYXVsdCA/PyBveGZtdENvbmZpZztgXG4gICAgKX1cblxuJHttYW5hZ2VkQ29uZmlnQmxvY2tzLmdldEJsb2NrKCdleHBvcnQnLCAnbW9kdWxlLmV4cG9ydHMgPSBveGZtdFJlc29sdmVkQ29uZmlnOycpfVxuYDtcbiAgfVxuXG4gIHJldHVybiBgJHttYW5hZ2VkQ29uZmlnQmxvY2tzLmdldEJsb2NrKFxuICAgICdiYXNlJyxcbiAgICBgaW1wb3J0IHR5cGUgeyBPeGZtdENvbmZpZyB9IGZyb20gJ294Zm10JztcblxuaW1wb3J0IGNvbmZpZyBmcm9tICcke294Zm10QmFzZUNvbmZpZ01vZHVsZX0nO1xuXG5jb25zdCBveGZtdFJlc29sdmVkQ29uZmlnOiBPeGZtdENvbmZpZyA9IGNvbmZpZztgXG4gICl9XG5cbiR7bWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRCbG9jaygnZXhwb3J0JywgJ2V4cG9ydCBkZWZhdWx0IG94Zm10UmVzb2x2ZWRDb25maWc7Jyl9XG5gO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7XG4gIGlzUHVibGlzaGVkV2lsbGJvb3N0ZXJDb25maWdzUGFja2FnZSxcbiAgcmVzb2x2ZVdpbGxib29zdGVyQ29uZmlnTW9kdWxlLFxufSBmcm9tICcuLi91dGlscy93aWxsYm9vc3RlckNvbmZpZ3NVdGlsLmpzJztcblxuaW1wb3J0IHsgbm9ybWFsaXplQ29uZmlnQ29udGVudCB9IGZyb20gJy4vY29uZmlnQ29udGVudC5qcyc7XG5pbXBvcnQgeyBNYW5hZ2VkQ29uZmlnQmxvY2tzIH0gZnJvbSAnLi9tYW5hZ2VkQ29uZmlnQmxvY2suanMnO1xuXG5jb25zdCBtYW5hZ2VkQ29uZmlnQmxvY2tzID0gbmV3IE1hbmFnZWRDb25maWdCbG9ja3Moe1xuICBibG9ja05hbWVzOiBbJ2Jhc2UnLCAnZXhwb3J0J10sXG4gIG1hcmtlclByZWZpeDogJ294bGludCcsXG4gIHRvb2xOYW1lOiAnb3hsaW50Jyxcbn0pO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVPeGxpbnRDb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBfcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlT3hsaW50Q29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIC8vIHdpbGxib29zdGVyLWNvbmZpZ3MgcHVibGlzaGVzIGNvbmZpZyBmaWxlcyBhcyBwcm9kdWN0IGNvZGUsIHNvIGdlbmVyYXRpb25cbiAgICAvLyBtdXN0IG5vdCByZXBsYWNlIHBhY2thZ2UtcHJvdmlkZWQgbGludGVyIHNldHRpbmdzLiBHZW5lcmF0ZWQgZmlsZXMgd2l0aFxuICAgIC8vIG1hbmFnZWQgYmxvY2tzIGFyZSBzdGlsbCBzYWZlIHRvIHVwZGF0ZS5cbiAgICBjb25zdCBzaG91bGRQcmVzZXJ2ZVB1Ymxpc2hlZExpbnRlckNvbmZpZyA9IGlzUHVibGlzaGVkV2lsbGJvb3N0ZXJDb25maWdzUGFja2FnZShjb25maWcpO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnb3hsaW50LmNvbmZpZy50cycpO1xuICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgICBjb25zdCBzaG91bGRQcmVzZXJ2ZUV4aXN0aW5nQ29udGVudCA9XG4gICAgICBzaG91bGRQcmVzZXJ2ZVB1Ymxpc2hlZExpbnRlckNvbmZpZyAmJiBleGlzdGluZ0NvbnRlbnQgJiYgIW1hbmFnZWRDb25maWdCbG9ja3MuaGFzTWFuYWdlZEJsb2NrcyhleGlzdGluZ0NvbnRlbnQpO1xuICAgIGNvbnN0IGRlc2lyZWRDb250ZW50ID0gc2hvdWxkUHJlc2VydmVFeGlzdGluZ0NvbnRlbnRcbiAgICAgID8gZXhpc3RpbmdDb250ZW50XG4gICAgICA6IG1hbmFnZWRDb25maWdCbG9ja3MuZ2V0Q29uZmlnQ29udGVudCh7XG4gICAgICAgICAgZGVzaXJlZENvbnRlbnQ6IGdldENvbmZpZ0NvbnRlbnQoY29uZmlnKSxcbiAgICAgICAgICBleGlzdGluZ0NvbnRlbnQsXG4gICAgICAgICAgZmlsZVBhdGgsXG4gICAgICAgIH0pO1xuXG4gICAgaWYgKG5vcm1hbGl6ZUNvbmZpZ0NvbnRlbnQoZXhpc3RpbmdDb250ZW50KSAhPT0gbm9ybWFsaXplQ29uZmlnQ29udGVudChkZXNpcmVkQ29udGVudCkpIHtcbiAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGRlc2lyZWRDb250ZW50KTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRDb25maWdDb250ZW50KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIGNvbnN0IGlzUm9vdENvbmZpZyA9IGNvbmZpZy5pc1Jvb3Q7XG4gIGNvbnN0IG94bGludEJhc2VDb25maWdNb2R1bGUgPSByZXNvbHZlV2lsbGJvb3N0ZXJDb25maWdNb2R1bGUoY29uZmlnLCAnQHdpbGxib29zdGVyL294bGludC1jb25maWcnKTtcblxuICAvLyBEbyBub3QgY29sbGFwc2UgdGhpcyB0byBhIHN0YXRpYyBpbXBvcnQgZm9yIGV2ZXJ5IHBhY2thZ2UuIENvbW1vbkpTIHBhY2thZ2VzXG4gIC8vIHR5cGUtY2hlY2sgYXV0by1kaXNjb3ZlcmVkIG94bGludC5jb25maWcudHMgYXMgQ29tbW9uSlMsIHNvIGltcG9ydGluZyB0aGUgRVNNXG4gIC8vIEB3aWxsYm9vc3Rlci9veGxpbnQtY29uZmlnIHBhY2thZ2UgdHJpZ2dlcnMgVFMxNDc5LiBLZWVwIHRoaXMgaW4gc3luYyB3aXRoXG4gIC8vIGxpdGVyYWN5LXRlc3QncyBnZW5lcmF0ZWQgY29uZmlnIHBhdHRlcm4uXG4gIC8vIE5vIC8vLyA8cmVmZXJlbmNlIHR5cGVzPiBsaW5lOiB0aGUgd2JmeS1nZW5lcmF0ZWQgdHNjb25maWcgYWxyZWFkeSBjb3ZlcnMgKi5jb25maWcudHMgd2l0aFxuICAvLyB0eXBlcyBbXCJidW5cIl0sIHdoaWNoIHR5cGVzIHJlcXVpcmUvbW9kdWxlLmV4cG9ydHMsIHdoaWxlIGEgXCJub2RlXCIgcmVmZXJlbmNlIGJyZWFrcyB1bmRlclxuICAvLyBCdW4ncyBpc29sYXRlZCBsaW5rZXIgd2hlcmUgdGhlIHVuZGVjbGFyZWQgQHR5cGVzL25vZGUgaXMgdW5yZXNvbHZhYmxlIChUUzI2ODgpLlxuICBpZiAoIWNvbmZpZy5pc0VzbVBhY2thZ2UpIHtcbiAgICByZXR1cm4gYCR7bWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRCbG9jayhcbiAgICAgICdiYXNlJyxcbiAgICAgIGBpbXBvcnQgdHlwZSB7IE94bGludENvbmZpZyB9IGZyb20gJ294bGludCc7XG5cbi8vIG94bGludC1kaXNhYmxlIHVuaWNvcm4vcHJlZmVyLW1vZHVsZSAtLSBPeGxpbnQgb25seSBhdXRvLWRpc2NvdmVycyAudHMgY29uZmlnIGZpbGVzLCBhbmQgQ29tbW9uSlMgYXZvaWRzIEVTTSBwYWNrYWdlIGxvYWRpbmcgaXNzdWVzLlxuY29uc3Qgb3hsaW50QmFzZUNvbmZpZyA9IHJlcXVpcmUoJyR7b3hsaW50QmFzZUNvbmZpZ01vZHVsZX0nKTtcblxuJHtnZXRSZXNvbHZlZENvbmZpZ0NvbnRlbnQoJ294bGludEJhc2VDb25maWcuZGVmYXVsdCA/PyBveGxpbnRCYXNlQ29uZmlnJywgaXNSb290Q29uZmlnKX1gXG4gICAgKX1cblxuJHttYW5hZ2VkQ29uZmlnQmxvY2tzLmdldEJsb2NrKCdleHBvcnQnLCAnbW9kdWxlLmV4cG9ydHMgPSBveGxpbnRSZXNvbHZlZENvbmZpZzsnKX1cbmA7XG4gIH1cblxuICByZXR1cm4gYCR7bWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRCbG9jayhcbiAgICAnYmFzZScsXG4gICAgYGltcG9ydCB0eXBlIHsgT3hsaW50Q29uZmlnIH0gZnJvbSAnb3hsaW50JztcblxuaW1wb3J0IG94bGludEJhc2VDb25maWcgZnJvbSAnJHtveGxpbnRCYXNlQ29uZmlnTW9kdWxlfSc7XG5cbiR7Z2V0UmVzb2x2ZWRDb25maWdDb250ZW50KCdveGxpbnRCYXNlQ29uZmlnJywgaXNSb290Q29uZmlnKX1gXG4gICl9XG5cbiR7bWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRCbG9jaygnZXhwb3J0JywgJ2V4cG9ydCBkZWZhdWx0IG94bGludFJlc29sdmVkQ29uZmlnOycpfVxuYDtcbn1cblxuLy8gc3RydWN0dXJlZENsb25lIGtlZXBzIGEgcGFja2FnZS1sb2NhbCBjb3B5IHNvIHJlcG9zaXRvcmllcyBjYW4gYWRkIHNldHRpbmdzIG91dHNpZGUgbWFuYWdlZFxuLy8gYmxvY2tzIHdpdGhvdXQgbXV0YXRpbmcgdGhlIHNoYXJlZCBpbXBvcnRlZCBjb25maWcgb2JqZWN0LiBUaGUgcm9vdCBjb25maWcgZm9yY2VzIHRoZSB0eXBlLWF3YXJlXG4vLyBvcHRpb25zIG9uIGluc2lkZSB0aGUgbWFuYWdlZCBibG9jayBzbyBubyBjdXN0b21pemF0aW9uIGNhbiBzaWxlbnRseSBkaXNhYmxlIHR5cGUgY2hlY2tpbmc7IGV2ZXJ5XG4vLyBvdGhlciBjb25maWcgZGVsZXRlcyB0aGVtIGJlY2F1c2UgT3hsaW50IHJlamVjdHMgdGhvc2Ugcm9vdC1vbmx5IG9wdGlvbnMgZWxzZXdoZXJlICh0eXBlIGNoZWNraW5nXG4vLyBzdXJ2aXZlczogdGhlIGxpbnQgY29tbWFuZHMgcGFzcyAtLXR5cGUtYXdhcmUgYW5kIC0tdHlwZS1jaGVjayBleHBsaWNpdGx5KS5cbmZ1bmN0aW9uIGdldFJlc29sdmVkQ29uZmlnQ29udGVudChiYXNlQ29uZmlnTmFtZTogc3RyaW5nLCBpc1Jvb3RDb25maWc6IGJvb2xlYW4pOiBzdHJpbmcge1xuICBpZiAoaXNSb290Q29uZmlnKSB7XG4gICAgcmV0dXJuIGBjb25zdCBveGxpbnRSZXNvbHZlZENvbmZpZzogT3hsaW50Q29uZmlnID0gc3RydWN0dXJlZENsb25lKCR7YmFzZUNvbmZpZ05hbWV9KTtcbm94bGludFJlc29sdmVkQ29uZmlnLm9wdGlvbnMgPSB7IC4uLm94bGludFJlc29sdmVkQ29uZmlnLm9wdGlvbnMsIHR5cGVBd2FyZTogdHJ1ZSwgdHlwZUNoZWNrOiB0cnVlIH07YDtcbiAgfVxuXG4gIHJldHVybiBgY29uc3Qgb3hsaW50UmVzb2x2ZWRDb25maWc6IE94bGludENvbmZpZyA9IHN0cnVjdHVyZWRDbG9uZSgke2Jhc2VDb25maWdOYW1lfSk7XG5kZWxldGUgb3hsaW50UmVzb2x2ZWRDb25maWcub3B0aW9ucztgO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGNvbW1vbkNvbnRlbnQgPSBgXG4zcmQtcGFydHkvXG5hbmRyb2lkL1xuaW9zL1xubm8tZm9ybWF0L1xudGVzdC1maXh0dXJlcy9cbnRlc3QvZml4dHVyZXMvXG4qLmQudHNcbioubWluLmpzXG4ueWFybi9cbi5wbnAuanNcbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVByZXR0aWVyaWdub3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUHJldHRpZXJpZ25vcmUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcucHJldHRpZXJpZ25vcmUnKTtcbiAgICBjb25zdCBjb250ZW50ID0gKGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKSkgPz8gJyc7XG4gICAgY29uc3QgaGVhZFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQpO1xuICAgIGNvbnN0IHRhaWxVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldFRhaWxVc2VyQ29udGVudChjb250ZW50KTtcblxuICAgIGNvbnN0IGdpdGlnbm9yZUZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGlnbm9yZScpO1xuICAgIGNvbnN0IGdpdGlnbm9yZUNvbnRlbnQgPSAoYXdhaXQgaWdub3JlRmlsZVV0aWwucmVhZEdpdGlnbm9yZVdpdGhvdXRTZXBhcmF0b3JzKGdpdGlnbm9yZUZpbGVQYXRoKSkgfHwgJyc7XG5cbiAgICBsZXQgYWRkaXRpb25hbENvbnRlbnQgPSAnJztcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgIGFkZGl0aW9uYWxDb250ZW50ID0gYFxuYW5kcm9pZC9hcHAvXG5pb3MvUnVubmVyL0Fzc2V0cy54Y2Fzc2V0cy9cbnB1YnNwZWMueWFtbFxuYDtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdDb250ZW50ID0gaGVhZFVzZXJDb250ZW50ICsgY29tbW9uQ29udGVudCArIGFkZGl0aW9uYWxDb250ZW50ICsgZ2l0aWdub3JlQ29udGVudCArIHRhaWxVc2VyQ29udGVudDtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsganNvbmNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvanNvbmNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHNvcnRLZXlzIH0gZnJvbSAnLi4vdXRpbHMvb2JqZWN0VXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QganNvbk9iaiA9IHtcbiAgdmVudlBhdGg6ICcuJyxcbiAgdmVudjogJy52ZW52Jyxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVB5cmlnaHRDb25maWdKc29uKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgbGV0IG5ld1NldHRpbmdzOiBvYmplY3QgPSBzdHJ1Y3R1cmVkQ2xvbmUoanNvbk9iaik7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdweXJpZ2h0Y29uZmlnLmpzb24nKTtcbiAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpO1xuICAgIGxldCBvcmlnaW5hbFNldHRpbmdzSnNvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmIChvbGRDb250ZW50ICE9PSB1bmRlZmluZWQgJiYgIWpzb25jVXRpbC5pc1RyaXZpYU9ubHkob2xkQ29udGVudCkpIHtcbiAgICAgIC8vIHB5cmlnaHRjb25maWcuanNvbiBhbGxvd3MgSlNPTkM7IGFuIGV4aXN0aW5nIGZpbGUgd2JmeSBjYW5ub3QgcGFyc2UgbXVzdCBiZSBsZWZ0XG4gICAgICAvLyB1bnRvdWNoZWQgaW5zdGVhZCBvZiBiZWluZyBvdmVyd3JpdHRlbiB3aXRoIHRoZSBiYXJlIHRlbXBsYXRlLlxuICAgICAgY29uc3Qgb2xkU2V0dGluZ3MgPSBqc29uY1V0aWwucGFyc2VPYmplY3RJZ25vcmluZ0Vycm9yPG9iamVjdD4ob2xkQ29udGVudCk7XG4gICAgICBpZiAoIW9sZFNldHRpbmdzKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCBnZW5lcmF0aW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgdGhlIGV4aXN0aW5nIGNvbnRlbnQgaXMgbm90IHBhcnNhYmxlIGFzIEpTT05DLmApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBvcmlnaW5hbFNldHRpbmdzSnNvbiA9IEpTT04uc3RyaW5naWZ5KHNvcnRLZXlzKHN0cnVjdHVyZWRDbG9uZShvbGRTZXR0aW5ncykgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pKTtcbiAgICAgIG5ld1NldHRpbmdzID0gbWVyZ2UuYWxsKFtuZXdTZXR0aW5ncywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzXSwgeyBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSB9KTtcbiAgICB9XG4gICAgLy8gU2tpcCB0aGUgd3JpdGUgd2hlbiBub3RoaW5nIGNoYW5nZXMgc2VtYW50aWNhbGx5LCBzbyBKU09OQyBjb21tZW50cyBhbmQgZm9ybWF0dGluZyBpbiBhblxuICAgIC8vIGFscmVhZHktY2xlYW4gcHlyaWdodGNvbmZpZy5qc29uIHN1cnZpdmUgd2JmeSBydW5zLlxuICAgIGlmIChvcmlnaW5hbFNldHRpbmdzSnNvbiA9PT0gSlNPTi5zdHJpbmdpZnkoc29ydEtleXMoc3RydWN0dXJlZENsb25lKG5ld1NldHRpbmdzKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShuZXdTZXR0aW5ncywgdW5kZWZpbmVkLCAyKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGNvbnN1bWVzRG9ja2VyRW52IH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IG1hbmFnZWRTY3JpcHRzQmxvY2sgPSBgc2NyaXB0cy8qKlxuIXNjcmlwdHMvXG4hc2NyaXB0cy8qLnNoYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFJhaWx3YXlpZ25vcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4UmFpbHdheWlnbm9yZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5yYWlsd2F5aWdub3JlJyk7XG4gICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgICBjb25zdCB1c2VzRG9ja2VyRW52ID0gY29uc3VtZXNEb2NrZXJFbnYoY29uZmlnLmRvY2tlcmZpbGUpO1xuICAgIGlmICghY29udGVudCkge1xuICAgICAgaWYgKGNvbmZpZy5pc1JhaWx3YXkgJiYgdXNlc0RvY2tlckVudikge1xuICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgJyEuZG9ja2VyLmVudlxcbicpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgbmV3Q29udGVudCA9IGNvbnRlbnQucmVwbGFjZSgvXnNjcmlwdHNcXC8kL20sIG1hbmFnZWRTY3JpcHRzQmxvY2spO1xuICAgIC8vIGByYWlsd2F5IHVwYCBzdHJpcHMgZ2l0aWdub3JlZCBmaWxlcyBmcm9tIHRoZSB1cGxvYWRlZCBidWlsZCBjb250ZXh0LCBzbyB0aGUgZ2VuZXJhdGVkXG4gICAgLy8gbm9uLXNlY3JldCAuZG9ja2VyLmVudiAoYHdiIGdlbi1kb2NrZXItZW52YCBvdXRwdXQpIG5lZWRzIGFuIGV4cGxpY2l0IHVuLWlnbm9yZSB0byByZWFjaFxuICAgIC8vIHRoZSByZW1vdGUgRG9ja2VyIGJ1aWxkLiBBcHBlbmRlZCwgbm90IHByZXBlbmRlZDogaWdub3JlIGZpbGVzIGFyZSBsYXN0LW1hdGNoLXdpbnMsIHNvIGFcbiAgICAvLyBoYW5kLXdyaXR0ZW4gcGF0dGVybiBzdWNoIGFzIGAqLmVudmAgZWFybGllciBpbiB0aGUgZmlsZSBtdXN0IG5vdCBzaWxlbnRseSByZS1leGNsdWRlIGl0LlxuICAgIGlmICh1c2VzRG9ja2VyRW52ICYmICEvXiFcXC5kb2NrZXJcXC5lbnYkL20udGVzdChuZXdDb250ZW50KSkge1xuICAgICAgbmV3Q29udGVudCA9IGAke25ld0NvbnRlbnQucmVwbGFjZSgvXFxuPyQvLCAnXFxuJyl9IS5kb2NrZXIuZW52XFxuYDtcbiAgICB9IGVsc2UgaWYgKGNvbmZpZy5kb2NrZXJmaWxlICYmICF1c2VzRG9ja2VyRW52KSB7XG4gICAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlKC9eIVxcLmRvY2tlclxcLmVudlxcbj8vbSwgJycpO1xuICAgIH1cbiAgICBpZiAobmV3Q29udGVudCA9PT0gY29udGVudCkgcmV0dXJuO1xuXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICBuZXdDb250ZW50ID8gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkgOiBmc1V0aWwucmVtb3ZlQ29uZmluZWQoZmlsZVBhdGgpXG4gICAgKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IEltYWdlLCBMaW5rLCBQYXJhZ3JhcGgsIFBocmFzaW5nQ29udGVudCwgUm9vdENvbnRlbnQgfSBmcm9tICdtZGFzdCc7XG5pbXBvcnQgeyBmcm9tTWFya2Rvd24gfSBmcm9tICdtZGFzdC11dGlsLWZyb20tbWFya2Rvd24nO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBqb2JzQWxsQ2FsbFJldXNhYmxlV29ya2Zsb3cgfSBmcm9tICcuL3dvcmtmbG93LmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBnZXRPY3Rva2l0IH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IGdldFdiZnlWZXJzaW9uTGFiZWwgfSBmcm9tICcuLi91dGlscy92ZXJzaW9uLmpzJztcblxuY29uc3Qgc2VtYW50aWNSZWxlYXNlQmFkZ2UgPVxuICAnWyFbc2VtYW50aWMtcmVsZWFzZV0oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9iYWRnZS8lMjAlMjAlRjAlOUYlOTMlQTYlRjAlOUYlOUElODAtc2VtYW50aWMtLXJlbGVhc2UtZTEwMDc5LnN2ZyldKGh0dHBzOi8vZ2l0aHViLmNvbS9zZW1hbnRpYy1yZWxlYXNlL3NlbWFudGljLXJlbGVhc2UpJztcblxuY29uc3Qgd2JmeUJhZGdlVXJsUHJlZml4ID0gJ2h0dHBzOi8vaW1nLnNoaWVsZHMuaW8vYmFkZ2Uvd2JmeS0nO1xuY29uc3Qgd2JmeUJhZGdlVXJsU3VmZml4ID0gJy0xZTkwZmYuc3ZnJztcbmNvbnN0IHdiZnlCYWRnZUxpbmsgPSAnaHR0cHM6Ly9naXRodWIuY29tL1dpbGxCb29zdGVyL3NoYXJlZC90cmVlL21haW4vcGFja2FnZXMvd2JmeSc7XG5cbmNvbnN0IG5wbVBhY2thZ2VVcmxQcmVmaXggPSAnaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvJztcbmNvbnN0IG5wbUxpY2Vuc2VCYWRnZVBhdHRlcm4gPSAvXlxcWyFcXFtbXlxcXV0qXFxdXFwoaHR0cHM6XFwvXFwvaW1nXFwuc2hpZWxkc1xcLmlvXFwvbnBtXFwvbFxcL1teKVxcc10rXFwpXFxdXFwoW14pXFxzXStcXCkkL3U7XG5cbmNvbnN0IG1hbmFnZWRCYWRnZVBhdHRlcm5zID0gW1xuICAvXlxcWyFcXFt3YmZ5XFxdXFwoaHR0cHM6XFwvXFwvaW1nXFwuc2hpZWxkc1xcLmlvXFwvYmFkZ2VcXC93YmZ5LVteKVxcc10rLTFlOTBmZlxcLnN2Z1xcKVxcXVxcKGh0dHBzOlxcL1xcL2dpdGh1YlxcLmNvbVxcL1dpbGxCb29zdGVyXFwvc2hhcmVkXFwvdHJlZVxcL21haW5cXC9wYWNrYWdlc1xcL3diZnlcXCkkL3UsXG4gIC9eXFxbIVxcW1teXFxdXSpcXF1cXCgoaHR0cHM6XFwvXFwvZ2l0aHViXFwuY29tXFwvW14pXFxzXStcXC9hY3Rpb25zXFwvd29ya2Zsb3dzXFwvW14pXFxzXSspXFwvYmFkZ2VcXC5zdmdcXClcXF1cXChcXDFcXCkkL3UsXG4gIC9eXFxbIVxcW1teXFxdXSpcXF1cXChbXilcXHNdK1xcKVxcXVxcKGh0dHBzPzpcXC9cXC8oPzp3d3dcXC4pP25wbWpzXFwuY29tXFwvcGFja2FnZVxcL1teKVxcc10qXFwpJC91LFxuICBucG1MaWNlbnNlQmFkZ2VQYXR0ZXJuLFxuXTtcblxuZnVuY3Rpb24gYnVpbGRXYmZ5QmFkZ2UobGFiZWw6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIEh5cGhlbnMgYXJlIGVzY2FwZWQgYXMgYC0tYCBwZXIgc2hpZWxkcy5pbydzIGJhZGdlIHBhdGggc3ludGF4LCBzbyBgdjEuMi4zLXJjLjFgIHN0YXlzIGludGFjdC5cbiAgcmV0dXJuIGBbIVt3YmZ5XSgke3diZnlCYWRnZVVybFByZWZpeH0ke2xhYmVsLnJlcGxhY2VBbGwoJy0nLCAnLS0nKX0ke3diZnlCYWRnZVVybFN1ZmZpeH0pXSgke3diZnlCYWRnZUxpbmt9KWA7XG59XG5cbi8qKiBUaGUgdmVyc2lvbiBsYWJlbCB0aGUgd2JmeSBiYWRnZSBpbiB0aGUgcmVwb3NpdG9yeSdzIFJFQURNRSByZWNvcmRzLCBpLmUuIHRoZSBidWlsZCB0aGF0IHdiZmllZCBpdC4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkQXBwbGllZFdiZnlWZXJzaW9uTGFiZWwoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgLy8gQ29uZmluZWQsIGFuZCB0b2xlcmFudCBvZiBhbnkgcmVhZCBmYWlsdXJlOiBhIFJFQURNRSB0aGF0IHJlc29sdmVzIG91dHNpZGUgdGhlIHJlcG9zaXRvcnkgKGFcbiAgLy8gY29tbWl0dGVkIHN5bWxpbmspIG9yIGNhbm5vdCBiZSByZWFkIGF0IGFsbCBzYXlzIG5vdGhpbmcgYWJvdXQgd2hpY2ggYnVpbGQgY29uZmlndXJlZCBUSElTXG4gIC8vIHJlcG9zaXRvcnksIGFuZCB0aGUgYW5zd2VyIG9ubHkgZXZlciBzdXBwcmVzc2VzIHdvcmsg4oCUIHNvIGFueXRoaW5nIGJ1dCBhIHJlYWRhYmxlIGluLXJlcG9zaXRvcnlcbiAgLy8gUkVBRE1FIG1lYW5zIFwibm90IGtub3duIHRvIGJlIGFwcGxpZWRcIiBhbmQgdGhlIHJ1biBwcm9jZWVkcy5cbiAgY29uc3QgcmVhZG1lID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlQ29uZmluZWRJZkV4aXN0cyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ1JFQURNRS5tZCcpKS5jYXRjaCgoKSA9PiB7fSk7XG4gIGlmIChyZWFkbWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAvLyBUaGUgUkVBRE1FIGlzIHBhcnNlZCByYXRoZXIgdGhhbiBzY2FubmVkLCBmb3IgdGhlIHNhbWUgcmVhc29uIHdyaXRlQmFkZ2VCbG9jayBwYXJzZXMgaXQsIGFuZFxuICAvLyBvbmx5IHRoZSBzaGFwZSB3cml0ZUJhZGdlQmxvY2sgaXRzZWxmIHdyaXRlcyBjb3VudHMgYXMgYW4gYXBwbGllZCBiYWRnZTogYSB0b3AtbGV2ZWwgcGFyYWdyYXBoXG4gIC8vIG9mIGJhZGdlcy4gQSBiYWRnZSBhbnl3aGVyZSBlbHNlIGlzIGNvbnRlbnQgdGhhdCBtZXJlbHkgbWVudGlvbnMgb25lIOKAlCBhIGZlbmNlZCBleGFtcGxlICh3YmZ5J3NcbiAgLy8gb3duIGRvY3VtZW50YXRpb24gaGFzIHRob3NlKSwgYSBibG9jayBxdW90ZSwgYSBsaXN0IGl0ZW0g4oCUIGFuZCByZWFkaW5nIGl0IGFzIGFwcGxpZWQgd291bGQgc2tpcFxuICAvLyBldmVyeSBmaXhlciBmb3IgdGhlIHJlcG9zaXRvcnkuXG4gIGZvciAoY29uc3Qgbm9kZSBvZiBmcm9tTWFya2Rvd24ocmVhZG1lKS5jaGlsZHJlbikge1xuICAgIGlmICghaXNCYWRnZUJsb2NrTm9kZShub2RlKSkgY29udGludWU7XG4gICAgZm9yIChjb25zdCBiYWRnZSBvZiBub2RlLmNoaWxkcmVuKSB7XG4gICAgICBpZiAoIWlzQmFkZ2VOb2RlKGJhZGdlKSkgY29udGludWU7XG4gICAgICBjb25zdCB7IHVybCB9ID0gYmFkZ2UuY2hpbGRyZW5bMF07XG4gICAgICBpZiAodXJsLnN0YXJ0c1dpdGgod2JmeUJhZGdlVXJsUHJlZml4KSAmJiB1cmwuZW5kc1dpdGgod2JmeUJhZGdlVXJsU3VmZml4KSkge1xuICAgICAgICByZXR1cm4gdXJsLnNsaWNlKHdiZnlCYWRnZVVybFByZWZpeC5sZW5ndGgsIC13YmZ5QmFkZ2VVcmxTdWZmaXgubGVuZ3RoKS5yZXBsYWNlQWxsKCctLScsICctJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVJlYWRtZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVJlYWRtZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ1JFQURNRS5tZCcpO1xuICAgIC8vIFRoZSB3YmZ5IGJhZGdlIG1hcmtzIGEgcmVwb3NpdG9yeSBhcyB3YmZpZWQsIHNvIGEgcmVwb3NpdG9yeSB3aXRob3V0IGEgUkVBRE1FIHN0aWxsIGdldHMgb25lLlxuICAgIC8vIHJlYWRGaWxlSWZFeGlzdHMgZmFsbHMgYmFjayBPTkxZIG9uIEVOT0VOVDogYSBSRUFETUUgdGhhdCBleGlzdHMgYnV0IGNhbm5vdCBiZSByZWFkIChlLmcuXG4gICAgLy8gcGVybWlzc2lvbnMsIEVNRklMRSkgbXVzdCBhYm9ydCB0aGUgZ2VuZXJhdG9yIGluc3RlYWQgb2YgYmVpbmcgb3ZlcndyaXR0ZW4gd2l0aCB0aGUgc3R1Yi5cbiAgICBsZXQgbmV3Q29udGVudCA9XG4gICAgICAoYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpKSA/P1xuICAgICAgYCMgJHtjb25maWcucGFja2FnZUpzb24/Lm5hbWUgPz8gcGF0aC5iYXNlbmFtZShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgpKX1cXG5gO1xuXG4gICAgLy8gT3JkZXJlZCBieSB3aGF0IGEgcmVhZGVyIGNhcmVzIGFib3V0IG1vc3Q6IHRoZSBucG0gYmFkZ2UgbmFtZXMgdGhlIHBhY2thZ2UgYSByZWFkZXIgaW5zdGFsbHMsXG4gICAgLy8gdGhlbiB0aGUgd29ya2Zsb3cgYmFkZ2VzIHJlcG9ydCB3aGV0aGVyIHRoZSBjb2RlIGlzIGN1cnJlbnRseSBoZWFsdGh5LCB0aGVuIGhvdyBpdCBpc1xuICAgIC8vIHJlbGVhc2VkLCBhbmQgbGFzdCB0aGUgd2JmeSBidWlsZCB0aGF0IGNvbmZpZ3VyZWQgaXQuXG4gICAgY29uc3QgYmFkZ2VzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHBhY2thZ2VOYW1lID0gYXdhaXQgZ2V0UHVibGlzaGVkTnBtUGFja2FnZU5hbWUoY29uZmlnKTtcbiAgICBpZiAocGFja2FnZU5hbWUpIHtcbiAgICAgIGJhZGdlcy5wdXNoKGJ1aWxkTnBtQmFkZ2UocGFja2FnZU5hbWUpKTtcbiAgICAgIGNvbnN0IGxpY2Vuc2UgPSBjb25maWcucGFja2FnZUpzb24/LmxpY2Vuc2U7XG4gICAgICBpZiAobGljZW5zZSAmJiBsaWNlbnNlICE9PSAnVU5MSUNFTlNFRCcpIHtcbiAgICAgICAgYmFkZ2VzLnB1c2goYnVpbGRMaWNlbnNlQmFkZ2UocGFja2FnZU5hbWUpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgYmFkZ2VzLnB1c2goLi4uKGF3YWl0IGJ1aWxkV29ya2Zsb3dCYWRnZXMoY29uZmlnKSkpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5yZWxlYXNlcmMuanNvbicpKSkgYmFkZ2VzLnB1c2goc2VtYW50aWNSZWxlYXNlQmFkZ2UpO1xuICAgIGJhZGdlcy5wdXNoKGJ1aWxkV2JmeUJhZGdlKGdldFdiZnlWZXJzaW9uTGFiZWwoKSA/PyAnYXBwbGllZCcpKTtcblxuICAgIC8vIFRoZSBibG9jayBpcyB3cml0dGVuIGluIG9uZSBwYXNzIGZyb20gdGhlIGJhZGdlcyB3YmZ5IG1hbmFnZXMgcmlnaHQgbm93LiBBIGJhZGdlIHRoYXQgaXMgbm9cbiAgICAvLyBsb25nZXIgd2FudGVkIOKAlCBhIHN1cGVyc2VkZWQgdmVyc2lvbiwgb3Igb25lIHdob3NlIHdvcmtmbG93IGlzIGdvbmUg4oCUIHNpbXBseSBpcyBub3QgaW4gdGhlXG4gICAgLy8gbGlzdCwgc28gbm90aGluZyBoYXMgdG8gcmVtb3ZlIGl0LlxuICAgIG5ld0NvbnRlbnQgPSB3cml0ZUJhZGdlQmxvY2sobmV3Q29udGVudCwgYmFkZ2VzKTtcblxuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50LCBnZXRMaW5lRW5kaW5nKG5ld0NvbnRlbnQpKSk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRQdWJsaXNoZWROcG1QYWNrYWdlTmFtZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBwYWNrYWdlSnNvbiA9IGNvbmZpZy5wYWNrYWdlSnNvbjtcbiAgLy8gQSBtb25vcmVwbyBoYXMgbm8gc2luZ2xlIG5wbSB2ZXJzaW9uIHJlcHJlc2VudGluZyB0aGUgd2hvbGUgcmVwb3NpdG9yeS5cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucyB8fCAhY29uZmlnLnJlbGVhc2UubnBtIHx8ICFwYWNrYWdlSnNvbj8ubmFtZSB8fCBwYWNrYWdlSnNvbi5wcml2YXRlKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gKGF3YWl0IGlzTWlzc2luZ0Zyb21OcG1SZWdpc3RyeShwYWNrYWdlSnNvbi5uYW1lKSkgPyB1bmRlZmluZWQgOiBwYWNrYWdlSnNvbi5uYW1lO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIHJlZ2lzdHJ5IGFuc3dlcnMgdGhhdCBpdCBoYXMgbm8gc3VjaCBwYWNrYWdlIOKAlCB0aGUgT05MWSBhbnN3ZXIgdGhhdCByZW1vdmVzIGEgYmFkZ2UuXG4gKiBBIGNoZWNrIHRoYXQgY2Fubm90IHJ1biAob2ZmbGluZSwgYW4gb3V0YWdlLCBhIHRpbWVvdXQpIHNheXMgbm90aGluZyBhYm91dCB0aGUgcGFja2FnZSwgYW5kXG4gKiB0cmVhdGluZyBpdCBhcyBhYnNlbnQgd291bGQgc3RyaXAgdGhlIGJhZGdlIG91dCBvZiBldmVyeSBwdWJsaXNoZWQgcmVwb3NpdG9yeSB3YmZ5IHRvdWNoZXNcbiAqIGR1cmluZyB0aGUgb3V0YWdlIGFuZCBwdXQgaXQgYmFjayBhZnRlcndhcmRzLlxuICovXG5hc3luYyBmdW5jdGlvbiBpc01pc3NpbmdGcm9tTnBtUmVnaXN0cnkocGFja2FnZU5hbWU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICB0cnkge1xuICAgIC8vIFRoZSBzY29wZSBzZXBhcmF0b3IgbXVzdCBzdXJ2aXZlIGFzIGEgcGF0aCBzZWdtZW50LCBzbyB0aGUgbmFtZSBpcyBlbmNvZGVkIHBpZWNld2lzZS5cbiAgICBjb25zdCBlbmNvZGVkTmFtZSA9IHBhY2thZ2VOYW1lLnNwbGl0KCcvJykubWFwKGVuY29kZVVSSUNvbXBvbmVudCkuam9pbignLycpO1xuICAgIC8vIEEgYmFkZ2UgaXMgZGVjb3JhdGlvbjogYSBzdGFsbGVkIHJlZ2lzdHJ5IGNvbm5lY3Rpb24gbXVzdCBub3QgaG9sZCB0aGUgd2hvbGUgcnVuIGZvciBob3dldmVyXG4gICAgLy8gbG9uZyB0aGUgbmV0d29ya2luZyBzdGFjayB3b3VsZCB3YWl0LiBUaGUgYnVkZ2V0IGlzIGdlbmVyb3VzIGJlY2F1c2UgYSB0aW1lb3V0IGFuc3dlcnNcbiAgICAvLyBcInVua25vd25cIiwgd2hpY2gga2VlcHMgdGhlIGJhZGdlIOKAlCBhbmQgb24gYSByZXBvc2l0b3J5IHRoYXQgaXMgbm90IG9uIG5wbSB0aGF0IG1lYW5zIHdyaXRpbmdcbiAgICAvLyBvbmUgaXQgc2hvdWxkIG5vdCBoYXZlOyBhIHdiZnkgcnVuIGFscmVhZHkgc3BlbmRzIG1pbnV0ZXMgb24gaW5zdGFsbHMsIHNvIHdhaXRpbmcgYSBsaXR0bGVcbiAgICAvLyBsb25nZXIgZm9yIGEgcmVhbCBhbnN3ZXIgY29zdHMgbGVzcyB0aGFuIGFjdGluZyBvbiBhIG1pc3Npbmcgb25lLlxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYGh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnLyR7ZW5jb2RlZE5hbWV9YCwge1xuICAgICAgbWV0aG9kOiAnSEVBRCcsXG4gICAgICBzaWduYWw6IEFib3J0U2lnbmFsLnRpbWVvdXQoMTBfMDAwKSxcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzcG9uc2Uuc3RhdHVzID09PSA0MDQ7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBidWlsZE5wbUJhZGdlKHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYFshW25wbSB2ZXJzaW9uXShodHRwczovL2ltZy5zaGllbGRzLmlvL25wbS92LyR7cGFja2FnZU5hbWV9LnN2ZyldKCR7bnBtUGFja2FnZVVybFByZWZpeH0ke3BhY2thZ2VOYW1lfSlgO1xufVxuXG5mdW5jdGlvbiBidWlsZExpY2Vuc2VCYWRnZShwYWNrYWdlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBbIVtsaWNlbnNlXShodHRwczovL2ltZy5zaGllbGRzLmlvL25wbS9sLyR7cGFja2FnZU5hbWV9LnN2ZyldKCR7bnBtUGFja2FnZVVybFByZWZpeH0ke3BhY2thZ2VOYW1lfSlgO1xufVxuXG5hc3luYyBmdW5jdGlvbiBidWlsZFdvcmtmbG93QmFkZ2VzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3QgcmVwb3NpdG9yeSA9IGNvbmZpZy5yZXBvc2l0b3J5Py5zbGljZShjb25maWcucmVwb3NpdG9yeS5pbmRleE9mKCc6JykgKyAxKTtcbiAgY29uc3Qgd29ya2Zsb3dzUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRodWInLCAnd29ya2Zsb3dzJyk7XG4gIGlmICghcmVwb3NpdG9yeSB8fCAhZnMuZXhpc3RzU3luYyh3b3JrZmxvd3NQYXRoKSkgcmV0dXJuIFtdO1xuXG4gIC8vIFdvcmtmbG93IGFuZCBSRUFETUUgZ2VuZXJhdGlvbiBydW4gY29uY3VycmVudGx5LiBEbyBub3QgcmV0YWluIGEgc3RhbGUgUnVzdCBiYWRnZSB3aGlsZSB0aGVcbiAgLy8gd29ya2Zsb3cgZ2VuZXJhdG9yIHJlbW92ZXMgYSBjYWxsZXIgY3JlYXRlZCBmcm9tIGEgZm9ybWVybHkgbWlzZGV0ZWN0ZWQgbG9jYWwgY2FjaGUg4oCUIGJ1dFxuICAvLyBtaXJyb3IgaXRzIG93bmVyc2hpcCBjaGVjazogYSBjdXN0b20gc2FtZS1uYW1lZCB3b3JrZmxvdyBzdXJ2aXZlcywgc28gaXRzIGJhZGdlIG11c3QgdG9vLlxuICAvLyBEZWNpZGVkIHN5bmNocm9ub3VzbHkgYmVmb3JlIHRoZSBsb29wJ3MgZmlyc3QgYXdhaXQ6IHRoZSBnZW5lcmF0b3IncyBkZWxldGUgY2FuIG9ubHkgbGFuZCBhdFxuICAvLyBhbiBhd2FpdCBwb2ludCwgYW5kIGEgcG9zdC1kZWxldGUgcmVhZCB3b3VsZCBtaXNyZXBvcnQgdGhlIHdiZnktb3duZWQgY2FsbGVyIGFzIGN1c3RvbS5cbiAgLy8gTm8gZXhpc3RzU3luYyBwcmUtY2hlY2s6IHRoZSBoZWxwZXIgYWxyZWFkeSB0cmVhdHMgYSBtaXNzaW5nIGZpbGUgYXMgbm90IG93bmVkLCBhbmQgdGhpcyBydW5zXG4gIC8vIG9uY2UgcGVyIHJlcG9zaXRvcnksIHNvIHRoZSBleGNlcHRpb25hbCBFTk9FTlQgcmVhZCBjb3N0cyBub3RoaW5nIHdvcnRoIGEgcmVkdW5kYW50IHN0YXQuXG4gIGNvbnN0IGRyb3BzVGVzdFJ1c3RCYWRnZSA9XG4gICAgY29uZmlnLmNhcmdvVG9tbERpclBhdGhzLmxlbmd0aCA9PT0gMCAmJiBqb2JzQWxsQ2FsbFJldXNhYmxlV29ya2Zsb3cod29ya2Zsb3dzUGF0aCwgJ3Rlc3QtcnVzdC55bWwnLCAndGVzdC1ydXN0Jyk7XG5cbiAgY29uc3QgYmFkZ2VzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGZpbGVOYW1lIG9mIGZzLnJlYWRkaXJTeW5jKHdvcmtmbG93c1BhdGgpKSB7XG4gICAgaWYgKCFmaWxlTmFtZS5zdGFydHNXaXRoKCd0ZXN0JykgJiYgIWZpbGVOYW1lLnN0YXJ0c1dpdGgoJ2RlcGxveScpKSBjb250aW51ZTtcbiAgICBpZiAoZmlsZU5hbWUgPT09ICd0ZXN0LXJ1c3QueW1sJyAmJiBkcm9wc1Rlc3RSdXN0QmFkZ2UpIGNvbnRpbnVlO1xuICAgIC8vIEdpdEh1YidzIGJhZGdlIGVuZHBvaW50IHJldHVybnMgNDA0IHVudGlsIHRoZSB3b3JrZmxvdyBoYXMgYXQgbGVhc3Qgb25lIHJ1biwgc28gYSBiYWRnZSBmb3IgYVxuICAgIC8vIGRpc3BhdGNoLW9ubHkgZGVwbG95IHdvcmtmbG93IHRoYXQgaGFzIG5ldmVyIHJ1biByZW5kZXJzIGFzIGEgYnJva2VuIGltYWdlLiBUZXN0IHdvcmtmbG93cyBydW5cbiAgICAvLyBvbiBldmVyeSBQUiwgc28gb25seSBkZXBsb3kgYmFkZ2VzIG5lZWQgdGhlIGd1YXJkLlxuICAgIGlmIChmaWxlTmFtZS5zdGFydHNXaXRoKCdkZXBsb3knKSAmJiAhKGF3YWl0IGhhc0FueVdvcmtmbG93UnVuKHJlcG9zaXRvcnksIGZpbGVOYW1lLCBjb25maWcuaXNQdWJsaWNSZXBvKSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBiYWRnZU5hbWUgPSAoZmlsZU5hbWVbMF0gPz8gJycpLnRvVXBwZXJDYXNlKCkgKyBmaWxlTmFtZS5zbGljZSgxLCBmaWxlTmFtZS5pbmRleE9mKCcuJykpLnJlcGxhY2UoJy0nLCAnICcpO1xuICAgIGNvbnN0IHdvcmtmbG93VXJsID0gYGh0dHBzOi8vZ2l0aHViLmNvbS8ke3JlcG9zaXRvcnl9L2FjdGlvbnMvd29ya2Zsb3dzLyR7ZW5jb2RlVXJsUGF0aChmaWxlTmFtZSl9YDtcbiAgICBiYWRnZXMucHVzaChgWyFbJHtiYWRnZU5hbWV9XSgke3dvcmtmbG93VXJsfS9iYWRnZS5zdmcpXSgke3dvcmtmbG93VXJsfSlgKTtcbiAgfVxuICByZXR1cm4gYmFkZ2VzO1xufVxuXG5hc3luYyBmdW5jdGlvbiBoYXNBbnlXb3JrZmxvd1J1bihcbiAgcmVwb3NpdG9yeTogc3RyaW5nLFxuICB3b3JrZmxvd0ZpbGVOYW1lOiBzdHJpbmcsXG4gIGlzUHVibGljUmVwbzogYm9vbGVhblxuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IFtvd25lciwgcmVwb10gPSByZXBvc2l0b3J5LnNwbGl0KCcvJyk7XG4gIGlmICghb3duZXIgfHwgIXJlcG8pIHJldHVybiB0cnVlO1xuICB0cnkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZ2V0T2N0b2tpdChvd25lcikucmVxdWVzdCgnR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3dvcmtmbG93cy97d29ya2Zsb3dfaWR9L3J1bnMnLCB7XG4gICAgICBvd25lcixcbiAgICAgIHJlcG8sXG4gICAgICB3b3JrZmxvd19pZDogd29ya2Zsb3dGaWxlTmFtZSxcbiAgICAgIHBlcl9wYWdlOiAxLFxuICAgIH0pO1xuICAgIHJldHVybiByZXNwb25zZS5kYXRhLnRvdGFsX2NvdW50ID4gMDtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyBGb3IgYSBQVUJMSUMgcmVwb3NpdG9yeSB0aGUgcnVucyBlbmRwb2ludCBuZWVkcyBubyBhdXRob3JpemF0aW9uLCBzbyA0MDQgcmVsaWFibHkgbWVhbnMgdGhlXG4gICAgLy8gd29ya2Zsb3cgaXMgYWJzZW50IGZyb20gdGhlIHJlbW90ZSAoZS5nLiBhZGRlZCBsb2NhbGx5LCBuZXZlciBwdXNoZWQpIOKAlCBsaWtlIHplcm8gcnVucywgaXRzXG4gICAgLy8gYmFkZ2Ugd291bGQgcmVuZGVyIGJyb2tlbi4gRm9yIGEgUFJJVkFURSByZXBvc2l0b3J5IEdpdEh1YiBhbHNvIGFuc3dlcnMgNDA0IHdoZW4gdGhlIHRva2VuXG4gICAgLy8gaXMgbWlzc2luZyBvciB1bmRlci1zY29wZWQsIHNvIDQwNCBpcyBhbWJpZ3VvdXMgdGhlcmUgYW5kIHRoZSBiYWRnZSBpcyBrZXB0LlxuICAgIGlmICgoZXJyb3IgYXMgeyBzdGF0dXM/OiBudW1iZXIgfSkuc3RhdHVzID09PSA0MDQgJiYgaXNQdWJsaWNSZXBvKSByZXR1cm4gZmFsc2U7XG4gICAgLy8gS2VlcCB0aGUgcHJlLWd1YXJkIGJlaGF2aW9yIChpbnNlcnQgdGhlIGJhZGdlKSB3aGVuIHRoZSBjaGVjayBpdHNlbGYgY2Fubm90IHJ1bi5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG4vKipcbiAqIFJlcGxhY2VzIHRoZSBiYWRnZSBibG9ja3MgZGlyZWN0bHkgdW5kZXIgdGhlIHRpdGxlIHdpdGggYG1hbmFnZWRCYWRnZXNgLCBrZWVwaW5nIGFueSBiYWRnZSB0aGVyZVxuICogdGhhdCB3YmZ5IGRvZXMgbm90IG1hbmFnZSwgYW5kIHJlYXNzZW1ibGVzIHRoZSBSRUFETUUgYXJvdW5kIHRoZW0gd2l0aCBleGFjdGx5IG9uZSBibGFuayBsaW5lIG9uXG4gKiBlYWNoIHNpZGUuXG4gKlxuICogQm90aCB0aGUgdGl0bGUgYW5kIHRoZSBibG9jayBhcmUgbG9jYXRlZCBpbiBhIENvbW1vbk1hcmsgc3ludGF4IHRyZWUgcmF0aGVyIHRoYW4gYnkgc2Nhbm5pbmdcbiAqIGxpbmVzOiBvbmx5IGEgcmVhbCBwYXJzZXIga25vd3Mgd2hldGhlciBhIGxpbmUgdGhhdCBsb29rcyBsaWtlIGEgYmFkZ2UgaXMgYSBiYWRnZSAoYSBwYXJhZ3JhcGggb2ZcbiAqIGxpbmtlZCBpbWFnZXMpIG9yIGNvbnRlbnQgdGhhdCBtZXJlbHkgcmVhZHMgbGlrZSBvbmUgKGFuIGluZGVudGVkIGNvZGUgYmxvY2ssIGEgYmxvY2sgcXVvdGUsIGFcbiAqIGZlbmNlZCBleGFtcGxlLCBhIG11bHRpbGluZSBjb2RlIHNwYW4sIGFuIEhUTUwgYmxvY2spLiBFdmVyeXRoaW5nIG91dHNpZGUgdGhlIGJsb2NrIGlzIGNvcGllZCBiYWNrXG4gKiB2ZXJiYXRpbSBmcm9tIHRoZSBvcmlnaW5hbCB0ZXh0IHRocm91Z2ggdGhlIHBhcnNlcidzIHBvc2l0aW9uYWwgb2Zmc2V0cywgc28gbm8gcmVmb3JtYXR0aW5nIG9mIHRoZVxuICogdXNlcidzIGNvbnRlbnQgaXMgcG9zc2libGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZUJhZGdlQmxvY2socmVhZG1lOiBzdHJpbmcsIG1hbmFnZWRCYWRnZXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgY29uc3QgbGluZUVuZGluZyA9IGdldExpbmVFbmRpbmcocmVhZG1lKTtcbiAgLy8gQSBCT00gaXMgbm90IE1hcmtkb3duOiBsZWZ0IGluIHRoZSB0ZXh0IGl0IGhpZGVzIHRoZSBgI2Agb2YgdGhlIHRpdGxlIGZyb20gdGhlIHBhcnNlciwgYW5kXG4gIC8vIHByZXBlbmRpbmcgdGhlIGJsb2NrIGFoZWFkIG9mIGl0IHdvdWxkIHN0cmlwIHRoZSBtYXJrZXIgZnJvbSB0aGUgZmlsZSdzIGZpcnN0IGJ5dGUuXG4gIGNvbnN0IGJ5dGVPcmRlck1hcmsgPSByZWFkbWUuc3RhcnRzV2l0aCgn77u/JykgPyAn77u/JyA6ICcnO1xuICAvLyBGcm9udCBtYXR0ZXIgaXMgZGVsaW1pdGVkIGJ5IHRoZSBzYW1lIGAtLS1gIGEgU2V0ZXh0IGhlYWRpbmcgYW5kIGEgdGhlbWF0aWMgYnJlYWsgdXNlLCBzbyBpdCBpc1xuICAvLyBkZXRhY2hlZCBiZWZvcmUgcGFyc2luZyBpbnN0ZWFkIG9mIGJlaW5nIHRvbGQgYXBhcnQgYWZ0ZXJ3YXJkczsgaXQgYWxzbyBoYXMgdG8gc3RheSBmaXJzdCBpbiB0aGVcbiAgLy8gZmlsZSwgd2hpY2ggbWFrZXMgaXQgYSBwcmVmaXggaW4gZXhhY3RseSB0aGUgc2FtZSB3YXkgdGhlIEJPTSBpcy5cbiAgY29uc3Qgd2l0aG91dE1hcmsgPSByZWFkbWUuc2xpY2UoYnl0ZU9yZGVyTWFyay5sZW5ndGgpO1xuICBjb25zdCBmcm9udE1hdHRlciA9IHdpdGhvdXRNYXJrLnN0YXJ0c1dpdGgoJy0tLScpXG4gICAgPyAoL14tLS1bIFxcdF0qXFxyP1xcbltcXHNcXFNdKj9eLS0tWyBcXHRdKig/Olxccj9cXG58JCkvbXUuZXhlYyh3aXRob3V0TWFyayk/LlswXSA/PyAnJylcbiAgICA6ICcnO1xuICBjb25zdCBwcmVmaXggPSBgJHtieXRlT3JkZXJNYXJrfSR7ZnJvbnRNYXR0ZXJ9YDtcbiAgLy8gVGhlIGZpbmFsIG5ld2xpbmUgaXMgc2V0IGFzaWRlIHJhdGhlciB0aGFuIHBhcnNlZCBhcyB0cmFpbGluZyBibGFuayBzcGFjZSwgd2hpY2ggdGhlIGJsYW5rLWxpbmVcbiAgLy8gdHJpbW1pbmcgYmVsb3cgd291bGQgb3RoZXJ3aXNlIHN3YWxsb3cuXG4gIGNvbnN0IGVuZHNXaXRoTmV3bGluZSA9IC9cXHI/XFxuJC91LnRlc3QocmVhZG1lKTtcbiAgY29uc3QgY29udGVudCA9IHdpdGhvdXRNYXJrLnNsaWNlKGZyb250TWF0dGVyLmxlbmd0aCkucmVwbGFjZSgvXFxyP1xcbiQvdSwgJycpO1xuXG4gIGNvbnN0IG5vZGVzID0gZnJvbU1hcmtkb3duKGNvbnRlbnQpLmNoaWxkcmVuO1xuICAvLyBBIGxlYWRpbmcgYmFkZ2UgYmxvY2sgaXMgdGhlIHVzZXIncyBvd24gbGF5b3V0OiBpdCBzdGF5cyBhYm92ZSB0aGUgdGl0bGUsIGFuZCB3YmZ5J3MgYmxvY2sgZ29lcyBiZWxvdy5cbiAgY29uc3Qga2VlcHNMZWFkaW5nQmxvY2sgPSAhIW5vZGVzWzBdICYmIGlzQmFkZ2VCbG9ja05vZGUobm9kZXNbMF0pICYmIGlzVGl0bGVOb2RlKG5vZGVzWzFdKTtcbiAgY29uc3QgdGl0bGVJbmRleCA9IGtlZXBzTGVhZGluZ0Jsb2NrID8gMSA6IGlzVGl0bGVOb2RlKG5vZGVzWzBdKSA/IDAgOiAtMTtcbiAgLy8gV2l0aG91dCBhIHJlY29nbml6YWJsZSB0aXRsZSB0aGUgYmxvY2sgc2l0cyBhdCB0aGUgdmVyeSB0b3AsIGFib3ZlIGV2ZXJ5dGhpbmcuXG4gIGNvbnN0IGhlYWRTdGFydE5vZGUgPSBrZWVwc0xlYWRpbmdCbG9jayA/IG5vZGVzWzBdISA6IG5vZGVzW3RpdGxlSW5kZXhdO1xuICBjb25zdCBoZWFkID1cbiAgICB0aXRsZUluZGV4ID09PSAtMVxuICAgICAgPyAnJ1xuICAgICAgOiBjb250ZW50LnNsaWNlKHN0YXJ0T2Zmc2V0V2l0aEluZGVudChjb250ZW50LCBoZWFkU3RhcnROb2RlISksIG5vZGVzW3RpdGxlSW5kZXhdIS5wb3NpdGlvbiEuZW5kLm9mZnNldCk7XG5cbiAgY29uc3QgYmFkZ2VCbG9ja05vZGVzOiBQYXJhZ3JhcGhbXSA9IFtdO1xuICBmb3IgKGxldCBub2RlSW5kZXggPSB0aXRsZUluZGV4ICsgMTsgOyBub2RlSW5kZXgrKykge1xuICAgIGNvbnN0IG5vZGUgPSBub2Rlc1tub2RlSW5kZXhdO1xuICAgIGlmICghaXNCYWRnZUJsb2NrTm9kZShub2RlKSkgYnJlYWs7XG4gICAgYmFkZ2VCbG9ja05vZGVzLnB1c2gobm9kZSk7XG4gICAgLy8gV2l0aG91dCBhIHRpdGxlLCBtZXJnaW5nIGxlYWRpbmcgYmxvY2tzIGNvdWxkIGNoYW5nZSB3aGljaCBub2RlIGlzIHJlY29nbml6ZWQgYXMgdGhlIHRpdGxlIG9uIHRoZSBuZXh0IHJ1bi5cbiAgICBpZiAodGl0bGVJbmRleCA9PT0gLTEpIGJyZWFrO1xuICB9XG4gIGNvbnN0IGV4aXN0aW5nID0gYmFkZ2VCbG9ja05vZGVzLmZsYXRNYXAoKG5vZGUpID0+IHJlYWRCYWRnZXMobm9kZSwgY29udGVudCkpO1xuICBjb25zdCBib2R5Tm9kZSA9IG5vZGVzW3RpdGxlSW5kZXggKyAxICsgYmFkZ2VCbG9ja05vZGVzLmxlbmd0aF07XG4gIGNvbnN0IGJvZHkgPSBib2R5Tm9kZSA/IGNvbnRlbnQuc2xpY2Uoc3RhcnRPZmZzZXRXaXRoSW5kZW50KGNvbnRlbnQsIGJvZHlOb2RlKSkgOiAnJztcblxuICAvLyBTdXBlcnNlZGluZyBhIG1hbmFnZWQgYmFkZ2UgaXMganVzdCBkcm9wcGluZyB0aGUgb2xkIG9uZTogYSB2ZXJzaW9uLCB3b3JrZmxvdywgbnBtLCBvciBsaWNlbnNlXG4gIC8vIGNoYW5nZSBsZWF2ZXMgbm8gc3RhbGUgY29weSwgd2hpbGUgYW55IG90aGVyIGJhZGdlIGluIHRoZSBtYW5hZ2VkIHJlZ2lvbiBpcyBrZXB0LlxuICBjb25zdCBiYWRnZXMgPSBbLi4ubWFuYWdlZEJhZGdlcywgLi4uZXhpc3RpbmcuZmlsdGVyKChiYWRnZSkgPT4gIWlzTWFuYWdlZEJhZGdlKGJhZGdlKSldO1xuICAvLyBDb250ZW50IGlzIHNsaWNlZCBmcm9tIGl0cyBub2RlJ3Mgc3RhcnQgb2Zmc2V0LCBzbyB3aGF0ZXZlciBibGFuayBzcGFjZSBmb2xsb3dlZCB0aGUgZnJvbnRcbiAgLy8gbWF0dGVyIGlzIGdvbmU7IGV4YWN0bHkgb25lIGJsYW5rIGxpbmUgaXMgcmVzdG9yZWQgaGVyZS4gQSBjbG9zaW5nIGRlbGltaXRlciB0aGF0IGVuZGVkIGF0IEVPRlxuICAvLyBjYXJyaWVzIG5vIG5ld2xpbmUgb2YgaXRzIG93biBhbmQgbmVlZHMgYm90aCwgb3IgYC0tLWAgd291bGQgZnVzZSB3aXRoIHRoZSBmaXJzdCBiYWRnZSBhbmRcbiAgLy8gZGVzdHJveSB0aGVtIGJvdGguIEEgQk9NIG5lZWRzIG5vIHNlcGFyYXRvcjogaXQgaXMgYSBieXRlIG1hcmtlciwgbm90IGEgbGluZS5cbiAgY29uc3Qgc2VwYXJhdG9yID0gZnJvbnRNYXR0ZXIgPyAoL1xccj9cXG4kL3UudGVzdChmcm9udE1hdHRlcikgPyBsaW5lRW5kaW5nIDogYCR7bGluZUVuZGluZ30ke2xpbmVFbmRpbmd9YCkgOiAnJztcbiAgY29uc3QgcmVzdWx0ID1cbiAgICBwcmVmaXggKyBzZXBhcmF0b3IgKyBbaGVhZCwgYmFkZ2VzLmpvaW4obGluZUVuZGluZyksIGJvZHldLmZpbHRlcihCb29sZWFuKS5qb2luKGAke2xpbmVFbmRpbmd9JHtsaW5lRW5kaW5nfWApO1xuICByZXR1cm4gZW5kc1dpdGhOZXdsaW5lID8gYCR7cmVzdWx0fSR7bGluZUVuZGluZ31gIDogcmVzdWx0O1xufVxuXG4vKipcbiAqIEEgbm9kZSdzIHN0YXJ0IG9mZnNldCwgZXh0ZW5kZWQgYmFjayBvdmVyIHRoZSBsZWFkaW5nIHdoaXRlc3BhY2Ugb24gaXRzIG93biBsaW5lLiBDb21tb25NYXJrXG4gKiBhbGxvd3Mgb25lIHRvIHRocmVlIHNwYWNlcyBvZiBpbmRlbnRhdGlvbiBiZWZvcmUgYSBibG9jaywgYW5kIG1kYXN0IHJlcG9ydHMgdGhlIG9mZnNldCBBRlRFUlxuICogdGhlbSDigJQgc28gc2xpY2luZyBmcm9tIGl0IHNpbGVudGx5IHJlaW5kZW50cyBjb250ZW50IHRoaXMgZ2VuZXJhdG9yIHByb21pc2VzIHRvIGNvcHkgdmVyYmF0aW0uXG4gKi9cbmZ1bmN0aW9uIHN0YXJ0T2Zmc2V0V2l0aEluZGVudChjb250ZW50OiBzdHJpbmcsIG5vZGU6IFJvb3RDb250ZW50KTogbnVtYmVyIHtcbiAgY29uc3Qgc3RhcnQgPSBub2RlLnBvc2l0aW9uIS5zdGFydC5vZmZzZXQhO1xuICBjb25zdCBsaW5lU3RhcnQgPSBjb250ZW50Lmxhc3RJbmRleE9mKCdcXG4nLCBzdGFydCAtIDEpICsgMTtcbiAgcmV0dXJuIC9eWyBcXHRdKiQvdS50ZXN0KGNvbnRlbnQuc2xpY2UobGluZVN0YXJ0LCBzdGFydCkpID8gbGluZVN0YXJ0IDogc3RhcnQ7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgbm9kZSBvcGVucyB0aGUgUkVBRE1FIHdpdGggYSB0aXRsZS4gT25seSB0aGUgRklSU1QgcGllY2Ugb2YgY29udGVudCBjYW4gYmUgb25lOiBhXG4gKiB0aXRsZSBpcyB3aGF0IGEgUkVBRE1FIG9wZW5zIHdpdGgsIGFuZCBhbmNob3JpbmcgdGhlIGJhZGdlcyB0byBhIGhlYWRpbmcgZnVydGhlciBkb3duIHdvdWxkIGJ1cnlcbiAqIHRoZW0gYmVsb3cgY29udGVudCB0aGUgYXV0aG9yIHB1dCBmaXJzdC5cbiAqL1xuZnVuY3Rpb24gaXNUaXRsZU5vZGUobm9kZTogUm9vdENvbnRlbnQgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG4gIGlmIChub2RlLnR5cGUgPT09ICdoZWFkaW5nJykgcmV0dXJuIHRydWU7XG4gIC8vIE1hbnkgUkVBRE1FcyBjZW50ZXIgdGhlaXIgdGl0bGUgaW4gSFRNTCAoYDxoMT5gLCBvciBhIGA8ZGl2PmAvYDxwPmAgd3JhcHBpbmcgb25lKSwgd2hpY2ggdGhlXG4gIC8vIHBhcnNlciByZXBvcnRzIGFzIG9uZSBvcGFxdWUgSFRNTCBibG9jazsgdGhlIGJhZGdlcyBnbyBhZnRlciB0aGUgd2hvbGUgYmxvY2suXG4gIHJldHVybiBub2RlLnR5cGUgPT09ICdodG1sJyAmJiBjb250YWluc1JlbmRlcmVkSDEobm9kZS52YWx1ZSk7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgSFRNTCBibG9jayB1bmFtYmlndW91c2x5IFJFTkRFUlMgYW4gYDxoMT5gIOKAlCB0aGUgY2VudGVyZWQtdGl0bGUgbGF5b3V0IG1hbnkgUkVBRE1Fc1xuICogdXNlIChgPGgxPmAsIG9yIGEgYDxkaXY+YC9gPHA+YCB3cmFwcGluZyBvbmUpLlxuICpcbiAqIERlbGliZXJhdGVseSBOT1QgYSBnZW5lcmFsIEhUTUwgcGFyc2VyLiBEZWNpZGluZyB0aGlzIGV4YWN0bHkgcmVxdWlyZXMgdGhlIHJlYWwgdG9rZW5pemVyJ3NcbiAqIHN0YXRlcyDigJQgcmF3IHRleHQsIFJDREFUQSwgc2NyaXB0IGRhdGEsIGF0dHJpYnV0ZSB2YWx1ZXMsIHRlbXBsYXRlIGNvbnRlbnRzLCBkZWNsYXJhdGlvbnMg4oCUIGFuZFxuICogYXBwcm94aW1hdGluZyB0aGVtIHdpdGggcmVnZXhlcyBpcyB0aGUgc2FtZSBsb3NpbmcgZ2FtZSB0aGUgTWFya2Rvd24gc2Nhbm5pbmcgdGhpcyBtb2R1bGVcbiAqIHJlcGxhY2VkIHdhcyBwbGF5aW5nLiBTbyB0aGUgcnVsZSBpczogdG9rZW5pemUgb25seSB0aGUgc2ltcGxlIGNhc2UsIGFuZCB0cmVhdCBhbnl0aGluZyBjYXJyeWluZ1xuICogYSBjb25zdHJ1Y3Qgd2hvc2UgcGFyc2luZyBkZXBlbmRzIG9uIHRob3NlIHN0YXRlcyBhcyBOT1QgYSB0aXRsZS4gQmVpbmcgd3JvbmcgdGhhdCB3YXkgcHV0cyB0aGVcbiAqIGJhZGdlcyBhdCB0aGUgdG9wIG9mIHRoZSBmaWxlLCB3aGljaCBpcyBtZXJlbHkgdW5oZWxwZnVsOyBiZWluZyB3cm9uZyB0aGUgb3RoZXIgd2F5IHJld3JpdGVzIHRoZVxuICogdXNlcidzIFJFQURNRSBhcm91bmQgdGhlIHdyb25nIGFuY2hvci5cbiAqL1xuZnVuY3Rpb24gY29udGFpbnNSZW5kZXJlZEgxKGh0bWw6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAvLyBDb21tZW50cyBjYW5ub3QgbmVzdCBhbmQgZW5kIHVuYW1iaWd1b3VzbHksIHNvIHRoZXkgYXJlIHNpbXBseSByZW1vdmVkIHJhdGhlciB0aGFuIGRpc3F1YWxpZnlpbmcuXG4gIGNvbnN0IHdpdGhvdXRDb21tZW50cyA9IGh0bWwucmVwbGFjZUFsbCgvPCEtLVtcXHNcXFNdKj8oPzotLT58JCkvZ3UsICcnKTtcbiAgLy8gQ0RBVEEsIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zLCBkZWNsYXJhdGlvbnMsIGVsZW1lbnRzIHdob3NlIGNvbnRlbnQgaXMgcmF3IHRleHQgLyBSQ0RBVEEgL1xuICAvLyBzY3JpcHQgZGF0YSwgYW5kIGA8dGVtcGxhdGU+YCAod2hvc2UgY29udGVudHMgYXJlIGluZXJ0KS4gQSBxdW90ZWQgYXR0cmlidXRlIGNvbnRhaW5pbmcgYDxgXG4gIC8vIG1ha2VzIGV2ZW4gbG9jYXRpbmcgdGhlc2UgdW5yZWxpYWJsZSwgc28gaXQgZGlzcXVhbGlmaWVzIHRoZSBibG9jayB0b28uXG4gIGNvbnN0IGFtYmlndW91c0NvbnN0cnVjdFBhdHRlcm4gPVxuICAgIC88IVxcW0NEQVRBXFxbfDxcXD98PCFbYS16QS1aXXw8XFwvPyg/OnNjcmlwdHxzdHlsZXx0ZXh0YXJlYXx0aXRsZXxpZnJhbWV8bm9mcmFtZXN8bm9lbWJlZHx4bXB8dGVtcGxhdGUpXFxifFwiW15cIl0qPFteXCJdKlwifCdbXiddKjxbXiddKicvaXU7XG4gIGlmIChhbWJpZ3VvdXNDb25zdHJ1Y3RQYXR0ZXJuLnRlc3Qod2l0aG91dENvbW1lbnRzKSkgcmV0dXJuIGZhbHNlO1xuICAvLyBRdW90aW5nIGlzIHNpZ25pZmljYW50IG9ubHkgaW5zaWRlIGEgc3RhcnQgdGFnLCBzbyBhbiBhdHRyaWJ1dGUgdmFsdWUgaXMgY29uc3VtZWQgd2l0aCBpdHMgb3duXG4gIC8vIHRhZyB3aGlsZSBxdW90YXRpb24gbWFya3MgaW4gb3JkaW5hcnkgdGV4dCBzdGF5IHRleHQ6IGA8ZGl2IHRpdGxlPVwiJmx0O2gxJmd0O1wiPmAgZG9lcyBub3QgY291bnQsXG4gIC8vIGBcIjxoMT5Qcm9qZWN0PC9oMT5cImAgZG9lcy5cbiAgY29uc3Qgc3RhcnRUYWdQYXR0ZXJuID0gLzwoW2EtekEtWl1bXlxccy8+XSopKD86XCJbXlwiXSpcInwnW14nXSonfFtePlwiJ10pKj4vZ3U7XG4gIGZvciAoY29uc3QgbWF0Y2ggb2Ygd2l0aG91dENvbW1lbnRzLm1hdGNoQWxsKHN0YXJ0VGFnUGF0dGVybikpIHtcbiAgICBpZiAobWF0Y2hbMV0/LnRvTG93ZXJDYXNlKCkgPT09ICdoMScpIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqIFdoZXRoZXIgdGhlIG5vZGUgaXMgYSBwYXJhZ3JhcGggb2YgYmFkZ2VzIGFuZCBub3RoaW5nIGVsc2Ug4oCUIHRoZSBvbmx5IGNvbnRlbnQgd2JmeSBwdXRzIGluIHRoZSBibG9jay4gKi9cbmZ1bmN0aW9uIGlzQmFkZ2VCbG9ja05vZGUobm9kZTogUm9vdENvbnRlbnQgfCB1bmRlZmluZWQpOiBub2RlIGlzIFBhcmFncmFwaCB7XG4gIHJldHVybiAoXG4gICAgISFub2RlICYmXG4gICAgbm9kZS50eXBlID09PSAncGFyYWdyYXBoJyAmJlxuICAgIG5vZGUuY2hpbGRyZW4uc29tZSgoY2hpbGQpID0+IGlzQmFkZ2VOb2RlKGNoaWxkKSkgJiZcbiAgICBub2RlLmNoaWxkcmVuLmV2ZXJ5KFxuICAgICAgKGNoaWxkKSA9PiBpc0JhZGdlTm9kZShjaGlsZCkgfHwgY2hpbGQudHlwZSA9PT0gJ2JyZWFrJyB8fCAoY2hpbGQudHlwZSA9PT0gJ3RleHQnICYmICFjaGlsZC52YWx1ZS50cmltKCkpXG4gICAgKVxuICApO1xufVxuXG4vKiogQSBiYWRnZSBpcyBvbmUgYFshW2FsdF0oaW1hZ2UpXShsaW5rKWAsIHRoZSBvbmx5IHNoYXBlIHdiZnkgZXZlciB3cml0ZXMuICovXG5mdW5jdGlvbiBpc0JhZGdlTm9kZShub2RlOiBSb290Q29udGVudCB8IFBocmFzaW5nQ29udGVudCk6IG5vZGUgaXMgTGluayAmIHsgY2hpbGRyZW46IFtJbWFnZV0gfSB7XG4gIHJldHVybiBub2RlLnR5cGUgPT09ICdsaW5rJyAmJiBub2RlLmNoaWxkcmVuLmxlbmd0aCA9PT0gMSAmJiBub2RlLmNoaWxkcmVuWzBdPy50eXBlID09PSAnaW1hZ2UnO1xufVxuXG4vKipcbiAqIFRoZSBiYWRnZXMgaW4gdGhlIGJsb2NrLCBhcyB0aGUgZXhhY3Qgc291cmNlIHRleHQgdGhhdCBwcm9kdWNlZCB0aGVtOiBhIGJhZGdlIHdiZnkgZG9lcyBub3QgbWFuYWdlXG4gKiBpcyB3cml0dGVuIGJhY2sgYnl0ZSBmb3IgYnl0ZSBpbnN0ZWFkIG9mIGJlaW5nIHJlLXNlcmlhbGl6ZWQgZnJvbSB0aGUgdHJlZS5cbiAqL1xuZnVuY3Rpb24gcmVhZEJhZGdlcyhub2RlOiBQYXJhZ3JhcGgsIGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIG5vZGUuY2hpbGRyZW5cbiAgICAuZmlsdGVyKChjaGlsZCkgPT4gaXNCYWRnZU5vZGUoY2hpbGQpKVxuICAgIC5tYXAoKGNoaWxkKSA9PiBjb250ZW50LnNsaWNlKGNoaWxkLnBvc2l0aW9uIS5zdGFydC5vZmZzZXQsIGNoaWxkLnBvc2l0aW9uIS5lbmQub2Zmc2V0KSk7XG59XG5cbi8qKlxuICogUGVyY2VudC1lbmNvZGVzIHRoZSBjaGFyYWN0ZXJzIHRoYXQgd291bGQgZW5kIGEgTWFya2Rvd24gZGVzdGluYXRpb24gZWFybHkuIEEgd29ya2Zsb3cgZmlsZSBtYXkgYmVcbiAqIG5hbWVkIGFueXRoaW5nIHdpdGggYSBgLnltbGAgZXh0ZW5zaW9uLCBhbmQgb25lIGNvbnRhaW5pbmcgYChgIG9yIGApYCBwcm9kdWNlZCBhIGJhZGdlIHRoYXQgd2JmeSdzXG4gKiBvd24gYmFkZ2UgcGF0dGVybiBjb3VsZCBub3QgcmVhZCBiYWNrIOKAlCBzbyB0aGUgbGluZSBsZWZ0IHRoZSBibG9jayBhbmQgdGhlIGJhZGdlIHdhcyBkdXBsaWNhdGVkLlxuICovXG5mdW5jdGlvbiBlbmNvZGVVcmxQYXRoKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdmFsdWUucmVwbGFjZUFsbCgvWygpXFxzXS9ndSwgKGNoYXJhY3RlcikgPT4gYCUke2NoYXJhY3Rlci5jb2RlUG9pbnRBdCgwKSEudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCl9YCk7XG59XG5cbi8qKiBXaGV0aGVyIHRoZSBiYWRnZSBpcyBvbmUgd2JmeSB3cml0ZXMgaXRzZWxmLCBhbmQgc28gbWF5IGJlIHJlcGxhY2VkIGJ5IHRoZSBjdXJyZW50IGJsb2NrLiAqL1xuZnVuY3Rpb24gaXNNYW5hZ2VkQmFkZ2UoYmFkZ2U6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gYmFkZ2UgPT09IHNlbWFudGljUmVsZWFzZUJhZGdlIHx8IG1hbmFnZWRCYWRnZVBhdHRlcm5zLnNvbWUoKHBhdHRlcm4pID0+IHBhdHRlcm4udGVzdChiYWRnZSkpO1xufVxuXG5mdW5jdGlvbiBnZXRMaW5lRW5kaW5nKGNvbnRlbnQ6IHN0cmluZyk6ICdcXG4nIHwgJ1xcclxcbicge1xuICByZXR1cm4gY29udGVudC5pbmNsdWRlcygnXFxyXFxuJykgPyAnXFxyXFxuJyA6ICdcXG4nO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUmVsZWFzZXJjKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVJlbGVhc2VyYycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcucmVsZWFzZXJjLmpzb24nKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSByZXR1cm47XG5cbiAgICBjb25zdCBzZXR0aW5ncyA9IEpTT04ucGFyc2UoYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4JykpIGFzIHtcbiAgICAgIHBsdWdpbnM/OiAoc3RyaW5nIHwgW3N0cmluZywgdW5rbm93bl0pW107XG4gICAgICBleHRlbmRzPzogdW5rbm93bjtcbiAgICB9O1xuICAgIGNvbnN0IHBsdWdpbnMgPSBzZXR0aW5ncy5wbHVnaW5zID8/IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGx1Z2lucy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgcGx1Z2luRW50cnkgPSBwbHVnaW5zW2ldO1xuICAgICAgY29uc3QgaXNBcnJheSA9IEFycmF5LmlzQXJyYXkocGx1Z2luRW50cnkpO1xuICAgICAgY29uc3QgcGx1Z2luID0gaXNBcnJheSA/IHBsdWdpbkVudHJ5WzBdIDogcGx1Z2luRW50cnk7XG4gICAgICBjb25zdCBvbGRDb25maWcgPSAoaXNBcnJheSAmJiBwbHVnaW5FbnRyeVsxXSkgfHwge307XG4gICAgICBpZiAocGx1Z2luID09PSAnQHNlbWFudGljLXJlbGVhc2UvY29tbWl0LWFuYWx5emVyJykge1xuICAgICAgICBwbHVnaW5zW2ldID0gW1xuICAgICAgICAgICdAc2VtYW50aWMtcmVsZWFzZS9jb21taXQtYW5hbHl6ZXInLFxuICAgICAgICAgIG1lcmdlLmFsbChcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgb2xkQ29uZmlnLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcHJlc2V0OiAnY29udmVudGlvbmFsY29tbWl0cycsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgeyBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSB9XG4gICAgICAgICAgKSxcbiAgICAgICAgXTtcbiAgICAgIH0gZWxzZSBpZiAocGx1Z2luID09PSAnQHNlbWFudGljLXJlbGVhc2UvZ2l0aHViJykge1xuICAgICAgICBwbHVnaW5zW2ldID0gW1xuICAgICAgICAgICdAc2VtYW50aWMtcmVsZWFzZS9naXRodWInLFxuICAgICAgICAgIG1lcmdlLmFsbChcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgb2xkQ29uZmlnLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLy8gY2YuIGh0dHBzOi8vZ2l0aHViLmNvbS9zZW1hbnRpYy1yZWxlYXNlL3NlbWFudGljLXJlbGVhc2UvaXNzdWVzLzIyMDQjaXNzdWVjb21tZW50LTE1MDg0MTc3MDRcbiAgICAgICAgICAgICAgICBzdWNjZXNzQ29tbWVudENvbmRpdGlvbjogZmFsc2UsXG4gICAgICAgICAgICAgICAgZmFpbENvbW1lbnRDb25kaXRpb246IGZhbHNlLFxuICAgICAgICAgICAgICAgIGxhYmVsczogWydyOiBzZW1hbnRpYy1yZWxlYXNlJ10sXG4gICAgICAgICAgICAgICAgcmVsZWFzZWRMYWJlbHM6IFsncmVsZWFzZWQgOmJvb2ttYXJrOiddLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfVxuICAgICAgICAgICksXG4gICAgICAgIF07XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShzZXR0aW5ncywgdW5kZWZpbmVkLCAyKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsganNvbmNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvanNvbmNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcblxuY29uc3Qgc2hhcmVkUHJlc2V0ID0gJ2dpdGh1Yj5XaWxsQm9vc3Rlci93aWxsYm9vc3Rlci1jb25maWdzOnJlbm92YXRlLmpzb25jJztcbmNvbnN0IGdlbmVyYXRlZFNldHRpbmdzID0ge1xuICAkc2NoZW1hOiAnaHR0cHM6Ly9kb2NzLnJlbm92YXRlYm90LmNvbS9yZW5vdmF0ZS1zY2hlbWEuanNvbicsXG4gIGV4dGVuZHM6IFtzaGFyZWRQcmVzZXRdLFxufTtcblxudHlwZSBTZXR0aW5ncyA9IFBhcnRpYWw8dHlwZW9mIGdlbmVyYXRlZFNldHRpbmdzPiAmIHtcbiAgcGFja2FnZVJ1bGVzPzogeyBtYXRjaFBhY2thZ2VOYW1lczogc3RyaW5nW107IGVuYWJsZWQ/OiBib29sZWFuIH1bXTtcbn07XG5cbmNvbnN0IG1hbmFnZWRGaWxlTmFtZSA9ICdyZW5vdmF0ZS5qc29uYyc7XG5cbi8vIHdiZnkgc3VwcG9ydHMgb25lIGNhbm9uaWNhbCBSZW5vdmF0ZSBsb2NhdGlvbi4gTm9uLWNhbm9uaWNhbCBjb25maWdzIGFyZSBmaXhlZCBpbiB0aGUgdGFyZ2V0XG4vLyByZXBvc2l0b3J5IGluc3RlYWQgb2YgYmVpbmcgcGFyc2VkLCBtZXJnZWQsIG9yIGRlbGV0ZWQgaGVyZS5cbmNvbnN0IG5vbkNhbm9uaWNhbENvbmZpZ1BhdGhzID0gW1xuICAncmVub3ZhdGUuanNvbicsXG4gICdyZW5vdmF0ZS5qc29uNScsXG4gICcuZ2l0aHViL3Jlbm92YXRlLmpzb24nLFxuICAnLmdpdGh1Yi9yZW5vdmF0ZS5qc29uYycsXG4gICcuZ2l0aHViL3Jlbm92YXRlLmpzb241JyxcbiAgJy5yZW5vdmF0ZXJjJyxcbiAgJy5yZW5vdmF0ZXJjLmpzb24nLFxuICAnLnJlbm92YXRlcmMuanNvbjUnLFxuXTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUmVub3ZhdGVKc29uYyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVJlbm92YXRlSnNvbmMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIG1hbmFnZWRGaWxlTmFtZSk7XG4gICAgY29uc3QgbWFuYWdlZEZpbGVTdGF0cyA9IGF3YWl0IGZzLnByb21pc2VzLmxzdGF0KGZpbGVQYXRoKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgaWYgKG1hbmFnZWRGaWxlU3RhdHM/LmlzU3ltYm9saWNMaW5rKCkpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCBnZW5lcmF0aW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgaXQgaXMgYSBzeW1ib2xpYyBsaW5rLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG5vbkNhbm9uaWNhbENvbmZpZ0NhbmRpZGF0ZXMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIG5vbkNhbm9uaWNhbENvbmZpZ1BhdGhzLm1hcChhc3luYyAocmVsYXRpdmVQYXRoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgcmVsYXRpdmVQYXRoKTtcbiAgICAgICAgcmV0dXJuIChhd2FpdCBmcy5wcm9taXNlcy5sc3RhdChjYW5kaWRhdGUpLmNhdGNoKCgpID0+IHt9KSkgPyBjYW5kaWRhdGUgOiB1bmRlZmluZWQ7XG4gICAgICB9KVxuICAgICk7XG4gICAgY29uc3Qgbm9uQ2Fub25pY2FsQ29uZmlnUGF0aCA9IG5vbkNhbm9uaWNhbENvbmZpZ0NhbmRpZGF0ZXMuZmluZCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUgIT09IHVuZGVmaW5lZCk7XG4gICAgaWYgKG5vbkNhbm9uaWNhbENvbmZpZ1BhdGggfHwgY29uZmlnLnBhY2thZ2VKc29uPy5yZW5vdmF0ZSkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgU2tpcHBlZCBnZW5lcmF0aW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgdGhlIHJlcG9zaXRvcnkgaGFzIGEgbm9uLWNhbm9uaWNhbCBSZW5vdmF0ZSBjb25maWcke1xuICAgICAgICAgIG5vbkNhbm9uaWNhbENvbmZpZ1BhdGggPyBgIGF0ICR7bm9uQ2Fub25pY2FsQ29uZmlnUGF0aH1gIDogJyBpbiBwYWNrYWdlLmpzb24nXG4gICAgICAgIH0uYFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpO1xuICAgIGxldCBvbGRTZXR0aW5nczogU2V0dGluZ3MgfCB1bmRlZmluZWQ7XG4gICAgaWYgKG9sZENvbnRlbnQgIT09IHVuZGVmaW5lZCAmJiAhanNvbmNVdGlsLmlzVHJpdmlhT25seShvbGRDb250ZW50KSkge1xuICAgICAgb2xkU2V0dGluZ3MgPSBqc29uY1V0aWwucGFyc2VPYmplY3RJZ25vcmluZ0Vycm9yPFNldHRpbmdzPihvbGRDb250ZW50KTtcbiAgICAgIGlmICghb2xkU2V0dGluZ3MpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIGdlbmVyYXRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSB0aGUgZXhpc3RpbmcgY29udGVudCBpcyBub3QgcGFyc2FibGUgYXMgSlNPTkMuYCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAob2xkU2V0dGluZ3M/LmV4dGVuZHMgIT09IHVuZGVmaW5lZCAmJiAhQXJyYXkuaXNBcnJheShvbGRTZXR0aW5ncy5leHRlbmRzKSkge1xuICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIGdlbmVyYXRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSBcImV4dGVuZHNcIiBpcyBub3QgYW4gYXJyYXkuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJlbW92ZWRQcmVzZXQgPSBvbGRTZXR0aW5ncz8uZXh0ZW5kcz8uZmluZChcbiAgICAgIChwcmVzZXQpID0+IHByZXNldC5zdGFydHNXaXRoKCdnaXRodWI+V2lsbEJvb3N0ZXIvd2lsbGJvb3N0ZXItY29uZmlnczonKSAmJiBwcmVzZXQgIT09IHNoYXJlZFByZXNldFxuICAgICk7XG4gICAgaWYgKHJlbW92ZWRQcmVzZXQpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCBnZW5lcmF0aW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgXCIke3JlbW92ZWRQcmVzZXR9XCIgbm8gbG9uZ2VyIGV4aXN0czsgcmVtb3ZlIGl0IG1hbnVhbGx5LmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld1NldHRpbmdzID0gYnVpbGRTZXR0aW5ncyhjb25maWcsIG9sZFNldHRpbmdzKTtcbiAgICBjb25zdCB7IGNvbnRlbnQsIGtleXNMb3NpbmdDb21tZW50cyB9ID0ganNvbmNVdGlsLnN0cmluZ2lmeVByZXNlcnZpbmdUcml2aWEoXG4gICAgICBvbGRDb250ZW50LFxuICAgICAgbmV3U2V0dGluZ3MgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICApO1xuICAgIGlmIChvbGRDb250ZW50ICE9PSB1bmRlZmluZWQgJiYgbm9ybWFsaXplKGNvbnRlbnQpID09PSBub3JtYWxpemUob2xkQ29udGVudCkpIHJldHVybjtcbiAgICBpZiAoIShhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb250ZW50KSkpIHJldHVybjtcblxuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXNMb3NpbmdDb21tZW50cykge1xuICAgICAgY29uc29sZS53YXJuKGBDb21tZW50cyBpbnNpZGUgXCIke2tleX1cIiB3ZXJlIGRyb3BwZWQgd2hpbGUgcmV3cml0aW5nIGl0IGluICR7ZmlsZVBhdGh9LmApO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBvbGRTZXR0aW5nczogU2V0dGluZ3MgfCB1bmRlZmluZWQpOiBTZXR0aW5ncyB7XG4gIGNvbnN0IHNldHRpbmdzID0gb2xkU2V0dGluZ3NcbiAgICA/IChtZXJnZS5hbGwoW2dlbmVyYXRlZFNldHRpbmdzLCBvbGRTZXR0aW5ncywgZ2VuZXJhdGVkU2V0dGluZ3NdLCB7XG4gICAgICAgIGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlLFxuICAgICAgfSkgYXMgU2V0dGluZ3MpXG4gICAgOiBzdHJ1Y3R1cmVkQ2xvbmUoZ2VuZXJhdGVkU2V0dGluZ3MpO1xuICBjb25zdCBleGlzdGluZ0V4dGVuZHMgPSBvbGRTZXR0aW5ncz8uZXh0ZW5kcyA/PyBbXTtcbiAgc2V0dGluZ3MuZXh0ZW5kcyA9IGNvbmZpZy5pc1dpbGxCb29zdGVyQ29uZmlnc1xuICAgID8gZXhpc3RpbmdFeHRlbmRzLmZpbHRlcigocHJlc2V0KSA9PiBwcmVzZXQgIT09IHNoYXJlZFByZXNldClcbiAgICA6IGV4aXN0aW5nRXh0ZW5kcy5pbmNsdWRlcyhzaGFyZWRQcmVzZXQpXG4gICAgICA/IGV4aXN0aW5nRXh0ZW5kc1xuICAgICAgOiBbc2hhcmVkUHJlc2V0LCAuLi5leGlzdGluZ0V4dGVuZHNdO1xuICByZXR1cm4gc2V0dGluZ3M7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZShjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCB0cmltbWVkQ29udGVudCA9IGNvbnRlbnQudHJpbSgpO1xuICByZXR1cm4gdHJpbW1lZENvbnRlbnQgPyB0cmltbWVkQ29udGVudCArICdcXG4nIDogJyc7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24sIFRzQ29uZmlnSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBqc29uY1V0aWwgfSBmcm9tICcuLi91dGlscy9qc29uY1V0aWwuanMnO1xuaW1wb3J0IHsgY29tYmluZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHNvcnRLZXlzIH0gZnJvbSAnLi4vdXRpbHMvb2JqZWN0VXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IGdldFRzY29uZmlnRXh0ZW5kcyB9IGZyb20gJy4uL3V0aWxzL3RzY29uZmlnQmFzZS5qcyc7XG5pbXBvcnQge1xuICBnZXRNZWFuaW5nZnVsRGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyxcbiAgZ2V0V29ya3NwYWNlRGlyUGF0dGVybnMsXG4gIGdldFdvcmtzcGFjZVN1YkRpclBhdGhzLFxufSBmcm9tICcuLi91dGlscy93b3Jrc3BhY2VVdGlsLmpzJztcblxuY29uc3Qgc3ViSnNvbk9iaiA9IHtcbiAgY29tcGlsZXJPcHRpb25zOiB7XG4gICAgYWx3YXlzU3RyaWN0OiB0cnVlLFxuICAgIG5vVW5jaGVja2VkSW5kZXhlZEFjY2VzczogdHJ1ZSwgLy8gZm9yIEB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItbnVsbGlzaC1jb2FsZXNjaW5nXG4gICAgYWxsb3dTeW50aGV0aWNEZWZhdWx0SW1wb3J0czogdHJ1ZSwgLy8gYWxsb3cgYGltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdgXG4gICAgZXNNb2R1bGVJbnRlcm9wOiB0cnVlLCAvLyBhbGxvdyBkZWZhdWx0IGltcG9ydCBmcm9tIENvbW1vbkpTL0FNRC9VTUQgbW9kdWxlc1xuICAgIHJlc29sdmVKc29uTW9kdWxlOiB0cnVlLCAvLyBhbGxvdyB0byBpbXBvcnQgSlNPTiBmaWxlc1xuICAgIGltcG9ydEhlbHBlcnM6IGZhbHNlLFxuICAgIG5vRW1pdDogdHJ1ZSxcbiAgfSxcbiAgZXhjbHVkZTogWyd0ZXN0L2ZpeHR1cmVzJ10sXG4gIC8vIHdiZnkgZ2VuZXJhdGVzIHJvb3QtbGV2ZWwgdG9vbCBjb25maWdzIHN1Y2ggYXMgcGxheXdyaWdodC5jb25maWcudHMsIGFuZFxuICAvLyB0eXBlLWF3YXJlIGxpbnRpbmcgbmVlZHMgdGhvc2UgZmlsZXMgaW4gdGhlIHByb2plY3QgdG8gc2VlIE5vZGUvQnVuIGdsb2JhbHMuXG4gIC8vIGBhcHAvKipgIGlzIGRlbGliZXJhdGVseSBhYnNlbnQgZXZlbiB0aG91Z2ggdGhlIGRvZXNDb250YWluKlNjcmlwdCBzaWduYWxzIHNjYW4gaXQ6IGFwcFxuICAvLyBkaXJlY3RvcmllcyBiZWxvbmcgdG8gZnJhbWV3b3JrIHBhY2thZ2VzIChOZXh0LmpzL0JsaXR6KSwgd2hpY2ggb3duIHRoZWlyIHRzY29uZmlnXG4gIC8vIChnZW5lcmF0ZVRzY29uZmlnIHNraXBzIHRoZW0pLCBhbmQgY2hlY2tpbmcgZnJhbWV3b3JrIHNvdXJjZXMgdW5kZXIgdGhpcyBwcm9qZWN0J3MgY29tcGlsZXJcbiAgLy8gb3B0aW9ucyB3b3VsZCBwcm9kdWNlIGZhbHNlIGVycm9ycy5cbiAgaW5jbHVkZTogWycqLmNvbmZpZy50cycsICdzY3JpcHRzLyoqLyonLCAnc3JjLyoqLyonLCAndGVzdC8qKi8qJ10sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVUc2NvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVRzY29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIC8vIHZpbmV4dCBpcyB0aGUgb3JnJ3MgTmV4dC5qcy1lcXVpdmFsZW50IGZyYW1ld29yayBhbmQgb3ducyBpdHMgdHNjb25maWcganVzdCBsaWtlIE5leHQvQmxpdHosXG4gICAgLy8gc28gaXQgbXVzdCBza2lwIHRoZSBzdGFuZGFyZCBnZW5lcmF0aW9uIHRoYXQgd291bGQgb3ZlcndyaXRlIHRoZSBmcmFtZXdvcmsncyBvd24gc2V0dGluZ3MuXG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHwgY29uZmlnLmRlcGVuZGluZy5uZXh0IHx8IGNvbmZpZy5kZXBlbmRpbmcudmluZXh0KSB7XG4gICAgICBhd2FpdCBub3JtYWxpemVGcmFtZXdvcmtUc2NvbmZpZyhjb25maWcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBuZXdTZXR0aW5ncyA9IChjb25maWcuaXNSb290ID8gYnVpbGRSb290SnNvbk9iaihjb25maWcpIDogc3RydWN0dXJlZENsb25lKHN1Ykpzb25PYmopKSBhcyBUc0NvbmZpZ0pzb247XG4gICAgY29uc3QgZ2VuZXJhdGVkVHlwZXMgPSBnZXRHZW5lcmF0ZWRUeXBlcyhjb25maWcpO1xuICAgIG5ld1NldHRpbmdzLmV4dGVuZHMgPSBnZXRUc2NvbmZpZ0V4dGVuZHMoY29uZmlnKTtcbiAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMgPz89IHt9O1xuICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucy5yb290RGlyID0gZ2V0Um9vdERpcihjb25maWcpO1xuICAgIGlmIChnZW5lcmF0ZWRUeXBlcy5sZW5ndGggPiAwKSB7XG4gICAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMgPSB7IC4uLm5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucywgdHlwZXM6IGdlbmVyYXRlZFR5cGVzIH07XG4gICAgfVxuICAgIGlmICghY29uZmlnLmRvZXNDb250YWluSnN4T3JUc3ggJiYgIWNvbmZpZy5kb2VzQ29udGFpbkpzeE9yVHN4SW5QYWNrYWdlcykge1xuICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8uanN4O1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEpIHtcbiAgICAgIC8vIFByaXNtYSBzZWVkcyBhbmQgbWlncmF0aW9uIGhlbHBlciBzY3JpcHRzIG9mdGVuIGxpdmUgb3V0c2lkZSBzcmMsIGJ1dFxuICAgICAgLy8gdHlwZS1hd2FyZSBsaW50aW5nIHN0aWxsIG5lZWRzIHRoZW0gY292ZXJlZCBieSB0aGUgcHJvamVjdCBjb25maWcuXG4gICAgICBhZGRJbmNsdWRlUGF0aChuZXdTZXR0aW5ncywgJ3ByaXNtYS8qKi8qJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICd0c2NvbmZpZy5qc29uJyk7XG4gICAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpO1xuICAgIGxldCBvcmlnaW5hbFNldHRpbmdzSnNvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIC8vIEEgZmlsZSB3aXRoIG5vIGNvbmZpZ3VyYXRpb24gKGVtcHR5IG9yIGNvbW1lbnQtb25seSkgaXMgdHJlYXRlZCBsaWtlIGEgbWlzc2luZyBvbmUsIGFzIHRzYyBkb2VzLlxuICAgIGlmIChleGlzdGluZ0NvbnRlbnQgIT09IHVuZGVmaW5lZCAmJiAhanNvbmNVdGlsLmlzVHJpdmlhT25seShleGlzdGluZ0NvbnRlbnQpKSB7XG4gICAgICBjb25zdCBvbGRTZXR0aW5ncyA9IGpzb25jVXRpbC5wYXJzZU9iamVjdElnbm9yaW5nRXJyb3I8VHNDb25maWdKc29uPihleGlzdGluZ0NvbnRlbnQpO1xuICAgICAgLy8gQW4gZXhpc3RpbmcgdHNjb25maWcuanNvbiB3YmZ5IGNhbm5vdCBwYXJzZSBtdXN0IGJlIGxlZnQgdW50b3VjaGVkOiB3cml0aW5nIHRoZVxuICAgICAgLy8gZ2VuZXJhdGVkIHNldHRpbmdzIHdpdGhvdXQgbWVyZ2luZyB3b3VsZCBzaWxlbnRseSBkaXNjYXJkIHRoZSBwcm9qZWN0J3MgY29uZmlndXJhdGlvbi5cbiAgICAgIGlmICghb2xkU2V0dGluZ3MpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIGdlbmVyYXRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSB0aGUgZXhpc3RpbmcgY29udGVudCBpcyBub3QgcGFyc2FibGUgYXMgSlNPTkMuYCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIG9yaWdpbmFsU2V0dGluZ3NKc29uID0gSlNPTi5zdHJpbmdpZnkoc29ydEtleXMoc3RydWN0dXJlZENsb25lKG9sZFNldHRpbmdzKSkpO1xuICAgICAgY29uc3QgZXhpc3RpbmdUeXBlcyA9IG5vcm1hbGl6ZVN0cmluZ0FycmF5KG9sZFNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8udHlwZXMpO1xuICAgICAgY29uc3QgZXhpc3RpbmdFbWl0TWV0YWRhdGEgPSBwaWNrRXhpc3RpbmdFbWl0TWV0YWRhdGEob2xkU2V0dGluZ3MuY29tcGlsZXJPcHRpb25zKTtcbiAgICAgIG5ld1NldHRpbmdzLmV4dGVuZHMgPSBtZXJnZVRzY29uZmlnRXh0ZW5kcyhuZXdTZXR0aW5ncy5leHRlbmRzLCBvbGRTZXR0aW5ncy5leHRlbmRzKTtcbiAgICAgIGRlbGV0ZSBvbGRTZXR0aW5ncy5leHRlbmRzO1xuICAgICAgZGVsZXRlIG9sZFNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8uanN4O1xuICAgICAgaWYgKGNvbmZpZy5pc1Jvb3QpIHtcbiAgICAgICAgcmVtb3ZlU3RhbGVNYW5hZ2VkV29ya3NwYWNlRW50cmllcyhjb25maWcsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5ncyk7XG4gICAgICB9XG4gICAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHsgYXJyYXlNZXJnZTogY29tYmluZU1lcmdlIH0pO1xuICAgICAgbmV3U2V0dGluZ3MuaW5jbHVkZSA9IG5ld1NldHRpbmdzLmluY2x1ZGU/LmZpbHRlcihcbiAgICAgICAgKGRpclBhdGg6IHN0cmluZykgPT5cbiAgICAgICAgICAhZGlyUGF0aC5pbmNsdWRlcygnQHR5cGVzJykgJiYgIWRpclBhdGguaW5jbHVkZXMoJ19fdGVzdHNfXy8nKSAmJiAhZGlyUGF0aC5pbmNsdWRlcygndGVzdHMvJylcbiAgICAgICk7XG4gICAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMgPz89IHt9O1xuICAgICAgLy8gd2JmeS1nZW5lcmF0ZWQgdHNjb25maWcuanNvbiBpcyBhIGxpbnQvdHlwZWNoZWNrIHByb2plY3QsIG5vdCB0aGUgZW1pdFxuICAgICAgLy8gY29udHJhY3QuIEl0IG11c3Qga2VlcCByb290RGlyIGJyb2FkIGVub3VnaCBmb3Igcm9vdCBjb25maWcgZmlsZXMsXG4gICAgICAvLyBzY3JpcHRzLCBzcmMsIGFuZCB0ZXN0cy4gYnVpbGQtdHMgb3ducyBlbWl0IGFuZCBjcmVhdGVzIGEgdGVtcG9yYXJ5XG4gICAgICAvLyBzcmMtb25seSB0c2NvbmZpZyB3aXRoIG5vRW1pdD1mYWxzZSwgZW1pdERlY2xhcmF0aW9uT25seT10cnVlLFxuICAgICAgLy8gcm9vdERpcj1cInNyY1wiLCBhbmQgaW5jbHVkZT1bXCJzcmMvKiovKlwiXSwgc28gcHJlc2VydmluZyBub0VtaXQ9ZmFsc2Ugb3JcbiAgICAgIC8vIHJvb3REaXI9XCJzcmNcIiBoZXJlIHdvdWxkIG9ubHkgYnJlYWsgbm9uLXNyYyB0eXBlLWF3YXJlIGxpbnQgY292ZXJhZ2UuXG4gICAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMgPSB7IC4uLm5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucywgLi4uZXhpc3RpbmdFbWl0TWV0YWRhdGEgfTtcblxuICAgICAgY29uc3QgbWVyZ2VkVHlwZXMgPSBbLi4ubmV3IFNldChbLi4uZmlsdGVyRXhpc3RpbmdUeXBlcyhleGlzdGluZ1R5cGVzLCBnZW5lcmF0ZWRUeXBlcyksIC4uLmdlbmVyYXRlZFR5cGVzXSldO1xuICAgICAgaWYgKG1lcmdlZFR5cGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLnR5cGVzID0gbWVyZ2VkVHlwZXM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLnR5cGVzO1xuICAgICAgfVxuICAgICAgaWYgKHNob3VsZERlbGV0ZVR5cGVSb290cyhnZW5lcmF0ZWRUeXBlcykpIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucy50eXBlUm9vdHM7XG4gICAgICB9XG4gICAgfVxuICAgIGFkZFVuZGljaVR5cGVzUGF0aE1hcHBpbmcobmV3U2V0dGluZ3MsIGNvbmZpZyk7XG4gICAgc29ydEtleXMobmV3U2V0dGluZ3MpO1xuICAgIG5ld1NldHRpbmdzLmluY2x1ZGU/LnNvcnQoKTtcbiAgICAvLyBEb24ndCB1c2Ugb2xkIGRlY29yYXRvclxuICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmV4cGVyaW1lbnRhbERlY29yYXRvcnM7XG4gICAgLy8gUGFja2FnZSBpbXBvcnRzIHNob3VsZCByZXNvbHZlIHRocm91Z2ggcGFja2FnZSBleHBvcnRzIGluc3RlYWQgb2YgYmFzZVVybC5cbiAgICAvLyBwYXRocyBpcyBpbnRlbnRpb25hbGx5IHByZXNlcnZlZCBzbyByZXBvLWxvY2FsIHRvb2xpbmcgY2FuIGtlZXAgZXhwbGljaXRcbiAgICAvLyBhbGlhc2VzIHdpdGhvdXQgcmVseWluZyBvbiBiYXNlVXJsJ3MgYnJvYWQgZmFsbGJhY2sgcmVzb2x1dGlvbi5cbiAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5iYXNlVXJsO1xuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy52ZXJiYXRpbU1vZHVsZVN5bnRheDtcbiAgICB9XG4gICAgLy8gU2tpcCB0aGUgd3JpdGUgd2hlbiBub3RoaW5nIGNoYW5nZXMgc2VtYW50aWNhbGx5LCBzbyBKU09OQyBjb21tZW50cyBhbmQgZm9ybWF0dGluZyBpbiBhblxuICAgIC8vIGFscmVhZHktdXAtdG8tZGF0ZSB0c2NvbmZpZy5qc29uIHN1cnZpdmUgd2JmeSBydW5zLlxuICAgIGlmIChvcmlnaW5hbFNldHRpbmdzSnNvbiA9PT0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MpKSByZXR1cm47XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KG5ld1NldHRpbmdzLCB1bmRlZmluZWQsIDIpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFRoZSBtb25vcmVwby1yb290IHRzY29uZmlnLCB3aG9zZSBpbmNsdWRlL2V4Y2x1ZGUgY292ZXIgZXZlcnkgREVDTEFSRUQgd29ya3NwYWNlIGxheW91dCAoZS5nLlxuICogYGFwcHMvKmAgYWxvbmdzaWRlIGBwYWNrYWdlcy8qYCkgc28gdHlwZS1hd2FyZSBsaW50aW5nIHJ1biBmcm9tIHRoZSByb290IHNlZXMgYWxsIHdvcmtzcGFjZVxuICogc291cmNlcywgbm90IGp1c3QgdGhlIGNvbnZlbnRpb25hbCBwYWNrYWdlcy8qIGRpcmVjdG9yeS5cbiAqL1xuZnVuY3Rpb24gYnVpbGRSb290SnNvbk9iaihjb25maWc6IFBhY2thZ2VDb25maWcpOiBUc0NvbmZpZ0pzb24ge1xuICBjb25zdCB3b3Jrc3BhY2VQYXR0ZXJucyA9IGNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29uc1xuICAgID8gZ2V0V29ya3NwYWNlRGlyUGF0dGVybnMoY29uZmlnKVxuICAgIDogeyBleGNsdWRlczogW10sIGluY2x1ZGVzOiBbXSB9O1xuICBjb25zdCBzZXR0aW5ncyA9IHN0cnVjdHVyZWRDbG9uZShzdWJKc29uT2JqKSBhcyBUc0NvbmZpZ0pzb247XG4gIHNldHRpbmdzLmV4Y2x1ZGUgPSBbXG4gICAgLi4ubmV3IFNldChbXG4gICAgICAuLi53b3Jrc3BhY2VQYXR0ZXJucy5pbmNsdWRlcy5tYXAoKHdvcmtzcGFjZVBhdHRlcm4pID0+IGAke3dvcmtzcGFjZVBhdHRlcm59L3Rlc3QvZml4dHVyZXNgKSxcbiAgICAgIC8vIE5lZ2F0aXZlIHdvcmtzcGFjZSBwYXR0ZXJucyAoZS5nLiBgIXBhY2thZ2VzL2V4Y2x1ZGVkYCkgb3B0IHdvcmtzcGFjZSBzdWJ0cmVlcyBvdXQgb2YgdGhlXG4gICAgICAvLyBtb25vcmVwbywgc28gdGhlaXIgc291cmNlcyBtdXN0IG5vdCBlbnRlciB0aGUgcm9vdCB0eXBlLWNoZWNrIHByb2plY3QgZWl0aGVyLiBBIG5lZ2F0aW9uXG4gICAgICAvLyB3aG9zZSBkaXJlY3RvcnkgaXMgYW4gYW5jZXN0b3Igb2YgYSB3b3Jrc3BhY2UgeWllbGRzIHBhY2thZ2Utb3duZWQgc3VicGF0aCBlbnRyaWVzXG4gICAgICAvLyBpbnN0ZWFkIG9mIHRoZSB3aG9sZSBzdWJ0cmVlIChzZWUgZ2V0V29ya3NwYWNlRGlyUGF0dGVybnMpLlxuICAgICAgLi4ud29ya3NwYWNlUGF0dGVybnMuZXhjbHVkZXMsXG4gICAgICAvLyBUaGUgbWFuYWdlZCBpbmNsdWRlcyBhYm92ZSBkZWxpYmVyYXRlbHkgb21pdCBmcmFtZXdvcmsgYGFwcC8qKmAgZGlyZWN0b3JpZXMgKHNlZVxuICAgICAgLy8gc3ViSnNvbk9iai5pbmNsdWRlJ3MgY29tbWVudCksIGJ1dCBhIHJlcG8tYXV0aG9yZWQgYnJvYWQgaW5jbHVkZSBzdWNoIGFzIGBlMmUvKipcXC8qYFxuICAgICAgLy8gY2FuIHN0aWxsIGRyYWcgYSBmcmFtZXdvcmsgd29ya3NwYWNlJ3MgYXBwIHNvdXJjZXMgaW50byB0aGUgcm9vdCBwcm9qZWN0LCB3aGVyZSB0aGV5XG4gICAgICAvLyBmYWlsIHVuZGVyIHRoZSByb290IGNvbXBpbGVyIG9wdGlvbnMg4oCUIHRoZWlyIGJhcmUgYG5leHQvKmAgaW1wb3J0cyByZXNvbHZlIG9ubHkgdGhyb3VnaFxuICAgICAgLy8gdGhlIGZyYW1ld29yayB3b3Jrc3BhY2UncyBvd24gdHNjb25maWcgYHBhdGhzYC4gRXhjbHVkZSB0aG9zZSBhcHAgZGlyZWN0b3JpZXMgc28gdGhlXG4gICAgICAvLyByb290IHByb2plY3QgbmV2ZXIgdHlwZS1jaGVja3MgdGhlbSwgbm8gbWF0dGVyIGhvdyBicm9hZCB0aGUgcmVwbydzIGluY2x1ZGUgZ2xvYnMgYXJlLlxuICAgICAgLi4uZ2V0RnJhbWV3b3JrV29ya3NwYWNlQXBwRXhjbHVkZXMoY29uZmlnKSxcbiAgICAgIC4uLihzZXR0aW5ncy5leGNsdWRlID8/IFtdKSxcbiAgICBdKSxcbiAgXS50b1NvcnRlZCgpO1xuICBzZXR0aW5ncy5pbmNsdWRlID0gW1xuICAgIC4uLihzZXR0aW5ncy5pbmNsdWRlID8/IFtdKSxcbiAgICAuLi53b3Jrc3BhY2VQYXR0ZXJucy5pbmNsdWRlcy5mbGF0TWFwKCh3b3Jrc3BhY2VQYXR0ZXJuKSA9PiBbXG4gICAgICBgJHt3b3Jrc3BhY2VQYXR0ZXJufS8qLmNvbmZpZy50c2AsXG4gICAgICBgJHt3b3Jrc3BhY2VQYXR0ZXJufS9zY3JpcHRzLyoqLypgLFxuICAgICAgYCR7d29ya3NwYWNlUGF0dGVybn0vc3JjLyoqLypgLFxuICAgICAgYCR7d29ya3NwYWNlUGF0dGVybn0vdGVzdC8qKi8qYCxcbiAgICBdKSxcbiAgXTtcbiAgcmV0dXJuIHNldHRpbmdzO1xufVxuXG4vLyBGcmFtZXdvcmsgcGFja2FnZXMgb3duIHRoZWlyIHRzY29uZmlnIChnZW5lcmF0ZVRzY29uZmlnIHNraXBzIHRoZW0pIGFuZCBzaGltIGJhcmUgaW1wb3J0cyBzdWNoIGFzXG4vLyBgbmV4dC9uYXZpZ2F0aW9uYCB0aHJvdWdoIHBhY2thZ2UtbG9jYWwgYHBhdGhzYDsgdmluZXh0IGlzIHRoZSBvcmcncyBOZXh0LmpzLWVxdWl2YWxlbnQgZnJhbWV3b3JrXG4vLyBhbmQgYmVoYXZlcyB0aGUgc2FtZS4gVGhlaXIgYXBwIHNvdXJjZXMgdGhlcmVmb3JlIG9ubHkgdHlwZS1jaGVjayB1bmRlciB0aGVpciBvd24gY29uZmlnLlxuY29uc3QgZnJhbWV3b3JrRGVwZW5kZW5jeU5hbWVzID0gWydibGl0eicsICduZXh0JywgJ3ZpbmV4dCddO1xuXG4vLyBBIGZyYW1ld29yayBhcHAgbGl2ZXMgaW4gYGFwcC9gIG9yLCB1bmRlciB0aGUgc3JjLWRpcmVjdG9yeSBsYXlvdXQsIGBzcmMvYXBwL2AuIFRoZSByb290IHByb2plY3Rcbi8vIGluY2x1ZGVzIGA8d29ya3NwYWNlPi9zcmMvKiovKmAsIHNvIGBzcmMvYXBwYCBsZWFrcyBpbiBqdXN0IGFzIGEgcmVwby13aWRlIGdsb2IgY2FuIHB1bGwgaW4gYGFwcGAuXG5jb25zdCBmcmFtZXdvcmtBcHBEaXJOYW1lcyA9IFsnYXBwJywgJ3NyYy9hcHAnXTtcblxuLyoqIFJvb3QgYGV4Y2x1ZGVgIGVudHJpZXMgKHBvc2l4LCByZWxhdGl2ZSB0byB0aGUgcm9vdCkgZm9yIGV2ZXJ5IGZyYW1ld29yayB3b3Jrc3BhY2UncyBhcHAgZGlyZWN0b3J5LiAqL1xuZnVuY3Rpb24gZ2V0RnJhbWV3b3JrV29ya3NwYWNlQXBwRXhjbHVkZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nW10ge1xuICBpZiAoIWNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucykgcmV0dXJuIFtdO1xuICBjb25zdCBleGNsdWRlczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCB3b3Jrc3BhY2VEaXJQYXRoIG9mIGdldFdvcmtzcGFjZVN1YkRpclBhdGhzKGNvbmZpZykpIHtcbiAgICBpZiAoIWRlcGVuZHNPbkZyYW1ld29yayhwYXRoLnJlc29sdmUod29ya3NwYWNlRGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkgY29udGludWU7XG4gICAgZm9yIChjb25zdCBhcHBEaXJOYW1lIG9mIGZyYW1ld29ya0FwcERpck5hbWVzKSB7XG4gICAgICBjb25zdCBhcHBEaXJQYXRoID0gcGF0aC5yZXNvbHZlKHdvcmtzcGFjZURpclBhdGgsIGFwcERpck5hbWUpO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoYXBwRGlyUGF0aCkpIGV4Y2x1ZGVzLnB1c2gocGF0aC5yZWxhdGl2ZShjb25maWcuZGlyUGF0aCwgYXBwRGlyUGF0aCkucmVwbGFjZUFsbCgnXFxcXCcsICcvJykpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZXhjbHVkZXM7XG59XG5cbmZ1bmN0aW9uIGRlcGVuZHNPbkZyYW1ld29yayhtYW5pZmVzdFBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBsZXQgbWFuaWZlc3Q6IFBhY2thZ2VKc29uIHwgbnVsbDtcbiAgdHJ5IHtcbiAgICBtYW5pZmVzdCA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKG1hbmlmZXN0UGF0aCwgJ3V0ZjgnKSkgYXMgUGFja2FnZUpzb24gfCBudWxsO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLy8gQSBtYW5pZmVzdCB0aGF0IHBhcnNlcyB0byBhIG5vbi1vYmplY3QgKGUuZy4gYSBmaWxlIGxpdGVyYWxseSBjb250YWluaW5nIGBudWxsYCkgZGVjbGFyZXMgbm9cbiAgLy8gZGVwZW5kZW5jaWVzOyBndWFyZCB0aGUgcHJvcGVydHkgYWNjZXNzLCB3aGljaCB3b3VsZCBvdGhlcndpc2UgdGhyb3cgb3V0c2lkZSB0aGUgdHJ5IGFib3ZlLlxuICBpZiAoIW1hbmlmZXN0IHx8IHR5cGVvZiBtYW5pZmVzdCAhPT0gJ29iamVjdCcpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgZGVwZW5kZW5jaWVzID0geyAuLi5tYW5pZmVzdC5kZXBlbmRlbmNpZXMsIC4uLm1hbmlmZXN0LmRldkRlcGVuZGVuY2llcyB9O1xuICByZXR1cm4gZnJhbWV3b3JrRGVwZW5kZW5jeU5hbWVzLnNvbWUoKGRlcGVuZGVuY3lOYW1lKSA9PiBkZXBlbmRlbmNpZXNbZGVwZW5kZW5jeU5hbWVdKTtcbn1cblxuY29uc3QgbWFuYWdlZFdvcmtzcGFjZUluY2x1ZGVTdWZmaXhlcyA9IFsnKi5jb25maWcudHMnLCAnc2NyaXB0cy8qKi8qJywgJ3NyYy8qKi8qJywgJ3Rlc3QvKiovKiddO1xuXG4vKipcbiAqIFJvb3QgaW5jbHVkZS9leGNsdWRlIGVudHJpZXMgd2JmeSBnZW5lcmF0ZWQgZm9yIGFuIGVhcmxpZXIgd29ya3NwYWNlIGxheW91dCAoZS5nLiBgcGFja2FnZXMvKmBcbiAqIGdsb2JzIGluIGEgcmVwbyB0aGF0IG5vdyBkZWNsYXJlcyBvbmx5IGBhcHBzLypgKSBtdXN0IG5vdCBzdXJ2aXZlIHRoZSBtZXJnZSB3aXRoIHRoZSBleGlzdGluZ1xuICogdHNjb25maWcsIG9yIHRoZSBvYnNvbGV0ZSBkaXJlY3RvcmllcyB3b3VsZCBrZWVwIGVudGVyaW5nIHJvb3QgdHlwZSBjaGVja2luZyBmb3JldmVyLiBBIHByZWZpeFxuICogY291bnRzIGFzIHdiZnktbWFuYWdlZCBvbmx5IHdoZW4gdGhlIENPTVBMRVRFIGdlbmVyYXRlZCBpbmNsdWRlIHNldCBmb3IgaXQgaXMgcHJlc2VudCBhbmQgbm9cbiAqIGxvbmdlciBnZW5lcmF0ZWQg4oCUIGEgdXNlci1hdXRob3JlZCBlbnRyeSBzdWNoIGFzIGEgbG9uZSBgdG9vbHMvKlxcL3NyYy8qKlxcLypgIG5ldmVyIHF1YWxpZmllcy5cbiAqL1xuZnVuY3Rpb24gcmVtb3ZlU3RhbGVNYW5hZ2VkV29ya3NwYWNlRW50cmllcyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBvbGRTZXR0aW5nczogVHNDb25maWdKc29uLFxuICBuZXdTZXR0aW5nczogVHNDb25maWdKc29uXG4pOiB2b2lkIHtcbiAgY29uc3Qgc3RhbGVQcmVmaXhlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBpZiAoQXJyYXkuaXNBcnJheShvbGRTZXR0aW5ncy5pbmNsdWRlKSkge1xuICAgIGNvbnN0IG9sZEluY2x1ZGUgPSBvbGRTZXR0aW5ncy5pbmNsdWRlLmZpbHRlcigoZW50cnkpOiBlbnRyeSBpcyBzdHJpbmcgPT4gdHlwZW9mIGVudHJ5ID09PSAnc3RyaW5nJyk7XG4gICAgY29uc3QgZ2VuZXJhdGVkSW5jbHVkZSA9IG5ldyBTZXQobmV3U2V0dGluZ3MuaW5jbHVkZSk7XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBvbGRJbmNsdWRlKSB7XG4gICAgICBjb25zdCB3b3Jrc3BhY2VQcmVmaXggPSBnZXRNYW5hZ2VkV29ya3NwYWNlUHJlZml4KGVudHJ5KTtcbiAgICAgIGlmICh3b3Jrc3BhY2VQcmVmaXggPT09IHVuZGVmaW5lZCB8fCBzdGFsZVByZWZpeGVzLmhhcyh3b3Jrc3BhY2VQcmVmaXgpKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGlzQ29tcGxldGUgPSBtYW5hZ2VkV29ya3NwYWNlSW5jbHVkZVN1ZmZpeGVzLmV2ZXJ5KChzdWZmaXgpID0+XG4gICAgICAgIG9sZEluY2x1ZGUuaW5jbHVkZXMoYCR7d29ya3NwYWNlUHJlZml4fS8ke3N1ZmZpeH1gKVxuICAgICAgKTtcbiAgICAgIGNvbnN0IGlzU3RpbGxHZW5lcmF0ZWQgPSBtYW5hZ2VkV29ya3NwYWNlSW5jbHVkZVN1ZmZpeGVzLnNvbWUoKHN1ZmZpeCkgPT5cbiAgICAgICAgZ2VuZXJhdGVkSW5jbHVkZS5oYXMoYCR7d29ya3NwYWNlUHJlZml4fS8ke3N1ZmZpeH1gKVxuICAgICAgKTtcbiAgICAgIGlmIChpc0NvbXBsZXRlICYmICFpc1N0aWxsR2VuZXJhdGVkKSBzdGFsZVByZWZpeGVzLmFkZCh3b3Jrc3BhY2VQcmVmaXgpO1xuICAgIH1cbiAgICBpZiAoc3RhbGVQcmVmaXhlcy5zaXplID4gMCkge1xuICAgICAgb2xkU2V0dGluZ3MuaW5jbHVkZSA9IG9sZFNldHRpbmdzLmluY2x1ZGUuZmlsdGVyKChlbnRyeSkgPT4ge1xuICAgICAgICBjb25zdCB3b3Jrc3BhY2VQcmVmaXggPSB0eXBlb2YgZW50cnkgPT09ICdzdHJpbmcnID8gZ2V0TWFuYWdlZFdvcmtzcGFjZVByZWZpeChlbnRyeSkgOiB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiB3b3Jrc3BhY2VQcmVmaXggPT09IHVuZGVmaW5lZCB8fCAhc3RhbGVQcmVmaXhlcy5oYXMod29ya3NwYWNlUHJlZml4KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBpZiAoIUFycmF5LmlzQXJyYXkob2xkU2V0dGluZ3MuZXhjbHVkZSkpIHJldHVybjtcbiAgY29uc3QgZ2VuZXJhdGVkRXhjbHVkZSA9IG5ldyBTZXQobmV3U2V0dGluZ3MuZXhjbHVkZSk7XG4gIGNvbnN0IHdvcmtzcGFjZURpclBhdGhzID0gY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zXG4gICAgPyBnZXRXb3Jrc3BhY2VTdWJEaXJQYXRocyhjb25maWcpLm1hcCgod29ya3NwYWNlRGlyUGF0aCkgPT5cbiAgICAgICAgcGF0aC5yZWxhdGl2ZShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgpLCB3b3Jrc3BhY2VEaXJQYXRoKS5yZXBsYWNlQWxsKCdcXFxcJywgJy8nKVxuICAgICAgKVxuICAgIDogW107XG4gIG9sZFNldHRpbmdzLmV4Y2x1ZGUgPSBvbGRTZXR0aW5ncy5leGNsdWRlLmZpbHRlcigoZW50cnkpID0+IHtcbiAgICBpZiAodHlwZW9mIGVudHJ5ICE9PSAnc3RyaW5nJyB8fCBnZW5lcmF0ZWRFeGNsdWRlLmhhcyhlbnRyeSkpIHJldHVybiB0cnVlO1xuICAgIGlmIChlbnRyeS5lbmRzV2l0aCgnL3Rlc3QvZml4dHVyZXMnKSkge1xuICAgICAgcmV0dXJuICFzdGFsZVByZWZpeGVzLmhhcyhlbnRyeS5zbGljZSgwLCAtJy90ZXN0L2ZpeHR1cmVzJy5sZW5ndGgpKTtcbiAgICB9XG4gICAgLy8gQSBmcmFtZXdvcmsgYXBwIGV4Y2x1ZGUgKGA8d29ya3NwYWNlPi9hcHBgLCBgPHdvcmtzcGFjZT4vc3JjL2FwcGApIGZvciBhIHN0aWxsLWRlY2xhcmVkXG4gICAgLy8gd29ya3NwYWNlIGlzIHBydW5lZCBieSBjb3ZlcnNXb3Jrc3BhY2VEaXIgYmVsb3cgd2hlbiBubyBsb25nZXIgZ2VuZXJhdGVkOyB0aGlzIGNhdGNoZXMgdGhlXG4gICAgLy8gcmVtYWluaW5nIGNhc2UsIHdoZXJlIHRoZSB3b3Jrc3BhY2UgaXRzZWxmIHdhcyByZW1vdmVkIGFuZCBpdHMgcHJlZml4IGlzIHRoZXJlZm9yZSBzdGFsZS5cbiAgICAvLyAoQSB3cm9uZyBzdWZmaXggc3RyaXAgeWllbGRzIGEgcHJlZml4IGFic2VudCBmcm9tIHN0YWxlUHJlZml4ZXMsIHNvIHRlc3RpbmcgZXZlcnkgbmFtZSBpcyBzYWZlLilcbiAgICBpZiAoXG4gICAgICBmcmFtZXdvcmtBcHBEaXJOYW1lcy5zb21lKFxuICAgICAgICAoYXBwRGlyTmFtZSkgPT4gZW50cnkuZW5kc1dpdGgoYC8ke2FwcERpck5hbWV9YCkgJiYgc3RhbGVQcmVmaXhlcy5oYXMoZW50cnkuc2xpY2UoMCwgLShhcHBEaXJOYW1lLmxlbmd0aCArIDEpKSlcbiAgICAgIClcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuICFjb3ZlcnNXb3Jrc3BhY2VEaXIoZW50cnksIHdvcmtzcGFjZURpclBhdGhzKTtcbiAgfSk7XG59XG5cbi8vIFdoZXRoZXIgYW4gZXhjbHVkZSBlbnRyeSBpcyBhIHdvcmtzcGFjZSBuZWdhdGlvbiAoYCFhcHBzL2V4Y2x1ZGVkYCkgd2hvc2UgbmVnYXRpb24gaXMgZ29uZTogdGhlXG4vLyBkaXJlY3RvcnkgaXMgYSB3b3Jrc3BhY2UgYWdhaW4gYW5kIG11c3QgcmUtZW50ZXIgdGhlIHJvb3QgcHJvamVjdC4gd2JmeSB3cml0ZXMgc3VjaCBhIG5lZ2F0aW9uIGFzXG4vLyBhIGRpcmVjdG9yeSBwYXRoLCBhcyBhIGRpcmVjdG9yeSBQQVRURVJOIHdoZW4gaXQgZXhjbHVkZXMgZXhhY3RseSB3aGF0IGl0IG1hdGNoZXMgKGBhcHBzLypiYCksIG9yXG4vLyBhcyBhbiBhbmNlc3RvcidzIHBhY2thZ2Utb3duZWQgc3VicGF0aHMgKGBhcHBzL3gvc3JjYCkg4oCUIHNvIHRoZSBlbnRyeSBtYXkgY292ZXIgYSBkaXNjb3ZlcmVkXG4vLyB3b3Jrc3BhY2UgZGlyZWN0b3J5IG9yIHNpdCB1bmRlciBvbmUuIEEgZ2xvYnN0YXIgc2VnbWVudCBtYXJrcyBhIGh5Z2llbmUgZ2xvYiAobm9kZV9tb2R1bGVzLCBlMmVcbi8vIGFuZCBmcmllbmRzKSwgd2hpY2ggaXMgbmV2ZXIgbmVnYXRpb24tZGVyaXZlZCBhbmQgbXVzdCBzdXJ2aXZlLlxuZnVuY3Rpb24gY292ZXJzV29ya3NwYWNlRGlyKGVudHJ5OiBzdHJpbmcsIHdvcmtzcGFjZURpclBhdGhzOiByZWFkb25seSBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICBpZiAoZW50cnkuc3BsaXQoJy8nKS5pbmNsdWRlcygnKionKSkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCByZWdleFNvdXJjZSA9IGVudHJ5XG4gICAgLnNwbGl0KCcvJylcbiAgICAubWFwKChzZWdtZW50KSA9PlxuICAgICAgc2VnbWVudFxuICAgICAgICAucmVwbGFjZUFsbCgvWy4rXiR7fSgpfFtcXF1cXFxcXS9ndSwgU3RyaW5nLnJhd2BcXCQmYClcbiAgICAgICAgLnJlcGxhY2VBbGwoJyonLCAnW14vXSonKVxuICAgICAgICAucmVwbGFjZUFsbCgnPycsICdbXi9dJylcbiAgICApXG4gICAgLmpvaW4oJy8nKTtcbiAgY29uc3QgZW50cnlQYXR0ZXJuID0gbmV3IFJlZ0V4cChgXiR7cmVnZXhTb3VyY2V9KD86Ly4qKT8kYCwgJ3UnKTtcbiAgcmV0dXJuIHdvcmtzcGFjZURpclBhdGhzLnNvbWUoXG4gICAgKHdvcmtzcGFjZURpclBhdGgpID0+IGVudHJ5UGF0dGVybi50ZXN0KHdvcmtzcGFjZURpclBhdGgpIHx8IGVudHJ5LnN0YXJ0c1dpdGgoYCR7d29ya3NwYWNlRGlyUGF0aH0vYClcbiAgKTtcbn1cblxuZnVuY3Rpb24gZ2V0TWFuYWdlZFdvcmtzcGFjZVByZWZpeChlbnRyeTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgbWF0Y2hlZFN1ZmZpeCA9IG1hbmFnZWRXb3Jrc3BhY2VJbmNsdWRlU3VmZml4ZXMuZmluZCgoc3VmZml4KSA9PiBlbnRyeS5lbmRzV2l0aChgLyR7c3VmZml4fWApKTtcbiAgaWYgKCFtYXRjaGVkU3VmZml4KSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCB3b3Jrc3BhY2VQcmVmaXggPSBlbnRyeS5zbGljZSgwLCAtKG1hdGNoZWRTdWZmaXgubGVuZ3RoICsgMSkpO1xuICByZXR1cm4gd29ya3NwYWNlUHJlZml4ID09PSAnJyA/IHVuZGVmaW5lZCA6IHdvcmtzcGFjZVByZWZpeDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbm9ybWFsaXplRnJhbWV3b3JrVHNjb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIC8vIE5leHQvQmxpdHogb3duIHRoZWlyIHRzY29uZmlnIHNoYXBlLCBidXQgVHlwZVNjcmlwdCA2IG5vIGxvbmdlciBhY2NlcHRzXG4gIC8vIG5vZGUxMCByZXNvbHZlciBzcGVsbGluZ3MgdGhhdCBvbGRlciBwcm9qZWN0cyBjb21tb25seSBpbmhlcml0ZWQuXG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAndHNjb25maWcuanNvbicpO1xuICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gIGlmIChleGlzdGluZ0NvbnRlbnQgPT09IHVuZGVmaW5lZCB8fCBqc29uY1V0aWwuaXNUcml2aWFPbmx5KGV4aXN0aW5nQ29udGVudCkpIHJldHVybjtcbiAgY29uc3Qgc2V0dGluZ3MgPSBqc29uY1V0aWwucGFyc2VPYmplY3RJZ25vcmluZ0Vycm9yPFRzQ29uZmlnSnNvbj4oZXhpc3RpbmdDb250ZW50KTtcbiAgaWYgKCFzZXR0aW5ncykge1xuICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCBjbGVhbmluZyB1cCAke2ZpbGVQYXRofSBiZWNhdXNlIHRoZSBleGlzdGluZyBjb250ZW50IGlzIG5vdCBwYXJzYWJsZSBhcyBKU09OQy5gKTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3Qgb3JpZ2luYWxTZXR0aW5nc0pzb24gPSBKU09OLnN0cmluZ2lmeShzZXR0aW5ncyk7XG4gIG5vcm1hbGl6ZU5leHRUc2NvbmZpZ01vZHVsZVNldHRpbmdzKHNldHRpbmdzKTtcbiAgbm9ybWFsaXplTmV4dFRzY29uZmlnUGF0aEFsaWFzZXMoc2V0dGluZ3MuY29tcGlsZXJPcHRpb25zKTtcbiAgYWRkU2NyaXB0c0luY2x1ZGVGb3JGcmFtZXdvcmtQcm9qZWN0KHNldHRpbmdzKTtcbiAgYWRkVW5kaWNpVHlwZXNQYXRoTWFwcGluZyhzZXR0aW5ncywgY29uZmlnKTtcbiAgLy8gU2tpcCB0aGUgd3JpdGUgd2hlbiBub3RoaW5nIGNoYW5nZXMgc2VtYW50aWNhbGx5LCBzbyBKU09OQyBjb21tZW50cyBhbmQgZm9ybWF0dGluZyBpbiBhblxuICAvLyBhbHJlYWR5LWNsZWFuIHRzY29uZmlnLmpzb24gc3Vydml2ZSB3YmZ5IHJ1bnMuXG4gIGlmIChKU09OLnN0cmluZ2lmeShzZXR0aW5ncykgPT09IG9yaWdpbmFsU2V0dGluZ3NKc29uKSByZXR1cm47XG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBKU09OLnN0cmluZ2lmeShzZXR0aW5ncywgdW5kZWZpbmVkLCAyKSkpO1xufVxuXG4vKipcbiAqIGJ1bi10eXBlcyByZWZlcmVuY2VzIHVuZGljaS10eXBlcyB3aXRob3V0IGRlY2xhcmluZyBpdCBhcyBhIGRlcGVuZGVuY3kgKG92ZW4tc2gvYnVuIzIyODA1KSwgc29cbiAqIEJ1bidzIGlzb2xhdGVkIGxpbmtlciAoZXNwZWNpYWxseSB3aXRoIHRoZSBnbG9iYWwgc3RvcmUgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeSkgY2Fubm90IHJlc29sdmVcbiAqIGl0IGZyb20gYnVuLXR5cGVzJyBsb2NhdGlvbiwgd2hpY2ggc2lsZW50bHkgZGVncmFkZXMgZ2xvYmFsIGZldGNoIHR5cGVzIHN1Y2ggYXMgUmVzcG9uc2UuIE1hcCBpdFxuICogdG8gdGhlIGNvcHkgdGhhdCBidW5maWcudG9tbCdzIHB1YmxpY0hvaXN0UGF0dGVybiBwbGFjZXMgaW4gdGhlIHJvb3Qgbm9kZV9tb2R1bGVzLlxuICovXG5mdW5jdGlvbiBhZGRVbmRpY2lUeXBlc1BhdGhNYXBwaW5nKHNldHRpbmdzOiBUc0NvbmZpZ0pzb24sIGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHZvaWQge1xuICAvLyBNYXAgdW5kaWNpLXR5cGVzIG9ubHkgd2hlbiBidW4tdHlwZXMgYWN0dWFsbHkgbG9hZHM6IGFuIGV4cGxpY2l0IGB0eXBlc2AgbGlzdCBsb2FkcyBpdCBpZmYgaXRcbiAgLy8gY29udGFpbnMgXCJidW5cIiAoZXZlbiBvbiBSZWFjdCBOYXRpdmUsIHdob3NlIHByb2plY3RzIG1heSBvcHQgaW4gYnkgaGFuZCk7IHdpdGggYHR5cGVzYFxuICAvLyBvbWl0dGVkLCBUeXBlU2NyaXB0J3MgYXV0b21hdGljIEB0eXBlcyBpbmNsdXNpb24gbG9hZHMgaXQgYmVjYXVzZSB3YmZ5IGluc3RhbGxzIEB0eXBlcy9idW5cbiAgLy8gZm9yIGV2ZXJ5IEphdmFTY3JpcHQgb3IgVHlwZVNjcmlwdCBwcm9qZWN0IGV4Y2VwdCBSZWFjdCBOYXRpdmUsIHdoaWNoIHVzZXNcbiAgLy8gQHRzY29uZmlnL3JlYWN0LW5hdGl2ZSBpbnN0ZWFkLlxuICBjb25zdCB0eXBlcyA9IHNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8udHlwZXM7XG4gIGlmICh0eXBlcyA/ICF0eXBlcy5pbmNsdWRlcygnYnVuJykgOiBjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSByZXR1cm47XG4gIGNvbnN0IGNvcnJlY3RNYXBwaW5nID0gYCR7Z2V0Um9vdERpcihjb25maWcpfS9ub2RlX21vZHVsZXMvdW5kaWNpLXR5cGVzL2luZGV4LmQudHNgO1xuICBjb25zdCBleGlzdGluZ01hcHBpbmcgPSBzZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LnBhdGhzPy5bJ3VuZGljaS10eXBlcyddO1xuICBpZiAoZXhpc3RpbmdNYXBwaW5nKSB7XG4gICAgLy8gUmV3cml0ZSB0aGUgZ2VuZXJhdGVkIG1hcHBpbmcgd2hlbiBhIHdvcmtzcGFjZSBtb3ZlcyB0byBhIGRpZmZlcmVudCByb290IGRlcHRoLiBBbnkgb3RoZXJcbiAgICAvLyB2YWx1ZSBpcyBhIGRlbGliZXJhdGUgcmVwby1sb2NhbCBtYXBwaW5nIChlLmcuIHBhdGNoZWQgdHlwZXMpIGFuZCBtdXN0IGJlIGtlcHQuXG4gICAgaWYgKFxuICAgICAgZXhpc3RpbmdNYXBwaW5nLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgdHlwZW9mIGV4aXN0aW5nTWFwcGluZ1swXSA9PT0gJ3N0cmluZycgJiZcbiAgICAgIC8oPzpefFxcLylub2RlX21vZHVsZXNcXC91bmRpY2ktdHlwZXNcXC9pbmRleFxcLmRcXC50cyQvdS50ZXN0KGV4aXN0aW5nTWFwcGluZ1swXSlcbiAgICApIHtcbiAgICAgIHNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyEucGF0aHMhWyd1bmRpY2ktdHlwZXMnXSA9IFtjb3JyZWN0TWFwcGluZ107XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIHNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyA/Pz0ge307XG4gIHNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucy5wYXRocyA9IHtcbiAgICAuLi5zZXR0aW5ncy5jb21waWxlck9wdGlvbnMucGF0aHMsXG4gICAgJ3VuZGljaS10eXBlcyc6IFtjb3JyZWN0TWFwcGluZ10sXG4gIH07XG59XG5cbmZ1bmN0aW9uIGFkZFNjcmlwdHNJbmNsdWRlRm9yRnJhbWV3b3JrUHJvamVjdChzZXR0aW5nczogVHNDb25maWdKc29uKTogdm9pZCB7XG4gIC8vIE9taXR0aW5nIGluY2x1ZGUgbGV0cyBmcmFtZXdvcmsgdHNjb25maWdzIGtlZXAgVHlwZVNjcmlwdCdzIGRlZmF1bHRcbiAgLy8gXCJhbGwgVFMvVFNYIGZpbGVzXCIgYmVoYXZpb3IsIHdoaWNoIGFscmVhZHkgY292ZXJzIHNjcmlwdHMuXG4gIGlmICghc2V0dGluZ3MuaW5jbHVkZSkgcmV0dXJuO1xuICBpZiAoc2V0dGluZ3MuaW5jbHVkZS5pbmNsdWRlcygnc2NyaXB0cy8qKi8qJykpIHJldHVybjtcblxuICBzZXR0aW5ncy5pbmNsdWRlLnB1c2goJ3NjcmlwdHMvKiovKicpO1xuICBzZXR0aW5ncy5pbmNsdWRlLnNvcnQoKTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplTmV4dFRzY29uZmlnTW9kdWxlU2V0dGluZ3Moc2V0dGluZ3M6IFRzQ29uZmlnSnNvbik6IHZvaWQge1xuICBjb25zdCBjb21waWxlck9wdGlvbnMgPSBzZXR0aW5ncy5jb21waWxlck9wdGlvbnM7XG4gIGlmICghY29tcGlsZXJPcHRpb25zKSByZXR1cm47XG4gIGNvbnN0IG1vZHVsZVJlc29sdXRpb24gPSBsb3dlckNhc2VTZXR0aW5nKGNvbXBpbGVyT3B0aW9ucy5tb2R1bGVSZXNvbHV0aW9uKTtcbiAgaWYgKG1vZHVsZVJlc29sdXRpb24gPT09ICdub2RlJyB8fCBtb2R1bGVSZXNvbHV0aW9uID09PSAnbm9kZTEwJyB8fCBtb2R1bGVSZXNvbHV0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICBpZiAoc2V0dGluZ3MuZXh0ZW5kcykge1xuICAgICAgLy8gQW4gZXh0ZW5kZWQgY29uZmlnIG1heSBhbHJlYWR5IHN1cHBseSBhIHZhbGlkIG1vZHVsZS9yZXNvbHZlciBwYWlyLCBzbyBvbmx5XG4gICAgICAvLyByZW1vdmUgdGhlIHJlbW92ZWQtaW4tVFM2IG5vZGUxMCBzcGVsbGluZ3MgaW5zdGVhZCBvZiBmb3JjaW5nIGJ1bmRsZXIgb24gaXQuXG4gICAgICBkZWxldGUgY29tcGlsZXJPcHRpb25zLm1vZHVsZVJlc29sdXRpb247XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5leHQuanMgd3JpdGVzIFwibm9kZVwiIGR1cmluZyBidWlsZCB3aGVuIHRoaXMgb3B0aW9uIGlzIG1pc3NpbmcsIGJ1dFxuICAgICAgLy8gdHNnb2xpbnQgdHJlYXRzIHRoYXQgc3BlbGxpbmcgYXMgdGhlIHJlbW92ZWQgbm9kZTEwIHJlc29sdmVyLlxuICAgICAgY29tcGlsZXJPcHRpb25zLm1vZHVsZVJlc29sdXRpb24gPSAnYnVuZGxlcic7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZU5leHRUc2NvbmZpZ1BhdGhBbGlhc2VzKGNvbXBpbGVyT3B0aW9uczogVHNDb25maWdKc29uLkNvbXBpbGVyT3B0aW9ucyB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICBpZiAoIWNvbXBpbGVyT3B0aW9ucykgcmV0dXJuO1xuXG4gIC8vIHRzZ29saW50IGZvbGxvd3MgVHlwZVNjcmlwdCA2IHZhbGlkYXRpb24sIHdoZXJlIGJhc2VVcmwgaXMgcmVtb3ZlZCBhbmRcbiAgLy8gcGF0aCB0YXJnZXRzIG11c3QgYmUgZXhwbGljaXRseSByZWxhdGl2ZS4gTmV4dC5qcyBzdGlsbCBhY2NlcHRzIHRoZSBhbGlhc1xuICAvLyBzaGFwZSBhZnRlciBlYWNoIHRhcmdldCBpcyB3cml0dGVuIHdpdGggYSBsZWFkaW5nIC4vLlxuICBkZWxldGUgY29tcGlsZXJPcHRpb25zLmJhc2VVcmw7XG4gIGlmICghY29tcGlsZXJPcHRpb25zLnBhdGhzKSByZXR1cm47XG5cbiAgZm9yIChjb25zdCBbYWxpYXMsIHRhcmdldHNdIG9mIE9iamVjdC5lbnRyaWVzKGNvbXBpbGVyT3B0aW9ucy5wYXRocykpIHtcbiAgICBjb21waWxlck9wdGlvbnMucGF0aHNbYWxpYXNdID0gbm9ybWFsaXplUGF0aEFsaWFzVGFyZ2V0cyh0YXJnZXRzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVQYXRoQWxpYXNUYXJnZXRzKHRhcmdldHM6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICByZXR1cm4gdGFyZ2V0cy5tYXAoKHRhcmdldCkgPT4ge1xuICAgIGlmICh0YXJnZXQuc3RhcnRzV2l0aCgnLi8nKSB8fCB0YXJnZXQuc3RhcnRzV2l0aCgnLi4vJykgfHwgcGF0aC5pc0Fic29sdXRlKHRhcmdldCkpIHJldHVybiB0YXJnZXQ7XG4gICAgcmV0dXJuIGAuLyR7dGFyZ2V0fWA7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRSb290RGlyKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIGlmIChjb25maWcuaXNSb290KSByZXR1cm4gJy4nO1xuICAvLyBUaGUgdW5kaWNpLXR5cGVzIHBhdGggbWFwcGluZyBtdXN0IHJlYWNoIHRoZSBtb25vcmVwbyByb290J3Mgbm9kZV9tb2R1bGVzIChidW5maWcudG9tbCdzXG4gIC8vIHB1YmxpY0hvaXN0UGF0dGVybiBob2lzdHMgdGhlIHBhY2thZ2UgdGhlcmUpLCBhbmQgd29ya3NwYWNlIHBhdHRlcm5zIG1heSBiZSBhcmJpdHJhcmlseSBkZWVwXG4gIC8vIChlLmcuIGBleGFtcGxlcy8qKmApLCBzbyBhIGZpeGVkIHR3by1sZXZlbCBwcm9iZSBpcyBub3QgZW5vdWdoLiBQcmVmZXIgdGhlIG5lYXJlc3QgYW5jZXN0b3JcbiAgLy8gbWFuaWZlc3QgdGhhdCBkZWNsYXJlcyB3b3Jrc3BhY2VzICh0aGUgbW9ub3JlcG8gcm9vdCk7IG90aGVyd2lzZSBmYWxsIGJhY2sgdG8gdGhlIG5lYXJlc3RcbiAgLy8gYW5jZXN0b3IgbWFuaWZlc3QuIFN0b3AgYXQgdGhlIGZpcnN0IGdpdCByZXBvc2l0b3J5IGJvdW5kYXJ5IHNvIGFuIHVucmVsYXRlZCBlbmNsb3NpbmdcbiAgLy8gcmVwb3NpdG9yeSdzIG1hbmlmZXN0IGNhbiBuZXZlciBiZSBjaG9zZW4uXG4gIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgpO1xuICBsZXQgcm9vdERpclBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgZm9yIChsZXQgYW5jZXN0b3JEaXJQYXRoID0gcGF0aC5kaXJuYW1lKGRpclBhdGgpOyA7IGFuY2VzdG9yRGlyUGF0aCA9IHBhdGguZGlybmFtZShhbmNlc3RvckRpclBhdGgpKSB7XG4gICAgY29uc3QgbWFuaWZlc3RQYXRoID0gcGF0aC5yZXNvbHZlKGFuY2VzdG9yRGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKG1hbmlmZXN0UGF0aCkpIHtcbiAgICAgIHJvb3REaXJQYXRoID8/PSBhbmNlc3RvckRpclBhdGg7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBtYW5pZmVzdCA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKG1hbmlmZXN0UGF0aCwgJ3V0ZjgnKSkgYXMgUGFja2FnZUpzb247XG4gICAgICAgIC8vIEJ1biBuby1vcCBwYXR0ZXJucyAoZS5nLiBgd29ya3NwYWNlczogW1wiXCJdYCkgZG8gbm90IG1ha2UgYSBtYW5pZmVzdCBhIHdvcmtzcGFjZSByb290LlxuICAgICAgICBpZiAoZ2V0TWVhbmluZ2Z1bERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMobWFuaWZlc3Qud29ya3NwYWNlcykubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHJvb3REaXJQYXRoID0gYW5jZXN0b3JEaXJQYXRoO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gQW4gdW5wYXJzYWJsZSBtYW5pZmVzdCBzdGlsbCBtYXJrcyBhIHByb2plY3QgZGlyZWN0b3J5OyBrZWVwIGNsaW1iaW5nIGZvciBhIHdvcmtzcGFjZSByb290LlxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBpc1JlcG9Cb3VuZGFyeSA9IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGFuY2VzdG9yRGlyUGF0aCwgJy5naXQnKSk7XG4gICAgY29uc3QgaXNGaWxlc3lzdGVtUm9vdCA9IGFuY2VzdG9yRGlyUGF0aCA9PT0gcGF0aC5kaXJuYW1lKGFuY2VzdG9yRGlyUGF0aCk7XG4gICAgaWYgKGlzUmVwb0JvdW5kYXJ5IHx8IGlzRmlsZXN5c3RlbVJvb3QpIGJyZWFrO1xuICB9XG4gIGlmICghcm9vdERpclBhdGgpIHJldHVybiAnLic7XG4gIHJldHVybiBwYXRoLnJlbGF0aXZlKGRpclBhdGgsIHJvb3REaXJQYXRoKS5yZXBsYWNlQWxsKCdcXFxcJywgJy8nKSB8fCAnLic7XG59XG5cbmZ1bmN0aW9uIG1lcmdlVHNjb25maWdFeHRlbmRzKFxuICBnZW5lcmF0ZWRFeHRlbmRzOiBUc0NvbmZpZ0pzb25bJ2V4dGVuZHMnXSxcbiAgZXhpc3RpbmdFeHRlbmRzOiBUc0NvbmZpZ0pzb25bJ2V4dGVuZHMnXVxuKTogVHNDb25maWdKc29uWydleHRlbmRzJ10ge1xuICBjb25zdCBtZXJnZWRFeHRlbmRzID0gWy4uLm5vcm1hbGl6ZUV4dGVuZHMoZ2VuZXJhdGVkRXh0ZW5kcyksIC4uLm5vcm1hbGl6ZUV4dGVuZHMoZXhpc3RpbmdFeHRlbmRzKV07XG4gIGNvbnN0IHVuaXF1ZUV4dGVuZHMgPSBbLi4ubmV3IFNldChtZXJnZWRFeHRlbmRzKV07XG4gIGlmICh1bmlxdWVFeHRlbmRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKHVuaXF1ZUV4dGVuZHMubGVuZ3RoID09PSAxKSByZXR1cm4gdW5pcXVlRXh0ZW5kc1swXTtcbiAgcmV0dXJuIHVuaXF1ZUV4dGVuZHM7XG59XG5cbmZ1bmN0aW9uIGFkZEluY2x1ZGVQYXRoKHNldHRpbmdzOiBUc0NvbmZpZ0pzb24sIGRpclBhdGg6IHN0cmluZyk6IHZvaWQge1xuICBzZXR0aW5ncy5pbmNsdWRlID8/PSBbXTtcbiAgaWYgKCFzZXR0aW5ncy5pbmNsdWRlLmluY2x1ZGVzKGRpclBhdGgpKSB7XG4gICAgc2V0dGluZ3MuaW5jbHVkZS5wdXNoKGRpclBhdGgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUV4dGVuZHModmFsdWU6IFRzQ29uZmlnSnNvblsnZXh0ZW5kcyddKTogc3RyaW5nW10ge1xuICBpZiAoIXZhbHVlKSByZXR1cm4gW107XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplU3RyaW5nQXJyYXkodmFsdWU6IHVua25vd24pOiBzdHJpbmdbXSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSByZXR1cm4gW3ZhbHVlXTtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIFtdO1xuICByZXR1cm4gdmFsdWUuZmlsdGVyKChpdGVtKTogaXRlbSBpcyBzdHJpbmcgPT4gdHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkRGVsZXRlVHlwZVJvb3RzKHR5cGVOYW1lczogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgLy8gT25seSBnZW5lcmF0ZWQgcGFja2FnZS1vd25lZCB0ZXN0IHR5cGVzIHNob3VsZCB0cmlnZ2VyIHRoaXMuIFVzZXItZGVmaW5lZCBzbGFzaC1iYXNlZFxuICAvLyBlbnRyaWVzIG1heSBpbnRlbnRpb25hbGx5IHJlbHkgb24gY3VzdG9tIHR5cGVSb290cyBhbmQgc2hvdWxkIGJlIHByZXNlcnZlZCBhcy1pcy5cbiAgcmV0dXJuIHR5cGVOYW1lcy5zb21lKCh0eXBlTmFtZSkgPT4gdHlwZU5hbWUgPT09ICdjeXByZXNzJyB8fCB0eXBlTmFtZS5pbmNsdWRlcygnLycpKTtcbn1cblxuZnVuY3Rpb24gZmlsdGVyRXhpc3RpbmdUeXBlcyhleGlzdGluZ1R5cGVzOiBzdHJpbmdbXSwgZ2VuZXJhdGVkVHlwZXM6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICBjb25zdCBnZW5lcmF0ZWRUeXBlU2V0ID0gbmV3IFNldChnZW5lcmF0ZWRUeXBlcyk7XG4gIHJldHVybiBleGlzdGluZ1R5cGVzLmZpbHRlcigodHlwZU5hbWUpID0+IHtcbiAgICAvLyB3YmZ5IG93bnMgdGhlc2UgcGFja2FnZS1wcm92aWRlZCB0ZXN0IGdsb2JhbHMuIERyb3Agc3RhbGUgZW50cmllcyB3aGVuIHRoZVxuICAgIC8vIGNvcnJlc3BvbmRpbmcgZGVwZW5kZW5jeSBpcyBubyBsb25nZXIgcHJlc2VudCBzbyBUeXBlU2NyaXB0IHdvbid0IHJlcXVpcmVcbiAgICAvLyBtaXNzaW5nIHBhY2thZ2VzIHN1Y2ggYXMgdml0ZXN0LlxuICAgIGlmIChpc0dlbmVyYXRlZFRlc3RHbG9iYWxUeXBlKHR5cGVOYW1lKSAmJiAhZ2VuZXJhdGVkVHlwZVNldC5oYXModHlwZU5hbWUpKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBpc0dlbmVyYXRlZFRlc3RHbG9iYWxUeXBlKHR5cGVOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVOYW1lID09PSAnY3lwcmVzcycgfHwgdHlwZU5hbWUgPT09ICdqZXN0JyB8fCB0eXBlTmFtZSA9PT0gJ21vY2hhJyB8fCB0eXBlTmFtZSA9PT0gJ3ZpdGVzdC9nbG9iYWxzJztcbn1cblxuZnVuY3Rpb24gbG93ZXJDYXNlU2V0dGluZyh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdmFsdWUudG9Mb3dlckNhc2UoKSA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gcGlja0V4aXN0aW5nRW1pdE1ldGFkYXRhKFxuICBjb21waWxlck9wdGlvbnM6IFRzQ29uZmlnSnNvblsnY29tcGlsZXJPcHRpb25zJ11cbik6IFBpY2s8Tm9uTnVsbGFibGU8VHNDb25maWdKc29uWydjb21waWxlck9wdGlvbnMnXT4sICdkZWNsYXJhdGlvbicgfCAnZGVjbGFyYXRpb25NYXAnIHwgJ3NvdXJjZU1hcCc+IHtcbiAgY29uc3QgZW1pdE9wdGlvbnMgPSB7fSBhcyBQaWNrPFxuICAgIE5vbk51bGxhYmxlPFRzQ29uZmlnSnNvblsnY29tcGlsZXJPcHRpb25zJ10+LFxuICAgICdkZWNsYXJhdGlvbicgfCAnZGVjbGFyYXRpb25NYXAnIHwgJ3NvdXJjZU1hcCdcbiAgPjtcbiAgZm9yIChjb25zdCBrZXkgb2YgWydkZWNsYXJhdGlvbicsICdkZWNsYXJhdGlvbk1hcCcsICdzb3VyY2VNYXAnXSBhcyBjb25zdCkge1xuICAgIGNvbnN0IHZhbHVlID0gY29tcGlsZXJPcHRpb25zPy5ba2V5XTtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZW1pdE9wdGlvbnNba2V5XSA9IHZhbHVlIGFzIG5ldmVyO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZW1pdE9wdGlvbnM7XG59XG5cbmZ1bmN0aW9uIGdldEdlbmVyYXRlZFR5cGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgdHlwZU5hbWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IGRlcGVuZGVuY2llcyA9IHtcbiAgICAuLi5jb25maWcucGFja2FnZUpzb24/LmRlcGVuZGVuY2llcyxcbiAgICAuLi5jb25maWcucGFja2FnZUpzb24/LmRldkRlcGVuZGVuY2llcyxcbiAgfTtcblxuICAvLyBSZWFjdCBOYXRpdmUgZ2V0cyBpdHMgYW1iaWVudCB0eXBlcyBmcm9tIEB0c2NvbmZpZy9yZWFjdC1uYXRpdmUgKHJlYWN0LW5hdGl2ZSwgamVzdCkuXG4gIGlmICghY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgIHR5cGVOYW1lcy5hZGQoJ2J1bicpO1xuICB9XG4gIGlmIChcbiAgICBkZXBlbmRlbmNpZXMuamVzdCB8fFxuICAgIGRlcGVuZGVuY2llc1snQGplc3QvZ2xvYmFscyddIHx8XG4gICAgZGVwZW5kZW5jaWVzWydqZXN0LWVudmlyb25tZW50LWpzZG9tJ10gfHxcbiAgICBkZXBlbmRlbmNpZXNbJ3RzLWplc3QnXVxuICApIHtcbiAgICB0eXBlTmFtZXMuYWRkKCdqZXN0Jyk7XG4gIH1cbiAgaWYgKGRlcGVuZGVuY2llcy52aXRlc3QpIHtcbiAgICB0eXBlTmFtZXMuYWRkKCd2aXRlc3QvZ2xvYmFscycpO1xuICB9XG4gIGlmIChkZXBlbmRlbmNpZXMubW9jaGEpIHtcbiAgICB0eXBlTmFtZXMuYWRkKCdtb2NoYScpO1xuICB9XG4gIGlmIChkZXBlbmRlbmNpZXMuY3lwcmVzcykge1xuICAgIHR5cGVOYW1lcy5hZGQoJ2N5cHJlc3MnKTtcbiAgfVxuXG4gIHJldHVybiBbLi4udHlwZU5hbWVzXTtcbn1cbiIsImltcG9ydCBvcyBmcm9tICdub2RlOm9zJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsganNvbmNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvanNvbmNVdGlsLmpzJztcblxuLyoqXG4gKiBUaGUgdXNlci1sZXZlbCBpbnN0cnVjdGlvbiBmaWxlIG9mIGVhY2ggc3VwcG9ydGVkIGFnZW50LCByZWxhdGl2ZSB0byB0aGUgaG9tZSBkaXJlY3RvcnkuIFRoZXNlXG4gKiBhcHBseSB0byBldmVyeSByZXBvc2l0b3J5IHRoZSBhZ2VudCB3b3JrcyBpbiwgc28gdGhleSBob2xkIG9ubHkgdGhlIGNvbnZlbnRpb25zIHRoYXQgYXJlIHRydWUgb25cbiAqIGV2ZXJ5IFdpbGxCb29zdGVyIGRldmVsb3BlciBtYWNoaW5lIHJhdGhlciB0aGFuIGluIGEgcGFydGljdWxhciByZXBvc2l0b3J5LlxuICovXG5jb25zdCB1c2VyQWdlbnRJbnN0cnVjdGlvbkZpbGVQYXRocyA9IFsnLmNvZGV4L0FHRU5UUy5tZCcsICcuY2xhdWRlL0NMQVVERS5tZCcsICcuZ2VtaW5pL0dFTUlOSS5tZCddIGFzIGNvbnN0O1xuXG4vLyBUaGlzIGNvbnRlbnQgaXMgbG9hZGVkIGludG8gZXZlcnkgYWdlbnQgc2Vzc2lvbiwgc28gaXQgaXMga2VwdCBhcyBzaG9ydCBhcyBpdCBjYW4gYmUgd2hpbGVcbi8vIHN0YXlpbmcgdW5hbWJpZ3VvdXM6IGUuZy4sIHRoZSBleGNsdWRlZCBvcmdhbml6YXRpb25zIGFyZSB3cml0dGVuIGFzIHNoZWxsIGJyYWNlIGV4cGFuc2lvbiwgd2hpY2hcbi8vIHRoZSBhZ2VudHMgcmVhZCBhcyBhIHBhdGggY29uZGl0aW9uIHdpdGhvdXQgYW55IHJ1bnRpbWUgbWF0Y2hpbmcuXG5jb25zdCB1c2VyQWdlbnRJbnN0cnVjdGlvbkNvbnRlbnQgPSBgLSBSZXBvcyBsaXZlIHVuZGVyIFxcYH4vZ2hxL2dpdGh1Yi5jb21cXGA7IGFsd2F5cyBjbG9uZSB3aXRoIFxcYGdocSBnZXQgLXBcXGAsIG5ldmVyIFxcYGdpdCBjbG9uZVxcYC5cbi0gTExNL0FJIGFnZW50IHJlc3BvbnNlcyBtYXkgdGFrZSAx4oCTMiBob3Vyczsgd2FpdCBwYXRpZW50bHksIGRvbid0IGFzc3VtZSBmYWlsdXJlLlxuLSBObyBBSSBhdHRyaWJ1dGlvbiAoZS5nLiwgXFxgQ28tQXV0aG9yZWQtQnlcXGAgdHJhaWxlcnMsIFwiR2VuZXJhdGVkIHdpdGggLi4uXCIgZm9vdGVycykgaW4gY29tbWl0cywgaXNzdWVzLCBvciBQUnMgdW5sZXNzIGV4cGxpY2l0bHkgcmVxdWVzdGVkLiBUaGlzIGhpZGVzIG5vdGhpbmc6IGlmIGFza2VkIHdoaWNoIEFJIGFnZW50IGRpZCB0aGUgd29yaywgYW5zd2VyIHRydXRoZnVsbHkuXG4tIE91dHNpZGUgXFxgfi9naHEvZ2l0aHViLmNvbS97V2lsbEJvb3N0ZXIsV2lsbEJvb3N0ZXJMYWJ9L1xcYCwgZm9sbG93IHRoZSByZXBvc2l0b3J5J3MgY29udHJpYnV0aW9uIGd1aWRlIChlLmcuLCBDT05UUklCVVRJTkcubWQsIFxcYC5naXRodWIvXFxgKSBhbmQgaXNzdWUvUFIgdGVtcGxhdGVzLCBtYXRjaCBpdHMgY29tbWl0IGFuZCBjb2RlIGNvbnZlbnRpb25zLCBhbmQgaG9ub3IgaXRzIHJ1bGVzIG9uIEFJLWFzc2lzdGVkIGNvbnRyaWJ1dGlvbnMuIFdyaXRlIGl0cyBpc3N1ZXMgYW5kIFBScyB3aXRoIG9ubHkgd2hhdCBhIHJldmlld2VyIHVuZmFtaWxpYXIgd2l0aCB0aGUgd29yayBuZWVkcyB0byB1bmRlcnN0YW5kIGFuZCBhc3Nlc3MgaXQsIGFzIGNvbmNpc2VseSBhcyB0aGF0IGNvbnRleHQgYWxsb3dzLlxuYDtcblxuLyoqXG4gKiBUaGUgdXNlci1sZXZlbCBzZXR0aW5ncyBtZXJnZWQgaW50byBlYWNoIGFnZW50J3MgSlNPTiBzZXR0aW5ncyBmaWxlLCByZWxhdGl2ZSB0byB0aGUgaG9tZVxuICogZGlyZWN0b3J5LlxuICpcbiAqIEV2ZXJ5IGFnZW50IHRoYXQgY2FycmllcyBmYWN0cyBmcm9tIG9uZSBzZXNzaW9uIGludG8gdGhlIG5leHQgaXMgdHVybmVkIG9mZiBoZXJlIGJlY2F1c2Ugc3VjaFxuICogbWVtb3J5IG1ha2VzIGEgc2Vzc2lvbiBkZXBlbmQgb24gaW52aXNpYmxlIG1hY2hpbmUtbG9jYWwgc3RhdGU6IGl0cyBiZWhhdmlvciBzdG9wcyBiZWluZ1xuICogcmVwcm9kdWNpYmxlIGFjcm9zcyBkZXZlbG9wZXJzIGFuZCBDSSwgYW5kIGEgc3RhbGUgb3Igd3JvbmcgbWVtb3J5IHNpbGVudGx5IG92ZXJyaWRlcyB0aGVcbiAqIGluc3RydWN0aW9uIGZpbGVzIGFib3ZlLiBDb2RleCBuZWVkcyBubyBlbnRyeSBiZWNhdXNlIGl0cyBtZW1vcmllcyBhcmUgb3B0LWluXG4gKiAoYFtmZWF0dXJlc10gbWVtb3JpZXMgPSB0cnVlYCBpbiBgfi8uY29kZXgvY29uZmlnLnRvbWxgKSwgc28gbGVhdmluZyB0aGF0IGZsYWcgdW5zZXQgaXMgZW5vdWdoLlxuICovXG5jb25zdCBhZ2VudFNldHRpbmdzID0gW1xuICB7XG4gICAgcmVsYXRpdmVQYXRoOiAnLmNsYXVkZS9zZXR0aW5ncy5qc29uJyxcbiAgICBhY2NlcHRzQ29tbWVudHM6IGZhbHNlLFxuICAgIC8qKlxuICAgICAqIENsYXVkZSBDb2RlIGluamVjdHMgaXRzIG93biBhdHRyaWJ1dGlvbiBkaXJlY3RpdmUgKGEgYENvLUF1dGhvcmVkLUJ5YCB0cmFpbGVyLCBhIFwiR2VuZXJhdGVkXG4gICAgICogd2l0aFwiIGZvb3RlciwgYW5kIGEgc2Vzc2lvbiBsaW5rKSBpbnRvIHRoZSB0b29sIGRlc2NyaXB0aW9ucyBhbmQgbWlkLXNlc3Npb24gcmVtaW5kZXJzLCBhbmRcbiAgICAgKiB0aGF0IGRpcmVjdGl2ZSBkZWNsYXJlcyBpdHNlbGYgdG8gcmVwbGFjZSBlYXJsaWVyIGd1aWRhbmNlLCBzbyB0aGUgaW5zdHJ1Y3Rpb24gZmlsZSBhbG9uZVxuICAgICAqIGNhbm5vdCBzdXBwcmVzcyBpdC4gT25seSB0aGlzIHNldHRpbmcgcmVtb3ZlcyB0aGUgZGlyZWN0aXZlIGF0IGl0cyBzb3VyY2UuIEF1dG8gbWVtb3J5IGlzIG9uXG4gICAgICogYnkgZGVmYXVsdCwgc28gaXQgbXVzdCBiZSB0dXJuZWQgb2ZmIGV4cGxpY2l0bHkuXG4gICAgICovXG4gICAgc2V0dGluZ3M6IHtcbiAgICAgIGF0dHJpYnV0aW9uOiB7XG4gICAgICAgIGNvbW1pdDogJycsXG4gICAgICAgIHByOiAnJyxcbiAgICAgICAgc2Vzc2lvblVybDogZmFsc2UsXG4gICAgICB9LFxuICAgICAgYXV0b01lbW9yeUVuYWJsZWQ6IGZhbHNlLFxuICAgIH0sXG4gIH0sXG4gIHtcbiAgICByZWxhdGl2ZVBhdGg6ICcuZ2VtaW5pL3NldHRpbmdzLmpzb24nLFxuICAgIC8vIEdlbWluaSBDTEkgc3RyaXBzIGNvbW1lbnRzIGJlZm9yZSBwYXJzaW5nIGl0cyBzZXR0aW5ncyBmaWxlLCB1bmxpa2UgQ2xhdWRlIENvZGUsIHdoaWNoXG4gICAgLy8gcmVqZWN0cyBhIGNvbW1lbnRlZCBmaWxlIGFzIG1hbGZvcm1lZC5cbiAgICBhY2NlcHRzQ29tbWVudHM6IHRydWUsXG4gICAgc2V0dGluZ3M6IHtcbiAgICAgIGV4cGVyaW1lbnRhbDoge1xuICAgICAgICBhdXRvTWVtb3J5OiBmYWxzZSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbl0gYXMgY29uc3Q7XG5cbi8qKlxuICogT3ZlcndyaXRlcyB0aGUgdXNlci1sZXZlbCBpbnN0cnVjdGlvbiBmaWxlcyBvZiBldmVyeSBzdXBwb3J0ZWQgYWdlbnQgd2l0aCB0aGUgZml4ZWQgY29udGVudCBhbmRcbiAqIG1lcmdlcyB0aGUgZml4ZWQgc2V0dGluZ3MgaW50byBlYWNoIGFnZW50J3MgdXNlciBzZXR0aW5ncy4gUmV0dXJucyBmYWxzZSB3aGVuIGFueSBmaWxlIHdhc1xuICogc2tpcHBlZCAoZS5nLiBhIHN5bWxpbmtlZCBvciB1bnBhcnNhYmxlIGZpbGUpLCBzbyB0aGUgY29tbWFuZCBjYW4gZmFpbCBsb3VkbHkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVVzZXJBZ2VudENvbmZpZ3MoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGxldCBoYXNXcml0dGVuQWxsID0gdHJ1ZTtcbiAgZm9yIChjb25zdCByZWxhdGl2ZVBhdGggb2YgdXNlckFnZW50SW5zdHJ1Y3Rpb25GaWxlUGF0aHMpIHtcbiAgICBjb25zdCBoYXNXcml0dGVuID0gYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCByZWxhdGl2ZVBhdGgpLCB1c2VyQWdlbnRJbnN0cnVjdGlvbkNvbnRlbnQpO1xuICAgIGhhc1dyaXR0ZW5BbGwgJiY9IGhhc1dyaXR0ZW47XG4gIH1cbiAgZm9yIChjb25zdCB7IGFjY2VwdHNDb21tZW50cywgcmVsYXRpdmVQYXRoLCBzZXR0aW5ncyB9IG9mIGFnZW50U2V0dGluZ3MpIHtcbiAgICAvLyBBd2FpdGVkIHNlcGFyYXRlbHk6IGAmJj1gIHdvdWxkIHNraXAgdGhlIG1lcmdlIG9uY2UgYW4gZWFybGllciBmaWxlIHdhcyBza2lwcGVkLlxuICAgIGNvbnN0IGhhc01lcmdlZCA9IGF3YWl0IG1lcmdlQWdlbnRTZXR0aW5ncyhyZWxhdGl2ZVBhdGgsIHNldHRpbmdzLCBhY2NlcHRzQ29tbWVudHMpO1xuICAgIGhhc1dyaXR0ZW5BbGwgJiY9IGhhc01lcmdlZDtcbiAgfVxuICByZXR1cm4gaGFzV3JpdHRlbkFsbDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbWVyZ2VBZ2VudFNldHRpbmdzKFxuICByZWxhdGl2ZVBhdGg6IHN0cmluZyxcbiAgbmV3U2V0dGluZ3M6IG9iamVjdCxcbiAgYWNjZXB0c0NvbW1lbnRzOiBib29sZWFuXG4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCByZWxhdGl2ZVBhdGgpO1xuICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gIGxldCBleGlzdGluZ1NldHRpbmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICBpZiAoZXhpc3RpbmdDb250ZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAvLyBBbiBhZ2VudCBpZ25vcmVzIGl0cyB3aG9sZSBzZXR0aW5ncyBmaWxlIHdoZW4gdGhlIGZpbGUgYnJlYWtzIHRoZSBncmFtbWFyIHRoZSBhZ2VudCByZWFkcyBpdFxuICAgIC8vIHdpdGgsIHNvIHdiZnkgbGVhdmVzIHN1Y2ggYSBmaWxlIHRvIHRoZSBkZXZlbG9wZXIgdG8gcmVwYWlyIHJhdGhlciB0aGFuIHJld3JpdGluZyBpdCBpbnRvIGFcbiAgICAvLyBmaWxlIHRoZSBhZ2VudCBzdGlsbCBpZ25vcmVzOiBjb21tZW50cyBhcmUgdG9sZXJhdGVkIG9ubHkgd2hlcmUgdGhlIGFnZW50IHN0cmlwcyB0aGVtLCBhbmRcbiAgICAvLyB0cmFpbGluZyBjb21tYXMgbm93aGVyZSwgc2luY2UgYm90aCBhZ2VudHMgcGFyc2Ugd2l0aCBKU09OLnBhcnNlIGluIHRoZSBlbmQuIENvbW1lbnQtb25seVxuICAgIC8vIGNvbnRlbnQgaXMgY2hlY2tlZCB0b28sIGJlY2F1c2UgaXQgaXMga2VwdCBhcyBhIGhlYWRlciBhYm92ZSB0aGUgZ2VuZXJhdGVkIG9iamVjdC5cbiAgICBpZiAoIWFjY2VwdHNDb21tZW50cyAmJiBqc29uY1V0aWwuY29udGFpbnNDb21tZW50KGV4aXN0aW5nQ29udGVudCkpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCB1cGRhdGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIHRoaXMgYWdlbnQgcmVhZHMgaXQgYXMgc3RyaWN0IEpTT04sIGNvbW1lbnRzIGFuZCBhbGwuYCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICghanNvbmNVdGlsLmlzVHJpdmlhT25seShleGlzdGluZ0NvbnRlbnQpKSB7XG4gICAgICBjb25zdCBwYXJzZWRTZXR0aW5ncyA9IGpzb25jVXRpbC5wYXJzZU9iamVjdElnbm9yaW5nRXJyb3I8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KGV4aXN0aW5nQ29udGVudCwgZmFsc2UpO1xuICAgICAgaWYgKCFwYXJzZWRTZXR0aW5ncykge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYFNraXBwZWQgdXBkYXRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSB0aGUgZXhpc3RpbmcgY29udGVudCBpcyBub3QgYSBzdHJpY3QgSlNPTiBvYmplY3QgKGEgdHJhaWxpbmcgY29tbWEsIGZvciBleGFtcGxlLCBpcyBub3QgYWxsb3dlZCkuYFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBleGlzdGluZ1NldHRpbmdzID0gcGFyc2VkU2V0dGluZ3M7XG4gICAgfVxuICB9XG4gIGNvbnN0IHNldHRpbmdzID0gbWVyZ2UoZXhpc3RpbmdTZXR0aW5ncywgbmV3U2V0dGluZ3MpO1xuICAvLyBPbmx5IHRoZSBwcm9wZXJ0aWVzIHdob3NlIHZhbHVlIGNoYW5nZXMgYXJlIHJld3JpdHRlbiwgc28gdGhlIGZpbGUga2VlcHMgaXRzIG93biBmb3JtYXR0aW5nXG4gIC8vIGFuZCwgd2hlcmUgdGhlIGFnZW50IGFsbG93cyB0aGVtLCBpdHMgY29tbWVudHMuXG4gIGNvbnN0IHsgY29udGVudCwga2V5c0xvc2luZ0NvbW1lbnRzIH0gPSBqc29uY1V0aWwuc3RyaW5naWZ5UHJlc2VydmluZ1RyaXZpYShleGlzdGluZ0NvbnRlbnQsIHNldHRpbmdzKTtcbiAgaWYgKCEoYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgY29udGVudCkpKSByZXR1cm4gZmFsc2U7XG5cbiAgZm9yIChjb25zdCBrZXkgb2Yga2V5c0xvc2luZ0NvbW1lbnRzKSB7XG4gICAgY29uc29sZS53YXJuKGBDb21tZW50cyBpbnNpZGUgXCIke2tleX1cIiB3ZXJlIGRyb3BwZWQgd2hpbGUgcmV3cml0aW5nIGl0IGluICR7ZmlsZVBhdGh9LmApO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBqc29uY1V0aWwgfSBmcm9tICcuLi91dGlscy9qc29uY1V0aWwuanMnO1xuaW1wb3J0IHsgc29ydEtleXMgfSBmcm9tICcuLi91dGlscy9vYmplY3RVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBleGNsdWRlRmlsZVBhdHRlcm5zID0gW1xuICAnKiovLmdpdC9vYmplY3RzLyoqJyxcbiAgJyoqLy5naXQvc3VidHJlZS1jYWNoZS8qKicsXG4gICcqKi9ub2RlX21vZHVsZXMvKionLFxuICAnKiovdG1wLyoqJyxcbiAgJyoqL3RlbXAvKionLFxuICAnKiovZGlzdC8qKicsXG5dO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVZzY29kZVNldHRpbmdzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnZzY29kZScsICdzZXR0aW5ncy5qc29uJyk7XG4gICAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpO1xuICAgIGlmIChleGlzdGluZ0NvbnRlbnQgPT09IHVuZGVmaW5lZCB8fCBqc29uY1V0aWwuaXNUcml2aWFPbmx5KGV4aXN0aW5nQ29udGVudCkpIHJldHVybjtcbiAgICAvLyAudnNjb2RlL3NldHRpbmdzLmpzb24gaXMgSlNPTkMgYnkgZGVmaW5pdGlvbjsgSlNPTi5wYXJzZSB3b3VsZCBtYWtlIHdiZnkgc2lsZW50bHkgc2tpcFxuICAgIC8vIGNvbW1lbnRlZCBmaWxlcy5cbiAgICBjb25zdCBwYXJzZWRTZXR0aW5ncyA9IGpzb25jVXRpbC5wYXJzZU9iamVjdElnbm9yaW5nRXJyb3I8b2JqZWN0PihleGlzdGluZ0NvbnRlbnQpO1xuICAgIGlmICghcGFyc2VkU2V0dGluZ3MpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCB1cGRhdGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIHRoZSBleGlzdGluZyBjb250ZW50IGlzIG5vdCBwYXJzYWJsZSBhcyBKU09OQy5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgb3JpZ2luYWxTZXR0aW5nc0pzb24gPSBKU09OLnN0cmluZ2lmeShzb3J0S2V5cyhzdHJ1Y3R1cmVkQ2xvbmUocGFyc2VkU2V0dGluZ3MpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSk7XG4gICAgbGV0IHNldHRpbmdzID0gcGFyc2VkU2V0dGluZ3M7XG4gICAgZm9yIChjb25zdCBleGNsdWRlRmlsZVBhdHRlcm4gb2YgZXhjbHVkZUZpbGVQYXR0ZXJucykge1xuICAgICAgc2V0dGluZ3MgPSBtZXJnZS5hbGwoW3NldHRpbmdzLCBleGNsdWRlU2V0dGluZyhleGNsdWRlRmlsZVBhdHRlcm4pXSk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrIHx8IGNvbmZpZy5kb2VzQ29udGFpblV2TG9jaykge1xuICAgICAgc2V0dGluZ3MgPSBtZXJnZS5hbGwoW3NldHRpbmdzLCBleGNsdWRlU2V0dGluZygnKiovLnZlbnYvKionKV0pO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgICBzZXR0aW5ncyA9IG1lcmdlLmFsbChbc2V0dGluZ3MsIGV4Y2x1ZGVTZXR0aW5nKCcqKi8ubmV4dC8qKicpXSk7XG4gICAgfVxuICAgIHNvcnRLZXlzKHNldHRpbmdzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICAvLyBTa2lwIHRoZSB3cml0ZSB3aGVuIG5vdGhpbmcgY2hhbmdlcyBzZW1hbnRpY2FsbHksIHNvIEpTT05DIGNvbW1lbnRzIGFuZCBmb3JtYXR0aW5nIGluIGFuXG4gICAgLy8gYWxyZWFkeS1jbGVhbiBzZXR0aW5ncy5qc29uIHN1cnZpdmUgd2JmeSBydW5zLlxuICAgIGlmIChKU09OLnN0cmluZ2lmeShzZXR0aW5ncykgPT09IG9yaWdpbmFsU2V0dGluZ3NKc29uKSByZXR1cm47XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KHNldHRpbmdzLCB1bmRlZmluZWQsIDIpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBleGNsdWRlU2V0dGluZyhleGNsdWRlRmlsZVBhdHRlcm46IHN0cmluZyk6IG9iamVjdCB7XG4gIHJldHVybiB7XG4gICAgJ2ZpbGVzLndhdGNoZXJFeGNsdWRlJzoge1xuICAgICAgW2V4Y2x1ZGVGaWxlUGF0dGVybl06IHRydWUsXG4gICAgfSxcbiAgfTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5cbmludGVyZmFjZSBGbm94VG9tbFN1YnRyZWUge1xuICBzZWNyZXRzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHByb2ZpbGVzPzogUmVjb3JkPHN0cmluZywgeyBzZWNyZXRzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfSB8IHVuZGVmaW5lZD47XG59XG5cbi8vIFRoZSBmb3VyIHN0YW5kYXJkIFdCX0VOViBtb2Rlczsgc3RhZ2luZyBpcyBvcHRpb25hbCBhbmQgb25seSBjb21wbGV0ZWQgd2hlbiB0aGUgcmVwb3NpdG9yeVxuLy8gYWxyZWFkeSBkZWNsYXJlcyB0aGUgc3RhZ2luZyBwcm9maWxlLlxuY29uc3Qgd2JFbnZNb2RlcyA9IFsnZGV2ZWxvcG1lbnQnLCAndGVzdCcsICdzdGFnaW5nJywgJ3Byb2R1Y3Rpb24nXSBhcyBjb25zdDtcbnR5cGUgV2JFbnZNb2RlID0gKHR5cGVvZiB3YkVudk1vZGVzKVtudW1iZXJdO1xuXG4vKipcbiAqIEVuc3VyZXMgYSBmbm94IHJlcG9zaXRvcnkgZGVmaW5lcyBXQl9FTlYgZm9yIGV2ZXJ5IHN0YW5kYXJkIG1vZGUgKGFuZCBORVhUX1BVQkxJQ19XQl9FTlYgd2hlblxuICogYW55IHdvcmtzcGFjZSBkZXBlbmRzIG9uIE5leHQuanMgb3IgdmluZXh0KSBpbiBmbm94LnRvbWwgcHJvZmlsZXMuIEV4aXN0aW5nIGRlZmluaXRpb25zIGFyZVxuICogYWx3YXlzIGxlZnQgdW50b3VjaGVkLiBOb24tZm5veCByZXBvc2l0b3JpZXMgYXJlIHNraXBwZWQ6IC5lbnYgZmlsZXMgYXJlIG5vIGxvbmdlciBtYW5hZ2VkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5zdXJlV2JFbnZEZWZpbml0aW9ucyhyb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLCBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdlbnN1cmVXYkVudkRlZmluaXRpb25zJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG5lZWRzTmV4dFB1YmxpYyA9IGFsbENvbmZpZ3Muc29tZSgoY29uZmlnKSA9PiByZXF1aXJlc05leHRQdWJsaWNXYkVudihjb25maWcpKTtcbiAgICBjb25zdCBmbm94VG9tbFBhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnZm5veC50b21sJyk7XG4gICAgLy8gbHN0YXQsIG5vdCBleGlzdHNTeW5jOiBleGlzdHNTeW5jIGlzIGZhbHNlIGZvciBhIERBTkdMSU5HIGZub3gudG9tbCBzeW1saW5rOyBhbnkgZm5veC50b21sXG4gICAgLy8gZGlyZWN0b3J5IGVudHJ5IG1hcmtzIGEgZm5veCByZXBvc2l0b3J5LCBhbmQgYSByZWZ1c2VkL2RhbmdsaW5nIG9uZSBhYm9ydHMgaW5zdGVhZCBvZlxuICAgIC8vIGJlaW5nIHRyZWF0ZWQgYXMgYSBub24tZm5veCByZXBvc2l0b3J5IHdoaWxlIHRoZSBmbm94IHN5bmNocm9uaXphdGlvbiBpcyBmYWlsaW5nLlxuICAgIGlmICghKGF3YWl0IGZzLnByb21pc2VzLmxzdGF0KGZub3hUb21sUGF0aCkuY2F0Y2goKCkgPT4ge30pKSkgcmV0dXJuO1xuICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVDb25maW5lZElmRXhpc3RzKGZub3hUb21sUGF0aCk7XG4gICAgaWYgKGNvbnRlbnQgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgIGNvbnN0IHVwZGF0ZWRDb250ZW50ID0gaW5zZXJ0V2JFbnZJbnRvRm5veFRvbWwoY29udGVudCwgbmVlZHNOZXh0UHVibGljKTtcbiAgICBpZiAodXBkYXRlZENvbnRlbnQgIT09IHVuZGVmaW5lZCAmJiB1cGRhdGVkQ29udGVudCAhPT0gY29udGVudCkge1xuICAgICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmbm94VG9tbFBhdGgsIHVwZGF0ZWRDb250ZW50KTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIE1pcnJvcnMgd2IncyByZXF1aXJlc05leHRQdWJsaWNXYkVudiBjb250cmFjdCAocGFja2FnZXMvd2Ivc3JjL3Byb2plY3QudHMpOiB0aGUgZnJhbWV3b3JrIG1heVxuICogYmUgZGVjbGFyZWQgaW4gQU5ZIG9mIHRoZSBmb3VyIGRlcGVuZGVuY3kgc2VjdGlvbnMgKGUuZy4gYG5leHRgIGFzIGEgZGV2RGVwZW5kZW5jeSBpbiBhIHNoYXJlZFxuICogY29tcG9uZW50IGxpYnJhcnkpLCB3aGlsZSB3YmZ5J3MgYGRlcGVuZGluZy5uZXh0YCBsb29rcyBvbmx5IGF0IHJlZ3VsYXIgZGVwZW5kZW5jaWVzLlxuICovXG5mdW5jdGlvbiByZXF1aXJlc05leHRQdWJsaWNXYkVudihjb25maWc6IFBhY2thZ2VDb25maWcpOiBib29sZWFuIHtcbiAgcmV0dXJuIFsnZGVwZW5kZW5jaWVzJywgJ2RldkRlcGVuZGVuY2llcycsICdvcHRpb25hbERlcGVuZGVuY2llcycsICdwZWVyRGVwZW5kZW5jaWVzJ10uc29tZSgoc2VjdGlvbikgPT4ge1xuICAgIGNvbnN0IGRlcGVuZGVuY2llcyA9IGNvbmZpZy5wYWNrYWdlSnNvbj8uW3NlY3Rpb24gYXMgJ2RlcGVuZGVuY2llcyddO1xuICAgIHJldHVybiAhIWRlcGVuZGVuY2llcz8uWyduZXh0J10gfHwgISFkZXBlbmRlbmNpZXM/LlsndmluZXh0J107XG4gIH0pO1xufVxuXG4vKipcbiAqIEluc2VydHMgbWlzc2luZyBXQl9FTlYgKGFuZCBvcHRpb25hbGx5IE5FWFRfUFVCTElDX1dCX0VOVikgZW50cmllcyBpbnRvIGEgZm5veC50b21sOiB0aGUgYmFzZVxuICogYFtzZWNyZXRzXWAgdGFibGUgY2FycmllcyB0aGUgZGV2ZWxvcG1lbnQgZGVmYXVsdHMgYW5kIGBbcHJvZmlsZXMuPG1vZGU+LnNlY3JldHNdYCBvdmVybGF5c1xuICogZWFjaCBvdGhlciBtb2RlLCBtYXRjaGluZyB0aGUgb3JnLXN0YW5kYXJkIGxheW91dC4gRm9ybWF0dGluZyBhbmQgY29tbWVudHMgYXJlIHByZXNlcnZlZDsgb25seVxuICogbWlzc2luZyBsaW5lcyBhcmUgaW5zZXJ0ZWQgb3IgbWlzc2luZyBzZWN0aW9ucyBhcHBlbmRlZC4gUmV0dXJucyB1bmRlZmluZWQgd2hlbiB0aGUgY29udGVudFxuICogY2Fubm90IGJlIHNhZmVseSBlZGl0ZWQgKHVucGFyc2FibGUgYmVmb3JlIG9yIGFmdGVyIHRoZSBlZGl0KS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluc2VydFdiRW52SW50b0Zub3hUb21sKGNvbnRlbnQ6IHN0cmluZywgbmVlZHNOZXh0UHVibGljOiBib29sZWFuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgbGV0IHNldHRpbmdzOiBGbm94VG9tbFN1YnRyZWU7XG4gIHRyeSB7XG4gICAgc2V0dGluZ3MgPSBCdW4uVE9NTC5wYXJzZShjb250ZW50KSBhcyBGbm94VG9tbFN1YnRyZWU7XG4gIH0gY2F0Y2gge1xuICAgIGNvbnNvbGUud2FybignU2tpcHBlZCBpbnNlcnRpbmcgV0JfRU5WIGludG8gZm5veC50b21sIGJlY2F1c2UgaXQgaXMgbm90IHBhcnNhYmxlIGFzIFRPTUwuJyk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNvbnN0IGtleU5hbWVzID0gbmVlZHNOZXh0UHVibGljID8gWydXQl9FTlYnLCAnTkVYVF9QVUJMSUNfV0JfRU5WJ10gOiBbJ1dCX0VOViddO1xuICBsZXQgdXBkYXRlZENvbnRlbnQgPSBjb250ZW50O1xuICBmb3IgKGNvbnN0IG1vZGUgb2Ygd2JFbnZNb2Rlcykge1xuICAgIC8vIFRoZSBzdGFnaW5nIG1vZGUgaXMgb3B0aW9uYWw6IGNvbXBsZXRlIGl0IG9ubHkgd2hlbiB0aGUgcmVwb3NpdG9yeSBhbHJlYWR5IGRlY2xhcmVzIHRoZSBwcm9maWxlLlxuICAgIGlmIChtb2RlID09PSAnc3RhZ2luZycgJiYgIXNldHRpbmdzLnByb2ZpbGVzPy5zdGFnaW5nKSBjb250aW51ZTtcbiAgICBjb25zdCBkZWZpbmVkS2V5cyA9IG1vZGUgPT09ICdkZXZlbG9wbWVudCcgPyBzZXR0aW5ncy5zZWNyZXRzIDogc2V0dGluZ3MucHJvZmlsZXM/Llttb2RlXT8uc2VjcmV0cztcbiAgICBmb3IgKGNvbnN0IGtleU5hbWUgb2Yga2V5TmFtZXMpIHtcbiAgICAgIGNvbnN0IGRlZmluZWQgPSBkZWZpbmVkS2V5cz8uW2tleU5hbWVdO1xuICAgICAgY29uc3QgZGVmaW5lZFZhbHVlID1cbiAgICAgICAgdHlwZW9mIGRlZmluZWQgPT09ICdzdHJpbmcnID8gZGVmaW5lZCA6IChkZWZpbmVkIGFzIHsgZGVmYXVsdD86IHVua25vd24gfSB8IHVuZGVmaW5lZCk/LmRlZmF1bHQ7XG4gICAgICB3YXJuT25VbmV4cGVjdGVkV2JFbnZWYWx1ZShrZXlOYW1lLCBkZWZpbmVkVmFsdWUsIG1vZGUpO1xuICAgIH1cbiAgICBjb25zdCBtaXNzaW5nTGluZXMgPSBrZXlOYW1lc1xuICAgICAgLmZpbHRlcigoa2V5TmFtZSkgPT4gZGVmaW5lZEtleXM/LltrZXlOYW1lXSA9PT0gdW5kZWZpbmVkKVxuICAgICAgLm1hcCgoa2V5TmFtZSkgPT4gYCR7a2V5TmFtZX0gPSB7IGRlZmF1bHQgPSBcIiR7bW9kZX1cIiB9YCk7XG4gICAgaWYgKG1pc3NpbmdMaW5lcy5sZW5ndGggPT09IDApIGNvbnRpbnVlO1xuICAgIHVwZGF0ZWRDb250ZW50ID0gaW5zZXJ0SW50b0Zub3hTZWN0aW9uKFxuICAgICAgdXBkYXRlZENvbnRlbnQsXG4gICAgICBtb2RlID09PSAnZGV2ZWxvcG1lbnQnID8gJ3NlY3JldHMnIDogYHByb2ZpbGVzLiR7bW9kZX0uc2VjcmV0c2AsXG4gICAgICBtaXNzaW5nTGluZXNcbiAgICApO1xuICB9XG4gIGlmICh1cGRhdGVkQ29udGVudCA9PT0gY29udGVudCkgcmV0dXJuIGNvbnRlbnQ7XG5cbiAgLy8gUmUtcGFyc2UgYmVmb3JlIHJldHVybmluZzogYW4gdW51c3VhbCBsYXlvdXQgKGUuZy4gZG90dGVkIGtleXMgd2l0aG91dCBhIHRhYmxlIGhlYWRlcikgY291bGRcbiAgLy8gbWFrZSB0aGUgdGV4dHVhbCBlZGl0IHByb2R1Y2UgYSBkdXBsaWNhdGUgdGFibGU7IGZhaWwgc2FmZWx5IGluc3RlYWQgb2YgY29ycnVwdGluZyB0aGUgZmlsZS5cbiAgdHJ5IHtcbiAgICBjb25zdCB1cGRhdGVkU2V0dGluZ3MgPSBCdW4uVE9NTC5wYXJzZSh1cGRhdGVkQ29udGVudCkgYXMgRm5veFRvbWxTdWJ0cmVlO1xuICAgIGZvciAoY29uc3QgbW9kZSBvZiB3YkVudk1vZGVzKSB7XG4gICAgICBpZiAobW9kZSA9PT0gJ3N0YWdpbmcnICYmICFzZXR0aW5ncy5wcm9maWxlcz8uc3RhZ2luZykgY29udGludWU7XG4gICAgICBjb25zdCBkZWZpbmVkS2V5cyA9IG1vZGUgPT09ICdkZXZlbG9wbWVudCcgPyB1cGRhdGVkU2V0dGluZ3Muc2VjcmV0cyA6IHVwZGF0ZWRTZXR0aW5ncy5wcm9maWxlcz8uW21vZGVdPy5zZWNyZXRzO1xuICAgICAgaWYgKGtleU5hbWVzLnNvbWUoKGtleU5hbWUpID0+IGRlZmluZWRLZXlzPy5ba2V5TmFtZV0gPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB0aGUgaW5zZXJ0ZWQgJHttb2RlfSBlbnRyaWVzIGRpZCBub3QgdGFrZSBlZmZlY3RgKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS53YXJuKGBTa2lwcGVkIGluc2VydGluZyBXQl9FTlYgaW50byBmbm94LnRvbWwgYmVjYXVzZSAkeyhlcnJvciBhcyBFcnJvcikubWVzc2FnZX0uYCk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gdXBkYXRlZENvbnRlbnQ7XG59XG5cbi8qKlxuICogV2FybnMgd2hlbiBhbiBleGlzdGluZyBXQl9FTlYtZmFtaWx5IGRlZmluaXRpb24gbmFtZXMgYSBkaWZmZXJlbnQgbW9kZSB0aGFuIHRoZSBvbmUgaXQgaXNcbiAqIGRlZmluZWQgZm9yIChhIHR5cG8gbGlrZSBgcHJvZGN1dGlvbmAgb3IgYHByb2R1Y3Rpb24xYCwgb3IgYSBjb3B5LXBhc3RlZCB3cm9uZyBtb2RlKTogd2JcbiAqIHJlamVjdHMgbm9uLXN0YW5kYXJkIHZhbHVlcyBhdCBydW50aW1lLCBzbyBzdXJmYWNpbmcgdGhlIG1pc21hdGNoIGR1cmluZyB3YmZ5IGlzIHRoZSBlYXJsaWVzdFxuICogcG9zc2libGUgc2lnbmFsLiBUaGUgcGFzc2VkIHZhbHVlIGlzIGFsd2F5cyBwbGFpbnRleHQgKGEgZm5veCBgZGVmYXVsdGAgZmllbGQpIOKAlCBlbmNyeXB0ZWRcbiAqIGZub3ggZW50cmllcyBhcmUgYHsgcHJvdmlkZXIsIHZhbHVlIH1gIG9iamVjdHMgd2hvc2UgYGRlZmF1bHRgIGlzIGFic2VudC5cbiAqL1xuZnVuY3Rpb24gd2Fybk9uVW5leHBlY3RlZFdiRW52VmFsdWUoa2V5TmFtZTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgbW9kZTogV2JFbnZNb2RlKTogdm9pZCB7XG4gIC8vIEFuIEVNUFRZIHZhbHVlIGNvdW50cyBhcyB1bnNldCAod2Igc3VwcGxpZXMgdGhlIGZhbGxiYWNrIG1vZGUpLCBub3QgYXMgYSBtaXNtYXRjaGluZyBtb2RlLlxuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJyB8fCB2YWx1ZSA9PT0gJycgfHwgdmFsdWUgPT09IG1vZGUpIHJldHVybjtcbiAgLy8gQSBkeW5hbWljIHZhbHVlIChlLmcuIGBORVhUX1BVQkxJQ19XQl9FTlY9JHtXQl9FTlZ9YCkgbWF5IGxlZ2l0aW1hdGVseSByZXNvbHZlIHRvIHRoZSBtb2RlXG4gIC8vIHRocm91Z2ggZXhwYW5zaW9uLCB3aGljaCB0aGlzIHN0YXRpYyBjaGVjayBjYW5ub3QgZXZhbHVhdGUg4oCUIHNraXAgaW5zdGVhZCBvZiBtaXNmaXJpbmcuXG4gIC8vIGZub3ggZXhwYW5kcyBvbmx5IGAkey4uLn1gIChhIGJhcmUgYCRVTlNFVGAgc3RheXMgbGl0ZXJhbCkuXG4gIGlmICh2YWx1ZS5pbmNsdWRlcygnJHsnKSkgcmV0dXJuO1xuICBpZiAoa2V5TmFtZSA9PT0gJ05FWFRfUFVCTElDX1dCX0VOVicpIHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBgJHtrZXlOYW1lfSBpbiBmbm94LnRvbWwgaXMgXCIke3ZhbHVlfVwiIGJ1dCBzaG91bGQgYmUgXCIke21vZGV9XCIgZm9yIHRoZSAke21vZGV9IG1vZGU7IHdiIG92ZXJyaWRlcyBpdCB3aXRoIFdCX0VOViwgYnV0IGEgZGlyZWN0IGZyYW1ld29yayBidWlsZCB3b3VsZCBpbmxpbmUgdGhpcyB2YWx1ZS5gXG4gICAgKTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc29sZS53YXJuKFxuICAgIGAke2tleU5hbWV9IGluIGZub3gudG9tbCBpcyBcIiR7dmFsdWV9XCIgYnV0IHNob3VsZCBiZSBcIiR7bW9kZX1cIiBmb3IgdGhlICR7bW9kZX0gbW9kZTsgd2IgcmVqZWN0cyB2YWx1ZXMgb3V0c2lkZSBkZXZlbG9wbWVudC90ZXN0L3N0YWdpbmcvcHJvZHVjdGlvbi5gXG4gICk7XG59XG5cbi8qKlxuICogSW5zZXJ0cyBsaW5lcyBhdCB0aGUgdG9wIG9mIGEgVE9NTCBzZWN0aW9uLCByaWdodCBhZnRlciBpdHMgYFtoZWFkZXJdYCBsaW5lIHNvIHByb2ZpbGUtc3BlY2lmaWNcbiAqIGVudHJpZXMgc3RheSBncm91cGVkIHdpdGggdGhlaXIgaGVhZGVyOyB0aGUgc2VjdGlvbiBpcyBhcHBlbmRlZCBhdCB0aGUgZW5kIHdoZW4gaXQgaXMgYWJzZW50LlxuICovXG5mdW5jdGlvbiBpbnNlcnRJbnRvRm5veFNlY3Rpb24oY29udGVudDogc3RyaW5nLCBzZWN0aW9uTmFtZTogc3RyaW5nLCBpbnNlcnRlZExpbmVzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIC8vIHdiZnkgd3JpdGVzIHRoZSBoZWFkZXIgd2l0aG91dCB3aGl0ZXNwYWNlIGFyb3VuZCB0aGUgZG90dGVkLWtleSBjb21wb25lbnRzLlxuICBjb25zdCBoZWFkZXJQYXR0ZXJuID0gbmV3IFJlZ0V4cChTdHJpbmcucmF3YF5cXHMqXFxbJHtzZWN0aW9uTmFtZS5yZXBsYWNlQWxsKCcuJywgU3RyaW5nLnJhd2BcXC5gKX1cXF1cXHMqKD86Iy4qKT8kYCwgJ3UnKTtcbiAgY29uc3QgbGluZXMgPSBjb250ZW50LnNwbGl0KCdcXG4nKTtcbiAgY29uc3QgaGVhZGVySW5kZXggPSBsaW5lcy5maW5kSW5kZXgoKGxpbmUpID0+IGhlYWRlclBhdHRlcm4udGVzdChsaW5lKSk7XG4gIGlmIChoZWFkZXJJbmRleCA9PT0gLTEpIHtcbiAgICByZXR1cm4gYCR7Y29udGVudC50cmltRW5kKCl9XFxuXFxuWyR7c2VjdGlvbk5hbWV9XVxcbiR7aW5zZXJ0ZWRMaW5lcy5qb2luKCdcXG4nKX1cXG5gO1xuICB9XG4gIHJldHVybiBbLi4ubGluZXMuc2xpY2UoMCwgaGVhZGVySW5kZXggKyAxKSwgLi4uaW5zZXJ0ZWRMaW5lcywgLi4ubGluZXMuc2xpY2UoaGVhZGVySW5kZXggKyAxKV0uam9pbignXFxuJyk7XG59XG4iLCIvLyBHaXRIdWIgQWN0aW9ucyB2YWx1ZWxlc3MgZXZlbnRzIHN1Y2ggYXMgYHB1bGxfcmVxdWVzdDpgIHJlcXVpcmUgWUFNTCBudWxsIHZhbHVlcy5cbi8qIGVzbGludC1kaXNhYmxlIHVuaWNvcm4vbm8tbnVsbCAqL1xuXG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgKiBhcyB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbi8qKlxuICogUmVwb3NpdG9yaWVzIG91dHNpZGUgV2lsbEJvb3N0ZXIgLyBXaWxsQm9vc3RlckxhYiBjYW5ub3QgY2FsbCB0aGUgb3JnYW5pemF0aW9uJ3MgcmV1c2FibGVcbiAqIHdvcmtmbG93czogdGhvc2Ugd29ya2Zsb3dzIGRlcGVuZCBvbiBvcmdhbml6YXRpb24gc2VjcmV0cyAoVkVSREFDQ0lPX1RPS0VOLCBEaXNjb3JkIHdlYmhvb2tzKVxuICogYW5kIHNlbGYtaG9zdGVkIHJ1bm5lcnMgdGhhdCBvdGhlciBvd25lcnMgZG8gbm90IGhhdmUuIFRoaXMgZ2VuZXJhdG9yIGluc3RlYWQgZW1pdHNcbiAqIHNlbGYtY29udGFpbmVkIHdvcmtmbG93cyBidWlsdCBvbmx5IGZyb20gd2hhdCBhbnkgcmVwb3NpdG9yeSBvd25lciBjYW4gcHJvdmlkZTogdGhlIHJlcG9zaXRvcnlcbiAqIGNvbnRlbnRzIChtaXNlLnRvbWwsIHBhY2thZ2UuanNvbiBzY3JpcHRzKSBhbmQgdGhlIHNpbmdsZSBgRk5PWF9BR0VfS0VZYCByZXBvc2l0b3J5IHNlY3JldCB3aGVuXG4gKiB0aGUgcmVwb3NpdG9yeSB1c2VzIGZub3guIEdlbmVyYXRpb24gaXMga2V5ZWQgb24gcmVwb3NpdG9yeSBzdGF0ZSwgbmV2ZXIgb24gdGhlIG93bmVyJ3NcbiAqIGlkZW50aXR5LCBzbyBpdCB3b3JrcyBmb3IgYXJiaXRyYXJ5IHBlcnNvbmFsIHJlcG9zaXRvcmllcy5cbiAqL1xuXG4vKiogRmlyc3QgbGluZSBvZiBldmVyeSBnZW5lcmF0ZWQgZmlsZTsgZmlsZXMgd2l0aG91dCBpdCBhcmUgaGFuZC13cml0dGVuIGFuZCBuZXZlciB0b3VjaGVkLiAqL1xuZXhwb3J0IGNvbnN0IHNlbGZDb250YWluZWRXb3JrZmxvd01hcmtlciA9ICcjIEdlbmVyYXRlZCBieSB3YmZ5Lic7XG5cbi8vIFNhbWUgcGlucyBhcyB0aGUgcmV1c2FibGUgd29ya2Zsb3dzIC8gdGhlaXIgY29uc3VtZXJzOyBSZW5vdmF0ZSB1cGRhdGVzIHRoZW0gaW4gdGhlIHRhcmdldCByZXBvc2l0b3J5LlxuY29uc3QgY2hlY2tvdXRBY3Rpb24gPSAnYWN0aW9ucy9jaGVja291dEB2Ny4wLjEnO1xuY29uc3QgbWlzZUFjdGlvbiA9ICdqZHgvbWlzZS1hY3Rpb25AdjQuMi4zJztcbmNvbnN0IGNhY2hlQWN0aW9uID0gJ2FjdGlvbnMvY2FjaGVAdjYuMS4wJztcbmNvbnN0IHVwbG9hZEFydGlmYWN0QWN0aW9uID0gJ2FjdGlvbnMvdXBsb2FkLWFydGlmYWN0QHY3LjAuMSc7XG4vLyB2Ni4xLjE7IHRoZSBzYW1lIHBpbiBhcyB0aGUgcmV1c2FibGUgc2VtYW50aWMtcHIgd29ya2Zsb3cuXG5jb25zdCBzZW1hbnRpY1B1bGxSZXF1ZXN0QWN0aW9uID0gJ2FtYW5ubi9hY3Rpb24tc2VtYW50aWMtcHVsbC1yZXF1ZXN0QDQ1YjllZDdjZjI0MDg3YTJmNzc4NWJmNTViZTk3Mzk0YmE4N2UxYzInO1xuLy8gdjMuMC4zOyBkZXBsb3lzIGFyZSBuZXR3b3JrLWhlYXZ5IGFuZCBiZW5lZml0IGZyb20gcmV0cmllcyB3aXRoIGEgbG9uZyB0aW1lb3V0LlxuY29uc3QgcmV0cnlBY3Rpb24gPSAnbmljay1maWVsZHMvcmV0cnlAZGQ1NmYxY2E4Y2E5OTFlMjM4NWMxOGFiNmRkMzZlYTdmOWZkYjU1Zic7XG5cbi8qKlxuICogSm9iLWxldmVsIGVudiB0aGF0IHR1cm5zIHRoZSBUYWt1bWkgR3VhcmQgaW5zdGFsbCBwYXRoIG9uLCBtaXJyb3JpbmcgdGhlIHJldXNhYmxlIHdvcmtmbG93cy5cbiAqXG4gKiBgc2VjcmV0c2AgaXMgdW5hdmFpbGFibGUgaW4gYSBzdGVwLWxldmVsIGBpZjpgLCBzbyB0aGUgcHJlc2VuY2Ugb2YgdGhlIHRva2VuIGlzIGV4cG9zZWQgYXMgYVxuICogbm9uLXNlY3JldCBzaWduYWw7IGFuIHVuc2V0IHNlY3JldCBleHBhbmRzIHRvIGBmYWxzZWAgYW5kIGxlYXZlcyBldmVyeSBHdWFyZCBzdGVwIHNraXBwZWQsIHdoaWNoXG4gKiBpcyB3aGF0IGtlZXBzIHRoZSBnZW5lcmF0ZWQgd29ya2Zsb3dzIHJ1bm5hYmxlIGluIGEgcmVwb3NpdG9yeSB0aGF0IG5ldmVyIHJlZ2lzdGVycyB0aGUgc2VjcmV0LlxuICogVEFLVU1JX0dVQVJEX1RPS0VOIGl0c2VsZiBpcyBkZWZpbmVkLWJ1dC1FTVBUWSBqb2Itd2lkZSBzbyB0aGUgYCR7VEFLVU1JX0dVQVJEX1RPS0VOfWAgcmVmZXJlbmNlXG4gKiBpbiB0aGUgZ2VuZXJhdGVkIC5ucG1yYyBzdGlsbCBleHBhbmRzICh0byAnJykgaW4gdGhlIHN0ZXBzIHRoYXQgZGVsaWJlcmF0ZWx5IHJ1biB3aXRob3V0IHRoZVxuICogdG9rZW47IGEgcmVmZXJlbmNlIHRvIGFuIHVuZGVmaW5lZCB2YXJpYWJsZSBpcyB3aGF0IGJyZWFrcyBhbiBpbnN0YWxsLCBhbiBlbXB0eSBvbmUgaXMgZmluZS5cbiAqL1xuY29uc3QgZ3VhcmRKb2JFbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gIEhBU19UQUtVTUlfR1VBUkRfVE9LRU46ICcke3sgISFzZWNyZXRzLlRBS1VNSV9HVUFSRF9UT0tFTiB9fScsXG4gIFRBS1VNSV9HVUFSRF9UT0tFTjogJycsXG59O1xuXG5pbnRlcmZhY2UgU3RlcCB7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIGlkPzogc3RyaW5nO1xuICBpZj86IHN0cmluZztcbiAgdXNlcz86IHN0cmluZztcbiAgcnVuPzogc3RyaW5nO1xuICAnd29ya2luZy1kaXJlY3RvcnknPzogc3RyaW5nO1xuICB3aXRoPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGVudj86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG59XG5cbmludGVyZmFjZSBXb3JrZmxvdyB7XG4gIG5hbWU6IHN0cmluZztcbiAgb246IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBjb25jdXJyZW5jeT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBwZXJtaXNzaW9ucz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIGpvYnM6IFJlY29yZDxcbiAgICBzdHJpbmcsXG4gICAgeyAncnVucy1vbic6IHN0cmluZzsgcGVybWlzc2lvbnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+OyBlbnY/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+OyBzdGVwczogU3RlcFtdIH1cbiAgPjtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlU2VsZkNvbnRhaW5lZFdvcmtmbG93cyhcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgYWxsUGFja2FnZUNvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSA9IFtyb290Q29uZmlnXVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVTZWxmQ29udGFpbmVkV29ya2Zsb3dzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHdvcmtmbG93c1BhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicsICd3b3JrZmxvd3MnKTtcbiAgICBpZiAoIShhd2FpdCBmc1V0aWwuaXNDb25maW5lZFdyaXRhYmxlUGF0aCh3b3JrZmxvd3NQYXRoKSkpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCBnZW5lcmF0aW5nIHdvcmtmbG93cyBiZWNhdXNlICR7d29ya2Zsb3dzUGF0aH0gcmVzb2x2ZXMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeS5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIod29ya2Zsb3dzUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICBjb25zdCB1c2VzRm5veCA9IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJ2Zub3gudG9tbCcpKTtcbiAgICBjb25zdCB3b3JrZmxvd0J5RmlsZU5hbWU6IFJlY29yZDxzdHJpbmcsIFdvcmtmbG93PiA9IHtcbiAgICAgICd0ZXN0LnltbCc6IGJ1aWxkVGVzdFdvcmtmbG93KHJvb3RDb25maWcsIGFsbFBhY2thZ2VDb25maWdzLCB1c2VzRm5veCksXG4gICAgICAnc2VtYW50aWMtcHIueW1sJzogYnVpbGRTZW1hbnRpY1ByV29ya2Zsb3coKSxcbiAgICB9O1xuICAgIC8vIERlcGxveSB3b3JrZmxvd3MgYXJlIGdlbmVyYXRlZCBwZXIgZGVwbG95IHNjcmlwdCB0aGUgcmVwb3NpdG9yeSBkZWNsYXJlcywgc28gYSByZXBvc2l0b3J5XG4gICAgLy8gd2l0aG91dCBhIHN0YWdpbmcgZW52aXJvbm1lbnQgc2ltcGx5IGdldHMgbm8gc3RhZ2luZyB3b3JrZmxvdy4gT25seSBzY3JpcHRzIHRoYXQgaW52b2tlXG4gICAgLy8gYHdiIGRlcGxveWAgcXVhbGlmeTogYSBiZXNwb2tlIGRlcGxveSBzY3JpcHQgbWF5IG5vdCBiZSBzYWZlIHRvIHRyaWdnZXIgYXV0b21hdGljYWxseVxuICAgIC8vIChkZXBsb3ktc3RhZ2luZyBydW5zIG9uIGV2ZXJ5IHB1c2ggdG8gdGhlIGRlZmF1bHQgYnJhbmNoKS5cbiAgICBjb25zdCBzY3JpcHRzID0gcm9vdENvbmZpZy5wYWNrYWdlSnNvbj8uc2NyaXB0cyA/PyB7fTtcbiAgICBjb25zdCBoYXNQcm9kdWN0aW9uRGVwbG95V29ya2Zsb3cgPSBpc1diRGVwbG95U2NyaXB0KHNjcmlwdHNbJ2RlcGxveSddKTtcbiAgICBpZiAoaGFzUHJvZHVjdGlvbkRlcGxveVdvcmtmbG93KSB7XG4gICAgICB3b3JrZmxvd0J5RmlsZU5hbWVbJ2RlcGxveS1wcm9kdWN0aW9uLnltbCddID0gYnVpbGREZXBsb3lXb3JrZmxvdygncHJvZHVjdGlvbicsICdkZXBsb3knLCB1c2VzRm5veCk7XG4gICAgfVxuICAgIGlmIChpc1diRGVwbG95U2NyaXB0KHNjcmlwdHNbJ2RlcGxveTpzdGFnaW5nJ10pKSB7XG4gICAgICB3b3JrZmxvd0J5RmlsZU5hbWVbJ2RlcGxveS1zdGFnaW5nLnltbCddID0gYnVpbGREZXBsb3lXb3JrZmxvdygnc3RhZ2luZycsICdkZXBsb3k6c3RhZ2luZycsIHVzZXNGbm94KTtcbiAgICB9XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLnNlbWFudGljUmVsZWFzZSAmJiByb290Q29uZmlnLnJlbGVhc2UuYnJhbmNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgd29ya2Zsb3dCeUZpbGVOYW1lWydyZWxlYXNlLnltbCddID0gYnVpbGRSZWxlYXNlV29ya2Zsb3cocm9vdENvbmZpZywgaGFzUHJvZHVjdGlvbkRlcGxveVdvcmtmbG93LCB1c2VzRm5veCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgW2ZpbGVOYW1lLCB3b3JrZmxvd10gb2YgT2JqZWN0LmVudHJpZXMod29ya2Zsb3dCeUZpbGVOYW1lKSkge1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IHdyaXRlU2VsZkNvbnRhaW5lZFdvcmtmbG93KHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCBmaWxlTmFtZSksIHdvcmtmbG93KSk7XG4gICAgfVxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVTZWxmQ29udGFpbmVkV29ya2Zsb3coZmlsZVBhdGg6IHN0cmluZywgd29ya2Zsb3c6IFdvcmtmbG93KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gIC8vIFVubGlrZSBXaWxsQm9vc3Rlci1vcmdhbml6YXRpb24gcmVwb3NpdG9yaWVzLCB3YmZ5IGRvZXMgbm90IG93biBhcmJpdHJhcnkgcmVwb3NpdG9yaWVzJyBDSTpcbiAgLy8gb25seSBmaWxlcyBpdCBnZW5lcmF0ZWQgKGlkZW50aWZpZWQgYnkgdGhlIG1hcmtlcikgYXJlIHJlZ2VuZXJhdGVkLCBhbmQgaGFuZC13cml0dGVuXG4gIC8vIHdvcmtmbG93cyBhcmUgbmV2ZXIgdG91Y2hlZC4gT3duZXJzIG9wdCBvdXQgcGVybWFuZW50bHkgYnkgcmVtb3ZpbmcgdGhlIG1hcmtlciBsaW5lLlxuICAvLyBBbiBlbXB0eSBvciB3aGl0ZXNwYWNlLW9ubHkgZmlsZSBjYXJyaWVzIG5vIGhhbmQtd3JpdHRlbiBjb250ZW50LCBzbyBpdCBpcyB0cmVhdGVkIGFzIGFic2VudC5cbiAgaWYgKG9sZENvbnRlbnQgIT09IHVuZGVmaW5lZCAmJiBvbGRDb250ZW50LnRyaW0oKSAhPT0gJycgJiYgIW9sZENvbnRlbnQuc3RhcnRzV2l0aChzZWxmQ29udGFpbmVkV29ya2Zsb3dNYXJrZXIpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgaGVhZGVyID0gYCR7c2VsZkNvbnRhaW5lZFdvcmtmbG93TWFya2VyfSBSZW1vdmUgdGhpcyBsaW5lIHRvIHN0b3Agd2JmeSBmcm9tIG92ZXJ3cml0aW5nIHRoaXMgZmlsZS5cXG5gO1xuICBjb25zdCB5YW1sVGV4dCA9IHlhbWwuZHVtcCh3b3JrZmxvdywgeyBsaW5lV2lkdGg6IC0xIH0pO1xuICBhd2FpdCBmc1V0aWwud3JpdGVGaWxlQ29uZmluZWQoZmlsZVBhdGgsIGhlYWRlciArIHlhbWxUZXh0KTtcbn1cblxuZnVuY3Rpb24gd29ya2luZ0RpcihkaXJQYXRoOiBzdHJpbmcpOiBQaWNrPFN0ZXAsICd3b3JraW5nLWRpcmVjdG9yeSc+IHtcbiAgcmV0dXJuIGRpclBhdGggPyB7ICd3b3JraW5nLWRpcmVjdG9yeSc6IGRpclBhdGggfSA6IHt9O1xufVxuXG5mdW5jdGlvbiBpc1diRGVwbG95U2NyaXB0KHNjcmlwdDogdW5rbm93bik6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIHNjcmlwdCA9PT0gJ3N0cmluZycgJiYgL1xcYndiIGRlcGxveVxcYi91LnRlc3Qoc2NyaXB0KTtcbn1cblxuZnVuY3Rpb24gYnVpbGRUZXN0V29ya2Zsb3coY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBhbGxQYWNrYWdlQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdLCB1c2VzRm5veDogYm9vbGVhbik6IFdvcmtmbG93IHtcbiAgLy8gUGxheXdyaWdodCBtYXkgYmUgZGVjbGFyZWQgb25seSBpbiB3b3Jrc3BhY2UgcGFja2FnZXM7IGB3YiB0ZXN0LW9uLWNpYCBydW5zIGV2ZXJ5IGRlY2xhcmluZ1xuICAvLyBwYWNrYWdlJ3MgZTJlIHRlc3RzLCBzbyB0aGUgd29ya2Zsb3cgbXVzdCBpbnN0YWxsIGJyb3dzZXJzIGZvciBlYWNoIG9mIHRoZW0gKHRoZWlyIHZlcnNpb25zXG4gIC8vIG1heSBkaWZmZXIsIGFuZCBlYWNoIGxpYnJhcnkgdmVyc2lvbiByZXF1aXJlcyBpdHMgbWF0Y2hpbmcgYnJvd3NlciBiaW5hcmllcykuIEJ1bidzIGlzb2xhdGVkXG4gIC8vIGxpbmtlciByZXNvbHZlcyB0aGUgcGxheXdyaWdodCBiaW5hcnkgb25seSBmcm9tIHRoZSBkZWNsYXJpbmcgcGFja2FnZSwgaGVuY2UgdGhlXG4gIC8vIHdvcmtpbmctZGlyZWN0b3J5IG9uIGV2ZXJ5IHN0ZXAuIFRoZSBicm93c2VycyBsYW5kIGluIH4vLmNhY2hlL21zLXBsYXl3cmlnaHQsIHNoYXJlZCBhY3Jvc3NcbiAgLy8gd29ya3NwYWNlcywgc28gc2FtZS12ZXJzaW9uIGluc3RhbGxzIG5hdHVyYWxseSBkZWR1cGxpY2F0ZS5cbiAgY29uc3QgcGxheXdyaWdodERpclBhdGhzID0gWy4uLmFsbFBhY2thZ2VDb25maWdzXVxuICAgIC50b1NvcnRlZCgoYSwgYikgPT4gYS5kaXJQYXRoLmxvY2FsZUNvbXBhcmUoYi5kaXJQYXRoKSlcbiAgICAuZmlsdGVyKChwYWNrYWdlQ29uZmlnKSA9PiBwYWNrYWdlQ29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0VGVzdClcbiAgICAubWFwKChwYWNrYWdlQ29uZmlnKSA9PiBwYXRoLnJlbGF0aXZlKGNvbmZpZy5kaXJQYXRoLCBwYWNrYWdlQ29uZmlnLmRpclBhdGgpKTtcbiAgY29uc3QgaGFzVHlwZWNoZWNrID0gY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcztcbiAgLy8gU3RlcC1zY29wZWQgbGlrZSB0aGUgcmV1c2FibGUgdGVzdCB3b3JrZmxvdzogZGVwZW5kZW5jeSBsaWZlY3ljbGUgc2NyaXB0cyBydW4gYnkgYGJ1biBpbnN0YWxsYFxuICAvLyBtdXN0IG5vdCBiZSBhYmxlIHRvIHJlYWQgdGhlIGxvbmctbGl2ZWQgYWdlIGlkZW50aXR5LlxuICBjb25zdCBmbm94RW52OiBQaWNrPFN0ZXAsICdlbnYnPiA9IHVzZXNGbm94ID8geyBlbnY6IHsgRk5PWF9BR0VfS0VZOiAnJHt7IHNlY3JldHMuRk5PWF9BR0VfS0VZIH19JyB9IH0gOiB7fTtcblxuICBjb25zdCBzdGVwczogU3RlcFtdID0gW1xuICAgIHsgdXNlczogY2hlY2tvdXRBY3Rpb24gfSxcbiAgICB7IHVzZXM6IG1pc2VBY3Rpb24gfSxcbiAgICAuLi5idWlsZEluc3RhbGxTdGVwcyh0cnVlKSxcbiAgICAuLi4ocGxheXdyaWdodERpclBhdGhzLmxlbmd0aCA+IDBcbiAgICAgID8gKFtcbiAgICAgICAgICAuLi5wbGF5d3JpZ2h0RGlyUGF0aHMubWFwKChkaXJQYXRoLCBpbmRleCk6IFN0ZXAgPT4gKHtcbiAgICAgICAgICAgIG5hbWU6IGBHZXQgUGxheXdyaWdodCB2ZXJzaW9uJHtkaXJQYXRoID8gYCAoJHtkaXJQYXRofSlgIDogJyd9YCxcbiAgICAgICAgICAgIC8vIFRoZSBJTlNUQUxMRUQgdmVyc2lvbiwgbm90IHRoZSBwYWNrYWdlLmpzb24gc3BlY2lmaWVyOiBhIHJhbmdlIGxpa2UgYF4xLjQ1LjBgXG4gICAgICAgICAgICAvLyBzdGF5cyB1bmNoYW5nZWQgYWNyb3NzIGxvY2tmaWxlIHVwZGF0ZXMsIHNvIGtleWluZyB0aGUgY2FjaGUgb24gaXQgd291bGQgcmVzdG9yZVxuICAgICAgICAgICAgLy8gc3RhbGUgYnJvd3NlcnMgdGhhdCBubyBsb25nZXIgbWF0Y2ggdGhlIGxpYnJhcnkuIFJ1bnMgYWZ0ZXIgYGJ1biBpbnN0YWxsYCwgc28gdGhlXG4gICAgICAgICAgICAvLyBwYWNrYWdlIGlzIHJlc29sdmFibGUgZnJvbSB0aGUgZGVjbGFyaW5nIHBhY2thZ2UncyBkaXJlY3RvcnkuXG4gICAgICAgICAgICBpZDogYHBsYXl3cmlnaHQtdmVyc2lvbi0ke2luZGV4fWAsXG4gICAgICAgICAgICBydW46ICdlY2hvIFwidmVyc2lvbj0kKGJ1biAtZSBcInRyeSB7IGNvbnNvbGUubG9nKHJlcXVpcmUoXFwnQHBsYXl3cmlnaHQvdGVzdC9wYWNrYWdlLmpzb25cXCcpLnZlcnNpb24pIH0gY2F0Y2gge31cIilcIiA+PiBcIiRHSVRIVUJfT1VUUFVUXCInLFxuICAgICAgICAgICAgLi4ud29ya2luZ0RpcihkaXJQYXRoKSxcbiAgICAgICAgICB9KSksXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogJ0NhY2hlIFBsYXl3cmlnaHQgYnJvd3NlcnMnLFxuICAgICAgICAgICAgaWQ6ICdwbGF5d3JpZ2h0LWNhY2hlJyxcbiAgICAgICAgICAgIHVzZXM6IGNhY2hlQWN0aW9uLFxuICAgICAgICAgICAgd2l0aDoge1xuICAgICAgICAgICAgICBwYXRoOiAnfi8uY2FjaGUvbXMtcGxheXdyaWdodCcsXG4gICAgICAgICAgICAgIGtleTogYHBsYXl3cmlnaHQtXFwke3sgcnVubmVyLm9zIH19LSR7cGxheXdyaWdodERpclBhdGhzXG4gICAgICAgICAgICAgICAgLm1hcCgoXywgaW5kZXgpID0+IGBcXCR7eyBzdGVwcy5wbGF5d3JpZ2h0LXZlcnNpb24tJHtpbmRleH0ub3V0cHV0cy52ZXJzaW9uIH19YClcbiAgICAgICAgICAgICAgICAuam9pbignLScpfWAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgLi4ucGxheXdyaWdodERpclBhdGhzLm1hcCgoZGlyUGF0aCk6IFN0ZXAgPT4gKHtcbiAgICAgICAgICAgIGlmOiBcInN0ZXBzLnBsYXl3cmlnaHQtY2FjaGUub3V0cHV0cy5jYWNoZS1oaXQgIT0gJ3RydWUnXCIsXG4gICAgICAgICAgICBydW46ICdidW4gcGxheXdyaWdodCBpbnN0YWxsIC0td2l0aC1kZXBzJyxcbiAgICAgICAgICAgIC4uLndvcmtpbmdEaXIoZGlyUGF0aCksXG4gICAgICAgICAgfSkpLFxuICAgICAgICAgIC4uLnBsYXl3cmlnaHREaXJQYXRocy5tYXAoKGRpclBhdGgpOiBTdGVwID0+ICh7XG4gICAgICAgICAgICAvLyBUaGUgY2FjaGVkIGJyb3dzZXJzIHN0aWxsIG5lZWQgdGhlaXIgc3lzdGVtIGRlcGVuZGVuY2llcyBvbiBhIGZyZXNoIHJ1bm5lci5cbiAgICAgICAgICAgIGlmOiBcInN0ZXBzLnBsYXl3cmlnaHQtY2FjaGUub3V0cHV0cy5jYWNoZS1oaXQgPT0gJ3RydWUnXCIsXG4gICAgICAgICAgICBydW46ICdidW4gcGxheXdyaWdodCBpbnN0YWxsLWRlcHMnLFxuICAgICAgICAgICAgLi4ud29ya2luZ0RpcihkaXJQYXRoKSxcbiAgICAgICAgICB9KSksXG4gICAgICAgIF0gc2F0aXNmaWVzIFN0ZXBbXSlcbiAgICAgIDogW10pLFxuICAgIC4uLihoYXNUeXBlY2hlY2sgPyBbeyBydW46ICdidW4gcnVuIHR5cGVjaGVjaycsIC4uLmZub3hFbnYgfV0gOiBbXSksXG4gICAgeyBydW46ICdidW4gcnVuIGxpbnQnLCAuLi5mbm94RW52IH0sXG4gICAge1xuICAgICAgbmFtZTogJ1Rlc3QnLFxuICAgICAgaWQ6ICd0ZXN0JyxcbiAgICAgIHJ1bjogYGlmIFtbIFwiJFVQTE9BRF9URVNUX0xPR1wiICE9IFwidHJ1ZVwiIF1dOyB0aGVuXG4gIGV4ZWMgYnVuIHJ1biB0ZXN0L2NpXG5maVxubG9nX2Rpcj0kKG1rdGVtcCAtZCBcIiRSVU5ORVJfVEVNUC90ZXN0LW91dHB1dC5YWFhYWFhcIilcbmVjaG8gXCJsb2dfcGF0aD0kbG9nX2Rpci90ZXN0LmxvZ1wiID4+IFwiJEdJVEhVQl9PVVRQVVRcIlxuIyBLZWVwIGRyYWluaW5nIHRlc3Qgb3V0cHV0IHdoZW4gdGhlIGxvZyByZWFjaGVzIGEgZmlsZS1zaXplIGxpbWl0Llxuc2V0ICtlXG5idW4gcnVuIHRlc3QvY2kgMj4mMSB8ICh0cmFwICcnIFhGU1o7IHRlZSBcIiRsb2dfZGlyL3Rlc3QubG9nXCIpXG50ZXN0X3N0YXR1cz0oXCJcXCR7UElQRVNUQVRVU1tAXX1cIilcbmlmICgoIHRlc3Rfc3RhdHVzWzBdICE9IDAgKSk7IHRoZW4gZXhpdCBcIlxcJHt0ZXN0X3N0YXR1c1swXX1cIjsgZmlcbmV4aXQgXCJcXCR7dGVzdF9zdGF0dXNbMV19XCJgLFxuICAgICAgZW52OiB7IC4uLmZub3hFbnYuZW52LCBVUExPQURfVEVTVF9MT0c6ICcke3sgdmFycy5VUExPQURfVEVTVF9MT0cgfX0nIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnVXBsb2FkIHRlc3QgbG9nJyxcbiAgICAgIGlmOiBcIiR7eyBhbHdheXMoKSAmJiB2YXJzLlVQTE9BRF9URVNUX0xPRyA9PSAndHJ1ZScgJiYgc3RlcHMudGVzdC5vdXRwdXRzLmxvZ19wYXRoICE9ICcnIH19XCIsXG4gICAgICB1c2VzOiB1cGxvYWRBcnRpZmFjdEFjdGlvbixcbiAgICAgIHdpdGg6IHtcbiAgICAgICAgbmFtZTogJ3Rlc3Qtb3V0cHV0LSR7eyBydW5uZXIub3MgfX0tJHt7IGpvYi5jaGVja19ydW5faWQgfX0tJHt7IGdpdGh1Yi5ydW5fYXR0ZW1wdCB9fScsXG4gICAgICAgIHBhdGg6ICcke3sgc3RlcHMudGVzdC5vdXRwdXRzLmxvZ19wYXRoIH19JyxcbiAgICAgICAgJ3JldGVudGlvbi1kYXlzJzogMTQsXG4gICAgICAgICdpZi1uby1maWxlcy1mb3VuZCc6ICdlcnJvcicsXG4gICAgICB9LFxuICAgIH0sXG4gICAgLi4uKHBsYXl3cmlnaHREaXJQYXRocy5sZW5ndGggPiAwXG4gICAgICA/IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnVXBsb2FkIHRlc3QgcmVzdWx0cycsXG4gICAgICAgICAgICBpZjogJyR7eyBhbHdheXMoKSB9fScsXG4gICAgICAgICAgICB1c2VzOiB1cGxvYWRBcnRpZmFjdEFjdGlvbixcbiAgICAgICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAgICAgbmFtZTogJ3Rlc3QtcmVzdWx0cycsXG4gICAgICAgICAgICAgIC8vIEV2ZXJ5IGRlY2xhcmluZyBwYWNrYWdlIHdyaXRlcyBpdHMgb3duIHRlc3QtcmVzdWx0cyBkaXJlY3Rvcnk7IGEgbmV3bGluZS1zZXBhcmF0ZWRcbiAgICAgICAgICAgICAgLy8gbGlzdCB1cGxvYWRzIHRoZW0gYWxsLlxuICAgICAgICAgICAgICBwYXRoOiBwbGF5d3JpZ2h0RGlyUGF0aHNcbiAgICAgICAgICAgICAgICAubWFwKChkaXJQYXRoKSA9PiAoZGlyUGF0aCA/IHBhdGgucG9zaXguam9pbihkaXJQYXRoLCAndGVzdC1yZXN1bHRzJykgOiAndGVzdC1yZXN1bHRzJykpXG4gICAgICAgICAgICAgICAgLmpvaW4oJ1xcbicpLFxuICAgICAgICAgICAgICAnaWYtbm8tZmlsZXMtZm91bmQnOiAnaWdub3JlJyxcbiAgICAgICAgICAgICAgJ3JldGVudGlvbi1kYXlzJzogMTQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIF1cbiAgICAgIDogW10pLFxuICBdO1xuXG4gIHJldHVybiB7XG4gICAgbmFtZTogJ1Rlc3QnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3Q6IG51bGwsXG4gICAgICBwdXNoOiB7IGJyYW5jaGVzOiBbJ21haW4nXSB9LFxuICAgIH0sXG4gICAgY29uY3VycmVuY3k6IHtcbiAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fS0ke3sgZ2l0aHViLnJlZiB9fScsXG4gICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogdHJ1ZSxcbiAgICB9LFxuICAgIHBlcm1pc3Npb25zOiB7IGNvbnRlbnRzOiAncmVhZCcgfSxcbiAgICBqb2JzOiB7XG4gICAgICB0ZXN0OiB7XG4gICAgICAgICdydW5zLW9uJzogJ3VidW50dS1sYXRlc3QnLFxuICAgICAgICBlbnY6IHsgRk9SQ0VfQ09MT1I6ICczJywgV0JfRU5WOiAndGVzdCcsIC4uLmd1YXJkSm9iRW52IH0sXG4gICAgICAgIHN0ZXBzLFxuICAgICAgfSxcbiAgICB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZERlcGxveVdvcmtmbG93KGVudmlyb25tZW50OiAnc3RhZ2luZycgfCAncHJvZHVjdGlvbicsIHNjcmlwdE5hbWU6IHN0cmluZywgdXNlc0Zub3g6IGJvb2xlYW4pOiBXb3JrZmxvdyB7XG4gIHJldHVybiB7XG4gICAgbmFtZTogYERlcGxveSBhcHAgb24gJHtlbnZpcm9ubWVudH1gLFxuICAgIG9uOiB7XG4gICAgICB3b3JrZmxvd19kaXNwYXRjaDogbnVsbCxcbiAgICAgIC8vIFByb2R1Y3Rpb24gZGVwbG95cyBmb2xsb3cgcHVibGlzaGVkIHJlbGVhc2VzIChzZWUgdGhlIHJlbGVhc2Ugd29ya2Zsb3cncyB0cmlnZ2VyIHN0ZXApO1xuICAgICAgLy8gc3RhZ2luZyBjb252ZXJnZXMgb24gZXZlcnkgZGVmYXVsdC1icmFuY2ggcHVzaC5cbiAgICAgIC4uLihlbnZpcm9ubWVudCA9PT0gJ3Byb2R1Y3Rpb24nXG4gICAgICAgID8geyByZWxlYXNlOiB7IHR5cGVzOiBbJ3B1Ymxpc2hlZCddIH0gfVxuICAgICAgICA6IHsgcHVzaDogeyBicmFuY2hlczogWydtYWluJ10sICdwYXRocy1pZ25vcmUnOiBbJyoqLm1kJywgJyoqL2RvY3MvKionXSB9IH0pLFxuICAgIH0sXG4gICAgY29uY3VycmVuY3k6IHtcbiAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fScsXG4gICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogZmFsc2UsXG4gICAgfSxcbiAgICBwZXJtaXNzaW9uczogeyBjb250ZW50czogJ3JlYWQnIH0sXG4gICAgam9iczoge1xuICAgICAgZGVwbG95OiB7XG4gICAgICAgICdydW5zLW9uJzogJ3VidW50dS1sYXRlc3QnLFxuICAgICAgICBlbnY6IHsgV0JfRU5WOiBlbnZpcm9ubWVudCwgLi4uZ3VhcmRKb2JFbnYgfSxcbiAgICAgICAgc3RlcHM6IFtcbiAgICAgICAgICAvLyBmZXRjaC1kZXB0aCAwIHNvIGBnaXQgZGVzY3JpYmVgIHNlZXMgdGhlIHRhZ3MgV0JfVkVSU0lPTiBpcyBkZXJpdmVkIGZyb20uXG4gICAgICAgICAgeyB1c2VzOiBjaGVja291dEFjdGlvbiwgd2l0aDogeyAnZmV0Y2gtZGVwdGgnOiAwIH0gfSxcbiAgICAgICAgICB7IHVzZXM6IG1pc2VBY3Rpb24gfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnU2V0IFdCX1ZFUlNJT04nLFxuICAgICAgICAgICAgcnVuOiAnc2V0IC1ldW8gcGlwZWZhaWxcXG5XQl9WRVJTSU9OPSQoZ2l0IGRlc2NyaWJlIC0tYWx3YXlzIC0tdGFncylcXG5lY2hvIFwiV0JfVkVSU0lPTj0kV0JfVkVSU0lPTlwiID4+IFwiJEdJVEhVQl9FTlZcIicsXG4gICAgICAgICAgfSxcbiAgICAgICAgICAuLi5idWlsZEluc3RhbGxTdGVwcyhmYWxzZSksXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogJ0RlcGxveScsXG4gICAgICAgICAgICB1c2VzOiByZXRyeUFjdGlvbixcbiAgICAgICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAgICAgdGltZW91dF9taW51dGVzOiA2MCxcbiAgICAgICAgICAgICAgbWF4X2F0dGVtcHRzOiA1LFxuICAgICAgICAgICAgICBjb21tYW5kOiBgYnVuIHJ1biAke3NjcmlwdE5hbWV9YCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvLyBTdGVwLXNjb3BlZCBsaWtlIHRoZSB0ZXN0IHdvcmtmbG93OiBkZXBlbmRlbmN5IGxpZmVjeWNsZSBzY3JpcHRzIHJ1biBieVxuICAgICAgICAgICAgLy8gYGJ1biBpbnN0YWxsYCBtdXN0IG5vdCBiZSBhYmxlIHRvIHJlYWQgdGhlIGxvbmctbGl2ZWQgYWdlIGlkZW50aXR5LlxuICAgICAgICAgICAgLi4uKHVzZXNGbm94ID8geyBlbnY6IHsgRk5PWF9BR0VfS0VZOiAnJHt7IHNlY3JldHMuRk5PWF9BR0VfS0VZIH19JyB9IH0gOiB7fSksXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRSZWxlYXNlV29ya2Zsb3coXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgaGFzUHJvZHVjdGlvbkRlcGxveVdvcmtmbG93OiBib29sZWFuLFxuICB1c2VzRm5veDogYm9vbGVhblxuKTogV29ya2Zsb3cge1xuICBjb25zdCBmbm94RW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0gdXNlc0Zub3ggPyB7IEZOT1hfQUdFX0tFWTogJyR7eyBzZWNyZXRzLkZOT1hfQUdFX0tFWSB9fScgfSA6IHt9O1xuICByZXR1cm4ge1xuICAgIG5hbWU6ICdSZWxlYXNlJyxcbiAgICBvbjoge1xuICAgICAgcHVzaDogeyBicmFuY2hlczogWy4uLmNvbmZpZy5yZWxlYXNlLmJyYW5jaGVzXSB9LFxuICAgIH0sXG4gICAgY29uY3VycmVuY3k6IHtcbiAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fScsXG4gICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogZmFsc2UsXG4gICAgfSxcbiAgICBwZXJtaXNzaW9uczoge1xuICAgICAgLy8gZm9yIHNlbWFudGljLXJlbGVhc2VcbiAgICAgIGNvbnRlbnRzOiAnd3JpdGUnLFxuICAgICAgLy8gZm9yIGRpc3BhdGNoaW5nIHRoZSBwcm9kdWN0aW9uIGRlcGxveSB3b3JrZmxvdyBhZnRlciBhIHJlbGVhc2VcbiAgICAgIC4uLihoYXNQcm9kdWN0aW9uRGVwbG95V29ya2Zsb3cgPyB7IGFjdGlvbnM6ICd3cml0ZScgfSA6IHt9KSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgIHJlbGVhc2U6IHtcbiAgICAgICAgJ3J1bnMtb24nOiAndWJ1bnR1LWxhdGVzdCcsXG4gICAgICAgIC8vIFJlbGVhc2VzIGJ1aWxkIHByb2R1Y3Rpb24gYXJ0aWZhY3RzLCBoZW5jZSB0aGUgZW52aXJvbm1lbnQg4oCUIHRoZSBzYW1lIGRlZmF1bHQgYXMgdGhlXG4gICAgICAgIC8vIHJldXNhYmxlIHJlbGVhc2Ugd29ya2Zsb3cuIHdiJ3MgQ0kgZ3VhcmQgYWxzbyByZXF1aXJlcyBhbiBleHBvcnRlZCBXQl9FTlYsIHNvIHdpdGhvdXRcbiAgICAgICAgLy8gaXQgYSBgcG9zdGluc3RhbGxgIHRoYXQgY2FsbHMgd2IgKGUuZy4gYHdiIGdlbi1jb2RlYCkgZXhpdHMgMSBiZWZvcmUgc2VtYW50aWMtcmVsZWFzZVxuICAgICAgICAvLyBydW5zLlxuICAgICAgICBlbnY6IHsgV0JfRU5WOiAncHJvZHVjdGlvbicsIC4uLmd1YXJkSm9iRW52IH0sXG4gICAgICAgIHN0ZXBzOiBbXG4gICAgICAgICAgLy8gZmV0Y2gtZGVwdGggMDogc2VtYW50aWMtcmVsZWFzZSByZWFkcyB0aGUgZnVsbCBoaXN0b3J5IHRvIGNvbXB1dGUgdGhlIG5leHQgdmVyc2lvbi5cbiAgICAgICAgICB7IHVzZXM6IGNoZWNrb3V0QWN0aW9uLCB3aXRoOiB7ICdmZXRjaC1kZXB0aCc6IDAgfSB9LFxuICAgICAgICAgIHsgdXNlczogbWlzZUFjdGlvbiB9LFxuICAgICAgICAgIC4uLmJ1aWxkSW5zdGFsbFN0ZXBzKGZhbHNlKSxcbiAgICAgICAgICAuLi4oaGFzUHJvZHVjdGlvbkRlcGxveVdvcmtmbG93XG4gICAgICAgICAgICA/IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBuYW1lOiAnR2V0IGN1cnJlbnQgbGF0ZXN0IHRhZycsXG4gICAgICAgICAgICAgICAgICBpZDogJ3ByZS1yZWxlYXNlLXRhZycsXG4gICAgICAgICAgICAgICAgICBydW46ICdzZXQgLWV1byBwaXBlZmFpbFxcbmVjaG8gXCJ0YWc9JChnaXQgZGVzY3JpYmUgLS10YWdzIC0tYWJicmV2PTAgMj4vZGV2L251bGwgfHwgZWNobyBcXCdcXCcpXCIgPj4gXCIkR0lUSFVCX09VVFBVVFwiJyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBdXG4gICAgICAgICAgICA6IFtdKSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnUmVsZWFzZScsXG4gICAgICAgICAgICAvLyBzZW1hbnRpYy1yZWxlYXNlIGNoZWNrcyBOb2RlLmpzIHJ1bnRpbWUgcmVxdWlyZW1lbnRzOyBgYnVuIDxiaW4+YCByZXNwZWN0cyBpdHNcbiAgICAgICAgICAgIC8vIGAjIS91c3IvYmluL2VudiBub2RlYCBzaGViYW5nLCBzbyBpdCBzdGlsbCBydW5zIHVuZGVyIHJlYWwgTm9kZS5cbiAgICAgICAgICAgIHJ1bjogJ2J1biBzZW1hbnRpYy1yZWxlYXNlJyxcbiAgICAgICAgICAgIGVudjoge1xuICAgICAgICAgICAgICBHSVRIVUJfVE9LRU46ICcke3sgc2VjcmV0cy5HSVRIVUJfVE9LRU4gfX0nLFxuICAgICAgICAgICAgICBMRUZUSE9PSzogJzAnLFxuICAgICAgICAgICAgICAuLi5mbm94RW52LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIC4uLihoYXNQcm9kdWN0aW9uRGVwbG95V29ya2Zsb3dcbiAgICAgICAgICAgID8gKFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBuYW1lOiAnQ2hlY2sgZm9yIG5ldyByZWxlYXNlIHRhZycsXG4gICAgICAgICAgICAgICAgICBpZDogJ3Bvc3QtcmVsZWFzZS10YWcnLFxuICAgICAgICAgICAgICAgICAgcnVuOiAnc2V0IC1ldW8gcGlwZWZhaWxcXG5naXQgZmV0Y2ggLS10YWdzIC0tZm9yY2VcXG5ORVdfVEFHPSQoZ2l0IGRlc2NyaWJlIC0tdGFncyAtLWFiYnJldj0wIDI+L2Rldi9udWxsIHx8IGVjaG8gXFwnXFwnKVxcbmVjaG8gXCJ0YWc9JE5FV19UQUdcIiA+PiBcIiRHSVRIVUJfT1VUUFVUXCJcXG5pZiBbWyAtbiBcIiRORVdfVEFHXCIgJiYgXCIkTkVXX1RBR1wiICE9IFwiJHt7IHN0ZXBzLnByZS1yZWxlYXNlLXRhZy5vdXRwdXRzLnRhZyB9fVwiIF1dOyB0aGVuXFxuICBlY2hvIFwiY3JlYXRlZD10cnVlXCIgPj4gXCIkR0lUSFVCX09VVFBVVFwiXFxuZmknLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgaWY6IFwic3RlcHMucG9zdC1yZWxlYXNlLXRhZy5vdXRwdXRzLmNyZWF0ZWQgPT0gJ3RydWUnXCIsXG4gICAgICAgICAgICAgICAgICBuYW1lOiAnVHJpZ2dlciBwcm9kdWN0aW9uIGRlcGxveScsXG4gICAgICAgICAgICAgICAgICAvLyBBIEdJVEhVQl9UT0tFTi1jcmVhdGVkIHJlbGVhc2UgZG9lcyBub3QgZmlyZSB0aGUgZGVwbG95IHdvcmtmbG93J3NcbiAgICAgICAgICAgICAgICAgIC8vIHJlbGVhc2UtcHVibGlzaGVkIHRyaWdnZXIsIHNvIGRpc3BhdGNoIGl0IGV4cGxpY2l0bHkgb24gdGhlIG5ldyB0YWcuXG4gICAgICAgICAgICAgICAgICBydW46ICdnaCB3b3JrZmxvdyBydW4gZGVwbG95LXByb2R1Y3Rpb24ueW1sIC0tcmVmIFwiJHt7IHN0ZXBzLnBvc3QtcmVsZWFzZS10YWcub3V0cHV0cy50YWcgfX1cIicsXG4gICAgICAgICAgICAgICAgICBlbnY6IHsgR0hfVE9LRU46ICcke3sgc2VjcmV0cy5HSVRIVUJfVE9LRU4gfX0nIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXSBzYXRpc2ZpZXMgU3RlcFtdKVxuICAgICAgICAgICAgOiBbXSksXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogVGhlIGluc3RhbGwgc2VxdWVuY2UgZXZlcnkgZ2VuZXJhdGVkIHdvcmtmbG93IHNoYXJlczogYGJ1biBpbnN0YWxsIC0tZnJvemVuLWxvY2tmaWxlYCwgaGFyZGVuZWQgaW50byB0aGVcbiAqIHJldXNhYmxlIHdvcmtmbG93cycgdGhyZWUtc3RlcCBkYW5jZSB3aGVuIHRoZSByZXBvc2l0b3J5IHJlZ2lzdGVycyBhIFRBS1VNSV9HVUFSRF9UT0tFTiBzZWNyZXQuXG4gKlxuICogVGFrdW1pIEd1YXJkIChodHRwczovL2ZsYXR0LnRlY2gvdGFrdW1pL2ZlYXR1cmVzL2d1YXJkKSBpcyBhIHJlZ2lzdHJ5IHByb3h5IHRoYXQgYmxvY2tzXG4gKiBrbm93bi1tYWxpY2lvdXMgcGFja2FnZXMuIFJvdXRpbmcgdGhlIERFRkFVTFQgcmVnaXN0cnkgdGhyb3VnaCBpdCBpcyB3aGF0IHByb3RlY3RzIHRoZSBpbnN0YWxsLFxuICogYW5kIHRoZSB0b2tlbiBhdXRoZW50aWNhdGVzIHRoYXQgcHJveHkg4oCUIHNvIHRoZSB0b2tlbiBoYXMgdG8gYmUgcHJlc2VudCB3aGlsZSBkZXBlbmRlbmNpZXMgYXJlXG4gKiByZXNvbHZlZCwgd2hpY2ggaXMgZXhhY3RseSB3aGVuIGEgY29tcHJvbWlzZWQgZGVwZW5kZW5jeSdzIGxpZmVjeWNsZSBzY3JpcHQgd291bGQgcnVuLiBIZW5jZSB0aGVcbiAqIHNwbGl0OiByZXNvbHZlIGFuZCBkb3dubG9hZCB3aXRoIGAtLWlnbm9yZS1zY3JpcHRzYCBhbmQgdGhlIHRva2VuLCB0aGVuIHJlcGxheSB0aGUgc2tpcHBlZFxuICogbGlmZWN5Y2xlIHNjcmlwdHMgaW4gYSBzZWNvbmQgaW5zdGFsbCB0aGF0IGhhcyBubyB0b2tlbiAoZXZlcnkgcGFja2FnZSBpcyBhbHJlYWR5IGNhY2hlZCwgYW5kXG4gKiBHdWFyZCBzZXJ2ZXMgYW5vbnltb3VzbHkgYW55d2F5KS4gT25seSBidW4gaXMgZ2VuZXJhdGVkIGhlcmUsIGFuZCBidW4gcmVhZHMgLm5wbXJjLCBzbyBub1xuICogcGFja2FnZS1tYW5hZ2VyIGJyYW5jaGluZyBpcyBuZWVkZWQuXG4gKlxuICogVGhlIHNoZWxsIGRldGFpbHMgZGVsaWJlcmF0ZWx5IG1pcnJvciByZXVzYWJsZS13b3JrZmxvd3MnIHByb2R1Y3Rpb24tcHJvdmVuIGluc3RhbGwgc3RlcHM6IGJhcmVcbiAqIGAkUlVOTkVSX1RFTVBgIChzZXQgYnkgdGhlIHJ1bm5lciBhcHBsaWNhdGlvbiBvbiBldmVyeSBydW5uZXIsIGFuZCBgc2V0IC11YCBmYWlscyBsb3VkbHkgaWYgbm90KSxcbiAqIGBbWyAtZSAubnBtcmMgXV1gLCBhbmQgdGhlIHNlY29uZCBgcm0gLXJmIG5vZGVfbW9kdWxlc2AgaW4gdGhlIGZhbGxiYWNrIChhbiBpbnRlcnJ1cHRlZCBsaWZlY3ljbGVcbiAqIHJ1biBtYXkgbGVhdmUgbm9kZV9tb2R1bGVzIGluY29uc2lzdGVudCwgc28gdGhlIHJldHJ5IHN0YXJ0cyBjbGVhbiByYXRoZXIgdGhhbiB0cnVzdGluZyBhIHJlcGFpcikuXG4gKlxuICogYHRvbGVyYXRlTGlmZWN5Y2xlU2NyaXB0RmFpbHVyZWAgZGVjaWRlcyB3aGF0IGEgZmFpbGluZyBsaWZlY3ljbGUtc2NyaXB0IHJlcGxheSBkb2VzLiBFdmVyeVxuICogcmVwbGF5IHJ1bnMgdG9rZW5sZXNzIGFuZCB3aXRob3V0IEZOT1hfQUdFX0tFWSAodGhlIGtleSBpcyBzY29wZWQgdG8gdGhlIGxhdGVyIERlcGxveS9SZWxlYXNlXG4gKiBzdGVwKSwgc28gYSBwb3N0aW5zdGFsbCB0aGF0IG5lZWRzIGRlY3J5cHRlZCBzZWNyZXRzIGlzIHVuc3VwcG9ydGVkIGluIGFsbCBvZiB0aGVtIGJ5IGRlc2lnbi5cbiAqIFRoZSB0ZXN0IHdvcmtmbG93IHRvbGVyYXRlcyB0aGUgZmFpbHVyZSBiZWNhdXNlIHR5cGVjaGVjay9saW50L3Rlc3QgZmFpbCBsb3VkbHkgb24gYSBkZWdyYWRlZFxuICogdHJlZSBhbnl3YXkuIERlcGxveSBhbmQgcmVsZWFzZSB3b3JrZmxvd3MgbXVzdCBub3Q6IGEgYDo6d2FybmluZzo6YCBkb2VzIG5vdCBmYWlsIHRoZSBqb2IsIHNvXG4gKiB0aGUgZmFsbGJhY2sgd291bGQgc2hpcCBhIHRyZWUgd2hvc2UgbGlmZWN5Y2xlIHNjcmlwdHMgKGUuZy4gYSBgcG9zdGluc3RhbGw6IHdiIGdlbi1jb2RlYClcbiAqIG5ldmVyIHJhbiwgc2lsZW50bHkgZGVwbG95aW5nIGRlZ3JhZGVkIG91dHB1dCAoIzExMjcpLlxuICovXG5mdW5jdGlvbiBidWlsZEluc3RhbGxTdGVwcyh0b2xlcmF0ZUxpZmVjeWNsZVNjcmlwdEZhaWx1cmU6IGJvb2xlYW4pOiBTdGVwW10ge1xuICByZXR1cm4gW1xuICAgIHtcbiAgICAgIGlmOiBcIiR7eyBlbnYuSEFTX1RBS1VNSV9HVUFSRF9UT0tFTiA9PSAndHJ1ZScgfX1cIixcbiAgICAgIG5hbWU6ICdHZW5lcmF0ZSAubnBtcmMgZm9yIFRha3VtaSBHdWFyZCcsXG4gICAgICAvLyBUaGUgdG9rZW4gaXMgd3JpdHRlbiBhcyBhIGxpdGVyYWwgYCR7VEFLVU1JX0dVQVJEX1RPS0VOfWAgcmVmZXJlbmNlIHRoYXQgYnVuIGV4cGFuZHMgYXRcbiAgICAgIC8vIGluc3RhbGwgdGltZSwgc28gdGhlIHNlY3JldCBpdHNlbGYgbmV2ZXIgbGFuZHMgaW4gYSBmaWxlLiBUaGUgbWFuYWdlZCBsaW5lcyBhcmUgc3RyaXBwZWRcbiAgICAgIC8vIGZyb20gYW4gZXhpc3RpbmcgLm5wbXJjIGZpcnN0OiBhIHJlcG9zaXRvcnkgb3V0c2lkZSB0aGUgb3JnYW5pemF0aW9ucyBtYXkgbGVnaXRpbWF0ZWx5XG4gICAgICAvLyBjb21taXQgb25lIChzY29wZSBtYXBwaW5ncyBmb3IgYW5vdGhlciByZWdpc3RyeSksIGFuZCBkcm9wcGluZyBvbmx5IHRoZXNlIHR3byBsaW5lcyBrZWVwc1xuICAgICAgLy8gdGhlIHJlc3Qgb2YgaXQgaW4gZWZmZWN0LiBSZXBsYWNpbmcgdGhlIGZpbGUgd2l0aCBgbXZgIHJhdGhlciB0aGFuIGFwcGVuZGluZyBpbiBwbGFjZSBzdG9wc1xuICAgICAgLy8gYSBjb21taXR0ZWQgc3ltbGluayBmcm9tIHJlZGlyZWN0aW5nIHRoZSB3cml0ZSBpbnRvLCBzYXksIGEgcGVyc2lzdGVudCBob21lIG5wbXJjLlxuICAgICAgcnVuOiBgc2V0IC1ldW8gcGlwZWZhaWxcbk5QTVJDPVwiJChta3RlbXAgXCIkUlVOTkVSX1RFTVAvbnBtcmMuWFhYWFhYXCIpXCJcbmlmIFtbIC1lIC5ucG1yYyBdXTsgdGhlblxuICBncmVwIC12RSAnXnJlZ2lzdHJ5PXxeLy9ucG1cXFxcLmZsYXR0XFxcXC50ZWNoLzpfYXV0aFRva2VuJyAubnBtcmMgPiBcIiROUE1SQ1wiIHx8IHRydWVcbmZpXG5lY2hvICdyZWdpc3RyeT1odHRwczovL25wbS5mbGF0dC50ZWNoLycgPj4gXCIkTlBNUkNcIlxuZWNobyAnLy9ucG0uZmxhdHQudGVjaC86X2F1dGhUb2tlbj1cXCR7VEFLVU1JX0dVQVJEX1RPS0VOfScgPj4gXCIkTlBNUkNcIlxucm0gLWYgLm5wbXJjXG5tdiBcIiROUE1SQ1wiIC5ucG1yY2AsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnSW5zdGFsbCBkZXBlbmRlbmNpZXMnLFxuICAgICAgLy8gLS1mcm96ZW4tbG9ja2ZpbGU6IGEgcGxhaW4gYGJ1biBpbnN0YWxsYCBzaWxlbnRseSByZXBhaXJzIGEgYnVuLmxvY2sgdGhhdCBpcyBzdGFsZSBhZ2FpbnN0XG4gICAgICAvLyBwYWNrYWdlLmpzb24sIHNvIENJIHdvdWxkIHJ1biBkZXBlbmRlbmN5IHJlc29sdXRpb25zIHRoYXQgd2VyZSBuZXZlciByZXZpZXdlZCAoIzExMjYpLlxuICAgICAgLy8gV2l0aCBOTyBidW4ubG9jayBhdCBhbGwsIC0tZnJvemVuLWxvY2tmaWxlIHNpbGVudGx5IGluc3RhbGxzIGZyZXNoLCB1bnBpbm5lZCByZXNvbHV0aW9uc1xuICAgICAgLy8gKEJ1biAxLjMuMTQgZXhpdHMgMCBhbmQgd3JpdGVzIG5vIGxvY2tmaWxlKSwgc28gYSBtaXNzaW5nIGxvY2tmaWxlIG11c3QgZmFpbCBleHBsaWNpdGx5LlxuICAgICAgcnVuOiBgc2V0IC1ldW8gcGlwZWZhaWxcbmlmIFtbICEgLWUgYnVuLmxvY2sgXV07IHRoZW5cbiAgZWNobyBcIjo6ZXJyb3I6OmJ1bi5sb2NrIGlzIG1pc3Npbmc7IGNvbW1pdCBpdCBzbyBDSSBpbnN0YWxscyBzdGF5IHJlcHJvZHVjaWJsZVwiXG4gIGV4aXQgMVxuZmlcbmlmIFtbIFwiJEhBU19UQUtVTUlfR1VBUkRfVE9LRU5cIiA9PSBcInRydWVcIiBdXTsgdGhlblxuICBidW4gaW5zdGFsbCAtLWZyb3plbi1sb2NrZmlsZSAtLWlnbm9yZS1zY3JpcHRzXG5lbHNlXG4gIGJ1biBpbnN0YWxsIC0tZnJvemVuLWxvY2tmaWxlXG5maWAsXG4gICAgICAvLyBTdGVwLXNjb3BlZDogYSBqb2ItbGV2ZWwgdG9rZW4gd291bGQgYmUgcmVhZGFibGUgYnkgZXZlcnkgZGVwZW5kZW5jeSBsaWZlY3ljbGUgc2NyaXB0IHRoZVxuICAgICAgLy8gdG9rZW5sZXNzIHJlcGxheSBiZWxvdyBydW5zLlxuICAgICAgZW52OiB7IFRBS1VNSV9HVUFSRF9UT0tFTjogJyR7eyBzZWNyZXRzLlRBS1VNSV9HVUFSRF9UT0tFTiB9fScgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlmOiBcIiR7eyBlbnYuSEFTX1RBS1VNSV9HVUFSRF9UT0tFTiA9PSAndHJ1ZScgfX1cIixcbiAgICAgIG5hbWU6ICdSdW4gZGVwZW5kZW5jeSBsaWZlY3ljbGUgc2NyaXB0cyB3aXRob3V0IHJlZ2lzdHJ5IGNyZWRlbnRpYWxzJyxcbiAgICAgIC8vIEEgcmVwZWF0ZWQgYGJ1biBpbnN0YWxsYCBpcyBhIG5vLW9wIHRoYXQgcmVwbGF5cyBub3RoaW5nLCBzbyBub2RlX21vZHVsZXMgaGFzIHRvIGdvIGZpcnN0LlxuICAgICAgcnVuOiBgc2V0IC1ldW8gcGlwZWZhaWxcbnJtIC1yZiBub2RlX21vZHVsZXNcbmJ1biBpbnN0YWxsIC0tZnJvemVuLWxvY2tmaWxlJHtcbiAgICAgICAgdG9sZXJhdGVMaWZlY3ljbGVTY3JpcHRGYWlsdXJlXG4gICAgICAgICAgPyBgIHx8IHtcbiAgZWNobyBcIjo6d2FybmluZzo6TGlmZWN5Y2xlIHNjcmlwdHMgZmFpbGVkOyBjb21wbGV0aW5nIHRoZSBpbnN0YWxsIHdpdGhvdXQgdGhlbVwiXG4gIHJtIC1yZiBub2RlX21vZHVsZXNcbiAgYnVuIGluc3RhbGwgLS1mcm96ZW4tbG9ja2ZpbGUgLS1pZ25vcmUtc2NyaXB0c1xufWBcbiAgICAgICAgICA6ICcnXG4gICAgICB9YCxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlmOiBcIiR7eyBlbnYuSEFTX1RBS1VNSV9HVUFSRF9UT0tFTiA9PSAndHJ1ZScgfX1cIixcbiAgICAgIG5hbWU6ICdSZW1vdmUgdGhlIGdlbmVyYXRlZCAubnBtcmMnLFxuICAgICAgLy8gTm90aGluZyBhZnRlciB0aGUgaW5zdGFsbCBuZWVkcyB0aGUgcHJveHksIGFuZCBsZWF2aW5nIGl0IGluIHBsYWNlIHdvdWxkIGJyZWFrIHRoZSBvbmVcbiAgICAgIC8vIHRoaW5nIEd1YXJkIHJlZnVzZXMgdG8gc2VydmU6IGl0IGFuc3dlcnMgYG5wbSBwdWJsaXNoYCB3aXRoIDQwNSwgc28gYSByZWxlYXNlIHdvcmtmbG93XG4gICAgICAvLyB3aG9zZSBwYWNrYWdlIGxhY2tzIGFuIGV4cGxpY2l0IHB1Ymxpc2hDb25maWcucmVnaXN0cnkgd291bGQgZmFpbCB0byBwdWJsaXNoLlxuICAgICAgcnVuOiBgc2V0IC1ldW8gcGlwZWZhaWxcbmlmIGdpdCBscy1maWxlcyAtLWVycm9yLXVubWF0Y2ggLS0gLm5wbXJjID4gL2Rldi9udWxsIDI+JjE7IHRoZW5cbiAgZ2l0IGNoZWNrb3V0IC0tIC5ucG1yY1xuZWxzZVxuICBybSAtZiAubnBtcmNcbmZpYCxcbiAgICB9LFxuICBdO1xufVxuXG5mdW5jdGlvbiBidWlsZFNlbWFudGljUHJXb3JrZmxvdygpOiBXb3JrZmxvdyB7XG4gIHJldHVybiB7XG4gICAgbmFtZTogJ0xpbnQgUFIgdGl0bGUnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3RfdGFyZ2V0OiB7IHR5cGVzOiBbJ29wZW5lZCcsICdlZGl0ZWQnLCAnc3luY2hyb25pemUnXSB9LFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ3NlbWFudGljLXByJzoge1xuICAgICAgICAncnVucy1vbic6ICd1YnVudHUtbGF0ZXN0JyxcbiAgICAgICAgLy8gVGhlIGFjdGlvbiByZWFkcyB0aGUgcHVsbCByZXF1ZXN0LCBhbmQgaXRzIGB3aXBgIHN1cHBvcnQgcG9zdHMgYSBjb21taXQgc3RhdHVzOyBuZWl0aGVyXG4gICAgICAgIC8vIHBlcm1pc3Npb24gaXMgZ3JhbnRlZCB3aGVuIHRoZSByZXBvc2l0b3J5IHJlc3RyaWN0cyBkZWZhdWx0IHdvcmtmbG93IHBlcm1pc3Npb25zLlxuICAgICAgICBwZXJtaXNzaW9uczogeyAncHVsbC1yZXF1ZXN0cyc6ICdyZWFkJywgc3RhdHVzZXM6ICd3cml0ZScgfSxcbiAgICAgICAgc3RlcHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB1c2VzOiBzZW1hbnRpY1B1bGxSZXF1ZXN0QWN0aW9uLFxuICAgICAgICAgICAgd2l0aDogeyB3aXA6IHRydWUgfSxcbiAgICAgICAgICAgIGVudjogeyBHSVRIVUJfVE9LRU46ICcke3sgc2VjcmV0cy5HSVRIVUJfVE9LRU4gfX0nIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcbn1cbiIsImltcG9ydCBhc3NlcnQgZnJvbSAnbm9kZTphc3NlcnQnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHNlbXZlciBmcm9tICdzZW12ZXInO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0IH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcblxuaW50ZXJmYWNlIE1pc2VUb21sIHtcbiAgdG9vbHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuLy8gVGhlIG9sZGVzdCBCdW4gcnVudGltZSB3YmZ5IHN1cHBvcnRzLlxuZXhwb3J0IGNvbnN0IG1pbmltdW1CdW5WZXJzaW9uID0gJzEuNC4wJztcblxuLyoqXG4gKiBQaW5zIE5vZGUuanMgYW5kIHRoZSBsYXRlc3QgQnVuIGFuZCAod2hlbiBmbm94LnRvbWwgZXhpc3RzKSBmbm94IHZlcnNpb25zLiBPbmx5IHRoZSBjaGFuZ2VkIHBpblxuICogbGluZXMgYXJlIGVkaXRlZCBpbiBwbGFjZTogcmUtc2VyaWFsaXppbmcgdGhlIHBhcnNlZCBUT01MIHdvdWxkIGRyb3AgZXZlcnkgY29tbWVudCBhbmQgY29sbGFwc2VcbiAqIG11bHRpLWxpbmUgc3RyaW5ncyAoZS5nLiBtaXNlIHRhc2sgc2NyaXB0cykgaW4gdGhlIHJlc3Qgb2YgdGhlIGZpbGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZU1pc2VUb21sKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlTWlzZVRvbWwnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgbWlzZVRvbWxQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnbWlzZS50b21sJyk7XG4gICAgY29uc3QgY29udGVudCA9IHJlYWRNaXNlVG9tbChtaXNlVG9tbFBhdGgpO1xuICAgIC8vIEEgcGFyc2UgZmFpbHVyZSBtdXN0IGFib3J0OiBlZGl0aW5nIHBpbnMgaW4gYSBicm9rZW4gbWlzZS50b21sIHdvdWxkIGhpZGUgdGhlIGJyZWFrYWdlLlxuICAgIGNvbnN0IHRvb2xzID0gKEJ1bi5UT01MLnBhcnNlKGNvbnRlbnQpIGFzIE1pc2VUb21sKS50b29scyA/PyB7fTtcblxuICAgIGNvbnN0IHBpbnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgICAgLy8gRW5zdXJlIE5vZGUuanMgaXMgYWx3YXlzIHBpbm5lZDogZ2VuZXJhdGVkIGhvb2tzIGFuZCBDSSBydW4gYG1pc2UgaW5zdGFsbGAsIGFuZCBhbiB1bnBpbm5lZFxuICAgICAgLy8gTm9kZSB3b3VsZCBjb21lIGZyb20gd2hhdGV2ZXIgaGFwcGVucyB0byBiZSBvbiBQQVRILlxuICAgICAgLy8gTGlmdC10aGVuLXBpbjogdGhlIGxpZnQgb25seSB0b3VjaGVzIGV4YWN0IHBpbnMgYW5kIHRoZSBwaW4gb25seSB0b3VjaGVzIHNlbGVjdG9ycywgc29cbiAgICAgIC8vIG9yZGVyaW5nIHRoZSBsaWZ0IGZpcnN0IGF2b2lkcyByZXNvbHZpbmcgYG1pc2UgbGF0ZXN0IG5vZGVAbHRzYCB0d2ljZSBmb3IgdW5waW5uZWQgcmVwb3MuXG4gICAgICBub2RlOiBwaW5Db25jcmV0ZVRvb2xWZXJzaW9uKFxuICAgICAgICAnbm9kZScsXG4gICAgICAgIGxpZnRPdXRkYXRlZFRvb2xWZXJzaW9uV2l0aGluTWFqb3IoJ25vZGVAbHRzJywgdG9vbHMubm9kZSwgY29uZmlnLmRpclBhdGgpLFxuICAgICAgICBjb25maWcuZGlyUGF0aFxuICAgICAgKSxcbiAgICAgIGJ1bjogcGluTGF0ZXN0VG9vbFZlcnNpb24oJ2J1bicsIHRvb2xzLmJ1biwgY29uZmlnLmRpclBhdGgpLFxuICAgIH07XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnZm5veC50b21sJykpKSB7XG4gICAgICBwaW5zLmZub3ggPSBwaW5MYXRlc3RUb29sVmVyc2lvbignZm5veCcsIHRvb2xzLmZub3gsIGNvbmZpZy5kaXJQYXRoKTtcbiAgICB9XG5cbiAgICBsZXQgbmV3Q29udGVudCA9IGNvbnRlbnQ7XG4gICAgZm9yIChjb25zdCBbdG9vbCwgdmVyc2lvbl0gb2YgT2JqZWN0LmVudHJpZXMocGlucykpIHtcbiAgICAgIGlmICh2ZXJzaW9uID09PSB0b29sc1t0b29sXSkgY29udGludWU7XG4gICAgICBhc3NlcnQub2sodHlwZW9mIHZlcnNpb24gPT09ICdzdHJpbmcnLCBgVGhlIHJlc29sdmVkICR7dG9vbH0gcGluIG11c3QgYmUgYSB2ZXJzaW9uIHN0cmluZy5gKTtcbiAgICAgIG5ld0NvbnRlbnQgPSBzZXRUb29sVmVyc2lvbihuZXdDb250ZW50LCB0b29sLCB2ZXJzaW9uKTtcbiAgICAgIC8vIEEgbGluZSBlZGl0IGJyZWFrcyBwaW5zIHdyaXR0ZW4gaW4gYW55IG90aGVyIGZvcm0gKGEgbXVsdGktbGluZSB2YWx1ZSwgYSBgdG9vbHMuYnVuYFxuICAgICAgLy8gZG90dGVkIGtleSwgYSBgW3Rvb2xzLmJ1bl1gIHN1Yi10YWJsZSksIHNvIG5ldmVyIHdyaXRlIGEgcmVzdWx0IHRoZSBwYXJzZXIgZGlzYWdyZWVzIHdpdGguXG4gICAgICBhc3NlcnQub2soXG4gICAgICAgIHBhcnNlVG9vbHMobmV3Q29udGVudCk/Llt0b29sXSA9PT0gdmVyc2lvbixcbiAgICAgICAgYFdyaXRlIHRoZSAke3Rvb2x9IHBpbiBpbiBtaXNlLnRvbWwgYXMgb25lIFxcYCR7dG9vbH0gPSAuLi5cXGAgbGluZSB1bmRlciBbdG9vbHNdLmBcbiAgICAgICk7XG4gICAgfVxuICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUobWlzZVRvbWxQYXRoLCBuZXdDb250ZW50KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHNldFRvb2xWZXJzaW9uKGNvbnRlbnQ6IHN0cmluZywgdG9vbDogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBwaW4gPSBgJHt0b29sfSA9IFwiJHt2ZXJzaW9ufVwiYDtcbiAgY29uc3Qgc2VjdGlvbiA9IC9eXFxbdG9vbHNcXF0oPyFbXlxcbl0pKD86XFxuKD8hXFxbKS4qKSovbXUuZXhlYyhjb250ZW50KT8uWzBdO1xuICBpZiAoc2VjdGlvbiA9PT0gdW5kZWZpbmVkKSByZXR1cm4gYCR7Y29udGVudCAmJiBgJHtjb250ZW50LnRyaW1FbmQoKX1cXG5cXG5gfVt0b29sc11cXG4ke3Bpbn1cXG5gO1xuXG4gIGNvbnN0IHBpblBhdHRlcm4gPSBuZXcgUmVnRXhwKGBeJHt0b29sfSA9IC4qPyhcXFxccyojLiopPyRgLCAnbXUnKTtcbiAgLy8gQmxhbmsgbGluZXMgYW5kIGNvbW1lbnRzIHRoYXQgZW5kIHRoZSBzZWN0aW9uIGxlYWQgdGhlIG5leHQgdGFibGUsIHNvIGEgbmV3IHBpbiBnb2VzIGFib3ZlIHRoZW0uXG4gIGNvbnN0IHBpbnNFbmQgPSAvKD86XFxuW1xcdCBdKig/OiMuKik/KSokL3UuZXhlYyhzZWN0aW9uKT8uaW5kZXggPz8gc2VjdGlvbi5sZW5ndGg7XG4gIGNvbnN0IG5ld1NlY3Rpb24gPSBwaW5QYXR0ZXJuLnRlc3Qoc2VjdGlvbilcbiAgICA/IHNlY3Rpb24ucmVwbGFjZShwaW5QYXR0ZXJuLCBgJHtwaW59JDFgKVxuICAgIDogYCR7c2VjdGlvbi5zbGljZSgwLCBwaW5zRW5kKX1cXG4ke3Bpbn0ke3NlY3Rpb24uc2xpY2UocGluc0VuZCl9YDtcbiAgcmV0dXJuIGNvbnRlbnQucmVwbGFjZShzZWN0aW9uLCAoKSA9PiBuZXdTZWN0aW9uKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VUb29scyhjb250ZW50OiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIChCdW4uVE9NTC5wYXJzZShjb250ZW50KSBhcyBNaXNlVG9tbCkudG9vbHM7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqIFVwZGF0ZXMgdG8gdGhlIGxhdGVzdCByZWxlYXNlIGFjcm9zcyBtYWpvciB2ZXJzaW9ucyB3aXRob3V0IGRvd25ncmFkaW5nIGV4aXN0aW5nIGV4YWN0IHBpbnMuICovXG5mdW5jdGlvbiBwaW5MYXRlc3RUb29sVmVyc2lvbih0b29sOiBzdHJpbmcsIHZlcnNpb246IHVua25vd24sIGN3ZDogc3RyaW5nKTogdW5rbm93biB7XG4gIC8vIFJlc29sdmUgaW5kZXBlbmRlbnRseSBvZiB0aGUgdGFyZ2V0J3MgdHJ1c3Qgc3RhdGUgYW5kIHRvb2wgYWxpYXNlcy5cbiAgY29uc3QgcmVzb2x2ZWRWZXJzaW9uID0gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KCdtaXNlJywgWyctLW5vLWNvbmZpZycsICdsYXRlc3QnLCB0b29sXSwgY3dkKTtcbiAgaWYgKCFzZW12ZXIudmFsaWQocmVzb2x2ZWRWZXJzaW9uKSkgcmV0dXJuIHZlcnNpb24gPz8gJ2xhdGVzdCc7XG4gIC8vIEEgY2FjaGVkIHJlbGVhc2UgbGlzdGluZyBjYW4gbGFnIGJlaGluZCBhbm90aGVyIG1hY2hpbmUgdGhhdCBhbHJlYWR5IHVwZGF0ZWQgdGhlIHBpbi5cbiAgcmV0dXJuIHR5cGVvZiB2ZXJzaW9uID09PSAnc3RyaW5nJyAmJiBzZW12ZXIudmFsaWQodmVyc2lvbikgJiYgc2VtdmVyLmd0KHZlcnNpb24sIHJlc29sdmVkVmVyc2lvbilcbiAgICA/IHZlcnNpb25cbiAgICA6IHJlc29sdmVkVmVyc2lvbjtcbn1cblxuLyoqXG4gKiBMaWZ0cyBhbiBleGFjdCB0b29sIHBpbiBiZWxvdyB0aGUgbGF0ZXN0IHJlc29sdmFibGUgdmVyc2lvbiDigJQgd2l0aGluIHRoZSBTQU1FIG1ham9yIOKAlCB0byB0aGF0XG4gKiB2ZXJzaW9uIChOb2RlLmpzIHJlc29sdmVzIGFnYWluc3QgdGhlIGxhdGVzdCBMVFMpOiB0aGUgcmVwb3NpdG9yeS1zdHJ1Y3R1cmUgc3RhbmRhcmQgdHJhY2tzIHRoZVxuICogY3VycmVudCB0b29sY2hhaW4gYWNyb3NzIHJlcG9zaXRvcmllcyBhbmQgUmVub3ZhdGUgZG9lcyBub3QgbWFuYWdlIG1pc2UudG9tbCBwaW5zLCBzb1xuICogcGF0Y2gvbWlub3IgZHJpZnQgKGUuZy4gbm9kZSAyNC4xNi4wIHZzIDI0LjE4LjApIG5ldmVyIHNlbGYtaGVhbHMuIEEgcGluXG4gKiBvbiBhbiBvbGRlciBtYWpvciBpcyBhIGRlbGliZXJhdGUgY29tcGF0aWJpbGl0eSBjaG9pY2UgYW5kIGlzIGtlcHQsIGFzIGFyZSBub24tZXhhY3QgYW5kXG4gKiBub24tc3RyaW5nIGZvcm1zLiBXaGVuIG1pc2UgY2Fubm90IHJlc29sdmUgdGhlIHNlbGVjdG9yIChlLmcuIG9mZmxpbmUpLCB0aGUgcGluIGlzIGtlcHQuXG4gKi9cbmZ1bmN0aW9uIGxpZnRPdXRkYXRlZFRvb2xWZXJzaW9uV2l0aGluTWFqb3Ioc2VsZWN0b3I6IHN0cmluZywgdmVyc2lvbjogdW5rbm93biwgY3dkOiBzdHJpbmcpOiB1bmtub3duIHtcbiAgaWYgKHR5cGVvZiB2ZXJzaW9uICE9PSAnc3RyaW5nJyB8fCAhc2VtdmVyLnZhbGlkKHZlcnNpb24pKSByZXR1cm4gdmVyc2lvbjtcbiAgY29uc3QgbGF0ZXN0VmVyc2lvbiA9IHNwYXduU3luY0FuZFJldHVyblN0ZG91dCgnbWlzZScsIFsnbGF0ZXN0Jywgc2VsZWN0b3JdLCBjd2QpO1xuICByZXR1cm4gc2VtdmVyLnZhbGlkKGxhdGVzdFZlcnNpb24pICYmXG4gICAgc2VtdmVyLm1ham9yKGxhdGVzdFZlcnNpb24pID09PSBzZW12ZXIubWFqb3IodmVyc2lvbikgJiZcbiAgICBzZW12ZXIubHQodmVyc2lvbiwgbGF0ZXN0VmVyc2lvbilcbiAgICA/IGxhdGVzdFZlcnNpb25cbiAgICA6IHZlcnNpb247XG59XG5cbi8qKlxuICogUmVwbGFjZXMgYW4gdW5waW5uZWQgc2VsZWN0b3IgKGBsYXRlc3RgLCBhIHJhbmdlIHN1Y2ggYXMgXCIyNFwiLCBhbiBhbGlhcywgb3IgYSBtaXNzaW5nIGVudHJ5KVxuICogd2l0aCB0aGUgbmV3ZXN0IGNvbmNyZXRlIHZlcnNpb24gbWlzZSByZXNvbHZlcyBmb3IgaXQsIGJlY2F1c2UgdGhlIHJlcG9zaXRvcnktc3RydWN0dXJlXG4gKiBzdGFuZGFyZCByZXF1aXJlcyBjb25jcmV0ZSBwaW5zOiBDSSBpbnN0YWxscyB3aGF0ZXZlciBhbiB1bnBpbm5lZCBzZWxlY3RvciByZXNvbHZlcyB0byBhdCBydW5cbiAqIHRpbWUsIHNvIGJ1aWxkcyBkcmlmdCBhY3Jvc3MgcnVucy4gRXhhY3QgdmVyc2lvbnMgYXJlIGtlcHQgYXMtaXMsIGFuZCBub24tc3RyaW5nIGZvcm1zIChtaXNlJ3NcbiAqIGFycmF5IGFuZCBgeyB2ZXJzaW9uID0gXCLigKZcIiB9YCBmb3JtcykgYXJlIHVzZXItbWFuYWdlZCBhbmQgbGVmdCB1bnRvdWNoZWQuIFdoZW4gbWlzZSBpc1xuICogdW5hdmFpbGFibGUgb3IgY2Fubm90IHJlc29sdmUgdGhlIHNlbGVjdG9yIChlLmcuIG9mZmxpbmUpLCB0aGUgb3JpZ2luYWwgc2VsZWN0b3IgaXMga2VwdCDigJRcbiAqIGFuIHVucGlubmVkIHRvb2wgaXMgYmV0dGVyIHRoYW4gYSBicm9rZW4gY29uZmlndXJhdGlvbi5cbiAqL1xuZnVuY3Rpb24gcGluQ29uY3JldGVUb29sVmVyc2lvbih0b29sOiBzdHJpbmcsIHZlcnNpb246IHVua25vd24sIGN3ZDogc3RyaW5nKTogdW5rbm93biB7XG4gIGlmICh2ZXJzaW9uICE9PSB1bmRlZmluZWQgJiYgKHR5cGVvZiB2ZXJzaW9uICE9PSAnc3RyaW5nJyB8fCBzZW12ZXIudmFsaWQodmVyc2lvbikpKSByZXR1cm4gdmVyc2lvbjtcbiAgLy8gTm9ybWFsaXplIHNlbGVjdG9yIGZvcm1zIGBtaXNlIGxhdGVzdGAgY2Fubm90IHJlc29sdmUgZXZlbiB0aG91Z2ggbWlzZSBjb25maWd1cmF0aW9uIGFjY2VwdHNcbiAgLy8gdGhlbTogYHByZWZpeDoyNGAgaXMgcmVqZWN0ZWQgb3V0cmlnaHQgd2hpbGUgYDI0YCByZXNvbHZlcywgYW5kIGBsdHMvKmAgeWllbGRzIGVtcHR5IG91dHB1dFxuICAvLyB3aGlsZSBgbHRzYCByZXNvbHZlcy4gTW9kaWZpZXIgc2VsZWN0b3JzIHN1Y2ggYXMgYHN1Yi0yOmx0c2Agc3RheSB1bnJlc29sdmFibGUgYW5kIGZhbGwgYmFja1xuICAvLyB0byB0aGUgb3JpZ2luYWwgc2VsZWN0b3IgYmVsb3cuXG4gIGNvbnN0IHJhbmdlID0gdHlwZW9mIHZlcnNpb24gPT09ICdzdHJpbmcnID8gdmVyc2lvbi5yZXBsYWNlKC9ecHJlZml4Oi91LCAnJykucmVwbGFjZSgvXFwvXFwqJC91LCAnJykgOiB1bmRlZmluZWQ7XG4gIC8vIFdpdGggbm8gbWVhbmluZ2Z1bCBzZWxlY3RvciwgTm9kZS5qcyBwaW5zIHRvIHRoZSBsYXRlc3QgTFRTIChtYXRjaGluZyB0aGUgcmV1c2FibGUgd29ya2Zsb3dzJ1xuICAvLyBgbHRzLypgIGZhbGxiYWNrKSByYXRoZXIgdGhhbiB0aGUgbmV3ZXN0IHJlbGVhc2UuXG4gIGNvbnN0IGRlZmF1bHRTZWxlY3RvciA9IHRvb2wgPT09ICdub2RlJyA/ICdub2RlQGx0cycgOiB0b29sO1xuICBjb25zdCBzZWxlY3RvciA9IHJhbmdlICYmIHJhbmdlICE9PSAnbGF0ZXN0JyA/IGAke3Rvb2x9QCR7cmFuZ2V9YCA6IGRlZmF1bHRTZWxlY3RvcjtcbiAgY29uc3QgcmVzb2x2ZWRWZXJzaW9uID0gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KCdtaXNlJywgWydsYXRlc3QnLCBzZWxlY3Rvcl0sIGN3ZCk7XG4gIHJldHVybiBzZW12ZXIudmFsaWQocmVzb2x2ZWRWZXJzaW9uKSA/IHJlc29sdmVkVmVyc2lvbiA6ICh2ZXJzaW9uID8/ICdsYXRlc3QnKTtcbn1cblxuZnVuY3Rpb24gcmVhZE1pc2VUb21sKG1pc2VUb21sUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZnMucmVhZEZpbGVTeW5jKG1pc2VUb21sUGF0aCwgJ3V0ZjgnKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyBPbmx5IGEgcmVwb3NpdG9yeSB3aXRob3V0IG1pc2UudG9tbCBzdGFydHMgZnJvbSBhbiBlbXB0eSBjb25maWd1cmF0aW9uOyBhbiB1bnJlYWRhYmxlIGZpbGVcbiAgICAvLyAoZS5nLiBwZXJtaXNzaW9ucykgbXVzdCBhYm9ydCBpbnN0ZWFkIG9mIGJlaW5nIG92ZXJ3cml0dGVuIHdpdGggZ2VuZXJhdGVkIHNldHRpbmdzLlxuICAgIGlmICgoZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlID09PSAnRU5PRU5UJykgcmV0dXJuICcnO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcml2YXRlUmVnaXN0cnlTY29wZU1hcHBpbmcsIHJlcG9SZXNvbHZlc1ByaXZhdGVQYWNrYWdlcyB9IGZyb20gJy4uL3V0aWxzL3ByaXZhdGVQYWNrYWdlcy5qcyc7XG5cbi8qKlxuICogQnVuIHJlYWRzIHJlZ2lzdHJ5IHNjb3BlIG1hcHBpbmdzIGZyb20gYSBwaHlzaWNhbCByZXBvc2l0b3J5IC5ucG1yYyBkdXJpbmcgUmVub3ZhdGUgYXJ0aWZhY3RcbiAqIHVwZGF0ZXM7IFJlbm92YXRlJ3MgbnBtcmMgc2V0dGluZyBpcyB1c2VkIG9ubHkgYnkgaXRzIGRhdGFzb3VyY2UgbGF5ZXIuIEtlZXAgdGhlIG5vbi1zZWNyZXRcbiAqIG1hcHBpbmcgaW4gcmVwb3NpdG9yaWVzIHRoYXQgcmVzb2x2ZSBwcml2YXRlIHBhY2thZ2VzLCB3aGlsZSBhdXRoZW50aWNhdGlvbiByZW1haW5zIGluIHRoZVxuICogZGV2ZWxvcGVyJ3Mgfi8ubnBtcmMgbG9jYWxseSBhbmQgaW4gdGVtcG9yYXJ5IENJIG9yIE1lbmQgY29uZmlndXJhdGlvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUmVwb3NpdG9yeU5wbXJjKGNvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByZXBvQXV0aG9yID0gY29uZmlnc1swXT8ucmVwb0F1dGhvcjtcbiAgaWYgKHJlcG9BdXRob3IgIT09ICdXaWxsQm9vc3RlcicgJiYgcmVwb0F1dGhvciAhPT0gJ1dpbGxCb29zdGVyTGFiJykgcmV0dXJuO1xuXG4gIGNvbnN0IG5wbXJjUGF0aHMgPSBuZXcgU2V0KGNvbmZpZ3MubWFwKChjb25maWcpID0+IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5ucG1yYycpKSk7XG4gIGNvbnN0IHJvb3RDb25maWcgPSBjb25maWdzLmZpbmQoKGNvbmZpZykgPT4gY29uZmlnLmlzUm9vdCk7XG4gIGlmIChyb290Q29uZmlnICYmIHJlcG9SZXNvbHZlc1ByaXZhdGVQYWNrYWdlcyhyb290Q29uZmlnKSkge1xuICAgIGNvbnN0IHJvb3ROcG1yY1BhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLm5wbXJjJyk7XG4gICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShyb290TnBtcmNQYXRoLCBwcml2YXRlUmVnaXN0cnlTY29wZU1hcHBpbmcpO1xuICAgIG5wbXJjUGF0aHMuZGVsZXRlKHJvb3ROcG1yY1BhdGgpO1xuICB9XG5cbiAgZm9yIChjb25zdCBucG1yY1BhdGggb2YgbnBtcmNQYXRocykgYXdhaXQgcmVtb3ZlTnBtcmMobnBtcmNQYXRoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlTnBtcmMobnBtcmNQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCEoYXdhaXQgZnMucHJvbWlzZXMubHN0YXQobnBtcmNQYXRoKS5jYXRjaCgoKSA9PiB7fSkpKSByZXR1cm47XG4gIGlmIChhd2FpdCBmc1V0aWwucmVtb3ZlQ29uZmluZWQobnBtcmNQYXRoKSkge1xuICAgIGNvbnNvbGUuaW5mbyhgUmVtb3ZlZCBub24tY2Fub25pY2FsIHJlcG9zaXRvcnkgbnBtcmMgJHtucG1yY1BhdGh9LmApO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IE9jdG9raXQgfSBmcm9tICdAb2N0b2tpdC9jb3JlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2V0T2N0b2tpdCwgaGFzR2l0SHViVG9rZW4gfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwTGFiZWxzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ3NldHVwTGFiZWxzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgcmVwb0F1dGhvcjogb3duZXIsIHJlcG9OYW1lOiByZXBvIH0gPSBjb25maWc7XG4gICAgaWYgKCFvd25lciB8fCAhcmVwbykgcmV0dXJuO1xuICAgIGlmIChvd25lciAhPT0gJ1dpbGxCb29zdGVyJyAmJiBvd25lciAhPT0gJ1dpbGxCb29zdGVyTGFiJykgcmV0dXJuO1xuICAgIGlmICghaGFzR2l0SHViVG9rZW4ob3duZXIpKSByZXR1cm47XG5cbiAgICBjb25zdCBvY3Rva2l0ID0gZ2V0T2N0b2tpdChvd25lcik7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2QxOiB4LWVhc3kgOmhlZGdlaG9nOicsICdFREU5RkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkMjogZWFzeSA6cmFiYml0MjonLCAnRERENkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDM6IG1lZGl1bSA6b3g6JywgJ0M0QjVGRCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2Q0OiBoYXJkIDpzcXVpZDonLCAnQTc4QkZBJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDU6IHgtaGFyZCA6d2hhbGUyOicsICc4QjVDRjYnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdwMTogY3JpdGljYWwgOmZpcmU6OmZpcmU6OmZpcmU6JywgJ0VGNDQ0NCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3AyOiB1cmdlbnQgOmZpcmU6OmZpcmU6JywgJ0Y4NzE3MScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3AzOiBpbXBvcnRhbnQgOmZpcmU6JywgJ0ZDQTVBNScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3A0OiBuaWNlIHRvIGhhdmUgOmRyb3BsZXQ6JywgJ0ZFQ0FDQScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IGJsaXR6JywgJzUzMDBiYycpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IGZpcmViYXNlJywgJ2ZmY2EyOCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IHByaXNtYScsICcwYzM0NGInKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiByZWFjdCcsICc2MWRhZmInKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiBzZW1hbnRpYy1yZWxlYXNlJywgJzQ5NDk0OScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JlYWR5IDpyb2NrZXQ6JywgJzIyQzU1RScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JldmlldyByZXF1ZXN0ZWQgOm1hZzonLCAnRkJDQTA0Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmVsZWFzZWQgOmJvb2ttYXJrOicsICc2MzY2RjEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiAwLjVoIDpjbG9jazEyMzA6JywgJ0YzRjRGNicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDFoIDpjbG9jazE6JywgJ0U1RTdFQicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDJoIDpjbG9jazI6JywgJ0QxRDVEQicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDNoIDpjbG9jazM6JywgJzlDQTNBRicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDVoIDpjbG9jazU6JywgJzZCNzI4MCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDhoIDpjbG9jazg6JywgJzRCNTU2MycpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDEzaCA6Y2xvY2sxOicsICczNzQxNTEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBidWlsZCA6aGFtbWVyOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBjaG9yZSA6YnJvb206JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGNpIDpjb25zdHJ1Y3Rpb25fd29ya2VyOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBkb2NzIDptZW1vOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBmZWF0IDpzcGFya2xlczonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogZml4IDpidWc6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IHBlcmYgOnphcDonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogcmVmYWN0b3IgOnJlY3ljbGU6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IHN0eWxlIDpsaXBzdGljazonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogdGVzdCA6dGVzdF90dWJlOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdwcm9qZWN0JywgJzI0MjkyRicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2ZvY3VzZWQgOmRhcnQ6JywgJzIyQzU1RScpO1xuXG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2J1ZycpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkb2N1bWVudGF0aW9uJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2R1cGxpY2F0ZScpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdlbmhhbmNlbWVudCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdnb29kIGZpcnN0IGlzc3VlJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2hlbHAgd2FudGVkJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2ludmFsaWQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncXVlc3Rpb24nKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnd29udGZpeCcpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1NraXAgc2V0dXBMYWJlbHMgZHVlIHRvOicsIChlcnJvciBhcyBFcnJvciB8IHVuZGVmaW5lZCk/LnN0YWNrID8/IGVycm9yKTtcbiAgICB9XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzZXR1cExhYmVsKG9jdG9raXQ6IE9jdG9raXQsIG93bmVyOiBzdHJpbmcsIHJlcG86IHN0cmluZywgbmFtZTogc3RyaW5nLCBjb2xvcjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHMnLCB7XG4gICAgICBvd25lcixcbiAgICAgIHJlcG8sXG4gICAgICBuYW1lLFxuICAgICAgY29sb3IsXG4gICAgfSk7XG4gIH0gY2F0Y2gge1xuICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVscy97bmFtZX0nLCB7XG4gICAgICBvd25lcixcbiAgICAgIHJlcG8sXG4gICAgICBuYW1lLFxuICAgICAgY29sb3IsXG4gICAgfSk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZGVsZXRlTGFiZWwob2N0b2tpdDogT2N0b2tpdCwgb3duZXI6IHN0cmluZywgcmVwbzogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ0RFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vbGFiZWxzL3tuYW1lfScsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIG5hbWUsXG4gICAgfSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBPY3Rva2l0IH0gZnJvbSAnQG9jdG9raXQvY29yZSc7XG5pbXBvcnQgeyB3aXRoUmV0cnkgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi9zcmMnO1xuXG5pbXBvcnQgeyBpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyB9IGZyb20gJy4uL2dlbmVyYXRvcnMvd29ya2Zsb3cuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2V0T2N0b2tpdCwgaGFzR2l0SHViVG9rZW4sIGlzR2l0SHViUGVybWlzc2lvbk9yVmlzaWJpbGl0eUVycm9yIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmludGVyZmFjZSBSZXBvc2l0b3J5UnVsZXNldFBheWxvYWQge1xuICBuYW1lOiBzdHJpbmc7XG4gIHRhcmdldDogJ2JyYW5jaCc7XG4gIGVuZm9yY2VtZW50OiAnYWN0aXZlJztcbiAgY29uZGl0aW9uczoge1xuICAgIHJlZl9uYW1lOiB7XG4gICAgICBpbmNsdWRlOiBzdHJpbmdbXTtcbiAgICAgIGV4Y2x1ZGU6IHN0cmluZ1tdO1xuICAgIH07XG4gIH07XG4gIHJ1bGVzOiAoXG4gICAgfCB7XG4gICAgICAgIHR5cGU6ICdkZWxldGlvbicgfCAnbm9uX2Zhc3RfZm9yd2FyZCc7XG4gICAgICB9XG4gICAgfCB7XG4gICAgICAgIHR5cGU6ICdyZXF1aXJlZF9zdGF0dXNfY2hlY2tzJztcbiAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgIHN0cmljdF9yZXF1aXJlZF9zdGF0dXNfY2hlY2tzX3BvbGljeTogYm9vbGVhbjtcbiAgICAgICAgICBkb19ub3RfZW5mb3JjZV9vbl9jcmVhdGU6IGJvb2xlYW47XG4gICAgICAgICAgcmVxdWlyZWRfc3RhdHVzX2NoZWNrczoge1xuICAgICAgICAgICAgY29udGV4dDogc3RyaW5nO1xuICAgICAgICAgICAgaW50ZWdyYXRpb25faWQ6IG51bWJlcjtcbiAgICAgICAgICB9W107XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfCB7XG4gICAgICAgIHR5cGU6ICdwdWxsX3JlcXVlc3QnO1xuICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgcmVxdWlyZWRfYXBwcm92aW5nX3Jldmlld19jb3VudDogbnVtYmVyO1xuICAgICAgICAgIGRpc21pc3Nfc3RhbGVfcmV2aWV3c19vbl9wdXNoOiBib29sZWFuO1xuICAgICAgICAgIHJlcXVpcmVkX3Jldmlld2VyczogW107XG4gICAgICAgICAgcmVxdWlyZV9jb2RlX293bmVyX3JldmlldzogYm9vbGVhbjtcbiAgICAgICAgICByZXF1aXJlX2xhc3RfcHVzaF9hcHByb3ZhbDogYm9vbGVhbjtcbiAgICAgICAgICByZXF1aXJlZF9yZXZpZXdfdGhyZWFkX3Jlc29sdXRpb246IGJvb2xlYW47XG4gICAgICAgICAgYWxsb3dlZF9tZXJnZV9tZXRob2RzOiBbJ3NxdWFzaCddO1xuICAgICAgICB9O1xuICAgICAgfVxuICApW107XG4gIGJ5cGFzc19hY3RvcnM6IHtcbiAgICBhY3Rvcl9pZDogbnVtYmVyO1xuICAgIGFjdG9yX3R5cGU6ICdUZWFtJztcbiAgICBieXBhc3NfbW9kZTogJ3B1bGxfcmVxdWVzdCc7XG4gIH1bXTtcbn1cblxuaW50ZXJmYWNlIFJlcG9zaXRvcnlSdWxlc2V0U3VtbWFyeSB7XG4gIGlkPzogbnVtYmVyO1xuICBuYW1lPzogc3RyaW5nO1xuICBzb3VyY2VfdHlwZT86IHN0cmluZztcbn1cblxuY29uc3QgR0lUSFVCX0FQSV9WRVJTSU9OX0hFQURFUiA9IHtcbiAgJ1gtR2l0SHViLUFwaS1WZXJzaW9uJzogJzIwMjItMTEtMjgnLFxufSBhcyBjb25zdDtcblxuY29uc3QgR0lUSFVCX0FDVElPTlNfSU5URUdSQVRJT05fSUQgPSAxNV8zNjg7XG5cbmNvbnN0IFBST1RFQ1RfTUFJTl9SVUxFU0VUOiBSZXBvc2l0b3J5UnVsZXNldFBheWxvYWQgPSB7XG4gIG5hbWU6ICdQcm90ZWN0IG1haW4nLFxuICB0YXJnZXQ6ICdicmFuY2gnLFxuICBlbmZvcmNlbWVudDogJ2FjdGl2ZScsXG4gIGNvbmRpdGlvbnM6IHtcbiAgICByZWZfbmFtZToge1xuICAgICAgZXhjbHVkZTogW10sXG4gICAgICBpbmNsdWRlOiBbJ35ERUZBVUxUX0JSQU5DSCddLFxuICAgIH0sXG4gIH0sXG4gIHJ1bGVzOiBbXG4gICAge1xuICAgICAgdHlwZTogJ2RlbGV0aW9uJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIHR5cGU6ICdyZXF1aXJlZF9zdGF0dXNfY2hlY2tzJyxcbiAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgc3RyaWN0X3JlcXVpcmVkX3N0YXR1c19jaGVja3NfcG9saWN5OiBmYWxzZSxcbiAgICAgICAgZG9fbm90X2VuZm9yY2Vfb25fY3JlYXRlOiB0cnVlLFxuICAgICAgICByZXF1aXJlZF9zdGF0dXNfY2hlY2tzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgY29udGV4dDogJ3Rlc3QgLyB0ZXN0JyxcbiAgICAgICAgICAgIGludGVncmF0aW9uX2lkOiBHSVRIVUJfQUNUSU9OU19JTlRFR1JBVElPTl9JRCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbnRleHQ6ICdzZW1hbnRpYy1wciAvIHNlbWFudGljLXByJyxcbiAgICAgICAgICAgIGludGVncmF0aW9uX2lkOiBHSVRIVUJfQUNUSU9OU19JTlRFR1JBVElPTl9JRCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHR5cGU6ICdub25fZmFzdF9mb3J3YXJkJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIHR5cGU6ICdwdWxsX3JlcXVlc3QnLFxuICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICByZXF1aXJlZF9hcHByb3ZpbmdfcmV2aWV3X2NvdW50OiAwLFxuICAgICAgICBkaXNtaXNzX3N0YWxlX3Jldmlld3Nfb25fcHVzaDogZmFsc2UsXG4gICAgICAgIHJlcXVpcmVkX3Jldmlld2VyczogW10sXG4gICAgICAgIHJlcXVpcmVfY29kZV9vd25lcl9yZXZpZXc6IGZhbHNlLFxuICAgICAgICByZXF1aXJlX2xhc3RfcHVzaF9hcHByb3ZhbDogZmFsc2UsXG4gICAgICAgIHJlcXVpcmVkX3Jldmlld190aHJlYWRfcmVzb2x1dGlvbjogZmFsc2UsXG4gICAgICAgIGFsbG93ZWRfbWVyZ2VfbWV0aG9kczogWydzcXVhc2gnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgXSxcbiAgYnlwYXNzX2FjdG9yczogW1xuICAgIHtcbiAgICAgIGFjdG9yX2lkOiAxN183NzdfNDk1LFxuICAgICAgYWN0b3JfdHlwZTogJ1RlYW0nLFxuICAgICAgYnlwYXNzX21vZGU6ICdwdWxsX3JlcXVlc3QnLFxuICAgIH0sXG4gIF0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0dXBSZXBvc2l0b3J5UnVsZXNldHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignc2V0dXBSZXBvc2l0b3J5UnVsZXNldHMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeyByZXBvQXV0aG9yOiBvd25lciwgcmVwb05hbWU6IHJlcG8gfSA9IGNvbmZpZztcbiAgICBpZiAoIW93bmVyIHx8ICFyZXBvKSByZXR1cm47XG4gICAgaWYgKG93bmVyICE9PSAnV2lsbEJvb3N0ZXInKSByZXR1cm47XG4gICAgLy8gVGhlIHJldXNhYmxlLXdvcmtmbG93cyByZXBvIGhvc3RzIHdvcmtmbG93X2NhbGwgZGVmaW5pdGlvbnMsIHNvIHRoZVxuICAgIC8vIFByb3RlY3QgbWFpbiBydWxlc2V0IHdvdWxkIHJlcXVpcmUgdGVzdC9zZW1hbnRpYy1wciBjaGVja3MgdGhhdCBuZXZlciBydW4gdGhlcmUuXG4gICAgaWYgKGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKGNvbmZpZy5yZXBvc2l0b3J5KSkgcmV0dXJuO1xuICAgIGlmICghaGFzR2l0SHViVG9rZW4ob3duZXIpKSByZXR1cm47XG5cbiAgICBjb25zdCBvY3Rva2l0ID0gZ2V0T2N0b2tpdChvd25lcik7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdXBzZXJ0UHJvdGVjdE1haW5SdWxlc2V0KG9jdG9raXQsIG93bmVyLCByZXBvLCBidWlsZFByb3RlY3RNYWluUnVsZXNldChjb25maWcpKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKCFpc0dpdEh1YlBlcm1pc3Npb25PclZpc2liaWxpdHlFcnJvcihlcnJvcikpIHRocm93IGVycm9yO1xuXG4gICAgICAvLyBSZXBvc2l0b3J5IHJ1bGVzZXRzIHJlcXVpcmUgYWRtaW5pc3RyYXRpb24gcGVybWlzc2lvbiwgd2hpY2ggbG9jYWwgcnVuc1xuICAgICAgLy8gbWF5IG5vdCBoYXZlIGV2ZW4gd2hlbiBmaWxlLWdlbmVyYXRpb24gYW5kIHB1c2hlcyBhcmUgYWxsb3dlZC5cbiAgICAgIGNvbnNvbGUud2FybignU2tpcCBzZXR1cFJlcG9zaXRvcnlSdWxlc2V0cyBkdWUgdG86JywgKGVycm9yIGFzIEVycm9yIHwgdW5kZWZpbmVkKT8uc3RhY2sgPz8gZXJyb3IpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUHJvdGVjdE1haW5SdWxlc2V0KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFJlcG9zaXRvcnlSdWxlc2V0UGF5bG9hZCB7XG4gIGNvbnN0IHJ1bGVzZXQgPSBzdHJ1Y3R1cmVkQ2xvbmUoUFJPVEVDVF9NQUlOX1JVTEVTRVQpO1xuICBpZiAoY29uZmlnLmNhcmdvVG9tbERpclBhdGhzLmxlbmd0aCA+IDApIHtcbiAgICBmb3IgKGNvbnN0IHJ1bGUgb2YgcnVsZXNldC5ydWxlcykge1xuICAgICAgaWYgKHJ1bGUudHlwZSAhPT0gJ3JlcXVpcmVkX3N0YXR1c19jaGVja3MnKSBjb250aW51ZTtcbiAgICAgIC8vIFRoZSBjb250ZXh0IGlzIGA8Y2FsbGVyIGpvYiBpZD4gLyA8cmV1c2FibGUgam9iIGlkPmAgb2YgdGhlIHdiZnktZ2VuZXJhdGVkIHRlc3QtcnVzdC55bWwuXG4gICAgICBydWxlLnBhcmFtZXRlcnMucmVxdWlyZWRfc3RhdHVzX2NoZWNrcy5wdXNoKHtcbiAgICAgICAgY29udGV4dDogJ3Rlc3QtcnVzdCAvIHRlc3QtcnVzdCcsXG4gICAgICAgIGludGVncmF0aW9uX2lkOiBHSVRIVUJfQUNUSU9OU19JTlRFR1JBVElPTl9JRCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcnVsZXNldDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdXBzZXJ0UHJvdGVjdE1haW5SdWxlc2V0KFxuICBvY3Rva2l0OiBPY3Rva2l0LFxuICBvd25lcjogc3RyaW5nLFxuICByZXBvOiBzdHJpbmcsXG4gIHJ1bGVzZXQ6IFJlcG9zaXRvcnlSdWxlc2V0UGF5bG9hZFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGV4aXN0aW5nUnVsZXNldCA9IGF3YWl0IGZpbmRSZXBvc2l0b3J5UnVsZXNldChvY3Rva2l0LCBvd25lciwgcmVwbywgcnVsZXNldC5uYW1lKTtcbiAgY29uc3QgZXhpc3RpbmdSdWxlc2V0SWQgPSBleGlzdGluZ1J1bGVzZXQ/LmlkO1xuXG4gIGF3YWl0IHdpdGhSZXRyeShcbiAgICBhc3luYyAoKSA9PiB7XG4gICAgICBpZiAoZXhpc3RpbmdSdWxlc2V0SWQpIHtcbiAgICAgICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3J1bGVzZXRzL3tydWxlc2V0X2lkfScsIHtcbiAgICAgICAgICBvd25lcixcbiAgICAgICAgICByZXBvLFxuICAgICAgICAgIHJ1bGVzZXRfaWQ6IGV4aXN0aW5nUnVsZXNldElkLFxuICAgICAgICAgIC4uLnJ1bGVzZXQsXG4gICAgICAgICAgaGVhZGVyczogR0lUSFVCX0FQSV9WRVJTSU9OX0hFQURFUixcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ydWxlc2V0cycsIHtcbiAgICAgICAgb3duZXIsXG4gICAgICAgIHJlcG8sXG4gICAgICAgIC4uLnJ1bGVzZXQsXG4gICAgICAgIGhlYWRlcnM6IEdJVEhVQl9BUElfVkVSU0lPTl9IRUFERVIsXG4gICAgICB9KTtcbiAgICB9LFxuICAgIHtcbiAgICAgIHNob3VsZFJldHJ5OiAoZXJyb3IpID0+ICFpc0dpdEh1YlBlcm1pc3Npb25PclZpc2liaWxpdHlFcnJvcihlcnJvciksXG4gICAgfVxuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmaW5kUmVwb3NpdG9yeVJ1bGVzZXQoXG4gIG9jdG9raXQ6IE9jdG9raXQsXG4gIG93bmVyOiBzdHJpbmcsXG4gIHJlcG86IHN0cmluZyxcbiAgcnVsZXNldE5hbWU6IHN0cmluZ1xuKTogUHJvbWlzZTxSZXBvc2l0b3J5UnVsZXNldFN1bW1hcnkgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB3aXRoUmV0cnkoXG4gICAgKCkgPT5cbiAgICAgIG9jdG9raXQucmVxdWVzdCgnR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ydWxlc2V0cycsIHtcbiAgICAgICAgb3duZXIsXG4gICAgICAgIHJlcG8sXG4gICAgICAgIGluY2x1ZGVzX3BhcmVudHM6IGZhbHNlLFxuICAgICAgICB0YXJnZXRzOiAnYnJhbmNoJyxcbiAgICAgICAgaGVhZGVyczogR0lUSFVCX0FQSV9WRVJTSU9OX0hFQURFUixcbiAgICAgIH0pLFxuICAgIHtcbiAgICAgIHNob3VsZFJldHJ5OiAoZXJyb3IpID0+ICFpc0dpdEh1YlBlcm1pc3Npb25PclZpc2liaWxpdHlFcnJvcihlcnJvciksXG4gICAgfVxuICApO1xuICBjb25zdCBydWxlc2V0cyA9IHJlc3BvbnNlLmRhdGE7XG4gIGlmICghQXJyYXkuaXNBcnJheShydWxlc2V0cykpIHJldHVybjtcbiAgcmV0dXJuIHJ1bGVzZXRzLmZpbmQoKHJ1bGVzZXQpID0+IHJ1bGVzZXQubmFtZSA9PT0gcnVsZXNldE5hbWUgJiYgcnVsZXNldC5zb3VyY2VfdHlwZSA9PT0gJ1JlcG9zaXRvcnknKTtcbn1cbiIsImltcG9ydCB7IHdpdGhSZXRyeSB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliL3NyYyc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdldE9jdG9raXQsIGhhc0dpdEh1YlRva2VuLCBpc0dpdEh1YlBlcm1pc3Npb25PclZpc2liaWxpdHlFcnJvciB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0dXBHaXRIdWJTZXR0aW5ncyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdzZXR1cEdpdEh1YlNldHRpbmdzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgcmVwb0F1dGhvcjogb3duZXIsIHJlcG9OYW1lOiByZXBvIH0gPSBjb25maWc7XG4gICAgaWYgKCFvd25lciB8fCAhcmVwbykgcmV0dXJuO1xuICAgIGlmIChvd25lciAhPT0gJ1dpbGxCb29zdGVyJyAmJiBvd25lciAhPT0gJ1dpbGxCb29zdGVyTGFiJykgcmV0dXJuO1xuICAgIGlmICghaGFzR2l0SHViVG9rZW4ob3duZXIpKSByZXR1cm47XG5cbiAgICBjb25zdCBvY3Rva2l0ID0gZ2V0T2N0b2tpdChvd25lcik7XG5cbiAgICB0cnkge1xuICAgICAgLy8gUmVwb3NpdG9yeSBzZXR0aW5ncyBuZWVkIGFkbWluaXN0cmF0aW9uIHBlcm1pc3Npb24sIHVubGlrZSBmaWxlIGdlbmVyYXRpb24uXG4gICAgICBhd2FpdCB3aXRoUmV0cnkoXG4gICAgICAgICgpID0+XG4gICAgICAgICAgb2N0b2tpdC5yZXF1ZXN0KCdQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30nLCB7XG4gICAgICAgICAgICBvd25lcixcbiAgICAgICAgICAgIHJlcG8sXG4gICAgICAgICAgICBhbGxvd19hdXRvX21lcmdlOiB0cnVlLFxuICAgICAgICAgICAgYWxsb3dfbWVyZ2VfY29tbWl0OiBmYWxzZSxcbiAgICAgICAgICAgIGFsbG93X3NxdWFzaF9tZXJnZTogdHJ1ZSxcbiAgICAgICAgICAgIGFsbG93X3JlYmFzZV9tZXJnZTogZmFsc2UsXG4gICAgICAgICAgICBhbGxvd191cGRhdGVfYnJhbmNoOiB0cnVlLFxuICAgICAgICAgICAgZGVsZXRlX2JyYW5jaF9vbl9tZXJnZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc193aWtpOiBmYWxzZSxcbiAgICAgICAgICAgIGhhc19wcm9qZWN0czogZmFsc2UsXG4gICAgICAgICAgICBzcXVhc2hfbWVyZ2VfY29tbWl0X3RpdGxlOiAnUFJfVElUTEUnLFxuICAgICAgICAgICAgc3F1YXNoX21lcmdlX2NvbW1pdF9tZXNzYWdlOiAnQkxBTksnLFxuICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAnWC1HaXRIdWItQXBpLVZlcnNpb24nOiAnMjAyMi0xMS0yOCcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLi4uKGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXIvJykgPyB7IGFsbG93X2F1dG9fbWVyZ2U6IHRydWUgfSA6IHt9KSxcbiAgICAgICAgICB9KSxcbiAgICAgICAge1xuICAgICAgICAgIHNob3VsZFJldHJ5OiAoZXJyb3IpID0+ICFpc0dpdEh1YlBlcm1pc3Npb25PclZpc2liaWxpdHlFcnJvcihlcnJvciksXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICghaXNHaXRIdWJQZXJtaXNzaW9uT3JWaXNpYmlsaXR5RXJyb3IoZXJyb3IpKSB0aHJvdyBlcnJvcjtcblxuICAgICAgLy8gTG9jYWwgd2JmeSBydW5zIG9mdGVuIGhhdmUgcHVzaCBwZXJtaXNzaW9uIHdpdGhvdXQgYWRtaW4gcGVybWlzc2lvbi5cbiAgICAgIGNvbnNvbGUud2FybignU2tpcCBzZXR1cEdpdEh1YlNldHRpbmdzIGR1ZSB0bzonLCAoZXJyb3IgYXMgRXJyb3IgfCB1bmRlZmluZWQpPy5zdGFjayA/PyBlcnJvcik7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHdpdGhSZXRyeSgoKSA9PiBkaXNhYmxlRGlzY3Vzc2lvbnMob2N0b2tpdCwgb3duZXIsIHJlcG8pLCB7XG4gICAgICAgIHNob3VsZFJldHJ5OiAoZXJyb3IpID0+ICFpc0dpdEh1YlNldHRpbmdzRXJyb3IoZXJyb3IpLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICghaXNHaXRIdWJTZXR0aW5nc0Vycm9yKGVycm9yKSkgdGhyb3cgZXJyb3I7XG4gICAgICBjb25zb2xlLndhcm4oJ1NraXAgZGlzYWJsaW5nIEdpdEh1YiBEaXNjdXNzaW9ucyBkdWUgdG86JywgKGVycm9yIGFzIEVycm9yIHwgdW5kZWZpbmVkKT8uc3RhY2sgPz8gZXJyb3IpO1xuICAgIH1cbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRpc2FibGVEaXNjdXNzaW9ucyhvY3Rva2l0OiBSZXR1cm5UeXBlPHR5cGVvZiBnZXRPY3Rva2l0Piwgb3duZXI6IHN0cmluZywgcmVwbzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHJlcG9zaXRvcnlSZXNwb25zZSA9IGF3YWl0IG9jdG9raXQuZ3JhcGhxbDx7IHJlcG9zaXRvcnk/OiB7IGlkPzogc3RyaW5nIH0gfT4oXG4gICAgYHF1ZXJ5KCRvd25lcjogU3RyaW5nISwgJHJlcG86IFN0cmluZyEpIHtcbiAgICAgIHJlcG9zaXRvcnkob3duZXI6ICRvd25lciwgbmFtZTogJHJlcG8pIHsgaWQgfVxuICAgIH1gLFxuICAgIHsgb3duZXIsIHJlcG8gfVxuICApO1xuICBjb25zdCByZXBvc2l0b3J5SWQgPSByZXBvc2l0b3J5UmVzcG9uc2UucmVwb3NpdG9yeT8uaWQ7XG4gIGlmICghcmVwb3NpdG9yeUlkKSByZXR1cm47XG4gIGF3YWl0IG9jdG9raXQuZ3JhcGhxbChcbiAgICBgbXV0YXRpb24oJGlucHV0OiBVcGRhdGVSZXBvc2l0b3J5SW5wdXQhKSB7XG4gICAgICB1cGRhdGVSZXBvc2l0b3J5KGlucHV0OiAkaW5wdXQpIHsgcmVwb3NpdG9yeSB7IGlkIH0gfVxuICAgIH1gLFxuICAgIHsgaW5wdXQ6IHsgcmVwb3NpdG9yeUlkLCBoYXNEaXNjdXNzaW9uc0VuYWJsZWQ6IGZhbHNlIH0gfVxuICApO1xufVxuXG5mdW5jdGlvbiBpc0dpdEh1YlNldHRpbmdzRXJyb3IoZXJyb3I6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKGlzR2l0SHViUGVybWlzc2lvbk9yVmlzaWJpbGl0eUVycm9yKGVycm9yKSkgcmV0dXJuIHRydWU7XG4gIGlmICghZXJyb3IgfHwgdHlwZW9mIGVycm9yICE9PSAnb2JqZWN0JyB8fCAhKCdlcnJvcnMnIGluIGVycm9yKSB8fCAhQXJyYXkuaXNBcnJheShlcnJvci5lcnJvcnMpKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBlcnJvci5lcnJvcnMuc29tZShcbiAgICAoZ3JhcGhxbEVycm9yOiB1bmtub3duKSA9PlxuICAgICAgISFncmFwaHFsRXJyb3IgJiZcbiAgICAgIHR5cGVvZiBncmFwaHFsRXJyb3IgPT09ICdvYmplY3QnICYmXG4gICAgICAndHlwZScgaW4gZ3JhcGhxbEVycm9yICYmXG4gICAgICBbJ0ZPUkJJRERFTicsICdJTlNVRkZJQ0lFTlRfU0NPUEVTJywgJ05PVF9GT1VORCddLmluY2x1ZGVzKGdyYXBocWxFcnJvci50eXBlIGFzIHN0cmluZylcbiAgKTtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbi8vIFRoZSBgL3NyY2AgZW50cnkgKGEgZGVjbGFyZWQgZXhwb3J0KSBsZXRzIHRoaXMgd29ya3NwYWNlIGNvbnN1bWVyIHVzZSB0aGUgc291cmNlcyB3aXRob3V0XG4vLyBidWlsZGluZyBzaGFyZWQtbGliIGZpcnN0LCBhcyBldmVyeSBvdGhlciBpbXBvcnQgb2YgaXQgaW4gdGhpcyBwYWNrYWdlIGRvZXMuXG5pbXBvcnQge1xuICBCVUdfSVNTVUVfU0VDVElPTlMsXG4gIENIQU5HRV9JU1NVRV9TRUNUSU9OUyxcbiAgUFVMTF9SRVFVRVNUX1NFQ1RJT05TLFxuICByZW5kZXJTZWN0aW9uVGVtcGxhdGUsXG59IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliL3NyYyc7XG5cbmltcG9ydCB7IGdldERlZmF1bHRQcm9zZUxhbmd1YWdlIH0gZnJvbSAnLi4vZ2VuZXJhdG9ycy9hZ2VudHMuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBnZW5lcmF0ZVRlbXBsYXRlcyA9IChsYW5ndWFnZU5vdGU6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPT4gKHtcbiAgJ3B1bGxfcmVxdWVzdF90ZW1wbGF0ZS5tZCc6IGBcbkNsb3NlICM8SXNzdWVOdW1iZXI+XG5cbjwhLS0gV3JpdGUgZm9yIGEgcmV2aWV3ZXIgd2hvIGhhcyBub3QgZm9sbG93ZWQgdGhlIHdvcmsuJHtsYW5ndWFnZU5vdGV9IFNjYWxlIGVhY2ggc2VjdGlvbiB0byB0aGUgY2hhbmdlOiBhIHNlbnRlbmNlIGZvciBhIHNtYWxsIGNoYW5nZSwgbnVtYmVyZWQgc3Vic2VjdGlvbnMgZm9yIGEgbGFyZ2Ugb25lLiBEZWxldGUgdGhpcyBjb21tZW50IGFuZCB0aGUgcGxhY2Vob2xkZXIgY29tbWVudHMgYmVsb3cuIC0tPlxuXG4ke3JlbmRlclNlY3Rpb25UZW1wbGF0ZShQVUxMX1JFUVVFU1RfU0VDVElPTlMpfVxuYC50cmltKCksXG4gICdJU1NVRV9URU1QTEFURS9idWcubWQnOiBgXG4tLS1cbm5hbWU6IEJ1ZyAvIFByb2JsZW1cbmFib3V0OiBTb21ldGhpbmcgYmVoYXZlcyB3cm9uZ2x5XG50aXRsZTogJ2ZpeDogJ1xubGFiZWxzOiAndDogZml4IDpidWc6J1xuLS0tXG5cbjwhLS0gS2VlcCBQcm9ibGVtIGFuZCBQcm9wb3NhbDsgZGVsZXRlIEV2aWRlbmNlIG9yIEltcGFjdCB3aGVuIHRoZXkgYWRkIG5vdGhpbmcuJHtsYW5ndWFnZU5vdGV9IERlbGV0ZSB0aGVzZSBjb21tZW50cy4gLS0+XG5cbiR7cmVuZGVyU2VjdGlvblRlbXBsYXRlKEJVR19JU1NVRV9TRUNUSU9OUyl9XG5gLnRyaW0oKSxcbiAgJ0lTU1VFX1RFTVBMQVRFL2NoYW5nZS5tZCc6IGBcbi0tLVxubmFtZTogQ2hhbmdlIC8gRmVhdHVyZVxuYWJvdXQ6IFByb3Bvc2UgYSBjaGFuZ2UgdGhhdCBhIHRoaXJkIHBhcnR5IGNvdWxkIGltcGxlbWVudCB3aXRob3V0IGFza2luZyBhIHF1ZXN0aW9uXG50aXRsZTogJ2ZlYXQ6ICdcbmxhYmVsczogJ3Q6IGZlYXQgOnNwYXJrbGVzOidcbi0tLVxuXG48IS0tIEtlZXAgdGhlIGZpcnN0IHRocmVlIHNlY3Rpb25zIGZvciBhbnkgY2hhbmdlIGFuZCBhZGQgdGhlIG90aGVycyBhcyB0aGUgY2hhbmdlIGdyb3dzOyBhIGxhcmdlIGNoYW5nZSBmaWxscyBhbGwgb2YgdGhlbSAoc3BlYy1ib29zdGVyIHJldmlld3MgYWdhaW5zdCB0aGlzIGxpc3QpLiR7bGFuZ3VhZ2VOb3RlfSBEZWxldGUgdGhlc2UgY29tbWVudHMuIC0tPlxuXG4ke3JlbmRlclNlY3Rpb25UZW1wbGF0ZShDSEFOR0VfSVNTVUVfU0VDVElPTlMpfVxuYC50cmltKCksXG4gICdJU1NVRV9URU1QTEFURS9jb25maWcueW1sJzogJ2JsYW5rX2lzc3Vlc19lbmFibGVkOiB0cnVlJyxcbn0pO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gVGVtcGxhdGVzIGFyZSByZXBvc2l0b3J5LWxldmVsIGZpbGVzLCBzbyBhIGRpcmVjdCB3b3Jrc3BhY2UtY2hpbGQgaW52b2NhdGlvbiBtdXN0IG5vdCBjcmVhdGUgdGhlbS5cbiAgICBpZiAoIWNvbmZpZy5pc1dpbGxCb29zdGVyUmVwbyB8fCAhY29uZmlnLmlzUm9vdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGxhbmd1YWdlTm90ZSA9XG4gICAgICBnZXREZWZhdWx0UHJvc2VMYW5ndWFnZShjb25maWcpID09PSAnSmFwYW5lc2UnID8gJyBXcml0ZSBpbiBKYXBhbmVzZSwga2VlcGluZyB0aGUgaGVhZGluZ3MgYXMgdGhleSBhcmUuJyA6ICcnO1xuICAgIGZvciAoY29uc3QgW2ZpbGVOYW1lLCBjb250ZW50XSBvZiBPYmplY3QuZW50cmllcyhnZW5lcmF0ZVRlbXBsYXRlcyhsYW5ndWFnZU5vdGUpKSkge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aHViJywgZmlsZU5hbWUpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQpKTtcbiAgICB9XG4gIH0pO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmNvbnN0IGRlcGVuZGVuY3lTZWN0aW9uS2V5cyA9IFsnZGVwZW5kZW5jaWVzJywgJ2RldkRlcGVuZGVuY2llcycsICdvcHRpb25hbERlcGVuZGVuY2llcycsICdwZWVyRGVwZW5kZW5jaWVzJ10gYXMgY29uc3Q7XG5jb25zdCBhbGxvd2VkR2l0SHViT3JnYW5pemF0aW9uUGF0dGVybiA9IFN0cmluZy5yYXdgKD86V2lsbEJvb3N0ZXJ8V2lsbEJvb3N0ZXJMYWIpYDtcbmNvbnN0IGFsbG93ZWRHaXREZXBlbmRlbmN5UGF0dGVybnMgPSBbXG4gIG5ldyBSZWdFeHAoYF4ke2FsbG93ZWRHaXRIdWJPcmdhbml6YXRpb25QYXR0ZXJufS9bXiNcXFxcc10rKD86I1xcXFxTKyk/JGAsICd1JyksXG4gIG5ldyBSZWdFeHAoYF5naXRodWI6JHthbGxvd2VkR2l0SHViT3JnYW5pemF0aW9uUGF0dGVybn0vW14jXFxcXHNdKyg/OiNcXFxcUyspPyRgLCAndScpLFxuICBuZXcgUmVnRXhwKFxuICAgIGBeKD86Z2l0XFxcXCspP2h0dHBzOi8vZ2l0aHViXFxcXC5jb20vJHthbGxvd2VkR2l0SHViT3JnYW5pemF0aW9uUGF0dGVybn0vW14jXFxcXHNdKyg/OlxcXFwuZ2l0KT8oPzojXFxcXFMrKT8kYCxcbiAgICAndSdcbiAgKSxcbiAgbmV3IFJlZ0V4cChcbiAgICBgXig/OmdpdFxcXFwrKT9zc2g6Ly9naXRAZ2l0aHViXFxcXC5jb21bOi9dJHthbGxvd2VkR2l0SHViT3JnYW5pemF0aW9uUGF0dGVybn0vW14jXFxcXHNdKyg/OlxcXFwuZ2l0KT8oPzojXFxcXFMrKT8kYCxcbiAgICAndSdcbiAgKSxcbiAgbmV3IFJlZ0V4cChgXig/OmdpdFxcXFwrKT9naXRAZ2l0aHViXFxcXC5jb206JHthbGxvd2VkR2l0SHViT3JnYW5pemF0aW9uUGF0dGVybn0vW14jXFxcXHNdKyg/OlxcXFwuZ2l0KT8oPzojXFxcXFMrKT8kYCwgJ3UnKSxcbl07XG5cbmludGVyZmFjZSBEaXNhbGxvd2VkRGVwZW5kZW5jeVNvdXJjZSB7XG4gIGRlcGVuZGVuY3lOYW1lOiBzdHJpbmc7XG4gIGRpclBhdGg6IHN0cmluZztcbiAgc2VjdGlvbk5hbWU6ICh0eXBlb2YgZGVwZW5kZW5jeVNlY3Rpb25LZXlzKVtudW1iZXJdO1xuICBzcGVjaWZpZXI6IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFNhZmVEZXBlbmRlbmN5U291cmNlcyhjb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiB2b2lkIHtcbiAgY29uc3QgZGlzYWxsb3dlZFNvdXJjZXMgPSBjb25maWdzLmZsYXRNYXAoZ2V0RGlzYWxsb3dlZERlcGVuZGVuY3lTb3VyY2VzKTtcbiAgaWYgKGRpc2FsbG93ZWRTb3VyY2VzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gIGNvbnN0IGRldGFpbHMgPSBkaXNhbGxvd2VkU291cmNlc1xuICAgIC5tYXAoXG4gICAgICAoeyBkZXBlbmRlbmN5TmFtZSwgZGlyUGF0aCwgc2VjdGlvbk5hbWUsIHNwZWNpZmllciB9KSA9PlxuICAgICAgICBgLSAke3BhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJyl9OiAke3NlY3Rpb25OYW1lfS4ke2RlcGVuZGVuY3lOYW1lfSB1c2VzICR7c3BlY2lmaWVyfWBcbiAgICApXG4gICAgLmpvaW4oJ1xcbicpO1xuXG4gIHRocm93IG5ldyBFcnJvcihcbiAgICBgRGlzYWxsb3dlZCBHaXQgZGVwZW5kZW5jeSBzb3VyY2VzIGZvdW5kLlxcbk9ubHkgV2lsbEJvb3N0ZXIgYW5kIFdpbGxCb29zdGVyTGFiIEdpdEh1YiBkZXBlbmRlbmNpZXMgYXJlIGFsbG93ZWQuXFxuJHtkZXRhaWxzfWBcbiAgKTtcbn1cblxuZnVuY3Rpb24gZ2V0RGlzYWxsb3dlZERlcGVuZGVuY3lTb3VyY2VzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IERpc2FsbG93ZWREZXBlbmRlbmN5U291cmNlW10ge1xuICBjb25zdCBwYWNrYWdlSnNvbiA9IGNvbmZpZy5wYWNrYWdlSnNvbjtcbiAgaWYgKCFwYWNrYWdlSnNvbikgcmV0dXJuIFtdO1xuXG4gIGNvbnN0IGRpc2FsbG93ZWRTb3VyY2VzOiBEaXNhbGxvd2VkRGVwZW5kZW5jeVNvdXJjZVtdID0gW107XG4gIGZvciAoY29uc3Qgc2VjdGlvbk5hbWUgb2YgZGVwZW5kZW5jeVNlY3Rpb25LZXlzKSB7XG4gICAgY29uc3Qgc2VjdGlvbiA9IHBhY2thZ2VKc29uW3NlY3Rpb25OYW1lXTtcbiAgICBpZiAoIXNlY3Rpb24pIGNvbnRpbnVlO1xuXG4gICAgZm9yIChjb25zdCBbZGVwZW5kZW5jeU5hbWUsIHNwZWNpZmllcl0gb2YgT2JqZWN0LmVudHJpZXMoc2VjdGlvbikpIHtcbiAgICAgIGlmICghc3BlY2lmaWVyKSBjb250aW51ZTtcbiAgICAgIGlmICghaXNHaXREZXBlbmRlbmN5U3BlY2lmaWVyKHNwZWNpZmllcikpIGNvbnRpbnVlO1xuICAgICAgaWYgKGlzQWxsb3dlZEdpdERlcGVuZGVuY3lTcGVjaWZpZXIoc3BlY2lmaWVyKSkgY29udGludWU7XG5cbiAgICAgIGRpc2FsbG93ZWRTb3VyY2VzLnB1c2goe1xuICAgICAgICBkZXBlbmRlbmN5TmFtZSxcbiAgICAgICAgZGlyUGF0aDogY29uZmlnLmRpclBhdGgsXG4gICAgICAgIHNlY3Rpb25OYW1lLFxuICAgICAgICBzcGVjaWZpZXIsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRpc2FsbG93ZWRTb3VyY2VzO1xufVxuXG5mdW5jdGlvbiBpc0dpdERlcGVuZGVuY3lTcGVjaWZpZXIoc3BlY2lmaWVyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBpc0dpdEh1YlNob3J0aGFuZFNwZWNpZmllcihzcGVjaWZpZXIpIHx8XG4gICAgL14oPzpiaXRidWNrZXR8Z2lzdHxnaXRodWJ8Z2l0bGFiKTovdS50ZXN0KHNwZWNpZmllcikgfHxcbiAgICAvXmh0dHBzPzpcXC9cXC8oPzpiaXRidWNrZXRcXC5vcmd8Z2l0aHViXFwuY29tfGdpdGxhYlxcLmNvbSlcXC8vdS50ZXN0KHNwZWNpZmllcikgfHxcbiAgICAvXig/Omh0dHBzP3xzc2gpOlxcL1xcL1xcUytcXC5naXQoPzojXFxTKyk/JC91LnRlc3Qoc3BlY2lmaWVyKSB8fFxuICAgIC9eW15AXFxzXStAW146XFxzXSs6XFxTKyg/OiNcXFMrKT8kL3UudGVzdChzcGVjaWZpZXIpIHx8XG4gICAgc3BlY2lmaWVyLnN0YXJ0c1dpdGgoJ2dpdDonKSB8fFxuICAgIHNwZWNpZmllci5zdGFydHNXaXRoKCdnaXQrJykgfHxcbiAgICBzcGVjaWZpZXIuc3RhcnRzV2l0aCgnc3NoOi8vZ2l0QCcpXG4gICk7XG59XG5cbmZ1bmN0aW9uIGlzR2l0SHViU2hvcnRoYW5kU3BlY2lmaWVyKHNwZWNpZmllcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAvXlthLXpBLVowLTldW1xcdy4tXSpcXC9bXFx3Li1dKyg/OiNcXFMrKT8kL3UudGVzdChzcGVjaWZpZXIpO1xufVxuXG5mdW5jdGlvbiBpc0FsbG93ZWRHaXREZXBlbmRlbmN5U3BlY2lmaWVyKHNwZWNpZmllcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBhbGxvd2VkR2l0RGVwZW5kZW5jeVBhdHRlcm5zLnNvbWUoKHBhdHRlcm4pID0+IHBhdHRlcm4udGVzdChzcGVjaWZpZXIpKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGlnbm9yZUVycm9yLCBpZ25vcmVFcnJvckFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWIvc3JjJztcbmltcG9ydCB7IG5vcm1hbGl6ZUJ1bkxvY2tmaWxlIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHlhcmdzIGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZml4TmV4dENvbmZpZ0pzb24gfSBmcm9tICcuL2ZpeGVycy9uZXh0Q29uZmlnLmpzJztcbmltcG9ydCB7IGZpeENoYWtyYVRvYXN0ZXIgfSBmcm9tICcuL2ZpeGVycy9jaGFrcmFUb2FzdGVyLmpzJztcbmltcG9ydCB7IGZpeFBsYXl3cmlnaHRDb25maWcgfSBmcm9tICcuL2ZpeGVycy9wbGF5d3JpZ2h0Q29uZmlnLmpzJztcbmltcG9ydCB7IGZpeFR5cG9zIH0gZnJvbSAnLi9maXhlcnMvdHlwb3MuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9hZ2VudHMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVCdW5maWdUb21sLCByZWFkQnVuR2xvYmFsU3RvcmUsIHJlc29sdmVCdW5HbG9iYWxTdG9yZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9idW5maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVEb2NrZXJpZ25vcmUgfSBmcm9tICcuL2dlbmVyYXRvcnMvZG9ja2VyaWdub3JlLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlRWRpdG9yY29uZmlnIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2VkaXRvcmNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUZub3hUb21sIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2Zub3hUb21sLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2VtaW5pQ29uZmlnIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dlbWluaUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMsIHJlbm9ybWFsaXplVHJhY2tlZFRleHRGaWxlcyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9naXRhdHRyaWJ1dGVzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2l0aWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dpdGlnbm9yZS5qcyc7XG5pbXBvcnQgeyBlbnN1cmVHbG9iYWxSZWxlYXNlQWdlR2F0ZXMgfSBmcm9tICcuL2dlbmVyYXRvcnMvZ2xvYmFsUmVsZWFzZUFnZUdhdGUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVJZGVhU2V0dGluZ3MgfSBmcm9tICcuL2dlbmVyYXRvcnMvaWRlYS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUxlZnRob29rIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2xlZnRob29rLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUGFja2FnZUpzb24sIGdldFdvcmtzcGFjZVBhY2thZ2VEaXJzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3BhY2thZ2VKc29uLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlT3hmbXRDb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvb3hmbXRDb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVPeGxpbnRDb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvb3hsaW50Q29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUHJldHRpZXJpZ25vcmUgfSBmcm9tICcuL2dlbmVyYXRvcnMvcHJldHRpZXJpZ25vcmUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9weXJpZ2h0Q29uZmlnLmpzJztcbmltcG9ydCB7IGZpeFJhaWx3YXlpZ25vcmUgfSBmcm9tICcuL2dlbmVyYXRvcnMvcmFpbHdheWlnbm9yZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJlYWRtZSwgcmVhZEFwcGxpZWRXYmZ5VmVyc2lvbkxhYmVsIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3JlYWRtZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJlbGVhc2VyYyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9yZWxlYXNlcmMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVSZW5vdmF0ZUpzb25jIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3Jlbm92YXRlSnNvbmMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVUc2NvbmZpZyB9IGZyb20gJy4vZ2VuZXJhdG9ycy90c2NvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVVzZXJBZ2VudENvbmZpZ3MgfSBmcm9tICcuL2dlbmVyYXRvcnMvdXNlckFnZW50Q29uZmlncy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVZzY29kZVNldHRpbmdzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3ZzY29kZVNldHRpbmdzLmpzJztcbmltcG9ydCB7IGVuc3VyZVdiRW52RGVmaW5pdGlvbnMgfSBmcm9tICcuL2dlbmVyYXRvcnMvd2JFbnYuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVTZWxmQ29udGFpbmVkV29ya2Zsb3dzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3NlbGZDb250YWluZWRXb3JrZmxvdy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVdvcmtmbG93cywgaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8gfSBmcm9tICcuL2dlbmVyYXRvcnMvd29ya2Zsb3cuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVNaXNlVG9tbCwgbWluaW11bUJ1blZlcnNpb24gfSBmcm9tICcuL2dlbmVyYXRvcnMvbWlzZVRvbWwuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVSZXBvc2l0b3J5TnBtcmMgfSBmcm9tICcuL2dlbmVyYXRvcnMvbnBtcmMuanMnO1xuaW1wb3J0IHsgc2V0dXBMYWJlbHMgfSBmcm9tICcuL2dpdGh1Yi9sYWJlbC5qcyc7XG5pbXBvcnQgeyBzZXR1cFJlcG9zaXRvcnlSdWxlc2V0cyB9IGZyb20gJy4vZ2l0aHViL3J1bGVzZXQuanMnO1xuaW1wb3J0IHsgc2V0dXBHaXRIdWJTZXR0aW5ncyB9IGZyb20gJy4vZ2l0aHViL3NldHRpbmdzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2l0SHViVGVtcGxhdGVzIH0gZnJvbSAnLi9naXRodWIvdGVtcGxhdGUuanMnO1xuaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2V0UGFja2FnZUNvbmZpZywgZ2V0V29ya2VyVHlwZXNTY3JpcHRFcnJvciB9IGZyb20gJy4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBhc3NlcnRTYWZlRGVwZW5kZW5jeVNvdXJjZXMgfSBmcm9tICcuL3V0aWxzL2RlcGVuZGVuY3lTb3VyY2VQb2xpY3kuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgZG9lc0NvbnRhaW5KYXZhLCBkb2VzQ29udGFpbkpzT3JUcyB9IGZyb20gJy4vdXRpbHMvcGFja2FnZUNhcGFiaWxpdGllcy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jLCBzcGF3blN5bmNBbmRSZXR1cm5TdGF0dXMsIHNwYXduU3luY0FuZFJldHVyblN0ZG91dCB9IGZyb20gJy4vdXRpbHMvc3Bhd25VdGlsLmpzJztcbmltcG9ydCB7IGRpc3Bvc2VUeXBlU2NyaXB0QXBpIH0gZnJvbSAnLi91dGlscy90eXBlc2NyaXB0QXBpLmpzJztcbmltcG9ydCB7IGdldFdiZnlWZXJzaW9uLCBnZXRXYmZ5VmVyc2lvbkxhYmVsIH0gZnJvbSAnLi91dGlscy92ZXJzaW9uLmpzJztcbmltcG9ydCB7IGdldFdvcmtzcGFjZVN1YkRpclBhdGhzIH0gZnJvbSAnLi91dGlscy93b3Jrc3BhY2VVdGlsLmpzJztcblxuLyoqXG4gKiBBcHBsaWVzIG9ubHkgdGhlIGdsb2JhbCByZWxlYXNlLWFnZSBnYXRlLCB3aXRob3V0IHRvdWNoaW5nIGFueSByZXBvc2l0b3J5LiBTcGVsbGVkIG91dCBpbiBmdWxsXG4gKiByYXRoZXIgdGhhbiBzaG9ydGVuZWQgKGUuZy4gYGdhdGVgKSBiZWNhdXNlIHRoZSBkZWZhdWx0IGNvbW1hbmQgdGFrZXMgcG9zaXRpb25hbCBwYXRoczogYSBzaG9ydFxuICogbmFtZSB3b3VsZCBzd2FsbG93IGEgZGlyZWN0b3J5IHRoYXQgaGFwcGVucyB0byBzaGFyZSBpdC5cbiAqL1xuY29uc3QgYXBwbHlSZWxlYXNlQWdlR2F0ZUNvbW1hbmQgPSAnYXBwbHktcmVsZWFzZS1hZ2UtZ2F0ZSc7XG4vKiogU2FtZSBuYW1pbmcgcmF0aW9uYWxlIGFzIGFwcGx5UmVsZWFzZUFnZUdhdGVDb21tYW5kLiAqL1xuY29uc3QgZ2VuZXJhdGVVc2VyQWdlbnRDb25maWdzQ29tbWFuZCA9ICdnZW5lcmF0ZS11c2VyLWFnZW50LWNvbmZpZ3MnO1xuXG5hc3luYyBmdW5jdGlvbiBtYWluKCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBhcmd2ID0gYXdhaXQgeWFyZ3MocHJvY2Vzcy5hcmd2LnNsaWNlKDIpKVxuICAgIC5jb21tYW5kKFxuICAgICAgYXBwbHlSZWxlYXNlQWdlR2F0ZUNvbW1hbmQsXG4gICAgICBcIkFwcGx5IG9ubHkgdGhlIG9yZ2FuaXphdGlvbidzIG1pbmltdW0tcmVsZWFzZS1hZ2UgcG9saWN5IHRvIHRoaXMgbWFjaGluZSdzIGdsb2JhbCBwYWNrYWdlLW1hbmFnZXIgY29uZmlnc1wiXG4gICAgKVxuICAgIC5jb21tYW5kKFxuICAgICAgZ2VuZXJhdGVVc2VyQWdlbnRDb25maWdzQ29tbWFuZCxcbiAgICAgIFwiT3ZlcndyaXRlIHRoaXMgdXNlcidzIGFnZW50IGluc3RydWN0aW9uIGZpbGVzICh+Ly5jb2RleC9BR0VOVFMubWQsIH4vLmNsYXVkZS9DTEFVREUubWQsIH4vLmdlbWluaS9HRU1JTkkubWQpIHdpdGggdGhlIG9yZ2FuaXphdGlvbidzIGZpeGVkIGNvbnRlbnQgYW5kIG1lcmdlIHRoZSBvcmdhbml6YXRpb24ncyBzZXR0aW5ncyBpbnRvIH4vLmNsYXVkZS9zZXR0aW5ncy5qc29uIGFuZCB+Ly5nZW1pbmkvc2V0dGluZ3MuanNvblwiXG4gICAgKVxuICAgIC5jb21tYW5kKCckMCBbcGF0aHMuLl0nLCAnTWFrZSBhIGdpdmVuIHByb2plY3QgZm9sbG93IHRoZSBXaWxsQm9vc3RlciBzdGFuZGFyZCcsICh5YXJncykgPT4ge1xuICAgICAgeWFyZ3MucG9zaXRpb25hbCgncGF0aHMnLCB7XG4gICAgICAgIGRlc2NyaWJlOiAncHJvamVjdCBwYXRocyB0byBiZSB3YmZpZWQnLFxuICAgICAgICBhcnJheTogdHJ1ZSxcbiAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgIGRlZmF1bHQ6IFsnLiddLFxuICAgICAgfSk7XG4gICAgfSlcbiAgICAub3B0aW9ucyh7XG4gICAgICBmb3JjZToge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ0FwcGx5IHdiZnkgZXZlbiB3aGVuIHRoZSByZXBvc2l0b3J5IGFscmVhZHkgcmVjb3JkcyB0aGlzIHdiZnkgdmVyc2lvbicsXG4gICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgIGFsaWFzOiAnZicsXG4gICAgICB9LFxuICAgICAgc2tpcERlcHM6IHtcbiAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgJ1NraXAgYWRkaW5nIG1hbmFnZWQgZGVwZW5kZW5jaWVzIGFuZCB0aGUgbGlua2VyIHByb2JlICh0aGUgZmluYWwgYGJ1biBpbnN0YWxsYCByZWZyZXNoaW5nIHRoZSBsb2NrZmlsZSBzdGlsbCBydW5zKScsXG4gICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgIGFsaWFzOiAnZCcsXG4gICAgICB9LFxuICAgICAgdmVyYm9zZToge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgb3Igbm90IHRvIGVuYWJsZSB2ZXJib3NlIG1vZGUnLFxuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICBhbGlhczogJ3YnLFxuICAgICAgfSxcbiAgICB9KVxuICAgIC52ZXJzaW9uKGdldFdiZnlWZXJzaW9uKCkpXG4gICAgLnN0cmljdCgpLmFyZ3Y7XG4gIG9wdGlvbnMuaXNWZXJib3NlID0gYXJndi52ZXJib3NlO1xuXG4gIC8vIERlbGliZXJhdGVseSBiZWZvcmUgdGhlIEJ1biBjaGVjayBpbiB3aWxsYm9vc3RlcmlmeVBhdGhzKCk6IHRoZSBnYXRlIG11c3QgYmUgYXBwbGlhYmxlIG9uIGFcbiAgLy8gbWFjaGluZSB3aG9zZSBCdW4gaXMgb3V0ZGF0ZWQsIHdoaWNoIGlzIGV4YWN0bHkgYSBtYWNoaW5lIHRoYXQgc3RpbGwgbmVlZHMgZ2F0aW5nLlxuICBpZiAoYXJndi5fWzBdID09PSBhcHBseVJlbGVhc2VBZ2VHYXRlQ29tbWFuZCkge1xuICAgIGlmICghZW5zdXJlR2xvYmFsUmVsZWFzZUFnZUdhdGVzKCkpIHByb2Nlc3MuZXhpdENvZGUgPSAxO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoYXJndi5fWzBdID09PSBnZW5lcmF0ZVVzZXJBZ2VudENvbmZpZ3NDb21tYW5kKSB7XG4gICAgaWYgKCEoYXdhaXQgZ2VuZXJhdGVVc2VyQWdlbnRDb25maWdzKCkpKSBwcm9jZXNzLmV4aXRDb2RlID0gMTtcbiAgICByZXR1cm47XG4gIH1cblxuICBsZXQgaGFzSW52YWxpZFBhY2thZ2VDb25maWcgPSBmYWxzZTtcbiAgdHJ5IHtcbiAgICBoYXNJbnZhbGlkUGFja2FnZUNvbmZpZyA9IGF3YWl0IHdpbGxib29zdGVyaWZ5UGF0aHMoYXJndi5wYXRocyBhcyBzdHJpbmdbXSwgYXJndi5za2lwRGVwcywgYXJndi5mb3JjZSk7XG4gIH0gZmluYWxseSB7XG4gICAgLy8gVGhlIFR5cGVTY3JpcHQgY29tcGlsZXIgc2VydmVyIHNwYXduZWQgZm9yIEFTVCBwYXJzaW5nIGtlZXBzIGFuIG9wZW4gSVBDXG4gICAgLy8gY2hhbm5lbCB0aGF0IHdvdWxkIG90aGVyd2lzZSBwcmV2ZW50IHRoZSBOb2RlLmpzIHByb2Nlc3MgZnJvbSBleGl0aW5nLlxuICAgIGF3YWl0IGRpc3Bvc2VUeXBlU2NyaXB0QXBpKCk7XG4gIH1cbiAgaWYgKGhhc0ludmFsaWRQYWNrYWdlQ29uZmlnKSB7XG4gICAgcHJvY2Vzcy5leGl0Q29kZSA9IDE7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gd2lsbGJvb3N0ZXJpZnlQYXRocyhwYXRoczogc3RyaW5nW10sIHNraXBEZXBzOiBib29sZWFuLCBmb3JjZTogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAvLyBCZWZvcmUgYW55dGhpbmcgZWxzZSDigJQgZXZlbiB0aGUgQnVuIGNoZWNrIGJlbG93OiB0aGUgZGV2ZWxvcGVyIG1hY2hpbmUncyBnbG9iYWxcbiAgLy8gcGFja2FnZS1tYW5hZ2VyIGNvbmZpZ3MgbXVzdCByZWNlaXZlIHRoZSBvcmcncyBtaW5pbXVtLXJlbGVhc2UtYWdlIHBvbGljeSBvbiBFVkVSWSBydW4sXG4gIC8vIGJlY2F1c2UgdGhleSBhcmUgd2hhdCBndWFyZHMgYnJhbmQtbmV3IGxvY2FsIHByb2plY3RzIHRoYXQgaGF2ZSBubyB3YmZ5LWdlbmVyYXRlZCByZXBvc2l0b3J5XG4gIC8vIGNvbmZpZyB5ZXQsIGFuZCB0aGF0IHByb3RlY3Rpb24gbXVzdCB3b3JrIGJlZm9yZSB0aGUgc3VwcG9ydGVkLXZlcnNpb24gY2hlY2suXG4gIGVuc3VyZUdsb2JhbFJlbGVhc2VBZ2VHYXRlcygpO1xuXG4gIC8vIHdiZnkgbWFuYWdlcyByZXBvc2l0b3JpZXMgdGhyb3VnaCBCdW4gKyBtaXNlIGFuZCB1c2VzIEJ1biAxLjQgcnVudGltZSBBUElzLiBUaGUgdmVyc2lvbiBmbG9vclxuICAvLyBhbHNvIGVuc3VyZXMgdGhlIGdlbmVyYXRlZCBidW5maWcudG9tbCBvcHRpb25zIHByb2R1Y2UgdGhlIGluc3RhbGwgbGF5b3V0IHdiZnkgdmFsaWRhdGVzLiBJdFxuICAvLyBzdGF5cyB1bmNvbmRpdGlvbmFsIGV2ZW4gdGhvdWdoIHRoZSBhbHJlYWR5LWFwcGxpZWQgY2hlY2sgYmVsb3cgY2FuIG1ha2UgYSBydW4gYSBuby1vcDogYW5cbiAgLy8gb3V0ZGF0ZWQgQnVuIGlzIGEgYnJva2VuIGVudmlyb25tZW50IHdiZnkgbXVzdCByZXBvcnQsIGFuZCBoaWRpbmcgaXQgd2hlbmV2ZXIgZXZlcnkgcGF0aFxuICAvLyBoYXBwZW5zIHRvIGJlIHNraXBwZWQgd291bGQgc3VyZmFjZSBpdCBvbmx5IGxhdGVyLlxuICBjb25zdCBidW5WZXJzaW9uID0gQnVuLnZlcnNpb247XG4gIGlmIChCdW4uc2VtdmVyLm9yZGVyKGJ1blZlcnNpb24sIG1pbmltdW1CdW5WZXJzaW9uKSA8IDApIHtcbiAgICBjb25zb2xlLmVycm9yKGB3YmZ5IHJlcXVpcmVzIEJ1biA+PSAke21pbmltdW1CdW5WZXJzaW9ufSAoZm91bmQgJHtidW5WZXJzaW9ufSkuIFVwZ3JhZGUgQnVuIGFuZCByZS1ydW4uYCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBBIGAtZGlydHktbG9jYWxgIGxhYmVsIGlkZW50aWZpZXMgYW4gZWRpdGVkIGNoZWNrb3V0LCB3aG9zZSBuZXh0IGJ1aWxkIHByb2R1Y2VzIGRpZmZlcmVudCBmaWxlc1xuICAvLyB1bmRlciB0aGUgc2FtZSBsYWJlbCwgc28gc3VjaCBhIHJ1biBpcyBuZXZlciB0cmVhdGVkIGFzIGFscmVhZHkgYXBwbGllZC5cbiAgY29uc3QgdmVyc2lvbkxhYmVsID0gZ2V0V2JmeVZlcnNpb25MYWJlbCgpO1xuICBjb25zdCBza2lwcGFibGVWZXJzaW9uTGFiZWwgPVxuICAgICFmb3JjZSAmJiB2ZXJzaW9uTGFiZWwgJiYgIXZlcnNpb25MYWJlbC5lbmRzV2l0aCgnLWRpcnR5LWxvY2FsJykgPyB2ZXJzaW9uTGFiZWwgOiB1bmRlZmluZWQ7XG5cbiAgbGV0IGhhc0ludmFsaWRQYWNrYWdlQ29uZmlnID0gZmFsc2U7XG4gIGZvciAoY29uc3QgaW5wdXREaXJQYXRoIG9mIHBhdGhzKSB7XG4gICAgLy8gTm9ybWFsaXplIG9uY2UgYXQgdGhlIENMSSBib3VuZGFyeS4gR2VuZXJhdG9ycyB1c2UgZGlyUGF0aCBmb3IgY3dkIGFuZCBiYXNlbmFtZSBkZWNpc2lvbnM7XG4gICAgLy8gbGVhdmluZyB0aGUgc3VwcG9ydGVkIGRlZmF1bHQgYC5gIHVucmVzb2x2ZWQgd291bGQgZ2VuZXJhdGUgYW4gaW52YWxpZCBwYWNrYWdlIG5hbWUgb2YgYC5gLlxuICAgIGNvbnN0IHJvb3REaXJQYXRoID0gcGF0aC5yZXNvbHZlKGlucHV0RGlyUGF0aCk7XG4gICAgLy8gQ29uZmluZSBldmVyeSBnZW5lcmF0ZWQgZmlsZSB0byB0aGlzIHJlcG9zaXRvcnkgKHNlZSBmc1V0aWwuZ2VuZXJhdGVGaWxlKS4gU2V0IEJFRk9SRSBhbnlcbiAgICAvLyBmaXhlciB3cml0ZXMsIGFuZCByZXNldCBvbiBldmVyeSBpdGVyYXRpb24gc28gYSBtdWx0aS1wYXRoIHJ1biBuZXZlciBrZWVwcyB0aGUgcHJldmlvdXMgcm9vdC5cbiAgICBmc1V0aWwuc2V0Um9vdERpclBhdGgoZnMuZXhpc3RzU3luYyhyb290RGlyUGF0aCkgPyByb290RGlyUGF0aCA6IHVuZGVmaW5lZCk7XG5cbiAgICAvLyBUaGUgYmFkZ2UgcmVjb3JkcyB0aGUgYnVpbGQgdGhhdCBnZW5lcmF0ZWQgdGhlIHJlcG9zaXRvcnkncyBjb25maWd1cmF0aW9uLCBzbyB0aGUgc2FtZSBidWlsZFxuICAgIC8vIHdvdWxkIG9ubHkgcmV3cml0ZSB3aGF0IGlzIGFscmVhZHkgdGhlcmUuIFNraXBwaW5nIGlzIGEgZGVsaWJlcmF0ZSB0cmFkZTogdGhlIHBhcnRzIG9mIGEgcnVuXG4gICAgLy8gdGhhdCBkZXBlbmQgb24gc3RhdGUgT1VUU0lERSB0aGUgcmVwb3NpdG9yeSAoR2l0SHViIHNldHRpbmdzLCBkZXBlbmRlbmN5IHVwZGF0ZXMsIHRoZSBmZXRjaGVkXG4gICAgLy8gLmdpdGlnbm9yZSkgZG8gZ2V0IHNraXBwZWQgdG9vLCB3aGljaCBpcyB3aGF0IC0tZm9yY2UgaXMgZm9yLlxuICAgIGlmIChza2lwcGFibGVWZXJzaW9uTGFiZWwgJiYgKGF3YWl0IHJlYWRBcHBsaWVkV2JmeVZlcnNpb25MYWJlbChyb290RGlyUGF0aCkpID09PSBza2lwcGFibGVWZXJzaW9uTGFiZWwpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgU2tpcCAke3Jvb3REaXJQYXRofTogd2JmeSAke3NraXBwYWJsZVZlcnNpb25MYWJlbH0gaXMgYWxyZWFkeSBhcHBsaWVkLiBQYXNzIC0tZm9yY2UgdG8gcmUtYXBwbHkuYCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgcGFja2FnZXNEaXJQYXRoID0gcGF0aC5qb2luKHJvb3REaXJQYXRoLCAncGFja2FnZXMnKTtcbiAgICBjb25zdCBkaXJlbnRzID0gKGF3YWl0IGlnbm9yZUVycm9yQXN5bmMoKCkgPT4gZnMucHJvbWlzZXMucmVhZGRpcihwYWNrYWdlc0RpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KSkpID8/IFtdO1xuICAgIGNvbnN0IHBhY2thZ2VzU3ViRGlyUGF0aHMgPSBkaXJlbnRzXG4gICAgICAuZmlsdGVyKChkKSA9PiBkLmlzRGlyZWN0b3J5KCkpXG4gICAgICAubWFwKChkKSA9PiBwYXRoLnJlc29sdmUocGFja2FnZXNEaXJQYXRoLCBkLm5hbWUpKTtcbiAgICAvLyBBbHNvIGNvdmVyIHdvcmtzcGFjZXMgZGVjbGFyZWQgb3V0c2lkZSBwYWNrYWdlcy8qIChlLmcuIGFwcHMvKik6IHRoZXkgcmVjZWl2ZSB0aGUgc2FtZVxuICAgIC8vIG1hbmFnZWQgY29uZmlncyAodHNjb25maWcuanNvbiwgcGFja2FnZS5qc29uIGNvbnZlbnRpb25zLCDigKYpIGFzIHBhY2thZ2VzLyogY2hpbGRyZW4uXG4gICAgY29uc3Qgcm9vdFBhY2thZ2VKc29uID1cbiAgICAgIGlnbm9yZUVycm9yKFxuICAgICAgICAoKSA9PlxuICAgICAgICAgIEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhdGgucmVzb2x2ZShyb290RGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpKSBhcyBQYWNrYWdlQ29uZmlnWydwYWNrYWdlSnNvbiddXG4gICAgICApID8/IHt9O1xuICAgIGNvbnN0IHdvcmtzcGFjZVN1YkRpclBhdGhzID0gZ2V0V29ya3NwYWNlU3ViRGlyUGF0aHMoe1xuICAgICAgZGlyUGF0aDogcm9vdERpclBhdGgsXG4gICAgICBwYWNrYWdlSnNvbjogcm9vdFBhY2thZ2VKc29uLFxuICAgICAgZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnM6IHBhY2thZ2VzU3ViRGlyUGF0aHMuc29tZSgoc3ViRGlyUGF0aCkgPT5cbiAgICAgICAgZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoc3ViRGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKVxuICAgICAgKSxcbiAgICB9KTtcbiAgICBjb25zdCBzdWJEaXJQYXRocyA9IFsuLi5uZXcgU2V0KFsuLi5wYWNrYWdlc1N1YkRpclBhdGhzLCAuLi53b3Jrc3BhY2VTdWJEaXJQYXRoc10pXS5maWx0ZXIoXG4gICAgICAoc3ViRGlyUGF0aCkgPT4gc3ViRGlyUGF0aCAhPT0gcGF0aC5yZXNvbHZlKHJvb3REaXJQYXRoKVxuICAgICk7XG5cbiAgICAvLyBSZWZ1c2VkIHdyaXRlcyBvbiBjb3JlIG1hbmFnZWQgZmlsZXMgd291bGQgbGVhdmUgdGhlIHJlcG9zaXRvcnkgcGFydGlhbGx5IHVwZGF0ZWQsIHNvIHNraXBcbiAgICAvLyBpdCBCRUZPUkUgYW55IG11dGF0aW9uIHdoZW4gb25lIG9mIHRoZW0gaXMgYSBzeW1saW5rIG9yIHJlc29sdmVzIG91dHNpZGUgdGhlIHJlcG9zaXRvcnkuXG4gICAgY29uc3QgbWFuYWdlZEZpbGVQYXRocyA9IFtcbiAgICAgIC4uLlsnLmdpdGF0dHJpYnV0ZXMnLCAnYnVuZmlnLnRvbWwnLCAnbGVmdGhvb2sueW1sJywgJ3BhY2thZ2UuanNvbicsICd0c2NvbmZpZy5qc29uJ10ubWFwKChuYW1lKSA9PlxuICAgICAgICBwYXRoLnJlc29sdmUocm9vdERpclBhdGgsIG5hbWUpXG4gICAgICApLFxuICAgICAgLi4uc3ViRGlyUGF0aHMuZmxhdE1hcCgoc3ViRGlyUGF0aCkgPT5cbiAgICAgICAgWydwYWNrYWdlLmpzb24nLCAndHNjb25maWcuanNvbiddLm1hcCgobmFtZSkgPT4gcGF0aC5yZXNvbHZlKHN1YkRpclBhdGgsIG5hbWUpKVxuICAgICAgKSxcbiAgICBdO1xuICAgIGNvbnN0IHdyaXRhYmxlUmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgbWFuYWdlZEZpbGVQYXRocy5tYXAoKGZpbGVQYXRoKSA9PiBmc1V0aWwuaXNDb25maW5lZFdyaXRhYmxlUGF0aChmaWxlUGF0aCkpXG4gICAgKTtcbiAgICBpZiAod3JpdGFibGVSZXN1bHRzLmluY2x1ZGVzKGZhbHNlKSkge1xuICAgICAgY29uc29sZS5lcnJvcihgU2tpcCAke3Jvb3REaXJQYXRofTogYSBtYW5hZ2VkIGNvbmZpZyBmaWxlIGlzIGEgc3ltbGluayBvciByZXNvbHZlcyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LmApO1xuICAgICAgaGFzSW52YWxpZFBhY2thZ2VDb25maWcgPSB0cnVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgcHJlZmxpZ2h0RXJyb3JzID0gW3Jvb3REaXJQYXRoLCAuLi5zdWJEaXJQYXRoc10uZmxhdE1hcCgoZGlyUGF0aCkgPT4ge1xuICAgICAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgICAgIGlmICghZnMuZXhpc3RzU3luYyhwYWNrYWdlSnNvblBhdGgpKSByZXR1cm4gW107XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKSkgYXMgUGFja2FnZUNvbmZpZ1sncGFja2FnZUpzb24nXTtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBnZXRXb3JrZXJUeXBlc1NjcmlwdEVycm9yKHsgcGFja2FnZUpzb24gfSk7XG4gICAgICAgIHJldHVybiBlcnJvciA/IFtgJHtkaXJQYXRofTogJHtlcnJvcn1gXSA6IFtdO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBbYCR7cGFja2FnZUpzb25QYXRofSBpcyBpbnZhbGlkYF07XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKHByZWZsaWdodEVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBTa2lwICR7cm9vdERpclBhdGh9OlxcbiR7cHJlZmxpZ2h0RXJyb3JzLmpvaW4oJ1xcbicpfWApO1xuICAgICAgaGFzSW52YWxpZFBhY2thZ2VDb25maWcgPSB0cnVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gTGV0IGdldFBhY2thZ2VDb25maWcgZGVyaXZlIGlzUm9vdCBmb3IgdGhlIGVudHJ5IHBhdGg6IGB3YmZ5IDxyZXBvPi9wYWNrYWdlcy88YXBwPmAgaXMgYVxuICAgIC8vIHN1cHBvcnRlZCBpbnZvY2F0aW9uIHdob3NlIHRhcmdldCBtdXN0IGtlZXAgaXRzIGNoaWxkIGNsYXNzaWZpY2F0aW9uLCBzbyBmb3JjaW5nXG4gICAgLy8gYGlzUm9vdDogdHJ1ZWAgaGVyZSB3b3VsZCBhcHBseSByb290LW9ubHkgcHJvY2Vzc2luZyAobGVmdGhvb2sgaW5zdGFsbCwgcm9vdCB0c2NvbmZpZyxcbiAgICAvLyBBR0VOVFMubWQsIOKApikgdG8gYSBzdWJwYWNrYWdlLlxuICAgIGNvbnN0IHJvb3RDb25maWcgPSBhd2FpdCBnZXRQYWNrYWdlQ29uZmlnKHJvb3REaXJQYXRoKTtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdyb290Q29uZmlnOicsIHJvb3RDb25maWcpO1xuICAgIH1cbiAgICBpZiAoIXJvb3RDb25maWcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYHRoZXJlIGlzIG5vIHZhbGlkIHBhY2thZ2UuanNvbiBpbiAke3Jvb3REaXJQYXRofWApO1xuICAgICAgaGFzSW52YWxpZFBhY2thZ2VDb25maWcgPSB0cnVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIC8vIEV2ZXJ5IGRpc2NvdmVyZWQgd29ya3NwYWNlIChpbmNsdWRpbmcgbm9uLXBhY2thZ2VzLyogbGF5b3V0cyBzdWNoIGFzIGFwcHMvKikgaXMgYSBjaGlsZFxuICAgIC8vIHBhY2thZ2U7IHRoZSBwYWNrYWdlcy8qIGhldXJpc3RpYyBpbnNpZGUgZ2V0UGFja2FnZUNvbmZpZyB3b3VsZCBtaXNjbGFzc2lmeSBhcHBzLyogYXMgcm9vdHMuXG4gICAgY29uc3QgbnVsbGFibGVTdWJQYWNrYWdlQ29uZmlncyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgc3ViRGlyUGF0aHMubWFwKChzdWJEaXJQYXRoKSA9PiBnZXRQYWNrYWdlQ29uZmlnKHN1YkRpclBhdGgsIHsgaXNSb290OiBmYWxzZSB9KSlcbiAgICApO1xuICAgIGNvbnN0IGludmFsaWRTdWJQYWNrYWdlRGlyUGF0aCA9IHN1YkRpclBhdGhzLmZpbmQoXG4gICAgICAoc3ViRGlyUGF0aCwgaW5kZXgpID0+ICFudWxsYWJsZVN1YlBhY2thZ2VDb25maWdzW2luZGV4XSAmJiBmcy5leGlzdHNTeW5jKHBhdGguam9pbihzdWJEaXJQYXRoLCAncGFja2FnZS5qc29uJykpXG4gICAgKTtcbiAgICBpZiAoaW52YWxpZFN1YlBhY2thZ2VEaXJQYXRoKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBTa2lwICR7cm9vdERpclBhdGh9OiAke2ludmFsaWRTdWJQYWNrYWdlRGlyUGF0aH0vcGFja2FnZS5qc29uIGlzIGludmFsaWQuYCk7XG4gICAgICBoYXNJbnZhbGlkUGFja2FnZUNvbmZpZyA9IHRydWU7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3Qgc3ViUGFja2FnZUNvbmZpZ3MgPSBudWxsYWJsZVN1YlBhY2thZ2VDb25maWdzLmZpbHRlcigoY29uZmlnKSA9PiAhIWNvbmZpZyk7XG4gICAgY29uc3QgYWxsUGFja2FnZUNvbmZpZ3MgPSBbcm9vdENvbmZpZywgLi4uc3ViUGFja2FnZUNvbmZpZ3NdO1xuICAgIC8vIFRoZSBtYW5hZ2VkIGlnbm9yZSBydWxlIGlzIHVuYW5jaG9yZWQsIHNvIGEgbmVzdGVkIGNvcHkgKGUuZy4gd29ya2Vycy9hcGkvLmVudi5jbG91ZGZsYXJlKSBpc1xuICAgIC8vIGFzIG11Y2ggYSBsZWFrIGFzIGEgcm9vdCBvbmU7IHRoZSB3aWxkY2FyZCBwYXRoc3BlYyBjb3ZlcnMgZXZlcnkgZGVwdGggaW4gb25lIHF1ZXJ5LlxuICAgIGNvbnN0IHRyYWNrZWRDbG91ZGZsYXJlRW52UGF0aHMgPSBhbGxQYWNrYWdlQ29uZmlncy5zb21lKChjb25maWcpID0+IGNvbmZpZy5pc0Nsb3VkZmxhcmUpXG4gICAgICA/IHNwYXduU3luY0FuZFJldHVyblN0ZG91dChcbiAgICAgICAgICAnZ2l0JyxcbiAgICAgICAgICBbJy1jJywgJ2NvcmUucXVvdGVQYXRoPWZhbHNlJywgJ2xzLWZpbGVzJywgJy0tJywgJy5lbnYuY2xvdWRmbGFyZScsICcqLy5lbnYuY2xvdWRmbGFyZSddLFxuICAgICAgICAgIHJvb3RDb25maWcuZGlyUGF0aFxuICAgICAgICApXG4gICAgICAgICAgLnNwbGl0KCdcXG4nKVxuICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgICAubWFwKChmaWxlUGF0aCkgPT4gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgZmlsZVBhdGgpKVxuICAgICAgOiBbXTtcbiAgICBpZiAodHJhY2tlZENsb3VkZmxhcmVFbnZQYXRocy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBgU0VDVVJJVFkgRVJST1I6IENsb3VkZmxhcmUgY3JlZGVudGlhbHMgbXVzdCBiZSB1bnRyYWNrZWQuIFJlbW92ZSAke3RyYWNrZWRDbG91ZGZsYXJlRW52UGF0aHMuam9pbihcbiAgICAgICAgICAnLCAnXG4gICAgICAgICl9IGZyb20gR2l0LCBwdXJnZSB0aGUgdG9rZW4gZnJvbSBoaXN0b3J5LCBhbmQgcm90YXRlIENMT1VERkxBUkVfQVBJX1RPS0VOIGJlZm9yZSByZXJ1bm5pbmcgd2JmeS5gXG4gICAgICApO1xuICAgICAgaGFzSW52YWxpZFBhY2thZ2VDb25maWcgPSB0cnVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGFiYnJldmlhdGlvblByb21pc2UgPSBmaXhUeXBvcyhyb290Q29uZmlnKTtcblxuICAgIGF3YWl0IGdlbmVyYXRlUmVwb3NpdG9yeU5wbXJjKGFsbFBhY2thZ2VDb25maWdzKTtcblxuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgZm9yIChjb25zdCBjb25maWcgb2YgYWxsUGFja2FnZUNvbmZpZ3MpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGNvbmZpZyk7XG4gICAgICB9XG4gICAgfVxuICAgIGFzc2VydFNhZmVEZXBlbmRlbmN5U291cmNlcyhhbGxQYWNrYWdlQ29uZmlncyk7XG4gICAgLy8gTWFuYWdlZCByZXBvc2l0b3JpZXMgdXNlIEJ1biB3aXRoIG1pc2UgKGFuZCBvcHRpb25hbGx5IGZub3gpLlxuICAgIGNvbnN0IHByZXZpb3VzQnVuR2xvYmFsU3RvcmUgPSByZWFkQnVuR2xvYmFsU3RvcmUocm9vdERpclBhdGgpO1xuICAgIC8vIFJvb3QtbGV2ZWwgaW5zdGFsbCBsYXlvdXQgbXVzdCBjb3ZlciB3b3Jrc3BhY2UgYXBwcyB0b286IE5leHQuanMgY29tbW9ubHkgbGl2ZXMgdW5kZXJcbiAgICAvLyBwYWNrYWdlcy8qIG9yIGFwcHMvKiB3aGlsZSBidW5maWcudG9tbCBleGlzdHMgb25seSBhdCB0aGUgcmVwb3NpdG9yeSByb290LlxuICAgIGNvbnN0IHVzZUdsb2JhbFN0b3JlID0gcmVzb2x2ZUJ1bkdsb2JhbFN0b3JlKGFsbFBhY2thZ2VDb25maWdzLCBwcmV2aW91c0J1bkdsb2JhbFN0b3JlLCBza2lwRGVwcyk7XG4gICAgYXdhaXQgZ2VuZXJhdGVCdW5maWdUb21sKHJvb3RDb25maWcsIHVzZUdsb2JhbFN0b3JlKTtcbiAgICBhd2FpdCBnZW5lcmF0ZU1pc2VUb21sKHJvb3RDb25maWcpO1xuICAgIGF3YWl0IGdlbmVyYXRlRm5veFRvbWwocm9vdENvbmZpZyk7XG4gICAgLy8gUnVuIGFmdGVyIGdlbmVyYXRlRm5veFRvbWwgc28gaXRzIHRyYW5zYWN0aW9uYWwgcmVjaXBpZW50IHN5bmMgY2Fubm90IHJlc3RvcmUgYSBzbmFwc2hvdFxuICAgIC8vIG92ZXIgZGVmaW5pdGlvbnMgaW5zZXJ0ZWQgaGVyZS5cbiAgICBhd2FpdCBlbnN1cmVXYkVudkRlZmluaXRpb25zKHJvb3RDb25maWcsIGFsbFBhY2thZ2VDb25maWdzKTtcbiAgICAvLyBwcm9taXNlUG9vbC5ydW4gcmVzb2x2ZXMgd2hlbiBhIHRhc2sgU1RBUlRTLCBzbyB0aGUgZ2VuZXJhdGVkIGJ1bmZpZy50b21sIGlzIG5vdFxuICAgIC8vIGd1YXJhbnRlZWQgdG8gYmUgb24gZGlzayB5ZXQ7IHRoZSBwcm9iZSBiZWxvdyBtdXN0IG5vdCB2YWxpZGF0ZSBhIHN0YWxlIGNvbmZpZ3VyYXRpb24uXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuXG4gICAgLy8gVGhlIGxheW91dCBtdXN0IGJlIHZlcmlmaWVkIGluc3RhbGxhYmxlIEJFRk9SRSBhbnkgYGJ1biBhZGRgIG11dGF0ZXMgcGFja2FnZS5qc29uIGZpbGVzOlxuICAgIC8vIHBlci1wYWNrYWdlIGluc3RhbGxzIHRvbGVyYXRlIGZhaWx1cmVzIChzcGF3blN5bmMgZGlzY2FyZHMgdGhlaXIgc3RhdHVzKSwgc28gYSBsYXlvdXQgdGhhdFxuICAgIC8vIGNhbm5vdCBpbnN0YWxsIHdvdWxkIHNpbGVudGx5IGRyb3AgZXZlcnkgbWFuYWdlZCBkZXBlbmRlbmN5IHVwZGF0ZSBmb3IgdGhlIHJlc3Qgb2YgdGhlIHJ1bi5cbiAgICAvLyBBIGRvY3Mtb25seSByZXBvc2l0b3J5IGhhcyBubyBtYW5pZmVzdCB0byBwcm9iZSBvbiBpdHMgZmlyc3QgcnVuOyBnZW5lcmF0ZVBhY2thZ2VKc29uIGJlbG93XG4gICAgLy8gY3JlYXRlcyBpdCBiZWZvcmUgdGhlIGF1dGhvcml0YXRpdmUgcmVmcmVzaEJ1bkxvY2sgY2hlY2suXG4gICAgaWYgKFxuICAgICAgIXNraXBEZXBzICYmXG4gICAgICByb290Q29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24gJiZcbiAgICAgICFwcm9iZUlzb2xhdGVkQnVuSW5zdGFsbChyb290RGlyUGF0aCwgcm9vdENvbmZpZywgcHJldmlvdXNCdW5HbG9iYWxTdG9yZSwgdXNlR2xvYmFsU3RvcmUpXG4gICAgKSB7XG4gICAgICAvLyByZWZyZXNoQnVuTG9jayBiZWxvdyBpcyB0aGUgYXV0aG9yaXR5IG9uIHdoZXRoZXIgdGhlIGZpbmFsIGluc3RhbGwgZmFpbGVkLlxuICAgICAgY29uc29sZS53YXJuKGBidW4gaW5zdGFsbCBjdXJyZW50bHkgZmFpbHMgaW4gJHtyb290RGlyUGF0aH0gdW5kZXIgdGhlIGlzb2xhdGVkIGxpbmtlci5gKTtcbiAgICB9XG5cbiAgICBjb25zdCBzaG91bGRSdW5Xb3JrZmxvd3MgPVxuICAgICAgIWlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHJvb3RDb25maWcucmVwb3NpdG9yeSkgJiZcbiAgICAgIChyb290Q29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3Rlci8nKSB8fFxuICAgICAgICByb290Q29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKSk7XG4gICAgLy8gT3RoZXIgb3duZXJzIGNhbm5vdCBjYWxsIHRoZSBvcmdhbml6YXRpb24ncyByZXVzYWJsZSB3b3JrZmxvd3MgKHRoZWlyIHNlY3JldHMgYW5kIHJ1bm5lcnNcbiAgICAvLyBkbyBub3QgZXhpc3QgdGhlcmUpLCBzbyBhbnkgb3RoZXIgR2l0SHViLWhvc3RlZCBOb2RlLmpzIHJlcG9zaXRvcnkgZ2V0cyBzZWxmLWNvbnRhaW5lZFxuICAgIC8vIHdvcmtmbG93cyBpbnN0ZWFkIOKAlCBrZXllZCBvbiByZXBvc2l0b3J5IHN0YXRlLCBuZXZlciBvbiB0aGUgb3duZXIncyBpZGVudGl0eS5cbiAgICAvLyByb290Q29uZmlnLmlzUm9vdDogYSBkaXJlY3Qgd29ya3NwYWNlLWNoaWxkIGludm9jYXRpb24gKGB3YmZ5IDxyZXBvPi9wYWNrYWdlcy88YXBwPmApIGtlZXBzXG4gICAgLy8gaXNSb290IGZhbHNlLCBhbmQgR2l0SHViIGlnbm9yZXMgd29ya2Zsb3cgZmlsZXMgbmVzdGVkIHVuZGVyIGEgcGFja2FnZSBkaXJlY3RvcnkuXG4gICAgY29uc3Qgc2hvdWxkUnVuU2VsZkNvbnRhaW5lZFdvcmtmbG93cyA9XG4gICAgICAhc2hvdWxkUnVuV29ya2Zsb3dzICYmXG4gICAgICAhaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8ocm9vdENvbmZpZy5yZXBvc2l0b3J5KSAmJlxuICAgICAgISFyb290Q29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjonKSAmJlxuICAgICAgcm9vdENvbmZpZy5pc1Jvb3Q7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgYWJicmV2aWF0aW9uUHJvbWlzZS50aGVuKCgpID0+IGdlbmVyYXRlUmVhZG1lKHJvb3RDb25maWcpKSxcbiAgICAgIGdlbmVyYXRlRG9ja2VyaWdub3JlKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVFZGl0b3Jjb25maWcocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUdlbWluaUNvbmZpZyhyb290Q29uZmlnLCBhbGxQYWNrYWdlQ29uZmlncyksXG4gICAgICBnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlSWRlYVNldHRpbmdzKHJvb3RDb25maWcpLFxuICAgICAgZml4UmFpbHdheWlnbm9yZShyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlUmVub3ZhdGVKc29uYyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlUmVsZWFzZXJjKHJvb3RDb25maWcpLFxuICAgICAgLi4uKHNob3VsZFJ1bldvcmtmbG93cyA/IFtnZW5lcmF0ZVdvcmtmbG93cyhyb290Q29uZmlnKV0gOiBbXSksXG4gICAgICAuLi4oc2hvdWxkUnVuU2VsZkNvbnRhaW5lZFdvcmtmbG93cyA/IFtnZW5lcmF0ZVNlbGZDb250YWluZWRXb3JrZmxvd3Mocm9vdENvbmZpZywgYWxsUGFja2FnZUNvbmZpZ3MpXSA6IFtdKSxcbiAgICAgIHNldHVwTGFiZWxzKHJvb3RDb25maWcpLFxuICAgICAgc2V0dXBSZXBvc2l0b3J5UnVsZXNldHMocm9vdENvbmZpZyksXG4gICAgICBzZXR1cEdpdEh1YlNldHRpbmdzKHJvb3RDb25maWcpLFxuICAgICAgLy8gR2l0IGhvb2tzIGFyZSByZXBvc2l0b3J5LWxldmVsIHN0YXRlOiBhIGRpcmVjdCB3b3Jrc3BhY2UtY2hpbGQgaW52b2NhdGlvbiBtdXN0IG5vdCB3cml0ZSBhXG4gICAgICAvLyBjaGlsZCBsZWZ0aG9vay55bWwgb3IgcmVwbGFjZSB0aGUgZW5jbG9zaW5nIHJlcG9zaXRvcnkncyBob29rIGluc3RhbGxhdGlvbi5cbiAgICAgIC4uLihyb290Q29uZmlnLmlzUm9vdCA/IFtnZW5lcmF0ZUxlZnRob29rKHJvb3RDb25maWcsIGFsbFBhY2thZ2VDb25maWdzKV0gOiBbXSksXG4gICAgXSk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICAgIC8vIEFmdGVyIHRoZSB3b3JrZmxvdyBnZW5lcmF0b3IgKGFuZCBpdHMgcG9vbGVkIHdyaXRlcykgc28gdGhlIGluc3RydWN0aW9uIGZpbGVzIGRlc2NyaWJlIHRoZVxuICAgIC8vIGZpbmFsaXplZCB3b3JrZmxvdyBmaWxlcyBpbnN0ZWFkIG9mIGxhZ2dpbmcgb25lIHJ1biBiZWhpbmQuXG4gICAgYXdhaXQgZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucyhyb290Q29uZmlnLCBhbGxQYWNrYWdlQ29uZmlncyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuXG4gICAgY29uc3QgcHJvbWlzZXM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuICAgIGZvciAoY29uc3QgY29uZmlnIG9mIGFsbFBhY2thZ2VDb25maWdzKSB7XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0VGVzdCkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGZpeFBsYXl3cmlnaHRDb25maWcoY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZml4TmV4dENvbmZpZ0pzb24oY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5jaGFrcmEpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChmaXhDaGFrcmFUb2FzdGVyKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgYXdhaXQgZ2VuZXJhdGVHaXRpZ25vcmUoY29uZmlnLCByb290Q29uZmlnKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgICAgIGlmICghY29uZmlnLmlzUm9vdCAmJiAhY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoZG9lc0NvbnRhaW5KYXZhKGNvbmZpZykpIGF3YWl0IGdlbmVyYXRlUHJldHRpZXJpZ25vcmUoY29uZmlnKTtcbiAgICAgIGF3YWl0IGdlbmVyYXRlUGFja2FnZUpzb24oY29uZmlnLCByb290Q29uZmlnLCBza2lwRGVwcyk7XG5cbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Wc2NvZGVTZXR0aW5nc0pzb24pIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZVZzY29kZVNldHRpbmdzKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKGRvZXNDb250YWluSnNPclRzKGNvbmZpZykpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZVRzY29uZmlnKGNvbmZpZykpO1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlT3hmbXRDb25maWcoY29uZmlnKSk7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVPeGxpbnRDb25maWcoY29uZmlnLCByb290Q29uZmlnKSk7XG4gICAgICB9IGVsc2UgaWYgKCFjb25maWcuaXNSb290ICYmIGNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uICYmIGRvZXNDb250YWluSnNPclRzKHJvb3RDb25maWcpKSB7XG4gICAgICAgIC8vIE1vbm9yZXBvIHZlcmlmaWNhdGlvbiBjYW4gaW52b2tlIG94bGludCBmcm9tIGV2ZXJ5IHdvcmtzcGFjZS4gR2l2ZVxuICAgICAgICAvLyBub24tY29kZSBwYWNrYWdlcyBhIGxvY2FsIGNvbmZpZyBzbyBveGxpbnQgZG9lcyBub3QgY2xpbWIgdG8gdGhlXG4gICAgICAgIC8vIHJvb3QgY29uZmlnIGFuZCByZWplY3Qgcm9vdC1vbmx5IHR5cGUtYXdhcmUgb3B0aW9ucyBmcm9tIGEgcGFja2FnZSBjd2QuXG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVPeGxpbnRDb25maWcoY29uZmlnLCByb290Q29uZmlnKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5weXJpZ2h0KSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbihjb25maWcpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgICAvLyBSdW4gYWZ0ZXIgZXZlcnkgcG9vbGVkIGdlbmVyYXRvciB3cml0ZSBzbyBub3JtYWxpemF0aW9uIGNhbm5vdCBvdmVyd3JpdGUgYSBjb25jdXJyZW50XG4gICAgLy8gdXBkYXRlLCBhbmQgYmVmb3JlIGNsZWFudXAgc28gZm9ybWF0dGVyIG1ldGFkYXRhIGNhY2hlcyBvYnNlcnZlIHRoZSBjaGFuZ2VkIGZpbGVzLlxuICAgIHJlbm9ybWFsaXplVHJhY2tlZFRleHRGaWxlcyhyb290RGlyUGF0aCk7XG4gICAgLy8gUmVmcmVzaCBsb2NrIGZpbGVzXG4gICAgdHJ5IHtcbiAgICAgIHJlZnJlc2hCdW5Mb2NrKHJvb3REaXJQYXRoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gQSBmYWlsZWQgaW5zdGFsbCBtdXN0IGZhaWwgdGhlIENMSTogZXhpdGluZyAwIHdpdGggYSBzdGFsZSBvciBtaXNzaW5nIEJ1biBsb2NrZmlsZSB3b3VsZFxuICAgICAgLy8gaGlkZSBhIGJyb2tlbiBtYW5hZ2VkIGNvbmZpZ3VyYXRpb24uXG4gICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gcmVmcmVzaCB0aGUgQnVuIGxvY2tmaWxlOicsIChlcnJvciBhcyBFcnJvciB8IHVuZGVmaW5lZCk/Lm1lc3NhZ2UgPz8gZXJyb3IpO1xuICAgICAgaGFzSW52YWxpZFBhY2thZ2VDb25maWcgPSB0cnVlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgLy8gQnVuIHdyaXRlcyBidW4ubG9jayBiZWZvcmUgbGlmZWN5Y2xlIHNjcmlwdHMsIHNvIGEgZmFpbGVkIGluc3RhbGwgY2FuIHN0aWxsIGxlYXZlIEd1YXJkXG4gICAgICAvLyBVUkxzIGJlaGluZC4gTm9ybWFsaXplIGJvdGggc3VjY2VzcyBhbmQgZmFpbHVyZSBvdXRwdXQgd2l0aG91dCByZXBsYWNpbmcgdGhlIGluc3RhbGwgZXJyb3IuXG4gICAgICBjb25zdCBub3JtYWxpemVkTG9ja2ZpbGVQYXRoID0gbm9ybWFsaXplQnVuTG9ja2ZpbGUocm9vdERpclBhdGgpO1xuICAgICAgaWYgKG5vcm1hbGl6ZWRMb2NrZmlsZVBhdGgpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGBSZW1vdmVkIFRha3VtaSBHdWFyZCBwcm94eSBVUkxzIGZyb20gJHtub3JtYWxpemVkTG9ja2ZpbGVQYXRofSB0byBrZWVwIGl0IHJlZ2lzdHJ5LWFnbm9zdGljLmApO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gbm9ybWFsaXplIHRoZSBCdW4gbG9ja2ZpbGU6JywgKGVycm9yIGFzIEVycm9yIHwgdW5kZWZpbmVkKT8ubWVzc2FnZSA/PyBlcnJvcik7XG4gICAgICBoYXNJbnZhbGlkUGFja2FnZUNvbmZpZyA9IHRydWU7XG4gICAgfVxuICAgIHNwYXduU3luYygnYnVuJywgWydjbGVhbnVwJ10sIHJvb3REaXJQYXRoKTtcbiAgfVxuICByZXR1cm4gaGFzSW52YWxpZFBhY2thZ2VDb25maWc7XG59XG5cbi8qKlxuICogUHJvYmVzIGBidW4gaW5zdGFsbGAgdW5kZXIgdGhlIGlzb2xhdGVkIGxpbmtlci4gQW4gaW5jb21wYXRpYmlsaXR5IG11c3QgYmUgZml4ZWQgaW4gdGhlXG4gKiByZXBvc2l0b3J5IG9yIGluIHdiZnkncyBtYW5hZ2VkIGxpc3RzLCBuZXZlciBieSBzd2l0Y2hpbmcgdGhlIGxpbmtlci4gUmV0dXJucyBmYWxzZSB3aGVuIHRoZVxuICogaW5zdGFsbCBmYWlscy5cbiAqL1xuZnVuY3Rpb24gcHJvYmVJc29sYXRlZEJ1bkluc3RhbGwoXG4gIHJvb3REaXJQYXRoOiBzdHJpbmcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHByZXZpb3VzR2xvYmFsU3RvcmU6IGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gIHVzZUdsb2JhbFN0b3JlOiBib29sZWFuXG4pOiBib29sZWFuIHtcbiAgLy8gQSBsYXlvdXQgc3dpdGNoIG11c3QgcHJvYmUgZnJvbSBhIGNsZWFuIHRyZWUgYmVjYXVzZSBCdW4gZG9lcyBub3QgcmVtb3ZlIHRoZSBwcmV2aW91cyBsYXlvdXQncyBsZWZ0b3ZlcnMuXG4gIGlmIChwcmV2aW91c0dsb2JhbFN0b3JlICE9PSB1c2VHbG9iYWxTdG9yZSkge1xuICAgIHJlbW92ZU5vZGVNb2R1bGVzKHJvb3REaXJQYXRoLCByb290Q29uZmlnKTtcbiAgfVxuICAvLyBSZXRyeSBvbmNlIHNvIGEgdHJhbnNpZW50IGZhaWx1cmUgKHJlZ2lzdHJ5IGhpY2N1cCwgZmxha3kgbGlmZWN5Y2xlIHNjcmlwdCkgZG9lcyBub3RcbiAgLy8gbWFzcXVlcmFkZSBhcyBhIGxheW91dCBpbmNvbXBhdGliaWxpdHkuXG4gIGlmIChzcGF3blN5bmNBbmRSZXR1cm5TdGF0dXMoJ2J1bicsIFsnaW5zdGFsbCddLCByb290RGlyUGF0aCwgMSkgPT09IDApIHJldHVybiB0cnVlO1xuXG4gIC8vIENsZWFuIHVwIHRoZSBmYWlsZWQgYXR0ZW1wdCBzbyBsYXRlciBpbnN0YWxscyBkbyBub3QgcnVuIG9uIGEgcG9sbHV0ZWQgdHJlZS5cbiAgcmVtb3ZlTm9kZU1vZHVsZXMocm9vdERpclBhdGgsIHJvb3RDb25maWcpO1xuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZU5vZGVNb2R1bGVzKHJvb3REaXJQYXRoOiBzdHJpbmcsIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiB2b2lkIHtcbiAgLy8gQ292ZXIgZXZlcnkgZGVjbGFyZWQgd29ya3NwYWNlOiBsZWZ0b3ZlcnMgY2FuIGtlZXAgcGhhbnRvbSBkZXBlbmRlbmNpZXMgcmVzb2x2YWJsZS5cbiAgY29uc3Qgbm9kZU1vZHVsZXNQYXRocyA9IFtcbiAgICBwYXRoLnJlc29sdmUocm9vdERpclBhdGgsICdub2RlX21vZHVsZXMnKSxcbiAgICAuLi5bLi4uZ2V0V29ya3NwYWNlUGFja2FnZURpcnMocm9vdENvbmZpZykudmFsdWVzKCldLm1hcCgod29ya3NwYWNlRGlyKSA9PlxuICAgICAgcGF0aC5yZXNvbHZlKHJvb3REaXJQYXRoLCB3b3Jrc3BhY2VEaXIsICdub2RlX21vZHVsZXMnKVxuICAgICksXG4gIF07XG4gIC8vIE5ldmVyIGRlbGV0ZSB0aHJvdWdoIGEgd29ya3NwYWNlIHN5bWxpbmsgdGhhdCBlc2NhcGVzIHRoaXMgcmVwb3NpdG9yeS5cbiAgY29uc3QgcmVhbFJvb3REaXJQYXRoID0gZnMucmVhbHBhdGhTeW5jKHJvb3REaXJQYXRoKTtcbiAgZm9yIChjb25zdCBub2RlTW9kdWxlc1BhdGggb2Ygbm9kZU1vZHVsZXNQYXRocykge1xuICAgIGNvbnN0IHJlYWxQYXJlbnREaXJQYXRoID0gaWdub3JlRXJyb3IoKCkgPT4gZnMucmVhbHBhdGhTeW5jKHBhdGguZGlybmFtZShub2RlTW9kdWxlc1BhdGgpKSk7XG4gICAgaWYgKFxuICAgICAgIXJlYWxQYXJlbnREaXJQYXRoIHx8XG4gICAgICAocmVhbFBhcmVudERpclBhdGggIT09IHJlYWxSb290RGlyUGF0aCAmJiAhcmVhbFBhcmVudERpclBhdGguc3RhcnRzV2l0aChyZWFsUm9vdERpclBhdGggKyBwYXRoLnNlcCkpXG4gICAgKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgZnMucm1TeW5jKG5vZGVNb2R1bGVzUGF0aCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlZnJlc2hCdW5Mb2NrKHJvb3REaXJQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgLy8gd2JmeSBzaG91bGQgdXBkYXRlIG9ubHkgdGhlIHBhY2thZ2VzIGl0IGV4cGxpY2l0bHkgbWFuYWdlcyB0aHJvdWdoIGJ1biBhZGQuXG4gIC8vIFJ1bm5pbmcgYnVuIHVwZGF0ZSBoZXJlIHJlZnJlc2hlcyB1bnJlbGF0ZWQgYXBwbGljYXRpb24gZGVwZW5kZW5jaWVzIGFuZFxuICAvLyBjYW4gY2hhbmdlIHByb2R1Y3QgYmVoYXZpb3IsIHNvIGtlZXAgdGhlIGV4aXN0aW5nIGxvY2sgYW5kIHJlY29uY2lsZSBpdC5cbiAgY29uc3Qgc3RhdHVzID0gc3Bhd25TeW5jQW5kUmV0dXJuU3RhdHVzKCdidW4nLCBbJ2luc3RhbGwnXSwgcm9vdERpclBhdGgsIDEpO1xuICBpZiAoc3RhdHVzID09PSAwKSByZXR1cm47XG4gIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHJlZnJlc2ggQnVuIGxvY2tmaWxlOiBidW4gaW5zdGFsbCBleGl0ZWQgd2l0aCBzdGF0dXMgJHtzdGF0dXN9YCk7XG59XG5cbmF3YWl0IG1haW4oKTtcbiJdLCJ4X2dvb2dsZV9pZ25vcmVMaXN0IjpbNDUsNDYsNDcsNDgsNDksNTBdLCJtYXBw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
|
|
517
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6WyJmcyIsImZzIiwicGFyc2VKc29uYyIsImZzcCIsInJlbGVhc2VBZ2VHYXRlLmRheXMiLCJyZWxlYXNlQWdlR2F0ZS5leGNsdWRlcyIsIm5ld0NvbnRlbnQiLCJjb21tb25Db250ZW50IiwibmV3Q29udGVudCIsImNoaWxkX3Byb2Nlc3MiLCJjb21tb25Db250ZW50IiwiY2hpbGRfcHJvY2VzcyIsInNvcnRPYmplY3RLZXlzIiwiZ2l0SG9va3MiLCJkZXRlY3ROZXdsaW5lIiwiZGVwZW5kZW5jeVNlY3Rpb25LZXlzIiwiY29yZSIsIm1hbmFnZWRDb25maWdCbG9ja3MiLCJnZXRDb25maWdDb250ZW50Il0sInNvdXJjZXMiOlsiLi4vLi4vc2hhcmVkLWxpYi9zcmMvZ2l0aHViVGVtcGxhdGVzLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi9zcmMvc2xlZXAudHMiLCIuLi8uLi9zaGFyZWQtbGliL3NyYy9lcnJvci50cyIsIi4uLy4uL3NoYXJlZC1saWIvc3JjL3RleHQudHMiLCIuLi8uLi9zaGFyZWQtbGliL3NyYy90ZXN0aW5nUnVsZXMudHMiLCIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL2J1bldvcmtzcGFjZXMudHMiLCIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL2J1bkxvY2tmaWxlLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9kb2NrZXJmaWxlLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9nbG9iLnRzIiwiLi4vc3JjL29wdGlvbnMudHMiLCIuLi9zcmMvbG9nZ2VyLnRzIiwiLi4vc3JjL3V0aWxzL2ZzVXRpbC50cyIsIi4uL3NyYy91dGlscy9wcm9taXNlUG9vbC50cyIsIi4uL3NyYy91dGlscy90eXBlc2NyaXB0QXBpLnRzIiwiLi4vc3JjL2ZpeGVycy9uZXh0Q29uZmlnLnRzIiwiLi4vc3JjL2ZpeGVycy9jaGFrcmFUb2FzdGVyLnRzIiwiLi4vc3JjL2ZpeGVycy9wbGF5d3JpZ2h0Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZm5veFRvbWwudHMiLCIuLi9zcmMvdXRpbHMvbWVyZ2VVdGlsLnRzIiwiLi4vc3JjL3V0aWxzL29iamVjdFV0aWwudHMiLCIuLi9zcmMvdXRpbHMvd29ya3NwYWNlVXRpbC50cyIsIi4uL3NyYy91dGlscy9wcml2YXRlUGFja2FnZXMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy93b3JrZmxvd1J1bm5lclBvbGljeS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3dvcmtmbG93LnRzIiwiLi4vc3JjL2ZpeGVycy90eXBvcy50cyIsIi4uL3NyYy91dGlscy9naXRodWJVdGlsLnRzIiwiLi4vc3JjL3V0aWxzL2pzb25jVXRpbC50cyIsIi4uL3NyYy91dGlscy9tYW5hZ2VkU2NyaXB0U2VnbWVudC50cyIsIi4uL3NyYy91dGlscy9zcGF3blV0aWwudHMiLCIuLi9zcmMvcGFja2FnZUNvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2FnZW50cy50cyIsIi4uL2NvbmZpZ3MvcmVsZWFzZUFnZUdhdGUuanNvbiIsIi4uL3NyYy9nZW5lcmF0b3JzL2J1bmZpZy50cyIsIi4uL3NyYy91dGlscy9pZ25vcmVGaWxlVXRpbC50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2RvY2tlcmlnbm9yZS50cyIsIi4uL3NyYy91dGlscy9leHRlbnNpb25zLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZWRpdG9yY29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2VtaW5pQ29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2l0YXR0cmlidXRlcy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2dpdGlnbm9yZS50cyIsIi4uL3NyYy91dGlscy92ZXJzaW9uLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2xvYmFsUmVsZWFzZUFnZUdhdGUudHMiLCIuLi9zcmMvdXRpbHMvcGFja2FnZUNhcGFiaWxpdGllcy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2lkZWEudHMiLCIuLi9zcmMvdXRpbHMvZ2VuSTE4blRzLnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLmJ1bi9pbnN0YWxsL2NhY2hlL2xpbmtzL3NvcnQtb2JqZWN0LWtleXNAMi4xLjAtMThkZjJmODM3ZTZlYzI5YS9ub2RlX21vZHVsZXMvc29ydC1vYmplY3Qta2V5cy9pbmRleC5qcyIsIi4uLy4uLy4uLy4uLy4uLy4uLy5idW4vaW5zdGFsbC9jYWNoZS9saW5rcy9kZXRlY3QtaW5kZW50QDcuMC4yLTZiNzVkYzBmNTY1MzNiZDkvbm9kZV9tb2R1bGVzL2RldGVjdC1pbmRlbnQvaW5kZXguanMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uYnVuL2luc3RhbGwvY2FjaGUvbGlua3MvZGV0ZWN0LW5ld2xpbmVANC4wLjEtNWRhOWRmNjUxMjVlZTc5NS9ub2RlX21vZHVsZXMvZGV0ZWN0LW5ld2xpbmUvaW5kZXguanMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uYnVuL2luc3RhbGwvY2FjaGUvbGlua3MvZ2l0LWhvb2tzLWxpc3RANC4yLjEtNmNhMmIyNjlkOTE2MzMyZS9ub2RlX21vZHVsZXMvZ2l0LWhvb2tzLWxpc3QvaW5kZXguanNvbiIsIi4uLy4uLy4uLy4uLy4uLy4uLy5idW4vaW5zdGFsbC9jYWNoZS9saW5rcy9pcy1wbGFpbi1vYmpANC4xLjAtNDdmZGRkNzcwNjQ4ZTU3Ny9ub2RlX21vZHVsZXMvaXMtcGxhaW4tb2JqL2luZGV4LmpzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLmJ1bi9pbnN0YWxsL2NhY2hlL2xpbmtzL3NvcnQtcGFja2FnZS1qc29uQDQuMC4wLTgzZDBhZmZjYmI5YjNjODUvbm9kZV9tb2R1bGVzL3NvcnQtcGFja2FnZS1qc29uL2luZGV4LmpzIiwiLi4vc3JjL2dpdGh1Yi9jb21taXQudHMiLCIuLi9zcmMvdXRpbHMvdHNjb25maWdCYXNlLnRzIiwiLi4vc3JjL3V0aWxzL3dpbGxib29zdGVyQ29uZmlnc1V0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9wYWNrYWdlSnNvbi50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2xlZnRob29rLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvY29uZmlnQ29udGVudC50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL21hbmFnZWRDb25maWdCbG9jay50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL294Zm10Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvb3hsaW50Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcHJldHRpZXJpZ25vcmUudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9weXJpZ2h0Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmFpbHdheWlnbm9yZS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3JlYWRtZS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3JlbGVhc2VyYy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3Jlbm92YXRlSnNvbmMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy90c2NvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3VzZXJBZ2VudENvbmZpZ3MudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy92c2NvZGVTZXR0aW5ncy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3diRW52LnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvc2VsZkNvbnRhaW5lZFdvcmtmbG93LnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvbWlzZVRvbWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9ucG1yYy50cyIsIi4uL3NyYy9naXRodWIvbGFiZWwudHMiLCIuLi9zcmMvZ2l0aHViL3J1bGVzZXQudHMiLCIuLi9zcmMvZ2l0aHViL3NldHRpbmdzLnRzIiwiLi4vc3JjL2dpdGh1Yi90ZW1wbGF0ZS50cyIsIi4uL3NyYy91dGlscy9kZXBlbmRlbmN5U291cmNlUG9saWN5LnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQSBzZWN0aW9uIG9mIGEgUFIgb3IgaXNzdWUgYm9keTogaXRzIGhlYWRpbmcgYW5kIHdoYXQgdGhlIHNlY3Rpb24gbXVzdCBzdGF0ZS4gYHJlcXVpcmVtZW50YFxuICogc3RhcnRzIGxvd2VyY2FzZSBhbmQgZW5kcyB3aXRob3V0IHB1bmN0dWF0aW9uLCBzbyB0aGF0IGl0IHJlYWRzIGJvdGggYXMgYSBwbGFjZWhvbGRlciBzZW50ZW5jZVxuICogKGNhcGl0YWxpemVkLCB3aXRoIGEgcGVyaW9kIGFwcGVuZGVkKSBhbmQgYXMgYSBjaGVja2xpc3QgY2xhdXNlIGFmdGVyIHRoZSBoZWFkaW5nLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRlbXBsYXRlU2VjdGlvbiB7XG4gIHJlYWRvbmx5IGhlYWRpbmc6IHN0cmluZztcbiAgcmVhZG9ubHkgcmVxdWlyZW1lbnQ6IHN0cmluZztcbn1cblxuLyoqIFNlY3Rpb25zIG9mIGEgcHVsbCByZXF1ZXN0IGJvZHksIGluIHRoZSBvcmRlciB0aGV5IGFwcGVhciBpbiB0aGUgUFIgdGVtcGxhdGUuICovXG5leHBvcnQgY29uc3QgUFVMTF9SRVFVRVNUX1NFQ1RJT05TOiByZWFkb25seSBUZW1wbGF0ZVNlY3Rpb25bXSA9IFtcbiAge1xuICAgIGhlYWRpbmc6ICdXaHknLFxuICAgIHJlcXVpcmVtZW50OiAndGhlIHByb2JsZW0sIHdpdGggdGhlIG51bWJlcnMgb3Igb2JzZXJ2YXRpb25zIGJlaGluZCBpdCwgYW5kIHdoeSB0aGlzIGFwcHJvYWNoIG92ZXIgdGhlIGFsdGVybmF0aXZlcycsXG4gIH0sXG4gIHtcbiAgICBoZWFkaW5nOiAnUmVxdWlyZW1lbnRzJyxcbiAgICByZXF1aXJlbWVudDpcbiAgICAgIFwidGhlIHJlcXVpcmVtZW50cyB0aGUgY2hhbmdlIG11c3Qgc2F0aXNmeSBhbmQgdGhlIGd1YXJhbnRlZXMgaXQgbXVzdCBrZWVwIGFzIHRoZXkgc3RhbmQgbm93LCBvbmUgcGVyIGxpbmUsIGVhY2ggbWFya2VkIGByZXF1aXJlZGAgKGFza2VkIGZvciBieSB0aGUgcmVxdWVzdGVyLCBvciBhbiBleGlzdGluZyBjb250cmFjdCBjYWxsZXJzIGRlcGVuZCBvbikgb3IgYGNob3NlbmAgKHRoZSBpbXBsZW1lbnRlcidzIG93biBkZWNpc2lvbiB3aXRoIHRoZSByZWFzb24gdGhhdCBkZWNpZGVkIGl0LCB3aGljaCBhIHNpbXBsZXIgZGVzaWduIG1heSByZXBsYWNlKTsgc3RhdGUgdGhlIHJlcXVlc3RlcidzIGluc3RydWN0aW9ucyBpbiB0aGUgcmVxdWVzdGVyJ3MgdGVybXMsIHdoZXRoZXIgdGhleSBjYW1lIGZyb20gYW4gaXNzdWUgb3IgYSBjb252ZXJzYXRpb24sIGFuZCBrZWVwIGVhY2ggbGluZSBhcyBpdCBpcyB1bnRpbCB0aGUgcmVxdWVzdGVyIG92ZXJyaWRlcyBvciB3aXRoZHJhd3MgdGhlIGluc3RydWN0aW9uIGJlaGluZCBpdCBvciB0aGUgZGVjaXNpb24gYmVoaW5kIGl0IGNoYW5nZXMsIGFuZCB0aGVuIHJld3JpdGUgb3IgcmVtb3ZlIHRoYXQgbGluZSBpbnN0ZWFkIG9mIGFkZGluZyBvbmUgYmVzaWRlIGl0XCIsXG4gIH0sXG4gIHtcbiAgICBoZWFkaW5nOiAnQ3VzdG9tZXIgU3VtbWFyeScsXG4gICAgcmVxdWlyZW1lbnQ6XG4gICAgICAnYmVoYXZpb3IsIHdvcmtmbG93LCBvciB1c2VyLXZpc2libGUgY2hhbmdlcywgd3JpdHRlbiBmb3IgcmVhZGVycyB3aG8ga25vdyBub3RoaW5nIGFib3V0IHRoZSBpbXBsZW1lbnRhdGlvbicsXG4gIH0sXG4gIHtcbiAgICBoZWFkaW5nOiAnVGVjaG5pY2FsIFN1bW1hcnknLFxuICAgIHJlcXVpcmVtZW50OlxuICAgICAgJ2RlY2lzaW9ucyBhbmQgdGhlaXIgcmVhc29ucywgZGF0YSBmbG93LCB3aGVyZSB0byBsb29rICh0aGUgZmlsZXMgdGhhdCBtYXR0ZXIgbW9zdCksIGFuZCB3aGF0IHRvIGNoZWNrIGhhcmRlc3Q6IHRoZSBwYXJ0cyB3aG9zZSBjb3JyZWN0bmVzcyBpcyBhcmd1ZWQgcmF0aGVyIHRoYW4gcHJvdmVuJyxcbiAgfSxcbiAge1xuICAgIGhlYWRpbmc6ICdUZXN0aW5nJyxcbiAgICByZXF1aXJlbWVudDogJ2NvbW1hbmRzIHJ1biwgdGVzdHMgYWRkZWQsIGFuZCB3aGF0IHdhcyBOT1QgZXhlcmNpc2VkIGFuZCB3aHknLFxuICB9LFxuICB7XG4gICAgaGVhZGluZzogJ05vdGVzJyxcbiAgICByZXF1aXJlbWVudDogJ2tub3duIGxpbWl0YXRpb25zLCBjb21wYXRpYmlsaXR5IGFuZCBtaWdyYXRpb24sIGZvbGxvdy11cCB3b3JrOyBkZWxldGUgdGhpcyBzZWN0aW9uIGlmIHRoZXJlIGlzIG5vbmUnLFxuICB9LFxuXTtcblxuLyoqXG4gKiBIb3cgYSB0b29sIHRoYXQgd3JpdGVzIG9yIHJld3JpdGVzIGEgUFIgYm9keSBkZXJpdmVzIGl0IGZyb20gdGhlIHJlcG9zaXRvcnkncyBQUiB0ZW1wbGF0ZSwgYXNcbiAqIG1hcmtkb3duIGJ1bGxldHMgZm9yIGFuIGFnZW50J3MgaW5zdHJ1Y3Rpb25zLiBTdGF0ZWQgb25jZSBoZXJlIGFuZCByZW5kZXJlZCBieSBldmVyeSB3cml0ZXIgKHRoZVxuICogZ2VuZXJhdGVkIGFnZW50IGluc3RydWN0aW9ucywgdGhlIFBSLWRyYWZ0aW5nIHNraWxscykgc28gdGhlIHdyaXRlcnMgY2Fubm90IGRyaWZ0IGFwYXJ0OyB0aGVcbiAqIHRlbXBsYXRlLWxlc3MgYnJhbmNoIGxldHMgdGhlIHNhbWUgdGV4dCBzZXJ2ZSByZXBvc2l0b3JpZXMgb3V0c2lkZSB0aGUgb3JnYW5pemF0aW9uLlxuICovXG5jb25zdCBQVUxMX1JFUVVFU1RfVEVNUExBVEVfUlVMRVMgPSBgLSBCYXNlIHRoZSBQUiBib2R5IG9uIFxcYC5naXRodWIvcHVsbF9yZXF1ZXN0X3RlbXBsYXRlLm1kXFxgIHdoZW4gY3JlYXRpbmcgb3IgdXBkYXRpbmcgYSBQUiwgZXZlbiB3aGVuIGEgc2tpbGwgb3Igd29ya2Zsb3cgc3VwcGxpZXMgaXRzIG93biBza2VsZXRvbjoga2VlcCB0aGUgdGVtcGxhdGUncyBoZWFkaW5ncyBpbiBvcmRlciwgZmlsbCBlYWNoIHNlY3Rpb24gd2l0aCB3aGF0IGl0cyBwbGFjZWhvbGRlciBjb21tZW50IGFza3MgZm9yIGF0IGEgbGVuZ3RoIGZpdHRpbmcgdGhlIGNoYW5nZSAoYSBzZW50ZW5jZSBmb3IgYSBzbWFsbCBjaGFuZ2UsIG51bWJlcmVkIHN1YnNlY3Rpb25zIGZvciBhIGxhcmdlIG9uZSksIGFuZCBkZWxldGUgdGhlIHBsYWNlaG9sZGVyIGNvbW1lbnRzIGFuZCBhbiBlbXB0eSBOb3RlcyBzZWN0aW9uLiBXaXRob3V0IGEgdGVtcGxhdGUsIHVzZSBubyBmaXhlZCBoZWFkaW5nczogc3RhdGUgdGhlIHNjb3BlLCB0aGUgbW90aXZhdGlvbiwgYW5kIHRoZSB2ZXJpZmljYXRpb24gY29uY2lzZWx5LlxuLSBTdGFydCB0aGUgYm9keSB3aXRoIFxcYENsb3NlICM8bj5cXGAgb25seSB3aGVuIHRoZSBQUiByZXNvbHZlcyBhbiBleGlzdGluZyBpc3N1ZS5gO1xuXG4vKipcbiAqIEhvdyBhIHRvb2wgdGhhdCB3cml0ZXMgb3IgcmV3cml0ZXMgYSBQUiBib2R5IGZpbGxzIHRoZSBSZXF1aXJlbWVudHMgc2VjdGlvbiBvZlxuICogYFBVTExfUkVRVUVTVF9TRUNUSU9OU2AsIGFzIG1hcmtkb3duIGJ1bGxldHMgZm9yIGFuIGFnZW50J3MgaW5zdHJ1Y3Rpb25zLiBTa2lsbHMgdGhhdCBkcmFmdCBQUlxuICogYm9kaWVzIHJlbmRlciB0aGlzIHRleHQgaW5zdGVhZCBvZiByZXN0YXRpbmcgaXQsIHNvIHRoZSB3cml0ZXJzIGFuZCB0aGUgcmV2aWV3ZXJzIHRoYXQgcmVhZCB0aGVcbiAqIHNlY3Rpb24gYXMgdGhlIGJvdW5kYXJ5IGEgZml4IG11c3Qga2VlcCBuZXZlciBkaXNhZ3JlZSBvbiB3aGF0IGEgbGluZSBtZWFucy5cbiAqL1xuZXhwb3J0IGNvbnN0IFBVTExfUkVRVUVTVF9SRVFVSVJFTUVOVFNfUlVMRVMgPSBgLSBSZXF1aXJlbWVudHMgc2VjdGlvbjogdGhlIHJlcXVpcmVtZW50cyBpbiBmb3JjZSBub3csIG9uZSBsaW5lIHBlciByZXF1aXJlbWVudCwgdGFrZW4gZnJvbSB0aGUgcmVxdWVzdGVyJ3MgaW5zdHJ1Y3Rpb25zIGluIHRoZSByZXF1ZXN0ZXIncyB0ZXJtcyAodGhlIGlzc3VlLCB0aGUgY29udmVyc2F0aW9uIHRoYXQgYXNrZWQgZm9yIHRoZSBjaGFuZ2UpLCBlYWNoIG1hcmtlZCBcXGByZXF1aXJlZFxcYCAoYXNrZWQgZm9yLCBvciBhbiBleGlzdGluZyBjb250cmFjdCBjYWxsZXJzIGRlcGVuZCBvbikgb3IgXFxgY2hvc2VuXFxgICh5b3VyIG93biBkZWNpc2lvbiB3aXRoIHRoZSByZWFzb24gdGhhdCBkZWNpZGVkIGl0LCB3aGljaCBhIHNpbXBsZXIgZGVzaWduIG1heSByZXBsYWNlKS4gTmV2ZXIgaW5mZXIgYSByZXF1aXJlbWVudCBmcm9tIHRoZSBkaWZmOiB3aGVuIG5vIGlzc3VlLCBQUiBtZXNzYWdlLCBvciBjb252ZXJzYXRpb24gc3RhdGVzIHRoZSByZXF1ZXN0LCB3cml0ZSBcXGByZXF1aXJlZDogbm90IHJlY29yZGVkIOKAlCBhc2sgdGhlIHJlcXVlc3RlclxcYCBhcyB0aGUgb25seSByZXF1ZXN0LWRlcml2ZWQgbGluZSAoYSBcXGByZXF1aXJlZFxcYCBsaW5lIGZvciBhbiBleGlzdGluZyBjb250cmFjdCBjYWxsZXJzIGRlcGVuZCBvbiBtYXkgc3RpbGwgYmUgbGlzdGVkKSBhbmQgc2F5IHNvIGluIE5vdGVzLlxuLSBDdXJyZW50LXN0YXRlIHJ1bGU6IGFuIGV4aXN0aW5nIFJlcXVpcmVtZW50cyBzZWN0aW9uIHJlY29yZHMgd2hhdCB0aGUgcmVxdWVzdGVyIGFza2VkIGZvciBhbmQgd2hhdCB3YXMgZGVjaWRlZCBhcyBpdCBzdGFuZHMgbm93OyBpdCBpcyBuZWl0aGVyIGEgZGVzY3JpcHRpb24gb2YgdGhlIGRpZmYgbm9yIGEgbG9nIG9mIGhvdyB0aGUgcmVxdWVzdCBldm9sdmVkLiBLZWVwIGVhY2ggbGluZSBhcyBpdCBpcyB1bnRpbCB0aGUgcmVxdWVzdGVyIG92ZXJyaWRlcyBvciB3aXRoZHJhd3MgdGhlIGluc3RydWN0aW9uIGJlaGluZCBpdCBvciB0aGUgZGVjaXNpb24gYmVoaW5kIGl0IGNoYW5nZXMsIGFuZCB0aGVuIHJld3JpdGUgb3IgcmVtb3ZlIHRoYXQgbGluZSBpbnN0ZWFkIG9mIGFwcGVuZGluZyBhIGxpbmUgYmVzaWRlIGl0OyB3aXRoIG5vIGluc3RydWN0aW9ucyBhdmFpbGFibGUsIGtlZXAgdGhlIHJlcXVlc3Rlci1kZXJpdmVkIGxpbmVzIHVuY2hhbmdlZC4gTmV2ZXIgbWFyayB3aGVuIGEgbGluZSB3YXMgYWRkZWQgKGUuZy4sIFwiKGFkZGVkKVwiKSwgYW5kIGFkZCBhIFxcYGNob3NlblxcYCBsaW5lIGZvciBlYWNoIG5ldyBkZWNpc2lvbi4gV2hlbiB0aGUgY3VycmVudCBkZXNpZ24gY2Fubm90IGJlIHVuZGVyc3Rvb2Qgd2l0aG91dCB0aGUgY2hhbmdlIG9mIGRpcmVjdGlvbiwgc3RhdGUgaXQgaW4gb25lIHNlbnRlbmNlIGluIE5vdGVzLiBBIHNlY3Rpb24gdGhhdCBtZXJlbHkgZGVzY3JpYmVzIHRoZSBpbXBsZW1lbnRhdGlvbiwgb3IgaG9sZHMgb25seSB0aGUgdGVtcGxhdGUncyBwbGFjZWhvbGRlciBvciBhIFxcYHJlcXVpcmVkOiBub3QgcmVjb3JkZWRcXGAgbGluZSwgaXMgbm90IGEgcmVjb3JkOiB3cml0ZSBpdCBhZnJlc2ggYnkgdGhlIHJ1bGUgYWJvdmUuXG4tIFBsYWNlIHRoZSBzZWN0aW9uIHdoZXJlIHRoZSB0ZW1wbGF0ZSBwdXRzIGl0OyB3aGVuIHRoZSB0ZW1wbGF0ZSBoYXMgbm8gc3VjaCBoZWFkaW5nLCByaWdodCBhZnRlciB0aGUgaXNzdWUtY2xvc2luZyBsaW5lLCBvciBhdCB0aGUgdG9wIG9mIHRoZSBib2R5IHdoZW4gdGhlcmUgaXMgbm9uZS5cbi0gTmV2ZXIgZHJvcCBvciB3ZWFrZW4gYSBcXGByZXF1aXJlZFxcYCBsaW5lIHRvIGZpdCB3aGF0IHdhcyBpbXBsZW1lbnRlZDogd2hlbiBvbmUgY2Fubm90IGhvbGQgaW4gdGhlIGRpZmYsIGtlZXAgaXQgYW5kIHNheSBzbyBpbiBOb3Rlcy5gO1xuXG4vKiogVGhlIGNvbXBsZXRlIHJ1bGVzIGZvciB3cml0aW5nIGEgUFIgYm9keTogdGhlIHRlbXBsYXRlIHJ1bGVzIGZvbGxvd2VkIGJ5IHRoZSBSZXF1aXJlbWVudHMgcnVsZXMuICovXG5leHBvcnQgY29uc3QgUFVMTF9SRVFVRVNUX0JPRFlfUlVMRVMgPSBgJHtQVUxMX1JFUVVFU1RfVEVNUExBVEVfUlVMRVN9XFxuJHtQVUxMX1JFUVVFU1RfUkVRVUlSRU1FTlRTX1JVTEVTfWA7XG5cbi8qKlxuICogSG93IGEgdG9vbCB0aGF0IGNyZWF0ZXMgYW4gaXNzdWUgZGVyaXZlcyBpdCBmcm9tIHRoZSByZXBvc2l0b3J5J3MgaXNzdWUgdGVtcGxhdGVzLCBhcyBtYXJrZG93blxuICogYnVsbGV0cyBmb3IgYW4gYWdlbnQncyBpbnN0cnVjdGlvbnM7IHNoYXJlZCBieSB0aGUgc2FtZSB3cml0ZXJzIGFzIGBQVUxMX1JFUVVFU1RfQk9EWV9SVUxFU2AuXG4gKiBHdWlkYW5jZSB0aGUgdGVtcGxhdGVzIHN0YXRlIGluIHRoZWlyIG93biBwbGFjZWhvbGRlciBjb21tZW50cyAod2hpY2ggc2VjdGlvbnMgdG8ga2VlcCwgZGVsZXRpbmdcbiAqIHRoZSBjb21tZW50cykgaXMgZGVsaWJlcmF0ZWx5IG5vdCByZXBlYXRlZCBoZXJlLCBzaW5jZSB0aGUgd3JpdGVyIHJlYWRzIHRoZSB0ZW1wbGF0ZSBhbnl3YXkuXG4gKi9cbmV4cG9ydCBjb25zdCBJU1NVRV9URU1QTEFURV9SVUxFUyA9IGAtIEZvbGxvdyB0aGUgY2xvc2VzdCB0ZW1wbGF0ZSB1bmRlciBcXGAuZ2l0aHViL0lTU1VFX1RFTVBMQVRFL1xcYDogXFxgYnVnLm1kXFxgIGZvciB3cm9uZyBiZWhhdmlvciwgXFxgY2hhbmdlLm1kXFxgIGZvciBhbnl0aGluZyB0byBidWlsZCBvciBhbHRlcjsgYSBxdWVzdGlvbiBvciBub3RlIGZpdHRpbmcgbmVpdGhlciwgb3IgYSByZXBvc2l0b3J5IHdpdGhvdXQgdGVtcGxhdGVzLCBuZWVkcyBubyB0ZW1wbGF0ZS5cbi0gVGl0bGU6IGEgQ29udmVudGlvbmFsIENvbW1pdHMgcHJlZml4IGZvciB0aGUgdHlwZSB0aGF0IGZpdHMgdGhlIGNoYW5nZSAoXFxgZmVhdDpcXGAsIFxcYGZpeDpcXGAsIFxcYHJlZmFjdG9yOlxcYCwgXFxgZG9jczpcXGAsIFxcYGNob3JlOlxcYCwgLi4uKTsgd2hlbiBpdCBkaWZmZXJzIGZyb20gdGhlIHRlbXBsYXRlJ3MgXFxgdGl0bGVcXGAgcHJlZml4LCByZXBsYWNlIHRoZSB0ZW1wbGF0ZSdzIHR5cGUgbGFiZWwgKFxcYHQ6IC4uLlxcYCkgd2l0aCB0aGUgb25lIG1hdGNoaW5nIHRoZSB0eXBlLlxuLSBUaGUgWUFNTCBmcm9udCBtYXR0ZXIgYmV0d2VlbiB0aGUgXFxgLS0tXFxgIGxpbmVzIGlzIG1ldGFkYXRhLCBub3QgYm9keSB0ZXh0OiBwYXNzIGl0cyBcXGBsYWJlbHNcXGAgdmlhIFxcYC0tbGFiZWxcXGAgYW5kIHN1Ym1pdCBvbmx5IHRoZSBjb250ZW50IGJlbG93IHRoZSBjbG9zaW5nIFxcYC0tLVxcYCBhcyB0aGUgYm9keS5gO1xuXG4vKiogU2VjdGlvbnMgb2YgYSBidWcgcmVwb3J0LCBpbiB0aGUgb3JkZXIgdGhleSBhcHBlYXIgaW4gdGhlIGlzc3VlIHRlbXBsYXRlLiAqL1xuZXhwb3J0IGNvbnN0IEJVR19JU1NVRV9TRUNUSU9OUzogcmVhZG9ubHkgVGVtcGxhdGVTZWN0aW9uW10gPSBbXG4gIHsgaGVhZGluZzogJ1Byb2JsZW0nLCByZXF1aXJlbWVudDogJ3doYXQgaGFwcGVucywgYW5kIHdoYXQgc2hvdWxkIGhhcHBlbiBpbnN0ZWFkJyB9LFxuICB7IGhlYWRpbmc6ICdFdmlkZW5jZScsIHJlcXVpcmVtZW50OiAncmVwcm9kdWN0aW9uIHN0ZXBzLCBsb2dzLCBydW4gSURzLCBvciBsaW5rcycgfSxcbiAgeyBoZWFkaW5nOiAnSW1wYWN0JywgcmVxdWlyZW1lbnQ6ICd3aG8gb3Igd2hhdCBpcyBhZmZlY3RlZCwgYW5kIGhvdyBiYWRseScgfSxcbiAgeyBoZWFkaW5nOiAnUHJvcG9zYWwnLCByZXF1aXJlbWVudDogJ3RoZSBmaXggeW91IGhhdmUgaW4gbWluZCwgYW5kIHRoZSByb290IGNhdXNlIGlmIGtub3duJyB9LFxuXTtcblxuLyoqXG4gKiBTZWN0aW9ucyBhIGNoYW5nZSBzcGVjaWZpY2F0aW9uIG11c3Qgc2V0dGxlIGJlZm9yZSBhIHRoaXJkIHBhcnR5IGNhbiBpbXBsZW1lbnQgaXQsIGRlZmluZWRcbiAqIG9uY2Ugc28gdGhhdCB0aGUgaXNzdWUgdGVtcGxhdGUgYW5kIGFueSB0b29sIHRoYXQgZHJhZnRzIG9yIHJldmlld3Mgc3BlY2lmaWNhdGlvbnMgYWdhaW5zdFxuICogdGhlc2Ugc2VjdGlvbnMgY2Fubm90IGRyaWZ0IGFwYXJ0OyBjaGVja2xpc3QgY29uc3VtZXJzIHJlbmRlciBpdCB3aXRoIGByZW5kZXJTZWN0aW9uQ2hlY2tsaXN0YC5cbiAqIFRoZSBmaXJzdCB0aHJlZSBzZWN0aW9ucyBzdWZmaWNlIGZvciBhIHNtYWxsIGNoYW5nZSwgc28gdGhleSBjb21lIGZpcnN0LlxuICovXG5leHBvcnQgY29uc3QgQ0hBTkdFX0lTU1VFX1NFQ1RJT05TOiByZWFkb25seSBUZW1wbGF0ZVNlY3Rpb25bXSA9IFtcbiAge1xuICAgIGhlYWRpbmc6ICdCYWNrZ3JvdW5kIGFuZCBnb2FsJyxcbiAgICByZXF1aXJlbWVudDogJ3RoZSBwcm9ibGVtIGJlaW5nIHNvbHZlZCwgZm9yIHdob20sIGFuZCB3aGF0IG91dGNvbWUgY291bnRzIGFzIHN1Y2Nlc3MnLFxuICB9LFxuICB7XG4gICAgaGVhZGluZzogJ0JlaGF2aW9yJyxcbiAgICByZXF1aXJlbWVudDpcbiAgICAgICdldmVyeSB1c2VyLSBvciBjYWxsZXItb2JzZXJ2YWJsZSBiZWhhdmlvciwgaW5jbHVkaW5nIGlucHV0cywgb3V0cHV0cywgZXJyb3IgY2FzZXMsIGVkZ2UgY2FzZXMsIGFuZCBpbnRlcmFjdGlvbnMgd2l0aCBleGlzdGluZyBiZWhhdmlvciwgc3RhdGVkIHByZWNpc2VseSBlbm91Z2ggdGhhdCB0d28gaW1wbGVtZW50ZXJzIHdvdWxkIGJ1aWxkIHRoZSBzYW1lIHRoaW5nJyxcbiAgfSxcbiAge1xuICAgIGhlYWRpbmc6ICdBY2NlcHRhbmNlIGNyaXRlcmlhJyxcbiAgICByZXF1aXJlbWVudDpcbiAgICAgICdjaGVja2FibGUgY29uZGl0aW9ucyAoR2l2ZW4vV2hlbi9UaGVuIG9yIGFuIGVxdWl2YWxlbnQpIHRoYXQgZGVjaWRlIHdoZXRoZXIgdGhlIGltcGxlbWVudGF0aW9uIGlzIGRvbmUnLFxuICB9LFxuICB7XG4gICAgaGVhZGluZzogJ1Njb3BlIGFuZCBub24tZ29hbHMnLFxuICAgIHJlcXVpcmVtZW50OiAnd2hhdCB0aGUgY2hhbmdlIGNvdmVycyBhbmQgd2hhdCBpdCBkZWxpYmVyYXRlbHkgbGVhdmVzIG91dCwgc28gYW4gaW1wbGVtZW50ZXIga25vd3Mgd2hlcmUgdG8gc3RvcCcsXG4gIH0sXG4gIHtcbiAgICBoZWFkaW5nOiAnRGVzaWduIGNvbnN0cmFpbnRzJyxcbiAgICByZXF1aXJlbWVudDpcbiAgICAgICd0aGUgZGF0YSwgQVBJLCBzY2hlbWEsIFVJLCBhbmQgY29uZmlndXJhdGlvbiBjaGFuZ2VzLCBuYW1pbmcsIGFuZCB0aGUgZXhpc3RpbmcgY29kZSBvciBjb252ZW50aW9ucyB0aGUgaW1wbGVtZW50YXRpb24gbXVzdCBmaXQg4oCUIGFzIGZhciBhcyB0aGUgd3JpdGVyIGludGVuZHMgdG8gY29uc3RyYWluIHRoZW0sIHdpdGggZXZlcnl0aGluZyBlbHNlIGV4cGxpY2l0bHkgbGVmdCB0byB0aGUgaW1wbGVtZW50ZXInLFxuICB9LFxuICB7XG4gICAgaGVhZGluZzogJ0NvbXBhdGliaWxpdHkgYW5kIG1pZ3JhdGlvbicsXG4gICAgcmVxdWlyZW1lbnQ6ICd3aGF0IGV4aXN0aW5nIGRhdGEsIHVzZXJzLCBjYWxsZXJzLCBvciBjb25maWd1cmF0aW9ucyBhcmUgYWZmZWN0ZWQgYW5kIGhvdyB0aGUgdHJhbnNpdGlvbiBoYXBwZW5zJyxcbiAgfSxcbiAge1xuICAgIGhlYWRpbmc6ICdWZXJpZmljYXRpb24nLFxuICAgIHJlcXVpcmVtZW50OiAnaG93IHRoZSBjaGFuZ2UgaXMgdGVzdGVkIG9yIGRlbW9uc3RyYXRlZCwgaW5jbHVkaW5nIHdoYXQgbmVlZHMgbm8gdGVzdCBhbmQgd2h5JyxcbiAgfSxcbiAge1xuICAgIGhlYWRpbmc6ICdPcGVuIHF1ZXN0aW9ucycsXG4gICAgcmVxdWlyZW1lbnQ6ICd1bmRlY2lkZWQgcG9pbnRzLCBlYWNoIHdpdGggaXRzIG9wdGlvbnM7IGVtcHR5IG9uY2UgdGhlIHNwZWNpZmljYXRpb24gaXMgaW1wbGVtZW50YWJsZScsXG4gIH0sXG5dO1xuXG4vKiogUmVuZGVycyBzZWN0aW9ucyBhcyBtYXJrZG93biBidWxsZXRzIChgLSAqKkhlYWRpbmcqKjogcmVxdWlyZW1lbnRgKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJTZWN0aW9uQ2hlY2tsaXN0KHNlY3Rpb25zOiByZWFkb25seSBUZW1wbGF0ZVNlY3Rpb25bXSk6IHN0cmluZyB7XG4gIHJldHVybiBzZWN0aW9ucy5tYXAoKHNlY3Rpb24pID0+IGAtICoqJHtzZWN0aW9uLmhlYWRpbmd9Kio6ICR7c2VjdGlvbi5yZXF1aXJlbWVudH1gKS5qb2luKCdcXG4nKTtcbn1cblxuLyoqIFJlbmRlcnMgc2VjdGlvbnMgYXMgbWFya2Rvd24gaGVhZGluZ3MsIGVhY2ggZm9sbG93ZWQgYnkgaXRzIHJlcXVpcmVtZW50IGFzIGEgcGxhY2Vob2xkZXIgY29tbWVudC4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJTZWN0aW9uVGVtcGxhdGUoc2VjdGlvbnM6IHJlYWRvbmx5IFRlbXBsYXRlU2VjdGlvbltdKTogc3RyaW5nIHtcbiAgcmV0dXJuIHNlY3Rpb25zXG4gICAgLm1hcChcbiAgICAgIChzZWN0aW9uKSA9PlxuICAgICAgICBgIyMgJHtzZWN0aW9uLmhlYWRpbmd9XFxuXFxuPCEtLSAke3NlY3Rpb24ucmVxdWlyZW1lbnQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCl9JHtzZWN0aW9uLnJlcXVpcmVtZW50LnNsaWNlKDEpfS4gLS0+YFxuICAgIClcbiAgICAuam9pbignXFxuXFxuJyk7XG59XG4iLCJleHBvcnQgYXN5bmMgZnVuY3Rpb24gc2xlZXAobWlsbGlzZWNvbmRzOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1pbGxpc2Vjb25kcykpO1xufVxuIiwiaW1wb3J0IHsgc2xlZXAgfSBmcm9tICcuL3NsZWVwLmpzJztcblxuLyoqXG4gKiBDb252ZXJ0IGFuIG9iamVjdCB0byBhbiBlcnJvci5cbiAqIEBwYXJhbSBvYmogVGhlIG9iamVjdCB0byBjb252ZXJ0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXJyb3JpZnkob2JqOiB1bmtub3duKTogRXJyb3Ige1xuICBpZiAob2JqIGluc3RhbmNlb2YgRXJyb3IpIHJldHVybiBvYmo7XG4gIGlmICh0eXBlb2Ygb2JqID09PSAnc3RyaW5nJykgcmV0dXJuIG5ldyBFcnJvcihvYmopO1xuICAvLyBgSlNPTi5zdHJpbmdpZnlgIGFuc3dlcnMgYHVuZGVmaW5lZGAgZm9yIGB1bmRlZmluZWRgLCBhIHN5bWJvbCBhbmQgYSBmdW5jdGlvbiwgYW5kIHRocm93c1xuICAvLyBvbiBhIGJpZ2ludCBvciBhIGN5Y2xlOyBgbmV3IEVycm9yKHVuZGVmaW5lZClgIGhhcyBhbiBlbXB0eSBtZXNzYWdlLCB3aGljaCB3b3VsZCBkcm9wIHRoZVxuICAvLyBvbmx5IGRpYWdub3N0aWMgYSBjYWxsZXIgaGFzIGFib3V0IHN1Y2ggYSB0aHJvd24gdmFsdWUuIE5laXRoZXIgcmVwcmVzZW50YXRpb24gbWF5IHRocm93XG4gIC8vIG91dCBvZiBoZXJlOiB0aGlzIHJ1bnMgaW4gYSBjYXRjaCBibG9jaywgd2hlcmUgaXQgd291bGQgcmVwbGFjZSB0aGUgZXJyb3IgaXQgY29udmVydHMuXG4gIHJldHVybiBuZXcgRXJyb3IoaWdub3JlRXJyb3IoKCkgPT4gSlNPTi5zdHJpbmdpZnkob2JqKSkgPz8gaWdub3JlRXJyb3IoKCkgPT4gU3RyaW5nKG9iaikpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlnbm9yZUVycm9yPFQ+KGZuOiAoKSA9PiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaWdub3JlRW5vZW50PFQ+KGZuOiAoKSA9PiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgJiYgJ2NvZGUnIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFcnJvckFzeW5jPFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaWdub3JlRW5vZW50QXN5bmM8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXRyeU9wdGlvbnMge1xuICBiZWZvcmVSZXRyeT86IChlcnJvcjogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgaGFuZGxlRXJyb3I/OiAoZXJyb3I6IHVua25vd24pID0+IFByb21pc2U8dm9pZD47XG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgdG90YWwgYXR0ZW1wdHMsIGluY2x1ZGluZyB0aGUgaW5pdGlhbCBhdHRlbXB0LlxuICAgKiBGb3IgZXhhbXBsZSwgYHJldHJ5Q291bnQ6IDNgIHJ1bnMgdGhlIGZ1bmN0aW9uIGF0IG1vc3QgMyB0aW1lczogMSBpbml0aWFsIGF0dGVtcHQgYW5kIHVwIHRvIDIgcmV0cmllcy5cbiAgICovXG4gIHJldHJ5Q291bnQ/OiBudW1iZXI7XG4gIHJldHJ5TG9nZ2VyPzogKG1lc3NhZ2U6IHN0cmluZykgPT4gdm9pZDtcbiAgc2hvdWxkUmV0cnk/OiAoZXJyb3I6IHVua25vd24pID0+IGJvb2xlYW47XG4gIC8qKlxuICAgKiBEZWNpZGVzIGhvdyBsb25nIHRvIHdhaXQgYmVmb3JlIHJldHJ5aW5nIGFmdGVyIGBlcnJvcmAsIGdpdmVuIHRoZSBiYWNrb2ZmIGBzbGVlcE1pbGxpc2Vjb25kc2AgaXQgd291bGQgb3RoZXJ3aXNlIHdhaXQsXG4gICAqIGUuZy4gYChlcnJvciwgbXMpID0+IE1hdGgubWF4KG1zLCByZXRyeUF0T2YoZXJyb3IpIC0gRGF0ZS5ub3coKSlgIHRvIGhvbm9yIGEgcmV0cnkgdGltZSBzZW50IGJ5IGEgc2VydmVyLlxuICAgKiBJdCBkb2VzIG5vdCBhZmZlY3QgdGhlIGJhY2tvZmYgdGhhdCBgdXBkYXRlU2xlZXBNaWxsaXNlY29uZHNgIGFkdmFuY2VzLlxuICAgKi9cbiAgZ2V0U2xlZXBNaWxsaXNlY29uZHM/OiAoZXJyb3I6IHVua25vd24sIHNsZWVwTWlsbGlzZWNvbmRzOiBudW1iZXIpID0+IG51bWJlcjtcbiAgc2xlZXBNaWxsaXNlY29uZHM/OiBudW1iZXI7XG4gIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzPzogKHNsZWVwTWlsbGlzZWNvbmRzOiBudW1iZXIpID0+IG51bWJlcjtcbn1cblxuLyoqXG4gKiBSZXRyeSB0aGUgZ2l2ZW4gZnVuY3Rpb24uXG4gKiBAcGFyYW0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmV0cnkuXG4gKiBAcGFyYW0gYmVmb3JlUmV0cnkgVGhlIGZ1bmN0aW9uIHRvIGNhbGwgaW1tZWRpYXRlbHkgYmVmb3JlIHJldHJ5aW5nLlxuICogQHBhcmFtIGhhbmRsZUVycm9yIFRoZSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gYW4gZXJyb3Igb2NjdXJzLlxuICogQHBhcmFtIHJldHJ5Q291bnQgVGhlIG1heGltdW0gbnVtYmVyIG9mIHRvdGFsIGF0dGVtcHRzLCBpbmNsdWRpbmcgdGhlIGluaXRpYWwgYXR0ZW1wdC5cbiAqIEBwYXJhbSByZXRyeUxvZ2dlciBUaGUgZnVuY3Rpb24gdG8gbG9nIHJldHJ5aW5nLlxuICogQHBhcmFtIHNsZWVwTWlsbGlzZWNvbmRzIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHNsZWVwIGJlZm9yZSByZXRyeWluZy5cbiAqIEBwYXJhbSB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcyBUaGUgZnVuY3Rpb24gdG8gdXBkYXRlIHNsZWVwIG1pbGxpc2Vjb25kcyBhZnRlciBlYWNoIHJldHJ5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2l0aFJldHJ5PFQ+KFxuICBmdW5jOiAoZmFpbGVkQ291bnQ6IG51bWJlcikgPT4gVCB8IFByb21pc2U8VD4sXG4gIHtcbiAgICBiZWZvcmVSZXRyeSxcbiAgICBoYW5kbGVFcnJvcixcbiAgICByZXRyeUNvdW50ID0gMyxcbiAgICByZXRyeUxvZ2dlcixcbiAgICBzaG91bGRSZXRyeSxcbiAgICBnZXRTbGVlcE1pbGxpc2Vjb25kcyxcbiAgICBzbGVlcE1pbGxpc2Vjb25kcyA9IDAsXG4gICAgdXBkYXRlU2xlZXBNaWxsaXNlY29uZHMsXG4gIH06IFJldHJ5T3B0aW9ucyA9IHt9XG4pOiBQcm9taXNlPFQ+IHtcbiAgbGV0IGZhaWxlZENvdW50ID0gMDtcbiAgZm9yICg7Oykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZnVuYyhmYWlsZWRDb3VudCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGF3YWl0IGhhbmRsZUVycm9yPy4oZXJyb3IpO1xuICAgICAgZmFpbGVkQ291bnQrKztcbiAgICAgIGlmIChmYWlsZWRDb3VudCA+PSByZXRyeUNvdW50KSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgaWYgKHNob3VsZFJldHJ5ICYmICFzaG91bGRSZXRyeShlcnJvcikpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBjb25zdCBjdXJyZW50U2xlZXBNaWxsaXNlY29uZHMgPSBnZXRTbGVlcE1pbGxpc2Vjb25kcz8uKGVycm9yLCBzbGVlcE1pbGxpc2Vjb25kcykgPz8gc2xlZXBNaWxsaXNlY29uZHM7XG4gICAgICBpZiAoY3VycmVudFNsZWVwTWlsbGlzZWNvbmRzID4gMCkge1xuICAgICAgICBhd2FpdCBzbGVlcChjdXJyZW50U2xlZXBNaWxsaXNlY29uZHMpO1xuICAgICAgfVxuICAgICAgaWYgKHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzKSB7XG4gICAgICAgIHNsZWVwTWlsbGlzZWNvbmRzID0gdXBkYXRlU2xlZXBNaWxsaXNlY29uZHMoc2xlZXBNaWxsaXNlY29uZHMpO1xuICAgICAgfVxuICAgICAgcmV0cnlMb2dnZXI/LihgUmV0cnkgZHVlIHRvOiAke2Vycm9yfVxuJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gJy0tLVxcbicgKyAoZXJyb3Iuc3RhY2sgPz8gJycpIDogJyd9YCk7XG4gICAgICBhd2FpdCBiZWZvcmVSZXRyeT8uKGVycm9yKTtcbiAgICB9XG4gIH1cbn1cbiIsIi8qKiBFc2NhcGVzIGV2ZXJ5IFJlZ0V4cCBtZXRhY2hhcmFjdGVyIHNvIHRoZSB0ZXh0IG1hdGNoZXMgaXRzZWxmIGxpdGVyYWxseS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlc2NhcGVSZWdFeHAodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRleHQucmVwbGFjZUFsbCgvWyQoKSorLj9bXFxcXFxcXV57fH1dL2d1LCBTdHJpbmcucmF3YFxcJCZgKTtcbn1cblxuLyoqIEEgUE9TSVggc2hlbGwgd29yZDogc2FmZSBjaGFyYWN0ZXJzIHBhc3MgdGhyb3VnaCwgYW55dGhpbmcgZWxzZSBpcyBzaW5nbGUtcXVvdGVkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHF1b3RlRm9yU2hlbGwodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiAvXltcXHcuLy1dKyQvdS50ZXN0KHZhbHVlKSA/IHZhbHVlIDogYCcke3ZhbHVlLnJlcGxhY2VBbGwoXCInXCIsIFN0cmluZy5yYXdgJ1xcJydgKX0nYDtcbn1cblxuLyoqXG4gKiBXcmFwcyB0ZXh0IGluIGEgTWFya2Rvd24gY29kZSBibG9jayBmZW5jZWQgd2l0aCB0aWxkZXMsIHdoaWNoIGFyZSByYXJlciB0aGFuIGJhY2t0aWNrcyBpbiBNYXJrZG93biBjb250ZW50LlxuICogVGhlIGZlbmNlIGlzIGxvbmdlciB0aGFuIGFueSBydW4gb2YgdGlsZGVzIGluIHRoZSB0ZXh0IHNvIHRoYXQgdGhlIHRleHQgY2Fubm90IGNsb3NlIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9UaWxkZUNvZGVCbG9jayh0ZXh0OiBzdHJpbmcsIGxhbmd1YWdlID0gJycpOiBzdHJpbmcge1xuICByZXR1cm4gdG9GZW5jZWRDb2RlQmxvY2soJ34nLCB0ZXh0LCBsYW5ndWFnZSk7XG59XG5cbi8qKlxuICogV3JhcHMgdGV4dCBpbiBhIE1hcmtkb3duIGNvZGUgYmxvY2sgZmVuY2VkIHdpdGggYmFja3RpY2tzLlxuICogVGhlIGZlbmNlIGlzIGxvbmdlciB0aGFuIGFueSBydW4gb2YgYmFja3RpY2tzIGluIHRoZSB0ZXh0IHNvIHRoYXQgdGhlIHRleHQgY2Fubm90IGNsb3NlIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9Db2RlQmxvY2sodGV4dDogc3RyaW5nLCBsYW5ndWFnZSA9ICcnKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRvRmVuY2VkQ29kZUJsb2NrKCdgJywgdGV4dCwgbGFuZ3VhZ2UpO1xufVxuXG5mdW5jdGlvbiB0b0ZlbmNlZENvZGVCbG9jayhmZW5jZUNoYXI6IHN0cmluZywgdGV4dDogc3RyaW5nLCBsYW5ndWFnZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgc2hvcnRlc3RGZW5jZSA9IGZlbmNlQ2hhci5yZXBlYXQoMyk7XG4gIGxldCBsb25nZXN0UnVuID0gMjtcbiAgbGV0IHN0YXJ0ID0gdGV4dC5pbmRleE9mKHNob3J0ZXN0RmVuY2UpO1xuICB3aGlsZSAoc3RhcnQgIT09IC0xKSB7XG4gICAgbGV0IGVuZCA9IHN0YXJ0ICsgMztcbiAgICB3aGlsZSAodGV4dFtlbmRdID09PSBmZW5jZUNoYXIpIGVuZCsrO1xuICAgIGxvbmdlc3RSdW4gPSBNYXRoLm1heChsb25nZXN0UnVuLCBlbmQgLSBzdGFydCk7XG4gICAgc3RhcnQgPSB0ZXh0LmluZGV4T2Yoc2hvcnRlc3RGZW5jZSwgZW5kKTtcbiAgfVxuICBsZXQgbGFuZ3VhZ2VTdGFydCA9IDA7XG4gIHdoaWxlIChsYW5ndWFnZVtsYW5ndWFnZVN0YXJ0XSA9PT0gZmVuY2VDaGFyKSBsYW5ndWFnZVN0YXJ0Kys7XG4gIGNvbnN0IGZlbmNlID0gZmVuY2VDaGFyLnJlcGVhdChsb25nZXN0UnVuICsgMSArIGxhbmd1YWdlU3RhcnQpO1xuICByZXR1cm4gYCR7ZmVuY2V9JHtsYW5ndWFnZS5zbGljZShsYW5ndWFnZVN0YXJ0KX1cXG4ke3RleHR9JHt0ZXh0LmVuZHNXaXRoKCdcXG4nKSA/ICcnIDogJ1xcbid9JHtmZW5jZX1gO1xufVxuIiwiLyoqXG4gKiBXaGVuIHRvIHdyaXRlIGEgdGVzdCBhbmQgd2hhdCBhIHRlc3QgbWF5IGFzc2VydCwgYXMgbWFya2Rvd24gYnVsbGV0cyBmb3IgYW4gYWdlbnQncyBpbnN0cnVjdGlvbnMuXG4gKiBTdGF0ZWQgb25jZSBoZXJlIGFuZCByZW5kZXJlZCBieSB0aGUgZ2VuZXJhdGVkIGFnZW50IGluc3RydWN0aW9ucyBhbmQgdGhlIHRlc3Rpbmcgc2tpbGwgc28gdGhlXG4gKiB0d28gY2Fubm90IGRyaWZ0IGFwYXJ0LlxuICovXG5leHBvcnQgY29uc3QgVEVTVF9XUklUSU5HX1JVTEVTID0gYC0gV3JpdGUgYSB0ZXN0IG9ubHkgd2hlbiBleHBsaWNpdGx5IHJlcXVlc3RlZCwgb3Igd2hlbiBhIGJlaGF2aW9yIGlzIGxpa2VseSB0byByZWdyZXNzIGFuZCBubyBleGlzdGluZyBhdXRvbWF0aWMgY2hlY2sgKHR5cGUgY2hlY2tpbmcsIGxpbnRpbmcsIGFuIGV4aXN0aW5nIHRlc3Qgb3IgQ0kgY2hlY2spIHdvdWxkIGNhdGNoIHRoZSBicmVha2FnZS4gTmV2ZXIgYWRkIGEgdGVzdCB0aGF0IG1lcmVseSByZXN0YXRlcyBhIG1hcHBpbmcgZnJvbSBjb25kaXRpb25zIHRvIGNvbnN0YW50IG91dHB1dHMgKGl0IGZhaWxzIG9ubHkgb24gaW50ZW50aW9uYWwgZWRpdHMpIG9yIHRoYXQgb25seSBjb25maXJtcyBhbiBleHRlcm5hbCBmYWN0IChhIGxpYnJhcnkncyBiZWhhdmlvciwgd2hldGhlciBhIHZlcnNpb24gZml4ZXMgYW4gaXNzdWUpOyB2ZXJpZnkgdGhvc2Ugb25jZSBtYW51YWxseS5cbi0gVGVzdCBleHRlcm5hbGx5IG9ic2VydmFibGUgYmVoYXZpb3IgKGUuZy4sIGVtaXR0ZWQgZmlsZXMsIENMSSBvdXRwdXQsIHJlbmRlcmVkIHJlc3VsdHMpIGF0IHRoZSBzeXN0ZW0gYm91bmRhcnksIG5vdCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzOiBkbyBub3QgbWlycm9yIHByb2R1Y3Rpb24gbG9naWMsIGFzc2VydCB0aGF0IGEgYnJhbmNoIGlzIHRha2VuLCBvciBmZWVkIGhhbmQtYXNzZW1ibGVkIGludGVybmFsIG9iamVjdHMgdG8gaW50ZXJuYWwgZnVuY3Rpb25zLlxuLSBQcmVmZXIgYWN0dWFsIEFQSSBjYWxscyBvdmVyIG1vY2tzLCB1bmxlc3MgYWN0dWFsIGNhbGxzIGFyZSBpbXByYWN0aWNhbCwgaGF2ZSB1bmludGVuZGVkIHNpZGUgZWZmZWN0cywgb3IgbW9ja3MgYXJlIGV4cGxpY2l0bHkgcmVxdWVzdGVkLlxuLSBFbnN1cmUgdGVzdHMgYXJlIGlkZW1wb3RlbnQgYW5kIGluZGVwZW5kZW50IChlLmcuLCByZXNldCBwZXJzaXN0ZW50IGRhdGEpIHNvIHRoZXkgY2FuIHJ1biByZXBlYXRlZGx5IG9yIGluIHBhcmFsbGVsLlxuLSBBdm9pZCBmaXhlZCB3YWl0cyBpbiBFMkUgdGVzdHM7IHdhaXQgZm9yIGNvbmRpdGlvbnMgaW5zdGVhZC5gO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYic7XG5cbi8qKiBUaGUgYHdvcmtzcGFjZXNgIGZpZWxkIG9mIGEgcm9vdCBwYWNrYWdlLmpzb246IHRoZSBhcnJheSBmb3JtIG9yIFlhcm4gdjEncyBvYmplY3QgZm9ybS4gKi9cbmV4cG9ydCB0eXBlIFdvcmtzcGFjZXNEZWNsYXJhdGlvbiA9IHN0cmluZ1tdIHwgeyBwYWNrYWdlcz86IHN0cmluZ1tdIH0gfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogRXZlcnkgd29ya3NwYWNlIHBhY2thZ2UuanNvbiBwYXRoIChyZWxhdGl2ZSB0byB0aGUgbW9ub3JlcG8gcm9vdCwgc29ydGVkKSB0aGF0IEJ1biB3b3VsZCBsaW5rXG4gKiBmb3IgdGhlIGdpdmVuIHJvb3QgcGFja2FnZS5qc29uIGB3b3Jrc3BhY2VzYCBkZWNsYXJhdGlvbi4gQ2Fub25pY2FsaXplcyB0aGUgZGVjbGFyZWQgcGF0dGVybnNcbiAqIChzZWUgZ2V0TWVhbmluZ2Z1bERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMpLCBkcm9wcyBwYXR0ZXJucyBlc2NhcGluZyB0aGUgcmVwb3NpdG9yeSAoc2VlXG4gKiBpc0luUmVwb3NpdG9yeVdvcmtzcGFjZVBhdHRlcm4pLCBhbmQgcmVzb2x2ZXMgdGhlIHJlc3Qgd2l0aCBCdW4ncyBzZXF1ZW50aWFsIHNlbWFudGljcyAoc2VlXG4gKiByZXNvbHZlV29ya3NwYWNlUGFja2FnZUpzb25QYXRocykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlQnVuV29ya3NwYWNlUGFja2FnZUpzb25QYXRocyh3b3Jrc3BhY2VzOiBXb3Jrc3BhY2VzRGVjbGFyYXRpb24sIHJvb3REaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiByZXNvbHZlV29ya3NwYWNlUGFja2FnZUpzb25QYXRocyhcbiAgICBnZXRNZWFuaW5nZnVsRGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyh3b3Jrc3BhY2VzKS5maWx0ZXIoKHdvcmtzcGFjZVBhdHRlcm4pID0+XG4gICAgICBpc0luUmVwb3NpdG9yeVdvcmtzcGFjZVBhdHRlcm4od29ya3NwYWNlUGF0dGVybilcbiAgICApLFxuICAgIHJvb3REaXJQYXRoXG4gICk7XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgd29ya3NwYWNlIHBhdHRlcm5zIHRvIHBhY2thZ2UuanNvbiBwYXRocyBtaW1pY2tpbmcgQnVuJ3MgU0VRVUVOVElBTCBldmFsdWF0aW9uLFxuICogZGVyaXZlZCBlbXBpcmljYWxseSB3aXRoIEJ1biAxLjMuMTQgKGZpeHR1cmUgcmVwb3Mgb2JzZXJ2ZWQgdmlhIGBidW4gaW5zdGFsbCAtLWxvY2tmaWxlLW9ubHlgO1xuICogV2lsbEJvb3N0ZXIvc2hhcmVkIzEwMDQgLyBXaWxsQm9vc3Rlci9zaGFyZWQjMTAwNSk6XG4gKiAxLiBQYXR0ZXJucyBhcmUgZXZhbHVhdGVkIGluIGRlY2xhcmF0aW9uIG9yZGVyIGludG8gYW4gYWNjdW11bGF0aW5nIHNldDogYSBwb3NpdGl2ZSBnbG9iXG4gKiAgICBwYXR0ZXJuIGFkZHMgZXZlcnkgcGFja2FnZS5qc29uIGl0IG1hdGNoZXM7IGEgbmVnYXRpb24gZGVsZXRlcyBpdHMgbWF0Y2hlcyBmcm9tIHRoZSBzZXRcbiAqICAgIGFjY3VtdWxhdGVkIFNPIEZBUiwgc28gYSBsYXRlciBwb3NpdGl2ZSByZS1hZGRzIHRoZW0gKGBbXCIhYXBwcy9leGNsdWRlZFwiLCBcImFwcHMvKlwiXWAgbGlua3NcbiAqICAgIGFwcHMvZXhjbHVkZWQsIHdoaWxlIGBbXCJhcHBzLypcIiwgXCIhYXBwcy9leGNsdWRlZFwiXWAgZG9lcyBub3QpLlxuICogMi4gQSBuZWdhdGlvbiB3aG9zZSBub3JtYWxpemVkIGJvZHkgaGFzIEVYQUNUTFkgdHdvIHNlZ21lbnRzLCB3aG9zZSBsYXN0IHNlZ21lbnQgaXMgYSBzdGFyLXJ1blxuICogICAgKGAqYCwgYCoqYCwgYCoqKmAsIOKApiksIGFuZCB3aG9zZSBmaXJzdCBzZWdtZW50IGlzIE5PVCBpdHNlbGYgYSBzdGFyLXJ1biBmaXJzdCBzZWVkcyB0aGVcbiAqICAgIGltcGxpY2l0IGJhc2VsaW5lIGludG8gdGhlIHNldCwgdGhlbiBkZWxldGVzIGl0cyBvd24gbWF0Y2hlczogYSBgKipgIGxhc3Qgc2VnbWVudCBzZWVkc1xuICogICAgYCoqYCAocGFja2FnZXMgYXQgYW55IGRlcHRoKSwgYW55IG90aGVyIHN0YXItcnVuIHNlZWRzIGAqXFwvKmAgKGRlcHRoIDIgb25seSkuIFNlZWRpbmdcbiAqICAgIGhhcHBlbnMgZXZlbiBhbG9uZ3NpZGUgcG9zaXRpdmUgcGF0dGVybnMgKGBbXCJhcHBzLypcIiwgXCIhb3RoZXIvKlwiXWAgbGlua3MgZXZlcnkgZGVwdGgtMlxuICogICAgcGFja2FnZSBvdXRzaWRlIG90aGVyLykuIE5vIG90aGVyIG5lZ2F0aW9uIHNoYXBlIHNlZWRzOiBgISpgLCBgISoqYCwgYCEqXFwvKmAsIGAhKlxcLyoqYCxcbiAqICAgIGAhKipcXC8qYCwgYCFhL2IvKmAsIGAhYS9iLyoqYCwgYCFkaXJgLCBhbmQgYCFkaXIvKnhgIGVhY2ggbGluayBub3RoaW5nIG9uIHRoZWlyIG93bi5cbiAqICAgIGA/YCwgYnJhY2UsIGFuZCBjaGFyYWN0ZXItY2xhc3MgbGFzdCBzZWdtZW50cyBiZWhhdmUgRVJSQVRJQ0FMTFkgKGBbXCIhb3RoZXIvP1wiXWAgbGlua3NcbiAqICAgIHBhY2thZ2VzL2EgeWV0IG5vdCB0aGUgZXF1YWxseSBiYXNlbGluZS1zaGFwZWQgb3RoZXIveXksIGBbXCIhb3RoZXIvPz9cIl1gIGxpbmtzIG5vdGhpbmcsIGFuZFxuICogICAgYFtcIiE/Lz9cIl1gIGxpbmtzIHRoZSB2ZXJ5IG90aGVyL3ggaXQgbWF0Y2hlcyksIHNvIG5vIGNvbnNpc3RlbnQgcnVsZSBjYW4gbW9kZWwgdGhlbTsgdGhleVxuICogICAgYXJlIGRlbGliZXJhdGVseSB0cmVhdGVkIGFzIG5vdCBzZWVkaW5nIOKAlCBzZWUgaGFzSW1wbGljaXRXb3Jrc3BhY2VCYXNlbGluZSBhbmQgIzEwMDUuXG4gKiAzLiBBIG5vbi1nbG9iIHBvc2l0aXZlIHBhdHRlcm4gUElOUyBpdHMgZGlyZWN0b3J5OiBpdCBzdGF5cyBhIHdvcmtzcGFjZSByZWdhcmRsZXNzIG9mIHdoZXJlIGFcbiAqICAgIG1hdGNoaW5nIG5lZ2F0aW9uIGFwcGVhcnMgKGBbXCJvdGhlci94XCIsIFwiIW90aGVyL3hcIl1gIGFuZCBgW1wiIW90aGVyL3hcIiwgXCJvdGhlci94XCJdYCBib3RoXG4gKiAgICBsaW5rIG90aGVyL3gpLlxuICogNC4gYCoqYCBtYXRjaGVzIHplcm8gb3IgbW9yZSBwYXRoIHNlZ21lbnRzIChgW1wiYXBwcy8qKlwiXWAgbGlua3MgdGhlIHBhY2thZ2UgYXQgYXBwcyBpdHNlbGYsIGFuZFxuICogICAgYCFhcHBzLyoqYCBkZWxldGVzIGl0KSwgbWF0Y2hpbmcgZmFzdC1nbG9iJ3MgZmlsZS1nbG9iIHNlbWFudGljcy5cbiAqIERvIG5vdCBhcHBseSBnbG9iSWdub3JlIGhlcmU6IHdvcmtzcGFjZSBtZW1iZXJzaGlwIGlzIGRlZmluZWQgc29sZWx5IGJ5IHRoZSBkZWNsYXJlZCBwYXR0ZXJucyxcbiAqIGFuZCBzb3VyY2Utc2Nhbm5pbmcgaWdub3JlcyBzdWNoIGFzIGBidWlsZGAgb3IgYGRpc3RgIHdvdWxkIGhpZGUgbGVnaXRpbWF0ZWx5IG5hbWVkIHdvcmtzcGFjZVxuICogZGlyZWN0b3JpZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlV29ya3NwYWNlUGFja2FnZUpzb25QYXRocyh3b3Jrc3BhY2VQYXR0ZXJuczogc3RyaW5nW10sIHJvb3REaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIC8vIGZvbGxvd1N5bWJvbGljTGlua3M6IGZhbHNlIHN0b3BzIEdMT0IgdHJhdmVyc2FsIHRocm91Z2ggc3ltbGlua3MsIGJ1dCBhIG5vbi1nbG9iIHBhdHRlcm5cbiAgLy8gbmFtaW5nIGEgc3ltbGlua2VkIGRpcmVjdG9yeSAoZS5nLiBgbGlua2VkYCB3aXRoIGBsaW5rZWQgLT4gLi4vb3RoZXItcmVwb2ApIHN0aWxsIG1hdGNoZXMg4oCUXG4gIC8vIGZhc3QtZ2xvYiByZXNvbHZlcyBzdGF0aWMgcGF0dGVybnMgd2l0aCBkaXJlY3QgZnMgY2hlY2tzLCBhbmQgQnVuIGRvZXMgbGluayBzdWNoIGEgd29ya3NwYWNlLlxuICAvLyBEZWxpYmVyYXRlbHkgZGl2ZXJnZSBmcm9tIEJ1biB0aGVyZTogY29uc3VtZXJzIHN1Y2ggYXMgbm9kZV9tb2R1bGVzIGNsZWFudXAgYW5kIG1hbmlmZXN0XG4gIC8vIHJld3JpdGluZyB3b3VsZCBvdGhlcndpc2UgZGVsZXRlIGFuZCByZXdyaXRlIGZpbGVzIGluIEFOT1RIRVIgcmVwb3NpdG9yeSB0aHJvdWdoIHRoZSBzeW1saW5rLFxuICAvLyBzbyBrZWVwIG9ubHkgbWFuaWZlc3RzIHdob3NlIHJlYWwgcGF0aCBzdGF5cyBpbnNpZGUgdGhlIHJlcG9zaXRvcnkncyByZWFsIHJvb3QuIFNjYW5uaW5nIGVhY2hcbiAgLy8gcGF0dGVybiBzZXBhcmF0ZWx5IChubyBjcm9zcy1wYXR0ZXJuIGNhY2hpbmcpIGlzIGRlbGliZXJhdGU6IGRlY2xhcmF0aW9ucyBob2xkIGEgaGFuZGZ1bCBvZlxuICAvLyBwYXR0ZXJucywgc28gYSBjYWNoZSB3b3VsZCBjb21wbGljYXRlIHRoaXMgc2hhcmVkIGNvZGUgd2l0aG91dCBtZWFzdXJhYmxlIGdhaW4uXG4gIGNvbnN0IGdsb2JNYW5pZmVzdFBhdGhzID0gKHBhdHRlcm46IHN0cmluZyk6IHN0cmluZ1tdID0+IHtcbiAgICAvLyBCdW4gbGlua3MgZG90LWRpcmVjdG9yeSBwYWNrYWdlcyBvbmx5IHRocm91Z2ggZnVsbHkgc3RhdGljIHBhdHRlcm5zOiB3aXRoIEJ1biAxLjMuMTQsXG4gICAgLy8gYC5oaWRkZW4veGAgcGlucyB0aGUgcGFja2FnZSB3aGlsZSBgLmhpZGRlbi8qYCwgYC4qLypgLCBhbmQgYCoqYCBhbGwgbGluayBub3RoaW5nIHVuZGVyXG4gICAgLy8gLmhpZGRlbiDigJQgZXZlbiB3aGVuIHRoZSBkb3R0ZWQgc2VnbWVudCBpdHNlbGYgaXMgbGl0ZXJhbCDigJQgc28gYW55IGR5bmFtaWMgcGF0dGVybiBtdXN0XG4gICAgLy8gZHJvcCBtYXRjaGVzIGNvbnRhaW5pbmcgYSBkb3QtbGVkIHNlZ21lbnQgKGZhc3QtZ2xvYidzIGBkb3Q6IGZhbHNlYCBvbmx5IGNvdmVycyBzZWdtZW50c1xuICAgIC8vIGEgd2lsZGNhcmQgbWF0Y2hlcykuXG4gICAgY29uc3QgZXhjbHVkZXNEb3RTZWdtZW50cyA9IGZnLmlzRHluYW1pY1BhdHRlcm4ocGF0dGVybik7XG4gICAgY29uc3QgZ2xvYk9wdGlvbnMgPSB7IGN3ZDogcm9vdERpclBhdGgsIGZvbGxvd1N5bWJvbGljTGlua3M6IGZhbHNlLCBpZ25vcmU6IFsnKiovbm9kZV9tb2R1bGVzLyoqJ10gfTtcbiAgICAvLyBmYXN0LWdsb2IgMy4zLjMgcmV0dXJucyBubyBtYXRjaGVzIGZvciBmaWxlIGdsb2JzIHdpdGggYSBsb25lLWA/YCBzZWdtZW50IChlLmcuXG4gICAgLy8gYHBhY2thZ2VzLz8vcGFja2FnZS5qc29uYCksIGFsdGhvdWdoIG1pY3JvbWF0Y2ggbWF0Y2hlcyB0aGVtIGFuZCBCdW4gMS4zLjE0IGxpbmtzIHN1Y2hcbiAgICAvLyB3b3Jrc3BhY2VzOyBmb3IgYD9gLWNhcnJ5aW5nIHBhdHRlcm5zIG9ubHkgKGEgZGlyZWN0b3J5IGdsb2IgZm9yIGUuZy4gYCoqYCB3b3VsZCBzY2FuIGV2ZXJ5XG4gICAgLy8gZGlyZWN0b3J5IGluIHRoZSByZXBvc2l0b3J5KSwgZ2xvYmJpbmcgdGhlIGRpcmVjdG9yaWVzICh3aGVyZSBgP2Agd29ya3MpIGFuZCBjaGVja2luZyB0aGVpclxuICAgIC8vIG1hbmlmZXN0cyBjb21wbGVtZW50cyB0aGUgbWFuaWZlc3QgZ2xvYiwgd2hpY2ggc3RheXMgbmVjZXNzYXJ5IGZvciBgKipgJ3MgemVyby1zZWdtZW50XG4gICAgLy8gbWF0Y2hlcyDigJQgYGRpci8qKmAgZG9lcyBub3QgcmV0dXJuIGRpciBpdHNlbGYgYXMgYSBkaXJlY3RvcnkuXG4gICAgY29uc3QgbWFuaWZlc3RQYXRocyA9IG5ldyBTZXQoZmcuZ2xvYlN5bmMocGF0aC5wb3NpeC5qb2luKHBhdHRlcm4sICdwYWNrYWdlLmpzb24nKSwgZ2xvYk9wdGlvbnMpKTtcbiAgICBpZiAocGF0dGVybi5pbmNsdWRlcygnPycpKSB7XG4gICAgICBmb3IgKGNvbnN0IGRpclBhdGggb2YgZmcuZ2xvYlN5bmMocGF0dGVybiwgeyAuLi5nbG9iT3B0aW9ucywgb25seURpcmVjdG9yaWVzOiB0cnVlIH0pKSB7XG4gICAgICAgIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGgucG9zaXguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihyb290RGlyUGF0aCwgcGFja2FnZUpzb25QYXRoKSkpIG1hbmlmZXN0UGF0aHMuYWRkKHBhY2thZ2VKc29uUGF0aCk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIEEgemVyby1zZWdtZW50IGAqKmAgbWF0Y2ggcmVhY2hlcyB0aGUgcm9vdCdzIG93biBtYW5pZmVzdCwgYnV0IEJ1biBuZXZlciB0cmVhdHMgdGhlXG4gICAgLy8gbW9ub3JlcG8gcm9vdCBhcyBpdHMgb3duIHdvcmtzcGFjZS5cbiAgICByZXR1cm4gWy4uLm1hbmlmZXN0UGF0aHNdLmZpbHRlcihcbiAgICAgIChwYWNrYWdlSnNvblBhdGgpID0+XG4gICAgICAgIHBhY2thZ2VKc29uUGF0aCAhPT0gJ3BhY2thZ2UuanNvbicgJiZcbiAgICAgICAgKCFleGNsdWRlc0RvdFNlZ21lbnRzIHx8ICFwYWNrYWdlSnNvblBhdGguc3BsaXQoJy8nKS5zb21lKChzZWdtZW50KSA9PiBzZWdtZW50LnN0YXJ0c1dpdGgoJy4nKSkpICYmXG4gICAgICAgIGlzSW5zaWRlUmVhbFJvb3QocGFja2FnZUpzb25QYXRoKVxuICAgICk7XG4gIH07XG4gIGxldCByZWFsUm9vdERpclBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgY29uc3QgaXNJbnNpZGVSZWFsUm9vdCA9IChwYWNrYWdlSnNvblBhdGg6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICAgIHRyeSB7XG4gICAgICByZWFsUm9vdERpclBhdGggPz89IGZzLnJlYWxwYXRoU3luYyhyb290RGlyUGF0aCk7XG4gICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKHJlYWxSb290RGlyUGF0aCwgZnMucmVhbHBhdGhTeW5jKHBhdGguam9pbihyb290RGlyUGF0aCwgcGFja2FnZUpzb25QYXRoKSkpO1xuICAgICAgLy8gQ29tcGFyZSB3aG9sZSBzZWdtZW50cywgbm90IGEgYC4uYCBwcmVmaXg6IGEgZGlyZWN0b3J5IGxpdGVyYWxseSBuYW1lZCBlLmcuIGAuLnBrZ2AgaXNcbiAgICAgIC8vIGluc2lkZSB0aGUgcm9vdCwgd2hpbGUgYSBwbGFpbiBzdGFydHNXaXRoKCcuLicpIHdvdWxkIG1pc3JlYWQgaXQgYXMgcGFyZW50IHRyYXZlcnNhbC5cbiAgICAgIHJldHVybiByZWxhdGl2ZVBhdGggIT09ICcuLicgJiYgIXJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuLi8nKSAmJiAhcGF0aC5pc0Fic29sdXRlKHJlbGF0aXZlUGF0aCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBBIG1hbmlmZXN0IHRoYXQgdmFuaXNoZWQgYmV0d2VlbiB0aGUgZ2xvYiBhbmQgdGhlIHJlYWxwYXRoIGNhbGwgaXMgbm90IGEgd29ya3NwYWNlLlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgYWNjdW11bGF0ZWRQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBwaW5uZWRQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IHdvcmtzcGFjZVBhdHRlcm4gb2Ygd29ya3NwYWNlUGF0dGVybnMpIHtcbiAgICBjb25zdCBpc05lZ2F0aXZlID0gd29ya3NwYWNlUGF0dGVybi5zdGFydHNXaXRoKCchJyk7XG4gICAgY29uc3QgcGF0dGVybkJvZHkgPSBub3JtYWxpemVXb3Jrc3BhY2VQYXR0ZXJuQm9keShpc05lZ2F0aXZlID8gd29ya3NwYWNlUGF0dGVybi5zbGljZSgxKSA6IHdvcmtzcGFjZVBhdHRlcm4pO1xuICAgIGlmIChpc05lZ2F0aXZlKSB7XG4gICAgICBjb25zdCBiYXNlbGluZUdsb2IgPSBnZXRTZWVkZWRCYXNlbGluZUdsb2IocGF0dGVybkJvZHkpO1xuICAgICAgaWYgKGJhc2VsaW5lR2xvYiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGZvciAoY29uc3QgcGFja2FnZUpzb25QYXRoIG9mIGdsb2JNYW5pZmVzdFBhdGhzKGJhc2VsaW5lR2xvYikpIGFjY3VtdWxhdGVkUGF0aHMuYWRkKHBhY2thZ2VKc29uUGF0aCk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IHBhY2thZ2VKc29uUGF0aCBvZiBnbG9iTWFuaWZlc3RQYXRocyhwYXR0ZXJuQm9keSkpIGFjY3VtdWxhdGVkUGF0aHMuZGVsZXRlKHBhY2thZ2VKc29uUGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHRhcmdldFBhdGhzID0gZmcuaXNEeW5hbWljUGF0dGVybihwYXR0ZXJuQm9keSkgPyBhY2N1bXVsYXRlZFBhdGhzIDogcGlubmVkUGF0aHM7XG4gICAgICBmb3IgKGNvbnN0IHBhY2thZ2VKc29uUGF0aCBvZiBnbG9iTWFuaWZlc3RQYXRocyhwYXR0ZXJuQm9keSkpIHtcbiAgICAgICAgdGFyZ2V0UGF0aHMuYWRkKHBhY2thZ2VKc29uUGF0aCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBbLi4ubmV3IFNldChbLi4uYWNjdW11bGF0ZWRQYXRocywgLi4ucGlubmVkUGF0aHNdKV0udG9Tb3J0ZWQoKTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSBkZWNsYXJhdGlvbiBzZWVkcyBCdW4ncyBpbXBsaWNpdCB3b3Jrc3BhY2UgYmFzZWxpbmU6IGl0IGNvbnRhaW5zIGF0IGxlYXN0IG9uZVxuICogbmVnYXRpb24gb2YgdGhlIHNlZWRpbmcgc2hhcGUgKHNlZSByZXNvbHZlV29ya3NwYWNlUGFja2FnZUpzb25QYXRocyBydWxlIDIpLiBNZWFzdXJlZCB3aXRoIEJ1blxuICogMS4zLjE0LCBzZWVkaW5nIGlzIHBlci1uZWdhdGlvbiBhbmQgaGFwcGVucyBldmVuIGFsb25nc2lkZSBwb3NpdGl2ZSBwYXR0ZXJuczsgY29uY3JldGUgb3JcbiAqIG1peGVkLWxpdGVyYWwgbGFzdCBzZWdtZW50cyAoYCFhcHBzL2V4Y2x1ZGVkYCwgYCFhcHBzLypkYCkgbmV2ZXIgc2VlZCwgYW5kIGA/YCwgYnJhY2UsIGFuZFxuICogY2hhcmFjdGVyLWNsYXNzIGxhc3Qgc2VnbWVudHMgYmVoYXZlZCBpbmNvbnNpc3RlbnRseSBhY3Jvc3MgZml4dHVyZXMgKHNvbWV0aW1lcyBkcm9wcGluZyBldmVuXG4gKiB1bnJlbGF0ZWQgc2libGluZyB3b3Jrc3BhY2VzKSwgc28gdGhleSBhcmUgY29uc2VydmF0aXZlbHkgdHJlYXRlZCBhcyBub3Qgc2VlZGluZzsgc2VlXG4gKiBXaWxsQm9vc3Rlci9zaGFyZWQjMTAwNS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc0ltcGxpY2l0V29ya3NwYWNlQmFzZWxpbmUod29ya3NwYWNlczogV29ya3NwYWNlc0RlY2xhcmF0aW9uKTogYm9vbGVhbiB7XG4gIHJldHVybiBnZXRNZWFuaW5nZnVsRGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyh3b3Jrc3BhY2VzKS5zb21lKFxuICAgICh3b3Jrc3BhY2VQYXR0ZXJuKSA9PlxuICAgICAgd29ya3NwYWNlUGF0dGVybi5zdGFydHNXaXRoKCchJykgJiZcbiAgICAgIGdldFNlZWRlZEJhc2VsaW5lR2xvYihub3JtYWxpemVXb3Jrc3BhY2VQYXR0ZXJuQm9keSh3b3Jrc3BhY2VQYXR0ZXJuLnNsaWNlKDEpKSkgIT09IHVuZGVmaW5lZFxuICApO1xufVxuXG4vKipcbiAqIERlY2xhcmVkIHdvcmtzcGFjZSBwYXR0ZXJucyB3aXRob3V0IEJ1bidzIG5vLW9wIG9uZXMgKGBcIlwiYCwgYSBsb25lIGBcIiFcImAsIGFuZCBgXCIuXCJgKSwgd2hpY2ggQnVuXG4gKiBpZ25vcmVzIGVudGlyZWx5IOKAlCBhIGxvbmUgYFwiIVwiYCBtdXN0IG5vdCBhY3RpdmF0ZSB0aGUgbmVnYXRpdmUtb25seSBpbXBsaWNpdCBiYXNlbGluZSwgYW5kIGBcIlwiYFxuICogbXVzdCBub3QgbWFrZSB0aGUgcmVwb3NpdG9yeSByb290IGl0c2VsZiBhIGRpc2NvdmVyZWQgd29ya3NwYWNlLiBEZWNsYXJhdGlvbiBvcmRlciBhbmRcbiAqIGR1cGxpY2F0ZXMgYXJlIHByZXNlcnZlZCDigJQgQnVuIGV2YWx1YXRlcyB0aGUgcGF0dGVybnMgc2VxdWVudGlhbGx5LCBzbyBwb3NpdGlvbiBtYXR0ZXJzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWVhbmluZ2Z1bERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMod29ya3NwYWNlczogV29ya3NwYWNlc0RlY2xhcmF0aW9uKTogc3RyaW5nW10ge1xuICByZXR1cm4gZ2V0RGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyh3b3Jrc3BhY2VzKVxuICAgIC5tYXAoKHdvcmtzcGFjZVBhdHRlcm4pID0+IHtcbiAgICAgIC8vIEJ1biBhcHBsaWVzIGxlYWRpbmctYmFuZyBQQVJJVFkgKHZlcmlmaWVkIHdpdGggQnVuIDEuMy4xNCk6IGAhIXBgIGlzIHRoZSBwb3NpdGl2ZSBgcGBcbiAgICAgIC8vIGFuZCBgISEhcGAgdGhlIG5lZ2F0aW9uIGAhcGAsIHNvIGNhbm9uaWNhbGl6ZSB0byBhdCBtb3N0IG9uZSBiYW5nLlxuICAgICAgY29uc3QgYmFuZ0NvdW50ID0gL14hKi91LmV4ZWMod29ya3NwYWNlUGF0dGVybikhWzBdLmxlbmd0aDtcbiAgICAgIGNvbnN0IHBhdHRlcm5Cb2R5ID0gd29ya3NwYWNlUGF0dGVybi5zbGljZShiYW5nQ291bnQpO1xuICAgICAgcmV0dXJuIGJhbmdDb3VudCAlIDIgPT09IDEgPyBgISR7cGF0dGVybkJvZHl9YCA6IHBhdHRlcm5Cb2R5O1xuICAgIH0pXG4gICAgLmZpbHRlcigod29ya3NwYWNlUGF0dGVybikgPT4ge1xuICAgICAgY29uc3QgcGF0dGVybkJvZHkgPSB3b3Jrc3BhY2VQYXR0ZXJuLnN0YXJ0c1dpdGgoJyEnKSA/IHdvcmtzcGFjZVBhdHRlcm4uc2xpY2UoMSkgOiB3b3Jrc3BhY2VQYXR0ZXJuO1xuICAgICAgLy8gTm9ybWFsaXplIHNvIHNwZWxsaW5ncyBsaWtlIGAuL2AsIGAuLy5gLCBhbmQgYCEuL2AgYXJlIHJlY29nbml6ZWQgYXMgdGhlIHNhbWUgbm8tb3BzXG4gICAgICAvLyAocGF0aC5wb3NpeC5ub3JtYWxpemUoJycpID09PSAnLicsIHNvIHRoZSBlbXB0eSBwYXR0ZXJuIGlzIGNvdmVyZWQgdG9vKS5cbiAgICAgIHJldHVybiBub3JtYWxpemVXb3Jrc3BhY2VQYXR0ZXJuQm9keShwYXR0ZXJuQm9keSkgIT09ICcuJztcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBDb2xsYXBzZXMgYC8vYCwgcmVzb2x2ZXMgYC4vYCwgYW5kIHN0cmlwcyB0cmFpbGluZyBzbGFzaGVzLCBtaXJyb3JpbmcgQnVuJ3MgcGF0aCBoYW5kbGluZy5cbiAqIEEgcHVyZSBzdGFyLXJ1biBzZWdtZW50IG9mIHRocmVlIG9yIG1vcmUgc3RhcnMgYmVoYXZlcyBsaWtlIGAqYCB1bmRlciBCdW4gKGAhb3RoZXIvKioqYFxuICogbWF0Y2hlcyBvdGhlci94KSBidXQgbm90IHVuZGVyIGZhc3QtZ2xvYiwgc28gY2Fub25pY2FsaXplIGl0IHRvIGAqYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVdvcmtzcGFjZVBhdHRlcm5Cb2R5KHBhdHRlcm5Cb2R5OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcGF0aC5wb3NpeFxuICAgIC5ub3JtYWxpemUocGF0dGVybkJvZHkpXG4gICAgLnJlcGxhY2UoL1xcLyskL3UsICcnKVxuICAgIC5zcGxpdCgnLycpXG4gICAgLm1hcCgoc2VnbWVudCkgPT4gKC9eXFwqezMsfSQvdS50ZXN0KHNlZ21lbnQpID8gJyonIDogc2VnbWVudCkpXG4gICAgLmpvaW4oJy8nKTtcbn1cblxuLyoqIFRoZSBpbXBsaWNpdCBiYXNlbGluZSBnbG9iIGEgbmVnYXRpb24gc2VlZHMgdW5kZXIgQnVuJ3MgcnVsZSAyIGFib3ZlLCBvciB1bmRlZmluZWQgaWYgbm9uZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTZWVkZWRCYXNlbGluZUdsb2IobmVnYXRpb25Cb2R5OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBzZWdtZW50cyA9IG5lZ2F0aW9uQm9keS5zcGxpdCgnLycpO1xuICBpZiAoc2VnbWVudHMubGVuZ3RoICE9PSAyKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBbZmlyc3RTZWdtZW50LCBsYXN0U2VnbWVudF0gPSBzZWdtZW50cyBhcyBbc3RyaW5nLCBzdHJpbmddO1xuICBpZiAoIS9eXFwqKyQvdS50ZXN0KGxhc3RTZWdtZW50KSB8fCAvXlxcKiskL3UudGVzdChmaXJzdFNlZ21lbnQpKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gbGFzdFNlZ21lbnQgPT09ICcqKicgPyAnKionIDogJyovKic7XG59XG5cbi8qKiBXb3Jrc3BhY2UgcGF0dGVybnMgZnJvbSBlaXRoZXIgdGhlIGFycmF5IGZvcm0gb3IgWWFybiB2MSdzIGB7IHBhY2thZ2VzOiBb4oCmXSB9YCBvYmplY3QgZm9ybS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zKHdvcmtzcGFjZXM6IFdvcmtzcGFjZXNEZWNsYXJhdGlvbik6IHN0cmluZ1tdIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkod29ya3NwYWNlcykpIHJldHVybiB3b3Jrc3BhY2VzO1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh3b3Jrc3BhY2VzPy5wYWNrYWdlcykgPyB3b3Jrc3BhY2VzLnBhY2thZ2VzIDogW107XG59XG5cbi8qKlxuICogV2hldGhlciBhIGRlY2xhcmVkIHdvcmtzcGFjZSBwYXR0ZXJuIChuZWdhdGl2ZSBvbmVzIGluY2x1ZGVkKSBzdGF5cyBpbnNpZGUgdGhlIHJlcG9zaXRvcnk6XG4gKiBhYnNvbHV0ZSBvciBgLi5gLXRyYXZlcnNpbmcgcGF0dGVybnMgd291bGQgbWFrZSBjb25zdW1lcnMgc3VjaCBhcyBub2RlX21vZHVsZXMgY2xlYW51cCBvcGVyYXRlXG4gKiBvbiBhbm90aGVyIHJlcG9zaXRvcnkncyBmaWxlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzSW5SZXBvc2l0b3J5V29ya3NwYWNlUGF0dGVybih3b3Jrc3BhY2VQYXR0ZXJuOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcGF0dGVybkJvZHkgPSB3b3Jrc3BhY2VQYXR0ZXJuLnN0YXJ0c1dpdGgoJyEnKSA/IHdvcmtzcGFjZVBhdHRlcm4uc2xpY2UoMSkgOiB3b3Jrc3BhY2VQYXR0ZXJuO1xuICByZXR1cm4gIXBhdGgucG9zaXguaXNBYnNvbHV0ZShwYXR0ZXJuQm9keSkgJiYgIXBhdHRlcm5Cb2R5LnNwbGl0KCcvJykuaW5jbHVkZXMoJy4uJyk7XG59XG4iLCJpbXBvcnQgY3J5cHRvIGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbi8qKlxuICogQW5jaG9yZWQgdG8gYFwiLCBgIHNvIG9ubHkgYSByZWdpc3RyeSBlbnRyeSdzIGByZXNvbHZlZGAgc2xvdCBpcyBjbGVhcmVkLiBBIGRpcmVjdCB0YXJiYWxsXG4gKiBkZXBlbmRlbmN5IGNhcnJpZXMgaXRzIFVSTCBpbiB0aGUgd29ya3NwYWNlIGRlc2NyaXB0b3IgYW5kIHR1cGxlIGlkZW50aWZpZXIgaW5zdGVhZCwgYW5kIHRob3NlXG4gKiBVUkxzIG11c3QgcmVtYWluIGludGFjdC5cbiAqL1xuY29uc3QgZ3VhcmRSZXNvbHZlZFVybFBhdHRlcm4gPSAvKFwiLCApXCJodHRwczpcXC9cXC9ucG1cXC5mbGF0dFxcLnRlY2hcXC9bXlwiXSpcIi9nO1xuXG4vKipcbiAqIFJlbW92ZSBUYWt1bWkgR3VhcmQgcHJveHkgVVJMcyBmcm9tIHRoZSBuZWFyZXN0IGVuY2xvc2luZyBidW4ubG9jay5cbiAqXG4gKiBCdW4gd3JpdGVzIHRoZSB3b3Jrc3BhY2Ugcm9vdCdzIGxvY2tmaWxlIGV2ZW4gd2hlbiBhbiBpbnN0YWxsIHJ1bnMgZnJvbSBhIGNoaWxkIHBhY2thZ2UuIEluIGFcbiAqIEdpdCBjaGVja291dCB0aGUgc2VhcmNoIGNsaW1icyB0byB0aGF0IHJvb3Q7IHdpdGhvdXQgYSBjaGVja291dCBib3VuZGFyeSBpdCBpbnNwZWN0cyBvbmx5IHRoZVxuICogc3RhcnRpbmcgZGlyZWN0b3J5IHNvIGl0IGNhbm5vdCByZXdyaXRlIGFuIHVucmVsYXRlZCBhbmNlc3RvcidzIGxvY2tmaWxlLiBUaGUgcHJveHkgaXNcbiAqIGluc3RhbGwtdGltZSBwb2xpY3kgcmF0aGVyIHRoYW4gcmVwb3NpdG9yeSBzdGF0ZTogYW4gZW1wdHkgcmVzb2x2ZWQgc2xvdCBzdGlsbCBtYWtlcyBCdW4gdXNlIHRoZVxuICogY29uZmlndXJlZCBkZWZhdWx0IHJlZ2lzdHJ5LlxuICpcbiAqIEByZXR1cm5zIFRoZSBub3JtYWxpemVkIGxvY2tmaWxlIHBhdGgsIG9yIHVuZGVmaW5lZCB3aGVuIG5vIGNoYW5nZSB3YXMgbmVlZGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplQnVuTG9ja2ZpbGUoc3RhcnREaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBsb2NrZmlsZVBhdGggPSBmaW5kQnVuTG9ja2ZpbGVQYXRoKHN0YXJ0RGlyUGF0aCk7XG4gIGlmICghbG9ja2ZpbGVQYXRoKSByZXR1cm47XG5cbiAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhsb2NrZmlsZVBhdGgsICd1dGY4Jyk7XG4gIGNvbnN0IG5vcm1hbGl6ZWRDb250ZW50ID0gY29udGVudC5yZXBsYWNlQWxsKGd1YXJkUmVzb2x2ZWRVcmxQYXR0ZXJuLCAnJDFcIlwiJyk7XG4gIGlmIChub3JtYWxpemVkQ29udGVudCA9PT0gY29udGVudCkgcmV0dXJuO1xuXG4gIC8vIEEgc2libGluZyB0ZW1wIGZpbGUgbWFrZXMgdGhlIHJlcGxhY2VtZW50IGFuIGF0b21pYyBzYW1lLWRpcmVjdG9yeSByZW5hbWUsIHNvIGFuIGludGVycnVwdGVkXG4gIC8vIHdyaXRlIGNhbm5vdCBsZWF2ZSBhIHRydW5jYXRlZCBidW4ubG9jayBiZWhpbmQuXG4gIGNvbnN0IHRlbXBvcmFyeVBhdGggPSBgJHtsb2NrZmlsZVBhdGh9Lm5vcm1hbGl6aW5nLiR7cHJvY2Vzcy5waWR9LiR7Y3J5cHRvLnJhbmRvbVVVSUQoKX1gO1xuICB0cnkge1xuICAgIC8vIHN0YXQncyBtb2RlIGluY2x1ZGVzIGZpbGUtdHlwZSBiaXRzLCB3aGljaCBjaG1vZCBpcyBub3Qgc3BlY2lmaWVkIHRvIGFjY2VwdC5cbiAgICBjb25zdCBtb2RlID0gZnMuc3RhdFN5bmMobG9ja2ZpbGVQYXRoKS5tb2RlICYgMG83Nzc7XG4gICAgZnMud3JpdGVGaWxlU3luYyh0ZW1wb3JhcnlQYXRoLCBub3JtYWxpemVkQ29udGVudCwgeyBtb2RlIH0pO1xuICAgIC8vIHdyaXRlRmlsZVN5bmMncyBtb2RlIGlzIG1hc2tlZCBieSB0aGUgcHJvY2VzcyB1bWFzazsgY2htb2QgcmVzdG9yZXMgdGhlIGV4YWN0IG9yaWdpbmFsIGJpdHMuXG4gICAgZnMuY2htb2RTeW5jKHRlbXBvcmFyeVBhdGgsIG1vZGUpO1xuICAgIGZzLnJlbmFtZVN5bmModGVtcG9yYXJ5UGF0aCwgbG9ja2ZpbGVQYXRoKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBmcy5ybVN5bmModGVtcG9yYXJ5UGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgfVxuICByZXR1cm4gbG9ja2ZpbGVQYXRoO1xufVxuXG5mdW5jdGlvbiBmaW5kQnVuTG9ja2ZpbGVQYXRoKHN0YXJ0RGlyUGF0aDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcmVzb2x2ZWRTdGFydERpclBhdGggPSBwYXRoLnJlc29sdmUoc3RhcnREaXJQYXRoKTtcbiAgY29uc3QgcmVwb3NpdG9yeVJvb3REaXJQYXRoID0gZmluZFJlcG9zaXRvcnlSb290RGlyUGF0aChyZXNvbHZlZFN0YXJ0RGlyUGF0aCk7XG4gIGlmICghcmVwb3NpdG9yeVJvb3REaXJQYXRoKSB7XG4gICAgY29uc3QgbG9ja2ZpbGVQYXRoID0gcGF0aC5qb2luKHJlc29sdmVkU3RhcnREaXJQYXRoLCAnYnVuLmxvY2snKTtcbiAgICByZXR1cm4gZnMuZXhpc3RzU3luYyhsb2NrZmlsZVBhdGgpID8gbG9ja2ZpbGVQYXRoIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgbGV0IGRpclBhdGggPSByZXNvbHZlZFN0YXJ0RGlyUGF0aDtcbiAgd2hpbGUgKHRydWUpIHtcbiAgICBjb25zdCBsb2NrZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgJ2J1bi5sb2NrJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMobG9ja2ZpbGVQYXRoKSkgcmV0dXJuIGxvY2tmaWxlUGF0aDtcbiAgICBpZiAoZGlyUGF0aCA9PT0gcmVwb3NpdG9yeVJvb3REaXJQYXRoKSByZXR1cm47XG5cbiAgICBkaXJQYXRoID0gcGF0aC5kaXJuYW1lKGRpclBhdGgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmRSZXBvc2l0b3J5Um9vdERpclBhdGgoc3RhcnREaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBsZXQgZGlyUGF0aCA9IHN0YXJ0RGlyUGF0aDtcbiAgd2hpbGUgKHRydWUpIHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJy5naXQnKSkpIHJldHVybiBkaXJQYXRoO1xuXG4gICAgY29uc3QgcGFyZW50RGlyUGF0aCA9IHBhdGguZGlybmFtZShkaXJQYXRoKTtcbiAgICBpZiAocGFyZW50RGlyUGF0aCA9PT0gZGlyUGF0aCkgcmV0dXJuO1xuICAgIGRpclBhdGggPSBwYXJlbnREaXJQYXRoO1xuICB9XG59XG4iLCIvKiogV2hldGhlciBhIERvY2tlcmZpbGUgY29uc3VtZXMgd2IncyBnZW5lcmF0ZWQgbm9uLXNlY3JldCBlbnZpcm9ubWVudCBkaXJlY3RseSBvciB0aHJvdWdoIGl0cyBoZWxwZXIuICovXG5leHBvcnQgZnVuY3Rpb24gY29uc3VtZXNEb2NrZXJFbnYoZG9ja2VyZmlsZVRleHQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZG9ja2VyZmlsZVRleHRcbiAgICAuc3BsaXQoJ1xcbicpXG4gICAgLnNvbWUoKGxpbmUpID0+ICEvXlxccyojL3UudGVzdChsaW5lKSAmJiAobGluZS5pbmNsdWRlcygnLmRvY2tlci5lbnYnKSB8fCBsaW5lLmluY2x1ZGVzKCdhcHBseS1kb2NrZXItZW52LnNoJykpKTtcbn1cbiIsImV4cG9ydCBjb25zdCBnbG9iSWdub3JlID0gW1xuICAnKiovbm9kZV9tb2R1bGVzLyoqJyxcbiAgJyoqLy5hbnRpZ3Jhdml0eWNsaS8qKicsXG4gIC8vIEdpdCdzIG9iamVjdCBzdG9yZSBob2xkcyBjb3BpZXMgb2YgdHJhY2tlZCBmaWxlcyAoYW5kIGBkb3Q6IHRydWVgIG1ha2VzIHRoZW0gdmlzaWJsZSksIHNvXG4gIC8vIHNjYW5uaW5nIGl0IHdvdWxkIGJvdGggc2xvdyBldmVyeSBnbG9iIGRvd24gYW5kIGxldCBzdGFsZSBibG9icyBpbmZsdWVuY2UgZGV0ZWN0aW9uLlxuICAnKiovLmdpdC8qKicsXG4gIC8vIFRoZSBvcmctc3RhbmRhcmQgdGVtcG9yYXJ5IGRpcmVjdG9yeTsgc3RhbGUgY29waWVzIHVuZGVyIGl0IChlLmcuIHJldmlldyBzY3JhdGNoIGRpcnMpIG11c3RcbiAgLy8gbm90IGluZmx1ZW5jZSBsYW5ndWFnZSBkZXRlY3Rpb24uXG4gICcqKi8udG1wLyoqJyxcbiAgJyoqLy50bXAtKi8qKicsXG4gIC8vIExvY2FsIGNhY2hlcyBjYW4gY29udGFpbiBjb21wbGV0ZSB0aGlyZC1wYXJ0eSBzb3VyY2UgY2hlY2tvdXRzLiBUcmVhdGluZyB0aG9zZSBhcyByZXBvc2l0b3J5XG4gIC8vIGNvZGUgZ2VuZXJhdGVzIHdvcmtmbG93cyBmb3IgcGF0aHMgdGhhdCBhcmUgZ2l0aWdub3JlZCBhbmQgYWJzZW50IGZyb20gZnJlc2ggQ0kgY2hlY2tvdXRzLlxuICAnKiovLmNhY2hlLyoqJyxcbiAgJyoqLy52ZW52LyoqJyxcbiAgJyoqL3Rlc3QtZml4dHVyZXMvKionLFxuICAnKiovdGVzdC9maXh0dXJlcy8qKicsXG4gICcqKi9kaXN0LyoqJyxcbiAgJyoqL2J1aWxkLyoqJyxcbiAgJyoqL3RhcmdldC8qKicsXG4gICcqKi90ZW1wLyoqJyxcbiAgJyoqL3RtcC8qKicsXG5dO1xuIiwiY2xhc3MgT3B0aW9ucyB7XG4gIGlzVmVyYm9zZSA9IGZhbHNlO1xufVxuXG5leHBvcnQgY29uc3Qgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7XG4iLCJpbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi9vcHRpb25zLmpzJztcblxuY2xhc3MgTG9nZ2VyIHtcbiAgYXN5bmMgZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbihuYW1lOiBzdHJpbmcsIGZ1bmM6ICgpID0+IFByb21pc2U8dm9pZD4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgLS0tLS0tLS0tICR7bmFtZX0gc3RhcnQgLS0tLS0tLS0tYCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmdW5jKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRXJyb3Igb2NjdXJyZWQgaW4gJHtuYW1lfTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3Iuc3RhY2sgOiBTdHJpbmcoZXJyb3IpfX1gKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYC0tLS0tLS0tLS0gJHtuYW1lfSBlbmQgLS0tLS0tLS0tLWApO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgbG9nZ2VyID0gbmV3IExvZ2dlcigpO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxubGV0IHJlYWxSb290RGlyUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG5leHBvcnQgY29uc3QgZnNVdGlsID0ge1xuICAvKiogQ29uZmluZXMgZ2VuZXJhdGVGaWxlIHdyaXRlcyB0byB0aGUgcmVwb3NpdG9yeSByb290ZWQgYXQgcm9vdERpclBhdGggKHVuZGVmaW5lZCBkaXNhYmxlcyBpdCkuICovXG4gIHNldFJvb3REaXJQYXRoKHJvb3REaXJQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICByZWFsUm9vdERpclBhdGggPSByb290RGlyUGF0aCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogZnMucmVhbHBhdGhTeW5jKHJvb3REaXJQYXRoKTtcbiAgfSxcbiAgLyoqXG4gICAqIFJldHVybnMgdW5kZWZpbmVkIG9ubHkgd2hlbiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdC4gT3RoZXIgZmFpbHVyZXMgKGUuZy4gcGVybWlzc2lvbnMpIGFyZVxuICAgKiByZXRocm93biBzbyBjYWxsZXJzIHJlZ2VuZXJhdGluZyBjb25maWcgZmlsZXMgbmV2ZXIgb3ZlcndyaXRlIGNvbnRlbnQgdGhleSBjb3VsZCBub3QgcmVhZC5cbiAgICovXG4gIGFzeW5jIHJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKChlcnJvciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb24pLmNvZGUgPT09ICdFTk9FTlQnKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9LFxuICAvKiogVGVsbHMgd2hldGhlciBhIHdyaXRlIHRvIGZpbGVQYXRoIHdvdWxkIHBhc3MgdGhlIHN5bWxpbmsvcmVwb3NpdG9yeS1jb250YWlubWVudCBndWFyZHMuICovXG4gIGFzeW5jIGlzQ29uZmluZWRXcml0YWJsZVBhdGgoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiBhd2FpdCBpc0NvbmZpbmVkV3JpdGFibGVQYXRoKGZpbGVQYXRoKTtcbiAgfSxcbiAgLyoqXG4gICAqIFJlYWRzIGEgc291cmNlIGZpbGUsIHJldHVybmluZyB1bmRlZmluZWQgd2hlbiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCBPUiB3aGVuIGl0XG4gICAqIHJlc29sdmVzIG91dHNpZGUgdGhlIHJlcG9zaXRvcnkg4oCUIGEgY29tbWl0dGVkIHN5bWxpbmsgcG9pbnRpbmcgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeSBtdXN0XG4gICAqIG5vdCBnZXQgaXRzIHRhcmdldCdzIGNvbnRlbnQgY29waWVkIGludG8gYSB0cmFja2VkIGZpbGUuIEEgc3ltbGluayB3aG9zZSByZXNvbHZlZCB0YXJnZXRcbiAgICogc3RheXMgaW5zaWRlIHRoZSByZXBvc2l0b3J5IGlzIGxlZ2l0aW1hdGUgKGUuZy4gYC5ub2RlLXZlcnNpb24gLT4gLm52bXJjYCkgYW5kIGlzIHJlYWQuXG4gICAqL1xuICBhc3luYyByZWFkRmlsZUNvbmZpbmVkSWZFeGlzdHMoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmcy5wcm9taXNlcy5sc3RhdChmaWxlUGF0aCkuY2F0Y2goKCkgPT4ge30pO1xuICAgIGlmICghc3RhdHMpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKHN0YXRzLmlzU3ltYm9saWNMaW5rKCkpIHtcbiAgICAgIGxldCByZWFsRmlsZVBhdGg6IHN0cmluZztcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlYWxGaWxlUGF0aCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWxwYXRoKGZpbGVQYXRoKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgcmVhZGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIGl0IGlzIGEgZGFuZ2xpbmcgc3ltYm9saWMgbGluay5gKTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgcmVhbFJvb3REaXJQYXRoICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgcmVhbEZpbGVQYXRoICE9PSByZWFsUm9vdERpclBhdGggJiZcbiAgICAgICAgIXJlYWxGaWxlUGF0aC5zdGFydHNXaXRoKHJlYWxSb290RGlyUGF0aCArIHBhdGguc2VwKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCByZWFkaW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgaXQgcmVzb2x2ZXMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeS5gKTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gICAgfVxuICAgIGlmICghKGF3YWl0IGhhc0NvbmZpbmVkUGFyZW50KGZpbGVQYXRoKSkpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCByZWFkaW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgaXQgcmVzb2x2ZXMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeS5gKTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gIH0sXG4gIC8qKlxuICAgKiBSZW1vdmVzIGZpbGVQYXRoIChmb3JjZSwgb3B0aW9uYWxseSByZWN1cnNpdmUpIG9ubHkgd2hlbiBpdHMgUEFSRU5UIGRpcmVjdG9yeSByZXNvbHZlcyBpbnNpZGVcbiAgICogdGhlIHJlcG9zaXRvcnksIHNvIGEgc3ltbGlua2VkIGRpcmVjdG9yeSAoZS5nLiBhIGNvbW1pdHRlZCAuZ2l0aHViL3dvcmtmbG93cyBsaW5rKSBjYW4gbmV2ZXJcbiAgICogbWFrZSBjbGVhbnVwIGRlbGV0ZSBmaWxlcyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LiBSZW1vdmluZyBhIHN5bWxpbmsgZW50cnkgaXRzZWxmIGlzIGFsbG93ZWQ6XG4gICAqIHRoYXQgZGVsZXRlcyBvbmx5IHRoZSBsaW5rLCBuZXZlciBpdHMgdGFyZ2V0LiBSZXR1cm5zIHdoZXRoZXIgdGhlIHJlbW92YWwgd2FzIHBlcmZvcm1lZC5cbiAgICovXG4gIGFzeW5jIHJlbW92ZUNvbmZpbmVkKGZpbGVQYXRoOiBzdHJpbmcsIG9wdGlvbnM/OiB7IHJlY3Vyc2l2ZT86IGJvb2xlYW4gfSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICghKGF3YWl0IGhhc0NvbmZpbmVkUGFyZW50KGZpbGVQYXRoKSkpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCByZW1vdmluZyAke2ZpbGVQYXRofSBiZWNhdXNlIGl0IHJlc29sdmVzIG91dHNpZGUgdGhlIHJlcG9zaXRvcnkuYCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IG9wdGlvbnM/LnJlY3Vyc2l2ZSA/PyBmYWxzZSB9KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgLyoqIFdyaXRlcyBjb250ZW50IHZlcmJhdGltLCBhcHBseWluZyB0aGUgc2FtZSBzeW1saW5rL3JlcG9zaXRvcnktY29udGFpbm1lbnQgZ3VhcmRzIGFzIGdlbmVyYXRlRmlsZS4gKi9cbiAgYXN5bmMgd3JpdGVGaWxlQ29uZmluZWQoZmlsZVBhdGg6IHN0cmluZywgY29udGVudDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKCEoYXdhaXQgaXNDb25maW5lZFdyaXRhYmxlUGF0aChmaWxlUGF0aCkpKSByZXR1cm4gZmFsc2U7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGZpbGVQYXRoLCBjb250ZW50KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgLyoqIFJldHVybnMgd2hldGhlciB0aGUgZmlsZSB3YXMgYWN0dWFsbHkgZ2VuZXJhdGVkIChmYWxzZSB3aGVuIHRoZSBjb25maW5lbWVudCBndWFyZHMgc2tpcCBpdCkuICovXG4gIGFzeW5jIGdlbmVyYXRlRmlsZShmaWxlUGF0aDogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcsIGxpbmVFbmRpbmc6ICdcXG4nIHwgJ1xcclxcbicgPSAnXFxuJyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICghKGF3YWl0IGlzQ29uZmluZWRXcml0YWJsZVBhdGgoZmlsZVBhdGgpKSkgcmV0dXJuIGZhbHNlO1xuICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHBhdGguZGlybmFtZShmaWxlUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIC8vIGB0cmltYCB0cmVhdHMgYSBCT00gYXMgd2hpdGVzcGFjZSwgc28gaXQgaXMgcmVhdHRhY2hlZCBhdCBwb3NpdGlvbiAwOiBkcm9wcGluZyBpdCB3b3VsZFxuICAgIC8vIHJld3JpdGUgdGhlIGVuY29kaW5nIG1hcmtlciBvZiBhIGZpbGUgdGhlIGdlbmVyYXRvciB3YXMgb25seSBhc2tlZCB0byB1cGRhdGUuXG4gICAgY29uc3QgYnl0ZU9yZGVyTWFyayA9IGNvbnRlbnQuc3RhcnRzV2l0aCgn77u/JykgPyAn77u/JyA6ICcnO1xuICAgIGxldCBub3JtYWxpemVkQ29udGVudCA9IGNvbnRlbnQudHJpbSgpO1xuICAgIGlmIChub3JtYWxpemVkQ29udGVudCkge1xuICAgICAgbm9ybWFsaXplZENvbnRlbnQgPSBgJHtieXRlT3JkZXJNYXJrfSR7bm9ybWFsaXplZENvbnRlbnR9JHtsaW5lRW5kaW5nfWA7XG4gICAgfVxuICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShmaWxlUGF0aCwgbm9ybWFsaXplZENvbnRlbnQpO1xuICAgIGNvbnNvbGUubG9nKGBHZW5lcmF0ZWQvVXBkYXRlZCAke2ZpbGVQYXRofWApO1xuICAgIHJldHVybiB0cnVlO1xuICB9LFxufTtcblxuYXN5bmMgZnVuY3Rpb24gaXNDb25maW5lZFdyaXRhYmxlUGF0aChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIC8vIE5ldmVyIHdyaXRlIHRocm91Z2ggYSBzeW1saW5rOiBhIChwb3NzaWJseSBkYW5nbGluZykgbGluayBjb21taXR0ZWQgaW4gdGhlIHRhcmdldCByZXBvc2l0b3J5XG4gIC8vIGNvdWxkIHJlZGlyZWN0IHRoZSB3cml0ZSBvdXRzaWRlIGl0LlxuICBjb25zdCBzdGF0cyA9IGF3YWl0IGZzLnByb21pc2VzLmxzdGF0KGZpbGVQYXRoKS5jYXRjaCgoKSA9PiB7fSk7XG4gIGlmIChzdGF0cz8uaXNTeW1ib2xpY0xpbmsoKSkge1xuICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCB3cml0aW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgaXQgaXMgYSBzeW1ib2xpYyBsaW5rLmApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoIShhd2FpdCBoYXNDb25maW5lZFBhcmVudChmaWxlUGF0aCkpKSB7XG4gICAgY29uc29sZS53YXJuKGBTa2lwcGVkIHdyaXRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSBpdCByZXNvbHZlcyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LmApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLy8gQSBzeW1saW5rZWQgcGFyZW50IGRpcmVjdG9yeSB3b3VsZCByZWRpcmVjdCByZWFkcywgd3JpdGVzLCBhbmQgcmVtb3ZhbHMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeSxcbi8vIHNvIHJlcXVpcmUgdGhlIGNsb3Nlc3QgZXhpc3RpbmcgYW5jZXN0b3IgdG8gcmVzb2x2ZSBpbnNpZGUgdGhlIHJvb3Qgc2V0IGJ5IHRoZSBDTEkgZW50cnkgcG9pbnQuXG5hc3luYyBmdW5jdGlvbiBoYXNDb25maW5lZFBhcmVudChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGlmIChyZWFsUm9vdERpclBhdGggPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRydWU7XG4gIGxldCBhbmNlc3RvclBhdGggPSBwYXRoLmRpcm5hbWUoZmlsZVBhdGgpO1xuICB3aGlsZSAoIWZzLmV4aXN0c1N5bmMoYW5jZXN0b3JQYXRoKSkge1xuICAgIGFuY2VzdG9yUGF0aCA9IHBhdGguZGlybmFtZShhbmNlc3RvclBhdGgpO1xuICB9XG4gIGNvbnN0IHJlYWxBbmNlc3RvclBhdGggPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFscGF0aChhbmNlc3RvclBhdGgpO1xuICByZXR1cm4gcmVhbEFuY2VzdG9yUGF0aCA9PT0gcmVhbFJvb3REaXJQYXRoIHx8IHJlYWxBbmNlc3RvclBhdGguc3RhcnRzV2l0aChyZWFsUm9vdERpclBhdGggKyBwYXRoLnNlcCk7XG59XG4iLCJpbXBvcnQgeyBQcm9taXNlUG9vbCB9IGZyb20gJ21pbmltYWwtcHJvbWlzZS1wb29sJztcblxuZXhwb3J0IGNvbnN0IHByb21pc2VQb29sID0gbmV3IFByb21pc2VQb29sKCk7XG4iLCJpbXBvcnQgeyBBUEkgfSBmcm9tICd0eXBlc2NyaXB0L3Vuc3RhYmxlL2FzeW5jJztcbmltcG9ydCB0eXBlIHsgU291cmNlRmlsZSB9IGZyb20gJ3R5cGVzY3JpcHQvdW5zdGFibGUvYXN0JztcblxuLy8gVHlwZVNjcmlwdCA3IHNoaXBzIHRoZSBuYXRpdmUgKEdvKSBjb21waWxlciBhcyB0aGUgYHR5cGVzY3JpcHRgIHBhY2thZ2UgYW5kIG5vXG4vLyBsb25nZXIgZXhwb3NlcyBhbiBpbi1wcm9jZXNzIHBhcnNlciBzdWNoIGFzIGB0cy5jcmVhdGVTb3VyY2VGaWxlYC4gUGFyc2luZyBub3dcbi8vIGhhcHBlbnMgaW4gYSBzcGF3bmVkIGNvbXBpbGVyIHNlcnZlciByZWFjaGVkIHRocm91Z2ggdGhlIGFzeW5jaHJvbm91cyBBUEksIHNvIHdlXG4vLyBrZWVwIGEgc2luZ2xlIGxhemlseS1jcmVhdGVkIGluc3RhbmNlIGFuZCByZXVzZSBpdCBhY3Jvc3MgZXZlcnkgZml4ZXIgdG8gYXZvaWRcbi8vIHBheWluZyB0aGUgcHJvY2Vzcy1zcGF3biBjb3N0IHBlciBmaWxlLlxubGV0IGFwaTogQVBJIHwgdW5kZWZpbmVkO1xubGV0IGNvbm5lY3RlZDogUHJvbWlzZTx1bmtub3duPiB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBQYXJzZXMgYSBzb3VyY2UgZmlsZSBpbnRvIGEgVHlwZVNjcmlwdCBBU1QgdXNpbmcgdGhlIGJ1bmRsZWQgbmF0aXZlIGNvbXBpbGVyLlxuICogUmV0dXJucyBgdW5kZWZpbmVkYCB3aGVuIHRoZSBjb21waWxlciBjYW5ub3QgbG9hZCB0aGUgZmlsZSAoZS5nLiBpdCBpcyBtaXNzaW5nXG4gKiBvciB1bnBhcnNhYmxlKSBzbyBjYWxsZXJzIGNhbiBmYWxsIGJhY2sgdG8gY29uc2VydmF0aXZlIGJlaGF2aW9yLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcGFyc2VTb3VyY2VGaWxlKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPFNvdXJjZUZpbGUgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBhcGkgPSBhd2FpdCBnZXRBcGkoKTtcbiAgICBjb25zdCBzbmFwc2hvdCA9IGF3YWl0IGFwaS51cGRhdGVTbmFwc2hvdCh7IG9wZW5GaWxlczogW2ZpbGVQYXRoXSB9KTtcbiAgICBjb25zdCBwcm9qZWN0ID0gYXdhaXQgc25hcHNob3QuZ2V0RGVmYXVsdFByb2plY3RGb3JGaWxlKGZpbGVQYXRoKTtcbiAgICByZXR1cm4gYXdhaXQgcHJvamVjdD8ucHJvZ3JhbS5nZXRTb3VyY2VGaWxlKGZpbGVQYXRoKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIFNodXRzIGRvd24gdGhlIHNwYXduZWQgY29tcGlsZXIgc2VydmVyLiBUaGUgc2VydmVyIGtlZXBzIGFuIG9wZW4gSVBDIGNoYW5uZWxcbiAqIHRoYXQgd291bGQgb3RoZXJ3aXNlIGtlZXAgdGhlIHJ1bnRpbWUgZXZlbnQgbG9vcCBhbGl2ZSwgc28gd2JmeSBtdXN0IGNhbGwgdGhpc1xuICogb25jZSBpdHMgcnVuIGZpbmlzaGVzIGZvciB0aGUgcHJvY2VzcyB0byBleGl0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGlzcG9zZVR5cGVTY3JpcHRBcGkoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGFwaT8uY2xvc2UoKTtcbiAgYXBpID0gdW5kZWZpbmVkO1xuICBjb25uZWN0ZWQgPSB1bmRlZmluZWQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEFwaSgpOiBQcm9taXNlPEFQST4ge1xuICBhcGkgPz89IG5ldyBBUEkoeyBjd2Q6IHByb2Nlc3MuY3dkKCkgfSk7XG4gIC8vIFRoZSBjbGllbnQgbWFya3MgaXRzZWxmIGNvbm5lY3RlZCBvbmx5IG9uY2UgaXRzIGZpcnN0IHNwYXduIGNvbXBsZXRlcywgc28gY29uY3VycmVudFxuICAvLyBmaXJzdCByZXF1ZXN0cyAodGhlIGZpeGVycyBydW4gaW4gcGFyYWxsZWwpIHdvdWxkIGVhY2ggc3Bhd24gYSBjb21waWxlciBzZXJ2ZXI7IHRoZVxuICAvLyBleHRyYSBzZXJ2ZXJzIGFyZSBuZXZlciBjbG9zZWQgYW5kIGtlZXAgdGhlIHByb2Nlc3MgYWxpdmUgYWZ0ZXIgYGRpc3Bvc2VUeXBlU2NyaXB0QXBpYC5cbiAgLy8gVGhlIGZpcnN0IHJlcXVlc3QgaXMgdGhlcmVmb3JlIGF3YWl0ZWQgb25jZSBiZWZvcmUgYW55IG90aGVyIGlzIHNlbnQ7IGEgZmFpbGVkIG9uZSBpc1xuICAvLyBmb3Jnb3R0ZW4gc28gdGhhdCB0aGUgbmV4dCByZXF1ZXN0IGNvbm5lY3RzIGFnYWluIGluc3RlYWQgb2YgZmFpbGluZyBmb3IgdGhlIHdob2xlIHJ1bi5cbiAgY29ubmVjdGVkID8/PSBhcGkudXBkYXRlU25hcHNob3QoKS5jYXRjaCgoZXJyb3I6IHVua25vd24pID0+IHtcbiAgICBjb25uZWN0ZWQgPSB1bmRlZmluZWQ7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH0pO1xuICBhd2FpdCBjb25uZWN0ZWQ7XG4gIHJldHVybiBhcGk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgKiBhcyBhc3QgZnJvbSAndHlwZXNjcmlwdC91bnN0YWJsZS9hc3QnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBwYXJzZVNvdXJjZUZpbGUgfSBmcm9tICcuLi91dGlscy90eXBlc2NyaXB0QXBpLmpzJztcblxuLy8gU2V0dGluZ3MgZXZlcnkgV2lsbEJvb3N0ZXIgTmV4dC5qcyBwcm9qZWN0IHNob3VsZCBjYXJyeS4gYG5hbWVgIGlzIHRoZSB0b3AtbGV2ZWxcbi8vIHByb3BlcnR5IGtleSB1c2VkIHRvIGRldGVjdCB3aGV0aGVyIHRoZSBzZXR0aW5nIGFscmVhZHkgZXhpc3RzOyBgdGV4dGAgaXMgaW5zZXJ0ZWRcbi8vIHZlcmJhdGltIChhIHdob2xlIGBrZXk6IHZhbHVlYCBwYWlyKSB3aGVuIHRoZSBrZXkgaXMgbWlzc2luZy5cbmNvbnN0IG1hbmFnZWRQcm9wZXJ0aWVzOiByZWFkb25seSB7IG5hbWU6IHN0cmluZzsgdGV4dDogc3RyaW5nIH1bXSA9IFtcbiAgeyBuYW1lOiAncmVhY3RDb21waWxlcicsIHRleHQ6ICdyZWFjdENvbXBpbGVyOiB0cnVlJyB9LFxuICB7IG5hbWU6ICdyZWFjdFN0cmljdE1vZGUnLCB0ZXh0OiAncmVhY3RTdHJpY3RNb2RlOiB0cnVlJyB9LFxuICB7IG5hbWU6ICd0eXBlc2NyaXB0JywgdGV4dDogJ3R5cGVzY3JpcHQ6IHsgaWdub3JlQnVpbGRFcnJvcnM6IHRydWUgfScgfSxcbl07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhOZXh0Q29uZmlnSnNvbihjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhOZXh0Q29uZmlnSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IFsndHMnLCAnbXRzJywgJ2N0cycsICdqcycsICdtanMnLCAnY2pzJ11cbiAgICAgIC5tYXAoKGV4dCkgPT4gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBgbmV4dC5jb25maWcuJHtleHR9YCkpXG4gICAgICAuZmluZCgocCkgPT4gZnMuZXhpc3RzU3luYyhwKSk7XG4gICAgaWYgKCFmaWxlUGF0aCkgcmV0dXJuO1xuXG4gICAgY29uc3QgZXh0cmFjdGVkID0gYXdhaXQgZ2V0TmV4dENvbmZpZ09iamVjdExpdGVyYWwoZmlsZVBhdGgpO1xuICAgIGlmICghZXh0cmFjdGVkKSByZXR1cm47XG4gICAgY29uc3QgeyBzb3VyY2UsIG9iamVjdExpdGVyYWwgfSA9IGV4dHJhY3RlZDtcblxuICAgIC8vIGBwcm9wZXJ0aWVzYCBpbmNsdWRlcyBzcHJlYWQgYXNzaWdubWVudHMgKGAuLi5yZXN0YCkgdGhhdCBjYXJyeSBubyBuYW1lLCBzbyBndWFyZCBiZWZvcmUgcmVhZGluZyBpdC5cbiAgICBjb25zdCBleGlzdGluZ1Byb3BlcnRpZXMgPSBuZXcgU2V0KFxuICAgICAgb2JqZWN0TGl0ZXJhbC5wcm9wZXJ0aWVzLm1hcCgocHJvcGVydHkpID0+XG4gICAgICAgICduYW1lJyBpbiBwcm9wZXJ0eSAmJiBwcm9wZXJ0eS5uYW1lID8gZ2V0UHJvcGVydHlLZXkocHJvcGVydHkubmFtZSwgc291cmNlKSA6IHVuZGVmaW5lZFxuICAgICAgKVxuICAgICk7XG4gICAgY29uc3QgcHJvcGVydHlUZXh0cyA9IG1hbmFnZWRQcm9wZXJ0aWVzXG4gICAgICAuZmlsdGVyKChwcm9wZXJ0eSkgPT4gIWV4aXN0aW5nUHJvcGVydGllcy5oYXMocHJvcGVydHkubmFtZSkpXG4gICAgICAubWFwKChwcm9wZXJ0eSkgPT4gcHJvcGVydHkudGV4dCk7XG4gICAgaWYgKHByb3BlcnR5VGV4dHMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICBjb25zdCBvbGRDb250ZW50ID0gc291cmNlLnRleHQ7XG4gICAgY29uc3QgaW5zZXJ0aW9uUG9pbnQgPSBvYmplY3RMaXRlcmFsLmdldEVuZCgpIC0gMTtcbiAgICAvLyBUaGUgbmF0aXZlIFRTIEFTVCBkb2VzIG5vdCByZWxpYWJseSBleHBvc2UgYHByb3BlcnRpZXMuaGFzVHJhaWxpbmdDb21tYWAsIHNvIHNjYW4gdGhlIHNvdXJjZVxuICAgIC8vIGJldHdlZW4gdGhlIGxhc3QgcHJvcGVydHkgYW5kIHRoZSBjbG9zaW5nIGJyYWNlLiBTdHJpcCBjb21tZW50cyBmaXJzdCBzbyBhIGNvbW1hIGluc2lkZSBhXG4gICAgLy8gdHJhaWxpbmcgY29tbWVudCAoZS5nLiBgZm9vOiAxIC8vIGEsIGJgKSBpcyBub3QgbWlzdGFrZW4gZm9yIGEgcmVhbCB0cmFpbGluZyBjb21tYS5cbiAgICBjb25zdCBsYXN0UHJvcGVydHkgPSBvYmplY3RMaXRlcmFsLnByb3BlcnRpZXMuYXQoLTEpO1xuICAgIGNvbnN0IGhhc1RyYWlsaW5nQ29tbWEgPSBsYXN0UHJvcGVydHlcbiAgICAgID8gc3RyaXBDb21tZW50cyhvbGRDb250ZW50LnNsaWNlKGxhc3RQcm9wZXJ0eS5nZXRFbmQoKSwgaW5zZXJ0aW9uUG9pbnQpKS5pbmNsdWRlcygnLCcpXG4gICAgICA6IGZhbHNlO1xuICAgIGNvbnN0IHByZWZpeCA9IG9iamVjdExpdGVyYWwucHJvcGVydGllcy5sZW5ndGggPiAwICYmICFoYXNUcmFpbGluZ0NvbW1hID8gJywgJyA6ICcnO1xuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBgJHtvbGRDb250ZW50LnNsaWNlKDAsIGluc2VydGlvblBvaW50KX0ke3ByZWZpeH0ke3Byb3BlcnR5VGV4dHMuam9pbignLCAnKX0ke29sZENvbnRlbnQuc2xpY2UoXG4gICAgICBpbnNlcnRpb25Qb2ludFxuICAgICl9YDtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0TmV4dENvbmZpZ09iamVjdExpdGVyYWwoXG4gIGZpbGVQYXRoOiBzdHJpbmdcbik6IFByb21pc2U8eyBzb3VyY2U6IGFzdC5Tb3VyY2VGaWxlOyBvYmplY3RMaXRlcmFsOiBhc3QuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24gfSB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBzb3VyY2UgPSBhd2FpdCBwYXJzZVNvdXJjZUZpbGUoZmlsZVBhdGgpO1xuICBpZiAoIXNvdXJjZSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAvLyBUaGUgV2lsbEJvb3N0ZXIgc3RhbmRhcmQgZGVjbGFyZXMgdGhlIGNvbmZpZyBhcyBgY29uc3QgbmV4dENvbmZpZzogTmV4dENvbmZpZyA9IHsgLi4uIH1gIGFuZFxuICAvLyBleHBvcnRzIGl0IChwb3NzaWJseSB3cmFwcGVkLCBlLmcuIGB3aXRoU2VudHJ5Q29uZmlnKC4uLilgKSwgc28gdGhlIG9iamVjdCBsaXRlcmFsIGlzIHJhcmVseVxuICAvLyB0aGUgZGlyZWN0IG9wZXJhbmQgb2YgYGV4cG9ydCBkZWZhdWx0YC9gbW9kdWxlLmV4cG9ydHNgLiBDb2xsZWN0IGV2ZXJ5IGNhbmRpZGF0ZSBhbmQgcGljayB0aGVcbiAgLy8gbW9zdCBhdXRob3JpdGF0aXZlIG9uZSBiZWxvdy5cbiAgbGV0IGRpcmVjdE9iamVjdExpdGVyYWw6IGFzdC5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbiB8IHVuZGVmaW5lZDtcbiAgbGV0IGV4cG9ydGVkSWRlbnRpZmllcjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBjb25zdCB2YXJpYWJsZU9iamVjdExpdGVyYWxzID0gbmV3IE1hcDxzdHJpbmcsIGFzdC5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbj4oKTtcbiAgY29uc3QgdHlwZWRDb25maWdPYmplY3RMaXRlcmFsczogYXN0Lk9iamVjdExpdGVyYWxFeHByZXNzaW9uW10gPSBbXTtcblxuICBjb25zdCB2aXNpdCA9IChub2RlOiBhc3QuTm9kZSk6IHZvaWQgPT4ge1xuICAgIGlmIChhc3QuaXNFeHBvcnRBc3NpZ25tZW50KG5vZGUpKSB7XG4gICAgICBjb25zdCBvYmplY3RMaXRlcmFsID0gdW53cmFwT2JqZWN0TGl0ZXJhbChub2RlLmV4cHJlc3Npb24pO1xuICAgICAgaWYgKG9iamVjdExpdGVyYWwpIHtcbiAgICAgICAgZGlyZWN0T2JqZWN0TGl0ZXJhbCA/Pz0gb2JqZWN0TGl0ZXJhbDtcbiAgICAgIH0gZWxzZSBpZiAoYXN0LmlzSWRlbnRpZmllcihub2RlLmV4cHJlc3Npb24pKSB7XG4gICAgICAgIGV4cG9ydGVkSWRlbnRpZmllciA/Pz0gbm9kZS5leHByZXNzaW9uLmdldFRleHQoc291cmNlKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgYXN0LmlzQmluYXJ5RXhwcmVzc2lvbihub2RlKSAmJlxuICAgICAgbm9kZS5vcGVyYXRvclRva2VuLmtpbmQgPT09IGFzdC5TeW50YXhLaW5kLkVxdWFsc1Rva2VuICYmXG4gICAgICBub2RlLmxlZnQuZ2V0VGV4dChzb3VyY2UpID09PSAnbW9kdWxlLmV4cG9ydHMnXG4gICAgKSB7XG4gICAgICBjb25zdCBvYmplY3RMaXRlcmFsID0gdW53cmFwT2JqZWN0TGl0ZXJhbChub2RlLnJpZ2h0KTtcbiAgICAgIGlmIChvYmplY3RMaXRlcmFsKSB7XG4gICAgICAgIGRpcmVjdE9iamVjdExpdGVyYWwgPz89IG9iamVjdExpdGVyYWw7XG4gICAgICB9IGVsc2UgaWYgKGFzdC5pc0lkZW50aWZpZXIobm9kZS5yaWdodCkpIHtcbiAgICAgICAgZXhwb3J0ZWRJZGVudGlmaWVyID8/PSBub2RlLnJpZ2h0LmdldFRleHQoc291cmNlKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGFzdC5pc1ZhcmlhYmxlRGVjbGFyYXRpb24obm9kZSkgJiYgbm9kZS5pbml0aWFsaXplcikge1xuICAgICAgY29uc3Qgb2JqZWN0TGl0ZXJhbCA9IHVud3JhcE9iamVjdExpdGVyYWwobm9kZS5pbml0aWFsaXplcik7XG4gICAgICBpZiAob2JqZWN0TGl0ZXJhbCAmJiBhc3QuaXNJZGVudGlmaWVyKG5vZGUubmFtZSkpIHtcbiAgICAgICAgdmFyaWFibGVPYmplY3RMaXRlcmFscy5zZXQobm9kZS5uYW1lLmdldFRleHQoc291cmNlKSwgb2JqZWN0TGl0ZXJhbCk7XG4gICAgICAgIC8vIFRoZSBgOiBOZXh0Q29uZmlnYCBhbm5vdGF0aW9uIHdiZnkgd3JpdGVzIG1hcmtzIHRoZSBjYW5vbmljYWwgY29uZmlnIG9iamVjdCAoYWNjZXB0aW5nXG4gICAgICAgIC8vIHF1YWxpZmllZCBuYW1lcyBzdWNoIGFzIGBpbXBvcnQoJ25leHQnKS5OZXh0Q29uZmlnYCkuXG4gICAgICAgIGNvbnN0IGFubm90YXRpb25UeXBlID0gbm9kZS50eXBlPy5nZXRUZXh0KHNvdXJjZSk7XG4gICAgICAgIGlmIChhbm5vdGF0aW9uVHlwZSAhPT0gdW5kZWZpbmVkICYmIGlzTmV4dENvbmZpZ1R5cGUoYW5ub3RhdGlvblR5cGUpKSB7XG4gICAgICAgICAgdHlwZWRDb25maWdPYmplY3RMaXRlcmFscy5wdXNoKG9iamVjdExpdGVyYWwpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIG5vZGUuZm9yRWFjaENoaWxkKHZpc2l0KTtcbiAgfTtcbiAgc291cmNlLmZvckVhY2hDaGlsZCh2aXNpdCk7XG5cbiAgY29uc3Qgb2JqZWN0TGl0ZXJhbCA9XG4gICAgdHlwZWRDb25maWdPYmplY3RMaXRlcmFsc1swXSA/P1xuICAgIGRpcmVjdE9iamVjdExpdGVyYWwgPz9cbiAgICAoZXhwb3J0ZWRJZGVudGlmaWVyID8gdmFyaWFibGVPYmplY3RMaXRlcmFscy5nZXQoZXhwb3J0ZWRJZGVudGlmaWVyKSA6IHVuZGVmaW5lZCkgPz9cbiAgICB2YXJpYWJsZU9iamVjdExpdGVyYWxzLmdldCgnbmV4dENvbmZpZycpO1xuICByZXR1cm4gb2JqZWN0TGl0ZXJhbCA/IHsgc291cmNlLCBvYmplY3RMaXRlcmFsIH0gOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHVud3JhcE9iamVjdExpdGVyYWwobm9kZTogYXN0LkV4cHJlc3Npb24pOiBhc3QuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24gfCB1bmRlZmluZWQge1xuICBjb25zdCBjdXJyZW50ID0gdW53cmFwUGFyZW50aGVzZXMobm9kZSk7XG4gIHJldHVybiBhc3QuaXNPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihjdXJyZW50KSA/IGN1cnJlbnQgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHVud3JhcFBhcmVudGhlc2VzKG5vZGU6IGFzdC5FeHByZXNzaW9uKTogYXN0LkV4cHJlc3Npb24ge1xuICBsZXQgY3VycmVudCA9IG5vZGU7XG4gIHdoaWxlIChhc3QuaXNQYXJlbnRoZXNpemVkRXhwcmVzc2lvbihjdXJyZW50KSkge1xuICAgIGN1cnJlbnQgPSBjdXJyZW50LmV4cHJlc3Npb247XG4gIH1cbiAgcmV0dXJuIGN1cnJlbnQ7XG59XG5cbi8vIE1hdGNoIGJvdGggdGhlIGJhcmUgYE5leHRDb25maWdgIGFuZCBxdWFsaWZpZWQgZm9ybXMgbGlrZSBgaW1wb3J0KCduZXh0JykuTmV4dENvbmZpZ2AuXG5mdW5jdGlvbiBpc05leHRDb25maWdUeXBlKHR5cGVUZXh0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVUZXh0ID09PSAnTmV4dENvbmZpZycgfHwgdHlwZVRleHQuZW5kc1dpdGgoJy5OZXh0Q29uZmlnJyk7XG59XG5cbi8vIFJldHVybiBhIHByb3BlcnR5IGtleSB3aXRob3V0IHN1cnJvdW5kaW5nIHF1b3Rlcywgc28gYCdyZWFjdENvbXBpbGVyJ2AgbWF0Y2hlcyBgcmVhY3RDb21waWxlcmAuXG4vLyBJZGVudGlmaWVyLCBzdHJpbmctbGl0ZXJhbCBhbmQgbnVtZXJpYy1saXRlcmFsIG5hbWVzIGFsbCBleHBvc2UgdGhlIHVucXVvdGVkIHZhbHVlIHZpYSBgLnRleHRgLlxuZnVuY3Rpb24gZ2V0UHJvcGVydHlLZXkobmFtZTogYXN0LlByb3BlcnR5TmFtZSwgc291cmNlOiBhc3QuU291cmNlRmlsZSk6IHN0cmluZyB7XG4gIHJldHVybiAndGV4dCcgaW4gbmFtZSAmJiB0eXBlb2YgbmFtZS50ZXh0ID09PSAnc3RyaW5nJyA/IG5hbWUudGV4dCA6IG5hbWUuZ2V0VGV4dChzb3VyY2UpO1xufVxuXG5mdW5jdGlvbiBzdHJpcENvbW1lbnRzKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB0ZXh0LnJlcGxhY2VBbGwoL1xcL1xcL1teXFxuXSp8XFwvXFwqW1xcc1xcU10qP1xcKlxcLy9nLCAnJyk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5cbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4Q2hha3JhVG9hc3Rlcihjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhDaGFrcmFUb2FzdGVyJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghY29uZmlnLmRlcGVuZGluZy5jaGFrcmEpIHJldHVybjtcblxuICAgIGNvbnN0IGZpbGVQYXRocyA9IGF3YWl0IGZnLmdsb2IoJyoqL3RvYXN0ZXIue3RzLHRzeH0nLCB7XG4gICAgICBhYnNvbHV0ZTogdHJ1ZSxcbiAgICAgIGN3ZDogY29uZmlnLmRpclBhdGgsXG4gICAgICBpZ25vcmU6IFsnKiovLiovKionLCAnKiovbm9kZV9tb2R1bGVzLyoqJ10sXG4gICAgfSk7XG4gICAgZm9yIChjb25zdCBmaWxlUGF0aCBvZiBmaWxlUGF0aHMpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGlmIChcbiAgICAgICAgY29udGVudC5pbmNsdWRlcygnQ3JlYXRlVG9hc3RlclJldHVybicpIHx8XG4gICAgICAgICFjb250ZW50LmluY2x1ZGVzKFwiZnJvbSAnQGNoYWtyYS11aS9yZWFjdCdcIikgfHxcbiAgICAgICAgIWNvbnRlbnQuaW5jbHVkZXMoJ2V4cG9ydCBjb25zdCB0b2FzdGVyID0gY3JlYXRlVG9hc3RlcignKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgdXBkYXRlZENvbnRlbnQgPSBjb250ZW50XG4gICAgICAgIC5yZXBsYWNlKFxuICAgICAgICAgIC9eaW1wb3J0IC4qIGZyb20gJ0BjaGFrcmEtdWlcXC9yZWFjdCc7JC9tdSxcbiAgICAgICAgICBcIiQmXFxuaW1wb3J0IHR5cGUgeyBDcmVhdGVUb2FzdGVyUmV0dXJuIH0gZnJvbSAnQGNoYWtyYS11aS9yZWFjdCc7XCJcbiAgICAgICAgKVxuICAgICAgICAucmVwbGFjZSgnZXhwb3J0IGNvbnN0IHRvYXN0ZXIgPSBjcmVhdGVUb2FzdGVyKCcsICdleHBvcnQgY29uc3QgdG9hc3RlcjogQ3JlYXRlVG9hc3RlclJldHVybiA9IGNyZWF0ZVRvYXN0ZXIoJyk7XG4gICAgICBpZiAodXBkYXRlZENvbnRlbnQgIT09IGNvbnRlbnQpIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIHVwZGF0ZWRDb250ZW50KTtcbiAgICB9XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0ICogYXMgYXN0IGZyb20gJ3R5cGVzY3JpcHQvdW5zdGFibGUvYXN0JztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgcGFyc2VTb3VyY2VGaWxlIH0gZnJvbSAnLi4vdXRpbHMvdHlwZXNjcmlwdEFwaS5qcyc7XG5cbnR5cGUgUGFyc2VkVmFsdWUgPVxuICB8IHsga2luZDogJ2FycmF5JzsgdmFsdWU6IFBhcnNlZFZhbHVlW10gfVxuICB8IHsga2luZDogJ2xpdGVyYWwnOyB2YWx1ZTogc3RyaW5nIH1cbiAgfCB7IGtpbmQ6ICdvYmplY3QnOyB2YWx1ZTogUGFyc2VkT2JqZWN0IH07XG50eXBlIE9iamVjdE1lbWJlciA9IHsga2luZDogJ2V4dHJhJzsgaW5kZXg6IG51bWJlciB9IHwgeyBraW5kOiAncHJvcGVydHknOyBrZXk6IHN0cmluZyB9O1xuaW50ZXJmYWNlIFBhcnNlZE9iamVjdCB7XG4gIGV4dHJhTWVtYmVyczogc3RyaW5nW107XG4gIG1lbWJlck9yZGVyOiBPYmplY3RNZW1iZXJbXTtcbiAgcHJvcGVydGllczogUmVjb3JkPHN0cmluZywgUGFyc2VkVmFsdWU+O1xufVxuaW50ZXJmYWNlIEV4dHJhY3RlZE9iamVjdExpdGVyYWwge1xuICBzb3VyY2U6IGFzdC5Tb3VyY2VGaWxlO1xuICBub2RlOiBhc3QuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb247XG59XG5jb25zdCBsaXRlcmFsID0gKHZhbHVlOiBzdHJpbmcpOiBQYXJzZWRWYWx1ZSA9PiAoeyBraW5kOiAnbGl0ZXJhbCcsIHZhbHVlIH0pO1xuY29uc3QgYXNBcnJheSA9ICh2YWx1ZTogUGFyc2VkVmFsdWVbXSk6IFBhcnNlZFZhbHVlID0+ICh7IGtpbmQ6ICdhcnJheScsIHZhbHVlIH0pO1xuY29uc3QgYXNPYmplY3QgPSAocHJvcGVydGllczogUmVjb3JkPHN0cmluZywgUGFyc2VkVmFsdWU+LCBleHRyYU1lbWJlcnM6IHN0cmluZ1tdID0gW10pOiBQYXJzZWRWYWx1ZSA9PiAoe1xuICBraW5kOiAnb2JqZWN0JyxcbiAgdmFsdWU6IHRvUGFyc2VkT2JqZWN0KHByb3BlcnRpZXMsIGV4dHJhTWVtYmVycyksXG59KTtcblxuZnVuY3Rpb24gY3JlYXRlRGVmYXVsdENvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcsIHNob3VsZFVzZUFwcFNlcnZlckRlZmF1bHRzOiBib29sZWFuKTogUGFyc2VkT2JqZWN0IHtcbiAgY29uc3QgdXNlID0gdG9QYXJzZWRPYmplY3Qoe1xuICAgIHRyYWNlOiBsaXRlcmFsKFwicHJvY2Vzcy5lbnYuQ0kgPyAnb24tZmlyc3QtcmV0cnknIDogJ3JldGFpbi1vbi1mYWlsdXJlJ1wiKSxcbiAgICBzY3JlZW5zaG90OiBsaXRlcmFsKFwicHJvY2Vzcy5lbnYuQ0kgPyAnb25seS1vbi1mYWlsdXJlJyA6ICdvbidcIiksXG4gICAgdmlkZW86IGxpdGVyYWwoXCJwcm9jZXNzLmVudi5DSSA/ICdvbi1maXJzdC1yZXRyeScgOiAncmV0YWluLW9uLWZhaWx1cmUnXCIpLFxuICB9KTtcblxuICBpZiAoc2hvdWxkVXNlQXBwU2VydmVyRGVmYXVsdHMpIHtcbiAgICB1c2UucHJvcGVydGllcy5iYXNlVVJMID0gbGl0ZXJhbCgncHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfQkFTRV9VUkwnKTtcbiAgICB1c2UubWVtYmVyT3JkZXIudW5zaGlmdCh7IGtpbmQ6ICdwcm9wZXJ0eScsIGtleTogJ2Jhc2VVUkwnIH0pO1xuICB9XG5cbiAgcmV0dXJuIHRvUGFyc2VkT2JqZWN0KHtcbiAgICBmb3JiaWRPbmx5OiBsaXRlcmFsKCchIXByb2Nlc3MuZW52LkNJJyksXG4gICAgcmV0cmllczogbGl0ZXJhbCgncHJvY2Vzcy5lbnYuUFdERUJVRyA/IDAgOiBwcm9jZXNzLmVudi5DSSA/IDUgOiAxJyksXG4gICAgdXNlOiB7IGtpbmQ6ICdvYmplY3QnLCB2YWx1ZTogdXNlIH0sXG4gICAgLi4uKHNob3VsZFVzZUFwcFNlcnZlckRlZmF1bHRzXG4gICAgICA/IHtcbiAgICAgICAgICB3ZWJTZXJ2ZXI6IGFzT2JqZWN0KHtcbiAgICAgICAgICAgIGNvbW1hbmQ6IGxpdGVyYWwoZ2V0V2JTdGFydFRlc3RDb21tYW5kKCkpLFxuICAgICAgICAgICAgdXJsOiBsaXRlcmFsKCdwcm9jZXNzLmVudi5ORVhUX1BVQkxJQ19CQVNFX1VSTCcpLFxuICAgICAgICAgICAgcmV1c2VFeGlzdGluZ1NlcnZlcjogbGl0ZXJhbCgnISFwcm9jZXNzLmVudi5DSScpLFxuICAgICAgICAgICAgdGltZW91dDogbGl0ZXJhbCgnMzAwXzAwMCcpLFxuICAgICAgICAgICAgc3Rkb3V0OiBsaXRlcmFsKFwiJ3BpcGUnXCIpLFxuICAgICAgICAgICAgc3RkZXJyOiBsaXRlcmFsKFwiJ3BpcGUnXCIpLFxuICAgICAgICAgICAgZW52OiBsaXRlcmFsKGB7XG4gIC4uLnByb2Nlc3MuZW52LFxuICBQUklTTUFfVVNFUl9DT05TRU5UX0ZPUl9EQU5HRVJPVVNfQUlfQUNUSU9OOiAndHJ1ZScsXG59YCksXG4gICAgICAgICAgICBncmFjZWZ1bFNodXRkb3duOiBsaXRlcmFsKGB7XG4gIHNpZ25hbDogJ1NJR1RFUk0nLFxuICB0aW1lb3V0OiA1MDAsXG59YCksXG4gICAgICAgICAgfSksXG4gICAgICAgIH1cbiAgICAgIDoge30pLFxuICB9KTtcbn1cblxuZnVuY3Rpb24gdG9QYXJzZWRPYmplY3QocHJvcGVydGllczogUmVjb3JkPHN0cmluZywgUGFyc2VkVmFsdWU+LCBleHRyYU1lbWJlcnM6IHN0cmluZ1tdID0gW10pOiBQYXJzZWRPYmplY3Qge1xuICByZXR1cm4ge1xuICAgIGV4dHJhTWVtYmVycyxcbiAgICBtZW1iZXJPcmRlcjogW1xuICAgICAgLi4uT2JqZWN0LmtleXMocHJvcGVydGllcykubWFwKChrZXkpOiBPYmplY3RNZW1iZXIgPT4gKHsga2luZDogJ3Byb3BlcnR5Jywga2V5IH0pKSxcbiAgICAgIC4uLmV4dHJhTWVtYmVycy5tYXAoKF8sIGluZGV4KTogT2JqZWN0TWVtYmVyID0+ICh7IGtpbmQ6ICdleHRyYScsIGluZGV4IH0pKSxcbiAgICBdLFxuICAgIHByb3BlcnRpZXMsXG4gIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhQbGF5d3JpZ2h0Q29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgYHBsYXl3cmlnaHQuY29uZmlnLnRzYCk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHJldHVybjtcblxuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFBsYXl3cmlnaHRDb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbCA9IGF3YWl0IGV4dHJhY3REZWZpbmVDb25maWdPYmplY3RMaXRlcmFsKGZpbGVQYXRoKTtcbiAgICBpZiAoIWV4dHJhY3RlZE9iamVjdExpdGVyYWwpIHJldHVybjtcblxuICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbC5ub2RlLCBleHRyYWN0ZWRPYmplY3RMaXRlcmFsLnNvdXJjZSk7XG4gICAgaWYgKCFwYXJzZWQpIHJldHVybjtcblxuICAgIC8vIHdiIGRlcml2ZXMgTkVYVF9QVUJMSUNfQkFTRV9VUkwgZnJvbSB0aGUgcmVzb2x2ZWQgcG9ydCBmb3IgTmV4dC5qcy92aW5leHQgYXBwcyAodmluZXh0XG4gICAgLy8gYXBwcyBhbHNvIGRlcGVuZCBvbiBuZXh0LCBzbyBgZGVwZW5kaW5nLm5leHRgIGNvdmVycyBib3RoKSwgc28gdGhvc2UgbmVlZCBubyBkZWNsYXJlZFxuICAgIC8vIHZhcmlhYmxlOyBvdGhlciBwYWNrYWdlcyBzdGlsbCByZXF1aXJlIGEgZGVjbGFyYXRpb24uXG4gICAgY29uc3Qgc2hvdWxkVXNlQXBwU2VydmVyRGVmYXVsdHMgPVxuICAgICAgc2hvdWxkTWFuYWdlQXBwU2VydmVyRGVmYXVsdHMoY29uZmlnLCBwYXJzZWQpICYmXG4gICAgICAoY29uZmlnLmRlcGVuZGluZy5uZXh0IHx8IChhd2FpdCBkb2VzRGVmaW5lTmV4dFB1YmxpY0Jhc2VVcmwoY29uZmlnLmRpclBhdGgpKSk7XG4gICAgY29uc3QgZGVmYXVsdENvbmZpZyA9IGNyZWF0ZURlZmF1bHRDb25maWcoY29uZmlnLCBzaG91bGRVc2VBcHBTZXJ2ZXJEZWZhdWx0cyk7XG4gICAgY29uc3QgbWVyZ2VkID0gbWVyZ2VQYXJzZWRPYmplY3RzKGRlZmF1bHRDb25maWcsIHBhcnNlZCk7XG4gICAgYXBwbHlNYW5hZ2VkVXNlRGVmYXVsdHMobWVyZ2VkLCBkZWZhdWx0Q29uZmlnKTtcbiAgICBzZXRXZWJTZXJ2ZXJDb21tYW5kKG1lcmdlZCk7XG5cbiAgICBjb25zdCBuZXdPYmplY3RMaXRlcmFsID0gc3RyaW5naWZ5VmFsdWUoeyBraW5kOiAnb2JqZWN0JywgdmFsdWU6IG1lcmdlZCB9LCAwKTtcbiAgICBjb25zdCBvbGRDb250ZW50ID0gZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbC5zb3VyY2UudGV4dDtcbiAgICBjb25zdCBzdGFydCA9IGV4dHJhY3RlZE9iamVjdExpdGVyYWwubm9kZS5nZXRTdGFydChleHRyYWN0ZWRPYmplY3RMaXRlcmFsLnNvdXJjZSk7XG4gICAgY29uc3QgZW5kID0gZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbC5ub2RlLmdldEVuZCgpO1xuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBgJHtvbGRDb250ZW50LnNsaWNlKDAsIHN0YXJ0KX0ke25ld09iamVjdExpdGVyYWx9JHtvbGRDb250ZW50LnNsaWNlKGVuZCl9YDtcblxuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBtZXJnZVBhcnNlZE9iamVjdHMoYmFzZTogUGFyc2VkT2JqZWN0LCBvdmVycmlkZTogUGFyc2VkT2JqZWN0KTogUGFyc2VkT2JqZWN0IHtcbiAgY29uc3Qgb3ZlcnJpZGVQcm9wZXJ0eUtleXMgPSBuZXcgU2V0KE9iamVjdC5rZXlzKG92ZXJyaWRlLnByb3BlcnRpZXMpKTtcbiAgY29uc3QgZXh0cmFNZW1iZXJzID0gWy4uLmJhc2UuZXh0cmFNZW1iZXJzLCAuLi5vdmVycmlkZS5leHRyYU1lbWJlcnNdO1xuICAvLyBLZWVwIGRlZmF1bHQtb25seSBtZW1iZXJzIGJlZm9yZSBwYXJzZWQgbWVtYmVycyBzbyBzcHJlYWRzIGFuZCBleHBsaWNpdCBsb2NhbCBwcm9wZXJ0aWVzIHJldGFpbiBwcmVjZWRlbmNlLlxuICBjb25zdCBtZW1iZXJPcmRlciA9IFtcbiAgICAuLi5iYXNlLm1lbWJlck9yZGVyLmZpbHRlcigobWVtYmVyKSA9PiBtZW1iZXIua2luZCAhPT0gJ3Byb3BlcnR5JyB8fCAhb3ZlcnJpZGVQcm9wZXJ0eUtleXMuaGFzKG1lbWJlci5rZXkpKSxcbiAgICAuLi5vdmVycmlkZS5tZW1iZXJPcmRlci5tYXAoKG1lbWJlcik6IE9iamVjdE1lbWJlciA9PiB7XG4gICAgICBpZiAobWVtYmVyLmtpbmQgPT09ICdwcm9wZXJ0eScpIHJldHVybiBtZW1iZXI7XG4gICAgICByZXR1cm4geyBraW5kOiAnZXh0cmEnLCBpbmRleDogYmFzZS5leHRyYU1lbWJlcnMubGVuZ3RoICsgbWVtYmVyLmluZGV4IH07XG4gICAgfSksXG4gIF07XG4gIGNvbnN0IHByb3BlcnRpZXMgPSB7IC4uLmJhc2UucHJvcGVydGllcyB9O1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvdmVycmlkZS5wcm9wZXJ0aWVzKSkge1xuICAgIHByb3BlcnRpZXNba2V5XSA9IG1lcmdlUGFyc2VkVmFsdWUocHJvcGVydGllc1trZXldLCB2YWx1ZSk7XG4gIH1cbiAgcmV0dXJuIHsgZXh0cmFNZW1iZXJzLCBtZW1iZXJPcmRlciwgcHJvcGVydGllcyB9O1xufVxuXG5mdW5jdGlvbiBtZXJnZVBhcnNlZFZhbHVlKGJhc2U6IFBhcnNlZFZhbHVlIHwgdW5kZWZpbmVkLCBvdmVycmlkZTogUGFyc2VkVmFsdWUpOiBQYXJzZWRWYWx1ZSB7XG4gIGlmIChiYXNlPy5raW5kID09PSAnb2JqZWN0JyAmJiBvdmVycmlkZS5raW5kID09PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiB7IGtpbmQ6ICdvYmplY3QnLCB2YWx1ZTogbWVyZ2VQYXJzZWRPYmplY3RzKGJhc2UudmFsdWUsIG92ZXJyaWRlLnZhbHVlKSB9O1xuICB9XG4gIHJldHVybiBvdmVycmlkZTtcbn1cblxuZnVuY3Rpb24gYXBwbHlNYW5hZ2VkVXNlRGVmYXVsdHMoY29uZmlnOiBQYXJzZWRPYmplY3QsIGRlZmF1bHRDb25maWc6IFBhcnNlZE9iamVjdCk6IHZvaWQge1xuICBjb25zdCB1c2UgPSBjb25maWcucHJvcGVydGllcy51c2U7XG4gIGNvbnN0IGRlZmF1bHRVc2UgPSBkZWZhdWx0Q29uZmlnLnByb3BlcnRpZXMudXNlO1xuICBpZiAodXNlPy5raW5kICE9PSAnb2JqZWN0JyB8fCBkZWZhdWx0VXNlPy5raW5kICE9PSAnb2JqZWN0JykgcmV0dXJuO1xuXG4gIGZvciAoY29uc3Qga2V5IG9mIFsndHJhY2UnLCAnc2NyZWVuc2hvdCcsICd2aWRlbyddKSB7XG4gICAgY29uc3QgZGVmYXVsdFZhbHVlID0gZGVmYXVsdFVzZS52YWx1ZS5wcm9wZXJ0aWVzW2tleV07XG4gICAgaWYgKGRlZmF1bHRWYWx1ZSkge1xuICAgICAgdXNlLnZhbHVlLnByb3BlcnRpZXNba2V5XSA9IGRlZmF1bHRWYWx1ZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvdWxkTWFuYWdlQXBwU2VydmVyRGVmYXVsdHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBwYXJzZWQ6IFBhcnNlZE9iamVjdCk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIGNvbmZpZy5kZXBlbmRpbmcubmV4dCB8fFxuICAgIHBhcnNlZC5wcm9wZXJ0aWVzLndlYlNlcnZlciAhPT0gdW5kZWZpbmVkIHx8XG4gICAgZG9lc09iamVjdEhhdmVCYXNlVXJsKHBhcnNlZC5wcm9wZXJ0aWVzLnVzZSkgfHxcbiAgICBkb2VzVmFsdWVDb250YWluTGl0ZXJhbCh7IGtpbmQ6ICdvYmplY3QnLCB2YWx1ZTogcGFyc2VkIH0sICdORVhUX1BVQkxJQ19CQVNFX1VSTCcpXG4gICk7XG59XG5cbmZ1bmN0aW9uIGRvZXNPYmplY3RIYXZlQmFzZVVybCh2YWx1ZTogUGFyc2VkVmFsdWUgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIHZhbHVlPy5raW5kID09PSAnb2JqZWN0JyAmJiB2YWx1ZS52YWx1ZS5wcm9wZXJ0aWVzLmJhc2VVUkwgIT09IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZG9lc1ZhbHVlQ29udGFpbkxpdGVyYWwodmFsdWU6IFBhcnNlZFZhbHVlLCBsaXRlcmFsVGV4dDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmICh2YWx1ZS5raW5kID09PSAnbGl0ZXJhbCcpIHJldHVybiB2YWx1ZS52YWx1ZS5pbmNsdWRlcyhsaXRlcmFsVGV4dCk7XG4gIGlmICh2YWx1ZS5raW5kID09PSAnYXJyYXknKSByZXR1cm4gdmFsdWUudmFsdWUuc29tZSgoY2hpbGQpID0+IGRvZXNWYWx1ZUNvbnRhaW5MaXRlcmFsKGNoaWxkLCBsaXRlcmFsVGV4dCkpO1xuICByZXR1cm4gKFxuICAgIHZhbHVlLnZhbHVlLmV4dHJhTWVtYmVycy5zb21lKChtZW1iZXIpID0+IG1lbWJlci5pbmNsdWRlcyhsaXRlcmFsVGV4dCkpIHx8XG4gICAgT2JqZWN0LnZhbHVlcyh2YWx1ZS52YWx1ZS5wcm9wZXJ0aWVzKS5zb21lKChjaGlsZCkgPT4gZG9lc1ZhbHVlQ29udGFpbkxpdGVyYWwoY2hpbGQsIGxpdGVyYWxUZXh0KSlcbiAgKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZG9lc0RlZmluZU5leHRQdWJsaWNCYXNlVXJsKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBmb3IgKGNvbnN0IGVudkZpbGVQYXRoIG9mIGdldEVudkZpbGVQYXRocyhkaXJQYXRoKSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZW52RmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBpZiAoL05FWFRfUFVCTElDX0JBU0VfVVJMXFxzKj0vbS50ZXN0KGNvbnRlbnQpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gTWlzc2luZyBlbnYgZmlsZXMgYXJlIGV4cGVjdGVkIGluIHNvbWUgcmVwb3MuXG4gICAgfVxuICB9XG5cbiAgLy8gU29tZSBQbGF5d3JpZ2h0IGNvbmZpZ3Mgb25seSBkZWZpbmUgYnJvd3NlciBwcm9qZWN0cyBvciBmaXh0dXJlcyBhbmQgZG8gbm90XG4gIC8vIHN0YXJ0IGEgd2ViIGFwcC4gQXZvaWQgZm9yY2luZyBhbiBhcHAtc2VydmVyIFVSTCBpbnRvIHRob3NlIHBhY2thZ2VzLlxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGdldEVudkZpbGVQYXRocyhkaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGVudkZpbGVOYW1lcyA9IFsnZm5veC50b21sJywgJ21pc2UudG9tbCcsICdtaXNlLnRlc3QudG9tbCddO1xuICBjb25zdCBlbnZGaWxlUGF0aHM6IHN0cmluZ1tdID0gW107XG5cbiAgZm9yIChsZXQgY3VycmVudERpclBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCk7IDsgY3VycmVudERpclBhdGggPSBwYXRoLmRpcm5hbWUoY3VycmVudERpclBhdGgpKSB7XG4gICAgZW52RmlsZVBhdGhzLnB1c2goLi4uZW52RmlsZU5hbWVzLm1hcCgoZmlsZU5hbWUpID0+IHBhdGgucmVzb2x2ZShjdXJyZW50RGlyUGF0aCwgZmlsZU5hbWUpKSk7XG5cbiAgICAvLyBQbGF5d3JpZ2h0IGNvbmZpZ3Mgb2Z0ZW4gbGl2ZSBpbiBwYWNrYWdlcy8qIHdoaWxlIHNoYXJlZCBlbnYgZmlsZXMgbGl2ZSBhdCB0aGVcbiAgICAvLyByZXBvc2l0b3J5IHJvb3QsIHNvIHdhbGsgdXB3YXJkIHVudGlsIHRoZSB0YXJnZXQgcmVwbyBib3VuZGFyeS5cbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY3VycmVudERpclBhdGgsICcuZ2l0JykpKSBicmVhaztcblxuICAgIGNvbnN0IHBhcmVudERpclBhdGggPSBwYXRoLmRpcm5hbWUoY3VycmVudERpclBhdGgpO1xuICAgIGlmIChwYXJlbnREaXJQYXRoID09PSBjdXJyZW50RGlyUGF0aCkgYnJlYWs7XG4gIH1cblxuICByZXR1cm4gZW52RmlsZVBhdGhzO1xufVxuXG5mdW5jdGlvbiBzZXRXZWJTZXJ2ZXJDb21tYW5kKG9iamVjdDogUGFyc2VkT2JqZWN0KTogdm9pZCB7XG4gIGNvbnN0IHdlYlNlcnZlciA9IG9iamVjdC5wcm9wZXJ0aWVzLndlYlNlcnZlcjtcbiAgaWYgKHdlYlNlcnZlcj8ua2luZCAhPT0gJ29iamVjdCcpIHJldHVybjtcblxuICBjb25zdCBjb21tYW5kID0gd2ViU2VydmVyLnZhbHVlLnByb3BlcnRpZXMuY29tbWFuZDtcbiAgLy8gTGlicmFyaWVzIGNhbiB1c2UgUGxheXdyaWdodCdzIHdlYlNlcnZlciB0byBidWlsZCBhbmQgbGF1bmNoIGEgZml4dHVyZSBldmVuIHRob3VnaCBgd2Igc3RhcnRgXG4gIC8vIGludGVudGlvbmFsbHkgaGFzIG5vIHRlc3Qgc2VydmVyIGZvciB0aGUgbGlicmFyeSBpdHNlbGYuIFByZXNlcnZlIHRob3NlIGN1c3RvbSBsaWZlY3ljbGVcbiAgLy8gY29tbWFuZHM7IG9ubHkgYWRkIHRoZSBjb21tYW5kIHdoZW4gd2JmeSBhbHJlYWR5IG93bnMgaXQuXG4gIGlmIChjb21tYW5kICYmICFpc0dlbmVyYXRlZFdiU3RhcnRUZXN0Q29tbWFuZChjb21tYW5kKSkgcmV0dXJuO1xuXG4gIC8vIFBsYXl3cmlnaHQgcmVxdWlyZXMgYGNvbW1hbmRgIHdoZW5ldmVyIGB3ZWJTZXJ2ZXJgIGV4aXN0czsgYW4gZXh0ZXJuYWxseSBtYW5hZ2VkIHNlcnZlciBzaG91bGRcbiAgLy8gb21pdCBgd2ViU2VydmVyYCBpbnN0ZWFkLiBLZWVwIGZpbGxpbmcgdGhpcyByZXF1aXJlZCBmaWVsZCB3aGVuIGEgcGFydGlhbCBtYW5hZ2VkIGJsb2NrIGxhY2tzIGl0LlxuICB3ZWJTZXJ2ZXIudmFsdWUucHJvcGVydGllcy5jb21tYW5kID0gbGl0ZXJhbChnZXRXYlN0YXJ0VGVzdENvbW1hbmQoKSk7XG59XG5cbmZ1bmN0aW9uIGlzR2VuZXJhdGVkV2JTdGFydFRlc3RDb21tYW5kKGNvbW1hbmQ6IFBhcnNlZFZhbHVlKTogYm9vbGVhbiB7XG4gIGlmIChjb21tYW5kLmtpbmQgIT09ICdsaXRlcmFsJykgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gY29tbWFuZC52YWx1ZS50cmltKCkgPT09IGdldFdiU3RhcnRUZXN0Q29tbWFuZCgpO1xufVxuXG5mdW5jdGlvbiBnZXRXYlN0YXJ0VGVzdENvbW1hbmQoKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAnYnVuIHdiIHN0YXJ0IC0tbW9kZSB0ZXN0J2A7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGV4dHJhY3REZWZpbmVDb25maWdPYmplY3RMaXRlcmFsKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPEV4dHJhY3RlZE9iamVjdExpdGVyYWwgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3Qgc291cmNlID0gYXdhaXQgcGFyc2VTb3VyY2VGaWxlKGZpbGVQYXRoKTtcbiAgaWYgKCFzb3VyY2UpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgLy8gVHlwZVNjcmlwdCBhbHJlYWR5IHVuZGVyc3RhbmRzIG5lc3RlZCBvYmplY3QgbGl0ZXJhbHMgYW5kIHRlbXBsYXRlIHN0cmluZ3MsIHNvIHVzZVxuICAvLyBpdHMgQVNUIHJhbmdlcyBpbnN0ZWFkIG9mIGEgcmVnZXggdGhhdCBjYW4gc3RvcCBhdCB0aGUgZmlyc3QgaW5uZXIgY2xvc2luZyBicmFjZS5cbiAgbGV0IGZvdW5kOiBhc3QuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24gfCB1bmRlZmluZWQ7XG4gIGNvbnN0IHZpc2l0ID0gKG5vZGU6IGFzdC5Ob2RlKTogdm9pZCA9PiB7XG4gICAgaWYgKGZvdW5kKSByZXR1cm47XG4gICAgaWYgKGFzdC5pc0NhbGxFeHByZXNzaW9uKG5vZGUpICYmIG5vZGUuZXhwcmVzc2lvbi5nZXRUZXh0KHNvdXJjZSkgPT09ICdkZWZpbmVDb25maWcnKSB7XG4gICAgICBjb25zdCBmaXJzdEFyZ3VtZW50ID0gbm9kZS5hcmd1bWVudHNbMF07XG4gICAgICBpZiAoZmlyc3RBcmd1bWVudCAmJiBhc3QuaXNPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihmaXJzdEFyZ3VtZW50KSkge1xuICAgICAgICBmb3VuZCA9IGZpcnN0QXJndW1lbnQ7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgbm9kZS5mb3JFYWNoQ2hpbGQodmlzaXQpO1xuICB9O1xuICBzb3VyY2UuZm9yRWFjaENoaWxkKHZpc2l0KTtcblxuICByZXR1cm4gZm91bmQgPyB7IHNvdXJjZSwgbm9kZTogZm91bmQgfSA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gcGFyc2VFeHByZXNzaW9uKGV4cHJlc3Npb246IGFzdC5FeHByZXNzaW9uLCBzb3VyY2U6IGFzdC5Tb3VyY2VGaWxlKTogUGFyc2VkVmFsdWUgfCB1bmRlZmluZWQge1xuICBpZiAoYXN0LmlzT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oZXhwcmVzc2lvbikpIHtcbiAgICBjb25zdCBwYXJzZWRPYmplY3QgPSBwYXJzZU9iamVjdExpdGVyYWxFeHByZXNzaW9uKGV4cHJlc3Npb24sIHNvdXJjZSk7XG4gICAgcmV0dXJuIHBhcnNlZE9iamVjdCA/IHsga2luZDogJ29iamVjdCcsIHZhbHVlOiBwYXJzZWRPYmplY3QgfSA6IGxpdGVyYWwoZXhwcmVzc2lvbi5nZXRUZXh0KHNvdXJjZSkpO1xuICB9XG4gIGlmIChhc3QuaXNBcnJheUxpdGVyYWxFeHByZXNzaW9uKGV4cHJlc3Npb24pKSB7XG4gICAgY29uc3QgZWxlbWVudHMgPSBleHByZXNzaW9uLmVsZW1lbnRzLm1hcCgoZWxlbWVudCkgPT4gcGFyc2VFeHByZXNzaW9uKGVsZW1lbnQsIHNvdXJjZSkpO1xuICAgIGlmIChlbGVtZW50cy5zb21lKChlbGVtZW50KTogZWxlbWVudCBpcyB1bmRlZmluZWQgPT4gZWxlbWVudCA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgcmV0dXJuIGxpdGVyYWwoZXhwcmVzc2lvbi5nZXRUZXh0KHNvdXJjZSkpO1xuICAgIH1cbiAgICByZXR1cm4gYXNBcnJheShlbGVtZW50cyBhcyBQYXJzZWRWYWx1ZVtdKTtcbiAgfVxuICByZXR1cm4gbGl0ZXJhbChleHByZXNzaW9uLmdldFRleHQoc291cmNlKSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oXG4gIG9iamVjdExpdGVyYWw6IGFzdC5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbixcbiAgc291cmNlOiBhc3QuU291cmNlRmlsZVxuKTogUGFyc2VkT2JqZWN0IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcGFyc2VkOiBQYXJzZWRPYmplY3QgPSB7IGV4dHJhTWVtYmVyczogW10sIG1lbWJlck9yZGVyOiBbXSwgcHJvcGVydGllczoge30gfTtcbiAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBvYmplY3RMaXRlcmFsLnByb3BlcnRpZXMpIHtcbiAgICBpZiAoYXN0LmlzU2hvcnRoYW5kUHJvcGVydHlBc3NpZ25tZW50KHByb3BlcnR5KSkge1xuICAgICAgY29uc3Qga2V5ID0gcHJvcGVydHkubmFtZS5nZXRUZXh0KHNvdXJjZSk7XG4gICAgICBwYXJzZWQucHJvcGVydGllc1trZXldID0gbGl0ZXJhbChrZXkpO1xuICAgICAgcGFyc2VkLm1lbWJlck9yZGVyLnB1c2goeyBraW5kOiAncHJvcGVydHknLCBrZXkgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgIWFzdC5pc1Byb3BlcnR5QXNzaWdubWVudChwcm9wZXJ0eSkgfHxcbiAgICAgICghYXN0LmlzSWRlbnRpZmllcihwcm9wZXJ0eS5uYW1lKSAmJiAhYXN0LmlzU3RyaW5nTGl0ZXJhbChwcm9wZXJ0eS5uYW1lKSlcbiAgICApIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gcGFyc2VkLmV4dHJhTWVtYmVycy5wdXNoKHByb3BlcnR5LmdldFRleHQoc291cmNlKSkgLSAxO1xuICAgICAgcGFyc2VkLm1lbWJlck9yZGVyLnB1c2goeyBraW5kOiAnZXh0cmEnLCBpbmRleCB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZSA9IHBhcnNlRXhwcmVzc2lvbihwcm9wZXJ0eS5pbml0aWFsaXplciwgc291cmNlKTtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgIGNvbnN0IGtleSA9IHByb3BlcnR5Lm5hbWUuZ2V0VGV4dChzb3VyY2UpO1xuICAgIHBhcnNlZC5wcm9wZXJ0aWVzW2tleV0gPSB2YWx1ZTtcbiAgICBwYXJzZWQubWVtYmVyT3JkZXIucHVzaCh7IGtpbmQ6ICdwcm9wZXJ0eScsIGtleSB9KTtcbiAgfVxuICByZXR1cm4gcGFyc2VkO1xufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnlWYWx1ZSh2YWx1ZTogUGFyc2VkVmFsdWUsIGxldmVsOiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCBjbG9zaW5nSW5kZW50ID0gJyAgJy5yZXBlYXQobGV2ZWwpO1xuICBpZiAodmFsdWUua2luZCA9PT0gJ2FycmF5Jykge1xuICAgIGlmICh2YWx1ZS52YWx1ZS5sZW5ndGggPT09IDApIHJldHVybiAnW10nO1xuICAgIGNvbnN0IGluZGVudCA9ICcgICcucmVwZWF0KGxldmVsICsgMSk7XG4gICAgY29uc3QgbGluZXMgPSB2YWx1ZS52YWx1ZS5tYXAoKGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IHN0cmluZ2lmaWVkID0gc3RyaW5naWZ5VmFsdWUoaXRlbSwgbGV2ZWwgKyAxKS5zcGxpdCgnXFxuJyk7XG4gICAgICBzdHJpbmdpZmllZFtzdHJpbmdpZmllZC5sZW5ndGggLSAxXSA9IGAke3N0cmluZ2lmaWVkLmF0KC0xKX0sYDtcbiAgICAgIGlmIChpdGVtLmtpbmQgPT09ICdsaXRlcmFsJykge1xuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDE7IGluZGV4IDwgc3RyaW5naWZpZWQubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICAgICAgc3RyaW5naWZpZWRbaW5kZXhdID0gYCR7aW5kZW50fSR7c3RyaW5naWZpZWRbaW5kZXhdfWA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHN0cmluZ2lmaWVkWzBdID0gYCR7aW5kZW50fSR7c3RyaW5naWZpZWRbMF19YDtcbiAgICAgIHJldHVybiBzdHJpbmdpZmllZC5qb2luKCdcXG4nKTtcbiAgICB9KTtcbiAgICByZXR1cm4gYFtcXG4ke2xpbmVzLmpvaW4oJ1xcbicpfVxcbiR7Y2xvc2luZ0luZGVudH1dYDtcbiAgfVxuICBpZiAodmFsdWUua2luZCA9PT0gJ2xpdGVyYWwnKSByZXR1cm4gdmFsdWUudmFsdWU7XG5cbiAgY29uc3QgaW5kZW50ID0gJyAgJy5yZXBlYXQobGV2ZWwgKyAxKTtcbiAgY29uc3QgZW1pdHRlZFByb3BlcnRpZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgbGFzdFByb3BlcnR5SW5kZXhCeUtleSA9IGdldExhc3RQcm9wZXJ0eUluZGV4QnlLZXkodmFsdWUudmFsdWUubWVtYmVyT3JkZXIpO1xuICBjb25zdCBsaW5lcyA9IHZhbHVlLnZhbHVlLm1lbWJlck9yZGVyLmZsYXRNYXAoKG1lbWJlciwgaW5kZXgpID0+IHtcbiAgICBpZiAobWVtYmVyLmtpbmQgPT09ICdleHRyYScpIHtcbiAgICAgIHJldHVybiBbc3RyaW5naWZ5T2JqZWN0TWVtYmVyKHZhbHVlLnZhbHVlLmV4dHJhTWVtYmVyc1ttZW1iZXIuaW5kZXhdID8/ICcnLCBpbmRlbnQpXTtcbiAgICB9XG5cbiAgICBpZiAobGFzdFByb3BlcnR5SW5kZXhCeUtleS5nZXQobWVtYmVyLmtleSkgIT09IGluZGV4KSByZXR1cm4gW107XG4gICAgY29uc3QgaXRlbSA9IHZhbHVlLnZhbHVlLnByb3BlcnRpZXNbbWVtYmVyLmtleV07XG4gICAgaWYgKCFpdGVtIHx8IGVtaXR0ZWRQcm9wZXJ0aWVzLmhhcyhtZW1iZXIua2V5KSkgcmV0dXJuIFtdO1xuICAgIGVtaXR0ZWRQcm9wZXJ0aWVzLmFkZChtZW1iZXIua2V5KTtcbiAgICByZXR1cm4gW3N0cmluZ2lmeU9iamVjdFByb3BlcnR5KG1lbWJlci5rZXksIGl0ZW0sIGxldmVsLCBpbmRlbnQpXTtcbiAgfSk7XG4gIGxpbmVzLnB1c2goXG4gICAgLi4uT2JqZWN0LmVudHJpZXModmFsdWUudmFsdWUucHJvcGVydGllcylcbiAgICAgIC5maWx0ZXIoKFtrZXldKSA9PiAhZW1pdHRlZFByb3BlcnRpZXMuaGFzKGtleSkpXG4gICAgICAubWFwKChba2V5LCBpdGVtXSkgPT4gc3RyaW5naWZ5T2JqZWN0UHJvcGVydHkoa2V5LCBpdGVtLCBsZXZlbCwgaW5kZW50KSlcbiAgKTtcbiAgaWYgKGxpbmVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGB7XFxuJHtjbG9zaW5nSW5kZW50fX1gO1xuICByZXR1cm4gYHtcXG4ke2xpbmVzLmpvaW4oJ1xcbicpfVxcbiR7Y2xvc2luZ0luZGVudH19YDtcbn1cblxuZnVuY3Rpb24gZ2V0TGFzdFByb3BlcnR5SW5kZXhCeUtleShtZW1iZXJPcmRlcjogT2JqZWN0TWVtYmVyW10pOiBNYXA8c3RyaW5nLCBudW1iZXI+IHtcbiAgY29uc3QgbGFzdFByb3BlcnR5SW5kZXhCeUtleSA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gIGZvciAoY29uc3QgW2luZGV4LCBtZW1iZXJdIG9mIG1lbWJlck9yZGVyLmVudHJpZXMoKSkge1xuICAgIGlmIChtZW1iZXIua2luZCA9PT0gJ3Byb3BlcnR5Jykge1xuICAgICAgbGFzdFByb3BlcnR5SW5kZXhCeUtleS5zZXQobWVtYmVyLmtleSwgaW5kZXgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbGFzdFByb3BlcnR5SW5kZXhCeUtleTtcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5T2JqZWN0UHJvcGVydHkoa2V5OiBzdHJpbmcsIGl0ZW06IFBhcnNlZFZhbHVlLCBsZXZlbDogbnVtYmVyLCBpbmRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHN0cmluZ2lmaWVkID0gc3RyaW5naWZ5VmFsdWUoaXRlbSwgbGV2ZWwgKyAxKS5zcGxpdCgnXFxuJyk7XG4gIHN0cmluZ2lmaWVkW3N0cmluZ2lmaWVkLmxlbmd0aCAtIDFdID0gYCR7c3RyaW5naWZpZWQuYXQoLTEpfSxgO1xuICBpZiAoaXRlbS5raW5kID09PSAnbGl0ZXJhbCcpIHtcbiAgICBmb3IgKGxldCBpbmRleCA9IDE7IGluZGV4IDwgc3RyaW5naWZpZWQubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICBzdHJpbmdpZmllZFtpbmRleF0gPSBgJHtpbmRlbnR9JHtzdHJpbmdpZmllZFtpbmRleF19YDtcbiAgICB9XG4gIH1cbiAgc3RyaW5naWZpZWRbMF0gPSBgJHtpbmRlbnR9JHtrZXl9OiAke3N0cmluZ2lmaWVkWzBdfWA7XG4gIHJldHVybiBzdHJpbmdpZmllZC5qb2luKCdcXG4nKTtcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5T2JqZWN0TWVtYmVyKG1lbWJlcjogc3RyaW5nLCBpbmRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHN0cmluZ2lmaWVkID0gbWVtYmVyLnNwbGl0KCdcXG4nKTtcbiAgc3RyaW5naWZpZWRbc3RyaW5naWZpZWQubGVuZ3RoIC0gMV0gPSBgJHtzdHJpbmdpZmllZC5hdCgtMSl9LGA7XG4gIGZvciAoY29uc3QgW2luZGV4LCBsaW5lXSBvZiBzdHJpbmdpZmllZC5lbnRyaWVzKCkpIHtcbiAgICBzdHJpbmdpZmllZFtpbmRleF0gPSBgJHtpbmRlbnR9JHtsaW5lfWA7XG4gIH1cbiAgcmV0dXJuIHN0cmluZ2lmaWVkLmpvaW4oJ1xcbicpO1xufVxuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBvcyBmcm9tICdub2RlOm9zJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5cbnR5cGUgV2lsbEJvb3N0ZXJPcmdhbml6YXRpb24gPSAnV2lsbEJvb3N0ZXInIHwgJ1dpbGxCb29zdGVyTGFiJztcbnR5cGUgUmVwb3NpdG9yeUZ1bGxOYW1lID0gYCR7V2lsbEJvb3N0ZXJPcmdhbml6YXRpb259LyR7c3RyaW5nfWA7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm5veFJlcG9zaXRvcnlTY29wZSB7XG4gIG9yZ2FuaXphdGlvbnM/OiByZWFkb25seSBXaWxsQm9vc3Rlck9yZ2FuaXphdGlvbltdO1xuICByZXBvc2l0b3JpZXM/OiByZWFkb25seSBSZXBvc2l0b3J5RnVsbE5hbWVbXTtcbiAgLy8gUmVzdHJpY3RzIHRoZSBzY29wZSB0byByZXBvc2l0b3JpZXMgb2YgdGhlIGdpdmVuIHZpc2liaWxpdHkuIFB1YmxpYyByZXBvc2l0b3JpZXMgcHVibGlzaCB0aGVpclxuICAvLyBjaXBoZXJ0ZXh0cyB0byB0aGUgd29ybGQsIHNvIHRoZXkgbXVzdCB1c2UgYSBDSSBpZGVudGl0eSBzZXBhcmF0ZSBmcm9tIHRoZSBvcmctaW50ZXJuYWwgb25lOlxuICAvLyBsZWFraW5nIGVpdGhlciBDSSBrZXkgbXVzdCBub3QgZXhwb3NlIHRoZSBvdGhlciBzaWRlJ3Mgc2VjcmV0cy5cbiAgdmlzaWJpbGl0eT86ICdwdWJsaWMnIHwgJ3ByaXZhdGUnO1xufVxuXG5pbnRlcmZhY2UgRm5veEFnZVByaW5jaXBhbCB7XG4gIG5hbWU6IHN0cmluZztcbiAgcHVibGljS2V5czogcmVhZG9ubHkgc3RyaW5nW107XG4gIHJlcG9zaXRvcnlTY29wZTogRm5veFJlcG9zaXRvcnlTY29wZTtcbiAgLy8gTWFya3MgdGhlIHByaW5jaXBhbCBhcyBhIENJIGlkZW50aXR5IGFuZCBuYW1lcyB0aGUgR2l0SHViIHNlY3JldCBob2xkaW5nIGl0cyBwcml2YXRlIGtleS5cbiAgLy8gRXZlcnkgZm5veC1tYW5hZ2VkIHJlcG9zaXRvcnkgbXVzdCByZXNvbHZlIG9uZSAoZ2VuZXJhdGVGbm94VG9tbCBmYWlscyBjbG9zZWQgb3RoZXJ3aXNlOiBhXG4gIC8vIHJvc3RlciB3aXRob3V0IGEgQ0kgcmVjaXBpZW50IHdvdWxkIHJlLWVuY3J5cHQgc2VjcmV0cyB0aGF0IENJIGNhbiBuZXZlciBkZWNyeXB0IGFnYWluKSwgYW5kXG4gIC8vIHRoZSB3b3JrZmxvdyBnZW5lcmF0b3IgZGVyaXZlcyBpdHMgY2FsbGVyIG1hcHBpbmdzIGZyb20gdGhlIHNhbWUgcmVzb2x1dGlvbiBzbyB0aGUgdHdvIGNhblxuICAvLyBuZXZlciBkaXNhZ3JlZSBvbiB3aGljaCBDSSBpZGVudGl0eSBhcHBsaWVzLlxuICBjaUFnZUtleVNlY3JldE5hbWU/OiAnRk5PWF9BR0VfS0VZJyB8ICdQVUJMSUNfRk5PWF9BR0VfS0VZJztcbn1cblxuaW50ZXJmYWNlIEZub3hBZ2VSZWNpcGllbnQge1xuICBuYW1lOiBzdHJpbmc7XG4gIHB1YmxpY0tleTogc3RyaW5nO1xufVxuXG4vLyBUaGUgYWdlIHByaW5jaXBhbHMgYXV0aG9yaXplZCB0byBkZWNyeXB0IGVhY2ggZm5veC1tYW5hZ2VkIHJlcG9zaXRvcnkuIFRvIGdyYW50IGFjY2VzcywgYWRkIHRoZVxuLy8gcHJpbmNpcGFsJ3MgcHVibGljIGtleXMgYW5kIHJlcG9zaXRvcnkgc2NvcGUgaGVyZS4gT3JnYW5pemF0aW9uIHNjb3BlcyBpbmNsdWRlIGV2ZXJ5IGN1cnJlbnQgYW5kXG4vLyBmdXR1cmUgcmVwb3NpdG9yeSBpbiB0aGF0IG9yZ2FuaXphdGlvbjsgdXNlIHJlcG9zaXRvcmllcyBmb3IgZXhhY3Qgb3duZXIvcmVwb3NpdG9yeSBncmFudHMuIFRoZVxuLy8gbmV4dCB3YmZ5IHJ1biBvbiBlYWNoIG1hdGNoaW5nIHJlcG9zaXRvcnkgcmV3cml0ZXMgZXZlcnkgbWFuYWdlZCBmbm94LnRvbWwgYW5kIHJlLWVuY3J5cHRzIGl0c1xuLy8gY29tbWl0dGVkIHNlY3JldHMgZm9yIHRoZSByZXN1bHRpbmcgcmVjaXBpZW50IHNldC4gQSBzY29wZSdzIG9wdGlvbmFsIHZpc2liaWxpdHkgY29uc3RyYWludFxuLy8gc2VsZWN0cyBvbmx5IHB1YmxpYyBvciBvbmx5IHByaXZhdGUgcmVwb3NpdG9yaWVzICh1c2VkIHRvIGtlZXAgdGhlIG9yZy1pbnRlcm5hbCBhbmQgdGhlXG4vLyBwdWJsaWMtcmVwb3NpdG9yeSBDSSBpZGVudGl0aWVzIGFwYXJ0KS4gUmVtb3ZpbmcgYSBzY29wZSBjYW5ub3QgcmV2b2tlIGNpcGhlcnRleHRcbi8vIGFscmVhZHkgYXZhaWxhYmxlIGZyb20gR2l0IGhpc3RvcnksIHNvIHJvdGF0ZSB0aGUgc2VjcmV0IHZhbHVlcyB0aGF0IHByaW5jaXBhbCBjb3VsZCBkZWNyeXB0LlxuLy8gT25seSBwdWJsaWMga2V5cyBtYXkgYXBwZWFyIGhlcmU7IGEgQ0kgaWRlbnRpdHkncyBwcml2YXRlIGtleSBzdXBwbGllcyB0aGUgRk5PWF9BR0VfS0VZIChvcixcbi8vIGZvciBwdWJsaWMgcmVwb3NpdG9yaWVzLCBQVUJMSUNfRk5PWF9BR0VfS0VZKSBvcmdhbml6YXRpb24gc2VjcmV0LlxuZXhwb3J0IGNvbnN0IEZOT1hfQUdFX1BSSU5DSVBBTFMgPSBbXG4gIHtcbiAgICBuYW1lOiAnZXhrYXp1dScsXG4gICAgcHVibGljS2V5czogWydhZ2UxajIzNTR4aHZtM2Z2OXk3N3Q1ZzZ5M3E4bWV4Z2sybWYwMHRncmt6Z3A3M3R5bnJ2ejU1czhhdWF5dyddLFxuICAgIHJlcG9zaXRvcnlTY29wZTogeyBvcmdhbml6YXRpb25zOiBbJ1dpbGxCb29zdGVyJywgJ1dpbGxCb29zdGVyTGFiJ10gfSxcbiAgfSxcbiAge1xuICAgIG5hbWU6ICdwb25oYXJ1JyxcbiAgICBwdWJsaWNLZXlzOiBbXG4gICAgICAnYWdlMThydWdsZGY5aHRjNnVtNWVwbHB4MjdrNTNlcDR6bjBsaHp3ZmZnbnh6aHJxMGM3emd2eXEzemNjZHknLFxuICAgICAgJ2FnZTFuejJuOTljcmpyN25wOXhqZ2x3ZmZmYzNkdWQ0NWRoZXdxenFmenB6dGtkd3U0aGo3NGdxNmVsNTMzJyxcbiAgICBdLFxuICAgIHJlcG9zaXRvcnlTY29wZTogeyBvcmdhbml6YXRpb25zOiBbJ1dpbGxCb29zdGVyJywgJ1dpbGxCb29zdGVyTGFiJ10gfSxcbiAgfSxcbiAge1xuICAgIC8vIFRoZSBvcmctaW50ZXJuYWwgQ0kgaWRlbnRpdHkgKHRoZSBGTk9YX0FHRV9LRVkgb3JnYW5pemF0aW9uIHNlY3JldCAvIH4vLmNvbmZpZy9mbm94L2FnZS1jaS13Yi50eHQpLlxuICAgIG5hbWU6ICdjaScsXG4gICAgcHVibGljS2V5czogWydhZ2UxYTJjNmVmNmFobDZtbWtoZ3F0eGcwbWd0ZDd5c3NwbnRxN3J4dXN2MjZlZnhobnVobGNkc3I5ZHBhayddLFxuICAgIHJlcG9zaXRvcnlTY29wZTogeyBvcmdhbml6YXRpb25zOiBbJ1dpbGxCb29zdGVyJywgJ1dpbGxCb29zdGVyTGFiJ10sIHZpc2liaWxpdHk6ICdwcml2YXRlJyB9LFxuICAgIGNpQWdlS2V5U2VjcmV0TmFtZTogJ0ZOT1hfQUdFX0tFWScsXG4gIH0sXG4gIHtcbiAgICAvLyBUaGUgQ0kgaWRlbnRpdHkgZGVkaWNhdGVkIHRvIHB1YmxpYyByZXBvc2l0b3JpZXMgKHRoZSBQVUJMSUNfRk5PWF9BR0VfS0VZIG9yZ2FuaXphdGlvblxuICAgIC8vIHNlY3JldCAvIH4vLmNvbmZpZy9mbm94L2FnZS1jaS13Yi1wdWJsaWMudHh0KS4gU2NvcGVkIHRvIFdpbGxCb29zdGVyIG9ubHkgYmVjYXVzZSB0aGVcbiAgICAvLyBQVUJMSUNfRk5PWF9BR0VfS0VZIHNlY3JldCBpcyByZWdpc3RlcmVkIGluIHRoYXQgb3JnYW5pemF0aW9uIGFsb25lOyBhIHB1YmxpY1xuICAgIC8vIFdpbGxCb29zdGVyTGFiIHJlcG9zaXRvcnkgcmVzb2x2ZXMgTk8gQ0kgaWRlbnRpdHkgYW5kIGdlbmVyYXRlRm5veFRvbWwgZmFpbHMgY2xvc2VkIG9uIGl0XG4gICAgLy8gKFdpbGxCb29zdGVyTGFiIGRvZXMgb3duIHB1YmxpYyByZXBvc2l0b3JpZXMsIGUuZy4gaXRzIHJldXNhYmxlLXdvcmtmbG93cyBzeW5jIG1pcnJvciwgYnV0XG4gICAgLy8gbm9uZSBvZiB0aGVtIHVzZSBmbm94IOKAlCByZWdpc3RlciB0aGUgc2VjcmV0IHRoZXJlIGFuZCBleHRlbmQgdGhpcyBzY29wZSBpZiBvbmUgZXZlciBkb2VzKS5cbiAgICBuYW1lOiAnY2ktcHVibGljJyxcbiAgICBwdWJsaWNLZXlzOiBbJ2FnZTFmaGVhODV4andwODlsd3EzamNud2ozMnN3aDN2MjRwd3BhcnFoNWw3cWtndmM0YXgzcDBxbDZkdTM2J10sXG4gICAgcmVwb3NpdG9yeVNjb3BlOiB7IG9yZ2FuaXphdGlvbnM6IFsnV2lsbEJvb3N0ZXInXSwgdmlzaWJpbGl0eTogJ3B1YmxpYycgfSxcbiAgICBjaUFnZUtleVNlY3JldE5hbWU6ICdQVUJMSUNfRk5PWF9BR0VfS0VZJyxcbiAgfSxcbiAge1xuICAgIG5hbWU6ICdyZW1pbicsXG4gICAgcHVibGljS2V5czogWydhZ2UxbXc0cHo5ZHVqeTlkbWhrMHBhbHFhd2prajdtNGs3eng3OHlyOWZqdDYzc2E1bDNlNDN1cTZudzAwNCddLFxuICAgIHJlcG9zaXRvcnlTY29wZTogeyBvcmdhbml6YXRpb25zOiBbJ1dpbGxCb29zdGVyJywgJ1dpbGxCb29zdGVyTGFiJ10gfSxcbiAgfSxcbiAge1xuICAgIG5hbWU6ICdhcmllcycsXG4gICAgcHVibGljS2V5czogWydhZ2Uxbm4wZWh5YWVueXE4a21ucTQyOTRrenpneHY1ZG5mNnBlcDJjZGtyYXh6ZnFsazd4Z3NycXFuNm5uOSddLFxuICAgIHJlcG9zaXRvcnlTY29wZToge1xuICAgICAgcmVwb3NpdG9yaWVzOiBbXG4gICAgICAgICdXaWxsQm9vc3Rlci9hZ2VudC1jaGFsbGVuZ2VzJyxcbiAgICAgICAgJ1dpbGxCb29zdGVyL2FnZW50aWMtd29ya2Zsb3dzLWRhc2hib2FyZCcsXG4gICAgICAgICdXaWxsQm9vc3Rlci9jaGVlcmxpbmdzJyxcbiAgICAgICAgJ1dpbGxCb29zdGVyL2Nob2Z1LXdhbGtpbmcnLFxuICAgICAgICAnV2lsbEJvb3N0ZXIvcHJvbXB0LXN0dWR5JyxcbiAgICAgICAgJ1dpbGxCb29zdGVyL2V4ZXJjb2RlJyxcbiAgICAgICAgJ1dpbGxCb29zdGVyL2p1ZGdlJyxcbiAgICAgIF0sXG4gICAgfSxcbiAgfSxcbiAge1xuICAgIG5hbWU6ICdzdW5hZ2EnLFxuICAgIHB1YmxpY0tleXM6IFsnYWdlMXVseHpuNnk2OGt1MzRjcHg1ZnlhNWdmN3Jucnd6MHVmbG55ZTZ1eHVoZzM0cDJuamhna3FtZzczZzQnXSxcbiAgICByZXBvc2l0b3J5U2NvcGU6IHtcbiAgICAgIHJlcG9zaXRvcmllczogWydXaWxsQm9vc3Rlci9haS1vY3InLCAnV2lsbEJvb3N0ZXIvZXhlcmNvZGUnLCAnV2lsbEJvb3N0ZXIvanVkZ2UnXSxcbiAgICB9LFxuICB9LFxuICB7XG4gICAgbmFtZTogJ2F5YW1lJyxcbiAgICBwdWJsaWNLZXlzOiBbJ2FnZTF2eG0yZ3MwMDNydXdtOHA2aDNodjd4YXNqdTJzOGs0bXhtYzM0em02Z3Jkd3pucnMwOW5xNnh6NXZ6J10sXG4gICAgcmVwb3NpdG9yeVNjb3BlOiB7XG4gICAgICByZXBvc2l0b3JpZXM6IFsnV2lsbEJvb3N0ZXIvYWktb2NyJywgJ1dpbGxCb29zdGVyL2Nob2Z1LXdhbGtpbmcnLCAnV2lsbEJvb3N0ZXIvZXhlcmNvZGUnLCAnV2lsbEJvb3N0ZXIvanVkZ2UnXSxcbiAgICB9LFxuICB9LFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgRm5veEFnZVByaW5jaXBhbFtdO1xuXG5pbnRlcmZhY2UgRm5veFRvbWwge1xuICBpbXBvcnQ/OiB1bmtub3duO1xuICBwcm92aWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZD47XG4gIHByb2ZpbGVzPzogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ+O1xuICBba2V5OiBzdHJpbmddOiB1bmtub3duO1xufVxuXG5sZXQgZm5veFN5bmNGYWlsZWQgPSBmYWxzZTtcbmxldCBtaWdyYXRpb25NYXJrZXJQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5sZXQgbWlncmF0aW9uTWFya2VyT3duZWQgPSBmYWxzZTtcblxuLyoqIFdoZXRoZXIgYW55IGZub3ggcmVjaXBpZW50IHN5bmNocm9uaXphdGlvbiBmYWlsZWQgaW4gdGhlIGN1cnJlbnQgcmVwb3NpdG9yeTsgc2V0dXBTZWNyZXRzIG11c3Qgbm90IHVwbG9hZCB0aGVuLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc0Zub3hTeW5jRmFpbGVkKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gZm5veFN5bmNGYWlsZWQ7XG59XG5cbi8qKlxuICogU3luY2hyb25pemVzIHRoZSBhZ2UgcmVjaXBpZW50cyBpbiBldmVyeSBmbm94LnRvbWwgd2l0aCB0aGUgcHJpbmNpcGFscyBhdXRob3JpemVkIGZvciB0aGlzXG4gKiByZXBvc2l0b3J5IGFuZCByZS1lbmNyeXB0cyB0aGUgY29tbWl0dGVkIHNlY3JldHMgd2hlbiB0aGUgcmVjaXBpZW50IHNldCBjaGFuZ2VkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVGbm94VG9tbChyb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVGbm94VG9tbCcsIGFzeW5jICgpID0+IHtcbiAgICAvLyBUaGUgZmFpbHVyZSBmbGFnIGlzIHBlciByZXBvc2l0b3J5OiB3YmZ5IGNhbiBwcm9jZXNzIG11bHRpcGxlIHdvcmtpbmcgZGlyZWN0b3JpZXMgaW4gb25lXG4gICAgLy8gaW52b2NhdGlvbiwgYW5kIGFuIGVhcmxpZXIgcmVwb3NpdG9yeSdzIGZhaWx1cmUgbXVzdCBub3QgdmV0byBhIGxhdGVyIHJlcG9zaXRvcnkncyB1cGxvYWQuXG4gICAgZm5veFN5bmNGYWlsZWQgPSBmYWxzZTtcbiAgICAvLyBBIHJlcG9zaXRvcnkgb3V0c2lkZSBXaWxsQm9vc3Rlci9XaWxsQm9vc3RlckxhYiBtYW5hZ2VzIGl0cyBvd24gcmVjaXBpZW50IHNldCAoZS5nLiBhXG4gICAgLy8gcGVyc29uYWwgcmVwb3NpdG9yeSB3aXRoIGl0cyBvd24gQ0kgaWRlbnRpdHkpLCBzbyByZXdyaXRpbmcgaXQgdG8gdGhlIG9yZyByb3N0ZXIgd291bGQgZ3JhbnRcbiAgICAvLyBvcmcgbWVtYmVycyBhY2Nlc3MgYW5kIHJlLWVuY3J5cHQgc2VjcmV0cyBmb3IgYSBDSSBrZXkgdGhhdCByZXBvc2l0b3J5IGRvZXMgbm90IHVzZS5cbiAgICAvLyBzZXR1cFNlY3JldHMgbmV2ZXIgdXBsb2FkcyBzZWNyZXRzIGZvciBzdWNoIHJlcG9zaXRvcmllcyBlaXRoZXIsIHNvIHNraXAgZW50aXJlbHkuXG4gICAgaWYgKCFyb290Q29uZmlnLmlzV2lsbEJvb3N0ZXJSZXBvKSByZXR1cm47XG4gICAgY29uc3QgYWdlUmVjaXBpZW50cyA9IGdldEZub3hBZ2VSZWNpcGllbnRzKHJvb3RDb25maWcpO1xuICAgIGNvbnN0IHJvb3REaXJQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCk7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShyb290RGlyUGF0aCwgJ2Zub3gudG9tbCcpKSkge1xuICAgICAgLy8gQSBuZXN0ZWQtb25seSBmbm94IGxheW91dCBpcyB1bnN1cHBvcnRlZDogc2V0dXBTZWNyZXRzIHdvdWxkIHRha2UgdGhlIGRvdGVudiBwYXRoIGFuZFxuICAgICAgLy8gZGVsZXRlIEZOT1hfQUdFX0tFWSBldmVuIHRob3VnaCB0aGUgbmVzdGVkIGNvbmZpZydzIENJIHN0aWxsIG5lZWRzIGl0LlxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gT25seSBhZ2UtdXNpbmcgY29uZmlncyBjYXJyeSB0aGF0IHJpc2suIFdpdGhvdXQgYSByb290IHByb3ZpZGluZyB0aGUgYWdlIHByb3ZpZGVyLCBhXG4gICAgICAgIC8vIHN0cmF5IGNvbmZpZyB0aGF0IGRlY2xhcmVzIG5vbmUgdXNlcyBubyBhZ2UgZW5jcnlwdGlvbiBhdCBhbGwgKGUuZy4gYSBwbGFpbnRleHQgdGVzdFxuICAgICAgICAvLyBmaXh0dXJlIG9yIGV4YW1wbGUgY29uZmlnIGFueSByZXBvc2l0b3J5IG1heSBsZWdpdGltYXRlbHkgY29tbWl0KSwgc28gaXQgbmVpdGhlciBuZWVkc1xuICAgICAgICAvLyByZWNpcGllbnQgc3luY2hyb25pemF0aW9uIG5vciBvd25zIGFuIEZOT1hfQUdFX0tFWSBhbmQgbXVzdCBub3QgYmxvY2sgdGhlIHJ1bi5cbiAgICAgICAgY29uc3Qgc3RyYXlGaWxlUGF0aHMgPSBsaXN0Rm5veExpa2VGaWxlUGF0aHMocm9vdERpclBhdGgpLmZpbHRlcigoZmlsZVBhdGgpID0+XG4gICAgICAgICAgZGVjbGFyZXNGbm94QWdlUHJvdmlkZXIoZmlsZVBhdGgpXG4gICAgICAgICk7XG4gICAgICAgIGlmIChzdHJheUZpbGVQYXRocy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgZmFpbEZub3hTeW5jKFxuICAgICAgICAgICAgYEZhaWxlZCB0byBzeW5jaHJvbml6ZSBmbm94IGFnZSByZWNpcGllbnRzIGJlY2F1c2UgZm5veCBjb25maWdzIGV4aXN0IHdpdGhvdXQgYSByb290IGZub3gudG9tbDogJHtzdHJheUZpbGVQYXRocy5qb2luKCcsICcpfS4gQWRkIGEgcm9vdCBmbm94LnRvbWwuYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIEZhaWwgY2xvc2VkOiB3aXRob3V0IGdpdCBpbmZvcm1hdGlvbiBhIG5lc3RlZC1vbmx5IGZub3ggbGF5b3V0IGNhbm5vdCBiZSBydWxlZCBvdXQsIGFuZFxuICAgICAgICAvLyBzZXR1cFNlY3JldHMgd291bGQgb3RoZXJ3aXNlIHRha2UgdGhlIGRvdGVudiBwYXRoIGFuZCBkZWxldGUgRk5PWF9BR0VfS0VZLlxuICAgICAgICBmYWlsRm5veFN5bmMoXG4gICAgICAgICAgYEZhaWxlZCB0byBjaGVjayBmb3IgbmVzdGVkIGZub3ggY29uZmlncyBkdWUgdG86ICR7KGVycm9yIGFzIEVycm9yIHwgdW5kZWZpbmVkKT8ubWVzc2FnZSA/PyBlcnJvcn1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIEEgZmFpbGVkIHZpc2liaWxpdHkgbG9va3VwIGNvbGxhcHNlcyBpc1B1YmxpY1JlcG8gdG8gZmFsc2UsIHdoaWNoIHdvdWxkIHNpbGVudGx5IHJlLWVuY3J5cHRcbiAgICAvLyBhIHB1YmxpYyByZXBvc2l0b3J5J3Mgd29ybGQtcmVhZGFibGUgY2lwaGVydGV4dHMgdG8gdGhlIG9yZy1pbnRlcm5hbCBDSSBpZGVudGl0eSAoYW5kIHZpY2VcbiAgICAvLyB2ZXJzYSBkcm9wIHRoZSBwdWJsaWMgb25lKS4gRmFpbCBpbnN0ZWFkIG9mIGd1ZXNzaW5nIHdoZW5ldmVyIHZpc2liaWxpdHkgY2hhbmdlcyB0aGUgcm9zdGVyLlxuICAgIGlmICghcm9vdENvbmZpZy5pc1JlcG9WaXNpYmlsaXR5S25vd24gJiYgZG9lc0Zub3hSZWNpcGllbnRTZXREZXBlbmRPblZpc2liaWxpdHkocm9vdENvbmZpZykpIHtcbiAgICAgIGZhaWxGbm94U3luYyhcbiAgICAgICAgYEZhaWxlZCB0byBzeW5jaHJvbml6ZSBmbm94IGFnZSByZWNpcGllbnRzIGJlY2F1c2UgdGhlIHZpc2liaWxpdHkgb2YgJHtyb290Q29uZmlnLnJlcG9BdXRob3J9LyR7cm9vdENvbmZpZy5yZXBvTmFtZX0gY291bGQgbm90IGJlIGRldGVybWluZWQgKEdpdEh1YiBsb29rdXAgZmFpbGVkKSBhbmQgdGhlIENJIHJlY2lwaWVudCBkZXBlbmRzIG9uIGl0LiBDaGVjayBuZXR3b3JrIGFuZCBnaCBhdXRoZW50aWNhdGlvbiwgdGhlbiByZXJ1biB3YmZ5LmBcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIEJvdGggQ0kgaWRlbnRpdGllcyBhcmUgdmlzaWJpbGl0eS1jb25zdHJhaW5lZCwgc28gYSByZXBvc2l0b3J5IGNhbiBmYWxsIHRocm91Z2ggQk9USCAoZS5nLiBhXG4gICAgLy8gcHVibGljIFdpbGxCb29zdGVyTGFiIHJlcG9zaXRvcnksIHdob3NlIG9yZ2FuaXphdGlvbiBoYXMgbm8gUFVCTElDX0ZOT1hfQUdFX0tFWSBzZWNyZXQpLlxuICAgIC8vIFJlLWVuY3J5cHRpbmcgZm9yIGEgcm9zdGVyIHdpdGhvdXQgYSBDSSBpZGVudGl0eSB3b3VsZCBsZWF2ZSBDSSB1bmFibGUgdG8gZGVjcnlwdCBhbnl0aGluZyxcbiAgICAvLyBmYWlsaW5nIG9ubHkgYXQgcnVudGltZSBpbiBBY3Rpb25zOyBmYWlsIGxvdWRseSBoZXJlIGluc3RlYWQuXG4gICAgaWYgKCFyZXNvbHZlRm5veENpQWdlS2V5U2VjcmV0TmFtZShyb290Q29uZmlnKSkge1xuICAgICAgZmFpbEZub3hTeW5jKFxuICAgICAgICBgRmFpbGVkIHRvIHN5bmNocm9uaXplIGZub3ggYWdlIHJlY2lwaWVudHMgYmVjYXVzZSBubyBDSSBpZGVudGl0eSBpcyBzY29wZWQgdG8gJHtyb290Q29uZmlnLnJlcG9BdXRob3J9LyR7cm9vdENvbmZpZy5yZXBvTmFtZX0gKHB1YmxpYyByZXBvc2l0b3JpZXMgYXJlIHN1cHBvcnRlZCBvbmx5IGluIHRoZSBXaWxsQm9vc3RlciBvcmdhbml6YXRpb24pLiBQcm92aXNpb24gdGhlIG1hdGNoaW5nIG9yZ2FuaXphdGlvbiBzZWNyZXQgYW5kIGV4dGVuZCB0aGUgQ0kgc2NvcGVzIGluIHdiZnkgZmlyc3QuYFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gVGhlIG1pZ3JhdGlvbiBpcyB0cmFuc2FjdGlvbmFsIG92ZXIgZXZlcnkgbWFuYWdlZCBmbm94LnRvbWw6IHJlcnVucyBtdXN0IHJldHJ5IGZyb20gdGhlXG4gICAgLy8gb3JpZ2luYWwgc3RhdGUsIGFuZCBhIHBhcnRpYWxseSBtaWdyYXRlZCB0cmVlIGNvdWxkIG90aGVyd2lzZSBiZWNvbWUgdW5kZWNyeXB0YWJsZSBmb3IgdGhlXG4gICAgLy8gaWRlbnRpdHkgcGVyZm9ybWluZyBhIGxhdGVyIHJldHJ5IChlLmcuIHdoZW4gYSByZWNpcGllbnQgaXMgYmVpbmcgcmVtb3ZlZCkuXG4gICAgY29uc3Qgc25hcHNob3RzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgICAvLyBBIGZhaWxlZCBzeW5jaHJvbml6YXRpb24gbXVzdCBmYWlsIHRoZSB3aG9sZSB3YmZ5IHJ1bjogZXhpdGluZyB6ZXJvIHdpdGggc3RhbGUgcmVjaXBpZW50c1xuICAgIC8vIHdvdWxkIGxlYXZlIHNlY3JldHMgdW5kZWNyeXB0YWJsZSBmb3IgbmV3IHJlY2lwaWVudHMgd2hpbGUgbG9va2luZyBzdWNjZXNzZnVsLlxuICAgIHRyeSB7XG4gICAgICAvLyBBbnkgZm5veCBjb25maWcgKGluY2x1ZGluZyBhbGlhc2VzIGFuZCBsb2NhbCBvdmVycmlkZXMpIGluIGFuIGFuY2VzdG9yIGRpcmVjdG9yeSB3b3VsZFxuICAgICAgLy8gbWVyZ2UgaW50byAoYW5kIHBvc3NpYmx5IGJlIFJFV1JJVFRFTiBieSkgdGhpcyByZXBvc2l0b3J5J3MgYGZub3ggcmVlbmNyeXB0YCB0aHJvdWdoXG4gICAgICAvLyBoaWVyYXJjaGljYWwgbG9hZGluZywgdXNpbmcgdGhpcyByZXBvc2l0b3J5J3MgcmVjaXBpZW50IHNldCBmb3IgZm9yZWlnbiBzZWNyZXRzLlxuICAgICAgZm9yIChsZXQgZGlyUGF0aCA9IHBhdGguZGlybmFtZShyb290RGlyUGF0aCk7IDsgZGlyUGF0aCA9IHBhdGguZGlybmFtZShkaXJQYXRoKSkge1xuICAgICAgICBjb25zdCBhbmNlc3RvckZub3hGaWxlTmFtZXMgPSBsaXN0Rm5veExpa2VGaWxlTmFtZXMoZGlyUGF0aCk7XG4gICAgICAgIGlmIChhbmNlc3RvckZub3hGaWxlTmFtZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGZhaWxGbm94U3luYyhcbiAgICAgICAgICAgIGBGYWlsZWQgdG8gc3luY2hyb25pemUgZm5veCBhZ2UgcmVjaXBpZW50cyBiZWNhdXNlIGFuIGFuY2VzdG9yIGRpcmVjdG9yeSBjb250YWlucyBmbm94IGNvbmZpZ3MgdGhhdCBmbm94IHdvdWxkIGhpZXJhcmNoaWNhbGx5IG1lcmdlIGFuZCByZXdyaXRlOiAke2FuY2VzdG9yRm5veEZpbGVOYW1lc1xuICAgICAgICAgICAgICAubWFwKChuYW1lKSA9PiBwYXRoLmpvaW4oZGlyUGF0aCwgbmFtZSkpXG4gICAgICAgICAgICAgIC5qb2luKCcsICcpfS4gUmVtb3ZlIHRoZW0gb3IgbW92ZSB0aGUgcmVwb3NpdG9yeS5gXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhdGguZGlybmFtZShkaXJQYXRoKSA9PT0gZGlyUGF0aCkgYnJlYWs7XG4gICAgICB9XG4gICAgICAvLyBmbm94IGFsc28gbG9hZHMgY29tbWl0dGVkIGNvbmZpZyBhbGlhc2VzIHRoaXMgZ2VuZXJhdG9yIGNhbm5vdCBrZWVwIGluIHN5bmMuXG4gICAgICBjb25zdCBmbm94TGlrZUZpbGVQYXRocyA9IGxpc3RGbm94TGlrZUZpbGVQYXRocyhyb290RGlyUGF0aCk7XG4gICAgICBjb25zdCB1bnN1cHBvcnRlZEZpbGVQYXRocyA9IGZub3hMaWtlRmlsZVBhdGhzLmZpbHRlcigoZmlsZVBhdGgpID0+IHBhdGguYmFzZW5hbWUoZmlsZVBhdGgpICE9PSAnZm5veC50b21sJyk7XG4gICAgICBpZiAodW5zdXBwb3J0ZWRGaWxlUGF0aHMubGVuZ3RoID4gMCkge1xuICAgICAgICBmYWlsRm5veFN5bmMoXG4gICAgICAgICAgYEZhaWxlZCB0byBzeW5jaHJvbml6ZSBmbm94IGFnZSByZWNpcGllbnRzIGJlY2F1c2Ugb25seSBmbm94LnRvbWwgZmlsZXMgYXJlIHN1cHBvcnRlZDogJHt1bnN1cHBvcnRlZEZpbGVQYXRocy5qb2luKCcsICcpfS4gTWVyZ2UgdGhlbSBpbnRvIHRoZSBhZGphY2VudCBmbm94LnRvbWwuYFxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBkaXJQYXRocyA9IGxpc3RGbm94VG9tbERpclBhdGhzKGZub3hMaWtlRmlsZVBhdGhzKTtcbiAgICAgIGlmICghZGlyUGF0aHMuaW5jbHVkZXMocm9vdERpclBhdGgpKSB7XG4gICAgICAgIGZhaWxGbm94U3luYyhcbiAgICAgICAgICBgRmFpbGVkIHRvIHN5bmNocm9uaXplIGZub3ggYWdlIHJlY2lwaWVudHMgYmVjYXVzZSAke3BhdGgucmVzb2x2ZShyb290RGlyUGF0aCwgJ2Zub3gudG9tbCcpfSBpcyBpbnZpc2libGUgdG8gZ2l0IChnaXRpZ25vcmVkPykuIENvbW1pdCBpdCBvciByZW1vdmUgaXQuYFxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBHaXQtYmFzZWQgZGlzY292ZXJ5IGNhbm5vdCBzZWUgZ2l0aWdub3JlZCBmaWxlcywgc28gYWxzbyBpbnNwZWN0IGV2ZXJ5IGRpcmVjdG9yeSBpbiBlYWNoXG4gICAgICAvLyBtYW5hZ2VkIGNvbmZpZydzIGhpZXJhcmNoeSB0aHJvdWdoIHRoZSBmaWxlc3lzdGVtOiBhIGdpdGlnbm9yZWQgYWxpYXMgKGUuZy4gLmZub3gudG9tbClcbiAgICAgIC8vIG9yIGEgZ2l0aWdub3JlZCBmbm94LnRvbWwgaW4gYW4gaW50ZXJtZWRpYXRlIGRpcmVjdG9yeSB3b3VsZCBzdGlsbCBiZSBsb2FkZWQgYnkgZm5veCBhbmRcbiAgICAgIC8vIGNvdWxkIG92ZXJyaWRlIHRoZSBwcm92aWRlciB1c2VkIGZvciBuZXN0ZWQgcmUtZW5jcnlwdGlvbi5cbiAgICAgIGNvbnN0IG1hbmFnZWREaXJQYXRocyA9IG5ldyBTZXQoZGlyUGF0aHMpO1xuICAgICAgZm9yIChjb25zdCBkaXJQYXRoIG9mIGRpclBhdGhzKSB7XG4gICAgICAgIGZvciAoY29uc3QgaGllcmFyY2h5RGlyUGF0aCBvZiBsaXN0QW5jZXN0b3JEaXJQYXRocyhkaXJQYXRoLCByb290RGlyUGF0aCkpIHtcbiAgICAgICAgICBjb25zdCBzdHJheUZpbGVOYW1lcyA9IGxpc3RGbm94TGlrZUZpbGVOYW1lcyhoaWVyYXJjaHlEaXJQYXRoKS5maWx0ZXIoXG4gICAgICAgICAgICAobmFtZSkgPT4gbmFtZSAhPT0gJ2Zub3gubG9jYWwudG9tbCcgJiYgIShuYW1lID09PSAnZm5veC50b21sJyAmJiBtYW5hZ2VkRGlyUGF0aHMuaGFzKGhpZXJhcmNoeURpclBhdGgpKVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKHN0cmF5RmlsZU5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZhaWxGbm94U3luYyhcbiAgICAgICAgICAgICAgYEZhaWxlZCB0byBzeW5jaHJvbml6ZSBmbm94IGFnZSByZWNpcGllbnRzIGJlY2F1c2UgZm5veCB3b3VsZCBsb2FkIHVubWFuYWdlZCAoZ2l0aWdub3JlZD8pIGNvbmZpZ3M6ICR7c3RyYXlGaWxlTmFtZXNcbiAgICAgICAgICAgICAgICAubWFwKChuYW1lKSA9PiBwYXRoLmpvaW4oaGllcmFyY2h5RGlyUGF0aCwgbmFtZSkpXG4gICAgICAgICAgICAgICAgLmpvaW4oJywgJyl9LiBDb21taXQgdGhlbSBhcyBmbm94LnRvbWwgb3IgcmVtb3ZlIHRoZW0uYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gQSBmbm94LmxvY2FsLnRvbWwgYW55d2hlcmUgaW4gdGhlIG1lcmdlZCBoaWVyYXJjaHkgKG5vdCBvbmx5IG5leHQgdG8gYSBtYW5hZ2VkXG4gICAgICAgICAgLy8gY29uZmlnKSBjYW4gb3ZlcnJpZGUgcHJvdmlkZXJzLlxuICAgICAgICAgIGNvbnN0IGxvY2FsSXNzdWUgPSBmaW5kRm5veExvY2FsVG9tbElzc3VlKGhpZXJhcmNoeURpclBhdGgpO1xuICAgICAgICAgIGlmIChsb2NhbElzc3VlKSB7XG4gICAgICAgICAgICBmYWlsRm5veFN5bmMoXG4gICAgICAgICAgICAgIGBGYWlsZWQgdG8gc3luY2hyb25pemUgZm5veCBhZ2UgcmVjaXBpZW50cyBiZWNhdXNlICR7bG9jYWxJc3N1ZX0uIEtlZXAgb25seSBtYWNoaW5lLWxvY2FsIHNlY3JldCBvdmVycmlkZXMgdGhlcmUuYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIFRoZSBpbi1tZW1vcnkgc25hcHNob3RzIGRvIG5vdCBzdXJ2aXZlIGEga2lsbGVkIHByb2Nlc3MsIHNvIGEgZHVyYWJsZSBtYXJrZXIgaXMgd3JpdHRlblxuICAgICAgLy8gYmVmb3JlIHRoZSBmaXJzdCBtdXRhdGlvbiBhbmQgcmVtb3ZlZCBvbmx5IHdoZW4gdGhlIHRyZWUgaXMgY29uc2lzdGVudCBhZ2Fpbi4gQSBsZWZ0b3ZlclxuICAgICAgLy8gbWFya2VyIG1lYW5zIGEgcHJldmlvdXMgcnVuIHdhcyBraWxsZWQgbWlkLW1pZ3JhdGlvbiAob3IgY291bGQgbm90IHJlc3RvcmUpOiBzb21lXG4gICAgICAvLyBjaXBoZXJ0ZXh0cyBtYXkgbm90IG1hdGNoIHRoZSByZWNpcGllbnRzLCBvciBtYXkgZXZlbiBiZSB1bmRlY3J5cHRhYmxlIGZvciB0aGUgZXhlY3V0b3Inc1xuICAgICAgLy8gaWRlbnRpdHkgd2hlbiBhIHJlY2lwaWVudCB3YXMgYmVpbmcgcmVtb3ZlZCDigJQgc3RhdGVzIHRoaXMgY29kZSBjYW5ub3QgcmVwYWlyIHNhZmVseVxuICAgICAgLy8gYmVjYXVzZSB0aGUgd29ya2luZyB0cmVlIG1heSBoYXZlIGNoYW5nZWQgc2luY2UgKGJyYW5jaCBzd2l0Y2hlcywgbWFudWFsIGVkaXRzKS4gVGhlXG4gICAgICAvLyBmbm94LnRvbWwgZmlsZXMgYXJlIGdpdC10cmFja2VkLCBzbyB0aGUgdXNlciByZXN0b3JlcyB0aGVtIHZpYSBnaXQgYW5kIGNsZWFycyB0aGUgbWFya2VyLlxuICAgICAgbWlncmF0aW9uTWFya2VyUGF0aCA9IHBhdGgucmVzb2x2ZShyb290RGlyUGF0aCwgJy50bXAnLCAnd2JmeS1mbm94LW1pZ3JhdGlvbi1tYXJrZXInKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKG1pZ3JhdGlvbk1hcmtlclBhdGgpKSB7XG4gICAgICAgIGZhaWxGbm94U3luYyhcbiAgICAgICAgICBgRmFpbGVkIHRvIHN5bmNocm9uaXplIGZub3ggYWdlIHJlY2lwaWVudHMgYmVjYXVzZSBhIHByZXZpb3VzIG1pZ3JhdGlvbiB3YXMgaW50ZXJydXB0ZWQuIFJlc3RvcmUgdGhlIGZub3gudG9tbCBmaWxlcyB2aWEgZ2l0IChlLmcuIFxcYGdpdCBzdGF0dXNcXGAgYW5kIFxcYGdpdCByZXN0b3JlIC0tICcqZm5veCoudG9tbCdcXGAgaWYgeW91IGhhdmUgbm8gaW50ZW50aW9uYWwgbG9jYWwgY2hhbmdlcyksIHRoZW4gZGVsZXRlICR7bWlncmF0aW9uTWFya2VyUGF0aH0gYW5kIHJlcnVuIHdiZnkuYFxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIEEgdHJhY2tlZCBzeW1saW5rIG5hbWVkIGZub3gudG9tbCAob3IgYSBzeW1saW5rZWQgcGFyZW50IGRpcmVjdG9yeSkgd291bGQgbWFrZSB0aGVcbiAgICAgIC8vIHJld3JpdGUgYW5kIGBmbm94IHJlZW5jcnlwdGAgcmVhZCBhbmQgTU9ESUZZIGZpbGVzIG91dHNpZGUgdGhpcyByZXBvc2l0b3J5LlxuICAgICAgY29uc3QgcmVhbFJvb3REaXJQYXRoID0gZnMucmVhbHBhdGhTeW5jKHJvb3REaXJQYXRoKTtcbiAgICAgIGZvciAoY29uc3QgZGlyUGF0aCBvZiBkaXJQYXRocykge1xuICAgICAgICBjb25zdCBmbm94VG9tbFBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2Zub3gudG9tbCcpO1xuICAgICAgICBjb25zdCByZWFsUGF0aCA9IGZzLnJlYWxwYXRoU3luYyhmbm94VG9tbFBhdGgpO1xuICAgICAgICBpZiAoZnMubHN0YXRTeW5jKGZub3hUb21sUGF0aCkuaXNTeW1ib2xpY0xpbmsoKSB8fCAhcmVhbFBhdGguc3RhcnRzV2l0aChyZWFsUm9vdERpclBhdGggKyBwYXRoLnNlcCkpIHtcbiAgICAgICAgICBmYWlsRm5veFN5bmMoXG4gICAgICAgICAgICBgRmFpbGVkIHRvIHN5bmNocm9uaXplIGZub3ggYWdlIHJlY2lwaWVudHMgYmVjYXVzZSAke2Zub3hUb21sUGF0aH0gaXMgYSBzeW1saW5rIG9yIHJlc29sdmVzIG91dHNpZGUgdGhlIHJlcG9zaXRvcnkgKCR7cmVhbFBhdGh9KS4gUmVwbGFjZSBpdCB3aXRoIGEgcmVndWxhciBpbi1yZXBvc2l0b3J5IGZpbGUuYFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHNuYXBzaG90cy5zZXQoZm5veFRvbWxQYXRoLCBmcy5yZWFkRmlsZVN5bmMoZm5veFRvbWxQYXRoLCAndXRmOCcpKTtcbiAgICAgIH1cblxuICAgICAgLy8gU29ydGVkIG9yZGVyIHByb2Nlc3NlcyBhbmNlc3RvcnMgYmVmb3JlIGRlc2NlbmRhbnRzLCBzbyBjb25maWdzIGluaGVyaXRpbmcgYW4gdXBkYXRlZFxuICAgICAgLy8gcHJvdmlkZXIgcmUtZW5jcnlwdCBhZ2FpbnN0IHRoZSBhbHJlYWR5LXVwZGF0ZWQgcmVjaXBpZW50cy5cbiAgICAgIGNvbnN0IGNoYW5nZWREaXJQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgICAgIGxldCBhbnlGYWlsZWQgPSBmYWxzZTtcbiAgICAgIGZvciAoY29uc3QgZGlyUGF0aCBvZiBkaXJQYXRocykge1xuICAgICAgICBjb25zdCBhbmNlc3RvckNoYW5nZWQgPSBjaGFuZ2VkRGlyUGF0aHMuc29tZSgoY2hhbmdlZERpclBhdGgpID0+IGRpclBhdGguc3RhcnRzV2l0aChjaGFuZ2VkRGlyUGF0aCArIHBhdGguc2VwKSk7XG4gICAgICAgIC8vIEV2ZXJ5IGRpclBhdGggd2FzIHNuYXBzaG90dGVkIGFib3ZlLiBBIG1pc3Npbmcgc25hcHNob3QgbXVzdCBmYWlsIGhhcmQ6IGZhbGxpbmcgYmFjayB0b1xuICAgICAgICAvLyBhbiBlbXB0eSBzdHJpbmcgd291bGQgZmxvdyBpbnRvIHJlcGxhY2VBZ2VSZWNpcGllbnRzIGFuZCBvdmVyd3JpdGUgdGhlIHJlYWwgZm5veC50b21sXG4gICAgICAgIC8vIHdpdGggYSByZWNpcGllbnRzLW9ubHkgZmlsZSwgZGVzdHJveWluZyBldmVyeSBjb21taXR0ZWQgc2VjcmV0LlxuICAgICAgICBjb25zdCBzbmFwc2hvdENvbnRlbnQgPSBzbmFwc2hvdHMuZ2V0KHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnZm5veC50b21sJykpO1xuICAgICAgICBpZiAoc25hcHNob3RDb250ZW50ID09PSB1bmRlZmluZWQpIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBmbm94LnRvbWwgc25hcHNob3QgZm9yICR7ZGlyUGF0aH0uYCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN5bmNocm9uaXplRm5veEFnZVJlY2lwaWVudHMoXG4gICAgICAgICAgZGlyUGF0aCxcbiAgICAgICAgICByb290RGlyUGF0aCxcbiAgICAgICAgICBkaXJQYXRoID09PSByb290RGlyUGF0aCxcbiAgICAgICAgICBhbmNlc3RvckNoYW5nZWQsXG4gICAgICAgICAgc25hcHNob3RDb250ZW50LFxuICAgICAgICAgIGFnZVJlY2lwaWVudHNcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gJ2NoYW5nZWQnKSBjaGFuZ2VkRGlyUGF0aHMucHVzaChkaXJQYXRoKTtcbiAgICAgICAgYW55RmFpbGVkIHx8PSByZXN1bHQgPT09ICdmYWlsZWQnO1xuICAgICAgfVxuICAgICAgaWYgKGFueUZhaWxlZCkge1xuICAgICAgICAvLyBBIGZhaWxlZCByZS1lbmNyeXB0aW9uIG1heSBoYXZlIHJld3JpdHRlbiBzb21lIGNpcGhlcnRleHRzLCBzbyByZXN0b3JlIHVuY29uZGl0aW9uYWxseS5cbiAgICAgICAgLy8gVGhlIG1hcmtlciBpcyByZW1vdmVkIG9ubHkgd2hlbiByZXN0b3JhdGlvbiBmdWxseSBzdWNjZWVkZWQgYW5kIHRoZSB0cmVlIGlzIGNvbnNpc3RlbnQuXG4gICAgICAgIC8vIFJlc3RvcmUgT05MWSB3aGVuIHRoaXMgcnVuIG93bnMgdGhlIG1hcmtlcjogZXZlcnkgY29tbWl0dGVkLWNvbmZpZyBtdXRhdGlvbiBoYXBwZW5zXG4gICAgICAgIC8vIGFmdGVyIG1hcmtlciBhY3F1aXNpdGlvbiwgc28gYSBub24tb3duZXIgKGUuZy4gbG9zaW5nIGEgcmFjZSBhZ2FpbnN0IGEgY29uY3VycmVudCB3YmZ5KVxuICAgICAgICAvLyBoYXMgY2hhbmdlZCBub3RoaW5nIGFuZCBtdXN0IG5vdCBvdmVyd3JpdGUgdGhlIG93bmVyJ3MgaW4tcHJvZ3Jlc3MgbWlncmF0aW9uLlxuICAgICAgICBpZiAobWlncmF0aW9uTWFya2VyT3duZWQgJiYgcmVzdG9yZVNuYXBzaG90cyhzbmFwc2hvdHMpKSByZW1vdmVPd25lZE1pZ3JhdGlvbk1hcmtlcigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVtb3ZlT3duZWRNaWdyYXRpb25NYXJrZXIoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKG1pZ3JhdGlvbk1hcmtlck93bmVkICYmIHJlc3RvcmVTbmFwc2hvdHMoc25hcHNob3RzKSkge1xuICAgICAgICByZW1vdmVPd25lZE1pZ3JhdGlvbk1hcmtlcigpO1xuICAgICAgfVxuICAgICAgZmFpbEZub3hTeW5jKGBGYWlsZWQgdG8gc3luY2hyb25pemUgZm5veCBhZ2UgcmVjaXBpZW50cyBkdWUgdG86ICR7KGVycm9yIGFzIEVycm9yIHwgdW5kZWZpbmVkKT8uc3RhY2sgPz8gZXJyb3J9YCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIG1pZ3JhdGlvbk1hcmtlclBhdGggPSB1bmRlZmluZWQ7XG4gICAgICBtaWdyYXRpb25NYXJrZXJPd25lZCA9IGZhbHNlO1xuICAgIH1cbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN5bmNocm9uaXplRm5veEFnZVJlY2lwaWVudHMoXG4gIGRpclBhdGg6IHN0cmluZyxcbiAgcm9vdERpclBhdGg6IHN0cmluZyxcbiAgaXNSb290OiBib29sZWFuLFxuICBhbmNlc3RvclJlY2lwaWVudHNDaGFuZ2VkOiBib29sZWFuLFxuICBvcmlnaW5hbENvbnRlbnQ6IHN0cmluZyxcbiAgYWdlUmVjaXBpZW50czogcmVhZG9ubHkgRm5veEFnZVJlY2lwaWVudFtdXG4pOiBQcm9taXNlPCdjaGFuZ2VkJyB8ICd1bmNoYW5nZWQnIHwgJ2ZhaWxlZCc+IHtcbiAgY29uc3QgZm5veFRvbWxQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdmbm94LnRvbWwnKTtcblxuICAvLyBSZWNpcGllbnQgc3luY2hyb25pemF0aW9uIG9ubHkgdW5kZXJzdGFuZHMgdGhlIHN0YW5kYXJkIHNpbmdsZS1maWxlIGxheW91dCB3aXRoIG9uZVxuICAvLyB0b3AtbGV2ZWwgYWdlIHByb3ZpZGVyIG5hbWVkIGBhZ2VgLiBHaXRpZ25vcmVkIGNvbmZpZyBhbGlhc2VzIChlLmcuIC5mbm94LmxvY2FsLnRvbWwpIHRoYXRcbiAgLy8gZ2l0LWJhc2VkIGRpc2NvdmVyeSBjYW5ub3Qgc2VlLCBpbXBvcnRzLCBkaWZmZXJlbnRseSBuYW1lZCBhZ2UgcHJvdmlkZXJzLCBvciBwcm92aWRlclxuICAvLyBvdmVycmlkZXMgd291bGQga2VlcCB1c2luZyByZWNpcGllbnQgc2V0cyB0aGlzIGdlbmVyYXRvciBkb2VzIG5vdCByZXdyaXRlLCBzbyB0aGVpciBzZWNyZXRzXG4gIC8vIHdvdWxkIHNpbGVudGx5IHN0YXkgdW5kZWNyeXB0YWJsZSBmb3IgbmV3IHJlY2lwaWVudHM7IGZhaWwgaW5zdGVhZCBvZiBwcm9jZWVkaW5nLiBUaGVcbiAgLy8gZ2l0aWdub3JlZCBmbm94LmxvY2FsLnRvbWwgaXMgYSBzdXBwb3J0ZWQgbWFjaGluZS1sb2NhbCBvdmVycmlkZSwgYnV0IG9ubHkgd2hpbGUgaXQgbGVhdmVzXG4gIC8vIHByb3ZpZGVycyBhbG9uZS5cbiAgY29uc3QgdW5zdXBwb3J0ZWRGaWxlTmFtZXMgPSBsaXN0Rm5veExpa2VGaWxlTmFtZXMoZGlyUGF0aCkuZmlsdGVyKFxuICAgIChuYW1lKSA9PiBuYW1lICE9PSAnZm5veC50b21sJyAmJiBuYW1lICE9PSAnZm5veC5sb2NhbC50b21sJ1xuICApO1xuICBpZiAodW5zdXBwb3J0ZWRGaWxlTmFtZXMubGVuZ3RoID4gMCkge1xuICAgIGZhaWxGbm94U3luYyhcbiAgICAgIGBGYWlsZWQgdG8gc3luY2hyb25pemUgZm5veCBhZ2UgcmVjaXBpZW50cyBpbiAke2RpclBhdGh9IGJlY2F1c2Ugb25seSBmbm94LnRvbWwgYW5kIGZub3gubG9jYWwudG9tbCBhcmUgc3VwcG9ydGVkOiAke3Vuc3VwcG9ydGVkRmlsZU5hbWVzLmpvaW4oJywgJyl9LiBNZXJnZSB0aGVtIGludG8gZm5veC50b21sLmBcbiAgICApO1xuICAgIHJldHVybiAnZmFpbGVkJztcbiAgfVxuICAvLyBBIHN0YWxlIGJhY2t1cCBsZWZ0IGJ5IGFuIGludGVycnVwdGVkIGVhcmxpZXIgcnVuIG11c3QgYmUgcmVzdG9yZWQgc28gdGhlIHVzZXIncyBsb2NhbFxuICAvLyBvdmVycmlkZXMgYXJlIG5ldmVyIHNpbGVudGx5IGxvc3QgKHRoZSBtaWdyYXRpb24gbWFya2VyIHNlcGFyYXRlbHkgYmxvY2tzIHRoaXMgcnVuIHdoZW4gdGhlXG4gIC8vIGludGVycnVwdGlvbiBsZWZ0IHRoZSBtaWdyYXRpb24gaXRzZWxmIGluY29tcGxldGUpLlxuICByZWNvdmVyU3RhbGVGbm94TG9jYWxCYWNrdXAocm9vdERpclBhdGgsIGRpclBhdGgpO1xuXG4gIGNvbnN0IGxheW91dElzc3VlID0gZmluZEZub3hMYXlvdXRJc3N1ZShvcmlnaW5hbENvbnRlbnQpO1xuICBpZiAobGF5b3V0SXNzdWUpIHtcbiAgICBmYWlsRm5veFN5bmMoYEZhaWxlZCB0byBzeW5jaHJvbml6ZSBmbm94IGFnZSByZWNpcGllbnRzIGJlY2F1c2UgJHtmbm94VG9tbFBhdGh9ICR7bGF5b3V0SXNzdWV9LmApO1xuICAgIHJldHVybiAnZmFpbGVkJztcbiAgfVxuICBjb25zdCBzZXR0aW5ncyA9IEJ1bi5UT01MLnBhcnNlKG9yaWdpbmFsQ29udGVudCkgYXMgRm5veFRvbWw7XG4gIGNvbnN0IHByb2ZpbGVOYW1lcyA9IE9iamVjdC5rZXlzKHNldHRpbmdzLnByb2ZpbGVzID8/IHt9KTtcbiAgY29uc3QgY3VycmVudFJlY2lwaWVudHMgPSByZWFkRm5veEFnZVJlY2lwaWVudHMob3JpZ2luYWxDb250ZW50KTtcblxuICAvLyBBIG5lc3RlZCBmbm94LnRvbWwgd2l0aG91dCBpdHMgb3duIGFnZSBwcm92aWRlciBpbmhlcml0cyB0aGUgbmVhcmVzdCBhbmNlc3RvcidzIG9uZSB0aHJvdWdoXG4gIC8vIGZub3gncyBoaWVyYXJjaGljYWwgbG9hZGluZywgc28gb25seSB0aGUgcm9vdCBjb25maWcgbXVzdCBkZWNsYXJlIHRoZSBwcm92aWRlciDigJQgYnV0IHRoZVxuICAvLyBuZXN0ZWQgY29uZmlnJ3Mgb3duIGNpcGhlcnRleHRzIHN0aWxsIG11c3QgYmUgcmUtZW5jcnlwdGVkIHdoZW5ldmVyIGFuIGFuY2VzdG9yJ3MgcmVjaXBpZW50c1xuICAvLyBjaGFuZ2VkLCBhbmQgdGhhdCBvbmx5IGhhcHBlbnMgd2hlbiBgZm5veCByZWVuY3J5cHRgIHJ1bnMgZnJvbSB0aGUgbmVzdGVkIGRpcmVjdG9yeS5cbiAgaWYgKCFpc1Jvb3QgJiYgIWN1cnJlbnRSZWNpcGllbnRzKSB7XG4gICAgaWYgKGFuY2VzdG9yUmVjaXBpZW50c0NoYW5nZWQpIHtcbiAgICAgIHdyaXRlTWlncmF0aW9uTWFya2VyKCk7XG4gICAgICBpZiAoIXJlZW5jcnlwdEZub3hTZWNyZXRzKGRpclBhdGgsIHJvb3REaXJQYXRoLCBwcm9maWxlTmFtZXMpKSB7XG4gICAgICAgIGZhaWxGbm94U3luYyhcbiAgICAgICAgICBgRmFpbGVkIHRvIHJlLWVuY3J5cHQgZm5veCBzZWNyZXRzIGluICR7ZGlyUGF0aH0gZm9yIHRoZSB1cGRhdGVkIHJlY2lwaWVudHMuIEZpeCB0aGUgZXJyb3IgYW5kIHJlcnVuIHdiZnkuYFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gJ2ZhaWxlZCc7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAndW5jaGFuZ2VkJztcbiAgfVxuXG4gIGlmIChcbiAgICBjdXJyZW50UmVjaXBpZW50cyAmJlxuICAgIGN1cnJlbnRSZWNpcGllbnRzLnNpemUgPT09IGFnZVJlY2lwaWVudHMubGVuZ3RoICYmXG4gICAgYWdlUmVjaXBpZW50cy5ldmVyeSgocmVjaXBpZW50KSA9PiBjdXJyZW50UmVjaXBpZW50cy5oYXMocmVjaXBpZW50LnB1YmxpY0tleSkpXG4gICkge1xuICAgIHJldHVybiAndW5jaGFuZ2VkJztcbiAgfVxuXG4gIC8vIFJld3JpdGUgb25seSB0aGUgcmVjaXBpZW50cyBhc3NpZ25tZW50IHNvIHVzZXItYXV0aG9yZWQgY29tbWVudHMgYW5kIGZvcm1hdHRpbmcgc3Vydml2ZS5cbiAgLy8gUmUtcGFyc2UgYmVmb3JlIHdyaXRpbmc6IGFuIHVudXN1YWwgbGF5b3V0IChlLmcuIGRvdHRlZCBrZXlzKSBjb3VsZCBtYWtlIHRoZSB0ZXh0dWFsIGVkaXRcbiAgLy8gcHJvZHVjZSBhIGR1cGxpY2F0ZSB0YWJsZSBvciBsZWF2ZSB0aGUgb2xkIHJlY2lwaWVudHMgaW4gZWZmZWN0LlxuICBjb25zdCB1cGRhdGVkQ29udGVudCA9IHJlcGxhY2VBZ2VSZWNpcGllbnRzKG9yaWdpbmFsQ29udGVudCwgYWdlUmVjaXBpZW50cyk7XG4gIGNvbnN0IHVwZGF0ZWRSZWNpcGllbnRzID0gWy4uLihyZWFkRm5veEFnZVJlY2lwaWVudHModXBkYXRlZENvbnRlbnQpID8/IFtdKV07XG4gIGlmIChcbiAgICB1cGRhdGVkUmVjaXBpZW50cy5sZW5ndGggIT09IGFnZVJlY2lwaWVudHMubGVuZ3RoIHx8XG4gICAgIWFnZVJlY2lwaWVudHMuZXZlcnkoKHJlY2lwaWVudCkgPT4gdXBkYXRlZFJlY2lwaWVudHMuaW5jbHVkZXMocmVjaXBpZW50LnB1YmxpY0tleSkpXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcihgUmV3cml0aW5nIHRoZSBhZ2UgcmVjaXBpZW50cyBpbiAke2Zub3hUb21sUGF0aH0gZGlkIG5vdCB0YWtlIGVmZmVjdDsgdXBkYXRlIHRoZW0gbWFudWFsbHkuYCk7XG4gIH1cbiAgd3JpdGVNaWdyYXRpb25NYXJrZXIoKTtcbiAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmbm94VG9tbFBhdGgsIHVwZGF0ZWRDb250ZW50KTtcblxuICBpZiAoIXJlZW5jcnlwdEZub3hTZWNyZXRzKGRpclBhdGgsIHJvb3REaXJQYXRoLCBwcm9maWxlTmFtZXMpKSB7XG4gICAgLy8gUmVzdG9yZSB0aGUgb3JpZ2luYWwgY29uZmlnOiBrZWVwaW5nIHRoZSBuZXcgcmVjaXBpZW50cyB3aXRoIG9sZCBjaXBoZXJ0ZXh0cyB3b3VsZCBtYWtlXG4gICAgLy8gdGhpcyBnZW5lcmF0b3Igc2tpcCByZS1lbmNyeXB0aW9uIGZvcmV2ZXIgYW5kIGxldCBzZXR1cFNlY3JldHMgdXBsb2FkIGEgQ0kga2V5IHRoYXRcbiAgICAvLyBjYW5ub3QgZGVjcnlwdCBhbnl0aGluZy4gVGhlIG9sZCBjaXBoZXJ0ZXh0cyByZW1haW4gdmFsaWQgZm9yIHRoZSBvbGQgcmVjaXBpZW50cy5cbiAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZub3hUb21sUGF0aCwgb3JpZ2luYWxDb250ZW50KTtcbiAgICBmYWlsRm5veFN5bmMoXG4gICAgICBgRmFpbGVkIHRvIHJlLWVuY3J5cHQgZm5veCBzZWNyZXRzIGluICR7ZGlyUGF0aH0gZm9yIHRoZSB1cGRhdGVkIHJlY2lwaWVudHMuIEZpeCB0aGUgZXJyb3IgYW5kIHJlcnVuIHdiZnkuYFxuICAgICk7XG4gICAgcmV0dXJuICdmYWlsZWQnO1xuICB9XG4gIHJldHVybiAnY2hhbmdlZCc7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGRlc2NyaXB0aW9uIG9mIGEgZm5veC50b21sIGxheW91dCB0aGF0IHJlY2lwaWVudCBzeW5jaHJvbml6YXRpb24gYW5kIHRoZSBDSS1rZXlcbiAqIHZlcmlmaWNhdGlvbiBjYW5ub3QgY292ZXIsIG9yIHVuZGVmaW5lZCB3aGVuIHRoZSBzdGFuZGFyZCBzaW5nbGUtZmlsZSwgc2luZ2xlLWFnZS1wcm92aWRlclxuICogbGF5b3V0IGlzIHVzZWQuXG4gKi9cbmZ1bmN0aW9uIGZpbmRGbm94TGF5b3V0SXNzdWUoZm5veFRvbWxDb250ZW50OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIGNvbnN0IHNldHRpbmdzID0gQnVuLlRPTUwucGFyc2UoZm5veFRvbWxDb250ZW50KSBhcyBGbm94VG9tbDtcbiAgICBpZiAoc2V0dGluZ3MuaW1wb3J0ICE9PSB1bmRlZmluZWQpIHJldHVybiAndXNlcyB0aGUgdW5zdXBwb3J0ZWQgYGltcG9ydGAgc2V0dGluZyc7XG4gICAgY29uc3Qgbm9uU3RhbmRhcmRBZ2VQcm92aWRlck5hbWVzID0gT2JqZWN0LmVudHJpZXMoc2V0dGluZ3MucHJvdmlkZXJzID8/IHt9KVxuICAgICAgLmZpbHRlcigoW25hbWUsIHByb3ZpZGVyXSkgPT4gKHByb3ZpZGVyPy50eXBlID09PSAnYWdlJykgIT09IChuYW1lID09PSAnYWdlJykpXG4gICAgICAubWFwKChbbmFtZV0pID0+IG5hbWUpO1xuICAgIGlmIChub25TdGFuZGFyZEFnZVByb3ZpZGVyTmFtZXMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIGBkZWNsYXJlcyBhZ2UgcHJvdmlkZXJzIG5vdCBuYW1lZCBcXGBhZ2VcXGAgKG9yIGFuIFxcYGFnZVxcYCBwcm92aWRlciBvZiBhbm90aGVyIHR5cGUpOiAke25vblN0YW5kYXJkQWdlUHJvdmlkZXJOYW1lcy5qb2luKCcsICcpfWA7XG4gICAgfVxuICAgIGNvbnN0IHByb2ZpbGVzV2l0aFByb3ZpZGVycyA9IE9iamVjdC5lbnRyaWVzKHNldHRpbmdzLnByb2ZpbGVzID8/IHt9KVxuICAgICAgLmZpbHRlcigoWywgcHJvZmlsZV0pID0+IHByb2ZpbGU/LnByb3ZpZGVycylcbiAgICAgIC5tYXAoKFtuYW1lXSkgPT4gbmFtZSk7XG4gICAgaWYgKHByb2ZpbGVzV2l0aFByb3ZpZGVycy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gYGRlY2xhcmVzIHVuc3VwcG9ydGVkIHByb2ZpbGUtc3BlY2lmaWMgcHJvdmlkZXJzOiAke3Byb2ZpbGVzV2l0aFByb3ZpZGVycy5qb2luKCcsICcpfWA7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiAnY2Fubm90IGJlIHBhcnNlZCBhcyBUT01MJztcbiAgfVxufVxuXG4vKipcbiAqIFJlYWRzIHRoZSBbcHJvdmlkZXJzLmFnZV0ucmVjaXBpZW50cyBvZiBhIGZub3gudG9tbCwgb3IgdW5kZWZpbmVkIHdoZW4gdGhlIGNvbmZpZyBkZWNsYXJlcyBub1xuICogYWdlIHByb3ZpZGVyIChuZXN0ZWQgY29uZmlncyB0aGVuIGluaGVyaXQgdGhlIHJvb3Qgb25lKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRGbm94QWdlUmVjaXBpZW50cyhmbm94VG9tbENvbnRlbnQ6IHN0cmluZyk6IFNldDxzdHJpbmc+IHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzZXR0aW5ncyA9IEJ1bi5UT01MLnBhcnNlKGZub3hUb21sQ29udGVudCkgYXMgRm5veFRvbWw7XG4gICAgaWYgKCFzZXR0aW5ncy5wcm92aWRlcnM/LmFnZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCByZWNpcGllbnRzID0gc2V0dGluZ3MucHJvdmlkZXJzLmFnZS5yZWNpcGllbnRzO1xuICAgIHJldHVybiBuZXcgU2V0KEFycmF5LmlzQXJyYXkocmVjaXBpZW50cykgPyByZWNpcGllbnRzLmZpbHRlcigocik6IHIgaXMgc3RyaW5nID0+IHR5cGVvZiByID09PSAnc3RyaW5nJykgOiBbXSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIEFuIHVucGFyc2FibGUgZm5veC50b21sIHlpZWxkcyBubyByZWNpcGllbnRzLCBzbyB0aGUgY2FsbGVyIHJlcG9ydHMgYW4gZXJyb3IuXG4gICAgcmV0dXJuIG5ldyBTZXQoKTtcbiAgfVxufVxuXG50eXBlIEZub3hSZXBvc2l0b3J5SWRlbnRpdHkgPSBQaWNrPFBhY2thZ2VDb25maWcsICdyZXBvQXV0aG9yJyB8ICdyZXBvTmFtZScgfCAnaXNQdWJsaWNSZXBvJyB8ICdpc1JlcG9WaXNpYmlsaXR5S25vd24nPjtcblxuLyoqXG4gKiBUaGUgR2l0SHViIHNlY3JldCBob2xkaW5nIHRoZSBwcml2YXRlIGtleSBvZiB0aGUgQ0kgaWRlbnRpdHkgc2NvcGVkIHRvIHRoZSByZXBvc2l0b3J5LCBvclxuICogdW5kZWZpbmVkIHdoZW4gbm9uZSBpcyAoYW4gdW5rbm93biB2aXNpYmlsaXR5LCBvciBhIHJlcG9zaXRvcnkgbm8gQ0kgc2NvcGUgY292ZXJzKS4gVGhlIHNpbmdsZVxuICogc291cmNlIG9mIHRydXRoIHNoYXJlZCBieSB0aGUgcmVjaXBpZW50IHN5bmMgYW5kIHRoZSB3b3JrZmxvdyBnZW5lcmF0b3IncyBjYWxsZXIgbWFwcGluZ3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlRm5veENpQWdlS2V5U2VjcmV0TmFtZShcbiAgY29uZmlnOiBGbm94UmVwb3NpdG9yeUlkZW50aXR5XG4pOiAnRk5PWF9BR0VfS0VZJyB8ICdQVUJMSUNfRk5PWF9BR0VfS0VZJyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGNpUHJpbmNpcGFsOiBGbm94QWdlUHJpbmNpcGFsIHwgdW5kZWZpbmVkID0gRk5PWF9BR0VfUFJJTkNJUEFMUy5maW5kKFxuICAgIChwcmluY2lwYWw6IEZub3hBZ2VQcmluY2lwYWwpID0+XG4gICAgICBwcmluY2lwYWwuY2lBZ2VLZXlTZWNyZXROYW1lICYmIG1hdGNoZXNGbm94UmVwb3NpdG9yeVNjb3BlKHByaW5jaXBhbC5yZXBvc2l0b3J5U2NvcGUsIGNvbmZpZylcbiAgKTtcbiAgcmV0dXJuIGNpUHJpbmNpcGFsPy5jaUFnZUtleVNlY3JldE5hbWU7XG59XG5cbi8qKiBXaGV0aGVyIHRoZSByZWNpcGllbnQgc2V0IGRpZmZlcnMgYmV0d2VlbiB0aGUgcHVibGljIGFuZCBwcml2YXRlIHJlYWRpbmcgb2YgdGhlIHJlcG9zaXRvcnkuICovXG5leHBvcnQgZnVuY3Rpb24gZG9lc0Zub3hSZWNpcGllbnRTZXREZXBlbmRPblZpc2liaWxpdHkoXG4gIHJvb3RDb25maWc6IFBpY2s8UGFja2FnZUNvbmZpZywgJ3JlcG9BdXRob3InIHwgJ3JlcG9OYW1lJz5cbik6IGJvb2xlYW4ge1xuICBjb25zdCBwdWJsaWNLZXlzRm9yID0gKGlzUHVibGljUmVwbzogYm9vbGVhbik6IHN0cmluZyA9PlxuICAgIGdldEZub3hBZ2VSZWNpcGllbnRzKHsgLi4ucm9vdENvbmZpZywgaXNQdWJsaWNSZXBvLCBpc1JlcG9WaXNpYmlsaXR5S25vd246IHRydWUgfSlcbiAgICAgIC5tYXAoKHsgcHVibGljS2V5IH0pID0+IHB1YmxpY0tleSlcbiAgICAgIC5qb2luKCdcXG4nKTtcbiAgcmV0dXJuIHB1YmxpY0tleXNGb3IodHJ1ZSkgIT09IHB1YmxpY0tleXNGb3IoZmFsc2UpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm5veEFnZVJlY2lwaWVudHMocm9vdENvbmZpZzogRm5veFJlcG9zaXRvcnlJZGVudGl0eSk6IEZub3hBZ2VSZWNpcGllbnRbXSB7XG4gIHJldHVybiBGTk9YX0FHRV9QUklOQ0lQQUxTLmZpbHRlcigocHJpbmNpcGFsKSA9PlxuICAgIG1hdGNoZXNGbm94UmVwb3NpdG9yeVNjb3BlKHByaW5jaXBhbC5yZXBvc2l0b3J5U2NvcGUsIHJvb3RDb25maWcpXG4gICkuZmxhdE1hcCgocHJpbmNpcGFsKSA9PlxuICAgIHByaW5jaXBhbC5wdWJsaWNLZXlzLm1hcCgocHVibGljS2V5LCBpbmRleCkgPT4gKHtcbiAgICAgIG5hbWU6IHByaW5jaXBhbC5wdWJsaWNLZXlzLmxlbmd0aCA9PT0gMSA/IHByaW5jaXBhbC5uYW1lIDogYCR7cHJpbmNpcGFsLm5hbWV9JHtpbmRleCArIDF9YCxcbiAgICAgIHB1YmxpY0tleSxcbiAgICB9KSlcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1hdGNoZXNGbm94UmVwb3NpdG9yeVNjb3BlKHNjb3BlOiBGbm94UmVwb3NpdG9yeVNjb3BlLCByZXBvc2l0b3J5OiBGbm94UmVwb3NpdG9yeUlkZW50aXR5KTogYm9vbGVhbiB7XG4gIGNvbnN0IG93bmVyID0gcmVwb3NpdG9yeS5yZXBvQXV0aG9yPy50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBuYW1lID0gcmVwb3NpdG9yeS5yZXBvTmFtZT8udG9Mb3dlckNhc2UoKTtcbiAgaWYgKCFvd25lciB8fCAhbmFtZSkgcmV0dXJuIGZhbHNlO1xuXG4gIC8vIEFuIHVua25vd24gdmlzaWJpbGl0eSAoZmFpbGVkIEdpdEh1YiBsb29rdXApIG1hdGNoZXMgbm8gdmlzaWJpbGl0eS1jb25zdHJhaW5lZCBzY29wZTogY2FsbGVyc1xuICAvLyB0aGF0IHdvdWxkIHJld3JpdGUgcmVjaXBpZW50cyBmYWlsIGluc3RlYWQgb2YgZW5jcnlwdGluZyB0byB0aGUgd3JvbmcgQ0kgaWRlbnRpdHkuXG4gIGlmIChcbiAgICBzY29wZS52aXNpYmlsaXR5ICYmXG4gICAgKCFyZXBvc2l0b3J5LmlzUmVwb1Zpc2liaWxpdHlLbm93biB8fCAoc2NvcGUudmlzaWJpbGl0eSA9PT0gJ3B1YmxpYycpICE9PSByZXBvc2l0b3J5LmlzUHVibGljUmVwbylcbiAgKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIChcbiAgICAoc2NvcGUub3JnYW5pemF0aW9ucz8uc29tZSgob3JnYW5pemF0aW9uKSA9PiBvcmdhbml6YXRpb24udG9Mb3dlckNhc2UoKSA9PT0gb3duZXIpID8/IGZhbHNlKSB8fFxuICAgIChzY29wZS5yZXBvc2l0b3JpZXM/LnNvbWUoKGZ1bGxOYW1lKSA9PiBmdWxsTmFtZS50b0xvd2VyQ2FzZSgpID09PSBgJHtvd25lcn0vJHtuYW1lfWApID8/IGZhbHNlKVxuICApO1xufVxuXG5mdW5jdGlvbiByZXBsYWNlQWdlUmVjaXBpZW50cyhjb250ZW50OiBzdHJpbmcsIGFnZVJlY2lwaWVudHM6IHJlYWRvbmx5IEZub3hBZ2VSZWNpcGllbnRbXSk6IHN0cmluZyB7XG4gIC8vIFRyYWlsaW5nIG5hbWUgY29tbWVudHMgbGV0IGh1bWFucyB0ZWxsIHdob3NlIGtleSBlYWNoIHJlY2lwaWVudCBpcyB3aXRob3V0IGNvbnN1bHRpbmcgd2JmeS5cbiAgY29uc3QgcmVjaXBpZW50c1RleHQgPSBgcmVjaXBpZW50cyA9IFtcXG4ke2FnZVJlY2lwaWVudHNcbiAgICAubWFwKChyZWNpcGllbnQpID0+IGAgIFwiJHtyZWNpcGllbnQucHVibGljS2V5fVwiLCAjICR7cmVjaXBpZW50Lm5hbWV9YClcbiAgICAuam9pbignXFxuJyl9XFxuXWA7XG4gIC8vIHdiZnkgd3JpdGVzIGEgW3Byb3ZpZGVycy5hZ2VdIHRhYmxlIChwb3NzaWJseSB3aXRoIGEgdHJhaWxpbmcgY29tbWVudCkuIFNjYW4gbGluZS13aXNlIHNvIHRoYXRcbiAgLy8gYSBgW2AgaW5zaWRlIGEgY29tbWVudCBvciBhIHN0cmluZyBuZXZlciB0ZXJtaW5hdGVzIHRoZSB0YWJsZSBlYXJseTsgdGhlIHRhYmxlIGVuZHMgYXQgdGhlXG4gIC8vIG5leHQgbGluZS1zdGFydCB0YWJsZSBoZWFkZXIuIFRoZSBhc3NpZ25tZW50IG1hdGNoIGlzIGxpbmUtYW5jaG9yZWQgc28gYSBjb21tZW50ZWQtb3V0XG4gIC8vIGAjIHJlY2lwaWVudHMgPSBbLi4uXWAgaXMgbmV2ZXIgbWlzdGFrZW4gZm9yIHRoZSByZWFsIG9uZSwgd2hpbGUgbXVsdGlsaW5lIGFycmF5cyBzdGlsbCBtYXRjaFxuICAvLyBiZWNhdXNlIHRoZSBuZWdhdGVkIGNsYXNzIFteXFxdXSAodW5saWtlIGAuYCkgc3BhbnMgbmV3bGluZXMuIEFueSBvdGhlciBzcGVsbGluZyBmYWxscyB0aHJvdWdoXG4gIC8vIHRvIHRoZSBjYWxsZXIncyByZS1wYXJzZSB2YWxpZGF0aW9uLCB3aGljaCBmYWlscyB0aGUgcnVuIHNhZmVseSB3aXRoIGluc3RydWN0aW9ucyBpbnN0ZWFkIG9mXG4gIC8vIGNvcnJ1cHRpbmcgdGhlIGZpbGUuXG4gIGNvbnN0IGxpbmVzID0gY29udGVudC5zcGxpdCgnXFxuJyk7XG4gIGNvbnN0IGhlYWRlckluZGV4ID0gbGluZXMuZmluZEluZGV4KChsaW5lKSA9PiAvXlxccypcXFtwcm92aWRlcnNcXC5hZ2VcXF1cXHMqKD86Iy4qKT8kL3UudGVzdChsaW5lKSk7XG4gIGlmIChoZWFkZXJJbmRleCAhPT0gLTEpIHtcbiAgICBsZXQgZW5kSW5kZXggPSBsaW5lcy5sZW5ndGg7XG4gICAgZm9yIChsZXQgaW5kZXggPSBoZWFkZXJJbmRleCArIDE7IGluZGV4IDwgbGluZXMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICBpZiAoL15cXHMqXFxbL3UudGVzdChsaW5lc1tpbmRleF0gPz8gJycpKSB7XG4gICAgICAgIGVuZEluZGV4ID0gaW5kZXg7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBzZWN0aW9uID0gbGluZXMuc2xpY2UoaGVhZGVySW5kZXgsIGVuZEluZGV4KS5qb2luKCdcXG4nKTtcbiAgICBjb25zdCByZXBsYWNlZFNlY3Rpb24gPSBzZWN0aW9uLnJlcGxhY2UoL15cXHMqcmVjaXBpZW50c1xccyo9XFxzKlxcW1teXFxdXSpcXF0vbXUsIHJlY2lwaWVudHNUZXh0KTtcbiAgICBjb25zdCBuZXdTZWN0aW9uID1cbiAgICAgIHJlcGxhY2VkU2VjdGlvbiA9PT0gc2VjdGlvblxuICAgICAgICA/IFtsaW5lc1toZWFkZXJJbmRleF0sIHJlY2lwaWVudHNUZXh0LCAuLi5saW5lcy5zbGljZShoZWFkZXJJbmRleCArIDEsIGVuZEluZGV4KV0uam9pbignXFxuJylcbiAgICAgICAgOiByZXBsYWNlZFNlY3Rpb247XG4gICAgcmV0dXJuIFsuLi5saW5lcy5zbGljZSgwLCBoZWFkZXJJbmRleCksIG5ld1NlY3Rpb24sIC4uLmxpbmVzLnNsaWNlKGVuZEluZGV4KV0uam9pbignXFxuJyk7XG4gIH1cbiAgcmV0dXJuIGAke2NvbnRlbnQudHJpbUVuZCgpfVxcblxcbltwcm92aWRlcnMuYWdlXVxcbnR5cGUgPSBcImFnZVwiXFxuJHtyZWNpcGllbnRzVGV4dH1cXG5gO1xufVxuXG4vLyBSZS1lbmNyeXB0cyB0aGUgYmFzZSBzZWNyZXRzIGFuZCBlYWNoIHByb2ZpbGUncyBvd24gc2VjcmV0cyAoLS1uby1kZWZhdWx0cyBrZWVwcyB0aGUgbWVyZ2VkXG4vLyBiYXNlIHNlY3JldHMgZnJvbSBiZWluZyBkdXBsaWNhdGVkIGludG8gcHJvZmlsZSB0YWJsZXMpIGZvciB0aGUgY3VycmVudCByZWNpcGllbnQgc2V0LiBUaGVcbi8vIHNwYXduZWQgZm5veCBydW5zIHdpdGggYW4gaXNvbGF0ZWQgSE9NRS9YREdfQ09ORklHX0hPTUUgYmVjYXVzZSBmbm94IG1lcmdlcyB0aGUgdXNlci1nbG9iYWxcbi8vIH4vLmNvbmZpZy9mbm94L2NvbmZpZy50b21sIGludG8gZXZlcnkgcHJvamVjdCBjb25maWcg4oCUIGEgcGxhaW4gcmVlbmNyeXB0IHdvdWxkIHJld3JpdGUgdGhlXG4vLyB1c2VyJ3MgZ2xvYmFsIHNlY3JldHMgdG9vLiBEZWNyeXB0aW9uIHRoZXJlZm9yZSBuZWVkcyB0aGUgcGVyc29uYWwgaWRlbnRpdHkgcGFzc2VkIGV4cGxpY2l0bHlcbi8vIHZpYSBGTk9YX0FHRV9LRVk7IEZOT1hfUFJPRklMRSBpcyBzdHJpcHBlZCBzbyBpdCBjYW5ub3QgcmVkaXJlY3QgdGhlIGJhc2UgKG5vIC1QKSBydW4uXG5mdW5jdGlvbiByZWVuY3J5cHRGbm94U2VjcmV0cyhkaXJQYXRoOiBzdHJpbmcsIHJvb3REaXJQYXRoOiBzdHJpbmcsIHByb2ZpbGVOYW1lczogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgLy8gVGhlIGlkZW50aXR5IGlzIG9wdGlvbmFsOiBhIHBsYWludGV4dC1vbmx5IGNvbmZpZyBoYXMgbm90aGluZyB0byBkZWNyeXB0IGFuZCBmbm94IHN1Y2NlZWRzXG4gIC8vIHdpdGhvdXQgb25lLCB3aGlsZSBleGlzdGluZyBjaXBoZXJ0ZXh0cyBtYWtlIGZub3ggZmFpbCBsb3VkbHkgb24gaXRzIG93bi5cbiAgY29uc3QgaWRlbnRpdHkgPSByZWFkUGVyc29uYWxBZ2VTZWNyZXRLZXkoKSA/PyBwcm9jZXNzLmVudi5GTk9YX0FHRV9LRVk7XG4gIGNvbnN0IGZub3hDb21tYW5kID0gcmVzb2x2ZUZub3hDb21tYW5kKGRpclBhdGgpO1xuICBjb25zdCBpc29sYXRlZEhvbWVEaXJQYXRoID0gZnMubWtkdGVtcFN5bmMocGF0aC5qb2luKG9zLnRtcGRpcigpLCAnd2JmeS1mbm94LWhvbWUtJykpO1xuICB0cnkge1xuICAgIC8vIEhpZGUgdGhlIGxvY2FsIG92ZXJyaWRlcyBvZiBFVkVSWSBkaXJlY3RvcnkgZm5veCBtZXJnZXMgaGllcmFyY2hpY2FsbHkgKGZyb20gdGhlIGNvbW1hbmRcbiAgICAvLyBkaXJlY3RvcnkgdXAgdG8gdGhlIHJlcG9zaXRvcnkgcm9vdCk6IGFuIGFuY2VzdG9yJ3MgZm5veC5sb2NhbC50b21sIHdvdWxkIG90aGVyd2lzZSBzaGFkb3dcbiAgICAvLyBjb21taXR0ZWQgc2VjcmV0cyBvciBpdHNlbGYgZ2V0IHJld3JpdHRlbiBieSB0aGUgcmUtZW5jcnlwdGlvbi5cbiAgICByZXR1cm4gd2l0aEZub3hMb2NhbHNIaWRkZW4ocm9vdERpclBhdGgsIGxpc3RBbmNlc3RvckRpclBhdGhzKGRpclBhdGgsIHJvb3REaXJQYXRoKSwgKCkgPT4ge1xuICAgICAgY29uc3QgZW52ID0ge1xuICAgICAgICAuLi5PYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMocHJvY2Vzcy5lbnYpLmZpbHRlcigoW2tleV0pID0+ICFrZXkuc3RhcnRzV2l0aCgnRk5PWF8nKSkpLFxuICAgICAgICAuLi4oaWRlbnRpdHkgPyB7IEZOT1hfQUdFX0tFWTogaWRlbnRpdHkgfSA6IHt9KSxcbiAgICAgICAgSE9NRTogaXNvbGF0ZWRIb21lRGlyUGF0aCxcbiAgICAgICAgWERHX0NPTkZJR19IT01FOiBpc29sYXRlZEhvbWVEaXJQYXRoLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHByb2ZpbGVBcmdzTGlzdCA9IFtbXSwgLi4ucHJvZmlsZU5hbWVzLm1hcCgobmFtZSkgPT4gWyctLW5vLWRlZmF1bHRzJywgYC0tcHJvZmlsZT0ke25hbWV9YF0pXTtcbiAgICAgIGZvciAoY29uc3QgcHJvZmlsZUFyZ3Mgb2YgcHJvZmlsZUFyZ3NMaXN0KSB7XG4gICAgICAgIGNvbnN0IGFyZ3MgPSBbJ3JlZW5jcnlwdCcsICctLWZvcmNlJywgJy0tbm8tZGFlbW9uJywgJy0tcHJvdmlkZXInLCAnYWdlJywgLi4ucHJvZmlsZUFyZ3NdO1xuICAgICAgICBjb25zb2xlLmxvZyhgJCAke2Zub3hDb21tYW5kfSAke2FyZ3Muam9pbignICcpfSBhdCAke2RpclBhdGh9YCk7XG4gICAgICAgIGNvbnN0IHByb2MgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhmbm94Q29tbWFuZCwgYXJncywge1xuICAgICAgICAgIGN3ZDogZGlyUGF0aCxcbiAgICAgICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgICAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgICAgICAgZW52LFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKChwcm9jLnN0YXR1cyA/PyAxKSAhPT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG4gIH0gZmluYWxseSB7XG4gICAgZnMucm1TeW5jKGlzb2xhdGVkSG9tZURpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgfVxufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBhY3R1YWwgZm5veCBiaW5hcnkuIGBmbm94YCBvbiBQQVRIIGlzIG9mdGVuIGEgbWlzZSBzaGltLCBhbmQgbWlzZSByZWZ1c2VzIHRvIHJ1blxuICogb25jZSBIT01FL1hER19DT05GSUdfSE9NRSBwb2ludCBhdCB0aGUgaXNvbGF0ZWQgZGlyZWN0b3J5IChpdHMgdHJ1c3Qgc3RhdGUgZGlzYXBwZWFycyksIHNvIHRoZVxuICogaXNvbGF0ZWQgc3Bhd25zIG5lZWQgdGhlIHNoaW0gcmVzb2x2ZWQgdG8gdGhlIHJlYWwgZXhlY3V0YWJsZSBiZWZvcmVoYW5kLlxuICovXG5mdW5jdGlvbiByZXNvbHZlRm5veENvbW1hbmQoZGlyUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcHJvYyA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKCdtaXNlJywgWyd3aGljaCcsICdmbm94J10sIHsgY3dkOiBkaXJQYXRoLCBlbmNvZGluZzogJ3V0ZjgnLCBzdGRpbzogJ3BpcGUnIH0pO1xuICBjb25zdCByZXNvbHZlZCA9IHByb2Muc3RhdHVzID09PSAwID8gcHJvYy5zdGRvdXQudHJpbSgpIDogJyc7XG4gIHJldHVybiByZXNvbHZlZCB8fCAnZm5veCc7XG59XG5cbi8vIFRoZSBwZXJzb25hbCBpZGVudGl0eSBmaWxlIGlzIG1hY2hpbmUtZ2xvYmFsLCBzbyBpdCBpcyByZWFkIG9uY2UgcGVyIHByb2Nlc3MuXG5sZXQgaGFzUmVhZFBlcnNvbmFsQWdlU2VjcmV0S2V5ID0gZmFsc2U7XG5sZXQgY2FjaGVkUGVyc29uYWxBZ2VTZWNyZXRLZXk6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuZnVuY3Rpb24gcmVhZFBlcnNvbmFsQWdlU2VjcmV0S2V5KCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChoYXNSZWFkUGVyc29uYWxBZ2VTZWNyZXRLZXkpIHJldHVybiBjYWNoZWRQZXJzb25hbEFnZVNlY3JldEtleTtcbiAgaGFzUmVhZFBlcnNvbmFsQWdlU2VjcmV0S2V5ID0gdHJ1ZTtcbiAgdHJ5IHtcbiAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihvcy5ob21lZGlyKCksICcuY29uZmlnJywgJ2Zub3gnLCAnYWdlLnR4dCcpLCAndXRmOCcpO1xuICAgIGNhY2hlZFBlcnNvbmFsQWdlU2VjcmV0S2V5ID0gY29udGVudFxuICAgICAgLnNwbGl0KCdcXG4nKVxuICAgICAgLmZpbmQoKGxpbmUpID0+IGxpbmUudHJpbSgpLnN0YXJ0c1dpdGgoJ0FHRS1TRUNSRVQtS0VZLScpKVxuICAgICAgPy50cmltKCk7XG4gIH0gY2F0Y2gge1xuICAgIGNhY2hlZFBlcnNvbmFsQWdlU2VjcmV0S2V5ID0gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiBjYWNoZWRQZXJzb25hbEFnZVNlY3JldEtleTtcbn1cblxuLyoqXG4gKiBSdW5zIGEgZnVuY3Rpb24gd2hpbGUgdGhlIG1hY2hpbmUtbG9jYWwgZm5veC5sb2NhbC50b21sIGZpbGVzIG9mIHRoZSBnaXZlbiBkaXJlY3RvcmllcyBhcmVcbiAqIHRlbXBvcmFyaWx5IG1vdmVkIGFzaWRlOiBmbm94IGxvYWRzIHRoZW0gYXQgaGlnaGVyIHByaW9yaXR5IHRoYW4gdGhlIGNvbW1pdHRlZCBmbm94LnRvbWwsIHNvIGFcbiAqIGxvY2FsIG92ZXJyaWRlIHNoYWRvd2luZyBhIGNvbW1pdHRlZCBzZWNyZXQgd291bGQgbWFrZSBgZm5veCByZWVuY3J5cHRgIHNraXAgdGhhdCBzZWNyZXQuXG4gKi9cbmZ1bmN0aW9uIHdpdGhGbm94TG9jYWxzSGlkZGVuPFQ+KHJvb3REaXJQYXRoOiBzdHJpbmcsIGRpclBhdGhzOiBzdHJpbmdbXSwgZnVuYzogKCkgPT4gVCk6IFQge1xuICBjb25zdCBoaWRkZW5EaXJQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgdHJ5IHtcbiAgICBmb3IgKGNvbnN0IGRpclBhdGggb2YgZGlyUGF0aHMpIHtcbiAgICAgIHJlY292ZXJTdGFsZUZub3hMb2NhbEJhY2t1cChyb290RGlyUGF0aCwgZGlyUGF0aCk7XG4gICAgICBjb25zdCBsb2NhbFBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2Zub3gubG9jYWwudG9tbCcpO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMobG9jYWxQYXRoKSkge1xuICAgICAgICBjb25zdCBiYWNrdXBQYXRoID0gZm5veExvY2FsQmFja3VwUGF0aChyb290RGlyUGF0aCwgZGlyUGF0aCk7XG4gICAgICAgIGVuc3VyZVNhZmVGbm94TG9jYWxCYWNrdXBEaXIocm9vdERpclBhdGgsIGJhY2t1cFBhdGgpO1xuICAgICAgICBmcy5yZW5hbWVTeW5jKGxvY2FsUGF0aCwgYmFja3VwUGF0aCk7XG4gICAgICAgIGhpZGRlbkRpclBhdGhzLnB1c2goZGlyUGF0aCk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IGZ1bmMoKTtcbiAgICAvLyBBIHJlc3RvcmF0aW9uIGNvbmZsaWN0IHRocm93cyBoZXJlIGFuZCB0aGVyZWJ5IGludmFsaWRhdGVzIHRoZSBzZWVtaW5nbHkgc3VjY2Vzc2Z1bCByZXN1bHQ6XG4gICAgLy8gYSByZWNyZWF0ZWQgb3ZlcnJpZGUgbWF5IGhhdmUgc2hhZG93ZWQgY29tbWl0dGVkIHNlY3JldHMgZHVyaW5nIHRoZSBmbm94IHJ1biwgc28gdGhlIG91dGVyXG4gICAgLy8gdHJhbnNhY3Rpb24gbXVzdCByZXN0b3JlIGV2ZXJ5IGNvbW1pdHRlZCBmbm94LnRvbWwgaW5zdGVhZCBvZiBjb21taXR0aW5nIHRoZSBtaWdyYXRpb24uXG4gICAgcmVzdG9yZUhpZGRlbkZub3hMb2NhbHMocm9vdERpclBhdGgsIGhpZGRlbkRpclBhdGhzKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vIFRoZSBvcmlnaW5hbCBmYWlsdXJlIG11c3Qgd2luOyBhIHJlc3RvcmF0aW9uIGNvbmZsaWN0IG9uIHRoaXMgcGF0aCBpcyBvbmx5IHJlcG9ydGVkIHNvIGl0XG4gICAgLy8gY2Fubm90IG1hc2sgdGhlIHJvb3QgY2F1c2UuXG4gICAgdHJ5IHtcbiAgICAgIHJlc3RvcmVIaWRkZW5Gbm94TG9jYWxzKHJvb3REaXJQYXRoLCBoaWRkZW5EaXJQYXRocyk7XG4gICAgfSBjYXRjaCAocmVzdG9yZUVycm9yKSB7XG4gICAgICBmYWlsRm5veFN5bmMoKHJlc3RvcmVFcnJvciBhcyBFcnJvciB8IHVuZGVmaW5lZCk/Lm1lc3NhZ2UgPz8gU3RyaW5nKHJlc3RvcmVFcnJvcikpO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG4vLyBNb3ZlcyB0aGUgaGlkZGVuIGZub3gubG9jYWwudG9tbCBmaWxlcyBiYWNrLCBjbGVhcmluZyB0aGUgZ2l2ZW4gbGlzdCBzbyBhIHNlY29uZCBjYWxsIGlzIGFcbi8vIG5vLW9wLiBOZXZlciBjbG9iYmVycyBhIGZub3gubG9jYWwudG9tbCByZWNyZWF0ZWQgKGUuZy4gYnkgYW4gZWRpdG9yKSB3aGlsZSBmbm94IHdhcyBydW5uaW5nOlxuLy8gdGhlIGJhY2t1cCBpcyBrZXB0IGFuZCByZXBvcnRlZCBmb3IgYSBtYW51YWwgbWVyZ2UuXG5mdW5jdGlvbiByZXN0b3JlSGlkZGVuRm5veExvY2Fscyhyb290RGlyUGF0aDogc3RyaW5nLCBoaWRkZW5EaXJQYXRoczogc3RyaW5nW10pOiB2b2lkIHtcbiAgY29uc3QgY29uZmxpY3RpbmdMb2NhbFBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGRpclBhdGggb2YgaGlkZGVuRGlyUGF0aHMuc3BsaWNlKDApKSB7XG4gICAgY29uc3QgbG9jYWxQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdmbm94LmxvY2FsLnRvbWwnKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhsb2NhbFBhdGgpKSB7XG4gICAgICBjb25mbGljdGluZ0xvY2FsUGF0aHMucHVzaChsb2NhbFBhdGgpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGZzLnJlbmFtZVN5bmMoZm5veExvY2FsQmFja3VwUGF0aChyb290RGlyUGF0aCwgZGlyUGF0aCksIGxvY2FsUGF0aCk7XG4gIH1cbiAgaWYgKGNvbmZsaWN0aW5nTG9jYWxQYXRocy5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFRoZSBmb2xsb3dpbmcgZm5veC5sb2NhbC50b21sIGZpbGVzIHdlcmUgcmVjcmVhdGVkIHdoaWxlIGZub3ggd2FzIHJ1bm5pbmcgKG9yaWdpbmFsIGZpbGVzIGFyZSBwcmVzZXJ2ZWQgdW5kZXIgJHtwYXRoLnJlc29sdmUocm9vdERpclBhdGgsICcudG1wJywgJ3diZnktZm5veC1sb2NhbC1iYWNrdXAnKX0g4oCUIG1lcmdlIHRoZW0gbWFudWFsbHkpOiAke2NvbmZsaWN0aW5nTG9jYWxQYXRocy5qb2luKCcsICcpfWBcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogUmVzdG9yZXMgYSBmbm94LmxvY2FsLnRvbWwgYmFja3VwIGxlZnQgYnkgYW4gaW50ZXJydXB0ZWQgZWFybGllciBydW4gc28gdGhlIHVzZXIncyBsb2NhbFxuICogb3ZlcnJpZGVzIGFyZSBuZXZlciBzaWxlbnRseSBsb3N0LlxuICovXG5mdW5jdGlvbiByZWNvdmVyU3RhbGVGbm94TG9jYWxCYWNrdXAocm9vdERpclBhdGg6IHN0cmluZywgZGlyUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGxvY2FsUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnZm5veC5sb2NhbC50b21sJyk7XG4gIGNvbnN0IGJhY2t1cFBhdGggPSBmbm94TG9jYWxCYWNrdXBQYXRoKHJvb3REaXJQYXRoLCBkaXJQYXRoKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGJhY2t1cFBhdGgpKSByZXR1cm47XG4gIGlmIChmcy5leGlzdHNTeW5jKGxvY2FsUGF0aCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEJvdGggJHtsb2NhbFBhdGh9IGFuZCBpdHMgYmFja3VwICR7YmFja3VwUGF0aH0gZXhpc3Q7IHJlc29sdmUgdGhlIGxlZnRvdmVyIGJhY2t1cCBtYW51YWxseS5gKTtcbiAgfVxuICBlbnN1cmVTYWZlRm5veExvY2FsQmFja3VwRGlyKHJvb3REaXJQYXRoLCBiYWNrdXBQYXRoKTtcbiAgZnMucmVuYW1lU3luYyhiYWNrdXBQYXRoLCBsb2NhbFBhdGgpO1xufVxuXG4vLyBDcmVhdGVzIHRoZSBiYWNrdXAgZGlyZWN0b3J5IGFuZCBwcm92ZXMgbm8gcGF0aCBjb21wb25lbnQgYmVsb3cgdGhlIHJlcG9zaXRvcnkgcm9vdCBpcyBhXG4vLyBzeW1saW5rOiBhIHJlcG9zaXRvcnktY29udHJvbGxlZCBzeW1saW5rIChlLmcuIGEgdHJhY2tlZCAudG1wL3diZnktZm5veC1sb2NhbC1iYWNrdXAgbGluaylcbi8vIGNvdWxkIG90aGVyd2lzZSBtb3ZlIHRoZSBwbGFpbnRleHQgbG9jYWwgc2VjcmV0cyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LCBvciByZXNvbHZlIHRoZSBiYWNrdXBcbi8vIGJhY2sgb250byB0aGUgc291cmNlIGZpbGUgYW5kIHR1cm4gdGhlIGhpZGUgcmVuYW1lIGludG8gYSBuby1vcC5cbmZ1bmN0aW9uIGVuc3VyZVNhZmVGbm94TG9jYWxCYWNrdXBEaXIocm9vdERpclBhdGg6IHN0cmluZywgYmFja3VwUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGJhY2t1cERpclBhdGggPSBwYXRoLmRpcm5hbWUoYmFja3VwUGF0aCk7XG4gIGZzLm1rZGlyU3luYyhiYWNrdXBEaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgY29uc3QgZXhwZWN0ZWRSZWFsUGF0aCA9IHBhdGguam9pbihmcy5yZWFscGF0aFN5bmMocm9vdERpclBhdGgpLCBwYXRoLnJlbGF0aXZlKHJvb3REaXJQYXRoLCBiYWNrdXBEaXJQYXRoKSk7XG4gIGlmIChmcy5yZWFscGF0aFN5bmMoYmFja3VwRGlyUGF0aCkgIT09IGV4cGVjdGVkUmVhbFBhdGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7YmFja3VwRGlyUGF0aH0gcmVzb2x2ZXMgdGhyb3VnaCBhIHN5bWxpbms7IHJlbW92ZSB0aGUgc3ltbGlua2VkIGNvbXBvbmVudC5gKTtcbiAgfVxufVxuXG4vLyBUaGUgYmFja3VwIGxpdmVzIHVuZGVyIHRoZSBnaXRpZ25vcmVkIC50bXAgc28gYSBoaWRkZW4gZm5veC5sb2NhbC50b21sIGNhbiBuZXZlciBiZWNvbWVcbi8vIHN0YWdlYWJsZSAoYSBzaWJsaW5nIHJlbmFtZSBsaWtlIGZub3gubG9jYWwudG9tbC53YmZ5LWJhayB3b3VsZCBubyBsb25nZXIgbWF0Y2ggdGhlIGRvY3VtZW50ZWRcbi8vIGBmbm94LmxvY2FsLnRvbWxgIGlnbm9yZSBlbnRyeSBhbmQgY291bGQgYmUgY29tbWl0dGVkIGJ5IGBnaXQgYWRkIC1BYCkuXG5mdW5jdGlvbiBmbm94TG9jYWxCYWNrdXBQYXRoKHJvb3REaXJQYXRoOiBzdHJpbmcsIGRpclBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBwYXRoLnJlc29sdmUoXG4gICAgcm9vdERpclBhdGgsXG4gICAgJy50bXAnLFxuICAgICd3YmZ5LWZub3gtbG9jYWwtYmFja3VwJyxcbiAgICBwYXRoLnJlbGF0aXZlKHJvb3REaXJQYXRoLCBkaXJQYXRoKSxcbiAgICAnZm5veC5sb2NhbC50b21sJ1xuICApO1xufVxuXG5mdW5jdGlvbiB3cml0ZU1pZ3JhdGlvbk1hcmtlcigpOiB2b2lkIHtcbiAgaWYgKCFtaWdyYXRpb25NYXJrZXJQYXRoIHx8IG1pZ3JhdGlvbk1hcmtlck93bmVkKSByZXR1cm47XG4gIGNvbnN0IHRtcERpclBhdGggPSBwYXRoLmRpcm5hbWUobWlncmF0aW9uTWFya2VyUGF0aCk7XG4gIGZzLm1rZGlyU3luYyh0bXBEaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgLy8gUmVmdXNlIHRvIHdyaXRlIHRocm91Z2ggc3ltbGlua3M6IGEgcmVwb3NpdG9yeS1jb250cm9sbGVkIC50bXAgc3ltbGluayBjb3VsZCBvdGhlcndpc2VcbiAgLy8gcmVkaXJlY3QgdGhlIG1hcmtlciB3cml0ZSBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LiBUaGUgYHd4YCBmbGFnIG1ha2VzIHRoZSBvcGVuIGl0c2VsZiBmYWlsXG4gIC8vIG9uIGFueSBwcmUtZXhpc3RpbmcgcGF0aCwgaW5jbHVkaW5nIGEgZGFuZ2xpbmcgc3ltbGluayDigJQgd2hpY2ggYWxzbyBhY3F1aXJlcyB0aGUgbWFya2VyXG4gIC8vIGF0b21pY2FsbHksIHNvIGEgY29uY3VycmVudCB3YmZ5IHJ1biBjYW5ub3Qgc3RhcnQgYSBzZWNvbmQgbWlncmF0aW9uLlxuICBpZiAoZnMubHN0YXRTeW5jKHRtcERpclBhdGgpLmlzU3ltYm9saWNMaW5rKCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dG1wRGlyUGF0aH0gaXMgYSBzeW1saW5rOyByZXBsYWNlIGl0IHdpdGggYSByZWd1bGFyIGRpcmVjdG9yeS5gKTtcbiAgfVxuICB0cnkge1xuICAgIGZzLndyaXRlRmlsZVN5bmMoXG4gICAgICBtaWdyYXRpb25NYXJrZXJQYXRoLFxuICAgICAgJ3diZnkgZm5veCBtaWdyYXRpb24gaW4gcHJvZ3Jlc3M7IGEgbGVmdG92ZXIgbWFya2VyIGJsb2NrcyBuZXcgbWlncmF0aW9uc1xcbicsXG4gICAgICB7XG4gICAgICAgIGZsYWc6ICd3eCcsXG4gICAgICB9XG4gICAgKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEFub3RoZXIgd2JmeSBwcm9jZXNzIGFwcGVhcnMgdG8gYmUgbWlncmF0aW5nICgke21pZ3JhdGlvbk1hcmtlclBhdGh9IGV4aXN0cyk6ICR7ZXJyb3J9YCk7XG4gIH1cbiAgbWlncmF0aW9uTWFya2VyT3duZWQgPSB0cnVlO1xufVxuXG4vLyBPbmx5IHRoZSBydW4gdGhhdCBhY3F1aXJlZCB0aGUgbWFya2VyIG1heSByZW1vdmUgaXQ6IGRlbGV0aW5nIGEgZm9yZWlnbiBtYXJrZXIgd291bGQgZGlzYWJsZVxuLy8gaW50ZXJydXB0ZWQtbWlncmF0aW9uIGRldGVjdGlvbiBmb3IgYSBjb25jdXJyZW50bHkgcnVubmluZyB3YmZ5LlxuZnVuY3Rpb24gcmVtb3ZlT3duZWRNaWdyYXRpb25NYXJrZXIoKTogdm9pZCB7XG4gIGlmICghbWlncmF0aW9uTWFya2VyT3duZWQgfHwgIW1pZ3JhdGlvbk1hcmtlclBhdGgpIHJldHVybjtcbiAgZnMucm1TeW5jKG1pZ3JhdGlvbk1hcmtlclBhdGgsIHsgZm9yY2U6IHRydWUgfSk7XG4gIG1pZ3JhdGlvbk1hcmtlck93bmVkID0gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHJlc3RvcmVTbmFwc2hvdHMoc25hcHNob3RzOiBNYXA8c3RyaW5nLCBzdHJpbmc+KTogYm9vbGVhbiB7XG4gIGxldCBzdWNjZWVkZWQgPSB0cnVlO1xuICBmb3IgKGNvbnN0IFtmaWxlUGF0aCwgY29udGVudF0gb2Ygc25hcHNob3RzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMoZmlsZVBhdGgsIGNvbnRlbnQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBmYWlsRm5veFN5bmMoYEZhaWxlZCB0byByZXN0b3JlICR7ZmlsZVBhdGh9IGFmdGVyIGEgZmFpbGVkIG1pZ3JhdGlvbjogJHtlcnJvcn1gKTtcbiAgICAgIHN1Y2NlZWRlZCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc3VjY2VlZGVkO1xufVxuXG5mdW5jdGlvbiBmYWlsRm5veFN5bmMobWVzc2FnZTogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7XG4gIHByb2Nlc3MuZXhpdENvZGUgPSAxO1xuICBmbm94U3luY0ZhaWxlZCA9IHRydWU7XG59XG5cbi8vIFJldHVybnMgYSBkZXNjcmlwdGlvbiBvZiBhbiB1bnN1cHBvcnRlZCBmbm94LmxvY2FsLnRvbWwgaW4gdGhlIGRpcmVjdG9yeSwgb3IgdW5kZWZpbmVkLiBMb2NhbFxuLy8gb3ZlcnJpZGVzIG1heSBvbmx5IGhvbGQgbWFjaGluZS1sb2NhbCBzZWNyZXQgdmFsdWVzOyBpbXBvcnRzIG9yIHByb3ZpZGVyIChyZSlkZWZpbml0aW9ucyB3b3VsZFxuLy8gc2lsZW50bHkgY2hhbmdlIHdoaWNoIHJlY2lwaWVudCBzZXQgZ292ZXJucyByZS1lbmNyeXB0aW9uLlxuZnVuY3Rpb24gZmluZEZub3hMb2NhbFRvbWxJc3N1ZShkaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBsb2NhbFRvbWxQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdmbm94LmxvY2FsLnRvbWwnKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGxvY2FsVG9tbFBhdGgpKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBsb2NhbFNldHRpbmdzID0gQnVuLlRPTUwucGFyc2UoZnMucmVhZEZpbGVTeW5jKGxvY2FsVG9tbFBhdGgsICd1dGY4JykpIGFzIEZub3hUb21sO1xuICBjb25zdCBkZWZpbmVzUHJvdmlkZXJzID1cbiAgICBsb2NhbFNldHRpbmdzLmltcG9ydCAhPT0gdW5kZWZpbmVkIHx8XG4gICAgbG9jYWxTZXR0aW5ncy5wcm92aWRlcnMgIT09IHVuZGVmaW5lZCB8fFxuICAgIE9iamVjdC52YWx1ZXMobG9jYWxTZXR0aW5ncy5wcm9maWxlcyA/PyB7fSkuc29tZSgocHJvZmlsZSkgPT4gcHJvZmlsZT8ucHJvdmlkZXJzICE9PSB1bmRlZmluZWQpO1xuICByZXR1cm4gZGVmaW5lc1Byb3ZpZGVycyA/IGAke2xvY2FsVG9tbFBhdGh9IGRlZmluZXMgaW1wb3J0cywgcHJvdmlkZXJzLCBvciBwcm9maWxlIHByb3ZpZGVyc2AgOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogTGlzdHMgZXZlcnkgZGlyZWN0b3J5IGNvbnRhaW5pbmcgYSBjb21taXR0ZWQgKG9yIGNvbW1pdHRhYmxlKSBmbm94LnRvbWwgYW1vbmcgdGhlIGdpdmVuXG4gKiBnaXQtZGlzY292ZXJlZCBjb25maWcgcGF0aHMgKHNlZSBsaXN0Rm5veExpa2VGaWxlUGF0aHM6IGdpdC1iYXNlZCBkaXNjb3ZlcnkgZXhjbHVkZXMgZ2l0aWdub3JlZFxuICogdHJlZXMgc3VjaCBhcyBub2RlX21vZHVsZXMgd2l0aG91dCBleGNsdWRpbmcgbGVnaXRpbWF0ZSBwYWNrYWdlcyBuYW1lZCBsaWtlIGJ1aWxkIG91dHB1dHMpLlxuICovXG5mdW5jdGlvbiBsaXN0Rm5veFRvbWxEaXJQYXRocyhmbm94TGlrZUZpbGVQYXRoczogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gIHJldHVybiBbXG4gICAgLi4ubmV3IFNldChcbiAgICAgIGZub3hMaWtlRmlsZVBhdGhzXG4gICAgICAgIC5maWx0ZXIoKGZpbGVQYXRoKSA9PiBwYXRoLmJhc2VuYW1lKGZpbGVQYXRoKSA9PT0gJ2Zub3gudG9tbCcpXG4gICAgICAgIC5tYXAoKGZpbGVQYXRoKSA9PiBwYXRoLmRpcm5hbWUoZmlsZVBhdGgpKVxuICAgICksXG4gIF0udG9Tb3J0ZWQoKTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGEgZm5veCBjb25maWcgZGVjbGFyZXMgaXRzIG93biBgW3Byb3ZpZGVycy5hZ2VdYCwgaS5lLiBwYXJ0aWNpcGF0ZXMgaW4gYWdlIGVuY3J5cHRpb24uXG4gKiBBIGNvbmZpZyB3aXRob3V0IG9uZSBlaXRoZXIgaW5oZXJpdHMgYSBtYW5hZ2VkIHJvb3QncyBwcm92aWRlciAoaGFuZGxlZCBieSB0aGUgcm9vdC1leGlzdHMgcGF0aClcbiAqIG9yLCB3aGVuIG5vIHJvb3QgZXhpc3RzLCB1c2VzIG5vIGFnZSBlbmNyeXB0aW9uIGF0IGFsbCDigJQgc28gaXQgbmVlZHMgbm8gcmVjaXBpZW50IHN5bmNocm9uaXphdGlvblxuICogYW5kIG93bnMgbm8gRk5PWF9BR0VfS0VZLlxuICovXG5mdW5jdGlvbiBkZWNsYXJlc0Zub3hBZ2VQcm92aWRlcihmaWxlUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGxldCBjb250ZW50OiBzdHJpbmc7XG4gIHRyeSB7XG4gICAgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gRmFpbCBjbG9zZWQ6IGFuIHVucmVhZGFibGUgY29uZmlnIG1pZ2h0IGRlY2xhcmUgYW4gYWdlIHByb3ZpZGVyLlxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHRyeSB7XG4gICAgcmV0dXJuIEJvb2xlYW4oKEJ1bi5UT01MLnBhcnNlKGNvbnRlbnQpIGFzIEZub3hUb21sKS5wcm92aWRlcnM/LmFnZSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIEZhaWwgY2xvc2VkOiBhbiB1bnBhcnNhYmxlIGNvbmZpZyBtaWdodCBkZWNsYXJlIGFuIGFnZSBwcm92aWRlci5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG4vKipcbiAqIFdoZXRoZXIgYSBmbm94IGNvbmZpZyBwYXRoIGxpZXMgaW5zaWRlIGEgdGVzdC1maXh0dXJlIHRyZWUgKHRlc3QvZml4dHVyZXMsIHRlc3QtZml4dHVyZXMsXG4gKiBfX3Rlc3RzX18pOiBmaXh0dXJlIGNvbmZpZ3MgYXJlIHRlc3QgSU5QVVRTLCBub3QgcmVwb3NpdG9yeSBjb25maWd1cmF0aW9uLiBmbm94IG5ldmVyIGxvYWRzXG4gKiB0aGVtIGZvciByZWFsIGNvbW1hbmRzIChoaWVyYXJjaGljYWwgbG9hZGluZyBvbmx5IHdhbGtzIGN3ZCBhbmNlc3RvcnMpLCByZWNpcGllbnRcbiAqIHN5bmNocm9uaXphdGlvbiBtdXN0IG5vdCByZXdyaXRlIG9yIHJlLWVuY3J5cHQgdGhlbSAoc2hhcmVkLWxpYi1ub2RlJ3MgdW5kZWNyeXB0YWJsZSBmaXh0dXJlXG4gKiBleGlzdHMgcHJlY2lzZWx5IHRvIHN0YXkgdW5kZWNyeXB0YWJsZSksIGFuZCBhIGZpeHR1cmUgbXVzdCBub3QgZmFpbCB0aGUgc3RyYXktbmVzdGVkLWNvbmZpZ1xuICogY2hlY2sgaW4gcmVwb3NpdG9yaWVzIHdpdGhvdXQgYSByb290IGZub3gudG9tbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVGVzdEZpeHR1cmVGbm94UGF0aChmaWxlUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vIGBmaXh0dXJlc2AgY291bnRzIG9ubHkgZGlyZWN0bHkgdW5kZXIgYSB0ZXN0IGRpcmVjdG9yeTogd2JmeSBzdXBwb3J0cyBhcmJpdHJhcnkgd29ya3NwYWNlcyxcbiAgLy8gc28gYSBsZWdpdGltYXRlIGBwYWNrYWdlcy9maXh0dXJlcy9gIHdvcmtzcGFjZSBtdXN0IHN0YXkgbWFuYWdlZCBhbmQgdmVyaWZpZWQuXG4gIGNvbnN0IHNlZ21lbnRzID0gZmlsZVBhdGguc3BsaXQoJy8nKTtcbiAgcmV0dXJuIHNlZ21lbnRzLnNvbWUoXG4gICAgKHNlZ21lbnQsIGluZGV4KSA9PlxuICAgICAgc2VnbWVudCA9PT0gJ3Rlc3QtZml4dHVyZXMnIHx8XG4gICAgICBzZWdtZW50ID09PSAnX190ZXN0c19fJyB8fFxuICAgICAgKHNlZ21lbnQgPT09ICdmaXh0dXJlcycgJiYgKHNlZ21lbnRzW2luZGV4IC0gMV0gPT09ICd0ZXN0JyB8fCBzZWdtZW50c1tpbmRleCAtIDFdID09PSAndGVzdHMnKSlcbiAgKTtcbn1cblxuZnVuY3Rpb24gbGlzdEZub3hMaWtlRmlsZVBhdGhzKHJvb3REaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIC8vIC16IHByaW50cyBOVUwtZGVsaW1pdGVkIHZlcmJhdGltIHBhdGhzOyB3aXRob3V0IGl0LCBjb3JlLnF1b3RlUGF0aCBDLXF1b3RlcyBub24tQVNDSUkgcGF0aHNcbiAgLy8gKGUuZy4gXCJcXDM0NlxcMjI3XFwyNDUuLi5cIiksIHdoaWNoIHdvdWxkIG1ha2UgdGhlIGJhc2VuYW1lIGZpbHRlciBzaWxlbnRseSBza2lwIHRob3NlIGNvbmZpZ3MuXG4gIGNvbnN0IHByb2MgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhcbiAgICAnZ2l0JyxcbiAgICBbJ2xzLWZpbGVzJywgJy16JywgJy0tY2FjaGVkJywgJy0tb3RoZXJzJywgJy0tZXhjbHVkZS1zdGFuZGFyZCcsICctLScsICcqZm5veCoudG9tbCddLFxuICAgIHsgY3dkOiByb290RGlyUGF0aCwgZW5jb2Rpbmc6ICd1dGY4Jywgc3RkaW86ICdwaXBlJyB9XG4gICk7XG4gIC8vIEZhaWwgY2xvc2VkOiB0cmVhdGluZyBhIGdpdCBmYWlsdXJlIGFzIFwibm8gZm5veCBjb25maWdzXCIgd291bGQgc2tpcCBzeW5jaHJvbml6YXRpb24gYW5kIGxldFxuICAvLyBzZXR1cFNlY3JldHMgdXBsb2FkIGEga2V5IHRoYXQgd2FzIG5ldmVyIHZlcmlmaWVkIGFnYWluc3QgdGhlIHJlcG9zaXRvcnkncyBjaXBoZXJ0ZXh0cy5cbiAgaWYgKHByb2Muc3RhdHVzICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBnaXQgbHMtZmlsZXMgZmFpbGVkIGluICR7cm9vdERpclBhdGh9OiAkeyhwcm9jLnN0ZGVyciB8fCBwcm9jLmVycm9yPy5tZXNzYWdlIHx8ICcnKS50cmltKCl9YCk7XG4gIH1cbiAgcmV0dXJuIHByb2Muc3Rkb3V0XG4gICAgLnNwbGl0KCdcXDAnKVxuICAgIC5maWx0ZXIoKGxpbmUpID0+IC9eXFwuP2Zub3goXFwuLispP1xcLnRvbWwkL3UudGVzdChwYXRoLmJhc2VuYW1lKGxpbmUpKSAmJiAhaXNUZXN0Rml4dHVyZUZub3hQYXRoKGxpbmUpKVxuICAgIC5tYXAoKGxpbmUpID0+IHBhdGgucmVzb2x2ZShyb290RGlyUGF0aCwgbGluZSkpO1xufVxuXG5mdW5jdGlvbiBsaXN0Rm5veExpa2VGaWxlTmFtZXMoZGlyUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICB0cnkge1xuICAgIHJldHVybiBmc1xuICAgICAgLnJlYWRkaXJTeW5jKGRpclBhdGgpXG4gICAgICAuZmlsdGVyKChuYW1lKSA9PiAvXlxcLj9mbm94KFxcLi4rKT9cXC50b21sJC91LnRlc3QobmFtZSkpXG4gICAgICAudG9Tb3J0ZWQoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoKGVycm9yIGFzIHsgY29kZT86IHN0cmluZyB9IHwgdW5kZWZpbmVkKT8uY29kZSA9PT0gJ0VOT0VOVCcpIHJldHVybiBbXTtcbiAgICAvLyBGYWlsIGNsb3NlZDogZm5veCBjYW4gc3RpbGwgbG9hZCBhIGNvbmZpZyBmcm9tIGEgZGlyZWN0b3J5IHRoaXMgcHJvY2VzcyBjYW5ub3QgZW51bWVyYXRlXG4gICAgLy8gKGUuZy4gZXhlY3V0ZS1vbmx5IHBlcm1pc3Npb24pLCBzbyBhbiBlbnVtZXJhdGlvbiBmYWlsdXJlIG11c3Qgbm90IHJlYWQgYXMgXCJubyBjb25maWdzXCIuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgaW5zcGVjdCAke2RpclBhdGh9IGZvciBmbm94IGNvbmZpZ3M6ICR7ZXJyb3J9YCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbGlzdEFuY2VzdG9yRGlyUGF0aHMoZGlyUGF0aDogc3RyaW5nLCByb290RGlyUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBkaXJQYXRocyA9IFtkaXJQYXRoXTtcbiAgd2hpbGUgKGRpclBhdGhzLmF0KC0xKSAhPT0gcm9vdERpclBhdGgpIHtcbiAgICBjb25zdCBwYXJlbnQgPSBwYXRoLmRpcm5hbWUoZGlyUGF0aHMuYXQoLTEpID8/ICcnKTtcbiAgICBpZiAocGFyZW50ID09PSBkaXJQYXRocy5hdCgtMSkpIGJyZWFrO1xuICAgIGRpclBhdGhzLnB1c2gocGFyZW50KTtcbiAgfVxuICByZXR1cm4gZGlyUGF0aHM7XG59XG4iLCJpbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuZXhwb3J0IGZ1bmN0aW9uIG92ZXJ3cml0ZU1lcmdlPFQ+KGRlc3RpbmF0aW9uQXJyYXk6IFRbXSwgc291cmNlQXJyYXk6IFRbXSk6IFRbXSB7XG4gIHJldHVybiBzb3VyY2VBcnJheTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbWJpbmVNZXJnZSh0YXJnZXQ6IHVua25vd25bXSwgc291cmNlOiB1bmtub3duW10sIG9wdGlvbnM6IG1lcmdlLkFycmF5TWVyZ2VPcHRpb25zKTogdW5rbm93bltdIHtcbiAgY29uc3QgZGVzdGluYXRpb24gPSBbLi4udGFyZ2V0XTtcblxuICBmb3IgKGNvbnN0IFtpbmRleCwgaXRlbV0gb2Ygc291cmNlLmVudHJpZXMoKSkge1xuICAgIGlmIChkZXN0aW5hdGlvbltpbmRleF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgZGVzdGluYXRpb25baW5kZXhdID0gY2xvbmVVbmxlc3NPdGhlcndpc2VTcGVjaWZpZWQoaXRlbSwgb3B0aW9ucyk7XG4gICAgfSBlbHNlIGlmIChpc01lcmdlYWJsZU9iamVjdCh0YXJnZXRbaW5kZXhdLCBvcHRpb25zKSAmJiBpc01lcmdlYWJsZU9iamVjdChpdGVtLCBvcHRpb25zKSkge1xuICAgICAgZGVzdGluYXRpb25baW5kZXhdID0gbWVyZ2UodGFyZ2V0W2luZGV4XSwgaXRlbSwgb3B0aW9ucyk7XG4gICAgfSBlbHNlIGlmICghdGFyZ2V0LmluY2x1ZGVzKGl0ZW0pKSB7XG4gICAgICBkZXN0aW5hdGlvbi5wdXNoKGl0ZW0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGVzdGluYXRpb247XG59XG5cbmZ1bmN0aW9uIGNsb25lVW5sZXNzT3RoZXJ3aXNlU3BlY2lmaWVkKHZhbHVlOiB1bmtub3duLCBvcHRpb25zOiBtZXJnZS5BcnJheU1lcmdlT3B0aW9ucyk6IHVua25vd24ge1xuICByZXR1cm4gaXNNZXJnZWFibGVPYmplY3QodmFsdWUsIG9wdGlvbnMpID8gb3B0aW9ucy5jbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZCh2YWx1ZSwgb3B0aW9ucykgOiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gaXNNZXJnZWFibGVPYmplY3QodmFsdWU6IHVua25vd24sIG9wdGlvbnM6IG1lcmdlLkFycmF5TWVyZ2VPcHRpb25zKTogdmFsdWUgaXMgb2JqZWN0IHtcbiAgcmV0dXJuICEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiBvcHRpb25zLmlzTWVyZ2VhYmxlT2JqZWN0KHZhbHVlKTtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBtb3ZlVG9Cb3R0b208VE9iaiBleHRlbmRzIFJlY29yZDxUS2V5LCB1bmtub3duPiwgVEtleSBleHRlbmRzIHN0cmluZyB8IG51bWJlciB8IHN5bWJvbD4oXG4gIG9iajogVE9iaixcbiAga2V5OiBUS2V5XG4pOiBUT2JqIHtcbiAgY29uc3QgdmFsdWUgPSBvYmpba2V5XTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZVxuICBkZWxldGUgb2JqW2tleV07XG4gIChvYmogYXMgUmVjb3JkPFRLZXksIHVua25vd24+KVtrZXldID0gdmFsdWU7XG4gIHJldHVybiBvYmo7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzb3J0S2V5czxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KG9iajogVCk6IFQge1xuICBjb25zdCBrZXlBbmRWYWx1ZXMgPSBPYmplY3QuZW50cmllcyhvYmopLnRvU29ydGVkKChba2V5MV0sIFtrZXkyXSkgPT4ga2V5MS5sb2NhbGVDb21wYXJlKGtleTIpKTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2Yga2V5QW5kVmFsdWVzKSB7XG4gICAgLy8gcGFja2FnZS5qc29uLXN0eWxlIGtleXMgYXJlIG5vbi1hcnJheS1pbmRleCBrZXlzLCBzbyBKU09OLnN0cmluZ2lmeSBwcmVzZXJ2ZXMgdGhpcyBpbnNlcnRpb24gb3JkZXIuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZVxuICAgIGRlbGV0ZSBvYmpba2V5XTtcbiAgICAob2JqIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldID0gdmFsdWU7XG5cbiAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHNvcnRLZXlzKHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG9iajtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7XG4gIGdldE1lYW5pbmdmdWxEZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zLFxuICBnZXRTZWVkZWRCYXNlbGluZUdsb2IsXG4gIGhhc0ltcGxpY2l0V29ya3NwYWNlQmFzZWxpbmUsXG4gIGlzSW5SZXBvc2l0b3J5V29ya3NwYWNlUGF0dGVybixcbiAgbm9ybWFsaXplV29ya3NwYWNlUGF0dGVybkJvZHksXG4gIHJlc29sdmVXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzLFxufSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuLy8gVGhlIEJ1bi1leGFjdCByZXNvbHV0aW9uIHByaW1pdGl2ZXMgbGl2ZSBpbiBAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlIChzcmMvYnVuV29ya3NwYWNlcy50cylcbi8vIHNvIHdiJ3MgcmVsZWFzZSBjb2RlIHNoYXJlcyB0aGVtOyByZS1leHBvcnQgdGhlIG9uZXMgd2JmeSBtb2R1bGVzIGFuZCB0ZXN0cyBjb25zdW1lLlxuZXhwb3J0IHtcbiAgZ2V0RGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyxcbiAgZ2V0TWVhbmluZ2Z1bERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMsXG4gIGhhc0ltcGxpY2l0V29ya3NwYWNlQmFzZWxpbmUsXG59IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcblxuLyoqIFRoZSBzdWJzZXQgb2YgUGFja2FnZUNvbmZpZyB0aGF0IHdvcmtzcGFjZSBkaXNjb3ZlcnkgbmVlZHMsIHNvIGl0IGNhbiBydW4gYmVmb3JlIGNvbmZpZ3MgZXhpc3QuICovXG5leHBvcnQgdHlwZSBXb3Jrc3BhY2VSb290TGlrZSA9IFBpY2s8UGFja2FnZUNvbmZpZywgJ2RpclBhdGgnIHwgJ2RvZXNDb250YWluU3ViUGFja2FnZUpzb25zJyB8ICdwYWNrYWdlSnNvbic+O1xuXG4vKipcbiAqIEV2ZXJ5IGRlY2xhcmVkIHdvcmtzcGFjZSBkaXJlY3RvcnkgKGFic29sdXRlLCBkZWR1cGxpY2F0ZWQpIG9mIHRoZSBtb25vcmVwbyByb290LCBjb3ZlcmluZ1xuICogbm9uLXBhY2thZ2VzLyogbGF5b3V0cyBzdWNoIGFzIGFwcHMvKi4gVW5jYWNoZWQgYmVjYXVzZSBpbmRleC50cyBjYWxscyBpdCBiZWZvcmUgd2JmeSBtdXRhdGVzXG4gKiB0aGUgcm9vdCBwYWNrYWdlLmpzb24gKGdldFdvcmtzcGFjZVBhY2thZ2VEaXJzIGNhY2hlcyB0aGUgcG9zdC1tdXRhdGlvbiBzdGF0ZSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRXb3Jrc3BhY2VTdWJEaXJQYXRocyhyb290TGlrZTogV29ya3NwYWNlUm9vdExpa2UpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBbXG4gICAgLi4ubmV3IFNldChcbiAgICAgIGdldFdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMocm9vdExpa2UpLm1hcCgocGFja2FnZUpzb25QYXRoKSA9PlxuICAgICAgICBwYXRoLnJlc29sdmUocm9vdExpa2UuZGlyUGF0aCwgcGF0aC5wb3NpeC5kaXJuYW1lKHBhY2thZ2VKc29uUGF0aCkpXG4gICAgICApXG4gICAgKSxcbiAgXS50b1NvcnRlZCgpO1xufVxuXG4vKipcbiAqIEV2ZXJ5IHdvcmtzcGFjZSBwYWNrYWdlLmpzb24gcGF0aCAocmVsYXRpdmUgdG8gdGhlIG1vbm9yZXBvIHJvb3QsIHNvcnRlZCksIGluY2x1ZGluZyBtYW5pZmVzdHNcbiAqIHdpdGhvdXQgYSBgbmFtZWAgZmllbGQg4oCUIHdiZnkgbmFtZXMgdGhvc2UgbGF0ZXIsIHNvIGRlcGVuZGVuY3kgc2NhbnMgbXVzdCBub3Qgc2tpcCB0aGVtLlxuICogUmVzb2x1dGlvbiBtaW1pY3MgQnVuJ3Mgc2VxdWVudGlhbCBwYXR0ZXJuIGV2YWx1YXRpb247IHNlZSByZXNvbHZlV29ya3NwYWNlUGFja2FnZUpzb25QYXRocy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMocm9vdENvbmZpZzogV29ya3NwYWNlUm9vdExpa2UpOiBzdHJpbmdbXSB7XG4gIHJldHVybiByZXNvbHZlV29ya3NwYWNlUGFja2FnZUpzb25QYXRocyhnZXRTYW5pdGl6ZWRXb3Jrc3BhY2VQYXR0ZXJucyhyb290Q29uZmlnKSwgcm9vdENvbmZpZy5kaXJQYXRoKTtcbn1cblxuaW50ZXJmYWNlIFdvcmtzcGFjZURpclBhdHRlcm5zIHtcbiAgLyoqIERpcmVjdG9yeSBzdWJ0cmVlcyAob3IgcGFja2FnZS1vd25lZCBzdWJwYXRocykgbWF0Y2hlZCBieSBlZmZlY3RpdmUgbmVnYXRpb25zLCBmb3IgdHNjb25maWcgYGV4Y2x1ZGVgIGVudHJpZXMuICovXG4gIGV4Y2x1ZGVzOiBzdHJpbmdbXTtcbiAgLyoqIFBvc2l0aXZlIGRpcmVjdG9yeSBwYXR0ZXJucyAob3IgY29uY3JldGUgZGlyZWN0b3JpZXMgZm9yIEJ1bi1vbmx5IGdsb2Igc3ludGF4KS4gKi9cbiAgaW5jbHVkZXM6IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFNvcnRlZCB3b3Jrc3BhY2UgZGlyZWN0b3J5IHBhdHRlcm5zIChwb3NpeCwgcmVsYXRpdmUgdG8gdGhlIG1vbm9yZXBvIHJvb3QpIGZvciBnZW5lcmF0b3JzIHRoYXRcbiAqIG5lZWQgcGF0dGVybi1zaGFwZWQgZ2xvYnMgY292ZXJpbmcgZXZlcnkgd29ya3NwYWNlIGxheW91dCDigJQgZS5nLiB0aGUgcm9vdCB0c2NvbmZpZydzIGBhcHBzLypgXG4gKiBpbmNsdWRlIGVudHJpZXMg4oCUIGluc3RlYWQgb2YgY29uY3JldGUgZGlyZWN0b3JpZXMsIHdoaWNoIHdvdWxkIGNodXJuIGdlbmVyYXRlZCBmaWxlcyB3aGVuZXZlciBhXG4gKiB3b3Jrc3BhY2UgcGFja2FnZSBpcyBhZGRlZCBvciByZW1vdmVkLiBFdmVyeSByZXR1cm5lZCBwYXR0ZXJuIGlzIHZhbGlkIHRzY29uZmlnIGdsb2Igc3ludGF4LlxuICogQSBwYXR0ZXJuIGNhbiBtYXRjaCBhIHNpYmxpbmcgZGlyZWN0b3J5IHdpdGhvdXQgYSBwYWNrYWdlLmpzb24gKG5vdCBhIHdvcmtzcGFjZSB0byBCdW4pOyB0aGF0XG4gKiBpcyBkZWxpYmVyYXRlLCBtaXJyb3JpbmcgdGhlIGxvbmctc3RhbmRpbmcgYHBhY2thZ2VzLypgIGVudHJpZXMnIGJlaGF2aW9yIGluIGZhdm9yIG9mIHN0YWJsZVxuICogZ2VuZXJhdGVkIG91dHB1dC4gTmVnYXRpb25zIGZvbGxvdyBCdW4ncyBzZXF1ZW50aWFsIHNlbWFudGljcyAoc2VlXG4gKiByZXNvbHZlV29ya3NwYWNlUGFja2FnZUpzb25QYXRocyk6IGEgbmVnYXRpb24gc3RheXMgcGF0dGVybi1zaGFwZWQgd2hpbGUgaXQgZXhjbHVkZXMgZXhhY3RseVxuICogd2hhdCBpdCBtYXRjaGVzLCBidXQgaXMgY29uY3JldGl6ZWQgcGVyIG1hdGNoZWQgZGlyZWN0b3J5IHdoZW4gYSBtYXRjaGVkIGRpcmVjdG9yeSBlbmRzIHVwIGFcbiAqIHdvcmtzcGFjZSBhbnl3YXkgKHJlLWluY2x1ZGVkIGJ5IGEgbGF0ZXIgcG9zaXRpdmUsIGEgcGlubmVkIGNvbmNyZXRlIHBvc2l0aXZlLCBvciBhIHNlZWRlZFxuICogYmFzZWxpbmU7ICMxMDA1KSBvciBpcyBhbiBhbmNlc3RvciBvZiBhIHdvcmtzcGFjZSBkaXJlY3RvcnksIHdoZXJlIEJ1biBleGNsdWRlcyBvbmx5IHRoZVxuICogcGFja2FnZSBBVCB0aGF0IGRpcmVjdG9yeSwgc28gb25seSBpdHMgcGFja2FnZS1vd25lZCBzdWJwYXRocyBhcmUgZXhjbHVkZWQgKCMxMDA0KS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFdvcmtzcGFjZURpclBhdHRlcm5zKHJvb3RMaWtlOiBXb3Jrc3BhY2VSb290TGlrZSk6IFdvcmtzcGFjZURpclBhdHRlcm5zIHtcbiAgLy8gVW5saWtlIGRpc2NvdmVyeSwgZ2VuZXJhdGVkIG91dHB1dCBtdXN0IG5vdCBjb250YWluIGEgbmV2ZXItbWF0Y2hpbmcgYHBhY2thZ2VzLypgIGZhbGxiYWNrOlxuICAvLyBhbiBhcHBzLyotb25seSBtb25vcmVwbyB3b3VsZCBnZXQgZGVhZCBnbG9icyBjb21taXR0ZWQgaW50byBpdHMgcm9vdCB0c2NvbmZpZy4gTWlycm9yXG4gIC8vIGFwcGx5UGFja2FnZUpzb25Db252ZW50aW9ucywgd2hpY2ggZm9yY2VzIGBwYWNrYWdlcy8qYCBvbmx5IHdoZW4gYSBtYW5pZmVzdCBhY3R1YWxseSBtYXRjaGVzLlxuICBjb25zdCBoYXNQYWNrYWdlc0xheW91dCA9XG4gICAgcm9vdExpa2UuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMgJiZcbiAgICAvLyBNaXJyb3IgYXBwbHlQYWNrYWdlSnNvbkNvbnZlbnRpb25zJyBiYXNlbGluZSBnYXRlIHRvbzogd2l0aCBhbiBpbXBsaWNpdCBiYXNlbGluZSBzZWVkZWQsXG4gICAgLy8gYHBhY2thZ2VzLypgIGVudHJpZXMgd291bGQgYmUgZGVhZCBnbG9icyBzdWJzdW1lZCBieSB0aGUgYmFzZWxpbmUtZGVyaXZlZCBvbmVzLlxuICAgICFoYXNJbXBsaWNpdFdvcmtzcGFjZUJhc2VsaW5lKHJvb3RMaWtlLnBhY2thZ2VKc29uPy53b3Jrc3BhY2VzKSAmJlxuICAgIGZnLmdsb2JTeW5jKCdwYWNrYWdlcy8qL3BhY2thZ2UuanNvbicsIHtcbiAgICAgIGN3ZDogcm9vdExpa2UuZGlyUGF0aCxcbiAgICAgIGZvbGxvd1N5bWJvbGljTGlua3M6IGZhbHNlLFxuICAgICAgaWdub3JlOiBbJyoqL25vZGVfbW9kdWxlcy8qKiddLFxuICAgIH0pLmxlbmd0aCA+IDA7XG4gIGNvbnN0IHdvcmtzcGFjZVBhdHRlcm5zID0gZ2V0U2FuaXRpemVkV29ya3NwYWNlUGF0dGVybnMoe1xuICAgIC4uLnJvb3RMaWtlLFxuICAgIGRvZXNDb250YWluU3ViUGFja2FnZUpzb25zOiBoYXNQYWNrYWdlc0xheW91dCxcbiAgfSk7XG4gIGNvbnN0IHdvcmtzcGFjZURpclBhdGhzID0gbmV3IFNldChcbiAgICByZXNvbHZlV29ya3NwYWNlUGFja2FnZUpzb25QYXRocyh3b3Jrc3BhY2VQYXR0ZXJucywgcm9vdExpa2UuZGlyUGF0aCkubWFwKChwYWNrYWdlSnNvblBhdGgpID0+XG4gICAgICBwYXRoLnBvc2l4LmRpcm5hbWUocGFja2FnZUpzb25QYXRoKVxuICAgIClcbiAgKTtcbiAgY29uc3QgaW5jbHVkZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgbmVnYXRpb25Cb2RpZXM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3Qgd29ya3NwYWNlUGF0dGVybiBvZiB3b3Jrc3BhY2VQYXR0ZXJucykge1xuICAgIGNvbnN0IGlzTmVnYXRpdmUgPSB3b3Jrc3BhY2VQYXR0ZXJuLnN0YXJ0c1dpdGgoJyEnKTtcbiAgICBjb25zdCBwYXR0ZXJuQm9keSA9IG5vcm1hbGl6ZVdvcmtzcGFjZVBhdHRlcm5Cb2R5KGlzTmVnYXRpdmUgPyB3b3Jrc3BhY2VQYXR0ZXJuLnNsaWNlKDEpIDogd29ya3NwYWNlUGF0dGVybik7XG4gICAgaWYgKGlzTmVnYXRpdmUpIHtcbiAgICAgIC8vIEEgc2VlZGluZyBuZWdhdGlvbiBtYWtlcyBCdW4gbGluayBiYXNlbGluZS1tYXRjaGVkIGRpcmVjdG9yaWVzLCBzbyB0aGUgYmFzZWxpbmUgbXVzdFxuICAgICAgLy8gZW50ZXIgdGhlIGdlbmVyYXRlZCBpbmNsdWRlIHBhdHRlcm5zIGV2ZW4gd2hlbiBldmVyeSBkZWNsYXJlZCBwYXR0ZXJuIGlzIGEgbmVnYXRpb24uXG4gICAgICBjb25zdCBiYXNlbGluZUdsb2IgPSBnZXRTZWVkZWRCYXNlbGluZUdsb2IocGF0dGVybkJvZHkpO1xuICAgICAgaWYgKGJhc2VsaW5lR2xvYiAhPT0gdW5kZWZpbmVkKSBpbmNsdWRlcy5hZGQoYmFzZWxpbmVHbG9iKTtcbiAgICAgIG5lZ2F0aW9uQm9kaWVzLnB1c2gocGF0dGVybkJvZHkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGNvbnN0IGRpclBhdHRlcm4gb2YgdG9Uc2NvbmZpZ0NvbXBhdGlibGVEaXJQYXR0ZXJucyhwYXR0ZXJuQm9keSwgcm9vdExpa2UuZGlyUGF0aCkpIHtcbiAgICAgICAgaW5jbHVkZXMuYWRkKGRpclBhdHRlcm4pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjb25zdCBleGNsdWRlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IG5lZ2F0aW9uQm9keSBvZiBuZWdhdGlvbkJvZGllcykge1xuICAgIGZvciAoY29uc3QgZXhjbHVkZUVudHJ5IG9mIHRvRXhjbHVkZUVudHJpZXMobmVnYXRpb25Cb2R5LCB3b3Jrc3BhY2VEaXJQYXRocywgcm9vdExpa2UuZGlyUGF0aCkpIHtcbiAgICAgIGV4Y2x1ZGVzLmFkZChleGNsdWRlRW50cnkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4geyBleGNsdWRlczogWy4uLmV4Y2x1ZGVzXS50b1NvcnRlZCgpLCBpbmNsdWRlczogWy4uLmluY2x1ZGVzXS50b1NvcnRlZCgpIH07XG59XG5cbi8qKlxuICogdHNjb25maWcgZXhjbHVkZSBlbnRyaWVzIGZvciBvbmUgbmVnYXRpb24uIFBhdHRlcm4tc2hhcGVkIHdoZW4gdGhlIG5lZ2F0aW9uIGV4Y2x1ZGVzIGV4YWN0bHlcbiAqIHdoYXQgaXQgbWF0Y2hlcyAoc3RhYmxlIG91dHB1dCk7IHBlci1kaXJlY3Rvcnkgb3RoZXJ3aXNlOiBhIGRpcmVjdG9yeSB0aGF0IGlzIGEgd29ya3NwYWNlXG4gKiBkZXNwaXRlIHRoZSBuZWdhdGlvbiBpcyBub3QgZXhjbHVkZWQgYXQgYWxsLCBhbmQgbmVpdGhlciBpcyBhIFBMQUlOIChwYWNrYWdlLmpzb24tbGVzcylcbiAqIGRlc2NlbmRhbnQgb2YgYSB3b3Jrc3BhY2UgZGlyZWN0b3J5IOKAlCBuZWdhdGluZyBhIG5vbi1wYWNrYWdlIGRpcmVjdG9yeSBpcyBhIG5vLW9wIGZvciBCdW4sXG4gKiBhbmQgdGhlIGVuY2xvc2luZyB3b3Jrc3BhY2Ugc3RheXMgYWN0aXZlIChlLmcuIGBbJ2FwcHMvKionLCAnIWFwcHMvKionLCAnYXBwcy93ZWInXWBcbiAqIHJlLWluY2x1ZGVzIGFwcHMvd2ViLCB3aG9zZSBzcmMgbXVzdCBrZWVwIHR5cGUtY2hlY2tpbmc7IGEgdHNjb25maWcgZXhjbHVkZSB3b3VsZCBvdmVycmlkZVxuICogdGhlIGluY2x1ZGUpLiBBIGRlc2NlbmRhbnQgd2l0aCBpdHMgb3duIG1hbmlmZXN0IHRoYXQgdGhlIG5lZ2F0aW9uIGtlZXBzIG91dCBvZiB0aGUgd29ya3NwYWNlXG4gKiBzZXQgaXMgYW4gZXhjbHVkZWQgbmVzdGVkIHBhY2thZ2UgYW5kIHN0YXlzIGV4Y2x1ZGVkLiBBIGRpcmVjdG9yeSB0aGF0IGlzIGFuXG4gKiBhbmNlc3RvciBvZiBhIHdvcmtzcGFjZSBkaXJlY3RvcnkgZ2V0cyBvbmx5IGl0cyBwYWNrYWdlLW93bmVkIHN1YnBhdGhzIGV4Y2x1ZGVkLCBiZWNhdXNlIEJ1blxuICogZXhjbHVkZXMgb25seSB0aGUgcGFja2FnZSBBVCB0aGF0IGRpcmVjdG9yeSB3aGlsZSBrZWVwaW5nIGRlc2NlbmRhbnQgd29ya3NwYWNlcyAoIzEwMDQpLlxuICovXG5mdW5jdGlvbiB0b0V4Y2x1ZGVFbnRyaWVzKG5lZ2F0aW9uQm9keTogc3RyaW5nLCB3b3Jrc3BhY2VEaXJQYXRoczogU2V0PHN0cmluZz4sIHJvb3REaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGlzV29ya3NwYWNlQW5jZXN0b3IgPSAoZGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiA9PlxuICAgIFsuLi53b3Jrc3BhY2VEaXJQYXRoc10uc29tZSgod29ya3NwYWNlRGlyUGF0aCkgPT4gd29ya3NwYWNlRGlyUGF0aC5zdGFydHNXaXRoKGAke2RpclBhdGh9L2ApKTtcbiAgLy8gT25seSBQTEFJTiBkaXJlY3RvcmllcyAobm8gcGFja2FnZS5qc29uIG9mIHRoZWlyIG93bikgYXJlIHByb3RlY3RlZCBieSB0aGUgZW5jbG9zaW5nXG4gIC8vIHdvcmtzcGFjZTogYSBtYXRjaGVkIGRpcmVjdG9yeSB0aGF0IGNhcnJpZXMgaXRzIG93biBtYW5pZmVzdCB5ZXQgaXMgYWJzZW50IGZyb20gdGhlIGZpbmFsXG4gIC8vIHdvcmtzcGFjZSBzZXQgaXMgYW4gZXhjbHVkZWQgbmVzdGVkIHBhY2thZ2UsIGFuZCBpdHMgZXhjbHVzaW9uIG11c3Qgc3Vydml2ZS5cbiAgY29uc3QgaXNQcm90ZWN0ZWRXb3Jrc3BhY2VEZXNjZW5kYW50ID0gKGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4gPT5cbiAgICBbLi4ud29ya3NwYWNlRGlyUGF0aHNdLnNvbWUoKHdvcmtzcGFjZURpclBhdGgpID0+IGRpclBhdGguc3RhcnRzV2l0aChgJHt3b3Jrc3BhY2VEaXJQYXRofS9gKSkgJiZcbiAgICAhZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocm9vdERpclBhdGgsIGRpclBhdGgsICdwYWNrYWdlLmpzb24nKSk7XG4gIGNvbnN0IG1hdGNoZWREaXJQYXRocyA9IGdldE1hdGNoZWREaXJQYXRocyhuZWdhdGlvbkJvZHksIHJvb3REaXJQYXRoKTtcbiAgaWYgKFxuICAgICFtYXRjaGVkRGlyUGF0aHMuc29tZShcbiAgICAgIChkaXJQYXRoKSA9PlxuICAgICAgICB3b3Jrc3BhY2VEaXJQYXRocy5oYXMoZGlyUGF0aCkgfHwgaXNXb3Jrc3BhY2VBbmNlc3RvcihkaXJQYXRoKSB8fCBpc1Byb3RlY3RlZFdvcmtzcGFjZURlc2NlbmRhbnQoZGlyUGF0aClcbiAgICApXG4gICkge1xuICAgIHJldHVybiB0b1RzY29uZmlnQ29tcGF0aWJsZURpclBhdHRlcm5zKG5lZ2F0aW9uQm9keSwgcm9vdERpclBhdGgpO1xuICB9XG4gIHJldHVybiBtYXRjaGVkRGlyUGF0aHMuZmxhdE1hcCgoZGlyUGF0aCkgPT4ge1xuICAgIC8vIFRoZSBkZXNjZW5kYW50IGNoZWNrIHByZWNlZGVzIHRoZSBhbmNlc3RvciBvbmU6IGEgZGlyZWN0b3J5IGluc2lkZSBvbmUgd29ya3NwYWNlIGJ1dCBhYm92ZVxuICAgIC8vIGEgbmVzdGVkIG9uZSAoZS5nLiBhcHBzL3dlYi9wbHVnaW5zIGJldHdlZW4gd29ya3NwYWNlcyBhcHBzL3dlYiBhbmQgYXBwcy93ZWIvcGx1Z2lucy94KVxuICAgIC8vIHN0aWxsIGJlbG9uZ3MgdG8gdGhlIGVuY2xvc2luZyBhY3RpdmUgd29ya3NwYWNlLCBzbyBub3RoaW5nIG9mIGl0IG1heSBiZSBleGNsdWRlZC5cbiAgICBpZiAod29ya3NwYWNlRGlyUGF0aHMuaGFzKGRpclBhdGgpIHx8IGlzUHJvdGVjdGVkV29ya3NwYWNlRGVzY2VuZGFudChkaXJQYXRoKSkgcmV0dXJuIFtdO1xuICAgIGlmIChpc1dvcmtzcGFjZUFuY2VzdG9yKGRpclBhdGgpKSB7XG4gICAgICByZXR1cm4gW2Ake2RpclBhdGh9LyouY29uZmlnLnRzYCwgYCR7ZGlyUGF0aH0vc2NyaXB0c2AsIGAke2RpclBhdGh9L3NyY2AsIGAke2RpclBhdGh9L3Rlc3RgXTtcbiAgICB9XG4gICAgcmV0dXJuIFtkaXJQYXRoXTtcbiAgfSk7XG59XG5cbi8qKlxuICogRGlyZWN0b3JpZXMgYSBuZWdhdGlvbiBtYXRjaGVzLiBUaGUgbWFuaWZlc3QtYmFzZWQgZ2xvYiBjb21wbGVtZW50cyBvbmx5RGlyZWN0b3JpZXMgYmVjYXVzZVxuICogZmFzdC1nbG9iJ3MgYGRpci8qKmAgZG9lcyBub3QgcmV0dXJuIGBkaXJgIGl0c2VsZiBhcyBhIGRpcmVjdG9yeSwgd2hpbGUgYm90aCBCdW4gYW5kIHRoZVxuICogbWFuaWZlc3QgZ2xvYiB0cmVhdCBgKipgIGFzIHplcm8gb3IgbW9yZSBzZWdtZW50cyAoYGFwcHMvKipgIGNvdmVycyB0aGUgcGFja2FnZSBhdCBhcHBzKS5cbiAqL1xuZnVuY3Rpb24gZ2V0TWF0Y2hlZERpclBhdGhzKG5lZ2F0aW9uQm9keTogc3RyaW5nLCByb290RGlyUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBnbG9iT3B0aW9ucyA9IHsgY3dkOiByb290RGlyUGF0aCwgZm9sbG93U3ltYm9saWNMaW5rczogZmFsc2UsIGlnbm9yZTogWycqKi9ub2RlX21vZHVsZXMvKionXSB9O1xuICByZXR1cm4gW1xuICAgIC4uLm5ldyBTZXQoW1xuICAgICAgLi4uZmcuZ2xvYlN5bmMobmVnYXRpb25Cb2R5LCB7IC4uLmdsb2JPcHRpb25zLCBvbmx5RGlyZWN0b3JpZXM6IHRydWUgfSksXG4gICAgICAuLi5mZ1xuICAgICAgICAuZ2xvYlN5bmMocGF0aC5wb3NpeC5qb2luKG5lZ2F0aW9uQm9keSwgJ3BhY2thZ2UuanNvbicpLCBnbG9iT3B0aW9ucylcbiAgICAgICAgLm1hcCgocGFja2FnZUpzb25QYXRoKSA9PiBwYXRoLnBvc2l4LmRpcm5hbWUocGFja2FnZUpzb25QYXRoKSlcbiAgICAgICAgLy8gQSB6ZXJvLXNlZ21lbnQgYCoqYCBtYXRjaCByZWFjaGVzIHRoZSByb290IGl0c2VsZiwgd2hpY2ggaXMgbmV2ZXIgYSB3b3Jrc3BhY2UuXG4gICAgICAgIC5maWx0ZXIoKGRpclBhdGgpID0+IGRpclBhdGggIT09ICcuJyksXG4gICAgXSksXG4gIF0udG9Tb3J0ZWQoKTtcbn1cblxuLyoqXG4gKiB0c2NvbmZpZyBpbmNsdWRlL2V4Y2x1ZGUgc3VwcG9ydCBvbmx5IHRoZSBgKmAsIGA/YCwgYW5kIGAqKmAgd2lsZGNhcmRzLCB3aGlsZSBCdW4gd29ya3NwYWNlc1xuICogYWNjZXB0IGZ1bGwgZ2xvYiBzeW50YXggKGJyYWNlIGV4cGFuc2lvbiwgY2hhcmFjdGVyIGNsYXNzZXMsIOKApiksIHNvIGV4cGFuZCBCdW4tb25seSBwYXR0ZXJucyB0b1xuICogdGhlIGNvbmNyZXRlIGRpcmVjdG9yaWVzIHRoZXkgbWF0Y2ggdG8ga2VlcCB0aGUgZ2VuZXJhdGVkIGdsb2JzIHZhbGlkIGZvciBUeXBlU2NyaXB0LlxuICovXG5mdW5jdGlvbiB0b1RzY29uZmlnQ29tcGF0aWJsZURpclBhdHRlcm5zKHBhdHRlcm5Cb2R5OiBzdHJpbmcsIHJvb3REaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGlmICghL1soKVtcXF17fV0vdS50ZXN0KHBhdHRlcm5Cb2R5KSkgcmV0dXJuIFtwYXR0ZXJuQm9keV07XG4gIHJldHVybiBmZy5nbG9iU3luYyhwYXR0ZXJuQm9keSwge1xuICAgIGN3ZDogcm9vdERpclBhdGgsXG4gICAgZm9sbG93U3ltYm9saWNMaW5rczogZmFsc2UsXG4gICAgaWdub3JlOiBbJyoqL25vZGVfbW9kdWxlcy8qKiddLFxuICAgIG9ubHlEaXJlY3RvcmllczogdHJ1ZSxcbiAgfSk7XG59XG5cbi8qKlxuICogRGVjbGFyZWQgd29ya3NwYWNlIHBhdHRlcm5zIChuZWdhdGl2ZSBvbmVzIGluY2x1ZGVkKSB0aGF0IHN0YXkgaW5zaWRlIHRoZSByZXBvc2l0b3J5OiBhYnNvbHV0ZVxuICogb3IgYC4uYC10cmF2ZXJzaW5nIHBhdHRlcm5zIHdvdWxkIG1ha2UgY29uc3VtZXJzIHN1Y2ggYXMgcmVtb3ZlTm9kZU1vZHVsZXMgb3BlcmF0ZSBvbiBhbm90aGVyXG4gKiByZXBvc2l0b3J5J3MgZmlsZXMuIERlY2xhcmF0aW9uIG9yZGVyIGFuZCBkdXBsaWNhdGVzIGFyZSBwcmVzZXJ2ZWQg4oCUIEJ1biBldmFsdWF0ZXMgdGhlXG4gKiBwYXR0ZXJucyBzZXF1ZW50aWFsbHksIHNvIHBvc2l0aW9uIG1hdHRlcnMuXG4gKi9cbmZ1bmN0aW9uIGdldFNhbml0aXplZFdvcmtzcGFjZVBhdHRlcm5zKHJvb3RMaWtlOiBXb3Jrc3BhY2VSb290TGlrZSk6IHN0cmluZ1tdIHtcbiAgY29uc3QgZGVjbGFyZWRQYXR0ZXJucyA9IGdldE1lYW5pbmdmdWxEZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zKHJvb3RMaWtlLnBhY2thZ2VKc29uPy53b3Jrc3BhY2VzKTtcbiAgLy8gYXBwbHlQYWNrYWdlSnNvbkNvbnZlbnRpb25zIGZvcmNlcyBgcGFja2FnZXMvKmAgaW50byBhIG1vbm9yZXBvJ3Mgd29ya3NwYWNlcyB3aGVuIGFcbiAgLy8gcGFja2FnZXMvKi9wYWNrYWdlLmpzb24gYWN0dWFsbHkgbWF0Y2hlcywgYnV0IGl0IG1heSBub3QgaGF2ZSB3cml0dGVuIHRoZSByb290IHBhY2thZ2UuanNvblxuICAvLyB5ZXQsIHNvIG1pcnJvciB0aGF0IG5vcm1hbGl6YXRpb24gaGVyZSDigJQgUFJFUEVOREVEIGxpa2UgdGhlcmUsIGJlY2F1c2UgYSBwb3NpdGl2ZSBwYXR0ZXJuXG4gIC8vIHBsYWNlZCBhZnRlciBhIHVzZXIgbmVnYXRpb24gd291bGQgcmUtaW5jbHVkZSB0aGUgbmVnYXRlZCBwYWNrYWdlcyB1bmRlciBCdW4ncyBzZXF1ZW50aWFsXG4gIC8vIGV2YWx1YXRpb24uIERpc2NvdmVyeSBjYWxsZXJzIHBhc3MgdGhlIGZhbGxiYWNrIHVuY29uZGl0aW9uYWxseSBmb3IgbW9ub3JlcG9zIOKAlCBhXG4gIC8vIG5ldmVyLW1hdGNoaW5nIHBhdHRlcm4gY29udHJpYnV0ZXMgbm8gcGF0aHMgdGhlcmUg4oCUIHdoaWxlIHBhdHRlcm4tc2hhcGVkIGNhbGxlcnNcbiAgLy8gKGdldFdvcmtzcGFjZURpclBhdHRlcm5zKSBnYXRlIGl0IG9uIGFuIGFjdHVhbCBtYXRjaC5cbiAgY29uc3Qgd29ya3NwYWNlUGF0dGVybnMgPVxuICAgIHJvb3RMaWtlLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zICYmICFoYXNEZWNsYXJlZFBhY2thZ2VzU3RhclBhdHRlcm4ocm9vdExpa2UucGFja2FnZUpzb24/LndvcmtzcGFjZXMpXG4gICAgICA/IFsncGFja2FnZXMvKicsIC4uLmRlY2xhcmVkUGF0dGVybnNdXG4gICAgICA6IGRlY2xhcmVkUGF0dGVybnM7XG4gIHJldHVybiB3b3Jrc3BhY2VQYXR0ZXJucy5maWx0ZXIoKHdvcmtzcGFjZVBhdHRlcm4pID0+IGlzSW5SZXBvc2l0b3J5V29ya3NwYWNlUGF0dGVybih3b3Jrc3BhY2VQYXR0ZXJuKSk7XG59XG5cbi8qKlxuICogV2hldGhlciBhIGRlY2xhcmVkIHBvc2l0aXZlIHBhdHRlcm4gYWxyZWFkeSBjb3ZlcnMgYHBhY2thZ2VzLypgIHVuZGVyIHBhdGggbm9ybWFsaXphdGlvblxuICogKGUuZy4gYC4vcGFja2FnZXMvKmAgb3IgYSB0cmFpbGluZy1zbGFzaCBzcGVsbGluZyk6IGZvcmNpbmcgYSB0ZXh0dWFsIGBwYWNrYWdlcy8qYCBuZXh0IHRvXG4gKiBzdWNoIGEgc3BlbGxpbmcgd291bGQgcGVyc2lzdCBkdXBsaWNhdGUgZXF1aXZhbGVudCBwYXR0ZXJucyBhbmQgcmUtc2NhbiB0aGUgc2FtZSBkaXJlY3Rvcmllcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc0RlY2xhcmVkUGFja2FnZXNTdGFyUGF0dGVybih3b3Jrc3BhY2VzOiBQYWNrYWdlSnNvblsnd29ya3NwYWNlcyddKTogYm9vbGVhbiB7XG4gIHJldHVybiBnZXRNZWFuaW5nZnVsRGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyh3b3Jrc3BhY2VzKS5zb21lKFxuICAgICh3b3Jrc3BhY2VQYXR0ZXJuKSA9PlxuICAgICAgIXdvcmtzcGFjZVBhdHRlcm4uc3RhcnRzV2l0aCgnIScpICYmXG4gICAgICAvLyBBIGAuLmAtdHJhdmVyc2luZyBvciBhYnNvbHV0ZSBzcGVsbGluZyAoZS5nLiBgeC8uLi9wYWNrYWdlcy8qYCkgaXMgZGlzY2FyZGVkIGJ5XG4gICAgICAvLyBnZXRTYW5pdGl6ZWRXb3Jrc3BhY2VQYXR0ZXJucywgc28gaXQgbXVzdCBub3QgY291bnQgYXMgY292ZXJpbmcgcGFja2FnZXMvKiDigJQgdGhhdCB3b3VsZFxuICAgICAgLy8gc3VwcHJlc3MgdGhlIGZhbGxiYWNrIEFORCBsb3NlIHRoZSBwYXR0ZXJuLCBsZWF2aW5nIG5vIGRpc2NvdmVyZWQgd29ya3NwYWNlcy5cbiAgICAgIGlzSW5SZXBvc2l0b3J5V29ya3NwYWNlUGF0dGVybih3b3Jrc3BhY2VQYXR0ZXJuKSAmJlxuICAgICAgbm9ybWFsaXplV29ya3NwYWNlUGF0dGVybkJvZHkod29ya3NwYWNlUGF0dGVybikgPT09ICdwYWNrYWdlcy8qJ1xuICApO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5pbXBvcnQgeyBnZXRXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzIH0gZnJvbSAnLi93b3Jrc3BhY2VVdGlsLmpzJztcblxuY29uc3QgUFJJVkFURV9TQ09QRSA9ICdAd2lsbGJvb3N0ZXItcHJpdmF0ZS8nO1xuXG5jb25zdCBwcml2YXRlUmVnaXN0cnlIb3N0ID0gJ3ZlcmRhY2Npby1wcm9kdWN0aW9uLWUzODkudXAucmFpbHdheS5hcHAnO1xuZXhwb3J0IGNvbnN0IHByaXZhdGVSZWdpc3RyeVNjb3BlTWFwcGluZyA9IGBAd2lsbGJvb3N0ZXItcHJpdmF0ZTpyZWdpc3RyeT1odHRwczovLyR7cHJpdmF0ZVJlZ2lzdHJ5SG9zdH0vYDtcblxuLyoqXG4gKiBXaGV0aGVyIHRoaXMgcmVwb3NpdG9yeSBkZWFscyB3aXRoIGBAd2lsbGJvb3N0ZXItcHJpdmF0ZS8qYCBwYWNrYWdlcyDigJQgYnkgY29udmVudGlvbiB0aGF0IHNjb3BlXG4gKiBsaXZlcyBleGNsdXNpdmVseSBvbiB0aGUgcHJpdmF0ZSBWZXJkYWNjaW8gcmVnaXN0cnksIHNvIGV4YWN0bHkgdGhlc2UgcmVwb3NpdG9yaWVzIG5lZWQgdGhlXG4gKiBWRVJEQUNDSU9fVE9LRU4gcGFzcy10aHJvdWdoIGluIHRoZWlyIHJldXNhYmxlLXdvcmtmbG93IGNhbGxlcnMuXG4gKlxuICogQSByZXBvc2l0b3J5IHF1YWxpZmllcyB3aGVuIGFueSB3b3Jrc3BhY2UgcGFja2FnZS5qc29uIERFQ0xBUkVTIGEgZGVwZW5kZW5jeSBpbiB0aGUgc2NvcGUgKGFueVxuICogZGVwZW5kZW5jeSBmaWVsZCksIG9yIGlzIGl0c2VsZiBOQU1FRCBpbiB0aGUgc2NvcGUgKGl0IHB1Ymxpc2hlcyB0byBWZXJkYWNjaW8sIGFuZCByZWxlYXNlLnltbFxuICogZGVyaXZlcyBpdHMgbnBtIGF1dGggZnJvbSB0aGUgc2FtZSBzZWNyZXQpLiBOb3RoaW5nIGVsc2UgaXMgc2Nhbm5lZDogbG9ja2ZpbGVzIG9ubHkgbWlycm9yIHRoZVxuICogZGVjbGFyZWQgZGVwZW5kZW5jaWVzLCBhbmQgYnVuZmlnLnRvbWwncyBgbWluaW11bVJlbGVhc2VBZ2VFeGNsdWRlc2AgbWVudGlvbnMgdGhlIHNjb3BlIGV2ZW4gaW5cbiAqIHJlcG9zaXRvcmllcyB0aGF0IGRvIG5vdCBkZXBlbmQgb24gaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXBvUmVzb2x2ZXNQcml2YXRlUGFja2FnZXMoXG4gIGNvbmZpZzogUGljazxQYWNrYWdlQ29uZmlnLCAnZGlyUGF0aCcgfCAnZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMnIHwgJ3BhY2thZ2VKc29uJz5cbik6IGJvb2xlYW4ge1xuICBjb25zdCBtYW5pZmVzdFJlbFBhdGhzID0gbmV3IFNldChbJ3BhY2thZ2UuanNvbicsIC4uLmdldFdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMoY29uZmlnKV0pO1xuICByZXR1cm4gWy4uLm1hbmlmZXN0UmVsUGF0aHNdLnNvbWUoKHJlbFBhdGgpID0+IHtcbiAgICBjb25zdCBtYW5pZmVzdCA9IHJlYWRQYWNrYWdlSnNvbklmRXhpc3RzKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgcmVsUGF0aCkpO1xuICAgIGlmICghbWFuaWZlc3QpIHJldHVybiBmYWxzZTtcbiAgICBpZiAobWFuaWZlc3QubmFtZT8uc3RhcnRzV2l0aChQUklWQVRFX1NDT1BFKSkgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIFtcbiAgICAgIG1hbmlmZXN0LmRlcGVuZGVuY2llcyxcbiAgICAgIG1hbmlmZXN0LmRldkRlcGVuZGVuY2llcyxcbiAgICAgIG1hbmlmZXN0LnBlZXJEZXBlbmRlbmNpZXMsXG4gICAgICBtYW5pZmVzdC5vcHRpb25hbERlcGVuZGVuY2llcyxcbiAgICBdLnNvbWUoKGRlcGVuZGVuY2llcykgPT4gT2JqZWN0LmtleXMoZGVwZW5kZW5jaWVzID8/IHt9KS5zb21lKChuYW1lKSA9PiBuYW1lLnN0YXJ0c1dpdGgoUFJJVkFURV9TQ09QRSkpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJlYWRQYWNrYWdlSnNvbklmRXhpc3RzKGZpbGVQYXRoOiBzdHJpbmcpOiBQYWNrYWdlSnNvbiB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmOCcpKSBhcyBQYWNrYWdlSnNvbjtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0ICogYXMgeWFtbCBmcm9tICdqcy15YW1sJztcbmltcG9ydCB7IHogfSBmcm9tICd6b2QnO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuY29uc3QgcnVubmVyU2NoZW1hID0gei51bmlvbihbei5zdHJpbmcoKSwgei5hcnJheSh6LnN0cmluZygpKV0pO1xuY29uc3Qgd29ya2Zsb3dTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIGpvYnM6IHoucmVjb3JkKFxuICAgIHouc3RyaW5nKCksXG4gICAgelxuICAgICAgLm9iamVjdCh7XG4gICAgICAgICdydW5zLW9uJzogcnVubmVyU2NoZW1hLm9wdGlvbmFsKCksXG4gICAgICAgIHN0cmF0ZWd5OiB6Lm9iamVjdCh7IG1hdHJpeDogei5yZWNvcmQoei5zdHJpbmcoKSwgei51bmtub3duKCkpIH0pLm9wdGlvbmFsKCksXG4gICAgICB9KVxuICAgICAgLm51bGxhYmxlKClcbiAgKSxcbn0pO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXNzZXJ0UHJpdmF0ZVdvcmtmbG93UnVubmVycyhjb25maWc6IFBhY2thZ2VDb25maWcsIHdvcmtmbG93c1BhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoY29uZmlnLmlzUHVibGljUmVwbyB8fCAhY29uZmlnLmlzUmVwb1Zpc2liaWxpdHlLbm93bikgcmV0dXJuO1xuICBjb25zdCBlbnRyaWVzID0gYXdhaXQgZnMucmVhZGRpcih3b3JrZmxvd3NQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkuY2F0Y2goKGVycm9yOiBOb2RlSlMuRXJybm9FeGNlcHRpb24pID0+IHtcbiAgICBpZiAoZXJyb3IuY29kZSA9PT0gJ0VOT0VOVCcpIHJldHVybiBbXTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfSk7XG4gIGZvciAoY29uc3QgeyBuYW1lOiBmaWxlTmFtZSB9IG9mIGVudHJpZXMuZmlsdGVyKChlbnRyeSkgPT4gZW50cnkuaXNGaWxlKCkgJiYgL1xcLnlhP21sJC91LnRlc3QoZW50cnkubmFtZSkpKSB7XG4gICAgY29uc3Qgd29ya2Zsb3cgPSB3b3JrZmxvd1NjaGVtYS5wYXJzZSh5YW1sLmxvYWQoYXdhaXQgZnMucmVhZEZpbGUocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsIGZpbGVOYW1lKSwgJ3V0ZjgnKSkpO1xuICAgIGZvciAoY29uc3QgW2pvYk5hbWUsIGpvYl0gb2YgT2JqZWN0LmVudHJpZXMod29ya2Zsb3cuam9icykpIHtcbiAgICAgIGlmICgham9iPy5bJ3J1bnMtb24nXSkgY29udGludWU7XG4gICAgICBjb25zdCBydW5uZXIgPSBqb2JbJ3J1bnMtb24nXTtcbiAgICAgIGlmIChpc1NlbGZIb3N0ZWQocnVubmVyKSkgY29udGludWU7XG4gICAgICBjb25zdCBtYXRjaCA9IHR5cGVvZiBydW5uZXIgPT09ICdzdHJpbmcnICYmIC9eXFwkXFx7XFx7XFxzKm1hdHJpeFxcLihcXHcrKVxccypcXH1cXH0kL3UuZXhlYyhydW5uZXIpO1xuICAgICAgY29uc3QgY2FuZGlkYXRlczogdW5rbm93bltdID0gW107XG4gICAgICBpZiAobWF0Y2ggJiYgam9iLnN0cmF0ZWd5KSB7XG4gICAgICAgIGNvbnN0IGtleSA9IG1hdGNoWzFdITtcbiAgICAgICAgY29uc3QgbWF0cml4ID0gam9iLnN0cmF0ZWd5Lm1hdHJpeDtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gei5hcnJheSh6LnVua25vd24oKSkuc2FmZVBhcnNlKG1hdHJpeFtrZXldKTtcbiAgICAgICAgaWYgKHZhbHVlcy5zdWNjZXNzKSBjYW5kaWRhdGVzLnB1c2goLi4udmFsdWVzLmRhdGEpO1xuICAgICAgICBjb25zdCBpbmNsdWRlID0gei5hcnJheSh6LnJlY29yZCh6LnN0cmluZygpLCB6LnVua25vd24oKSkpLnNhZmVQYXJzZShtYXRyaXguaW5jbHVkZSk7XG4gICAgICAgIGlmIChpbmNsdWRlLnN1Y2Nlc3MpXG4gICAgICAgICAgY2FuZGlkYXRlcy5wdXNoKC4uLmluY2x1ZGUuZGF0YS5tYXAoKHJvdykgPT4gcm93W2tleV0pLmZpbHRlcigodmFsdWUpID0+IHZhbHVlICE9PSB1bmRlZmluZWQpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhbmRpZGF0ZXMucHVzaChydW5uZXIpO1xuICAgICAgfVxuICAgICAgY29uc3QgYWxsb3dlZCA9XG4gICAgICAgIGNhbmRpZGF0ZXMubGVuZ3RoID4gMCAmJlxuICAgICAgICBjYW5kaWRhdGVzLmV2ZXJ5KFxuICAgICAgICAgIChjYW5kaWRhdGUpID0+XG4gICAgICAgICAgICBpc1NlbGZIb3N0ZWQoY2FuZGlkYXRlKSB8fFxuICAgICAgICAgICAgKGNvbmZpZy5yZXBvc2l0b3J5Py50b0xvd2VyQ2FzZSgpID09PSAnZ2l0aHViOndpbGxib29zdGVyL2NoZWVybGluZ3MnICYmXG4gICAgICAgICAgICAgIGZpbGVOYW1lID09PSAnYnVpbGQtZGVza3RvcC1hcHBzLnltbCcgJiZcbiAgICAgICAgICAgICAgam9iTmFtZSA9PT0gJ2J1aWxkJyAmJlxuICAgICAgICAgICAgICBjYW5kaWRhdGUgPT09ICd3aW5kb3dzLWxhdGVzdCcpXG4gICAgICAgICk7XG4gICAgICBpZiAoIWFsbG93ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGAke2ZpbGVOYW1lfTogam9icy4ke2pvYk5hbWV9LnJ1bnMtb24gbXVzdCBzZWxlY3Qgc2VsZi1ob3N0ZWQgcnVubmVycyBpbiBhIHByaXZhdGUgcmVwb3NpdG9yeS4gRml4IHRoZSB3b3JrZmxvdyBiZWZvcmUgcnVubmluZyB3YmZ5LmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNTZWxmSG9zdGVkKHJ1bm5lcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICBjb25zdCBsYWJlbHMgPSBydW5uZXJTY2hlbWEuc2FmZVBhcnNlKHJ1bm5lcik7XG4gIGlmICghbGFiZWxzLnN1Y2Nlc3MpIHJldHVybiBmYWxzZTtcbiAgaWYgKEFycmF5LmlzQXJyYXkobGFiZWxzLmRhdGEpKSByZXR1cm4gbGFiZWxzLmRhdGEuaW5jbHVkZXMoJ3NlbGYtaG9zdGVkJyk7XG4gIHJldHVybiBsYWJlbHMuZGF0YSA9PT0gJ3NlbGYtaG9zdGVkJztcbn1cbiIsIi8vIEdpdEh1YiBBY3Rpb25zIHZhbHVlbGVzcyBldmVudHMgc3VjaCBhcyBgcHVsbF9yZXF1ZXN0OmAgcmVxdWlyZSBZQU1MIG51bGwgdmFsdWVzLlxuLyogZXNsaW50LWRpc2FibGUgdW5pY29ybi9uby1udWxsICovXG5cbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0ICogYXMgeWFtbCBmcm9tICdqcy15YW1sJztcbmltcG9ydCB7IHogfSBmcm9tICd6b2QnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgaGFzRm5veFN5bmNGYWlsZWQsIHJlc29sdmVGbm94Q2lBZ2VLZXlTZWNyZXROYW1lIH0gZnJvbSAnLi9mbm94VG9tbC5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBjb21iaW5lTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgbW92ZVRvQm90dG9tLCBzb3J0S2V5cyB9IGZyb20gJy4uL3V0aWxzL29iamVjdFV0aWwuanMnO1xuaW1wb3J0IHsgcmVwb1Jlc29sdmVzUHJpdmF0ZVBhY2thZ2VzIH0gZnJvbSAnLi4vdXRpbHMvcHJpdmF0ZVBhY2thZ2VzLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgYXNzZXJ0UHJpdmF0ZVdvcmtmbG93UnVubmVycyB9IGZyb20gJy4vd29ya2Zsb3dSdW5uZXJQb2xpY3kuanMnO1xuXG5pbnRlcmZhY2UgV29ya2Zsb3cge1xuICBuYW1lPzogc3RyaW5nO1xuICBvbj86IE9uO1xuICBjb25jdXJyZW5jeT86IENvbmN1cnJlbmN5O1xuICBwZXJtaXNzaW9ucz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIGpvYnM6IFJlY29yZDxzdHJpbmcsIEpvYj47XG59XG5cbmludGVyZmFjZSBDb25jdXJyZW5jeSB7XG4gIGdyb3VwOiBzdHJpbmc7XG4gICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiBib29sZWFuO1xuICBxdWV1ZT86ICdzaW5nbGUnIHwgJ21heCc7XG59XG5cbmludGVyZmFjZSBPbiB7XG4gIC8vIEdpdEh1YiBBY3Rpb25zIHRyZWF0cyBgZXZlbnQ6IG51bGxgIGFzIGEgdmFsdWVsZXNzIGV2ZW50IG1hcHBpbmcsIGUuZy5cbiAgLy8gYHB1bGxfcmVxdWVzdDpgLiBgdW5kZWZpbmVkYCB3b3VsZCBvbWl0IHRoZSBldmVudCBlbnRpcmVseSB3aGVuIGR1bXBpbmcgWUFNTC5cbiAgaXNzdWVzPzogVHlwZXMgfCBudWxsO1xuICBwdWxsX3JlcXVlc3Q/OiBQdWxsUmVxdWVzdCB8IG51bGw7XG4gIHB1bGxfcmVxdWVzdF90YXJnZXQ/OiBUeXBlcyB8IG51bGw7XG4gIHB1c2g/OiBQdXNoO1xuICBzY2hlZHVsZT86IFNjaGVkdWxlW107XG4gIHdvcmtmbG93X2Rpc3BhdGNoPzogbnVsbDtcbn1cblxuaW50ZXJmYWNlIFB1bGxSZXF1ZXN0IHtcbiAgJ3BhdGhzLWlnbm9yZSc/OiBzdHJpbmdbXTtcbiAgdHlwZXM/OiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIFB1c2gge1xuICBicmFuY2hlczogc3RyaW5nW107XG4gICdwYXRocy1pZ25vcmUnPzogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBTY2hlZHVsZSB7XG4gIGNyb246IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFR5cGVzIHtcbiAgdHlwZXM6IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgSm9iIHtcbiAgJ3J1bnMtb24nPzogc3RyaW5nO1xuICBlbnY/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBwZXJtaXNzaW9ucz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIHN0ZXBzPzogU3RlcFtdO1xuICB1c2VzPzogc3RyaW5nO1xuICBpZj86IHN0cmluZztcbiAgc2VjcmV0cz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgJ2luaGVyaXQnO1xuICB3aXRoPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbmludGVyZmFjZSBTdGVwIHtcbiAgdXNlcz86IHN0cmluZztcbiAgd2l0aD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBydW4/OiBzdHJpbmc7XG59XG5cbmNvbnN0IHdvcmtmbG93cyA9IHtcbiAgdGVzdDoge1xuICAgIG5hbWU6ICdUZXN0JyxcbiAgICBvbjoge1xuICAgICAgcHVsbF9yZXF1ZXN0OiBudWxsLFxuICAgICAgcHVzaDoge1xuICAgICAgICBicmFuY2hlczogWydtYWluJ10sXG4gICAgICB9LFxuICAgICAgLy8gTGV0IG1haW50YWluZXJzIHJlLXJ1biB0aGUgdGVzdHMgYnkgaGFuZC5cbiAgICAgIHdvcmtmbG93X2Rpc3BhdGNoOiBudWxsLFxuICAgIH0sXG4gICAgLy8gY2YuIGh0dHBzOi8vZG9jcy5naXRodWIuY29tL2VuL2FjdGlvbnMvdXNpbmctam9icy91c2luZy1jb25jdXJyZW5jeSNleGFtcGxlLW9ubHktY2FuY2VsLWluLXByb2dyZXNzLWpvYnMtb3ItcnVucy1mb3ItdGhlLWN1cnJlbnQtd29ya2Zsb3dcbiAgICBjb25jdXJyZW5jeToge1xuICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19LSR7eyBnaXRodWIucmVmIH19JyxcbiAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiB0cnVlLFxuICAgIH0sXG4gICAgLy8gTm9uZSBvZiB0aGVzZSBtYXkgYmUgbmFycm93ZWQganVzdCBiZWNhdXNlIHRoZSByZXVzYWJsZSB0ZXN0IHdvcmtmbG93IG5ldmVyIHB1c2hlczpcbiAgICBwZXJtaXNzaW9uczoge1xuICAgICAgLy8gZm9yIHRoZSB0ZXN0IGpvYidzIHNraXAtZHVwbGljYXRlLWFjdGlvbnMgY2FsbCB3aXRoIGNhbmNlbF9vdGhlcnM6IHRydWUgKHRoZSByZXVzYWJsZVxuICAgICAgLy8gdGVzdCB3b3JrZmxvdyBkZWNsYXJlcyBubyBwZXJtaXNzaW9ucyBvZiBpdHMgb3duLCBzbyBpdHMgam9icyBydW4gb24gdGhpcyB0b2tlbilcbiAgICAgIGFjdGlvbnM6ICd3cml0ZScsXG4gICAgICAvLyBmb3IgYHNlbWFudGljLXJlbGVhc2UgLS1kcnktcnVuYCwgd2hpY2ggZG9lcyBhIGBnaXQgcHVzaCAtLWRyeS1ydW5gIHRvIHZlcmlmeSB3cml0ZVxuICAgICAgLy8gYWNjZXNzIGFuZCBhYm9ydHMgd2l0aCBFR0lUTk9QRVJNSVNTSU9OIHdpdGhvdXQgaXRcbiAgICAgIGNvbnRlbnRzOiAnd3JpdGUnLFxuICAgICAgLy8gZm9yIHBrZy1wcmVmbGlnaHQgUFIgZmlsZSBsaXN0aW5nXG4gICAgICAncHVsbC1yZXF1ZXN0cyc6ICdyZWFkJyxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgIHRlc3Q6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy90ZXN0LnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ3Rlc3QtcnVzdCc6IHtcbiAgICBuYW1lOiAnVGVzdCBSdXN0JyxcbiAgICBvbjoge1xuICAgICAgcHVsbF9yZXF1ZXN0OiBudWxsLFxuICAgICAgcHVzaDoge1xuICAgICAgICBicmFuY2hlczogWydtYWluJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgY29uY3VycmVuY3k6IHtcbiAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fS0ke3sgZ2l0aHViLnJlZiB9fScsXG4gICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogdHJ1ZSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgICd0ZXN0LXJ1c3QnOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvdGVzdC1ydXN0LnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgcmVsZWFzZToge1xuICAgIG5hbWU6ICdSZWxlYXNlJyxcbiAgICBvbjoge1xuICAgICAgcHVzaDoge1xuICAgICAgICBicmFuY2hlczogW10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgLy8gYHF1ZXVlOiBtYXhgIGhlcmUgdG9vICgjOTc0KTogR2l0SHViJ3MgZGVmYXVsdCBxdWV1ZSAoYHNpbmdsZWApIGNhbmNlbHMgYW4gYWxyZWFkeS1QRU5ESU5HXG4gICAgLy8gY2FsbGVyIHJ1biB3aGVuIGFub3RoZXIgb25lIHF1ZXVlcyDigJQgYmVmb3JlIGl0cyBqb2IgKGFuZCB0aGUgcmV1c2FibGUgd29ya2Zsb3cncyBvd25cbiAgICAvLyBqb2ItbGV2ZWwgYHF1ZXVlOiBtYXhgKSBldmVyIHN0YXJ0cyDigJQgc2lsZW50bHkgZHJvcHBpbmcgdGhhdCByZWxlYXNlIHRyaWdnZXIuXG4gICAgLy8gVGhlIGNhbGxlci1sZXZlbCBncm91cCBtdXN0IE5PVCByZXVzZSB0aGUgcmV1c2FibGUgd29ya2Zsb3cncyBqb2ItbGV2ZWwgZ3JvdXAgbmFtZVxuICAgIC8vIChgcmVsZWFzZS0ke3sgZ2l0aHViLnJlcG9zaXRvcnkgfX1gKTogd29ya2Zsb3ctbGV2ZWwgYW5kIGpvYi1sZXZlbCBncm91cHMgc2hhcmUgb25lXG4gICAgLy8gcmVwb3NpdG9yeS13aWRlIG5hbWVzcGFjZSwgYW5kIGlkZW50aWNhbCBuYW1lcyBkZWFkbG9jayB0aGUgcnVuIChcIkNhbmNlbGluZyBzaW5jZSBhXG4gICAgLy8gZGVhZGxvY2sgZm9yIGNvbmN1cnJlbmN5IGdyb3VwIC4uLiB3YXMgZGV0ZWN0ZWQgYmV0d2VlbiAndG9wIGxldmVsIHdvcmtmbG93JyBhbmQgJzxqb2I+J1wiKS5cbiAgICBjb25jdXJyZW5jeToge1xuICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19JyxcbiAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiBmYWxzZSxcbiAgICAgIHF1ZXVlOiAnbWF4JyxcbiAgICB9LFxuICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAvLyBodHRwczovL2RvY3MubnBtanMuY29tL3RydXN0ZWQtcHVibGlzaGVycyNzdGVwLTItY29uZmlndXJlLXlvdXItY2ljZC13b3JrZmxvd1xuICAgICAgJ2lkLXRva2VuJzogJ3dyaXRlJyxcbiAgICAgIC8vIGZvciBzZW1hbnRpYy1yZWxlYXNlXG4gICAgICBjb250ZW50czogJ3dyaXRlJyxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgIHJlbGVhc2U6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9yZWxlYXNlLnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ3NlbWFudGljLXByJzoge1xuICAgIG5hbWU6ICdMaW50IFBSIHRpdGxlJyxcbiAgICBvbjoge1xuICAgICAgcHVsbF9yZXF1ZXN0X3RhcmdldDoge1xuICAgICAgICB0eXBlczogWydvcGVuZWQnLCAnZWRpdGVkJywgJ3N5bmNocm9uaXplJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ3NlbWFudGljLXByJzoge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3NlbWFudGljLXByLnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgc3luYzoge1xuICAgIG5hbWU6ICdTeW5jJyxcbiAgICBvbjoge30sXG4gICAgcGVybWlzc2lvbnM6IHtcbiAgICAgIC8vIGZvciBjb21taXRpbmcgY2hhbmdlc1xuICAgICAgY29udGVudHM6ICd3cml0ZScsXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICBzeW5jOiB7IHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3Mvc3luYy55bWxAbWFpbicgfSxcbiAgICB9LFxuICB9LFxuICAnY2xvc2UtY29tbWVudCc6IHtcbiAgICBuYW1lOiAnQWRkIGNsb3NlIGNvbW1lbnQnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3Q6IHtcbiAgICAgICAgdHlwZXM6IFsnb3BlbmVkJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ2Nsb3NlLWNvbW1lbnQnOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvY2xvc2UtY29tbWVudC55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG59IGFzIGNvbnN0O1xuXG50eXBlIEtub3duS2luZCA9IGtleW9mIHR5cGVvZiB3b3JrZmxvd3MgfCAnZGVwbG95JztcblxuLyoqXG4gKiBQYXJzZXMgYSBgdXNlczpgIHZhbHVlIGNhbGxpbmcgb25lIG9mIFdpbGxCb29zdGVyJ3Mgb3duIHJldXNhYmxlIHdvcmtmbG93cyAob3IgdGhlXG4gKiBXaWxsQm9vc3RlckxhYiBzeW5jIG1pcnJvcikgaW50byB0aGUgd29ya2Zsb3cgbmFtZSAod2l0aG91dCBleHRlbnNpb24pIGFuZCBnaXQgcmVmLiBPbmx5IHRob3NlXG4gKiBmb2xsb3cgdGhlIGNvbnRyYWN0IHdiZnkgZW5mb3JjZXMg4oCUIGNhbGxlcnMgb2YgYW5vdGhlciBvcmdhbml6YXRpb24ncyBzYW1lLW5hbWVkIHJlcG9zaXRvcnkgYXJlXG4gKiBsZWZ0IGFsb25lLiBHaXRIdWIgdHJlYXRzIG93bmVyL3JlcG9zaXRvcnkgbmFtZXMgY2FzZS1pbnNlbnNpdGl2ZWx5LCBzbyB0aGUgY29tcGFyaXNvbiBkb2VzXG4gKiB0b28sIHdoaWxlIHRoZSB3b3JrZmxvdyBwYXRoIGFuZCByZWYgc3RheSBjYXNlLXNlbnNpdGl2ZS5cbiAqL1xuZnVuY3Rpb24gcGFyc2VPcmdSZXVzYWJsZVdvcmtmbG93Q2FsbChcbiAgdXNlczogc3RyaW5nIHwgdW5kZWZpbmVkXG4pOiB7IHdvcmtmbG93TmFtZTogc3RyaW5nOyBleHRlbnNpb246IHN0cmluZzsgcmVmOiBzdHJpbmcgfSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IG1hdGNoID0gL14oW14vXSspXFwvKFteL10rKVxcL1xcLmdpdGh1YlxcL3dvcmtmbG93c1xcLyhbXi9AXSs/KVxcLih5YT9tbClAKC4rKSQvdS5leGVjKHVzZXMgPz8gJycpO1xuICBpZiAoIW1hdGNoKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBvd25lciA9IG1hdGNoWzFdIS50b0xvd2VyQ2FzZSgpO1xuICBpZiAoKG93bmVyICE9PSAnd2lsbGJvb3N0ZXInICYmIG93bmVyICE9PSAnd2lsbGJvb3N0ZXJsYWInKSB8fCBtYXRjaFsyXSEudG9Mb3dlckNhc2UoKSAhPT0gJ3JldXNhYmxlLXdvcmtmbG93cycpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiB7IHdvcmtmbG93TmFtZTogbWF0Y2hbM10hLCBleHRlbnNpb246IG1hdGNoWzRdISwgcmVmOiBtYXRjaFs1XSEgfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlV29ya2Zsb3dzKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFyb290Q29uZmlnLmlzUmVwb1Zpc2liaWxpdHlLbm93bikge1xuICAgIGNvbnNvbGUud2FybignU2tpcHBlZCB3b3JrZmxvdyBnZW5lcmF0aW9uIGJlY2F1c2UgcmVwb3NpdG9yeSB2aXNpYmlsaXR5IGlzIHVua25vd24uJyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHdvcmtmbG93c1BhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicsICd3b3JrZmxvd3MnKTtcbiAgaWYgKCFpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyhyb290Q29uZmlnLnJlcG9zaXRvcnkpICYmIChhd2FpdCBmc1V0aWwuaXNDb25maW5lZFdyaXRhYmxlUGF0aCh3b3JrZmxvd3NQYXRoKSkpIHtcbiAgICBhd2FpdCBhc3NlcnRQcml2YXRlV29ya2Zsb3dSdW5uZXJzKHJvb3RDb25maWcsIHdvcmtmbG93c1BhdGgpO1xuICB9XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVXb3JrZmxvdycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8ocm9vdENvbmZpZy5yZXBvc2l0b3J5KSkge1xuICAgICAgLy8gRG9uJ3QgdG91Y2ggcmV1c2FibGUtd29ya2Zsb3dzIHJlcG8gYmVjYXVzZSBpdCBob3N0cyB1cHN0cmVhbSB3b3JrZmxvdyBkZWZpbml0aW9ucy5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBXaXRoIC5naXRodWIgb3IgLmdpdGh1Yi93b3JrZmxvd3Mgc3ltbGlua2VkIG91dHNpZGUgdGhlIHJlcG9zaXRvcnksIHdyaXRlWWFtbCdzIGd1YXJkc1xuICAgIC8vIGFscmVhZHkgcmVmdXNlIHRoZSB3cml0ZXMsIGJ1dCByZWFkZGlyL3JtIGJlbG93IHdvdWxkIHN0aWxsIGVudW1lcmF0ZSBhbmQgREVMRVRFIGZpbGVzXG4gICAgLy8gb3V0c2lkZSB0aGUgcmVwb3NpdG9yeSDigJQgc28gcmVxdWlyZSB0aGUgZGlyZWN0b3J5IHRvIHJlc29sdmUgaW5zaWRlIGl0IGJlZm9yZSBhbnlcbiAgICAvLyB0cmF2ZXJzYWwsIG1rZGlyLCBvciBjbGVhbnVwLlxuICAgIGlmICghKGF3YWl0IGZzVXRpbC5pc0NvbmZpbmVkV3JpdGFibGVQYXRoKHdvcmtmbG93c1BhdGgpKSkge1xuICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIGdlbmVyYXRpbmcgd29ya2Zsb3dzIGJlY2F1c2UgJHt3b3JrZmxvd3NQYXRofSByZXNvbHZlcyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2Rpcih3b3JrZmxvd3NQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIGNvbnN0IGVudHJpZXMgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKHdvcmtmbG93c1BhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICAvLyB3YmZ5IHdyaXRlcyAueW1sIHdvcmtmbG93cywgc28gZWFjaCBraW5kIG1hcHMgdG8gaXRzIC55bWwgZmlsZS5cbiAgICBjb25zdCBmaWxlTmFtZXNCeUtpbmQgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgaWYgKCFlbnRyeS5pc0ZpbGUoKSB8fCAhZW50cnkubmFtZS5lbmRzV2l0aCgnLnltbCcpKSBjb250aW51ZTtcbiAgICAgIGZpbGVOYW1lc0J5S2luZC5zZXQoZW50cnkubmFtZS5zbGljZSgwLCAtJy55bWwnLmxlbmd0aCksIGVudHJ5Lm5hbWUpO1xuICAgIH1cbiAgICBjb25zdCBtYW5kYXRvcnlLaW5kcyA9IFsndGVzdCcsICdzZW1hbnRpYy1wcicsICdjbG9zZS1jb21tZW50J107XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLnNlbWFudGljUmVsZWFzZSkge1xuICAgICAgbWFuZGF0b3J5S2luZHMucHVzaCgncmVsZWFzZScpO1xuICAgIH1cbiAgICBpZiAocm9vdENvbmZpZy5jYXJnb1RvbWxEaXJQYXRocy5sZW5ndGggPiAwKSB7XG4gICAgICBtYW5kYXRvcnlLaW5kcy5wdXNoKCd0ZXN0LXJ1c3QnKTtcbiAgICB9XG4gICAgLy8gQSBwcmV2aW91cyBydW4gbWF5IGhhdmUgbWlzdGFrZW4gYSBnaXRpZ25vcmVkIHRoaXJkLXBhcnR5IGNoZWNrb3V0IGZvciByZXBvc2l0b3J5IFJ1c3QgY29kZS5cbiAgICAvLyBSZW1vdmUgb25seSB0aGUgZ2VuZXJhdGVkLXN0eWxlIGNhbGxlcjogYSBzYW1lLW5hbWVkIGN1c3RvbSB3b3JrZmxvdyB3aXRoIGFueSBvdGhlciBqb2Igc3RheXMuXG4gICAgaWYgKHJvb3RDb25maWcuY2FyZ29Ub21sRGlyUGF0aHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zdCB0ZXN0UnVzdEZpbGVOYW1lID0gZmlsZU5hbWVzQnlLaW5kLmdldCgndGVzdC1ydXN0Jyk7XG4gICAgICBpZiAodGVzdFJ1c3RGaWxlTmFtZSAmJiBqb2JzQWxsQ2FsbFJldXNhYmxlV29ya2Zsb3cod29ya2Zsb3dzUGF0aCwgdGVzdFJ1c3RGaWxlTmFtZSwgJ3Rlc3QtcnVzdCcpKSB7XG4gICAgICAgIGZpbGVOYW1lc0J5S2luZC5kZWxldGUoJ3Rlc3QtcnVzdCcpO1xuICAgICAgICBhd2FpdCBmc1V0aWwucmVtb3ZlQ29uZmluZWQocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsIHRlc3RSdXN0RmlsZU5hbWUpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZmlsZU5hbWVzQnlLaW5kLmRlbGV0ZSgnd2JmeScpO1xuICAgIGZvciAoY29uc3Qga2luZCBvZiBtYW5kYXRvcnlLaW5kcykge1xuICAgICAgaWYgKCFmaWxlTmFtZXNCeUtpbmQuaGFzKGtpbmQpKSB7XG4gICAgICAgIGZpbGVOYW1lc0J5S2luZC5zZXQoa2luZCwgYCR7a2luZH0ueW1sYCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChmaWxlTmFtZXNCeUtpbmQuaGFzKCdzeW5jJykpIHtcbiAgICAgIC8vIFRoZSBzeW5jIHdvcmtmbG93J3MgZ2VuZXJhdGlvbiBvd25zIHRoZSBmb3JjZS1zeW5jIHdvcmtmbG93LCBzbyBwcm9jZXNzaW5nIGl0IGFzIGFuXG4gICAgICAvLyBpbmRlcGVuZGVudCBraW5kIHdvdWxkIHJhY2UgY29uY3VycmVudCB3cml0ZXMgb24gdGhlIHNhbWUgcGF0aC5cbiAgICAgIGZpbGVOYW1lc0J5S2luZC5kZWxldGUoJ3N5bmMtZm9yY2UnKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtraW5kLCBmaWxlTmFtZV0gb2YgZmlsZU5hbWVzQnlLaW5kKSB7XG4gICAgICAvLyDlrp/pmpvjga9Lbm93bktpbmTku6XlpJbjga7lgKTjgoLku6PlhaXjgZXjgozjgovjgZPjgajjgavms6jmhI9cbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiB3cml0ZVdvcmtmbG93WWFtbChyb290Q29uZmlnLCB3b3JrZmxvd3NQYXRoLCBraW5kIGFzIEtub3duS2luZCwgZmlsZU5hbWUpKTtcbiAgICB9XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8ocmVwb3NpdG9yeT86IHN0cmluZyk6IGJvb2xlYW4ge1xuICAvLyBDYXNlLWluc2Vuc2l0aXZlOiBHaXRIdWIgcmVwb3NpdG9yeSBuYW1lcyBhcmUsIGFuZCBhIHJlbW90ZSBtYXkgc3BlbGwgdGhpcyBvbmUgYW55IHdheS4gR2V0dGluZyBpdCB3cm9uZ1xuICAvLyBsZXRzIHdiZnkgcmV3cml0ZSB0aGUgcmVwb3NpdG9yeSB0aGF0IGhvc3RzIHRoZSB1cHN0cmVhbSB3b3JrZmxvdyBkZWZpbml0aW9ucy5cbiAgcmV0dXJuIHJlcG9zaXRvcnk/LnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoJy9yZXVzYWJsZS13b3JrZmxvd3MnKSA/PyBmYWxzZTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGV2ZXJ5IGpvYiBvZiB0aGUgd29ya2Zsb3cgZmlsZSBjYWxscyB0aGUgbmFtZWQgV2lsbEJvb3N0ZXIgcmV1c2FibGUgd29ya2Zsb3cgKG93bmVyXG4gKiByZXN0cmljdGVkIHZpYSBwYXJzZU9yZ1JldXNhYmxlV29ya2Zsb3dDYWxsKS4gVXNlZCB0byBkZWNpZGUgd2hldGhlciB3YmZ5IG93bnMgYSBmaWxlIGVub3VnaCB0b1xuICogZGVsZXRlIGl0OiB1bnBhcnNhYmxlIGZpbGVzIGFuZCBmaWxlcyB3aXRoIGFueSBvdGhlciBqb2IgcmV0dXJuIGZhbHNlIOKAlCBkZWxldGluZyBhIHdob2xlXG4gKiB3b3JrZmxvdyBvbiBhIGxvb3NlIG1hdGNoIHdvdWxkIGJlIHRvbyBhZ2dyZXNzaXZlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gam9ic0FsbENhbGxSZXVzYWJsZVdvcmtmbG93KHdvcmtmbG93c1BhdGg6IHN0cmluZywgZmlsZU5hbWU6IHN0cmluZywgd29ya2Zsb3dOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKCFmaWxlTmFtZS5lbmRzV2l0aCgnLnltbCcpKSByZXR1cm4gZmFsc2U7XG4gIGxldCBjb250ZW50OiBzdHJpbmc7XG4gIHRyeSB7XG4gICAgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgZmlsZU5hbWUpLCAndXRmOCcpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgaXNUYXJnZXRDYWxsID0gKHVzZXM6IHVua25vd24pOiBib29sZWFuID0+XG4gICAgdHlwZW9mIHVzZXMgPT09ICdzdHJpbmcnICYmIHBhcnNlT3JnUmV1c2FibGVXb3JrZmxvd0NhbGwodXNlcyk/LndvcmtmbG93TmFtZSA9PT0gd29ya2Zsb3dOYW1lO1xuICB0cnkge1xuICAgIGNvbnN0IHdvcmtmbG93ID0geWFtbC5sb2FkKGNvbnRlbnQpIGFzIFdvcmtmbG93IHwgdW5kZWZpbmVkO1xuICAgIGlmICh3b3JrZmxvdyAmJiB0eXBlb2Ygd29ya2Zsb3cgPT09ICdvYmplY3QnICYmIHdvcmtmbG93LmpvYnMgJiYgdHlwZW9mIHdvcmtmbG93LmpvYnMgPT09ICdvYmplY3QnKSB7XG4gICAgICBjb25zdCBqb2JzID0gT2JqZWN0LnZhbHVlcyh3b3JrZmxvdy5qb2JzKTtcbiAgICAgIHJldHVybiBqb2JzLmxlbmd0aCA+IDAgJiYgam9icy5ldmVyeSgoam9iKSA9PiBpc1RhcmdldENhbGwoam9iPy51c2VzKSk7XG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICAvLyBVbnBhcnNhYmxlIGNvbnRlbnQgaXMgbm90IHByb3ZhYmx5IGEgY2FsbGVyIG9mIHRoZSBuYW1lZCB3b3JrZmxvdy5cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlV29ya2Zsb3dZYW1sKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHdvcmtmbG93c1BhdGg6IHN0cmluZyxcbiAga2luZDogS25vd25LaW5kLFxuICBmaWxlTmFtZSA9IGAke2tpbmR9LnltbGBcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCBmaWxlTmFtZSk7XG4gIGNvbnN0IGRlcGxveVByb2R1Y3Rpb25GaWxlTmFtZSA9IGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsICdkZXBsb3ktcHJvZHVjdGlvbi55bWwnKSlcbiAgICA/ICdkZXBsb3ktcHJvZHVjdGlvbi55bWwnXG4gICAgOiB1bmRlZmluZWQ7XG5cbiAgLy8gQSBub24tZ2VuZXJhdGVkIHRlc3QtcnVzdC55bWwgaW4gYSByZXBvIHdpdGhvdXQgUnVzdCBjb2RlIG1lcmVseSBzaGFyZXMgdGhlIG5hbWU7IGxlYXZlIGl0IGFsb25lLlxuICBpZiAoa2luZCA9PT0gJ3Rlc3QtcnVzdCcgJiYgY29uZmlnLmNhcmdvVG9tbERpclBhdGhzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gIGxldCBuZXdTZXR0aW5ncyA9IHN0cnVjdHVyZWRDbG9uZShraW5kIGluIHdvcmtmbG93cyA/IHdvcmtmbG93c1traW5kIGFzIGtleW9mIHR5cGVvZiB3b3JrZmxvd3NdIDoge30pIGFzIFdvcmtmbG93O1xuICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpO1xuICBpZiAob2xkQ29udGVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgbGV0IG9sZFNldHRpbmdzOiBXb3JrZmxvdztcbiAgICB0cnkge1xuICAgICAgb2xkU2V0dGluZ3MgPSB5YW1sLmxvYWQob2xkQ29udGVudCkgYXMgV29ya2Zsb3c7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBBbiBleGlzdGluZyB3b3JrZmxvdyB3YmZ5IGNhbm5vdCBwYXJzZSBtdXN0IGJlIGxlZnQgdW50b3VjaGVkOiB3cml0aW5nIHRoZSB0ZW1wbGF0ZVxuICAgICAgLy8gd2l0aG91dCBtZXJnaW5nIHdvdWxkIHNpbGVudGx5IGRpc2NhcmQgdGhlIHJlcG9zaXRvcnkncyB3b3JrZmxvdy5cbiAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCBnZW5lcmF0aW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgdGhlIGV4aXN0aW5nIGNvbnRlbnQgaXMgbm90IHBhcnNhYmxlIGFzIFlBTUwuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIHlhbWwubG9hZCByZXR1cm5zIHVuZGVmaW5lZCBmb3IgZW1wdHkvY29tbWVudC1vbmx5IGZpbGVzIGFuZCBub24tb2JqZWN0cyBmb3Igc2NhbGFyXG4gICAgLy8gZG9jdW1lbnRzIHdpdGhvdXQgdGhyb3dpbmc7IGRlZXBtZXJnZSB3b3VsZCBjcmFzaCBvbiB0aGVtLlxuICAgIGlmICh0eXBlb2Ygb2xkU2V0dGluZ3MgIT09ICdvYmplY3QnIHx8IG9sZFNldHRpbmdzID09PSBudWxsIHx8IEFycmF5LmlzQXJyYXkob2xkU2V0dGluZ3MpKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgZ2VuZXJhdGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIHRoZSBleGlzdGluZyBjb250ZW50IGlzIG5vdCBhIHdvcmtmbG93LmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHsgYXJyYXlNZXJnZTogY29tYmluZU1lcmdlIH0pIGFzIFdvcmtmbG93O1xuICB9XG5cbiAgaWYgKCEoJ2pvYnMnIGluIG5ld1NldHRpbmdzKSkgcmV0dXJuO1xuXG4gIGlmIChraW5kLnN0YXJ0c1dpdGgoJ2RlcGxveScpKSB7XG4gICAgbmV3U2V0dGluZ3MgPSB7XG4gICAgICAuLi5uZXdTZXR0aW5ncyxcbiAgICAgIC8vIFVubGlrZSB0aGUgcmVsZWFzZSBjYWxsZXIsIHRoZSBkZWZhdWx0IHF1ZXVlIChgc2luZ2xlYCkgaXMgaW50ZW50aW9uYWwgaGVyZTogYSBwZW5kaW5nXG4gICAgICAvLyBkZXBsb3kgdGhhdCBpcyBjYW5jZWxsZWQgYW5kIHJlcGxhY2VkIGJ5IGEgbmV3ZXIgb25lIGxvc2VzIG5vdGhpbmcg4oCUIHRoZSBuZXdlciBkZXBsb3lcbiAgICAgIC8vIGNvbnZlcmdlcyB0aGUgZW52aXJvbm1lbnQgdG8gdGhlIGxhdGVzdCBzdGF0ZSBhbnl3YXkuXG4gICAgICBjb25jdXJyZW5jeToge1xuICAgICAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0nLFxuICAgICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogZmFsc2UsXG4gICAgICB9LFxuICAgIH07XG4gICAgbW92ZVRvQm90dG9tKG5ld1NldHRpbmdzLCAnam9icycpO1xuICAgIGlmIChuZXdTZXR0aW5ncy5vbj8ucHVzaCkge1xuICAgICAgbmV3U2V0dGluZ3Mub24ucHVzaFsncGF0aHMtaWdub3JlJ10gPSBbXG4gICAgICAgIC4uLm5ldyBTZXQoWycqKi5tZCcsICcqKi9kb2NzLyoqJywgLi4uKG5ld1NldHRpbmdzLm9uLnB1c2hbJ3BhdGhzLWlnbm9yZSddID8/IFtdKV0pLFxuICAgICAgXTtcbiAgICB9XG4gIH1cblxuICBpZiAoa2luZCA9PT0gJ3JlbGVhc2UnICYmIG5ld1NldHRpbmdzLmpvYnMucmVsZWFzZSAmJiBkZXBsb3lQcm9kdWN0aW9uRmlsZU5hbWUpIHtcbiAgICBuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucyA/Pz0ge307XG4gICAgbmV3U2V0dGluZ3MucGVybWlzc2lvbnMuYWN0aW9ucyA9ICd3cml0ZSc7XG4gICAgbmV3U2V0dGluZ3Muam9icy5yZWxlYXNlLndpdGggPz89IHt9O1xuICAgIG5ld1NldHRpbmdzLmpvYnMucmVsZWFzZS53aXRoLnRyaWdnZXJfZGVwbG95X3dvcmtmbG93ID0gZGVwbG95UHJvZHVjdGlvbkZpbGVOYW1lO1xuICB9XG5cbiAgbGV0IGlzUmV1c2FibGVXb3JrZmxvdyA9IGZhbHNlO1xuICBmb3IgKGNvbnN0IGpvYiBvZiBPYmplY3QudmFsdWVzKG5ld1NldHRpbmdzLmpvYnMpKSB7XG4gICAgLy8gSWdub3JlIGVtcHR5IGpvYnMgKGEgYmFyZSBgam9iTmFtZTpgIHBhcnNlcyBhcyBudWxsKSwgbm9uLXJldXNhYmxlIHdvcmtmbG93cywgYW5kIG90aGVyXG4gICAgLy8gb3JnYW5pemF0aW9ucycgcmV1c2FibGUgd29ya2Zsb3dzOiBhIHNhbWUtbmFtZWQgYHJldXNhYmxlLXdvcmtmbG93c2AgcmVwb3NpdG9yeSBlbHNld2hlcmVcbiAgICAvLyBmb2xsb3dzIGEgZGlmZmVyZW50IGNvbnRyYWN0LCBhbmQgbm9ybWFsaXppbmcgaXRzIGNhbGxlcnMgKHNlY3JldCBpbmplY3Rpb24vcmVtb3ZhbCxcbiAgICAvLyBwZXJtaXNzaW9ucykgY291bGQgYnJlYWsgdGhlbS5cbiAgICBpZiAoIWpvYiB8fCAhcGFyc2VPcmdSZXVzYWJsZVdvcmtmbG93Q2FsbChqb2IudXNlcykpIGNvbnRpbnVlO1xuXG4gICAgbm9ybWFsaXplSm9iKGNvbmZpZywgam9iLCBraW5kKTtcbiAgICBpc1JldXNhYmxlV29ya2Zsb3cgPSB0cnVlO1xuICB9XG4gIGlmICghaXNSZXVzYWJsZVdvcmtmbG93KSByZXR1cm47XG5cbiAgLy8gRGVwbG95IGNhbGxlcnMgbmVlZCBubyByZXBvc2l0b3J5IHdyaXRlczogdGhlIGNhbGxlZCByZXVzYWJsZSB3b3JrZmxvdyBpbmhlcml0cyB0aGUgY2FsbGVyJ3NcbiAgLy8gdG9rZW4gcGVybWlzc2lvbnMsIHJlcG9zaXRvcmllcyBkZWZhdWx0IHRoZSB0b2tlbiB0byB3cml0ZSwgYW5kIHRoZSByZXVzYWJsZSBkZXBsb3kgd29ya2Zsb3dcbiAgLy8gYXQgbWFpbiBwZXJmb3JtcyBubyBHSVRIVUJfVE9LRU4gd3JpdGVzLiBUaGUgcmVhZC1vbmx5IGRlZmF1bHQgaXMgaW5qZWN0ZWQgYXQgdGhlIEpPQiBsZXZlbFxuICAvLyAoam9iIHBlcm1pc3Npb25zIGRvIG5vdCBhZmZlY3Qgc2libGluZyBqb2JzLCBzbyBpbmxpbmUgam9icyBvciBwaW5uZWQgY2FsbGVlcyDigJQgd2hvc2Ugd3JpdGVcbiAgLy8gbmVlZHMgYXJlIHVuYXVkaXRlZCDigJQga2VlcCB0aGVpcnMpLCBhbmQgb25seSB3aGVuIG5laXRoZXIgdGhlIHdvcmtmbG93IG5vciB0aGUgam9iIGRlY2xhcmVzXG4gIC8vIGl0cyBvd24gcGVybWlzc2lvbnMgKE9JREMgZGVwbG95cyBhbHdheXMgZG8sIGZvciBpZC10b2tlbikuIHJ1bi1zY3JpcHQgY2FsbGVycyBhcmUgZXhjbHVkZWRcbiAgLy8gYmVjYXVzZSBhcmJpdHJhcnkgcGFja2FnZSBzY3JpcHRzIG1heSBwdXNoIGNvbW1pdHMuXG4gIGlmICghbmV3U2V0dGluZ3MucGVybWlzc2lvbnMpIHtcbiAgICBmb3IgKGNvbnN0IGpvYiBvZiBPYmplY3QudmFsdWVzKG5ld1NldHRpbmdzLmpvYnMpKSB7XG4gICAgICBpZiAoIWpvYikgY29udGludWU7XG4gICAgICBjb25zdCBjYWxsID0gcGFyc2VPcmdSZXVzYWJsZVdvcmtmbG93Q2FsbChqb2IudXNlcyk7XG4gICAgICBpZiAoIWpvYi5wZXJtaXNzaW9ucyAmJiBjYWxsPy53b3JrZmxvd05hbWUgPT09ICdkZXBsb3knICYmIGNhbGwucmVmID09PSAnbWFpbicpIHtcbiAgICAgICAgam9iLnBlcm1pc3Npb25zID0geyBjb250ZW50czogJ3JlYWQnIH07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc3dpdGNoIChraW5kKSB7XG4gICAgY2FzZSAncmVsZWFzZSc6IHtcbiAgICAgIGlmIChuZXdTZXR0aW5ncy5vbj8uc2NoZWR1bGUpIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLm9uLnB1c2g7XG4gICAgICB9IGVsc2UgaWYgKG5ld1NldHRpbmdzLm9uPy5wdXNoICYmIGNvbmZpZy5yZWxlYXNlLmJyYW5jaGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbmV3U2V0dGluZ3Mub24ucHVzaC5icmFuY2hlcyA9IGNvbmZpZy5yZWxlYXNlLmJyYW5jaGVzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXdhaXQgZnNVdGlsLnJlbW92ZUNvbmZpbmVkKGZpbGVQYXRoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5pc1B1YmxpY1JlcG8pIHtcbiAgICAgICAgbmV3U2V0dGluZ3MucGVybWlzc2lvbnMgPz89IHt9O1xuICAgICAgICBuZXdTZXR0aW5ncy5wZXJtaXNzaW9uc1snaWQtdG9rZW4nXSA9ICd3cml0ZSc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3MucGVybWlzc2lvbnM/LlsnaWQtdG9rZW4nXTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlICd0ZXN0JzpcbiAgICBjYXNlICd0ZXN0LXJ1c3QnOiB7XG4gICAgICAvLyBEb24ndCB1c2UgYHBhdGhzLWlnbm9yZWAgZm9yIHRlc3QgYmVjYXVzZSBHaXRIdWIncyBCcmFuY2ggUHJvdGVjdGlvbiBhbmQgUnVsZXNldHMgcmVxdWlyZSBqb2IgcnVubmluZy5cbiAgICAgIGlmIChuZXdTZXR0aW5ncy5vbj8ucHVsbF9yZXF1ZXN0KSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5vbi5wdWxsX3JlcXVlc3RbJ3BhdGhzLWlnbm9yZSddO1xuICAgICAgfVxuICAgICAgaWYgKG5ld1NldHRpbmdzLm9uPy5wdXNoKSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5vbi5wdXNoWydwYXRocy1pZ25vcmUnXTtcbiAgICAgICAgbmV3U2V0dGluZ3Mub24ucHVzaC5icmFuY2hlcyA9IG5ld1NldHRpbmdzLm9uLnB1c2guYnJhbmNoZXMuZmlsdGVyKChicmFuY2gpID0+IGJyYW5jaCAhPT0gJ3Jlbm92YXRlLyoqJyk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgYXdhaXQgd3JpdGVZYW1sKG5ld1NldHRpbmdzLCBmaWxlUGF0aCk7XG5cbiAgaWYgKGtpbmQgPT09ICdzeW5jJykge1xuICAgIGlmICghbmV3U2V0dGluZ3Muam9icy5zeW5jPy53aXRoKSByZXR1cm47XG5cbiAgICAvLyBHZW5lcmF0ZSB0aGUgZm9yY2Utc3luYyB3b3JrZmxvdyBiYXNlZCBvbiB0aGUgc3luYyB3b3JrZmxvdyBpZiBpdCBleGlzdHMuXG4gICAgbmV3U2V0dGluZ3Muam9ic1snc3luYy1mb3JjZSddID0gbmV3U2V0dGluZ3Muam9icy5zeW5jO1xuICAgIGNvbnN0IHBhcmFtcyA9IG5ld1NldHRpbmdzLmpvYnMuc3luYy53aXRoLnN5bmNfcGFyYW1zX3dpdGhvdXRfZGVzdDtcbiAgICBpZiAodHlwZW9mIHBhcmFtcyAhPT0gJ3N0cmluZycpIHJldHVybjtcblxuICAgIG5ld1NldHRpbmdzLmpvYnMuc3luYy53aXRoLnN5bmNfcGFyYW1zX3dpdGhvdXRfZGVzdCA9IGAtLWZvcmNlICR7cGFyYW1zfWA7XG4gICAgbmV3U2V0dGluZ3MubmFtZSA9ICdGb3JjZSB0byBTeW5jJztcbiAgICBuZXdTZXR0aW5ncy5vbiA9IHsgd29ya2Zsb3dfZGlzcGF0Y2g6IG51bGwgfTtcbiAgICBkZWxldGUgbmV3U2V0dGluZ3Muam9icy5zeW5jO1xuICAgIGF3YWl0IHdyaXRlWWFtbChuZXdTZXR0aW5ncywgcGF0aC5qb2luKHdvcmtmbG93c1BhdGgsICdzeW5jLWZvcmNlLnltbCcpKTtcbiAgfVxufVxuXG4vLyB3YidzIGdsb2JhbCBvcHRpb25zIHRoYXQgY29uc3VtZSBhIGZvbGxvd2luZyB2YWx1ZSB0b2tlbiAoZnJvbSBzaGFyZWRPcHRpb25zQnVpbGRlciBwbHVzXG4vLyB5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52KTsgZXZlcnkgb3RoZXIgYC1gLXByZWZpeGVkIHRva2VuIGJlZm9yZSB0aGUgc3ViY29tbWFuZCBpcyBhIGJvb2xlYW4uXG5jb25zdCB3Ykdsb2JhbFZhbHVlT3B0aW9ucyA9IG5ldyBTZXQoWyctLXdvcmtpbmctZGlyJywgJy13JywgJy0tZW52JywgJy0tY2FzY2FkZS1lbnYnXSk7XG5cbi8vIFN1YmNvbW1hbmRzIHRoYXQgcnVuIGEgQklOQVJZIChzbyB0aGUgZm9sbG93aW5nIHRva2VuIGNhbiBiZSB0aGUgd2IgZXhlY3V0YWJsZSksIHBlciBydW5uZXI6IGJ1blxuLy8gcmVzZXJ2ZXMgb25seSBgeGAgKGBidW4gZGx4YC9gYnVuIGV4ZWNgIHJ1biBhIHBhY2thZ2Ugc2NyaXB0IG9mIHRoYXQgbmFtZSksIG5wbSBoYXMgYGV4ZWNgL2B4YCxcbi8vIGFuZCBwbnBtL3lhcm4gKEJlcnJ5KSBoYXZlIGBleGVjYC9gZGx4YC5cbmNvbnN0IHJ1bm5lckV4ZWN1dG9yU3ViY29tbWFuZHNCeVJ1bm5lcjogUmVjb3JkPHN0cmluZywgU2V0PHN0cmluZz4+ID0ge1xuICBucG06IG5ldyBTZXQoWydleGVjJywgJ3gnXSksXG4gIHBucG06IG5ldyBTZXQoWydleGVjJywgJ2RseCddKSxcbiAgeWFybjogbmV3IFNldChbJ2V4ZWMnLCAnZGx4J10pLFxuICBidW46IG5ldyBTZXQoWyd4J10pLFxufTtcblxuLy8gUnVubmVyIG9wdGlvbnMgdGhhdCBjb25zdW1lIHRoZSBGT0xMT1dJTkcgdG9rZW4gYXMgdGhlaXIgdmFsdWUsIHNvIGl0IGlzIG5vdCB0aGUgd2IgZXhlY3V0YWJsZVxuLy8gKGUuZy4gYGJ1biAtLWN3ZCBkaXIgd2IgZGVwbG95YCwgYG5weCAtcCBwa2cgd2IgZGVwbG95YCkuIEEgY29uc2VydmF0aXZlIHN1cGVyc2V0IGFjcm9zc1xuLy8gbnBtL3BucG0veWFybi9idW4gYW5kIHRoZSBucHgvYnVueCBwYWNrYWdlIGV4ZWN1dG9ycy5cbmNvbnN0IHJ1bm5lclZhbHVlT3B0aW9ucyA9IG5ldyBTZXQoW1xuICAnLS1jd2QnLFxuICAnLUMnLFxuICAnLS1wcmVmaXgnLFxuICAnLS1maWx0ZXInLFxuICAnLUYnLFxuICAnLS13b3Jrc3BhY2UnLFxuICAnLXcnLFxuICAnLS1kaXInLFxuICAnLXAnLFxuICAnLS1wYWNrYWdlJyxcbiAgJy1jJyxcbiAgJy0tY2FsbCcsXG5dKTtcblxuLyoqIEFkdmFuY2UgcGFzdCBhIHJ1bm5lcidzIG9wdGlvbnMsIGNvbnN1bWluZyBhIHNlcGFyYXRlIHZhbHVlIHRva2VuIHdoZXJlIG9uZSBhcHBsaWVzLiAqL1xuZnVuY3Rpb24gc2tpcFJ1bm5lck9wdGlvbnModG9rZW5zOiBzdHJpbmdbXSwgc3RhcnRJbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgbGV0IGluZGV4ID0gc3RhcnRJbmRleDtcbiAgd2hpbGUgKGluZGV4IDwgdG9rZW5zLmxlbmd0aCAmJiAodG9rZW5zW2luZGV4XSA/PyAnJykuc3RhcnRzV2l0aCgnLScpKSB7XG4gICAgY29uc3Qgb3B0aW9uID0gdG9rZW5zW2luZGV4XSA/PyAnJztcbiAgICBpbmRleCsrO1xuICAgIGlmICghb3B0aW9uLmluY2x1ZGVzKCc9JykgJiYgcnVubmVyVmFsdWVPcHRpb25zLmhhcyhvcHRpb24pICYmIGluZGV4IDwgdG9rZW5zLmxlbmd0aCkgaW5kZXgrKztcbiAgfVxuICByZXR1cm4gaW5kZXg7XG59XG5cbi8qKlxuICogVG9rZW5pemUgYSBzaGVsbCBjb21tYW5kIGxpbmUgaW50byBjb21tYW5kIHNlZ21lbnRzLCBlYWNoIGEgbGlzdCBvZiB0b2tlbnMgd2l0aCBxdW90ZXMgcmVtb3ZlZC5cbiAqIEEgbmV3IHNlZ21lbnQgc3RhcnRzIGF0IGFuIHVucXVvdGVkIGAmJmAvYHx8YC9gO2AvYHxgL2AmYDsgYW4gdW5xdW90ZWQgYCNgIHN0YXJ0cyBhIGNvbW1lbnQgdG9cbiAqIGVuZCBvZiBsaW5lOyBhIGJhY2tzbGFzaCBlc2NhcGVzIHRoZSBuZXh0IGNoYXJhY3RlciAoc28gYFxcO2AgaXMgYSBsaXRlcmFsLCBub3QgYSBzZXBhcmF0b3IpO1xuICogZ3JvdXBpbmcgcGFyZW50aGVzZXMgYChgL2ApYCBhcmUgdG9rZW4gc2VwYXJhdG9ycywgc28gYCh3YiBkZXBsb3kpYCB0b2tlbml6ZXMgYXMgYHdiIGRlcGxveWAuXG4gKiBTZWdtZW50cy90b2tlbnMgbW9kZWwgY29tbWFuZCBzdHJ1Y3R1cmUgcHJlY2lzZWx5IGVub3VnaCB0aGF0IHF1b3RlZCBvcGVyYXRvcnMsIGVzY2FwZWRcbiAqIG9wZXJhdG9ycywgY29tbWVudHMsIGFuZCBzdWJzaGVsbCBncm91cHMgbmVpdGhlciBmYWJyaWNhdGUgbm9yIGhpZGUgYSBgd2IgZGVwbG95YCBpbnZvY2F0aW9uLlxuICovXG5mdW5jdGlvbiB0b2tlbml6ZVNoZWxsQ29tbWFuZChzY3JpcHQ6IHN0cmluZyk6IHsgc2VnbWVudHM6IHN0cmluZ1tdW107IHNhd0hlcmVkb2M6IGJvb2xlYW4gfSB7XG4gIGNvbnN0IHNlZ21lbnRzOiBzdHJpbmdbXVtdID0gW107XG4gIGxldCB0b2tlbnM6IHN0cmluZ1tdID0gW107XG4gIGxldCBjdXJyZW50ID0gJyc7XG4gIGxldCBpblRva2VuID0gZmFsc2U7XG4gIGxldCBxdW90ZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAvLyBXaGV0aGVyIHRoZSBzY3JpcHQgdXNlcyBhbnkgaGVyZWRvYy4gRmFpdGhmdWxseSBjbGFzc2lmeWluZyB3aGljaCBib2R5IGxpbmVzIGFyZSBkYXRhICh0aGVcbiAgLy8gZGVsaW1pdGVyIHdvcmQgY2FuIGJlIHF1b3RlZC9iYWNrc2xhc2gtZXNjYXBlZCwgYDw8LWAgc3RyaXBzIGxlYWRpbmcgdGFicywgdGVybWluYXRvcnMgbWF0Y2hcbiAgLy8gZXhhY3RseSkgaXMgbW9yZSB0aGFuIHRoaXMgcGFyc2VyIG1vZGVscywgc28gYSBoZXJlZG9jIGFueXdoZXJlIG1ha2VzIGRldGVjdGlvbiByZXR1cm4gZmFsc2UuXG4gIGxldCBzYXdIZXJlZG9jID0gZmFsc2U7XG4gIC8vIEhlcmVkb2MgZGVsaW1pdGVycyB3aG9zZSBib2RpZXMgYmVnaW4gYXQgdGhlIE5FWFQgbmV3bGluZTogYGNhdCA8PEEgPDxCYCBxdWV1ZXMgQSB0aGVuIEIsIGFuZFxuICAvLyB0aGUgY29tbWFuZHMgQUZURVIgdGhlIGA8PGAgaGVhZGVyIG9uIHRoZSBzYW1lIGxpbmUgc3RpbGwgZXhlY3V0ZSwgc28gdGhlIGhlYWRlciBpcyByZWNvcmRlZFxuICAvLyBoZXJlIGFuZCB0aGUgYm9kaWVzIGFyZSBza2lwcGVkIG9ubHkgd2hlbiB0aGUgbGluZSdzIG5ld2xpbmUgaXMgcmVhY2hlZC5cbiAgbGV0IHBlbmRpbmdIZXJlZG9jRGVsaW1pdGVyczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3Qgc2tpcEhlcmVkb2NCb2RpZXMgPSAoZnJvbUluZGV4OiBudW1iZXIpOiBudW1iZXIgPT4ge1xuICAgIGxldCBjdXJzb3IgPSBmcm9tSW5kZXg7XG4gICAgZm9yIChjb25zdCBkZWxpbWl0ZXIgb2YgcGVuZGluZ0hlcmVkb2NEZWxpbWl0ZXJzKSB7XG4gICAgICB3aGlsZSAoY3Vyc29yIDwgc2NyaXB0Lmxlbmd0aCkge1xuICAgICAgICBjb25zdCBsaW5lU3RhcnQgPSBjdXJzb3IgKyAxO1xuICAgICAgICBsZXQgbGluZUVuZCA9IGxpbmVTdGFydDtcbiAgICAgICAgd2hpbGUgKGxpbmVFbmQgPCBzY3JpcHQubGVuZ3RoICYmIHNjcmlwdFtsaW5lRW5kXSAhPT0gJ1xcbicpIGxpbmVFbmQrKztcbiAgICAgICAgY3Vyc29yID0gbGluZUVuZDtcbiAgICAgICAgaWYgKHNjcmlwdC5zbGljZShsaW5lU3RhcnQsIGxpbmVFbmQpLnRyaW0oKSA9PT0gZGVsaW1pdGVyKSBicmVhaztcbiAgICAgICAgaWYgKGxpbmVFbmQgPj0gc2NyaXB0Lmxlbmd0aCkgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHBlbmRpbmdIZXJlZG9jRGVsaW1pdGVycyA9IFtdO1xuICAgIHJldHVybiBjdXJzb3I7XG4gIH07XG4gIGNvbnN0IGVuZFRva2VuID0gKCk6IHZvaWQgPT4ge1xuICAgIGlmIChpblRva2VuKSB0b2tlbnMucHVzaChjdXJyZW50KTtcbiAgICBjdXJyZW50ID0gJyc7XG4gICAgaW5Ub2tlbiA9IGZhbHNlO1xuICB9O1xuICBjb25zdCBlbmRTZWdtZW50ID0gKCk6IHZvaWQgPT4ge1xuICAgIGVuZFRva2VuKCk7XG4gICAgc2VnbWVudHMucHVzaCh0b2tlbnMpO1xuICAgIHRva2VucyA9IFtdO1xuICB9O1xuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgc2NyaXB0Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgIGNvbnN0IGNoYXJhY3RlciA9IHNjcmlwdFtpbmRleF0gPz8gJyc7XG4gICAgaWYgKHF1b3RlKSB7XG4gICAgICBpZiAoY2hhcmFjdGVyID09PSAnXFxcXCcgJiYgcXVvdGUgPT09ICdcIicpIHtcbiAgICAgICAgLy8gSW5zaWRlIGRvdWJsZSBxdW90ZXMsIGJhY2tzbGFzaC1uZXdsaW5lIGlzIHN0aWxsIGEgbGluZSBjb250aW51YXRpb24gKGJvdGggcmVtb3ZlZCk7XG4gICAgICAgIC8vIGFueSBvdGhlciBlc2NhcGVkIGNoYXJhY3RlciBjb250cmlidXRlcyBsaXRlcmFsbHkuXG4gICAgICAgIGlmIChzY3JpcHRbaW5kZXggKyAxXSA9PT0gJ1xcbicpIGluZGV4Kys7XG4gICAgICAgIGVsc2UgY3VycmVudCArPSBzY3JpcHRbKytpbmRleF0gPz8gJyc7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGNoYXJhY3RlciA9PT0gcXVvdGUpIHF1b3RlID0gdW5kZWZpbmVkO1xuICAgICAgZWxzZSBjdXJyZW50ICs9IGNoYXJhY3RlcjtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoY2hhcmFjdGVyID09PSAnXFxcXCcpIHtcbiAgICAgIC8vIEJhY2tzbGFzaC1uZXdsaW5lIGlzIGEgbGluZSBjb250aW51YXRpb246IHRoZSBzaGVsbCByZW1vdmVzIGJvdGgsIGpvaW5pbmcgdGhlIGxpbmVzXG4gICAgICAvLyB3aXRob3V0IGludHJvZHVjaW5nIGEgdG9rZW4gYm91bmRhcnkuIEFueSBvdGhlciBlc2NhcGVkIGNoYXJhY3RlciBpcyBhIGxpdGVyYWwuXG4gICAgICBpZiAoc2NyaXB0W2luZGV4ICsgMV0gPT09ICdcXG4nKSB7XG4gICAgICAgIGluZGV4Kys7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY3VycmVudCArPSBzY3JpcHRbKytpbmRleF0gPz8gJyc7XG4gICAgICBpblRva2VuID0gdHJ1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoY2hhcmFjdGVyID09PSBcIidcIiB8fCBjaGFyYWN0ZXIgPT09ICdcIicpIHtcbiAgICAgIHF1b3RlID0gY2hhcmFjdGVyO1xuICAgICAgaW5Ub2tlbiA9IHRydWU7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgLy8gQSBgPDxgL2A8PC1gIGhlcmVkb2MgcmVkaXJlY3Rpb246IGl0cyBib2R5IGxpbmVzICh1cCB0byB0aGUgZGVsaW1pdGVyIGxpbmUpIGFyZSBEQVRBLCBub3RcbiAgICAvLyBjb21tYW5kcywgc28gYGNhdCA8PCdFT0YnXFxud2IgZGVwbG95XFxuRU9GYCBtdXN0IG5vdCByZWFkIGB3YiBkZXBsb3lgIGFzIGFuIGludm9jYXRpb24uIFNpbmNlXG4gICAgLy8gdGhlIGNhbGxlciBkZWNsaW5lcyBvbiBBTlkgaGVyZWRvYywgZmxhZyBpdCB0aGUgaW5zdGFudCBgPDxgIGFwcGVhcnMg4oCUIGJlZm9yZSBwYXJzaW5nIHRoZVxuICAgIC8vIGRlbGltaXRlciB3b3JkIOKAlCBzbyBhbiBleG90aWMgZGVsaW1pdGVyIChgPDwrYCkgdGhlIHdvcmQgc2Nhbm5lciBjYW5ub3QgcmVhZCBzdGlsbCBkZWNsaW5lcy5cbiAgICBpZiAoY2hhcmFjdGVyID09PSAnPCcgJiYgc2NyaXB0W2luZGV4ICsgMV0gPT09ICc8Jykge1xuICAgICAgc2F3SGVyZWRvYyA9IHRydWU7XG4gICAgICBsZXQgY3Vyc29yID0gaW5kZXggKyAyO1xuICAgICAgaWYgKHNjcmlwdFtjdXJzb3JdID09PSAnLScpIGN1cnNvcisrO1xuICAgICAgd2hpbGUgKC9bIFxcdF0vdS50ZXN0KHNjcmlwdFtjdXJzb3JdID8/ICcnKSkgY3Vyc29yKys7XG4gICAgICBsZXQgZGVsaW1pdGVyID0gJyc7XG4gICAgICAvLyBUaGUgZGVsaW1pdGVyIHdvcmQgbWF5IGJlIHF1b3RlZCAoYDw8J0VPRidgKSBvciBiYWNrc2xhc2gtZXNjYXBlZCAoYDw8XFxFT0ZgKTsgZWl0aGVyIGZvcm1cbiAgICAgIC8vIGp1c3QgZGlzYWJsZXMgYm9keSBleHBhbnNpb24sIHNvIGNvbGxlY3QgdGhlIGJhcmUgd29yZC4gTWlzc2luZyB0aGUgZXNjYXBlZCBmb3JtIHdvdWxkIGRyb3BcbiAgICAgIC8vIGBzYXdIZXJlZG9jYCBhbmQgcmVhZCB0aGUgaGVyZWRvYyBib2R5IGFzIGNvbW1hbmRzLlxuICAgICAgbGV0IGRlbGltaXRlclF1b3RlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICB3aGlsZSAoY3Vyc29yIDwgc2NyaXB0Lmxlbmd0aCkge1xuICAgICAgICBjb25zdCBkZWxpbWl0ZXJDaGFyID0gc2NyaXB0W2N1cnNvcl0gPz8gJyc7XG4gICAgICAgIGlmIChkZWxpbWl0ZXJRdW90ZSkge1xuICAgICAgICAgIGlmIChkZWxpbWl0ZXJDaGFyID09PSBkZWxpbWl0ZXJRdW90ZSkgZGVsaW1pdGVyUXVvdGUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgZWxzZSBkZWxpbWl0ZXIgKz0gZGVsaW1pdGVyQ2hhcjtcbiAgICAgICAgfSBlbHNlIGlmIChkZWxpbWl0ZXJDaGFyID09PSAnXFxcXCcpIHtcbiAgICAgICAgICAvLyBBIGJhY2tzbGFzaCBxdW90ZXMgdGhlIG5leHQgY2hhcmFjdGVyIGludG8gdGhlIGRlbGltaXRlciB3b3JkIChgPDxcXEVPRmAg4oaSIGBFT0ZgKS5cbiAgICAgICAgICBjdXJzb3IrKztcbiAgICAgICAgICBkZWxpbWl0ZXIgKz0gc2NyaXB0W2N1cnNvcl0gPz8gJyc7XG4gICAgICAgIH0gZWxzZSBpZiAoZGVsaW1pdGVyQ2hhciA9PT0gXCInXCIgfHwgZGVsaW1pdGVyQ2hhciA9PT0gJ1wiJykge1xuICAgICAgICAgIGRlbGltaXRlclF1b3RlID0gZGVsaW1pdGVyQ2hhcjtcbiAgICAgICAgfSBlbHNlIGlmICgvW1xcdy4tXS91LnRlc3QoZGVsaW1pdGVyQ2hhcikpIHtcbiAgICAgICAgICBkZWxpbWl0ZXIgKz0gZGVsaW1pdGVyQ2hhcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjdXJzb3IrKztcbiAgICAgIH1cbiAgICAgIGlmIChkZWxpbWl0ZXIpIHtcbiAgICAgICAgLy8gVGhlIGA8PGRlbGltYCBoZWFkZXIgaXMgYSByZWRpcmVjdGlvbiAobm90IGEgdG9rZW4pOyByZWNvcmQgdGhlIGRlbGltaXRlciBhbmQga2VlcFxuICAgICAgICAvLyBwYXJzaW5nIHRoZSByZXN0IG9mIHRoaXMgbGluZSDigJQgaXRzIGJvZHkgaXMgc2tpcHBlZCB3aGVuIHRoZSBuZXdsaW5lIGlzIHJlYWNoZWQuXG4gICAgICAgIGVuZFRva2VuKCk7XG4gICAgICAgIHBlbmRpbmdIZXJlZG9jRGVsaW1pdGVycy5wdXNoKGRlbGltaXRlcik7XG4gICAgICAgIGluZGV4ID0gY3Vyc29yIC0gMTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjaGFyYWN0ZXIgPT09ICcjJyAmJiAhaW5Ub2tlbikge1xuICAgICAgLy8gQ29tbWVudCBydW5zIHRvIGVuZCBvZiBsaW5lOyBlbmQgdGhlIGN1cnJlbnQgY29tbWFuZCBzZWdtZW50IGFuZCBsZXQgdGhlIGxvb3AgcmVzdW1lIGF0XG4gICAgICAvLyB0aGUgbmV3bGluZSBzbyB0aGUgbmV4dCBsaW5lIGlzIHBhcnNlZCBhcyBpdHMgb3duIHNlZ21lbnQuXG4gICAgICBlbmRTZWdtZW50KCk7XG4gICAgICB3aGlsZSAoaW5kZXggKyAxIDwgc2NyaXB0Lmxlbmd0aCAmJiBzY3JpcHRbaW5kZXggKyAxXSAhPT0gJ1xcbicpIGluZGV4Kys7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGNoYXJhY3RlciA9PT0gJyYnIHx8IGNoYXJhY3RlciA9PT0gJ3wnIHx8IGNoYXJhY3RlciA9PT0gJzsnIHx8IGNoYXJhY3RlciA9PT0gJ1xcbicpIHtcbiAgICAgIGVuZFNlZ21lbnQoKTtcbiAgICAgIGlmICgoY2hhcmFjdGVyID09PSAnJicgfHwgY2hhcmFjdGVyID09PSAnfCcpICYmIHNjcmlwdFtpbmRleCArIDFdID09PSBjaGFyYWN0ZXIpIGluZGV4Kys7XG4gICAgICAvLyBBIG5ld2xpbmUgdGhhdCBjbG9zZXMgYSBoZXJlZG9jIGhlYWRlciBsaW5lIGNvbnN1bWVzIHRoZSBxdWV1ZWQgYm9kaWVzIGJlZm9yZSB0aGUgbmV4dFxuICAgICAgLy8gY29tbWFuZC5cbiAgICAgIGlmIChjaGFyYWN0ZXIgPT09ICdcXG4nICYmIHBlbmRpbmdIZXJlZG9jRGVsaW1pdGVycy5sZW5ndGggPiAwKSBpbmRleCA9IHNraXBIZXJlZG9jQm9kaWVzKGluZGV4KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoY2hhcmFjdGVyID09PSAnKCcgfHwgY2hhcmFjdGVyID09PSAnKScpIHtcbiAgICAgIGVuZFRva2VuKCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKC9cXHMvdS50ZXN0KGNoYXJhY3RlcikpIHtcbiAgICAgIGVuZFRva2VuKCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY3VycmVudCArPSBjaGFyYWN0ZXI7XG4gICAgaW5Ub2tlbiA9IHRydWU7XG4gIH1cbiAgZW5kU2VnbWVudCgpO1xuICByZXR1cm4geyBzZWdtZW50cywgc2F3SGVyZWRvYyB9O1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYSBkZXBsb3kgc2NyaXB0IGludm9rZXMgYHdiIOKApiBkZXBsb3lgIGF0IGNvbW1hbmQgcG9zaXRpb24uIEVudiBhc3NpZ25tZW50cywgcGFja2FnZVxuICogcnVubmVycywgYW5kIGdsb2JhbCB5YXJncyBvcHRpb25zICh3aXRoIHRoZWlyIHZhbHVlIHRva2VucykgbWF5IHByZWNlZGUgdGhlIGRlcGxveSBjb21tYW5kO1xuICogc2hlbGwgcXVvdGluZywgZXNjYXBpbmcsIGNvbW1lbnRzLCBhbmQgZ3JvdXBpbmcgYXJlIGhvbm9yZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnZva2VzV2JEZXBsb3koZGVwbG95U2NyaXB0OiBzdHJpbmcsIHNjcmlwdE5hbWVzOiBSZWFkb25seVNldDxzdHJpbmc+KTogYm9vbGVhbiB7XG4gIGNvbnN0IHsgc2VnbWVudHMsIHNhd0hlcmVkb2MgfSA9IHRva2VuaXplU2hlbGxDb21tYW5kKGRlcGxveVNjcmlwdCk7XG4gIC8vIEEgaGVyZWRvYyBtYWtlcyBib2R5LXZzLWNvbW1hbmQgY2xhc3NpZmljYXRpb24gdW5yZWxpYWJsZSAoc2VlIHRva2VuaXplU2hlbGxDb21tYW5kKS5cbiAgaWYgKHNhd0hlcmVkb2MpIHJldHVybiBmYWxzZTtcbiAgZm9yIChjb25zdCB0b2tlbnMgb2Ygc2VnbWVudHMpIHtcbiAgICBsZXQgaW5kZXggPSAwO1xuICAgIHdoaWxlIChpbmRleCA8IHRva2Vucy5sZW5ndGggJiYgL15bQS1aYS16X11bQS1aYS16MC05X10qPS91LnRlc3QodG9rZW5zW2luZGV4XSA/PyAnJykpIGluZGV4Kys7XG4gICAgLy8gTGVhZGluZyBsYXVuY2hlcnMgcnVuIHRoZSBmb2xsb3dpbmcgY29tbWFuZDogYGVudmAgKHdpdGggb3B0aW9ucyArIEtFWT12YWx1ZSBhc3NpZ25tZW50cylcbiAgICAvLyBhbmQgdGhlIFBPU0lYIGBjb21tYW5kYCBidWlsdGluICh3aXRoIGl0cyBgLXBgL2AtdmAvYC1WYCBvcHRpb25zKS4gQ29tbWFuZC1wb3NpdGlvbiBzaGVsbFxuICAgIC8vIHJlc2VydmVkIHdvcmRzIGFuZCBvdGhlciBsYXVuY2hlcnMgKGBpZmAvYHRoZW5gL2Bmb3JgL2B0aW1lYC9gZXhlY2AvYCFgL2JyYWNlIGdyb3Vwcywg4oCmKSBhcmVcbiAgICAvLyBOT1QgbW9kZWxlZDogdGhleSBsZWF2ZSBhIG5vbi1gd2JgIGZpcnN0IHRva2VuLCBzbyB0aGUgc2VnbWVudCBzaW1wbHkgZG9lcyBub3QgbWF0Y2guIFRoaXMgaXNcbiAgICAvLyBhIGRlbGliZXJhdGUgZmFsc2UtbmVnYXRpdmUgZm9yIGdlbmVyYXRlZCBndWlkYW5jZS5cbiAgICBpZiAodG9rZW5zW2luZGV4XSA9PT0gJ2VudicpIHtcbiAgICAgIGluZGV4Kys7XG4gICAgICB3aGlsZSAoaW5kZXggPCB0b2tlbnMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHRva2VuID0gdG9rZW5zW2luZGV4XSA/PyAnJztcbiAgICAgICAgaWYgKC9eW0EtWmEtel9dW0EtWmEtejAtOV9dKj0vdS50ZXN0KHRva2VuKSkgaW5kZXgrKztcbiAgICAgICAgLy8gZW52J3MgZGlyZWN0b3J5IHZhbHVlIG1heSBiZSBzZXBhcmF0ZSBvciBhdHRhY2hlZCAoYC1DZGlyYCwgYC0tY2hkaXI9ZGlyYCkuIEl0IGNoYW5nZXNcbiAgICAgICAgLy8gd2hlcmUgd2IgcnVucyBidXQgbm90IHdoZXRoZXIgdGhlIGNvbW1hbmQgaW52b2tlcyB3YiBkZXBsb3kuXG4gICAgICAgIGVsc2UgaWYgKHRva2VuID09PSAnLUMnIHx8IHRva2VuID09PSAnLS1jaGRpcicpIGluZGV4ICs9IDI7XG4gICAgICAgIGVsc2UgaWYgKHRva2VuLnN0YXJ0c1dpdGgoJy1DJykgfHwgdG9rZW4uc3RhcnRzV2l0aCgnLS1jaGRpcj0nKSkgaW5kZXgrKztcbiAgICAgICAgZWxzZSBpZiAodG9rZW4gPT09ICctdScpIGluZGV4ICs9IDI7XG4gICAgICAgIGVsc2UgaWYgKHRva2VuLnN0YXJ0c1dpdGgoJy0nKSkgaW5kZXgrKztcbiAgICAgICAgZWxzZSBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gYGNvbW1hbmQgQ01EYCBleGVjdXRlcyBDTUQsIGJ1dCBgY29tbWFuZCAtdmAvYC1WIENNRGAgb25seSBRVUVSWSBpdHMgYXZhaWxhYmlsaXR5IHdpdGhvdXRcbiAgICAvLyBydW5uaW5nIGl0LCBzbyBhIGRlcGxveSBiZWhpbmQgdGhlbSBkb2VzIG5vdCBydW4uIFRoZSBgdmAvYFZgIGZsYWcgbWF5IGJlIGNsdXN0ZXJlZCB3aXRoXG4gICAgLy8gb3RoZXIgb3B0aW9uIGxldHRlcnMgKGBjb21tYW5kIC1wdiB3YmApLCBzbyBtYXRjaCBhbnkgb3B0aW9uIGxldHRlciBjbHVzdGVyIGNvbnRhaW5pbmcgaXQuXG4gICAgd2hpbGUgKHRva2Vuc1tpbmRleF0gPT09ICdjb21tYW5kJykge1xuICAgICAgaW5kZXgrKztcbiAgICAgIGxldCBxdWVyaWVzT25seSA9IGZhbHNlO1xuICAgICAgd2hpbGUgKGluZGV4IDwgdG9rZW5zLmxlbmd0aCAmJiAodG9rZW5zW2luZGV4XSA/PyAnJykuc3RhcnRzV2l0aCgnLScpKSB7XG4gICAgICAgIGlmICgvXi1bQS1aYS16XSpbdlZdW0EtWmEtel0qJC91LnRlc3QodG9rZW5zW2luZGV4XSA/PyAnJykpIHF1ZXJpZXNPbmx5ID0gdHJ1ZTtcbiAgICAgICAgaW5kZXgrKztcbiAgICAgIH1cbiAgICAgIGlmIChxdWVyaWVzT25seSkge1xuICAgICAgICBpbmRleCA9IC0xO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGluZGV4IDwgMCkgY29udGludWU7XG4gICAgLy8gUmVzb2x2ZSBhIHJ1bm5lciBwcmVmaXggdG8gd2hldGhlciB0aGUgZm9sbG93aW5nIHRva2VuIGlzIGEgQklOQVJZICh0aGUgd2IgZXhlY3V0YWJsZSkgb3IgYVxuICAgIC8vIHBhY2thZ2UgU0NSSVBUIG5hbWUuIGBidW54YC9gbnB4YCBhbmQgYDxwbT4geHxkbHh8ZXhlY2AgcnVuIGEgYmluYXJ5OyBgPHBtPiBydW58cnVuLXNjcmlwdGBcbiAgICAvLyAoYW5kIGJhcmUgYG5wbSA8bmFtZT5gLCBvciBhbnkgcnVubmVyIGZvbGxvd2VkIGJ5IGAtLWApIHJ1biBhIHBhY2thZ2Ugc2NyaXB0IOKAlCBzb1xuICAgIC8vIGBucG0gcnVuIHdiIGRlcGxveWAgZXhlY3V0ZXMgdGhlIHNjcmlwdCBuYW1lZCBgd2JgLCBub3QgdGhlIHdiIGJpbmFyeSwgYW5kIG11c3QgYmUgcmVqZWN0ZWQuXG4gICAgaWYgKFsnbnBtJywgJ3BucG0nLCAneWFybicsICdidW4nXS5pbmNsdWRlcyh0b2tlbnNbaW5kZXhdID8/ICcnKSkge1xuICAgICAgY29uc3QgcnVubmVyID0gdG9rZW5zW2luZGV4XSA/PyAnJztcbiAgICAgIGluZGV4ID0gc2tpcFJ1bm5lck9wdGlvbnModG9rZW5zLCBpbmRleCArIDEpO1xuICAgICAgY29uc3Qgc3ViY29tbWFuZCA9IHRva2Vuc1tpbmRleF0gPz8gJyc7XG4gICAgICBpZiAoWydydW4nLCAncnVuLXNjcmlwdCddLmluY2x1ZGVzKHN1YmNvbW1hbmQpKSBjb250aW51ZTsgLy8gcnVucyBhIHBhY2thZ2Ugc2NyaXB0LCBub3Qgd2JcbiAgICAgIC8vIEV4ZWN1dG9yIHN1YmNvbW1hbmRzIGFyZSBydW5uZXItU1BFQ0lGSUM6IGJ1biByZXNlcnZlcyBvbmx5IGB4YCAoYGJ1biBkbHhgL2BidW4gZXhlY2AgcnVuIGFcbiAgICAgIC8vIHBhY2thZ2Ugc2NyaXB0IG5hbWVkIGRseC9leGVjKS4gUmVhbCBidWlsdC1pbiBleGVjdXRvcnMgKGBleGVjYC9geGAsIGFuZCBgZGx4YCBmb3IgcG5wbSlcbiAgICAgIC8vIHRha2UgcHJlY2VkZW5jZSBvdmVyIGEgc2FtZS1uYW1lZCBzY3JpcHQsIHNvIHRoZXkgYXJlIE5PVCBzaGFkb3ctY2hlY2tlZC4gT25seSBgeWFybiBkbHhgIGlzXG4gICAgICAvLyBhbWJpZ3VvdXMg4oCUIGEgQmVycnkgYnVpbHQtaW4gYnV0IGEgcGFja2FnZSBTQ1JJUFQgaW4gWWFybiBDbGFzc2ljIOKAlCBzbyBhIGRlY2xhcmVkIGBkbHhgXG4gICAgICAvLyBzY3JpcHQgbWFrZXMgYHlhcm4gZGx4YCBkZWNsaW5lIChmYWxsIHRocm91Z2ggdG8gdGhlIHBhY2thZ2Utc2NyaXB0IGNoZWNrcykuXG4gICAgICBjb25zdCBpc1lhcm5EbHhTaGFkb3dlZEJ5U2NyaXB0ID0gcnVubmVyID09PSAneWFybicgJiYgc3ViY29tbWFuZCA9PT0gJ2RseCcgJiYgc2NyaXB0TmFtZXMuaGFzKCdkbHgnKTtcbiAgICAgIGlmIChydW5uZXJFeGVjdXRvclN1YmNvbW1hbmRzQnlSdW5uZXJbcnVubmVyXT8uaGFzKHN1YmNvbW1hbmQpICYmICFpc1lhcm5EbHhTaGFkb3dlZEJ5U2NyaXB0KSB7XG4gICAgICAgIGluZGV4Kys7IC8vIGJpbmFyeSBydW5uZXIgKHBucG0gZGx4LCBidW4geCwgYG5wbSBleGVjIC0tIHdiIOKApmApXG4gICAgICAgIGlmICh0b2tlbnNbaW5kZXhdID09PSAnLS0nKSBpbmRleCsrOyAvLyB0aGUgZXhlY3V0b3IncyBvcHRpb25hbCBgLS1gIGJlZm9yZSB0aGUgY29tbWFuZFxuICAgICAgfSBlbHNlIGlmIChydW5uZXIgPT09ICducG0nKSB7XG4gICAgICAgIGNvbnRpbnVlOyAvLyBiYXJlIGBucG0gd2JgIG5ldmVyIHJ1bnMgYSBiaW5hcnlcbiAgICAgIH0gZWxzZSBpZiAodG9rZW5zW2luZGV4XSA9PT0gJ3diJyAmJiBzY3JpcHROYW1lcy5oYXMoJ3diJykpIHtcbiAgICAgICAgLy8gQmFyZSBgYnVuL3BucG0veWFybiB3YmAgcnVucyBhIHBhY2thZ2UgU0NSSVBUIG5hbWVkIGB3YmAgd2hlbiBvbmUgZXhpc3RzIChwYXNzaW5nIGBkZXBsb3lgXG4gICAgICAgIC8vIGFzIGl0cyBhcmd1bWVudCksIG5vdCB0aGUgd2IgYmluYXJ5LlxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFsnYnVueCcsICducHgnXS5pbmNsdWRlcyh0b2tlbnNbaW5kZXhdID8/ICcnKSkge1xuICAgICAgaW5kZXggPSBza2lwUnVubmVyT3B0aW9ucyh0b2tlbnMsIGluZGV4ICsgMSk7XG4gICAgfVxuICAgIGlmICh0b2tlbnNbaW5kZXhdICE9PSAnd2InKSBjb250aW51ZTtcbiAgICBjb25zdCB3YkFyZ3MgPSB0b2tlbnMuc2xpY2UoaW5kZXggKyAxKTtcbiAgICAvLyBTa2lwIGdsb2JhbCBvcHRpb25zIChhbmQgYW55IHZhbHVlIHRva2VuIGEgdmFsdWUtYmVhcmluZyBvcHRpb24gY29uc3VtZXMpIHNvIHRoZSBGSVJTVFxuICAgIC8vIGNvbW1hbmQgdG9rZW4gZGVjaWRlczogYHdiIC0tY2FzY2FkZS1lbnYgcHJvZHVjdGlvbiBkZXBsb3lgIGFuZCBgd2IgLXcgcGFja2FnZXMvYXBpIGRlcGxveWBcbiAgICAvLyBtYXRjaCwgd2hpbGUgc3ViY29tbWFuZHMgb3duaW5nIHRoZWlyIG93biBgZGVwbG95YCAoYHdiIHByaXNtYSBkZXBsb3lgLCBgd2IgcmV0cnkgZGVwbG95YClcbiAgICAvLyBkbyBub3QuIGAtLW9wdD12YWx1ZWAgY2FycmllcyBpdHMgdmFsdWUgaW5saW5lLCBzbyBvbmx5IHRoZSBzcGFjZS1zZXBhcmF0ZWQgZm9ybSBza2lwcyBvbmUuXG4gICAgbGV0IGNvbW1hbmRJbmRleCA9IDA7XG4gICAgd2hpbGUgKGNvbW1hbmRJbmRleCA8IHdiQXJncy5sZW5ndGggJiYgKHdiQXJnc1tjb21tYW5kSW5kZXhdID8/ICcnKS5zdGFydHNXaXRoKCctJykpIHtcbiAgICAgIGNvbnN0IGZsYWcgPSB3YkFyZ3NbY29tbWFuZEluZGV4XSA/PyAnJztcbiAgICAgIGNvbW1hbmRJbmRleCsrO1xuICAgICAgaWYgKHdiR2xvYmFsVmFsdWVPcHRpb25zLmhhcyhmbGFnKSAmJiBjb21tYW5kSW5kZXggPCB3YkFyZ3MubGVuZ3RoKSBjb21tYW5kSW5kZXgrKztcbiAgICB9XG4gICAgaWYgKHdiQXJnc1tjb21tYW5kSW5kZXhdICE9PSAnZGVwbG95JykgY29udGludWU7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIHdvcmtmbG93cyBkaXJlY3RvcnkgaG9sZHMgYSBsaXZlIGNhbGxlciBvZiB0aGUgcmV1c2FibGUgQ2xvdWRmbGFyZSBkZXBsb3kgd29ya2Zsb3cuXG4gKiBZQU1MIGlzIHBhcnNlZCBhbmQgb25seSBgam9icy4qLnVzZXNgIHZhbHVlcyBhcmUgaW5zcGVjdGVkIChhIHJhdy10ZXh0IHNlYXJjaCB3b3VsZCBtYXRjaFxuICogY29tbWVudHMgb3IgYHJ1bjpgIHN0cmluZ3MpLCB3aXRoIGEgYGRlcGxveSpgLWZpbGVuYW1lIHNob3J0Y3V0IGFuZCBhIGNvbnNlcnZhdGl2ZSByYXctdGV4dFxuICogZmFsbGJhY2sgZm9yIHVucGFyc2VhYmxlIGZpbGVzLiBVc2VkIGJ5IHRoZSBhZ2VudC1pbnN0cnVjdGlvbiBnZW5lcmF0b3Igc28gZ2VuZXJhdGVkIGd1aWRhbmNlXG4gKiBkZXNjcmliZXMgb25seSB3b3JrZmxvd3MgdGhhdCBleGlzdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc0Nsb3VkZmxhcmVEZXBsb3lXb3JrZmxvdyh3b3JrZmxvd3NEaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgbGV0IGVudHJpZXM6IGZzLkRpcmVudFtdO1xuICB0cnkge1xuICAgIGVudHJpZXMgPSBmcy5yZWFkZGlyU3luYyh3b3JrZmxvd3NEaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvLyBDYXNlLWluc2Vuc2l0aXZlIG93bmVyL3JlcG9zaXRvcnkgKEdpdEh1YiB0cmVhdHMgdGhlbSBzbyksIGNhc2Utc2Vuc2l0aXZlIHBhdGgvcmVmIOKAlCBtYXRjaGluZ1xuICAvLyBwYXJzZU9yZ1JldXNhYmxlV29ya2Zsb3dDYWxsLCB1c2VkIGZvciB0aGUgdW5wYXJzZWFibGUtWUFNTCByYXctdGV4dCBmYWxsYmFjayBvbmx5LlxuICBjb25zdCBkZXBsb3lDYWxsUGF0dGVybiA9IC9bXi9dK1xcL3JldXNhYmxlLXdvcmtmbG93c1xcL1xcLmdpdGh1YlxcL3dvcmtmbG93c1xcL2RlcGxveVxcLnlhP21sQC9pdTtcbiAgY29uc3QgY2FsbHNEZXBsb3lXb3JrZmxvdyA9ICh1c2VzOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuID0+XG4gICAgcGFyc2VPcmdSZXVzYWJsZVdvcmtmbG93Q2FsbCh1c2VzKT8ud29ya2Zsb3dOYW1lID09PSAnZGVwbG95JztcbiAgcmV0dXJuIGVudHJpZXMuc29tZSgoZW50cnkpID0+IHtcbiAgICBpZiAoIWVudHJ5LmlzRmlsZSgpIHx8ICEvXFwueWE/bWwkL3UudGVzdChlbnRyeS5uYW1lKSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChlbnRyeS5uYW1lLnN0YXJ0c1dpdGgoJ2RlcGxveScpKSByZXR1cm4gdHJ1ZTtcbiAgICBsZXQgY29udGVudDogc3RyaW5nO1xuICAgIHRyeSB7XG4gICAgICBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbih3b3JrZmxvd3NEaXJQYXRoLCBlbnRyeS5uYW1lKSwgJ3V0ZjgnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHdvcmtmbG93ID0geWFtbC5sb2FkKGNvbnRlbnQpIGFzIFdvcmtmbG93IHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKHdvcmtmbG93ICYmIHR5cGVvZiB3b3JrZmxvdyA9PT0gJ29iamVjdCcgJiYgd29ya2Zsb3cuam9icyAmJiB0eXBlb2Ygd29ya2Zsb3cuam9icyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXMod29ya2Zsb3cuam9icykuc29tZSgoam9iKSA9PiBjYWxsc0RlcGxveVdvcmtmbG93KGpvYj8udXNlcykpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGRlcGxveUNhbGxQYXR0ZXJuLnRlc3QoY29udGVudCk7XG4gICAgfVxuICB9KTtcbn1cblxuLy8gVGhlIHJldXNhYmxlIHdvcmtmbG93cyB0aGF0IGRlY2xhcmUgRk5PWF9BR0VfS0VZIGFuZCBWRVJEQUNDSU9fVE9LRU4gdW5kZXJcbi8vIG9uLndvcmtmbG93X2NhbGwuc2VjcmV0cyAoc2VlIFdpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cykuIFBhc3NpbmcgZWl0aGVyIHNlY3JldCB0byBhbnlcbi8vIG90aGVyIGNhbGxlZSBpcyBhIEdpdEh1YiBlcnJvci5cbmNvbnN0IGluc3RhbGxDYXBhYmxlUmV1c2FibGVXb3JrZmxvd3MgPSBuZXcgU2V0KFsnZGVwbG95JywgJ3JlbGVhc2UnLCAncnVuLXNjcmlwdCcsICd0ZXN0J10pO1xuY29uc3QgcmV1c2FibGVXb3JrZmxvd1Blcm1pc3Npb25zOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiA9IHtcbiAgLy8gc2tpcC1kdXBsaWNhdGUtYWN0aW9ucyByZWFkcyB3b3JrZmxvdyBydW5zOyBjYW5jZWxfb3RoZXJzIGlzIGZhbHNlLCBzbyByZWFkIGlzIGVub3VnaC5cbiAgJ3Rlc3QtcnVzdCc6IHsgYWN0aW9uczogJ3JlYWQnLCBjb250ZW50czogJ3JlYWQnIH0sXG4gICdzZW1hbnRpYy1wcic6IHsgJ3B1bGwtcmVxdWVzdHMnOiAncmVhZCcsIHN0YXR1c2VzOiAnd3JpdGUnIH0sXG4gICdjbG9zZS1jb21tZW50JzogeyAncHVsbC1yZXF1ZXN0cyc6ICd3cml0ZScgfSxcbn07XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUpvYihjb25maWc6IFBhY2thZ2VDb25maWcsIGpvYjogSm9iLCBraW5kOiBLbm93bktpbmQpOiB2b2lkIHtcbiAgam9iLndpdGggPz89IHt9O1xuICAvLyBgc2VjcmV0czogaW5oZXJpdGAgKHBhcnNlZCBieSBqcy15YW1sIGFzIGEgcGxhaW4gc3RyaW5nKSBhbHJlYWR5IGZvcndhcmRzIGV2ZXJ5IGNhbGxlciBzZWNyZXRcbiAgLy8gaW5jbHVkaW5nIHRoZSBvbmVzIGluamVjdGVkIGJlbG93LCBzbyBwcmVzZXJ2ZSBpdCB1bnRvdWNoZWQg4oCUIHByb3BlcnR5IGFzc2lnbm1lbnRzIG9uIHRoZVxuICAvLyBzdHJpbmcgd291bGQgdGhyb3cuIENhdmVhdDogYGluaGVyaXRgIGZvcndhcmRzIHNlY3JldHMgdW5kZXIgdGhlaXIgZXhpc3RpbmcgTkFNRVMsIHNvIGl0IGNhblxuICAvLyBuZXZlciBmZWVkIFBVQkxJQ19GTk9YX0FHRV9LRVkgaW50byB0aGUgY2FsbGVlJ3MgZGVjbGFyZWQgRk5PWF9BR0VfS0VZOyBhIGhhbmQtd3JpdHRlblxuICAvLyBpbmhlcml0IGNhbGxlciBpbiBhIFBVQkxJQyBmbm94IHJlcG9zaXRvcnkgbXVzdCBiZSBjb252ZXJ0ZWQgdG8gYW4gZXhwbGljaXQgbWFwcGluZyBtYW51YWxseVxuICAvLyAod2JmeSBuZXZlciBnZW5lcmF0ZXMgdGhlIGluaGVyaXQgZm9ybSwgYW5kIGhhbmQtd3JpdHRlbiBkZXZpYXRpb25zIGFyZSBmaXhlZCBpbiB0aGUgdGFyZ2V0XG4gIC8vIHJlcG9zaXRvcnkgYnkgcG9saWN5KS5cbiAgY29uc3Qgc2VjcmV0cyA9IGpvYi5zZWNyZXRzID09PSAnaW5oZXJpdCcgPyB1bmRlZmluZWQgOiAoam9iLnNlY3JldHMgPSBqb2Iuc2VjcmV0cyA/PyB7fSk7XG5cbiAgaWYgKHNlY3JldHMgJiYgKGtpbmQgPT09ICd0ZXN0JyB8fCBraW5kID09PSAncmVsZWFzZScpKSB7XG4gICAgc2VjcmV0cy5HSF9UT0tFTiA9ICcke3sgc2VjcmV0cy5HSVRIVUJfVE9LRU4gfX0nO1xuICB9XG5cbiAgLy8gZm5veC50b21sIGNhcnJpZXMgYWdlLWVuY3J5cHRlZCBhcHAgc2VjcmV0czsgQ0kgZGVjcnlwdHMgdGhlbSB3aXRoIHRoZSBGTk9YX0FHRV9LRVkgKG9yLCBmb3JcbiAgLy8gcHVibGljIHJlcG9zaXRvcmllcywgUFVCTElDX0ZOT1hfQUdFX0tFWSkgb3JnYW5pemF0aW9uIHNlY3JldC5cbiAgLy8gS2V5IHRoZSBpbmplY3Rpb24gb24gdGhlICpjYWxsZWQqIHJldXNhYmxlIHdvcmtmbG93LCBub3QgdGhlIGNhbGxlcidzIGZpbGVuYW1lOiBjYWxsZXJzIG1heSBoYXZlXG4gIC8vIGFyYml0cmFyeSBuYW1lcyAoZS5nLiBzY2hlZHVsZWQgcnVuLXNjcmlwdCBjYWxsZXJzKSwgYW5kIEdpdEh1YiByZWplY3RzIHBhc3NpbmcgYSBzZWNyZXQgdGhhdCB0aGVcbiAgLy8gY2FsbGVlIGRvZXMgbm90IGRlY2xhcmUuXG4gIC8vIE9ubHkgYW4gQG1haW4gY2FsbGVlIGlzIGtub3duIHRvIGZvbGxvdyB0aGUgY3VycmVudCBzZWNyZXQgY29udHJhY3Q6IGEgd29ya2Zsb3cgcGlubmVkIHRvIGFuXG4gIC8vIG9sZGVyIHRhZyBvciBTSEEgbWF5IHN0aWxsIGRlY2xhcmUgTlBNX1RPS0VOIChhbmQgbm90IFZFUkRBQ0NJT19UT0tFTiksIGFuZCBHaXRIdWIgcmVqZWN0cyBhXG4gIC8vIGNhbGxlciB3aG9zZSBzZWNyZXRzIGRvIG5vdCBtYXRjaCB0aGUgc2VsZWN0ZWQgcmV2aXNpb24ncyBkZWNsYXJhdGlvbnMsIHNvIHBpbm5lZCBjYWxsZXJzIGtlZXBcbiAgLy8gdGhlaXIgc2VjcmV0cyB1bnRvdWNoZWQuXG4gIGNvbnN0IG9yZ1dvcmtmbG93Q2FsbCA9IHBhcnNlT3JnUmV1c2FibGVXb3JrZmxvd0NhbGwoam9iLnVzZXMpO1xuICBjb25zdCBjYWxsZWRSZXVzYWJsZVdvcmtmbG93ID0gb3JnV29ya2Zsb3dDYWxsPy5yZWYgPT09ICdtYWluJyA/IG9yZ1dvcmtmbG93Q2FsbC53b3JrZmxvd05hbWUgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHJlcXVpcmVkUGVybWlzc2lvbnMgPSBjYWxsZWRSZXVzYWJsZVdvcmtmbG93ID8gcmV1c2FibGVXb3JrZmxvd1Blcm1pc3Npb25zW2NhbGxlZFJldXNhYmxlV29ya2Zsb3ddIDogdW5kZWZpbmVkO1xuICBpZiAocmVxdWlyZWRQZXJtaXNzaW9ucykgam9iLnBlcm1pc3Npb25zID0geyAuLi5yZXF1aXJlZFBlcm1pc3Npb25zIH07XG4gIGlmIChzZWNyZXRzICYmIGNhbGxlZFJldXNhYmxlV29ya2Zsb3cgJiYgaW5zdGFsbENhcGFibGVSZXVzYWJsZVdvcmtmbG93cy5oYXMoY2FsbGVkUmV1c2FibGVXb3JrZmxvdykpIHtcbiAgICAvLyBUaGUgY2FsbGVlIHJvdXRlcyBwdWJsaWMgKGRlZmF1bHQtcmVnaXN0cnkpIGluc3RhbGxzIHRocm91Z2ggdGhlIFRha3VtaSBHdWFyZFxuICAgIC8vIG1hbGljaW91cy1wYWNrYWdlLWJsb2NraW5nIHByb3h5IHdoZW4gdGhpcyB0b2tlbiByZXNvbHZlczsgYW4gdW5zZXQgb3JnYW5pemF0aW9uIHNlY3JldFxuICAgIC8vIGV4cGFuZHMgdG8gJycgYW5kIHRoZSBjYWxsZWUgdHJlYXRzIHRoYXQgYXMgXCJmZWF0dXJlIG9mZlwiLCBzbyBwYXNzaW5nIGl0IGlzIGFsd2F5cyBzYWZlLlxuICAgIHNlY3JldHMuVEFLVU1JX0dVQVJEX1RPS0VOID0gJyR7eyBzZWNyZXRzLlRBS1VNSV9HVUFSRF9UT0tFTiB9fSc7XG4gICAgLy8gVGhlIGNhbGxlZSBnZW5lcmF0ZXMgdGhlIHdvcmtzcGFjZSAubnBtcmMgZm9yIEB3aWxsYm9vc3Rlci1wcml2YXRlLyogZnJvbSBWRVJEQUNDSU9fVE9LRU5cbiAgICAvLyBiZWZvcmUgaW5zdGFsbGluZyBkZXBlbmRlbmNpZXMuIE9ubHkgcmVwb3NpdG9yaWVzIHRoYXQgYWN0dWFsbHkgcmVzb2x2ZSBwcml2YXRlIHBhY2thZ2VzXG4gICAgLy8gKG9yIHB1Ymxpc2ggdG8gVmVyZGFjY2lvKSBnZXQgdGhlIHBhc3MtdGhyb3VnaDogZXZlcnl3aGVyZSBlbHNlIHRoZSBjcmVkZW50aWFsIHdvdWxkIGZsb3dcbiAgICAvLyBpbnRvIENJIHJ1bnMgdGhhdCBuZXZlciB1c2UgaXQsIHNvIHRoZSBsaW5lIGlzIHJlbW92ZWQgaW5zdGVhZC4gVGhlIEdpdEh1YiBzZWNyZXQgaXRzZWxmIGlzXG4gICAgLy8gYWx3YXlzIHJlZ2lzdGVyZWQgbWFudWFsbHkgYW5kIHN0YXlzIHJlZ2lzdGVyZWQgZWl0aGVyIHdheS5cbiAgICBpZiAocmVwb1Jlc29sdmVzUHJpdmF0ZVBhY2thZ2VzKGNvbmZpZykpIHtcbiAgICAgIHNlY3JldHMuVkVSREFDQ0lPX1RPS0VOID0gJyR7eyBzZWNyZXRzLlZFUkRBQ0NJT19UT0tFTiB9fSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZSBzZWNyZXRzLlZFUkRBQ0NJT19UT0tFTjtcbiAgICB9XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnZm5veC50b21sJykpKSB7XG4gICAgICAvLyBQdWJsaWMgcmVwb3NpdG9yaWVzIGNvbW1pdCB3b3JsZC1yZWFkYWJsZSBjaXBoZXJ0ZXh0cywgc28gdGhleSBkZWNyeXB0IHdpdGggYSBkZWRpY2F0ZWRcbiAgICAgIC8vIENJIGlkZW50aXR5ICh0aGUgUFVCTElDX0ZOT1hfQUdFX0tFWSBvcmdhbml6YXRpb24gc2VjcmV0KSBpbnN0ZWFkIG9mIHRoZSBvcmctaW50ZXJuYWxcbiAgICAgIC8vIG9uZTsgdGhlIGNhbGxlZSBzdGlsbCByZWNlaXZlcyBpdCB1bmRlciBpdHMgZGVjbGFyZWQgRk5PWF9BR0VfS0VZIG5hbWUuIFdoZW4gbm8gQ0lcbiAgICAgIC8vIGlkZW50aXR5IHJlc29sdmVzIChzZWUgZm5veEFnZUtleU1hcHBpbmcpLCBsZWF2ZSBhbnkgZXhpc3RpbmcgbWFwcGluZyB1bnRvdWNoZWQgYW5kIGFkZFxuICAgICAgLy8gbm9uZTogY3JlYXRpbmcgb3IgcmV3cml0aW5nIG9uZSBvbiBpbmNvbXBsZXRlIGluZm9ybWF0aW9uIHdvdWxkIG1hcCBhIHBvc3NpYmx5LXB1YmxpY1xuICAgICAgLy8gcmVwb3NpdG9yeSB0byB0aGUgd3JvbmcgaWRlbnRpdHksIGFuZCBhIGZub3ggcmVjaXBpZW50IHN5bmMgZmFpbHVyZSBkb2VzIG5vdCBzdG9wIHRoaXNcbiAgICAgIC8vIGdlbmVyYXRvciBmcm9tIHdyaXRpbmcgZmlsZXMg4oCUIHRoZSBmYWlsZWQgcnVuJ3MgcmVydW4gZmlsbHMgdGhlIG1hcHBpbmcgaW4uXG4gICAgICBjb25zdCBtYXBwaW5nID0gZm5veEFnZUtleU1hcHBpbmcoY29uZmlnKTtcbiAgICAgIGlmIChtYXBwaW5nKSB7XG4gICAgICAgIHNlY3JldHMuRk5PWF9BR0VfS0VZID0gbWFwcGluZztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKGtpbmQgPT09ICd0ZXN0LXJ1c3QnKSB7XG4gICAgY29uc3QgW3J1c3REaXJQYXRoXSA9IGNvbmZpZy5jYXJnb1RvbWxEaXJQYXRocztcbiAgICBpZiAocnVzdERpclBhdGggJiYgcnVzdERpclBhdGggIT09ICcuJykge1xuICAgICAgam9iLndpdGgud29ya2luZ19kaXJlY3RvcnkgPSBydXN0RGlyUGF0aDtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIGpvYi53aXRoLndvcmtpbmdfZGlyZWN0b3J5O1xuICAgIH1cbiAgfVxuXG4gIC8vIFJlY29uc3RydWN0IGZyb20gdGhlIHBhcnNlZCBjYWxsIHNvIGEgZGlmZmVyZW50bHkgY2FzZWQgb3duZXIgKEdpdEh1YiBpcyBjYXNlLWluc2Vuc2l0aXZlXG4gIC8vIHRoZXJlKSBpcyBhbHNvIG5vcm1hbGl6ZWQgdG8gdGhlIHJlcG9zaXRvcnkncyBvd24gb3JnYW5pemF0aW9uIC8gbWlycm9yLlxuICBpZiAob3JnV29ya2Zsb3dDYWxsICYmIGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXIvJykpIHtcbiAgICBqb2IudXNlcyA9IGBXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvJHtvcmdXb3JrZmxvd0NhbGwud29ya2Zsb3dOYW1lfS4ke29yZ1dvcmtmbG93Q2FsbC5leHRlbnNpb259QCR7b3JnV29ya2Zsb3dDYWxsLnJlZn1gO1xuICB9IGVsc2UgaWYgKG9yZ1dvcmtmbG93Q2FsbCAmJiBjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyTGFiLycpKSB7XG4gICAgam9iLnVzZXMgPSBgV2lsbEJvb3N0ZXJMYWIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzLyR7b3JnV29ya2Zsb3dDYWxsLndvcmtmbG93TmFtZX0uJHtvcmdXb3JrZmxvd0NhbGwuZXh0ZW5zaW9ufUAke29yZ1dvcmtmbG93Q2FsbC5yZWZ9YDtcbiAgfVxuXG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5Eb2NrZXJmaWxlICYmICFqb2Iud2l0aC5jaV9sYWJlbCAmJiBraW5kLnN0YXJ0c1dpdGgoJ3Rlc3QnKSkge1xuICAgIGpvYi53aXRoLmNpX2xhYmVsID0gJ2xhcmdlJztcbiAgfVxuICBjb25zdCBhY2NlcHRzUnVubmVySW5wdXQgPSBbJ3Rlc3QnLCAndGVzdC1ydXN0JywgJ2RlcGxveScsICdyZWxlYXNlJywgJ3J1bi1zY3JpcHQnXS5pbmNsdWRlcyhcbiAgICBvcmdXb3JrZmxvd0NhbGw/LndvcmtmbG93TmFtZSA/PyAnJ1xuICApO1xuICBpZiAoY29uZmlnLmlzUmVwb1Zpc2liaWxpdHlLbm93bikge1xuICAgIGlmIChjb25maWcuaXNQdWJsaWNSZXBvICYmIGFjY2VwdHNSdW5uZXJJbnB1dCkge1xuICAgICAgam9iLndpdGguZ2l0aHViX2hvc3RlZF9ydW5uZXIgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgam9iLndpdGguZ2l0aHViX2hvc3RlZF9ydW5uZXI7XG4gICAgfVxuICAgIGlmICghY29uZmlnLmlzUHVibGljUmVwbyAmJiBqb2Iud2l0aC5ydW5zX29uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGxhYmVscyA9IHpcbiAgICAgICAgLnN0cmluZygpXG4gICAgICAgIC50cmFuc2Zvcm0oKHZhbHVlLCBjdHgpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UodmFsdWUpIGFzIHVua25vd247XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICBjdHguYWRkSXNzdWUoeyBjb2RlOiAnY3VzdG9tJywgbWVzc2FnZTogJ0V4cGVjdGVkIEpTT04gcnVubmVyIGxhYmVscycgfSk7XG4gICAgICAgICAgICByZXR1cm4gei5ORVZFUjtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5waXBlKHouYXJyYXkoei5zdHJpbmcoKSkpXG4gICAgICAgIC5zYWZlUGFyc2Uoam9iLndpdGgucnVuc19vbik7XG4gICAgICBpZiAobGFiZWxzLnN1Y2Nlc3MgJiYgbGFiZWxzLmRhdGEuaW5jbHVkZXMoJ3NlbGYtaG9zdGVkJykpIHtcbiAgICAgICAgam9iLndpdGgucnVuc19vbiA9IEpTT04uc3RyaW5naWZ5KGxhYmVscy5kYXRhKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgUmVtb3ZlZCBydW5zX29uIGZyb20gJHtqb2IudXNlc306IHByaXZhdGUgcmVwb3NpdG9yaWVzIHJlcXVpcmUgYSBzZWxmLWhvc3RlZCBsYWJlbCBhcnJheS5gKTtcbiAgICAgICAgZGVsZXRlIGpvYi53aXRoLnJ1bnNfb247XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKE9iamVjdC5rZXlzKGpvYi53aXRoKS5sZW5ndGggPiAwKSB7XG4gICAgc29ydEtleXMoam9iLndpdGgpO1xuICB9IGVsc2Uge1xuICAgIGRlbGV0ZSBqb2Iud2l0aDtcbiAgfVxuICBpZiAoc2VjcmV0cykge1xuICAgIGlmIChPYmplY3Qua2V5cyhzZWNyZXRzKS5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBuZXdTZWNyZXRzID0gc29ydEtleXMoc2VjcmV0cyk7XG4gICAgICBkZWxldGUgam9iLnNlY3JldHM7XG4gICAgICBqb2Iuc2VjcmV0cyA9IG5ld1NlY3JldHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZSBqb2Iuc2VjcmV0cztcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgc2VjcmV0IGV4cHJlc3Npb24gdGhlIGNhbGxlciBtYXBzIGludG8gdGhlIGNhbGxlZSdzIGRlY2xhcmVkIEZOT1hfQUdFX0tFWSwgb3IgdW5kZWZpbmVkXG4gKiB3aGVuIHRoZSByZXBvc2l0b3J5IHN0YXRlIGRvZXMgbm90IGlkZW50aWZ5IGEgdXNhYmxlIENJIGlkZW50aXR5IOKAlCBhbiB1bmtub3duIHZpc2liaWxpdHksIGFcbiAqIHJlcG9zaXRvcnkgbm8gQ0kgc2NvcGUgY292ZXJzIChkZXJpdmluZyBmcm9tIHRoZSBzYW1lIHByaW5jaXBhbCByb3N0ZXIgYXMgdGhlIHJlY2lwaWVudCBzeW5jXG4gKiBrZWVwcyB0aGUgdHdvIGZyb20gZXZlciBkaXNhZ3JlZWluZyksIG9yIGEgZmFpbGVkIGZub3ggcmVjaXBpZW50IHN5bmMsIHdob3NlIGNpcGhlcnRleHRzIG1heVxuICogc3RpbGwgdGFyZ2V0IHRoZSBwcmV2aW91cyBpZGVudGl0eS4gVGhlIGNhbGxlciBtdXN0IHRoZW4gcHJlc2VydmUgYW55IGV4aXN0aW5nIG1hcHBpbmcuXG4gKi9cbmZ1bmN0aW9uIGZub3hBZ2VLZXlNYXBwaW5nKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghY29uZmlnLmlzUmVwb1Zpc2liaWxpdHlLbm93biB8fCBoYXNGbm94U3luY0ZhaWxlZCgpKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBzZWNyZXROYW1lID0gcmVzb2x2ZUZub3hDaUFnZUtleVNlY3JldE5hbWUoY29uZmlnKTtcbiAgcmV0dXJuIHNlY3JldE5hbWUgJiYgYFxcJHt7IHNlY3JldHMuJHtzZWNyZXROYW1lfSB9fWA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlWWFtbChuZXdTZXR0aW5nczogV29ya2Zsb3csIGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgLy8gQSBwZXJtaXNzaW9ucyBvYmplY3QgZW1wdGllZCBieSB0aGUgcGVyLWtpbmQgZGVsZXRpb25zIChlLmcuIGFuIGV4aXN0aW5nIHRlc3QtcnVzdCBjYWxsZXJcbiAgLy8gd2hvc2Ugb25seSBlbnRyeSB3YXMgYGFjdGlvbnNgKSBtdXN0IGJlIGRyb3BwZWQgZW50aXJlbHk6IGBwZXJtaXNzaW9uczoge31gIHN0cmlwcyBFVkVSWVxuICAvLyB0b2tlbiBwZXJtaXNzaW9uIGZyb20gdGhlIHdvcmtmbG93LCB1bmxpa2UgdGhlIGFic2VudCBrZXkgd2hpY2gga2VlcHMgdGhlIGRlZmF1bHRzLlxuICBpZiAobmV3U2V0dGluZ3MucGVybWlzc2lvbnMgJiYgT2JqZWN0LmtleXMobmV3U2V0dGluZ3MucGVybWlzc2lvbnMpLmxlbmd0aCA9PT0gMCkge1xuICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucztcbiAgfVxuICBjb25zdCB5YW1sVGV4dCA9IHlhbWwuZHVtcChuZXdTZXR0aW5ncywgeyBsaW5lV2lkdGg6IC0xIH0pO1xuICBhd2FpdCBmc1V0aWwud3JpdGVGaWxlQ29uZmluZWQoZmlsZVBhdGgsIHlhbWxUZXh0KTtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGdsb2JJZ25vcmUgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcblxuaW1wb3J0IHsgaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8gfSBmcm9tICcuLi9nZW5lcmF0b3JzL3dvcmtmbG93LmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IGdldFdvcmtzcGFjZURpclBhdHRlcm5zIH0gZnJvbSAnLi4vdXRpbHMvd29ya3NwYWNlVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhUeXBvcyhwYWNrYWdlQ29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4VHlwb3MnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHBhY2thZ2VDb25maWcucmVwb3NpdG9yeSkpIHJldHVybjtcblxuICAgIGNvbnN0IGRpclBhdGggPSBwYWNrYWdlQ29uZmlnLmRpclBhdGg7XG4gICAgY29uc3QgZG9jRmlsZXMgPSBhd2FpdCBmZy5nbG9iKCcqKi8qLm1kJywgeyBkb3Q6IHRydWUsIGN3ZDogZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH0pO1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBGb3VuZCAke2RvY0ZpbGVzLmxlbmd0aH0gbWFya2Rvd24gZmlsZXMgaW4gJHtkaXJQYXRofWApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IG1kRmlsZSBvZiBkb2NGaWxlcykge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgbWRGaWxlKTtcbiAgICAgIHZvaWQgcHJvbWlzZVBvb2wucnVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgICAgICAgaWYgKGNvbnRlbnQgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgICAgICBsZXQgbmV3Q29udGVudCA9IGZpeFR5cG9zSW5UZXh0KGNvbnRlbnQpO1xuICAgICAgICBuZXdDb250ZW50ID0gcmVwbGFjZVdpdGhDb25maWcobmV3Q29udGVudCwgcGFja2FnZUNvbmZpZywgJ2RvYycpO1xuICAgICAgICBpZiAoY29udGVudCAhPT0gbmV3Q29udGVudCkge1xuICAgICAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBmaXhUeXBvcyBydW5zIG9uY2Ugb24gdGhlIHJvb3QgY29uZmlnLCBzbyB0aGlzIGdsb2Igc2V0IG11c3QgY292ZXIgZXZlcnkgZGVjbGFyZWQgd29ya3NwYWNlXG4gICAgLy8gbGF5b3V0IChlLmcuIGFwcHMvKiksIG5vdCBqdXN0IHRoZSBjb252ZW50aW9uYWwgcGFja2FnZXMvKiBkaXJlY3Rvcnkg4oCUIHdoaWxlIGhvbm9yaW5nXG4gICAgLy8gZGVjbGFyZWQgbmVnYXRpb25zIChlLmcuIGAhYXBwcy9leGNsdWRlZGApLCB3aG9zZSBzb3VyY2VzIGFyZSBub3QgcGFydCBvZiB0aGUgbW9ub3JlcG8uXG4gICAgY29uc3Qgd29ya3NwYWNlRGlyUGF0dGVybnMgPSBnZXRXb3Jrc3BhY2VEaXJQYXR0ZXJucyhwYWNrYWdlQ29uZmlnKTtcbiAgICBjb25zdCB0c0ZpbGVzID0gYXdhaXQgZmcuZ2xvYihcbiAgICAgIFtcbiAgICAgICAgJ3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3gsY3RzLG10cyx0cyx0c3h9JyxcbiAgICAgICAgJ3BhY2thZ2VzLyoqL3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3gsY3RzLG10cyx0cyx0c3h9JyxcbiAgICAgICAgLi4ud29ya3NwYWNlRGlyUGF0dGVybnMuaW5jbHVkZXMubWFwKFxuICAgICAgICAgIChkaXJQYXR0ZXJuKSA9PiBgJHtkaXJQYXR0ZXJufS8qKi97YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4LGN0cyxtdHMsdHMsdHN4fWBcbiAgICAgICAgKSxcbiAgICAgIF0sXG4gICAgICB7XG4gICAgICAgIGRvdDogdHJ1ZSxcbiAgICAgICAgY3dkOiBkaXJQYXRoLFxuICAgICAgICBpZ25vcmU6IFsuLi5nbG9iSWdub3JlLCAuLi53b3Jrc3BhY2VEaXJQYXR0ZXJucy5leGNsdWRlcy5tYXAoKGRpclBhdHRlcm4pID0+IGAke2RpclBhdHRlcm59LyoqYCldLFxuICAgICAgfVxuICAgICk7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYEZvdW5kICR7dHNGaWxlcy5sZW5ndGh9IFR5cGVTY3JpcHQgZmlsZXMgaW4gJHtkaXJQYXRofWApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHRzRmlsZSBvZiB0c0ZpbGVzKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCB0c0ZpbGUpO1xuICAgICAgdm9pZCBwcm9taXNlUG9vbC5ydW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpO1xuICAgICAgICBpZiAob2xkQ29udGVudCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgICAgIGxldCBuZXdDb250ZW50ID0gZml4VHlwb3NJbkNvZGUob2xkQ29udGVudCk7XG4gICAgICAgIG5ld0NvbnRlbnQgPSByZXBsYWNlV2l0aENvbmZpZyhuZXdDb250ZW50LCBwYWNrYWdlQ29uZmlnLCAndHMnKTtcblxuICAgICAgICBpZiAob2xkQ29udGVudCAhPT0gbmV3Q29udGVudCkge1xuICAgICAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCB0ZXh0QmFzZWRGaWxlcyA9IGF3YWl0IGZnLmdsb2IoJyoqLyoue2NzdixodG0saHRtbCx0c3YseG1sLHlhbWwseW1sfScsIHtcbiAgICAgIGRvdDogdHJ1ZSxcbiAgICAgIGN3ZDogZGlyUGF0aCxcbiAgICAgIGlnbm9yZTogZ2xvYklnbm9yZSxcbiAgICB9KTtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRm91bmQgJHt0ZXh0QmFzZWRGaWxlcy5sZW5ndGh9IHRleHQtYmFzZWQgZmlsZXMgaW4gJHtkaXJQYXRofWApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgdGV4dEJhc2VkRmlsZXMpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIGZpbGUpO1xuICAgICAgdm9pZCBwcm9taXNlUG9vbC5ydW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpO1xuICAgICAgICBpZiAob2xkQ29udGVudCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgICAgIGxldCBuZXdDb250ZW50ID0gZml4VHlwb3NJblRleHQob2xkQ29udGVudCk7XG4gICAgICAgIG5ld0NvbnRlbnQgPSByZXBsYWNlV2l0aENvbmZpZyhuZXdDb250ZW50LCBwYWNrYWdlQ29uZmlnLCAndGV4dCcpO1xuXG4gICAgICAgIGlmIChvbGRDb250ZW50ICE9PSBuZXdDb250ZW50KSB7XG4gICAgICAgICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaXhUeXBvc0luVGV4dChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gY29udGVudFxuICAgIC5yZXBsYWNlQWxsKC9cXGJjXFwuZlxcLig/PVxcc3wkKS9nLCAnY2YuJylcbiAgICAucmVwbGFjZUFsbCgvXFxiZWdcXC4oPz1cXHN8JCkvZywgJ2UuZy4nKVxuICAgIC5yZXBsYWNlQWxsKC9cXGJpZVxcLig/PVxccykvZywgJ2kuZS4nKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpeFR5cG9zSW5Db2RlKGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiAoXG4gICAgY29udGVudFxuICAgICAgLnJlcGxhY2VBbGwoL1xcL1xcKltcXHNcXFNdKj9cXCpcXC8vZywgKGNvbW1lbnQpID0+IGZpeFR5cG9zSW5UZXh0KGNvbW1lbnQpKVxuICAgICAgLy8gVGhlIHdvcmQgYm91bmRhcnkgYW5kIHRyYWlsaW5nLXdoaXRlc3BhY2UgZ3VhcmQga2VlcCB3b3JkcyBtZXJlbHkgZW5kaW5nIGluIHRoZVxuICAgICAgLy8gYWJicmV2aWF0aW9uIGxldHRlcnMgKGUuZy4gXCJjb29raWUuXCIsIFwibGVnLlwiKSBpbnRhY3QuXG4gICAgICAucmVwbGFjZUFsbCgvKF58XFxzKVxcL1xcLyguKj8pXFxiY1xcLmZcXC4oPz1cXHN8JCkvZywgJyQxLy8kMmNmLicpXG4gICAgICAucmVwbGFjZUFsbCgvKF58XFxzKVxcL1xcLyguKj8pXFxiZWdcXC4oPz1cXHN8JCkvZywgJyQxLy8kMmUuZy4nKVxuICAgICAgLnJlcGxhY2VBbGwoLyhefFxccylcXC9cXC8oLio/KVxcYmllXFwuKD89XFxzfCQpL2csICckMS8vJDJpLmUuJylcbiAgKTtcbn1cblxuZnVuY3Rpb24gcmVwbGFjZVdpdGhDb25maWcobmV3Q29udGVudDogc3RyaW5nLCBwYWNrYWdlQ29uZmlnOiBQYWNrYWdlQ29uZmlnLCBwcm9wTmFtZTogJ2RvYycgfCAndHMnIHwgJ3RleHQnKTogc3RyaW5nIHtcbiAgZm9yIChjb25zdCBbYmVmb3JlLCBhZnRlcl0gb2YgT2JqZWN0LmVudHJpZXMocGFja2FnZUNvbmZpZy53YmZ5SnNvbj8udHlwb3M/LmFsbCA/PyB7fSkpIHtcbiAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlQWxsKGJlZm9yZSwgYWZ0ZXIpO1xuICB9XG4gIGZvciAoY29uc3QgW2JlZm9yZSwgYWZ0ZXJdIG9mIE9iamVjdC5lbnRyaWVzKHBhY2thZ2VDb25maWcud2JmeUpzb24/LnR5cG9zPy5bcHJvcE5hbWVdID8/IHt9KSkge1xuICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2VBbGwoYmVmb3JlLCBhZnRlcik7XG4gIH1cbiAgcmV0dXJuIG5ld0NvbnRlbnQ7XG59XG4iLCJpbXBvcnQgY2hpbGRQcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmltcG9ydCB7IE9jdG9raXQgfSBmcm9tICdAb2N0b2tpdC9jb3JlJztcblxuY2xhc3MgR2l0SHViVXRpbCB7XG4gIGdldE9yZ0FuZE5hbWUodXJsT3JGdWxsTmFtZTogc3RyaW5nKTogW3N0cmluZywgc3RyaW5nXSB7XG4gICAgY29uc3QgdXJsV2l0aG91dFByb3RvY29sID0gdXJsT3JGdWxsTmFtZS5zcGxpdCgnOicpLmF0KC0xKTtcbiAgICBjb25zdCBuYW1lcyA9IHVybFdpdGhvdXRQcm90b2NvbD8uc3BsaXQoJy8nKTtcbiAgICBjb25zdCBvcmcgPSBuYW1lcz8uYXQoLTIpID8/ICcnO1xuICAgIC8vIFRoZSBkb3QgbXVzdCBiZSBlc2NhcGVkOiBhbiB1bmVzY2FwZWQgYC5gIG1hdGNoZXMgQU5ZIGNoYXJhY3Rlciwgc28gYGxlZ2l0YCBsb3N0IGl0cyBgbGAgYW5kIGBlYC5cbiAgICBjb25zdCBuYW1lID0gbmFtZXM/LmF0KC0xKT8ucmVwbGFjZSgvXFwuZ2l0JC91LCAnJykgPz8gJyc7XG4gICAgcmV0dXJuIFtvcmcsIG5hbWVdO1xuICB9XG59XG5leHBvcnQgY29uc3QgZ2l0SHViVXRpbCA9IG5ldyBHaXRIdWJVdGlsKCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0dpdEh1YlBlcm1pc3Npb25PclZpc2liaWxpdHlFcnJvcihlcnJvcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAoIWVycm9yIHx8IHR5cGVvZiBlcnJvciAhPT0gJ29iamVjdCcpIHJldHVybiBmYWxzZTtcbiAgY29uc3Qgc3RhdHVzID0gKGVycm9yIGFzIHsgc3RhdHVzPzogbnVtYmVyIH0pLnN0YXR1cztcbiAgcmV0dXJuIHN0YXR1cyA9PT0gNDAxIHx8IHN0YXR1cyA9PT0gNDAzIHx8IHN0YXR1cyA9PT0gNDA0O1xufVxuXG5jb25zdCBvY3Rva2l0Q2FjaGUgPSBuZXcgTWFwPHN0cmluZywgT2N0b2tpdD4oKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldE9jdG9raXQob3duZXI/OiBzdHJpbmcpOiBPY3Rva2l0IHtcbiAgLy8gR2l0SHViIG93bmVyIG5hbWVzIGFyZSBjYXNlLWluc2Vuc2l0aXZlLCBzbyBjcmVkZW50aWFsIHNlbGVjdGlvbiAoYW5kIHRoZSBjYWNoZSBrZXkpIG11c3RcbiAgLy8gbm90IGRlcGVuZCBvbiBob3cgYSByZW1vdGUgVVJMIGhhcHBlbnMgdG8gc3BlbGwgdGhlIG9yZ2FuaXphdGlvbi5cbiAgY29uc3Qga2V5ID0gb3duZXI/LnRvTG93ZXJDYXNlKCkgPz8gJyc7XG4gIGNvbnN0IGNhY2hlZCA9IG9jdG9raXRDYWNoZS5nZXQoa2V5KTtcbiAgaWYgKGNhY2hlZCkgcmV0dXJuIGNhY2hlZDtcblxuICBjb25zdCBvY3Rva2l0ID0gbmV3IE9jdG9raXQoe1xuICAgIGF1dGg6IGdldEdpdEh1YlRva2VuKG93bmVyKSB8fCB1bmRlZmluZWQsXG4gIH0pO1xuICBvY3Rva2l0Q2FjaGUuc2V0KGtleSwgb2N0b2tpdCk7XG4gIHJldHVybiBvY3Rva2l0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzR2l0SHViVG9rZW4ob3duZXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gISFnZXRHaXRIdWJUb2tlbihvd25lcik7XG59XG5cbmZ1bmN0aW9uIGdldEdpdEh1YlRva2VuKG93bmVyPzogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgLy8gQ2FzZS1pbnNlbnNpdGl2ZSBvbiBwdXJwb3NlOiBhIG5vbmNhbm9uaWNhbGx5IGNhc2VkIHJlbW90ZSAoZS5nLiBnaXRodWIuY29tL3dpbGxib29zdGVybGFiL+KApilcbiAgLy8gbXVzdCBzdGlsbCBzZWxlY3QgdGhlIG9yZ2FuaXphdGlvbidzIG93biBQQVQg4oCUIGZhbGxpbmcgdGhyb3VnaCB0byB0aGUgZ2VuZXJpYyBicmFuY2ggd291bGRcbiAgLy8gcHJlZmVyIHRoZSBPVEhFUiBvcmdhbml6YXRpb24ncyBQQVQsIHdoaWNoIGNhbm5vdCByZWFkIHRoaXMgb3JnYW5pemF0aW9uJ3MgcHJpdmF0ZVxuICAvLyByZXBvc2l0b3JpZXMuXG4gIGNvbnN0IG5vcm1hbGl6ZWRPd25lciA9IG93bmVyPy50b0xvd2VyQ2FzZSgpO1xuICBpZiAobm9ybWFsaXplZE93bmVyID09PSAnd2lsbGJvb3N0ZXInKSB7XG4gICAgcmV0dXJuIHByb2Nlc3MuZW52LkdIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSIHx8IGdldEdpdEh1YkNsaVRva2VuKCk7XG4gIH1cbiAgaWYgKG5vcm1hbGl6ZWRPd25lciA9PT0gJ3dpbGxib29zdGVybGFiJykge1xuICAgIHJldHVybiBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUkxBQiB8fCBnZXRHaXRIdWJDbGlUb2tlbigpO1xuICB9XG4gIHJldHVybiAoXG4gICAgcHJvY2Vzcy5lbnYuR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVIgfHxcbiAgICBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUkxBQiB8fFxuICAgIHByb2Nlc3MuZW52LkdIX1RPS0VOIHx8XG4gICAgcHJvY2Vzcy5lbnYuR0lUSFVCX1RPS0VOIHx8XG4gICAgZ2V0R2l0SHViQ2xpVG9rZW4oKVxuICApO1xufVxuXG5sZXQgZ2l0SHViQ2xpVG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuZnVuY3Rpb24gZ2V0R2l0SHViQ2xpVG9rZW4oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGdpdEh1YkNsaVRva2VuICE9PSB1bmRlZmluZWQpIHJldHVybiBnaXRIdWJDbGlUb2tlbiB8fCB1bmRlZmluZWQ7XG5cbiAgdHJ5IHtcbiAgICAvLyBTb21lIGxvY2FsIHJ1bnMgcmVseSBvbiBHaXRIdWIgQ0xJIGF1dGhlbnRpY2F0aW9uIGluc3RlYWQgb2YgZXhwb3J0ZWQgZW52IHRva2Vucy5cbiAgICBnaXRIdWJDbGlUb2tlbiA9XG4gICAgICBjaGlsZFByb2Nlc3NcbiAgICAgICAgLmV4ZWNGaWxlU3luYygnZ2gnLCBbJ2F1dGgnLCAndG9rZW4nXSwge1xuICAgICAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgICAgICAgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAnaWdub3JlJ10sXG4gICAgICAgIH0pXG4gICAgICAgIC50cmltKCkgfHwgJyc7XG4gIH0gY2F0Y2gge1xuICAgIGdpdEh1YkNsaVRva2VuID0gJyc7XG4gIH1cbiAgcmV0dXJuIGdpdEh1YkNsaVRva2VuIHx8IHVuZGVmaW5lZDtcbn1cbiIsImltcG9ydCB0eXBlIHsgUGFyc2VFcnJvciB9IGZyb20gJ2pzb25jLXBhcnNlcic7XG5pbXBvcnQgeyBhcHBseUVkaXRzLCBjcmVhdGVTY2FubmVyLCBmaW5kTm9kZUF0TG9jYXRpb24sIG1vZGlmeSwgcGFyc2UgYXMgcGFyc2VKc29uYywgcGFyc2VUcmVlIH0gZnJvbSAnanNvbmMtcGFyc2VyJztcblxuLy8ganNvbmMtcGFyc2VyIGRlY2xhcmVzIFN5bnRheEtpbmQvU2NhbkVycm9yIGFzIGFtYmllbnQgY29uc3QgZW51bXMsIHdoaWNoIGNhbm5vdCBiZSBpbXBvcnRlZFxuLy8gdW5kZXIgdmVyYmF0aW1Nb2R1bGVTeW50YXg7IG1pcnJvciB0aGUgbmVlZGVkIG1lbWJlciB2YWx1ZXMgbG9jYWxseS5cbmNvbnN0IHN5bnRheEtpbmQgPSB7IGxpbmVDb21tZW50VHJpdmlhOiAxMiwgYmxvY2tDb21tZW50VHJpdmlhOiAxMywgbGluZUJyZWFrVHJpdmlhOiAxNCwgdHJpdmlhOiAxNSwgZW9mOiAxNyB9O1xuY29uc3Qgc2NhbkVycm9yTm9uZSA9IDA7XG5cbmV4cG9ydCBjb25zdCBqc29uY1V0aWwgPSB7XG4gIC8qKlxuICAgKiBUZWxscyB3aGV0aGVyIHRoZSBjb250ZW50IGhvbGRzIG5vIGNvbmZpZ3VyYXRpb24gYXQgYWxsIOKAlCBvbmx5IHdoaXRlc3BhY2UsIGNvbXBsZXRlIGNvbW1lbnRzLFxuICAgKiBhbmQvb3IgYSBCT00uIHRzYyB0cmVhdHMgc3VjaCBhIHRzY29uZmlnLmpzb24gYXMgYW4gZW1wdHkgY29uZmlnLCBzbyBnZW5lcmF0b3JzIHNob3VsZCB0cmVhdFxuICAgKiBpdCBsaWtlIGEgbWlzc2luZyBmaWxlIChhbmQgZ2VuZXJhdGUgZGVmYXVsdHMpIGluc3RlYWQgb2YgcmVmdXNpbmcgdG8gbWFuYWdlIGl0LiBMZXhpY2FsbHlcbiAgICogYnJva2VuIHRyaXZpYSAoZS5nLiBhbiB1bnRlcm1pbmF0ZWQgYmxvY2sgY29tbWVudCkgaXMgTk9UIHRyaXZpYS1vbmx5OiB0aGUgZmlsZSBtdXN0IGJlIGxlZnRcbiAgICogdW50b3VjaGVkIHJhdGhlciB0aGFuIG92ZXJ3cml0dGVuIHdpdGggZGVmYXVsdHMuXG4gICAqL1xuICBpc1RyaXZpYU9ubHkoY29udGVudDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc2Nhbm5lciA9IGNyZWF0ZVNjYW5uZXIoY29udGVudC5yZXBsYWNlKC9eXFx1RkVGRi8sICcnKSk7XG4gICAgZm9yIChsZXQga2luZDogbnVtYmVyID0gc2Nhbm5lci5zY2FuKCk7IGtpbmQgIT09IHN5bnRheEtpbmQuZW9mOyBraW5kID0gc2Nhbm5lci5zY2FuKCkpIHtcbiAgICAgIGlmIChcbiAgICAgICAgKHNjYW5uZXIuZ2V0VG9rZW5FcnJvcigpIGFzIG51bWJlcikgIT09IHNjYW5FcnJvck5vbmUgfHxcbiAgICAgICAgKGtpbmQgIT09IHN5bnRheEtpbmQubGluZUNvbW1lbnRUcml2aWEgJiZcbiAgICAgICAgICBraW5kICE9PSBzeW50YXhLaW5kLmJsb2NrQ29tbWVudFRyaXZpYSAmJlxuICAgICAgICAgIGtpbmQgIT09IHN5bnRheEtpbmQudHJpdmlhICYmXG4gICAgICAgICAga2luZCAhPT0gc3ludGF4S2luZC5saW5lQnJlYWtUcml2aWEpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgLyoqXG4gICAqIFBhcnNlcyBhIEpTT05DIChKU09OIHdpdGggY29tbWVudHMpIG9iamVjdCBmcm9tIGNvbmZpZyBmaWxlcyBzdWNoIGFzIHRzY29uZmlnLmpzb24sXG4gICAqIHB5cmlnaHRjb25maWcuanNvbiwgcmVub3ZhdGUuanNvbiwgLnZzY29kZS9zZXR0aW5ncy5qc29uLCBhbmQgd3JhbmdsZXIuanNvbmMuXG4gICAqXG4gICAqIGpzb25jLXBhcnNlciBpcyBmYXVsdCB0b2xlcmFudCBhbmQgcmV0dXJucyBhIHBhcnRpYWwgb2JqZWN0IGZvciBtYWxmb3JtZWQgaW5wdXQsIHdoaWNoIG11c3RcbiAgICogbm90IGJlIHRyZWF0ZWQgYXMgdGhlIGZpbGUncyBjb25maWd1cmF0aW9uOyByZWplY3QgYW55IHBhcnNlIGVycm9yIGluc3RlYWQuIEEgbGVhZGluZyBCT00gaXNcbiAgICogc3RyaXBwZWQgYmVjYXVzZSBUeXBlU2NyaXB0IGFjY2VwdHMgQk9NJ2QgY29uZmlnIGZpbGVzIHdoaWxlIGpzb25jLXBhcnNlciByZXBvcnRzIHRoZSBCT00gYXNcbiAgICogYSBwYXJzZSBlcnJvci4gQ2FsbGVycyB3aG9zZSByZWFkZXIgcmVqZWN0cyB0cmFpbGluZyBjb21tYXMgdHVybiBgYWxsb3dUcmFpbGluZ0NvbW1hYFxuICAgKiBvZmYgc28gc3VjaCBhIGZpbGUgaXMgcmVwb3J0ZWQgYXMgbWFsZm9ybWVkIGhlcmUgdG9vLlxuICAgKi9cbiAgcGFyc2VPYmplY3RJZ25vcmluZ0Vycm9yPFQgZXh0ZW5kcyBvYmplY3Q+KGNvbnRlbnQ6IHN0cmluZywgYWxsb3dUcmFpbGluZ0NvbW1hID0gdHJ1ZSk6IFQgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHBhcnNlRXJyb3JzOiBQYXJzZUVycm9yW10gPSBbXTtcbiAgICBjb25zdCB2YWx1ZSA9IHBhcnNlSnNvbmMoY29udGVudC5yZXBsYWNlKC9eXFx1RkVGRi8sICcnKSwgcGFyc2VFcnJvcnMsIHsgYWxsb3dUcmFpbGluZ0NvbW1hIH0pIGFzIFQgfCB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHBhcnNlRXJyb3JzLmxlbmd0aCA9PT0gMCAmJiAhIXZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpXG4gICAgICA/IHZhbHVlXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgfSxcbiAgLyoqIFRlbGxzIHdoZXRoZXIgdGhlIGNvbnRlbnQgY2FycmllcyBhdCBsZWFzdCBvbmUgY29tbWVudCwgaS5lLiBjb250ZW50IEpTT04uc3RyaW5naWZ5IHdvdWxkIGRyb3AuICovXG4gIGNvbnRhaW5zQ29tbWVudChjb250ZW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBzY2FubmVyID0gY3JlYXRlU2Nhbm5lcihjb250ZW50LnJlcGxhY2UoL15cXHVGRUZGLywgJycpKTtcbiAgICBmb3IgKGxldCBraW5kOiBudW1iZXIgPSBzY2FubmVyLnNjYW4oKTsga2luZCAhPT0gc3ludGF4S2luZC5lb2Y7IGtpbmQgPSBzY2FubmVyLnNjYW4oKSkge1xuICAgICAgLy8gQSBsZXhpY2FsIGVycm9yIG1lYW5zIHRoZSByZW1haW5pbmcgdG9rZW5zIGFyZSB1bnJlbGlhYmxlOyByZXBvcnQgbm8gY29tbWVudCByYXRoZXIgdGhhblxuICAgICAgLy8gZ3Vlc3NpbmcuIEEgY2FsbGVyIHRoYXQgb25seSB3YXJucyBhYm91dCBkcm9wcGVkIGNvbW1lbnRzIGxvc2VzIG5vdGhpbmcsIGFuZCBvbmUgdGhhdFxuICAgICAgLy8gcmVmdXNlcyBhIGNvbW1lbnRlZCBmaWxlIGZvciBhIHN0cmljdC1KU09OIHJlYWRlciBzdGlsbCByZWplY3RzIHN1Y2ggY29udGVudCB3aGVuIGl0XG4gICAgICAvLyBwYXJzZXMgaXQuXG4gICAgICBpZiAoKHNjYW5uZXIuZ2V0VG9rZW5FcnJvcigpIGFzIG51bWJlcikgIT09IHNjYW5FcnJvck5vbmUpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmIChraW5kID09PSBzeW50YXhLaW5kLmxpbmVDb21tZW50VHJpdmlhIHx8IGtpbmQgPT09IHN5bnRheEtpbmQuYmxvY2tDb21tZW50VHJpdmlhKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuICAvKipcbiAgICogU2VyaWFsaXplcyBgc2V0dGluZ3NgIGludG8gYG9sZENvbnRlbnRgLCBlZGl0aW5nIG9ubHkgdGhlIHRvcC1sZXZlbCBwcm9wZXJ0aWVzIHdob3NlIHZhbHVlc1xuICAgKiBjaGFuZ2VkIHNvIHRoZSBjb21tZW50cyBhbmQgZm9ybWF0dGluZyBvZiBhbiBleGlzdGluZyBmaWxlIHN1cnZpdmUuIENhbGxlcnMgbmV2ZXIgZHJvcFxuICAgKiBwcm9wZXJ0aWVzIChnZW5lcmF0ZWQgc2V0dGluZ3MgYXJlIG1lcmdlZCBPTiBUT1Agb2YgdGhlIGV4aXN0aW5nIG9uZXMpLCBzbyByZW1vdmFscyBhcmUgbm90XG4gICAqIGhhbmRsZWQ6IGEgcHJvcGVydHkgbWlzc2luZyBmcm9tIGBzZXR0aW5nc2AgaXMgbGVmdCB1bnRvdWNoZWQgcmF0aGVyIHRoYW4gZGVsZXRlZC5cbiAgICpcbiAgICogVHJpdmlhLW9ubHkgY29udGVudCBrZWVwcyBpdHMgY29tbWVudHMgYXMgYSBoZWFkZXIgYWJvdmUgdGhlIGdlbmVyYXRlZCBvYmplY3QsIHJhdGhlciB0aGFuXG4gICAqIGJlaW5nIHJlcGxhY2VkIG91dHJpZ2h0IG9yIHJ1biB0aHJvdWdoIG1vZGlmeSgpICh3aGljaCB3b3VsZCBtb3ZlIHRoZSBvYmplY3QgaW4gZnJvbnQgb2YgdGhlbSkuXG4gICAqL1xuICBzdHJpbmdpZnlQcmVzZXJ2aW5nVHJpdmlhKFxuICAgIG9sZENvbnRlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBzZXR0aW5nczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKTogeyBjb250ZW50OiBzdHJpbmc7IGtleXNMb3NpbmdDb21tZW50czogc3RyaW5nW10gfSB7XG4gICAgaWYgKG9sZENvbnRlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHsgY29udGVudDogSlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MsIHVuZGVmaW5lZCwgMiksIGtleXNMb3NpbmdDb21tZW50czogW10gfTtcbiAgICB9XG5cbiAgICBjb25zdCBvbGRTZXR0aW5ncyA9IGpzb25jVXRpbC5wYXJzZU9iamVjdElnbm9yaW5nRXJyb3I8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KG9sZENvbnRlbnQpO1xuICAgIC8vIERyb3AgYSBsZWFkaW5nIEJPTTogbW9kaWZ5KCkgaW5zZXJ0cyB0aGUgZ2VuZXJhdGVkIG9iamVjdCBCRUZPUkUgYW55IGxlYWRpbmcgdHJpdmlhLCB3aGljaFxuICAgIC8vIHdvdWxkIGxlYXZlIHRoZSBCT00gc3RyYW5kZWQgbWlkLWZpbGUgd2hlcmUgaXQgaXMgYSBzeW50YXggZXJyb3IgcmF0aGVyIHRoYW4gYW4gaWdub3JlZCBtYXJrLlxuICAgIGxldCBjb250ZW50ID0gb2xkQ29udGVudC5yZXBsYWNlKC9eXFx1RkVGRi8sICcnKTtcbiAgICBpZiAoanNvbmNVdGlsLmlzVHJpdmlhT25seShjb250ZW50KSkge1xuICAgICAgY29uc3QgaGVhZGVyID0gY29udGVudC50cmltKCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBgJHtoZWFkZXIgPyBoZWFkZXIgKyAnXFxuJyA6ICcnfSR7SlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MsIHVuZGVmaW5lZCwgMil9YCxcbiAgICAgICAga2V5c0xvc2luZ0NvbW1lbnRzOiBbXSxcbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IG1vZGlmeU9wdGlvbnMgPSB7IGZvcm1hdHRpbmdPcHRpb25zOiBkZXRlY3RGb3JtYXR0aW5nT3B0aW9ucyhjb250ZW50KSB9O1xuICAgIGNvbnN0IGtleXNMb3NpbmdDb21tZW50czogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBuZXdFbnRyaWVzOiBbc3RyaW5nLCB1bmtub3duXVtdID0gW107XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc2V0dGluZ3MpKSB7XG4gICAgICBjb25zdCBvbGRWYWx1ZSA9IG9sZFNldHRpbmdzPy5ba2V5XTtcbiAgICAgIC8vIENvbXBhcmUgc2VyaWFsaXplZCBmb3JtcyBzbyBkZWVwLWVxdWFsIHZhbHVlcyAoZS5nLiBhIHJlLW1lcmdlZCBgZXh0ZW5kc2AgYXJyYXkpIGRvIG5vdFxuICAgICAgLy8gcmV3cml0ZSB0aGUgcHJvcGVydHkgYW5kIHJlZmxvdyBpdHMgZm9ybWF0dGluZy5cbiAgICAgIGlmIChKU09OLnN0cmluZ2lmeShvbGRWYWx1ZSkgPT09IEpTT04uc3RyaW5naWZ5KHZhbHVlKSkgY29udGludWU7XG4gICAgICBpZiAob2xkVmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBuZXdFbnRyaWVzLnB1c2goW2tleSwgdmFsdWVdKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICAvLyBSZXBsYWNpbmcgYSB3aG9sZSBhcnJheSB3b3VsZCBkaXNjYXJkIHRoZSBjb21tZW50cyBiZXR3ZWVuIGl0cyBlbGVtZW50cywgc28gZ3JvdyBpdCB3aXRoXG4gICAgICAvLyBwZXItZWxlbWVudCBpbnNlcnRpb25zIHdoZW5ldmVyIHRoZSBuZXcgdmFsdWUgb25seSBhZGRzIHRvIGl0LlxuICAgICAgY29uc3QgaW5zZXJ0aW9ucyA9IEFycmF5LmlzQXJyYXkob2xkVmFsdWUpICYmIEFycmF5LmlzQXJyYXkodmFsdWUpID8gZmluZEluc2VydGlvbnMob2xkVmFsdWUsIHZhbHVlKSA6IHVuZGVmaW5lZDtcbiAgICAgIGZvciAoY29uc3QgaW5zZXJ0aW9uIG9mIGluc2VydGlvbnMgPz8gW10pIHtcbiAgICAgICAgY29udGVudCA9IGFwcGx5RWRpdHMoXG4gICAgICAgICAgY29udGVudCxcbiAgICAgICAgICBtb2RpZnkoY29udGVudCwgW2tleSwgaW5zZXJ0aW9uLmluZGV4XSwgaW5zZXJ0aW9uLnZhbHVlLCB7IC4uLm1vZGlmeU9wdGlvbnMsIGlzQXJyYXlJbnNlcnRpb246IHRydWUgfSlcbiAgICAgICAgKTtcbiAgICAgICAgY29udGVudCA9IHJlc3RvcmVUcmFpbGluZ0NvbW1lbnQoY29udGVudCwga2V5LCBpbnNlcnRpb24uaW5kZXgpO1xuICAgICAgfVxuICAgICAgaWYgKGluc2VydGlvbnMpIGNvbnRpbnVlO1xuICAgICAgLy8gUmV3cml0aW5nIHRoZSB3aG9sZSB2YWx1ZSBpcyB0aGUgb25seSBvcHRpb24gbGVmdCAodGhlIG5ldyBvbmUgZHJvcHMgb3IgcmVvcmRlcnMgZWxlbWVudHMpLFxuICAgICAgLy8gYW5kIGl0IHRha2VzIGFueSBjb21tZW50IG5lc3RlZCBpbnNpZGUgaXQgYWxvbmcuIFJlcG9ydCB0aGF0IHJhdGhlciB0aGFuIGxvc2luZyBpdCBxdWlldGx5LlxuICAgICAgY29uc3QgcmVwbGFjZWRUZXh0ID0gdmFsdWVUZXh0T2YoY29udGVudCwga2V5KTtcbiAgICAgIGlmIChyZXBsYWNlZFRleHQgIT09IHVuZGVmaW5lZCAmJiBqc29uY1V0aWwuY29udGFpbnNDb21tZW50KHJlcGxhY2VkVGV4dCkpIGtleXNMb3NpbmdDb21tZW50cy5wdXNoKGtleSk7XG4gICAgICBjb250ZW50ID0gYXBwbHlFZGl0cyhjb250ZW50LCBtb2RpZnkoY29udGVudCwgW2tleV0sIHZhbHVlLCBtb2RpZnlPcHRpb25zKSk7XG4gICAgfVxuICAgIC8vIFByZXBlbmQgcmF0aGVyIHRoYW4gYXBwZW5kIHRoZSBwcm9wZXJ0aWVzIHRoYXQgYXJlIG5ldzogYXBwZW5kaW5nIGRldGFjaGVzIGEgdHJhaWxpbmdcbiAgICAvLyBzYW1lLWxpbmUgY29tbWVudCBmcm9tIHRoZSBsYXN0IHByb3BlcnR5LCBsZWF2aW5nIGl0IHRvIGRlc2NyaWJlIHRoZSBnZW5lcmF0ZWQgdmFsdWVcbiAgICAvLyBpbnN0ZWFkLiBJbnNlcnRpbmcgaW4gcmV2ZXJzZSBrZWVwcyB0aGUgb3JkZXIgdGhlIHNldHRpbmdzIGRlY2xhcmUgdGhlbSBpbi5cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBuZXdFbnRyaWVzLnRvUmV2ZXJzZWQoKSkge1xuICAgICAgY29udGVudCA9IGFwcGx5RWRpdHMoY29udGVudCwgbW9kaWZ5KGNvbnRlbnQsIFtrZXldLCB2YWx1ZSwgeyAuLi5tb2RpZnlPcHRpb25zLCBnZXRJbnNlcnRpb25JbmRleDogKCkgPT4gMCB9KSk7XG4gICAgfVxuICAgIHJldHVybiB7IGNvbnRlbnQsIGtleXNMb3NpbmdDb21tZW50cyB9O1xuICB9LFxufTtcblxuLyoqIFJldHVybnMgdGhlIHNvdXJjZSB0ZXh0IG9mIGEgdG9wLWxldmVsIHByb3BlcnR5J3MgdmFsdWUsIGNvbW1lbnRzIGFuZCBhbGwuICovXG5mdW5jdGlvbiB2YWx1ZVRleHRPZihjb250ZW50OiBzdHJpbmcsIGtleTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgcm9vdCA9IHBhcnNlVHJlZShjb250ZW50KTtcbiAgY29uc3Qgbm9kZSA9IHJvb3QgJiYgZmluZE5vZGVBdExvY2F0aW9uKHJvb3QsIFtrZXldKTtcbiAgcmV0dXJuIG5vZGUgJiYgY29udGVudC5zbGljZShub2RlLm9mZnNldCwgbm9kZS5vZmZzZXQgKyBub2RlLmxlbmd0aCk7XG59XG5cbi8vIFRoZSB3aG9sZSBzYW1lLWxpbmUgY29tbWVudCBzZXF1ZW5jZSwgbm90IGp1c3QgdGhlIGZpcnN0IG9uZTogYSBsaW5lIGNvbW1lbnQgZW5kcyBpdCAoaXQgcnVucyB0b1xuLy8gdGhlIG5ld2xpbmUpLCBidXQgYW55IG51bWJlciBvZiBibG9jayBjb21tZW50cyBjYW4gcHJlY2VkZSBpdCwgYW5kIG1vdmluZyBvbmx5IHRoZSBmaXJzdCB3b3VsZFxuLy8gbGVhdmUgdGhlIHJlc3QgZGVzY3JpYmluZyB0aGUgd3JvbmcgZWxlbWVudC5cbmNvbnN0IHRyYWlsaW5nQ29tbWVudFBhdHRlcm4gPSAvXig/OlteXFxTXFxuXSpcXC9cXCpbXFxTXFxzXSo/XFwqXFwvKSooPzpbXlxcU1xcbl0qXFwvXFwvW15cXG5dKik/L3U7XG5cbi8qKlxuICogUmVhdHRhY2hlcyBhIHNhbWUtbGluZSBjb21tZW50IHRvIHRoZSBlbGVtZW50IGl0IGRlc2NyaWJlcy4gSW5zZXJ0aW5nIGludG8gYW4gYXJyYXkgcGxhY2VzIHRoZVxuICogbmV3IGVsZW1lbnQgQkVGT1JFIHRoZSB0cml2aWEgdGhhdCBmb2xsb3dzIGl0cyBwcmVkZWNlc3Nvciwgc28gYXBwZW5kaW5nIGFmdGVyXG4gKiBgeyAuLi4gfSAvLyB3aHkgdGhpcyBydWxlIGV4aXN0c2AgbGVhdmVzIHRoYXQgY29tbWVudCBleHBsYWluaW5nIHRoZSBnZW5lcmF0ZWQgZWxlbWVudCBpbnN0ZWFkLlxuICogQSBmcmVzaGx5IHNlcmlhbGl6ZWQgZWxlbWVudCBuZXZlciBjYXJyaWVzIGEgY29tbWVudCBvZiBpdHMgb3duLCBzbyBhbnl0aGluZyB0cmFpbGluZyB0aGVcbiAqIGluc2VydGlvbiBiZWxvbmdlZCB0byB0aGUgZWxlbWVudCBiZWZvcmUgaXQuXG4gKi9cbmZ1bmN0aW9uIHJlc3RvcmVUcmFpbGluZ0NvbW1lbnQoY29udGVudDogc3RyaW5nLCBrZXk6IHN0cmluZywgaW5zZXJ0ZWRJbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgaWYgKGluc2VydGVkSW5kZXggPT09IDApIHJldHVybiBjb250ZW50O1xuICBjb25zdCByb290ID0gcGFyc2VUcmVlKGNvbnRlbnQpO1xuICBjb25zdCBlbGVtZW50cyA9IChyb290ICYmIGZpbmROb2RlQXRMb2NhdGlvbihyb290LCBba2V5XSkpPy5jaGlsZHJlbjtcbiAgY29uc3QgaW5zZXJ0ZWQgPSBlbGVtZW50cz8uW2luc2VydGVkSW5kZXhdO1xuICBjb25zdCBwcmV2aW91cyA9IGVsZW1lbnRzPy5baW5zZXJ0ZWRJbmRleCAtIDFdO1xuICBpZiAoIWluc2VydGVkIHx8ICFwcmV2aW91cykgcmV0dXJuIGNvbnRlbnQ7XG4gIGNvbnN0IGluc2VydGVkRW5kID0gaW5zZXJ0ZWQub2Zmc2V0ICsgaW5zZXJ0ZWQubGVuZ3RoO1xuICBjb25zdCBjb21tZW50ID0gdHJhaWxpbmdDb21tZW50UGF0dGVybi5leGVjKGNvbnRlbnQuc2xpY2UoaW5zZXJ0ZWRFbmQpKT8uWzBdO1xuICBpZiAoIWNvbW1lbnQpIHJldHVybiBjb250ZW50O1xuICAvLyBMYW5kIHRoZSBjb21tZW50IGFmdGVyIHRoZSBzZXBhcmF0aW5nIGNvbW1hIHNvIHRoZSBlbGVtZW50IGtlZXBzIGl0cyBvd24gbGluZSBpbnRhY3QuXG4gIGNvbnN0IHByZXZpb3VzRW5kID0gcHJldmlvdXMub2Zmc2V0ICsgcHJldmlvdXMubGVuZ3RoO1xuICBjb25zdCByZXN0b3JlT2Zmc2V0ID0gcHJldmlvdXNFbmQgKyAoL15cXHMqLC91LmV4ZWMoY29udGVudC5zbGljZShwcmV2aW91c0VuZCkpPy5bMF0ubGVuZ3RoID8/IDApO1xuICByZXR1cm4gKFxuICAgIGNvbnRlbnQuc2xpY2UoMCwgcmVzdG9yZU9mZnNldCkgK1xuICAgIGNvbW1lbnQgK1xuICAgIGNvbnRlbnQuc2xpY2UocmVzdG9yZU9mZnNldCwgaW5zZXJ0ZWRFbmQpICtcbiAgICBjb250ZW50LnNsaWNlKGluc2VydGVkRW5kICsgY29tbWVudC5sZW5ndGgpXG4gICk7XG59XG5cbi8qKlxuICogTWlycm9ycyB0aGUgaW5kZW50YXRpb24gdGhlIGZpbGUgYWxyZWFkeSB1c2VzLCBzbyBhIHNlbWFudGljIGNoYW5nZSBkb2VzIG5vdCByZWluZGVudCB1bnJlbGF0ZWRcbiAqIGxpbmVzLiBUaGUgZmlyc3QgcHJvcGVydHkgaXMgbWVhc3VyZWQgcmF0aGVyIHRoYW4gdGhlIGZpcnN0IGluZGVudGVkIGxpbmUsIGJlY2F1c2UgYSBkZWNvcmF0ZWRcbiAqIGJsb2NrIGNvbW1lbnQgKGAgKiAuLi5gKSB3b3VsZCBvdGhlcndpc2UgcGFzcyBmb3IgdGhlIGZpbGUncyBpbmRlbnRhdGlvbi4gRmFsbHMgYmFjayB0byB0aGUgdHdvXG4gKiBzcGFjZXMgZXZlcnkgZ2VuZXJhdGVkIGNvbmZpZyB1c2VzLlxuICovXG5mdW5jdGlvbiBkZXRlY3RGb3JtYXR0aW5nT3B0aW9ucyhjb250ZW50OiBzdHJpbmcpOiB7IGluc2VydFNwYWNlczogYm9vbGVhbjsgdGFiU2l6ZTogbnVtYmVyIH0ge1xuICBjb25zdCBmaXJzdFByb3BlcnR5ID0gcGFyc2VUcmVlKGNvbnRlbnQpPy5jaGlsZHJlbj8uWzBdO1xuICBjb25zdCBpbmRlbnRhdGlvbiA9XG4gICAgZmlyc3RQcm9wZXJ0eSAmJiBjb250ZW50LnNsaWNlKGNvbnRlbnQubGFzdEluZGV4T2YoJ1xcbicsIGZpcnN0UHJvcGVydHkub2Zmc2V0KSArIDEsIGZpcnN0UHJvcGVydHkub2Zmc2V0KTtcbiAgaWYgKCFpbmRlbnRhdGlvbiB8fCAhL15bXFx0IF0rJC91LnRlc3QoaW5kZW50YXRpb24pKSByZXR1cm4geyBpbnNlcnRTcGFjZXM6IHRydWUsIHRhYlNpemU6IDIgfTtcbiAgaWYgKGluZGVudGF0aW9uLnN0YXJ0c1dpdGgoJ1xcdCcpKSByZXR1cm4geyBpbnNlcnRTcGFjZXM6IGZhbHNlLCB0YWJTaXplOiAxIH07XG4gIHJldHVybiB7IGluc2VydFNwYWNlczogdHJ1ZSwgdGFiU2l6ZTogaW5kZW50YXRpb24ubGVuZ3RoIH07XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZWxlbWVudHMgdG8gaW5zZXJ0IGludG8gYG9sZFZhbHVlYCB0byB0dXJuIGl0IGludG8gYG5ld1ZhbHVlYCwgb3IgdW5kZWZpbmVkIHdoZW5cbiAqIHRoYXQgaXMgaW1wb3NzaWJsZSBiZWNhdXNlIGBuZXdWYWx1ZWAgZHJvcHMgb3IgcmVvcmRlcnMgYW4gZXhpc3RpbmcgZWxlbWVudCAodGhlIGNhbGxlciBtdXN0XG4gKiB0aGVuIHJlcGxhY2UgdGhlIGFycmF5IHdob2xlc2FsZSkuIEluZGljZXMgYWRkcmVzcyB0aGUgYXJyYXkgYXMgaXQgZ3Jvd3MsIHNvIGFwcGx5aW5nIHRoZVxuICogaW5zZXJ0aW9ucyBsZWZ0IHRvIHJpZ2h0IHlpZWxkcyBgbmV3VmFsdWVgLlxuICovXG5mdW5jdGlvbiBmaW5kSW5zZXJ0aW9ucyhvbGRWYWx1ZTogdW5rbm93bltdLCBuZXdWYWx1ZTogdW5rbm93bltdKTogeyBpbmRleDogbnVtYmVyOyB2YWx1ZTogdW5rbm93biB9W10gfCB1bmRlZmluZWQge1xuICBjb25zdCBpbnNlcnRpb25zOiB7IGluZGV4OiBudW1iZXI7IHZhbHVlOiB1bmtub3duIH1bXSA9IFtdO1xuICBsZXQgb2xkSW5kZXggPSAwO1xuICBmb3IgKGNvbnN0IFtuZXdJbmRleCwgZWxlbWVudF0gb2YgbmV3VmFsdWUuZW50cmllcygpKSB7XG4gICAgaWYgKG9sZEluZGV4IDwgb2xkVmFsdWUubGVuZ3RoICYmIEpTT04uc3RyaW5naWZ5KG9sZFZhbHVlW29sZEluZGV4XSkgPT09IEpTT04uc3RyaW5naWZ5KGVsZW1lbnQpKSB7XG4gICAgICBvbGRJbmRleCsrO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGluc2VydGlvbnMucHVzaCh7IGluZGV4OiBuZXdJbmRleCwgdmFsdWU6IGVsZW1lbnQgfSk7XG4gIH1cbiAgcmV0dXJuIG9sZEluZGV4ID09PSBvbGRWYWx1ZS5sZW5ndGggPyBpbnNlcnRpb25zIDogdW5kZWZpbmVkO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbi8qKlxuICogUmVjb2duaXplcyB0aGUgbWFuYWdlZCBgd2IgZ2VuLWNvZGVgIHNlZ21lbnQsIGEgb25lLWxldmVsIHBhY2thZ2Utc2NyaXB0IHdyYXBwZXIgYXJvdW5kIGl0LCBhbmRcbiAqIGN1c3RvbSBzZWdtZW50cyB0aGF0IHdiZnkgbGVhdmVzIGFsb25lLlxuICovXG50eXBlIFNjcmlwdFNlZ21lbnRLaW5kID0gJ2N1c3RvbScgfCAnZ2VuQ29kZScgfCAnZ2VuQ29kZVdyYXBwZXInO1xuXG5jb25zdCBnZW5Db2RlU2VnbWVudFBhdHRlcm4gPSAvXmJ1blxccyt3YlxccytnZW4tY29kZSQvdTtcblxuLy8gQSBydW5uZXIgZGVsZWdhdGluZyB0byBvbmUgb2YgdGhpcyBwYWNrYWdlJ3Mgb3duIHNjcmlwdHMsIGUuZy4gYGJ1biBydW4gZ2VuLXR5cGVzYC5cbmNvbnN0IHNjcmlwdFJ1bm5lclBhdHRlcm4gPSAvXmJ1blxccytydW5cXHMrKFxcUyspJC91O1xuXG4vLyBBbnl0aGluZyB3YmZ5J3MgYCYmYCBzcGxpdCBjYW5ub3QgbW9kZWwgKHBpcGVzLCBzZXF1ZW5jaW5nLCByZWRpcmVjdGlvbnMsIHF1b3RpbmcsIHN1YnN0aXR1dGlvbnMsIGRpcmVjdG9yeVxuLy8gY2hhbmdlcykuIFNjcmlwdHMgY29udGFpbmluZyBpdCBhcmUgbGVmdCB1bnRvdWNoZWQgaW5zdGVhZCBvZiBiZWluZyByZXdyaXR0ZW4gZnJvbSBhIHdyb25nIHBhcnNlLlxuY29uc3QgdW5zdXBwb3J0ZWRTaGVsbFN5bnRheFBhdHRlcm4gPSAvW1xcbjt8PD5gJCdcIigpXXxcXGJjZFxccy91O1xuXG4vKipcbiAqIFNwbGl0cyBhIHNjcmlwdCBpbnRvIGAmJmAtc2VwYXJhdGVkIHNlZ21lbnRzLCBvciByZXR1cm5zIHVuZGVmaW5lZCB3aGVuIHRoZSBzY3JpcHQgdXNlcyBzaGVsbCBzeW50YXggd2JmeVxuICogZGVsaWJlcmF0ZWx5IGRvZXMgbm90IG1vZGVsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3BsaXRTY3JpcHRTZWdtZW50cyhzY3JpcHQ6IHN0cmluZyk6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHVuc3VwcG9ydGVkU2hlbGxTeW50YXhQYXR0ZXJuLnRlc3Qoc2NyaXB0KSkgcmV0dXJuO1xuICByZXR1cm4gc2NyaXB0XG4gICAgLnNwbGl0KCcmJicpXG4gICAgLm1hcCgoc2VnbWVudCkgPT4gc2VnbWVudC50cmltKCkpXG4gICAgLmZpbHRlcihCb29sZWFuKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsYXNzaWZ5U2NyaXB0U2VnbWVudChcbiAgc2VnbWVudDogc3RyaW5nLFxuICBzY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzLFxuICBmb2xsb3dzV3JhcHBlciA9IHRydWVcbik6IFNjcmlwdFNlZ21lbnRLaW5kIHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IHNlZ21lbnQudHJpbSgpLnJlcGxhY2VBbGwoL1xccysvZ3UsICcgJyk7XG4gIGlmIChnZW5Db2RlU2VnbWVudFBhdHRlcm4udGVzdChub3JtYWxpemVkKSkgcmV0dXJuICdnZW5Db2RlJztcbiAgLy8gQSBvbmUtbGV2ZWwgd3JhcHBlciBsb29rdXAgY292ZXJzIGBcInBvc3RpbnN0YWxsXCI6IFwiYnVuIHJ1biBnZW4tdHlwZXNcImAsIHRoZSBzaGFwZSB0aGVzZSByZXBvc2l0b3JpZXMgdXNlO1xuICAvLyBkZWVwZXIgY2hhaW5zIHN0YXkgY3VzdG9tIHNvIHdiZnkgY2Fubm90IGxvb3Agb24gYSBzZWxmLXJlZmVyZW50aWFsIHNjcmlwdC5cbiAgY29uc3Qgc2NyaXB0TmFtZSA9IGZvbGxvd3NXcmFwcGVyID8gc2NyaXB0UnVubmVyUGF0dGVybi5leGVjKG5vcm1hbGl6ZWQpPy5bMV0gOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHRhcmdldCA9IHNjcmlwdE5hbWUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHNjcmlwdHNbc2NyaXB0TmFtZV07XG4gIGlmICghdGFyZ2V0KSByZXR1cm4gJ2N1c3RvbSc7XG4gIGNvbnN0IHNlZ21lbnRzID0gc3BsaXRTY3JpcHRTZWdtZW50cyh0YXJnZXQpO1xuICAvLyBBIHdyYXBwZXIgYXJvdW5kIGEgQ1VTVE9NSVpFRCBnZW4tY29kZSAoYGJ1biB3YiBnZW4tY29kZSAmJiBidW4gcnVuIGJ1aWxkLWFzc2V0c2ApIHN0aWxsIHBlcmZvcm1zIHRoZSBtYW5hZ2VkXG4gIC8vIGdlbmVyYXRpb24sIHNvIGl0IGNvdW50cyBhcyBnZW4tY29kZTsgdHJlYXRpbmcgaXQgYXMgY3VzdG9tIHdvdWxkIGFwcGVuZCBhIHNlY29uZCBgd2IgZ2VuLWNvZGVgIGFuZCBydW4gZXZlcnlcbiAgLy8gZ2VuZXJhdG9yIHR3aWNlIHBlciBpbnN0YWxsLlxuICBpZiAoc2VnbWVudHM/Lmxlbmd0aCAhPT0gMSkge1xuICAgIC8vIEEgd3JhcHBlciBhcm91bmQgYSBDVVNUT01JWkVEIGdlbi1jb2RlIChgYnVuIHdiIGdlbi1jb2RlICYmIGJ1biBydW4gYnVpbGQtYXNzZXRzYCkgYWxyZWFkeSBwZXJmb3JtcyB0aGVcbiAgICAvLyBtYW5hZ2VkIGdlbmVyYXRpb24gQU5EIHRoZSBwcm9qZWN0J3Mgb3duIHN0ZXBzLCBzbyBpdCBpcyB0aGUgaW5zdGFsbC10aW1lIGVudHJ5IHBvaW50OiBpdCBtdXN0IGJlIGtlcHQgYXNcbiAgICAvLyB3cml0dGVuLiBSZXBsYWNpbmcgaXQgd2l0aCBhIGJhcmUgYHdiIGdlbi1jb2RlYCB3b3VsZCBkcm9wIHRob3NlIHN0ZXBzOyBhcHBlbmRpbmcgb25lIHdvdWxkIHJ1biBldmVyeVxuICAgIC8vIGdlbmVyYXRvciB0d2ljZS5cbiAgICByZXR1cm4gc2VnbWVudHM/LnNvbWUoKGlubmVyKSA9PiBnZW5Db2RlU2VnbWVudFBhdHRlcm4udGVzdChpbm5lci50cmltKCkucmVwbGFjZUFsbCgvXFxzKy9ndSwgJyAnKSkpXG4gICAgICA/ICdnZW5Db2RlV3JhcHBlcidcbiAgICAgIDogJ2N1c3RvbSc7XG4gIH1cbiAgcmV0dXJuIGNsYXNzaWZ5U2NyaXB0U2VnbWVudChzZWdtZW50c1swXSA/PyAnJywgc2NyaXB0cywgZmFsc2UpO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBTcGF3blN5bmNPcHRpb25zIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3blN5bmMoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcsIHJldHJ5ID0gMCk6IHZvaWQge1xuICBzcGF3blN5bmNBbmRSZXR1cm5TdGF0dXMoY29tbWFuZCwgYXJncywgY3dkLCByZXRyeSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3blN5bmNBbmRSZXR1cm5TdGF0dXMoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcsIHJldHJ5ID0gMCk6IG51bWJlciB7XG4gIGRvIHtcbiAgICBjb25zdCBbbmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zXSA9IGdldFNwYXduU3luY0FyZ3MoY29tbWFuZCwgYXJncywgY3dkKTtcbiAgICBjb25zb2xlLmxvZyhgJCAke25ld0NtZH0gJHtuZXdBcmdzLmpvaW4oJyAnKX0gYXQgJHtjd2R9YCk7XG4gICAgY29uc3QgcmV0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMobmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zKTtcbiAgICBjb25zdCBzdGF0dXMgPSByZXQuc3RhdHVzID8/IDE7XG4gICAgaWYgKHN0YXR1cyA9PT0gMCkgYnJlYWs7XG4gICAgaWYgKHJldHJ5IDw9IDApIHJldHVybiBzdGF0dXM7XG4gIH0gd2hpbGUgKC0tcmV0cnkgPj0gMCk7XG4gIHJldHVybiAwO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHNwYXduU3luY0FuZFJldHVyblN0ZG91dEludGVybmFsKGNvbW1hbmQsIGFyZ3MsIGN3ZClbMV07XG59XG5cbmZ1bmN0aW9uIHNwYXduU3luY0FuZFJldHVyblN0ZG91dEludGVybmFsKGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nKTogW251bWJlciwgc3RyaW5nXSB7XG4gIGNvbnN0IFtuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnNdID0gZ2V0U3Bhd25TeW5jQXJncyhjb21tYW5kLCBhcmdzLCBjd2QpO1xuICBvcHRpb25zLnN0ZGlvID0gJ3BpcGUnO1xuICBjb25zdCBwcm9jID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMobmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zKTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb24gLS0gc3Bhd25TeW5jIHJldHVybnMgbnVsbCBzdGRlcnIgb24gRU5PRU5ULlxuICBjb25zdCBzdGRlcnIgPSBwcm9jLnN0ZGVyciA/PyAnJztcbiAgY29uc3QgZXJyb3IgPSB0eXBlb2Ygc3RkZXJyID09PSAnc3RyaW5nJyA/IHN0ZGVyci50cmltKCkgOiBzdGRlcnIudG9TdHJpbmcoKS50cmltKCk7XG4gIGlmIChwcm9jLmVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihgJHtuZXdDbWR9IFske25ld0FyZ3MubWFwKChzKSA9PiBgXCIke3N9XCJgKS5qb2luKCcsICcpfV0gZmFpbGVkIHdpdGg6ICR7cHJvYy5lcnJvci5tZXNzYWdlfWApO1xuICB9IGVsc2UgaWYgKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihcbiAgICAgIGAke25ld0NtZH0gWyR7bmV3QXJncy5tYXAoKHMpID0+IGBcIiR7c31cImApLmpvaW4oJywgJyl9XSBvdXRwdXRzIHRoZSBmb2xsb3dpbmcgY29udGVudCB0byBzdGRlcnI6XFxuJHtlcnJvcn1gXG4gICAgKTtcbiAgfVxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvbiAtLSBzcGF3blN5bmMgcmV0dXJucyBudWxsIHN0ZG91dCBvbiBFTk9FTlQuXG4gIGNvbnN0IHN0ZG91dCA9IHByb2Muc3Rkb3V0ID8/ICcnO1xuICBjb25zdCBzdGRvdXRUZXh0ID0gdHlwZW9mIHN0ZG91dCA9PT0gJ3N0cmluZycgPyBzdGRvdXQgOiBzdGRvdXQudG9TdHJpbmcoKTtcbiAgcmV0dXJuIFtwcm9jLnN0YXR1cyA/PyAxLCBzdGRvdXRUZXh0LnRyaW0oKV07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTcGF3blN5bmNBcmdzKGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nKTogW3N0cmluZywgc3RyaW5nW10sIFNwYXduU3luY09wdGlvbnNdIHtcbiAgY29uc3QgZW52ID0geyAuLi5wcm9jZXNzLmVudiB9O1xuICBpZiAoZW52LlBBVEggJiYgZW52LkJFUlJZX0JJTl9GT0xERVIpIHtcbiAgICBlbnYuUEFUSCA9IGVudi5QQVRILnNwbGl0KCc6JylcbiAgICAgIC5maWx0ZXIoKHApID0+IHAgIT09IGVudi5CRVJSWV9CSU5fRk9MREVSKVxuICAgICAgLmpvaW4oJzonKTtcbiAgfVxuXG4gIHJldHVybiBbXG4gICAgY29tbWFuZCxcbiAgICBhcmdzLFxuICAgIHtcbiAgICAgIGN3ZCxcbiAgICAgIGVudixcbiAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgICBzaGVsbDogZmFsc2UsXG4gICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIH0sXG4gIF07XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgZnNwIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgZXNjYXBlUmVnRXhwIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWIvc3JjJztcbmltcG9ydCB7IGdsb2JJZ25vcmUgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5cbmltcG9ydCB7IGdldE9jdG9raXQsIGdpdEh1YlV0aWwgfSBmcm9tICcuL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuaW1wb3J0IHsganNvbmNVdGlsIH0gZnJvbSAnLi91dGlscy9qc29uY1V0aWwuanMnO1xuaW1wb3J0IHsgY2xhc3NpZnlTY3JpcHRTZWdtZW50LCBzcGxpdFNjcmlwdFNlZ21lbnRzIH0gZnJvbSAnLi91dGlscy9tYW5hZ2VkU2NyaXB0U2VnbWVudC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQgfSBmcm9tICcuL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5pbXBvcnQgeyBnZXRXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzLCBnZXRXb3Jrc3BhY2VTdWJEaXJQYXRocyB9IGZyb20gJy4vdXRpbHMvd29ya3NwYWNlVXRpbC5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFja2FnZUNvbmZpZyB7XG4gIGRpclBhdGg6IHN0cmluZztcbiAgZG9ja2VyZmlsZTogc3RyaW5nO1xuICBpc1Jvb3Q6IGJvb2xlYW47XG4gIGlzUHVibGljUmVwbzogYm9vbGVhbjtcbiAgLy8gV2hldGhlciBpc1B1YmxpY1JlcG8gY29tZXMgZnJvbSBhbiBhY3R1YWwgR2l0SHViIEFQSSByZXNwb25zZTogYSBmYWlsZWQgbG9va3VwIChvZmZsaW5lLFxuICAvLyByYXRlLWxpbWl0ZWQsIGJhZCBjcmVkZW50aWFsKSBjb2xsYXBzZXMgdG8gaXNQdWJsaWNSZXBvPWZhbHNlLCB3aGljaCB2aXNpYmlsaXR5LXNlbnNpdGl2ZVxuICAvLyBnZW5lcmF0b3JzIG11c3Qgbm90IG1pc3Rha2UgZm9yIGEgY29uZmlybWVkIHByaXZhdGUgcmVwb3NpdG9yeS5cbiAgaXNSZXBvVmlzaWJpbGl0eUtub3duOiBib29sZWFuO1xuICBpc1JlZmVycmVkQnlPdGhlclJlcG86IGJvb2xlYW47XG4gIHJlcG9zaXRvcnk/OiBzdHJpbmc7XG4gIHJlcG9BdXRob3I/OiBzdHJpbmc7XG4gIHJlcG9OYW1lPzogc3RyaW5nO1xuICBpc1dpbGxCb29zdGVyUmVwbzogYm9vbGVhbjtcbiAgaXNDbG91ZGZsYXJlOiBib29sZWFuO1xuICBkb2VzQ29udGFpbldyYW5nbGVyQ29uZmlnOiBib29sZWFuO1xuICBpc1JhaWx3YXk6IGJvb2xlYW47XG4gIGlzRXNtUGFja2FnZTogYm9vbGVhbjtcbiAgaXNXaWxsQm9vc3RlckNvbmZpZ3M6IGJvb2xlYW47XG4gIC8qKiBEaXJlY3RvcmllcyBjb250YWluaW5nIENhcmdvLnRvbWwgKHJlbGF0aXZlIHRvIGRpclBhdGgsIHJvb3QtbW9zdCBmaXJzdCkuIEVtcHR5IGlmIHRoZSByZXBvIGhhcyBubyBSdXN0IGNvZGUuICovXG4gIGNhcmdvVG9tbERpclBhdGhzOiBzdHJpbmdbXTtcbiAgZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluRG9ja2VyZmlsZTogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5HZW1maWxlOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkdvTW9kOiBib29sZWFuO1xuICBkb2VzQ29udGFpblBhY2thZ2VKc29uOiBib29sZWFuO1xuICBkb2VzQ29udGFpblBvZXRyeUxvY2s6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVXZMb2NrOiBib29sZWFuO1xuICAvKiogV2hldGhlciBhIFB5dGhvbiBsb2NrZmlsZSAocG9ldHJ5LmxvY2sgLyB1di5sb2NrKSBleGlzdHMgYW55d2hlcmUgaW4gdGhlIGRpcmVjdG9yeSB0cmVlLiAqL1xuICBkb2VzQ29udGFpblB5dGhvbkxvY2tBbnl3aGVyZTogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Qb21YbWw6IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIGEgTWF2ZW4gcG9tLnhtbCBleGlzdHMgYW55d2hlcmUgaW4gdGhlIGRpcmVjdG9yeSB0cmVlLiAqL1xuICBkb2VzQ29udGFpblBvbVhtbEFueXdoZXJlOiBib29sZWFuO1xuICBkb2VzQ29udGFpblB1YnNwZWNZYW1sOiBib29sZWFuO1xuICAvKiogV2hldGhlciBhIFNsaWRldiBkZWNrIChgKi5zbGlkZXYubWRgKSBleGlzdHMgYW55d2hlcmUgaW4gdGhlIGRpcmVjdG9yeSB0cmVlLiAqL1xuICBkb2VzQ29udGFpblNsaWRldk1kOiBib29sZWFuO1xuICBkb2VzQ29udGFpblRhdXJpQ29uZmlnOiBib29sZWFuO1xuICBkb2VzQ29udGFpblRhdXJpQ29uZmlnSW5QYWNrYWdlczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5UZW1wbGF0ZVlhbWw6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVnNjb2RlU2V0dGluZ3NKc29uOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkphdmFTY3JpcHQ6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVHlwZVNjcmlwdDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Kc3hPclRzeDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5KYXZhOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkphdmFTY3JpcHRJblBhY2thZ2VzOiBib29sZWFuO1xuICBkb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkpzeE9yVHN4SW5QYWNrYWdlczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5KYXZhSW5QYWNrYWdlczogYm9vbGVhbjtcblxuICBkZXBlbmRpbmc6IHtcbiAgICBibGl0ejogYm9vbGVhbjtcbiAgICBmaXJlYmFzZTogYm9vbGVhbjtcbiAgICBnZW5JMThuVHM6IGJvb2xlYW47XG4gICAgbGl0ZXN0cmVhbTogYm9vbGVhbjtcbiAgICBuZXh0OiBib29sZWFuO1xuICAgIHBsYXl3cmlnaHRUZXN0OiBib29sZWFuO1xuICAgIHBsYXl3cmlnaHRSdW50aW1lOiBib29sZWFuO1xuICAgIHByaXNtYTogYm9vbGVhbjtcbiAgICBweXJpZ2h0OiBib29sZWFuO1xuICAgIHJlYWN0OiBib29sZWFuO1xuICAgIHJlYWN0TmF0aXZlOiBib29sZWFuO1xuICAgIHNlbWFudGljUmVsZWFzZTogYm9vbGVhbjtcbiAgICBzbGlkZXY6IGJvb2xlYW47XG4gICAgc3Rvcnlib29rOiBib29sZWFuO1xuICAgIHRhdXJpOiBib29sZWFuO1xuICAgIHZpbmV4dDogYm9vbGVhbjtcbiAgICB2aXRlOiBib29sZWFuO1xuICAgIHdiOiBib29sZWFuO1xuICAgIGNoYWtyYTogYm9vbGVhbjtcbiAgICBkcml6emxlOiBib29sZWFuO1xuICB9O1xuICByZWxlYXNlOiB7XG4gICAgYnJhbmNoZXM6IHN0cmluZ1tdO1xuICAgIGdpdGh1YjogYm9vbGVhbjtcbiAgICBucG06IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQW4gZXhwbGljaXQgYEBzZW1hbnRpYy1yZWxlYXNlL25wbWAgcGx1Z2luIGVudHJ5IHB1Ymxpc2hlcyB0aGUgcm9vdCBtYW5pZmVzdCBpdHNlbGZcbiAgICAgKiAobm8gcGtnUm9vdCByZWRpcmVjdGlvbiBhbmQgbnBtUHVibGlzaCBub3QgZGlzYWJsZWQpLlxuICAgICAqL1xuICAgIG5wbVB1Ymxpc2hlc1Jvb3Q6IGJvb2xlYW47XG4gIH07XG4gIG1pc2VUYXNrczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgcGFja2FnZUpzb24/OiBQYWNrYWdlSnNvbjtcbiAgd2JmeUpzb24/OiBXYmZ5SnNvbjtcbn1cblxudHlwZSBXYmZ5SnNvbiA9IHouaW5mZXI8dHlwZW9mIHdiZnlKc29uU2NoZW1hPjtcblxuY29uc3Qgd2JmeUpzb25TY2hlbWEgPSB6Lm9iamVjdCh7XG4gIHR5cG9zOiB6XG4gICAgLm9iamVjdCh7XG4gICAgICBhbGw6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgICBkb2M6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgICB0czogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICAgIHRleHQ6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgfSlcbiAgICAub3B0aW9uYWwoKSxcbn0pO1xuXG4vKipcbiAqIFRoZSBzZW1hbnRpYy1yZWxlYXNlIGNvbmZpZyBmaWxlcyB3YmZ5IGV4cGVjdHMsIGluIGNvc21pY29uZmlnJ3MgcmVzb2x1dGlvbiBvcmRlciAodGhlIGxlYWRpbmdcbiAqIHBhY2thZ2UuanNvbiBlbnRyeSBpcyBjaGVja2VkIGJ5IHRoZSBjYWxsZXIpLiB3YmZ5IGdlbmVyYXRlcyAucmVsZWFzZXJjLmpzb247IHRoZSBvdGhlciBzcGVsbGluZ3NcbiAqIGFyZSBsaXN0ZWQgb25seSB0byBkZXRlY3QgYSBoYW5kLXdyaXR0ZW4gY29uZmlnLCB3aG9zZSBmb3JtYXQgSlNPTi5wYXJzZSBjYW5ub3QgcmVhZCBhbmQgd2hvc2VcbiAqIHBsdWdpbiBsaXN0IGlzIHRoZXJlZm9yZSBzdGF0aWNhbGx5IHVuaW5zcGVjdGFibGUuXG4gKi9cbmNvbnN0IHNlbWFudGljUmVsZWFzZUNvbmZpZ1NlYXJjaFBsYWNlczogeyBmaWxlTmFtZTogc3RyaW5nOyBqc29uUGFyc2VhYmxlOiBib29sZWFuIH1bXSA9IFtcbiAgeyBmaWxlTmFtZTogJy5yZWxlYXNlcmMnLCBqc29uUGFyc2VhYmxlOiB0cnVlIH0sXG4gIHsgZmlsZU5hbWU6ICcucmVsZWFzZXJjLmpzb24nLCBqc29uUGFyc2VhYmxlOiB0cnVlIH0sXG4gIHsgZmlsZU5hbWU6ICcucmVsZWFzZXJjLnlhbWwnLCBqc29uUGFyc2VhYmxlOiBmYWxzZSB9LFxuICB7IGZpbGVOYW1lOiAnLnJlbGVhc2VyYy55bWwnLCBqc29uUGFyc2VhYmxlOiBmYWxzZSB9LFxuICB7IGZpbGVOYW1lOiAnLnJlbGVhc2VyYy5qcycsIGpzb25QYXJzZWFibGU6IGZhbHNlIH0sXG4gIHsgZmlsZU5hbWU6ICdyZWxlYXNlLmNvbmZpZy5qcycsIGpzb25QYXJzZWFibGU6IGZhbHNlIH0sXG5dO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UGFja2FnZUNvbmZpZyhcbiAgZGlyUGF0aDogc3RyaW5nLFxuICBvcHRpb25zPzogeyBpc1Jvb3Q/OiBib29sZWFuIH1cbik6IFByb21pc2U8UGFja2FnZUNvbmZpZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICB0cnkge1xuICAgIGNvbnN0IGRvZXNDb250YWluUGFja2FnZUpzb24gPSBmcy5leGlzdHNTeW5jKHBhY2thZ2VKc29uUGF0aCk7XG4gICAgbGV0IGRlcGVuZGVuY2llczogUGFja2FnZUpzb25bJ2RlcGVuZGVuY2llcyddID0ge307XG4gICAgbGV0IGRldkRlcGVuZGVuY2llczogUGFja2FnZUpzb25bJ2RldkRlcGVuZGVuY2llcyddID0ge307XG4gICAgbGV0IHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiA9IHt9O1xuICAgIGxldCBlc21QYWNrYWdlID0gZmFsc2U7XG4gICAgaWYgKGRvZXNDb250YWluUGFja2FnZUpzb24pIHtcbiAgICAgIGNvbnN0IHBhY2thZ2VKc29uVGV4dCA9IGZzLnJlYWRGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgsICd1dGY4Jyk7XG4gICAgICBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UocGFja2FnZUpzb25UZXh0KSBhcyBQYWNrYWdlSnNvbjtcbiAgICAgIGRlcGVuZGVuY2llcyA9IHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICAgIGRldkRlcGVuZGVuY2llcyA9IHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICAgIGVzbVBhY2thZ2UgPSBwYWNrYWdlSnNvbi50eXBlID09PSAnbW9kdWxlJztcbiAgICB9XG5cbiAgICBsZXQgcmVsZWFzZUJyYW5jaGVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCByZWxlYXNlUGx1Z2luczogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgcmVsZWFzZVBsdWdpbnNBcmVFeHBsaWNpdCA9IGZhbHNlO1xuICAgIGxldCByZWxlYXNlTnBtUGx1Z2luUHVibGlzaGVzUm9vdCA9IGZhbHNlO1xuICAgIC8vIFRoZSBGSVJTVCBleGlzdGluZyBzZWFyY2ggcGxhY2Ugd2lucyAoY29zbWljb25maWcgc2hvcnQtY2lyY3VpdHMpLCBzbyBhIEpTL1lBTUwvVFMgY29uZmlnXG4gICAgLy8gb3IgYW4gYGV4dGVuZHNgIHByZXNldCBtYWtlcyB0aGUgZWZmZWN0aXZlIHBsdWdpbiBsaXN0IHN0YXRpY2FsbHkgdW5pbnNwZWN0YWJsZSAobWlycm9yc1xuICAgIC8vIHJlYWRFeHBsaWNpdFNlbWFudGljUmVsZWFzZVBsdWdpbnMgaW4gd2IncyByZWxlYXNlLnRzKS4gVHJlYXRpbmcgaXQgYXMgdW5rbm93biBrZWVwc1xuICAgIC8vIGByZWxlYXNlLm5wbWAgY29uc2VydmF0aXZlbHkgdHJ1ZSwgc28gYXBwbHlQYWNrYWdlSnNvbkNvbnZlbnRpb25zIG5ldmVyIGZvcmNlc1xuICAgIC8vIGBwcml2YXRlOiB0cnVlYCBvbiBhIG1vbm9yZXBvIHRoYXQgYWN0dWFsbHkgcHVibGlzaGVzIHRvIG5wbS5cbiAgICBsZXQgcmVsZWFzZVBsdWdpbnNBcmVVbmtub3duID0gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgIHR5cGUgUmVsZWFzZUNvbmZpZyA9XG4gICAgICAgIHwge1xuICAgICAgICAgICAgYnJhbmNoZXM/OiB1bmtub3duO1xuICAgICAgICAgICAgcGx1Z2lucz86IChzdHJpbmcgfCBbc3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPl0pW107XG4gICAgICAgICAgICBleHRlbmRzPzogdW5rbm93bjtcbiAgICAgICAgICB9XG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgLy8gY29zbWljb25maWcgc2VhcmNoZXMgcGFja2FnZS5qc29uJ3MgYHJlbGVhc2VgIGtleSBCRUZPUkUgYW55IHJjL2NvbmZpZyBmaWxlXG4gICAgICAvLyAoc2VtYW50aWMtcmVsZWFzZSAyNSBkZWxlZ2F0ZXMgdG8gY29zbWljb25maWcgOSdzIGRlZmF1bHQgc2VhcmNoUGxhY2VzKS5cbiAgICAgIGxldCByZWxlYXNlQ29uZmlnID0gKHBhY2thZ2VKc29uIGFzIHsgcmVsZWFzZT86IFJlbGVhc2VDb25maWcgfSkucmVsZWFzZTtcbiAgICAgIGlmIChyZWxlYXNlQ29uZmlnID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZm9yIChjb25zdCB7IGZpbGVOYW1lLCBqc29uUGFyc2VhYmxlIH0gb2Ygc2VtYW50aWNSZWxlYXNlQ29uZmlnU2VhcmNoUGxhY2VzKSB7XG4gICAgICAgICAgY29uc3QgcmVsZWFzZXJjUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCBmaWxlTmFtZSk7XG4gICAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHJlbGVhc2VyY1BhdGgpKSBjb250aW51ZTtcbiAgICAgICAgICBpZiAoIWpzb25QYXJzZWFibGUpIHtcbiAgICAgICAgICAgIHJlbGVhc2VQbHVnaW5zQXJlVW5rbm93biA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gYC5yZWxlYXNlcmNgIGFuZCBgLmNvbmZpZy9yZWxlYXNlcmNgIG1heSBhbHNvIGhvbGQgWUFNTDsgYSBKU09OLnBhcnNlIGZhaWx1cmUgbGFuZHNcbiAgICAgICAgICAvLyBpbiB0aGUgY2F0Y2ggYmVsb3cgYW5kIG1hcmtzIHRoZSBwbHVnaW4gbGlzdCB1bmtub3duIGluc3RlYWQgb2Ygc2lsZW50bHkgcmVwb3J0aW5nXG4gICAgICAgICAgLy8gXCJubyBwbHVnaW5zXCIuXG4gICAgICAgICAgcmVsZWFzZUNvbmZpZyA9IEpTT04ucGFyc2UoYXdhaXQgZnNwLnJlYWRGaWxlKHJlbGVhc2VyY1BhdGgsICd1dGY4JykpIGFzIFJlbGVhc2VDb25maWc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIHNlbWFudGljLXJlbGVhc2UgYWNjZXB0cyBhIHNjYWxhciBicmFuY2ggb3IgYnJhbmNoIG9iamVjdHMgKHsgbmFtZSwgcHJlcmVsZWFzZSwgLi4uIH0pO1xuICAgICAgLy8gbm9ybWFsaXplIHRvIHBsYWluIGJyYW5jaCBuYW1lcyBmb3IgY29uc3VtZXJzIHN1Y2ggYXMgdGhlIHdvcmtmbG93IGdlbmVyYXRvci5cbiAgICAgIGNvbnN0IHJhd0JyYW5jaGVzID0gcmVsZWFzZUNvbmZpZz8uYnJhbmNoZXM7XG4gICAgICByZWxlYXNlQnJhbmNoZXMgPSAoQXJyYXkuaXNBcnJheShyYXdCcmFuY2hlcykgPyByYXdCcmFuY2hlcyA6IHJhd0JyYW5jaGVzID09PSB1bmRlZmluZWQgPyBbXSA6IFtyYXdCcmFuY2hlc10pXG4gICAgICAgIC5tYXAoKGJyYW5jaDogdW5rbm93bikgPT5cbiAgICAgICAgICB0eXBlb2YgYnJhbmNoID09PSAnc3RyaW5nJyA/IGJyYW5jaCA6IChicmFuY2ggYXMgeyBuYW1lPzogdW5rbm93biB9IHwgdW5kZWZpbmVkKT8ubmFtZVxuICAgICAgICApXG4gICAgICAgIC5maWx0ZXIoKGJyYW5jaE5hbWUpOiBicmFuY2hOYW1lIGlzIHN0cmluZyA9PiB0eXBlb2YgYnJhbmNoTmFtZSA9PT0gJ3N0cmluZycpO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVsZWFzZUNvbmZpZz8ucGx1Z2lucykpIHtcbiAgICAgICAgcmVsZWFzZVBsdWdpbnNBcmVFeHBsaWNpdCA9IHRydWU7XG4gICAgICAgIGZvciAoY29uc3QgcGx1Z2luRW50cnkgb2YgcmVsZWFzZUNvbmZpZy5wbHVnaW5zKSB7XG4gICAgICAgICAgY29uc3QgW3BsdWdpbk5hbWUsIHBsdWdpbk9wdGlvbnNdID0gQXJyYXkuaXNBcnJheShwbHVnaW5FbnRyeSkgPyBwbHVnaW5FbnRyeSA6IFtwbHVnaW5FbnRyeSwgdW5kZWZpbmVkXTtcbiAgICAgICAgICBpZiAodHlwZW9mIHBsdWdpbk5hbWUgIT09ICdzdHJpbmcnKSBjb250aW51ZTtcbiAgICAgICAgICByZWxlYXNlUGx1Z2lucy5wdXNoKHBsdWdpbk5hbWUpO1xuICAgICAgICAgIGlmIChwbHVnaW5OYW1lICE9PSAnQHNlbWFudGljLXJlbGVhc2UvbnBtJykgY29udGludWU7XG4gICAgICAgICAgLy8gV2l0aCBwa2dSb290IHRoZSBwbHVnaW4gcHVibGlzaGVzIGFub3RoZXIgbWFuaWZlc3QgKGl0IHJlc29sdmVzIHBrZ1Jvb3QgYWdhaW5zdCB0aGVcbiAgICAgICAgICAvLyByZXBvIHJvb3QsIHNvIGAuYCBhbmQgYC4vYCBib3RoIG1lYW4gdGhlIHJvb3QgaXRzZWxmKSwgYW5kIG5wbVB1Ymxpc2g6IGZhbHNlXG4gICAgICAgICAgLy8gZGlzYWJsZXMgcHVibGlzaGluZyBlbnRpcmVseTsgb25seSB0aGUgcmVtYWluaW5nIHNoYXBlIHByb3ZlcyB0aGUgUk9PVCBpcyBwdWJsaXNoZWQuXG4gICAgICAgICAgY29uc3QgcGtnUm9vdCA9IHBsdWdpbk9wdGlvbnM/LnBrZ1Jvb3Q7XG4gICAgICAgICAgY29uc3QgcHVibGlzaGVzUm9vdCA9XG4gICAgICAgICAgICBwbHVnaW5PcHRpb25zPy5ucG1QdWJsaXNoICE9PSBmYWxzZSAmJlxuICAgICAgICAgICAgKHBrZ1Jvb3QgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgICAodHlwZW9mIHBrZ1Jvb3QgPT09ICdzdHJpbmcnICYmIHBhdGgucmVzb2x2ZShkaXJQYXRoLCBwa2dSb290KSA9PT0gcGF0aC5yZXNvbHZlKGRpclBhdGgpKSk7XG4gICAgICAgICAgcmVsZWFzZU5wbVBsdWdpblB1Ymxpc2hlc1Jvb3QgfHw9IHB1Ymxpc2hlc1Jvb3Q7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAocmVsZWFzZUNvbmZpZyAmJiByZWxlYXNlQ29uZmlnLmV4dGVuZHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZWxlYXNlUGx1Z2luc0FyZVVua25vd24gPSB0cnVlO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgcmVsZWFzZVBsdWdpbnNBcmVVbmtub3duID0gdHJ1ZTtcbiAgICB9XG4gICAgLy8gV2l0aG91dCBhbiBleHBsaWNpdCBwbHVnaW4gbGlzdCwgc2VtYW50aWMtcmVsZWFzZSdzIGRlZmF1bHQgbGlzdCBhcHBsaWVzLCB3aGljaCBpbmNsdWRlc1xuICAgIC8vIEBzZW1hbnRpYy1yZWxlYXNlL25wbSBhbmQgQHNlbWFudGljLXJlbGVhc2UvZ2l0aHViIChtaXJyb3JzIHJlbGVhc2VQdWJsaXNoZXNUb05wbSBpbiB3YidzXG4gICAgLy8gcmVsZWFzZS50cykuXG4gICAgY29uc3QgdXNlc1NlbWFudGljUmVsZWFzZSA9ICEhKFxuICAgICAgZGV2RGVwZW5kZW5jaWVzWydzZW1hbnRpYy1yZWxlYXNlJ10gfHxcbiAgICAgIHJlbGVhc2VCcmFuY2hlcy5sZW5ndGggPiAwIHx8XG4gICAgICByZWxlYXNlUGx1Z2lucy5sZW5ndGggPiAwIHx8XG4gICAgICByZWxlYXNlUGx1Z2luc0FyZVVua25vd25cbiAgICApO1xuXG4gICAgLy8gVGhlIGNhbGxlciBtYXkgY2xhc3NpZnkgZXhwbGljaXRseSAoaW5kZXgudHMgcGFzc2VzIGZhbHNlIGZvciBldmVyeSBkaXNjb3ZlcmVkIHdvcmtzcGFjZSxcbiAgICAvLyBpbmNsdWRpbmcgbm9uLXBhY2thZ2VzLyogbGF5b3V0cyBzdWNoIGFzIGFwcHMvKik7IHRoZSBoZXVyaXN0aWMgY2xhc3NpZmllcyB0aGUgQ0xJIGVudHJ5XG4gICAgLy8gcGF0aCBpdHNlbGYsIHNvIGB3YmZ5IDxyZXBvPi9wYWNrYWdlcy88YXBwPmAgYW5kIGB3YmZ5IDxyZXBvPi9hcHBzLzxhcHA+YCBrZWVwIHRoZWlyIGNoaWxkXG4gICAgLy8gY2xhc3NpZmljYXRpb24uXG4gICAgY29uc3QgaXNSb290ID0gb3B0aW9ucz8uaXNSb290ID8/ICFpc1dvcmtzcGFjZU9mRW5jbG9zaW5nUm9vdChkaXJQYXRoKTtcblxuICAgIGxldCByZXBvSW5mbzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgLy8gRmV0Y2ggdmlzaWJpbGl0eSBmb3IgdGhlIENMSSBlbnRyeSBldmVuIHdoZW4gaXQgaXMgYSB3b3Jrc3BhY2UgY2hpbGQgKGB3YmZ5XG4gICAgLy8gPHJlcG8+L3BhY2thZ2VzLzxhcHA+YCk6IGdlbmVyYXRvcnMgcmVhZCBpc1B1YmxpY1JlcG8gZnJvbSB0aGVpciByb290Q29uZmlnIHBhcmFtZXRlcixcbiAgICAvLyB3aGljaCBJUyB0aGUgY2hpbGQgY29uZmlnIGluIHRoYXQgaW52b2NhdGlvbiwgc28gYSBzdHViIGBmYWxzZWAgdGhlcmUgd291bGQgZHJvcCB0aGVcbiAgICAvLyBwdWJsaWMtcmVwbyBwdWJsaXNoQ29uZmlnIGhhbmRsaW5nLiBEaXNjb3ZlcmVkIGNoaWxkcmVuIChvcHRpb25zLmlzUm9vdCA9PT0gZmFsc2UpIHN0aWxsXG4gICAgLy8gc2tpcCB0aGUgZmV0Y2gg4oCUIHRoZXkgaW5oZXJpdCB0aGUgZW5jbG9zaW5nIHJvb3QncyB2aXNpYmlsaXR5IHZpYSByb290Q29uZmlnIGluc3RlYWQuXG4gICAgaWYgKG9wdGlvbnM/LmlzUm9vdCAhPT0gZmFsc2UpIHtcbiAgICAgIHJlcG9JbmZvID0gYXdhaXQgZmV0Y2hSZXBvSW5mbyhkaXJQYXRoLCBwYWNrYWdlSnNvbik7XG4gICAgfVxuXG4gICAgbGV0IGRvY2tlcmZpbGUgPSAnJztcbiAgICB0cnkge1xuICAgICAgZG9ja2VyZmlsZSA9IGF3YWl0IGZzcC5yZWFkRmlsZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ0RvY2tlcmZpbGUnKSwgJ3V0ZjgnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICBjb25zdCB3YmZ5SnNvblBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3diZnkuanNvbicpO1xuICAgIGxldCB3YmZ5SnNvbjogV2JmeUpzb24gfCB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHdiZnlKc29uVGV4dCA9IGF3YWl0IGZzcC5yZWFkRmlsZSh3YmZ5SnNvblBhdGgsICd1dGY4Jyk7XG4gICAgICB3YmZ5SnNvbiA9IHdiZnlKc29uU2NoZW1hLnBhcnNlKEpTT04ucGFyc2Uod2JmeUpzb25UZXh0KSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgY29uc3QgcmVwb0Z1bGxOYW1lID0gdHlwZW9mIHJlcG9JbmZvPy5mdWxsX25hbWUgPT09ICdzdHJpbmcnID8gcmVwb0luZm8uZnVsbF9uYW1lIDogdW5kZWZpbmVkO1xuICAgIGxldCByZXBvQXV0aG9yOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHJlcG9OYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHJlcG9GdWxsTmFtZSkge1xuICAgICAgY29uc3QgcmVwb1BhcnRzID0gcmVwb0Z1bGxOYW1lLnNwbGl0KCcvJyk7XG4gICAgICBpZiAocmVwb1BhcnRzLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgIHJlcG9BdXRob3IgPSByZXBvUGFydHNbMF07XG4gICAgICAgIHJlcG9OYW1lID0gcmVwb1BhcnRzWzFdO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBPbmx5IHRoZSByb290IGZldGNoZXMgcmVwbyBpbmZvLCBhbmQgdGhhdCBmZXRjaCBuZWVkcyBuZXR3b3JrIGFuZCBhIHRva2VuLCBzbyBpZGVudGl0eS1kZXJpdmVkXG4gICAgLy8gZmxhZ3MgYmVsb3cgd291bGQgb3RoZXJ3aXNlIGJlIGZhbHNlIGZvciBldmVyeSB3b3Jrc3BhY2UgcGFja2FnZSBhbmQgZm9yIGV2ZXJ5IG9mZmxpbmUgb3JcbiAgICAvLyByYXRlLWxpbWl0ZWQgcnVuLiBUaGUgZ2l0IHJlbW90ZSBhbnN3ZXJzIHRoZSBzYW1lIHF1ZXN0aW9uIGxvY2FsbHksIGZvciBldmVyeSBwYWNrYWdlLlxuICAgIGlmICghcmVwb0F1dGhvciB8fCAhcmVwb05hbWUpIHtcbiAgICAgIFtyZXBvQXV0aG9yLCByZXBvTmFtZV0gPSBhd2FpdCByZXNvbHZlTG9jYWxSZXBvSWRlbnRpdHkoZGlyUGF0aCwgcGFja2FnZUpzb24pO1xuICAgIH1cbiAgICAvLyBCdWlsdCBmcm9tIHRoZSBSRVNPTFZFRCBpZGVudGl0eSBzbyB3b3Jrc3BhY2UgcGFja2FnZXMgYW5kIG9mZmxpbmUgcnVucyBhbHNvIGdldCBpdDsgY29uc3VtZXJzIGRlcml2ZVxuICAgIC8vIHRoZSBvd25lciBmcm9tIHRoaXMgZmllbGQgKGUuZy4gdG8gc2V0IGBhdXRob3JgKS5cbiAgICBjb25zdCByZXBvc2l0b3J5ID0gcmVwb0F1dGhvciAmJiByZXBvTmFtZSA/IGBnaXRodWI6JHtyZXBvQXV0aG9yfS8ke3JlcG9OYW1lfWAgOiB1bmRlZmluZWQ7XG4gICAgLy8gVGF1cmkgb2ZmaWNpYWxseSBzdXBwb3J0cyBKU09OLCBKU09ONSwgYW5kIFRPTUwgY29uZmlndXJhdGlvbiBmb3JtYXRzLlxuICAgIGNvbnN0IGRvZXNDb250YWluVGF1cmlDb25maWcgPSBbJ3RhdXJpLmNvbmYuanNvbicsICd0YXVyaS5jb25mLmpzb241JywgJ1RhdXJpLnRvbWwnXS5zb21lKChmaWxlTmFtZSkgPT5cbiAgICAgIGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdzcmMtdGF1cmknLCBmaWxlTmFtZSkpXG4gICAgKTtcbiAgICAvLyBSb290LWxldmVsIFwiSW5QYWNrYWdlc1wiIHNpZ25hbHMgbXVzdCBzZWUgZXZlcnkgZGVjbGFyZWQgd29ya3NwYWNlIGxheW91dCAoZS5nLiBhcHBzLyopLCBub3RcbiAgICAvLyBqdXN0IHRoZSBjb252ZW50aW9uYWwgcGFja2FnZXMvKiBkaXJlY3RvcnksIHNvIHNjYW4gZWFjaCBkaXNjb3ZlcmVkIHdvcmtzcGFjZSBkaXJlY3RvcnkuXG4gICAgY29uc3Qgd29ya3NwYWNlU3ViRGlyUGF0aHMgPSBnZXRXb3Jrc3BhY2VTdWJEaXJQYXRocyh7XG4gICAgICBkaXJQYXRoLFxuICAgICAgcGFja2FnZUpzb24sXG4gICAgICBkb2VzQ29udGFpblN1YlBhY2thZ2VKc29uczogY29udGFpbnNBbnkoJ3BhY2thZ2VzLyovcGFja2FnZS5qc29uJywgZGlyUGF0aCksXG4gICAgfSk7XG4gICAgY29uc3QgY29udGFpbnNBbnlJbldvcmtzcGFjZXMgPSAocGF0dGVybjogc3RyaW5nKTogYm9vbGVhbiA9PlxuICAgICAgd29ya3NwYWNlU3ViRGlyUGF0aHMuc29tZSgod29ya3NwYWNlU3ViRGlyUGF0aCkgPT4gY29udGFpbnNBbnkocGF0dGVybiwgd29ya3NwYWNlU3ViRGlyUGF0aCkpO1xuICAgIGNvbnN0IGRvZXNDb250YWluV3JhbmdsZXJDb25maWcgPSBkZXRlY3RXcmFuZ2xlckNvbmZpZyhkaXJQYXRoKTtcbiAgICBjb25zdCB3b3JrZmxvd0NvbnRlbnRzID0gcmVhZFdvcmtmbG93RmlsZUNvbnRlbnRzKGRpclBhdGgpO1xuICAgIGNvbnN0IGltcG9ydHNQbGF5d3JpZ2h0QXRSdW50aW1lID0gZGV0ZWN0UGxheXdyaWdodFJ1bnRpbWVJbXBvcnQoZGlyUGF0aCk7XG4gICAgY29uc3QgY29uZmlnOiBQYWNrYWdlQ29uZmlnID0ge1xuICAgICAgZGlyUGF0aCxcbiAgICAgIGRvY2tlcmZpbGUsXG4gICAgICBpc1Jvb3QsXG4gICAgICBpc1B1YmxpY1JlcG86IHJlcG9JbmZvPy5wcml2YXRlID09PSBmYWxzZSxcbiAgICAgIGlzUmVwb1Zpc2liaWxpdHlLbm93bjogdHlwZW9mIHJlcG9JbmZvPy5wcml2YXRlID09PSAnYm9vbGVhbicsXG4gICAgICBpc1JlZmVycmVkQnlPdGhlclJlcG86ICEhcGFja2FnZUpzb24uZmlsZXMsXG4gICAgICByZXBvc2l0b3J5LFxuICAgICAgcmVwb0F1dGhvcixcbiAgICAgIHJlcG9OYW1lLFxuICAgICAgaXNXaWxsQm9vc3RlclJlcG86IEJvb2xlYW4oXG4gICAgICAgIHJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3Rlci8nKSB8fCByZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJylcbiAgICAgICksXG4gICAgICBpc0Nsb3VkZmxhcmU6IGRldGVjdENsb3VkZmxhcmUocGFja2FnZUpzb24sIGRvZXNDb250YWluV3JhbmdsZXJDb25maWcsIHdvcmtmbG93Q29udGVudHMpLFxuICAgICAgZG9lc0NvbnRhaW5XcmFuZ2xlckNvbmZpZyxcbiAgICAgIGlzUmFpbHdheTogZGV0ZWN0UmFpbHdheShkaXJQYXRoLCBwYWNrYWdlSnNvbiwgd29ya2Zsb3dDb250ZW50cyksXG4gICAgICBpc0VzbVBhY2thZ2U6IGVzbVBhY2thZ2UsXG4gICAgICBpc1dpbGxCb29zdGVyQ29uZmlnczogZGV0ZWN0SXNXaWxsQm9vc3RlckNvbmZpZ3MoZGlyUGF0aCwgcGFja2FnZUpzb25QYXRoLCByZXBvTmFtZSksXG4gICAgICBjYXJnb1RvbWxEaXJQYXRoczogZmluZENhcmdvVG9tbERpclBhdGhzKGRpclBhdGgpLFxuICAgICAgLy8gQWxzbyBob25vciBkZWNsYXJlZCB3b3Jrc3BhY2UgcGF0dGVybnMgYmV5b25kIHBhY2thZ2VzLyogKGUuZy4gYXBwcy8qKTogdHJlYXRpbmcgYW5cbiAgICAgIC8vIGFwcHMvKi1vbmx5IG1vbm9yZXBvIGFzIGEgcGxhaW4gcGFja2FnZSB3b3VsZCBkZWxldGUgaXRzIGB3b3Jrc3BhY2VzYCBkZWNsYXJhdGlvbiBpblxuICAgICAgLy8gZ2VuZXJhdGVQYWNrYWdlSnNvbiBhbmQgc2tpcCBtb25vcmVwby1vbmx5IGNvbnZlbnRpb25zIHN1Y2ggYXMgcm9vdCBgcHJpdmF0ZTogdHJ1ZWAuXG4gICAgICBkb2VzQ29udGFpblN1YlBhY2thZ2VKc29uczogY29udGFpbnNBbnkoJ3BhY2thZ2VzLyoqL3BhY2thZ2UuanNvbicsIGRpclBhdGgpIHx8IHdvcmtzcGFjZVN1YkRpclBhdGhzLmxlbmd0aCA+IDAsXG4gICAgICBkb2VzQ29udGFpbkRvY2tlcmZpbGU6ICEhZG9ja2VyZmlsZSB8fCBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnZG9ja2VyLWNvbXBvc2UueW1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5HZW1maWxlOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnR2VtZmlsZScpKSxcbiAgICAgIGRvZXNDb250YWluR29Nb2Q6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdnby5tb2QnKSksXG4gICAgICBkb2VzQ29udGFpblBhY2thZ2VKc29uLFxuICAgICAgZG9lc0NvbnRhaW5Qb2V0cnlMb2NrOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncG9ldHJ5LmxvY2snKSksXG4gICAgICBkb2VzQ29udGFpblV2TG9jazogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3V2LmxvY2snKSksXG4gICAgICAvLyBSZWN1cnNpdmUgbGlrZSBkb2VzQ29udGFpbkphdmE6IG11bHRpLWxhbmd1YWdlIHJlcG9zaXRvcmllcyBrZWVwIGxhbmd1YWdlIGRpcmVjdG9yaWVzXG4gICAgICAvLyAoZS5nLiBQeXRob24gdG9vbGluZyBvciBNYXZlbiBtb2R1bGVzKSBvdXRzaWRlIHRoZSByb290IGFuZCBvdXRzaWRlIGRlY2xhcmVkIHdvcmtzcGFjZXMuXG4gICAgICBkb2VzQ29udGFpblB5dGhvbkxvY2tBbnl3aGVyZTogY29udGFpbnNBbnkoJyoqL3twb2V0cnkubG9jayx1di5sb2NrfScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5Qb21YbWw6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwb20ueG1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5Qb21YbWxBbnl3aGVyZTogY29udGFpbnNBbnkoJyoqL3BvbS54bWwnLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluUHVic3BlY1lhbWw6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwdWJzcGVjLnlhbWwnKSksXG4gICAgICBkb2VzQ29udGFpblNsaWRldk1kOiBjb250YWluc0FueSgnKiovKi5zbGlkZXYubWQnLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluVGF1cmlDb25maWcsXG4gICAgICBkb2VzQ29udGFpblRhdXJpQ29uZmlnSW5QYWNrYWdlczogY29udGFpbnNBbnlJbldvcmtzcGFjZXMoXG4gICAgICAgICdzcmMtdGF1cmkve3RhdXJpLmNvbmYuanNvbix0YXVyaS5jb25mLmpzb241LFRhdXJpLnRvbWx9J1xuICAgICAgKSxcbiAgICAgIGRvZXNDb250YWluVGVtcGxhdGVZYW1sOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAndGVtcGxhdGUueWFtbCcpKSxcbiAgICAgIGRvZXNDb250YWluVnNjb2RlU2V0dGluZ3NKc29uOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLnZzY29kZScsICdzZXR0aW5ncy5qc29uJykpLFxuICAgICAgZG9lc0NvbnRhaW5KYXZhU2NyaXB0OiBjb250YWluc0FueSgne2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjanMsbWpzLGpzLGpzeH0nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluVHlwZVNjcmlwdDogY29udGFpbnNBbnkoJ3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y3RzLG10cyx0cyx0c3h9JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbkpzeE9yVHN4OiBjb250YWluc0FueSgne2FwcCxzcmMsdGVzdH0vKiovKi57dCxqfXN4JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbkphdmE6IGNvbnRhaW5zQW55KCcqKi8qLmphdmEnLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluSmF2YVNjcmlwdEluUGFja2FnZXM6IGNvbnRhaW5zQW55SW5Xb3Jrc3BhY2VzKCd7YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4fScpLFxuICAgICAgZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlczogY29udGFpbnNBbnlJbldvcmtzcGFjZXMoJ3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y3RzLG10cyx0cyx0c3h9JyksXG4gICAgICBkb2VzQ29udGFpbkpzeE9yVHN4SW5QYWNrYWdlczogY29udGFpbnNBbnlJbldvcmtzcGFjZXMoJ3thcHAsc3JjLHRlc3R9LyoqLyoue3Qsan1zeCcpLFxuICAgICAgZG9lc0NvbnRhaW5KYXZhSW5QYWNrYWdlczogY29udGFpbnNBbnlJbldvcmtzcGFjZXMoJyoqLyouamF2YScpLFxuICAgICAgZGVwZW5kaW5nOiB7XG4gICAgICAgIGJsaXR6OiAhIWRlcGVuZGVuY2llcy5ibGl0eixcbiAgICAgICAgY2hha3JhOiAhIWRldkRlcGVuZGVuY2llc1snQGNoYWtyYS11aS9jbGknXSxcbiAgICAgICAgZHJpenpsZTogISFkZXBlbmRlbmNpZXNbJ2RyaXp6bGUtb3JtJ10gfHwgISFkZXZEZXBlbmRlbmNpZXNbJ2RyaXp6bGUta2l0J10sXG4gICAgICAgIGZpcmViYXNlOiAhIWRldkRlcGVuZGVuY2llc1snZmlyZWJhc2UtdG9vbHMnXSxcbiAgICAgICAgZ2VuSTE4blRzOiAhIWRlcGVuZGVuY2llc1snZ2VuLWkxOG4tdHMnXSB8fCAhIWRldkRlcGVuZGVuY2llc1snZ2VuLWkxOG4tdHMnXSxcbiAgICAgICAgbGl0ZXN0cmVhbTogZG9ja2VyZmlsZS5pbmNsdWRlcygnaW5zdGFsbC1saXRlc3RyZWFtLnNoJyksXG4gICAgICAgIHJlYWN0OiAhIWRlcGVuZGVuY2llcy5yZWFjdCxcbiAgICAgICAgbmV4dDogISFkZXBlbmRlbmNpZXMubmV4dCxcbiAgICAgICAgcGxheXdyaWdodFRlc3Q6XG4gICAgICAgICAgISFkZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXSB8fCAhIWRldkRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddIHx8ICEhZGV2RGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQsXG4gICAgICAgIHBsYXl3cmlnaHRSdW50aW1lOiBpbXBvcnRzUGxheXdyaWdodEF0UnVudGltZSxcbiAgICAgICAgcHJpc21hOiAhIWRlcGVuZGVuY2llc1snQHByaXNtYS9jbGllbnQnXSB8fCAhIWRldkRlcGVuZGVuY2llcy5wcmlzbWEsXG4gICAgICAgIHB5cmlnaHQ6ICEhZGV2RGVwZW5kZW5jaWVzLnB5cmlnaHQsXG4gICAgICAgIHJlYWN0TmF0aXZlOiAhIWRlcGVuZGVuY2llc1sncmVhY3QtbmF0aXZlJ10sXG4gICAgICAgIHNlbWFudGljUmVsZWFzZTogdXNlc1NlbWFudGljUmVsZWFzZSxcbiAgICAgICAgc2xpZGV2OiAhIWRlcGVuZGVuY2llc1snQHNsaWRldi9jbGknXSB8fCAhIWRldkRlcGVuZGVuY2llc1snQHNsaWRldi9jbGknXSxcbiAgICAgICAgc3Rvcnlib29rOiAhIWRldkRlcGVuZGVuY2llc1snQHN0b3J5Ym9vay9yZWFjdCddLFxuICAgICAgICB0YXVyaTpcbiAgICAgICAgICAhIWRlcGVuZGVuY2llc1snQHRhdXJpLWFwcHMvYXBpJ10gfHxcbiAgICAgICAgICAhIWRldkRlcGVuZGVuY2llc1snQHRhdXJpLWFwcHMvYXBpJ10gfHxcbiAgICAgICAgICAhIWRlcGVuZGVuY2llc1snQHRhdXJpLWFwcHMvY2xpJ10gfHxcbiAgICAgICAgICAhIWRldkRlcGVuZGVuY2llc1snQHRhdXJpLWFwcHMvY2xpJ10gfHxcbiAgICAgICAgICBkb2VzQ29udGFpblRhdXJpQ29uZmlnLFxuICAgICAgICB2aW5leHQ6ICEhZGVwZW5kZW5jaWVzLnZpbmV4dCB8fCAhIWRldkRlcGVuZGVuY2llcy52aW5leHQsXG4gICAgICAgIHZpdGU6ICEhZGVwZW5kZW5jaWVzLnZpdGUgfHwgISFkZXZEZXBlbmRlbmNpZXMudml0ZSxcbiAgICAgICAgd2I6ICEhZGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvd2InXSB8fCAhIWRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3diJ10sXG4gICAgICB9LFxuICAgICAgcmVsZWFzZToge1xuICAgICAgICBicmFuY2hlczogcmVsZWFzZUJyYW5jaGVzLFxuICAgICAgICBnaXRodWI6IHJlbGVhc2VQbHVnaW5zQXJlRXhwbGljaXRcbiAgICAgICAgICA/IHJlbGVhc2VQbHVnaW5zLmluY2x1ZGVzKCdAc2VtYW50aWMtcmVsZWFzZS9naXRodWInKSB8fCByZWxlYXNlUGx1Z2luc0FyZVVua25vd25cbiAgICAgICAgICA6IHVzZXNTZW1hbnRpY1JlbGVhc2UsXG4gICAgICAgIG5wbTogcmVsZWFzZVBsdWdpbnNBcmVFeHBsaWNpdFxuICAgICAgICAgID8gcmVsZWFzZVBsdWdpbnMuaW5jbHVkZXMoJ0BzZW1hbnRpYy1yZWxlYXNlL25wbScpIHx8IHJlbGVhc2VQbHVnaW5zQXJlVW5rbm93blxuICAgICAgICAgIDogdXNlc1NlbWFudGljUmVsZWFzZSxcbiAgICAgICAgbnBtUHVibGlzaGVzUm9vdDogcmVsZWFzZU5wbVBsdWdpblB1Ymxpc2hlc1Jvb3QsXG4gICAgICB9LFxuICAgICAgbWlzZVRhc2tzOiBhd2FpdCByZWFkTWlzZVRhc2tzKGRpclBhdGgpLFxuICAgICAgcGFja2FnZUpzb24sXG4gICAgICB3YmZ5SnNvbixcbiAgICB9O1xuICAgIGlmIChcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbkdlbWZpbGUgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbkdvTW9kIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbiB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jayB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluVXZMb2NrIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5Qb21YbWwgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5UYXVyaUNvbmZpZyB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluVGVtcGxhdGVZYW1sIHx8XG4gICAgICAvLyBBIHJlcG9zaXRvcnkgY2FuIGxlZ2l0aW1hdGVseSBjb250YWluIG9ubHkgZG9jdW1lbnRhdGlvbi4gSXRzIEdpdCBtZXRhZGF0YSBpcyBlbm91Z2ggdG9cbiAgICAgIC8vIGVzdGFibGlzaCB0aGF0IHRoZSBDTEkgdGFyZ2V0IGlzIGEgcHJvamVjdCByb290OyByZXF1aXJpbmcgYSBsYW5ndWFnZSBtYW5pZmVzdCBoZXJlIHdvdWxkXG4gICAgICAvLyBtYWtlIHdiZnkgdW5hYmxlIHRvIGNyZWF0ZSB0aGUgcGFja2FnZS5qc29uIHRoYXQgaXQgbWFuYWdlcyBmb3Igc3VjaCByZXBvc2l0b3JpZXMuIEJvdGhcbiAgICAgIC8vIG9yZGluYXJ5IGNoZWNrb3V0cyAoYC5naXRgIGRpcmVjdG9yeSkgYW5kIHdvcmt0cmVlcyAoYC5naXRgIGZpbGUpIHNhdGlzZnkgdGhpcyBjaGVjay5cbiAgICAgIChjb25maWcuaXNSb290ICYmIGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICcuZ2l0JykpKVxuICAgICkge1xuICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG4vKipcbiAqIFRlbGxzIHdoZXRoZXIgd2JmeSBtYW5hZ2VzIHdvcmtlci1jb25maWd1cmF0aW9uLmQudHMgZm9yIHRoZSBwYWNrYWdlLiBUaGUgZmlsZSBpcyBnaXRpZ25vcmVkIGFuZCB1bnRyYWNrZWRcbiAqIGJlY2F1c2UgdGhlIGB3YiBnZW4tY29kZWAgcG9zdGluc3RhbGwgcmVnZW5lcmF0ZXMgaXQgb24gZXZlcnkgaW5zdGFsbCwgc28gdGhlIHBhY2thZ2UgaGFzIHRvIG93biBhIHdyYW5nbGVyXG4gKiBjb25maWcgKGB3cmFuZ2xlciB0eXBlc2AgZXhpdHMgbm9uLXplcm8gd2l0aG91dCBvbmUpLCB0byBkZXBlbmQgb24gd3JhbmdsZXIgKGEgcGFja2FnZSBkZXBsb3lpbmcgdmlhIGFcbiAqIENJIGFjdGlvbiBjYW5ub3QgcmVzb2x2ZSB0aGUgY29tbWFuZCksIGFuZCB0byBjb25zdW1lIHRoZSBnZW5lcmF0ZWQgZmlsZS5cbiAqXG4gKiBJTlZBUklBTlQg4oCUIHRoaXMgZGVjaXNpb24gbXVzdCBjb252ZXJnZSBhY3Jvc3MgbWFjaGluZXMgaG9sZGluZyB0aGUgc2FtZSBjb21taXQuIEl0IG11c3QgTkVWRVIgY29uc3VsdFxuICogZ2l0aWdub3JlZCBmaWxlcyAoYC5kZXYudmFycypgLCBgLmVudipgLCAuLi4pLCB3aGljaCBgd2Igc3RhcnRgIGFuZCBgd2IgZGVwbG95YCBjcmVhdGUgcm91dGluZWx5IGFuZCB3aGljaFxuICogdGhlcmVmb3JlIHN0YXkgdW50cmFja2VkIG9uIGRldiBtYWNoaW5lcyBmb3JldmVyOiBhIGZvcm1lciBjaGVjayB0aGF0IHRyZWF0ZWQgdGhlbSBhcyBpcnJlcHJvZHVjaWJsZSBpbnB1dHNcbiAqIG1hZGUgd2JmeSBydW5zIG9uIGRldiBtYWNoaW5lcyByZS10cmFjayB0aGUgfjE1ay1saW5lIGdlbmVyYXRlZCBmaWxlIHRoYXQgcnVucyBmcm9tIGNsZWFuIGNoZWNrb3V0cyBoYWRcbiAqIHVudHJhY2tlZCwgb3NjaWxsYXRpbmcgZXRlcm5hbGx5IChlLmcuIGFpLWdhbWUtYnVpbGRlciAjNjg0IOKGkiAjNzQ2KS4gUmVhZGluZyBjb21taXR0YWJsZSByZXBvc2l0b3J5IGZpbGVzXG4gKiBmcm9tIHRoZSB3b3JraW5nIHRyZWUgKHRoZSB3cmFuZ2xlciBjb25maWcsIHBhY2thZ2UuanNvbiwgdHNjb25maWcg4oCUIGFzIGV2ZXJ5IHdiZnkgZ2VuZXJhdG9yIGRvZXMpIGlzIGZpbmU6XG4gKiBhbnkgZGl2ZXJnZW5jZSB0aGVyZSBpcyB0cmFuc2llbnQgYW5kIGRpc2FwcGVhcnMgb25jZSB0aGUgZmlsZSBpcyBjb21taXR0ZWQgb3IgcmVtb3ZlZC5cbiAqIFRoZSBoYXphcmQgdGhhdCBjaGVjayBndWFyZGVkIGFnYWluc3Qgbm8gbG9uZ2VyIGV4aXN0czogYHdiIGdlbi1jb2RlYCBydW5zIGB3cmFuZ2xlciB0eXBlcyAtLWVudi1maWxlYCB3aXRoXG4gKiBhIGtleSBzdHViIGRlcml2ZWQgc29sZWx5IGZyb20gdGhlIGNvbW1pdHRlZCBmbm94LnRvbWwgKHNlZSB3YidzIHdyaXRlV29ya2VyVHlwZXNFbnZTdHViKSwgc28gbG9jYWwgZG90ZW52XG4gKiBmaWxlcyBuZXZlciBpbmZsdWVuY2UgdGhlIGdlbmVyYXRlZCBgRW52YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlc1dvcmtlclR5cGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICBjb25zdCBwYWNrYWdlSnNvbiA9IGNvbmZpZy5wYWNrYWdlSnNvbjtcbiAgcmV0dXJuIGNvbmZpZy5kb2VzQ29udGFpbldyYW5nbGVyQ29uZmlnICYmIGhhc1dyYW5nbGVyRGVwZW5kZW5jeShwYWNrYWdlSnNvbikgJiYgY29uc3VtZXNHZW5lcmF0ZWRXb3JrZXJUeXBlcyhjb25maWcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0V29ya2VyVHlwZXNTY3JpcHRFcnJvcihjb25maWc6IFBpY2s8UGFja2FnZUNvbmZpZywgJ3BhY2thZ2VKc29uJz4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBzY3JpcHRzID0gY29uZmlnLnBhY2thZ2VKc29uPy5zY3JpcHRzID8/IHt9O1xuICBmb3IgKGNvbnN0IFtuYW1lLCBzY3JpcHRdIG9mIE9iamVjdC5lbnRyaWVzKHNjcmlwdHMpKSB7XG4gICAgaWYgKHNjcmlwdCA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICBjb25zdCBzZWdtZW50cyA9IHNwbGl0U2NyaXB0U2VnbWVudHMoc2NyaXB0KTtcbiAgICBjb25zdCBoYXNOb25DYW5vbmljYWxXYkdlbkNvZGUgPSBzZWdtZW50cz8uc29tZSgoc2VnbWVudCkgPT4ge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IHNlZ21lbnQudHJpbSgpLnJlcGxhY2VBbGwoL1xccysvZ3UsICcgJyk7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAvXig/Oig/OmJ1bnxidW54KSg/OiAtLWJ1bik/KD86IHJ1bik/ICk/d2IgZ2VuLWNvZGUkL3UudGVzdChub3JtYWxpemVkKSAmJlxuICAgICAgICBjbGFzc2lmeVNjcmlwdFNlZ21lbnQoc2VnbWVudCwgc2NyaXB0cywgdHJ1ZSkgPT09ICdjdXN0b20nXG4gICAgICApO1xuICAgIH0pO1xuICAgIGlmIChoYXNOb25DYW5vbmljYWxXYkdlbkNvZGUpIHJldHVybiBgJHtuYW1lfSBtdXN0IHVzZSB0aGUgY2Fub25pY2FsIGJ1biB3YiBnZW4tY29kZSBjb21tYW5kYDtcbiAgfVxuICAvLyBPbmx5IGBidW4gcnVuIDxzY3JpcHQ+YCBpcyByZWNvZ25pemVkIGFzIGEgd3JhcHBlcjsgYW5vdGhlciBydW5uZXIgc3BlbGxpbmcgd291bGQgZ2V0IGEgbWFuYWdlZFxuICAvLyBnZW5lcmF0aW9uIGFwcGVuZGVkIG5leHQgdG8gaXQgYW5kIHJ1biBldmVyeSBnZW5lcmF0b3IgdHdpY2UgcGVyIGluc3RhbGwuIFdpdGhvdXQgYSBnZW4tY29kZVxuICAvLyBwaXBlbGluZSBub3RoaW5nIGlzIGFwcGVuZGVkLCBzbyB0aGUgc3BlbGxpbmcgaXMgaXJyZWxldmFudCB0aGVyZS5cbiAgZm9yIChjb25zdCBzZWdtZW50IG9mIHNwbGl0U2NyaXB0U2VnbWVudHMoc2NyaXB0cy5wb3N0aW5zdGFsbCA/PyAnJykgPz8gW10pIHtcbiAgICBjb25zdCBzY3JpcHROYW1lID0gL14oPzpidW58YnVueCkoPzpcXHMrLS1idW4pPyg/OlxccytydW4pP1xccysoXFxTKykkL3UuZXhlYyhzZWdtZW50KT8uWzFdO1xuICAgIGNvbnN0IHRhcmdldCA9IHNjcmlwdE5hbWUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHNjcmlwdHNbc2NyaXB0TmFtZV07XG4gICAgaWYgKFxuICAgICAgdGFyZ2V0ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIHNlZ21lbnQgIT09IGBidW4gcnVuICR7c2NyaXB0TmFtZX1gICYmXG4gICAgICAoc2NyaXB0c1snZ2VuLWNvZGUnXSAhPT0gdW5kZWZpbmVkIHx8IHRhcmdldC5pbmNsdWRlcygnd2IgZ2VuLWNvZGUnKSlcbiAgICApIHtcbiAgICAgIHJldHVybiBgcG9zdGluc3RhbGwgbXVzdCBpbnZva2UgdGhlICR7c2NyaXB0TmFtZX0gc2NyaXB0IGFzIGJ1biBydW4gJHtzY3JpcHROYW1lfWA7XG4gICAgfVxuICB9XG4gIGlmIChcbiAgICAvKD86XnwmJilcXHMqKD86bnBtfG5weHxwbnBtfHlhcm4pXFxzKyg/OnJ1big/Oi1zY3JpcHQpP1xccyspPyg/Omdlbi1jb2RlfHdiXFxzK2dlbi1jb2RlKVxccyooPzomJnwkKS91LnRlc3QoXG4gICAgICBzY3JpcHRzLnBvc3RpbnN0YWxsID8/ICcnXG4gICAgKVxuICApIHtcbiAgICByZXR1cm4gJ3Bvc3RpbnN0YWxsIG11c3QgdXNlIGJ1biB3YiBnZW4tY29kZSBpbnN0ZWFkIG9mIGEgbm9uLUJ1biBnZW4tY29kZSBydW5uZXInO1xuICB9XG4gIGZvciAoY29uc3QgW25hbWUsIHNjcmlwdF0gb2YgT2JqZWN0LmVudHJpZXMoc2NyaXB0cykpIHtcbiAgICBpZiAoc2NyaXB0ID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgIGlmICh3cmFuZ2xlclR5cGVzVGV4dFBhdHRlcm4udGVzdChzY3JpcHQpKSByZXR1cm4gYCR7bmFtZX0gbXVzdCB1c2UgYnVuIHdiIGdlbi1jb2RlIGluc3RlYWQgb2Ygd3JhbmdsZXIgdHlwZXNgO1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhc1dyYW5nbGVyRGVwZW5kZW5jeShwYWNrYWdlSnNvbjogUGFja2FnZUpzb24gfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIFtcbiAgICBwYWNrYWdlSnNvbj8uZGVwZW5kZW5jaWVzLFxuICAgIHBhY2thZ2VKc29uPy5kZXZEZXBlbmRlbmNpZXMsXG4gICAgcGFja2FnZUpzb24/Lm9wdGlvbmFsRGVwZW5kZW5jaWVzLFxuICAgIHBhY2thZ2VKc29uPy5wZWVyRGVwZW5kZW5jaWVzLFxuICBdLnNvbWUoKGRlcGVuZGVuY2llcykgPT4gZGVwZW5kZW5jaWVzPy53cmFuZ2xlciAhPT0gdW5kZWZpbmVkKTtcbn1cblxuY29uc3Qgc2hlbGxXb3JkUGF0dGVybiA9IFN0cmluZy5yYXdgKD86XCIoPzpcXFxcLnxbXlwiXFxcXF0pKlwifCcoPzpcXFxcLnxbXidcXFxcXSkqJ3woPzpcXFxcLnxbXlxcc1wiJ1xcXFxdKSspYDtcbmNvbnN0IHdyYW5nbGVyT3B0aW9uUGF0dGVybiA9IFN0cmluZy5yYXdgXFxzKy0tP1tBLVphLXpdW1xcdy1dKig/Oj0ke3NoZWxsV29yZFBhdHRlcm59fFxccysoPyEtfHR5cGVzXFxiKSR7c2hlbGxXb3JkUGF0dGVybn0pP2A7XG5jb25zdCB3cmFuZ2xlclR5cGVzVGV4dFBhdHRlcm4gPSBuZXcgUmVnRXhwKFxuICBTdHJpbmcucmF3YFtcIiddP1xcYndyYW5nbGVyKD86QFteXFxzXCInXSspP1xcYltcIiddPyg/OiR7d3JhbmdsZXJPcHRpb25QYXR0ZXJufSkqXFxzK3R5cGVzXFxiYCxcbiAgJ3UnXG4pO1xuXG4vKipcbiAqIEEgcGFja2FnZSB3aG9zZSBUeXBlU2NyaXB0IHByb2plY3QgY2Fubm90IGluY2x1ZGUgd29ya2VyLWNvbmZpZ3VyYXRpb24uZC50cyAoZS5nLiBvbmUgb24gYSBoYW5kLW1haW50YWluZWRcbiAqIG1pbmltYWwgYEVudmAgd2l0aCBgdHlwZXM6IFtcImJ1blwiXWAsIHRoZSBzdGFuZGFyZCBlc2NhcGUgd2hlbiB0aGUgYW1iaWVudCB3cmFuZ2xlciBnbG9iYWxzIGNvbmZsaWN0IHdpdGggdGhlXG4gKiBgQHR5cGVzL2J1bmAgZ2xvYmFscyBpdHMgdGVzdHMgbmVlZCkgZ2FpbnMgbm90aGluZyBmcm9tIHJlZ2VuZXJhdGluZyB0aGUgfjUwMEtCIGZpbGUgb24gZXZlcnkgaW5zdGFsbCwgc28gd2JmeVxuICogbGVhdmVzIHN1Y2ggcGFja2FnZXMgdW5tYW5hZ2VkIGluc3RlYWQgb2YgcmUtYWRkaW5nIHRoZSBnZW5lcmF0aW9uIHN0ZXAuIENvbnN1bXB0aW9uIGlzIGRldGVjdGVkIHR3byB3YXlzOlxuICogYSB0ZXh0dWFsIGB3b3JrZXItY29uZmlndXJhdGlvbmAgcmVmZXJlbmNlIGluIGFueSB0cmFja2VkIGZpbGUgb2YgdGhlIHBhY2thZ2UgKGNvdmVycyBpbXBvcnRzLCB0cmlwbGUtc2xhc2hcbiAqIHJlZmVyZW5jZXMsIGFuZCBleHBsaWNpdCB0c2NvbmZpZyBlbnRyaWVzKSwgb3IgYSBgZmlsZXNgL2BpbmNsdWRlYC9gZXhjbHVkZWAgc2V0IHRoYXQgY2FuIG1hdGNoIHRoZSBmaWxlIOKAlFxuICogcmVzb2x2ZWQgdGhyb3VnaCByZWxhdGl2ZSBgZXh0ZW5kc2AgY2hhaW5zIHdpdGggZWFjaCBwYXR0ZXJuIGtlcHQgcmVsYXRpdmUgdG8gdGhlIGNvbmZpZyB0aGF0IGRlY2xhcmVkIGl0LFxuICogbWF0Y2hpbmcgdHNjLiBXaGVuZXZlciB0aGUgZWZmZWN0aXZlIHNldCBjYW5ub3QgYmUgZGV0ZXJtaW5lZCAobWlzc2luZyBvciB1bnBhcnNlYWJsZSB0c2NvbmZpZywgcGFja2FnZS1uYW1lXG4gKiBgZXh0ZW5kc2AgcHJlc2V0cywgb3IgVHlwZVNjcmlwdCdzIGRlZmF1bHQgYCoqYCBpbmNsdXNpb24pLCB0aGUgY3VycmVudCBtYW5hZ2VkIGJlaGF2aW9yIGlzIGtlcHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25zdW1lc0dlbmVyYXRlZFdvcmtlclR5cGVzKGNvbmZpZzogUGljazxQYWNrYWdlQ29uZmlnLCAnZGlyUGF0aCc+KTogYm9vbGVhbiB7XG4gIC8vIGBnaXQgZ3JlcGAgc2VhcmNoZXMgdHJhY2tlZCBmaWxlcyBvbmx5LCBzbyB0aGUgZ2l0aWdub3JlZCBnZW5lcmF0ZWQgZmlsZSBpdHNlbGYgbmV2ZXIgbWF0Y2hlcy5cbiAgLy8gd2JmeSdzIG93biBtYW5hZ2VkIGFydGlmYWN0cyBhcmUgZXhjbHVkZWQ6IHRoZSBgLmdpdGlnbm9yZWAgcnVsZSAoYC93b3JrZXItY29uZmlndXJhdGlvbi5kLnRzYClcbiAgLy8gd2JmeSBjb21taXR0ZWQgd2hpbGUgaXQgbWFuYWdlZCB0aGUgcGFja2FnZSBtdXN0IG5vdCBjb3VudCBhcyBjb25zdW1wdGlvbiwgb3IgYSBvbmNlLW1hbmFnZWRcbiAgLy8gcGFja2FnZSBjb3VsZCBuZXZlciBvcHQgb3V0LlxuICBjb25zdCBncmVwUmVzdWx0ID0gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KFxuICAgICdnaXQnLFxuICAgIC8vIHRzY29uZmlnIGZpbGVzIGFyZSBjbGFzc2lmaWVkIGJ5IHRoZSByZXNvbHZlZCBmaWxlcy9pbmNsdWRlL2V4Y2x1ZGUgbG9naWMgYmVsb3cg4oCUIGEgdGV4dHVhbFxuICAgIC8vIGhpdCB0aGVyZSAoZS5nLiBhbiBgZXhjbHVkZWAgZW50cnkpIG11c3Qgbm90IGNvdW50IGFzIGNvbnN1bXB0aW9uLlxuICAgIFtcbiAgICAgICdncmVwJyxcbiAgICAgICctbCcsXG4gICAgICAnd29ya2VyLWNvbmZpZ3VyYXRpb24nLFxuICAgICAgJy0tJyxcbiAgICAgICcuJyxcbiAgICAgICc6KGV4Y2x1ZGUpLmdpdGlnbm9yZScsXG4gICAgICAnOihleGNsdWRlKS5naXRhdHRyaWJ1dGVzJyxcbiAgICAgIFN0cmluZy5yYXdgOihnbG9iLGV4Y2x1ZGUpKiovdHNjb25maWcqLmpzb25gLFxuICAgIF0sXG4gICAgY29uZmlnLmRpclBhdGhcbiAgKTtcbiAgaWYgKGdyZXBSZXN1bHQudHJpbSgpKSByZXR1cm4gdHJ1ZTtcblxuICBjb25zdCB3b3JrZXJUeXBlc1BhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICd3b3JrZXItY29uZmlndXJhdGlvbi5kLnRzJyk7XG4gIGNvbnN0IGZpbGVTZXQgPSByZXNvbHZlVHNjb25maWdGaWxlU2V0KHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3RzY29uZmlnLmpzb24nKSwgY29uZmlnLmRpclBhdGgsIDUpO1xuICBpZiAoIWZpbGVTZXQpIHJldHVybiB0cnVlO1xuICBjb25zdCBtYXRjaGVzID0gKHBhdHRlcm5TZXQ6IFRzY29uZmlnUGF0dGVyblNldCB8IHVuZGVmaW5lZCk6IGJvb2xlYW4gPT4ge1xuICAgIGlmICghcGF0dGVyblNldCB8fCAhQXJyYXkuaXNBcnJheShwYXR0ZXJuU2V0LnBhdHRlcm5zKSkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUocGF0dGVyblNldC5iYXNlRGlyUGF0aCwgd29ya2VyVHlwZXNQYXRoKS5yZXBsYWNlQWxsKCdcXFxcJywgJy8nKTtcbiAgICByZXR1cm4gcGF0dGVyblNldC5wYXR0ZXJucy5zb21lKChwYXR0ZXJuKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHBhdHRlcm4gIT09ICdzdHJpbmcnKSByZXR1cm4gZmFsc2U7XG4gICAgICAvLyBgJHtjb25maWdEaXJ9YC1wcmVmaXhlZCBwYXR0ZXJucyB3ZXJlIGV4cGFuZGVkIHRvIGFic29sdXRlIHBhdGhzIGF0IHJlc29sdmUgdGltZS5cbiAgICAgIGlmIChwYXRoLmlzQWJzb2x1dGUocGF0dGVybikpIHtcbiAgICAgICAgcmV0dXJuIHRzY29uZmlnUGF0dGVybkNvdWxkTWF0Y2hQYXRoKHBhdHRlcm4sIHdvcmtlclR5cGVzUGF0aCwgcGF0dGVyblNldC5leHBhbmRzRGlyZWN0b3JpZXMpO1xuICAgICAgfVxuICAgICAgaWYgKHJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuLicpKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gdHNjb25maWdQYXR0ZXJuQ291bGRNYXRjaFBhdGgocGF0dGVybiwgcmVsYXRpdmVQYXRoLCBwYXR0ZXJuU2V0LmV4cGFuZHNEaXJlY3Rvcmllcyk7XG4gICAgfSk7XG4gIH07XG4gIC8vIGBmaWxlc2AgZW50cmllcyBhcmUgYWx3YXlzIHBhcnQgb2YgdGhlIHByb2dyYW0sIGV2ZW4gd2hlbiBgZXhjbHVkZWAgbWF0Y2hlcyB0aGVtLlxuICBpZiAobWF0Y2hlcyhmaWxlU2V0LmZpbGVzKSkgcmV0dXJuIHRydWU7XG4gIGlmIChtYXRjaGVzKGZpbGVTZXQuZXhjbHVkZSkpIHJldHVybiBmYWxzZTtcbiAgLy8gTmVpdGhlciBpbmNsdWRlIG5vciBmaWxlcyBkZWNsYXJlZDogVHlwZVNjcmlwdCdzIGRlZmF1bHQgYCoqYCBpbmNsdXNpb24gY292ZXJzIHRoZSBmaWxlLlxuICBpZiAoIWZpbGVTZXQuaW5jbHVkZSAmJiAhZmlsZVNldC5maWxlcykgcmV0dXJuIHRydWU7XG4gIHJldHVybiBtYXRjaGVzKGZpbGVTZXQuaW5jbHVkZSk7XG59XG5cbmludGVyZmFjZSBUc2NvbmZpZ1BhdHRlcm5TZXQge1xuICAvKiogRGlyZWN0b3J5IG9mIHRoZSBjb25maWcgdGhhdCBkZWNsYXJlZCB0aGUgcGF0dGVybnM7IHRzYyByZXNvbHZlcyB0aGVtIHJlbGF0aXZlIHRvIGl0LiAqL1xuICBiYXNlRGlyUGF0aDogc3RyaW5nO1xuICAvKiogaW5jbHVkZS9leGNsdWRlIHRyZWF0IGFuIGV4dGVuc2lvbmxlc3Mgbm9uLWdsb2IgcGF0dGVybiBhcyBhIGRpcmVjdG9yeSBzdWJ0cmVlOyBgZmlsZXNgIGRvZXMgbm90LiAqL1xuICBleHBhbmRzRGlyZWN0b3JpZXM6IGJvb2xlYW47XG4gIHBhdHRlcm5zOiB1bmtub3duO1xufVxuXG5pbnRlcmZhY2UgVHNjb25maWdGaWxlU2V0IHtcbiAgZXhjbHVkZT86IFRzY29uZmlnUGF0dGVyblNldDtcbiAgZmlsZXM/OiBUc2NvbmZpZ1BhdHRlcm5TZXQ7XG4gIGluY2x1ZGU/OiBUc2NvbmZpZ1BhdHRlcm5TZXQ7XG59XG5cbi8qKiBSZXNvbHZlcyBmaWxlcy9pbmNsdWRlL2V4Y2x1ZGUgdGhyb3VnaCByZWxhdGl2ZSBgZXh0ZW5kc2AgY2hhaW5zOyB1bmRlZmluZWQgd2hlbiB1bnJlYWRhYmxlLiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVRzY29uZmlnRmlsZVNldChcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgY29uc3VtZXJEaXJQYXRoOiBzdHJpbmcsXG4gIHJlbWFpbmluZ0RlcHRoOiBudW1iZXJcbik6IFRzY29uZmlnRmlsZVNldCB8IHVuZGVmaW5lZCB7XG4gIGlmIChyZW1haW5pbmdEZXB0aCA8PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICBsZXQgY29udGVudDogc3RyaW5nO1xuICB0cnkge1xuICAgIGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGY4Jyk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgY29uc3QgdHNjb25maWcgPSBqc29uY1V0aWwucGFyc2VPYmplY3RJZ25vcmluZ0Vycm9yPHtcbiAgICBleGNsdWRlPzogdW5rbm93bjtcbiAgICBleHRlbmRzPzogdW5rbm93bjtcbiAgICBmaWxlcz86IHVua25vd247XG4gICAgaW5jbHVkZT86IHVua25vd247XG4gIH0+KGNvbnRlbnQpO1xuICBpZiAoIXRzY29uZmlnKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBkaXJQYXRoID0gcGF0aC5kaXJuYW1lKGZpbGVQYXRoKTtcbiAgLy8gYCR7Y29uZmlnRGlyfWAgcmVzb2x2ZXMgdG8gdGhlIGRpcmVjdG9yeSBvZiB0aGUgUk9PVCAoY29uc3VtaW5nKSBjb25maWcsIHdoZXJldmVyIGl0IGFwcGVhcnMuXG4gIGNvbnN0IHRvUGF0dGVyblNldCA9IChwYXR0ZXJuczogdW5rbm93biwgZXhwYW5kc0RpcmVjdG9yaWVzOiBib29sZWFuKTogVHNjb25maWdQYXR0ZXJuU2V0IHwgdW5kZWZpbmVkID0+XG4gICAgQXJyYXkuaXNBcnJheShwYXR0ZXJucylcbiAgICAgID8ge1xuICAgICAgICAgIGJhc2VEaXJQYXRoOiBkaXJQYXRoLFxuICAgICAgICAgIGV4cGFuZHNEaXJlY3RvcmllcyxcbiAgICAgICAgICBwYXR0ZXJuczogcGF0dGVybnMubWFwKChwYXR0ZXJuKSA9PlxuICAgICAgICAgICAgdHlwZW9mIHBhdHRlcm4gPT09ICdzdHJpbmcnICYmIHBhdHRlcm4uc3RhcnRzV2l0aCgnJHtjb25maWdEaXJ9JylcbiAgICAgICAgICAgICAgPyBwYXRoLmpvaW4oY29uc3VtZXJEaXJQYXRoLCBwYXR0ZXJuLnNsaWNlKCcke2NvbmZpZ0Rpcn0nLmxlbmd0aCkpXG4gICAgICAgICAgICAgIDogcGF0dGVyblxuICAgICAgICAgICksXG4gICAgICAgIH1cbiAgICAgIDogdW5kZWZpbmVkO1xuICBjb25zdCBmaWxlU2V0OiBUc2NvbmZpZ0ZpbGVTZXQgPSB7XG4gICAgZXhjbHVkZTogdG9QYXR0ZXJuU2V0KHRzY29uZmlnLmV4Y2x1ZGUsIHRydWUpLFxuICAgIGZpbGVzOiB0b1BhdHRlcm5TZXQodHNjb25maWcuZmlsZXMsIGZhbHNlKSxcbiAgICBpbmNsdWRlOiB0b1BhdHRlcm5TZXQodHNjb25maWcuaW5jbHVkZSwgdHJ1ZSksXG4gIH07XG4gIGNvbnN0IHBhcmVudHMgPVxuICAgIHR5cGVvZiB0c2NvbmZpZy5leHRlbmRzID09PSAnc3RyaW5nJyA/IFt0c2NvbmZpZy5leHRlbmRzXSA6IEFycmF5LmlzQXJyYXkodHNjb25maWcuZXh0ZW5kcykgPyB0c2NvbmZpZy5leHRlbmRzIDogW107XG4gIC8vIFdpdGggYW4gYGV4dGVuZHNgIGFycmF5LCBsYXRlciBlbnRyaWVzIG92ZXJyaWRlIGVhcmxpZXIgb25lcywgYW5kIHRoZSBjaGlsZCBvdmVycmlkZXMgYWxsIOKAlFxuICAvLyBzbyBmaWxsIGVhY2ggc3RpbGwtbWlzc2luZyBrZXkgZnJvbSB0aGUgbGFzdCBwYXJlbnQgdGhhdCBkZWZpbmVzIGl0LlxuICBmb3IgKGNvbnN0IHBhcmVudCBvZiBwYXJlbnRzLnRvUmV2ZXJzZWQoKSkge1xuICAgIGlmIChmaWxlU2V0LmV4Y2x1ZGUgJiYgZmlsZVNldC5maWxlcyAmJiBmaWxlU2V0LmluY2x1ZGUpIGJyZWFrO1xuICAgIC8vIFBhY2thZ2UtbmFtZSBleHRlbmRzIChlLmcuIGBAdHNjb25maWcvYnVuYCkgYXJlIGNvbXBpbGVyT3B0aW9ucyBwcmVzZXRzIHdpdGhvdXQgZmlsZSBzZXRzLlxuICAgIGlmICh0eXBlb2YgcGFyZW50ICE9PSAnc3RyaW5nJyB8fCAhcGFyZW50LnN0YXJ0c1dpdGgoJy4nKSkgY29udGludWU7XG4gICAgbGV0IHBhcmVudFBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgcGFyZW50KTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMocGFyZW50UGF0aCkgJiYgZnMuZXhpc3RzU3luYyhgJHtwYXJlbnRQYXRofS5qc29uYCkpIHBhcmVudFBhdGggKz0gJy5qc29uJztcbiAgICBjb25zdCBwYXJlbnRGaWxlU2V0ID0gcmVzb2x2ZVRzY29uZmlnRmlsZVNldChwYXJlbnRQYXRoLCBjb25zdW1lckRpclBhdGgsIHJlbWFpbmluZ0RlcHRoIC0gMSk7XG4gICAgaWYgKCFwYXJlbnRGaWxlU2V0KSBjb250aW51ZTtcbiAgICBmaWxlU2V0LmV4Y2x1ZGUgPz89IHBhcmVudEZpbGVTZXQuZXhjbHVkZTtcbiAgICBmaWxlU2V0LmZpbGVzID8/PSBwYXJlbnRGaWxlU2V0LmZpbGVzO1xuICAgIGZpbGVTZXQuaW5jbHVkZSA/Pz0gcGFyZW50RmlsZVNldC5pbmNsdWRlO1xuICB9XG4gIHJldHVybiBmaWxlU2V0O1xufVxuXG5mdW5jdGlvbiB0c2NvbmZpZ1BhdHRlcm5Db3VsZE1hdGNoUGF0aChwYXR0ZXJuOiBzdHJpbmcsIHRhcmdldFBhdGg6IHN0cmluZywgZXhwYW5kc0RpcmVjdG9yaWVzOiBib29sZWFuKTogYm9vbGVhbiB7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBwYXR0ZXJuLnJlcGxhY2UoL15cXC5cXC8vdSwgJycpO1xuICAvLyBBIGJhcmUgYC5gIGluY2x1ZGUgY292ZXJzIGV2ZXJ5dGhpbmcgdW5kZXIgdGhlIGNvbmZpZydzIGRpcmVjdG9yeS5cbiAgaWYgKG5vcm1hbGl6ZWQgPT09ICcnIHx8IG5vcm1hbGl6ZWQgPT09ICcuJykgcmV0dXJuIHRydWU7XG4gIC8vIEFic29sdXRlIHBhdHRlcm5zIChleHBhbmRlZCBgJHtjb25maWdEaXJ9YCkgYXJlIG1hdGNoZWQgYWdhaW5zdCB0aGUgYWJzb2x1dGUgdGFyZ2V0OyBkcm9wIHRoZVxuICAvLyBsZWFkaW5nIHNsYXNoZXMgZnJvbSBib3RoIHNvIHRoZSBzZWdtZW50LWJ1aWx0IHJlZ2V4IGFuY2hvcnMgaWRlbnRpY2FsbHkuXG4gIHRhcmdldFBhdGggPSB0YXJnZXRQYXRoLnJlcGxhY2UoL15cXC8rL3UsICcnKTtcbiAgY29uc3Qgc2VnbWVudHMgPSBub3JtYWxpemVkLnNwbGl0KCcvJykuZmlsdGVyKChzZWdtZW50KSA9PiBzZWdtZW50ICE9PSAnJyk7XG4gIGNvbnN0IHJlZ2V4U291cmNlID0gc2VnbWVudHNcbiAgICAubWFwKChzZWdtZW50LCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgaXNMYXN0ID0gaW5kZXggPT09IHNlZ21lbnRzLmxlbmd0aCAtIDE7XG4gICAgICBpZiAoc2VnbWVudCA9PT0gJyoqJykgcmV0dXJuIGlzTGFzdCA/ICcuKicgOiBTdHJpbmcucmF3YCg/OlteL10rLykqYDtcbiAgICAgIGNvbnN0IHNlZ21lbnRTb3VyY2UgPSBzZWdtZW50XG4gICAgICAgIC5yZXBsYWNlQWxsKC9bLiteJHt9KCl8W1xcXVxcXFxdL2d1LCBTdHJpbmcucmF3YFxcJCZgKVxuICAgICAgICAucmVwbGFjZUFsbCgnKicsIFN0cmluZy5yYXdgW14vXSpgKVxuICAgICAgICAucmVwbGFjZUFsbCgnPycsIFN0cmluZy5yYXdgW14vXWApO1xuICAgICAgcmV0dXJuIGlzTGFzdCA/IHNlZ21lbnRTb3VyY2UgOiBgJHtzZWdtZW50U291cmNlfS9gO1xuICAgIH0pXG4gICAgLmpvaW4oJycpO1xuICAvLyB0c2MgdHJlYXRzIGFuIGV4dGVuc2lvbmxlc3Mgbm9uLWdsb2IgaW5jbHVkZS9leGNsdWRlIGVudHJ5IGFzIGEgZGlyZWN0b3J5IHdob3NlIHN1YnRyZWUgaXMgaW5jbHVkZWQuXG4gIGNvbnN0IGxhc3RTZWdtZW50ID0gc2VnbWVudHMuYXQoLTEpID8/ICcnO1xuICBjb25zdCBkaXJlY3RvcnlTdWZmaXggPVxuICAgIGV4cGFuZHNEaXJlY3RvcmllcyAmJiAhL1sqP10vdS50ZXN0KGxhc3RTZWdtZW50KSAmJiAhbGFzdFNlZ21lbnQuaW5jbHVkZXMoJy4nKSA/IFN0cmluZy5yYXdgKD86Ly4qKT9gIDogJyc7XG4gIHJldHVybiBuZXcgUmVnRXhwKGBeJHtyZWdleFNvdXJjZX0ke2RpcmVjdG9yeVN1ZmZpeH0kYCwgJ3UnKS50ZXN0KHRhcmdldFBhdGgpO1xufVxuXG4vKipcbiAqIFRlbGxzIHdoZXRoZXIgdGhlIGRpcmVjdG9yeSBvd25zIGEgV29ya2VyLCB1bmxpa2UgdGhlIGlzQ2xvdWRmbGFyZSBoZXVyaXN0aWMsIHdoaWNoIGFsc28gbWF0Y2hlcyBhIHBhY2thZ2UgdGhhdFxuICogbWVyZWx5IG1lbnRpb25zIHdyYW5nbGVyIGluIGEgc2NyaXB0IG9yIHdvcmtmbG93IChlLmcuIHRoZSByb290IG9mIGEgbW9ub3JlcG8gd2hvc2UgV29ya2VyIGxpdmVzIGluIGEgc3ViLXBhY2thZ2UpLlxuICovXG5mdW5jdGlvbiBkZXRlY3RXcmFuZ2xlckNvbmZpZyhkaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIFsnd3JhbmdsZXIuanNvbmMnLCAnd3JhbmdsZXIuanNvbicsICd3cmFuZ2xlci50b21sJ10uc29tZSgoZmlsZU5hbWUpID0+XG4gICAgZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgZmlsZU5hbWUpKVxuICApO1xufVxuXG4vKipcbiAqIERldGVjdHMgd2hldGhlciBkaXJQYXRoIGJlbG9uZ3MgdG8gdGhlIHdpbGxib29zdGVyLWNvbmZpZ3MgcmVwb3NpdG9yeS4gUHJlZmVycyB0aGUgYXV0aG9yaXRhdGl2ZVxuICogR2l0SHViIHJlcG8gbmFtZSwgd2hpY2ggaXMgaW1tdW5lIHRvIHRoZSBsb2NhbCBkaXJlY3RvcnkgbGF5b3V0LiBUaGF0IG5hbWUgaXMgZmV0Y2hlZCBvbmx5IGZvciB0aGVcbiAqIHJvb3QsIHNvIHN1Yi1wYWNrYWdlcyAoYW5kIG9mZmxpbmUgcm9vdHMpIHdhbGsgdXAgdG8gdGhlIG5lYXJlc3QgZ2l0IHJvb3QgYW5kIG1hdGNoIGl0cyBkaXJlY3RvcnlcbiAqIG5hbWU6IGEgc2libGluZyByZXBvIGNsb25lZCB1bmRlciBhIHBhcmVudCBkaXJlY3RvcnkgbmFtZWQgd2lsbGJvb3N0ZXItY29uZmlncyBzdG9wcyBhdCBpdHMgb3duXG4gKiBgLmdpdGAsIHNvIGl0IGlzIG5vdCBtaXNjbGFzc2lmaWVkLiBUaGUgcGF0aCBzZWdtZW50IHJlbWFpbnMgYSBsYXN0IHJlc29ydCB3aGVuIG5vIGdpdCByb290IGV4aXN0cy5cbiAqL1xuZnVuY3Rpb24gZGV0ZWN0SXNXaWxsQm9vc3RlckNvbmZpZ3MoZGlyUGF0aDogc3RyaW5nLCBwYWNrYWdlSnNvblBhdGg6IHN0cmluZywgcmVwb05hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICBpZiAocmVwb05hbWUpIHJldHVybiByZXBvTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnd2lsbGJvb3N0ZXItY29uZmlncyc7XG4gIGxldCBjdXJyZW50ID0gcGF0aC5yZXNvbHZlKGRpclBhdGgpO1xuICB3aGlsZSAoY3VycmVudCAhPT0gcGF0aC5kaXJuYW1lKGN1cnJlbnQpKSB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGN1cnJlbnQsICcuZ2l0JykpKSB7XG4gICAgICByZXR1cm4gcGF0aC5iYXNlbmFtZShjdXJyZW50KS50b0xvd2VyQ2FzZSgpID09PSAnd2lsbGJvb3N0ZXItY29uZmlncyc7XG4gICAgfVxuICAgIGN1cnJlbnQgPSBwYXRoLmRpcm5hbWUoY3VycmVudCk7XG4gIH1cbiAgcmV0dXJuIHBhY2thZ2VKc29uUGF0aC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCcvd2lsbGJvb3N0ZXItY29uZmlncy8nKTtcbn1cblxuZnVuY3Rpb24gZGV0ZWN0Q2xvdWRmbGFyZShcbiAgcGFja2FnZUpzb246IFBhY2thZ2VKc29uLFxuICBkb2VzQ29udGFpbldyYW5nbGVyQ29uZmlnOiBib29sZWFuLFxuICB3b3JrZmxvd0NvbnRlbnRzOiBzdHJpbmdbXVxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IHNjcmlwdHMgPSBwYWNrYWdlSnNvbi5zY3JpcHRzO1xuICBpZiAoc2NyaXB0cyAmJiBPYmplY3QudmFsdWVzKHNjcmlwdHMpLnNvbWUoKHNjcmlwdCkgPT4gdHlwZW9mIHNjcmlwdCA9PT0gJ3N0cmluZycgJiYgc2NyaXB0LmluY2x1ZGVzKCd3cmFuZ2xlcicpKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGRvZXNDb250YWluV3JhbmdsZXJDb25maWcpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiB3b3JrZmxvd0NvbnRlbnRzLnNvbWUoKGNvbnRlbnQpID0+IC9jbG91ZGZsYXJlfHdyYW5nbGVyL2l1LnRlc3QoY29udGVudCkpO1xufVxuXG5mdW5jdGlvbiBkZXRlY3RSYWlsd2F5KGRpclBhdGg6IHN0cmluZywgcGFja2FnZUpzb246IFBhY2thZ2VKc29uLCB3b3JrZmxvd0NvbnRlbnRzOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICBjb25zdCBzY3JpcHRzID0gcGFja2FnZUpzb24uc2NyaXB0cztcbiAgaWYgKHNjcmlwdHMgJiYgT2JqZWN0LnZhbHVlcyhzY3JpcHRzKS5zb21lKChzY3JpcHQpID0+IHR5cGVvZiBzY3JpcHQgPT09ICdzdHJpbmcnICYmIHNjcmlwdC5pbmNsdWRlcygncmFpbHdheScpKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKFxuICAgIGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICcucmFpbHdheWlnbm9yZScpKSB8fFxuICAgIGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdyYWlsd2F5Lmpzb24nKSkgfHxcbiAgICBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncmFpbHdheS50b21sJykpXG4gICkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIHdvcmtmbG93Q29udGVudHMuc29tZSgoY29udGVudCkgPT4gL3JhaWx3YXkvaXUudGVzdChjb250ZW50KSk7XG59XG5cbi8qKiBDb250ZW50cyBvZiB0aGUgcmVhZGFibGUgLmdpdGh1Yi93b3JrZmxvd3MgWUFNTCBmaWxlcywgcmVhZCBvbmNlIGZvciBldmVyeSBkZXRlY3RvciBuZWVkaW5nIHRoZW0uICovXG5mdW5jdGlvbiByZWFkV29ya2Zsb3dGaWxlQ29udGVudHMoZGlyUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCB3b3JrZmxvd3NQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICcuZ2l0aHViJywgJ3dvcmtmbG93cycpO1xuICB0cnkge1xuICAgIHJldHVybiBmc1xuICAgICAgLnJlYWRkaXJTeW5jKHdvcmtmbG93c1BhdGgpXG4gICAgICAuZmlsdGVyKChmaWxlTmFtZSkgPT4gL1xcLnlhP21sJC9pdS50ZXN0KGZpbGVOYW1lKSlcbiAgICAgIC5mbGF0TWFwKChmaWxlTmFtZSkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBbZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCBmaWxlTmFtZSksICd1dGY4JyldO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gW107XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZE1pc2VUYXNrcyhkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+IHtcbiAgY29uc3QgdGFza3M6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgZm9yIChjb25zdCBmaWxlTmFtZSBvZiBbJ21pc2UudG9tbCcsICcubWlzZS50b21sJ10pIHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCBmaWxlTmFtZSk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNldHRpbmdzID0gQnVuLlRPTUwucGFyc2UoYXdhaXQgZnNwLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpKSBhcyB7IHRhc2tzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfTtcbiAgICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhzZXR0aW5ncy50YXNrcyA/PyB7fSkpIHtcbiAgICAgICAgdGFza3NbbmFtZV0gPSByZWFkTWlzZVRhc2tDb21tYW5kKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIE1pc3Npbmcgb3IgdGVtcG9yYXJpbHkgaW52YWxpZCBtaXNlIGZpbGVzIHNob3VsZCBub3QgYmxvY2sgb3RoZXIgd2JmeSBnZW5lcmF0b3JzLlxuICAgIH1cbiAgfVxuICByZXR1cm4gdGFza3M7XG59XG5cbmZ1bmN0aW9uIHJlYWRNaXNlVGFza0NvbW1hbmQodmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgcmV0dXJuIHZhbHVlO1xuICAvLyBQcmVzZXJ2ZSBhcnJheS1mb3JtIG1pc2UgY29tbWFuZHMgc28gcmVjdXJzaW9uIGNoZWNrcyBjYW4gc3RpbGwgc2VlIHBhY2thZ2Ugc2NyaXB0IGNhbGxzLlxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiB2YWx1ZS5maWx0ZXIoKGNvbW1hbmQpOiBjb21tYW5kIGlzIHN0cmluZyA9PiB0eXBlb2YgY29tbWFuZCA9PT0gJ3N0cmluZycpLmpvaW4oJ1xcbicpO1xuICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JykgcmV0dXJuIHJlYWRNaXNlVGFza0NvbW1hbmQoKHZhbHVlIGFzIHsgcnVuPzogdW5rbm93biB9KS5ydW4pO1xuICByZXR1cm4gJyc7XG59XG5cbi8qKlxuICogV2hldGhlciBkaXJQYXRoIGlzIGEgY2hpbGQgd29ya3NwYWNlIG9mIGFuIGVuY2xvc2luZyBtb25vcmVwbyByb290OiBlaXRoZXIgdGhlIGNvbnZlbnRpb25hbFxuICogYDxyb290Pi9wYWNrYWdlcy88bmFtZT5gIGxheW91dCwgb3IgYSBkaXJlY3RvcnkgbWF0Y2hpbmcgYSB3b3Jrc3BhY2UgcGF0dGVybiBkZWNsYXJlZCBieSBhblxuICogYW5jZXN0b3IgcGFja2FnZS5qc29uIChwYXR0ZXJucyBtYXkgYmUgYXJiaXRyYXJpbHkgZGVlcCwgZS5nLiBgZXhhbXBsZXMvKipgKS4gVGhlIHdhbGsgc3RvcHNcbiAqIGF0IHRoZSBmaXJzdCBnaXQgcmVwb3NpdG9yeSBib3VuZGFyeSBzbyBhbiB1bnJlbGF0ZWQgZW5jbG9zaW5nIHJlcG9zaXRvcnkncyB3b3Jrc3BhY2VzIGNhblxuICogbmV2ZXIgcmVjbGFzc2lmeSBhbiBpbmRlcGVuZGVudCByZXBvc2l0b3J5IGFzIGEgY2hpbGQuXG4gKi9cbmZ1bmN0aW9uIGlzV29ya3NwYWNlT2ZFbmNsb3NpbmdSb290KGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCByZXNvbHZlZERpclBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCk7XG4gIC8vIEEgZGlyZWN0b3J5IHdpdGggaXRzIG93biAuZ2l0IGlzIGEgcmVwb3NpdG9yeSBpbiBpdHMgb3duIHJpZ2h0LCBuZXZlciBhIGNoaWxkIHdvcmtzcGFjZSDigJRcbiAgLy8gY2hlY2tlZCBGSVJTVCBzbyBhbiBpbmRlcGVuZGVudCByZXBvc2l0b3J5IHVuZGVyIHNvbWUgYHBhY2thZ2VzL2AgZGlyZWN0b3J5IHN0YXlzIGEgcm9vdC5cbiAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKHJlc29sdmVkRGlyUGF0aCwgJy5naXQnKSkpIHJldHVybiBmYWxzZTtcbiAgaWYgKFxuICAgIHBhdGguYmFzZW5hbWUocGF0aC5yZXNvbHZlKHJlc29sdmVkRGlyUGF0aCwgJy4uJykpID09PSAncGFja2FnZXMnICYmXG4gICAgZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUocmVzb2x2ZWREaXJQYXRoLCAnLi4nLCAnLi4nLCAncGFja2FnZS5qc29uJykpXG4gICkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGZvciAoXG4gICAgbGV0IGNhbmRpZGF0ZVJvb3REaXJQYXRoID0gcGF0aC5kaXJuYW1lKHJlc29sdmVkRGlyUGF0aCk7XG4gICAgO1xuICAgIGNhbmRpZGF0ZVJvb3REaXJQYXRoID0gcGF0aC5kaXJuYW1lKGNhbmRpZGF0ZVJvb3REaXJQYXRoKVxuICApIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgcm9vdFBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShcbiAgICAgICAgZnMucmVhZEZpbGVTeW5jKHBhdGgucmVzb2x2ZShjYW5kaWRhdGVSb290RGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpXG4gICAgICApIGFzIFBhY2thZ2VKc29uO1xuICAgICAgY29uc3QgcmVsYXRpdmVEaXJQYXRoID0gcGF0aC5yZWxhdGl2ZShjYW5kaWRhdGVSb290RGlyUGF0aCwgcmVzb2x2ZWREaXJQYXRoKS5yZXBsYWNlQWxsKCdcXFxcJywgJy8nKTtcbiAgICAgIGNvbnN0IHdvcmtzcGFjZURpclBhdGhzID0gZ2V0V29ya3NwYWNlUGFja2FnZUpzb25QYXRocyh7XG4gICAgICAgIGRpclBhdGg6IGNhbmRpZGF0ZVJvb3REaXJQYXRoLFxuICAgICAgICBwYWNrYWdlSnNvbjogcm9vdFBhY2thZ2VKc29uLFxuICAgICAgICBkb2VzQ29udGFpblN1YlBhY2thZ2VKc29uczogZmFsc2UsXG4gICAgICB9KS5tYXAoKHBhY2thZ2VKc29uUGF0aCkgPT4gcGF0aC5wb3NpeC5kaXJuYW1lKHBhY2thZ2VKc29uUGF0aCkpO1xuICAgICAgaWYgKHdvcmtzcGFjZURpclBhdGhzLmluY2x1ZGVzKHJlbGF0aXZlRGlyUGF0aCkpIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gTm8gb3IgdW5wYXJzYWJsZSBtYW5pZmVzdCBhdCB0aGlzIGFuY2VzdG9yOiBrZWVwIHdhbGtpbmcuXG4gICAgfVxuICAgIGNvbnN0IGlzUmVwb0JvdW5kYXJ5ID0gZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY2FuZGlkYXRlUm9vdERpclBhdGgsICcuZ2l0JykpO1xuICAgIGNvbnN0IGlzRmlsZXN5c3RlbVJvb3QgPSBjYW5kaWRhdGVSb290RGlyUGF0aCA9PT0gcGF0aC5kaXJuYW1lKGNhbmRpZGF0ZVJvb3REaXJQYXRoKTtcbiAgICBpZiAoaXNSZXBvQm91bmRhcnkgfHwgaXNGaWxlc3lzdGVtUm9vdCkgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbnRhaW5zQW55KHBhdHRlcm46IHN0cmluZywgZGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBmZy5nbG9iU3luYyhwYXR0ZXJuLCB7IGRvdDogdHJ1ZSwgY3dkOiBkaXJQYXRoLCBpZ25vcmU6IGdsb2JJZ25vcmUgfSkubGVuZ3RoID4gMDtcbn1cblxuZnVuY3Rpb24gZmluZENhcmdvVG9tbERpclBhdGhzKGRpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIGZnXG4gICAgLmdsb2JTeW5jKCcqKi9DYXJnby50b21sJywgeyBkb3Q6IHRydWUsIGN3ZDogZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH0pXG4gICAgLm1hcCgoZmlsZVBhdGgpID0+IHBhdGguZGlybmFtZShmaWxlUGF0aCkpXG4gICAgLnRvU29ydGVkKChhLCBiKSA9PiBhLnNwbGl0KCcvJykubGVuZ3RoIC0gYi5zcGxpdCgnLycpLmxlbmd0aCB8fCBhLmxvY2FsZUNvbXBhcmUoYikpO1xufVxuXG5mdW5jdGlvbiBkZXRlY3RQbGF5d3JpZ2h0UnVudGltZUltcG9ydChkaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgZmlsZXMgPSBmZy5nbG9iU3luYygne2FwcCxzcmN9LyoqLyoue2NqcyxjdHMsanMsanN4LG1qcyxtdHMsdHMsdHN4fScsIHtcbiAgICBkb3Q6IHRydWUsXG4gICAgY3dkOiBkaXJQYXRoLFxuICAgIGlnbm9yZTogWy4uLmdsb2JJZ25vcmUsICcqKi9fX3Rlc3RzX18vKionLCAnKiovKi5zcGVjLionLCAnKiovKi50ZXN0LionLCAnKiovcGxheXdyaWdodC5jb25maWcuKiddLFxuICB9KTtcbiAgY29uc3QgcGxheXdyaWdodEltcG9ydFBhdHRlcm4gPSBidWlsZFJ1bnRpbWVJbXBvcnRSZWdFeHAoJ3BsYXl3cmlnaHQnKTtcbiAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgZmlsZSksICd1dGY4Jyk7XG4gICAgaWYgKHBsYXl3cmlnaHRJbXBvcnRQYXR0ZXJuLnRlc3QoY29udGVudCkpIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gYnVpbGRSdW50aW1lSW1wb3J0UmVnRXhwKHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBSZWdFeHAge1xuICAvLyBNYXRjaCB0aGUgYmFyZSBzcGVjaWZpZXIgb3IgYW55IHN1YnBhdGggb2YgaXQgKGBwa2dgIC8gYHBrZy9zdWJgKSwgYnV0IG5ldmVyIGEgZGlmZmVyZW50IHBhY2thZ2VcbiAgLy8gdGhhdCBtZXJlbHkgc2hhcmVzIHRoZSBwcmVmaXggKGBwa2ctb3RoZXJgKSwgc2luY2UgdGhlIGNoYXIgYWZ0ZXIgdGhlIG5hbWUgbXVzdCBiZSBgL2Agb3IgYSBxdW90ZS5cbiAgY29uc3Qgc3BlY2lmaWVyID0gU3RyaW5nLnJhd2BbJ1wiXSR7ZXNjYXBlUmVnRXhwKHBhY2thZ2VOYW1lKX0oPzovW14nXCJdKik/WydcIl1gO1xuICByZXR1cm4gbmV3IFJlZ0V4cChcbiAgICBTdHJpbmcucmF3YFxcYmZyb21cXHMrJHtzcGVjaWZpZXJ9fFxcYmltcG9ydFxccypcXChcXHMqJHtzcGVjaWZpZXJ9XFxzKlxcKXxcXGJyZXF1aXJlXFxzKlxcKFxccyoke3NwZWNpZmllcn1cXHMqXFwpYCxcbiAgICAndSdcbiAgKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hSZXBvSW5mbyhkaXJQYXRoOiBzdHJpbmcsIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgcmVtb3RlVXJsID0gZ2V0T3JpZ2luUmVtb3RlVXJsKGRpclBhdGgpO1xuICBpZiAocmVtb3RlVXJsKSB7XG4gICAgY29uc3QganNvbiA9IGF3YWl0IHJlcXVlc3RSZXBvSW5mbyhyZW1vdGVVcmwpO1xuICAgIGlmIChqc29uKSByZXR1cm4ganNvbjtcbiAgfVxuXG4gIGNvbnN0IHVybCA9IHR5cGVvZiBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5ID09PSAnc3RyaW5nJyA/IHBhY2thZ2VKc29uLnJlcG9zaXRvcnkgOiBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5Py51cmw7XG4gIGlmICh1cmwpIHtcbiAgICBjb25zdCBqc29uID0gYXdhaXQgcmVxdWVzdFJlcG9JbmZvKHVybCk7XG4gICAgaWYgKGpzb24gJiYganNvbi5tZXNzYWdlICE9PSAnTm90IEZvdW5kJykgcmV0dXJuIGpzb247XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVxdWVzdFJlcG9JbmZvKHVybE9yRnVsbE5hbWU6IHN0cmluZyk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgW29yZywgbmFtZV0gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUodXJsT3JGdWxsTmFtZSk7XG4gIGlmICghb3JnIHx8ICFuYW1lKSByZXR1cm47XG5cbiAgdHJ5IHtcbiAgICAvLyBNZXRhZGF0YSBwZXJtaXNzaW9uLiBUaGUgb3duZXIgTVVTVCBiZSBwYXNzZWQ6IGdldE9jdG9raXQoKSB3aXRob3V0IGl0IHByZWZlcnMgdGhlXG4gICAgLy8gV2lsbEJvb3N0ZXIgUEFULCB3aGljaCBjYW5ub3QgcmVhZCBwcml2YXRlIFdpbGxCb29zdGVyTGFiIHJlcG9zaXRvcmllcywgY29sbGFwc2luZyB0aGVpclxuICAgIC8vIHZpc2liaWxpdHkgdG8gdW5rbm93biAoYW5kIGUuZy4gc2tpcHBpbmcgdGhlIHdiZnkgY2FsbGVyIGdlbmVyYXRpb24gaW5kZWZpbml0ZWx5KS5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGdldE9jdG9raXQob3JnKS5yZXF1ZXN0KCdHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99Jywge1xuICAgICAgb3duZXI6IG9yZyxcbiAgICAgIHJlcG86IG5hbWUsXG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3BvbnNlLmRhdGE7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3QgcmVkaXJlY3RlZEZ1bGxOYW1lID0gZ2V0UmVkaXJlY3RlZFJlcG9GdWxsTmFtZShlcnJvcik7XG4gICAgaWYgKHJlZGlyZWN0ZWRGdWxsTmFtZSkge1xuICAgICAgLy8gUmUtZmV0Y2ggdW5kZXIgdGhlIHJlZGlyZWN0ZWQgaWRlbnRpdHkgc28gYSByZW5hbWVkIHJlcG9zaXRvcnkgc3RpbGwgZ2V0cyBjb21wbGV0ZVxuICAgICAgLy8gbWV0YWRhdGEgKHZpc2liaWxpdHkgaW5jbHVkZWQpIGluc3RlYWQgb2YgYSBiYXJlIGZ1bGxfbmFtZSB0aGF0IHdvdWxkIGxlYXZlXG4gICAgICAvLyBpc1JlcG9WaXNpYmlsaXR5S25vd24gZmFsc2Ugb24gZXZlcnkgc3Vic2VxdWVudCBydW4gd2l0aCB0aGUgc3RhbGUgcmVtb3RlIFVSTC5cbiAgICAgIGNvbnN0IFtyZWRpcmVjdGVkT3JnLCByZWRpcmVjdGVkTmFtZV0gPSByZWRpcmVjdGVkRnVsbE5hbWUuc3BsaXQoJy8nKTtcbiAgICAgIGlmIChyZWRpcmVjdGVkT3JnICYmIHJlZGlyZWN0ZWROYW1lKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBnZXRPY3Rva2l0KHJlZGlyZWN0ZWRPcmcpLnJlcXVlc3QoJ0dFVCAvcmVwb3Mve293bmVyfS97cmVwb30nLCB7XG4gICAgICAgICAgICBvd25lcjogcmVkaXJlY3RlZE9yZyxcbiAgICAgICAgICAgIHJlcG86IHJlZGlyZWN0ZWROYW1lLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiByZXNwb25zZS5kYXRhO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBGYWxsIGJhY2sgdG8gdGhlIGJhcmUgaWRlbnRpdHkgYmVsb3c6IHRoZSByZXBvc2l0b3J5IGlzIHN0aWxsIGNhbm9uaWNhbGl6ZWQsIG9ubHlcbiAgICAgICAgICAvLyBpdHMgdmlzaWJpbGl0eSBzdGF5cyB1bmtub3duLlxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4geyBmdWxsX25hbWU6IHJlZGlyZWN0ZWRGdWxsTmFtZSB9O1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRSZWRpcmVjdGVkUmVwb0Z1bGxOYW1lKGVycm9yOiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFlcnJvciB8fCB0eXBlb2YgZXJyb3IgIT09ICdvYmplY3QnKSByZXR1cm47XG5cbiAgY29uc3QgcmVzcG9uc2UgPVxuICAgICdyZXNwb25zZScgaW4gZXJyb3JcbiAgICAgID8gKGVycm9yIGFzIHsgcmVzcG9uc2U/OiB7IHN0YXR1cz86IG51bWJlcjsgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4gfSB9KS5yZXNwb25zZVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlPy5zdGF0dXMgPz8gKGVycm9yIGFzIHsgc3RhdHVzPzogbnVtYmVyIH0pLnN0YXR1cztcbiAgaWYgKHN0YXR1cyAhPT0gMzAxICYmIHN0YXR1cyAhPT0gMzAyKSByZXR1cm47XG5cbiAgY29uc3QgbG9jYXRpb24gPSByZXNwb25zZT8uaGVhZGVycz8ubG9jYXRpb247XG4gIGlmICh0eXBlb2YgbG9jYXRpb24gIT09ICdzdHJpbmcnKSByZXR1cm47XG5cbiAgY29uc3QgW29yZywgbmFtZV0gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUobG9jYXRpb24pO1xuICBpZiAoIW9yZyB8fCAhbmFtZSkgcmV0dXJuO1xuXG4gIHJldHVybiBgJHtvcmd9LyR7bmFtZX1gO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIGA8b3JnPi88bmFtZT5gIGZyb20gdGhlIGdpdCByZW1vdGUgKGZhbGxpbmcgYmFjayB0byBwYWNrYWdlLmpzb24ncyBgcmVwb3NpdG9yeWApIHdpdGhvdXRcbiAqIGNhbGxpbmcgdGhlIEdpdEh1YiBBUEkuIEl0IHdvcmtzIGZvciBldmVyeSB3b3Jrc3BhY2UgcGFja2FnZSwgbm90IGp1c3QgdGhlIHJvb3Qg4oCUIG9ubHkgdGhlIHJvb3RcbiAqIGZldGNoZXMgcmVwbyBpbmZvIOKAlCBhbmQgaXQga2VlcHMgd29ya2luZyBvZmZsaW5lIG9yIHJhdGUtbGltaXRlZCwgd2hlcmUgYW4gdW5kZWZpbmVkIGlkZW50aXR5XG4gKiB3b3VsZCBzaWxlbnRseSByZWNsYXNzaWZ5IHRoZSByZXBvc2l0b3J5IChlLmcuIG1ha2luZyB3YmZ5IHdyaXRlIHdpbGxib29zdGVyLWNvbmZpZ3MnIFJlbm92YXRlXG4gKiBwcmVzZXQgaW50byB0aGUgcHJlc2V0IGl0c2VsZiBhZ2FpbikuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVMb2NhbFJlcG9JZGVudGl0eShcbiAgZGlyUGF0aDogc3RyaW5nLFxuICBwYWNrYWdlSnNvbjogUGFja2FnZUpzb25cbik6IFByb21pc2U8W3N0cmluZyB8IHVuZGVmaW5lZCwgc3RyaW5nIHwgdW5kZWZpbmVkXT4ge1xuICBjb25zdCByZW1vdGVVcmwgPSBnZXRPcmlnaW5SZW1vdGVVcmwoZGlyUGF0aCk7XG4gIGlmIChyZW1vdGVVcmwpIHtcbiAgICBjb25zdCBpZGVudGl0eSA9IHJlYWRHaXRIdWJJZGVudGl0eShyZW1vdGVVcmwpO1xuICAgIGlmIChpZGVudGl0eSkgcmV0dXJuIGlkZW50aXR5O1xuICB9XG4gIGNvbnN0IHVybCA9IHR5cGVvZiBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5ID09PSAnc3RyaW5nJyA/IHBhY2thZ2VKc29uLnJlcG9zaXRvcnkgOiBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5Py51cmw7XG4gIGlmICh1cmwpIHtcbiAgICBjb25zdCBpZGVudGl0eSA9IHJlYWRHaXRIdWJJZGVudGl0eSh1cmwpO1xuICAgIGlmIChpZGVudGl0eSkgcmV0dXJuIGlkZW50aXR5O1xuICB9XG4gIHJldHVybiBbdW5kZWZpbmVkLCB1bmRlZmluZWRdO1xufVxuXG5mdW5jdGlvbiBnZXRPcmlnaW5SZW1vdGVVcmwoZGlyUGF0aDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHNwYXduU3luY0FuZFJldHVyblN0ZG91dCgnZ2l0JywgWydjb25maWcnLCAnLS1nZXQnLCAncmVtb3RlLm9yaWdpbi51cmwnXSwgZGlyUGF0aCkgfHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIGBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWVgIGlzIGhvc3QtYWdub3N0aWMsIHNvIGl0IGhhcHBpbHkgdHVybnMgYSBHaXRMYWIgVVJMIGludG8gYW4gYDxvcmc+LzxyZXBvPmAgcGFpci5cbiAqIEV2ZXJ5dGhpbmcgZG93bnN0cmVhbSB0cmVhdHMgdGhlIHJlc3VsdGluZyBpZGVudGl0eSBhcyBHaXRIdWIgKHRoZSBgZ2l0aHViOmAgcmVwb3NpdG9yeSBmaWVsZCBpcyByZXdyaXR0ZW5cbiAqIGludG8gcGFja2FnZS5qc29uKSwgc28gdGhlIGhvc3QgbXVzdCBiZSB2ZXJpZmllZCBmaXJzdDsgYSBub24tR2l0SHViIHJlbW90ZSB5aWVsZHMgbm8gaWRlbnRpdHksIGFzIGJlZm9yZS5cbiAqL1xuZnVuY3Rpb24gcmVhZEdpdEh1YklkZW50aXR5KHVybDogc3RyaW5nKTogW3N0cmluZywgc3RyaW5nXSB8IHVuZGVmaW5lZCB7XG4gIGlmICghdGFyZ2V0c0dpdEh1Yih1cmwpKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBbb3JnLCBuYW1lXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZSh1cmwpO1xuICByZXR1cm4gb3JnICYmIG5hbWUgPyBbY2Fub25pY2FsaXplT3duZXIob3JnKSwgbmFtZV0gOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgVVJMJ3MgSE9TVCBpcyBnaXRodWIuY29tLiBQYXJzZWQgcmF0aGVyIHRoYW4gc3Vic3RyaW5nLW1hdGNoZWQ6IGEgcGF0aCBzdWNoIGFzXG4gKiBgaHR0cHM6Ly9naXRsYWIuY29tL2dpdGh1Yi5jb20vb3duZXIvcmVwby5naXRgIHdvdWxkIG90aGVyd2lzZSBiZSB0YWtlbiBmb3IgR2l0SHViLCBhbmQgYW4gdXBwZXJjYXNlXG4gKiBgR0lUSFVCLkNPTWAgd291bGQgYmUgcmVqZWN0ZWQuIGBnaXRodWI6b3duZXIvcmVwb2AgaXMgbnBtJ3Mgc2hvcnRoYW5kIGFuZCBuYW1lcyBubyBob3N0LCBzbyBpdCBpc1xuICogcmVjb2duaXplZCBzZXBhcmF0ZWx5OyBub3JtYWxpemVSZXBvc2l0b3J5VXJsRm9yUGFja2FnZUpzb24gYWNjZXB0cyB0aGUgc2FtZSBzaG9ydGhhbmQuXG4gKi9cbmZ1bmN0aW9uIHRhcmdldHNHaXRIdWIodXJsOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKC9eZ2l0aHViOi9pdS50ZXN0KHVybCkpIHJldHVybiB0cnVlO1xuICAvLyBzY3Atc3R5bGUgcmVtb3RlcyAoYGdpdEBnaXRodWIuY29tOm93bmVyL3JlcG8uZ2l0YCkgYXJlIG5vdCB2YWxpZCBVUkxzLlxuICBjb25zdCBzY3BIb3N0ID0gL15bXi9AXSpAKFteOi9dKyk6L3UuZXhlYyh1cmwpPy5bMV07XG4gIGlmIChzY3BIb3N0KSByZXR1cm4gc2NwSG9zdC50b0xvd2VyQ2FzZSgpID09PSAnZ2l0aHViLmNvbSc7XG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBVUkwodXJsLnJlcGxhY2UoL15naXRcXCsvdSwgJycpKS5ob3N0bmFtZS50b0xvd2VyQ2FzZSgpID09PSAnZ2l0aHViLmNvbSc7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIEdpdEh1YiBvd25lciBuYW1lcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZSwgYW5kIGEgcmVtb3RlIG9yIG1hbmlmZXN0IFVSTCBtYXkgc3BlbGwgdGhlbSBhbnkgd2F5LCBidXQgdGhlIEFQSSdzXG4gKiBgZnVsbF9uYW1lYCBhbHdheXMgcmV0dXJuZWQgdGhlIGNhbm9uaWNhbCBzcGVsbGluZyDigJQgd2hpY2ggdGhlIG1hbnkgZXhhY3QgYD09PSAnV2lsbEJvb3N0ZXInYCBwb2xpY3kgY2hlY2tzXG4gKiAob3JnYW5pemF0aW9uIHdvcmtmbG93cywgYXV0aG9yIG1ldGFkYXRhLCB0aGUgV2lsbEJvb3N0ZXJMYWIgcHJlLXB1c2ggZ3VhcmQpIGRlcGVuZCBvbi4gQ2Fub25pY2FsaXplIGhlcmUgc29cbiAqIHRoZSBsb2NhbCBmYWxsYmFjayB5aWVsZHMgdGhlIHNhbWUgaWRlbnRpdHkgdGhlIEFQSSBkaWQsIGluc3RlYWQgb2Ygc2lsZW50bHkgc2tpcHBpbmcgdGhvc2UgcG9saWNpZXMuXG4gKi9cbmZ1bmN0aW9uIGNhbm9uaWNhbGl6ZU93bmVyKG93bmVyOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBjYW5vbmljYWxPd25lcnMgPSBbJ1dpbGxCb29zdGVyJywgJ1dpbGxCb29zdGVyTGFiJ107XG4gIHJldHVybiBjYW5vbmljYWxPd25lcnMuZmluZCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUudG9Mb3dlckNhc2UoKSA9PT0gb3duZXIudG9Mb3dlckNhc2UoKSkgPz8gb3duZXI7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBJU1NVRV9URU1QTEFURV9SVUxFUywgUFVMTF9SRVFVRVNUX0JPRFlfUlVMRVMsIFRFU1RfV1JJVElOR19SVUxFUyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliL3NyYyc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlc1dvcmtlclR5cGVzIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBoYXNDbG91ZGZsYXJlRGVwbG95V29ya2Zsb3csIGludm9rZXNXYkRlcGxveSB9IGZyb20gJy4vd29ya2Zsb3cuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucyhyb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLCBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghcm9vdENvbmZpZy5pc1Jvb3QpIHJldHVybjtcblxuICAgIGNvbnN0IGV4dHJhQ29udGVudCA9IGF3YWl0IHJlYWRBZ2VudHNFeHRyYUNvbnRlbnQocm9vdENvbmZpZy5kaXJQYXRoKTtcblxuICAgIGZvciAoY29uc3QgW2ZpbGVOYW1lLCB0b29sTmFtZV0gb2YgW1xuICAgICAgWydBR0VOVFMubWQnLCAnQ29kZXggQ0xJJ10sXG4gICAgICBbJ0NMQVVERS5tZCcsICdDbGF1ZGUgQ29kZSddLFxuICAgICAgWydHRU1JTkkubWQnLCAnR2VtaW5pIENMSSddLFxuICAgIF0gYXMgY29uc3QpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb24ocm9vdENvbmZpZywgYWxsQ29uZmlncywgdG9vbE5hbWUsIGV4dHJhQ29udGVudCk7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsIGZpbGVOYW1lKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb250ZW50KSk7XG4gICAgfVxuXG4gICAgY29uc3QgY3Vyc29yUnVsZXNQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5jdXJzb3IvcnVsZXMvZ2VuZXJhbC5tZGMnKTtcbiAgICBjb25zdCBjdXJzb3JSdWxlc0NvbnRlbnQgPSBnZW5lcmF0ZUN1cnNvckdlbmVyYWxNZGNDb250ZW50KHJvb3RDb25maWcsIGFsbENvbmZpZ3MsIGV4dHJhQ29udGVudCk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoY3Vyc29yUnVsZXNQYXRoLCBjdXJzb3JSdWxlc0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmNvbnN0IGFnZW50c0V4dHJhQ29udGVudENhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4oKTtcblxuLyoqXG4gKiBSZWFkcyB0aGUgcm9vdCdzIHVzZXItYXV0aG9yZWQgQUdFTlRTX0VYVFJBLm1kIG9uY2UgcGVyIHByb2Nlc3M6IHdiZnkgbmV2ZXIgcmV3cml0ZXMgdGhlIGZpbGUsXG4gKiBhbmQgYm90aCB0aGUgYWdlbnQtaW5zdHJ1Y3Rpb24gYW5kIEdlbWluaSBnZW5lcmF0b3JzIG5lZWQgaXRzIGNvbnRlbnQuIENhY2hpbmcgdGhlIHJlc29sdmVkXG4gKiB2YWx1ZSAobm90IHRoZSBQcm9taXNlKSBpcyByYWNlLWZyZWUgYmVjYXVzZSB0aGUgdHdvIGNhbGxlcnMgcnVuIHNlcXVlbnRpYWxseSBpbiBpbmRleC50cy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRBZ2VudHNFeHRyYUNvbnRlbnQocm9vdERpclBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGFnZW50c0V4dHJhUGF0aCA9IHBhdGgucmVzb2x2ZShyb290RGlyUGF0aCwgJ0FHRU5UU19FWFRSQS5tZCcpO1xuICBpZiAoIWFnZW50c0V4dHJhQ29udGVudENhY2hlLmhhcyhhZ2VudHNFeHRyYVBhdGgpKSB7XG4gICAgYWdlbnRzRXh0cmFDb250ZW50Q2FjaGUuc2V0KGFnZW50c0V4dHJhUGF0aCwgYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoYWdlbnRzRXh0cmFQYXRoKSk7XG4gIH1cbiAgcmV0dXJuIGFnZW50c0V4dHJhQ29udGVudENhY2hlLmdldChhZ2VudHNFeHRyYVBhdGgpO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUN1cnNvckdlbmVyYWxNZGNDb250ZW50KFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSxcbiAgZXh0cmFDb250ZW50Pzogc3RyaW5nXG4pOiBzdHJpbmcge1xuICBjb25zdCBmcm9udG1hdHRlciA9IGAtLS1cXG5kZXNjcmlwdGlvbjogR2VuZXJhbCBDb2RpbmcgUnVsZXNcXG5nbG9iczpcXG5hbHdheXNBcHBseTogdHJ1ZVxcbi0tLWA7XG4gIGNvbnN0IGJvZHkgPSBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb24oY29uZmlnLCBhbGxDb25maWdzLCAnQ3Vyc29yJywgZXh0cmFDb250ZW50KTtcbiAgcmV0dXJuIGAke2Zyb250bWF0dGVyfVxcblxcbiR7Ym9keX1gO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb24oXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSxcbiAgdG9vbE5hbWU6IHN0cmluZyxcbiAgZXh0cmFDb250ZW50Pzogc3RyaW5nXG4pOiBzdHJpbmcge1xuICBjb25zdCBwYWNrYWdlTWFuYWdlciA9ICdidW4nO1xuICBjb25zdCBkZXNjcmlwdGlvbiA9IHJvb3RDb25maWcucGFja2FnZUpzb24/LmRlc2NyaXB0aW9uO1xuICBjb25zdCBmbm94SW5zdHJ1Y3Rpb24gPSBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICdmbm94LnRvbWwnKSlcbiAgICA/IGBcXG4tIEVudmlyb25tZW50IHZhcmlhYmxlcyBhbmQgc2VjcmV0cyBsaXZlIGluIFxcYGZub3gudG9tbFxcYCAobWlzZSArIGZub3gpOyBuZXZlciBjcmVhdGUgXFxgLmVudlxcYCwgXFxgLmVudi4qXFxgLCBvciBcXGAuZGV2LnZhcnNcXGAgZmlsZXMuIFJ1biBjb21tYW5kcyB0aHJvdWdoIFxcYCR7cGFja2FnZU1hbmFnZXJ9IHdiIC4uLlxcYCBvciBcXGBmbm94IHJ1biAtUCA8cHJvZmlsZT4gLS0gPGNvbW1hbmQ+XFxgLiBQcm9maWxlIHNlY3JldHMgbG9hZCBvbmx5IHdoZW4gYSBwcm9maWxlIGlzIHNlbGVjdGVkOiBtb2RlLWF3YXJlIHdiIGNvbW1hbmRzIChlLmcuIFxcYHdiIHN0YXJ0XFxgLCBcXGB3YiB0ZXN0XFxgKSBhbmQgXFxgd2IgZG90ZW52XFxgIHNlbGVjdCBpdCB0aGVtc2VsdmVzIChcXGB3YiBkb3RlbnZcXGAgdXNlcyBcXGBXQl9FTlZcXGAsIGVsc2UgXFxgRk5PWF9QUk9GSUxFXFxgLCBlbHNlIFxcYE5PREVfRU5WXFxgLCBlbHNlIHRoZSBkZXZlbG9wbWVudCBwcm9maWxlOyBcXGBXQl9FTlZcXGAgYWNjZXB0cyBvbmx5IFxcYGRldmVsb3BtZW50XFxgL1xcYHRlc3RcXGAvXFxgc3RhZ2luZ1xcYC9cXGBwcm9kdWN0aW9uXFxgLCBzbyB1c2UgXFxgRk5PWF9QUk9GSUxFXFxgIGZvciBhbnkgb3RoZXIgcHJvZmlsZSksIHdoaWxlIGJhcmUgXFxgZm5veCBydW5cXGAgbmVlZHMgYW4gZXhwbGljaXQgXFxgLVAgPHByb2ZpbGU+XFxgLmBcbiAgICA6ICcnO1xuICAvLyBtaXNlIG93bnMgdGhlIHBpbm5lZCB0b29sIHZlcnNpb25zLCBzbyBhIHZlcnNpb24gbWlzbWF0Y2ggaXMgZml4ZWQgYnkgZWRpdGluZyBtaXNlLnRvbWwg4oCUIG5vdFxuICAvLyBieSBpbnN0YWxsaW5nIGEgZGlmZmVyZW50IHZlcnNpb24gZ2xvYmFsbHksIHdoaWNoIHRoZSBuZXh0IGBtaXNlIGluc3RhbGxgIHNpbGVudGx5IG92ZXJyaWRlcy5cbiAgY29uc3QgbWlzZUluc3RydWN0aW9uID0gZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnbWlzZS50b21sJykpXG4gICAgPyAnXFxuLSBUb29sIHZlcnNpb25zIChlLmcuLCBub2RlKSBhcmUgcGlubmVkIGluIGBtaXNlLnRvbWxgOyBydW4gYG1pc2UgaW5zdGFsbGAgYWZ0ZXIgY2hhbmdpbmcgaXQgYW5kIG5ldmVyIGluc3RhbGwgdGhvc2UgdG9vbHMgZ2xvYmFsbHkgaW5zdGVhZC4nXG4gICAgOiAnJztcbiAgLy8gSXNvbGF0ZWQgaW5zdGFsbHMgYXJlIHRoZSBvcmcgc3RhbmRhcmQgKHdiZnkgZ2VuZXJhdGVzIG5vIG90aGVyIGxpbmtlcikgYW5kIHRoZSBtb3N0XG4gIC8vIGFnZW50LWhvc3RpbGUgcGFydCBvZiB0aGUgc3RhY2s6IGEgcGFja2FnZSB0aGF0IGlzIG9ubHkgcmVhY2hhYmxlIGJlY2F1c2UgYSBkZXBlbmRlbmN5IGhvaXN0ZWRcbiAgLy8gaXQgbm8gbG9uZ2VyIHJlc29sdmVzLCBhbmQgdGhlIHJlZmxleCBmaXggKHN3aXRjaGluZyB0aGUgbGlua2VyIGJhY2spIHNpbGVudGx5IHJlaW50cm9kdWNlc1xuICAvLyB0aGUgcGhhbnRvbSBkZXBlbmRlbmNpZXMgdGhlIGxheW91dCBleGlzdHMgdG8gY2F0Y2guXG4gIGNvbnN0IGlzb2xhdGVkSW5zdGFsbEluc3RydWN0aW9uID0gYFxcbi0gXFxgYnVuZmlnLnRvbWxcXGAgdXNlcyBCdW4ncyBpc29sYXRlZCBsaW5rZXIsIHNvIG9ubHkgZGVjbGFyZWQgZGVwZW5kZW5jaWVzIHJlc29sdmUuIElmIGFuIGltcG9ydCBmYWlscyB0byByZXNvbHZlLCBkZWNsYXJlIHRoYXQgcGFja2FnZSBpbiB0aGUgXFxgcGFja2FnZS5qc29uXFxgIHRoYXQgaW1wb3J0cyBpdDsgbmV2ZXIgc3dpdGNoIFxcYGxpbmtlclxcYCB0byBcXGBob2lzdGVkXFxgIG9yIGFkZCB0byBcXGBwdWJsaWNIb2lzdFBhdHRlcm5cXGAgdG8gd29yayBhcm91bmQgaXQuYDtcbiAgLy8gRXZlcnkgY2xhdXNlIHN0YXRlcyBvbmx5IGEgdmVyaWZpZWQgZmFjdCwgcmV1c2luZyB0aGUgd29ya2Zsb3cgZ2VuZXJhdG9yJ3Mgb3duIGRldGVjdG9yczogdGhlXG4gIC8vIHdyYW5nbGVyLWNvbmZpZyBjbGF1c2UgbmVlZHMgYW4gYWN0dWFsIGNvbmZpZyBmaWxlIChpc0Nsb3VkZmxhcmUgYWxzbyBtYXRjaGVzIGEgbWVyZSB3cmFuZ2xlclxuICAvLyBtZW50aW9uIGluIGEgc2NyaXB0IG9yIHdvcmtmbG93KSwgdGhlIHdvcmtmbG93IGNsYXVzZSBuZWVkcyBhIGxpdmUgcmV1c2FibGUtZGVwbG95IGNhbGxlclxuICAvLyAoWUFNTC1wYXJzZWQgam9icy4qLnVzZXMsIG5vdCBhIHJhdy10ZXh0L2NvbW1lbnQgbWF0Y2gpLCBhbmQgdGhlIGB3YiBkZXBsb3lgIGNsYXVzZSBuZWVkcyBhXG4gIC8vIGRlcGxveSBzY3JpcHQgd2hvc2UgY29tbWFuZCB0b2tlbiBpcyBgd2Ig4oCmIGRlcGxveWAuXG4gIGNvbnN0IG93bnNXcmFuZ2xlckNvbmZpZyA9IGFsbENvbmZpZ3Muc29tZSgoY29uZmlnKSA9PiBjb25maWcuZG9lc0NvbnRhaW5XcmFuZ2xlckNvbmZpZyk7XG4gIC8vIE9ubHkgY2xhaW0gdGhlIGZpbGUgaXMgZ2VuZXJhdGVkIHdoZXJlIGl0IGFjdHVhbGx5IGlzOiBhIHBhY2thZ2UgdGhhdCBoYW5kLW1haW50YWlucyBpdHMgYEVudmAgKGUuZy4gdW5kZXJcbiAgLy8gYHR5cGVzOiBbXCJidW5cIl1gKSBpcyBkZWxpYmVyYXRlbHkgbGVmdCB1bm1hbmFnZWQsIGFuZCB0ZWxsaW5nIGFuIGFnZW50IHRvIHJ1biBgd2IgZ2VuLWNvZGVgIHRoZXJlIHdvdWxkIHNlbmRcbiAgLy8gaXQgYWZ0ZXIgYSBmaWxlIHRoYXQgbmV2ZXIgYXBwZWFycyDigJQgYW5kIGF3YXkgZnJvbSB0aGUgYEVudmAgaXQgc2hvdWxkIGJlIGVkaXRpbmcuXG4gIGNvbnN0IG93bnNHZW5lcmF0ZWRXb3JrZXJUeXBlcyA9IGFsbENvbmZpZ3Muc29tZSgoY29uZmlnKSA9PiBnZW5lcmF0ZXNXb3JrZXJUeXBlcyhjb25maWcpKTtcbiAgY29uc3QgaGFzRGVwbG95V29ya2Zsb3cgPSBoYXNDbG91ZGZsYXJlRGVwbG95V29ya2Zsb3cocGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5naXRodWIvd29ya2Zsb3dzJykpO1xuICBjb25zdCB1c2VzV2JEZXBsb3kgPSBhbGxDb25maWdzLnNvbWUoKGNvbmZpZykgPT4ge1xuICAgIGNvbnN0IGRlcGxveVNjcmlwdCA9IGNvbmZpZy5wYWNrYWdlSnNvbj8uc2NyaXB0cz8uWydkZXBsb3knXTtcbiAgICByZXR1cm4gKFxuICAgICAgdHlwZW9mIGRlcGxveVNjcmlwdCA9PT0gJ3N0cmluZycgJiZcbiAgICAgIGludm9rZXNXYkRlcGxveShkZXBsb3lTY3JpcHQsIG5ldyBTZXQoT2JqZWN0LmtleXMoY29uZmlnLnBhY2thZ2VKc29uPy5zY3JpcHRzID8/IHt9KSkpXG4gICAgKTtcbiAgfSk7XG4gIC8vIEluZGVwZW5kZW50IGZhY3RzIHN0YXkgc2VwYXJhdGUgc2VudGVuY2VzOiB0aGUgd29ya2Zsb3cncyBvd24gZGVwbG95IG1lY2hhbmlzbSBpcyBub3RcbiAgLy8gaW5zcGVjdGVkLCBzbyB0aGUgd2ItZGVwbG95IGNsYXVzZSBtdXN0IG5vdCBjbGFpbSB0aGUgd29ya2Zsb3cgaW52b2tlcyBpdC5cbiAgY29uc3QgY2xvdWRmbGFyZUluc3RydWN0aW9uID0gb3duc1dyYW5nbGVyQ29uZmlnXG4gICAgPyBgXFxuLSBUaGlzIHByb2plY3QgcnVucyBvbiBDbG91ZGZsYXJlIFdvcmtlcnM6IHRoZSB3cmFuZ2xlciBjb25maWd1cmF0aW9uIGZpbGUgaG9sZHMgdGhlIFdvcmtlcidzIGNvbmZpZ3VyYXRpb24sIGluY2x1ZGluZyBiaW5kaW5ncyBhbmQgcGVyLWVudmlyb25tZW50IG92ZXJyaWRlcy4ke2hhc0RlcGxveVdvcmtmbG93ID8gJyBUaGUgZGVwbG95IHdvcmtmbG93cyB1bmRlciBgLmdpdGh1Yi93b3JrZmxvd3NgIHBlcmZvcm0gZGVwbG95bWVudHMuJyA6ICcnfSR7dXNlc1diRGVwbG95ID8gJyBUaGUgYGRlcGxveWAgcGFja2FnZSBzY3JpcHQgcnVucyBgd2IgZGVwbG95YC4nIDogJyd9JHtvd25zR2VuZXJhdGVkV29ya2VyVHlwZXMgPyBgXFxuLSBcXGB3b3JrZXItY29uZmlndXJhdGlvbi5kLnRzXFxgIGlzIGdpdGlnbm9yZWQgYW5kIGdlbmVyYXRlZCBieSBcXGAke3BhY2thZ2VNYW5hZ2VyfSB3YiBnZW4tY29kZVxcYDsgYWZ0ZXIgY2hhbmdpbmcgYmluZGluZ3Mgb3IgdmFycyBpbiB0aGUgd3JhbmdsZXIgY29uZmlndXJhdGlvbiwgcmUtcnVuIGl0IGluc3RlYWQgb2YgZWRpdGluZyB0aGUgZmlsZSBieSBoYW5kLmAgOiAnJ31gXG4gICAgOiAnJztcbiAgLy8gV2lsbEJvb3N0ZXIgUmFpbHdheSBwcm9qZWN0IGlkZW50aWZpZXJzIGFyZSBtYW5hZ2VkIGluIGRlcGxveSB3b3JrZmxvdyBzZXR0aW5ncy5cbiAgY29uc3QgcmFpbHdheUluc3RydWN0aW9uID0gcm9vdENvbmZpZy5pc1JhaWx3YXlcbiAgICA/ICdcXG4tIFJhaWx3YXkgcHJvamVjdCBpbmZvcm1hdGlvbiBpcyBpbiB0aGUgZGVwbG95IHdvcmtmbG93cyB1bmRlciBgLmdpdGh1Yi93b3JrZmxvd3NgLidcbiAgICA6ICcnO1xuICBjb25zdCBwbGF5d3JpZ2h0VGVzdFNlcnZlckluc3RydWN0aW9uID0gaGFzUGxheXdyaWdodFRlc3RTZXJ2ZXIoYWxsQ29uZmlncylcbiAgICA/IGBcXG4tIFVzZSBcXGAke3BhY2thZ2VNYW5hZ2VyfSB3YiBzdGFydCAtLW1vZGUgdGVzdFxcYCB0byBsYXVuY2ggYSB3ZWIgc2VydmVyIGZvciBkZWJ1Z2dpbmcgb3IgdGVzdGluZy5gXG4gICAgOiAnJztcbiAgY29uc3QgY29BdXRob3JJbnN0cnVjdGlvbiA9IHJvb3RDb25maWcuaXNXaWxsQm9vc3RlclJlcG9cbiAgICA/IGBcXG4gIC0gRW5kIHlvdXIgY29tbWl0IG1lc3NhZ2Ugd2l0aCBhIGJsYW5rIGxpbmUgZm9sbG93ZWQgYnkgXFxgQ28tYXV0aG9yZWQtYnk6IFdpbGxCb29zdGVyICgke3Rvb2xOYW1lfSkgPGFnZW50QHdpbGxib29zdGVyLmNvbT5cXGAsIHRoZSBvbmx5IEFJIGF0dHJpYnV0aW9uIHRvIGFkZC5gXG4gICAgOiAnJztcbiAgLy8gS2V5ZWQgb24gdGhlIHJlcG9zaXRvcnkgY2xhc3NpZmljYXRpb24gcmF0aGVyIHRoYW4gb24gdGhlIHRlbXBsYXRlIGZpbGVzJyBwcmVzZW5jZTogdGhlIHNhbWVcbiAgLy8gcnVuIHdyaXRlcyB0aGUgdGVtcGxhdGVzIGZvciBXaWxsQm9vc3RlciAvIFdpbGxCb29zdGVyTGFiIHJlcG9zaXRvcmllcyBiZWZvcmUgdGhpcyBnZW5lcmF0b3JcbiAgLy8gcnVucywgYW5kIGhhbmQtYWRkZWQgdGVtcGxhdGVzIGVsc2V3aGVyZSBiZWxvbmcgdG8gQUdFTlRTX0VYVFJBLm1kLlxuICBjb25zdCBwclRlbXBsYXRlSW5zdHJ1Y3Rpb24gPSByb290Q29uZmlnLmlzV2lsbEJvb3N0ZXJSZXBvXG4gICAgPyBgXFxuJHtQVUxMX1JFUVVFU1RfQk9EWV9SVUxFUy5yZXBsYWNlQWxsKC9eL2dtLCAnICAnKX1gXG4gICAgOiAnJztcbiAgLy8gR2F0ZWQgbGlrZSBwclRlbXBsYXRlSW5zdHJ1Y3Rpb246IHRoZSBzZWN0aW9uIGl0IG5hbWVzIGV4aXN0cyBvbmx5IHdoZXJlIHRoZSB0ZW1wbGF0ZSBpcyBnZW5lcmF0ZWQuXG4gIGNvbnN0IHJlcXVpcmVtZW50c0V4ZW1wdGlvbiA9IHJvb3RDb25maWcuaXNXaWxsQm9vc3RlclJlcG9cbiAgICA/IFwiIG90aGVyIHRoYW4gdGhlIFBSIGJvZHkncyBSZXF1aXJlbWVudHMgc2VjdGlvbiAod2hpY2ggc3RhdGVzIHdoYXQgaXMgY3VycmVudGx5IGFza2VkIGZvciByYXRoZXIgdGhhbiB3aGF0IHRoZSBjb2RlIGNvbnRhaW5zKVwiXG4gICAgOiAnJztcbiAgY29uc3QgaXNzdWVUZW1wbGF0ZUluc3RydWN0aW9uID0gcm9vdENvbmZpZy5pc1dpbGxCb29zdGVyUmVwb1xuICAgID8gYFxcbi0gV2hlbiBjcmVhdGluZyBhbiBpc3N1ZTpcXG4ke0lTU1VFX1RFTVBMQVRFX1JVTEVTLnJlcGxhY2VBbGwoL14vZ20sICcgICcpfWBcbiAgICA6ICcnO1xuICBjb25zdCBsYW5ndWFnZUluc3RydWN0aW9uID1cbiAgICBnZXREZWZhdWx0UHJvc2VMYW5ndWFnZShyb290Q29uZmlnKSA9PT0gJ0phcGFuZXNlJ1xuICAgICAgPyAnXFxuLSBVbmxlc3MgaW5zdHJ1Y3RlZCBvdGhlcndpc2UsIHdyaXRlIGlzc3VlcywgUFJzLCByZXZpZXcgY29tbWVudHMsIGFuZCBkb2N1bWVudGF0aW9uIGZvciBwZW9wbGUgKFJFQURNRSwgYGRvY3MvYCkgaW4gSmFwYW5lc2UsIGFuZCBldmVyeSBvdGhlciBhcnRpZmFjdCAoaW5jbHVkaW5nIGNvZGUgY29tbWVudHMsIEpTRG9jLCBhbmQgYWdlbnQgaW5zdHJ1Y3Rpb25zKSBleGNlcHQgeW91ciBjb252ZXJzYXRpb25hbCByZXBsaWVzIGFuZCBwcm9kdWN0LWZhY2luZyB0ZXh0IGluIEVuZ2xpc2guJ1xuICAgICAgOiAnXFxuLSBVbmxlc3MgaW5zdHJ1Y3RlZCBvdGhlcndpc2UsIHdyaXRlIGV2ZXJ5IGFydGlmYWN0IGV4Y2VwdCB5b3VyIGNvbnZlcnNhdGlvbmFsIHJlcGxpZXMgYW5kIHByb2R1Y3QtZmFjaW5nIHRleHQgaW4gRW5nbGlzaC4nO1xuICBjb25zdCBydW5uZXJJbnN0cnVjdGlvbiA9IHJvb3RDb25maWcuaXNXaWxsQm9vc3RlclJlcG9cbiAgICA/ICdcXG4tIFByaXZhdGUgcmVwb3NpdG9yaWVzIHVzZSBzZWxmLWhvc3RlZCBDSSBydW5uZXJzLiBLZWVwIE9TL3NpemUgY29uc3RyYWludHMgaW4gYW4gZXhwbGljaXQgc2VsZi1ob3N0ZWQgbGFiZWwgYXJyYXk7IGZpeCBtaXNzaW5nIHJ1bm5lciBjYXBhYmlsaXRpZXMgaW5zdGVhZCBvZiBzd2l0Y2hpbmcgdG8gR2l0SHViLWhvc3RlZCBydW5uZXJzLiBUaGUgc29sZSBhcHByb3ZlZCBleGNlcHRpb24gaXMgdGhlIFdpbmRvd3MgZGVza3RvcCBidWlsZCBpbiBXaWxsQm9vc3Rlci9jaGVlcmxpbmdzLidcbiAgICA6ICcnO1xuICBjb25zdCBwcm9qZWN0TmFtZSA9IHJvb3RDb25maWcucGFja2FnZUpzb24/Lm5hbWUgfHwgcGF0aC5iYXNlbmFtZShwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoKSk7XG4gIGNvbnN0IGJhc2VDb250ZW50ID0gYFxuIyMgUHJvamVjdCBJbmZvcm1hdGlvblxuXG4tIE5hbWU6IFxcYCR7cHJvamVjdE5hbWV9XFxgJHtkZXNjcmlwdGlvbiA/IGBcXG4tIERlc2NyaXB0aW9uOiAke2Rlc2NyaXB0aW9ufWAgOiAnJ31cbi0gUGFja2FnZSBNYW5hZ2VyOiAke3BhY2thZ2VNYW5hZ2VyfVxuXG4jIyBHZW5lcmFsIEluc3RydWN0aW9uc1xuXG4tIElmIG9uIFxcYG1haW5cXGAsIGNyZWF0ZSBhIG5ldyBicmFuY2g7IG90aGVyd2lzZSB3b3JrIG9uIHRoZSBjdXJyZW50IGJyYW5jaC5cbi0gUnVuIFxcYGdpdFxcYCBjb21tYW5kcyBvbmUgYXQgYSB0aW1lIHRvIGF2b2lkIFxcYGluZGV4LmxvY2tcXGAgY29uZmxpY3RzLiR7bGFuZ3VhZ2VJbnN0cnVjdGlvbn1cbiR7VEVTVF9XUklUSU5HX1JVTEVTfVxuLSBXaGVuIGZpeGluZyBpc3N1ZXMgKGluY2x1ZGluZyB0ZXN0IGZhaWx1cmVzKSwgaW52ZXN0aWdhdGUgdGhlIHJvb3QgY2F1c2UgZmlyc3QgKGUuZy4sIHZpYSBkZWJ1ZyBsb2dzIG9yIHNjcmVlbnNob3RzKSBhbmQgZml4IGl0IGluc3RlYWQgb2YgYXBwbHlpbmcgd29ya2Fyb3VuZHMuXG4tIEFmdGVyIG1ha2luZyBjaGFuZ2VzLCBhcyBhIHJ1bGUsIHJ1biBvbmx5IHdoYXQgaXMgbmVjZXNzYXJ5IGZvciB0aGUgY2hhbmdlIGxvY2FsbHksIFxcYCR7cGFja2FnZU1hbmFnZXJ9IHJ1biB2ZXJpZnlcXGAgKHR5cGUgY2hlY2tpbmcgYW5kIGxpbnRpbmc7IHVwIHRvIDEwIG1pbnV0ZXMpIGFuZCB0aGUgcmVsZXZhbnQgdGVzdHMsIGFuZCBsZWF2ZSB0aGUgZnVsbCB0ZXN0IHN1aXRlIChcXGAke3BhY2thZ2VNYW5hZ2VyfSBydW4gdmVyaWZ5LWZ1bGxcXGA7IHVwIHRvIDEgaG91cikgdG8gdGhlIFBSJ3MgQ0kuIElmIFBSIENJIGRvZXMgbm90IHJ1biB0aGUgZnVsbCBzdWl0ZSwgcnVuIGl0IGxvY2FsbHkuIEZpeCBlcnJvcnMsIGluY2x1ZGluZyBDSSBmYWlsdXJlcywgYW5kIHJlLXJ1biB1bnRpbCB0aGV5IHBhc3MuXG4gIC0gUnVuIHJlbGV2YW50IHRlc3RzIHdpdGggXFxgJHtwYWNrYWdlTWFuYWdlcn0gd2IgdGVzdCB0ZXN0L3VuaXQvZXhhbXBsZS50ZXN0LnRzIC0tZ3JlcCAnY2FzZSBuYW1lJ1xcYCAob21pdCBcXGAtLWdyZXBcXGAgZm9yIHRoZSB3aG9sZSBmaWxlOyB1c2UgXFxgLXcgcGFja2FnZXMvZXhhbXBsZVxcYCBpbiBhIG1vbm9yZXBvKS4gXFxgJHtwYWNrYWdlTWFuYWdlcn0gd2IgdmVyaWZ5IC0tZnVsbCA8dGVzdC1wYXRoPiAtLWdyZXAgJ2Nhc2UgbmFtZSdcXGAgY29tYmluZXMgdmVyaWZpY2F0aW9uIHdpdGggc2VsZWN0ZWQgdGVzdHMuXG4gIC0gV2FpdCBmb3IgaXQgdG8gZmluaXNoIHdpdGhvdXQgcmVzdGFydGluZyBpdDogcHJlZmVyIGNvbXBsZXRpb24gbm90aWZpY2F0aW9ucywgb3RoZXJ3aXNlIHRoZSBsb25nZXN0IHBlcm1pdHRlZCB3YWl0OyBubyBvdXRwdXQgZG9lcyBub3QgbWVhbiBpdCBoYXMgc3RvcHBlZC4gSWYgdGhlIGRpc3BsYXllZCBleGNlcnB0IGlzIGluc3VmZmljaWVudCwgcmVhZCB0aGUgaW5kaWNhdGVkIGxvZyBmaWxlIGJlZm9yZSByZXJ1bm5pbmcuIElmIHRoZSBlbnZpcm9ubWVudCBraWxscyBsb25nLXJ1bm5pbmcgY29tbWFuZHMsIHJ1biB0aGVtIGRldGFjaGVkIHdpdGggYSBzYXZlZCBsb2cgYW5kIGV4aXQgc3RhdHVzLlxuLSBPbmNlIHZlcmlmaWVkLCBjb21taXQgYW5kIHB1c2ggdG8gdGhlIGN1cnJlbnQgKG5vbi1tYWluKSBicmFuY2gsIGFuZCBjcmVhdGUgYSBQUiB2aWEgXFxgZ2hcXGAgaWYgbm9uZSBleGlzdHMgZm9yIHRoZSBicmFuY2guXG4gIC0gRm9sbG93IHRoZSBDb252ZW50aW9uYWwgQ29tbWl0cyBmb3JtYXQgKGUuZy4sIFxcYGZlYXQ6XFxgLCBcXGBmaXg6XFxgKS4ke2NvQXV0aG9ySW5zdHJ1Y3Rpb259XG4gIC0gQWx3YXlzIGNyZWF0ZSBuZXcgY29tbWl0czsgYXZvaWQgXFxgLS1hbWVuZFxcYC4ke3ByVGVtcGxhdGVJbnN0cnVjdGlvbn0ke2lzc3VlVGVtcGxhdGVJbnN0cnVjdGlvbn1cbi0gSW4gYW55IGV4cGxhbmF0b3J5IHRleHQgKGNvbW1pdCBtZXNzYWdlcywgUFIgZGVzY3JpcHRpb25zLCBkb2N1bWVudGF0aW9uLCBjb2RlIGNvbW1lbnRzLCBldGMuKSR7cmVxdWlyZW1lbnRzRXhlbXB0aW9ufSwgZGVzY3JpYmUgb25seSB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbjogZHJvcCBhbnkgc3RhdGVtZW50IG5hbWluZyBhbiBpZGVudGlmaWVyLCBmZWF0dXJlLCBvciBjb25jZXB0IHlvdSBjYW5ub3QgY29uZmlybSBleGlzdHMgaW4gdGhlIGZpbmFsIGRpZmYgb3IgdGhlIGN1cnJlbnQgY29kZWJhc2UgKGUuZy4sIG9uZSBhZGRlZCBhbmQgbGF0ZXIgcmVtb3ZlZCBvciByZW5hbWVkIGFsb25nIHRoZSB3YXkpLiBXaGVuZXZlciBkb2N1bWVudGF0aW9uIG9yIGNvbW1lbnRzIG5vIGxvbmdlciBtYXRjaCB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiAocmVtb3ZlZCBvcHRpb25zLCBkZXByZWNhdGVkIHVzYWdlLCBvdXRkYXRlZCBiZWhhdmlvciksIGRlbGV0ZSBvciByZXdyaXRlIHRoZW0sIGV2ZW4gaW4gZmlsZXMgeW91IGFyZSBub3Qgb3RoZXJ3aXNlIGNoYW5naW5nLiBNZW50aW9uIGEgcGFzdCBzdGF0ZSBvbmx5IHdoZXJlIGl0IGlzIG5lZWRlZCB0byB1bmRlcnN0YW5kIHdoeSB0aGUgY3VycmVudCBkZXNpZ24gaXMgYXMgaXQgaXMsIG9yIHdoZW4gZXhwbGljaXRseSBhc2tlZDsgZmlsZXMgdGhhdCByZWNvcmQgaGlzdG9yeSBieSBkZXNpZ24gKGUuZy4sIGEgY2hhbmdlbG9nKSBhcmUgZXhlbXB0LlxuLSBVc2UgaGVyZWRvYyBmb3IgbXVsdGktbGluZSBjb21tYW5kIGlucHV0IChlLmcuLCBcXGBnaXQgY29tbWl0IC1GIC1cXGAsIFxcYGdoIHByIGNyZWF0ZSAtLWJvZHktZmlsZSAtXFxgLCBcXGBnaCBpc3N1ZSBjcmVhdGUgLS1ib2R5LWZpbGUgLVxcYCkuXG4tIFB1dCB0ZW1wb3JhcnkgZmlsZXMgaW4gXFxgLnRtcFxcYDsgdXNlIFxcYC90bXBcXGAgb25seSBmb3IgZmlsZXMgdGhhdCBtdXN0IGxpdmUgb3V0c2lkZSB0aGUgcmVwby5cbi0gXFxgQUdFTlRTLm1kXFxgLCBcXGBDTEFVREUubWRcXGAsIFxcYEdFTUlOSS5tZFxcYCwgXFxgLmN1cnNvci9ydWxlcy9nZW5lcmFsLm1kY1xcYCwgYW5kIFxcYC5nZW1pbmkvc3R5bGVndWlkZS5tZFxcYCBhcmUgZ2VuZXJhdGVkIGZyb20gXFxgQUdFTlRTX0VYVFJBLm1kXFxgIGFuZCBvdmVyd3JpdHRlbiBvbiBldmVyeSBcXGB3YmZ5XFxgIHJ1bjsgdG8gY2hhbmdlIGFnZW50IGluc3RydWN0aW9ucywgZWRpdCBvbmx5IFxcYEFHRU5UU19FWFRSQS5tZFxcYC4ke21pc2VJbnN0cnVjdGlvbn0ke2lzb2xhdGVkSW5zdGFsbEluc3RydWN0aW9ufSR7Zm5veEluc3RydWN0aW9ufSR7Y2xvdWRmbGFyZUluc3RydWN0aW9ufSR7cmFpbHdheUluc3RydWN0aW9ufSR7cGxheXdyaWdodFRlc3RTZXJ2ZXJJbnN0cnVjdGlvbn0ke3J1bm5lckluc3RydWN0aW9ufVxuXG4ke2dlbmVyYXRlQWdlbnRDb2RpbmdTdHlsZShyb290Q29uZmlnLCBhbGxDb25maWdzKX1cbmBcbiAgICAucmVwbGFjZUFsbCgvXFwuXFxuXFxuKy0vZywgJy5cXG4tJylcbiAgICAucmVwbGFjZUFsbCgvXFxuezMsfS9nLCAnXFxuXFxuJylcbiAgICAudHJpbSgpO1xuXG4gIGNvbnN0IGhhc05ld1NlY3Rpb24gPSBleHRyYUNvbnRlbnQ/LnRyaW0oKS5zdGFydHNXaXRoKCcjJyk7XG4gIGNvbnN0IG5vcm1hbGl6ZWRFeHRyYUNvbnRlbnQgPSBleHRyYUNvbnRlbnRcbiAgICA/IGhhc05ld1NlY3Rpb25cbiAgICAgID8gJ1xcblxcbicgKyBleHRyYUNvbnRlbnQudHJpbSgpXG4gICAgICA6ICdcXG4nICsgZXh0cmFDb250ZW50XG4gICAgOiAnJztcbiAgcmV0dXJuIGJhc2VDb250ZW50ICsgbm9ybWFsaXplZEV4dHJhQ29udGVudDtcbn1cblxuLyoqXG4gKiBUaGUgbGFuZ3VhZ2UgaXNzdWVzLCBQUnMsIHJldmlldyBjb21tZW50cywgYW5kIGRvY3VtZW50YXRpb24gZGVmYXVsdCB0bzogSmFwYW5lc2Ugb25seSBpbiBhXG4gKiBXaWxsQm9vc3RlciAvIFdpbGxCb29zdGVyTGFiIHJlcG9zaXRvcnkgY29uZmlybWVkIHByaXZhdGUuIEFuIHVua25vd24gdmlzaWJpbGl0eSAob2ZmbGluZSBydW4sXG4gKiBmYWlsZWQgbG9va3VwKSB5aWVsZHMgRW5nbGlzaCBzbyB0aGF0IGEgSmFwYW5lc2UgZGVmYXVsdCBpcyBuZXZlciB3cml0dGVuIGludG8gYSBwdWJsaWMgcmVwb3NpdG9yeS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERlZmF1bHRQcm9zZUxhbmd1YWdlKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiAnRW5nbGlzaCcgfCAnSmFwYW5lc2UnIHtcbiAgcmV0dXJuIHJvb3RDb25maWcuaXNXaWxsQm9vc3RlclJlcG8gJiYgcm9vdENvbmZpZy5pc1JlcG9WaXNpYmlsaXR5S25vd24gJiYgIXJvb3RDb25maWcuaXNQdWJsaWNSZXBvXG4gICAgPyAnSmFwYW5lc2UnXG4gICAgOiAnRW5nbGlzaCc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUFnZW50Q29kaW5nU3R5bGUocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZywgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogc3RyaW5nIHtcbiAgLy8gVGF1cmkgZGVza3RvcCBhcHBzIHNoaXAgV2luZG93cyBidWlsZHMsIGFuZCB0aGUgYm91bmRhcnkgYmV0d2VlbiBhcHAgY29kZSBhbmQgc2hhcmVkIGNvZGUgaXNcbiAgLy8gdG9vIGZ1enp5IHRvIHNjb3BlIHRoZSBtYWNPUy9MaW51eC1vbmx5IHJ1bGUgcGVyIHBhY2thZ2UsIHNvIHN1Y2ggcmVwb3NpdG9yaWVzIHRhcmdldCBhbGxcbiAgLy8gdGhyZWUgT1NlcyBpbnN0ZWFkLlxuICBjb25zdCBoYXNEZXNrdG9wQXBwID0gYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRlcGVuZGluZy50YXVyaSB8fCBjLmRvZXNDb250YWluVGF1cmlDb25maWdJblBhY2thZ2VzKTtcbiAgLy8gQSBwdWJsaWMgcmVwb3NpdG9yeSB3aXRoIG5vIGBAd2lsbGJvb3N0ZXIvYCBwYWNrYWdlIGlzIE9TUyBmb3IgdGhlIGdlbmVyYWwgcHVibGljLCB3aG9zZSB1c2Vyc1xuICAvLyBtYXkgcnVuIFdpbmRvd3MsIHNvIG5vIE9TIHJlc3RyaWN0aW9uIGFwcGxpZXMgdGhlcmUuIEFuIHVua25vd24gdmlzaWJpbGl0eSBjb2xsYXBzZXMgdG9cbiAgLy8gaXNQdWJsaWNSZXBvPWZhbHNlIGFuZCB0aGVyZWZvcmUga2VlcHMgdGhlIHJlc3RyaWN0aXZlIGRlZmF1bHQuXG4gIGNvbnN0IGlzR2VuZXJhbFB1YmxpY09zcyA9XG4gICAgcm9vdENvbmZpZy5pc1B1YmxpY1JlcG8gJiYgYWxsQ29uZmlncy5ldmVyeSgoYykgPT4gIWMucGFja2FnZUpzb24/Lm5hbWU/LnN0YXJ0c1dpdGgoJ0B3aWxsYm9vc3Rlci8nKSk7XG4gIC8vIE9ubHkgcHVibGljIHJlcG9zaXRvcmllcyBwdWJsaXNoIHBhY2thZ2VzIHRvIHRoZSBwdWJsaWMgbnBtIHJlZ2lzdHJ5LCB3aG9zZSB1c2VycyByZWFkIHRoZVxuICAvLyBKU0RvYyB3aXRob3V0IHRoZSBzb3VyY2U7IHByaXZhdGUgcmVwb3NpdG9yaWVzIGFyZSByZWFkIG9ubHkgYnkgYWdlbnRzIHRoYXQgaGF2ZSB0aGUgc291cmNlLlxuICBjb25zdCBucG1BcGlFeGNlcHRpb24gPSByb290Q29uZmlnLmlzUHVibGljUmVwb1xuICAgID8gJyBFeGNlcHRpb246IHRoZSBleHBvcnRlZCBBUEkgb2YgYSBwYWNrYWdlIHB1Ymxpc2hlZCB0byBucG0gbWF5IGNhcnJ5IEpTRG9jIGRlc2NyaWJpbmcgd2hhdCBpdCBkb2VzIGFuZCBob3cgdG8gY2FsbCBpdCwgYmVjYXVzZSBpdHMgdXNlcnMgcmVhZCBpdCB3aXRob3V0IHRoZSBzb3VyY2UuJ1xuICAgIDogJyc7XG4gIGNvbnN0IGNvbW1lbnRJbnN0cnVjdGlvbiA9IGAtIENvbW1lbnRzIGFuZCBKU0RvYzogZXZlcnkgcmVhZGVyIGhhcyB0aGUgc291cmNlLCBzbyBuZXZlciByZXN0YXRlIHdoYXQgdGhlIGNvZGUsIGl0cyBuYW1lcywgb3IgaXRzIHR5cGVzIGFscmVhZHkgc2F5IChlLmcuLCBcXGBAcGFyYW0gbmFtZSBUaGUgbmFtZVxcYCkuIFdyaXRlIG9uZSBvbmx5IHdoZW4gYSBwbGF1c2libGUgZWRpdCB3b3VsZCBicmVhayBzb21ldGhpbmcgd2l0aG91dCB0aGF0IGtub3dsZWRnZSBhbmQgbm8gdHlwZSBjaGVjaywgbGludCBydWxlLCBvciB0ZXN0IHdvdWxkIGNhdGNoIGl0OyBmaXJzdCBlbmNvZGUgdGhlIGtub3dsZWRnZSBpbiBjb2RlIChhIG5hbWUsIGEgdHlwZSwgYW4gXFxgYXNzZXJ0XFxgLCBhIHRlc3QpIGFuZCBjb21tZW50IG9ubHkgd2hhdCBjYW5ub3QgYmUgZW5jb2RlZDogYW4gb2RkLWxvb2tpbmcgd29ya2Fyb3VuZCwgYSBkZXBlbmRlbmN5IG9uIGEgZmFjdCBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LCBvciBhIHJlamVjdGVkIGFsdGVybmF0aXZlIGFuZCB3aHkuIFB1dCBhIGNvbnRyYWN0IG9mIHRoZSBkZWNsYXJlZCBzeW1ib2wgaW4gSlNEb2MgYW5kIGxpbmUtc3BlY2lmaWMga25vd2xlZGdlIGluIGFuIGlubGluZSBjb21tZW50LiBEZWxldGUgY29tbWVudHMgdGhhdCBmYWlsIHRoaXMgdGVzdCBpbiBmaWxlcyB5b3UgdG91Y2guJHtucG1BcGlFeGNlcHRpb259YDtcbiAgY29uc3Qgb3NDb21wYXRpYmlsaXR5SW5zdHJ1Y3Rpb24gPSBpc0dlbmVyYWxQdWJsaWNPc3NcbiAgICA/ICcnXG4gICAgOiBoYXNEZXNrdG9wQXBwXG4gICAgICA/ICctIEVuc3VyZSBjb21wYXRpYmlsaXR5IHdpdGggV2luZG93cywgbWFjT1MsIGFuZCBMaW51eC4nXG4gICAgICA6ICctIEVuc3VyZSBjb21wYXRpYmlsaXR5IG9ubHkgd2l0aCBtYWNPUyBhbmQgTGludXg7IGRvIG5vdCBpbmNsdWRlIFdpbmRvd3Mtc3BlY2lmaWMgY29kZS4nO1xuICAvLyBDbG91ZGZsYXJlIFdvcmtlcnMgZXhlY3V0ZSBhY3Jvc3MgbWFueSBlcGhlbWVyYWwgaXNvbGF0ZXMgYW5kIHR3byByZXF1ZXN0cyBhcmUgbm90IGd1YXJhbnRlZWRcbiAgLy8gdG8gaGl0IHRoZSBzYW1lIGluc3RhbmNlLCBzbyB0aGUgc2luZ2xlLWluc3RhbmNlIHNpbXBsaWZpY2F0aW9uIHNpbGVudGx5IGxvc2VzIHN0YXRlIHRoZXJlIOKAlFxuICAvLyBidXQgV29ya2VycyBkZWxpYmVyYXRlbHkgcmV1c2UgZXhlY3V0aW9uIGNvbnRleHRzLCBzbyBiZXN0LWVmZm9ydCBpc29sYXRlLWxvY2FsIGNhY2hlcyBzdGF5XG4gIC8vIGxlZ2l0aW1hdGUgKGh0dHBzOi8vZGV2ZWxvcGVycy5jbG91ZGZsYXJlLmNvbS93b3JrZXJzL3JlZmVyZW5jZS9ob3ctd29ya2Vycy13b3Jrcy8pLiBUaGVcbiAgLy8gc2lnbmFscyBhcmUgY29ycmVsYXRlZCBQRVIgUEFDS0FHRTogYSBtb25vcmVwbyBjYW4gaG9zdCBhIHNpbmdsZS1pbnN0YW5jZSBzZXJ2ZXIgYXBwIG5leHQgdG9cbiAgLy8gYW4gdW5yZWxhdGVkIFdvcmtlciwgYW5kIG5laXRoZXIgbWF5IG92ZXJyaWRlIHRoZSBvdGhlcidzIHJ1bGUuIGRvZXNDb250YWluV3JhbmdsZXJDb25maWcgaXNcbiAgLy8gdGhlIGFjY3VyYXRlIFdvcmtlcnMgc2lnbmFsIChpc0Nsb3VkZmxhcmUgYWxzbyBtYXRjaGVzIGEgbWVyZSB3cmFuZ2xlciBtZW50aW9uIGluIGEgc2NyaXB0IG9yXG4gIC8vIHdvcmtmbG93KS5cbiAgY29uc3QgaGFzV29ya2Vyc0FwcCA9IGFsbENvbmZpZ3Muc29tZSgoYykgPT4gYy5kb2VzQ29udGFpbldyYW5nbGVyQ29uZmlnKTtcbiAgY29uc3QgaGFzU2luZ2xlSW5zdGFuY2VTZXJ2ZXJBcHAgPSBhbGxDb25maWdzLnNvbWUoXG4gICAgKGMpID0+IChjLmRlcGVuZGluZy5uZXh0IHx8IGMuZGVwZW5kaW5nLnZpbmV4dCkgJiYgIWMuZG9lc0NvbnRhaW5XcmFuZ2xlckNvbmZpZ1xuICApO1xuICBjb25zdCB3b3JrZXJzSW5zdHJ1Y3Rpb24gPVxuICAgICctIENsb3VkZmxhcmUgV29ya2VycyBydW4gYWNyb3NzIG1hbnkgZXBoZW1lcmFsIGlzb2xhdGVzLCBzbyB0d28gcmVxdWVzdHMgbWF5IGhpdCBkaWZmZXJlbnQgaW5zdGFuY2VzOiBuZXZlciBsZXQgY29ycmVjdG5lc3MgZGVwZW5kIG9uIG1vZHVsZS1sZXZlbCBtdXRhYmxlIHN0YXRlOyBwZXJzaXN0IGF1dGhvcml0YXRpdmUgc2hhcmVkIHN0YXRlIGluIGJpbmRpbmdzIChEMSwgS1YsIFIyLCBEdXJhYmxlIE9iamVjdHMpLiBCZXN0LWVmZm9ydCBpc29sYXRlLWxvY2FsIGNhY2hlcyBvZiBub24tcmVxdWVzdC1zY29wZWQgZGF0YSBhcmUgZmluZS4nO1xuICBjb25zdCBzZXJ2ZXJJbnN0YW5jZUluc3RydWN0aW9uID0gaGFzV29ya2Vyc0FwcFxuICAgID8gaGFzU2luZ2xlSW5zdGFuY2VTZXJ2ZXJBcHBcbiAgICAgID8gYCR7d29ya2Vyc0luc3RydWN0aW9ufSBUaGlzIGFwcGxpZXMgdG8gYWxsIGNvZGUgcnVubmluZyBvbiBDbG91ZGZsYXJlIFdvcmtlcnMgKHRoZSB3cmFuZ2xlci1jb25maWd1cmVkIHBhY2thZ2VzIGFuZCBhbnkgd29ya3NwYWNlIHBhY2thZ2UgdGhleSBpbXBvcnQpOyBhc3N1bWUgYSBzaW5nbGUgc2VydmVyIGluc3RhbmNlIGZvciB0aGUgb3RoZXIgc2VydmVyIGFwcHMuYFxuICAgICAgOiB3b3JrZXJzSW5zdHJ1Y3Rpb25cbiAgICA6IGhhc1NpbmdsZUluc3RhbmNlU2VydmVyQXBwXG4gICAgICA/ICctIEFzc3VtZSBhIHNpbmdsZSBzZXJ2ZXIgaW5zdGFuY2UuJ1xuICAgICAgOiAnJztcbiAgLy8gS2VlcCB0b3AtZG93biBvcmRlcmluZyBndWlkYW5jZSBmdW5jdGlvbi1vbmx5IGJlY2F1c2UgY2xhc3NlcyBhcmUgbm90IGhvaXN0ZWQgYW5kIGNhbiBmYWlsIHdoZW4gaW5oZXJpdGFuY2Ugb3IgdG9wLWxldmVsIGluc3RhbnRpYXRpb24gZGVwZW5kcyBvbiBkZWNsYXJhdGlvbiBvcmRlci5cbiAgcmV0dXJuIGBcbiMjIENvZGluZyBTdHlsZVxuXG4tIFVzZSBjYW1lbENhc2UgZmlsZSBuYW1lcyBmb3IgSmF2YVNjcmlwdC9UeXBlU2NyaXB0IChQYXNjYWxDYXNlIGZvciBSZWFjdCBjb21wb25lbnRzKS5cbi0gU2ltcGxpZnkgY29kZSBhcyBtdWNoIGFzIHBvc3NpYmxlIHRvIGVsaW1pbmF0ZSByZWR1bmRhbmN5LlxuLSBEZXNpZ24gbW9kdWxlcyBhbmQgZGlyZWN0b3JpZXMgd2l0aCBoaWdoIGNvaGVzaW9uIGFuZCBsb3cgY291cGxpbmc7IHNwbGl0IGxhcmdlIG1vZHVsZXMgd2hlbiBuZWVkZWQuXG4tIFBsYWNlIGNhbGxpbmcgZnVuY3Rpb25zIGFib3ZlIHRoZSBmdW5jdGlvbnMgdGhleSBjYWxsICh0b3AtZG93biBvcmRlcik7IHBsYWNlIHZhcmlhYmxlIGFuZCB0eXBlIGRlY2xhcmF0aW9ucyBhYm92ZSB0aGVpciB1c2FnZS5cbiR7Y29tbWVudEluc3RydWN0aW9ufVxuLSBOZXZlciBleHBsYWluIGhvdyBXaWxsQm9vc3RlcidzIGluLWhvdXNlIHRvb2xzIChlLmcuLCBcXGB3YlxcYCwgXFxgd2JmeVxcYCkgd29yayBpbiBjb2RlIGNvbW1lbnRzIG9yIGRvY3VtZW50cyBvdXRzaWRlIHRoZSB0b29sJ3Mgb3duIHBhY2thZ2UsIGV4Y2VwdCBpbiBpbnN0cnVjdGlvbnMgZm9yIEFJIGFnZW50cyAoZS5nLiwgZG8gbm90IG5vdGUgdGhhdCBcXGBQT1JUXFxgIGlzIHVuc2V0IGJlY2F1c2UgXFxgd2JcXGAgcGlja3MgYSBmcmVlIHBvcnQpLlxuLSBJZiBsaW50IGVycm9ycyBvciB3YXJuaW5ncyBjYW5ub3QgYmUgZml4ZWQsIHVzZSBpZ25vcmUgY29tbWVudHMgd2l0aCByZWFzb25zIChlLmcuLCBcXGAvLyBveGxpbnQtZGlzYWJsZS1uZXh0LWxpbmUgPHJ1bGU+IC0tIDxyZWFzb24+XFxgKS5cbi0gUHJlZmVyIFxcYHVuZGVmaW5lZFxcYCBvdmVyIFxcYG51bGxcXGAgdW5sZXNzIHJlcXVpcmVkIGJ5IEFQSXMgb3IgbGlicmFyaWVzLlxuLSBWYWxpZGF0ZSBKYXZhU2NyaXB0IG9iamVjdHMgKGUuZy4sIHBhcnNlZCBKU09OLCBBUEkgcmVzcG9uc2VzKSB3aXRoIFxcYHpvZFxcYCB3aGVuZXZlciBwb3NzaWJsZSBpbnN0ZWFkIG9mIGhhbmQtd3JpdHRlbiBjaGVja3Mgb3IgdHlwZSBhc3NlcnRpb25zLlxuLSBCdWlsZCBwcm9tcHRzIGFzIGEgc2luZ2xlIHRlbXBsYXRlIGxpdGVyYWwgaW5zdGVhZCBvZiBcXGBqb2luKClcXGAgb24gYSBwcmUtY29tcHV0YWJsZSBhcnJheSBvZiBzdHJpbmdzLlxuLSBBc3N1bWUgYWxsIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgZGVmaW5lZDsgaWYgdmFsaWRhdGlvbiBpcyBuZWVkZWQsIFxcYGFzc2VydFxcYCB0aGVtIGF0IHN0YXJ0dXAgdG8gZmFpbCBmYXN0LlxuLSBBc3N1bWUgbG9jYWwgdG9vbHMgc3VjaCBhcyBcXGBnaXRcXGAsIFxcYGdoXFxgLCBhbmQgXFxgZ2hxXFxgIGFyZSBpbnN0YWxsZWQgYW5kIGF1dGhlbnRpY2F0ZWQuXG4ke29zQ29tcGF0aWJpbGl0eUluc3RydWN0aW9ufVxuJHtcbiAgYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRlcGVuZGluZy5nZW5JMThuVHMpXG4gICAgPyBgLSBSZWdpc3RlciBzdHJpbmcgbGl0ZXJhbHMgZm9yIFJlYWN0IGNvbXBvbmVudHMgaW4gdGhlIFxcYGkxOG5cXGAgcmVzb3VyY2UgZmlsZXMgKGUuZy4sIFxcYGkxOG4vamEtSlAuanNvblxcYCkgYW5kIHJlZmVyZW5jZSB0aGVtIHZpYSB0aGUgXFxgaTE4blxcYCB1dGlsaXR5IChlLmcuLCBcXGBpMThuLnBhZ2VzLmhvbWUudGl0bGUoKVxcYCBmb3IgXFxgeyBcInBhZ2VzXCI6IHsgXCJob21lXCI6IHsgXCJ0aXRsZVwiOiBcIk15IEFwcFwiIH0gfSB9XFxgKS5gXG4gICAgOiAnJ1xufVxuXG4ke1xuICBhbGxDb25maWdzLnNvbWUoKGMpID0+IGMuZGVwZW5kaW5nLnJlYWN0IHx8IGMuZGVwZW5kaW5nLm5leHQgfHwgYy5kZXBlbmRpbmcudmluZXh0KVxuICAgID8gYC0gUHJlZmVyIGxhbWJkYSBvdmVyIFxcYGZ1bmN0aW9uXFxgIGZvciBSZWFjdCBjb21wb25lbnRzLCBlLmcuLCBcXGBjb25zdCBCdXR0b246IFJlYWN0LkZDID0gKCkgPT4ge1xcYC5cbi0gUHJlZmVyIFxcYHVzZUltbWVyXFxgIG92ZXIgXFxgdXNlU3RhdGVcXGAgZm9yIGFycmF5cyBhbmQgb2JqZWN0cy5cbi0gVXNlIFxcYGF1dG9Gb2N1c1xcYCB3aGVyZSBpdCByZWR1Y2VzIHVzZXIgZWZmb3J0LmBcbiAgICA6ICcnXG59XG4ke1xuICAvLyB2aW5leHQgaXMgdGhlIG9yZydzIGN1cnJlbnQgd2ViLWFwcCBmcmFtZXdvcmsgYW5kIGVuYWJsZXMgdGhlIFJlYWN0IENvbXBpbGVyIGp1c3QgYXMgTmV4dC5qc1xuICAvLyBkb2VzLCBzbyBpdCBtdXN0IG5vdCBtaXNzIHRoaXMgcnVsZS5cbiAgYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRlcGVuZGluZy5uZXh0IHx8IGMuZGVwZW5kaW5nLnZpbmV4dClcbiAgICA/IGBcbi0gVGhpcyBwcm9qZWN0IHVzZXMgdGhlIFJlYWN0IENvbXBpbGVyLCBzbyBcXGB1c2VDYWxsYmFja1xcYCBhbmQgXFxgdXNlTWVtb1xcYCBhcmUgdW5uZWNlc3NhcnkgZm9yIHBlcmZvcm1hbmNlLlxuYFxuICAgIDogJydcbn1cbiR7c2VydmVySW5zdGFuY2VJbnN0cnVjdGlvbn1cbmBcbiAgICAucmVwbGFjZUFsbCgvXFwuXFxuXFxuKy0vZywgJy5cXG4tJylcbiAgICAucmVwbGFjZUFsbCgvXFxuezMsfS9nLCAnXFxuXFxuJylcbiAgICAudHJpbSgpO1xufVxuXG5mdW5jdGlvbiBoYXNQbGF5d3JpZ2h0VGVzdFNlcnZlcihjb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBib29sZWFuIHtcbiAgcmV0dXJuIGNvbmZpZ3Muc29tZSgoY29uZmlnKSA9PiBjb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRUZXN0KTtcbn1cbiIsIiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCByZWxlYXNlQWdlR2F0ZSBmcm9tICcuLi8uLi9jb25maWdzL3JlbGVhc2VBZ2VHYXRlLmpzb24nIHdpdGggeyB0eXBlOiAnanNvbicgfTtcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW50ZXJmYWNlIEJ1bmZpZ1RvbWwge1xuICBpbnN0YWxsPzoge1xuICAgIGV4YWN0PzogYm9vbGVhbjtcbiAgICBnbG9iYWxTdG9yZT86IGJvb2xlYW47XG4gICAgbGlua2VyPzogc3RyaW5nO1xuICB9O1xufVxuXG4vLyBjb25maWdzL3JlbGVhc2VBZ2VHYXRlLmpzb24gaXMgdGhlIG9yZ2FuaXphdGlvbidzIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIHRoZSBwb2xpY3k6IHRoZVxuLy8gbWFjaGluZXMnIGdsb2JhbCBjb25maWdzIGdldCBpdCB0aHJvdWdoIGNvbmZpZ3MvYXBwbHlSZWxlYXNlQWdlR2F0ZS5zaCAocnVuIGJ5IHdiZnkgaXRzZWxmLCBieVxuLy8gcmV1c2FibGUtd29ya2Zsb3dzIG9uIENJLCBhbmQgYnkgc2VsZi1ob3N0LXV0aWxzIG9uIHRoZSBydW5uZXJzKSwgYW5kIHJlcG9zaXRvcmllcyBnZXQgaXQgaGVyZS5cbi8vIE91ciBvd24gcGFja2FnZXMgYXJlIGV4ZW1wdDogd2UgY29udHJvbCB3aG8gcHVibGlzaGVzIHRoZW0sIHNvIGEgY29tcHJvbWlzZWQgcmVsZWFzZSBjYW5ub3Rcbi8vIHJlYWNoIHVzIHRocm91Z2ggYW4gdXBzdHJlYW0gbWFpbnRhaW5lcidzIHN0b2xlbiBjcmVkZW50aWFscy4gVGhlIG9ubHkgdGhpcmQtcGFydHkgZXhlbXB0aW9ucyBhcmVcbi8vIHRoZSBjb2RpbmctYWdlbnQgQ0xJcyBhbmQgU0RLcyAoQ29kZXgsIHRoZSBDbGF1ZGUgQWdlbnQgU0RLIGFuZCBpdHMgcGxhdGZvcm0gcGFja2FnZXMpLCB3aG9zZVxuLy8gbmV3ZXN0IG1vZGVscyBydW4gb25seSBvbiB0aGVpciBsYXRlc3QgcmVsZWFzZXMuIE91ciBvd24gZXhlbXB0aW9ucyBjb3ZlciBldmVyeVxuLy8gQHdpbGxib29zdGVyLXByaXZhdGUgcGFja2FnZSAodGhlIHNjb3BlIHJlc29sdmVzIG9ubHkgZnJvbSBvdXIgb3duIHJlZ2lzdHJ5KSwgYnV0IGJ1biwgbnBtLCBhbmRcbi8vIFlhcm4gbWF0Y2ggZXhjbHVkZSBlbnRyaWVzIGJ5IGV4YWN0IG5hbWUg4oCUIG5vIEBzY29wZS8qIHBhdHRlcm5zIOKAlCBzbyBlYWNoIG5ldyBwYWNrYWdlIGluIHRoZVxuLy8gc2NvcGUgbXVzdCBiZSBhZGRlZCB0byBjb25maWdzL3JlbGVhc2VBZ2VHYXRlLmpzb24gd2hlbiBpdCBpcyBmaXJzdCBwdWJsaXNoZWQuIE90aGVyIHRoaXJkLXBhcnR5XG4vLyBwYWNrYWdlcyDigJQgaW5jbHVkaW5nXG4vLyB0b29saW5nIHdiZnkgcGlucyBpdHNlbGYg4oCUIHN0YXkgYWdlLWdhdGVkOyBnZXRMYXRlc3RBZ2VHYXRlZERlcGVuZGVuY3lWZXJzaW9uIGluIHBhY2thZ2VKc29uLnRzXG4vLyBwaW5zIHRoZSBuZXdlc3QgcmVsZWFzZSBvbGQgZW5vdWdoIHRvIHBhc3MgdGhlIGdhdGUsIHNvIHBpbm5pbmcga2VlcHMgd29ya2luZyB3aXRob3V0IGFuIGV4ZW1wdGlvbi5cbmV4cG9ydCBjb25zdCBidW5NaW5pbXVtUmVsZWFzZUFnZVNlY29uZHMgPSByZWxlYXNlQWdlR2F0ZS5kYXlzICogMjQgKiA2MCAqIDYwO1xuZXhwb3J0IGNvbnN0IGJ1bk1pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXMgPSByZWxlYXNlQWdlR2F0ZS5leGNsdWRlcztcblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRCdW5HbG9iYWxTdG9yZShyb290RGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3REaXJQYXRoLCAnYnVuZmlnLnRvbWwnKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIHBhcnNlQnVuZmlnVG9tbChmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGY4JykpPy5pbnN0YWxsPy5nbG9iYWxTdG9yZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVCdW5HbG9iYWxTdG9yZShcbiAgY29uZmlnczogUGFja2FnZUNvbmZpZ1tdLFxuICBwcmV2aW91c0dsb2JhbFN0b3JlOiBib29sZWFuIHwgdW5kZWZpbmVkLFxuICBza2lwRGVwczogYm9vbGVhblxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IGRlZmF1bHRVc2VHbG9iYWxTdG9yZSA9IHNob3VsZFVzZUJ1bkdsb2JhbFN0b3JlKGNvbmZpZ3MpO1xuICByZXR1cm4gc2tpcERlcHMgPyAocHJldmlvdXNHbG9iYWxTdG9yZSA/PyBkZWZhdWx0VXNlR2xvYmFsU3RvcmUpIDogZGVmYXVsdFVzZUdsb2JhbFN0b3JlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2hvdWxkVXNlQnVuR2xvYmFsU3RvcmUoY29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogYm9vbGVhbiB7XG4gIC8vIEJsaXR6IGJ1aWxkcyBvbiBOZXh0LmpzIGJ1dCBuZWVkIG5vdCBkZWNsYXJlIGl0IGRpcmVjdGx5LCBhbmQgaXRzIGNvZGVnZW4gYWxzbyBwYXRjaGVzIE5leHRcbiAgLy8gaW5zaWRlIG5vZGVfbW9kdWxlcy4gQm90aCBmcmFtZXdvcmtzIHRoZXJlZm9yZSByZXF1aXJlIHByb2plY3QtbG9jYWwgaXNvbGF0ZWQgaW5zdGFsbHMuXG4gIC8vIFNsaWRldiBsb2FkcyBvcHRpb25hbCBWdWUgY29tcGlsZXIgcGVlcnMgdGhyb3VnaCBsb2NhbC1wa2cuIFRoZSBnbG9iYWwgc3RvcmUgcmVhbHBhdGhzXG4gIC8vIGxvY2FsLXBrZyBvdXRzaWRlIHRoZSBwcm9qZWN0LCBzbyBOb2RlIGNhbm5vdCByZXNvbHZlIGEgY29tcGlsZXIgZGVjbGFyZWQgYnkgdGhlIHByb2plY3QuXG4gIHJldHVybiAhY29uZmlncy5zb21lKChjb25maWcpID0+IGNvbmZpZy5kZXBlbmRpbmcubmV4dCB8fCBjb25maWcuZGVwZW5kaW5nLmJsaXR6IHx8IGNvbmZpZy5kZXBlbmRpbmcuc2xpZGV2KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQnVuZmlnVG9tbChjb25maWc6IFBhY2thZ2VDb25maWcsIHVzZUdsb2JhbFN0b3JlOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVCdW5maWdUb21sJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnYnVuZmlnLnRvbWwnKTtcbiAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSA/IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBjb250ZW50ID0gbmV3Q29udGVudChleGlzdGluZ0NvbnRlbnQsIHVzZUdsb2JhbFN0b3JlKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgY29udGVudCkpO1xuICB9KTtcbn1cblxuY29uc3QgbmV3Q29udGVudCA9IChleGlzdGluZ0NvbnRlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZCwgdXNlR2xvYmFsU3RvcmU6IGJvb2xlYW4pOiBzdHJpbmcgPT4ge1xuICBjb25zdCBidW5maWdUb21sID0gcGFyc2VCdW5maWdUb21sKGV4aXN0aW5nQ29udGVudCk7XG4gIC8vIG1pbmltdW1SZWxlYXNlQWdlIGFuZCBtaW5pbXVtUmVsZWFzZUFnZUV4Y2x1ZGVzIGFyZSBvcmcgcG9saWN5LCBuZXZlciByZXBvc2l0b3J5IHBvbGljeTogYm90aFxuICAvLyBhcmUgcmV3cml0dGVuIHRvIGNvbmZpZ3MvcmVsZWFzZUFnZUdhdGUuanNvbidzIHZhbHVlcyBvbiBldmVyeSBydW4sIHNvIGEgaGFuZC1lZGl0ZWQgKHdlYWtlbmVkKVxuICAvLyBnYXRlIGNhbm5vdCBzdXJ2aXZlIHJlZ2VuZXJhdGlvbi4gRHJvcHBpbmcgcmVwb3NpdG9yeS1zcGVjaWZpYyBleGNsdWRlIGVudHJpZXMgaXMgZmFpbC1zYWZlIOKAlCBhblxuICAvLyB1bmNvdmVyZWQgcGFja2FnZSBiZWNvbWVzIGFnZS1nYXRlZCBhbmQgc3VyZmFjZXMgYXQgaW5zdGFsbCB0aW1lIGluc3RlYWQgb2Ygd2Vha2VuaW5nIHRoZSBnYXRlLlxuICAvLyBUdXJib3BhY2sgcmVqZWN0cyBnbG9iYWwtc3RvcmUgc3ltbGlua3MgYmVjYXVzZSB0aGV5IHJlc29sdmUgb3V0c2lkZSBpdHMgZmlsZXN5c3RlbSByb290LlxuICAvLyBLZWVwaW5nIE5leHQuanMgaW5zdGFsbHMgcHJvamVjdC1sb2NhbCBhdm9pZHMgd2lkZW5pbmcgdGhhdCByb290IHRvICRIT01FIChvciBgL2AgaW4gRG9ja2VyKSxcbiAgLy8gd2hpY2ggd291bGQgZXhwYW5kIGRldmVsb3BtZW50IGZpbGVzeXN0ZW0gd2F0Y2hpbmcgYW5kIGJ5cGFzcyB0aGUgYm91bmRhcnkncyBjYWNoZSBiZW5lZml0cy5cbiAgY29uc3QgZ2xvYmFsU3RvcmVMaW5lID0gdXNlR2xvYmFsU3RvcmUgPyAnZ2xvYmFsU3RvcmUgPSB0cnVlJyA6ICdnbG9iYWxTdG9yZSA9IGZhbHNlJztcbiAgLy8gTm8gYFtydW5dIGJ1biA9IHRydWVgOiBpdHMgbm9kZS0+YnVuIFBBVEggc2hpbSBsZWFrcyBpbnRvIGV2ZXJ5IGNoaWxkIHByb2Nlc3MgYW5kIGJyZWFrc1xuICAvLyB0b29scyByZXF1aXJpbmcgcmVhbCBOb2RlLmpzIChQbGF5d3JpZ2h0LCB3cmFuZ2xlciwgdmluZXh0KTsgYW55IGV4aXN0aW5nIHNldHRpbmcgaXMgZHJvcHBlZC5cbiAgLy8gcHVibGljSG9pc3RQYXR0ZXJuIOKAlCB0c3g6IGJ1aWxkLXRzIHVuZGVyIE5vZGUuanMgc3Bhd25zIGBub2RlIC0taW1wb3J0IHRzeGAsIHdoaWNoIHJlc29sdmVzXG4gIC8vIHRzeCBmcm9tIHRoZSBjb25zdW1lciBwYWNrYWdlJ3MgZGlyZWN0b3J5LCBub3QgZnJvbSBidWlsZC10cydzIG93biBkZXBlbmRlbmNpZXMuXG4gIC8vIHVuZGljaS10eXBlczogYnVuLXR5cGVzIHJlZmVyZW5jZXMgaXQgd2l0aG91dCBkZWNsYXJpbmcgaXQgYXMgYSBkZXBlbmRlbmN5IChvdmVuLXNoL2J1biMyMjgwNSk7XG4gIC8vIGdlbmVyYXRlZCB0c2NvbmZpZ3MgYWxzbyBtYXAgdW5kaWNpLXR5cGVzIHRvIHRoZSBob2lzdGVkIGNvcHkgKHNlZSB0c2NvbmZpZy50cykgYmVjYXVzZSB0aGVcbiAgLy8gZ2xvYmFsIHN0b3JlIHJlYWxwYXRocyBidW4tdHlwZXMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeS5cbiAgcmV0dXJuIGBlbnYgPSBmYWxzZVxudGVsZW1ldHJ5ID0gZmFsc2VcblxuJHtleHRyYWN0UmF3VGVzdFNlY3Rpb25zKGV4aXN0aW5nQ29udGVudCl9W2luc3RhbGxdXG5leGFjdCA9ICR7YnVuZmlnVG9tbD8uaW5zdGFsbD8uZXhhY3QgPT09IGZhbHNlID8gJ2ZhbHNlJyA6ICd0cnVlJ31cbiR7Z2xvYmFsU3RvcmVMaW5lfVxubGlua2VyID0gXCJpc29sYXRlZFwiXG5wdWJsaWNIb2lzdFBhdHRlcm4gPSBbXCJ0c3hcIiwgXCJ1bmRpY2ktdHlwZXNcIl1cbm1pbmltdW1SZWxlYXNlQWdlID0gJHtidW5NaW5pbXVtUmVsZWFzZUFnZVNlY29uZHN9XG5taW5pbXVtUmVsZWFzZUFnZUV4Y2x1ZGVzID0gW1xuJHtidW5NaW5pbXVtUmVsZWFzZUFnZUV4Y2x1ZGVzLm1hcCgocGFja2FnZU5hbWUpID0+IGAgICAgXCIke3BhY2thZ2VOYW1lfVwiLGApLmpvaW4oJ1xcbicpfVxuXVxuYDtcbn07XG5cbi8qKlxuICogUHJlc2VydmUgdGhlIHByb2plY3QncyBgW3Rlc3RdYCBzZWN0aW9ucyAoZS5nLiBwcmVsb2FkIHNjcmlwdHMgc3dhcHBpbmcgYSBDbG91ZGZsYXJlIEQxIGNsaWVudFxuICogZm9yIGEgbG9jYWwgU1FMaXRlIG9uZSkgdmVyYmF0aW0sIGNvbW1lbnRzIGluY2x1ZGVkOyB3YmZ5IG1hbmFnZXMgb25seSB0aGUgb3RoZXIgc2VjdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0UmF3VGVzdFNlY3Rpb25zKGNvbnRlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIGlmICghY29udGVudCkgcmV0dXJuICcnO1xuXG4gIGNvbnN0IHByZXNlcnZlZExpbmVzOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgaW5UZXN0U2VjdGlvbiA9IGZhbHNlO1xuICBmb3IgKGNvbnN0IGxpbmUgb2YgY29udGVudC5zcGxpdCgnXFxuJykpIHtcbiAgICBjb25zdCBzZWN0aW9uTWF0Y2ggPSAvXlxccypcXFsoW15cXF1dKylcXF0vLmV4ZWMobGluZSk7XG4gICAgaWYgKHNlY3Rpb25NYXRjaCkge1xuICAgICAgaW5UZXN0U2VjdGlvbiA9IHNlY3Rpb25NYXRjaFsxXSA9PT0gJ3Rlc3QnIHx8IChzZWN0aW9uTWF0Y2hbMV0gYXMgc3RyaW5nKS5zdGFydHNXaXRoKCd0ZXN0LicpO1xuICAgIH1cbiAgICBpZiAoaW5UZXN0U2VjdGlvbiAmJiBsaW5lLnRyaW0oKSkge1xuICAgICAgcHJlc2VydmVkTGluZXMucHVzaChsaW5lKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHByZXNlcnZlZExpbmVzLmxlbmd0aCA+IDAgPyBgJHtwcmVzZXJ2ZWRMaW5lcy5qb2luKCdcXG4nKX1cXG5cXG5gIDogJyc7XG59XG5cbmZ1bmN0aW9uIHBhcnNlQnVuZmlnVG9tbChjb250ZW50OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBCdW5maWdUb21sIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFjb250ZW50KSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBCdW4uVE9NTC5wYXJzZShjb250ZW50KSBhcyBCdW5maWdUb21sO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5cbmNvbnN0IHVzZXJDb250ZW50SGVhZGVyID0gJyMgUHJvamVjdC1zcGVjaWZpYyBzZXR0aW5ncyc7XG5jb25zdCB1c2VyQ29udGVudEhlYWRlclJlZ2V4ID0gLyMgUHJvamVjdC1zcGVjaWZpYyBzZXR0aW5nc1teXFxuXSpcXG4vZ207XG5jb25zdCBzZXBhcmF0b3IgPSAnIyBHZW5lcmF0ZWQgYnkgd2JmeSc7XG5jb25zdCBzZXBhcmF0b3JQcmVmaXggPSAnIyBHZW5lcmF0ZWQgYnkgJztcbmNvbnN0IGRlZmF1bHRIZWFkVXNlckNvbnRlbnQgPSBgJHt1c2VyQ29udGVudEhlYWRlcn0gKGhlYWQpXG5cblxuJHtzZXBhcmF0b3J9XG5gO1xuY29uc3QgZGVmYXVsdFRhaWxVc2VyQ29udGVudCA9IGBcbiR7dXNlckNvbnRlbnRIZWFkZXJ9ICh0YWlsKVxuYDtcblxuZXhwb3J0IGNvbnN0IGlnbm9yZUZpbGVVdGlsID0ge1xuICBzZXBhcmF0b3IsXG4gIHNlcGFyYXRvclByZWZpeCxcbiAgZGVmYXVsdEhlYWRVc2VyQ29udGVudCxcbiAgZGVmYXVsdFRhaWxVc2VyQ29udGVudCxcbiAgYXN5bmMgcmVhZEdpdGlnbm9yZVdpdGhvdXRTZXBhcmF0b3JzKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIHRyeSB7XG4gICAgICBsZXQgY29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3QgbGFzdEhlYWRlckluZGV4ID0gZ2V0SW5kZXhPZlRhaWxVc2VyQ29udGVudEhlYWRlcihjb250ZW50KTtcbiAgICAgIGlmIChsYXN0SGVhZGVySW5kZXggPiAwKSB7XG4gICAgICAgIGNvbnRlbnQgPSBjb250ZW50LnNsaWNlKDAsIGxhc3RIZWFkZXJJbmRleCAtIDEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIChcbiAgICAgICAgY29udGVudFxuICAgICAgICAgIC5yZXBsYWNlQWxsKHVzZXJDb250ZW50SGVhZGVyUmVnZXgsICcnKVxuICAgICAgICAgIC5yZXBsYWNlQWxsKC8jIEdlbmVyYXRlZCBieSBbXlxcbl0qXFxuL2dtLCAnJylcbiAgICAgICAgICAucmVwbGFjZUFsbCgvXFxyP1xcblxccj9cXG4oXFxyP1xcbikrL2dtLCAnXFxuXFxuJylcbiAgICAgICAgICAudHJpbSgpICsgJ1xcbidcbiAgICAgICk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICB9LFxuICBnZXRIZWFkVXNlckNvbnRlbnQoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBpbmRleCA9IGNvbnRlbnQuaW5kZXhPZih0aGlzLnNlcGFyYXRvclByZWZpeCk7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgcmV0dXJuIGNvbnRlbnRcbiAgICAgICAgLnNsaWNlKDAsIGNvbnRlbnQuaW5kZXhPZignXFxuJywgaW5kZXgpICsgMSlcbiAgICAgICAgLnJlcGxhY2VBbGwodXNlckNvbnRlbnRIZWFkZXJSZWdleCwgYCR7dXNlckNvbnRlbnRIZWFkZXJ9IChoZWFkKVxcbmApO1xuICAgIH1cbiAgICByZXR1cm4gZGVmYXVsdEhlYWRVc2VyQ29udGVudDtcbiAgfSxcbiAgZ2V0VGFpbFVzZXJDb250ZW50KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgbGFzdEhlYWRlckluZGV4ID0gZ2V0SW5kZXhPZlRhaWxVc2VyQ29udGVudEhlYWRlcihjb250ZW50KTtcbiAgICBpZiAobGFzdEhlYWRlckluZGV4ID4gMCkge1xuICAgICAgcmV0dXJuIGNvbnRlbnQuc2xpY2UobGFzdEhlYWRlckluZGV4IC0gMSk7XG4gICAgfVxuICAgIHJldHVybiBkZWZhdWx0VGFpbFVzZXJDb250ZW50O1xuICB9LFxuICBhc3luYyBpc0JlcnJ5WmVyb0luc3RhbGxFbmFibGVkKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgcmV0dXJuIGNvbnRlbnQuaW5jbHVkZXMoJ1xcbiEueWFybi9jYWNoZScpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSxcbn07XG5cbmZ1bmN0aW9uIGdldEluZGV4T2ZUYWlsVXNlckNvbnRlbnRIZWFkZXIoY29udGVudDogc3RyaW5nKTogbnVtYmVyIHtcbiAgY29uc3QgaW5kZXggPSBjb250ZW50LmluZGV4T2YodXNlckNvbnRlbnRIZWFkZXIpO1xuICBjb25zdCBsYXN0SW5kZXggPSBjb250ZW50Lmxhc3RJbmRleE9mKHVzZXJDb250ZW50SGVhZGVyKTtcbiAgcmV0dXJuIGxhc3RJbmRleCA+IGluZGV4ID8gbGFzdEluZGV4IDogLTE7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgaWdub3JlRmlsZVV0aWwgfSBmcm9tICcuLi91dGlscy9pZ25vcmVGaWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuLy8gRXhlcmNvZGUgZGVwbG95cyBHaXQtYmFzZWQgcHJpdmF0ZSBwYWNrYWdlcyBmcm9tIG5vZGVfbW9kdWxlcywgYnV0IHRoZSBEb2NrZXIgY29udGV4dCBzaG91bGQgc3RheSBuYXJyb3cuXG5jb25zdCBpbmNsdWRlZE5vZGVNb2R1bGVzUGF0dGVybnMgPSBbJ0B3aWxsYm9vc3RlciddO1xuXG5jb25zdCBjb21tb25Db250ZW50ID0gYFxuLmVudipcbioqLy5EU19TdG9yZVxuKiovLmNhY2hlXG4qKi8uY2xhdWRlXG4qKi8uY3Vyc29yXG4qKi8uZWRpdG9yY29uZmlnXG4qKi8uZXNsaW50Y2FjaGVcbioqLy5nZW1pbmlcbioqLy5naXRcbioqLy5naXRhdHRyaWJ1dGVzXG4qKi8uZ2l0aHViXG4qKi8uZ2l0aWdub3JlXG4qKi8uaWRlYVxuKiovLmxlZnRob29rXG4qKi8ubXlweV9jYWNoZVxuKiovLm5leHQvY2FjaGVcbioqLy5ucG1cbioqLy5wYXJjZWwtY2FjaGVcbioqLy5wbnBtLXN0b3JlXG4qKi8ucHl0ZXN0X2NhY2hlXG4qKi8ucmFpbHdheWlnbm9yZVxuKiovLnJlbGVhc2VyYy5qc29uXG4qKi8ucnVmZl9jYWNoZVxuKiovLnRtcFxuKiovLnRtcC0qLyoqXG4qKi8udHVyYm9cbioqLy50b3hcbioqLy52c2NvZGVcbioqLy55YXJuL2NhY2hlXG4qKi8qLnNxbGl0ZTMqXG4qKi8ueWFybi9pbnN0YWxsLXN0YXRlLmd6XG4qKi8udmVudlxuKiovX19weWNhY2hlX19cbioqLyoubG9nXG4qKi8qLnB5Y1xuKiovKi50c2J1aWxkaW5mb1xuKiovY292ZXJhZ2VcbioqL25vZGVfbW9kdWxlcy8qKlxuJHtpbmNsdWRlZE5vZGVNb2R1bGVzUGF0dGVybnNcbiAgLm1hcChcbiAgICAocGF0dGVybikgPT4gYCEqKi9ub2RlX21vZHVsZXMvJHtwYXR0ZXJufVxuISoqL25vZGVfbW9kdWxlcy8ke3BhdHRlcm59LyoqYFxuICApXG4gIC5qb2luKCdcXG4nKX1cbioqL25vZGVfbW9kdWxlcy8uY2FjaGVcbioqL3BsYXl3cmlnaHQtcmVwb3J0XG4qKi9zdG9yeWJvb2stc3RhdGljXG4qKi90YXJnZXRcbioqL3Rlc3QtcmVzdWx0c1xuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRG9ja2VyaWdub3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlRG9ja2VyaWdub3JlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmRvY2tlcmlnbm9yZScpO1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Eb2NrZXJmaWxlKSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gKGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKSkgPz8gJyc7XG4gICAgICBjb25zdCBoZWFkVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRIZWFkVXNlckNvbnRlbnQoY29udGVudCk7XG4gICAgICBjb25zdCB0YWlsVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRUYWlsVXNlckNvbnRlbnQoY29udGVudCk7XG5cbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBoZWFkVXNlckNvbnRlbnQgKyBjb21tb25Db250ZW50ICsgdGFpbFVzZXJDb250ZW50O1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgfVxuICB9KTtcbn1cbiIsImV4cG9ydCBjb25zdCBleHRlbnNpb25zID0ge1xuICBjb2RlV2l0aDJJbmRlbnRTaXplOiBbXG4gICAgJ2NqcycsXG4gICAgJ21qcycsXG4gICAgJ2pzJyxcbiAgICAnanN4JyxcbiAgICAnY3RzJyxcbiAgICAnbXRzJyxcbiAgICAndHMnLFxuICAgICd0c3gnLFxuICAgICdqc29uJyxcbiAgICAnanNvbjUnLFxuICAgICdqc29uYycsXG4gICAgJ2NwcCcsXG4gICAgJ2RhcnQnLFxuICAgICdodG0nLFxuICAgICdodG1sJyxcbiAgICAncHUnLFxuICAgICdwdW1sJyxcbiAgICAncmInLFxuICAgICd2dWUnLFxuICAgICd4bWwnLFxuICAgICd5YW1sJyxcbiAgICAneW1sJyxcbiAgICAnc2gnLFxuICBdLnRvU29ydGVkKCksXG4gIGNvZGVXaXRoNEluZGVudFNpemU6IFsnZ28nLCAnZ3JhZGxlJywgJ2phdmEnLCAncHknXS50b1NvcnRlZCgpLFxuICBtYXJrZG93bkxpa2U6IFsnbWQnXS50b1NvcnRlZCgpLFxuICBveGxpbnQ6IFsnYXN0cm8nLCAnY2pzJywgJ2N0cycsICdqcycsICdqc3gnLCAnbWpzJywgJ210cycsICdzdmVsdGUnLCAndHMnLCAndHN4JywgJ3Z1ZSddLnRvU29ydGVkKCksXG4gIG94Zm10OiBbXG4gICAgJ2FzdHJvJyxcbiAgICAnY2pzJyxcbiAgICAnY3NzJyxcbiAgICAnY3RzJyxcbiAgICAnZ3FsJyxcbiAgICAnZ3JhcGhxbCcsXG4gICAgJ2hicycsXG4gICAgJ2h0bScsXG4gICAgJ2h0bWwnLFxuICAgICdqcycsXG4gICAgJ2pzb24nLFxuICAgICdqc29uNScsXG4gICAgJ2pzb25jJyxcbiAgICAnanN4JyxcbiAgICAnbGVzcycsXG4gICAgJ21kJyxcbiAgICAnbWR4JyxcbiAgICAnbWpzJyxcbiAgICAnbXRzJyxcbiAgICAnc2NzcycsXG4gICAgJ3N2ZWx0ZScsXG4gICAgJ3RvbWwnLFxuICAgICd0cycsXG4gICAgJ3RzeCcsXG4gICAgJ3Z1ZScsXG4gICAgJ3lhbWwnLFxuICAgICd5bWwnLFxuICBdLnRvU29ydGVkKCksXG4gIHByZXR0aWVyT25seTogWydqYXZhJ10udG9Tb3J0ZWQoKSxcbn07XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IG5ld0NvbnRlbnQgPSBgcm9vdCA9IHRydWVcblxuWypdXG5jaGFyc2V0ID0gdXRmLThcbmVuZF9vZl9saW5lID0gbGZcbmluc2VydF9maW5hbF9uZXdsaW5lID0gdHJ1ZVxudHJpbV90cmFpbGluZ193aGl0ZXNwYWNlID0gdHJ1ZVxuXG4ke2dlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zLmNvZGVXaXRoMkluZGVudFNpemUpfVxuaW5kZW50X3NpemUgPSAyXG5pbmRlbnRfc3R5bGUgPSBzcGFjZVxuXG4ke2dlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zLmNvZGVXaXRoNEluZGVudFNpemUpfVxuaW5kZW50X3NpemUgPSA0XG5pbmRlbnRfc3R5bGUgPSBzcGFjZVxuXG4ke2dlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zLm1hcmtkb3duTGlrZSl9XG5tYXhfbGluZV9sZW5ndGggPSBvZmZcbnRyaW1fdHJhaWxpbmdfd2hpdGVzcGFjZSA9IGZhbHNlXG5cblt7TWFrZWZpbGUsKi5ta31dXG5pbmRlbnRfc3R5bGUgPSB0YWJcbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUVkaXRvcmNvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUVkaXRvcmNvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lZGl0b3Jjb25maWcnKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGV4dGVuc2lvbnMubGVuZ3RoID4gMSA/IGBbKi57JHtleHRlbnNpb25zLmpvaW4oJywnKX19XWAgOiBgWyouJHtleHRlbnNpb25zWzBdfV1gO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW1wb3J0IHsgZ2VuZXJhdGVBZ2VudENvZGluZ1N0eWxlLCBnZXREZWZhdWx0UHJvc2VMYW5ndWFnZSwgcmVhZEFnZW50c0V4dHJhQ29udGVudCB9IGZyb20gJy4vYWdlbnRzLmpzJztcblxuY29uc3QgZGVmYXVsdENvbmZpZyA9IHtcbiAgaGF2ZV9mdW46IHRydWUsXG4gIGNvZGVfcmV2aWV3OiB7XG4gICAgZGlzYWJsZTogZmFsc2UsXG4gICAgY29tbWVudF9zZXZlcml0eV90aHJlc2hvbGQ6ICdNRURJVU0nLFxuICAgIG1heF9yZXZpZXdfY29tbWVudHM6IC0xLFxuICAgIHB1bGxfcmVxdWVzdF9vcGVuZWQ6IHtcbiAgICAgIGhlbHA6IGZhbHNlLFxuICAgICAgc3VtbWFyeTogdHJ1ZSxcbiAgICAgIGNvZGVfcmV2aWV3OiB0cnVlLFxuICAgIH0sXG4gIH0sXG4gIGlnbm9yZV9wYXR0ZXJuczogWycqKi9fX2dlbmVyYXRlZF9fJ10sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHZW1pbmlDb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdlbWluaUNvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWNvbmZpZy5pc1Jvb3QpIHJldHVybjtcblxuICAgIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2VtaW5pJyk7XG4gICAgY29uc3QgY29uZmlnRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2NvbmZpZy55YW1sJyk7XG4gICAgY29uc3Qgbm9uQ2Fub25pY2FsQ29uZmlnRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2NvbmZpZy55bWwnKTtcbiAgICBjb25zdCBzdHlsZWd1aWRlRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3N0eWxlZ3VpZGUubWQnKTtcblxuICAgIGNvbnN0IGhhc05vbkNhbm9uaWNhbENvbmZpZyA9ICEhKGF3YWl0IGZzLnByb21pc2VzLmxzdGF0KG5vbkNhbm9uaWNhbENvbmZpZ0ZpbGVQYXRoKS5jYXRjaCgoKSA9PiB7fSkpO1xuICAgIGlmIChoYXNOb25DYW5vbmljYWxDb25maWcpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFNraXBwZWQgZ2VuZXJhdGluZyAke2NvbmZpZ0ZpbGVQYXRofSBiZWNhdXNlICR7bm9uQ2Fub25pY2FsQ29uZmlnRmlsZVBhdGh9IGlzIG5vdCBhIHN1cHBvcnRlZCBHZW1pbmkgY29uZmlnIGxvY2F0aW9uLiBSZW5hbWUgaXQgbWFudWFsbHkuYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBsZXQgbmV3Q29uZmlnOiBvYmplY3QgPSBzdHJ1Y3R1cmVkQ2xvbmUoZGVmYXVsdENvbmZpZyk7XG4gICAgY29uc3Qgb2xkQ29udGVudCA9IGhhc05vbkNhbm9uaWNhbENvbmZpZyA/IHVuZGVmaW5lZCA6IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUNvbmZpbmVkSWZFeGlzdHMoY29uZmlnRmlsZVBhdGgpO1xuICAgIGlmIChvbGRDb250ZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IG9sZENvbmZpZyA9IEJ1bi5ZQU1MLnBhcnNlKG9sZENvbnRlbnQpO1xuICAgICAgICAvLyBNZXJnZSBvbmx5IGEgbWFwcGluZzogZW1wdHksIGNvbW1lbnQtb25seSwgb3Igc2NhbGFyIFlBTUwgd291bGQgZWl0aGVyIHRocm93IGluXG4gICAgICAgIC8vIG1lcmdlLmFsbCBvciBwb2xsdXRlIHRoZSBjb25maWcgd2l0aCBpbmRleCBrZXlzLlxuICAgICAgICBpZiAob2xkQ29uZmlnICYmIHR5cGVvZiBvbGRDb25maWcgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KG9sZENvbmZpZykpIHtcbiAgICAgICAgICBuZXdDb25maWcgPSBtZXJnZS5hbGwoW25ld0NvbmZpZywgb2xkQ29uZmlnLCBuZXdDb25maWddLCB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH0pO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gZG8gbm90aGluZyAtIGZpbGUgY2FuJ3QgYmUgcGFyc2VkXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgeWFtbENvbnRlbnQgPSBCdW4uWUFNTC5zdHJpbmdpZnkobmV3Q29uZmlnLCB1bmRlZmluZWQsIDIpO1xuXG4gICAgY29uc3QgZXh0cmFDb250ZW50ID0gYXdhaXQgcmVhZEFnZW50c0V4dHJhQ29udGVudChjb25maWcuZGlyUGF0aCk7XG4gICAgY29uc3QgY29kaW5nUnVsZUV4dHJhQ29udGVudCA9IGV4dHJhQ29udGVudD8udHJpbVN0YXJ0KCkuc3RhcnRzV2l0aCgnIycpID8gdW5kZWZpbmVkIDogZXh0cmFDb250ZW50O1xuICAgIGNvbnN0IHN0eWxlZ3VpZGVDb250ZW50ID0gYFJldmlldyBpbiAke2dldERlZmF1bHRQcm9zZUxhbmd1YWdlKGNvbmZpZyl9IGJhc2VkIG9uIHRoZSBmb2xsb3dpbmcgY29kaW5nIHN0YW5kYXJkcy5cXG5cXG4ke2dlbmVyYXRlQWdlbnRDb2RpbmdTdHlsZShjb25maWcsIGFsbENvbmZpZ3MpfSR7XG4gICAgICBjb2RpbmdSdWxlRXh0cmFDb250ZW50ID8gYFxcbiR7Y29kaW5nUnVsZUV4dHJhQ29udGVudC50cmltRW5kKCl9YCA6ICcnXG4gICAgfWA7XG5cbiAgICBjb25zdCBwcm9taXNlcyA9IFtcbiAgICAgIC4uLihoYXNOb25DYW5vbmljYWxDb25maWcgPyBbXSA6IFtwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShjb25maWdGaWxlUGF0aCwgeWFtbENvbnRlbnQpKV0pLFxuICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoc3R5bGVndWlkZUZpbGVQYXRoLCBzdHlsZWd1aWRlQ29udGVudCkpLFxuICAgIF07XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICB9KTtcbn1cbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGdpdE91dHB1dE1heEJ1ZmZlciA9IDY0ICogMTAyNCAqIDEwMjQ7XG5cbi8vIGNmLiBodHRwczovL2J1bi5zaC9ndWlkZXMvaW5zdGFsbC9naXQtZGlmZi1idW4tbG9ja2ZpbGVcbi8vIGAuZ2l0aWdub3JlIC10ZXh0YCBrZWVwcyB0aGUgbWFjT1MgdGVtcGxhdGUncyBgSWNvblxcclxccmAgcnVsZSBpbnRhY3Q6IGB0ZXh0PWF1dG9gIG5vcm1hbGl6YXRpb25cbi8vIHN0cmlwcyBvbmUgQ1IgcGVyIGNoZWNraW4sIGRlZ3JhZGluZyB0aGUgcnVsZSB1bnRpbCBpdCBtYXRjaGVzIG5vdGhpbmcuXG5jb25zdCBuZXdDb250ZW50ID0gYCogdGV4dD1hdXRvXG5cbi5naXRpZ25vcmUgLXRleHRcblxuKi5sb2NrYiBiaW5hcnkgZGlmZj1sb2NrYlxuKi52Y3Byb2ogdGV4dCBlb2w9Y3JsZlxuXG4ke1suLi5leHRlbnNpb25zLmNvZGVXaXRoMkluZGVudFNpemUsIC4uLmV4dGVuc2lvbnMuY29kZVdpdGg0SW5kZW50U2l6ZSwgLi4uZXh0ZW5zaW9ucy5tYXJrZG93bkxpa2VdXG4gIC5tYXAoKGV4dCkgPT4gYCouJHtleHR9IHRleHQgZW9sPWxmYClcbiAgLmpvaW4oJ1xcbicpfVxuXG5kaXN0LyoqIGxpbmd1aXN0LWdlbmVyYXRlZD10cnVlXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlR2l0YXR0cmlidXRlcycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRhdHRyaWJ1dGVzJyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW5vcm1hbGl6ZVRyYWNrZWRUZXh0RmlsZXMoZGlyUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIGxldCBvdXRwdXQ6IHN0cmluZztcbiAgdHJ5IHtcbiAgICBvdXRwdXQgPSBjaGlsZF9wcm9jZXNzLmV4ZWNGaWxlU3luYygnZ2l0JywgWydscy1maWxlcycsICctLWVvbCcsICcteiddLCB7XG4gICAgICBjd2Q6IGRpclBhdGgsXG4gICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgICAgbWF4QnVmZmVyOiBnaXRPdXRwdXRNYXhCdWZmZXIsXG4gICAgICBzdGRpbzogWydpZ25vcmUnLCAncGlwZScsICdwaXBlJ10sXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS53YXJuKGBTa2lwcGVkIHRyYWNrZWQgbGluZS1lbmRpbmcgcmVub3JtYWxpemF0aW9uOiAkeyhlcnJvciBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICByZXR1cm47XG4gIH1cbiAgbGV0IHJlbm9ybWFsaXplZENvdW50ID0gMDtcbiAgZm9yIChjb25zdCByZWNvcmQgb2Ygb3V0cHV0LnNwbGl0KCdcXDAnKSkge1xuICAgIGNvbnN0IHNlcGFyYXRvckluZGV4ID0gcmVjb3JkLmluZGV4T2YoJ1xcdCcpO1xuICAgIGlmIChzZXBhcmF0b3JJbmRleCA9PT0gLTEpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgYXR0cmlidXRlcyA9IHJlY29yZC5zbGljZSgwLCBzZXBhcmF0b3JJbmRleCk7XG4gICAgaWYgKCEvXmlcXC8oPzpjcmxmfG1peGVkKVxccy91LnRlc3QoYXR0cmlidXRlcykgfHwgIS9hdHRyXFwvLipcXGJlb2w9KD86bGZ8Y3JsZikoPzpcXHN8JCkvdS50ZXN0KGF0dHJpYnV0ZXMpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCByZWxhdGl2ZVBhdGggPSByZWNvcmQuc2xpY2Uoc2VwYXJhdG9ySW5kZXggKyAxKTtcbiAgICBjb25zdCB0cmFja2VkRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgcmVsYXRpdmVQYXRoKTtcbiAgICBjb25zdCBzdGF0cyA9IGZzLmxzdGF0U3luYyh0cmFja2VkRmlsZVBhdGgsIHsgdGhyb3dJZk5vRW50cnk6IGZhbHNlIH0pO1xuICAgIGlmICghc3RhdHM/LmlzRmlsZSgpKSBjb250aW51ZTtcblxuICAgIC8vIEdpdCdzIHN0YXQgY2FjaGUgY2FuIGhpZGUgcHJlLWV4aXN0aW5nIENSTEYgYmxvYnMgYWZ0ZXIgd2JmeSBpbnRyb2R1Y2VzIHRleHQgYXR0cmlidXRlcy5cbiAgICAvLyBOb3JtYWxpemUgYnl0ZXMgaW4gdGhlIHdvcmt0cmVlIHNvIHRoZSBjYWxsZXIncyBub3JtYWwgYGdpdCBhZGQgLUFgIHJlY29yZHMgdGhlIGNhbm9uaWNhbFxuICAgIC8vIGJsb2I7IHRoaXMgYWxzbyBwcmV2ZW50cyBQcmV0dGllcidzIG1ldGFkYXRhIGNhY2hlIGZyb20gc2tpcHBpbmcgdGhlIG5ld2x5IGNoYW5nZWQgZmlsZS5cbiAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHRyYWNrZWRGaWxlUGF0aCk7XG4gICAgZnMud3JpdGVGaWxlU3luYyh0cmFja2VkRmlsZVBhdGgsIEJ1ZmZlci5mcm9tKGNvbnRlbnQudG9TdHJpbmcoJ2JpbmFyeScpLnJlcGxhY2VBbGwoJ1xcclxcbicsICdcXG4nKSwgJ2JpbmFyeScpKTtcbiAgICByZW5vcm1hbGl6ZWRDb3VudCsrO1xuICB9XG4gIGlmIChyZW5vcm1hbGl6ZWRDb3VudCA+IDApIHtcbiAgICBjb25zb2xlLmluZm8oYFJlbm9ybWFsaXplZCBsaW5lIGVuZGluZ3MgaW4gJHtyZW5vcm1hbGl6ZWRDb3VudH0gdHJhY2tlZCBmaWxlKHMpLmApO1xuICB9XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgb3MgZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4uL29wdGlvbnMuanMnO1xuaW1wb3J0IHsgY29uc3VtZXNHZW5lcmF0ZWRXb3JrZXJUeXBlcywgZ2VuZXJhdGVzV29ya2VyVHlwZXMsIHR5cGUgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbi8vIERvIG5vdCByZW1vdmUgYHdpbmRvd3NgOiBnZW5lcmF0ZWQgLmdpdGlnbm9yZSBmaWxlcyBtdXN0IGtlZXAgaWdub3JpbmcgV2luZG93cy1jcmVhdGVkIGxvY2FsIGFydGlmYWN0cy5cbmNvbnN0IGRlZmF1bHROYW1lcyA9IFsnd2luZG93cycsICdtYWNvcycsICdsaW51eCcsICdqZXRicmFpbnMnLCAndmlzdWFsc3R1ZGlvY29kZScsICdlbWFjcycsICd2aW0nLCAneWFybiddO1xuXG5jb25zdCBjb21tb25Db250ZW50ID0gYFxuX19nZW5lcmF0ZWRfXy9cbiEua2VlcFxuLmFpZGVyKlxuLmFudGlncmF2aXR5Y2xpL1xuLmNsYXVkZS8qLmxvY2FsLipcbi5jbGF1ZGUvc2NoZWR1bGVkX3Rhc2tzLmxvY2tcbi5kZXZjb250YWluZXIvXG4uZG9ja2VyLmVudlxuLmVudipcbi5pZGVhL0F1Z21lbnRXZWJ2aWV3U3RhdGVTdG9yZS54bWxcbi5pZGVhL2NvcGlsb3QuKlxuLmlkZWEvY29waWxvdC9jaGF0U2Vzc2lvbnMvXG4ucGxheXdyaWdodC1jbGkvXG4ucGxheXdyaWdodC1tY3AvXG4uc2VyZW5hL1xuLnRtcC9cbi50bXAtKi9cbi50b2tlbnNhdmUvXG4ud2IvXG5Ad2lsbGJvb3N0ZXIvXG5Ad2lsbGJvb3N0ZXItcHJpdmF0ZS9cbiovbW91bnQvKi5oYXNoXG5DTEFVREUubG9jYWwubWRcbmRpc3QvXG5kcml6emxlL21vdW50L1xudGVtcC9cbnRtcC9cbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUdpdGlnbm9yZShjb25maWc6IFBhY2thZ2VDb25maWcsIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdpdGlnbm9yZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRpZ25vcmUnKTtcbiAgICBjb25zdCBjb250ZW50ID0gKGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKSkgPz8gJyc7XG4gICAgbGV0IGhlYWRVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldEhlYWRVc2VyQ29udGVudChjb250ZW50KSArIGNvbW1vbkNvbnRlbnQ7XG4gICAgY29uc3QgdGFpbFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0VGFpbFVzZXJDb250ZW50KGNvbnRlbnQpO1xuXG4gICAgY29uc3QgbmFtZXMgPSBbLi4uZGVmYXVsdE5hbWVzXTtcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluR2VtZmlsZSkge1xuICAgICAgbmFtZXMucHVzaCgncnVieScpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluR29Nb2QpIHtcbiAgICAgIG5hbWVzLnB1c2goJ2dvJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYCR7cGF0aC5iYXNlbmFtZShjb25maWcuZGlyUGF0aCl9XG5gO1xuICAgIH1cbiAgICAvLyBFdmVyeSBhY2NlcHRlZCByZXBvc2l0b3J5IHJvb3QgcmVjZWl2ZXMgYSBtYW5hZ2VkIHBhY2thZ2UuanNvbiBsYXRlciBpbiB0aGUgc2FtZSBydW4sIHNvIGl0c1xuICAgIC8vIGRlcGVuZGVuY3kgdHJlZSBtdXN0IGJlIGlnbm9yZWQgZXZlbiB3aGVuIHRoZSBtYW5pZmVzdCBkaWQgbm90IGV4aXN0IGF0IGNvbmZpZy1kZXRlY3Rpb24gdGltZS5cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24gfHwgY29uZmlnLmlzUm9vdCkge1xuICAgICAgbmFtZXMucHVzaCgnbm9kZScpO1xuICAgIH1cbiAgICAvLyBSZWN1cnNpdmUgZGV0ZWN0aW9uIChub3QganVzdCBhIHJvb3QgcG9tLnhtbCk6IGEgbXVsdGktbGFuZ3VhZ2UgcmVwb3NpdG9yeSBrZWVwcyBpdHMgTWF2ZW5cbiAgICAvLyBtb2R1bGVzIGluIHN1YmRpcmVjdG9yaWVzLCBhbmQgZHJvcHBpbmcgdGhlIG1hdmVuIHRlbXBsYXRlIHdvdWxkIGxldCB0YXJnZXQvIGdldCB0cmFja2VkLlxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb21YbWxBbnl3aGVyZSkge1xuICAgICAgbmFtZXMucHVzaCgnbWF2ZW4nKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLmlkZWEvZ29vZ2xlLWphdmEtZm9ybWF0LnhtbFxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBuYW1lcy5wdXNoKCdmbHV0dGVyJywgJ0FuZHJvaWRTdHVkaW8nLCAncnVieScpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuZmx1dHRlci1wbHVnaW5zLWRlcGVuZGVuY2llc1xuYW5kcm9pZC9rZXkucHJvcGVydGllc1xuaW9zLy5idW5kbGVcbi5pZGVhL3J1bkNvbmZpZ3VyYXRpb25zLnhtbFxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblRlbXBsYXRlWWFtbCkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuYXdzLXNhbS9cbnBhY2thZ2VkLnlhbWxcbmA7XG4gICAgfVxuICAgIC8vIEJlY2F1c2UgLnZlbnYgc2hvdWxkIGJlIGlnbm9yZWQgb24gcm9vdCBkaXJlY3RvcnkuIFJlY3Vyc2l2ZSBkZXRlY3Rpb24gKG5vdCBqdXN0IGEgcm9vdFxuICAgIC8vIGxvY2tmaWxlKTogYSBtdWx0aS1sYW5ndWFnZSByZXBvc2l0b3J5IGtlZXBzIFB5dGhvbiBkaXJlY3RvcmllcyBpbiBzdWJkaXJlY3RvcmllcywgYW5kXG4gICAgLy8gZHJvcHBpbmcgdGhlIHB5dGhvbiB0ZW1wbGF0ZSB3b3VsZCBsZXQgX19weWNhY2hlX18vIGFuZCAudmVudi8gZ2V0IHRyYWNrZWQuXG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB5dGhvbkxvY2tBbnl3aGVyZSkge1xuICAgICAgbmFtZXMucHVzaCgncHl0aG9uJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC52ZW52L1xuYDtcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eikge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuYmxpdHovXG4uYmxpdHoqKlxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgbmFtZXMucHVzaCgnbmV4dGpzJyk7XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5maXJlYmFzZSB8fCBjb25maWcuZGVwZW5kaW5nLmZpcmViYXNlKSB7XG4gICAgICBuYW1lcy5wdXNoKCdmaXJlYmFzZScpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEgfHwgY29uZmlnLmRlcGVuZGluZy5kcml6emxlKSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYCouc3FsaXRlMypcbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRUZXN0KSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYHBsYXl3cmlnaHQtcmVwb3J0L1xudGVzdC1yZXN1bHRzL1xuYDtcbiAgICB9XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlIHx8IGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICAgIG5hbWVzLnB1c2goJ3JlYWN0bmF0aXZlJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYGdvb2dsZS1zZXJ2aWNlcy5qc29uXG5hbmRyb2lkL2FwcC9zcmMvbWFpbi9hc3NldHMvXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5zdG9yeWJvb2spIHtcbiAgICAgIG5hbWVzLnB1c2goJ3N0b3J5Ym9va2pzJyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnRhdXJpKSB7XG4gICAgICBuYW1lcy5wdXNoKCdydXN0Jyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5UYXVyaUNvbmZpZykge1xuICAgICAgLy8gIUNhcmdvLmxvY2sgb3ZlcnJpZGVzIGFueSBwcmUtZXhpc3RpbmcgdW5hbmNob3JlZCBDYXJnby5sb2NrIHJ1bGUgZnJvbSBhXG4gICAgICAvLyBwYXJlbnQgLmdpdGlnbm9yZSwgc28gdGhlIGFwcGxpY2F0aW9uIGxvY2tmaWxlIHN0YXlzIGNvbW1pdHRhYmxlLlxuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAhQ2FyZ28ubG9ja1xuc3JjLXRhdXJpL2dlbi9zY2hlbWFzL1xuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubGl0ZXN0cmVhbSkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGBnY3Atc2Eta2V5Lmpzb25cbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuaXNDbG91ZGZsYXJlIHx8IHJvb3RDb25maWcuaXNDbG91ZGZsYXJlKSB7XG4gICAgICAvLyAuZGV2LnZhcnMqIGhvbGQgbG9jYWwgc2VjcmV0cyBmb3Igd3JhbmdsZXIgZGV2IGFuZCBtdXN0IG5ldmVyIGJlIGNvbW1pdHRlZC5cbiAgICAgIC8vIC5lbnYuY2xvdWRmbGFyZSBjYXJyaWVzIENMT1VERkxBUkVfQVBJX1RPS0VOOiBDSSB3cml0ZXMgaXQgZnJvbSBhIHNlY3JldCwgYW5kIGEgbG9jYWxcbiAgICAgIC8vIGB3YiBkZXBsb3lgIG5lZWRzIGEgcmVhbCB0b2tlbiBpbiBpdCwgc28gY29tbWl0dGluZyBpdCB3b3VsZCBsZWFrIGFjY291bnQgY3JlZGVudGlhbHMuXG4gICAgICAvLyBJdCBpcyBsaXN0ZWQgZXhwbGljaXRseSBzbyB0aGUgQ2xvdWRmbGFyZS1zcGVjaWZpYyBjcmVkZW50aWFsIHBvbGljeSByZW1haW5zIHZpc2libGUuXG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5kZXYudmFycypcbi5lbnYuY2xvdWRmbGFyZVxuLndyYW5nbGVyL1xuYDtcbiAgICB9XG4gICAgLy8gSWdub3JlZCBvbmx5IHdoZXJlIHBvc3RpbnN0YWxsIHJlZ2VuZXJhdGVzIGl0LCBzbyB3YmZ5IG5ldmVyIGlnbm9yZXMgYSBmaWxlIHRoYXQgbm90aGluZyByZWNyZWF0ZXMuIFRoaXMga2VlcHNcbiAgICAvLyBpdHMgdGhvdXNhbmRzIG9mIGxpbmVzIG91dCBvZiBldmVyeSB3cmFuZ2xlciBidW1wJ3MgZGlmZi4gQW5jaG9yZWQgd2l0aCBhIGxlYWRpbmcgc2xhc2ggYmVjYXVzZSBgd3JhbmdsZXIgdHlwZXNgXG4gICAgLy8gYW5kIHRoZSBvcHQtb3V0IGRlbGV0aW9uIGJlbG93IG9ubHkgZXZlciB0b3VjaCB0aGlzIHBhY2thZ2UncyBvd24gZmlsZSwgbm90IGEgbmVzdGVkIG9uZSBhdCBhbnkgZGVwdGguXG4gICAgaWYgKGdlbmVyYXRlc1dvcmtlclR5cGVzKGNvbmZpZykpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgL3dvcmtlci1jb25maWd1cmF0aW9uLmQudHNcbmA7XG4gICAgfSBlbHNlIGlmIChjb25maWcuZG9lc0NvbnRhaW5XcmFuZ2xlckNvbmZpZyAmJiAhY29uc3VtZXNHZW5lcmF0ZWRXb3JrZXJUeXBlcyhjb25maWcpKSB7XG4gICAgICAvLyBPbiBhIGdlbnVpbmUgd29ya2VyLXR5cGVzIG9wdC1vdXQgKG5vdGhpbmcgY29uc3VtZXMgdGhlIGdlbmVyYXRlZCBmaWxlOyBnZW5lcmF0ZXNXb3JrZXJUeXBlc1xuICAgICAgLy8gYWxvbmUgaXMgZmFsc2UgZm9yIHVucmVsYXRlZCByZWFzb25zIHN1Y2ggYXMgYSBtaXNzaW5nIGxvY2FsIHdyYW5nbGVyIGRlcGVuZGVuY3ksIHdoZXJlIHRoZVxuICAgICAgLy8gZmlsZSBtYXkgc3RpbGwgYmUgY29uc3VtZWQpIHRoZSBpZ25vcmUgcnVsZVxuICAgICAgLy8gYWJvdmUgZGlzYXBwZWFycywgc28gYW4gYWxyZWFkeS1nZW5lcmF0ZWQgZmlsZSB3b3VsZCBzdXJmYWNlIGFzIHVudHJhY2tlZCBub2lzZSBvbiBldmVyeVxuICAgICAgLy8gY2hlY2tvdXQg4oCUIGRlbGV0ZSBpdC4gTm8gcmVwb3NpdG9yeSB0cmFja3MgdGhlIGZpbGUgKGRvY3MvZXhwZWN0ZWQtcmVwb3NpdG9yeS1ydWxlcy5tZCksXG4gICAgICAvLyBzbyBhbiBleGlzdGluZyBjb3B5IGlzIGFsd2F5cyBhIGRpc3Bvc2FibGUgZ2VuZXJhdGVkIG9uZS5cbiAgICAgIGNvbnN0IHdvcmtlclR5cGVzUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3dvcmtlci1jb25maWd1cmF0aW9uLmQudHMnKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKHdvcmtlclR5cGVzUGF0aCkpIHtcbiAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHdvcmtlclR5cGVzUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy52aW5leHQgfHwgY29uZmlnLmRlcGVuZGluZy52aW5leHQpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLnZpbmV4dC9cbmA7XG4gICAgfVxuXG4gICAgbGV0IGdlbmVyYXRlZCA9ICcnO1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykge1xuICAgICAgbGV0IGNvbnRlbnQgPSAoYXdhaXQgcmVhZENhY2hlKG5hbWUpKSA/PyAnJztcbiAgICAgIGlmICghY29udGVudCkge1xuICAgICAgICBjb25zdCB1cmwgPSBgaHR0cHM6Ly93d3cudG9wdGFsLmNvbS9kZXZlbG9wZXJzL2dpdGlnbm9yZS9hcGkvJHtuYW1lfWA7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsKTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2VUZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgICBpZiAoIXJlc3BvbnNlLm9rIHx8IHJlc3BvbnNlVGV4dC5pbmNsdWRlcygnQXR0ZW50aW9uIFJlcXVpcmVkIScpIHx8IHJlc3BvbnNlVGV4dC5pbmNsdWRlcygnPHRpdGxlPicpKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGZldGNoICR7dXJsfWApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb250ZW50ID0gcmVzcG9uc2VUZXh0LnRyaW0oKTtcbiAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IHdyaXRlQ2FjaGUobmFtZSwgY29udGVudCkpO1xuICAgICAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oYEZldGNoZWQgJHt1cmx9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChnZW5lcmF0ZWQpIGdlbmVyYXRlZCArPSAnXFxuJztcbiAgICAgIGdlbmVyYXRlZCArPSBjb250ZW50ICsgJ1xcbic7XG4gICAgfVxuICAgIGlmICghKGF3YWl0IGlnbm9yZUZpbGVVdGlsLmlzQmVycnlaZXJvSW5zdGFsbEVuYWJsZWQoZmlsZVBhdGgpKSkge1xuICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2UoJyEueWFybi9jYWNoZScsICcjICEueWFybi9jYWNoZScpLnJlcGxhY2UoJyMgLnBucC4qJywgJy5wbnAuKicpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9tWG1sQW55d2hlcmUgfHwgY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZFxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9hcnRpZmFjdHMkL2dtLCAnLmlkZWEvYXJ0aWZhY3RzJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvY29tcGlsZXIueG1sJC9nbSwgJy5pZGVhL2NvbXBpbGVyLnhtbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL2phclJlcG9zaXRvcmllcy54bWwkL2dtLCAnLmlkZWEvamFyUmVwb3NpdG9yaWVzLnhtbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL21vZHVsZXMueG1sJC9nbSwgJy5pZGVhL21vZHVsZXMueG1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvKi5pbWwkL2dtLCAnLmlkZWEvKi5pbWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9tb2R1bGVzJC9nbSwgJy5pZGVhL21vZHVsZXMnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgKi5pbWwkL2dtLCAnKi5pbWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgKi5pcHIkL2dtLCAnKi5pcHInKTtcbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZUFsbCgvXi5pZGVhXFwvbW9kdWxlcy54bWwkL2dtLCAnIyAuaWRlYS9tb2R1bGVzLnhtbCcpO1xuICAgICAgfVxuICAgIH1cbiAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZUFsbCgvXi5pZGVhXFwvPyQvZ20sICcjIC5pZGVhJyk7XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcudGF1cmkpIHtcbiAgICAgIC8vIFRoZSBydXN0IHRlbXBsYXRlJ3MgdW5hbmNob3JlZCBkZWJ1Zy8gd291bGQgYWxzbyBoaWRlIGZyb250ZW5kIHNvdXJjZVxuICAgICAgLy8gZGlyZWN0b3JpZXMgc3VjaCBhcyBzcmMvZGVidWcvOyBjYXJnbyBvdXRwdXQgaXMgYWxyZWFkeSBjb3ZlcmVkIGJ5IHRhcmdldC8uXG4gICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZUFsbCgvXmRlYnVnXFwvJC9nbSwgJyMgZGVidWcvJyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5UYXVyaUNvbmZpZyB8fCBjb25maWcuZG9lc0NvbnRhaW5UYXVyaUNvbmZpZ0luUGFja2FnZXMpIHtcbiAgICAgIC8vIFRoZSBydXN0IHRlbXBsYXRlIGlnbm9yZXMgQ2FyZ28ubG9jaywgYnV0IGEgc3JjLXRhdXJpIGNvbmZpZ3VyYXRpb24gbWFya3MgYW5cbiAgICAgIC8vIGFwcGxpY2F0aW9uLCB3aG9zZSBDYXJnby5sb2NrIG11c3QgYmUgY29tbWl0dGVkIGZvciByZXByb2R1Y2libGUgYnVpbGRzLiBUaGVcbiAgICAgIC8vIHJ1bGUgaXMgYWxzbyBkaXNhYmxlZCB3aGVuIGEgc3ViIHBhY2thZ2UgY29udGFpbnMgYSBUYXVyaSBhcHBsaWNhdGlvbiwgYmVjYXVzZVxuICAgICAgLy8gYW4gdW5hbmNob3JlZCBDYXJnby5sb2NrIHJ1bGUgaW4gYSBwYXJlbnQgLmdpdGlnbm9yZSB3b3VsZCBoaWRlIHRoZSBuZXN0ZWRcbiAgICAgIC8vIGFwcGxpY2F0aW9uJ3MgbG9ja2ZpbGUuIFRhdXJpIHBsdWdpbiBsaWJyYXJpZXMgKGRldGVjdGVkIG9ubHkgdmlhXG4gICAgICAvLyBAdGF1cmktYXBwcy8qIGRlcGVuZGVuY2llcykga2VlcCB0aGUgdGVtcGxhdGUncyBwb2xpY3kgb2YgaWdub3JpbmcgQ2FyZ28ubG9jay5cbiAgICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZC5yZXBsYWNlQWxsKC9eQ2FyZ29cXC5sb2NrJC9nbSwgJyMgQ2FyZ28ubG9jaycpO1xuICAgIH1cbiAgICBpZiAocm9vdENvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUgfHwgY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSB8fCBjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2VBbGwoL14oLmlkZWFcXC8uKykkL2dtLCAnJDFcXG5hbmRyb2lkLyQxJyk7XG4gICAgfVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBoZWFkVXNlckNvbnRlbnQgKyAnXFxuJyArIGdlbmVyYXRlZCArIHRhaWxVc2VyQ29udGVudDtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuY29uc3QgZGlyUGF0aCA9IHBhdGguam9pbihvcy5ob21lZGlyKCksICcuY2FjaGUnLCAnd2JmeScsICdnaXRpZ25vcmUnKTtcblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVDYWNoZShuYW1lOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihkaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGguam9pbihkaXJQYXRoLCBuYW1lKSwgY29udGVudCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRDYWNoZShuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IHN0YXQgPSBhd2FpdCBmcy5wcm9taXNlcy5zdGF0KHBhdGguam9pbihkaXJQYXRoLCBuYW1lKSk7XG4gICAgaWYgKERhdGUubm93KCkgLSBzdGF0Lm10aW1lTXMgPiA2ICogNjAgKiA2MCAqIDEwMDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHBhdGguam9pbihkaXJQYXRoLCBuYW1lKSwgJ3V0ZjgnKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IGZpbGVVUkxUb1BhdGggfSBmcm9tICdub2RlOnVybCc7XG5cbi8qKlxuICogVGhlIHZlcnNpb24gd2JmeSdzIG93biBwYWNrYWdlLmpzb24gY2FycmllcyBpbiB0aGUgcmVwb3NpdG9yeS4gYEBzZW1hbnRpYy1yZWxlYXNlL25wbWAgcmV3cml0ZXNcbiAqIGl0IGluIHRoZSBwdWJsaXNoZWQgdGFyYmFsbCBvbmx5IChpdCBpcyBuZXZlciBjb21taXR0ZWQgYmFjayksIHNvIGEgd2JmeSBydW4gc3RhcnRlZCBmcm9tIGEgZ2l0XG4gKiBjaGVja291dCByZXBvcnRzIHRoaXMgcGxhY2Vob2xkZXIgaW5zdGVhZCBvZiBhIHJlYWwgdmVyc2lvbi5cbiAqL1xuY29uc3QgdW5yZWxlYXNlZFZlcnNpb25QcmVmaXggPSAnMC4wLjAtJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFdiZnlWZXJzaW9uKCk6IHN0cmluZyB7XG4gIHJldHVybiByZWFkV2JmeVBhY2thZ2VKc29uKCkudmVyc2lvbjtcbn1cblxuLyoqIHdiZnkncyBsb2NhdGlvbiBpbnNpZGUgaXRzIG93biByZXBvc2l0b3J5LCByZWxhdGl2ZSB0byB0aGUgcmVwb3NpdG9yeSByb290LiAqL1xuY29uc3Qgd2JmeURpclBhdGhJblJlcG8gPSBwYXRoLmpvaW4oJ3BhY2thZ2VzJywgJ3diZnknKTtcblxuLyoqXG4gKiBJZGVudGlmaWVzIHRoZSB3YmZ5IGJ1aWxkIHRoYXQgcHJvZHVjZWQgdGhlIGdlbmVyYXRlZCBmaWxlczogdGhlIHJlbGVhc2VkIHZlcnNpb24sIG9yXG4gKiBgPHNob3J0IGNvbW1pdCBoYXNoPlstZGlydHldLWxvY2FsYCB3aGVuIHdiZnkgcnVucyBmcm9tIGl0cyBvd24gZ2l0IGNoZWNrb3V0LiBVbmRlZmluZWQgd2hlblxuICogbmVpdGhlciBpcyBhdmFpbGFibGUgKGUuZy4gYW4gdW5yZWxlYXNlZCBidWlsZCBleHRyYWN0ZWQgZnJvbSBhIHNvdXJjZSBhcmNoaXZlKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFdiZnlWZXJzaW9uTGFiZWwoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgLy8gTmVpdGhlciB0aGUgaW5zdGFsbGVkIHBhY2thZ2UuanNvbiBub3IgdGhlIGdpdCBzdGF0ZSBvZiB3YmZ5J3Mgb3duIGNoZWNrb3V0IGNhbiBjaGFuZ2VcbiAgLy8gbWlkLXJ1biwgYW5kIGNvbXB1dGluZyB0aGUgbGFiZWwgc3Bhd25zIHNldmVyYWwgZ2l0IHN1YnByb2Nlc3Nlcywgc28gaXQgaXMgY29tcHV0ZWQgb25jZS5cbiAgaWYgKCFoYXNDb21wdXRlZFZlcnNpb25MYWJlbCkge1xuICAgIGNhY2hlZFZlcnNpb25MYWJlbCA9IGNvbXB1dGVXYmZ5VmVyc2lvbkxhYmVsKCk7XG4gICAgaGFzQ29tcHV0ZWRWZXJzaW9uTGFiZWwgPSB0cnVlO1xuICB9XG4gIHJldHVybiBjYWNoZWRWZXJzaW9uTGFiZWw7XG59XG5cbmxldCBoYXNDb21wdXRlZFZlcnNpb25MYWJlbCA9IGZhbHNlO1xubGV0IGNhY2hlZFZlcnNpb25MYWJlbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBjb21wdXRlV2JmeVZlcnNpb25MYWJlbCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCB7IG5hbWUsIHZlcnNpb24sIGRpclBhdGggfSA9IHJlYWRXYmZ5UGFja2FnZUpzb24oKTtcbiAgaWYgKCF2ZXJzaW9uLnN0YXJ0c1dpdGgodW5yZWxlYXNlZFZlcnNpb25QcmVmaXgpKSByZXR1cm4gdmVyc2lvbjtcblxuICAvLyBnaXQgcmVzb2x2ZXMgdGhlIE5FQVJFU1QgZW5jbG9zaW5nIHJlcG9zaXRvcnksIHdoaWNoIGZvciBhbiB1bnJlbGVhc2VkIGJ1aWxkIHBsYWNlZCB1bmRlciBhXG4gIC8vIHRhcmdldCByZXBvc2l0b3J5IChub2RlX21vZHVsZXMsIG9yIGEgdmVuZG9yZWQvZXh0cmFjdGVkIHNvdXJjZSB0cmVlKSBpcyB0aGF0IHJlcG9zaXRvcnkg4oCUIGl0c1xuICAvLyBjb21taXQgc2F5cyBub3RoaW5nIGFib3V0IHRoZSB3YmZ5IGJ1aWxkIHRoYXQgcmFuLiBPbmx5IHdiZnkncyBvd24gbG9jYXRpb24gaW5zaWRlIGl0cyBvd25cbiAgLy8gcmVwb3NpdG9yeSBpZGVudGlmaWVzIGEgZ2VudWluZSBjaGVja291dCwgc28gYW55dGhpbmcgZWxzZSBmYWxscyBiYWNrIHRvIHRoZSB2ZXJzaW9uLWxlc3MgbGFiZWwuXG4gIGNvbnN0IGdpdFJvb3REaXJQYXRoID0gcnVuR2l0KFsncmV2LXBhcnNlJywgJy0tc2hvdy10b3BsZXZlbCddLCBkaXJQYXRoKTtcbiAgaWYgKFxuICAgICFnaXRSb290RGlyUGF0aCB8fFxuICAgIHBhdGgucmVsYXRpdmUoZ2l0Um9vdERpclBhdGgsIGRpclBhdGgpICE9PSB3YmZ5RGlyUGF0aEluUmVwbyB8fFxuICAgICFpc1diZnlSZXBvc2l0b3J5KGdpdFJvb3REaXJQYXRoKVxuICApIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGNvbnN0IGNvbW1pdEhhc2ggPSBydW5HaXQoWydyZXYtcGFyc2UnLCAnLS1zaG9ydD04JywgJ0hFQUQnXSwgZGlyUGF0aCk7XG4gIGlmICghY29tbWl0SGFzaCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgLy8gVGhlIGNvbW1pdCBhbG9uZSB3b3VsZCBtaXNpZGVudGlmeSBhIGJ1aWxkIG1hZGUgZnJvbSBhbiBlZGl0ZWQgY2hlY2tvdXQsIHNvIHVuY29tbWl0dGVkIGNoYW5nZXNcbiAgLy8gYXJlIHJlcG9ydGVkIHRvbyDigJQgYnV0IG9ubHkgdW5kZXIgcGFja2FnZXMvKi9zcmMsIHBhY2thZ2VzLyovYmluIGFuZCBwYWNrYWdlcy8qL2NvbmZpZ3MsIHRoZVxuICAvLyBzb3VyY2UsIGVudHJ5LXBvaW50IHdyYXBwZXIgYW5kIHBvbGljeSBmaWxlcyB3YmZ5IGFuZCBpdHMgd29ya3NwYWNlIGRlcGVuZGVuY2llcyBhY3R1YWxseSBydW5cbiAgLy8gZnJvbS4gRXZlcnl0aGluZyB3YmZ5IEdFTkVSQVRFUyB3aGVuIGl0IHRhcmdldHMgaXRzIG93biByZXBvc2l0b3J5IGxpdmVzIG91dHNpZGUgdGhvc2UgKHRoZVxuICAvLyByb290IFJFQURNRSB0aGlzIGxhYmVsIGdvZXMgaW50bywgYW5kIGVhY2ggcGFja2FnZSdzIC5naXRpZ25vcmUsIHBhY2thZ2UuanNvbiwgdHNjb25maWcsIOKApiksIHNvXG4gIC8vIGEgZmlyc3QgcnVuIGNhbm5vdCBtYWtlIHRoZSBuZXh0IG9uZSByZWxhYmVsIHRoZSBiYWRnZSBgLWRpcnR5LWxvY2FsYCBieSBpdHNlbGYuXG4gIC8vIE1hbmlmZXN0cyBzdGF5IG91dCBvbiBwdXJwb3NlLCBldmVuIHRob3VnaCBhbiBlZGl0ZWQgYGV4cG9ydHNgIG1hcCBjYW4gcmVkaXJlY3Qgd2hpY2ggY29kZVxuICAvLyBsb2Fkczogd2JmeSBHRU5FUkFURVMgcGFja2FnZS5qc29uLCBzbyBpbmNsdWRpbmcgaXQgd291bGQgbWFrZSBldmVyeSBydW4gcmVwb3J0IGl0c2VsZiBkaXJ0eS5cbiAgLy8gVGhlIGxhYmVsIGlzIGJlc3QtZWZmb3J0IGJ1aWxkIHByb3ZlbmFuY2UsIG5vdCBhIHJlcHJvZHVjaWJsZS1idWlsZCBhdHRlc3RhdGlvbi5cbiAgY29uc3QgaXNEaXJ0eSA9IGdldEdpdERpcnR5U3RhdGUoZ2l0Um9vdERpclBhdGgpO1xuICBpZiAoaXNEaXJ0eSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAoaXNEaXJ0eSkgcmV0dXJuIGAke2NvbW1pdEhhc2h9LWRpcnR5LWxvY2FsYDtcbiAgLy8gQW4gdW5tb2RpZmllZCBjaGVja291dCBzaXR0aW5nIG9uIGEgcmVsZWFzZSB0YWcgcnVucyBleGFjdGx5IHRoZSBjb2RlIHRoYXQgd2FzIHB1Ymxpc2hlZCB1bmRlclxuICAvLyB0aGF0IHZlcnNpb24sIHNvIGl0IGlzIGxhYmVsZWQgd2l0aCB0aGUgdmVyc2lvbiBpbnN0ZWFkIG9mIHRoZSBjb21taXQgdGhhdCBvbmx5IHdiZnkgZGV2ZWxvcGVyc1xuICAvLyBjb3VsZCByZXNvbHZlIGJhY2sgdG8gb25lLlxuICByZXR1cm4gZmluZFJlbGVhc2VkVmVyc2lvbkF0SGVhZChuYW1lLCBkaXJQYXRoKSA/PyBgJHtjb21taXRIYXNofS1sb2NhbGA7XG59XG5cbi8qKiBgQHNlbWFudGljLXJlbGVhc2UvbnBtYCB0YWdzIGVhY2ggcmVsZWFzZSBgPHBhY2thZ2UgbmFtZT5APHZlcnNpb24+YC4gKi9cbmZ1bmN0aW9uIGZpbmRSZWxlYXNlZFZlcnNpb25BdEhlYWQocGFja2FnZU5hbWU6IHN0cmluZywgY3dkOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCB0YWdQcmVmaXggPSBgJHtwYWNrYWdlTmFtZX1AYDtcbiAgLy8gQSBjb21taXQgY2FycmllcyBhdCBtb3N0IG9uZSByZWxlYXNlIHRhZyBwZXIgcGFja2FnZSwgc28gdGhlIGZpcnN0IG1hdGNoIGlzIHRoZSBvbmx5IG1hdGNoLlxuICByZXR1cm4gcnVuR2l0KFsndGFnJywgJy0tcG9pbnRzLWF0JywgJ0hFQUQnXSwgY3dkKVxuICAgID8uc3BsaXQoJ1xcbicpXG4gICAgLmZpbmQoKHRhZykgPT4gdGFnLnN0YXJ0c1dpdGgodGFnUHJlZml4KSlcbiAgICA/LnNsaWNlKHRhZ1ByZWZpeC5sZW5ndGgpO1xufVxuXG5mdW5jdGlvbiBpc1diZnlSZXBvc2l0b3J5KGdpdFJvb3REaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgLy8gRXZlcnkgcmVtb3RlIGNvdW50cywgbm90IGp1c3QgYG9yaWdpbmA6IGEgZm9yayBjaGVja291dCBjYXJyaWVzIHRoZSBjYW5vbmljYWwgcmVwb3NpdG9yeSBhc1xuICAvLyBgdXBzdHJlYW1gLCBhbmQgaXQgaXMgc3RpbGwgYSBnZW51aW5lIHdiZnkgY2hlY2tvdXQgd2hvc2UgY29tbWl0IGlkZW50aWZpZXMgdGhlIGJ1aWxkLlxuICBjb25zdCByZW1vdGVVcmxzID0gcnVuR2l0KFsncmVtb3RlJywgJy12J10sIGdpdFJvb3REaXJQYXRoKTtcbiAgcmV0dXJuICEhcmVtb3RlVXJscz8uc3BsaXQoJ1xcbicpLnNvbWUoKGxpbmUpID0+IGlzQ2Fub25pY2FsUmVtb3RlVXJsKGxpbmUuc3BsaXQoL1sgXFx0XSsvdSlbMV0gPz8gJycpKTtcbn1cblxuY29uc3QgY2Fub25pY2FsUmVwb3NpdG9yeVBhdGggPSAvXlxcLz9XaWxsQm9vc3RlclxcL3NoYXJlZCg/OlxcLmdpdCk/JC9pdTtcblxuLyoqXG4gKiBXaGV0aGVyIHRoZSByZW1vdGUgVVJMIHBvaW50cyBhdCB3YmZ5J3Mgb3duIHJlcG9zaXRvcnkuIFRoZSBob3N0IGlzIGNvbXBhcmVkIGFmdGVyIFBBUlNJTkcgcmF0aGVyXG4gKiB0aGFuIG1hdGNoZWQgaW5zaWRlIHRoZSBzdHJpbmc6IGFueSBwYXR0ZXJuIGxvb3NlIGVub3VnaCB0byBhY2NlcHQgZXZlcnkgVVJMIGZvcm0gZ2l0IHN1cHBvcnRzXG4gKiBhbHNvIGFjY2VwdGVkIGEgbG9va2FsaWtlIHRoYXQgbWVyZWx5IGNvbnRhaW5zIHRoZSBob3N0LCBzdWNoIGFzXG4gKiBgaHR0cHM6Ly9ldmlsLmV4YW1wbGUvL2dpdGh1Yi5jb20vV2lsbEJvb3N0ZXIvc2hhcmVkLmdpdGAsIGxldHRpbmcgYW4gdW5yZWxhdGVkIGNoZWNrb3V0IGNsYWltIHRvXG4gKiBiZSBhIGdlbnVpbmUgd2JmeSBidWlsZC5cbiAqL1xuZnVuY3Rpb24gaXNDYW5vbmljYWxSZW1vdGVVcmwodXJsOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgLy8gc2NwLXN0eWxlIChgZ2l0QGdpdGh1Yi5jb206V2lsbEJvb3N0ZXIvc2hhcmVkLmdpdGApIGlzIG5vdCBhIFVSTCwgc28gaXQgaXMgbWF0Y2hlZCBzZXBhcmF0ZWx5LlxuICAvLyBUaGUgbG9va2FoZWFkIGtlZXBzIGEgc2NoZW1lJ3MgYDovL2AgZnJvbSBiZWluZyByZWFkIGFzIHRoZSBgaG9zdDpwYXRoYCBzZXBhcmF0b3IuXG4gIGNvbnN0IHNjcE1hdGNoID0gL14oPzpbXkAvXStAKT8oW14vOl0rKTooPyFcXC8pKC4qKSQvdS5leGVjKHVybCk7XG4gIGlmIChzY3BNYXRjaCkge1xuICAgIHJldHVybiBzY3BNYXRjaFsxXSEudG9Mb3dlckNhc2UoKSA9PT0gJ2dpdGh1Yi5jb20nICYmIGNhbm9uaWNhbFJlcG9zaXRvcnlQYXRoLnRlc3Qoc2NwTWF0Y2hbMl0hKTtcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IHsgaG9zdG5hbWUsIHBhdGhuYW1lIH0gPSBuZXcgVVJMKHVybCk7XG4gICAgcmV0dXJuIGhvc3RuYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdnaXRodWIuY29tJyAmJiBjYW5vbmljYWxSZXBvc2l0b3J5UGF0aC50ZXN0KHBhdGhuYW1lKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldEdpdERpcnR5U3RhdGUoZ2l0Um9vdERpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICBjb25zdCBwcm9jID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoXG4gICAgJ2dpdCcsXG4gICAgW1xuICAgICAgJ3N0YXR1cycsXG4gICAgICAnLS1wb3JjZWxhaW4nLFxuICAgICAgJy0tdW50cmFja2VkLWZpbGVzPWFsbCcsXG4gICAgICAnLS0nLFxuICAgICAgYDooZ2xvYikke3BhdGguZGlybmFtZSh3YmZ5RGlyUGF0aEluUmVwbyl9Lyovc3JjLyoqYCxcbiAgICAgIGA6KGdsb2IpJHtwYXRoLmRpcm5hbWUod2JmeURpclBhdGhJblJlcG8pfS8qL2Jpbi8qKmAsXG4gICAgICBgOihnbG9iKSR7cGF0aC5kaXJuYW1lKHdiZnlEaXJQYXRoSW5SZXBvKX0vKi9jb25maWdzLyoqYCxcbiAgICBdLFxuICAgIHsgY3dkOiBnaXRSb290RGlyUGF0aCwgZW5jb2Rpbmc6ICd1dGY4Jywgc3RkaW86ICdwaXBlJyB9XG4gICk7XG4gIHJldHVybiBwcm9jLnN0YXR1cyA9PT0gMCA/ICEhcHJvYy5zdGRvdXQudHJpbSgpIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBydW5HaXQoYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcHJvYyA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKCdnaXQnLCBhcmdzLCB7IGN3ZCwgZW5jb2Rpbmc6ICd1dGY4Jywgc3RkaW86ICdwaXBlJyB9KTtcbiAgcmV0dXJuIHByb2Muc3RhdHVzID09PSAwID8gcHJvYy5zdGRvdXQudHJpbSgpIHx8IHVuZGVmaW5lZCA6IHVuZGVmaW5lZDtcbn1cblxubGV0IGNhY2hlZFdiZnlQYWNrYWdlSnNvbjogeyBuYW1lOiBzdHJpbmc7IHZlcnNpb246IHN0cmluZzsgZGlyUGF0aDogc3RyaW5nIH0gfCB1bmRlZmluZWQ7XG5cbi8qKiBSZXR1cm5zIHdiZnkncyBvd24gcGFja2FnZSBkaXJlY3RvcnksIHdoaWNoIGFsc28gaG9sZHMgaXRzIGNvbmZpZ3MgKGUuZy4gcmVsZWFzZUFnZUdhdGUuanNvbikuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0V2JmeURpclBhdGgoKTogc3RyaW5nIHtcbiAgcmV0dXJuIHJlYWRXYmZ5UGFja2FnZUpzb24oKS5kaXJQYXRoO1xufVxuXG5mdW5jdGlvbiByZWFkV2JmeVBhY2thZ2VKc29uKCk6IHsgbmFtZTogc3RyaW5nOyB2ZXJzaW9uOiBzdHJpbmc7IGRpclBhdGg6IHN0cmluZyB9IHtcbiAgaWYgKGNhY2hlZFdiZnlQYWNrYWdlSnNvbikgcmV0dXJuIGNhY2hlZFdiZnlQYWNrYWdlSnNvbjtcbiAgLy8gZmlsZVVSTFRvUGF0aCwgbm90IFVSTC5wYXRobmFtZTogdGhlIGxhdHRlciBrZWVwcyBwZXJjZW50LWVuY29kaW5nLCBzbyBhbiBpbnN0YWxsYXRpb24gcGF0aFxuICAvLyBjb250YWluaW5nIGUuZy4gYSBzcGFjZSB3b3VsZCByZXNvbHZlIHRvIGEgbm9uZXhpc3RlbnQgZGlyZWN0b3J5IGFuZCB0aGUgc2VhcmNoIHdvdWxkIHdhbGsgdXBcbiAgLy8gdG8gYW4gdW5yZWxhdGVkIHBhY2thZ2UuXG4gIGxldCBkaXJQYXRoID0gcGF0aC5kaXJuYW1lKGZpbGVVUkxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKSk7XG4gIHdoaWxlICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgIGNvbnN0IHBhcmVudERpclBhdGggPSBwYXRoLmRpcm5hbWUoZGlyUGF0aCk7XG4gICAgLy8gcGF0aC5kaXJuYW1lKCcvJykgPT09ICcvJywgc28gdGhlIHNlYXJjaCBtdXN0IHN0b3AgZXhwbGljaXRseSBhdCB0aGUgZmlsZXN5c3RlbSByb290LlxuICAgIGlmIChwYXJlbnREaXJQYXRoID09PSBkaXJQYXRoKSB0aHJvdyBuZXcgRXJyb3IoXCJ3YmZ5J3Mgb3duIHBhY2thZ2UuanNvbiBpcyBtaXNzaW5nLlwiKTtcbiAgICBkaXJQYXRoID0gcGFyZW50RGlyUGF0aDtcbiAgfVxuICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJyksICd1dGY4JykpIGFzIHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgdmVyc2lvbjogc3RyaW5nO1xuICB9O1xuICBjYWNoZWRXYmZ5UGFja2FnZUpzb24gPSB7IG5hbWU6IHBhY2thZ2VKc29uLm5hbWUsIHZlcnNpb246IHBhY2thZ2VKc29uLnZlcnNpb24sIGRpclBhdGggfTtcbiAgcmV0dXJuIGNhY2hlZFdiZnlQYWNrYWdlSnNvbjtcbn1cbiIsImltcG9ydCB7IHNwYXduU3luYyB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBnZXRXYmZ5RGlyUGF0aCB9IGZyb20gJy4uL3V0aWxzL3ZlcnNpb24uanMnO1xuXG4vKipcbiAqIEFwcGxpZXMgdGhlIG9yZ2FuaXphdGlvbidzIG1pbmltdW0tcmVsZWFzZS1hZ2UgcG9saWN5IHRvIHRoZSBkZXZlbG9wZXIgbWFjaGluZSdzIEdMT0JBTFxuICogcGFja2FnZS1tYW5hZ2VyIGNvbmZpZ3MuIFJlcG9zaXRvcnkgY29uZmlncyBndWFyZCBvbmx5IHdiZmllZCByZXBvc2l0b3JpZXM7IGEgYnJhbmQtbmV3IGxvY2FsXG4gKiBwcm9qZWN0IGhhcyBubyBidW5maWcudG9tbCB5ZXQsIHNvIHRoZSBnbG9iYWwgZmlsZXMgYXJlIHRoZSBvbmx5IGdhdGUgYmV0d2VlbiBgYnVuIGNyZWF0ZWAgL1xuICogYG5wbSBpbml0YCBhbmQgYSBmcmVzaGx5IGNvbXByb21pc2VkIHJlbGVhc2UuIFRoZSBzYW1lIHNjcmlwdCBydW5zIG9uIENJIGFuZCBvbiB0aGUgc2VsZi1ob3N0ZWRcbiAqIHJ1bm5lcnMsIHNvIGV2ZXJ5IG1hY2hpbmUgZW5kcyB1cCB3aXRoIGJ5dGUtaWRlbnRpY2FsIHNldHRpbmdzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5zdXJlR2xvYmFsUmVsZWFzZUFnZUdhdGVzKCk6IGJvb2xlYW4ge1xuICBjb25zdCB7IHN0YXR1cyB9ID0gc3Bhd25TeW5jKCdiYXNoJywgW3BhdGguam9pbihnZXRXYmZ5RGlyUGF0aCgpLCAnY29uZmlncycsICdhcHBseVJlbGVhc2VBZ2VHYXRlLnNoJyldLCB7XG4gICAgc3RkaW86ICdpbmhlcml0JyxcbiAgfSk7XG4gIGlmIChzdGF0dXMgPT09IDApIHJldHVybiB0cnVlO1xuXG4gIGNvbnNvbGUud2FybignRmFpbGVkIHRvIGFwcGx5IHRoZSBtaW5pbXVtLXJlbGVhc2UtYWdlIHBvbGljeSB0byB0aGUgZ2xvYmFsIHBhY2thZ2UtbWFuYWdlciBjb25maWdzLicpO1xuICByZXR1cm4gZmFsc2U7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGRvZXNDb250YWluSnNPclRzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIGNvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHQgfHxcbiAgICBjb25maWcuZG9lc0NvbnRhaW5KYXZhU2NyaXB0SW5QYWNrYWdlcyB8fFxuICAgIGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHxcbiAgICBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlc1xuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZG9lc0NvbnRhaW5KYXZhKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gY29uZmlnLmRvZXNDb250YWluSmF2YSB8fCBjb25maWcuZG9lc0NvbnRhaW5KYXZhSW5QYWNrYWdlcztcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBkb2VzQ29udGFpbkphdmEsIGRvZXNDb250YWluSnNPclRzIH0gZnJvbSAnLi4vdXRpbHMvcGFja2FnZUNhcGFiaWxpdGllcy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuLy8gS2VlcCBwYWNrYWdlLW1hbmFnZXIgc2hpbXMgaW4gdGhlIEZpbGUgV2F0Y2hlciBwcm9ncmFtIGZpZWxkIHNvIG5vZGUgZG9lcyBub3Rcbi8vIHBhcnNlIHdyYXBwZXIgc2NyaXB0cyBwYXNzZWQgdGhyb3VnaCBhcmd1bWVudHMuXG5jb25zdCBveGZtdFByb2dyYW0gPSAnJFByb2plY3RGaWxlRGlyJC9ub2RlX21vZHVsZXMvLmJpbi9veGZtdCc7XG5jb25zdCBwcmV0dGllclByb2dyYW0gPSAnJFByb2plY3RGaWxlRGlyJC9ub2RlX21vZHVsZXMvLmJpbi9wcmV0dGllcic7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUlkZWFTZXR0aW5ncyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUlkZWFTZXR0aW5ncycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmlkZWEnKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhkaXJQYXRoKSkge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3dhdGNoZXJUYXNrcy54bWwnKTtcbiAgICAgIGF3YWl0IChkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpIHx8IGRvZXNDb250YWluSmF2YShjb25maWcpXG4gICAgICAgID8gcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGdldFdhdGNoZXJUYXNrc0NvbnRlbnQoY29uZmlnKSkpXG4gICAgICAgIDogcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKSk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0V2F0Y2hlclRhc2tzQ29udGVudChjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBjb25zdCB0YXNrT3B0aW9ucyA9IFtcbiAgICB7XG4gICAgICBhcmdzOiAnLS13cml0ZSAtLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuICEqKi9wYWNrYWdlLmpzb24nLFxuICAgICAgY29uZGl0aW9uOiBkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpLFxuICAgICAgZXh0ZW5zaW9uczogZXh0ZW5zaW9ucy5veGZtdCxcbiAgICAgIG5hbWU6ICdPeGZtdCcsXG4gICAgICBwcm9ncmFtOiBveGZtdFByb2dyYW0sXG4gICAgfSxcbiAgICB7XG4gICAgICBhcmdzOiAnLS1jYWNoZSAtLXdyaXRlJyxcbiAgICAgIGNvbmRpdGlvbjogZG9lc0NvbnRhaW5KYXZhKGNvbmZpZyksXG4gICAgICBleHRlbnNpb25zOiBleHRlbnNpb25zLnByZXR0aWVyT25seSxcbiAgICAgIG5hbWU6ICdQcmV0dGllcicsXG4gICAgICBwcm9ncmFtOiBwcmV0dGllclByb2dyYW0sXG4gICAgfSxcbiAgXVxuICAgIC5maWx0ZXIoKHRhc2spID0+IHRhc2suY29uZGl0aW9uKVxuICAgIC5mbGF0TWFwKCh0YXNrKSA9PiB0YXNrLmV4dGVuc2lvbnMubWFwKChleHQpID0+IGNyZWF0ZVRhc2tPcHRpb25zKHRhc2sucHJvZ3JhbSwgdGFzay5hcmdzLCB0YXNrLm5hbWUsIGV4dCkpKTtcblxuICByZXR1cm4gYDw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuPHByb2plY3QgdmVyc2lvbj1cIjRcIj5cbiAgPGNvbXBvbmVudCBuYW1lPVwiUHJvamVjdFRhc2tzT3B0aW9uc1wiPlxuICAgICR7dGFza09wdGlvbnMuam9pbignJyl9XG4gIDwvY29tcG9uZW50PlxuPC9wcm9qZWN0PlxuYDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlVGFza09wdGlvbnMocnVubmVyOiBzdHJpbmcsIGFyZ3M6IHN0cmluZywgbmFtZTogc3RyaW5nLCBleHRlbnNpb246IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgICAgIDxUYXNrT3B0aW9ucyBpc0VuYWJsZWQ9XCJ0cnVlXCI+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJhcmd1bWVudHNcIiB2YWx1ZT1cIiR7YXJnc30gJEZpbGVQYXRoUmVsYXRpdmVUb1Byb2plY3RSb290JFwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJjaGVja1N5bnRheEVycm9yc1wiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiZGVzY3JpcHRpb25cIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiZXhpdENvZGVCZWhhdmlvclwiIHZhbHVlPVwiRVJST1JcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiZmlsZUV4dGVuc2lvblwiIHZhbHVlPVwiJHtleHRlbnNpb259XCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImltbWVkaWF0ZVN5bmNcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cIm5hbWVcIiB2YWx1ZT1cIiR7bmFtZX0gKC4ke2V4dGVuc2lvbn0pXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cIm91dHB1dFwiIHZhbHVlPVwiJEZpbGVQYXRoUmVsYXRpdmVUb1Byb2plY3RSb290JFwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJvdXRwdXRGaWx0ZXJzXCI+XG4gICAgICAgIDxhcnJheSAvPlxuICAgICAgPC9vcHRpb24+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJvdXRwdXRGcm9tU3Rkb3V0XCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJwcm9ncmFtXCIgdmFsdWU9XCIke3J1bm5lcn1cIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwicnVuT25FeHRlcm5hbENoYW5nZXNcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cInNjb3BlTmFtZVwiIHZhbHVlPVwiUHJvamVjdCBGaWxlc1wiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJ0cmFja09ubHlSb290XCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJ3b3JraW5nRGlyXCIgdmFsdWU9XCIkUHJvamVjdEZpbGVEaXIkXCIgLz5cbiAgICAgIDxlbnZzIC8+XG4gICAgPC9UYXNrT3B0aW9ucz5cbmA7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRHZW5JMThuVHNDb21tYW5kKFxuICBjb25maWc6IFBpY2s8UGFja2FnZUNvbmZpZywgJ2RlcGVuZGluZyc+LFxuICBzY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzIHwgdW5kZWZpbmVkXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIWNvbmZpZy5kZXBlbmRpbmcuZ2VuSTE4blRzIHx8ICFzY3JpcHRzPy5bJ2dlbi1pMThuLXRzJ10pIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiAnYnVuIHJ1biBnZW4taTE4bi10cyA+IC9kZXYvbnVsbCc7XG59XG4iLCJjb25zdCBoYXMgPSAob2JqZWN0LCBrZXkpID0+IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSlcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc29ydE9iamVjdEJ5S2V5TmFtZUxpc3Qob2JqZWN0LCBzb3J0V2l0aCkge1xuICBsZXQga2V5cywgc29ydEZuLCBrZXlcblxuICBpZiAodHlwZW9mIHNvcnRXaXRoID09PSAnZnVuY3Rpb24nKSB7XG4gICAgc29ydEZuID0gc29ydFdpdGhcbiAgfSBlbHNlIHtcbiAgICBrZXlzID0gc29ydFdpdGhcbiAgfVxuXG4gIGNvbnN0IHRvdGFsID0ge31cbiAgY29uc3Qgb2JqZWN0S2V5cyA9IFsuLi4oa2V5cyA/PyBbXSksIC4uLk9iamVjdC5rZXlzKG9iamVjdCkuc29ydChzb3J0Rm4pXVxuXG4gIGZvciAoa2V5IG9mIG9iamVjdEtleXMpIHtcbiAgICBpZiAoaGFzKG9iamVjdCwga2V5KSkge1xuICAgICAgdG90YWxba2V5XSA9IG9iamVjdFtrZXldXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRvdGFsXG59XG4iLCIvLyBEZXRlY3QgZWl0aGVyIHNwYWNlcyBvciB0YWJzIGJ1dCBub3QgYm90aCB0byBwcm9wZXJseSBoYW5kbGUgdGFicyBmb3IgaW5kZW50YXRpb24gYW5kIHNwYWNlcyBmb3IgYWxpZ25tZW50XG5jb25zdCBJTkRFTlRfUkVHRVggPSAvXig/OiggKSt8XFx0KykvO1xuXG5jb25zdCBJTkRFTlRfVFlQRV9TUEFDRSA9ICdzcGFjZSc7XG5jb25zdCBJTkRFTlRfVFlQRV9UQUIgPSAndGFiJztcblxuLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNoZWNrIGlmIHdlIHNob3VsZCBpZ25vcmUgc2luZ2xlIHNwYWNlIHBhdHRlcm5zXG5mdW5jdGlvbiBzaG91bGRJZ25vcmVTaW5nbGVTcGFjZShpZ25vcmVTaW5nbGVTcGFjZXMsIGluZGVudFR5cGUsIHZhbHVlKSB7XG5cdHJldHVybiBpZ25vcmVTaW5nbGVTcGFjZXMgJiYgaW5kZW50VHlwZSA9PT0gSU5ERU5UX1RZUEVfU1BBQ0UgJiYgdmFsdWUgPT09IDE7XG59XG5cbi8qKlxuTWFrZSBhIE1hcCB0aGF0IGNvdW50cyBob3cgbWFueSBpbmRlbnRzL3VuaW5kZW50cyBoYXZlIG9jY3VycmVkIGZvciBhIGdpdmVuIHNpemUgYW5kIGhvdyBtYW55IGxpbmVzIGZvbGxvdyBhIGdpdmVuIGluZGVudGF0aW9uLlxuXG5UaGUga2V5IGlzIGEgY29uY2F0ZW5hdGlvbiBvZiB0aGUgaW5kZW50YXRpb24gdHlwZSAocyA9IHNwYWNlIGFuZCB0ID0gdGFiKSBhbmQgdGhlIHNpemUgb2YgdGhlIGluZGVudHMvdW5pbmRlbnRzLlxuXG5gYGBcbmluZGVudHMgPSB7XG5cdHQzOiBbMSwgMF0sXG5cdHQ0OiBbMSwgNV0sXG5cdHM1OiBbMSwgMF0sXG5cdHMxMjogWzEsIDBdLFxufVxuYGBgXG4qL1xuZnVuY3Rpb24gbWFrZUluZGVudHNNYXAoc3RyaW5nLCBpZ25vcmVTaW5nbGVTcGFjZXMpIHtcblx0Y29uc3QgaW5kZW50cyA9IG5ldyBNYXAoKTtcblxuXHQvLyBSZW1lbWJlciB0aGUgc2l6ZSBvZiBwcmV2aW91cyBsaW5lJ3MgaW5kZW50YXRpb25cblx0bGV0IHByZXZpb3VzU2l6ZSA9IDA7XG5cdGxldCBwcmV2aW91c0luZGVudFR5cGU7XG5cblx0Ly8gSW5kZW50cyBrZXkgKGlkZW50IHR5cGUgKyBzaXplIG9mIHRoZSBpbmRlbnRzL3VuaW5kZW50cylcblx0bGV0IGtleTtcblxuXHRmb3IgKGNvbnN0IGxpbmUgb2Ygc3RyaW5nLnNwbGl0KC9cXG4vZykpIHtcblx0XHRpZiAoIWxpbmUpIHtcblx0XHRcdC8vIElnbm9yZSBlbXB0eSBsaW5lc1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXG5cdFx0Y29uc3QgbWF0Y2hlcyA9IGxpbmUubWF0Y2goSU5ERU5UX1JFR0VYKTtcblxuXHRcdGlmIChtYXRjaGVzID09PSBudWxsKSB7XG5cdFx0XHRwcmV2aW91c1NpemUgPSAwO1xuXHRcdFx0cHJldmlvdXNJbmRlbnRUeXBlID0gJyc7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IGluZGVudCA9IG1hdGNoZXNbMF0ubGVuZ3RoO1xuXHRcdFx0Y29uc3QgaW5kZW50VHlwZSA9IG1hdGNoZXNbMV0gPyBJTkRFTlRfVFlQRV9TUEFDRSA6IElOREVOVF9UWVBFX1RBQjtcblxuXHRcdFx0Ly8gSWdub3JlIHNpbmdsZSBzcGFjZSB1bmxlc3MgaXQncyB0aGUgb25seSBpbmRlbnQgZGV0ZWN0ZWQgdG8gcHJldmVudCBjb21tb24gZmFsc2UgcG9zaXRpdmVzXG5cdFx0XHRpZiAoc2hvdWxkSWdub3JlU2luZ2xlU3BhY2UoaWdub3JlU2luZ2xlU3BhY2VzLCBpbmRlbnRUeXBlLCBpbmRlbnQpKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoaW5kZW50VHlwZSAhPT0gcHJldmlvdXNJbmRlbnRUeXBlKSB7XG5cdFx0XHRcdHByZXZpb3VzU2l6ZSA9IDA7XG5cdFx0XHR9XG5cblx0XHRcdHByZXZpb3VzSW5kZW50VHlwZSA9IGluZGVudFR5cGU7XG5cblx0XHRcdGxldCB1c2UgPSAxO1xuXHRcdFx0bGV0IHdlaWdodCA9IDA7XG5cblx0XHRcdGNvbnN0IGluZGVudERpZmZlcmVuY2UgPSBpbmRlbnQgLSBwcmV2aW91c1NpemU7XG5cdFx0XHRwcmV2aW91c1NpemUgPSBpbmRlbnQ7XG5cblx0XHRcdC8vIFByZXZpb3VzIGxpbmUgaGF2ZSBzYW1lIGluZGVudD9cblx0XHRcdGlmIChpbmRlbnREaWZmZXJlbmNlID09PSAwKSB7XG5cdFx0XHRcdC8vIE5vdCBhIG5ldyBcInVzZVwiIG9mIHRoZSBjdXJyZW50IGluZGVudDpcblx0XHRcdFx0dXNlID0gMDtcblx0XHRcdFx0Ly8gQnV0IGRvIGFkZCBhIGJpdCB0byBpdCBmb3IgYnJlYWtpbmcgdGllczpcblx0XHRcdFx0d2VpZ2h0ID0gMTtcblx0XHRcdFx0Ly8gV2UgdXNlIHRoZSBrZXkgZnJvbSBwcmV2aW91cyBsb29wXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBhYnNvbHV0ZUluZGVudERpZmZlcmVuY2UgPSBNYXRoLmFicyhpbmRlbnREaWZmZXJlbmNlKTtcblxuXHRcdFx0XHQvLyBJZ25vcmUgc2luZ2xlIHNwYWNlIGNoYW5nZXMgd2hlbiBpZ25vcmVTaW5nbGVTcGFjZXMgaXMgdHJ1ZVxuXHRcdFx0XHQvLyBUaGlzIHByZXZlbnRzIGNvbW1vbiBmYWxzZSBwb3NpdGl2ZXMgZnJvbSB0aGluZ3MgbGlrZSBhbGlnbmVkIGNvbW1lbnRzXG5cdFx0XHRcdGlmIChzaG91bGRJZ25vcmVTaW5nbGVTcGFjZShpZ25vcmVTaW5nbGVTcGFjZXMsIGluZGVudFR5cGUsIGFic29sdXRlSW5kZW50RGlmZmVyZW5jZSkpIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGtleSA9IGVuY29kZUluZGVudHNLZXkoaW5kZW50VHlwZSwgYWJzb2x1dGVJbmRlbnREaWZmZXJlbmNlKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gVXBkYXRlIHRoZSBzdGF0c1xuXHRcdFx0Y29uc3QgZW50cnkgPSBpbmRlbnRzLmdldChrZXkpO1xuXHRcdFx0aW5kZW50cy5zZXQoa2V5LCBlbnRyeSA9PT0gdW5kZWZpbmVkID8gWzEsIDBdIDogW2VudHJ5WzBdICsgdXNlLCBlbnRyeVsxXSArIHdlaWdodF0pO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBpbmRlbnRzO1xufVxuXG4vLyBFbmNvZGUgdGhlIGluZGVudCB0eXBlIGFuZCBhbW91bnQgYXMgYSBzdHJpbmcgKGUuZy4gJ3M0JykgZm9yIHVzZSBhcyBhIGNvbXBvdW5kIGtleSBpbiB0aGUgaW5kZW50cyBNYXAuXG5mdW5jdGlvbiBlbmNvZGVJbmRlbnRzS2V5KGluZGVudFR5cGUsIGluZGVudEFtb3VudCkge1xuXHRjb25zdCB0eXBlQ2hhcmFjdGVyID0gaW5kZW50VHlwZSA9PT0gSU5ERU5UX1RZUEVfU1BBQ0UgPyAncycgOiAndCc7XG5cdHJldHVybiB0eXBlQ2hhcmFjdGVyICsgU3RyaW5nKGluZGVudEFtb3VudCk7XG59XG5cbi8vIEV4dHJhY3QgdGhlIGluZGVudCB0eXBlIGFuZCBhbW91bnQgZnJvbSBhIGtleSBvZiB0aGUgaW5kZW50cyBNYXAuXG5mdW5jdGlvbiBkZWNvZGVJbmRlbnRzS2V5KGluZGVudHNLZXkpIHtcblx0Y29uc3Qga2V5SGFzVHlwZVNwYWNlID0gaW5kZW50c0tleVswXSA9PT0gJ3MnO1xuXHRjb25zdCB0eXBlID0ga2V5SGFzVHlwZVNwYWNlID8gSU5ERU5UX1RZUEVfU1BBQ0UgOiBJTkRFTlRfVFlQRV9UQUI7XG5cblx0Y29uc3QgYW1vdW50ID0gTnVtYmVyKGluZGVudHNLZXkuc2xpY2UoMSkpO1xuXG5cdHJldHVybiB7dHlwZSwgYW1vdW50fTtcbn1cblxuLy8gUmV0dXJuIHRoZSBrZXkgKGUuZy4gJ3M0JykgZnJvbSB0aGUgaW5kZW50cyBNYXAgdGhhdCByZXByZXNlbnRzIHRoZSBtb3N0IGNvbW1vbiBpbmRlbnQsXG4vLyBvciByZXR1cm4gdW5kZWZpbmVkIGlmIHRoZXJlIGFyZSBubyBpbmRlbnRzLlxuZnVuY3Rpb24gZ2V0TW9zdFVzZWRLZXkoaW5kZW50cykge1xuXHRsZXQgcmVzdWx0O1xuXHRsZXQgbWF4VXNlZCA9IDA7XG5cdGxldCBtYXhXZWlnaHQgPSAwO1xuXG5cdGZvciAoY29uc3QgW2tleSwgW3VzZWRDb3VudCwgd2VpZ2h0XV0gb2YgaW5kZW50cykge1xuXHRcdGlmICh1c2VkQ291bnQgPiBtYXhVc2VkIHx8ICh1c2VkQ291bnQgPT09IG1heFVzZWQgJiYgd2VpZ2h0ID4gbWF4V2VpZ2h0KSkge1xuXHRcdFx0bWF4VXNlZCA9IHVzZWRDb3VudDtcblx0XHRcdG1heFdlaWdodCA9IHdlaWdodDtcblx0XHRcdHJlc3VsdCA9IGtleTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBtYWtlSW5kZW50U3RyaW5nKHR5cGUsIGFtb3VudCkge1xuXHRjb25zdCBpbmRlbnRDaGFyYWN0ZXIgPSB0eXBlID09PSBJTkRFTlRfVFlQRV9TUEFDRSA/ICcgJyA6ICdcXHQnO1xuXHRyZXR1cm4gaW5kZW50Q2hhcmFjdGVyLnJlcGVhdChhbW91bnQpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBkZXRlY3RJbmRlbnQoc3RyaW5nKSB7XG5cdGlmICh0eXBlb2Ygc3RyaW5nICE9PSAnc3RyaW5nJykge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIGEgc3RyaW5nJyk7XG5cdH1cblxuXHQvLyBJZGVudGlmeSBpbmRlbnRzIHdoaWxlIHNraXBwaW5nIHNpbmdsZSBzcGFjZSBpbmRlbnRzIHRvIGF2b2lkIGNvbW1vbiBlZGdlIGNhc2VzIChlLmcuIGNvZGUgY29tbWVudHMpXG5cdC8vIElmIG5vIGluZGVudHMgYXJlIGlkZW50aWZpZWQsIHJ1biBhZ2FpbiBhbmQgaW5jbHVkZSBhbGwgaW5kZW50cyBmb3IgY29tcHJlaGVuc2l2ZSBkZXRlY3Rpb25cblx0bGV0IGluZGVudHMgPSBtYWtlSW5kZW50c01hcChzdHJpbmcsIHRydWUpO1xuXHRpZiAoaW5kZW50cy5zaXplID09PSAwKSB7XG5cdFx0aW5kZW50cyA9IG1ha2VJbmRlbnRzTWFwKHN0cmluZywgZmFsc2UpO1xuXHR9XG5cblx0Y29uc3Qga2V5T2ZNb3N0VXNlZEluZGVudCA9IGdldE1vc3RVc2VkS2V5KGluZGVudHMpO1xuXG5cdGxldCB0eXBlO1xuXHRsZXQgYW1vdW50ID0gMDtcblx0bGV0IGluZGVudCA9ICcnO1xuXG5cdGlmIChrZXlPZk1vc3RVc2VkSW5kZW50ICE9PSB1bmRlZmluZWQpIHtcblx0XHQoe3R5cGUsIGFtb3VudH0gPSBkZWNvZGVJbmRlbnRzS2V5KGtleU9mTW9zdFVzZWRJbmRlbnQpKTtcblx0XHRpbmRlbnQgPSBtYWtlSW5kZW50U3RyaW5nKHR5cGUsIGFtb3VudCk7XG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdGFtb3VudCxcblx0XHR0eXBlLFxuXHRcdGluZGVudCxcblx0fTtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBkZXRlY3ROZXdsaW5lKHN0cmluZykge1xuXHRpZiAodHlwZW9mIHN0cmluZyAhPT0gJ3N0cmluZycpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBhIHN0cmluZycpO1xuXHR9XG5cblx0Y29uc3QgbmV3bGluZXMgPSBzdHJpbmcubWF0Y2goLyg/Olxccj9cXG4pL2cpIHx8IFtdO1xuXG5cdGlmIChuZXdsaW5lcy5sZW5ndGggPT09IDApIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRjb25zdCBjcmxmID0gbmV3bGluZXMuZmlsdGVyKG5ld2xpbmUgPT4gbmV3bGluZSA9PT0gJ1xcclxcbicpLmxlbmd0aDtcblx0Y29uc3QgbGYgPSBuZXdsaW5lcy5sZW5ndGggLSBjcmxmO1xuXG5cdHJldHVybiBjcmxmID4gbGYgPyAnXFxyXFxuJyA6ICdcXG4nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGV0ZWN0TmV3bGluZUdyYWNlZnVsKHN0cmluZykge1xuXHRyZXR1cm4gKHR5cGVvZiBzdHJpbmcgPT09ICdzdHJpbmcnICYmIGRldGVjdE5ld2xpbmUoc3RyaW5nKSkgfHwgJ1xcbic7XG59XG4iLCIiLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc1BsYWluT2JqZWN0KHZhbHVlKSB7XG5cdGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IHZhbHVlID09PSBudWxsKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0Y29uc3QgcHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKTtcblx0cmV0dXJuIChwcm90b3R5cGUgPT09IG51bGwgfHwgcHJvdG90eXBlID09PSBPYmplY3QucHJvdG90eXBlIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90b3R5cGUpID09PSBudWxsKSAmJiAhKFN5bWJvbC50b1N0cmluZ1RhZyBpbiB2YWx1ZSkgJiYgIShTeW1ib2wuaXRlcmF0b3IgaW4gdmFsdWUpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnXG5pbXBvcnQgc29ydE9iamVjdEtleXMgZnJvbSAnc29ydC1vYmplY3Qta2V5cydcbmltcG9ydCBkZXRlY3RJbmRlbnQgZnJvbSAnZGV0ZWN0LWluZGVudCdcbmltcG9ydCB7IGRldGVjdE5ld2xpbmVHcmFjZWZ1bCBhcyBkZXRlY3ROZXdsaW5lIH0gZnJvbSAnZGV0ZWN0LW5ld2xpbmUnXG5pbXBvcnQgZ2l0SG9va3MgZnJvbSAnZ2l0LWhvb2tzLWxpc3QnXG5pbXBvcnQgaXNQbGFpbk9iamVjdCBmcm9tICdpcy1wbGFpbi1vYmonXG5pbXBvcnQgc2VtdmVyQ29tcGFyZSBmcm9tICdzZW12ZXIvZnVuY3Rpb25zL2NvbXBhcmUuanMnXG5pbXBvcnQgc2VtdmVyTWluVmVyc2lvbiBmcm9tICdzZW12ZXIvcmFuZ2VzL21pbi12ZXJzaW9uLmpzJ1xuXG5jb25zdCBwaXBlID1cbiAgKGZucykgPT5cbiAgKHgsIC4uLmFyZ3MpID0+XG4gICAgZm5zLnJlZHVjZSgocmVzdWx0LCBmbikgPT4gZm4ocmVzdWx0LCAuLi5hcmdzKSwgeClcbmNvbnN0IG9uQXJyYXkgPSAoZm4pID0+ICh4KSA9PiAoQXJyYXkuaXNBcnJheSh4KSA/IGZuKHgpIDogeClcbmNvbnN0IG9uU3RyaW5nQXJyYXkgPSAoZm4pID0+ICh4KSA9PlxuICBBcnJheS5pc0FycmF5KHgpICYmIHguZXZlcnkoKGl0ZW0pID0+IHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJykgPyBmbih4KSA6IHhcbmNvbnN0IHVuaXEgPSBvblN0cmluZ0FycmF5KCh4cykgPT4gWy4uLm5ldyBTZXQoeHMpXSlcbmNvbnN0IHNvcnRBcnJheSA9IG9uU3RyaW5nQXJyYXkoKGFycmF5KSA9PiBhcnJheS50b1NvcnRlZCgpKVxuY29uc3QgdW5pcUFuZFNvcnRBcnJheSA9IHBpcGUoW3VuaXEsIHNvcnRBcnJheV0pXG5jb25zdCBvbk9iamVjdCA9XG4gIChmbikgPT5cbiAgKHgsIC4uLmFyZ3MpID0+XG4gICAgaXNQbGFpbk9iamVjdCh4KSA/IGZuKHgsIC4uLmFyZ3MpIDogeFxuY29uc3Qgc29ydE9iamVjdEJ5ID0gKGNvbXBhcmF0b3IsIGRlZXApID0+IHtcbiAgY29uc3Qgb3ZlciA9IG9uT2JqZWN0KChvYmplY3QpID0+IHtcbiAgICBpZiAoZGVlcCkge1xuICAgICAgb2JqZWN0ID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBPYmplY3QuZW50cmllcyhvYmplY3QpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBba2V5LCBvdmVyKHZhbHVlKV0pLFxuICAgICAgKVxuICAgIH1cblxuICAgIHJldHVybiBzb3J0T2JqZWN0S2V5cyhvYmplY3QsIGNvbXBhcmF0b3IpXG4gIH0pXG5cbiAgcmV0dXJuIG92ZXJcbn1cbmNvbnN0IHNvcnRPYmplY3QgPSBzb3J0T2JqZWN0QnkoKVxuY29uc3Qgc29ydFVSTE9iamVjdCA9IHNvcnRPYmplY3RCeShbJ3R5cGUnLCAndXJsJ10pXG5jb25zdCBzb3J0UGVvcGxlT2JqZWN0ID0gc29ydE9iamVjdEJ5KFsnbmFtZScsICdlbWFpbCcsICd1cmwnXSlcbmNvbnN0IHNvcnREaXJlY3RvcmllcyA9IHNvcnRPYmplY3RCeShbXG4gICdsaWInLFxuICAnYmluJyxcbiAgJ21hbicsXG4gICdkb2MnLFxuICAnZXhhbXBsZScsXG4gICd0ZXN0Jyxcbl0pXG5jb25zdCBvdmVyUHJvcGVydHkgPSAocHJvcGVydHksIG92ZXIpID0+XG4gIG9uT2JqZWN0KChvYmplY3QsIC4uLmFyZ3MpID0+XG4gICAgT2JqZWN0Lmhhc093bihvYmplY3QsIHByb3BlcnR5KVxuICAgICAgPyB7IC4uLm9iamVjdCwgW3Byb3BlcnR5XTogb3ZlcihvYmplY3RbcHJvcGVydHldLCAuLi5hcmdzKSB9XG4gICAgICA6IG9iamVjdCxcbiAgKVxuY29uc3Qgc29ydEdpdEhvb2tzID0gc29ydE9iamVjdEJ5KGdpdEhvb2tzKVxuXG5jb25zdCBwYXJzZU5hbWVBbmRWZXJzaW9uUmFuZ2UgPSAoc3BlY2lmaWVyKSA9PiB7XG4gIC8vIElnbm9yZSBhbnl0aGluZyBhZnRlciA+ICYgcmVseSBvbiBmYWxsYmFjayBhbHBoYW51bWVyaWMgc29ydGluZyBmb3IgdGhhdFxuICBjb25zdCBbbmFtZUFuZFZlcnNpb25dID0gc3BlY2lmaWVyLnNwbGl0KCc+JylcbiAgY29uc3QgYXRNYXRjaGVzID0gWy4uLm5hbWVBbmRWZXJzaW9uLm1hdGNoQWxsKCdAJyldXG4gIGlmIChcbiAgICAhYXRNYXRjaGVzLmxlbmd0aCB8fFxuICAgIChhdE1hdGNoZXMubGVuZ3RoID09PSAxICYmIGF0TWF0Y2hlc1swXS5pbmRleCA9PT0gMClcbiAgKSB7XG4gICAgcmV0dXJuIHsgbmFtZTogc3BlY2lmaWVyIH1cbiAgfVxuICBjb25zdCBzcGxpdEluZGV4ID0gYXRNYXRjaGVzLnBvcCgpLmluZGV4XG4gIHJldHVybiB7XG4gICAgbmFtZTogbmFtZUFuZFZlcnNpb24uc3Vic3RyaW5nKDAsIHNwbGl0SW5kZXgpLFxuICAgIHJhbmdlOiBuYW1lQW5kVmVyc2lvbi5zdWJzdHJpbmcoc3BsaXRJbmRleCArIDEpLFxuICB9XG59XG5cbmNvbnN0IHNvcnRPYmplY3RCeVNlbXZlciA9IHNvcnRPYmplY3RCeSgoYSwgYikgPT4ge1xuICBjb25zdCB7IG5hbWU6IGFOYW1lLCByYW5nZTogYVJhbmdlIH0gPSBwYXJzZU5hbWVBbmRWZXJzaW9uUmFuZ2UoYSlcbiAgY29uc3QgeyBuYW1lOiBiTmFtZSwgcmFuZ2U6IGJSYW5nZSB9ID0gcGFyc2VOYW1lQW5kVmVyc2lvblJhbmdlKGIpXG5cbiAgaWYgKGFOYW1lICE9PSBiTmFtZSkge1xuICAgIHJldHVybiBhTmFtZS5sb2NhbGVDb21wYXJlKGJOYW1lLCAnZW4nKVxuICB9XG4gIGlmICghYVJhbmdlKSB7XG4gICAgcmV0dXJuIC0xXG4gIH1cbiAgaWYgKCFiUmFuZ2UpIHtcbiAgICByZXR1cm4gMVxuICB9XG4gIHJldHVybiBzZW12ZXJDb21wYXJlKHNlbXZlck1pblZlcnNpb24oYVJhbmdlKSwgc2VtdmVyTWluVmVyc2lvbihiUmFuZ2UpKVxufSlcblxuY29uc3QgZ2V0UGFja2FnZU5hbWUgPSAoaWRlbnQpID0+IHtcbiAgY29uc3QgaW5kZXggPSBpZGVudC5pbmRleE9mKCdAJywgaWRlbnQuc3RhcnRzV2l0aCgnQCcpID8gMSA6IDApXG4gIC8vIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4sIHVubGVzcyB1c2VyIG1hbnVhbGx5IGVkaXQgdGhlIHBhY2thZ2UuanNvbiBmaWxlXG4gIHJldHVybiBpbmRleCA9PT0gLTEgPyBpZGVudCA6IGlkZW50LnNsaWNlKDAsIGluZGV4KVxufVxuXG5jb25zdCBzb3J0T2JqZWN0QnlJZGVudCA9IChhLCBiKSA9PiB7XG4gIGNvbnN0IHBhY2thZ2VOYW1lQSA9IGdldFBhY2thZ2VOYW1lKGEpXG4gIGNvbnN0IHBhY2thZ2VOYW1lQiA9IGdldFBhY2thZ2VOYW1lKGIpXG5cbiAgaWYgKHBhY2thZ2VOYW1lQSA8IHBhY2thZ2VOYW1lQikgcmV0dXJuIC0xXG4gIGlmIChwYWNrYWdlTmFtZUEgPiBwYWNrYWdlTmFtZUIpIHJldHVybiAxXG4gIHJldHVybiAwXG59XG5cbi8vIENhY2hlIGJ5IGBwcm9jZXNzLmN3ZCgpYCBpbnN0ZWFkIG9mIGEgdmFyaWFibGUgdG8gYWxsb3cgdXNlciBjYWxsIGBwcm9jZXNzLmNoZGlyKClgXG5jb25zdCBjYWNoZSA9IG5ldyBNYXAoKVxuY29uc3QgaGFzWWFybk9yUG5wbUZpbGVzID0gKCkgPT4ge1xuICBjb25zdCBjd2QgPSBwcm9jZXNzLmN3ZCgpXG4gIGlmICghY2FjaGUuaGFzKGN3ZCkpIHtcbiAgICBjYWNoZS5zZXQoXG4gICAgICBjd2QsXG4gICAgICBmcy5leGlzdHNTeW5jKCd5YXJuLmxvY2snKSB8fFxuICAgICAgICBmcy5leGlzdHNTeW5jKCcueWFybi8nKSB8fFxuICAgICAgICBmcy5leGlzdHNTeW5jKCcueWFybnJjLnltbCcpIHx8XG4gICAgICAgIGZzLmV4aXN0c1N5bmMoJ3BucG0tbG9jay55YW1sJykgfHxcbiAgICAgICAgZnMuZXhpc3RzU3luYygncG5wbS13b3Jrc3BhY2UueWFtbCcpLFxuICAgIClcbiAgfVxuICByZXR1cm4gY2FjaGUuZ2V0KGN3ZClcbn1cblxuLyoqXG4gKiBEZXRlY3RzIHRoZSBwYWNrYWdlIG1hbmFnZXIgZnJvbSBwYWNrYWdlLmpzb24gYW5kIGxvY2sgZmlsZXNcbiAqIEBwYXJhbSB7b2JqZWN0fSBwYWNrYWdlSnNvbiAtIFRoZSBwYXJzZWQgcGFja2FnZS5qc29uIG9iamVjdFxuICogQHJldHVybnMge2Jvb2xlYW59IC0gVGhlIGRldGVjdGVkIHBhY2thZ2UgbWFuYWdlci4gRGVmYXVsdCB0byBucG0gaWYgbm90IGRldGVjdGVkLlxuICovXG5mdW5jdGlvbiBzaG91bGRTb3J0RGVwZW5kZW5jaWVzTGlrZU5wbShwYWNrYWdlSnNvbikge1xuICAvLyBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL2NvcmVwYWNrXG4gIGlmICh0eXBlb2YgcGFja2FnZUpzb24ucGFja2FnZU1hbmFnZXIgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHBhY2thZ2VKc29uLnBhY2thZ2VNYW5hZ2VyLnN0YXJ0c1dpdGgoJ25wbUAnKVxuICB9XG5cbiAgaWYgKHBhY2thZ2VKc29uLmRldkVuZ2luZXM/LnBhY2thZ2VNYW5hZ2VyPy5uYW1lKSB7XG4gICAgcmV0dXJuIHBhY2thZ2VKc29uLmRldkVuZ2luZXMucGFja2FnZU1hbmFnZXIubmFtZSA9PT0gJ25wbSdcbiAgfVxuXG4gIGlmIChwYWNrYWdlSnNvbi5wbnBtKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvLyBPcHRpbWlzYXRpb246IENoZWNrIGlmIG5wbSBpcyBleHBsaWNpdCBiZWZvcmUgcmVhZGluZyBGUy5cbiAgaWYgKHBhY2thZ2VKc29uLmVuZ2luZXM/Lm5wbSkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBpZiAoaGFzWWFybk9yUG5wbUZpbGVzKCkpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG5cbi8qKlxuICogU29ydCBkZXBlbmRlbmNpZXMgYWxwaGFiZXRpY2FsbHksIGRldGVjdGluZyBwYWNrYWdlIG1hbmFnZXIgdG8gdXNlIHRoZVxuICogYXBwcm9wcmlhdGUgY29tcGFyaXNvbi4gbnBtIHVzZXMgbG9jYWxlLWF3YXJlIGNvbXBhcmlzb24sIHlhcm4gYW5kIHBucG0gdXNlXG4gKiBzaW1wbGUgc3RyaW5nIGNvbXBhcmlzb25cbiAqL1xuY29uc3Qgc29ydERlcGVuZGVuY2llcyA9IG9uT2JqZWN0KChkZXBlbmRlbmNpZXMsIHBhY2thZ2VKc29uKSA9PiB7XG4gIC8vIEF2b2lkIGZpbGUgYWNjZXNzXG4gIGlmIChPYmplY3Qua2V5cyhkZXBlbmRlbmNpZXMpLmxlbmd0aCA8IDIpIHtcbiAgICByZXR1cm4gZGVwZW5kZW5jaWVzXG4gIH1cblxuICAvLyBzb3J0IGRlcHMgbGlrZSB0aGUgbnBtIENMSSBkb2VzICh2aWEgdGhlIHBhY2thZ2UgQG5wbWNsaS9wYWNrYWdlLWpzb24pXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ucG0vcGFja2FnZS1qc29uL2Jsb2IvYjY0NjVmNDRjNzI3ZDY1MTNkYjY4OThjN2NiZTQxZGQzNTVjZWJlOC9saWIvdXBkYXRlLWRlcGVuZGVuY2llcy5qcyNMOC1MMjFcbiAgaWYgKHNob3VsZFNvcnREZXBlbmRlbmNpZXNMaWtlTnBtKHBhY2thZ2VKc29uKSkge1xuICAgIHJldHVybiBzb3J0T2JqZWN0S2V5cyhkZXBlbmRlbmNpZXMsIChhLCBiKSA9PiBhLmxvY2FsZUNvbXBhcmUoYiwgJ2VuJykpXG4gIH1cblxuICByZXR1cm4gc29ydE9iamVjdEtleXMoZGVwZW5kZW5jaWVzKVxufSlcblxuLyoqXG4gKiBcIndvcmtzcGFjZXNcIiBjYW4gYmUgYW4gYXJyYXkgKG5wbSBvciB5YXJuIGNsYXNzaWMpIG9yIGFuIG9iamVjdCAocG5wbS9idW4pLlxuICogSW4gdGhlIGNhc2Ugb2YgYW4gYXJyYXksIHdlIGRvIG5vdCB3YW50IHRvIGFscGhhYmV0aWNhbGx5IHNvcnQgaXQgaW4gY2FzZVxuICogc2NyaXB0cyBuZWVkIHRvIHJ1biBpbiBhIHNwZWNpZmljIG9yZGVyLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLm5wbWpzLmNvbS9jbGkvdjcvdXNpbmctbnBtL3dvcmtzcGFjZXM/dj10cnVlI3J1bm5pbmctY29tbWFuZHMtaW4tdGhlLWNvbnRleHQtb2Ytd29ya3NwYWNlc1xuICovXG5jb25zdCBzb3J0V29ya3NwYWNlcyA9IHBpcGUoW1xuICBzb3J0T2JqZWN0QnkoWydwYWNrYWdlcycsICdjYXRhbG9nJ10pLFxuICBvdmVyUHJvcGVydHkoJ3BhY2thZ2VzJywgdW5pcUFuZFNvcnRBcnJheSksXG4gIG92ZXJQcm9wZXJ0eSgnY2F0YWxvZycsIHNvcnREZXBlbmRlbmNpZXMpLFxuXSlcblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2VzbGludC9lc2xpbnQvYmxvYi9hY2MwZTQ3NTcyYTkzOTAyOTJiNGUzMTNiNGE0YmYzNjBkMjM2MzU4L2NvbmYvY29uZmlnLXNjaGVtYS5qc1xuY29uc3QgZXNsaW50QmFzZUNvbmZpZ1Byb3BlcnRpZXMgPSBbXG4gIC8vIGBmaWxlc2AgYW5kIGBleGNsdWRlZEZpbGVzYCBhcmUgb25seSBvbiBgb3ZlcnJpZGVzW11gXG4gIC8vIGZvciBlYXNpZXIgc29ydCBgb3ZlcnJpZGVzW11gLFxuICAvLyBhZGQgdGhlbSB0byBoZXJlLCBzbyB3ZSBkb24ndCBuZWVkIHNvcnQgYG92ZXJyaWRlc1tdYCB0d2ljZVxuICAnZmlsZXMnLFxuICAnZXhjbHVkZWRGaWxlcycsXG4gIC8vIGJhc2VDb25maWdcbiAgJ2VudicsXG4gICdwYXJzZXInLFxuICAncGFyc2VyT3B0aW9ucycsXG4gICdzZXR0aW5ncycsXG4gICdwbHVnaW5zJyxcbiAgJ2V4dGVuZHMnLFxuICAncnVsZXMnLFxuICAnb3ZlcnJpZGVzJyxcbiAgJ2dsb2JhbHMnLFxuICAncHJvY2Vzc29yJyxcbiAgJ25vSW5saW5lQ29uZmlnJyxcbiAgJ3JlcG9ydFVudXNlZERpc2FibGVEaXJlY3RpdmVzJyxcbl1cbmNvbnN0IHNvcnRFc2xpbnRDb25maWcgPSBwaXBlKFtcbiAgc29ydE9iamVjdEJ5KGVzbGludEJhc2VDb25maWdQcm9wZXJ0aWVzKSxcbiAgb3ZlclByb3BlcnR5KCdlbnYnLCBzb3J0T2JqZWN0KSxcbiAgb3ZlclByb3BlcnR5KCdnbG9iYWxzJywgc29ydE9iamVjdCksXG4gIG92ZXJQcm9wZXJ0eShcbiAgICAnb3ZlcnJpZGVzJyxcbiAgICBvbkFycmF5KChvdmVycmlkZXMpID0+IG92ZXJyaWRlcy5tYXAoc29ydEVzbGludENvbmZpZykpLFxuICApLFxuICBvdmVyUHJvcGVydHkoJ3BhcnNlck9wdGlvbnMnLCBzb3J0T2JqZWN0KSxcbiAgb3ZlclByb3BlcnR5KFxuICAgICdydWxlcycsXG4gICAgc29ydE9iamVjdEJ5KFxuICAgICAgKHJ1bGUxLCBydWxlMikgPT5cbiAgICAgICAgcnVsZTEuc3BsaXQoJy8nKS5sZW5ndGggLSBydWxlMi5zcGxpdCgnLycpLmxlbmd0aCB8fFxuICAgICAgICBydWxlMS5sb2NhbGVDb21wYXJlKHJ1bGUyKSxcbiAgICApLFxuICApLFxuICBvdmVyUHJvcGVydHkoJ3NldHRpbmdzJywgc29ydE9iamVjdCksXG5dKVxuY29uc3Qgc29ydFZTQ29kZUJhZGdlT2JqZWN0ID0gc29ydE9iamVjdEJ5KFsnZGVzY3JpcHRpb24nLCAndXJsJywgJ2hyZWYnXSlcblxuY29uc3Qgc29ydFByZXR0aWVyQ29uZmlnID0gcGlwZShbXG4gIC8vIHNvcnQga2V5cyBhbHBoYWJldGljYWxseSwgYnV0IHB1dCBgb3ZlcnJpZGVzYCBhdCBib3R0b21cbiAgb25PYmplY3QoKGNvbmZpZykgPT5cbiAgICBzb3J0T2JqZWN0S2V5cyhjb25maWcsIFtcbiAgICAgIC4uLk9iamVjdC5rZXlzKGNvbmZpZylcbiAgICAgICAgLmZpbHRlcigoa2V5KSA9PiBrZXkgIT09ICdvdmVycmlkZXMnKVxuICAgICAgICAuc29ydCgpLFxuICAgICAgJ292ZXJyaWRlcycsXG4gICAgXSksXG4gICksXG4gIC8vIGlmIGBjb25maWcub3ZlcnJpZGVzYCBleGlzdHNcbiAgb3ZlclByb3BlcnR5KFxuICAgICdvdmVycmlkZXMnLFxuICAgIC8vIGFuZCBgY29uZmlnLm92ZXJyaWRlc2AgaXMgYW4gYXJyYXlcbiAgICBvbkFycmF5KChvdmVycmlkZXMpID0+XG4gICAgICBvdmVycmlkZXMubWFwKFxuICAgICAgICBwaXBlKFtcbiAgICAgICAgICAvLyBzb3J0IGBjb25maWcub3ZlcnJpZGVzW11gIGFscGhhYmV0aWNhbGx5XG4gICAgICAgICAgc29ydE9iamVjdCxcbiAgICAgICAgICAvLyBzb3J0IGBjb25maWcub3ZlcnJpZGVzW10ub3B0aW9uc2AgYWxwaGFiZXRpY2FsbHlcbiAgICAgICAgICBvdmVyUHJvcGVydHkoJ29wdGlvbnMnLCBzb3J0T2JqZWN0KSxcbiAgICAgICAgXSksXG4gICAgICApLFxuICAgICksXG4gICksXG5dKVxuXG5jb25zdCBzb3J0Vm9sdGEgPSBzb3J0T2JqZWN0QnkoWydub2RlJywgJ25wbScsICd5YXJuJ10pXG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvd2lyZWl0XG5jb25zdCB3aXJlaXRTY3JpcHRQcm9wZXJ0aWVzID0gWydjb21tYW5kJywgJ2RlcGVuZGVuY2llcycsICdmaWxlcycsICdvdXRwdXQnXVxuY29uc3Qgc29ydFdpcmVpdFNjcmlwdCA9IHBpcGUoW1xuICBzb3J0T2JqZWN0Qnkod2lyZWl0U2NyaXB0UHJvcGVydGllcyksXG4gIG92ZXJQcm9wZXJ0eShcbiAgICAnZGVwZW5kZW5jaWVzJyxcbiAgICBvbkFycmF5KChkZXBzKSA9PiBkZXBzLm1hcChzb3J0T2JqZWN0QnkoWydzY3JpcHQnLCAnY2FzY2FkZSddKSkpLFxuICApLFxuICBvdmVyUHJvcGVydHkoXG4gICAgJ2VudicsXG4gICAgb25PYmplY3QoKGVudikgPT5cbiAgICAgIHNvcnRPYmplY3RLZXlzKFxuICAgICAgICBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgT2JqZWN0LmVudHJpZXMoZW52KS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gW1xuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgc29ydE9iamVjdEJ5KFsnZXh0ZXJuYWwnLCAnZGVmYXVsdCddKSh2YWx1ZSksXG4gICAgICAgICAgXSksXG4gICAgICAgICksXG4gICAgICApLFxuICAgICksXG4gICksXG4gIG92ZXJQcm9wZXJ0eShcbiAgICAnc2VydmljZScsXG4gICAgcGlwZShbc29ydE9iamVjdEJ5KFsncmVhZHlXaGVuJ10pLCBvdmVyUHJvcGVydHkoJ3JlYWR5V2hlbicsIHNvcnRPYmplY3QpXSksXG4gICksXG5dKVxuY29uc3Qgc29ydFdpcmVpdCA9IG9uT2JqZWN0KCh3aXJlaXQpID0+XG4gIHNvcnRPYmplY3RLZXlzKFxuICAgIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIE9iamVjdC5lbnRyaWVzKHdpcmVpdCkubWFwKChbbmFtZSwgY29uZmlnXSkgPT4gW1xuICAgICAgICBuYW1lLFxuICAgICAgICBzb3J0V2lyZWl0U2NyaXB0KGNvbmZpZyksXG4gICAgICBdKSxcbiAgICApLFxuICApLFxuKVxuY29uc3Qgc29ydERldkVuZ2luZXMgPSBvdmVyUHJvcGVydHkoXG4gICdwYWNrYWdlTWFuYWdlcicsXG4gIHNvcnRPYmplY3RCeShbJ25hbWUnLCAndmVyc2lvbicsICdvbkZhaWwnXSksXG4pXG5cbmNvbnN0IHBucG1CYXNlQ29uZmlnUHJvcGVydGllcyA9IFtcbiAgJ3BlZXJEZXBlbmRlbmN5UnVsZXMnLFxuICAnbmV2ZXJCdWlsdERlcGVuZGVuY2llcycsXG4gICdvbmx5QnVpbHREZXBlbmRlbmNpZXMnLFxuICAnb25seUJ1aWx0RGVwZW5kZW5jaWVzRmlsZScsXG4gICdhbGxvd2VkRGVwcmVjYXRlZFZlcnNpb25zJyxcbiAgJ2FsbG93Tm9uQXBwbGllZFBhdGNoZXMnLFxuICAndXBkYXRlQ29uZmlnJyxcbiAgJ2F1ZGl0Q29uZmlnJyxcbiAgJ3JlcXVpcmVkU2NyaXB0cycsXG4gICdzdXBwb3J0ZWRBcmNoaXRlY3R1cmVzJyxcbiAgJ292ZXJyaWRlcycsXG4gICdwYXRjaGVkRGVwZW5kZW5jaWVzJyxcbiAgJ3BhY2thZ2VFeHRlbnNpb25zJyxcbl1cblxuY29uc3Qgc29ydFBucG1Db25maWcgPSBwaXBlKFtcbiAgc29ydE9iamVjdEJ5KHBucG1CYXNlQ29uZmlnUHJvcGVydGllcywgdHJ1ZSksXG4gIG92ZXJQcm9wZXJ0eSgnb3ZlcnJpZGVzJywgc29ydE9iamVjdEJ5U2VtdmVyKSxcbl0pXG5cbi8vIFNlZSBodHRwczovL2RvY3MubnBtanMuY29tL21pc2Mvc2NyaXB0c1xuY29uc3QgZGVmYXVsdE5wbVNjcmlwdHMgPSBuZXcgU2V0KFtcbiAgJ2luc3RhbGwnLFxuICAncGFjaycsXG4gICdwcmVwYXJlJyxcbiAgJ3B1Ymxpc2gnLFxuICAncmVzdGFydCcsXG4gICdzaHJpbmt3cmFwJyxcbiAgJ3N0YXJ0JyxcbiAgJ3N0b3AnLFxuICAndGVzdCcsXG4gICd1bmluc3RhbGwnLFxuICAndmVyc2lvbicsXG5dKVxuXG5jb25zdCBoYXNEZXZEZXBlbmRlbmN5ID0gKGRlcGVuZGVuY3ksIHBhY2thZ2VKc29uKSA9PiB7XG4gIHJldHVybiAoXG4gICAgT2JqZWN0Lmhhc093bihwYWNrYWdlSnNvbiwgJ2RldkRlcGVuZGVuY2llcycpICYmXG4gICAgT2JqZWN0Lmhhc093bihwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMsIGRlcGVuZGVuY3kpXG4gIClcbn1cblxuY29uc3QgcnVuU1JlZ0V4cCA9XG4gIC8oPzw9XnxbXFxzJjs8PnwoXSkoPzpydW4tc3xucG0tcnVuLWFsbDI/IC4qKD86LS1zZXF1ZW50aWFsfC0tc2VyaWFsfC1zKSkoPz0kfFtcXHMmOzw+fCldKS9cblxuY29uc3QgaXNTZXF1ZW50aWFsU2NyaXB0ID0gKGNvbW1hbmQpID0+XG4gIGNvbW1hbmQuaW5jbHVkZXMoJyonKSAmJiBydW5TUmVnRXhwLnRlc3QoY29tbWFuZClcblxuY29uc3QgaGFzU2VxdWVudGlhbFNjcmlwdCA9IChwYWNrYWdlSnNvbikgPT4ge1xuICBpZiAoXG4gICAgIWhhc0RldkRlcGVuZGVuY3koJ25wbS1ydW4tYWxsJywgcGFja2FnZUpzb24pICYmXG4gICAgIWhhc0RldkRlcGVuZGVuY3koJ25wbS1ydW4tYWxsMicsIHBhY2thZ2VKc29uKVxuICApIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuICBjb25zdCBzY3JpcHRzID0gWydzY3JpcHRzJywgJ2JldHRlclNjcmlwdHMnXS5mbGF0TWFwKChmaWVsZCkgPT5cbiAgICBwYWNrYWdlSnNvbltmaWVsZF0gPyBPYmplY3QudmFsdWVzKHBhY2thZ2VKc29uW2ZpZWxkXSkgOiBbXSxcbiAgKVxuICByZXR1cm4gc2NyaXB0cy5zb21lKChzY3JpcHQpID0+IGlzU2VxdWVudGlhbFNjcmlwdChzY3JpcHQpKVxufVxuXG5mdW5jdGlvbiBzb3J0U2NyaXB0TmFtZXMoa2V5cywgcHJlZml4ID0gJycpIHtcbiAgY29uc3QgZ3JvdXBNYXAgPSBuZXcgTWFwKClcbiAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgIGNvbnN0IHJlc3QgPSBwcmVmaXggPyBrZXkuc2xpY2UocHJlZml4Lmxlbmd0aCArIDEpIDoga2V5XG4gICAgY29uc3QgaWR4ID0gcmVzdC5pbmRleE9mKCc6JylcbiAgICBpZiAoaWR4ID4gMCkge1xuICAgICAgY29uc3QgYmFzZSA9IGtleS5zbGljZSgwLCAocHJlZml4ID8gcHJlZml4Lmxlbmd0aCArIDEgOiAwKSArIGlkeClcbiAgICAgIGlmICghZ3JvdXBNYXAuaGFzKGJhc2UpKSBncm91cE1hcC5zZXQoYmFzZSwgW10pXG4gICAgICBncm91cE1hcC5nZXQoYmFzZSkucHVzaChrZXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghZ3JvdXBNYXAuaGFzKGtleSkpIGdyb3VwTWFwLnNldChrZXksIFtdKVxuICAgICAgZ3JvdXBNYXAuZ2V0KGtleSkucHVzaChrZXkpXG4gICAgfVxuICB9XG4gIHJldHVybiBBcnJheS5mcm9tKGdyb3VwTWFwLmtleXMoKSlcbiAgICAuc29ydCgpXG4gICAgLmZsYXRNYXAoKGdyb3VwS2V5KSA9PiB7XG4gICAgICBjb25zdCBjaGlsZHJlbiA9IGdyb3VwTWFwLmdldChncm91cEtleSlcbiAgICAgIGlmIChcbiAgICAgICAgY2hpbGRyZW4ubGVuZ3RoID4gMSAmJlxuICAgICAgICBjaGlsZHJlbi5zb21lKChrKSA9PiBrICE9PSBncm91cEtleSAmJiBrLnN0YXJ0c1dpdGgoZ3JvdXBLZXkgKyAnOicpKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGRpcmVjdCA9IGNoaWxkcmVuXG4gICAgICAgICAgLmZpbHRlcigoaykgPT4gayA9PT0gZ3JvdXBLZXkgfHwgIWsuc3RhcnRzV2l0aChncm91cEtleSArICc6JykpXG4gICAgICAgICAgLnNvcnQoKVxuICAgICAgICBjb25zdCBuZXN0ZWQgPSBjaGlsZHJlbi5maWx0ZXIoKGspID0+IGsuc3RhcnRzV2l0aChncm91cEtleSArICc6JykpXG4gICAgICAgIHJldHVybiBbLi4uZGlyZWN0LCAuLi5zb3J0U2NyaXB0TmFtZXMobmVzdGVkLCBncm91cEtleSldXG4gICAgICB9XG4gICAgICByZXR1cm4gY2hpbGRyZW4uc29ydCgpXG4gICAgfSlcbn1cblxuY29uc3Qgc29ydFNjcmlwdHMgPSBvbk9iamVjdCgoc2NyaXB0cywgcGFja2FnZUpzb24pID0+IHtcbiAgbGV0IG5hbWVzID0gT2JqZWN0LmtleXMoc2NyaXB0cylcbiAgY29uc3QgcHJlZml4YWJsZSA9IG5ldyBTZXQoKVxuXG4gIG5hbWVzID0gbmFtZXMubWFwKChuYW1lKSA9PiB7XG4gICAgY29uc3Qgb21pdHRlZCA9IG5hbWUucmVwbGFjZSgvXig/OnByZXxwb3N0KS8sICcnKVxuICAgIGlmIChkZWZhdWx0TnBtU2NyaXB0cy5oYXMob21pdHRlZCkgfHwgbmFtZXMuaW5jbHVkZXMob21pdHRlZCkpIHtcbiAgICAgIHByZWZpeGFibGUuYWRkKG9taXR0ZWQpXG4gICAgICByZXR1cm4gb21pdHRlZFxuICAgIH1cbiAgICByZXR1cm4gbmFtZVxuICB9KVxuXG4gIGlmICghaGFzU2VxdWVudGlhbFNjcmlwdChwYWNrYWdlSnNvbikpIHtcbiAgICBuYW1lcyA9IHNvcnRTY3JpcHROYW1lcyhuYW1lcylcbiAgfVxuICBuYW1lcyA9IG5hbWVzLmZsYXRNYXAoKGtleSkgPT5cbiAgICBwcmVmaXhhYmxlLmhhcyhrZXkpID8gW2BwcmUke2tleX1gLCBrZXksIGBwb3N0JHtrZXl9YF0gOiBba2V5XSxcbiAgKVxuICByZXR1cm4gc29ydE9iamVjdEtleXMoc2NyaXB0cywgbmFtZXMpXG59KVxuXG4vKlxuLSBNb3ZlIGBkZWZhdWx0YCBjb25kaXRpb24gdG8gYm90dG9tXG4qL1xuY29uc3Qgc29ydENvbmRpdGlvbnMgPSAoY29uZGl0aW9ucykgPT4ge1xuICBjb25zdCB7IGRlZmF1bHRDb25kaXRpb25zID0gW10sIHJlc3RDb25kaXRpb25zID0gW10gfSA9IE9iamVjdC5ncm91cEJ5KFxuICAgIGNvbmRpdGlvbnMsXG4gICAgKGNvbmRpdGlvbikgPT4ge1xuICAgICAgaWYgKGNvbmRpdGlvbiA9PT0gJ2RlZmF1bHQnKSB7XG4gICAgICAgIHJldHVybiAnZGVmYXVsdENvbmRpdGlvbnMnXG4gICAgICB9XG5cbiAgICAgIHJldHVybiAncmVzdENvbmRpdGlvbnMnXG4gICAgfSxcbiAgKVxuXG4gIHJldHVybiBbLi4ucmVzdENvbmRpdGlvbnMsIC4uLmRlZmF1bHRDb25kaXRpb25zXVxufVxuXG5jb25zdCBzb3J0RXhwb3J0cyA9IG9uT2JqZWN0KChleHBvcnRzKSA9PiB7XG4gIGNvbnN0IHsgcGF0aHMgPSBbXSwgY29uZGl0aW9ucyA9IFtdIH0gPSBPYmplY3QuZ3JvdXBCeShcbiAgICBPYmplY3Qua2V5cyhleHBvcnRzKSxcbiAgICAoa2V5KSA9PiAoa2V5LnN0YXJ0c1dpdGgoJy4nKSA/ICdwYXRocycgOiAnY29uZGl0aW9ucycpLFxuICApXG5cbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBbLi4ucGF0aHMsIC4uLnNvcnRDb25kaXRpb25zKGNvbmRpdGlvbnMpXS5tYXAoKGtleSkgPT4gW1xuICAgICAga2V5LFxuICAgICAgc29ydEV4cG9ydHMoZXhwb3J0c1trZXldKSxcbiAgICBdKSxcbiAgKVxufSlcblxuLy8gZmllbGRzIG1hcmtlZCBgdnNjb2RlYCBhcmUgZm9yIGBWaXN1YWwgU3R1ZGlvIENvZGUgZXh0ZW5zaW9uIG1hbmlmZXN0YCBvbmx5XG4vLyBodHRwczovL2NvZGUudmlzdWFsc3R1ZGlvLmNvbS9hcGkvcmVmZXJlbmNlcy9leHRlbnNpb24tbWFuaWZlc3Rcbi8vIFN1cHBvcnRlZCBmaWVsZHM6XG4vLyBwdWJsaXNoZXIsIGRpc3BsYXlOYW1lLCBjYXRlZ29yaWVzLCBnYWxsZXJ5QmFubmVyLCBwcmV2aWV3LCBjb250cmlidXRlcyxcbi8vIGFjdGl2YXRpb25FdmVudHMsIGJhZGdlcywgbWFya2Rvd24sIHFuYSwgZXh0ZW5zaW9uUGFjayxcbi8vIGV4dGVuc2lvbkRlcGVuZGVuY2llcywgaWNvblxuXG4vLyBmaWVsZC5rZXl7c3RyaW5nfTogZmllbGQgbmFtZVxuLy8gZmllbGQub3ZlcntmdW5jdGlvbn06IHNvcnQgZmllbGQgc3ViS2V5XG5jb25zdCBmaWVsZHMgPSBbXG4gIHsga2V5OiAnJHNjaGVtYScgfSxcbiAgeyBrZXk6ICduYW1lJyB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdkaXNwbGF5TmFtZScgfSxcbiAgeyBrZXk6ICd2ZXJzaW9uJyB9LFxuICAvKiB5YXJuICovIHsga2V5OiAnc3RhYmxlVmVyc2lvbicgfSxcbiAgeyBrZXk6ICdwcml2YXRlJyB9LFxuICB7IGtleTogJ2Rlc2NyaXB0aW9uJyB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdjYXRlZ29yaWVzJywgb3ZlcjogdW5pcSB9LFxuICB7IGtleTogJ2tleXdvcmRzJywgb3ZlcjogdW5pcSB9LFxuICB7IGtleTogJ2hvbWVwYWdlJyB9LFxuICB7IGtleTogJ2J1Z3MnLCBvdmVyOiBzb3J0T2JqZWN0QnkoWyd1cmwnLCAnZW1haWwnXSkgfSxcbiAgeyBrZXk6ICdyZXBvc2l0b3J5Jywgb3Zlcjogc29ydFVSTE9iamVjdCB9LFxuICB7IGtleTogJ2Z1bmRpbmcnLCBvdmVyOiBzb3J0VVJMT2JqZWN0IH0sXG4gIHsga2V5OiAnbGljZW5zZScsIG92ZXI6IHNvcnRVUkxPYmplY3QgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAncW5hJyB9LFxuICB7IGtleTogJ2F1dGhvcicsIG92ZXI6IHNvcnRQZW9wbGVPYmplY3QgfSxcbiAge1xuICAgIGtleTogJ21haW50YWluZXJzJyxcbiAgICBvdmVyOiBvbkFycmF5KChtYWludGFpbmVycykgPT4gbWFpbnRhaW5lcnMubWFwKHNvcnRQZW9wbGVPYmplY3QpKSxcbiAgfSxcbiAge1xuICAgIGtleTogJ2NvbnRyaWJ1dG9ycycsXG4gICAgb3Zlcjogb25BcnJheSgoY29udHJpYnV0b3JzKSA9PiBjb250cmlidXRvcnMubWFwKHNvcnRQZW9wbGVPYmplY3QpKSxcbiAgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAncHVibGlzaGVyJyB9LFxuICB7IGtleTogJ3NpZGVFZmZlY3RzJyB9LFxuICB7IGtleTogJ3R5cGUnIH0sXG4gIHsga2V5OiAnaW1wb3J0cycgfSxcbiAgeyBrZXk6ICdleHBvcnRzJywgb3Zlcjogc29ydEV4cG9ydHMgfSxcbiAgeyBrZXk6ICdtYWluJyB9LFxuICB7IGtleTogJ3N2ZWx0ZScgfSxcbiAgeyBrZXk6ICd1bWQ6bWFpbicgfSxcbiAgeyBrZXk6ICdqc2RlbGl2cicgfSxcbiAgeyBrZXk6ICd1bnBrZycgfSxcbiAgeyBrZXk6ICdtb2R1bGUnIH0sXG4gIHsga2V5OiAnc291cmNlJyB9LFxuICB7IGtleTogJ2pzbmV4dDptYWluJyB9LFxuICB7IGtleTogJ2Jyb3dzZXInIH0sXG4gIHsga2V5OiAncmVhY3QtbmF0aXZlJyB9LFxuICB7IGtleTogJ3R5cGVzJyB9LFxuICB7IGtleTogJ3R5cGVzVmVyc2lvbnMnIH0sXG4gIHsga2V5OiAndHlwaW5ncycgfSxcbiAgeyBrZXk6ICdzdHlsZScgfSxcbiAgeyBrZXk6ICdleGFtcGxlJyB9LFxuICB7IGtleTogJ2V4YW1wbGVzdHlsZScgfSxcbiAgeyBrZXk6ICdhc3NldHMnIH0sXG4gIHsga2V5OiAnYmluJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ21hbicgfSxcbiAgeyBrZXk6ICdkaXJlY3RvcmllcycsIG92ZXI6IHNvcnREaXJlY3RvcmllcyB9LFxuICB7IGtleTogJ2ZpbGVzJywgb3ZlcjogdW5pcSB9LFxuICB7IGtleTogJ3dvcmtzcGFjZXMnLCBvdmVyOiBzb3J0V29ya3NwYWNlcyB9LFxuICAvLyBub2RlLXByZS1neXAgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2Uvbm9kZS1wcmUtZ3lwIzEtYWRkLW5ldy1lbnRyaWVzLXRvLXlvdXItcGFja2FnZWpzb25cbiAge1xuICAgIGtleTogJ2JpbmFyeScsXG4gICAgb3Zlcjogc29ydE9iamVjdEJ5KFtcbiAgICAgICdtb2R1bGVfbmFtZScsXG4gICAgICAnbW9kdWxlX3BhdGgnLFxuICAgICAgJ3JlbW90ZV9wYXRoJyxcbiAgICAgICdwYWNrYWdlX25hbWUnLFxuICAgICAgJ2hvc3QnLFxuICAgIF0pLFxuICB9LFxuICB7IGtleTogJ3NjcmlwdHMnLCBvdmVyOiBzb3J0U2NyaXB0cyB9LFxuICB7IGtleTogJ2JldHRlclNjcmlwdHMnLCBvdmVyOiBzb3J0U2NyaXB0cyB9LFxuICB7IGtleTogJ3dpcmVpdCcsIG92ZXI6IHNvcnRXaXJlaXQgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnbDEwbicgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnY29udHJpYnV0ZXMnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2FjdGl2YXRpb25FdmVudHMnLCBvdmVyOiB1bmlxIH0sXG4gIHsga2V5OiAnaHVza3knLCBvdmVyOiBvdmVyUHJvcGVydHkoJ2hvb2tzJywgc29ydEdpdEhvb2tzKSB9LFxuICB7IGtleTogJ3NpbXBsZS1naXQtaG9va3MnLCBvdmVyOiBzb3J0R2l0SG9va3MgfSxcbiAgeyBrZXk6ICdwcmUtY29tbWl0JyB9LFxuICB7IGtleTogJ2NvbW1pdGxpbnQnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnbGludC1zdGFnZWQnIH0sXG4gIHsga2V5OiAnbmFuby1zdGFnZWQnIH0sXG4gIHsga2V5OiAnY29uZmlnJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ25vZGVtb25Db25maWcnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnYnJvd3NlcmlmeScsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdiYWJlbCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdicm93c2Vyc2xpc3QnIH0sXG4gIHsga2V5OiAneG8nLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAncHJldHRpZXInLCBvdmVyOiBzb3J0UHJldHRpZXJDb25maWcgfSxcbiAgeyBrZXk6ICdlc2xpbnRDb25maWcnLCBvdmVyOiBzb3J0RXNsaW50Q29uZmlnIH0sXG4gIHsga2V5OiAnZXNsaW50SWdub3JlJyB9LFxuICB7IGtleTogJ25wbXBrZ2pzb25saW50Jywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ25wbVBhY2thZ2VKc29uTGludENvbmZpZycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICducG1wYWNrYWdlanNvbmxpbnQnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAncmVsZWFzZScsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdyZW1hcmtDb25maWcnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnc3R5bGVsaW50JyB9LFxuICB7IGtleTogJ2F2YScsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdqZXN0Jywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2plc3QtanVuaXQnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnamVzdC1zdGFyZScsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdtb2NoYScsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdueWMnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnYzgnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAndGFwJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ29jbGlmJywgb3Zlcjogc29ydE9iamVjdEJ5KHVuZGVmaW5lZCwgdHJ1ZSkgfSxcbiAgeyBrZXk6ICdyZXNvbHV0aW9ucycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdvdmVycmlkZXMnLCBvdmVyOiBzb3J0RGVwZW5kZW5jaWVzIH0sXG4gIHsga2V5OiAnZGVwZW5kZW5jaWVzJywgb3Zlcjogc29ydERlcGVuZGVuY2llcyB9LFxuICB7IGtleTogJ2RldkRlcGVuZGVuY2llcycsIG92ZXI6IHNvcnREZXBlbmRlbmNpZXMgfSxcbiAgeyBrZXk6ICdkZXBlbmRlbmNpZXNNZXRhJywgb3Zlcjogc29ydE9iamVjdEJ5KHNvcnRPYmplY3RCeUlkZW50LCB0cnVlKSB9LFxuICB7IGtleTogJ3BlZXJEZXBlbmRlbmNpZXMnLCBvdmVyOiBzb3J0RGVwZW5kZW5jaWVzIH0sXG4gIC8vIFRPRE86IG9ubHkgc29ydCBkZXB0aCA9IDJcbiAgeyBrZXk6ICdwZWVyRGVwZW5kZW5jaWVzTWV0YScsIG92ZXI6IHNvcnRPYmplY3RCeSh1bmRlZmluZWQsIHRydWUpIH0sXG4gIHsga2V5OiAnb3B0aW9uYWxEZXBlbmRlbmNpZXMnLCBvdmVyOiBzb3J0RGVwZW5kZW5jaWVzIH0sXG4gIHsga2V5OiAnYnVuZGxlZERlcGVuZGVuY2llcycsIG92ZXI6IHVuaXFBbmRTb3J0QXJyYXkgfSxcbiAgeyBrZXk6ICdidW5kbGVEZXBlbmRlbmNpZXMnLCBvdmVyOiB1bmlxQW5kU29ydEFycmF5IH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2V4dGVuc2lvblBhY2snLCBvdmVyOiB1bmlxQW5kU29ydEFycmF5IH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2V4dGVuc2lvbkRlcGVuZGVuY2llcycsIG92ZXI6IHVuaXFBbmRTb3J0QXJyYXkgfSxcbiAgeyBrZXk6ICdmbGF0JyB9LFxuICB7IGtleTogJ3BhY2thZ2VNYW5hZ2VyJyB9LFxuICB7IGtleTogJ2VuZ2luZXMnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnZW5naW5lU3RyaWN0Jywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2RldkVuZ2luZXMnLCBvdmVyOiBzb3J0RGV2RW5naW5lcyB9LFxuICB7IGtleTogJ3ZvbHRhJywgb3Zlcjogc29ydFZvbHRhIH0sXG4gIHsga2V5OiAnbGFuZ3VhZ2VOYW1lJyB9LFxuICB7IGtleTogJ29zJyB9LFxuICB7IGtleTogJ2NwdScgfSxcbiAgeyBrZXk6ICdwcmVmZXJHbG9iYWwnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAncHVibGlzaENvbmZpZycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnaWNvbicgfSxcbiAgLyogdnNjb2RlICovIHtcbiAgICBrZXk6ICdiYWRnZXMnLFxuICAgIG92ZXI6IG9uQXJyYXkoKGJhZGdlKSA9PiBiYWRnZS5tYXAoc29ydFZTQ29kZUJhZGdlT2JqZWN0KSksXG4gIH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2dhbGxlcnlCYW5uZXInLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ3ByZXZpZXcnIH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ21hcmtkb3duJyB9LFxuICB7IGtleTogJ3BucG0nLCBvdmVyOiBzb3J0UG5wbUNvbmZpZyB9LFxuXVxuXG5jb25zdCBkZWZhdWx0U29ydE9yZGVyID0gZmllbGRzLm1hcCgoeyBrZXkgfSkgPT4ga2V5KVxuY29uc3Qgb3ZlckZpZWxkcyA9IHBpcGUoXG4gIGZpZWxkc1xuICAgIC5tYXAoKHsga2V5LCBvdmVyIH0pID0+IChvdmVyID8gb3ZlclByb3BlcnR5KGtleSwgb3ZlcikgOiB1bmRlZmluZWQpKVxuICAgIC5maWx0ZXIoQm9vbGVhbiksXG4pXG5cbmZ1bmN0aW9uIGVkaXRTdHJpbmdKU09OKGpzb24sIG92ZXIpIHtcbiAgaWYgKHR5cGVvZiBqc29uID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IHsgaW5kZW50LCB0eXBlIH0gPSBkZXRlY3RJbmRlbnQoanNvbilcbiAgICBjb25zdCBlbmRDaGFyYWN0ZXJzID0ganNvbi5zbGljZSgtMSkgPT09ICdcXG4nID8gJ1xcbicgOiAnJ1xuICAgIGNvbnN0IG5ld2xpbmUgPSBkZXRlY3ROZXdsaW5lKGpzb24pXG4gICAganNvbiA9IEpTT04ucGFyc2UoanNvbilcblxuICAgIGxldCByZXN1bHQgPVxuICAgICAgSlNPTi5zdHJpbmdpZnkob3Zlcihqc29uKSwgbnVsbCwgdHlwZSA9PT0gJ3RhYicgPyAnXFx0JyA6IGluZGVudCkgK1xuICAgICAgZW5kQ2hhcmFjdGVyc1xuICAgIGlmIChuZXdsaW5lID09PSAnXFxyXFxuJykge1xuICAgICAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoL1xcbi9nLCBuZXdsaW5lKVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICByZXR1cm4gb3Zlcihqc29uKVxufVxuXG5mdW5jdGlvbiBzb3J0UGFja2FnZUpzb24oanNvbklzaCwgb3B0aW9ucyA9IHt9KSB7XG4gIHJldHVybiBlZGl0U3RyaW5nSlNPTihcbiAgICBqc29uSXNoLFxuICAgIG9uT2JqZWN0KChqc29uKSA9PiB7XG4gICAgICBsZXQgc29ydE9yZGVyID0gb3B0aW9ucy5zb3J0T3JkZXIgfHwgZGVmYXVsdFNvcnRPcmRlclxuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShzb3J0T3JkZXIpKSB7XG4gICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhqc29uKVxuICAgICAgICBjb25zdCB7IHByaXZhdGVLZXlzID0gW10sIHB1YmxpY0tleXMgPSBbXSB9ID0gT2JqZWN0Lmdyb3VwQnkoXG4gICAgICAgICAga2V5cyxcbiAgICAgICAgICAoa2V5KSA9PiAoa2V5WzBdID09PSAnXycgPyAncHJpdmF0ZUtleXMnIDogJ3B1YmxpY0tleXMnKSxcbiAgICAgICAgKVxuICAgICAgICBzb3J0T3JkZXIgPSBbXG4gICAgICAgICAgLi4uc29ydE9yZGVyLFxuICAgICAgICAgIC4uLmRlZmF1bHRTb3J0T3JkZXIsXG4gICAgICAgICAgLi4ucHVibGljS2V5cy5zb3J0KCksXG4gICAgICAgICAgLi4ucHJpdmF0ZUtleXMuc29ydCgpLFxuICAgICAgICBdXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvdmVyRmllbGRzKHNvcnRPYmplY3RLZXlzKGpzb24sIHNvcnRPcmRlciksIGpzb24pXG4gICAgfSksXG4gIClcbn1cblxuZXhwb3J0IGRlZmF1bHQgc29ydFBhY2thZ2VKc29uXG5leHBvcnQgeyBzb3J0UGFja2FnZUpzb24sIGRlZmF1bHRTb3J0T3JkZXIgYXMgc29ydE9yZGVyIH1cbiIsImltcG9ydCB7IHNwYXduU3luY0FuZFJldHVyblN0ZG91dCB9IGZyb20gJy4uL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMYXRlc3RDb21taXRIYXNoKG9yZ2FuaXphdGlvbjogc3RyaW5nLCByZXBvOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICB0cnkge1xuICAgIGNvbnN0IHJlcG9VcmwgPSBgZ2l0QGdpdGh1Yi5jb206JHtvcmdhbml6YXRpb259LyR7cmVwb30uZ2l0YDtcbiAgICBjb25zdCBvdXRwdXQgPSBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoJ2dpdCcsIFsnbHMtcmVtb3RlJywgcmVwb1VybCwgJ0hFQUQnXSwgcHJvY2Vzcy5jd2QoKSk7XG4gICAgY29uc3QgY29tbWl0SGFzaCA9IG91dHB1dC5zcGxpdCgvXFxzKy8pWzBdO1xuICAgIGlmICghY29tbWl0SGFzaCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBjb21taXRzIGZvdW5kIGZvciAke29yZ2FuaXphdGlvbn0vJHtyZXBvfWApO1xuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGNvbW1pdEhhc2gpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYEZhaWxlZCB0byBmZXRjaCBjb21taXRzIGZvciAke29yZ2FuaXphdGlvbn0vJHtyZXBvfTogJHtTdHJpbmcoZXJyb3IpfWApKTtcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmV4cG9ydCBjb25zdCBtYW5hZ2VkVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzID0gW1xuICAnQHRzY29uZmlnL2J1bicsXG4gICdAdHNjb25maWcvbm9kZS1sdHMnLFxuICAnQHRzY29uZmlnL25vZGUtdHMnLFxuICAnQHRzY29uZmlnL3JlYWN0LW5hdGl2ZScsXG5dO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHNjb25maWdFeHRlbmRzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgLy8gUmVhY3QgTmF0aXZlIG5lZWRzIE1ldHJvLWNvbXBhdGlibGUgc2V0dGluZ3MgKGpzeDogcmVhY3QtbmF0aXZlLCBub2RlIHJlc29sdXRpb24pLCB3aGljaFxuICAvLyBAdHNjb25maWcvYnVuIHdvdWxkIG92ZXJyaWRlIGV2ZW4gdGhvdWdoIHRoZSByZXBvIHVzZXMgQnVuIGFzIGl0cyBwYWNrYWdlIG1hbmFnZXIuXG4gIGlmIChjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgcmV0dXJuICdAdHNjb25maWcvcmVhY3QtbmF0aXZlL3RzY29uZmlnLmpzb24nO1xuICB9XG4gIHJldHVybiAnQHRzY29uZmlnL2J1bi90c2NvbmZpZy5qc29uJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmdbXSB7XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6IHx8IGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBpZiAoY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgIHJldHVybiBbJ0B0c2NvbmZpZy9yZWFjdC1uYXRpdmUnXTtcbiAgfVxuICByZXR1cm4gWydAdHNjb25maWcvYnVuJ107XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBtb2R1bGUgc3BlY2lmaWVyIGEgZ2VuZXJhdGVkIGNvbmZpZyBmaWxlIHNob3VsZCB1c2UgdG8gbG9hZCBhXG4gKiB3aWxsYm9vc3Rlci1jb25maWdzIGNvbmZpZyBwYWNrYWdlIHN1Y2ggYXMgYEB3aWxsYm9vc3Rlci9veGxpbnQtY29uZmlnYC5cbiAqXG4gKiBPdXRzaWRlIHdpbGxib29zdGVyLWNvbmZpZ3MgdGhpcyBpcyBzaW1wbHkgdGhlIHB1Ymxpc2hlZCBwYWNrYWdlIG5hbWUuIEluc2lkZVxuICogd2lsbGJvb3N0ZXItY29uZmlncyB0aGUgcGFja2FnZSBtdXN0IG5vdCBiZSBkZWNsYXJlZCBhcyBhIGRlcGVuZGVuY3k6IHRoZVxuICogY29uZmlnIHBhY2thZ2VzIGltcG9ydCBvbmUgYW5vdGhlciAoZS5nLiBveGZtdC1jb25maWcncyBveGxpbnQuY29uZmlnLnRzXG4gKiBpbXBvcnRzIG94bGludC1jb25maWcgYW5kIHZpY2UgdmVyc2EpLCBzbyBhIGRlY2xhcmVkIGVkZ2Ugd291bGQgZm9ybSBhXG4gKiBkZXBlbmRlbmN5IGN5Y2xlIHRoYXQgbXVsdGktc2VtYW50aWMtcmVsZWFzZSBjYW5ub3QgdG9wb2xvZ2ljYWxseSBzb3J0LiBTaW5jZVxuICogdGhlIGVkZ2UgaXMgYWJzZW50LCBpc29sYXRlZCBpbnN0YWxscyBjYW5ub3QgcmVzb2x2ZSB0aGUgYmFyZSBwYWNrYWdlIG5hbWUsIHNvXG4gKiBpbXBvcnQgdGhlIGNvbW1pdHRlZCBgY29uZmlnLm1qc2AgYnVpbGQgb3V0cHV0IHRocm91Z2ggYSByZWxhdGl2ZSBwYXRoIGluc3RlYWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlV2lsbGJvb3N0ZXJDb25maWdNb2R1bGUoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBjb25maWdQYWNrYWdlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCFjb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3MpIHJldHVybiBjb25maWdQYWNrYWdlTmFtZTtcblxuICAvLyBlLmcuICdAd2lsbGJvb3N0ZXIvb3hsaW50LWNvbmZpZycgLT4gJ294bGludC1jb25maWcnLCB3aGljaCBpcyBpdHMgZGlyZWN0b3J5IHVuZGVyIGBwYWNrYWdlcy9gLlxuICBjb25zdCBjb25maWdQYWNrYWdlRGlyID0gY29uZmlnUGFja2FnZU5hbWUuc3BsaXQoJy8nKS5wb3AoKSA/PyAnJztcbiAgLy8gRGVyaXZlIHRoZSB3aWxsYm9vc3Rlci1jb25maWdzIHJvb3QgZnJvbSB0aGUgcGFja2FnZSBiZWluZyBnZW5lcmF0ZWQsIG5vdCBmcm9tIHRoZSBDTEkgZW50cnlcbiAgLy8gcGF0aDogYHdiZnkgPHJlcG8+L3BhY2thZ2VzLzxwa2c+YCBpcyBhIHN1cHBvcnRlZCBpbnZvY2F0aW9uIHdob3NlIGVudHJ5IGNvbmZpZyBpcyB0aGUgY2hpbGRcbiAgLy8gcGFja2FnZSByYXRoZXIgdGhhbiB0aGUgcmVwbyByb290LCBzbyByZWx5aW5nIG9uIHRoZSBlbnRyeSB3b3VsZCBlbWl0IGEgbmVzdGVkLCB1bnJlc29sdmFibGVcbiAgLy8gcGF0aCBmb3IgYSBkaXJlY3RseSB0YXJnZXRlZCBjb25maWcgcGFja2FnZS4gRXZlcnkgd2lsbGJvb3N0ZXItY29uZmlncyBwYWNrYWdlIGlzIGVpdGhlciB0aGVcbiAgLy8gcm9vdCBvciBhIGRpcmVjdCBjaGlsZCB1bmRlciBgcGFja2FnZXMvYCwgc28gdGhlIHJvb3QgaXMgdGhlIHBhY2thZ2UgZGlyIGl0c2VsZiBvciBpdHMgZ3JhbmRwYXJlbnQuXG4gIGNvbnN0IHJlcG9Sb290RGlyUGF0aCA9IGNvbmZpZy5pc1Jvb3QgPyBjb25maWcuZGlyUGF0aCA6IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy4uJywgJy4uJyk7XG4gIGNvbnN0IGxvY2FsRW50cnkgPSBwYXRoLnJlc29sdmUocmVwb1Jvb3REaXJQYXRoLCAncGFja2FnZXMnLCBjb25maWdQYWNrYWdlRGlyLCAnY29uZmlnLm1qcycpO1xuICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKGNvbmZpZy5kaXJQYXRoLCBsb2NhbEVudHJ5KTtcbiAgcmV0dXJuIHJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuJykgPyByZWxhdGl2ZVBhdGggOiBgLi8ke3JlbGF0aXZlUGF0aH1gO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNQdWJsaXNoZWRXaWxsYm9vc3RlckNvbmZpZ3NQYWNrYWdlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIGNvbmZpZy5pc1dpbGxCb29zdGVyQ29uZmlncyAmJlxuICAgICFjb25maWcuaXNSb290ICYmXG4gICAgY29uZmlnLnBhY2thZ2VKc29uPy5wcml2YXRlICE9PSB0cnVlICYmXG4gICAgQXJyYXkuaXNBcnJheShjb25maWcucGFja2FnZUpzb24/LmZpbGVzKSAmJlxuICAgIGNvbmZpZy5wYWNrYWdlSnNvbi5maWxlcy5sZW5ndGggPiAwXG4gICk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBlc2NhcGVSZWdFeHAsIHF1b3RlRm9yU2hlbGwgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi9zcmMnO1xuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYic7XG5pbXBvcnQgc2VtdmVyIGZyb20gJ3NlbXZlcic7XG5pbXBvcnQgeyBzb3J0UGFja2FnZUpzb24gfSBmcm9tICdzb3J0LXBhY2thZ2UtanNvbic7XG5pbXBvcnQgKiBhcyBhc3QgZnJvbSAndHlwZXNjcmlwdC91bnN0YWJsZS9hc3QnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiwgU2V0UmVxdWlyZWQgfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBnZXRMYXRlc3RDb21taXRIYXNoIH0gZnJvbSAnLi4vZ2l0aHViL2NvbW1pdC5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVzV29ya2VyVHlwZXMsIGdldFdvcmtlclR5cGVzU2NyaXB0RXJyb3IsIHR5cGUgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgY2xhc3NpZnlTY3JpcHRTZWdtZW50LCBzcGxpdFNjcmlwdFNlZ21lbnRzIH0gZnJvbSAnLi4vdXRpbHMvbWFuYWdlZFNjcmlwdFNlZ21lbnQuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGdpdEh1YlV0aWwgfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcbmltcG9ydCB7IGNvbWJpbmVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBkb2VzQ29udGFpbkphdmEsIGRvZXNDb250YWluSnNPclRzIH0gZnJvbSAnLi4vdXRpbHMvcGFja2FnZUNhcGFiaWxpdGllcy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHNwYXduU3luYywgc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0IH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcbmltcG9ydCB7IGdldFRzY29uZmlnQmFzZURlcGVuZGVuY2llcywgbWFuYWdlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyB9IGZyb20gJy4uL3V0aWxzL3RzY29uZmlnQmFzZS5qcyc7XG5pbXBvcnQgeyBwYXJzZVNvdXJjZUZpbGUgfSBmcm9tICcuLi91dGlscy90eXBlc2NyaXB0QXBpLmpzJztcbmltcG9ydCB7IGlzUHVibGlzaGVkV2lsbGJvb3N0ZXJDb25maWdzUGFja2FnZSB9IGZyb20gJy4uL3V0aWxzL3dpbGxib29zdGVyQ29uZmlnc1V0aWwuanMnO1xuaW1wb3J0IHtcbiAgZ2V0RGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyxcbiAgZ2V0V29ya3NwYWNlUGFja2FnZUpzb25QYXRocyxcbiAgaGFzRGVjbGFyZWRQYWNrYWdlc1N0YXJQYXR0ZXJuLFxuICBoYXNJbXBsaWNpdFdvcmtzcGFjZUJhc2VsaW5lLFxufSBmcm9tICcuLi91dGlscy93b3Jrc3BhY2VVdGlsLmpzJztcbmltcG9ydCB7IGJ1bk1pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXMsIGJ1bk1pbmltdW1SZWxlYXNlQWdlU2Vjb25kcyB9IGZyb20gJy4vYnVuZmlnLmpzJztcblxuY29uc3Qgb3hsaW50RGVwcyA9IFsnQHdpbGxib29zdGVyL294Zm10LWNvbmZpZycsICdAd2lsbGJvb3N0ZXIvb3hsaW50LWNvbmZpZycsICdveGZtdCcsICdveGxpbnQnLCAnb3hsaW50LXRzZ29saW50J107XG5jb25zdCB0eXBlc2NyaXB0RGVwZW5kZW5jeSA9ICd0eXBlc2NyaXB0Jztcbi8vIFR5cGVTY3JpcHQgNydzIGB0eXBlc2NyaXB0YCBwYWNrYWdlIGlzIHRoZSB0c2dvIG5hdGl2ZSBjb21waWxlciBhbmQgZXhwb3NlcyBub1xuLy8gcHJvZ3JhbW1hdGljIEFQSS4gTmV4dC5qcydzIGJ1aWxkLXRpbWUgYHZlcmlmeVR5cGVTY3JpcHRTZXR1cGAgbmVlZHMgdGhhdCBBUEksIHNvXG4vLyBgbmV4dCBidWlsZGAgZmFpbHMgKFwidHJ5aW5nIHRvIHVzZSBUeXBlU2NyaXB0IGJ1dCBkbyBub3QgaGF2ZSB0aGUgcmVxdWlyZWQgcGFja2FnZShzKVwiKVxuLy8gd2l0aCBvbmx5IGB0eXBlc2NyaXB0YCB2NyBpbnN0YWxsZWQuIE5leHQuanMgcmVzb2x2ZXMgdGhlIHRzZ28gYmluYXJ5IHRocm91Z2ggdGhlXG4vLyBzZXBhcmF0ZSBgQHR5cGVzY3JpcHQvbmF0aXZlLXByZXZpZXdgIHBhY2thZ2UsIHNvIE5leHQuanMtZmFtaWx5IHJlcG9zIG11c3QgaW5zdGFsbFxuLy8gYm90aDsgb3RoZXIgcmVwb3Mgb25seSBuZWVkIGB0eXBlc2NyaXB0YCBmb3IgYHRzY2AgdHlwZWNoZWNrcy5cbmNvbnN0IHR5cGVzY3JpcHRHb0RlcGVuZGVuY3kgPSAnQHR5cGVzY3JpcHQvbmF0aXZlLXByZXZpZXcnO1xuY29uc3Qgd2JEZXBlbmRlbmN5ID0gJ0B3aWxsYm9vc3Rlci93Yic7XG5jb25zdCBidWlsZFRzRGVwZW5kZW5jeSA9ICdidWlsZC10cyc7XG5jb25zdCBsZWZ0aG9va0RlcGVuZGVuY3kgPSAnbGVmdGhvb2snO1xuY29uc3QgbWFuYWdlZERlcGVuZGVuY3lOYW1lcyA9IG5ldyBTZXQoW1xuICB3YkRlcGVuZGVuY3ksXG4gIGJ1aWxkVHNEZXBlbmRlbmN5LFxuICBsZWZ0aG9va0RlcGVuZGVuY3ksXG4gIHR5cGVzY3JpcHREZXBlbmRlbmN5LFxuICB0eXBlc2NyaXB0R29EZXBlbmRlbmN5LFxuICAnc29ydC1wYWNrYWdlLWpzb24nLFxuICAvLyBNaXhlZCBAdHlwZXMvYnVuIHZlcnNpb25zIGFjcm9zcyBhIG1vbm9yZXBvIGxvYWQgdHdvIGJ1bi10eXBlcyBjb3BpZXMsIHdoaWNoXG4gIC8vIGJyZWFrcyBnbG9iYWwgaW50ZXJmYWNlIG1lcmdpbmcgKGUuZy4gUmVzcG9uc2UvSGVhZGVycykgZHVyaW5nIHR5cGUgY2hlY2tpbmcuXG4gICdAdHlwZXMvYnVuJyxcbiAgLi4ub3hsaW50RGVwcyxcbl0pO1xuY29uc3QgbGF0ZXN0RGVwZW5kZW5jeVZlcnNpb25DYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG5jb25zdCBwYWNrYWdlQWdlR2F0ZU1zID0gYnVuTWluaW11bVJlbGVhc2VBZ2VTZWNvbmRzICogMTAwMDtcbmNvbnN0IG5wbVBhY2thZ2VUaW1lc0NhY2hlID0gbmV3IE1hcDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KCk7XG5jb25zdCBkZXBlbmRlbmN5U2VjdGlvbktleXMgPSBbJ2RlcGVuZGVuY2llcycsICdkZXZEZXBlbmRlbmNpZXMnLCAnb3B0aW9uYWxEZXBlbmRlbmNpZXMnLCAncGVlckRlcGVuZGVuY2llcyddIGFzIGNvbnN0O1xuXG50eXBlIFdyaXRhYmxlUGFja2FnZUpzb24gPSBTZXRSZXF1aXJlZDxcbiAgUGFja2FnZUpzb24sXG4gICdzY3JpcHRzJyB8ICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcycgfCAncGVlckRlcGVuZGVuY2llcydcbj47XG5cbmludGVyZmFjZSBEZXBlbmRlbmN5VXBkYXRlcyB7XG4gIGRlcGVuZGVuY2llczogc3RyaW5nW107XG4gIGRldkRlcGVuZGVuY2llczogc3RyaW5nW107XG4gIHB5dGhvbkRldkRlcGVuZGVuY2llczogc3RyaW5nW107XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVBhY2thZ2VKc29uKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHNraXBBZGRpbmdEZXBzOiBib29sZWFuXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVBhY2thZ2VKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IGNvcmUoY29uZmlnLCByb290Q29uZmlnLCBza2lwQWRkaW5nRGVwcyk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZywgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZywgc2tpcEFkZGluZ0RlcHM6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qgd29ya2VyVHlwZXNTY3JpcHRFcnJvciA9IGdldFdvcmtlclR5cGVzU2NyaXB0RXJyb3IoY29uZmlnKTtcbiAgaWYgKHdvcmtlclR5cGVzU2NyaXB0RXJyb3IpIHRocm93IG5ldyBFcnJvcih3b3JrZXJUeXBlc1NjcmlwdEVycm9yKTtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgY29uc3QganNvbk9iaiA9IGF3YWl0IHJlYWRQYWNrYWdlSnNvbihmaWxlUGF0aCk7XG4gIHVwZGF0ZVNjcmlwdHMoY29uZmlnLCBqc29uT2JqKTtcbiAgYXdhaXQgZW5zdXJlVHJ1c3RlZERlcGVuZGVuY2llcyhjb25maWcsIGpzb25PYmopO1xuICBtb3ZlTWFuYWdlZFRvb2xEZXBlbmRlbmNpZXNUb0RldkRlcGVuZGVuY2llcyhqc29uT2JqKTtcbiAgcHJ1bmVDYXBhYmlsaXR5RGVwZW5kZW50Q29tcGlsZXJEZXBlbmRlbmNpZXMoY29uZmlnLCBqc29uT2JqKTtcbiAgY29uc3QgZGVwZW5kZW5jeVVwZGF0ZXMgPSBhd2FpdCBhcHBseVBhY2thZ2VKc29uQ29udmVudGlvbnMoY29uZmlnLCByb290Q29uZmlnLCBqc29uT2JqKTtcbiAgYXdhaXQgbm9ybWFsaXplUGFja2FnZU1ldGFkYXRhKGNvbmZpZywgcm9vdENvbmZpZywganNvbk9iaiwgZGVwZW5kZW5jeVVwZGF0ZXMpO1xuICAvLyBPbiBhIGZpcnN0IHJ1biB0aGVyZSBpcyBubyBtYW5pZmVzdCBmb3IgYGJ1biBhZGRgIHRvIHVwZGF0ZSByZWxpYWJseS4gV3JpdGUgdGhlIHJlc29sdmVkXG4gIC8vIGRlcGVuZGVuY3kgdmVyc2lvbnMgaW50byB0aGUgbmV3IG1hbmlmZXN0IGRpcmVjdGx5OyB0aGUgZmluYWwgcmVwb3NpdG9yeS13aWRlIGBidW4gaW5zdGFsbGBcbiAgLy8gdGhlbiBpbnN0YWxscyB0aGVtIGFuZCByZW1haW5zIHRoZSBhdXRob3JpdGF0aXZlIGZhaWx1cmUgY2hlY2suXG4gIGFkZERlcGVuZGVuY3lWZXJzaW9uc1RvUGFja2FnZUpzb24oXG4gICAgY29uZmlnLFxuICAgIHJvb3RDb25maWcsXG4gICAganNvbk9iaixcbiAgICBkZXBlbmRlbmN5VXBkYXRlcyxcbiAgICBza2lwQWRkaW5nRGVwcyB8fCAhY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb25cbiAgKTtcbiAgYXdhaXQgdXBkYXRlUHJpdmF0ZVBhY2thZ2VzKGpzb25PYmopO1xuICByZW1vdmVFbXB0eURlcGVuZGVuY3lTZWN0aW9ucyhqc29uT2JqKTtcblxuICBkZWxldGUganNvbk9iai5wYWNrYWdlTWFuYWdlcjtcbiAgLy8gWWFybiByZWFkcyBwYWNrYWdlLmpzb24gZnJvbSBkaXNrIGJlZm9yZSBkZWNpZGluZyB3aGV0aGVyIGB5YXJuIGFkZCAtRGBcbiAgLy8gY29uZmxpY3RzIHdpdGggYW4gZXhpc3RpbmcgcmVndWxhciBkZXBlbmRlbmN5LCBzbyB0aGlzIHdyaXRlIG11c3QgZmluaXNoXG4gIC8vIGJlZm9yZSBpbnN0YWxsaW5nIHRoZSBtYW5hZ2VkIGRlcGVuZGVuY3kgdXBkYXRlcyBiZWxvdy4gS2VlcCB0aGlzIGdlbmVyYXRlZFxuICAvLyBmaWxlIHNvcnRlZCBldmVuIHdoZW4gd2UgbGF0ZXIgcnVuIHRoZSB0YXJnZXQgcmVwb3NpdG9yeSdzIGZvcm1hdHRlciBzbyBhXG4gIC8vIG1pZC1ydW4gaW50ZXJydXB0aW9uIG5ldmVyIGxlYXZlcyBwYWNrYWdlLmpzb24gaW4gYSBwYXJ0aWFsbHkgbWFuYWdlZCBvcmRlci5cbiAgLy8gQSByZWZ1c2VkIHdyaXRlIChlLmcuIGEgc3ltbGlua2VkIHBhY2thZ2UuanNvbikgbXVzdCBhbHNvIGFib3J0IHRoZSBkZXBlbmRlbmN5IGluc3RhbGxhdGlvblxuICAvLyBiZWxvdzogYGJ1biBhZGRgIGZvbGxvd3MgdGhlIHN5bWxpbmsgYW5kIHdvdWxkIG1vZGlmeSB0aGUgZmlsZSBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LlxuICBpZiAoIShhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBzZXJpYWxpemVQYWNrYWdlSnNvbihqc29uT2JqKSkpKSByZXR1cm47XG5cbiAgaWYgKCFza2lwQWRkaW5nRGVwcykge1xuICAgIGluc3RhbGxEZXBlbmRlbmN5VXBkYXRlcyhjb25maWcsIHJvb3RDb25maWcsIGpzb25PYmosIGRlcGVuZGVuY3lVcGRhdGVzKTtcbiAgICAvLyBBIG5ld2x5IGNyZWF0ZWQgbWFuaWZlc3QgaXMgYWxyZWFkeSBzb3J0ZWQgYnkgd2JmeSdzIGJ1bmRsZWQgc2VyaWFsaXplcjsgdGhlIHRhcmdldCBmb3JtYXR0ZXJcbiAgICAvLyBpcyBhdmFpbGFibGUgd2l0aG91dCBhbiBleHRyYSBmZXRjaCBvbmx5IHdoZW4gdGhpcyBydW4gc3RhcnRlZCB3aXRoIHBhY2thZ2UuanNvbi5cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24pIHtcbiAgICAgIGZvcm1hdFBhY2thZ2VKc29uV2l0aFByb2plY3RGb3JtYXR0ZXIoY29uZmlnLCBmaWxlUGF0aCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNlcmlhbGl6ZVBhY2thZ2VKc29uKGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24pOiBzdHJpbmcge1xuICAvLyBmc1V0aWwuZ2VuZXJhdGVGaWxlKCkgbm9ybWFsaXplcyB0aGUgdHJhaWxpbmcgbmV3bGluZSwgc28ga2VlcCB0aGUgc2VyaWFsaXplclxuICAvLyBmb2N1c2VkIG9uIHRoZSBKU09OIHBheWxvYWQgaXRzZWxmLlxuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoc29ydFBhY2thZ2VKc29uKGpzb25PYmopLCB1bmRlZmluZWQsIDIpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkUGFja2FnZUpzb24oZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8V3JpdGFibGVQYWNrYWdlSnNvbj4ge1xuICBsZXQganNvbk9iajogUGFja2FnZUpzb24gPSB7fTtcbiAgdHJ5IHtcbiAgICBjb25zdCBqc29uVGV4dCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgIGpzb25PYmogPSBKU09OLnBhcnNlKGpzb25UZXh0KSBhcyBQYWNrYWdlSnNvbjtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyBEb2N1bWVudGF0aW9uLW9ubHkgcmVwb3NpdG9yaWVzIGhhdmUgbm8gbWFuaWZlc3Qgb24gdGhlaXIgZmlyc3Qgd2JmeSBydW4uIFN0YXJ0aW5nIGZyb20gYW5cbiAgICAvLyBlbXB0eSBvYmplY3QgbGV0cyB0aGUgbm9ybWFsIGdlbmVyYXRvciBlc3RhYmxpc2ggdGhlIHNhbWUgbWFuYWdlZCBiYXNlbGluZSBhcyBldmVyeSBvdGhlclxuICAgIC8vIHJlcG9zaXRvcnk7IG1hbGZvcm1lZCBvciB1bnJlYWRhYmxlIGV4aXN0aW5nIG1hbmlmZXN0cyBtdXN0IHN0aWxsIGZhaWwgbG91ZGx5LlxuICAgIGlmICgoZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlICE9PSAnRU5PRU5UJykgdGhyb3cgZXJyb3I7XG4gIH1cbiAganNvbk9iai5zY3JpcHRzID0ganNvbk9iai5zY3JpcHRzID8/IHt9O1xuICBqc29uT2JqLmRlcGVuZGVuY2llcyA9IGpzb25PYmouZGVwZW5kZW5jaWVzID8/IHt9O1xuICBqc29uT2JqLmRldkRlcGVuZGVuY2llcyA9IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICBqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXMgPSBqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXMgPz8ge307XG4gIHJldHVybiBqc29uT2JqIGFzIFdyaXRhYmxlUGFja2FnZUpzb247XG59XG5cbmZ1bmN0aW9uIHBydW5lQ2FwYWJpbGl0eURlcGVuZGVudENvbXBpbGVyRGVwZW5kZW5jaWVzKGNvbmZpZzogUGFja2FnZUNvbmZpZywganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbik6IHZvaWQge1xuICAvLyBSdW4gYmVmb3JlIGFwcGx5UGFja2FnZUpzb25Db252ZW50aW9ucywgd2hpY2ggcmUtYWRkcyB0c2dvIG9ubHkgZm9yIGN1cnJlbnQgTmV4dC5qcy1mYW1pbHkgcmVwb3NpdG9yaWVzLlxuICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXNbdHlwZXNjcmlwdEdvRGVwZW5kZW5jeV07XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1t0eXBlc2NyaXB0R29EZXBlbmRlbmN5XTtcbiAgaWYgKCFjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0ICYmICFjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llc1t0eXBlc2NyaXB0RGVwZW5kZW5jeV07XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW3R5cGVzY3JpcHREZXBlbmRlbmN5XTtcbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVTY3JpcHRzKGNvbmZpZzogUGFja2FnZUNvbmZpZywganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbik6IHZvaWQge1xuICBqc29uT2JqLnNjcmlwdHMgPSB7IC4uLmpzb25PYmouc2NyaXB0cywgLi4uZ2VuZXJhdGVTY3JpcHRzKGNvbmZpZywganNvbk9iai5zY3JpcHRzKSB9O1xufVxuXG4vKipcbiAqIEtlZXBzIHRoZSBwcm9qZWN0J3Mgb3duIHNlZ21lbnRzIGluIG9yZGVyLCByZXBsYWNpbmcgdGhlIGZpcnN0IG1hbmFnZWQgZ2VuLWNvZGUgc3BlbGxpbmcgd2l0aFxuICogYGJ1biB3YiBnZW4tY29kZWAgYW5kIGRyb3BwaW5nIGxhdGVyIGR1cGxpY2F0ZXMuIEFwcGVuZHMgZ2VuZXJhdGlvbiBvbmx5IHdoZW4gdGhlIHNjcmlwdFxuICogY29udGFpbmVkIG5vbmUsIHNvIG5vdGhpbmcgaXMgcmVvcmRlcmVkLlxuICovXG5mdW5jdGlvbiByZWJ1aWxkUG9zdGluc3RhbGxTZWdtZW50cyhzZWdtZW50czogc3RyaW5nW10sIHNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGtpbmRzID0gc2VnbWVudHMubWFwKChzZWdtZW50KSA9PiBjbGFzc2lmeVNjcmlwdFNlZ21lbnQoc2VnbWVudCwgc2NyaXB0cywgdHJ1ZSkpO1xuICAvLyBBIHdyYXBwZXIgYXJvdW5kIGEgY3VzdG9taXplZCBnZW4tY29kZSBhbHJlYWR5IGdlbmVyYXRlczsgYWRkaW5nIGFub3RoZXIgaW52b2NhdGlvbiB3b3VsZCBydW4gZXZlcnlcbiAgLy8gZ2VuZXJhdG9yIHR3aWNlLlxuICBsZXQgZ2VuZXJhdGlvblBsYWNlZCA9IGtpbmRzLmluY2x1ZGVzKCdnZW5Db2RlV3JhcHBlcicpO1xuICBjb25zdCByZXN1bHQ6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgW2luZGV4LCBzZWdtZW50XSBvZiBzZWdtZW50cy5lbnRyaWVzKCkpIHtcbiAgICBjb25zdCBraW5kID0ga2luZHNbaW5kZXhdO1xuICAgIGlmIChraW5kID09PSAnY3VzdG9tJyB8fCBraW5kID09PSAnZ2VuQ29kZVdyYXBwZXInKSB7XG4gICAgICByZXN1bHQucHVzaChzZWdtZW50KTtcbiAgICB9IGVsc2UgaWYgKCFnZW5lcmF0aW9uUGxhY2VkKSB7XG4gICAgICByZXN1bHQucHVzaCgnYnVuIHdiIGdlbi1jb2RlJyk7XG4gICAgICBnZW5lcmF0aW9uUGxhY2VkID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgaWYgKCFnZW5lcmF0aW9uUGxhY2VkKSByZXN1bHQucHVzaCgnYnVuIHdiIGdlbi1jb2RlJyk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBtYW5hZ2VkIGdlbi1jb2RlIHNlZ21lbnRzIHdoaWxlIGtlZXBpbmcgdGhlIGZpcnN0IHNlZ21lbnQncyBwb3NpdGlvbiBzbyBhIGN1c3RvbVxuICogc3RlcCB0aGF0IGNvbnN1bWVzIGdlbmVyYXRlZCBvdXRwdXQgc3RpbGwgcnVucyBhZnRlciBpdC4gUmV0dXJucyB3aXRob3V0IGNoYW5naW5nIGFuXG4gKiB1bnBhcnNlYWJsZSBzY3JpcHQuXG4gKi9cbmZ1bmN0aW9uIHVwZGF0ZVBvc3RpbnN0YWxsU2NyaXB0KHNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMsIG1hbmFnZXNXb3JrZXJUeXBlczogYm9vbGVhbik6IHZvaWQge1xuICAvLyBgYnVuIHdiIGdlbi1jb2RlYCByZWdlbmVyYXRlcyB3b3JrZXItY29uZmlndXJhdGlvbi5kLnRzIGl0c2VsZiwgc28gYSBwYWNrYWdlIHdpdGggYVxuICAvLyBjb2RlLWdlbmVyYXRpb24gb3Igd29ya2VyLXR5cGVzIHBpcGVsaW5lIGdldHMgb25lIG1hbmFnZWQgZ2VuZXJhdGlvbiBzZWdtZW50LlxuICBpZiAoc2NyaXB0c1snZ2VuLWNvZGUnXSB8fCBtYW5hZ2VzV29ya2VyVHlwZXMpIHtcbiAgICAvLyBQcm9qZWN0LW93bmVkIHN0ZXBzIGFyZSBuZXZlciBkcm9wcGVkLCBhbmQgdGhlaXIgUE9TSVRJT04gcmVsYXRpdmUgdG8gZ2VuZXJhdGlvbiBpcyBwcmVzZXJ2ZWQ6IGEgc3RlcFxuICAgIC8vIGJlZm9yZSBpdCBtYXkgcHJvZHVjZSBgd3JhbmdsZXIgdHlwZXNgJyBpbnB1dHMgKGEgd3JhbmdsZXIgY29uZmlnLCBgLmRldi52YXJzYCksIHdoaWxlIG9uZSBhZnRlciBpdCBtYXlcbiAgICAvLyBjb25zdW1lIHRoZSBnZW5lcmF0ZWQgdHlwZXMuIFNvIHRoZSBtYW5hZ2VkIGdlbmVyYXRpb24gcmVwbGFjZXMgdGhlIGZpcnN0IG1hbmFnZWQgc2VnbWVudCBpbiBwbGFjZSwgYW5kIGlzXG4gICAgLy8gYXBwZW5kZWQgb25seSB3aGVuIHRoZSBzY3JpcHQgaGFkIG5vbmUuIEEgd3JhcHBlciBhcm91bmQgYSBjdXN0b21pemVkIGdlbi1jb2RlIGFscmVhZHkgcGVyZm9ybXMgdGhlXG4gICAgLy8gZ2VuZXJhdGlvbiBwbHVzIHRoZSBwcm9qZWN0J3Mgb3duIHN0ZXBzLCBzbyBpdCBzdXBwcmVzc2VzIHRoZSByZXBsYWNlbWVudCBlbnRpcmVseS5cbiAgICBjb25zdCBzZWdtZW50cyA9IHNjcmlwdHMucG9zdGluc3RhbGwgPT09IHVuZGVmaW5lZCA/IFtdIDogc3BsaXRTY3JpcHRTZWdtZW50cyhzY3JpcHRzLnBvc3RpbnN0YWxsKTtcbiAgICBjb25zdCBrZXB0U2VnbWVudHMgPSBzZWdtZW50cyAmJiByZWJ1aWxkUG9zdGluc3RhbGxTZWdtZW50cyhzZWdtZW50cywgc2NyaXB0cyk7XG4gICAgaWYgKGtlcHRTZWdtZW50cykge1xuICAgICAgc2NyaXB0cy5wb3N0aW5zdGFsbCA9IGtlcHRTZWdtZW50cy5qb2luKCcgJiYgJyk7XG4gICAgfVxuICAgIC8vIEFueSBvdGhlciB1bnBhcnNlYWJsZSBwb3N0aW5zdGFsbCBpcyBsZWZ0IHRvIGEgaHVtYW4gcmF0aGVyIHRoYW4gcmV3cml0dGVuIGZyb20gYSB3cm9uZyBwYXJzZS5cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBhcHBseVBhY2thZ2VKc29uQ29udmVudGlvbnMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvblxuKTogUHJvbWlzZTxEZXBlbmRlbmN5VXBkYXRlcz4ge1xuICBjb25zdCBkZXBlbmRlbmNpZXM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IGRldkRlcGVuZGVuY2llcyA9IFsnc29ydC1wYWNrYWdlLWpzb24nXTtcbiAgY29uc3QgcHl0aG9uRGV2RGVwZW5kZW5jaWVzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBoYXNKYXZhID0gZG9lc0NvbnRhaW5KYXZhKGNvbmZpZyk7XG5cbiAgaWYgKFxuICAgIGhhc0phdmEgJiZcbiAgICAhZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocm9vdENvbmZpZy5kaXJQYXRoLCAnLnByZXR0aWVycmMuanNvbicpKSAmJlxuICAgICFmcy5leGlzdHNTeW5jKHBhdGguam9pbihjb25maWcuZGlyUGF0aCwgJy5wcmV0dGllcnJjLmpzb24nKSlcbiAgKSB7XG4gICAganNvbk9iai5wcmV0dGllciA9ICdAd2lsbGJvb3N0ZXIvcHJldHRpZXItY29uZmlnJztcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgncHJldHRpZXItcGx1Z2luLWphdmEnLCAnQHdpbGxib29zdGVyL3ByZXR0aWVyLWNvbmZpZycpO1xuICB9XG4gIGlmIChoYXNKYXZhKSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ3ByZXR0aWVyJyk7XG4gIH1cblxuICBpZiAoY29uZmlnLmlzUm9vdCkge1xuICAgIC8vIExlZnRob29rIGdlbmVyYXRpb24gaXMgYmVzdC1lZmZvcnQgYW5kIC5sZWZ0aG9vayBpcyBhYnNlbnQgZnJvbSBEb2NrZXIgYnVpbGQgY29udGV4dHMsIHNvIGFcbiAgICAvLyBtaXNzaW5nIG5vcm1hbGl6ZXIgaXMgdmFsaWQuIE9uY2UgcHJlc2VudCwgaXRzIGZhaWx1cmUgbXVzdCBhYm9ydCBpbnN0YWxsIHJhdGhlciB0aGFuIGxlYXZlIGFcbiAgICAvLyBHdWFyZC1waW5uZWQgbG9ja2ZpbGUgYmVoaW5kOyBrZWVwIHRoYXQgZmFpbC1mYXN0IGdyb3VwaW5nIGV4cGxpY2l0IGJlZm9yZSBhbnkgd29ya3NwYWNlIGJ1aWxkLlxuICAgIGpzb25PYmouc2NyaXB0cy5wcmVwYXJlID1cbiAgICAgICcoYnVuIGxlZnRob29rIGluc3RhbGwgfHwgdHJ1ZSkgJiYgKHRlc3QgISAtZiAubGVmdGhvb2svbm9ybWFsaXplLWJ1bi1sb2NrZmlsZS5zaCB8fCBiYXNoIC5sZWZ0aG9vay9ub3JtYWxpemUtYnVuLWxvY2tmaWxlLnNoKSc7XG4gICAgLy8gV2hlbiBAd2lsbGJvb3N0ZXIvd2IgaXMgYSB3b3Jrc3BhY2Ugb2YgdGhpcyByZXBvc2l0b3J5LCB0aGUgZ2VuZXJhdGVkIGBidW4gd2Ig4oCmYCBzY3JpcHRzIHJ1blxuICAgIC8vIGl0cyBnaXRpZ25vcmVkIGRpc3QgYnVpbGQgKGJpbi9pbmRleC5qcyBpbXBvcnRzIC4uL2Rpc3QvaW5kZXguanMpLCBzbyBhIGZyZXNoIGNoZWNrb3V0IG11c3RcbiAgICAvLyBidWlsZCBpdCBkdXJpbmcgaW5zdGFsbDsgcmVnaXN0cnkgaW5zdGFsbHMgc2hpcCBhIHByZWJ1aWx0IGRpc3QgYW5kIG5lZWQgbm8gZXh0cmEgc3RlcC5cbiAgICBjb25zdCB3YldvcmtzcGFjZURpciA9IGdldFdvcmtzcGFjZVBhY2thZ2VEaXJzKHJvb3RDb25maWcpLmdldCh3YkRlcGVuZGVuY3kpO1xuICAgIGlmICh3YldvcmtzcGFjZURpcikge1xuICAgICAgLy8gUXVvdGVkIHVubGVzcyB0aGUgbmFtZSBjYXJyaWVzIG5vIHNoZWxsIG1lYW5pbmcsIHNvIHRoYXQgYCQo4oCmKWAgb3IgYSB2YXJpYWJsZSBhIGhvc3RpbGVcbiAgICAgIC8vIGRpcmVjdG9yeSBuYW1lIGNvdWxkIHNtdWdnbGUgaW50byB0aGUgZ2VuZXJhdGVkIHNjcmlwdCBuZXZlciByZWFjaGVzIHRoZSBzaGVsbCB1bnF1b3RlZC5cbiAgICAgIGpzb25PYmouc2NyaXB0cy5wcmVwYXJlICs9IGAgJiYgYnVuIHJ1biAtLWN3ZCAke3F1b3RlRm9yU2hlbGwod2JXb3Jrc3BhY2VEaXIpfSBidWlsZGA7XG4gICAgfVxuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKGxlZnRob29rRGVwZW5kZW5jeSk7XG5cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5zZW1hbnRpY1JlbGVhc2UpIHtcbiAgICAgIGlmIChkb2VzUmVsZWFzZVNjcmlwdEluc3RhbGxTZW1hbnRpY1JlbGVhc2UoanNvbk9iai5zY3JpcHRzLnJlbGVhc2UpKSB7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snc2VtYW50aWMtcmVsZWFzZSddO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydzZW1hbnRpYy1yZWxlYXNlJ10gJiZcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydtdWx0aS1zZW1hbnRpYy1yZWxlYXNlJ10gJiZcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAcWl3aS9tdWx0aS1zZW1hbnRpYy1yZWxlYXNlJ11cbiAgICAgICkge1xuICAgICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnc2VtYW50aWMtcmVsZWFzZScpO1xuICAgICAgfVxuICAgICAganNvbk9iai52ZXJzaW9uID0gJzAuMC4wLXNlbWFudGljYWxseS1yZWxlYXNlZCc7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpIHtcbiAgICAgIC8vIFNpbmNlIGFydGlsbGVyeSByZXF1aXJlcyBhIHNwZWNpZmljIHZlcnNpb24gb2YgQHBsYXl3cmlnaHQvdGVzdFxuICAgICAgY29uc3QgaGFzQXJ0aWxsZXJ5ID0ganNvbk9iai5kZXBlbmRlbmNpZXMuYXJ0aWxsZXJ5IHx8IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLmFydGlsbGVyeTtcbiAgICAgIC8vIFNpbmNlIGxsbS10b29sYm94IHJlcXVpcmVzIEBwbGF5d3JpZ2h0L3Rlc3QgaW4gZGVwZW5kZW5jaWVzXG4gICAgICBpZiAoIWhhc0FydGlsbGVyeSAmJiAhanNvbk9iai5kZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXSkge1xuICAgICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnQHBsYXl3cmlnaHQvdGVzdCcpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFJ1bnRpbWUpIHtcbiAgICAgICAgLy8gUnVudGltZSBpbXBvcnRzIG5lZWQgdGhlIHN0YW5kYWxvbmUgcGFja2FnZSBhZnRlciBEb2NrZXIgcHJ1bmluZyByZW1vdmVzIGRldkRlcGVuZGVuY2llcy5cbiAgICAgICAganNvbk9iai5kZXBlbmRlbmNpZXMucGxheXdyaWdodCA/Pz1cbiAgICAgICAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5wbGF5d3JpZ2h0ID8/XG4gICAgICAgICAganNvbk9iai5kZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXSA/P1xuICAgICAgICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAcGxheXdyaWdodC90ZXN0J107XG4gICAgICAgIGRlcGVuZGVuY2llcy5wdXNoKCdwbGF5d3JpZ2h0Jyk7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5wbGF5d3JpZ2h0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQ7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5wbGF5d3JpZ2h0O1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMpIHtcbiAgICAgIC8vIFdlIGRvbid0IGFsbG93IG5vbi1hcnJheSB3b3Jrc3BhY2VzIGluIG1vbm9yZXBvLiBZYXJuIHYxJ3Mgb2JqZWN0IGZvcm0ga2VlcHMgaXRzXG4gICAgICAvLyBkZWNsYXJlZCBwYXR0ZXJucyAod29ya3NwYWNlcy5wYWNrYWdlcyk7IG9ubHkgZXh0cmFzIHN1Y2ggYXMgbm9ob2lzdCBhcmUgZHJvcHBlZC5cbiAgICAgIC8vIEZvcmNlIGBwYWNrYWdlcy8qYCBvbmx5IHdoZW4gaXQgYWN0dWFsbHkgbWF0Y2hlcyBhIHdvcmtzcGFjZSBtYW5pZmVzdDogYW4gYXBwcy8qLW9ubHlcbiAgICAgIC8vIG1vbm9yZXBvIG11c3Qgbm90IGdldCBhIG5ldmVyLW1hdGNoaW5nIHBhdHRlcm4gYXBwZW5kZWQgdG8gaXRzIGRlY2xhcmF0aW9uLiBBXG4gICAgICAvLyBiYXNlbGluZS1zZWVkaW5nIGRlY2xhcmF0aW9uIG5lZWRzIG5vIGZvcmNlZCBwYXR0ZXJuIGF0IGFsbCDigJQgdGhlIHNlZWRlZCBiYXNlbGluZVxuICAgICAgLy8gKGAqLypgIG9yIGAqKmApIGFscmVhZHkgY292ZXJzIHBhY2thZ2VzLyouIFRoZSBmb3JjZWQgcGF0dGVybiBpcyBQUkVQRU5ERUQ6IEJ1blxuICAgICAgLy8gZXZhbHVhdGVzIHdvcmtzcGFjZSBwYXR0ZXJucyBzZXF1ZW50aWFsbHksIHNvIGEgcG9zaXRpdmUgcGF0dGVybiBwbGFjZWQgYWZ0ZXIgYSB1c2VyXG4gICAgICAvLyBuZWdhdGlvbiB3b3VsZCByZS1pbmNsdWRlIHRoZSBuZWdhdGVkIHBhY2thZ2VzLiBBIGRlY2xhcmF0aW9uIHRoYXQgYWxyZWFkeSBjb3ZlcnNcbiAgICAgIC8vIHBhY2thZ2VzLyogdW5kZXIgbm9ybWFsaXphdGlvbiAoZS5nLiBgLi9wYWNrYWdlcy8qYCkgaXMga2VwdCB2ZXJiYXRpbTogZm9yY2luZyBhIHRleHR1YWxcbiAgICAgIC8vIGBwYWNrYWdlcy8qYCBuZXh0IHRvIGl0IHdvdWxkIHBlcnNpc3QgYSBkdXBsaWNhdGUgZXF1aXZhbGVudCBwYXR0ZXJuLlxuICAgICAgY29uc3QgZm9yY2VkUGF0dGVybnMgPVxuICAgICAgICAhaGFzSW1wbGljaXRXb3Jrc3BhY2VCYXNlbGluZShqc29uT2JqLndvcmtzcGFjZXMpICYmXG4gICAgICAgICFoYXNEZWNsYXJlZFBhY2thZ2VzU3RhclBhdHRlcm4oanNvbk9iai53b3Jrc3BhY2VzKSAmJlxuICAgICAgICBmZy5nbG9iU3luYygncGFja2FnZXMvKi9wYWNrYWdlLmpzb24nLCB7IGN3ZDogY29uZmlnLmRpclBhdGgsIGlnbm9yZTogWycqKi9ub2RlX21vZHVsZXMvKionXSB9KS5sZW5ndGggPiAwXG4gICAgICAgICAgPyBbJ3BhY2thZ2VzLyonXVxuICAgICAgICAgIDogW107XG4gICAgICBqc29uT2JqLndvcmtzcGFjZXMgPSBtZXJnZS5hbGwoW2ZvcmNlZFBhdHRlcm5zLCBnZXREZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zKGpzb25PYmoud29ya3NwYWNlcyldLCB7XG4gICAgICAgIGFycmF5TWVyZ2U6IGNvbWJpbmVNZXJnZSxcbiAgICAgIH0pO1xuICAgICAgLy8gQm90aCBpbnB1dHMgY2FuIGJlIGVtcHR5IChlLmcuIHBhY2thZ2VzL3BhY2thZ2UuanNvbiB3aXRob3V0IGFueSBwYWNrYWdlcy8qL3BhY2thZ2UuanNvblxuICAgICAgLy8gYW5kIG5vIGRlY2xhcmVkIHdvcmtzcGFjZXMpOyBkbyBub3QgcGVyc2lzdCBhIG1lYW5pbmdsZXNzIGB3b3Jrc3BhY2VzOiBbXWAuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShqc29uT2JqLndvcmtzcGFjZXMpICYmIGpzb25PYmoud29ya3NwYWNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgZGVsZXRlIGpzb25PYmoud29ya3NwYWNlcztcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoanNvbk9iai53b3Jrc3BhY2VzKSkge1xuICAgICAganNvbk9iai53b3Jrc3BhY2VzID0ganNvbk9iai53b3Jrc3BhY2VzLmZpbHRlcihcbiAgICAgICAgKHdvcmtzcGFjZSkgPT5cbiAgICAgICAgICBmZy5nbG9iU3luYyh3b3Jrc3BhY2UsIHtcbiAgICAgICAgICAgIGRvdDogdHJ1ZSxcbiAgICAgICAgICAgIGN3ZDogY29uZmlnLmRpclBhdGgsXG4gICAgICAgICAgICBpZ25vcmU6IGdsb2JJZ25vcmUsXG4gICAgICAgICAgfSkubGVuZ3RoID4gMFxuICAgICAgKTtcbiAgICAgIGlmIChqc29uT2JqLndvcmtzcGFjZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLndvcmtzcGFjZXM7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gZml4ZXJzL25leHRDb25maWcudHMgZW5hYmxlcyBgcmVhY3RDb21waWxlcjogdHJ1ZWAgZm9yIGV2ZXJ5IE5leHQuanMgcHJvamVjdCwgYW5kIE5leHQuanNcbiAgLy8gcmVzb2x2ZXMgYGJhYmVsLXBsdWdpbi1yZWFjdC1jb21waWxlcmAgYXQgYnVpbGQgdGltZSB3aGVuIFJlYWN0IENvbXBpbGVyIGlzIG9uLiBBZGQgaXQgaGVyZSBzb1xuICAvLyB0aGUgbWFuYWdlZCBuZXh0LmNvbmZpZyBuZXZlciBicmVha3MgYG5leHQgYnVpbGRgIHdpdGggYW4gdW5yZXNvbHZlZC1wYWNrYWdlIGVycm9yLlxuICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ2JhYmVsLXBsdWdpbi1yZWFjdC1jb21waWxlcicpO1xuICB9XG5cbiAgLy8gYHdiIHZlcmlmeSAtLWZ1bGxgIGF1ZGl0cyBldmVyeSBgKi5zbGlkZXYubWRgIGRlY2sgd2l0aCBzbGlkZXYtY2hlY2ssIHNvIHRoZSBjaGVja2VyIGhhcyB0byBiZVxuICAvLyBpbnN0YWxsZWQgd2hlcmV2ZXIgYSBkZWNrIGxpdmVzLlxuICBpZiAoY29uZmlnLmRvZXNDb250YWluU2xpZGV2TWQpIHtcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnc2xpZGV2LWNoZWNrJyk7XG4gIH1cblxuICBpZiAoIWlzV2JQYWNrYWdlKGpzb25PYmopKSB7XG4gICAgLy8gQSBgd29ya3NwYWNlOmAgc3BlY2lmaWVyIGRlcGVuZHMgb24gdGhlIHdiIGRldmVsb3BlZCBpbiB0aGlzIHJlcG9zaXRvcnkgKGUuZy5cbiAgICAvLyBXaWxsQm9vc3Rlci9zaGFyZWQgaXRzZWxmKTsgaW5zdGFsbGluZyB0aGUgbGF0ZXN0IHJlZ2lzdHJ5IHJlbGVhc2Ugb3ZlciBpdCB3b3VsZCBzaWxlbnRseVxuICAgIC8vIHJlcGxhY2UgdGhlIGxvY2FsIGJ1aWxkIHdpdGggYSBwdWJsaXNoZWQgb25lLCBzbyBsZWF2ZSBzdWNoIGEgZGVjbGFyYXRpb24gdW50b3VjaGVkLlxuICAgIGNvbnN0IHdiU3BlY2lmaWVyID0ganNvbk9iai5kZXBlbmRlbmNpZXNbd2JEZXBlbmRlbmN5XSA/PyBqc29uT2JqLmRldkRlcGVuZGVuY2llc1t3YkRlcGVuZGVuY3ldO1xuICAgIGlmICghd2JTcGVjaWZpZXI/LnN0YXJ0c1dpdGgoJ3dvcmtzcGFjZTonKSkge1xuICAgICAgaWYgKHNob3VsZEtlZXBXYkFzUnVudGltZURlcGVuZGVuY3koanNvbk9iaikpIHtcbiAgICAgICAgZGVwZW5kZW5jaWVzLnB1c2god2JEZXBlbmRlbmN5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKHdiRGVwZW5kZW5jeSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8vIGJ1aWxkLXRzIG93bnMgVHlwZVNjcmlwdCBleGVjdXRpb24gYW5kIGRlY2xhcmF0aW9uIGVtaXQuIHdiZnkgbXVzdCBhbHdheXNcbiAgLy8ga2VlcCBleGlzdGluZyBidWlsZC10cyB1c2VycyBjdXJyZW50IGJlY2F1c2Ugb2xkZXIgcmVsZWFzZXMgY2FuIGVtaXQgLmQudHNcbiAgLy8gZmlsZXMgYXQgcGF0aHMgdGhhdCBubyBsb25nZXIgbWF0Y2ggcGFja2FnZSBleHBvcnRzLlxuICBpZiAoXG4gICAganNvbk9iai5kZXBlbmRlbmNpZXNbYnVpbGRUc0RlcGVuZGVuY3ldIHx8XG4gICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbYnVpbGRUc0RlcGVuZGVuY3ldIHx8XG4gICAgT2JqZWN0LnZhbHVlcyhqc29uT2JqLnNjcmlwdHMpLnNvbWUoKHNjcmlwdCkgPT4gc2NyaXB0Py5pbmNsdWRlcyhidWlsZFRzRGVwZW5kZW5jeSkpXG4gICkge1xuICAgIGlmIChzaG91bGRLZWVwQnVpbGRUc0FzUnVudGltZURlcGVuZGVuY3koanNvbk9iaikpIHtcbiAgICAgIGRlcGVuZGVuY2llcy5wdXNoKGJ1aWxkVHNEZXBlbmRlbmN5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goYnVpbGRUc0RlcGVuZGVuY3kpO1xuICAgIH1cbiAgfVxuICBpZiAoZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKSkge1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKC4uLm94bGludERlcHMpO1xuICAgIC8vIFRoZSBnZW5lcmF0ZWQgKi5jb25maWcudHMgZmlsZXMgYXJlIHR5cGUtY2hlY2tlZCBieSB0aGUgbGludCBwcm9qZWN0IGV2ZW4gaW4gSmF2YVNjcmlwdC1vbmx5XG4gICAgLy8gcmVwb3NpdG9yaWVzLiBSZWFjdCBOYXRpdmUgcmVsaWVzIG9uIEB0c2NvbmZpZy9yZWFjdC1uYXRpdmUncyBhbWJpZW50IHR5cGVzIGluc3RlYWQuXG4gICAgaWYgKCFjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnQHR5cGVzL2J1bicpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHRzY29uZmlnQmFzZURlcGVuZGVuY2llcyA9IGRvZXNDb250YWluSnNPclRzKGNvbmZpZykgPyBnZXRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMoY29uZmlnKSA6IFtdO1xuICBhd2FpdCByZW1vdmVVbnVzZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMoY29uZmlnLCBqc29uT2JqLCB0c2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMpO1xuICBkZXZEZXBlbmRlbmNpZXMucHVzaCguLi50c2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMpO1xuXG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzKSB7XG4gICAgLy8gVHlwZVNjcmlwdCA3IHNoaXBzIHRoZSBuYXRpdmUgY29tcGlsZXIgYXMgdGhlIGB0eXBlc2NyaXB0YCBwYWNrYWdlLCBzbyBpdCBpc1xuICAgIC8vIG5vdyB0aGUgbWFuYWdlZCBjb21waWxlciBmb3IgZXZlcnkgVHlwZVNjcmlwdCByZXBvICh0eXBlY2hlY2tpbmcgcnVucyBgdHNjYCkuXG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2godHlwZXNjcmlwdERlcGVuZGVuY3kpO1xuICAgIC8vIE5leHQuanMncyBgbmV4dCBidWlsZGAgaW5zcGVjdHMgYEB0eXBlc2NyaXB0L25hdGl2ZS1wcmV2aWV3YCAodHNnbykgdG8gcnVuIGl0cyB0eXBlXG4gICAgLy8gY2hlY2s7IHRoZSBgdHlwZXNjcmlwdGAgdjcgcGFja2FnZSBhbG9uZSBsYWNrcyB0aGUgQVBJIG5leHQgbmVlZHMsIHNvIGtlZXAgYm90aFxuICAgIC8vIGluc3RhbGxlZCBmb3IgTmV4dC5qcy1mYW1pbHkgcmVwb3MuIFNlZSB0aGUgdHlwZXNjcmlwdEdvRGVwZW5kZW5jeSBjb21tZW50IGFib3ZlLlxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLm5leHQgfHwgY29uZmlnLmRlcGVuZGluZy5ibGl0eiB8fCBjb25maWcuZGVwZW5kaW5nLnZpbmV4dCkge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2godHlwZXNjcmlwdEdvRGVwZW5kZW5jeSk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGpzb25PYmouZGVwZW5kZW5jaWVzLmplc3QgfHxcbiAgICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLmplc3QgfHxcbiAgICAgIGpzb25PYmouZGVwZW5kZW5jaWVzWydAamVzdC9nbG9iYWxzJ10gfHxcbiAgICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAamVzdC9nbG9iYWxzJ10gfHxcbiAgICAgIGpzb25PYmouZGVwZW5kZW5jaWVzWyd0cy1qZXN0J10gfHxcbiAgICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWyd0cy1qZXN0J11cbiAgICApIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAdHlwZXMvamVzdCcpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3MpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZGVwZW5kZW5jaWVzOiBkZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFkZXAuaW5jbHVkZXMoJ0B3aWxsYm9vc3Rlci8nKSksXG4gICAgICBkZXZEZXBlbmRlbmNpZXM6IGRldkRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWRlcC5pbmNsdWRlcygnQHdpbGxib29zdGVyLycpKSxcbiAgICAgIHB5dGhvbkRldkRlcGVuZGVuY2llcyxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHsgZGVwZW5kZW5jaWVzLCBkZXZEZXBlbmRlbmNpZXMsIHB5dGhvbkRldkRlcGVuZGVuY2llcyB9O1xufVxuXG5mdW5jdGlvbiBkb2VzUmVsZWFzZVNjcmlwdEluc3RhbGxTZW1hbnRpY1JlbGVhc2Uoc2NyaXB0OiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmICh0eXBlb2Ygc2NyaXB0ICE9PSAnc3RyaW5nJykgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gL1xcYig/OmJ1bnh8bnB4fHBucG1cXHMrZGx4fHlhcm5cXHMrZGx4KVxccytzZW1hbnRpYy1yZWxlYXNlKD86QFxcUyspP1xcYi91LnRlc3Qoc2NyaXB0KTtcbn1cblxuZnVuY3Rpb24gbW92ZU1hbmFnZWRUb29sRGVwZW5kZW5jaWVzVG9EZXZEZXBlbmRlbmNpZXMoanNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbik6IHZvaWQge1xuICBmb3IgKGNvbnN0IFtkZXBlbmRlbmN5LCBrZWVwQXNSdW50aW1lXSBvZiBbXG4gICAgW3diRGVwZW5kZW5jeSwgc2hvdWxkS2VlcFdiQXNSdW50aW1lRGVwZW5kZW5jeShqc29uT2JqKV0sXG4gICAgW2J1aWxkVHNEZXBlbmRlbmN5LCBzaG91bGRLZWVwQnVpbGRUc0FzUnVudGltZURlcGVuZGVuY3koanNvbk9iaildLFxuICBdIGFzIGNvbnN0KSB7XG4gICAgaWYgKGtlZXBBc1J1bnRpbWUpIHtcbiAgICAgIGNvbnN0IGRldlZlcnNpb24gPSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XTtcbiAgICAgIGlmICghZGV2VmVyc2lvbikgY29udGludWU7XG4gICAgICBjb25zdCBydW50aW1lVmVyc2lvbiA9IGpzb25PYmouZGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldO1xuICAgICAgaWYgKCFydW50aW1lVmVyc2lvbiB8fCBpc05ld2VyUGFja2FnZVZlcnNpb24oZGV2VmVyc2lvbiwgcnVudGltZVZlcnNpb24pKSB7XG4gICAgICAgIGpzb25PYmouZGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldID0gZGV2VmVyc2lvbjtcbiAgICAgIH1cbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XTtcbiAgICB9IGVsc2UgaWYgKGpzb25PYmouZGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldKSB7XG4gICAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSA/Pz0ganNvbk9iai5kZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV07XG4gICAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV07XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNob3VsZEtlZXBXYkFzUnVudGltZURlcGVuZGVuY3koanNvbk9iajogUGFja2FnZUpzb24pOiBib29sZWFuIHtcbiAgLy8gUHJvZHVjdGlvbiBpbWFnZXMgcnVuIG1pZ3JhdGlvbnMgYWZ0ZXIgZGV2RGVwZW5kZW5jaWVzIGFyZSBwcnVuZWQsIGp1c3QgYXMgcGFja2FnZSBtYW5hZ2Vyc1xuICAvLyBydW4gcG9zdGluc3RhbGwgZHVyaW5nIHByb2R1Y3Rpb24gaW5zdGFsbHMsIHNvIGJvdGggZW50cnkgcG9pbnRzIG11c3QgcmV0YWluIHRoZSB3YiBiaW5hcnkuXG4gIC8vIEtlZXAgdGhlIHdvcmQgbWF0Y2ggY29uc2VydmF0aXZlOiBzdXBwb3J0ZWQgY3VzdG9tIHdyYXBwZXJzIGNhbiBwdXQgd2IgaW5zaWRlIHNoZWxsIGxvb3BzIHRoYXRcbiAgLy8gdGhlIGNvbW1hbmQtcG9zaXRpb24gcGFyc2VyIGNhbm5vdCBjbGFzc2lmeSwgd2hpbGUgYSBmYWxzZSBwb3NpdGl2ZSBvbmx5IHJldGFpbnMgdGhlIENMSS5cbiAgcmV0dXJuIFtqc29uT2JqLnNjcmlwdHM/LnBvc3RpbnN0YWxsLCBqc29uT2JqLnNjcmlwdHM/LlsnZGItbWlncmF0ZSddXS5zb21lKFxuICAgIChzY3JpcHQpID0+IHR5cGVvZiBzY3JpcHQgPT09ICdzdHJpbmcnICYmIC9cXGJ3YlxcYi91LnRlc3Qoc2NyaXB0KVxuICApO1xufVxuXG5mdW5jdGlvbiBzaG91bGRLZWVwQnVpbGRUc0FzUnVudGltZURlcGVuZGVuY3koanNvbk9iajogUGFja2FnZUpzb24pOiBib29sZWFuIHtcbiAgY29uc3QgcHJpc21hID0ganNvbk9iai5wcmlzbWEgYXMgeyBzZWVkPzogdW5rbm93biB9IHwgdW5kZWZpbmVkO1xuICByZXR1cm4gZG9lc1NlZWRDb21tYW5kVXNlQnVpbGRUcyhwcmlzbWE/LnNlZWQpIHx8IGRvZXNTZWVkQ29tbWFuZFVzZUJ1aWxkVHMoanNvbk9iai5zY3JpcHRzPy5zZWVkKTtcbn1cblxuZnVuY3Rpb24gZG9lc1NlZWRDb21tYW5kVXNlQnVpbGRUcyhzZWVkQ29tbWFuZDogdW5rbm93bik6IGJvb2xlYW4ge1xuICAvLyBQcm9kdWN0aW9uIERvY2tlciBpbWFnZXMgcnVuIHNlZWQgc2NyaXB0cyBhZnRlciBkZXZEZXBlbmRlbmNpZXMgYXJlIHBydW5lZCxcbiAgLy8gc28gVHlwZVNjcmlwdCBzZWVkIHJ1bm5lcnMgbXVzdCByZW1haW4gYXZhaWxhYmxlIGF0IHJ1bnRpbWUuXG4gIHJldHVybiB0eXBlb2Ygc2VlZENvbW1hbmQgPT09ICdzdHJpbmcnICYmIC8oPzwhW1xcdy1dKWJ1aWxkLXRzKD8hW1xcdy1dKS91LnRlc3Qoc2VlZENvbW1hbmQpO1xufVxuXG5jb25zdCBkZXBlbmRlbmN5RGVjbGFyYXRpb25TZWN0aW9ucyA9IFtcbiAgJ2RlcGVuZGVuY2llcycsXG4gICdkZXZEZXBlbmRlbmNpZXMnLFxuICAnb3B0aW9uYWxEZXBlbmRlbmNpZXMnLFxuICAncGVlckRlcGVuZGVuY2llcycsXG5dIGFzIGNvbnN0O1xuXG4vKipcbiAqIEZvcmNlcyBzdG9yZS1pbmNvbXBhdGlibGUgcGFja2FnZXMgdG8gc3RheSBwcm9qZWN0LWxvY2FsIHdoZW4gdGhlIGdlbmVyYXRlZCBidW5maWcudG9tbCBlbmFibGVzXG4gKiBCdW4ncyBnbG9iYWwgc3RvcmU6IGBjaGFrcmEgdHlwZWdlbmAgKHJ1biBieSBgd2IgZ2VuLWNvZGVgKVxuICogd3JpdGVzIGdlbmVyYXRlZCB0eXBlcyBpbnRvIHRoZSBpbnN0YWxsZWQgQGNoYWtyYS11aS9yZWFjdCBwYWNrYWdlLCB3aGljaCB3b3VsZCBvdGhlcndpc2VcbiAqIG11dGF0ZSB0aGUgbWFjaGluZS13aWRlIHN0b3JlIHNoYXJlZCBhY3Jvc3MgcmVwb3NpdG9yaWVzLCBhbmQgZHJpenpsZS1raXQgcmVxdWlyZXMgZHJpenpsZS1vcm1cbiAqIHdpdGhvdXQgZGVjbGFyaW5nIGl0LCB3aGljaCB0aGUgc3RvcmUgcmVhbHBhdGggcGxhY2VzIGJleW9uZCBhIHBsYWluIG5vZGVfbW9kdWxlcyB3YWxrLXVwLlxuICogTGlzdGluZyB0aGVtIGluIGB0cnVzdGVkRGVwZW5kZW5jaWVzYCBtYWtlcyBCdW4gbWF0ZXJpYWxpemUgYSBwZXItcHJvamVjdCBjb3B5IHVuZGVyXG4gKiBgbm9kZV9tb2R1bGVzLy5idW4vYCwgd2hvc2Ugc2libGluZyBgbm9kZV9tb2R1bGVzLy5idW4vbm9kZV9tb2R1bGVzL2AgbGlua3MgZXZlcnkgaW5zdGFsbGVkXG4gKiBwYWNrYWdlIGFuZCB0aGVyZWZvcmUgcmVzb2x2ZXMgdGhlIHVuZGVjbGFyZWQgcmVxdWlyZXMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGVuc3VyZVRydXN0ZWREZXBlbmRlbmNpZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uKTogUHJvbWlzZTx2b2lkPiB7XG4gIC8vIEJ1biBjb25zdWx0cyB0cnVzdGVkRGVwZW5kZW5jaWVzIGluIHRoZSB3b3Jrc3BhY2Ugcm9vdCdzIHBhY2thZ2UuanNvbiBvbmx5LCBzbyB0aGUgbGlzdCBpc1xuICAvLyBtYW5hZ2VkIHRoZXJlIGFuZCBtdXN0IGNvdmVyIGRlcGVuZGVuY2llcyBkZWNsYXJlZCBhbnl3aGVyZSBpbiB0aGUgcmVwb3NpdG9yeS5cbiAgaWYgKCFjb25maWcuaXNSb290KSByZXR1cm47XG4gIGNvbnN0IGJ1bkpzb25PYmogPSBqc29uT2JqIGFzIFdyaXRhYmxlUGFja2FnZUpzb24gJiB7IHRydXN0ZWREZXBlbmRlbmNpZXM/OiBzdHJpbmdbXSB9O1xuICAvLyBCdW4gaW5zdGFsbHMgb3B0aW9uYWwgYW5kIHBlZXIgZGVwZW5kZW5jaWVzIGJ5IGRlZmF1bHQsIHNvIGFsbCBkZWNsYXJhdGlvbiBzZWN0aW9ucyBjb3VudC5cbiAgLy8gRXZlcnkgZGVjbGFyZWQgcmFuZ2UgaXMga2VwdCBwZXIgcGFja2FnZTogYSByb290IGRlY2xhcmF0aW9uIG11c3Qgbm90IG1hc2sgYSB3b3Jrc3BhY2Ugb25lXG4gIC8vIChlLmcuIHJvb3QgQGNoYWtyYS11aS9jbGkgdjIgYWxvbmdzaWRlIGEgd29ya3NwYWNlIG9uIHYzKS5cbiAgY29uc3QgZGVjbGFyZWREZXBlbmRlbmNpZXMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nW10+KCk7XG4gIGNvbnN0IGFkZERlY2xhcmVkRGVwZW5kZW5jaWVzID0gKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IHZvaWQgPT4ge1xuICAgIGZvciAoY29uc3Qgc2VjdGlvbiBvZiBkZXBlbmRlbmN5RGVjbGFyYXRpb25TZWN0aW9ucykge1xuICAgICAgZm9yIChjb25zdCBbZGVwZW5kZW5jeU5hbWUsIHZlcnNpb25SYW5nZV0gb2YgT2JqZWN0LmVudHJpZXMocGFja2FnZUpzb25bc2VjdGlvbl0gPz8ge30pKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmVyc2lvblJhbmdlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGNvbnN0IHZlcnNpb25SYW5nZXMgPSBkZWNsYXJlZERlcGVuZGVuY2llcy5nZXQoZGVwZW5kZW5jeU5hbWUpO1xuICAgICAgICAgIGlmICh2ZXJzaW9uUmFuZ2VzKSB7XG4gICAgICAgICAgICB2ZXJzaW9uUmFuZ2VzLnB1c2godmVyc2lvblJhbmdlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGVjbGFyZWREZXBlbmRlbmNpZXMuc2V0KGRlcGVuZGVuY3lOYW1lLCBbdmVyc2lvblJhbmdlXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBhZGREZWNsYXJlZERlcGVuZGVuY2llcyhqc29uT2JqKTtcbiAgZm9yIChjb25zdCBwYWNrYWdlSnNvblBhdGggb2YgZ2V0V29ya3NwYWNlUGFja2FnZUpzb25QYXRocyhjb25maWcpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGFkZERlY2xhcmVkRGVwZW5kZW5jaWVzKFxuICAgICAgICBKU09OLnBhcnNlKGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgcGFja2FnZUpzb25QYXRoKSwgJ3V0ZjgnKSkgYXMgUGFja2FnZUpzb25cbiAgICAgICk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBpZ25vcmUgdW5yZWFkYWJsZSB3b3Jrc3BhY2UgcGFja2FnZS5qc29uXG4gICAgfVxuICB9XG4gIC8vIE9ubHkgQGNoYWtyYS11aS9jbGkgdjMncyBgY2hha3JhIHR5cGVnZW5gIHdyaXRlcyBpbnRvIHRoZSBpbnN0YWxsZWQgQGNoYWtyYS11aS9yZWFjdDtcbiAgLy8gdjIncyBgY2hha3JhLWNsaSB0b2tlbnNgIHdyaXRlcyBpbnRvIEBjaGFrcmEtdWkvc3R5bGVkLXN5c3RlbSBpbnN0ZWFkLCBzbyB0cnVzdGluZ1xuICAvLyBAY2hha3JhLXVpL3JlYWN0IHRoZXJlIHdvdWxkIGZvcmNlIGEgdXNlbGVzcyBwcm9qZWN0LWxvY2FsIGNvcHkgd2l0aG91dCBmaXhpbmcgZ2VuLWNvZGUuXG4gIC8vIE1pcnJvciB3YiBnZW4tY29kZSdzIGNsYXNzaWZpY2F0aW9uOiBvbmx5IGEgcmFuZ2Ugd2hvc2UgbGVhZGluZyBtYWpvciBwYXJzZXMgdG8gMiBzZWxlY3RzIHRoZVxuICAvLyB2MiBjb21tYW5kLCBzbyBkaWdpdGxlc3Mgc3BlY3MgbGlrZSBgbGF0ZXN0YCBvciBjYXRhbG9nIHJlZmVyZW5jZXMgY291bnQgYXMgdjMuXG4gIGNvbnN0IGhhc0NoYWtyYUNsaVYzID0gKGRlY2xhcmVkRGVwZW5kZW5jaWVzLmdldCgnQGNoYWtyYS11aS9jbGknKSA/PyBbXSkuc29tZShcbiAgICAodmVyc2lvblJhbmdlKSA9PiAvXFxkKy91LmV4ZWModmVyc2lvblJhbmdlKT8uWzBdICE9PSAnMidcbiAgKTtcbiAgY29uc3QgcmVxdWlyZWRXYmZ5UGFja2FnZXMgPSBbXG4gICAgLi4uKGhhc0NoYWtyYUNsaVYzICYmIGRlY2xhcmVkRGVwZW5kZW5jaWVzLmhhcygnQGNoYWtyYS11aS9yZWFjdCcpID8gWydAY2hha3JhLXVpL3JlYWN0J10gOiBbXSksXG4gICAgLi4uKGRlY2xhcmVkRGVwZW5kZW5jaWVzLmhhcygnZHJpenpsZS1raXQnKSA/IFsnZHJpenpsZS1raXQnXSA6IFtdKSxcbiAgICAvLyBUaGVzZSBnaXQtZGVwZW5kZW5jeSBidWlsZHMgaW1wb3J0IHBhY2thZ2VzIHRoZXkgZG8gbm90IGRlY2xhcmUgKGUuZy4gem9kKSwgd2hpY2ggdGhlXG4gICAgLy8gZ2xvYmFsLXN0b3JlIGxheW91dCBwbGFjZXMgYmV5b25kIHRoZWlyIHdhbGstdXA7IGEgcHJvamVjdC1sb2NhbCBjb3B5IHVuZGVyXG4gICAgLy8gbm9kZV9tb2R1bGVzLy5idW4gcmVzb2x2ZXMgdGhlbSAob2JzZXJ2ZWQgaW4gV2lsbEJvb3N0ZXIvcHJvbXB0LXN0dWR5KS5cbiAgICAuLi4oZGVjbGFyZWREZXBlbmRlbmNpZXMuaGFzKCdAd2lsbGJvb3N0ZXIvanVkZ2UnKSA/IFsnQHdpbGxib29zdGVyL2p1ZGdlJ10gOiBbXSksXG4gICAgLi4uKGRlY2xhcmVkRGVwZW5kZW5jaWVzLmhhcygnQHdpbGxib29zdGVyL2xsbS1wcm94eScpID8gWydAd2lsbGJvb3N0ZXIvbGxtLXByb3h5J10gOiBbXSksXG4gICAgLy8gYmxpdHogYW5kIEBibGl0empzL2F1dGggcmVxdWlyZSByZWFjdCAoYW5kIG90aGVyIHBlZXJzKSB3aXRob3V0IGRlY2xhcmluZyB0aGVtLCByZWx5aW5nIG9uXG4gICAgLy8gaG9pc3RpbmcsIHdoaWNoIHRoZSBnbG9iYWwtc3RvcmUgbGF5b3V0IHBsYWNlcyBiZXlvbmQgdGhlaXIgd2Fsay11cCAob2JzZXJ2ZWQgaW5cbiAgICAvLyBXaWxsQm9vc3Rlci9zdXJ2ZXktc3lzdGVtOiBgbmV4dCBidWlsZGAgcGFnZS1kYXRhIGNvbGxlY3Rpb24gZGllcyB3aXRoIFwiQ2Fubm90IGZpbmQgbW9kdWxlXG4gICAgLy8gJ3JlYWN0J1wiIGZyb20gQGJsaXR6anMvYXV0aCkuIEBibGl0empzL3JwYyBpcyBOT1QgbGlzdGVkIGJlY2F1c2UgaXQgcHJvcGVybHkgZGVjbGFyZXMgaXRzXG4gICAgLy8gcmVhY3QvQHRhbnN0YWNrIHBlZXJzLCBzbyBCdW4gbGlua3MgdGhlbSBpbnRvIGl0cyBzdG9yZSBlbnRyeS4gQGJsaXR6anMvbmV4dCBpc1xuICAgIC8vIGRlbGliZXJhdGVseSBOT1QgbGlzdGVkIGVpdGhlcjogdHJ1c3RpbmcgaXQgd291bGQgcnVuIGl0cyBwb3N0aW5zdGFsbCAoYGJsaXR6IGNvZGVnZW5gKSxcbiAgICAvLyB3aGljaCBwYXRjaGVzIHRoZSBpbnN0YWxsZWQgbmV4dCBwYWNrYWdlIGluIHBsYWNlIOKAlCByZXBvc2l0b3JpZXMgcGF0Y2ggb3V0IHRoYXQgcG9zdGluc3RhbGxcbiAgICAvLyB3aXRoIGBidW4gcGF0Y2hgIGluc3RlYWQsIHdoaWNoIGFsc28ga2VlcHMgdGhlIHBhY2thZ2UgcHJvamVjdC1sb2NhbC5cbiAgICAuLi4oZGVjbGFyZWREZXBlbmRlbmNpZXMuaGFzKCdibGl0eicpID8gWydibGl0eiddIDogW10pLFxuICAgIC4uLihkZWNsYXJlZERlcGVuZGVuY2llcy5oYXMoJ0BibGl0empzL2F1dGgnKSA/IFsnQGJsaXR6anMvYXV0aCddIDogW10pLFxuICAgIC8vIEJ1biBkb2VzIG5vdCBsaW5rIEBob29rZm9ybS9yZXNvbHZlcnMnIE9QVElPTkFMIHZhbGlkYXRvciBwZWVycyAoZS5nLiB6b2QpIGludG8gaXRzXG4gICAgLy8gZ2xvYmFsLXN0b3JlIGVudHJ5IGV2ZW4gd2hlbiB0aGUgcHJvamVjdCBpbnN0YWxscyB0aGVtLCBzbyBpdHMgc2VydmVyLXNpZGVcbiAgICAvLyBgaW1wb3J0ICd6b2QnYCBmYWlscyBmcm9tIHRoZSBzdG9yZSAob2JzZXJ2ZWQgaW4gV2lsbEJvb3N0ZXIvc3VydmV5LXN5c3RlbSkuXG4gICAgLi4uKGRlY2xhcmVkRGVwZW5kZW5jaWVzLmhhcygnQGhvb2tmb3JtL3Jlc29sdmVycycpID8gWydAaG9va2Zvcm0vcmVzb2x2ZXJzJ10gOiBbXSksXG4gICAgLy8gQHpvb20vcnRtcyBpbnN0YWxscyBpdHMgbmF0aXZlIHJ0bXMubm9kZSBiaW5kaW5nIGluIGEgbGlmZWN5Y2xlIHNjcmlwdC4gV2l0aG91dCBleHBsaWNpdFxuICAgIC8vIHRydXN0LCBCdW4gc2tpcHMgdGhhdCBzY3JpcHQgYW5kIHRoZSBwYWNrYWdlIGZhaWxzIGFzIHNvb24gYXMgdGhlIFpvb20gYm90IGltcG9ydHMgaXRcbiAgICAvLyAob2JzZXJ2ZWQgaW4gV2lsbEJvb3N0ZXIvc21hcnRzZS16b29tLWJvdCkuXG4gICAgLi4uKGRlY2xhcmVkRGVwZW5kZW5jaWVzLmhhcygnQHpvb20vcnRtcycpID8gWydAem9vbS9ydG1zJ10gOiBbXSksXG4gIF07XG5cbiAgLy8gd2JmeSBmdWxseSBvd25zIHRoaXMgZmllbGQ6IGEgcGFja2FnZSB3aG9zZSBsaWZlY3ljbGUgc2NyaXB0cyBtdXN0IHJ1biBnZXRzIGFkZGVkIHRvIHdiZnlcbiAgLy8gaXRzZWxmIGluc3RlYWQgb2YgdG8gaW5kaXZpZHVhbCByZXBvc2l0b3JpZXMsIHNvIHVubWFuYWdlZCBlbnRyaWVzIGFyZSBhbHdheXMgcmVtb3ZlZCDigJRcbiAgLy8gaW5jbHVkaW5nIGFuIGV4cGxpY2l0bHkgZW1wdHkgZGVueS1hbGwgbGlzdCwgd2hvc2UgZGVsZXRpb24gZGVsaWJlcmF0ZWx5IHJlc3RvcmVzIEJ1bidzXG4gIC8vIGRlZmF1bHQgYWxsb3ctbGlzdCAodGhlIG93bmVyc2hpcCBwb2xpY3kgY2hvc2VuIGluICM5NzUpLlxuICBjb25zdCBleGlzdGluZ1RydXN0ZWQgPSBidW5Kc29uT2JqLnRydXN0ZWREZXBlbmRlbmNpZXM7XG4gIGlmIChyZXF1aXJlZFdiZnlQYWNrYWdlcy5sZW5ndGggPT09IDApIHtcbiAgICBpZiAoZXhpc3RpbmdUcnVzdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIERlbGV0aW5nIHRoZSBmaWVsZCByZXN0b3JlcyBCdW4ncyBmdWxsIGRlZmF1bHQgYWxsb3ctbGlzdCwgc28gb25seSBlbnRyaWVzIG91dHNpZGUgdGhhdFxuICAgICAgLy8gbGlzdCBhY3R1YWxseSBsb3NlIHRoZWlyIGxpZmVjeWNsZSBzY3JpcHRzLlxuICAgICAgd2FybkFib3V0UmVtb3ZlZFRydXN0ZWREZXBlbmRlbmNpZXMoY29uZmlnLCBleGlzdGluZ1RydXN0ZWQsIG5ldyBTZXQoKSk7XG4gICAgICBkZWxldGUgYnVuSnNvbk9iai50cnVzdGVkRGVwZW5kZW5jaWVzO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBBbiBleHBsaWNpdCB0cnVzdGVkRGVwZW5kZW5jaWVzIGxpc3QgUkVQTEFDRVMgQnVuJ3MgZGVmYXVsdCBhbGxvdy1saXN0IGluc3RlYWQgb2YgZXh0ZW5kaW5nXG4gIC8vIGl0LCBhbmQgQnVuIHByaW50cyBubyB3YXJuaW5nIGZvciB0aGUgcG9zdGluc3RhbGxzIGl0IGNvbnNlcXVlbnRseSBza2lwcyAoZS5nLiBAcmFpbHdheS9jbGlcbiAgLy8gZG93bmxvYWRzIGl0cyBiaW5hcnkgaW4gcG9zdGluc3RhbGwgYW5kIGV4aXRzIDEgd2l0aG91dCBvbmUpLiBJbmNsdWRlIHRoZSBFTlRJUkUgZGVmYXVsdCBsaXN0OlxuICAvLyBlbnRyaWVzIGZvciBwYWNrYWdlcyB0aGF0IGFyZSBub3QgaW5zdGFsbGVkIGFyZSBpbmVydCwgYW5kIHRoaXMgaXMgdGhlIG9ubHkgcmVwcmVzZW50YXRpb25cbiAgLy8gdGhhdCBzdGF5cyBjb3JyZWN0IGZvciB0cmFuc2l0aXZlIGRlcGVuZGVuY2llcyB0aGUgZmluYWwgYGJ1biBpbnN0YWxsYCByZXNvbHZlcyBhZnRlciB0aGlzXG4gIC8vIHJ1bnMg4oCUIGFuIGludGVyc2VjdGlvbiB3aXRoIGEgbWlzc2luZyBvciBzdGFsZSBsb2NrZmlsZSB3b3VsZCBzaWxlbnRseSBkcm9wIHRoZW0uXG4gIGNvbnN0IGRlZmF1bHRUcnVzdGVkRGVwZW5kZW5jaWVzID0gZ2V0RGVmYXVsdFRydXN0ZWREZXBlbmRlbmNpZXMoY29uZmlnKTtcbiAgLy8gbGVmdGhvb2sgaXMgYXBwZW5kZWQgZXhwbGljaXRseSBzbyB0aGUgZGVmYXVsdC1saXN0IGxvb2t1cCBmYWlsaW5nIGNhbm5vdCBkcm9wIGl0OiBpdCBpc1xuICAvLyByZXF1aXJlZCBpbiBldmVyeSBtYW5hZ2VkIHJlcG9zaXRvcnkuXG4gIGNvbnN0IG5ld1RydXN0ZWRQYWNrYWdlcyA9IG5ldyBTZXQoW1xuICAgIC4uLnJlcXVpcmVkV2JmeVBhY2thZ2VzLFxuICAgIGxlZnRob29rRGVwZW5kZW5jeSxcbiAgICAuLi4oZGVmYXVsdFRydXN0ZWREZXBlbmRlbmNpZXMgPz8gW10pLFxuICBdKTtcbiAgd2FybkFib3V0UmVtb3ZlZFRydXN0ZWREZXBlbmRlbmNpZXMoY29uZmlnLCBleGlzdGluZ1RydXN0ZWQgPz8gW10sIG5ld1RydXN0ZWRQYWNrYWdlcyk7XG4gIGJ1bkpzb25PYmoudHJ1c3RlZERlcGVuZGVuY2llcyA9IFsuLi5uZXdUcnVzdGVkUGFja2FnZXNdLnRvU29ydGVkKCk7XG59XG5cbi8vIFRoZSBwYWNrYWdlcyB3YmZ5IGl0c2VsZiBtYXkgd3JpdGUgaW50byB0cnVzdGVkRGVwZW5kZW5jaWVzOyB0aGVpciByZW1vdmFsIGlzIG1hbmFnZWQgY2xlYW51cCxcbi8vIG5ldmVyIGEgbG9zcyBvZiB1c2VyIHBvbGljeS5cbmNvbnN0IHdiZnlNYW5hZ2VkVHJ1c3RlZERlcGVuZGVuY2llcyA9IG5ldyBTZXQoW1xuICAnQGJsaXR6anMvYXV0aCcsXG4gICdAY2hha3JhLXVpL3JlYWN0JyxcbiAgJ0Bob29rZm9ybS9yZXNvbHZlcnMnLFxuICAnQHdpbGxib29zdGVyL2p1ZGdlJyxcbiAgJ0B3aWxsYm9vc3Rlci9sbG0tcHJveHknLFxuICAnQHpvb20vcnRtcycsXG4gICdibGl0eicsXG4gICdkcml6emxlLWtpdCcsXG4gIGxlZnRob29rRGVwZW5kZW5jeSxcbl0pO1xuXG5mdW5jdGlvbiB3YXJuQWJvdXRSZW1vdmVkVHJ1c3RlZERlcGVuZGVuY2llcyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBleGlzdGluZ1RydXN0ZWQ6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBrZXB0UGFja2FnZXM6IFJlYWRvbmx5U2V0PHN0cmluZz5cbik6IHZvaWQge1xuICAvLyBBIGRlZmF1bHQtdHJ1c3RlZCBlbnRyeSBuZXZlciBsb3NlcyBhbnl0aGluZyBieSByZW1vdmFsOiB3aGlsZSB0aGUgcGFja2FnZSBpcyBpbnN0YWxsZWQgdGhlXG4gIC8vIGtlcHQgbGlzdCAob3IsIHdoZW4gdGhlIGZpZWxkIGlzIGRlbGV0ZWQsIEJ1bidzIG93biBkZWZhdWx0IGxpc3QpIHN0aWxsIHRydXN0cyBpdC5cbiAgY29uc3QgZGVmYXVsdFRydXN0ZWREZXBlbmRlbmNpZXMgPSBnZXREZWZhdWx0VHJ1c3RlZERlcGVuZGVuY2llcyhjb25maWcpO1xuICBjb25zdCByZW1vdmVkUGFja2FnZXMgPSBleGlzdGluZ1RydXN0ZWQuZmlsdGVyKFxuICAgIChwa2cpID0+ICFrZXB0UGFja2FnZXMuaGFzKHBrZykgJiYgIXdiZnlNYW5hZ2VkVHJ1c3RlZERlcGVuZGVuY2llcy5oYXMocGtnKSAmJiAhZGVmYXVsdFRydXN0ZWREZXBlbmRlbmNpZXM/Lmhhcyhwa2cpXG4gICk7XG4gIGlmIChyZW1vdmVkUGFja2FnZXMubGVuZ3RoID4gMCkge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgIGBSZW1vdmluZyB1bm1hbmFnZWQgdHJ1c3RlZERlcGVuZGVuY2llcyBlbnRyaWVzOiAke3JlbW92ZWRQYWNrYWdlcy5qb2luKCcsICcpfS4gd2JmeSBvd25zIHRoaXMgZmllbGQ7IGlmIHRoZWlyIGxpZmVjeWNsZSBzY3JpcHRzIGFyZSByZXF1aXJlZCwgYWRkIHRoZSBwYWNrYWdlcyB0byB3YmZ5IGl0c2VsZi5gXG4gICAgKTtcbiAgfVxufVxuXG5sZXQgY2FjaGVkRGVmYXVsdFRydXN0ZWREZXBlbmRlbmNpZXM6IFNldDxzdHJpbmc+IHwgdW5kZWZpbmVkO1xuXG4vKiogRmV0Y2hlcyBCdW4ncyBkZWZhdWx0IHRydXN0ZWQtZGVwZW5kZW5jeSBhbGxvdy1saXN0IGZyb20gdGhlIEJ1biB2ZXJzaW9uIGluc3RhbGxpbmcgdGhlIHJlcG9zaXRvcnkuICovXG5mdW5jdGlvbiBnZXREZWZhdWx0VHJ1c3RlZERlcGVuZGVuY2llcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBTZXQ8c3RyaW5nPiB8IHVuZGVmaW5lZCB7XG4gIGlmICghY2FjaGVkRGVmYXVsdFRydXN0ZWREZXBlbmRlbmNpZXMpIHtcbiAgICAvLyBCdW4gY29sb3JpemVzIHRoZSBsaXN0IG1hcmtlcnMgd2hlbiBGT1JDRV9DT0xPUiBpcyBzZXQgKGUuZy4gYnkgdGVzdCBydW5uZXJzIG9uIENJKSwgc29cbiAgICAvLyBBTlNJIGVzY2FwZSBzZXF1ZW5jZXMgbXVzdCBiZSBzdHJpcHBlZCBiZWZvcmUgcGFyc2luZy5cbiAgICBjb25zdCBzdGRvdXQgPSBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoJ2J1bicsIFsncG0nLCAnZGVmYXVsdC10cnVzdGVkJ10sIGNvbmZpZy5kaXJQYXRoKS5yZXBsYWNlQWxsKFxuICAgICAgLy8gb3hsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnRyb2wtcmVnZXggLS0gbWF0Y2hpbmcgQU5TSSBlc2NhcGUgc2VxdWVuY2VzIHJlcXVpcmVzIHRoZSBFU0MgY29udHJvbCBjaGFyYWN0ZXJcbiAgICAgIC9cXHUwMDFCXFxbWzAtOTtdKm0vZ3UsXG4gICAgICAnJ1xuICAgICk7XG4gICAgY29uc3QgcGFyc2VkRGVwZW5kZW5jaWVzID0gbmV3IFNldChbLi4uc3Rkb3V0Lm1hdGNoQWxsKC9eXFxzKi1cXHMrKFxcUyspJC9nbXUpXS5tYXAoKG1hdGNoKSA9PiBtYXRjaFsxXSBhcyBzdHJpbmcpKTtcbiAgICBpZiAocGFyc2VkRGVwZW5kZW5jaWVzLnNpemUgPT09IDApIHtcbiAgICAgIC8vIERvIG5vdCBjYWNoZSB0aGUgZmFpbHVyZTogYSB0YXJnZXQtbG9jYWwgcHJvYmxlbSAoZS5nLiBhbiB1bnJlYWRhYmxlIHBhY2thZ2UuanNvbikgbXVzdFxuICAgICAgLy8gbm90IGRlbnkgdGhlIGRlZmF1bHQgbGlzdCB0byBldmVyeSBsYXRlciB0YXJnZXQgb2YgYSBtdWx0aS1wYXRoIHJ1bi5cbiAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIHJlYWQgdGhlIGRlZmF1bHQgYWxsb3ctbGlzdCB2aWEgYGJ1biBwbSBkZWZhdWx0LXRydXN0ZWRgLicpO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY2FjaGVkRGVmYXVsdFRydXN0ZWREZXBlbmRlbmNpZXMgPSBwYXJzZWREZXBlbmRlbmNpZXM7XG4gIH1cbiAgcmV0dXJuIGNhY2hlZERlZmF1bHRUcnVzdGVkRGVwZW5kZW5jaWVzO1xufVxuXG5hc3luYyBmdW5jdGlvbiBub3JtYWxpemVQYWNrYWdlTWV0YWRhdGEoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbixcbiAgZGVwZW5kZW5jeVVwZGF0ZXM6IERlcGVuZGVuY3lVcGRhdGVzXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFqc29uT2JqLm5hbWUpIHtcbiAgICBqc29uT2JqLm5hbWUgPSBwYXRoLmJhc2VuYW1lKGNvbmZpZy5kaXJQYXRoKTtcbiAgfVxuXG4gIC8vIEV4cGxpY2l0IHJvb3QgcHVibGlzaGluZyBpbnRlbnQgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIHdiZnkncyBwcml2YXRlIG1vbm9yZXBvLXJvb3QgZGVmYXVsdC5cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucyAmJiAoY29uZmlnLnJlbGVhc2UubnBtUHVibGlzaGVzUm9vdCB8fCBqc29uT2JqLnB1Ymxpc2hDb25maWcpKSB7XG4gICAgZGVsZXRlIGpzb25PYmoucHJpdmF0ZTtcbiAgfSBlbHNlIGlmIChjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMgJiYgIWNvbmZpZy5yZWxlYXNlLm5wbSAmJiAhanNvbk9iai5wdWJsaXNoQ29uZmlnKSB7XG4gICAganNvbk9iai5wcml2YXRlID0gdHJ1ZTtcbiAgfVxuICBpZiAoIWpzb25PYmoubGljZW5zZSkge1xuICAgIGpzb25PYmoubGljZW5zZSA9ICdVTkxJQ0VOU0VEJztcbiAgfVxuICBpZiAoIWpzb25PYmoucHJpdmF0ZSAmJiBqc29uT2JqLmxpY2Vuc2UgIT09ICdVTkxJQ0VOU0VEJyAmJiByb290Q29uZmlnLmlzUHVibGljUmVwbykge1xuICAgIGpzb25PYmoucHVibGlzaENvbmZpZyA/Pz0ge307XG4gICAganNvbk9iai5wdWJsaXNoQ29uZmlnLmFjY2VzcyA/Pz0gJ3B1YmxpYyc7XG4gICAgLy8gV2l0aG91dCBhbiBleHBsaWNpdCByZWdpc3RyeSwgbnBtIHJlc29sdmVzIHRoZSBwdWJsaXNoIHRhcmdldCBmcm9tIHRoZSB3b3Jrc3BhY2UgLm5wbXJjLFxuICAgIC8vIHdob3NlIGRlZmF1bHQgcmVnaXN0cnkgb24gQ0kgbWF5IGJlIHRoZSBUYWt1bWkgR3VhcmQgaW5zdGFsbCBwcm94eSDigJQgd2hpY2ggcmVqZWN0c1xuICAgIC8vIGBucG0gcHVibGlzaGAgd2l0aCA0MDUgKHNoYXJlZCMxMDcyKS4gYD8/PWAga2VlcHMgYSBkZWxpYmVyYXRlbHkgZGlmZmVyZW50IHJlZ2lzdHJ5LlxuICAgIGpzb25PYmoucHVibGlzaENvbmZpZy5yZWdpc3RyeSA/Pz0gJ2h0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnLyc7XG4gIH1cbiAgY29uc3Qgb3duZXIgPSBjb25maWcucmVwb0F1dGhvcjtcbiAgaWYgKG93bmVyID09PSAnV2lsbEJvb3N0ZXInIHx8IG93bmVyID09PSAnV2lsbEJvb3N0ZXJMYWInKSB7XG4gICAganNvbk9iai5hdXRob3IgPSAnV2lsbEJvb3N0ZXIgSW5jLic7XG4gIH1cbiAgYXdhaXQgbm9ybWFsaXplUHVibGlzaGVkQ29uZmlnUGFja2FnZU1ldGFkYXRhKGNvbmZpZywganNvbk9iaik7XG4gIGlmICghY29uZmlnLmlzUm9vdCAmJiBqc29uT2JqLnByaXZhdGUgJiYgIWpzb25PYmoubWFpbikge1xuICAgIC8vIE1ha2UgVlNDb2RlIHBvc3NpYmxlIHRvIHJlZmFjdG9yIGNvZGUgYWNyb3NzIHN1YnBhY2thZ2VzLlxuICAgIGpzb25PYmoubWFpbiA9ICcuL3NyYyc7XG4gIH1cblxuICBpZiAoIWNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucykge1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgICAganNvbk9iai5zY3JpcHRzLmxpbnQgPSAnZmx1dHRlciBhbmFseXplJztcbiAgICAgIGpzb25PYmouc2NyaXB0c1snbGludC1maXgnXSA9ICdidW4gcnVuIGxpbnQnO1xuICAgICAgY29uc3QgZGlycyA9IFsnbGliJywgJ3Rlc3QnLCAndGVzdF9kcml2ZXInXS5maWx0ZXIoKGRpcikgPT4gZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGRpcikpKTtcbiAgICAgIGlmIChkaXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAganNvbk9iai5zY3JpcHRzWydmb3JtYXQtY29kZSddID0gYGRhcnQgZm9ybWF0ICQoZmluZCAke2RpcnMuam9pbihcbiAgICAgICAgICAnICdcbiAgICAgICAgKX0gLW5hbWUgZ2VuZXJhdGVkIC1wcnVuZSAtbyAtbmFtZSAnKi5mcmVlemVkLmRhcnQnIC1wcnVuZSAtbyAtbmFtZSAnKi5nLmRhcnQnIC1wcnVuZSAtbyAtbmFtZSAnKi5kYXJ0JyAtcHJpbnQpYDtcbiAgICAgICAganNvbk9iai5zY3JpcHRzLmZvcm1hdCA9IGFwcGVuZEZvcm1hdENvZGVDb21tYW5kKGpzb25PYmouc2NyaXB0cy5mb3JtYXQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHB5dGhvblBhY2thZ2VNYW5hZ2VyID0gZ2V0UHl0aG9uUGFja2FnZU1hbmFnZXIoY29uZmlnKTtcbiAgICBpZiAocHl0aG9uUGFja2FnZU1hbmFnZXIpIHtcbiAgICAgIGNvbnN0IHNjcmlwdFJ1bm5lciA9ICdidW4gcnVuJztcbiAgICAgIGpzb25PYmouc2NyaXB0c1snY29tbW9uL2NpLXNldHVwJ10gPSBgJHtzY3JpcHRSdW5uZXJ9IHNldHVwLSR7cHl0aG9uUGFja2FnZU1hbmFnZXJ9YDtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbYHNldHVwLSR7cHl0aG9uUGFja2FnZU1hbmFnZXIgPT09ICdwb2V0cnknID8gJ3V2JyA6ICdwb2V0cnknfWBdO1xuICAgICAganNvbk9iai5zY3JpcHRzW2BzZXR1cC0ke3B5dGhvblBhY2thZ2VNYW5hZ2VyfWBdID0gZ2V0UHl0aG9uU2V0dXBDb21tYW5kKHB5dGhvblBhY2thZ2VNYW5hZ2VyKTtcbiAgICAgIGNvbnN0IHB5dGhvbkZpbGVzID0gYXdhaXQgZmcuZ2xvYignKiovKi5weScsIHtcbiAgICAgICAgY3dkOiBjb25maWcuZGlyUGF0aCxcbiAgICAgICAgZG90OiB0cnVlLFxuICAgICAgICBpZ25vcmU6IGdsb2JJZ25vcmUsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGRpck5hbWVTZXQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgIGZvciAoY29uc3QgcHl0aG9uRmlsZSBvZiBweXRob25GaWxlcykge1xuICAgICAgICBjb25zdCBbZmlyc3QsIHNlY29uZF0gPSBweXRob25GaWxlLnNwbGl0KCcvJyk7XG4gICAgICAgIGlmIChmaXJzdCAmJiBzZWNvbmQpIHtcbiAgICAgICAgICBkaXJOYW1lU2V0LmFkZChmaXJzdCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChkaXJOYW1lU2V0LnNpemUgPiAwKSB7XG4gICAgICAgIGNvbnN0IGRpck5hbWVzU3RyID0gWy4uLmRpck5hbWVTZXRdLmpvaW4oJyAnKTtcbiAgICAgICAgY29uc3QgcHl0aG9uUnVubmVyID0gYCR7cHl0aG9uUGFja2FnZU1hbmFnZXJ9IHJ1bmA7XG4gICAgICAgIGpzb25PYmouc2NyaXB0c1snZm9ybWF0LWNvZGUnXSA9XG4gICAgICAgICAgYCR7cHl0aG9uUnVubmVyfSBpc29ydCAtLXByb2ZpbGUgYmxhY2sgJHtkaXJOYW1lc1N0cn0gJiYgJHtweXRob25SdW5uZXJ9IGJsYWNrICR7ZGlyTmFtZXNTdHJ9YDtcbiAgICAgICAgaWYgKGpzb25PYmouc2NyaXB0cy5saW50KSB7XG4gICAgICAgICAganNvbk9iai5zY3JpcHRzLmxpbnQgPSBgJHtweXRob25SdW5uZXJ9IGZsYWtlOCAke2Rpck5hbWVzU3RyfSAmJiAke2pzb25PYmouc2NyaXB0cy5saW50fWA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAganNvbk9iai5zY3JpcHRzLmxpbnQgPSBgJHtweXRob25SdW5uZXJ9IGZsYWtlOCAke2Rpck5hbWVzU3RyfWA7XG4gICAgICAgICAganNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddID0gYCR7c2NyaXB0UnVubmVyfSBsaW50YDtcbiAgICAgICAgfVxuICAgICAgICBqc29uT2JqLnNjcmlwdHMuZm9ybWF0ID0gYXBwZW5kRm9ybWF0Q29kZUNvbW1hbmQoanNvbk9iai5zY3JpcHRzLmZvcm1hdCk7XG4gICAgICAgIGRlcGVuZGVuY3lVcGRhdGVzLnB5dGhvbkRldkRlcGVuZGVuY2llcy5wdXNoKCdibGFjaycsICdpc29ydCcsICdmbGFrZTgnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlnLnJlcG9zaXRvcnkgfHwganNvbk9iai5yZXBvc2l0b3J5KSB7XG4gICAganNvbk9iai5yZXBvc2l0b3J5ID0gZm9ybWF0UmVwb3NpdG9yeUZvclBhY2thZ2VKc29uKGNvbmZpZy5yZXBvc2l0b3J5ID8/IGpzb25PYmoucmVwb3NpdG9yeSwganNvbk9iai5yZXBvc2l0b3J5KTtcbiAgfVxuXG4gIGNvbnN0IGdlbkNvZGVTY3JpcHQgPSBqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ107XG4gIGlmIChzaG91bGRHZW5lcmF0ZVdiR2VuQ29kZVNjcmlwdChjb25maWcpKSB7XG4gICAgLy8gUHJlc2VydmUgcHJvamVjdC1zcGVjaWZpYyBzdGVwcyBhIHJlcG8gYXBwZW5kZWQgdG8gdGhlIG1hbmFnZWQgYGJ1biB3YiBnZW4tY29kZWAgKGUuZy4gYnVpbGRpbmcgZXh0cmEgZGVwbG95XG4gICAgLy8gYXNzZXRzKSBpbnN0ZWFkIG9mIGRpc2NhcmRpbmcgdGhlbTsgb25seSB0aGUgbWFuYWdlZCBnZW4tY29kZSBzZWdtZW50IGlzIHdiZnkncyB0b1xuICAgIC8vIHJlZ2VuZXJhdGUuIEFuIHVucGFyc2VhYmxlIHNjcmlwdCBpcyBsZWZ0IGFsb25lIHJhdGhlciB0aGFuIHJld3JpdHRlbiBmcm9tIGEgd3JvbmcgcGFyc2UuXG4gICAgY29uc3Qgc2VnbWVudHMgPSBnZW5Db2RlU2NyaXB0ID09PSB1bmRlZmluZWQgPyBbXSA6IHNwbGl0U2NyaXB0U2VnbWVudHMoZ2VuQ29kZVNjcmlwdCk7XG4gICAgY29uc3QgY3VzdG9tU2VnbWVudHMgPSBzZWdtZW50cz8uZmlsdGVyKFxuICAgICAgKHNlZ21lbnQpID0+IGNsYXNzaWZ5U2NyaXB0U2VnbWVudChzZWdtZW50LCBqc29uT2JqLnNjcmlwdHMsIHRydWUpID09PSAnY3VzdG9tJ1xuICAgICk7XG4gICAgaWYgKGN1c3RvbVNlZ21lbnRzKSB7XG4gICAgICBqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10gPSBbJ2J1biB3YiBnZW4tY29kZScsIC4uLmN1c3RvbVNlZ21lbnRzXS5qb2luKCcgJiYgJyk7XG4gICAgfVxuICB9XG4gIHVwZGF0ZVBvc3RpbnN0YWxsU2NyaXB0KGpzb25PYmouc2NyaXB0cywgZ2VuZXJhdGVzV29ya2VyVHlwZXMoY29uZmlnKSk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZEdlbmVyYXRlV2JHZW5Db2RlU2NyaXB0KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gY29uZmlnLmRlcGVuZGluZy5ibGl0eiB8fCBjb25maWcuZGVwZW5kaW5nLmNoYWtyYSB8fCBjb25maWcuZGVwZW5kaW5nLmdlbkkxOG5UcyB8fCBjb25maWcuZGVwZW5kaW5nLnByaXNtYTtcbn1cblxuZnVuY3Rpb24gYXBwZW5kRm9ybWF0Q29kZUNvbW1hbmQoZm9ybWF0U2NyaXB0OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICByZXR1cm4gZm9ybWF0U2NyaXB0ID8gYCR7Zm9ybWF0U2NyaXB0fSAmJiBidW4gcnVuIGZvcm1hdC1jb2RlYCA6ICdidW4gcnVuIGZvcm1hdC1jb2RlJztcbn1cblxuYXN5bmMgZnVuY3Rpb24gbm9ybWFsaXplUHVibGlzaGVkQ29uZmlnUGFja2FnZU1ldGFkYXRhKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb25cbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIWlzUHVibGlzaGVkV2lsbGJvb3N0ZXJDb25maWdzUGFja2FnZShjb25maWcpKSByZXR1cm47XG5cbiAgY29uc3QgY29uZmlnTWpzUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2NvbmZpZy5tanMnKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGNvbmZpZ01qc1BhdGgpKSByZXR1cm47XG5cbiAganNvbk9iai50eXBlID0gJ21vZHVsZSc7XG5cbiAgY29uc3QgY29uZmlnRHRzUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2NvbmZpZy5kLnRzJyk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhjb25maWdEdHNQYXRoKSkgcmV0dXJuO1xuXG4gIGpzb25PYmouZmlsZXMgPSBbLi4ubmV3IFNldChbLi4uKGpzb25PYmouZmlsZXMgPz8gW10pLCAnY29uZmlnLmQubXRzJ10pXTtcbiAgLy8gTm9kZU5leHQgcmVzb2x2ZXMgYSByZWxhdGl2ZSBgLi9jb25maWcubWpzYCBpbXBvcnQgdG8gYGNvbmZpZy5kLm10c2AsIG5vdFxuICAvLyB0aGUgcGFja2FnZS1sZXZlbCBgdHlwZXNgIGZpZWxkLiBLZWVwIHRoZSBwdWJsaXNoZWQgY29uZmlnIGltcG9ydGFibGUgZnJvbVxuICAvLyBwYWNrYWdlLWxvY2FsIFR5cGVTY3JpcHQgbGludGVyIHNldHRpbmdzLlxuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdjb25maWcuZC5tdHMnKSwgY29uZmlnRG10c0NvbnRlbnQpKTtcbn1cblxuY29uc3QgY29uZmlnRG10c0NvbnRlbnQgPSBgZXhwb3J0IHsgZGVmYXVsdCB9IGZyb20gJy4vY29uZmlnLmpzJztcbmA7XG5cbmZ1bmN0aW9uIGFkZERlcGVuZGVuY3lWZXJzaW9uc1RvUGFja2FnZUpzb24oXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbixcbiAgZGVwZW5kZW5jeVVwZGF0ZXM6IERlcGVuZGVuY3lVcGRhdGVzLFxuICBza2lwQWRkaW5nRGVwczogYm9vbGVhblxuKTogdm9pZCB7XG4gIGNvbnN0IHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXBlbmRlbmNpZXM7XG4gIGNvbnN0IHBhY2thZ2VKc29uRGV2RGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXZEZXBlbmRlbmNpZXM7XG4gIGRlcGVuZGVuY3lVcGRhdGVzLmRlcGVuZGVuY2llcyA9IGFkZFBhY2thZ2VKc29uRGVwZW5kZW5jaWVzKFxuICAgIGNvbmZpZyxcbiAgICByb290Q29uZmlnLFxuICAgIGpzb25PYmosXG4gICAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXMsXG4gICAgWy4uLmRlcGVuZGVuY3lVcGRhdGVzLmRlcGVuZGVuY2llcywgLi4uZ2V0RXhpc3RpbmdNYW5hZ2VkRGVwZW5kZW5jaWVzKHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzLCBqc29uT2JqKV0sXG4gICAgc2tpcEFkZGluZ0RlcHNcbiAgKTtcbiAgZGVwZW5kZW5jeVVwZGF0ZXMuZGV2RGVwZW5kZW5jaWVzID0gZGVwZW5kZW5jeVVwZGF0ZXMuZGV2RGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwXSk7XG4gIGRlcGVuZGVuY3lVcGRhdGVzLmRldkRlcGVuZGVuY2llcyA9IGFkZFBhY2thZ2VKc29uRGVwZW5kZW5jaWVzKFxuICAgIGNvbmZpZyxcbiAgICByb290Q29uZmlnLFxuICAgIGpzb25PYmosXG4gICAgcGFja2FnZUpzb25EZXZEZXBlbmRlbmNpZXMsXG4gICAgWy4uLmRlcGVuZGVuY3lVcGRhdGVzLmRldkRlcGVuZGVuY2llcywgLi4uZ2V0RXhpc3RpbmdNYW5hZ2VkRGVwZW5kZW5jaWVzKHBhY2thZ2VKc29uRGV2RGVwZW5kZW5jaWVzLCBqc29uT2JqKV0sXG4gICAgc2tpcEFkZGluZ0RlcHNcbiAgKTtcbn1cblxuZnVuY3Rpb24gZ2V0RXhpc3RpbmdNYW5hZ2VkRGVwZW5kZW5jaWVzKFxuICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llczogUGFydGlhbDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PixcbiAganNvbk9iajogUGFja2FnZUpzb25cbik6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzKS5maWx0ZXIoXG4gICAgKGRlcGVuZGVuY3kpID0+XG4gICAgICBtYW5hZ2VkRGVwZW5kZW5jeU5hbWVzLmhhcyhkZXBlbmRlbmN5KSAmJlxuICAgICAgLy8gQSBwdWJsaWMgcGFja2FnZSdzIGB3b3Jrc3BhY2U6YCBzcGVjaWZpZXIgbXVzdCBuZXZlciBiZSByZS1tYW5hZ2VkIHZpYSBhIHJlZ2lzdHJ5IGluc3RhbGxcbiAgICAgIC8vIChwcml2YXRlIG9uZXMgYXJlIG5vcm1hbGl6ZWQgdG8gYHdvcmtzcGFjZToqYCBsYXRlcikuIFRoaXMgYWxzbyBjb3ZlcnMgcnVubmluZyB3YmZ5IG9uIGFcbiAgICAgIC8vIG1vbm9yZXBvIFNVQkRJUkVDVE9SWSwgd2hlcmUgdGhlIHBhcmVudCdzIHdvcmtzcGFjZXMgYXJlIGludmlzaWJsZSBhbmQgdGhlIHdvcmtzcGFjZS1tYXBcbiAgICAgIC8vIGd1YXJkIGluIGFkZFBhY2thZ2VKc29uRGVwZW5kZW5jaWVzIGNhbm5vdCBwcm90ZWN0IHRoZSBzcGVjaWZpZXIuXG4gICAgICAoanNvbk9iai5wcml2YXRlIHx8ICFwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XT8uc3RhcnRzV2l0aCgnd29ya3NwYWNlOicpKVxuICApO1xufVxuXG5mdW5jdGlvbiByZW1vdmVFbXB0eURlcGVuZGVuY3lTZWN0aW9ucyhqc29uT2JqOiBQYWNrYWdlSnNvbik6IHZvaWQge1xuICBmb3IgKGNvbnN0IGtleSBvZiBkZXBlbmRlbmN5U2VjdGlvbktleXMpIHtcbiAgICBjb25zdCBzZWN0aW9uID0ganNvbk9ialtrZXldO1xuICAgIGlmIChzZWN0aW9uICYmIE9iamVjdC5rZXlzKHNlY3Rpb24pLmxlbmd0aCA9PT0gMCkge1xuICAgICAgUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShqc29uT2JqLCBrZXkpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpbnN0YWxsRGVwZW5kZW5jeVVwZGF0ZXMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogUGFja2FnZUpzb24sXG4gIGRlcGVuZGVuY3lVcGRhdGVzOiBEZXBlbmRlbmN5VXBkYXRlc1xuKTogdm9pZCB7XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbikge1xuICAgIGNvbnN0IGRlcGVuZGVuY2llcyA9IGRlcGVuZGVuY3lVcGRhdGVzLmRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzPy5bZGVwXSk7XG4gICAgaW5zdGFsbE5wbURlcGVuZGVuY2llcyhjb25maWcsIHJvb3RDb25maWcsIGRlcGVuZGVuY2llcywgZmFsc2UpO1xuXG4gICAgY29uc3QgZGV2RGVwZW5kZW5jaWVzID0gZGVwZW5kZW5jeVVwZGF0ZXMuZGV2RGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhanNvbk9iai5kZXBlbmRlbmNpZXM/LltkZXBdKTtcbiAgICBpbnN0YWxsTnBtRGVwZW5kZW5jaWVzKGNvbmZpZywgcm9vdENvbmZpZywgZGV2RGVwZW5kZW5jaWVzLCB0cnVlKTtcbiAgfVxuXG4gIGNvbnN0IHB5dGhvblBhY2thZ2VNYW5hZ2VyID0gZ2V0UHl0aG9uUGFja2FnZU1hbmFnZXIoY29uZmlnKTtcbiAgaWYgKHB5dGhvblBhY2thZ2VNYW5hZ2VyICYmIGRlcGVuZGVuY3lVcGRhdGVzLnB5dGhvbkRldkRlcGVuZGVuY2llcy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgZGVwZW5kZW5jaWVzID0gWy4uLm5ldyBTZXQoZGVwZW5kZW5jeVVwZGF0ZXMucHl0aG9uRGV2RGVwZW5kZW5jaWVzKV07XG4gICAgaWYgKHB5dGhvblBhY2thZ2VNYW5hZ2VyID09PSAncG9ldHJ5Jykge1xuICAgICAgc3Bhd25TeW5jKCdwb2V0cnknLCBbJ2FkZCcsICctLWdyb3VwJywgJ2RldicsIC4uLmRlcGVuZGVuY2llc10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3Bhd25TeW5jKCd1dicsIFsnYWRkJywgJy0tZGV2JywgLi4uZGVwZW5kZW5jaWVzXSwgY29uZmlnLmRpclBhdGgpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRQeXRob25QYWNrYWdlTWFuYWdlcihjb25maWc6IFBhY2thZ2VDb25maWcpOiAncG9ldHJ5JyB8ICd1dicgfCB1bmRlZmluZWQge1xuICBpZiAoY29uZmlnLmRvZXNDb250YWluVXZMb2NrKSByZXR1cm4gJ3V2JztcbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2spIHJldHVybiAncG9ldHJ5Jztcbn1cblxuZnVuY3Rpb24gZ2V0UHl0aG9uU2V0dXBDb21tYW5kKHBhY2thZ2VNYW5hZ2VyOiAncG9ldHJ5JyB8ICd1dicpOiBzdHJpbmcge1xuICBpZiAocGFja2FnZU1hbmFnZXIgPT09ICd1dicpIHJldHVybiAndXYgc3luYyAtLWZyb3plbic7XG4gIC8vIGBtaXNlIHdoaWNoIHB5dGhvbmAgeWllbGRzIHRoZSBzaW5nbGUgYWN0aXZlIGludGVycHJldGVyIHBhdGg7IGBtaXNlIGN1cnJlbnQgcHl0aG9uYCBjYW5cbiAgLy8gcHJpbnQgbXVsdGlwbGUgc3BhY2Utc2VwYXJhdGVkIHZlcnNpb25zIChtaXNlIHN1cHBvcnRzIG11bHRpLXZlcnNpb24gcGlucyksIHdoaWNoIHdvdWxkIHBhc3NcbiAgLy8gZXh0cmEgcG9zaXRpb25hbCBhcmd1bWVudHMgdG8gYHBvZXRyeSBlbnYgdXNlYC4gV2hlbiBtaXNlIGlzIG1pc3Npbmcgb3IgcHl0aG9uIGlzXG4gIC8vIHVuY29uZmlndXJlZCwgc2tpcCBgcG9ldHJ5IGVudiB1c2VgIGFuZCBmYWxsIGJhY2sgdG8gcG9ldHJ5J3MgZGVmYXVsdCBpbnRlcnByZXRlciBpbnN0ZWFkIG9mXG4gIC8vIGFib3J0aW5nIHRoZSBjaGFpbi5cbiAgLy8gVGhlIGB8fCB0cnVlYCBjb3ZlcnMgb25seSB0aGUgbWlzZSByZXNvbHV0aW9uOiBhIG1pc3NpbmcvdW5jb25maWd1cmVkIG1pc2UgZmFsbHMgYmFjayB0b1xuICAvLyBwb2V0cnkncyBkZWZhdWx0IGludGVycHJldGVyLCB3aGlsZSBhIGZhaWxpbmcgYHBvZXRyeSBlbnYgdXNlYCBzdGlsbCBhYm9ydHMgdGhlIGNoYWluLlxuICByZXR1cm4gJ3BvZXRyeSBjb25maWcgdmlydHVhbGVudnMuaW4tcHJvamVjdCB0cnVlICYmIHsgcHl0aG9uX3BhdGg9XCIkKG1pc2Ugd2hpY2ggcHl0aG9uIDI+L2Rldi9udWxsKVwiIHx8IHRydWU7IH0gJiYgeyBbIC16IFwiJHB5dGhvbl9wYXRoXCIgXSB8fCBwb2V0cnkgZW52IHVzZSBcIiRweXRob25fcGF0aFwiOyB9ICYmIHBvZXRyeSBydW4gcGlwIGluc3RhbGwgLS11cGdyYWRlIHBpcCAmJiBwb2V0cnkgaW5zdGFsbCc7XG59XG5cbmZ1bmN0aW9uIGluc3RhbGxOcG1EZXBlbmRlbmNpZXMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgZGVwZW5kZW5jaWVzOiBzdHJpbmdbXSxcbiAgZGV2OiBib29sZWFuXG4pOiB2b2lkIHtcbiAgaWYgKGRlcGVuZGVuY2llcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICBjb25zdCBkZXBlbmRlbmN5U3BlY2lmaWVycyA9IFtcbiAgICAuLi5uZXcgU2V0KGRlcGVuZGVuY2llcy5tYXAoKGRlcGVuZGVuY3kpID0+IGdldEluc3RhbGxEZXBlbmRlbmN5U3BlY2lmaWVyKGNvbmZpZywgcm9vdENvbmZpZywgZGVwZW5kZW5jeSkpKSxcbiAgXTtcbiAgc3Bhd25TeW5jKCdidW4nLCBbJ2FkZCcsIC4uLihkZXYgPyBbJy1EJ10gOiBbXSksICctLWV4YWN0JywgLi4uZGVwZW5kZW5jeVNwZWNpZmllcnNdLCBjb25maWcuZGlyUGF0aCk7XG59XG5cbmZ1bmN0aW9uIGFkZFBhY2thZ2VKc29uRGVwZW5kZW5jaWVzKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24sXG4gIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzOiBQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+LFxuICBkZXBlbmRlbmNpZXM6IHN0cmluZ1tdLFxuICBza2lwQWRkaW5nRGVwczogYm9vbGVhblxuKTogc3RyaW5nW10ge1xuICBjb25zdCBkZXBlbmRlbmNpZXNUb0luc3RhbGw6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiBuZXcgU2V0KGRlcGVuZGVuY2llcykpIHtcbiAgICAvLyBBIHByaXZhdGUgcGFja2FnZSB3aG9zZSBtb25vcmVwbyBjb250YWlucyB0aGlzIGRlcGVuZGVuY3kgYXMgYSB3b3Jrc3BhY2UgbXVzdCByZWZlcmVuY2UgaXRcbiAgICAvLyB2aWEgdGhlIHdvcmtzcGFjZSBwcm90b2NvbDogcGlubmluZyBhIHJlZ2lzdHJ5IHZlcnNpb24gbWFrZXMgQnVuIHNoYWRvdyB0aGUgc2FtZS1uYW1lXG4gICAgLy8gd29ya3NwYWNlIGFuZCBza2lwIGluc3RhbGxpbmcgdGhlIHdvcmtzcGFjZSdzIG93biBkZXBlbmRlbmNpZXMuIChQdWJsaXNoZWQgcGFja2FnZXMgaW5zdGVhZFxuICAgIC8vIHBpbiBhIGNvbmNyZXRlIHZlcnNpb24gYmVjYXVzZSBgbnBtIHB1Ymxpc2hgIHJlamVjdHMgYHdvcmtzcGFjZToqYCBzcGVjaWZpZXJzIOKAlCBidXQgYW5cbiAgICAvLyBFWElTVElORyBgd29ya3NwYWNlOmAgZGVjbGFyYXRpb24gaXMgYWx3YXlzIGtlcHQ6IG92ZXJ3cml0aW5nIGl0IHdpdGggYSByZWdpc3RyeSByZWxlYXNlXG4gICAgLy8gd291bGQgc2lsZW50bHkgYnJlYWsgdGhlIGxvY2FsIHdvcmtzcGFjZSBsaW5rLilcblxuICAgIC8vIEEgZGVjbGFyZWQgYHdvcmtzcGFjZTpgIHNwZWNpZmllciBhbHdheXMgd2lucywgd2hldGhlciBvciBub3QgdGhlIHdvcmtzcGFjZSBtYXAgc2VlcyB0aGVcbiAgICAvLyBwYWNrYWdlOiBydW5uaW5nIHdiZnkgb24gYSBtb25vcmVwbyBTVUJESVJFQ1RPUlkgaGlkZXMgdGhlIHBhcmVudCdzIHdvcmtzcGFjZXMsIHNvIHRoZSBtYXBcbiAgICAvLyBhbG9uZSBjYW5ub3QgYmUgdHJ1c3RlZCB0byBkZXRlY3QgYSBsb2NhbCB3b3Jrc3BhY2UgbGluay5cbiAgICBpZiAocGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0/LnN0YXJ0c1dpdGgoJ3dvcmtzcGFjZTonKSkge1xuICAgICAgaWYgKGpzb25PYmoucHJpdmF0ZSkge1xuICAgICAgICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSA9ICd3b3Jrc3BhY2U6Kic7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGpzb25PYmoucHJpdmF0ZSAmJiBnZXRXb3Jrc3BhY2VQYWNrYWdlRGlycyhyb290Q29uZmlnKS5oYXMoZGVwZW5kZW5jeSkpIHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nU3BlY2lmaWVyID0gcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV07XG4gICAgICBpZiAoIWV4aXN0aW5nU3BlY2lmaWVyIHx8IGV4aXN0aW5nU3BlY2lmaWVyLnN0YXJ0c1dpdGgoJ3dvcmtzcGFjZTonKSkge1xuICAgICAgICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSA9ICd3b3Jrc3BhY2U6Kic7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgLy8gQW4gZXhpc3RpbmcgQ09OQ1JFVEUgcGluIG9uIGEgd29ya3NwYWNlIHBhY2thZ2UgaXMgYSBkZWxpYmVyYXRlIGNob2ljZSBhbmQgbXVzdCBub3QgYmVcbiAgICAgIC8vIGNvbnZlcnRlZCB0byB0aGUgd29ya3NwYWNlIHByb3RvY29sLiBOb3RlIHRoZSB0cmFkZS1vZmYgZWl0aGVyIHdheTogbnBtICh3aGljaFxuICAgICAgLy8gc2VtYW50aWMtcmVsZWFzZSdzIG5wbSBwbHVnaW4gc2hlbGxzIG91dCB0bykgY2Fubm90IHBhcnNlIGB3b3Jrc3BhY2U6YCBzcGVjaWZpZXJzLCB3aGlsZVxuICAgICAgLy8gYSByZWdpc3RyeSBwaW4gbWFrZXMgYSBjb2xkIGJ1biBpbnN0YWxsIHNoYWRvdyB0aGUgd29ya3NwYWNlIGFuZCBza2lwIGl0cyBkZXBlbmRlbmNpZXMg4oCUXG4gICAgICAvLyBXaWxsQm9vc3Rlci9zaGFyZWQga2VlcHMgYHdvcmtzcGFjZToqYCBhbmQgc3RyaXBzIHRoZSBwcm90b2NvbCBvbiB0aGUgQ0kgY2hlY2tvdXQgcmlnaHRcbiAgICAgIC8vIGJlZm9yZSByZWxlYXNpbmcgKHNjcmlwdHMvc3RyaXBXb3Jrc3BhY2VQcm90b2NvbC5tanMpLiBGYWxsIHRocm91Z2ggc28gYSBjb25jcmV0ZSBwaW5cbiAgICAgIC8vIGtlZXBzIGJlaW5nIGJ1bXBlZCBsaWtlIGFueSBtYW5hZ2VkIGRlcGVuZGVuY3kuXG4gICAgfVxuICAgIGNvbnN0IHNob3VsZFVwZGF0ZUV4aXN0aW5nRGVwZW5kZW5jeSA9IHNob3VsZFVwZGF0ZUV4aXN0aW5nTWFuYWdlZERlcGVuZGVuY3koXG4gICAgICBjb25maWcsXG4gICAgICByb290Q29uZmlnLFxuICAgICAgZGVwZW5kZW5jeSxcbiAgICAgIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldXG4gICAgKTtcbiAgICBpZiAoc2hvdWxkVXBkYXRlRXhpc3RpbmdEZXBlbmRlbmN5KSB7XG4gICAgICBjb25zdCBtYW5hZ2VkVmVyc2lvbiA9IGdldE1hbmFnZWREZXBlbmRlbmN5VmVyc2lvbihjb25maWcsIHJvb3RDb25maWcsIGRlcGVuZGVuY3kpO1xuICAgICAgaWYgKHNob3VsZERvd25ncmFkZUFnZUdhdGVkTWFuYWdlZERlcGVuZGVuY3koZGVwZW5kZW5jeSwgcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0sIG1hbmFnZWRWZXJzaW9uKSkge1xuICAgICAgICAvLyBgYnVuIGFkZCBkZXBlbmRlbmN5YCBwcmVzZXJ2ZXMgYW4gZXhpc3RpbmcgZXhhY3QgcGluLCBzbyB3cml0ZSB0aGUgYWdlLWNsZWFyZWQgdmVyc2lvblxuICAgICAgICAvLyBkaXJlY3RseS4gVGhlIGZpbmFsIHJlcG9zaXRvcnktd2lkZSBpbnN0YWxsIHJlZnJlc2hlcyB0aGUgbG9ja2ZpbGUgYWZ0ZXIgZXZlcnkgcGFja2FnZVxuICAgICAgICAvLyBtYW5pZmVzdCBoYXMgY29udmVyZ2VkIG9uIHRoZSBnZW5lcmF0ZWQgcmVsZWFzZS1hZ2UgcG9saWN5LlxuICAgICAgICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSA9IG1hbmFnZWRWZXJzaW9uO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGRlcGVuZGVuY2llc1RvSW5zdGFsbC5wdXNoKGRlcGVuZGVuY3kpO1xuICAgICAgaWYgKCFza2lwQWRkaW5nRGVwcykgY29udGludWU7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldICYmXG4gICAgICAhc2hvdWxkVXBkYXRlRXhpc3RpbmdEZXBlbmRlbmN5ICYmXG4gICAgICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSAhPT0gJyonXG4gICAgKVxuICAgICAgY29udGludWU7XG4gICAgY29uc3QgbGF0ZXN0VmVyc2lvbiA9IGdldE1hbmFnZWREZXBlbmRlbmN5VmVyc2lvbihjb25maWcsIHJvb3RDb25maWcsIGRlcGVuZGVuY3kpO1xuICAgIGlmIChsYXRlc3RWZXJzaW9uID09PSAnKicgJiYgcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0pIGNvbnRpbnVlO1xuICAgIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldID0gbGF0ZXN0VmVyc2lvbjtcbiAgfVxuICByZXR1cm4gZGVwZW5kZW5jaWVzVG9JbnN0YWxsO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRQYWNrYWdlSnNvbldpdGhQcm9qZWN0Rm9ybWF0dGVyKGNvbmZpZzogUGFja2FnZUNvbmZpZywgZmlsZVBhdGg6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCByZWxhdGl2ZUZpbGVQYXRoID0gcGF0aC5yZWxhdGl2ZShjb25maWcuZGlyUGF0aCwgZmlsZVBhdGgpO1xuICBpZiAoIXJlbGF0aXZlRmlsZVBhdGgpIHJldHVybjtcblxuICAvLyBSZXVzZSB0aGUgdGFyZ2V0IHJlcG9zaXRvcnkncyBvd24gZm9ybWF0dGVyIGFmdGVyIGRlcGVuZGVuY3kgaW5zdGFsbGF0aW9uIHNvXG4gIC8vIHBhY2thZ2UuanNvbiBtYXRjaGVzIHdoYXRldmVyIGl0cyBjdXJyZW50IHNvcnQtcGFja2FnZS1qc29uIHZlcnNpb24gZXhwZWN0cy5cbiAgLy8gVGhpcyBhdm9pZHMgZm9sbG93LXVwIGF1dG9maXggY29tbWl0cyBjYXVzZWQgb25seSBieSBmb3JtYXR0ZXIgdmVyc2lvbiBkcmlmdFxuICAvLyBiZXR3ZWVuIHdiZnkgYW5kIHRoZSBwcm9qZWN0IGJlaW5nIHVwZGF0ZWQuXG4gIHNwYXduU3luYygnYnVueCcsIFsnc29ydC1wYWNrYWdlLWpzb24nLCByZWxhdGl2ZUZpbGVQYXRoXSwgY29uZmlnLmRpclBhdGgpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZW1vdmVVbnVzZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbixcbiAgdXNlZERlcGVuZGVuY2llczogc3RyaW5nW11cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB1c2VkRGVwZW5kZW5jeVNldCA9IG5ldyBTZXQodXNlZERlcGVuZGVuY2llcyk7XG4gIGNvbnN0IGV4aXN0aW5nVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzID0gYXdhaXQgZ2V0RXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMoY29uZmlnKTtcbiAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIG1hbmFnZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMpIHtcbiAgICBpZiAodXNlZERlcGVuZGVuY3lTZXQuaGFzKGRlcGVuZGVuY3kpIHx8IGV4aXN0aW5nVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzLmhhcyhkZXBlbmRlbmN5KSkgY29udGludWU7XG4gICAgLy8gd2JmeSBvd25zIHRoZXNlIGJhc2UtY29uZmlnIHBhY2thZ2VzLiBSZW1vdmUgc3RhbGUgdmFyaWFudHMgd2hlbiByZXBvXG4gICAgLy8gY2FwYWJpbGl0aWVzIGNoYW5nZSwgc3VjaCBhcyBOZXh0LmpzIHRha2luZyBvd25lcnNoaXAgb2YgdHNjb25maWcuanNvbi5cbiAgICBmb3IgKGNvbnN0IHNlY3Rpb24gb2YgZ2V0RGVwZW5kZW5jeVNlY3Rpb25zKGpzb25PYmopKSB7XG4gICAgICBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KHNlY3Rpb24sIGRlcGVuZGVuY3kpO1xuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRFeGlzdGluZ1RzY29uZmlnQmFzZURlcGVuZGVuY2llcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPFNldDxzdHJpbmc+PiB7XG4gIGNvbnN0IGV4aXN0aW5nVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IGZpbGVQYXRocyA9IGF3YWl0IGZnLmdsb2IoJyoqL3RzY29uZmlnKi5qc29uJywge1xuICAgIGN3ZDogY29uZmlnLmRpclBhdGgsXG4gICAgZG90OiB0cnVlLFxuICAgIGlnbm9yZTogZ2xvYklnbm9yZSxcbiAgfSk7XG5cbiAgZm9yIChjb25zdCBmaWxlUGF0aCBvZiBmaWxlUGF0aHMpIHtcbiAgICBjb25zdCBhYnNvbHV0ZUZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBmaWxlUGF0aCk7XG4gICAgLy8gVHlwZVNjcmlwdCA3J3MgbmF0aXZlIGNvbXBpbGVyIGRyb3BwZWQgdGhlIGluLXByb2Nlc3MgYHBhcnNlQ29uZmlnRmlsZVRleHRUb0pzb25gXG4gICAgLy8gaGVscGVyLCBzbyBwYXJzZSB0aGUgdHNjb25maWcgaW50byBhbiBBU1QgYW5kIHJlYWQgaXRzIHRvcC1sZXZlbCBgZXh0ZW5kc2AgZGlyZWN0bHkuXG4gICAgY29uc3Qgc291cmNlID0gYXdhaXQgcGFyc2VTb3VyY2VGaWxlKGFic29sdXRlRmlsZVBhdGgpO1xuICAgIGlmICghc291cmNlKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFByZXNlcnZlIG1hbmFnZWQgQHRzY29uZmlnIGRlcGVuZGVuY2llcyBiZWNhdXNlICR7YWJzb2x1dGVGaWxlUGF0aH0gY291bGQgbm90IGJlIHBhcnNlZC5gKTtcbiAgICAgIHJldHVybiBuZXcgU2V0KG1hbmFnZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHJlYWRUc2NvbmZpZ0V4dGVuZHMoc291cmNlKSkge1xuICAgICAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIG1hbmFnZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSBkZXBlbmRlbmN5IHx8IHZhbHVlLnN0YXJ0c1dpdGgoYCR7ZGVwZW5kZW5jeX0vYCkpIHtcbiAgICAgICAgICBleGlzdGluZ1RzY29uZmlnQmFzZURlcGVuZGVuY2llcy5hZGQoZGVwZW5kZW5jeSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gZXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXM7XG59XG5cbi8qKiBSZWFkcyB0aGUgdG9wLWxldmVsIGBleHRlbmRzYCBlbnRyaWVzIChhIHN0cmluZyBvciBhcnJheSBvZiBzdHJpbmdzKSBmcm9tIGEgcGFyc2VkIHRzY29uZmlnLiAqL1xuZnVuY3Rpb24gcmVhZFRzY29uZmlnRXh0ZW5kcyhzb3VyY2U6IGFzdC5Tb3VyY2VGaWxlKTogc3RyaW5nW10ge1xuICBjb25zdCB2YWx1ZXM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgcHJvcGVydHkgb2YgZ2V0VHNjb25maWdSb290UHJvcGVydGllcyhzb3VyY2UpKSB7XG4gICAgaWYgKGFzdC5pc1Byb3BlcnR5QXNzaWdubWVudChwcm9wZXJ0eSkgJiYgYXN0LmlzU3RyaW5nTGl0ZXJhbChwcm9wZXJ0eS5uYW1lKSAmJiBwcm9wZXJ0eS5uYW1lLnRleHQgPT09ICdleHRlbmRzJykge1xuICAgICAgY29sbGVjdFN0cmluZ0xpdGVyYWxWYWx1ZXMocHJvcGVydHkuaW5pdGlhbGl6ZXIsIHZhbHVlcyk7XG4gICAgfVxuICB9XG4gIHJldHVybiB2YWx1ZXM7XG59XG5cbmZ1bmN0aW9uIGdldFRzY29uZmlnUm9vdFByb3BlcnRpZXMoc291cmNlOiBhc3QuU291cmNlRmlsZSk6IHJlYWRvbmx5IGFzdC5PYmplY3RMaXRlcmFsRWxlbWVudExpa2VbXSB7XG4gIGZvciAoY29uc3Qgc3RhdGVtZW50IG9mIHNvdXJjZS5zdGF0ZW1lbnRzKSB7XG4gICAgaWYgKGFzdC5pc0V4cHJlc3Npb25TdGF0ZW1lbnQoc3RhdGVtZW50KSAmJiBhc3QuaXNPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihzdGF0ZW1lbnQuZXhwcmVzc2lvbikpIHtcbiAgICAgIHJldHVybiBzdGF0ZW1lbnQuZXhwcmVzc2lvbi5wcm9wZXJ0aWVzO1xuICAgIH1cbiAgfVxuICByZXR1cm4gW107XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RTdHJpbmdMaXRlcmFsVmFsdWVzKG5vZGU6IGFzdC5FeHByZXNzaW9uLCB2YWx1ZXM6IHN0cmluZ1tdKTogdm9pZCB7XG4gIGlmIChhc3QuaXNTdHJpbmdMaXRlcmFsKG5vZGUpKSB7XG4gICAgdmFsdWVzLnB1c2gobm9kZS50ZXh0KTtcbiAgfSBlbHNlIGlmIChhc3QuaXNBcnJheUxpdGVyYWxFeHByZXNzaW9uKG5vZGUpKSB7XG4gICAgZm9yIChjb25zdCBlbGVtZW50IG9mIG5vZGUuZWxlbWVudHMpIHtcbiAgICAgIGNvbGxlY3RTdHJpbmdMaXRlcmFsVmFsdWVzKGVsZW1lbnQsIHZhbHVlcyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldERlcGVuZGVuY3lTZWN0aW9ucyhqc29uT2JqOiBQYWNrYWdlSnNvbik6IFBhcnRpYWw8UmVjb3JkPHN0cmluZywgc3RyaW5nPj5bXSB7XG4gIHJldHVybiBkZXBlbmRlbmN5U2VjdGlvbktleXNcbiAgICAubWFwKChrZXkpID0+IGpzb25PYmpba2V5XSlcbiAgICAuZmlsdGVyKChzZWN0aW9uKTogc2VjdGlvbiBpcyBQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+ID0+ICEhc2VjdGlvbik7XG59XG5cbmZ1bmN0aW9uIGdldExhdGVzdERlcGVuZGVuY3lWZXJzaW9uKGRlcGVuZGVuY3k6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGNhY2hlZFZlcnNpb24gPSBsYXRlc3REZXBlbmRlbmN5VmVyc2lvbkNhY2hlLmdldChkZXBlbmRlbmN5KTtcbiAgaWYgKGNhY2hlZFZlcnNpb24pIHJldHVybiBjYWNoZWRWZXJzaW9uO1xuXG4gIGNvbnN0IHZlcnNpb24gPSBnZXREZXBlbmRlbmN5VmVyc2lvbkZyb21OcG0oZGVwZW5kZW5jeSk7XG4gIGxhdGVzdERlcGVuZGVuY3lWZXJzaW9uQ2FjaGUuc2V0KGRlcGVuZGVuY3ksIHZlcnNpb24pO1xuICByZXR1cm4gdmVyc2lvbjtcbn1cblxuZnVuY3Rpb24gZ2V0RGVwZW5kZW5jeVZlcnNpb25Gcm9tTnBtKGRlcGVuZGVuY3k6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICghc2hvdWxkQXBwbHlQYWNrYWdlQWdlR2F0ZShkZXBlbmRlbmN5KSkge1xuICAgIHJldHVybiBnZXRSYXdEZXBlbmRlbmN5VmVyc2lvbkZyb21OcG0oZGVwZW5kZW5jeSk7XG4gIH1cblxuICByZXR1cm4gZ2V0TGF0ZXN0QWdlR2F0ZWREZXBlbmRlbmN5VmVyc2lvbihkZXBlbmRlbmN5KTtcbn1cblxuZnVuY3Rpb24gZ2V0TGF0ZXN0QWdlR2F0ZWREZXBlbmRlbmN5VmVyc2lvbihkZXBlbmRlbmN5OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCB0aW1lcyA9IGdldE5wbVBhY2thZ2VUaW1lcyhkZXBlbmRlbmN5KTtcbiAgY29uc3QgbGF0ZXN0VmVyc2lvbiA9IGdldFJhd0RlcGVuZGVuY3lWZXJzaW9uRnJvbU5wbShkZXBlbmRlbmN5KTtcbiAgaWYgKGxhdGVzdFZlcnNpb24gIT09ICcqJyAmJiBpc1B1Ymxpc2hlZEJlZm9yZUFnZUdhdGUodGltZXNbbGF0ZXN0VmVyc2lvbl0pKSB7XG4gICAgcmV0dXJuIGxhdGVzdFZlcnNpb247XG4gIH1cblxuICByZXR1cm4gZ2V0QWdlR2F0ZWRWZXJzaW9uc0Rlc2NlbmRpbmcodGltZXMpWzBdID8/ICcqJztcbn1cblxuLyoqIEV2ZXJ5IHN0YWJsZSByZWxlYXNlIGluIGB0aW1lc2AgdGhhdCBhbHJlYWR5IGNsZWFyZWQgdGhlIGFnZSBnYXRlLCBuZXdlc3QgZmlyc3QuICovXG5mdW5jdGlvbiBnZXRBZ2VHYXRlZFZlcnNpb25zRGVzY2VuZGluZyh0aW1lczogUmVjb3JkPHN0cmluZywgc3RyaW5nPik6IHN0cmluZ1tdIHtcbiAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHRpbWVzKVxuICAgIC5maWx0ZXIoKFt2ZXJzaW9uXSkgPT4gc2VtdmVyLnZhbGlkKHZlcnNpb24pKVxuICAgIC5maWx0ZXIoKFt2ZXJzaW9uXSkgPT4gKHNlbXZlci5wcmVyZWxlYXNlKHZlcnNpb24pPy5sZW5ndGggPz8gMCkgPT09IDApXG4gICAgLmZpbHRlcigoWywgcHVibGlzaGVkQXRdKSA9PiBOdW1iZXIuaXNGaW5pdGUoRGF0ZS5wYXJzZShwdWJsaXNoZWRBdCkpKVxuICAgIC5maWx0ZXIoKFssIHB1Ymxpc2hlZEF0XSkgPT4gbm93IC0gRGF0ZS5wYXJzZShwdWJsaXNoZWRBdCkgPj0gcGFja2FnZUFnZUdhdGVNcylcbiAgICAudG9Tb3J0ZWQoKFt2ZXJzaW9uQV0sIFt2ZXJzaW9uQl0pID0+IHNlbXZlci5yY29tcGFyZSh2ZXJzaW9uQSwgdmVyc2lvbkIpKVxuICAgIC5tYXAoKFt2ZXJzaW9uXSkgPT4gdmVyc2lvbik7XG59XG5cbmZ1bmN0aW9uIGlzUHVibGlzaGVkQmVmb3JlQWdlR2F0ZShwdWJsaXNoZWRBdDogc3RyaW5nIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIGlmICghcHVibGlzaGVkQXQpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgcHVibGlzaGVkVGltZSA9IERhdGUucGFyc2UocHVibGlzaGVkQXQpO1xuICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKHB1Ymxpc2hlZFRpbWUpICYmIERhdGUubm93KCkgLSBwdWJsaXNoZWRUaW1lID49IHBhY2thZ2VBZ2VHYXRlTXM7XG59XG5cbmZ1bmN0aW9uIGdldE5wbVBhY2thZ2VUaW1lcyhkZXBlbmRlbmN5OiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgcGFja2FnZU5hbWUgPSBkZXBlbmRlbmN5LnJlcGxhY2UoL0BbXkAvXSskL3UsICcnKTtcbiAgY29uc3QgY2FjaGVkVGltZXMgPSBucG1QYWNrYWdlVGltZXNDYWNoZS5nZXQocGFja2FnZU5hbWUpO1xuICBpZiAoY2FjaGVkVGltZXMpIHJldHVybiBjYWNoZWRUaW1lcztcblxuICBjb25zdCBzdGRvdXQgPSBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoXG4gICAgJ25wbScsXG4gICAgWydzaG93JywgcGFja2FnZU5hbWUsICd0aW1lJywgJy0tanNvbicsICctLXdvcmtzcGFjZXM9ZmFsc2UnXSxcbiAgICBwcm9jZXNzLmN3ZCgpXG4gICk7XG4gIGlmICghc3Rkb3V0KSByZXR1cm4ge307XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHN0ZG91dCkgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IFtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XTtcbiAgICBjb25zdCB0aW1lcyA9IEFycmF5LmlzQXJyYXkocGFyc2VkKSA/IHBhcnNlZFswXSA6IHBhcnNlZDtcbiAgICBpZiAoIXRpbWVzKSByZXR1cm4ge307XG4gICAgbnBtUGFja2FnZVRpbWVzQ2FjaGUuc2V0KHBhY2thZ2VOYW1lLCB0aW1lcyk7XG4gICAgcmV0dXJuIHRpbWVzO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4ge307XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvdWxkQXBwbHlQYWNrYWdlQWdlR2F0ZShkZXBlbmRlbmN5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgLy8gS2VlcCBtYW5hZ2VkIGZpcnN0LXBhcnR5IHBhY2thZ2VzIGFsaWduZWQgd2l0aCBCdW4ncyBleHBsaWNpdCBleGVtcHRpb25zLiB3YmZ5J3MgZ2VuZXJhdGVkXG4gIC8vIGNvbmZpZ3VyYXRpb24gY2FuIHJlbHkgb24gdGhlIGN1cnJlbnQgd2IgY29udHJhY3QsIHNvIGluZGVwZW5kZW50bHkgc29ha2luZyBvciBkb3duZ3JhZGluZyB3YlxuICAvLyB3b3VsZCBwYWlyIG5ldyBnZW5lcmF0ZWQgZmlsZXMgd2l0aCBhbiBpbmNvbXBhdGlibGUgb2xkIENMSS4gVGhvc2UgcGFja2FnZXMgYXJlIHJlbGVhc2VkIGFuZFxuICAvLyBmaXhlZCBhdCB0aGVpciBzb3VyY2UgaW5zdGVhZDsgb25seSBwYWNrYWdlcyBCdW4gaXRzZWxmIGdhdGVzIG1heSBiZSBzZWxlY3RlZCBmcm9tIG9sZGVyIHRhZ3MuXG4gIHJldHVybiAhYnVuTWluaW11bVJlbGVhc2VBZ2VFeGNsdWRlcy5zb21lKChwYXR0ZXJuKSA9PiBkb2VzUGFja2FnZVBhdHRlcm5NYXRjaChwYXR0ZXJuLCBkZXBlbmRlbmN5KSk7XG59XG5cbmZ1bmN0aW9uIGRvZXNQYWNrYWdlUGF0dGVybk1hdGNoKHBhdHRlcm46IHN0cmluZywgZGVwZW5kZW5jeTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmIChwYXR0ZXJuID09PSBkZXBlbmRlbmN5KSByZXR1cm4gdHJ1ZTtcbiAgaWYgKCFwYXR0ZXJuLmluY2x1ZGVzKCcqJykpIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBlc2NhcGVkUGF0dGVybiA9IHBhdHRlcm4ucmVwbGFjZUFsbCgvWy4rP14ke30oKXxbXFxdXFxcXF0vZ3UsIFN0cmluZy5yYXdgXFwkJmApLnJlcGxhY2VBbGwoJyonLCAnLionKTtcbiAgcmV0dXJuIG5ldyBSZWdFeHAoYF4ke2VzY2FwZWRQYXR0ZXJufSRgLCAndScpLnRlc3QoZGVwZW5kZW5jeSk7XG59XG5cbmZ1bmN0aW9uIGdldFJhd0RlcGVuZGVuY3lWZXJzaW9uRnJvbU5wbShkZXBlbmRlbmN5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBObyBjYWNoZSBoZXJlOiB0aGUgb25seSBjYWxsZXIgY2hhaW4gZ29lcyB0aHJvdWdoIGdldExhdGVzdERlcGVuZGVuY3lWZXJzaW9uLCB3aGljaCBhbHJlYWR5XG4gIC8vIG1lbW9pemVzIHBlciBkZXBlbmRlbmN5LCBzbyB0aGlzIGNhbiBydW4gYXQgbW9zdCBvbmNlIHBlciBkZXBlbmRlbmN5LlxuICByZXR1cm4gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KCducG0nLCBbJ3Nob3cnLCBkZXBlbmRlbmN5LCAndmVyc2lvbicsICctLXdvcmtzcGFjZXM9ZmFsc2UnXSwgcHJvY2Vzcy5jd2QoKSkgfHwgJyonO1xufVxuXG5mdW5jdGlvbiBnZXRJbnN0YWxsRGVwZW5kZW5jeVNwZWNpZmllcihjb25maWc6IFBhY2thZ2VDb25maWcsIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsIGRlcGVuZGVuY3k6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIFR5cGVTY3JpcHQgaXMgdmVyc2lvbi1jYXBwZWQgaW4gQmxpdHogcmVwb3NpdG9yaWVzLCBzbyBpdHMgaW5zdGFsbCBzcGVjaWZpZXIgbXVzdCBjYXJyeSB0aGVcbiAgLy8gbWFuYWdlZCB2ZXJzaW9uIOKAlCBhIGJhcmUgYGJ1biBhZGRgIHdvdWxkIGluc3RhbGwgdGhlIGluY29tcGF0aWJsZSBsYXRlc3QuXG4gIGlmIChkZXBlbmRlbmN5ID09PSB0eXBlc2NyaXB0RGVwZW5kZW5jeSAmJiBpc0JsaXR6UmVwb3NpdG9yeShjb25maWcsIHJvb3RDb25maWcpKSB7XG4gICAgcmV0dXJuIGAke2RlcGVuZGVuY3l9QCR7Z2V0TWFuYWdlZERlcGVuZGVuY3lWZXJzaW9uKGNvbmZpZywgcm9vdENvbmZpZywgZGVwZW5kZW5jeSl9YDtcbiAgfVxuICByZXR1cm4gZGVwZW5kZW5jeTtcbn1cblxuLyoqIFdoZXRoZXIgdGhlIHJlcG9zaXRvcnkgY29udGFpbnMgYSBCbGl0eiBhcHAgKHRoZSBjdXJyZW50IHBhY2thZ2Ugb3IgdGhlIHdvcmtzcGFjZSByb290KS4gKi9cbmZ1bmN0aW9uIGlzQmxpdHpSZXBvc2l0b3J5KGNvbmZpZzogUGFja2FnZUNvbmZpZywgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gY29uZmlnLmRlcGVuZGluZy5ibGl0eiB8fCByb290Q29uZmlnLmRlcGVuZGluZy5ibGl0ejtcbn1cblxuY29uc3Qgd29ya3NwYWNlUGFja2FnZURpcnNDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBzdHJpbmc+PigpO1xuXG4vKiogTWFwIGZyb20gZWFjaCB3b3Jrc3BhY2UgcGFja2FnZSdzIG5hbWUgdG8gaXRzIGRpcmVjdG9yeSAocmVsYXRpdmUgdG8gdGhlIG1vbm9yZXBvIHJvb3QpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFdvcmtzcGFjZVBhY2thZ2VEaXJzKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBNYXA8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgY2FjaGVkID0gd29ya3NwYWNlUGFja2FnZURpcnNDYWNoZS5nZXQocm9vdENvbmZpZy5kaXJQYXRoKTtcbiAgaWYgKGNhY2hlZCkgcmV0dXJuIGNhY2hlZDtcblxuICBjb25zdCB3b3Jrc3BhY2VEaXJzQnlOYW1lID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBwYWNrYWdlSnNvblBhdGggb2YgZ2V0V29ya3NwYWNlUGFja2FnZUpzb25QYXRocyhyb290Q29uZmlnKSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB3b3Jrc3BhY2VQYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoXG4gICAgICAgIGZzLnJlYWRGaWxlU3luYyhwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCBwYWNrYWdlSnNvblBhdGgpLCAndXRmOCcpXG4gICAgICApIGFzIFBhY2thZ2VKc29uO1xuICAgICAgaWYgKHdvcmtzcGFjZVBhY2thZ2VKc29uLm5hbWUpIHtcbiAgICAgICAgd29ya3NwYWNlRGlyc0J5TmFtZS5zZXQod29ya3NwYWNlUGFja2FnZUpzb24ubmFtZSwgcGF0aC5wb3NpeC5kaXJuYW1lKHBhY2thZ2VKc29uUGF0aCkpO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gaWdub3JlIHVucGFyc2FibGUgd29ya3NwYWNlIHBhY2thZ2UuanNvblxuICAgIH1cbiAgfVxuICB3b3Jrc3BhY2VQYWNrYWdlRGlyc0NhY2hlLnNldChyb290Q29uZmlnLmRpclBhdGgsIHdvcmtzcGFjZURpcnNCeU5hbWUpO1xuICByZXR1cm4gd29ya3NwYWNlRGlyc0J5TmFtZTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkVXBkYXRlRXhpc3RpbmdNYW5hZ2VkRGVwZW5kZW5jeShcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBkZXBlbmRlbmN5OiBzdHJpbmcsXG4gIGN1cnJlbnRWZXJzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWRcbik6IGJvb2xlYW4ge1xuICBpZiAoIWN1cnJlbnRWZXJzaW9uKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKGN1cnJlbnRWZXJzaW9uID09PSAnKicpIHJldHVybiB0cnVlO1xuICBpZiAoaXNXb3Jrc3BhY2VQcm90b2NvbFJhbmdlKGN1cnJlbnRWZXJzaW9uKSkgcmV0dXJuIHRydWU7XG4gIGlmICghbWFuYWdlZERlcGVuZGVuY3lOYW1lcy5oYXMoZGVwZW5kZW5jeSkpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgbWFuYWdlZFZlcnNpb24gPSBnZXRNYW5hZ2VkRGVwZW5kZW5jeVZlcnNpb24oY29uZmlnLCByb290Q29uZmlnLCBkZXBlbmRlbmN5KTtcbiAgY29uc3QgY3VycmVudFZhbGlkVmVyc2lvbiA9IHNlbXZlci52YWxpZChjdXJyZW50VmVyc2lvbik7XG4gIC8vIEEgVHlwZVNjcmlwdCA3IHBpbiBpbiBhIEJsaXR6IHJlcG9zaXRvcnkgaXMgbGlrZXdpc2UgaW5jb21wYXRpYmxlIChgbmV4dCBidWlsZGAgZmFpbHMgb25cbiAgLy8gdGhlIE5leHQuanMgMTUgdGhhdCBCbGl0eiBwaW5zIOKAlCBzZWUgZ2V0TWFuYWdlZERlcGVuZGVuY3lWZXJzaW9uKSwgc28gcmV3cml0ZSBpdCB0byB0aGVcbiAgLy8gY2FwcGVkIHJlbGVhc2UgaW5zdGVhZCBvZiBwcmVzZXJ2aW5nIGl0IHZpYSB0aGUgbm8tZG93bmdyYWRlIHJ1bGUgYmVsb3cuIFRoZSBwaW4gbWF5IGJlIGFcbiAgLy8gUkFOR0UgKGUuZy4gYF43LjAuMGApLCB3aGljaCBzZW12ZXIudmFsaWQgcmVqZWN0cyDigJQganVkZ2UgdGhlIG1ham9yIGZyb20gdGhlIHJhbmdlIG1pbmltdW0uXG4gIGNvbnN0IGN1cnJlbnRUeXBlc2NyaXB0VmVyc2lvbiA9XG4gICAgY3VycmVudFZhbGlkVmVyc2lvbiA/PyAoc2VtdmVyLnZhbGlkUmFuZ2UoY3VycmVudFZlcnNpb24pID8gc2VtdmVyLm1pblZlcnNpb24oY3VycmVudFZlcnNpb24pPy52ZXJzaW9uIDogdW5kZWZpbmVkKTtcbiAgaWYgKFxuICAgIGRlcGVuZGVuY3kgPT09IHR5cGVzY3JpcHREZXBlbmRlbmN5ICYmXG4gICAgaXNCbGl0elJlcG9zaXRvcnkoY29uZmlnLCByb290Q29uZmlnKSAmJlxuICAgIGN1cnJlbnRUeXBlc2NyaXB0VmVyc2lvbiAmJlxuICAgIHNlbXZlci5tYWpvcihjdXJyZW50VHlwZXNjcmlwdFZlcnNpb24pID49IDcgJiZcbiAgICBzZW12ZXIudmFsaWQobWFuYWdlZFZlcnNpb24pICYmXG4gICAgaXNOZXdlclBhY2thZ2VWZXJzaW9uKGN1cnJlbnRWZXJzaW9uLCBtYW5hZ2VkVmVyc2lvbilcbiAgKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgLy8gVGhlIGdlbmVyYXRlZCBidW5maWcgYXBwbGllcyB0aGUgb3JnYW5pemF0aW9uIGFnZSBnYXRlIGV2ZW4gdG8gZXhhY3QgcGlucy4gSWYgYSBtYW5hZ2VkXG4gIC8vIHRoaXJkLXBhcnR5IHRvb2wgaXMgbmV3ZXIgdGhhbiB0aGUgbmV3ZXN0IHJlbGVhc2UgdGhhdCBjbGVhcmVkIHRoYXQgZ2F0ZSwgcHJlc2VydmluZyB0aGUgcGluXG4gIC8vIHByb2R1Y2VzIGEgcGFja2FnZS5qc29uIHRoYXQgYSBmcmVzaCBpbnN0YWxsIHdpdGhvdXQgdGhlIG9sZCBsb2NrZmlsZSBjYW5ub3QgcmVzb2x2ZSAobm90YWJseVxuICAvLyBvcHRpbWl6ZWQgRG9ja2VyIGJ1aWxkcykuIEtlZXAgdGhlIG5vLWRvd25ncmFkZSBwb2xpY3kgb25seSB3aGVuIHRoZSBkZXBlbmRlbmN5IGlzIGV4ZW1wdCBmcm9tXG4gIC8vIHRoZSBnYXRlOyBhZ2UtZ2F0ZWQgbWFuYWdlZCB0b29scyBtdXN0IGNvbnZlcmdlIG9uIHRoZSB2ZXJzaW9uIHRoZSBnZW5lcmF0ZWQgYnVuZmlnIGFjY2VwdHMuXG4gIGlmIChzaG91bGREb3duZ3JhZGVBZ2VHYXRlZE1hbmFnZWREZXBlbmRlbmN5KGRlcGVuZGVuY3ksIGN1cnJlbnRWZXJzaW9uLCBtYW5hZ2VkVmVyc2lvbikpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvLyB3YmZ5IG93bnMgdGhlc2UgdG9vbCBkZXBlbmRlbmNpZXMsIGJ1dCBhcHBseWluZyB3YmZ5IHNob3VsZCBub3QgZG93bmdyYWRlIGFcbiAgLy8gcmVwb3NpdG9yeSB0aGF0IGFscmVhZHkgcGlucyBhIG5ld2VyIHJldmlld2VkIHJlbGVhc2Ugd2hlbiB0aGUgb3JnIHBvbGljeSBleGVtcHRzIGl0LlxuICByZXR1cm4gaXNOZXdlclBhY2thZ2VWZXJzaW9uKG1hbmFnZWRWZXJzaW9uLCBjdXJyZW50VmVyc2lvbik7XG59XG5cbmZ1bmN0aW9uIHNob3VsZERvd25ncmFkZUFnZUdhdGVkTWFuYWdlZERlcGVuZGVuY3koXG4gIGRlcGVuZGVuY3k6IHN0cmluZyxcbiAgY3VycmVudFZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgbWFuYWdlZFZlcnNpb246IHN0cmluZ1xuKTogY3VycmVudFZlcnNpb24gaXMgc3RyaW5nIHtcbiAgaWYgKCFjdXJyZW50VmVyc2lvbikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCB2YWxpZEN1cnJlbnRWZXJzaW9uID0gc2VtdmVyLnZhbGlkKGN1cnJlbnRWZXJzaW9uKTtcbiAgY29uc3QgdmFsaWRNYW5hZ2VkVmVyc2lvbiA9IHNlbXZlci52YWxpZChtYW5hZ2VkVmVyc2lvbik7XG4gIHJldHVybiAoXG4gICAgc2hvdWxkQXBwbHlQYWNrYWdlQWdlR2F0ZShkZXBlbmRlbmN5KSAmJlxuICAgIHZhbGlkQ3VycmVudFZlcnNpb24gIT09IG51bGwgJiZcbiAgICB2YWxpZE1hbmFnZWRWZXJzaW9uICE9PSBudWxsICYmXG4gICAgc2VtdmVyLmd0KHZhbGlkQ3VycmVudFZlcnNpb24sIHZhbGlkTWFuYWdlZFZlcnNpb24pXG4gICk7XG59XG5cbi8vIFRoZSBuZXdlc3QgVHlwZVNjcmlwdCA2IHJlbGVhc2UgYXQgdGhlIHRpbWUgdGhlIEJsaXR6IGNhcCBzaGlwcGVkOyB1c2VkIG9ubHkgd2hlbiB0aGUgcmVnaXN0cnlcbi8vIGxvb2t1cCBmb3IgdGhlIGFjdHVhbCBuZXdlc3QgcHJlLXY3IHJlbGVhc2UgZmFpbHMgKHNlZSBnZXRNYW5hZ2VkRGVwZW5kZW5jeVZlcnNpb24pLlxuY29uc3QgbGFzdEtub3duUHJlVjdUeXBlc2NyaXB0VmVyc2lvbiA9ICc2LjAuMyc7XG5cbmZ1bmN0aW9uIGdldE1hbmFnZWREZXBlbmRlbmN5VmVyc2lvbihjb25maWc6IFBhY2thZ2VDb25maWcsIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsIGRlcGVuZGVuY3k6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGxhdGVzdFZlcnNpb24gPSBnZXRMYXRlc3REZXBlbmRlbmN5VmVyc2lvbihkZXBlbmRlbmN5KTtcbiAgaWYgKGRlcGVuZGVuY3kgPT09IHR5cGVzY3JpcHREZXBlbmRlbmN5ICYmIGlzQmxpdHpSZXBvc2l0b3J5KGNvbmZpZywgcm9vdENvbmZpZykpIHtcbiAgICAvLyBCbGl0eiBwaW5zIE5leHQuanMgMTUsIHdob3NlIGJ1aWxkLXRpbWUgYHZlcmlmeVR5cGVTY3JpcHRTZXR1cGAgcmVxdWlyZXMgdGhlIGNsYXNzaWNcbiAgICAvLyBgdHlwZXNjcmlwdGAgY29tcGlsZXIgQVBJOyB0aGUgVHlwZVNjcmlwdCA3IGB0eXBlc2NyaXB0YCBwYWNrYWdlIGlzIHRoZSB0c2dvIGJpbmFyeVxuICAgIC8vIHdpdGhvdXQgdGhhdCBBUEksIHNvIGBuZXh0IGJ1aWxkYCBhYm9ydHMgd2l0aCBcIkZhaWxlZCB0byBpbnN0YWxsIHJlcXVpcmVkIFR5cGVTY3JpcHRcbiAgICAvLyBkZXBlbmRlbmNpZXNcIiAob2JzZXJ2ZWQgaW4gV2lsbEJvb3N0ZXIvc3VydmV5LXN5c3RlbSkuIENhcCBgdHlwZXNjcmlwdGAgYmVsb3cgNyB1bnRpbFxuICAgIC8vIEJsaXR6IHN1cHBvcnRzIGEgTmV4dC5qcyByZWxlYXNlIHRoYXQgdW5kZXJzdGFuZHMgdHNnby4gQSBmYWlsZWQgcmVnaXN0cnkgbG9va3VwIG11c3RcbiAgICAvLyByZXNvbHZlIHRvIGEga25vd24tY29tcGF0aWJsZSByZWxlYXNlIOKAlCBmYWxsaW5nIGJhY2sgdG8gbGF0ZXN0VmVyc2lvbiB3b3VsZCByZWluc3RhbGwgdGhlXG4gICAgLy8gaW5jb21wYXRpYmxlIFR5cGVTY3JpcHQgNy5cbiAgICBjb25zdCB2YWxpZExhdGVzdFZlcnNpb24gPSBzZW12ZXIudmFsaWQobGF0ZXN0VmVyc2lvbik7XG4gICAgaWYgKHZhbGlkTGF0ZXN0VmVyc2lvbiAmJiBzZW12ZXIubWFqb3IodmFsaWRMYXRlc3RWZXJzaW9uKSA8IDcpIHJldHVybiBsYXRlc3RWZXJzaW9uO1xuICAgIC8vIFRoZSBjYXBwZWQgbG9va3VwIG11c3QgcmVzcGVjdCB0aGUgYWdlIGdhdGUgdG9vOiB0aGlzIHZlcnNpb24gaXMgd3JpdHRlbiBhcyBhbiBleGFjdCBwaW4sXG4gICAgLy8gYW5kIEJ1biByZWZ1c2VzIHRvIHJlc29sdmUgb25lIHB1Ymxpc2hlZCBpbnNpZGUgdGhlIG1pbmltdW0tcmVsZWFzZS1hZ2Ugd2luZG93LiBUaGVyZSBpcyBub1xuICAgIC8vIHVuZ2F0ZWQgZmFsbGJhY2sg4oCUIHdpdGhvdXQgcHVibGljYXRpb24gbWV0YWRhdGEgdGhlIGFnZSBvZiBhIHJhbmdlIHJlc3VsdCBpcyB1bmtub3duLCBzbyBhXG4gICAgLy8gcGFydGlhbCByZWdpc3RyeSBmYWlsdXJlIHdvdWxkIG90aGVyd2lzZSB3cml0ZSBhIHZlcnNpb24gQnVuIHRoZW4gcmVmdXNlcyB0byBpbnN0YWxsLlxuICAgIHJldHVybiBnZXRMYXRlc3RBZ2VHYXRlZFZlcnNpb25CZWxvdyh0eXBlc2NyaXB0RGVwZW5kZW5jeSwgJzcuMC4wJykgPz8gbGFzdEtub3duUHJlVjdUeXBlc2NyaXB0VmVyc2lvbjtcbiAgfVxuICByZXR1cm4gbGF0ZXN0VmVyc2lvbjtcbn1cblxuLyoqXG4gKiBUaGUgaGlnaGVzdCByZWxlYXNlIG9mIGBwYWNrYWdlTmFtZWAgYmVsb3cgYGV4Y2x1c2l2ZVVwcGVyQm91bmRgIHRoYXQgYWxyZWFkeSBjbGVhcmVkIHRoZSBhZ2VcbiAqIGdhdGUsIG9yIHVuZGVmaW5lZCB3aGVuIHRoZSByZWdpc3RyeSBsb29rdXAgZmFpbHMgb3Igbm8gc3VjaCByZWxlYXNlIGV4aXN0cyB5ZXQuXG4gKi9cbmZ1bmN0aW9uIGdldExhdGVzdEFnZUdhdGVkVmVyc2lvbkJlbG93KHBhY2thZ2VOYW1lOiBzdHJpbmcsIGV4Y2x1c2l2ZVVwcGVyQm91bmQ6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBnZXRBZ2VHYXRlZFZlcnNpb25zRGVzY2VuZGluZyhnZXROcG1QYWNrYWdlVGltZXMocGFja2FnZU5hbWUpKS5maW5kKCh2ZXJzaW9uKSA9PlxuICAgIHNlbXZlci5sdCh2ZXJzaW9uLCBleGNsdXNpdmVVcHBlckJvdW5kKVxuICApO1xufVxuXG5mdW5jdGlvbiBpc05ld2VyUGFja2FnZVZlcnNpb24oY2FuZGlkYXRlVmVyc2lvbjogc3RyaW5nLCBjdXJyZW50VmVyc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHZhbGlkTGF0ZXN0VmVyc2lvbiA9IHNlbXZlci52YWxpZChjYW5kaWRhdGVWZXJzaW9uKTtcbiAgY29uc3QgdmFsaWRDdXJyZW50VmVyc2lvbiA9IHNlbXZlci52YWxpZChjdXJyZW50VmVyc2lvbik7XG4gIHJldHVybiAhdmFsaWRMYXRlc3RWZXJzaW9uIHx8ICF2YWxpZEN1cnJlbnRWZXJzaW9uIHx8IHNlbXZlci5ndCh2YWxpZExhdGVzdFZlcnNpb24sIHZhbGlkQ3VycmVudFZlcnNpb24pO1xufVxuXG5mdW5jdGlvbiBpc1dvcmtzcGFjZVByb3RvY29sUmFuZ2UodmVyc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiB2ZXJzaW9uLnN0YXJ0c1dpdGgoJ3dvcmtzcGFjZTonKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0UmVwb3NpdG9yeUZvclBhY2thZ2VKc29uKFxuICByZXBvc2l0b3J5OiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddLFxuICBleGlzdGluZ1JlcG9zaXRvcnk/OiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddXG4pOiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddIHtcbiAgY29uc3Qgbm9ybWFsaXplZFJlcG9zaXRvcnkgPSBub3JtYWxpemVSZXBvc2l0b3J5VXJsRm9yUGFja2FnZUpzb24ocmVwb3NpdG9yeSk7XG4gIGlmIChub3JtYWxpemVkUmVwb3NpdG9yeSkge1xuICAgIHJldHVybiBidWlsZE5vcm1hbGl6ZWRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24obm9ybWFsaXplZFJlcG9zaXRvcnksIHJlcG9zaXRvcnksIGV4aXN0aW5nUmVwb3NpdG9yeSk7XG4gIH1cblxuICBjb25zdCBub3JtYWxpemVkRXhpc3RpbmdSZXBvc2l0b3J5ID0gbm9ybWFsaXplUmVwb3NpdG9yeVVybEZvclBhY2thZ2VKc29uKGV4aXN0aW5nUmVwb3NpdG9yeSk7XG4gIGlmIChub3JtYWxpemVkRXhpc3RpbmdSZXBvc2l0b3J5KSB7XG4gICAgcmV0dXJuIGJ1aWxkTm9ybWFsaXplZFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbihub3JtYWxpemVkRXhpc3RpbmdSZXBvc2l0b3J5LCBleGlzdGluZ1JlcG9zaXRvcnkpO1xuICB9XG5cbiAgcmV0dXJuIHJlcG9zaXRvcnk7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVJlcG9zaXRvcnlVcmxGb3JQYWNrYWdlSnNvbihyZXBvc2l0b3J5OiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHR5cGVvZiByZXBvc2l0b3J5ID09PSAnc3RyaW5nJykge1xuICAgIGlmICghcmVwb3NpdG9yeS5zdGFydHNXaXRoKCdnaXRodWI6JykpIHJldHVybjtcblxuICAgIGNvbnN0IFtvd25lciwgcmVwb10gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUocmVwb3NpdG9yeSk7XG4gICAgaWYgKCFvd25lciB8fCAhcmVwbykgcmV0dXJuO1xuICAgIHJldHVybiBgZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS8ke293bmVyfS8ke3JlcG99LmdpdGA7XG4gIH1cblxuICBjb25zdCByZXBvc2l0b3J5VXJsID0gcmVwb3NpdG9yeT8udXJsO1xuICBpZiAodHlwZW9mIHJlcG9zaXRvcnlVcmwgIT09ICdzdHJpbmcnKSByZXR1cm47XG5cbiAgY29uc3QgbWF0Y2hlZCA9IC9eKD86Z2l0XFwrKT9odHRwczpcXC9cXC9naXRodWJcXC5jb21cXC8oW14vXSspXFwvKFteL10rPykoPzpcXC5naXQpPyQvdS5leGVjKHJlcG9zaXRvcnlVcmwpO1xuICBpZiAoIW1hdGNoZWQpIHJldHVybjtcblxuICBjb25zdCBbLCBvd25lciwgcmVwb10gPSBtYXRjaGVkO1xuICByZXR1cm4gYGdpdCtodHRwczovL2dpdGh1Yi5jb20vJHtvd25lcn0vJHtyZXBvfS5naXRgO1xufVxuXG5mdW5jdGlvbiBidWlsZE5vcm1hbGl6ZWRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24oXG4gIG5vcm1hbGl6ZWRVcmw6IHN0cmluZyxcbiAgcmVwb3NpdG9yeTogUGFja2FnZUpzb25bJ3JlcG9zaXRvcnknXSxcbiAgZXhpc3RpbmdSZXBvc2l0b3J5PzogUGFja2FnZUpzb25bJ3JlcG9zaXRvcnknXVxuKTogUGFja2FnZUpzb25bJ3JlcG9zaXRvcnknXSB7XG4gIGNvbnN0IHJlcG9zaXRvcnlPYmogPVxuICAgIHR5cGVvZiByZXBvc2l0b3J5ID09PSAnb2JqZWN0J1xuICAgICAgPyByZXBvc2l0b3J5XG4gICAgICA6IHR5cGVvZiBleGlzdGluZ1JlcG9zaXRvcnkgPT09ICdvYmplY3QnXG4gICAgICAgID8gZXhpc3RpbmdSZXBvc2l0b3J5XG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gIHJldHVybiB7XG4gICAgLi4ucmVwb3NpdG9yeU9iaixcbiAgICB0eXBlOiAnZ2l0JyxcbiAgICB1cmw6IG5vcm1hbGl6ZWRVcmwsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVNjcmlwdHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBvbGRTY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IGhhc1R5cGVjaGVjayA9IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXM7XG4gIGNvbnN0IHNjcmlwdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgLy8gTm8gYC0tYnVuYDogaXRzIG5vZGUtPmJ1biBQQVRIIHNoaW0gbGVha3MgaW50byBldmVyeSBjaGlsZCBwcm9jZXNzIGFuZCBicmVha3MgdG9vbHNcbiAgICAvLyByZXF1aXJpbmcgcmVhbCBOb2RlLmpzIChQbGF5d3JpZ2h0LCB3cmFuZ2xlciwgdmluZXh0KS5cbiAgICBjbGVhbnVwOiAnYnVuIHdiIGxpbnQgLS1maXggLS1mb3JtYXQnLFxuICAgIGZvcm1hdDogYGJ1biB3YiBsaW50IC0tZm9ybWF0YCxcbiAgICBsaW50OiBgYnVuIHdiIGxpbnRgLFxuICAgICdsaW50LWZpeCc6ICdidW4gd2IgbGludCAtLWZpeCcsXG4gICAgdGVzdDogJ2J1biB3YiB0ZXN0JyxcbiAgICB0eXBlY2hlY2s6ICdidW4gd2IgdHlwZWNoZWNrJyxcbiAgICB2ZXJpZnk6ICdidW4gd2IgdmVyaWZ5JyxcbiAgICAndmVyaWZ5LWZ1bGwnOiAnYnVuIHdiIHZlcmlmeSAtLWZ1bGwnLFxuICB9O1xuICBpZiAoY29uZmlnLmlzUm9vdCkge1xuICAgIGFwcGx5VGVzdE9uQ2lTY3JpcHQoc2NyaXB0cywgb2xkU2NyaXB0cyk7XG4gIH1cbiAgYXBwbHlUZXN0U2NyaXB0KGNvbmZpZywgc2NyaXB0cywgb2xkU2NyaXB0cyk7XG4gIGtlZXBHZW5lcmF0ZWRTY3JpcHRXcmFwcGVycyhzY3JpcHRzLCBvbGRTY3JpcHRzLCBbJ3Rlc3QnLCAndmVyaWZ5LWZ1bGwnXSk7XG4gIGFwcGx5RGF0YWJhc2VTY3JpcHRzKGNvbmZpZywgc2NyaXB0cywgb2xkU2NyaXB0cywgYGJ1biAke2dldFdiRGF0YWJhc2VDb21tYW5kKGNvbmZpZyl9YCk7XG4gIGFwcGx5TWlzZVRhc2tTY3JpcHRzKGNvbmZpZywgc2NyaXB0cywgb2xkU2NyaXB0cywgWydidWlsZCcsICdkZXYnLCAnc3RhcnQnLCAndGVzdCcsICd0eXBlY2hlY2snXSk7XG4gIGlmICghaGFzVHlwZWNoZWNrKSB7XG4gICAgZGVsZXRlIHNjcmlwdHMudHlwZWNoZWNrO1xuICB9IGVsc2UgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHlyaWdodCkge1xuICAgIHNjcmlwdHMudHlwZWNoZWNrICs9ICcgJiYgcHlyaWdodCc7XG4gIH1cbiAgcmV0dXJuIHNjcmlwdHM7XG59XG5cbi8vIENJIHdvcmtmbG93cyAoYm90aCB0aGUgcmV1c2FibGUgdGVzdCB3b3JrZmxvdyBhbmQgdGhlIHNlbGYtY29udGFpbmVkIHZhcmlhbnQgZm9yIG5vbi1XaWxsQm9vc3RlclxuLy8gcmVwb3NpdG9yaWVzKSBwcmVmZXIgYHRlc3QvY2lgIG92ZXIgYHRlc3RgLCBzbyBzdGFuZGFyZGl6ZSBpdCBvbiBgd2IgdGVzdC1vbi1jaWAgYXQgdGhlIHJvb3Qg4oCUXG4vLyBgd2IgdGVzdC1vbi1jaWAgYWxyZWFkeSBpdGVyYXRlcyB3b3Jrc3BhY2UgcGFja2FnZXMgaXRzZWxmLlxuZnVuY3Rpb24gYXBwbHlUZXN0T25DaVNjcmlwdChzY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LCBvbGRTY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzKTogdm9pZCB7XG4gIGNvbnN0IG9sZFNjcmlwdCA9IG9sZFNjcmlwdHNbJ3Rlc3QvY2knXTtcbiAgLy8gU29tZSByZXBvc2l0b3JpZXMgd3JhcCBDSSB0ZXN0cyB3aXRoIGV4dHJhIHN0ZXBzIChlLmcuIHNlbGVjdGluZyBzcGVjIGZpbGVzIG9yIHJ1bm5pbmcgcmF3XG4gIC8vIFBsYXl3cmlnaHQpIHRoYXQgd2IgY2Fubm90IGluZmVyIGdlbmVyaWNhbGx5OyBzdWNoIHdyYXBwZXJzIGFyZSBwcmVzZXJ2ZWQuXG4gIHNjcmlwdHNbJ3Rlc3QvY2knXSA9IG9sZFNjcmlwdCAmJiAhaXNHZW5lcmF0ZWRUZXN0T25DaVNjcmlwdChvbGRTY3JpcHQpID8gb2xkU2NyaXB0IDogJ2J1biB3YiB0ZXN0LW9uLWNpJztcbn1cblxuLyoqIFdoZXRoZXIgYSBzY3JpcHQgYm9keSBpcyBvbmUgb2YgdGhlIGdlbmVyYXRlZCBgd2IgdGVzdC1vbi1jaWAgaW52b2NhdGlvbnMuICovXG5mdW5jdGlvbiBpc0dlbmVyYXRlZFRlc3RPbkNpU2NyaXB0KHNjcmlwdDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBzY3JpcHQudHJpbSgpID09PSAnYnVuIHdiIHRlc3Qtb24tY2knO1xufVxuXG4vKipcbiAqIGB3YiB0ZXN0YCBydW5zIEphdmFTY3JpcHQvVHlwZVNjcmlwdCB0ZXN0IHJ1bm5lcnMgb25seSwgc28gcmVwbGFjaW5nIHRoZSBgdGVzdGAgc2NyaXB0IG9mIGFcbiAqIHBhY2thZ2Ugd3JpdHRlbiBpbiBhbm90aGVyIGxhbmd1YWdlIChlLmcuIGEgTWF2ZW4gb3IgYW4gUlNwZWMgcGFja2FnZSBpbiBhIHBvbHlnbG90IG1vbm9yZXBvKVxuICogc2lsZW50bHkgZHJvcHMgaXRzIHdob2xlIHN1aXRlOiB0aGUgZ2VuZXJhdGVkIHNjcmlwdCB0aGVuIHN1Y2NlZWRzIHdpdGhvdXQgcnVubmluZyBhbnl0aGluZy5cbiAqIFN1Y2ggYSBwYWNrYWdlIGtlZXBzIGl0cyBvd24gYHRlc3RgIHNjcmlwdDsgSlMvVFMgcGFja2FnZXMgYXJlIHN0YW5kYXJkaXplZCBhcyB1c3VhbC5cbiAqL1xuZnVuY3Rpb24gYXBwbHlUZXN0U2NyaXB0KFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHNjcmlwdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIG9sZFNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHNcbik6IHZvaWQge1xuICBjb25zdCBvbGRTY3JpcHQgPSBvbGRTY3JpcHRzLnRlc3Q/LnRyaW0oKTtcbiAgaWYgKCFvbGRTY3JpcHQgfHwgZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKSB8fCBpc0dlbmVyYXRlZFRlc3RTY3JpcHQob2xkU2NyaXB0KSkgcmV0dXJuO1xuICBzY3JpcHRzLnRlc3QgPSBvbGRTY3JpcHQ7XG59XG5cbi8qKiBXaGV0aGVyIGEgc2NyaXB0IGJvZHkgaXMgb25lIG9mIHRoZSBLTk9XTiBnZW5lcmF0ZWQgYHdiIHRlc3RgIGludm9jYXRpb25zLiAqL1xuZnVuY3Rpb24gaXNHZW5lcmF0ZWRUZXN0U2NyaXB0KHNjcmlwdDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBzY3JpcHQudHJpbSgpID09PSAnYnVuIHdiIHRlc3QnO1xufVxuXG4vKipcbiAqIEtlZXBzIGEgc2NyaXB0IHRoYXQgQ0hBSU5TIGV4dHJhIGNvbW1hbmRzIG9udG8gdGhlIGdlbmVyYXRlZCBvbmUgKGUuZy4gYSBwb2x5Z2xvdCBtb25vcmVwb1xuICogYXBwZW5kaW5nIGl0cyBNYXZlbiBhbmQgUlNwZWMgc3VpdGVzIHRvIGB3YiB0ZXN0YCwgd2hpY2ggcnVucyBKYXZhU2NyaXB0L1R5cGVTY3JpcHQgcnVubmVyc1xuICogb25seSkuIFN1Y2ggYSB3cmFwcGVyIHN0aWxsIHJ1bnMgdGhlIGdlbmVyYXRlZCBjb21tYW5kLCBzbyByZXBsYWNpbmcgaXQgd291bGQgc2lsZW50bHkgZHJvcCB0aGVcbiAqIHJlcG9zaXRvcnkncyBvd24gc3RlcHMg4oCUIHRoZSBzYW1lIHJlYXNvbmluZyBhcyBgYXBwbHlUZXN0T25DaVNjcmlwdGAuIEFuIHVucmVjb2duaXplZCBjaGFpbmVkXG4gKiBzY3JpcHQgaXMga2VwdCB3aG9sZXNhbGUgcmF0aGVyIHRoYW4gbG9zaW5nIGl0cyBwcm9qZWN0LW93bmVkIGNvbW1hbmRzLlxuICovXG5mdW5jdGlvbiBrZWVwR2VuZXJhdGVkU2NyaXB0V3JhcHBlcnMoXG4gIHNjcmlwdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIG9sZFNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMsXG4gIHNjcmlwdE5hbWVzOiBzdHJpbmdbXVxuKTogdm9pZCB7XG4gIGZvciAoY29uc3Qgc2NyaXB0TmFtZSBvZiBzY3JpcHROYW1lcykge1xuICAgIGNvbnN0IG9sZFNjcmlwdCA9IG9sZFNjcmlwdHNbc2NyaXB0TmFtZV0/LnRyaW0oKTtcbiAgICBjb25zdCBnZW5lcmF0ZWRTY3JpcHQgPSBzY3JpcHRzW3NjcmlwdE5hbWVdO1xuICAgIGlmICghb2xkU2NyaXB0IHx8ICFnZW5lcmF0ZWRTY3JpcHQgfHwgb2xkU2NyaXB0ID09PSBnZW5lcmF0ZWRTY3JpcHQpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGhlYWRSZWdFeHAgPSBuZXcgUmVnRXhwKFxuICAgICAgYF4ke2VzY2FwZVJlZ0V4cChnZW5lcmF0ZWRTY3JpcHQpLnJlcGxhY2VBbGwoJyAnLCBTdHJpbmcucmF3YFsgXFx0XStgKX0oPz1bIFxcXFx0XSooPzomJnxcXFxcfFxcXFx8fDt8XFxcXG4pKWAsXG4gICAgICAndSdcbiAgICApO1xuICAgIC8vIEEgbmV3bGluZSBzZXBhcmF0ZXMgc2hlbGwgY29tbWFuZHMganVzdCBsaWtlICYmLCB8fCBhbmQgOy5cbiAgICBpZiAoaGVhZFJlZ0V4cC50ZXN0KG9sZFNjcmlwdCkpIHtcbiAgICAgIC8vIEEgZnVuY3Rpb24gcmVwbGFjZW1lbnQga2VlcHMgYCRgLXNoYXBlZCBjaGFyYWN0ZXJzIGluIHRoZSBnZW5lcmF0ZWQgY29tbWFuZCBsaXRlcmFsLlxuICAgICAgc2NyaXB0c1tzY3JpcHROYW1lXSA9IG9sZFNjcmlwdC5yZXBsYWNlKGhlYWRSZWdFeHAsICgpID0+IGdlbmVyYXRlZFNjcmlwdCk7XG4gICAgfSBlbHNlIGlmICgvKD86JiZ8XFx8XFx8fDt8XFxuKS91LnRlc3Qob2xkU2NyaXB0KSkge1xuICAgICAgc2NyaXB0c1tzY3JpcHROYW1lXSA9IG9sZFNjcmlwdDtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYXBwbHlEYXRhYmFzZVNjcmlwdHMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgb2xkU2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cyxcbiAgd2JEYkNvbW1hbmQ6IHN0cmluZ1xuKTogdm9pZCB7XG4gIGlmICghY29uZmlnLmRlcGVuZGluZy5wcmlzbWEgJiYgIWNvbmZpZy5kZXBlbmRpbmcuZHJpenpsZSkgcmV0dXJuO1xuXG4gIGFwcGx5RGF0YWJhc2VTY3JpcHQoc2NyaXB0cywgb2xkU2NyaXB0cywgJ2RiLWNyZWF0ZS1taWdyYXRpb24nLCBgJHt3YkRiQ29tbWFuZH0gbWlncmF0ZS1kZXZgLCAnbWlncmF0ZS1kZXYnKTtcbiAgYXBwbHlEYXRhYmFzZVNjcmlwdChcbiAgICBzY3JpcHRzLFxuICAgIG9sZFNjcmlwdHMsXG4gICAgJ2RiLW1pZ3JhdGUnLFxuICAgIGAke3diRGJDb21tYW5kfSBtaWdyYXRlIC0tY2hlY2staWRlbXBvdGVuY3lgLFxuICAgICdtaWdyYXRlIC0tY2hlY2staWRlbXBvdGVuY3knXG4gICk7XG4gIGFwcGx5RGF0YWJhc2VTY3JpcHQoc2NyaXB0cywgb2xkU2NyaXB0cywgJ2RiLXZpZXcnLCBgJHt3YkRiQ29tbWFuZH0gc3R1ZGlvYCwgJ3N0dWRpbycpO1xufVxuXG5mdW5jdGlvbiBhcHBseURhdGFiYXNlU2NyaXB0KFxuICBzY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBvbGRTY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzLFxuICBuYW1lOiBzdHJpbmcsXG4gIGdlbmVyYXRlZFNjcmlwdDogc3RyaW5nLFxuICBnZW5lcmF0ZWRBcmd1bWVudHM6IHN0cmluZ1xuKTogdm9pZCB7XG4gIGNvbnN0IG9sZFNjcmlwdCA9IG9sZFNjcmlwdHNbbmFtZV07XG4gIC8vIFNvbWUgcmVwb3NpdG9yaWVzIHdyYXAgbWlncmF0aW9uIGNvbW1hbmRzIHRvIHByZXBhcmUgU1FMaXRlIGRpcmVjdG9yaWVzLFxuICAvLyBmYW4gb3V0IG92ZXIgdGVuYW50cywgb3IgcGVyZm9ybSBjbGVhbnVwIHRoYXQgd2IgY2Fubm90IGluZmVyIGdlbmVyaWNhbGx5LlxuICBjb25zdCBnZW5lcmF0ZWRCb2RpZXMgPSBbYGJ1biB3YiBkYiAke2dlbmVyYXRlZEFyZ3VtZW50c31gLCBgYnVuIHdiIHByaXNtYSAke2dlbmVyYXRlZEFyZ3VtZW50c31gXTtcbiAgc2NyaXB0c1tuYW1lXSA9IG9sZFNjcmlwdCAmJiAhZ2VuZXJhdGVkQm9kaWVzLmluY2x1ZGVzKG9sZFNjcmlwdC50cmltKCkpID8gb2xkU2NyaXB0IDogZ2VuZXJhdGVkU2NyaXB0O1xufVxuXG5mdW5jdGlvbiBnZXRXYkRhdGFiYXNlQ29tbWFuZChjb25maWc6IFBhY2thZ2VDb25maWcpOiAnd2IgZGInIHwgJ3diIHByaXNtYScge1xuICBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEpIHJldHVybiAnd2IgcHJpc21hJztcbiAgcmV0dXJuICd3YiBkYic7XG59XG5cbmZ1bmN0aW9uIGlzV2JQYWNrYWdlKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gcGFja2FnZUpzb24/Lm5hbWUgPT09IHdiRGVwZW5kZW5jeTtcbn1cblxuZnVuY3Rpb24gYXBwbHlNaXNlVGFza1NjcmlwdHMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgb2xkU2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cyxcbiAgbmFtZXM6IHN0cmluZ1tdXG4pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7XG4gICAgaWYgKCFoYXNNaXNlVGFzayhjb25maWcsIG5hbWUpKSBjb250aW51ZTtcbiAgICBpZiAoZG9lc01pc2VUYXNrQ2FsbFBhY2thZ2VTY3JpcHQoY29uZmlnLCBuYW1lKSkgY29udGludWU7XG4gICAgLy8gUHJlc2VydmUgYSBsZWFkaW5nIGBLRVk9VkFMVUUgYCBlbnYgcHJlZml4IChlLmcuIGBNSVNFX0VOVj10ZXN0YCkgb24gYW4gZXhpc3RpbmcgbWlzZSBicmlkZ2UuXG4gICAgLy8gU3VjaCBhIHByZWZpeCBpcyByZXF1aXJlZCBmb3IgbWlzZSBjb25maWcgZW52aXJvbm1lbnRzIChtaXNlLjxNSVNFX0VOVj4udG9tbCksIHdoaWNoIGFyZVxuICAgIC8vIHNlbGVjdGVkIGZyb20gTUlTRV9FTlYgKmJlZm9yZSogbWlzZSBzdGFydHMgYW5kIGNhbm5vdCBiZSBzd2l0Y2hlZCBmcm9tIGluc2lkZSBhIHRhc2s7IGRyb3BwaW5nXG4gICAgLy8gaXQgd291bGQgc2lsZW50bHkgcnVuIHRoZSB0YXNrIGluIHRoZSBkZWZhdWx0IGVudmlyb25tZW50LlxuICAgIGNvbnN0IGVudlByZWZpeCA9IGV4dHJhY3RNaXNlQnJpZGdlRW52UHJlZml4KG9sZFNjcmlwdHNbbmFtZV0sIG5hbWUpO1xuICAgIGlmIChlbnZQcmVmaXggPT09IHVuZGVmaW5lZCAmJiBvbGRTY3JpcHRzW25hbWVdICYmICEobmFtZSBpbiBzY3JpcHRzKSkgY29udGludWU7XG4gICAgc2NyaXB0c1tuYW1lXSA9IGAke2VudlByZWZpeCA/PyAnJ31taXNlIHJ1biAke25hbWV9YDtcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGxlYWRpbmcgYEtFWT1WQUxVRSBgIGVudi12YXIgcHJlZml4IG9mIGFuIGV4aXN0aW5nIGBtaXNlIHJ1biA8bmFtZT5gIGJyaWRnZSBzY3JpcHRcbiAqIChwb3NzaWJseSBhbiBlbXB0eSBzdHJpbmcgd2hlbiB0aGUgYnJpZGdlIGhhcyBubyBwcmVmaXgpLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZSBzY3JpcHQgaXMgbm90IGFcbiAqIG1pc2UgYnJpZGdlIGZvciB0aGUgZ2l2ZW4gdGFzay5cbiAqL1xuZnVuY3Rpb24gZXh0cmFjdE1pc2VCcmlkZ2VFbnZQcmVmaXgoc2NyaXB0OiB1bmtub3duLCBuYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAodHlwZW9mIHNjcmlwdCAhPT0gJ3N0cmluZycpIHJldHVybiB1bmRlZmluZWQ7XG4gIC8vIEVhY2ggYXNzaWdubWVudCB2YWx1ZSBtYXkgYmUgZG91YmxlLXF1b3RlZCwgc2luZ2xlLXF1b3RlZCwgb3IgYW4gdW5xdW90ZWQgcnVuIG9mIG5vbi13aGl0ZXNwYWNlLFxuICAvLyBzbyBwcmVmaXhlcyBsaWtlIGBNSVNFX0VOVj1cImEgYlwiYCAod2hvc2UgdmFsdWUgY29udGFpbnMgc3BhY2VzKSBhcmUgbWF0Y2hlZCBpbnN0ZWFkIG9mIGRyb3BwZWQuXG4gIGNvbnN0IG1hdGNoID0gbmV3IFJlZ0V4cChTdHJpbmcucmF3YF4oKD86XFx3Kz0oPzpcIlteXCJdKlwifCdbXiddKid8XFxTKylcXHMrKSopbWlzZSBydW4gJHtlc2NhcGVSZWdFeHAobmFtZSl9JGAsICd1JykuZXhlYyhcbiAgICBzY3JpcHQudHJpbSgpXG4gICk7XG4gIHJldHVybiBtYXRjaD8uWzFdO1xufVxuXG5mdW5jdGlvbiBoYXNNaXNlVGFzayhjb25maWc6IFBhY2thZ2VDb25maWcsIG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gT2JqZWN0Lmhhc093bihjb25maWcubWlzZVRhc2tzLCBuYW1lKTtcbn1cblxuZnVuY3Rpb24gZG9lc01pc2VUYXNrQ2FsbFBhY2thZ2VTY3JpcHQoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgdGFzayA9IGNvbmZpZy5taXNlVGFza3NbbmFtZV07XG4gIGlmICghdGFzaykgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBwYWNrYWdlTWFuYWdlcnMgPSBbJ2J1bicsICd5YXJuJywgJ25wbScsICdwbnBtJ107XG4gIHJldHVybiBwYWNrYWdlTWFuYWdlcnMuc29tZSgocGFja2FnZU1hbmFnZXIpID0+XG4gICAgbmV3IFJlZ0V4cChTdHJpbmcucmF3YFxcYiR7cGFja2FnZU1hbmFnZXJ9XFxzKyg/OnJ1blxccyspPyR7ZXNjYXBlUmVnRXhwKG5hbWUpfSg/IVthLXpBLVowLTlfXFwtOi5dKWAsICd1JykudGVzdCh0YXNrKVxuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVQcml2YXRlUGFja2FnZXMoanNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwYWNrYWdlTmFtZXMgPSBuZXcgU2V0KFsuLi5PYmplY3Qua2V5cyhqc29uT2JqLmRlcGVuZGVuY2llcyksIC4uLk9iamVjdC5rZXlzKGpzb25PYmouZGV2RGVwZW5kZW5jaWVzKV0pO1xuICBjb25zdCBwcml2YXRlUGFja2FnZXM6IHtcbiAgICBwYWNrYWdlTmFtZTogc3RyaW5nO1xuICAgIG9yZzogc3RyaW5nO1xuICAgIHJlcG86IHN0cmluZztcbiAgICB0YXJnZXQ6ICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcyc7XG4gIH1bXSA9IFtcbiAgICB7IHBhY2thZ2VOYW1lOiAnQHdpbGxib29zdGVyL2NvZGUtYW5hbHl6ZXInLCBvcmc6ICdXaWxsQm9vc3RlcicsIHJlcG86ICdjb2RlLWFuYWx5emVyJywgdGFyZ2V0OiAnZGV2RGVwZW5kZW5jaWVzJyB9LFxuICAgIHsgcGFja2FnZU5hbWU6ICdAd2lsbGJvb3N0ZXIvanVkZ2UnLCBvcmc6ICdXaWxsQm9vc3RlckxhYicsIHJlcG86ICdqdWRnZScsIHRhcmdldDogJ2RlcGVuZGVuY2llcycgfSxcbiAgICB7IHBhY2thZ2VOYW1lOiAnQHdpbGxib29zdGVyL2xsbS1wcm94eScsIG9yZzogJ1dpbGxCb29zdGVyTGFiJywgcmVwbzogJ2xsbS1wcm94eScsIHRhcmdldDogJ2RlcGVuZGVuY2llcycgfSxcbiAgXTtcblxuICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICBwcml2YXRlUGFja2FnZXMubWFwKGFzeW5jICh7IG9yZywgcGFja2FnZU5hbWUsIHJlcG8sIHRhcmdldCB9KSA9PiB7XG4gICAgICBpZiAoIXBhY2thZ2VOYW1lcy5oYXMocGFja2FnZU5hbWUpIHx8IGlzV29ya3NwYWNlUGFja2FnZShqc29uT2JqLCBwYWNrYWdlTmFtZSkpIHJldHVybjtcblxuICAgICAgY29uc3QgZXhpc3RpbmdTcGVjaWZpZXIgPSBqc29uT2JqLmRlcGVuZGVuY2llc1twYWNrYWdlTmFtZV0gPz8ganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbcGFja2FnZU5hbWVdO1xuICAgICAgY29uc3Qgb3RoZXJUYXJnZXQgPSB0YXJnZXQgPT09ICdkZXBlbmRlbmNpZXMnID8gJ2RldkRlcGVuZGVuY2llcycgOiAnZGVwZW5kZW5jaWVzJztcbiAgICAgIC8vIFRoZSBsaW50IHJ1bGUgZGlzYWxsb3dzIGBkZWxldGVgIHdpdGggY29tcHV0ZWQgcGFja2FnZSBuYW1lczsgUmVmbGVjdCBoYXMgdGhlIHNhbWUgZGVsZXRpb24gc2VtYW50aWNzIGhlcmUuXG4gICAgICBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KGpzb25PYmpbb3RoZXJUYXJnZXRdLCBwYWNrYWdlTmFtZSk7XG4gICAgICBqc29uT2JqW3RhcmdldF1bcGFja2FnZU5hbWVdID0gaXNQaW5uZWRQcml2YXRlUGFja2FnZVNwZWNpZmllcihleGlzdGluZ1NwZWNpZmllciwgb3JnLCByZXBvKVxuICAgICAgICA/IGV4aXN0aW5nU3BlY2lmaWVyXG4gICAgICAgIDogYXdhaXQgZ2V0TGF0ZXN0UHJpdmF0ZVBhY2thZ2VTcGVjaWZpZXIob3JnLCByZXBvKTtcbiAgICB9KVxuICApO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIGV4aXN0aW5nIHNwZWNpZmllciBhbHJlYWR5IHBpbnMgYSBnaXQgcmVmIG9mIHRoZSBleHBlY3RlZCBwcml2YXRlIHJlcG9zaXRvcnkuXG4gKiB3YmZ5IG11c3Qgbm90IGJ1bXAgc3VjaCBwaW5zOiBhIHJ1biBpbnRlbmRlZCBhcyBjb25maWd1cmF0aW9uL3BhY2thZ2UtbWFuYWdlciBtYWludGVuYW5jZVxuICogd291bGQgb3RoZXJ3aXNlIGNoYW5nZSB0aGUgZGVwZW5kZW5jeSdzIHZlcnNpb24gYXMgYSBzaWRlIGVmZmVjdCAodXBkYXRpbmcgcGlucyBpcyBSZW5vdmF0ZSdzXG4gKiBqb2IpLCBwb3NzaWJseSB0byBhIGNvbW1pdCB3aG9zZSBwcmVidWlsdCBhcnRpZmFjdHMgYXJlIG1pc3NpbmcuXG4gKi9cbmZ1bmN0aW9uIGlzUGlubmVkUHJpdmF0ZVBhY2thZ2VTcGVjaWZpZXIoXG4gIHNwZWNpZmllcjogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBvcmc6IHN0cmluZyxcbiAgcmVwbzogc3RyaW5nXG4pOiBzcGVjaWZpZXIgaXMgc3RyaW5nIHtcbiAgaWYgKCFzcGVjaWZpZXIpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIG5ldyBSZWdFeHAoU3RyaW5nLnJhd2AoPzpefFs6L10pJHtvcmd9LyR7cmVwb30oPzpcXC5naXQpPyNcXFMrJGAsICd1JykudGVzdChzcGVjaWZpZXIpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRMYXRlc3RQcml2YXRlUGFja2FnZVNwZWNpZmllcihvcmc6IHN0cmluZywgcmVwbzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgY29tbWl0SGFzaCA9IGF3YWl0IGdldExhdGVzdENvbW1pdEhhc2gob3JnLCByZXBvKTtcbiAgcmV0dXJuIGBnaXRAZ2l0aHViLmNvbToke29yZ30vJHtyZXBvfS5naXQjJHtjb21taXRIYXNofWA7XG59XG5cbmZ1bmN0aW9uIGlzV29ya3NwYWNlUGFja2FnZShqc29uT2JqOiBQYWNrYWdlSnNvbiwgcGFja2FnZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gKGpzb25PYmouZGV2RGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdIHx8IGpzb25PYmouZGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdIHx8ICcnKS5pbmNsdWRlcygnd29ya3NwYWNlJyk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBxdW90ZUZvclNoZWxsIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWIvc3JjJztcbmltcG9ydCAqIGFzIHlhbWwgZnJvbSAnanMteWFtbCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBnZXRHZW5JMThuVHNDb21tYW5kIH0gZnJvbSAnLi4vdXRpbHMvZ2VuSTE4blRzLmpzJztcbmltcG9ydCB7IGRvZXNDb250YWluSmF2YSwgZG9lc0NvbnRhaW5Kc09yVHMgfSBmcm9tICcuLi91dGlscy9wYWNrYWdlQ2FwYWJpbGl0aWVzLmpzJztcblxuaW1wb3J0IHsgZ2VuZXJhdGVTY3JpcHRzIH0gZnJvbSAnLi9wYWNrYWdlSnNvbi5qcyc7XG5cbmludGVyZmFjZSBMZWZ0aG9va1NldHRpbmdzIHtcbiAgZ2xvYl9tYXRjaGVyOiAnZG91Ymxlc3Rhcic7XG4gICdwb3N0LW1lcmdlJzoge1xuICAgIGpvYnM6IExlZnRob29rSm9iW107XG4gIH07XG4gICdwcmUtY29tbWl0Jzoge1xuICAgIGpvYnM6IExlZnRob29rSm9iW107XG4gIH07XG4gICdwcmUtcHVzaCc6IHtcbiAgICBqb2JzOiBMZWZ0aG9va0pvYltdO1xuICB9O1xufVxuXG5pbnRlcmZhY2UgTGVmdGhvb2tKb2Ige1xuICBuYW1lOiBzdHJpbmc7XG4gIGdsb2I/OiBzdHJpbmc7XG4gIHJ1bj86IHN0cmluZztcbiAgc2NyaXB0Pzogc3RyaW5nO1xuICBydW5uZXI/OiAnYmFzaCc7XG4gIHN0YWdlX2ZpeGVkPzogdHJ1ZTtcbn1cblxuY29uc3QgYmFzZVNldHRpbmdzOiBPbWl0PExlZnRob29rU2V0dGluZ3MsICdwcmUtY29tbWl0Jz4gPSB7XG4gIGdsb2JfbWF0Y2hlcjogJ2RvdWJsZXN0YXInLFxuICAncG9zdC1tZXJnZSc6IHtcbiAgICBqb2JzOiBbXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdwcmVwYXJlJyxcbiAgICAgICAgc2NyaXB0OiAncHJlcGFyZS5zaCcsXG4gICAgICAgIHJ1bm5lcjogJ2Jhc2gnLFxuICAgICAgfSxcbiAgICBdLFxuICB9LFxuICAncHJlLXB1c2gnOiB7XG4gICAgam9iczogW1xuICAgICAge1xuICAgICAgICBuYW1lOiAnY2hlY2snLFxuICAgICAgICBzY3JpcHQ6ICdjaGVjay5zaCcsXG4gICAgICAgIHJ1bm5lcjogJ2Jhc2gnLFxuICAgICAgfSxcbiAgICBdLFxuICB9LFxufTtcblxuLy8gTGVmdGhvb2sgZXhwYW5kcyB7c3RhZ2VkX2ZpbGVzfSBhcyBzaGVsbC1lc2NhcGVkIGFyZ3MsIHNvIHRoZSB1bnF1b3RlZCBsb29wcyBiZWxvdyBrZWVwIHBhdGhzXG4vLyB3aXRoIHNwYWNlcyBpbnRhY3QuXG5jb25zdCBwcmVDb21taXRTZXR0aW5nczogTGVmdGhvb2tTZXR0aW5nc1sncHJlLWNvbW1pdCddID0ge1xuICBqb2JzOiBbXG4gICAge1xuICAgICAgbmFtZTogJ2NsZWFudXAnLFxuICAgICAgZ2xvYjogJycsXG4gICAgICBydW46ICcnLFxuICAgICAgc3RhZ2VfZml4ZWQ6IHRydWUsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnY2hlY2stbWlncmF0aW9ucycsXG4gICAgICBnbG9iOiAnKiovbWlncmF0aW9uLnNxbCcsXG4gICAgICBydW46IGBcbmZhaWxlZD0wXG5mb3IgZmlsZSBpbiB7c3RhZ2VkX2ZpbGVzfTsgZG9cbiAgaWYgZ3JlcCAtcSAnV2FybmluZ3M6JyBcIiRmaWxlXCI7IHRoZW5cbiAgICBlY2hvIFwiTWlncmF0aW9uIFNRTCBmaWxlICgkZmlsZSkgY29udGFpbnMgd2FybmluZ3MhIFBsZWFzZSBzb2x2ZSB0aGUgd2FybmluZ3MgYW5kIGNvbW1pdCBhZ2Fpbi5cIlxuICAgIGZhaWxlZD0xXG4gIGZpXG5kb25lXG5leGl0IFwiJGZhaWxlZFwiXG5gLnRyaW0oKSxcbiAgICB9LFxuICAgIHtcbiAgICAgIC8vIGJ1biByZWNvcmRzIGFuIGFic29sdXRlIGByZXNvbHZlZGAgVVJMIGZvciBhbiBhbHJlYWR5LWxvY2tlZCBwYWNrYWdlIHdoZW5ldmVyIHRoZVxuICAgICAgLy8gY29uZmlndXJlZCByZWdpc3RyeSBkb2VzIG5vdCBzZXJ2ZSB0aGUgdGFyYmFsbCBob3N0IGluIHRoZSBwYWNrYWdlIG1ldGFkYXRhIOKAlCB3aGljaCBpc1xuICAgICAgLy8gZXhhY3RseSB3aGF0IHRoZSBUYWt1bWkgR3VhcmQgcHJveHkgZG9lcy4gU28gYW4gaW5zdGFsbCBydW4gd2l0aCBHdWFyZCBhcyB0aGUgZGVmYXVsdFxuICAgICAgLy8gcmVnaXN0cnkgKENJLCBvciBhIGRldmVsb3BlciB3aG8gcHV0IGl0IGluIH4vLm5wbXJjKSBiYWtlcyBucG0uZmxhdHQudGVjaCBVUkxzIGludG9cbiAgICAgIC8vIGJ1bi5sb2NrLCBhbmQgY29tbWl0dGluZyB0aGVtIHBpbnMgYSBTSEFSRUQgbG9ja2ZpbGUgdG8gb25lIGVudmlyb25tZW50J3MgbWlycm9yOiBldmVyeVxuICAgICAgLy8gbGF0ZXIgaW5zdGFsbCBkb3dubG9hZHMgdGhyb3VnaCB0aGUgcHJveHksIGFuZCBhIGNvbGQtY2FjaGUgaW5zdGFsbCBmYWlscyBvdXRyaWdodCB3aXRoXG4gICAgICAvLyA0MDEgZm9yIGFueW9uZSB3aG9zZSBucG1yYyBjYXJyaWVzIGEgcmVnaXN0cnkubnBtanMub3JnIHRva2VuLCBiZWNhdXNlIGJ1biBzZW5kcyB0aGVcbiAgICAgIC8vIGRlZmF1bHQgcmVnaXN0cnkncyBjcmVkZW50aWFscyB0byB3aGF0ZXZlciBob3N0IHRoZSBsb2NrZmlsZSBuYW1lcy4gR3VhcmQgY292ZXJhZ2UgZG9lc1xuICAgICAgLy8gbm90IGRlcGVuZCBvbiB0aGVzZSBVUkxzIOKAlCB3aXRoIGFuIGVtcHR5IGByZXNvbHZlZGAsIGJ1biBkZXJpdmVzIHRoZSBkb3dubG9hZCBVUkwgZnJvbVxuICAgICAgLy8gdGhlIGNvbmZpZ3VyZWQgcmVnaXN0cnkg4oCUIHNvIHN0cmlwIHRoZW0uIE9ubHkgdGhlIEd1YXJkIGhvc3QgaXMgc3RyaXBwZWQ6IGEgc2NvcGVkXG4gICAgICAvLyByZWdpc3RyeSBzdWNoIGFzIFZlcmRhY2NpbyBsZWdpdGltYXRlbHkgcmVjb3JkcyBpdHMgb3duIFVSTCBmb3IgcHJpdmF0ZSBwYWNrYWdlcy5cbiAgICAgIG5hbWU6ICdub3JtYWxpemUtYnVuLWxvY2tmaWxlJyxcbiAgICAgIGdsb2I6ICdidW4ubG9jaycsXG4gICAgICBydW46ICdiYXNoIC5sZWZ0aG9vay9ub3JtYWxpemUtYnVuLWxvY2tmaWxlLnNoIHtzdGFnZWRfZmlsZXN9JyxcbiAgICAgIHN0YWdlX2ZpeGVkOiB0cnVlLFxuICAgIH0sXG4gICAge1xuICAgICAgLy8gT25seSB3aWxsYm9vc3Rlci1jb25maWdzIGdldHMgdGhpcyBqb2I6IGV2ZXJ5IG90aGVyIHJlcG9zaXRvcnkncyByZW5vdmF0ZS5qc29uYyBtZXJlbHlcbiAgICAgIC8vIGV4dGVuZHMgdGhlIHNoYXJlZCBwcmVzZXQsIGFuZCB0aGUgdmFsaWRhdG9yIGRvZXMgbm90IHJlc29sdmUgcmVtb3RlIHByZXNldHMsIHNvIHJ1bm5pbmcgaXRcbiAgICAgIC8vIHRoZXJlIHdvdWxkIHZhbGlkYXRlIHR3byBsaW5lcyBhbmQgY2F0Y2ggbm90aGluZy4gYC0tbm8tZ2xvYmFsYCB2YWxpZGF0ZXMgdGhlIHByZXNldCBhcyBhXG4gICAgICAvLyByZXBvIGNvbmZpZyBpbnN0ZWFkIG9mIGEgc2VsZi1ob3N0ZWQgZ2xvYmFsIGNvbmZpZywgYW5kIGBAbGF0ZXN0YCBrZWVwcyBucG0gZnJvbSBzaWxlbnRseVxuICAgICAgLy8gaW5zdGFsbGluZyBhbiBhbmNpZW50IFJlbm92YXRlIHRoYXQgY2Fubm90IGV2ZW4gcGFyc2UgSlNPTkMgd2hlbiB0aGUgbG9jYWwgTm9kZSBsYWdzIGJlaGluZC5cbiAgICAgIC8vIFN0YWdpbmcgYSBkZWxldGlvbiBvZiByZW5vdmF0ZS5qc29uYyBsZWF2ZXMgbm8gZmlsZSBmb3IgaW5zcGVjdGlvbiwgc28gTGVmdGhvb2sgc2tpcHMgdGhpc1xuICAgICAgLy8gam9iIGluc3RlYWQgb2YgcnVubmluZyB0aGUgdmFsaWRhdG9yIG9uIGEgbWlzc2luZyBwYXRoIOKAlCBkZWxpYmVyYXRlbHksIGJlY2F1c2UgZGVsZXRpbmcgdGhlXG4gICAgICAvLyBzaGFyZWQgcHJlc2V0IGlzIG5vdCBhbiBvcGVyYXRpb24gdGhpcyBob29rIG5lZWRzIHRvIGd1YXJkLlxuICAgICAgbmFtZTogJ3ZhbGlkYXRlLXJlbm92YXRlLWNvbmZpZycsXG4gICAgICBnbG9iOiAncmVub3ZhdGUuanNvbmMnLFxuICAgICAgcnVuOiAnbnB4IC0teWVzIC0tcGFja2FnZSByZW5vdmF0ZUBsYXRlc3QgLS0gcmVub3ZhdGUtY29uZmlnLXZhbGlkYXRvciAtLXN0cmljdCAtLW5vLWdsb2JhbCB7c3RhZ2VkX2ZpbGVzfScsXG4gICAgfSxcbiAgXSxcbn07XG5cbmNvbnN0IHNjcmlwdHMgPSB7XG4gIC8vIHByZXBhcmUgY2FsbHMgdGhpcyB3aXRob3V0IGFyZ3VtZW50cyBhZnRlciBCdW4gc2F2ZXMgdGhlIHJvb3QgbG9ja2ZpbGU7IExlZnRob29rIHBhc3NlcyBpdHNcbiAgLy8gc3RhZ2VkIHBhdGguIFRoZSB1bnByZWRpY3RhYmxlIHNpYmxpbmcgZmlsZSBtYWtlcyByZXBsYWNlbWVudCBhdG9taWMsIGBjcCAtcGAgcHJlc2VydmVzIGl0c1xuICAvLyBtb2RlLCBhbmQgdGhlIGFuY2hvcmVkIHBhdHRlcm4gY2Fubm90IGVyYXNlIGEgZGlyZWN0IHRhcmJhbGwgZGVwZW5kZW5jeSBVUkwuXG4gIG5vcm1hbGl6ZUJ1bkxvY2tmaWxlOiBgXG4jIS9iaW4vYmFzaFxuc2V0IC1lXG5cbmlmIFtbIFwiJCNcIiAtZXEgMCBdXTsgdGhlblxuICBzZXQgLS0gYnVuLmxvY2tcbmZpXG5cbm5vcm1hbGl6ZWQ9XCJcIlxudHJhcCAnW1sgLXogXCIkbm9ybWFsaXplZFwiIF1dIHx8IHJtIC1mIFwiJG5vcm1hbGl6ZWRcIicgRVhJVFxuZm9yIGZpbGUgaW4gXCIkQFwiOyBkb1xuICBbWyAtZiBcIiRmaWxlXCIgXV0gfHwgY29udGludWVcbiAgbm9ybWFsaXplZD1cIiQobWt0ZW1wIFwiJGZpbGUud2JmeS1ub3JtYWxpemluZy5YWFhYWFhcIilcIlxuICBjcCAtcCBcIiRmaWxlXCIgXCIkbm9ybWFsaXplZFwiXG4gIHNlZCAtRSAncyMoXCIsIClcImh0dHBzOi8vbnBtXFxcXC5mbGF0dFxcXFwudGVjaC9bXlwiXSpcIiNcXFxcMVwiXCIjZycgXCIkZmlsZVwiID4gXCIkbm9ybWFsaXplZFwiXG4gIGlmICEgY21wIC1zIFwiJGZpbGVcIiBcIiRub3JtYWxpemVkXCI7IHRoZW5cbiAgICBtdiBcIiRub3JtYWxpemVkXCIgXCIkZmlsZVwiXG4gICAgZWNobyBcIlJlbW92ZWQgVGFrdW1pIEd1YXJkIHByb3h5IFVSTHMgZnJvbSAkZmlsZSBzbyB0aGUgbG9ja2ZpbGUgc3RheXMgcmVnaXN0cnktYWdub3N0aWMuXCJcbiAgZmlcbiAgcm0gLWYgXCIkbm9ybWFsaXplZFwiXG4gIG5vcm1hbGl6ZWQ9XCJcIlxuZG9uZVxuYC50cmltKCksXG4gIHBvc3RNZXJnZTogYFxuIyEvYmluL2Jhc2hcblxuY2hhbmdlZF9maWxlcz1cIiQoZ2l0IGRpZmYtdHJlZSAtciAtLW5hbWUtb25seSAtLW5vLWNvbW1pdC1pZCBPUklHX0hFQUQgSEVBRClcIlxuXG5ydW5faWZfY2hhbmdlZCgpIHtcbiAgaWYgZWNobyBcIiRjaGFuZ2VkX2ZpbGVzXCIgfCBncmVwIC0tcXVpZXQgLUUgXCIkMVwiOyB0aGVuXG4gICAgZXZhbCBcIiQyXCJcbiAgZmlcbn1cbmAudHJpbSgpLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlTGVmdGhvb2soY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10gPSBbY29uZmlnXSk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlTGVmdGhvb2snLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgY29yZShjb25maWcsIGFsbENvbmZpZ3MpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29yZShjb25maWc6IFBhY2thZ2VDb25maWcsIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmxlZnRob29rJyk7XG4gIGNvbnN0IHsgbGludCB9ID0gZ2VuZXJhdGVTY3JpcHRzKGNvbmZpZywge30pO1xuICBjb25zdCBzZXR0aW5nczogUGFydGlhbDxMZWZ0aG9va1NldHRpbmdzPiA9IHtcbiAgICAuLi5iYXNlU2V0dGluZ3MsXG4gICAgJ3ByZS1jb21taXQnOiB7XG4gICAgICBqb2JzOiBnZXRQcmVDb21taXRKb2JzKGNvbmZpZyksXG4gICAgfSxcbiAgfTtcbiAgaWYgKCFsaW50KSB7XG4gICAgZGVsZXRlIHNldHRpbmdzWydwcmUtcHVzaCddO1xuICB9XG4gIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICBmc1V0aWwud3JpdGVGaWxlQ29uZmluZWQocGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAnbGVmdGhvb2sueW1sJyksIHlhbWwuZHVtcChzZXR0aW5ncywgeyBsaW5lV2lkdGg6IC0xIH0pKSxcbiAgICBmcy5wcm9taXNlcy5ybShkaXJQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSksXG4gIF0pO1xuXG4gIGlmIChsaW50KSB7XG4gICAgY29uc3QgcHJlUHVzaCA9IGdldFByZVB1c2hTY3JpcHQoY29uZmlnKTtcbiAgICBmcy5ta2RpclN5bmMocGF0aC5qb2luKGRpclBhdGgsICdwcmUtcHVzaCcpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKGRpclBhdGgsICdwcmUtcHVzaCcsICdjaGVjay5zaCcpLCBwcmVQdXNoICsgJ1xcbicsIHtcbiAgICAgIG1vZGU6IDBvNzU1LFxuICAgIH0pO1xuICB9XG4gIGNvbnN0IHBvc3RNZXJnZUNvbW1hbmQgPSBgJHtzY3JpcHRzLnBvc3RNZXJnZX1cXG5cXG4ke2dlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMoY29uZmlnLCBhbGxDb25maWdzKS5qb2luKCdcXG4nKX1cXG5gO1xuICBmcy5ta2RpclN5bmMoZGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ25vcm1hbGl6ZS1idW4tbG9ja2ZpbGUuc2gnKSwgc2NyaXB0cy5ub3JtYWxpemVCdW5Mb2NrZmlsZSArICdcXG4nLCB7XG4gICAgbW9kZTogMG83NTUsXG4gIH0pO1xuICBmcy5ta2RpclN5bmMocGF0aC5qb2luKGRpclBhdGgsICdwb3N0LW1lcmdlJyksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwb3N0LW1lcmdlJywgJ3ByZXBhcmUuc2gnKSwgcG9zdE1lcmdlQ29tbWFuZCwge1xuICAgIG1vZGU6IDBvNzU1LFxuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0UHJlUHVzaFNjcmlwdChjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICAvLyBCdW4gcmVwb3MgcmVjZWl2ZSB3YiBhcyBwYXJ0IG9mIHdiZnkncyBtYW5hZ2VkIHRvb2xjaGFpbiwgc28gZ2VuZXJhdGUgdGhlXG4gIC8vIGZpbmFsIGhvb2sgY29tbWFuZCBvbiB0aGUgZmlyc3QgcnVuIGluc3RlYWQgb2YgY2hhbmdpbmcgaXQgb24gdGhlIHNlY29uZC5cbiAgY29uc3QgcXVpZXRMaW50Q29tbWFuZCA9ICdidW4gd2IgbGludCAtLXF1aWV0JztcbiAgLy8gTm8gc2VwYXJhdGUgdHlwZWNoZWNrIHN0ZXAgbmVlZGVkIOKAlCB0aGUgbGludCBjb21tYW5kIGFscmVhZHkgaW5jbHVkZXMgdHlwZWNoZWNraW5nLlxuICBpZiAoY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKSkge1xuICAgIHJldHVybiBgXG4jIS9iaW4vYmFzaFxuXG5pZiBbICQoZ2l0IGJyYW5jaCAtLXNob3ctY3VycmVudCkgPSBcIm1haW5cIiBdICYmIFsgJChnaXQgY29uZmlnIHVzZXIuZW1haWwpICE9IFwiZXhrYXp1dUBnbWFpbC5jb21cIiBdOyB0aGVuXG4gIGVjaG8gXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIlxuICBlY2hvIFwiKioqIERvbid0IHB1c2ggbWFpbiBicmFuY2ggZGlyZWN0bHkuIFVzZSBQUiEgKioqXCJcbiAgZWNobyBcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiXG4gIGV4aXQgMVxuZmlcblxuJHtxdWlldExpbnRDb21tYW5kfVxuYC50cmltKCk7XG4gIH1cbiAgcmV0dXJuIHF1aWV0TGludENvbW1hbmQ7XG59XG5cbmZ1bmN0aW9uIGdldFByZUNvbW1pdEpvYnMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogTGVmdGhvb2tKb2JbXSB7XG4gIHJldHVybiBwcmVDb21taXRTZXR0aW5ncy5qb2JzXG4gICAgLmZpbHRlcigoam9iKSA9PiBqb2IubmFtZSAhPT0gJ3ZhbGlkYXRlLXJlbm92YXRlLWNvbmZpZycgfHwgY29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzKVxuICAgIC5tYXAoKGpvYikgPT5cbiAgICAgIGpvYi5uYW1lID09PSAnY2xlYW51cCdcbiAgICAgICAgPyB7XG4gICAgICAgICAgICAuLi5qb2IsXG4gICAgICAgICAgICBnbG9iOiBnZXRDbGVhbnVwR2xvYnMoY29uZmlnKSxcbiAgICAgICAgICAgIHJ1bjogZ2V0Q2xlYW51cENvbW1hbmQoY29uZmlnKSxcbiAgICAgICAgICB9XG4gICAgICAgIDogam9iXG4gICAgKTtcbn1cblxuZnVuY3Rpb24gZ2V0Q2xlYW51cEdsb2JzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIC8vIExldCBgd2IgbGludCAtLWZvcm1hdGAgZGVjaWRlIHdoZXRoZXIgUHJldHRpZXIgaXMgYXZhaWxhYmxlOyB0aGUgaG9va1xuICAvLyBzdGlsbCBuZWVkcyB0byB0cmlnZ2VyIHdoZW4gYWRkaW5nIHRoZSBmaXJzdCBwcmV0dGllci1vbmx5IGZpbGUuXG4gIGNvbnN0IHN1cHBvcnRlZEV4dGVuc2lvbnMgPSBbLi4uZXh0ZW5zaW9ucy5wcmV0dGllck9ubHldO1xuICBpZiAoZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKSkge1xuICAgIHN1cHBvcnRlZEV4dGVuc2lvbnMucHVzaCguLi5leHRlbnNpb25zLm94Zm10LCAuLi5leHRlbnNpb25zLm94bGludCk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2sgfHwgY29uZmlnLmRvZXNDb250YWluVXZMb2NrKSB7XG4gICAgc3VwcG9ydGVkRXh0ZW5zaW9ucy5wdXNoKCdweScpO1xuICB9XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgIHN1cHBvcnRlZEV4dGVuc2lvbnMucHVzaCgnZGFydCcpO1xuICB9XG4gIGNvbnN0IGZpbHRlcmVkRXh0ZW5zaW9ucyA9IFsuLi5uZXcgU2V0KHN1cHBvcnRlZEV4dGVuc2lvbnMpXS50b1NvcnRlZCgpO1xuICByZXR1cm4gYCoqLyoueyR7ZmlsdGVyZWRFeHRlbnNpb25zLmpvaW4oJywnKX19YDtcbn1cblxuZnVuY3Rpb24gZ2V0Q2xlYW51cENvbW1hbmQoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgaWYgKGhhc0xvY2FsV2JXb3Jrc3BhY2UoY29uZmlnKSkge1xuICAgIHJldHVybiBTdHJpbmcucmF3YFxuYnVuIHJ1biAtLWN3ZCBwYWNrYWdlcy93YiBzdGFydCAtLXdvcmtpbmctZGlyIFwiJChnaXQgcmV2LXBhcnNlIC0tc2hvdy10b3BsZXZlbClcIiBsaW50IC0tZml4IC0tZm9ybWF0IC0tIHtzdGFnZWRfZmlsZXN9XG5gLnRyaW0oKTtcbiAgfVxuICAvLyBQeXRob24tb25seSBCdW4gcmVwb3MgaW5zdGFsbCB3YiBmb3Igc2hhcmVkIHNjcmlwdHMgYnV0IG5vdCBPeGxpbnQsIHNvXG4gIC8vIHN0YWdlZC1maWxlIGhvb2tzIG11c3QgdXNlIHRoZSBsYW5ndWFnZS1zcGVjaWZpYyBmb3JtYXR0ZXIgcGF0aCBiZWxvdy5cbiAgY29uc3QgY2FuVXNlV2JGb3JTdGFnZWRGaWxlcyA9IGRvZXNDb250YWluSnNPclRzKGNvbmZpZykgfHwgZG9lc0NvbnRhaW5KYXZhKGNvbmZpZyk7XG4gIGlmIChjYW5Vc2VXYkZvclN0YWdlZEZpbGVzKSB7XG4gICAgcmV0dXJuIGBcbmJ1biB3YiBsaW50IC0tZml4IC0tZm9ybWF0IC0tIHtzdGFnZWRfZmlsZXN9XG5gLnRyaW0oKTtcbiAgfVxuXG4gIHJldHVybiBTdHJpbmcucmF3YFxucGFja2FnZV9qc29uX2ZpbGVzPVwiJChwcmludGYgJyVzXFxuJyB7c3RhZ2VkX2ZpbGVzfSB8IGdyZXAgLUUgJyhefC8pcGFja2FnZVxcLmpzb24kJyB8fCB0cnVlKVwiXG4ke2hhc1B5dGhvblBhY2thZ2VNYW5hZ2VyKGNvbmZpZykgPyBTdHJpbmcucmF3YHB5dGhvbl9maWxlcz1cIiQocHJpbnRmICclc1xcbicge3N0YWdlZF9maWxlc30gfCBncmVwIC1FICdcXC5weSQnIHx8IHRydWUpXCJgIDogJyd9XG4ke2NvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sID8gU3RyaW5nLnJhd2BkYXJ0X2ZpbGVzPVwiJChwcmludGYgJyVzXFxuJyB7c3RhZ2VkX2ZpbGVzfSB8IGdyZXAgLUUgJ1xcLmRhcnQkJyB8IGdyZXAgLXYgJ2dlbmVyYXRlZCcgfCBncmVwIC12ICdcXC5mcmVlemVkXFwuZGFydCQnIHwgZ3JlcCAtdiAnXFwuZ1xcLmRhcnQkJyB8fCB0cnVlKVwiYCA6ICcnfVxuXG5pZiBbIC1uIFwiJHBhY2thZ2VfanNvbl9maWxlc1wiIF07IHRoZW5cbiAgYnVuIHNvcnQtcGFja2FnZS1qc29uICRwYWNrYWdlX2pzb25fZmlsZXNcbmZpXG4ke1xuICBoYXNQeXRob25QYWNrYWdlTWFuYWdlcihjb25maWcpXG4gICAgPyBgaWYgWyAtbiBcIiRweXRob25fZmlsZXNcIiBdOyB0aGVuXG4gICR7Z2V0UHl0aG9uUnVubmVyKGNvbmZpZyl9IGlzb3J0IC0tcHJvZmlsZSBibGFjayAtLWZpbHRlci1maWxlcyAkcHl0aG9uX2ZpbGVzXG4gICR7Z2V0UHl0aG9uUnVubmVyKGNvbmZpZyl9IGJsYWNrICRweXRob25fZmlsZXNcbiAgJHtnZXRQeXRob25SdW5uZXIoY29uZmlnKX0gZmxha2U4ICRweXRob25fZmlsZXNcbmZpYFxuICAgIDogJydcbn1cbiR7XG4gIGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sXG4gICAgPyBgaWYgWyAtbiBcIiRkYXJ0X2ZpbGVzXCIgXTsgdGhlblxuICBkYXJ0IGZvcm1hdCAkZGFydF9maWxlc1xuZmlgXG4gICAgOiAnJ1xufVxuYC50cmltKCk7XG59XG5cbmZ1bmN0aW9uIGhhc0xvY2FsV2JXb3Jrc3BhY2UoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIGlmICghY29uZmlnLmlzUm9vdCkgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IGxvY2FsV2JQYWNrYWdlSnNvblBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdwYWNrYWdlcycsICd3YicsICdwYWNrYWdlLmpzb24nKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGxvY2FsV2JQYWNrYWdlSnNvblBhdGgpKSByZXR1cm4gZmFsc2U7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKGxvY2FsV2JQYWNrYWdlSnNvblBhdGgsICd1dGY4JykpIGFzIHsgbmFtZT86IHN0cmluZyB9O1xuICAgIHJldHVybiBwYWNrYWdlSnNvbi5uYW1lID09PSAnQHdpbGxib29zdGVyL3diJztcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHBvc3RNZXJnZUNvbW1hbmRzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCB0b29sc0NoYW5nZWRQYXR0ZXJuID0gU3RyaW5nLnJhd2AobWlzZVxcLnRvbWx8XFwubWlzZVxcLnRvbWwpYDtcbiAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiJHt0b29sc0NoYW5nZWRQYXR0ZXJufVwiIFwibWlzZSBpbnN0YWxsXCJgKTtcbiAgLy8gYG1pc2UgYWN0aXZhdGVgIHVwZGF0ZXMgUEFUSCBvbmx5IHdoZW4gdGhlIHByb21wdCBpcyBkcmF3biwgc28gdGhlIGhvb2sgaW5oZXJpdHMgdGhlIHRvb2xcbiAgLy8gdmVyc2lvbnMgcGlubmVkIGJlZm9yZSB0aGUgbWVyZ2U7IHJlZnJlc2ggUEFUSCBzbyBhIHB1bGxlZCBCdW4gcGluIGluc3RhbGxzIHdpdGggdGhhdCBCdW4uXG4gIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goJ2V2YWwgXCIkKG1pc2UgZW52IC1zIGJhc2gpXCInKTtcbiAgY29uc3QgaW5zdGFsbENvbW1hbmQgPSAnYnVuIGluc3RhbGwnO1xuICAvLyBEbyBOT1QgYWRkIGAudmluZXh0YCBoZXJlOiBpdCBob2xkcyBvbmx5IHZpbmV4dCdzIGNvbnRlbnQtaGFzaGVkIGZvbnQgY2FjaGUgYW5kIHRoZSBkZXZcbiAgLy8gc2VydmVyJ3MgbG9jayBmaWxlIChkZWxldGluZyB0aGUgbG9jayBkaXNhYmxlcyB0aGUgZHVwbGljYXRlLWRldi1zZXJ2ZXIgZ3VhcmQgZm9yIGEgcnVubmluZ1xuICAvLyBzZXJ2ZXIpLiB2aW5leHQncyBidWlsZCBvdXRwdXQgZ29lcyB0byBgZGlzdC9gLCBhbmQgVml0ZSdzIGRlcGVuZGVuY3kgY2FjaGUgaXMgaGFuZGxlZCBieVxuICAvLyB0aGUgc2VwYXJhdGUgaW5zdGFsbC1sYXlvdXQgaG9vayBiZWxvdy5cbiAgLy8gU2NhbiBldmVyeSB3b3Jrc3BhY2UgY29uZmlnIChub3QganVzdCB0aGUgcm9vdCk6IGluIGEgbW9ub3JlcG8gdGhlIGFwcCB1c3VhbGx5IGxpdmVzIGluXG4gIC8vIHBhY2thZ2VzLzxhcHA+IG9yIGFwcHMvPGFwcD4sIGFuZCB0aGUgY2FjaGUgZGlyZWN0b3JpZXMgYXJlIHdvcmtzcGFjZS1yZWxhdGl2ZS5cbiAgY29uc3QgbmV4dENhY2hlRGlyUGF0aHMgPSBjb2xsZWN0V29ya3NwYWNlUmVsYXRpdmVEaXJQYXRocyhcbiAgICBjb25maWcsXG4gICAgYWxsQ29uZmlncyxcbiAgICAod29ya3NwYWNlQ29uZmlnKSA9PiB3b3Jrc3BhY2VDb25maWcuZGVwZW5kaW5nLmJsaXR6IHx8IHdvcmtzcGFjZUNvbmZpZy5kZXBlbmRpbmcubmV4dCxcbiAgICAnLm5leHQnXG4gICk7XG4gIGNvbnN0IHJtTmV4dERpcmVjdG9yaWVzID1cbiAgICBuZXh0Q2FjaGVEaXJQYXRocy5sZW5ndGggPiAwID8gYCAmJiBybSAtUmYgLS0gJHtuZXh0Q2FjaGVEaXJQYXRocy5tYXAocXVvdGVGb3JFdmFsdWF0ZWRTaGVsbCkuam9pbignICcpfWAgOiAnJztcbiAgLy8gQnVuIGRvZXMgbm90IHJlbGluayBhbiBleGlzdGluZyBpc29sYXRlZCB0cmVlIHdoZW4gZ2xvYmFsU3RvcmUvbGlua2VyIHNldHRpbmdzIGNoYW5nZS4gSW5zcGVjdFxuICAvLyB0aG9zZSBrZXlzIHJhdGhlciB0aGFuIGV2ZXJ5IGJ1bmZpZyBjaGFuZ2U6IG1pbmltdW1SZWxlYXNlQWdlIHVwZGF0ZXMgbXVzdCBub3QgZGVzdHJveSBhXG4gIC8vIGNvbnRyaWJ1dG9yJ3Mgd29ya2luZyBpbnN0YWxsIGJlZm9yZSBhIHBvdGVudGlhbGx5IG5ldHdvcmstZGVwZW5kZW50IHJlcGxhY2VtZW50IHN1Y2NlZWRzLlxuICBjb25zdCBub2RlTW9kdWxlc0RpclBhdGhzID0gY29sbGVjdFdvcmtzcGFjZVJlbGF0aXZlRGlyUGF0aHMoY29uZmlnLCBhbGxDb25maWdzLCAoKSA9PiB0cnVlLCAnbm9kZV9tb2R1bGVzJyk7XG4gIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goXG4gICAgU3RyaW5nLnJhd2BpZiBnaXQgZGlmZiAtLW5vLWNvbG9yIC1VMCBPUklHX0hFQUQgSEVBRCAtLSAnKmJ1bmZpZy50b21sJyB8IGdyZXAgLS1xdWlldCAtRSAnXlsrLV0gKihnbG9iYWxTdG9yZXxsaW5rZXJ8cHVibGljSG9pc3RQYXR0ZXJuKSc7IHRoZW4gcm0gLVJmIC0tICR7bm9kZU1vZHVsZXNEaXJQYXRocy5tYXAocXVvdGVGb3JTaGVsbCkuam9pbignICcpfTsgZmlgXG4gICk7XG4gIC8vIGJ1bi5sb2NrLW9ubHkgbWVyZ2VzIChSZW5vdmF0ZSBsb2NrZmlsZSBtYWludGVuYW5jZSksIGJ1bmZpZy50b21sIC8gLm5wbXJjIGNoYW5nZXMgKGxpbmtlcixcbiAgLy8gcmVnaXN0cnksIGhvaXN0aW5nKSwgYW5kIHBhdGNoIGVkaXRzIGFsbCBjaGFuZ2UgdGhlIGluc3RhbGxlZCB0cmVlIHdpdGhvdXQgdG91Y2hpbmcgcGFja2FnZS5qc29uLlxuICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFxuICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIocGFja2FnZVxcLmpzb258YnVuXFwubG9ja3xidW5maWdcXC50b21sfFxcLm5wbXJjfHBhdGNoZXMvKVwiIFwiJHtpbnN0YWxsQ29tbWFuZH0ke3JtTmV4dERpcmVjdG9yaWVzfVwiYFxuICApO1xuICAvLyBWaXRlJ3MgZGVwZW5kZW5jeSBjYWNoZSBpbiBub2RlX21vZHVsZXMvLnZpdGUgc2VsZi1pbnZhbGlkYXRlcyBvbiBsb2NrZmlsZSAvIHBhdGNoZXMgL1xuICAvLyBjb25maWcgLyBOT0RFX0VOViBjaGFuZ2VzIChzZWUgVml0ZSdzIGRlcCBwcmUtYnVuZGxpbmcgZG9jcyksIHNvIHRoZSByZXNpZHVhbCBzdGFsZSBjYXNlIGlzXG4gIC8vIGluc3RhbGwtbGF5b3V0IGNoYW5nZXMgKGJ1bmZpZy50b21sIGxpbmtlciwgLm5wbXJjKTogdGhleSBjaGFuZ2UgdGhlIGluc3RhbGxlZCB0cmVlIHdpdGhvdXRcbiAgLy8gdG91Y2hpbmcgdGhlIGxvY2tmaWxlLCBhbmQgdGhleSBhcmUgYWJzZW50IGZyb20gVml0ZSdzIGNhY2hlIGtleS5cbiAgY29uc3Qgcm1WaXRlQ2FjaGVEaXJlY3RvcmllcyA9IGNvbGxlY3RXb3Jrc3BhY2VSZWxhdGl2ZURpclBhdGhzKFxuICAgIGNvbmZpZyxcbiAgICBhbGxDb25maWdzLFxuICAgICh3b3Jrc3BhY2VDb25maWcpID0+IHdvcmtzcGFjZUNvbmZpZy5kZXBlbmRpbmcudmluZXh0IHx8IHdvcmtzcGFjZUNvbmZpZy5kZXBlbmRpbmcudml0ZSxcbiAgICAnbm9kZV9tb2R1bGVzLy52aXRlJ1xuICApO1xuICBpZiAocm1WaXRlQ2FjaGVEaXJlY3Rvcmllcy5sZW5ndGggPiAwKSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIoYnVuZmlnXFwudG9tbHxcXC5ucG1yYylcIiBcInJtIC1SZiAtLSAke3JtVml0ZUNhY2hlRGlyZWN0b3JpZXMubWFwKHF1b3RlRm9yRXZhbHVhdGVkU2hlbGwpLmpvaW4oJyAnKX1cImBcbiAgICApO1xuICB9XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrKSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwicG9ldHJ5XFwubG9ja1wiIFwicG9ldHJ5IGluc3RhbGxcImApO1xuICB9XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5VdkxvY2spIHtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCJ1dlxcLmxvY2tcIiBcInV2IHN5bmMgLS1mcm96ZW5cImApO1xuICB9XG4gIC8vIEJsaXR6IHJlcG9zaXRvcmllcyBkZWxpYmVyYXRlbHkgZ2V0IHRoZSBzYW1lIHdiLWRyaXZlbiBwcmlzbWEgY29tbWFuZHMgYXMgZXZlcnlvbmUgZWxzZTpcbiAgLy8gdGhlIGJsaXR6IENMSSdzIGNvZGVnZW4gcGF0Y2hlcyB0aGUgaW5zdGFsbGVkIG5leHQgcGFja2FnZSBpbiBwbGFjZSwgd2hpY2ggbXVzdCBuZXZlciBydW5cbiAgLy8gdW5kZXIgQnVuJ3Mgc2hhcmVkIGdsb2JhbCBzdG9yZS4gWWFybi1lcmEgQmxpdHogcmVwb3MgZ2V0IHRoZWlyIHJvdXRlIG1hbmlmZXN0IGZyb21cbiAgLy8gYHdiIGdlbi1jb2RlYCdzIGBibGl0eiBjb2RlZ2VuYCBzdGVwLCBhbmQgY3VycmVudCB3YiByb3V0ZXMgb25seSBgd2IgcHJpc21hIHNlZWRgIHRocm91Z2hcbiAgLy8gdGhlIGJsaXR6IENMSSwgb25seSBmb3Igbm9uLUJ1biByZXBvcyAoc2VlIHBhY2thZ2VzL3diL3NyYy9zY3JpcHRzL3ByaXNtYVNjcmlwdHMudHMpOyB0aGVcbiAgLy8gcG9zdC1tZXJnZSBob29rcyBzdGF5IHdiLWRyaXZlbiBiZWNhdXNlIGBwcmlzbWEgZGVwbG95YC9gZ2VuZXJhdGVgIG5lZWQgbm8gYmxpdHogbG9hZGVyLlxuICBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEpIHtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIi4qXFwucHJpc21hXCIgXCJidW4gd2IgcHJpc21hIGRlcGxveVwiYCxcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIuKlxcLnByaXNtYVwiIFwiYnVuIHdiIHByaXNtYSBnZW5lcmF0ZVwiYFxuICAgICk7XG4gIH1cbiAgY29uc3QgZ2VuSTE4blRzQ29tbWFuZCA9IGdldEdlbkkxOG5Uc0NvbW1hbmQoY29uZmlnLCBjb25maWcucGFja2FnZUpzb24/LnNjcmlwdHMpO1xuICBpZiAoZ2VuSTE4blRzQ29tbWFuZCkge1xuICAgIC8vIGdlbi1pMThuLXRzIG91dHB1dHMgYXJlIGNvbW1vbmx5IGlnbm9yZWQsIHNvIHBvc3QtbWVyZ2UgcmVnZW5lcmF0ZXMgdGhlbSBhZnRlciBwdWxsZWQgcmVzb3VyY2UgY2hhbmdlcy5cbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIoXnwvKWkxOG4vLipcXC5qc29uJFwiIFwiJHtnZW5JMThuVHNDb21tYW5kfVwiYCk7XG4gIH1cbiAgcmV0dXJuIHBvc3RNZXJnZUNvbW1hbmRzO1xufVxuXG4vLyBUaGUgZ2VuZXJhdGVkIGNvbW1hbmQgcGFzc2VzIHRocm91Z2ggVFdPIHNoZWxsIHBhcnNpbmcgc3RhZ2VzOiB0aGUgcHJlcGFyZS5zaCBsaW5lIHBhcnNlcyBpdCBhc1xuLy8gYSBkb3VibGUtcXVvdGVkIGFyZ3VtZW50IChwcm9jZXNzaW5nIFxcLCBgLCAkIGFuZCBcIiBpbW1lZGlhdGVseSksIGFuZCBydW5faWZfY2hhbmdlZCB0aGVuIGV2YWwnc1xuLy8gaXQgKHdvcmQtc3BsaXR0aW5nIGFuZCBnbG9iYmluZykuIEFuIHVucXVvdGVkIHBhdGggY29udGFpbmluZyBzcGFjZXMgKGUuZy4gYGFwcHMvbXkgYXBwLy5uZXh0YClcbi8vIHdvdWxkIHdvcmQtc3BsaXQgaW50byB1bnJlbGF0ZWQgcm0gdGFyZ2V0cywgYW5kIGAkYC9iYWNrdGljayB3b3VsZCBleHBhbmQgYXQgdGhlIGZpcnN0IHN0YWdlLlxuLy8gU286IHF1b3RlIGZvciB0aGUgZXZhbCBzdGFnZSDigJQgYHF1b3RlRm9yU2hlbGxgIGxlYXZlcyBvbmx5IHdvcmRzIHRoYXQgY2Fycnkgbm8gc2hlbGwgbWVhbmluZ1xuLy8gdW5xdW90ZWQg4oCUIHRoZW4gYmFja3NsYXNoLWVzY2FwZSB0aGUgZG91YmxlLXF1b3RlLWNvbnRleHQgc3BlY2lhbHMuXG5mdW5jdGlvbiBxdW90ZUZvckV2YWx1YXRlZFNoZWxsKGZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBldmFsUXVvdGVkID0gcXVvdGVGb3JTaGVsbChmaWxlUGF0aCk7XG4gIHJldHVybiBldmFsUXVvdGVkLnJlcGxhY2VBbGwoL1tcXFxcYCRcIl0vZ3UsIFN0cmluZy5yYXdgXFwkJmApO1xufVxuXG4vKipcbiAqIFRoZSB3b3Jrc3BhY2UtcmVsYXRpdmUgZGlyZWN0b3JpZXMgKHJvb3QgZmlyc3QsIGRlZHVwbGljYXRlZCwgYDxzdWJEaXJOYW1lPmAgYXBwZW5kZWQpIG9mIGV2ZXJ5XG4gKiB3b3Jrc3BhY2Ugd2hvc2UgY29uZmlnIG1hdGNoZXMgdGhlIHByZWRpY2F0ZS4gVGhlIGhvb2sgc2NyaXB0IHJ1bnMgYXQgdGhlIHJlcG9zaXRvcnkgcm9vdCwgc29cbiAqIHBhdGhzIGFyZSByZWxhdGl2ZSB0byB0aGUgcm9vdCBjb25maWcncyBkaXJlY3RvcnkuXG4gKi9cbmZ1bmN0aW9uIGNvbGxlY3RXb3Jrc3BhY2VSZWxhdGl2ZURpclBhdGhzKFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10sXG4gIHByZWRpY2F0ZTogKGNvbmZpZzogUGFja2FnZUNvbmZpZykgPT4gYm9vbGVhbixcbiAgc3ViRGlyTmFtZTogc3RyaW5nXG4pOiBzdHJpbmdbXSB7XG4gIHJldHVybiBbXG4gICAgLi4ubmV3IFNldChcbiAgICAgIGFsbENvbmZpZ3NcbiAgICAgICAgLmZpbHRlcigoY29uZmlnKSA9PiBwcmVkaWNhdGUoY29uZmlnKSlcbiAgICAgICAgLm1hcCgoY29uZmlnKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVsYXRpdmVEaXJQYXRoID0gcGF0aC5yZWxhdGl2ZShyb290Q29uZmlnLmRpclBhdGgsIGNvbmZpZy5kaXJQYXRoKS5yZXBsYWNlQWxsKCdcXFxcJywgJy8nKTtcbiAgICAgICAgICByZXR1cm4gcmVsYXRpdmVEaXJQYXRoID8gcGF0aC5wb3NpeC5qb2luKHJlbGF0aXZlRGlyUGF0aCwgc3ViRGlyTmFtZSkgOiBzdWJEaXJOYW1lO1xuICAgICAgICB9KVxuICAgICksXG4gIF0udG9Tb3J0ZWQoKTtcbn1cblxuZnVuY3Rpb24gaGFzUHl0aG9uUGFja2FnZU1hbmFnZXIoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIHJldHVybiBjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrIHx8IGNvbmZpZy5kb2VzQ29udGFpblV2TG9jaztcbn1cblxuZnVuY3Rpb24gZ2V0UHl0aG9uUnVubmVyKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6ICdwb2V0cnkgcnVuJyB8ICd1diBydW4nIHtcbiAgcmV0dXJuIGNvbmZpZy5kb2VzQ29udGFpblV2TG9jayA/ICd1diBydW4nIDogJ3BvZXRyeSBydW4nO1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUNvbmZpZ0NvbnRlbnQoY29udGVudDogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGNvbnRlbnQ/LnRyaW0oKTtcbn1cbiIsImltcG9ydCB7IGVzY2FwZVJlZ0V4cCB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliL3NyYyc7XG5leHBvcnQgdHlwZSBDb25maWdCbG9ja05hbWUgPSAnYmFzZScgfCAnZXhwb3J0JztcblxuaW50ZXJmYWNlIE1hbmFnZWRDb25maWdCbG9ja3NPcHRpb25zIHtcbiAgYmxvY2tOYW1lczogcmVhZG9ubHkgQ29uZmlnQmxvY2tOYW1lW107XG4gIG1hcmtlclByZWZpeDogc3RyaW5nO1xuICB0b29sTmFtZTogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgR2V0Q29uZmlnQ29udGVudE9wdGlvbnMge1xuICBkZXNpcmVkQ29udGVudDogc3RyaW5nO1xuICBleGlzdGluZ0NvbnRlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgZmlsZVBhdGg6IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIE1hbmFnZWRDb25maWdCbG9ja3Mge1xuICBwcml2YXRlIHJlYWRvbmx5IGJsb2NrTmFtZXM6IHJlYWRvbmx5IENvbmZpZ0Jsb2NrTmFtZVtdO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgbWFya2VyUHJlZml4OiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSByZWFkb25seSB0b29sTmFtZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IE1hbmFnZWRDb25maWdCbG9ja3NPcHRpb25zKSB7XG4gICAgdGhpcy5ibG9ja05hbWVzID0gb3B0aW9ucy5ibG9ja05hbWVzO1xuICAgIHRoaXMubWFya2VyUHJlZml4ID0gb3B0aW9ucy5tYXJrZXJQcmVmaXg7XG4gICAgdGhpcy50b29sTmFtZSA9IG9wdGlvbnMudG9vbE5hbWU7XG4gIH1cblxuICBnZXRDb25maWdDb250ZW50KG9wdGlvbnM6IEdldENvbmZpZ0NvbnRlbnRPcHRpb25zKTogc3RyaW5nIHtcbiAgICBpZiAoIW9wdGlvbnMuZXhpc3RpbmdDb250ZW50KSByZXR1cm4gb3B0aW9ucy5kZXNpcmVkQ29udGVudDtcbiAgICBpZiAodGhpcy5oYXNNYW5hZ2VkQmxvY2tzKG9wdGlvbnMuZXhpc3RpbmdDb250ZW50KSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVwbGFjZU1hbmFnZWRCbG9ja3Mob3B0aW9ucy5leGlzdGluZ0NvbnRlbnQsIG9wdGlvbnMuZGVzaXJlZENvbnRlbnQsIG9wdGlvbnMuZmlsZVBhdGgpO1xuICAgIH1cbiAgICByZXR1cm4gb3B0aW9ucy5kZXNpcmVkQ29udGVudDtcbiAgfVxuXG4gIGdldEJsb2NrKGJsb2NrTmFtZTogQ29uZmlnQmxvY2tOYW1lLCBjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLmdldFN0YXJ0TWFya2VyKGJsb2NrTmFtZSl9XG4ke2NvbnRlbnR9XG4ke3RoaXMuZ2V0RW5kTWFya2VyKGJsb2NrTmFtZSl9YDtcbiAgfVxuXG4gIGhhc01hbmFnZWRCbG9ja3MoY29udGVudDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuYmxvY2tOYW1lcy5zb21lKChibG9ja05hbWUpID0+IGNvbnRlbnQuaW5jbHVkZXModGhpcy5nZXRTdGFydE1hcmtlcihibG9ja05hbWUpKSk7XG4gIH1cblxuICBwcml2YXRlIHJlcGxhY2VNYW5hZ2VkQmxvY2tzKGV4aXN0aW5nQ29udGVudDogc3RyaW5nLCBkZXNpcmVkQ29udGVudDogc3RyaW5nLCBmaWxlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBsZXQgY29udGVudCA9IGV4aXN0aW5nQ29udGVudDtcbiAgICBmb3IgKGNvbnN0IGJsb2NrTmFtZSBvZiB0aGlzLmJsb2NrTmFtZXMpIHtcbiAgICAgIGNvbnN0IHJlcGxhY2VtZW50ID0gdGhpcy5leHRyYWN0TWFuYWdlZEJsb2NrKGRlc2lyZWRDb250ZW50LCBibG9ja05hbWUpO1xuICAgICAgaWYgKCFyZXBsYWNlbWVudCkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IG5leHRDb250ZW50ID0gdGhpcy5yZXBsYWNlTWFuYWdlZEJsb2NrKGNvbnRlbnQsIGJsb2NrTmFtZSwgcmVwbGFjZW1lbnQpO1xuICAgICAgaWYgKCFuZXh0Q29udGVudCkge1xuICAgICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgdXBkYXRpbmcgaW5jb21wbGV0ZSAke2Jsb2NrTmFtZX0gYmxvY2sgaW4gJHt0aGlzLnRvb2xOYW1lfSBjb25maWc6ICR7ZmlsZVBhdGh9YCk7XG4gICAgICAgIHJldHVybiBleGlzdGluZ0NvbnRlbnQ7XG4gICAgICB9XG4gICAgICBjb250ZW50ID0gbmV4dENvbnRlbnQ7XG4gICAgfVxuICAgIHJldHVybiBjb250ZW50O1xuICB9XG5cbiAgcHJpdmF0ZSBleHRyYWN0TWFuYWdlZEJsb2NrKGNvbnRlbnQ6IHN0cmluZywgYmxvY2tOYW1lOiBDb25maWdCbG9ja05hbWUpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmdldE1hbmFnZWRCbG9ja1JlZ0V4cChibG9ja05hbWUpLmV4ZWMoY29udGVudCk/LlswXTtcbiAgfVxuXG4gIHByaXZhdGUgcmVwbGFjZU1hbmFnZWRCbG9jayhjb250ZW50OiBzdHJpbmcsIGJsb2NrTmFtZTogQ29uZmlnQmxvY2tOYW1lLCByZXBsYWNlbWVudDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBwYXR0ZXJuID0gdGhpcy5nZXRNYW5hZ2VkQmxvY2tSZWdFeHAoYmxvY2tOYW1lKTtcbiAgICBpZiAoIXBhdHRlcm4udGVzdChjb250ZW50KSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gY29udGVudC5yZXBsYWNlKHBhdHRlcm4sIHJlcGxhY2VtZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TWFuYWdlZEJsb2NrUmVnRXhwKGJsb2NrTmFtZTogQ29uZmlnQmxvY2tOYW1lKTogUmVnRXhwIHtcbiAgICByZXR1cm4gbmV3IFJlZ0V4cChcbiAgICAgIGAke2VzY2FwZVJlZ0V4cCh0aGlzLmdldFN0YXJ0TWFya2VyKGJsb2NrTmFtZSkpfVtcXFxcc1xcXFxTXSo/JHtlc2NhcGVSZWdFeHAodGhpcy5nZXRFbmRNYXJrZXIoYmxvY2tOYW1lKSl9YFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGdldFN0YXJ0TWFya2VyKGJsb2NrTmFtZTogQ29uZmlnQmxvY2tOYW1lKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYC8vIHdiZnk6c3RhcnQgJHt0aGlzLm1hcmtlclByZWZpeH0tJHtibG9ja05hbWV9YDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RW5kTWFya2VyKGJsb2NrTmFtZTogQ29uZmlnQmxvY2tOYW1lKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYC8vIHdiZnk6ZW5kICR7dGhpcy5tYXJrZXJQcmVmaXh9LSR7YmxvY2tOYW1lfWA7XG4gIH1cbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyByZXNvbHZlV2lsbGJvb3N0ZXJDb25maWdNb2R1bGUgfSBmcm9tICcuLi91dGlscy93aWxsYm9vc3RlckNvbmZpZ3NVdGlsLmpzJztcblxuaW1wb3J0IHsgbm9ybWFsaXplQ29uZmlnQ29udGVudCB9IGZyb20gJy4vY29uZmlnQ29udGVudC5qcyc7XG5pbXBvcnQgeyBNYW5hZ2VkQ29uZmlnQmxvY2tzIH0gZnJvbSAnLi9tYW5hZ2VkQ29uZmlnQmxvY2suanMnO1xuXG5jb25zdCBtYW5hZ2VkQ29uZmlnQmxvY2tzID0gbmV3IE1hbmFnZWRDb25maWdCbG9ja3Moe1xuICBibG9ja05hbWVzOiBbJ2Jhc2UnLCAnZXhwb3J0J10sXG4gIG1hcmtlclByZWZpeDogJ294Zm10JyxcbiAgdG9vbE5hbWU6ICdveGZtdCcsXG59KTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlT3hmbXRDb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVPeGZtdENvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ294Zm10LmNvbmZpZy50cycpO1xuICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgICBjb25zdCBkZXNpcmVkQ29udGVudCA9IG1hbmFnZWRDb25maWdCbG9ja3MuZ2V0Q29uZmlnQ29udGVudCh7XG4gICAgICBkZXNpcmVkQ29udGVudDogZ2V0Q29uZmlnQ29udGVudChjb25maWcpLFxuICAgICAgZXhpc3RpbmdDb250ZW50LFxuICAgICAgZmlsZVBhdGgsXG4gICAgfSk7XG4gICAgaWYgKG5vcm1hbGl6ZUNvbmZpZ0NvbnRlbnQoZXhpc3RpbmdDb250ZW50KSAhPT0gbm9ybWFsaXplQ29uZmlnQ29udGVudChkZXNpcmVkQ29udGVudCkpIHtcbiAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGRlc2lyZWRDb250ZW50KTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRDb25maWdDb250ZW50KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIGNvbnN0IG94Zm10QmFzZUNvbmZpZ01vZHVsZSA9IHJlc29sdmVXaWxsYm9vc3RlckNvbmZpZ01vZHVsZShjb25maWcsICdAd2lsbGJvb3N0ZXIvb3hmbXQtY29uZmlnJyk7XG5cbiAgLy8gQ29tbW9uSlMgcGFja2FnZXMgbmVlZCByZXF1aXJlL21vZHVsZS5leHBvcnRzIGhlcmU6IG94Zm10IGNvbmZpZyBmaWxlcyBhcmVcbiAgLy8gb25seSBhdXRvLWRpc2NvdmVyZWQgYXMgLnRzLCBhbmQgdGhlIHNoYXJlZCBjb25maWcgcGFja2FnZSBpcyBFU00tb25seS5cbiAgLy8gTm8gLy8vIDxyZWZlcmVuY2UgdHlwZXM+IGxpbmU6IHRoZSB3YmZ5LWdlbmVyYXRlZCB0c2NvbmZpZyBhbHJlYWR5IGNvdmVycyAqLmNvbmZpZy50cyB3aXRoXG4gIC8vIHR5cGVzIFtcImJ1blwiXSwgd2hpY2ggdHlwZXMgcmVxdWlyZS9tb2R1bGUuZXhwb3J0cywgd2hpbGUgYSBcIm5vZGVcIiByZWZlcmVuY2UgYnJlYWtzIHVuZGVyXG4gIC8vIEJ1bidzIGlzb2xhdGVkIGxpbmtlciB3aGVyZSB0aGUgdW5kZWNsYXJlZCBAdHlwZXMvbm9kZSBpcyB1bnJlc29sdmFibGUgKFRTMjY4OCkuXG4gIGlmICghY29uZmlnLmlzRXNtUGFja2FnZSkge1xuICAgIHJldHVybiBgJHttYW5hZ2VkQ29uZmlnQmxvY2tzLmdldEJsb2NrKFxuICAgICAgJ2Jhc2UnLFxuICAgICAgYGltcG9ydCB0eXBlIHsgT3hmbXRDb25maWcgfSBmcm9tICdveGZtdCc7XG5cbi8vIG94bGludC1kaXNhYmxlIHVuaWNvcm4vcHJlZmVyLW1vZHVsZSAtLSBPeGZtdCBjb25maWcgZmlsZXMgYXJlIG9ubHkgYXV0by1kaXNjb3ZlcmVkIGFzIC50cywgYW5kIENvbW1vbkpTIGF2b2lkcyBFU00gcGFja2FnZSBsb2FkaW5nIGlzc3Vlcy5cbmNvbnN0IG94Zm10Q29uZmlnID0gcmVxdWlyZSgnJHtveGZtdEJhc2VDb25maWdNb2R1bGV9Jyk7XG5cbmNvbnN0IG94Zm10UmVzb2x2ZWRDb25maWc6IE94Zm10Q29uZmlnID0gb3hmbXRDb25maWcuZGVmYXVsdCA/PyBveGZtdENvbmZpZztgXG4gICAgKX1cblxuJHttYW5hZ2VkQ29uZmlnQmxvY2tzLmdldEJsb2NrKCdleHBvcnQnLCAnbW9kdWxlLmV4cG9ydHMgPSBveGZtdFJlc29sdmVkQ29uZmlnOycpfVxuYDtcbiAgfVxuXG4gIHJldHVybiBgJHttYW5hZ2VkQ29uZmlnQmxvY2tzLmdldEJsb2NrKFxuICAgICdiYXNlJyxcbiAgICBgaW1wb3J0IHR5cGUgeyBPeGZtdENvbmZpZyB9IGZyb20gJ294Zm10JztcblxuaW1wb3J0IGNvbmZpZyBmcm9tICcke294Zm10QmFzZUNvbmZpZ01vZHVsZX0nO1xuXG5jb25zdCBveGZtdFJlc29sdmVkQ29uZmlnOiBPeGZtdENvbmZpZyA9IGNvbmZpZztgXG4gICl9XG5cbiR7bWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRCbG9jaygnZXhwb3J0JywgJ2V4cG9ydCBkZWZhdWx0IG94Zm10UmVzb2x2ZWRDb25maWc7Jyl9XG5gO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7XG4gIGlzUHVibGlzaGVkV2lsbGJvb3N0ZXJDb25maWdzUGFja2FnZSxcbiAgcmVzb2x2ZVdpbGxib29zdGVyQ29uZmlnTW9kdWxlLFxufSBmcm9tICcuLi91dGlscy93aWxsYm9vc3RlckNvbmZpZ3NVdGlsLmpzJztcblxuaW1wb3J0IHsgbm9ybWFsaXplQ29uZmlnQ29udGVudCB9IGZyb20gJy4vY29uZmlnQ29udGVudC5qcyc7XG5pbXBvcnQgeyBNYW5hZ2VkQ29uZmlnQmxvY2tzIH0gZnJvbSAnLi9tYW5hZ2VkQ29uZmlnQmxvY2suanMnO1xuXG5jb25zdCBtYW5hZ2VkQ29uZmlnQmxvY2tzID0gbmV3IE1hbmFnZWRDb25maWdCbG9ja3Moe1xuICBibG9ja05hbWVzOiBbJ2Jhc2UnLCAnZXhwb3J0J10sXG4gIG1hcmtlclByZWZpeDogJ294bGludCcsXG4gIHRvb2xOYW1lOiAnb3hsaW50Jyxcbn0pO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVPeGxpbnRDb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBfcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlT3hsaW50Q29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIC8vIHdpbGxib29zdGVyLWNvbmZpZ3MgcHVibGlzaGVzIGNvbmZpZyBmaWxlcyBhcyBwcm9kdWN0IGNvZGUsIHNvIGdlbmVyYXRpb25cbiAgICAvLyBtdXN0IG5vdCByZXBsYWNlIHBhY2thZ2UtcHJvdmlkZWQgbGludGVyIHNldHRpbmdzLiBHZW5lcmF0ZWQgZmlsZXMgd2l0aFxuICAgIC8vIG1hbmFnZWQgYmxvY2tzIGFyZSBzdGlsbCBzYWZlIHRvIHVwZGF0ZS5cbiAgICBjb25zdCBzaG91bGRQcmVzZXJ2ZVB1Ymxpc2hlZExpbnRlckNvbmZpZyA9IGlzUHVibGlzaGVkV2lsbGJvb3N0ZXJDb25maWdzUGFja2FnZShjb25maWcpO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnb3hsaW50LmNvbmZpZy50cycpO1xuICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgICBjb25zdCBzaG91bGRQcmVzZXJ2ZUV4aXN0aW5nQ29udGVudCA9XG4gICAgICBzaG91bGRQcmVzZXJ2ZVB1Ymxpc2hlZExpbnRlckNvbmZpZyAmJiBleGlzdGluZ0NvbnRlbnQgJiYgIW1hbmFnZWRDb25maWdCbG9ja3MuaGFzTWFuYWdlZEJsb2NrcyhleGlzdGluZ0NvbnRlbnQpO1xuICAgIGNvbnN0IGRlc2lyZWRDb250ZW50ID0gc2hvdWxkUHJlc2VydmVFeGlzdGluZ0NvbnRlbnRcbiAgICAgID8gZXhpc3RpbmdDb250ZW50XG4gICAgICA6IG1hbmFnZWRDb25maWdCbG9ja3MuZ2V0Q29uZmlnQ29udGVudCh7XG4gICAgICAgICAgZGVzaXJlZENvbnRlbnQ6IGdldENvbmZpZ0NvbnRlbnQoY29uZmlnKSxcbiAgICAgICAgICBleGlzdGluZ0NvbnRlbnQsXG4gICAgICAgICAgZmlsZVBhdGgsXG4gICAgICAgIH0pO1xuXG4gICAgaWYgKG5vcm1hbGl6ZUNvbmZpZ0NvbnRlbnQoZXhpc3RpbmdDb250ZW50KSAhPT0gbm9ybWFsaXplQ29uZmlnQ29udGVudChkZXNpcmVkQ29udGVudCkpIHtcbiAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGRlc2lyZWRDb250ZW50KTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRDb25maWdDb250ZW50KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIGNvbnN0IGlzUm9vdENvbmZpZyA9IGNvbmZpZy5pc1Jvb3Q7XG4gIGNvbnN0IG94bGludEJhc2VDb25maWdNb2R1bGUgPSByZXNvbHZlV2lsbGJvb3N0ZXJDb25maWdNb2R1bGUoY29uZmlnLCAnQHdpbGxib29zdGVyL294bGludC1jb25maWcnKTtcblxuICAvLyBEbyBub3QgY29sbGFwc2UgdGhpcyB0byBhIHN0YXRpYyBpbXBvcnQgZm9yIGV2ZXJ5IHBhY2thZ2UuIENvbW1vbkpTIHBhY2thZ2VzXG4gIC8vIHR5cGUtY2hlY2sgYXV0by1kaXNjb3ZlcmVkIG94bGludC5jb25maWcudHMgYXMgQ29tbW9uSlMsIHNvIGltcG9ydGluZyB0aGUgRVNNXG4gIC8vIEB3aWxsYm9vc3Rlci9veGxpbnQtY29uZmlnIHBhY2thZ2UgdHJpZ2dlcnMgVFMxNDc5LiBLZWVwIHRoaXMgaW4gc3luYyB3aXRoXG4gIC8vIGxpdGVyYWN5LXRlc3QncyBnZW5lcmF0ZWQgY29uZmlnIHBhdHRlcm4uXG4gIC8vIE5vIC8vLyA8cmVmZXJlbmNlIHR5cGVzPiBsaW5lOiB0aGUgd2JmeS1nZW5lcmF0ZWQgdHNjb25maWcgYWxyZWFkeSBjb3ZlcnMgKi5jb25maWcudHMgd2l0aFxuICAvLyB0eXBlcyBbXCJidW5cIl0sIHdoaWNoIHR5cGVzIHJlcXVpcmUvbW9kdWxlLmV4cG9ydHMsIHdoaWxlIGEgXCJub2RlXCIgcmVmZXJlbmNlIGJyZWFrcyB1bmRlclxuICAvLyBCdW4ncyBpc29sYXRlZCBsaW5rZXIgd2hlcmUgdGhlIHVuZGVjbGFyZWQgQHR5cGVzL25vZGUgaXMgdW5yZXNvbHZhYmxlIChUUzI2ODgpLlxuICBpZiAoIWNvbmZpZy5pc0VzbVBhY2thZ2UpIHtcbiAgICByZXR1cm4gYCR7bWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRCbG9jayhcbiAgICAgICdiYXNlJyxcbiAgICAgIGBpbXBvcnQgdHlwZSB7IE94bGludENvbmZpZyB9IGZyb20gJ294bGludCc7XG5cbi8vIG94bGludC1kaXNhYmxlIHVuaWNvcm4vcHJlZmVyLW1vZHVsZSAtLSBPeGxpbnQgb25seSBhdXRvLWRpc2NvdmVycyAudHMgY29uZmlnIGZpbGVzLCBhbmQgQ29tbW9uSlMgYXZvaWRzIEVTTSBwYWNrYWdlIGxvYWRpbmcgaXNzdWVzLlxuY29uc3Qgb3hsaW50QmFzZUNvbmZpZyA9IHJlcXVpcmUoJyR7b3hsaW50QmFzZUNvbmZpZ01vZHVsZX0nKTtcblxuJHtnZXRSZXNvbHZlZENvbmZpZ0NvbnRlbnQoJ294bGludEJhc2VDb25maWcuZGVmYXVsdCA/PyBveGxpbnRCYXNlQ29uZmlnJywgaXNSb290Q29uZmlnKX1gXG4gICAgKX1cblxuJHttYW5hZ2VkQ29uZmlnQmxvY2tzLmdldEJsb2NrKCdleHBvcnQnLCAnbW9kdWxlLmV4cG9ydHMgPSBveGxpbnRSZXNvbHZlZENvbmZpZzsnKX1cbmA7XG4gIH1cblxuICByZXR1cm4gYCR7bWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRCbG9jayhcbiAgICAnYmFzZScsXG4gICAgYGltcG9ydCB0eXBlIHsgT3hsaW50Q29uZmlnIH0gZnJvbSAnb3hsaW50JztcblxuaW1wb3J0IG94bGludEJhc2VDb25maWcgZnJvbSAnJHtveGxpbnRCYXNlQ29uZmlnTW9kdWxlfSc7XG5cbiR7Z2V0UmVzb2x2ZWRDb25maWdDb250ZW50KCdveGxpbnRCYXNlQ29uZmlnJywgaXNSb290Q29uZmlnKX1gXG4gICl9XG5cbiR7bWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRCbG9jaygnZXhwb3J0JywgJ2V4cG9ydCBkZWZhdWx0IG94bGludFJlc29sdmVkQ29uZmlnOycpfVxuYDtcbn1cblxuLy8gc3RydWN0dXJlZENsb25lIGtlZXBzIGEgcGFja2FnZS1sb2NhbCBjb3B5IHNvIHJlcG9zaXRvcmllcyBjYW4gYWRkIHNldHRpbmdzIG91dHNpZGUgbWFuYWdlZFxuLy8gYmxvY2tzIHdpdGhvdXQgbXV0YXRpbmcgdGhlIHNoYXJlZCBpbXBvcnRlZCBjb25maWcgb2JqZWN0LiBUaGUgcm9vdCBjb25maWcgZm9yY2VzIHRoZSB0eXBlLWF3YXJlXG4vLyBvcHRpb25zIG9uIGluc2lkZSB0aGUgbWFuYWdlZCBibG9jayBzbyBubyBjdXN0b21pemF0aW9uIGNhbiBzaWxlbnRseSBkaXNhYmxlIHR5cGUgY2hlY2tpbmc7IGV2ZXJ5XG4vLyBvdGhlciBjb25maWcgZGVsZXRlcyB0aGVtIGJlY2F1c2UgT3hsaW50IHJlamVjdHMgdGhvc2Ugcm9vdC1vbmx5IG9wdGlvbnMgZWxzZXdoZXJlICh0eXBlIGNoZWNraW5nXG4vLyBzdXJ2aXZlczogdGhlIGxpbnQgY29tbWFuZHMgcGFzcyAtLXR5cGUtYXdhcmUgYW5kIC0tdHlwZS1jaGVjayBleHBsaWNpdGx5KS5cbmZ1bmN0aW9uIGdldFJlc29sdmVkQ29uZmlnQ29udGVudChiYXNlQ29uZmlnTmFtZTogc3RyaW5nLCBpc1Jvb3RDb25maWc6IGJvb2xlYW4pOiBzdHJpbmcge1xuICBpZiAoaXNSb290Q29uZmlnKSB7XG4gICAgcmV0dXJuIGBjb25zdCBveGxpbnRSZXNvbHZlZENvbmZpZzogT3hsaW50Q29uZmlnID0gc3RydWN0dXJlZENsb25lKCR7YmFzZUNvbmZpZ05hbWV9KTtcbm94bGludFJlc29sdmVkQ29uZmlnLm9wdGlvbnMgPSB7IC4uLm94bGludFJlc29sdmVkQ29uZmlnLm9wdGlvbnMsIHR5cGVBd2FyZTogdHJ1ZSwgdHlwZUNoZWNrOiB0cnVlIH07YDtcbiAgfVxuXG4gIHJldHVybiBgY29uc3Qgb3hsaW50UmVzb2x2ZWRDb25maWc6IE94bGludENvbmZpZyA9IHN0cnVjdHVyZWRDbG9uZSgke2Jhc2VDb25maWdOYW1lfSk7XG5kZWxldGUgb3hsaW50UmVzb2x2ZWRDb25maWcub3B0aW9ucztgO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGNvbW1vbkNvbnRlbnQgPSBgXG4zcmQtcGFydHkvXG5hbmRyb2lkL1xuaW9zL1xubm8tZm9ybWF0L1xudGVzdC1maXh0dXJlcy9cbnRlc3QvZml4dHVyZXMvXG4qLmQudHNcbioubWluLmpzXG4ueWFybi9cbi5wbnAuanNcbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVByZXR0aWVyaWdub3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUHJldHRpZXJpZ25vcmUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcucHJldHRpZXJpZ25vcmUnKTtcbiAgICBjb25zdCBjb250ZW50ID0gKGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKSkgPz8gJyc7XG4gICAgY29uc3QgaGVhZFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQpO1xuICAgIGNvbnN0IHRhaWxVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldFRhaWxVc2VyQ29udGVudChjb250ZW50KTtcblxuICAgIGNvbnN0IGdpdGlnbm9yZUZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGlnbm9yZScpO1xuICAgIGNvbnN0IGdpdGlnbm9yZUNvbnRlbnQgPSAoYXdhaXQgaWdub3JlRmlsZVV0aWwucmVhZEdpdGlnbm9yZVdpdGhvdXRTZXBhcmF0b3JzKGdpdGlnbm9yZUZpbGVQYXRoKSkgfHwgJyc7XG5cbiAgICBsZXQgYWRkaXRpb25hbENvbnRlbnQgPSAnJztcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgIGFkZGl0aW9uYWxDb250ZW50ID0gYFxuYW5kcm9pZC9hcHAvXG5pb3MvUnVubmVyL0Fzc2V0cy54Y2Fzc2V0cy9cbnB1YnNwZWMueWFtbFxuYDtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdDb250ZW50ID0gaGVhZFVzZXJDb250ZW50ICsgY29tbW9uQ29udGVudCArIGFkZGl0aW9uYWxDb250ZW50ICsgZ2l0aWdub3JlQ29udGVudCArIHRhaWxVc2VyQ29udGVudDtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsganNvbmNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvanNvbmNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHNvcnRLZXlzIH0gZnJvbSAnLi4vdXRpbHMvb2JqZWN0VXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QganNvbk9iaiA9IHtcbiAgdmVudlBhdGg6ICcuJyxcbiAgdmVudjogJy52ZW52Jyxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVB5cmlnaHRDb25maWdKc29uKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgbGV0IG5ld1NldHRpbmdzOiBvYmplY3QgPSBzdHJ1Y3R1cmVkQ2xvbmUoanNvbk9iaik7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdweXJpZ2h0Y29uZmlnLmpzb24nKTtcbiAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpO1xuICAgIGxldCBvcmlnaW5hbFNldHRpbmdzSnNvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmIChvbGRDb250ZW50ICE9PSB1bmRlZmluZWQgJiYgIWpzb25jVXRpbC5pc1RyaXZpYU9ubHkob2xkQ29udGVudCkpIHtcbiAgICAgIC8vIHB5cmlnaHRjb25maWcuanNvbiBhbGxvd3MgSlNPTkM7IGFuIGV4aXN0aW5nIGZpbGUgd2JmeSBjYW5ub3QgcGFyc2UgbXVzdCBiZSBsZWZ0XG4gICAgICAvLyB1bnRvdWNoZWQgaW5zdGVhZCBvZiBiZWluZyBvdmVyd3JpdHRlbiB3aXRoIHRoZSBiYXJlIHRlbXBsYXRlLlxuICAgICAgY29uc3Qgb2xkU2V0dGluZ3MgPSBqc29uY1V0aWwucGFyc2VPYmplY3RJZ25vcmluZ0Vycm9yPG9iamVjdD4ob2xkQ29udGVudCk7XG4gICAgICBpZiAoIW9sZFNldHRpbmdzKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCBnZW5lcmF0aW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgdGhlIGV4aXN0aW5nIGNvbnRlbnQgaXMgbm90IHBhcnNhYmxlIGFzIEpTT05DLmApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBvcmlnaW5hbFNldHRpbmdzSnNvbiA9IEpTT04uc3RyaW5naWZ5KHNvcnRLZXlzKHN0cnVjdHVyZWRDbG9uZShvbGRTZXR0aW5ncykgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pKTtcbiAgICAgIG5ld1NldHRpbmdzID0gbWVyZ2UuYWxsKFtuZXdTZXR0aW5ncywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzXSwgeyBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSB9KTtcbiAgICB9XG4gICAgLy8gU2tpcCB0aGUgd3JpdGUgd2hlbiBub3RoaW5nIGNoYW5nZXMgc2VtYW50aWNhbGx5LCBzbyBKU09OQyBjb21tZW50cyBhbmQgZm9ybWF0dGluZyBpbiBhblxuICAgIC8vIGFscmVhZHktY2xlYW4gcHlyaWdodGNvbmZpZy5qc29uIHN1cnZpdmUgd2JmeSBydW5zLlxuICAgIGlmIChvcmlnaW5hbFNldHRpbmdzSnNvbiA9PT0gSlNPTi5zdHJpbmdpZnkoc29ydEtleXMoc3RydWN0dXJlZENsb25lKG5ld1NldHRpbmdzKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShuZXdTZXR0aW5ncywgdW5kZWZpbmVkLCAyKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGNvbnN1bWVzRG9ja2VyRW52IH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IG1hbmFnZWRTY3JpcHRzQmxvY2sgPSBgc2NyaXB0cy8qKlxuIXNjcmlwdHMvXG4hc2NyaXB0cy8qLnNoYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFJhaWx3YXlpZ25vcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4UmFpbHdheWlnbm9yZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5yYWlsd2F5aWdub3JlJyk7XG4gICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgICBjb25zdCB1c2VzRG9ja2VyRW52ID0gY29uc3VtZXNEb2NrZXJFbnYoY29uZmlnLmRvY2tlcmZpbGUpO1xuICAgIGlmICghY29udGVudCkge1xuICAgICAgaWYgKGNvbmZpZy5pc1JhaWx3YXkgJiYgdXNlc0RvY2tlckVudikge1xuICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgJyEuZG9ja2VyLmVudlxcbicpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgbmV3Q29udGVudCA9IGNvbnRlbnQucmVwbGFjZSgvXnNjcmlwdHNcXC8kL20sIG1hbmFnZWRTY3JpcHRzQmxvY2spO1xuICAgIC8vIGByYWlsd2F5IHVwYCBzdHJpcHMgZ2l0aWdub3JlZCBmaWxlcyBmcm9tIHRoZSB1cGxvYWRlZCBidWlsZCBjb250ZXh0LCBzbyB0aGUgZ2VuZXJhdGVkXG4gICAgLy8gbm9uLXNlY3JldCAuZG9ja2VyLmVudiAoYHdiIGdlbi1kb2NrZXItZW52YCBvdXRwdXQpIG5lZWRzIGFuIGV4cGxpY2l0IHVuLWlnbm9yZSB0byByZWFjaFxuICAgIC8vIHRoZSByZW1vdGUgRG9ja2VyIGJ1aWxkLiBBcHBlbmRlZCwgbm90IHByZXBlbmRlZDogaWdub3JlIGZpbGVzIGFyZSBsYXN0LW1hdGNoLXdpbnMsIHNvIGFcbiAgICAvLyBoYW5kLXdyaXR0ZW4gcGF0dGVybiBzdWNoIGFzIGAqLmVudmAgZWFybGllciBpbiB0aGUgZmlsZSBtdXN0IG5vdCBzaWxlbnRseSByZS1leGNsdWRlIGl0LlxuICAgIGlmICh1c2VzRG9ja2VyRW52ICYmICEvXiFcXC5kb2NrZXJcXC5lbnYkL20udGVzdChuZXdDb250ZW50KSkge1xuICAgICAgbmV3Q29udGVudCA9IGAke25ld0NvbnRlbnQucmVwbGFjZSgvXFxuPyQvLCAnXFxuJyl9IS5kb2NrZXIuZW52XFxuYDtcbiAgICB9IGVsc2UgaWYgKGNvbmZpZy5kb2NrZXJmaWxlICYmICF1c2VzRG9ja2VyRW52KSB7XG4gICAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlKC9eIVxcLmRvY2tlclxcLmVudlxcbj8vbSwgJycpO1xuICAgIH1cbiAgICBpZiAobmV3Q29udGVudCA9PT0gY29udGVudCkgcmV0dXJuO1xuXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICBuZXdDb250ZW50ID8gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkgOiBmc1V0aWwucmVtb3ZlQ29uZmluZWQoZmlsZVBhdGgpXG4gICAgKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IEltYWdlLCBMaW5rLCBQYXJhZ3JhcGgsIFBocmFzaW5nQ29udGVudCwgUm9vdENvbnRlbnQgfSBmcm9tICdtZGFzdCc7XG5pbXBvcnQgeyBmcm9tTWFya2Rvd24gfSBmcm9tICdtZGFzdC11dGlsLWZyb20tbWFya2Rvd24nO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBqb2JzQWxsQ2FsbFJldXNhYmxlV29ya2Zsb3cgfSBmcm9tICcuL3dvcmtmbG93LmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBnZXRPY3Rva2l0IH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IGdldFdiZnlWZXJzaW9uTGFiZWwgfSBmcm9tICcuLi91dGlscy92ZXJzaW9uLmpzJztcblxuY29uc3Qgc2VtYW50aWNSZWxlYXNlQmFkZ2UgPVxuICAnWyFbc2VtYW50aWMtcmVsZWFzZV0oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9iYWRnZS8lMjAlMjAlRjAlOUYlOTMlQTYlRjAlOUYlOUElODAtc2VtYW50aWMtLXJlbGVhc2UtZTEwMDc5LnN2ZyldKGh0dHBzOi8vZ2l0aHViLmNvbS9zZW1hbnRpYy1yZWxlYXNlL3NlbWFudGljLXJlbGVhc2UpJztcblxuY29uc3Qgd2JmeUJhZGdlVXJsUHJlZml4ID0gJ2h0dHBzOi8vaW1nLnNoaWVsZHMuaW8vYmFkZ2Uvd2JmeS0nO1xuY29uc3Qgd2JmeUJhZGdlVXJsU3VmZml4ID0gJy0xZTkwZmYuc3ZnJztcbmNvbnN0IHdiZnlCYWRnZUxpbmsgPSAnaHR0cHM6Ly9naXRodWIuY29tL1dpbGxCb29zdGVyL3NoYXJlZC90cmVlL21haW4vcGFja2FnZXMvd2JmeSc7XG5cbmNvbnN0IG5wbVBhY2thZ2VVcmxQcmVmaXggPSAnaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvJztcbmNvbnN0IG5wbUxpY2Vuc2VCYWRnZVBhdHRlcm4gPSAvXlxcWyFcXFtbXlxcXV0qXFxdXFwoaHR0cHM6XFwvXFwvaW1nXFwuc2hpZWxkc1xcLmlvXFwvbnBtXFwvbFxcL1teKVxcc10rXFwpXFxdXFwoW14pXFxzXStcXCkkL3U7XG5cbmNvbnN0IG1hbmFnZWRCYWRnZVBhdHRlcm5zID0gW1xuICAvXlxcWyFcXFt3YmZ5XFxdXFwoaHR0cHM6XFwvXFwvaW1nXFwuc2hpZWxkc1xcLmlvXFwvYmFkZ2VcXC93YmZ5LVteKVxcc10rLTFlOTBmZlxcLnN2Z1xcKVxcXVxcKGh0dHBzOlxcL1xcL2dpdGh1YlxcLmNvbVxcL1dpbGxCb29zdGVyXFwvc2hhcmVkXFwvdHJlZVxcL21haW5cXC9wYWNrYWdlc1xcL3diZnlcXCkkL3UsXG4gIC9eXFxbIVxcW1teXFxdXSpcXF1cXCgoaHR0cHM6XFwvXFwvZ2l0aHViXFwuY29tXFwvW14pXFxzXStcXC9hY3Rpb25zXFwvd29ya2Zsb3dzXFwvW14pXFxzXSspXFwvYmFkZ2VcXC5zdmdcXClcXF1cXChcXDFcXCkkL3UsXG4gIC9eXFxbIVxcW1teXFxdXSpcXF1cXChbXilcXHNdK1xcKVxcXVxcKGh0dHBzPzpcXC9cXC8oPzp3d3dcXC4pP25wbWpzXFwuY29tXFwvcGFja2FnZVxcL1teKVxcc10qXFwpJC91LFxuICBucG1MaWNlbnNlQmFkZ2VQYXR0ZXJuLFxuXTtcblxuZnVuY3Rpb24gYnVpbGRXYmZ5QmFkZ2UobGFiZWw6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIEh5cGhlbnMgYXJlIGVzY2FwZWQgYXMgYC0tYCBwZXIgc2hpZWxkcy5pbydzIGJhZGdlIHBhdGggc3ludGF4LCBzbyBgdjEuMi4zLXJjLjFgIHN0YXlzIGludGFjdC5cbiAgcmV0dXJuIGBbIVt3YmZ5XSgke3diZnlCYWRnZVVybFByZWZpeH0ke2xhYmVsLnJlcGxhY2VBbGwoJy0nLCAnLS0nKX0ke3diZnlCYWRnZVVybFN1ZmZpeH0pXSgke3diZnlCYWRnZUxpbmt9KWA7XG59XG5cbi8qKiBUaGUgdmVyc2lvbiBsYWJlbCB0aGUgd2JmeSBiYWRnZSBpbiB0aGUgcmVwb3NpdG9yeSdzIFJFQURNRSByZWNvcmRzLCBpLmUuIHRoZSBidWlsZCB0aGF0IHdiZmllZCBpdC4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkQXBwbGllZFdiZnlWZXJzaW9uTGFiZWwoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgLy8gQ29uZmluZWQsIGFuZCB0b2xlcmFudCBvZiBhbnkgcmVhZCBmYWlsdXJlOiBhIFJFQURNRSB0aGF0IHJlc29sdmVzIG91dHNpZGUgdGhlIHJlcG9zaXRvcnkgKGFcbiAgLy8gY29tbWl0dGVkIHN5bWxpbmspIG9yIGNhbm5vdCBiZSByZWFkIGF0IGFsbCBzYXlzIG5vdGhpbmcgYWJvdXQgd2hpY2ggYnVpbGQgY29uZmlndXJlZCBUSElTXG4gIC8vIHJlcG9zaXRvcnksIGFuZCB0aGUgYW5zd2VyIG9ubHkgZXZlciBzdXBwcmVzc2VzIHdvcmsg4oCUIHNvIGFueXRoaW5nIGJ1dCBhIHJlYWRhYmxlIGluLXJlcG9zaXRvcnlcbiAgLy8gUkVBRE1FIG1lYW5zIFwibm90IGtub3duIHRvIGJlIGFwcGxpZWRcIiBhbmQgdGhlIHJ1biBwcm9jZWVkcy5cbiAgY29uc3QgcmVhZG1lID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlQ29uZmluZWRJZkV4aXN0cyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ1JFQURNRS5tZCcpKS5jYXRjaCgoKSA9PiB7fSk7XG4gIGlmIChyZWFkbWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAvLyBUaGUgUkVBRE1FIGlzIHBhcnNlZCByYXRoZXIgdGhhbiBzY2FubmVkLCBmb3IgdGhlIHNhbWUgcmVhc29uIHdyaXRlQmFkZ2VCbG9jayBwYXJzZXMgaXQsIGFuZFxuICAvLyBvbmx5IHRoZSBzaGFwZSB3cml0ZUJhZGdlQmxvY2sgaXRzZWxmIHdyaXRlcyBjb3VudHMgYXMgYW4gYXBwbGllZCBiYWRnZTogYSB0b3AtbGV2ZWwgcGFyYWdyYXBoXG4gIC8vIG9mIGJhZGdlcy4gQSBiYWRnZSBhbnl3aGVyZSBlbHNlIGlzIGNvbnRlbnQgdGhhdCBtZXJlbHkgbWVudGlvbnMgb25lIOKAlCBhIGZlbmNlZCBleGFtcGxlICh3YmZ5J3NcbiAgLy8gb3duIGRvY3VtZW50YXRpb24gaGFzIHRob3NlKSwgYSBibG9jayBxdW90ZSwgYSBsaXN0IGl0ZW0g4oCUIGFuZCByZWFkaW5nIGl0IGFzIGFwcGxpZWQgd291bGQgc2tpcFxuICAvLyBldmVyeSBmaXhlciBmb3IgdGhlIHJlcG9zaXRvcnkuXG4gIGZvciAoY29uc3Qgbm9kZSBvZiBmcm9tTWFya2Rvd24ocmVhZG1lKS5jaGlsZHJlbikge1xuICAgIGlmICghaXNCYWRnZUJsb2NrTm9kZShub2RlKSkgY29udGludWU7XG4gICAgZm9yIChjb25zdCBiYWRnZSBvZiBub2RlLmNoaWxkcmVuKSB7XG4gICAgICBpZiAoIWlzQmFkZ2VOb2RlKGJhZGdlKSkgY29udGludWU7XG4gICAgICBjb25zdCB7IHVybCB9ID0gYmFkZ2UuY2hpbGRyZW5bMF07XG4gICAgICBpZiAodXJsLnN0YXJ0c1dpdGgod2JmeUJhZGdlVXJsUHJlZml4KSAmJiB1cmwuZW5kc1dpdGgod2JmeUJhZGdlVXJsU3VmZml4KSkge1xuICAgICAgICByZXR1cm4gdXJsLnNsaWNlKHdiZnlCYWRnZVVybFByZWZpeC5sZW5ndGgsIC13YmZ5QmFkZ2VVcmxTdWZmaXgubGVuZ3RoKS5yZXBsYWNlQWxsKCctLScsICctJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVJlYWRtZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVJlYWRtZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ1JFQURNRS5tZCcpO1xuICAgIC8vIFRoZSB3YmZ5IGJhZGdlIG1hcmtzIGEgcmVwb3NpdG9yeSBhcyB3YmZpZWQsIHNvIGEgcmVwb3NpdG9yeSB3aXRob3V0IGEgUkVBRE1FIHN0aWxsIGdldHMgb25lLlxuICAgIC8vIHJlYWRGaWxlSWZFeGlzdHMgZmFsbHMgYmFjayBPTkxZIG9uIEVOT0VOVDogYSBSRUFETUUgdGhhdCBleGlzdHMgYnV0IGNhbm5vdCBiZSByZWFkIChlLmcuXG4gICAgLy8gcGVybWlzc2lvbnMsIEVNRklMRSkgbXVzdCBhYm9ydCB0aGUgZ2VuZXJhdG9yIGluc3RlYWQgb2YgYmVpbmcgb3ZlcndyaXR0ZW4gd2l0aCB0aGUgc3R1Yi5cbiAgICBsZXQgbmV3Q29udGVudCA9XG4gICAgICAoYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpKSA/P1xuICAgICAgYCMgJHtjb25maWcucGFja2FnZUpzb24/Lm5hbWUgPz8gcGF0aC5iYXNlbmFtZShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgpKX1cXG5gO1xuXG4gICAgLy8gT3JkZXJlZCBieSB3aGF0IGEgcmVhZGVyIGNhcmVzIGFib3V0IG1vc3Q6IHRoZSBucG0gYmFkZ2UgbmFtZXMgdGhlIHBhY2thZ2UgYSByZWFkZXIgaW5zdGFsbHMsXG4gICAgLy8gdGhlbiB0aGUgd29ya2Zsb3cgYmFkZ2VzIHJlcG9ydCB3aGV0aGVyIHRoZSBjb2RlIGlzIGN1cnJlbnRseSBoZWFsdGh5LCB0aGVuIGhvdyBpdCBpc1xuICAgIC8vIHJlbGVhc2VkLCBhbmQgbGFzdCB0aGUgd2JmeSBidWlsZCB0aGF0IGNvbmZpZ3VyZWQgaXQuXG4gICAgY29uc3QgYmFkZ2VzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHBhY2thZ2VOYW1lID0gYXdhaXQgZ2V0UHVibGlzaGVkTnBtUGFja2FnZU5hbWUoY29uZmlnKTtcbiAgICBpZiAocGFja2FnZU5hbWUpIHtcbiAgICAgIGJhZGdlcy5wdXNoKGJ1aWxkTnBtQmFkZ2UocGFja2FnZU5hbWUpKTtcbiAgICAgIGNvbnN0IGxpY2Vuc2UgPSBjb25maWcucGFja2FnZUpzb24/LmxpY2Vuc2U7XG4gICAgICBpZiAobGljZW5zZSAmJiBsaWNlbnNlICE9PSAnVU5MSUNFTlNFRCcpIHtcbiAgICAgICAgYmFkZ2VzLnB1c2goYnVpbGRMaWNlbnNlQmFkZ2UocGFja2FnZU5hbWUpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgYmFkZ2VzLnB1c2goLi4uKGF3YWl0IGJ1aWxkV29ya2Zsb3dCYWRnZXMoY29uZmlnKSkpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5yZWxlYXNlcmMuanNvbicpKSkgYmFkZ2VzLnB1c2goc2VtYW50aWNSZWxlYXNlQmFkZ2UpO1xuICAgIGJhZGdlcy5wdXNoKGJ1aWxkV2JmeUJhZGdlKGdldFdiZnlWZXJzaW9uTGFiZWwoKSA/PyAnYXBwbGllZCcpKTtcblxuICAgIC8vIFRoZSBibG9jayBpcyB3cml0dGVuIGluIG9uZSBwYXNzIGZyb20gdGhlIGJhZGdlcyB3YmZ5IG1hbmFnZXMgcmlnaHQgbm93LiBBIGJhZGdlIHRoYXQgaXMgbm9cbiAgICAvLyBsb25nZXIgd2FudGVkIOKAlCBhIHN1cGVyc2VkZWQgdmVyc2lvbiwgb3Igb25lIHdob3NlIHdvcmtmbG93IGlzIGdvbmUg4oCUIHNpbXBseSBpcyBub3QgaW4gdGhlXG4gICAgLy8gbGlzdCwgc28gbm90aGluZyBoYXMgdG8gcmVtb3ZlIGl0LlxuICAgIG5ld0NvbnRlbnQgPSB3cml0ZUJhZGdlQmxvY2sobmV3Q29udGVudCwgYmFkZ2VzKTtcblxuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50LCBnZXRMaW5lRW5kaW5nKG5ld0NvbnRlbnQpKSk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRQdWJsaXNoZWROcG1QYWNrYWdlTmFtZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBwYWNrYWdlSnNvbiA9IGNvbmZpZy5wYWNrYWdlSnNvbjtcbiAgLy8gQSBtb25vcmVwbyBoYXMgbm8gc2luZ2xlIG5wbSB2ZXJzaW9uIHJlcHJlc2VudGluZyB0aGUgd2hvbGUgcmVwb3NpdG9yeS5cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucyB8fCAhY29uZmlnLnJlbGVhc2UubnBtIHx8ICFwYWNrYWdlSnNvbj8ubmFtZSB8fCBwYWNrYWdlSnNvbi5wcml2YXRlKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gKGF3YWl0IGlzTWlzc2luZ0Zyb21OcG1SZWdpc3RyeShwYWNrYWdlSnNvbi5uYW1lKSkgPyB1bmRlZmluZWQgOiBwYWNrYWdlSnNvbi5uYW1lO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIHJlZ2lzdHJ5IGFuc3dlcnMgdGhhdCBpdCBoYXMgbm8gc3VjaCBwYWNrYWdlIOKAlCB0aGUgT05MWSBhbnN3ZXIgdGhhdCByZW1vdmVzIGEgYmFkZ2UuXG4gKiBBIGNoZWNrIHRoYXQgY2Fubm90IHJ1biAob2ZmbGluZSwgYW4gb3V0YWdlLCBhIHRpbWVvdXQpIHNheXMgbm90aGluZyBhYm91dCB0aGUgcGFja2FnZSwgYW5kXG4gKiB0cmVhdGluZyBpdCBhcyBhYnNlbnQgd291bGQgc3RyaXAgdGhlIGJhZGdlIG91dCBvZiBldmVyeSBwdWJsaXNoZWQgcmVwb3NpdG9yeSB3YmZ5IHRvdWNoZXNcbiAqIGR1cmluZyB0aGUgb3V0YWdlIGFuZCBwdXQgaXQgYmFjayBhZnRlcndhcmRzLlxuICovXG5hc3luYyBmdW5jdGlvbiBpc01pc3NpbmdGcm9tTnBtUmVnaXN0cnkocGFja2FnZU5hbWU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICB0cnkge1xuICAgIC8vIFRoZSBzY29wZSBzZXBhcmF0b3IgbXVzdCBzdXJ2aXZlIGFzIGEgcGF0aCBzZWdtZW50LCBzbyB0aGUgbmFtZSBpcyBlbmNvZGVkIHBpZWNld2lzZS5cbiAgICBjb25zdCBlbmNvZGVkTmFtZSA9IHBhY2thZ2VOYW1lLnNwbGl0KCcvJykubWFwKGVuY29kZVVSSUNvbXBvbmVudCkuam9pbignLycpO1xuICAgIC8vIEEgYmFkZ2UgaXMgZGVjb3JhdGlvbjogYSBzdGFsbGVkIHJlZ2lzdHJ5IGNvbm5lY3Rpb24gbXVzdCBub3QgaG9sZCB0aGUgd2hvbGUgcnVuIGZvciBob3dldmVyXG4gICAgLy8gbG9uZyB0aGUgbmV0d29ya2luZyBzdGFjayB3b3VsZCB3YWl0LiBUaGUgYnVkZ2V0IGlzIGdlbmVyb3VzIGJlY2F1c2UgYSB0aW1lb3V0IGFuc3dlcnNcbiAgICAvLyBcInVua25vd25cIiwgd2hpY2gga2VlcHMgdGhlIGJhZGdlIOKAlCBhbmQgb24gYSByZXBvc2l0b3J5IHRoYXQgaXMgbm90IG9uIG5wbSB0aGF0IG1lYW5zIHdyaXRpbmdcbiAgICAvLyBvbmUgaXQgc2hvdWxkIG5vdCBoYXZlOyBhIHdiZnkgcnVuIGFscmVhZHkgc3BlbmRzIG1pbnV0ZXMgb24gaW5zdGFsbHMsIHNvIHdhaXRpbmcgYSBsaXR0bGVcbiAgICAvLyBsb25nZXIgZm9yIGEgcmVhbCBhbnN3ZXIgY29zdHMgbGVzcyB0aGFuIGFjdGluZyBvbiBhIG1pc3Npbmcgb25lLlxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYGh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnLyR7ZW5jb2RlZE5hbWV9YCwge1xuICAgICAgbWV0aG9kOiAnSEVBRCcsXG4gICAgICBzaWduYWw6IEFib3J0U2lnbmFsLnRpbWVvdXQoMTBfMDAwKSxcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzcG9uc2Uuc3RhdHVzID09PSA0MDQ7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBidWlsZE5wbUJhZGdlKHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYFshW25wbSB2ZXJzaW9uXShodHRwczovL2ltZy5zaGllbGRzLmlvL25wbS92LyR7cGFja2FnZU5hbWV9LnN2ZyldKCR7bnBtUGFja2FnZVVybFByZWZpeH0ke3BhY2thZ2VOYW1lfSlgO1xufVxuXG5mdW5jdGlvbiBidWlsZExpY2Vuc2VCYWRnZShwYWNrYWdlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBbIVtsaWNlbnNlXShodHRwczovL2ltZy5zaGllbGRzLmlvL25wbS9sLyR7cGFja2FnZU5hbWV9LnN2ZyldKCR7bnBtUGFja2FnZVVybFByZWZpeH0ke3BhY2thZ2VOYW1lfSlgO1xufVxuXG5hc3luYyBmdW5jdGlvbiBidWlsZFdvcmtmbG93QmFkZ2VzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3QgcmVwb3NpdG9yeSA9IGNvbmZpZy5yZXBvc2l0b3J5Py5zbGljZShjb25maWcucmVwb3NpdG9yeS5pbmRleE9mKCc6JykgKyAxKTtcbiAgY29uc3Qgd29ya2Zsb3dzUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRodWInLCAnd29ya2Zsb3dzJyk7XG4gIGlmICghcmVwb3NpdG9yeSB8fCAhZnMuZXhpc3RzU3luYyh3b3JrZmxvd3NQYXRoKSkgcmV0dXJuIFtdO1xuXG4gIC8vIFdvcmtmbG93IGFuZCBSRUFETUUgZ2VuZXJhdGlvbiBydW4gY29uY3VycmVudGx5LiBEbyBub3QgcmV0YWluIGEgc3RhbGUgUnVzdCBiYWRnZSB3aGlsZSB0aGVcbiAgLy8gd29ya2Zsb3cgZ2VuZXJhdG9yIHJlbW92ZXMgYSBjYWxsZXIgY3JlYXRlZCBmcm9tIGEgZm9ybWVybHkgbWlzZGV0ZWN0ZWQgbG9jYWwgY2FjaGUg4oCUIGJ1dFxuICAvLyBtaXJyb3IgaXRzIG93bmVyc2hpcCBjaGVjazogYSBjdXN0b20gc2FtZS1uYW1lZCB3b3JrZmxvdyBzdXJ2aXZlcywgc28gaXRzIGJhZGdlIG11c3QgdG9vLlxuICAvLyBEZWNpZGVkIHN5bmNocm9ub3VzbHkgYmVmb3JlIHRoZSBsb29wJ3MgZmlyc3QgYXdhaXQ6IHRoZSBnZW5lcmF0b3IncyBkZWxldGUgY2FuIG9ubHkgbGFuZCBhdFxuICAvLyBhbiBhd2FpdCBwb2ludCwgYW5kIGEgcG9zdC1kZWxldGUgcmVhZCB3b3VsZCBtaXNyZXBvcnQgdGhlIHdiZnktb3duZWQgY2FsbGVyIGFzIGN1c3RvbS5cbiAgLy8gTm8gZXhpc3RzU3luYyBwcmUtY2hlY2s6IHRoZSBoZWxwZXIgYWxyZWFkeSB0cmVhdHMgYSBtaXNzaW5nIGZpbGUgYXMgbm90IG93bmVkLCBhbmQgdGhpcyBydW5zXG4gIC8vIG9uY2UgcGVyIHJlcG9zaXRvcnksIHNvIHRoZSBleGNlcHRpb25hbCBFTk9FTlQgcmVhZCBjb3N0cyBub3RoaW5nIHdvcnRoIGEgcmVkdW5kYW50IHN0YXQuXG4gIGNvbnN0IGRyb3BzVGVzdFJ1c3RCYWRnZSA9XG4gICAgY29uZmlnLmNhcmdvVG9tbERpclBhdGhzLmxlbmd0aCA9PT0gMCAmJiBqb2JzQWxsQ2FsbFJldXNhYmxlV29ya2Zsb3cod29ya2Zsb3dzUGF0aCwgJ3Rlc3QtcnVzdC55bWwnLCAndGVzdC1ydXN0Jyk7XG5cbiAgY29uc3QgYmFkZ2VzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGZpbGVOYW1lIG9mIGZzLnJlYWRkaXJTeW5jKHdvcmtmbG93c1BhdGgpKSB7XG4gICAgaWYgKCFmaWxlTmFtZS5zdGFydHNXaXRoKCd0ZXN0JykgJiYgIWZpbGVOYW1lLnN0YXJ0c1dpdGgoJ2RlcGxveScpKSBjb250aW51ZTtcbiAgICBpZiAoZmlsZU5hbWUgPT09ICd0ZXN0LXJ1c3QueW1sJyAmJiBkcm9wc1Rlc3RSdXN0QmFkZ2UpIGNvbnRpbnVlO1xuICAgIC8vIEdpdEh1YidzIGJhZGdlIGVuZHBvaW50IHJldHVybnMgNDA0IHVudGlsIHRoZSB3b3JrZmxvdyBoYXMgYXQgbGVhc3Qgb25lIHJ1biwgc28gYSBiYWRnZSBmb3IgYVxuICAgIC8vIGRpc3BhdGNoLW9ubHkgZGVwbG95IHdvcmtmbG93IHRoYXQgaGFzIG5ldmVyIHJ1biByZW5kZXJzIGFzIGEgYnJva2VuIGltYWdlLiBUZXN0IHdvcmtmbG93cyBydW5cbiAgICAvLyBvbiBldmVyeSBQUiwgc28gb25seSBkZXBsb3kgYmFkZ2VzIG5lZWQgdGhlIGd1YXJkLlxuICAgIGlmIChmaWxlTmFtZS5zdGFydHNXaXRoKCdkZXBsb3knKSAmJiAhKGF3YWl0IGhhc0FueVdvcmtmbG93UnVuKHJlcG9zaXRvcnksIGZpbGVOYW1lLCBjb25maWcuaXNQdWJsaWNSZXBvKSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBiYWRnZU5hbWUgPSAoZmlsZU5hbWVbMF0gPz8gJycpLnRvVXBwZXJDYXNlKCkgKyBmaWxlTmFtZS5zbGljZSgxLCBmaWxlTmFtZS5pbmRleE9mKCcuJykpLnJlcGxhY2UoJy0nLCAnICcpO1xuICAgIGNvbnN0IHdvcmtmbG93VXJsID0gYGh0dHBzOi8vZ2l0aHViLmNvbS8ke3JlcG9zaXRvcnl9L2FjdGlvbnMvd29ya2Zsb3dzLyR7ZW5jb2RlVXJsUGF0aChmaWxlTmFtZSl9YDtcbiAgICBiYWRnZXMucHVzaChgWyFbJHtiYWRnZU5hbWV9XSgke3dvcmtmbG93VXJsfS9iYWRnZS5zdmcpXSgke3dvcmtmbG93VXJsfSlgKTtcbiAgfVxuICByZXR1cm4gYmFkZ2VzO1xufVxuXG5hc3luYyBmdW5jdGlvbiBoYXNBbnlXb3JrZmxvd1J1bihcbiAgcmVwb3NpdG9yeTogc3RyaW5nLFxuICB3b3JrZmxvd0ZpbGVOYW1lOiBzdHJpbmcsXG4gIGlzUHVibGljUmVwbzogYm9vbGVhblxuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IFtvd25lciwgcmVwb10gPSByZXBvc2l0b3J5LnNwbGl0KCcvJyk7XG4gIGlmICghb3duZXIgfHwgIXJlcG8pIHJldHVybiB0cnVlO1xuICB0cnkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZ2V0T2N0b2tpdChvd25lcikucmVxdWVzdCgnR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3dvcmtmbG93cy97d29ya2Zsb3dfaWR9L3J1bnMnLCB7XG4gICAgICBvd25lcixcbiAgICAgIHJlcG8sXG4gICAgICB3b3JrZmxvd19pZDogd29ya2Zsb3dGaWxlTmFtZSxcbiAgICAgIHBlcl9wYWdlOiAxLFxuICAgIH0pO1xuICAgIHJldHVybiByZXNwb25zZS5kYXRhLnRvdGFsX2NvdW50ID4gMDtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyBGb3IgYSBQVUJMSUMgcmVwb3NpdG9yeSB0aGUgcnVucyBlbmRwb2ludCBuZWVkcyBubyBhdXRob3JpemF0aW9uLCBzbyA0MDQgcmVsaWFibHkgbWVhbnMgdGhlXG4gICAgLy8gd29ya2Zsb3cgaXMgYWJzZW50IGZyb20gdGhlIHJlbW90ZSAoZS5nLiBhZGRlZCBsb2NhbGx5LCBuZXZlciBwdXNoZWQpIOKAlCBsaWtlIHplcm8gcnVucywgaXRzXG4gICAgLy8gYmFkZ2Ugd291bGQgcmVuZGVyIGJyb2tlbi4gRm9yIGEgUFJJVkFURSByZXBvc2l0b3J5IEdpdEh1YiBhbHNvIGFuc3dlcnMgNDA0IHdoZW4gdGhlIHRva2VuXG4gICAgLy8gaXMgbWlzc2luZyBvciB1bmRlci1zY29wZWQsIHNvIDQwNCBpcyBhbWJpZ3VvdXMgdGhlcmUgYW5kIHRoZSBiYWRnZSBpcyBrZXB0LlxuICAgIGlmICgoZXJyb3IgYXMgeyBzdGF0dXM/OiBudW1iZXIgfSkuc3RhdHVzID09PSA0MDQgJiYgaXNQdWJsaWNSZXBvKSByZXR1cm4gZmFsc2U7XG4gICAgLy8gS2VlcCB0aGUgcHJlLWd1YXJkIGJlaGF2aW9yIChpbnNlcnQgdGhlIGJhZGdlKSB3aGVuIHRoZSBjaGVjayBpdHNlbGYgY2Fubm90IHJ1bi5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG4vKipcbiAqIFJlcGxhY2VzIHRoZSBiYWRnZSBibG9ja3MgZGlyZWN0bHkgdW5kZXIgdGhlIHRpdGxlIHdpdGggYG1hbmFnZWRCYWRnZXNgLCBrZWVwaW5nIGFueSBiYWRnZSB0aGVyZVxuICogdGhhdCB3YmZ5IGRvZXMgbm90IG1hbmFnZSwgYW5kIHJlYXNzZW1ibGVzIHRoZSBSRUFETUUgYXJvdW5kIHRoZW0gd2l0aCBleGFjdGx5IG9uZSBibGFuayBsaW5lIG9uXG4gKiBlYWNoIHNpZGUuXG4gKlxuICogQm90aCB0aGUgdGl0bGUgYW5kIHRoZSBibG9jayBhcmUgbG9jYXRlZCBpbiBhIENvbW1vbk1hcmsgc3ludGF4IHRyZWUgcmF0aGVyIHRoYW4gYnkgc2Nhbm5pbmdcbiAqIGxpbmVzOiBvbmx5IGEgcmVhbCBwYXJzZXIga25vd3Mgd2hldGhlciBhIGxpbmUgdGhhdCBsb29rcyBsaWtlIGEgYmFkZ2UgaXMgYSBiYWRnZSAoYSBwYXJhZ3JhcGggb2ZcbiAqIGxpbmtlZCBpbWFnZXMpIG9yIGNvbnRlbnQgdGhhdCBtZXJlbHkgcmVhZHMgbGlrZSBvbmUgKGFuIGluZGVudGVkIGNvZGUgYmxvY2ssIGEgYmxvY2sgcXVvdGUsIGFcbiAqIGZlbmNlZCBleGFtcGxlLCBhIG11bHRpbGluZSBjb2RlIHNwYW4sIGFuIEhUTUwgYmxvY2spLiBFdmVyeXRoaW5nIG91dHNpZGUgdGhlIGJsb2NrIGlzIGNvcGllZCBiYWNrXG4gKiB2ZXJiYXRpbSBmcm9tIHRoZSBvcmlnaW5hbCB0ZXh0IHRocm91Z2ggdGhlIHBhcnNlcidzIHBvc2l0aW9uYWwgb2Zmc2V0cywgc28gbm8gcmVmb3JtYXR0aW5nIG9mIHRoZVxuICogdXNlcidzIGNvbnRlbnQgaXMgcG9zc2libGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZUJhZGdlQmxvY2socmVhZG1lOiBzdHJpbmcsIG1hbmFnZWRCYWRnZXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgY29uc3QgbGluZUVuZGluZyA9IGdldExpbmVFbmRpbmcocmVhZG1lKTtcbiAgLy8gQSBCT00gaXMgbm90IE1hcmtkb3duOiBsZWZ0IGluIHRoZSB0ZXh0IGl0IGhpZGVzIHRoZSBgI2Agb2YgdGhlIHRpdGxlIGZyb20gdGhlIHBhcnNlciwgYW5kXG4gIC8vIHByZXBlbmRpbmcgdGhlIGJsb2NrIGFoZWFkIG9mIGl0IHdvdWxkIHN0cmlwIHRoZSBtYXJrZXIgZnJvbSB0aGUgZmlsZSdzIGZpcnN0IGJ5dGUuXG4gIGNvbnN0IGJ5dGVPcmRlck1hcmsgPSByZWFkbWUuc3RhcnRzV2l0aCgn77u/JykgPyAn77u/JyA6ICcnO1xuICAvLyBGcm9udCBtYXR0ZXIgaXMgZGVsaW1pdGVkIGJ5IHRoZSBzYW1lIGAtLS1gIGEgU2V0ZXh0IGhlYWRpbmcgYW5kIGEgdGhlbWF0aWMgYnJlYWsgdXNlLCBzbyBpdCBpc1xuICAvLyBkZXRhY2hlZCBiZWZvcmUgcGFyc2luZyBpbnN0ZWFkIG9mIGJlaW5nIHRvbGQgYXBhcnQgYWZ0ZXJ3YXJkczsgaXQgYWxzbyBoYXMgdG8gc3RheSBmaXJzdCBpbiB0aGVcbiAgLy8gZmlsZSwgd2hpY2ggbWFrZXMgaXQgYSBwcmVmaXggaW4gZXhhY3RseSB0aGUgc2FtZSB3YXkgdGhlIEJPTSBpcy5cbiAgY29uc3Qgd2l0aG91dE1hcmsgPSByZWFkbWUuc2xpY2UoYnl0ZU9yZGVyTWFyay5sZW5ndGgpO1xuICBjb25zdCBmcm9udE1hdHRlciA9IHdpdGhvdXRNYXJrLnN0YXJ0c1dpdGgoJy0tLScpXG4gICAgPyAoL14tLS1bIFxcdF0qXFxyP1xcbltcXHNcXFNdKj9eLS0tWyBcXHRdKig/Olxccj9cXG58JCkvbXUuZXhlYyh3aXRob3V0TWFyayk/LlswXSA/PyAnJylcbiAgICA6ICcnO1xuICBjb25zdCBwcmVmaXggPSBgJHtieXRlT3JkZXJNYXJrfSR7ZnJvbnRNYXR0ZXJ9YDtcbiAgLy8gVGhlIGZpbmFsIG5ld2xpbmUgaXMgc2V0IGFzaWRlIHJhdGhlciB0aGFuIHBhcnNlZCBhcyB0cmFpbGluZyBibGFuayBzcGFjZSwgd2hpY2ggdGhlIGJsYW5rLWxpbmVcbiAgLy8gdHJpbW1pbmcgYmVsb3cgd291bGQgb3RoZXJ3aXNlIHN3YWxsb3cuXG4gIGNvbnN0IGVuZHNXaXRoTmV3bGluZSA9IC9cXHI/XFxuJC91LnRlc3QocmVhZG1lKTtcbiAgY29uc3QgY29udGVudCA9IHdpdGhvdXRNYXJrLnNsaWNlKGZyb250TWF0dGVyLmxlbmd0aCkucmVwbGFjZSgvXFxyP1xcbiQvdSwgJycpO1xuXG4gIGNvbnN0IG5vZGVzID0gZnJvbU1hcmtkb3duKGNvbnRlbnQpLmNoaWxkcmVuO1xuICAvLyBBIGxlYWRpbmcgYmFkZ2UgYmxvY2sgaXMgdGhlIHVzZXIncyBvd24gbGF5b3V0OiBpdCBzdGF5cyBhYm92ZSB0aGUgdGl0bGUsIGFuZCB3YmZ5J3MgYmxvY2sgZ29lcyBiZWxvdy5cbiAgY29uc3Qga2VlcHNMZWFkaW5nQmxvY2sgPSAhIW5vZGVzWzBdICYmIGlzQmFkZ2VCbG9ja05vZGUobm9kZXNbMF0pICYmIGlzVGl0bGVOb2RlKG5vZGVzWzFdKTtcbiAgY29uc3QgdGl0bGVJbmRleCA9IGtlZXBzTGVhZGluZ0Jsb2NrID8gMSA6IGlzVGl0bGVOb2RlKG5vZGVzWzBdKSA/IDAgOiAtMTtcbiAgLy8gV2l0aG91dCBhIHJlY29nbml6YWJsZSB0aXRsZSB0aGUgYmxvY2sgc2l0cyBhdCB0aGUgdmVyeSB0b3AsIGFib3ZlIGV2ZXJ5dGhpbmcuXG4gIGNvbnN0IGhlYWRTdGFydE5vZGUgPSBrZWVwc0xlYWRpbmdCbG9jayA/IG5vZGVzWzBdISA6IG5vZGVzW3RpdGxlSW5kZXhdO1xuICBjb25zdCBoZWFkID1cbiAgICB0aXRsZUluZGV4ID09PSAtMVxuICAgICAgPyAnJ1xuICAgICAgOiBjb250ZW50LnNsaWNlKHN0YXJ0T2Zmc2V0V2l0aEluZGVudChjb250ZW50LCBoZWFkU3RhcnROb2RlISksIG5vZGVzW3RpdGxlSW5kZXhdIS5wb3NpdGlvbiEuZW5kLm9mZnNldCk7XG5cbiAgY29uc3QgYmFkZ2VCbG9ja05vZGVzOiBQYXJhZ3JhcGhbXSA9IFtdO1xuICBmb3IgKGxldCBub2RlSW5kZXggPSB0aXRsZUluZGV4ICsgMTsgOyBub2RlSW5kZXgrKykge1xuICAgIGNvbnN0IG5vZGUgPSBub2Rlc1tub2RlSW5kZXhdO1xuICAgIGlmICghaXNCYWRnZUJsb2NrTm9kZShub2RlKSkgYnJlYWs7XG4gICAgYmFkZ2VCbG9ja05vZGVzLnB1c2gobm9kZSk7XG4gICAgLy8gV2l0aG91dCBhIHRpdGxlLCBtZXJnaW5nIGxlYWRpbmcgYmxvY2tzIGNvdWxkIGNoYW5nZSB3aGljaCBub2RlIGlzIHJlY29nbml6ZWQgYXMgdGhlIHRpdGxlIG9uIHRoZSBuZXh0IHJ1bi5cbiAgICBpZiAodGl0bGVJbmRleCA9PT0gLTEpIGJyZWFrO1xuICB9XG4gIGNvbnN0IGV4aXN0aW5nID0gYmFkZ2VCbG9ja05vZGVzLmZsYXRNYXAoKG5vZGUpID0+IHJlYWRCYWRnZXMobm9kZSwgY29udGVudCkpO1xuICBjb25zdCBib2R5Tm9kZSA9IG5vZGVzW3RpdGxlSW5kZXggKyAxICsgYmFkZ2VCbG9ja05vZGVzLmxlbmd0aF07XG4gIGNvbnN0IGJvZHkgPSBib2R5Tm9kZSA/IGNvbnRlbnQuc2xpY2Uoc3RhcnRPZmZzZXRXaXRoSW5kZW50KGNvbnRlbnQsIGJvZHlOb2RlKSkgOiAnJztcblxuICAvLyBTdXBlcnNlZGluZyBhIG1hbmFnZWQgYmFkZ2UgaXMganVzdCBkcm9wcGluZyB0aGUgb2xkIG9uZTogYSB2ZXJzaW9uLCB3b3JrZmxvdywgbnBtLCBvciBsaWNlbnNlXG4gIC8vIGNoYW5nZSBsZWF2ZXMgbm8gc3RhbGUgY29weSwgd2hpbGUgYW55IG90aGVyIGJhZGdlIGluIHRoZSBtYW5hZ2VkIHJlZ2lvbiBpcyBrZXB0LlxuICBjb25zdCBiYWRnZXMgPSBbLi4ubWFuYWdlZEJhZGdlcywgLi4uZXhpc3RpbmcuZmlsdGVyKChiYWRnZSkgPT4gIWlzTWFuYWdlZEJhZGdlKGJhZGdlKSldO1xuICAvLyBDb250ZW50IGlzIHNsaWNlZCBmcm9tIGl0cyBub2RlJ3Mgc3RhcnQgb2Zmc2V0LCBzbyB3aGF0ZXZlciBibGFuayBzcGFjZSBmb2xsb3dlZCB0aGUgZnJvbnRcbiAgLy8gbWF0dGVyIGlzIGdvbmU7IGV4YWN0bHkgb25lIGJsYW5rIGxpbmUgaXMgcmVzdG9yZWQgaGVyZS4gQSBjbG9zaW5nIGRlbGltaXRlciB0aGF0IGVuZGVkIGF0IEVPRlxuICAvLyBjYXJyaWVzIG5vIG5ld2xpbmUgb2YgaXRzIG93biBhbmQgbmVlZHMgYm90aCwgb3IgYC0tLWAgd291bGQgZnVzZSB3aXRoIHRoZSBmaXJzdCBiYWRnZSBhbmRcbiAgLy8gZGVzdHJveSB0aGVtIGJvdGguIEEgQk9NIG5lZWRzIG5vIHNlcGFyYXRvcjogaXQgaXMgYSBieXRlIG1hcmtlciwgbm90IGEgbGluZS5cbiAgY29uc3Qgc2VwYXJhdG9yID0gZnJvbnRNYXR0ZXIgPyAoL1xccj9cXG4kL3UudGVzdChmcm9udE1hdHRlcikgPyBsaW5lRW5kaW5nIDogYCR7bGluZUVuZGluZ30ke2xpbmVFbmRpbmd9YCkgOiAnJztcbiAgY29uc3QgcmVzdWx0ID1cbiAgICBwcmVmaXggKyBzZXBhcmF0b3IgKyBbaGVhZCwgYmFkZ2VzLmpvaW4obGluZUVuZGluZyksIGJvZHldLmZpbHRlcihCb29sZWFuKS5qb2luKGAke2xpbmVFbmRpbmd9JHtsaW5lRW5kaW5nfWApO1xuICByZXR1cm4gZW5kc1dpdGhOZXdsaW5lID8gYCR7cmVzdWx0fSR7bGluZUVuZGluZ31gIDogcmVzdWx0O1xufVxuXG4vKipcbiAqIEEgbm9kZSdzIHN0YXJ0IG9mZnNldCwgZXh0ZW5kZWQgYmFjayBvdmVyIHRoZSBsZWFkaW5nIHdoaXRlc3BhY2Ugb24gaXRzIG93biBsaW5lLiBDb21tb25NYXJrXG4gKiBhbGxvd3Mgb25lIHRvIHRocmVlIHNwYWNlcyBvZiBpbmRlbnRhdGlvbiBiZWZvcmUgYSBibG9jaywgYW5kIG1kYXN0IHJlcG9ydHMgdGhlIG9mZnNldCBBRlRFUlxuICogdGhlbSDigJQgc28gc2xpY2luZyBmcm9tIGl0IHNpbGVudGx5IHJlaW5kZW50cyBjb250ZW50IHRoaXMgZ2VuZXJhdG9yIHByb21pc2VzIHRvIGNvcHkgdmVyYmF0aW0uXG4gKi9cbmZ1bmN0aW9uIHN0YXJ0T2Zmc2V0V2l0aEluZGVudChjb250ZW50OiBzdHJpbmcsIG5vZGU6IFJvb3RDb250ZW50KTogbnVtYmVyIHtcbiAgY29uc3Qgc3RhcnQgPSBub2RlLnBvc2l0aW9uIS5zdGFydC5vZmZzZXQhO1xuICBjb25zdCBsaW5lU3RhcnQgPSBjb250ZW50Lmxhc3RJbmRleE9mKCdcXG4nLCBzdGFydCAtIDEpICsgMTtcbiAgcmV0dXJuIC9eWyBcXHRdKiQvdS50ZXN0KGNvbnRlbnQuc2xpY2UobGluZVN0YXJ0LCBzdGFydCkpID8gbGluZVN0YXJ0IDogc3RhcnQ7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgbm9kZSBvcGVucyB0aGUgUkVBRE1FIHdpdGggYSB0aXRsZS4gT25seSB0aGUgRklSU1QgcGllY2Ugb2YgY29udGVudCBjYW4gYmUgb25lOiBhXG4gKiB0aXRsZSBpcyB3aGF0IGEgUkVBRE1FIG9wZW5zIHdpdGgsIGFuZCBhbmNob3JpbmcgdGhlIGJhZGdlcyB0byBhIGhlYWRpbmcgZnVydGhlciBkb3duIHdvdWxkIGJ1cnlcbiAqIHRoZW0gYmVsb3cgY29udGVudCB0aGUgYXV0aG9yIHB1dCBmaXJzdC5cbiAqL1xuZnVuY3Rpb24gaXNUaXRsZU5vZGUobm9kZTogUm9vdENvbnRlbnQgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG4gIGlmIChub2RlLnR5cGUgPT09ICdoZWFkaW5nJykgcmV0dXJuIHRydWU7XG4gIC8vIE1hbnkgUkVBRE1FcyBjZW50ZXIgdGhlaXIgdGl0bGUgaW4gSFRNTCAoYDxoMT5gLCBvciBhIGA8ZGl2PmAvYDxwPmAgd3JhcHBpbmcgb25lKSwgd2hpY2ggdGhlXG4gIC8vIHBhcnNlciByZXBvcnRzIGFzIG9uZSBvcGFxdWUgSFRNTCBibG9jazsgdGhlIGJhZGdlcyBnbyBhZnRlciB0aGUgd2hvbGUgYmxvY2suXG4gIHJldHVybiBub2RlLnR5cGUgPT09ICdodG1sJyAmJiBjb250YWluc1JlbmRlcmVkSDEobm9kZS52YWx1ZSk7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgSFRNTCBibG9jayB1bmFtYmlndW91c2x5IFJFTkRFUlMgYW4gYDxoMT5gIOKAlCB0aGUgY2VudGVyZWQtdGl0bGUgbGF5b3V0IG1hbnkgUkVBRE1Fc1xuICogdXNlIChgPGgxPmAsIG9yIGEgYDxkaXY+YC9gPHA+YCB3cmFwcGluZyBvbmUpLlxuICpcbiAqIERlbGliZXJhdGVseSBOT1QgYSBnZW5lcmFsIEhUTUwgcGFyc2VyLiBEZWNpZGluZyB0aGlzIGV4YWN0bHkgcmVxdWlyZXMgdGhlIHJlYWwgdG9rZW5pemVyJ3NcbiAqIHN0YXRlcyDigJQgcmF3IHRleHQsIFJDREFUQSwgc2NyaXB0IGRhdGEsIGF0dHJpYnV0ZSB2YWx1ZXMsIHRlbXBsYXRlIGNvbnRlbnRzLCBkZWNsYXJhdGlvbnMg4oCUIGFuZFxuICogYXBwcm94aW1hdGluZyB0aGVtIHdpdGggcmVnZXhlcyBpcyB0aGUgc2FtZSBsb3NpbmcgZ2FtZSB0aGUgTWFya2Rvd24gc2Nhbm5pbmcgdGhpcyBtb2R1bGVcbiAqIHJlcGxhY2VkIHdhcyBwbGF5aW5nLiBTbyB0aGUgcnVsZSBpczogdG9rZW5pemUgb25seSB0aGUgc2ltcGxlIGNhc2UsIGFuZCB0cmVhdCBhbnl0aGluZyBjYXJyeWluZ1xuICogYSBjb25zdHJ1Y3Qgd2hvc2UgcGFyc2luZyBkZXBlbmRzIG9uIHRob3NlIHN0YXRlcyBhcyBOT1QgYSB0aXRsZS4gQmVpbmcgd3JvbmcgdGhhdCB3YXkgcHV0cyB0aGVcbiAqIGJhZGdlcyBhdCB0aGUgdG9wIG9mIHRoZSBmaWxlLCB3aGljaCBpcyBtZXJlbHkgdW5oZWxwZnVsOyBiZWluZyB3cm9uZyB0aGUgb3RoZXIgd2F5IHJld3JpdGVzIHRoZVxuICogdXNlcidzIFJFQURNRSBhcm91bmQgdGhlIHdyb25nIGFuY2hvci5cbiAqL1xuZnVuY3Rpb24gY29udGFpbnNSZW5kZXJlZEgxKGh0bWw6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAvLyBDb21tZW50cyBjYW5ub3QgbmVzdCBhbmQgZW5kIHVuYW1iaWd1b3VzbHksIHNvIHRoZXkgYXJlIHNpbXBseSByZW1vdmVkIHJhdGhlciB0aGFuIGRpc3F1YWxpZnlpbmcuXG4gIGNvbnN0IHdpdGhvdXRDb21tZW50cyA9IGh0bWwucmVwbGFjZUFsbCgvPCEtLVtcXHNcXFNdKj8oPzotLT58JCkvZ3UsICcnKTtcbiAgLy8gQ0RBVEEsIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zLCBkZWNsYXJhdGlvbnMsIGVsZW1lbnRzIHdob3NlIGNvbnRlbnQgaXMgcmF3IHRleHQgLyBSQ0RBVEEgL1xuICAvLyBzY3JpcHQgZGF0YSwgYW5kIGA8dGVtcGxhdGU+YCAod2hvc2UgY29udGVudHMgYXJlIGluZXJ0KS4gQSBxdW90ZWQgYXR0cmlidXRlIGNvbnRhaW5pbmcgYDxgXG4gIC8vIG1ha2VzIGV2ZW4gbG9jYXRpbmcgdGhlc2UgdW5yZWxpYWJsZSwgc28gaXQgZGlzcXVhbGlmaWVzIHRoZSBibG9jayB0b28uXG4gIGNvbnN0IGFtYmlndW91c0NvbnN0cnVjdFBhdHRlcm4gPVxuICAgIC88IVxcW0NEQVRBXFxbfDxcXD98PCFbYS16QS1aXXw8XFwvPyg/OnNjcmlwdHxzdHlsZXx0ZXh0YXJlYXx0aXRsZXxpZnJhbWV8bm9mcmFtZXN8bm9lbWJlZHx4bXB8dGVtcGxhdGUpXFxifFwiW15cIl0qPFteXCJdKlwifCdbXiddKjxbXiddKicvaXU7XG4gIGlmIChhbWJpZ3VvdXNDb25zdHJ1Y3RQYXR0ZXJuLnRlc3Qod2l0aG91dENvbW1lbnRzKSkgcmV0dXJuIGZhbHNlO1xuICAvLyBRdW90aW5nIGlzIHNpZ25pZmljYW50IG9ubHkgaW5zaWRlIGEgc3RhcnQgdGFnLCBzbyBhbiBhdHRyaWJ1dGUgdmFsdWUgaXMgY29uc3VtZWQgd2l0aCBpdHMgb3duXG4gIC8vIHRhZyB3aGlsZSBxdW90YXRpb24gbWFya3MgaW4gb3JkaW5hcnkgdGV4dCBzdGF5IHRleHQ6IGA8ZGl2IHRpdGxlPVwiJmx0O2gxJmd0O1wiPmAgZG9lcyBub3QgY291bnQsXG4gIC8vIGBcIjxoMT5Qcm9qZWN0PC9oMT5cImAgZG9lcy5cbiAgY29uc3Qgc3RhcnRUYWdQYXR0ZXJuID0gLzwoW2EtekEtWl1bXlxccy8+XSopKD86XCJbXlwiXSpcInwnW14nXSonfFtePlwiJ10pKj4vZ3U7XG4gIGZvciAoY29uc3QgbWF0Y2ggb2Ygd2l0aG91dENvbW1lbnRzLm1hdGNoQWxsKHN0YXJ0VGFnUGF0dGVybikpIHtcbiAgICBpZiAobWF0Y2hbMV0/LnRvTG93ZXJDYXNlKCkgPT09ICdoMScpIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqIFdoZXRoZXIgdGhlIG5vZGUgaXMgYSBwYXJhZ3JhcGggb2YgYmFkZ2VzIGFuZCBub3RoaW5nIGVsc2Ug4oCUIHRoZSBvbmx5IGNvbnRlbnQgd2JmeSBwdXRzIGluIHRoZSBibG9jay4gKi9cbmZ1bmN0aW9uIGlzQmFkZ2VCbG9ja05vZGUobm9kZTogUm9vdENvbnRlbnQgfCB1bmRlZmluZWQpOiBub2RlIGlzIFBhcmFncmFwaCB7XG4gIHJldHVybiAoXG4gICAgISFub2RlICYmXG4gICAgbm9kZS50eXBlID09PSAncGFyYWdyYXBoJyAmJlxuICAgIG5vZGUuY2hpbGRyZW4uc29tZSgoY2hpbGQpID0+IGlzQmFkZ2VOb2RlKGNoaWxkKSkgJiZcbiAgICBub2RlLmNoaWxkcmVuLmV2ZXJ5KFxuICAgICAgKGNoaWxkKSA9PiBpc0JhZGdlTm9kZShjaGlsZCkgfHwgY2hpbGQudHlwZSA9PT0gJ2JyZWFrJyB8fCAoY2hpbGQudHlwZSA9PT0gJ3RleHQnICYmICFjaGlsZC52YWx1ZS50cmltKCkpXG4gICAgKVxuICApO1xufVxuXG4vKiogQSBiYWRnZSBpcyBvbmUgYFshW2FsdF0oaW1hZ2UpXShsaW5rKWAsIHRoZSBvbmx5IHNoYXBlIHdiZnkgZXZlciB3cml0ZXMuICovXG5mdW5jdGlvbiBpc0JhZGdlTm9kZShub2RlOiBSb290Q29udGVudCB8IFBocmFzaW5nQ29udGVudCk6IG5vZGUgaXMgTGluayAmIHsgY2hpbGRyZW46IFtJbWFnZV0gfSB7XG4gIHJldHVybiBub2RlLnR5cGUgPT09ICdsaW5rJyAmJiBub2RlLmNoaWxkcmVuLmxlbmd0aCA9PT0gMSAmJiBub2RlLmNoaWxkcmVuWzBdPy50eXBlID09PSAnaW1hZ2UnO1xufVxuXG4vKipcbiAqIFRoZSBiYWRnZXMgaW4gdGhlIGJsb2NrLCBhcyB0aGUgZXhhY3Qgc291cmNlIHRleHQgdGhhdCBwcm9kdWNlZCB0aGVtOiBhIGJhZGdlIHdiZnkgZG9lcyBub3QgbWFuYWdlXG4gKiBpcyB3cml0dGVuIGJhY2sgYnl0ZSBmb3IgYnl0ZSBpbnN0ZWFkIG9mIGJlaW5nIHJlLXNlcmlhbGl6ZWQgZnJvbSB0aGUgdHJlZS5cbiAqL1xuZnVuY3Rpb24gcmVhZEJhZGdlcyhub2RlOiBQYXJhZ3JhcGgsIGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIG5vZGUuY2hpbGRyZW5cbiAgICAuZmlsdGVyKChjaGlsZCkgPT4gaXNCYWRnZU5vZGUoY2hpbGQpKVxuICAgIC5tYXAoKGNoaWxkKSA9PiBjb250ZW50LnNsaWNlKGNoaWxkLnBvc2l0aW9uIS5zdGFydC5vZmZzZXQsIGNoaWxkLnBvc2l0aW9uIS5lbmQub2Zmc2V0KSk7XG59XG5cbi8qKlxuICogUGVyY2VudC1lbmNvZGVzIHRoZSBjaGFyYWN0ZXJzIHRoYXQgd291bGQgZW5kIGEgTWFya2Rvd24gZGVzdGluYXRpb24gZWFybHkuIEEgd29ya2Zsb3cgZmlsZSBtYXkgYmVcbiAqIG5hbWVkIGFueXRoaW5nIHdpdGggYSBgLnltbGAgZXh0ZW5zaW9uLCBhbmQgb25lIGNvbnRhaW5pbmcgYChgIG9yIGApYCBwcm9kdWNlZCBhIGJhZGdlIHRoYXQgd2JmeSdzXG4gKiBvd24gYmFkZ2UgcGF0dGVybiBjb3VsZCBub3QgcmVhZCBiYWNrIOKAlCBzbyB0aGUgbGluZSBsZWZ0IHRoZSBibG9jayBhbmQgdGhlIGJhZGdlIHdhcyBkdXBsaWNhdGVkLlxuICovXG5mdW5jdGlvbiBlbmNvZGVVcmxQYXRoKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdmFsdWUucmVwbGFjZUFsbCgvWygpXFxzXS9ndSwgKGNoYXJhY3RlcikgPT4gYCUke2NoYXJhY3Rlci5jb2RlUG9pbnRBdCgwKSEudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCl9YCk7XG59XG5cbi8qKiBXaGV0aGVyIHRoZSBiYWRnZSBpcyBvbmUgd2JmeSB3cml0ZXMgaXRzZWxmLCBhbmQgc28gbWF5IGJlIHJlcGxhY2VkIGJ5IHRoZSBjdXJyZW50IGJsb2NrLiAqL1xuZnVuY3Rpb24gaXNNYW5hZ2VkQmFkZ2UoYmFkZ2U6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gYmFkZ2UgPT09IHNlbWFudGljUmVsZWFzZUJhZGdlIHx8IG1hbmFnZWRCYWRnZVBhdHRlcm5zLnNvbWUoKHBhdHRlcm4pID0+IHBhdHRlcm4udGVzdChiYWRnZSkpO1xufVxuXG5mdW5jdGlvbiBnZXRMaW5lRW5kaW5nKGNvbnRlbnQ6IHN0cmluZyk6ICdcXG4nIHwgJ1xcclxcbicge1xuICByZXR1cm4gY29udGVudC5pbmNsdWRlcygnXFxyXFxuJykgPyAnXFxyXFxuJyA6ICdcXG4nO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUmVsZWFzZXJjKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVJlbGVhc2VyYycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcucmVsZWFzZXJjLmpzb24nKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSByZXR1cm47XG5cbiAgICBjb25zdCBzZXR0aW5ncyA9IEpTT04ucGFyc2UoYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4JykpIGFzIHtcbiAgICAgIHBsdWdpbnM/OiAoc3RyaW5nIHwgW3N0cmluZywgdW5rbm93bl0pW107XG4gICAgICBleHRlbmRzPzogdW5rbm93bjtcbiAgICB9O1xuICAgIGNvbnN0IHBsdWdpbnMgPSBzZXR0aW5ncy5wbHVnaW5zID8/IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGx1Z2lucy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgcGx1Z2luRW50cnkgPSBwbHVnaW5zW2ldO1xuICAgICAgY29uc3QgaXNBcnJheSA9IEFycmF5LmlzQXJyYXkocGx1Z2luRW50cnkpO1xuICAgICAgY29uc3QgcGx1Z2luID0gaXNBcnJheSA/IHBsdWdpbkVudHJ5WzBdIDogcGx1Z2luRW50cnk7XG4gICAgICBjb25zdCBvbGRDb25maWcgPSAoaXNBcnJheSAmJiBwbHVnaW5FbnRyeVsxXSkgfHwge307XG4gICAgICBpZiAocGx1Z2luID09PSAnQHNlbWFudGljLXJlbGVhc2UvY29tbWl0LWFuYWx5emVyJykge1xuICAgICAgICBwbHVnaW5zW2ldID0gW1xuICAgICAgICAgICdAc2VtYW50aWMtcmVsZWFzZS9jb21taXQtYW5hbHl6ZXInLFxuICAgICAgICAgIG1lcmdlLmFsbChcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgb2xkQ29uZmlnLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcHJlc2V0OiAnY29udmVudGlvbmFsY29tbWl0cycsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgeyBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSB9XG4gICAgICAgICAgKSxcbiAgICAgICAgXTtcbiAgICAgIH0gZWxzZSBpZiAocGx1Z2luID09PSAnQHNlbWFudGljLXJlbGVhc2UvZ2l0aHViJykge1xuICAgICAgICBwbHVnaW5zW2ldID0gW1xuICAgICAgICAgICdAc2VtYW50aWMtcmVsZWFzZS9naXRodWInLFxuICAgICAgICAgIG1lcmdlLmFsbChcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgb2xkQ29uZmlnLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLy8gY2YuIGh0dHBzOi8vZ2l0aHViLmNvbS9zZW1hbnRpYy1yZWxlYXNlL3NlbWFudGljLXJlbGVhc2UvaXNzdWVzLzIyMDQjaXNzdWVjb21tZW50LTE1MDg0MTc3MDRcbiAgICAgICAgICAgICAgICBzdWNjZXNzQ29tbWVudENvbmRpdGlvbjogZmFsc2UsXG4gICAgICAgICAgICAgICAgZmFpbENvbW1lbnRDb25kaXRpb246IGZhbHNlLFxuICAgICAgICAgICAgICAgIGxhYmVsczogWydyOiBzZW1hbnRpYy1yZWxlYXNlJ10sXG4gICAgICAgICAgICAgICAgcmVsZWFzZWRMYWJlbHM6IFsncmVsZWFzZWQgOmJvb2ttYXJrOiddLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfVxuICAgICAgICAgICksXG4gICAgICAgIF07XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShzZXR0aW5ncywgdW5kZWZpbmVkLCAyKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsganNvbmNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvanNvbmNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcblxuY29uc3Qgc2hhcmVkUHJlc2V0ID0gJ2dpdGh1Yj5XaWxsQm9vc3Rlci93aWxsYm9vc3Rlci1jb25maWdzOnJlbm92YXRlLmpzb25jJztcbmNvbnN0IGdlbmVyYXRlZFNldHRpbmdzID0ge1xuICAkc2NoZW1hOiAnaHR0cHM6Ly9kb2NzLnJlbm92YXRlYm90LmNvbS9yZW5vdmF0ZS1zY2hlbWEuanNvbicsXG4gIGV4dGVuZHM6IFtzaGFyZWRQcmVzZXRdLFxufTtcblxudHlwZSBTZXR0aW5ncyA9IFBhcnRpYWw8dHlwZW9mIGdlbmVyYXRlZFNldHRpbmdzPiAmIHtcbiAgcGFja2FnZVJ1bGVzPzogeyBtYXRjaFBhY2thZ2VOYW1lczogc3RyaW5nW107IGVuYWJsZWQ/OiBib29sZWFuIH1bXTtcbn07XG5cbmNvbnN0IG1hbmFnZWRGaWxlTmFtZSA9ICdyZW5vdmF0ZS5qc29uYyc7XG5cbi8vIHdiZnkgc3VwcG9ydHMgb25lIGNhbm9uaWNhbCBSZW5vdmF0ZSBsb2NhdGlvbi4gTm9uLWNhbm9uaWNhbCBjb25maWdzIGFyZSBmaXhlZCBpbiB0aGUgdGFyZ2V0XG4vLyByZXBvc2l0b3J5IGluc3RlYWQgb2YgYmVpbmcgcGFyc2VkLCBtZXJnZWQsIG9yIGRlbGV0ZWQgaGVyZS5cbmNvbnN0IG5vbkNhbm9uaWNhbENvbmZpZ1BhdGhzID0gW1xuICAncmVub3ZhdGUuanNvbicsXG4gICdyZW5vdmF0ZS5qc29uNScsXG4gICcuZ2l0aHViL3Jlbm92YXRlLmpzb24nLFxuICAnLmdpdGh1Yi9yZW5vdmF0ZS5qc29uYycsXG4gICcuZ2l0aHViL3Jlbm92YXRlLmpzb241JyxcbiAgJy5yZW5vdmF0ZXJjJyxcbiAgJy5yZW5vdmF0ZXJjLmpzb24nLFxuICAnLnJlbm92YXRlcmMuanNvbjUnLFxuXTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUmVub3ZhdGVKc29uYyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVJlbm92YXRlSnNvbmMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIG1hbmFnZWRGaWxlTmFtZSk7XG4gICAgY29uc3QgbWFuYWdlZEZpbGVTdGF0cyA9IGF3YWl0IGZzLnByb21pc2VzLmxzdGF0KGZpbGVQYXRoKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgaWYgKG1hbmFnZWRGaWxlU3RhdHM/LmlzU3ltYm9saWNMaW5rKCkpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCBnZW5lcmF0aW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgaXQgaXMgYSBzeW1ib2xpYyBsaW5rLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG5vbkNhbm9uaWNhbENvbmZpZ0NhbmRpZGF0ZXMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIG5vbkNhbm9uaWNhbENvbmZpZ1BhdGhzLm1hcChhc3luYyAocmVsYXRpdmVQYXRoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgcmVsYXRpdmVQYXRoKTtcbiAgICAgICAgcmV0dXJuIChhd2FpdCBmcy5wcm9taXNlcy5sc3RhdChjYW5kaWRhdGUpLmNhdGNoKCgpID0+IHt9KSkgPyBjYW5kaWRhdGUgOiB1bmRlZmluZWQ7XG4gICAgICB9KVxuICAgICk7XG4gICAgY29uc3Qgbm9uQ2Fub25pY2FsQ29uZmlnUGF0aCA9IG5vbkNhbm9uaWNhbENvbmZpZ0NhbmRpZGF0ZXMuZmluZCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUgIT09IHVuZGVmaW5lZCk7XG4gICAgaWYgKG5vbkNhbm9uaWNhbENvbmZpZ1BhdGggfHwgY29uZmlnLnBhY2thZ2VKc29uPy5yZW5vdmF0ZSkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgU2tpcHBlZCBnZW5lcmF0aW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgdGhlIHJlcG9zaXRvcnkgaGFzIGEgbm9uLWNhbm9uaWNhbCBSZW5vdmF0ZSBjb25maWcke1xuICAgICAgICAgIG5vbkNhbm9uaWNhbENvbmZpZ1BhdGggPyBgIGF0ICR7bm9uQ2Fub25pY2FsQ29uZmlnUGF0aH1gIDogJyBpbiBwYWNrYWdlLmpzb24nXG4gICAgICAgIH0uYFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpO1xuICAgIGxldCBvbGRTZXR0aW5nczogU2V0dGluZ3MgfCB1bmRlZmluZWQ7XG4gICAgaWYgKG9sZENvbnRlbnQgIT09IHVuZGVmaW5lZCAmJiAhanNvbmNVdGlsLmlzVHJpdmlhT25seShvbGRDb250ZW50KSkge1xuICAgICAgb2xkU2V0dGluZ3MgPSBqc29uY1V0aWwucGFyc2VPYmplY3RJZ25vcmluZ0Vycm9yPFNldHRpbmdzPihvbGRDb250ZW50KTtcbiAgICAgIGlmICghb2xkU2V0dGluZ3MpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIGdlbmVyYXRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSB0aGUgZXhpc3RpbmcgY29udGVudCBpcyBub3QgcGFyc2FibGUgYXMgSlNPTkMuYCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAob2xkU2V0dGluZ3M/LmV4dGVuZHMgIT09IHVuZGVmaW5lZCAmJiAhQXJyYXkuaXNBcnJheShvbGRTZXR0aW5ncy5leHRlbmRzKSkge1xuICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIGdlbmVyYXRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSBcImV4dGVuZHNcIiBpcyBub3QgYW4gYXJyYXkuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJlbW92ZWRQcmVzZXQgPSBvbGRTZXR0aW5ncz8uZXh0ZW5kcz8uZmluZChcbiAgICAgIChwcmVzZXQpID0+IHByZXNldC5zdGFydHNXaXRoKCdnaXRodWI+V2lsbEJvb3N0ZXIvd2lsbGJvb3N0ZXItY29uZmlnczonKSAmJiBwcmVzZXQgIT09IHNoYXJlZFByZXNldFxuICAgICk7XG4gICAgaWYgKHJlbW92ZWRQcmVzZXQpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCBnZW5lcmF0aW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgXCIke3JlbW92ZWRQcmVzZXR9XCIgbm8gbG9uZ2VyIGV4aXN0czsgcmVtb3ZlIGl0IG1hbnVhbGx5LmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld1NldHRpbmdzID0gYnVpbGRTZXR0aW5ncyhjb25maWcsIG9sZFNldHRpbmdzKTtcbiAgICBjb25zdCB7IGNvbnRlbnQsIGtleXNMb3NpbmdDb21tZW50cyB9ID0ganNvbmNVdGlsLnN0cmluZ2lmeVByZXNlcnZpbmdUcml2aWEoXG4gICAgICBvbGRDb250ZW50LFxuICAgICAgbmV3U2V0dGluZ3MgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICApO1xuICAgIGlmIChvbGRDb250ZW50ICE9PSB1bmRlZmluZWQgJiYgbm9ybWFsaXplKGNvbnRlbnQpID09PSBub3JtYWxpemUob2xkQ29udGVudCkpIHJldHVybjtcbiAgICBpZiAoIShhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb250ZW50KSkpIHJldHVybjtcblxuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXNMb3NpbmdDb21tZW50cykge1xuICAgICAgY29uc29sZS53YXJuKGBDb21tZW50cyBpbnNpZGUgXCIke2tleX1cIiB3ZXJlIGRyb3BwZWQgd2hpbGUgcmV3cml0aW5nIGl0IGluICR7ZmlsZVBhdGh9LmApO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBvbGRTZXR0aW5nczogU2V0dGluZ3MgfCB1bmRlZmluZWQpOiBTZXR0aW5ncyB7XG4gIGNvbnN0IHNldHRpbmdzID0gb2xkU2V0dGluZ3NcbiAgICA/IChtZXJnZS5hbGwoW2dlbmVyYXRlZFNldHRpbmdzLCBvbGRTZXR0aW5ncywgZ2VuZXJhdGVkU2V0dGluZ3NdLCB7XG4gICAgICAgIGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlLFxuICAgICAgfSkgYXMgU2V0dGluZ3MpXG4gICAgOiBzdHJ1Y3R1cmVkQ2xvbmUoZ2VuZXJhdGVkU2V0dGluZ3MpO1xuICBjb25zdCBleGlzdGluZ0V4dGVuZHMgPSBvbGRTZXR0aW5ncz8uZXh0ZW5kcyA/PyBbXTtcbiAgc2V0dGluZ3MuZXh0ZW5kcyA9IGNvbmZpZy5pc1dpbGxCb29zdGVyQ29uZmlnc1xuICAgID8gZXhpc3RpbmdFeHRlbmRzLmZpbHRlcigocHJlc2V0KSA9PiBwcmVzZXQgIT09IHNoYXJlZFByZXNldClcbiAgICA6IGV4aXN0aW5nRXh0ZW5kcy5pbmNsdWRlcyhzaGFyZWRQcmVzZXQpXG4gICAgICA/IGV4aXN0aW5nRXh0ZW5kc1xuICAgICAgOiBbc2hhcmVkUHJlc2V0LCAuLi5leGlzdGluZ0V4dGVuZHNdO1xuICByZXR1cm4gc2V0dGluZ3M7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZShjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCB0cmltbWVkQ29udGVudCA9IGNvbnRlbnQudHJpbSgpO1xuICByZXR1cm4gdHJpbW1lZENvbnRlbnQgPyB0cmltbWVkQ29udGVudCArICdcXG4nIDogJyc7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24sIFRzQ29uZmlnSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBqc29uY1V0aWwgfSBmcm9tICcuLi91dGlscy9qc29uY1V0aWwuanMnO1xuaW1wb3J0IHsgY29tYmluZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHNvcnRLZXlzIH0gZnJvbSAnLi4vdXRpbHMvb2JqZWN0VXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IGdldFRzY29uZmlnRXh0ZW5kcyB9IGZyb20gJy4uL3V0aWxzL3RzY29uZmlnQmFzZS5qcyc7XG5pbXBvcnQge1xuICBnZXRNZWFuaW5nZnVsRGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyxcbiAgZ2V0V29ya3NwYWNlRGlyUGF0dGVybnMsXG4gIGdldFdvcmtzcGFjZVN1YkRpclBhdGhzLFxufSBmcm9tICcuLi91dGlscy93b3Jrc3BhY2VVdGlsLmpzJztcblxuY29uc3Qgc3ViSnNvbk9iaiA9IHtcbiAgY29tcGlsZXJPcHRpb25zOiB7XG4gICAgYWx3YXlzU3RyaWN0OiB0cnVlLFxuICAgIG5vVW5jaGVja2VkSW5kZXhlZEFjY2VzczogdHJ1ZSwgLy8gZm9yIEB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItbnVsbGlzaC1jb2FsZXNjaW5nXG4gICAgYWxsb3dTeW50aGV0aWNEZWZhdWx0SW1wb3J0czogdHJ1ZSwgLy8gYWxsb3cgYGltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdgXG4gICAgZXNNb2R1bGVJbnRlcm9wOiB0cnVlLCAvLyBhbGxvdyBkZWZhdWx0IGltcG9ydCBmcm9tIENvbW1vbkpTL0FNRC9VTUQgbW9kdWxlc1xuICAgIHJlc29sdmVKc29uTW9kdWxlOiB0cnVlLCAvLyBhbGxvdyB0byBpbXBvcnQgSlNPTiBmaWxlc1xuICAgIGltcG9ydEhlbHBlcnM6IGZhbHNlLFxuICAgIG5vRW1pdDogdHJ1ZSxcbiAgfSxcbiAgZXhjbHVkZTogWyd0ZXN0L2ZpeHR1cmVzJ10sXG4gIC8vIHdiZnkgZ2VuZXJhdGVzIHJvb3QtbGV2ZWwgdG9vbCBjb25maWdzIHN1Y2ggYXMgcGxheXdyaWdodC5jb25maWcudHMsIGFuZFxuICAvLyB0eXBlLWF3YXJlIGxpbnRpbmcgbmVlZHMgdGhvc2UgZmlsZXMgaW4gdGhlIHByb2plY3QgdG8gc2VlIE5vZGUvQnVuIGdsb2JhbHMuXG4gIC8vIGBhcHAvKipgIGlzIGRlbGliZXJhdGVseSBhYnNlbnQgZXZlbiB0aG91Z2ggdGhlIGRvZXNDb250YWluKlNjcmlwdCBzaWduYWxzIHNjYW4gaXQ6IGFwcFxuICAvLyBkaXJlY3RvcmllcyBiZWxvbmcgdG8gZnJhbWV3b3JrIHBhY2thZ2VzIChOZXh0LmpzL0JsaXR6KSwgd2hpY2ggb3duIHRoZWlyIHRzY29uZmlnXG4gIC8vIChnZW5lcmF0ZVRzY29uZmlnIHNraXBzIHRoZW0pLCBhbmQgY2hlY2tpbmcgZnJhbWV3b3JrIHNvdXJjZXMgdW5kZXIgdGhpcyBwcm9qZWN0J3MgY29tcGlsZXJcbiAgLy8gb3B0aW9ucyB3b3VsZCBwcm9kdWNlIGZhbHNlIGVycm9ycy5cbiAgaW5jbHVkZTogWycqLmNvbmZpZy50cycsICdzY3JpcHRzLyoqLyonLCAnc3JjLyoqLyonLCAndGVzdC8qKi8qJ10sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVUc2NvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVRzY29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIC8vIHZpbmV4dCBpcyB0aGUgb3JnJ3MgTmV4dC5qcy1lcXVpdmFsZW50IGZyYW1ld29yayBhbmQgb3ducyBpdHMgdHNjb25maWcganVzdCBsaWtlIE5leHQvQmxpdHosXG4gICAgLy8gc28gaXQgbXVzdCBza2lwIHRoZSBzdGFuZGFyZCBnZW5lcmF0aW9uIHRoYXQgd291bGQgb3ZlcndyaXRlIHRoZSBmcmFtZXdvcmsncyBvd24gc2V0dGluZ3MuXG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHwgY29uZmlnLmRlcGVuZGluZy5uZXh0IHx8IGNvbmZpZy5kZXBlbmRpbmcudmluZXh0KSB7XG4gICAgICBhd2FpdCBub3JtYWxpemVGcmFtZXdvcmtUc2NvbmZpZyhjb25maWcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBuZXdTZXR0aW5ncyA9IChjb25maWcuaXNSb290ID8gYnVpbGRSb290SnNvbk9iaihjb25maWcpIDogc3RydWN0dXJlZENsb25lKHN1Ykpzb25PYmopKSBhcyBUc0NvbmZpZ0pzb247XG4gICAgY29uc3QgZ2VuZXJhdGVkVHlwZXMgPSBnZXRHZW5lcmF0ZWRUeXBlcyhjb25maWcpO1xuICAgIG5ld1NldHRpbmdzLmV4dGVuZHMgPSBnZXRUc2NvbmZpZ0V4dGVuZHMoY29uZmlnKTtcbiAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMgPz89IHt9O1xuICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucy5yb290RGlyID0gZ2V0Um9vdERpcihjb25maWcpO1xuICAgIGlmIChnZW5lcmF0ZWRUeXBlcy5sZW5ndGggPiAwKSB7XG4gICAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMgPSB7IC4uLm5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucywgdHlwZXM6IGdlbmVyYXRlZFR5cGVzIH07XG4gICAgfVxuICAgIGlmICghY29uZmlnLmRvZXNDb250YWluSnN4T3JUc3ggJiYgIWNvbmZpZy5kb2VzQ29udGFpbkpzeE9yVHN4SW5QYWNrYWdlcykge1xuICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8uanN4O1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEpIHtcbiAgICAgIC8vIFByaXNtYSBzZWVkcyBhbmQgbWlncmF0aW9uIGhlbHBlciBzY3JpcHRzIG9mdGVuIGxpdmUgb3V0c2lkZSBzcmMsIGJ1dFxuICAgICAgLy8gdHlwZS1hd2FyZSBsaW50aW5nIHN0aWxsIG5lZWRzIHRoZW0gY292ZXJlZCBieSB0aGUgcHJvamVjdCBjb25maWcuXG4gICAgICBhZGRJbmNsdWRlUGF0aChuZXdTZXR0aW5ncywgJ3ByaXNtYS8qKi8qJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICd0c2NvbmZpZy5qc29uJyk7XG4gICAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpO1xuICAgIGxldCBvcmlnaW5hbFNldHRpbmdzSnNvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIC8vIEEgZmlsZSB3aXRoIG5vIGNvbmZpZ3VyYXRpb24gKGVtcHR5IG9yIGNvbW1lbnQtb25seSkgaXMgdHJlYXRlZCBsaWtlIGEgbWlzc2luZyBvbmUsIGFzIHRzYyBkb2VzLlxuICAgIGlmIChleGlzdGluZ0NvbnRlbnQgIT09IHVuZGVmaW5lZCAmJiAhanNvbmNVdGlsLmlzVHJpdmlhT25seShleGlzdGluZ0NvbnRlbnQpKSB7XG4gICAgICBjb25zdCBvbGRTZXR0aW5ncyA9IGpzb25jVXRpbC5wYXJzZU9iamVjdElnbm9yaW5nRXJyb3I8VHNDb25maWdKc29uPihleGlzdGluZ0NvbnRlbnQpO1xuICAgICAgLy8gQW4gZXhpc3RpbmcgdHNjb25maWcuanNvbiB3YmZ5IGNhbm5vdCBwYXJzZSBtdXN0IGJlIGxlZnQgdW50b3VjaGVkOiB3cml0aW5nIHRoZVxuICAgICAgLy8gZ2VuZXJhdGVkIHNldHRpbmdzIHdpdGhvdXQgbWVyZ2luZyB3b3VsZCBzaWxlbnRseSBkaXNjYXJkIHRoZSBwcm9qZWN0J3MgY29uZmlndXJhdGlvbi5cbiAgICAgIGlmICghb2xkU2V0dGluZ3MpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIGdlbmVyYXRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSB0aGUgZXhpc3RpbmcgY29udGVudCBpcyBub3QgcGFyc2FibGUgYXMgSlNPTkMuYCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIG9yaWdpbmFsU2V0dGluZ3NKc29uID0gSlNPTi5zdHJpbmdpZnkoc29ydEtleXMoc3RydWN0dXJlZENsb25lKG9sZFNldHRpbmdzKSkpO1xuICAgICAgY29uc3QgZXhpc3RpbmdUeXBlcyA9IG5vcm1hbGl6ZVN0cmluZ0FycmF5KG9sZFNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8udHlwZXMpO1xuICAgICAgY29uc3QgZXhpc3RpbmdFbWl0TWV0YWRhdGEgPSBwaWNrRXhpc3RpbmdFbWl0TWV0YWRhdGEob2xkU2V0dGluZ3MuY29tcGlsZXJPcHRpb25zKTtcbiAgICAgIG5ld1NldHRpbmdzLmV4dGVuZHMgPSBtZXJnZVRzY29uZmlnRXh0ZW5kcyhuZXdTZXR0aW5ncy5leHRlbmRzLCBvbGRTZXR0aW5ncy5leHRlbmRzKTtcbiAgICAgIGRlbGV0ZSBvbGRTZXR0aW5ncy5leHRlbmRzO1xuICAgICAgZGVsZXRlIG9sZFNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8uanN4O1xuICAgICAgaWYgKGNvbmZpZy5pc1Jvb3QpIHtcbiAgICAgICAgcmVtb3ZlU3RhbGVNYW5hZ2VkV29ya3NwYWNlRW50cmllcyhjb25maWcsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5ncyk7XG4gICAgICB9XG4gICAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHsgYXJyYXlNZXJnZTogY29tYmluZU1lcmdlIH0pO1xuICAgICAgbmV3U2V0dGluZ3MuaW5jbHVkZSA9IG5ld1NldHRpbmdzLmluY2x1ZGU/LmZpbHRlcihcbiAgICAgICAgKGRpclBhdGg6IHN0cmluZykgPT5cbiAgICAgICAgICAhZGlyUGF0aC5pbmNsdWRlcygnQHR5cGVzJykgJiYgIWRpclBhdGguaW5jbHVkZXMoJ19fdGVzdHNfXy8nKSAmJiAhZGlyUGF0aC5pbmNsdWRlcygndGVzdHMvJylcbiAgICAgICk7XG4gICAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMgPz89IHt9O1xuICAgICAgLy8gd2JmeS1nZW5lcmF0ZWQgdHNjb25maWcuanNvbiBpcyBhIGxpbnQvdHlwZWNoZWNrIHByb2plY3QsIG5vdCB0aGUgZW1pdFxuICAgICAgLy8gY29udHJhY3QuIEl0IG11c3Qga2VlcCByb290RGlyIGJyb2FkIGVub3VnaCBmb3Igcm9vdCBjb25maWcgZmlsZXMsXG4gICAgICAvLyBzY3JpcHRzLCBzcmMsIGFuZCB0ZXN0cy4gYnVpbGQtdHMgb3ducyBlbWl0IGFuZCBjcmVhdGVzIGEgdGVtcG9yYXJ5XG4gICAgICAvLyBzcmMtb25seSB0c2NvbmZpZyB3aXRoIG5vRW1pdD1mYWxzZSwgZW1pdERlY2xhcmF0aW9uT25seT10cnVlLFxuICAgICAgLy8gcm9vdERpcj1cInNyY1wiLCBhbmQgaW5jbHVkZT1bXCJzcmMvKiovKlwiXSwgc28gcHJlc2VydmluZyBub0VtaXQ9ZmFsc2Ugb3JcbiAgICAgIC8vIHJvb3REaXI9XCJzcmNcIiBoZXJlIHdvdWxkIG9ubHkgYnJlYWsgbm9uLXNyYyB0eXBlLWF3YXJlIGxpbnQgY292ZXJhZ2UuXG4gICAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMgPSB7IC4uLm5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucywgLi4uZXhpc3RpbmdFbWl0TWV0YWRhdGEgfTtcblxuICAgICAgY29uc3QgbWVyZ2VkVHlwZXMgPSBbLi4ubmV3IFNldChbLi4uZmlsdGVyRXhpc3RpbmdUeXBlcyhleGlzdGluZ1R5cGVzLCBnZW5lcmF0ZWRUeXBlcyksIC4uLmdlbmVyYXRlZFR5cGVzXSldO1xuICAgICAgaWYgKG1lcmdlZFR5cGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLnR5cGVzID0gbWVyZ2VkVHlwZXM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLnR5cGVzO1xuICAgICAgfVxuICAgICAgaWYgKHNob3VsZERlbGV0ZVR5cGVSb290cyhnZW5lcmF0ZWRUeXBlcykpIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucy50eXBlUm9vdHM7XG4gICAgICB9XG4gICAgfVxuICAgIGFkZFVuZGljaVR5cGVzUGF0aE1hcHBpbmcobmV3U2V0dGluZ3MsIGNvbmZpZyk7XG4gICAgc29ydEtleXMobmV3U2V0dGluZ3MpO1xuICAgIG5ld1NldHRpbmdzLmluY2x1ZGU/LnNvcnQoKTtcbiAgICAvLyBEb24ndCB1c2Ugb2xkIGRlY29yYXRvclxuICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmV4cGVyaW1lbnRhbERlY29yYXRvcnM7XG4gICAgLy8gUGFja2FnZSBpbXBvcnRzIHNob3VsZCByZXNvbHZlIHRocm91Z2ggcGFja2FnZSBleHBvcnRzIGluc3RlYWQgb2YgYmFzZVVybC5cbiAgICAvLyBwYXRocyBpcyBpbnRlbnRpb25hbGx5IHByZXNlcnZlZCBzbyByZXBvLWxvY2FsIHRvb2xpbmcgY2FuIGtlZXAgZXhwbGljaXRcbiAgICAvLyBhbGlhc2VzIHdpdGhvdXQgcmVseWluZyBvbiBiYXNlVXJsJ3MgYnJvYWQgZmFsbGJhY2sgcmVzb2x1dGlvbi5cbiAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5iYXNlVXJsO1xuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy52ZXJiYXRpbU1vZHVsZVN5bnRheDtcbiAgICB9XG4gICAgLy8gU2tpcCB0aGUgd3JpdGUgd2hlbiBub3RoaW5nIGNoYW5nZXMgc2VtYW50aWNhbGx5LCBzbyBKU09OQyBjb21tZW50cyBhbmQgZm9ybWF0dGluZyBpbiBhblxuICAgIC8vIGFscmVhZHktdXAtdG8tZGF0ZSB0c2NvbmZpZy5qc29uIHN1cnZpdmUgd2JmeSBydW5zLlxuICAgIGlmIChvcmlnaW5hbFNldHRpbmdzSnNvbiA9PT0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MpKSByZXR1cm47XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KG5ld1NldHRpbmdzLCB1bmRlZmluZWQsIDIpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFRoZSBtb25vcmVwby1yb290IHRzY29uZmlnLCB3aG9zZSBpbmNsdWRlL2V4Y2x1ZGUgY292ZXIgZXZlcnkgREVDTEFSRUQgd29ya3NwYWNlIGxheW91dCAoZS5nLlxuICogYGFwcHMvKmAgYWxvbmdzaWRlIGBwYWNrYWdlcy8qYCkgc28gdHlwZS1hd2FyZSBsaW50aW5nIHJ1biBmcm9tIHRoZSByb290IHNlZXMgYWxsIHdvcmtzcGFjZVxuICogc291cmNlcywgbm90IGp1c3QgdGhlIGNvbnZlbnRpb25hbCBwYWNrYWdlcy8qIGRpcmVjdG9yeS5cbiAqL1xuZnVuY3Rpb24gYnVpbGRSb290SnNvbk9iaihjb25maWc6IFBhY2thZ2VDb25maWcpOiBUc0NvbmZpZ0pzb24ge1xuICBjb25zdCB3b3Jrc3BhY2VQYXR0ZXJucyA9IGNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29uc1xuICAgID8gZ2V0V29ya3NwYWNlRGlyUGF0dGVybnMoY29uZmlnKVxuICAgIDogeyBleGNsdWRlczogW10sIGluY2x1ZGVzOiBbXSB9O1xuICBjb25zdCBzZXR0aW5ncyA9IHN0cnVjdHVyZWRDbG9uZShzdWJKc29uT2JqKSBhcyBUc0NvbmZpZ0pzb247XG4gIHNldHRpbmdzLmV4Y2x1ZGUgPSBbXG4gICAgLi4ubmV3IFNldChbXG4gICAgICAuLi53b3Jrc3BhY2VQYXR0ZXJucy5pbmNsdWRlcy5tYXAoKHdvcmtzcGFjZVBhdHRlcm4pID0+IGAke3dvcmtzcGFjZVBhdHRlcm59L3Rlc3QvZml4dHVyZXNgKSxcbiAgICAgIC8vIE5lZ2F0aXZlIHdvcmtzcGFjZSBwYXR0ZXJucyAoZS5nLiBgIXBhY2thZ2VzL2V4Y2x1ZGVkYCkgb3B0IHdvcmtzcGFjZSBzdWJ0cmVlcyBvdXQgb2YgdGhlXG4gICAgICAvLyBtb25vcmVwbywgc28gdGhlaXIgc291cmNlcyBtdXN0IG5vdCBlbnRlciB0aGUgcm9vdCB0eXBlLWNoZWNrIHByb2plY3QgZWl0aGVyLiBBIG5lZ2F0aW9uXG4gICAgICAvLyB3aG9zZSBkaXJlY3RvcnkgaXMgYW4gYW5jZXN0b3Igb2YgYSB3b3Jrc3BhY2UgeWllbGRzIHBhY2thZ2Utb3duZWQgc3VicGF0aCBlbnRyaWVzXG4gICAgICAvLyBpbnN0ZWFkIG9mIHRoZSB3aG9sZSBzdWJ0cmVlIChzZWUgZ2V0V29ya3NwYWNlRGlyUGF0dGVybnMpLlxuICAgICAgLi4ud29ya3NwYWNlUGF0dGVybnMuZXhjbHVkZXMsXG4gICAgICAvLyBUaGUgbWFuYWdlZCBpbmNsdWRlcyBhYm92ZSBkZWxpYmVyYXRlbHkgb21pdCBmcmFtZXdvcmsgYGFwcC8qKmAgZGlyZWN0b3JpZXMgKHNlZVxuICAgICAgLy8gc3ViSnNvbk9iai5pbmNsdWRlJ3MgY29tbWVudCksIGJ1dCBhIHJlcG8tYXV0aG9yZWQgYnJvYWQgaW5jbHVkZSBzdWNoIGFzIGBlMmUvKipcXC8qYFxuICAgICAgLy8gY2FuIHN0aWxsIGRyYWcgYSBmcmFtZXdvcmsgd29ya3NwYWNlJ3MgYXBwIHNvdXJjZXMgaW50byB0aGUgcm9vdCBwcm9qZWN0LCB3aGVyZSB0aGV5XG4gICAgICAvLyBmYWlsIHVuZGVyIHRoZSByb290IGNvbXBpbGVyIG9wdGlvbnMg4oCUIHRoZWlyIGJhcmUgYG5leHQvKmAgaW1wb3J0cyByZXNvbHZlIG9ubHkgdGhyb3VnaFxuICAgICAgLy8gdGhlIGZyYW1ld29yayB3b3Jrc3BhY2UncyBvd24gdHNjb25maWcgYHBhdGhzYC4gRXhjbHVkZSB0aG9zZSBhcHAgZGlyZWN0b3JpZXMgc28gdGhlXG4gICAgICAvLyByb290IHByb2plY3QgbmV2ZXIgdHlwZS1jaGVja3MgdGhlbSwgbm8gbWF0dGVyIGhvdyBicm9hZCB0aGUgcmVwbydzIGluY2x1ZGUgZ2xvYnMgYXJlLlxuICAgICAgLi4uZ2V0RnJhbWV3b3JrV29ya3NwYWNlQXBwRXhjbHVkZXMoY29uZmlnKSxcbiAgICAgIC4uLihzZXR0aW5ncy5leGNsdWRlID8/IFtdKSxcbiAgICBdKSxcbiAgXS50b1NvcnRlZCgpO1xuICBzZXR0aW5ncy5pbmNsdWRlID0gW1xuICAgIC4uLihzZXR0aW5ncy5pbmNsdWRlID8/IFtdKSxcbiAgICAuLi53b3Jrc3BhY2VQYXR0ZXJucy5pbmNsdWRlcy5mbGF0TWFwKCh3b3Jrc3BhY2VQYXR0ZXJuKSA9PiBbXG4gICAgICBgJHt3b3Jrc3BhY2VQYXR0ZXJufS8qLmNvbmZpZy50c2AsXG4gICAgICBgJHt3b3Jrc3BhY2VQYXR0ZXJufS9zY3JpcHRzLyoqLypgLFxuICAgICAgYCR7d29ya3NwYWNlUGF0dGVybn0vc3JjLyoqLypgLFxuICAgICAgYCR7d29ya3NwYWNlUGF0dGVybn0vdGVzdC8qKi8qYCxcbiAgICBdKSxcbiAgXTtcbiAgcmV0dXJuIHNldHRpbmdzO1xufVxuXG4vLyBGcmFtZXdvcmsgcGFja2FnZXMgb3duIHRoZWlyIHRzY29uZmlnIChnZW5lcmF0ZVRzY29uZmlnIHNraXBzIHRoZW0pIGFuZCBzaGltIGJhcmUgaW1wb3J0cyBzdWNoIGFzXG4vLyBgbmV4dC9uYXZpZ2F0aW9uYCB0aHJvdWdoIHBhY2thZ2UtbG9jYWwgYHBhdGhzYDsgdmluZXh0IGlzIHRoZSBvcmcncyBOZXh0LmpzLWVxdWl2YWxlbnQgZnJhbWV3b3JrXG4vLyBhbmQgYmVoYXZlcyB0aGUgc2FtZS4gVGhlaXIgYXBwIHNvdXJjZXMgdGhlcmVmb3JlIG9ubHkgdHlwZS1jaGVjayB1bmRlciB0aGVpciBvd24gY29uZmlnLlxuY29uc3QgZnJhbWV3b3JrRGVwZW5kZW5jeU5hbWVzID0gWydibGl0eicsICduZXh0JywgJ3ZpbmV4dCddO1xuXG4vLyBBIGZyYW1ld29yayBhcHAgbGl2ZXMgaW4gYGFwcC9gIG9yLCB1bmRlciB0aGUgc3JjLWRpcmVjdG9yeSBsYXlvdXQsIGBzcmMvYXBwL2AuIFRoZSByb290IHByb2plY3Rcbi8vIGluY2x1ZGVzIGA8d29ya3NwYWNlPi9zcmMvKiovKmAsIHNvIGBzcmMvYXBwYCBsZWFrcyBpbiBqdXN0IGFzIGEgcmVwby13aWRlIGdsb2IgY2FuIHB1bGwgaW4gYGFwcGAuXG5jb25zdCBmcmFtZXdvcmtBcHBEaXJOYW1lcyA9IFsnYXBwJywgJ3NyYy9hcHAnXTtcblxuLyoqIFJvb3QgYGV4Y2x1ZGVgIGVudHJpZXMgKHBvc2l4LCByZWxhdGl2ZSB0byB0aGUgcm9vdCkgZm9yIGV2ZXJ5IGZyYW1ld29yayB3b3Jrc3BhY2UncyBhcHAgZGlyZWN0b3J5LiAqL1xuZnVuY3Rpb24gZ2V0RnJhbWV3b3JrV29ya3NwYWNlQXBwRXhjbHVkZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nW10ge1xuICBpZiAoIWNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucykgcmV0dXJuIFtdO1xuICBjb25zdCBleGNsdWRlczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCB3b3Jrc3BhY2VEaXJQYXRoIG9mIGdldFdvcmtzcGFjZVN1YkRpclBhdGhzKGNvbmZpZykpIHtcbiAgICBpZiAoIWRlcGVuZHNPbkZyYW1ld29yayhwYXRoLnJlc29sdmUod29ya3NwYWNlRGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkgY29udGludWU7XG4gICAgZm9yIChjb25zdCBhcHBEaXJOYW1lIG9mIGZyYW1ld29ya0FwcERpck5hbWVzKSB7XG4gICAgICBjb25zdCBhcHBEaXJQYXRoID0gcGF0aC5yZXNvbHZlKHdvcmtzcGFjZURpclBhdGgsIGFwcERpck5hbWUpO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoYXBwRGlyUGF0aCkpIGV4Y2x1ZGVzLnB1c2gocGF0aC5yZWxhdGl2ZShjb25maWcuZGlyUGF0aCwgYXBwRGlyUGF0aCkucmVwbGFjZUFsbCgnXFxcXCcsICcvJykpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZXhjbHVkZXM7XG59XG5cbmZ1bmN0aW9uIGRlcGVuZHNPbkZyYW1ld29yayhtYW5pZmVzdFBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBsZXQgbWFuaWZlc3Q6IFBhY2thZ2VKc29uIHwgbnVsbDtcbiAgdHJ5IHtcbiAgICBtYW5pZmVzdCA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKG1hbmlmZXN0UGF0aCwgJ3V0ZjgnKSkgYXMgUGFja2FnZUpzb24gfCBudWxsO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLy8gQSBtYW5pZmVzdCB0aGF0IHBhcnNlcyB0byBhIG5vbi1vYmplY3QgKGUuZy4gYSBmaWxlIGxpdGVyYWxseSBjb250YWluaW5nIGBudWxsYCkgZGVjbGFyZXMgbm9cbiAgLy8gZGVwZW5kZW5jaWVzOyBndWFyZCB0aGUgcHJvcGVydHkgYWNjZXNzLCB3aGljaCB3b3VsZCBvdGhlcndpc2UgdGhyb3cgb3V0c2lkZSB0aGUgdHJ5IGFib3ZlLlxuICBpZiAoIW1hbmlmZXN0IHx8IHR5cGVvZiBtYW5pZmVzdCAhPT0gJ29iamVjdCcpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgZGVwZW5kZW5jaWVzID0geyAuLi5tYW5pZmVzdC5kZXBlbmRlbmNpZXMsIC4uLm1hbmlmZXN0LmRldkRlcGVuZGVuY2llcyB9O1xuICByZXR1cm4gZnJhbWV3b3JrRGVwZW5kZW5jeU5hbWVzLnNvbWUoKGRlcGVuZGVuY3lOYW1lKSA9PiBkZXBlbmRlbmNpZXNbZGVwZW5kZW5jeU5hbWVdKTtcbn1cblxuY29uc3QgbWFuYWdlZFdvcmtzcGFjZUluY2x1ZGVTdWZmaXhlcyA9IFsnKi5jb25maWcudHMnLCAnc2NyaXB0cy8qKi8qJywgJ3NyYy8qKi8qJywgJ3Rlc3QvKiovKiddO1xuXG4vKipcbiAqIFJvb3QgaW5jbHVkZS9leGNsdWRlIGVudHJpZXMgd2JmeSBnZW5lcmF0ZWQgZm9yIGFuIGVhcmxpZXIgd29ya3NwYWNlIGxheW91dCAoZS5nLiBgcGFja2FnZXMvKmBcbiAqIGdsb2JzIGluIGEgcmVwbyB0aGF0IG5vdyBkZWNsYXJlcyBvbmx5IGBhcHBzLypgKSBtdXN0IG5vdCBzdXJ2aXZlIHRoZSBtZXJnZSB3aXRoIHRoZSBleGlzdGluZ1xuICogdHNjb25maWcsIG9yIHRoZSBvYnNvbGV0ZSBkaXJlY3RvcmllcyB3b3VsZCBrZWVwIGVudGVyaW5nIHJvb3QgdHlwZSBjaGVja2luZyBmb3JldmVyLiBBIHByZWZpeFxuICogY291bnRzIGFzIHdiZnktbWFuYWdlZCBvbmx5IHdoZW4gdGhlIENPTVBMRVRFIGdlbmVyYXRlZCBpbmNsdWRlIHNldCBmb3IgaXQgaXMgcHJlc2VudCBhbmQgbm9cbiAqIGxvbmdlciBnZW5lcmF0ZWQg4oCUIGEgdXNlci1hdXRob3JlZCBlbnRyeSBzdWNoIGFzIGEgbG9uZSBgdG9vbHMvKlxcL3NyYy8qKlxcLypgIG5ldmVyIHF1YWxpZmllcy5cbiAqL1xuZnVuY3Rpb24gcmVtb3ZlU3RhbGVNYW5hZ2VkV29ya3NwYWNlRW50cmllcyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBvbGRTZXR0aW5nczogVHNDb25maWdKc29uLFxuICBuZXdTZXR0aW5nczogVHNDb25maWdKc29uXG4pOiB2b2lkIHtcbiAgY29uc3Qgc3RhbGVQcmVmaXhlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBpZiAoQXJyYXkuaXNBcnJheShvbGRTZXR0aW5ncy5pbmNsdWRlKSkge1xuICAgIGNvbnN0IG9sZEluY2x1ZGUgPSBvbGRTZXR0aW5ncy5pbmNsdWRlLmZpbHRlcigoZW50cnkpOiBlbnRyeSBpcyBzdHJpbmcgPT4gdHlwZW9mIGVudHJ5ID09PSAnc3RyaW5nJyk7XG4gICAgY29uc3QgZ2VuZXJhdGVkSW5jbHVkZSA9IG5ldyBTZXQobmV3U2V0dGluZ3MuaW5jbHVkZSk7XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBvbGRJbmNsdWRlKSB7XG4gICAgICBjb25zdCB3b3Jrc3BhY2VQcmVmaXggPSBnZXRNYW5hZ2VkV29ya3NwYWNlUHJlZml4KGVudHJ5KTtcbiAgICAgIGlmICh3b3Jrc3BhY2VQcmVmaXggPT09IHVuZGVmaW5lZCB8fCBzdGFsZVByZWZpeGVzLmhhcyh3b3Jrc3BhY2VQcmVmaXgpKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGlzQ29tcGxldGUgPSBtYW5hZ2VkV29ya3NwYWNlSW5jbHVkZVN1ZmZpeGVzLmV2ZXJ5KChzdWZmaXgpID0+XG4gICAgICAgIG9sZEluY2x1ZGUuaW5jbHVkZXMoYCR7d29ya3NwYWNlUHJlZml4fS8ke3N1ZmZpeH1gKVxuICAgICAgKTtcbiAgICAgIGNvbnN0IGlzU3RpbGxHZW5lcmF0ZWQgPSBtYW5hZ2VkV29ya3NwYWNlSW5jbHVkZVN1ZmZpeGVzLnNvbWUoKHN1ZmZpeCkgPT5cbiAgICAgICAgZ2VuZXJhdGVkSW5jbHVkZS5oYXMoYCR7d29ya3NwYWNlUHJlZml4fS8ke3N1ZmZpeH1gKVxuICAgICAgKTtcbiAgICAgIGlmIChpc0NvbXBsZXRlICYmICFpc1N0aWxsR2VuZXJhdGVkKSBzdGFsZVByZWZpeGVzLmFkZCh3b3Jrc3BhY2VQcmVmaXgpO1xuICAgIH1cbiAgICBpZiAoc3RhbGVQcmVmaXhlcy5zaXplID4gMCkge1xuICAgICAgb2xkU2V0dGluZ3MuaW5jbHVkZSA9IG9sZFNldHRpbmdzLmluY2x1ZGUuZmlsdGVyKChlbnRyeSkgPT4ge1xuICAgICAgICBjb25zdCB3b3Jrc3BhY2VQcmVmaXggPSB0eXBlb2YgZW50cnkgPT09ICdzdHJpbmcnID8gZ2V0TWFuYWdlZFdvcmtzcGFjZVByZWZpeChlbnRyeSkgOiB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiB3b3Jrc3BhY2VQcmVmaXggPT09IHVuZGVmaW5lZCB8fCAhc3RhbGVQcmVmaXhlcy5oYXMod29ya3NwYWNlUHJlZml4KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBpZiAoIUFycmF5LmlzQXJyYXkob2xkU2V0dGluZ3MuZXhjbHVkZSkpIHJldHVybjtcbiAgY29uc3QgZ2VuZXJhdGVkRXhjbHVkZSA9IG5ldyBTZXQobmV3U2V0dGluZ3MuZXhjbHVkZSk7XG4gIGNvbnN0IHdvcmtzcGFjZURpclBhdGhzID0gY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zXG4gICAgPyBnZXRXb3Jrc3BhY2VTdWJEaXJQYXRocyhjb25maWcpLm1hcCgod29ya3NwYWNlRGlyUGF0aCkgPT5cbiAgICAgICAgcGF0aC5yZWxhdGl2ZShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgpLCB3b3Jrc3BhY2VEaXJQYXRoKS5yZXBsYWNlQWxsKCdcXFxcJywgJy8nKVxuICAgICAgKVxuICAgIDogW107XG4gIG9sZFNldHRpbmdzLmV4Y2x1ZGUgPSBvbGRTZXR0aW5ncy5leGNsdWRlLmZpbHRlcigoZW50cnkpID0+IHtcbiAgICBpZiAodHlwZW9mIGVudHJ5ICE9PSAnc3RyaW5nJyB8fCBnZW5lcmF0ZWRFeGNsdWRlLmhhcyhlbnRyeSkpIHJldHVybiB0cnVlO1xuICAgIGlmIChlbnRyeS5lbmRzV2l0aCgnL3Rlc3QvZml4dHVyZXMnKSkge1xuICAgICAgcmV0dXJuICFzdGFsZVByZWZpeGVzLmhhcyhlbnRyeS5zbGljZSgwLCAtJy90ZXN0L2ZpeHR1cmVzJy5sZW5ndGgpKTtcbiAgICB9XG4gICAgLy8gQSBmcmFtZXdvcmsgYXBwIGV4Y2x1ZGUgKGA8d29ya3NwYWNlPi9hcHBgLCBgPHdvcmtzcGFjZT4vc3JjL2FwcGApIGZvciBhIHN0aWxsLWRlY2xhcmVkXG4gICAgLy8gd29ya3NwYWNlIGlzIHBydW5lZCBieSBjb3ZlcnNXb3Jrc3BhY2VEaXIgYmVsb3cgd2hlbiBubyBsb25nZXIgZ2VuZXJhdGVkOyB0aGlzIGNhdGNoZXMgdGhlXG4gICAgLy8gcmVtYWluaW5nIGNhc2UsIHdoZXJlIHRoZSB3b3Jrc3BhY2UgaXRzZWxmIHdhcyByZW1vdmVkIGFuZCBpdHMgcHJlZml4IGlzIHRoZXJlZm9yZSBzdGFsZS5cbiAgICAvLyAoQSB3cm9uZyBzdWZmaXggc3RyaXAgeWllbGRzIGEgcHJlZml4IGFic2VudCBmcm9tIHN0YWxlUHJlZml4ZXMsIHNvIHRlc3RpbmcgZXZlcnkgbmFtZSBpcyBzYWZlLilcbiAgICBpZiAoXG4gICAgICBmcmFtZXdvcmtBcHBEaXJOYW1lcy5zb21lKFxuICAgICAgICAoYXBwRGlyTmFtZSkgPT4gZW50cnkuZW5kc1dpdGgoYC8ke2FwcERpck5hbWV9YCkgJiYgc3RhbGVQcmVmaXhlcy5oYXMoZW50cnkuc2xpY2UoMCwgLShhcHBEaXJOYW1lLmxlbmd0aCArIDEpKSlcbiAgICAgIClcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuICFjb3ZlcnNXb3Jrc3BhY2VEaXIoZW50cnksIHdvcmtzcGFjZURpclBhdGhzKTtcbiAgfSk7XG59XG5cbi8vIFdoZXRoZXIgYW4gZXhjbHVkZSBlbnRyeSBpcyBhIHdvcmtzcGFjZSBuZWdhdGlvbiAoYCFhcHBzL2V4Y2x1ZGVkYCkgd2hvc2UgbmVnYXRpb24gaXMgZ29uZTogdGhlXG4vLyBkaXJlY3RvcnkgaXMgYSB3b3Jrc3BhY2UgYWdhaW4gYW5kIG11c3QgcmUtZW50ZXIgdGhlIHJvb3QgcHJvamVjdC4gd2JmeSB3cml0ZXMgc3VjaCBhIG5lZ2F0aW9uIGFzXG4vLyBhIGRpcmVjdG9yeSBwYXRoLCBhcyBhIGRpcmVjdG9yeSBQQVRURVJOIHdoZW4gaXQgZXhjbHVkZXMgZXhhY3RseSB3aGF0IGl0IG1hdGNoZXMgKGBhcHBzLypiYCksIG9yXG4vLyBhcyBhbiBhbmNlc3RvcidzIHBhY2thZ2Utb3duZWQgc3VicGF0aHMgKGBhcHBzL3gvc3JjYCkg4oCUIHNvIHRoZSBlbnRyeSBtYXkgY292ZXIgYSBkaXNjb3ZlcmVkXG4vLyB3b3Jrc3BhY2UgZGlyZWN0b3J5IG9yIHNpdCB1bmRlciBvbmUuIEEgZ2xvYnN0YXIgc2VnbWVudCBtYXJrcyBhIGh5Z2llbmUgZ2xvYiAobm9kZV9tb2R1bGVzLCBlMmVcbi8vIGFuZCBmcmllbmRzKSwgd2hpY2ggaXMgbmV2ZXIgbmVnYXRpb24tZGVyaXZlZCBhbmQgbXVzdCBzdXJ2aXZlLlxuZnVuY3Rpb24gY292ZXJzV29ya3NwYWNlRGlyKGVudHJ5OiBzdHJpbmcsIHdvcmtzcGFjZURpclBhdGhzOiByZWFkb25seSBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICBpZiAoZW50cnkuc3BsaXQoJy8nKS5pbmNsdWRlcygnKionKSkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCByZWdleFNvdXJjZSA9IGVudHJ5XG4gICAgLnNwbGl0KCcvJylcbiAgICAubWFwKChzZWdtZW50KSA9PlxuICAgICAgc2VnbWVudFxuICAgICAgICAucmVwbGFjZUFsbCgvWy4rXiR7fSgpfFtcXF1cXFxcXS9ndSwgU3RyaW5nLnJhd2BcXCQmYClcbiAgICAgICAgLnJlcGxhY2VBbGwoJyonLCAnW14vXSonKVxuICAgICAgICAucmVwbGFjZUFsbCgnPycsICdbXi9dJylcbiAgICApXG4gICAgLmpvaW4oJy8nKTtcbiAgY29uc3QgZW50cnlQYXR0ZXJuID0gbmV3IFJlZ0V4cChgXiR7cmVnZXhTb3VyY2V9KD86Ly4qKT8kYCwgJ3UnKTtcbiAgcmV0dXJuIHdvcmtzcGFjZURpclBhdGhzLnNvbWUoXG4gICAgKHdvcmtzcGFjZURpclBhdGgpID0+IGVudHJ5UGF0dGVybi50ZXN0KHdvcmtzcGFjZURpclBhdGgpIHx8IGVudHJ5LnN0YXJ0c1dpdGgoYCR7d29ya3NwYWNlRGlyUGF0aH0vYClcbiAgKTtcbn1cblxuZnVuY3Rpb24gZ2V0TWFuYWdlZFdvcmtzcGFjZVByZWZpeChlbnRyeTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgbWF0Y2hlZFN1ZmZpeCA9IG1hbmFnZWRXb3Jrc3BhY2VJbmNsdWRlU3VmZml4ZXMuZmluZCgoc3VmZml4KSA9PiBlbnRyeS5lbmRzV2l0aChgLyR7c3VmZml4fWApKTtcbiAgaWYgKCFtYXRjaGVkU3VmZml4KSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCB3b3Jrc3BhY2VQcmVmaXggPSBlbnRyeS5zbGljZSgwLCAtKG1hdGNoZWRTdWZmaXgubGVuZ3RoICsgMSkpO1xuICByZXR1cm4gd29ya3NwYWNlUHJlZml4ID09PSAnJyA/IHVuZGVmaW5lZCA6IHdvcmtzcGFjZVByZWZpeDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbm9ybWFsaXplRnJhbWV3b3JrVHNjb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIC8vIE5leHQvQmxpdHogb3duIHRoZWlyIHRzY29uZmlnIHNoYXBlLCBidXQgVHlwZVNjcmlwdCA2IG5vIGxvbmdlciBhY2NlcHRzXG4gIC8vIG5vZGUxMCByZXNvbHZlciBzcGVsbGluZ3MgdGhhdCBvbGRlciBwcm9qZWN0cyBjb21tb25seSBpbmhlcml0ZWQuXG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAndHNjb25maWcuanNvbicpO1xuICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gIGlmIChleGlzdGluZ0NvbnRlbnQgPT09IHVuZGVmaW5lZCB8fCBqc29uY1V0aWwuaXNUcml2aWFPbmx5KGV4aXN0aW5nQ29udGVudCkpIHJldHVybjtcbiAgY29uc3Qgc2V0dGluZ3MgPSBqc29uY1V0aWwucGFyc2VPYmplY3RJZ25vcmluZ0Vycm9yPFRzQ29uZmlnSnNvbj4oZXhpc3RpbmdDb250ZW50KTtcbiAgaWYgKCFzZXR0aW5ncykge1xuICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCBjbGVhbmluZyB1cCAke2ZpbGVQYXRofSBiZWNhdXNlIHRoZSBleGlzdGluZyBjb250ZW50IGlzIG5vdCBwYXJzYWJsZSBhcyBKU09OQy5gKTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3Qgb3JpZ2luYWxTZXR0aW5nc0pzb24gPSBKU09OLnN0cmluZ2lmeShzZXR0aW5ncyk7XG4gIG5vcm1hbGl6ZU5leHRUc2NvbmZpZ01vZHVsZVNldHRpbmdzKHNldHRpbmdzKTtcbiAgbm9ybWFsaXplTmV4dFRzY29uZmlnUGF0aEFsaWFzZXMoc2V0dGluZ3MuY29tcGlsZXJPcHRpb25zKTtcbiAgYWRkU2NyaXB0c0luY2x1ZGVGb3JGcmFtZXdvcmtQcm9qZWN0KHNldHRpbmdzKTtcbiAgYWRkVW5kaWNpVHlwZXNQYXRoTWFwcGluZyhzZXR0aW5ncywgY29uZmlnKTtcbiAgLy8gU2tpcCB0aGUgd3JpdGUgd2hlbiBub3RoaW5nIGNoYW5nZXMgc2VtYW50aWNhbGx5LCBzbyBKU09OQyBjb21tZW50cyBhbmQgZm9ybWF0dGluZyBpbiBhblxuICAvLyBhbHJlYWR5LWNsZWFuIHRzY29uZmlnLmpzb24gc3Vydml2ZSB3YmZ5IHJ1bnMuXG4gIGlmIChKU09OLnN0cmluZ2lmeShzZXR0aW5ncykgPT09IG9yaWdpbmFsU2V0dGluZ3NKc29uKSByZXR1cm47XG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBKU09OLnN0cmluZ2lmeShzZXR0aW5ncywgdW5kZWZpbmVkLCAyKSkpO1xufVxuXG4vKipcbiAqIGJ1bi10eXBlcyByZWZlcmVuY2VzIHVuZGljaS10eXBlcyB3aXRob3V0IGRlY2xhcmluZyBpdCBhcyBhIGRlcGVuZGVuY3kgKG92ZW4tc2gvYnVuIzIyODA1KSwgc29cbiAqIEJ1bidzIGlzb2xhdGVkIGxpbmtlciAoZXNwZWNpYWxseSB3aXRoIHRoZSBnbG9iYWwgc3RvcmUgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeSkgY2Fubm90IHJlc29sdmVcbiAqIGl0IGZyb20gYnVuLXR5cGVzJyBsb2NhdGlvbiwgd2hpY2ggc2lsZW50bHkgZGVncmFkZXMgZ2xvYmFsIGZldGNoIHR5cGVzIHN1Y2ggYXMgUmVzcG9uc2UuIE1hcCBpdFxuICogdG8gdGhlIGNvcHkgdGhhdCBidW5maWcudG9tbCdzIHB1YmxpY0hvaXN0UGF0dGVybiBwbGFjZXMgaW4gdGhlIHJvb3Qgbm9kZV9tb2R1bGVzLlxuICovXG5mdW5jdGlvbiBhZGRVbmRpY2lUeXBlc1BhdGhNYXBwaW5nKHNldHRpbmdzOiBUc0NvbmZpZ0pzb24sIGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHZvaWQge1xuICAvLyBNYXAgdW5kaWNpLXR5cGVzIG9ubHkgd2hlbiBidW4tdHlwZXMgYWN0dWFsbHkgbG9hZHM6IGFuIGV4cGxpY2l0IGB0eXBlc2AgbGlzdCBsb2FkcyBpdCBpZmYgaXRcbiAgLy8gY29udGFpbnMgXCJidW5cIiAoZXZlbiBvbiBSZWFjdCBOYXRpdmUsIHdob3NlIHByb2plY3RzIG1heSBvcHQgaW4gYnkgaGFuZCk7IHdpdGggYHR5cGVzYFxuICAvLyBvbWl0dGVkLCBUeXBlU2NyaXB0J3MgYXV0b21hdGljIEB0eXBlcyBpbmNsdXNpb24gbG9hZHMgaXQgYmVjYXVzZSB3YmZ5IGluc3RhbGxzIEB0eXBlcy9idW5cbiAgLy8gZm9yIGV2ZXJ5IEphdmFTY3JpcHQgb3IgVHlwZVNjcmlwdCBwcm9qZWN0IGV4Y2VwdCBSZWFjdCBOYXRpdmUsIHdoaWNoIHVzZXNcbiAgLy8gQHRzY29uZmlnL3JlYWN0LW5hdGl2ZSBpbnN0ZWFkLlxuICBjb25zdCB0eXBlcyA9IHNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8udHlwZXM7XG4gIGlmICh0eXBlcyA/ICF0eXBlcy5pbmNsdWRlcygnYnVuJykgOiBjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSByZXR1cm47XG4gIGNvbnN0IGNvcnJlY3RNYXBwaW5nID0gYCR7Z2V0Um9vdERpcihjb25maWcpfS9ub2RlX21vZHVsZXMvdW5kaWNpLXR5cGVzL2luZGV4LmQudHNgO1xuICBjb25zdCBleGlzdGluZ01hcHBpbmcgPSBzZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LnBhdGhzPy5bJ3VuZGljaS10eXBlcyddO1xuICBpZiAoZXhpc3RpbmdNYXBwaW5nKSB7XG4gICAgLy8gUmV3cml0ZSB0aGUgZ2VuZXJhdGVkIG1hcHBpbmcgd2hlbiBhIHdvcmtzcGFjZSBtb3ZlcyB0byBhIGRpZmZlcmVudCByb290IGRlcHRoLiBBbnkgb3RoZXJcbiAgICAvLyB2YWx1ZSBpcyBhIGRlbGliZXJhdGUgcmVwby1sb2NhbCBtYXBwaW5nIChlLmcuIHBhdGNoZWQgdHlwZXMpIGFuZCBtdXN0IGJlIGtlcHQuXG4gICAgaWYgKFxuICAgICAgZXhpc3RpbmdNYXBwaW5nLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgdHlwZW9mIGV4aXN0aW5nTWFwcGluZ1swXSA9PT0gJ3N0cmluZycgJiZcbiAgICAgIC8oPzpefFxcLylub2RlX21vZHVsZXNcXC91bmRpY2ktdHlwZXNcXC9pbmRleFxcLmRcXC50cyQvdS50ZXN0KGV4aXN0aW5nTWFwcGluZ1swXSlcbiAgICApIHtcbiAgICAgIHNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyEucGF0aHMhWyd1bmRpY2ktdHlwZXMnXSA9IFtjb3JyZWN0TWFwcGluZ107XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIHNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyA/Pz0ge307XG4gIHNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucy5wYXRocyA9IHtcbiAgICAuLi5zZXR0aW5ncy5jb21waWxlck9wdGlvbnMucGF0aHMsXG4gICAgJ3VuZGljaS10eXBlcyc6IFtjb3JyZWN0TWFwcGluZ10sXG4gIH07XG59XG5cbmZ1bmN0aW9uIGFkZFNjcmlwdHNJbmNsdWRlRm9yRnJhbWV3b3JrUHJvamVjdChzZXR0aW5nczogVHNDb25maWdKc29uKTogdm9pZCB7XG4gIC8vIE9taXR0aW5nIGluY2x1ZGUgbGV0cyBmcmFtZXdvcmsgdHNjb25maWdzIGtlZXAgVHlwZVNjcmlwdCdzIGRlZmF1bHRcbiAgLy8gXCJhbGwgVFMvVFNYIGZpbGVzXCIgYmVoYXZpb3IsIHdoaWNoIGFscmVhZHkgY292ZXJzIHNjcmlwdHMuXG4gIGlmICghc2V0dGluZ3MuaW5jbHVkZSkgcmV0dXJuO1xuICBpZiAoc2V0dGluZ3MuaW5jbHVkZS5pbmNsdWRlcygnc2NyaXB0cy8qKi8qJykpIHJldHVybjtcblxuICBzZXR0aW5ncy5pbmNsdWRlLnB1c2goJ3NjcmlwdHMvKiovKicpO1xuICBzZXR0aW5ncy5pbmNsdWRlLnNvcnQoKTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplTmV4dFRzY29uZmlnTW9kdWxlU2V0dGluZ3Moc2V0dGluZ3M6IFRzQ29uZmlnSnNvbik6IHZvaWQge1xuICBjb25zdCBjb21waWxlck9wdGlvbnMgPSBzZXR0aW5ncy5jb21waWxlck9wdGlvbnM7XG4gIGlmICghY29tcGlsZXJPcHRpb25zKSByZXR1cm47XG4gIGNvbnN0IG1vZHVsZVJlc29sdXRpb24gPSBsb3dlckNhc2VTZXR0aW5nKGNvbXBpbGVyT3B0aW9ucy5tb2R1bGVSZXNvbHV0aW9uKTtcbiAgaWYgKG1vZHVsZVJlc29sdXRpb24gPT09ICdub2RlJyB8fCBtb2R1bGVSZXNvbHV0aW9uID09PSAnbm9kZTEwJyB8fCBtb2R1bGVSZXNvbHV0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICBpZiAoc2V0dGluZ3MuZXh0ZW5kcykge1xuICAgICAgLy8gQW4gZXh0ZW5kZWQgY29uZmlnIG1heSBhbHJlYWR5IHN1cHBseSBhIHZhbGlkIG1vZHVsZS9yZXNvbHZlciBwYWlyLCBzbyBvbmx5XG4gICAgICAvLyByZW1vdmUgdGhlIHJlbW92ZWQtaW4tVFM2IG5vZGUxMCBzcGVsbGluZ3MgaW5zdGVhZCBvZiBmb3JjaW5nIGJ1bmRsZXIgb24gaXQuXG4gICAgICBkZWxldGUgY29tcGlsZXJPcHRpb25zLm1vZHVsZVJlc29sdXRpb247XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5leHQuanMgd3JpdGVzIFwibm9kZVwiIGR1cmluZyBidWlsZCB3aGVuIHRoaXMgb3B0aW9uIGlzIG1pc3NpbmcsIGJ1dFxuICAgICAgLy8gdHNnb2xpbnQgdHJlYXRzIHRoYXQgc3BlbGxpbmcgYXMgdGhlIHJlbW92ZWQgbm9kZTEwIHJlc29sdmVyLlxuICAgICAgY29tcGlsZXJPcHRpb25zLm1vZHVsZVJlc29sdXRpb24gPSAnYnVuZGxlcic7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZU5leHRUc2NvbmZpZ1BhdGhBbGlhc2VzKGNvbXBpbGVyT3B0aW9uczogVHNDb25maWdKc29uLkNvbXBpbGVyT3B0aW9ucyB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICBpZiAoIWNvbXBpbGVyT3B0aW9ucykgcmV0dXJuO1xuXG4gIC8vIHRzZ29saW50IGZvbGxvd3MgVHlwZVNjcmlwdCA2IHZhbGlkYXRpb24sIHdoZXJlIGJhc2VVcmwgaXMgcmVtb3ZlZCBhbmRcbiAgLy8gcGF0aCB0YXJnZXRzIG11c3QgYmUgZXhwbGljaXRseSByZWxhdGl2ZS4gTmV4dC5qcyBzdGlsbCBhY2NlcHRzIHRoZSBhbGlhc1xuICAvLyBzaGFwZSBhZnRlciBlYWNoIHRhcmdldCBpcyB3cml0dGVuIHdpdGggYSBsZWFkaW5nIC4vLlxuICBkZWxldGUgY29tcGlsZXJPcHRpb25zLmJhc2VVcmw7XG4gIGlmICghY29tcGlsZXJPcHRpb25zLnBhdGhzKSByZXR1cm47XG5cbiAgZm9yIChjb25zdCBbYWxpYXMsIHRhcmdldHNdIG9mIE9iamVjdC5lbnRyaWVzKGNvbXBpbGVyT3B0aW9ucy5wYXRocykpIHtcbiAgICBjb21waWxlck9wdGlvbnMucGF0aHNbYWxpYXNdID0gbm9ybWFsaXplUGF0aEFsaWFzVGFyZ2V0cyh0YXJnZXRzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVQYXRoQWxpYXNUYXJnZXRzKHRhcmdldHM6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICByZXR1cm4gdGFyZ2V0cy5tYXAoKHRhcmdldCkgPT4ge1xuICAgIGlmICh0YXJnZXQuc3RhcnRzV2l0aCgnLi8nKSB8fCB0YXJnZXQuc3RhcnRzV2l0aCgnLi4vJykgfHwgcGF0aC5pc0Fic29sdXRlKHRhcmdldCkpIHJldHVybiB0YXJnZXQ7XG4gICAgcmV0dXJuIGAuLyR7dGFyZ2V0fWA7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRSb290RGlyKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIGlmIChjb25maWcuaXNSb290KSByZXR1cm4gJy4nO1xuICAvLyBUaGUgdW5kaWNpLXR5cGVzIHBhdGggbWFwcGluZyBtdXN0IHJlYWNoIHRoZSBtb25vcmVwbyByb290J3Mgbm9kZV9tb2R1bGVzIChidW5maWcudG9tbCdzXG4gIC8vIHB1YmxpY0hvaXN0UGF0dGVybiBob2lzdHMgdGhlIHBhY2thZ2UgdGhlcmUpLCBhbmQgd29ya3NwYWNlIHBhdHRlcm5zIG1heSBiZSBhcmJpdHJhcmlseSBkZWVwXG4gIC8vIChlLmcuIGBleGFtcGxlcy8qKmApLCBzbyBhIGZpeGVkIHR3by1sZXZlbCBwcm9iZSBpcyBub3QgZW5vdWdoLiBQcmVmZXIgdGhlIG5lYXJlc3QgYW5jZXN0b3JcbiAgLy8gbWFuaWZlc3QgdGhhdCBkZWNsYXJlcyB3b3Jrc3BhY2VzICh0aGUgbW9ub3JlcG8gcm9vdCk7IG90aGVyd2lzZSBmYWxsIGJhY2sgdG8gdGhlIG5lYXJlc3RcbiAgLy8gYW5jZXN0b3IgbWFuaWZlc3QuIFN0b3AgYXQgdGhlIGZpcnN0IGdpdCByZXBvc2l0b3J5IGJvdW5kYXJ5IHNvIGFuIHVucmVsYXRlZCBlbmNsb3NpbmdcbiAgLy8gcmVwb3NpdG9yeSdzIG1hbmlmZXN0IGNhbiBuZXZlciBiZSBjaG9zZW4uXG4gIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgpO1xuICBsZXQgcm9vdERpclBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgZm9yIChsZXQgYW5jZXN0b3JEaXJQYXRoID0gcGF0aC5kaXJuYW1lKGRpclBhdGgpOyA7IGFuY2VzdG9yRGlyUGF0aCA9IHBhdGguZGlybmFtZShhbmNlc3RvckRpclBhdGgpKSB7XG4gICAgY29uc3QgbWFuaWZlc3RQYXRoID0gcGF0aC5yZXNvbHZlKGFuY2VzdG9yRGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKG1hbmlmZXN0UGF0aCkpIHtcbiAgICAgIHJvb3REaXJQYXRoID8/PSBhbmNlc3RvckRpclBhdGg7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBtYW5pZmVzdCA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKG1hbmlmZXN0UGF0aCwgJ3V0ZjgnKSkgYXMgUGFja2FnZUpzb247XG4gICAgICAgIC8vIEJ1biBuby1vcCBwYXR0ZXJucyAoZS5nLiBgd29ya3NwYWNlczogW1wiXCJdYCkgZG8gbm90IG1ha2UgYSBtYW5pZmVzdCBhIHdvcmtzcGFjZSByb290LlxuICAgICAgICBpZiAoZ2V0TWVhbmluZ2Z1bERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMobWFuaWZlc3Qud29ya3NwYWNlcykubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHJvb3REaXJQYXRoID0gYW5jZXN0b3JEaXJQYXRoO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gQW4gdW5wYXJzYWJsZSBtYW5pZmVzdCBzdGlsbCBtYXJrcyBhIHByb2plY3QgZGlyZWN0b3J5OyBrZWVwIGNsaW1iaW5nIGZvciBhIHdvcmtzcGFjZSByb290LlxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBpc1JlcG9Cb3VuZGFyeSA9IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGFuY2VzdG9yRGlyUGF0aCwgJy5naXQnKSk7XG4gICAgY29uc3QgaXNGaWxlc3lzdGVtUm9vdCA9IGFuY2VzdG9yRGlyUGF0aCA9PT0gcGF0aC5kaXJuYW1lKGFuY2VzdG9yRGlyUGF0aCk7XG4gICAgaWYgKGlzUmVwb0JvdW5kYXJ5IHx8IGlzRmlsZXN5c3RlbVJvb3QpIGJyZWFrO1xuICB9XG4gIGlmICghcm9vdERpclBhdGgpIHJldHVybiAnLic7XG4gIHJldHVybiBwYXRoLnJlbGF0aXZlKGRpclBhdGgsIHJvb3REaXJQYXRoKS5yZXBsYWNlQWxsKCdcXFxcJywgJy8nKSB8fCAnLic7XG59XG5cbmZ1bmN0aW9uIG1lcmdlVHNjb25maWdFeHRlbmRzKFxuICBnZW5lcmF0ZWRFeHRlbmRzOiBUc0NvbmZpZ0pzb25bJ2V4dGVuZHMnXSxcbiAgZXhpc3RpbmdFeHRlbmRzOiBUc0NvbmZpZ0pzb25bJ2V4dGVuZHMnXVxuKTogVHNDb25maWdKc29uWydleHRlbmRzJ10ge1xuICBjb25zdCBtZXJnZWRFeHRlbmRzID0gWy4uLm5vcm1hbGl6ZUV4dGVuZHMoZ2VuZXJhdGVkRXh0ZW5kcyksIC4uLm5vcm1hbGl6ZUV4dGVuZHMoZXhpc3RpbmdFeHRlbmRzKV07XG4gIGNvbnN0IHVuaXF1ZUV4dGVuZHMgPSBbLi4ubmV3IFNldChtZXJnZWRFeHRlbmRzKV07XG4gIGlmICh1bmlxdWVFeHRlbmRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKHVuaXF1ZUV4dGVuZHMubGVuZ3RoID09PSAxKSByZXR1cm4gdW5pcXVlRXh0ZW5kc1swXTtcbiAgcmV0dXJuIHVuaXF1ZUV4dGVuZHM7XG59XG5cbmZ1bmN0aW9uIGFkZEluY2x1ZGVQYXRoKHNldHRpbmdzOiBUc0NvbmZpZ0pzb24sIGRpclBhdGg6IHN0cmluZyk6IHZvaWQge1xuICBzZXR0aW5ncy5pbmNsdWRlID8/PSBbXTtcbiAgaWYgKCFzZXR0aW5ncy5pbmNsdWRlLmluY2x1ZGVzKGRpclBhdGgpKSB7XG4gICAgc2V0dGluZ3MuaW5jbHVkZS5wdXNoKGRpclBhdGgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUV4dGVuZHModmFsdWU6IFRzQ29uZmlnSnNvblsnZXh0ZW5kcyddKTogc3RyaW5nW10ge1xuICBpZiAoIXZhbHVlKSByZXR1cm4gW107XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplU3RyaW5nQXJyYXkodmFsdWU6IHVua25vd24pOiBzdHJpbmdbXSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSByZXR1cm4gW3ZhbHVlXTtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIFtdO1xuICByZXR1cm4gdmFsdWUuZmlsdGVyKChpdGVtKTogaXRlbSBpcyBzdHJpbmcgPT4gdHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkRGVsZXRlVHlwZVJvb3RzKHR5cGVOYW1lczogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgLy8gT25seSBnZW5lcmF0ZWQgcGFja2FnZS1vd25lZCB0ZXN0IHR5cGVzIHNob3VsZCB0cmlnZ2VyIHRoaXMuIFVzZXItZGVmaW5lZCBzbGFzaC1iYXNlZFxuICAvLyBlbnRyaWVzIG1heSBpbnRlbnRpb25hbGx5IHJlbHkgb24gY3VzdG9tIHR5cGVSb290cyBhbmQgc2hvdWxkIGJlIHByZXNlcnZlZCBhcy1pcy5cbiAgcmV0dXJuIHR5cGVOYW1lcy5zb21lKCh0eXBlTmFtZSkgPT4gdHlwZU5hbWUgPT09ICdjeXByZXNzJyB8fCB0eXBlTmFtZS5pbmNsdWRlcygnLycpKTtcbn1cblxuZnVuY3Rpb24gZmlsdGVyRXhpc3RpbmdUeXBlcyhleGlzdGluZ1R5cGVzOiBzdHJpbmdbXSwgZ2VuZXJhdGVkVHlwZXM6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICBjb25zdCBnZW5lcmF0ZWRUeXBlU2V0ID0gbmV3IFNldChnZW5lcmF0ZWRUeXBlcyk7XG4gIHJldHVybiBleGlzdGluZ1R5cGVzLmZpbHRlcigodHlwZU5hbWUpID0+IHtcbiAgICAvLyB3YmZ5IG93bnMgdGhlc2UgcGFja2FnZS1wcm92aWRlZCB0ZXN0IGdsb2JhbHMuIERyb3Agc3RhbGUgZW50cmllcyB3aGVuIHRoZVxuICAgIC8vIGNvcnJlc3BvbmRpbmcgZGVwZW5kZW5jeSBpcyBubyBsb25nZXIgcHJlc2VudCBzbyBUeXBlU2NyaXB0IHdvbid0IHJlcXVpcmVcbiAgICAvLyBtaXNzaW5nIHBhY2thZ2VzIHN1Y2ggYXMgdml0ZXN0LlxuICAgIGlmIChpc0dlbmVyYXRlZFRlc3RHbG9iYWxUeXBlKHR5cGVOYW1lKSAmJiAhZ2VuZXJhdGVkVHlwZVNldC5oYXModHlwZU5hbWUpKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBpc0dlbmVyYXRlZFRlc3RHbG9iYWxUeXBlKHR5cGVOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVOYW1lID09PSAnY3lwcmVzcycgfHwgdHlwZU5hbWUgPT09ICdqZXN0JyB8fCB0eXBlTmFtZSA9PT0gJ21vY2hhJyB8fCB0eXBlTmFtZSA9PT0gJ3ZpdGVzdC9nbG9iYWxzJztcbn1cblxuZnVuY3Rpb24gbG93ZXJDYXNlU2V0dGluZyh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdmFsdWUudG9Mb3dlckNhc2UoKSA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gcGlja0V4aXN0aW5nRW1pdE1ldGFkYXRhKFxuICBjb21waWxlck9wdGlvbnM6IFRzQ29uZmlnSnNvblsnY29tcGlsZXJPcHRpb25zJ11cbik6IFBpY2s8Tm9uTnVsbGFibGU8VHNDb25maWdKc29uWydjb21waWxlck9wdGlvbnMnXT4sICdkZWNsYXJhdGlvbicgfCAnZGVjbGFyYXRpb25NYXAnIHwgJ3NvdXJjZU1hcCc+IHtcbiAgY29uc3QgZW1pdE9wdGlvbnMgPSB7fSBhcyBQaWNrPFxuICAgIE5vbk51bGxhYmxlPFRzQ29uZmlnSnNvblsnY29tcGlsZXJPcHRpb25zJ10+LFxuICAgICdkZWNsYXJhdGlvbicgfCAnZGVjbGFyYXRpb25NYXAnIHwgJ3NvdXJjZU1hcCdcbiAgPjtcbiAgZm9yIChjb25zdCBrZXkgb2YgWydkZWNsYXJhdGlvbicsICdkZWNsYXJhdGlvbk1hcCcsICdzb3VyY2VNYXAnXSBhcyBjb25zdCkge1xuICAgIGNvbnN0IHZhbHVlID0gY29tcGlsZXJPcHRpb25zPy5ba2V5XTtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZW1pdE9wdGlvbnNba2V5XSA9IHZhbHVlIGFzIG5ldmVyO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZW1pdE9wdGlvbnM7XG59XG5cbmZ1bmN0aW9uIGdldEdlbmVyYXRlZFR5cGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgdHlwZU5hbWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IGRlcGVuZGVuY2llcyA9IHtcbiAgICAuLi5jb25maWcucGFja2FnZUpzb24/LmRlcGVuZGVuY2llcyxcbiAgICAuLi5jb25maWcucGFja2FnZUpzb24/LmRldkRlcGVuZGVuY2llcyxcbiAgfTtcblxuICAvLyBSZWFjdCBOYXRpdmUgZ2V0cyBpdHMgYW1iaWVudCB0eXBlcyBmcm9tIEB0c2NvbmZpZy9yZWFjdC1uYXRpdmUgKHJlYWN0LW5hdGl2ZSwgamVzdCkuXG4gIGlmICghY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgIHR5cGVOYW1lcy5hZGQoJ2J1bicpO1xuICB9XG4gIGlmIChcbiAgICBkZXBlbmRlbmNpZXMuamVzdCB8fFxuICAgIGRlcGVuZGVuY2llc1snQGplc3QvZ2xvYmFscyddIHx8XG4gICAgZGVwZW5kZW5jaWVzWydqZXN0LWVudmlyb25tZW50LWpzZG9tJ10gfHxcbiAgICBkZXBlbmRlbmNpZXNbJ3RzLWplc3QnXVxuICApIHtcbiAgICB0eXBlTmFtZXMuYWRkKCdqZXN0Jyk7XG4gIH1cbiAgaWYgKGRlcGVuZGVuY2llcy52aXRlc3QpIHtcbiAgICB0eXBlTmFtZXMuYWRkKCd2aXRlc3QvZ2xvYmFscycpO1xuICB9XG4gIGlmIChkZXBlbmRlbmNpZXMubW9jaGEpIHtcbiAgICB0eXBlTmFtZXMuYWRkKCdtb2NoYScpO1xuICB9XG4gIGlmIChkZXBlbmRlbmNpZXMuY3lwcmVzcykge1xuICAgIHR5cGVOYW1lcy5hZGQoJ2N5cHJlc3MnKTtcbiAgfVxuXG4gIHJldHVybiBbLi4udHlwZU5hbWVzXTtcbn1cbiIsImltcG9ydCBvcyBmcm9tICdub2RlOm9zJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsganNvbmNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvanNvbmNVdGlsLmpzJztcblxuLyoqXG4gKiBUaGUgdXNlci1sZXZlbCBpbnN0cnVjdGlvbiBmaWxlIG9mIGVhY2ggc3VwcG9ydGVkIGFnZW50LCByZWxhdGl2ZSB0byB0aGUgaG9tZSBkaXJlY3RvcnkuIFRoZXNlXG4gKiBhcHBseSB0byBldmVyeSByZXBvc2l0b3J5IHRoZSBhZ2VudCB3b3JrcyBpbiwgc28gdGhleSBob2xkIG9ubHkgdGhlIGNvbnZlbnRpb25zIHRoYXQgYXJlIHRydWUgb25cbiAqIGV2ZXJ5IFdpbGxCb29zdGVyIGRldmVsb3BlciBtYWNoaW5lIHJhdGhlciB0aGFuIGluIGEgcGFydGljdWxhciByZXBvc2l0b3J5LlxuICovXG5jb25zdCB1c2VyQWdlbnRJbnN0cnVjdGlvbkZpbGVQYXRocyA9IFsnLmNvZGV4L0FHRU5UUy5tZCcsICcuY2xhdWRlL0NMQVVERS5tZCcsICcuZ2VtaW5pL0dFTUlOSS5tZCddIGFzIGNvbnN0O1xuXG4vLyBUaGlzIGNvbnRlbnQgaXMgbG9hZGVkIGludG8gZXZlcnkgYWdlbnQgc2Vzc2lvbiwgc28gaXQgaXMga2VwdCBhcyBzaG9ydCBhcyBpdCBjYW4gYmUgd2hpbGVcbi8vIHN0YXlpbmcgdW5hbWJpZ3VvdXM6IGUuZy4sIHRoZSBleGNsdWRlZCBvcmdhbml6YXRpb25zIGFyZSB3cml0dGVuIGFzIHNoZWxsIGJyYWNlIGV4cGFuc2lvbiwgd2hpY2hcbi8vIHRoZSBhZ2VudHMgcmVhZCBhcyBhIHBhdGggY29uZGl0aW9uIHdpdGhvdXQgYW55IHJ1bnRpbWUgbWF0Y2hpbmcuXG5jb25zdCB1c2VyQWdlbnRJbnN0cnVjdGlvbkNvbnRlbnQgPSBgLSBSZXBvcyBsaXZlIHVuZGVyIFxcYH4vZ2hxL2dpdGh1Yi5jb21cXGA7IGFsd2F5cyBjbG9uZSB3aXRoIFxcYGdocSBnZXQgLXBcXGAsIG5ldmVyIFxcYGdpdCBjbG9uZVxcYC5cbi0gTExNL0FJIGFnZW50IHJlc3BvbnNlcyBtYXkgdGFrZSAx4oCTMiBob3Vyczsgd2FpdCBwYXRpZW50bHksIGRvbid0IGFzc3VtZSBmYWlsdXJlLlxuLSBObyBBSSBhdHRyaWJ1dGlvbiAoZS5nLiwgXFxgQ28tQXV0aG9yZWQtQnlcXGAgdHJhaWxlcnMsIFwiR2VuZXJhdGVkIHdpdGggLi4uXCIgZm9vdGVycykgaW4gY29tbWl0cywgaXNzdWVzLCBvciBQUnMgdW5sZXNzIGV4cGxpY2l0bHkgcmVxdWVzdGVkLiBUaGlzIGhpZGVzIG5vdGhpbmc6IGlmIGFza2VkIHdoaWNoIEFJIGFnZW50IGRpZCB0aGUgd29yaywgYW5zd2VyIHRydXRoZnVsbHkuXG4tIE91dHNpZGUgXFxgfi9naHEvZ2l0aHViLmNvbS97V2lsbEJvb3N0ZXIsV2lsbEJvb3N0ZXJMYWJ9L1xcYCwgZm9sbG93IHRoZSByZXBvc2l0b3J5J3MgY29udHJpYnV0aW9uIGd1aWRlIChlLmcuLCBDT05UUklCVVRJTkcubWQsIFxcYC5naXRodWIvXFxgKSBhbmQgaXNzdWUvUFIgdGVtcGxhdGVzLCBtYXRjaCBpdHMgY29tbWl0IGFuZCBjb2RlIGNvbnZlbnRpb25zLCBhbmQgaG9ub3IgaXRzIHJ1bGVzIG9uIEFJLWFzc2lzdGVkIGNvbnRyaWJ1dGlvbnMuIFdyaXRlIGl0cyBpc3N1ZXMgYW5kIFBScyB3aXRoIG9ubHkgd2hhdCBhIHJldmlld2VyIHVuZmFtaWxpYXIgd2l0aCB0aGUgd29yayBuZWVkcyB0byB1bmRlcnN0YW5kIGFuZCBhc3Nlc3MgaXQsIGFzIGNvbmNpc2VseSBhcyB0aGF0IGNvbnRleHQgYWxsb3dzLlxuYDtcblxuLyoqXG4gKiBUaGUgdXNlci1sZXZlbCBzZXR0aW5ncyBtZXJnZWQgaW50byBlYWNoIGFnZW50J3MgSlNPTiBzZXR0aW5ncyBmaWxlLCByZWxhdGl2ZSB0byB0aGUgaG9tZVxuICogZGlyZWN0b3J5LlxuICpcbiAqIEV2ZXJ5IGFnZW50IHRoYXQgY2FycmllcyBmYWN0cyBmcm9tIG9uZSBzZXNzaW9uIGludG8gdGhlIG5leHQgaXMgdHVybmVkIG9mZiBoZXJlIGJlY2F1c2Ugc3VjaFxuICogbWVtb3J5IG1ha2VzIGEgc2Vzc2lvbiBkZXBlbmQgb24gaW52aXNpYmxlIG1hY2hpbmUtbG9jYWwgc3RhdGU6IGl0cyBiZWhhdmlvciBzdG9wcyBiZWluZ1xuICogcmVwcm9kdWNpYmxlIGFjcm9zcyBkZXZlbG9wZXJzIGFuZCBDSSwgYW5kIGEgc3RhbGUgb3Igd3JvbmcgbWVtb3J5IHNpbGVudGx5IG92ZXJyaWRlcyB0aGVcbiAqIGluc3RydWN0aW9uIGZpbGVzIGFib3ZlLiBDb2RleCBuZWVkcyBubyBlbnRyeSBiZWNhdXNlIGl0cyBtZW1vcmllcyBhcmUgb3B0LWluXG4gKiAoYFtmZWF0dXJlc10gbWVtb3JpZXMgPSB0cnVlYCBpbiBgfi8uY29kZXgvY29uZmlnLnRvbWxgKSwgc28gbGVhdmluZyB0aGF0IGZsYWcgdW5zZXQgaXMgZW5vdWdoLlxuICovXG5jb25zdCBhZ2VudFNldHRpbmdzID0gW1xuICB7XG4gICAgcmVsYXRpdmVQYXRoOiAnLmNsYXVkZS9zZXR0aW5ncy5qc29uJyxcbiAgICBhY2NlcHRzQ29tbWVudHM6IGZhbHNlLFxuICAgIC8qKlxuICAgICAqIENsYXVkZSBDb2RlIGluamVjdHMgaXRzIG93biBhdHRyaWJ1dGlvbiBkaXJlY3RpdmUgKGEgYENvLUF1dGhvcmVkLUJ5YCB0cmFpbGVyLCBhIFwiR2VuZXJhdGVkXG4gICAgICogd2l0aFwiIGZvb3RlciwgYW5kIGEgc2Vzc2lvbiBsaW5rKSBpbnRvIHRoZSB0b29sIGRlc2NyaXB0aW9ucyBhbmQgbWlkLXNlc3Npb24gcmVtaW5kZXJzLCBhbmRcbiAgICAgKiB0aGF0IGRpcmVjdGl2ZSBkZWNsYXJlcyBpdHNlbGYgdG8gcmVwbGFjZSBlYXJsaWVyIGd1aWRhbmNlLCBzbyB0aGUgaW5zdHJ1Y3Rpb24gZmlsZSBhbG9uZVxuICAgICAqIGNhbm5vdCBzdXBwcmVzcyBpdC4gT25seSB0aGlzIHNldHRpbmcgcmVtb3ZlcyB0aGUgZGlyZWN0aXZlIGF0IGl0cyBzb3VyY2UuIEF1dG8gbWVtb3J5IGlzIG9uXG4gICAgICogYnkgZGVmYXVsdCwgc28gaXQgbXVzdCBiZSB0dXJuZWQgb2ZmIGV4cGxpY2l0bHkuXG4gICAgICovXG4gICAgc2V0dGluZ3M6IHtcbiAgICAgIGF0dHJpYnV0aW9uOiB7XG4gICAgICAgIGNvbW1pdDogJycsXG4gICAgICAgIHByOiAnJyxcbiAgICAgICAgc2Vzc2lvblVybDogZmFsc2UsXG4gICAgICB9LFxuICAgICAgYXV0b01lbW9yeUVuYWJsZWQ6IGZhbHNlLFxuICAgIH0sXG4gIH0sXG4gIHtcbiAgICByZWxhdGl2ZVBhdGg6ICcuZ2VtaW5pL3NldHRpbmdzLmpzb24nLFxuICAgIC8vIEdlbWluaSBDTEkgc3RyaXBzIGNvbW1lbnRzIGJlZm9yZSBwYXJzaW5nIGl0cyBzZXR0aW5ncyBmaWxlLCB1bmxpa2UgQ2xhdWRlIENvZGUsIHdoaWNoXG4gICAgLy8gcmVqZWN0cyBhIGNvbW1lbnRlZCBmaWxlIGFzIG1hbGZvcm1lZC5cbiAgICBhY2NlcHRzQ29tbWVudHM6IHRydWUsXG4gICAgc2V0dGluZ3M6IHtcbiAgICAgIGV4cGVyaW1lbnRhbDoge1xuICAgICAgICBhdXRvTWVtb3J5OiBmYWxzZSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbl0gYXMgY29uc3Q7XG5cbi8qKlxuICogT3ZlcndyaXRlcyB0aGUgdXNlci1sZXZlbCBpbnN0cnVjdGlvbiBmaWxlcyBvZiBldmVyeSBzdXBwb3J0ZWQgYWdlbnQgd2l0aCB0aGUgZml4ZWQgY29udGVudCBhbmRcbiAqIG1lcmdlcyB0aGUgZml4ZWQgc2V0dGluZ3MgaW50byBlYWNoIGFnZW50J3MgdXNlciBzZXR0aW5ncy4gUmV0dXJucyBmYWxzZSB3aGVuIGFueSBmaWxlIHdhc1xuICogc2tpcHBlZCAoZS5nLiBhIHN5bWxpbmtlZCBvciB1bnBhcnNhYmxlIGZpbGUpLCBzbyB0aGUgY29tbWFuZCBjYW4gZmFpbCBsb3VkbHkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVVzZXJBZ2VudENvbmZpZ3MoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGxldCBoYXNXcml0dGVuQWxsID0gdHJ1ZTtcbiAgZm9yIChjb25zdCByZWxhdGl2ZVBhdGggb2YgdXNlckFnZW50SW5zdHJ1Y3Rpb25GaWxlUGF0aHMpIHtcbiAgICBjb25zdCBoYXNXcml0dGVuID0gYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCByZWxhdGl2ZVBhdGgpLCB1c2VyQWdlbnRJbnN0cnVjdGlvbkNvbnRlbnQpO1xuICAgIGhhc1dyaXR0ZW5BbGwgJiY9IGhhc1dyaXR0ZW47XG4gIH1cbiAgZm9yIChjb25zdCB7IGFjY2VwdHNDb21tZW50cywgcmVsYXRpdmVQYXRoLCBzZXR0aW5ncyB9IG9mIGFnZW50U2V0dGluZ3MpIHtcbiAgICAvLyBBd2FpdGVkIHNlcGFyYXRlbHk6IGAmJj1gIHdvdWxkIHNraXAgdGhlIG1lcmdlIG9uY2UgYW4gZWFybGllciBmaWxlIHdhcyBza2lwcGVkLlxuICAgIGNvbnN0IGhhc01lcmdlZCA9IGF3YWl0IG1lcmdlQWdlbnRTZXR0aW5ncyhyZWxhdGl2ZVBhdGgsIHNldHRpbmdzLCBhY2NlcHRzQ29tbWVudHMpO1xuICAgIGhhc1dyaXR0ZW5BbGwgJiY9IGhhc01lcmdlZDtcbiAgfVxuICByZXR1cm4gaGFzV3JpdHRlbkFsbDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbWVyZ2VBZ2VudFNldHRpbmdzKFxuICByZWxhdGl2ZVBhdGg6IHN0cmluZyxcbiAgbmV3U2V0dGluZ3M6IG9iamVjdCxcbiAgYWNjZXB0c0NvbW1lbnRzOiBib29sZWFuXG4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCByZWxhdGl2ZVBhdGgpO1xuICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gIGxldCBleGlzdGluZ1NldHRpbmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICBpZiAoZXhpc3RpbmdDb250ZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAvLyBBbiBhZ2VudCBpZ25vcmVzIGl0cyB3aG9sZSBzZXR0aW5ncyBmaWxlIHdoZW4gdGhlIGZpbGUgYnJlYWtzIHRoZSBncmFtbWFyIHRoZSBhZ2VudCByZWFkcyBpdFxuICAgIC8vIHdpdGgsIHNvIHdiZnkgbGVhdmVzIHN1Y2ggYSBmaWxlIHRvIHRoZSBkZXZlbG9wZXIgdG8gcmVwYWlyIHJhdGhlciB0aGFuIHJld3JpdGluZyBpdCBpbnRvIGFcbiAgICAvLyBmaWxlIHRoZSBhZ2VudCBzdGlsbCBpZ25vcmVzOiBjb21tZW50cyBhcmUgdG9sZXJhdGVkIG9ubHkgd2hlcmUgdGhlIGFnZW50IHN0cmlwcyB0aGVtLCBhbmRcbiAgICAvLyB0cmFpbGluZyBjb21tYXMgbm93aGVyZSwgc2luY2UgYm90aCBhZ2VudHMgcGFyc2Ugd2l0aCBKU09OLnBhcnNlIGluIHRoZSBlbmQuIENvbW1lbnQtb25seVxuICAgIC8vIGNvbnRlbnQgaXMgY2hlY2tlZCB0b28sIGJlY2F1c2UgaXQgaXMga2VwdCBhcyBhIGhlYWRlciBhYm92ZSB0aGUgZ2VuZXJhdGVkIG9iamVjdC5cbiAgICBpZiAoIWFjY2VwdHNDb21tZW50cyAmJiBqc29uY1V0aWwuY29udGFpbnNDb21tZW50KGV4aXN0aW5nQ29udGVudCkpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCB1cGRhdGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIHRoaXMgYWdlbnQgcmVhZHMgaXQgYXMgc3RyaWN0IEpTT04sIGNvbW1lbnRzIGFuZCBhbGwuYCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICghanNvbmNVdGlsLmlzVHJpdmlhT25seShleGlzdGluZ0NvbnRlbnQpKSB7XG4gICAgICBjb25zdCBwYXJzZWRTZXR0aW5ncyA9IGpzb25jVXRpbC5wYXJzZU9iamVjdElnbm9yaW5nRXJyb3I8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KGV4aXN0aW5nQ29udGVudCwgZmFsc2UpO1xuICAgICAgaWYgKCFwYXJzZWRTZXR0aW5ncykge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYFNraXBwZWQgdXBkYXRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSB0aGUgZXhpc3RpbmcgY29udGVudCBpcyBub3QgYSBzdHJpY3QgSlNPTiBvYmplY3QgKGEgdHJhaWxpbmcgY29tbWEsIGZvciBleGFtcGxlLCBpcyBub3QgYWxsb3dlZCkuYFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBleGlzdGluZ1NldHRpbmdzID0gcGFyc2VkU2V0dGluZ3M7XG4gICAgfVxuICB9XG4gIGNvbnN0IHNldHRpbmdzID0gbWVyZ2UoZXhpc3RpbmdTZXR0aW5ncywgbmV3U2V0dGluZ3MpO1xuICAvLyBPbmx5IHRoZSBwcm9wZXJ0aWVzIHdob3NlIHZhbHVlIGNoYW5nZXMgYXJlIHJld3JpdHRlbiwgc28gdGhlIGZpbGUga2VlcHMgaXRzIG93biBmb3JtYXR0aW5nXG4gIC8vIGFuZCwgd2hlcmUgdGhlIGFnZW50IGFsbG93cyB0aGVtLCBpdHMgY29tbWVudHMuXG4gIGNvbnN0IHsgY29udGVudCwga2V5c0xvc2luZ0NvbW1lbnRzIH0gPSBqc29uY1V0aWwuc3RyaW5naWZ5UHJlc2VydmluZ1RyaXZpYShleGlzdGluZ0NvbnRlbnQsIHNldHRpbmdzKTtcbiAgaWYgKCEoYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgY29udGVudCkpKSByZXR1cm4gZmFsc2U7XG5cbiAgZm9yIChjb25zdCBrZXkgb2Yga2V5c0xvc2luZ0NvbW1lbnRzKSB7XG4gICAgY29uc29sZS53YXJuKGBDb21tZW50cyBpbnNpZGUgXCIke2tleX1cIiB3ZXJlIGRyb3BwZWQgd2hpbGUgcmV3cml0aW5nIGl0IGluICR7ZmlsZVBhdGh9LmApO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBqc29uY1V0aWwgfSBmcm9tICcuLi91dGlscy9qc29uY1V0aWwuanMnO1xuaW1wb3J0IHsgc29ydEtleXMgfSBmcm9tICcuLi91dGlscy9vYmplY3RVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBleGNsdWRlRmlsZVBhdHRlcm5zID0gW1xuICAnKiovLmdpdC9vYmplY3RzLyoqJyxcbiAgJyoqLy5naXQvc3VidHJlZS1jYWNoZS8qKicsXG4gICcqKi9ub2RlX21vZHVsZXMvKionLFxuICAnKiovdG1wLyoqJyxcbiAgJyoqL3RlbXAvKionLFxuICAnKiovZGlzdC8qKicsXG5dO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVZzY29kZVNldHRpbmdzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnZzY29kZScsICdzZXR0aW5ncy5qc29uJyk7XG4gICAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpO1xuICAgIGlmIChleGlzdGluZ0NvbnRlbnQgPT09IHVuZGVmaW5lZCB8fCBqc29uY1V0aWwuaXNUcml2aWFPbmx5KGV4aXN0aW5nQ29udGVudCkpIHJldHVybjtcbiAgICAvLyAudnNjb2RlL3NldHRpbmdzLmpzb24gaXMgSlNPTkMgYnkgZGVmaW5pdGlvbjsgSlNPTi5wYXJzZSB3b3VsZCBtYWtlIHdiZnkgc2lsZW50bHkgc2tpcFxuICAgIC8vIGNvbW1lbnRlZCBmaWxlcy5cbiAgICBjb25zdCBwYXJzZWRTZXR0aW5ncyA9IGpzb25jVXRpbC5wYXJzZU9iamVjdElnbm9yaW5nRXJyb3I8b2JqZWN0PihleGlzdGluZ0NvbnRlbnQpO1xuICAgIGlmICghcGFyc2VkU2V0dGluZ3MpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCB1cGRhdGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIHRoZSBleGlzdGluZyBjb250ZW50IGlzIG5vdCBwYXJzYWJsZSBhcyBKU09OQy5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgb3JpZ2luYWxTZXR0aW5nc0pzb24gPSBKU09OLnN0cmluZ2lmeShzb3J0S2V5cyhzdHJ1Y3R1cmVkQ2xvbmUocGFyc2VkU2V0dGluZ3MpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSk7XG4gICAgbGV0IHNldHRpbmdzID0gcGFyc2VkU2V0dGluZ3M7XG4gICAgZm9yIChjb25zdCBleGNsdWRlRmlsZVBhdHRlcm4gb2YgZXhjbHVkZUZpbGVQYXR0ZXJucykge1xuICAgICAgc2V0dGluZ3MgPSBtZXJnZS5hbGwoW3NldHRpbmdzLCBleGNsdWRlU2V0dGluZyhleGNsdWRlRmlsZVBhdHRlcm4pXSk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrIHx8IGNvbmZpZy5kb2VzQ29udGFpblV2TG9jaykge1xuICAgICAgc2V0dGluZ3MgPSBtZXJnZS5hbGwoW3NldHRpbmdzLCBleGNsdWRlU2V0dGluZygnKiovLnZlbnYvKionKV0pO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgICBzZXR0aW5ncyA9IG1lcmdlLmFsbChbc2V0dGluZ3MsIGV4Y2x1ZGVTZXR0aW5nKCcqKi8ubmV4dC8qKicpXSk7XG4gICAgfVxuICAgIHNvcnRLZXlzKHNldHRpbmdzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICAvLyBTa2lwIHRoZSB3cml0ZSB3aGVuIG5vdGhpbmcgY2hhbmdlcyBzZW1hbnRpY2FsbHksIHNvIEpTT05DIGNvbW1lbnRzIGFuZCBmb3JtYXR0aW5nIGluIGFuXG4gICAgLy8gYWxyZWFkeS1jbGVhbiBzZXR0aW5ncy5qc29uIHN1cnZpdmUgd2JmeSBydW5zLlxuICAgIGlmIChKU09OLnN0cmluZ2lmeShzZXR0aW5ncykgPT09IG9yaWdpbmFsU2V0dGluZ3NKc29uKSByZXR1cm47XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KHNldHRpbmdzLCB1bmRlZmluZWQsIDIpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBleGNsdWRlU2V0dGluZyhleGNsdWRlRmlsZVBhdHRlcm46IHN0cmluZyk6IG9iamVjdCB7XG4gIHJldHVybiB7XG4gICAgJ2ZpbGVzLndhdGNoZXJFeGNsdWRlJzoge1xuICAgICAgW2V4Y2x1ZGVGaWxlUGF0dGVybl06IHRydWUsXG4gICAgfSxcbiAgfTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5cbmludGVyZmFjZSBGbm94VG9tbFN1YnRyZWUge1xuICBzZWNyZXRzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHByb2ZpbGVzPzogUmVjb3JkPHN0cmluZywgeyBzZWNyZXRzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfSB8IHVuZGVmaW5lZD47XG59XG5cbi8vIFRoZSBmb3VyIHN0YW5kYXJkIFdCX0VOViBtb2Rlczsgc3RhZ2luZyBpcyBvcHRpb25hbCBhbmQgb25seSBjb21wbGV0ZWQgd2hlbiB0aGUgcmVwb3NpdG9yeVxuLy8gYWxyZWFkeSBkZWNsYXJlcyB0aGUgc3RhZ2luZyBwcm9maWxlLlxuY29uc3Qgd2JFbnZNb2RlcyA9IFsnZGV2ZWxvcG1lbnQnLCAndGVzdCcsICdzdGFnaW5nJywgJ3Byb2R1Y3Rpb24nXSBhcyBjb25zdDtcbnR5cGUgV2JFbnZNb2RlID0gKHR5cGVvZiB3YkVudk1vZGVzKVtudW1iZXJdO1xuXG4vKipcbiAqIEVuc3VyZXMgYSBmbm94IHJlcG9zaXRvcnkgZGVmaW5lcyBXQl9FTlYgZm9yIGV2ZXJ5IHN0YW5kYXJkIG1vZGUgKGFuZCBORVhUX1BVQkxJQ19XQl9FTlYgd2hlblxuICogYW55IHdvcmtzcGFjZSBkZXBlbmRzIG9uIE5leHQuanMgb3IgdmluZXh0KSBpbiBmbm94LnRvbWwgcHJvZmlsZXMuIEV4aXN0aW5nIGRlZmluaXRpb25zIGFyZVxuICogYWx3YXlzIGxlZnQgdW50b3VjaGVkLiBOb24tZm5veCByZXBvc2l0b3JpZXMgYXJlIHNraXBwZWQ6IC5lbnYgZmlsZXMgYXJlIG5vIGxvbmdlciBtYW5hZ2VkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5zdXJlV2JFbnZEZWZpbml0aW9ucyhyb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLCBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdlbnN1cmVXYkVudkRlZmluaXRpb25zJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG5lZWRzTmV4dFB1YmxpYyA9IGFsbENvbmZpZ3Muc29tZSgoY29uZmlnKSA9PiByZXF1aXJlc05leHRQdWJsaWNXYkVudihjb25maWcpKTtcbiAgICBjb25zdCBmbm94VG9tbFBhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnZm5veC50b21sJyk7XG4gICAgLy8gbHN0YXQsIG5vdCBleGlzdHNTeW5jOiBleGlzdHNTeW5jIGlzIGZhbHNlIGZvciBhIERBTkdMSU5HIGZub3gudG9tbCBzeW1saW5rOyBhbnkgZm5veC50b21sXG4gICAgLy8gZGlyZWN0b3J5IGVudHJ5IG1hcmtzIGEgZm5veCByZXBvc2l0b3J5LCBhbmQgYSByZWZ1c2VkL2RhbmdsaW5nIG9uZSBhYm9ydHMgaW5zdGVhZCBvZlxuICAgIC8vIGJlaW5nIHRyZWF0ZWQgYXMgYSBub24tZm5veCByZXBvc2l0b3J5IHdoaWxlIHRoZSBmbm94IHN5bmNocm9uaXphdGlvbiBpcyBmYWlsaW5nLlxuICAgIGlmICghKGF3YWl0IGZzLnByb21pc2VzLmxzdGF0KGZub3hUb21sUGF0aCkuY2F0Y2goKCkgPT4ge30pKSkgcmV0dXJuO1xuICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVDb25maW5lZElmRXhpc3RzKGZub3hUb21sUGF0aCk7XG4gICAgaWYgKGNvbnRlbnQgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgIGNvbnN0IHVwZGF0ZWRDb250ZW50ID0gaW5zZXJ0V2JFbnZJbnRvRm5veFRvbWwoY29udGVudCwgbmVlZHNOZXh0UHVibGljKTtcbiAgICBpZiAodXBkYXRlZENvbnRlbnQgIT09IHVuZGVmaW5lZCAmJiB1cGRhdGVkQ29udGVudCAhPT0gY29udGVudCkge1xuICAgICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmbm94VG9tbFBhdGgsIHVwZGF0ZWRDb250ZW50KTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIE1pcnJvcnMgd2IncyByZXF1aXJlc05leHRQdWJsaWNXYkVudiBjb250cmFjdCAocGFja2FnZXMvd2Ivc3JjL3Byb2plY3QudHMpOiB0aGUgZnJhbWV3b3JrIG1heVxuICogYmUgZGVjbGFyZWQgaW4gQU5ZIG9mIHRoZSBmb3VyIGRlcGVuZGVuY3kgc2VjdGlvbnMgKGUuZy4gYG5leHRgIGFzIGEgZGV2RGVwZW5kZW5jeSBpbiBhIHNoYXJlZFxuICogY29tcG9uZW50IGxpYnJhcnkpLCB3aGlsZSB3YmZ5J3MgYGRlcGVuZGluZy5uZXh0YCBsb29rcyBvbmx5IGF0IHJlZ3VsYXIgZGVwZW5kZW5jaWVzLlxuICovXG5mdW5jdGlvbiByZXF1aXJlc05leHRQdWJsaWNXYkVudihjb25maWc6IFBhY2thZ2VDb25maWcpOiBib29sZWFuIHtcbiAgcmV0dXJuIFsnZGVwZW5kZW5jaWVzJywgJ2RldkRlcGVuZGVuY2llcycsICdvcHRpb25hbERlcGVuZGVuY2llcycsICdwZWVyRGVwZW5kZW5jaWVzJ10uc29tZSgoc2VjdGlvbikgPT4ge1xuICAgIGNvbnN0IGRlcGVuZGVuY2llcyA9IGNvbmZpZy5wYWNrYWdlSnNvbj8uW3NlY3Rpb24gYXMgJ2RlcGVuZGVuY2llcyddO1xuICAgIHJldHVybiAhIWRlcGVuZGVuY2llcz8uWyduZXh0J10gfHwgISFkZXBlbmRlbmNpZXM/LlsndmluZXh0J107XG4gIH0pO1xufVxuXG4vKipcbiAqIEluc2VydHMgbWlzc2luZyBXQl9FTlYgKGFuZCBvcHRpb25hbGx5IE5FWFRfUFVCTElDX1dCX0VOVikgZW50cmllcyBpbnRvIGEgZm5veC50b21sOiB0aGUgYmFzZVxuICogYFtzZWNyZXRzXWAgdGFibGUgY2FycmllcyB0aGUgZGV2ZWxvcG1lbnQgZGVmYXVsdHMgYW5kIGBbcHJvZmlsZXMuPG1vZGU+LnNlY3JldHNdYCBvdmVybGF5c1xuICogZWFjaCBvdGhlciBtb2RlLCBtYXRjaGluZyB0aGUgb3JnLXN0YW5kYXJkIGxheW91dC4gRm9ybWF0dGluZyBhbmQgY29tbWVudHMgYXJlIHByZXNlcnZlZDsgb25seVxuICogbWlzc2luZyBsaW5lcyBhcmUgaW5zZXJ0ZWQgb3IgbWlzc2luZyBzZWN0aW9ucyBhcHBlbmRlZC4gUmV0dXJucyB1bmRlZmluZWQgd2hlbiB0aGUgY29udGVudFxuICogY2Fubm90IGJlIHNhZmVseSBlZGl0ZWQgKHVucGFyc2FibGUgYmVmb3JlIG9yIGFmdGVyIHRoZSBlZGl0KS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluc2VydFdiRW52SW50b0Zub3hUb21sKGNvbnRlbnQ6IHN0cmluZywgbmVlZHNOZXh0UHVibGljOiBib29sZWFuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgbGV0IHNldHRpbmdzOiBGbm94VG9tbFN1YnRyZWU7XG4gIHRyeSB7XG4gICAgc2V0dGluZ3MgPSBCdW4uVE9NTC5wYXJzZShjb250ZW50KSBhcyBGbm94VG9tbFN1YnRyZWU7XG4gIH0gY2F0Y2gge1xuICAgIGNvbnNvbGUud2FybignU2tpcHBlZCBpbnNlcnRpbmcgV0JfRU5WIGludG8gZm5veC50b21sIGJlY2F1c2UgaXQgaXMgbm90IHBhcnNhYmxlIGFzIFRPTUwuJyk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNvbnN0IGtleU5hbWVzID0gbmVlZHNOZXh0UHVibGljID8gWydXQl9FTlYnLCAnTkVYVF9QVUJMSUNfV0JfRU5WJ10gOiBbJ1dCX0VOViddO1xuICBsZXQgdXBkYXRlZENvbnRlbnQgPSBjb250ZW50O1xuICBmb3IgKGNvbnN0IG1vZGUgb2Ygd2JFbnZNb2Rlcykge1xuICAgIC8vIFRoZSBzdGFnaW5nIG1vZGUgaXMgb3B0aW9uYWw6IGNvbXBsZXRlIGl0IG9ubHkgd2hlbiB0aGUgcmVwb3NpdG9yeSBhbHJlYWR5IGRlY2xhcmVzIHRoZSBwcm9maWxlLlxuICAgIGlmIChtb2RlID09PSAnc3RhZ2luZycgJiYgIXNldHRpbmdzLnByb2ZpbGVzPy5zdGFnaW5nKSBjb250aW51ZTtcbiAgICBjb25zdCBkZWZpbmVkS2V5cyA9IG1vZGUgPT09ICdkZXZlbG9wbWVudCcgPyBzZXR0aW5ncy5zZWNyZXRzIDogc2V0dGluZ3MucHJvZmlsZXM/Llttb2RlXT8uc2VjcmV0cztcbiAgICBmb3IgKGNvbnN0IGtleU5hbWUgb2Yga2V5TmFtZXMpIHtcbiAgICAgIGNvbnN0IGRlZmluZWQgPSBkZWZpbmVkS2V5cz8uW2tleU5hbWVdO1xuICAgICAgY29uc3QgZGVmaW5lZFZhbHVlID1cbiAgICAgICAgdHlwZW9mIGRlZmluZWQgPT09ICdzdHJpbmcnID8gZGVmaW5lZCA6IChkZWZpbmVkIGFzIHsgZGVmYXVsdD86IHVua25vd24gfSB8IHVuZGVmaW5lZCk/LmRlZmF1bHQ7XG4gICAgICB3YXJuT25VbmV4cGVjdGVkV2JFbnZWYWx1ZShrZXlOYW1lLCBkZWZpbmVkVmFsdWUsIG1vZGUpO1xuICAgIH1cbiAgICBjb25zdCBtaXNzaW5nTGluZXMgPSBrZXlOYW1lc1xuICAgICAgLmZpbHRlcigoa2V5TmFtZSkgPT4gZGVmaW5lZEtleXM/LltrZXlOYW1lXSA9PT0gdW5kZWZpbmVkKVxuICAgICAgLm1hcCgoa2V5TmFtZSkgPT4gYCR7a2V5TmFtZX0gPSB7IGRlZmF1bHQgPSBcIiR7bW9kZX1cIiB9YCk7XG4gICAgaWYgKG1pc3NpbmdMaW5lcy5sZW5ndGggPT09IDApIGNvbnRpbnVlO1xuICAgIHVwZGF0ZWRDb250ZW50ID0gaW5zZXJ0SW50b0Zub3hTZWN0aW9uKFxuICAgICAgdXBkYXRlZENvbnRlbnQsXG4gICAgICBtb2RlID09PSAnZGV2ZWxvcG1lbnQnID8gJ3NlY3JldHMnIDogYHByb2ZpbGVzLiR7bW9kZX0uc2VjcmV0c2AsXG4gICAgICBtaXNzaW5nTGluZXNcbiAgICApO1xuICB9XG4gIGlmICh1cGRhdGVkQ29udGVudCA9PT0gY29udGVudCkgcmV0dXJuIGNvbnRlbnQ7XG5cbiAgLy8gUmUtcGFyc2UgYmVmb3JlIHJldHVybmluZzogYW4gdW51c3VhbCBsYXlvdXQgKGUuZy4gZG90dGVkIGtleXMgd2l0aG91dCBhIHRhYmxlIGhlYWRlcikgY291bGRcbiAgLy8gbWFrZSB0aGUgdGV4dHVhbCBlZGl0IHByb2R1Y2UgYSBkdXBsaWNhdGUgdGFibGU7IGZhaWwgc2FmZWx5IGluc3RlYWQgb2YgY29ycnVwdGluZyB0aGUgZmlsZS5cbiAgdHJ5IHtcbiAgICBjb25zdCB1cGRhdGVkU2V0dGluZ3MgPSBCdW4uVE9NTC5wYXJzZSh1cGRhdGVkQ29udGVudCkgYXMgRm5veFRvbWxTdWJ0cmVlO1xuICAgIGZvciAoY29uc3QgbW9kZSBvZiB3YkVudk1vZGVzKSB7XG4gICAgICBpZiAobW9kZSA9PT0gJ3N0YWdpbmcnICYmICFzZXR0aW5ncy5wcm9maWxlcz8uc3RhZ2luZykgY29udGludWU7XG4gICAgICBjb25zdCBkZWZpbmVkS2V5cyA9IG1vZGUgPT09ICdkZXZlbG9wbWVudCcgPyB1cGRhdGVkU2V0dGluZ3Muc2VjcmV0cyA6IHVwZGF0ZWRTZXR0aW5ncy5wcm9maWxlcz8uW21vZGVdPy5zZWNyZXRzO1xuICAgICAgaWYgKGtleU5hbWVzLnNvbWUoKGtleU5hbWUpID0+IGRlZmluZWRLZXlzPy5ba2V5TmFtZV0gPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB0aGUgaW5zZXJ0ZWQgJHttb2RlfSBlbnRyaWVzIGRpZCBub3QgdGFrZSBlZmZlY3RgKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS53YXJuKGBTa2lwcGVkIGluc2VydGluZyBXQl9FTlYgaW50byBmbm94LnRvbWwgYmVjYXVzZSAkeyhlcnJvciBhcyBFcnJvcikubWVzc2FnZX0uYCk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gdXBkYXRlZENvbnRlbnQ7XG59XG5cbi8qKlxuICogV2FybnMgd2hlbiBhbiBleGlzdGluZyBXQl9FTlYtZmFtaWx5IGRlZmluaXRpb24gbmFtZXMgYSBkaWZmZXJlbnQgbW9kZSB0aGFuIHRoZSBvbmUgaXQgaXNcbiAqIGRlZmluZWQgZm9yIChhIHR5cG8gbGlrZSBgcHJvZGN1dGlvbmAgb3IgYHByb2R1Y3Rpb24xYCwgb3IgYSBjb3B5LXBhc3RlZCB3cm9uZyBtb2RlKTogd2JcbiAqIHJlamVjdHMgbm9uLXN0YW5kYXJkIHZhbHVlcyBhdCBydW50aW1lLCBzbyBzdXJmYWNpbmcgdGhlIG1pc21hdGNoIGR1cmluZyB3YmZ5IGlzIHRoZSBlYXJsaWVzdFxuICogcG9zc2libGUgc2lnbmFsLiBUaGUgcGFzc2VkIHZhbHVlIGlzIGFsd2F5cyBwbGFpbnRleHQgKGEgZm5veCBgZGVmYXVsdGAgZmllbGQpIOKAlCBlbmNyeXB0ZWRcbiAqIGZub3ggZW50cmllcyBhcmUgYHsgcHJvdmlkZXIsIHZhbHVlIH1gIG9iamVjdHMgd2hvc2UgYGRlZmF1bHRgIGlzIGFic2VudC5cbiAqL1xuZnVuY3Rpb24gd2Fybk9uVW5leHBlY3RlZFdiRW52VmFsdWUoa2V5TmFtZTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgbW9kZTogV2JFbnZNb2RlKTogdm9pZCB7XG4gIC8vIEFuIEVNUFRZIHZhbHVlIGNvdW50cyBhcyB1bnNldCAod2Igc3VwcGxpZXMgdGhlIGZhbGxiYWNrIG1vZGUpLCBub3QgYXMgYSBtaXNtYXRjaGluZyBtb2RlLlxuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJyB8fCB2YWx1ZSA9PT0gJycgfHwgdmFsdWUgPT09IG1vZGUpIHJldHVybjtcbiAgLy8gQSBkeW5hbWljIHZhbHVlIChlLmcuIGBORVhUX1BVQkxJQ19XQl9FTlY9JHtXQl9FTlZ9YCkgbWF5IGxlZ2l0aW1hdGVseSByZXNvbHZlIHRvIHRoZSBtb2RlXG4gIC8vIHRocm91Z2ggZXhwYW5zaW9uLCB3aGljaCB0aGlzIHN0YXRpYyBjaGVjayBjYW5ub3QgZXZhbHVhdGUg4oCUIHNraXAgaW5zdGVhZCBvZiBtaXNmaXJpbmcuXG4gIC8vIGZub3ggZXhwYW5kcyBvbmx5IGAkey4uLn1gIChhIGJhcmUgYCRVTlNFVGAgc3RheXMgbGl0ZXJhbCkuXG4gIGlmICh2YWx1ZS5pbmNsdWRlcygnJHsnKSkgcmV0dXJuO1xuICBpZiAoa2V5TmFtZSA9PT0gJ05FWFRfUFVCTElDX1dCX0VOVicpIHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBgJHtrZXlOYW1lfSBpbiBmbm94LnRvbWwgaXMgXCIke3ZhbHVlfVwiIGJ1dCBzaG91bGQgYmUgXCIke21vZGV9XCIgZm9yIHRoZSAke21vZGV9IG1vZGU7IHdiIG92ZXJyaWRlcyBpdCB3aXRoIFdCX0VOViwgYnV0IGEgZGlyZWN0IGZyYW1ld29yayBidWlsZCB3b3VsZCBpbmxpbmUgdGhpcyB2YWx1ZS5gXG4gICAgKTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc29sZS53YXJuKFxuICAgIGAke2tleU5hbWV9IGluIGZub3gudG9tbCBpcyBcIiR7dmFsdWV9XCIgYnV0IHNob3VsZCBiZSBcIiR7bW9kZX1cIiBmb3IgdGhlICR7bW9kZX0gbW9kZTsgd2IgcmVqZWN0cyB2YWx1ZXMgb3V0c2lkZSBkZXZlbG9wbWVudC90ZXN0L3N0YWdpbmcvcHJvZHVjdGlvbi5gXG4gICk7XG59XG5cbi8qKlxuICogSW5zZXJ0cyBsaW5lcyBhdCB0aGUgdG9wIG9mIGEgVE9NTCBzZWN0aW9uLCByaWdodCBhZnRlciBpdHMgYFtoZWFkZXJdYCBsaW5lIHNvIHByb2ZpbGUtc3BlY2lmaWNcbiAqIGVudHJpZXMgc3RheSBncm91cGVkIHdpdGggdGhlaXIgaGVhZGVyOyB0aGUgc2VjdGlvbiBpcyBhcHBlbmRlZCBhdCB0aGUgZW5kIHdoZW4gaXQgaXMgYWJzZW50LlxuICovXG5mdW5jdGlvbiBpbnNlcnRJbnRvRm5veFNlY3Rpb24oY29udGVudDogc3RyaW5nLCBzZWN0aW9uTmFtZTogc3RyaW5nLCBpbnNlcnRlZExpbmVzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIC8vIHdiZnkgd3JpdGVzIHRoZSBoZWFkZXIgd2l0aG91dCB3aGl0ZXNwYWNlIGFyb3VuZCB0aGUgZG90dGVkLWtleSBjb21wb25lbnRzLlxuICBjb25zdCBoZWFkZXJQYXR0ZXJuID0gbmV3IFJlZ0V4cChTdHJpbmcucmF3YF5cXHMqXFxbJHtzZWN0aW9uTmFtZS5yZXBsYWNlQWxsKCcuJywgU3RyaW5nLnJhd2BcXC5gKX1cXF1cXHMqKD86Iy4qKT8kYCwgJ3UnKTtcbiAgY29uc3QgbGluZXMgPSBjb250ZW50LnNwbGl0KCdcXG4nKTtcbiAgY29uc3QgaGVhZGVySW5kZXggPSBsaW5lcy5maW5kSW5kZXgoKGxpbmUpID0+IGhlYWRlclBhdHRlcm4udGVzdChsaW5lKSk7XG4gIGlmIChoZWFkZXJJbmRleCA9PT0gLTEpIHtcbiAgICByZXR1cm4gYCR7Y29udGVudC50cmltRW5kKCl9XFxuXFxuWyR7c2VjdGlvbk5hbWV9XVxcbiR7aW5zZXJ0ZWRMaW5lcy5qb2luKCdcXG4nKX1cXG5gO1xuICB9XG4gIHJldHVybiBbLi4ubGluZXMuc2xpY2UoMCwgaGVhZGVySW5kZXggKyAxKSwgLi4uaW5zZXJ0ZWRMaW5lcywgLi4ubGluZXMuc2xpY2UoaGVhZGVySW5kZXggKyAxKV0uam9pbignXFxuJyk7XG59XG4iLCIvLyBHaXRIdWIgQWN0aW9ucyB2YWx1ZWxlc3MgZXZlbnRzIHN1Y2ggYXMgYHB1bGxfcmVxdWVzdDpgIHJlcXVpcmUgWUFNTCBudWxsIHZhbHVlcy5cbi8qIGVzbGludC1kaXNhYmxlIHVuaWNvcm4vbm8tbnVsbCAqL1xuXG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgKiBhcyB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbi8qKlxuICogUmVwb3NpdG9yaWVzIG91dHNpZGUgV2lsbEJvb3N0ZXIgLyBXaWxsQm9vc3RlckxhYiBjYW5ub3QgY2FsbCB0aGUgb3JnYW5pemF0aW9uJ3MgcmV1c2FibGVcbiAqIHdvcmtmbG93czogdGhvc2Ugd29ya2Zsb3dzIGRlcGVuZCBvbiBvcmdhbml6YXRpb24gc2VjcmV0cyAoVkVSREFDQ0lPX1RPS0VOLCBEaXNjb3JkIHdlYmhvb2tzKVxuICogYW5kIHNlbGYtaG9zdGVkIHJ1bm5lcnMgdGhhdCBvdGhlciBvd25lcnMgZG8gbm90IGhhdmUuIFRoaXMgZ2VuZXJhdG9yIGluc3RlYWQgZW1pdHNcbiAqIHNlbGYtY29udGFpbmVkIHdvcmtmbG93cyBidWlsdCBvbmx5IGZyb20gd2hhdCBhbnkgcmVwb3NpdG9yeSBvd25lciBjYW4gcHJvdmlkZTogdGhlIHJlcG9zaXRvcnlcbiAqIGNvbnRlbnRzIChtaXNlLnRvbWwsIHBhY2thZ2UuanNvbiBzY3JpcHRzKSBhbmQgdGhlIHNpbmdsZSBgRk5PWF9BR0VfS0VZYCByZXBvc2l0b3J5IHNlY3JldCB3aGVuXG4gKiB0aGUgcmVwb3NpdG9yeSB1c2VzIGZub3guIEdlbmVyYXRpb24gaXMga2V5ZWQgb24gcmVwb3NpdG9yeSBzdGF0ZSwgbmV2ZXIgb24gdGhlIG93bmVyJ3NcbiAqIGlkZW50aXR5LCBzbyBpdCB3b3JrcyBmb3IgYXJiaXRyYXJ5IHBlcnNvbmFsIHJlcG9zaXRvcmllcy5cbiAqL1xuXG4vKiogRmlyc3QgbGluZSBvZiBldmVyeSBnZW5lcmF0ZWQgZmlsZTsgZmlsZXMgd2l0aG91dCBpdCBhcmUgaGFuZC13cml0dGVuIGFuZCBuZXZlciB0b3VjaGVkLiAqL1xuZXhwb3J0IGNvbnN0IHNlbGZDb250YWluZWRXb3JrZmxvd01hcmtlciA9ICcjIEdlbmVyYXRlZCBieSB3YmZ5Lic7XG5cbi8vIFNhbWUgcGlucyBhcyB0aGUgcmV1c2FibGUgd29ya2Zsb3dzIC8gdGhlaXIgY29uc3VtZXJzOyBSZW5vdmF0ZSB1cGRhdGVzIHRoZW0gaW4gdGhlIHRhcmdldCByZXBvc2l0b3J5LlxuY29uc3QgY2hlY2tvdXRBY3Rpb24gPSAnYWN0aW9ucy9jaGVja291dEB2Ny4wLjEnO1xuY29uc3QgbWlzZUFjdGlvbiA9ICdqZHgvbWlzZS1hY3Rpb25AdjQuMi4zJztcbmNvbnN0IGNhY2hlQWN0aW9uID0gJ2FjdGlvbnMvY2FjaGVAdjYuMS4wJztcbmNvbnN0IHVwbG9hZEFydGlmYWN0QWN0aW9uID0gJ2FjdGlvbnMvdXBsb2FkLWFydGlmYWN0QHY3LjAuMSc7XG4vLyB2Ni4xLjE7IHRoZSBzYW1lIHBpbiBhcyB0aGUgcmV1c2FibGUgc2VtYW50aWMtcHIgd29ya2Zsb3cuXG5jb25zdCBzZW1hbnRpY1B1bGxSZXF1ZXN0QWN0aW9uID0gJ2FtYW5ubi9hY3Rpb24tc2VtYW50aWMtcHVsbC1yZXF1ZXN0QDQ1YjllZDdjZjI0MDg3YTJmNzc4NWJmNTViZTk3Mzk0YmE4N2UxYzInO1xuLy8gdjMuMC4zOyBkZXBsb3lzIGFyZSBuZXR3b3JrLWhlYXZ5IGFuZCBiZW5lZml0IGZyb20gcmV0cmllcyB3aXRoIGEgbG9uZyB0aW1lb3V0LlxuY29uc3QgcmV0cnlBY3Rpb24gPSAnbmljay1maWVsZHMvcmV0cnlAZGQ1NmYxY2E4Y2E5OTFlMjM4NWMxOGFiNmRkMzZlYTdmOWZkYjU1Zic7XG5cbi8qKlxuICogSm9iLWxldmVsIGVudiB0aGF0IHR1cm5zIHRoZSBUYWt1bWkgR3VhcmQgaW5zdGFsbCBwYXRoIG9uLCBtaXJyb3JpbmcgdGhlIHJldXNhYmxlIHdvcmtmbG93cy5cbiAqXG4gKiBgc2VjcmV0c2AgaXMgdW5hdmFpbGFibGUgaW4gYSBzdGVwLWxldmVsIGBpZjpgLCBzbyB0aGUgcHJlc2VuY2Ugb2YgdGhlIHRva2VuIGlzIGV4cG9zZWQgYXMgYVxuICogbm9uLXNlY3JldCBzaWduYWw7IGFuIHVuc2V0IHNlY3JldCBleHBhbmRzIHRvIGBmYWxzZWAgYW5kIGxlYXZlcyBldmVyeSBHdWFyZCBzdGVwIHNraXBwZWQsIHdoaWNoXG4gKiBpcyB3aGF0IGtlZXBzIHRoZSBnZW5lcmF0ZWQgd29ya2Zsb3dzIHJ1bm5hYmxlIGluIGEgcmVwb3NpdG9yeSB0aGF0IG5ldmVyIHJlZ2lzdGVycyB0aGUgc2VjcmV0LlxuICogVEFLVU1JX0dVQVJEX1RPS0VOIGl0c2VsZiBpcyBkZWZpbmVkLWJ1dC1FTVBUWSBqb2Itd2lkZSBzbyB0aGUgYCR7VEFLVU1JX0dVQVJEX1RPS0VOfWAgcmVmZXJlbmNlXG4gKiBpbiB0aGUgZ2VuZXJhdGVkIC5ucG1yYyBzdGlsbCBleHBhbmRzICh0byAnJykgaW4gdGhlIHN0ZXBzIHRoYXQgZGVsaWJlcmF0ZWx5IHJ1biB3aXRob3V0IHRoZVxuICogdG9rZW47IGEgcmVmZXJlbmNlIHRvIGFuIHVuZGVmaW5lZCB2YXJpYWJsZSBpcyB3aGF0IGJyZWFrcyBhbiBpbnN0YWxsLCBhbiBlbXB0eSBvbmUgaXMgZmluZS5cbiAqL1xuY29uc3QgZ3VhcmRKb2JFbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gIEhBU19UQUtVTUlfR1VBUkRfVE9LRU46ICcke3sgISFzZWNyZXRzLlRBS1VNSV9HVUFSRF9UT0tFTiB9fScsXG4gIFRBS1VNSV9HVUFSRF9UT0tFTjogJycsXG59O1xuXG5pbnRlcmZhY2UgU3RlcCB7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIGlkPzogc3RyaW5nO1xuICBpZj86IHN0cmluZztcbiAgdXNlcz86IHN0cmluZztcbiAgcnVuPzogc3RyaW5nO1xuICAnd29ya2luZy1kaXJlY3RvcnknPzogc3RyaW5nO1xuICB3aXRoPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGVudj86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG59XG5cbmludGVyZmFjZSBXb3JrZmxvdyB7XG4gIG5hbWU6IHN0cmluZztcbiAgb246IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBjb25jdXJyZW5jeT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBwZXJtaXNzaW9ucz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIGpvYnM6IFJlY29yZDxcbiAgICBzdHJpbmcsXG4gICAgeyAncnVucy1vbic6IHN0cmluZzsgcGVybWlzc2lvbnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+OyBlbnY/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+OyBzdGVwczogU3RlcFtdIH1cbiAgPjtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlU2VsZkNvbnRhaW5lZFdvcmtmbG93cyhcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgYWxsUGFja2FnZUNvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSA9IFtyb290Q29uZmlnXVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVTZWxmQ29udGFpbmVkV29ya2Zsb3dzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHdvcmtmbG93c1BhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicsICd3b3JrZmxvd3MnKTtcbiAgICBpZiAoIShhd2FpdCBmc1V0aWwuaXNDb25maW5lZFdyaXRhYmxlUGF0aCh3b3JrZmxvd3NQYXRoKSkpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCBnZW5lcmF0aW5nIHdvcmtmbG93cyBiZWNhdXNlICR7d29ya2Zsb3dzUGF0aH0gcmVzb2x2ZXMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeS5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIod29ya2Zsb3dzUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICBjb25zdCB1c2VzRm5veCA9IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJ2Zub3gudG9tbCcpKTtcbiAgICBjb25zdCB3b3JrZmxvd0J5RmlsZU5hbWU6IFJlY29yZDxzdHJpbmcsIFdvcmtmbG93PiA9IHtcbiAgICAgICd0ZXN0LnltbCc6IGJ1aWxkVGVzdFdvcmtmbG93KHJvb3RDb25maWcsIGFsbFBhY2thZ2VDb25maWdzLCB1c2VzRm5veCksXG4gICAgICAnc2VtYW50aWMtcHIueW1sJzogYnVpbGRTZW1hbnRpY1ByV29ya2Zsb3coKSxcbiAgICB9O1xuICAgIC8vIERlcGxveSB3b3JrZmxvd3MgYXJlIGdlbmVyYXRlZCBwZXIgZGVwbG95IHNjcmlwdCB0aGUgcmVwb3NpdG9yeSBkZWNsYXJlcywgc28gYSByZXBvc2l0b3J5XG4gICAgLy8gd2l0aG91dCBhIHN0YWdpbmcgZW52aXJvbm1lbnQgc2ltcGx5IGdldHMgbm8gc3RhZ2luZyB3b3JrZmxvdy4gT25seSBzY3JpcHRzIHRoYXQgaW52b2tlXG4gICAgLy8gYHdiIGRlcGxveWAgcXVhbGlmeTogYSBiZXNwb2tlIGRlcGxveSBzY3JpcHQgbWF5IG5vdCBiZSBzYWZlIHRvIHRyaWdnZXIgYXV0b21hdGljYWxseVxuICAgIC8vIChkZXBsb3ktc3RhZ2luZyBydW5zIG9uIGV2ZXJ5IHB1c2ggdG8gdGhlIGRlZmF1bHQgYnJhbmNoKS5cbiAgICBjb25zdCBzY3JpcHRzID0gcm9vdENvbmZpZy5wYWNrYWdlSnNvbj8uc2NyaXB0cyA/PyB7fTtcbiAgICBjb25zdCBoYXNQcm9kdWN0aW9uRGVwbG95V29ya2Zsb3cgPSBpc1diRGVwbG95U2NyaXB0KHNjcmlwdHNbJ2RlcGxveSddKTtcbiAgICBpZiAoaGFzUHJvZHVjdGlvbkRlcGxveVdvcmtmbG93KSB7XG4gICAgICB3b3JrZmxvd0J5RmlsZU5hbWVbJ2RlcGxveS1wcm9kdWN0aW9uLnltbCddID0gYnVpbGREZXBsb3lXb3JrZmxvdygncHJvZHVjdGlvbicsICdkZXBsb3knLCB1c2VzRm5veCk7XG4gICAgfVxuICAgIGlmIChpc1diRGVwbG95U2NyaXB0KHNjcmlwdHNbJ2RlcGxveTpzdGFnaW5nJ10pKSB7XG4gICAgICB3b3JrZmxvd0J5RmlsZU5hbWVbJ2RlcGxveS1zdGFnaW5nLnltbCddID0gYnVpbGREZXBsb3lXb3JrZmxvdygnc3RhZ2luZycsICdkZXBsb3k6c3RhZ2luZycsIHVzZXNGbm94KTtcbiAgICB9XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLnNlbWFudGljUmVsZWFzZSAmJiByb290Q29uZmlnLnJlbGVhc2UuYnJhbmNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgd29ya2Zsb3dCeUZpbGVOYW1lWydyZWxlYXNlLnltbCddID0gYnVpbGRSZWxlYXNlV29ya2Zsb3cocm9vdENvbmZpZywgaGFzUHJvZHVjdGlvbkRlcGxveVdvcmtmbG93LCB1c2VzRm5veCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgW2ZpbGVOYW1lLCB3b3JrZmxvd10gb2YgT2JqZWN0LmVudHJpZXMod29ya2Zsb3dCeUZpbGVOYW1lKSkge1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IHdyaXRlU2VsZkNvbnRhaW5lZFdvcmtmbG93KHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCBmaWxlTmFtZSksIHdvcmtmbG93KSk7XG4gICAgfVxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVTZWxmQ29udGFpbmVkV29ya2Zsb3coZmlsZVBhdGg6IHN0cmluZywgd29ya2Zsb3c6IFdvcmtmbG93KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gIC8vIFVubGlrZSBXaWxsQm9vc3Rlci1vcmdhbml6YXRpb24gcmVwb3NpdG9yaWVzLCB3YmZ5IGRvZXMgbm90IG93biBhcmJpdHJhcnkgcmVwb3NpdG9yaWVzJyBDSTpcbiAgLy8gb25seSBmaWxlcyBpdCBnZW5lcmF0ZWQgKGlkZW50aWZpZWQgYnkgdGhlIG1hcmtlcikgYXJlIHJlZ2VuZXJhdGVkLCBhbmQgaGFuZC13cml0dGVuXG4gIC8vIHdvcmtmbG93cyBhcmUgbmV2ZXIgdG91Y2hlZC4gT3duZXJzIG9wdCBvdXQgcGVybWFuZW50bHkgYnkgcmVtb3ZpbmcgdGhlIG1hcmtlciBsaW5lLlxuICAvLyBBbiBlbXB0eSBvciB3aGl0ZXNwYWNlLW9ubHkgZmlsZSBjYXJyaWVzIG5vIGhhbmQtd3JpdHRlbiBjb250ZW50LCBzbyBpdCBpcyB0cmVhdGVkIGFzIGFic2VudC5cbiAgaWYgKG9sZENvbnRlbnQgIT09IHVuZGVmaW5lZCAmJiBvbGRDb250ZW50LnRyaW0oKSAhPT0gJycgJiYgIW9sZENvbnRlbnQuc3RhcnRzV2l0aChzZWxmQ29udGFpbmVkV29ya2Zsb3dNYXJrZXIpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgaGVhZGVyID0gYCR7c2VsZkNvbnRhaW5lZFdvcmtmbG93TWFya2VyfSBSZW1vdmUgdGhpcyBsaW5lIHRvIHN0b3Agd2JmeSBmcm9tIG92ZXJ3cml0aW5nIHRoaXMgZmlsZS5cXG5gO1xuICBjb25zdCB5YW1sVGV4dCA9IHlhbWwuZHVtcCh3b3JrZmxvdywgeyBsaW5lV2lkdGg6IC0xIH0pO1xuICBhd2FpdCBmc1V0aWwud3JpdGVGaWxlQ29uZmluZWQoZmlsZVBhdGgsIGhlYWRlciArIHlhbWxUZXh0KTtcbn1cblxuZnVuY3Rpb24gd29ya2luZ0RpcihkaXJQYXRoOiBzdHJpbmcpOiBQaWNrPFN0ZXAsICd3b3JraW5nLWRpcmVjdG9yeSc+IHtcbiAgcmV0dXJuIGRpclBhdGggPyB7ICd3b3JraW5nLWRpcmVjdG9yeSc6IGRpclBhdGggfSA6IHt9O1xufVxuXG5mdW5jdGlvbiBpc1diRGVwbG95U2NyaXB0KHNjcmlwdDogdW5rbm93bik6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIHNjcmlwdCA9PT0gJ3N0cmluZycgJiYgL1xcYndiIGRlcGxveVxcYi91LnRlc3Qoc2NyaXB0KTtcbn1cblxuZnVuY3Rpb24gYnVpbGRUZXN0V29ya2Zsb3coY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBhbGxQYWNrYWdlQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdLCB1c2VzRm5veDogYm9vbGVhbik6IFdvcmtmbG93IHtcbiAgLy8gUGxheXdyaWdodCBtYXkgYmUgZGVjbGFyZWQgb25seSBpbiB3b3Jrc3BhY2UgcGFja2FnZXM7IGB3YiB0ZXN0LW9uLWNpYCBydW5zIGV2ZXJ5IGRlY2xhcmluZ1xuICAvLyBwYWNrYWdlJ3MgZTJlIHRlc3RzLCBzbyB0aGUgd29ya2Zsb3cgbXVzdCBpbnN0YWxsIGJyb3dzZXJzIGZvciBlYWNoIG9mIHRoZW0gKHRoZWlyIHZlcnNpb25zXG4gIC8vIG1heSBkaWZmZXIsIGFuZCBlYWNoIGxpYnJhcnkgdmVyc2lvbiByZXF1aXJlcyBpdHMgbWF0Y2hpbmcgYnJvd3NlciBiaW5hcmllcykuIEJ1bidzIGlzb2xhdGVkXG4gIC8vIGxpbmtlciByZXNvbHZlcyB0aGUgcGxheXdyaWdodCBiaW5hcnkgb25seSBmcm9tIHRoZSBkZWNsYXJpbmcgcGFja2FnZSwgaGVuY2UgdGhlXG4gIC8vIHdvcmtpbmctZGlyZWN0b3J5IG9uIGV2ZXJ5IHN0ZXAuIFRoZSBicm93c2VycyBsYW5kIGluIH4vLmNhY2hlL21zLXBsYXl3cmlnaHQsIHNoYXJlZCBhY3Jvc3NcbiAgLy8gd29ya3NwYWNlcywgc28gc2FtZS12ZXJzaW9uIGluc3RhbGxzIG5hdHVyYWxseSBkZWR1cGxpY2F0ZS5cbiAgY29uc3QgcGxheXdyaWdodERpclBhdGhzID0gWy4uLmFsbFBhY2thZ2VDb25maWdzXVxuICAgIC50b1NvcnRlZCgoYSwgYikgPT4gYS5kaXJQYXRoLmxvY2FsZUNvbXBhcmUoYi5kaXJQYXRoKSlcbiAgICAuZmlsdGVyKChwYWNrYWdlQ29uZmlnKSA9PiBwYWNrYWdlQ29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0VGVzdClcbiAgICAubWFwKChwYWNrYWdlQ29uZmlnKSA9PiBwYXRoLnJlbGF0aXZlKGNvbmZpZy5kaXJQYXRoLCBwYWNrYWdlQ29uZmlnLmRpclBhdGgpKTtcbiAgY29uc3QgaGFzVHlwZWNoZWNrID0gY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcztcbiAgLy8gU3RlcC1zY29wZWQgbGlrZSB0aGUgcmV1c2FibGUgdGVzdCB3b3JrZmxvdzogZGVwZW5kZW5jeSBsaWZlY3ljbGUgc2NyaXB0cyBydW4gYnkgYGJ1biBpbnN0YWxsYFxuICAvLyBtdXN0IG5vdCBiZSBhYmxlIHRvIHJlYWQgdGhlIGxvbmctbGl2ZWQgYWdlIGlkZW50aXR5LlxuICBjb25zdCBmbm94RW52OiBQaWNrPFN0ZXAsICdlbnYnPiA9IHVzZXNGbm94ID8geyBlbnY6IHsgRk5PWF9BR0VfS0VZOiAnJHt7IHNlY3JldHMuRk5PWF9BR0VfS0VZIH19JyB9IH0gOiB7fTtcblxuICBjb25zdCBzdGVwczogU3RlcFtdID0gW1xuICAgIHsgdXNlczogY2hlY2tvdXRBY3Rpb24gfSxcbiAgICB7IHVzZXM6IG1pc2VBY3Rpb24gfSxcbiAgICAuLi5idWlsZEluc3RhbGxTdGVwcyh0cnVlKSxcbiAgICAuLi4ocGxheXdyaWdodERpclBhdGhzLmxlbmd0aCA+IDBcbiAgICAgID8gKFtcbiAgICAgICAgICAuLi5wbGF5d3JpZ2h0RGlyUGF0aHMubWFwKChkaXJQYXRoLCBpbmRleCk6IFN0ZXAgPT4gKHtcbiAgICAgICAgICAgIG5hbWU6IGBHZXQgUGxheXdyaWdodCB2ZXJzaW9uJHtkaXJQYXRoID8gYCAoJHtkaXJQYXRofSlgIDogJyd9YCxcbiAgICAgICAgICAgIC8vIFRoZSBJTlNUQUxMRUQgdmVyc2lvbiwgbm90IHRoZSBwYWNrYWdlLmpzb24gc3BlY2lmaWVyOiBhIHJhbmdlIGxpa2UgYF4xLjQ1LjBgXG4gICAgICAgICAgICAvLyBzdGF5cyB1bmNoYW5nZWQgYWNyb3NzIGxvY2tmaWxlIHVwZGF0ZXMsIHNvIGtleWluZyB0aGUgY2FjaGUgb24gaXQgd291bGQgcmVzdG9yZVxuICAgICAgICAgICAgLy8gc3RhbGUgYnJvd3NlcnMgdGhhdCBubyBsb25nZXIgbWF0Y2ggdGhlIGxpYnJhcnkuIFJ1bnMgYWZ0ZXIgYGJ1biBpbnN0YWxsYCwgc28gdGhlXG4gICAgICAgICAgICAvLyBwYWNrYWdlIGlzIHJlc29sdmFibGUgZnJvbSB0aGUgZGVjbGFyaW5nIHBhY2thZ2UncyBkaXJlY3RvcnkuXG4gICAgICAgICAgICBpZDogYHBsYXl3cmlnaHQtdmVyc2lvbi0ke2luZGV4fWAsXG4gICAgICAgICAgICBydW46ICdlY2hvIFwidmVyc2lvbj0kKGJ1biAtZSBcInRyeSB7IGNvbnNvbGUubG9nKHJlcXVpcmUoXFwnQHBsYXl3cmlnaHQvdGVzdC9wYWNrYWdlLmpzb25cXCcpLnZlcnNpb24pIH0gY2F0Y2gge31cIilcIiA+PiBcIiRHSVRIVUJfT1VUUFVUXCInLFxuICAgICAgICAgICAgLi4ud29ya2luZ0RpcihkaXJQYXRoKSxcbiAgICAgICAgICB9KSksXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogJ0NhY2hlIFBsYXl3cmlnaHQgYnJvd3NlcnMnLFxuICAgICAgICAgICAgaWQ6ICdwbGF5d3JpZ2h0LWNhY2hlJyxcbiAgICAgICAgICAgIHVzZXM6IGNhY2hlQWN0aW9uLFxuICAgICAgICAgICAgd2l0aDoge1xuICAgICAgICAgICAgICBwYXRoOiAnfi8uY2FjaGUvbXMtcGxheXdyaWdodCcsXG4gICAgICAgICAgICAgIGtleTogYHBsYXl3cmlnaHQtXFwke3sgcnVubmVyLm9zIH19LSR7cGxheXdyaWdodERpclBhdGhzXG4gICAgICAgICAgICAgICAgLm1hcCgoXywgaW5kZXgpID0+IGBcXCR7eyBzdGVwcy5wbGF5d3JpZ2h0LXZlcnNpb24tJHtpbmRleH0ub3V0cHV0cy52ZXJzaW9uIH19YClcbiAgICAgICAgICAgICAgICAuam9pbignLScpfWAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgLi4ucGxheXdyaWdodERpclBhdGhzLm1hcCgoZGlyUGF0aCk6IFN0ZXAgPT4gKHtcbiAgICAgICAgICAgIGlmOiBcInN0ZXBzLnBsYXl3cmlnaHQtY2FjaGUub3V0cHV0cy5jYWNoZS1oaXQgIT0gJ3RydWUnXCIsXG4gICAgICAgICAgICBydW46ICdidW4gcGxheXdyaWdodCBpbnN0YWxsIC0td2l0aC1kZXBzJyxcbiAgICAgICAgICAgIC4uLndvcmtpbmdEaXIoZGlyUGF0aCksXG4gICAgICAgICAgfSkpLFxuICAgICAgICAgIC4uLnBsYXl3cmlnaHREaXJQYXRocy5tYXAoKGRpclBhdGgpOiBTdGVwID0+ICh7XG4gICAgICAgICAgICAvLyBUaGUgY2FjaGVkIGJyb3dzZXJzIHN0aWxsIG5lZWQgdGhlaXIgc3lzdGVtIGRlcGVuZGVuY2llcyBvbiBhIGZyZXNoIHJ1bm5lci5cbiAgICAgICAgICAgIGlmOiBcInN0ZXBzLnBsYXl3cmlnaHQtY2FjaGUub3V0cHV0cy5jYWNoZS1oaXQgPT0gJ3RydWUnXCIsXG4gICAgICAgICAgICBydW46ICdidW4gcGxheXdyaWdodCBpbnN0YWxsLWRlcHMnLFxuICAgICAgICAgICAgLi4ud29ya2luZ0RpcihkaXJQYXRoKSxcbiAgICAgICAgICB9KSksXG4gICAgICAgIF0gc2F0aXNmaWVzIFN0ZXBbXSlcbiAgICAgIDogW10pLFxuICAgIC4uLihoYXNUeXBlY2hlY2sgPyBbeyBydW46ICdidW4gcnVuIHR5cGVjaGVjaycsIC4uLmZub3hFbnYgfV0gOiBbXSksXG4gICAgeyBydW46ICdidW4gcnVuIGxpbnQnLCAuLi5mbm94RW52IH0sXG4gICAge1xuICAgICAgbmFtZTogJ1Rlc3QnLFxuICAgICAgaWQ6ICd0ZXN0JyxcbiAgICAgIHJ1bjogYGlmIFtbIFwiJFVQTE9BRF9URVNUX0xPR1wiICE9IFwidHJ1ZVwiIF1dOyB0aGVuXG4gIGV4ZWMgYnVuIHJ1biB0ZXN0L2NpXG5maVxubG9nX2Rpcj0kKG1rdGVtcCAtZCBcIiRSVU5ORVJfVEVNUC90ZXN0LW91dHB1dC5YWFhYWFhcIilcbmVjaG8gXCJsb2dfcGF0aD0kbG9nX2Rpci90ZXN0LmxvZ1wiID4+IFwiJEdJVEhVQl9PVVRQVVRcIlxuIyBLZWVwIGRyYWluaW5nIHRlc3Qgb3V0cHV0IHdoZW4gdGhlIGxvZyByZWFjaGVzIGEgZmlsZS1zaXplIGxpbWl0Llxuc2V0ICtlXG5idW4gcnVuIHRlc3QvY2kgMj4mMSB8ICh0cmFwICcnIFhGU1o7IHRlZSBcIiRsb2dfZGlyL3Rlc3QubG9nXCIpXG50ZXN0X3N0YXR1cz0oXCJcXCR7UElQRVNUQVRVU1tAXX1cIilcbmlmICgoIHRlc3Rfc3RhdHVzWzBdICE9IDAgKSk7IHRoZW4gZXhpdCBcIlxcJHt0ZXN0X3N0YXR1c1swXX1cIjsgZmlcbmV4aXQgXCJcXCR7dGVzdF9zdGF0dXNbMV19XCJgLFxuICAgICAgZW52OiB7IC4uLmZub3hFbnYuZW52LCBVUExPQURfVEVTVF9MT0c6ICcke3sgdmFycy5VUExPQURfVEVTVF9MT0cgfX0nIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnVXBsb2FkIHRlc3QgbG9nJyxcbiAgICAgIGlmOiBcIiR7eyBhbHdheXMoKSAmJiB2YXJzLlVQTE9BRF9URVNUX0xPRyA9PSAndHJ1ZScgJiYgc3RlcHMudGVzdC5vdXRwdXRzLmxvZ19wYXRoICE9ICcnIH19XCIsXG4gICAgICB1c2VzOiB1cGxvYWRBcnRpZmFjdEFjdGlvbixcbiAgICAgIHdpdGg6IHtcbiAgICAgICAgbmFtZTogJ3Rlc3Qtb3V0cHV0LSR7eyBydW5uZXIub3MgfX0tJHt7IGpvYi5jaGVja19ydW5faWQgfX0tJHt7IGdpdGh1Yi5ydW5fYXR0ZW1wdCB9fScsXG4gICAgICAgIHBhdGg6ICcke3sgc3RlcHMudGVzdC5vdXRwdXRzLmxvZ19wYXRoIH19JyxcbiAgICAgICAgJ3JldGVudGlvbi1kYXlzJzogMTQsXG4gICAgICAgICdpZi1uby1maWxlcy1mb3VuZCc6ICdlcnJvcicsXG4gICAgICB9LFxuICAgIH0sXG4gICAgLi4uKHBsYXl3cmlnaHREaXJQYXRocy5sZW5ndGggPiAwXG4gICAgICA/IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnVXBsb2FkIHRlc3QgcmVzdWx0cycsXG4gICAgICAgICAgICBpZjogJyR7eyBhbHdheXMoKSB9fScsXG4gICAgICAgICAgICB1c2VzOiB1cGxvYWRBcnRpZmFjdEFjdGlvbixcbiAgICAgICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAgICAgbmFtZTogJ3Rlc3QtcmVzdWx0cycsXG4gICAgICAgICAgICAgIC8vIEV2ZXJ5IGRlY2xhcmluZyBwYWNrYWdlIHdyaXRlcyBpdHMgb3duIHRlc3QtcmVzdWx0cyBkaXJlY3Rvcnk7IGEgbmV3bGluZS1zZXBhcmF0ZWRcbiAgICAgICAgICAgICAgLy8gbGlzdCB1cGxvYWRzIHRoZW0gYWxsLlxuICAgICAgICAgICAgICBwYXRoOiBwbGF5d3JpZ2h0RGlyUGF0aHNcbiAgICAgICAgICAgICAgICAubWFwKChkaXJQYXRoKSA9PiAoZGlyUGF0aCA/IHBhdGgucG9zaXguam9pbihkaXJQYXRoLCAndGVzdC1yZXN1bHRzJykgOiAndGVzdC1yZXN1bHRzJykpXG4gICAgICAgICAgICAgICAgLmpvaW4oJ1xcbicpLFxuICAgICAgICAgICAgICAnaWYtbm8tZmlsZXMtZm91bmQnOiAnaWdub3JlJyxcbiAgICAgICAgICAgICAgJ3JldGVudGlvbi1kYXlzJzogMTQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIF1cbiAgICAgIDogW10pLFxuICBdO1xuXG4gIHJldHVybiB7XG4gICAgbmFtZTogJ1Rlc3QnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3Q6IG51bGwsXG4gICAgICBwdXNoOiB7IGJyYW5jaGVzOiBbJ21haW4nXSB9LFxuICAgIH0sXG4gICAgY29uY3VycmVuY3k6IHtcbiAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fS0ke3sgZ2l0aHViLnJlZiB9fScsXG4gICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogdHJ1ZSxcbiAgICB9LFxuICAgIHBlcm1pc3Npb25zOiB7IGNvbnRlbnRzOiAncmVhZCcgfSxcbiAgICBqb2JzOiB7XG4gICAgICB0ZXN0OiB7XG4gICAgICAgICdydW5zLW9uJzogJ3VidW50dS1sYXRlc3QnLFxuICAgICAgICBlbnY6IHsgRk9SQ0VfQ09MT1I6ICczJywgV0JfRU5WOiAndGVzdCcsIC4uLmd1YXJkSm9iRW52IH0sXG4gICAgICAgIHN0ZXBzLFxuICAgICAgfSxcbiAgICB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZERlcGxveVdvcmtmbG93KGVudmlyb25tZW50OiAnc3RhZ2luZycgfCAncHJvZHVjdGlvbicsIHNjcmlwdE5hbWU6IHN0cmluZywgdXNlc0Zub3g6IGJvb2xlYW4pOiBXb3JrZmxvdyB7XG4gIHJldHVybiB7XG4gICAgbmFtZTogYERlcGxveSBhcHAgb24gJHtlbnZpcm9ubWVudH1gLFxuICAgIG9uOiB7XG4gICAgICB3b3JrZmxvd19kaXNwYXRjaDogbnVsbCxcbiAgICAgIC8vIFByb2R1Y3Rpb24gZGVwbG95cyBmb2xsb3cgcHVibGlzaGVkIHJlbGVhc2VzIChzZWUgdGhlIHJlbGVhc2Ugd29ya2Zsb3cncyB0cmlnZ2VyIHN0ZXApO1xuICAgICAgLy8gc3RhZ2luZyBjb252ZXJnZXMgb24gZXZlcnkgZGVmYXVsdC1icmFuY2ggcHVzaC5cbiAgICAgIC4uLihlbnZpcm9ubWVudCA9PT0gJ3Byb2R1Y3Rpb24nXG4gICAgICAgID8geyByZWxlYXNlOiB7IHR5cGVzOiBbJ3B1Ymxpc2hlZCddIH0gfVxuICAgICAgICA6IHsgcHVzaDogeyBicmFuY2hlczogWydtYWluJ10sICdwYXRocy1pZ25vcmUnOiBbJyoqLm1kJywgJyoqL2RvY3MvKionXSB9IH0pLFxuICAgIH0sXG4gICAgY29uY3VycmVuY3k6IHtcbiAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fScsXG4gICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogZmFsc2UsXG4gICAgfSxcbiAgICBwZXJtaXNzaW9uczogeyBjb250ZW50czogJ3JlYWQnIH0sXG4gICAgam9iczoge1xuICAgICAgZGVwbG95OiB7XG4gICAgICAgICdydW5zLW9uJzogJ3VidW50dS1sYXRlc3QnLFxuICAgICAgICBlbnY6IHsgV0JfRU5WOiBlbnZpcm9ubWVudCwgLi4uZ3VhcmRKb2JFbnYgfSxcbiAgICAgICAgc3RlcHM6IFtcbiAgICAgICAgICAvLyBmZXRjaC1kZXB0aCAwIHNvIGBnaXQgZGVzY3JpYmVgIHNlZXMgdGhlIHRhZ3MgV0JfVkVSU0lPTiBpcyBkZXJpdmVkIGZyb20uXG4gICAgICAgICAgeyB1c2VzOiBjaGVja291dEFjdGlvbiwgd2l0aDogeyAnZmV0Y2gtZGVwdGgnOiAwIH0gfSxcbiAgICAgICAgICB7IHVzZXM6IG1pc2VBY3Rpb24gfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnU2V0IFdCX1ZFUlNJT04nLFxuICAgICAgICAgICAgcnVuOiAnc2V0IC1ldW8gcGlwZWZhaWxcXG5XQl9WRVJTSU9OPSQoZ2l0IGRlc2NyaWJlIC0tYWx3YXlzIC0tdGFncylcXG5lY2hvIFwiV0JfVkVSU0lPTj0kV0JfVkVSU0lPTlwiID4+IFwiJEdJVEhVQl9FTlZcIicsXG4gICAgICAgICAgfSxcbiAgICAgICAgICAuLi5idWlsZEluc3RhbGxTdGVwcyhmYWxzZSksXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogJ0RlcGxveScsXG4gICAgICAgICAgICB1c2VzOiByZXRyeUFjdGlvbixcbiAgICAgICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAgICAgdGltZW91dF9taW51dGVzOiA2MCxcbiAgICAgICAgICAgICAgbWF4X2F0dGVtcHRzOiA1LFxuICAgICAgICAgICAgICBjb21tYW5kOiBgYnVuIHJ1biAke3NjcmlwdE5hbWV9YCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvLyBTdGVwLXNjb3BlZCBsaWtlIHRoZSB0ZXN0IHdvcmtmbG93OiBkZXBlbmRlbmN5IGxpZmVjeWNsZSBzY3JpcHRzIHJ1biBieVxuICAgICAgICAgICAgLy8gYGJ1biBpbnN0YWxsYCBtdXN0IG5vdCBiZSBhYmxlIHRvIHJlYWQgdGhlIGxvbmctbGl2ZWQgYWdlIGlkZW50aXR5LlxuICAgICAgICAgICAgLi4uKHVzZXNGbm94ID8geyBlbnY6IHsgRk5PWF9BR0VfS0VZOiAnJHt7IHNlY3JldHMuRk5PWF9BR0VfS0VZIH19JyB9IH0gOiB7fSksXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRSZWxlYXNlV29ya2Zsb3coXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgaGFzUHJvZHVjdGlvbkRlcGxveVdvcmtmbG93OiBib29sZWFuLFxuICB1c2VzRm5veDogYm9vbGVhblxuKTogV29ya2Zsb3cge1xuICBjb25zdCBmbm94RW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0gdXNlc0Zub3ggPyB7IEZOT1hfQUdFX0tFWTogJyR7eyBzZWNyZXRzLkZOT1hfQUdFX0tFWSB9fScgfSA6IHt9O1xuICByZXR1cm4ge1xuICAgIG5hbWU6ICdSZWxlYXNlJyxcbiAgICBvbjoge1xuICAgICAgcHVzaDogeyBicmFuY2hlczogWy4uLmNvbmZpZy5yZWxlYXNlLmJyYW5jaGVzXSB9LFxuICAgIH0sXG4gICAgY29uY3VycmVuY3k6IHtcbiAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fScsXG4gICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogZmFsc2UsXG4gICAgfSxcbiAgICBwZXJtaXNzaW9uczoge1xuICAgICAgLy8gZm9yIHNlbWFudGljLXJlbGVhc2VcbiAgICAgIGNvbnRlbnRzOiAnd3JpdGUnLFxuICAgICAgLy8gZm9yIGRpc3BhdGNoaW5nIHRoZSBwcm9kdWN0aW9uIGRlcGxveSB3b3JrZmxvdyBhZnRlciBhIHJlbGVhc2VcbiAgICAgIC4uLihoYXNQcm9kdWN0aW9uRGVwbG95V29ya2Zsb3cgPyB7IGFjdGlvbnM6ICd3cml0ZScgfSA6IHt9KSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgIHJlbGVhc2U6IHtcbiAgICAgICAgJ3J1bnMtb24nOiAndWJ1bnR1LWxhdGVzdCcsXG4gICAgICAgIC8vIFJlbGVhc2VzIGJ1aWxkIHByb2R1Y3Rpb24gYXJ0aWZhY3RzLCBoZW5jZSB0aGUgZW52aXJvbm1lbnQg4oCUIHRoZSBzYW1lIGRlZmF1bHQgYXMgdGhlXG4gICAgICAgIC8vIHJldXNhYmxlIHJlbGVhc2Ugd29ya2Zsb3cuIHdiJ3MgQ0kgZ3VhcmQgYWxzbyByZXF1aXJlcyBhbiBleHBvcnRlZCBXQl9FTlYsIHNvIHdpdGhvdXRcbiAgICAgICAgLy8gaXQgYSBgcG9zdGluc3RhbGxgIHRoYXQgY2FsbHMgd2IgKGUuZy4gYHdiIGdlbi1jb2RlYCkgZXhpdHMgMSBiZWZvcmUgc2VtYW50aWMtcmVsZWFzZVxuICAgICAgICAvLyBydW5zLlxuICAgICAgICBlbnY6IHsgV0JfRU5WOiAncHJvZHVjdGlvbicsIC4uLmd1YXJkSm9iRW52IH0sXG4gICAgICAgIHN0ZXBzOiBbXG4gICAgICAgICAgLy8gZmV0Y2gtZGVwdGggMDogc2VtYW50aWMtcmVsZWFzZSByZWFkcyB0aGUgZnVsbCBoaXN0b3J5IHRvIGNvbXB1dGUgdGhlIG5leHQgdmVyc2lvbi5cbiAgICAgICAgICB7IHVzZXM6IGNoZWNrb3V0QWN0aW9uLCB3aXRoOiB7ICdmZXRjaC1kZXB0aCc6IDAgfSB9LFxuICAgICAgICAgIHsgdXNlczogbWlzZUFjdGlvbiB9LFxuICAgICAgICAgIC4uLmJ1aWxkSW5zdGFsbFN0ZXBzKGZhbHNlKSxcbiAgICAgICAgICAuLi4oaGFzUHJvZHVjdGlvbkRlcGxveVdvcmtmbG93XG4gICAgICAgICAgICA/IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBuYW1lOiAnR2V0IGN1cnJlbnQgbGF0ZXN0IHRhZycsXG4gICAgICAgICAgICAgICAgICBpZDogJ3ByZS1yZWxlYXNlLXRhZycsXG4gICAgICAgICAgICAgICAgICBydW46ICdzZXQgLWV1byBwaXBlZmFpbFxcbmVjaG8gXCJ0YWc9JChnaXQgZGVzY3JpYmUgLS10YWdzIC0tYWJicmV2PTAgMj4vZGV2L251bGwgfHwgZWNobyBcXCdcXCcpXCIgPj4gXCIkR0lUSFVCX09VVFBVVFwiJyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBdXG4gICAgICAgICAgICA6IFtdKSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnUmVsZWFzZScsXG4gICAgICAgICAgICAvLyBzZW1hbnRpYy1yZWxlYXNlIGNoZWNrcyBOb2RlLmpzIHJ1bnRpbWUgcmVxdWlyZW1lbnRzOyBgYnVuIDxiaW4+YCByZXNwZWN0cyBpdHNcbiAgICAgICAgICAgIC8vIGAjIS91c3IvYmluL2VudiBub2RlYCBzaGViYW5nLCBzbyBpdCBzdGlsbCBydW5zIHVuZGVyIHJlYWwgTm9kZS5cbiAgICAgICAgICAgIHJ1bjogJ2J1biBzZW1hbnRpYy1yZWxlYXNlJyxcbiAgICAgICAgICAgIGVudjoge1xuICAgICAgICAgICAgICBHSVRIVUJfVE9LRU46ICcke3sgc2VjcmV0cy5HSVRIVUJfVE9LRU4gfX0nLFxuICAgICAgICAgICAgICBMRUZUSE9PSzogJzAnLFxuICAgICAgICAgICAgICAuLi5mbm94RW52LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIC4uLihoYXNQcm9kdWN0aW9uRGVwbG95V29ya2Zsb3dcbiAgICAgICAgICAgID8gKFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBuYW1lOiAnQ2hlY2sgZm9yIG5ldyByZWxlYXNlIHRhZycsXG4gICAgICAgICAgICAgICAgICBpZDogJ3Bvc3QtcmVsZWFzZS10YWcnLFxuICAgICAgICAgICAgICAgICAgcnVuOiAnc2V0IC1ldW8gcGlwZWZhaWxcXG5naXQgZmV0Y2ggLS10YWdzIC0tZm9yY2VcXG5ORVdfVEFHPSQoZ2l0IGRlc2NyaWJlIC0tdGFncyAtLWFiYnJldj0wIDI+L2Rldi9udWxsIHx8IGVjaG8gXFwnXFwnKVxcbmVjaG8gXCJ0YWc9JE5FV19UQUdcIiA+PiBcIiRHSVRIVUJfT1VUUFVUXCJcXG5pZiBbWyAtbiBcIiRORVdfVEFHXCIgJiYgXCIkTkVXX1RBR1wiICE9IFwiJHt7IHN0ZXBzLnByZS1yZWxlYXNlLXRhZy5vdXRwdXRzLnRhZyB9fVwiIF1dOyB0aGVuXFxuICBlY2hvIFwiY3JlYXRlZD10cnVlXCIgPj4gXCIkR0lUSFVCX09VVFBVVFwiXFxuZmknLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgaWY6IFwic3RlcHMucG9zdC1yZWxlYXNlLXRhZy5vdXRwdXRzLmNyZWF0ZWQgPT0gJ3RydWUnXCIsXG4gICAgICAgICAgICAgICAgICBuYW1lOiAnVHJpZ2dlciBwcm9kdWN0aW9uIGRlcGxveScsXG4gICAgICAgICAgICAgICAgICAvLyBBIEdJVEhVQl9UT0tFTi1jcmVhdGVkIHJlbGVhc2UgZG9lcyBub3QgZmlyZSB0aGUgZGVwbG95IHdvcmtmbG93J3NcbiAgICAgICAgICAgICAgICAgIC8vIHJlbGVhc2UtcHVibGlzaGVkIHRyaWdnZXIsIHNvIGRpc3BhdGNoIGl0IGV4cGxpY2l0bHkgb24gdGhlIG5ldyB0YWcuXG4gICAgICAgICAgICAgICAgICBydW46ICdnaCB3b3JrZmxvdyBydW4gZGVwbG95LXByb2R1Y3Rpb24ueW1sIC0tcmVmIFwiJHt7IHN0ZXBzLnBvc3QtcmVsZWFzZS10YWcub3V0cHV0cy50YWcgfX1cIicsXG4gICAgICAgICAgICAgICAgICBlbnY6IHsgR0hfVE9LRU46ICcke3sgc2VjcmV0cy5HSVRIVUJfVE9LRU4gfX0nIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXSBzYXRpc2ZpZXMgU3RlcFtdKVxuICAgICAgICAgICAgOiBbXSksXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogVGhlIGluc3RhbGwgc2VxdWVuY2UgZXZlcnkgZ2VuZXJhdGVkIHdvcmtmbG93IHNoYXJlczogYGJ1biBpbnN0YWxsIC0tZnJvemVuLWxvY2tmaWxlYCwgaGFyZGVuZWQgaW50byB0aGVcbiAqIHJldXNhYmxlIHdvcmtmbG93cycgdGhyZWUtc3RlcCBkYW5jZSB3aGVuIHRoZSByZXBvc2l0b3J5IHJlZ2lzdGVycyBhIFRBS1VNSV9HVUFSRF9UT0tFTiBzZWNyZXQuXG4gKlxuICogVGFrdW1pIEd1YXJkIChodHRwczovL2ZsYXR0LnRlY2gvdGFrdW1pL2ZlYXR1cmVzL2d1YXJkKSBpcyBhIHJlZ2lzdHJ5IHByb3h5IHRoYXQgYmxvY2tzXG4gKiBrbm93bi1tYWxpY2lvdXMgcGFja2FnZXMuIFJvdXRpbmcgdGhlIERFRkFVTFQgcmVnaXN0cnkgdGhyb3VnaCBpdCBpcyB3aGF0IHByb3RlY3RzIHRoZSBpbnN0YWxsLFxuICogYW5kIHRoZSB0b2tlbiBhdXRoZW50aWNhdGVzIHRoYXQgcHJveHkg4oCUIHNvIHRoZSB0b2tlbiBoYXMgdG8gYmUgcHJlc2VudCB3aGlsZSBkZXBlbmRlbmNpZXMgYXJlXG4gKiByZXNvbHZlZCwgd2hpY2ggaXMgZXhhY3RseSB3aGVuIGEgY29tcHJvbWlzZWQgZGVwZW5kZW5jeSdzIGxpZmVjeWNsZSBzY3JpcHQgd291bGQgcnVuLiBIZW5jZSB0aGVcbiAqIHNwbGl0OiByZXNvbHZlIGFuZCBkb3dubG9hZCB3aXRoIGAtLWlnbm9yZS1zY3JpcHRzYCBhbmQgdGhlIHRva2VuLCB0aGVuIHJlcGxheSB0aGUgc2tpcHBlZFxuICogbGlmZWN5Y2xlIHNjcmlwdHMgaW4gYSBzZWNvbmQgaW5zdGFsbCB0aGF0IGhhcyBubyB0b2tlbiAoZXZlcnkgcGFja2FnZSBpcyBhbHJlYWR5IGNhY2hlZCwgYW5kXG4gKiBHdWFyZCBzZXJ2ZXMgYW5vbnltb3VzbHkgYW55d2F5KS4gT25seSBidW4gaXMgZ2VuZXJhdGVkIGhlcmUsIGFuZCBidW4gcmVhZHMgLm5wbXJjLCBzbyBub1xuICogcGFja2FnZS1tYW5hZ2VyIGJyYW5jaGluZyBpcyBuZWVkZWQuXG4gKlxuICogVGhlIHNoZWxsIGRldGFpbHMgZGVsaWJlcmF0ZWx5IG1pcnJvciByZXVzYWJsZS13b3JrZmxvd3MnIHByb2R1Y3Rpb24tcHJvdmVuIGluc3RhbGwgc3RlcHM6IGJhcmVcbiAqIGAkUlVOTkVSX1RFTVBgIChzZXQgYnkgdGhlIHJ1bm5lciBhcHBsaWNhdGlvbiBvbiBldmVyeSBydW5uZXIsIGFuZCBgc2V0IC11YCBmYWlscyBsb3VkbHkgaWYgbm90KSxcbiAqIGBbWyAtZSAubnBtcmMgXV1gLCBhbmQgdGhlIHNlY29uZCBgcm0gLXJmIG5vZGVfbW9kdWxlc2AgaW4gdGhlIGZhbGxiYWNrIChhbiBpbnRlcnJ1cHRlZCBsaWZlY3ljbGVcbiAqIHJ1biBtYXkgbGVhdmUgbm9kZV9tb2R1bGVzIGluY29uc2lzdGVudCwgc28gdGhlIHJldHJ5IHN0YXJ0cyBjbGVhbiByYXRoZXIgdGhhbiB0cnVzdGluZyBhIHJlcGFpcikuXG4gKlxuICogYHRvbGVyYXRlTGlmZWN5Y2xlU2NyaXB0RmFpbHVyZWAgZGVjaWRlcyB3aGF0IGEgZmFpbGluZyBsaWZlY3ljbGUtc2NyaXB0IHJlcGxheSBkb2VzLiBFdmVyeVxuICogcmVwbGF5IHJ1bnMgdG9rZW5sZXNzIGFuZCB3aXRob3V0IEZOT1hfQUdFX0tFWSAodGhlIGtleSBpcyBzY29wZWQgdG8gdGhlIGxhdGVyIERlcGxveS9SZWxlYXNlXG4gKiBzdGVwKSwgc28gYSBwb3N0aW5zdGFsbCB0aGF0IG5lZWRzIGRlY3J5cHRlZCBzZWNyZXRzIGlzIHVuc3VwcG9ydGVkIGluIGFsbCBvZiB0aGVtIGJ5IGRlc2lnbi5cbiAqIFRoZSB0ZXN0IHdvcmtmbG93IHRvbGVyYXRlcyB0aGUgZmFpbHVyZSBiZWNhdXNlIHR5cGVjaGVjay9saW50L3Rlc3QgZmFpbCBsb3VkbHkgb24gYSBkZWdyYWRlZFxuICogdHJlZSBhbnl3YXkuIERlcGxveSBhbmQgcmVsZWFzZSB3b3JrZmxvd3MgbXVzdCBub3Q6IGEgYDo6d2FybmluZzo6YCBkb2VzIG5vdCBmYWlsIHRoZSBqb2IsIHNvXG4gKiB0aGUgZmFsbGJhY2sgd291bGQgc2hpcCBhIHRyZWUgd2hvc2UgbGlmZWN5Y2xlIHNjcmlwdHMgKGUuZy4gYSBgcG9zdGluc3RhbGw6IHdiIGdlbi1jb2RlYClcbiAqIG5ldmVyIHJhbiwgc2lsZW50bHkgZGVwbG95aW5nIGRlZ3JhZGVkIG91dHB1dCAoIzExMjcpLlxuICovXG5mdW5jdGlvbiBidWlsZEluc3RhbGxTdGVwcyh0b2xlcmF0ZUxpZmVjeWNsZVNjcmlwdEZhaWx1cmU6IGJvb2xlYW4pOiBTdGVwW10ge1xuICByZXR1cm4gW1xuICAgIHtcbiAgICAgIGlmOiBcIiR7eyBlbnYuSEFTX1RBS1VNSV9HVUFSRF9UT0tFTiA9PSAndHJ1ZScgfX1cIixcbiAgICAgIG5hbWU6ICdHZW5lcmF0ZSAubnBtcmMgZm9yIFRha3VtaSBHdWFyZCcsXG4gICAgICAvLyBUaGUgdG9rZW4gaXMgd3JpdHRlbiBhcyBhIGxpdGVyYWwgYCR7VEFLVU1JX0dVQVJEX1RPS0VOfWAgcmVmZXJlbmNlIHRoYXQgYnVuIGV4cGFuZHMgYXRcbiAgICAgIC8vIGluc3RhbGwgdGltZSwgc28gdGhlIHNlY3JldCBpdHNlbGYgbmV2ZXIgbGFuZHMgaW4gYSBmaWxlLiBUaGUgbWFuYWdlZCBsaW5lcyBhcmUgc3RyaXBwZWRcbiAgICAgIC8vIGZyb20gYW4gZXhpc3RpbmcgLm5wbXJjIGZpcnN0OiBhIHJlcG9zaXRvcnkgb3V0c2lkZSB0aGUgb3JnYW5pemF0aW9ucyBtYXkgbGVnaXRpbWF0ZWx5XG4gICAgICAvLyBjb21taXQgb25lIChzY29wZSBtYXBwaW5ncyBmb3IgYW5vdGhlciByZWdpc3RyeSksIGFuZCBkcm9wcGluZyBvbmx5IHRoZXNlIHR3byBsaW5lcyBrZWVwc1xuICAgICAgLy8gdGhlIHJlc3Qgb2YgaXQgaW4gZWZmZWN0LiBSZXBsYWNpbmcgdGhlIGZpbGUgd2l0aCBgbXZgIHJhdGhlciB0aGFuIGFwcGVuZGluZyBpbiBwbGFjZSBzdG9wc1xuICAgICAgLy8gYSBjb21taXR0ZWQgc3ltbGluayBmcm9tIHJlZGlyZWN0aW5nIHRoZSB3cml0ZSBpbnRvLCBzYXksIGEgcGVyc2lzdGVudCBob21lIG5wbXJjLlxuICAgICAgcnVuOiBgc2V0IC1ldW8gcGlwZWZhaWxcbk5QTVJDPVwiJChta3RlbXAgXCIkUlVOTkVSX1RFTVAvbnBtcmMuWFhYWFhYXCIpXCJcbmlmIFtbIC1lIC5ucG1yYyBdXTsgdGhlblxuICBncmVwIC12RSAnXnJlZ2lzdHJ5PXxeLy9ucG1cXFxcLmZsYXR0XFxcXC50ZWNoLzpfYXV0aFRva2VuJyAubnBtcmMgPiBcIiROUE1SQ1wiIHx8IHRydWVcbmZpXG5lY2hvICdyZWdpc3RyeT1odHRwczovL25wbS5mbGF0dC50ZWNoLycgPj4gXCIkTlBNUkNcIlxuZWNobyAnLy9ucG0uZmxhdHQudGVjaC86X2F1dGhUb2tlbj1cXCR7VEFLVU1JX0dVQVJEX1RPS0VOfScgPj4gXCIkTlBNUkNcIlxucm0gLWYgLm5wbXJjXG5tdiBcIiROUE1SQ1wiIC5ucG1yY2AsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnSW5zdGFsbCBkZXBlbmRlbmNpZXMnLFxuICAgICAgLy8gLS1mcm96ZW4tbG9ja2ZpbGU6IGEgcGxhaW4gYGJ1biBpbnN0YWxsYCBzaWxlbnRseSByZXBhaXJzIGEgYnVuLmxvY2sgdGhhdCBpcyBzdGFsZSBhZ2FpbnN0XG4gICAgICAvLyBwYWNrYWdlLmpzb24sIHNvIENJIHdvdWxkIHJ1biBkZXBlbmRlbmN5IHJlc29sdXRpb25zIHRoYXQgd2VyZSBuZXZlciByZXZpZXdlZCAoIzExMjYpLlxuICAgICAgLy8gV2l0aCBOTyBidW4ubG9jayBhdCBhbGwsIC0tZnJvemVuLWxvY2tmaWxlIHNpbGVudGx5IGluc3RhbGxzIGZyZXNoLCB1bnBpbm5lZCByZXNvbHV0aW9uc1xuICAgICAgLy8gKEJ1biAxLjMuMTQgZXhpdHMgMCBhbmQgd3JpdGVzIG5vIGxvY2tmaWxlKSwgc28gYSBtaXNzaW5nIGxvY2tmaWxlIG11c3QgZmFpbCBleHBsaWNpdGx5LlxuICAgICAgcnVuOiBgc2V0IC1ldW8gcGlwZWZhaWxcbmlmIFtbICEgLWUgYnVuLmxvY2sgXV07IHRoZW5cbiAgZWNobyBcIjo6ZXJyb3I6OmJ1bi5sb2NrIGlzIG1pc3Npbmc7IGNvbW1pdCBpdCBzbyBDSSBpbnN0YWxscyBzdGF5IHJlcHJvZHVjaWJsZVwiXG4gIGV4aXQgMVxuZmlcbmlmIFtbIFwiJEhBU19UQUtVTUlfR1VBUkRfVE9LRU5cIiA9PSBcInRydWVcIiBdXTsgdGhlblxuICBidW4gaW5zdGFsbCAtLWZyb3plbi1sb2NrZmlsZSAtLWlnbm9yZS1zY3JpcHRzXG5lbHNlXG4gIGJ1biBpbnN0YWxsIC0tZnJvemVuLWxvY2tmaWxlXG5maWAsXG4gICAgICAvLyBTdGVwLXNjb3BlZDogYSBqb2ItbGV2ZWwgdG9rZW4gd291bGQgYmUgcmVhZGFibGUgYnkgZXZlcnkgZGVwZW5kZW5jeSBsaWZlY3ljbGUgc2NyaXB0IHRoZVxuICAgICAgLy8gdG9rZW5sZXNzIHJlcGxheSBiZWxvdyBydW5zLlxuICAgICAgZW52OiB7IFRBS1VNSV9HVUFSRF9UT0tFTjogJyR7eyBzZWNyZXRzLlRBS1VNSV9HVUFSRF9UT0tFTiB9fScgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlmOiBcIiR7eyBlbnYuSEFTX1RBS1VNSV9HVUFSRF9UT0tFTiA9PSAndHJ1ZScgfX1cIixcbiAgICAgIG5hbWU6ICdSdW4gZGVwZW5kZW5jeSBsaWZlY3ljbGUgc2NyaXB0cyB3aXRob3V0IHJlZ2lzdHJ5IGNyZWRlbnRpYWxzJyxcbiAgICAgIC8vIEEgcmVwZWF0ZWQgYGJ1biBpbnN0YWxsYCBpcyBhIG5vLW9wIHRoYXQgcmVwbGF5cyBub3RoaW5nLCBzbyBub2RlX21vZHVsZXMgaGFzIHRvIGdvIGZpcnN0LlxuICAgICAgcnVuOiBgc2V0IC1ldW8gcGlwZWZhaWxcbnJtIC1yZiBub2RlX21vZHVsZXNcbmJ1biBpbnN0YWxsIC0tZnJvemVuLWxvY2tmaWxlJHtcbiAgICAgICAgdG9sZXJhdGVMaWZlY3ljbGVTY3JpcHRGYWlsdXJlXG4gICAgICAgICAgPyBgIHx8IHtcbiAgZWNobyBcIjo6d2FybmluZzo6TGlmZWN5Y2xlIHNjcmlwdHMgZmFpbGVkOyBjb21wbGV0aW5nIHRoZSBpbnN0YWxsIHdpdGhvdXQgdGhlbVwiXG4gIHJtIC1yZiBub2RlX21vZHVsZXNcbiAgYnVuIGluc3RhbGwgLS1mcm96ZW4tbG9ja2ZpbGUgLS1pZ25vcmUtc2NyaXB0c1xufWBcbiAgICAgICAgICA6ICcnXG4gICAgICB9YCxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlmOiBcIiR7eyBlbnYuSEFTX1RBS1VNSV9HVUFSRF9UT0tFTiA9PSAndHJ1ZScgfX1cIixcbiAgICAgIG5hbWU6ICdSZW1vdmUgdGhlIGdlbmVyYXRlZCAubnBtcmMnLFxuICAgICAgLy8gTm90aGluZyBhZnRlciB0aGUgaW5zdGFsbCBuZWVkcyB0aGUgcHJveHksIGFuZCBsZWF2aW5nIGl0IGluIHBsYWNlIHdvdWxkIGJyZWFrIHRoZSBvbmVcbiAgICAgIC8vIHRoaW5nIEd1YXJkIHJlZnVzZXMgdG8gc2VydmU6IGl0IGFuc3dlcnMgYG5wbSBwdWJsaXNoYCB3aXRoIDQwNSwgc28gYSByZWxlYXNlIHdvcmtmbG93XG4gICAgICAvLyB3aG9zZSBwYWNrYWdlIGxhY2tzIGFuIGV4cGxpY2l0IHB1Ymxpc2hDb25maWcucmVnaXN0cnkgd291bGQgZmFpbCB0byBwdWJsaXNoLlxuICAgICAgcnVuOiBgc2V0IC1ldW8gcGlwZWZhaWxcbmlmIGdpdCBscy1maWxlcyAtLWVycm9yLXVubWF0Y2ggLS0gLm5wbXJjID4gL2Rldi9udWxsIDI+JjE7IHRoZW5cbiAgZ2l0IGNoZWNrb3V0IC0tIC5ucG1yY1xuZWxzZVxuICBybSAtZiAubnBtcmNcbmZpYCxcbiAgICB9LFxuICBdO1xufVxuXG5mdW5jdGlvbiBidWlsZFNlbWFudGljUHJXb3JrZmxvdygpOiBXb3JrZmxvdyB7XG4gIHJldHVybiB7XG4gICAgbmFtZTogJ0xpbnQgUFIgdGl0bGUnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3RfdGFyZ2V0OiB7IHR5cGVzOiBbJ29wZW5lZCcsICdlZGl0ZWQnLCAnc3luY2hyb25pemUnXSB9LFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ3NlbWFudGljLXByJzoge1xuICAgICAgICAncnVucy1vbic6ICd1YnVudHUtbGF0ZXN0JyxcbiAgICAgICAgLy8gVGhlIGFjdGlvbiByZWFkcyB0aGUgcHVsbCByZXF1ZXN0LCBhbmQgaXRzIGB3aXBgIHN1cHBvcnQgcG9zdHMgYSBjb21taXQgc3RhdHVzOyBuZWl0aGVyXG4gICAgICAgIC8vIHBlcm1pc3Npb24gaXMgZ3JhbnRlZCB3aGVuIHRoZSByZXBvc2l0b3J5IHJlc3RyaWN0cyBkZWZhdWx0IHdvcmtmbG93IHBlcm1pc3Npb25zLlxuICAgICAgICBwZXJtaXNzaW9uczogeyAncHVsbC1yZXF1ZXN0cyc6ICdyZWFkJywgc3RhdHVzZXM6ICd3cml0ZScgfSxcbiAgICAgICAgc3RlcHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB1c2VzOiBzZW1hbnRpY1B1bGxSZXF1ZXN0QWN0aW9uLFxuICAgICAgICAgICAgd2l0aDogeyB3aXA6IHRydWUgfSxcbiAgICAgICAgICAgIGVudjogeyBHSVRIVUJfVE9LRU46ICcke3sgc2VjcmV0cy5HSVRIVUJfVE9LRU4gfX0nIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcbn1cbiIsImltcG9ydCBhc3NlcnQgZnJvbSAnbm9kZTphc3NlcnQnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHNlbXZlciBmcm9tICdzZW12ZXInO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0IH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcblxuaW50ZXJmYWNlIE1pc2VUb21sIHtcbiAgdG9vbHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuLy8gVGhlIG9sZGVzdCBCdW4gcnVudGltZSB3YmZ5IHN1cHBvcnRzLlxuZXhwb3J0IGNvbnN0IG1pbmltdW1CdW5WZXJzaW9uID0gJzEuNC4wJztcblxuLyoqXG4gKiBQaW5zIE5vZGUuanMgYW5kIHRoZSBsYXRlc3QgQnVuIGFuZCAod2hlbiBmbm94LnRvbWwgZXhpc3RzKSBmbm94IHZlcnNpb25zLiBPbmx5IHRoZSBjaGFuZ2VkIHBpblxuICogbGluZXMgYXJlIGVkaXRlZCBpbiBwbGFjZTogcmUtc2VyaWFsaXppbmcgdGhlIHBhcnNlZCBUT01MIHdvdWxkIGRyb3AgZXZlcnkgY29tbWVudCBhbmQgY29sbGFwc2VcbiAqIG11bHRpLWxpbmUgc3RyaW5ncyAoZS5nLiBtaXNlIHRhc2sgc2NyaXB0cykgaW4gdGhlIHJlc3Qgb2YgdGhlIGZpbGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZU1pc2VUb21sKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlTWlzZVRvbWwnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgbWlzZVRvbWxQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnbWlzZS50b21sJyk7XG4gICAgY29uc3QgY29udGVudCA9IHJlYWRNaXNlVG9tbChtaXNlVG9tbFBhdGgpO1xuICAgIC8vIEEgcGFyc2UgZmFpbHVyZSBtdXN0IGFib3J0OiBlZGl0aW5nIHBpbnMgaW4gYSBicm9rZW4gbWlzZS50b21sIHdvdWxkIGhpZGUgdGhlIGJyZWFrYWdlLlxuICAgIGNvbnN0IHRvb2xzID0gKEJ1bi5UT01MLnBhcnNlKGNvbnRlbnQpIGFzIE1pc2VUb21sKS50b29scyA/PyB7fTtcblxuICAgIGNvbnN0IHBpbnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgICAgLy8gRW5zdXJlIE5vZGUuanMgaXMgYWx3YXlzIHBpbm5lZDogZ2VuZXJhdGVkIGhvb2tzIGFuZCBDSSBydW4gYG1pc2UgaW5zdGFsbGAsIGFuZCBhbiB1bnBpbm5lZFxuICAgICAgLy8gTm9kZSB3b3VsZCBjb21lIGZyb20gd2hhdGV2ZXIgaGFwcGVucyB0byBiZSBvbiBQQVRILlxuICAgICAgLy8gTGlmdC10aGVuLXBpbjogdGhlIGxpZnQgb25seSB0b3VjaGVzIGV4YWN0IHBpbnMgYW5kIHRoZSBwaW4gb25seSB0b3VjaGVzIHNlbGVjdG9ycywgc29cbiAgICAgIC8vIG9yZGVyaW5nIHRoZSBsaWZ0IGZpcnN0IGF2b2lkcyByZXNvbHZpbmcgYG1pc2UgbGF0ZXN0IG5vZGVAbHRzYCB0d2ljZSBmb3IgdW5waW5uZWQgcmVwb3MuXG4gICAgICBub2RlOiBwaW5Db25jcmV0ZVRvb2xWZXJzaW9uKFxuICAgICAgICAnbm9kZScsXG4gICAgICAgIGxpZnRPdXRkYXRlZFRvb2xWZXJzaW9uV2l0aGluTWFqb3IoJ25vZGVAbHRzJywgdG9vbHMubm9kZSwgY29uZmlnLmRpclBhdGgpLFxuICAgICAgICBjb25maWcuZGlyUGF0aFxuICAgICAgKSxcbiAgICAgIGJ1bjogcGluTGF0ZXN0VG9vbFZlcnNpb24oJ2J1bicsIHRvb2xzLmJ1biwgY29uZmlnLmRpclBhdGgpLFxuICAgIH07XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnZm5veC50b21sJykpKSB7XG4gICAgICBwaW5zLmZub3ggPSBwaW5MYXRlc3RUb29sVmVyc2lvbignZm5veCcsIHRvb2xzLmZub3gsIGNvbmZpZy5kaXJQYXRoKTtcbiAgICB9XG5cbiAgICBsZXQgbmV3Q29udGVudCA9IGNvbnRlbnQ7XG4gICAgZm9yIChjb25zdCBbdG9vbCwgdmVyc2lvbl0gb2YgT2JqZWN0LmVudHJpZXMocGlucykpIHtcbiAgICAgIGlmICh2ZXJzaW9uID09PSB0b29sc1t0b29sXSkgY29udGludWU7XG4gICAgICBhc3NlcnQub2sodHlwZW9mIHZlcnNpb24gPT09ICdzdHJpbmcnLCBgVGhlIHJlc29sdmVkICR7dG9vbH0gcGluIG11c3QgYmUgYSB2ZXJzaW9uIHN0cmluZy5gKTtcbiAgICAgIG5ld0NvbnRlbnQgPSBzZXRUb29sVmVyc2lvbihuZXdDb250ZW50LCB0b29sLCB2ZXJzaW9uKTtcbiAgICAgIC8vIEEgbGluZSBlZGl0IGJyZWFrcyBwaW5zIHdyaXR0ZW4gaW4gYW55IG90aGVyIGZvcm0gKGEgbXVsdGktbGluZSB2YWx1ZSwgYSBgdG9vbHMuYnVuYFxuICAgICAgLy8gZG90dGVkIGtleSwgYSBgW3Rvb2xzLmJ1bl1gIHN1Yi10YWJsZSksIHNvIG5ldmVyIHdyaXRlIGEgcmVzdWx0IHRoZSBwYXJzZXIgZGlzYWdyZWVzIHdpdGguXG4gICAgICBhc3NlcnQub2soXG4gICAgICAgIHBhcnNlVG9vbHMobmV3Q29udGVudCk/Llt0b29sXSA9PT0gdmVyc2lvbixcbiAgICAgICAgYFdyaXRlIHRoZSAke3Rvb2x9IHBpbiBpbiBtaXNlLnRvbWwgYXMgb25lIFxcYCR7dG9vbH0gPSAuLi5cXGAgbGluZSB1bmRlciBbdG9vbHNdLmBcbiAgICAgICk7XG4gICAgfVxuICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUobWlzZVRvbWxQYXRoLCBuZXdDb250ZW50KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHNldFRvb2xWZXJzaW9uKGNvbnRlbnQ6IHN0cmluZywgdG9vbDogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBwaW4gPSBgJHt0b29sfSA9IFwiJHt2ZXJzaW9ufVwiYDtcbiAgY29uc3Qgc2VjdGlvbiA9IC9eXFxbdG9vbHNcXF0oPyFbXlxcbl0pKD86XFxuKD8hXFxbKS4qKSovbXUuZXhlYyhjb250ZW50KT8uWzBdO1xuICBpZiAoc2VjdGlvbiA9PT0gdW5kZWZpbmVkKSByZXR1cm4gYCR7Y29udGVudCAmJiBgJHtjb250ZW50LnRyaW1FbmQoKX1cXG5cXG5gfVt0b29sc11cXG4ke3Bpbn1cXG5gO1xuXG4gIGNvbnN0IHBpblBhdHRlcm4gPSBuZXcgUmVnRXhwKGBeJHt0b29sfSA9IC4qPyhcXFxccyojLiopPyRgLCAnbXUnKTtcbiAgLy8gQmxhbmsgbGluZXMgYW5kIGNvbW1lbnRzIHRoYXQgZW5kIHRoZSBzZWN0aW9uIGxlYWQgdGhlIG5leHQgdGFibGUsIHNvIGEgbmV3IHBpbiBnb2VzIGFib3ZlIHRoZW0uXG4gIGNvbnN0IHBpbnNFbmQgPSAvKD86XFxuW1xcdCBdKig/OiMuKik/KSokL3UuZXhlYyhzZWN0aW9uKT8uaW5kZXggPz8gc2VjdGlvbi5sZW5ndGg7XG4gIGNvbnN0IG5ld1NlY3Rpb24gPSBwaW5QYXR0ZXJuLnRlc3Qoc2VjdGlvbilcbiAgICA/IHNlY3Rpb24ucmVwbGFjZShwaW5QYXR0ZXJuLCBgJHtwaW59JDFgKVxuICAgIDogYCR7c2VjdGlvbi5zbGljZSgwLCBwaW5zRW5kKX1cXG4ke3Bpbn0ke3NlY3Rpb24uc2xpY2UocGluc0VuZCl9YDtcbiAgcmV0dXJuIGNvbnRlbnQucmVwbGFjZShzZWN0aW9uLCAoKSA9PiBuZXdTZWN0aW9uKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VUb29scyhjb250ZW50OiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIChCdW4uVE9NTC5wYXJzZShjb250ZW50KSBhcyBNaXNlVG9tbCkudG9vbHM7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqIFVwZGF0ZXMgdG8gdGhlIGxhdGVzdCByZWxlYXNlIGFjcm9zcyBtYWpvciB2ZXJzaW9ucyB3aXRob3V0IGRvd25ncmFkaW5nIGV4aXN0aW5nIGV4YWN0IHBpbnMuICovXG5mdW5jdGlvbiBwaW5MYXRlc3RUb29sVmVyc2lvbih0b29sOiBzdHJpbmcsIHZlcnNpb246IHVua25vd24sIGN3ZDogc3RyaW5nKTogdW5rbm93biB7XG4gIC8vIFJlc29sdmUgaW5kZXBlbmRlbnRseSBvZiB0aGUgdGFyZ2V0J3MgdHJ1c3Qgc3RhdGUgYW5kIHRvb2wgYWxpYXNlcy5cbiAgY29uc3QgcmVzb2x2ZWRWZXJzaW9uID0gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KCdtaXNlJywgWyctLW5vLWNvbmZpZycsICdsYXRlc3QnLCB0b29sXSwgY3dkKTtcbiAgaWYgKCFzZW12ZXIudmFsaWQocmVzb2x2ZWRWZXJzaW9uKSkgcmV0dXJuIHZlcnNpb24gPz8gJ2xhdGVzdCc7XG4gIC8vIEEgY2FjaGVkIHJlbGVhc2UgbGlzdGluZyBjYW4gbGFnIGJlaGluZCBhbm90aGVyIG1hY2hpbmUgdGhhdCBhbHJlYWR5IHVwZGF0ZWQgdGhlIHBpbi5cbiAgcmV0dXJuIHR5cGVvZiB2ZXJzaW9uID09PSAnc3RyaW5nJyAmJiBzZW12ZXIudmFsaWQodmVyc2lvbikgJiYgc2VtdmVyLmd0KHZlcnNpb24sIHJlc29sdmVkVmVyc2lvbilcbiAgICA/IHZlcnNpb25cbiAgICA6IHJlc29sdmVkVmVyc2lvbjtcbn1cblxuLyoqXG4gKiBMaWZ0cyBhbiBleGFjdCB0b29sIHBpbiBiZWxvdyB0aGUgbGF0ZXN0IHJlc29sdmFibGUgdmVyc2lvbiDigJQgd2l0aGluIHRoZSBTQU1FIG1ham9yIOKAlCB0byB0aGF0XG4gKiB2ZXJzaW9uIChOb2RlLmpzIHJlc29sdmVzIGFnYWluc3QgdGhlIGxhdGVzdCBMVFMpOiB0aGUgcmVwb3NpdG9yeS1zdHJ1Y3R1cmUgc3RhbmRhcmQgdHJhY2tzIHRoZVxuICogY3VycmVudCB0b29sY2hhaW4gYWNyb3NzIHJlcG9zaXRvcmllcyBhbmQgUmVub3ZhdGUgZG9lcyBub3QgbWFuYWdlIG1pc2UudG9tbCBwaW5zLCBzb1xuICogcGF0Y2gvbWlub3IgZHJpZnQgKGUuZy4gbm9kZSAyNC4xNi4wIHZzIDI0LjE4LjApIG5ldmVyIHNlbGYtaGVhbHMuIEEgcGluXG4gKiBvbiBhbiBvbGRlciBtYWpvciBpcyBhIGRlbGliZXJhdGUgY29tcGF0aWJpbGl0eSBjaG9pY2UgYW5kIGlzIGtlcHQsIGFzIGFyZSBub24tZXhhY3QgYW5kXG4gKiBub24tc3RyaW5nIGZvcm1zLiBXaGVuIG1pc2UgY2Fubm90IHJlc29sdmUgdGhlIHNlbGVjdG9yIChlLmcuIG9mZmxpbmUpLCB0aGUgcGluIGlzIGtlcHQuXG4gKi9cbmZ1bmN0aW9uIGxpZnRPdXRkYXRlZFRvb2xWZXJzaW9uV2l0aGluTWFqb3Ioc2VsZWN0b3I6IHN0cmluZywgdmVyc2lvbjogdW5rbm93biwgY3dkOiBzdHJpbmcpOiB1bmtub3duIHtcbiAgaWYgKHR5cGVvZiB2ZXJzaW9uICE9PSAnc3RyaW5nJyB8fCAhc2VtdmVyLnZhbGlkKHZlcnNpb24pKSByZXR1cm4gdmVyc2lvbjtcbiAgY29uc3QgbGF0ZXN0VmVyc2lvbiA9IHNwYXduU3luY0FuZFJldHVyblN0ZG91dCgnbWlzZScsIFsnbGF0ZXN0Jywgc2VsZWN0b3JdLCBjd2QpO1xuICByZXR1cm4gc2VtdmVyLnZhbGlkKGxhdGVzdFZlcnNpb24pICYmXG4gICAgc2VtdmVyLm1ham9yKGxhdGVzdFZlcnNpb24pID09PSBzZW12ZXIubWFqb3IodmVyc2lvbikgJiZcbiAgICBzZW12ZXIubHQodmVyc2lvbiwgbGF0ZXN0VmVyc2lvbilcbiAgICA/IGxhdGVzdFZlcnNpb25cbiAgICA6IHZlcnNpb247XG59XG5cbi8qKlxuICogUmVwbGFjZXMgYW4gdW5waW5uZWQgc2VsZWN0b3IgKGBsYXRlc3RgLCBhIHJhbmdlIHN1Y2ggYXMgXCIyNFwiLCBhbiBhbGlhcywgb3IgYSBtaXNzaW5nIGVudHJ5KVxuICogd2l0aCB0aGUgbmV3ZXN0IGNvbmNyZXRlIHZlcnNpb24gbWlzZSByZXNvbHZlcyBmb3IgaXQsIGJlY2F1c2UgdGhlIHJlcG9zaXRvcnktc3RydWN0dXJlXG4gKiBzdGFuZGFyZCByZXF1aXJlcyBjb25jcmV0ZSBwaW5zOiBDSSBpbnN0YWxscyB3aGF0ZXZlciBhbiB1bnBpbm5lZCBzZWxlY3RvciByZXNvbHZlcyB0byBhdCBydW5cbiAqIHRpbWUsIHNvIGJ1aWxkcyBkcmlmdCBhY3Jvc3MgcnVucy4gRXhhY3QgdmVyc2lvbnMgYXJlIGtlcHQgYXMtaXMsIGFuZCBub24tc3RyaW5nIGZvcm1zIChtaXNlJ3NcbiAqIGFycmF5IGFuZCBgeyB2ZXJzaW9uID0gXCLigKZcIiB9YCBmb3JtcykgYXJlIHVzZXItbWFuYWdlZCBhbmQgbGVmdCB1bnRvdWNoZWQuIFdoZW4gbWlzZSBpc1xuICogdW5hdmFpbGFibGUgb3IgY2Fubm90IHJlc29sdmUgdGhlIHNlbGVjdG9yIChlLmcuIG9mZmxpbmUpLCB0aGUgb3JpZ2luYWwgc2VsZWN0b3IgaXMga2VwdCDigJRcbiAqIGFuIHVucGlubmVkIHRvb2wgaXMgYmV0dGVyIHRoYW4gYSBicm9rZW4gY29uZmlndXJhdGlvbi5cbiAqL1xuZnVuY3Rpb24gcGluQ29uY3JldGVUb29sVmVyc2lvbih0b29sOiBzdHJpbmcsIHZlcnNpb246IHVua25vd24sIGN3ZDogc3RyaW5nKTogdW5rbm93biB7XG4gIGlmICh2ZXJzaW9uICE9PSB1bmRlZmluZWQgJiYgKHR5cGVvZiB2ZXJzaW9uICE9PSAnc3RyaW5nJyB8fCBzZW12ZXIudmFsaWQodmVyc2lvbikpKSByZXR1cm4gdmVyc2lvbjtcbiAgLy8gTm9ybWFsaXplIHNlbGVjdG9yIGZvcm1zIGBtaXNlIGxhdGVzdGAgY2Fubm90IHJlc29sdmUgZXZlbiB0aG91Z2ggbWlzZSBjb25maWd1cmF0aW9uIGFjY2VwdHNcbiAgLy8gdGhlbTogYHByZWZpeDoyNGAgaXMgcmVqZWN0ZWQgb3V0cmlnaHQgd2hpbGUgYDI0YCByZXNvbHZlcywgYW5kIGBsdHMvKmAgeWllbGRzIGVtcHR5IG91dHB1dFxuICAvLyB3aGlsZSBgbHRzYCByZXNvbHZlcy4gTW9kaWZpZXIgc2VsZWN0b3JzIHN1Y2ggYXMgYHN1Yi0yOmx0c2Agc3RheSB1bnJlc29sdmFibGUgYW5kIGZhbGwgYmFja1xuICAvLyB0byB0aGUgb3JpZ2luYWwgc2VsZWN0b3IgYmVsb3cuXG4gIGNvbnN0IHJhbmdlID0gdHlwZW9mIHZlcnNpb24gPT09ICdzdHJpbmcnID8gdmVyc2lvbi5yZXBsYWNlKC9ecHJlZml4Oi91LCAnJykucmVwbGFjZSgvXFwvXFwqJC91LCAnJykgOiB1bmRlZmluZWQ7XG4gIC8vIFdpdGggbm8gbWVhbmluZ2Z1bCBzZWxlY3RvciwgTm9kZS5qcyBwaW5zIHRvIHRoZSBsYXRlc3QgTFRTIChtYXRjaGluZyB0aGUgcmV1c2FibGUgd29ya2Zsb3dzJ1xuICAvLyBgbHRzLypgIGZhbGxiYWNrKSByYXRoZXIgdGhhbiB0aGUgbmV3ZXN0IHJlbGVhc2UuXG4gIGNvbnN0IGRlZmF1bHRTZWxlY3RvciA9IHRvb2wgPT09ICdub2RlJyA/ICdub2RlQGx0cycgOiB0b29sO1xuICBjb25zdCBzZWxlY3RvciA9IHJhbmdlICYmIHJhbmdlICE9PSAnbGF0ZXN0JyA/IGAke3Rvb2x9QCR7cmFuZ2V9YCA6IGRlZmF1bHRTZWxlY3RvcjtcbiAgY29uc3QgcmVzb2x2ZWRWZXJzaW9uID0gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KCdtaXNlJywgWydsYXRlc3QnLCBzZWxlY3Rvcl0sIGN3ZCk7XG4gIHJldHVybiBzZW12ZXIudmFsaWQocmVzb2x2ZWRWZXJzaW9uKSA/IHJlc29sdmVkVmVyc2lvbiA6ICh2ZXJzaW9uID8/ICdsYXRlc3QnKTtcbn1cblxuZnVuY3Rpb24gcmVhZE1pc2VUb21sKG1pc2VUb21sUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZnMucmVhZEZpbGVTeW5jKG1pc2VUb21sUGF0aCwgJ3V0ZjgnKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyBPbmx5IGEgcmVwb3NpdG9yeSB3aXRob3V0IG1pc2UudG9tbCBzdGFydHMgZnJvbSBhbiBlbXB0eSBjb25maWd1cmF0aW9uOyBhbiB1bnJlYWRhYmxlIGZpbGVcbiAgICAvLyAoZS5nLiBwZXJtaXNzaW9ucykgbXVzdCBhYm9ydCBpbnN0ZWFkIG9mIGJlaW5nIG92ZXJ3cml0dGVuIHdpdGggZ2VuZXJhdGVkIHNldHRpbmdzLlxuICAgIGlmICgoZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlID09PSAnRU5PRU5UJykgcmV0dXJuICcnO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcml2YXRlUmVnaXN0cnlTY29wZU1hcHBpbmcsIHJlcG9SZXNvbHZlc1ByaXZhdGVQYWNrYWdlcyB9IGZyb20gJy4uL3V0aWxzL3ByaXZhdGVQYWNrYWdlcy5qcyc7XG5cbi8qKlxuICogQnVuIHJlYWRzIHJlZ2lzdHJ5IHNjb3BlIG1hcHBpbmdzIGZyb20gYSBwaHlzaWNhbCByZXBvc2l0b3J5IC5ucG1yYyBkdXJpbmcgUmVub3ZhdGUgYXJ0aWZhY3RcbiAqIHVwZGF0ZXM7IFJlbm92YXRlJ3MgbnBtcmMgc2V0dGluZyBpcyB1c2VkIG9ubHkgYnkgaXRzIGRhdGFzb3VyY2UgbGF5ZXIuIEtlZXAgdGhlIG5vbi1zZWNyZXRcbiAqIG1hcHBpbmcgaW4gcmVwb3NpdG9yaWVzIHRoYXQgcmVzb2x2ZSBwcml2YXRlIHBhY2thZ2VzLCB3aGlsZSBhdXRoZW50aWNhdGlvbiByZW1haW5zIGluIHRoZVxuICogZGV2ZWxvcGVyJ3Mgfi8ubnBtcmMgbG9jYWxseSBhbmQgaW4gdGVtcG9yYXJ5IENJIG9yIE1lbmQgY29uZmlndXJhdGlvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUmVwb3NpdG9yeU5wbXJjKGNvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByZXBvQXV0aG9yID0gY29uZmlnc1swXT8ucmVwb0F1dGhvcjtcbiAgaWYgKHJlcG9BdXRob3IgIT09ICdXaWxsQm9vc3RlcicgJiYgcmVwb0F1dGhvciAhPT0gJ1dpbGxCb29zdGVyTGFiJykgcmV0dXJuO1xuXG4gIGNvbnN0IG5wbXJjUGF0aHMgPSBuZXcgU2V0KGNvbmZpZ3MubWFwKChjb25maWcpID0+IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5ucG1yYycpKSk7XG4gIGNvbnN0IHJvb3RDb25maWcgPSBjb25maWdzLmZpbmQoKGNvbmZpZykgPT4gY29uZmlnLmlzUm9vdCk7XG4gIGlmIChyb290Q29uZmlnICYmIHJlcG9SZXNvbHZlc1ByaXZhdGVQYWNrYWdlcyhyb290Q29uZmlnKSkge1xuICAgIGNvbnN0IHJvb3ROcG1yY1BhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLm5wbXJjJyk7XG4gICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShyb290TnBtcmNQYXRoLCBwcml2YXRlUmVnaXN0cnlTY29wZU1hcHBpbmcpO1xuICAgIG5wbXJjUGF0aHMuZGVsZXRlKHJvb3ROcG1yY1BhdGgpO1xuICB9XG5cbiAgZm9yIChjb25zdCBucG1yY1BhdGggb2YgbnBtcmNQYXRocykgYXdhaXQgcmVtb3ZlTnBtcmMobnBtcmNQYXRoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlTnBtcmMobnBtcmNQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCEoYXdhaXQgZnMucHJvbWlzZXMubHN0YXQobnBtcmNQYXRoKS5jYXRjaCgoKSA9PiB7fSkpKSByZXR1cm47XG4gIGlmIChhd2FpdCBmc1V0aWwucmVtb3ZlQ29uZmluZWQobnBtcmNQYXRoKSkge1xuICAgIGNvbnNvbGUuaW5mbyhgUmVtb3ZlZCBub24tY2Fub25pY2FsIHJlcG9zaXRvcnkgbnBtcmMgJHtucG1yY1BhdGh9LmApO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IE9jdG9raXQgfSBmcm9tICdAb2N0b2tpdC9jb3JlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2V0T2N0b2tpdCwgaGFzR2l0SHViVG9rZW4gfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwTGFiZWxzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ3NldHVwTGFiZWxzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgcmVwb0F1dGhvcjogb3duZXIsIHJlcG9OYW1lOiByZXBvIH0gPSBjb25maWc7XG4gICAgaWYgKCFvd25lciB8fCAhcmVwbykgcmV0dXJuO1xuICAgIGlmIChvd25lciAhPT0gJ1dpbGxCb29zdGVyJyAmJiBvd25lciAhPT0gJ1dpbGxCb29zdGVyTGFiJykgcmV0dXJuO1xuICAgIGlmICghaGFzR2l0SHViVG9rZW4ob3duZXIpKSByZXR1cm47XG5cbiAgICBjb25zdCBvY3Rva2l0ID0gZ2V0T2N0b2tpdChvd25lcik7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2QxOiB4LWVhc3kgOmhlZGdlaG9nOicsICdFREU5RkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkMjogZWFzeSA6cmFiYml0MjonLCAnRERENkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDM6IG1lZGl1bSA6b3g6JywgJ0M0QjVGRCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2Q0OiBoYXJkIDpzcXVpZDonLCAnQTc4QkZBJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDU6IHgtaGFyZCA6d2hhbGUyOicsICc4QjVDRjYnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdwMTogY3JpdGljYWwgOmZpcmU6OmZpcmU6OmZpcmU6JywgJ0VGNDQ0NCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3AyOiB1cmdlbnQgOmZpcmU6OmZpcmU6JywgJ0Y4NzE3MScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3AzOiBpbXBvcnRhbnQgOmZpcmU6JywgJ0ZDQTVBNScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3A0OiBuaWNlIHRvIGhhdmUgOmRyb3BsZXQ6JywgJ0ZFQ0FDQScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IGJsaXR6JywgJzUzMDBiYycpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IGZpcmViYXNlJywgJ2ZmY2EyOCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IHByaXNtYScsICcwYzM0NGInKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiByZWFjdCcsICc2MWRhZmInKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiBzZW1hbnRpYy1yZWxlYXNlJywgJzQ5NDk0OScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JlYWR5IDpyb2NrZXQ6JywgJzIyQzU1RScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JldmlldyByZXF1ZXN0ZWQgOm1hZzonLCAnRkJDQTA0Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmVsZWFzZWQgOmJvb2ttYXJrOicsICc2MzY2RjEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiAwLjVoIDpjbG9jazEyMzA6JywgJ0YzRjRGNicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDFoIDpjbG9jazE6JywgJ0U1RTdFQicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDJoIDpjbG9jazI6JywgJ0QxRDVEQicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDNoIDpjbG9jazM6JywgJzlDQTNBRicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDVoIDpjbG9jazU6JywgJzZCNzI4MCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDhoIDpjbG9jazg6JywgJzRCNTU2MycpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDEzaCA6Y2xvY2sxOicsICczNzQxNTEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBidWlsZCA6aGFtbWVyOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBjaG9yZSA6YnJvb206JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGNpIDpjb25zdHJ1Y3Rpb25fd29ya2VyOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBkb2NzIDptZW1vOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBmZWF0IDpzcGFya2xlczonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogZml4IDpidWc6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IHBlcmYgOnphcDonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogcmVmYWN0b3IgOnJlY3ljbGU6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IHN0eWxlIDpsaXBzdGljazonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogdGVzdCA6dGVzdF90dWJlOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdwcm9qZWN0JywgJzI0MjkyRicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2ZvY3VzZWQgOmRhcnQ6JywgJzIyQzU1RScpO1xuXG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2J1ZycpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkb2N1bWVudGF0aW9uJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2R1cGxpY2F0ZScpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdlbmhhbmNlbWVudCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdnb29kIGZpcnN0IGlzc3VlJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2hlbHAgd2FudGVkJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2ludmFsaWQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncXVlc3Rpb24nKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnd29udGZpeCcpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1NraXAgc2V0dXBMYWJlbHMgZHVlIHRvOicsIChlcnJvciBhcyBFcnJvciB8IHVuZGVmaW5lZCk/LnN0YWNrID8/IGVycm9yKTtcbiAgICB9XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzZXR1cExhYmVsKG9jdG9raXQ6IE9jdG9raXQsIG93bmVyOiBzdHJpbmcsIHJlcG86IHN0cmluZywgbmFtZTogc3RyaW5nLCBjb2xvcjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHMnLCB7XG4gICAgICBvd25lcixcbiAgICAgIHJlcG8sXG4gICAgICBuYW1lLFxuICAgICAgY29sb3IsXG4gICAgfSk7XG4gIH0gY2F0Y2gge1xuICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVscy97bmFtZX0nLCB7XG4gICAgICBvd25lcixcbiAgICAgIHJlcG8sXG4gICAgICBuYW1lLFxuICAgICAgY29sb3IsXG4gICAgfSk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZGVsZXRlTGFiZWwob2N0b2tpdDogT2N0b2tpdCwgb3duZXI6IHN0cmluZywgcmVwbzogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ0RFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vbGFiZWxzL3tuYW1lfScsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIG5hbWUsXG4gICAgfSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBPY3Rva2l0IH0gZnJvbSAnQG9jdG9raXQvY29yZSc7XG5pbXBvcnQgeyB3aXRoUmV0cnkgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi9zcmMnO1xuXG5pbXBvcnQgeyBpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyB9IGZyb20gJy4uL2dlbmVyYXRvcnMvd29ya2Zsb3cuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2V0T2N0b2tpdCwgaGFzR2l0SHViVG9rZW4sIGlzR2l0SHViUGVybWlzc2lvbk9yVmlzaWJpbGl0eUVycm9yIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmludGVyZmFjZSBSZXBvc2l0b3J5UnVsZXNldFBheWxvYWQge1xuICBuYW1lOiBzdHJpbmc7XG4gIHRhcmdldDogJ2JyYW5jaCc7XG4gIGVuZm9yY2VtZW50OiAnYWN0aXZlJztcbiAgY29uZGl0aW9uczoge1xuICAgIHJlZl9uYW1lOiB7XG4gICAgICBpbmNsdWRlOiBzdHJpbmdbXTtcbiAgICAgIGV4Y2x1ZGU6IHN0cmluZ1tdO1xuICAgIH07XG4gIH07XG4gIHJ1bGVzOiAoXG4gICAgfCB7XG4gICAgICAgIHR5cGU6ICdkZWxldGlvbicgfCAnbm9uX2Zhc3RfZm9yd2FyZCc7XG4gICAgICB9XG4gICAgfCB7XG4gICAgICAgIHR5cGU6ICdyZXF1aXJlZF9zdGF0dXNfY2hlY2tzJztcbiAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgIHN0cmljdF9yZXF1aXJlZF9zdGF0dXNfY2hlY2tzX3BvbGljeTogYm9vbGVhbjtcbiAgICAgICAgICBkb19ub3RfZW5mb3JjZV9vbl9jcmVhdGU6IGJvb2xlYW47XG4gICAgICAgICAgcmVxdWlyZWRfc3RhdHVzX2NoZWNrczoge1xuICAgICAgICAgICAgY29udGV4dDogc3RyaW5nO1xuICAgICAgICAgICAgaW50ZWdyYXRpb25faWQ6IG51bWJlcjtcbiAgICAgICAgICB9W107XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfCB7XG4gICAgICAgIHR5cGU6ICdwdWxsX3JlcXVlc3QnO1xuICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgcmVxdWlyZWRfYXBwcm92aW5nX3Jldmlld19jb3VudDogbnVtYmVyO1xuICAgICAgICAgIGRpc21pc3Nfc3RhbGVfcmV2aWV3c19vbl9wdXNoOiBib29sZWFuO1xuICAgICAgICAgIHJlcXVpcmVkX3Jldmlld2VyczogW107XG4gICAgICAgICAgcmVxdWlyZV9jb2RlX293bmVyX3JldmlldzogYm9vbGVhbjtcbiAgICAgICAgICByZXF1aXJlX2xhc3RfcHVzaF9hcHByb3ZhbDogYm9vbGVhbjtcbiAgICAgICAgICByZXF1aXJlZF9yZXZpZXdfdGhyZWFkX3Jlc29sdXRpb246IGJvb2xlYW47XG4gICAgICAgICAgYWxsb3dlZF9tZXJnZV9tZXRob2RzOiBbJ3NxdWFzaCddO1xuICAgICAgICB9O1xuICAgICAgfVxuICApW107XG4gIGJ5cGFzc19hY3RvcnM6IHtcbiAgICBhY3Rvcl9pZDogbnVtYmVyO1xuICAgIGFjdG9yX3R5cGU6ICdUZWFtJztcbiAgICBieXBhc3NfbW9kZTogJ3B1bGxfcmVxdWVzdCc7XG4gIH1bXTtcbn1cblxuaW50ZXJmYWNlIFJlcG9zaXRvcnlSdWxlc2V0U3VtbWFyeSB7XG4gIGlkPzogbnVtYmVyO1xuICBuYW1lPzogc3RyaW5nO1xuICBzb3VyY2VfdHlwZT86IHN0cmluZztcbn1cblxuY29uc3QgR0lUSFVCX0FQSV9WRVJTSU9OX0hFQURFUiA9IHtcbiAgJ1gtR2l0SHViLUFwaS1WZXJzaW9uJzogJzIwMjItMTEtMjgnLFxufSBhcyBjb25zdDtcblxuY29uc3QgR0lUSFVCX0FDVElPTlNfSU5URUdSQVRJT05fSUQgPSAxNV8zNjg7XG5cbmNvbnN0IFBST1RFQ1RfTUFJTl9SVUxFU0VUOiBSZXBvc2l0b3J5UnVsZXNldFBheWxvYWQgPSB7XG4gIG5hbWU6ICdQcm90ZWN0IG1haW4nLFxuICB0YXJnZXQ6ICdicmFuY2gnLFxuICBlbmZvcmNlbWVudDogJ2FjdGl2ZScsXG4gIGNvbmRpdGlvbnM6IHtcbiAgICByZWZfbmFtZToge1xuICAgICAgZXhjbHVkZTogW10sXG4gICAgICBpbmNsdWRlOiBbJ35ERUZBVUxUX0JSQU5DSCddLFxuICAgIH0sXG4gIH0sXG4gIHJ1bGVzOiBbXG4gICAge1xuICAgICAgdHlwZTogJ2RlbGV0aW9uJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIHR5cGU6ICdyZXF1aXJlZF9zdGF0dXNfY2hlY2tzJyxcbiAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgc3RyaWN0X3JlcXVpcmVkX3N0YXR1c19jaGVja3NfcG9saWN5OiBmYWxzZSxcbiAgICAgICAgZG9fbm90X2VuZm9yY2Vfb25fY3JlYXRlOiB0cnVlLFxuICAgICAgICByZXF1aXJlZF9zdGF0dXNfY2hlY2tzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgY29udGV4dDogJ3Rlc3QgLyB0ZXN0JyxcbiAgICAgICAgICAgIGludGVncmF0aW9uX2lkOiBHSVRIVUJfQUNUSU9OU19JTlRFR1JBVElPTl9JRCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbnRleHQ6ICdzZW1hbnRpYy1wciAvIHNlbWFudGljLXByJyxcbiAgICAgICAgICAgIGludGVncmF0aW9uX2lkOiBHSVRIVUJfQUNUSU9OU19JTlRFR1JBVElPTl9JRCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHR5cGU6ICdub25fZmFzdF9mb3J3YXJkJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIHR5cGU6ICdwdWxsX3JlcXVlc3QnLFxuICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICByZXF1aXJlZF9hcHByb3ZpbmdfcmV2aWV3X2NvdW50OiAwLFxuICAgICAgICBkaXNtaXNzX3N0YWxlX3Jldmlld3Nfb25fcHVzaDogZmFsc2UsXG4gICAgICAgIHJlcXVpcmVkX3Jldmlld2VyczogW10sXG4gICAgICAgIHJlcXVpcmVfY29kZV9vd25lcl9yZXZpZXc6IGZhbHNlLFxuICAgICAgICByZXF1aXJlX2xhc3RfcHVzaF9hcHByb3ZhbDogZmFsc2UsXG4gICAgICAgIHJlcXVpcmVkX3Jldmlld190aHJlYWRfcmVzb2x1dGlvbjogZmFsc2UsXG4gICAgICAgIGFsbG93ZWRfbWVyZ2VfbWV0aG9kczogWydzcXVhc2gnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgXSxcbiAgYnlwYXNzX2FjdG9yczogW1xuICAgIHtcbiAgICAgIGFjdG9yX2lkOiAxN183NzdfNDk1LFxuICAgICAgYWN0b3JfdHlwZTogJ1RlYW0nLFxuICAgICAgYnlwYXNzX21vZGU6ICdwdWxsX3JlcXVlc3QnLFxuICAgIH0sXG4gIF0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0dXBSZXBvc2l0b3J5UnVsZXNldHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignc2V0dXBSZXBvc2l0b3J5UnVsZXNldHMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeyByZXBvQXV0aG9yOiBvd25lciwgcmVwb05hbWU6IHJlcG8gfSA9IGNvbmZpZztcbiAgICBpZiAoIW93bmVyIHx8ICFyZXBvKSByZXR1cm47XG4gICAgaWYgKG93bmVyICE9PSAnV2lsbEJvb3N0ZXInKSByZXR1cm47XG4gICAgLy8gVGhlIHJldXNhYmxlLXdvcmtmbG93cyByZXBvIGhvc3RzIHdvcmtmbG93X2NhbGwgZGVmaW5pdGlvbnMsIHNvIHRoZVxuICAgIC8vIFByb3RlY3QgbWFpbiBydWxlc2V0IHdvdWxkIHJlcXVpcmUgdGVzdC9zZW1hbnRpYy1wciBjaGVja3MgdGhhdCBuZXZlciBydW4gdGhlcmUuXG4gICAgaWYgKGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKGNvbmZpZy5yZXBvc2l0b3J5KSkgcmV0dXJuO1xuICAgIGlmICghaGFzR2l0SHViVG9rZW4ob3duZXIpKSByZXR1cm47XG5cbiAgICBjb25zdCBvY3Rva2l0ID0gZ2V0T2N0b2tpdChvd25lcik7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdXBzZXJ0UHJvdGVjdE1haW5SdWxlc2V0KG9jdG9raXQsIG93bmVyLCByZXBvLCBidWlsZFByb3RlY3RNYWluUnVsZXNldChjb25maWcpKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKCFpc0dpdEh1YlBlcm1pc3Npb25PclZpc2liaWxpdHlFcnJvcihlcnJvcikpIHRocm93IGVycm9yO1xuXG4gICAgICAvLyBSZXBvc2l0b3J5IHJ1bGVzZXRzIHJlcXVpcmUgYWRtaW5pc3RyYXRpb24gcGVybWlzc2lvbiwgd2hpY2ggbG9jYWwgcnVuc1xuICAgICAgLy8gbWF5IG5vdCBoYXZlIGV2ZW4gd2hlbiBmaWxlLWdlbmVyYXRpb24gYW5kIHB1c2hlcyBhcmUgYWxsb3dlZC5cbiAgICAgIGNvbnNvbGUud2FybignU2tpcCBzZXR1cFJlcG9zaXRvcnlSdWxlc2V0cyBkdWUgdG86JywgKGVycm9yIGFzIEVycm9yIHwgdW5kZWZpbmVkKT8uc3RhY2sgPz8gZXJyb3IpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUHJvdGVjdE1haW5SdWxlc2V0KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFJlcG9zaXRvcnlSdWxlc2V0UGF5bG9hZCB7XG4gIGNvbnN0IHJ1bGVzZXQgPSBzdHJ1Y3R1cmVkQ2xvbmUoUFJPVEVDVF9NQUlOX1JVTEVTRVQpO1xuICBpZiAoY29uZmlnLmNhcmdvVG9tbERpclBhdGhzLmxlbmd0aCA+IDApIHtcbiAgICBmb3IgKGNvbnN0IHJ1bGUgb2YgcnVsZXNldC5ydWxlcykge1xuICAgICAgaWYgKHJ1bGUudHlwZSAhPT0gJ3JlcXVpcmVkX3N0YXR1c19jaGVja3MnKSBjb250aW51ZTtcbiAgICAgIC8vIFRoZSBjb250ZXh0IGlzIGA8Y2FsbGVyIGpvYiBpZD4gLyA8cmV1c2FibGUgam9iIGlkPmAgb2YgdGhlIHdiZnktZ2VuZXJhdGVkIHRlc3QtcnVzdC55bWwuXG4gICAgICBydWxlLnBhcmFtZXRlcnMucmVxdWlyZWRfc3RhdHVzX2NoZWNrcy5wdXNoKHtcbiAgICAgICAgY29udGV4dDogJ3Rlc3QtcnVzdCAvIHRlc3QtcnVzdCcsXG4gICAgICAgIGludGVncmF0aW9uX2lkOiBHSVRIVUJfQUNUSU9OU19JTlRFR1JBVElPTl9JRCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcnVsZXNldDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdXBzZXJ0UHJvdGVjdE1haW5SdWxlc2V0KFxuICBvY3Rva2l0OiBPY3Rva2l0LFxuICBvd25lcjogc3RyaW5nLFxuICByZXBvOiBzdHJpbmcsXG4gIHJ1bGVzZXQ6IFJlcG9zaXRvcnlSdWxlc2V0UGF5bG9hZFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGV4aXN0aW5nUnVsZXNldCA9IGF3YWl0IGZpbmRSZXBvc2l0b3J5UnVsZXNldChvY3Rva2l0LCBvd25lciwgcmVwbywgcnVsZXNldC5uYW1lKTtcbiAgY29uc3QgZXhpc3RpbmdSdWxlc2V0SWQgPSBleGlzdGluZ1J1bGVzZXQ/LmlkO1xuXG4gIGF3YWl0IHdpdGhSZXRyeShcbiAgICBhc3luYyAoKSA9PiB7XG4gICAgICBpZiAoZXhpc3RpbmdSdWxlc2V0SWQpIHtcbiAgICAgICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3J1bGVzZXRzL3tydWxlc2V0X2lkfScsIHtcbiAgICAgICAgICBvd25lcixcbiAgICAgICAgICByZXBvLFxuICAgICAgICAgIHJ1bGVzZXRfaWQ6IGV4aXN0aW5nUnVsZXNldElkLFxuICAgICAgICAgIC4uLnJ1bGVzZXQsXG4gICAgICAgICAgaGVhZGVyczogR0lUSFVCX0FQSV9WRVJTSU9OX0hFQURFUixcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ydWxlc2V0cycsIHtcbiAgICAgICAgb3duZXIsXG4gICAgICAgIHJlcG8sXG4gICAgICAgIC4uLnJ1bGVzZXQsXG4gICAgICAgIGhlYWRlcnM6IEdJVEhVQl9BUElfVkVSU0lPTl9IRUFERVIsXG4gICAgICB9KTtcbiAgICB9LFxuICAgIHtcbiAgICAgIHNob3VsZFJldHJ5OiAoZXJyb3IpID0+ICFpc0dpdEh1YlBlcm1pc3Npb25PclZpc2liaWxpdHlFcnJvcihlcnJvciksXG4gICAgfVxuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmaW5kUmVwb3NpdG9yeVJ1bGVzZXQoXG4gIG9jdG9raXQ6IE9jdG9raXQsXG4gIG93bmVyOiBzdHJpbmcsXG4gIHJlcG86IHN0cmluZyxcbiAgcnVsZXNldE5hbWU6IHN0cmluZ1xuKTogUHJvbWlzZTxSZXBvc2l0b3J5UnVsZXNldFN1bW1hcnkgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB3aXRoUmV0cnkoXG4gICAgKCkgPT5cbiAgICAgIG9jdG9raXQucmVxdWVzdCgnR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ydWxlc2V0cycsIHtcbiAgICAgICAgb3duZXIsXG4gICAgICAgIHJlcG8sXG4gICAgICAgIGluY2x1ZGVzX3BhcmVudHM6IGZhbHNlLFxuICAgICAgICB0YXJnZXRzOiAnYnJhbmNoJyxcbiAgICAgICAgaGVhZGVyczogR0lUSFVCX0FQSV9WRVJTSU9OX0hFQURFUixcbiAgICAgIH0pLFxuICAgIHtcbiAgICAgIHNob3VsZFJldHJ5OiAoZXJyb3IpID0+ICFpc0dpdEh1YlBlcm1pc3Npb25PclZpc2liaWxpdHlFcnJvcihlcnJvciksXG4gICAgfVxuICApO1xuICBjb25zdCBydWxlc2V0cyA9IHJlc3BvbnNlLmRhdGE7XG4gIGlmICghQXJyYXkuaXNBcnJheShydWxlc2V0cykpIHJldHVybjtcbiAgcmV0dXJuIHJ1bGVzZXRzLmZpbmQoKHJ1bGVzZXQpID0+IHJ1bGVzZXQubmFtZSA9PT0gcnVsZXNldE5hbWUgJiYgcnVsZXNldC5zb3VyY2VfdHlwZSA9PT0gJ1JlcG9zaXRvcnknKTtcbn1cbiIsImltcG9ydCB7IHdpdGhSZXRyeSB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliL3NyYyc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdldE9jdG9raXQsIGhhc0dpdEh1YlRva2VuLCBpc0dpdEh1YlBlcm1pc3Npb25PclZpc2liaWxpdHlFcnJvciB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0dXBHaXRIdWJTZXR0aW5ncyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdzZXR1cEdpdEh1YlNldHRpbmdzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgcmVwb0F1dGhvcjogb3duZXIsIHJlcG9OYW1lOiByZXBvIH0gPSBjb25maWc7XG4gICAgaWYgKCFvd25lciB8fCAhcmVwbykgcmV0dXJuO1xuICAgIGlmIChvd25lciAhPT0gJ1dpbGxCb29zdGVyJyAmJiBvd25lciAhPT0gJ1dpbGxCb29zdGVyTGFiJykgcmV0dXJuO1xuICAgIGlmICghaGFzR2l0SHViVG9rZW4ob3duZXIpKSByZXR1cm47XG5cbiAgICBjb25zdCBvY3Rva2l0ID0gZ2V0T2N0b2tpdChvd25lcik7XG5cbiAgICB0cnkge1xuICAgICAgLy8gUmVwb3NpdG9yeSBzZXR0aW5ncyBuZWVkIGFkbWluaXN0cmF0aW9uIHBlcm1pc3Npb24sIHVubGlrZSBmaWxlIGdlbmVyYXRpb24uXG4gICAgICBhd2FpdCB3aXRoUmV0cnkoXG4gICAgICAgICgpID0+XG4gICAgICAgICAgb2N0b2tpdC5yZXF1ZXN0KCdQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30nLCB7XG4gICAgICAgICAgICBvd25lcixcbiAgICAgICAgICAgIHJlcG8sXG4gICAgICAgICAgICBhbGxvd19hdXRvX21lcmdlOiB0cnVlLFxuICAgICAgICAgICAgYWxsb3dfbWVyZ2VfY29tbWl0OiBmYWxzZSxcbiAgICAgICAgICAgIGFsbG93X3NxdWFzaF9tZXJnZTogdHJ1ZSxcbiAgICAgICAgICAgIGFsbG93X3JlYmFzZV9tZXJnZTogZmFsc2UsXG4gICAgICAgICAgICBhbGxvd191cGRhdGVfYnJhbmNoOiB0cnVlLFxuICAgICAgICAgICAgZGVsZXRlX2JyYW5jaF9vbl9tZXJnZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc193aWtpOiBmYWxzZSxcbiAgICAgICAgICAgIGhhc19wcm9qZWN0czogZmFsc2UsXG4gICAgICAgICAgICBzcXVhc2hfbWVyZ2VfY29tbWl0X3RpdGxlOiAnUFJfVElUTEUnLFxuICAgICAgICAgICAgc3F1YXNoX21lcmdlX2NvbW1pdF9tZXNzYWdlOiAnQkxBTksnLFxuICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAnWC1HaXRIdWItQXBpLVZlcnNpb24nOiAnMjAyMi0xMS0yOCcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLi4uKGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXIvJykgPyB7IGFsbG93X2F1dG9fbWVyZ2U6IHRydWUgfSA6IHt9KSxcbiAgICAgICAgICB9KSxcbiAgICAgICAge1xuICAgICAgICAgIHNob3VsZFJldHJ5OiAoZXJyb3IpID0+ICFpc0dpdEh1YlBlcm1pc3Npb25PclZpc2liaWxpdHlFcnJvcihlcnJvciksXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICghaXNHaXRIdWJQZXJtaXNzaW9uT3JWaXNpYmlsaXR5RXJyb3IoZXJyb3IpKSB0aHJvdyBlcnJvcjtcblxuICAgICAgLy8gTG9jYWwgd2JmeSBydW5zIG9mdGVuIGhhdmUgcHVzaCBwZXJtaXNzaW9uIHdpdGhvdXQgYWRtaW4gcGVybWlzc2lvbi5cbiAgICAgIGNvbnNvbGUud2FybignU2tpcCBzZXR1cEdpdEh1YlNldHRpbmdzIGR1ZSB0bzonLCAoZXJyb3IgYXMgRXJyb3IgfCB1bmRlZmluZWQpPy5zdGFjayA/PyBlcnJvcik7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHdpdGhSZXRyeSgoKSA9PiBkaXNhYmxlRGlzY3Vzc2lvbnMob2N0b2tpdCwgb3duZXIsIHJlcG8pLCB7XG4gICAgICAgIHNob3VsZFJldHJ5OiAoZXJyb3IpID0+ICFpc0dpdEh1YlNldHRpbmdzRXJyb3IoZXJyb3IpLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICghaXNHaXRIdWJTZXR0aW5nc0Vycm9yKGVycm9yKSkgdGhyb3cgZXJyb3I7XG4gICAgICBjb25zb2xlLndhcm4oJ1NraXAgZGlzYWJsaW5nIEdpdEh1YiBEaXNjdXNzaW9ucyBkdWUgdG86JywgKGVycm9yIGFzIEVycm9yIHwgdW5kZWZpbmVkKT8uc3RhY2sgPz8gZXJyb3IpO1xuICAgIH1cbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRpc2FibGVEaXNjdXNzaW9ucyhvY3Rva2l0OiBSZXR1cm5UeXBlPHR5cGVvZiBnZXRPY3Rva2l0Piwgb3duZXI6IHN0cmluZywgcmVwbzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHJlcG9zaXRvcnlSZXNwb25zZSA9IGF3YWl0IG9jdG9raXQuZ3JhcGhxbDx7IHJlcG9zaXRvcnk/OiB7IGlkPzogc3RyaW5nIH0gfT4oXG4gICAgYHF1ZXJ5KCRvd25lcjogU3RyaW5nISwgJHJlcG86IFN0cmluZyEpIHtcbiAgICAgIHJlcG9zaXRvcnkob3duZXI6ICRvd25lciwgbmFtZTogJHJlcG8pIHsgaWQgfVxuICAgIH1gLFxuICAgIHsgb3duZXIsIHJlcG8gfVxuICApO1xuICBjb25zdCByZXBvc2l0b3J5SWQgPSByZXBvc2l0b3J5UmVzcG9uc2UucmVwb3NpdG9yeT8uaWQ7XG4gIGlmICghcmVwb3NpdG9yeUlkKSByZXR1cm47XG4gIGF3YWl0IG9jdG9raXQuZ3JhcGhxbChcbiAgICBgbXV0YXRpb24oJGlucHV0OiBVcGRhdGVSZXBvc2l0b3J5SW5wdXQhKSB7XG4gICAgICB1cGRhdGVSZXBvc2l0b3J5KGlucHV0OiAkaW5wdXQpIHsgcmVwb3NpdG9yeSB7IGlkIH0gfVxuICAgIH1gLFxuICAgIHsgaW5wdXQ6IHsgcmVwb3NpdG9yeUlkLCBoYXNEaXNjdXNzaW9uc0VuYWJsZWQ6IGZhbHNlIH0gfVxuICApO1xufVxuXG5mdW5jdGlvbiBpc0dpdEh1YlNldHRpbmdzRXJyb3IoZXJyb3I6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKGlzR2l0SHViUGVybWlzc2lvbk9yVmlzaWJpbGl0eUVycm9yKGVycm9yKSkgcmV0dXJuIHRydWU7XG4gIGlmICghZXJyb3IgfHwgdHlwZW9mIGVycm9yICE9PSAnb2JqZWN0JyB8fCAhKCdlcnJvcnMnIGluIGVycm9yKSB8fCAhQXJyYXkuaXNBcnJheShlcnJvci5lcnJvcnMpKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBlcnJvci5lcnJvcnMuc29tZShcbiAgICAoZ3JhcGhxbEVycm9yOiB1bmtub3duKSA9PlxuICAgICAgISFncmFwaHFsRXJyb3IgJiZcbiAgICAgIHR5cGVvZiBncmFwaHFsRXJyb3IgPT09ICdvYmplY3QnICYmXG4gICAgICAndHlwZScgaW4gZ3JhcGhxbEVycm9yICYmXG4gICAgICBbJ0ZPUkJJRERFTicsICdJTlNVRkZJQ0lFTlRfU0NPUEVTJywgJ05PVF9GT1VORCddLmluY2x1ZGVzKGdyYXBocWxFcnJvci50eXBlIGFzIHN0cmluZylcbiAgKTtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbi8vIFRoZSBgL3NyY2AgZW50cnkgKGEgZGVjbGFyZWQgZXhwb3J0KSBsZXRzIHRoaXMgd29ya3NwYWNlIGNvbnN1bWVyIHVzZSB0aGUgc291cmNlcyB3aXRob3V0XG4vLyBidWlsZGluZyBzaGFyZWQtbGliIGZpcnN0LCBhcyBldmVyeSBvdGhlciBpbXBvcnQgb2YgaXQgaW4gdGhpcyBwYWNrYWdlIGRvZXMuXG5pbXBvcnQge1xuICBCVUdfSVNTVUVfU0VDVElPTlMsXG4gIENIQU5HRV9JU1NVRV9TRUNUSU9OUyxcbiAgUFVMTF9SRVFVRVNUX1NFQ1RJT05TLFxuICByZW5kZXJTZWN0aW9uVGVtcGxhdGUsXG59IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliL3NyYyc7XG5cbmltcG9ydCB7IGdldERlZmF1bHRQcm9zZUxhbmd1YWdlIH0gZnJvbSAnLi4vZ2VuZXJhdG9ycy9hZ2VudHMuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBnZW5lcmF0ZVRlbXBsYXRlcyA9IChsYW5ndWFnZU5vdGU6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPT4gKHtcbiAgJ3B1bGxfcmVxdWVzdF90ZW1wbGF0ZS5tZCc6IGBcbkNsb3NlICM8SXNzdWVOdW1iZXI+XG5cbjwhLS0gV3JpdGUgZm9yIGEgcmV2aWV3ZXIgd2hvIGhhcyBub3QgZm9sbG93ZWQgdGhlIHdvcmsuJHtsYW5ndWFnZU5vdGV9IFNjYWxlIGVhY2ggc2VjdGlvbiB0byB0aGUgY2hhbmdlOiBhIHNlbnRlbmNlIGZvciBhIHNtYWxsIGNoYW5nZSwgbnVtYmVyZWQgc3Vic2VjdGlvbnMgZm9yIGEgbGFyZ2Ugb25lLiBEZWxldGUgdGhpcyBjb21tZW50IGFuZCB0aGUgcGxhY2Vob2xkZXIgY29tbWVudHMgYmVsb3cuIC0tPlxuXG4ke3JlbmRlclNlY3Rpb25UZW1wbGF0ZShQVUxMX1JFUVVFU1RfU0VDVElPTlMpfVxuYC50cmltKCksXG4gICdJU1NVRV9URU1QTEFURS9idWcubWQnOiBgXG4tLS1cbm5hbWU6IEJ1ZyAvIFByb2JsZW1cbmFib3V0OiBTb21ldGhpbmcgYmVoYXZlcyB3cm9uZ2x5XG50aXRsZTogJ2ZpeDogJ1xubGFiZWxzOiAndDogZml4IDpidWc6J1xuLS0tXG5cbjwhLS0gS2VlcCBQcm9ibGVtIGFuZCBQcm9wb3NhbDsgZGVsZXRlIEV2aWRlbmNlIG9yIEltcGFjdCB3aGVuIHRoZXkgYWRkIG5vdGhpbmcuJHtsYW5ndWFnZU5vdGV9IERlbGV0ZSB0aGVzZSBjb21tZW50cy4gLS0+XG5cbiR7cmVuZGVyU2VjdGlvblRlbXBsYXRlKEJVR19JU1NVRV9TRUNUSU9OUyl9XG5gLnRyaW0oKSxcbiAgJ0lTU1VFX1RFTVBMQVRFL2NoYW5nZS5tZCc6IGBcbi0tLVxubmFtZTogQ2hhbmdlIC8gRmVhdHVyZVxuYWJvdXQ6IFByb3Bvc2UgYSBjaGFuZ2UgdGhhdCBhIHRoaXJkIHBhcnR5IGNvdWxkIGltcGxlbWVudCB3aXRob3V0IGFza2luZyBhIHF1ZXN0aW9uXG50aXRsZTogJ2ZlYXQ6ICdcbmxhYmVsczogJ3Q6IGZlYXQgOnNwYXJrbGVzOidcbi0tLVxuXG48IS0tIEtlZXAgdGhlIGZpcnN0IHRocmVlIHNlY3Rpb25zIGZvciBhbnkgY2hhbmdlIGFuZCBhZGQgdGhlIG90aGVycyBhcyB0aGUgY2hhbmdlIGdyb3dzOyBhIGxhcmdlIGNoYW5nZSBmaWxscyBhbGwgb2YgdGhlbSAoc3BlYy1ib29zdGVyIHJldmlld3MgYWdhaW5zdCB0aGlzIGxpc3QpLiR7bGFuZ3VhZ2VOb3RlfSBEZWxldGUgdGhlc2UgY29tbWVudHMuIC0tPlxuXG4ke3JlbmRlclNlY3Rpb25UZW1wbGF0ZShDSEFOR0VfSVNTVUVfU0VDVElPTlMpfVxuYC50cmltKCksXG4gICdJU1NVRV9URU1QTEFURS9jb25maWcueW1sJzogJ2JsYW5rX2lzc3Vlc19lbmFibGVkOiB0cnVlJyxcbn0pO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gVGVtcGxhdGVzIGFyZSByZXBvc2l0b3J5LWxldmVsIGZpbGVzLCBzbyBhIGRpcmVjdCB3b3Jrc3BhY2UtY2hpbGQgaW52b2NhdGlvbiBtdXN0IG5vdCBjcmVhdGUgdGhlbS5cbiAgICBpZiAoIWNvbmZpZy5pc1dpbGxCb29zdGVyUmVwbyB8fCAhY29uZmlnLmlzUm9vdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGxhbmd1YWdlTm90ZSA9XG4gICAgICBnZXREZWZhdWx0UHJvc2VMYW5ndWFnZShjb25maWcpID09PSAnSmFwYW5lc2UnID8gJyBXcml0ZSBpbiBKYXBhbmVzZSwga2VlcGluZyB0aGUgaGVhZGluZ3MgYXMgdGhleSBhcmUuJyA6ICcnO1xuICAgIGZvciAoY29uc3QgW2ZpbGVOYW1lLCBjb250ZW50XSBvZiBPYmplY3QuZW50cmllcyhnZW5lcmF0ZVRlbXBsYXRlcyhsYW5ndWFnZU5vdGUpKSkge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aHViJywgZmlsZU5hbWUpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQpKTtcbiAgICB9XG4gIH0pO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmNvbnN0IGRlcGVuZGVuY3lTZWN0aW9uS2V5cyA9IFsnZGVwZW5kZW5jaWVzJywgJ2RldkRlcGVuZGVuY2llcycsICdvcHRpb25hbERlcGVuZGVuY2llcycsICdwZWVyRGVwZW5kZW5jaWVzJ10gYXMgY29uc3Q7XG5jb25zdCBhbGxvd2VkR2l0SHViT3JnYW5pemF0aW9uUGF0dGVybiA9IFN0cmluZy5yYXdgKD86V2lsbEJvb3N0ZXJ8V2lsbEJvb3N0ZXJMYWIpYDtcbmNvbnN0IGFsbG93ZWRHaXREZXBlbmRlbmN5UGF0dGVybnMgPSBbXG4gIG5ldyBSZWdFeHAoYF4ke2FsbG93ZWRHaXRIdWJPcmdhbml6YXRpb25QYXR0ZXJufS9bXiNcXFxcc10rKD86I1xcXFxTKyk/JGAsICd1JyksXG4gIG5ldyBSZWdFeHAoYF5naXRodWI6JHthbGxvd2VkR2l0SHViT3JnYW5pemF0aW9uUGF0dGVybn0vW14jXFxcXHNdKyg/OiNcXFxcUyspPyRgLCAndScpLFxuICBuZXcgUmVnRXhwKFxuICAgIGBeKD86Z2l0XFxcXCspP2h0dHBzOi8vZ2l0aHViXFxcXC5jb20vJHthbGxvd2VkR2l0SHViT3JnYW5pemF0aW9uUGF0dGVybn0vW14jXFxcXHNdKyg/OlxcXFwuZ2l0KT8oPzojXFxcXFMrKT8kYCxcbiAgICAndSdcbiAgKSxcbiAgbmV3IFJlZ0V4cChcbiAgICBgXig/OmdpdFxcXFwrKT9zc2g6Ly9naXRAZ2l0aHViXFxcXC5jb21bOi9dJHthbGxvd2VkR2l0SHViT3JnYW5pemF0aW9uUGF0dGVybn0vW14jXFxcXHNdKyg/OlxcXFwuZ2l0KT8oPzojXFxcXFMrKT8kYCxcbiAgICAndSdcbiAgKSxcbiAgbmV3IFJlZ0V4cChgXig/OmdpdFxcXFwrKT9naXRAZ2l0aHViXFxcXC5jb206JHthbGxvd2VkR2l0SHViT3JnYW5pemF0aW9uUGF0dGVybn0vW14jXFxcXHNdKyg/OlxcXFwuZ2l0KT8oPzojXFxcXFMrKT8kYCwgJ3UnKSxcbl07XG5cbmludGVyZmFjZSBEaXNhbGxvd2VkRGVwZW5kZW5jeVNvdXJjZSB7XG4gIGRlcGVuZGVuY3lOYW1lOiBzdHJpbmc7XG4gIGRpclBhdGg6IHN0cmluZztcbiAgc2VjdGlvbk5hbWU6ICh0eXBlb2YgZGVwZW5kZW5jeVNlY3Rpb25LZXlzKVtudW1iZXJdO1xuICBzcGVjaWZpZXI6IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFNhZmVEZXBlbmRlbmN5U291cmNlcyhjb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiB2b2lkIHtcbiAgY29uc3QgZGlzYWxsb3dlZFNvdXJjZXMgPSBjb25maWdzLmZsYXRNYXAoZ2V0RGlzYWxsb3dlZERlcGVuZGVuY3lTb3VyY2VzKTtcbiAgaWYgKGRpc2FsbG93ZWRTb3VyY2VzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gIGNvbnN0IGRldGFpbHMgPSBkaXNhbGxvd2VkU291cmNlc1xuICAgIC5tYXAoXG4gICAgICAoeyBkZXBlbmRlbmN5TmFtZSwgZGlyUGF0aCwgc2VjdGlvbk5hbWUsIHNwZWNpZmllciB9KSA9PlxuICAgICAgICBgLSAke3BhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJyl9OiAke3NlY3Rpb25OYW1lfS4ke2RlcGVuZGVuY3lOYW1lfSB1c2VzICR7c3BlY2lmaWVyfWBcbiAgICApXG4gICAgLmpvaW4oJ1xcbicpO1xuXG4gIHRocm93IG5ldyBFcnJvcihcbiAgICBgRGlzYWxsb3dlZCBHaXQgZGVwZW5kZW5jeSBzb3VyY2VzIGZvdW5kLlxcbk9ubHkgV2lsbEJvb3N0ZXIgYW5kIFdpbGxCb29zdGVyTGFiIEdpdEh1YiBkZXBlbmRlbmNpZXMgYXJlIGFsbG93ZWQuXFxuJHtkZXRhaWxzfWBcbiAgKTtcbn1cblxuZnVuY3Rpb24gZ2V0RGlzYWxsb3dlZERlcGVuZGVuY3lTb3VyY2VzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IERpc2FsbG93ZWREZXBlbmRlbmN5U291cmNlW10ge1xuICBjb25zdCBwYWNrYWdlSnNvbiA9IGNvbmZpZy5wYWNrYWdlSnNvbjtcbiAgaWYgKCFwYWNrYWdlSnNvbikgcmV0dXJuIFtdO1xuXG4gIGNvbnN0IGRpc2FsbG93ZWRTb3VyY2VzOiBEaXNhbGxvd2VkRGVwZW5kZW5jeVNvdXJjZVtdID0gW107XG4gIGZvciAoY29uc3Qgc2VjdGlvbk5hbWUgb2YgZGVwZW5kZW5jeVNlY3Rpb25LZXlzKSB7XG4gICAgY29uc3Qgc2VjdGlvbiA9IHBhY2thZ2VKc29uW3NlY3Rpb25OYW1lXTtcbiAgICBpZiAoIXNlY3Rpb24pIGNvbnRpbnVlO1xuXG4gICAgZm9yIChjb25zdCBbZGVwZW5kZW5jeU5hbWUsIHNwZWNpZmllcl0gb2YgT2JqZWN0LmVudHJpZXMoc2VjdGlvbikpIHtcbiAgICAgIGlmICghc3BlY2lmaWVyKSBjb250aW51ZTtcbiAgICAgIGlmICghaXNHaXREZXBlbmRlbmN5U3BlY2lmaWVyKHNwZWNpZmllcikpIGNvbnRpbnVlO1xuICAgICAgaWYgKGlzQWxsb3dlZEdpdERlcGVuZGVuY3lTcGVjaWZpZXIoc3BlY2lmaWVyKSkgY29udGludWU7XG5cbiAgICAgIGRpc2FsbG93ZWRTb3VyY2VzLnB1c2goe1xuICAgICAgICBkZXBlbmRlbmN5TmFtZSxcbiAgICAgICAgZGlyUGF0aDogY29uZmlnLmRpclBhdGgsXG4gICAgICAgIHNlY3Rpb25OYW1lLFxuICAgICAgICBzcGVjaWZpZXIsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRpc2FsbG93ZWRTb3VyY2VzO1xufVxuXG5mdW5jdGlvbiBpc0dpdERlcGVuZGVuY3lTcGVjaWZpZXIoc3BlY2lmaWVyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBpc0dpdEh1YlNob3J0aGFuZFNwZWNpZmllcihzcGVjaWZpZXIpIHx8XG4gICAgL14oPzpiaXRidWNrZXR8Z2lzdHxnaXRodWJ8Z2l0bGFiKTovdS50ZXN0KHNwZWNpZmllcikgfHxcbiAgICAvXmh0dHBzPzpcXC9cXC8oPzpiaXRidWNrZXRcXC5vcmd8Z2l0aHViXFwuY29tfGdpdGxhYlxcLmNvbSlcXC8vdS50ZXN0KHNwZWNpZmllcikgfHxcbiAgICAvXig/Omh0dHBzP3xzc2gpOlxcL1xcL1xcUytcXC5naXQoPzojXFxTKyk/JC91LnRlc3Qoc3BlY2lmaWVyKSB8fFxuICAgIC9eW15AXFxzXStAW146XFxzXSs6XFxTKyg/OiNcXFMrKT8kL3UudGVzdChzcGVjaWZpZXIpIHx8XG4gICAgc3BlY2lmaWVyLnN0YXJ0c1dpdGgoJ2dpdDonKSB8fFxuICAgIHNwZWNpZmllci5zdGFydHNXaXRoKCdnaXQrJykgfHxcbiAgICBzcGVjaWZpZXIuc3RhcnRzV2l0aCgnc3NoOi8vZ2l0QCcpXG4gICk7XG59XG5cbmZ1bmN0aW9uIGlzR2l0SHViU2hvcnRoYW5kU3BlY2lmaWVyKHNwZWNpZmllcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAvXlthLXpBLVowLTldW1xcdy4tXSpcXC9bXFx3Li1dKyg/OiNcXFMrKT8kL3UudGVzdChzcGVjaWZpZXIpO1xufVxuXG5mdW5jdGlvbiBpc0FsbG93ZWRHaXREZXBlbmRlbmN5U3BlY2lmaWVyKHNwZWNpZmllcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBhbGxvd2VkR2l0RGVwZW5kZW5jeVBhdHRlcm5zLnNvbWUoKHBhdHRlcm4pID0+IHBhdHRlcm4udGVzdChzcGVjaWZpZXIpKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGlnbm9yZUVycm9yLCBpZ25vcmVFcnJvckFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWIvc3JjJztcbmltcG9ydCB7IG5vcm1hbGl6ZUJ1bkxvY2tmaWxlIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHlhcmdzIGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZml4TmV4dENvbmZpZ0pzb24gfSBmcm9tICcuL2ZpeGVycy9uZXh0Q29uZmlnLmpzJztcbmltcG9ydCB7IGZpeENoYWtyYVRvYXN0ZXIgfSBmcm9tICcuL2ZpeGVycy9jaGFrcmFUb2FzdGVyLmpzJztcbmltcG9ydCB7IGZpeFBsYXl3cmlnaHRDb25maWcgfSBmcm9tICcuL2ZpeGVycy9wbGF5d3JpZ2h0Q29uZmlnLmpzJztcbmltcG9ydCB7IGZpeFR5cG9zIH0gZnJvbSAnLi9maXhlcnMvdHlwb3MuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9hZ2VudHMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVCdW5maWdUb21sLCByZWFkQnVuR2xvYmFsU3RvcmUsIHJlc29sdmVCdW5HbG9iYWxTdG9yZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9idW5maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVEb2NrZXJpZ25vcmUgfSBmcm9tICcuL2dlbmVyYXRvcnMvZG9ja2VyaWdub3JlLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlRWRpdG9yY29uZmlnIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2VkaXRvcmNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUZub3hUb21sIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2Zub3hUb21sLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2VtaW5pQ29uZmlnIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dlbWluaUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMsIHJlbm9ybWFsaXplVHJhY2tlZFRleHRGaWxlcyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9naXRhdHRyaWJ1dGVzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2l0aWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dpdGlnbm9yZS5qcyc7XG5pbXBvcnQgeyBlbnN1cmVHbG9iYWxSZWxlYXNlQWdlR2F0ZXMgfSBmcm9tICcuL2dlbmVyYXRvcnMvZ2xvYmFsUmVsZWFzZUFnZUdhdGUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVJZGVhU2V0dGluZ3MgfSBmcm9tICcuL2dlbmVyYXRvcnMvaWRlYS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUxlZnRob29rIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2xlZnRob29rLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUGFja2FnZUpzb24sIGdldFdvcmtzcGFjZVBhY2thZ2VEaXJzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3BhY2thZ2VKc29uLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlT3hmbXRDb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvb3hmbXRDb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVPeGxpbnRDb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvb3hsaW50Q29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUHJldHRpZXJpZ25vcmUgfSBmcm9tICcuL2dlbmVyYXRvcnMvcHJldHRpZXJpZ25vcmUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9weXJpZ2h0Q29uZmlnLmpzJztcbmltcG9ydCB7IGZpeFJhaWx3YXlpZ25vcmUgfSBmcm9tICcuL2dlbmVyYXRvcnMvcmFpbHdheWlnbm9yZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJlYWRtZSwgcmVhZEFwcGxpZWRXYmZ5VmVyc2lvbkxhYmVsIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3JlYWRtZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJlbGVhc2VyYyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9yZWxlYXNlcmMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVSZW5vdmF0ZUpzb25jIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3Jlbm92YXRlSnNvbmMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVUc2NvbmZpZyB9IGZyb20gJy4vZ2VuZXJhdG9ycy90c2NvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVVzZXJBZ2VudENvbmZpZ3MgfSBmcm9tICcuL2dlbmVyYXRvcnMvdXNlckFnZW50Q29uZmlncy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVZzY29kZVNldHRpbmdzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3ZzY29kZVNldHRpbmdzLmpzJztcbmltcG9ydCB7IGVuc3VyZVdiRW52RGVmaW5pdGlvbnMgfSBmcm9tICcuL2dlbmVyYXRvcnMvd2JFbnYuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVTZWxmQ29udGFpbmVkV29ya2Zsb3dzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3NlbGZDb250YWluZWRXb3JrZmxvdy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVdvcmtmbG93cywgaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8gfSBmcm9tICcuL2dlbmVyYXRvcnMvd29ya2Zsb3cuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVNaXNlVG9tbCwgbWluaW11bUJ1blZlcnNpb24gfSBmcm9tICcuL2dlbmVyYXRvcnMvbWlzZVRvbWwuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVSZXBvc2l0b3J5TnBtcmMgfSBmcm9tICcuL2dlbmVyYXRvcnMvbnBtcmMuanMnO1xuaW1wb3J0IHsgc2V0dXBMYWJlbHMgfSBmcm9tICcuL2dpdGh1Yi9sYWJlbC5qcyc7XG5pbXBvcnQgeyBzZXR1cFJlcG9zaXRvcnlSdWxlc2V0cyB9IGZyb20gJy4vZ2l0aHViL3J1bGVzZXQuanMnO1xuaW1wb3J0IHsgc2V0dXBHaXRIdWJTZXR0aW5ncyB9IGZyb20gJy4vZ2l0aHViL3NldHRpbmdzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2l0SHViVGVtcGxhdGVzIH0gZnJvbSAnLi9naXRodWIvdGVtcGxhdGUuanMnO1xuaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2V0UGFja2FnZUNvbmZpZywgZ2V0V29ya2VyVHlwZXNTY3JpcHRFcnJvciB9IGZyb20gJy4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBhc3NlcnRTYWZlRGVwZW5kZW5jeVNvdXJjZXMgfSBmcm9tICcuL3V0aWxzL2RlcGVuZGVuY3lTb3VyY2VQb2xpY3kuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgZG9lc0NvbnRhaW5KYXZhLCBkb2VzQ29udGFpbkpzT3JUcyB9IGZyb20gJy4vdXRpbHMvcGFja2FnZUNhcGFiaWxpdGllcy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jLCBzcGF3blN5bmNBbmRSZXR1cm5TdGF0dXMsIHNwYXduU3luY0FuZFJldHVyblN0ZG91dCB9IGZyb20gJy4vdXRpbHMvc3Bhd25VdGlsLmpzJztcbmltcG9ydCB7IGRpc3Bvc2VUeXBlU2NyaXB0QXBpIH0gZnJvbSAnLi91dGlscy90eXBlc2NyaXB0QXBpLmpzJztcbmltcG9ydCB7IGdldFdiZnlWZXJzaW9uLCBnZXRXYmZ5VmVyc2lvbkxhYmVsIH0gZnJvbSAnLi91dGlscy92ZXJzaW9uLmpzJztcbmltcG9ydCB7IGdldFdvcmtzcGFjZVN1YkRpclBhdGhzIH0gZnJvbSAnLi91dGlscy93b3Jrc3BhY2VVdGlsLmpzJztcblxuLyoqXG4gKiBBcHBsaWVzIG9ubHkgdGhlIGdsb2JhbCByZWxlYXNlLWFnZSBnYXRlLCB3aXRob3V0IHRvdWNoaW5nIGFueSByZXBvc2l0b3J5LiBTcGVsbGVkIG91dCBpbiBmdWxsXG4gKiByYXRoZXIgdGhhbiBzaG9ydGVuZWQgKGUuZy4gYGdhdGVgKSBiZWNhdXNlIHRoZSBkZWZhdWx0IGNvbW1hbmQgdGFrZXMgcG9zaXRpb25hbCBwYXRoczogYSBzaG9ydFxuICogbmFtZSB3b3VsZCBzd2FsbG93IGEgZGlyZWN0b3J5IHRoYXQgaGFwcGVucyB0byBzaGFyZSBpdC5cbiAqL1xuY29uc3QgYXBwbHlSZWxlYXNlQWdlR2F0ZUNvbW1hbmQgPSAnYXBwbHktcmVsZWFzZS1hZ2UtZ2F0ZSc7XG4vKiogU2FtZSBuYW1pbmcgcmF0aW9uYWxlIGFzIGFwcGx5UmVsZWFzZUFnZUdhdGVDb21tYW5kLiAqL1xuY29uc3QgZ2VuZXJhdGVVc2VyQWdlbnRDb25maWdzQ29tbWFuZCA9ICdnZW5lcmF0ZS11c2VyLWFnZW50LWNvbmZpZ3MnO1xuXG5hc3luYyBmdW5jdGlvbiBtYWluKCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBhcmd2ID0gYXdhaXQgeWFyZ3MocHJvY2Vzcy5hcmd2LnNsaWNlKDIpKVxuICAgIC5jb21tYW5kKFxuICAgICAgYXBwbHlSZWxlYXNlQWdlR2F0ZUNvbW1hbmQsXG4gICAgICBcIkFwcGx5IG9ubHkgdGhlIG9yZ2FuaXphdGlvbidzIG1pbmltdW0tcmVsZWFzZS1hZ2UgcG9saWN5IHRvIHRoaXMgbWFjaGluZSdzIGdsb2JhbCBwYWNrYWdlLW1hbmFnZXIgY29uZmlnc1wiXG4gICAgKVxuICAgIC5jb21tYW5kKFxuICAgICAgZ2VuZXJhdGVVc2VyQWdlbnRDb25maWdzQ29tbWFuZCxcbiAgICAgIFwiT3ZlcndyaXRlIHRoaXMgdXNlcidzIGFnZW50IGluc3RydWN0aW9uIGZpbGVzICh+Ly5jb2RleC9BR0VOVFMubWQsIH4vLmNsYXVkZS9DTEFVREUubWQsIH4vLmdlbWluaS9HRU1JTkkubWQpIHdpdGggdGhlIG9yZ2FuaXphdGlvbidzIGZpeGVkIGNvbnRlbnQgYW5kIG1lcmdlIHRoZSBvcmdhbml6YXRpb24ncyBzZXR0aW5ncyBpbnRvIH4vLmNsYXVkZS9zZXR0aW5ncy5qc29uIGFuZCB+Ly5nZW1pbmkvc2V0dGluZ3MuanNvblwiXG4gICAgKVxuICAgIC5jb21tYW5kKCckMCBbcGF0aHMuLl0nLCAnTWFrZSBhIGdpdmVuIHByb2plY3QgZm9sbG93IHRoZSBXaWxsQm9vc3RlciBzdGFuZGFyZCcsICh5YXJncykgPT4ge1xuICAgICAgeWFyZ3MucG9zaXRpb25hbCgncGF0aHMnLCB7XG4gICAgICAgIGRlc2NyaWJlOiAncHJvamVjdCBwYXRocyB0byBiZSB3YmZpZWQnLFxuICAgICAgICBhcnJheTogdHJ1ZSxcbiAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgIGRlZmF1bHQ6IFsnLiddLFxuICAgICAgfSk7XG4gICAgfSlcbiAgICAub3B0aW9ucyh7XG4gICAgICBmb3JjZToge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ0FwcGx5IHdiZnkgZXZlbiB3aGVuIHRoZSByZXBvc2l0b3J5IGFscmVhZHkgcmVjb3JkcyB0aGlzIHdiZnkgdmVyc2lvbicsXG4gICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgIGFsaWFzOiAnZicsXG4gICAgICB9LFxuICAgICAgc2tpcERlcHM6IHtcbiAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgJ1NraXAgYWRkaW5nIG1hbmFnZWQgZGVwZW5kZW5jaWVzIGFuZCB0aGUgbGlua2VyIHByb2JlICh0aGUgZmluYWwgYGJ1biBpbnN0YWxsYCByZWZyZXNoaW5nIHRoZSBsb2NrZmlsZSBzdGlsbCBydW5zKScsXG4gICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgIGFsaWFzOiAnZCcsXG4gICAgICB9LFxuICAgICAgdmVyYm9zZToge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgb3Igbm90IHRvIGVuYWJsZSB2ZXJib3NlIG1vZGUnLFxuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICBhbGlhczogJ3YnLFxuICAgICAgfSxcbiAgICB9KVxuICAgIC52ZXJzaW9uKGdldFdiZnlWZXJzaW9uKCkpXG4gICAgLnN0cmljdCgpLmFyZ3Y7XG4gIG9wdGlvbnMuaXNWZXJib3NlID0gYXJndi52ZXJib3NlO1xuXG4gIC8vIERlbGliZXJhdGVseSBiZWZvcmUgdGhlIEJ1biBjaGVjayBpbiB3aWxsYm9vc3RlcmlmeVBhdGhzKCk6IHRoZSBnYXRlIG11c3QgYmUgYXBwbGlhYmxlIG9uIGFcbiAgLy8gbWFjaGluZSB3aG9zZSBCdW4gaXMgb3V0ZGF0ZWQsIHdoaWNoIGlzIGV4YWN0bHkgYSBtYWNoaW5lIHRoYXQgc3RpbGwgbmVlZHMgZ2F0aW5nLlxuICBpZiAoYXJndi5fWzBdID09PSBhcHBseVJlbGVhc2VBZ2VHYXRlQ29tbWFuZCkge1xuICAgIGlmICghZW5zdXJlR2xvYmFsUmVsZWFzZUFnZUdhdGVzKCkpIHByb2Nlc3MuZXhpdENvZGUgPSAxO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoYXJndi5fWzBdID09PSBnZW5lcmF0ZVVzZXJBZ2VudENvbmZpZ3NDb21tYW5kKSB7XG4gICAgaWYgKCEoYXdhaXQgZ2VuZXJhdGVVc2VyQWdlbnRDb25maWdzKCkpKSBwcm9jZXNzLmV4aXRDb2RlID0gMTtcbiAgICByZXR1cm47XG4gIH1cblxuICBsZXQgaGFzSW52YWxpZFBhY2thZ2VDb25maWcgPSBmYWxzZTtcbiAgdHJ5IHtcbiAgICBoYXNJbnZhbGlkUGFja2FnZUNvbmZpZyA9IGF3YWl0IHdpbGxib29zdGVyaWZ5UGF0aHMoYXJndi5wYXRocyBhcyBzdHJpbmdbXSwgYXJndi5za2lwRGVwcywgYXJndi5mb3JjZSk7XG4gIH0gZmluYWxseSB7XG4gICAgLy8gVGhlIFR5cGVTY3JpcHQgY29tcGlsZXIgc2VydmVyIHNwYXduZWQgZm9yIEFTVCBwYXJzaW5nIGtlZXBzIGFuIG9wZW4gSVBDXG4gICAgLy8gY2hhbm5lbCB0aGF0IHdvdWxkIG90aGVyd2lzZSBwcmV2ZW50IHRoZSBOb2RlLmpzIHByb2Nlc3MgZnJvbSBleGl0aW5nLlxuICAgIGF3YWl0IGRpc3Bvc2VUeXBlU2NyaXB0QXBpKCk7XG4gIH1cbiAgaWYgKGhhc0ludmFsaWRQYWNrYWdlQ29uZmlnKSB7XG4gICAgcHJvY2Vzcy5leGl0Q29kZSA9IDE7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gd2lsbGJvb3N0ZXJpZnlQYXRocyhwYXRoczogc3RyaW5nW10sIHNraXBEZXBzOiBib29sZWFuLCBmb3JjZTogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAvLyBCZWZvcmUgYW55dGhpbmcgZWxzZSDigJQgZXZlbiB0aGUgQnVuIGNoZWNrIGJlbG93OiB0aGUgZGV2ZWxvcGVyIG1hY2hpbmUncyBnbG9iYWxcbiAgLy8gcGFja2FnZS1tYW5hZ2VyIGNvbmZpZ3MgbXVzdCByZWNlaXZlIHRoZSBvcmcncyBtaW5pbXVtLXJlbGVhc2UtYWdlIHBvbGljeSBvbiBFVkVSWSBydW4sXG4gIC8vIGJlY2F1c2UgdGhleSBhcmUgd2hhdCBndWFyZHMgYnJhbmQtbmV3IGxvY2FsIHByb2plY3RzIHRoYXQgaGF2ZSBubyB3YmZ5LWdlbmVyYXRlZCByZXBvc2l0b3J5XG4gIC8vIGNvbmZpZyB5ZXQsIGFuZCB0aGF0IHByb3RlY3Rpb24gbXVzdCB3b3JrIGJlZm9yZSB0aGUgc3VwcG9ydGVkLXZlcnNpb24gY2hlY2suXG4gIGVuc3VyZUdsb2JhbFJlbGVhc2VBZ2VHYXRlcygpO1xuXG4gIC8vIHdiZnkgbWFuYWdlcyByZXBvc2l0b3JpZXMgdGhyb3VnaCBCdW4gKyBtaXNlIGFuZCB1c2VzIEJ1biAxLjQgcnVudGltZSBBUElzLiBUaGUgdmVyc2lvbiBmbG9vclxuICAvLyBhbHNvIGVuc3VyZXMgdGhlIGdlbmVyYXRlZCBidW5maWcudG9tbCBvcHRpb25zIHByb2R1Y2UgdGhlIGluc3RhbGwgbGF5b3V0IHdiZnkgdmFsaWRhdGVzLiBJdFxuICAvLyBzdGF5cyB1bmNvbmRpdGlvbmFsIGV2ZW4gdGhvdWdoIHRoZSBhbHJlYWR5LWFwcGxpZWQgY2hlY2sgYmVsb3cgY2FuIG1ha2UgYSBydW4gYSBuby1vcDogYW5cbiAgLy8gb3V0ZGF0ZWQgQnVuIGlzIGEgYnJva2VuIGVudmlyb25tZW50IHdiZnkgbXVzdCByZXBvcnQsIGFuZCBoaWRpbmcgaXQgd2hlbmV2ZXIgZXZlcnkgcGF0aFxuICAvLyBoYXBwZW5zIHRvIGJlIHNraXBwZWQgd291bGQgc3VyZmFjZSBpdCBvbmx5IGxhdGVyLlxuICBjb25zdCBidW5WZXJzaW9uID0gQnVuLnZlcnNpb247XG4gIGlmIChCdW4uc2VtdmVyLm9yZGVyKGJ1blZlcnNpb24sIG1pbmltdW1CdW5WZXJzaW9uKSA8IDApIHtcbiAgICBjb25zb2xlLmVycm9yKGB3YmZ5IHJlcXVpcmVzIEJ1biA+PSAke21pbmltdW1CdW5WZXJzaW9ufSAoZm91bmQgJHtidW5WZXJzaW9ufSkuIFVwZ3JhZGUgQnVuIGFuZCByZS1ydW4uYCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBBIGAtZGlydHktbG9jYWxgIGxhYmVsIGlkZW50aWZpZXMgYW4gZWRpdGVkIGNoZWNrb3V0LCB3aG9zZSBuZXh0IGJ1aWxkIHByb2R1Y2VzIGRpZmZlcmVudCBmaWxlc1xuICAvLyB1bmRlciB0aGUgc2FtZSBsYWJlbCwgc28gc3VjaCBhIHJ1biBpcyBuZXZlciB0cmVhdGVkIGFzIGFscmVhZHkgYXBwbGllZC5cbiAgY29uc3QgdmVyc2lvbkxhYmVsID0gZ2V0V2JmeVZlcnNpb25MYWJlbCgpO1xuICBjb25zdCBza2lwcGFibGVWZXJzaW9uTGFiZWwgPVxuICAgICFmb3JjZSAmJiB2ZXJzaW9uTGFiZWwgJiYgIXZlcnNpb25MYWJlbC5lbmRzV2l0aCgnLWRpcnR5LWxvY2FsJykgPyB2ZXJzaW9uTGFiZWwgOiB1bmRlZmluZWQ7XG5cbiAgbGV0IGhhc0ludmFsaWRQYWNrYWdlQ29uZmlnID0gZmFsc2U7XG4gIGZvciAoY29uc3QgaW5wdXREaXJQYXRoIG9mIHBhdGhzKSB7XG4gICAgLy8gTm9ybWFsaXplIG9uY2UgYXQgdGhlIENMSSBib3VuZGFyeS4gR2VuZXJhdG9ycyB1c2UgZGlyUGF0aCBmb3IgY3dkIGFuZCBiYXNlbmFtZSBkZWNpc2lvbnM7XG4gICAgLy8gbGVhdmluZyB0aGUgc3VwcG9ydGVkIGRlZmF1bHQgYC5gIHVucmVzb2x2ZWQgd291bGQgZ2VuZXJhdGUgYW4gaW52YWxpZCBwYWNrYWdlIG5hbWUgb2YgYC5gLlxuICAgIGNvbnN0IHJvb3REaXJQYXRoID0gcGF0aC5yZXNvbHZlKGlucHV0RGlyUGF0aCk7XG4gICAgLy8gQ29uZmluZSBldmVyeSBnZW5lcmF0ZWQgZmlsZSB0byB0aGlzIHJlcG9zaXRvcnkgKHNlZSBmc1V0aWwuZ2VuZXJhdGVGaWxlKS4gU2V0IEJFRk9SRSBhbnlcbiAgICAvLyBmaXhlciB3cml0ZXMsIGFuZCByZXNldCBvbiBldmVyeSBpdGVyYXRpb24gc28gYSBtdWx0aS1wYXRoIHJ1biBuZXZlciBrZWVwcyB0aGUgcHJldmlvdXMgcm9vdC5cbiAgICBmc1V0aWwuc2V0Um9vdERpclBhdGgoZnMuZXhpc3RzU3luYyhyb290RGlyUGF0aCkgPyByb290RGlyUGF0aCA6IHVuZGVmaW5lZCk7XG5cbiAgICAvLyBUaGUgYmFkZ2UgcmVjb3JkcyB0aGUgYnVpbGQgdGhhdCBnZW5lcmF0ZWQgdGhlIHJlcG9zaXRvcnkncyBjb25maWd1cmF0aW9uLCBzbyB0aGUgc2FtZSBidWlsZFxuICAgIC8vIHdvdWxkIG9ubHkgcmV3cml0ZSB3aGF0IGlzIGFscmVhZHkgdGhlcmUuIFNraXBwaW5nIGlzIGEgZGVsaWJlcmF0ZSB0cmFkZTogdGhlIHBhcnRzIG9mIGEgcnVuXG4gICAgLy8gdGhhdCBkZXBlbmQgb24gc3RhdGUgT1VUU0lERSB0aGUgcmVwb3NpdG9yeSAoR2l0SHViIHNldHRpbmdzLCBkZXBlbmRlbmN5IHVwZGF0ZXMsIHRoZSBmZXRjaGVkXG4gICAgLy8gLmdpdGlnbm9yZSkgZG8gZ2V0IHNraXBwZWQgdG9vLCB3aGljaCBpcyB3aGF0IC0tZm9yY2UgaXMgZm9yLlxuICAgIGlmIChza2lwcGFibGVWZXJzaW9uTGFiZWwgJiYgKGF3YWl0IHJlYWRBcHBsaWVkV2JmeVZlcnNpb25MYWJlbChyb290RGlyUGF0aCkpID09PSBza2lwcGFibGVWZXJzaW9uTGFiZWwpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgU2tpcCAke3Jvb3REaXJQYXRofTogd2JmeSAke3NraXBwYWJsZVZlcnNpb25MYWJlbH0gaXMgYWxyZWFkeSBhcHBsaWVkLiBQYXNzIC0tZm9yY2UgdG8gcmUtYXBwbHkuYCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgcGFja2FnZXNEaXJQYXRoID0gcGF0aC5qb2luKHJvb3REaXJQYXRoLCAncGFja2FnZXMnKTtcbiAgICBjb25zdCBkaXJlbnRzID0gKGF3YWl0IGlnbm9yZUVycm9yQXN5bmMoKCkgPT4gZnMucHJvbWlzZXMucmVhZGRpcihwYWNrYWdlc0RpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KSkpID8/IFtdO1xuICAgIGNvbnN0IHBhY2thZ2VzU3ViRGlyUGF0aHMgPSBkaXJlbnRzXG4gICAgICAuZmlsdGVyKChkKSA9PiBkLmlzRGlyZWN0b3J5KCkpXG4gICAgICAubWFwKChkKSA9PiBwYXRoLnJlc29sdmUocGFja2FnZXNEaXJQYXRoLCBkLm5hbWUpKTtcbiAgICAvLyBBbHNvIGNvdmVyIHdvcmtzcGFjZXMgZGVjbGFyZWQgb3V0c2lkZSBwYWNrYWdlcy8qIChlLmcuIGFwcHMvKik6IHRoZXkgcmVjZWl2ZSB0aGUgc2FtZVxuICAgIC8vIG1hbmFnZWQgY29uZmlncyAodHNjb25maWcuanNvbiwgcGFja2FnZS5qc29uIGNvbnZlbnRpb25zLCDigKYpIGFzIHBhY2thZ2VzLyogY2hpbGRyZW4uXG4gICAgY29uc3Qgcm9vdFBhY2thZ2VKc29uID1cbiAgICAgIGlnbm9yZUVycm9yKFxuICAgICAgICAoKSA9PlxuICAgICAgICAgIEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhdGgucmVzb2x2ZShyb290RGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpKSBhcyBQYWNrYWdlQ29uZmlnWydwYWNrYWdlSnNvbiddXG4gICAgICApID8/IHt9O1xuICAgIGNvbnN0IHdvcmtzcGFjZVN1YkRpclBhdGhzID0gZ2V0V29ya3NwYWNlU3ViRGlyUGF0aHMoe1xuICAgICAgZGlyUGF0aDogcm9vdERpclBhdGgsXG4gICAgICBwYWNrYWdlSnNvbjogcm9vdFBhY2thZ2VKc29uLFxuICAgICAgZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnM6IHBhY2thZ2VzU3ViRGlyUGF0aHMuc29tZSgoc3ViRGlyUGF0aCkgPT5cbiAgICAgICAgZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoc3ViRGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKVxuICAgICAgKSxcbiAgICB9KTtcbiAgICBjb25zdCBzdWJEaXJQYXRocyA9IFsuLi5uZXcgU2V0KFsuLi5wYWNrYWdlc1N1YkRpclBhdGhzLCAuLi53b3Jrc3BhY2VTdWJEaXJQYXRoc10pXS5maWx0ZXIoXG4gICAgICAoc3ViRGlyUGF0aCkgPT4gc3ViRGlyUGF0aCAhPT0gcGF0aC5yZXNvbHZlKHJvb3REaXJQYXRoKVxuICAgICk7XG5cbiAgICAvLyBSZWZ1c2VkIHdyaXRlcyBvbiBjb3JlIG1hbmFnZWQgZmlsZXMgd291bGQgbGVhdmUgdGhlIHJlcG9zaXRvcnkgcGFydGlhbGx5IHVwZGF0ZWQsIHNvIHNraXBcbiAgICAvLyBpdCBCRUZPUkUgYW55IG11dGF0aW9uIHdoZW4gb25lIG9mIHRoZW0gaXMgYSBzeW1saW5rIG9yIHJlc29sdmVzIG91dHNpZGUgdGhlIHJlcG9zaXRvcnkuXG4gICAgY29uc3QgbWFuYWdlZEZpbGVQYXRocyA9IFtcbiAgICAgIC4uLlsnLmdpdGF0dHJpYnV0ZXMnLCAnYnVuZmlnLnRvbWwnLCAnbGVmdGhvb2sueW1sJywgJ3BhY2thZ2UuanNvbicsICd0c2NvbmZpZy5qc29uJ10ubWFwKChuYW1lKSA9PlxuICAgICAgICBwYXRoLnJlc29sdmUocm9vdERpclBhdGgsIG5hbWUpXG4gICAgICApLFxuICAgICAgLi4uc3ViRGlyUGF0aHMuZmxhdE1hcCgoc3ViRGlyUGF0aCkgPT5cbiAgICAgICAgWydwYWNrYWdlLmpzb24nLCAndHNjb25maWcuanNvbiddLm1hcCgobmFtZSkgPT4gcGF0aC5yZXNvbHZlKHN1YkRpclBhdGgsIG5hbWUpKVxuICAgICAgKSxcbiAgICBdO1xuICAgIGNvbnN0IHdyaXRhYmxlUmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgbWFuYWdlZEZpbGVQYXRocy5tYXAoKGZpbGVQYXRoKSA9PiBmc1V0aWwuaXNDb25maW5lZFdyaXRhYmxlUGF0aChmaWxlUGF0aCkpXG4gICAgKTtcbiAgICBpZiAod3JpdGFibGVSZXN1bHRzLmluY2x1ZGVzKGZhbHNlKSkge1xuICAgICAgY29uc29sZS5lcnJvcihgU2tpcCAke3Jvb3REaXJQYXRofTogYSBtYW5hZ2VkIGNvbmZpZyBmaWxlIGlzIGEgc3ltbGluayBvciByZXNvbHZlcyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LmApO1xuICAgICAgaGFzSW52YWxpZFBhY2thZ2VDb25maWcgPSB0cnVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgcHJlZmxpZ2h0RXJyb3JzID0gW3Jvb3REaXJQYXRoLCAuLi5zdWJEaXJQYXRoc10uZmxhdE1hcCgoZGlyUGF0aCkgPT4ge1xuICAgICAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgICAgIGlmICghZnMuZXhpc3RzU3luYyhwYWNrYWdlSnNvblBhdGgpKSByZXR1cm4gW107XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKSkgYXMgUGFja2FnZUNvbmZpZ1sncGFja2FnZUpzb24nXTtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBnZXRXb3JrZXJUeXBlc1NjcmlwdEVycm9yKHsgcGFja2FnZUpzb24gfSk7XG4gICAgICAgIHJldHVybiBlcnJvciA/IFtgJHtkaXJQYXRofTogJHtlcnJvcn1gXSA6IFtdO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBbYCR7cGFja2FnZUpzb25QYXRofSBpcyBpbnZhbGlkYF07XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKHByZWZsaWdodEVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBTa2lwICR7cm9vdERpclBhdGh9OlxcbiR7cHJlZmxpZ2h0RXJyb3JzLmpvaW4oJ1xcbicpfWApO1xuICAgICAgaGFzSW52YWxpZFBhY2thZ2VDb25maWcgPSB0cnVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gTGV0IGdldFBhY2thZ2VDb25maWcgZGVyaXZlIGlzUm9vdCBmb3IgdGhlIGVudHJ5IHBhdGg6IGB3YmZ5IDxyZXBvPi9wYWNrYWdlcy88YXBwPmAgaXMgYVxuICAgIC8vIHN1cHBvcnRlZCBpbnZvY2F0aW9uIHdob3NlIHRhcmdldCBtdXN0IGtlZXAgaXRzIGNoaWxkIGNsYXNzaWZpY2F0aW9uLCBzbyBmb3JjaW5nXG4gICAgLy8gYGlzUm9vdDogdHJ1ZWAgaGVyZSB3b3VsZCBhcHBseSByb290LW9ubHkgcHJvY2Vzc2luZyAobGVmdGhvb2sgaW5zdGFsbCwgcm9vdCB0c2NvbmZpZyxcbiAgICAvLyBBR0VOVFMubWQsIOKApikgdG8gYSBzdWJwYWNrYWdlLlxuICAgIGNvbnN0IHJvb3RDb25maWcgPSBhd2FpdCBnZXRQYWNrYWdlQ29uZmlnKHJvb3REaXJQYXRoKTtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdyb290Q29uZmlnOicsIHJvb3RDb25maWcpO1xuICAgIH1cbiAgICBpZiAoIXJvb3RDb25maWcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYHRoZXJlIGlzIG5vIHZhbGlkIHBhY2thZ2UuanNvbiBpbiAke3Jvb3REaXJQYXRofWApO1xuICAgICAgaGFzSW52YWxpZFBhY2thZ2VDb25maWcgPSB0cnVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIC8vIEV2ZXJ5IGRpc2NvdmVyZWQgd29ya3NwYWNlIChpbmNsdWRpbmcgbm9uLXBhY2thZ2VzLyogbGF5b3V0cyBzdWNoIGFzIGFwcHMvKikgaXMgYSBjaGlsZFxuICAgIC8vIHBhY2thZ2U7IHRoZSBwYWNrYWdlcy8qIGhldXJpc3RpYyBpbnNpZGUgZ2V0UGFja2FnZUNvbmZpZyB3b3VsZCBtaXNjbGFzc2lmeSBhcHBzLyogYXMgcm9vdHMuXG4gICAgY29uc3QgbnVsbGFibGVTdWJQYWNrYWdlQ29uZmlncyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgc3ViRGlyUGF0aHMubWFwKChzdWJEaXJQYXRoKSA9PiBnZXRQYWNrYWdlQ29uZmlnKHN1YkRpclBhdGgsIHsgaXNSb290OiBmYWxzZSB9KSlcbiAgICApO1xuICAgIGNvbnN0IGludmFsaWRTdWJQYWNrYWdlRGlyUGF0aCA9IHN1YkRpclBhdGhzLmZpbmQoXG4gICAgICAoc3ViRGlyUGF0aCwgaW5kZXgpID0+ICFudWxsYWJsZVN1YlBhY2thZ2VDb25maWdzW2luZGV4XSAmJiBmcy5leGlzdHNTeW5jKHBhdGguam9pbihzdWJEaXJQYXRoLCAncGFja2FnZS5qc29uJykpXG4gICAgKTtcbiAgICBpZiAoaW52YWxpZFN1YlBhY2thZ2VEaXJQYXRoKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBTa2lwICR7cm9vdERpclBhdGh9OiAke2ludmFsaWRTdWJQYWNrYWdlRGlyUGF0aH0vcGFja2FnZS5qc29uIGlzIGludmFsaWQuYCk7XG4gICAgICBoYXNJbnZhbGlkUGFja2FnZUNvbmZpZyA9IHRydWU7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3Qgc3ViUGFja2FnZUNvbmZpZ3MgPSBudWxsYWJsZVN1YlBhY2thZ2VDb25maWdzLmZpbHRlcigoY29uZmlnKSA9PiAhIWNvbmZpZyk7XG4gICAgY29uc3QgYWxsUGFja2FnZUNvbmZpZ3MgPSBbcm9vdENvbmZpZywgLi4uc3ViUGFja2FnZUNvbmZpZ3NdO1xuICAgIC8vIFRoZSBtYW5hZ2VkIGlnbm9yZSBydWxlIGlzIHVuYW5jaG9yZWQsIHNvIGEgbmVzdGVkIGNvcHkgKGUuZy4gd29ya2Vycy9hcGkvLmVudi5jbG91ZGZsYXJlKSBpc1xuICAgIC8vIGFzIG11Y2ggYSBsZWFrIGFzIGEgcm9vdCBvbmU7IHRoZSB3aWxkY2FyZCBwYXRoc3BlYyBjb3ZlcnMgZXZlcnkgZGVwdGggaW4gb25lIHF1ZXJ5LlxuICAgIGNvbnN0IHRyYWNrZWRDbG91ZGZsYXJlRW52UGF0aHMgPSBhbGxQYWNrYWdlQ29uZmlncy5zb21lKChjb25maWcpID0+IGNvbmZpZy5pc0Nsb3VkZmxhcmUpXG4gICAgICA/IHNwYXduU3luY0FuZFJldHVyblN0ZG91dChcbiAgICAgICAgICAnZ2l0JyxcbiAgICAgICAgICBbJy1jJywgJ2NvcmUucXVvdGVQYXRoPWZhbHNlJywgJ2xzLWZpbGVzJywgJy0tJywgJy5lbnYuY2xvdWRmbGFyZScsICcqLy5lbnYuY2xvdWRmbGFyZSddLFxuICAgICAgICAgIHJvb3RDb25maWcuZGlyUGF0aFxuICAgICAgICApXG4gICAgICAgICAgLnNwbGl0KCdcXG4nKVxuICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgICAubWFwKChmaWxlUGF0aCkgPT4gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgZmlsZVBhdGgpKVxuICAgICAgOiBbXTtcbiAgICBpZiAodHJhY2tlZENsb3VkZmxhcmVFbnZQYXRocy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBgU0VDVVJJVFkgRVJST1I6IENsb3VkZmxhcmUgY3JlZGVudGlhbHMgbXVzdCBiZSB1bnRyYWNrZWQuIFJlbW92ZSAke3RyYWNrZWRDbG91ZGZsYXJlRW52UGF0aHMuam9pbihcbiAgICAgICAgICAnLCAnXG4gICAgICAgICl9IGZyb20gR2l0LCBwdXJnZSB0aGUgdG9rZW4gZnJvbSBoaXN0b3J5LCBhbmQgcm90YXRlIENMT1VERkxBUkVfQVBJX1RPS0VOIGJlZm9yZSByZXJ1bm5pbmcgd2JmeS5gXG4gICAgICApO1xuICAgICAgaGFzSW52YWxpZFBhY2thZ2VDb25maWcgPSB0cnVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGFiYnJldmlhdGlvblByb21pc2UgPSBmaXhUeXBvcyhyb290Q29uZmlnKTtcblxuICAgIGF3YWl0IGdlbmVyYXRlUmVwb3NpdG9yeU5wbXJjKGFsbFBhY2thZ2VDb25maWdzKTtcblxuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgZm9yIChjb25zdCBjb25maWcgb2YgYWxsUGFja2FnZUNvbmZpZ3MpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGNvbmZpZyk7XG4gICAgICB9XG4gICAgfVxuICAgIGFzc2VydFNhZmVEZXBlbmRlbmN5U291cmNlcyhhbGxQYWNrYWdlQ29uZmlncyk7XG4gICAgLy8gTWFuYWdlZCByZXBvc2l0b3JpZXMgdXNlIEJ1biB3aXRoIG1pc2UgKGFuZCBvcHRpb25hbGx5IGZub3gpLlxuICAgIGNvbnN0IHByZXZpb3VzQnVuR2xvYmFsU3RvcmUgPSByZWFkQnVuR2xvYmFsU3RvcmUocm9vdERpclBhdGgpO1xuICAgIC8vIFJvb3QtbGV2ZWwgaW5zdGFsbCBsYXlvdXQgbXVzdCBjb3ZlciB3b3Jrc3BhY2UgYXBwcyB0b286IE5leHQuanMgY29tbW9ubHkgbGl2ZXMgdW5kZXJcbiAgICAvLyBwYWNrYWdlcy8qIG9yIGFwcHMvKiB3aGlsZSBidW5maWcudG9tbCBleGlzdHMgb25seSBhdCB0aGUgcmVwb3NpdG9yeSByb290LlxuICAgIGNvbnN0IHVzZUdsb2JhbFN0b3JlID0gcmVzb2x2ZUJ1bkdsb2JhbFN0b3JlKGFsbFBhY2thZ2VDb25maWdzLCBwcmV2aW91c0J1bkdsb2JhbFN0b3JlLCBza2lwRGVwcyk7XG4gICAgYXdhaXQgZ2VuZXJhdGVCdW5maWdUb21sKHJvb3RDb25maWcsIHVzZUdsb2JhbFN0b3JlKTtcbiAgICBhd2FpdCBnZW5lcmF0ZU1pc2VUb21sKHJvb3RDb25maWcpO1xuICAgIGF3YWl0IGdlbmVyYXRlRm5veFRvbWwocm9vdENvbmZpZyk7XG4gICAgLy8gUnVuIGFmdGVyIGdlbmVyYXRlRm5veFRvbWwgc28gaXRzIHRyYW5zYWN0aW9uYWwgcmVjaXBpZW50IHN5bmMgY2Fubm90IHJlc3RvcmUgYSBzbmFwc2hvdFxuICAgIC8vIG92ZXIgZGVmaW5pdGlvbnMgaW5zZXJ0ZWQgaGVyZS5cbiAgICBhd2FpdCBlbnN1cmVXYkVudkRlZmluaXRpb25zKHJvb3RDb25maWcsIGFsbFBhY2thZ2VDb25maWdzKTtcbiAgICAvLyBwcm9taXNlUG9vbC5ydW4gcmVzb2x2ZXMgd2hlbiBhIHRhc2sgU1RBUlRTLCBzbyB0aGUgZ2VuZXJhdGVkIGJ1bmZpZy50b21sIGlzIG5vdFxuICAgIC8vIGd1YXJhbnRlZWQgdG8gYmUgb24gZGlzayB5ZXQ7IHRoZSBwcm9iZSBiZWxvdyBtdXN0IG5vdCB2YWxpZGF0ZSBhIHN0YWxlIGNvbmZpZ3VyYXRpb24uXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuXG4gICAgLy8gVGhlIGxheW91dCBtdXN0IGJlIHZlcmlmaWVkIGluc3RhbGxhYmxlIEJFRk9SRSBhbnkgYGJ1biBhZGRgIG11dGF0ZXMgcGFja2FnZS5qc29uIGZpbGVzOlxuICAgIC8vIHBlci1wYWNrYWdlIGluc3RhbGxzIHRvbGVyYXRlIGZhaWx1cmVzIChzcGF3blN5bmMgZGlzY2FyZHMgdGhlaXIgc3RhdHVzKSwgc28gYSBsYXlvdXQgdGhhdFxuICAgIC8vIGNhbm5vdCBpbnN0YWxsIHdvdWxkIHNpbGVudGx5IGRyb3AgZXZlcnkgbWFuYWdlZCBkZXBlbmRlbmN5IHVwZGF0ZSBmb3IgdGhlIHJlc3Qgb2YgdGhlIHJ1bi5cbiAgICAvLyBBIGRvY3Mtb25seSByZXBvc2l0b3J5IGhhcyBubyBtYW5pZmVzdCB0byBwcm9iZSBvbiBpdHMgZmlyc3QgcnVuOyBnZW5lcmF0ZVBhY2thZ2VKc29uIGJlbG93XG4gICAgLy8gY3JlYXRlcyBpdCBiZWZvcmUgdGhlIGF1dGhvcml0YXRpdmUgcmVmcmVzaEJ1bkxvY2sgY2hlY2suXG4gICAgaWYgKFxuICAgICAgIXNraXBEZXBzICYmXG4gICAgICByb290Q29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24gJiZcbiAgICAgICFwcm9iZUlzb2xhdGVkQnVuSW5zdGFsbChyb290RGlyUGF0aCwgcm9vdENvbmZpZywgcHJldmlvdXNCdW5HbG9iYWxTdG9yZSwgdXNlR2xvYmFsU3RvcmUpXG4gICAgKSB7XG4gICAgICAvLyByZWZyZXNoQnVuTG9jayBiZWxvdyBpcyB0aGUgYXV0aG9yaXR5IG9uIHdoZXRoZXIgdGhlIGZpbmFsIGluc3RhbGwgZmFpbGVkLlxuICAgICAgY29uc29sZS53YXJuKGBidW4gaW5zdGFsbCBjdXJyZW50bHkgZmFpbHMgaW4gJHtyb290RGlyUGF0aH0gdW5kZXIgdGhlIGlzb2xhdGVkIGxpbmtlci5gKTtcbiAgICB9XG5cbiAgICBjb25zdCBzaG91bGRSdW5Xb3JrZmxvd3MgPVxuICAgICAgIWlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHJvb3RDb25maWcucmVwb3NpdG9yeSkgJiZcbiAgICAgIChyb290Q29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3Rlci8nKSB8fFxuICAgICAgICByb290Q29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKSk7XG4gICAgLy8gT3RoZXIgb3duZXJzIGNhbm5vdCBjYWxsIHRoZSBvcmdhbml6YXRpb24ncyByZXVzYWJsZSB3b3JrZmxvd3MgKHRoZWlyIHNlY3JldHMgYW5kIHJ1bm5lcnNcbiAgICAvLyBkbyBub3QgZXhpc3QgdGhlcmUpLCBzbyBhbnkgb3RoZXIgR2l0SHViLWhvc3RlZCBOb2RlLmpzIHJlcG9zaXRvcnkgZ2V0cyBzZWxmLWNvbnRhaW5lZFxuICAgIC8vIHdvcmtmbG93cyBpbnN0ZWFkIOKAlCBrZXllZCBvbiByZXBvc2l0b3J5IHN0YXRlLCBuZXZlciBvbiB0aGUgb3duZXIncyBpZGVudGl0eS5cbiAgICAvLyByb290Q29uZmlnLmlzUm9vdDogYSBkaXJlY3Qgd29ya3NwYWNlLWNoaWxkIGludm9jYXRpb24gKGB3YmZ5IDxyZXBvPi9wYWNrYWdlcy88YXBwPmApIGtlZXBzXG4gICAgLy8gaXNSb290IGZhbHNlLCBhbmQgR2l0SHViIGlnbm9yZXMgd29ya2Zsb3cgZmlsZXMgbmVzdGVkIHVuZGVyIGEgcGFja2FnZSBkaXJlY3RvcnkuXG4gICAgY29uc3Qgc2hvdWxkUnVuU2VsZkNvbnRhaW5lZFdvcmtmbG93cyA9XG4gICAgICAhc2hvdWxkUnVuV29ya2Zsb3dzICYmXG4gICAgICAhaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8ocm9vdENvbmZpZy5yZXBvc2l0b3J5KSAmJlxuICAgICAgISFyb290Q29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjonKSAmJlxuICAgICAgcm9vdENvbmZpZy5pc1Jvb3Q7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgYWJicmV2aWF0aW9uUHJvbWlzZS50aGVuKCgpID0+IGdlbmVyYXRlUmVhZG1lKHJvb3RDb25maWcpKSxcbiAgICAgIGdlbmVyYXRlRG9ja2VyaWdub3JlKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVFZGl0b3Jjb25maWcocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUdlbWluaUNvbmZpZyhyb290Q29uZmlnLCBhbGxQYWNrYWdlQ29uZmlncyksXG4gICAgICBnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlSWRlYVNldHRpbmdzKHJvb3RDb25maWcpLFxuICAgICAgZml4UmFpbHdheWlnbm9yZShyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlUmVub3ZhdGVKc29uYyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlUmVsZWFzZXJjKHJvb3RDb25maWcpLFxuICAgICAgLi4uKHNob3VsZFJ1bldvcmtmbG93cyA/IFtnZW5lcmF0ZVdvcmtmbG93cyhyb290Q29uZmlnKV0gOiBbXSksXG4gICAgICAuLi4oc2hvdWxkUnVuU2VsZkNvbnRhaW5lZFdvcmtmbG93cyA/IFtnZW5lcmF0ZVNlbGZDb250YWluZWRXb3JrZmxvd3Mocm9vdENvbmZpZywgYWxsUGFja2FnZUNvbmZpZ3MpXSA6IFtdKSxcbiAgICAgIHNldHVwTGFiZWxzKHJvb3RDb25maWcpLFxuICAgICAgc2V0dXBSZXBvc2l0b3J5UnVsZXNldHMocm9vdENvbmZpZyksXG4gICAgICBzZXR1cEdpdEh1YlNldHRpbmdzKHJvb3RDb25maWcpLFxuICAgICAgLy8gR2l0IGhvb2tzIGFyZSByZXBvc2l0b3J5LWxldmVsIHN0YXRlOiBhIGRpcmVjdCB3b3Jrc3BhY2UtY2hpbGQgaW52b2NhdGlvbiBtdXN0IG5vdCB3cml0ZSBhXG4gICAgICAvLyBjaGlsZCBsZWZ0aG9vay55bWwgb3IgcmVwbGFjZSB0aGUgZW5jbG9zaW5nIHJlcG9zaXRvcnkncyBob29rIGluc3RhbGxhdGlvbi5cbiAgICAgIC4uLihyb290Q29uZmlnLmlzUm9vdCA/IFtnZW5lcmF0ZUxlZnRob29rKHJvb3RDb25maWcsIGFsbFBhY2thZ2VDb25maWdzKV0gOiBbXSksXG4gICAgXSk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICAgIC8vIEFmdGVyIHRoZSB3b3JrZmxvdyBnZW5lcmF0b3IgKGFuZCBpdHMgcG9vbGVkIHdyaXRlcykgc28gdGhlIGluc3RydWN0aW9uIGZpbGVzIGRlc2NyaWJlIHRoZVxuICAgIC8vIGZpbmFsaXplZCB3b3JrZmxvdyBmaWxlcyBpbnN0ZWFkIG9mIGxhZ2dpbmcgb25lIHJ1biBiZWhpbmQuXG4gICAgYXdhaXQgZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucyhyb290Q29uZmlnLCBhbGxQYWNrYWdlQ29uZmlncyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuXG4gICAgY29uc3QgcHJvbWlzZXM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuICAgIGZvciAoY29uc3QgY29uZmlnIG9mIGFsbFBhY2thZ2VDb25maWdzKSB7XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0VGVzdCkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGZpeFBsYXl3cmlnaHRDb25maWcoY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZml4TmV4dENvbmZpZ0pzb24oY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5jaGFrcmEpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChmaXhDaGFrcmFUb2FzdGVyKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgYXdhaXQgZ2VuZXJhdGVHaXRpZ25vcmUoY29uZmlnLCByb290Q29uZmlnKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgICAgIGlmICghY29uZmlnLmlzUm9vdCAmJiAhY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoZG9lc0NvbnRhaW5KYXZhKGNvbmZpZykpIGF3YWl0IGdlbmVyYXRlUHJldHRpZXJpZ25vcmUoY29uZmlnKTtcbiAgICAgIGF3YWl0IGdlbmVyYXRlUGFja2FnZUpzb24oY29uZmlnLCByb290Q29uZmlnLCBza2lwRGVwcyk7XG5cbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Wc2NvZGVTZXR0aW5nc0pzb24pIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZVZzY29kZVNldHRpbmdzKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKGRvZXNDb250YWluSnNPclRzKGNvbmZpZykpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZVRzY29uZmlnKGNvbmZpZykpO1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlT3hmbXRDb25maWcoY29uZmlnKSk7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVPeGxpbnRDb25maWcoY29uZmlnLCByb290Q29uZmlnKSk7XG4gICAgICB9IGVsc2UgaWYgKCFjb25maWcuaXNSb290ICYmIGNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uICYmIGRvZXNDb250YWluSnNPclRzKHJvb3RDb25maWcpKSB7XG4gICAgICAgIC8vIE1vbm9yZXBvIHZlcmlmaWNhdGlvbiBjYW4gaW52b2tlIG94bGludCBmcm9tIGV2ZXJ5IHdvcmtzcGFjZS4gR2l2ZVxuICAgICAgICAvLyBub24tY29kZSBwYWNrYWdlcyBhIGxvY2FsIGNvbmZpZyBzbyBveGxpbnQgZG9lcyBub3QgY2xpbWIgdG8gdGhlXG4gICAgICAgIC8vIHJvb3QgY29uZmlnIGFuZCByZWplY3Qgcm9vdC1vbmx5IHR5cGUtYXdhcmUgb3B0aW9ucyBmcm9tIGEgcGFja2FnZSBjd2QuXG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVPeGxpbnRDb25maWcoY29uZmlnLCByb290Q29uZmlnKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5weXJpZ2h0KSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbihjb25maWcpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgICAvLyBSdW4gYWZ0ZXIgZXZlcnkgcG9vbGVkIGdlbmVyYXRvciB3cml0ZSBzbyBub3JtYWxpemF0aW9uIGNhbm5vdCBvdmVyd3JpdGUgYSBjb25jdXJyZW50XG4gICAgLy8gdXBkYXRlLCBhbmQgYmVmb3JlIGNsZWFudXAgc28gZm9ybWF0dGVyIG1ldGFkYXRhIGNhY2hlcyBvYnNlcnZlIHRoZSBjaGFuZ2VkIGZpbGVzLlxuICAgIHJlbm9ybWFsaXplVHJhY2tlZFRleHRGaWxlcyhyb290RGlyUGF0aCk7XG4gICAgLy8gUmVmcmVzaCBsb2NrIGZpbGVzXG4gICAgdHJ5IHtcbiAgICAgIHJlZnJlc2hCdW5Mb2NrKHJvb3REaXJQYXRoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gQSBmYWlsZWQgaW5zdGFsbCBtdXN0IGZhaWwgdGhlIENMSTogZXhpdGluZyAwIHdpdGggYSBzdGFsZSBvciBtaXNzaW5nIEJ1biBsb2NrZmlsZSB3b3VsZFxuICAgICAgLy8gaGlkZSBhIGJyb2tlbiBtYW5hZ2VkIGNvbmZpZ3VyYXRpb24uXG4gICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gcmVmcmVzaCB0aGUgQnVuIGxvY2tmaWxlOicsIChlcnJvciBhcyBFcnJvciB8IHVuZGVmaW5lZCk/Lm1lc3NhZ2UgPz8gZXJyb3IpO1xuICAgICAgaGFzSW52YWxpZFBhY2thZ2VDb25maWcgPSB0cnVlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgLy8gQnVuIHdyaXRlcyBidW4ubG9jayBiZWZvcmUgbGlmZWN5Y2xlIHNjcmlwdHMsIHNvIGEgZmFpbGVkIGluc3RhbGwgY2FuIHN0aWxsIGxlYXZlIEd1YXJkXG4gICAgICAvLyBVUkxzIGJlaGluZC4gTm9ybWFsaXplIGJvdGggc3VjY2VzcyBhbmQgZmFpbHVyZSBvdXRwdXQgd2l0aG91dCByZXBsYWNpbmcgdGhlIGluc3RhbGwgZXJyb3IuXG4gICAgICBjb25zdCBub3JtYWxpemVkTG9ja2ZpbGVQYXRoID0gbm9ybWFsaXplQnVuTG9ja2ZpbGUocm9vdERpclBhdGgpO1xuICAgICAgaWYgKG5vcm1hbGl6ZWRMb2NrZmlsZVBhdGgpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGBSZW1vdmVkIFRha3VtaSBHdWFyZCBwcm94eSBVUkxzIGZyb20gJHtub3JtYWxpemVkTG9ja2ZpbGVQYXRofSB0byBrZWVwIGl0IHJlZ2lzdHJ5LWFnbm9zdGljLmApO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gbm9ybWFsaXplIHRoZSBCdW4gbG9ja2ZpbGU6JywgKGVycm9yIGFzIEVycm9yIHwgdW5kZWZpbmVkKT8ubWVzc2FnZSA/PyBlcnJvcik7XG4gICAgICBoYXNJbnZhbGlkUGFja2FnZUNvbmZpZyA9IHRydWU7XG4gICAgfVxuICAgIHNwYXduU3luYygnYnVuJywgWydjbGVhbnVwJ10sIHJvb3REaXJQYXRoKTtcbiAgfVxuICByZXR1cm4gaGFzSW52YWxpZFBhY2thZ2VDb25maWc7XG59XG5cbi8qKlxuICogUHJvYmVzIGBidW4gaW5zdGFsbGAgdW5kZXIgdGhlIGlzb2xhdGVkIGxpbmtlci4gQW4gaW5jb21wYXRpYmlsaXR5IG11c3QgYmUgZml4ZWQgaW4gdGhlXG4gKiByZXBvc2l0b3J5IG9yIGluIHdiZnkncyBtYW5hZ2VkIGxpc3RzLCBuZXZlciBieSBzd2l0Y2hpbmcgdGhlIGxpbmtlci4gUmV0dXJucyBmYWxzZSB3aGVuIHRoZVxuICogaW5zdGFsbCBmYWlscy5cbiAqL1xuZnVuY3Rpb24gcHJvYmVJc29sYXRlZEJ1bkluc3RhbGwoXG4gIHJvb3REaXJQYXRoOiBzdHJpbmcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHByZXZpb3VzR2xvYmFsU3RvcmU6IGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gIHVzZUdsb2JhbFN0b3JlOiBib29sZWFuXG4pOiBib29sZWFuIHtcbiAgLy8gQSBsYXlvdXQgc3dpdGNoIG11c3QgcHJvYmUgZnJvbSBhIGNsZWFuIHRyZWUgYmVjYXVzZSBCdW4gZG9lcyBub3QgcmVtb3ZlIHRoZSBwcmV2aW91cyBsYXlvdXQncyBsZWZ0b3ZlcnMuXG4gIGlmIChwcmV2aW91c0dsb2JhbFN0b3JlICE9PSB1c2VHbG9iYWxTdG9yZSkge1xuICAgIHJlbW92ZU5vZGVNb2R1bGVzKHJvb3REaXJQYXRoLCByb290Q29uZmlnKTtcbiAgfVxuICAvLyBSZXRyeSBvbmNlIHNvIGEgdHJhbnNpZW50IGZhaWx1cmUgKHJlZ2lzdHJ5IGhpY2N1cCwgZmxha3kgbGlmZWN5Y2xlIHNjcmlwdCkgZG9lcyBub3RcbiAgLy8gbWFzcXVlcmFkZSBhcyBhIGxheW91dCBpbmNvbXBhdGliaWxpdHkuXG4gIGlmIChzcGF3blN5bmNBbmRSZXR1cm5TdGF0dXMoJ2J1bicsIFsnaW5zdGFsbCddLCByb290RGlyUGF0aCwgMSkgPT09IDApIHJldHVybiB0cnVlO1xuXG4gIC8vIENsZWFuIHVwIHRoZSBmYWlsZWQgYXR0ZW1wdCBzbyBsYXRlciBpbnN0YWxscyBkbyBub3QgcnVuIG9uIGEgcG9sbHV0ZWQgdHJlZS5cbiAgcmVtb3ZlTm9kZU1vZHVsZXMocm9vdERpclBhdGgsIHJvb3RDb25maWcpO1xuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZU5vZGVNb2R1bGVzKHJvb3REaXJQYXRoOiBzdHJpbmcsIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiB2b2lkIHtcbiAgLy8gQ292ZXIgZXZlcnkgZGVjbGFyZWQgd29ya3NwYWNlOiBsZWZ0b3ZlcnMgY2FuIGtlZXAgcGhhbnRvbSBkZXBlbmRlbmNpZXMgcmVzb2x2YWJsZS5cbiAgY29uc3Qgbm9kZU1vZHVsZXNQYXRocyA9IFtcbiAgICBwYXRoLnJlc29sdmUocm9vdERpclBhdGgsICdub2RlX21vZHVsZXMnKSxcbiAgICAuLi5bLi4uZ2V0V29ya3NwYWNlUGFja2FnZURpcnMocm9vdENvbmZpZykudmFsdWVzKCldLm1hcCgod29ya3NwYWNlRGlyKSA9PlxuICAgICAgcGF0aC5yZXNvbHZlKHJvb3REaXJQYXRoLCB3b3Jrc3BhY2VEaXIsICdub2RlX21vZHVsZXMnKVxuICAgICksXG4gIF07XG4gIC8vIE5ldmVyIGRlbGV0ZSB0aHJvdWdoIGEgd29ya3NwYWNlIHN5bWxpbmsgdGhhdCBlc2NhcGVzIHRoaXMgcmVwb3NpdG9yeS5cbiAgY29uc3QgcmVhbFJvb3REaXJQYXRoID0gZnMucmVhbHBhdGhTeW5jKHJvb3REaXJQYXRoKTtcbiAgZm9yIChjb25zdCBub2RlTW9kdWxlc1BhdGggb2Ygbm9kZU1vZHVsZXNQYXRocykge1xuICAgIGNvbnN0IHJlYWxQYXJlbnREaXJQYXRoID0gaWdub3JlRXJyb3IoKCkgPT4gZnMucmVhbHBhdGhTeW5jKHBhdGguZGlybmFtZShub2RlTW9kdWxlc1BhdGgpKSk7XG4gICAgaWYgKFxuICAgICAgIXJlYWxQYXJlbnREaXJQYXRoIHx8XG4gICAgICAocmVhbFBhcmVudERpclBhdGggIT09IHJlYWxSb290RGlyUGF0aCAmJiAhcmVhbFBhcmVudERpclBhdGguc3RhcnRzV2l0aChyZWFsUm9vdERpclBhdGggKyBwYXRoLnNlcCkpXG4gICAgKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgZnMucm1TeW5jKG5vZGVNb2R1bGVzUGF0aCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlZnJlc2hCdW5Mb2NrKHJvb3REaXJQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgLy8gd2JmeSBzaG91bGQgdXBkYXRlIG9ubHkgdGhlIHBhY2thZ2VzIGl0IGV4cGxpY2l0bHkgbWFuYWdlcyB0aHJvdWdoIGJ1biBhZGQuXG4gIC8vIFJ1bm5pbmcgYnVuIHVwZGF0ZSBoZXJlIHJlZnJlc2hlcyB1bnJlbGF0ZWQgYXBwbGljYXRpb24gZGVwZW5kZW5jaWVzIGFuZFxuICAvLyBjYW4gY2hhbmdlIHByb2R1Y3QgYmVoYXZpb3IsIHNvIGtlZXAgdGhlIGV4aXN0aW5nIGxvY2sgYW5kIHJlY29uY2lsZSBpdC5cbiAgY29uc3Qgc3RhdHVzID0gc3Bhd25TeW5jQW5kUmV0dXJuU3RhdHVzKCdidW4nLCBbJ2luc3RhbGwnXSwgcm9vdERpclBhdGgsIDEpO1xuICBpZiAoc3RhdHVzID09PSAwKSByZXR1cm47XG4gIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHJlZnJlc2ggQnVuIGxvY2tmaWxlOiBidW4gaW5zdGFsbCBleGl0ZWQgd2l0aCBzdGF0dXMgJHtzdGF0dXN9YCk7XG59XG5cbmF3YWl0IG1haW4oKTtcbiJdLCJ4X2dvb2dsZV9pZ25vcmVMaXN0IjpbNDUsNDYsNDcsNDgsNDksNTBdLCJtYXBwaW5ncyI6IjIwQkFXQSxNQUFhLEdBQW9ELENBQy9ELENBQ0UsUUFBUyxNQUNULFlBQWEsc0dBQ2YsRUFDQSxDQUNFLFFBQVMsZUFDVCxZQUNFLHFuQkFDSixFQUNBLENBQ0UsUUFBUyxtQkFDVCxZQUNFLDRHQUNKLEVBQ0EsQ0FDRSxRQUFTLG9CQUNULFlBQ0UseUtBQ0osRUFDQSxDQUNFLFFBQVMsVUFDVCxZQUFhLCtEQUNmLEVBQ0EsQ0FDRSxRQUFTLFFBQ1QsWUFBYSxzR0FDZixDQUNGLEVBb0NhLEdBQWlELENBQzVELENBQUUs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
|