@willbooster/wbfy 1.6.18 → 1.6.19
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/dist/index.js +2 -2
- package/package.json +4 -4
package/dist/index.js
CHANGED
|
@@ -28,5 +28,5 @@ if [ -n "$package_json_files" ]; then
|
|
|
28
28
|
fi
|
|
29
29
|
${Jn(n)?`if [ -n "$python_files" ]; then\n ${Un(n)} isort --profile black --filter-files $python_files\n ${Un(n)} black $python_files\n ${Un(n)} flake8 $python_files\nfi`:""}
|
|
30
30
|
${n.doesContainPubspecYaml?'if [ -n "$dart_files" ]; then\n dart format $dart_files\nfi':""}
|
|
31
|
-
`.trim()}function Jn(e){return e.doesContainPoetryLock||e.doesContainUvLock}function Un(e){return e.doesContainUvLock?"uv run":"poetry run"}async function Gn(t){return _.functionIgnoringException("generateLintstagedrc",async()=>{await Promise.all([C.run(()=>e.promises.rm(`${t.dirPath}/.lintstagedrc.cjs`,{force:!0})),C.run(()=>e.promises.rm(`${t.dirPath}/.lintstagedrc.js`,{force:!0})),C.run(()=>e.promises.rm(`${t.dirPath}/.lintstagedrc.json`,{force:!0}))])})}function zn(e){return e?.trim()}class qn{constructor(e){this.blockNames=e.blockNames,this.markerPrefix=e.markerPrefix,this.toolName=e.toolName}getConfigContent(e){return e.existingContent&&this.hasManagedBlocks(e.existingContent)?this.replaceManagedBlocks(e.existingContent,e.desiredContent,e.filePath):e.desiredContent}getBlock(e,t){return`${this.getStartMarker(e)}\n${t}\n${this.getEndMarker(e)}`}hasManagedBlocks(e){return this.blockNames.some(t=>e.includes(this.getStartMarker(t)))}replaceManagedBlocks(e,t,n){let i=e;for(const r of this.blockNames){const s=this.extractManagedBlock(t,r);if(!s)continue;const o=this.replaceManagedBlock(i,r,s);if(!o)return console.warn(`Skipped updating incomplete ${r} block in ${this.toolName} config: ${n}`),e;i=o}return i}extractManagedBlock(e,t){return this.getManagedBlockRegExp(t).exec(e)?.[0]}replaceManagedBlock(e,t,n){const i=this.getManagedBlockRegExp(t);if(i.test(e))return e.replace(i,n)}getManagedBlockRegExp(e){return new RegExp(`${Hn(this.getStartMarker(e))}[\\s\\S]*?${Hn(this.getEndMarker(e))}`)}getStartMarker(e){return`// wbfy:start ${this.markerPrefix}-${e}`}getEndMarker(e){return`// wbfy:end ${this.markerPrefix}-${e}`}}function Hn(e){return e.replaceAll(/[.*+?^${}()|[\]\\]/g,String.raw`\$&`)}const Yn=new qn({blockNames:["base","export"],markerPrefix:"oxfmt",toolName:"oxfmt"});async function Kn(n){return _.functionIgnoringException("generateOxfmtConfig",async()=>{const i=t.resolve(n.dirPath,".oxfmtrc.json"),r=t.resolve(n.dirPath,"oxfmt.config.ts"),s=await P.readFileIgnoringError(r),o=Yn.getConfigContent({desiredContent:Vn(n),existingContent:s,filePath:r}),a=[C.run(()=>e.promises.rm(i,{force:!0}))];zn(s)!==zn(o)&&a.push(C.run(()=>P.generateFile(r,o))),await Promise.all(a)})}function Vn(e){return e.isEsmPackage?`${Yn.getBlock("base","import config from '@willbooster/oxfmt-config';")}\n\n${Yn.getBlock("export","export default config;")}\n`:`${Yn.getBlock("base","// oxlint-disable unicorn/prefer-module -- Oxfmt config files are only auto-discovered as .ts, and CommonJS avoids Node typeless ESM warnings.\nconst oxfmtConfig = require('@willbooster/oxfmt-config');\n\nconst oxfmtResolvedConfig = oxfmtConfig.default ?? oxfmtConfig;")}\n\n${Yn.getBlock("export","module.exports = oxfmtResolvedConfig;")}\n`}const Xn=new qn({blockNames:["base","export"],markerPrefix:"oxlint",toolName:"oxlint"});async function Zn(n,i){return _.functionIgnoringException("generateOxlintConfig",async()=>{const i=Qt(n),r=t.resolve(n.dirPath,"oxlint.config.ts"),s=await P.readFileIgnoringError(r),o=i&&s&&!Xn.hasManagedBlocks(s)?s:Xn.getConfigContent({desiredContent:Qn(n),existingContent:s,filePath:r}).replaceAll("config.","oxlintResolvedConfig.");const a=[];i||a.push(C.run(()=>e.promises.rm(t.resolve(n.dirPath,".oxlintrc.json"),{force:!0})),C.run(()=>e.promises.rm(t.resolve(n.dirPath,"biome.json"),{force:!0})),C.run(()=>e.promises.rm(t.resolve(n.dirPath,"biome.jsonc"),{force:!0})),C.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintrc"),{force:!0})),C.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintrc.cjs"),{force:!0})),C.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintrc.js"),{force:!0})),C.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintrc.json"),{force:!0})),C.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintrc.yaml"),{force:!0})),C.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintrc.yml"),{force:!0})),C.run(()=>e.promises.rm(t.resolve(n.dirPath,"eslint.config.cjs"),{force:!0})),C.run(()=>e.promises.rm(t.resolve(n.dirPath,"eslint.config.js"),{force:!0})),C.run(()=>e.promises.rm(t.resolve(n.dirPath,"eslint.config.mjs"),{force:!0})),C.run(()=>e.promises.rm(t.resolve(n.dirPath,"eslint.config.ts"),{force:!0}))),zn(s)!==zn(o)&&a.push(C.run(()=>P.generateFile(r,o))),await Promise.all(a)})}function Qn(e){const t=e.isRoot;return e.isEsmPackage?`${Xn.getBlock("base",`import oxlintBaseConfig from '@willbooster/oxlint-config';\n\n${ei("oxlintBaseConfig",t)}`)}\n\n${Xn.getBlock("export","export default oxlintResolvedConfig;")}\n`:`${Xn.getBlock("base",`// oxlint-disable unicorn/prefer-module -- Oxlint only auto-discovers .ts config files, and CommonJS avoids Node typeless ESM warnings.\nconst oxlintBaseConfig = require('@willbooster/oxlint-config');\n\n${ei("oxlintBaseConfig.default ?? oxlintBaseConfig",t)}`)}\n\n${Xn.getBlock("export","module.exports = oxlintResolvedConfig;")}\n`}function ei(e,t){return t?`const oxlintResolvedConfig = ${e};`:`// Oxlint only supports type-aware options in the root config, while it\n// still auto-discovers package-local config files in monorepos. Keep this as a\n// plain object copy so package typechecks do not export oxlint's private helper\n// types through the generated config variable.\nconst oxlintResolvedConfig: Record<string, unknown> = { ...${e} };\ndelete oxlintResolvedConfig.options;`}async function ti(n){return _.functionIgnoringException("generatePrettierignore",async()=>{const i=t.resolve(n.dirPath,".prettierignore");if(!B(n))return void await C.run(()=>e.promises.rm(i,{force:!0}));const r=await P.readFileIgnoringError(i)??"",s=vt.getHeadUserContent(r),o=vt.getTailUserContent(r),a=t.resolve(n.dirPath,".gitignore"),c=await vt.readGitignoreWithoutSeparators(a)||"";let l="";n.doesContainPubspecYaml&&(l="\nandroid/app/\nios/Runner/Assets.xcassets/\npubspec.yaml\n");const p=s+"\n3rd-party/\nandroid/\nios/\nno-format/\ntest-fixtures/\ntest/fixtures/\n*.d.ts\n*.min.js\n.yarn/\n.pnp.js\n"+l+c+o;await C.run(()=>P.generateFile(i,p))})}const ni={venvPath:".",venv:".venv"};async function ii(n){return _.functionIgnoringException("generatePyrightConfigJson",async()=>{let i=structuredClone(ni);const r=t.resolve(n.dirPath,"pyrightconfig.json");try{const t=await e.promises.readFile(r,"utf8"),n=JSON.parse(t);i=l.all([i,n,i],{arrayMerge:qe})}catch{}const s=JSON.stringify(i,void 0,2);await C.run(()=>P.generateFile(r,s))})}async function ri(n){return _.functionIgnoringException("generateReadme",async()=>{const i=t.resolve(n.dirPath,"README.md");let r=await e.promises.readFile(i,"utf8");e.existsSync(t.resolve(n.dirPath,".releaserc.json"))&&(r=si(r,"[](https://github.com/semantic-release/semantic-release)"));const s=n.repository?.slice(n.repository.indexOf(":")+1),o=t.resolve(n.dirPath,".github","workflows"),a=e.existsSync(o)?e.readdirSync(o):[];for(const i of a){if(!i.startsWith("test")&&!i.startsWith("deploy"))continue;let o=i;if(o=(o[0]||"").toUpperCase()+o.slice(1,o.indexOf(".")),o=o.replace("-"," "),!s)continue;const a=`[](https://github.com/${s}/actions/workflows/${i})`;e.existsSync(t.resolve(n.dirPath,`.github/workflows/${i}`))&&(r=oi(r,o,i),r=si(r,a))}await C.run(()=>P.generateFile(i,r))})}function si(e,t){e=e.replace(t,"").replaceAll(/\n\n\n+/g,"\n\n");for(let n=0;n<e.length;n++)if("\n"===e[n-1]&&"\n"===e[n]){const i=e.slice(0,n+1);let r=e.slice(n+1);return r.startsWith("[")||r.startsWith("!")||(r=`\n${r}`),`${i}${t}\n${r}`}return`${e}\n${t}\n`}function oi(e,t,n){const i=ai(t),r=ai(n);return e.replaceAll(new RegExp(String.raw`\[!\[${i}\]\(https://github\.com/[^/\s)]+/[^/\s)]+/actions/workflows/${r}/badge\.svg\)\]\(https://github\.com/[^/\s)]+/[^/\s)]+/actions/workflows/${r}\)\n?`,"gu"),"").replaceAll(/\n\n\n+/g,"\n\n")}function ai(e){return e.replaceAll(/[.*+?^${}()|[\]\\]/g,String.raw`\$&`)}async function ci(n){return _.functionIgnoringException("generateReleaserc",async()=>{const i=t.resolve(n.dirPath,".releaserc.json");if(!e.existsSync(i))return;const r=JSON.parse(await e.promises.readFile(i,"utf8")),s=r.plugins??[];for(let e=0;e<s.length;e++){const t=s[e],n=Array.isArray(t),i=n?t[0]:t,r=n&&t[1]||{};"@semantic-release/commit-analyzer"===i?s[e]=["@semantic-release/commit-analyzer",l.all([r,{preset:"conventionalcommits"}],{arrayMerge:qe})]:"@semantic-release/github"===i&&(s[e]=["@semantic-release/github",l.all([r,{successCommentCondition:!1,failCommentCondition:!1,labels:["r: semantic-release"],releasedLabels:["released :bookmark:"]}],{arrayMerge:qe})])}const o=JSON.stringify(r,void 0,2);await C.run(()=>P.generateFile(i,o))})}const li={$schema:"https://docs.renovatebot.com/renovate-schema.json",extends:["github>WillBooster/willbooster-configs:renovate.json5"]};async function pi(n){return _.functionIgnoringException("generateRenovateJson",async()=>{let i=structuredClone(li);const r=t.resolve(n.dirPath,"renovate.json");if(e.existsSync(`${r}5`))return;try{const t=await e.promises.readFile(r,"utf8"),n=JSON.parse(t);i=l.all([i,n,i],{arrayMerge:qe}),i.extends=i.extends.filter(e=>"@willbooster"!==e)}catch{}n.depending.blitz&&(i.packageRules??=[],i.packageRules.some(e=>e.matchPackageNames?.includes("next"))||i.packageRules.push({matchPackageNames:["next"],enabled:!1})),await C.run(()=>e.promises.rm(t.resolve(n.dirPath,".dependabot"),{force:!0})),await C.run(()=>e.promises.rm(t.resolve(n.dirPath,".renovaterc.json"),{force:!0}));const s=JSON.stringify(i,void 0,2);await C.run(()=>P.generateFile(r,s))})}async function di(e){return _.functionIgnoringException("installAgentSkills",async()=>{})}const ui={compilerOptions:{alwaysStrict:!0,noUncheckedIndexedAccess:!0,allowSyntheticDefaultImports:!0,esModuleInterop:!0,resolveJsonModule:!0,importHelpers:!1,noEmit:!0},exclude:["packages/*/test/fixtures","test/fixtures"],include:["*.config.ts","packages/*/*.config.ts","packages/*/scripts/**/*","packages/*/src/**/*","packages/*/test/**/*","scripts/**/*","src/**/*","test/**/*"]},fi={compilerOptions:{alwaysStrict:!0,noUncheckedIndexedAccess:!0,allowSyntheticDefaultImports:!0,esModuleInterop:!0,resolveJsonModule:!0,importHelpers:!1,noEmit:!0},exclude:["test/fixtures"],include:["*.config.ts","scripts/**/*","src/**/*","test/**/*"]};async function gi(n){return _.functionIgnoringException("generateTsconfig",async()=>{if(n.depending.blitz||n.depending.next)return void await async function(n){const i=t.resolve(n.dirPath,"tsconfig.json");try{const t=JSON.parse(await e.promises.readFile(i,"utf8"));!function(e){if(!e)return;"node"!==e.moduleResolution&&"Node"!==e.moduleResolution&&"node10"!==e.moduleResolution&&void 0!==e.moduleResolution||(e.moduleResolution="bundler")}(t.compilerOptions),function(e){if(!e)return;if(delete e.baseUrl,!e.paths)return;for(const[t,n]of Object.entries(e.paths))e.paths[t]=mi(n)}(t.compilerOptions),function(e){if(!e.include)return;if(e.include.includes("scripts/**/*"))return;e.include.push("scripts/**/*"),e.include.sort()}(t),await C.run(()=>P.generateFile(i,JSON.stringify(t,void 0,2)))}catch{}}(n);let i=structuredClone(n.isRoot?ui:fi);const r=function(e){const t=new Set,n={...e.packageJson?.dependencies,...e.packageJson?.devDependencies};e.isBun?t.add("bun"):e.depending.reactNative||t.add("node");(n.jest||n["@jest/globals"]||n["jest-environment-jsdom"]||n["ts-jest"])&&t.add("jest");n.vitest&&t.add("vitest/globals");n.mocha&&t.add("mocha");n.cypress&&t.add("cypress");return[...t]}(n);i.extends=function(e){return e.isBun?"@tsconfig/bun/tsconfig.json":e.depending.reactNative?"@tsconfig/react-native/tsconfig.json":["@tsconfig/node-lts/tsconfig.json","@tsconfig/node-ts/tsconfig.json"]}(n),i.compilerOptions??={},i.compilerOptions.rootDir=function(n){return n.isRoot?".":e.existsSync(t.resolve(n.dirPath,"..","..","package.json"))?"../..":"."}(n),r.length>0&&(i.compilerOptions={...i.compilerOptions,types:r}),n.doesContainJsxOrTsx||n.doesContainJsxOrTsxInPackages?n.isBun||n.depending.reactNative||(i.compilerOptions={...i.compilerOptions,jsx:"react-jsx"}):delete i.compilerOptions?.jsx,n.isRoot&&!n.doesContainSubPackageJsons&&(i.include=i.include?.filter(e=>!e.startsWith("packages/*/")),i.exclude=i.exclude?.filter(e=>!e.startsWith("packages/*/"))),n.depending.prisma&&function(e,t){e.include??=[],e.include.includes(t)||e.include.push(t)}(i,"prisma/**/*");const s=t.resolve(n.dirPath,"tsconfig.json");try{const t=await e.promises.readFile(s,"utf8"),n=JSON.parse(t),a=(o=n.compilerOptions?.types,"string"==typeof o?[o]:Array.isArray(o)?o.filter(e=>"string"==typeof e):[]),c=function(e){const t={};for(const n of["declaration","declarationMap","sourceMap"]){const i=e?.[n];void 0!==i&&(t[n]=i)}return t}(n.compilerOptions);i.extends=function(e,t){const n=[...yi(e),...yi(t)],i=[...new Set(n)];return 0===i.length?void 0:1===i.length?i[0]:i}(i.extends,n.extends),delete n.extends,delete n.compilerOptions?.jsx,i=l.all([i,n,i],{arrayMerge:He}),i.include=i.include?.filter(e=>!e.includes("@types")&&!e.includes("__tests__/")&&!e.includes("tests/")),i.compilerOptions??={},i.compilerOptions={...i.compilerOptions,...c},function(e){if(!e)return;if(!1!==e.noEmit||!0===e.emitDeclarationOnly)return;e.rewriteRelativeImportExtensions=!0}(i.compilerOptions);const p=[...new Set([...hi(a,r),...r])];p.length>0?i.compilerOptions.types=p:delete i.compilerOptions.types,r.some(e=>"cypress"===e||e.includes("/"))&&delete i.compilerOptions.typeRoots}catch{}var o;Ve(i),i.include?.sort(),delete i.compilerOptions?.experimentalDecorators,delete i.compilerOptions?.baseUrl,function(e,t){if(!e)return;"node"!==e.moduleResolution&&"Node"!==e.moduleResolution&&"node10"!==e.moduleResolution||delete e.moduleResolution;if(t.isBun||t.depending.reactNative||"ESNext"!==e.module)return;delete e.module}(i.compilerOptions,n),function(e,t){if(!e||t.isBun||t.depending.reactNative||t.isEsmPackage)return;"commonjs"===e.module?.toLowerCase()&&(e.module="Node16");e.verbatimModuleSyntax=!1}(i.compilerOptions,n),n.depending.reactNative&&delete i.compilerOptions?.verbatimModuleSyntax;const a=JSON.stringify(i,void 0,2);await C.run(()=>P.generateFile(s,a))})}function mi(e){return e.map(e=>e.startsWith("./")||e.startsWith("../")||t.isAbsolute(e)?e:`./${e}`)}function yi(e){return e?Array.isArray(e)?e:[e]:[]}function hi(e,t){const n=new Set(t);return e.filter(e=>!(function(e){return"cypress"===e||"jest"===e||"mocha"===e||"vitest/globals"===e}(e)&&!n.has(e)))}const wi=["**/.git/objects/**","**/.git/subtree-cache/**","**/node_modules/**","**/tmp/**","**/temp/**","**/dist/**"];async function bi(n){return _.functionIgnoringException("generateVscodeSettings",async()=>{try{const i=t.resolve(n.dirPath,".vscode","settings.json"),r=await e.promises.readFile(i,"utf8");let s=JSON.parse(r);for(const e of wi)s=l.all([s,vi(e)]);(n.doesContainPoetryLock||n.doesContainUvLock)&&(s=l.all([s,vi("**/.venv/**")])),n.depending.next&&(s=l.all([s,vi("**/.next/**")])),"editor.codeActionsOnSave"in s&&delete s["editor.codeActionsOnSave"],"editor.formatOnSave"in s&&delete s["editor.formatOnSave"],Ve(s);const o=JSON.stringify(s,void 0,2);await C.run(()=>P.generateFile(i,o))}catch{}})}function vi(e){return{"files.watcherExclude":{[e]:!0}}}async function xi(n){return _.functionIgnoringException("generateYarnrcYml",async()=>{const i=t.resolve(n.dirPath,".yarnrc.yml");if(n.isBun)return await C.run(()=>e.promises.rm(i,{force:!0})),await C.run(()=>e.promises.rm(t.resolve(n.dirPath,".yarn"),{force:!0,recursive:!0})),void await C.run(()=>e.promises.rm(t.resolve(n.dirPath,"yarn.lock"),{force:!0,recursive:!0}));const r=Ut("yarn",["--version"],n.dirPath),s=function(e,t){return Ut("npm",["show",e,"version"],t)||"0.0.0"}("@yarnpkg/cli",n.dirPath);(function(e,t){const n=m.valid(e);return!!n&&m.gt(n,m.valid(t)??"0.0.0")})(s,r)&&Mt("yarn",["set","version",s],n.dirPath,1);const o=t.join(n.dirPath,".yarn","releases");await e.promises.mkdir(o,{recursive:!0});for(const n of await e.promises.readdir(o))n.startsWith("yarn-")&&!n.startsWith(`yarn-${s}.`)&&await C.run(()=>e.promises.rm(t.join(o,n)));const a=t.resolve(n.dirPath,".yarnrc");await C.run(()=>e.promises.rm(a,{force:!0}));let c={};try{c=p.load(await e.promises.readFile(i,"utf8"))??c}catch{}c.defaultSemverRangePrefix="",c.enableScripts=!1,c.nodeLinker="node-modules",c.nmMode="hardlinks-global",c.npmMinimalAgeGate="5d",c.approvedGitRepositories=["https://github.com/WillBooster/*.git","ssh://git@github.com/WillBooster/*.git","https://github.com/WillBoosterLab/*.git","ssh://git@github.com/WillBoosterLab/*.git"],c.npmPreapprovedPackages=["@exercode/*","@willbooster/*","agent-runtime-kit","at-decorators","build-ts","gen-i18n-ts","one-way-git-sync","next","@next/*","@types/*","@typescript/*","@oxfmt/*","@oxlint/*","@oxlint-tsgolint/*","oxfmt","oxlint","oxlint-tsgolint","react","react-dom"],delete c.compressionLevel,0===c.injectEnvironmentFiles?.length&&delete c.injectEnvironmentFiles,c.enableGlobalCache=!0;const l=c.plugins?.length??0;if(c.plugins=c.plugins?.filter(e=>".yarn/plugins/undefined.cjs"!==e.path)??[],c.plugins.length!==l){const i=t.resolve(n.dirPath,".yarn","plugins","undefined.cjs");await C.run(()=>e.promises.rm(i,{force:!0}))}0===c.plugins.length&&delete c.plugins,await e.promises.writeFile(i,p.dump(c,{lineWidth:-1})),Mt("yarn",["dlx","yarn-plugin-auto-install"],n.dirPath),Mt("yarn",function(e,n){return["dlx","prettier","--no-config","--write",t.relative(e,n)]}(n.dirPath,i),n.dirPath)})}async function ki(e){return _.functionIgnoringException("setupLabels",async()=>{const[t,n]=zt.getOrgAndName(e.repository??"");if(!t||!n)return;if("WillBooster"!==t&&"WillBoosterLab"!==t)return;if(!Yt(t))return;const i=Ht(t);try{await ji(i,t,n,"d1: x-easy :hedgehog:","EDE9FE"),await ji(i,t,n,"d2: easy :rabbit2:","DDD6FE"),await ji(i,t,n,"d3: medium :ox:","C4B5FD"),await ji(i,t,n,"d4: hard :squid:","A78BFA"),await ji(i,t,n,"d5: x-hard :whale2:","8B5CF6"),await ji(i,t,n,"p1: critical :fire::fire::fire:","EF4444"),await ji(i,t,n,"p2: urgent :fire::fire:","F87171"),await ji(i,t,n,"p3: important :fire:","FCA5A5"),await ji(i,t,n,"p4: nice to have :droplet:","FECACA"),await ji(i,t,n,"r: blitz","5300bc"),await ji(i,t,n,"r: firebase","ffca28"),await ji(i,t,n,"r: prisma","0c344b"),await ji(i,t,n,"r: react","61dafb"),await ji(i,t,n,"r: svelte","ff3e00"),await ji(i,t,n,"r: semantic-release","494949"),await ji(i,t,n,"ready :rocket:","22C55E"),await ji(i,t,n,"review requested :mag:","FBCA04"),await ji(i,t,n,"released :bookmark:","6366F1"),await ji(i,t,n,"s: 0.5h :clock1230:","F3F4F6"),await ji(i,t,n,"s: 1h :clock1:","E5E7EB"),await ji(i,t,n,"s: 2h :clock2:","D1D5DB"),await ji(i,t,n,"s: 3h :clock3:","9CA3AF"),await ji(i,t,n,"s: 5h :clock5:","6B7280"),await ji(i,t,n,"s: 8h :clock8:","4B5563"),await ji(i,t,n,"s: 13h :clock1:","374151"),await ji(i,t,n,"t: build :hammer:","BFDBFE"),await ji(i,t,n,"t: chore :broom:","BFDBFE"),await ji(i,t,n,"t: ci :construction_worker:","BFDBFE"),await ji(i,t,n,"t: docs :memo:","BFDBFE"),await ji(i,t,n,"t: feat :sparkles:","BFDBFE"),await ji(i,t,n,"t: fix :bug:","BFDBFE"),await ji(i,t,n,"t: perf :zap:","BFDBFE"),await ji(i,t,n,"t: refactor :recycle:","BFDBFE"),await ji(i,t,n,"t: style :lipstick:","BFDBFE"),await ji(i,t,n,"t: test :test_tube:","BFDBFE"),await ji(i,t,n,"project","24292F"),await ji(i,t,n,"focused :dart:","22C55E"),await $i(i,t,n,"bug"),await $i(i,t,n,"documentation"),await $i(i,t,n,"duplicate"),await $i(i,t,n,"enhancement"),await $i(i,t,n,"good first issue"),await $i(i,t,n,"help wanted"),await $i(i,t,n,"invalid"),await $i(i,t,n,"question"),await $i(i,t,n,"wontfix"),await $i(i,t,n,"ready"),await $i(i,t,n,"review requested"),await $i(i,t,n,"released"),await $i(i,t,n,"semantic-release"),await $i(i,t,n,"llm-pr :robot:"),await $i(i,t,n,"ai-pr :robot:"),await $i(i,t,n,"gen-pr-all :robot:"),await $i(i,t,n,"gen-pr-claude :robot:"),await $i(i,t,n,"gen-pr-codex :robot:"),await $i(i,t,n,"gen-pr-gemini :robot:")}catch(e){console.warn("Skip setupLabels due to:",e?.stack??e)}})}async function ji(e,t,n,i,r){try{await e.request("POST /repos/{owner}/{repo}/labels",{owner:t,repo:n,name:i,color:r})}catch{await e.request("PATCH /repos/{owner}/{repo}/labels/{name}",{owner:t,repo:n,name:i,color:r})}}async function $i(e,t,n,i){try{await e.request("DELETE /repos/{owner}/{repo}/labels/{name}",{owner:t,repo:n,name:i})}catch{}}const Si=["READY_DISCORD_WEBHOOK_URL","GH_BOT_PAT","PUBLIC_GH_BOT_PAT"],_i=h(import.meta.url);async function Pi(e){return _.functionIgnoringException("setupSecrets",async()=>{const[n,i]=zt.getOrgAndName(e.repository??"");if(!n||!i||"WillBoosterLab"!==n)return;if(!Yt(n)||!S.doesUploadEnvVars)return;const r=w.config({path:t.resolve(e.dirPath,".env"),quiet:!0}).parsed??{};if(0===Object.keys(r).length)return;const s=Ht(n);try{for(const e of Si)try{await s.request("DELETE /repos/{owner}/{repo}/actions/secrets/{secret_name}",{owner:n,repo:i,secret_name:e})}catch{}const e=await s.request("GET /repos/{owner}/{repo}/actions/secrets/public-key",{owner:n,repo:i}),{key:t,key_id:o}=e.data,a=_i("libsodium-wrappers");await a.ready;for(const[e,c]of Object.entries(r)){if("GH_BOT_PAT"===e||"GH_BOT_PAT_FOR_WILLBOOSTER"===e||"GH_BOT_PAT_FOR_WILLBOOSTERLAB"===e)continue;const r=a.from_base64(t,a.base64_variants.ORIGINAL),l=a.from_string(c),p=a.crypto_box_seal(l,r),d=a.to_base64(p,a.base64_variants.ORIGINAL);await s.request("PUT /repos/{owner}/{repo}/actions/secrets/{secret_name}",{owner:n,repo:i,secret_name:e,encrypted_value:d,key_id:o})}}catch(e){console.warn("Skip setupSecrets due to:",e?.stack??e)}})}async function Ci(e){return _.functionIgnoringException("setupGitHubSettings",async()=>{const[t,n]=zt.getOrgAndName(e.repository??"");if(!t||!n)return;if("WillBooster"!==t&&"WillBoosterLab"!==t)return;if(!Yt(t))return;const i=Ht(t);try{await async function(e,{beforeRetry:t,handleError:n,retryCount:i=3,retryLogger:r,shouldRetry:s,sleepMilliseconds:o=0,updateSleepMilliseconds:a}={}){let c=0;for(;;)try{return await e(c)}catch(e){if(await(n?.(e)),c++,c>=i)throw e;if(s&&!s(e))throw e;o>0&&await k(o),a&&(o=a(o)),r?.(`Retry due to: ${e}\n${e instanceof Error?"---\n"+(e.stack??""):""}`),await(t?.(e))}}(()=>i.request("PATCH /repos/{owner}/{repo}",{owner:t,repo:n,allow_auto_merge:!0,allow_merge_commit:!1,allow_squash_merge:!0,allow_rebase_merge:!1,allow_update_branch:!0,delete_branch_on_merge:!0,squash_merge_commit_title:"PR_TITLE",squash_merge_commit_message:"BLANK",headers:{"X-GitHub-Api-Version":"2022-11-28"},...e.repository?.startsWith("github:WillBooster/")?{allow_auto_merge:!0}:{}}),{shouldRetry:e=>!Ei(e)})}catch(e){if(!Ei(e))throw e;console.warn("Skip setupGitHubSettings due to:",e?.stack??e)}})}function Ei(e){return!(!e||"object"!=typeof e||!("status"in e))&&(401===e.status||403===e.status||404===e.status)}const Oi="__PM_RUN__",Bi={"pull_request_template.md":`\nClose #<IssueNumber>\n\n## Self Check\n\n- [ ] I've confirmed \`All checks have passed\` on this page.\n - PR title follows [Angular's commit message format](https://github.com/angular/angular/blob/main/CONTRIBUTING.md#-commit-message-format).\n - PR title doesn't have \`WIP:\`.\n - The test command (e.g., \`${Oi} test\`) passed.\n - The lint command (e.g., \`${Oi} lint\`) passed.\n - You may leave this box unchecked due to long workflows.\n- [ ] I've reviewed my changes on the GitHub diff view.\n- [ ] I've written the steps to test my changes.\n- [ ] I've added screenshots (if the UI changed).\n - You may leave this box unchecked if you didn't modify the UI.\n\n\x3c!-- Please add screenshots if you modify the UI.\n| Current | In coming |\n| ------------------------ | ------------------------ |\n| <img src="" width="400"> | <img src="" width="400"> |\n--\x3e\n\n\x3c!-- Please add steps to test your changes.\n## Steps to Test\n\n1. Open http://localhost-exercode.willbooster.net:3000/ja-JP/courses/_example/lessons/_example_a_plus_b/problems/_example_a_plus_b after login.\n2. Select the language \`C\`.\n3. Write the following code:\n \`\`\`c\n #include <stdio.h>\n\n int main(void) {\n int a, b;\n\n scanf("%d %d", &a, &b);\n printf("%d", a + b);\n return 0;\n }\n \`\`\`\n4. Push \`Submit\` button.\n5. ...\n--\x3e\n`.trim()};async function Ai(n){return _.functionIgnoringException("generateGitHubTemplates",async()=>{if(n.isWillBoosterRepo)for(const[i,r]of Object.entries(Bi)){const s=Fi(r,n),o=t.resolve(n.dirPath,".github",i);if(e.existsSync(o)){const t=await e.promises.readFile(o,"utf8");if(b(t,s)>s.length/2)continue}await e.promises.mkdir(t.resolve(n.dirPath,".github"),{recursive:!0}),await C.run(()=>P.generateFile(o,s))}})}function Fi(e,t){const n=t.isBun?"bun run":"yarn";return e.replaceAll(Oi,n)}const Ri=x.object({typos:x.object({all:x.record(x.string(),x.string()).optional(),doc:x.record(x.string(),x.string()).optional(),ts:x.record(x.string(),x.string()).optional(),text:x.record(x.string(),x.string()).optional()}).optional()});async function Ii(n,i){const r=t.resolve(n,"package.json");try{const o=e.existsSync(r);let a={},c={},l={},p=!1;if(o){const t=e.readFileSync(r,"utf8");l=JSON.parse(t),a=l.dependencies??{},c=l.devDependencies??{},p="module"===l.type}let d=[],u=[];try{const e=t.resolve(n,".releaserc.json"),i=JSON.parse(await s.readFile(e,"utf8"));d=i?.branches??[],u=i?.plugins?.flat()??[]}catch{}const f="packages"!==t.basename(t.resolve(n,".."))||!e.existsSync(t.resolve(n,"..","..","package.json"));let g;f&&(g=await async function(e,t){const n=v(e),i=(await n.getRemotes(!0)).find(e=>"origin"===e.name),r=i?.refs.fetch??i?.refs.push;if("string"==typeof r){const e=await Ni(r);if(e)return e}const s="string"==typeof t.repository?t.repository:t.repository?.url;if(s){const e=await Ni(s);if(e&&"Not Found"!==e.message)return e}}(n,l));let m=function(n){const i=t.resolve(n);return e.existsSync(t.join(i,"mise.toml"))||e.existsSync(t.join(i,".mise.toml"))||e.existsSync(t.join(i,".tool-versions"))}(n);for(const i of["java","node","python"])if(e.existsSync(t.resolve(n,`.${i}-version`))){m=!0;break}let y="";try{y=await s.readFile(t.resolve(n,"Dockerfile"),"utf8")}catch{}const h=t.resolve(n,"wbfy.json");let w;try{const e=await s.readFile(h,"utf8");w=Ri.parse(JSON.parse(e))}catch{}const b="string"==typeof g?.full_name?g.full_name:void 0;let x,k;if(b){const e=b.split("/");e.length>=2&&(x=e[0],k=e[1])}const j=b?`github:${b}`:void 0,$={dirPath:n,dockerfile:y,isRoot:f,isPublicRepo:!1===g?.private,isReferredByOtherRepo:!!l.files,repository:j,repoAuthor:x,repoName:k,isWillBoosterRepo:Boolean(j?.startsWith("github:WillBooster/")||j?.startsWith("github:WillBoosterLab/")),isBun:i?.isBun||e.existsSync(t.join(n,"bun.lock")),isEsmPackage:p,isWillBoosterConfigs:r.includes("/willbooster-configs"),doesContainSubPackageJsons:Wi("packages/**/package.json",n),doesContainDockerfile:!!y||e.existsSync(t.resolve(n,"docker-compose.yml")),doesContainGemfile:e.existsSync(t.resolve(n,"Gemfile")),doesContainGoMod:e.existsSync(t.resolve(n,"go.mod")),doesContainPackageJson:e.existsSync(t.resolve(n,"package.json")),doesContainPoetryLock:e.existsSync(t.resolve(n,"poetry.lock")),doesContainUvLock:e.existsSync(t.resolve(n,"uv.lock")),doesContainPomXml:e.existsSync(t.resolve(n,"pom.xml")),doesContainPubspecYaml:e.existsSync(t.resolve(n,"pubspec.yaml")),doesContainTemplateYaml:e.existsSync(t.resolve(n,"template.yaml")),doesContainVscodeSettingsJson:e.existsSync(t.resolve(n,".vscode","settings.json")),doesContainJavaScript:Wi("{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx}",n),doesContainTypeScript:Wi("{app,src,test,scripts}/**/*.{cts,mts,ts,tsx}",n),doesContainJsxOrTsx:Wi("{app,src,test}/**/*.{t,j}sx",n),doesContainJava:Wi("**/*.java",n),doesContainJavaScriptInPackages:Wi("packages/**/{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx}",n),doesContainTypeScriptInPackages:Wi("packages/**/{app,src,test,scripts}/**/*.{cts,mts,ts,tsx}",n),doesContainJsxOrTsxInPackages:Wi("packages/**/{app,src,test}/**/*.{t,j}sx",n),doesContainJavaInPackages:Wi("packages/**/*.java",n),depending:{blitz:!!a.blitz,firebase:!!c["firebase-tools"],genI18nTs:!!a["gen-i18n-ts"]||!!c["gen-i18n-ts"],litestream:y.includes("install-litestream.sh"),react:!!a.react,next:!!a.next,playwrightTest:!!a["@playwright/test"]||!!c["@playwright/test"]||!!c.playwright,prisma:!!a["@prisma/client"]||!!c.prisma,pyright:!!c.pyright,reactNative:!!a["react-native"],semanticRelease:!!(c["semantic-release"]||d.length>0||u.length>0),storybook:!!c["@storybook/react"],wb:!!a["@willbooster/wb"]||!!c["@willbooster/wb"]},release:{branches:d,github:u.includes("@semantic-release/github"),npm:u.includes("@semantic-release/npm")},hasVersionSettings:m,miseTasks:await Di(n),packageJson:l,wbfyJson:w};if($.doesContainGemfile||$.doesContainGoMod||$.doesContainPackageJson||$.doesContainPoetryLock||$.doesContainUvLock||$.doesContainPomXml||$.doesContainPubspecYaml||$.doesContainTemplateYaml)return $}catch{}}async function Di(e){const n={};for(const i of["mise.toml",".mise.toml"]){const r=t.resolve(e,i);try{const e=d.parse(await s.readFile(r,"utf8"));for(const[t,i]of Object.entries(e.tasks??{}))n[t]=Ti(i)}catch{}}return n}function Ti(e){return"string"==typeof e?e:Array.isArray(e)?e.filter(e=>"string"==typeof e).join("\n"):e&&"object"==typeof e?Ti(e.run):""}function Wi(e,t){return o.globSync(e,{dot:!0,cwd:t,ignore:z}).length>0}async function Ni(e){const[t,n]=zt.getOrgAndName(e);if(t&&n)try{return(await Ht().request("GET /repos/{owner}/{repo}",{owner:t,repo:n})).data}catch(e){const t=function(e){if(!e||"object"!=typeof e)return;const t="response"in e?e.response:void 0,n=t?.status??e.status;if(301!==n&&302!==n)return;const i=t?.headers?.location;if("string"!=typeof i)return;const[r,s]=zt.getOrgAndName(i);if(!r||!s)return;return`${r}/${s}`}(e);if(t)return{full_name:t}}}const Li=["dependencies","devDependencies","optionalDependencies","peerDependencies"],Mi=String.raw`(?:WillBooster|WillBoosterLab)`,Ji=[new RegExp(`^${Mi}/[^#\\s]+(?:#\\S+)?$`,"u"),new RegExp(`^github:${Mi}/[^#\\s]+(?:#\\S+)?$`,"u"),new RegExp(`^(?:git\\+)?https://github\\.com/${Mi}/[^#\\s]+(?:\\.git)?(?:#\\S+)?$`,"u"),new RegExp(`^(?:git\\+)?ssh://git@github\\.com[:/]${Mi}/[^#\\s]+(?:\\.git)?(?:#\\S+)?$`,"u"),new RegExp(`^(?:git\\+)?git@github\\.com:${Mi}/[^#\\s]+(?:\\.git)?(?:#\\S+)?$`,"u")];function Ui(e){const n=e.flatMap(Gi);if(0===n.length)return;const i=n.map(({dependencyName:e,dirPath:n,sectionName:i,specifier:r})=>`- ${t.join(n,"package.json")}: ${i}.${e} uses ${r}`).join("\n");throw new Error(`Disallowed Git dependency sources found.\nOnly WillBooster and WillBoosterLab GitHub dependencies are allowed.\n${i}`)}function Gi(e){const t=e.packageJson;if(!t)return[];const n=[];for(const i of Li){const r=t[i];if(r)for(const[t,s]of Object.entries(r))s&&zi(s)&&(qi(s)||n.push({dependencyName:t,dirPath:e.dirPath,sectionName:i,specifier:s}))}return n}function zi(e){return function(e){return/^[a-zA-Z0-9][\w.-]*\/[\w.-]+(?:#\S+)?$/u.test(e)}(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 qi(e){return Ji.some(t=>t.test(e))}function Hi(e){const t=Jt("bun",["install"],e);if(0!==t)throw new Error(`Failed to refresh Bun lockfile: bun install exited with status ${t}`)}await async function(){const i=await n(process.argv.slice(2)).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({env:{description:"Upload environment variables as secrets to GitHub",type:"boolean",default:!1,alias:"e"},skipDeps:{description:"Skip dependency installation",type:"boolean",default:!1,alias:"d"},verbose:{description:"Whether or not to enable verbose mode",type:"boolean",default:!1,alias:"v"}}).version(function(){let n=t.dirname(new URL(import.meta.url).pathname);for(;!e.existsSync(t.join(n,"package.json"));)n=t.dirname(n);return JSON.parse(e.readFileSync(t.join(n,"package.json"),"utf8")).version}()).strict().argv;S.isVerbose=i.verbose,S.doesUploadEnvVars=i.env;let r=!1;for(const n of i.paths){const s=t.join(n,"packages"),o=(await j(()=>e.promises.readdir(s,{withFileTypes:!0}))??[]).filter(e=>e.isDirectory()).map(e=>t.join(s,e.name));await Ue([n,...o]);const a=await Ii(n);if(S.isVerbose,!a){console.error(`there is no valid package.json in ${n}`),r=!0;continue}const c=ot(a),l=(await Promise.all(o.map(e=>Ii(e,a)))).filter(e=>!!e),p=[a,...l];if(S.isVerbose)for(const e of p)console.info(e);Ui(p),await xi(a),a.isBun&&await ft(a);const d=!tt(a.repository)&&(a.repository?.startsWith("github:WillBooster/")||a.repository?.startsWith("github:WillBoosterLab/"));await Promise.all([q(a),c.then(()=>ri(a)),lt(a,p),kt(a),St(a),Ct(a,p),Et(a),Bt(a),Ai(a),Nt(a),pi(a),ci(a),...d?[et(a)]:[],ki(a),Pi(a),Ci(a),Wn(a),Gn(a)]),await C.promiseAll();const u=[];for(const e of p)(e.doesContainTypeScript||e.doesContainTypeScriptInPackages)&&u.push(ze(e,e.isRoot?p:[e])),e.depending.playwrightTest&&u.push(D(e)),e.depending.next&&u.push(E(e)),await Ft(e,a),await C.promiseAll(),(e.isRoot||e.doesContainPackageJson)&&(await ti(e),await un(e,a,i.skipDeps),u.push(Gn(e)),e.doesContainVscodeSettingsJson&&e.doesContainPackageJson&&u.push(bi(e)),(e.doesContainTypeScript||e.doesContainTypeScriptInPackages)&&u.push(gi(e)),O(e)?(u.push(Kn(e)),u.push(Zn(e))):!e.isRoot&&e.doesContainPackageJson&&O(a)&&u.push(Zn(e)),e.depending.pyright&&u.push(ii(e)));await Promise.all(u),await C.promiseAll();const f=a.isBun?"bun":"yarn";a.isBun?await _.functionIgnoringException("refreshBunLock",async()=>{await Promise.resolve(),Hi(n)}):Mt(f,["install","--no-immutable"],n),Mt(f,["cleanup"],n),await di()}r&&(process.exitCode=1)}();
|
|
32
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NoYXJlZC1saWIvc3JjL3NsZWVwLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi9zcmMvZXJyb3IudHMiLCIuLi9zcmMvb3B0aW9ucy50cyIsIi4uL3NyYy9sb2dnZXIudHMiLCIuLi9zcmMvdXRpbHMvZnNVdGlsLnRzIiwiLi4vc3JjL3V0aWxzL3Byb21pc2VQb29sLnRzIiwiLi4vc3JjL2ZpeGVycy9uZXh0Q29uZmlnLnRzIiwiLi4vc3JjL3V0aWxzL3BhY2thZ2VDYXBhYmlsaXRpZXMudHMiLCIuLi9zcmMvZml4ZXJzL3BsYXl3cmlnaHRDb25maWcudHMiLCIuLi9zcmMvdXRpbHMvZ2xvYlV0aWwudHMiLCIuLi9zcmMvZml4ZXJzL3ByaXNtYS50cyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9zb3J0LW9iamVjdC1rZXlzL2luZGV4LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2RldGVjdC1pbmRlbnQvaW5kZXguanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvZGV0ZWN0LW5ld2xpbmUvaW5kZXguanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvc29ydC1wYWNrYWdlLWpzb24vaW5kZXguanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvaXMtcGxhaW4tb2JqL2luZGV4LmpzIiwiLi4vc3JjL2ZpeGVycy90ZXN0RGlyZWN0b3J5LnRzIiwiLi4vc3JjL2ZpeGVycy90eXBlRGVmaW5pdGlvbi50cyIsIi4uL3NyYy91dGlscy9tZXJnZVV0aWwudHMiLCIuLi9zcmMvdXRpbHMvb2JqZWN0VXRpbC50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3dvcmtmbG93LnRzIiwiLi4vc3JjL2ZpeGVycy90eXBvcy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2FnZW50cy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2J1bmZpZy50cyIsIi4uL3NyYy91dGlscy9pZ25vcmVGaWxlVXRpbC50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2RvY2tlcmlnbm9yZS50cyIsIi4uL3NyYy91dGlscy9leHRlbnNpb25zLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZWRpdG9yY29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2VtaW5pQ29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2VtaW5pU2V0dGluZ3MudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9naXRhdHRyaWJ1dGVzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2l0aWdub3JlLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvaWRlYS50cyIsIi4uL3NyYy91dGlscy9nZW5JMThuVHMudHMiLCIuLi9zcmMvdXRpbHMvc3Bhd25VdGlsLnRzIiwiLi4vc3JjL3V0aWxzL2dpdGh1YlV0aWwudHMiLCIuLi9zcmMvdXRpbHMvdHNjb25maWdCYXNlLnRzIiwiLi4vc3JjL3V0aWxzL3dpbGxib29zdGVyQ29uZmlnc1V0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9wYWNrYWdlSnNvbi50cyIsIi4uL3NyYy9naXRodWIvY29tbWl0LnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvbGVmdGhvb2sudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9saW50c3RhZ2VkcmMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9jb25maWdDb250ZW50LnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvbWFuYWdlZENvbmZpZ0Jsb2NrLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvb3hmbXRDb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9veGxpbnRDb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9wcmV0dGllcmlnbm9yZS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3B5cmlnaHRDb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9yZWFkbWUudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9yZWxlYXNlcmMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9yZW5vdmF0ZUpzb24udHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9za2lsbHMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy90c2NvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3ZzY29kZVNldHRpbmdzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMveWFybnJjLnRzIiwiLi4vc3JjL2dpdGh1Yi9sYWJlbC50cyIsIi4uL3NyYy9naXRodWIvc2VjcmV0LnRzIiwiLi4vc3JjL2dpdGh1Yi9zZXR0aW5ncy50cyIsIi4uL3NyYy9naXRodWIvdGVtcGxhdGUudHMiLCIuLi9zcmMvcGFja2FnZUNvbmZpZy50cyIsIi4uL3NyYy91dGlscy9kZXBlbmRlbmN5U291cmNlUG9saWN5LnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBhc3luYyBmdW5jdGlvbiBzbGVlcChtaWxsaXNlY29uZHM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbWlsbGlzZWNvbmRzKSk7XG59XG4iLCJpbXBvcnQgeyBzbGVlcCB9IGZyb20gJy4vc2xlZXAuanMnO1xuXG4vKipcbiAqIENvbnZlcnQgYW4gb2JqZWN0IHRvIGFuIGVycm9yLlxuICogQHBhcmFtIG9iaiBUaGUgb2JqZWN0IHRvIGNvbnZlcnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlcnJvcmlmeShvYmo6IHVua25vd24pOiBFcnJvciB7XG4gIGlmIChvYmogaW5zdGFuY2VvZiBFcnJvcikgcmV0dXJuIG9iajtcbiAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSByZXR1cm4gbmV3IEVycm9yKG9iaik7XG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihKU09OLnN0cmluZ2lmeShvYmopKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihTdHJpbmcob2JqKSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlnbm9yZUVycm9yPFQ+KGZuOiAoKSA9PiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaWdub3JlRW5vZW50PFQ+KGZuOiAoKSA9PiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgJiYgJ2NvZGUnIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFcnJvckFzeW5jPFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaWdub3JlRW5vZW50QXN5bmM8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXRyeU9wdGlvbnMge1xuICBiZWZvcmVSZXRyeT86IChlcnJvcjogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgaGFuZGxlRXJyb3I/OiAoZXJyb3I6IHVua25vd24pID0+IFByb21pc2U8dm9pZD47XG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgdG90YWwgYXR0ZW1wdHMsIGluY2x1ZGluZyB0aGUgaW5pdGlhbCBhdHRlbXB0LlxuICAgKiBGb3IgZXhhbXBsZSwgYHJldHJ5Q291bnQ6IDNgIHJ1bnMgdGhlIGZ1bmN0aW9uIGF0IG1vc3QgMyB0aW1lczogMSBpbml0aWFsIGF0dGVtcHQgYW5kIHVwIHRvIDIgcmV0cmllcy5cbiAgICovXG4gIHJldHJ5Q291bnQ/OiBudW1iZXI7XG4gIHJldHJ5TG9nZ2VyPzogKG1lc3NhZ2U6IHN0cmluZykgPT4gdm9pZDtcbiAgc2hvdWxkUmV0cnk/OiAoZXJyb3I6IHVua25vd24pID0+IGJvb2xlYW47XG4gIHNsZWVwTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuICB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcz86IChzbGVlcE1pbGxpc2Vjb25kczogbnVtYmVyKSA9PiBudW1iZXI7XG59XG5cbi8qKlxuICogUmV0cnkgdGhlIGdpdmVuIGZ1bmN0aW9uLlxuICogQHBhcmFtIGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJldHJ5LlxuICogQHBhcmFtIGJlZm9yZVJldHJ5IFRoZSBmdW5jdGlvbiB0byBjYWxsIGltbWVkaWF0ZWx5IGJlZm9yZSByZXRyeWluZy5cbiAqIEBwYXJhbSBoYW5kbGVFcnJvciBUaGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIGFuIGVycm9yIG9jY3Vycy5cbiAqIEBwYXJhbSByZXRyeUNvdW50IFRoZSBtYXhpbXVtIG51bWJlciBvZiB0b3RhbCBhdHRlbXB0cywgaW5jbHVkaW5nIHRoZSBpbml0aWFsIGF0dGVtcHQuXG4gKiBAcGFyYW0gcmV0cnlMb2dnZXIgVGhlIGZ1bmN0aW9uIHRvIGxvZyByZXRyeWluZy5cbiAqIEBwYXJhbSBzbGVlcE1pbGxpc2Vjb25kcyBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBzbGVlcCBiZWZvcmUgcmV0cnlpbmcuXG4gKiBAcGFyYW0gdXBkYXRlU2xlZXBNaWxsaXNlY29uZHMgVGhlIGZ1bmN0aW9uIHRvIHVwZGF0ZSBzbGVlcCBtaWxsaXNlY29uZHMgYWZ0ZXIgZWFjaCByZXRyeS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdpdGhSZXRyeTxUPihcbiAgZnVuYzogKGZhaWxlZENvdW50OiBudW1iZXIpID0+IFQgfCBQcm9taXNlPFQ+LFxuICB7XG4gICAgYmVmb3JlUmV0cnksXG4gICAgaGFuZGxlRXJyb3IsXG4gICAgcmV0cnlDb3VudCA9IDMsXG4gICAgcmV0cnlMb2dnZXIsXG4gICAgc2hvdWxkUmV0cnksXG4gICAgc2xlZXBNaWxsaXNlY29uZHMgPSAwLFxuICAgIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzLFxuICB9OiBSZXRyeU9wdGlvbnMgPSB7fVxuKTogUHJvbWlzZTxUPiB7XG4gIGxldCBmYWlsZWRDb3VudCA9IDA7XG4gIGZvciAoOzspIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZ1bmMoZmFpbGVkQ291bnQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBhd2FpdCBoYW5kbGVFcnJvcj8uKGVycm9yKTtcbiAgICAgIGZhaWxlZENvdW50Kys7XG4gICAgICBpZiAoZmFpbGVkQ291bnQgPj0gcmV0cnlDb3VudCkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGRSZXRyeSAmJiAhc2hvdWxkUmV0cnkoZXJyb3IpKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgaWYgKHNsZWVwTWlsbGlzZWNvbmRzID4gMCkge1xuICAgICAgICBhd2FpdCBzbGVlcChzbGVlcE1pbGxpc2Vjb25kcyk7XG4gICAgICB9XG4gICAgICBpZiAodXBkYXRlU2xlZXBNaWxsaXNlY29uZHMpIHtcbiAgICAgICAgc2xlZXBNaWxsaXNlY29uZHMgPSB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcyhzbGVlcE1pbGxpc2Vjb25kcyk7XG4gICAgICB9XG4gICAgICByZXRyeUxvZ2dlcj8uKGBSZXRyeSBkdWUgdG86ICR7ZXJyb3J9XG4ke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyAnLS0tXFxuJyArIChlcnJvci5zdGFjayA/PyAnJykgOiAnJ31gKTtcbiAgICAgIGF3YWl0IGJlZm9yZVJldHJ5Py4oZXJyb3IpO1xuICAgIH1cbiAgfVxufVxuIiwiY2xhc3MgT3B0aW9ucyB7XG4gIGlzVmVyYm9zZSA9IGZhbHNlO1xuICBkb2VzVXBsb2FkRW52VmFycyA9IGZhbHNlO1xufVxuXG5leHBvcnQgY29uc3Qgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7XG4iLCJpbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi9vcHRpb25zLmpzJztcblxuY2xhc3MgTG9nZ2VyIHtcbiAgYXN5bmMgZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbihuYW1lOiBzdHJpbmcsIGZ1bmM6ICgpID0+IFByb21pc2U8dm9pZD4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgLS0tLS0tLS0tICR7bmFtZX0gc3RhcnQgLS0tLS0tLS0tYCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmdW5jKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRXJyb3Igb2NjdXJyZWQgaW4gJHtuYW1lfTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3Iuc3RhY2sgOiBTdHJpbmcoZXJyb3IpfX1gKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYC0tLS0tLS0tLS0gJHtuYW1lfSBlbmQgLS0tLS0tLS0tLWApO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgbG9nZ2VyID0gbmV3IExvZ2dlcigpO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuZXhwb3J0IGNvbnN0IGZzVXRpbCA9IHtcbiAgYXN5bmMgcmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICB9LFxuICBhc3luYyBnZW5lcmF0ZUZpbGUoZmlsZVBhdGg6IHN0cmluZywgY29udGVudDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIocGF0aC5kaXJuYW1lKGZpbGVQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgbGV0IG5vcm1hbGl6ZWRDb250ZW50ID0gY29udGVudC50cmltKCk7XG4gICAgaWYgKG5vcm1hbGl6ZWRDb250ZW50KSB7XG4gICAgICBub3JtYWxpemVkQ29udGVudCArPSAnXFxuJztcbiAgICB9XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGZpbGVQYXRoLCBub3JtYWxpemVkQ29udGVudCk7XG4gICAgY29uc29sZS5sb2coYEdlbmVyYXRlZC9VcGRhdGVkICR7ZmlsZVBhdGh9YCk7XG4gIH0sXG59O1xuIiwiaW1wb3J0IHsgUHJvbWlzZVBvb2wgfSBmcm9tICdtaW5pbWFsLXByb21pc2UtcG9vbCc7XG5cbmV4cG9ydCBjb25zdCBwcm9taXNlUG9vbCA9IG5ldyBQcm9taXNlUG9vbCgpO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHRzIGZyb20gJ3R5cGVzY3JpcHQnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhOZXh0Q29uZmlnSnNvbihjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhOZXh0Q29uZmlnSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IFsnanMnLCAnbWpzJywgJ2NqcyddXG4gICAgICAubWFwKChleHQpID0+IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgYG5leHQuY29uZmlnLiR7ZXh0fWApKVxuICAgICAgLmZpbmQoKHApID0+IGZzLmV4aXN0c1N5bmMocCkpO1xuICAgIGlmICghZmlsZVBhdGgpIHJldHVybjtcblxuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICBjb25zdCBvYmplY3RMaXRlcmFsID0gZ2V0TmV4dENvbmZpZ09iamVjdExpdGVyYWwob2xkQ29udGVudCk7XG4gICAgaWYgKCFvYmplY3RMaXRlcmFsKSByZXR1cm47XG5cbiAgICBjb25zdCBleGlzdGluZ1Byb3BlcnRpZXMgPSBuZXcgU2V0KG9iamVjdExpdGVyYWwucHJvcGVydGllcy5tYXAoKHByb3BlcnR5KSA9PiBwcm9wZXJ0eS5uYW1lPy5nZXRUZXh0KCkpKTtcbiAgICBjb25zdCBwcm9wZXJ0eVRleHRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGlmICghZXhpc3RpbmdQcm9wZXJ0aWVzLmhhcygndHlwZXNjcmlwdCcpKSB7XG4gICAgICBwcm9wZXJ0eVRleHRzLnB1c2goJ3R5cGVzY3JpcHQ6IHsgaWdub3JlQnVpbGRFcnJvcnM6IHRydWUgfScpO1xuICAgIH1cbiAgICBpZiAocHJvcGVydHlUZXh0cy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIGNvbnN0IGluc2VydGlvblBvaW50ID0gb2JqZWN0TGl0ZXJhbC5nZXRFbmQoKSAtIDE7XG4gICAgY29uc3QgbGFzdFByb3BlcnR5ID0gb2JqZWN0TGl0ZXJhbC5wcm9wZXJ0aWVzLmF0KC0xKTtcbiAgICBjb25zdCBoYXNUcmFpbGluZ0NvbW1hID0gbGFzdFByb3BlcnR5XG4gICAgICA/IG9sZENvbnRlbnQuc2xpY2UobGFzdFByb3BlcnR5LmdldEVuZCgpLCBpbnNlcnRpb25Qb2ludCkuaW5jbHVkZXMoJywnKVxuICAgICAgOiBmYWxzZTtcbiAgICBjb25zdCBwcmVmaXggPSBvYmplY3RMaXRlcmFsLnByb3BlcnRpZXMubGVuZ3RoID4gMCAmJiAhaGFzVHJhaWxpbmdDb21tYSA/ICcsICcgOiAnJztcbiAgICBjb25zdCBuZXdDb250ZW50ID0gYCR7b2xkQ29udGVudC5zbGljZSgwLCBpbnNlcnRpb25Qb2ludCl9JHtwcmVmaXh9JHtwcm9wZXJ0eVRleHRzLmpvaW4oJywgJyl9JHtvbGRDb250ZW50LnNsaWNlKFxuICAgICAgaW5zZXJ0aW9uUG9pbnRcbiAgICApfWA7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldE5leHRDb25maWdPYmplY3RMaXRlcmFsKGNvbnRlbnQ6IHN0cmluZyk6IHRzLk9iamVjdExpdGVyYWxFeHByZXNzaW9uIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc291cmNlID0gdHMuY3JlYXRlU291cmNlRmlsZSgnbmV4dC5jb25maWcuanMnLCBjb250ZW50LCB0cy5TY3JpcHRUYXJnZXQuTGF0ZXN0LCB0cnVlLCB0cy5TY3JpcHRLaW5kLkpTKTtcbiAgbGV0IG9iamVjdExpdGVyYWw6IHRzLk9iamVjdExpdGVyYWxFeHByZXNzaW9uIHwgdW5kZWZpbmVkO1xuICBjb25zdCB2aXNpdCA9IChub2RlOiB0cy5Ob2RlKTogdm9pZCA9PiB7XG4gICAgaWYgKG9iamVjdExpdGVyYWwpIHJldHVybjtcbiAgICBpZiAodHMuaXNFeHBvcnRBc3NpZ25tZW50KG5vZGUpICYmIHRzLmlzT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24obm9kZS5leHByZXNzaW9uKSkge1xuICAgICAgb2JqZWN0TGl0ZXJhbCA9IG5vZGUuZXhwcmVzc2lvbjtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgdHMuaXNCaW5hcnlFeHByZXNzaW9uKG5vZGUpICYmXG4gICAgICBub2RlLm9wZXJhdG9yVG9rZW4ua2luZCA9PT0gdHMuU3ludGF4S2luZC5FcXVhbHNUb2tlbiAmJlxuICAgICAgbm9kZS5sZWZ0LmdldFRleHQoc291cmNlKSA9PT0gJ21vZHVsZS5leHBvcnRzJyAmJlxuICAgICAgdHMuaXNPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihub2RlLnJpZ2h0KVxuICAgICkge1xuICAgICAgb2JqZWN0TGl0ZXJhbCA9IG5vZGUucmlnaHQ7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRzLmZvckVhY2hDaGlsZChub2RlLCB2aXNpdCk7XG4gIH07XG4gIHZpc2l0KHNvdXJjZSk7XG4gIHJldHVybiBvYmplY3RMaXRlcmFsO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBkb2VzQ29udGFpbkpzT3JUcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBjb25maWcuZG9lc0NvbnRhaW5KYXZhU2NyaXB0IHx8XG4gICAgY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdEluUGFja2FnZXMgfHxcbiAgICBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8XG4gICAgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXNcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRvZXNDb250YWluSmF2YShjb25maWc6IFBhY2thZ2VDb25maWcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNvbmZpZy5kb2VzQ29udGFpbkphdmEgfHwgY29uZmlnLmRvZXNDb250YWluSmF2YUluUGFja2FnZXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYWNrYWdlTWFuYWdlckNvbW1hbmQoY29uZmlnOiBQaWNrPFBhY2thZ2VDb25maWcsICdpc0J1bic+KTogJ2J1bicgfCAneWFybicge1xuICByZXR1cm4gY29uZmlnLmlzQnVuID8gJ2J1bicgOiAneWFybic7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHMgZnJvbSAndHlwZXNjcmlwdCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBnZXRQYWNrYWdlTWFuYWdlckNvbW1hbmQgfSBmcm9tICcuLi91dGlscy9wYWNrYWdlQ2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG50eXBlIFBhcnNlZFZhbHVlID1cbiAgfCB7IGtpbmQ6ICdhcnJheSc7IHZhbHVlOiBQYXJzZWRWYWx1ZVtdIH1cbiAgfCB7IGtpbmQ6ICdsaXRlcmFsJzsgdmFsdWU6IHN0cmluZyB9XG4gIHwgeyBraW5kOiAnb2JqZWN0JzsgdmFsdWU6IFBhcnNlZE9iamVjdCB9O1xudHlwZSBPYmplY3RNZW1iZXIgPSB7IGtpbmQ6ICdleHRyYSc7IGluZGV4OiBudW1iZXIgfSB8IHsga2luZDogJ3Byb3BlcnR5Jzsga2V5OiBzdHJpbmcgfTtcbmludGVyZmFjZSBQYXJzZWRPYmplY3Qge1xuICBleHRyYU1lbWJlcnM6IHN0cmluZ1tdO1xuICBtZW1iZXJPcmRlcjogT2JqZWN0TWVtYmVyW107XG4gIHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIFBhcnNlZFZhbHVlPjtcbn1cbmludGVyZmFjZSBFeHRyYWN0ZWRPYmplY3RMaXRlcmFsIHtcbiAgc291cmNlOiB0cy5Tb3VyY2VGaWxlO1xuICBub2RlOiB0cy5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbjtcbn1cblxuY29uc3QgbGl0ZXJhbCA9ICh2YWx1ZTogc3RyaW5nKTogUGFyc2VkVmFsdWUgPT4gKHsga2luZDogJ2xpdGVyYWwnLCB2YWx1ZSB9KTtcbmNvbnN0IGFzQXJyYXkgPSAodmFsdWU6IFBhcnNlZFZhbHVlW10pOiBQYXJzZWRWYWx1ZSA9PiAoeyBraW5kOiAnYXJyYXknLCB2YWx1ZSB9KTtcbmNvbnN0IGFzT2JqZWN0ID0gKHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIFBhcnNlZFZhbHVlPiwgZXh0cmFNZW1iZXJzOiBzdHJpbmdbXSA9IFtdKTogUGFyc2VkVmFsdWUgPT4gKHtcbiAga2luZDogJ29iamVjdCcsXG4gIHZhbHVlOiB0b1BhcnNlZE9iamVjdChwcm9wZXJ0aWVzLCBleHRyYU1lbWJlcnMpLFxufSk7XG5cbmNvbnN0IGNyZWF0ZURlZmF1bHRDb25maWcgPSAoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUGFyc2VkT2JqZWN0ID0+XG4gIHRvUGFyc2VkT2JqZWN0KHtcbiAgICBmb3JiaWRPbmx5OiBsaXRlcmFsKCchIXByb2Nlc3MuZW52LkNJJyksXG4gICAgcmV0cmllczogbGl0ZXJhbCgncHJvY2Vzcy5lbnYuUFdERUJVRyA/IDAgOiBwcm9jZXNzLmVudi5DSSA/IDUgOiAxJyksXG4gICAgdXNlOiBhc09iamVjdCh7XG4gICAgICBiYXNlVVJMOiBsaXRlcmFsKCdwcm9jZXNzLmVudi5ORVhUX1BVQkxJQ19CQVNFX1VSTCcpLFxuICAgICAgdHJhY2U6IGxpdGVyYWwoXCJwcm9jZXNzLmVudi5DSSA/ICdvbi1maXJzdC1yZXRyeScgOiAncmV0YWluLW9uLWZhaWx1cmUnXCIpLFxuICAgICAgc2NyZWVuc2hvdDogbGl0ZXJhbChcInByb2Nlc3MuZW52LkNJID8gJ29ubHktb24tZmFpbHVyZScgOiAnb24nXCIpLFxuICAgICAgdmlkZW86IGxpdGVyYWwoXCJwcm9jZXNzLmVudi5DSSA/ICdvbi1maXJzdC1yZXRyeScgOiAncmV0YWluLW9uLWZhaWx1cmUnXCIpLFxuICAgIH0pLFxuICAgIHdlYlNlcnZlcjogYXNPYmplY3Qoe1xuICAgICAgY29tbWFuZDogbGl0ZXJhbChnZXRXYlN0YXJ0VGVzdENvbW1hbmQoY29uZmlnKSksXG4gICAgICB1cmw6IGxpdGVyYWwoJ3Byb2Nlc3MuZW52Lk5FWFRfUFVCTElDX0JBU0VfVVJMJyksXG4gICAgICByZXVzZUV4aXN0aW5nU2VydmVyOiBsaXRlcmFsKCchIXByb2Nlc3MuZW52LkNJJyksXG4gICAgICB0aW1lb3V0OiBsaXRlcmFsKCczMDBfMDAwJyksXG4gICAgICBzdGRvdXQ6IGxpdGVyYWwoXCIncGlwZSdcIiksXG4gICAgICBzdGRlcnI6IGxpdGVyYWwoXCIncGlwZSdcIiksXG4gICAgICBlbnY6IGxpdGVyYWwoYHtcbiAgLi4ucHJvY2Vzcy5lbnYsXG4gIFBSSVNNQV9VU0VSX0NPTlNFTlRfRk9SX0RBTkdFUk9VU19BSV9BQ1RJT046ICd0cnVlJyxcbn1gKSxcbiAgICAgIGdyYWNlZnVsU2h1dGRvd246IGxpdGVyYWwoYHtcbiAgc2lnbmFsOiAnU0lHVEVSTScsXG4gIHRpbWVvdXQ6IDUwMCxcbn1gKSxcbiAgICB9KSxcbiAgfSk7XG5cbmZ1bmN0aW9uIHRvUGFyc2VkT2JqZWN0KHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIFBhcnNlZFZhbHVlPiwgZXh0cmFNZW1iZXJzOiBzdHJpbmdbXSA9IFtdKTogUGFyc2VkT2JqZWN0IHtcbiAgcmV0dXJuIHtcbiAgICBleHRyYU1lbWJlcnMsXG4gICAgbWVtYmVyT3JkZXI6IFtcbiAgICAgIC4uLk9iamVjdC5rZXlzKHByb3BlcnRpZXMpLm1hcCgoa2V5KTogT2JqZWN0TWVtYmVyID0+ICh7IGtpbmQ6ICdwcm9wZXJ0eScsIGtleSB9KSksXG4gICAgICAuLi5leHRyYU1lbWJlcnMubWFwKChfLCBpbmRleCk6IE9iamVjdE1lbWJlciA9PiAoeyBraW5kOiAnZXh0cmEnLCBpbmRleCB9KSksXG4gICAgXSxcbiAgICBwcm9wZXJ0aWVzLFxuICB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4UGxheXdyaWdodENvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGBwbGF5d3JpZ2h0LmNvbmZpZy50c2ApO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSByZXR1cm47XG5cbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhQbGF5d3JpZ2h0Q29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IGFzc2VydE5leHRQdWJsaWNCYXNlVXJsKGNvbmZpZy5kaXJQYXRoKTtcblxuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICBjb25zdCBleHRyYWN0ZWRPYmplY3RMaXRlcmFsID0gZXh0cmFjdERlZmluZUNvbmZpZ09iamVjdExpdGVyYWwob2xkQ29udGVudCk7XG4gICAgaWYgKCFleHRyYWN0ZWRPYmplY3RMaXRlcmFsKSByZXR1cm47XG5cbiAgICBjb25zdCBwYXJzZWQgPSBwYXJzZU9iamVjdExpdGVyYWxFeHByZXNzaW9uKGV4dHJhY3RlZE9iamVjdExpdGVyYWwubm9kZSwgZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbC5zb3VyY2UpO1xuICAgIGlmICghcGFyc2VkKSByZXR1cm47XG5cbiAgICAvLyBLZWVwIGZpbGxpbmcgbWlzc2luZyBkZWZhdWx0cywgYnV0IGRvbid0IG92ZXJ3cml0ZSBsb2NhbCBhZGp1c3RtZW50cyBvbiBldmVyeSByZWdlbmVyYXRpb24uXG4gICAgY29uc3QgbWVyZ2VkID0gbWVyZ2VQYXJzZWRPYmplY3RzKGNyZWF0ZURlZmF1bHRDb25maWcoY29uZmlnKSwgcGFyc2VkKTtcbiAgICBzZXRXZWJTZXJ2ZXJDb21tYW5kKG1lcmdlZCwgY29uZmlnKTtcblxuICAgIGNvbnN0IG5ld09iamVjdExpdGVyYWwgPSBzdHJpbmdpZnlWYWx1ZSh7IGtpbmQ6ICdvYmplY3QnLCB2YWx1ZTogbWVyZ2VkIH0sIDApO1xuICAgIGNvbnN0IHN0YXJ0ID0gZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbC5ub2RlLmdldFN0YXJ0KGV4dHJhY3RlZE9iamVjdExpdGVyYWwuc291cmNlKTtcbiAgICBjb25zdCBlbmQgPSBleHRyYWN0ZWRPYmplY3RMaXRlcmFsLm5vZGUuZ2V0RW5kKCk7XG4gICAgY29uc3QgbmV3Q29udGVudCA9IGAke29sZENvbnRlbnQuc2xpY2UoMCwgc3RhcnQpfSR7bmV3T2JqZWN0TGl0ZXJhbH0ke29sZENvbnRlbnQuc2xpY2UoZW5kKX1gO1xuXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIG1lcmdlUGFyc2VkT2JqZWN0cyhiYXNlOiBQYXJzZWRPYmplY3QsIG92ZXJyaWRlOiBQYXJzZWRPYmplY3QpOiBQYXJzZWRPYmplY3Qge1xuICBjb25zdCBvdmVycmlkZVByb3BlcnR5S2V5cyA9IG5ldyBTZXQoT2JqZWN0LmtleXMob3ZlcnJpZGUucHJvcGVydGllcykpO1xuICBjb25zdCBleHRyYU1lbWJlcnMgPSBbLi4uYmFzZS5leHRyYU1lbWJlcnMsIC4uLm92ZXJyaWRlLmV4dHJhTWVtYmVyc107XG4gIC8vIEtlZXAgZGVmYXVsdC1vbmx5IG1lbWJlcnMgYmVmb3JlIHBhcnNlZCBtZW1iZXJzIHNvIHNwcmVhZHMgYW5kIGV4cGxpY2l0IGxvY2FsIHByb3BlcnRpZXMgcmV0YWluIHByZWNlZGVuY2UuXG4gIGNvbnN0IG1lbWJlck9yZGVyID0gW1xuICAgIC4uLmJhc2UubWVtYmVyT3JkZXIuZmlsdGVyKChtZW1iZXIpID0+IG1lbWJlci5raW5kICE9PSAncHJvcGVydHknIHx8ICFvdmVycmlkZVByb3BlcnR5S2V5cy5oYXMobWVtYmVyLmtleSkpLFxuICAgIC4uLm92ZXJyaWRlLm1lbWJlck9yZGVyLm1hcCgobWVtYmVyKTogT2JqZWN0TWVtYmVyID0+IHtcbiAgICAgIGlmIChtZW1iZXIua2luZCA9PT0gJ3Byb3BlcnR5JykgcmV0dXJuIG1lbWJlcjtcbiAgICAgIHJldHVybiB7IGtpbmQ6ICdleHRyYScsIGluZGV4OiBiYXNlLmV4dHJhTWVtYmVycy5sZW5ndGggKyBtZW1iZXIuaW5kZXggfTtcbiAgICB9KSxcbiAgXTtcbiAgY29uc3QgcHJvcGVydGllcyA9IHsgLi4uYmFzZS5wcm9wZXJ0aWVzIH07XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG92ZXJyaWRlLnByb3BlcnRpZXMpKSB7XG4gICAgcHJvcGVydGllc1trZXldID0gbWVyZ2VQYXJzZWRWYWx1ZShwcm9wZXJ0aWVzW2tleV0sIHZhbHVlKTtcbiAgfVxuICByZXR1cm4geyBleHRyYU1lbWJlcnMsIG1lbWJlck9yZGVyLCBwcm9wZXJ0aWVzIH07XG59XG5cbmZ1bmN0aW9uIG1lcmdlUGFyc2VkVmFsdWUoYmFzZTogUGFyc2VkVmFsdWUgfCB1bmRlZmluZWQsIG92ZXJyaWRlOiBQYXJzZWRWYWx1ZSk6IFBhcnNlZFZhbHVlIHtcbiAgaWYgKGJhc2U/LmtpbmQgPT09ICdvYmplY3QnICYmIG92ZXJyaWRlLmtpbmQgPT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIHsga2luZDogJ29iamVjdCcsIHZhbHVlOiBtZXJnZVBhcnNlZE9iamVjdHMoYmFzZS52YWx1ZSwgb3ZlcnJpZGUudmFsdWUpIH07XG4gIH1cbiAgcmV0dXJuIG92ZXJyaWRlO1xufVxuXG5hc3luYyBmdW5jdGlvbiBhc3NlcnROZXh0UHVibGljQmFzZVVybChkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgZm9yIChjb25zdCBlbnZGaWxlUGF0aCBvZiBnZXRFbnZGaWxlUGF0aHMoZGlyUGF0aCkpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGVudkZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgaWYgKC9ORVhUX1BVQkxJQ19CQVNFX1VSTFxccyo9L20udGVzdChjb250ZW50KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBNaXNzaW5nIGVudiBmaWxlcyBhcmUgZXhwZWN0ZWQgaW4gc29tZSByZXBvcy5cbiAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoJ05FWFRfUFVCTElDX0JBU0VfVVJMIGlzIHJlcXVpcmVkIGZvciBQbGF5d3JpZ2h0LiBEZWZpbmUgTkVYVF9QVUJMSUNfQkFTRV9VUkwgaW4gdGhlIHRhcmdldCByZXBvLicpO1xufVxuXG5mdW5jdGlvbiBnZXRFbnZGaWxlUGF0aHMoZGlyUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBlbnZGaWxlTmFtZXMgPSBbJy5lbnYnLCAnLmVudi50ZXN0JywgJy5lbnYuZXhhbXBsZScsICdtaXNlLnRvbWwnLCAnbWlzZS50ZXN0LnRvbWwnXTtcbiAgY29uc3QgZW52RmlsZVBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGZvciAobGV0IGN1cnJlbnREaXJQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgpOyA7IGN1cnJlbnREaXJQYXRoID0gcGF0aC5kaXJuYW1lKGN1cnJlbnREaXJQYXRoKSkge1xuICAgIGVudkZpbGVQYXRocy5wdXNoKC4uLmVudkZpbGVOYW1lcy5tYXAoKGZpbGVOYW1lKSA9PiBwYXRoLnJlc29sdmUoY3VycmVudERpclBhdGgsIGZpbGVOYW1lKSkpO1xuXG4gICAgLy8gUGxheXdyaWdodCBjb25maWdzIG9mdGVuIGxpdmUgaW4gcGFja2FnZXMvKiB3aGlsZSBzaGFyZWQgZW52IGZpbGVzIGxpdmUgYXQgdGhlXG4gICAgLy8gcmVwb3NpdG9yeSByb290LCBzbyB3YWxrIHVwd2FyZCB1bnRpbCB0aGUgdGFyZ2V0IHJlcG8gYm91bmRhcnkuXG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGN1cnJlbnREaXJQYXRoLCAnLmdpdCcpKSkgYnJlYWs7XG5cbiAgICBjb25zdCBwYXJlbnREaXJQYXRoID0gcGF0aC5kaXJuYW1lKGN1cnJlbnREaXJQYXRoKTtcbiAgICBpZiAocGFyZW50RGlyUGF0aCA9PT0gY3VycmVudERpclBhdGgpIGJyZWFrO1xuICB9XG5cbiAgcmV0dXJuIGVudkZpbGVQYXRocztcbn1cblxuZnVuY3Rpb24gc2V0V2ViU2VydmVyQ29tbWFuZChvYmplY3Q6IFBhcnNlZE9iamVjdCwgY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogdm9pZCB7XG4gIGNvbnN0IHdlYlNlcnZlciA9IG9iamVjdC5wcm9wZXJ0aWVzLndlYlNlcnZlcjtcbiAgaWYgKHdlYlNlcnZlcj8ua2luZCAhPT0gJ29iamVjdCcpIHJldHVybjtcblxuICAvLyB3YiBvd25zIHRoZSBjYW5vbmljYWwgdGVzdC1zZXJ2ZXIgc3RhcnR1cCBwYXRoOyBrZWVwIGN1c3RvbSBQbGF5d3JpZ2h0XG4gIC8vIHNlcnZlciBzZXR0aW5ncyB3aGlsZSBub3JtYWxpemluZyB0aGUgY29tbWFuZCBpdHNlbGYuIEludm9rZSB3YiB0aHJvdWdoIHRoZVxuICAvLyBwYWNrYWdlIG1hbmFnZXIgYmVjYXVzZSB0YXJnZXQgcmVwb3MgaW5zdGFsbCB3YiBhcyBhIHBhY2thZ2UgZGVwZW5kZW5jeS5cbiAgd2ViU2VydmVyLnZhbHVlLnByb3BlcnRpZXMuY29tbWFuZCA9IGxpdGVyYWwoZ2V0V2JTdGFydFRlc3RDb21tYW5kKGNvbmZpZykpO1xufVxuXG5mdW5jdGlvbiBnZXRXYlN0YXJ0VGVzdENvbW1hbmQoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAnJHtnZXRQYWNrYWdlTWFuYWdlckNvbW1hbmQoY29uZmlnKX0gd2Igc3RhcnQgLS1tb2RlIHRlc3QnYDtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdERlZmluZUNvbmZpZ09iamVjdExpdGVyYWwoY29udGVudDogc3RyaW5nKTogRXh0cmFjdGVkT2JqZWN0TGl0ZXJhbCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHNvdXJjZSA9IHRzLmNyZWF0ZVNvdXJjZUZpbGUoJ3BsYXl3cmlnaHQuY29uZmlnLnRzJywgY29udGVudCwgdHMuU2NyaXB0VGFyZ2V0LkxhdGVzdCwgdHJ1ZSwgdHMuU2NyaXB0S2luZC5UUyk7XG5cbiAgLy8gVHlwZVNjcmlwdCBhbHJlYWR5IHVuZGVyc3RhbmRzIG5lc3RlZCBvYmplY3QgbGl0ZXJhbHMgYW5kIHRlbXBsYXRlIHN0cmluZ3MsIHNvIHVzZVxuICAvLyBpdHMgQVNUIHJhbmdlcyBpbnN0ZWFkIG9mIGEgcmVnZXggdGhhdCBjYW4gc3RvcCBhdCB0aGUgZmlyc3QgaW5uZXIgY2xvc2luZyBicmFjZS5cbiAgbGV0IGZvdW5kOiB0cy5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbiB8IHVuZGVmaW5lZDtcbiAgY29uc3QgdmlzaXQgPSAobm9kZTogdHMuTm9kZSk6IHZvaWQgPT4ge1xuICAgIGlmIChmb3VuZCkgcmV0dXJuO1xuICAgIGlmICh0cy5pc0NhbGxFeHByZXNzaW9uKG5vZGUpICYmIG5vZGUuZXhwcmVzc2lvbi5nZXRUZXh0KHNvdXJjZSkgPT09ICdkZWZpbmVDb25maWcnKSB7XG4gICAgICBjb25zdCBmaXJzdEFyZ3VtZW50ID0gbm9kZS5hcmd1bWVudHNbMF07XG4gICAgICBpZiAoZmlyc3RBcmd1bWVudCAmJiB0cy5pc09iamVjdExpdGVyYWxFeHByZXNzaW9uKGZpcnN0QXJndW1lbnQpKSB7XG4gICAgICAgIGZvdW5kID0gZmlyc3RBcmd1bWVudDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICB0cy5mb3JFYWNoQ2hpbGQobm9kZSwgdmlzaXQpO1xuICB9O1xuICB2aXNpdChzb3VyY2UpO1xuXG4gIHJldHVybiBmb3VuZCA/IHsgc291cmNlLCBub2RlOiBmb3VuZCB9IDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBwYXJzZUV4cHJlc3Npb24oZXhwcmVzc2lvbjogdHMuRXhwcmVzc2lvbiwgc291cmNlOiB0cy5Tb3VyY2VGaWxlKTogUGFyc2VkVmFsdWUgfCB1bmRlZmluZWQge1xuICBpZiAodHMuaXNPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihleHByZXNzaW9uKSkge1xuICAgIGNvbnN0IHBhcnNlZE9iamVjdCA9IHBhcnNlT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oZXhwcmVzc2lvbiwgc291cmNlKTtcbiAgICByZXR1cm4gcGFyc2VkT2JqZWN0ID8geyBraW5kOiAnb2JqZWN0JywgdmFsdWU6IHBhcnNlZE9iamVjdCB9IDogbGl0ZXJhbChleHByZXNzaW9uLmdldFRleHQoc291cmNlKSk7XG4gIH1cbiAgaWYgKHRzLmlzQXJyYXlMaXRlcmFsRXhwcmVzc2lvbihleHByZXNzaW9uKSkge1xuICAgIGNvbnN0IGVsZW1lbnRzID0gZXhwcmVzc2lvbi5lbGVtZW50cy5tYXAoKGVsZW1lbnQpID0+IHBhcnNlRXhwcmVzc2lvbihlbGVtZW50LCBzb3VyY2UpKTtcbiAgICBpZiAoZWxlbWVudHMuc29tZSgoZWxlbWVudCk6IGVsZW1lbnQgaXMgdW5kZWZpbmVkID0+IGVsZW1lbnQgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgIHJldHVybiBsaXRlcmFsKGV4cHJlc3Npb24uZ2V0VGV4dChzb3VyY2UpKTtcbiAgICB9XG4gICAgcmV0dXJuIGFzQXJyYXkoZWxlbWVudHMgYXMgUGFyc2VkVmFsdWVbXSk7XG4gIH1cbiAgcmV0dXJuIGxpdGVyYWwoZXhwcmVzc2lvbi5nZXRUZXh0KHNvdXJjZSkpO1xufVxuXG5mdW5jdGlvbiBwYXJzZU9iamVjdExpdGVyYWxFeHByZXNzaW9uKFxuICBvYmplY3RMaXRlcmFsOiB0cy5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbixcbiAgc291cmNlOiB0cy5Tb3VyY2VGaWxlXG4pOiBQYXJzZWRPYmplY3QgfCB1bmRlZmluZWQge1xuICBjb25zdCBwYXJzZWQ6IFBhcnNlZE9iamVjdCA9IHsgZXh0cmFNZW1iZXJzOiBbXSwgbWVtYmVyT3JkZXI6IFtdLCBwcm9wZXJ0aWVzOiB7fSB9O1xuICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIG9iamVjdExpdGVyYWwucHJvcGVydGllcykge1xuICAgIGlmICh0cy5pc1Nob3J0aGFuZFByb3BlcnR5QXNzaWdubWVudChwcm9wZXJ0eSkpIHtcbiAgICAgIGNvbnN0IGtleSA9IHByb3BlcnR5Lm5hbWUuZ2V0VGV4dChzb3VyY2UpO1xuICAgICAgcGFyc2VkLnByb3BlcnRpZXNba2V5XSA9IGxpdGVyYWwoa2V5KTtcbiAgICAgIHBhcnNlZC5tZW1iZXJPcmRlci5wdXNoKHsga2luZDogJ3Byb3BlcnR5Jywga2V5IH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmICghdHMuaXNQcm9wZXJ0eUFzc2lnbm1lbnQocHJvcGVydHkpIHx8ICghdHMuaXNJZGVudGlmaWVyKHByb3BlcnR5Lm5hbWUpICYmICF0cy5pc1N0cmluZ0xpdGVyYWwocHJvcGVydHkubmFtZSkpKSB7XG4gICAgICBjb25zdCBpbmRleCA9IHBhcnNlZC5leHRyYU1lbWJlcnMucHVzaChwcm9wZXJ0eS5nZXRUZXh0KHNvdXJjZSkpIC0gMTtcbiAgICAgIHBhcnNlZC5tZW1iZXJPcmRlci5wdXNoKHsga2luZDogJ2V4dHJhJywgaW5kZXggfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgdmFsdWUgPSBwYXJzZUV4cHJlc3Npb24ocHJvcGVydHkuaW5pdGlhbGl6ZXIsIHNvdXJjZSk7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICBjb25zdCBrZXkgPSBwcm9wZXJ0eS5uYW1lLmdldFRleHQoc291cmNlKTtcbiAgICBwYXJzZWQucHJvcGVydGllc1trZXldID0gdmFsdWU7XG4gICAgcGFyc2VkLm1lbWJlck9yZGVyLnB1c2goeyBraW5kOiAncHJvcGVydHknLCBrZXkgfSk7XG4gIH1cbiAgcmV0dXJuIHBhcnNlZDtcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5VmFsdWUodmFsdWU6IFBhcnNlZFZhbHVlLCBsZXZlbDogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3QgY2xvc2luZ0luZGVudCA9ICcgICcucmVwZWF0KGxldmVsKTtcbiAgaWYgKHZhbHVlLmtpbmQgPT09ICdhcnJheScpIHtcbiAgICBpZiAodmFsdWUudmFsdWUubGVuZ3RoID09PSAwKSByZXR1cm4gJ1tdJztcbiAgICBjb25zdCBpbmRlbnQgPSAnICAnLnJlcGVhdChsZXZlbCArIDEpO1xuICAgIGNvbnN0IGxpbmVzID0gdmFsdWUudmFsdWUubWFwKChpdGVtKSA9PiB7XG4gICAgICBjb25zdCBzdHJpbmdpZmllZCA9IHN0cmluZ2lmeVZhbHVlKGl0ZW0sIGxldmVsICsgMSkuc3BsaXQoJ1xcbicpO1xuICAgICAgc3RyaW5naWZpZWRbc3RyaW5naWZpZWQubGVuZ3RoIC0gMV0gPSBgJHtzdHJpbmdpZmllZC5hdCgtMSl9LGA7XG4gICAgICBpZiAoaXRlbS5raW5kID09PSAnbGl0ZXJhbCcpIHtcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAxOyBpbmRleCA8IHN0cmluZ2lmaWVkLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgICAgIHN0cmluZ2lmaWVkW2luZGV4XSA9IGAke2luZGVudH0ke3N0cmluZ2lmaWVkW2luZGV4XX1gO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzdHJpbmdpZmllZFswXSA9IGAke2luZGVudH0ke3N0cmluZ2lmaWVkWzBdfWA7XG4gICAgICByZXR1cm4gc3RyaW5naWZpZWQuam9pbignXFxuJyk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGBbXFxuJHtsaW5lcy5qb2luKCdcXG4nKX1cXG4ke2Nsb3NpbmdJbmRlbnR9XWA7XG4gIH1cbiAgaWYgKHZhbHVlLmtpbmQgPT09ICdsaXRlcmFsJykgcmV0dXJuIHZhbHVlLnZhbHVlO1xuXG4gIGNvbnN0IGluZGVudCA9ICcgICcucmVwZWF0KGxldmVsICsgMSk7XG4gIGNvbnN0IGVtaXR0ZWRQcm9wZXJ0aWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IGxhc3RQcm9wZXJ0eUluZGV4QnlLZXkgPSBnZXRMYXN0UHJvcGVydHlJbmRleEJ5S2V5KHZhbHVlLnZhbHVlLm1lbWJlck9yZGVyKTtcbiAgY29uc3QgbGluZXMgPSB2YWx1ZS52YWx1ZS5tZW1iZXJPcmRlci5mbGF0TWFwKChtZW1iZXIsIGluZGV4KSA9PiB7XG4gICAgaWYgKG1lbWJlci5raW5kID09PSAnZXh0cmEnKSB7XG4gICAgICByZXR1cm4gW3N0cmluZ2lmeU9iamVjdE1lbWJlcih2YWx1ZS52YWx1ZS5leHRyYU1lbWJlcnNbbWVtYmVyLmluZGV4XSA/PyAnJywgaW5kZW50KV07XG4gICAgfVxuXG4gICAgaWYgKGxhc3RQcm9wZXJ0eUluZGV4QnlLZXkuZ2V0KG1lbWJlci5rZXkpICE9PSBpbmRleCkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IGl0ZW0gPSB2YWx1ZS52YWx1ZS5wcm9wZXJ0aWVzW21lbWJlci5rZXldO1xuICAgIGlmICghaXRlbSB8fCBlbWl0dGVkUHJvcGVydGllcy5oYXMobWVtYmVyLmtleSkpIHJldHVybiBbXTtcbiAgICBlbWl0dGVkUHJvcGVydGllcy5hZGQobWVtYmVyLmtleSk7XG4gICAgcmV0dXJuIFtzdHJpbmdpZnlPYmplY3RQcm9wZXJ0eShtZW1iZXIua2V5LCBpdGVtLCBsZXZlbCwgaW5kZW50KV07XG4gIH0pO1xuICBsaW5lcy5wdXNoKFxuICAgIC4uLk9iamVjdC5lbnRyaWVzKHZhbHVlLnZhbHVlLnByb3BlcnRpZXMpXG4gICAgICAuZmlsdGVyKChba2V5XSkgPT4gIWVtaXR0ZWRQcm9wZXJ0aWVzLmhhcyhrZXkpKVxuICAgICAgLm1hcCgoW2tleSwgaXRlbV0pID0+IHN0cmluZ2lmeU9iamVjdFByb3BlcnR5KGtleSwgaXRlbSwgbGV2ZWwsIGluZGVudCkpXG4gICk7XG4gIGlmIChsaW5lcy5sZW5ndGggPT09IDApIHJldHVybiBge1xcbiR7Y2xvc2luZ0luZGVudH19YDtcbiAgcmV0dXJuIGB7XFxuJHtsaW5lcy5qb2luKCdcXG4nKX1cXG4ke2Nsb3NpbmdJbmRlbnR9fWA7XG59XG5cbmZ1bmN0aW9uIGdldExhc3RQcm9wZXJ0eUluZGV4QnlLZXkobWVtYmVyT3JkZXI6IE9iamVjdE1lbWJlcltdKTogTWFwPHN0cmluZywgbnVtYmVyPiB7XG4gIGNvbnN0IGxhc3RQcm9wZXJ0eUluZGV4QnlLZXkgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICBmb3IgKGNvbnN0IFtpbmRleCwgbWVtYmVyXSBvZiBtZW1iZXJPcmRlci5lbnRyaWVzKCkpIHtcbiAgICBpZiAobWVtYmVyLmtpbmQgPT09ICdwcm9wZXJ0eScpIHtcbiAgICAgIGxhc3RQcm9wZXJ0eUluZGV4QnlLZXkuc2V0KG1lbWJlci5rZXksIGluZGV4KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGxhc3RQcm9wZXJ0eUluZGV4QnlLZXk7XG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeU9iamVjdFByb3BlcnR5KGtleTogc3RyaW5nLCBpdGVtOiBQYXJzZWRWYWx1ZSwgbGV2ZWw6IG51bWJlciwgaW5kZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBzdHJpbmdpZmllZCA9IHN0cmluZ2lmeVZhbHVlKGl0ZW0sIGxldmVsICsgMSkuc3BsaXQoJ1xcbicpO1xuICBzdHJpbmdpZmllZFtzdHJpbmdpZmllZC5sZW5ndGggLSAxXSA9IGAke3N0cmluZ2lmaWVkLmF0KC0xKX0sYDtcbiAgaWYgKGl0ZW0ua2luZCA9PT0gJ2xpdGVyYWwnKSB7XG4gICAgZm9yIChsZXQgaW5kZXggPSAxOyBpbmRleCA8IHN0cmluZ2lmaWVkLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgc3RyaW5naWZpZWRbaW5kZXhdID0gYCR7aW5kZW50fSR7c3RyaW5naWZpZWRbaW5kZXhdfWA7XG4gICAgfVxuICB9XG4gIHN0cmluZ2lmaWVkWzBdID0gYCR7aW5kZW50fSR7a2V5fTogJHtzdHJpbmdpZmllZFswXX1gO1xuICByZXR1cm4gc3RyaW5naWZpZWQuam9pbignXFxuJyk7XG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeU9iamVjdE1lbWJlcihtZW1iZXI6IHN0cmluZywgaW5kZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBzdHJpbmdpZmllZCA9IG1lbWJlci5zcGxpdCgnXFxuJyk7XG4gIHN0cmluZ2lmaWVkW3N0cmluZ2lmaWVkLmxlbmd0aCAtIDFdID0gYCR7c3RyaW5naWZpZWQuYXQoLTEpfSxgO1xuICBmb3IgKGNvbnN0IFtpbmRleCwgbGluZV0gb2Ygc3RyaW5naWZpZWQuZW50cmllcygpKSB7XG4gICAgc3RyaW5naWZpZWRbaW5kZXhdID0gYCR7aW5kZW50fSR7bGluZX1gO1xuICB9XG4gIHJldHVybiBzdHJpbmdpZmllZC5qb2luKCdcXG4nKTtcbn1cbiIsImV4cG9ydCBjb25zdCBnbG9iSWdub3JlID0gW1xuICAnKiovbm9kZV9tb2R1bGVzLyoqJyxcbiAgJyoqLy52ZW52LyoqJyxcbiAgJyoqL3Rlc3QtZml4dHVyZXMvKionLFxuICAnKiovdGVzdC9maXh0dXJlcy8qKicsXG4gICcqKi9kaXN0LyoqJyxcbiAgJyoqL2J1aWxkLyoqJyxcbiAgJyoqL3RhcmdldC8qKicsXG4gICcqKi90ZW1wLyoqJyxcbiAgJyoqL3RtcC8qKicsXG5dO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYic7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdsb2JJZ25vcmUgfSBmcm9tICcuLi91dGlscy9nbG9iVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhQcmlzbWFFbnZGaWxlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhQcmlzbWFFbnZGaWxlcycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBzaG91bGRBZGRDb25uZWN0aW9uTGltaXQgPSBzaG91bGRBZGRTcWxpdGVDb25uZWN0aW9uTGltaXQoY29uZmlnKTtcbiAgICBjb25zdCBlbnZGaWxlcyA9IGF3YWl0IGZnLmdsb2IoWycqLmVudicsICcqLmVudi4qJ10sIHsgZG90OiB0cnVlLCBjd2Q6IGNvbmZpZy5kaXJQYXRoLCBpZ25vcmU6IGdsb2JJZ25vcmUgfSk7XG4gICAgZm9yIChjb25zdCBlbnZGaWxlIG9mIGVudkZpbGVzKSB7XG4gICAgICBjb25zdCBlbnZGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgZW52RmlsZSk7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoZW52RmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBuZXdDb250ZW50ID0gY29udGVudC5yZXBsYWNlQWxsKFxuICAgICAgICAvREFUQUJBU0VfVVJMXFxzKj1cXHMqXCI/KFteXCIjXFxuXSs/XFwuc3FsaXRlM1teXCIjXFxuXSopXCI/L2csXG4gICAgICAgIChtYXRjaCwgdXJsOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICByZXR1cm4gYERBVEFCQVNFX1VSTD1cIiR7bm9ybWFsaXplU3FsaXRlRGF0YWJhc2VVcmwodXJsLCBzaG91bGRBZGRDb25uZWN0aW9uTGltaXQpfVwiYDtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIGlmIChuZXdDb250ZW50ICE9PSBjb250ZW50KSB7XG4gICAgICAgIGF3YWl0IGZzLndyaXRlRmlsZShlbnZGaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkQWRkU3FsaXRlQ29ubmVjdGlvbkxpbWl0KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICBpZiAoIWNvbmZpZy5kZXBlbmRpbmcucHJpc21hKSByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3QgZGVwZW5kZW5jaWVzID0ge1xuICAgIC4uLmNvbmZpZy5wYWNrYWdlSnNvbj8uZGVwZW5kZW5jaWVzLFxuICAgIC4uLmNvbmZpZy5wYWNrYWdlSnNvbj8uZGV2RGVwZW5kZW5jaWVzLFxuICB9O1xuXG4gIC8vIGBjb25uZWN0aW9uX2xpbWl0PTFgIG9ubHkgYXBwbGllcyB0byBQcmlzbWEncyBTUUxpdGUgZGF0YXNvdXJjZSBoYW5kbGluZy5cbiAgLy8gUmVwb3MgdGhhdCBvcHQgaW50byBub24tcHVyZSBTUUxpdGUgYWRhcHRlcnMgc2hvdWxkIGtlZXAgdGhlaXIgVVJMIGFzLWlzLlxuICByZXR1cm4gIWRlcGVuZGVuY2llc1snQHByaXNtYS9hZGFwdGVyLWJldHRlci1zcWxpdGUzJ10gJiYgIWRlcGVuZGVuY2llc1snQHByaXNtYS9hZGFwdGVyLWxpYnNxbCddO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVTcWxpdGVEYXRhYmFzZVVybCh1cmw6IHN0cmluZywgc2hvdWxkQWRkQ29ubmVjdGlvbkxpbWl0OiBib29sZWFuKTogc3RyaW5nIHtcbiAgY29uc3QgcXVlcnlTdGFydCA9IHVybC5pbmRleE9mKCc/Jyk7XG4gIGNvbnN0IHBhdGhQYXJ0ID0gcXVlcnlTdGFydCAhPT0gLTEgPyB1cmwuc2xpY2UoMCwgcXVlcnlTdGFydCkgOiB1cmw7XG4gIGNvbnN0IHF1ZXJ5UGFydCA9IHF1ZXJ5U3RhcnQgIT09IC0xID8gdXJsLnNsaWNlKHF1ZXJ5U3RhcnQgKyAxKSA6ICcnO1xuICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHF1ZXJ5UGFydCk7XG5cbiAgcGFyYW1zLmRlbGV0ZSgnY29ubmVjdGlvbl9saW1pdCcpO1xuICBpZiAoc2hvdWxkQWRkQ29ubmVjdGlvbkxpbWl0KSB7XG4gICAgcGFyYW1zLnNldCgnY29ubmVjdGlvbl9saW1pdCcsICcxJyk7XG4gIH1cblxuICBjb25zdCBub3JtYWxpemVkUXVlcnkgPSBwYXJhbXMudG9TdHJpbmcoKTtcbiAgcmV0dXJuIG5vcm1hbGl6ZWRRdWVyeSA/IGAke3BhdGhQYXJ0fT8ke25vcm1hbGl6ZWRRdWVyeX1gIDogcGF0aFBhcnQ7XG59XG4iLCJjb25zdCBoYXMgPSAob2JqZWN0LCBrZXkpID0+IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSlcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc29ydE9iamVjdEJ5S2V5TmFtZUxpc3Qob2JqZWN0LCBzb3J0V2l0aCkge1xuICBsZXQga2V5cywgc29ydEZuLCBrZXlcblxuICBpZiAodHlwZW9mIHNvcnRXaXRoID09PSAnZnVuY3Rpb24nKSB7XG4gICAgc29ydEZuID0gc29ydFdpdGhcbiAgfSBlbHNlIHtcbiAgICBrZXlzID0gc29ydFdpdGhcbiAgfVxuXG4gIGNvbnN0IHRvdGFsID0ge31cbiAgY29uc3Qgb2JqZWN0S2V5cyA9IFsuLi4oa2V5cyA/PyBbXSksIC4uLk9iamVjdC5rZXlzKG9iamVjdCkuc29ydChzb3J0Rm4pXVxuXG4gIGZvciAoa2V5IG9mIG9iamVjdEtleXMpIHtcbiAgICBpZiAoaGFzKG9iamVjdCwga2V5KSkge1xuICAgICAgdG90YWxba2V5XSA9IG9iamVjdFtrZXldXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRvdGFsXG59XG4iLCIvLyBEZXRlY3QgZWl0aGVyIHNwYWNlcyBvciB0YWJzIGJ1dCBub3QgYm90aCB0byBwcm9wZXJseSBoYW5kbGUgdGFicyBmb3IgaW5kZW50YXRpb24gYW5kIHNwYWNlcyBmb3IgYWxpZ25tZW50XG5jb25zdCBJTkRFTlRfUkVHRVggPSAvXig/OiggKSt8XFx0KykvO1xuXG5jb25zdCBJTkRFTlRfVFlQRV9TUEFDRSA9ICdzcGFjZSc7XG5jb25zdCBJTkRFTlRfVFlQRV9UQUIgPSAndGFiJztcblxuLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNoZWNrIGlmIHdlIHNob3VsZCBpZ25vcmUgc2luZ2xlIHNwYWNlIHBhdHRlcm5zXG5mdW5jdGlvbiBzaG91bGRJZ25vcmVTaW5nbGVTcGFjZShpZ25vcmVTaW5nbGVTcGFjZXMsIGluZGVudFR5cGUsIHZhbHVlKSB7XG5cdHJldHVybiBpZ25vcmVTaW5nbGVTcGFjZXMgJiYgaW5kZW50VHlwZSA9PT0gSU5ERU5UX1RZUEVfU1BBQ0UgJiYgdmFsdWUgPT09IDE7XG59XG5cbi8qKlxuTWFrZSBhIE1hcCB0aGF0IGNvdW50cyBob3cgbWFueSBpbmRlbnRzL3VuaW5kZW50cyBoYXZlIG9jY3VycmVkIGZvciBhIGdpdmVuIHNpemUgYW5kIGhvdyBtYW55IGxpbmVzIGZvbGxvdyBhIGdpdmVuIGluZGVudGF0aW9uLlxuXG5UaGUga2V5IGlzIGEgY29uY2F0ZW5hdGlvbiBvZiB0aGUgaW5kZW50YXRpb24gdHlwZSAocyA9IHNwYWNlIGFuZCB0ID0gdGFiKSBhbmQgdGhlIHNpemUgb2YgdGhlIGluZGVudHMvdW5pbmRlbnRzLlxuXG5gYGBcbmluZGVudHMgPSB7XG5cdHQzOiBbMSwgMF0sXG5cdHQ0OiBbMSwgNV0sXG5cdHM1OiBbMSwgMF0sXG5cdHMxMjogWzEsIDBdLFxufVxuYGBgXG4qL1xuZnVuY3Rpb24gbWFrZUluZGVudHNNYXAoc3RyaW5nLCBpZ25vcmVTaW5nbGVTcGFjZXMpIHtcblx0Y29uc3QgaW5kZW50cyA9IG5ldyBNYXAoKTtcblxuXHQvLyBSZW1lbWJlciB0aGUgc2l6ZSBvZiBwcmV2aW91cyBsaW5lJ3MgaW5kZW50YXRpb25cblx0bGV0IHByZXZpb3VzU2l6ZSA9IDA7XG5cdGxldCBwcmV2aW91c0luZGVudFR5cGU7XG5cblx0Ly8gSW5kZW50cyBrZXkgKGlkZW50IHR5cGUgKyBzaXplIG9mIHRoZSBpbmRlbnRzL3VuaW5kZW50cylcblx0bGV0IGtleTtcblxuXHRmb3IgKGNvbnN0IGxpbmUgb2Ygc3RyaW5nLnNwbGl0KC9cXG4vZykpIHtcblx0XHRpZiAoIWxpbmUpIHtcblx0XHRcdC8vIElnbm9yZSBlbXB0eSBsaW5lc1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXG5cdFx0Y29uc3QgbWF0Y2hlcyA9IGxpbmUubWF0Y2goSU5ERU5UX1JFR0VYKTtcblxuXHRcdGlmIChtYXRjaGVzID09PSBudWxsKSB7XG5cdFx0XHRwcmV2aW91c1NpemUgPSAwO1xuXHRcdFx0cHJldmlvdXNJbmRlbnRUeXBlID0gJyc7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IGluZGVudCA9IG1hdGNoZXNbMF0ubGVuZ3RoO1xuXHRcdFx0Y29uc3QgaW5kZW50VHlwZSA9IG1hdGNoZXNbMV0gPyBJTkRFTlRfVFlQRV9TUEFDRSA6IElOREVOVF9UWVBFX1RBQjtcblxuXHRcdFx0Ly8gSWdub3JlIHNpbmdsZSBzcGFjZSB1bmxlc3MgaXQncyB0aGUgb25seSBpbmRlbnQgZGV0ZWN0ZWQgdG8gcHJldmVudCBjb21tb24gZmFsc2UgcG9zaXRpdmVzXG5cdFx0XHRpZiAoc2hvdWxkSWdub3JlU2luZ2xlU3BhY2UoaWdub3JlU2luZ2xlU3BhY2VzLCBpbmRlbnRUeXBlLCBpbmRlbnQpKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoaW5kZW50VHlwZSAhPT0gcHJldmlvdXNJbmRlbnRUeXBlKSB7XG5cdFx0XHRcdHByZXZpb3VzU2l6ZSA9IDA7XG5cdFx0XHR9XG5cblx0XHRcdHByZXZpb3VzSW5kZW50VHlwZSA9IGluZGVudFR5cGU7XG5cblx0XHRcdGxldCB1c2UgPSAxO1xuXHRcdFx0bGV0IHdlaWdodCA9IDA7XG5cblx0XHRcdGNvbnN0IGluZGVudERpZmZlcmVuY2UgPSBpbmRlbnQgLSBwcmV2aW91c1NpemU7XG5cdFx0XHRwcmV2aW91c1NpemUgPSBpbmRlbnQ7XG5cblx0XHRcdC8vIFByZXZpb3VzIGxpbmUgaGF2ZSBzYW1lIGluZGVudD9cblx0XHRcdGlmIChpbmRlbnREaWZmZXJlbmNlID09PSAwKSB7XG5cdFx0XHRcdC8vIE5vdCBhIG5ldyBcInVzZVwiIG9mIHRoZSBjdXJyZW50IGluZGVudDpcblx0XHRcdFx0dXNlID0gMDtcblx0XHRcdFx0Ly8gQnV0IGRvIGFkZCBhIGJpdCB0byBpdCBmb3IgYnJlYWtpbmcgdGllczpcblx0XHRcdFx0d2VpZ2h0ID0gMTtcblx0XHRcdFx0Ly8gV2UgdXNlIHRoZSBrZXkgZnJvbSBwcmV2aW91cyBsb29wXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBhYnNvbHV0ZUluZGVudERpZmZlcmVuY2UgPSBNYXRoLmFicyhpbmRlbnREaWZmZXJlbmNlKTtcblxuXHRcdFx0XHQvLyBJZ25vcmUgc2luZ2xlIHNwYWNlIGNoYW5nZXMgd2hlbiBpZ25vcmVTaW5nbGVTcGFjZXMgaXMgdHJ1ZVxuXHRcdFx0XHQvLyBUaGlzIHByZXZlbnRzIGNvbW1vbiBmYWxzZSBwb3NpdGl2ZXMgZnJvbSB0aGluZ3MgbGlrZSBhbGlnbmVkIGNvbW1lbnRzXG5cdFx0XHRcdGlmIChzaG91bGRJZ25vcmVTaW5nbGVTcGFjZShpZ25vcmVTaW5nbGVTcGFjZXMsIGluZGVudFR5cGUsIGFic29sdXRlSW5kZW50RGlmZmVyZW5jZSkpIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGtleSA9IGVuY29kZUluZGVudHNLZXkoaW5kZW50VHlwZSwgYWJzb2x1dGVJbmRlbnREaWZmZXJlbmNlKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gVXBkYXRlIHRoZSBzdGF0c1xuXHRcdFx0Y29uc3QgZW50cnkgPSBpbmRlbnRzLmdldChrZXkpO1xuXHRcdFx0aW5kZW50cy5zZXQoa2V5LCBlbnRyeSA9PT0gdW5kZWZpbmVkID8gWzEsIDBdIDogW2VudHJ5WzBdICsgdXNlLCBlbnRyeVsxXSArIHdlaWdodF0pO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBpbmRlbnRzO1xufVxuXG4vLyBFbmNvZGUgdGhlIGluZGVudCB0eXBlIGFuZCBhbW91bnQgYXMgYSBzdHJpbmcgKGUuZy4gJ3M0JykgZm9yIHVzZSBhcyBhIGNvbXBvdW5kIGtleSBpbiB0aGUgaW5kZW50cyBNYXAuXG5mdW5jdGlvbiBlbmNvZGVJbmRlbnRzS2V5KGluZGVudFR5cGUsIGluZGVudEFtb3VudCkge1xuXHRjb25zdCB0eXBlQ2hhcmFjdGVyID0gaW5kZW50VHlwZSA9PT0gSU5ERU5UX1RZUEVfU1BBQ0UgPyAncycgOiAndCc7XG5cdHJldHVybiB0eXBlQ2hhcmFjdGVyICsgU3RyaW5nKGluZGVudEFtb3VudCk7XG59XG5cbi8vIEV4dHJhY3QgdGhlIGluZGVudCB0eXBlIGFuZCBhbW91bnQgZnJvbSBhIGtleSBvZiB0aGUgaW5kZW50cyBNYXAuXG5mdW5jdGlvbiBkZWNvZGVJbmRlbnRzS2V5KGluZGVudHNLZXkpIHtcblx0Y29uc3Qga2V5SGFzVHlwZVNwYWNlID0gaW5kZW50c0tleVswXSA9PT0gJ3MnO1xuXHRjb25zdCB0eXBlID0ga2V5SGFzVHlwZVNwYWNlID8gSU5ERU5UX1RZUEVfU1BBQ0UgOiBJTkRFTlRfVFlQRV9UQUI7XG5cblx0Y29uc3QgYW1vdW50ID0gTnVtYmVyKGluZGVudHNLZXkuc2xpY2UoMSkpO1xuXG5cdHJldHVybiB7dHlwZSwgYW1vdW50fTtcbn1cblxuLy8gUmV0dXJuIHRoZSBrZXkgKGUuZy4gJ3M0JykgZnJvbSB0aGUgaW5kZW50cyBNYXAgdGhhdCByZXByZXNlbnRzIHRoZSBtb3N0IGNvbW1vbiBpbmRlbnQsXG4vLyBvciByZXR1cm4gdW5kZWZpbmVkIGlmIHRoZXJlIGFyZSBubyBpbmRlbnRzLlxuZnVuY3Rpb24gZ2V0TW9zdFVzZWRLZXkoaW5kZW50cykge1xuXHRsZXQgcmVzdWx0O1xuXHRsZXQgbWF4VXNlZCA9IDA7XG5cdGxldCBtYXhXZWlnaHQgPSAwO1xuXG5cdGZvciAoY29uc3QgW2tleSwgW3VzZWRDb3VudCwgd2VpZ2h0XV0gb2YgaW5kZW50cykge1xuXHRcdGlmICh1c2VkQ291bnQgPiBtYXhVc2VkIHx8ICh1c2VkQ291bnQgPT09IG1heFVzZWQgJiYgd2VpZ2h0ID4gbWF4V2VpZ2h0KSkge1xuXHRcdFx0bWF4VXNlZCA9IHVzZWRDb3VudDtcblx0XHRcdG1heFdlaWdodCA9IHdlaWdodDtcblx0XHRcdHJlc3VsdCA9IGtleTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBtYWtlSW5kZW50U3RyaW5nKHR5cGUsIGFtb3VudCkge1xuXHRjb25zdCBpbmRlbnRDaGFyYWN0ZXIgPSB0eXBlID09PSBJTkRFTlRfVFlQRV9TUEFDRSA/ICcgJyA6ICdcXHQnO1xuXHRyZXR1cm4gaW5kZW50Q2hhcmFjdGVyLnJlcGVhdChhbW91bnQpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBkZXRlY3RJbmRlbnQoc3RyaW5nKSB7XG5cdGlmICh0eXBlb2Ygc3RyaW5nICE9PSAnc3RyaW5nJykge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIGEgc3RyaW5nJyk7XG5cdH1cblxuXHQvLyBJZGVudGlmeSBpbmRlbnRzIHdoaWxlIHNraXBwaW5nIHNpbmdsZSBzcGFjZSBpbmRlbnRzIHRvIGF2b2lkIGNvbW1vbiBlZGdlIGNhc2VzIChlLmcuIGNvZGUgY29tbWVudHMpXG5cdC8vIElmIG5vIGluZGVudHMgYXJlIGlkZW50aWZpZWQsIHJ1biBhZ2FpbiBhbmQgaW5jbHVkZSBhbGwgaW5kZW50cyBmb3IgY29tcHJlaGVuc2l2ZSBkZXRlY3Rpb25cblx0bGV0IGluZGVudHMgPSBtYWtlSW5kZW50c01hcChzdHJpbmcsIHRydWUpO1xuXHRpZiAoaW5kZW50cy5zaXplID09PSAwKSB7XG5cdFx0aW5kZW50cyA9IG1ha2VJbmRlbnRzTWFwKHN0cmluZywgZmFsc2UpO1xuXHR9XG5cblx0Y29uc3Qga2V5T2ZNb3N0VXNlZEluZGVudCA9IGdldE1vc3RVc2VkS2V5KGluZGVudHMpO1xuXG5cdGxldCB0eXBlO1xuXHRsZXQgYW1vdW50ID0gMDtcblx0bGV0IGluZGVudCA9ICcnO1xuXG5cdGlmIChrZXlPZk1vc3RVc2VkSW5kZW50ICE9PSB1bmRlZmluZWQpIHtcblx0XHQoe3R5cGUsIGFtb3VudH0gPSBkZWNvZGVJbmRlbnRzS2V5KGtleU9mTW9zdFVzZWRJbmRlbnQpKTtcblx0XHRpbmRlbnQgPSBtYWtlSW5kZW50U3RyaW5nKHR5cGUsIGFtb3VudCk7XG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdGFtb3VudCxcblx0XHR0eXBlLFxuXHRcdGluZGVudCxcblx0fTtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBkZXRlY3ROZXdsaW5lKHN0cmluZykge1xuXHRpZiAodHlwZW9mIHN0cmluZyAhPT0gJ3N0cmluZycpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBhIHN0cmluZycpO1xuXHR9XG5cblx0Y29uc3QgbmV3bGluZXMgPSBzdHJpbmcubWF0Y2goLyg/Olxccj9cXG4pL2cpIHx8IFtdO1xuXG5cdGlmIChuZXdsaW5lcy5sZW5ndGggPT09IDApIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRjb25zdCBjcmxmID0gbmV3bGluZXMuZmlsdGVyKG5ld2xpbmUgPT4gbmV3bGluZSA9PT0gJ1xcclxcbicpLmxlbmd0aDtcblx0Y29uc3QgbGYgPSBuZXdsaW5lcy5sZW5ndGggLSBjcmxmO1xuXG5cdHJldHVybiBjcmxmID4gbGYgPyAnXFxyXFxuJyA6ICdcXG4nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGV0ZWN0TmV3bGluZUdyYWNlZnVsKHN0cmluZykge1xuXHRyZXR1cm4gKHR5cGVvZiBzdHJpbmcgPT09ICdzdHJpbmcnICYmIGRldGVjdE5ld2xpbmUoc3RyaW5nKSkgfHwgJ1xcbic7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcydcbmltcG9ydCBzb3J0T2JqZWN0S2V5cyBmcm9tICdzb3J0LW9iamVjdC1rZXlzJ1xuaW1wb3J0IGRldGVjdEluZGVudCBmcm9tICdkZXRlY3QtaW5kZW50J1xuaW1wb3J0IHsgZGV0ZWN0TmV3bGluZUdyYWNlZnVsIGFzIGRldGVjdE5ld2xpbmUgfSBmcm9tICdkZXRlY3QtbmV3bGluZSdcbmltcG9ydCBnaXRIb29rcyBmcm9tICdnaXQtaG9va3MtbGlzdCdcbmltcG9ydCBpc1BsYWluT2JqZWN0IGZyb20gJ2lzLXBsYWluLW9iaidcbmltcG9ydCBzZW12ZXJDb21wYXJlIGZyb20gJ3NlbXZlci9mdW5jdGlvbnMvY29tcGFyZS5qcydcbmltcG9ydCBzZW12ZXJNaW5WZXJzaW9uIGZyb20gJ3NlbXZlci9yYW5nZXMvbWluLXZlcnNpb24uanMnXG5cbmNvbnN0IHBpcGUgPVxuICAoZm5zKSA9PlxuICAoeCwgLi4uYXJncykgPT5cbiAgICBmbnMucmVkdWNlKChyZXN1bHQsIGZuKSA9PiBmbihyZXN1bHQsIC4uLmFyZ3MpLCB4KVxuY29uc3Qgb25BcnJheSA9IChmbikgPT4gKHgpID0+IChBcnJheS5pc0FycmF5KHgpID8gZm4oeCkgOiB4KVxuY29uc3Qgb25TdHJpbmdBcnJheSA9IChmbikgPT4gKHgpID0+XG4gIEFycmF5LmlzQXJyYXkoeCkgJiYgeC5ldmVyeSgoaXRlbSkgPT4gdHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnKSA/IGZuKHgpIDogeFxuY29uc3QgdW5pcSA9IG9uU3RyaW5nQXJyYXkoKHhzKSA9PiBbLi4ubmV3IFNldCh4cyldKVxuY29uc3Qgc29ydEFycmF5ID0gb25TdHJpbmdBcnJheSgoYXJyYXkpID0+IGFycmF5LnRvU29ydGVkKCkpXG5jb25zdCB1bmlxQW5kU29ydEFycmF5ID0gcGlwZShbdW5pcSwgc29ydEFycmF5XSlcbmNvbnN0IG9uT2JqZWN0ID1cbiAgKGZuKSA9PlxuICAoeCwgLi4uYXJncykgPT5cbiAgICBpc1BsYWluT2JqZWN0KHgpID8gZm4oeCwgLi4uYXJncykgOiB4XG5jb25zdCBzb3J0T2JqZWN0QnkgPSAoY29tcGFyYXRvciwgZGVlcCkgPT4ge1xuICBjb25zdCBvdmVyID0gb25PYmplY3QoKG9iamVjdCkgPT4ge1xuICAgIGlmIChkZWVwKSB7XG4gICAgICBvYmplY3QgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKG9iamVjdCkubWFwKChba2V5LCB2YWx1ZV0pID0+IFtrZXksIG92ZXIodmFsdWUpXSksXG4gICAgICApXG4gICAgfVxuXG4gICAgcmV0dXJuIHNvcnRPYmplY3RLZXlzKG9iamVjdCwgY29tcGFyYXRvcilcbiAgfSlcblxuICByZXR1cm4gb3ZlclxufVxuY29uc3Qgb2JqZWN0R3JvdXBCeSA9XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuL25vLXVuc3VwcG9ydGVkLWZlYXR1cmVzL2VzLWJ1aWx0aW5zLCBuL25vLXVuc3VwcG9ydGVkLWZlYXR1cmVzL2VzLXN5bnRheCAtLSBTYWZlXG4gIE9iamVjdC5ncm91cEJ5IHx8XG4gIC8vIFJlbW92ZSB0aGlzIHdoZW4gd2UgZHJvcCBzdXBwb3J0IGZvciBOb2RlLmpzIDIwXG4gICgoYXJyYXksIGNhbGxiYWNrKSA9PiB7XG4gICAgY29uc3QgcmVzdWx0ID0gT2JqZWN0LmNyZWF0ZShudWxsKVxuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgYXJyYXkpIHtcbiAgICAgIGNvbnN0IGtleSA9IGNhbGxiYWNrKHZhbHVlKVxuICAgICAgaWYgKHJlc3VsdFtrZXldKSB7XG4gICAgICAgIHJlc3VsdFtrZXldLnB1c2godmFsdWUpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHRba2V5XSA9IFt2YWx1ZV1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9KVxuY29uc3Qgc29ydE9iamVjdCA9IHNvcnRPYmplY3RCeSgpXG5jb25zdCBzb3J0VVJMT2JqZWN0ID0gc29ydE9iamVjdEJ5KFsndHlwZScsICd1cmwnXSlcbmNvbnN0IHNvcnRQZW9wbGVPYmplY3QgPSBzb3J0T2JqZWN0QnkoWyduYW1lJywgJ2VtYWlsJywgJ3VybCddKVxuY29uc3Qgc29ydERpcmVjdG9yaWVzID0gc29ydE9iamVjdEJ5KFtcbiAgJ2xpYicsXG4gICdiaW4nLFxuICAnbWFuJyxcbiAgJ2RvYycsXG4gICdleGFtcGxlJyxcbiAgJ3Rlc3QnLFxuXSlcbmNvbnN0IG92ZXJQcm9wZXJ0eSA9IChwcm9wZXJ0eSwgb3ZlcikgPT5cbiAgb25PYmplY3QoKG9iamVjdCwgLi4uYXJncykgPT5cbiAgICBPYmplY3QuaGFzT3duKG9iamVjdCwgcHJvcGVydHkpXG4gICAgICA/IHsgLi4ub2JqZWN0LCBbcHJvcGVydHldOiBvdmVyKG9iamVjdFtwcm9wZXJ0eV0sIC4uLmFyZ3MpIH1cbiAgICAgIDogb2JqZWN0LFxuICApXG5jb25zdCBzb3J0R2l0SG9va3MgPSBzb3J0T2JqZWN0QnkoZ2l0SG9va3MpXG5cbmNvbnN0IHBhcnNlTmFtZUFuZFZlcnNpb25SYW5nZSA9IChzcGVjaWZpZXIpID0+IHtcbiAgLy8gSWdub3JlIGFueXRoaW5nIGFmdGVyID4gJiByZWx5IG9uIGZhbGxiYWNrIGFscGhhbnVtZXJpYyBzb3J0aW5nIGZvciB0aGF0XG4gIGNvbnN0IFtuYW1lQW5kVmVyc2lvbl0gPSBzcGVjaWZpZXIuc3BsaXQoJz4nKVxuICBjb25zdCBhdE1hdGNoZXMgPSBbLi4ubmFtZUFuZFZlcnNpb24ubWF0Y2hBbGwoJ0AnKV1cbiAgaWYgKFxuICAgICFhdE1hdGNoZXMubGVuZ3RoIHx8XG4gICAgKGF0TWF0Y2hlcy5sZW5ndGggPT09IDEgJiYgYXRNYXRjaGVzWzBdLmluZGV4ID09PSAwKVxuICApIHtcbiAgICByZXR1cm4geyBuYW1lOiBzcGVjaWZpZXIgfVxuICB9XG4gIGNvbnN0IHNwbGl0SW5kZXggPSBhdE1hdGNoZXMucG9wKCkuaW5kZXhcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBuYW1lQW5kVmVyc2lvbi5zdWJzdHJpbmcoMCwgc3BsaXRJbmRleCksXG4gICAgcmFuZ2U6IG5hbWVBbmRWZXJzaW9uLnN1YnN0cmluZyhzcGxpdEluZGV4ICsgMSksXG4gIH1cbn1cblxuY29uc3Qgc29ydE9iamVjdEJ5U2VtdmVyID0gc29ydE9iamVjdEJ5KChhLCBiKSA9PiB7XG4gIGNvbnN0IHsgbmFtZTogYU5hbWUsIHJhbmdlOiBhUmFuZ2UgfSA9IHBhcnNlTmFtZUFuZFZlcnNpb25SYW5nZShhKVxuICBjb25zdCB7IG5hbWU6IGJOYW1lLCByYW5nZTogYlJhbmdlIH0gPSBwYXJzZU5hbWVBbmRWZXJzaW9uUmFuZ2UoYilcblxuICBpZiAoYU5hbWUgIT09IGJOYW1lKSB7XG4gICAgcmV0dXJuIGFOYW1lLmxvY2FsZUNvbXBhcmUoYk5hbWUsICdlbicpXG4gIH1cbiAgaWYgKCFhUmFuZ2UpIHtcbiAgICByZXR1cm4gLTFcbiAgfVxuICBpZiAoIWJSYW5nZSkge1xuICAgIHJldHVybiAxXG4gIH1cbiAgcmV0dXJuIHNlbXZlckNvbXBhcmUoc2VtdmVyTWluVmVyc2lvbihhUmFuZ2UpLCBzZW12ZXJNaW5WZXJzaW9uKGJSYW5nZSkpXG59KVxuXG5jb25zdCBnZXRQYWNrYWdlTmFtZSA9IChpZGVudCkgPT4ge1xuICBjb25zdCBpbmRleCA9IGlkZW50LmluZGV4T2YoJ0AnLCBpZGVudC5zdGFydHNXaXRoKCdAJykgPyAxIDogMClcbiAgLy8gVGhpcyBzaG91bGQgbm90IGhhcHBlbiwgdW5sZXNzIHVzZXIgbWFudWFsbHkgZWRpdCB0aGUgcGFja2FnZS5qc29uIGZpbGVcbiAgcmV0dXJuIGluZGV4ID09PSAtMSA/IGlkZW50IDogaWRlbnQuc2xpY2UoMCwgaW5kZXgpXG59XG5cbmNvbnN0IHNvcnRPYmplY3RCeUlkZW50ID0gKGEsIGIpID0+IHtcbiAgY29uc3QgcGFja2FnZU5hbWVBID0gZ2V0UGFja2FnZU5hbWUoYSlcbiAgY29uc3QgcGFja2FnZU5hbWVCID0gZ2V0UGFja2FnZU5hbWUoYilcblxuICBpZiAocGFja2FnZU5hbWVBIDwgcGFja2FnZU5hbWVCKSByZXR1cm4gLTFcbiAgaWYgKHBhY2thZ2VOYW1lQSA+IHBhY2thZ2VOYW1lQikgcmV0dXJuIDFcbiAgcmV0dXJuIDBcbn1cblxuLy8gQ2FjaGUgYnkgYHByb2Nlc3MuY3dkKClgIGluc3RlYWQgb2YgYSB2YXJpYWJsZSB0byBhbGxvdyB1c2VyIGNhbGwgYHByb2Nlc3MuY2hkaXIoKWBcbmNvbnN0IGNhY2hlID0gbmV3IE1hcCgpXG5jb25zdCBoYXNZYXJuT3JQbnBtRmlsZXMgPSAoKSA9PiB7XG4gIGNvbnN0IGN3ZCA9IHByb2Nlc3MuY3dkKClcbiAgaWYgKCFjYWNoZS5oYXMoY3dkKSkge1xuICAgIGNhY2hlLnNldChcbiAgICAgIGN3ZCxcbiAgICAgIGZzLmV4aXN0c1N5bmMoJ3lhcm4ubG9jaycpIHx8XG4gICAgICAgIGZzLmV4aXN0c1N5bmMoJy55YXJuLycpIHx8XG4gICAgICAgIGZzLmV4aXN0c1N5bmMoJy55YXJucmMueW1sJykgfHxcbiAgICAgICAgZnMuZXhpc3RzU3luYygncG5wbS1sb2NrLnlhbWwnKSB8fFxuICAgICAgICBmcy5leGlzdHNTeW5jKCdwbnBtLXdvcmtzcGFjZS55YW1sJyksXG4gICAgKVxuICB9XG4gIHJldHVybiBjYWNoZS5nZXQoY3dkKVxufVxuXG4vKipcbiAqIERldGVjdHMgdGhlIHBhY2thZ2UgbWFuYWdlciBmcm9tIHBhY2thZ2UuanNvbiBhbmQgbG9jayBmaWxlc1xuICogQHBhcmFtIHtvYmplY3R9IHBhY2thZ2VKc29uIC0gVGhlIHBhcnNlZCBwYWNrYWdlLmpzb24gb2JqZWN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBUaGUgZGV0ZWN0ZWQgcGFja2FnZSBtYW5hZ2VyLiBEZWZhdWx0IHRvIG5wbSBpZiBub3QgZGV0ZWN0ZWQuXG4gKi9cbmZ1bmN0aW9uIHNob3VsZFNvcnREZXBlbmRlbmNpZXNMaWtlTnBtKHBhY2thZ2VKc29uKSB7XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvY29yZXBhY2tcbiAgaWYgKHR5cGVvZiBwYWNrYWdlSnNvbi5wYWNrYWdlTWFuYWdlciA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gcGFja2FnZUpzb24ucGFja2FnZU1hbmFnZXIuc3RhcnRzV2l0aCgnbnBtQCcpXG4gIH1cblxuICBpZiAocGFja2FnZUpzb24uZGV2RW5naW5lcz8ucGFja2FnZU1hbmFnZXI/Lm5hbWUpIHtcbiAgICByZXR1cm4gcGFja2FnZUpzb24uZGV2RW5naW5lcy5wYWNrYWdlTWFuYWdlci5uYW1lID09PSAnbnBtJ1xuICB9XG5cbiAgaWYgKHBhY2thZ2VKc29uLnBucG0pIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8vIE9wdGltaXNhdGlvbjogQ2hlY2sgaWYgbnBtIGlzIGV4cGxpY2l0IGJlZm9yZSByZWFkaW5nIEZTLlxuICBpZiAocGFja2FnZUpzb24uZW5naW5lcz8ubnBtKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGlmIChoYXNZYXJuT3JQbnBtRmlsZXMoKSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgcmV0dXJuIHRydWVcbn1cblxuLyoqXG4gKiBTb3J0IGRlcGVuZGVuY2llcyBhbHBoYWJldGljYWxseSwgZGV0ZWN0aW5nIHBhY2thZ2UgbWFuYWdlciB0byB1c2UgdGhlXG4gKiBhcHByb3ByaWF0ZSBjb21wYXJpc29uLiBucG0gdXNlcyBsb2NhbGUtYXdhcmUgY29tcGFyaXNvbiwgeWFybiBhbmQgcG5wbSB1c2VcbiAqIHNpbXBsZSBzdHJpbmcgY29tcGFyaXNvblxuICovXG5jb25zdCBzb3J0RGVwZW5kZW5jaWVzID0gb25PYmplY3QoKGRlcGVuZGVuY2llcywgcGFja2FnZUpzb24pID0+IHtcbiAgLy8gQXZvaWQgZmlsZSBhY2Nlc3NcbiAgaWYgKE9iamVjdC5rZXlzKGRlcGVuZGVuY2llcykubGVuZ3RoIDwgMikge1xuICAgIHJldHVybiBkZXBlbmRlbmNpZXNcbiAgfVxuXG4gIC8vIHNvcnQgZGVwcyBsaWtlIHRoZSBucG0gQ0xJIGRvZXMgKHZpYSB0aGUgcGFja2FnZSBAbnBtY2xpL3BhY2thZ2UtanNvbilcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL25wbS9wYWNrYWdlLWpzb24vYmxvYi9iNjQ2NWY0NGM3MjdkNjUxM2RiNjg5OGM3Y2JlNDFkZDM1NWNlYmU4L2xpYi91cGRhdGUtZGVwZW5kZW5jaWVzLmpzI0w4LUwyMVxuICBpZiAoc2hvdWxkU29ydERlcGVuZGVuY2llc0xpa2VOcG0ocGFja2FnZUpzb24pKSB7XG4gICAgcmV0dXJuIHNvcnRPYmplY3RLZXlzKGRlcGVuZGVuY2llcywgKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiLCAnZW4nKSlcbiAgfVxuXG4gIHJldHVybiBzb3J0T2JqZWN0S2V5cyhkZXBlbmRlbmNpZXMpXG59KVxuXG4vKipcbiAqIFwid29ya3NwYWNlc1wiIGNhbiBiZSBhbiBhcnJheSAobnBtIG9yIHlhcm4gY2xhc3NpYykgb3IgYW4gb2JqZWN0IChwbnBtL2J1bikuXG4gKiBJbiB0aGUgY2FzZSBvZiBhbiBhcnJheSwgd2UgZG8gbm90IHdhbnQgdG8gYWxwaGFiZXRpY2FsbHkgc29ydCBpdCBpbiBjYXNlXG4gKiBzY3JpcHRzIG5lZWQgdG8gcnVuIGluIGEgc3BlY2lmaWMgb3JkZXIuXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MubnBtanMuY29tL2NsaS92Ny91c2luZy1ucG0vd29ya3NwYWNlcz92PXRydWUjcnVubmluZy1jb21tYW5kcy1pbi10aGUtY29udGV4dC1vZi13b3Jrc3BhY2VzXG4gKi9cbmNvbnN0IHNvcnRXb3Jrc3BhY2VzID0gcGlwZShbXG4gIHNvcnRPYmplY3RCeShbJ3BhY2thZ2VzJywgJ2NhdGFsb2cnXSksXG4gIG92ZXJQcm9wZXJ0eSgncGFja2FnZXMnLCB1bmlxQW5kU29ydEFycmF5KSxcbiAgb3ZlclByb3BlcnR5KCdjYXRhbG9nJywgc29ydERlcGVuZGVuY2llcyksXG5dKVxuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vZXNsaW50L2VzbGludC9ibG9iL2FjYzBlNDc1NzJhOTM5MDI5MmI0ZTMxM2I0YTRiZjM2MGQyMzYzNTgvY29uZi9jb25maWctc2NoZW1hLmpzXG5jb25zdCBlc2xpbnRCYXNlQ29uZmlnUHJvcGVydGllcyA9IFtcbiAgLy8gYGZpbGVzYCBhbmQgYGV4Y2x1ZGVkRmlsZXNgIGFyZSBvbmx5IG9uIGBvdmVycmlkZXNbXWBcbiAgLy8gZm9yIGVhc2llciBzb3J0IGBvdmVycmlkZXNbXWAsXG4gIC8vIGFkZCB0aGVtIHRvIGhlcmUsIHNvIHdlIGRvbid0IG5lZWQgc29ydCBgb3ZlcnJpZGVzW11gIHR3aWNlXG4gICdmaWxlcycsXG4gICdleGNsdWRlZEZpbGVzJyxcbiAgLy8gYmFzZUNvbmZpZ1xuICAnZW52JyxcbiAgJ3BhcnNlcicsXG4gICdwYXJzZXJPcHRpb25zJyxcbiAgJ3NldHRpbmdzJyxcbiAgJ3BsdWdpbnMnLFxuICAnZXh0ZW5kcycsXG4gICdydWxlcycsXG4gICdvdmVycmlkZXMnLFxuICAnZ2xvYmFscycsXG4gICdwcm9jZXNzb3InLFxuICAnbm9JbmxpbmVDb25maWcnLFxuICAncmVwb3J0VW51c2VkRGlzYWJsZURpcmVjdGl2ZXMnLFxuXVxuY29uc3Qgc29ydEVzbGludENvbmZpZyA9IHBpcGUoW1xuICBzb3J0T2JqZWN0QnkoZXNsaW50QmFzZUNvbmZpZ1Byb3BlcnRpZXMpLFxuICBvdmVyUHJvcGVydHkoJ2VudicsIHNvcnRPYmplY3QpLFxuICBvdmVyUHJvcGVydHkoJ2dsb2JhbHMnLCBzb3J0T2JqZWN0KSxcbiAgb3ZlclByb3BlcnR5KFxuICAgICdvdmVycmlkZXMnLFxuICAgIG9uQXJyYXkoKG92ZXJyaWRlcykgPT4gb3ZlcnJpZGVzLm1hcChzb3J0RXNsaW50Q29uZmlnKSksXG4gICksXG4gIG92ZXJQcm9wZXJ0eSgncGFyc2VyT3B0aW9ucycsIHNvcnRPYmplY3QpLFxuICBvdmVyUHJvcGVydHkoXG4gICAgJ3J1bGVzJyxcbiAgICBzb3J0T2JqZWN0QnkoXG4gICAgICAocnVsZTEsIHJ1bGUyKSA9PlxuICAgICAgICBydWxlMS5zcGxpdCgnLycpLmxlbmd0aCAtIHJ1bGUyLnNwbGl0KCcvJykubGVuZ3RoIHx8XG4gICAgICAgIHJ1bGUxLmxvY2FsZUNvbXBhcmUocnVsZTIpLFxuICAgICksXG4gICksXG4gIG92ZXJQcm9wZXJ0eSgnc2V0dGluZ3MnLCBzb3J0T2JqZWN0KSxcbl0pXG5jb25zdCBzb3J0VlNDb2RlQmFkZ2VPYmplY3QgPSBzb3J0T2JqZWN0QnkoWydkZXNjcmlwdGlvbicsICd1cmwnLCAnaHJlZiddKVxuXG5jb25zdCBzb3J0UHJldHRpZXJDb25maWcgPSBwaXBlKFtcbiAgLy8gc29ydCBrZXlzIGFscGhhYmV0aWNhbGx5LCBidXQgcHV0IGBvdmVycmlkZXNgIGF0IGJvdHRvbVxuICBvbk9iamVjdCgoY29uZmlnKSA9PlxuICAgIHNvcnRPYmplY3RLZXlzKGNvbmZpZywgW1xuICAgICAgLi4uT2JqZWN0LmtleXMoY29uZmlnKVxuICAgICAgICAuZmlsdGVyKChrZXkpID0+IGtleSAhPT0gJ292ZXJyaWRlcycpXG4gICAgICAgIC5zb3J0KCksXG4gICAgICAnb3ZlcnJpZGVzJyxcbiAgICBdKSxcbiAgKSxcbiAgLy8gaWYgYGNvbmZpZy5vdmVycmlkZXNgIGV4aXN0c1xuICBvdmVyUHJvcGVydHkoXG4gICAgJ292ZXJyaWRlcycsXG4gICAgLy8gYW5kIGBjb25maWcub3ZlcnJpZGVzYCBpcyBhbiBhcnJheVxuICAgIG9uQXJyYXkoKG92ZXJyaWRlcykgPT5cbiAgICAgIG92ZXJyaWRlcy5tYXAoXG4gICAgICAgIHBpcGUoW1xuICAgICAgICAgIC8vIHNvcnQgYGNvbmZpZy5vdmVycmlkZXNbXWAgYWxwaGFiZXRpY2FsbHlcbiAgICAgICAgICBzb3J0T2JqZWN0LFxuICAgICAgICAgIC8vIHNvcnQgYGNvbmZpZy5vdmVycmlkZXNbXS5vcHRpb25zYCBhbHBoYWJldGljYWxseVxuICAgICAgICAgIG92ZXJQcm9wZXJ0eSgnb3B0aW9ucycsIHNvcnRPYmplY3QpLFxuICAgICAgICBdKSxcbiAgICAgICksXG4gICAgKSxcbiAgKSxcbl0pXG5cbmNvbnN0IHNvcnRWb2x0YSA9IHNvcnRPYmplY3RCeShbJ25vZGUnLCAnbnBtJywgJ3lhcm4nXSlcbmNvbnN0IHNvcnREZXZFbmdpbmVzID0gb3ZlclByb3BlcnR5KFxuICAncGFja2FnZU1hbmFnZXInLFxuICBzb3J0T2JqZWN0QnkoWyduYW1lJywgJ3ZlcnNpb24nLCAnb25GYWlsJ10pLFxuKVxuXG5jb25zdCBwbnBtQmFzZUNvbmZpZ1Byb3BlcnRpZXMgPSBbXG4gICdwZWVyRGVwZW5kZW5jeVJ1bGVzJyxcbiAgJ25ldmVyQnVpbHREZXBlbmRlbmNpZXMnLFxuICAnb25seUJ1aWx0RGVwZW5kZW5jaWVzJyxcbiAgJ29ubHlCdWlsdERlcGVuZGVuY2llc0ZpbGUnLFxuICAnYWxsb3dlZERlcHJlY2F0ZWRWZXJzaW9ucycsXG4gICdhbGxvd05vbkFwcGxpZWRQYXRjaGVzJyxcbiAgJ3VwZGF0ZUNvbmZpZycsXG4gICdhdWRpdENvbmZpZycsXG4gICdyZXF1aXJlZFNjcmlwdHMnLFxuICAnc3VwcG9ydGVkQXJjaGl0ZWN0dXJlcycsXG4gICdvdmVycmlkZXMnLFxuICAncGF0Y2hlZERlcGVuZGVuY2llcycsXG4gICdwYWNrYWdlRXh0ZW5zaW9ucycsXG5dXG5cbmNvbnN0IHNvcnRQbnBtQ29uZmlnID0gcGlwZShbXG4gIHNvcnRPYmplY3RCeShwbnBtQmFzZUNvbmZpZ1Byb3BlcnRpZXMsIHRydWUpLFxuICBvdmVyUHJvcGVydHkoJ292ZXJyaWRlcycsIHNvcnRPYmplY3RCeVNlbXZlciksXG5dKVxuXG4vLyBTZWUgaHR0cHM6Ly9kb2NzLm5wbWpzLmNvbS9taXNjL3NjcmlwdHNcbmNvbnN0IGRlZmF1bHROcG1TY3JpcHRzID0gbmV3IFNldChbXG4gICdpbnN0YWxsJyxcbiAgJ3BhY2snLFxuICAncHJlcGFyZScsXG4gICdwdWJsaXNoJyxcbiAgJ3Jlc3RhcnQnLFxuICAnc2hyaW5rd3JhcCcsXG4gICdzdGFydCcsXG4gICdzdG9wJyxcbiAgJ3Rlc3QnLFxuICAndW5pbnN0YWxsJyxcbiAgJ3ZlcnNpb24nLFxuXSlcblxuY29uc3QgaGFzRGV2RGVwZW5kZW5jeSA9IChkZXBlbmRlbmN5LCBwYWNrYWdlSnNvbikgPT4ge1xuICByZXR1cm4gKFxuICAgIE9iamVjdC5oYXNPd24ocGFja2FnZUpzb24sICdkZXZEZXBlbmRlbmNpZXMnKSAmJlxuICAgIE9iamVjdC5oYXNPd24ocGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzLCBkZXBlbmRlbmN5KVxuICApXG59XG5cbmNvbnN0IHJ1blNSZWdFeHAgPVxuICAvKD88PV58W1xccyY7PD58KF0pKD86cnVuLXN8bnBtLXJ1bi1hbGwyPyAuKig/Oi0tc2VxdWVudGlhbHwtLXNlcmlhbHwtcykpKD89JHxbXFxzJjs8PnwpXSkvXG5cbmNvbnN0IGlzU2VxdWVudGlhbFNjcmlwdCA9IChjb21tYW5kKSA9PlxuICBjb21tYW5kLmluY2x1ZGVzKCcqJykgJiYgcnVuU1JlZ0V4cC50ZXN0KGNvbW1hbmQpXG5cbmNvbnN0IGhhc1NlcXVlbnRpYWxTY3JpcHQgPSAocGFja2FnZUpzb24pID0+IHtcbiAgaWYgKFxuICAgICFoYXNEZXZEZXBlbmRlbmN5KCducG0tcnVuLWFsbCcsIHBhY2thZ2VKc29uKSAmJlxuICAgICFoYXNEZXZEZXBlbmRlbmN5KCducG0tcnVuLWFsbDInLCBwYWNrYWdlSnNvbilcbiAgKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgY29uc3Qgc2NyaXB0cyA9IFsnc2NyaXB0cycsICdiZXR0ZXJTY3JpcHRzJ10uZmxhdE1hcCgoZmllbGQpID0+XG4gICAgcGFja2FnZUpzb25bZmllbGRdID8gT2JqZWN0LnZhbHVlcyhwYWNrYWdlSnNvbltmaWVsZF0pIDogW10sXG4gIClcbiAgcmV0dXJuIHNjcmlwdHMuc29tZSgoc2NyaXB0KSA9PiBpc1NlcXVlbnRpYWxTY3JpcHQoc2NyaXB0KSlcbn1cblxuZnVuY3Rpb24gc29ydFNjcmlwdE5hbWVzKGtleXMsIHByZWZpeCA9ICcnKSB7XG4gIGNvbnN0IGdyb3VwTWFwID0gbmV3IE1hcCgpXG4gIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICBjb25zdCByZXN0ID0gcHJlZml4ID8ga2V5LnNsaWNlKHByZWZpeC5sZW5ndGggKyAxKSA6IGtleVxuICAgIGNvbnN0IGlkeCA9IHJlc3QuaW5kZXhPZignOicpXG4gICAgaWYgKGlkeCA+IDApIHtcbiAgICAgIGNvbnN0IGJhc2UgPSBrZXkuc2xpY2UoMCwgKHByZWZpeCA/IHByZWZpeC5sZW5ndGggKyAxIDogMCkgKyBpZHgpXG4gICAgICBpZiAoIWdyb3VwTWFwLmhhcyhiYXNlKSkgZ3JvdXBNYXAuc2V0KGJhc2UsIFtdKVxuICAgICAgZ3JvdXBNYXAuZ2V0KGJhc2UpLnB1c2goa2V5KVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIWdyb3VwTWFwLmhhcyhrZXkpKSBncm91cE1hcC5zZXQoa2V5LCBbXSlcbiAgICAgIGdyb3VwTWFwLmdldChrZXkpLnB1c2goa2V5KVxuICAgIH1cbiAgfVxuICByZXR1cm4gQXJyYXkuZnJvbShncm91cE1hcC5rZXlzKCkpXG4gICAgLnNvcnQoKVxuICAgIC5mbGF0TWFwKChncm91cEtleSkgPT4ge1xuICAgICAgY29uc3QgY2hpbGRyZW4gPSBncm91cE1hcC5nZXQoZ3JvdXBLZXkpXG4gICAgICBpZiAoXG4gICAgICAgIGNoaWxkcmVuLmxlbmd0aCA+IDEgJiZcbiAgICAgICAgY2hpbGRyZW4uc29tZSgoaykgPT4gayAhPT0gZ3JvdXBLZXkgJiYgay5zdGFydHNXaXRoKGdyb3VwS2V5ICsgJzonKSlcbiAgICAgICkge1xuICAgICAgICBjb25zdCBkaXJlY3QgPSBjaGlsZHJlblxuICAgICAgICAgIC5maWx0ZXIoKGspID0+IGsgPT09IGdyb3VwS2V5IHx8ICFrLnN0YXJ0c1dpdGgoZ3JvdXBLZXkgKyAnOicpKVxuICAgICAgICAgIC5zb3J0KClcbiAgICAgICAgY29uc3QgbmVzdGVkID0gY2hpbGRyZW4uZmlsdGVyKChrKSA9PiBrLnN0YXJ0c1dpdGgoZ3JvdXBLZXkgKyAnOicpKVxuICAgICAgICByZXR1cm4gWy4uLmRpcmVjdCwgLi4uc29ydFNjcmlwdE5hbWVzKG5lc3RlZCwgZ3JvdXBLZXkpXVxuICAgICAgfVxuICAgICAgcmV0dXJuIGNoaWxkcmVuLnNvcnQoKVxuICAgIH0pXG59XG5cbmNvbnN0IHNvcnRTY3JpcHRzID0gb25PYmplY3QoKHNjcmlwdHMsIHBhY2thZ2VKc29uKSA9PiB7XG4gIGxldCBuYW1lcyA9IE9iamVjdC5rZXlzKHNjcmlwdHMpXG4gIGNvbnN0IHByZWZpeGFibGUgPSBuZXcgU2V0KClcblxuICBuYW1lcyA9IG5hbWVzLm1hcCgobmFtZSkgPT4ge1xuICAgIGNvbnN0IG9taXR0ZWQgPSBuYW1lLnJlcGxhY2UoL14oPzpwcmV8cG9zdCkvLCAnJylcbiAgICBpZiAoZGVmYXVsdE5wbVNjcmlwdHMuaGFzKG9taXR0ZWQpIHx8IG5hbWVzLmluY2x1ZGVzKG9taXR0ZWQpKSB7XG4gICAgICBwcmVmaXhhYmxlLmFkZChvbWl0dGVkKVxuICAgICAgcmV0dXJuIG9taXR0ZWRcbiAgICB9XG4gICAgcmV0dXJuIG5hbWVcbiAgfSlcblxuICBpZiAoIWhhc1NlcXVlbnRpYWxTY3JpcHQocGFja2FnZUpzb24pKSB7XG4gICAgbmFtZXMgPSBzb3J0U2NyaXB0TmFtZXMobmFtZXMpXG4gIH1cbiAgbmFtZXMgPSBuYW1lcy5mbGF0TWFwKChrZXkpID0+XG4gICAgcHJlZml4YWJsZS5oYXMoa2V5KSA/IFtgcHJlJHtrZXl9YCwga2V5LCBgcG9zdCR7a2V5fWBdIDogW2tleV0sXG4gIClcbiAgcmV0dXJuIHNvcnRPYmplY3RLZXlzKHNjcmlwdHMsIG5hbWVzKVxufSlcblxuLypcbi0gTW92ZSBgZGVmYXVsdGAgY29uZGl0aW9uIHRvIGJvdHRvbVxuKi9cbmNvbnN0IHNvcnRDb25kaXRpb25zID0gKGNvbmRpdGlvbnMpID0+IHtcbiAgY29uc3QgeyBkZWZhdWx0Q29uZGl0aW9ucyA9IFtdLCByZXN0Q29uZGl0aW9ucyA9IFtdIH0gPSBvYmplY3RHcm91cEJ5KFxuICAgIGNvbmRpdGlvbnMsXG4gICAgKGNvbmRpdGlvbikgPT4ge1xuICAgICAgaWYgKGNvbmRpdGlvbiA9PT0gJ2RlZmF1bHQnKSB7XG4gICAgICAgIHJldHVybiAnZGVmYXVsdENvbmRpdGlvbnMnXG4gICAgICB9XG5cbiAgICAgIHJldHVybiAncmVzdENvbmRpdGlvbnMnXG4gICAgfSxcbiAgKVxuXG4gIHJldHVybiBbLi4ucmVzdENvbmRpdGlvbnMsIC4uLmRlZmF1bHRDb25kaXRpb25zXVxufVxuXG5jb25zdCBzb3J0RXhwb3J0cyA9IG9uT2JqZWN0KChleHBvcnRzKSA9PiB7XG4gIGNvbnN0IHsgcGF0aHMgPSBbXSwgY29uZGl0aW9ucyA9IFtdIH0gPSBvYmplY3RHcm91cEJ5KFxuICAgIE9iamVjdC5rZXlzKGV4cG9ydHMpLFxuICAgIChrZXkpID0+IChrZXkuc3RhcnRzV2l0aCgnLicpID8gJ3BhdGhzJyA6ICdjb25kaXRpb25zJyksXG4gIClcblxuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIFsuLi5wYXRocywgLi4uc29ydENvbmRpdGlvbnMoY29uZGl0aW9ucyldLm1hcCgoa2V5KSA9PiBbXG4gICAgICBrZXksXG4gICAgICBzb3J0RXhwb3J0cyhleHBvcnRzW2tleV0pLFxuICAgIF0pLFxuICApXG59KVxuXG4vLyBmaWVsZHMgbWFya2VkIGB2c2NvZGVgIGFyZSBmb3IgYFZpc3VhbCBTdHVkaW8gQ29kZSBleHRlbnNpb24gbWFuaWZlc3RgIG9ubHlcbi8vIGh0dHBzOi8vY29kZS52aXN1YWxzdHVkaW8uY29tL2FwaS9yZWZlcmVuY2VzL2V4dGVuc2lvbi1tYW5pZmVzdFxuLy8gU3VwcG9ydGVkIGZpZWxkczpcbi8vIHB1Ymxpc2hlciwgZGlzcGxheU5hbWUsIGNhdGVnb3JpZXMsIGdhbGxlcnlCYW5uZXIsIHByZXZpZXcsIGNvbnRyaWJ1dGVzLFxuLy8gYWN0aXZhdGlvbkV2ZW50cywgYmFkZ2VzLCBtYXJrZG93biwgcW5hLCBleHRlbnNpb25QYWNrLFxuLy8gZXh0ZW5zaW9uRGVwZW5kZW5jaWVzLCBpY29uXG5cbi8vIGZpZWxkLmtleXtzdHJpbmd9OiBmaWVsZCBuYW1lXG4vLyBmaWVsZC5vdmVye2Z1bmN0aW9ufTogc29ydCBmaWVsZCBzdWJLZXlcbmNvbnN0IGZpZWxkcyA9IFtcbiAgeyBrZXk6ICckc2NoZW1hJyB9LFxuICB7IGtleTogJ25hbWUnIH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2Rpc3BsYXlOYW1lJyB9LFxuICB7IGtleTogJ3ZlcnNpb24nIH0sXG4gIC8qIHlhcm4gKi8geyBrZXk6ICdzdGFibGVWZXJzaW9uJyB9LFxuICB7IGtleTogJ3ByaXZhdGUnIH0sXG4gIHsga2V5OiAnZGVzY3JpcHRpb24nIH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2NhdGVnb3JpZXMnLCBvdmVyOiB1bmlxIH0sXG4gIHsga2V5OiAna2V5d29yZHMnLCBvdmVyOiB1bmlxIH0sXG4gIHsga2V5OiAnaG9tZXBhZ2UnIH0sXG4gIHsga2V5OiAnYnVncycsIG92ZXI6IHNvcnRPYmplY3RCeShbJ3VybCcsICdlbWFpbCddKSB9LFxuICB7IGtleTogJ3JlcG9zaXRvcnknLCBvdmVyOiBzb3J0VVJMT2JqZWN0IH0sXG4gIHsga2V5OiAnZnVuZGluZycsIG92ZXI6IHNvcnRVUkxPYmplY3QgfSxcbiAgeyBrZXk6ICdsaWNlbnNlJywgb3Zlcjogc29ydFVSTE9iamVjdCB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdxbmEnIH0sXG4gIHsga2V5OiAnYXV0aG9yJywgb3Zlcjogc29ydFBlb3BsZU9iamVjdCB9LFxuICB7XG4gICAga2V5OiAnbWFpbnRhaW5lcnMnLFxuICAgIG92ZXI6IG9uQXJyYXkoKG1haW50YWluZXJzKSA9PiBtYWludGFpbmVycy5tYXAoc29ydFBlb3BsZU9iamVjdCkpLFxuICB9LFxuICB7XG4gICAga2V5OiAnY29udHJpYnV0b3JzJyxcbiAgICBvdmVyOiBvbkFycmF5KChjb250cmlidXRvcnMpID0+IGNvbnRyaWJ1dG9ycy5tYXAoc29ydFBlb3BsZU9iamVjdCkpLFxuICB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdwdWJsaXNoZXInIH0sXG4gIHsga2V5OiAnc2lkZUVmZmVjdHMnIH0sXG4gIHsga2V5OiAndHlwZScgfSxcbiAgeyBrZXk6ICdpbXBvcnRzJyB9LFxuICB7IGtleTogJ2V4cG9ydHMnLCBvdmVyOiBzb3J0RXhwb3J0cyB9LFxuICB7IGtleTogJ21haW4nIH0sXG4gIHsga2V5OiAnc3ZlbHRlJyB9LFxuICB7IGtleTogJ3VtZDptYWluJyB9LFxuICB7IGtleTogJ2pzZGVsaXZyJyB9LFxuICB7IGtleTogJ3VucGtnJyB9LFxuICB7IGtleTogJ21vZHVsZScgfSxcbiAgeyBrZXk6ICdzb3VyY2UnIH0sXG4gIHsga2V5OiAnanNuZXh0Om1haW4nIH0sXG4gIHsga2V5OiAnYnJvd3NlcicgfSxcbiAgeyBrZXk6ICdyZWFjdC1uYXRpdmUnIH0sXG4gIHsga2V5OiAndHlwZXMnIH0sXG4gIHsga2V5OiAndHlwZXNWZXJzaW9ucycgfSxcbiAgeyBrZXk6ICd0eXBpbmdzJyB9LFxuICB7IGtleTogJ3N0eWxlJyB9LFxuICB7IGtleTogJ2V4YW1wbGUnIH0sXG4gIHsga2V5OiAnZXhhbXBsZXN0eWxlJyB9LFxuICB7IGtleTogJ2Fzc2V0cycgfSxcbiAgeyBrZXk6ICdiaW4nLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnbWFuJyB9LFxuICB7IGtleTogJ2RpcmVjdG9yaWVzJywgb3Zlcjogc29ydERpcmVjdG9yaWVzIH0sXG4gIHsga2V5OiAnZmlsZXMnLCBvdmVyOiB1bmlxIH0sXG4gIHsga2V5OiAnd29ya3NwYWNlcycsIG92ZXI6IHNvcnRXb3Jrc3BhY2VzIH0sXG4gIC8vIG5vZGUtcHJlLWd5cCBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9ub2RlLXByZS1neXAjMS1hZGQtbmV3LWVudHJpZXMtdG8teW91ci1wYWNrYWdlanNvblxuICB7XG4gICAga2V5OiAnYmluYXJ5JyxcbiAgICBvdmVyOiBzb3J0T2JqZWN0QnkoW1xuICAgICAgJ21vZHVsZV9uYW1lJyxcbiAgICAgICdtb2R1bGVfcGF0aCcsXG4gICAgICAncmVtb3RlX3BhdGgnLFxuICAgICAgJ3BhY2thZ2VfbmFtZScsXG4gICAgICAnaG9zdCcsXG4gICAgXSksXG4gIH0sXG4gIHsga2V5OiAnc2NyaXB0cycsIG92ZXI6IHNvcnRTY3JpcHRzIH0sXG4gIHsga2V5OiAnYmV0dGVyU2NyaXB0cycsIG92ZXI6IHNvcnRTY3JpcHRzIH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2wxMG4nIH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2NvbnRyaWJ1dGVzJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdhY3RpdmF0aW9uRXZlbnRzJywgb3ZlcjogdW5pcSB9LFxuICB7IGtleTogJ2h1c2t5Jywgb3Zlcjogb3ZlclByb3BlcnR5KCdob29rcycsIHNvcnRHaXRIb29rcykgfSxcbiAgeyBrZXk6ICdzaW1wbGUtZ2l0LWhvb2tzJywgb3Zlcjogc29ydEdpdEhvb2tzIH0sXG4gIHsga2V5OiAncHJlLWNvbW1pdCcgfSxcbiAgeyBrZXk6ICdjb21taXRsaW50Jywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2xpbnQtc3RhZ2VkJyB9LFxuICB7IGtleTogJ25hbm8tc3RhZ2VkJyB9LFxuICB7IGtleTogJ2NvbmZpZycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdub2RlbW9uQ29uZmlnJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2Jyb3dzZXJpZnknLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnYmFiZWwnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnYnJvd3NlcnNsaXN0JyB9LFxuICB7IGtleTogJ3hvJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ3ByZXR0aWVyJywgb3Zlcjogc29ydFByZXR0aWVyQ29uZmlnIH0sXG4gIHsga2V5OiAnZXNsaW50Q29uZmlnJywgb3Zlcjogc29ydEVzbGludENvbmZpZyB9LFxuICB7IGtleTogJ2VzbGludElnbm9yZScgfSxcbiAgeyBrZXk6ICducG1wa2dqc29ubGludCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICducG1QYWNrYWdlSnNvbkxpbnRDb25maWcnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnbnBtcGFja2FnZWpzb25saW50Jywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ3JlbGVhc2UnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAncmVtYXJrQ29uZmlnJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ3N0eWxlbGludCcgfSxcbiAgeyBrZXk6ICdhdmEnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnamVzdCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdqZXN0LWp1bml0Jywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2plc3Qtc3RhcmUnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnbW9jaGEnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnbnljJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2M4Jywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ3RhcCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdvY2xpZicsIG92ZXI6IHNvcnRPYmplY3RCeSh1bmRlZmluZWQsIHRydWUpIH0sXG4gIHsga2V5OiAncmVzb2x1dGlvbnMnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnb3ZlcnJpZGVzJywgb3Zlcjogc29ydERlcGVuZGVuY2llcyB9LFxuICB7IGtleTogJ2RlcGVuZGVuY2llcycsIG92ZXI6IHNvcnREZXBlbmRlbmNpZXMgfSxcbiAgeyBrZXk6ICdkZXZEZXBlbmRlbmNpZXMnLCBvdmVyOiBzb3J0RGVwZW5kZW5jaWVzIH0sXG4gIHsga2V5OiAnZGVwZW5kZW5jaWVzTWV0YScsIG92ZXI6IHNvcnRPYmplY3RCeShzb3J0T2JqZWN0QnlJZGVudCwgdHJ1ZSkgfSxcbiAgeyBrZXk6ICdwZWVyRGVwZW5kZW5jaWVzJywgb3Zlcjogc29ydERlcGVuZGVuY2llcyB9LFxuICAvLyBUT0RPOiBvbmx5IHNvcnQgZGVwdGggPSAyXG4gIHsga2V5OiAncGVlckRlcGVuZGVuY2llc01ldGEnLCBvdmVyOiBzb3J0T2JqZWN0QnkodW5kZWZpbmVkLCB0cnVlKSB9LFxuICB7IGtleTogJ29wdGlvbmFsRGVwZW5kZW5jaWVzJywgb3Zlcjogc29ydERlcGVuZGVuY2llcyB9LFxuICB7IGtleTogJ2J1bmRsZWREZXBlbmRlbmNpZXMnLCBvdmVyOiB1bmlxQW5kU29ydEFycmF5IH0sXG4gIHsga2V5OiAnYnVuZGxlRGVwZW5kZW5jaWVzJywgb3ZlcjogdW5pcUFuZFNvcnRBcnJheSB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdleHRlbnNpb25QYWNrJywgb3ZlcjogdW5pcUFuZFNvcnRBcnJheSB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdleHRlbnNpb25EZXBlbmRlbmNpZXMnLCBvdmVyOiB1bmlxQW5kU29ydEFycmF5IH0sXG4gIHsga2V5OiAnZmxhdCcgfSxcbiAgeyBrZXk6ICdwYWNrYWdlTWFuYWdlcicgfSxcbiAgeyBrZXk6ICdlbmdpbmVzJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2VuZ2luZVN0cmljdCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdkZXZFbmdpbmVzJywgb3Zlcjogc29ydERldkVuZ2luZXMgfSxcbiAgeyBrZXk6ICd2b2x0YScsIG92ZXI6IHNvcnRWb2x0YSB9LFxuICB7IGtleTogJ2xhbmd1YWdlTmFtZScgfSxcbiAgeyBrZXk6ICdvcycgfSxcbiAgeyBrZXk6ICdjcHUnIH0sXG4gIHsga2V5OiAncHJlZmVyR2xvYmFsJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ3B1Ymxpc2hDb25maWcnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2ljb24nIH0sXG4gIC8qIHZzY29kZSAqLyB7XG4gICAga2V5OiAnYmFkZ2VzJyxcbiAgICBvdmVyOiBvbkFycmF5KChiYWRnZSkgPT4gYmFkZ2UubWFwKHNvcnRWU0NvZGVCYWRnZU9iamVjdCkpLFxuICB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdnYWxsZXJ5QmFubmVyJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdwcmV2aWV3JyB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdtYXJrZG93bicgfSxcbiAgeyBrZXk6ICdwbnBtJywgb3Zlcjogc29ydFBucG1Db25maWcgfSxcbl1cblxuY29uc3QgZGVmYXVsdFNvcnRPcmRlciA9IGZpZWxkcy5tYXAoKHsga2V5IH0pID0+IGtleSlcbmNvbnN0IG92ZXJGaWVsZHMgPSBwaXBlKFxuICBmaWVsZHNcbiAgICAubWFwKCh7IGtleSwgb3ZlciB9KSA9PiAob3ZlciA/IG92ZXJQcm9wZXJ0eShrZXksIG92ZXIpIDogdW5kZWZpbmVkKSlcbiAgICAuZmlsdGVyKEJvb2xlYW4pLFxuKVxuXG5mdW5jdGlvbiBlZGl0U3RyaW5nSlNPTihqc29uLCBvdmVyKSB7XG4gIGlmICh0eXBlb2YganNvbiA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zdCB7IGluZGVudCwgdHlwZSB9ID0gZGV0ZWN0SW5kZW50KGpzb24pXG4gICAgY29uc3QgZW5kQ2hhcmFjdGVycyA9IGpzb24uc2xpY2UoLTEpID09PSAnXFxuJyA/ICdcXG4nIDogJydcbiAgICBjb25zdCBuZXdsaW5lID0gZGV0ZWN0TmV3bGluZShqc29uKVxuICAgIGpzb24gPSBKU09OLnBhcnNlKGpzb24pXG5cbiAgICBsZXQgcmVzdWx0ID1cbiAgICAgIEpTT04uc3RyaW5naWZ5KG92ZXIoanNvbiksIG51bGwsIHR5cGUgPT09ICd0YWInID8gJ1xcdCcgOiBpbmRlbnQpICtcbiAgICAgIGVuZENoYXJhY3RlcnNcbiAgICBpZiAobmV3bGluZSA9PT0gJ1xcclxcbicpIHtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC9cXG4vZywgbmV3bGluZSlcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgcmV0dXJuIG92ZXIoanNvbilcbn1cblxuZnVuY3Rpb24gc29ydFBhY2thZ2VKc29uKGpzb25Jc2gsIG9wdGlvbnMgPSB7fSkge1xuICByZXR1cm4gZWRpdFN0cmluZ0pTT04oXG4gICAganNvbklzaCxcbiAgICBvbk9iamVjdCgoanNvbikgPT4ge1xuICAgICAgbGV0IHNvcnRPcmRlciA9IG9wdGlvbnMuc29ydE9yZGVyIHx8IGRlZmF1bHRTb3J0T3JkZXJcblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc29ydE9yZGVyKSkge1xuICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoanNvbilcbiAgICAgICAgY29uc3QgeyBwcml2YXRlS2V5cyA9IFtdLCBwdWJsaWNLZXlzID0gW10gfSA9IG9iamVjdEdyb3VwQnkoXG4gICAgICAgICAga2V5cyxcbiAgICAgICAgICAoa2V5KSA9PiAoa2V5WzBdID09PSAnXycgPyAncHJpdmF0ZUtleXMnIDogJ3B1YmxpY0tleXMnKSxcbiAgICAgICAgKVxuICAgICAgICBzb3J0T3JkZXIgPSBbXG4gICAgICAgICAgLi4uc29ydE9yZGVyLFxuICAgICAgICAgIC4uLmRlZmF1bHRTb3J0T3JkZXIsXG4gICAgICAgICAgLi4ucHVibGljS2V5cy5zb3J0KCksXG4gICAgICAgICAgLi4ucHJpdmF0ZUtleXMuc29ydCgpLFxuICAgICAgICBdXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvdmVyRmllbGRzKHNvcnRPYmplY3RLZXlzKGpzb24sIHNvcnRPcmRlciksIGpzb24pXG4gICAgfSksXG4gIClcbn1cblxuZXhwb3J0IGRlZmF1bHQgc29ydFBhY2thZ2VKc29uXG5leHBvcnQgeyBzb3J0UGFja2FnZUpzb24sIGRlZmF1bHRTb3J0T3JkZXIgYXMgc29ydE9yZGVyIH1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWUpIHtcblx0aWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgdmFsdWUgPT09IG51bGwpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRjb25zdCBwcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpO1xuXHRyZXR1cm4gKHByb3RvdHlwZSA9PT0gbnVsbCB8fCBwcm90b3R5cGUgPT09IE9iamVjdC5wcm90b3R5cGUgfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvdHlwZSkgPT09IG51bGwpICYmICEoU3ltYm9sLnRvU3RyaW5nVGFnIGluIHZhbHVlKSAmJiAhKFN5bWJvbC5pdGVyYXRvciBpbiB2YWx1ZSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBzb3J0UGFja2FnZUpzb24gfSBmcm9tICdzb3J0LXBhY2thZ2UtanNvbic7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4VGVzdERpcmVjdG9yaWVzVXBkYXRpbmdQYWNrYWdlSnNvbihwYWNrYWdlRGlyUGF0aHM6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4VGVzdERpcmVjdG9yaWVzVXBkYXRpbmdQYWNrYWdlSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHBhY2thZ2VEaXJQYXRocy5tYXAoYXN5bmMgKHBhY2thZ2VEaXJQYXRoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKSkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IG5ld1Rlc3REaXJQYXRoID0gcGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAndGVzdCcpO1xuICAgICAgICBmb3IgKGNvbnN0IG9sZFRlc3REaXJOYW1lIG9mIFsnX190ZXN0c19fJywgJ3Rlc3RzJ10pIHtcbiAgICAgICAgICBjb25zdCBvbGRUZXN0RGlyUGF0aCA9IHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgb2xkVGVzdERpck5hbWUpO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBtb3ZlVGVzdERpcmVjdG9yeShvbGRUZXN0RGlyUGF0aCwgbmV3VGVzdERpclBhdGgpO1xuICAgICAgICAgICAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKSkgYXMge1xuICAgICAgICAgICAgICBzY3JpcHRzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBsZXQgZGlkVXBkYXRlU2NyaXB0ID0gZmFsc2U7XG4gICAgICAgICAgICBjb25zdCBzY3JpcHRzID0gcGFja2FnZUpzb24uc2NyaXB0cyA/PyB7fTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW3NjcmlwdE5hbWUsIHNjcmlwdF0gb2YgT2JqZWN0LmVudHJpZXMoc2NyaXB0cykpIHtcbiAgICAgICAgICAgICAgY29uc3QgbmV3U2NyaXB0ID0gc2NyaXB0LnJlcGxhY2VBbGwob2xkVGVzdERpck5hbWUsICd0ZXN0Jyk7XG4gICAgICAgICAgICAgIGlmIChzY3JpcHQgIT09IG5ld1NjcmlwdCkge1xuICAgICAgICAgICAgICAgIHNjcmlwdHNbc2NyaXB0TmFtZV0gPSBuZXdTY3JpcHQ7XG4gICAgICAgICAgICAgICAgZGlkVXBkYXRlU2NyaXB0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGFja2FnZUpzb24uc2NyaXB0cyA9IHNjcmlwdHM7XG4gICAgICAgICAgICBpZiAoIWRpZFVwZGF0ZVNjcmlwdCkgcmV0dXJuO1xuXG4gICAgICAgICAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKHBhY2thZ2VKc29uUGF0aCwgSlNPTi5zdHJpbmdpZnkoc29ydFBhY2thZ2VKc29uKHBhY2thZ2VKc29uKSwgdW5kZWZpbmVkLCAyKSk7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBtb3ZlVGVzdERpcmVjdG9yeShvbGRUZXN0RGlyUGF0aDogc3RyaW5nLCBuZXdUZXN0RGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghZnMuZXhpc3RzU3luYyhuZXdUZXN0RGlyUGF0aCkpIHtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5yZW5hbWUob2xkVGVzdERpclBhdGgsIG5ld1Rlc3REaXJQYXRoKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBkaXJlbnRzID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcihvbGRUZXN0RGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICBkaXJlbnRzLm1hcChhc3luYyAoZGlyZW50KSA9PiB7XG4gICAgICBjb25zdCBvbGRQYXRoID0gcGF0aC5qb2luKG9sZFRlc3REaXJQYXRoLCBkaXJlbnQubmFtZSk7XG4gICAgICBjb25zdCBuZXdQYXRoID0gcGF0aC5qb2luKG5ld1Rlc3REaXJQYXRoLCBkaXJlbnQubmFtZSk7XG4gICAgICBjb25zdCBuZXdQYXRoU3RhdCA9IGZzLmV4aXN0c1N5bmMobmV3UGF0aCkgPyBhd2FpdCBmcy5wcm9taXNlcy5zdGF0KG5ld1BhdGgpIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKGRpcmVudC5pc0RpcmVjdG9yeSgpICYmIG5ld1BhdGhTdGF0Py5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgIGF3YWl0IG1vdmVUZXN0RGlyZWN0b3J5KG9sZFBhdGgsIG5ld1BhdGgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy5yZW5hbWUob2xkUGF0aCwgbmV3UGF0aCk7XG4gICAgfSlcbiAgKTtcbiAgYXdhaXQgZnMucHJvbWlzZXMucm0ob2xkVGVzdERpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgaWdub3JlRW5vZW50QXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi9zcmMnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFR5cGVEZWZpbml0aW9ucyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBjb25maWdzSW5jbHVkaW5nQ2hpbGRyZW46IFBhY2thZ2VDb25maWdbXVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4VHlwZURlZmluaXRpb25zJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGxpYlR5cGVEaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnQHR5cGVzJyk7XG4gICAgY29uc3Qgc3JjVHlwZURpclBhdGggPVxuICAgICAgY29uZmlnLmlzUm9vdCAmJiBjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMgPyB1bmRlZmluZWQgOiBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdzcmMnLCAndHlwZXMnKTtcblxuICAgIGNvbnN0IGRpcmVudHMgPSBhd2FpdCBpZ25vcmVFbm9lbnRBc3luYygoKSA9PiBmcy5yZWFkZGlyKGxpYlR5cGVEaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpO1xuICAgIGlmICghZGlyZW50cykgcmV0dXJuO1xuXG4gICAgZm9yIChjb25zdCBkaXJlbnQgb2YgZGlyZW50cykge1xuICAgICAgY29uc3QgZGlyTmFtZSA9IGRpcmVudC5uYW1lLnNsaWNlKDAsIC01KTtcbiAgICAgIGNvbnN0IGhhc1R5cGVEZWNsYXJhdGlvbkV4dGVuc2lvbiA9IGRpcmVudC5uYW1lLmVuZHNXaXRoKCcuZC50cycpO1xuICAgICAgbGV0IHBhY2thZ2VOYW1lID0gaGFzVHlwZURlY2xhcmF0aW9uRXh0ZW5zaW9uID8gZGlyTmFtZSA6IGRpcmVudC5uYW1lO1xuICAgICAgaWYgKHBhY2thZ2VOYW1lLmluY2x1ZGVzKCdfXycpKSB7XG4gICAgICAgIHBhY2thZ2VOYW1lID0gYEAke3BhY2thZ2VOYW1lLnJlcGxhY2UoJ19fJywgJy8nKX1gO1xuICAgICAgfVxuICAgICAgY29uc3QgaGFzTGlicmFyeSA9IGNvbmZpZ3NJbmNsdWRpbmdDaGlsZHJlbi5zb21lKFxuICAgICAgICAoY29uZmlnKSA9PlxuICAgICAgICAgIGNvbmZpZy5wYWNrYWdlSnNvbj8uZGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdIHx8IGNvbmZpZy5wYWNrYWdlSnNvbj8uZGV2RGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdXG4gICAgICApO1xuXG4gICAgICBpZiAoZGlyZW50LmlzRmlsZSgpICYmIGhhc1R5cGVEZWNsYXJhdGlvbkV4dGVuc2lvbikge1xuICAgICAgICBpZiAoaGFzTGlicmFyeSkge1xuICAgICAgICAgIC8vIE1vdmUgQHR5cGVzLzxuYW1lPi9pbmRleC5kLnRzIGlmIGluc3RhbGxlZFxuICAgICAgICAgIGF3YWl0IGZzLm1rZGlyKHBhdGguam9pbihsaWJUeXBlRGlyUGF0aCwgZGlyTmFtZSksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgICAgICAgZnMucmVuYW1lKHBhdGguam9pbihsaWJUeXBlRGlyUGF0aCwgZGlyZW50Lm5hbWUpLCBwYXRoLmpvaW4obGliVHlwZURpclBhdGgsIGRpck5hbWUsICdpbmRleC5kLnRzJykpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmIChzcmNUeXBlRGlyUGF0aCkge1xuICAgICAgICAgIC8vIE1vdmUgc3JjL3R5cGVzLzxuYW1lPiBpZiBub3QgaW5zdGFsbGVkXG4gICAgICAgICAgYXdhaXQgZnMubWtkaXIoc3JjVHlwZURpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgICAgICAgZnMucmVuYW1lKHBhdGguam9pbihsaWJUeXBlRGlyUGF0aCwgZGlyZW50Lm5hbWUpLCBwYXRoLmpvaW4oc3JjVHlwZURpclBhdGgsIGRpcmVudC5uYW1lKSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGRpcmVudC5pc0RpcmVjdG9yeSgpICYmIHNyY1R5cGVEaXJQYXRoICYmICFoYXNMaWJyYXJ5KSB7XG4gICAgICAgIC8vIE1vdmUgc3JjL3R5cGVzLzxuYW1lPi5kLnRzIGlmIG5vdCBpbnN0YWxsZWRcbiAgICAgICAgYXdhaXQgZnMubWtkaXIoc3JjVHlwZURpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgICAgICBpZ25vcmVFbm9lbnRBc3luYygoKSA9PlxuICAgICAgICAgICAgZnMucmVuYW1lKFxuICAgICAgICAgICAgICBwYXRoLmpvaW4obGliVHlwZURpclBhdGgsIGRpcmVudC5uYW1lLCAnaW5kZXguZC50cycpLFxuICAgICAgICAgICAgICBwYXRoLmpvaW4oc3JjVHlwZURpclBhdGgsIGAke2RpcmVudC5uYW1lfS5kLnRzYClcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cbiIsImltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5leHBvcnQgZnVuY3Rpb24gb3ZlcndyaXRlTWVyZ2U8VD4oZGVzdGluYXRpb25BcnJheTogVFtdLCBzb3VyY2VBcnJheTogVFtdKTogVFtdIHtcbiAgcmV0dXJuIHNvdXJjZUFycmF5O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tYmluZU1lcmdlKHRhcmdldDogdW5rbm93bltdLCBzb3VyY2U6IHVua25vd25bXSwgb3B0aW9uczogbWVyZ2UuQXJyYXlNZXJnZU9wdGlvbnMpOiB1bmtub3duW10ge1xuICBjb25zdCBkZXN0aW5hdGlvbiA9IFsuLi50YXJnZXRdO1xuXG4gIGZvciAoY29uc3QgW2luZGV4LCBpdGVtXSBvZiBzb3VyY2UuZW50cmllcygpKSB7XG4gICAgaWYgKGRlc3RpbmF0aW9uW2luZGV4XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBkZXN0aW5hdGlvbltpbmRleF0gPSBjbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZChpdGVtLCBvcHRpb25zKTtcbiAgICB9IGVsc2UgaWYgKGlzTWVyZ2VhYmxlT2JqZWN0KHRhcmdldFtpbmRleF0sIG9wdGlvbnMpICYmIGlzTWVyZ2VhYmxlT2JqZWN0KGl0ZW0sIG9wdGlvbnMpKSB7XG4gICAgICBkZXN0aW5hdGlvbltpbmRleF0gPSBtZXJnZSh0YXJnZXRbaW5kZXhdLCBpdGVtLCBvcHRpb25zKTtcbiAgICB9IGVsc2UgaWYgKCF0YXJnZXQuaW5jbHVkZXMoaXRlbSkpIHtcbiAgICAgIGRlc3RpbmF0aW9uLnB1c2goaXRlbSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBkZXN0aW5hdGlvbjtcbn1cblxuZnVuY3Rpb24gY2xvbmVVbmxlc3NPdGhlcndpc2VTcGVjaWZpZWQodmFsdWU6IHVua25vd24sIG9wdGlvbnM6IG1lcmdlLkFycmF5TWVyZ2VPcHRpb25zKTogdW5rbm93biB7XG4gIHJldHVybiBpc01lcmdlYWJsZU9iamVjdCh2YWx1ZSwgb3B0aW9ucykgPyBvcHRpb25zLmNsb25lVW5sZXNzT3RoZXJ3aXNlU3BlY2lmaWVkKHZhbHVlLCBvcHRpb25zKSA6IHZhbHVlO1xufVxuXG5mdW5jdGlvbiBpc01lcmdlYWJsZU9iamVjdCh2YWx1ZTogdW5rbm93biwgb3B0aW9uczogbWVyZ2UuQXJyYXlNZXJnZU9wdGlvbnMpOiB2YWx1ZSBpcyBvYmplY3Qge1xuICByZXR1cm4gISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIG9wdGlvbnMuaXNNZXJnZWFibGVPYmplY3QodmFsdWUpO1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIG1vdmVUb0JvdHRvbTxUT2JqIGV4dGVuZHMgUmVjb3JkPFRLZXksIHVua25vd24+LCBUS2V5IGV4dGVuZHMgc3RyaW5nIHwgbnVtYmVyIHwgc3ltYm9sPihcbiAgb2JqOiBUT2JqLFxuICBrZXk6IFRLZXlcbik6IFRPYmoge1xuICBjb25zdCB2YWx1ZSA9IG9ialtrZXldO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gIGRlbGV0ZSBvYmpba2V5XTtcbiAgKG9iaiBhcyBSZWNvcmQ8VEtleSwgdW5rbm93bj4pW2tleV0gPSB2YWx1ZTtcbiAgcmV0dXJuIG9iajtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNvcnRLZXlzPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ob2JqOiBUKTogVCB7XG4gIGNvbnN0IGtleUFuZFZhbHVlcyA9IE9iamVjdC5lbnRyaWVzKG9iaikudG9Tb3J0ZWQoKFtrZXkxXSwgW2tleTJdKSA9PiBrZXkxLmxvY2FsZUNvbXBhcmUoa2V5MikpO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBrZXlBbmRWYWx1ZXMpIHtcbiAgICAvLyBwYWNrYWdlLmpzb24tc3R5bGUga2V5cyBhcmUgbm9uLWFycmF5LWluZGV4IGtleXMsIHNvIEpTT04uc3RyaW5naWZ5IHByZXNlcnZlcyB0aGlzIGluc2VydGlvbiBvcmRlci5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gICAgZGVsZXRlIG9ialtrZXldO1xuICAgIChvYmogYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0gPSB2YWx1ZTtcblxuICAgIC8vIGlmIHZhbHVlIGlzIGFuIG9iamVjdCwgc29ydCB0aGUga2V5cyBvZiB0aGUgb2JqZWN0XG4gICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICBzb3J0S2V5cyh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgfVxuICB9XG4gIHJldHVybiBvYmo7XG59XG4iLCIvLyBHaXRIdWIgQWN0aW9ucyB2YWx1ZWxlc3MgZXZlbnRzIHN1Y2ggYXMgYHB1bGxfcmVxdWVzdDpgIHJlcXVpcmUgWUFNTCBudWxsIHZhbHVlcy5cbi8vIG94bGludC1kaXNhYmxlIGVzbGludC1wbHVnaW4taW1wb3J0L25vLW5hbWVkLWFzLWRlZmF1bHQtbWVtYmVyIC0tIE5hbWVzcGFjZSBZQU1MIGNhbGxzIG1ha2UgbG9hZC9kdW1wIHVzYWdlIGNsZWFyZXIuXG4vKiBlc2xpbnQtZGlzYWJsZSB1bmljb3JuL25vLW51bGwgKi9cblxuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgeWFtbCBmcm9tICdqcy15YW1sJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgY29tYmluZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IG1vdmVUb0JvdHRvbSwgc29ydEtleXMgfSBmcm9tICcuLi91dGlscy9vYmplY3RVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5pbnRlcmZhY2UgV29ya2Zsb3cge1xuICBuYW1lPzogc3RyaW5nO1xuICBvbj86IE9uO1xuICBjb25jdXJyZW5jeT86IENvbmN1cnJlbmN5O1xuICBwZXJtaXNzaW9ucz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIGpvYnM6IFJlY29yZDxzdHJpbmcsIEpvYj47XG59XG5cbmludGVyZmFjZSBDb25jdXJyZW5jeSB7XG4gIGdyb3VwOiBzdHJpbmc7XG4gICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgT24ge1xuICAvLyBHaXRIdWIgQWN0aW9ucyB0cmVhdHMgYGV2ZW50OiBudWxsYCBhcyBhIHZhbHVlbGVzcyBldmVudCBtYXBwaW5nLCBlLmcuXG4gIC8vIGBwdWxsX3JlcXVlc3Q6YC4gYHVuZGVmaW5lZGAgd291bGQgb21pdCB0aGUgZXZlbnQgZW50aXJlbHkgd2hlbiBkdW1waW5nIFlBTUwuXG4gIGlzc3Vlcz86IFR5cGVzIHwgbnVsbDtcbiAgcHVsbF9yZXF1ZXN0PzogUHVsbFJlcXVlc3QgfCBudWxsO1xuICBwdWxsX3JlcXVlc3RfdGFyZ2V0PzogVHlwZXMgfCBudWxsO1xuICBwdXNoPzogUHVzaDtcbiAgc2NoZWR1bGU/OiBTY2hlZHVsZVtdO1xuICB3b3JrZmxvd19kaXNwYXRjaD86IG51bGw7XG59XG5cbmludGVyZmFjZSBQdWxsUmVxdWVzdCB7XG4gICdwYXRocy1pZ25vcmUnPzogc3RyaW5nW107XG4gIHR5cGVzPzogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBQdXNoIHtcbiAgYnJhbmNoZXM6IHN0cmluZ1tdO1xuICAncGF0aHMtaWdub3JlJz86IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgU2NoZWR1bGUge1xuICBjcm9uOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBUeXBlcyB7XG4gIHR5cGVzOiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIEpvYiB7XG4gICdydW5zLW9uJz86IHN0cmluZztcbiAgcGVybWlzc2lvbnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBzdGVwcz86IFN0ZXBbXTtcbiAgdXNlcz86IHN0cmluZztcbiAgaWY/OiBzdHJpbmc7XG4gIHNlY3JldHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgd2l0aD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG5pbnRlcmZhY2UgU3RlcCB7XG4gIHVzZXM/OiBzdHJpbmc7XG4gIHdpdGg/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcnVuPzogc3RyaW5nO1xufVxuXG5jb25zdCBwdWJsaWNSZXBvQXV0b2ZpeFdvcmtmbG93OiBXb3JrZmxvdyA9IHtcbiAgbmFtZTogJ2F1dG9maXguY2knLFxuICBvbjoge1xuICAgIHB1bGxfcmVxdWVzdDogbnVsbCxcbiAgICBwdXNoOiB7XG4gICAgICBicmFuY2hlczogWydtYWluJ10sXG4gICAgfSxcbiAgfSxcbiAgcGVybWlzc2lvbnM6IHtcbiAgICBjb250ZW50czogJ3JlYWQnLFxuICB9LFxuICBjb25jdXJyZW5jeToge1xuICAgIGdyb3VwOiAnYXV0b2ZpeC0ke3sgZ2l0aHViLmhlYWRfcmVmIH19JyxcbiAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogdHJ1ZSxcbiAgfSxcbiAgam9iczoge1xuICAgIGF1dG9maXg6IHsgJ3J1bnMtb24nOiAndWJ1bnR1LWxhdGVzdCcgfSxcbiAgfSxcbn07XG5cbmNvbnN0IHByaXZhdGVSZXBvQXV0b2ZpeFdvcmtmbG93OiBXb3JrZmxvdyA9IHtcbiAgbmFtZTogJ0ZpeCBjb2RlIGF1dG9tYXRpY2FsbHknLFxuICBvbjoge1xuICAgIHB1bGxfcmVxdWVzdDogbnVsbCxcbiAgfSxcbiAgY29uY3VycmVuY3k6IHtcbiAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0tJHt7IGdpdGh1Yi5yZWYgfX0nLFxuICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiB0cnVlLFxuICB9LFxuICBqb2JzOiB7XG4gICAgYXV0b2ZpeDoge1xuICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9hdXRvZml4LnltbEBtYWluJyxcbiAgICB9LFxuICB9LFxufTtcblxuY29uc3Qgd29ya2Zsb3dzID0ge1xuICB0ZXN0OiB7XG4gICAgbmFtZTogJ1Rlc3QnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3Q6IG51bGwsXG4gICAgICBwdXNoOiB7XG4gICAgICAgIGJyYW5jaGVzOiBbJ21haW4nLCAnd2JmeSddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIC8vIGNmLiBodHRwczovL2RvY3MuZ2l0aHViLmNvbS9lbi9hY3Rpb25zL3VzaW5nLWpvYnMvdXNpbmctY29uY3VycmVuY3kjZXhhbXBsZS1vbmx5LWNhbmNlbC1pbi1wcm9ncmVzcy1qb2JzLW9yLXJ1bnMtZm9yLXRoZS1jdXJyZW50LXdvcmtmbG93XG4gICAgY29uY3VycmVuY3k6IHtcbiAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fS0ke3sgZ2l0aHViLnJlZiB9fScsXG4gICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogdHJ1ZSxcbiAgICB9LFxuICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAvLyBmb3IgbGludGVyIGZpeFxuICAgICAgY29udGVudHM6ICd3cml0ZScsXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICB0ZXN0OiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvdGVzdC55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIHJlbGVhc2U6IHtcbiAgICBuYW1lOiAnUmVsZWFzZScsXG4gICAgb246IHtcbiAgICAgIHB1c2g6IHtcbiAgICAgICAgYnJhbmNoZXM6IFtdLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0nLFxuICAgICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IGZhbHNlLFxuICAgIH0sXG4gICAgcGVybWlzc2lvbnM6IHtcbiAgICAgIC8vIGh0dHBzOi8vZG9jcy5ucG1qcy5jb20vdHJ1c3RlZC1wdWJsaXNoZXJzI3N0ZXAtMi1jb25maWd1cmUteW91ci1jaWNkLXdvcmtmbG93XG4gICAgICAnaWQtdG9rZW4nOiAnd3JpdGUnLFxuICAgICAgLy8gZm9yIHNlbWFudGljLXJlbGVhc2VcbiAgICAgIGNvbnRlbnRzOiAnd3JpdGUnLFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgcmVsZWFzZToge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3JlbGVhc2UueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAnc2VtYW50aWMtcHInOiB7XG4gICAgbmFtZTogJ0xpbnQgUFIgdGl0bGUnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3RfdGFyZ2V0OiB7XG4gICAgICAgIHR5cGVzOiBbJ29wZW5lZCcsICdlZGl0ZWQnLCAnc3luY2hyb25pemUnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnc2VtYW50aWMtcHInOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3Mvc2VtYW50aWMtcHIueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICBzeW5jOiB7XG4gICAgbmFtZTogJ1N5bmMnLFxuICAgIG9uOiB7fSxcbiAgICBwZXJtaXNzaW9uczoge1xuICAgICAgLy8gZm9yIGNvbW1pdGluZyBjaGFuZ2VzXG4gICAgICBjb250ZW50czogJ3dyaXRlJyxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgIHN5bmM6IHsgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9zeW5jLnltbEBtYWluJyB9LFxuICAgIH0sXG4gIH0sXG4gICdjbG9zZS1jb21tZW50Jzoge1xuICAgIG5hbWU6ICdBZGQgY2xvc2UgY29tbWVudCcsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdDoge1xuICAgICAgICB0eXBlczogWydvcGVuZWQnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnY2xvc2UtY29tbWVudCc6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9jbG9zZS1jb21tZW50LnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbnR5cGUgS25vd25LaW5kID0ga2V5b2YgdHlwZW9mIHdvcmtmbG93cyB8ICdkZXBsb3knIHwgJ2F1dG9maXgnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVXb3JrZmxvd3Mocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlV29ya2Zsb3cnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHJvb3RDb25maWcucmVwb3NpdG9yeSkpIHtcbiAgICAgIC8vIERvbid0IHRvdWNoIHJldXNhYmxlLXdvcmtmbG93cyByZXBvIGJlY2F1c2UgaXQgaG9zdHMgdXBzdHJlYW0gd29ya2Zsb3cgZGVmaW5pdGlvbnMuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgd29ya2Zsb3dzUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcuZ2l0aHViJywgJ3dvcmtmbG93cycpO1xuICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHdvcmtmbG93c1BhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgLy8gUmVtb3ZlIGNvbmZpZyBvZiBzZW1hbnRpYyBwdWxsIHJlcXVlc3RcbiAgICBjb25zdCBzZW1hbnRpY1ltbFBhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicsICdzZW1hbnRpYy55bWwnKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oc2VtYW50aWNZbWxQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSkpO1xuXG4gICAgY29uc3QgZW50cmllcyA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIod29ya2Zsb3dzUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgaWYgKCFlbnRyeS5pc0ZpbGUoKSB8fCAhaXNPYnNvbGV0ZUdlblByV29ya2Zsb3dGaWxlTmFtZShlbnRyeS5uYW1lKSkgY29udGludWU7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsIGVudHJ5Lm5hbWUpLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICB9XG4gICAgY29uc3QgZmlsZU5hbWVTZXQgPSBuZXcgU2V0KFtcbiAgICAgICd0ZXN0LnltbCcsXG4gICAgICAnYXV0b2ZpeC55bWwnLFxuICAgICAgJ3NlbWFudGljLXByLnltbCcsXG4gICAgICAnY2xvc2UtY29tbWVudC55bWwnLFxuICAgICAgLi4uZW50cmllc1xuICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgIChkaXJlbnQpID0+IGRpcmVudC5pc0ZpbGUoKSAmJiBkaXJlbnQubmFtZS5lbmRzV2l0aCgnLnltbCcpICYmICFpc09ic29sZXRlR2VuUHJXb3JrZmxvd0ZpbGVOYW1lKGRpcmVudC5uYW1lKVxuICAgICAgICApXG4gICAgICAgIC5tYXAoKGRpcmVudCkgPT4gZGlyZW50Lm5hbWUpLFxuICAgIF0pO1xuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5zZW1hbnRpY1JlbGVhc2UpIHtcbiAgICAgIGZpbGVOYW1lU2V0LmFkZCgncmVsZWFzZS55bWwnKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGZpbGVOYW1lIG9mIGZpbGVOYW1lU2V0KSB7XG4gICAgICAvLyDlrp/pmpvjga9Lbm93bktpbmTku6XlpJbjga7lgKTjgoLku6PlhaXjgZXjgozjgovjgZPjgajjgavms6jmhI9cbiAgICAgIGNvbnN0IGtpbmQgPSBwYXRoLmJhc2VuYW1lKGZpbGVOYW1lLCAnLnltbCcpIGFzIEtub3duS2luZDtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiB3cml0ZVdvcmtmbG93WWFtbChyb290Q29uZmlnLCB3b3JrZmxvd3NQYXRoLCBraW5kKSk7XG4gICAgfVxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHJlcG9zaXRvcnk/OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHJlcG9zaXRvcnk/LmVuZHNXaXRoKCcvcmV1c2FibGUtd29ya2Zsb3dzJykgPz8gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGlzT2Jzb2xldGVHZW5QcldvcmtmbG93RmlsZU5hbWUoZmlsZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gL15nZW4tcHIoPzotLispP1xcLnlhP21sJC91LnRlc3QoZmlsZU5hbWUpO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZVdvcmtmbG93WWFtbChjb25maWc6IFBhY2thZ2VDb25maWcsIHdvcmtmbG93c1BhdGg6IHN0cmluZywga2luZDogS25vd25LaW5kKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKHdvcmtmbG93c1BhdGgsIGAke2tpbmR9LnltbGApO1xuICBjb25zdCBkZXBsb3lQcm9kdWN0aW9uV29ya2Zsb3dFeGlzdHMgPSBmcy5leGlzdHNTeW5jKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAnZGVwbG95LXByb2R1Y3Rpb24ueW1sJykpO1xuXG4gIGlmIChraW5kID09PSAnYXV0b2ZpeCcpIHtcbiAgICBhd2FpdCB3cml0ZVlhbWwoZ2VuZXJhdGVBdXRvZml4V29ya2Zsb3coY29uZmlnKSwgZmlsZVBhdGgpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBuZXdTZXR0aW5ncyA9IHN0cnVjdHVyZWRDbG9uZShraW5kIGluIHdvcmtmbG93cyA/IHdvcmtmbG93c1traW5kIGFzIGtleW9mIHR5cGVvZiB3b3JrZmxvd3NdIDoge30pIGFzIFdvcmtmbG93O1xuXG4gIHRyeSB7XG4gICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgIGNvbnN0IG9sZFNldHRpbmdzID0geWFtbC5sb2FkKG9sZENvbnRlbnQpIGFzIFdvcmtmbG93O1xuICAgIG5ld1NldHRpbmdzID0gbWVyZ2UuYWxsKFtuZXdTZXR0aW5ncywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzXSwgeyBhcnJheU1lcmdlOiBjb21iaW5lTWVyZ2UgfSkgYXMgV29ya2Zsb3c7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxuXG4gIC8vIFNraXAgYSBicm9rZW4gd29ya2Zsb3dcbiAgaWYgKCEoJ2pvYnMnIGluIG5ld1NldHRpbmdzKSkgcmV0dXJuO1xuXG4gIGlmIChraW5kLnN0YXJ0c1dpdGgoJ2RlcGxveScpKSB7XG4gICAgbmV3U2V0dGluZ3MgPSB7XG4gICAgICAuLi5uZXdTZXR0aW5ncyxcbiAgICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fScsXG4gICAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgfTtcbiAgICAvLyBNb3ZlIGpvYnMgdG8gdGhlIGJvdHRvbVxuICAgIG1vdmVUb0JvdHRvbShuZXdTZXR0aW5ncywgJ2pvYnMnKTtcbiAgICBpZiAobmV3U2V0dGluZ3Mub24/LnB1c2gpIHtcbiAgICAgIG5ld1NldHRpbmdzLm9uLnB1c2hbJ3BhdGhzLWlnbm9yZSddID0gW1xuICAgICAgICAuLi5uZXcgU2V0KFsnKioubWQnLCAnKiovZG9jcy8qKicsIC4uLihuZXdTZXR0aW5ncy5vbi5wdXNoWydwYXRocy1pZ25vcmUnXSA/PyBbXSldKSxcbiAgICAgIF07XG4gICAgfVxuICB9XG5cbiAgaWYgKGtpbmQgPT09ICdyZWxlYXNlJyAmJiBuZXdTZXR0aW5ncy5qb2JzLnJlbGVhc2UgJiYgZGVwbG95UHJvZHVjdGlvbldvcmtmbG93RXhpc3RzKSB7XG4gICAgbmV3U2V0dGluZ3MucGVybWlzc2lvbnMgPz89IHt9O1xuICAgIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zLmFjdGlvbnMgPSAnd3JpdGUnO1xuICAgIG5ld1NldHRpbmdzLmpvYnMucmVsZWFzZS53aXRoID8/PSB7fTtcbiAgICBuZXdTZXR0aW5ncy5qb2JzLnJlbGVhc2Uud2l0aC50cmlnZ2VyX2RlcGxveV93b3JrZmxvdyA9ICdkZXBsb3ktcHJvZHVjdGlvbi55bWwnO1xuICB9XG5cbiAgbGV0IGlzUmV1c2FibGVXb3JrZmxvdyA9IGZhbHNlO1xuICBmb3IgKGNvbnN0IGpvYiBvZiBPYmplY3QudmFsdWVzKG5ld1NldHRpbmdzLmpvYnMpKSB7XG4gICAgLy8gSWdub3JlIG5vbi1yZXVzYWJsZSB3b3JrZmxvd3NcbiAgICBpZiAoIWpvYi51c2VzPy5pbmNsdWRlcygnL3JldXNhYmxlLXdvcmtmbG93cy8nKSkgY29udGludWU7XG5cbiAgICBub3JtYWxpemVKb2IoY29uZmlnLCBqb2IsIGtpbmQpO1xuICAgIGlzUmV1c2FibGVXb3JrZmxvdyA9IHRydWU7XG4gIH1cbiAgaWYgKCFpc1JldXNhYmxlV29ya2Zsb3cpIHJldHVybjtcblxuICBzd2l0Y2ggKGtpbmQpIHtcbiAgICBjYXNlICdyZWxlYXNlJzoge1xuICAgICAgaWYgKG5ld1NldHRpbmdzLm9uPy5zY2hlZHVsZSkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3Mub24ucHVzaDtcbiAgICAgIH0gZWxzZSBpZiAobmV3U2V0dGluZ3Mub24/LnB1c2ggJiYgY29uZmlnLnJlbGVhc2UuYnJhbmNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBuZXdTZXR0aW5ncy5vbi5wdXNoLmJyYW5jaGVzID0gY29uZmlnLnJlbGVhc2UuYnJhbmNoZXM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBEb24ndCB1c2UgcmVsZWFzZS55bWwgaWYgcmVsZWFzZSBicmFuY2ggaXMgbm90IHNwZWNpZmllZFxuICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgJ3JlbGVhc2UueW1sJyksIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuaXNQdWJsaWNSZXBvKSB7XG4gICAgICAgIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zID8/PSB7fTtcbiAgICAgICAgbmV3U2V0dGluZ3MucGVybWlzc2lvbnNbJ2lkLXRva2VuJ10gPSAnd3JpdGUnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zPy5bJ2lkLXRva2VuJ107XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSAndGVzdCc6IHtcbiAgICAgIC8vIERvbid0IHVzZSBgcGF0aHMtaWdub3JlYCBmb3IgdGVzdCBiZWNhdXNlIEdpdEh1YidzIEJyYW5jaCBQcm90ZWN0aW9uIGFuZCBSdWxlc2V0cyByZXF1aXJlIGpvYiBydW5uaW5nLlxuICAgICAgaWYgKG5ld1NldHRpbmdzLm9uPy5wdWxsX3JlcXVlc3QpIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLm9uLnB1bGxfcmVxdWVzdFsncGF0aHMtaWdub3JlJ107XG4gICAgICB9XG4gICAgICBpZiAobmV3U2V0dGluZ3Mub24/LnB1c2gpIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLm9uLnB1c2hbJ3BhdGhzLWlnbm9yZSddO1xuICAgICAgICBuZXdTZXR0aW5ncy5vbi5wdXNoLmJyYW5jaGVzID0gbmV3U2V0dGluZ3Mub24ucHVzaC5icmFuY2hlcy5maWx0ZXIoKGJyYW5jaCkgPT4gYnJhbmNoICE9PSAncmVub3ZhdGUvKionKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICAvLyBObyBkZWZhdWx0XG4gIH1cbiAgYXdhaXQgd3JpdGVZYW1sKG5ld1NldHRpbmdzLCBmaWxlUGF0aCk7XG5cbiAgaWYgKGtpbmQgPT09ICdzeW5jJykge1xuICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAnc3luYy1pbml0LnltbCcpLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgIGlmICghbmV3U2V0dGluZ3Muam9icy5zeW5jPy53aXRoKSByZXR1cm47XG5cbiAgICAvLyBHZW5lcmF0ZSBzeW5jLWZvcmNlLnltbCBiYXNlZCBvbiBzeW5jLnltbCBpZiBpdCBleGlzdHMuXG4gICAgbmV3U2V0dGluZ3Muam9ic1snc3luYy1mb3JjZSddID0gbmV3U2V0dGluZ3Muam9icy5zeW5jO1xuICAgIGNvbnN0IHBhcmFtcyA9IG5ld1NldHRpbmdzLmpvYnMuc3luYy53aXRoLnN5bmNfcGFyYW1zX3dpdGhvdXRfZGVzdDtcbiAgICBpZiAodHlwZW9mIHBhcmFtcyAhPT0gJ3N0cmluZycpIHJldHVybjtcblxuICAgIG5ld1NldHRpbmdzLmpvYnMuc3luYy53aXRoLnN5bmNfcGFyYW1zX3dpdGhvdXRfZGVzdCA9IGAtLWZvcmNlICR7cGFyYW1zfWA7XG4gICAgbmV3U2V0dGluZ3MubmFtZSA9ICdGb3JjZSB0byBTeW5jJztcbiAgICBuZXdTZXR0aW5ncy5vbiA9IHsgd29ya2Zsb3dfZGlzcGF0Y2g6IG51bGwgfTtcbiAgICBkZWxldGUgbmV3U2V0dGluZ3Muam9icy5zeW5jO1xuICAgIGF3YWl0IHdyaXRlWWFtbChuZXdTZXR0aW5ncywgcGF0aC5qb2luKHdvcmtmbG93c1BhdGgsICdzeW5jLWZvcmNlLnltbCcpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVKb2IoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBqb2I6IEpvYiwga2luZDogS25vd25LaW5kKTogdm9pZCB7XG4gIGpvYi53aXRoID8/PSB7fTtcbiAgam9iLnNlY3JldHMgPz89IHt9O1xuICAvLyBVc2UgdHJ1c3RlZCBwdWJsaXNoaW5nIGluc3RlYWQgb2YgTlBNX1RPS0VOXG4gIGRlbGV0ZSBqb2Iuc2VjcmV0cy5OUE1fVE9LRU47XG5cbiAgaWYgKGtpbmQgPT09ICd0ZXN0JyB8fCBraW5kID09PSAncmVsZWFzZScpIHtcbiAgICBqb2Iuc2VjcmV0cy5HSF9UT0tFTiA9ICcke3sgc2VjcmV0cy5HSVRIVUJfVE9LRU4gfX0nO1xuICB9XG5cbiAgaWYgKGpvYi5zZWNyZXRzLkZJUkVCQVNFX1RPS0VOKSB7XG4gICAgam9iLnNlY3JldHMuR0NQX1NBX0tFWV9KU09OX0ZPUl9GSVJFQkFTRSA9ICcke3sgc2VjcmV0cy5HQ1BfU0FfS0VZX0pTT05fRk9SX0ZJUkVCQVNFIH19JztcbiAgICBkZWxldGUgam9iLnNlY3JldHMuRklSRUJBU0VfVE9LRU47XG4gIH1cbiAgaWYgKFxuICAgIChqb2Iuc2VjcmV0cy5ESVNDT1JEX1dFQkhPT0tfVVJMICYmIChraW5kID09PSAncmVsZWFzZScgfHwga2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSkpIHx8XG4gICAgKGpvYi53aXRoLnNlcnZlcl91cmwgJiYga2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSlcbiAgKSB7XG4gICAgam9iLnNlY3JldHMuRElTQ09SRF9XRUJIT09LX1VSTCA9ICcke3sgc2VjcmV0cy5ESVNDT1JEX1dFQkhPT0tfVVJMX0ZPUl9SRUxFQVNFIH19JztcbiAgfVxuXG4gIGlmIChraW5kID09PSAnc3luYycpIHtcbiAgICBjb25zdCBwYXJhbXMgPSBqb2Iud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3Q7XG4gICAgaWYgKHR5cGVvZiBwYXJhbXMgPT09ICdzdHJpbmcnKSB7XG4gICAgICBqb2Iud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3QgPSBwYXJhbXMucmVwbGFjZSgnc3luYyAnLCAnJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXIvJykpIHtcbiAgICBqb2IudXNlcyA9IGpvYi51c2VzPy5yZXBsYWNlKCdXaWxsQm9vc3RlckxhYi8nLCAnV2lsbEJvb3N0ZXIvJyk7XG4gIH0gZWxzZSBpZiAoY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKSkge1xuICAgIGpvYi51c2VzID0gam9iLnVzZXM/LnJlcGxhY2UoJ1dpbGxCb29zdGVyLycsICdXaWxsQm9vc3RlckxhYi8nKTtcbiAgfVxuXG4gIC8vIFJlbW92ZSByZWR1bmRhbnQgcGFyYW1ldGVyc1xuICBpZiAoam9iLndpdGguZG90X2Vudl9wYXRoID09PSAnLmVudicpIHtcbiAgICBkZWxldGUgam9iLndpdGguZG90X2Vudl9wYXRoO1xuICB9XG5cbiAgLy8gRG9uJ3QgdXNlIGBmbHkgZGVwbG95IC0tanNvbmAgc2luY2UgaXQgY2F1c2VzIGFuIGVycm9yXG4gIGlmIChraW5kLnN0YXJ0c1dpdGgoJ2RlcGxveScpICYmIGpvYi5zZWNyZXRzLkZMWV9BUElfVE9LRU4gJiYgdHlwZW9mIGpvYi53aXRoLmRlcGxveV9jb21tYW5kID09PSAnc3RyaW5nJykge1xuICAgIGpvYi53aXRoLmRlcGxveV9jb21tYW5kID0gam9iLndpdGguZGVwbG95X2NvbW1hbmQucmVwbGFjZSgvXFxzKy0tanNvbi8sICcnKTtcbiAgfVxuICBpZiAoY29uZmlnLmRvZXNDb250YWluRG9ja2VyZmlsZSAmJiAham9iLndpdGguY2lfbGFiZWwgJiYga2luZC5zdGFydHNXaXRoKCd0ZXN0JykpIHtcbiAgICBqb2Iud2l0aC5jaV9sYWJlbCA9ICdsYXJnZSc7XG4gIH1cbiAgLy8gQmVjYXVzZSBnaXRodWIuZXZlbnQucmVwb3NpdG9yeS5wcml2YXRlIGlzIGFsd2F5cyB0cnVlIGlmIGpvYiBpcyBzY2hlZHVsZWRcbiAgaWYgKGtpbmQgPT09ICdyZWxlYXNlJyB8fCBraW5kID09PSAndGVzdCcgfHwga2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSkge1xuICAgIGlmIChjb25maWcuaXNQdWJsaWNSZXBvKSB7XG4gICAgICBqb2Iud2l0aC5naXRodWJfaG9zdGVkX3J1bm5lciA9IHRydWU7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGRlbGV0ZSBqb2Iud2l0aC5naXRodWJfaG9zdGVkX3J1bm5lcjtcbiAgfVxuXG4gIGlmIChPYmplY3Qua2V5cyhqb2Iud2l0aCkubGVuZ3RoID4gMCkge1xuICAgIHNvcnRLZXlzKGpvYi53aXRoKTtcbiAgfSBlbHNlIHtcbiAgICBkZWxldGUgam9iLndpdGg7XG4gIH1cbiAgaWYgKE9iamVjdC5rZXlzKGpvYi5zZWNyZXRzKS5sZW5ndGggPiAwKSB7XG4gICAgLy8gTW92ZSBzZWNyZXRzIHByb3AgYWZ0ZXIgd2l0aCBwcm9wXG4gICAgY29uc3QgbmV3U2VjcmV0cyA9IHNvcnRLZXlzKGpvYi5zZWNyZXRzKTtcbiAgICBkZWxldGUgam9iLnNlY3JldHM7XG4gICAgam9iLnNlY3JldHMgPSBuZXdTZWNyZXRzO1xuICB9IGVsc2Uge1xuICAgIGRlbGV0ZSBqb2Iuc2VjcmV0cztcbiAgfVxufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUF1dG9maXhXb3JrZmxvdyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBXb3JrZmxvdyB7XG4gIGlmICghY29uZmlnLmlzUHVibGljUmVwbykge1xuICAgIHJldHVybiBzdHJ1Y3R1cmVkQ2xvbmUocHJpdmF0ZVJlcG9BdXRvZml4V29ya2Zsb3cpO1xuICB9XG5cbiAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSBjb25maWcuaXNCdW4gPyAnYnVuJyA6ICd5YXJuJztcbiAgY29uc3Qgc3RlcHM6IFN0ZXBbXSA9IFtcbiAgICB7IHVzZXM6ICdhY3Rpb25zL2NoZWNrb3V0QHY2JyB9LFxuICAgIHsgdXNlczogJ2FjdGlvbnMvc2V0dXAtbm9kZUB2NicsIHdpdGg6IHsgJ2NoZWNrLWxhdGVzdCc6IHRydWUsICdub2RlLXZlcnNpb24nOiAnbHRzLyonIH0gfSxcbiAgICAuLi4oY29uZmlnLmlzQnVuID8gW3sgdXNlczogJ292ZW4tc2gvc2V0dXAtYnVuQHYyJywgd2l0aDogeyAnYnVuLXZlcnNpb24nOiAnbGF0ZXN0JyB9IH1dIDogW10pLFxuICAgIHsgcnVuOiBgJHtwYWNrYWdlTWFuYWdlcn0gaW5zdGFsbGAgfSxcbiAgICB7IHJ1bjogYCR7cGFja2FnZU1hbmFnZXJ9IHJ1biBjbGVhbnVwYCB9LFxuICBdO1xuICBpZiAoY29uZmlnLnBhY2thZ2VKc29uPy5zY3JpcHRzPy5idWlsZCkge1xuICAgIHN0ZXBzLnB1c2goeyBydW46IGAke3BhY2thZ2VNYW5hZ2VyfSBydW4gYnVpbGRgIH0pO1xuICB9XG4gIHN0ZXBzLnB1c2goeyB1c2VzOiAnYXV0b2ZpeC1jaS9hY3Rpb25AdjEnIH0pO1xuXG4gIGNvbnN0IGF1dG9maXhXb3JrZmxvdyA9IHN0cnVjdHVyZWRDbG9uZShwdWJsaWNSZXBvQXV0b2ZpeFdvcmtmbG93KTtcbiAgY29uc3QgYXV0b2ZpeEpvYiA9IGF1dG9maXhXb3JrZmxvdy5qb2JzLmF1dG9maXggPz8geyAncnVucy1vbic6ICd1YnVudHUtbGF0ZXN0JyB9O1xuICBhdXRvZml4V29ya2Zsb3cuam9icy5hdXRvZml4ID0geyAuLi5hdXRvZml4Sm9iLCBzdGVwcyB9O1xuICByZXR1cm4gYXV0b2ZpeFdvcmtmbG93O1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZVlhbWwobmV3U2V0dGluZ3M6IFdvcmtmbG93LCBmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHlhbWxUZXh0ID0gcmVtb3ZlVHJhaWxpbmdTcGFjZXMoXG4gICAgeWFtbC5kdW1wKG5ld1NldHRpbmdzLCB7IGxpbmVXaWR0aDogLTEsIG5vQ29tcGF0TW9kZTogdHJ1ZSwgc3R5bGVzOiB7ICchIW51bGwnOiAnZW1wdHknIH0gfSlcbiAgKTtcbiAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGZpbGVQYXRoLCB5YW1sVGV4dCk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZVRyYWlsaW5nU3BhY2VzKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIGpzLXlhbWwgZW1pdHMgdmFsdWVsZXNzIEdpdEh1YiBBY3Rpb25zIGV2ZW50cyBhcyBgZXZlbnQ6IGAgd2hlbiB1c2luZyB0aGUgZW1wdHkgbnVsbCBzdHlsZS5cbiAgcmV0dXJuIHRleHQucmVwbGFjZUFsbCgvWyBcXHRdKyQvZ20sICcnKTtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuXG5pbXBvcnQgeyBpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyB9IGZyb20gJy4uL2dlbmVyYXRvcnMvd29ya2Zsb3cuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuLi9vcHRpb25zLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGdsb2JJZ25vcmUgfSBmcm9tICcuLi91dGlscy9nbG9iVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFR5cG9zKHBhY2thZ2VDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhUeXBvcycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8ocGFja2FnZUNvbmZpZy5yZXBvc2l0b3J5KSkgcmV0dXJuO1xuXG4gICAgY29uc3QgZGlyUGF0aCA9IHBhY2thZ2VDb25maWcuZGlyUGF0aDtcbiAgICBjb25zdCBkb2NGaWxlcyA9IGF3YWl0IGZnLmdsb2IoJyoqLyoubWQnLCB7IGRvdDogdHJ1ZSwgY3dkOiBkaXJQYXRoLCBpZ25vcmU6IGdsb2JJZ25vcmUgfSk7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYEZvdW5kICR7ZG9jRmlsZXMubGVuZ3RofSBtYXJrZG93biBmaWxlcyBpbiAke2RpclBhdGh9YCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgbWRGaWxlIG9mIGRvY0ZpbGVzKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBtZEZpbGUpO1xuICAgICAgdm9pZCBwcm9taXNlUG9vbC5ydW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihmaWxlUGF0aCk7XG4gICAgICAgIGlmIChjb250ZW50ID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICAgICAgbGV0IG5ld0NvbnRlbnQgPSBmaXhUeXBvc0luVGV4dChjb250ZW50KTtcbiAgICAgICAgbmV3Q29udGVudCA9IHJlcGxhY2VXaXRoQ29uZmlnKG5ld0NvbnRlbnQsIHBhY2thZ2VDb25maWcsICdkb2MnKTtcbiAgICAgICAgaWYgKGNvbnRlbnQgIT09IG5ld0NvbnRlbnQpIHtcbiAgICAgICAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgdHNGaWxlcyA9IGF3YWl0IGZnLmdsb2IoXG4gICAgICBbXG4gICAgICAgICd7YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4LGN0cyxtdHMsdHMsdHN4fScsXG4gICAgICAgICdwYWNrYWdlcy8qKi97YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4LGN0cyxtdHMsdHMsdHN4fScsXG4gICAgICBdLFxuICAgICAgeyBkb3Q6IHRydWUsIGN3ZDogZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH1cbiAgICApO1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBGb3VuZCAke3RzRmlsZXMubGVuZ3RofSBUeXBlU2NyaXB0IGZpbGVzIGluICR7ZGlyUGF0aH1gKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCB0c0ZpbGUgb2YgdHNGaWxlcykge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgdHNGaWxlKTtcbiAgICAgIHZvaWQgcHJvbWlzZVBvb2wucnVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGgpO1xuICAgICAgICBpZiAob2xkQ29udGVudCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgICAgIGxldCBuZXdDb250ZW50ID0gZml4VHlwb3NJbkNvZGUob2xkQ29udGVudCk7XG4gICAgICAgIG5ld0NvbnRlbnQgPSByZXBsYWNlV2l0aENvbmZpZyhuZXdDb250ZW50LCBwYWNrYWdlQ29uZmlnLCAndHMnKTtcblxuICAgICAgICBpZiAob2xkQ29udGVudCAhPT0gbmV3Q29udGVudCkge1xuICAgICAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCB0ZXh0QmFzZWRGaWxlcyA9IGF3YWl0IGZnLmdsb2IoJyoqLyoue2NzdixodG0saHRtbCx0c3YseG1sLHlhbWwseW1sfScsIHtcbiAgICAgIGRvdDogdHJ1ZSxcbiAgICAgIGN3ZDogZGlyUGF0aCxcbiAgICAgIGlnbm9yZTogZ2xvYklnbm9yZSxcbiAgICB9KTtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRm91bmQgJHt0ZXh0QmFzZWRGaWxlcy5sZW5ndGh9IHRleHQtYmFzZWQgZmlsZXMgaW4gJHtkaXJQYXRofWApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgdGV4dEJhc2VkRmlsZXMpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIGZpbGUpO1xuICAgICAgdm9pZCBwcm9taXNlUG9vbC5ydW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihmaWxlUGF0aCk7XG4gICAgICAgIGlmIChvbGRDb250ZW50ID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICAgICAgbGV0IG5ld0NvbnRlbnQgPSBmaXhUeXBvc0luVGV4dChvbGRDb250ZW50KTtcbiAgICAgICAgbmV3Q29udGVudCA9IHJlcGxhY2VXaXRoQ29uZmlnKG5ld0NvbnRlbnQsIHBhY2thZ2VDb25maWcsICd0ZXh0Jyk7XG5cbiAgICAgICAgaWYgKG9sZENvbnRlbnQgIT09IG5ld0NvbnRlbnQpIHtcbiAgICAgICAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpeFR5cG9zSW5UZXh0KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBjb250ZW50XG4gICAgLnJlcGxhY2VBbGwoL1xcYmNcXC5mXFwuKD89XFxzfCQpL2csICdjZi4nKVxuICAgIC5yZXBsYWNlQWxsKC9cXGJlZ1xcLig/PVxcc3wkKS9nLCAnZS5nLicpXG4gICAgLnJlcGxhY2VBbGwoL1xcYmllXFwuKD89XFxzKS9nLCAnaS5lLicpO1xufVxuXG5mdW5jdGlvbiBmaXhUeXBvc0luQ29kZShjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gY29udGVudFxuICAgIC5yZXBsYWNlQWxsKC9cXC9cXCpbXFxzXFxTXSo/XFwqXFwvL2csIChjb21tZW50KSA9PiBmaXhUeXBvc0luVGV4dChjb21tZW50KSlcbiAgICAucmVwbGFjZUFsbCgvKF58XFxzKVxcL1xcLyguKj8pY1xcLmZcXC4vZywgJyQxLy8kMmNmLicpXG4gICAgLnJlcGxhY2VBbGwoLyhefFxccylcXC9cXC8oLio/KWVnXFwuL2csICckMS8vJDJlLmcuJylcbiAgICAucmVwbGFjZUFsbCgvKF58XFxzKVxcL1xcLyguKj8paWVcXC4vZywgJyQxLy8kMmkuZS4nKTtcbn1cblxuZnVuY3Rpb24gcmVwbGFjZVdpdGhDb25maWcobmV3Q29udGVudDogc3RyaW5nLCBwYWNrYWdlQ29uZmlnOiBQYWNrYWdlQ29uZmlnLCBwcm9wTmFtZTogJ2RvYycgfCAndHMnIHwgJ3RleHQnKTogc3RyaW5nIHtcbiAgZm9yIChjb25zdCBbYmVmb3JlLCBhZnRlcl0gb2YgT2JqZWN0LmVudHJpZXMocGFja2FnZUNvbmZpZy53YmZ5SnNvbj8udHlwb3M/LmFsbCA/PyB7fSkpIHtcbiAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlQWxsKGJlZm9yZSwgYWZ0ZXIpO1xuICB9XG4gIGZvciAoY29uc3QgW2JlZm9yZSwgYWZ0ZXJdIG9mIE9iamVjdC5lbnRyaWVzKHBhY2thZ2VDb25maWcud2JmeUpzb24/LnR5cG9zPy5bcHJvcE5hbWVdID8/IHt9KSkge1xuICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2VBbGwoYmVmb3JlLCBhZnRlcik7XG4gIH1cbiAgcmV0dXJuIG5ld0NvbnRlbnQ7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgZ2V0UGFja2FnZU1hbmFnZXJDb21tYW5kIH0gZnJvbSAnLi4vdXRpbHMvcGFja2FnZUNhcGFiaWxpdGllcy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbnMocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZywgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIXJvb3RDb25maWcuaXNSb290KSByZXR1cm47XG5cbiAgICAvLyBDaGVjayBpZiBBR0VOVFNfRVhUUkEubWQgZXhpc3RzIGFuZCByZWFkIGl0cyBjb250ZW50XG4gICAgY29uc3QgYWdlbnRzRXh0cmFQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJ0FHRU5UU19FWFRSQS5tZCcpO1xuICAgIGNvbnN0IGV4dHJhQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoYWdlbnRzRXh0cmFQYXRoKTtcblxuICAgIGZvciAoY29uc3QgW2ZpbGVOYW1lLCB0b29sTmFtZV0gb2YgW1xuICAgICAgWydBR0VOVFMubWQnLCAnQ29kZXggQ0xJJ10sXG4gICAgICBbJ0NMQVVERS5tZCcsICdDbGF1ZGUgQ29kZSddLFxuICAgICAgWydHRU1JTkkubWQnLCAnR2VtaW5pIENMSSddLFxuICAgIF0gYXMgY29uc3QpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb24ocm9vdENvbmZpZywgYWxsQ29uZmlncywgdG9vbE5hbWUsIGV4dHJhQ29udGVudCk7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsIGZpbGVOYW1lKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb250ZW50KSk7XG4gICAgfVxuXG4gICAgY29uc3QgY3Vyc29yUnVsZXNQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5jdXJzb3IvcnVsZXMvZ2VuZXJhbC5tZGMnKTtcbiAgICBjb25zdCBjdXJzb3JSdWxlc0NvbnRlbnQgPSBnZW5lcmF0ZUN1cnNvckdlbmVyYWxNZGNDb250ZW50KHJvb3RDb25maWcsIGFsbENvbmZpZ3MsIGV4dHJhQ29udGVudCk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoY3Vyc29yUnVsZXNQYXRoLCBjdXJzb3JSdWxlc0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlQ3Vyc29yR2VuZXJhbE1kY0NvbnRlbnQoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdLFxuICBleHRyYUNvbnRlbnQ/OiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIGNvbnN0IGZyb250bWF0dGVyID0gYC0tLVxcbmRlc2NyaXB0aW9uOiBHZW5lcmFsIENvZGluZyBSdWxlc1xcbmdsb2JzOlxcbmFsd2F5c0FwcGx5OiB0cnVlXFxuLS0tYDtcbiAgY29uc3QgYm9keSA9IGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbihjb25maWcsIGFsbENvbmZpZ3MsICdDdXJzb3InLCBleHRyYUNvbnRlbnQpO1xuICByZXR1cm4gYCR7ZnJvbnRtYXR0ZXJ9XFxuXFxuJHtib2R5fWA7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbihcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdLFxuICB0b29sTmFtZTogc3RyaW5nLFxuICBleHRyYUNvbnRlbnQ/OiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gZ2V0UGFja2FnZU1hbmFnZXJDb21tYW5kKHJvb3RDb25maWcpO1xuICBjb25zdCBiYXNlQ29udGVudCA9IGBcbiMjIFByb2plY3QgSW5mb3JtYXRpb25cblxuLSBOYW1lOiBcXGAke3Jvb3RDb25maWcucGFja2FnZUpzb24/Lm5hbWUgfHwgJ3Vua25vd24nfVxcYFxuLSBEZXNjcmlwdGlvbjogJHtyb290Q29uZmlnLnBhY2thZ2VKc29uPy5kZXNjcmlwdGlvbn1cbi0gUGFja2FnZSBNYW5hZ2VyOiAke3BhY2thZ2VNYW5hZ2VyfVxuXG4jIyBHZW5lcmFsIEluc3RydWN0aW9uc1xuXG4tIENyZWF0ZSBhIG5ldyBicmFuY2ggaWYgdGhlIGN1cnJlbnQgYnJhbmNoIGlzIFxcYG1haW5cXGAuXG4tIFJ1biBhbnkgXFxgZ2l0XFxgIGNvbW1hbmRzIHNlcXVlbnRpYWxseS5cbi0gV3JpdGUgdGVzdHMgT05MWSBpZiBleHBsaWNpdGx5IHJlcXVlc3RlZC4gSWYgcmVxdWVzdGVkLCBmb2xsb3cgdGhlc2UgcnVsZXM6XG4gIC0gQ29udGludWUgbW9kaWZ5aW5nIHRlc3RzIGFuZC9vciBjb2RlIHVudGlsIGFsbCB0ZXN0cyBwYXNzLlxuICAtIEVuc3VyZSB0ZXN0cyBhcmUgaWRlbXBvdGVudCBhbmQgaW5kZXBlbmRlbnQgKGUuZy4sIHJlc2V0IHBlcnNpc3RlbnQgZGF0YSkgc28gdGhleSBjYW4gcnVuIHJlcGVhdGVkbHkgb3IgaW4gcGFyYWxsZWwuXG4gIC0gUHJlZmVyIGFjdHVhbCBBUEkgY2FsbHMgb3ZlciBtb2NrcywgdW5sZXNzIGFjdHVhbCBjYWxscyBhcmUgaW1wcmFjdGljYWwsIGhhdmUgdW5pbnRlbmRlZCBzaWRlIGVmZmVjdHMsIG9yIG1vY2tzIGFyZSBleHBsaWNpdGx5IHJlcXVlc3RlZC5cbiAgLSBBbHdheXMgaW52ZXN0aWdhdGUgdGhlIHJvb3QgY2F1c2Ugb2YgYSB0ZXN0IGZhaWx1cmUgYmVmb3JlIGZpeGluZyBpdC5cbiAgLSBBdm9pZCBhZGRpbmcgd2FpdCBmdW5jdGlvbnMgaW4gRTJFIHRlc3RzIHVubGVzcyBzdHJpY3RseSBuZWNlc3NhcnkuXG4tIFdoZW4gZml4aW5nIGlzc3VlcywgZm9sbG93IHRoZXNlIHJ1bGVzOlxuICAtIEludmVzdGlnYXRlIHRoZSByb290IGNhdXNlIGZpcnN0IChlLmcuLCBieSBnYXRoZXJpbmcgZGVidWcgbG9ncywgdGFraW5nIHNjcmVlbnNob3RzLCBldGMuKS5cbiAgLSBGaXggdGhlIGFjdHVhbCByb290IGNhdXNlIGluc3RlYWQgb2YgYXBwbHlpbmcgd29ya2Fyb3VuZHMuXG4tIEFmdGVyIG1ha2luZyBjb2RlIGNoYW5nZXMsIHJ1biBcXGAke3BhY2thZ2VNYW5hZ2VyfSB2ZXJpZnktZnVsbFxcYCB0byBleGVjdXRlIGFsbCB0ZXN0cyAodGFrZXMgdXAgdG8gMSBob3VyKSwgb3IgXFxgJHtwYWNrYWdlTWFuYWdlcn0gdmVyaWZ5XFxgIGZvciBvbmx5IHR5cGUgY2hlY2tpbmcgYW5kIGxpbnRpbmcgKHRha2VzIHVwIHRvIDEwIG1pbnV0ZXMpLlxuICAtIElmIHlvdSBhcmUgY29uZmlkZW50IHRoYXQgeW91ciBjaGFuZ2VzIHdpbGwgbm90IGJyZWFrIGFueSB0ZXN0cywgeW91IG1heSB1c2UgXFxgdmVyaWZ5XFxgLlxuICAtIFVzZSBcXGBveGxpbnRcXGAgaWdub3JlIGNvbW1lbnRzIHdpdGggcmVhc29ucyAoZS5nLiwgXFxgLy8gb3hsaW50LWRpc2FibGUtbmV4dC1saW5lIDxydWxlPiAtLSA8cmVhc29uPlxcYCkgaWYgbGludCBlcnJvcnMgb3Igd2FybmluZ3MgY2Fubm90IGJlIGZpeGVkLlxuLSBPbmNlIHlvdSBoYXZlIHZlcmlmaWVkIHlvdXIgY2hhbmdlcywgY29tbWl0IGFuZCBwdXNoIHRoZW0gdG8gdGhlIGN1cnJlbnQgKG5vbi1tYWluKSBicmFuY2gsIHRoZW4gY3JlYXRlIGEgUFIgdmlhIFxcYGdoXFxgLlxuICAtIEZvbGxvdyB0aGUgY29udmVudGlvbmFsIGNvbW1pdHM7IHlvdXIgY29tbWl0IG1lc3NhZ2Ugc2hvdWxkIHN0YXJ0IHdpdGggXFxgZmVhdDpcXGAsIFxcYGZpeDpcXGAsIGV0Yy5cbiAgLSBJZiBub3Qgc3BlY2lmaWVkLCBtYWtlIHN1cmUgdG8gYWRkIGEgbmV3IGxpbmUgYXQgdGhlIGVuZCBvZiB5b3VyIGNvbW1pdCBtZXNzYWdlJHtyb290Q29uZmlnLmlzV2lsbEJvb3N0ZXJSZXBvID8gYCB3aXRoOiBcXGBDby1hdXRob3JlZC1ieTogV2lsbEJvb3N0ZXIgKCR7dG9vbE5hbWV9KSA8YWdlbnRAd2lsbGJvb3N0ZXIuY29tPlxcYGAgOiAnJ30uXG4gIC0gQWx3YXlzIGNyZWF0ZSBuZXcgY29tbWl0cy4gQXZvaWQgdXNpbmcgXFxgLS1hbWVuZFxcYC5cbi0gQWx3YXlzIHVzZSBoZXJlZG9jIHN5bnRheCB3aGVuIHBhc3NpbmcgbXVsdGktbGluZSBjb250ZW50IHRvIGFueSBjb21tYW5kLlxuLSBQdXQgdGVtcG9yYXJ5IGZpbGVzIGluIHRoZSBcXGAudG1wXFxgIG9yIFxcYC90bXBcXGAgZGlyZWN0b3J5LlxuJHtoYXNQbGF5d3JpZ2h0VGVzdFNlcnZlcihhbGxDb25maWdzKSA/IGAtIFVzZSBcXGAke3BhY2thZ2VNYW5hZ2VyfSB3YiBzdGFydCAtLW1vZGUgdGVzdFxcYCB0byBsYXVuY2ggYSB3ZWIgc2VydmVyIGZvciBkZWJ1Z2dpbmcgb3IgdGVzdGluZy5gIDogJyd9XG5cbiR7Z2VuZXJhdGVBZ2VudENvZGluZ1N0eWxlKGFsbENvbmZpZ3MpfVxuYFxuICAgIC5yZXBsYWNlQWxsKC9cXC5cXG5cXG4rLS9nLCAnLlxcbi0nKVxuICAgIC5yZXBsYWNlQWxsKC9cXG57Myx9L2csICdcXG5cXG4nKVxuICAgIC50cmltKCk7XG5cbiAgY29uc3QgaGFzTmV3U2VjdGlvbiA9IGV4dHJhQ29udGVudD8udHJpbSgpLnN0YXJ0c1dpdGgoJyMnKTtcbiAgY29uc3Qgbm9ybWFsaXplZEV4dHJhQ29udGVudCA9IGV4dHJhQ29udGVudFxuICAgID8gaGFzTmV3U2VjdGlvblxuICAgICAgPyAnXFxuXFxuJyArIGV4dHJhQ29udGVudC50cmltKClcbiAgICAgIDogJ1xcbicgKyBleHRyYUNvbnRlbnRcbiAgICA6ICcnO1xuICByZXR1cm4gYmFzZUNvbnRlbnQgKyBub3JtYWxpemVkRXh0cmFDb250ZW50O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVBZ2VudENvZGluZ1N0eWxlKGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IHN0cmluZyB7XG4gIC8vIEtlZXAgdG9wLWRvd24gb3JkZXJpbmcgZ3VpZGFuY2UgZnVuY3Rpb24tb25seSBiZWNhdXNlIGNsYXNzZXMgYXJlIG5vdCBob2lzdGVkIGFuZCBjYW4gZmFpbCB3aGVuIGluaGVyaXRhbmNlIG9yIHRvcC1sZXZlbCBpbnN0YW50aWF0aW9uIGRlcGVuZHMgb24gZGVjbGFyYXRpb24gb3JkZXIuXG4gIHJldHVybiBgXG4jIyBDb2RpbmcgU3R5bGVcblxuLSBVc2UgY2FtZWxDYXNlIGZvciBKYXZhU2NyaXB0IGFuZCBUeXBlU2NyaXB0IGZpbGVzIChvciBQYXNjYWxDYXNlIGZvciBSZWFjdCBjb21wb25lbnRzKS5cbi0gU2ltcGxpZnkgY29kZSBhcyBtdWNoIGFzIHBvc3NpYmxlIHRvIGVsaW1pbmF0ZSByZWR1bmRhbmN5LlxuLSBEZXNpZ24gZWFjaCBtb2R1bGUgd2l0aCBoaWdoIGNvaGVzaW9uLCBncm91cGluZyByZWxhdGVkIGZ1bmN0aW9uYWxpdHkgdG9nZXRoZXIuXG4gIC0gUmVmYWN0b3IgZXhpc3RpbmcgbGFyZ2UgbW9kdWxlcyBpbnRvIHNtYWxsZXIsIGZvY3VzZWQgbW9kdWxlcyB3aGVuIG5lY2Vzc2FyeS5cbiAgLSBDcmVhdGUgd2VsbC1vcmdhbml6ZWQgZGlyZWN0b3J5IHN0cnVjdHVyZXMgd2l0aCBsb3cgY291cGxpbmcgYW5kIGhpZ2ggY29oZXNpb24uXG4tIFBsYWNlIGNhbGxpbmcgZnVuY3Rpb25zIGFib3ZlIHRoZSBmdW5jdGlvbnMgdGhleSBjYWxsIHRvIG1haW50YWluIGEgY2xlYXIgdG9wLWRvd24gb3JkZXIuXG4gIC0gZS5nLiwgXFxgZnVuY3Rpb24gY2FsbGVyKCkgeyBjYWxsZWUoKTsgfSBmdW5jdGlvbiBjYWxsZWUoKSB7IC4uLiB9XFxgXG4gIC0gVW5saWtlIGZ1bmN0aW9ucywgcGxhY2UgdmFyaWFibGUgYW5kIHR5cGUgZGVjbGFyYXRpb25zIEFCT1ZFIHRoZWlyIHVzYWdlLlxuLSBXcml0ZSBjb21tZW50cyBhbmQgSlNEb2MgZm9yIGNvbXBsZXggb3IgaGFyZC10by11bmRlcnN0YW5kIGNvZGUuXG4gIC0gRXhwbGFpbiBcIndoeVwiIGluIGNvbW1lbnRzIGFuZCBcIndoYXRcIiBpbiBKU0RvYy5cbiAgLSBBdm9pZCBzdGF0aW5nIHdoYXQgY2FuIGJlIGVhc2lseSB1bmRlcnN0b29kIGZyb20gdGhlIGNvZGUgaXRzZWxmLlxuLSBQcmVmZXIgXFxgdW5kZWZpbmVkXFxgIG92ZXIgXFxgbnVsbFxcYCB1bmxlc3MgZXhwbGljaXRseSByZXF1aXJlZCBieSBBUElzIG9yIGxpYnJhcmllcy5cbi0gUHJlZmVyIHVzaW5nIGEgc2luZ2xlIHRlbXBsYXRlIGxpdGVyYWwgZm9yIHByb21wdHMgaW5zdGVhZCBvZiBcXGBqb2luKClcXGAgd2l0aCBhIHByZS1jb21wdXRhYmxlIGFycmF5IGxpdGVyYWwgb2Ygc3RyaW5ncy5cbi0gQXNzdW1lIHRoYXQgYWxsIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgcHJvcGVybHkgZGVmaW5lZC5cbiAgLSBJZiB2YWxpZGF0aW9uIGlzIHJlcXVpcmVkLCB1c2UgXFxgYXNzZXJ0XFxgIHRvIGZhaWwgZmFzdCAoZS5nLiwgZHVyaW5nIHN0YXJ0dXApLlxuJHtcbiAgYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRlcGVuZGluZy5nZW5JMThuVHMpXG4gICAgPyBgLSBXaGVuIGludHJvZHVjaW5nIG5ldyBzdHJpbmcgbGl0ZXJhbHMgaW4gUmVhY3QgY29tcG9uZW50cywgdXBkYXRlIHRoZSBsYW5ndWFnZSByZXNvdXJjZSBmaWxlcyBpbiB0aGUgXFxgaTE4blxcYCBkaXJlY3RvcnkgKGUuZy4sIFxcYGkxOG4vamEtSlAuanNvblxcYCkuIFJlZmVyZW5jZSB0aGVzZSBzdHJpbmdzIHVzaW5nIHRoZSBcXGBpMThuXFxgIHV0aWxpdHkuIEZvciBleGFtcGxlLCB1c2UgXFxgaTE4bi5wYWdlcy5ob21lLnRpdGxlKClcXGAgZm9yIFxcYHsgXCJwYWdlc1wiOiB7IFwiaG9tZVwiOiB7IFwidGl0bGVcIjogXCJNeSBBcHBcIiB9IH0gfVxcYC5gXG4gICAgOiAnJ1xufVxuXG4ke1xuICBhbGxDb25maWdzLnNvbWUoKGMpID0+IGMuZGVwZW5kaW5nLnJlYWN0IHx8IGMuZGVwZW5kaW5nLm5leHQpXG4gICAgPyBgLSBQcmVmZXIgbGFtYmRhIG92ZXIgXFxgZnVuY3Rpb25cXGAgZm9yIFJlYWN0IGNvbXBvbmVudHMsIGUuZy4sIFxcYGNvbnN0IEJ1dHRvbjogUmVhY3QuRkMgPSAoKSA9PiB7XFxgLlxuLSBQcmVmZXIgXFxgdXNlSW1tZXJcXGAgZm9yIHN0b3JpbmcgYW4gYXJyYXkgb3IgYW4gb2JqZWN0IHRvIFxcYHVzZVN0YXRlXFxgLlxuLSBBbGxvdyBcXGBhdXRvRm9jdXNcXGAgdG8gbWluaW1pemUgdXNlciBlZmZvcnQuYFxuICAgIDogJydcbn1cbiR7XG4gIGFsbENvbmZpZ3Muc29tZSgoYykgPT4gYy5kZXBlbmRpbmcubmV4dClcbiAgICA/IGBcbi0gU2luY2UgdGhpcyBwcm9qZWN0IHVzZXMgdGhlIFJlYWN0IENvbXBpbGVyLCB5b3UgZG8gbm90IG5lZWQgdG8gdXNlIFxcYHVzZUNhbGxiYWNrXFxgIG9yIFxcYHVzZU1lbW9cXGAgZm9yIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbi5cbi0gQXNzdW1lIHRoZXJlIGlzIG9ubHkgYSBzaW5nbGUgc2VydmVyIGluc3RhbmNlLlxuYFxuICAgIDogJydcbn1cbmBcbiAgICAucmVwbGFjZUFsbCgvXFwuXFxuXFxuKy0vZywgJy5cXG4tJylcbiAgICAucmVwbGFjZUFsbCgvXFxuezMsfS9nLCAnXFxuXFxuJylcbiAgICAudHJpbSgpO1xufVxuXG5mdW5jdGlvbiBoYXNQbGF5d3JpZ2h0VGVzdFNlcnZlcihjb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBib29sZWFuIHtcbiAgcmV0dXJuIGNvbmZpZ3Muc29tZSgoY29uZmlnKSA9PiBjb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRUZXN0KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IHBhcnNlIH0gZnJvbSAnc21vbC10b21sJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5pbnRlcmZhY2UgQnVuZmlnVG9tbCB7XG4gIGluc3RhbGw/OiB7XG4gICAgZXhhY3Q/OiBib29sZWFuO1xuICB9O1xuICBydW4/OiB7XG4gICAgYnVuPzogYm9vbGVhbjtcbiAgfTtcbn1cblxuY29uc3QgbWluaW11bVJlbGVhc2VBZ2VFeGNsdWRlcyA9IFtcbiAgLy8gLS0tLS0tLS0tLSBTVEFSVDogV2UgYmVsaWV2ZSBvdXIgcGFja2FnZXMgYXJlIHNhZmUgLS0tLS0tLS0tLVxuICAnQGV4ZXJjb2RlL3Byb2JsZW0tdXRpbHMnLFxuICAnQHdpbGxib29zdGVyL2FnZW50LXNraWxscycsXG4gICdAd2lsbGJvb3N0ZXIvYmFiZWwtY29uZmlncycsXG4gICdAd2lsbGJvb3N0ZXIvbW9uYWNvLWxvYWRlcicsXG4gICdAd2lsbGJvb3N0ZXIvbW9uYWNvLXJlYWN0JyxcbiAgJ0B3aWxsYm9vc3Rlci9veGZtdC1jb25maWcnLFxuICAnQHdpbGxib29zdGVyL294bGludC1jb25maWcnLFxuICAnQHdpbGxib29zdGVyL3ByZXR0aWVyLWNvbmZpZycsXG4gICdAd2lsbGJvb3N0ZXIvcmVub3ZhdGUtY29uZmlnJyxcbiAgJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliJyxcbiAgJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLWJsaXR6LW5leHQnLFxuICAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbmV4dCcsXG4gICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlJyxcbiAgJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLXJlYWN0JyxcbiAgJ0B3aWxsYm9vc3Rlci93YicsXG4gICdhZ2VudC1ydW50aW1lLWtpdCcsXG4gICdhdC1kZWNvcmF0b3JzJyxcbiAgJ2J1aWxkLXRzJyxcbiAgJ2dlbi1pMThuLXRzJyxcbiAgJ29uZS13YXktZ2l0LXN5bmMnLFxuICAvLyAtLS0tLS0tLS0tIEVORDogV2UgYmVsaWV2ZSBvdXIgcGFja2FnZXMgYXJlIHNhZmUgLS0tLS0tLS0tLVxuXG4gIC8vIHdiZnkgcGlucyB0aGVzZSB0b29saW5nIHBhY2thZ2VzIGFuZCBtYXkgYXBwbHkgdGhlbSBpbW1lZGlhdGVseSBhZnRlciBhXG4gIC8vIHJlbGVhc2UsIGJlZm9yZSB0aGUgZ2xvYmFsIG1pbmltdW0tcmVsZWFzZS1hZ2Ugd2luZG93IGhhcyBlbGFwc2VkLlxuICAnQHR5cGVzY3JpcHQvbmF0aXZlLXByZXZpZXcnLFxuICAnQHR5cGVzY3JpcHQvbmF0aXZlLXByZXZpZXctZGFyd2luLWFybTY0JyxcbiAgJ0B0eXBlc2NyaXB0L25hdGl2ZS1wcmV2aWV3LWRhcndpbi14NjQnLFxuICAnQHR5cGVzY3JpcHQvbmF0aXZlLXByZXZpZXctbGludXgtYXJtJyxcbiAgJ0B0eXBlc2NyaXB0L25hdGl2ZS1wcmV2aWV3LWxpbnV4LWFybTY0JyxcbiAgJ0B0eXBlc2NyaXB0L25hdGl2ZS1wcmV2aWV3LWxpbnV4LXg2NCcsXG4gICdAdHlwZXNjcmlwdC9uYXRpdmUtcHJldmlldy13aW4zMi1hcm02NCcsXG4gICdAdHlwZXNjcmlwdC9uYXRpdmUtcHJldmlldy13aW4zMi14NjQnLFxuICAnb3hmbXQnLFxuICAnQG94Zm10L2JpbmRpbmctYW5kcm9pZC1hcm0tZWFiaScsXG4gICdAb3hmbXQvYmluZGluZy1hbmRyb2lkLWFybTY0JyxcbiAgJ0BveGZtdC9iaW5kaW5nLWRhcndpbi1hcm02NCcsXG4gICdAb3hmbXQvYmluZGluZy1kYXJ3aW4teDY0JyxcbiAgJ0BveGZtdC9iaW5kaW5nLWZyZWVic2QteDY0JyxcbiAgJ0BveGZtdC9iaW5kaW5nLWxpbnV4LWFybS1nbnVlYWJpaGYnLFxuICAnQG94Zm10L2JpbmRpbmctbGludXgtYXJtLW11c2xlYWJpaGYnLFxuICAnQG94Zm10L2JpbmRpbmctbGludXgtYXJtNjQtZ251JyxcbiAgJ0BveGZtdC9iaW5kaW5nLWxpbnV4LWFybTY0LW11c2wnLFxuICAnQG94Zm10L2JpbmRpbmctbGludXgtcHBjNjQtZ251JyxcbiAgJ0BveGZtdC9iaW5kaW5nLWxpbnV4LXJpc2N2NjQtZ251JyxcbiAgJ0BveGZtdC9iaW5kaW5nLWxpbnV4LXJpc2N2NjQtbXVzbCcsXG4gICdAb3hmbXQvYmluZGluZy1saW51eC1zMzkweC1nbnUnLFxuICAnQG94Zm10L2JpbmRpbmctbGludXgteDY0LWdudScsXG4gICdAb3hmbXQvYmluZGluZy1saW51eC14NjQtbXVzbCcsXG4gICdAb3hmbXQvYmluZGluZy1vcGVuaGFybW9ueS1hcm02NCcsXG4gICdAb3hmbXQvYmluZGluZy13aW4zMi1hcm02NC1tc3ZjJyxcbiAgJ0BveGZtdC9iaW5kaW5nLXdpbjMyLWlhMzItbXN2YycsXG4gICdAb3hmbXQvYmluZGluZy13aW4zMi14NjQtbXN2YycsXG4gICdveGxpbnQnLFxuICAnQG94bGludC9iaW5kaW5nLWFuZHJvaWQtYXJtLWVhYmknLFxuICAnQG94bGludC9iaW5kaW5nLWFuZHJvaWQtYXJtNjQnLFxuICAnQG94bGludC9iaW5kaW5nLWRhcndpbi1hcm02NCcsXG4gICdAb3hsaW50L2JpbmRpbmctZGFyd2luLXg2NCcsXG4gICdAb3hsaW50L2JpbmRpbmctZnJlZWJzZC14NjQnLFxuICAnQG94bGludC9iaW5kaW5nLWxpbnV4LWFybS1nbnVlYWJpaGYnLFxuICAnQG94bGludC9iaW5kaW5nLWxpbnV4LWFybS1tdXNsZWFiaWhmJyxcbiAgJ0BveGxpbnQvYmluZGluZy1saW51eC1hcm02NC1nbnUnLFxuICAnQG94bGludC9iaW5kaW5nLWxpbnV4LWFybTY0LW11c2wnLFxuICAnQG94bGludC9iaW5kaW5nLWxpbnV4LXBwYzY0LWdudScsXG4gICdAb3hsaW50L2JpbmRpbmctbGludXgtcmlzY3Y2NC1nbnUnLFxuICAnQG94bGludC9iaW5kaW5nLWxpbnV4LXJpc2N2NjQtbXVzbCcsXG4gICdAb3hsaW50L2JpbmRpbmctbGludXgtczM5MHgtZ251JyxcbiAgJ0BveGxpbnQvYmluZGluZy1saW51eC14NjQtZ251JyxcbiAgJ0BveGxpbnQvYmluZGluZy1saW51eC14NjQtbXVzbCcsXG4gICdAb3hsaW50L2JpbmRpbmctb3Blbmhhcm1vbnktYXJtNjQnLFxuICAnQG94bGludC9iaW5kaW5nLXdpbjMyLWFybTY0LW1zdmMnLFxuICAnQG94bGludC9iaW5kaW5nLXdpbjMyLWlhMzItbXN2YycsXG4gICdAb3hsaW50L2JpbmRpbmctd2luMzIteDY0LW1zdmMnLFxuICAnb3hsaW50LXRzZ29saW50JyxcbiAgJ0BveGxpbnQtdHNnb2xpbnQvZGFyd2luLWFybTY0JyxcbiAgJ0BveGxpbnQtdHNnb2xpbnQvZGFyd2luLXg2NCcsXG4gICdAb3hsaW50LXRzZ29saW50L2xpbnV4LWFybTY0JyxcbiAgJ0BveGxpbnQtdHNnb2xpbnQvbGludXgteDY0JyxcbiAgJ0BveGxpbnQtdHNnb2xpbnQvd2luMzItYXJtNjQnLFxuICAnQG94bGludC10c2dvbGludC93aW4zMi14NjQnLFxuICAnQG5leHQvZW52JyxcbiAgJ0BuZXh0L2ZvbnQnLFxuICAnQG5leHQvcnNwYWNrLWJpbmRpbmctbGludXgtYXJtNjQtZ251JyxcbiAgJ0BuZXh0L3JzcGFjay1iaW5kaW5nLWxpbnV4LWFybTY0LW11c2wnLFxuICAnQG5leHQvcnNwYWNrLWJpbmRpbmctbGludXgteDY0LWdudScsXG4gICdAbmV4dC9yc3BhY2stYmluZGluZy1saW51eC14NjQtbXVzbCcsXG4gICdAbmV4dC9zd2MtYW5kcm9pZC1hcm0tZWFiaScsXG4gICdAbmV4dC9zd2MtYW5kcm9pZC1hcm02NCcsXG4gICdAbmV4dC9zd2MtZGFyd2luLWFybTY0JyxcbiAgJ0BuZXh0L3N3Yy1kYXJ3aW4teDY0JyxcbiAgJ0BuZXh0L3N3Yy1mcmVlYnNkLXg2NCcsXG4gICdAbmV4dC9zd2MtbGludXgtYXJtLWdudWVhYmloZicsXG4gICdAbmV4dC9zd2MtbGludXgtYXJtNjQtZ251JyxcbiAgJ0BuZXh0L3N3Yy1saW51eC1hcm02NC1tdXNsJyxcbiAgJ0BuZXh0L3N3Yy1saW51eC14NjQtZ251JyxcbiAgJ0BuZXh0L3N3Yy1saW51eC14NjQtbXVzbCcsXG4gICdAbmV4dC9zd2Mtd2FzbS1ub2RlanMnLFxuICAnQG5leHQvc3djLXdhc20td2ViJyxcbiAgJ0BuZXh0L3RoaXJkLXBhcnRpZXMnLFxuICAnbmV4dCcsXG4gICdyZWFjdCcsXG4gICdyZWFjdC1kb20nLFxuXTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQnVuZmlnVG9tbChjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUJ1bmZpZ1RvbWwnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdidW5maWcudG9tbCcpO1xuICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpID8gZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmOCcpIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGNvbnRlbnQgPSBuZXdDb250ZW50KGV4aXN0aW5nQ29udGVudCk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmNvbnN0IG5ld0NvbnRlbnQgPSAoZXhpc3RpbmdDb250ZW50OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBidW5maWdUb21sID0gcGFyc2VCdW5maWdUb21sKGV4aXN0aW5nQ29udGVudCk7XG4gIHJldHVybiBgZW52ID0gZmFsc2VcbnRlbGVtZXRyeSA9IGZhbHNlXG5cbiR7Z2VuZXJhdGVSdW5TZWN0aW9uKGJ1bmZpZ1RvbWwpfVxuW2luc3RhbGxdXG5leGFjdCA9ICR7YnVuZmlnVG9tbD8uaW5zdGFsbD8uZXhhY3QgPT09IGZhbHNlID8gJ2ZhbHNlJyA6ICd0cnVlJ31cbmxpbmtlciA9IFwiaG9pc3RlZFwiXG5taW5pbXVtUmVsZWFzZUFnZSA9IDQzMjAwMCAjIDUgZGF5c1xubWluaW11bVJlbGVhc2VBZ2VFeGNsdWRlcyA9IFtcbiR7bWluaW11bVJlbGVhc2VBZ2VFeGNsdWRlcy5tYXAoKHBhY2thZ2VOYW1lKSA9PiBgICAgIFwiJHtwYWNrYWdlTmFtZX1cIixgKS5qb2luKCdcXG4nKX1cbl1cbmA7XG59O1xuXG5mdW5jdGlvbiBwYXJzZUJ1bmZpZ1RvbWwoY29udGVudDogc3RyaW5nIHwgdW5kZWZpbmVkKTogQnVuZmlnVG9tbCB8IHVuZGVmaW5lZCB7XG4gIGlmICghY29udGVudCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgdHJ5IHtcbiAgICByZXR1cm4gcGFyc2UoY29udGVudCkgYXMgQnVuZmlnVG9tbDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZVJ1blNlY3Rpb24oYnVuZmlnVG9tbDogQnVuZmlnVG9tbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIHJldHVybiB0eXBlb2YgYnVuZmlnVG9tbD8ucnVuPy5idW4gPT09ICdib29sZWFuJyA/IGBbcnVuXVxcbmJ1biA9ICR7YnVuZmlnVG9tbC5ydW4uYnVufVxcbmAgOiAnJztcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcblxuY29uc3QgdXNlckNvbnRlbnRIZWFkZXIgPSAnIyBQcm9qZWN0LXNwZWNpZmljIHNldHRpbmdzJztcbmNvbnN0IHVzZXJDb250ZW50SGVhZGVyUmVnZXggPSAvIyBQcm9qZWN0LXNwZWNpZmljIHNldHRpbmdzW15cXG5dKlxcbi9nbTtcbmNvbnN0IHNlcGFyYXRvciA9ICcjIEdlbmVyYXRlZCBieSB3YmZ5JztcbmNvbnN0IHNlcGFyYXRvclByZWZpeCA9ICcjIEdlbmVyYXRlZCBieSAnO1xuY29uc3QgZGVmYXVsdEhlYWRVc2VyQ29udGVudCA9IGAke3VzZXJDb250ZW50SGVhZGVyfSAoaGVhZClcblxuXG4ke3NlcGFyYXRvcn1cbmA7XG5jb25zdCBkZWZhdWx0VGFpbFVzZXJDb250ZW50ID0gYFxuJHt1c2VyQ29udGVudEhlYWRlcn0gKHRhaWwpXG5gO1xuXG5leHBvcnQgY29uc3QgaWdub3JlRmlsZVV0aWwgPSB7XG4gIHNlcGFyYXRvcixcbiAgc2VwYXJhdG9yUHJlZml4LFxuICBkZWZhdWx0SGVhZFVzZXJDb250ZW50LFxuICBkZWZhdWx0VGFpbFVzZXJDb250ZW50LFxuICBhc3luYyByZWFkR2l0aWdub3JlV2l0aG91dFNlcGFyYXRvcnMoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGxldCBjb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBsYXN0SGVhZGVySW5kZXggPSBnZXRJbmRleE9mVGFpbFVzZXJDb250ZW50SGVhZGVyKGNvbnRlbnQpO1xuICAgICAgaWYgKGxhc3RIZWFkZXJJbmRleCA+IDApIHtcbiAgICAgICAgY29udGVudCA9IGNvbnRlbnQuc2xpY2UoMCwgbGFzdEhlYWRlckluZGV4IC0gMSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gKFxuICAgICAgICBjb250ZW50XG4gICAgICAgICAgLnJlcGxhY2VBbGwodXNlckNvbnRlbnRIZWFkZXJSZWdleCwgJycpXG4gICAgICAgICAgLnJlcGxhY2VBbGwoLyMgR2VuZXJhdGVkIGJ5IFteXFxuXSpcXG4vZ20sICcnKVxuICAgICAgICAgIC5yZXBsYWNlQWxsKC9cXHI/XFxuXFxyP1xcbihcXHI/XFxuKSsvZ20sICdcXG5cXG4nKVxuICAgICAgICAgIC50cmltKCkgKyAnXFxuJ1xuICAgICAgKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gIH0sXG4gIGdldEhlYWRVc2VyQ29udGVudChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGluZGV4ID0gY29udGVudC5pbmRleE9mKHRoaXMuc2VwYXJhdG9yUHJlZml4KTtcbiAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICByZXR1cm4gY29udGVudFxuICAgICAgICAuc2xpY2UoMCwgY29udGVudC5pbmRleE9mKCdcXG4nLCBpbmRleCkgKyAxKVxuICAgICAgICAucmVwbGFjZUFsbCh1c2VyQ29udGVudEhlYWRlclJlZ2V4LCBgJHt1c2VyQ29udGVudEhlYWRlcn0gKGhlYWQpXFxuYCk7XG4gICAgfVxuICAgIHJldHVybiBkZWZhdWx0SGVhZFVzZXJDb250ZW50O1xuICB9LFxuICBnZXRUYWlsVXNlckNvbnRlbnQoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBsYXN0SGVhZGVySW5kZXggPSBnZXRJbmRleE9mVGFpbFVzZXJDb250ZW50SGVhZGVyKGNvbnRlbnQpO1xuICAgIGlmIChsYXN0SGVhZGVySW5kZXggPiAwKSB7XG4gICAgICByZXR1cm4gY29udGVudC5zbGljZShsYXN0SGVhZGVySW5kZXggLSAxKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlZmF1bHRUYWlsVXNlckNvbnRlbnQ7XG4gIH0sXG4gIGFzeW5jIGlzQmVycnlaZXJvSW5zdGFsbEVuYWJsZWQoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICByZXR1cm4gY29udGVudC5pbmNsdWRlcygnXFxuIS55YXJuL2NhY2hlJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LFxufTtcblxuZnVuY3Rpb24gZ2V0SW5kZXhPZlRhaWxVc2VyQ29udGVudEhlYWRlcihjb250ZW50OiBzdHJpbmcpOiBudW1iZXIge1xuICBjb25zdCBpbmRleCA9IGNvbnRlbnQuaW5kZXhPZih1c2VyQ29udGVudEhlYWRlcik7XG4gIGNvbnN0IGxhc3RJbmRleCA9IGNvbnRlbnQubGFzdEluZGV4T2YodXNlckNvbnRlbnRIZWFkZXIpO1xuICByZXR1cm4gbGFzdEluZGV4ID4gaW5kZXggPyBsYXN0SW5kZXggOiAtMTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBpZ25vcmVGaWxlVXRpbCB9IGZyb20gJy4uL3V0aWxzL2lnbm9yZUZpbGVVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG4vLyBFeGVyY29kZeOBp+OBr25vZGVfbW9kdWxlc+OCkkNPUFnjgZnjgovlv4XopoHjgYzjgYLjgovjgZ/jgoHjgIFub2RlX21vZHVsZXPjgpLpmaTlpJbjgZfjgabjga/jgYTjgZHjgarjgYTjgIJcbmNvbnN0IGNvbW1vbkNvbnRlbnQgPSBgXG4qKi8uaWRlYVxuKiovKi5zcWxpdGUzKlxuKiovLnlhcm4vaW5zdGFsbC1zdGF0ZS5nelxuKiovLnZlbnZcbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZURvY2tlcmlnbm9yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZURvY2tlcmlnbm9yZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5kb2NrZXJpZ25vcmUnKTtcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluRG9ja2VyZmlsZSkge1xuICAgICAgY29uc3QgY29udGVudCA9IChhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoKSkgPz8gJyc7XG4gICAgICBjb25zdCBoZWFkVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRIZWFkVXNlckNvbnRlbnQoY29udGVudCk7XG4gICAgICBjb25zdCB0YWlsVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRUYWlsVXNlckNvbnRlbnQoY29udGVudCk7XG5cbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBoZWFkVXNlckNvbnRlbnQgKyBjb21tb25Db250ZW50ICsgdGFpbFVzZXJDb250ZW50O1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgfVxuICB9KTtcbn1cbiIsImV4cG9ydCBjb25zdCBleHRlbnNpb25zID0ge1xuICBjb2RlV2l0aDJJbmRlbnRTaXplOiBbXG4gICAgJ2NqcycsXG4gICAgJ21qcycsXG4gICAgJ2pzJyxcbiAgICAnanN4JyxcbiAgICAnY3RzJyxcbiAgICAnbXRzJyxcbiAgICAndHMnLFxuICAgICd0c3gnLFxuICAgICdqc29uJyxcbiAgICAnanNvbjUnLFxuICAgICdqc29uYycsXG4gICAgJ2NwcCcsXG4gICAgJ2RhcnQnLFxuICAgICdodG0nLFxuICAgICdodG1sJyxcbiAgICAncHUnLFxuICAgICdwdW1sJyxcbiAgICAncmInLFxuICAgICd2dWUnLFxuICAgICd4bWwnLFxuICAgICd5YW1sJyxcbiAgICAneW1sJyxcbiAgICAnc2gnLFxuICBdLnRvU29ydGVkKCksXG4gIGNvZGVXaXRoNEluZGVudFNpemU6IFsnZ28nLCAnZ3JhZGxlJywgJ2phdmEnLCAncHknXS50b1NvcnRlZCgpLFxuICBtYXJrZG93bkxpa2U6IFsnbWQnXS50b1NvcnRlZCgpLFxuICBveGxpbnQ6IFsnYXN0cm8nLCAnY2pzJywgJ2N0cycsICdqcycsICdqc3gnLCAnbWpzJywgJ210cycsICdzdmVsdGUnLCAndHMnLCAndHN4JywgJ3Z1ZSddLnRvU29ydGVkKCksXG4gIG94Zm10OiBbXG4gICAgJ2FzdHJvJyxcbiAgICAnY2pzJyxcbiAgICAnY3NzJyxcbiAgICAnY3RzJyxcbiAgICAnZ3FsJyxcbiAgICAnZ3JhcGhxbCcsXG4gICAgJ2hicycsXG4gICAgJ2h0bScsXG4gICAgJ2h0bWwnLFxuICAgICdqcycsXG4gICAgJ2pzb24nLFxuICAgICdqc29uNScsXG4gICAgJ2pzb25jJyxcbiAgICAnanN4JyxcbiAgICAnbGVzcycsXG4gICAgJ21kJyxcbiAgICAnbWR4JyxcbiAgICAnbWpzJyxcbiAgICAnbXRzJyxcbiAgICAnc2NzcycsXG4gICAgJ3N2ZWx0ZScsXG4gICAgJ3RvbWwnLFxuICAgICd0cycsXG4gICAgJ3RzeCcsXG4gICAgJ3Z1ZScsXG4gICAgJ3lhbWwnLFxuICAgICd5bWwnLFxuICBdLnRvU29ydGVkKCksXG4gIHByZXR0aWVyT25seTogWydqYXZhJ10udG9Tb3J0ZWQoKSxcbn07XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IG5ld0NvbnRlbnQgPSBgcm9vdCA9IHRydWVcblxuWypdXG5jaGFyc2V0ID0gdXRmLThcbmVuZF9vZl9saW5lID0gbGZcbmluc2VydF9maW5hbF9uZXdsaW5lID0gdHJ1ZVxudHJpbV90cmFpbGluZ193aGl0ZXNwYWNlID0gdHJ1ZVxuXG4ke2dlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zLmNvZGVXaXRoMkluZGVudFNpemUpfVxuaW5kZW50X3NpemUgPSAyXG5pbmRlbnRfc3R5bGUgPSBzcGFjZVxuXG4ke2dlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zLmNvZGVXaXRoNEluZGVudFNpemUpfVxuaW5kZW50X3NpemUgPSA0XG5pbmRlbnRfc3R5bGUgPSBzcGFjZVxuXG4ke2dlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zLm1hcmtkb3duTGlrZSl9XG5tYXhfbGluZV9sZW5ndGggPSBvZmZcbnRyaW1fdHJhaWxpbmdfd2hpdGVzcGFjZSA9IGZhbHNlXG5cblt7TWFrZWZpbGUsKi5ta31dXG5pbmRlbnRfc3R5bGUgPSB0YWJcbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUVkaXRvcmNvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUVkaXRvcmNvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lZGl0b3Jjb25maWcnKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGV4dGVuc2lvbnMubGVuZ3RoID4gMSA/IGBbKi57JHtleHRlbnNpb25zLmpvaW4oJywnKX19XWAgOiBgWyouJHtleHRlbnNpb25zWzBdfV1gO1xufVxuIiwiLy8gb3hsaW50LWRpc2FibGUgZXNsaW50LXBsdWdpbi1pbXBvcnQvbm8tbmFtZWQtYXMtZGVmYXVsdC1tZW1iZXIgLS0gTmFtZXNwYWNlIFlBTUwgY2FsbHMgbWFrZSBsb2FkL2R1bXAgdXNhZ2UgY2xlYXJlci5cbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IHlhbWwgZnJvbSAnanMteWFtbCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW1wb3J0IHsgZ2VuZXJhdGVBZ2VudENvZGluZ1N0eWxlIH0gZnJvbSAnLi9hZ2VudHMuanMnO1xuXG5jb25zdCBkZWZhdWx0Q29uZmlnID0ge1xuICBoYXZlX2Z1bjogdHJ1ZSxcbiAgY29kZV9yZXZpZXc6IHtcbiAgICBkaXNhYmxlOiBmYWxzZSxcbiAgICBjb21tZW50X3NldmVyaXR5X3RocmVzaG9sZDogJ01FRElVTScsXG4gICAgbWF4X3Jldmlld19jb21tZW50czogLTEsXG4gICAgcHVsbF9yZXF1ZXN0X29wZW5lZDoge1xuICAgICAgaGVscDogZmFsc2UsXG4gICAgICBzdW1tYXJ5OiB0cnVlLFxuICAgICAgY29kZV9yZXZpZXc6IHRydWUsXG4gICAgfSxcbiAgfSxcbiAgaWdub3JlX3BhdHRlcm5zOiBbJyoqL19fZ2VuZXJhdGVkX18nXSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUdlbWluaUNvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcsIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlR2VtaW5pQ29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghY29uZmlnLmlzUm9vdCkgcmV0dXJuO1xuXG4gICAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5nZW1pbmknKTtcbiAgICBjb25zdCBjb25maWdGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnY29uZmlnLnltbCcpO1xuICAgIGNvbnN0IHN0eWxlZ3VpZGVGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnc3R5bGVndWlkZS5tZCcpO1xuICAgIGNvbnN0IGFnZW50c0V4dHJhUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ0FHRU5UU19FWFRSQS5tZCcpO1xuXG4gICAgbGV0IG5ld0NvbmZpZzogb2JqZWN0ID0gc3RydWN0dXJlZENsb25lKGRlZmF1bHRDb25maWcpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoY29uZmlnRmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBvbGRDb25maWcgPSB5YW1sLmxvYWQob2xkQ29udGVudCkgYXMgb2JqZWN0O1xuICAgICAgbmV3Q29uZmlnID0gbWVyZ2UuYWxsKFtuZXdDb25maWcsIG9sZENvbmZpZywgbmV3Q29uZmlnXSwgeyBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmcgLSBmaWxlIGRvZXNuJ3QgZXhpc3Qgb3IgY2FuJ3QgYmUgcGFyc2VkXG4gICAgfVxuXG4gICAgY29uc3QgeWFtbENvbnRlbnQgPSB5YW1sLmR1bXAobmV3Q29uZmlnLCB7XG4gICAgICBsaW5lV2lkdGg6IC0xLFxuICAgICAgbm9Db21wYXRNb2RlOiB0cnVlLFxuICAgICAgc3R5bGVzOiB7XG4gICAgICAgICchIW51bGwnOiAnZW1wdHknLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGV4dHJhQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoYWdlbnRzRXh0cmFQYXRoKTtcbiAgICBjb25zdCBjb2RpbmdSdWxlRXh0cmFDb250ZW50ID0gZXh0cmFDb250ZW50Py50cmltU3RhcnQoKS5zdGFydHNXaXRoKCcjJykgPyB1bmRlZmluZWQgOiBleHRyYUNvbnRlbnQ7XG4gICAgY29uc3QgcmV2aWV3TGFuZ3VhZ2VJbnN0cnVjdGlvbiA9IGNvbmZpZy5pc1B1YmxpY1JlcG9cbiAgICAgID8gJ1JldmlldyBpbiBFbmdsaXNoIGJhc2VkIG9uIHRoZSBmb2xsb3dpbmcgY29kaW5nIHN0YW5kYXJkcy4nXG4gICAgICA6ICfku6XkuIvjga7jgrPjg7zjg4fjgqPjg7PjgrDopo/ntITjgpLouI/jgb7jgYjjgabjgIHml6XmnKzoqp7jgafjg6zjg5Pjg6Xjg7zjgZfjgabjgY/jgaDjgZXjgYTjgIInO1xuICAgIGNvbnN0IHN0eWxlZ3VpZGVDb250ZW50ID0gYCR7cmV2aWV3TGFuZ3VhZ2VJbnN0cnVjdGlvbn1cXG5cXG4ke2dlbmVyYXRlQWdlbnRDb2RpbmdTdHlsZShhbGxDb25maWdzKX0ke1xuICAgICAgY29kaW5nUnVsZUV4dHJhQ29udGVudCA/IGBcXG4ke2NvZGluZ1J1bGVFeHRyYUNvbnRlbnQudHJpbUVuZCgpfWAgOiAnJ1xuICAgIH1gO1xuXG4gICAgY29uc3QgcHJvbWlzZXMgPSBbXG4gICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShjb25maWdGaWxlUGF0aCwgeWFtbENvbnRlbnQpKSxcbiAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKHN0eWxlZ3VpZGVGaWxlUGF0aCwgc3R5bGVndWlkZUNvbnRlbnQpKSxcbiAgICBdO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW1vdmVHZW1pbmlTZXR0aW5ncyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdlbWluaVNldHRpbmdzJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghY29uZmlnLmlzUm9vdCkgcmV0dXJuO1xuXG4gICAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5nZW1pbmknKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnc2V0dGluZ3MuanNvbicpO1xuICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pO1xuICB9KTtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuLy8gY2YuIGh0dHBzOi8vYnVuLnNoL2d1aWRlcy9pbnN0YWxsL2dpdC1kaWZmLWJ1bi1sb2NrZmlsZVxuY29uc3QgbmV3Q29udGVudCA9IGAqIHRleHQ9YXV0b1xuXG4qLmxvY2tiIGJpbmFyeSBkaWZmPWxvY2tiXG4qLnZjcHJvaiB0ZXh0IGVvbD1jcmxmXG5cbiR7Wy4uLmV4dGVuc2lvbnMuY29kZVdpdGgySW5kZW50U2l6ZSwgLi4uZXh0ZW5zaW9ucy5jb2RlV2l0aDRJbmRlbnRTaXplLCAuLi5leHRlbnNpb25zLm1hcmtkb3duTGlrZV1cbiAgLm1hcCgoZXh0KSA9PiBgKi4ke2V4dH0gdGV4dCBlb2w9bGZgKVxuICAuam9pbignXFxuJyl9XG5cbmRpc3QvKiogbGluZ3Vpc3QtZ2VuZXJhdGVkPXRydWVcbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGF0dHJpYnV0ZXMnKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBvcyBmcm9tICdub2RlOm9zJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBpZ25vcmVGaWxlVXRpbCB9IGZyb20gJy4uL3V0aWxzL2lnbm9yZUZpbGVVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG4vLyBEbyBub3QgcmVtb3ZlIGB3aW5kb3dzYDogZ2VuZXJhdGVkIC5naXRpZ25vcmUgZmlsZXMgbXVzdCBrZWVwIGlnbm9yaW5nIFdpbmRvd3MtY3JlYXRlZCBsb2NhbCBhcnRpZmFjdHMuXG5jb25zdCBkZWZhdWx0TmFtZXMgPSBbJ3dpbmRvd3MnLCAnbWFjb3MnLCAnbGludXgnLCAnamV0YnJhaW5zJywgJ3Zpc3VhbHN0dWRpb2NvZGUnLCAnZW1hY3MnLCAndmltJywgJ3lhcm4nXTtcblxuY29uc3QgY29tbW9uQ29udGVudCA9IGBcbiEua2VlcFxuLmFpZGVyKlxuLmVudi5wcm9kdWN0aW9uXG4qL21vdW50LyouaGFzaFxuLmRldmNvbnRhaW5lci9cbi5pZGVhL0F1Z21lbnRXZWJ2aWV3U3RhdGVTdG9yZS54bWxcbi5pZGVhL2NvcGlsb3QuKlxuLmlkZWEvY29waWxvdC9jaGF0U2Vzc2lvbnMvXG4ucGxheXdyaWdodC1jbGkvXG4uc2VyZW5hL1xuLnRtcC9cbi53Yi9cbl9fZ2VuZXJhdGVkX18vXG5Ad2lsbGJvb3N0ZXIvXG5kaXN0L1xuZHJpenpsZS9tb3VudC9cbnRlbXAvXG50bXAvXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHaXRpZ25vcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHaXRpZ25vcmUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aWdub3JlJyk7XG4gICAgY29uc3QgY29udGVudCA9IChhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoKSkgPz8gJyc7XG4gICAgbGV0IGhlYWRVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldEhlYWRVc2VyQ29udGVudChjb250ZW50KSArIGNvbW1vbkNvbnRlbnQ7XG4gICAgY29uc3QgdGFpbFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0VGFpbFVzZXJDb250ZW50KGNvbnRlbnQpO1xuXG4gICAgY29uc3QgbmFtZXMgPSBbLi4uZGVmYXVsdE5hbWVzXTtcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluR2VtZmlsZSkge1xuICAgICAgbmFtZXMucHVzaCgncnVieScpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluR29Nb2QpIHtcbiAgICAgIG5hbWVzLnB1c2goJ2dvJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYCR7cGF0aC5iYXNlbmFtZShjb25maWcuZGlyUGF0aCl9XG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24pIHtcbiAgICAgIG5hbWVzLnB1c2goJ25vZGUnKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvbVhtbCkge1xuICAgICAgbmFtZXMucHVzaCgnbWF2ZW4nKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLmlkZWEvZ29vZ2xlLWphdmEtZm9ybWF0LnhtbFxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBuYW1lcy5wdXNoKCdmbHV0dGVyJywgJ0FuZHJvaWRTdHVkaW8nLCAncnVieScpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuZmx1dHRlci1wbHVnaW5zLWRlcGVuZGVuY2llc1xuYW5kcm9pZC9rZXkucHJvcGVydGllc1xuaW9zLy5idW5kbGVcbi5pZGVhL3J1bkNvbmZpZ3VyYXRpb25zLnhtbFxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblRlbXBsYXRlWWFtbCkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuYXdzLXNhbS9cbnBhY2thZ2VkLnlhbWxcbmA7XG4gICAgfVxuICAgIC8vIEJlY2F1c2UgLnZlbnYgc2hvdWxkIGJlIGlnbm9yZWQgb24gcm9vdCBkaXJlY3RvcnlcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jayB8fCBjb25maWcuZG9lc0NvbnRhaW5VdkxvY2spIHtcbiAgICAgIG5hbWVzLnB1c2goJ3B5dGhvbicpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAudmVudi9cbmA7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHopIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLmJsaXR6L1xuLmJsaXR6KipcbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLm5leHQpIHtcbiAgICAgIG5hbWVzLnB1c2goJ25leHRqcycpO1xuICAgIH1cbiAgICBpZiAocm9vdENvbmZpZy5kZXBlbmRpbmcuZmlyZWJhc2UgfHwgY29uZmlnLmRlcGVuZGluZy5maXJlYmFzZSkge1xuICAgICAgbmFtZXMucHVzaCgnZmlyZWJhc2UnKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHJpc21hKSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYCouc3FsaXRlMypcbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRUZXN0KSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYHBsYXl3cmlnaHQtcmVwb3J0L1xudGVzdC1yZXN1bHRzL1xuYDtcbiAgICB9XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlIHx8IGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICAgIG5hbWVzLnB1c2goJ3JlYWN0bmF0aXZlJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYGdvb2dsZS1zZXJ2aWNlcy5qc29uXG5hbmRyb2lkL2FwcC9zcmMvbWFpbi9hc3NldHMvXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5zdG9yeWJvb2spIHtcbiAgICAgIG5hbWVzLnB1c2goJ3N0b3J5Ym9va2pzJyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLmxpdGVzdHJlYW0pIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgZ2NwLXNhLWtleS5qc29uXG5gO1xuICAgIH1cblxuICAgIGxldCBnZW5lcmF0ZWQgPSAnJztcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcbiAgICAgIGxldCBjb250ZW50ID0gKGF3YWl0IHJlYWRDYWNoZShuYW1lKSkgPz8gJyc7XG4gICAgICBpZiAoIWNvbnRlbnQpIHtcbiAgICAgICAgY29uc3QgdXJsID0gYGh0dHBzOi8vd3d3LnRvcHRhbC5jb20vZGV2ZWxvcGVycy9naXRpZ25vcmUvYXBpLyR7bmFtZX1gO1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCk7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlVGV4dCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgICAgICAgaWYgKCFyZXNwb25zZS5vayB8fCByZXNwb25zZVRleHQuaW5jbHVkZXMoJ0F0dGVudGlvbiBSZXF1aXJlZCEnKSB8fCByZXNwb25zZVRleHQuaW5jbHVkZXMoJzx0aXRsZT4nKSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBmZXRjaCAke3VybH1gKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29udGVudCA9IHJlc3BvbnNlVGV4dC50cmltKCk7XG4gICAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiB3cml0ZUNhY2hlKG5hbWUsIGNvbnRlbnQpKTtcbiAgICAgICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKGBGZXRjaGVkICR7dXJsfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZ2VuZXJhdGVkKSBnZW5lcmF0ZWQgKz0gJ1xcbic7XG4gICAgICBnZW5lcmF0ZWQgKz0gY29udGVudCArICdcXG4nO1xuICAgIH1cbiAgICBpZiAoIShhd2FpdCBpZ25vcmVGaWxlVXRpbC5pc0JlcnJ5WmVyb0luc3RhbGxFbmFibGVkKGZpbGVQYXRoKSkpIHtcbiAgICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZC5yZXBsYWNlKCchLnlhcm4vY2FjaGUnLCAnIyAhLnlhcm4vY2FjaGUnKS5yZXBsYWNlKCcjIC5wbnAuKicsICcucG5wLionKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvbVhtbCB8fCBjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL2FydGlmYWN0cyQvZ20sICcuaWRlYS9hcnRpZmFjdHMnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9jb21waWxlci54bWwkL2dtLCAnLmlkZWEvY29tcGlsZXIueG1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvamFyUmVwb3NpdG9yaWVzLnhtbCQvZ20sICcuaWRlYS9qYXJSZXBvc2l0b3JpZXMueG1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvbW9kdWxlcy54bWwkL2dtLCAnLmlkZWEvbW9kdWxlcy54bWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC8qLmltbCQvZ20sICcuaWRlYS8qLmltbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL21vZHVsZXMkL2dtLCAnLmlkZWEvbW9kdWxlcycpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAqLmltbCQvZ20sICcqLmltbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAqLmlwciQvZ20sICcqLmlwcicpO1xuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZC5yZXBsYWNlQWxsKC9eLmlkZWFcXC9tb2R1bGVzLnhtbCQvZ20sICcjIC5pZGVhL21vZHVsZXMueG1sJyk7XG4gICAgICB9XG4gICAgfVxuICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZC5yZXBsYWNlQWxsKC9eLmlkZWFcXC8/JC9nbSwgJyMgLmlkZWEnKTtcbiAgICBpZiAocm9vdENvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUgfHwgY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSB8fCBjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2VBbGwoL14oLmlkZWFcXC8uKykkL2dtLCAnJDFcXG5hbmRyb2lkLyQxJyk7XG4gICAgfVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBoZWFkVXNlckNvbnRlbnQgKyAnXFxuJyArIGdlbmVyYXRlZCArIHRhaWxVc2VyQ29udGVudDtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuY29uc3QgZGlyUGF0aCA9IHBhdGguam9pbihvcy5ob21lZGlyKCksICcuY2FjaGUnLCAnd2JmeScsICdnaXRpZ25vcmUnKTtcblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVDYWNoZShuYW1lOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihkaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGguam9pbihkaXJQYXRoLCBuYW1lKSwgY29udGVudCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRDYWNoZShuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IHN0YXQgPSBhd2FpdCBmcy5wcm9taXNlcy5zdGF0KHBhdGguam9pbihkaXJQYXRoLCBuYW1lKSk7XG4gICAgaWYgKERhdGUubm93KCkgLSBzdGF0Lm10aW1lTXMgPiA2ICogNjAgKiA2MCAqIDEwMDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHBhdGguam9pbihkaXJQYXRoLCBuYW1lKSwgJ3V0ZjgnKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgZG9lc0NvbnRhaW5KYXZhLCBkb2VzQ29udGFpbkpzT3JUcyB9IGZyb20gJy4uL3V0aWxzL3BhY2thZ2VDYXBhYmlsaXRpZXMuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbi8vIEtlZXAgcGFja2FnZS1tYW5hZ2VyIHNoaW1zIGluIHRoZSBGaWxlIFdhdGNoZXIgcHJvZ3JhbSBmaWVsZCBzbyBub2RlIGRvZXMgbm90XG4vLyBwYXJzZSB3cmFwcGVyIHNjcmlwdHMgcGFzc2VkIHRocm91Z2ggYXJndW1lbnRzLlxuY29uc3Qgb3hmbXRQcm9ncmFtID0gJyRQcm9qZWN0RmlsZURpciQvbm9kZV9tb2R1bGVzLy5iaW4vb3hmbXQnO1xuY29uc3QgcHJldHRpZXJQcm9ncmFtID0gJyRQcm9qZWN0RmlsZURpciQvbm9kZV9tb2R1bGVzLy5iaW4vcHJldHRpZXInO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVJZGVhU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVJZGVhU2V0dGluZ3MnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5pZGVhJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoZGlyUGF0aCkpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICd3YXRjaGVyVGFza3MueG1sJyk7XG4gICAgICBhd2FpdCAoZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKSB8fCBkb2VzQ29udGFpbkphdmEoY29uZmlnKVxuICAgICAgICA/IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBnZXRXYXRjaGVyVGFza3NDb250ZW50KGNvbmZpZykpKVxuICAgICAgICA6IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSkpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldFdhdGNoZXJUYXNrc0NvbnRlbnQoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgY29uc3QgdGFza09wdGlvbnMgPSBbXG4gICAge1xuICAgICAgYXJnczogJy0td3JpdGUgLS1uby1lcnJvci1vbi11bm1hdGNoZWQtcGF0dGVybiAhKiovcGFja2FnZS5qc29uJyxcbiAgICAgIGNvbmRpdGlvbjogZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKSxcbiAgICAgIGV4dGVuc2lvbnM6IGV4dGVuc2lvbnMub3hmbXQsXG4gICAgICBuYW1lOiAnT3hmbXQnLFxuICAgICAgcHJvZ3JhbTogb3hmbXRQcm9ncmFtLFxuICAgIH0sXG4gICAge1xuICAgICAgYXJnczogJy0tY2FjaGUgLS13cml0ZScsXG4gICAgICBjb25kaXRpb246IGRvZXNDb250YWluSmF2YShjb25maWcpLFxuICAgICAgZXh0ZW5zaW9uczogZXh0ZW5zaW9ucy5wcmV0dGllck9ubHksXG4gICAgICBuYW1lOiAnUHJldHRpZXInLFxuICAgICAgcHJvZ3JhbTogcHJldHRpZXJQcm9ncmFtLFxuICAgIH0sXG4gIF1cbiAgICAuZmlsdGVyKCh0YXNrKSA9PiB0YXNrLmNvbmRpdGlvbilcbiAgICAuZmxhdE1hcCgodGFzaykgPT4gdGFzay5leHRlbnNpb25zLm1hcCgoZXh0KSA9PiBjcmVhdGVUYXNrT3B0aW9ucyh0YXNrLnByb2dyYW0sIHRhc2suYXJncywgdGFzay5uYW1lLCBleHQpKSk7XG5cbiAgcmV0dXJuIGA8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cbjxwcm9qZWN0IHZlcnNpb249XCI0XCI+XG4gIDxjb21wb25lbnQgbmFtZT1cIlByb2plY3RUYXNrc09wdGlvbnNcIj5cbiAgICAke3Rhc2tPcHRpb25zLmpvaW4oJycpfVxuICA8L2NvbXBvbmVudD5cbjwvcHJvamVjdD5cbmA7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVRhc2tPcHRpb25zKHJ1bm5lcjogc3RyaW5nLCBhcmdzOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgZXh0ZW5zaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCAgICA8VGFza09wdGlvbnMgaXNFbmFibGVkPVwidHJ1ZVwiPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiYXJndW1lbnRzXCIgdmFsdWU9XCIke2FyZ3N9ICRGaWxlUGF0aFJlbGF0aXZlVG9Qcm9qZWN0Um9vdCRcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiY2hlY2tTeW50YXhFcnJvcnNcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImRlc2NyaXB0aW9uXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImV4aXRDb2RlQmVoYXZpb3JcIiB2YWx1ZT1cIkVSUk9SXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImZpbGVFeHRlbnNpb25cIiB2YWx1ZT1cIiR7ZXh0ZW5zaW9ufVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJpbW1lZGlhdGVTeW5jXCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJuYW1lXCIgdmFsdWU9XCIke25hbWV9ICguJHtleHRlbnNpb259KVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJvdXRwdXRcIiB2YWx1ZT1cIiRGaWxlUGF0aFJlbGF0aXZlVG9Qcm9qZWN0Um9vdCRcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwib3V0cHV0RmlsdGVyc1wiPlxuICAgICAgICA8YXJyYXkgLz5cbiAgICAgIDwvb3B0aW9uPlxuICAgICAgPG9wdGlvbiBuYW1lPVwib3V0cHV0RnJvbVN0ZG91dFwiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwicHJvZ3JhbVwiIHZhbHVlPVwiJHtydW5uZXJ9XCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cInJ1bk9uRXh0ZXJuYWxDaGFuZ2VzXCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJzY29wZU5hbWVcIiB2YWx1ZT1cIlByb2plY3QgRmlsZXNcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwidHJhY2tPbmx5Um9vdFwiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwid29ya2luZ0RpclwiIHZhbHVlPVwiJFByb2plY3RGaWxlRGlyJFwiIC8+XG4gICAgICA8ZW52cyAvPlxuICAgIDwvVGFza09wdGlvbnM+XG5gO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0R2VuSTE4blRzQ29tbWFuZChcbiAgY29uZmlnOiBQaWNrPFBhY2thZ2VDb25maWcsICdkZXBlbmRpbmcnIHwgJ2lzQnVuJz4sXG4gIHNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMgfCB1bmRlZmluZWRcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghY29uZmlnLmRlcGVuZGluZy5nZW5JMThuVHMgfHwgIXNjcmlwdHM/LlsnZ2VuLWkxOG4tdHMnXSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIGAke2NvbmZpZy5pc0J1biA/ICdidW4nIDogJ3lhcm4nfSBydW4gZ2VuLWkxOG4tdHMgPiAvZGV2L251bGxgO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBTcGF3blN5bmNPcHRpb25zIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3blN5bmMoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcsIHJldHJ5ID0gMCk6IHZvaWQge1xuICBzcGF3blN5bmNBbmRSZXR1cm5TdGF0dXMoY29tbWFuZCwgYXJncywgY3dkLCByZXRyeSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3blN5bmNBbmRSZXR1cm5TdGF0dXMoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcsIHJldHJ5ID0gMCk6IG51bWJlciB7XG4gIGRvIHtcbiAgICBjb25zdCBbbmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zXSA9IGdldFNwYXduU3luY0FyZ3MoY29tbWFuZCwgYXJncywgY3dkKTtcbiAgICBjb25zb2xlLmxvZyhgJCAke25ld0NtZH0gJHtuZXdBcmdzLmpvaW4oJyAnKX0gYXQgJHtjd2R9YCk7XG4gICAgY29uc3QgcmV0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMobmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zKTtcbiAgICBjb25zdCBzdGF0dXMgPSByZXQuc3RhdHVzID8/IDE7XG4gICAgaWYgKHN0YXR1cyA9PT0gMCkgYnJlYWs7XG4gICAgaWYgKHJldHJ5IDw9IDApIHJldHVybiBzdGF0dXM7XG4gIH0gd2hpbGUgKC0tcmV0cnkgPj0gMCk7XG4gIHJldHVybiAwO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgW25ld0NtZCwgbmV3QXJncywgb3B0aW9uc10gPSBnZXRTcGF3blN5bmNBcmdzKGNvbW1hbmQsIGFyZ3MsIGN3ZCk7XG4gIG9wdGlvbnMuc3RkaW8gPSAncGlwZSc7XG4gIGNvbnN0IHByb2MgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnMpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvbiAtLSBzcGF3blN5bmMgcmV0dXJucyBudWxsIHN0ZGVyciBvbiBFTk9FTlQuXG4gIGNvbnN0IHN0ZGVyciA9IHByb2Muc3RkZXJyID8/ICcnO1xuICBjb25zdCBlcnJvciA9IHR5cGVvZiBzdGRlcnIgPT09ICdzdHJpbmcnID8gc3RkZXJyLnRyaW0oKSA6IHN0ZGVyci50b1N0cmluZygpLnRyaW0oKTtcbiAgaWYgKHByb2MuZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKGAke25ld0NtZH0gWyR7bmV3QXJncy5tYXAoKHMpID0+IGBcIiR7c31cImApLmpvaW4oJywgJyl9XSBmYWlsZWQgd2l0aDogJHtwcm9jLmVycm9yLm1lc3NhZ2V9YCk7XG4gIH0gZWxzZSBpZiAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgYCR7bmV3Q21kfSBbJHtuZXdBcmdzLm1hcCgocykgPT4gYFwiJHtzfVwiYCkuam9pbignLCAnKX1dIG91dHB1dHMgdGhlIGZvbGxvd2luZyBjb250ZW50IHRvIHN0ZGVycjpcXG4ke2Vycm9yfWBcbiAgICApO1xuICB9XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uIC0tIHNwYXduU3luYyByZXR1cm5zIG51bGwgc3Rkb3V0IG9uIEVOT0VOVC5cbiAgY29uc3Qgc3Rkb3V0ID0gcHJvYy5zdGRvdXQgPz8gJyc7XG4gIHJldHVybiB0eXBlb2Ygc3Rkb3V0ID09PSAnc3RyaW5nJyA/IHN0ZG91dC50cmltKCkgOiBzdGRvdXQudG9TdHJpbmcoKS50cmltKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTcGF3blN5bmNBcmdzKGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nKTogW3N0cmluZywgc3RyaW5nW10sIFNwYXduU3luY09wdGlvbnNdIHtcbiAgY29uc3QgZW52ID0geyAuLi5wcm9jZXNzLmVudiB9O1xuICAvLyBSZW1vdmUgYmVycnkgZnJvbSBQQVRIXG4gIGlmIChlbnYuUEFUSCAmJiBlbnYuQkVSUllfQklOX0ZPTERFUikge1xuICAgIGVudi5QQVRIID0gZW52LlBBVEguc3BsaXQoJzonKVxuICAgICAgLmZpbHRlcigocCkgPT4gcCAhPT0gZW52LkJFUlJZX0JJTl9GT0xERVIpXG4gICAgICAuam9pbignOicpO1xuICB9XG5cbiAgcmV0dXJuIFtcbiAgICBjb21tYW5kLFxuICAgIGFyZ3MsXG4gICAge1xuICAgICAgY3dkLFxuICAgICAgZW52LFxuICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICAgIHNoZWxsOiBmYWxzZSxcbiAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgfSxcbiAgXTtcbn1cbiIsImltcG9ydCBjaGlsZFByb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHsgT2N0b2tpdCB9IGZyb20gJ0BvY3Rva2l0L2NvcmUnO1xuXG5jbGFzcyBHaXRIdWJVdGlsIHtcbiAgZ2V0T3JnQW5kTmFtZSh1cmxPckZ1bGxOYW1lOiBzdHJpbmcpOiBbc3RyaW5nLCBzdHJpbmddIHtcbiAgICBjb25zdCB1cmxXaXRob3V0UHJvdG9jb2wgPSB1cmxPckZ1bGxOYW1lLnNwbGl0KCc6JykuYXQoLTEpO1xuICAgIGNvbnN0IG5hbWVzID0gdXJsV2l0aG91dFByb3RvY29sPy5zcGxpdCgnLycpO1xuICAgIGNvbnN0IG9yZyA9IG5hbWVzPy5hdCgtMikgPz8gJyc7XG4gICAgY29uc3QgbmFtZSA9IG5hbWVzPy5hdCgtMSk/LnJlcGxhY2UoLy5naXQkLywgJycpID8/ICcnO1xuICAgIHJldHVybiBbb3JnLCBuYW1lXTtcbiAgfVxufVxuZXhwb3J0IGNvbnN0IGdpdEh1YlV0aWwgPSBuZXcgR2l0SHViVXRpbCgpO1xuXG5jb25zdCBvY3Rva2l0Q2FjaGUgPSBuZXcgTWFwPHN0cmluZywgT2N0b2tpdD4oKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldE9jdG9raXQob3duZXI/OiBzdHJpbmcpOiBPY3Rva2l0IHtcbiAgY29uc3Qga2V5ID0gb3duZXIgPz8gJyc7XG4gIGNvbnN0IGNhY2hlZCA9IG9jdG9raXRDYWNoZS5nZXQoa2V5KTtcbiAgaWYgKGNhY2hlZCkgcmV0dXJuIGNhY2hlZDtcblxuICBjb25zdCBvY3Rva2l0ID0gbmV3IE9jdG9raXQoe1xuICAgIGF1dGg6IGdldEdpdEh1YlRva2VuKG93bmVyKSB8fCB1bmRlZmluZWQsXG4gIH0pO1xuICBvY3Rva2l0Q2FjaGUuc2V0KGtleSwgb2N0b2tpdCk7XG4gIHJldHVybiBvY3Rva2l0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzR2l0SHViVG9rZW4ob3duZXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gISFnZXRHaXRIdWJUb2tlbihvd25lcik7XG59XG5cbmZ1bmN0aW9uIGdldEdpdEh1YlRva2VuKG93bmVyPzogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKG93bmVyID09PSAnV2lsbEJvb3N0ZXInKSB7XG4gICAgcmV0dXJuIHByb2Nlc3MuZW52LkdIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSIHx8IGdldEdpdEh1YkNsaVRva2VuKCk7XG4gIH1cbiAgaWYgKG93bmVyID09PSAnV2lsbEJvb3N0ZXJMYWInKSB7XG4gICAgcmV0dXJuIHByb2Nlc3MuZW52LkdIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSTEFCIHx8IGdldEdpdEh1YkNsaVRva2VuKCk7XG4gIH1cbiAgcmV0dXJuIChcbiAgICBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUiB8fFxuICAgIHByb2Nlc3MuZW52LkdIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSTEFCIHx8XG4gICAgcHJvY2Vzcy5lbnYuR0hfVE9LRU4gfHxcbiAgICBwcm9jZXNzLmVudi5HSVRIVUJfVE9LRU4gfHxcbiAgICBnZXRHaXRIdWJDbGlUb2tlbigpXG4gICk7XG59XG5cbmxldCBnaXRIdWJDbGlUb2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBnZXRHaXRIdWJDbGlUb2tlbigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoZ2l0SHViQ2xpVG9rZW4gIT09IHVuZGVmaW5lZCkgcmV0dXJuIGdpdEh1YkNsaVRva2VuIHx8IHVuZGVmaW5lZDtcblxuICB0cnkge1xuICAgIC8vIFNvbWUgbG9jYWwgcnVucyByZWx5IG9uIEdpdEh1YiBDTEkgYXV0aGVudGljYXRpb24gaW5zdGVhZCBvZiBleHBvcnRlZCBlbnYgdG9rZW5zLlxuICAgIGdpdEh1YkNsaVRva2VuID1cbiAgICAgIGNoaWxkUHJvY2Vzc1xuICAgICAgICAuZXhlY0ZpbGVTeW5jKCdnaCcsIFsnYXV0aCcsICd0b2tlbiddLCB7XG4gICAgICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICAgICAgICBzdGRpbzogWydpZ25vcmUnLCAncGlwZScsICdpZ25vcmUnXSxcbiAgICAgICAgfSlcbiAgICAgICAgLnRyaW0oKSB8fCAnJztcbiAgfSBjYXRjaCB7XG4gICAgZ2l0SHViQ2xpVG9rZW4gPSAnJztcbiAgfVxuICByZXR1cm4gZ2l0SHViQ2xpVG9rZW4gfHwgdW5kZWZpbmVkO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmV4cG9ydCBjb25zdCBtYW5hZ2VkVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzID0gW1xuICAnQHRzY29uZmlnL2J1bicsXG4gICdAdHNjb25maWcvbm9kZS1sdHMnLFxuICAnQHRzY29uZmlnL25vZGUtdHMnLFxuICAnQHRzY29uZmlnL3JlYWN0LW5hdGl2ZScsXG5dO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHNjb25maWdFeHRlbmRzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgIHJldHVybiAnQHRzY29uZmlnL2J1bi90c2NvbmZpZy5qc29uJztcbiAgfVxuICBpZiAoY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgIHJldHVybiAnQHRzY29uZmlnL3JlYWN0LW5hdGl2ZS90c2NvbmZpZy5qc29uJztcbiAgfVxuICByZXR1cm4gWydAdHNjb25maWcvbm9kZS1sdHMvdHNjb25maWcuanNvbicsICdAdHNjb25maWcvbm9kZS10cy90c2NvbmZpZy5qc29uJ107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nW10ge1xuICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eiB8fCBjb25maWcuZGVwZW5kaW5nLm5leHQpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgIHJldHVybiBbJ0B0c2NvbmZpZy9idW4nXTtcbiAgfVxuICBpZiAoY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgIHJldHVybiBbJ0B0c2NvbmZpZy9yZWFjdC1uYXRpdmUnXTtcbiAgfVxuICByZXR1cm4gWydAdHNjb25maWcvbm9kZS1sdHMnLCAnQHRzY29uZmlnL25vZGUtdHMnXTtcbn1cbiIsImltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNQdWJsaXNoZWRXaWxsYm9vc3RlckNvbmZpZ3NQYWNrYWdlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIGNvbmZpZy5pc1dpbGxCb29zdGVyQ29uZmlncyAmJlxuICAgICFjb25maWcuaXNSb290ICYmXG4gICAgY29uZmlnLnBhY2thZ2VKc29uPy5wcml2YXRlICE9PSB0cnVlICYmXG4gICAgQXJyYXkuaXNBcnJheShjb25maWcucGFja2FnZUpzb24/LmZpbGVzKSAmJlxuICAgIGNvbmZpZy5wYWNrYWdlSnNvbi5maWxlcy5sZW5ndGggPiAwXG4gICk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuaW1wb3J0IHNlbXZlciBmcm9tICdzZW12ZXInO1xuaW1wb3J0IHsgc29ydFBhY2thZ2VKc29uIH0gZnJvbSAnc29ydC1wYWNrYWdlLWpzb24nO1xuaW1wb3J0IHRzIGZyb20gJ3R5cGVzY3JpcHQnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiwgU2V0UmVxdWlyZWQgfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBnZXRMYXRlc3RDb21taXRIYXNoIH0gZnJvbSAnLi4vZ2l0aHViL2NvbW1pdC5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgZ2V0R2VuSTE4blRzQ29tbWFuZCB9IGZyb20gJy4uL3V0aWxzL2dlbkkxOG5Ucy5qcyc7XG5pbXBvcnQgeyBnaXRIdWJVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5pbXBvcnQgeyBnbG9iSWdub3JlIH0gZnJvbSAnLi4vdXRpbHMvZ2xvYlV0aWwuanMnO1xuaW1wb3J0IHsgaWdub3JlRmlsZVV0aWwgfSBmcm9tICcuLi91dGlscy9pZ25vcmVGaWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBjb21iaW5lTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgZG9lc0NvbnRhaW5KYXZhLCBkb2VzQ29udGFpbkpzT3JUcyB9IGZyb20gJy4uL3V0aWxzL3BhY2thZ2VDYXBhYmlsaXRpZXMuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMsIHNwYXduU3luY0FuZFJldHVyblN0ZG91dCB9IGZyb20gJy4uL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5pbXBvcnQgeyBnZXRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMsIG1hbmFnZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMgfSBmcm9tICcuLi91dGlscy90c2NvbmZpZ0Jhc2UuanMnO1xuaW1wb3J0IHsgaXNQdWJsaXNoZWRXaWxsYm9vc3RlckNvbmZpZ3NQYWNrYWdlIH0gZnJvbSAnLi4vdXRpbHMvd2lsbGJvb3N0ZXJDb25maWdzVXRpbC5qcyc7XG5cbmNvbnN0IG94bGludERlcHMgPSBbJ0B3aWxsYm9vc3Rlci9veGZtdC1jb25maWcnLCAnQHdpbGxib29zdGVyL294bGludC1jb25maWcnLCAnb3hmbXQnLCAnb3hsaW50JywgJ294bGludC10c2dvbGludCddO1xuY29uc3QgdHlwZXNjcmlwdEdvRGVwZW5kZW5jeSA9ICdAdHlwZXNjcmlwdC9uYXRpdmUtcHJldmlldyc7XG5jb25zdCB0eXBlc2NyaXB0RGVwZW5kZW5jeSA9ICd0eXBlc2NyaXB0JztcbmNvbnN0IHdiRGVwZW5kZW5jeSA9ICdAd2lsbGJvb3N0ZXIvd2InO1xuY29uc3QgYnVpbGRUc0RlcGVuZGVuY3kgPSAnYnVpbGQtdHMnO1xuY29uc3Qgd2lsbEJvb3N0ZXJDb25maWdzTWFuYWdlZERlcGVuZGVuY2llcyA9IFtcbiAgJ0B3aWxsYm9vc3Rlci9wcmV0dGllci1jb25maWcnLFxuICAuLi5veGxpbnREZXBzLmZpbHRlcigoZGVwZW5kZW5jeSkgPT4gZGVwZW5kZW5jeS5zdGFydHNXaXRoKCdAd2lsbGJvb3N0ZXIvJykpLFxuXTtcbmNvbnN0IG9ic29sZXRlTGludERlcGVuZGVuY2llcyA9IFtcbiAgJ0BiaW9tZWpzL2Jpb21lJyxcbiAgJ0Blc2xpbnQtcmVhY3QvZXNsaW50LXBsdWdpbicsXG4gICdAZXNsaW50L2pzJyxcbiAgJ0BuZXh0L2VzbGludC1wbHVnaW4tbmV4dCcsXG4gICdAdHlwZXMvZXNsaW50JyxcbiAgJ0B0eXBlcy9taWNyb21hdGNoJyxcbiAgJ0B0eXBlc2NyaXB0LWVzbGludC9lc2xpbnQtcGx1Z2luJyxcbiAgJ0B0eXBlc2NyaXB0LWVzbGludC9wYXJzZXInLFxuICAnQHdpbGxib29zdGVyL2Jpb21lLWNvbmZpZycsXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZycsXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1ibGl0ei1uZXh0JyxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzJyxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzLXJlYWN0JyxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLW5leHQnLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctcmVhY3QnLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMnLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMtcmVhY3QnLFxuICAnYmlvbWUnLFxuICAnZXNsaW50JyxcbiAgJ2VzbGludC1jb25maWctZmxhdC1naXRpZ25vcmUnLFxuICAnZXNsaW50LWNvbmZpZy1uZXh0JyxcbiAgJ2VzbGludC1jb25maWctcHJldHRpZXInLFxuICAnZXNsaW50LWltcG9ydC1yZXNvbHZlci1ub2RlJyxcbiAgJ2VzbGludC1pbXBvcnQtcmVzb2x2ZXItdHlwZXNjcmlwdCcsXG4gICdlc2xpbnQtcGx1Z2luLWltcG9ydCcsXG4gICdlc2xpbnQtcGx1Z2luLWltcG9ydC14JyxcbiAgJ2VzbGludC1wbHVnaW4tcGVyZmVjdGlvbmlzdCcsXG4gICdlc2xpbnQtcGx1Z2luLXByZXR0aWVyJyxcbiAgJ2VzbGludC1wbHVnaW4tcmVhY3QnLFxuICAnZXNsaW50LXBsdWdpbi1yZWFjdC1jb21waWxlcicsXG4gICdlc2xpbnQtcGx1Z2luLXJlYWN0LWhvb2tzJyxcbiAgJ2VzbGludC1wbHVnaW4tc29ydC1jbGFzcy1tZW1iZXJzJyxcbiAgJ2VzbGludC1wbHVnaW4tc29ydC1kZXN0cnVjdHVyZS1rZXlzJyxcbiAgJ2VzbGludC1wbHVnaW4tc3Rvcnlib29rJyxcbiAgJ2VzbGludC1wbHVnaW4tdW5pY29ybicsXG4gICdlc2xpbnQtcGx1Z2luLXVudXNlZC1pbXBvcnRzJyxcbiAgJ2dsb2JhbHMnLFxuICAnbWljcm9tYXRjaCcsXG4gICd0eXBlc2NyaXB0LWVzbGludCcsXG5dO1xuY29uc3QgbWljcm9tYXRjaFBhY2thZ2VOYW1lcyA9IG5ldyBTZXQoWydtaWNyb21hdGNoJywgJ0B0eXBlcy9taWNyb21hdGNoJ10pO1xuY29uc3QgbWljcm9tYXRjaEltcG9ydFBhdHRlcm4gPVxuICAvXFxiZnJvbVxccytbJ1wiXW1pY3JvbWF0Y2hbJ1wiXXxcXGJyZXF1aXJlXFwoXFxzKlsnXCJdbWljcm9tYXRjaFsnXCJdXFxzKlxcKXxcXGJpbXBvcnRcXChcXHMqWydcIl1taWNyb21hdGNoWydcIl1cXHMqXFwpL3U7XG5cbmNvbnN0IGxhdGVzdERlcGVuZGVuY3lWZXJzaW9uQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuY29uc3QgZGVwZW5kZW5jeVNlY3Rpb25LZXlzID0gWydkZXBlbmRlbmNpZXMnLCAnZGV2RGVwZW5kZW5jaWVzJywgJ29wdGlvbmFsRGVwZW5kZW5jaWVzJywgJ3BlZXJEZXBlbmRlbmNpZXMnXSBhcyBjb25zdDtcblxudHlwZSBXcml0YWJsZVBhY2thZ2VKc29uID0gU2V0UmVxdWlyZWQ8XG4gIFBhY2thZ2VKc29uLFxuICAnc2NyaXB0cycgfCAnZGVwZW5kZW5jaWVzJyB8ICdkZXZEZXBlbmRlbmNpZXMnIHwgJ3BlZXJEZXBlbmRlbmNpZXMnXG4+O1xuXG5pbnRlcmZhY2UgRGVwZW5kZW5jeVVwZGF0ZXMge1xuICBkZXBlbmRlbmNpZXM6IHN0cmluZ1tdO1xuICBkZXZEZXBlbmRlbmNpZXM6IHN0cmluZ1tdO1xuICBweXRob25EZXZEZXBlbmRlbmNpZXM6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQYWNrYWdlSnNvbihcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBza2lwQWRkaW5nRGVwczogYm9vbGVhblxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVQYWNrYWdlSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBjb3JlKGNvbmZpZywgcm9vdENvbmZpZywgc2tpcEFkZGluZ0RlcHMpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29yZShjb25maWc6IFBhY2thZ2VDb25maWcsIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsIHNraXBBZGRpbmdEZXBzOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIGNvbnN0IGpzb25PYmogPSBhd2FpdCByZWFkUGFja2FnZUpzb24oZmlsZVBhdGgpO1xuICBjb25zdCBwYWNrYWdlTWFuYWdlciA9IGNvbmZpZy5pc0J1biA/ICdidW4nIDogJ3lhcm4nO1xuXG4gIGF3YWl0IHJlbW92ZURlcHJlY2F0ZWRTdHVmZihjb25maWcsIGpzb25PYmopO1xuICBhd2FpdCB1cGRhdGVTY3JpcHRzKGNvbmZpZywganNvbk9iaik7XG4gIG1vdmVNYW5hZ2VkVG9vbERlcGVuZGVuY2llc1RvRGV2RGVwZW5kZW5jaWVzKGpzb25PYmopO1xuICBjb25zdCBkZXBlbmRlbmN5VXBkYXRlcyA9IGF3YWl0IGFwcGx5UGFja2FnZUpzb25Db252ZW50aW9ucyhjb25maWcsIHJvb3RDb25maWcsIGpzb25PYmopO1xuICBhd2FpdCBub3JtYWxpemVQYWNrYWdlTWV0YWRhdGEoY29uZmlnLCByb290Q29uZmlnLCBqc29uT2JqLCBkZXBlbmRlbmN5VXBkYXRlcyk7XG4gIGFkZERlcGVuZGVuY3lWZXJzaW9uc1RvUGFja2FnZUpzb24oanNvbk9iaiwgZGVwZW5kZW5jeVVwZGF0ZXMpO1xuICBhd2FpdCB1cGRhdGVQcml2YXRlUGFja2FnZXMoanNvbk9iaik7XG4gIHJlbW92ZUVtcHR5RGVwZW5kZW5jeVNlY3Rpb25zKGpzb25PYmopO1xuXG4gIGlmIChjb25maWcuaXNCdW4pIGRlbGV0ZSBqc29uT2JqLnBhY2thZ2VNYW5hZ2VyO1xuICAvLyBZYXJuIHJlYWRzIHBhY2thZ2UuanNvbiBmcm9tIGRpc2sgYmVmb3JlIGRlY2lkaW5nIHdoZXRoZXIgYHlhcm4gYWRkIC1EYFxuICAvLyBjb25mbGljdHMgd2l0aCBhbiBleGlzdGluZyByZWd1bGFyIGRlcGVuZGVuY3ksIHNvIHRoaXMgd3JpdGUgbXVzdCBmaW5pc2hcbiAgLy8gYmVmb3JlIGluc3RhbGxpbmcgdGhlIG1hbmFnZWQgZGVwZW5kZW5jeSB1cGRhdGVzIGJlbG93LiBLZWVwIHRoaXMgYmFzZWxpbmVcbiAgLy8gZmlsZSBzb3J0ZWQgZXZlbiB3aGVuIHdlIGxhdGVyIHJ1biB0aGUgdGFyZ2V0IHJlcG9zaXRvcnkncyBmb3JtYXR0ZXIgc28gYVxuICAvLyBtaWQtcnVuIGludGVycnVwdGlvbiBuZXZlciBsZWF2ZXMgcGFja2FnZS5qc29uIGluIGEgcGFydGlhbGx5IG1hbmFnZWQgb3JkZXIuXG4gIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIHNlcmlhbGl6ZVBhY2thZ2VKc29uKGpzb25PYmopKTtcblxuICBpZiAoIXNraXBBZGRpbmdEZXBzKSB7XG4gICAgaW5zdGFsbERlcGVuZGVuY3lVcGRhdGVzKGNvbmZpZywganNvbk9iaiwgZGVwZW5kZW5jeVVwZGF0ZXMsIHBhY2thZ2VNYW5hZ2VyKTtcbiAgICBmb3JtYXRQYWNrYWdlSnNvbldpdGhQcm9qZWN0Rm9ybWF0dGVyKGNvbmZpZywgcGFja2FnZU1hbmFnZXIsIGZpbGVQYXRoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzZXJpYWxpemVQYWNrYWdlSnNvbihqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uKTogc3RyaW5nIHtcbiAgLy8gZnNVdGlsLmdlbmVyYXRlRmlsZSgpIG5vcm1hbGl6ZXMgdGhlIHRyYWlsaW5nIG5ld2xpbmUsIHNvIGtlZXAgdGhlIHNlcmlhbGl6ZXJcbiAgLy8gZm9jdXNlZCBvbiB0aGUgSlNPTiBwYXlsb2FkIGl0c2VsZi5cbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHNvcnRQYWNrYWdlSnNvbihqc29uT2JqKSwgdW5kZWZpbmVkLCAyKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZFBhY2thZ2VKc29uKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPFdyaXRhYmxlUGFja2FnZUpzb24+IHtcbiAgY29uc3QganNvblRleHQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgY29uc3QganNvbk9iaiA9IEpTT04ucGFyc2UoanNvblRleHQpIGFzIFBhY2thZ2VKc29uO1xuICBqc29uT2JqLnNjcmlwdHMgPSBqc29uT2JqLnNjcmlwdHMgPz8ge307XG4gIGpzb25PYmouZGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXBlbmRlbmNpZXMgPz8ge307XG4gIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gIGpzb25PYmoucGVlckRlcGVuZGVuY2llcyA9IGpzb25PYmoucGVlckRlcGVuZGVuY2llcyA/PyB7fTtcbiAgcmV0dXJuIGpzb25PYmogYXMgV3JpdGFibGVQYWNrYWdlSnNvbjtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdXBkYXRlU2NyaXB0cyhjb25maWc6IFBhY2thZ2VDb25maWcsIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmVtb3ZlTGVnYWN5SW5zdGFsbENvbW1hbmRzKGpzb25PYmouc2NyaXB0cyk7XG5cbiAganNvbk9iai5zY3JpcHRzID0geyAuLi5qc29uT2JqLnNjcmlwdHMsIC4uLmdlbmVyYXRlU2NyaXB0cyhjb25maWcsIGpzb25PYmouc2NyaXB0cykgfTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snc3RhcnQtdGVzdC1zZXJ2ZXInXTtcblxuICBjb25zdCBzY3JpcHRzID0ganNvbk9iai5zY3JpcHRzO1xuICBpZiAoY29uZmlnLmlzQnVuIHx8ICFkb2VzQ29udGFpbkphdmEoY29uZmlnKSkge1xuICAgIGRlbGV0ZSBzY3JpcHRzLnByZXR0aWZ5O1xuICB9IGVsc2Uge1xuICAgIHNjcmlwdHMucHJldHRpZnkgPSAoc2NyaXB0cy5wcmV0dGlmeSA/PyAnJykgKyAoYXdhaXQgZ2VuZXJhdGVQcmV0dGllclN1ZmZpeChjb25maWcuZGlyUGF0aCkpO1xuICB9XG4gIG5vcm1hbGl6ZVlhcm5Xb3Jrc3BhY2VGb3JlYWNoU2NyaXB0cyhzY3JpcHRzKTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlTGVnYWN5SW5zdGFsbENvbW1hbmRzKHNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMpOiB2b2lkIHtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc2NyaXB0cykpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykgY29udGludWU7XG4gICAgLy8gRnJlc2ggcmVwb3Mgc3RpbGwgcmVxdWlyZSBzdGFuZGFsb25lIGB5YXJuIGluc3RhbGxgOyBvbmx5IHJlbW92ZSBsZWdhY3kgaW5zdGFsbCBwcmVmaXhlcyBiZWZvcmUgYW5vdGhlciBjb21tYW5kLlxuICAgIGlmICghdmFsdWUuaW5jbHVkZXMoJ2dpdCBjbG9uZScpKSB7XG4gICAgICBzY3JpcHRzW2tleV0gPSB2YWx1ZS5yZXBsYWNlQWxsKC95YXJuXFxzKig/Omluc3RhbGxcXHMqKT8mJlxccyovZ3UsICcnKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplWWFybldvcmtzcGFjZUZvcmVhY2hTY3JpcHRzKHNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMpOiB2b2lkIHtcbiAgLy8gRGVhbCB3aXRoIGJyZWFraW5nIGNoYW5nZXMgaW4geWFybiBiZXJyeSA0LjAuMC1yYy40OVxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhzY3JpcHRzKSkge1xuICAgIGlmICghdmFsdWU/LmluY2x1ZGVzKCd5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCcpKSBjb250aW51ZTtcbiAgICBzY3JpcHRzW2tleV0gPSB2YWx1ZS5yZXBsYWNlQWxsKFxuICAgICAgL3lhcm4gd29ya3NwYWNlcyBmb3JlYWNoKD8hXFxzKyg/Oi1BfC1SfC0tKD86YWxsfHJlY3Vyc2l2ZXxzaW5jZXx3b3JrdHJlZXxmcm9tfGluY2x1ZGV8ZXhjbHVkZXxwdWJsaWN8cHJpdmF0ZSkpKS9ndSxcbiAgICAgICd5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCdcbiAgICApO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGFwcGx5UGFja2FnZUpzb25Db252ZW50aW9ucyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uXG4pOiBQcm9taXNlPERlcGVuZGVuY3lVcGRhdGVzPiB7XG4gIGNvbnN0IGRlcGVuZGVuY2llczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgZGV2RGVwZW5kZW5jaWVzID0gWydzb3J0LXBhY2thZ2UtanNvbiddO1xuICBjb25zdCBweXRob25EZXZEZXBlbmRlbmNpZXM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IGhhc0phdmEgPSBkb2VzQ29udGFpbkphdmEoY29uZmlnKTtcblxuICBpZiAoXG4gICAgaGFzSmF2YSAmJlxuICAgICFmcy5leGlzdHNTeW5jKHBhdGguam9pbihyb290Q29uZmlnLmRpclBhdGgsICcucHJldHRpZXJyYy5qc29uJykpICYmXG4gICAgIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAnLnByZXR0aWVycmMuanNvbicpKVxuICApIHtcbiAgICBqc29uT2JqLnByZXR0aWVyID0gJ0B3aWxsYm9vc3Rlci9wcmV0dGllci1jb25maWcnO1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdwcmV0dGllci1wbHVnaW4tamF2YScsICdAd2lsbGJvb3N0ZXIvcHJldHRpZXItY29uZmlnJyk7XG4gIH1cbiAgaWYgKGhhc0phdmEpIHtcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgncHJldHRpZXInKTtcbiAgfSBlbHNlIHtcbiAgICByZW1vdmVQcmV0dGllckFydGlmYWN0cyhqc29uT2JqKTtcbiAgfVxuXG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snbGludC1zdGFnZWQnXTtcbiAgZGVsZXRlIChqc29uT2JqIGFzIFBhY2thZ2VKc29uICYgeyAnbGludC1zdGFnZWQnPzogdW5rbm93biB9KVsnbGludC1zdGFnZWQnXTtcblxuICBpZiAoY29uZmlnLmlzUm9vdCkge1xuICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5odXNreTtcbiAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLnBvc3RpbnN0YWxsO1xuICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucG9zdHB1Ymxpc2g7XG4gICAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5wcmVwdWJsaXNoT25seTtcbiAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLnByZXBhY2s7XG4gICAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5wb3N0cGFjaztcbiAgICBqc29uT2JqLnNjcmlwdHMucHJlcGFyZSA9ICdsZWZ0aG9vayBpbnN0YWxsIHx8IHRydWUnO1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdsZWZ0aG9vaycpO1xuXG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuc2VtYW50aWNSZWxlYXNlKSB7XG4gICAgICBpZiAoXG4gICAgICAgICFqc29uT2JqLmRldkRlcGVuZGVuY2llc1snc2VtYW50aWMtcmVsZWFzZSddICYmXG4gICAgICAgICFqc29uT2JqLmRldkRlcGVuZGVuY2llc1snbXVsdGktc2VtYW50aWMtcmVsZWFzZSddICYmXG4gICAgICAgICFqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHFpd2kvbXVsdGktc2VtYW50aWMtcmVsZWFzZSddXG4gICAgICApIHtcbiAgICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ3NlbWFudGljLXJlbGVhc2UnKTtcbiAgICAgIH1cbiAgICAgIGpzb25PYmoudmVyc2lvbiA9ICcwLjAuMC1zZW1hbnRpY2FsbHktcmVsZWFzZWQnO1xuICAgIH1cblxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRUZXN0KSB7XG4gICAgICAvLyBTaW5jZSBhcnRpbGxlcnkgcmVxdWlyZXMgYSBzcGVjaWZpYyB2ZXJzaW9uIG9mIEBwbGF5d3JpZ2h0L3Rlc3RcbiAgICAgIGNvbnN0IGhhc0FydGlsbGVyeSA9IGpzb25PYmouZGVwZW5kZW5jaWVzLmFydGlsbGVyeSB8fCBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5hcnRpbGxlcnk7XG4gICAgICAvLyBTaW5jZSBsbG0tdG9vbGJveCByZXF1aXJlcyBAcGxheXdyaWdodC90ZXN0IGluIGRlcGVuZGVuY2llc1xuICAgICAgaWYgKCFoYXNBcnRpbGxlcnkgJiYgIWpzb25PYmouZGVwZW5kZW5jaWVzWydAcGxheXdyaWdodC90ZXN0J10pIHtcbiAgICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0BwbGF5d3JpZ2h0L3Rlc3QnKTtcbiAgICAgIH1cbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llcy5wbGF5d3JpZ2h0O1xuICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQ7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucykge1xuICAgICAgLy8gV2UgZG9uJ3QgYWxsb3cgbm9uLWFycmF5IHdvcmtzcGFjZXMgaW4gbW9ub3JlcG8uXG4gICAgICBqc29uT2JqLndvcmtzcGFjZXMgPSBBcnJheS5pc0FycmF5KGpzb25PYmoud29ya3NwYWNlcylcbiAgICAgICAgPyBtZXJnZS5hbGwoW2pzb25PYmoud29ya3NwYWNlcywgWydwYWNrYWdlcy8qJ11dLCB7XG4gICAgICAgICAgICBhcnJheU1lcmdlOiBjb21iaW5lTWVyZ2UsXG4gICAgICAgICAgfSlcbiAgICAgICAgOiBbJ3BhY2thZ2VzLyonXTtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoanNvbk9iai53b3Jrc3BhY2VzKSkge1xuICAgICAganNvbk9iai53b3Jrc3BhY2VzID0ganNvbk9iai53b3Jrc3BhY2VzLmZpbHRlcihcbiAgICAgICAgKHdvcmtzcGFjZSkgPT5cbiAgICAgICAgICBmZy5nbG9iU3luYyh3b3Jrc3BhY2UsIHtcbiAgICAgICAgICAgIGRvdDogdHJ1ZSxcbiAgICAgICAgICAgIGN3ZDogY29uZmlnLmRpclBhdGgsXG4gICAgICAgICAgICBpZ25vcmU6IGdsb2JJZ25vcmUsXG4gICAgICAgICAgfSkubGVuZ3RoID4gMFxuICAgICAgKTtcbiAgICAgIGlmIChqc29uT2JqLndvcmtzcGFjZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLndvcmtzcGFjZXM7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKCFpc1diUGFja2FnZShqc29uT2JqKSkge1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKHdiRGVwZW5kZW5jeSk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcud2IgfHwgY29uZmlnLmlzQnVuKSB7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoanNvbk9iai5zY3JpcHRzKSkge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIGNvbnRpbnVlO1xuICAgICAganNvbk9iai5zY3JpcHRzW2tleV0gPSB2YWx1ZS5yZXBsYWNlQWxsKC93YlxccytkYi9ndSwgJ3diIHByaXNtYScpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGJ1aWxkLXRzIG93bnMgVHlwZVNjcmlwdCBleGVjdXRpb24gYW5kIGRlY2xhcmF0aW9uIGVtaXQuIHdiZnkgbXVzdCBhbHdheXNcbiAgLy8ga2VlcCBleGlzdGluZyBidWlsZC10cyB1c2VycyBjdXJyZW50IGJlY2F1c2Ugb2xkZXIgcmVsZWFzZXMgY2FuIGVtaXQgLmQudHNcbiAgLy8gZmlsZXMgYXQgcGF0aHMgdGhhdCBubyBsb25nZXIgbWF0Y2ggcGFja2FnZSBleHBvcnRzLlxuICBpZiAoXG4gICAganNvbk9iai5kZXBlbmRlbmNpZXNbYnVpbGRUc0RlcGVuZGVuY3ldIHx8XG4gICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbYnVpbGRUc0RlcGVuZGVuY3ldIHx8XG4gICAgT2JqZWN0LnZhbHVlcyhqc29uT2JqLnNjcmlwdHMpLnNvbWUoKHNjcmlwdCkgPT4gc2NyaXB0Py5pbmNsdWRlcyhidWlsZFRzRGVwZW5kZW5jeSkpXG4gICkge1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKGJ1aWxkVHNEZXBlbmRlbmN5KTtcbiAgfVxuICBpZiAoZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKSkge1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKC4uLm94bGludERlcHMpO1xuICB9XG5cbiAgY29uc3QgdHNjb25maWdCYXNlRGVwZW5kZW5jaWVzID0gZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKSA/IGdldFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyhjb25maWcpIDogW107XG4gIGF3YWl0IHJlbW92ZVVudXNlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyhjb25maWcsIGpzb25PYmosIHRzY29uZmlnQmFzZURlcGVuZGVuY2llcyk7XG4gIGRldkRlcGVuZGVuY2llcy5wdXNoKC4uLnRzY29uZmlnQmFzZURlcGVuZGVuY2llcyk7XG5cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXMpIHtcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCh0eXBlc2NyaXB0R29EZXBlbmRlbmN5KTtcbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgICAvLyBOZXh0LmpzIHN0aWxsIHVzZXMgdGhlIGB0eXBlc2NyaXB0YCBwYWNrYWdlIGR1cmluZyBkZXYvYnVpbGQgc3RhcnR1cCBmb3JcbiAgICAgIC8vIFR5cGVTY3JpcHQgYXBwcyBldmVuIHdoZW4gcmVwb3NpdG9yaWVzIGRlbGVnYXRlIGV4cGxpY2l0IHR5cGVjaGVja2luZyB0byB0c2dvLlxuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2godHlwZXNjcmlwdERlcGVuZGVuY3kpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnQHR5cGVzL2J1bicpO1xuICAgIH0gZWxzZSBpZiAoIWNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAdHlwZXMvbm9kZScpO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBqc29uT2JqLmRlcGVuZGVuY2llcy5qZXN0IHx8XG4gICAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5qZXN0IHx8XG4gICAgICBqc29uT2JqLmRlcGVuZGVuY2llc1snQGplc3QvZ2xvYmFscyddIHx8XG4gICAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQGplc3QvZ2xvYmFscyddIHx8XG4gICAgICBqc29uT2JqLmRlcGVuZGVuY2llc1sndHMtamVzdCddIHx8XG4gICAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llc1sndHMtamVzdCddXG4gICAgKSB7XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnQHR5cGVzL2plc3QnKTtcbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRlcGVuZGVuY2llczogZGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhZGVwLmluY2x1ZGVzKCdAd2lsbGJvb3N0ZXIvJykpLFxuICAgICAgZGV2RGVwZW5kZW5jaWVzOiBkZXZEZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFkZXAuaW5jbHVkZXMoJ0B3aWxsYm9vc3Rlci8nKSksXG4gICAgICBweXRob25EZXZEZXBlbmRlbmNpZXMsXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7IGRlcGVuZGVuY2llcywgZGV2RGVwZW5kZW5jaWVzLCBweXRob25EZXZEZXBlbmRlbmNpZXMgfTtcbn1cblxuZnVuY3Rpb24gbW92ZU1hbmFnZWRUb29sRGVwZW5kZW5jaWVzVG9EZXZEZXBlbmRlbmNpZXMoanNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbik6IHZvaWQge1xuICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2YgW3diRGVwZW5kZW5jeSwgYnVpbGRUc0RlcGVuZGVuY3ldKSB7XG4gICAgaWYgKCFqc29uT2JqLmRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSkgY29udGludWU7XG4gICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0gPz89IGpzb25PYmouZGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldO1xuICAgIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBub3JtYWxpemVQYWNrYWdlTWV0YWRhdGEoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbixcbiAgZGVwZW5kZW5jeVVwZGF0ZXM6IERlcGVuZGVuY3lVcGRhdGVzXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFqc29uT2JqLm5hbWUpIHtcbiAgICBqc29uT2JqLm5hbWUgPSBwYXRoLmJhc2VuYW1lKGNvbmZpZy5kaXJQYXRoKTtcbiAgfVxuXG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMpIHtcbiAgICBqc29uT2JqLnByaXZhdGUgPSB0cnVlO1xuICB9XG4gIGlmICghanNvbk9iai5saWNlbnNlKSB7XG4gICAganNvbk9iai5saWNlbnNlID0gJ1VOTElDRU5TRUQnO1xuICB9XG4gIGlmICghanNvbk9iai5wcml2YXRlICYmIGpzb25PYmoubGljZW5zZSAhPT0gJ1VOTElDRU5TRUQnICYmIHJvb3RDb25maWcuaXNQdWJsaWNSZXBvKSB7XG4gICAganNvbk9iai5wdWJsaXNoQ29uZmlnID8/PSB7fTtcbiAgICBqc29uT2JqLnB1Ymxpc2hDb25maWcuYWNjZXNzID8/PSAncHVibGljJztcbiAgfVxuICBjb25zdCBbb3duZXJdID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGNvbmZpZy5yZXBvc2l0b3J5ID8/ICcnKTtcbiAgaWYgKG93bmVyID09PSAnV2lsbEJvb3N0ZXInIHx8IG93bmVyID09PSAnV2lsbEJvb3N0ZXJMYWInKSB7XG4gICAganNvbk9iai5hdXRob3IgPSAnV2lsbEJvb3N0ZXIgSW5jLic7XG4gIH1cbiAgYXdhaXQgbm9ybWFsaXplUHVibGlzaGVkQ29uZmlnUGFja2FnZU1ldGFkYXRhKGNvbmZpZywganNvbk9iaik7XG4gIGlmICghY29uZmlnLmlzUm9vdCAmJiBqc29uT2JqLnByaXZhdGUgJiYgIWpzb25PYmoubWFpbikge1xuICAgIC8vIE1ha2UgVlNDb2RlIHBvc3NpYmxlIHRvIHJlZmFjdG9yIGNvZGUgYWNyb3NzIHN1YnBhY2thZ2VzLlxuICAgIGpzb25PYmoubWFpbiA9ICcuL3NyYyc7XG4gIH1cblxuICAvLyBZYXJuIHRyZWF0cyB0aGUgbGVnYWN5IG5wbS9jaGFsayByZXNvbHV0aW9uIGFsaWFzIGFzIGFuIGludmFsaWQgcGFja2FnZSB0b2tlbi5cbiAgZGVsZXRlIGpzb25PYmoucmVzb2x1dGlvbnM/LlsnbnBtL2NoYWxrJ107XG5cbiAgaWYgKCFjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMpIHtcbiAgICBpZiAoIWNvbmZpZy5pc0J1bikge1xuICAgICAgaWYgKCFjb25maWcuZG9lc0NvbnRhaW5KYXZhU2NyaXB0ICYmICFjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0KSB7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMubGludDtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snbGludC1maXgnXTtcbiAgICAgICAgZm9yIChjb25zdCBzY3JpcHROYW1lIG9mIFsnY2xlYW51cCddKSB7XG4gICAgICAgICAgY29uc3Qgc2NyaXB0ID0ganNvbk9iai5zY3JpcHRzW3NjcmlwdE5hbWVdO1xuICAgICAgICAgIGlmICghc2NyaXB0KSBjb250aW51ZTtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHNbc2NyaXB0TmFtZV0gPSBzY3JpcHQucmVwbGFjZSgvID8mJiA/eWFybiBsaW50LWZpeCg/OiAtLXF1aWV0KT8vLCAnJyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGpzb25PYmouc2NyaXB0c1snbGludC1maXgnXSA9IGpzb25PYmouc2NyaXB0c1snbGludC1maXgnXSA/PyAneWFybiBsaW50IC0tZml4JztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgIGpzb25PYmouc2NyaXB0cy5saW50ID0gJ2ZsdXR0ZXIgYW5hbHl6ZSc7XG4gICAgICBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J10gPSAneWFybiBsaW50JztcbiAgICAgIGNvbnN0IGRpcnMgPSBbJ2xpYicsICd0ZXN0JywgJ3Rlc3RfZHJpdmVyJ10uZmlsdGVyKChkaXIpID0+IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBkaXIpKSk7XG4gICAgICBpZiAoZGlycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGpzb25PYmouc2NyaXB0c1snZm9ybWF0LWNvZGUnXSA9IGBkYXJ0IGZvcm1hdCAkKGZpbmQgJHtkaXJzLmpvaW4oXG4gICAgICAgICAgJyAnXG4gICAgICAgICl9IC1uYW1lIGdlbmVyYXRlZCAtcHJ1bmUgLW8gLW5hbWUgJyouZnJlZXplZC5kYXJ0JyAtcHJ1bmUgLW8gLW5hbWUgJyouZy5kYXJ0JyAtcHJ1bmUgLW8gLW5hbWUgJyouZGFydCcgLXByaW50KWA7XG4gICAgICAgIGpzb25PYmouc2NyaXB0cy5mb3JtYXQgPSBhcHBlbmRGb3JtYXRDb2RlQ29tbWFuZChqc29uT2JqLnNjcmlwdHMuZm9ybWF0LCBjb25maWcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHB5dGhvblBhY2thZ2VNYW5hZ2VyID0gZ2V0UHl0aG9uUGFja2FnZU1hbmFnZXIoY29uZmlnKTtcbiAgICBpZiAocHl0aG9uUGFja2FnZU1hbmFnZXIpIHtcbiAgICAgIGlmIChqc29uT2JqLnNjcmlwdHMucG9zdGluc3RhbGwgPT09ICdwb2V0cnkgaW5zdGFsbCcpIHtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5wb3N0aW5zdGFsbDtcbiAgICAgIH1cbiAgICAgIGpzb25PYmouc2NyaXB0c1snY29tbW9uL2NpLXNldHVwJ10gPSBgeWFybiBzZXR1cC0ke3B5dGhvblBhY2thZ2VNYW5hZ2VyfWA7XG4gICAgICBkZWxldGUganNvbk9iai5zY3JpcHRzW2BzZXR1cC0ke3B5dGhvblBhY2thZ2VNYW5hZ2VyID09PSAncG9ldHJ5JyA/ICd1dicgOiAncG9ldHJ5J31gXTtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3NldHVwLXBvZXRyeS1hc2RmJ107XG4gICAgICBqc29uT2JqLnNjcmlwdHNbYHNldHVwLSR7cHl0aG9uUGFja2FnZU1hbmFnZXJ9YF0gPSBnZXRQeXRob25TZXR1cENvbW1hbmQocHl0aG9uUGFja2FnZU1hbmFnZXIpO1xuICAgICAgY29uc3QgcHl0aG9uRmlsZXMgPSBhd2FpdCBmZy5nbG9iKCcqKi8qLnB5Jywge1xuICAgICAgICBjd2Q6IGNvbmZpZy5kaXJQYXRoLFxuICAgICAgICBkb3Q6IHRydWUsXG4gICAgICAgIGlnbm9yZTogZ2xvYklnbm9yZSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZGlyTmFtZVNldCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgZm9yIChjb25zdCBweXRob25GaWxlIG9mIHB5dGhvbkZpbGVzKSB7XG4gICAgICAgIGNvbnN0IFtmaXJzdCwgc2Vjb25kXSA9IHB5dGhvbkZpbGUuc3BsaXQoJy8nKTtcbiAgICAgICAgaWYgKGZpcnN0ICYmIHNlY29uZCkge1xuICAgICAgICAgIGRpck5hbWVTZXQuYWRkKGZpcnN0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGRpck5hbWVTZXQuc2l6ZSA+IDApIHtcbiAgICAgICAgY29uc3QgZGlyTmFtZXNTdHIgPSBbLi4uZGlyTmFtZVNldF0uam9pbignICcpO1xuICAgICAgICBjb25zdCBweXRob25SdW5uZXIgPSBgJHtweXRob25QYWNrYWdlTWFuYWdlcn0gcnVuYDtcbiAgICAgICAganNvbk9iai5zY3JpcHRzWydmb3JtYXQtY29kZSddID1cbiAgICAgICAgICBgJHtweXRob25SdW5uZXJ9IGlzb3J0IC0tcHJvZmlsZSBibGFjayAke2Rpck5hbWVzU3RyfSAmJiAke3B5dGhvblJ1bm5lcn0gYmxhY2sgJHtkaXJOYW1lc1N0cn1gO1xuICAgICAgICBpZiAoanNvbk9iai5zY3JpcHRzLmxpbnQpIHtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHMubGludCA9IGAke3B5dGhvblJ1bm5lcn0gZmxha2U4ICR7ZGlyTmFtZXNTdHJ9ICYmICR7anNvbk9iai5zY3JpcHRzLmxpbnR9YDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHMubGludCA9IGAke3B5dGhvblJ1bm5lcn0gZmxha2U4ICR7ZGlyTmFtZXNTdHJ9YDtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J10gPSAneWFybiBsaW50JztcbiAgICAgICAgfVxuICAgICAgICBqc29uT2JqLnNjcmlwdHMuZm9ybWF0ID0gYXBwZW5kRm9ybWF0Q29kZUNvbW1hbmQoanNvbk9iai5zY3JpcHRzLmZvcm1hdCwgY29uZmlnKTtcbiAgICAgICAgZGVwZW5kZW5jeVVwZGF0ZXMucHl0aG9uRGV2RGVwZW5kZW5jaWVzLnB1c2goJ2JsYWNrJywgJ2lzb3J0JywgJ2ZsYWtlOCcpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcucmVwb3NpdG9yeSB8fCBqc29uT2JqLnJlcG9zaXRvcnkpIHtcbiAgICBqc29uT2JqLnJlcG9zaXRvcnkgPSBmb3JtYXRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24oY29uZmlnLnJlcG9zaXRvcnkgPz8ganNvbk9iai5yZXBvc2l0b3J5LCBqc29uT2JqLnJlcG9zaXRvcnkpO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHopIHtcbiAgICBpZiAoIWpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXT8uc3RhcnRzV2l0aCgnYmxpdHogY29kZWdlbicpKSB7XG4gICAgICBqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10gPSAnYmxpdHogY29kZWdlbic7XG4gICAgfSBlbHNlIGlmICghanNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddLmluY2x1ZGVzKCdibGl0eiBwcmlzbWEgZ2VuZXJhdGUnKSkge1xuICAgICAganNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddID0ganNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddLnJlcGxhY2UoXG4gICAgICAgICdibGl0eiBjb2RlZ2VuJyxcbiAgICAgICAgJ2JsaXR6IGNvZGVnZW4gJiYgYmxpdHogcHJpc21hIGdlbmVyYXRlJ1xuICAgICAgKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEgJiYgIWpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXT8uc3RhcnRzV2l0aCgncHJpc21hIGdlbmVyYXRlJykpIHtcbiAgICBqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10gPSAncHJpc21hIGdlbmVyYXRlJztcbiAgfVxuICBhZGRHZW5JMThuVHNQb3N0aW5zdGFsbFNjcmlwdChjb25maWcsIGpzb25PYmopO1xuXG4gIGlmICghanNvbk9iai5kZXBlbmRlbmNpZXMucHJldHRpZXIpIHtcbiAgICAvLyBCZWNhdXNlIEB0eXBlcy9wcmV0dGllciBibG9ja3MgcHJldHRpZXIgZXhlY3V0aW9uLlxuICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHR5cGVzL3ByZXR0aWVyJ107XG4gIH1cbn1cblxuZnVuY3Rpb24gYXBwZW5kRm9ybWF0Q29kZUNvbW1hbmQoZm9ybWF0U2NyaXB0OiBzdHJpbmcgfCB1bmRlZmluZWQsIGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIC8vIEJ1biBwcm9qZWN0cyBtYXkgbm90IGhhdmUgYSBZYXJuIGxvY2tmaWxlLCBzbyBnZW5lcmF0ZWQgcGFja2FnZSBzY3JpcHRzXG4gIC8vIG11c3QgaW52b2tlIGxvY2FsIHBhY2thZ2Ugc2NyaXB0cyB0aHJvdWdoIHRoZSByZXBvc2l0b3J5J3MgcGFja2FnZSBtYW5hZ2VyLlxuICBjb25zdCBzY3JpcHRSdW5uZXIgPSBjb25maWcuaXNCdW4gPyAnYnVuIHJ1bicgOiAneWFybic7XG4gIHJldHVybiBmb3JtYXRTY3JpcHQgPyBgJHtmb3JtYXRTY3JpcHR9ICYmICR7c2NyaXB0UnVubmVyfSBmb3JtYXQtY29kZWAgOiBgJHtzY3JpcHRSdW5uZXJ9IGZvcm1hdC1jb2RlYDtcbn1cblxuZnVuY3Rpb24gYWRkR2VuSTE4blRzUG9zdGluc3RhbGxTY3JpcHQoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGNvbnN0IGNvbW1hbmQgPSBnZXRHZW5JMThuVHNDb21tYW5kKGNvbmZpZywganNvbk9iai5zY3JpcHRzKTtcbiAgaWYgKCFjb21tYW5kKSByZXR1cm47XG5cbiAgY29uc3QgcG9zdGluc3RhbGwgPSBqc29uT2JqLnNjcmlwdHMucG9zdGluc3RhbGw7XG4gIGlmICghcG9zdGluc3RhbGwpIHtcbiAgICBqc29uT2JqLnNjcmlwdHMucG9zdGluc3RhbGwgPSBjb21tYW5kO1xuICB9IGVsc2UgaWYgKCFwb3N0aW5zdGFsbC5pbmNsdWRlcyhjb21tYW5kKSkge1xuICAgIGpzb25PYmouc2NyaXB0cy5wb3N0aW5zdGFsbCA9IGAke3Bvc3RpbnN0YWxsfSAmJiAke2NvbW1hbmR9YDtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBub3JtYWxpemVQdWJsaXNoZWRDb25maWdQYWNrYWdlTWV0YWRhdGEoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvblxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghaXNQdWJsaXNoZWRXaWxsYm9vc3RlckNvbmZpZ3NQYWNrYWdlKGNvbmZpZykpIHJldHVybjtcblxuICBjb25zdCBjb25maWdNanNQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnY29uZmlnLm1qcycpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoY29uZmlnTWpzUGF0aCkpIHJldHVybjtcblxuICBqc29uT2JqLnR5cGUgPSAnbW9kdWxlJztcblxuICBjb25zdCBjb25maWdEdHNQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnY29uZmlnLmQudHMnKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGNvbmZpZ0R0c1BhdGgpKSByZXR1cm47XG5cbiAganNvbk9iai5maWxlcyA9IFsuLi5uZXcgU2V0KFsuLi4oanNvbk9iai5maWxlcyA/PyBbXSksICdjb25maWcuZC5tdHMnXSldO1xuICAvLyBOb2RlTmV4dCByZXNvbHZlcyBhIHJlbGF0aXZlIGAuL2NvbmZpZy5tanNgIGltcG9ydCB0byBgY29uZmlnLmQubXRzYCwgbm90XG4gIC8vIHRoZSBwYWNrYWdlLWxldmVsIGB0eXBlc2AgZmllbGQuIEtlZXAgdGhlIHB1Ymxpc2hlZCBjb25maWcgaW1wb3J0YWJsZSBmcm9tXG4gIC8vIHBhY2thZ2UtbG9jYWwgVHlwZVNjcmlwdCBsaW50ZXIgc2V0dGluZ3MuXG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2NvbmZpZy5kLm10cycpLCBjb25maWdEbXRzQ29udGVudCkpO1xufVxuXG5jb25zdCBjb25maWdEbXRzQ29udGVudCA9IGBleHBvcnQgeyBkZWZhdWx0IH0gZnJvbSAnLi9jb25maWcuanMnO1xuYDtcblxuZnVuY3Rpb24gYWRkRGVwZW5kZW5jeVZlcnNpb25zVG9QYWNrYWdlSnNvbihqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uLCBkZXBlbmRlbmN5VXBkYXRlczogRGVwZW5kZW5jeVVwZGF0ZXMpOiB2b2lkIHtcbiAgY29uc3QgcGFja2FnZUpzb25EZXBlbmRlbmNpZXMgPSBqc29uT2JqLmRlcGVuZGVuY2llcztcbiAgY29uc3QgcGFja2FnZUpzb25EZXZEZXBlbmRlbmNpZXMgPSBqc29uT2JqLmRldkRlcGVuZGVuY2llcztcbiAgZGVwZW5kZW5jeVVwZGF0ZXMuZGVwZW5kZW5jaWVzID0gYWRkUGFja2FnZUpzb25EZXBlbmRlbmNpZXMocGFja2FnZUpzb25EZXBlbmRlbmNpZXMsIGRlcGVuZGVuY3lVcGRhdGVzLmRlcGVuZGVuY2llcyk7XG4gIGRlcGVuZGVuY3lVcGRhdGVzLmRldkRlcGVuZGVuY2llcyA9IGRlcGVuZGVuY3lVcGRhdGVzLmRldkRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIXBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcF0pO1xuICBkZXBlbmRlbmN5VXBkYXRlcy5kZXZEZXBlbmRlbmNpZXMgPSBhZGRQYWNrYWdlSnNvbkRlcGVuZGVuY2llcyhcbiAgICBwYWNrYWdlSnNvbkRldkRlcGVuZGVuY2llcyxcbiAgICBkZXBlbmRlbmN5VXBkYXRlcy5kZXZEZXBlbmRlbmNpZXNcbiAgKTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlRW1wdHlEZXBlbmRlbmN5U2VjdGlvbnMoanNvbk9iajogUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBrZXkgb2YgZGVwZW5kZW5jeVNlY3Rpb25LZXlzKSB7XG4gICAgY29uc3Qgc2VjdGlvbiA9IGpzb25PYmpba2V5XTtcbiAgICBpZiAoc2VjdGlvbiAmJiBPYmplY3Qua2V5cyhzZWN0aW9uKS5sZW5ndGggPT09IDApIHtcbiAgICAgIFJlZmxlY3QuZGVsZXRlUHJvcGVydHkoanNvbk9iaiwga2V5KTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5zdGFsbERlcGVuZGVuY3lVcGRhdGVzKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFBhY2thZ2VKc29uLFxuICBkZXBlbmRlbmN5VXBkYXRlczogRGVwZW5kZW5jeVVwZGF0ZXMsXG4gIHBhY2thZ2VNYW5hZ2VyOiAnYnVuJyB8ICd5YXJuJ1xuKTogdm9pZCB7XG4gIGNvbnN0IGRlcGVuZGVuY2llcyA9IGRlcGVuZGVuY3lVcGRhdGVzLmRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzPy5bZGVwXSk7XG4gIGluc3RhbGxOcG1EZXBlbmRlbmNpZXMoY29uZmlnLCBwYWNrYWdlTWFuYWdlciwganNvbk9iai5kZXBlbmRlbmNpZXMgPz8ge30sIGRlcGVuZGVuY2llcywgZmFsc2UpO1xuXG4gIGNvbnN0IGRldkRlcGVuZGVuY2llcyA9IGRlcGVuZGVuY3lVcGRhdGVzLmRldkRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWpzb25PYmouZGVwZW5kZW5jaWVzPy5bZGVwXSk7XG4gIGluc3RhbGxOcG1EZXBlbmRlbmNpZXMoY29uZmlnLCBwYWNrYWdlTWFuYWdlciwganNvbk9iai5kZXZEZXBlbmRlbmNpZXMgPz8ge30sIGRldkRlcGVuZGVuY2llcywgdHJ1ZSk7XG5cbiAgY29uc3QgcHl0aG9uUGFja2FnZU1hbmFnZXIgPSBnZXRQeXRob25QYWNrYWdlTWFuYWdlcihjb25maWcpO1xuICBpZiAocHl0aG9uUGFja2FnZU1hbmFnZXIgJiYgZGVwZW5kZW5jeVVwZGF0ZXMucHl0aG9uRGV2RGVwZW5kZW5jaWVzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSBbLi4ubmV3IFNldChkZXBlbmRlbmN5VXBkYXRlcy5weXRob25EZXZEZXBlbmRlbmNpZXMpXTtcbiAgICBpZiAocHl0aG9uUGFja2FnZU1hbmFnZXIgPT09ICdwb2V0cnknKSB7XG4gICAgICBzcGF3blN5bmMoJ3BvZXRyeScsIFsnYWRkJywgJy0tZ3JvdXAnLCAnZGV2JywgLi4uZGVwZW5kZW5jaWVzXSwgY29uZmlnLmRpclBhdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzcGF3blN5bmMoJ3V2JywgWydhZGQnLCAnLS1kZXYnLCAuLi5kZXBlbmRlbmNpZXNdLCBjb25maWcuZGlyUGF0aCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldFB5dGhvblBhY2thZ2VNYW5hZ2VyKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6ICdwb2V0cnknIHwgJ3V2JyB8IHVuZGVmaW5lZCB7XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5VdkxvY2spIHJldHVybiAndXYnO1xuICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jaykgcmV0dXJuICdwb2V0cnknO1xufVxuXG5mdW5jdGlvbiBnZXRQeXRob25TZXR1cENvbW1hbmQocGFja2FnZU1hbmFnZXI6ICdwb2V0cnknIHwgJ3V2Jyk6IHN0cmluZyB7XG4gIGlmIChwYWNrYWdlTWFuYWdlciA9PT0gJ3V2JykgcmV0dXJuICd1diBzeW5jIC0tZnJvemVuJztcbiAgcmV0dXJuICdwb2V0cnkgY29uZmlnIHZpcnR1YWxlbnZzLmluLXByb2plY3QgdHJ1ZSAmJiBwb2V0cnkgZW52IHVzZSAkKG1pc2UgY3VycmVudCBweXRob24pICYmIHBvZXRyeSBydW4gcGlwIGluc3RhbGwgLS11cGdyYWRlIHBpcCAmJiBwb2V0cnkgaW5zdGFsbCc7XG59XG5cbmZ1bmN0aW9uIGluc3RhbGxOcG1EZXBlbmRlbmNpZXMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcGFja2FnZU1hbmFnZXI6ICdidW4nIHwgJ3lhcm4nLFxuICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llczogUGFydGlhbDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PixcbiAgZGVwZW5kZW5jaWVzOiBzdHJpbmdbXSxcbiAgZGV2OiBib29sZWFuXG4pOiB2b2lkIHtcbiAgaWYgKGRlcGVuZGVuY2llcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICBjb25zdCBkZXBlbmRlbmN5U3BlY2lmaWVycyA9IFtcbiAgICAuLi5uZXcgU2V0KFxuICAgICAgZGVwZW5kZW5jaWVzLm1hcCgoZGVwZW5kZW5jeSkgPT5cbiAgICAgICAgZ2V0SW5zdGFsbERlcGVuZGVuY3lTcGVjaWZpZXIoZGVwZW5kZW5jeSwgcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0sIHBhY2thZ2VNYW5hZ2VyKVxuICAgICAgKVxuICAgICksXG4gIF07XG4gIHNwYXduU3luYyhcbiAgICBwYWNrYWdlTWFuYWdlcixcbiAgICBbJ2FkZCcsIC4uLihkZXYgPyBbJy1EJ10gOiBbXSksIC4uLihjb25maWcuaXNCdW4gPyBbJy0tZXhhY3QnXSA6IFtdKSwgLi4uZGVwZW5kZW5jeVNwZWNpZmllcnNdLFxuICAgIGNvbmZpZy5kaXJQYXRoXG4gICk7XG59XG5cbmZ1bmN0aW9uIGdldEluc3RhbGxEZXBlbmRlbmN5U3BlY2lmaWVyKFxuICBkZXBlbmRlbmN5OiBzdHJpbmcsXG4gIGN1cnJlbnRWZXJzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIHBhY2thZ2VNYW5hZ2VyOiAnYnVuJyB8ICd5YXJuJ1xuKTogc3RyaW5nIHtcbiAgLy8gWWFybiBwcmVmZXJzIGxvY2FsIHdvcmtzcGFjZXMgd2hlbiBhZGRpbmcgYSBiYXJlIHBhY2thZ2UgbmFtZS4gUGFzc2luZyB0aGVcbiAgLy8gcmVzb2x2ZWQgdmVyc2lvbiBrZWVwcyBtYW5hZ2VkIHRvb2xzIGFzIG5wbSBkZXBlbmRlbmNpZXMgaW4gY29uZmlnLXBhY2thZ2VcbiAgLy8gbW9ub3JlcG9zLCB3aGVyZSB0aG9zZSBwYWNrYWdlIG5hbWVzIGNhbiBhbHNvIGV4aXN0IGFzIHdvcmtzcGFjZXMuXG4gIGlmIChwYWNrYWdlTWFuYWdlciA9PT0gJ3lhcm4nICYmIGN1cnJlbnRWZXJzaW9uICYmICFpc1dvcmtzcGFjZVByb3RvY29sUmFuZ2UoY3VycmVudFZlcnNpb24pKSB7XG4gICAgcmV0dXJuIGAke2RlcGVuZGVuY3l9QCR7Y3VycmVudFZlcnNpb259YDtcbiAgfVxuXG4gIHJldHVybiBnZXREZXBlbmRlbmN5U3BlY2lmaWVyKGRlcGVuZGVuY3kpO1xufVxuXG5mdW5jdGlvbiBhZGRQYWNrYWdlSnNvbkRlcGVuZGVuY2llcyhcbiAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXM6IFBhcnRpYWw8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4sXG4gIGRlcGVuZGVuY2llczogc3RyaW5nW11cbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgZGVwZW5kZW5jaWVzVG9JbnN0YWxsOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2YgbmV3IFNldChkZXBlbmRlbmNpZXMpKSB7XG4gICAgY29uc3Qgc2hvdWxkVXBkYXRlRXhpc3RpbmdEZXBlbmRlbmN5ID0gc2hvdWxkVXBkYXRlRXhpc3RpbmdNYW5hZ2VkRGVwZW5kZW5jeShcbiAgICAgIGRlcGVuZGVuY3ksXG4gICAgICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XVxuICAgICk7XG4gICAgaWYgKHNob3VsZFVwZGF0ZUV4aXN0aW5nRGVwZW5kZW5jeSkge1xuICAgICAgZGVwZW5kZW5jaWVzVG9JbnN0YWxsLnB1c2goZGVwZW5kZW5jeSk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldICYmXG4gICAgICAhc2hvdWxkVXBkYXRlRXhpc3RpbmdEZXBlbmRlbmN5ICYmXG4gICAgICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSAhPT0gJyonXG4gICAgKVxuICAgICAgY29udGludWU7XG4gICAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0gPSBnZXRMYXRlc3REZXBlbmRlbmN5VmVyc2lvbihkZXBlbmRlbmN5KTtcbiAgfVxuICByZXR1cm4gZGVwZW5kZW5jaWVzVG9JbnN0YWxsO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRQYWNrYWdlSnNvbldpdGhQcm9qZWN0Rm9ybWF0dGVyKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHBhY2thZ2VNYW5hZ2VyOiAnYnVuJyB8ICd5YXJuJyxcbiAgZmlsZVBhdGg6IHN0cmluZ1xuKTogdm9pZCB7XG4gIGNvbnN0IHJlbGF0aXZlRmlsZVBhdGggPSBwYXRoLnJlbGF0aXZlKGNvbmZpZy5kaXJQYXRoLCBmaWxlUGF0aCk7XG4gIGlmICghcmVsYXRpdmVGaWxlUGF0aCkgcmV0dXJuO1xuXG4gIC8vIFJldXNlIHRoZSB0YXJnZXQgcmVwb3NpdG9yeSdzIG93biBmb3JtYXR0ZXIgYWZ0ZXIgZGVwZW5kZW5jeSBpbnN0YWxsYXRpb24gc29cbiAgLy8gcGFja2FnZS5qc29uIG1hdGNoZXMgd2hhdGV2ZXIgaXRzIGN1cnJlbnQgc29ydC1wYWNrYWdlLWpzb24gdmVyc2lvbiBleHBlY3RzLlxuICAvLyBUaGlzIGF2b2lkcyBmb2xsb3ctdXAgYXV0b2ZpeCBjb21taXRzIGNhdXNlZCBvbmx5IGJ5IGZvcm1hdHRlciB2ZXJzaW9uIGRyaWZ0XG4gIC8vIGJldHdlZW4gd2JmeSBhbmQgdGhlIHByb2plY3QgYmVpbmcgdXBkYXRlZC5cbiAgaWYgKHBhY2thZ2VNYW5hZ2VyID09PSAnYnVuJykge1xuICAgIHNwYXduU3luYygnYnVueCcsIFsnc29ydC1wYWNrYWdlLWpzb24nLCByZWxhdGl2ZUZpbGVQYXRoXSwgY29uZmlnLmRpclBhdGgpO1xuICB9IGVsc2Uge1xuICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydzb3J0LXBhY2thZ2UtanNvbicsIHJlbGF0aXZlRmlsZVBhdGhdLCBjb25maWcuZGlyUGF0aCk7XG4gIH1cbn1cblxuLy8gVE9ETzogcmVtb3ZlIHRoZSBmb2xsb3dpbmcgbWlncmF0aW9uIGNvZGUgaW4gZnV0dXJlXG5hc3luYyBmdW5jdGlvbiByZW1vdmVEZXByZWNhdGVkU3R1ZmYoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogU2V0UmVxdWlyZWQ8UGFja2FnZUpzb24sICdzY3JpcHRzJyB8ICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcycgfCAncGVlckRlcGVuZGVuY2llcyc+XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKGpzb25PYmouYXV0aG9yID09PSAnV2lsbEJvb3N0ZXIgTExDJykge1xuICAgIGpzb25PYmouYXV0aG9yID0gJ1dpbGxCb29zdGVyIEluYy4nO1xuICB9XG4gIHJlbW92ZVNlbGZEZXBlbmRlbmN5KGNvbmZpZywganNvbk9iaik7XG4gIHJlcGxhY2VXaWxsQm9vc3RlckNvbmZpZ3NXb3Jrc3BhY2VEZXBlbmRlbmN5UmFuZ2VzKGNvbmZpZywganNvbk9iaik7XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3NvcnQtcGFja2FnZS1qc29uJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3NvcnQtYWxsLXBhY2thZ2UtanNvbiddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydjaGVjay1hbGwtZm9yLWFpJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2NoZWNrLWZvci1haSddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWyd0eXBlY2hlY2svd2FybiddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWyd0eXBlY2hlY2s6Z2VuLWNvZGUnXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sndHlwZWNoZWNrOmNvZGVnZW4nXTtcbiAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzLnRzbGliO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9yZW5vdmF0ZS1jb25maWcnXTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvdHNjb25maWcnXTtcbiAgLy8gTmV4dC5qcyBzdGlsbCByZXF1aXJlcyB0aGUgYHR5cGVzY3JpcHRgIHBhY2thZ2UgYXQgYnVpbGQvZGV2IHRpbWUgZm9yXG4gIC8vIFR5cGVTY3JpcHQgcHJvamVjdHMgZXZlbiB3aGVuIHJlcG9zIHVzZSB0c2dvIGZvciBleHBsaWNpdCB0eXBlY2hlY2tpbmcuXG4gIGlmICghY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW3R5cGVzY3JpcHREZXBlbmRlbmN5XTtcbiAgfVxuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXMubGVybmE7XG4gIC8vIFRvIGluc3RhbGwgdGhlIGxhdGVzdCBwaW5zdFxuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXMucGluc3Q7XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2ZsdXR0ZXItZm9ybWF0J107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2Zvcm1hdC1mbHV0dGVyJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3B5dGhvbi1mb3JtYXQnXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snZm9ybWF0LXB5dGhvbiddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzLnByZXR0aWVyO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydjaGVjay1hbGwnXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sndmVyaWZ5LWNvZGUnXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sndmVyaWZ5LWNvZGUtd2l0aC10ZXN0cyddO1xuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnbGVybmEuanNvbicpLCB7IGZvcmNlOiB0cnVlIH0pKTtcblxuICByZW1vdmVXaWxsQm9vc3RlckNvbmZpZ3NNYW5hZ2VkRGVwZW5kZW5jaWVzKGNvbmZpZywganNvbk9iaik7XG4gIHJlbW92ZU9ic29sZXRlTGludERlcGVuZGVuY2llcyhqc29uT2JqLCBjb25maWcpO1xufVxuXG5mdW5jdGlvbiByZW1vdmVTZWxmRGVwZW5kZW5jeShcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBTZXRSZXF1aXJlZDxQYWNrYWdlSnNvbiwgJ2RlcGVuZGVuY2llcycgfCAnZGV2RGVwZW5kZW5jaWVzJyB8ICdwZWVyRGVwZW5kZW5jaWVzJz5cbik6IHZvaWQge1xuICBjb25zdCBwYWNrYWdlTmFtZSA9IGpzb25PYmoubmFtZSB8fCBwYXRoLmJhc2VuYW1lKGNvbmZpZy5kaXJQYXRoKTtcblxuICAvLyBBIHBhY2thZ2UgY2FuIGltcG9ydCBpdHNlbGYgdGhyb3VnaCBOb2RlJ3MgcGFja2FnZSBzZWxmLXJlZmVyZW5jZSB3aXRob3V0XG4gIC8vIGRlY2xhcmluZyBpdHNlbGY7IGtlZXBpbmcgdGhhdCBlZGdlIGJyZWFrcyBtb25vcmVwbyByZWxlYXNlIHRvcG9sb2dpY2FsIHNvcnRpbmcuXG4gIGZvciAoY29uc3Qgc2VjdGlvbiBvZiBnZXREZXBlbmRlbmN5U2VjdGlvbnMoanNvbk9iaikpIHtcbiAgICBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KHNlY3Rpb24sIHBhY2thZ2VOYW1lKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXBsYWNlV2lsbEJvb3N0ZXJDb25maWdzV29ya3NwYWNlRGVwZW5kZW5jeVJhbmdlcyhjb25maWc6IFBhY2thZ2VDb25maWcsIGpzb25PYmo6IFBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGlmICghY29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzKSByZXR1cm47XG5cbiAgZm9yIChjb25zdCBzZWN0aW9uIG9mIGdldERlcGVuZGVuY3lTZWN0aW9ucyhqc29uT2JqKSkge1xuICAgIGZvciAoY29uc3QgW2RlcGVuZGVuY3ksIHZlcnNpb25dIG9mIE9iamVjdC5lbnRyaWVzKHNlY3Rpb24pKSB7XG4gICAgICBpZiAoIXZlcnNpb24pIGNvbnRpbnVlO1xuICAgICAgaWYgKCFpc1dvcmtzcGFjZVByb3RvY29sUmFuZ2UodmVyc2lvbikpIGNvbnRpbnVlO1xuICAgICAgLy8gd2lsbGJvb3N0ZXItY29uZmlncyBwdWJsaXNoZXMgdGhlc2UgcGFja2FnZXMgaW5kZXBlbmRlbnRseSwgc28gZ2VuZXJhdGVkXG4gICAgICAvLyBwYWNrYWdlIG1ldGFkYXRhIG11c3QgZGVzY3JpYmUgbnBtIHJlbGVhc2UgZWRnZXMgaW5zdGVhZCBvZiBsb2NhbFxuICAgICAgLy8gd29ya3NwYWNlIGVkZ2VzIHRoYXQgcmVsZWFzZSB0b29saW5nIHRyZWF0cyBhcyBtb25vcmVwbyBncmFwaCBsaW5rcy5cbiAgICAgIC8vIFRoZSBmaW5hbCBgeWFybiBpbnN0YWxsIC0tbm8taW1tdXRhYmxlYCBzeW5jcyB0aGUgbG9ja2ZpbGUgYWZ0ZXIgdGhpc1xuICAgICAgLy8gbWlncmF0aW9uLCBldmVuIHdoZW4gdGhlIGRlcGVuZGVuY3kgaXMgbm90IHBhcnQgb2Ygd2JmeSdzIG1hbmFnZWQgbGlzdC5cbiAgICAgIHNlY3Rpb25bZGVwZW5kZW5jeV0gPSBnZXRMYXRlc3REZXBlbmRlbmN5VmVyc2lvbihkZXBlbmRlbmN5KTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVtb3ZlV2lsbEJvb3N0ZXJDb25maWdzTWFuYWdlZERlcGVuZGVuY2llcyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBTZXRSZXF1aXJlZDxQYWNrYWdlSnNvbiwgJ2RlcGVuZGVuY2llcycgfCAnZGV2RGVwZW5kZW5jaWVzJyB8ICdwZWVyRGVwZW5kZW5jaWVzJz5cbik6IHZvaWQge1xuICBpZiAoIWNvbmZpZy5pc1dpbGxCb29zdGVyQ29uZmlncykgcmV0dXJuO1xuXG4gIGNvbnN0IHNlY3Rpb25zID0gZ2V0RGVwZW5kZW5jeVNlY3Rpb25zKGpzb25PYmopO1xuICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2Ygd2lsbEJvb3N0ZXJDb25maWdzTWFuYWdlZERlcGVuZGVuY2llcykge1xuICAgIC8vIHdpbGxib29zdGVyLWNvbmZpZ3Mgb3ducyB0aGVzZSBjb25maWcgcGFja2FnZXMuIFBhY2thZ2UtbG9jYWwgZm9ybWF0dGVyXG4gICAgLy8gYW5kIGxpbnRlciBjb25maWcgZmlsZXMgYXJlIHJlcG8gdG9vbGluZywgbm90IHB1Ymxpc2hlZCBwYWNrYWdlIGRhdGEsIHNvXG4gICAgLy8gdGhlIHBhY2thZ2UgbWV0YWRhdGEgb25seSBuZWVkcyB0aGUgZm9ybWF0dGVyL2xpbnRlciBleGVjdXRhYmxlcy5cbiAgICBmb3IgKGNvbnN0IHNlY3Rpb24gb2Ygc2VjdGlvbnMpIHtcbiAgICAgIFJlZmxlY3QuZGVsZXRlUHJvcGVydHkoc2VjdGlvbiwgZGVwZW5kZW5jeSk7XG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZVVudXNlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uLFxuICB1c2VkRGVwZW5kZW5jaWVzOiBzdHJpbmdbXVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHVzZWREZXBlbmRlbmN5U2V0ID0gbmV3IFNldCh1c2VkRGVwZW5kZW5jaWVzKTtcbiAgY29uc3QgZXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMgPSBhd2FpdCBnZXRFeGlzdGluZ1RzY29uZmlnQmFzZURlcGVuZGVuY2llcyhjb25maWcpO1xuICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2YgbWFuYWdlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcykge1xuICAgIGlmICh1c2VkRGVwZW5kZW5jeVNldC5oYXMoZGVwZW5kZW5jeSkgfHwgZXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMuaGFzKGRlcGVuZGVuY3kpKSBjb250aW51ZTtcbiAgICAvLyB3YmZ5IG93bnMgdGhlc2UgYmFzZS1jb25maWcgcGFja2FnZXMuIFJlbW92ZSBzdGFsZSB2YXJpYW50cyB3aGVuIHJlcG9cbiAgICAvLyBjYXBhYmlsaXRpZXMgY2hhbmdlLCBzdWNoIGFzIE5leHQuanMgdGFraW5nIG93bmVyc2hpcCBvZiB0c2NvbmZpZy5qc29uLlxuICAgIGZvciAoY29uc3Qgc2VjdGlvbiBvZiBnZXREZXBlbmRlbmN5U2VjdGlvbnMoanNvbk9iaikpIHtcbiAgICAgIFJlZmxlY3QuZGVsZXRlUHJvcGVydHkoc2VjdGlvbiwgZGVwZW5kZW5jeSk7XG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEV4aXN0aW5nVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8U2V0PHN0cmluZz4+IHtcbiAgY29uc3QgZXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgZmlsZVBhdGhzID0gYXdhaXQgZmcuZ2xvYignKiovdHNjb25maWcqLmpzb24nLCB7XG4gICAgY3dkOiBjb25maWcuZGlyUGF0aCxcbiAgICBkb3Q6IHRydWUsXG4gICAgaWdub3JlOiBnbG9iSWdub3JlLFxuICB9KTtcblxuICBmb3IgKGNvbnN0IGZpbGVQYXRoIG9mIGZpbGVQYXRocykge1xuICAgIGNvbnN0IGFic29sdXRlRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGZpbGVQYXRoKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGFyc2VkID0gdHMucGFyc2VDb25maWdGaWxlVGV4dFRvSnNvbihcbiAgICAgICAgYWJzb2x1dGVGaWxlUGF0aCxcbiAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoYWJzb2x1dGVGaWxlUGF0aCwgJ3V0ZjgnKVxuICAgICAgKTtcbiAgICAgIGlmIChwYXJzZWQuZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBQcmVzZXJ2ZSBtYW5hZ2VkIEB0c2NvbmZpZyBkZXBlbmRlbmNpZXMgYmVjYXVzZSAke2Fic29sdXRlRmlsZVBhdGh9IGNvdWxkIG5vdCBiZSBwYXJzZWQ6ICR7Zm9ybWF0VHNEaWFnbm9zdGljKHBhcnNlZC5lcnJvcil9YFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gbmV3IFNldChtYW5hZ2VkVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgdmFsdWUgb2Ygbm9ybWFsaXplVHNjb25maWdFeHRlbmRzKChwYXJzZWQuY29uZmlnIGFzIHsgZXh0ZW5kcz86IHVua25vd24gfSB8IHVuZGVmaW5lZCk/LmV4dGVuZHMpKSB7XG4gICAgICAgIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiBtYW5hZ2VkVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKSB7XG4gICAgICAgICAgaWYgKHZhbHVlID09PSBkZXBlbmRlbmN5IHx8IHZhbHVlLnN0YXJ0c1dpdGgoYCR7ZGVwZW5kZW5jeX0vYCkpIHtcbiAgICAgICAgICAgIGV4aXN0aW5nVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzLmFkZChkZXBlbmRlbmN5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgUHJlc2VydmUgbWFuYWdlZCBAdHNjb25maWcgZGVwZW5kZW5jaWVzIGJlY2F1c2UgJHthYnNvbHV0ZUZpbGVQYXRofSBjb3VsZCBub3QgYmUgcmVhZDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YFxuICAgICAgKTtcbiAgICAgIHJldHVybiBuZXcgU2V0KG1hbmFnZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBleGlzdGluZ1RzY29uZmlnQmFzZURlcGVuZGVuY2llcztcbn1cblxuZnVuY3Rpb24gZm9ybWF0VHNEaWFnbm9zdGljKGRpYWdub3N0aWM6IHRzLkRpYWdub3N0aWMpOiBzdHJpbmcge1xuICByZXR1cm4gdHMuZmxhdHRlbkRpYWdub3N0aWNNZXNzYWdlVGV4dChkaWFnbm9zdGljLm1lc3NhZ2VUZXh0LCAnXFxuJyk7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVRzY29uZmlnRXh0ZW5kcyh2YWx1ZTogdW5rbm93bik6IHN0cmluZ1tdIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHJldHVybiBbdmFsdWVdO1xuICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gW107XG4gIHJldHVybiB2YWx1ZS5maWx0ZXIoKGl0ZW0pOiBpdGVtIGlzIHN0cmluZyA9PiB0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycpO1xufVxuXG5mdW5jdGlvbiBnZXREZXBlbmRlbmN5U2VjdGlvbnMoanNvbk9iajogUGFja2FnZUpzb24pOiBQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+W10ge1xuICByZXR1cm4gZGVwZW5kZW5jeVNlY3Rpb25LZXlzXG4gICAgLm1hcCgoa2V5KSA9PiBqc29uT2JqW2tleV0pXG4gICAgLmZpbHRlcigoc2VjdGlvbik6IHNlY3Rpb24gaXMgUGFydGlhbDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiA9PiAhIXNlY3Rpb24pO1xufVxuXG5mdW5jdGlvbiBnZXRMYXRlc3REZXBlbmRlbmN5VmVyc2lvbihkZXBlbmRlbmN5OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBjYWNoZWRWZXJzaW9uID0gbGF0ZXN0RGVwZW5kZW5jeVZlcnNpb25DYWNoZS5nZXQoZGVwZW5kZW5jeSk7XG4gIGlmIChjYWNoZWRWZXJzaW9uKSByZXR1cm4gY2FjaGVkVmVyc2lvbjtcblxuICBjb25zdCB2ZXJzaW9uID0gZ2V0RGVwZW5kZW5jeVZlcnNpb25Gcm9tTnBtKGRlcGVuZGVuY3kpO1xuICBsYXRlc3REZXBlbmRlbmN5VmVyc2lvbkNhY2hlLnNldChkZXBlbmRlbmN5LCB2ZXJzaW9uKTtcbiAgcmV0dXJuIHZlcnNpb247XG59XG5cbmZ1bmN0aW9uIGdldERlcGVuZGVuY3lWZXJzaW9uRnJvbU5wbShkZXBlbmRlbmN5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBucG0ncyBsYXRlc3QgZGlzdC10YWcgc3RpbGwgdHJhY2tzIFRTNyBkZXYgc25hcHNob3RzOyB3YmZ5IHNob3VsZCBmb2xsb3dcbiAgLy8gdGhlIHB1YmxpYyBiZXRhIGNoYW5uZWwgdW50aWwgdGhlIHN0YWJsZSBUUzcgcGFja2FnZSBsYXlvdXQgaXMgZmluYWxpemVkLlxuICByZXR1cm4gKFxuICAgIHNwYXduU3luY0FuZFJldHVyblN0ZG91dChcbiAgICAgICducG0nLFxuICAgICAgWydzaG93JywgZ2V0RGVwZW5kZW5jeVNwZWNpZmllcihkZXBlbmRlbmN5KSwgJ3ZlcnNpb24nLCAnLS13b3Jrc3BhY2VzPWZhbHNlJ10sXG4gICAgICBwcm9jZXNzLmN3ZCgpXG4gICAgKSB8fCAnKidcbiAgKTtcbn1cblxuZnVuY3Rpb24gZ2V0RGVwZW5kZW5jeVNwZWNpZmllcihkZXBlbmRlbmN5OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gZGVwZW5kZW5jeSA9PT0gdHlwZXNjcmlwdEdvRGVwZW5kZW5jeSA/IGAke2RlcGVuZGVuY3l9QGJldGFgIDogZGVwZW5kZW5jeTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlT2Jzb2xldGVMaW50RGVwZW5kZW5jaWVzKFxuICBqc29uT2JqOiBTZXRSZXF1aXJlZDxQYWNrYWdlSnNvbiwgJ2RlcGVuZGVuY2llcycgfCAnZGV2RGVwZW5kZW5jaWVzJyB8ICdwZWVyRGVwZW5kZW5jaWVzJz4sXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZ1xuKTogdm9pZCB7XG4gIGNvbnN0IHByZXNlcnZlTWljcm9tYXRjaCA9IHNob3VsZFByZXNlcnZlTWljcm9tYXRjaChjb25maWcpO1xuICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2Ygb2Jzb2xldGVMaW50RGVwZW5kZW5jaWVzKSB7XG4gICAgaWYgKHByZXNlcnZlTWljcm9tYXRjaCAmJiBtaWNyb21hdGNoUGFja2FnZU5hbWVzLmhhcyhkZXBlbmRlbmN5KSkgY29udGludWU7XG4gICAgaWYgKHNob3VsZFByZXNlcnZlQ29uZmlnUGFja2FnZUxpbnREZXBlbmRlbmN5KGpzb25PYmosIGNvbmZpZywgZGVwZW5kZW5jeSkpIGNvbnRpbnVlO1xuICAgIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XTtcbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV07XG4gICAgZGVsZXRlIGpzb25PYmoucGVlckRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRQcmVzZXJ2ZUNvbmZpZ1BhY2thZ2VMaW50RGVwZW5kZW5jeShcbiAganNvbk9iajogU2V0UmVxdWlyZWQ8UGFja2FnZUpzb24sICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcycgfCAncGVlckRlcGVuZGVuY2llcyc+LFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGRlcGVuZGVuY3k6IHN0cmluZ1xuKTogYm9vbGVhbiB7XG4gIGlmICghaXNQdWJsaXNoZWRXaWxsYm9vc3RlckNvbmZpZ3NQYWNrYWdlKGNvbmZpZykpIHJldHVybiBmYWxzZTtcbiAgaWYgKGpzb25PYmoucGVlckRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSkgcmV0dXJuIHRydWU7XG5cbiAgLy8gUHVibGlzaGVkIGNvbmZpZyBwYWNrYWdlcyBuZWVkIGxvY2FsIHR5cGUtb25seSBkZXBzIHRvIHZhbGlkYXRlIHRoZVxuICAvLyBwYWNrYWdlLXByb3ZpZGVkIGNvbmZpZyBkZWNsYXJhdGlvbnMgdW5kZXIgWWFybiBQblAuXG4gIHJldHVybiBkZXBlbmRlbmN5ID09PSAnQHR5cGVzL2VzbGludCcgJiYgISFqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXMuZXNsaW50O1xufVxuXG5mdW5jdGlvbiBzaG91bGRQcmVzZXJ2ZU1pY3JvbWF0Y2goY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIC8vIHdpbGxib29zdGVyLWNvbmZpZ3Mgc3VicGFja2FnZXMgcHVibGlzaCBjb25maWcgZmlsZXMgYXMgdGhlaXIgcHJvZHVjdCwgc29cbiAgLy8gbWljcm9tYXRjaCBpcyBwYWNrYWdlIGRhdGEgdGhlcmUuIE90aGVyIHJlcG9zIGtlZXAgbWljcm9tYXRjaCBvbmx5IHdoZW5cbiAgLy8gcHJvZHVjdCBjb2RlIGltcG9ydHMgaXQ7IG90aGVyd2lzZSBpdCBpcyB0cmVhdGVkIGFzIG9ic29sZXRlIEVTTGludC1lcmFcbiAgLy8gdG9vbGluZy5cbiAgcmV0dXJuIChjb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3MgJiYgIWNvbmZpZy5pc1Jvb3QpIHx8IGRvZXNQcm9kdWN0Q29kZUltcG9ydE1pY3JvbWF0Y2goY29uZmlnLmRpclBhdGgpO1xufVxuXG5mdW5jdGlvbiBkb2VzUHJvZHVjdENvZGVJbXBvcnRNaWNyb21hdGNoKGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBmaWxlUGF0aHMgPSBmZy5nbG9iU3luYygnc3JjLyoqLyoue2pzLGpzeCxtanMsY2pzLHRzLHRzeCxtdHMsY3RzfScsIHtcbiAgICBjd2Q6IGRpclBhdGgsXG4gICAgZG90OiB0cnVlLFxuICAgIGlnbm9yZTogZ2xvYklnbm9yZSxcbiAgfSk7XG4gIHJldHVybiBmaWxlUGF0aHMuc29tZSgoZmlsZVBhdGgpID0+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIG1pY3JvbWF0Y2hJbXBvcnRQYXR0ZXJuLnRlc3QoZnMucmVhZEZpbGVTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCBmaWxlUGF0aCksICd1dGY4JykpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFVwZGF0ZUV4aXN0aW5nTWFuYWdlZERlcGVuZGVuY3koZGVwZW5kZW5jeTogc3RyaW5nLCBjdXJyZW50VmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIGlmICghY3VycmVudFZlcnNpb24pIHJldHVybiB0cnVlO1xuICBpZiAoY3VycmVudFZlcnNpb24gPT09ICcqJykgcmV0dXJuIHRydWU7XG4gIGlmIChpc1dvcmtzcGFjZVByb3RvY29sUmFuZ2UoY3VycmVudFZlcnNpb24pKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKGRlcGVuZGVuY3kgPT09IHR5cGVzY3JpcHRHb0RlcGVuZGVuY3kpIHJldHVybiBpc05ld2VyTWFuYWdlZERlcGVuZGVuY3lWZXJzaW9uKGRlcGVuZGVuY3ksIGN1cnJlbnRWZXJzaW9uKTtcbiAgLy8gd2JmeS1tYW5hZ2VkIHRvb2xzIG11c3QgYmUga2VwdCBjdXJyZW50IGV2ZW4gd2hlbiB0aGUgcGFja2FnZSBhbHJlYWR5IHBpbnNcbiAgLy8gYSBjb25jcmV0ZSB2ZXJzaW9uLiBJbiBwYXJ0aWN1bGFyLCBidWlsZC10cyBvd25zIGRlY2xhcmF0aW9uIG91dHB1dCBwYXRocy5cbiAgcmV0dXJuIGRlcGVuZGVuY3kgPT09ICdAd2lsbGJvb3N0ZXIvd2InIHx8IGRlcGVuZGVuY3kgPT09IGJ1aWxkVHNEZXBlbmRlbmN5IHx8IG94bGludERlcHMuaW5jbHVkZXMoZGVwZW5kZW5jeSk7XG59XG5cbmZ1bmN0aW9uIGlzTmV3ZXJNYW5hZ2VkRGVwZW5kZW5jeVZlcnNpb24oZGVwZW5kZW5jeTogc3RyaW5nLCBjdXJyZW50VmVyc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGxhdGVzdFZlcnNpb24gPSBnZXRMYXRlc3REZXBlbmRlbmN5VmVyc2lvbihkZXBlbmRlbmN5KTtcbiAgY29uc3QgdmFsaWRMYXRlc3RWZXJzaW9uID0gc2VtdmVyLnZhbGlkKGxhdGVzdFZlcnNpb24pO1xuICBjb25zdCB2YWxpZEN1cnJlbnRWZXJzaW9uID0gc2VtdmVyLnZhbGlkKGN1cnJlbnRWZXJzaW9uKTtcbiAgLy8gVGhlIFR5cGVTY3JpcHQgYmV0YSBkaXN0LXRhZyBjYW4gbGFnIGJlaGluZCBuZXdlciBjb25jcmV0ZSBkZXYgc25hcHNob3RzXG4gIC8vIGFscmVhZHkgcGlubmVkIGJ5IFJlbm92YXRlLiBLZWVwIHRoZSBleGlzdGluZyBwaW4gaW5zdGVhZCBvZiBkb3duZ3JhZGluZy5cbiAgcmV0dXJuICF2YWxpZExhdGVzdFZlcnNpb24gfHwgIXZhbGlkQ3VycmVudFZlcnNpb24gfHwgc2VtdmVyLmd0KHZhbGlkTGF0ZXN0VmVyc2lvbiwgdmFsaWRDdXJyZW50VmVyc2lvbik7XG59XG5cbmZ1bmN0aW9uIGlzV29ya3NwYWNlUHJvdG9jb2xSYW5nZSh2ZXJzaW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHZlcnNpb24uc3RhcnRzV2l0aCgnd29ya3NwYWNlOicpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24oXG4gIHJlcG9zaXRvcnk6IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J10sXG4gIGV4aXN0aW5nUmVwb3NpdG9yeT86IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J11cbik6IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J10ge1xuICBjb25zdCBub3JtYWxpemVkUmVwb3NpdG9yeSA9IG5vcm1hbGl6ZVJlcG9zaXRvcnlVcmxGb3JQYWNrYWdlSnNvbihyZXBvc2l0b3J5KTtcbiAgaWYgKG5vcm1hbGl6ZWRSZXBvc2l0b3J5KSB7XG4gICAgcmV0dXJuIGJ1aWxkTm9ybWFsaXplZFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbihub3JtYWxpemVkUmVwb3NpdG9yeSwgcmVwb3NpdG9yeSwgZXhpc3RpbmdSZXBvc2l0b3J5KTtcbiAgfVxuXG4gIGNvbnN0IG5vcm1hbGl6ZWRFeGlzdGluZ1JlcG9zaXRvcnkgPSBub3JtYWxpemVSZXBvc2l0b3J5VXJsRm9yUGFja2FnZUpzb24oZXhpc3RpbmdSZXBvc2l0b3J5KTtcbiAgaWYgKG5vcm1hbGl6ZWRFeGlzdGluZ1JlcG9zaXRvcnkpIHtcbiAgICByZXR1cm4gYnVpbGROb3JtYWxpemVkUmVwb3NpdG9yeUZvclBhY2thZ2VKc29uKG5vcm1hbGl6ZWRFeGlzdGluZ1JlcG9zaXRvcnksIGV4aXN0aW5nUmVwb3NpdG9yeSk7XG4gIH1cblxuICByZXR1cm4gcmVwb3NpdG9yeTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplUmVwb3NpdG9yeVVybEZvclBhY2thZ2VKc29uKHJlcG9zaXRvcnk6IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J10pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAodHlwZW9mIHJlcG9zaXRvcnkgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKCFyZXBvc2l0b3J5LnN0YXJ0c1dpdGgoJ2dpdGh1YjonKSkgcmV0dXJuO1xuXG4gICAgY29uc3QgW293bmVyLCByZXBvXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShyZXBvc2l0b3J5KTtcbiAgICBpZiAoIW93bmVyIHx8ICFyZXBvKSByZXR1cm47XG4gICAgcmV0dXJuIGBnaXQraHR0cHM6Ly9naXRodWIuY29tLyR7b3duZXJ9LyR7cmVwb30uZ2l0YDtcbiAgfVxuXG4gIGNvbnN0IHJlcG9zaXRvcnlVcmwgPSByZXBvc2l0b3J5Py51cmw7XG4gIGlmICh0eXBlb2YgcmVwb3NpdG9yeVVybCAhPT0gJ3N0cmluZycpIHJldHVybjtcblxuICBjb25zdCBtYXRjaGVkID0gL14oPzpnaXRcXCspP2h0dHBzOlxcL1xcL2dpdGh1YlxcLmNvbVxcLyhbXi9dKylcXC8oW14vXSs/KSg/OlxcLmdpdCk/JC91LmV4ZWMocmVwb3NpdG9yeVVybCk7XG4gIGlmICghbWF0Y2hlZCkgcmV0dXJuO1xuXG4gIGNvbnN0IFssIG93bmVyLCByZXBvXSA9IG1hdGNoZWQ7XG4gIHJldHVybiBgZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS8ke293bmVyfS8ke3JlcG99LmdpdGA7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkTm9ybWFsaXplZFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbihcbiAgbm9ybWFsaXplZFVybDogc3RyaW5nLFxuICByZXBvc2l0b3J5OiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddLFxuICBleGlzdGluZ1JlcG9zaXRvcnk/OiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddXG4pOiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddIHtcbiAgY29uc3QgcmVwb3NpdG9yeU9iaiA9XG4gICAgdHlwZW9mIHJlcG9zaXRvcnkgPT09ICdvYmplY3QnXG4gICAgICA/IHJlcG9zaXRvcnlcbiAgICAgIDogdHlwZW9mIGV4aXN0aW5nUmVwb3NpdG9yeSA9PT0gJ29iamVjdCdcbiAgICAgICAgPyBleGlzdGluZ1JlcG9zaXRvcnlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5yZXBvc2l0b3J5T2JqLFxuICAgIHR5cGU6ICdnaXQnLFxuICAgIHVybDogbm9ybWFsaXplZFVybCxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlU2NyaXB0cyhjb25maWc6IFBhY2thZ2VDb25maWcsIG9sZFNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgIGNvbnN0IGhhc1R5cGVjaGVjayA9IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXM7XG4gICAgY29uc3Qgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgIGNsZWFudXA6ICdidW4gLS1idW4gd2IgbGludCAtLWZpeCAtLWZvcm1hdCcsXG4gICAgICBmb3JtYXQ6IGBidW4gLS1idW4gd2IgbGludCAtLWZvcm1hdGAsXG4gICAgICBsaW50OiBgYnVuIC0tYnVuIHdiIGxpbnRgLFxuICAgICAgJ2xpbnQtZml4JzogJ2J1biAtLWJ1biB3YiBsaW50IC0tZml4JyxcbiAgICAgIHRlc3Q6ICdidW4gd2IgdGVzdCcsXG4gICAgICB0eXBlY2hlY2s6ICdidW4gLS1idW4gd2IgdHlwZWNoZWNrJyxcbiAgICAgIHZlcmlmeTogJ2J1biAtLWJ1biB3YiB2ZXJpZnknLFxuICAgICAgJ3ZlcmlmeS1mdWxsJzogJ2J1biAtLWJ1biB3YiB2ZXJpZnkgLS1mdWxsJyxcbiAgICB9O1xuICAgIGFwcGx5TWlzZVRhc2tTY3JpcHRzKGNvbmZpZywgc2NyaXB0cywgb2xkU2NyaXB0cywgWydidWlsZCcsICdkZXYnLCAnc3RhcnQnLCAndGVzdCcsICd0eXBlY2hlY2snXSk7XG4gICAgaWYgKCFoYXNUeXBlY2hlY2spIHtcbiAgICAgIGRlbGV0ZSBzY3JpcHRzLnR5cGVjaGVjaztcbiAgICB9IGVsc2UgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHlyaWdodCkge1xuICAgICAgc2NyaXB0cy50eXBlY2hlY2sgKz0gJyAmJiBweXJpZ2h0JztcbiAgICB9XG4gICAgcmV0dXJuIHNjcmlwdHM7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgaGFzVHlwZWNoZWNrID0gY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcztcbiAgICBjb25zdCBoYXNKc09yVHMgPSBkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpO1xuICAgIGNvbnN0IGhhc0phdmEgPSBkb2VzQ29udGFpbkphdmEoY29uZmlnKTtcbiAgICBjb25zdCBvbGRUZXN0ID0gb2xkU2NyaXB0cy50ZXN0O1xuICAgIGxldCBzY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgY2xlYW51cDogJ3lhcm4gZm9ybWF0ICYmIHlhcm4gbGludC1maXgnLFxuICAgICAgZm9ybWF0OiBnZW5lcmF0ZUZvcm1hdFNjcmlwdChoYXNKc09yVHMsIGhhc0phdmEpLFxuICAgICAgbGludDogYG94bGludCAtLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuIC5gLFxuICAgICAgJ2xpbnQtZml4JzogJ3lhcm4gbGludCAtLWZpeCcsXG4gICAgICAnZm9ybWF0LWNvZGUnOiBgb3hmbXQgLS13cml0ZSAtLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuIC4gJyEqKi9wYWNrYWdlLmpzb24nYCxcbiAgICAgIHR5cGVjaGVjazogJ3RzZ28gLS1ub0VtaXQnLFxuICAgIH07XG4gICAgaWYgKGhhc0phdmEpIHtcbiAgICAgIHNjcmlwdHMucHJldHRpZnkgPSBgcHJldHRpZXIgLS1jYWNoZSAtLWNvbG9yIC0tbm8tZXJyb3Itb24tdW5tYXRjaGVkLXBhdHRlcm4gLS13cml0ZSBcIioqL3suKi8sfSoueyR7ZXh0ZW5zaW9ucy5wcmV0dGllck9ubHkuam9pbignLCcpfX1cIiBcIiEqKi90ZXN0ey0sL31maXh0dXJlcy8qKlwiYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucykge1xuICAgICAgc2NyaXB0cyA9IG1lcmdlKFxuICAgICAgICB7IC4uLnNjcmlwdHMgfSxcbiAgICAgICAge1xuICAgICAgICAgIGZvcm1hdDogYCR7c2NyaXB0cy5mb3JtYXR9ICYmIHlhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsIC0tcGFyYWxsZWwgLS12ZXJib3NlIHJ1biBmb3JtYXRgLFxuICAgICAgICAgIGxpbnQ6IGB5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCAtLXBhcmFsbGVsIC0tdmVyYm9zZSBydW4gbGludGAsXG4gICAgICAgICAgJ2xpbnQtZml4JzogJ3lhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsIC0tcGFyYWxsZWwgLS12ZXJib3NlIHJ1biBsaW50LWZpeCcsXG4gICAgICAgICAgLy8gQ0k9MSBwcmV2ZW50cyB2aXRlc3QgZnJvbSBlbmFibGluZyB3YXRjaC5cbiAgICAgICAgICAvLyBGT1JDRV9DT0xPUj0zIG1ha2Ugd2IgZW5hYmxlIGNvbG9yIG91dHB1dC5cbiAgICAgICAgICB0ZXN0OiAnQ0k9MSBGT1JDRV9DT0xPUj0zIHlhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsIC0tdmVyYm9zZSBydW4gdGVzdCcsXG4gICAgICAgICAgdHlwZWNoZWNrOiAneWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwgLS1wYXJhbGxlbCAtLXZlcmJvc2UgcnVuIHR5cGVjaGVjaycsXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICBpZiAoaGFzSmF2YSkge1xuICAgICAgICBzY3JpcHRzLnByZXR0aWZ5ID0gYHByZXR0aWVyIC0tY2FjaGUgLS1jb2xvciAtLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuIC0td3JpdGUgXCIqKi97LiovLH0qLnske2V4dGVuc2lvbnMucHJldHRpZXJPbmx5LmpvaW4oXG4gICAgICAgICAgJywnXG4gICAgICAgICl9fVwiIFwiISoqL3BhY2thZ2VzLyoqXCIgXCIhKiovdGVzdHstLC99Zml4dHVyZXMvKipcImA7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjb25maWcuZGVwZW5kaW5nLnB5cmlnaHQpIHtcbiAgICAgIHNjcmlwdHMudHlwZWNoZWNrID0gc2NyaXB0cy50eXBlY2hlY2sgPyBgJHtzY3JpcHRzLnR5cGVjaGVja30gJiYgYCA6ICcnO1xuICAgICAgc2NyaXB0cy50eXBlY2hlY2sgKz0gJ3B5cmlnaHQnO1xuICAgIH1cbiAgICBpZiAob2xkVGVzdD8uaW5jbHVkZXMoJ3diIHRlc3QnKSkge1xuICAgICAgc2NyaXB0cy50ZXN0ID0gb2xkVGVzdDtcbiAgICB9XG4gICAgaWYgKCFoYXNKc09yVHMpIHtcbiAgICAgIGRlbGV0ZSBzY3JpcHRzWydmb3JtYXQtY29kZSddO1xuICAgICAgZGVsZXRlIHNjcmlwdHMubGludDtcbiAgICAgIGRlbGV0ZSBzY3JpcHRzWydsaW50LWZpeCddO1xuICAgIH1cbiAgICBpZiAoIWhhc1R5cGVjaGVjaykge1xuICAgICAgZGVsZXRlIHNjcmlwdHMudHlwZWNoZWNrO1xuICAgIH0gZWxzZSBpZiAoY29uZmlnLmRlcGVuZGluZy53Yikge1xuICAgICAgc2NyaXB0cy50eXBlY2hlY2sgPSAnd2IgdHlwZWNoZWNrJztcbiAgICB9XG4gICAgaWYgKGlzV2JQYWNrYWdlKGNvbmZpZy5wYWNrYWdlSnNvbikpIHtcbiAgICAgIHNjcmlwdHMudmVyaWZ5ID0gb2xkU2NyaXB0cy52ZXJpZnkgPz8gJ3lhcm4gd29ya3NwYWNlIEB3aWxsYm9vc3Rlci93YiBzdGFydCAtLXdvcmtpbmctZGlyIFwiJElOSVRfQ1dEXCIgdmVyaWZ5JztcbiAgICAgIHNjcmlwdHNbJ3ZlcmlmeS1mdWxsJ10gPSBvbGRTY3JpcHRzWyd2ZXJpZnktZnVsbCddID8/ICd5YXJuIHZlcmlmeSAtLWZ1bGwnO1xuICAgIH0gZWxzZSB7XG4gICAgICBzY3JpcHRzLnZlcmlmeSA9ICd3YiB2ZXJpZnknO1xuICAgICAgc2NyaXB0c1sndmVyaWZ5LWZ1bGwnXSA9ICd3YiB2ZXJpZnkgLS1mdWxsJztcbiAgICB9XG4gICAgYXBwbHlNaXNlVGFza1NjcmlwdHMoY29uZmlnLCBzY3JpcHRzLCBvbGRTY3JpcHRzLCBbJ2J1aWxkJywgJ2RldicsICdzdGFydCcsICd0ZXN0JywgJ3R5cGVjaGVjayddKTtcbiAgICByZXR1cm4gc2NyaXB0cztcbiAgfVxufVxuXG5mdW5jdGlvbiBpc1diUGFja2FnZShwYWNrYWdlSnNvbjogUGFja2FnZUpzb24gfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIHBhY2thZ2VKc29uPy5uYW1lID09PSB3YkRlcGVuZGVuY3k7XG59XG5cbmZ1bmN0aW9uIGFwcGx5TWlzZVRhc2tTY3JpcHRzKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHNjcmlwdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIG9sZFNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMsXG4gIG5hbWVzOiBzdHJpbmdbXVxuKTogdm9pZCB7XG4gIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykge1xuICAgIGlmICghaGFzTWlzZVRhc2soY29uZmlnLCBuYW1lKSkgY29udGludWU7XG4gICAgaWYgKGRvZXNNaXNlVGFza0NhbGxQYWNrYWdlU2NyaXB0KGNvbmZpZywgbmFtZSkpIGNvbnRpbnVlO1xuICAgIGlmIChvbGRTY3JpcHRzW25hbWVdICYmICFpc1diZnlNYW5hZ2VkTWlzZUJyaWRnZShvbGRTY3JpcHRzW25hbWVdLCBuYW1lKSAmJiAhKG5hbWUgaW4gc2NyaXB0cykpIGNvbnRpbnVlO1xuICAgIHNjcmlwdHNbbmFtZV0gPSBgbWlzZSBydW4gJHtuYW1lfWA7XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFzTWlzZVRhc2soY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIE9iamVjdC5oYXNPd24oY29uZmlnLm1pc2VUYXNrcywgbmFtZSk7XG59XG5cbmZ1bmN0aW9uIGRvZXNNaXNlVGFza0NhbGxQYWNrYWdlU2NyaXB0KGNvbmZpZzogUGFja2FnZUNvbmZpZywgbmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHRhc2sgPSBjb25maWcubWlzZVRhc2tzW25hbWVdO1xuICBpZiAoIXRhc2spIHJldHVybiBmYWxzZTtcbiAgY29uc3QgcGFja2FnZU1hbmFnZXJzID0gWydidW4nLCAneWFybicsICducG0nLCAncG5wbSddO1xuICByZXR1cm4gcGFja2FnZU1hbmFnZXJzLnNvbWUoKHBhY2thZ2VNYW5hZ2VyKSA9PlxuICAgIG5ldyBSZWdFeHAoU3RyaW5nLnJhd2BcXGIke3BhY2thZ2VNYW5hZ2VyfVxccysoPzpydW5cXHMrKT8ke2VzY2FwZVJlZ0V4cChuYW1lKX0oPyFbYS16QS1aMC05X1xcLTouXSlgLCAndScpLnRlc3QodGFzaylcbiAgKTtcbn1cblxuZnVuY3Rpb24gaXNXYmZ5TWFuYWdlZE1pc2VCcmlkZ2Uoc2NyaXB0OiB1bmtub3duLCBuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHNjcmlwdCA9PT0gYG1pc2UgcnVuICR7bmFtZX1gO1xufVxuXG5mdW5jdGlvbiBlc2NhcGVSZWdFeHAodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB2YWx1ZS5yZXBsYWNlQWxsKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgU3RyaW5nLnJhd2BcXCQmYCk7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlRm9ybWF0U2NyaXB0KGhhc0pzT3JUczogYm9vbGVhbiwgaGFzSmF2YTogYm9vbGVhbik6IHN0cmluZyB7XG4gIGNvbnN0IGNvbW1hbmRzID0gWydzb3J0LXBhY2thZ2UtanNvbiddO1xuICBpZiAoaGFzSnNPclRzKSB7XG4gICAgY29tbWFuZHMucHVzaCgneWFybiBmb3JtYXQtY29kZScpO1xuICB9XG4gIGlmIChoYXNKYXZhKSB7XG4gICAgY29tbWFuZHMucHVzaCgneWFybiBwcmV0dGlmeScpO1xuICB9XG4gIHJldHVybiBjb21tYW5kcy5qb2luKCcgJiYgJyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUHJldHRpZXJTdWZmaXgoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy5wcmV0dGllcmlnbm9yZScpO1xuICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKS5jYXRjaCgoKSA9PiAnJyk7XG4gIGNvbnN0IGluZGV4ID0gZXhpc3RpbmdDb250ZW50LmluZGV4T2YoaWdub3JlRmlsZVV0aWwuc2VwYXJhdG9yUHJlZml4KTtcbiAgaWYgKGluZGV4ID09PSAtMSkgcmV0dXJuICcnO1xuXG4gIGNvbnN0IG9yaWdpbmFsQ29udGVudCA9IGV4aXN0aW5nQ29udGVudC5zbGljZSgwLCBpbmRleCk7XG4gIGNvbnN0IGxpbmVzID0gb3JpZ2luYWxDb250ZW50XG4gICAgLnNwbGl0KCdcXG4nKVxuICAgIC5tYXAoKGxpbmUpID0+IHtcbiAgICAgIGNvbnN0IG5ld0xpbmUgPSBsaW5lLnRyaW0oKTtcbiAgICAgIHJldHVybiBuZXdMaW5lLmVuZHNXaXRoKCcvJykgPyBuZXdMaW5lLnNsaWNlKDAsIC0xKSA6IG5ld0xpbmU7XG4gICAgfSlcbiAgICAuZmlsdGVyKChsKSA9PiBsICYmICFsLnN0YXJ0c1dpdGgoJyMnKSAmJiAhbC5pbmNsdWRlcygnLycpKTtcblxuICByZXR1cm4gYCR7bGluZXMubWFwKChsaW5lKSA9PiBgIFwiISoqLyR7bGluZX0vKipcImApLmpvaW4oJycpfSB8fCB0cnVlYDtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlUHJldHRpZXJBcnRpZmFjdHMoanNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbik6IHZvaWQge1xuICBkZWxldGUganNvbk9iai5wcmV0dGllcjtcbiAgY29uc3QgZGVwZW5kZW5jeVNlY3Rpb25zOiBBcnJheTxQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+IHwgdW5kZWZpbmVkPiA9IFtcbiAgICBqc29uT2JqLmRlcGVuZGVuY2llcyxcbiAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llcyxcbiAgICBqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXMsXG4gIF07XG4gIGZvciAoY29uc3Qgc2VjdGlvbiBvZiBkZXBlbmRlbmN5U2VjdGlvbnMpIHtcbiAgICBpZiAoIXNlY3Rpb24pIGNvbnRpbnVlO1xuICAgIGRlbGV0ZSBzZWN0aW9uLnByZXR0aWVyO1xuICAgIGRlbGV0ZSBzZWN0aW9uWydwcmV0dGllci1wbHVnaW4tamF2YSddO1xuICAgIGRlbGV0ZSBzZWN0aW9uWydwcmV0dGllci1wbHVnaW4tcHJpc21hJ107XG4gICAgZGVsZXRlIHNlY3Rpb25bJ0B3aWxsYm9vc3Rlci9wcmV0dGllci1jb25maWcnXTtcbiAgICBkZWxldGUgc2VjdGlvblsnQHR5cGVzL3ByZXR0aWVyJ107XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gdXBkYXRlUHJpdmF0ZVBhY2thZ2VzKGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcGFja2FnZU5hbWVzID0gbmV3IFNldChbLi4uT2JqZWN0LmtleXMoanNvbk9iai5kZXBlbmRlbmNpZXMpLCAuLi5PYmplY3Qua2V5cyhqc29uT2JqLmRldkRlcGVuZGVuY2llcyldKTtcbiAgY29uc3QgcHJpdmF0ZVBhY2thZ2VzOiB7XG4gICAgcGFja2FnZU5hbWU6IHN0cmluZztcbiAgICByZXBvOiBzdHJpbmc7XG4gICAgdGFyZ2V0OiAnZGVwZW5kZW5jaWVzJyB8ICdkZXZEZXBlbmRlbmNpZXMnO1xuICB9W10gPSBbXG4gICAgeyBwYWNrYWdlTmFtZTogJ0B3aWxsYm9vc3Rlci9hdXRoJywgcmVwbzogJ2F1dGgnLCB0YXJnZXQ6ICdkZXBlbmRlbmNpZXMnIH0sXG4gICAgeyBwYWNrYWdlTmFtZTogJ0BkaXNjb3JkLWJvdC9zaGFyZWQnLCByZXBvOiAnZGlzY29yZC1ib3QnLCB0YXJnZXQ6ICdkZXBlbmRlbmNpZXMnIH0sXG4gICAgeyBwYWNrYWdlTmFtZTogJ0B3aWxsYm9vc3Rlci9jb2RlLWFuYWx5emVyJywgcmVwbzogJ2NvZGUtYW5hbHl6ZXInLCB0YXJnZXQ6ICdkZXZEZXBlbmRlbmNpZXMnIH0sXG4gICAgeyBwYWNrYWdlTmFtZTogJ0B3aWxsYm9vc3Rlci9qdWRnZScsIHJlcG86ICdqdWRnZScsIHRhcmdldDogJ2RlcGVuZGVuY2llcycgfSxcbiAgICB7IHBhY2thZ2VOYW1lOiAnQHdpbGxib29zdGVyL2xsbS1wcm94eScsIHJlcG86ICdsbG0tcHJveHknLCB0YXJnZXQ6ICdkZXBlbmRlbmNpZXMnIH0sXG4gIF07XG5cbiAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgcHJpdmF0ZVBhY2thZ2VzLm1hcChhc3luYyAoeyBwYWNrYWdlTmFtZSwgcmVwbywgdGFyZ2V0IH0pID0+IHtcbiAgICAgIGlmICghcGFja2FnZU5hbWVzLmhhcyhwYWNrYWdlTmFtZSkgfHwgaXNXb3Jrc3BhY2VQYWNrYWdlKGpzb25PYmosIHBhY2thZ2VOYW1lKSkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBvdGhlclRhcmdldCA9IHRhcmdldCA9PT0gJ2RlcGVuZGVuY2llcycgPyAnZGV2RGVwZW5kZW5jaWVzJyA6ICdkZXBlbmRlbmNpZXMnO1xuICAgICAgLy8gVGhlIGxpbnQgcnVsZSBkaXNhbGxvd3MgYGRlbGV0ZWAgd2l0aCBjb21wdXRlZCBwYWNrYWdlIG5hbWVzOyBSZWZsZWN0IGhhcyB0aGUgc2FtZSBkZWxldGlvbiBzZW1hbnRpY3MgaGVyZS5cbiAgICAgIFJlZmxlY3QuZGVsZXRlUHJvcGVydHkoanNvbk9ialtvdGhlclRhcmdldF0sIHBhY2thZ2VOYW1lKTtcbiAgICAgIGpzb25PYmpbdGFyZ2V0XVtwYWNrYWdlTmFtZV0gPSBhd2FpdCBnZXRMYXRlc3RQcml2YXRlUGFja2FnZVNwZWNpZmllcihyZXBvKTtcbiAgICB9KVxuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRMYXRlc3RQcml2YXRlUGFja2FnZVNwZWNpZmllcihyZXBvOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBjb21taXRIYXNoID0gYXdhaXQgZ2V0TGF0ZXN0Q29tbWl0SGFzaCgnV2lsbEJvb3N0ZXJMYWInLCByZXBvKTtcbiAgcmV0dXJuIGBnaXRAZ2l0aHViLmNvbTpXaWxsQm9vc3RlckxhYi8ke3JlcG99LmdpdCMke2NvbW1pdEhhc2h9YDtcbn1cblxuZnVuY3Rpb24gaXNXb3Jrc3BhY2VQYWNrYWdlKGpzb25PYmo6IFBhY2thZ2VKc29uLCBwYWNrYWdlTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAoanNvbk9iai5kZXZEZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV0gfHwganNvbk9iai5kZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV0gfHwgJycpLmluY2x1ZGVzKCd3b3Jrc3BhY2UnKTtcbn1cbiIsImltcG9ydCB7IHNwYXduU3luY0FuZFJldHVyblN0ZG91dCB9IGZyb20gJy4uL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMYXRlc3RDb21taXRIYXNoKG9yZ2FuaXphdGlvbjogc3RyaW5nLCByZXBvOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICB0cnkge1xuICAgIGNvbnN0IHJlcG9VcmwgPSBgZ2l0QGdpdGh1Yi5jb206JHtvcmdhbml6YXRpb259LyR7cmVwb30uZ2l0YDtcbiAgICBjb25zdCBvdXRwdXQgPSBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoJ2dpdCcsIFsnbHMtcmVtb3RlJywgcmVwb1VybCwgJ0hFQUQnXSwgcHJvY2Vzcy5jd2QoKSk7XG4gICAgY29uc3QgY29tbWl0SGFzaCA9IG91dHB1dC5zcGxpdCgvXFxzKy8pWzBdO1xuICAgIGlmICghY29tbWl0SGFzaCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBjb21taXRzIGZvdW5kIGZvciAke29yZ2FuaXphdGlvbn0vJHtyZXBvfWApO1xuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGNvbW1pdEhhc2gpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYEZhaWxlZCB0byBmZXRjaCBjb21taXRzIGZvciAke29yZ2FuaXphdGlvbn0vJHtyZXBvfTogJHtTdHJpbmcoZXJyb3IpfWApKTtcbiAgfVxufVxuIiwiLy8gb3hsaW50LWRpc2FibGUgZXNsaW50LXBsdWdpbi1pbXBvcnQvbm8tbmFtZWQtYXMtZGVmYXVsdC1tZW1iZXIgLS0gTmFtZXNwYWNlIFlBTUwgY2FsbHMgbWFrZSBkdW1wIHVzYWdlIGNsZWFyZXIuXG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeWFtbCBmcm9tICdqcy15YW1sJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZ2V0R2VuSTE4blRzQ29tbWFuZCB9IGZyb20gJy4uL3V0aWxzL2dlbkkxOG5Ucy5qcyc7XG5pbXBvcnQgeyBkb2VzQ29udGFpbkphdmEsIGRvZXNDb250YWluSnNPclRzIH0gZnJvbSAnLi4vdXRpbHMvcGFja2FnZUNhcGFiaWxpdGllcy5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuXG5pbXBvcnQgeyBnZW5lcmF0ZVNjcmlwdHMgfSBmcm9tICcuL3BhY2thZ2VKc29uLmpzJztcblxuaW50ZXJmYWNlIExlZnRob29rU2V0dGluZ3Mge1xuICBnbG9iX21hdGNoZXI6ICdkb3VibGVzdGFyJztcbiAgJ3Bvc3QtbWVyZ2UnOiB7XG4gICAgam9iczogTGVmdGhvb2tKb2JbXTtcbiAgfTtcbiAgJ3ByZS1jb21taXQnOiB7XG4gICAgam9iczogTGVmdGhvb2tKb2JbXTtcbiAgfTtcbiAgJ3ByZS1wdXNoJzoge1xuICAgIGpvYnM6IExlZnRob29rSm9iW107XG4gIH07XG59XG5cbmludGVyZmFjZSBMZWZ0aG9va0pvYiB7XG4gIG5hbWU6IHN0cmluZztcbiAgZ2xvYj86IHN0cmluZztcbiAgcnVuPzogc3RyaW5nO1xuICBzY3JpcHQ/OiBzdHJpbmc7XG4gIHJ1bm5lcj86ICdiYXNoJztcbiAgc3RhZ2VfZml4ZWQ/OiB0cnVlO1xufVxuXG5jb25zdCBiYXNlU2V0dGluZ3M6IE9taXQ8TGVmdGhvb2tTZXR0aW5ncywgJ3ByZS1jb21taXQnPiA9IHtcbiAgZ2xvYl9tYXRjaGVyOiAnZG91Ymxlc3RhcicsXG4gICdwb3N0LW1lcmdlJzoge1xuICAgIGpvYnM6IFtcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3ByZXBhcmUnLFxuICAgICAgICBzY3JpcHQ6ICdwcmVwYXJlLnNoJyxcbiAgICAgICAgcnVubmVyOiAnYmFzaCcsXG4gICAgICB9LFxuICAgIF0sXG4gIH0sXG4gICdwcmUtcHVzaCc6IHtcbiAgICBqb2JzOiBbXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdjaGVjaycsXG4gICAgICAgIHNjcmlwdDogJ2NoZWNrLnNoJyxcbiAgICAgICAgcnVubmVyOiAnYmFzaCcsXG4gICAgICB9LFxuICAgIF0sXG4gIH0sXG59O1xuXG5jb25zdCBwcmVDb21taXRTZXR0aW5nczogTGVmdGhvb2tTZXR0aW5nc1sncHJlLWNvbW1pdCddID0ge1xuICBqb2JzOiBbXG4gICAge1xuICAgICAgbmFtZTogJ2NsZWFudXAnLFxuICAgICAgZ2xvYjogJycsXG4gICAgICBydW46ICcnLFxuICAgICAgc3RhZ2VfZml4ZWQ6IHRydWUsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnY2hlY2stbWlncmF0aW9ucycsXG4gICAgICBnbG9iOiAnKiovbWlncmF0aW9uLnNxbCcsXG4gICAgICBydW46IGBcbmZhaWxlZD0wXG4jIExlZnRob29rIGV4cGFuZHMge3N0YWdlZF9maWxlc30gYXMgc2hlbGwtZXNjYXBlZCBhcmdzLCBzbyBwYXRocyB3aXRoIHNwYWNlcyBzdGF5IGludGFjdC5cbmZvciBmaWxlIGluIHtzdGFnZWRfZmlsZXN9OyBkb1xuICBpZiBncmVwIC1xICdXYXJuaW5nczonIFwiJGZpbGVcIjsgdGhlblxuICAgIGVjaG8gXCJNaWdyYXRpb24gU1FMIGZpbGUgKCRmaWxlKSBjb250YWlucyB3YXJuaW5ncyEgUGxlYXNlIHNvbHZlIHRoZSB3YXJuaW5ncyBhbmQgY29tbWl0IGFnYWluLlwiXG4gICAgZmFpbGVkPTFcbiAgZmlcbmRvbmVcbmV4aXQgXCIkZmFpbGVkXCJcbmAudHJpbSgpLFxuICAgIH0sXG4gIF0sXG59O1xuXG5jb25zdCBzY3JpcHRzID0ge1xuICBwb3N0TWVyZ2U6IGBcbiMhL2Jpbi9iYXNoXG5cbmNoYW5nZWRfZmlsZXM9XCIkKGdpdCBkaWZmLXRyZWUgLXIgLS1uYW1lLW9ubHkgLS1uby1jb21taXQtaWQgT1JJR19IRUFEIEhFQUQpXCJcblxucnVuX2lmX2NoYW5nZWQoKSB7XG4gIGlmIGVjaG8gXCIkY2hhbmdlZF9maWxlc1wiIHwgZ3JlcCAtLXF1aWV0IC1FIFwiJDFcIjsgdGhlblxuICAgIGV2YWwgXCIkMlwiXG4gIGZpXG59XG5gLnRyaW0oKSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUxlZnRob29rVXBkYXRpbmdQYWNrYWdlSnNvbihjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUxlZnRob29rVXBkYXRpbmdQYWNrYWdlSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBjb3JlKGNvbmZpZyk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmxlZnRob29rJyk7XG4gIGNvbnN0IGh1c2t5RGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5odXNreScpO1xuICBjb25zdCBoYXNIdXNreURpciA9IGZzLmV4aXN0c1N5bmMoaHVza3lEaXJQYXRoKTtcbiAgY29uc3QgeyBsaW50IH0gPSBnZW5lcmF0ZVNjcmlwdHMoY29uZmlnLCB7fSk7XG4gIGNvbnN0IHNldHRpbmdzOiBQYXJ0aWFsPExlZnRob29rU2V0dGluZ3M+ID0ge1xuICAgIC4uLmJhc2VTZXR0aW5ncyxcbiAgICAncHJlLWNvbW1pdCc6IHtcbiAgICAgIGpvYnM6IGdldFByZUNvbW1pdEpvYnMoY29uZmlnKSxcbiAgICB9LFxuICB9O1xuICBpZiAoIWxpbnQpIHtcbiAgICBkZWxldGUgc2V0dGluZ3NbJ3ByZS1wdXNoJ107XG4gIH1cbiAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgIGZzLnByb21pc2VzLndyaXRlRmlsZShcbiAgICAgIHBhdGguam9pbihjb25maWcuZGlyUGF0aCwgJ2xlZnRob29rLnltbCcpLFxuICAgICAgeWFtbC5kdW1wKHNldHRpbmdzLCB7XG4gICAgICAgIGxpbmVXaWR0aDogLTEsXG4gICAgICAgIG5vQ29tcGF0TW9kZTogdHJ1ZSxcbiAgICAgICAgc3R5bGVzOiB7XG4gICAgICAgICAgJyEhbnVsbCc6ICdlbXB0eScsXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICksXG4gICAgZnMucHJvbWlzZXMucm0oZGlyUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pLFxuICBdKTtcbiAgaWYgKGhhc0h1c2t5RGlyKSB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgZnMucHJvbWlzZXMucm0oaHVza3lEaXJQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSksXG4gICAgICBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuaHVza3lyYy5qc29uJyksIHsgZm9yY2U6IHRydWUgfSksXG4gICAgXSk7XG4gICAgc3Bhd25TeW5jKCdnaXQnLCBbJ2NvbmZpZycsICctLXVuc2V0JywgJ2NvcmUuaG9va3NQYXRoJ10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgfVxuXG4gIGlmIChsaW50KSB7XG4gICAgY29uc3QgcHJlUHVzaCA9IGdldFByZVB1c2hTY3JpcHQoY29uZmlnKTtcbiAgICBmcy5ta2RpclN5bmMocGF0aC5qb2luKGRpclBhdGgsICdwcmUtcHVzaCcpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKGRpclBhdGgsICdwcmUtcHVzaCcsICdjaGVjay5zaCcpLCBwcmVQdXNoICsgJ1xcbicsIHtcbiAgICAgIG1vZGU6IDBvNzU1LFxuICAgIH0pO1xuICB9XG4gIGNvbnN0IHBvc3RNZXJnZUNvbW1hbmQgPSBgJHtzY3JpcHRzLnBvc3RNZXJnZX1cXG5cXG4ke2dlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMoY29uZmlnKS5qb2luKCdcXG4nKX1cXG5gO1xuICBmcy5ta2RpclN5bmMocGF0aC5qb2luKGRpclBhdGgsICdwb3N0LW1lcmdlJyksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwb3N0LW1lcmdlJywgJ3ByZXBhcmUuc2gnKSwgcG9zdE1lcmdlQ29tbWFuZCwge1xuICAgIG1vZGU6IDBvNzU1LFxuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0UHJlUHVzaFNjcmlwdChjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBsZXQgbGludENvbW1hbmQ6IHN0cmluZztcbiAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgIC8vIEJ1biByZXBvcyByZWNlaXZlIHdiIGFzIHBhcnQgb2Ygd2JmeSdzIG1hbmFnZWQgdG9vbGNoYWluLCBzbyBnZW5lcmF0ZSB0aGVcbiAgICAvLyBmaW5hbCBob29rIGNvbW1hbmQgb24gdGhlIGZpcnN0IHJ1biBpbnN0ZWFkIG9mIGNoYW5naW5nIGl0IG9uIHRoZSBzZWNvbmQuXG4gICAgbGludENvbW1hbmQgPSAnYnVuIC0tYnVuIHdiIGxpbnQnO1xuICB9IGVsc2Uge1xuICAgIGxpbnRDb21tYW5kID0gY29uZmlnLmRlcGVuZGluZy53YiA/ICd5YXJuIHdiIGxpbnQnIDogJ3lhcm4gcnVuIGxpbnQnO1xuICB9XG4gIGNvbnN0IHF1aWV0TGludENvbW1hbmQgPSBgJHtsaW50Q29tbWFuZH0gLS1xdWlldGA7XG4gIC8vIE5vIHNlcGFyYXRlIHR5cGVjaGVjayBzdGVwIG5lZWRlZCDigJQgdGhlIGxpbnQgY29tbWFuZCBhbHJlYWR5IGluY2x1ZGVzIHR5cGVjaGVja2luZy5cbiAgaWYgKGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJykpIHtcbiAgICByZXR1cm4gYFxuIyEvYmluL2Jhc2hcblxuaWYgWyAkKGdpdCBicmFuY2ggLS1zaG93LWN1cnJlbnQpID0gXCJtYWluXCIgXSAmJiBbICQoZ2l0IGNvbmZpZyB1c2VyLmVtYWlsKSAhPSBcImV4a2F6dXVAZ21haWwuY29tXCIgXTsgdGhlblxuICBlY2hvIFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCJcbiAgZWNobyBcIioqKiBEb24ndCBwdXNoIG1haW4gYnJhbmNoIGRpcmVjdGx5LiBVc2UgUFIhICoqKlwiXG4gIGVjaG8gXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIlxuICBleGl0IDFcbmZpXG5cbiR7cXVpZXRMaW50Q29tbWFuZH1cbmAudHJpbSgpO1xuICB9XG4gIHJldHVybiBxdWlldExpbnRDb21tYW5kO1xufVxuXG5mdW5jdGlvbiBnZXRQcmVDb21taXRKb2JzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IExlZnRob29rSm9iW10ge1xuICByZXR1cm4gcHJlQ29tbWl0U2V0dGluZ3Muam9icy5tYXAoKGpvYikgPT5cbiAgICBqb2IubmFtZSA9PT0gJ2NsZWFudXAnXG4gICAgICA/IHtcbiAgICAgICAgICAuLi5qb2IsXG4gICAgICAgICAgZ2xvYjogZ2V0Q2xlYW51cEdsb2JzKGNvbmZpZyksXG4gICAgICAgICAgcnVuOiBnZXRDbGVhbnVwQ29tbWFuZChjb25maWcpLFxuICAgICAgICB9XG4gICAgICA6IGpvYlxuICApO1xufVxuXG5mdW5jdGlvbiBnZXRDbGVhbnVwR2xvYnMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgLy8gTGV0IGB3YiBsaW50IC0tZm9ybWF0YCBkZWNpZGUgd2hldGhlciBQcmV0dGllciBpcyBhdmFpbGFibGU7IHRoZSBob29rXG4gIC8vIHN0aWxsIG5lZWRzIHRvIHRyaWdnZXIgd2hlbiBhZGRpbmcgdGhlIGZpcnN0IHByZXR0aWVyLW9ubHkgZmlsZS5cbiAgY29uc3Qgc3VwcG9ydGVkRXh0ZW5zaW9ucyA9XG4gICAgY29uZmlnLmlzQnVuIHx8IGNvbmZpZy5kZXBlbmRpbmcud2IgfHwgZG9lc0NvbnRhaW5KYXZhKGNvbmZpZykgPyBbLi4uZXh0ZW5zaW9ucy5wcmV0dGllck9ubHldIDogW107XG4gIGlmIChkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpKSB7XG4gICAgc3VwcG9ydGVkRXh0ZW5zaW9ucy5wdXNoKC4uLmV4dGVuc2lvbnMub3hmbXQsIC4uLmV4dGVuc2lvbnMub3hsaW50KTtcbiAgfVxuICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jayB8fCBjb25maWcuZG9lc0NvbnRhaW5VdkxvY2spIHtcbiAgICBzdXBwb3J0ZWRFeHRlbnNpb25zLnB1c2goJ3B5Jyk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgc3VwcG9ydGVkRXh0ZW5zaW9ucy5wdXNoKCdkYXJ0Jyk7XG4gIH1cbiAgY29uc3QgZmlsdGVyZWRFeHRlbnNpb25zID0gWy4uLm5ldyBTZXQoc3VwcG9ydGVkRXh0ZW5zaW9ucyldLnRvU29ydGVkKCk7XG4gIHJldHVybiBgKiovKi57JHtmaWx0ZXJlZEV4dGVuc2lvbnMuam9pbignLCcpfX1gO1xufVxuXG5mdW5jdGlvbiBnZXRDbGVhbnVwQ29tbWFuZChjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBpZiAoaGFzTG9jYWxXYldvcmtzcGFjZShjb25maWcpKSB7XG4gICAgcmV0dXJuIFN0cmluZy5yYXdgXG4jIExlZnRob29rIGV4cGFuZHMge3N0YWdlZF9maWxlc30gYXMgc2hlbGwtZXNjYXBlZCBhcmdzLCBzbyBwYXRocyB3aXRoIHNwYWNlcyBzdGF5IGludGFjdC5cbnlhcm4gd29ya3NwYWNlIEB3aWxsYm9vc3Rlci93YiBzdGFydCAtLXdvcmtpbmctZGlyIFwiJChnaXQgcmV2LXBhcnNlIC0tc2hvdy10b3BsZXZlbClcIiBsaW50IC0tZml4IC0tZm9ybWF0IC0tIHtzdGFnZWRfZmlsZXN9XG5gLnRyaW0oKTtcbiAgfVxuICAvLyBQeXRob24tb25seSBCdW4gcmVwb3MgaW5zdGFsbCB3YiBmb3Igc2hhcmVkIHNjcmlwdHMgYnV0IG5vdCBPeGxpbnQsIHNvXG4gIC8vIHN0YWdlZC1maWxlIGhvb2tzIG11c3QgdXNlIHRoZSBsYW5ndWFnZS1zcGVjaWZpYyBmb3JtYXR0ZXIgcGF0aCBiZWxvdy5cbiAgY29uc3QgY2FuVXNlV2JGb3JTdGFnZWRGaWxlcyA9IGRvZXNDb250YWluSnNPclRzKGNvbmZpZykgfHwgZG9lc0NvbnRhaW5KYXZhKGNvbmZpZyk7XG4gIGlmICgoY29uZmlnLmlzQnVuIHx8IGNvbmZpZy5kZXBlbmRpbmcud2IpICYmIGNhblVzZVdiRm9yU3RhZ2VkRmlsZXMpIHtcbiAgICByZXR1cm4gYFxuIyBMZWZ0aG9vayBleHBhbmRzIHtzdGFnZWRfZmlsZXN9IGFzIHNoZWxsLWVzY2FwZWQgYXJncywgc28gcGF0aHMgd2l0aCBzcGFjZXMgc3RheSBpbnRhY3QuXG4ke2NvbmZpZy5pc0J1biA/ICdidW4gLS1idW4gd2InIDogJ3lhcm4gd2InfSBsaW50IC0tZml4IC0tZm9ybWF0IC0tIHtzdGFnZWRfZmlsZXN9XG5gLnRyaW0oKTtcbiAgfVxuXG4gIGNvbnN0IG94bGludFBhdHRlcm4gPSBleHRlbnNpb25zLm94bGludC5tYXAoKGV4dGVuc2lvbikgPT4gU3RyaW5nLnJhd2BcXC4ke2V4dGVuc2lvbn0kYCkuam9pbignfCcpO1xuICBjb25zdCBveGZtdFBhdHRlcm4gPSBleHRlbnNpb25zLm94Zm10Lm1hcCgoZXh0ZW5zaW9uKSA9PiBTdHJpbmcucmF3YFxcLiR7ZXh0ZW5zaW9ufSRgKS5qb2luKCd8Jyk7XG4gIGNvbnN0IHByZXR0aWVyUGF0dGVybiA9IGV4dGVuc2lvbnMucHJldHRpZXJPbmx5Lm1hcCgoZXh0ZW5zaW9uKSA9PiBTdHJpbmcucmF3YFxcLiR7ZXh0ZW5zaW9ufSRgKS5qb2luKCd8Jyk7XG4gIGNvbnN0IGhhc0pzT3JUcyA9IGRvZXNDb250YWluSnNPclRzKGNvbmZpZyk7XG4gIGNvbnN0IGhhc0phdmEgPSBkb2VzQ29udGFpbkphdmEoY29uZmlnKTtcblxuICByZXR1cm4gU3RyaW5nLnJhd2BcbiMgTGVmdGhvb2sgZXhwYW5kcyB7c3RhZ2VkX2ZpbGVzfSBhcyBzaGVsbC1lc2NhcGVkIGFyZ3MsIHNvIHBhdGhzIHdpdGggc3BhY2VzIHN0YXkgaW50YWN0LlxuJHtoYXNKc09yVHMgPyBTdHJpbmcucmF3YG94bGludF9maWxlcz1cIiQocHJpbnRmICclc1xcbicge3N0YWdlZF9maWxlc30gfCBncmVwIC1FICcoJHtveGxpbnRQYXR0ZXJufSknIHx8IHRydWUpXCJgIDogJyd9XG4ke2hhc0pzT3JUcyA/IFN0cmluZy5yYXdgb3hmbXRfZmlsZXM9XCIkKHByaW50ZiAnJXNcXG4nIHtzdGFnZWRfZmlsZXN9IHwgZ3JlcCAtRSAnKCR7b3hmbXRQYXR0ZXJufSknIHwgZ3JlcCAtdiAtRSAnKF58LylwYWNrYWdlXFwuanNvbiQnIHx8IHRydWUpXCJgIDogJyd9XG4ke2hhc0phdmEgPyBTdHJpbmcucmF3YHByZXR0aWVyX2ZpbGVzPVwiJChwcmludGYgJyVzXFxuJyB7c3RhZ2VkX2ZpbGVzfSB8IGdyZXAgLUUgJygke3ByZXR0aWVyUGF0dGVybn0pJyB8fCB0cnVlKVwiYCA6ICcnfVxucGFja2FnZV9qc29uX2ZpbGVzPVwiJChwcmludGYgJyVzXFxuJyB7c3RhZ2VkX2ZpbGVzfSB8IGdyZXAgLUUgJyhefC8pcGFja2FnZVxcLmpzb24kJyB8fCB0cnVlKVwiXG4ke2hhc1B5dGhvblBhY2thZ2VNYW5hZ2VyKGNvbmZpZykgPyBTdHJpbmcucmF3YHB5dGhvbl9maWxlcz1cIiQocHJpbnRmICclc1xcbicge3N0YWdlZF9maWxlc30gfCBncmVwIC1FICdcXC5weSQnIHx8IHRydWUpXCJgIDogJyd9XG4ke2NvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sID8gU3RyaW5nLnJhd2BkYXJ0X2ZpbGVzPVwiJChwcmludGYgJyVzXFxuJyB7c3RhZ2VkX2ZpbGVzfSB8IGdyZXAgLUUgJ1xcLmRhcnQkJyB8IGdyZXAgLXYgJ2dlbmVyYXRlZCcgfCBncmVwIC12ICdcXC5mcmVlemVkXFwuZGFydCQnIHwgZ3JlcCAtdiAnXFwuZ1xcLmRhcnQkJyB8fCB0cnVlKVwiYCA6ICcnfVxuXG4ke1xuICBoYXNKc09yVHNcbiAgICA/IFN0cmluZy5yYXdgXG5pZiBbIC1uIFwiJG94Zm10X2ZpbGVzXCIgXTsgdGhlblxuICBub2RlIG5vZGVfbW9kdWxlcy8uYmluL294Zm10IC0td3JpdGUgLS1uby1lcnJvci1vbi11bm1hdGNoZWQtcGF0dGVybiAnISoqL3BhY2thZ2UuanNvbicgJG94Zm10X2ZpbGVzXG5maVxuYFxuICAgIDogJydcbn1cbiR7XG4gIGhhc0phdmFcbiAgICA/IFN0cmluZy5yYXdgaWYgWyAtbiBcIiRwcmV0dGllcl9maWxlc1wiIF07IHRoZW5cbiAgbm9kZSBub2RlX21vZHVsZXMvLmJpbi9wcmV0dGllciAtLWNhY2hlIC0td3JpdGUgLS1pZ25vcmUtdW5rbm93biAtLSAkcHJldHRpZXJfZmlsZXNcbmZpYFxuICAgIDogJydcbn1cbiR7XG4gIGhhc0pzT3JUc1xuICAgID8gU3RyaW5nLnJhd2BcbmlmIFsgLW4gXCIkb3hsaW50X2ZpbGVzXCIgXTsgdGhlblxuICBub2RlIG5vZGVfbW9kdWxlcy8uYmluL294bGludCAtLWZpeCAkb3hsaW50X2ZpbGVzXG5maVxuYFxuICAgIDogJydcbn1cbmlmIFsgLW4gXCIkcGFja2FnZV9qc29uX2ZpbGVzXCIgXTsgdGhlblxuICBub2RlIG5vZGVfbW9kdWxlcy8uYmluL3NvcnQtcGFja2FnZS1qc29uIC0tICRwYWNrYWdlX2pzb25fZmlsZXNcbmZpXG4ke1xuICBoYXNQeXRob25QYWNrYWdlTWFuYWdlcihjb25maWcpXG4gICAgPyBgaWYgWyAtbiBcIiRweXRob25fZmlsZXNcIiBdOyB0aGVuXG4gICR7Z2V0UHl0aG9uUnVubmVyKGNvbmZpZyl9IGlzb3J0IC0tcHJvZmlsZSBibGFjayAtLWZpbHRlci1maWxlcyAkcHl0aG9uX2ZpbGVzXG4gICR7Z2V0UHl0aG9uUnVubmVyKGNvbmZpZyl9IGJsYWNrICRweXRob25fZmlsZXNcbiAgJHtnZXRQeXRob25SdW5uZXIoY29uZmlnKX0gZmxha2U4ICRweXRob25fZmlsZXNcbmZpYFxuICAgIDogJydcbn1cbiR7XG4gIGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sXG4gICAgPyBgaWYgWyAtbiBcIiRkYXJ0X2ZpbGVzXCIgXTsgdGhlblxuICBkYXJ0IGZvcm1hdCAkZGFydF9maWxlc1xuZmlgXG4gICAgOiAnJ1xufVxuYC50cmltKCk7XG59XG5cbmZ1bmN0aW9uIGhhc0xvY2FsV2JXb3Jrc3BhY2UoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIGlmICghY29uZmlnLmlzUm9vdCkgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IGxvY2FsV2JQYWNrYWdlSnNvblBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdwYWNrYWdlcycsICd3YicsICdwYWNrYWdlLmpzb24nKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGxvY2FsV2JQYWNrYWdlSnNvblBhdGgpKSByZXR1cm4gZmFsc2U7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKGxvY2FsV2JQYWNrYWdlSnNvblBhdGgsICd1dGY4JykpIGFzIHsgbmFtZT86IHN0cmluZyB9O1xuICAgIHJldHVybiBwYWNrYWdlSnNvbi5uYW1lID09PSAnQHdpbGxib29zdGVyL3diJztcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nW10ge1xuICBjb25zdCBwb3N0TWVyZ2VDb21tYW5kczogc3RyaW5nW10gPSBbXTtcbiAgaWYgKGNvbmZpZy5oYXNWZXJzaW9uU2V0dGluZ3MpIHtcbiAgICBjb25zdCB0b29sc0NoYW5nZWRQYXR0ZXJuID0gU3RyaW5nLnJhd2AobWlzZVxcLnRvbWx8XFwubWlzZVxcLnRvbWx8XFwudG9vbC12ZXJzaW9uc3xcXC4uKy12ZXJzaW9uKWA7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiJHt0b29sc0NoYW5nZWRQYXR0ZXJufVwiIFwibWlzZSBpbnN0YWxsXCJgKTtcbiAgfVxuICBjb25zdCBpbnN0YWxsQ29tbWFuZCA9IGNvbmZpZy5pc0J1biA/ICdidW4gaW5zdGFsbCcgOiAneWFybic7XG4gIGNvbnN0IHJtTmV4dERpcmVjdG9yeSA9IGNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHwgY29uZmlnLmRlcGVuZGluZy5uZXh0ID8gJyAmJiBybSAtUmYgLm5leHQnIDogJyc7XG4gIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcInBhY2thZ2VcXC5qc29uXCIgXCIke2luc3RhbGxDb21tYW5kfSR7cm1OZXh0RGlyZWN0b3J5fVwiYCk7XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrKSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwicG9ldHJ5XFwubG9ja1wiIFwicG9ldHJ5IGluc3RhbGxcImApO1xuICB9XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5VdkxvY2spIHtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCJ1dlxcLmxvY2tcIiBcInV2IHN5bmMgLS1mcm96ZW5cImApO1xuICB9XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6KSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIuKlxcLnByaXNtYVwiIFwibm9kZSBub2RlX21vZHVsZXMvLmJpbi9ibGl0eiBwcmlzbWEgbWlncmF0ZSBkZXBsb3lcImAsXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiLipcXC5wcmlzbWFcIiBcIm5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vYmxpdHogcHJpc21hIGdlbmVyYXRlXCJgLFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIi4qXFwucHJpc21hXCIgXCJub2RlIG5vZGVfbW9kdWxlcy8uYmluL2JsaXR6IGNvZGVnZW5cImBcbiAgICApO1xuICB9IGVsc2UgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHJpc21hKSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIuKlxcLnByaXNtYVwiIFwibm9kZSBub2RlX21vZHVsZXMvLmJpbi9kb3RlbnYgLWMgZGV2ZWxvcG1lbnQgLS0gbm9kZSBub2RlX21vZHVsZXMvLmJpbi9wcmlzbWEgbWlncmF0ZSBkZXBsb3lcImAsXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiLipcXC5wcmlzbWFcIiBcIm5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vZG90ZW52IC1jIGRldmVsb3BtZW50IC0tIG5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vcHJpc21hIGdlbmVyYXRlXCJgXG4gICAgKTtcbiAgfVxuICBjb25zdCBnZW5JMThuVHNDb21tYW5kID0gZ2V0R2VuSTE4blRzQ29tbWFuZChjb25maWcsIGNvbmZpZy5wYWNrYWdlSnNvbj8uc2NyaXB0cyk7XG4gIGlmIChnZW5JMThuVHNDb21tYW5kKSB7XG4gICAgLy8gZ2VuLWkxOG4tdHMgb3V0cHV0cyBhcmUgY29tbW9ubHkgaWdub3JlZCwgc28gcG9zdC1tZXJnZSByZWdlbmVyYXRlcyB0aGVtIGFmdGVyIHB1bGxlZCByZXNvdXJjZSBjaGFuZ2VzLlxuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIihefC8paTE4bi8uKlxcLmpzb24kXCIgXCIke2dlbkkxOG5Uc0NvbW1hbmR9XCJgKTtcbiAgfVxuICByZXR1cm4gcG9zdE1lcmdlQ29tbWFuZHM7XG59XG5cbmZ1bmN0aW9uIGhhc1B5dGhvblBhY2thZ2VNYW5hZ2VyKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jayB8fCBjb25maWcuZG9lc0NvbnRhaW5VdkxvY2s7XG59XG5cbmZ1bmN0aW9uIGdldFB5dGhvblJ1bm5lcihjb25maWc6IFBhY2thZ2VDb25maWcpOiAncG9ldHJ5IHJ1bicgfCAndXYgcnVuJyB7XG4gIHJldHVybiBjb25maWcuZG9lc0NvbnRhaW5VdkxvY2sgPyAndXYgcnVuJyA6ICdwb2V0cnkgcnVuJztcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUxpbnRzdGFnZWRyYyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUxpbnRzdGFnZWRyYycsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oYCR7Y29uZmlnLmRpclBhdGh9Ly5saW50c3RhZ2VkcmMuY2pzYCwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oYCR7Y29uZmlnLmRpclBhdGh9Ly5saW50c3RhZ2VkcmMuanNgLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShgJHtjb25maWcuZGlyUGF0aH0vLmxpbnRzdGFnZWRyYy5qc29uYCwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgXSk7XG4gIH0pO1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUNvbmZpZ0NvbnRlbnQoY29udGVudDogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGNvbnRlbnQ/LnRyaW0oKTtcbn1cbiIsImV4cG9ydCB0eXBlIENvbmZpZ0Jsb2NrTmFtZSA9ICdiYXNlJyB8ICdleHBvcnQnO1xuXG5pbnRlcmZhY2UgTWFuYWdlZENvbmZpZ0Jsb2Nrc09wdGlvbnMge1xuICBibG9ja05hbWVzOiByZWFkb25seSBDb25maWdCbG9ja05hbWVbXTtcbiAgbWFya2VyUHJlZml4OiBzdHJpbmc7XG4gIHRvb2xOYW1lOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBHZXRDb25maWdDb250ZW50T3B0aW9ucyB7XG4gIGRlc2lyZWRDb250ZW50OiBzdHJpbmc7XG4gIGV4aXN0aW5nQ29udGVudDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBmaWxlUGF0aDogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgTWFuYWdlZENvbmZpZ0Jsb2NrcyB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYmxvY2tOYW1lczogcmVhZG9ubHkgQ29uZmlnQmxvY2tOYW1lW107XG5cbiAgcHJpdmF0ZSByZWFkb25seSBtYXJrZXJQcmVmaXg6IHN0cmluZztcblxuICBwcml2YXRlIHJlYWRvbmx5IHRvb2xOYW1lOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogTWFuYWdlZENvbmZpZ0Jsb2Nrc09wdGlvbnMpIHtcbiAgICB0aGlzLmJsb2NrTmFtZXMgPSBvcHRpb25zLmJsb2NrTmFtZXM7XG4gICAgdGhpcy5tYXJrZXJQcmVmaXggPSBvcHRpb25zLm1hcmtlclByZWZpeDtcbiAgICB0aGlzLnRvb2xOYW1lID0gb3B0aW9ucy50b29sTmFtZTtcbiAgfVxuXG4gIGdldENvbmZpZ0NvbnRlbnQob3B0aW9uczogR2V0Q29uZmlnQ29udGVudE9wdGlvbnMpOiBzdHJpbmcge1xuICAgIGlmICghb3B0aW9ucy5leGlzdGluZ0NvbnRlbnQpIHJldHVybiBvcHRpb25zLmRlc2lyZWRDb250ZW50O1xuICAgIGlmICh0aGlzLmhhc01hbmFnZWRCbG9ja3Mob3B0aW9ucy5leGlzdGluZ0NvbnRlbnQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXBsYWNlTWFuYWdlZEJsb2NrcyhvcHRpb25zLmV4aXN0aW5nQ29udGVudCwgb3B0aW9ucy5kZXNpcmVkQ29udGVudCwgb3B0aW9ucy5maWxlUGF0aCk7XG4gICAgfVxuICAgIHJldHVybiBvcHRpb25zLmRlc2lyZWRDb250ZW50O1xuICB9XG5cbiAgZ2V0QmxvY2soYmxvY2tOYW1lOiBDb25maWdCbG9ja05hbWUsIGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuZ2V0U3RhcnRNYXJrZXIoYmxvY2tOYW1lKX1cbiR7Y29udGVudH1cbiR7dGhpcy5nZXRFbmRNYXJrZXIoYmxvY2tOYW1lKX1gO1xuICB9XG5cbiAgaGFzTWFuYWdlZEJsb2Nrcyhjb250ZW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5ibG9ja05hbWVzLnNvbWUoKGJsb2NrTmFtZSkgPT4gY29udGVudC5pbmNsdWRlcyh0aGlzLmdldFN0YXJ0TWFya2VyKGJsb2NrTmFtZSkpKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVwbGFjZU1hbmFnZWRCbG9ja3MoZXhpc3RpbmdDb250ZW50OiBzdHJpbmcsIGRlc2lyZWRDb250ZW50OiBzdHJpbmcsIGZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCBjb250ZW50ID0gZXhpc3RpbmdDb250ZW50O1xuICAgIGZvciAoY29uc3QgYmxvY2tOYW1lIG9mIHRoaXMuYmxvY2tOYW1lcykge1xuICAgICAgY29uc3QgcmVwbGFjZW1lbnQgPSB0aGlzLmV4dHJhY3RNYW5hZ2VkQmxvY2soZGVzaXJlZENvbnRlbnQsIGJsb2NrTmFtZSk7XG4gICAgICBpZiAoIXJlcGxhY2VtZW50KSBjb250aW51ZTtcblxuICAgICAgY29uc3QgbmV4dENvbnRlbnQgPSB0aGlzLnJlcGxhY2VNYW5hZ2VkQmxvY2soY29udGVudCwgYmxvY2tOYW1lLCByZXBsYWNlbWVudCk7XG4gICAgICBpZiAoIW5leHRDb250ZW50KSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCB1cGRhdGluZyBpbmNvbXBsZXRlICR7YmxvY2tOYW1lfSBibG9jayBpbiAke3RoaXMudG9vbE5hbWV9IGNvbmZpZzogJHtmaWxlUGF0aH1gKTtcbiAgICAgICAgcmV0dXJuIGV4aXN0aW5nQ29udGVudDtcbiAgICAgIH1cbiAgICAgIGNvbnRlbnQgPSBuZXh0Q29udGVudDtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRlbnQ7XG4gIH1cblxuICBwcml2YXRlIGV4dHJhY3RNYW5hZ2VkQmxvY2soY29udGVudDogc3RyaW5nLCBibG9ja05hbWU6IENvbmZpZ0Jsb2NrTmFtZSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TWFuYWdlZEJsb2NrUmVnRXhwKGJsb2NrTmFtZSkuZXhlYyhjb250ZW50KT8uWzBdO1xuICB9XG5cbiAgcHJpdmF0ZSByZXBsYWNlTWFuYWdlZEJsb2NrKGNvbnRlbnQ6IHN0cmluZywgYmxvY2tOYW1lOiBDb25maWdCbG9ja05hbWUsIHJlcGxhY2VtZW50OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHBhdHRlcm4gPSB0aGlzLmdldE1hbmFnZWRCbG9ja1JlZ0V4cChibG9ja05hbWUpO1xuICAgIGlmICghcGF0dGVybi50ZXN0KGNvbnRlbnQpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiBjb250ZW50LnJlcGxhY2UocGF0dGVybiwgcmVwbGFjZW1lbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRNYW5hZ2VkQmxvY2tSZWdFeHAoYmxvY2tOYW1lOiBDb25maWdCbG9ja05hbWUpOiBSZWdFeHAge1xuICAgIHJldHVybiBuZXcgUmVnRXhwKFxuICAgICAgYCR7ZXNjYXBlUmVnRXhwKHRoaXMuZ2V0U3RhcnRNYXJrZXIoYmxvY2tOYW1lKSl9W1xcXFxzXFxcXFNdKj8ke2VzY2FwZVJlZ0V4cCh0aGlzLmdldEVuZE1hcmtlcihibG9ja05hbWUpKX1gXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U3RhcnRNYXJrZXIoYmxvY2tOYW1lOiBDb25maWdCbG9ja05hbWUpOiBzdHJpbmcge1xuICAgIHJldHVybiBgLy8gd2JmeTpzdGFydCAke3RoaXMubWFya2VyUHJlZml4fS0ke2Jsb2NrTmFtZX1gO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRFbmRNYXJrZXIoYmxvY2tOYW1lOiBDb25maWdCbG9ja05hbWUpOiBzdHJpbmcge1xuICAgIHJldHVybiBgLy8gd2JmeTplbmQgJHt0aGlzLm1hcmtlclByZWZpeH0tJHtibG9ja05hbWV9YDtcbiAgfVxufVxuXG5mdW5jdGlvbiBlc2NhcGVSZWdFeHAodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB2YWx1ZS5yZXBsYWNlQWxsKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgU3RyaW5nLnJhd2BcXCQmYCk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmltcG9ydCB7IG5vcm1hbGl6ZUNvbmZpZ0NvbnRlbnQgfSBmcm9tICcuL2NvbmZpZ0NvbnRlbnQuanMnO1xuaW1wb3J0IHsgTWFuYWdlZENvbmZpZ0Jsb2NrcyB9IGZyb20gJy4vbWFuYWdlZENvbmZpZ0Jsb2NrLmpzJztcblxuY29uc3QgbWFuYWdlZENvbmZpZ0Jsb2NrcyA9IG5ldyBNYW5hZ2VkQ29uZmlnQmxvY2tzKHtcbiAgYmxvY2tOYW1lczogWydiYXNlJywgJ2V4cG9ydCddLFxuICBtYXJrZXJQcmVmaXg6ICdveGZtdCcsXG4gIHRvb2xOYW1lOiAnb3hmbXQnLFxufSk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZU94Zm10Q29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlT3hmbXRDb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgbGVnYWN5SnNvbkNvbmZpZ1BhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcub3hmbXRyYy5qc29uJyk7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdveGZtdC5jb25maWcudHMnKTtcbiAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoKTtcbiAgICBjb25zdCBkZXNpcmVkQ29udGVudCA9IG1hbmFnZWRDb25maWdCbG9ja3MuZ2V0Q29uZmlnQ29udGVudCh7XG4gICAgICBkZXNpcmVkQ29udGVudDogZ2V0Q29uZmlnQ29udGVudChjb25maWcpLFxuICAgICAgZXhpc3RpbmdDb250ZW50LFxuICAgICAgZmlsZVBhdGgsXG4gICAgfSk7XG4gICAgY29uc3QgcHJvbWlzZXMgPSBbcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKGxlZ2FjeUpzb25Db25maWdQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKV07XG4gICAgaWYgKG5vcm1hbGl6ZUNvbmZpZ0NvbnRlbnQoZXhpc3RpbmdDb250ZW50KSAhPT0gbm9ybWFsaXplQ29uZmlnQ29udGVudChkZXNpcmVkQ29udGVudCkpIHtcbiAgICAgIHByb21pc2VzLnB1c2gocHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGRlc2lyZWRDb250ZW50KSkpO1xuICAgIH1cbiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRDb25maWdDb250ZW50KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIC8vIENvbW1vbkpTIHBhY2thZ2VzIG5lZWQgcmVxdWlyZS9tb2R1bGUuZXhwb3J0cyBoZXJlOiBveGZtdCBjb25maWcgZmlsZXMgYXJlXG4gIC8vIG9ubHkgYXV0by1kaXNjb3ZlcmVkIGFzIC50cywgYW5kIHRoZSBzaGFyZWQgY29uZmlnIHBhY2thZ2UgaXMgRVNNLW9ubHkuXG4gIGlmICghY29uZmlnLmlzRXNtUGFja2FnZSkge1xuICAgIHJldHVybiBgJHttYW5hZ2VkQ29uZmlnQmxvY2tzLmdldEJsb2NrKFxuICAgICAgJ2Jhc2UnLFxuICAgICAgYC8vIG94bGludC1kaXNhYmxlIHVuaWNvcm4vcHJlZmVyLW1vZHVsZSAtLSBPeGZtdCBjb25maWcgZmlsZXMgYXJlIG9ubHkgYXV0by1kaXNjb3ZlcmVkIGFzIC50cywgYW5kIENvbW1vbkpTIGF2b2lkcyBOb2RlIHR5cGVsZXNzIEVTTSB3YXJuaW5ncy5cbmNvbnN0IG94Zm10Q29uZmlnID0gcmVxdWlyZSgnQHdpbGxib29zdGVyL294Zm10LWNvbmZpZycpO1xuXG5jb25zdCBveGZtdFJlc29sdmVkQ29uZmlnID0gb3hmbXRDb25maWcuZGVmYXVsdCA/PyBveGZtdENvbmZpZztgXG4gICAgKX1cblxuJHttYW5hZ2VkQ29uZmlnQmxvY2tzLmdldEJsb2NrKCdleHBvcnQnLCAnbW9kdWxlLmV4cG9ydHMgPSBveGZtdFJlc29sdmVkQ29uZmlnOycpfVxuYDtcbiAgfVxuXG4gIHJldHVybiBgJHttYW5hZ2VkQ29uZmlnQmxvY2tzLmdldEJsb2NrKCdiYXNlJywgXCJpbXBvcnQgY29uZmlnIGZyb20gJ0B3aWxsYm9vc3Rlci9veGZtdC1jb25maWcnO1wiKX1cblxuJHttYW5hZ2VkQ29uZmlnQmxvY2tzLmdldEJsb2NrKCdleHBvcnQnLCAnZXhwb3J0IGRlZmF1bHQgY29uZmlnOycpfVxuYDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IGlzUHVibGlzaGVkV2lsbGJvb3N0ZXJDb25maWdzUGFja2FnZSB9IGZyb20gJy4uL3V0aWxzL3dpbGxib29zdGVyQ29uZmlnc1V0aWwuanMnO1xuXG5pbXBvcnQgeyBub3JtYWxpemVDb25maWdDb250ZW50IH0gZnJvbSAnLi9jb25maWdDb250ZW50LmpzJztcbmltcG9ydCB7IE1hbmFnZWRDb25maWdCbG9ja3MgfSBmcm9tICcuL21hbmFnZWRDb25maWdCbG9jay5qcyc7XG5cbmNvbnN0IG1hbmFnZWRDb25maWdCbG9ja3MgPSBuZXcgTWFuYWdlZENvbmZpZ0Jsb2Nrcyh7XG4gIGJsb2NrTmFtZXM6IFsnYmFzZScsICdleHBvcnQnXSxcbiAgbWFya2VyUHJlZml4OiAnb3hsaW50JyxcbiAgdG9vbE5hbWU6ICdveGxpbnQnLFxufSk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZU94bGludENvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcsIF9yb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVPeGxpbnRDb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gd2lsbGJvb3N0ZXItY29uZmlncyBwdWJsaXNoZXMgY29uZmlnIGZpbGVzIGFzIHByb2R1Y3QgY29kZSwgc28gbWlncmF0aW9uXG4gICAgLy8gbXVzdCBub3QgcmVtb3ZlIHBhY2thZ2UtcHJvdmlkZWQgbGludGVyIHNldHRpbmdzLiBHZW5lcmF0ZWQgZmlsZXMgd2l0aFxuICAgIC8vIG1hbmFnZWQgYmxvY2tzIGFyZSBzdGlsbCBzYWZlIHRvIHVwZGF0ZS5cbiAgICBjb25zdCBzaG91bGRQcmVzZXJ2ZVB1Ymxpc2hlZExpbnRlckNvbmZpZyA9IGlzUHVibGlzaGVkV2lsbGJvb3N0ZXJDb25maWdzUGFja2FnZShjb25maWcpO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnb3hsaW50LmNvbmZpZy50cycpO1xuICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGgpO1xuICAgIGNvbnN0IHNob3VsZFByZXNlcnZlRXhpc3RpbmdDb250ZW50ID1cbiAgICAgIHNob3VsZFByZXNlcnZlUHVibGlzaGVkTGludGVyQ29uZmlnICYmIGV4aXN0aW5nQ29udGVudCAmJiAhbWFuYWdlZENvbmZpZ0Jsb2Nrcy5oYXNNYW5hZ2VkQmxvY2tzKGV4aXN0aW5nQ29udGVudCk7XG4gICAgY29uc3QgZGVzaXJlZENvbnRlbnQgPSBzaG91bGRQcmVzZXJ2ZUV4aXN0aW5nQ29udGVudFxuICAgICAgPyBleGlzdGluZ0NvbnRlbnRcbiAgICAgIDogcmVwbGFjZUxlZ2FjeUNvbmZpZ1JlZmVyZW5jZXMoXG4gICAgICAgICAgbWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRDb25maWdDb250ZW50KHtcbiAgICAgICAgICAgIGRlc2lyZWRDb250ZW50OiBnZXRDb25maWdDb250ZW50KGNvbmZpZyksXG4gICAgICAgICAgICBleGlzdGluZ0NvbnRlbnQsXG4gICAgICAgICAgICBmaWxlUGF0aCxcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuXG4gICAgY29uc3QgcHJvbWlzZXM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuICAgIGlmICghc2hvdWxkUHJlc2VydmVQdWJsaXNoZWRMaW50ZXJDb25maWcpIHtcbiAgICAgIHByb21pc2VzLnB1c2goXG4gICAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcub3hsaW50cmMuanNvbicpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2Jpb21lLmpzb24nKSwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdiaW9tZS5qc29uYycpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lc2xpbnRyYycpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lc2xpbnRyYy5janMnKSwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZXNsaW50cmMuanMnKSwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZXNsaW50cmMuanNvbicpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lc2xpbnRyYy55YW1sJyksIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmVzbGludHJjLnltbCcpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2VzbGludC5jb25maWcuY2pzJyksIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnZXNsaW50LmNvbmZpZy5qcycpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2VzbGludC5jb25maWcubWpzJyksIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnZXNsaW50LmNvbmZpZy50cycpLCB7IGZvcmNlOiB0cnVlIH0pKVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKG5vcm1hbGl6ZUNvbmZpZ0NvbnRlbnQoZXhpc3RpbmdDb250ZW50KSAhPT0gbm9ybWFsaXplQ29uZmlnQ29udGVudChkZXNpcmVkQ29udGVudCkpIHtcbiAgICAgIHByb21pc2VzLnB1c2gocHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGRlc2lyZWRDb250ZW50KSkpO1xuICAgIH1cbiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZXBsYWNlTGVnYWN5Q29uZmlnUmVmZXJlbmNlcyhjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gY29udGVudC5yZXBsYWNlQWxsKCdjb25maWcuJywgJ294bGludFJlc29sdmVkQ29uZmlnLicpO1xufVxuXG5mdW5jdGlvbiBnZXRDb25maWdDb250ZW50KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIGNvbnN0IGlzUm9vdENvbmZpZyA9IGNvbmZpZy5pc1Jvb3Q7XG5cbiAgLy8gRG8gbm90IGNvbGxhcHNlIHRoaXMgdG8gYSBzdGF0aWMgaW1wb3J0IGZvciBldmVyeSBwYWNrYWdlLiBDb21tb25KUyBwYWNrYWdlc1xuICAvLyB0eXBlLWNoZWNrIGF1dG8tZGlzY292ZXJlZCBveGxpbnQuY29uZmlnLnRzIGFzIENvbW1vbkpTLCBzbyBpbXBvcnRpbmcgdGhlIEVTTVxuICAvLyBAd2lsbGJvb3N0ZXIvb3hsaW50LWNvbmZpZyBwYWNrYWdlIHRyaWdnZXJzIFRTMTQ3OS4gS2VlcCB0aGlzIGluIHN5bmMgd2l0aFxuICAvLyBsaXRlcmFjeS10ZXN0J3MgZ2VuZXJhdGVkIGNvbmZpZyBwYXR0ZXJuLlxuICBpZiAoIWNvbmZpZy5pc0VzbVBhY2thZ2UpIHtcbiAgICByZXR1cm4gYCR7bWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRCbG9jayhcbiAgICAgICdiYXNlJyxcbiAgICAgIGAvLyBveGxpbnQtZGlzYWJsZSB1bmljb3JuL3ByZWZlci1tb2R1bGUgLS0gT3hsaW50IG9ubHkgYXV0by1kaXNjb3ZlcnMgLnRzIGNvbmZpZyBmaWxlcywgYW5kIENvbW1vbkpTIGF2b2lkcyBOb2RlIHR5cGVsZXNzIEVTTSB3YXJuaW5ncy5cbmNvbnN0IG94bGludEJhc2VDb25maWcgPSByZXF1aXJlKCdAd2lsbGJvb3N0ZXIvb3hsaW50LWNvbmZpZycpO1xuXG4ke2dldFJlc29sdmVkQ29uZmlnQ29udGVudCgnb3hsaW50QmFzZUNvbmZpZy5kZWZhdWx0ID8/IG94bGludEJhc2VDb25maWcnLCBpc1Jvb3RDb25maWcpfWBcbiAgICApfVxuXG4ke21hbmFnZWRDb25maWdCbG9ja3MuZ2V0QmxvY2soJ2V4cG9ydCcsICdtb2R1bGUuZXhwb3J0cyA9IG94bGludFJlc29sdmVkQ29uZmlnOycpfVxuYDtcbiAgfVxuXG4gIHJldHVybiBgJHttYW5hZ2VkQ29uZmlnQmxvY2tzLmdldEJsb2NrKFxuICAgICdiYXNlJyxcbiAgICBgaW1wb3J0IG94bGludEJhc2VDb25maWcgZnJvbSAnQHdpbGxib29zdGVyL294bGludC1jb25maWcnO1xuXG4ke2dldFJlc29sdmVkQ29uZmlnQ29udGVudCgnb3hsaW50QmFzZUNvbmZpZycsIGlzUm9vdENvbmZpZyl9YFxuICApfVxuXG4ke21hbmFnZWRDb25maWdCbG9ja3MuZ2V0QmxvY2soJ2V4cG9ydCcsICdleHBvcnQgZGVmYXVsdCBveGxpbnRSZXNvbHZlZENvbmZpZzsnKX1cbmA7XG59XG5cbmZ1bmN0aW9uIGdldFJlc29sdmVkQ29uZmlnQ29udGVudChiYXNlQ29uZmlnTmFtZTogc3RyaW5nLCBpc1Jvb3RDb25maWc6IGJvb2xlYW4pOiBzdHJpbmcge1xuICBpZiAoaXNSb290Q29uZmlnKSB7XG4gICAgcmV0dXJuIGBjb25zdCBveGxpbnRSZXNvbHZlZENvbmZpZyA9ICR7YmFzZUNvbmZpZ05hbWV9O2A7XG4gIH1cblxuICByZXR1cm4gYC8vIE94bGludCBvbmx5IHN1cHBvcnRzIHR5cGUtYXdhcmUgb3B0aW9ucyBpbiB0aGUgcm9vdCBjb25maWcsIHdoaWxlIGl0XG4vLyBzdGlsbCBhdXRvLWRpc2NvdmVycyBwYWNrYWdlLWxvY2FsIGNvbmZpZyBmaWxlcyBpbiBtb25vcmVwb3MuIEtlZXAgdGhpcyBhcyBhXG4vLyBwbGFpbiBvYmplY3QgY29weSBzbyBwYWNrYWdlIHR5cGVjaGVja3MgZG8gbm90IGV4cG9ydCBveGxpbnQncyBwcml2YXRlIGhlbHBlclxuLy8gdHlwZXMgdGhyb3VnaCB0aGUgZ2VuZXJhdGVkIGNvbmZpZyB2YXJpYWJsZS5cbmNvbnN0IG94bGludFJlc29sdmVkQ29uZmlnOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHsgLi4uJHtiYXNlQ29uZmlnTmFtZX0gfTtcbmRlbGV0ZSBveGxpbnRSZXNvbHZlZENvbmZpZy5vcHRpb25zO2A7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgaWdub3JlRmlsZVV0aWwgfSBmcm9tICcuLi91dGlscy9pZ25vcmVGaWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBkb2VzQ29udGFpbkphdmEgfSBmcm9tICcuLi91dGlscy9wYWNrYWdlQ2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBjb21tb25Db250ZW50ID0gYFxuM3JkLXBhcnR5L1xuYW5kcm9pZC9cbmlvcy9cbm5vLWZvcm1hdC9cbnRlc3QtZml4dHVyZXMvXG50ZXN0L2ZpeHR1cmVzL1xuKi5kLnRzXG4qLm1pbi5qc1xuLnlhcm4vXG4ucG5wLmpzXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQcmV0dGllcmlnbm9yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVByZXR0aWVyaWdub3JlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnByZXR0aWVyaWdub3JlJyk7XG4gICAgaWYgKCFkb2VzQ29udGFpbkphdmEoY29uZmlnKSkge1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY29udGVudCA9IChhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoKSkgPz8gJyc7XG4gICAgY29uc3QgaGVhZFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQpO1xuICAgIGNvbnN0IHRhaWxVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldFRhaWxVc2VyQ29udGVudChjb250ZW50KTtcblxuICAgIGNvbnN0IGdpdGlnbm9yZUZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGlnbm9yZScpO1xuICAgIGNvbnN0IGdpdGlnbm9yZUNvbnRlbnQgPSAoYXdhaXQgaWdub3JlRmlsZVV0aWwucmVhZEdpdGlnbm9yZVdpdGhvdXRTZXBhcmF0b3JzKGdpdGlnbm9yZUZpbGVQYXRoKSkgfHwgJyc7XG5cbiAgICBsZXQgYWRkaXRpb25hbENvbnRlbnQgPSAnJztcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgIGFkZGl0aW9uYWxDb250ZW50ID0gYFxuYW5kcm9pZC9hcHAvXG5pb3MvUnVubmVyL0Fzc2V0cy54Y2Fzc2V0cy9cbnB1YnNwZWMueWFtbFxuYDtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdDb250ZW50ID0gaGVhZFVzZXJDb250ZW50ICsgY29tbW9uQ29udGVudCArIGFkZGl0aW9uYWxDb250ZW50ICsgZ2l0aWdub3JlQ29udGVudCArIHRhaWxVc2VyQ29udGVudDtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgb3ZlcndyaXRlTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGpzb25PYmogPSB7XG4gIHZlbnZQYXRoOiAnLicsXG4gIHZlbnY6ICcudmVudicsXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbihjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVB5cmlnaHRDb25maWdKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGxldCBuZXdTZXR0aW5nczogb2JqZWN0ID0gc3RydWN0dXJlZENsb25lKGpzb25PYmopO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAncHlyaWdodGNvbmZpZy5qc29uJyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG9sZFNldHRpbmdzID0gSlNPTi5wYXJzZShvbGRDb250ZW50KSBhcyBvYmplY3Q7XG4gICAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShuZXdTZXR0aW5ncywgdW5kZWZpbmVkLCAyKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3Qgc2VtYW50aWNSZWxlYXNlQmFkZ2UgPVxuICAnWyFbc2VtYW50aWMtcmVsZWFzZV0oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9iYWRnZS8lMjAlMjAlRjAlOUYlOTMlQTYlRjAlOUYlOUElODAtc2VtYW50aWMtLXJlbGVhc2UtZTEwMDc5LnN2ZyldKGh0dHBzOi8vZ2l0aHViLmNvbS9zZW1hbnRpYy1yZWxlYXNlL3NlbWFudGljLXJlbGVhc2UpJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUmVhZG1lKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUmVhZG1lJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnUkVBRE1FLm1kJyk7XG4gICAgbGV0IG5ld0NvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcblxuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5yZWxlYXNlcmMuanNvbicpKSkge1xuICAgICAgbmV3Q29udGVudCA9IGluc2VydEJhZGdlKG5ld0NvbnRlbnQsIHNlbWFudGljUmVsZWFzZUJhZGdlKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXBvc2l0b3J5ID0gY29uZmlnLnJlcG9zaXRvcnk/LnNsaWNlKGNvbmZpZy5yZXBvc2l0b3J5LmluZGV4T2YoJzonKSArIDEpO1xuICAgIGNvbnN0IHdvcmtmbG93c1BhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aHViJywgJ3dvcmtmbG93cycpO1xuICAgIGNvbnN0IGZpbGVOYW1lcyA9IGZzLmV4aXN0c1N5bmMod29ya2Zsb3dzUGF0aCkgPyBmcy5yZWFkZGlyU3luYyh3b3JrZmxvd3NQYXRoKSA6IFtdO1xuICAgIGZvciAoY29uc3QgZmlsZU5hbWUgb2YgZmlsZU5hbWVzKSB7XG4gICAgICBpZiAoIWZpbGVOYW1lLnN0YXJ0c1dpdGgoJ3Rlc3QnKSAmJiAhZmlsZU5hbWUuc3RhcnRzV2l0aCgnZGVwbG95JykpIGNvbnRpbnVlO1xuXG4gICAgICBsZXQgYmFkZ2VOYW1lID0gZmlsZU5hbWU7XG4gICAgICBiYWRnZU5hbWUgPSAoYmFkZ2VOYW1lWzBdIHx8ICcnKS50b1VwcGVyQ2FzZSgpICsgYmFkZ2VOYW1lLnNsaWNlKDEsIGJhZGdlTmFtZS5pbmRleE9mKCcuJykpO1xuICAgICAgYmFkZ2VOYW1lID0gYmFkZ2VOYW1lLnJlcGxhY2UoJy0nLCAnICcpO1xuICAgICAgaWYgKCFyZXBvc2l0b3J5KSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGJhZGdlID0gYFshWyR7YmFkZ2VOYW1lfV0oaHR0cHM6Ly9naXRodWIuY29tLyR7cmVwb3NpdG9yeX0vYWN0aW9ucy93b3JrZmxvd3MvJHtmaWxlTmFtZX0vYmFkZ2Uuc3ZnKV0oaHR0cHM6Ly9naXRodWIuY29tLyR7cmVwb3NpdG9yeX0vYWN0aW9ucy93b3JrZmxvd3MvJHtmaWxlTmFtZX0pYDtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgYC5naXRodWIvd29ya2Zsb3dzLyR7ZmlsZU5hbWV9YCkpKSB7XG4gICAgICAgIG5ld0NvbnRlbnQgPSByZW1vdmVHaXRIdWJBY3Rpb25zQmFkZ2UobmV3Q29udGVudCwgYmFkZ2VOYW1lLCBmaWxlTmFtZSk7XG4gICAgICAgIG5ld0NvbnRlbnQgPSBpbnNlcnRCYWRnZShuZXdDb250ZW50LCBiYWRnZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbnNlcnRCYWRnZShyZWFkbWU6IHN0cmluZywgYmFkZ2U6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIOaXouOBq2JhZGdl44GM44GC44KL5aC05ZCI44Gv5YmK6ZmkXG4gIHJlYWRtZSA9IHJlYWRtZS5yZXBsYWNlKGJhZGdlLCAnJykucmVwbGFjZUFsbCgvXFxuXFxuXFxuKy9nLCAnXFxuXFxuJyk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByZWFkbWUubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAocmVhZG1lW2kgLSAxXSA9PT0gJ1xcbicgJiYgcmVhZG1lW2ldID09PSAnXFxuJykge1xuICAgICAgY29uc3QgYmVmb3JlID0gcmVhZG1lLnNsaWNlKDAsIGkgKyAxKTtcbiAgICAgIGxldCBhZnRlciA9IHJlYWRtZS5zbGljZShpICsgMSk7XG4gICAgICBpZiAoIWFmdGVyLnN0YXJ0c1dpdGgoJ1snKSAmJiAhYWZ0ZXIuc3RhcnRzV2l0aCgnIScpKSB7XG4gICAgICAgIGFmdGVyID0gYFxcbiR7YWZ0ZXJ9YDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBgJHtiZWZvcmV9JHtiYWRnZX1cXG4ke2FmdGVyfWA7XG4gICAgfVxuICB9XG4gIHJldHVybiBgJHtyZWFkbWV9XFxuJHtiYWRnZX1cXG5gO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlR2l0SHViQWN0aW9uc0JhZGdlKHJlYWRtZTogc3RyaW5nLCBiYWRnZU5hbWU6IHN0cmluZywgZmlsZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGVzY2FwZWRCYWRnZU5hbWUgPSBlc2NhcGVSZWdFeHAoYmFkZ2VOYW1lKTtcbiAgY29uc3QgZXNjYXBlZEZpbGVOYW1lID0gZXNjYXBlUmVnRXhwKGZpbGVOYW1lKTtcbiAgcmV0dXJuIHJlYWRtZVxuICAgIC5yZXBsYWNlQWxsKFxuICAgICAgbmV3IFJlZ0V4cChcbiAgICAgICAgU3RyaW5nLnJhd2BcXFshXFxbJHtlc2NhcGVkQmFkZ2VOYW1lfVxcXVxcKGh0dHBzOi8vZ2l0aHViXFwuY29tL1teL1xccyldKy9bXi9cXHMpXSsvYWN0aW9ucy93b3JrZmxvd3MvJHtlc2NhcGVkRmlsZU5hbWV9L2JhZGdlXFwuc3ZnXFwpXFxdXFwoaHR0cHM6Ly9naXRodWJcXC5jb20vW14vXFxzKV0rL1teL1xccyldKy9hY3Rpb25zL3dvcmtmbG93cy8ke2VzY2FwZWRGaWxlTmFtZX1cXClcXG4/YCxcbiAgICAgICAgJ2d1J1xuICAgICAgKSxcbiAgICAgICcnXG4gICAgKVxuICAgIC5yZXBsYWNlQWxsKC9cXG5cXG5cXG4rL2csICdcXG5cXG4nKTtcbn1cblxuZnVuY3Rpb24gZXNjYXBlUmVnRXhwKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdmFsdWUucmVwbGFjZUFsbCgvWy4qKz9eJHt9KCl8W1xcXVxcXFxdL2csIFN0cmluZy5yYXdgXFwkJmApO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUmVsZWFzZXJjKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVJlbGVhc2VyYycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcucmVsZWFzZXJjLmpzb24nKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSByZXR1cm47XG5cbiAgICBjb25zdCBzZXR0aW5ncyA9IEpTT04ucGFyc2UoYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4JykpIGFzIHtcbiAgICAgIHBsdWdpbnM/OiAoc3RyaW5nIHwgW3N0cmluZywgdW5rbm93bl0pW107XG4gICAgfTtcbiAgICBjb25zdCBwbHVnaW5zID0gc2V0dGluZ3MucGx1Z2lucyA/PyBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBsdWdpbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHBsdWdpbkVudHJ5ID0gcGx1Z2luc1tpXTtcbiAgICAgIGNvbnN0IGlzQXJyYXkgPSBBcnJheS5pc0FycmF5KHBsdWdpbkVudHJ5KTtcbiAgICAgIGNvbnN0IHBsdWdpbiA9IGlzQXJyYXkgPyBwbHVnaW5FbnRyeVswXSA6IHBsdWdpbkVudHJ5O1xuICAgICAgY29uc3Qgb2xkQ29uZmlnID0gKGlzQXJyYXkgJiYgcGx1Z2luRW50cnlbMV0pIHx8IHt9O1xuICAgICAgaWYgKHBsdWdpbiA9PT0gJ0BzZW1hbnRpYy1yZWxlYXNlL2NvbW1pdC1hbmFseXplcicpIHtcbiAgICAgICAgcGx1Z2luc1tpXSA9IFtcbiAgICAgICAgICAnQHNlbWFudGljLXJlbGVhc2UvY29tbWl0LWFuYWx5emVyJyxcbiAgICAgICAgICBtZXJnZS5hbGwoXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIG9sZENvbmZpZyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHByZXNldDogJ2NvbnZlbnRpb25hbGNvbW1pdHMnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfVxuICAgICAgICAgICksXG4gICAgICAgIF07XG4gICAgICB9IGVsc2UgaWYgKHBsdWdpbiA9PT0gJ0BzZW1hbnRpYy1yZWxlYXNlL2dpdGh1YicpIHtcbiAgICAgICAgcGx1Z2luc1tpXSA9IFtcbiAgICAgICAgICAnQHNlbWFudGljLXJlbGVhc2UvZ2l0aHViJyxcbiAgICAgICAgICBtZXJnZS5hbGwoXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIG9sZENvbmZpZyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIC8vIGNmLiBodHRwczovL2dpdGh1Yi5jb20vc2VtYW50aWMtcmVsZWFzZS9zZW1hbnRpYy1yZWxlYXNlL2lzc3Vlcy8yMjA0I2lzc3VlY29tbWVudC0xNTA4NDE3NzA0XG4gICAgICAgICAgICAgICAgc3VjY2Vzc0NvbW1lbnRDb25kaXRpb246IGZhbHNlLFxuICAgICAgICAgICAgICAgIGZhaWxDb21tZW50Q29uZGl0aW9uOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBsYWJlbHM6IFsncjogc2VtYW50aWMtcmVsZWFzZSddLFxuICAgICAgICAgICAgICAgIHJlbGVhc2VkTGFiZWxzOiBbJ3JlbGVhc2VkIDpib29rbWFyazonXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH1cbiAgICAgICAgICApLFxuICAgICAgICBdO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MsIHVuZGVmaW5lZCwgMik7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBqc29uT2JqID0ge1xuICAkc2NoZW1hOiAnaHR0cHM6Ly9kb2NzLnJlbm92YXRlYm90LmNvbS9yZW5vdmF0ZS1zY2hlbWEuanNvbicsXG4gIGV4dGVuZHM6IFsnZ2l0aHViPldpbGxCb29zdGVyL3dpbGxib29zdGVyLWNvbmZpZ3M6cmVub3ZhdGUuanNvbjUnXSxcbn07XG5cbnR5cGUgU2V0dGluZ3MgPSB0eXBlb2YganNvbk9iaiAmIHsgcGFja2FnZVJ1bGVzPzogeyBtYXRjaFBhY2thZ2VOYW1lczogc3RyaW5nW107IGVuYWJsZWQ/OiBib29sZWFuIH1bXSB9O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZW5vdmF0ZUpzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVSZW5vdmF0ZUpzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgbGV0IG5ld1NldHRpbmdzID0gc3RydWN0dXJlZENsb25lKGpzb25PYmopIGFzIFNldHRpbmdzO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAncmVub3ZhdGUuanNvbicpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGAke2ZpbGVQYXRofTVgKSkge1xuICAgICAgLy8gU2luY2UgaXQgaXMgZGlmZmljdWx0IGZvciBwYXJzaW5nIHJlbm92YXRlLmpzb241LCB3ZSBkbyBub3RoaW5nXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBvbGRTZXR0aW5ncyA9IEpTT04ucGFyc2Uob2xkQ29udGVudCkgYXMgU2V0dGluZ3M7XG4gICAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHtcbiAgICAgICAgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UsXG4gICAgICB9KSBhcyBTZXR0aW5ncztcbiAgICAgIG5ld1NldHRpbmdzLmV4dGVuZHMgPSBuZXdTZXR0aW5ncy5leHRlbmRzLmZpbHRlcigoaXRlbTogc3RyaW5nKSA9PiBpdGVtICE9PSAnQHdpbGxib29zdGVyJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgLy8gRG9uJ3QgdXBncmFkZSBOZXh0LmpzIGF1dG9tYXRpY2FsbHlcbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eikge1xuICAgICAgbmV3U2V0dGluZ3MucGFja2FnZVJ1bGVzID8/PSBbXTtcbiAgICAgIGlmIChcbiAgICAgICAgIW5ld1NldHRpbmdzLnBhY2thZ2VSdWxlcy5zb21lKChydWxlOiB7IG1hdGNoUGFja2FnZU5hbWVzPzogc3RyaW5nW10gfSkgPT5cbiAgICAgICAgICBydWxlLm1hdGNoUGFja2FnZU5hbWVzPy5pbmNsdWRlcygnbmV4dCcpXG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICBuZXdTZXR0aW5ncy5wYWNrYWdlUnVsZXMucHVzaCh7IG1hdGNoUGFja2FnZU5hbWVzOiBbJ25leHQnXSwgZW5hYmxlZDogZmFsc2UgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5kZXBlbmRhYm90JyksIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcucmVub3ZhdGVyYy5qc29uJyksIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShuZXdTZXR0aW5ncywgdW5kZWZpbmVkLCAyKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGluc3RhbGxBZ2VudFNraWxscyhfcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2luc3RhbGxBZ2VudFNraWxscycsIGFzeW5jICgpID0+IHtcbiAgICAvLyBUT0RPOiBXZSBhcmUgdGVtcG9yYXJpbHkgbm90IGluc3RhbGxpbmcgbWFuYWdlZCBhZ2VudCBza2lsbHMgaW50byByZXBvcy5cbiAgICAvLyBhd2FpdCBydW5JbnN0YWxsQWdlbnRTa2lsbHMoX3Jvb3RDb25maWcpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IHR5cGUgeyBUc0NvbmZpZ0pzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgY29tYmluZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHNvcnRLZXlzIH0gZnJvbSAnLi4vdXRpbHMvb2JqZWN0VXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IGdldFRzY29uZmlnRXh0ZW5kcyB9IGZyb20gJy4uL3V0aWxzL3RzY29uZmlnQmFzZS5qcyc7XG5cbmNvbnN0IHJvb3RKc29uT2JqID0ge1xuICBjb21waWxlck9wdGlvbnM6IHtcbiAgICBhbHdheXNTdHJpY3Q6IHRydWUsXG4gICAgbm9VbmNoZWNrZWRJbmRleGVkQWNjZXNzOiB0cnVlLCAvLyBmb3IgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1udWxsaXNoLWNvYWxlc2NpbmdcbiAgICBhbGxvd1N5bnRoZXRpY0RlZmF1bHRJbXBvcnRzOiB0cnVlLCAvLyBhbGxvdyBgaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J2BcbiAgICBlc01vZHVsZUludGVyb3A6IHRydWUsIC8vIGFsbG93IGRlZmF1bHQgaW1wb3J0IGZyb20gQ29tbW9uSlMvQU1EL1VNRCBtb2R1bGVzXG4gICAgcmVzb2x2ZUpzb25Nb2R1bGU6IHRydWUsIC8vIGFsbG93IHRvIGltcG9ydCBKU09OIGZpbGVzXG4gICAgaW1wb3J0SGVscGVyczogZmFsc2UsXG4gICAgbm9FbWl0OiB0cnVlLFxuICB9LFxuICBleGNsdWRlOiBbJ3BhY2thZ2VzLyovdGVzdC9maXh0dXJlcycsICd0ZXN0L2ZpeHR1cmVzJ10sXG4gIGluY2x1ZGU6IFtcbiAgICAnKi5jb25maWcudHMnLFxuICAgICdwYWNrYWdlcy8qLyouY29uZmlnLnRzJyxcbiAgICAncGFja2FnZXMvKi9zY3JpcHRzLyoqLyonLFxuICAgICdwYWNrYWdlcy8qL3NyYy8qKi8qJyxcbiAgICAncGFja2FnZXMvKi90ZXN0LyoqLyonLFxuICAgICdzY3JpcHRzLyoqLyonLFxuICAgICdzcmMvKiovKicsXG4gICAgJ3Rlc3QvKiovKicsXG4gIF0sXG59O1xuXG5jb25zdCBzdWJKc29uT2JqID0ge1xuICBjb21waWxlck9wdGlvbnM6IHtcbiAgICBhbHdheXNTdHJpY3Q6IHRydWUsXG4gICAgbm9VbmNoZWNrZWRJbmRleGVkQWNjZXNzOiB0cnVlLCAvLyBmb3IgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1udWxsaXNoLWNvYWxlc2NpbmdcbiAgICBhbGxvd1N5bnRoZXRpY0RlZmF1bHRJbXBvcnRzOiB0cnVlLCAvLyBhbGxvdyBgaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J2BcbiAgICBlc01vZHVsZUludGVyb3A6IHRydWUsIC8vIGFsbG93IGRlZmF1bHQgaW1wb3J0IGZyb20gQ29tbW9uSlMvQU1EL1VNRCBtb2R1bGVzXG4gICAgcmVzb2x2ZUpzb25Nb2R1bGU6IHRydWUsIC8vIGFsbG93IHRvIGltcG9ydCBKU09OIGZpbGVzXG4gICAgaW1wb3J0SGVscGVyczogZmFsc2UsXG4gICAgbm9FbWl0OiB0cnVlLFxuICB9LFxuICBleGNsdWRlOiBbJ3Rlc3QvZml4dHVyZXMnXSxcbiAgLy8gd2JmeSBnZW5lcmF0ZXMgcm9vdC1sZXZlbCB0b29sIGNvbmZpZ3Mgc3VjaCBhcyBwbGF5d3JpZ2h0LmNvbmZpZy50cywgYW5kXG4gIC8vIHR5cGUtYXdhcmUgbGludGluZyBuZWVkcyB0aG9zZSBmaWxlcyBpbiB0aGUgcHJvamVjdCB0byBzZWUgTm9kZS9CdW4gZ2xvYmFscy5cbiAgaW5jbHVkZTogWycqLmNvbmZpZy50cycsICdzY3JpcHRzLyoqLyonLCAnc3JjLyoqLyonLCAndGVzdC8qKi8qJ10sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVUc2NvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVRzY29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6IHx8IGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgYXdhaXQgY2xlYW51cExlZ2FjeVRzY29uZmlnTW9kdWxlU2V0dGluZ3MoY29uZmlnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgbmV3U2V0dGluZ3MgPSBzdHJ1Y3R1cmVkQ2xvbmUoY29uZmlnLmlzUm9vdCA/IHJvb3RKc29uT2JqIDogc3ViSnNvbk9iaikgYXMgVHNDb25maWdKc29uO1xuICAgIGNvbnN0IGdlbmVyYXRlZFR5cGVzID0gZ2V0R2VuZXJhdGVkVHlwZXMoY29uZmlnKTtcbiAgICBuZXdTZXR0aW5ncy5leHRlbmRzID0gZ2V0VHNjb25maWdFeHRlbmRzKGNvbmZpZyk7XG4gICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zID8/PSB7fTtcbiAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMucm9vdERpciA9IGdldFJvb3REaXIoY29uZmlnKTtcbiAgICBpZiAoZ2VuZXJhdGVkVHlwZXMubGVuZ3RoID4gMCkge1xuICAgICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zID0geyAuLi5uZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMsIHR5cGVzOiBnZW5lcmF0ZWRUeXBlcyB9O1xuICAgIH1cbiAgICBpZiAoIWNvbmZpZy5kb2VzQ29udGFpbkpzeE9yVHN4ICYmICFjb25maWcuZG9lc0NvbnRhaW5Kc3hPclRzeEluUGFja2FnZXMpIHtcbiAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmpzeDtcbiAgICB9IGVsc2UgaWYgKCFjb25maWcuaXNCdW4gJiYgIWNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyA9IHsgLi4ubmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLCBqc3g6ICdyZWFjdC1qc3gnIH07XG4gICAgfVxuICAgIGlmIChjb25maWcuaXNSb290ICYmICFjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMpIHtcbiAgICAgIG5ld1NldHRpbmdzLmluY2x1ZGUgPSBuZXdTZXR0aW5ncy5pbmNsdWRlPy5maWx0ZXIoKGRpclBhdGg6IHN0cmluZykgPT4gIWRpclBhdGguc3RhcnRzV2l0aCgncGFja2FnZXMvKi8nKSk7XG4gICAgICBuZXdTZXR0aW5ncy5leGNsdWRlID0gbmV3U2V0dGluZ3MuZXhjbHVkZT8uZmlsdGVyKChkaXJQYXRoOiBzdHJpbmcpID0+ICFkaXJQYXRoLnN0YXJ0c1dpdGgoJ3BhY2thZ2VzLyovJykpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEpIHtcbiAgICAgIC8vIFByaXNtYSBzZWVkcyBhbmQgbWlncmF0aW9uIGhlbHBlciBzY3JpcHRzIG9mdGVuIGxpdmUgb3V0c2lkZSBzcmMsIGJ1dFxuICAgICAgLy8gdHlwZS1hd2FyZSBsaW50aW5nIHN0aWxsIG5lZWRzIHRoZW0gY292ZXJlZCBieSB0aGUgcHJvamVjdCBjb25maWcuXG4gICAgICBhZGRJbmNsdWRlUGF0aChuZXdTZXR0aW5ncywgJ3ByaXNtYS8qKi8qJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICd0c2NvbmZpZy5qc29uJyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3Qgb2xkU2V0dGluZ3MgPSBKU09OLnBhcnNlKGV4aXN0aW5nQ29udGVudCkgYXMgVHNDb25maWdKc29uO1xuICAgICAgY29uc3QgZXhpc3RpbmdUeXBlcyA9IG5vcm1hbGl6ZVN0cmluZ0FycmF5KG9sZFNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8udHlwZXMpO1xuICAgICAgY29uc3QgZXhpc3RpbmdFbWl0TWV0YWRhdGEgPSBwaWNrRXhpc3RpbmdFbWl0TWV0YWRhdGEob2xkU2V0dGluZ3MuY29tcGlsZXJPcHRpb25zKTtcbiAgICAgIG5ld1NldHRpbmdzLmV4dGVuZHMgPSBtZXJnZVRzY29uZmlnRXh0ZW5kcyhuZXdTZXR0aW5ncy5leHRlbmRzLCBvbGRTZXR0aW5ncy5leHRlbmRzKTtcbiAgICAgIGRlbGV0ZSBvbGRTZXR0aW5ncy5leHRlbmRzO1xuICAgICAgZGVsZXRlIG9sZFNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8uanN4O1xuICAgICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7IGFycmF5TWVyZ2U6IGNvbWJpbmVNZXJnZSB9KTtcbiAgICAgIG5ld1NldHRpbmdzLmluY2x1ZGUgPSBuZXdTZXR0aW5ncy5pbmNsdWRlPy5maWx0ZXIoXG4gICAgICAgIChkaXJQYXRoOiBzdHJpbmcpID0+XG4gICAgICAgICAgIWRpclBhdGguaW5jbHVkZXMoJ0B0eXBlcycpICYmICFkaXJQYXRoLmluY2x1ZGVzKCdfX3Rlc3RzX18vJykgJiYgIWRpclBhdGguaW5jbHVkZXMoJ3Rlc3RzLycpXG4gICAgICApO1xuICAgICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zID8/PSB7fTtcbiAgICAgIC8vIHdiZnktZ2VuZXJhdGVkIHRzY29uZmlnLmpzb24gaXMgYSBsaW50L3R5cGVjaGVjayBwcm9qZWN0LCBub3QgdGhlIGVtaXRcbiAgICAgIC8vIGNvbnRyYWN0LiBJdCBtdXN0IGtlZXAgcm9vdERpciBicm9hZCBlbm91Z2ggZm9yIHJvb3QgY29uZmlnIGZpbGVzLFxuICAgICAgLy8gc2NyaXB0cywgc3JjLCBhbmQgdGVzdHMuIGJ1aWxkLXRzIG93bnMgZW1pdCBhbmQgY3JlYXRlcyBhIHRlbXBvcmFyeVxuICAgICAgLy8gc3JjLW9ubHkgdHNjb25maWcgd2l0aCBub0VtaXQ9ZmFsc2UsIGVtaXREZWNsYXJhdGlvbk9ubHk9dHJ1ZSxcbiAgICAgIC8vIHJvb3REaXI9XCJzcmNcIiwgYW5kIGluY2x1ZGU9W1wic3JjLyoqLypcIl0sIHNvIHByZXNlcnZpbmcgbm9FbWl0PWZhbHNlIG9yXG4gICAgICAvLyByb290RGlyPVwic3JjXCIgaGVyZSB3b3VsZCBvbmx5IGJyZWFrIG5vbi1zcmMgdHlwZS1hd2FyZSBsaW50IGNvdmVyYWdlLlxuICAgICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zID0geyAuLi5uZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMsIC4uLmV4aXN0aW5nRW1pdE1ldGFkYXRhIH07XG4gICAgICBlbnN1cmVUc0V4dGVuc2lvbkVtaXRDb21wYXRpYmlsaXR5KG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyk7XG5cbiAgICAgIGNvbnN0IG1lcmdlZFR5cGVzID0gWy4uLm5ldyBTZXQoWy4uLmZpbHRlckV4aXN0aW5nVHlwZXMoZXhpc3RpbmdUeXBlcywgZ2VuZXJhdGVkVHlwZXMpLCAuLi5nZW5lcmF0ZWRUeXBlc10pXTtcbiAgICAgIGlmIChtZXJnZWRUeXBlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucy50eXBlcyA9IG1lcmdlZFR5cGVzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucy50eXBlcztcbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGREZWxldGVUeXBlUm9vdHMoZ2VuZXJhdGVkVHlwZXMpKSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMudHlwZVJvb3RzO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgICBzb3J0S2V5cyhuZXdTZXR0aW5ncyk7XG4gICAgbmV3U2V0dGluZ3MuaW5jbHVkZT8uc29ydCgpO1xuICAgIC8vIERvbid0IHVzZSBvbGQgZGVjb3JhdG9yXG4gICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8uZXhwZXJpbWVudGFsRGVjb3JhdG9ycztcbiAgICAvLyBQYWNrYWdlIGltcG9ydHMgc2hvdWxkIHJlc29sdmUgdGhyb3VnaCBwYWNrYWdlIGV4cG9ydHMgaW5zdGVhZCBvZiBiYXNlVXJsLlxuICAgIC8vIHBhdGhzIGlzIGludGVudGlvbmFsbHkgcHJlc2VydmVkIHNvIHJlcG8tbG9jYWwgdG9vbGluZyBjYW4ga2VlcCBleHBsaWNpdFxuICAgIC8vIGFsaWFzZXMgd2l0aG91dCByZWx5aW5nIG9uIGJhc2VVcmwncyBicm9hZCBmYWxsYmFjayByZXNvbHV0aW9uLlxuICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmJhc2VVcmw7XG4gICAgZGVsZXRlTGVnYWN5TW9kdWxlU2V0dGluZ3MobmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLCBjb25maWcpO1xuICAgIG5vcm1hbGl6ZUNvbW1vbkpzVHNjb25maWdTZXR0aW5ncyhuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMsIGNvbmZpZyk7XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LnZlcmJhdGltTW9kdWxlU3ludGF4O1xuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MsIHVuZGVmaW5lZCwgMik7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNsZWFudXBMZWdhY3lUc2NvbmZpZ01vZHVsZVNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3RzY29uZmlnLmpzb24nKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBzZXR0aW5ncyA9IEpTT04ucGFyc2UoYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4JykpIGFzIFRzQ29uZmlnSnNvbjtcbiAgICBub3JtYWxpemVOZXh0VHNjb25maWdNb2R1bGVTZXR0aW5ncyhzZXR0aW5ncy5jb21waWxlck9wdGlvbnMpO1xuICAgIG5vcm1hbGl6ZU5leHRUc2NvbmZpZ1BhdGhBbGlhc2VzKHNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyk7XG4gICAgYWRkU2NyaXB0c0luY2x1ZGVGb3JGcmFtZXdvcmtQcm9qZWN0KHNldHRpbmdzKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgSlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MsIHVuZGVmaW5lZCwgMikpKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gTmV4dC9CbGl0eiBvd24gdGhlaXIgdHNjb25maWcgc2hhcGUsIGJ1dCBUeXBlU2NyaXB0IDYgbm8gbG9uZ2VyIGFjY2VwdHNcbiAgICAvLyBub2RlMTAgcmVzb2x2ZXIgc3BlbGxpbmdzIHRoYXQgb2xkZXIgcHJvamVjdHMgY29tbW9ubHkgaW5oZXJpdGVkLlxuICB9XG59XG5cbmZ1bmN0aW9uIGFkZFNjcmlwdHNJbmNsdWRlRm9yRnJhbWV3b3JrUHJvamVjdChzZXR0aW5nczogVHNDb25maWdKc29uKTogdm9pZCB7XG4gIC8vIE9taXR0aW5nIGluY2x1ZGUgbGV0cyBmcmFtZXdvcmsgdHNjb25maWdzIGtlZXAgVHlwZVNjcmlwdCdzIGRlZmF1bHRcbiAgLy8gXCJhbGwgVFMvVFNYIGZpbGVzXCIgYmVoYXZpb3IsIHdoaWNoIGFscmVhZHkgY292ZXJzIHNjcmlwdHMuXG4gIGlmICghc2V0dGluZ3MuaW5jbHVkZSkgcmV0dXJuO1xuICBpZiAoc2V0dGluZ3MuaW5jbHVkZS5pbmNsdWRlcygnc2NyaXB0cy8qKi8qJykpIHJldHVybjtcblxuICBzZXR0aW5ncy5pbmNsdWRlLnB1c2goJ3NjcmlwdHMvKiovKicpO1xuICBzZXR0aW5ncy5pbmNsdWRlLnNvcnQoKTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplTmV4dFRzY29uZmlnTW9kdWxlU2V0dGluZ3MoY29tcGlsZXJPcHRpb25zOiBUc0NvbmZpZ0pzb24uQ29tcGlsZXJPcHRpb25zIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGlmICghY29tcGlsZXJPcHRpb25zKSByZXR1cm47XG4gIGlmIChcbiAgICBjb21waWxlck9wdGlvbnMubW9kdWxlUmVzb2x1dGlvbiA9PT0gJ25vZGUnIHx8XG4gICAgY29tcGlsZXJPcHRpb25zLm1vZHVsZVJlc29sdXRpb24gPT09ICdOb2RlJyB8fFxuICAgIGNvbXBpbGVyT3B0aW9ucy5tb2R1bGVSZXNvbHV0aW9uID09PSAnbm9kZTEwJyB8fFxuICAgIGNvbXBpbGVyT3B0aW9ucy5tb2R1bGVSZXNvbHV0aW9uID09PSB1bmRlZmluZWRcbiAgKSB7XG4gICAgLy8gTmV4dC5qcyB3cml0ZXMgXCJub2RlXCIgZHVyaW5nIGJ1aWxkIHdoZW4gdGhpcyBvcHRpb24gaXMgbWlzc2luZywgYnV0XG4gICAgLy8gdHNnb2xpbnQgdHJlYXRzIHRoYXQgc3BlbGxpbmcgYXMgdGhlIHJlbW92ZWQgbm9kZTEwIHJlc29sdmVyLlxuICAgIGNvbXBpbGVyT3B0aW9ucy5tb2R1bGVSZXNvbHV0aW9uID0gJ2J1bmRsZXInO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZU5leHRUc2NvbmZpZ1BhdGhBbGlhc2VzKGNvbXBpbGVyT3B0aW9uczogVHNDb25maWdKc29uLkNvbXBpbGVyT3B0aW9ucyB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICBpZiAoIWNvbXBpbGVyT3B0aW9ucykgcmV0dXJuO1xuXG4gIC8vIHRzZ29saW50IGZvbGxvd3MgVHlwZVNjcmlwdCA2IHZhbGlkYXRpb24sIHdoZXJlIGJhc2VVcmwgaXMgcmVtb3ZlZCBhbmRcbiAgLy8gcGF0aCB0YXJnZXRzIG11c3QgYmUgZXhwbGljaXRseSByZWxhdGl2ZS4gTmV4dC5qcyBzdGlsbCBhY2NlcHRzIHRoZSBhbGlhc1xuICAvLyBzaGFwZSBhZnRlciBlYWNoIHRhcmdldCBpcyB3cml0dGVuIHdpdGggYSBsZWFkaW5nIC4vLlxuICBkZWxldGUgY29tcGlsZXJPcHRpb25zLmJhc2VVcmw7XG4gIGlmICghY29tcGlsZXJPcHRpb25zLnBhdGhzKSByZXR1cm47XG5cbiAgZm9yIChjb25zdCBbYWxpYXMsIHRhcmdldHNdIG9mIE9iamVjdC5lbnRyaWVzKGNvbXBpbGVyT3B0aW9ucy5wYXRocykpIHtcbiAgICBjb21waWxlck9wdGlvbnMucGF0aHNbYWxpYXNdID0gbm9ybWFsaXplUGF0aEFsaWFzVGFyZ2V0cyh0YXJnZXRzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVQYXRoQWxpYXNUYXJnZXRzKHRhcmdldHM6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICByZXR1cm4gdGFyZ2V0cy5tYXAoKHRhcmdldCkgPT4ge1xuICAgIGlmICh0YXJnZXQuc3RhcnRzV2l0aCgnLi8nKSB8fCB0YXJnZXQuc3RhcnRzV2l0aCgnLi4vJykgfHwgcGF0aC5pc0Fic29sdXRlKHRhcmdldCkpIHJldHVybiB0YXJnZXQ7XG4gICAgcmV0dXJuIGAuLyR7dGFyZ2V0fWA7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRSb290RGlyKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIGlmIChjb25maWcuaXNSb290KSByZXR1cm4gJy4nO1xuICByZXR1cm4gZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuLicsICcuLicsICdwYWNrYWdlLmpzb24nKSkgPyAnLi4vLi4nIDogJy4nO1xufVxuXG5mdW5jdGlvbiBtZXJnZVRzY29uZmlnRXh0ZW5kcyhcbiAgZ2VuZXJhdGVkRXh0ZW5kczogVHNDb25maWdKc29uWydleHRlbmRzJ10sXG4gIGV4aXN0aW5nRXh0ZW5kczogVHNDb25maWdKc29uWydleHRlbmRzJ11cbik6IFRzQ29uZmlnSnNvblsnZXh0ZW5kcyddIHtcbiAgY29uc3QgbWVyZ2VkRXh0ZW5kcyA9IFsuLi5ub3JtYWxpemVFeHRlbmRzKGdlbmVyYXRlZEV4dGVuZHMpLCAuLi5ub3JtYWxpemVFeHRlbmRzKGV4aXN0aW5nRXh0ZW5kcyldO1xuICBjb25zdCB1bmlxdWVFeHRlbmRzID0gWy4uLm5ldyBTZXQobWVyZ2VkRXh0ZW5kcyldO1xuICBpZiAodW5pcXVlRXh0ZW5kcy5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmICh1bmlxdWVFeHRlbmRzLmxlbmd0aCA9PT0gMSkgcmV0dXJuIHVuaXF1ZUV4dGVuZHNbMF07XG4gIHJldHVybiB1bmlxdWVFeHRlbmRzO1xufVxuXG5mdW5jdGlvbiBhZGRJbmNsdWRlUGF0aChzZXR0aW5nczogVHNDb25maWdKc29uLCBkaXJQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgc2V0dGluZ3MuaW5jbHVkZSA/Pz0gW107XG4gIGlmICghc2V0dGluZ3MuaW5jbHVkZS5pbmNsdWRlcyhkaXJQYXRoKSkge1xuICAgIHNldHRpbmdzLmluY2x1ZGUucHVzaChkaXJQYXRoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVFeHRlbmRzKHZhbHVlOiBUc0NvbmZpZ0pzb25bJ2V4dGVuZHMnXSk6IHN0cmluZ1tdIHtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIFtdO1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVN0cmluZ0FycmF5KHZhbHVlOiB1bmtub3duKTogc3RyaW5nW10ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgcmV0dXJuIFt2YWx1ZV07XG4gIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiBbXTtcbiAgcmV0dXJuIHZhbHVlLmZpbHRlcigoaXRlbSk6IGl0ZW0gaXMgc3RyaW5nID0+IHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJyk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZERlbGV0ZVR5cGVSb290cyh0eXBlTmFtZXM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gIC8vIE9ubHkgZ2VuZXJhdGVkIHBhY2thZ2Utb3duZWQgdGVzdCB0eXBlcyBzaG91bGQgdHJpZ2dlciB0aGlzLiBVc2VyLWRlZmluZWQgc2xhc2gtYmFzZWRcbiAgLy8gZW50cmllcyBtYXkgaW50ZW50aW9uYWxseSByZWx5IG9uIGN1c3RvbSB0eXBlUm9vdHMgYW5kIHNob3VsZCBiZSBwcmVzZXJ2ZWQgYXMtaXMuXG4gIHJldHVybiB0eXBlTmFtZXMuc29tZSgodHlwZU5hbWUpID0+IHR5cGVOYW1lID09PSAnY3lwcmVzcycgfHwgdHlwZU5hbWUuaW5jbHVkZXMoJy8nKSk7XG59XG5cbmZ1bmN0aW9uIGZpbHRlckV4aXN0aW5nVHlwZXMoZXhpc3RpbmdUeXBlczogc3RyaW5nW10sIGdlbmVyYXRlZFR5cGVzOiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgY29uc3QgZ2VuZXJhdGVkVHlwZVNldCA9IG5ldyBTZXQoZ2VuZXJhdGVkVHlwZXMpO1xuICByZXR1cm4gZXhpc3RpbmdUeXBlcy5maWx0ZXIoKHR5cGVOYW1lKSA9PiB7XG4gICAgLy8gd2JmeSBvd25zIHRoZXNlIHBhY2thZ2UtcHJvdmlkZWQgdGVzdCBnbG9iYWxzLiBEcm9wIHN0YWxlIGVudHJpZXMgd2hlbiB0aGVcbiAgICAvLyBjb3JyZXNwb25kaW5nIGRlcGVuZGVuY3kgaXMgbm8gbG9uZ2VyIHByZXNlbnQgc28gVHlwZVNjcmlwdCB3b24ndCByZXF1aXJlXG4gICAgLy8gbWlzc2luZyBwYWNrYWdlcyBzdWNoIGFzIHZpdGVzdC5cbiAgICBpZiAoaXNHZW5lcmF0ZWRUZXN0R2xvYmFsVHlwZSh0eXBlTmFtZSkgJiYgIWdlbmVyYXRlZFR5cGVTZXQuaGFzKHR5cGVOYW1lKSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gaXNHZW5lcmF0ZWRUZXN0R2xvYmFsVHlwZSh0eXBlTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlTmFtZSA9PT0gJ2N5cHJlc3MnIHx8IHR5cGVOYW1lID09PSAnamVzdCcgfHwgdHlwZU5hbWUgPT09ICdtb2NoYScgfHwgdHlwZU5hbWUgPT09ICd2aXRlc3QvZ2xvYmFscyc7XG59XG5cbmZ1bmN0aW9uIGVuc3VyZVRzRXh0ZW5zaW9uRW1pdENvbXBhdGliaWxpdHkoY29tcGlsZXJPcHRpb25zOiBUc0NvbmZpZ0pzb24uQ29tcGlsZXJPcHRpb25zIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGlmICghY29tcGlsZXJPcHRpb25zKSByZXR1cm47XG4gIGlmIChjb21waWxlck9wdGlvbnMubm9FbWl0ICE9PSBmYWxzZSB8fCBjb21waWxlck9wdGlvbnMuZW1pdERlY2xhcmF0aW9uT25seSA9PT0gdHJ1ZSkgcmV0dXJuO1xuXG4gIC8vIEB0c2NvbmZpZy9idW4gZW5hYmxlcyBhbGxvd0ltcG9ydGluZ1RzRXh0ZW5zaW9ucywgd2hpY2ggVHlwZVNjcmlwdCBwZXJtaXRzXG4gIC8vIGR1cmluZyBlbWl0IG9ubHkgd2hlbiByZWxhdGl2ZSBUUyBleHRlbnNpb25zIGFyZSByZXdyaXR0ZW4uXG4gIGNvbXBpbGVyT3B0aW9ucy5yZXdyaXRlUmVsYXRpdmVJbXBvcnRFeHRlbnNpb25zID0gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gZGVsZXRlTGVnYWN5TW9kdWxlU2V0dGluZ3MoXG4gIGNvbXBpbGVyT3B0aW9uczogVHNDb25maWdKc29uLkNvbXBpbGVyT3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnXG4pOiB2b2lkIHtcbiAgaWYgKCFjb21waWxlck9wdGlvbnMpIHJldHVybjtcblxuICAvLyBUeXBlU2NyaXB0IDYgcmVtb3ZlZCB0aGUgb2xkIG5vZGUxMCByZXNvbHZlciBzcGVsbGluZywgc28gaW5oZXJpdGVkIGJhc2UgY29uZmlnc1xuICAvLyBzaG91bGQgY2hvb3NlIHRoZSByZXNvbHZlciB1bmxlc3MgYSBwcm9qZWN0IGFscmVhZHkgb3B0ZWQgaW50byBhIG1vZGVybiBvbmUuXG4gIGlmIChcbiAgICBjb21waWxlck9wdGlvbnMubW9kdWxlUmVzb2x1dGlvbiA9PT0gJ25vZGUnIHx8XG4gICAgY29tcGlsZXJPcHRpb25zLm1vZHVsZVJlc29sdXRpb24gPT09ICdOb2RlJyB8fFxuICAgIGNvbXBpbGVyT3B0aW9ucy5tb2R1bGVSZXNvbHV0aW9uID09PSAnbm9kZTEwJ1xuICApIHtcbiAgICBkZWxldGUgY29tcGlsZXJPcHRpb25zLm1vZHVsZVJlc29sdXRpb247XG4gIH1cbiAgaWYgKGNvbmZpZy5pc0J1biB8fCBjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlIHx8IGNvbXBpbGVyT3B0aW9ucy5tb2R1bGUgIT09ICdFU05leHQnKSByZXR1cm47XG5cbiAgLy8gTm9kZSBiYXNlIGNvbmZpZ3Mgbm93IHBhaXIgdGhlaXIgcmVzb2x2ZXIgd2l0aCBhIG1hdGNoaW5nIG1vZHVsZSBraW5kLiBLZWVwaW5nXG4gIC8vIG9sZGVyIEVTTmV4dCBvdmVycmlkZXMgY3JlYXRlcyBpbnZhbGlkIGdlbmVyYXRlZCBjb25maWdzIGZvciBUUyA2LlxuICBkZWxldGUgY29tcGlsZXJPcHRpb25zLm1vZHVsZTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplQ29tbW9uSnNUc2NvbmZpZ1NldHRpbmdzKFxuICBjb21waWxlck9wdGlvbnM6IFRzQ29uZmlnSnNvbi5Db21waWxlck9wdGlvbnMgfCB1bmRlZmluZWQsXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZ1xuKTogdm9pZCB7XG4gIGlmICghY29tcGlsZXJPcHRpb25zIHx8IGNvbmZpZy5pc0J1biB8fCBjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlIHx8IGNvbmZpZy5pc0VzbVBhY2thZ2UpIHJldHVybjtcblxuICBpZiAoY29tcGlsZXJPcHRpb25zLm1vZHVsZT8udG9Mb3dlckNhc2UoKSA9PT0gJ2NvbW1vbmpzJykge1xuICAgIC8vIEB0c2NvbmZpZy9ub2RlLWx0cyBub3cgcHJvdmlkZXMgbW9kdWxlUmVzb2x1dGlvbj1ub2RlMTYuIFR5cGVTY3JpcHQgcmVxdWlyZXNcbiAgICAvLyB0aGUgbW9kdWxlIGtpbmQgdG8gbW92ZSB3aXRoIHRoYXQgcmVzb2x2ZXIsIHdoaWxlIHZlcmJhdGltTW9kdWxlU3ludGF4PWZhbHNlXG4gICAgLy8gcHJlc2VydmVzIHRoZSBsb25nLXN0YW5kaW5nIENvbW1vbkpTIGVtaXQgc2hhcGUgZm9yIGV4aXN0aW5nIHBhY2thZ2VzLlxuICAgIGNvbXBpbGVyT3B0aW9ucy5tb2R1bGUgPSAnTm9kZTE2JztcbiAgfVxuICBjb21waWxlck9wdGlvbnMudmVyYmF0aW1Nb2R1bGVTeW50YXggPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gcGlja0V4aXN0aW5nRW1pdE1ldGFkYXRhKFxuICBjb21waWxlck9wdGlvbnM6IFRzQ29uZmlnSnNvblsnY29tcGlsZXJPcHRpb25zJ11cbik6IFBpY2s8Tm9uTnVsbGFibGU8VHNDb25maWdKc29uWydjb21waWxlck9wdGlvbnMnXT4sICdkZWNsYXJhdGlvbicgfCAnZGVjbGFyYXRpb25NYXAnIHwgJ3NvdXJjZU1hcCc+IHtcbiAgY29uc3QgZW1pdE9wdGlvbnMgPSB7fSBhcyBQaWNrPFxuICAgIE5vbk51bGxhYmxlPFRzQ29uZmlnSnNvblsnY29tcGlsZXJPcHRpb25zJ10+LFxuICAgICdkZWNsYXJhdGlvbicgfCAnZGVjbGFyYXRpb25NYXAnIHwgJ3NvdXJjZU1hcCdcbiAgPjtcbiAgZm9yIChjb25zdCBrZXkgb2YgWydkZWNsYXJhdGlvbicsICdkZWNsYXJhdGlvbk1hcCcsICdzb3VyY2VNYXAnXSBhcyBjb25zdCkge1xuICAgIGNvbnN0IHZhbHVlID0gY29tcGlsZXJPcHRpb25zPy5ba2V5XTtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZW1pdE9wdGlvbnNba2V5XSA9IHZhbHVlIGFzIG5ldmVyO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZW1pdE9wdGlvbnM7XG59XG5cbmZ1bmN0aW9uIGdldEdlbmVyYXRlZFR5cGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgdHlwZU5hbWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IGRlcGVuZGVuY2llcyA9IHtcbiAgICAuLi5jb25maWcucGFja2FnZUpzb24/LmRlcGVuZGVuY2llcyxcbiAgICAuLi5jb25maWcucGFja2FnZUpzb24/LmRldkRlcGVuZGVuY2llcyxcbiAgfTtcblxuICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgdHlwZU5hbWVzLmFkZCgnYnVuJyk7XG4gIH0gZWxzZSBpZiAoIWNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICB0eXBlTmFtZXMuYWRkKCdub2RlJyk7XG4gIH1cbiAgaWYgKFxuICAgIGRlcGVuZGVuY2llcy5qZXN0IHx8XG4gICAgZGVwZW5kZW5jaWVzWydAamVzdC9nbG9iYWxzJ10gfHxcbiAgICBkZXBlbmRlbmNpZXNbJ2plc3QtZW52aXJvbm1lbnQtanNkb20nXSB8fFxuICAgIGRlcGVuZGVuY2llc1sndHMtamVzdCddXG4gICkge1xuICAgIHR5cGVOYW1lcy5hZGQoJ2plc3QnKTtcbiAgfVxuICBpZiAoZGVwZW5kZW5jaWVzLnZpdGVzdCkge1xuICAgIHR5cGVOYW1lcy5hZGQoJ3ZpdGVzdC9nbG9iYWxzJyk7XG4gIH1cbiAgaWYgKGRlcGVuZGVuY2llcy5tb2NoYSkge1xuICAgIHR5cGVOYW1lcy5hZGQoJ21vY2hhJyk7XG4gIH1cbiAgaWYgKGRlcGVuZGVuY2llcy5jeXByZXNzKSB7XG4gICAgdHlwZU5hbWVzLmFkZCgnY3lwcmVzcycpO1xuICB9XG5cbiAgcmV0dXJuIFsuLi50eXBlTmFtZXNdO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBzb3J0S2V5cyB9IGZyb20gJy4uL3V0aWxzL29iamVjdFV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGV4Y2x1ZGVGaWxlUGF0dGVybnMgPSBbXG4gICcqKi8uZ2l0L29iamVjdHMvKionLFxuICAnKiovLmdpdC9zdWJ0cmVlLWNhY2hlLyoqJyxcbiAgJyoqL25vZGVfbW9kdWxlcy8qKicsXG4gICcqKi90bXAvKionLFxuICAnKiovdGVtcC8qKicsXG4gICcqKi9kaXN0LyoqJyxcbl07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVZzY29kZVNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlVnNjb2RlU2V0dGluZ3MnLCBhc3luYyAoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnZzY29kZScsICdzZXR0aW5ncy5qc29uJyk7XG4gICAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGxldCBzZXR0aW5ncyA9IEpTT04ucGFyc2UoZXhpc3RpbmdDb250ZW50KSBhcyBvYmplY3Q7XG4gICAgICBmb3IgKGNvbnN0IGV4Y2x1ZGVGaWxlUGF0dGVybiBvZiBleGNsdWRlRmlsZVBhdHRlcm5zKSB7XG4gICAgICAgIHNldHRpbmdzID0gbWVyZ2UuYWxsKFtzZXR0aW5ncywgZXhjbHVkZVNldHRpbmcoZXhjbHVkZUZpbGVQYXR0ZXJuKV0pO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2sgfHwgY29uZmlnLmRvZXNDb250YWluVXZMb2NrKSB7XG4gICAgICAgIHNldHRpbmdzID0gbWVyZ2UuYWxsKFtzZXR0aW5ncywgZXhjbHVkZVNldHRpbmcoJyoqLy52ZW52LyoqJyldKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZGVwZW5kaW5nLm5leHQpIHtcbiAgICAgICAgc2V0dGluZ3MgPSBtZXJnZS5hbGwoW3NldHRpbmdzLCBleGNsdWRlU2V0dGluZygnKiovLm5leHQvKionKV0pO1xuICAgICAgfVxuICAgICAgLy8gTExN44Gr44KI44KLdmliZSBjb2Rpbmfjgafjga/jgIHoh6rli5Xjg5Xjgqnjg7zjg57jg4Pjg4jjgoTjgrPjg7zjg4njgqLjgq/jgrfjg6fjg7PjgpLnhKHlirnljJbjgZnjgovjgZPjgajjgadcbiAgICAgIC8vIOeUn+aIkOOBleOCjOOBn+OCs+ODvOODieOBruWFg+OBruW9ouW8j+OCkue2reaMgeOBp+OBjeOCi1xuICAgICAgaWYgKCdlZGl0b3IuY29kZUFjdGlvbnNPblNhdmUnIGluIHNldHRpbmdzKSB7XG4gICAgICAgIGRlbGV0ZSBzZXR0aW5nc1snZWRpdG9yLmNvZGVBY3Rpb25zT25TYXZlJ107XG4gICAgICB9XG4gICAgICBpZiAoJ2VkaXRvci5mb3JtYXRPblNhdmUnIGluIHNldHRpbmdzKSB7XG4gICAgICAgIGRlbGV0ZSBzZXR0aW5nc1snZWRpdG9yLmZvcm1hdE9uU2F2ZSddO1xuICAgICAgfVxuICAgICAgc29ydEtleXMoc2V0dGluZ3MgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KHNldHRpbmdzLCB1bmRlZmluZWQsIDIpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBleGNsdWRlU2V0dGluZyhleGNsdWRlRmlsZVBhdHRlcm46IHN0cmluZyk6IG9iamVjdCB7XG4gIHJldHVybiB7XG4gICAgJ2ZpbGVzLndhdGNoZXJFeGNsdWRlJzoge1xuICAgICAgW2V4Y2x1ZGVGaWxlUGF0dGVybl06IHRydWUsXG4gICAgfSxcbiAgfTtcbn1cbiIsIi8vIG94bGludC1kaXNhYmxlIGVzbGludC1wbHVnaW4taW1wb3J0L25vLW5hbWVkLWFzLWRlZmF1bHQtbWVtYmVyIC0tIE5hbWVzcGFjZSBZQU1MIGNhbGxzIG1ha2UgbG9hZC9kdW1wIHVzYWdlIGNsZWFyZXIuXG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IENvbmZpZ3VyYXRpb25WYWx1ZU1hcCB9IGZyb20gJ0B5YXJucGtnL2NvcmUnO1xuaW1wb3J0IHlhbWwgZnJvbSAnanMteWFtbCc7XG5pbXBvcnQgc2VtdmVyIGZyb20gJ3NlbXZlcic7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jLCBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuXG50eXBlIFNldHRpbmdzID0ge1xuICBhcHByb3ZlZEdpdFJlcG9zaXRvcmllcz86IHN0cmluZ1tdO1xuICBkZWZhdWx0U2VtdmVyUmFuZ2VQcmVmaXg6IHN0cmluZztcbiAgZW5hYmxlU2NyaXB0cz86IGJvb2xlYW47XG4gIG5tTW9kZTogc3RyaW5nO1xuICBub2RlTGlua2VyOiBzdHJpbmc7XG4gIG5wbU1pbmltYWxBZ2VHYXRlPzogc3RyaW5nO1xuICBucG1QcmVhcHByb3ZlZFBhY2thZ2VzPzogc3RyaW5nW107XG4gIHBsdWdpbnM/OiBQbHVnaW5bXTtcbn0gJiBQYXJ0aWFsPENvbmZpZ3VyYXRpb25WYWx1ZU1hcD47XG5cbmludGVyZmFjZSBQbHVnaW4ge1xuICBjaGVja3N1bTogc3RyaW5nO1xuICBwYXRoOiBzdHJpbmc7XG4gIHNwZWM6IHN0cmluZztcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlWWFybnJjWW1sKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlWWFybnJjWW1sJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHlhcm5yY1ltbFBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcueWFybnJjLnltbCcpO1xuICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybSh5YXJucmNZbWxQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgICBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcueWFybicpLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSlcbiAgICAgICk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgICAgZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAneWFybi5sb2NrJyksIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50VmVyc2lvbiA9IHNwYXduU3luY0FuZFJldHVyblN0ZG91dCgneWFybicsIFsnLS12ZXJzaW9uJ10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICBjb25zdCBsYXRlc3RWZXJzaW9uID0gZ2V0TGF0ZXN0VmVyc2lvbignQHlhcm5wa2cvY2xpJywgY29uZmlnLmRpclBhdGgpO1xuICAgIGlmIChpc05ld2VyVmVyc2lvbihsYXRlc3RWZXJzaW9uLCBjdXJyZW50VmVyc2lvbikpIHtcbiAgICAgIHNwYXduU3luYygneWFybicsIFsnc2V0JywgJ3ZlcnNpb24nLCBsYXRlc3RWZXJzaW9uXSwgY29uZmlnLmRpclBhdGgsIDEpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlbGVhc2VzUGF0aCA9IHBhdGguam9pbihjb25maWcuZGlyUGF0aCwgJy55YXJuJywgJ3JlbGVhc2VzJyk7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIocmVsZWFzZXNQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcihyZWxlYXNlc1BhdGgpKSB7XG4gICAgICBpZiAoZmlsZS5zdGFydHNXaXRoKCd5YXJuLScpICYmICFmaWxlLnN0YXJ0c1dpdGgoYHlhcm4tJHtsYXRlc3RWZXJzaW9ufS5gKSkge1xuICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKHJlbGVhc2VzUGF0aCwgZmlsZSkpKTtcbiAgICAgICAgY29uc29sZS5sb2coJ1JlbW92ZWQnLCBwYXRoLmpvaW4ocmVsZWFzZXNQYXRoLCBmaWxlKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgeWFybnJjUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy55YXJucmMnKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oeWFybnJjUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSk7XG5cbiAgICBsZXQgc2V0dGluZ3MgPSB7fSBhcyBTZXR0aW5ncztcbiAgICB0cnkge1xuICAgICAgc2V0dGluZ3MgPSAoeWFtbC5sb2FkKGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHlhcm5yY1ltbFBhdGgsICd1dGY4JykpIGFzIFNldHRpbmdzIHwgdW5kZWZpbmVkKSA/PyBzZXR0aW5ncztcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gICAgc2V0dGluZ3MuZGVmYXVsdFNlbXZlclJhbmdlUHJlZml4ID0gJyc7XG4gICAgLy8gSW5zdGFsbC10aW1lIHNjcmlwdHMgYXJlIGEgY29tbW9uIHN1cHBseS1jaGFpbiBleGVjdXRpb24gcGF0aC4gS2VlcCB0aGlzXG4gICAgLy8gZXhwbGljaXQgc28gc3RhbGUgcHJvamVjdCBzZXR0aW5ncyBjYW5ub3QgcmUtZW5hYmxlIHRoZW0gZ2xvYmFsbHkuXG4gICAgc2V0dGluZ3MuZW5hYmxlU2NyaXB0cyA9IGZhbHNlO1xuICAgIHNldHRpbmdzLm5vZGVMaW5rZXIgPSAnbm9kZS1tb2R1bGVzJztcbiAgICBzZXR0aW5ncy5ubU1vZGUgPSAnaGFyZGxpbmtzLWdsb2JhbCc7XG4gICAgc2V0dGluZ3MubnBtTWluaW1hbEFnZUdhdGUgPSAnNWQnO1xuICAgIHNldHRpbmdzLmFwcHJvdmVkR2l0UmVwb3NpdG9yaWVzID0gW1xuICAgICAgLy8gWWFybiA0LjE0IGJsb2NrcyBnaXQgZGVwZW5kZW5jaWVzIHVubGVzcyB0aGUgcmVwb3NpdG9yeSBVUkwgaXMgZXhwbGljaXRseSBhbGxvd2VkLlxuICAgICAgJ2h0dHBzOi8vZ2l0aHViLmNvbS9XaWxsQm9vc3Rlci8qLmdpdCcsXG4gICAgICAnc3NoOi8vZ2l0QGdpdGh1Yi5jb20vV2lsbEJvb3N0ZXIvKi5naXQnLFxuICAgICAgJ2h0dHBzOi8vZ2l0aHViLmNvbS9XaWxsQm9vc3RlckxhYi8qLmdpdCcsXG4gICAgICAnc3NoOi8vZ2l0QGdpdGh1Yi5jb20vV2lsbEJvb3N0ZXJMYWIvKi5naXQnLFxuICAgIF07XG4gICAgc2V0dGluZ3MubnBtUHJlYXBwcm92ZWRQYWNrYWdlcyA9IFtcbiAgICAgIC8vIC0tLS0tLS0tLS0gU1RBUlQ6IFdlIGJlbGlldmUgb3VyIHBhY2thZ2VzIGFyZSBzYWZlIC0tLS0tLS0tLS1cbiAgICAgICdAZXhlcmNvZGUvKicsXG4gICAgICAnQHdpbGxib29zdGVyLyonLFxuICAgICAgJ2FnZW50LXJ1bnRpbWUta2l0JyxcbiAgICAgICdhdC1kZWNvcmF0b3JzJyxcbiAgICAgICdidWlsZC10cycsXG4gICAgICAnZ2VuLWkxOG4tdHMnLFxuICAgICAgJ29uZS13YXktZ2l0LXN5bmMnLFxuICAgICAgLy8gLS0tLS0tLS0tLSBFTkQ6IFdlIGJlbGlldmUgb3VyIHBhY2thZ2VzIGFyZSBzYWZlIC0tLS0tLS0tLS1cblxuICAgICAgLy8gVG8gZGVhbCB3aXRoIENWRSBsaWtlIGh0dHBzOi8vbmV4dGpzLm9yZy9ibG9nL0NWRS0yMDI1LTY2NDc4XG4gICAgICAnbmV4dCcsXG4gICAgICAnQG5leHQvKicsXG4gICAgICAnQHR5cGVzLyonLFxuICAgICAgJ0B0eXBlc2NyaXB0LyonLFxuICAgICAgJ0BveGZtdC8qJyxcbiAgICAgICdAb3hsaW50LyonLFxuICAgICAgJ0BveGxpbnQtdHNnb2xpbnQvKicsXG4gICAgICAnb3hmbXQnLFxuICAgICAgJ294bGludCcsXG4gICAgICAnb3hsaW50LXRzZ29saW50JyxcbiAgICAgICdyZWFjdCcsXG4gICAgICAncmVhY3QtZG9tJyxcbiAgICBdO1xuICAgIGRlbGV0ZSBzZXR0aW5ncy5jb21wcmVzc2lvbkxldmVsO1xuICAgIGlmIChzZXR0aW5ncy5pbmplY3RFbnZpcm9ubWVudEZpbGVzPy5sZW5ndGggPT09IDApIHtcbiAgICAgIGRlbGV0ZSBzZXR0aW5ncy5pbmplY3RFbnZpcm9ubWVudEZpbGVzO1xuICAgIH1cbiAgICAvLyBjZi4gaHR0cHM6Ly9naXRodWIuY29tL3lhcm5wa2cvYmVycnkvcHVsbC80Njk4XG4gICAgc2V0dGluZ3MuZW5hYmxlR2xvYmFsQ2FjaGUgPSB0cnVlO1xuICAgIGNvbnN0IG9yaWdpbmFsTGVuZ3RoID0gc2V0dGluZ3MucGx1Z2lucz8ubGVuZ3RoID8/IDA7XG4gICAgc2V0dGluZ3MucGx1Z2lucyA9IHNldHRpbmdzLnBsdWdpbnM/LmZpbHRlcigocCkgPT4gcC5wYXRoICE9PSAnLnlhcm4vcGx1Z2lucy91bmRlZmluZWQuY2pzJykgPz8gW107XG4gICAgaWYgKHNldHRpbmdzLnBsdWdpbnMubGVuZ3RoICE9PSBvcmlnaW5hbExlbmd0aCkge1xuICAgICAgY29uc3QgcGx1Z2luUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy55YXJuJywgJ3BsdWdpbnMnLCAndW5kZWZpbmVkLmNqcycpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBsdWdpblBhdGgsIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgIH1cbiAgICBpZiAoc2V0dGluZ3MucGx1Z2lucy5sZW5ndGggPT09IDApIHtcbiAgICAgIGRlbGV0ZSBzZXR0aW5ncy5wbHVnaW5zO1xuICAgIH1cbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoeWFybnJjWW1sUGF0aCwgeWFtbC5kdW1wKHNldHRpbmdzLCB7IGxpbmVXaWR0aDogLTEgfSkpO1xuXG4gICAgc3Bhd25TeW5jKCd5YXJuJywgWydkbHgnLCAneWFybi1wbHVnaW4tYXV0by1pbnN0YWxsJ10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICAvLyBUaGUgdGFyZ2V0IHJlcG8gbWF5IG5vdCBoYXZlIHByZXR0aWVyIGluc3RhbGxlZCB5ZXQsIGFuZCB5YXJuLXBsdWdpbi1hdXRvLWluc3RhbGwgZWRpdHMgdGhpcyBmaWxlIGFmdGVyIGpzLXlhbWwuXG4gICAgc3Bhd25TeW5jKCd5YXJuJywgZ2V0WWFybnJjUHJldHRpZXJBcmdzKGNvbmZpZy5kaXJQYXRoLCB5YXJucmNZbWxQYXRoKSwgY29uZmlnLmRpclBhdGgpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFlhcm5yY1ByZXR0aWVyQXJncyhkaXJQYXRoOiBzdHJpbmcsIHlhcm5yY1ltbFBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFsnZGx4JywgJ3ByZXR0aWVyJywgJy0tbm8tY29uZmlnJywgJy0td3JpdGUnLCBwYXRoLnJlbGF0aXZlKGRpclBhdGgsIHlhcm5yY1ltbFBhdGgpXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldExhdGVzdFZlcnNpb24ocGFja2FnZU5hbWU6IHN0cmluZywgZGlyUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHNwYXduU3luY0FuZFJldHVyblN0ZG91dCgnbnBtJywgWydzaG93JywgcGFja2FnZU5hbWUsICd2ZXJzaW9uJ10sIGRpclBhdGgpIHx8ICcwLjAuMCc7XG59XG5cbmZ1bmN0aW9uIGlzTmV3ZXJWZXJzaW9uKG5ld1ZlcnNpb246IHN0cmluZywgb2xkVmVyc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHZhbGlkTmV3VmVyc2lvbiA9IHNlbXZlci52YWxpZChuZXdWZXJzaW9uKTtcbiAgaWYgKCF2YWxpZE5ld1ZlcnNpb24pIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gc2VtdmVyLmd0KHZhbGlkTmV3VmVyc2lvbiwgc2VtdmVyLnZhbGlkKG9sZFZlcnNpb24pID8/ICcwLjAuMCcpO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBPY3Rva2l0IH0gZnJvbSAnQG9jdG9raXQvY29yZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdldE9jdG9raXQsIGdpdEh1YlV0aWwsIGhhc0dpdEh1YlRva2VuIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cExhYmVscyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdzZXR1cExhYmVscycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBbb3duZXIsIHJlcG9dID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGNvbmZpZy5yZXBvc2l0b3J5ID8/ICcnKTtcbiAgICBpZiAoIW93bmVyIHx8ICFyZXBvKSByZXR1cm47XG4gICAgaWYgKG93bmVyICE9PSAnV2lsbEJvb3N0ZXInICYmIG93bmVyICE9PSAnV2lsbEJvb3N0ZXJMYWInKSByZXR1cm47XG4gICAgaWYgKCFoYXNHaXRIdWJUb2tlbihvd25lcikpIHJldHVybjtcblxuICAgIGNvbnN0IG9jdG9raXQgPSBnZXRPY3Rva2l0KG93bmVyKTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDE6IHgtZWFzeSA6aGVkZ2Vob2c6JywgJ0VERTlGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2QyOiBlYXN5IDpyYWJiaXQyOicsICdEREQ2RkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkMzogbWVkaXVtIDpveDonLCAnQzRCNUZEJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDQ6IGhhcmQgOnNxdWlkOicsICdBNzhCRkEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkNTogeC1oYXJkIDp3aGFsZTI6JywgJzhCNUNGNicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3AxOiBjcml0aWNhbCA6ZmlyZTo6ZmlyZTo6ZmlyZTonLCAnRUY0NDQ0Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncDI6IHVyZ2VudCA6ZmlyZTo6ZmlyZTonLCAnRjg3MTcxJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncDM6IGltcG9ydGFudCA6ZmlyZTonLCAnRkNBNUE1Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncDQ6IG5pY2UgdG8gaGF2ZSA6ZHJvcGxldDonLCAnRkVDQUNBJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogYmxpdHonLCAnNTMwMGJjJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogZmlyZWJhc2UnLCAnZmZjYTI4Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogcHJpc21hJywgJzBjMzQ0YicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IHJlYWN0JywgJzYxZGFmYicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IHN2ZWx0ZScsICdmZjNlMDAnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiBzZW1hbnRpYy1yZWxlYXNlJywgJzQ5NDk0OScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JlYWR5IDpyb2NrZXQ6JywgJzIyQzU1RScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JldmlldyByZXF1ZXN0ZWQgOm1hZzonLCAnRkJDQTA0Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmVsZWFzZWQgOmJvb2ttYXJrOicsICc2MzY2RjEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiAwLjVoIDpjbG9jazEyMzA6JywgJ0YzRjRGNicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDFoIDpjbG9jazE6JywgJ0U1RTdFQicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDJoIDpjbG9jazI6JywgJ0QxRDVEQicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDNoIDpjbG9jazM6JywgJzlDQTNBRicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDVoIDpjbG9jazU6JywgJzZCNzI4MCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDhoIDpjbG9jazg6JywgJzRCNTU2MycpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDEzaCA6Y2xvY2sxOicsICczNzQxNTEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBidWlsZCA6aGFtbWVyOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBjaG9yZSA6YnJvb206JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGNpIDpjb25zdHJ1Y3Rpb25fd29ya2VyOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBkb2NzIDptZW1vOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBmZWF0IDpzcGFya2xlczonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogZml4IDpidWc6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IHBlcmYgOnphcDonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogcmVmYWN0b3IgOnJlY3ljbGU6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IHN0eWxlIDpsaXBzdGljazonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogdGVzdCA6dGVzdF90dWJlOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdwcm9qZWN0JywgJzI0MjkyRicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2ZvY3VzZWQgOmRhcnQ6JywgJzIyQzU1RScpO1xuXG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2J1ZycpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkb2N1bWVudGF0aW9uJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2R1cGxpY2F0ZScpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdlbmhhbmNlbWVudCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdnb29kIGZpcnN0IGlzc3VlJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2hlbHAgd2FudGVkJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2ludmFsaWQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncXVlc3Rpb24nKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnd29udGZpeCcpO1xuXG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JlYWR5Jyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JldmlldyByZXF1ZXN0ZWQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmVsZWFzZWQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnc2VtYW50aWMtcmVsZWFzZScpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdsbG0tcHIgOnJvYm90OicpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdhaS1wciA6cm9ib3Q6Jyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2dlbi1wci1hbGwgOnJvYm90OicpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdnZW4tcHItY2xhdWRlIDpyb2JvdDonKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZ2VuLXByLWNvZGV4IDpyb2JvdDonKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZ2VuLXByLWdlbWluaSA6cm9ib3Q6Jyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybignU2tpcCBzZXR1cExhYmVscyBkdWUgdG86JywgKGVycm9yIGFzIEVycm9yIHwgdW5kZWZpbmVkKT8uc3RhY2sgPz8gZXJyb3IpO1xuICAgIH1cbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNldHVwTGFiZWwob2N0b2tpdDogT2N0b2tpdCwgb3duZXI6IHN0cmluZywgcmVwbzogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIGNvbG9yOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICAvLyBJc3N1ZXMgcGVybWlzc2lvblxuICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vbGFiZWxzJywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgbmFtZSxcbiAgICAgIGNvbG9yLFxuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICAvLyBJc3N1ZXMgcGVybWlzc2lvblxuICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVscy97bmFtZX0nLCB7XG4gICAgICBvd25lcixcbiAgICAgIHJlcG8sXG4gICAgICBuYW1lLFxuICAgICAgY29sb3IsXG4gICAgfSk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZGVsZXRlTGFiZWwob2N0b2tpdDogT2N0b2tpdCwgb3duZXI6IHN0cmluZywgcmVwbzogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICAvLyBJc3N1ZXMgcGVybWlzc2lvblxuICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHMve25hbWV9Jywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgbmFtZSxcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG4iLCJpbXBvcnQgeyBjcmVhdGVSZXF1aXJlIH0gZnJvbSAnbm9kZTptb2R1bGUnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGRvdGVudiBmcm9tICdkb3RlbnYnO1xuaW1wb3J0IHR5cGUgc29kaXVtTW9kdWxlIGZyb20gJ2xpYnNvZGl1bS13cmFwcGVycyc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdldE9jdG9raXQsIGdpdEh1YlV0aWwsIGhhc0dpdEh1YlRva2VuIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmNvbnN0IERFUFJFQ0FURURfU0VDUkVUX05BTUVTID0gWydSRUFEWV9ESVNDT1JEX1dFQkhPT0tfVVJMJywgJ0dIX0JPVF9QQVQnLCAnUFVCTElDX0dIX0JPVF9QQVQnXTtcbmNvbnN0IHJlcXVpcmUgPSBjcmVhdGVSZXF1aXJlKGltcG9ydC5tZXRhLnVybCk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cFNlY3JldHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignc2V0dXBTZWNyZXRzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IFtvd25lciwgcmVwb10gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUoY29uZmlnLnJlcG9zaXRvcnkgPz8gJycpO1xuICAgIGlmICghb3duZXIgfHwgIXJlcG8gfHwgb3duZXIgIT09ICdXaWxsQm9vc3RlckxhYicpIHJldHVybjtcbiAgICBpZiAoIWhhc0dpdEh1YlRva2VuKG93bmVyKSB8fCAhb3B0aW9ucy5kb2VzVXBsb2FkRW52VmFycykgcmV0dXJuO1xuXG4gICAgY29uc3QgcGFyc2VkID0gZG90ZW52LmNvbmZpZyh7IHBhdGg6IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lbnYnKSwgcXVpZXQ6IHRydWUgfSkucGFyc2VkID8/IHt9O1xuICAgIGlmIChPYmplY3Qua2V5cyhwYXJzZWQpLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2N0b2tpdCA9IGdldE9jdG9raXQob3duZXIpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGZvciAoY29uc3Qgc2VjcmV0TmFtZSBvZiBERVBSRUNBVEVEX1NFQ1JFVF9OQU1FUykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIFJlcXVpcmVzIFNlY3JldHMgcGVybWlzc2lvblxuICAgICAgICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3NlY3JldHMve3NlY3JldF9uYW1lfScsIHtcbiAgICAgICAgICAgIG93bmVyLFxuICAgICAgICAgICAgcmVwbyxcbiAgICAgICAgICAgIHNlY3JldF9uYW1lOiBzZWNyZXROYW1lLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gUmVxdWlyZXMgU2VjcmV0cyBwZXJtaXNzaW9uXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG9jdG9raXQucmVxdWVzdCgnR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3NlY3JldHMvcHVibGljLWtleScsIHtcbiAgICAgICAgb3duZXIsXG4gICAgICAgIHJlcG8sXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHsga2V5LCBrZXlfaWQ6IGtleUlkIH0gPSByZXNwb25zZS5kYXRhO1xuXG4gICAgICBjb25zdCBzb2RpdW0gPSBnZXRTb2RpdW0oKTtcbiAgICAgIGF3YWl0IHNvZGl1bS5yZWFkeTtcblxuICAgICAgZm9yIChjb25zdCBbbmFtZSwgc2VjcmV0XSBvZiBPYmplY3QuZW50cmllcyhwYXJzZWQpKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBuYW1lID09PSAnR0hfQk9UX1BBVCcgfHxcbiAgICAgICAgICBuYW1lID09PSAnR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVInIHx8XG4gICAgICAgICAgbmFtZSA9PT0gJ0dIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSTEFCJ1xuICAgICAgICApIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbnZlcnQgU2VjcmV0ICYgQmFzZTY0IGtleSB0byBVaW50OEFycmF5LlxuICAgICAgICBjb25zdCByYXdLZXkgPSBzb2RpdW0uZnJvbV9iYXNlNjQoa2V5LCBzb2RpdW0uYmFzZTY0X3ZhcmlhbnRzLk9SSUdJTkFMKTtcbiAgICAgICAgY29uc3QgcmF3U2VjID0gc29kaXVtLmZyb21fc3RyaW5nKHNlY3JldCk7XG5cbiAgICAgICAgLy8gRW5jcnlwdCB0aGUgc2VjcmV0IHVzaW5nIExpYlNvZGl1bVxuICAgICAgICBjb25zdCBlbmNCeXRlcyA9IHNvZGl1bS5jcnlwdG9fYm94X3NlYWwocmF3U2VjLCByYXdLZXkpO1xuXG4gICAgICAgIC8vIENvbnZlcnQgZW5jcnlwdGVkIFVpbnQ4QXJyYXkgdG8gQmFzZTY0XG4gICAgICAgIGNvbnN0IGVuY0Jhc2U2NCA9IHNvZGl1bS50b19iYXNlNjQoZW5jQnl0ZXMsIHNvZGl1bS5iYXNlNjRfdmFyaWFudHMuT1JJR0lOQUwpO1xuXG4gICAgICAgIC8vIFJlcXVpcmVzIFNlY3JldHMgcGVybWlzc2lvblxuICAgICAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ1BVVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9zZWNyZXRzL3tzZWNyZXRfbmFtZX0nLCB7XG4gICAgICAgICAgb3duZXIsXG4gICAgICAgICAgcmVwbyxcbiAgICAgICAgICBzZWNyZXRfbmFtZTogbmFtZSxcbiAgICAgICAgICBlbmNyeXB0ZWRfdmFsdWU6IGVuY0Jhc2U2NCxcbiAgICAgICAgICBrZXlfaWQ6IGtleUlkLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKCdTa2lwIHNldHVwU2VjcmV0cyBkdWUgdG86JywgKGVycm9yIGFzIEVycm9yIHwgdW5kZWZpbmVkKT8uc3RhY2sgPz8gZXJyb3IpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldFNvZGl1bSgpOiB0eXBlb2Ygc29kaXVtTW9kdWxlIHtcbiAgLy8gbGlic29kaXVtLXdyYXBwZXJzJyBFU00gZW50cnkgY2FuIGJpbmQgdG8gbGlic29kaXVtQDAuOC4zLCB3aG9zZSBkZWZhdWx0XG4gIC8vIGV4cG9ydCBubyBsb25nZXIgZXhwb3NlcyByZWFkeS4gVGhlIENvbW1vbkpTIGVudHJ5IGtlZXBzIHRoZSBBUEkgc2hhcGUuXG4gIHJldHVybiByZXF1aXJlKCdsaWJzb2RpdW0td3JhcHBlcnMnKSBhcyB0eXBlb2Ygc29kaXVtTW9kdWxlO1xufVxuIiwiaW1wb3J0IHsgd2l0aFJldHJ5IH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWIvc3JjJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2V0T2N0b2tpdCwgZ2l0SHViVXRpbCwgaGFzR2l0SHViVG9rZW4gfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwR2l0SHViU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignc2V0dXBHaXRIdWJTZXR0aW5ncycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBbb3duZXIsIHJlcG9dID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGNvbmZpZy5yZXBvc2l0b3J5ID8/ICcnKTtcbiAgICBpZiAoIW93bmVyIHx8ICFyZXBvKSByZXR1cm47XG4gICAgaWYgKG93bmVyICE9PSAnV2lsbEJvb3N0ZXInICYmIG93bmVyICE9PSAnV2lsbEJvb3N0ZXJMYWInKSByZXR1cm47XG4gICAgaWYgKCFoYXNHaXRIdWJUb2tlbihvd25lcikpIHJldHVybjtcblxuICAgIGNvbnN0IG9jdG9raXQgPSBnZXRPY3Rva2l0KG93bmVyKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBSZXBvc2l0b3J5IHNldHRpbmdzIG5lZWQgYWRtaW5pc3RyYXRpb24gcGVybWlzc2lvbiwgdW5saWtlIGZpbGUgZ2VuZXJhdGlvbi5cbiAgICAgIGF3YWl0IHdpdGhSZXRyeShcbiAgICAgICAgKCkgPT5cbiAgICAgICAgICBvY3Rva2l0LnJlcXVlc3QoJ1BBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfScsIHtcbiAgICAgICAgICAgIG93bmVyLFxuICAgICAgICAgICAgcmVwbyxcbiAgICAgICAgICAgIGFsbG93X2F1dG9fbWVyZ2U6IHRydWUsXG4gICAgICAgICAgICBhbGxvd19tZXJnZV9jb21taXQ6IGZhbHNlLFxuICAgICAgICAgICAgYWxsb3dfc3F1YXNoX21lcmdlOiB0cnVlLFxuICAgICAgICAgICAgYWxsb3dfcmViYXNlX21lcmdlOiBmYWxzZSxcbiAgICAgICAgICAgIGFsbG93X3VwZGF0ZV9icmFuY2g6IHRydWUsXG4gICAgICAgICAgICBkZWxldGVfYnJhbmNoX29uX21lcmdlOiB0cnVlLFxuICAgICAgICAgICAgc3F1YXNoX21lcmdlX2NvbW1pdF90aXRsZTogJ1BSX1RJVExFJyxcbiAgICAgICAgICAgIHNxdWFzaF9tZXJnZV9jb21taXRfbWVzc2FnZTogJ0JMQU5LJyxcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgJ1gtR2l0SHViLUFwaS1WZXJzaW9uJzogJzIwMjItMTEtMjgnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC4uLihjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyLycpID8geyBhbGxvd19hdXRvX21lcmdlOiB0cnVlIH0gOiB7fSksXG4gICAgICAgICAgfSksXG4gICAgICAgIHtcbiAgICAgICAgICBzaG91bGRSZXRyeTogKGVycm9yKSA9PiAhaXNHaXRIdWJQZXJtaXNzaW9uT3JWaXNpYmlsaXR5RXJyb3IoZXJyb3IpLFxuICAgICAgICB9XG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoIWlzR2l0SHViUGVybWlzc2lvbk9yVmlzaWJpbGl0eUVycm9yKGVycm9yKSkgdGhyb3cgZXJyb3I7XG5cbiAgICAgIC8vIExvY2FsIHdiZnkgcnVucyBvZnRlbiBoYXZlIHB1c2ggcGVybWlzc2lvbiB3aXRob3V0IGFkbWluIHBlcm1pc3Npb24uXG4gICAgICBjb25zb2xlLndhcm4oJ1NraXAgc2V0dXBHaXRIdWJTZXR0aW5ncyBkdWUgdG86JywgKGVycm9yIGFzIEVycm9yIHwgdW5kZWZpbmVkKT8uc3RhY2sgPz8gZXJyb3IpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGlzR2l0SHViUGVybWlzc2lvbk9yVmlzaWJpbGl0eUVycm9yKGVycm9yOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmICghZXJyb3IgfHwgdHlwZW9mIGVycm9yICE9PSAnb2JqZWN0JyB8fCAhKCdzdGF0dXMnIGluIGVycm9yKSkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gZXJyb3Iuc3RhdHVzID09PSA0MDEgfHwgZXJyb3Iuc3RhdHVzID09PSA0MDMgfHwgZXJyb3Iuc3RhdHVzID09PSA0MDQ7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBkaXN0YW5jZSB9IGZyb20gJ2Zhc3Rlc3QtbGV2ZW5zaHRlaW4nO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IHBhY2thZ2VNYW5hZ2VyUnVuUGxhY2Vob2xkZXIgPSAnX19QTV9SVU5fXyc7XG5cbmNvbnN0IHRlbXBsYXRlcyA9IHtcbiAgJ3B1bGxfcmVxdWVzdF90ZW1wbGF0ZS5tZCc6IGBcbkNsb3NlICM8SXNzdWVOdW1iZXI+XG5cbiMjIFNlbGYgQ2hlY2tcblxuLSBbIF0gSSd2ZSBjb25maXJtZWQgXFxgQWxsIGNoZWNrcyBoYXZlIHBhc3NlZFxcYCBvbiB0aGlzIHBhZ2UuXG4gIC0gUFIgdGl0bGUgZm9sbG93cyBbQW5ndWxhcidzIGNvbW1pdCBtZXNzYWdlIGZvcm1hdF0oaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9ibG9iL21haW4vQ09OVFJJQlVUSU5HLm1kIy1jb21taXQtbWVzc2FnZS1mb3JtYXQpLlxuICAtIFBSIHRpdGxlIGRvZXNuJ3QgaGF2ZSBcXGBXSVA6XFxgLlxuICAtIFRoZSB0ZXN0IGNvbW1hbmQgKGUuZy4sIFxcYCR7cGFja2FnZU1hbmFnZXJSdW5QbGFjZWhvbGRlcn0gdGVzdFxcYCkgcGFzc2VkLlxuICAtIFRoZSBsaW50IGNvbW1hbmQgKGUuZy4sIFxcYCR7cGFja2FnZU1hbmFnZXJSdW5QbGFjZWhvbGRlcn0gbGludFxcYCkgcGFzc2VkLlxuICAtIFlvdSBtYXkgbGVhdmUgdGhpcyBib3ggdW5jaGVja2VkIGR1ZSB0byBsb25nIHdvcmtmbG93cy5cbi0gWyBdIEkndmUgcmV2aWV3ZWQgbXkgY2hhbmdlcyBvbiB0aGUgR2l0SHViIGRpZmYgdmlldy5cbi0gWyBdIEkndmUgd3JpdHRlbiB0aGUgc3RlcHMgdG8gdGVzdCBteSBjaGFuZ2VzLlxuLSBbIF0gSSd2ZSBhZGRlZCBzY3JlZW5zaG90cyAoaWYgdGhlIFVJIGNoYW5nZWQpLlxuICAtIFlvdSBtYXkgbGVhdmUgdGhpcyBib3ggdW5jaGVja2VkIGlmIHlvdSBkaWRuJ3QgbW9kaWZ5IHRoZSBVSS5cblxuPCEtLSBQbGVhc2UgYWRkIHNjcmVlbnNob3RzIGlmIHlvdSBtb2RpZnkgdGhlIFVJLlxufCBDdXJyZW50ICAgICAgICAgICAgICAgICAgfCBJbiBjb21pbmcgICAgICAgICAgICAgICAgfFxufCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfFxufCA8aW1nIHNyYz1cIlwiIHdpZHRoPVwiNDAwXCI+IHwgPGltZyBzcmM9XCJcIiB3aWR0aD1cIjQwMFwiPiB8XG4tLT5cblxuPCEtLSBQbGVhc2UgYWRkIHN0ZXBzIHRvIHRlc3QgeW91ciBjaGFuZ2VzLlxuIyMgU3RlcHMgdG8gVGVzdFxuXG4xLiBPcGVuIGh0dHA6Ly9sb2NhbGhvc3QtZXhlcmNvZGUud2lsbGJvb3N0ZXIubmV0OjMwMDAvamEtSlAvY291cnNlcy9fZXhhbXBsZS9sZXNzb25zL19leGFtcGxlX2FfcGx1c19iL3Byb2JsZW1zL19leGFtcGxlX2FfcGx1c19iIGFmdGVyIGxvZ2luLlxuMi4gU2VsZWN0IHRoZSBsYW5ndWFnZSBcXGBDXFxgLlxuMy4gV3JpdGUgdGhlIGZvbGxvd2luZyBjb2RlOlxuICAgXFxgXFxgXFxgY1xuICAgI2luY2x1ZGUgPHN0ZGlvLmg+XG5cbiAgIGludCBtYWluKHZvaWQpIHtcbiAgICAgaW50IGEsIGI7XG5cbiAgICAgc2NhbmYoXCIlZCAlZFwiLCAmYSwgJmIpO1xuICAgICBwcmludGYoXCIlZFwiLCBhICsgYik7XG4gICAgIHJldHVybiAwO1xuICAgfVxuICAgXFxgXFxgXFxgXG40LiBQdXNoIFxcYFN1Ym1pdFxcYCBidXR0b24uXG41LiAuLi5cbi0tPlxuYC50cmltKCksXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFjb25maWcuaXNXaWxsQm9vc3RlclJlcG8pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtmaWxlTmFtZSwgbmV3Q29udGVudF0gb2YgT2JqZWN0LmVudHJpZXModGVtcGxhdGVzKSkge1xuICAgICAgY29uc3QgY29udGVudCA9IGFwcGx5UGFja2FnZU1hbmFnZXJUZW1wbGF0ZShuZXdDb250ZW50LCBjb25maWcpO1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aHViJywgZmlsZU5hbWUpO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSB7XG4gICAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgICAgaWYgKGRpc3RhbmNlKG9sZENvbnRlbnQsIGNvbnRlbnQpID4gY29udGVudC5sZW5ndGggLyAyKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb250ZW50KSk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gYXBwbHlQYWNrYWdlTWFuYWdlclRlbXBsYXRlKHRlbXBsYXRlOiBzdHJpbmcsIGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIGNvbnN0IHBhY2thZ2VNYW5hZ2VyQ29tbWFuZCA9IGNvbmZpZy5pc0J1biA/ICdidW4gcnVuJyA6ICd5YXJuJztcbiAgcmV0dXJuIHRlbXBsYXRlLnJlcGxhY2VBbGwocGFja2FnZU1hbmFnZXJSdW5QbGFjZWhvbGRlciwgcGFja2FnZU1hbmFnZXJDb21tYW5kKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBmc3AgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcbmltcG9ydCB7IHNpbXBsZUdpdCB9IGZyb20gJ3NpbXBsZS1naXQnO1xuaW1wb3J0IHRvbWwgZnJvbSAnc21vbC10b21sJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5cbmltcG9ydCB7IGdldE9jdG9raXQsIGdpdEh1YlV0aWwgfSBmcm9tICcuL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJy4vdXRpbHMvZ2xvYlV0aWwuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBhY2thZ2VDb25maWcge1xuICBkaXJQYXRoOiBzdHJpbmc7XG4gIGRvY2tlcmZpbGU6IHN0cmluZztcbiAgaXNSb290OiBib29sZWFuO1xuICBpc1B1YmxpY1JlcG86IGJvb2xlYW47XG4gIGlzUmVmZXJyZWRCeU90aGVyUmVwbzogYm9vbGVhbjtcbiAgcmVwb3NpdG9yeT86IHN0cmluZztcbiAgcmVwb0F1dGhvcj86IHN0cmluZztcbiAgcmVwb05hbWU/OiBzdHJpbmc7XG4gIGlzV2lsbEJvb3N0ZXJSZXBvOiBib29sZWFuO1xuICBpc0J1bjogYm9vbGVhbjtcbiAgaXNFc21QYWNrYWdlOiBib29sZWFuO1xuICBpc1dpbGxCb29zdGVyQ29uZmlnczogYm9vbGVhbjtcbiAgLy8gZGVwZW5kZW5jeSBpbmZvcm1hdGlvblxuICBkb2VzQ29udGFpblN1YlBhY2thZ2VKc29uczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Eb2NrZXJmaWxlOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkdlbWZpbGU6IGJvb2xlYW47XG4gIGRvZXNDb250YWluR29Nb2Q6IGJvb2xlYW47XG4gIGRvZXNDb250YWluUGFja2FnZUpzb246IGJvb2xlYW47XG4gIGRvZXNDb250YWluUG9ldHJ5TG9jazogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5VdkxvY2s6IGJvb2xlYW47XG4gIGRvZXNDb250YWluUG9tWG1sOiBib29sZWFuO1xuICBkb2VzQ29udGFpblB1YnNwZWNZYW1sOiBib29sZWFuO1xuICBkb2VzQ29udGFpblRlbXBsYXRlWWFtbDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Wc2NvZGVTZXR0aW5nc0pzb246IGJvb2xlYW47XG4gIC8vIHNvdXJjZSBjb2RlIGZpbGVzXG4gIGRvZXNDb250YWluSmF2YVNjcmlwdDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5UeXBlU2NyaXB0OiBib29sZWFuO1xuICBkb2VzQ29udGFpbkpzeE9yVHN4OiBib29sZWFuO1xuICBkb2VzQ29udGFpbkphdmE6IGJvb2xlYW47XG4gIGRvZXNDb250YWluSmF2YVNjcmlwdEluUGFja2FnZXM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluSnN4T3JUc3hJblBhY2thZ2VzOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkphdmFJblBhY2thZ2VzOiBib29sZWFuO1xuXG4gIGRlcGVuZGluZzoge1xuICAgIGJsaXR6OiBib29sZWFuO1xuICAgIGZpcmViYXNlOiBib29sZWFuO1xuICAgIGdlbkkxOG5UczogYm9vbGVhbjtcbiAgICBsaXRlc3RyZWFtOiBib29sZWFuO1xuICAgIG5leHQ6IGJvb2xlYW47XG4gICAgcGxheXdyaWdodFRlc3Q6IGJvb2xlYW47XG4gICAgcHJpc21hOiBib29sZWFuO1xuICAgIHB5cmlnaHQ6IGJvb2xlYW47XG4gICAgcmVhY3Q6IGJvb2xlYW47XG4gICAgcmVhY3ROYXRpdmU6IGJvb2xlYW47XG4gICAgc2VtYW50aWNSZWxlYXNlOiBib29sZWFuO1xuICAgIHN0b3J5Ym9vazogYm9vbGVhbjtcbiAgICB3YjogYm9vbGVhbjtcbiAgfTtcbiAgcmVsZWFzZToge1xuICAgIGJyYW5jaGVzOiBzdHJpbmdbXTtcbiAgICBnaXRodWI6IGJvb2xlYW47XG4gICAgbnBtOiBib29sZWFuO1xuICB9O1xuICBoYXNWZXJzaW9uU2V0dGluZ3M6IGJvb2xlYW47XG4gIG1pc2VUYXNrczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgcGFja2FnZUpzb24/OiBQYWNrYWdlSnNvbjtcbiAgd2JmeUpzb24/OiBXYmZ5SnNvbjtcbn1cblxudHlwZSBXYmZ5SnNvbiA9IHouaW5mZXI8dHlwZW9mIHdiZnlKc29uU2NoZW1hPjtcblxuY29uc3Qgd2JmeUpzb25TY2hlbWEgPSB6Lm9iamVjdCh7XG4gIHR5cG9zOiB6XG4gICAgLm9iamVjdCh7XG4gICAgICBhbGw6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgICBkb2M6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgICB0czogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICAgIHRleHQ6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgfSlcbiAgICAub3B0aW9uYWwoKSxcbn0pO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UGFja2FnZUNvbmZpZyhcbiAgZGlyUGF0aDogc3RyaW5nLFxuICByb290Q29uZmlnPzogUGFja2FnZUNvbmZpZ1xuKTogUHJvbWlzZTxQYWNrYWdlQ29uZmlnIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIHRyeSB7XG4gICAgY29uc3QgZG9lc0NvbnRhaW5QYWNrYWdlSnNvbiA9IGZzLmV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKTtcbiAgICBsZXQgZGVwZW5kZW5jaWVzOiBQYWNrYWdlSnNvblsnZGVwZW5kZW5jaWVzJ10gPSB7fTtcbiAgICBsZXQgZGV2RGVwZW5kZW5jaWVzOiBQYWNrYWdlSnNvblsnZGV2RGVwZW5kZW5jaWVzJ10gPSB7fTtcbiAgICBsZXQgcGFja2FnZUpzb246IFBhY2thZ2VKc29uID0ge307XG4gICAgbGV0IGVzbVBhY2thZ2UgPSBmYWxzZTtcbiAgICBpZiAoZG9lc0NvbnRhaW5QYWNrYWdlSnNvbikge1xuICAgICAgY29uc3QgcGFja2FnZUpzb25UZXh0ID0gZnMucmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShwYWNrYWdlSnNvblRleHQpIGFzIFBhY2thZ2VKc29uO1xuICAgICAgZGVwZW5kZW5jaWVzID0gcGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgZGV2RGVwZW5kZW5jaWVzID0gcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgZXNtUGFja2FnZSA9IHBhY2thZ2VKc29uLnR5cGUgPT09ICdtb2R1bGUnO1xuICAgIH1cblxuICAgIGxldCByZWxlYXNlQnJhbmNoZXM6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IHJlbGVhc2VQbHVnaW5zOiBzdHJpbmdbXSA9IFtdO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZWxlYXNlcmNKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLnJlbGVhc2VyYy5qc29uJyk7XG4gICAgICBjb25zdCBqc29uID0gSlNPTi5wYXJzZShhd2FpdCBmc3AucmVhZEZpbGUocmVsZWFzZXJjSnNvblBhdGgsICd1dGY4JykpIGFzXG4gICAgICAgIHwge1xuICAgICAgICAgICAgYnJhbmNoZXM6IHN0cmluZ1tdO1xuICAgICAgICAgICAgcGx1Z2lucz86IHN0cmluZ1tdW107XG4gICAgICAgICAgfVxuICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICAgIHJlbGVhc2VCcmFuY2hlcyA9IGpzb24/LmJyYW5jaGVzID8/IFtdO1xuICAgICAgcmVsZWFzZVBsdWdpbnMgPSBqc29uPy5wbHVnaW5zPy5mbGF0KCkgPz8gW107XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgY29uc3QgaXNSb290ID1cbiAgICAgIHBhdGguYmFzZW5hbWUocGF0aC5yZXNvbHZlKGRpclBhdGgsICcuLicpKSAhPT0gJ3BhY2thZ2VzJyB8fFxuICAgICAgIWZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICcuLicsICcuLicsICdwYWNrYWdlLmpzb24nKSk7XG5cbiAgICBsZXQgcmVwb0luZm86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICAgIGlmIChpc1Jvb3QpIHtcbiAgICAgIHJlcG9JbmZvID0gYXdhaXQgZmV0Y2hSZXBvSW5mbyhkaXJQYXRoLCBwYWNrYWdlSnNvbik7XG4gICAgfVxuXG4gICAgbGV0IGhhc1ZlcnNpb25TZXR0aW5ncyA9IGhhc1ZlcnNpb25TZXR0aW5nc0ZpbGUoZGlyUGF0aCk7XG4gICAgZm9yIChjb25zdCBwcmVmaXggb2YgWydqYXZhJywgJ25vZGUnLCAncHl0aG9uJ10pIHtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCBgLiR7cHJlZml4fS12ZXJzaW9uYCkpKSB7XG4gICAgICAgIGhhc1ZlcnNpb25TZXR0aW5ncyA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBkb2NrZXJmaWxlID0gJyc7XG4gICAgdHJ5IHtcbiAgICAgIGRvY2tlcmZpbGUgPSBhd2FpdCBmc3AucmVhZEZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsICdEb2NrZXJmaWxlJyksICd1dGY4Jyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgLy8gUmVhZCB3YmZ5Lmpzb25cbiAgICBjb25zdCB3YmZ5SnNvblBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3diZnkuanNvbicpO1xuICAgIGxldCB3YmZ5SnNvbjogV2JmeUpzb24gfCB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHdiZnlKc29uVGV4dCA9IGF3YWl0IGZzcC5yZWFkRmlsZSh3YmZ5SnNvblBhdGgsICd1dGY4Jyk7XG4gICAgICB3YmZ5SnNvbiA9IHdiZnlKc29uU2NoZW1hLnBhcnNlKEpTT04ucGFyc2Uod2JmeUpzb25UZXh0KSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgY29uc3QgcmVwb0Z1bGxOYW1lID0gdHlwZW9mIHJlcG9JbmZvPy5mdWxsX25hbWUgPT09ICdzdHJpbmcnID8gcmVwb0luZm8uZnVsbF9uYW1lIDogdW5kZWZpbmVkO1xuICAgIGxldCByZXBvQXV0aG9yOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHJlcG9OYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHJlcG9GdWxsTmFtZSkge1xuICAgICAgY29uc3QgcmVwb1BhcnRzID0gcmVwb0Z1bGxOYW1lLnNwbGl0KCcvJyk7XG4gICAgICBpZiAocmVwb1BhcnRzLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgIHJlcG9BdXRob3IgPSByZXBvUGFydHNbMF07XG4gICAgICAgIHJlcG9OYW1lID0gcmVwb1BhcnRzWzFdO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCByZXBvc2l0b3J5ID0gcmVwb0Z1bGxOYW1lID8gYGdpdGh1Yjoke3JlcG9GdWxsTmFtZX1gIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGNvbmZpZzogUGFja2FnZUNvbmZpZyA9IHtcbiAgICAgIGRpclBhdGgsXG4gICAgICBkb2NrZXJmaWxlLFxuICAgICAgaXNSb290LFxuICAgICAgaXNQdWJsaWNSZXBvOiByZXBvSW5mbz8ucHJpdmF0ZSA9PT0gZmFsc2UsXG4gICAgICBpc1JlZmVycmVkQnlPdGhlclJlcG86ICEhcGFja2FnZUpzb24uZmlsZXMsXG4gICAgICByZXBvc2l0b3J5LFxuICAgICAgcmVwb0F1dGhvcixcbiAgICAgIHJlcG9OYW1lLFxuICAgICAgaXNXaWxsQm9vc3RlclJlcG86IEJvb2xlYW4oXG4gICAgICAgIHJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3Rlci8nKSB8fCByZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJylcbiAgICAgICksXG4gICAgICBpc0J1bjogcm9vdENvbmZpZz8uaXNCdW4gfHwgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ2J1bi5sb2NrJykpLFxuICAgICAgaXNFc21QYWNrYWdlOiBlc21QYWNrYWdlLFxuICAgICAgaXNXaWxsQm9vc3RlckNvbmZpZ3M6IHBhY2thZ2VKc29uUGF0aC5pbmNsdWRlcygnL3dpbGxib29zdGVyLWNvbmZpZ3MnKSxcbiAgICAgIGRvZXNDb250YWluU3ViUGFja2FnZUpzb25zOiBjb250YWluc0FueSgncGFja2FnZXMvKiovcGFja2FnZS5qc29uJywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbkRvY2tlcmZpbGU6ICEhZG9ja2VyZmlsZSB8fCBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnZG9ja2VyLWNvbXBvc2UueW1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5HZW1maWxlOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnR2VtZmlsZScpKSxcbiAgICAgIGRvZXNDb250YWluR29Nb2Q6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdnby5tb2QnKSksXG4gICAgICBkb2VzQ29udGFpblBhY2thZ2VKc29uOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncGFja2FnZS5qc29uJykpLFxuICAgICAgZG9lc0NvbnRhaW5Qb2V0cnlMb2NrOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncG9ldHJ5LmxvY2snKSksXG4gICAgICBkb2VzQ29udGFpblV2TG9jazogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3V2LmxvY2snKSksXG4gICAgICBkb2VzQ29udGFpblBvbVhtbDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BvbS54bWwnKSksXG4gICAgICBkb2VzQ29udGFpblB1YnNwZWNZYW1sOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncHVic3BlYy55YW1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5UZW1wbGF0ZVlhbWw6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICd0ZW1wbGF0ZS55YW1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5Wc2NvZGVTZXR0aW5nc0pzb246IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICcudnNjb2RlJywgJ3NldHRpbmdzLmpzb24nKSksXG4gICAgICBkb2VzQ29udGFpbkphdmFTY3JpcHQ6IGNvbnRhaW5zQW55KCd7YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4fScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5UeXBlU2NyaXB0OiBjb250YWluc0FueSgne2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjdHMsbXRzLHRzLHRzeH0nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluSnN4T3JUc3g6IGNvbnRhaW5zQW55KCd7YXBwLHNyYyx0ZXN0fS8qKi8qLnt0LGp9c3gnLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluSmF2YTogY29udGFpbnNBbnkoJyoqLyouamF2YScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5KYXZhU2NyaXB0SW5QYWNrYWdlczogY29udGFpbnNBbnkoJ3BhY2thZ2VzLyoqL3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3h9JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzOiBjb250YWluc0FueSgncGFja2FnZXMvKiove2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjdHMsbXRzLHRzLHRzeH0nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluSnN4T3JUc3hJblBhY2thZ2VzOiBjb250YWluc0FueSgncGFja2FnZXMvKiove2FwcCxzcmMsdGVzdH0vKiovKi57dCxqfXN4JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbkphdmFJblBhY2thZ2VzOiBjb250YWluc0FueSgncGFja2FnZXMvKiovKi5qYXZhJywgZGlyUGF0aCksXG4gICAgICBkZXBlbmRpbmc6IHtcbiAgICAgICAgYmxpdHo6ICEhZGVwZW5kZW5jaWVzLmJsaXR6LFxuICAgICAgICBmaXJlYmFzZTogISFkZXZEZXBlbmRlbmNpZXNbJ2ZpcmViYXNlLXRvb2xzJ10sXG4gICAgICAgIGdlbkkxOG5UczogISFkZXBlbmRlbmNpZXNbJ2dlbi1pMThuLXRzJ10gfHwgISFkZXZEZXBlbmRlbmNpZXNbJ2dlbi1pMThuLXRzJ10sXG4gICAgICAgIGxpdGVzdHJlYW06IGRvY2tlcmZpbGUuaW5jbHVkZXMoJ2luc3RhbGwtbGl0ZXN0cmVhbS5zaCcpLFxuICAgICAgICByZWFjdDogISFkZXBlbmRlbmNpZXMucmVhY3QsXG4gICAgICAgIG5leHQ6ICEhZGVwZW5kZW5jaWVzLm5leHQsXG4gICAgICAgIHBsYXl3cmlnaHRUZXN0OlxuICAgICAgICAgICEhZGVwZW5kZW5jaWVzWydAcGxheXdyaWdodC90ZXN0J10gfHwgISFkZXZEZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXSB8fCAhIWRldkRlcGVuZGVuY2llcy5wbGF5d3JpZ2h0LFxuICAgICAgICBwcmlzbWE6ICEhZGVwZW5kZW5jaWVzWydAcHJpc21hL2NsaWVudCddIHx8ICEhZGV2RGVwZW5kZW5jaWVzLnByaXNtYSxcbiAgICAgICAgcHlyaWdodDogISFkZXZEZXBlbmRlbmNpZXMucHlyaWdodCxcbiAgICAgICAgcmVhY3ROYXRpdmU6ICEhZGVwZW5kZW5jaWVzWydyZWFjdC1uYXRpdmUnXSxcbiAgICAgICAgc2VtYW50aWNSZWxlYXNlOiAhIShcbiAgICAgICAgICBkZXZEZXBlbmRlbmNpZXNbJ3NlbWFudGljLXJlbGVhc2UnXSB8fFxuICAgICAgICAgIHJlbGVhc2VCcmFuY2hlcy5sZW5ndGggPiAwIHx8XG4gICAgICAgICAgcmVsZWFzZVBsdWdpbnMubGVuZ3RoID4gMFxuICAgICAgICApLFxuICAgICAgICBzdG9yeWJvb2s6ICEhZGV2RGVwZW5kZW5jaWVzWydAc3Rvcnlib29rL3JlYWN0J10sXG4gICAgICAgIHdiOiAhIWRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3diJ10gfHwgISFkZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci93YiddLFxuICAgICAgfSxcbiAgICAgIHJlbGVhc2U6IHtcbiAgICAgICAgYnJhbmNoZXM6IHJlbGVhc2VCcmFuY2hlcyxcbiAgICAgICAgZ2l0aHViOiByZWxlYXNlUGx1Z2lucy5pbmNsdWRlcygnQHNlbWFudGljLXJlbGVhc2UvZ2l0aHViJyksXG4gICAgICAgIG5wbTogcmVsZWFzZVBsdWdpbnMuaW5jbHVkZXMoJ0BzZW1hbnRpYy1yZWxlYXNlL25wbScpLFxuICAgICAgfSxcbiAgICAgIGhhc1ZlcnNpb25TZXR0aW5ncyxcbiAgICAgIG1pc2VUYXNrczogYXdhaXQgcmVhZE1pc2VUYXNrcyhkaXJQYXRoKSxcbiAgICAgIHBhY2thZ2VKc29uLFxuICAgICAgd2JmeUpzb24sXG4gICAgfTtcbiAgICBpZiAoXG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5HZW1maWxlIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5Hb01vZCB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24gfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2sgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblV2TG9jayB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluUG9tWG1sIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluVGVtcGxhdGVZYW1sXG4gICAgKSB7XG4gICAgICByZXR1cm4gY29uZmlnO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhc1ZlcnNpb25TZXR0aW5nc0ZpbGUoZGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGN1cnJlbnQgPSBwYXRoLnJlc29sdmUoZGlyUGF0aCk7XG4gIHJldHVybiAoXG4gICAgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY3VycmVudCwgJ21pc2UudG9tbCcpKSB8fFxuICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGN1cnJlbnQsICcubWlzZS50b21sJykpIHx8XG4gICAgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY3VycmVudCwgJy50b29sLXZlcnNpb25zJykpXG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRNaXNlVGFza3MoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiB7XG4gIGNvbnN0IHRhc2tzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGZvciAoY29uc3QgZmlsZU5hbWUgb2YgWydtaXNlLnRvbWwnLCAnLm1pc2UudG9tbCddKSB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgZmlsZU5hbWUpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzZXR0aW5ncyA9IHRvbWwucGFyc2UoYXdhaXQgZnNwLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpKSBhcyB7IHRhc2tzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfTtcbiAgICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhzZXR0aW5ncy50YXNrcyA/PyB7fSkpIHtcbiAgICAgICAgdGFza3NbbmFtZV0gPSByZWFkTWlzZVRhc2tDb21tYW5kKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIE1pc3Npbmcgb3IgdGVtcG9yYXJpbHkgaW52YWxpZCBtaXNlIGZpbGVzIHNob3VsZCBub3QgYmxvY2sgb3RoZXIgd2JmeSBnZW5lcmF0b3JzLlxuICAgIH1cbiAgfVxuICByZXR1cm4gdGFza3M7XG59XG5cbmZ1bmN0aW9uIHJlYWRNaXNlVGFza0NvbW1hbmQodmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgcmV0dXJuIHZhbHVlO1xuICAvLyBQcmVzZXJ2ZSBhcnJheS1mb3JtIG1pc2UgY29tbWFuZHMgc28gcmVjdXJzaW9uIGNoZWNrcyBjYW4gc3RpbGwgc2VlIHBhY2thZ2Ugc2NyaXB0IGNhbGxzLlxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiB2YWx1ZS5maWx0ZXIoKGNvbW1hbmQpOiBjb21tYW5kIGlzIHN0cmluZyA9PiB0eXBlb2YgY29tbWFuZCA9PT0gJ3N0cmluZycpLmpvaW4oJ1xcbicpO1xuICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JykgcmV0dXJuIHJlYWRNaXNlVGFza0NvbW1hbmQoKHZhbHVlIGFzIHsgcnVuPzogdW5rbm93biB9KS5ydW4pO1xuICByZXR1cm4gJyc7XG59XG5cbmZ1bmN0aW9uIGNvbnRhaW5zQW55KHBhdHRlcm46IHN0cmluZywgZGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBmZy5nbG9iU3luYyhwYXR0ZXJuLCB7IGRvdDogdHJ1ZSwgY3dkOiBkaXJQYXRoLCBpZ25vcmU6IGdsb2JJZ25vcmUgfSkubGVuZ3RoID4gMDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hSZXBvSW5mbyhkaXJQYXRoOiBzdHJpbmcsIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgZ2l0ID0gc2ltcGxlR2l0KGRpclBhdGgpO1xuICBjb25zdCByZW1vdGVzID0gYXdhaXQgZ2l0LmdldFJlbW90ZXModHJ1ZSk7XG4gIGNvbnN0IG9yaWdpbiA9IHJlbW90ZXMuZmluZCgocikgPT4gci5uYW1lID09PSAnb3JpZ2luJyk7XG4gIGNvbnN0IHJlbW90ZVVybCA9IG9yaWdpbj8ucmVmcy5mZXRjaCA/PyBvcmlnaW4/LnJlZnMucHVzaDtcbiAgaWYgKHR5cGVvZiByZW1vdGVVcmwgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QganNvbiA9IGF3YWl0IHJlcXVlc3RSZXBvSW5mbyhyZW1vdGVVcmwpO1xuICAgIGlmIChqc29uKSByZXR1cm4ganNvbjtcbiAgfVxuXG4gIGNvbnN0IHVybCA9IHR5cGVvZiBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5ID09PSAnc3RyaW5nJyA/IHBhY2thZ2VKc29uLnJlcG9zaXRvcnkgOiBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5Py51cmw7XG4gIGlmICh1cmwpIHtcbiAgICBjb25zdCBqc29uID0gYXdhaXQgcmVxdWVzdFJlcG9JbmZvKHVybCk7XG4gICAgaWYgKGpzb24gJiYganNvbi5tZXNzYWdlICE9PSAnTm90IEZvdW5kJykgcmV0dXJuIGpzb247XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVxdWVzdFJlcG9JbmZvKHVybE9yRnVsbE5hbWU6IHN0cmluZyk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgW29yZywgbmFtZV0gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUodXJsT3JGdWxsTmFtZSk7XG4gIGlmICghb3JnIHx8ICFuYW1lKSByZXR1cm47XG5cbiAgdHJ5IHtcbiAgICAvLyBNZXRhZGF0YSBwZXJtaXNzaW9uXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBnZXRPY3Rva2l0KCkucmVxdWVzdCgnR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfScsIHtcbiAgICAgIG93bmVyOiBvcmcsXG4gICAgICByZXBvOiBuYW1lLFxuICAgIH0pO1xuICAgIHJldHVybiByZXNwb25zZS5kYXRhO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IHJlZGlyZWN0ZWRGdWxsTmFtZSA9IGdldFJlZGlyZWN0ZWRSZXBvRnVsbE5hbWUoZXJyb3IpO1xuICAgIGlmIChyZWRpcmVjdGVkRnVsbE5hbWUpIHtcbiAgICAgIHJldHVybiB7IGZ1bGxfbmFtZTogcmVkaXJlY3RlZEZ1bGxOYW1lIH07XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldFJlZGlyZWN0ZWRSZXBvRnVsbE5hbWUoZXJyb3I6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIWVycm9yIHx8IHR5cGVvZiBlcnJvciAhPT0gJ29iamVjdCcpIHJldHVybjtcblxuICBjb25zdCByZXNwb25zZSA9XG4gICAgJ3Jlc3BvbnNlJyBpbiBlcnJvclxuICAgICAgPyAoZXJyb3IgYXMgeyByZXNwb25zZT86IHsgc3RhdHVzPzogbnVtYmVyOyBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB9IH0pLnJlc3BvbnNlXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2U/LnN0YXR1cyA/PyAoZXJyb3IgYXMgeyBzdGF0dXM/OiBudW1iZXIgfSkuc3RhdHVzO1xuICBpZiAoc3RhdHVzICE9PSAzMDEgJiYgc3RhdHVzICE9PSAzMDIpIHJldHVybjtcblxuICBjb25zdCBsb2NhdGlvbiA9IHJlc3BvbnNlPy5oZWFkZXJzPy5sb2NhdGlvbjtcbiAgaWYgKHR5cGVvZiBsb2NhdGlvbiAhPT0gJ3N0cmluZycpIHJldHVybjtcblxuICBjb25zdCBbb3JnLCBuYW1lXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShsb2NhdGlvbik7XG4gIGlmICghb3JnIHx8ICFuYW1lKSByZXR1cm47XG5cbiAgcmV0dXJuIGAke29yZ30vJHtuYW1lfWA7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuY29uc3QgZGVwZW5kZW5jeVNlY3Rpb25LZXlzID0gWydkZXBlbmRlbmNpZXMnLCAnZGV2RGVwZW5kZW5jaWVzJywgJ29wdGlvbmFsRGVwZW5kZW5jaWVzJywgJ3BlZXJEZXBlbmRlbmNpZXMnXSBhcyBjb25zdDtcbmNvbnN0IGFsbG93ZWRHaXRIdWJPcmdhbml6YXRpb25QYXR0ZXJuID0gU3RyaW5nLnJhd2AoPzpXaWxsQm9vc3RlcnxXaWxsQm9vc3RlckxhYilgO1xuY29uc3QgYWxsb3dlZEdpdERlcGVuZGVuY3lQYXR0ZXJucyA9IFtcbiAgbmV3IFJlZ0V4cChgXiR7YWxsb3dlZEdpdEh1Yk9yZ2FuaXphdGlvblBhdHRlcm59L1teI1xcXFxzXSsoPzojXFxcXFMrKT8kYCwgJ3UnKSxcbiAgbmV3IFJlZ0V4cChgXmdpdGh1Yjoke2FsbG93ZWRHaXRIdWJPcmdhbml6YXRpb25QYXR0ZXJufS9bXiNcXFxcc10rKD86I1xcXFxTKyk/JGAsICd1JyksXG4gIG5ldyBSZWdFeHAoXG4gICAgYF4oPzpnaXRcXFxcKyk/aHR0cHM6Ly9naXRodWJcXFxcLmNvbS8ke2FsbG93ZWRHaXRIdWJPcmdhbml6YXRpb25QYXR0ZXJufS9bXiNcXFxcc10rKD86XFxcXC5naXQpPyg/OiNcXFxcUyspPyRgLFxuICAgICd1J1xuICApLFxuICBuZXcgUmVnRXhwKFxuICAgIGBeKD86Z2l0XFxcXCspP3NzaDovL2dpdEBnaXRodWJcXFxcLmNvbVs6L10ke2FsbG93ZWRHaXRIdWJPcmdhbml6YXRpb25QYXR0ZXJufS9bXiNcXFxcc10rKD86XFxcXC5naXQpPyg/OiNcXFxcUyspPyRgLFxuICAgICd1J1xuICApLFxuICBuZXcgUmVnRXhwKGBeKD86Z2l0XFxcXCspP2dpdEBnaXRodWJcXFxcLmNvbToke2FsbG93ZWRHaXRIdWJPcmdhbml6YXRpb25QYXR0ZXJufS9bXiNcXFxcc10rKD86XFxcXC5naXQpPyg/OiNcXFxcUyspPyRgLCAndScpLFxuXTtcblxuaW50ZXJmYWNlIERpc2FsbG93ZWREZXBlbmRlbmN5U291cmNlIHtcbiAgZGVwZW5kZW5jeU5hbWU6IHN0cmluZztcbiAgZGlyUGF0aDogc3RyaW5nO1xuICBzZWN0aW9uTmFtZTogKHR5cGVvZiBkZXBlbmRlbmN5U2VjdGlvbktleXMpW251bWJlcl07XG4gIHNwZWNpZmllcjogc3RyaW5nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0U2FmZURlcGVuZGVuY3lTb3VyY2VzKGNvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IHZvaWQge1xuICBjb25zdCBkaXNhbGxvd2VkU291cmNlcyA9IGNvbmZpZ3MuZmxhdE1hcChnZXREaXNhbGxvd2VkRGVwZW5kZW5jeVNvdXJjZXMpO1xuICBpZiAoZGlzYWxsb3dlZFNvdXJjZXMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgY29uc3QgZGV0YWlscyA9IGRpc2FsbG93ZWRTb3VyY2VzXG4gICAgLm1hcChcbiAgICAgICh7IGRlcGVuZGVuY3lOYW1lLCBkaXJQYXRoLCBzZWN0aW9uTmFtZSwgc3BlY2lmaWVyIH0pID0+XG4gICAgICAgIGAtICR7cGF0aC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKX06ICR7c2VjdGlvbk5hbWV9LiR7ZGVwZW5kZW5jeU5hbWV9IHVzZXMgJHtzcGVjaWZpZXJ9YFxuICAgIClcbiAgICAuam9pbignXFxuJyk7XG5cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGBEaXNhbGxvd2VkIEdpdCBkZXBlbmRlbmN5IHNvdXJjZXMgZm91bmQuXFxuT25seSBXaWxsQm9vc3RlciBhbmQgV2lsbEJvb3N0ZXJMYWIgR2l0SHViIGRlcGVuZGVuY2llcyBhcmUgYWxsb3dlZC5cXG4ke2RldGFpbHN9YFxuICApO1xufVxuXG5mdW5jdGlvbiBnZXREaXNhbGxvd2VkRGVwZW5kZW5jeVNvdXJjZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogRGlzYWxsb3dlZERlcGVuZGVuY3lTb3VyY2VbXSB7XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gY29uZmlnLnBhY2thZ2VKc29uO1xuICBpZiAoIXBhY2thZ2VKc29uKSByZXR1cm4gW107XG5cbiAgY29uc3QgZGlzYWxsb3dlZFNvdXJjZXM6IERpc2FsbG93ZWREZXBlbmRlbmN5U291cmNlW10gPSBbXTtcbiAgZm9yIChjb25zdCBzZWN0aW9uTmFtZSBvZiBkZXBlbmRlbmN5U2VjdGlvbktleXMpIHtcbiAgICBjb25zdCBzZWN0aW9uID0gcGFja2FnZUpzb25bc2VjdGlvbk5hbWVdO1xuICAgIGlmICghc2VjdGlvbikgY29udGludWU7XG5cbiAgICBmb3IgKGNvbnN0IFtkZXBlbmRlbmN5TmFtZSwgc3BlY2lmaWVyXSBvZiBPYmplY3QuZW50cmllcyhzZWN0aW9uKSkge1xuICAgICAgaWYgKCFzcGVjaWZpZXIpIGNvbnRpbnVlO1xuICAgICAgaWYgKCFpc0dpdERlcGVuZGVuY3lTcGVjaWZpZXIoc3BlY2lmaWVyKSkgY29udGludWU7XG4gICAgICBpZiAoaXNBbGxvd2VkR2l0RGVwZW5kZW5jeVNwZWNpZmllcihzcGVjaWZpZXIpKSBjb250aW51ZTtcblxuICAgICAgZGlzYWxsb3dlZFNvdXJjZXMucHVzaCh7XG4gICAgICAgIGRlcGVuZGVuY3lOYW1lLFxuICAgICAgICBkaXJQYXRoOiBjb25maWcuZGlyUGF0aCxcbiAgICAgICAgc2VjdGlvbk5hbWUsXG4gICAgICAgIHNwZWNpZmllcixcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGlzYWxsb3dlZFNvdXJjZXM7XG59XG5cbmZ1bmN0aW9uIGlzR2l0RGVwZW5kZW5jeVNwZWNpZmllcihzcGVjaWZpZXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIGlzR2l0SHViU2hvcnRoYW5kU3BlY2lmaWVyKHNwZWNpZmllcikgfHxcbiAgICAvXig/OmJpdGJ1Y2tldHxnaXN0fGdpdGh1YnxnaXRsYWIpOi91LnRlc3Qoc3BlY2lmaWVyKSB8fFxuICAgIC9eaHR0cHM/OlxcL1xcLyg/OmJpdGJ1Y2tldFxcLm9yZ3xnaXRodWJcXC5jb218Z2l0bGFiXFwuY29tKVxcLy91LnRlc3Qoc3BlY2lmaWVyKSB8fFxuICAgIC9eKD86aHR0cHM/fHNzaCk6XFwvXFwvXFxTK1xcLmdpdCg/OiNcXFMrKT8kL3UudGVzdChzcGVjaWZpZXIpIHx8XG4gICAgL15bXkBcXHNdK0BbXjpcXHNdKzpcXFMrKD86I1xcUyspPyQvdS50ZXN0KHNwZWNpZmllcikgfHxcbiAgICBzcGVjaWZpZXIuc3RhcnRzV2l0aCgnZ2l0OicpIHx8XG4gICAgc3BlY2lmaWVyLnN0YXJ0c1dpdGgoJ2dpdCsnKSB8fFxuICAgIHNwZWNpZmllci5zdGFydHNXaXRoKCdzc2g6Ly9naXRAJylcbiAgKTtcbn1cblxuZnVuY3Rpb24gaXNHaXRIdWJTaG9ydGhhbmRTcGVjaWZpZXIoc3BlY2lmaWVyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIC9eW2EtekEtWjAtOV1bXFx3Li1dKlxcL1tcXHcuLV0rKD86I1xcUyspPyQvdS50ZXN0KHNwZWNpZmllcik7XG59XG5cbmZ1bmN0aW9uIGlzQWxsb3dlZEdpdERlcGVuZGVuY3lTcGVjaWZpZXIoc3BlY2lmaWVyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGFsbG93ZWRHaXREZXBlbmRlbmN5UGF0dGVybnMuc29tZSgocGF0dGVybikgPT4gcGF0dGVybi50ZXN0KHNwZWNpZmllcikpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgaWdub3JlRXJyb3JBc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliL3NyYyc7XG5pbXBvcnQgeWFyZ3MgZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaXhOZXh0Q29uZmlnSnNvbiB9IGZyb20gJy4vZml4ZXJzL25leHRDb25maWcuanMnO1xuaW1wb3J0IHsgZml4UGxheXdyaWdodENvbmZpZyB9IGZyb20gJy4vZml4ZXJzL3BsYXl3cmlnaHRDb25maWcuanMnO1xuaW1wb3J0IHsgZml4UHJpc21hRW52RmlsZXMgfSBmcm9tICcuL2ZpeGVycy9wcmlzbWEuanMnO1xuaW1wb3J0IHsgZml4VGVzdERpcmVjdG9yaWVzVXBkYXRpbmdQYWNrYWdlSnNvbiB9IGZyb20gJy4vZml4ZXJzL3Rlc3REaXJlY3RvcnkuanMnO1xuaW1wb3J0IHsgZml4VHlwZURlZmluaXRpb25zIH0gZnJvbSAnLi9maXhlcnMvdHlwZURlZmluaXRpb24uanMnO1xuaW1wb3J0IHsgZml4VHlwb3MgfSBmcm9tICcuL2ZpeGVycy90eXBvcy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2FnZW50cy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUJ1bmZpZ1RvbWwgfSBmcm9tICcuL2dlbmVyYXRvcnMvYnVuZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlRG9ja2VyaWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2RvY2tlcmlnbm9yZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUVkaXRvcmNvbmZpZyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9lZGl0b3Jjb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVHZW1pbmlDb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvZ2VtaW5pQ29uZmlnLmpzJztcbmltcG9ydCB7IHJlbW92ZUdlbWluaVNldHRpbmdzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dlbWluaVNldHRpbmdzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2l0YXR0cmlidXRlcyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9naXRhdHRyaWJ1dGVzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2l0aWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dpdGlnbm9yZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUlkZWFTZXR0aW5ncyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9pZGVhLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlTGVmdGhvb2tVcGRhdGluZ1BhY2thZ2VKc29uIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2xlZnRob29rLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlTGludHN0YWdlZHJjIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2xpbnRzdGFnZWRyYy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVBhY2thZ2VKc29uIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3BhY2thZ2VKc29uLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlT3hmbXRDb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvb3hmbXRDb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVPeGxpbnRDb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvb3hsaW50Q29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUHJldHRpZXJpZ25vcmUgfSBmcm9tICcuL2dlbmVyYXRvcnMvcHJldHRpZXJpZ25vcmUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9weXJpZ2h0Q29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUmVhZG1lIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3JlYWRtZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJlbGVhc2VyYyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9yZWxlYXNlcmMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVSZW5vdmF0ZUpzb24gfSBmcm9tICcuL2dlbmVyYXRvcnMvcmVub3ZhdGVKc29uLmpzJztcbmltcG9ydCB7IGluc3RhbGxBZ2VudFNraWxscyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9za2lsbHMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVUc2NvbmZpZyB9IGZyb20gJy4vZ2VuZXJhdG9ycy90c2NvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVZzY29kZVNldHRpbmdzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3ZzY29kZVNldHRpbmdzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlV29ya2Zsb3dzLCBpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyB9IGZyb20gJy4vZ2VuZXJhdG9ycy93b3JrZmxvdy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVlhcm5yY1ltbCB9IGZyb20gJy4vZ2VuZXJhdG9ycy95YXJucmMuanMnO1xuaW1wb3J0IHsgc2V0dXBMYWJlbHMgfSBmcm9tICcuL2dpdGh1Yi9sYWJlbC5qcyc7XG5pbXBvcnQgeyBzZXR1cFNlY3JldHMgfSBmcm9tICcuL2dpdGh1Yi9zZWNyZXQuanMnO1xuaW1wb3J0IHsgc2V0dXBHaXRIdWJTZXR0aW5ncyB9IGZyb20gJy4vZ2l0aHViL3NldHRpbmdzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2l0SHViVGVtcGxhdGVzIH0gZnJvbSAnLi9naXRodWIvdGVtcGxhdGUuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgeyBnZXRQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGFzc2VydFNhZmVEZXBlbmRlbmN5U291cmNlcyB9IGZyb20gJy4vdXRpbHMvZGVwZW5kZW5jeVNvdXJjZVBvbGljeS5qcyc7XG5pbXBvcnQgeyBkb2VzQ29udGFpbkpzT3JUcyB9IGZyb20gJy4vdXRpbHMvcGFja2FnZUNhcGFiaWxpdGllcy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jLCBzcGF3blN5bmNBbmRSZXR1cm5TdGF0dXMgfSBmcm9tICcuL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5cbmFzeW5jIGZ1bmN0aW9uIG1haW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGFyZ3YgPSBhd2FpdCB5YXJncyhwcm9jZXNzLmFyZ3Yuc2xpY2UoMikpXG4gICAgLmNvbW1hbmQoJyQwIFtwYXRocy4uXScsICdNYWtlIGEgZ2l2ZW4gcHJvamVjdCBmb2xsb3cgdGhlIFdpbGxCb29zdGVyIHN0YW5kYXJkJywgKHlhcmdzKSA9PiB7XG4gICAgICB5YXJncy5wb3NpdGlvbmFsKCdwYXRocycsIHtcbiAgICAgICAgZGVzY3JpYmU6ICdwcm9qZWN0IHBhdGhzIHRvIGJlIHdiZmllZCcsXG4gICAgICAgIGFycmF5OiB0cnVlLFxuICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgZGVmYXVsdDogWycuJ10sXG4gICAgICB9KTtcbiAgICB9KVxuICAgIC5vcHRpb25zKHtcbiAgICAgIGVudjoge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ1VwbG9hZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXMgc2VjcmV0cyB0byBHaXRIdWInLFxuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICBhbGlhczogJ2UnLFxuICAgICAgfSxcbiAgICAgIHNraXBEZXBzOiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiAnU2tpcCBkZXBlbmRlbmN5IGluc3RhbGxhdGlvbicsXG4gICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgIGFsaWFzOiAnZCcsXG4gICAgICB9LFxuICAgICAgdmVyYm9zZToge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgb3Igbm90IHRvIGVuYWJsZSB2ZXJib3NlIG1vZGUnLFxuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICBhbGlhczogJ3YnLFxuICAgICAgfSxcbiAgICB9KVxuICAgIC52ZXJzaW9uKGdldFZlcnNpb24oKSlcbiAgICAuc3RyaWN0KCkuYXJndjtcbiAgb3B0aW9ucy5pc1ZlcmJvc2UgPSBhcmd2LnZlcmJvc2U7XG4gIG9wdGlvbnMuZG9lc1VwbG9hZEVudlZhcnMgPSBhcmd2LmVudjtcblxuICBsZXQgaGFzSW52YWxpZFBhY2thZ2VDb25maWcgPSBmYWxzZTtcbiAgZm9yIChjb25zdCByb290RGlyUGF0aCBvZiBhcmd2LnBhdGhzIGFzIHN0cmluZ1tdKSB7XG4gICAgY29uc3QgcGFja2FnZXNEaXJQYXRoID0gcGF0aC5qb2luKHJvb3REaXJQYXRoLCAncGFja2FnZXMnKTtcbiAgICBjb25zdCBkaXJlbnRzID0gKGF3YWl0IGlnbm9yZUVycm9yQXN5bmMoKCkgPT4gZnMucHJvbWlzZXMucmVhZGRpcihwYWNrYWdlc0RpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KSkpID8/IFtdO1xuICAgIGNvbnN0IHN1YkRpclBhdGhzID0gZGlyZW50cy5maWx0ZXIoKGQpID0+IGQuaXNEaXJlY3RvcnkoKSkubWFwKChkKSA9PiBwYXRoLmpvaW4ocGFja2FnZXNEaXJQYXRoLCBkLm5hbWUpKTtcblxuICAgIGF3YWl0IGZpeFRlc3REaXJlY3Rvcmllc1VwZGF0aW5nUGFja2FnZUpzb24oW3Jvb3REaXJQYXRoLCAuLi5zdWJEaXJQYXRoc10pO1xuXG4gICAgY29uc3Qgcm9vdENvbmZpZyA9IGF3YWl0IGdldFBhY2thZ2VDb25maWcocm9vdERpclBhdGgpO1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5sb2coJ3Jvb3RDb25maWc6Jywgcm9vdENvbmZpZyk7XG4gICAgfVxuICAgIGlmICghcm9vdENvbmZpZykge1xuICAgICAgY29uc29sZS5lcnJvcihgdGhlcmUgaXMgbm8gdmFsaWQgcGFja2FnZS5qc29uIGluICR7cm9vdERpclBhdGh9YCk7XG4gICAgICBoYXNJbnZhbGlkUGFja2FnZUNvbmZpZyA9IHRydWU7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgYWJicmV2aWF0aW9uUHJvbWlzZSA9IGZpeFR5cG9zKHJvb3RDb25maWcpO1xuXG4gICAgY29uc3QgbnVsbGFibGVTdWJQYWNrYWdlQ29uZmlncyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgc3ViRGlyUGF0aHMubWFwKChzdWJEaXJQYXRoKSA9PiBnZXRQYWNrYWdlQ29uZmlnKHN1YkRpclBhdGgsIHJvb3RDb25maWcpKVxuICAgICk7XG4gICAgY29uc3Qgc3ViUGFja2FnZUNvbmZpZ3MgPSBudWxsYWJsZVN1YlBhY2thZ2VDb25maWdzLmZpbHRlcigoY29uZmlnKSA9PiAhIWNvbmZpZyk7XG4gICAgY29uc3QgYWxsUGFja2FnZUNvbmZpZ3MgPSBbcm9vdENvbmZpZywgLi4uc3ViUGFja2FnZUNvbmZpZ3NdO1xuXG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBmb3IgKGNvbnN0IGNvbmZpZyBvZiBhbGxQYWNrYWdlQ29uZmlncykge1xuICAgICAgICBjb25zb2xlLmluZm8oY29uZmlnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgYXNzZXJ0U2FmZURlcGVuZGVuY3lTb3VyY2VzKGFsbFBhY2thZ2VDb25maWdzKTtcblxuICAgIC8vIEluc3RhbGwgeWFybiBiZXJyeVxuICAgIGF3YWl0IGdlbmVyYXRlWWFybnJjWW1sKHJvb3RDb25maWcpO1xuICAgIGlmIChyb290Q29uZmlnLmlzQnVuKSB7XG4gICAgICBhd2FpdCBnZW5lcmF0ZUJ1bmZpZ1RvbWwocm9vdENvbmZpZyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2hvdWxkUnVuV29ya2Zsb3dzID1cbiAgICAgICFpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyhyb290Q29uZmlnLnJlcG9zaXRvcnkpICYmXG4gICAgICAocm9vdENvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXIvJykgfHxcbiAgICAgICAgcm9vdENvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJykpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIGZpeFByaXNtYUVudkZpbGVzKHJvb3RDb25maWcpLFxuICAgICAgYWJicmV2aWF0aW9uUHJvbWlzZS50aGVuKCgpID0+IGdlbmVyYXRlUmVhZG1lKHJvb3RDb25maWcpKSxcbiAgICAgIGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbnMocm9vdENvbmZpZywgYWxsUGFja2FnZUNvbmZpZ3MpLFxuICAgICAgZ2VuZXJhdGVEb2NrZXJpZ25vcmUocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUVkaXRvcmNvbmZpZyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlR2VtaW5pQ29uZmlnKHJvb3RDb25maWcsIGFsbFBhY2thZ2VDb25maWdzKSxcbiAgICAgIHJlbW92ZUdlbWluaVNldHRpbmdzKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUlkZWFTZXR0aW5ncyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlUmVub3ZhdGVKc29uKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVSZWxlYXNlcmMocm9vdENvbmZpZyksXG4gICAgICAuLi4oc2hvdWxkUnVuV29ya2Zsb3dzID8gW2dlbmVyYXRlV29ya2Zsb3dzKHJvb3RDb25maWcpXSA6IFtdKSxcbiAgICAgIHNldHVwTGFiZWxzKHJvb3RDb25maWcpLFxuICAgICAgc2V0dXBTZWNyZXRzKHJvb3RDb25maWcpLFxuICAgICAgc2V0dXBHaXRIdWJTZXR0aW5ncyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlTGVmdGhvb2tVcGRhdGluZ1BhY2thZ2VKc29uKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVMaW50c3RhZ2VkcmMocm9vdENvbmZpZyksXG4gICAgXSk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuXG4gICAgY29uc3QgcHJvbWlzZXM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuICAgIGZvciAoY29uc3QgY29uZmlnIG9mIGFsbFBhY2thZ2VDb25maWdzKSB7XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGZpeFR5cGVEZWZpbml0aW9ucyhjb25maWcsIGNvbmZpZy5pc1Jvb3QgPyBhbGxQYWNrYWdlQ29uZmlncyA6IFtjb25maWddKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0VGVzdCkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGZpeFBsYXl3cmlnaHRDb25maWcoY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZml4TmV4dENvbmZpZ0pzb24oY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBhd2FpdCBnZW5lcmF0ZUdpdGlnbm9yZShjb25maWcsIHJvb3RDb25maWcpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICAgICAgaWYgKCFjb25maWcuaXNSb290ICYmICFjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IGdlbmVyYXRlUHJldHRpZXJpZ25vcmUoY29uZmlnKTtcbiAgICAgIGF3YWl0IGdlbmVyYXRlUGFja2FnZUpzb24oY29uZmlnLCByb290Q29uZmlnLCBhcmd2LnNraXBEZXBzKTtcblxuICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZUxpbnRzdGFnZWRyYyhjb25maWcpKTtcbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Wc2NvZGVTZXR0aW5nc0pzb24gJiYgY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24pIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZVZzY29kZVNldHRpbmdzKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXMpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZVRzY29uZmlnKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKGRvZXNDb250YWluSnNPclRzKGNvbmZpZykpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZU94Zm10Q29uZmlnKGNvbmZpZykpO1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlT3hsaW50Q29uZmlnKGNvbmZpZywgcm9vdENvbmZpZykpO1xuICAgICAgfSBlbHNlIGlmICghY29uZmlnLmlzUm9vdCAmJiBjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbiAmJiBkb2VzQ29udGFpbkpzT3JUcyhyb290Q29uZmlnKSkge1xuICAgICAgICAvLyBNb25vcmVwbyB2ZXJpZmljYXRpb24gY2FuIGludm9rZSBveGxpbnQgZnJvbSBldmVyeSB3b3Jrc3BhY2UuIEdpdmVcbiAgICAgICAgLy8gbm9uLWNvZGUgcGFja2FnZXMgYSBsb2NhbCBjb25maWcgc28gb3hsaW50IGRvZXMgbm90IGNsaW1iIHRvIHRoZVxuICAgICAgICAvLyByb290IGNvbmZpZyBhbmQgcmVqZWN0IHJvb3Qtb25seSB0eXBlLWF3YXJlIG9wdGlvbnMgZnJvbSBhIHBhY2thZ2UgY3dkLlxuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlT3hsaW50Q29uZmlnKGNvbmZpZywgcm9vdENvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHlyaWdodCkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24oY29uZmlnKSk7XG4gICAgICB9XG4gICAgfVxuICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG5cbiAgICBjb25zdCBwYWNrYWdlTWFuYWdlciA9IHJvb3RDb25maWcuaXNCdW4gPyAnYnVuJyA6ICd5YXJuJztcbiAgICAvLyBSZWZyZXNoIGxvY2sgZmlsZXNcbiAgICBpZiAocm9vdENvbmZpZy5pc0J1bikge1xuICAgICAgYXdhaXQgbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ3JlZnJlc2hCdW5Mb2NrJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgcmVmcmVzaEJ1bkxvY2socm9vdERpclBhdGgpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydpbnN0YWxsJywgJy0tbm8taW1tdXRhYmxlJ10sIHJvb3REaXJQYXRoKTtcbiAgICB9XG4gICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ2NsZWFudXAnXSwgcm9vdERpclBhdGgpO1xuXG4gICAgYXdhaXQgaW5zdGFsbEFnZW50U2tpbGxzKHJvb3RDb25maWcpO1xuICB9XG4gIGlmIChoYXNJbnZhbGlkUGFja2FnZUNvbmZpZykge1xuICAgIHByb2Nlc3MuZXhpdENvZGUgPSAxO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlZnJlc2hCdW5Mb2NrKHJvb3REaXJQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgLy8gd2JmeSBzaG91bGQgdXBkYXRlIG9ubHkgdGhlIHBhY2thZ2VzIGl0IGV4cGxpY2l0bHkgbWFuYWdlcyB0aHJvdWdoIGJ1biBhZGQuXG4gIC8vIFJ1bm5pbmcgYnVuIHVwZGF0ZSBoZXJlIHJlZnJlc2hlcyB1bnJlbGF0ZWQgYXBwbGljYXRpb24gZGVwZW5kZW5jaWVzIGFuZFxuICAvLyBjYW4gY2hhbmdlIHByb2R1Y3QgYmVoYXZpb3IsIHNvIGtlZXAgdGhlIGV4aXN0aW5nIGxvY2sgYW5kIHJlY29uY2lsZSBpdC5cbiAgY29uc3Qgc3RhdHVzID0gc3Bhd25TeW5jQW5kUmV0dXJuU3RhdHVzKCdidW4nLCBbJ2luc3RhbGwnXSwgcm9vdERpclBhdGgpO1xuICBpZiAoc3RhdHVzICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcmVmcmVzaCBCdW4gbG9ja2ZpbGU6IGJ1biBpbnN0YWxsIGV4aXRlZCB3aXRoIHN0YXR1cyAke3N0YXR1c31gKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRWZXJzaW9uKCk6IHN0cmluZyB7XG4gIGxldCBwYWNrYWdlSnNvbkRpciA9IHBhdGguZGlybmFtZShuZXcgVVJMKGltcG9ydC5tZXRhLnVybCkucGF0aG5hbWUpO1xuICB3aGlsZSAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHBhY2thZ2VKc29uRGlyLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgcGFja2FnZUpzb25EaXIgPSBwYXRoLmRpcm5hbWUocGFja2FnZUpzb25EaXIpO1xuICB9XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHBhY2thZ2VKc29uRGlyLCAncGFja2FnZS5qc29uJyksICd1dGY4JykpIGFzIHtcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG4gIH07XG4gIHJldHVybiBwYWNrYWdlSnNvbi52ZXJzaW9uO1xufVxuXG5hd2FpdCBtYWluKCk7XG4iXSwibmFtZXMiOlsiYXN5bmMiLCJzbGVlcCIsIm1pbGxpc2Vjb25kcyIsIlByb21pc2UiLCJyZXNvbHZlIiwic2V0VGltZW91dCIsImlnbm9yZUVycm9yQXN5bmMiLCJmbiIsImlnbm9yZUVub2VudEFzeW5jIiwiZXJyb3IiLCJjb2RlIiwib3B0aW9ucyIsImlzVmVyYm9zZSIsImRvZXNVcGxvYWRFbnZWYXJzIiwibG9nZ2VyIiwiZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbiIsIm5hbWUiLCJmdW5jIiwiY29uc29sZSIsImluZm8iLCJFcnJvciIsInN0YWNrIiwiU3RyaW5nIiwiZnNVdGlsIiwicmVhZEZpbGVJZ25vcmluZ0Vycm9yIiwiZmlsZVBhdGgiLCJmcyIsInByb21pc2VzIiwicmVhZEZpbGUiLCJnZW5lcmF0ZUZpbGUiLCJjb250ZW50IiwibWtkaXIiLCJwYXRoIiwiZGlybmFtZSIsInJlY3Vyc2l2ZSIsIm5vcm1hbGl6ZWRDb250ZW50IiwidHJpbSIsIndyaXRlRmlsZSIsInByb21pc2VQb29sIiwiUHJvbWlzZVBvb2wiLCJmaXhOZXh0Q29uZmlnSnNvbiIsImNvbmZpZyIsIm1hcCIsImV4dCIsImRpclBhdGgiLCJmaW5kIiwicCIsImV4aXN0c1N5bmMiLCJvbGRDb250ZW50Iiwib2JqZWN0TGl0ZXJhbCIsInNvdXJjZSIsInRzIiwiY3JlYXRlU291cmNlRmlsZSIsIlNjcmlwdFRhcmdldCIsIkxhdGVzdCIsIlNjcmlwdEtpbmQiLCJKUyIsInZpc2l0Iiwibm9kZSIsImlzRXhwb3J0QXNzaWdubWVudCIsImlzT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24iLCJleHByZXNzaW9uIiwiaXNCaW5hcnlFeHByZXNzaW9uIiwib3BlcmF0b3JUb2tlbiIsImtpbmQiLCJTeW50YXhLaW5kIiwiRXF1YWxzVG9rZW4iLCJsZWZ0IiwiZ2V0VGV4dCIsInJpZ2h0IiwiZm9yRWFjaENoaWxkIiwiZ2V0TmV4dENvbmZpZ09iamVjdExpdGVyYWwiLCJwcm9wZXJ0eVRleHRzIiwiU2V0IiwicHJvcGVydGllcyIsInByb3BlcnR5IiwiaGFzIiwicHVzaCIsImxlbmd0aCIsImluc2VydGlvblBvaW50IiwiZ2V0RW5kIiwibGFzdFByb3BlcnR5IiwiYXQiLCJoYXNUcmFpbGluZ0NvbW1hIiwic2xpY2UiLCJpbmNsdWRlcyIsInByZWZpeCIsIm5ld0NvbnRlbnQiLCJqb2luIiwicnVuIiwiZG9lc0NvbnRhaW5Kc09yVHMiLCJkb2VzQ29udGFpbkphdmFTY3JpcHQiLCJkb2VzQ29udGFpbkphdmFTY3JpcHRJblBhY2thZ2VzIiwiZG9lc0NvbnRhaW5UeXBlU2NyaXB0IiwiZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcyIsImRvZXNDb250YWluSmF2YSIsImRvZXNDb250YWluSmF2YUluUGFja2FnZXMiLCJnZXRQYWNrYWdlTWFuYWdlckNvbW1hbmQiLCJpc0J1biIsImxpdGVyYWwiLCJ2YWx1ZSIsImFzT2JqZWN0IiwiZXh0cmFNZW1iZXJzIiwidG9QYXJzZWRPYmplY3QiLCJtZW1iZXJPcmRlciIsIk9iamVjdCIsImtleXMiLCJrZXkiLCJfIiwiaW5kZXgiLCJmaXhQbGF5d3JpZ2h0Q29uZmlnIiwiZW52RmlsZVBhdGgiLCJlbnZGaWxlTmFtZXMiLCJlbnZGaWxlUGF0aHMiLCJjdXJyZW50RGlyUGF0aCIsImZpbGVOYW1lIiwiZ2V0RW52RmlsZVBhdGhzIiwidGVzdCIsImFzc2VydE5leHRQdWJsaWNCYXNlVXJsIiwiZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbCIsIlRTIiwiZm91bmQiLCJpc0NhbGxFeHByZXNzaW9uIiwiZmlyc3RBcmd1bWVudCIsImFyZ3VtZW50cyIsInVuZGVmaW5lZCIsImV4dHJhY3REZWZpbmVDb25maWdPYmplY3RMaXRlcmFsIiwicGFyc2VkIiwicGFyc2VPYmplY3RMaXRlcmFsRXhwcmVzc2lvbiIsIm1lcmdlZCIsIm1lcmdlUGFyc2VkT2JqZWN0cyIsImZvcmJpZE9ubHkiLCJyZXRyaWVzIiwidXNlIiwiYmFzZVVSTCIsInRyYWNlIiwic2NyZWVuc2hvdCIsInZpZGVvIiwid2ViU2VydmVyIiwiY29tbWFuZCIsImdldFdiU3RhcnRUZXN0Q29tbWFuZCIsInVybCIsInJldXNlRXhpc3RpbmdTZXJ2ZXIiLCJ0aW1lb3V0Iiwic3Rkb3V0Iiwic3RkZXJyIiwiZW52IiwiZ3JhY2VmdWxTaHV0ZG93biIsImNyZWF0ZURlZmF1bHRDb25maWciLCJvYmplY3QiLCJzZXRXZWJTZXJ2ZXJDb21tYW5kIiwibmV3T2JqZWN0TGl0ZXJhbCIsInN0cmluZ2lmeVZhbHVlIiwic3RhcnQiLCJnZXRTdGFydCIsImVuZCIsImJhc2UiLCJvdmVycmlkZSIsIm92ZXJyaWRlUHJvcGVydHlLZXlzIiwiZmlsdGVyIiwibWVtYmVyIiwiZW50cmllcyIsIm1lcmdlUGFyc2VkVmFsdWUiLCJwYXJzZUV4cHJlc3Npb24iLCJwYXJzZWRPYmplY3QiLCJpc0FycmF5TGl0ZXJhbEV4cHJlc3Npb24iLCJlbGVtZW50cyIsImVsZW1lbnQiLCJzb21lIiwiaXNTaG9ydGhhbmRQcm9wZXJ0eUFzc2lnbm1lbnQiLCJpc1Byb3BlcnR5QXNzaWdubWVudCIsImlzSWRlbnRpZmllciIsImlzU3RyaW5nTGl0ZXJhbCIsImluaXRpYWxpemVyIiwibGV2ZWwiLCJjbG9zaW5nSW5kZW50IiwicmVwZWF0IiwiaW5kZW50IiwiaXRlbSIsInN0cmluZ2lmaWVkIiwic3BsaXQiLCJlbWl0dGVkUHJvcGVydGllcyIsImxhc3RQcm9wZXJ0eUluZGV4QnlLZXkiLCJNYXAiLCJzZXQiLCJnZXRMYXN0UHJvcGVydHlJbmRleEJ5S2V5IiwibGluZXMiLCJmbGF0TWFwIiwic3RyaW5naWZ5T2JqZWN0TWVtYmVyIiwiZ2V0IiwiYWRkIiwic3RyaW5naWZ5T2JqZWN0UHJvcGVydHkiLCJsaW5lIiwiZ2xvYklnbm9yZSIsImZpeFByaXNtYUVudkZpbGVzIiwic2hvdWxkQWRkQ29ubmVjdGlvbkxpbWl0IiwiZGVwZW5kaW5nIiwicHJpc21hIiwiZGVwZW5kZW5jaWVzIiwicGFja2FnZUpzb24iLCJkZXZEZXBlbmRlbmNpZXMiLCJzaG91bGRBZGRTcWxpdGVDb25uZWN0aW9uTGltaXQiLCJlbnZGaWxlcyIsImZnIiwiZ2xvYiIsImRvdCIsImN3ZCIsImlnbm9yZSIsImVudkZpbGUiLCJyZXBsYWNlQWxsIiwibWF0Y2giLCJub3JtYWxpemVTcWxpdGVEYXRhYmFzZVVybCIsInF1ZXJ5U3RhcnQiLCJpbmRleE9mIiwicGF0aFBhcnQiLCJxdWVyeVBhcnQiLCJwYXJhbXMiLCJVUkxTZWFyY2hQYXJhbXMiLCJkZWxldGUiLCJub3JtYWxpemVkUXVlcnkiLCJ0b1N0cmluZyIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsInNvcnRPYmplY3RCeUtleU5hbWVMaXN0Iiwic29ydFdpdGgiLCJzb3J0Rm4iLCJ0b3RhbCIsIm9iamVjdEtleXMiLCJzb3J0IiwiSU5ERU5UX1JFR0VYIiwiSU5ERU5UX1RZUEVfU1BBQ0UiLCJzaG91bGRJZ25vcmVTaW5nbGVTcGFjZSIsImlnbm9yZVNpbmdsZVNwYWNlcyIsImluZGVudFR5cGUiLCJtYWtlSW5kZW50c01hcCIsInN0cmluZyIsImluZGVudHMiLCJwcmV2aW91c0luZGVudFR5cGUiLCJwcmV2aW91c1NpemUiLCJtYXRjaGVzIiwid2VpZ2h0IiwiaW5kZW50RGlmZmVyZW5jZSIsImFic29sdXRlSW5kZW50RGlmZmVyZW5jZSIsIk1hdGgiLCJhYnMiLCJlbmNvZGVJbmRlbnRzS2V5IiwiZW50cnkiLCJpbmRlbnRBbW91bnQiLCJkZXRlY3RJbmRlbnQiLCJUeXBlRXJyb3IiLCJzaXplIiwia2V5T2ZNb3N0VXNlZEluZGVudCIsInJlc3VsdCIsIm1heFVzZWQiLCJtYXhXZWlnaHQiLCJ1c2VkQ291bnQiLCJnZXRNb3N0VXNlZEtleSIsInR5cGUiLCJhbW91bnQiLCJpbmRlbnRzS2V5IiwiTnVtYmVyIiwibWFrZUluZGVudFN0cmluZyIsImRldGVjdE5ld2xpbmVHcmFjZWZ1bCIsIm5ld2xpbmVzIiwiY3JsZiIsIm5ld2xpbmUiLCJkZXRlY3ROZXdsaW5lIiwicGlwZSIsImZucyIsIngiLCJhcmdzIiwicmVkdWNlIiwib25BcnJheSIsIkFycmF5IiwiaXNBcnJheSIsIm9uU3RyaW5nQXJyYXkiLCJldmVyeSIsInVuaXEiLCJ4cyIsInNvcnRBcnJheSIsImFycmF5IiwidG9Tb3J0ZWQiLCJ1bmlxQW5kU29ydEFycmF5Iiwib25PYmplY3QiLCJnZXRQcm90b3R5cGVPZiIsIlN5bWJvbCIsInRvU3RyaW5nVGFnIiwiaXRlcmF0b3IiLCJpc1BsYWluT2JqZWN0Iiwic29ydE9iamVjdEJ5IiwiY29tcGFyYXRvciIsImRlZXAiLCJvdmVyIiwiZnJvbUVudHJpZXMiLCJzb3J0T2JqZWN0S2V5cyIsIm9iamVjdEdyb3VwQnkiLCJncm91cEJ5IiwiY2FsbGJhY2siLCJjcmVhdGUiLCJzb3J0T2JqZWN0Iiwic29ydFVSTE9iamVjdCIsInNvcnRQZW9wbGVPYmplY3QiLCJzb3J0RGlyZWN0b3JpZXMiLCJvdmVyUHJvcGVydHkiLCJoYXNPd24iLCJzb3J0R2l0SG9va3MiLCJwYXJzZU5hbWVBbmRWZXJzaW9uUmFuZ2UiLCJzcGVjaWZpZXIiLCJuYW1lQW5kVmVyc2lvbiIsImF0TWF0Y2hlcyIsIm1hdGNoQWxsIiwic3BsaXRJbmRleCIsInBvcCIsInN1YnN0cmluZyIsInJhbmdlIiwic29ydE9iamVjdEJ5U2VtdmVyIiwiYSIsImIiLCJhTmFtZSIsImFSYW5nZSIsImJOYW1lIiwiYlJhbmdlIiwibG9jYWxlQ29tcGFyZSIsInNlbXZlckNvbXBhcmUiLCJzZW12ZXJNaW5WZXJzaW9uIiwiZ2V0UGFja2FnZU5hbWUiLCJpZGVudCIsInN0YXJ0c1dpdGgiLCJjYWNoZSIsInNob3VsZFNvcnREZXBlbmRlbmNpZXNMaWtlTnBtIiwicGFja2FnZU1hbmFnZXIiLCJkZXZFbmdpbmVzIiwicG5wbSIsImVuZ2luZXMiLCJucG0iLCJwcm9jZXNzIiwiaGFzWWFybk9yUG5wbUZpbGVzIiwic29ydERlcGVuZGVuY2llcyIsInNvcnRXb3Jrc3BhY2VzIiwic29ydEVzbGludENvbmZpZyIsIm92ZXJyaWRlcyIsInJ1bGUxIiwicnVsZTIiLCJzb3J0VlNDb2RlQmFkZ2VPYmplY3QiLCJzb3J0UHJldHRpZXJDb25maWciLCJzb3J0Vm9sdGEiLCJzb3J0RGV2RW5naW5lcyIsInNvcnRQbnBtQ29uZmlnIiwiZGVmYXVsdE5wbVNjcmlwdHMiLCJoYXNEZXZEZXBlbmRlbmN5IiwiZGVwZW5kZW5jeSIsInJ1blNSZWdFeHAiLCJoYXNTZXF1ZW50aWFsU2NyaXB0IiwiZmllbGQiLCJ2YWx1ZXMiLCJzY3JpcHQiLCJpc1NlcXVlbnRpYWxTY3JpcHQiLCJzb3J0U2NyaXB0TmFtZXMiLCJncm91cE1hcCIsImlkeCIsImZyb20iLCJncm91cEtleSIsImNoaWxkcmVuIiwiayIsInNvcnRTY3JpcHRzIiwic2NyaXB0cyIsIm5hbWVzIiwicHJlZml4YWJsZSIsIm9taXR0ZWQiLCJyZXBsYWNlIiwic29ydENvbmRpdGlvbnMiLCJjb25kaXRpb25zIiwiZGVmYXVsdENvbmRpdGlvbnMiLCJyZXN0Q29uZGl0aW9ucyIsImNvbmRpdGlvbiIsInNvcnRFeHBvcnRzIiwiZXhwb3J0cyIsInBhdGhzIiwiZmllbGRzIiwibWFpbnRhaW5lcnMiLCJjb250cmlidXRvcnMiLCJwYWNrYWdlTmFtZUEiLCJwYWNrYWdlTmFtZUIiLCJiYWRnZSIsImRlZmF1bHRTb3J0T3JkZXIiLCJvdmVyRmllbGRzIiwiQm9vbGVhbiIsInNvcnRQYWNrYWdlSnNvbiIsImpzb25Jc2giLCJqc29uIiwiZW5kQ2hhcmFjdGVycyIsIkpTT04iLCJwYXJzZSIsInN0cmluZ2lmeSIsImVkaXRTdHJpbmdKU09OIiwic29ydE9yZGVyIiwicHJpdmF0ZUtleXMiLCJwdWJsaWNLZXlzIiwiZml4VGVzdERpcmVjdG9yaWVzVXBkYXRpbmdQYWNrYWdlSnNvbiIsInBhY2thZ2VEaXJQYXRocyIsImFsbCIsInBhY2thZ2VKc29uUGF0aCIsInBhY2thZ2VEaXJQYXRoIiwibmV3VGVzdERpclBhdGgiLCJvbGRUZXN0RGlyTmFtZSIsIm9sZFRlc3REaXJQYXRoIiwibW92ZVRlc3REaXJlY3RvcnkiLCJkaWRVcGRhdGVTY3JpcHQiLCJzY3JpcHROYW1lIiwibmV3U2NyaXB0IiwicmVuYW1lIiwiZGlyZW50cyIsInJlYWRkaXIiLCJ3aXRoRmlsZVR5cGVzIiwib2xkUGF0aCIsImRpcmVudCIsIm5ld1BhdGgiLCJuZXdQYXRoU3RhdCIsInN0YXQiLCJpc0RpcmVjdG9yeSIsInJtIiwiZml4VHlwZURlZmluaXRpb25zIiwiY29uZmlnc0luY2x1ZGluZ0NoaWxkcmVuIiwibGliVHlwZURpclBhdGgiLCJzcmNUeXBlRGlyUGF0aCIsImlzUm9vdCIsImRvZXNDb250YWluU3ViUGFja2FnZUpzb25zIiwiZGlyTmFtZSIsImhhc1R5cGVEZWNsYXJhdGlvbkV4dGVuc2lvbiIsImVuZHNXaXRoIiwicGFja2FnZU5hbWUiLCJoYXNMaWJyYXJ5IiwiaXNGaWxlIiwib3ZlcndyaXRlTWVyZ2UiLCJkZXN0aW5hdGlvbkFycmF5Iiwic291cmNlQXJyYXkiLCJjb21iaW5lTWVyZ2UiLCJ0YXJnZXQiLCJkZXN0aW5hdGlvbiIsImNsb25lVW5sZXNzT3RoZXJ3aXNlU3BlY2lmaWVkIiwiaXNNZXJnZWFibGVPYmplY3QiLCJtZXJnZSIsInNvcnRLZXlzIiwib2JqIiwia2V5QW5kVmFsdWVzIiwia2V5MSIsImtleTIiLCJwdWJsaWNSZXBvQXV0b2ZpeFdvcmtmbG93Iiwib24iLCJwdWxsX3JlcXVlc3QiLCJicmFuY2hlcyIsInBlcm1pc3Npb25zIiwiY29udGVudHMiLCJjb25jdXJyZW5jeSIsImdyb3VwIiwiam9icyIsImF1dG9maXgiLCJwcml2YXRlUmVwb0F1dG9maXhXb3JrZmxvdyIsInVzZXMiLCJ3b3JrZmxvd3MiLCJyZWxlYXNlIiwicHVsbF9yZXF1ZXN0X3RhcmdldCIsInR5cGVzIiwic3luYyIsImdlbmVyYXRlV29ya2Zsb3dzIiwicm9vdENvbmZpZyIsImlzUmV1c2FibGVXb3JrZmxvd3NSZXBvIiwicmVwb3NpdG9yeSIsIndvcmtmbG93c1BhdGgiLCJzZW1hbnRpY1ltbFBhdGgiLCJmb3JjZSIsImlzT2Jzb2xldGVHZW5QcldvcmtmbG93RmlsZU5hbWUiLCJmaWxlTmFtZVNldCIsInNlbWFudGljUmVsZWFzZSIsImJhc2VuYW1lIiwid3JpdGVXb3JrZmxvd1lhbWwiLCJkZXBsb3lQcm9kdWN0aW9uV29ya2Zsb3dFeGlzdHMiLCJ3cml0ZVlhbWwiLCJpc1B1YmxpY1JlcG8iLCJzdHJ1Y3R1cmVkQ2xvbmUiLCJzdGVwcyIsIndpdGgiLCJidWlsZCIsImF1dG9maXhXb3JrZmxvdyIsImF1dG9maXhKb2IiLCJnZW5lcmF0ZUF1dG9maXhXb3JrZmxvdyIsIm5ld1NldHRpbmdzIiwib2xkU2V0dGluZ3MiLCJ5YW1sIiwibG9hZCIsImFycmF5TWVyZ2UiLCJtb3ZlVG9Cb3R0b20iLCJhY3Rpb25zIiwidHJpZ2dlcl9kZXBsb3lfd29ya2Zsb3ciLCJpc1JldXNhYmxlV29ya2Zsb3ciLCJqb2IiLCJub3JtYWxpemVKb2IiLCJzY2hlZHVsZSIsImJyYW5jaCIsInN5bmNfcGFyYW1zX3dpdGhvdXRfZGVzdCIsIndvcmtmbG93X2Rpc3BhdGNoIiwic2VjcmV0cyIsIk5QTV9UT0tFTiIsIkdIX1RPS0VOIiwiRklSRUJBU0VfVE9LRU4iLCJHQ1BfU0FfS0VZX0pTT05fRk9SX0ZJUkVCQVNFIiwiRElTQ09SRF9XRUJIT09LX1VSTCIsInNlcnZlcl91cmwiLCJkb3RfZW52X3BhdGgiLCJGTFlfQVBJX1RPS0VOIiwiZGVwbG95X2NvbW1hbmQiLCJkb2VzQ29udGFpbkRvY2tlcmZpbGUiLCJjaV9sYWJlbCIsImdpdGh1Yl9ob3N0ZWRfcnVubmVyIiwibmV3U2VjcmV0cyIsInlhbWxUZXh0IiwiZHVtcCIsImxpbmVXaWR0aCIsIm5vQ29tcGF0TW9kZSIsInN0eWxlcyIsImZpeFR5cG9zIiwicGFja2FnZUNvbmZpZyIsImRvY0ZpbGVzIiwibWRGaWxlIiwiZml4VHlwb3NJblRleHQiLCJyZXBsYWNlV2l0aENvbmZpZyIsInRzRmlsZXMiLCJ0c0ZpbGUiLCJjb21tZW50IiwidGV4dEJhc2VkRmlsZXMiLCJmaWxlIiwicHJvbWlzZUFsbCIsInByb3BOYW1lIiwiYmVmb3JlIiwiYWZ0ZXIiLCJ3YmZ5SnNvbiIsInR5cG9zIiwiZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucyIsImFsbENvbmZpZ3MiLCJhZ2VudHNFeHRyYVBhdGgiLCJleHRyYUNvbnRlbnQiLCJ0b29sTmFtZSIsImdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbiIsImN1cnNvclJ1bGVzUGF0aCIsImN1cnNvclJ1bGVzQ29udGVudCIsImZyb250bWF0dGVyIiwiYm9keSIsImdlbmVyYXRlQ3Vyc29yR2VuZXJhbE1kY0NvbnRlbnQiLCJiYXNlQ29udGVudCIsImRlc2NyaXB0aW9uIiwiaXNXaWxsQm9vc3RlclJlcG8iLCJjb25maWdzIiwicGxheXdyaWdodFRlc3QiLCJnZW5lcmF0ZUFnZW50Q29kaW5nU3R5bGUiLCJoYXNOZXdTZWN0aW9uIiwiYyIsImdlbkkxOG5UcyIsInJlYWN0IiwibmV4dCIsIm1pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXMiLCJnZW5lcmF0ZUJ1bmZpZ1RvbWwiLCJleGlzdGluZ0NvbnRlbnQiLCJyZWFkRmlsZVN5bmMiLCJidW5maWdUb21sIiwicGFyc2VCdW5maWdUb21sIiwiYnVuIiwiZ2VuZXJhdGVSdW5TZWN0aW9uIiwiaW5zdGFsbCIsImV4YWN0IiwidXNlckNvbnRlbnRIZWFkZXIiLCJ1c2VyQ29udGVudEhlYWRlclJlZ2V4Iiwic2VwYXJhdG9yIiwiZGVmYXVsdEhlYWRVc2VyQ29udGVudCIsImRlZmF1bHRUYWlsVXNlckNvbnRlbnQiLCJpZ25vcmVGaWxlVXRpbCIsInNlcGFyYXRvclByZWZpeCIsInJlYWRHaXRpZ25vcmVXaXRob3V0U2VwYXJhdG9ycyIsImxhc3RIZWFkZXJJbmRleCIsImdldEluZGV4T2ZUYWlsVXNlckNvbnRlbnRIZWFkZXIiLCJnZXRIZWFkVXNlckNvbnRlbnQiLCJ0aGlzIiwiZ2V0VGFpbFVzZXJDb250ZW50IiwiaXNCZXJyeVplcm9JbnN0YWxsRW5hYmxlZCIsImxhc3RJbmRleCIsImxhc3RJbmRleE9mIiwiZ2VuZXJhdGVEb2NrZXJpZ25vcmUiLCJleHRlbnNpb25zIiwiY29kZVdpdGgySW5kZW50U2l6ZSIsImNvZGVXaXRoNEluZGVudFNpemUiLCJtYXJrZG93bkxpa2UiLCJveGxpbnQiLCJveGZtdCIsInByZXR0aWVyT25seSIsImdlbmVyYXRlRXh0ZW5zaW9ucyIsImdlbmVyYXRlRWRpdG9yY29uZmlnIiwiZGVmYXVsdENvbmZpZyIsImhhdmVfZnVuIiwiY29kZV9yZXZpZXciLCJkaXNhYmxlIiwiY29tbWVudF9zZXZlcml0eV90aHJlc2hvbGQiLCJtYXhfcmV2aWV3X2NvbW1lbnRzIiwicHVsbF9yZXF1ZXN0X29wZW5lZCIsImhlbHAiLCJzdW1tYXJ5IiwiaWdub3JlX3BhdHRlcm5zIiwiZ2VuZXJhdGVHZW1pbmlDb25maWciLCJjb25maWdGaWxlUGF0aCIsInN0eWxlZ3VpZGVGaWxlUGF0aCIsIm5ld0NvbmZpZyIsIm9sZENvbmZpZyIsInlhbWxDb250ZW50IiwiY29kaW5nUnVsZUV4dHJhQ29udGVudCIsInRyaW1TdGFydCIsInN0eWxlZ3VpZGVDb250ZW50IiwidHJpbUVuZCIsInJlbW92ZUdlbWluaVNldHRpbmdzIiwiZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzIiwiZGVmYXVsdE5hbWVzIiwiZ2VuZXJhdGVHaXRpZ25vcmUiLCJoZWFkVXNlckNvbnRlbnQiLCJ0YWlsVXNlckNvbnRlbnQiLCJkb2VzQ29udGFpbkdlbWZpbGUiLCJkb2VzQ29udGFpbkdvTW9kIiwiZG9lc0NvbnRhaW5QYWNrYWdlSnNvbiIsImRvZXNDb250YWluUG9tWG1sIiwiZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCIsImRvZXNDb250YWluVGVtcGxhdGVZYW1sIiwiZG9lc0NvbnRhaW5Qb2V0cnlMb2NrIiwiZG9lc0NvbnRhaW5VdkxvY2siLCJibGl0eiIsImZpcmViYXNlIiwicmVhY3ROYXRpdmUiLCJzdG9yeWJvb2siLCJsaXRlc3RyZWFtIiwiZ2VuZXJhdGVkIiwicmVhZENhY2hlIiwicmVzcG9uc2UiLCJmZXRjaCIsInJlc3BvbnNlVGV4dCIsInRleHQiLCJvayIsIndyaXRlQ2FjaGUiLCJvcyIsImhvbWVkaXIiLCJEYXRlIiwibm93IiwibXRpbWVNcyIsIm94Zm10UHJvZ3JhbSIsInByZXR0aWVyUHJvZ3JhbSIsImdlbmVyYXRlSWRlYVNldHRpbmdzIiwidGFza09wdGlvbnMiLCJwcm9ncmFtIiwidGFzayIsImNyZWF0ZVRhc2tPcHRpb25zIiwicnVubmVyIiwiZXh0ZW5zaW9uIiwiZ2V0V2F0Y2hlclRhc2tzQ29udGVudCIsImdldEdlbkkxOG5Uc0NvbW1hbmQiLCJzcGF3blN5bmMiLCJyZXRyeSIsInNwYXduU3luY0FuZFJldHVyblN0YXR1cyIsIm5ld0NtZCIsIm5ld0FyZ3MiLCJnZXRTcGF3blN5bmNBcmdzIiwic3RhdHVzIiwiY2hpbGRfcHJvY2VzcyIsInNwYXduU3luY0FuZFJldHVyblN0ZG91dCIsInN0ZGlvIiwicHJvYyIsInMiLCJtZXNzYWdlIiwiUEFUSCIsIkJFUlJZX0JJTl9GT0xERVIiLCJlbmNvZGluZyIsInNoZWxsIiwiZ2l0SHViVXRpbCIsImdldE9yZ0FuZE5hbWUiLCJ1cmxPckZ1bGxOYW1lIiwidXJsV2l0aG91dFByb3RvY29sIiwib2N0b2tpdENhY2hlIiwiZ2V0T2N0b2tpdCIsIm93bmVyIiwiY2FjaGVkIiwib2N0b2tpdCIsIk9jdG9raXQiLCJhdXRoIiwiZ2V0R2l0SHViVG9rZW4iLCJoYXNHaXRIdWJUb2tlbiIsIkdIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSIiwiZ2V0R2l0SHViQ2xpVG9rZW4iLCJHSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUkxBQiIsIkdJVEhVQl9UT0tFTiIsImdpdEh1YkNsaVRva2VuIiwiY2hpbGRQcm9jZXNzIiwiZXhlY0ZpbGVTeW5jIiwibWFuYWdlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyIsImlzUHVibGlzaGVkV2lsbGJvb3N0ZXJDb25maWdzUGFja2FnZSIsImlzV2lsbEJvb3N0ZXJDb25maWdzIiwicHJpdmF0ZSIsImZpbGVzIiwib3hsaW50RGVwcyIsInR5cGVzY3JpcHRHb0RlcGVuZGVuY3kiLCJ0eXBlc2NyaXB0RGVwZW5kZW5jeSIsIndiRGVwZW5kZW5jeSIsImJ1aWxkVHNEZXBlbmRlbmN5Iiwid2lsbEJvb3N0ZXJDb25maWdzTWFuYWdlZERlcGVuZGVuY2llcyIsIm9ic29sZXRlTGludERlcGVuZGVuY2llcyIsIm1pY3JvbWF0Y2hQYWNrYWdlTmFtZXMiLCJtaWNyb21hdGNoSW1wb3J0UGF0dGVybiIsImxhdGVzdERlcGVuZGVuY3lWZXJzaW9uQ2FjaGUiLCJkZXBlbmRlbmN5U2VjdGlvbktleXMiLCJnZW5lcmF0ZVBhY2thZ2VKc29uIiwic2tpcEFkZGluZ0RlcHMiLCJqc29uT2JqIiwianNvblRleHQiLCJwZWVyRGVwZW5kZW5jaWVzIiwicmVhZFBhY2thZ2VKc29uIiwiYXV0aG9yIiwic2VjdGlvbiIsImdldERlcGVuZGVuY3lTZWN0aW9ucyIsIlJlZmxlY3QiLCJkZWxldGVQcm9wZXJ0eSIsInJlbW92ZVNlbGZEZXBlbmRlbmN5IiwidmVyc2lvbiIsImlzV29ya3NwYWNlUHJvdG9jb2xSYW5nZSIsImdldExhdGVzdERlcGVuZGVuY3lWZXJzaW9uIiwicmVwbGFjZVdpbGxCb29zdGVyQ29uZmlnc1dvcmtzcGFjZURlcGVuZGVuY3lSYW5nZXMiLCJ0c2xpYiIsImxlcm5hIiwicGluc3QiLCJwcmV0dGllciIsInNlY3Rpb25zIiwicmVtb3ZlV2lsbEJvb3N0ZXJDb25maWdzTWFuYWdlZERlcGVuZGVuY2llcyIsInByZXNlcnZlTWljcm9tYXRjaCIsImZpbGVQYXRocyIsImdsb2JTeW5jIiwiZG9lc1Byb2R1Y3RDb2RlSW1wb3J0TWljcm9tYXRjaCIsInNob3VsZFByZXNlcnZlTWljcm9tYXRjaCIsInNob3VsZFByZXNlcnZlQ29uZmlnUGFja2FnZUxpbnREZXBlbmRlbmN5IiwicmVtb3ZlT2Jzb2xldGVMaW50RGVwZW5kZW5jaWVzIiwicmVtb3ZlRGVwcmVjYXRlZFN0dWZmIiwicmVtb3ZlTGVnYWN5SW5zdGFsbENvbW1hbmRzIiwiZ2VuZXJhdGVTY3JpcHRzIiwicHJldHRpZnkiLCJjYXRjaCIsIm9yaWdpbmFsQ29udGVudCIsIm5ld0xpbmUiLCJsIiwiZ2VuZXJhdGVQcmV0dGllclN1ZmZpeCIsIm5vcm1hbGl6ZVlhcm5Xb3Jrc3BhY2VGb3JlYWNoU2NyaXB0cyIsInVwZGF0ZVNjcmlwdHMiLCJtb3ZlTWFuYWdlZFRvb2xEZXBlbmRlbmNpZXNUb0RldkRlcGVuZGVuY2llcyIsImRlcGVuZGVuY3lVcGRhdGVzIiwicHl0aG9uRGV2RGVwZW5kZW5jaWVzIiwiaGFzSmF2YSIsImRlcGVuZGVuY3lTZWN0aW9ucyIsInJlbW92ZVByZXR0aWVyQXJ0aWZhY3RzIiwiaHVza3kiLCJwb3N0aW5zdGFsbCIsInBvc3RwdWJsaXNoIiwicHJlcHVibGlzaE9ubHkiLCJwcmVwYWNrIiwicG9zdHBhY2siLCJwcmVwYXJlIiwiYXJ0aWxsZXJ5IiwicGxheXdyaWdodCIsIndvcmtzcGFjZXMiLCJ3b3Jrc3BhY2UiLCJpc1diUGFja2FnZSIsIndiIiwidHNjb25maWdCYXNlRGVwZW5kZW5jaWVzIiwiZ2V0VHNjb25maWdCYXNlRGVwZW5kZW5jaWVzIiwidXNlZERlcGVuZGVuY2llcyIsInVzZWREZXBlbmRlbmN5U2V0IiwiZXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMiLCJhYnNvbHV0ZUZpbGVQYXRoIiwicGFyc2VDb25maWdGaWxlVGV4dFRvSnNvbiIsIndhcm4iLCJmb3JtYXRUc0RpYWdub3N0aWMiLCJub3JtYWxpemVUc2NvbmZpZ0V4dGVuZHMiLCJleHRlbmRzIiwiZ2V0RXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMiLCJyZW1vdmVVbnVzZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMiLCJqZXN0IiwiZGVwIiwiYXBwbHlQYWNrYWdlSnNvbkNvbnZlbnRpb25zIiwibGljZW5zZSIsInB1Ymxpc2hDb25maWciLCJhY2Nlc3MiLCJjb25maWdNanNQYXRoIiwiY29uZmlnRHRzUGF0aCIsImNvbmZpZ0RtdHNDb250ZW50Iiwibm9ybWFsaXplUHVibGlzaGVkQ29uZmlnUGFja2FnZU1ldGFkYXRhIiwibWFpbiIsInJlc29sdXRpb25zIiwibGludCIsImRpcnMiLCJkaXIiLCJmb3JtYXQiLCJhcHBlbmRGb3JtYXRDb2RlQ29tbWFuZCIsInB5dGhvblBhY2thZ2VNYW5hZ2VyIiwiZ2V0UHl0aG9uUGFja2FnZU1hbmFnZXIiLCJweXRob25GaWxlcyIsImRpck5hbWVTZXQiLCJweXRob25GaWxlIiwiZmlyc3QiLCJzZWNvbmQiLCJkaXJOYW1lc1N0ciIsInB5dGhvblJ1bm5lciIsImV4aXN0aW5nUmVwb3NpdG9yeSIsIm5vcm1hbGl6ZWRSZXBvc2l0b3J5Iiwibm9ybWFsaXplUmVwb3NpdG9yeVVybEZvclBhY2thZ2VKc29uIiwiYnVpbGROb3JtYWxpemVkUmVwb3NpdG9yeUZvclBhY2thZ2VKc29uIiwibm9ybWFsaXplZEV4aXN0aW5nUmVwb3NpdG9yeSIsImZvcm1hdFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbiIsImFkZEdlbkkxOG5Uc1Bvc3RpbnN0YWxsU2NyaXB0Iiwibm9ybWFsaXplUGFja2FnZU1ldGFkYXRhIiwicGFja2FnZUpzb25EZXBlbmRlbmNpZXMiLCJwYWNrYWdlSnNvbkRldkRlcGVuZGVuY2llcyIsImFkZFBhY2thZ2VKc29uRGVwZW5kZW5jaWVzIiwiYWRkRGVwZW5kZW5jeVZlcnNpb25zVG9QYWNrYWdlSnNvbiIsInBhY2thZ2VOYW1lcyIsInByaXZhdGVQYWNrYWdlcyIsInJlcG8iLCJpc1dvcmtzcGFjZVBhY2thZ2UiLCJvdGhlclRhcmdldCIsImNvbW1pdEhhc2giLCJvcmdhbml6YXRpb24iLCJyZWplY3QiLCJnZXRMYXRlc3RDb21taXRIYXNoIiwiZ2V0TGF0ZXN0UHJpdmF0ZVBhY2thZ2VTcGVjaWZpZXIiLCJ1cGRhdGVQcml2YXRlUGFja2FnZXMiLCJyZW1vdmVFbXB0eURlcGVuZGVuY3lTZWN0aW9ucyIsInNlcmlhbGl6ZVBhY2thZ2VKc29uIiwiaW5zdGFsbE5wbURlcGVuZGVuY2llcyIsImluc3RhbGxEZXBlbmRlbmN5VXBkYXRlcyIsInJlbGF0aXZlRmlsZVBhdGgiLCJyZWxhdGl2ZSIsImZvcm1hdFBhY2thZ2VKc29uV2l0aFByb2plY3RGb3JtYXR0ZXIiLCJjb3JlIiwiZm9ybWF0U2NyaXB0Iiwic2NyaXB0UnVubmVyIiwiZGV2IiwiZGVwZW5kZW5jeVNwZWNpZmllcnMiLCJjdXJyZW50VmVyc2lvbiIsImdldERlcGVuZGVuY3lTcGVjaWZpZXIiLCJnZXRJbnN0YWxsRGVwZW5kZW5jeVNwZWNpZmllciIsImRlcGVuZGVuY2llc1RvSW5zdGFsbCIsInNob3VsZFVwZGF0ZUV4aXN0aW5nRGVwZW5kZW5jeSIsInNob3VsZFVwZGF0ZUV4aXN0aW5nTWFuYWdlZERlcGVuZGVuY3kiLCJkaWFnbm9zdGljIiwiZmxhdHRlbkRpYWdub3N0aWNNZXNzYWdlVGV4dCIsIm1lc3NhZ2VUZXh0IiwiY2FjaGVkVmVyc2lvbiIsImdldERlcGVuZGVuY3lWZXJzaW9uRnJvbU5wbSIsImVzbGludCIsImxhdGVzdFZlcnNpb24iLCJ2YWxpZExhdGVzdFZlcnNpb24iLCJzZW12ZXIiLCJ2YWxpZCIsInZhbGlkQ3VycmVudFZlcnNpb24iLCJndCIsImlzTmV3ZXJNYW5hZ2VkRGVwZW5kZW5jeVZlcnNpb24iLCJyZXBvc2l0b3J5VXJsIiwibWF0Y2hlZCIsImV4ZWMiLCJub3JtYWxpemVkVXJsIiwib2xkU2NyaXB0cyIsImhhc1R5cGVjaGVjayIsImNsZWFudXAiLCJ0eXBlY2hlY2siLCJ2ZXJpZnkiLCJhcHBseU1pc2VUYXNrU2NyaXB0cyIsInB5cmlnaHQiLCJoYXNKc09yVHMiLCJvbGRUZXN0IiwiZ2VuZXJhdGVGb3JtYXRTY3JpcHQiLCJoYXNNaXNlVGFzayIsImRvZXNNaXNlVGFza0NhbGxQYWNrYWdlU2NyaXB0IiwiaXNXYmZ5TWFuYWdlZE1pc2VCcmlkZ2UiLCJtaXNlVGFza3MiLCJSZWdFeHAiLCJyYXciLCJjb21tYW5kcyIsImJhc2VTZXR0aW5ncyIsImdsb2JfbWF0Y2hlciIsInByZUNvbW1pdFNldHRpbmdzIiwic3RhZ2VfZml4ZWQiLCJnZW5lcmF0ZUxlZnRob29rVXBkYXRpbmdQYWNrYWdlSnNvbiIsImh1c2t5RGlyUGF0aCIsImhhc0h1c2t5RGlyIiwic2V0dGluZ3MiLCJnZXRQcmVDb21taXRKb2JzIiwicHJlUHVzaCIsImxpbnRDb21tYW5kIiwicXVpZXRMaW50Q29tbWFuZCIsImdldFByZVB1c2hTY3JpcHQiLCJta2RpclN5bmMiLCJtb2RlIiwicG9zdE1lcmdlQ29tbWFuZCIsInBvc3RNZXJnZUNvbW1hbmRzIiwiaGFzVmVyc2lvblNldHRpbmdzIiwidG9vbHNDaGFuZ2VkUGF0dGVybiIsImluc3RhbGxDb21tYW5kIiwicm1OZXh0RGlyZWN0b3J5IiwiZ2VuSTE4blRzQ29tbWFuZCIsImdlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMiLCJnZXRDbGVhbnVwR2xvYnMiLCJnZXRDbGVhbnVwQ29tbWFuZCIsInN1cHBvcnRlZEV4dGVuc2lvbnMiLCJsb2NhbFdiUGFja2FnZUpzb25QYXRoIiwiaGFzTG9jYWxXYldvcmtzcGFjZSIsImNhblVzZVdiRm9yU3RhZ2VkRmlsZXMiLCJveGxpbnRQYXR0ZXJuIiwib3hmbXRQYXR0ZXJuIiwicHJldHRpZXJQYXR0ZXJuIiwiaGFzUHl0aG9uUGFja2FnZU1hbmFnZXIiLCJnZXRQeXRob25SdW5uZXIiLCJnZW5lcmF0ZUxpbnRzdGFnZWRyYyIsIm5vcm1hbGl6ZUNvbmZpZ0NvbnRlbnQiLCJNYW5hZ2VkQ29uZmlnQmxvY2tzIiwiY29uc3RydWN0b3IiLCJibG9ja05hbWVzIiwibWFya2VyUHJlZml4IiwiZ2V0Q29uZmlnQ29udGVudCIsImhhc01hbmFnZWRCbG9ja3MiLCJyZXBsYWNlTWFuYWdlZEJsb2NrcyIsImRlc2lyZWRDb250ZW50IiwiZ2V0QmxvY2siLCJibG9ja05hbWUiLCJnZXRTdGFydE1hcmtlciIsImdldEVuZE1hcmtlciIsInJlcGxhY2VtZW50IiwiZXh0cmFjdE1hbmFnZWRCbG9jayIsIm5leHRDb250ZW50IiwicmVwbGFjZU1hbmFnZWRCbG9jayIsImdldE1hbmFnZWRCbG9ja1JlZ0V4cCIsInBhdHRlcm4iLCJlc2NhcGVSZWdFeHAiLCJtYW5hZ2VkQ29uZmlnQmxvY2tzIiwiZ2VuZXJhdGVPeGZtdENvbmZpZyIsImxlZ2FjeUpzb25Db25maWdQYXRoIiwiaXNFc21QYWNrYWdlIiwiZ2VuZXJhdGVPeGxpbnRDb25maWciLCJfcm9vdENvbmZpZyIsInNob3VsZFByZXNlcnZlUHVibGlzaGVkTGludGVyQ29uZmlnIiwiaXNSb290Q29uZmlnIiwiZ2V0UmVzb2x2ZWRDb25maWdDb250ZW50IiwiYmFzZUNvbmZpZ05hbWUiLCJnZW5lcmF0ZVByZXR0aWVyaWdub3JlIiwiZ2l0aWdub3JlRmlsZVBhdGgiLCJnaXRpZ25vcmVDb250ZW50IiwiYWRkaXRpb25hbENvbnRlbnQiLCJ2ZW52UGF0aCIsInZlbnYiLCJnZW5lcmF0ZVB5cmlnaHRDb25maWdKc29uIiwiZ2VuZXJhdGVSZWFkbWUiLCJpbnNlcnRCYWRnZSIsImZpbGVOYW1lcyIsInJlYWRkaXJTeW5jIiwiYmFkZ2VOYW1lIiwidG9VcHBlckNhc2UiLCJyZW1vdmVHaXRIdWJBY3Rpb25zQmFkZ2UiLCJyZWFkbWUiLCJpIiwiZXNjYXBlZEJhZGdlTmFtZSIsImVzY2FwZWRGaWxlTmFtZSIsImdlbmVyYXRlUmVsZWFzZXJjIiwicGx1Z2lucyIsInBsdWdpbkVudHJ5IiwicGx1Z2luIiwicHJlc2V0Iiwic3VjY2Vzc0NvbW1lbnRDb25kaXRpb24iLCJmYWlsQ29tbWVudENvbmRpdGlvbiIsImxhYmVscyIsInJlbGVhc2VkTGFiZWxzIiwiJHNjaGVtYSIsImdlbmVyYXRlUmVub3ZhdGVKc29uIiwicGFja2FnZVJ1bGVzIiwicnVsZSIsIm1hdGNoUGFja2FnZU5hbWVzIiwiZW5hYmxlZCIsImluc3RhbGxBZ2VudFNraWxscyIsInJvb3RKc29uT2JqIiwiY29tcGlsZXJPcHRpb25zIiwiYWx3YXlzU3RyaWN0Iiwibm9VbmNoZWNrZWRJbmRleGVkQWNjZXNzIiwiYWxsb3dTeW50aGV0aWNEZWZhdWx0SW1wb3J0cyIsImVzTW9kdWxlSW50ZXJvcCIsInJlc29sdmVKc29uTW9kdWxlIiwiaW1wb3J0SGVscGVycyIsIm5vRW1pdCIsImV4Y2x1ZGUiLCJpbmNsdWRlIiwic3ViSnNvbk9iaiIsImdlbmVyYXRlVHNjb25maWciLCJtb2R1bGVSZXNvbHV0aW9uIiwibm9ybWFsaXplTmV4dFRzY29uZmlnTW9kdWxlU2V0dGluZ3MiLCJiYXNlVXJsIiwiYWxpYXMiLCJ0YXJnZXRzIiwibm9ybWFsaXplUGF0aEFsaWFzVGFyZ2V0cyIsIm5vcm1hbGl6ZU5leHRUc2NvbmZpZ1BhdGhBbGlhc2VzIiwiYWRkU2NyaXB0c0luY2x1ZGVGb3JGcmFtZXdvcmtQcm9qZWN0IiwiY2xlYW51cExlZ2FjeVRzY29uZmlnTW9kdWxlU2V0dGluZ3MiLCJnZW5lcmF0ZWRUeXBlcyIsInR5cGVOYW1lcyIsInZpdGVzdCIsIm1vY2hhIiwiY3lwcmVzcyIsImdldEdlbmVyYXRlZFR5cGVzIiwiZ2V0VHNjb25maWdFeHRlbmRzIiwicm9vdERpciIsImdldFJvb3REaXIiLCJkb2VzQ29udGFpbkpzeE9yVHN4IiwiZG9lc0NvbnRhaW5Kc3hPclRzeEluUGFja2FnZXMiLCJqc3giLCJhZGRJbmNsdWRlUGF0aCIsImV4aXN0aW5nVHlwZXMiLCJleGlzdGluZ0VtaXRNZXRhZGF0YSIsImVtaXRPcHRpb25zIiwicGlja0V4aXN0aW5nRW1pdE1ldGFkYXRhIiwiZ2VuZXJhdGVkRXh0ZW5kcyIsImV4aXN0aW5nRXh0ZW5kcyIsIm1lcmdlZEV4dGVuZHMiLCJub3JtYWxpemVFeHRlbmRzIiwidW5pcXVlRXh0ZW5kcyIsIm1lcmdlVHNjb25maWdFeHRlbmRzIiwiZW1pdERlY2xhcmF0aW9uT25seSIsInJld3JpdGVSZWxhdGl2ZUltcG9ydEV4dGVuc2lvbnMiLCJlbnN1cmVUc0V4dGVuc2lvbkVtaXRDb21wYXRpYmlsaXR5IiwibWVyZ2VkVHlwZXMiLCJmaWx0ZXJFeGlzdGluZ1R5cGVzIiwidHlwZU5hbWUiLCJ0eXBlUm9vdHMiLCJleHBlcmltZW50YWxEZWNvcmF0b3JzIiwibW9kdWxlIiwiZGVsZXRlTGVnYWN5TW9kdWxlU2V0dGluZ3MiLCJ0b0xvd2VyQ2FzZSIsInZlcmJhdGltTW9kdWxlU3ludGF4Iiwibm9ybWFsaXplQ29tbW9uSnNUc2NvbmZpZ1NldHRpbmdzIiwiaXNBYnNvbHV0ZSIsImdlbmVyYXRlZFR5cGVTZXQiLCJpc0dlbmVyYXRlZFRlc3RHbG9iYWxUeXBlIiwiZXhjbHVkZUZpbGVQYXR0ZXJucyIsImdlbmVyYXRlVnNjb2RlU2V0dGluZ3MiLCJleGNsdWRlRmlsZVBhdHRlcm4iLCJleGNsdWRlU2V0dGluZyIsImdlbmVyYXRlWWFybnJjWW1sIiwieWFybnJjWW1sUGF0aCIsImdldExhdGVzdFZlcnNpb24iLCJuZXdWZXJzaW9uIiwib2xkVmVyc2lvbiIsInZhbGlkTmV3VmVyc2lvbiIsImlzTmV3ZXJWZXJzaW9uIiwicmVsZWFzZXNQYXRoIiwieWFybnJjUGF0aCIsImRlZmF1bHRTZW12ZXJSYW5nZVByZWZpeCIsImVuYWJsZVNjcmlwdHMiLCJub2RlTGlua2VyIiwibm1Nb2RlIiwibnBtTWluaW1hbEFnZUdhdGUiLCJhcHByb3ZlZEdpdFJlcG9zaXRvcmllcyIsIm5wbVByZWFwcHJvdmVkUGFja2FnZXMiLCJjb21wcmVzc2lvbkxldmVsIiwiaW5qZWN0RW52aXJvbm1lbnRGaWxlcyIsImVuYWJsZUdsb2JhbENhY2hlIiwib3JpZ2luYWxMZW5ndGgiLCJwbHVnaW5QYXRoIiwiZ2V0WWFybnJjUHJldHRpZXJBcmdzIiwic2V0dXBMYWJlbHMiLCJzZXR1cExhYmVsIiwiZGVsZXRlTGFiZWwiLCJjb2xvciIsInJlcXVlc3QiLCJERVBSRUNBVEVEX1NFQ1JFVF9OQU1FUyIsInJlcXVpcmUiLCJjcmVhdGVSZXF1aXJlIiwic2V0dXBTZWNyZXRzIiwiZG90ZW52IiwicXVpZXQiLCJzZWNyZXROYW1lIiwic2VjcmV0X25hbWUiLCJrZXlfaWQiLCJrZXlJZCIsImRhdGEiLCJzb2RpdW0iLCJyZWFkeSIsInNlY3JldCIsInJhd0tleSIsImZyb21fYmFzZTY0IiwiYmFzZTY0X3ZhcmlhbnRzIiwiT1JJR0lOQUwiLCJyYXdTZWMiLCJmcm9tX3N0cmluZyIsImVuY0J5dGVzIiwiY3J5cHRvX2JveF9zZWFsIiwiZW5jQmFzZTY0IiwidG9fYmFzZTY0IiwiZW5jcnlwdGVkX3ZhbHVlIiwic2V0dXBHaXRIdWJTZXR0aW5ncyIsImJlZm9yZVJldHJ5IiwiaGFuZGxlRXJyb3IiLCJyZXRyeUNvdW50IiwicmV0cnlMb2dnZXIiLCJzaG91bGRSZXRyeSIsInNsZWVwTWlsbGlzZWNvbmRzIiwidXBkYXRlU2xlZXBNaWxsaXNlY29uZHMiLCJmYWlsZWRDb3VudCIsIndpdGhSZXRyeSIsImFsbG93X2F1dG9fbWVyZ2UiLCJhbGxvd19tZXJnZV9jb21taXQiLCJhbGxvd19zcXVhc2hfbWVyZ2UiLCJhbGxvd19yZWJhc2VfbWVyZ2UiLCJhbGxvd191cGRhdGVfYnJhbmNoIiwiZGVsZXRlX2JyYW5jaF9vbl9tZXJnZSIsInNxdWFzaF9tZXJnZV9jb21taXRfdGl0bGUiLCJzcXVhc2hfbWVyZ2VfY29tbWl0X21lc3NhZ2UiLCJoZWFkZXJzIiwiaXNHaXRIdWJQZXJtaXNzaW9uT3JWaXNpYmlsaXR5RXJyb3IiLCJwYWNrYWdlTWFuYWdlclJ1blBsYWNlaG9sZGVyIiwidGVtcGxhdGVzIiwiZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMiLCJhcHBseVBhY2thZ2VNYW5hZ2VyVGVtcGxhdGUiLCJkaXN0YW5jZSIsInRlbXBsYXRlIiwicGFja2FnZU1hbmFnZXJDb21tYW5kIiwid2JmeUpzb25TY2hlbWEiLCJ6IiwicmVjb3JkIiwib3B0aW9uYWwiLCJkb2MiLCJnZXRQYWNrYWdlQ29uZmlnIiwiZXNtUGFja2FnZSIsInBhY2thZ2VKc29uVGV4dCIsInJlbGVhc2VCcmFuY2hlcyIsInJlbGVhc2VQbHVnaW5zIiwicmVsZWFzZXJjSnNvblBhdGgiLCJmc3AiLCJmbGF0IiwicmVwb0luZm8iLCJnaXQiLCJzaW1wbGVHaXQiLCJvcmlnaW4iLCJnZXRSZW1vdGVzIiwiciIsInJlbW90ZVVybCIsInJlZnMiLCJyZXF1ZXN0UmVwb0luZm8iLCJmZXRjaFJlcG9JbmZvIiwiY3VycmVudCIsImhhc1ZlcnNpb25TZXR0aW5nc0ZpbGUiLCJkb2NrZXJmaWxlIiwid2JmeUpzb25QYXRoIiwid2JmeUpzb25UZXh0IiwicmVwb0Z1bGxOYW1lIiwiZnVsbF9uYW1lIiwicmVwb0F1dGhvciIsInJlcG9OYW1lIiwicmVwb1BhcnRzIiwiaXNSZWZlcnJlZEJ5T3RoZXJSZXBvIiwiY29udGFpbnNBbnkiLCJkb2VzQ29udGFpblZzY29kZVNldHRpbmdzSnNvbiIsImdpdGh1YiIsInJlYWRNaXNlVGFza3MiLCJ0YXNrcyIsInRvbWwiLCJyZWFkTWlzZVRhc2tDb21tYW5kIiwib3JnIiwicmVkaXJlY3RlZEZ1bGxOYW1lIiwibG9jYXRpb24iLCJnZXRSZWRpcmVjdGVkUmVwb0Z1bGxOYW1lIiwiYWxsb3dlZEdpdEh1Yk9yZ2FuaXphdGlvblBhdHRlcm4iLCJhbGxvd2VkR2l0RGVwZW5kZW5jeVBhdHRlcm5zIiwiYXNzZXJ0U2FmZURlcGVuZGVuY3lTb3VyY2VzIiwiZGlzYWxsb3dlZFNvdXJjZXMiLCJnZXREaXNhbGxvd2VkRGVwZW5kZW5jeVNvdXJjZXMiLCJkZXRhaWxzIiwiZGVwZW5kZW5jeU5hbWUiLCJzZWN0aW9uTmFtZSIsImlzR2l0RGVwZW5kZW5jeVNwZWNpZmllciIsImlzQWxsb3dlZEdpdERlcGVuZGVuY3lTcGVjaWZpZXIiLCJpc0dpdEh1YlNob3J0aGFuZFNwZWNpZmllciIsInJlZnJlc2hCdW5Mb2NrIiwicm9vdERpclBhdGgiLCJhcmd2IiwieWFyZ3MiLCJwb3NpdGlvbmFsIiwiZGVzY3JpYmUiLCJkZWZhdWx0Iiwic2tpcERlcHMiLCJ2ZXJib3NlIiwicGFja2FnZUpzb25EaXIiLCJVUkwiLCJwYXRobmFtZSIsImdldFZlcnNpb24iLCJzdHJpY3QiLCJoYXNJbnZhbGlkUGFja2FnZUNvbmZpZyIsInBhY2thZ2VzRGlyUGF0aCIsInN1YkRpclBhdGhzIiwiZCIsImFiYnJldmlhdGlvblByb21pc2UiLCJzdWJQYWNrYWdlQ29uZmlncyIsInN1YkRpclBhdGgiLCJhbGxQYWNrYWdlQ29uZmlncyIsInNob3VsZFJ1bldvcmtmbG93cyIsInRoZW4iLCJleGl0Q29kZSJdLCJtYXBwaW5ncyI6IjhwQkFBT0EsZUFBZUMsRUFBTUMsR0FDMUIsT0FBTyxJQUFJQyxRQUFTQyxHQUFZQyxXQUFXRCxFQUFTRixHQUN0RCxDQ2lDT0YsZUFBZU0sRUFBb0JDLEdBQ3hDLElBQ0UsYUFBYUEsR0FDZixDQUFFLE1BQ0EsQ0FFSixDQUVPUCxlQUFlUSxFQUFxQkQsR0FDekMsSUFDRSxhQUFhQSxHQUNmLENBQUUsTUFBT0UsR0FDUCxHQUFxQixpQkFBVkEsR0FBc0JBLEdBQVMsU0FBVUEsR0FBd0IsV0FBZkEsRUFBTUMsS0FDakUsT0FFRixNQUFNRCxDQUNSLENBQ0YsQ0MvQ08sTUFBTUUsRUFBVSxJQUx2QixNQUNFQyxXQUFZLEVBQ1pDLG1CQUFvQixHQ2dCZixNQUFNQyxFQUFTLElBaEJ0QixNQUNFLCtCQUFNQyxDQUEwQkMsRUFBY0MsR0FDeENOLEVBQVFDLFdBQ1ZNLFFBQVFDLEtBQUssYUFBYUgscUJBRTVCLFVBQ1FDLEdBQ1IsQ0FBRSxNQUFPUixHQUNQUyxRQUFRQyxLQUFLLHFCQUFxQkgsTUFBU1AsYUFBaUJXLE1BQVFYLEVBQU1ZLE1BQVFDLE9BQU9iLE1BQzNGLENBQ0lFLEVBQVFDLFdBQ1ZNLFFBQVFDLEtBQUssY0FBY0gsbUJBRS9CLEdDWldPLEVBQVMsQ0FDcEIsMkJBQU1DLENBQXNCQyxHQUMxQixJQUNFLGFBQWFDLEVBQUdDLFNBQVNDLFNBQVNILEVBQVUsT0FDOUMsQ0FBRSxNQUNBLENBRUosRUFDQSxrQkFBTUksQ0FBYUosRUFBa0JLLFNBQzdCSixFQUFHQyxTQUFTSSxNQUFNQyxFQUFLQyxRQUFRUixH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RDZsQixHQUFZN2xCLEdBQ1pxbUIsR0FBYXJtQixHQUNiMm5CLEdBQW9CM25CLEdBQ3BCdWEsR0FBb0N2YSxHQUNwQ3FjLEdBQXFCcmMsV0FFakI1YSxFQUFZOGUsYUFFbEIsTUFBTXpmLEVBQTRCLEdBQ2xDLElBQUssTUFBTWMsS0FBVTRvQyxHQUNmNW9DLEVBQU9vRCx1QkFBeUJwRCxFQUFPcUQsa0NBQ3pDbkUsRUFBU2tELEtBQUt5VixHQUFtQjdYLEVBQVFBLEVBQU9pWSxPQUFTMndCLEVBQW9CLENBQUM1b0MsS0FFNUVBLEVBQU8ySixVQUFVcVcsZ0JBQ25COWdCLEVBQVNrRCxLQUFLaUMsRUFBb0JyRSxJQUVoQ0EsRUFBTzJKLFVBQVUyVyxNQUNuQnBoQixFQUFTa0QsS0FBS3JDLEVBQWtCQyxVQUU1QmtrQixHQUFrQmxrQixFQUFReWEsU0FDMUI1YSxFQUFZOGUsY0FDYjNlLEVBQU9pWSxRQUFXalksRUFBT3VrQixnQ0FHeEJzVSxHQUF1Qjc0QixTQUN2QitwQixHQUFvQi9wQixFQUFReWEsRUFBWWd0QixFQUFLSyxVQUVuRDVvQyxFQUFTa0QsS0FBSzAwQixHQUFxQjkyQixJQUMvQkEsRUFBT2ttQywrQkFBaUNsbUMsRUFBT3VrQix3QkFDakRybEIsRUFBU2tELEtBQUt5OEIsR0FBdUI3K0IsS0FFbkNBLEVBQU9vRCx1QkFBeUJwRCxFQUFPcUQsa0NBQ3pDbkUsRUFBU2tELEtBQUt1NUIsR0FBaUIzN0IsSUFFN0JpRCxFQUFrQmpELElBQ3BCZCxFQUFTa0QsS0FBS2cyQixHQUFvQnA0QixJQUNsQ2QsRUFBU2tELEtBQUttMkIsR0FBcUJ2NEIsTUFDekJBLEVBQU9pWSxRQUFValksRUFBT3VrQix3QkFBMEJ0aEIsRUFBa0J3WCxJQUk5RXZiLEVBQVNrRCxLQUFLbTJCLEdBQXFCdjRCLElBRWpDQSxFQUFPMkosVUFBVXNxQixTQUNuQi8wQixFQUFTa0QsS0FBSysyQixHQUEwQm41QixXQUd0Q3RDLFFBQVE4WSxJQUFJdFgsU0FDWlcsRUFBWThlLGFBRWxCLE1BQU16TSxFQUFpQnVJLEVBQVdoWCxNQUFRLE1BQVEsT0FFOUNnWCxFQUFXaFgsWUFDUHBGLEVBQU9DLDBCQUEwQixpQkFBa0JmLGdCQUNqREcsUUFBUUMsVUFDZDRwQyxHQUFlQyxLQUdqQjlnQixHQUFVeFUsRUFBZ0IsQ0FBQyxVQUFXLGtCQUFtQnMxQixHQUUzRDlnQixHQUFVeFUsRUFBZ0IsQ0FBQyxXQUFZczFCLFNBRWpDMU0sSUFDUixDQUNJdU4sSUFDRjkxQixRQUFRdzJCLFNBQVcsRUFFdkIsQ0F1Qk05WiIsInhfZ29vZ2xlX2lnbm9yZUxpc3QiOlsxMSwxMiwxMywxNCwxNV19
|
|
31
|
+
`.trim()}function Jn(e){return e.doesContainPoetryLock||e.doesContainUvLock}function Un(e){return e.doesContainUvLock?"uv run":"poetry run"}async function Gn(t){return _.functionIgnoringException("generateLintstagedrc",async()=>{await Promise.all([C.run(()=>e.promises.rm(`${t.dirPath}/.lintstagedrc.cjs`,{force:!0})),C.run(()=>e.promises.rm(`${t.dirPath}/.lintstagedrc.js`,{force:!0})),C.run(()=>e.promises.rm(`${t.dirPath}/.lintstagedrc.json`,{force:!0}))])})}function zn(e){return e?.trim()}class qn{constructor(e){this.blockNames=e.blockNames,this.markerPrefix=e.markerPrefix,this.toolName=e.toolName}getConfigContent(e){return e.existingContent&&this.hasManagedBlocks(e.existingContent)?this.replaceManagedBlocks(e.existingContent,e.desiredContent,e.filePath):e.desiredContent}getBlock(e,t){return`${this.getStartMarker(e)}\n${t}\n${this.getEndMarker(e)}`}hasManagedBlocks(e){return this.blockNames.some(t=>e.includes(this.getStartMarker(t)))}replaceManagedBlocks(e,t,n){let i=e;for(const r of this.blockNames){const s=this.extractManagedBlock(t,r);if(!s)continue;const o=this.replaceManagedBlock(i,r,s);if(!o)return console.warn(`Skipped updating incomplete ${r} block in ${this.toolName} config: ${n}`),e;i=o}return i}extractManagedBlock(e,t){return this.getManagedBlockRegExp(t).exec(e)?.[0]}replaceManagedBlock(e,t,n){const i=this.getManagedBlockRegExp(t);if(i.test(e))return e.replace(i,n)}getManagedBlockRegExp(e){return new RegExp(`${Hn(this.getStartMarker(e))}[\\s\\S]*?${Hn(this.getEndMarker(e))}`)}getStartMarker(e){return`// wbfy:start ${this.markerPrefix}-${e}`}getEndMarker(e){return`// wbfy:end ${this.markerPrefix}-${e}`}}function Hn(e){return e.replaceAll(/[.*+?^${}()|[\]\\]/g,String.raw`\$&`)}const Yn=new qn({blockNames:["base","export"],markerPrefix:"oxfmt",toolName:"oxfmt"});async function Kn(n){return _.functionIgnoringException("generateOxfmtConfig",async()=>{const i=t.resolve(n.dirPath,".oxfmtrc.json"),r=t.resolve(n.dirPath,"oxfmt.config.ts"),s=await P.readFileIgnoringError(r),o=Yn.getConfigContent({desiredContent:Vn(n),existingContent:s,filePath:r}),a=[C.run(()=>e.promises.rm(i,{force:!0}))];zn(s)!==zn(o)&&a.push(C.run(()=>P.generateFile(r,o))),await Promise.all(a)})}function Vn(e){return e.isEsmPackage?`${Yn.getBlock("base","import config from '@willbooster/oxfmt-config';")}\n\n${Yn.getBlock("export","export default config;")}\n`:`${Yn.getBlock("base","// oxlint-disable typescript(TS2591), unicorn/prefer-module -- Oxfmt config files are only auto-discovered as .ts, and CommonJS avoids Node typeless ESM warnings.\nconst oxfmtConfig = require('@willbooster/oxfmt-config');\n\nconst oxfmtResolvedConfig = oxfmtConfig.default ?? oxfmtConfig;")}\n\n${Yn.getBlock("export","module.exports = oxfmtResolvedConfig;")}\n`}const Xn=new qn({blockNames:["base","export"],markerPrefix:"oxlint",toolName:"oxlint"});async function Zn(n,i){return _.functionIgnoringException("generateOxlintConfig",async()=>{const i=Qt(n),r=t.resolve(n.dirPath,"oxlint.config.ts"),s=await P.readFileIgnoringError(r),o=i&&s&&!Xn.hasManagedBlocks(s)?s:Xn.getConfigContent({desiredContent:Qn(n),existingContent:s,filePath:r}).replaceAll("config.","oxlintResolvedConfig.");const a=[];i||a.push(C.run(()=>e.promises.rm(t.resolve(n.dirPath,".oxlintrc.json"),{force:!0})),C.run(()=>e.promises.rm(t.resolve(n.dirPath,"biome.json"),{force:!0})),C.run(()=>e.promises.rm(t.resolve(n.dirPath,"biome.jsonc"),{force:!0})),C.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintrc"),{force:!0})),C.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintrc.cjs"),{force:!0})),C.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintrc.js"),{force:!0})),C.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintrc.json"),{force:!0})),C.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintrc.yaml"),{force:!0})),C.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintrc.yml"),{force:!0})),C.run(()=>e.promises.rm(t.resolve(n.dirPath,"eslint.config.cjs"),{force:!0})),C.run(()=>e.promises.rm(t.resolve(n.dirPath,"eslint.config.js"),{force:!0})),C.run(()=>e.promises.rm(t.resolve(n.dirPath,"eslint.config.mjs"),{force:!0})),C.run(()=>e.promises.rm(t.resolve(n.dirPath,"eslint.config.ts"),{force:!0}))),zn(s)!==zn(o)&&a.push(C.run(()=>P.generateFile(r,o))),await Promise.all(a)})}function Qn(e){const t=e.isRoot;return e.isEsmPackage?`${Xn.getBlock("base",`import oxlintBaseConfig from '@willbooster/oxlint-config';\n\n${ei("oxlintBaseConfig",t)}`)}\n\n${Xn.getBlock("export","export default oxlintResolvedConfig;")}\n`:`${Xn.getBlock("base",`// oxlint-disable typescript(TS2591), unicorn/prefer-module -- Oxlint only auto-discovers .ts config files, and CommonJS avoids Node typeless ESM warnings.\nconst oxlintBaseConfig = require('@willbooster/oxlint-config');\n\n${ei("oxlintBaseConfig.default ?? oxlintBaseConfig",t)}`)}\n\n${Xn.getBlock("export","module.exports = oxlintResolvedConfig;")}\n`}function ei(e,t){return t?`const oxlintResolvedConfig = ${e};`:`// Oxlint only supports type-aware options in the root config, while it\n// still auto-discovers package-local config files in monorepos. Keep this as a\n// plain object copy so package typechecks do not export oxlint's private helper\n// types through the generated config variable.\nconst oxlintResolvedConfig: Record<string, unknown> = { ...${e} };\ndelete oxlintResolvedConfig.options;`}async function ti(n){return _.functionIgnoringException("generatePrettierignore",async()=>{const i=t.resolve(n.dirPath,".prettierignore");if(!B(n))return void await C.run(()=>e.promises.rm(i,{force:!0}));const r=await P.readFileIgnoringError(i)??"",s=vt.getHeadUserContent(r),o=vt.getTailUserContent(r),a=t.resolve(n.dirPath,".gitignore"),c=await vt.readGitignoreWithoutSeparators(a)||"";let l="";n.doesContainPubspecYaml&&(l="\nandroid/app/\nios/Runner/Assets.xcassets/\npubspec.yaml\n");const p=s+"\n3rd-party/\nandroid/\nios/\nno-format/\ntest-fixtures/\ntest/fixtures/\n*.d.ts\n*.min.js\n.yarn/\n.pnp.js\n"+l+c+o;await C.run(()=>P.generateFile(i,p))})}const ni={venvPath:".",venv:".venv"};async function ii(n){return _.functionIgnoringException("generatePyrightConfigJson",async()=>{let i=structuredClone(ni);const r=t.resolve(n.dirPath,"pyrightconfig.json");try{const t=await e.promises.readFile(r,"utf8"),n=JSON.parse(t);i=l.all([i,n,i],{arrayMerge:qe})}catch{}const s=JSON.stringify(i,void 0,2);await C.run(()=>P.generateFile(r,s))})}async function ri(n){return _.functionIgnoringException("generateReadme",async()=>{const i=t.resolve(n.dirPath,"README.md");let r=await e.promises.readFile(i,"utf8");e.existsSync(t.resolve(n.dirPath,".releaserc.json"))&&(r=si(r,"[](https://github.com/semantic-release/semantic-release)"));const s=n.repository?.slice(n.repository.indexOf(":")+1),o=t.resolve(n.dirPath,".github","workflows"),a=e.existsSync(o)?e.readdirSync(o):[];for(const i of a){if(!i.startsWith("test")&&!i.startsWith("deploy"))continue;let o=i;if(o=(o[0]||"").toUpperCase()+o.slice(1,o.indexOf(".")),o=o.replace("-"," "),!s)continue;const a=`[](https://github.com/${s}/actions/workflows/${i})`;e.existsSync(t.resolve(n.dirPath,`.github/workflows/${i}`))&&(r=oi(r,o,i),r=si(r,a))}await C.run(()=>P.generateFile(i,r))})}function si(e,t){e=e.replace(t,"").replaceAll(/\n\n\n+/g,"\n\n");for(let n=0;n<e.length;n++)if("\n"===e[n-1]&&"\n"===e[n]){const i=e.slice(0,n+1);let r=e.slice(n+1);return r.startsWith("[")||r.startsWith("!")||(r=`\n${r}`),`${i}${t}\n${r}`}return`${e}\n${t}\n`}function oi(e,t,n){const i=ai(t),r=ai(n);return e.replaceAll(new RegExp(String.raw`\[!\[${i}\]\(https://github\.com/[^/\s)]+/[^/\s)]+/actions/workflows/${r}/badge\.svg\)\]\(https://github\.com/[^/\s)]+/[^/\s)]+/actions/workflows/${r}\)\n?`,"gu"),"").replaceAll(/\n\n\n+/g,"\n\n")}function ai(e){return e.replaceAll(/[.*+?^${}()|[\]\\]/g,String.raw`\$&`)}async function ci(n){return _.functionIgnoringException("generateReleaserc",async()=>{const i=t.resolve(n.dirPath,".releaserc.json");if(!e.existsSync(i))return;const r=JSON.parse(await e.promises.readFile(i,"utf8")),s=r.plugins??[];for(let e=0;e<s.length;e++){const t=s[e],n=Array.isArray(t),i=n?t[0]:t,r=n&&t[1]||{};"@semantic-release/commit-analyzer"===i?s[e]=["@semantic-release/commit-analyzer",l.all([r,{preset:"conventionalcommits"}],{arrayMerge:qe})]:"@semantic-release/github"===i&&(s[e]=["@semantic-release/github",l.all([r,{successCommentCondition:!1,failCommentCondition:!1,labels:["r: semantic-release"],releasedLabels:["released :bookmark:"]}],{arrayMerge:qe})])}const o=JSON.stringify(r,void 0,2);await C.run(()=>P.generateFile(i,o))})}const li={$schema:"https://docs.renovatebot.com/renovate-schema.json",extends:["github>WillBooster/willbooster-configs:renovate.json5"]};async function pi(n){return _.functionIgnoringException("generateRenovateJson",async()=>{let i=structuredClone(li);const r=t.resolve(n.dirPath,"renovate.json");if(e.existsSync(`${r}5`))return;try{const t=await e.promises.readFile(r,"utf8"),n=JSON.parse(t);i=l.all([i,n,i],{arrayMerge:qe}),i.extends=i.extends.filter(e=>"@willbooster"!==e)}catch{}n.depending.blitz&&(i.packageRules??=[],i.packageRules.some(e=>e.matchPackageNames?.includes("next"))||i.packageRules.push({matchPackageNames:["next"],enabled:!1})),await C.run(()=>e.promises.rm(t.resolve(n.dirPath,".dependabot"),{force:!0})),await C.run(()=>e.promises.rm(t.resolve(n.dirPath,".renovaterc.json"),{force:!0}));const s=JSON.stringify(i,void 0,2);await C.run(()=>P.generateFile(r,s))})}async function di(e){return _.functionIgnoringException("installAgentSkills",async()=>{})}const ui={compilerOptions:{alwaysStrict:!0,noUncheckedIndexedAccess:!0,allowSyntheticDefaultImports:!0,esModuleInterop:!0,resolveJsonModule:!0,importHelpers:!1,noEmit:!0},exclude:["packages/*/test/fixtures","test/fixtures"],include:["*.config.ts","packages/*/*.config.ts","packages/*/scripts/**/*","packages/*/src/**/*","packages/*/test/**/*","scripts/**/*","src/**/*","test/**/*"]},fi={compilerOptions:{alwaysStrict:!0,noUncheckedIndexedAccess:!0,allowSyntheticDefaultImports:!0,esModuleInterop:!0,resolveJsonModule:!0,importHelpers:!1,noEmit:!0},exclude:["test/fixtures"],include:["*.config.ts","scripts/**/*","src/**/*","test/**/*"]};async function gi(n){return _.functionIgnoringException("generateTsconfig",async()=>{if(n.depending.blitz||n.depending.next)return void await async function(n){const i=t.resolve(n.dirPath,"tsconfig.json");try{const t=JSON.parse(await e.promises.readFile(i,"utf8"));!function(e){if(!e)return;"node"!==e.moduleResolution&&"Node"!==e.moduleResolution&&"node10"!==e.moduleResolution&&void 0!==e.moduleResolution||(e.moduleResolution="bundler")}(t.compilerOptions),function(e){if(!e)return;if(delete e.baseUrl,!e.paths)return;for(const[t,n]of Object.entries(e.paths))e.paths[t]=mi(n)}(t.compilerOptions),function(e){if(!e.include)return;if(e.include.includes("scripts/**/*"))return;e.include.push("scripts/**/*"),e.include.sort()}(t),await C.run(()=>P.generateFile(i,JSON.stringify(t,void 0,2)))}catch{}}(n);let i=structuredClone(n.isRoot?ui:fi);const r=function(e){const t=new Set,n={...e.packageJson?.dependencies,...e.packageJson?.devDependencies};e.isBun?t.add("bun"):e.depending.reactNative||t.add("node");(n.jest||n["@jest/globals"]||n["jest-environment-jsdom"]||n["ts-jest"])&&t.add("jest");n.vitest&&t.add("vitest/globals");n.mocha&&t.add("mocha");n.cypress&&t.add("cypress");return[...t]}(n);i.extends=function(e){return e.isBun?"@tsconfig/bun/tsconfig.json":e.depending.reactNative?"@tsconfig/react-native/tsconfig.json":["@tsconfig/node-lts/tsconfig.json","@tsconfig/node-ts/tsconfig.json"]}(n),i.compilerOptions??={},i.compilerOptions.rootDir=function(n){return n.isRoot?".":e.existsSync(t.resolve(n.dirPath,"..","..","package.json"))?"../..":"."}(n),r.length>0&&(i.compilerOptions={...i.compilerOptions,types:r}),n.doesContainJsxOrTsx||n.doesContainJsxOrTsxInPackages?n.isBun||n.depending.reactNative||(i.compilerOptions={...i.compilerOptions,jsx:"react-jsx"}):delete i.compilerOptions?.jsx,n.isRoot&&!n.doesContainSubPackageJsons&&(i.include=i.include?.filter(e=>!e.startsWith("packages/*/")),i.exclude=i.exclude?.filter(e=>!e.startsWith("packages/*/"))),n.depending.prisma&&function(e,t){e.include??=[],e.include.includes(t)||e.include.push(t)}(i,"prisma/**/*");const s=t.resolve(n.dirPath,"tsconfig.json");try{const t=await e.promises.readFile(s,"utf8"),n=JSON.parse(t),a=(o=n.compilerOptions?.types,"string"==typeof o?[o]:Array.isArray(o)?o.filter(e=>"string"==typeof e):[]),c=function(e){const t={};for(const n of["declaration","declarationMap","sourceMap"]){const i=e?.[n];void 0!==i&&(t[n]=i)}return t}(n.compilerOptions);i.extends=function(e,t){const n=[...yi(e),...yi(t)],i=[...new Set(n)];return 0===i.length?void 0:1===i.length?i[0]:i}(i.extends,n.extends),delete n.extends,delete n.compilerOptions?.jsx,i=l.all([i,n,i],{arrayMerge:He}),i.include=i.include?.filter(e=>!e.includes("@types")&&!e.includes("__tests__/")&&!e.includes("tests/")),i.compilerOptions??={},i.compilerOptions={...i.compilerOptions,...c},function(e){if(!e)return;if(!1!==e.noEmit||!0===e.emitDeclarationOnly)return;e.rewriteRelativeImportExtensions=!0}(i.compilerOptions);const p=[...new Set([...hi(a,r),...r])];p.length>0?i.compilerOptions.types=p:delete i.compilerOptions.types,r.some(e=>"cypress"===e||e.includes("/"))&&delete i.compilerOptions.typeRoots}catch{}var o;Ve(i),i.include?.sort(),delete i.compilerOptions?.experimentalDecorators,delete i.compilerOptions?.baseUrl,function(e,t){if(!e)return;"node"!==e.moduleResolution&&"Node"!==e.moduleResolution&&"node10"!==e.moduleResolution||delete e.moduleResolution;if(t.isBun||t.depending.reactNative||"ESNext"!==e.module)return;delete e.module}(i.compilerOptions,n),function(e,t){if(!e||t.isBun||t.depending.reactNative||t.isEsmPackage)return;"commonjs"===e.module?.toLowerCase()&&(e.module="Node16");e.verbatimModuleSyntax=!1}(i.compilerOptions,n),n.depending.reactNative&&delete i.compilerOptions?.verbatimModuleSyntax;const a=JSON.stringify(i,void 0,2);await C.run(()=>P.generateFile(s,a))})}function mi(e){return e.map(e=>e.startsWith("./")||e.startsWith("../")||t.isAbsolute(e)?e:`./${e}`)}function yi(e){return e?Array.isArray(e)?e:[e]:[]}function hi(e,t){const n=new Set(t);return e.filter(e=>!(function(e){return"cypress"===e||"jest"===e||"mocha"===e||"vitest/globals"===e}(e)&&!n.has(e)))}const wi=["**/.git/objects/**","**/.git/subtree-cache/**","**/node_modules/**","**/tmp/**","**/temp/**","**/dist/**"];async function bi(n){return _.functionIgnoringException("generateVscodeSettings",async()=>{try{const i=t.resolve(n.dirPath,".vscode","settings.json"),r=await e.promises.readFile(i,"utf8");let s=JSON.parse(r);for(const e of wi)s=l.all([s,vi(e)]);(n.doesContainPoetryLock||n.doesContainUvLock)&&(s=l.all([s,vi("**/.venv/**")])),n.depending.next&&(s=l.all([s,vi("**/.next/**")])),"editor.codeActionsOnSave"in s&&delete s["editor.codeActionsOnSave"],"editor.formatOnSave"in s&&delete s["editor.formatOnSave"],Ve(s);const o=JSON.stringify(s,void 0,2);await C.run(()=>P.generateFile(i,o))}catch{}})}function vi(e){return{"files.watcherExclude":{[e]:!0}}}async function xi(n){return _.functionIgnoringException("generateYarnrcYml",async()=>{const i=t.resolve(n.dirPath,".yarnrc.yml");if(n.isBun)return await C.run(()=>e.promises.rm(i,{force:!0})),await C.run(()=>e.promises.rm(t.resolve(n.dirPath,".yarn"),{force:!0,recursive:!0})),void await C.run(()=>e.promises.rm(t.resolve(n.dirPath,"yarn.lock"),{force:!0,recursive:!0}));const r=Ut("yarn",["--version"],n.dirPath),s=function(e,t){return Ut("npm",["show",e,"version"],t)||"0.0.0"}("@yarnpkg/cli",n.dirPath);(function(e,t){const n=m.valid(e);return!!n&&m.gt(n,m.valid(t)??"0.0.0")})(s,r)&&Mt("yarn",["set","version",s],n.dirPath,1);const o=t.join(n.dirPath,".yarn","releases");await e.promises.mkdir(o,{recursive:!0});for(const n of await e.promises.readdir(o))n.startsWith("yarn-")&&!n.startsWith(`yarn-${s}.`)&&await C.run(()=>e.promises.rm(t.join(o,n)));const a=t.resolve(n.dirPath,".yarnrc");await C.run(()=>e.promises.rm(a,{force:!0}));let c={};try{c=p.load(await e.promises.readFile(i,"utf8"))??c}catch{}c.defaultSemverRangePrefix="",c.enableScripts=!1,c.nodeLinker="node-modules",c.nmMode="hardlinks-global",c.npmMinimalAgeGate="5d",c.approvedGitRepositories=["https://github.com/WillBooster/*.git","ssh://git@github.com/WillBooster/*.git","https://github.com/WillBoosterLab/*.git","ssh://git@github.com/WillBoosterLab/*.git"],c.npmPreapprovedPackages=["@exercode/*","@willbooster/*","agent-runtime-kit","at-decorators","build-ts","gen-i18n-ts","one-way-git-sync","next","@next/*","@types/*","@typescript/*","@oxfmt/*","@oxlint/*","@oxlint-tsgolint/*","oxfmt","oxlint","oxlint-tsgolint","react","react-dom"],delete c.compressionLevel,0===c.injectEnvironmentFiles?.length&&delete c.injectEnvironmentFiles,c.enableGlobalCache=!0;const l=c.plugins?.length??0;if(c.plugins=c.plugins?.filter(e=>".yarn/plugins/undefined.cjs"!==e.path)??[],c.plugins.length!==l){const i=t.resolve(n.dirPath,".yarn","plugins","undefined.cjs");await C.run(()=>e.promises.rm(i,{force:!0}))}0===c.plugins.length&&delete c.plugins,await e.promises.writeFile(i,p.dump(c,{lineWidth:-1})),Mt("yarn",["dlx","yarn-plugin-auto-install"],n.dirPath),Mt("yarn",function(e,n){return["dlx","prettier","--no-config","--write",t.relative(e,n)]}(n.dirPath,i),n.dirPath)})}async function ki(e){return _.functionIgnoringException("setupLabels",async()=>{const[t,n]=zt.getOrgAndName(e.repository??"");if(!t||!n)return;if("WillBooster"!==t&&"WillBoosterLab"!==t)return;if(!Yt(t))return;const i=Ht(t);try{await ji(i,t,n,"d1: x-easy :hedgehog:","EDE9FE"),await ji(i,t,n,"d2: easy :rabbit2:","DDD6FE"),await ji(i,t,n,"d3: medium :ox:","C4B5FD"),await ji(i,t,n,"d4: hard :squid:","A78BFA"),await ji(i,t,n,"d5: x-hard :whale2:","8B5CF6"),await ji(i,t,n,"p1: critical :fire::fire::fire:","EF4444"),await ji(i,t,n,"p2: urgent :fire::fire:","F87171"),await ji(i,t,n,"p3: important :fire:","FCA5A5"),await ji(i,t,n,"p4: nice to have :droplet:","FECACA"),await ji(i,t,n,"r: blitz","5300bc"),await ji(i,t,n,"r: firebase","ffca28"),await ji(i,t,n,"r: prisma","0c344b"),await ji(i,t,n,"r: react","61dafb"),await ji(i,t,n,"r: svelte","ff3e00"),await ji(i,t,n,"r: semantic-release","494949"),await ji(i,t,n,"ready :rocket:","22C55E"),await ji(i,t,n,"review requested :mag:","FBCA04"),await ji(i,t,n,"released :bookmark:","6366F1"),await ji(i,t,n,"s: 0.5h :clock1230:","F3F4F6"),await ji(i,t,n,"s: 1h :clock1:","E5E7EB"),await ji(i,t,n,"s: 2h :clock2:","D1D5DB"),await ji(i,t,n,"s: 3h :clock3:","9CA3AF"),await ji(i,t,n,"s: 5h :clock5:","6B7280"),await ji(i,t,n,"s: 8h :clock8:","4B5563"),await ji(i,t,n,"s: 13h :clock1:","374151"),await ji(i,t,n,"t: build :hammer:","BFDBFE"),await ji(i,t,n,"t: chore :broom:","BFDBFE"),await ji(i,t,n,"t: ci :construction_worker:","BFDBFE"),await ji(i,t,n,"t: docs :memo:","BFDBFE"),await ji(i,t,n,"t: feat :sparkles:","BFDBFE"),await ji(i,t,n,"t: fix :bug:","BFDBFE"),await ji(i,t,n,"t: perf :zap:","BFDBFE"),await ji(i,t,n,"t: refactor :recycle:","BFDBFE"),await ji(i,t,n,"t: style :lipstick:","BFDBFE"),await ji(i,t,n,"t: test :test_tube:","BFDBFE"),await ji(i,t,n,"project","24292F"),await ji(i,t,n,"focused :dart:","22C55E"),await $i(i,t,n,"bug"),await $i(i,t,n,"documentation"),await $i(i,t,n,"duplicate"),await $i(i,t,n,"enhancement"),await $i(i,t,n,"good first issue"),await $i(i,t,n,"help wanted"),await $i(i,t,n,"invalid"),await $i(i,t,n,"question"),await $i(i,t,n,"wontfix"),await $i(i,t,n,"ready"),await $i(i,t,n,"review requested"),await $i(i,t,n,"released"),await $i(i,t,n,"semantic-release"),await $i(i,t,n,"llm-pr :robot:"),await $i(i,t,n,"ai-pr :robot:"),await $i(i,t,n,"gen-pr-all :robot:"),await $i(i,t,n,"gen-pr-claude :robot:"),await $i(i,t,n,"gen-pr-codex :robot:"),await $i(i,t,n,"gen-pr-gemini :robot:")}catch(e){console.warn("Skip setupLabels due to:",e?.stack??e)}})}async function ji(e,t,n,i,r){try{await e.request("POST /repos/{owner}/{repo}/labels",{owner:t,repo:n,name:i,color:r})}catch{await e.request("PATCH /repos/{owner}/{repo}/labels/{name}",{owner:t,repo:n,name:i,color:r})}}async function $i(e,t,n,i){try{await e.request("DELETE /repos/{owner}/{repo}/labels/{name}",{owner:t,repo:n,name:i})}catch{}}const Si=["READY_DISCORD_WEBHOOK_URL","GH_BOT_PAT","PUBLIC_GH_BOT_PAT"],_i=h(import.meta.url);async function Pi(e){return _.functionIgnoringException("setupSecrets",async()=>{const[n,i]=zt.getOrgAndName(e.repository??"");if(!n||!i||"WillBoosterLab"!==n)return;if(!Yt(n)||!S.doesUploadEnvVars)return;const r=w.config({path:t.resolve(e.dirPath,".env"),quiet:!0}).parsed??{};if(0===Object.keys(r).length)return;const s=Ht(n);try{for(const e of Si)try{await s.request("DELETE /repos/{owner}/{repo}/actions/secrets/{secret_name}",{owner:n,repo:i,secret_name:e})}catch{}const e=await s.request("GET /repos/{owner}/{repo}/actions/secrets/public-key",{owner:n,repo:i}),{key:t,key_id:o}=e.data,a=_i("libsodium-wrappers");await a.ready;for(const[e,c]of Object.entries(r)){if("GH_BOT_PAT"===e||"GH_BOT_PAT_FOR_WILLBOOSTER"===e||"GH_BOT_PAT_FOR_WILLBOOSTERLAB"===e)continue;const r=a.from_base64(t,a.base64_variants.ORIGINAL),l=a.from_string(c),p=a.crypto_box_seal(l,r),d=a.to_base64(p,a.base64_variants.ORIGINAL);await s.request("PUT /repos/{owner}/{repo}/actions/secrets/{secret_name}",{owner:n,repo:i,secret_name:e,encrypted_value:d,key_id:o})}}catch(e){console.warn("Skip setupSecrets due to:",e?.stack??e)}})}async function Ci(e){return _.functionIgnoringException("setupGitHubSettings",async()=>{const[t,n]=zt.getOrgAndName(e.repository??"");if(!t||!n)return;if("WillBooster"!==t&&"WillBoosterLab"!==t)return;if(!Yt(t))return;const i=Ht(t);try{await async function(e,{beforeRetry:t,handleError:n,retryCount:i=3,retryLogger:r,shouldRetry:s,sleepMilliseconds:o=0,updateSleepMilliseconds:a}={}){let c=0;for(;;)try{return await e(c)}catch(e){if(await(n?.(e)),c++,c>=i)throw e;if(s&&!s(e))throw e;o>0&&await k(o),a&&(o=a(o)),r?.(`Retry due to: ${e}\n${e instanceof Error?"---\n"+(e.stack??""):""}`),await(t?.(e))}}(()=>i.request("PATCH /repos/{owner}/{repo}",{owner:t,repo:n,allow_auto_merge:!0,allow_merge_commit:!1,allow_squash_merge:!0,allow_rebase_merge:!1,allow_update_branch:!0,delete_branch_on_merge:!0,squash_merge_commit_title:"PR_TITLE",squash_merge_commit_message:"BLANK",headers:{"X-GitHub-Api-Version":"2022-11-28"},...e.repository?.startsWith("github:WillBooster/")?{allow_auto_merge:!0}:{}}),{shouldRetry:e=>!Ei(e)})}catch(e){if(!Ei(e))throw e;console.warn("Skip setupGitHubSettings due to:",e?.stack??e)}})}function Ei(e){return!(!e||"object"!=typeof e||!("status"in e))&&(401===e.status||403===e.status||404===e.status)}const Oi="__PM_RUN__",Bi={"pull_request_template.md":`\nClose #<IssueNumber>\n\n## Self Check\n\n- [ ] I've confirmed \`All checks have passed\` on this page.\n - PR title follows [Angular's commit message format](https://github.com/angular/angular/blob/main/CONTRIBUTING.md#-commit-message-format).\n - PR title doesn't have \`WIP:\`.\n - The test command (e.g., \`${Oi} test\`) passed.\n - The lint command (e.g., \`${Oi} lint\`) passed.\n - You may leave this box unchecked due to long workflows.\n- [ ] I've reviewed my changes on the GitHub diff view.\n- [ ] I've written the steps to test my changes.\n- [ ] I've added screenshots (if the UI changed).\n - You may leave this box unchecked if you didn't modify the UI.\n\n\x3c!-- Please add screenshots if you modify the UI.\n| Current | In coming |\n| ------------------------ | ------------------------ |\n| <img src="" width="400"> | <img src="" width="400"> |\n--\x3e\n\n\x3c!-- Please add steps to test your changes.\n## Steps to Test\n\n1. Open http://localhost-exercode.willbooster.net:3000/ja-JP/courses/_example/lessons/_example_a_plus_b/problems/_example_a_plus_b after login.\n2. Select the language \`C\`.\n3. Write the following code:\n \`\`\`c\n #include <stdio.h>\n\n int main(void) {\n int a, b;\n\n scanf("%d %d", &a, &b);\n printf("%d", a + b);\n return 0;\n }\n \`\`\`\n4. Push \`Submit\` button.\n5. ...\n--\x3e\n`.trim()};async function Ai(n){return _.functionIgnoringException("generateGitHubTemplates",async()=>{if(n.isWillBoosterRepo)for(const[i,r]of Object.entries(Bi)){const s=Fi(r,n),o=t.resolve(n.dirPath,".github",i);if(e.existsSync(o)){const t=await e.promises.readFile(o,"utf8");if(b(t,s)>s.length/2)continue}await e.promises.mkdir(t.resolve(n.dirPath,".github"),{recursive:!0}),await C.run(()=>P.generateFile(o,s))}})}function Fi(e,t){const n=t.isBun?"bun run":"yarn";return e.replaceAll(Oi,n)}const Ri=x.object({typos:x.object({all:x.record(x.string(),x.string()).optional(),doc:x.record(x.string(),x.string()).optional(),ts:x.record(x.string(),x.string()).optional(),text:x.record(x.string(),x.string()).optional()}).optional()});async function Ii(n,i){const r=t.resolve(n,"package.json");try{const o=e.existsSync(r);let a={},c={},l={},p=!1;if(o){const t=e.readFileSync(r,"utf8");l=JSON.parse(t),a=l.dependencies??{},c=l.devDependencies??{},p="module"===l.type}let d=[],u=[];try{const e=t.resolve(n,".releaserc.json"),i=JSON.parse(await s.readFile(e,"utf8"));d=i?.branches??[],u=i?.plugins?.flat()??[]}catch{}const f="packages"!==t.basename(t.resolve(n,".."))||!e.existsSync(t.resolve(n,"..","..","package.json"));let g;f&&(g=await async function(e,t){const n=v(e),i=(await n.getRemotes(!0)).find(e=>"origin"===e.name),r=i?.refs.fetch??i?.refs.push;if("string"==typeof r){const e=await Ni(r);if(e)return e}const s="string"==typeof t.repository?t.repository:t.repository?.url;if(s){const e=await Ni(s);if(e&&"Not Found"!==e.message)return e}}(n,l));let m=function(n){const i=t.resolve(n);return e.existsSync(t.join(i,"mise.toml"))||e.existsSync(t.join(i,".mise.toml"))||e.existsSync(t.join(i,".tool-versions"))}(n);for(const i of["java","node","python"])if(e.existsSync(t.resolve(n,`.${i}-version`))){m=!0;break}let y="";try{y=await s.readFile(t.resolve(n,"Dockerfile"),"utf8")}catch{}const h=t.resolve(n,"wbfy.json");let w;try{const e=await s.readFile(h,"utf8");w=Ri.parse(JSON.parse(e))}catch{}const b="string"==typeof g?.full_name?g.full_name:void 0;let x,k;if(b){const e=b.split("/");e.length>=2&&(x=e[0],k=e[1])}const j=b?`github:${b}`:void 0,$={dirPath:n,dockerfile:y,isRoot:f,isPublicRepo:!1===g?.private,isReferredByOtherRepo:!!l.files,repository:j,repoAuthor:x,repoName:k,isWillBoosterRepo:Boolean(j?.startsWith("github:WillBooster/")||j?.startsWith("github:WillBoosterLab/")),isBun:i?.isBun||e.existsSync(t.join(n,"bun.lock")),isEsmPackage:p,isWillBoosterConfigs:r.includes("/willbooster-configs"),doesContainSubPackageJsons:Wi("packages/**/package.json",n),doesContainDockerfile:!!y||e.existsSync(t.resolve(n,"docker-compose.yml")),doesContainGemfile:e.existsSync(t.resolve(n,"Gemfile")),doesContainGoMod:e.existsSync(t.resolve(n,"go.mod")),doesContainPackageJson:e.existsSync(t.resolve(n,"package.json")),doesContainPoetryLock:e.existsSync(t.resolve(n,"poetry.lock")),doesContainUvLock:e.existsSync(t.resolve(n,"uv.lock")),doesContainPomXml:e.existsSync(t.resolve(n,"pom.xml")),doesContainPubspecYaml:e.existsSync(t.resolve(n,"pubspec.yaml")),doesContainTemplateYaml:e.existsSync(t.resolve(n,"template.yaml")),doesContainVscodeSettingsJson:e.existsSync(t.resolve(n,".vscode","settings.json")),doesContainJavaScript:Wi("{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx}",n),doesContainTypeScript:Wi("{app,src,test,scripts}/**/*.{cts,mts,ts,tsx}",n),doesContainJsxOrTsx:Wi("{app,src,test}/**/*.{t,j}sx",n),doesContainJava:Wi("**/*.java",n),doesContainJavaScriptInPackages:Wi("packages/**/{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx}",n),doesContainTypeScriptInPackages:Wi("packages/**/{app,src,test,scripts}/**/*.{cts,mts,ts,tsx}",n),doesContainJsxOrTsxInPackages:Wi("packages/**/{app,src,test}/**/*.{t,j}sx",n),doesContainJavaInPackages:Wi("packages/**/*.java",n),depending:{blitz:!!a.blitz,firebase:!!c["firebase-tools"],genI18nTs:!!a["gen-i18n-ts"]||!!c["gen-i18n-ts"],litestream:y.includes("install-litestream.sh"),react:!!a.react,next:!!a.next,playwrightTest:!!a["@playwright/test"]||!!c["@playwright/test"]||!!c.playwright,prisma:!!a["@prisma/client"]||!!c.prisma,pyright:!!c.pyright,reactNative:!!a["react-native"],semanticRelease:!!(c["semantic-release"]||d.length>0||u.length>0),storybook:!!c["@storybook/react"],wb:!!a["@willbooster/wb"]||!!c["@willbooster/wb"]},release:{branches:d,github:u.includes("@semantic-release/github"),npm:u.includes("@semantic-release/npm")},hasVersionSettings:m,miseTasks:await Di(n),packageJson:l,wbfyJson:w};if($.doesContainGemfile||$.doesContainGoMod||$.doesContainPackageJson||$.doesContainPoetryLock||$.doesContainUvLock||$.doesContainPomXml||$.doesContainPubspecYaml||$.doesContainTemplateYaml)return $}catch{}}async function Di(e){const n={};for(const i of["mise.toml",".mise.toml"]){const r=t.resolve(e,i);try{const e=d.parse(await s.readFile(r,"utf8"));for(const[t,i]of Object.entries(e.tasks??{}))n[t]=Ti(i)}catch{}}return n}function Ti(e){return"string"==typeof e?e:Array.isArray(e)?e.filter(e=>"string"==typeof e).join("\n"):e&&"object"==typeof e?Ti(e.run):""}function Wi(e,t){return o.globSync(e,{dot:!0,cwd:t,ignore:z}).length>0}async function Ni(e){const[t,n]=zt.getOrgAndName(e);if(t&&n)try{return(await Ht().request("GET /repos/{owner}/{repo}",{owner:t,repo:n})).data}catch(e){const t=function(e){if(!e||"object"!=typeof e)return;const t="response"in e?e.response:void 0,n=t?.status??e.status;if(301!==n&&302!==n)return;const i=t?.headers?.location;if("string"!=typeof i)return;const[r,s]=zt.getOrgAndName(i);if(!r||!s)return;return`${r}/${s}`}(e);if(t)return{full_name:t}}}const Li=["dependencies","devDependencies","optionalDependencies","peerDependencies"],Mi=String.raw`(?:WillBooster|WillBoosterLab)`,Ji=[new RegExp(`^${Mi}/[^#\\s]+(?:#\\S+)?$`,"u"),new RegExp(`^github:${Mi}/[^#\\s]+(?:#\\S+)?$`,"u"),new RegExp(`^(?:git\\+)?https://github\\.com/${Mi}/[^#\\s]+(?:\\.git)?(?:#\\S+)?$`,"u"),new RegExp(`^(?:git\\+)?ssh://git@github\\.com[:/]${Mi}/[^#\\s]+(?:\\.git)?(?:#\\S+)?$`,"u"),new RegExp(`^(?:git\\+)?git@github\\.com:${Mi}/[^#\\s]+(?:\\.git)?(?:#\\S+)?$`,"u")];function Ui(e){const n=e.flatMap(Gi);if(0===n.length)return;const i=n.map(({dependencyName:e,dirPath:n,sectionName:i,specifier:r})=>`- ${t.join(n,"package.json")}: ${i}.${e} uses ${r}`).join("\n");throw new Error(`Disallowed Git dependency sources found.\nOnly WillBooster and WillBoosterLab GitHub dependencies are allowed.\n${i}`)}function Gi(e){const t=e.packageJson;if(!t)return[];const n=[];for(const i of Li){const r=t[i];if(r)for(const[t,s]of Object.entries(r))s&&zi(s)&&(qi(s)||n.push({dependencyName:t,dirPath:e.dirPath,sectionName:i,specifier:s}))}return n}function zi(e){return function(e){return/^[a-zA-Z0-9][\w.-]*\/[\w.-]+(?:#\S+)?$/u.test(e)}(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 qi(e){return Ji.some(t=>t.test(e))}function Hi(e){const t=Jt("bun",["install"],e);if(0!==t)throw new Error(`Failed to refresh Bun lockfile: bun install exited with status ${t}`)}await async function(){const i=await n(process.argv.slice(2)).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({env:{description:"Upload environment variables as secrets to GitHub",type:"boolean",default:!1,alias:"e"},skipDeps:{description:"Skip dependency installation",type:"boolean",default:!1,alias:"d"},verbose:{description:"Whether or not to enable verbose mode",type:"boolean",default:!1,alias:"v"}}).version(function(){let n=t.dirname(new URL(import.meta.url).pathname);for(;!e.existsSync(t.join(n,"package.json"));)n=t.dirname(n);return JSON.parse(e.readFileSync(t.join(n,"package.json"),"utf8")).version}()).strict().argv;S.isVerbose=i.verbose,S.doesUploadEnvVars=i.env;let r=!1;for(const n of i.paths){const s=t.join(n,"packages"),o=(await j(()=>e.promises.readdir(s,{withFileTypes:!0}))??[]).filter(e=>e.isDirectory()).map(e=>t.join(s,e.name));await Ue([n,...o]);const a=await Ii(n);if(S.isVerbose,!a){console.error(`there is no valid package.json in ${n}`),r=!0;continue}const c=ot(a),l=(await Promise.all(o.map(e=>Ii(e,a)))).filter(e=>!!e),p=[a,...l];if(S.isVerbose)for(const e of p)console.info(e);Ui(p),await xi(a),a.isBun&&await ft(a);const d=!tt(a.repository)&&(a.repository?.startsWith("github:WillBooster/")||a.repository?.startsWith("github:WillBoosterLab/"));await Promise.all([q(a),c.then(()=>ri(a)),lt(a,p),kt(a),St(a),Ct(a,p),Et(a),Bt(a),Ai(a),Nt(a),pi(a),ci(a),...d?[et(a)]:[],ki(a),Pi(a),Ci(a),Wn(a),Gn(a)]),await C.promiseAll();const u=[];for(const e of p)(e.doesContainTypeScript||e.doesContainTypeScriptInPackages)&&u.push(ze(e,e.isRoot?p:[e])),e.depending.playwrightTest&&u.push(D(e)),e.depending.next&&u.push(E(e)),await Ft(e,a),await C.promiseAll(),(e.isRoot||e.doesContainPackageJson)&&(await ti(e),await un(e,a,i.skipDeps),u.push(Gn(e)),e.doesContainVscodeSettingsJson&&e.doesContainPackageJson&&u.push(bi(e)),(e.doesContainTypeScript||e.doesContainTypeScriptInPackages)&&u.push(gi(e)),O(e)?(u.push(Kn(e)),u.push(Zn(e))):!e.isRoot&&e.doesContainPackageJson&&O(a)&&u.push(Zn(e)),e.depending.pyright&&u.push(ii(e)));await Promise.all(u),await C.promiseAll();const f=a.isBun?"bun":"yarn";a.isBun?await _.functionIgnoringException("refreshBunLock",async()=>{await Promise.resolve(),Hi(n)}):Mt(f,["install","--no-immutable"],n),Mt(f,["cleanup"],n),await di()}r&&(process.exitCode=1)}();
|
|
32
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NoYXJlZC1saWIvc3JjL3NsZWVwLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi9zcmMvZXJyb3IudHMiLCIuLi9zcmMvb3B0aW9ucy50cyIsIi4uL3NyYy9sb2dnZXIudHMiLCIuLi9zcmMvdXRpbHMvZnNVdGlsLnRzIiwiLi4vc3JjL3V0aWxzL3Byb21pc2VQb29sLnRzIiwiLi4vc3JjL2ZpeGVycy9uZXh0Q29uZmlnLnRzIiwiLi4vc3JjL3V0aWxzL3BhY2thZ2VDYXBhYmlsaXRpZXMudHMiLCIuLi9zcmMvZml4ZXJzL3BsYXl3cmlnaHRDb25maWcudHMiLCIuLi9zcmMvdXRpbHMvZ2xvYlV0aWwudHMiLCIuLi9zcmMvZml4ZXJzL3ByaXNtYS50cyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9zb3J0LW9iamVjdC1rZXlzL2luZGV4LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2RldGVjdC1pbmRlbnQvaW5kZXguanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvZGV0ZWN0LW5ld2xpbmUvaW5kZXguanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvc29ydC1wYWNrYWdlLWpzb24vaW5kZXguanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvaXMtcGxhaW4tb2JqL2luZGV4LmpzIiwiLi4vc3JjL2ZpeGVycy90ZXN0RGlyZWN0b3J5LnRzIiwiLi4vc3JjL2ZpeGVycy90eXBlRGVmaW5pdGlvbi50cyIsIi4uL3NyYy91dGlscy9tZXJnZVV0aWwudHMiLCIuLi9zcmMvdXRpbHMvb2JqZWN0VXRpbC50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3dvcmtmbG93LnRzIiwiLi4vc3JjL2ZpeGVycy90eXBvcy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2FnZW50cy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2J1bmZpZy50cyIsIi4uL3NyYy91dGlscy9pZ25vcmVGaWxlVXRpbC50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2RvY2tlcmlnbm9yZS50cyIsIi4uL3NyYy91dGlscy9leHRlbnNpb25zLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZWRpdG9yY29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2VtaW5pQ29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2VtaW5pU2V0dGluZ3MudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9naXRhdHRyaWJ1dGVzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2l0aWdub3JlLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvaWRlYS50cyIsIi4uL3NyYy91dGlscy9nZW5JMThuVHMudHMiLCIuLi9zcmMvdXRpbHMvc3Bhd25VdGlsLnRzIiwiLi4vc3JjL3V0aWxzL2dpdGh1YlV0aWwudHMiLCIuLi9zcmMvdXRpbHMvdHNjb25maWdCYXNlLnRzIiwiLi4vc3JjL3V0aWxzL3dpbGxib29zdGVyQ29uZmlnc1V0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9wYWNrYWdlSnNvbi50cyIsIi4uL3NyYy9naXRodWIvY29tbWl0LnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvbGVmdGhvb2sudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9saW50c3RhZ2VkcmMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9jb25maWdDb250ZW50LnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvbWFuYWdlZENvbmZpZ0Jsb2NrLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvb3hmbXRDb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9veGxpbnRDb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9wcmV0dGllcmlnbm9yZS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3B5cmlnaHRDb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9yZWFkbWUudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9yZWxlYXNlcmMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9yZW5vdmF0ZUpzb24udHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9za2lsbHMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy90c2NvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3ZzY29kZVNldHRpbmdzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMveWFybnJjLnRzIiwiLi4vc3JjL2dpdGh1Yi9sYWJlbC50cyIsIi4uL3NyYy9naXRodWIvc2VjcmV0LnRzIiwiLi4vc3JjL2dpdGh1Yi9zZXR0aW5ncy50cyIsIi4uL3NyYy9naXRodWIvdGVtcGxhdGUudHMiLCIuLi9zcmMvcGFja2FnZUNvbmZpZy50cyIsIi4uL3NyYy91dGlscy9kZXBlbmRlbmN5U291cmNlUG9saWN5LnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBhc3luYyBmdW5jdGlvbiBzbGVlcChtaWxsaXNlY29uZHM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbWlsbGlzZWNvbmRzKSk7XG59XG4iLCJpbXBvcnQgeyBzbGVlcCB9IGZyb20gJy4vc2xlZXAuanMnO1xuXG4vKipcbiAqIENvbnZlcnQgYW4gb2JqZWN0IHRvIGFuIGVycm9yLlxuICogQHBhcmFtIG9iaiBUaGUgb2JqZWN0IHRvIGNvbnZlcnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlcnJvcmlmeShvYmo6IHVua25vd24pOiBFcnJvciB7XG4gIGlmIChvYmogaW5zdGFuY2VvZiBFcnJvcikgcmV0dXJuIG9iajtcbiAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSByZXR1cm4gbmV3IEVycm9yKG9iaik7XG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihKU09OLnN0cmluZ2lmeShvYmopKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihTdHJpbmcob2JqKSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlnbm9yZUVycm9yPFQ+KGZuOiAoKSA9PiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaWdub3JlRW5vZW50PFQ+KGZuOiAoKSA9PiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgJiYgJ2NvZGUnIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFcnJvckFzeW5jPFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaWdub3JlRW5vZW50QXN5bmM8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXRyeU9wdGlvbnMge1xuICBiZWZvcmVSZXRyeT86IChlcnJvcjogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgaGFuZGxlRXJyb3I/OiAoZXJyb3I6IHVua25vd24pID0+IFByb21pc2U8dm9pZD47XG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgdG90YWwgYXR0ZW1wdHMsIGluY2x1ZGluZyB0aGUgaW5pdGlhbCBhdHRlbXB0LlxuICAgKiBGb3IgZXhhbXBsZSwgYHJldHJ5Q291bnQ6IDNgIHJ1bnMgdGhlIGZ1bmN0aW9uIGF0IG1vc3QgMyB0aW1lczogMSBpbml0aWFsIGF0dGVtcHQgYW5kIHVwIHRvIDIgcmV0cmllcy5cbiAgICovXG4gIHJldHJ5Q291bnQ/OiBudW1iZXI7XG4gIHJldHJ5TG9nZ2VyPzogKG1lc3NhZ2U6IHN0cmluZykgPT4gdm9pZDtcbiAgc2hvdWxkUmV0cnk/OiAoZXJyb3I6IHVua25vd24pID0+IGJvb2xlYW47XG4gIHNsZWVwTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuICB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcz86IChzbGVlcE1pbGxpc2Vjb25kczogbnVtYmVyKSA9PiBudW1iZXI7XG59XG5cbi8qKlxuICogUmV0cnkgdGhlIGdpdmVuIGZ1bmN0aW9uLlxuICogQHBhcmFtIGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJldHJ5LlxuICogQHBhcmFtIGJlZm9yZVJldHJ5IFRoZSBmdW5jdGlvbiB0byBjYWxsIGltbWVkaWF0ZWx5IGJlZm9yZSByZXRyeWluZy5cbiAqIEBwYXJhbSBoYW5kbGVFcnJvciBUaGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIGFuIGVycm9yIG9jY3Vycy5cbiAqIEBwYXJhbSByZXRyeUNvdW50IFRoZSBtYXhpbXVtIG51bWJlciBvZiB0b3RhbCBhdHRlbXB0cywgaW5jbHVkaW5nIHRoZSBpbml0aWFsIGF0dGVtcHQuXG4gKiBAcGFyYW0gcmV0cnlMb2dnZXIgVGhlIGZ1bmN0aW9uIHRvIGxvZyByZXRyeWluZy5cbiAqIEBwYXJhbSBzbGVlcE1pbGxpc2Vjb25kcyBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBzbGVlcCBiZWZvcmUgcmV0cnlpbmcuXG4gKiBAcGFyYW0gdXBkYXRlU2xlZXBNaWxsaXNlY29uZHMgVGhlIGZ1bmN0aW9uIHRvIHVwZGF0ZSBzbGVlcCBtaWxsaXNlY29uZHMgYWZ0ZXIgZWFjaCByZXRyeS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdpdGhSZXRyeTxUPihcbiAgZnVuYzogKGZhaWxlZENvdW50OiBudW1iZXIpID0+IFQgfCBQcm9taXNlPFQ+LFxuICB7XG4gICAgYmVmb3JlUmV0cnksXG4gICAgaGFuZGxlRXJyb3IsXG4gICAgcmV0cnlDb3VudCA9IDMsXG4gICAgcmV0cnlMb2dnZXIsXG4gICAgc2hvdWxkUmV0cnksXG4gICAgc2xlZXBNaWxsaXNlY29uZHMgPSAwLFxuICAgIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzLFxuICB9OiBSZXRyeU9wdGlvbnMgPSB7fVxuKTogUHJvbWlzZTxUPiB7XG4gIGxldCBmYWlsZWRDb3VudCA9IDA7XG4gIGZvciAoOzspIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZ1bmMoZmFpbGVkQ291bnQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBhd2FpdCBoYW5kbGVFcnJvcj8uKGVycm9yKTtcbiAgICAgIGZhaWxlZENvdW50Kys7XG4gICAgICBpZiAoZmFpbGVkQ291bnQgPj0gcmV0cnlDb3VudCkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGRSZXRyeSAmJiAhc2hvdWxkUmV0cnkoZXJyb3IpKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgaWYgKHNsZWVwTWlsbGlzZWNvbmRzID4gMCkge1xuICAgICAgICBhd2FpdCBzbGVlcChzbGVlcE1pbGxpc2Vjb25kcyk7XG4gICAgICB9XG4gICAgICBpZiAodXBkYXRlU2xlZXBNaWxsaXNlY29uZHMpIHtcbiAgICAgICAgc2xlZXBNaWxsaXNlY29uZHMgPSB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcyhzbGVlcE1pbGxpc2Vjb25kcyk7XG4gICAgICB9XG4gICAgICByZXRyeUxvZ2dlcj8uKGBSZXRyeSBkdWUgdG86ICR7ZXJyb3J9XG4ke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyAnLS0tXFxuJyArIChlcnJvci5zdGFjayA/PyAnJykgOiAnJ31gKTtcbiAgICAgIGF3YWl0IGJlZm9yZVJldHJ5Py4oZXJyb3IpO1xuICAgIH1cbiAgfVxufVxuIiwiY2xhc3MgT3B0aW9ucyB7XG4gIGlzVmVyYm9zZSA9IGZhbHNlO1xuICBkb2VzVXBsb2FkRW52VmFycyA9IGZhbHNlO1xufVxuXG5leHBvcnQgY29uc3Qgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7XG4iLCJpbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi9vcHRpb25zLmpzJztcblxuY2xhc3MgTG9nZ2VyIHtcbiAgYXN5bmMgZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbihuYW1lOiBzdHJpbmcsIGZ1bmM6ICgpID0+IFByb21pc2U8dm9pZD4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgLS0tLS0tLS0tICR7bmFtZX0gc3RhcnQgLS0tLS0tLS0tYCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmdW5jKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRXJyb3Igb2NjdXJyZWQgaW4gJHtuYW1lfTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3Iuc3RhY2sgOiBTdHJpbmcoZXJyb3IpfX1gKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYC0tLS0tLS0tLS0gJHtuYW1lfSBlbmQgLS0tLS0tLS0tLWApO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgbG9nZ2VyID0gbmV3IExvZ2dlcigpO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuZXhwb3J0IGNvbnN0IGZzVXRpbCA9IHtcbiAgYXN5bmMgcmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICB9LFxuICBhc3luYyBnZW5lcmF0ZUZpbGUoZmlsZVBhdGg6IHN0cmluZywgY29udGVudDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIocGF0aC5kaXJuYW1lKGZpbGVQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgbGV0IG5vcm1hbGl6ZWRDb250ZW50ID0gY29udGVudC50cmltKCk7XG4gICAgaWYgKG5vcm1hbGl6ZWRDb250ZW50KSB7XG4gICAgICBub3JtYWxpemVkQ29udGVudCArPSAnXFxuJztcbiAgICB9XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGZpbGVQYXRoLCBub3JtYWxpemVkQ29udGVudCk7XG4gICAgY29uc29sZS5sb2coYEdlbmVyYXRlZC9VcGRhdGVkICR7ZmlsZVBhdGh9YCk7XG4gIH0sXG59O1xuIiwiaW1wb3J0IHsgUHJvbWlzZVBvb2wgfSBmcm9tICdtaW5pbWFsLXByb21pc2UtcG9vbCc7XG5cbmV4cG9ydCBjb25zdCBwcm9taXNlUG9vbCA9IG5ldyBQcm9taXNlUG9vbCgpO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHRzIGZyb20gJ3R5cGVzY3JpcHQnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhOZXh0Q29uZmlnSnNvbihjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhOZXh0Q29uZmlnSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IFsnanMnLCAnbWpzJywgJ2NqcyddXG4gICAgICAubWFwKChleHQpID0+IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgYG5leHQuY29uZmlnLiR7ZXh0fWApKVxuICAgICAgLmZpbmQoKHApID0+IGZzLmV4aXN0c1N5bmMocCkpO1xuICAgIGlmICghZmlsZVBhdGgpIHJldHVybjtcblxuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICBjb25zdCBvYmplY3RMaXRlcmFsID0gZ2V0TmV4dENvbmZpZ09iamVjdExpdGVyYWwob2xkQ29udGVudCk7XG4gICAgaWYgKCFvYmplY3RMaXRlcmFsKSByZXR1cm47XG5cbiAgICBjb25zdCBleGlzdGluZ1Byb3BlcnRpZXMgPSBuZXcgU2V0KG9iamVjdExpdGVyYWwucHJvcGVydGllcy5tYXAoKHByb3BlcnR5KSA9PiBwcm9wZXJ0eS5uYW1lPy5nZXRUZXh0KCkpKTtcbiAgICBjb25zdCBwcm9wZXJ0eVRleHRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGlmICghZXhpc3RpbmdQcm9wZXJ0aWVzLmhhcygndHlwZXNjcmlwdCcpKSB7XG4gICAgICBwcm9wZXJ0eVRleHRzLnB1c2goJ3R5cGVzY3JpcHQ6IHsgaWdub3JlQnVpbGRFcnJvcnM6IHRydWUgfScpO1xuICAgIH1cbiAgICBpZiAocHJvcGVydHlUZXh0cy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIGNvbnN0IGluc2VydGlvblBvaW50ID0gb2JqZWN0TGl0ZXJhbC5nZXRFbmQoKSAtIDE7XG4gICAgY29uc3QgbGFzdFByb3BlcnR5ID0gb2JqZWN0TGl0ZXJhbC5wcm9wZXJ0aWVzLmF0KC0xKTtcbiAgICBjb25zdCBoYXNUcmFpbGluZ0NvbW1hID0gbGFzdFByb3BlcnR5XG4gICAgICA/IG9sZENvbnRlbnQuc2xpY2UobGFzdFByb3BlcnR5LmdldEVuZCgpLCBpbnNlcnRpb25Qb2ludCkuaW5jbHVkZXMoJywnKVxuICAgICAgOiBmYWxzZTtcbiAgICBjb25zdCBwcmVmaXggPSBvYmplY3RMaXRlcmFsLnByb3BlcnRpZXMubGVuZ3RoID4gMCAmJiAhaGFzVHJhaWxpbmdDb21tYSA/ICcsICcgOiAnJztcbiAgICBjb25zdCBuZXdDb250ZW50ID0gYCR7b2xkQ29udGVudC5zbGljZSgwLCBpbnNlcnRpb25Qb2ludCl9JHtwcmVmaXh9JHtwcm9wZXJ0eVRleHRzLmpvaW4oJywgJyl9JHtvbGRDb250ZW50LnNsaWNlKFxuICAgICAgaW5zZXJ0aW9uUG9pbnRcbiAgICApfWA7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldE5leHRDb25maWdPYmplY3RMaXRlcmFsKGNvbnRlbnQ6IHN0cmluZyk6IHRzLk9iamVjdExpdGVyYWxFeHByZXNzaW9uIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc291cmNlID0gdHMuY3JlYXRlU291cmNlRmlsZSgnbmV4dC5jb25maWcuanMnLCBjb250ZW50LCB0cy5TY3JpcHRUYXJnZXQuTGF0ZXN0LCB0cnVlLCB0cy5TY3JpcHRLaW5kLkpTKTtcbiAgbGV0IG9iamVjdExpdGVyYWw6IHRzLk9iamVjdExpdGVyYWxFeHByZXNzaW9uIHwgdW5kZWZpbmVkO1xuICBjb25zdCB2aXNpdCA9IChub2RlOiB0cy5Ob2RlKTogdm9pZCA9PiB7XG4gICAgaWYgKG9iamVjdExpdGVyYWwpIHJldHVybjtcbiAgICBpZiAodHMuaXNFeHBvcnRBc3NpZ25tZW50KG5vZGUpICYmIHRzLmlzT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24obm9kZS5leHByZXNzaW9uKSkge1xuICAgICAgb2JqZWN0TGl0ZXJhbCA9IG5vZGUuZXhwcmVzc2lvbjtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgdHMuaXNCaW5hcnlFeHByZXNzaW9uKG5vZGUpICYmXG4gICAgICBub2RlLm9wZXJhdG9yVG9rZW4ua2luZCA9PT0gdHMuU3ludGF4S2luZC5FcXVhbHNUb2tlbiAmJlxuICAgICAgbm9kZS5sZWZ0LmdldFRleHQoc291cmNlKSA9PT0gJ21vZHVsZS5leHBvcnRzJyAmJlxuICAgICAgdHMuaXNPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihub2RlLnJpZ2h0KVxuICAgICkge1xuICAgICAgb2JqZWN0TGl0ZXJhbCA9IG5vZGUucmlnaHQ7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRzLmZvckVhY2hDaGlsZChub2RlLCB2aXNpdCk7XG4gIH07XG4gIHZpc2l0KHNvdXJjZSk7XG4gIHJldHVybiBvYmplY3RMaXRlcmFsO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBkb2VzQ29udGFpbkpzT3JUcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBjb25maWcuZG9lc0NvbnRhaW5KYXZhU2NyaXB0IHx8XG4gICAgY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdEluUGFja2FnZXMgfHxcbiAgICBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8XG4gICAgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXNcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRvZXNDb250YWluSmF2YShjb25maWc6IFBhY2thZ2VDb25maWcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNvbmZpZy5kb2VzQ29udGFpbkphdmEgfHwgY29uZmlnLmRvZXNDb250YWluSmF2YUluUGFja2FnZXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYWNrYWdlTWFuYWdlckNvbW1hbmQoY29uZmlnOiBQaWNrPFBhY2thZ2VDb25maWcsICdpc0J1bic+KTogJ2J1bicgfCAneWFybicge1xuICByZXR1cm4gY29uZmlnLmlzQnVuID8gJ2J1bicgOiAneWFybic7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHMgZnJvbSAndHlwZXNjcmlwdCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBnZXRQYWNrYWdlTWFuYWdlckNvbW1hbmQgfSBmcm9tICcuLi91dGlscy9wYWNrYWdlQ2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG50eXBlIFBhcnNlZFZhbHVlID1cbiAgfCB7IGtpbmQ6ICdhcnJheSc7IHZhbHVlOiBQYXJzZWRWYWx1ZVtdIH1cbiAgfCB7IGtpbmQ6ICdsaXRlcmFsJzsgdmFsdWU6IHN0cmluZyB9XG4gIHwgeyBraW5kOiAnb2JqZWN0JzsgdmFsdWU6IFBhcnNlZE9iamVjdCB9O1xudHlwZSBPYmplY3RNZW1iZXIgPSB7IGtpbmQ6ICdleHRyYSc7IGluZGV4OiBudW1iZXIgfSB8IHsga2luZDogJ3Byb3BlcnR5Jzsga2V5OiBzdHJpbmcgfTtcbmludGVyZmFjZSBQYXJzZWRPYmplY3Qge1xuICBleHRyYU1lbWJlcnM6IHN0cmluZ1tdO1xuICBtZW1iZXJPcmRlcjogT2JqZWN0TWVtYmVyW107XG4gIHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIFBhcnNlZFZhbHVlPjtcbn1cbmludGVyZmFjZSBFeHRyYWN0ZWRPYmplY3RMaXRlcmFsIHtcbiAgc291cmNlOiB0cy5Tb3VyY2VGaWxlO1xuICBub2RlOiB0cy5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbjtcbn1cblxuY29uc3QgbGl0ZXJhbCA9ICh2YWx1ZTogc3RyaW5nKTogUGFyc2VkVmFsdWUgPT4gKHsga2luZDogJ2xpdGVyYWwnLCB2YWx1ZSB9KTtcbmNvbnN0IGFzQXJyYXkgPSAodmFsdWU6IFBhcnNlZFZhbHVlW10pOiBQYXJzZWRWYWx1ZSA9PiAoeyBraW5kOiAnYXJyYXknLCB2YWx1ZSB9KTtcbmNvbnN0IGFzT2JqZWN0ID0gKHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIFBhcnNlZFZhbHVlPiwgZXh0cmFNZW1iZXJzOiBzdHJpbmdbXSA9IFtdKTogUGFyc2VkVmFsdWUgPT4gKHtcbiAga2luZDogJ29iamVjdCcsXG4gIHZhbHVlOiB0b1BhcnNlZE9iamVjdChwcm9wZXJ0aWVzLCBleHRyYU1lbWJlcnMpLFxufSk7XG5cbmNvbnN0IGNyZWF0ZURlZmF1bHRDb25maWcgPSAoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUGFyc2VkT2JqZWN0ID0+XG4gIHRvUGFyc2VkT2JqZWN0KHtcbiAgICBmb3JiaWRPbmx5OiBsaXRlcmFsKCchIXByb2Nlc3MuZW52LkNJJyksXG4gICAgcmV0cmllczogbGl0ZXJhbCgncHJvY2Vzcy5lbnYuUFdERUJVRyA/IDAgOiBwcm9jZXNzLmVudi5DSSA/IDUgOiAxJyksXG4gICAgdXNlOiBhc09iamVjdCh7XG4gICAgICBiYXNlVVJMOiBsaXRlcmFsKCdwcm9jZXNzLmVudi5ORVhUX1BVQkxJQ19CQVNFX1VSTCcpLFxuICAgICAgdHJhY2U6IGxpdGVyYWwoXCJwcm9jZXNzLmVudi5DSSA/ICdvbi1maXJzdC1yZXRyeScgOiAncmV0YWluLW9uLWZhaWx1cmUnXCIpLFxuICAgICAgc2NyZWVuc2hvdDogbGl0ZXJhbChcInByb2Nlc3MuZW52LkNJID8gJ29ubHktb24tZmFpbHVyZScgOiAnb24nXCIpLFxuICAgICAgdmlkZW86IGxpdGVyYWwoXCJwcm9jZXNzLmVudi5DSSA/ICdvbi1maXJzdC1yZXRyeScgOiAncmV0YWluLW9uLWZhaWx1cmUnXCIpLFxuICAgIH0pLFxuICAgIHdlYlNlcnZlcjogYXNPYmplY3Qoe1xuICAgICAgY29tbWFuZDogbGl0ZXJhbChnZXRXYlN0YXJ0VGVzdENvbW1hbmQoY29uZmlnKSksXG4gICAgICB1cmw6IGxpdGVyYWwoJ3Byb2Nlc3MuZW52Lk5FWFRfUFVCTElDX0JBU0VfVVJMJyksXG4gICAgICByZXVzZUV4aXN0aW5nU2VydmVyOiBsaXRlcmFsKCchIXByb2Nlc3MuZW52LkNJJyksXG4gICAgICB0aW1lb3V0OiBsaXRlcmFsKCczMDBfMDAwJyksXG4gICAgICBzdGRvdXQ6IGxpdGVyYWwoXCIncGlwZSdcIiksXG4gICAgICBzdGRlcnI6IGxpdGVyYWwoXCIncGlwZSdcIiksXG4gICAgICBlbnY6IGxpdGVyYWwoYHtcbiAgLi4ucHJvY2Vzcy5lbnYsXG4gIFBSSVNNQV9VU0VSX0NPTlNFTlRfRk9SX0RBTkdFUk9VU19BSV9BQ1RJT046ICd0cnVlJyxcbn1gKSxcbiAgICAgIGdyYWNlZnVsU2h1dGRvd246IGxpdGVyYWwoYHtcbiAgc2lnbmFsOiAnU0lHVEVSTScsXG4gIHRpbWVvdXQ6IDUwMCxcbn1gKSxcbiAgICB9KSxcbiAgfSk7XG5cbmZ1bmN0aW9uIHRvUGFyc2VkT2JqZWN0KHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIFBhcnNlZFZhbHVlPiwgZXh0cmFNZW1iZXJzOiBzdHJpbmdbXSA9IFtdKTogUGFyc2VkT2JqZWN0IHtcbiAgcmV0dXJuIHtcbiAgICBleHRyYU1lbWJlcnMsXG4gICAgbWVtYmVyT3JkZXI6IFtcbiAgICAgIC4uLk9iamVjdC5rZXlzKHByb3BlcnRpZXMpLm1hcCgoa2V5KTogT2JqZWN0TWVtYmVyID0+ICh7IGtpbmQ6ICdwcm9wZXJ0eScsIGtleSB9KSksXG4gICAgICAuLi5leHRyYU1lbWJlcnMubWFwKChfLCBpbmRleCk6IE9iamVjdE1lbWJlciA9PiAoeyBraW5kOiAnZXh0cmEnLCBpbmRleCB9KSksXG4gICAgXSxcbiAgICBwcm9wZXJ0aWVzLFxuICB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4UGxheXdyaWdodENvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGBwbGF5d3JpZ2h0LmNvbmZpZy50c2ApO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSByZXR1cm47XG5cbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhQbGF5d3JpZ2h0Q29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IGFzc2VydE5leHRQdWJsaWNCYXNlVXJsKGNvbmZpZy5kaXJQYXRoKTtcblxuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICBjb25zdCBleHRyYWN0ZWRPYmplY3RMaXRlcmFsID0gZXh0cmFjdERlZmluZUNvbmZpZ09iamVjdExpdGVyYWwob2xkQ29udGVudCk7XG4gICAgaWYgKCFleHRyYWN0ZWRPYmplY3RMaXRlcmFsKSByZXR1cm47XG5cbiAgICBjb25zdCBwYXJzZWQgPSBwYXJzZU9iamVjdExpdGVyYWxFeHByZXNzaW9uKGV4dHJhY3RlZE9iamVjdExpdGVyYWwubm9kZSwgZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbC5zb3VyY2UpO1xuICAgIGlmICghcGFyc2VkKSByZXR1cm47XG5cbiAgICAvLyBLZWVwIGZpbGxpbmcgbWlzc2luZyBkZWZhdWx0cywgYnV0IGRvbid0IG92ZXJ3cml0ZSBsb2NhbCBhZGp1c3RtZW50cyBvbiBldmVyeSByZWdlbmVyYXRpb24uXG4gICAgY29uc3QgbWVyZ2VkID0gbWVyZ2VQYXJzZWRPYmplY3RzKGNyZWF0ZURlZmF1bHRDb25maWcoY29uZmlnKSwgcGFyc2VkKTtcbiAgICBzZXRXZWJTZXJ2ZXJDb21tYW5kKG1lcmdlZCwgY29uZmlnKTtcblxuICAgIGNvbnN0IG5ld09iamVjdExpdGVyYWwgPSBzdHJpbmdpZnlWYWx1ZSh7IGtpbmQ6ICdvYmplY3QnLCB2YWx1ZTogbWVyZ2VkIH0sIDApO1xuICAgIGNvbnN0IHN0YXJ0ID0gZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbC5ub2RlLmdldFN0YXJ0KGV4dHJhY3RlZE9iamVjdExpdGVyYWwuc291cmNlKTtcbiAgICBjb25zdCBlbmQgPSBleHRyYWN0ZWRPYmplY3RMaXRlcmFsLm5vZGUuZ2V0RW5kKCk7XG4gICAgY29uc3QgbmV3Q29udGVudCA9IGAke29sZENvbnRlbnQuc2xpY2UoMCwgc3RhcnQpfSR7bmV3T2JqZWN0TGl0ZXJhbH0ke29sZENvbnRlbnQuc2xpY2UoZW5kKX1gO1xuXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIG1lcmdlUGFyc2VkT2JqZWN0cyhiYXNlOiBQYXJzZWRPYmplY3QsIG92ZXJyaWRlOiBQYXJzZWRPYmplY3QpOiBQYXJzZWRPYmplY3Qge1xuICBjb25zdCBvdmVycmlkZVByb3BlcnR5S2V5cyA9IG5ldyBTZXQoT2JqZWN0LmtleXMob3ZlcnJpZGUucHJvcGVydGllcykpO1xuICBjb25zdCBleHRyYU1lbWJlcnMgPSBbLi4uYmFzZS5leHRyYU1lbWJlcnMsIC4uLm92ZXJyaWRlLmV4dHJhTWVtYmVyc107XG4gIC8vIEtlZXAgZGVmYXVsdC1vbmx5IG1lbWJlcnMgYmVmb3JlIHBhcnNlZCBtZW1iZXJzIHNvIHNwcmVhZHMgYW5kIGV4cGxpY2l0IGxvY2FsIHByb3BlcnRpZXMgcmV0YWluIHByZWNlZGVuY2UuXG4gIGNvbnN0IG1lbWJlck9yZGVyID0gW1xuICAgIC4uLmJhc2UubWVtYmVyT3JkZXIuZmlsdGVyKChtZW1iZXIpID0+IG1lbWJlci5raW5kICE9PSAncHJvcGVydHknIHx8ICFvdmVycmlkZVByb3BlcnR5S2V5cy5oYXMobWVtYmVyLmtleSkpLFxuICAgIC4uLm92ZXJyaWRlLm1lbWJlck9yZGVyLm1hcCgobWVtYmVyKTogT2JqZWN0TWVtYmVyID0+IHtcbiAgICAgIGlmIChtZW1iZXIua2luZCA9PT0gJ3Byb3BlcnR5JykgcmV0dXJuIG1lbWJlcjtcbiAgICAgIHJldHVybiB7IGtpbmQ6ICdleHRyYScsIGluZGV4OiBiYXNlLmV4dHJhTWVtYmVycy5sZW5ndGggKyBtZW1iZXIuaW5kZXggfTtcbiAgICB9KSxcbiAgXTtcbiAgY29uc3QgcHJvcGVydGllcyA9IHsgLi4uYmFzZS5wcm9wZXJ0aWVzIH07XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG92ZXJyaWRlLnByb3BlcnRpZXMpKSB7XG4gICAgcHJvcGVydGllc1trZXldID0gbWVyZ2VQYXJzZWRWYWx1ZShwcm9wZXJ0aWVzW2tleV0sIHZhbHVlKTtcbiAgfVxuICByZXR1cm4geyBleHRyYU1lbWJlcnMsIG1lbWJlck9yZGVyLCBwcm9wZXJ0aWVzIH07XG59XG5cbmZ1bmN0aW9uIG1lcmdlUGFyc2VkVmFsdWUoYmFzZTogUGFyc2VkVmFsdWUgfCB1bmRlZmluZWQsIG92ZXJyaWRlOiBQYXJzZWRWYWx1ZSk6IFBhcnNlZFZhbHVlIHtcbiAgaWYgKGJhc2U/LmtpbmQgPT09ICdvYmplY3QnICYmIG92ZXJyaWRlLmtpbmQgPT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIHsga2luZDogJ29iamVjdCcsIHZhbHVlOiBtZXJnZVBhcnNlZE9iamVjdHMoYmFzZS52YWx1ZSwgb3ZlcnJpZGUudmFsdWUpIH07XG4gIH1cbiAgcmV0dXJuIG92ZXJyaWRlO1xufVxuXG5hc3luYyBmdW5jdGlvbiBhc3NlcnROZXh0UHVibGljQmFzZVVybChkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgZm9yIChjb25zdCBlbnZGaWxlUGF0aCBvZiBnZXRFbnZGaWxlUGF0aHMoZGlyUGF0aCkpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGVudkZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgaWYgKC9ORVhUX1BVQkxJQ19CQVNFX1VSTFxccyo9L20udGVzdChjb250ZW50KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBNaXNzaW5nIGVudiBmaWxlcyBhcmUgZXhwZWN0ZWQgaW4gc29tZSByZXBvcy5cbiAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoJ05FWFRfUFVCTElDX0JBU0VfVVJMIGlzIHJlcXVpcmVkIGZvciBQbGF5d3JpZ2h0LiBEZWZpbmUgTkVYVF9QVUJMSUNfQkFTRV9VUkwgaW4gdGhlIHRhcmdldCByZXBvLicpO1xufVxuXG5mdW5jdGlvbiBnZXRFbnZGaWxlUGF0aHMoZGlyUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBlbnZGaWxlTmFtZXMgPSBbJy5lbnYnLCAnLmVudi50ZXN0JywgJy5lbnYuZXhhbXBsZScsICdtaXNlLnRvbWwnLCAnbWlzZS50ZXN0LnRvbWwnXTtcbiAgY29uc3QgZW52RmlsZVBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGZvciAobGV0IGN1cnJlbnREaXJQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgpOyA7IGN1cnJlbnREaXJQYXRoID0gcGF0aC5kaXJuYW1lKGN1cnJlbnREaXJQYXRoKSkge1xuICAgIGVudkZpbGVQYXRocy5wdXNoKC4uLmVudkZpbGVOYW1lcy5tYXAoKGZpbGVOYW1lKSA9PiBwYXRoLnJlc29sdmUoY3VycmVudERpclBhdGgsIGZpbGVOYW1lKSkpO1xuXG4gICAgLy8gUGxheXdyaWdodCBjb25maWdzIG9mdGVuIGxpdmUgaW4gcGFja2FnZXMvKiB3aGlsZSBzaGFyZWQgZW52IGZpbGVzIGxpdmUgYXQgdGhlXG4gICAgLy8gcmVwb3NpdG9yeSByb290LCBzbyB3YWxrIHVwd2FyZCB1bnRpbCB0aGUgdGFyZ2V0IHJlcG8gYm91bmRhcnkuXG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGN1cnJlbnREaXJQYXRoLCAnLmdpdCcpKSkgYnJlYWs7XG5cbiAgICBjb25zdCBwYXJlbnREaXJQYXRoID0gcGF0aC5kaXJuYW1lKGN1cnJlbnREaXJQYXRoKTtcbiAgICBpZiAocGFyZW50RGlyUGF0aCA9PT0gY3VycmVudERpclBhdGgpIGJyZWFrO1xuICB9XG5cbiAgcmV0dXJuIGVudkZpbGVQYXRocztcbn1cblxuZnVuY3Rpb24gc2V0V2ViU2VydmVyQ29tbWFuZChvYmplY3Q6IFBhcnNlZE9iamVjdCwgY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogdm9pZCB7XG4gIGNvbnN0IHdlYlNlcnZlciA9IG9iamVjdC5wcm9wZXJ0aWVzLndlYlNlcnZlcjtcbiAgaWYgKHdlYlNlcnZlcj8ua2luZCAhPT0gJ29iamVjdCcpIHJldHVybjtcblxuICAvLyB3YiBvd25zIHRoZSBjYW5vbmljYWwgdGVzdC1zZXJ2ZXIgc3RhcnR1cCBwYXRoOyBrZWVwIGN1c3RvbSBQbGF5d3JpZ2h0XG4gIC8vIHNlcnZlciBzZXR0aW5ncyB3aGlsZSBub3JtYWxpemluZyB0aGUgY29tbWFuZCBpdHNlbGYuIEludm9rZSB3YiB0aHJvdWdoIHRoZVxuICAvLyBwYWNrYWdlIG1hbmFnZXIgYmVjYXVzZSB0YXJnZXQgcmVwb3MgaW5zdGFsbCB3YiBhcyBhIHBhY2thZ2UgZGVwZW5kZW5jeS5cbiAgd2ViU2VydmVyLnZhbHVlLnByb3BlcnRpZXMuY29tbWFuZCA9IGxpdGVyYWwoZ2V0V2JTdGFydFRlc3RDb21tYW5kKGNvbmZpZykpO1xufVxuXG5mdW5jdGlvbiBnZXRXYlN0YXJ0VGVzdENvbW1hbmQoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAnJHtnZXRQYWNrYWdlTWFuYWdlckNvbW1hbmQoY29uZmlnKX0gd2Igc3RhcnQgLS1tb2RlIHRlc3QnYDtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdERlZmluZUNvbmZpZ09iamVjdExpdGVyYWwoY29udGVudDogc3RyaW5nKTogRXh0cmFjdGVkT2JqZWN0TGl0ZXJhbCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHNvdXJjZSA9IHRzLmNyZWF0ZVNvdXJjZUZpbGUoJ3BsYXl3cmlnaHQuY29uZmlnLnRzJywgY29udGVudCwgdHMuU2NyaXB0VGFyZ2V0LkxhdGVzdCwgdHJ1ZSwgdHMuU2NyaXB0S2luZC5UUyk7XG5cbiAgLy8gVHlwZVNjcmlwdCBhbHJlYWR5IHVuZGVyc3RhbmRzIG5lc3RlZCBvYmplY3QgbGl0ZXJhbHMgYW5kIHRlbXBsYXRlIHN0cmluZ3MsIHNvIHVzZVxuICAvLyBpdHMgQVNUIHJhbmdlcyBpbnN0ZWFkIG9mIGEgcmVnZXggdGhhdCBjYW4gc3RvcCBhdCB0aGUgZmlyc3QgaW5uZXIgY2xvc2luZyBicmFjZS5cbiAgbGV0IGZvdW5kOiB0cy5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbiB8IHVuZGVmaW5lZDtcbiAgY29uc3QgdmlzaXQgPSAobm9kZTogdHMuTm9kZSk6IHZvaWQgPT4ge1xuICAgIGlmIChmb3VuZCkgcmV0dXJuO1xuICAgIGlmICh0cy5pc0NhbGxFeHByZXNzaW9uKG5vZGUpICYmIG5vZGUuZXhwcmVzc2lvbi5nZXRUZXh0KHNvdXJjZSkgPT09ICdkZWZpbmVDb25maWcnKSB7XG4gICAgICBjb25zdCBmaXJzdEFyZ3VtZW50ID0gbm9kZS5hcmd1bWVudHNbMF07XG4gICAgICBpZiAoZmlyc3RBcmd1bWVudCAmJiB0cy5pc09iamVjdExpdGVyYWxFeHByZXNzaW9uKGZpcnN0QXJndW1lbnQpKSB7XG4gICAgICAgIGZvdW5kID0gZmlyc3RBcmd1bWVudDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICB0cy5mb3JFYWNoQ2hpbGQobm9kZSwgdmlzaXQpO1xuICB9O1xuICB2aXNpdChzb3VyY2UpO1xuXG4gIHJldHVybiBmb3VuZCA/IHsgc291cmNlLCBub2RlOiBmb3VuZCB9IDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBwYXJzZUV4cHJlc3Npb24oZXhwcmVzc2lvbjogdHMuRXhwcmVzc2lvbiwgc291cmNlOiB0cy5Tb3VyY2VGaWxlKTogUGFyc2VkVmFsdWUgfCB1bmRlZmluZWQge1xuICBpZiAodHMuaXNPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihleHByZXNzaW9uKSkge1xuICAgIGNvbnN0IHBhcnNlZE9iamVjdCA9IHBhcnNlT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oZXhwcmVzc2lvbiwgc291cmNlKTtcbiAgICByZXR1cm4gcGFyc2VkT2JqZWN0ID8geyBraW5kOiAnb2JqZWN0JywgdmFsdWU6IHBhcnNlZE9iamVjdCB9IDogbGl0ZXJhbChleHByZXNzaW9uLmdldFRleHQoc291cmNlKSk7XG4gIH1cbiAgaWYgKHRzLmlzQXJyYXlMaXRlcmFsRXhwcmVzc2lvbihleHByZXNzaW9uKSkge1xuICAgIGNvbnN0IGVsZW1lbnRzID0gZXhwcmVzc2lvbi5lbGVtZW50cy5tYXAoKGVsZW1lbnQpID0+IHBhcnNlRXhwcmVzc2lvbihlbGVtZW50LCBzb3VyY2UpKTtcbiAgICBpZiAoZWxlbWVudHMuc29tZSgoZWxlbWVudCk6IGVsZW1lbnQgaXMgdW5kZWZpbmVkID0+IGVsZW1lbnQgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgIHJldHVybiBsaXRlcmFsKGV4cHJlc3Npb24uZ2V0VGV4dChzb3VyY2UpKTtcbiAgICB9XG4gICAgcmV0dXJuIGFzQXJyYXkoZWxlbWVudHMgYXMgUGFyc2VkVmFsdWVbXSk7XG4gIH1cbiAgcmV0dXJuIGxpdGVyYWwoZXhwcmVzc2lvbi5nZXRUZXh0KHNvdXJjZSkpO1xufVxuXG5mdW5jdGlvbiBwYXJzZU9iamVjdExpdGVyYWxFeHByZXNzaW9uKFxuICBvYmplY3RMaXRlcmFsOiB0cy5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbixcbiAgc291cmNlOiB0cy5Tb3VyY2VGaWxlXG4pOiBQYXJzZWRPYmplY3QgfCB1bmRlZmluZWQge1xuICBjb25zdCBwYXJzZWQ6IFBhcnNlZE9iamVjdCA9IHsgZXh0cmFNZW1iZXJzOiBbXSwgbWVtYmVyT3JkZXI6IFtdLCBwcm9wZXJ0aWVzOiB7fSB9O1xuICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIG9iamVjdExpdGVyYWwucHJvcGVydGllcykge1xuICAgIGlmICh0cy5pc1Nob3J0aGFuZFByb3BlcnR5QXNzaWdubWVudChwcm9wZXJ0eSkpIHtcbiAgICAgIGNvbnN0IGtleSA9IHByb3BlcnR5Lm5hbWUuZ2V0VGV4dChzb3VyY2UpO1xuICAgICAgcGFyc2VkLnByb3BlcnRpZXNba2V5XSA9IGxpdGVyYWwoa2V5KTtcbiAgICAgIHBhcnNlZC5tZW1iZXJPcmRlci5wdXNoKHsga2luZDogJ3Byb3BlcnR5Jywga2V5IH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmICghdHMuaXNQcm9wZXJ0eUFzc2lnbm1lbnQocHJvcGVydHkpIHx8ICghdHMuaXNJZGVudGlmaWVyKHByb3BlcnR5Lm5hbWUpICYmICF0cy5pc1N0cmluZ0xpdGVyYWwocHJvcGVydHkubmFtZSkpKSB7XG4gICAgICBjb25zdCBpbmRleCA9IHBhcnNlZC5leHRyYU1lbWJlcnMucHVzaChwcm9wZXJ0eS5nZXRUZXh0KHNvdXJjZSkpIC0gMTtcbiAgICAgIHBhcnNlZC5tZW1iZXJPcmRlci5wdXNoKHsga2luZDogJ2V4dHJhJywgaW5kZXggfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgdmFsdWUgPSBwYXJzZUV4cHJlc3Npb24ocHJvcGVydHkuaW5pdGlhbGl6ZXIsIHNvdXJjZSk7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICBjb25zdCBrZXkgPSBwcm9wZXJ0eS5uYW1lLmdldFRleHQoc291cmNlKTtcbiAgICBwYXJzZWQucHJvcGVydGllc1trZXldID0gdmFsdWU7XG4gICAgcGFyc2VkLm1lbWJlck9yZGVyLnB1c2goeyBraW5kOiAncHJvcGVydHknLCBrZXkgfSk7XG4gIH1cbiAgcmV0dXJuIHBhcnNlZDtcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5VmFsdWUodmFsdWU6IFBhcnNlZFZhbHVlLCBsZXZlbDogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3QgY2xvc2luZ0luZGVudCA9ICcgICcucmVwZWF0KGxldmVsKTtcbiAgaWYgKHZhbHVlLmtpbmQgPT09ICdhcnJheScpIHtcbiAgICBpZiAodmFsdWUudmFsdWUubGVuZ3RoID09PSAwKSByZXR1cm4gJ1tdJztcbiAgICBjb25zdCBpbmRlbnQgPSAnICAnLnJlcGVhdChsZXZlbCArIDEpO1xuICAgIGNvbnN0IGxpbmVzID0gdmFsdWUudmFsdWUubWFwKChpdGVtKSA9PiB7XG4gICAgICBjb25zdCBzdHJpbmdpZmllZCA9IHN0cmluZ2lmeVZhbHVlKGl0ZW0sIGxldmVsICsgMSkuc3BsaXQoJ1xcbicpO1xuICAgICAgc3RyaW5naWZpZWRbc3RyaW5naWZpZWQubGVuZ3RoIC0gMV0gPSBgJHtzdHJpbmdpZmllZC5hdCgtMSl9LGA7XG4gICAgICBpZiAoaXRlbS5raW5kID09PSAnbGl0ZXJhbCcpIHtcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAxOyBpbmRleCA8IHN0cmluZ2lmaWVkLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgICAgIHN0cmluZ2lmaWVkW2luZGV4XSA9IGAke2luZGVudH0ke3N0cmluZ2lmaWVkW2luZGV4XX1gO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzdHJpbmdpZmllZFswXSA9IGAke2luZGVudH0ke3N0cmluZ2lmaWVkWzBdfWA7XG4gICAgICByZXR1cm4gc3RyaW5naWZpZWQuam9pbignXFxuJyk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGBbXFxuJHtsaW5lcy5qb2luKCdcXG4nKX1cXG4ke2Nsb3NpbmdJbmRlbnR9XWA7XG4gIH1cbiAgaWYgKHZhbHVlLmtpbmQgPT09ICdsaXRlcmFsJykgcmV0dXJuIHZhbHVlLnZhbHVlO1xuXG4gIGNvbnN0IGluZGVudCA9ICcgICcucmVwZWF0KGxldmVsICsgMSk7XG4gIGNvbnN0IGVtaXR0ZWRQcm9wZXJ0aWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IGxhc3RQcm9wZXJ0eUluZGV4QnlLZXkgPSBnZXRMYXN0UHJvcGVydHlJbmRleEJ5S2V5KHZhbHVlLnZhbHVlLm1lbWJlck9yZGVyKTtcbiAgY29uc3QgbGluZXMgPSB2YWx1ZS52YWx1ZS5tZW1iZXJPcmRlci5mbGF0TWFwKChtZW1iZXIsIGluZGV4KSA9PiB7XG4gICAgaWYgKG1lbWJlci5raW5kID09PSAnZXh0cmEnKSB7XG4gICAgICByZXR1cm4gW3N0cmluZ2lmeU9iamVjdE1lbWJlcih2YWx1ZS52YWx1ZS5leHRyYU1lbWJlcnNbbWVtYmVyLmluZGV4XSA/PyAnJywgaW5kZW50KV07XG4gICAgfVxuXG4gICAgaWYgKGxhc3RQcm9wZXJ0eUluZGV4QnlLZXkuZ2V0KG1lbWJlci5rZXkpICE9PSBpbmRleCkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IGl0ZW0gPSB2YWx1ZS52YWx1ZS5wcm9wZXJ0aWVzW21lbWJlci5rZXldO1xuICAgIGlmICghaXRlbSB8fCBlbWl0dGVkUHJvcGVydGllcy5oYXMobWVtYmVyLmtleSkpIHJldHVybiBbXTtcbiAgICBlbWl0dGVkUHJvcGVydGllcy5hZGQobWVtYmVyLmtleSk7XG4gICAgcmV0dXJuIFtzdHJpbmdpZnlPYmplY3RQcm9wZXJ0eShtZW1iZXIua2V5LCBpdGVtLCBsZXZlbCwgaW5kZW50KV07XG4gIH0pO1xuICBsaW5lcy5wdXNoKFxuICAgIC4uLk9iamVjdC5lbnRyaWVzKHZhbHVlLnZhbHVlLnByb3BlcnRpZXMpXG4gICAgICAuZmlsdGVyKChba2V5XSkgPT4gIWVtaXR0ZWRQcm9wZXJ0aWVzLmhhcyhrZXkpKVxuICAgICAgLm1hcCgoW2tleSwgaXRlbV0pID0+IHN0cmluZ2lmeU9iamVjdFByb3BlcnR5KGtleSwgaXRlbSwgbGV2ZWwsIGluZGVudCkpXG4gICk7XG4gIGlmIChsaW5lcy5sZW5ndGggPT09IDApIHJldHVybiBge1xcbiR7Y2xvc2luZ0luZGVudH19YDtcbiAgcmV0dXJuIGB7XFxuJHtsaW5lcy5qb2luKCdcXG4nKX1cXG4ke2Nsb3NpbmdJbmRlbnR9fWA7XG59XG5cbmZ1bmN0aW9uIGdldExhc3RQcm9wZXJ0eUluZGV4QnlLZXkobWVtYmVyT3JkZXI6IE9iamVjdE1lbWJlcltdKTogTWFwPHN0cmluZywgbnVtYmVyPiB7XG4gIGNvbnN0IGxhc3RQcm9wZXJ0eUluZGV4QnlLZXkgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICBmb3IgKGNvbnN0IFtpbmRleCwgbWVtYmVyXSBvZiBtZW1iZXJPcmRlci5lbnRyaWVzKCkpIHtcbiAgICBpZiAobWVtYmVyLmtpbmQgPT09ICdwcm9wZXJ0eScpIHtcbiAgICAgIGxhc3RQcm9wZXJ0eUluZGV4QnlLZXkuc2V0KG1lbWJlci5rZXksIGluZGV4KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGxhc3RQcm9wZXJ0eUluZGV4QnlLZXk7XG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeU9iamVjdFByb3BlcnR5KGtleTogc3RyaW5nLCBpdGVtOiBQYXJzZWRWYWx1ZSwgbGV2ZWw6IG51bWJlciwgaW5kZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBzdHJpbmdpZmllZCA9IHN0cmluZ2lmeVZhbHVlKGl0ZW0sIGxldmVsICsgMSkuc3BsaXQoJ1xcbicpO1xuICBzdHJpbmdpZmllZFtzdHJpbmdpZmllZC5sZW5ndGggLSAxXSA9IGAke3N0cmluZ2lmaWVkLmF0KC0xKX0sYDtcbiAgaWYgKGl0ZW0ua2luZCA9PT0gJ2xpdGVyYWwnKSB7XG4gICAgZm9yIChsZXQgaW5kZXggPSAxOyBpbmRleCA8IHN0cmluZ2lmaWVkLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgc3RyaW5naWZpZWRbaW5kZXhdID0gYCR7aW5kZW50fSR7c3RyaW5naWZpZWRbaW5kZXhdfWA7XG4gICAgfVxuICB9XG4gIHN0cmluZ2lmaWVkWzBdID0gYCR7aW5kZW50fSR7a2V5fTogJHtzdHJpbmdpZmllZFswXX1gO1xuICByZXR1cm4gc3RyaW5naWZpZWQuam9pbignXFxuJyk7XG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeU9iamVjdE1lbWJlcihtZW1iZXI6IHN0cmluZywgaW5kZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBzdHJpbmdpZmllZCA9IG1lbWJlci5zcGxpdCgnXFxuJyk7XG4gIHN0cmluZ2lmaWVkW3N0cmluZ2lmaWVkLmxlbmd0aCAtIDFdID0gYCR7c3RyaW5naWZpZWQuYXQoLTEpfSxgO1xuICBmb3IgKGNvbnN0IFtpbmRleCwgbGluZV0gb2Ygc3RyaW5naWZpZWQuZW50cmllcygpKSB7XG4gICAgc3RyaW5naWZpZWRbaW5kZXhdID0gYCR7aW5kZW50fSR7bGluZX1gO1xuICB9XG4gIHJldHVybiBzdHJpbmdpZmllZC5qb2luKCdcXG4nKTtcbn1cbiIsImV4cG9ydCBjb25zdCBnbG9iSWdub3JlID0gW1xuICAnKiovbm9kZV9tb2R1bGVzLyoqJyxcbiAgJyoqLy52ZW52LyoqJyxcbiAgJyoqL3Rlc3QtZml4dHVyZXMvKionLFxuICAnKiovdGVzdC9maXh0dXJlcy8qKicsXG4gICcqKi9kaXN0LyoqJyxcbiAgJyoqL2J1aWxkLyoqJyxcbiAgJyoqL3RhcmdldC8qKicsXG4gICcqKi90ZW1wLyoqJyxcbiAgJyoqL3RtcC8qKicsXG5dO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYic7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdsb2JJZ25vcmUgfSBmcm9tICcuLi91dGlscy9nbG9iVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhQcmlzbWFFbnZGaWxlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhQcmlzbWFFbnZGaWxlcycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBzaG91bGRBZGRDb25uZWN0aW9uTGltaXQgPSBzaG91bGRBZGRTcWxpdGVDb25uZWN0aW9uTGltaXQoY29uZmlnKTtcbiAgICBjb25zdCBlbnZGaWxlcyA9IGF3YWl0IGZnLmdsb2IoWycqLmVudicsICcqLmVudi4qJ10sIHsgZG90OiB0cnVlLCBjd2Q6IGNvbmZpZy5kaXJQYXRoLCBpZ25vcmU6IGdsb2JJZ25vcmUgfSk7XG4gICAgZm9yIChjb25zdCBlbnZGaWxlIG9mIGVudkZpbGVzKSB7XG4gICAgICBjb25zdCBlbnZGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgZW52RmlsZSk7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoZW52RmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBuZXdDb250ZW50ID0gY29udGVudC5yZXBsYWNlQWxsKFxuICAgICAgICAvREFUQUJBU0VfVVJMXFxzKj1cXHMqXCI/KFteXCIjXFxuXSs/XFwuc3FsaXRlM1teXCIjXFxuXSopXCI/L2csXG4gICAgICAgIChtYXRjaCwgdXJsOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICByZXR1cm4gYERBVEFCQVNFX1VSTD1cIiR7bm9ybWFsaXplU3FsaXRlRGF0YWJhc2VVcmwodXJsLCBzaG91bGRBZGRDb25uZWN0aW9uTGltaXQpfVwiYDtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIGlmIChuZXdDb250ZW50ICE9PSBjb250ZW50KSB7XG4gICAgICAgIGF3YWl0IGZzLndyaXRlRmlsZShlbnZGaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkQWRkU3FsaXRlQ29ubmVjdGlvbkxpbWl0KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICBpZiAoIWNvbmZpZy5kZXBlbmRpbmcucHJpc21hKSByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3QgZGVwZW5kZW5jaWVzID0ge1xuICAgIC4uLmNvbmZpZy5wYWNrYWdlSnNvbj8uZGVwZW5kZW5jaWVzLFxuICAgIC4uLmNvbmZpZy5wYWNrYWdlSnNvbj8uZGV2RGVwZW5kZW5jaWVzLFxuICB9O1xuXG4gIC8vIGBjb25uZWN0aW9uX2xpbWl0PTFgIG9ubHkgYXBwbGllcyB0byBQcmlzbWEncyBTUUxpdGUgZGF0YXNvdXJjZSBoYW5kbGluZy5cbiAgLy8gUmVwb3MgdGhhdCBvcHQgaW50byBub24tcHVyZSBTUUxpdGUgYWRhcHRlcnMgc2hvdWxkIGtlZXAgdGhlaXIgVVJMIGFzLWlzLlxuICByZXR1cm4gIWRlcGVuZGVuY2llc1snQHByaXNtYS9hZGFwdGVyLWJldHRlci1zcWxpdGUzJ10gJiYgIWRlcGVuZGVuY2llc1snQHByaXNtYS9hZGFwdGVyLWxpYnNxbCddO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVTcWxpdGVEYXRhYmFzZVVybCh1cmw6IHN0cmluZywgc2hvdWxkQWRkQ29ubmVjdGlvbkxpbWl0OiBib29sZWFuKTogc3RyaW5nIHtcbiAgY29uc3QgcXVlcnlTdGFydCA9IHVybC5pbmRleE9mKCc/Jyk7XG4gIGNvbnN0IHBhdGhQYXJ0ID0gcXVlcnlTdGFydCAhPT0gLTEgPyB1cmwuc2xpY2UoMCwgcXVlcnlTdGFydCkgOiB1cmw7XG4gIGNvbnN0IHF1ZXJ5UGFydCA9IHF1ZXJ5U3RhcnQgIT09IC0xID8gdXJsLnNsaWNlKHF1ZXJ5U3RhcnQgKyAxKSA6ICcnO1xuICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHF1ZXJ5UGFydCk7XG5cbiAgcGFyYW1zLmRlbGV0ZSgnY29ubmVjdGlvbl9saW1pdCcpO1xuICBpZiAoc2hvdWxkQWRkQ29ubmVjdGlvbkxpbWl0KSB7XG4gICAgcGFyYW1zLnNldCgnY29ubmVjdGlvbl9saW1pdCcsICcxJyk7XG4gIH1cblxuICBjb25zdCBub3JtYWxpemVkUXVlcnkgPSBwYXJhbXMudG9TdHJpbmcoKTtcbiAgcmV0dXJuIG5vcm1hbGl6ZWRRdWVyeSA/IGAke3BhdGhQYXJ0fT8ke25vcm1hbGl6ZWRRdWVyeX1gIDogcGF0aFBhcnQ7XG59XG4iLCJjb25zdCBoYXMgPSAob2JqZWN0LCBrZXkpID0+IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSlcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc29ydE9iamVjdEJ5S2V5TmFtZUxpc3Qob2JqZWN0LCBzb3J0V2l0aCkge1xuICBsZXQga2V5cywgc29ydEZuLCBrZXlcblxuICBpZiAodHlwZW9mIHNvcnRXaXRoID09PSAnZnVuY3Rpb24nKSB7XG4gICAgc29ydEZuID0gc29ydFdpdGhcbiAgfSBlbHNlIHtcbiAgICBrZXlzID0gc29ydFdpdGhcbiAgfVxuXG4gIGNvbnN0IHRvdGFsID0ge31cbiAgY29uc3Qgb2JqZWN0S2V5cyA9IFsuLi4oa2V5cyA/PyBbXSksIC4uLk9iamVjdC5rZXlzKG9iamVjdCkuc29ydChzb3J0Rm4pXVxuXG4gIGZvciAoa2V5IG9mIG9iamVjdEtleXMpIHtcbiAgICBpZiAoaGFzKG9iamVjdCwga2V5KSkge1xuICAgICAgdG90YWxba2V5XSA9IG9iamVjdFtrZXldXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRvdGFsXG59XG4iLCIvLyBEZXRlY3QgZWl0aGVyIHNwYWNlcyBvciB0YWJzIGJ1dCBub3QgYm90aCB0byBwcm9wZXJseSBoYW5kbGUgdGFicyBmb3IgaW5kZW50YXRpb24gYW5kIHNwYWNlcyBmb3IgYWxpZ25tZW50XG5jb25zdCBJTkRFTlRfUkVHRVggPSAvXig/OiggKSt8XFx0KykvO1xuXG5jb25zdCBJTkRFTlRfVFlQRV9TUEFDRSA9ICdzcGFjZSc7XG5jb25zdCBJTkRFTlRfVFlQRV9UQUIgPSAndGFiJztcblxuLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNoZWNrIGlmIHdlIHNob3VsZCBpZ25vcmUgc2luZ2xlIHNwYWNlIHBhdHRlcm5zXG5mdW5jdGlvbiBzaG91bGRJZ25vcmVTaW5nbGVTcGFjZShpZ25vcmVTaW5nbGVTcGFjZXMsIGluZGVudFR5cGUsIHZhbHVlKSB7XG5cdHJldHVybiBpZ25vcmVTaW5nbGVTcGFjZXMgJiYgaW5kZW50VHlwZSA9PT0gSU5ERU5UX1RZUEVfU1BBQ0UgJiYgdmFsdWUgPT09IDE7XG59XG5cbi8qKlxuTWFrZSBhIE1hcCB0aGF0IGNvdW50cyBob3cgbWFueSBpbmRlbnRzL3VuaW5kZW50cyBoYXZlIG9jY3VycmVkIGZvciBhIGdpdmVuIHNpemUgYW5kIGhvdyBtYW55IGxpbmVzIGZvbGxvdyBhIGdpdmVuIGluZGVudGF0aW9uLlxuXG5UaGUga2V5IGlzIGEgY29uY2F0ZW5hdGlvbiBvZiB0aGUgaW5kZW50YXRpb24gdHlwZSAocyA9IHNwYWNlIGFuZCB0ID0gdGFiKSBhbmQgdGhlIHNpemUgb2YgdGhlIGluZGVudHMvdW5pbmRlbnRzLlxuXG5gYGBcbmluZGVudHMgPSB7XG5cdHQzOiBbMSwgMF0sXG5cdHQ0OiBbMSwgNV0sXG5cdHM1OiBbMSwgMF0sXG5cdHMxMjogWzEsIDBdLFxufVxuYGBgXG4qL1xuZnVuY3Rpb24gbWFrZUluZGVudHNNYXAoc3RyaW5nLCBpZ25vcmVTaW5nbGVTcGFjZXMpIHtcblx0Y29uc3QgaW5kZW50cyA9IG5ldyBNYXAoKTtcblxuXHQvLyBSZW1lbWJlciB0aGUgc2l6ZSBvZiBwcmV2aW91cyBsaW5lJ3MgaW5kZW50YXRpb25cblx0bGV0IHByZXZpb3VzU2l6ZSA9IDA7XG5cdGxldCBwcmV2aW91c0luZGVudFR5cGU7XG5cblx0Ly8gSW5kZW50cyBrZXkgKGlkZW50IHR5cGUgKyBzaXplIG9mIHRoZSBpbmRlbnRzL3VuaW5kZW50cylcblx0bGV0IGtleTtcblxuXHRmb3IgKGNvbnN0IGxpbmUgb2Ygc3RyaW5nLnNwbGl0KC9cXG4vZykpIHtcblx0XHRpZiAoIWxpbmUpIHtcblx0XHRcdC8vIElnbm9yZSBlbXB0eSBsaW5lc1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXG5cdFx0Y29uc3QgbWF0Y2hlcyA9IGxpbmUubWF0Y2goSU5ERU5UX1JFR0VYKTtcblxuXHRcdGlmIChtYXRjaGVzID09PSBudWxsKSB7XG5cdFx0XHRwcmV2aW91c1NpemUgPSAwO1xuXHRcdFx0cHJldmlvdXNJbmRlbnRUeXBlID0gJyc7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IGluZGVudCA9IG1hdGNoZXNbMF0ubGVuZ3RoO1xuXHRcdFx0Y29uc3QgaW5kZW50VHlwZSA9IG1hdGNoZXNbMV0gPyBJTkRFTlRfVFlQRV9TUEFDRSA6IElOREVOVF9UWVBFX1RBQjtcblxuXHRcdFx0Ly8gSWdub3JlIHNpbmdsZSBzcGFjZSB1bmxlc3MgaXQncyB0aGUgb25seSBpbmRlbnQgZGV0ZWN0ZWQgdG8gcHJldmVudCBjb21tb24gZmFsc2UgcG9zaXRpdmVzXG5cdFx0XHRpZiAoc2hvdWxkSWdub3JlU2luZ2xlU3BhY2UoaWdub3JlU2luZ2xlU3BhY2VzLCBpbmRlbnRUeXBlLCBpbmRlbnQpKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoaW5kZW50VHlwZSAhPT0gcHJldmlvdXNJbmRlbnRUeXBlKSB7XG5cdFx0XHRcdHByZXZpb3VzU2l6ZSA9IDA7XG5cdFx0XHR9XG5cblx0XHRcdHByZXZpb3VzSW5kZW50VHlwZSA9IGluZGVudFR5cGU7XG5cblx0XHRcdGxldCB1c2UgPSAxO1xuXHRcdFx0bGV0IHdlaWdodCA9IDA7XG5cblx0XHRcdGNvbnN0IGluZGVudERpZmZlcmVuY2UgPSBpbmRlbnQgLSBwcmV2aW91c1NpemU7XG5cdFx0XHRwcmV2aW91c1NpemUgPSBpbmRlbnQ7XG5cblx0XHRcdC8vIFByZXZpb3VzIGxpbmUgaGF2ZSBzYW1lIGluZGVudD9cblx0XHRcdGlmIChpbmRlbnREaWZmZXJlbmNlID09PSAwKSB7XG5cdFx0XHRcdC8vIE5vdCBhIG5ldyBcInVzZVwiIG9mIHRoZSBjdXJyZW50IGluZGVudDpcblx0XHRcdFx0dXNlID0gMDtcblx0XHRcdFx0Ly8gQnV0IGRvIGFkZCBhIGJpdCB0byBpdCBmb3IgYnJlYWtpbmcgdGllczpcblx0XHRcdFx0d2VpZ2h0ID0gMTtcblx0XHRcdFx0Ly8gV2UgdXNlIHRoZSBrZXkgZnJvbSBwcmV2aW91cyBsb29wXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBhYnNvbHV0ZUluZGVudERpZmZlcmVuY2UgPSBNYXRoLmFicyhpbmRlbnREaWZmZXJlbmNlKTtcblxuXHRcdFx0XHQvLyBJZ25vcmUgc2luZ2xlIHNwYWNlIGNoYW5nZXMgd2hlbiBpZ25vcmVTaW5nbGVTcGFjZXMgaXMgdHJ1ZVxuXHRcdFx0XHQvLyBUaGlzIHByZXZlbnRzIGNvbW1vbiBmYWxzZSBwb3NpdGl2ZXMgZnJvbSB0aGluZ3MgbGlrZSBhbGlnbmVkIGNvbW1lbnRzXG5cdFx0XHRcdGlmIChzaG91bGRJZ25vcmVTaW5nbGVTcGFjZShpZ25vcmVTaW5nbGVTcGFjZXMsIGluZGVudFR5cGUsIGFic29sdXRlSW5kZW50RGlmZmVyZW5jZSkpIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGtleSA9IGVuY29kZUluZGVudHNLZXkoaW5kZW50VHlwZSwgYWJzb2x1dGVJbmRlbnREaWZmZXJlbmNlKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gVXBkYXRlIHRoZSBzdGF0c1xuXHRcdFx0Y29uc3QgZW50cnkgPSBpbmRlbnRzLmdldChrZXkpO1xuXHRcdFx0aW5kZW50cy5zZXQoa2V5LCBlbnRyeSA9PT0gdW5kZWZpbmVkID8gWzEsIDBdIDogW2VudHJ5WzBdICsgdXNlLCBlbnRyeVsxXSArIHdlaWdodF0pO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBpbmRlbnRzO1xufVxuXG4vLyBFbmNvZGUgdGhlIGluZGVudCB0eXBlIGFuZCBhbW91bnQgYXMgYSBzdHJpbmcgKGUuZy4gJ3M0JykgZm9yIHVzZSBhcyBhIGNvbXBvdW5kIGtleSBpbiB0aGUgaW5kZW50cyBNYXAuXG5mdW5jdGlvbiBlbmNvZGVJbmRlbnRzS2V5KGluZGVudFR5cGUsIGluZGVudEFtb3VudCkge1xuXHRjb25zdCB0eXBlQ2hhcmFjdGVyID0gaW5kZW50VHlwZSA9PT0gSU5ERU5UX1RZUEVfU1BBQ0UgPyAncycgOiAndCc7XG5cdHJldHVybiB0eXBlQ2hhcmFjdGVyICsgU3RyaW5nKGluZGVudEFtb3VudCk7XG59XG5cbi8vIEV4dHJhY3QgdGhlIGluZGVudCB0eXBlIGFuZCBhbW91bnQgZnJvbSBhIGtleSBvZiB0aGUgaW5kZW50cyBNYXAuXG5mdW5jdGlvbiBkZWNvZGVJbmRlbnRzS2V5KGluZGVudHNLZXkpIHtcblx0Y29uc3Qga2V5SGFzVHlwZVNwYWNlID0gaW5kZW50c0tleVswXSA9PT0gJ3MnO1xuXHRjb25zdCB0eXBlID0ga2V5SGFzVHlwZVNwYWNlID8gSU5ERU5UX1RZUEVfU1BBQ0UgOiBJTkRFTlRfVFlQRV9UQUI7XG5cblx0Y29uc3QgYW1vdW50ID0gTnVtYmVyKGluZGVudHNLZXkuc2xpY2UoMSkpO1xuXG5cdHJldHVybiB7dHlwZSwgYW1vdW50fTtcbn1cblxuLy8gUmV0dXJuIHRoZSBrZXkgKGUuZy4gJ3M0JykgZnJvbSB0aGUgaW5kZW50cyBNYXAgdGhhdCByZXByZXNlbnRzIHRoZSBtb3N0IGNvbW1vbiBpbmRlbnQsXG4vLyBvciByZXR1cm4gdW5kZWZpbmVkIGlmIHRoZXJlIGFyZSBubyBpbmRlbnRzLlxuZnVuY3Rpb24gZ2V0TW9zdFVzZWRLZXkoaW5kZW50cykge1xuXHRsZXQgcmVzdWx0O1xuXHRsZXQgbWF4VXNlZCA9IDA7XG5cdGxldCBtYXhXZWlnaHQgPSAwO1xuXG5cdGZvciAoY29uc3QgW2tleSwgW3VzZWRDb3VudCwgd2VpZ2h0XV0gb2YgaW5kZW50cykge1xuXHRcdGlmICh1c2VkQ291bnQgPiBtYXhVc2VkIHx8ICh1c2VkQ291bnQgPT09IG1heFVzZWQgJiYgd2VpZ2h0ID4gbWF4V2VpZ2h0KSkge1xuXHRcdFx0bWF4VXNlZCA9IHVzZWRDb3VudDtcblx0XHRcdG1heFdlaWdodCA9IHdlaWdodDtcblx0XHRcdHJlc3VsdCA9IGtleTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBtYWtlSW5kZW50U3RyaW5nKHR5cGUsIGFtb3VudCkge1xuXHRjb25zdCBpbmRlbnRDaGFyYWN0ZXIgPSB0eXBlID09PSBJTkRFTlRfVFlQRV9TUEFDRSA/ICcgJyA6ICdcXHQnO1xuXHRyZXR1cm4gaW5kZW50Q2hhcmFjdGVyLnJlcGVhdChhbW91bnQpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBkZXRlY3RJbmRlbnQoc3RyaW5nKSB7XG5cdGlmICh0eXBlb2Ygc3RyaW5nICE9PSAnc3RyaW5nJykge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIGEgc3RyaW5nJyk7XG5cdH1cblxuXHQvLyBJZGVudGlmeSBpbmRlbnRzIHdoaWxlIHNraXBwaW5nIHNpbmdsZSBzcGFjZSBpbmRlbnRzIHRvIGF2b2lkIGNvbW1vbiBlZGdlIGNhc2VzIChlLmcuIGNvZGUgY29tbWVudHMpXG5cdC8vIElmIG5vIGluZGVudHMgYXJlIGlkZW50aWZpZWQsIHJ1biBhZ2FpbiBhbmQgaW5jbHVkZSBhbGwgaW5kZW50cyBmb3IgY29tcHJlaGVuc2l2ZSBkZXRlY3Rpb25cblx0bGV0IGluZGVudHMgPSBtYWtlSW5kZW50c01hcChzdHJpbmcsIHRydWUpO1xuXHRpZiAoaW5kZW50cy5zaXplID09PSAwKSB7XG5cdFx0aW5kZW50cyA9IG1ha2VJbmRlbnRzTWFwKHN0cmluZywgZmFsc2UpO1xuXHR9XG5cblx0Y29uc3Qga2V5T2ZNb3N0VXNlZEluZGVudCA9IGdldE1vc3RVc2VkS2V5KGluZGVudHMpO1xuXG5cdGxldCB0eXBlO1xuXHRsZXQgYW1vdW50ID0gMDtcblx0bGV0IGluZGVudCA9ICcnO1xuXG5cdGlmIChrZXlPZk1vc3RVc2VkSW5kZW50ICE9PSB1bmRlZmluZWQpIHtcblx0XHQoe3R5cGUsIGFtb3VudH0gPSBkZWNvZGVJbmRlbnRzS2V5KGtleU9mTW9zdFVzZWRJbmRlbnQpKTtcblx0XHRpbmRlbnQgPSBtYWtlSW5kZW50U3RyaW5nKHR5cGUsIGFtb3VudCk7XG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdGFtb3VudCxcblx0XHR0eXBlLFxuXHRcdGluZGVudCxcblx0fTtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBkZXRlY3ROZXdsaW5lKHN0cmluZykge1xuXHRpZiAodHlwZW9mIHN0cmluZyAhPT0gJ3N0cmluZycpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBhIHN0cmluZycpO1xuXHR9XG5cblx0Y29uc3QgbmV3bGluZXMgPSBzdHJpbmcubWF0Y2goLyg/Olxccj9cXG4pL2cpIHx8IFtdO1xuXG5cdGlmIChuZXdsaW5lcy5sZW5ndGggPT09IDApIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRjb25zdCBjcmxmID0gbmV3bGluZXMuZmlsdGVyKG5ld2xpbmUgPT4gbmV3bGluZSA9PT0gJ1xcclxcbicpLmxlbmd0aDtcblx0Y29uc3QgbGYgPSBuZXdsaW5lcy5sZW5ndGggLSBjcmxmO1xuXG5cdHJldHVybiBjcmxmID4gbGYgPyAnXFxyXFxuJyA6ICdcXG4nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGV0ZWN0TmV3bGluZUdyYWNlZnVsKHN0cmluZykge1xuXHRyZXR1cm4gKHR5cGVvZiBzdHJpbmcgPT09ICdzdHJpbmcnICYmIGRldGVjdE5ld2xpbmUoc3RyaW5nKSkgfHwgJ1xcbic7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcydcbmltcG9ydCBzb3J0T2JqZWN0S2V5cyBmcm9tICdzb3J0LW9iamVjdC1rZXlzJ1xuaW1wb3J0IGRldGVjdEluZGVudCBmcm9tICdkZXRlY3QtaW5kZW50J1xuaW1wb3J0IHsgZGV0ZWN0TmV3bGluZUdyYWNlZnVsIGFzIGRldGVjdE5ld2xpbmUgfSBmcm9tICdkZXRlY3QtbmV3bGluZSdcbmltcG9ydCBnaXRIb29rcyBmcm9tICdnaXQtaG9va3MtbGlzdCdcbmltcG9ydCBpc1BsYWluT2JqZWN0IGZyb20gJ2lzLXBsYWluLW9iaidcbmltcG9ydCBzZW12ZXJDb21wYXJlIGZyb20gJ3NlbXZlci9mdW5jdGlvbnMvY29tcGFyZS5qcydcbmltcG9ydCBzZW12ZXJNaW5WZXJzaW9uIGZyb20gJ3NlbXZlci9yYW5nZXMvbWluLXZlcnNpb24uanMnXG5cbmNvbnN0IHBpcGUgPVxuICAoZm5zKSA9PlxuICAoeCwgLi4uYXJncykgPT5cbiAgICBmbnMucmVkdWNlKChyZXN1bHQsIGZuKSA9PiBmbihyZXN1bHQsIC4uLmFyZ3MpLCB4KVxuY29uc3Qgb25BcnJheSA9IChmbikgPT4gKHgpID0+IChBcnJheS5pc0FycmF5KHgpID8gZm4oeCkgOiB4KVxuY29uc3Qgb25TdHJpbmdBcnJheSA9IChmbikgPT4gKHgpID0+XG4gIEFycmF5LmlzQXJyYXkoeCkgJiYgeC5ldmVyeSgoaXRlbSkgPT4gdHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnKSA/IGZuKHgpIDogeFxuY29uc3QgdW5pcSA9IG9uU3RyaW5nQXJyYXkoKHhzKSA9PiBbLi4ubmV3IFNldCh4cyldKVxuY29uc3Qgc29ydEFycmF5ID0gb25TdHJpbmdBcnJheSgoYXJyYXkpID0+IGFycmF5LnRvU29ydGVkKCkpXG5jb25zdCB1bmlxQW5kU29ydEFycmF5ID0gcGlwZShbdW5pcSwgc29ydEFycmF5XSlcbmNvbnN0IG9uT2JqZWN0ID1cbiAgKGZuKSA9PlxuICAoeCwgLi4uYXJncykgPT5cbiAgICBpc1BsYWluT2JqZWN0KHgpID8gZm4oeCwgLi4uYXJncykgOiB4XG5jb25zdCBzb3J0T2JqZWN0QnkgPSAoY29tcGFyYXRvciwgZGVlcCkgPT4ge1xuICBjb25zdCBvdmVyID0gb25PYmplY3QoKG9iamVjdCkgPT4ge1xuICAgIGlmIChkZWVwKSB7XG4gICAgICBvYmplY3QgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKG9iamVjdCkubWFwKChba2V5LCB2YWx1ZV0pID0+IFtrZXksIG92ZXIodmFsdWUpXSksXG4gICAgICApXG4gICAgfVxuXG4gICAgcmV0dXJuIHNvcnRPYmplY3RLZXlzKG9iamVjdCwgY29tcGFyYXRvcilcbiAgfSlcblxuICByZXR1cm4gb3ZlclxufVxuY29uc3Qgb2JqZWN0R3JvdXBCeSA9XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuL25vLXVuc3VwcG9ydGVkLWZlYXR1cmVzL2VzLWJ1aWx0aW5zLCBuL25vLXVuc3VwcG9ydGVkLWZlYXR1cmVzL2VzLXN5bnRheCAtLSBTYWZlXG4gIE9iamVjdC5ncm91cEJ5IHx8XG4gIC8vIFJlbW92ZSB0aGlzIHdoZW4gd2UgZHJvcCBzdXBwb3J0IGZvciBOb2RlLmpzIDIwXG4gICgoYXJyYXksIGNhbGxiYWNrKSA9PiB7XG4gICAgY29uc3QgcmVzdWx0ID0gT2JqZWN0LmNyZWF0ZShudWxsKVxuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgYXJyYXkpIHtcbiAgICAgIGNvbnN0IGtleSA9IGNhbGxiYWNrKHZhbHVlKVxuICAgICAgaWYgKHJlc3VsdFtrZXldKSB7XG4gICAgICAgIHJlc3VsdFtrZXldLnB1c2godmFsdWUpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHRba2V5XSA9IFt2YWx1ZV1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9KVxuY29uc3Qgc29ydE9iamVjdCA9IHNvcnRPYmplY3RCeSgpXG5jb25zdCBzb3J0VVJMT2JqZWN0ID0gc29ydE9iamVjdEJ5KFsndHlwZScsICd1cmwnXSlcbmNvbnN0IHNvcnRQZW9wbGVPYmplY3QgPSBzb3J0T2JqZWN0QnkoWyduYW1lJywgJ2VtYWlsJywgJ3VybCddKVxuY29uc3Qgc29ydERpcmVjdG9yaWVzID0gc29ydE9iamVjdEJ5KFtcbiAgJ2xpYicsXG4gICdiaW4nLFxuICAnbWFuJyxcbiAgJ2RvYycsXG4gICdleGFtcGxlJyxcbiAgJ3Rlc3QnLFxuXSlcbmNvbnN0IG92ZXJQcm9wZXJ0eSA9IChwcm9wZXJ0eSwgb3ZlcikgPT5cbiAgb25PYmplY3QoKG9iamVjdCwgLi4uYXJncykgPT5cbiAgICBPYmplY3QuaGFzT3duKG9iamVjdCwgcHJvcGVydHkpXG4gICAgICA/IHsgLi4ub2JqZWN0LCBbcHJvcGVydHldOiBvdmVyKG9iamVjdFtwcm9wZXJ0eV0sIC4uLmFyZ3MpIH1cbiAgICAgIDogb2JqZWN0LFxuICApXG5jb25zdCBzb3J0R2l0SG9va3MgPSBzb3J0T2JqZWN0QnkoZ2l0SG9va3MpXG5cbmNvbnN0IHBhcnNlTmFtZUFuZFZlcnNpb25SYW5nZSA9IChzcGVjaWZpZXIpID0+IHtcbiAgLy8gSWdub3JlIGFueXRoaW5nIGFmdGVyID4gJiByZWx5IG9uIGZhbGxiYWNrIGFscGhhbnVtZXJpYyBzb3J0aW5nIGZvciB0aGF0XG4gIGNvbnN0IFtuYW1lQW5kVmVyc2lvbl0gPSBzcGVjaWZpZXIuc3BsaXQoJz4nKVxuICBjb25zdCBhdE1hdGNoZXMgPSBbLi4ubmFtZUFuZFZlcnNpb24ubWF0Y2hBbGwoJ0AnKV1cbiAgaWYgKFxuICAgICFhdE1hdGNoZXMubGVuZ3RoIHx8XG4gICAgKGF0TWF0Y2hlcy5sZW5ndGggPT09IDEgJiYgYXRNYXRjaGVzWzBdLmluZGV4ID09PSAwKVxuICApIHtcbiAgICByZXR1cm4geyBuYW1lOiBzcGVjaWZpZXIgfVxuICB9XG4gIGNvbnN0IHNwbGl0SW5kZXggPSBhdE1hdGNoZXMucG9wKCkuaW5kZXhcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBuYW1lQW5kVmVyc2lvbi5zdWJzdHJpbmcoMCwgc3BsaXRJbmRleCksXG4gICAgcmFuZ2U6IG5hbWVBbmRWZXJzaW9uLnN1YnN0cmluZyhzcGxpdEluZGV4ICsgMSksXG4gIH1cbn1cblxuY29uc3Qgc29ydE9iamVjdEJ5U2VtdmVyID0gc29ydE9iamVjdEJ5KChhLCBiKSA9PiB7XG4gIGNvbnN0IHsgbmFtZTogYU5hbWUsIHJhbmdlOiBhUmFuZ2UgfSA9IHBhcnNlTmFtZUFuZFZlcnNpb25SYW5nZShhKVxuICBjb25zdCB7IG5hbWU6IGJOYW1lLCByYW5nZTogYlJhbmdlIH0gPSBwYXJzZU5hbWVBbmRWZXJzaW9uUmFuZ2UoYilcblxuICBpZiAoYU5hbWUgIT09IGJOYW1lKSB7XG4gICAgcmV0dXJuIGFOYW1lLmxvY2FsZUNvbXBhcmUoYk5hbWUsICdlbicpXG4gIH1cbiAgaWYgKCFhUmFuZ2UpIHtcbiAgICByZXR1cm4gLTFcbiAgfVxuICBpZiAoIWJSYW5nZSkge1xuICAgIHJldHVybiAxXG4gIH1cbiAgcmV0dXJuIHNlbXZlckNvbXBhcmUoc2VtdmVyTWluVmVyc2lvbihhUmFuZ2UpLCBzZW12ZXJNaW5WZXJzaW9uKGJSYW5nZSkpXG59KVxuXG5jb25zdCBnZXRQYWNrYWdlTmFtZSA9IChpZGVudCkgPT4ge1xuICBjb25zdCBpbmRleCA9IGlkZW50LmluZGV4T2YoJ0AnLCBpZGVudC5zdGFydHNXaXRoKCdAJykgPyAxIDogMClcbiAgLy8gVGhpcyBzaG91bGQgbm90IGhhcHBlbiwgdW5sZXNzIHVzZXIgbWFudWFsbHkgZWRpdCB0aGUgcGFja2FnZS5qc29uIGZpbGVcbiAgcmV0dXJuIGluZGV4ID09PSAtMSA/IGlkZW50IDogaWRlbnQuc2xpY2UoMCwgaW5kZXgpXG59XG5cbmNvbnN0IHNvcnRPYmplY3RCeUlkZW50ID0gKGEsIGIpID0+IHtcbiAgY29uc3QgcGFja2FnZU5hbWVBID0gZ2V0UGFja2FnZU5hbWUoYSlcbiAgY29uc3QgcGFja2FnZU5hbWVCID0gZ2V0UGFja2FnZU5hbWUoYilcblxuICBpZiAocGFja2FnZU5hbWVBIDwgcGFja2FnZU5hbWVCKSByZXR1cm4gLTFcbiAgaWYgKHBhY2thZ2VOYW1lQSA+IHBhY2thZ2VOYW1lQikgcmV0dXJuIDFcbiAgcmV0dXJuIDBcbn1cblxuLy8gQ2FjaGUgYnkgYHByb2Nlc3MuY3dkKClgIGluc3RlYWQgb2YgYSB2YXJpYWJsZSB0byBhbGxvdyB1c2VyIGNhbGwgYHByb2Nlc3MuY2hkaXIoKWBcbmNvbnN0IGNhY2hlID0gbmV3IE1hcCgpXG5jb25zdCBoYXNZYXJuT3JQbnBtRmlsZXMgPSAoKSA9PiB7XG4gIGNvbnN0IGN3ZCA9IHByb2Nlc3MuY3dkKClcbiAgaWYgKCFjYWNoZS5oYXMoY3dkKSkge1xuICAgIGNhY2hlLnNldChcbiAgICAgIGN3ZCxcbiAgICAgIGZzLmV4aXN0c1N5bmMoJ3lhcm4ubG9jaycpIHx8XG4gICAgICAgIGZzLmV4aXN0c1N5bmMoJy55YXJuLycpIHx8XG4gICAgICAgIGZzLmV4aXN0c1N5bmMoJy55YXJucmMueW1sJykgfHxcbiAgICAgICAgZnMuZXhpc3RzU3luYygncG5wbS1sb2NrLnlhbWwnKSB8fFxuICAgICAgICBmcy5leGlzdHNTeW5jKCdwbnBtLXdvcmtzcGFjZS55YW1sJyksXG4gICAgKVxuICB9XG4gIHJldHVybiBjYWNoZS5nZXQoY3dkKVxufVxuXG4vKipcbiAqIERldGVjdHMgdGhlIHBhY2thZ2UgbWFuYWdlciBmcm9tIHBhY2thZ2UuanNvbiBhbmQgbG9jayBmaWxlc1xuICogQHBhcmFtIHtvYmplY3R9IHBhY2thZ2VKc29uIC0gVGhlIHBhcnNlZCBwYWNrYWdlLmpzb24gb2JqZWN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBUaGUgZGV0ZWN0ZWQgcGFja2FnZSBtYW5hZ2VyLiBEZWZhdWx0IHRvIG5wbSBpZiBub3QgZGV0ZWN0ZWQuXG4gKi9cbmZ1bmN0aW9uIHNob3VsZFNvcnREZXBlbmRlbmNpZXNMaWtlTnBtKHBhY2thZ2VKc29uKSB7XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvY29yZXBhY2tcbiAgaWYgKHR5cGVvZiBwYWNrYWdlSnNvbi5wYWNrYWdlTWFuYWdlciA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gcGFja2FnZUpzb24ucGFja2FnZU1hbmFnZXIuc3RhcnRzV2l0aCgnbnBtQCcpXG4gIH1cblxuICBpZiAocGFja2FnZUpzb24uZGV2RW5naW5lcz8ucGFja2FnZU1hbmFnZXI/Lm5hbWUpIHtcbiAgICByZXR1cm4gcGFja2FnZUpzb24uZGV2RW5naW5lcy5wYWNrYWdlTWFuYWdlci5uYW1lID09PSAnbnBtJ1xuICB9XG5cbiAgaWYgKHBhY2thZ2VKc29uLnBucG0pIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8vIE9wdGltaXNhdGlvbjogQ2hlY2sgaWYgbnBtIGlzIGV4cGxpY2l0IGJlZm9yZSByZWFkaW5nIEZTLlxuICBpZiAocGFja2FnZUpzb24uZW5naW5lcz8ubnBtKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGlmIChoYXNZYXJuT3JQbnBtRmlsZXMoKSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgcmV0dXJuIHRydWVcbn1cblxuLyoqXG4gKiBTb3J0IGRlcGVuZGVuY2llcyBhbHBoYWJldGljYWxseSwgZGV0ZWN0aW5nIHBhY2thZ2UgbWFuYWdlciB0byB1c2UgdGhlXG4gKiBhcHByb3ByaWF0ZSBjb21wYXJpc29uLiBucG0gdXNlcyBsb2NhbGUtYXdhcmUgY29tcGFyaXNvbiwgeWFybiBhbmQgcG5wbSB1c2VcbiAqIHNpbXBsZSBzdHJpbmcgY29tcGFyaXNvblxuICovXG5jb25zdCBzb3J0RGVwZW5kZW5jaWVzID0gb25PYmplY3QoKGRlcGVuZGVuY2llcywgcGFja2FnZUpzb24pID0+IHtcbiAgLy8gQXZvaWQgZmlsZSBhY2Nlc3NcbiAgaWYgKE9iamVjdC5rZXlzKGRlcGVuZGVuY2llcykubGVuZ3RoIDwgMikge1xuICAgIHJldHVybiBkZXBlbmRlbmNpZXNcbiAgfVxuXG4gIC8vIHNvcnQgZGVwcyBsaWtlIHRoZSBucG0gQ0xJIGRvZXMgKHZpYSB0aGUgcGFja2FnZSBAbnBtY2xpL3BhY2thZ2UtanNvbilcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL25wbS9wYWNrYWdlLWpzb24vYmxvYi9iNjQ2NWY0NGM3MjdkNjUxM2RiNjg5OGM3Y2JlNDFkZDM1NWNlYmU4L2xpYi91cGRhdGUtZGVwZW5kZW5jaWVzLmpzI0w4LUwyMVxuICBpZiAoc2hvdWxkU29ydERlcGVuZGVuY2llc0xpa2VOcG0ocGFja2FnZUpzb24pKSB7XG4gICAgcmV0dXJuIHNvcnRPYmplY3RLZXlzKGRlcGVuZGVuY2llcywgKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiLCAnZW4nKSlcbiAgfVxuXG4gIHJldHVybiBzb3J0T2JqZWN0S2V5cyhkZXBlbmRlbmNpZXMpXG59KVxuXG4vKipcbiAqIFwid29ya3NwYWNlc1wiIGNhbiBiZSBhbiBhcnJheSAobnBtIG9yIHlhcm4gY2xhc3NpYykgb3IgYW4gb2JqZWN0IChwbnBtL2J1bikuXG4gKiBJbiB0aGUgY2FzZSBvZiBhbiBhcnJheSwgd2UgZG8gbm90IHdhbnQgdG8gYWxwaGFiZXRpY2FsbHkgc29ydCBpdCBpbiBjYXNlXG4gKiBzY3JpcHRzIG5lZWQgdG8gcnVuIGluIGEgc3BlY2lmaWMgb3JkZXIuXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MubnBtanMuY29tL2NsaS92Ny91c2luZy1ucG0vd29ya3NwYWNlcz92PXRydWUjcnVubmluZy1jb21tYW5kcy1pbi10aGUtY29udGV4dC1vZi13b3Jrc3BhY2VzXG4gKi9cbmNvbnN0IHNvcnRXb3Jrc3BhY2VzID0gcGlwZShbXG4gIHNvcnRPYmplY3RCeShbJ3BhY2thZ2VzJywgJ2NhdGFsb2cnXSksXG4gIG92ZXJQcm9wZXJ0eSgncGFja2FnZXMnLCB1bmlxQW5kU29ydEFycmF5KSxcbiAgb3ZlclByb3BlcnR5KCdjYXRhbG9nJywgc29ydERlcGVuZGVuY2llcyksXG5dKVxuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vZXNsaW50L2VzbGludC9ibG9iL2FjYzBlNDc1NzJhOTM5MDI5MmI0ZTMxM2I0YTRiZjM2MGQyMzYzNTgvY29uZi9jb25maWctc2NoZW1hLmpzXG5jb25zdCBlc2xpbnRCYXNlQ29uZmlnUHJvcGVydGllcyA9IFtcbiAgLy8gYGZpbGVzYCBhbmQgYGV4Y2x1ZGVkRmlsZXNgIGFyZSBvbmx5IG9uIGBvdmVycmlkZXNbXWBcbiAgLy8gZm9yIGVhc2llciBzb3J0IGBvdmVycmlkZXNbXWAsXG4gIC8vIGFkZCB0aGVtIHRvIGhlcmUsIHNvIHdlIGRvbid0IG5lZWQgc29ydCBgb3ZlcnJpZGVzW11gIHR3aWNlXG4gICdmaWxlcycsXG4gICdleGNsdWRlZEZpbGVzJyxcbiAgLy8gYmFzZUNvbmZpZ1xuICAnZW52JyxcbiAgJ3BhcnNlcicsXG4gICdwYXJzZXJPcHRpb25zJyxcbiAgJ3NldHRpbmdzJyxcbiAgJ3BsdWdpbnMnLFxuICAnZXh0ZW5kcycsXG4gICdydWxlcycsXG4gICdvdmVycmlkZXMnLFxuICAnZ2xvYmFscycsXG4gICdwcm9jZXNzb3InLFxuICAnbm9JbmxpbmVDb25maWcnLFxuICAncmVwb3J0VW51c2VkRGlzYWJsZURpcmVjdGl2ZXMnLFxuXVxuY29uc3Qgc29ydEVzbGludENvbmZpZyA9IHBpcGUoW1xuICBzb3J0T2JqZWN0QnkoZXNsaW50QmFzZUNvbmZpZ1Byb3BlcnRpZXMpLFxuICBvdmVyUHJvcGVydHkoJ2VudicsIHNvcnRPYmplY3QpLFxuICBvdmVyUHJvcGVydHkoJ2dsb2JhbHMnLCBzb3J0T2JqZWN0KSxcbiAgb3ZlclByb3BlcnR5KFxuICAgICdvdmVycmlkZXMnLFxuICAgIG9uQXJyYXkoKG92ZXJyaWRlcykgPT4gb3ZlcnJpZGVzLm1hcChzb3J0RXNsaW50Q29uZmlnKSksXG4gICksXG4gIG92ZXJQcm9wZXJ0eSgncGFyc2VyT3B0aW9ucycsIHNvcnRPYmplY3QpLFxuICBvdmVyUHJvcGVydHkoXG4gICAgJ3J1bGVzJyxcbiAgICBzb3J0T2JqZWN0QnkoXG4gICAgICAocnVsZTEsIHJ1bGUyKSA9PlxuICAgICAgICBydWxlMS5zcGxpdCgnLycpLmxlbmd0aCAtIHJ1bGUyLnNwbGl0KCcvJykubGVuZ3RoIHx8XG4gICAgICAgIHJ1bGUxLmxvY2FsZUNvbXBhcmUocnVsZTIpLFxuICAgICksXG4gICksXG4gIG92ZXJQcm9wZXJ0eSgnc2V0dGluZ3MnLCBzb3J0T2JqZWN0KSxcbl0pXG5jb25zdCBzb3J0VlNDb2RlQmFkZ2VPYmplY3QgPSBzb3J0T2JqZWN0QnkoWydkZXNjcmlwdGlvbicsICd1cmwnLCAnaHJlZiddKVxuXG5jb25zdCBzb3J0UHJldHRpZXJDb25maWcgPSBwaXBlKFtcbiAgLy8gc29ydCBrZXlzIGFscGhhYmV0aWNhbGx5LCBidXQgcHV0IGBvdmVycmlkZXNgIGF0IGJvdHRvbVxuICBvbk9iamVjdCgoY29uZmlnKSA9PlxuICAgIHNvcnRPYmplY3RLZXlzKGNvbmZpZywgW1xuICAgICAgLi4uT2JqZWN0LmtleXMoY29uZmlnKVxuICAgICAgICAuZmlsdGVyKChrZXkpID0+IGtleSAhPT0gJ292ZXJyaWRlcycpXG4gICAgICAgIC5zb3J0KCksXG4gICAgICAnb3ZlcnJpZGVzJyxcbiAgICBdKSxcbiAgKSxcbiAgLy8gaWYgYGNvbmZpZy5vdmVycmlkZXNgIGV4aXN0c1xuICBvdmVyUHJvcGVydHkoXG4gICAgJ292ZXJyaWRlcycsXG4gICAgLy8gYW5kIGBjb25maWcub3ZlcnJpZGVzYCBpcyBhbiBhcnJheVxuICAgIG9uQXJyYXkoKG92ZXJyaWRlcykgPT5cbiAgICAgIG92ZXJyaWRlcy5tYXAoXG4gICAgICAgIHBpcGUoW1xuICAgICAgICAgIC8vIHNvcnQgYGNvbmZpZy5vdmVycmlkZXNbXWAgYWxwaGFiZXRpY2FsbHlcbiAgICAgICAgICBzb3J0T2JqZWN0LFxuICAgICAgICAgIC8vIHNvcnQgYGNvbmZpZy5vdmVycmlkZXNbXS5vcHRpb25zYCBhbHBoYWJldGljYWxseVxuICAgICAgICAgIG92ZXJQcm9wZXJ0eSgnb3B0aW9ucycsIHNvcnRPYmplY3QpLFxuICAgICAgICBdKSxcbiAgICAgICksXG4gICAgKSxcbiAgKSxcbl0pXG5cbmNvbnN0IHNvcnRWb2x0YSA9IHNvcnRPYmplY3RCeShbJ25vZGUnLCAnbnBtJywgJ3lhcm4nXSlcbmNvbnN0IHNvcnREZXZFbmdpbmVzID0gb3ZlclByb3BlcnR5KFxuICAncGFja2FnZU1hbmFnZXInLFxuICBzb3J0T2JqZWN0QnkoWyduYW1lJywgJ3ZlcnNpb24nLCAnb25GYWlsJ10pLFxuKVxuXG5jb25zdCBwbnBtQmFzZUNvbmZpZ1Byb3BlcnRpZXMgPSBbXG4gICdwZWVyRGVwZW5kZW5jeVJ1bGVzJyxcbiAgJ25ldmVyQnVpbHREZXBlbmRlbmNpZXMnLFxuICAnb25seUJ1aWx0RGVwZW5kZW5jaWVzJyxcbiAgJ29ubHlCdWlsdERlcGVuZGVuY2llc0ZpbGUnLFxuICAnYWxsb3dlZERlcHJlY2F0ZWRWZXJzaW9ucycsXG4gICdhbGxvd05vbkFwcGxpZWRQYXRjaGVzJyxcbiAgJ3VwZGF0ZUNvbmZpZycsXG4gICdhdWRpdENvbmZpZycsXG4gICdyZXF1aXJlZFNjcmlwdHMnLFxuICAnc3VwcG9ydGVkQXJjaGl0ZWN0dXJlcycsXG4gICdvdmVycmlkZXMnLFxuICAncGF0Y2hlZERlcGVuZGVuY2llcycsXG4gICdwYWNrYWdlRXh0ZW5zaW9ucycsXG5dXG5cbmNvbnN0IHNvcnRQbnBtQ29uZmlnID0gcGlwZShbXG4gIHNvcnRPYmplY3RCeShwbnBtQmFzZUNvbmZpZ1Byb3BlcnRpZXMsIHRydWUpLFxuICBvdmVyUHJvcGVydHkoJ292ZXJyaWRlcycsIHNvcnRPYmplY3RCeVNlbXZlciksXG5dKVxuXG4vLyBTZWUgaHR0cHM6Ly9kb2NzLm5wbWpzLmNvbS9taXNjL3NjcmlwdHNcbmNvbnN0IGRlZmF1bHROcG1TY3JpcHRzID0gbmV3IFNldChbXG4gICdpbnN0YWxsJyxcbiAgJ3BhY2snLFxuICAncHJlcGFyZScsXG4gICdwdWJsaXNoJyxcbiAgJ3Jlc3RhcnQnLFxuICAnc2hyaW5rd3JhcCcsXG4gICdzdGFydCcsXG4gICdzdG9wJyxcbiAgJ3Rlc3QnLFxuICAndW5pbnN0YWxsJyxcbiAgJ3ZlcnNpb24nLFxuXSlcblxuY29uc3QgaGFzRGV2RGVwZW5kZW5jeSA9IChkZXBlbmRlbmN5LCBwYWNrYWdlSnNvbikgPT4ge1xuICByZXR1cm4gKFxuICAgIE9iamVjdC5oYXNPd24ocGFja2FnZUpzb24sICdkZXZEZXBlbmRlbmNpZXMnKSAmJlxuICAgIE9iamVjdC5oYXNPd24ocGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzLCBkZXBlbmRlbmN5KVxuICApXG59XG5cbmNvbnN0IHJ1blNSZWdFeHAgPVxuICAvKD88PV58W1xccyY7PD58KF0pKD86cnVuLXN8bnBtLXJ1bi1hbGwyPyAuKig/Oi0tc2VxdWVudGlhbHwtLXNlcmlhbHwtcykpKD89JHxbXFxzJjs8PnwpXSkvXG5cbmNvbnN0IGlzU2VxdWVudGlhbFNjcmlwdCA9IChjb21tYW5kKSA9PlxuICBjb21tYW5kLmluY2x1ZGVzKCcqJykgJiYgcnVuU1JlZ0V4cC50ZXN0KGNvbW1hbmQpXG5cbmNvbnN0IGhhc1NlcXVlbnRpYWxTY3JpcHQgPSAocGFja2FnZUpzb24pID0+IHtcbiAgaWYgKFxuICAgICFoYXNEZXZEZXBlbmRlbmN5KCducG0tcnVuLWFsbCcsIHBhY2thZ2VKc29uKSAmJlxuICAgICFoYXNEZXZEZXBlbmRlbmN5KCducG0tcnVuLWFsbDInLCBwYWNrYWdlSnNvbilcbiAgKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgY29uc3Qgc2NyaXB0cyA9IFsnc2NyaXB0cycsICdiZXR0ZXJTY3JpcHRzJ10uZmxhdE1hcCgoZmllbGQpID0+XG4gICAgcGFja2FnZUpzb25bZmllbGRdID8gT2JqZWN0LnZhbHVlcyhwYWNrYWdlSnNvbltmaWVsZF0pIDogW10sXG4gIClcbiAgcmV0dXJuIHNjcmlwdHMuc29tZSgoc2NyaXB0KSA9PiBpc1NlcXVlbnRpYWxTY3JpcHQoc2NyaXB0KSlcbn1cblxuZnVuY3Rpb24gc29ydFNjcmlwdE5hbWVzKGtleXMsIHByZWZpeCA9ICcnKSB7XG4gIGNvbnN0IGdyb3VwTWFwID0gbmV3IE1hcCgpXG4gIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICBjb25zdCByZXN0ID0gcHJlZml4ID8ga2V5LnNsaWNlKHByZWZpeC5sZW5ndGggKyAxKSA6IGtleVxuICAgIGNvbnN0IGlkeCA9IHJlc3QuaW5kZXhPZignOicpXG4gICAgaWYgKGlkeCA+IDApIHtcbiAgICAgIGNvbnN0IGJhc2UgPSBrZXkuc2xpY2UoMCwgKHByZWZpeCA/IHByZWZpeC5sZW5ndGggKyAxIDogMCkgKyBpZHgpXG4gICAgICBpZiAoIWdyb3VwTWFwLmhhcyhiYXNlKSkgZ3JvdXBNYXAuc2V0KGJhc2UsIFtdKVxuICAgICAgZ3JvdXBNYXAuZ2V0KGJhc2UpLnB1c2goa2V5KVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIWdyb3VwTWFwLmhhcyhrZXkpKSBncm91cE1hcC5zZXQoa2V5LCBbXSlcbiAgICAgIGdyb3VwTWFwLmdldChrZXkpLnB1c2goa2V5KVxuICAgIH1cbiAgfVxuICByZXR1cm4gQXJyYXkuZnJvbShncm91cE1hcC5rZXlzKCkpXG4gICAgLnNvcnQoKVxuICAgIC5mbGF0TWFwKChncm91cEtleSkgPT4ge1xuICAgICAgY29uc3QgY2hpbGRyZW4gPSBncm91cE1hcC5nZXQoZ3JvdXBLZXkpXG4gICAgICBpZiAoXG4gICAgICAgIGNoaWxkcmVuLmxlbmd0aCA+IDEgJiZcbiAgICAgICAgY2hpbGRyZW4uc29tZSgoaykgPT4gayAhPT0gZ3JvdXBLZXkgJiYgay5zdGFydHNXaXRoKGdyb3VwS2V5ICsgJzonKSlcbiAgICAgICkge1xuICAgICAgICBjb25zdCBkaXJlY3QgPSBjaGlsZHJlblxuICAgICAgICAgIC5maWx0ZXIoKGspID0+IGsgPT09IGdyb3VwS2V5IHx8ICFrLnN0YXJ0c1dpdGgoZ3JvdXBLZXkgKyAnOicpKVxuICAgICAgICAgIC5zb3J0KClcbiAgICAgICAgY29uc3QgbmVzdGVkID0gY2hpbGRyZW4uZmlsdGVyKChrKSA9PiBrLnN0YXJ0c1dpdGgoZ3JvdXBLZXkgKyAnOicpKVxuICAgICAgICByZXR1cm4gWy4uLmRpcmVjdCwgLi4uc29ydFNjcmlwdE5hbWVzKG5lc3RlZCwgZ3JvdXBLZXkpXVxuICAgICAgfVxuICAgICAgcmV0dXJuIGNoaWxkcmVuLnNvcnQoKVxuICAgIH0pXG59XG5cbmNvbnN0IHNvcnRTY3JpcHRzID0gb25PYmplY3QoKHNjcmlwdHMsIHBhY2thZ2VKc29uKSA9PiB7XG4gIGxldCBuYW1lcyA9IE9iamVjdC5rZXlzKHNjcmlwdHMpXG4gIGNvbnN0IHByZWZpeGFibGUgPSBuZXcgU2V0KClcblxuICBuYW1lcyA9IG5hbWVzLm1hcCgobmFtZSkgPT4ge1xuICAgIGNvbnN0IG9taXR0ZWQgPSBuYW1lLnJlcGxhY2UoL14oPzpwcmV8cG9zdCkvLCAnJylcbiAgICBpZiAoZGVmYXVsdE5wbVNjcmlwdHMuaGFzKG9taXR0ZWQpIHx8IG5hbWVzLmluY2x1ZGVzKG9taXR0ZWQpKSB7XG4gICAgICBwcmVmaXhhYmxlLmFkZChvbWl0dGVkKVxuICAgICAgcmV0dXJuIG9taXR0ZWRcbiAgICB9XG4gICAgcmV0dXJuIG5hbWVcbiAgfSlcblxuICBpZiAoIWhhc1NlcXVlbnRpYWxTY3JpcHQocGFja2FnZUpzb24pKSB7XG4gICAgbmFtZXMgPSBzb3J0U2NyaXB0TmFtZXMobmFtZXMpXG4gIH1cbiAgbmFtZXMgPSBuYW1lcy5mbGF0TWFwKChrZXkpID0+XG4gICAgcHJlZml4YWJsZS5oYXMoa2V5KSA/IFtgcHJlJHtrZXl9YCwga2V5LCBgcG9zdCR7a2V5fWBdIDogW2tleV0sXG4gIClcbiAgcmV0dXJuIHNvcnRPYmplY3RLZXlzKHNjcmlwdHMsIG5hbWVzKVxufSlcblxuLypcbi0gTW92ZSBgZGVmYXVsdGAgY29uZGl0aW9uIHRvIGJvdHRvbVxuKi9cbmNvbnN0IHNvcnRDb25kaXRpb25zID0gKGNvbmRpdGlvbnMpID0+IHtcbiAgY29uc3QgeyBkZWZhdWx0Q29uZGl0aW9ucyA9IFtdLCByZXN0Q29uZGl0aW9ucyA9IFtdIH0gPSBvYmplY3RHcm91cEJ5KFxuICAgIGNvbmRpdGlvbnMsXG4gICAgKGNvbmRpdGlvbikgPT4ge1xuICAgICAgaWYgKGNvbmRpdGlvbiA9PT0gJ2RlZmF1bHQnKSB7XG4gICAgICAgIHJldHVybiAnZGVmYXVsdENvbmRpdGlvbnMnXG4gICAgICB9XG5cbiAgICAgIHJldHVybiAncmVzdENvbmRpdGlvbnMnXG4gICAgfSxcbiAgKVxuXG4gIHJldHVybiBbLi4ucmVzdENvbmRpdGlvbnMsIC4uLmRlZmF1bHRDb25kaXRpb25zXVxufVxuXG5jb25zdCBzb3J0RXhwb3J0cyA9IG9uT2JqZWN0KChleHBvcnRzKSA9PiB7XG4gIGNvbnN0IHsgcGF0aHMgPSBbXSwgY29uZGl0aW9ucyA9IFtdIH0gPSBvYmplY3RHcm91cEJ5KFxuICAgIE9iamVjdC5rZXlzKGV4cG9ydHMpLFxuICAgIChrZXkpID0+IChrZXkuc3RhcnRzV2l0aCgnLicpID8gJ3BhdGhzJyA6ICdjb25kaXRpb25zJyksXG4gIClcblxuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIFsuLi5wYXRocywgLi4uc29ydENvbmRpdGlvbnMoY29uZGl0aW9ucyldLm1hcCgoa2V5KSA9PiBbXG4gICAgICBrZXksXG4gICAgICBzb3J0RXhwb3J0cyhleHBvcnRzW2tleV0pLFxuICAgIF0pLFxuICApXG59KVxuXG4vLyBmaWVsZHMgbWFya2VkIGB2c2NvZGVgIGFyZSBmb3IgYFZpc3VhbCBTdHVkaW8gQ29kZSBleHRlbnNpb24gbWFuaWZlc3RgIG9ubHlcbi8vIGh0dHBzOi8vY29kZS52aXN1YWxzdHVkaW8uY29tL2FwaS9yZWZlcmVuY2VzL2V4dGVuc2lvbi1tYW5pZmVzdFxuLy8gU3VwcG9ydGVkIGZpZWxkczpcbi8vIHB1Ymxpc2hlciwgZGlzcGxheU5hbWUsIGNhdGVnb3JpZXMsIGdhbGxlcnlCYW5uZXIsIHByZXZpZXcsIGNvbnRyaWJ1dGVzLFxuLy8gYWN0aXZhdGlvbkV2ZW50cywgYmFkZ2VzLCBtYXJrZG93biwgcW5hLCBleHRlbnNpb25QYWNrLFxuLy8gZXh0ZW5zaW9uRGVwZW5kZW5jaWVzLCBpY29uXG5cbi8vIGZpZWxkLmtleXtzdHJpbmd9OiBmaWVsZCBuYW1lXG4vLyBmaWVsZC5vdmVye2Z1bmN0aW9ufTogc29ydCBmaWVsZCBzdWJLZXlcbmNvbnN0IGZpZWxkcyA9IFtcbiAgeyBrZXk6ICckc2NoZW1hJyB9LFxuICB7IGtleTogJ25hbWUnIH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2Rpc3BsYXlOYW1lJyB9LFxuICB7IGtleTogJ3ZlcnNpb24nIH0sXG4gIC8qIHlhcm4gKi8geyBrZXk6ICdzdGFibGVWZXJzaW9uJyB9LFxuICB7IGtleTogJ3ByaXZhdGUnIH0sXG4gIHsga2V5OiAnZGVzY3JpcHRpb24nIH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2NhdGVnb3JpZXMnLCBvdmVyOiB1bmlxIH0sXG4gIHsga2V5OiAna2V5d29yZHMnLCBvdmVyOiB1bmlxIH0sXG4gIHsga2V5OiAnaG9tZXBhZ2UnIH0sXG4gIHsga2V5OiAnYnVncycsIG92ZXI6IHNvcnRPYmplY3RCeShbJ3VybCcsICdlbWFpbCddKSB9LFxuICB7IGtleTogJ3JlcG9zaXRvcnknLCBvdmVyOiBzb3J0VVJMT2JqZWN0IH0sXG4gIHsga2V5OiAnZnVuZGluZycsIG92ZXI6IHNvcnRVUkxPYmplY3QgfSxcbiAgeyBrZXk6ICdsaWNlbnNlJywgb3Zlcjogc29ydFVSTE9iamVjdCB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdxbmEnIH0sXG4gIHsga2V5OiAnYXV0aG9yJywgb3Zlcjogc29ydFBlb3BsZU9iamVjdCB9LFxuICB7XG4gICAga2V5OiAnbWFpbnRhaW5lcnMnLFxuICAgIG92ZXI6IG9uQXJyYXkoKG1haW50YWluZXJzKSA9PiBtYWludGFpbmVycy5tYXAoc29ydFBlb3BsZU9iamVjdCkpLFxuICB9LFxuICB7XG4gICAga2V5OiAnY29udHJpYnV0b3JzJyxcbiAgICBvdmVyOiBvbkFycmF5KChjb250cmlidXRvcnMpID0+IGNvbnRyaWJ1dG9ycy5tYXAoc29ydFBlb3BsZU9iamVjdCkpLFxuICB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdwdWJsaXNoZXInIH0sXG4gIHsga2V5OiAnc2lkZUVmZmVjdHMnIH0sXG4gIHsga2V5OiAndHlwZScgfSxcbiAgeyBrZXk6ICdpbXBvcnRzJyB9LFxuICB7IGtleTogJ2V4cG9ydHMnLCBvdmVyOiBzb3J0RXhwb3J0cyB9LFxuICB7IGtleTogJ21haW4nIH0sXG4gIHsga2V5OiAnc3ZlbHRlJyB9LFxuICB7IGtleTogJ3VtZDptYWluJyB9LFxuICB7IGtleTogJ2pzZGVsaXZyJyB9LFxuICB7IGtleTogJ3VucGtnJyB9LFxuICB7IGtleTogJ21vZHVsZScgfSxcbiAgeyBrZXk6ICdzb3VyY2UnIH0sXG4gIHsga2V5OiAnanNuZXh0Om1haW4nIH0sXG4gIHsga2V5OiAnYnJvd3NlcicgfSxcbiAgeyBrZXk6ICdyZWFjdC1uYXRpdmUnIH0sXG4gIHsga2V5OiAndHlwZXMnIH0sXG4gIHsga2V5OiAndHlwZXNWZXJzaW9ucycgfSxcbiAgeyBrZXk6ICd0eXBpbmdzJyB9LFxuICB7IGtleTogJ3N0eWxlJyB9LFxuICB7IGtleTogJ2V4YW1wbGUnIH0sXG4gIHsga2V5OiAnZXhhbXBsZXN0eWxlJyB9LFxuICB7IGtleTogJ2Fzc2V0cycgfSxcbiAgeyBrZXk6ICdiaW4nLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnbWFuJyB9LFxuICB7IGtleTogJ2RpcmVjdG9yaWVzJywgb3Zlcjogc29ydERpcmVjdG9yaWVzIH0sXG4gIHsga2V5OiAnZmlsZXMnLCBvdmVyOiB1bmlxIH0sXG4gIHsga2V5OiAnd29ya3NwYWNlcycsIG92ZXI6IHNvcnRXb3Jrc3BhY2VzIH0sXG4gIC8vIG5vZGUtcHJlLWd5cCBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9ub2RlLXByZS1neXAjMS1hZGQtbmV3LWVudHJpZXMtdG8teW91ci1wYWNrYWdlanNvblxuICB7XG4gICAga2V5OiAnYmluYXJ5JyxcbiAgICBvdmVyOiBzb3J0T2JqZWN0QnkoW1xuICAgICAgJ21vZHVsZV9uYW1lJyxcbiAgICAgICdtb2R1bGVfcGF0aCcsXG4gICAgICAncmVtb3RlX3BhdGgnLFxuICAgICAgJ3BhY2thZ2VfbmFtZScsXG4gICAgICAnaG9zdCcsXG4gICAgXSksXG4gIH0sXG4gIHsga2V5OiAnc2NyaXB0cycsIG92ZXI6IHNvcnRTY3JpcHRzIH0sXG4gIHsga2V5OiAnYmV0dGVyU2NyaXB0cycsIG92ZXI6IHNvcnRTY3JpcHRzIH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2wxMG4nIH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2NvbnRyaWJ1dGVzJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdhY3RpdmF0aW9uRXZlbnRzJywgb3ZlcjogdW5pcSB9LFxuICB7IGtleTogJ2h1c2t5Jywgb3Zlcjogb3ZlclByb3BlcnR5KCdob29rcycsIHNvcnRHaXRIb29rcykgfSxcbiAgeyBrZXk6ICdzaW1wbGUtZ2l0LWhvb2tzJywgb3Zlcjogc29ydEdpdEhvb2tzIH0sXG4gIHsga2V5OiAncHJlLWNvbW1pdCcgfSxcbiAgeyBrZXk6ICdjb21taXRsaW50Jywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2xpbnQtc3RhZ2VkJyB9LFxuICB7IGtleTogJ25hbm8tc3RhZ2VkJyB9LFxuICB7IGtleTogJ2NvbmZpZycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdub2RlbW9uQ29uZmlnJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2Jyb3dzZXJpZnknLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnYmFiZWwnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnYnJvd3NlcnNsaXN0JyB9LFxuICB7IGtleTogJ3hvJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ3ByZXR0aWVyJywgb3Zlcjogc29ydFByZXR0aWVyQ29uZmlnIH0sXG4gIHsga2V5OiAnZXNsaW50Q29uZmlnJywgb3Zlcjogc29ydEVzbGludENvbmZpZyB9LFxuICB7IGtleTogJ2VzbGludElnbm9yZScgfSxcbiAgeyBrZXk6ICducG1wa2dqc29ubGludCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICducG1QYWNrYWdlSnNvbkxpbnRDb25maWcnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnbnBtcGFja2FnZWpzb25saW50Jywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ3JlbGVhc2UnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAncmVtYXJrQ29uZmlnJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ3N0eWxlbGludCcgfSxcbiAgeyBrZXk6ICdhdmEnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnamVzdCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdqZXN0LWp1bml0Jywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2plc3Qtc3RhcmUnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnbW9jaGEnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnbnljJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2M4Jywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ3RhcCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdvY2xpZicsIG92ZXI6IHNvcnRPYmplY3RCeSh1bmRlZmluZWQsIHRydWUpIH0sXG4gIHsga2V5OiAncmVzb2x1dGlvbnMnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnb3ZlcnJpZGVzJywgb3Zlcjogc29ydERlcGVuZGVuY2llcyB9LFxuICB7IGtleTogJ2RlcGVuZGVuY2llcycsIG92ZXI6IHNvcnREZXBlbmRlbmNpZXMgfSxcbiAgeyBrZXk6ICdkZXZEZXBlbmRlbmNpZXMnLCBvdmVyOiBzb3J0RGVwZW5kZW5jaWVzIH0sXG4gIHsga2V5OiAnZGVwZW5kZW5jaWVzTWV0YScsIG92ZXI6IHNvcnRPYmplY3RCeShzb3J0T2JqZWN0QnlJZGVudCwgdHJ1ZSkgfSxcbiAgeyBrZXk6ICdwZWVyRGVwZW5kZW5jaWVzJywgb3Zlcjogc29ydERlcGVuZGVuY2llcyB9LFxuICAvLyBUT0RPOiBvbmx5IHNvcnQgZGVwdGggPSAyXG4gIHsga2V5OiAncGVlckRlcGVuZGVuY2llc01ldGEnLCBvdmVyOiBzb3J0T2JqZWN0QnkodW5kZWZpbmVkLCB0cnVlKSB9LFxuICB7IGtleTogJ29wdGlvbmFsRGVwZW5kZW5jaWVzJywgb3Zlcjogc29ydERlcGVuZGVuY2llcyB9LFxuICB7IGtleTogJ2J1bmRsZWREZXBlbmRlbmNpZXMnLCBvdmVyOiB1bmlxQW5kU29ydEFycmF5IH0sXG4gIHsga2V5OiAnYnVuZGxlRGVwZW5kZW5jaWVzJywgb3ZlcjogdW5pcUFuZFNvcnRBcnJheSB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdleHRlbnNpb25QYWNrJywgb3ZlcjogdW5pcUFuZFNvcnRBcnJheSB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdleHRlbnNpb25EZXBlbmRlbmNpZXMnLCBvdmVyOiB1bmlxQW5kU29ydEFycmF5IH0sXG4gIHsga2V5OiAnZmxhdCcgfSxcbiAgeyBrZXk6ICdwYWNrYWdlTWFuYWdlcicgfSxcbiAgeyBrZXk6ICdlbmdpbmVzJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2VuZ2luZVN0cmljdCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdkZXZFbmdpbmVzJywgb3Zlcjogc29ydERldkVuZ2luZXMgfSxcbiAgeyBrZXk6ICd2b2x0YScsIG92ZXI6IHNvcnRWb2x0YSB9LFxuICB7IGtleTogJ2xhbmd1YWdlTmFtZScgfSxcbiAgeyBrZXk6ICdvcycgfSxcbiAgeyBrZXk6ICdjcHUnIH0sXG4gIHsga2V5OiAncHJlZmVyR2xvYmFsJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ3B1Ymxpc2hDb25maWcnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2ljb24nIH0sXG4gIC8qIHZzY29kZSAqLyB7XG4gICAga2V5OiAnYmFkZ2VzJyxcbiAgICBvdmVyOiBvbkFycmF5KChiYWRnZSkgPT4gYmFkZ2UubWFwKHNvcnRWU0NvZGVCYWRnZU9iamVjdCkpLFxuICB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdnYWxsZXJ5QmFubmVyJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdwcmV2aWV3JyB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdtYXJrZG93bicgfSxcbiAgeyBrZXk6ICdwbnBtJywgb3Zlcjogc29ydFBucG1Db25maWcgfSxcbl1cblxuY29uc3QgZGVmYXVsdFNvcnRPcmRlciA9IGZpZWxkcy5tYXAoKHsga2V5IH0pID0+IGtleSlcbmNvbnN0IG92ZXJGaWVsZHMgPSBwaXBlKFxuICBmaWVsZHNcbiAgICAubWFwKCh7IGtleSwgb3ZlciB9KSA9PiAob3ZlciA/IG92ZXJQcm9wZXJ0eShrZXksIG92ZXIpIDogdW5kZWZpbmVkKSlcbiAgICAuZmlsdGVyKEJvb2xlYW4pLFxuKVxuXG5mdW5jdGlvbiBlZGl0U3RyaW5nSlNPTihqc29uLCBvdmVyKSB7XG4gIGlmICh0eXBlb2YganNvbiA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zdCB7IGluZGVudCwgdHlwZSB9ID0gZGV0ZWN0SW5kZW50KGpzb24pXG4gICAgY29uc3QgZW5kQ2hhcmFjdGVycyA9IGpzb24uc2xpY2UoLTEpID09PSAnXFxuJyA/ICdcXG4nIDogJydcbiAgICBjb25zdCBuZXdsaW5lID0gZGV0ZWN0TmV3bGluZShqc29uKVxuICAgIGpzb24gPSBKU09OLnBhcnNlKGpzb24pXG5cbiAgICBsZXQgcmVzdWx0ID1cbiAgICAgIEpTT04uc3RyaW5naWZ5KG92ZXIoanNvbiksIG51bGwsIHR5cGUgPT09ICd0YWInID8gJ1xcdCcgOiBpbmRlbnQpICtcbiAgICAgIGVuZENoYXJhY3RlcnNcbiAgICBpZiAobmV3bGluZSA9PT0gJ1xcclxcbicpIHtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC9cXG4vZywgbmV3bGluZSlcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgcmV0dXJuIG92ZXIoanNvbilcbn1cblxuZnVuY3Rpb24gc29ydFBhY2thZ2VKc29uKGpzb25Jc2gsIG9wdGlvbnMgPSB7fSkge1xuICByZXR1cm4gZWRpdFN0cmluZ0pTT04oXG4gICAganNvbklzaCxcbiAgICBvbk9iamVjdCgoanNvbikgPT4ge1xuICAgICAgbGV0IHNvcnRPcmRlciA9IG9wdGlvbnMuc29ydE9yZGVyIHx8IGRlZmF1bHRTb3J0T3JkZXJcblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc29ydE9yZGVyKSkge1xuICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoanNvbilcbiAgICAgICAgY29uc3QgeyBwcml2YXRlS2V5cyA9IFtdLCBwdWJsaWNLZXlzID0gW10gfSA9IG9iamVjdEdyb3VwQnkoXG4gICAgICAgICAga2V5cyxcbiAgICAgICAgICAoa2V5KSA9PiAoa2V5WzBdID09PSAnXycgPyAncHJpdmF0ZUtleXMnIDogJ3B1YmxpY0tleXMnKSxcbiAgICAgICAgKVxuICAgICAgICBzb3J0T3JkZXIgPSBbXG4gICAgICAgICAgLi4uc29ydE9yZGVyLFxuICAgICAgICAgIC4uLmRlZmF1bHRTb3J0T3JkZXIsXG4gICAgICAgICAgLi4ucHVibGljS2V5cy5zb3J0KCksXG4gICAgICAgICAgLi4ucHJpdmF0ZUtleXMuc29ydCgpLFxuICAgICAgICBdXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvdmVyRmllbGRzKHNvcnRPYmplY3RLZXlzKGpzb24sIHNvcnRPcmRlciksIGpzb24pXG4gICAgfSksXG4gIClcbn1cblxuZXhwb3J0IGRlZmF1bHQgc29ydFBhY2thZ2VKc29uXG5leHBvcnQgeyBzb3J0UGFja2FnZUpzb24sIGRlZmF1bHRTb3J0T3JkZXIgYXMgc29ydE9yZGVyIH1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWUpIHtcblx0aWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgdmFsdWUgPT09IG51bGwpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRjb25zdCBwcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpO1xuXHRyZXR1cm4gKHByb3RvdHlwZSA9PT0gbnVsbCB8fCBwcm90b3R5cGUgPT09IE9iamVjdC5wcm90b3R5cGUgfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvdHlwZSkgPT09IG51bGwpICYmICEoU3ltYm9sLnRvU3RyaW5nVGFnIGluIHZhbHVlKSAmJiAhKFN5bWJvbC5pdGVyYXRvciBpbiB2YWx1ZSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBzb3J0UGFja2FnZUpzb24gfSBmcm9tICdzb3J0LXBhY2thZ2UtanNvbic7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4VGVzdERpcmVjdG9yaWVzVXBkYXRpbmdQYWNrYWdlSnNvbihwYWNrYWdlRGlyUGF0aHM6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4VGVzdERpcmVjdG9yaWVzVXBkYXRpbmdQYWNrYWdlSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHBhY2thZ2VEaXJQYXRocy5tYXAoYXN5bmMgKHBhY2thZ2VEaXJQYXRoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKSkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IG5ld1Rlc3REaXJQYXRoID0gcGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAndGVzdCcpO1xuICAgICAgICBmb3IgKGNvbnN0IG9sZFRlc3REaXJOYW1lIG9mIFsnX190ZXN0c19fJywgJ3Rlc3RzJ10pIHtcbiAgICAgICAgICBjb25zdCBvbGRUZXN0RGlyUGF0aCA9IHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgb2xkVGVzdERpck5hbWUpO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBtb3ZlVGVzdERpcmVjdG9yeShvbGRUZXN0RGlyUGF0aCwgbmV3VGVzdERpclBhdGgpO1xuICAgICAgICAgICAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKSkgYXMge1xuICAgICAgICAgICAgICBzY3JpcHRzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBsZXQgZGlkVXBkYXRlU2NyaXB0ID0gZmFsc2U7XG4gICAgICAgICAgICBjb25zdCBzY3JpcHRzID0gcGFja2FnZUpzb24uc2NyaXB0cyA/PyB7fTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW3NjcmlwdE5hbWUsIHNjcmlwdF0gb2YgT2JqZWN0LmVudHJpZXMoc2NyaXB0cykpIHtcbiAgICAgICAgICAgICAgY29uc3QgbmV3U2NyaXB0ID0gc2NyaXB0LnJlcGxhY2VBbGwob2xkVGVzdERpck5hbWUsICd0ZXN0Jyk7XG4gICAgICAgICAgICAgIGlmIChzY3JpcHQgIT09IG5ld1NjcmlwdCkge1xuICAgICAgICAgICAgICAgIHNjcmlwdHNbc2NyaXB0TmFtZV0gPSBuZXdTY3JpcHQ7XG4gICAgICAgICAgICAgICAgZGlkVXBkYXRlU2NyaXB0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGFja2FnZUpzb24uc2NyaXB0cyA9IHNjcmlwdHM7XG4gICAgICAgICAgICBpZiAoIWRpZFVwZGF0ZVNjcmlwdCkgcmV0dXJuO1xuXG4gICAgICAgICAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKHBhY2thZ2VKc29uUGF0aCwgSlNPTi5zdHJpbmdpZnkoc29ydFBhY2thZ2VKc29uKHBhY2thZ2VKc29uKSwgdW5kZWZpbmVkLCAyKSk7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBtb3ZlVGVzdERpcmVjdG9yeShvbGRUZXN0RGlyUGF0aDogc3RyaW5nLCBuZXdUZXN0RGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghZnMuZXhpc3RzU3luYyhuZXdUZXN0RGlyUGF0aCkpIHtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5yZW5hbWUob2xkVGVzdERpclBhdGgsIG5ld1Rlc3REaXJQYXRoKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBkaXJlbnRzID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcihvbGRUZXN0RGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICBkaXJlbnRzLm1hcChhc3luYyAoZGlyZW50KSA9PiB7XG4gICAgICBjb25zdCBvbGRQYXRoID0gcGF0aC5qb2luKG9sZFRlc3REaXJQYXRoLCBkaXJlbnQubmFtZSk7XG4gICAgICBjb25zdCBuZXdQYXRoID0gcGF0aC5qb2luKG5ld1Rlc3REaXJQYXRoLCBkaXJlbnQubmFtZSk7XG4gICAgICBjb25zdCBuZXdQYXRoU3RhdCA9IGZzLmV4aXN0c1N5bmMobmV3UGF0aCkgPyBhd2FpdCBmcy5wcm9taXNlcy5zdGF0KG5ld1BhdGgpIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKGRpcmVudC5pc0RpcmVjdG9yeSgpICYmIG5ld1BhdGhTdGF0Py5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgIGF3YWl0IG1vdmVUZXN0RGlyZWN0b3J5KG9sZFBhdGgsIG5ld1BhdGgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy5yZW5hbWUob2xkUGF0aCwgbmV3UGF0aCk7XG4gICAgfSlcbiAgKTtcbiAgYXdhaXQgZnMucHJvbWlzZXMucm0ob2xkVGVzdERpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgaWdub3JlRW5vZW50QXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi9zcmMnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFR5cGVEZWZpbml0aW9ucyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBjb25maWdzSW5jbHVkaW5nQ2hpbGRyZW46IFBhY2thZ2VDb25maWdbXVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4VHlwZURlZmluaXRpb25zJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGxpYlR5cGVEaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnQHR5cGVzJyk7XG4gICAgY29uc3Qgc3JjVHlwZURpclBhdGggPVxuICAgICAgY29uZmlnLmlzUm9vdCAmJiBjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMgPyB1bmRlZmluZWQgOiBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdzcmMnLCAndHlwZXMnKTtcblxuICAgIGNvbnN0IGRpcmVudHMgPSBhd2FpdCBpZ25vcmVFbm9lbnRBc3luYygoKSA9PiBmcy5yZWFkZGlyKGxpYlR5cGVEaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpO1xuICAgIGlmICghZGlyZW50cykgcmV0dXJuO1xuXG4gICAgZm9yIChjb25zdCBkaXJlbnQgb2YgZGlyZW50cykge1xuICAgICAgY29uc3QgZGlyTmFtZSA9IGRpcmVudC5uYW1lLnNsaWNlKDAsIC01KTtcbiAgICAgIGNvbnN0IGhhc1R5cGVEZWNsYXJhdGlvbkV4dGVuc2lvbiA9IGRpcmVudC5uYW1lLmVuZHNXaXRoKCcuZC50cycpO1xuICAgICAgbGV0IHBhY2thZ2VOYW1lID0gaGFzVHlwZURlY2xhcmF0aW9uRXh0ZW5zaW9uID8gZGlyTmFtZSA6IGRpcmVudC5uYW1lO1xuICAgICAgaWYgKHBhY2thZ2VOYW1lLmluY2x1ZGVzKCdfXycpKSB7XG4gICAgICAgIHBhY2thZ2VOYW1lID0gYEAke3BhY2thZ2VOYW1lLnJlcGxhY2UoJ19fJywgJy8nKX1gO1xuICAgICAgfVxuICAgICAgY29uc3QgaGFzTGlicmFyeSA9IGNvbmZpZ3NJbmNsdWRpbmdDaGlsZHJlbi5zb21lKFxuICAgICAgICAoY29uZmlnKSA9PlxuICAgICAgICAgIGNvbmZpZy5wYWNrYWdlSnNvbj8uZGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdIHx8IGNvbmZpZy5wYWNrYWdlSnNvbj8uZGV2RGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdXG4gICAgICApO1xuXG4gICAgICBpZiAoZGlyZW50LmlzRmlsZSgpICYmIGhhc1R5cGVEZWNsYXJhdGlvbkV4dGVuc2lvbikge1xuICAgICAgICBpZiAoaGFzTGlicmFyeSkge1xuICAgICAgICAgIC8vIE1vdmUgQHR5cGVzLzxuYW1lPi9pbmRleC5kLnRzIGlmIGluc3RhbGxlZFxuICAgICAgICAgIGF3YWl0IGZzLm1rZGlyKHBhdGguam9pbihsaWJUeXBlRGlyUGF0aCwgZGlyTmFtZSksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgICAgICAgZnMucmVuYW1lKHBhdGguam9pbihsaWJUeXBlRGlyUGF0aCwgZGlyZW50Lm5hbWUpLCBwYXRoLmpvaW4obGliVHlwZURpclBhdGgsIGRpck5hbWUsICdpbmRleC5kLnRzJykpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmIChzcmNUeXBlRGlyUGF0aCkge1xuICAgICAgICAgIC8vIE1vdmUgc3JjL3R5cGVzLzxuYW1lPiBpZiBub3QgaW5zdGFsbGVkXG4gICAgICAgICAgYXdhaXQgZnMubWtkaXIoc3JjVHlwZURpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgICAgICAgZnMucmVuYW1lKHBhdGguam9pbihsaWJUeXBlRGlyUGF0aCwgZGlyZW50Lm5hbWUpLCBwYXRoLmpvaW4oc3JjVHlwZURpclBhdGgsIGRpcmVudC5uYW1lKSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGRpcmVudC5pc0RpcmVjdG9yeSgpICYmIHNyY1R5cGVEaXJQYXRoICYmICFoYXNMaWJyYXJ5KSB7XG4gICAgICAgIC8vIE1vdmUgc3JjL3R5cGVzLzxuYW1lPi5kLnRzIGlmIG5vdCBpbnN0YWxsZWRcbiAgICAgICAgYXdhaXQgZnMubWtkaXIoc3JjVHlwZURpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgICAgICBpZ25vcmVFbm9lbnRBc3luYygoKSA9PlxuICAgICAgICAgICAgZnMucmVuYW1lKFxuICAgICAgICAgICAgICBwYXRoLmpvaW4obGliVHlwZURpclBhdGgsIGRpcmVudC5uYW1lLCAnaW5kZXguZC50cycpLFxuICAgICAgICAgICAgICBwYXRoLmpvaW4oc3JjVHlwZURpclBhdGgsIGAke2RpcmVudC5uYW1lfS5kLnRzYClcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cbiIsImltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5leHBvcnQgZnVuY3Rpb24gb3ZlcndyaXRlTWVyZ2U8VD4oZGVzdGluYXRpb25BcnJheTogVFtdLCBzb3VyY2VBcnJheTogVFtdKTogVFtdIHtcbiAgcmV0dXJuIHNvdXJjZUFycmF5O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tYmluZU1lcmdlKHRhcmdldDogdW5rbm93bltdLCBzb3VyY2U6IHVua25vd25bXSwgb3B0aW9uczogbWVyZ2UuQXJyYXlNZXJnZU9wdGlvbnMpOiB1bmtub3duW10ge1xuICBjb25zdCBkZXN0aW5hdGlvbiA9IFsuLi50YXJnZXRdO1xuXG4gIGZvciAoY29uc3QgW2luZGV4LCBpdGVtXSBvZiBzb3VyY2UuZW50cmllcygpKSB7XG4gICAgaWYgKGRlc3RpbmF0aW9uW2luZGV4XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBkZXN0aW5hdGlvbltpbmRleF0gPSBjbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZChpdGVtLCBvcHRpb25zKTtcbiAgICB9IGVsc2UgaWYgKGlzTWVyZ2VhYmxlT2JqZWN0KHRhcmdldFtpbmRleF0sIG9wdGlvbnMpICYmIGlzTWVyZ2VhYmxlT2JqZWN0KGl0ZW0sIG9wdGlvbnMpKSB7XG4gICAgICBkZXN0aW5hdGlvbltpbmRleF0gPSBtZXJnZSh0YXJnZXRbaW5kZXhdLCBpdGVtLCBvcHRpb25zKTtcbiAgICB9IGVsc2UgaWYgKCF0YXJnZXQuaW5jbHVkZXMoaXRlbSkpIHtcbiAgICAgIGRlc3RpbmF0aW9uLnB1c2goaXRlbSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBkZXN0aW5hdGlvbjtcbn1cblxuZnVuY3Rpb24gY2xvbmVVbmxlc3NPdGhlcndpc2VTcGVjaWZpZWQodmFsdWU6IHVua25vd24sIG9wdGlvbnM6IG1lcmdlLkFycmF5TWVyZ2VPcHRpb25zKTogdW5rbm93biB7XG4gIHJldHVybiBpc01lcmdlYWJsZU9iamVjdCh2YWx1ZSwgb3B0aW9ucykgPyBvcHRpb25zLmNsb25lVW5sZXNzT3RoZXJ3aXNlU3BlY2lmaWVkKHZhbHVlLCBvcHRpb25zKSA6IHZhbHVlO1xufVxuXG5mdW5jdGlvbiBpc01lcmdlYWJsZU9iamVjdCh2YWx1ZTogdW5rbm93biwgb3B0aW9uczogbWVyZ2UuQXJyYXlNZXJnZU9wdGlvbnMpOiB2YWx1ZSBpcyBvYmplY3Qge1xuICByZXR1cm4gISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIG9wdGlvbnMuaXNNZXJnZWFibGVPYmplY3QodmFsdWUpO1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIG1vdmVUb0JvdHRvbTxUT2JqIGV4dGVuZHMgUmVjb3JkPFRLZXksIHVua25vd24+LCBUS2V5IGV4dGVuZHMgc3RyaW5nIHwgbnVtYmVyIHwgc3ltYm9sPihcbiAgb2JqOiBUT2JqLFxuICBrZXk6IFRLZXlcbik6IFRPYmoge1xuICBjb25zdCB2YWx1ZSA9IG9ialtrZXldO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gIGRlbGV0ZSBvYmpba2V5XTtcbiAgKG9iaiBhcyBSZWNvcmQ8VEtleSwgdW5rbm93bj4pW2tleV0gPSB2YWx1ZTtcbiAgcmV0dXJuIG9iajtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNvcnRLZXlzPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ob2JqOiBUKTogVCB7XG4gIGNvbnN0IGtleUFuZFZhbHVlcyA9IE9iamVjdC5lbnRyaWVzKG9iaikudG9Tb3J0ZWQoKFtrZXkxXSwgW2tleTJdKSA9PiBrZXkxLmxvY2FsZUNvbXBhcmUoa2V5MikpO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBrZXlBbmRWYWx1ZXMpIHtcbiAgICAvLyBwYWNrYWdlLmpzb24tc3R5bGUga2V5cyBhcmUgbm9uLWFycmF5LWluZGV4IGtleXMsIHNvIEpTT04uc3RyaW5naWZ5IHByZXNlcnZlcyB0aGlzIGluc2VydGlvbiBvcmRlci5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gICAgZGVsZXRlIG9ialtrZXldO1xuICAgIChvYmogYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0gPSB2YWx1ZTtcblxuICAgIC8vIGlmIHZhbHVlIGlzIGFuIG9iamVjdCwgc29ydCB0aGUga2V5cyBvZiB0aGUgb2JqZWN0XG4gICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICBzb3J0S2V5cyh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgfVxuICB9XG4gIHJldHVybiBvYmo7XG59XG4iLCIvLyBHaXRIdWIgQWN0aW9ucyB2YWx1ZWxlc3MgZXZlbnRzIHN1Y2ggYXMgYHB1bGxfcmVxdWVzdDpgIHJlcXVpcmUgWUFNTCBudWxsIHZhbHVlcy5cbi8vIG94bGludC1kaXNhYmxlIGVzbGludC1wbHVnaW4taW1wb3J0L25vLW5hbWVkLWFzLWRlZmF1bHQtbWVtYmVyIC0tIE5hbWVzcGFjZSBZQU1MIGNhbGxzIG1ha2UgbG9hZC9kdW1wIHVzYWdlIGNsZWFyZXIuXG4vKiBlc2xpbnQtZGlzYWJsZSB1bmljb3JuL25vLW51bGwgKi9cblxuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgeWFtbCBmcm9tICdqcy15YW1sJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgY29tYmluZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IG1vdmVUb0JvdHRvbSwgc29ydEtleXMgfSBmcm9tICcuLi91dGlscy9vYmplY3RVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5pbnRlcmZhY2UgV29ya2Zsb3cge1xuICBuYW1lPzogc3RyaW5nO1xuICBvbj86IE9uO1xuICBjb25jdXJyZW5jeT86IENvbmN1cnJlbmN5O1xuICBwZXJtaXNzaW9ucz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIGpvYnM6IFJlY29yZDxzdHJpbmcsIEpvYj47XG59XG5cbmludGVyZmFjZSBDb25jdXJyZW5jeSB7XG4gIGdyb3VwOiBzdHJpbmc7XG4gICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgT24ge1xuICAvLyBHaXRIdWIgQWN0aW9ucyB0cmVhdHMgYGV2ZW50OiBudWxsYCBhcyBhIHZhbHVlbGVzcyBldmVudCBtYXBwaW5nLCBlLmcuXG4gIC8vIGBwdWxsX3JlcXVlc3Q6YC4gYHVuZGVmaW5lZGAgd291bGQgb21pdCB0aGUgZXZlbnQgZW50aXJlbHkgd2hlbiBkdW1waW5nIFlBTUwuXG4gIGlzc3Vlcz86IFR5cGVzIHwgbnVsbDtcbiAgcHVsbF9yZXF1ZXN0PzogUHVsbFJlcXVlc3QgfCBudWxsO1xuICBwdWxsX3JlcXVlc3RfdGFyZ2V0PzogVHlwZXMgfCBudWxsO1xuICBwdXNoPzogUHVzaDtcbiAgc2NoZWR1bGU/OiBTY2hlZHVsZVtdO1xuICB3b3JrZmxvd19kaXNwYXRjaD86IG51bGw7XG59XG5cbmludGVyZmFjZSBQdWxsUmVxdWVzdCB7XG4gICdwYXRocy1pZ25vcmUnPzogc3RyaW5nW107XG4gIHR5cGVzPzogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBQdXNoIHtcbiAgYnJhbmNoZXM6IHN0cmluZ1tdO1xuICAncGF0aHMtaWdub3JlJz86IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgU2NoZWR1bGUge1xuICBjcm9uOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBUeXBlcyB7XG4gIHR5cGVzOiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIEpvYiB7XG4gICdydW5zLW9uJz86IHN0cmluZztcbiAgcGVybWlzc2lvbnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBzdGVwcz86IFN0ZXBbXTtcbiAgdXNlcz86IHN0cmluZztcbiAgaWY/OiBzdHJpbmc7XG4gIHNlY3JldHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgd2l0aD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG5pbnRlcmZhY2UgU3RlcCB7XG4gIHVzZXM/OiBzdHJpbmc7XG4gIHdpdGg/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcnVuPzogc3RyaW5nO1xufVxuXG5jb25zdCBwdWJsaWNSZXBvQXV0b2ZpeFdvcmtmbG93OiBXb3JrZmxvdyA9IHtcbiAgbmFtZTogJ2F1dG9maXguY2knLFxuICBvbjoge1xuICAgIHB1bGxfcmVxdWVzdDogbnVsbCxcbiAgICBwdXNoOiB7XG4gICAgICBicmFuY2hlczogWydtYWluJ10sXG4gICAgfSxcbiAgfSxcbiAgcGVybWlzc2lvbnM6IHtcbiAgICBjb250ZW50czogJ3JlYWQnLFxuICB9LFxuICBjb25jdXJyZW5jeToge1xuICAgIGdyb3VwOiAnYXV0b2ZpeC0ke3sgZ2l0aHViLmhlYWRfcmVmIH19JyxcbiAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogdHJ1ZSxcbiAgfSxcbiAgam9iczoge1xuICAgIGF1dG9maXg6IHsgJ3J1bnMtb24nOiAndWJ1bnR1LWxhdGVzdCcgfSxcbiAgfSxcbn07XG5cbmNvbnN0IHByaXZhdGVSZXBvQXV0b2ZpeFdvcmtmbG93OiBXb3JrZmxvdyA9IHtcbiAgbmFtZTogJ0ZpeCBjb2RlIGF1dG9tYXRpY2FsbHknLFxuICBvbjoge1xuICAgIHB1bGxfcmVxdWVzdDogbnVsbCxcbiAgfSxcbiAgY29uY3VycmVuY3k6IHtcbiAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0tJHt7IGdpdGh1Yi5yZWYgfX0nLFxuICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiB0cnVlLFxuICB9LFxuICBqb2JzOiB7XG4gICAgYXV0b2ZpeDoge1xuICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9hdXRvZml4LnltbEBtYWluJyxcbiAgICB9LFxuICB9LFxufTtcblxuY29uc3Qgd29ya2Zsb3dzID0ge1xuICB0ZXN0OiB7XG4gICAgbmFtZTogJ1Rlc3QnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3Q6IG51bGwsXG4gICAgICBwdXNoOiB7XG4gICAgICAgIGJyYW5jaGVzOiBbJ21haW4nLCAnd2JmeSddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIC8vIGNmLiBodHRwczovL2RvY3MuZ2l0aHViLmNvbS9lbi9hY3Rpb25zL3VzaW5nLWpvYnMvdXNpbmctY29uY3VycmVuY3kjZXhhbXBsZS1vbmx5LWNhbmNlbC1pbi1wcm9ncmVzcy1qb2JzLW9yLXJ1bnMtZm9yLXRoZS1jdXJyZW50LXdvcmtmbG93XG4gICAgY29uY3VycmVuY3k6IHtcbiAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fS0ke3sgZ2l0aHViLnJlZiB9fScsXG4gICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogdHJ1ZSxcbiAgICB9LFxuICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAvLyBmb3IgbGludGVyIGZpeFxuICAgICAgY29udGVudHM6ICd3cml0ZScsXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICB0ZXN0OiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvdGVzdC55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIHJlbGVhc2U6IHtcbiAgICBuYW1lOiAnUmVsZWFzZScsXG4gICAgb246IHtcbiAgICAgIHB1c2g6IHtcbiAgICAgICAgYnJhbmNoZXM6IFtdLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0nLFxuICAgICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IGZhbHNlLFxuICAgIH0sXG4gICAgcGVybWlzc2lvbnM6IHtcbiAgICAgIC8vIGh0dHBzOi8vZG9jcy5ucG1qcy5jb20vdHJ1c3RlZC1wdWJsaXNoZXJzI3N0ZXAtMi1jb25maWd1cmUteW91ci1jaWNkLXdvcmtmbG93XG4gICAgICAnaWQtdG9rZW4nOiAnd3JpdGUnLFxuICAgICAgLy8gZm9yIHNlbWFudGljLXJlbGVhc2VcbiAgICAgIGNvbnRlbnRzOiAnd3JpdGUnLFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgcmVsZWFzZToge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3JlbGVhc2UueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAnc2VtYW50aWMtcHInOiB7XG4gICAgbmFtZTogJ0xpbnQgUFIgdGl0bGUnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3RfdGFyZ2V0OiB7XG4gICAgICAgIHR5cGVzOiBbJ29wZW5lZCcsICdlZGl0ZWQnLCAnc3luY2hyb25pemUnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnc2VtYW50aWMtcHInOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3Mvc2VtYW50aWMtcHIueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICBzeW5jOiB7XG4gICAgbmFtZTogJ1N5bmMnLFxuICAgIG9uOiB7fSxcbiAgICBwZXJtaXNzaW9uczoge1xuICAgICAgLy8gZm9yIGNvbW1pdGluZyBjaGFuZ2VzXG4gICAgICBjb250ZW50czogJ3dyaXRlJyxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgIHN5bmM6IHsgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9zeW5jLnltbEBtYWluJyB9LFxuICAgIH0sXG4gIH0sXG4gICdjbG9zZS1jb21tZW50Jzoge1xuICAgIG5hbWU6ICdBZGQgY2xvc2UgY29tbWVudCcsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdDoge1xuICAgICAgICB0eXBlczogWydvcGVuZWQnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnY2xvc2UtY29tbWVudCc6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9jbG9zZS1jb21tZW50LnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbnR5cGUgS25vd25LaW5kID0ga2V5b2YgdHlwZW9mIHdvcmtmbG93cyB8ICdkZXBsb3knIHwgJ2F1dG9maXgnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVXb3JrZmxvd3Mocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlV29ya2Zsb3cnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHJvb3RDb25maWcucmVwb3NpdG9yeSkpIHtcbiAgICAgIC8vIERvbid0IHRvdWNoIHJldXNhYmxlLXdvcmtmbG93cyByZXBvIGJlY2F1c2UgaXQgaG9zdHMgdXBzdHJlYW0gd29ya2Zsb3cgZGVmaW5pdGlvbnMuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgd29ya2Zsb3dzUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcuZ2l0aHViJywgJ3dvcmtmbG93cycpO1xuICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHdvcmtmbG93c1BhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgLy8gUmVtb3ZlIGNvbmZpZyBvZiBzZW1hbnRpYyBwdWxsIHJlcXVlc3RcbiAgICBjb25zdCBzZW1hbnRpY1ltbFBhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicsICdzZW1hbnRpYy55bWwnKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oc2VtYW50aWNZbWxQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSkpO1xuXG4gICAgY29uc3QgZW50cmllcyA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIod29ya2Zsb3dzUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgaWYgKCFlbnRyeS5pc0ZpbGUoKSB8fCAhaXNPYnNvbGV0ZUdlblByV29ya2Zsb3dGaWxlTmFtZShlbnRyeS5uYW1lKSkgY29udGludWU7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsIGVudHJ5Lm5hbWUpLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICB9XG4gICAgY29uc3QgZmlsZU5hbWVTZXQgPSBuZXcgU2V0KFtcbiAgICAgICd0ZXN0LnltbCcsXG4gICAgICAnYXV0b2ZpeC55bWwnLFxuICAgICAgJ3NlbWFudGljLXByLnltbCcsXG4gICAgICAnY2xvc2UtY29tbWVudC55bWwnLFxuICAgICAgLi4uZW50cmllc1xuICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgIChkaXJlbnQpID0+IGRpcmVudC5pc0ZpbGUoKSAmJiBkaXJlbnQubmFtZS5lbmRzV2l0aCgnLnltbCcpICYmICFpc09ic29sZXRlR2VuUHJXb3JrZmxvd0ZpbGVOYW1lKGRpcmVudC5uYW1lKVxuICAgICAgICApXG4gICAgICAgIC5tYXAoKGRpcmVudCkgPT4gZGlyZW50Lm5hbWUpLFxuICAgIF0pO1xuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5zZW1hbnRpY1JlbGVhc2UpIHtcbiAgICAgIGZpbGVOYW1lU2V0LmFkZCgncmVsZWFzZS55bWwnKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGZpbGVOYW1lIG9mIGZpbGVOYW1lU2V0KSB7XG4gICAgICAvLyDlrp/pmpvjga9Lbm93bktpbmTku6XlpJbjga7lgKTjgoLku6PlhaXjgZXjgozjgovjgZPjgajjgavms6jmhI9cbiAgICAgIGNvbnN0IGtpbmQgPSBwYXRoLmJhc2VuYW1lKGZpbGVOYW1lLCAnLnltbCcpIGFzIEtub3duS2luZDtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiB3cml0ZVdvcmtmbG93WWFtbChyb290Q29uZmlnLCB3b3JrZmxvd3NQYXRoLCBraW5kKSk7XG4gICAgfVxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHJlcG9zaXRvcnk/OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHJlcG9zaXRvcnk/LmVuZHNXaXRoKCcvcmV1c2FibGUtd29ya2Zsb3dzJykgPz8gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGlzT2Jzb2xldGVHZW5QcldvcmtmbG93RmlsZU5hbWUoZmlsZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gL15nZW4tcHIoPzotLispP1xcLnlhP21sJC91LnRlc3QoZmlsZU5hbWUpO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZVdvcmtmbG93WWFtbChjb25maWc6IFBhY2thZ2VDb25maWcsIHdvcmtmbG93c1BhdGg6IHN0cmluZywga2luZDogS25vd25LaW5kKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKHdvcmtmbG93c1BhdGgsIGAke2tpbmR9LnltbGApO1xuICBjb25zdCBkZXBsb3lQcm9kdWN0aW9uV29ya2Zsb3dFeGlzdHMgPSBmcy5leGlzdHNTeW5jKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAnZGVwbG95LXByb2R1Y3Rpb24ueW1sJykpO1xuXG4gIGlmIChraW5kID09PSAnYXV0b2ZpeCcpIHtcbiAgICBhd2FpdCB3cml0ZVlhbWwoZ2VuZXJhdGVBdXRvZml4V29ya2Zsb3coY29uZmlnKSwgZmlsZVBhdGgpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBuZXdTZXR0aW5ncyA9IHN0cnVjdHVyZWRDbG9uZShraW5kIGluIHdvcmtmbG93cyA/IHdvcmtmbG93c1traW5kIGFzIGtleW9mIHR5cGVvZiB3b3JrZmxvd3NdIDoge30pIGFzIFdvcmtmbG93O1xuXG4gIHRyeSB7XG4gICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgIGNvbnN0IG9sZFNldHRpbmdzID0geWFtbC5sb2FkKG9sZENvbnRlbnQpIGFzIFdvcmtmbG93O1xuICAgIG5ld1NldHRpbmdzID0gbWVyZ2UuYWxsKFtuZXdTZXR0aW5ncywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzXSwgeyBhcnJheU1lcmdlOiBjb21iaW5lTWVyZ2UgfSkgYXMgV29ya2Zsb3c7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxuXG4gIC8vIFNraXAgYSBicm9rZW4gd29ya2Zsb3dcbiAgaWYgKCEoJ2pvYnMnIGluIG5ld1NldHRpbmdzKSkgcmV0dXJuO1xuXG4gIGlmIChraW5kLnN0YXJ0c1dpdGgoJ2RlcGxveScpKSB7XG4gICAgbmV3U2V0dGluZ3MgPSB7XG4gICAgICAuLi5uZXdTZXR0aW5ncyxcbiAgICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fScsXG4gICAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgfTtcbiAgICAvLyBNb3ZlIGpvYnMgdG8gdGhlIGJvdHRvbVxuICAgIG1vdmVUb0JvdHRvbShuZXdTZXR0aW5ncywgJ2pvYnMnKTtcbiAgICBpZiAobmV3U2V0dGluZ3Mub24/LnB1c2gpIHtcbiAgICAgIG5ld1NldHRpbmdzLm9uLnB1c2hbJ3BhdGhzLWlnbm9yZSddID0gW1xuICAgICAgICAuLi5uZXcgU2V0KFsnKioubWQnLCAnKiovZG9jcy8qKicsIC4uLihuZXdTZXR0aW5ncy5vbi5wdXNoWydwYXRocy1pZ25vcmUnXSA/PyBbXSldKSxcbiAgICAgIF07XG4gICAgfVxuICB9XG5cbiAgaWYgKGtpbmQgPT09ICdyZWxlYXNlJyAmJiBuZXdTZXR0aW5ncy5qb2JzLnJlbGVhc2UgJiYgZGVwbG95UHJvZHVjdGlvbldvcmtmbG93RXhpc3RzKSB7XG4gICAgbmV3U2V0dGluZ3MucGVybWlzc2lvbnMgPz89IHt9O1xuICAgIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zLmFjdGlvbnMgPSAnd3JpdGUnO1xuICAgIG5ld1NldHRpbmdzLmpvYnMucmVsZWFzZS53aXRoID8/PSB7fTtcbiAgICBuZXdTZXR0aW5ncy5qb2JzLnJlbGVhc2Uud2l0aC50cmlnZ2VyX2RlcGxveV93b3JrZmxvdyA9ICdkZXBsb3ktcHJvZHVjdGlvbi55bWwnO1xuICB9XG5cbiAgbGV0IGlzUmV1c2FibGVXb3JrZmxvdyA9IGZhbHNlO1xuICBmb3IgKGNvbnN0IGpvYiBvZiBPYmplY3QudmFsdWVzKG5ld1NldHRpbmdzLmpvYnMpKSB7XG4gICAgLy8gSWdub3JlIG5vbi1yZXVzYWJsZSB3b3JrZmxvd3NcbiAgICBpZiAoIWpvYi51c2VzPy5pbmNsdWRlcygnL3JldXNhYmxlLXdvcmtmbG93cy8nKSkgY29udGludWU7XG5cbiAgICBub3JtYWxpemVKb2IoY29uZmlnLCBqb2IsIGtpbmQpO1xuICAgIGlzUmV1c2FibGVXb3JrZmxvdyA9IHRydWU7XG4gIH1cbiAgaWYgKCFpc1JldXNhYmxlV29ya2Zsb3cpIHJldHVybjtcblxuICBzd2l0Y2ggKGtpbmQpIHtcbiAgICBjYXNlICdyZWxlYXNlJzoge1xuICAgICAgaWYgKG5ld1NldHRpbmdzLm9uPy5zY2hlZHVsZSkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3Mub24ucHVzaDtcbiAgICAgIH0gZWxzZSBpZiAobmV3U2V0dGluZ3Mub24/LnB1c2ggJiYgY29uZmlnLnJlbGVhc2UuYnJhbmNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBuZXdTZXR0aW5ncy5vbi5wdXNoLmJyYW5jaGVzID0gY29uZmlnLnJlbGVhc2UuYnJhbmNoZXM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBEb24ndCB1c2UgcmVsZWFzZS55bWwgaWYgcmVsZWFzZSBicmFuY2ggaXMgbm90IHNwZWNpZmllZFxuICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgJ3JlbGVhc2UueW1sJyksIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuaXNQdWJsaWNSZXBvKSB7XG4gICAgICAgIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zID8/PSB7fTtcbiAgICAgICAgbmV3U2V0dGluZ3MucGVybWlzc2lvbnNbJ2lkLXRva2VuJ10gPSAnd3JpdGUnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zPy5bJ2lkLXRva2VuJ107XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSAndGVzdCc6IHtcbiAgICAgIC8vIERvbid0IHVzZSBgcGF0aHMtaWdub3JlYCBmb3IgdGVzdCBiZWNhdXNlIEdpdEh1YidzIEJyYW5jaCBQcm90ZWN0aW9uIGFuZCBSdWxlc2V0cyByZXF1aXJlIGpvYiBydW5uaW5nLlxuICAgICAgaWYgKG5ld1NldHRpbmdzLm9uPy5wdWxsX3JlcXVlc3QpIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLm9uLnB1bGxfcmVxdWVzdFsncGF0aHMtaWdub3JlJ107XG4gICAgICB9XG4gICAgICBpZiAobmV3U2V0dGluZ3Mub24/LnB1c2gpIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLm9uLnB1c2hbJ3BhdGhzLWlnbm9yZSddO1xuICAgICAgICBuZXdTZXR0aW5ncy5vbi5wdXNoLmJyYW5jaGVzID0gbmV3U2V0dGluZ3Mub24ucHVzaC5icmFuY2hlcy5maWx0ZXIoKGJyYW5jaCkgPT4gYnJhbmNoICE9PSAncmVub3ZhdGUvKionKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICAvLyBObyBkZWZhdWx0XG4gIH1cbiAgYXdhaXQgd3JpdGVZYW1sKG5ld1NldHRpbmdzLCBmaWxlUGF0aCk7XG5cbiAgaWYgKGtpbmQgPT09ICdzeW5jJykge1xuICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAnc3luYy1pbml0LnltbCcpLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgIGlmICghbmV3U2V0dGluZ3Muam9icy5zeW5jPy53aXRoKSByZXR1cm47XG5cbiAgICAvLyBHZW5lcmF0ZSBzeW5jLWZvcmNlLnltbCBiYXNlZCBvbiBzeW5jLnltbCBpZiBpdCBleGlzdHMuXG4gICAgbmV3U2V0dGluZ3Muam9ic1snc3luYy1mb3JjZSddID0gbmV3U2V0dGluZ3Muam9icy5zeW5jO1xuICAgIGNvbnN0IHBhcmFtcyA9IG5ld1NldHRpbmdzLmpvYnMuc3luYy53aXRoLnN5bmNfcGFyYW1zX3dpdGhvdXRfZGVzdDtcbiAgICBpZiAodHlwZW9mIHBhcmFtcyAhPT0gJ3N0cmluZycpIHJldHVybjtcblxuICAgIG5ld1NldHRpbmdzLmpvYnMuc3luYy53aXRoLnN5bmNfcGFyYW1zX3dpdGhvdXRfZGVzdCA9IGAtLWZvcmNlICR7cGFyYW1zfWA7XG4gICAgbmV3U2V0dGluZ3MubmFtZSA9ICdGb3JjZSB0byBTeW5jJztcbiAgICBuZXdTZXR0aW5ncy5vbiA9IHsgd29ya2Zsb3dfZGlzcGF0Y2g6IG51bGwgfTtcbiAgICBkZWxldGUgbmV3U2V0dGluZ3Muam9icy5zeW5jO1xuICAgIGF3YWl0IHdyaXRlWWFtbChuZXdTZXR0aW5ncywgcGF0aC5qb2luKHdvcmtmbG93c1BhdGgsICdzeW5jLWZvcmNlLnltbCcpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVKb2IoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBqb2I6IEpvYiwga2luZDogS25vd25LaW5kKTogdm9pZCB7XG4gIGpvYi53aXRoID8/PSB7fTtcbiAgam9iLnNlY3JldHMgPz89IHt9O1xuICAvLyBVc2UgdHJ1c3RlZCBwdWJsaXNoaW5nIGluc3RlYWQgb2YgTlBNX1RPS0VOXG4gIGRlbGV0ZSBqb2Iuc2VjcmV0cy5OUE1fVE9LRU47XG5cbiAgaWYgKGtpbmQgPT09ICd0ZXN0JyB8fCBraW5kID09PSAncmVsZWFzZScpIHtcbiAgICBqb2Iuc2VjcmV0cy5HSF9UT0tFTiA9ICcke3sgc2VjcmV0cy5HSVRIVUJfVE9LRU4gfX0nO1xuICB9XG5cbiAgaWYgKGpvYi5zZWNyZXRzLkZJUkVCQVNFX1RPS0VOKSB7XG4gICAgam9iLnNlY3JldHMuR0NQX1NBX0tFWV9KU09OX0ZPUl9GSVJFQkFTRSA9ICcke3sgc2VjcmV0cy5HQ1BfU0FfS0VZX0pTT05fRk9SX0ZJUkVCQVNFIH19JztcbiAgICBkZWxldGUgam9iLnNlY3JldHMuRklSRUJBU0VfVE9LRU47XG4gIH1cbiAgaWYgKFxuICAgIChqb2Iuc2VjcmV0cy5ESVNDT1JEX1dFQkhPT0tfVVJMICYmIChraW5kID09PSAncmVsZWFzZScgfHwga2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSkpIHx8XG4gICAgKGpvYi53aXRoLnNlcnZlcl91cmwgJiYga2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSlcbiAgKSB7XG4gICAgam9iLnNlY3JldHMuRElTQ09SRF9XRUJIT09LX1VSTCA9ICcke3sgc2VjcmV0cy5ESVNDT1JEX1dFQkhPT0tfVVJMX0ZPUl9SRUxFQVNFIH19JztcbiAgfVxuXG4gIGlmIChraW5kID09PSAnc3luYycpIHtcbiAgICBjb25zdCBwYXJhbXMgPSBqb2Iud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3Q7XG4gICAgaWYgKHR5cGVvZiBwYXJhbXMgPT09ICdzdHJpbmcnKSB7XG4gICAgICBqb2Iud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3QgPSBwYXJhbXMucmVwbGFjZSgnc3luYyAnLCAnJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXIvJykpIHtcbiAgICBqb2IudXNlcyA9IGpvYi51c2VzPy5yZXBsYWNlKCdXaWxsQm9vc3RlckxhYi8nLCAnV2lsbEJvb3N0ZXIvJyk7XG4gIH0gZWxzZSBpZiAoY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKSkge1xuICAgIGpvYi51c2VzID0gam9iLnVzZXM/LnJlcGxhY2UoJ1dpbGxCb29zdGVyLycsICdXaWxsQm9vc3RlckxhYi8nKTtcbiAgfVxuXG4gIC8vIFJlbW92ZSByZWR1bmRhbnQgcGFyYW1ldGVyc1xuICBpZiAoam9iLndpdGguZG90X2Vudl9wYXRoID09PSAnLmVudicpIHtcbiAgICBkZWxldGUgam9iLndpdGguZG90X2Vudl9wYXRoO1xuICB9XG5cbiAgLy8gRG9uJ3QgdXNlIGBmbHkgZGVwbG95IC0tanNvbmAgc2luY2UgaXQgY2F1c2VzIGFuIGVycm9yXG4gIGlmIChraW5kLnN0YXJ0c1dpdGgoJ2RlcGxveScpICYmIGpvYi5zZWNyZXRzLkZMWV9BUElfVE9LRU4gJiYgdHlwZW9mIGpvYi53aXRoLmRlcGxveV9jb21tYW5kID09PSAnc3RyaW5nJykge1xuICAgIGpvYi53aXRoLmRlcGxveV9jb21tYW5kID0gam9iLndpdGguZGVwbG95X2NvbW1hbmQucmVwbGFjZSgvXFxzKy0tanNvbi8sICcnKTtcbiAgfVxuICBpZiAoY29uZmlnLmRvZXNDb250YWluRG9ja2VyZmlsZSAmJiAham9iLndpdGguY2lfbGFiZWwgJiYga2luZC5zdGFydHNXaXRoKCd0ZXN0JykpIHtcbiAgICBqb2Iud2l0aC5jaV9sYWJlbCA9ICdsYXJnZSc7XG4gIH1cbiAgLy8gQmVjYXVzZSBnaXRodWIuZXZlbnQucmVwb3NpdG9yeS5wcml2YXRlIGlzIGFsd2F5cyB0cnVlIGlmIGpvYiBpcyBzY2hlZHVsZWRcbiAgaWYgKGtpbmQgPT09ICdyZWxlYXNlJyB8fCBraW5kID09PSAndGVzdCcgfHwga2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSkge1xuICAgIGlmIChjb25maWcuaXNQdWJsaWNSZXBvKSB7XG4gICAgICBqb2Iud2l0aC5naXRodWJfaG9zdGVkX3J1bm5lciA9IHRydWU7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGRlbGV0ZSBqb2Iud2l0aC5naXRodWJfaG9zdGVkX3J1bm5lcjtcbiAgfVxuXG4gIGlmIChPYmplY3Qua2V5cyhqb2Iud2l0aCkubGVuZ3RoID4gMCkge1xuICAgIHNvcnRLZXlzKGpvYi53aXRoKTtcbiAgfSBlbHNlIHtcbiAgICBkZWxldGUgam9iLndpdGg7XG4gIH1cbiAgaWYgKE9iamVjdC5rZXlzKGpvYi5zZWNyZXRzKS5sZW5ndGggPiAwKSB7XG4gICAgLy8gTW92ZSBzZWNyZXRzIHByb3AgYWZ0ZXIgd2l0aCBwcm9wXG4gICAgY29uc3QgbmV3U2VjcmV0cyA9IHNvcnRLZXlzKGpvYi5zZWNyZXRzKTtcbiAgICBkZWxldGUgam9iLnNlY3JldHM7XG4gICAgam9iLnNlY3JldHMgPSBuZXdTZWNyZXRzO1xuICB9IGVsc2Uge1xuICAgIGRlbGV0ZSBqb2Iuc2VjcmV0cztcbiAgfVxufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUF1dG9maXhXb3JrZmxvdyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBXb3JrZmxvdyB7XG4gIGlmICghY29uZmlnLmlzUHVibGljUmVwbykge1xuICAgIHJldHVybiBzdHJ1Y3R1cmVkQ2xvbmUocHJpdmF0ZVJlcG9BdXRvZml4V29ya2Zsb3cpO1xuICB9XG5cbiAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSBjb25maWcuaXNCdW4gPyAnYnVuJyA6ICd5YXJuJztcbiAgY29uc3Qgc3RlcHM6IFN0ZXBbXSA9IFtcbiAgICB7IHVzZXM6ICdhY3Rpb25zL2NoZWNrb3V0QHY2JyB9LFxuICAgIHsgdXNlczogJ2FjdGlvbnMvc2V0dXAtbm9kZUB2NicsIHdpdGg6IHsgJ2NoZWNrLWxhdGVzdCc6IHRydWUsICdub2RlLXZlcnNpb24nOiAnbHRzLyonIH0gfSxcbiAgICAuLi4oY29uZmlnLmlzQnVuID8gW3sgdXNlczogJ292ZW4tc2gvc2V0dXAtYnVuQHYyJywgd2l0aDogeyAnYnVuLXZlcnNpb24nOiAnbGF0ZXN0JyB9IH1dIDogW10pLFxuICAgIHsgcnVuOiBgJHtwYWNrYWdlTWFuYWdlcn0gaW5zdGFsbGAgfSxcbiAgICB7IHJ1bjogYCR7cGFja2FnZU1hbmFnZXJ9IHJ1biBjbGVhbnVwYCB9LFxuICBdO1xuICBpZiAoY29uZmlnLnBhY2thZ2VKc29uPy5zY3JpcHRzPy5idWlsZCkge1xuICAgIHN0ZXBzLnB1c2goeyBydW46IGAke3BhY2thZ2VNYW5hZ2VyfSBydW4gYnVpbGRgIH0pO1xuICB9XG4gIHN0ZXBzLnB1c2goeyB1c2VzOiAnYXV0b2ZpeC1jaS9hY3Rpb25AdjEnIH0pO1xuXG4gIGNvbnN0IGF1dG9maXhXb3JrZmxvdyA9IHN0cnVjdHVyZWRDbG9uZShwdWJsaWNSZXBvQXV0b2ZpeFdvcmtmbG93KTtcbiAgY29uc3QgYXV0b2ZpeEpvYiA9IGF1dG9maXhXb3JrZmxvdy5qb2JzLmF1dG9maXggPz8geyAncnVucy1vbic6ICd1YnVudHUtbGF0ZXN0JyB9O1xuICBhdXRvZml4V29ya2Zsb3cuam9icy5hdXRvZml4ID0geyAuLi5hdXRvZml4Sm9iLCBzdGVwcyB9O1xuICByZXR1cm4gYXV0b2ZpeFdvcmtmbG93O1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZVlhbWwobmV3U2V0dGluZ3M6IFdvcmtmbG93LCBmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHlhbWxUZXh0ID0gcmVtb3ZlVHJhaWxpbmdTcGFjZXMoXG4gICAgeWFtbC5kdW1wKG5ld1NldHRpbmdzLCB7IGxpbmVXaWR0aDogLTEsIG5vQ29tcGF0TW9kZTogdHJ1ZSwgc3R5bGVzOiB7ICchIW51bGwnOiAnZW1wdHknIH0gfSlcbiAgKTtcbiAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGZpbGVQYXRoLCB5YW1sVGV4dCk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZVRyYWlsaW5nU3BhY2VzKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIGpzLXlhbWwgZW1pdHMgdmFsdWVsZXNzIEdpdEh1YiBBY3Rpb25zIGV2ZW50cyBhcyBgZXZlbnQ6IGAgd2hlbiB1c2luZyB0aGUgZW1wdHkgbnVsbCBzdHlsZS5cbiAgcmV0dXJuIHRleHQucmVwbGFjZUFsbCgvWyBcXHRdKyQvZ20sICcnKTtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuXG5pbXBvcnQgeyBpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyB9IGZyb20gJy4uL2dlbmVyYXRvcnMvd29ya2Zsb3cuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuLi9vcHRpb25zLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGdsb2JJZ25vcmUgfSBmcm9tICcuLi91dGlscy9nbG9iVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFR5cG9zKHBhY2thZ2VDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhUeXBvcycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8ocGFja2FnZUNvbmZpZy5yZXBvc2l0b3J5KSkgcmV0dXJuO1xuXG4gICAgY29uc3QgZGlyUGF0aCA9IHBhY2thZ2VDb25maWcuZGlyUGF0aDtcbiAgICBjb25zdCBkb2NGaWxlcyA9IGF3YWl0IGZnLmdsb2IoJyoqLyoubWQnLCB7IGRvdDogdHJ1ZSwgY3dkOiBkaXJQYXRoLCBpZ25vcmU6IGdsb2JJZ25vcmUgfSk7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYEZvdW5kICR7ZG9jRmlsZXMubGVuZ3RofSBtYXJrZG93biBmaWxlcyBpbiAke2RpclBhdGh9YCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgbWRGaWxlIG9mIGRvY0ZpbGVzKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBtZEZpbGUpO1xuICAgICAgdm9pZCBwcm9taXNlUG9vbC5ydW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihmaWxlUGF0aCk7XG4gICAgICAgIGlmIChjb250ZW50ID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICAgICAgbGV0IG5ld0NvbnRlbnQgPSBmaXhUeXBvc0luVGV4dChjb250ZW50KTtcbiAgICAgICAgbmV3Q29udGVudCA9IHJlcGxhY2VXaXRoQ29uZmlnKG5ld0NvbnRlbnQsIHBhY2thZ2VDb25maWcsICdkb2MnKTtcbiAgICAgICAgaWYgKGNvbnRlbnQgIT09IG5ld0NvbnRlbnQpIHtcbiAgICAgICAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgdHNGaWxlcyA9IGF3YWl0IGZnLmdsb2IoXG4gICAgICBbXG4gICAgICAgICd7YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4LGN0cyxtdHMsdHMsdHN4fScsXG4gICAgICAgICdwYWNrYWdlcy8qKi97YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4LGN0cyxtdHMsdHMsdHN4fScsXG4gICAgICBdLFxuICAgICAgeyBkb3Q6IHRydWUsIGN3ZDogZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH1cbiAgICApO1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBGb3VuZCAke3RzRmlsZXMubGVuZ3RofSBUeXBlU2NyaXB0IGZpbGVzIGluICR7ZGlyUGF0aH1gKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCB0c0ZpbGUgb2YgdHNGaWxlcykge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgdHNGaWxlKTtcbiAgICAgIHZvaWQgcHJvbWlzZVBvb2wucnVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGgpO1xuICAgICAgICBpZiAob2xkQ29udGVudCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgICAgIGxldCBuZXdDb250ZW50ID0gZml4VHlwb3NJbkNvZGUob2xkQ29udGVudCk7XG4gICAgICAgIG5ld0NvbnRlbnQgPSByZXBsYWNlV2l0aENvbmZpZyhuZXdDb250ZW50LCBwYWNrYWdlQ29uZmlnLCAndHMnKTtcblxuICAgICAgICBpZiAob2xkQ29udGVudCAhPT0gbmV3Q29udGVudCkge1xuICAgICAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCB0ZXh0QmFzZWRGaWxlcyA9IGF3YWl0IGZnLmdsb2IoJyoqLyoue2NzdixodG0saHRtbCx0c3YseG1sLHlhbWwseW1sfScsIHtcbiAgICAgIGRvdDogdHJ1ZSxcbiAgICAgIGN3ZDogZGlyUGF0aCxcbiAgICAgIGlnbm9yZTogZ2xvYklnbm9yZSxcbiAgICB9KTtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRm91bmQgJHt0ZXh0QmFzZWRGaWxlcy5sZW5ndGh9IHRleHQtYmFzZWQgZmlsZXMgaW4gJHtkaXJQYXRofWApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgdGV4dEJhc2VkRmlsZXMpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIGZpbGUpO1xuICAgICAgdm9pZCBwcm9taXNlUG9vbC5ydW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihmaWxlUGF0aCk7XG4gICAgICAgIGlmIChvbGRDb250ZW50ID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICAgICAgbGV0IG5ld0NvbnRlbnQgPSBmaXhUeXBvc0luVGV4dChvbGRDb250ZW50KTtcbiAgICAgICAgbmV3Q29udGVudCA9IHJlcGxhY2VXaXRoQ29uZmlnKG5ld0NvbnRlbnQsIHBhY2thZ2VDb25maWcsICd0ZXh0Jyk7XG5cbiAgICAgICAgaWYgKG9sZENvbnRlbnQgIT09IG5ld0NvbnRlbnQpIHtcbiAgICAgICAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpeFR5cG9zSW5UZXh0KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBjb250ZW50XG4gICAgLnJlcGxhY2VBbGwoL1xcYmNcXC5mXFwuKD89XFxzfCQpL2csICdjZi4nKVxuICAgIC5yZXBsYWNlQWxsKC9cXGJlZ1xcLig/PVxcc3wkKS9nLCAnZS5nLicpXG4gICAgLnJlcGxhY2VBbGwoL1xcYmllXFwuKD89XFxzKS9nLCAnaS5lLicpO1xufVxuXG5mdW5jdGlvbiBmaXhUeXBvc0luQ29kZShjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gY29udGVudFxuICAgIC5yZXBsYWNlQWxsKC9cXC9cXCpbXFxzXFxTXSo/XFwqXFwvL2csIChjb21tZW50KSA9PiBmaXhUeXBvc0luVGV4dChjb21tZW50KSlcbiAgICAucmVwbGFjZUFsbCgvKF58XFxzKVxcL1xcLyguKj8pY1xcLmZcXC4vZywgJyQxLy8kMmNmLicpXG4gICAgLnJlcGxhY2VBbGwoLyhefFxccylcXC9cXC8oLio/KWVnXFwuL2csICckMS8vJDJlLmcuJylcbiAgICAucmVwbGFjZUFsbCgvKF58XFxzKVxcL1xcLyguKj8paWVcXC4vZywgJyQxLy8kMmkuZS4nKTtcbn1cblxuZnVuY3Rpb24gcmVwbGFjZVdpdGhDb25maWcobmV3Q29udGVudDogc3RyaW5nLCBwYWNrYWdlQ29uZmlnOiBQYWNrYWdlQ29uZmlnLCBwcm9wTmFtZTogJ2RvYycgfCAndHMnIHwgJ3RleHQnKTogc3RyaW5nIHtcbiAgZm9yIChjb25zdCBbYmVmb3JlLCBhZnRlcl0gb2YgT2JqZWN0LmVudHJpZXMocGFja2FnZUNvbmZpZy53YmZ5SnNvbj8udHlwb3M/LmFsbCA/PyB7fSkpIHtcbiAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlQWxsKGJlZm9yZSwgYWZ0ZXIpO1xuICB9XG4gIGZvciAoY29uc3QgW2JlZm9yZSwgYWZ0ZXJdIG9mIE9iamVjdC5lbnRyaWVzKHBhY2thZ2VDb25maWcud2JmeUpzb24/LnR5cG9zPy5bcHJvcE5hbWVdID8/IHt9KSkge1xuICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2VBbGwoYmVmb3JlLCBhZnRlcik7XG4gIH1cbiAgcmV0dXJuIG5ld0NvbnRlbnQ7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgZ2V0UGFja2FnZU1hbmFnZXJDb21tYW5kIH0gZnJvbSAnLi4vdXRpbHMvcGFja2FnZUNhcGFiaWxpdGllcy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbnMocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZywgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIXJvb3RDb25maWcuaXNSb290KSByZXR1cm47XG5cbiAgICAvLyBDaGVjayBpZiBBR0VOVFNfRVhUUkEubWQgZXhpc3RzIGFuZCByZWFkIGl0cyBjb250ZW50XG4gICAgY29uc3QgYWdlbnRzRXh0cmFQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJ0FHRU5UU19FWFRSQS5tZCcpO1xuICAgIGNvbnN0IGV4dHJhQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoYWdlbnRzRXh0cmFQYXRoKTtcblxuICAgIGZvciAoY29uc3QgW2ZpbGVOYW1lLCB0b29sTmFtZV0gb2YgW1xuICAgICAgWydBR0VOVFMubWQnLCAnQ29kZXggQ0xJJ10sXG4gICAgICBbJ0NMQVVERS5tZCcsICdDbGF1ZGUgQ29kZSddLFxuICAgICAgWydHRU1JTkkubWQnLCAnR2VtaW5pIENMSSddLFxuICAgIF0gYXMgY29uc3QpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb24ocm9vdENvbmZpZywgYWxsQ29uZmlncywgdG9vbE5hbWUsIGV4dHJhQ29udGVudCk7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsIGZpbGVOYW1lKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb250ZW50KSk7XG4gICAgfVxuXG4gICAgY29uc3QgY3Vyc29yUnVsZXNQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5jdXJzb3IvcnVsZXMvZ2VuZXJhbC5tZGMnKTtcbiAgICBjb25zdCBjdXJzb3JSdWxlc0NvbnRlbnQgPSBnZW5lcmF0ZUN1cnNvckdlbmVyYWxNZGNDb250ZW50KHJvb3RDb25maWcsIGFsbENvbmZpZ3MsIGV4dHJhQ29udGVudCk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoY3Vyc29yUnVsZXNQYXRoLCBjdXJzb3JSdWxlc0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlQ3Vyc29yR2VuZXJhbE1kY0NvbnRlbnQoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdLFxuICBleHRyYUNvbnRlbnQ/OiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIGNvbnN0IGZyb250bWF0dGVyID0gYC0tLVxcbmRlc2NyaXB0aW9uOiBHZW5lcmFsIENvZGluZyBSdWxlc1xcbmdsb2JzOlxcbmFsd2F5c0FwcGx5OiB0cnVlXFxuLS0tYDtcbiAgY29uc3QgYm9keSA9IGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbihjb25maWcsIGFsbENvbmZpZ3MsICdDdXJzb3InLCBleHRyYUNvbnRlbnQpO1xuICByZXR1cm4gYCR7ZnJvbnRtYXR0ZXJ9XFxuXFxuJHtib2R5fWA7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbihcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdLFxuICB0b29sTmFtZTogc3RyaW5nLFxuICBleHRyYUNvbnRlbnQ/OiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gZ2V0UGFja2FnZU1hbmFnZXJDb21tYW5kKHJvb3RDb25maWcpO1xuICBjb25zdCBiYXNlQ29udGVudCA9IGBcbiMjIFByb2plY3QgSW5mb3JtYXRpb25cblxuLSBOYW1lOiBcXGAke3Jvb3RDb25maWcucGFja2FnZUpzb24/Lm5hbWUgfHwgJ3Vua25vd24nfVxcYFxuLSBEZXNjcmlwdGlvbjogJHtyb290Q29uZmlnLnBhY2thZ2VKc29uPy5kZXNjcmlwdGlvbn1cbi0gUGFja2FnZSBNYW5hZ2VyOiAke3BhY2thZ2VNYW5hZ2VyfVxuXG4jIyBHZW5lcmFsIEluc3RydWN0aW9uc1xuXG4tIENyZWF0ZSBhIG5ldyBicmFuY2ggaWYgdGhlIGN1cnJlbnQgYnJhbmNoIGlzIFxcYG1haW5cXGAuXG4tIFJ1biBhbnkgXFxgZ2l0XFxgIGNvbW1hbmRzIHNlcXVlbnRpYWxseS5cbi0gV3JpdGUgdGVzdHMgT05MWSBpZiBleHBsaWNpdGx5IHJlcXVlc3RlZC4gSWYgcmVxdWVzdGVkLCBmb2xsb3cgdGhlc2UgcnVsZXM6XG4gIC0gQ29udGludWUgbW9kaWZ5aW5nIHRlc3RzIGFuZC9vciBjb2RlIHVudGlsIGFsbCB0ZXN0cyBwYXNzLlxuICAtIEVuc3VyZSB0ZXN0cyBhcmUgaWRlbXBvdGVudCBhbmQgaW5kZXBlbmRlbnQgKGUuZy4sIHJlc2V0IHBlcnNpc3RlbnQgZGF0YSkgc28gdGhleSBjYW4gcnVuIHJlcGVhdGVkbHkgb3IgaW4gcGFyYWxsZWwuXG4gIC0gUHJlZmVyIGFjdHVhbCBBUEkgY2FsbHMgb3ZlciBtb2NrcywgdW5sZXNzIGFjdHVhbCBjYWxscyBhcmUgaW1wcmFjdGljYWwsIGhhdmUgdW5pbnRlbmRlZCBzaWRlIGVmZmVjdHMsIG9yIG1vY2tzIGFyZSBleHBsaWNpdGx5IHJlcXVlc3RlZC5cbiAgLSBBbHdheXMgaW52ZXN0aWdhdGUgdGhlIHJvb3QgY2F1c2Ugb2YgYSB0ZXN0IGZhaWx1cmUgYmVmb3JlIGZpeGluZyBpdC5cbiAgLSBBdm9pZCBhZGRpbmcgd2FpdCBmdW5jdGlvbnMgaW4gRTJFIHRlc3RzIHVubGVzcyBzdHJpY3RseSBuZWNlc3NhcnkuXG4tIFdoZW4gZml4aW5nIGlzc3VlcywgZm9sbG93IHRoZXNlIHJ1bGVzOlxuICAtIEludmVzdGlnYXRlIHRoZSByb290IGNhdXNlIGZpcnN0IChlLmcuLCBieSBnYXRoZXJpbmcgZGVidWcgbG9ncywgdGFraW5nIHNjcmVlbnNob3RzLCBldGMuKS5cbiAgLSBGaXggdGhlIGFjdHVhbCByb290IGNhdXNlIGluc3RlYWQgb2YgYXBwbHlpbmcgd29ya2Fyb3VuZHMuXG4tIEFmdGVyIG1ha2luZyBjb2RlIGNoYW5nZXMsIHJ1biBcXGAke3BhY2thZ2VNYW5hZ2VyfSB2ZXJpZnktZnVsbFxcYCB0byBleGVjdXRlIGFsbCB0ZXN0cyAodGFrZXMgdXAgdG8gMSBob3VyKSwgb3IgXFxgJHtwYWNrYWdlTWFuYWdlcn0gdmVyaWZ5XFxgIGZvciBvbmx5IHR5cGUgY2hlY2tpbmcgYW5kIGxpbnRpbmcgKHRha2VzIHVwIHRvIDEwIG1pbnV0ZXMpLlxuICAtIElmIHlvdSBhcmUgY29uZmlkZW50IHRoYXQgeW91ciBjaGFuZ2VzIHdpbGwgbm90IGJyZWFrIGFueSB0ZXN0cywgeW91IG1heSB1c2UgXFxgdmVyaWZ5XFxgLlxuICAtIFVzZSBcXGBveGxpbnRcXGAgaWdub3JlIGNvbW1lbnRzIHdpdGggcmVhc29ucyAoZS5nLiwgXFxgLy8gb3hsaW50LWRpc2FibGUtbmV4dC1saW5lIDxydWxlPiAtLSA8cmVhc29uPlxcYCkgaWYgbGludCBlcnJvcnMgb3Igd2FybmluZ3MgY2Fubm90IGJlIGZpeGVkLlxuLSBPbmNlIHlvdSBoYXZlIHZlcmlmaWVkIHlvdXIgY2hhbmdlcywgY29tbWl0IGFuZCBwdXNoIHRoZW0gdG8gdGhlIGN1cnJlbnQgKG5vbi1tYWluKSBicmFuY2gsIHRoZW4gY3JlYXRlIGEgUFIgdmlhIFxcYGdoXFxgLlxuICAtIEZvbGxvdyB0aGUgY29udmVudGlvbmFsIGNvbW1pdHM7IHlvdXIgY29tbWl0IG1lc3NhZ2Ugc2hvdWxkIHN0YXJ0IHdpdGggXFxgZmVhdDpcXGAsIFxcYGZpeDpcXGAsIGV0Yy5cbiAgLSBJZiBub3Qgc3BlY2lmaWVkLCBtYWtlIHN1cmUgdG8gYWRkIGEgbmV3IGxpbmUgYXQgdGhlIGVuZCBvZiB5b3VyIGNvbW1pdCBtZXNzYWdlJHtyb290Q29uZmlnLmlzV2lsbEJvb3N0ZXJSZXBvID8gYCB3aXRoOiBcXGBDby1hdXRob3JlZC1ieTogV2lsbEJvb3N0ZXIgKCR7dG9vbE5hbWV9KSA8YWdlbnRAd2lsbGJvb3N0ZXIuY29tPlxcYGAgOiAnJ30uXG4gIC0gQWx3YXlzIGNyZWF0ZSBuZXcgY29tbWl0cy4gQXZvaWQgdXNpbmcgXFxgLS1hbWVuZFxcYC5cbi0gQWx3YXlzIHVzZSBoZXJlZG9jIHN5bnRheCB3aGVuIHBhc3NpbmcgbXVsdGktbGluZSBjb250ZW50IHRvIGFueSBjb21tYW5kLlxuLSBQdXQgdGVtcG9yYXJ5IGZpbGVzIGluIHRoZSBcXGAudG1wXFxgIG9yIFxcYC90bXBcXGAgZGlyZWN0b3J5LlxuJHtoYXNQbGF5d3JpZ2h0VGVzdFNlcnZlcihhbGxDb25maWdzKSA/IGAtIFVzZSBcXGAke3BhY2thZ2VNYW5hZ2VyfSB3YiBzdGFydCAtLW1vZGUgdGVzdFxcYCB0byBsYXVuY2ggYSB3ZWIgc2VydmVyIGZvciBkZWJ1Z2dpbmcgb3IgdGVzdGluZy5gIDogJyd9XG5cbiR7Z2VuZXJhdGVBZ2VudENvZGluZ1N0eWxlKGFsbENvbmZpZ3MpfVxuYFxuICAgIC5yZXBsYWNlQWxsKC9cXC5cXG5cXG4rLS9nLCAnLlxcbi0nKVxuICAgIC5yZXBsYWNlQWxsKC9cXG57Myx9L2csICdcXG5cXG4nKVxuICAgIC50cmltKCk7XG5cbiAgY29uc3QgaGFzTmV3U2VjdGlvbiA9IGV4dHJhQ29udGVudD8udHJpbSgpLnN0YXJ0c1dpdGgoJyMnKTtcbiAgY29uc3Qgbm9ybWFsaXplZEV4dHJhQ29udGVudCA9IGV4dHJhQ29udGVudFxuICAgID8gaGFzTmV3U2VjdGlvblxuICAgICAgPyAnXFxuXFxuJyArIGV4dHJhQ29udGVudC50cmltKClcbiAgICAgIDogJ1xcbicgKyBleHRyYUNvbnRlbnRcbiAgICA6ICcnO1xuICByZXR1cm4gYmFzZUNvbnRlbnQgKyBub3JtYWxpemVkRXh0cmFDb250ZW50O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVBZ2VudENvZGluZ1N0eWxlKGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IHN0cmluZyB7XG4gIC8vIEtlZXAgdG9wLWRvd24gb3JkZXJpbmcgZ3VpZGFuY2UgZnVuY3Rpb24tb25seSBiZWNhdXNlIGNsYXNzZXMgYXJlIG5vdCBob2lzdGVkIGFuZCBjYW4gZmFpbCB3aGVuIGluaGVyaXRhbmNlIG9yIHRvcC1sZXZlbCBpbnN0YW50aWF0aW9uIGRlcGVuZHMgb24gZGVjbGFyYXRpb24gb3JkZXIuXG4gIHJldHVybiBgXG4jIyBDb2RpbmcgU3R5bGVcblxuLSBVc2UgY2FtZWxDYXNlIGZvciBKYXZhU2NyaXB0IGFuZCBUeXBlU2NyaXB0IGZpbGVzIChvciBQYXNjYWxDYXNlIGZvciBSZWFjdCBjb21wb25lbnRzKS5cbi0gU2ltcGxpZnkgY29kZSBhcyBtdWNoIGFzIHBvc3NpYmxlIHRvIGVsaW1pbmF0ZSByZWR1bmRhbmN5LlxuLSBEZXNpZ24gZWFjaCBtb2R1bGUgd2l0aCBoaWdoIGNvaGVzaW9uLCBncm91cGluZyByZWxhdGVkIGZ1bmN0aW9uYWxpdHkgdG9nZXRoZXIuXG4gIC0gUmVmYWN0b3IgZXhpc3RpbmcgbGFyZ2UgbW9kdWxlcyBpbnRvIHNtYWxsZXIsIGZvY3VzZWQgbW9kdWxlcyB3aGVuIG5lY2Vzc2FyeS5cbiAgLSBDcmVhdGUgd2VsbC1vcmdhbml6ZWQgZGlyZWN0b3J5IHN0cnVjdHVyZXMgd2l0aCBsb3cgY291cGxpbmcgYW5kIGhpZ2ggY29oZXNpb24uXG4tIFBsYWNlIGNhbGxpbmcgZnVuY3Rpb25zIGFib3ZlIHRoZSBmdW5jdGlvbnMgdGhleSBjYWxsIHRvIG1haW50YWluIGEgY2xlYXIgdG9wLWRvd24gb3JkZXIuXG4gIC0gZS5nLiwgXFxgZnVuY3Rpb24gY2FsbGVyKCkgeyBjYWxsZWUoKTsgfSBmdW5jdGlvbiBjYWxsZWUoKSB7IC4uLiB9XFxgXG4gIC0gVW5saWtlIGZ1bmN0aW9ucywgcGxhY2UgdmFyaWFibGUgYW5kIHR5cGUgZGVjbGFyYXRpb25zIEFCT1ZFIHRoZWlyIHVzYWdlLlxuLSBXcml0ZSBjb21tZW50cyBhbmQgSlNEb2MgZm9yIGNvbXBsZXggb3IgaGFyZC10by11bmRlcnN0YW5kIGNvZGUuXG4gIC0gRXhwbGFpbiBcIndoeVwiIGluIGNvbW1lbnRzIGFuZCBcIndoYXRcIiBpbiBKU0RvYy5cbiAgLSBBdm9pZCBzdGF0aW5nIHdoYXQgY2FuIGJlIGVhc2lseSB1bmRlcnN0b29kIGZyb20gdGhlIGNvZGUgaXRzZWxmLlxuLSBQcmVmZXIgXFxgdW5kZWZpbmVkXFxgIG92ZXIgXFxgbnVsbFxcYCB1bmxlc3MgZXhwbGljaXRseSByZXF1aXJlZCBieSBBUElzIG9yIGxpYnJhcmllcy5cbi0gUHJlZmVyIHVzaW5nIGEgc2luZ2xlIHRlbXBsYXRlIGxpdGVyYWwgZm9yIHByb21wdHMgaW5zdGVhZCBvZiBcXGBqb2luKClcXGAgd2l0aCBhIHByZS1jb21wdXRhYmxlIGFycmF5IGxpdGVyYWwgb2Ygc3RyaW5ncy5cbi0gQXNzdW1lIHRoYXQgYWxsIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgcHJvcGVybHkgZGVmaW5lZC5cbiAgLSBJZiB2YWxpZGF0aW9uIGlzIHJlcXVpcmVkLCB1c2UgXFxgYXNzZXJ0XFxgIHRvIGZhaWwgZmFzdCAoZS5nLiwgZHVyaW5nIHN0YXJ0dXApLlxuJHtcbiAgYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRlcGVuZGluZy5nZW5JMThuVHMpXG4gICAgPyBgLSBXaGVuIGludHJvZHVjaW5nIG5ldyBzdHJpbmcgbGl0ZXJhbHMgaW4gUmVhY3QgY29tcG9uZW50cywgdXBkYXRlIHRoZSBsYW5ndWFnZSByZXNvdXJjZSBmaWxlcyBpbiB0aGUgXFxgaTE4blxcYCBkaXJlY3RvcnkgKGUuZy4sIFxcYGkxOG4vamEtSlAuanNvblxcYCkuIFJlZmVyZW5jZSB0aGVzZSBzdHJpbmdzIHVzaW5nIHRoZSBcXGBpMThuXFxgIHV0aWxpdHkuIEZvciBleGFtcGxlLCB1c2UgXFxgaTE4bi5wYWdlcy5ob21lLnRpdGxlKClcXGAgZm9yIFxcYHsgXCJwYWdlc1wiOiB7IFwiaG9tZVwiOiB7IFwidGl0bGVcIjogXCJNeSBBcHBcIiB9IH0gfVxcYC5gXG4gICAgOiAnJ1xufVxuXG4ke1xuICBhbGxDb25maWdzLnNvbWUoKGMpID0+IGMuZGVwZW5kaW5nLnJlYWN0IHx8IGMuZGVwZW5kaW5nLm5leHQpXG4gICAgPyBgLSBQcmVmZXIgbGFtYmRhIG92ZXIgXFxgZnVuY3Rpb25cXGAgZm9yIFJlYWN0IGNvbXBvbmVudHMsIGUuZy4sIFxcYGNvbnN0IEJ1dHRvbjogUmVhY3QuRkMgPSAoKSA9PiB7XFxgLlxuLSBQcmVmZXIgXFxgdXNlSW1tZXJcXGAgZm9yIHN0b3JpbmcgYW4gYXJyYXkgb3IgYW4gb2JqZWN0IHRvIFxcYHVzZVN0YXRlXFxgLlxuLSBBbGxvdyBcXGBhdXRvRm9jdXNcXGAgdG8gbWluaW1pemUgdXNlciBlZmZvcnQuYFxuICAgIDogJydcbn1cbiR7XG4gIGFsbENvbmZpZ3Muc29tZSgoYykgPT4gYy5kZXBlbmRpbmcubmV4dClcbiAgICA/IGBcbi0gU2luY2UgdGhpcyBwcm9qZWN0IHVzZXMgdGhlIFJlYWN0IENvbXBpbGVyLCB5b3UgZG8gbm90IG5lZWQgdG8gdXNlIFxcYHVzZUNhbGxiYWNrXFxgIG9yIFxcYHVzZU1lbW9cXGAgZm9yIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbi5cbi0gQXNzdW1lIHRoZXJlIGlzIG9ubHkgYSBzaW5nbGUgc2VydmVyIGluc3RhbmNlLlxuYFxuICAgIDogJydcbn1cbmBcbiAgICAucmVwbGFjZUFsbCgvXFwuXFxuXFxuKy0vZywgJy5cXG4tJylcbiAgICAucmVwbGFjZUFsbCgvXFxuezMsfS9nLCAnXFxuXFxuJylcbiAgICAudHJpbSgpO1xufVxuXG5mdW5jdGlvbiBoYXNQbGF5d3JpZ2h0VGVzdFNlcnZlcihjb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBib29sZWFuIHtcbiAgcmV0dXJuIGNvbmZpZ3Muc29tZSgoY29uZmlnKSA9PiBjb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRUZXN0KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IHBhcnNlIH0gZnJvbSAnc21vbC10b21sJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5pbnRlcmZhY2UgQnVuZmlnVG9tbCB7XG4gIGluc3RhbGw/OiB7XG4gICAgZXhhY3Q/OiBib29sZWFuO1xuICB9O1xuICBydW4/OiB7XG4gICAgYnVuPzogYm9vbGVhbjtcbiAgfTtcbn1cblxuY29uc3QgbWluaW11bVJlbGVhc2VBZ2VFeGNsdWRlcyA9IFtcbiAgLy8gLS0tLS0tLS0tLSBTVEFSVDogV2UgYmVsaWV2ZSBvdXIgcGFja2FnZXMgYXJlIHNhZmUgLS0tLS0tLS0tLVxuICAnQGV4ZXJjb2RlL3Byb2JsZW0tdXRpbHMnLFxuICAnQHdpbGxib29zdGVyL2FnZW50LXNraWxscycsXG4gICdAd2lsbGJvb3N0ZXIvYmFiZWwtY29uZmlncycsXG4gICdAd2lsbGJvb3N0ZXIvbW9uYWNvLWxvYWRlcicsXG4gICdAd2lsbGJvb3N0ZXIvbW9uYWNvLXJlYWN0JyxcbiAgJ0B3aWxsYm9vc3Rlci9veGZtdC1jb25maWcnLFxuICAnQHdpbGxib29zdGVyL294bGludC1jb25maWcnLFxuICAnQHdpbGxib29zdGVyL3ByZXR0aWVyLWNvbmZpZycsXG4gICdAd2lsbGJvb3N0ZXIvcmVub3ZhdGUtY29uZmlnJyxcbiAgJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliJyxcbiAgJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLWJsaXR6LW5leHQnLFxuICAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbmV4dCcsXG4gICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlJyxcbiAgJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLXJlYWN0JyxcbiAgJ0B3aWxsYm9vc3Rlci93YicsXG4gICdhZ2VudC1ydW50aW1lLWtpdCcsXG4gICdhdC1kZWNvcmF0b3JzJyxcbiAgJ2J1aWxkLXRzJyxcbiAgJ2dlbi1pMThuLXRzJyxcbiAgJ29uZS13YXktZ2l0LXN5bmMnLFxuICAvLyAtLS0tLS0tLS0tIEVORDogV2UgYmVsaWV2ZSBvdXIgcGFja2FnZXMgYXJlIHNhZmUgLS0tLS0tLS0tLVxuXG4gIC8vIHdiZnkgcGlucyB0aGVzZSB0b29saW5nIHBhY2thZ2VzIGFuZCBtYXkgYXBwbHkgdGhlbSBpbW1lZGlhdGVseSBhZnRlciBhXG4gIC8vIHJlbGVhc2UsIGJlZm9yZSB0aGUgZ2xvYmFsIG1pbmltdW0tcmVsZWFzZS1hZ2Ugd2luZG93IGhhcyBlbGFwc2VkLlxuICAnQHR5cGVzY3JpcHQvbmF0aXZlLXByZXZpZXcnLFxuICAnQHR5cGVzY3JpcHQvbmF0aXZlLXByZXZpZXctZGFyd2luLWFybTY0JyxcbiAgJ0B0eXBlc2NyaXB0L25hdGl2ZS1wcmV2aWV3LWRhcndpbi14NjQnLFxuICAnQHR5cGVzY3JpcHQvbmF0aXZlLXByZXZpZXctbGludXgtYXJtJyxcbiAgJ0B0eXBlc2NyaXB0L25hdGl2ZS1wcmV2aWV3LWxpbnV4LWFybTY0JyxcbiAgJ0B0eXBlc2NyaXB0L25hdGl2ZS1wcmV2aWV3LWxpbnV4LXg2NCcsXG4gICdAdHlwZXNjcmlwdC9uYXRpdmUtcHJldmlldy13aW4zMi1hcm02NCcsXG4gICdAdHlwZXNjcmlwdC9uYXRpdmUtcHJldmlldy13aW4zMi14NjQnLFxuICAnb3hmbXQnLFxuICAnQG94Zm10L2JpbmRpbmctYW5kcm9pZC1hcm0tZWFiaScsXG4gICdAb3hmbXQvYmluZGluZy1hbmRyb2lkLWFybTY0JyxcbiAgJ0BveGZtdC9iaW5kaW5nLWRhcndpbi1hcm02NCcsXG4gICdAb3hmbXQvYmluZGluZy1kYXJ3aW4teDY0JyxcbiAgJ0BveGZtdC9iaW5kaW5nLWZyZWVic2QteDY0JyxcbiAgJ0BveGZtdC9iaW5kaW5nLWxpbnV4LWFybS1nbnVlYWJpaGYnLFxuICAnQG94Zm10L2JpbmRpbmctbGludXgtYXJtLW11c2xlYWJpaGYnLFxuICAnQG94Zm10L2JpbmRpbmctbGludXgtYXJtNjQtZ251JyxcbiAgJ0BveGZtdC9iaW5kaW5nLWxpbnV4LWFybTY0LW11c2wnLFxuICAnQG94Zm10L2JpbmRpbmctbGludXgtcHBjNjQtZ251JyxcbiAgJ0BveGZtdC9iaW5kaW5nLWxpbnV4LXJpc2N2NjQtZ251JyxcbiAgJ0BveGZtdC9iaW5kaW5nLWxpbnV4LXJpc2N2NjQtbXVzbCcsXG4gICdAb3hmbXQvYmluZGluZy1saW51eC1zMzkweC1nbnUnLFxuICAnQG94Zm10L2JpbmRpbmctbGludXgteDY0LWdudScsXG4gICdAb3hmbXQvYmluZGluZy1saW51eC14NjQtbXVzbCcsXG4gICdAb3hmbXQvYmluZGluZy1vcGVuaGFybW9ueS1hcm02NCcsXG4gICdAb3hmbXQvYmluZGluZy13aW4zMi1hcm02NC1tc3ZjJyxcbiAgJ0BveGZtdC9iaW5kaW5nLXdpbjMyLWlhMzItbXN2YycsXG4gICdAb3hmbXQvYmluZGluZy13aW4zMi14NjQtbXN2YycsXG4gICdveGxpbnQnLFxuICAnQG94bGludC9iaW5kaW5nLWFuZHJvaWQtYXJtLWVhYmknLFxuICAnQG94bGludC9iaW5kaW5nLWFuZHJvaWQtYXJtNjQnLFxuICAnQG94bGludC9iaW5kaW5nLWRhcndpbi1hcm02NCcsXG4gICdAb3hsaW50L2JpbmRpbmctZGFyd2luLXg2NCcsXG4gICdAb3hsaW50L2JpbmRpbmctZnJlZWJzZC14NjQnLFxuICAnQG94bGludC9iaW5kaW5nLWxpbnV4LWFybS1nbnVlYWJpaGYnLFxuICAnQG94bGludC9iaW5kaW5nLWxpbnV4LWFybS1tdXNsZWFiaWhmJyxcbiAgJ0BveGxpbnQvYmluZGluZy1saW51eC1hcm02NC1nbnUnLFxuICAnQG94bGludC9iaW5kaW5nLWxpbnV4LWFybTY0LW11c2wnLFxuICAnQG94bGludC9iaW5kaW5nLWxpbnV4LXBwYzY0LWdudScsXG4gICdAb3hsaW50L2JpbmRpbmctbGludXgtcmlzY3Y2NC1nbnUnLFxuICAnQG94bGludC9iaW5kaW5nLWxpbnV4LXJpc2N2NjQtbXVzbCcsXG4gICdAb3hsaW50L2JpbmRpbmctbGludXgtczM5MHgtZ251JyxcbiAgJ0BveGxpbnQvYmluZGluZy1saW51eC14NjQtZ251JyxcbiAgJ0BveGxpbnQvYmluZGluZy1saW51eC14NjQtbXVzbCcsXG4gICdAb3hsaW50L2JpbmRpbmctb3Blbmhhcm1vbnktYXJtNjQnLFxuICAnQG94bGludC9iaW5kaW5nLXdpbjMyLWFybTY0LW1zdmMnLFxuICAnQG94bGludC9iaW5kaW5nLXdpbjMyLWlhMzItbXN2YycsXG4gICdAb3hsaW50L2JpbmRpbmctd2luMzIteDY0LW1zdmMnLFxuICAnb3hsaW50LXRzZ29saW50JyxcbiAgJ0BveGxpbnQtdHNnb2xpbnQvZGFyd2luLWFybTY0JyxcbiAgJ0BveGxpbnQtdHNnb2xpbnQvZGFyd2luLXg2NCcsXG4gICdAb3hsaW50LXRzZ29saW50L2xpbnV4LWFybTY0JyxcbiAgJ0BveGxpbnQtdHNnb2xpbnQvbGludXgteDY0JyxcbiAgJ0BveGxpbnQtdHNnb2xpbnQvd2luMzItYXJtNjQnLFxuICAnQG94bGludC10c2dvbGludC93aW4zMi14NjQnLFxuICAnQG5leHQvZW52JyxcbiAgJ0BuZXh0L2ZvbnQnLFxuICAnQG5leHQvcnNwYWNrLWJpbmRpbmctbGludXgtYXJtNjQtZ251JyxcbiAgJ0BuZXh0L3JzcGFjay1iaW5kaW5nLWxpbnV4LWFybTY0LW11c2wnLFxuICAnQG5leHQvcnNwYWNrLWJpbmRpbmctbGludXgteDY0LWdudScsXG4gICdAbmV4dC9yc3BhY2stYmluZGluZy1saW51eC14NjQtbXVzbCcsXG4gICdAbmV4dC9zd2MtYW5kcm9pZC1hcm0tZWFiaScsXG4gICdAbmV4dC9zd2MtYW5kcm9pZC1hcm02NCcsXG4gICdAbmV4dC9zd2MtZGFyd2luLWFybTY0JyxcbiAgJ0BuZXh0L3N3Yy1kYXJ3aW4teDY0JyxcbiAgJ0BuZXh0L3N3Yy1mcmVlYnNkLXg2NCcsXG4gICdAbmV4dC9zd2MtbGludXgtYXJtLWdudWVhYmloZicsXG4gICdAbmV4dC9zd2MtbGludXgtYXJtNjQtZ251JyxcbiAgJ0BuZXh0L3N3Yy1saW51eC1hcm02NC1tdXNsJyxcbiAgJ0BuZXh0L3N3Yy1saW51eC14NjQtZ251JyxcbiAgJ0BuZXh0L3N3Yy1saW51eC14NjQtbXVzbCcsXG4gICdAbmV4dC9zd2Mtd2FzbS1ub2RlanMnLFxuICAnQG5leHQvc3djLXdhc20td2ViJyxcbiAgJ0BuZXh0L3RoaXJkLXBhcnRpZXMnLFxuICAnbmV4dCcsXG4gICdyZWFjdCcsXG4gICdyZWFjdC1kb20nLFxuXTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQnVuZmlnVG9tbChjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUJ1bmZpZ1RvbWwnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdidW5maWcudG9tbCcpO1xuICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpID8gZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmOCcpIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGNvbnRlbnQgPSBuZXdDb250ZW50KGV4aXN0aW5nQ29udGVudCk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmNvbnN0IG5ld0NvbnRlbnQgPSAoZXhpc3RpbmdDb250ZW50OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBidW5maWdUb21sID0gcGFyc2VCdW5maWdUb21sKGV4aXN0aW5nQ29udGVudCk7XG4gIHJldHVybiBgZW52ID0gZmFsc2VcbnRlbGVtZXRyeSA9IGZhbHNlXG5cbiR7Z2VuZXJhdGVSdW5TZWN0aW9uKGJ1bmZpZ1RvbWwpfVxuW2luc3RhbGxdXG5leGFjdCA9ICR7YnVuZmlnVG9tbD8uaW5zdGFsbD8uZXhhY3QgPT09IGZhbHNlID8gJ2ZhbHNlJyA6ICd0cnVlJ31cbmxpbmtlciA9IFwiaG9pc3RlZFwiXG5taW5pbXVtUmVsZWFzZUFnZSA9IDQzMjAwMCAjIDUgZGF5c1xubWluaW11bVJlbGVhc2VBZ2VFeGNsdWRlcyA9IFtcbiR7bWluaW11bVJlbGVhc2VBZ2VFeGNsdWRlcy5tYXAoKHBhY2thZ2VOYW1lKSA9PiBgICAgIFwiJHtwYWNrYWdlTmFtZX1cIixgKS5qb2luKCdcXG4nKX1cbl1cbmA7XG59O1xuXG5mdW5jdGlvbiBwYXJzZUJ1bmZpZ1RvbWwoY29udGVudDogc3RyaW5nIHwgdW5kZWZpbmVkKTogQnVuZmlnVG9tbCB8IHVuZGVmaW5lZCB7XG4gIGlmICghY29udGVudCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgdHJ5IHtcbiAgICByZXR1cm4gcGFyc2UoY29udGVudCkgYXMgQnVuZmlnVG9tbDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZVJ1blNlY3Rpb24oYnVuZmlnVG9tbDogQnVuZmlnVG9tbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIHJldHVybiB0eXBlb2YgYnVuZmlnVG9tbD8ucnVuPy5idW4gPT09ICdib29sZWFuJyA/IGBbcnVuXVxcbmJ1biA9ICR7YnVuZmlnVG9tbC5ydW4uYnVufVxcbmAgOiAnJztcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcblxuY29uc3QgdXNlckNvbnRlbnRIZWFkZXIgPSAnIyBQcm9qZWN0LXNwZWNpZmljIHNldHRpbmdzJztcbmNvbnN0IHVzZXJDb250ZW50SGVhZGVyUmVnZXggPSAvIyBQcm9qZWN0LXNwZWNpZmljIHNldHRpbmdzW15cXG5dKlxcbi9nbTtcbmNvbnN0IHNlcGFyYXRvciA9ICcjIEdlbmVyYXRlZCBieSB3YmZ5JztcbmNvbnN0IHNlcGFyYXRvclByZWZpeCA9ICcjIEdlbmVyYXRlZCBieSAnO1xuY29uc3QgZGVmYXVsdEhlYWRVc2VyQ29udGVudCA9IGAke3VzZXJDb250ZW50SGVhZGVyfSAoaGVhZClcblxuXG4ke3NlcGFyYXRvcn1cbmA7XG5jb25zdCBkZWZhdWx0VGFpbFVzZXJDb250ZW50ID0gYFxuJHt1c2VyQ29udGVudEhlYWRlcn0gKHRhaWwpXG5gO1xuXG5leHBvcnQgY29uc3QgaWdub3JlRmlsZVV0aWwgPSB7XG4gIHNlcGFyYXRvcixcbiAgc2VwYXJhdG9yUHJlZml4LFxuICBkZWZhdWx0SGVhZFVzZXJDb250ZW50LFxuICBkZWZhdWx0VGFpbFVzZXJDb250ZW50LFxuICBhc3luYyByZWFkR2l0aWdub3JlV2l0aG91dFNlcGFyYXRvcnMoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGxldCBjb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBsYXN0SGVhZGVySW5kZXggPSBnZXRJbmRleE9mVGFpbFVzZXJDb250ZW50SGVhZGVyKGNvbnRlbnQpO1xuICAgICAgaWYgKGxhc3RIZWFkZXJJbmRleCA+IDApIHtcbiAgICAgICAgY29udGVudCA9IGNvbnRlbnQuc2xpY2UoMCwgbGFzdEhlYWRlckluZGV4IC0gMSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gKFxuICAgICAgICBjb250ZW50XG4gICAgICAgICAgLnJlcGxhY2VBbGwodXNlckNvbnRlbnRIZWFkZXJSZWdleCwgJycpXG4gICAgICAgICAgLnJlcGxhY2VBbGwoLyMgR2VuZXJhdGVkIGJ5IFteXFxuXSpcXG4vZ20sICcnKVxuICAgICAgICAgIC5yZXBsYWNlQWxsKC9cXHI/XFxuXFxyP1xcbihcXHI/XFxuKSsvZ20sICdcXG5cXG4nKVxuICAgICAgICAgIC50cmltKCkgKyAnXFxuJ1xuICAgICAgKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gIH0sXG4gIGdldEhlYWRVc2VyQ29udGVudChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGluZGV4ID0gY29udGVudC5pbmRleE9mKHRoaXMuc2VwYXJhdG9yUHJlZml4KTtcbiAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICByZXR1cm4gY29udGVudFxuICAgICAgICAuc2xpY2UoMCwgY29udGVudC5pbmRleE9mKCdcXG4nLCBpbmRleCkgKyAxKVxuICAgICAgICAucmVwbGFjZUFsbCh1c2VyQ29udGVudEhlYWRlclJlZ2V4LCBgJHt1c2VyQ29udGVudEhlYWRlcn0gKGhlYWQpXFxuYCk7XG4gICAgfVxuICAgIHJldHVybiBkZWZhdWx0SGVhZFVzZXJDb250ZW50O1xuICB9LFxuICBnZXRUYWlsVXNlckNvbnRlbnQoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBsYXN0SGVhZGVySW5kZXggPSBnZXRJbmRleE9mVGFpbFVzZXJDb250ZW50SGVhZGVyKGNvbnRlbnQpO1xuICAgIGlmIChsYXN0SGVhZGVySW5kZXggPiAwKSB7XG4gICAgICByZXR1cm4gY29udGVudC5zbGljZShsYXN0SGVhZGVySW5kZXggLSAxKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlZmF1bHRUYWlsVXNlckNvbnRlbnQ7XG4gIH0sXG4gIGFzeW5jIGlzQmVycnlaZXJvSW5zdGFsbEVuYWJsZWQoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICByZXR1cm4gY29udGVudC5pbmNsdWRlcygnXFxuIS55YXJuL2NhY2hlJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LFxufTtcblxuZnVuY3Rpb24gZ2V0SW5kZXhPZlRhaWxVc2VyQ29udGVudEhlYWRlcihjb250ZW50OiBzdHJpbmcpOiBudW1iZXIge1xuICBjb25zdCBpbmRleCA9IGNvbnRlbnQuaW5kZXhPZih1c2VyQ29udGVudEhlYWRlcik7XG4gIGNvbnN0IGxhc3RJbmRleCA9IGNvbnRlbnQubGFzdEluZGV4T2YodXNlckNvbnRlbnRIZWFkZXIpO1xuICByZXR1cm4gbGFzdEluZGV4ID4gaW5kZXggPyBsYXN0SW5kZXggOiAtMTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBpZ25vcmVGaWxlVXRpbCB9IGZyb20gJy4uL3V0aWxzL2lnbm9yZUZpbGVVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG4vLyBFeGVyY29kZeOBp+OBr25vZGVfbW9kdWxlc+OCkkNPUFnjgZnjgovlv4XopoHjgYzjgYLjgovjgZ/jgoHjgIFub2RlX21vZHVsZXPjgpLpmaTlpJbjgZfjgabjga/jgYTjgZHjgarjgYTjgIJcbmNvbnN0IGNvbW1vbkNvbnRlbnQgPSBgXG4qKi8uaWRlYVxuKiovKi5zcWxpdGUzKlxuKiovLnlhcm4vaW5zdGFsbC1zdGF0ZS5nelxuKiovLnZlbnZcbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZURvY2tlcmlnbm9yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZURvY2tlcmlnbm9yZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5kb2NrZXJpZ25vcmUnKTtcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluRG9ja2VyZmlsZSkge1xuICAgICAgY29uc3QgY29udGVudCA9IChhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoKSkgPz8gJyc7XG4gICAgICBjb25zdCBoZWFkVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRIZWFkVXNlckNvbnRlbnQoY29udGVudCk7XG4gICAgICBjb25zdCB0YWlsVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRUYWlsVXNlckNvbnRlbnQoY29udGVudCk7XG5cbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBoZWFkVXNlckNvbnRlbnQgKyBjb21tb25Db250ZW50ICsgdGFpbFVzZXJDb250ZW50O1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgfVxuICB9KTtcbn1cbiIsImV4cG9ydCBjb25zdCBleHRlbnNpb25zID0ge1xuICBjb2RlV2l0aDJJbmRlbnRTaXplOiBbXG4gICAgJ2NqcycsXG4gICAgJ21qcycsXG4gICAgJ2pzJyxcbiAgICAnanN4JyxcbiAgICAnY3RzJyxcbiAgICAnbXRzJyxcbiAgICAndHMnLFxuICAgICd0c3gnLFxuICAgICdqc29uJyxcbiAgICAnanNvbjUnLFxuICAgICdqc29uYycsXG4gICAgJ2NwcCcsXG4gICAgJ2RhcnQnLFxuICAgICdodG0nLFxuICAgICdodG1sJyxcbiAgICAncHUnLFxuICAgICdwdW1sJyxcbiAgICAncmInLFxuICAgICd2dWUnLFxuICAgICd4bWwnLFxuICAgICd5YW1sJyxcbiAgICAneW1sJyxcbiAgICAnc2gnLFxuICBdLnRvU29ydGVkKCksXG4gIGNvZGVXaXRoNEluZGVudFNpemU6IFsnZ28nLCAnZ3JhZGxlJywgJ2phdmEnLCAncHknXS50b1NvcnRlZCgpLFxuICBtYXJrZG93bkxpa2U6IFsnbWQnXS50b1NvcnRlZCgpLFxuICBveGxpbnQ6IFsnYXN0cm8nLCAnY2pzJywgJ2N0cycsICdqcycsICdqc3gnLCAnbWpzJywgJ210cycsICdzdmVsdGUnLCAndHMnLCAndHN4JywgJ3Z1ZSddLnRvU29ydGVkKCksXG4gIG94Zm10OiBbXG4gICAgJ2FzdHJvJyxcbiAgICAnY2pzJyxcbiAgICAnY3NzJyxcbiAgICAnY3RzJyxcbiAgICAnZ3FsJyxcbiAgICAnZ3JhcGhxbCcsXG4gICAgJ2hicycsXG4gICAgJ2h0bScsXG4gICAgJ2h0bWwnLFxuICAgICdqcycsXG4gICAgJ2pzb24nLFxuICAgICdqc29uNScsXG4gICAgJ2pzb25jJyxcbiAgICAnanN4JyxcbiAgICAnbGVzcycsXG4gICAgJ21kJyxcbiAgICAnbWR4JyxcbiAgICAnbWpzJyxcbiAgICAnbXRzJyxcbiAgICAnc2NzcycsXG4gICAgJ3N2ZWx0ZScsXG4gICAgJ3RvbWwnLFxuICAgICd0cycsXG4gICAgJ3RzeCcsXG4gICAgJ3Z1ZScsXG4gICAgJ3lhbWwnLFxuICAgICd5bWwnLFxuICBdLnRvU29ydGVkKCksXG4gIHByZXR0aWVyT25seTogWydqYXZhJ10udG9Tb3J0ZWQoKSxcbn07XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IG5ld0NvbnRlbnQgPSBgcm9vdCA9IHRydWVcblxuWypdXG5jaGFyc2V0ID0gdXRmLThcbmVuZF9vZl9saW5lID0gbGZcbmluc2VydF9maW5hbF9uZXdsaW5lID0gdHJ1ZVxudHJpbV90cmFpbGluZ193aGl0ZXNwYWNlID0gdHJ1ZVxuXG4ke2dlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zLmNvZGVXaXRoMkluZGVudFNpemUpfVxuaW5kZW50X3NpemUgPSAyXG5pbmRlbnRfc3R5bGUgPSBzcGFjZVxuXG4ke2dlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zLmNvZGVXaXRoNEluZGVudFNpemUpfVxuaW5kZW50X3NpemUgPSA0XG5pbmRlbnRfc3R5bGUgPSBzcGFjZVxuXG4ke2dlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zLm1hcmtkb3duTGlrZSl9XG5tYXhfbGluZV9sZW5ndGggPSBvZmZcbnRyaW1fdHJhaWxpbmdfd2hpdGVzcGFjZSA9IGZhbHNlXG5cblt7TWFrZWZpbGUsKi5ta31dXG5pbmRlbnRfc3R5bGUgPSB0YWJcbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUVkaXRvcmNvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUVkaXRvcmNvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lZGl0b3Jjb25maWcnKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGV4dGVuc2lvbnMubGVuZ3RoID4gMSA/IGBbKi57JHtleHRlbnNpb25zLmpvaW4oJywnKX19XWAgOiBgWyouJHtleHRlbnNpb25zWzBdfV1gO1xufVxuIiwiLy8gb3hsaW50LWRpc2FibGUgZXNsaW50LXBsdWdpbi1pbXBvcnQvbm8tbmFtZWQtYXMtZGVmYXVsdC1tZW1iZXIgLS0gTmFtZXNwYWNlIFlBTUwgY2FsbHMgbWFrZSBsb2FkL2R1bXAgdXNhZ2UgY2xlYXJlci5cbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IHlhbWwgZnJvbSAnanMteWFtbCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW1wb3J0IHsgZ2VuZXJhdGVBZ2VudENvZGluZ1N0eWxlIH0gZnJvbSAnLi9hZ2VudHMuanMnO1xuXG5jb25zdCBkZWZhdWx0Q29uZmlnID0ge1xuICBoYXZlX2Z1bjogdHJ1ZSxcbiAgY29kZV9yZXZpZXc6IHtcbiAgICBkaXNhYmxlOiBmYWxzZSxcbiAgICBjb21tZW50X3NldmVyaXR5X3RocmVzaG9sZDogJ01FRElVTScsXG4gICAgbWF4X3Jldmlld19jb21tZW50czogLTEsXG4gICAgcHVsbF9yZXF1ZXN0X29wZW5lZDoge1xuICAgICAgaGVscDogZmFsc2UsXG4gICAgICBzdW1tYXJ5OiB0cnVlLFxuICAgICAgY29kZV9yZXZpZXc6IHRydWUsXG4gICAgfSxcbiAgfSxcbiAgaWdub3JlX3BhdHRlcm5zOiBbJyoqL19fZ2VuZXJhdGVkX18nXSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUdlbWluaUNvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcsIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlR2VtaW5pQ29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghY29uZmlnLmlzUm9vdCkgcmV0dXJuO1xuXG4gICAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5nZW1pbmknKTtcbiAgICBjb25zdCBjb25maWdGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnY29uZmlnLnltbCcpO1xuICAgIGNvbnN0IHN0eWxlZ3VpZGVGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnc3R5bGVndWlkZS5tZCcpO1xuICAgIGNvbnN0IGFnZW50c0V4dHJhUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ0FHRU5UU19FWFRSQS5tZCcpO1xuXG4gICAgbGV0IG5ld0NvbmZpZzogb2JqZWN0ID0gc3RydWN0dXJlZENsb25lKGRlZmF1bHRDb25maWcpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoY29uZmlnRmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBvbGRDb25maWcgPSB5YW1sLmxvYWQob2xkQ29udGVudCkgYXMgb2JqZWN0O1xuICAgICAgbmV3Q29uZmlnID0gbWVyZ2UuYWxsKFtuZXdDb25maWcsIG9sZENvbmZpZywgbmV3Q29uZmlnXSwgeyBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmcgLSBmaWxlIGRvZXNuJ3QgZXhpc3Qgb3IgY2FuJ3QgYmUgcGFyc2VkXG4gICAgfVxuXG4gICAgY29uc3QgeWFtbENvbnRlbnQgPSB5YW1sLmR1bXAobmV3Q29uZmlnLCB7XG4gICAgICBsaW5lV2lkdGg6IC0xLFxuICAgICAgbm9Db21wYXRNb2RlOiB0cnVlLFxuICAgICAgc3R5bGVzOiB7XG4gICAgICAgICchIW51bGwnOiAnZW1wdHknLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGV4dHJhQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoYWdlbnRzRXh0cmFQYXRoKTtcbiAgICBjb25zdCBjb2RpbmdSdWxlRXh0cmFDb250ZW50ID0gZXh0cmFDb250ZW50Py50cmltU3RhcnQoKS5zdGFydHNXaXRoKCcjJykgPyB1bmRlZmluZWQgOiBleHRyYUNvbnRlbnQ7XG4gICAgY29uc3QgcmV2aWV3TGFuZ3VhZ2VJbnN0cnVjdGlvbiA9IGNvbmZpZy5pc1B1YmxpY1JlcG9cbiAgICAgID8gJ1JldmlldyBpbiBFbmdsaXNoIGJhc2VkIG9uIHRoZSBmb2xsb3dpbmcgY29kaW5nIHN0YW5kYXJkcy4nXG4gICAgICA6ICfku6XkuIvjga7jgrPjg7zjg4fjgqPjg7PjgrDopo/ntITjgpLouI/jgb7jgYjjgabjgIHml6XmnKzoqp7jgafjg6zjg5Pjg6Xjg7zjgZfjgabjgY/jgaDjgZXjgYTjgIInO1xuICAgIGNvbnN0IHN0eWxlZ3VpZGVDb250ZW50ID0gYCR7cmV2aWV3TGFuZ3VhZ2VJbnN0cnVjdGlvbn1cXG5cXG4ke2dlbmVyYXRlQWdlbnRDb2RpbmdTdHlsZShhbGxDb25maWdzKX0ke1xuICAgICAgY29kaW5nUnVsZUV4dHJhQ29udGVudCA/IGBcXG4ke2NvZGluZ1J1bGVFeHRyYUNvbnRlbnQudHJpbUVuZCgpfWAgOiAnJ1xuICAgIH1gO1xuXG4gICAgY29uc3QgcHJvbWlzZXMgPSBbXG4gICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShjb25maWdGaWxlUGF0aCwgeWFtbENvbnRlbnQpKSxcbiAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKHN0eWxlZ3VpZGVGaWxlUGF0aCwgc3R5bGVndWlkZUNvbnRlbnQpKSxcbiAgICBdO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW1vdmVHZW1pbmlTZXR0aW5ncyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdlbWluaVNldHRpbmdzJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghY29uZmlnLmlzUm9vdCkgcmV0dXJuO1xuXG4gICAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5nZW1pbmknKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnc2V0dGluZ3MuanNvbicpO1xuICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pO1xuICB9KTtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuLy8gY2YuIGh0dHBzOi8vYnVuLnNoL2d1aWRlcy9pbnN0YWxsL2dpdC1kaWZmLWJ1bi1sb2NrZmlsZVxuY29uc3QgbmV3Q29udGVudCA9IGAqIHRleHQ9YXV0b1xuXG4qLmxvY2tiIGJpbmFyeSBkaWZmPWxvY2tiXG4qLnZjcHJvaiB0ZXh0IGVvbD1jcmxmXG5cbiR7Wy4uLmV4dGVuc2lvbnMuY29kZVdpdGgySW5kZW50U2l6ZSwgLi4uZXh0ZW5zaW9ucy5jb2RlV2l0aDRJbmRlbnRTaXplLCAuLi5leHRlbnNpb25zLm1hcmtkb3duTGlrZV1cbiAgLm1hcCgoZXh0KSA9PiBgKi4ke2V4dH0gdGV4dCBlb2w9bGZgKVxuICAuam9pbignXFxuJyl9XG5cbmRpc3QvKiogbGluZ3Vpc3QtZ2VuZXJhdGVkPXRydWVcbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGF0dHJpYnV0ZXMnKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBvcyBmcm9tICdub2RlOm9zJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBpZ25vcmVGaWxlVXRpbCB9IGZyb20gJy4uL3V0aWxzL2lnbm9yZUZpbGVVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG4vLyBEbyBub3QgcmVtb3ZlIGB3aW5kb3dzYDogZ2VuZXJhdGVkIC5naXRpZ25vcmUgZmlsZXMgbXVzdCBrZWVwIGlnbm9yaW5nIFdpbmRvd3MtY3JlYXRlZCBsb2NhbCBhcnRpZmFjdHMuXG5jb25zdCBkZWZhdWx0TmFtZXMgPSBbJ3dpbmRvd3MnLCAnbWFjb3MnLCAnbGludXgnLCAnamV0YnJhaW5zJywgJ3Zpc3VhbHN0dWRpb2NvZGUnLCAnZW1hY3MnLCAndmltJywgJ3lhcm4nXTtcblxuY29uc3QgY29tbW9uQ29udGVudCA9IGBcbiEua2VlcFxuLmFpZGVyKlxuLmVudi5wcm9kdWN0aW9uXG4qL21vdW50LyouaGFzaFxuLmRldmNvbnRhaW5lci9cbi5pZGVhL0F1Z21lbnRXZWJ2aWV3U3RhdGVTdG9yZS54bWxcbi5pZGVhL2NvcGlsb3QuKlxuLmlkZWEvY29waWxvdC9jaGF0U2Vzc2lvbnMvXG4ucGxheXdyaWdodC1jbGkvXG4uc2VyZW5hL1xuLnRtcC9cbi53Yi9cbl9fZ2VuZXJhdGVkX18vXG5Ad2lsbGJvb3N0ZXIvXG5kaXN0L1xuZHJpenpsZS9tb3VudC9cbnRlbXAvXG50bXAvXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHaXRpZ25vcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHaXRpZ25vcmUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aWdub3JlJyk7XG4gICAgY29uc3QgY29udGVudCA9IChhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoKSkgPz8gJyc7XG4gICAgbGV0IGhlYWRVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldEhlYWRVc2VyQ29udGVudChjb250ZW50KSArIGNvbW1vbkNvbnRlbnQ7XG4gICAgY29uc3QgdGFpbFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0VGFpbFVzZXJDb250ZW50KGNvbnRlbnQpO1xuXG4gICAgY29uc3QgbmFtZXMgPSBbLi4uZGVmYXVsdE5hbWVzXTtcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluR2VtZmlsZSkge1xuICAgICAgbmFtZXMucHVzaCgncnVieScpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluR29Nb2QpIHtcbiAgICAgIG5hbWVzLnB1c2goJ2dvJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYCR7cGF0aC5iYXNlbmFtZShjb25maWcuZGlyUGF0aCl9XG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24pIHtcbiAgICAgIG5hbWVzLnB1c2goJ25vZGUnKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvbVhtbCkge1xuICAgICAgbmFtZXMucHVzaCgnbWF2ZW4nKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLmlkZWEvZ29vZ2xlLWphdmEtZm9ybWF0LnhtbFxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBuYW1lcy5wdXNoKCdmbHV0dGVyJywgJ0FuZHJvaWRTdHVkaW8nLCAncnVieScpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuZmx1dHRlci1wbHVnaW5zLWRlcGVuZGVuY2llc1xuYW5kcm9pZC9rZXkucHJvcGVydGllc1xuaW9zLy5idW5kbGVcbi5pZGVhL3J1bkNvbmZpZ3VyYXRpb25zLnhtbFxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblRlbXBsYXRlWWFtbCkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuYXdzLXNhbS9cbnBhY2thZ2VkLnlhbWxcbmA7XG4gICAgfVxuICAgIC8vIEJlY2F1c2UgLnZlbnYgc2hvdWxkIGJlIGlnbm9yZWQgb24gcm9vdCBkaXJlY3RvcnlcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jayB8fCBjb25maWcuZG9lc0NvbnRhaW5VdkxvY2spIHtcbiAgICAgIG5hbWVzLnB1c2goJ3B5dGhvbicpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAudmVudi9cbmA7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHopIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLmJsaXR6L1xuLmJsaXR6KipcbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLm5leHQpIHtcbiAgICAgIG5hbWVzLnB1c2goJ25leHRqcycpO1xuICAgIH1cbiAgICBpZiAocm9vdENvbmZpZy5kZXBlbmRpbmcuZmlyZWJhc2UgfHwgY29uZmlnLmRlcGVuZGluZy5maXJlYmFzZSkge1xuICAgICAgbmFtZXMucHVzaCgnZmlyZWJhc2UnKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHJpc21hKSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYCouc3FsaXRlMypcbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRUZXN0KSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYHBsYXl3cmlnaHQtcmVwb3J0L1xudGVzdC1yZXN1bHRzL1xuYDtcbiAgICB9XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlIHx8IGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICAgIG5hbWVzLnB1c2goJ3JlYWN0bmF0aXZlJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYGdvb2dsZS1zZXJ2aWNlcy5qc29uXG5hbmRyb2lkL2FwcC9zcmMvbWFpbi9hc3NldHMvXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5zdG9yeWJvb2spIHtcbiAgICAgIG5hbWVzLnB1c2goJ3N0b3J5Ym9va2pzJyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLmxpdGVzdHJlYW0pIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgZ2NwLXNhLWtleS5qc29uXG5gO1xuICAgIH1cblxuICAgIGxldCBnZW5lcmF0ZWQgPSAnJztcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcbiAgICAgIGxldCBjb250ZW50ID0gKGF3YWl0IHJlYWRDYWNoZShuYW1lKSkgPz8gJyc7XG4gICAgICBpZiAoIWNvbnRlbnQpIHtcbiAgICAgICAgY29uc3QgdXJsID0gYGh0dHBzOi8vd3d3LnRvcHRhbC5jb20vZGV2ZWxvcGVycy9naXRpZ25vcmUvYXBpLyR7bmFtZX1gO1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCk7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlVGV4dCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgICAgICAgaWYgKCFyZXNwb25zZS5vayB8fCByZXNwb25zZVRleHQuaW5jbHVkZXMoJ0F0dGVudGlvbiBSZXF1aXJlZCEnKSB8fCByZXNwb25zZVRleHQuaW5jbHVkZXMoJzx0aXRsZT4nKSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBmZXRjaCAke3VybH1gKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29udGVudCA9IHJlc3BvbnNlVGV4dC50cmltKCk7XG4gICAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiB3cml0ZUNhY2hlKG5hbWUsIGNvbnRlbnQpKTtcbiAgICAgICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKGBGZXRjaGVkICR7dXJsfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZ2VuZXJhdGVkKSBnZW5lcmF0ZWQgKz0gJ1xcbic7XG4gICAgICBnZW5lcmF0ZWQgKz0gY29udGVudCArICdcXG4nO1xuICAgIH1cbiAgICBpZiAoIShhd2FpdCBpZ25vcmVGaWxlVXRpbC5pc0JlcnJ5WmVyb0luc3RhbGxFbmFibGVkKGZpbGVQYXRoKSkpIHtcbiAgICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZC5yZXBsYWNlKCchLnlhcm4vY2FjaGUnLCAnIyAhLnlhcm4vY2FjaGUnKS5yZXBsYWNlKCcjIC5wbnAuKicsICcucG5wLionKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvbVhtbCB8fCBjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL2FydGlmYWN0cyQvZ20sICcuaWRlYS9hcnRpZmFjdHMnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9jb21waWxlci54bWwkL2dtLCAnLmlkZWEvY29tcGlsZXIueG1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvamFyUmVwb3NpdG9yaWVzLnhtbCQvZ20sICcuaWRlYS9qYXJSZXBvc2l0b3JpZXMueG1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvbW9kdWxlcy54bWwkL2dtLCAnLmlkZWEvbW9kdWxlcy54bWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC8qLmltbCQvZ20sICcuaWRlYS8qLmltbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL21vZHVsZXMkL2dtLCAnLmlkZWEvbW9kdWxlcycpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAqLmltbCQvZ20sICcqLmltbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAqLmlwciQvZ20sICcqLmlwcicpO1xuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZC5yZXBsYWNlQWxsKC9eLmlkZWFcXC9tb2R1bGVzLnhtbCQvZ20sICcjIC5pZGVhL21vZHVsZXMueG1sJyk7XG4gICAgICB9XG4gICAgfVxuICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZC5yZXBsYWNlQWxsKC9eLmlkZWFcXC8/JC9nbSwgJyMgLmlkZWEnKTtcbiAgICBpZiAocm9vdENvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUgfHwgY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSB8fCBjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2VBbGwoL14oLmlkZWFcXC8uKykkL2dtLCAnJDFcXG5hbmRyb2lkLyQxJyk7XG4gICAgfVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBoZWFkVXNlckNvbnRlbnQgKyAnXFxuJyArIGdlbmVyYXRlZCArIHRhaWxVc2VyQ29udGVudDtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuY29uc3QgZGlyUGF0aCA9IHBhdGguam9pbihvcy5ob21lZGlyKCksICcuY2FjaGUnLCAnd2JmeScsICdnaXRpZ25vcmUnKTtcblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVDYWNoZShuYW1lOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihkaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGguam9pbihkaXJQYXRoLCBuYW1lKSwgY29udGVudCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRDYWNoZShuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IHN0YXQgPSBhd2FpdCBmcy5wcm9taXNlcy5zdGF0KHBhdGguam9pbihkaXJQYXRoLCBuYW1lKSk7XG4gICAgaWYgKERhdGUubm93KCkgLSBzdGF0Lm10aW1lTXMgPiA2ICogNjAgKiA2MCAqIDEwMDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHBhdGguam9pbihkaXJQYXRoLCBuYW1lKSwgJ3V0ZjgnKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgZG9lc0NvbnRhaW5KYXZhLCBkb2VzQ29udGFpbkpzT3JUcyB9IGZyb20gJy4uL3V0aWxzL3BhY2thZ2VDYXBhYmlsaXRpZXMuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbi8vIEtlZXAgcGFja2FnZS1tYW5hZ2VyIHNoaW1zIGluIHRoZSBGaWxlIFdhdGNoZXIgcHJvZ3JhbSBmaWVsZCBzbyBub2RlIGRvZXMgbm90XG4vLyBwYXJzZSB3cmFwcGVyIHNjcmlwdHMgcGFzc2VkIHRocm91Z2ggYXJndW1lbnRzLlxuY29uc3Qgb3hmbXRQcm9ncmFtID0gJyRQcm9qZWN0RmlsZURpciQvbm9kZV9tb2R1bGVzLy5iaW4vb3hmbXQnO1xuY29uc3QgcHJldHRpZXJQcm9ncmFtID0gJyRQcm9qZWN0RmlsZURpciQvbm9kZV9tb2R1bGVzLy5iaW4vcHJldHRpZXInO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVJZGVhU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVJZGVhU2V0dGluZ3MnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5pZGVhJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoZGlyUGF0aCkpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICd3YXRjaGVyVGFza3MueG1sJyk7XG4gICAgICBhd2FpdCAoZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKSB8fCBkb2VzQ29udGFpbkphdmEoY29uZmlnKVxuICAgICAgICA/IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBnZXRXYXRjaGVyVGFza3NDb250ZW50KGNvbmZpZykpKVxuICAgICAgICA6IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSkpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldFdhdGNoZXJUYXNrc0NvbnRlbnQoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgY29uc3QgdGFza09wdGlvbnMgPSBbXG4gICAge1xuICAgICAgYXJnczogJy0td3JpdGUgLS1uby1lcnJvci1vbi11bm1hdGNoZWQtcGF0dGVybiAhKiovcGFja2FnZS5qc29uJyxcbiAgICAgIGNvbmRpdGlvbjogZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKSxcbiAgICAgIGV4dGVuc2lvbnM6IGV4dGVuc2lvbnMub3hmbXQsXG4gICAgICBuYW1lOiAnT3hmbXQnLFxuICAgICAgcHJvZ3JhbTogb3hmbXRQcm9ncmFtLFxuICAgIH0sXG4gICAge1xuICAgICAgYXJnczogJy0tY2FjaGUgLS13cml0ZScsXG4gICAgICBjb25kaXRpb246IGRvZXNDb250YWluSmF2YShjb25maWcpLFxuICAgICAgZXh0ZW5zaW9uczogZXh0ZW5zaW9ucy5wcmV0dGllck9ubHksXG4gICAgICBuYW1lOiAnUHJldHRpZXInLFxuICAgICAgcHJvZ3JhbTogcHJldHRpZXJQcm9ncmFtLFxuICAgIH0sXG4gIF1cbiAgICAuZmlsdGVyKCh0YXNrKSA9PiB0YXNrLmNvbmRpdGlvbilcbiAgICAuZmxhdE1hcCgodGFzaykgPT4gdGFzay5leHRlbnNpb25zLm1hcCgoZXh0KSA9PiBjcmVhdGVUYXNrT3B0aW9ucyh0YXNrLnByb2dyYW0sIHRhc2suYXJncywgdGFzay5uYW1lLCBleHQpKSk7XG5cbiAgcmV0dXJuIGA8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cbjxwcm9qZWN0IHZlcnNpb249XCI0XCI+XG4gIDxjb21wb25lbnQgbmFtZT1cIlByb2plY3RUYXNrc09wdGlvbnNcIj5cbiAgICAke3Rhc2tPcHRpb25zLmpvaW4oJycpfVxuICA8L2NvbXBvbmVudD5cbjwvcHJvamVjdD5cbmA7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVRhc2tPcHRpb25zKHJ1bm5lcjogc3RyaW5nLCBhcmdzOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgZXh0ZW5zaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCAgICA8VGFza09wdGlvbnMgaXNFbmFibGVkPVwidHJ1ZVwiPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiYXJndW1lbnRzXCIgdmFsdWU9XCIke2FyZ3N9ICRGaWxlUGF0aFJlbGF0aXZlVG9Qcm9qZWN0Um9vdCRcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiY2hlY2tTeW50YXhFcnJvcnNcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImRlc2NyaXB0aW9uXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImV4aXRDb2RlQmVoYXZpb3JcIiB2YWx1ZT1cIkVSUk9SXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImZpbGVFeHRlbnNpb25cIiB2YWx1ZT1cIiR7ZXh0ZW5zaW9ufVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJpbW1lZGlhdGVTeW5jXCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJuYW1lXCIgdmFsdWU9XCIke25hbWV9ICguJHtleHRlbnNpb259KVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJvdXRwdXRcIiB2YWx1ZT1cIiRGaWxlUGF0aFJlbGF0aXZlVG9Qcm9qZWN0Um9vdCRcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwib3V0cHV0RmlsdGVyc1wiPlxuICAgICAgICA8YXJyYXkgLz5cbiAgICAgIDwvb3B0aW9uPlxuICAgICAgPG9wdGlvbiBuYW1lPVwib3V0cHV0RnJvbVN0ZG91dFwiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwicHJvZ3JhbVwiIHZhbHVlPVwiJHtydW5uZXJ9XCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cInJ1bk9uRXh0ZXJuYWxDaGFuZ2VzXCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJzY29wZU5hbWVcIiB2YWx1ZT1cIlByb2plY3QgRmlsZXNcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwidHJhY2tPbmx5Um9vdFwiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwid29ya2luZ0RpclwiIHZhbHVlPVwiJFByb2plY3RGaWxlRGlyJFwiIC8+XG4gICAgICA8ZW52cyAvPlxuICAgIDwvVGFza09wdGlvbnM+XG5gO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0R2VuSTE4blRzQ29tbWFuZChcbiAgY29uZmlnOiBQaWNrPFBhY2thZ2VDb25maWcsICdkZXBlbmRpbmcnIHwgJ2lzQnVuJz4sXG4gIHNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMgfCB1bmRlZmluZWRcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghY29uZmlnLmRlcGVuZGluZy5nZW5JMThuVHMgfHwgIXNjcmlwdHM/LlsnZ2VuLWkxOG4tdHMnXSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIGAke2NvbmZpZy5pc0J1biA/ICdidW4nIDogJ3lhcm4nfSBydW4gZ2VuLWkxOG4tdHMgPiAvZGV2L251bGxgO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBTcGF3blN5bmNPcHRpb25zIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3blN5bmMoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcsIHJldHJ5ID0gMCk6IHZvaWQge1xuICBzcGF3blN5bmNBbmRSZXR1cm5TdGF0dXMoY29tbWFuZCwgYXJncywgY3dkLCByZXRyeSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3blN5bmNBbmRSZXR1cm5TdGF0dXMoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcsIHJldHJ5ID0gMCk6IG51bWJlciB7XG4gIGRvIHtcbiAgICBjb25zdCBbbmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zXSA9IGdldFNwYXduU3luY0FyZ3MoY29tbWFuZCwgYXJncywgY3dkKTtcbiAgICBjb25zb2xlLmxvZyhgJCAke25ld0NtZH0gJHtuZXdBcmdzLmpvaW4oJyAnKX0gYXQgJHtjd2R9YCk7XG4gICAgY29uc3QgcmV0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMobmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zKTtcbiAgICBjb25zdCBzdGF0dXMgPSByZXQuc3RhdHVzID8/IDE7XG4gICAgaWYgKHN0YXR1cyA9PT0gMCkgYnJlYWs7XG4gICAgaWYgKHJldHJ5IDw9IDApIHJldHVybiBzdGF0dXM7XG4gIH0gd2hpbGUgKC0tcmV0cnkgPj0gMCk7XG4gIHJldHVybiAwO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgW25ld0NtZCwgbmV3QXJncywgb3B0aW9uc10gPSBnZXRTcGF3blN5bmNBcmdzKGNvbW1hbmQsIGFyZ3MsIGN3ZCk7XG4gIG9wdGlvbnMuc3RkaW8gPSAncGlwZSc7XG4gIGNvbnN0IHByb2MgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnMpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvbiAtLSBzcGF3blN5bmMgcmV0dXJucyBudWxsIHN0ZGVyciBvbiBFTk9FTlQuXG4gIGNvbnN0IHN0ZGVyciA9IHByb2Muc3RkZXJyID8/ICcnO1xuICBjb25zdCBlcnJvciA9IHR5cGVvZiBzdGRlcnIgPT09ICdzdHJpbmcnID8gc3RkZXJyLnRyaW0oKSA6IHN0ZGVyci50b1N0cmluZygpLnRyaW0oKTtcbiAgaWYgKHByb2MuZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKGAke25ld0NtZH0gWyR7bmV3QXJncy5tYXAoKHMpID0+IGBcIiR7c31cImApLmpvaW4oJywgJyl9XSBmYWlsZWQgd2l0aDogJHtwcm9jLmVycm9yLm1lc3NhZ2V9YCk7XG4gIH0gZWxzZSBpZiAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgYCR7bmV3Q21kfSBbJHtuZXdBcmdzLm1hcCgocykgPT4gYFwiJHtzfVwiYCkuam9pbignLCAnKX1dIG91dHB1dHMgdGhlIGZvbGxvd2luZyBjb250ZW50IHRvIHN0ZGVycjpcXG4ke2Vycm9yfWBcbiAgICApO1xuICB9XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uIC0tIHNwYXduU3luYyByZXR1cm5zIG51bGwgc3Rkb3V0IG9uIEVOT0VOVC5cbiAgY29uc3Qgc3Rkb3V0ID0gcHJvYy5zdGRvdXQgPz8gJyc7XG4gIHJldHVybiB0eXBlb2Ygc3Rkb3V0ID09PSAnc3RyaW5nJyA/IHN0ZG91dC50cmltKCkgOiBzdGRvdXQudG9TdHJpbmcoKS50cmltKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTcGF3blN5bmNBcmdzKGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nKTogW3N0cmluZywgc3RyaW5nW10sIFNwYXduU3luY09wdGlvbnNdIHtcbiAgY29uc3QgZW52ID0geyAuLi5wcm9jZXNzLmVudiB9O1xuICAvLyBSZW1vdmUgYmVycnkgZnJvbSBQQVRIXG4gIGlmIChlbnYuUEFUSCAmJiBlbnYuQkVSUllfQklOX0ZPTERFUikge1xuICAgIGVudi5QQVRIID0gZW52LlBBVEguc3BsaXQoJzonKVxuICAgICAgLmZpbHRlcigocCkgPT4gcCAhPT0gZW52LkJFUlJZX0JJTl9GT0xERVIpXG4gICAgICAuam9pbignOicpO1xuICB9XG5cbiAgcmV0dXJuIFtcbiAgICBjb21tYW5kLFxuICAgIGFyZ3MsXG4gICAge1xuICAgICAgY3dkLFxuICAgICAgZW52LFxuICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICAgIHNoZWxsOiBmYWxzZSxcbiAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgfSxcbiAgXTtcbn1cbiIsImltcG9ydCBjaGlsZFByb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHsgT2N0b2tpdCB9IGZyb20gJ0BvY3Rva2l0L2NvcmUnO1xuXG5jbGFzcyBHaXRIdWJVdGlsIHtcbiAgZ2V0T3JnQW5kTmFtZSh1cmxPckZ1bGxOYW1lOiBzdHJpbmcpOiBbc3RyaW5nLCBzdHJpbmddIHtcbiAgICBjb25zdCB1cmxXaXRob3V0UHJvdG9jb2wgPSB1cmxPckZ1bGxOYW1lLnNwbGl0KCc6JykuYXQoLTEpO1xuICAgIGNvbnN0IG5hbWVzID0gdXJsV2l0aG91dFByb3RvY29sPy5zcGxpdCgnLycpO1xuICAgIGNvbnN0IG9yZyA9IG5hbWVzPy5hdCgtMikgPz8gJyc7XG4gICAgY29uc3QgbmFtZSA9IG5hbWVzPy5hdCgtMSk/LnJlcGxhY2UoLy5naXQkLywgJycpID8/ICcnO1xuICAgIHJldHVybiBbb3JnLCBuYW1lXTtcbiAgfVxufVxuZXhwb3J0IGNvbnN0IGdpdEh1YlV0aWwgPSBuZXcgR2l0SHViVXRpbCgpO1xuXG5jb25zdCBvY3Rva2l0Q2FjaGUgPSBuZXcgTWFwPHN0cmluZywgT2N0b2tpdD4oKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldE9jdG9raXQob3duZXI/OiBzdHJpbmcpOiBPY3Rva2l0IHtcbiAgY29uc3Qga2V5ID0gb3duZXIgPz8gJyc7XG4gIGNvbnN0IGNhY2hlZCA9IG9jdG9raXRDYWNoZS5nZXQoa2V5KTtcbiAgaWYgKGNhY2hlZCkgcmV0dXJuIGNhY2hlZDtcblxuICBjb25zdCBvY3Rva2l0ID0gbmV3IE9jdG9raXQoe1xuICAgIGF1dGg6IGdldEdpdEh1YlRva2VuKG93bmVyKSB8fCB1bmRlZmluZWQsXG4gIH0pO1xuICBvY3Rva2l0Q2FjaGUuc2V0KGtleSwgb2N0b2tpdCk7XG4gIHJldHVybiBvY3Rva2l0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzR2l0SHViVG9rZW4ob3duZXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gISFnZXRHaXRIdWJUb2tlbihvd25lcik7XG59XG5cbmZ1bmN0aW9uIGdldEdpdEh1YlRva2VuKG93bmVyPzogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKG93bmVyID09PSAnV2lsbEJvb3N0ZXInKSB7XG4gICAgcmV0dXJuIHByb2Nlc3MuZW52LkdIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSIHx8IGdldEdpdEh1YkNsaVRva2VuKCk7XG4gIH1cbiAgaWYgKG93bmVyID09PSAnV2lsbEJvb3N0ZXJMYWInKSB7XG4gICAgcmV0dXJuIHByb2Nlc3MuZW52LkdIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSTEFCIHx8IGdldEdpdEh1YkNsaVRva2VuKCk7XG4gIH1cbiAgcmV0dXJuIChcbiAgICBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUiB8fFxuICAgIHByb2Nlc3MuZW52LkdIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSTEFCIHx8XG4gICAgcHJvY2Vzcy5lbnYuR0hfVE9LRU4gfHxcbiAgICBwcm9jZXNzLmVudi5HSVRIVUJfVE9LRU4gfHxcbiAgICBnZXRHaXRIdWJDbGlUb2tlbigpXG4gICk7XG59XG5cbmxldCBnaXRIdWJDbGlUb2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBnZXRHaXRIdWJDbGlUb2tlbigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoZ2l0SHViQ2xpVG9rZW4gIT09IHVuZGVmaW5lZCkgcmV0dXJuIGdpdEh1YkNsaVRva2VuIHx8IHVuZGVmaW5lZDtcblxuICB0cnkge1xuICAgIC8vIFNvbWUgbG9jYWwgcnVucyByZWx5IG9uIEdpdEh1YiBDTEkgYXV0aGVudGljYXRpb24gaW5zdGVhZCBvZiBleHBvcnRlZCBlbnYgdG9rZW5zLlxuICAgIGdpdEh1YkNsaVRva2VuID1cbiAgICAgIGNoaWxkUHJvY2Vzc1xuICAgICAgICAuZXhlY0ZpbGVTeW5jKCdnaCcsIFsnYXV0aCcsICd0b2tlbiddLCB7XG4gICAgICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICAgICAgICBzdGRpbzogWydpZ25vcmUnLCAncGlwZScsICdpZ25vcmUnXSxcbiAgICAgICAgfSlcbiAgICAgICAgLnRyaW0oKSB8fCAnJztcbiAgfSBjYXRjaCB7XG4gICAgZ2l0SHViQ2xpVG9rZW4gPSAnJztcbiAgfVxuICByZXR1cm4gZ2l0SHViQ2xpVG9rZW4gfHwgdW5kZWZpbmVkO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmV4cG9ydCBjb25zdCBtYW5hZ2VkVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzID0gW1xuICAnQHRzY29uZmlnL2J1bicsXG4gICdAdHNjb25maWcvbm9kZS1sdHMnLFxuICAnQHRzY29uZmlnL25vZGUtdHMnLFxuICAnQHRzY29uZmlnL3JlYWN0LW5hdGl2ZScsXG5dO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHNjb25maWdFeHRlbmRzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgIHJldHVybiAnQHRzY29uZmlnL2J1bi90c2NvbmZpZy5qc29uJztcbiAgfVxuICBpZiAoY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgIHJldHVybiAnQHRzY29uZmlnL3JlYWN0LW5hdGl2ZS90c2NvbmZpZy5qc29uJztcbiAgfVxuICByZXR1cm4gWydAdHNjb25maWcvbm9kZS1sdHMvdHNjb25maWcuanNvbicsICdAdHNjb25maWcvbm9kZS10cy90c2NvbmZpZy5qc29uJ107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nW10ge1xuICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eiB8fCBjb25maWcuZGVwZW5kaW5nLm5leHQpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgIHJldHVybiBbJ0B0c2NvbmZpZy9idW4nXTtcbiAgfVxuICBpZiAoY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgIHJldHVybiBbJ0B0c2NvbmZpZy9yZWFjdC1uYXRpdmUnXTtcbiAgfVxuICByZXR1cm4gWydAdHNjb25maWcvbm9kZS1sdHMnLCAnQHRzY29uZmlnL25vZGUtdHMnXTtcbn1cbiIsImltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNQdWJsaXNoZWRXaWxsYm9vc3RlckNvbmZpZ3NQYWNrYWdlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIGNvbmZpZy5pc1dpbGxCb29zdGVyQ29uZmlncyAmJlxuICAgICFjb25maWcuaXNSb290ICYmXG4gICAgY29uZmlnLnBhY2thZ2VKc29uPy5wcml2YXRlICE9PSB0cnVlICYmXG4gICAgQXJyYXkuaXNBcnJheShjb25maWcucGFja2FnZUpzb24/LmZpbGVzKSAmJlxuICAgIGNvbmZpZy5wYWNrYWdlSnNvbi5maWxlcy5sZW5ndGggPiAwXG4gICk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuaW1wb3J0IHNlbXZlciBmcm9tICdzZW12ZXInO1xuaW1wb3J0IHsgc29ydFBhY2thZ2VKc29uIH0gZnJvbSAnc29ydC1wYWNrYWdlLWpzb24nO1xuaW1wb3J0IHRzIGZyb20gJ3R5cGVzY3JpcHQnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiwgU2V0UmVxdWlyZWQgfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBnZXRMYXRlc3RDb21taXRIYXNoIH0gZnJvbSAnLi4vZ2l0aHViL2NvbW1pdC5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgZ2V0R2VuSTE4blRzQ29tbWFuZCB9IGZyb20gJy4uL3V0aWxzL2dlbkkxOG5Ucy5qcyc7XG5pbXBvcnQgeyBnaXRIdWJVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5pbXBvcnQgeyBnbG9iSWdub3JlIH0gZnJvbSAnLi4vdXRpbHMvZ2xvYlV0aWwuanMnO1xuaW1wb3J0IHsgaWdub3JlRmlsZVV0aWwgfSBmcm9tICcuLi91dGlscy9pZ25vcmVGaWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBjb21iaW5lTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgZG9lc0NvbnRhaW5KYXZhLCBkb2VzQ29udGFpbkpzT3JUcyB9IGZyb20gJy4uL3V0aWxzL3BhY2thZ2VDYXBhYmlsaXRpZXMuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMsIHNwYXduU3luY0FuZFJldHVyblN0ZG91dCB9IGZyb20gJy4uL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5pbXBvcnQgeyBnZXRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMsIG1hbmFnZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMgfSBmcm9tICcuLi91dGlscy90c2NvbmZpZ0Jhc2UuanMnO1xuaW1wb3J0IHsgaXNQdWJsaXNoZWRXaWxsYm9vc3RlckNvbmZpZ3NQYWNrYWdlIH0gZnJvbSAnLi4vdXRpbHMvd2lsbGJvb3N0ZXJDb25maWdzVXRpbC5qcyc7XG5cbmNvbnN0IG94bGludERlcHMgPSBbJ0B3aWxsYm9vc3Rlci9veGZtdC1jb25maWcnLCAnQHdpbGxib29zdGVyL294bGludC1jb25maWcnLCAnb3hmbXQnLCAnb3hsaW50JywgJ294bGludC10c2dvbGludCddO1xuY29uc3QgdHlwZXNjcmlwdEdvRGVwZW5kZW5jeSA9ICdAdHlwZXNjcmlwdC9uYXRpdmUtcHJldmlldyc7XG5jb25zdCB0eXBlc2NyaXB0RGVwZW5kZW5jeSA9ICd0eXBlc2NyaXB0JztcbmNvbnN0IHdiRGVwZW5kZW5jeSA9ICdAd2lsbGJvb3N0ZXIvd2InO1xuY29uc3QgYnVpbGRUc0RlcGVuZGVuY3kgPSAnYnVpbGQtdHMnO1xuY29uc3Qgd2lsbEJvb3N0ZXJDb25maWdzTWFuYWdlZERlcGVuZGVuY2llcyA9IFtcbiAgJ0B3aWxsYm9vc3Rlci9wcmV0dGllci1jb25maWcnLFxuICAuLi5veGxpbnREZXBzLmZpbHRlcigoZGVwZW5kZW5jeSkgPT4gZGVwZW5kZW5jeS5zdGFydHNXaXRoKCdAd2lsbGJvb3N0ZXIvJykpLFxuXTtcbmNvbnN0IG9ic29sZXRlTGludERlcGVuZGVuY2llcyA9IFtcbiAgJ0BiaW9tZWpzL2Jpb21lJyxcbiAgJ0Blc2xpbnQtcmVhY3QvZXNsaW50LXBsdWdpbicsXG4gICdAZXNsaW50L2pzJyxcbiAgJ0BuZXh0L2VzbGludC1wbHVnaW4tbmV4dCcsXG4gICdAdHlwZXMvZXNsaW50JyxcbiAgJ0B0eXBlcy9taWNyb21hdGNoJyxcbiAgJ0B0eXBlc2NyaXB0LWVzbGludC9lc2xpbnQtcGx1Z2luJyxcbiAgJ0B0eXBlc2NyaXB0LWVzbGludC9wYXJzZXInLFxuICAnQHdpbGxib29zdGVyL2Jpb21lLWNvbmZpZycsXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZycsXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1ibGl0ei1uZXh0JyxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzJyxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzLXJlYWN0JyxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLW5leHQnLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctcmVhY3QnLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMnLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMtcmVhY3QnLFxuICAnYmlvbWUnLFxuICAnZXNsaW50JyxcbiAgJ2VzbGludC1jb25maWctZmxhdC1naXRpZ25vcmUnLFxuICAnZXNsaW50LWNvbmZpZy1uZXh0JyxcbiAgJ2VzbGludC1jb25maWctcHJldHRpZXInLFxuICAnZXNsaW50LWltcG9ydC1yZXNvbHZlci1ub2RlJyxcbiAgJ2VzbGludC1pbXBvcnQtcmVzb2x2ZXItdHlwZXNjcmlwdCcsXG4gICdlc2xpbnQtcGx1Z2luLWltcG9ydCcsXG4gICdlc2xpbnQtcGx1Z2luLWltcG9ydC14JyxcbiAgJ2VzbGludC1wbHVnaW4tcGVyZmVjdGlvbmlzdCcsXG4gICdlc2xpbnQtcGx1Z2luLXByZXR0aWVyJyxcbiAgJ2VzbGludC1wbHVnaW4tcmVhY3QnLFxuICAnZXNsaW50LXBsdWdpbi1yZWFjdC1jb21waWxlcicsXG4gICdlc2xpbnQtcGx1Z2luLXJlYWN0LWhvb2tzJyxcbiAgJ2VzbGludC1wbHVnaW4tc29ydC1jbGFzcy1tZW1iZXJzJyxcbiAgJ2VzbGludC1wbHVnaW4tc29ydC1kZXN0cnVjdHVyZS1rZXlzJyxcbiAgJ2VzbGludC1wbHVnaW4tc3Rvcnlib29rJyxcbiAgJ2VzbGludC1wbHVnaW4tdW5pY29ybicsXG4gICdlc2xpbnQtcGx1Z2luLXVudXNlZC1pbXBvcnRzJyxcbiAgJ2dsb2JhbHMnLFxuICAnbWljcm9tYXRjaCcsXG4gICd0eXBlc2NyaXB0LWVzbGludCcsXG5dO1xuY29uc3QgbWljcm9tYXRjaFBhY2thZ2VOYW1lcyA9IG5ldyBTZXQoWydtaWNyb21hdGNoJywgJ0B0eXBlcy9taWNyb21hdGNoJ10pO1xuY29uc3QgbWljcm9tYXRjaEltcG9ydFBhdHRlcm4gPVxuICAvXFxiZnJvbVxccytbJ1wiXW1pY3JvbWF0Y2hbJ1wiXXxcXGJyZXF1aXJlXFwoXFxzKlsnXCJdbWljcm9tYXRjaFsnXCJdXFxzKlxcKXxcXGJpbXBvcnRcXChcXHMqWydcIl1taWNyb21hdGNoWydcIl1cXHMqXFwpL3U7XG5cbmNvbnN0IGxhdGVzdERlcGVuZGVuY3lWZXJzaW9uQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuY29uc3QgZGVwZW5kZW5jeVNlY3Rpb25LZXlzID0gWydkZXBlbmRlbmNpZXMnLCAnZGV2RGVwZW5kZW5jaWVzJywgJ29wdGlvbmFsRGVwZW5kZW5jaWVzJywgJ3BlZXJEZXBlbmRlbmNpZXMnXSBhcyBjb25zdDtcblxudHlwZSBXcml0YWJsZVBhY2thZ2VKc29uID0gU2V0UmVxdWlyZWQ8XG4gIFBhY2thZ2VKc29uLFxuICAnc2NyaXB0cycgfCAnZGVwZW5kZW5jaWVzJyB8ICdkZXZEZXBlbmRlbmNpZXMnIHwgJ3BlZXJEZXBlbmRlbmNpZXMnXG4+O1xuXG5pbnRlcmZhY2UgRGVwZW5kZW5jeVVwZGF0ZXMge1xuICBkZXBlbmRlbmNpZXM6IHN0cmluZ1tdO1xuICBkZXZEZXBlbmRlbmNpZXM6IHN0cmluZ1tdO1xuICBweXRob25EZXZEZXBlbmRlbmNpZXM6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQYWNrYWdlSnNvbihcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBza2lwQWRkaW5nRGVwczogYm9vbGVhblxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVQYWNrYWdlSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBjb3JlKGNvbmZpZywgcm9vdENvbmZpZywgc2tpcEFkZGluZ0RlcHMpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29yZShjb25maWc6IFBhY2thZ2VDb25maWcsIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsIHNraXBBZGRpbmdEZXBzOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIGNvbnN0IGpzb25PYmogPSBhd2FpdCByZWFkUGFja2FnZUpzb24oZmlsZVBhdGgpO1xuICBjb25zdCBwYWNrYWdlTWFuYWdlciA9IGNvbmZpZy5pc0J1biA/ICdidW4nIDogJ3lhcm4nO1xuXG4gIGF3YWl0IHJlbW92ZURlcHJlY2F0ZWRTdHVmZihjb25maWcsIGpzb25PYmopO1xuICBhd2FpdCB1cGRhdGVTY3JpcHRzKGNvbmZpZywganNvbk9iaik7XG4gIG1vdmVNYW5hZ2VkVG9vbERlcGVuZGVuY2llc1RvRGV2RGVwZW5kZW5jaWVzKGpzb25PYmopO1xuICBjb25zdCBkZXBlbmRlbmN5VXBkYXRlcyA9IGF3YWl0IGFwcGx5UGFja2FnZUpzb25Db252ZW50aW9ucyhjb25maWcsIHJvb3RDb25maWcsIGpzb25PYmopO1xuICBhd2FpdCBub3JtYWxpemVQYWNrYWdlTWV0YWRhdGEoY29uZmlnLCByb290Q29uZmlnLCBqc29uT2JqLCBkZXBlbmRlbmN5VXBkYXRlcyk7XG4gIGFkZERlcGVuZGVuY3lWZXJzaW9uc1RvUGFja2FnZUpzb24oanNvbk9iaiwgZGVwZW5kZW5jeVVwZGF0ZXMpO1xuICBhd2FpdCB1cGRhdGVQcml2YXRlUGFja2FnZXMoanNvbk9iaik7XG4gIHJlbW92ZUVtcHR5RGVwZW5kZW5jeVNlY3Rpb25zKGpzb25PYmopO1xuXG4gIGlmIChjb25maWcuaXNCdW4pIGRlbGV0ZSBqc29uT2JqLnBhY2thZ2VNYW5hZ2VyO1xuICAvLyBZYXJuIHJlYWRzIHBhY2thZ2UuanNvbiBmcm9tIGRpc2sgYmVmb3JlIGRlY2lkaW5nIHdoZXRoZXIgYHlhcm4gYWRkIC1EYFxuICAvLyBjb25mbGljdHMgd2l0aCBhbiBleGlzdGluZyByZWd1bGFyIGRlcGVuZGVuY3ksIHNvIHRoaXMgd3JpdGUgbXVzdCBmaW5pc2hcbiAgLy8gYmVmb3JlIGluc3RhbGxpbmcgdGhlIG1hbmFnZWQgZGVwZW5kZW5jeSB1cGRhdGVzIGJlbG93LiBLZWVwIHRoaXMgYmFzZWxpbmVcbiAgLy8gZmlsZSBzb3J0ZWQgZXZlbiB3aGVuIHdlIGxhdGVyIHJ1biB0aGUgdGFyZ2V0IHJlcG9zaXRvcnkncyBmb3JtYXR0ZXIgc28gYVxuICAvLyBtaWQtcnVuIGludGVycnVwdGlvbiBuZXZlciBsZWF2ZXMgcGFja2FnZS5qc29uIGluIGEgcGFydGlhbGx5IG1hbmFnZWQgb3JkZXIuXG4gIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIHNlcmlhbGl6ZVBhY2thZ2VKc29uKGpzb25PYmopKTtcblxuICBpZiAoIXNraXBBZGRpbmdEZXBzKSB7XG4gICAgaW5zdGFsbERlcGVuZGVuY3lVcGRhdGVzKGNvbmZpZywganNvbk9iaiwgZGVwZW5kZW5jeVVwZGF0ZXMsIHBhY2thZ2VNYW5hZ2VyKTtcbiAgICBmb3JtYXRQYWNrYWdlSnNvbldpdGhQcm9qZWN0Rm9ybWF0dGVyKGNvbmZpZywgcGFja2FnZU1hbmFnZXIsIGZpbGVQYXRoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzZXJpYWxpemVQYWNrYWdlSnNvbihqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uKTogc3RyaW5nIHtcbiAgLy8gZnNVdGlsLmdlbmVyYXRlRmlsZSgpIG5vcm1hbGl6ZXMgdGhlIHRyYWlsaW5nIG5ld2xpbmUsIHNvIGtlZXAgdGhlIHNlcmlhbGl6ZXJcbiAgLy8gZm9jdXNlZCBvbiB0aGUgSlNPTiBwYXlsb2FkIGl0c2VsZi5cbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHNvcnRQYWNrYWdlSnNvbihqc29uT2JqKSwgdW5kZWZpbmVkLCAyKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZFBhY2thZ2VKc29uKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPFdyaXRhYmxlUGFja2FnZUpzb24+IHtcbiAgY29uc3QganNvblRleHQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgY29uc3QganNvbk9iaiA9IEpTT04ucGFyc2UoanNvblRleHQpIGFzIFBhY2thZ2VKc29uO1xuICBqc29uT2JqLnNjcmlwdHMgPSBqc29uT2JqLnNjcmlwdHMgPz8ge307XG4gIGpzb25PYmouZGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXBlbmRlbmNpZXMgPz8ge307XG4gIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gIGpzb25PYmoucGVlckRlcGVuZGVuY2llcyA9IGpzb25PYmoucGVlckRlcGVuZGVuY2llcyA/PyB7fTtcbiAgcmV0dXJuIGpzb25PYmogYXMgV3JpdGFibGVQYWNrYWdlSnNvbjtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdXBkYXRlU2NyaXB0cyhjb25maWc6IFBhY2thZ2VDb25maWcsIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmVtb3ZlTGVnYWN5SW5zdGFsbENvbW1hbmRzKGpzb25PYmouc2NyaXB0cyk7XG5cbiAganNvbk9iai5zY3JpcHRzID0geyAuLi5qc29uT2JqLnNjcmlwdHMsIC4uLmdlbmVyYXRlU2NyaXB0cyhjb25maWcsIGpzb25PYmouc2NyaXB0cykgfTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snc3RhcnQtdGVzdC1zZXJ2ZXInXTtcblxuICBjb25zdCBzY3JpcHRzID0ganNvbk9iai5zY3JpcHRzO1xuICBpZiAoY29uZmlnLmlzQnVuIHx8ICFkb2VzQ29udGFpbkphdmEoY29uZmlnKSkge1xuICAgIGRlbGV0ZSBzY3JpcHRzLnByZXR0aWZ5O1xuICB9IGVsc2Uge1xuICAgIHNjcmlwdHMucHJldHRpZnkgPSAoc2NyaXB0cy5wcmV0dGlmeSA/PyAnJykgKyAoYXdhaXQgZ2VuZXJhdGVQcmV0dGllclN1ZmZpeChjb25maWcuZGlyUGF0aCkpO1xuICB9XG4gIG5vcm1hbGl6ZVlhcm5Xb3Jrc3BhY2VGb3JlYWNoU2NyaXB0cyhzY3JpcHRzKTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlTGVnYWN5SW5zdGFsbENvbW1hbmRzKHNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMpOiB2b2lkIHtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc2NyaXB0cykpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykgY29udGludWU7XG4gICAgLy8gRnJlc2ggcmVwb3Mgc3RpbGwgcmVxdWlyZSBzdGFuZGFsb25lIGB5YXJuIGluc3RhbGxgOyBvbmx5IHJlbW92ZSBsZWdhY3kgaW5zdGFsbCBwcmVmaXhlcyBiZWZvcmUgYW5vdGhlciBjb21tYW5kLlxuICAgIGlmICghdmFsdWUuaW5jbHVkZXMoJ2dpdCBjbG9uZScpKSB7XG4gICAgICBzY3JpcHRzW2tleV0gPSB2YWx1ZS5yZXBsYWNlQWxsKC95YXJuXFxzKig/Omluc3RhbGxcXHMqKT8mJlxccyovZ3UsICcnKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplWWFybldvcmtzcGFjZUZvcmVhY2hTY3JpcHRzKHNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMpOiB2b2lkIHtcbiAgLy8gRGVhbCB3aXRoIGJyZWFraW5nIGNoYW5nZXMgaW4geWFybiBiZXJyeSA0LjAuMC1yYy40OVxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhzY3JpcHRzKSkge1xuICAgIGlmICghdmFsdWU/LmluY2x1ZGVzKCd5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCcpKSBjb250aW51ZTtcbiAgICBzY3JpcHRzW2tleV0gPSB2YWx1ZS5yZXBsYWNlQWxsKFxuICAgICAgL3lhcm4gd29ya3NwYWNlcyBmb3JlYWNoKD8hXFxzKyg/Oi1BfC1SfC0tKD86YWxsfHJlY3Vyc2l2ZXxzaW5jZXx3b3JrdHJlZXxmcm9tfGluY2x1ZGV8ZXhjbHVkZXxwdWJsaWN8cHJpdmF0ZSkpKS9ndSxcbiAgICAgICd5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCdcbiAgICApO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGFwcGx5UGFja2FnZUpzb25Db252ZW50aW9ucyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uXG4pOiBQcm9taXNlPERlcGVuZGVuY3lVcGRhdGVzPiB7XG4gIGNvbnN0IGRlcGVuZGVuY2llczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgZGV2RGVwZW5kZW5jaWVzID0gWydzb3J0LXBhY2thZ2UtanNvbiddO1xuICBjb25zdCBweXRob25EZXZEZXBlbmRlbmNpZXM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IGhhc0phdmEgPSBkb2VzQ29udGFpbkphdmEoY29uZmlnKTtcblxuICBpZiAoXG4gICAgaGFzSmF2YSAmJlxuICAgICFmcy5leGlzdHNTeW5jKHBhdGguam9pbihyb290Q29uZmlnLmRpclBhdGgsICcucHJldHRpZXJyYy5qc29uJykpICYmXG4gICAgIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAnLnByZXR0aWVycmMuanNvbicpKVxuICApIHtcbiAgICBqc29uT2JqLnByZXR0aWVyID0gJ0B3aWxsYm9vc3Rlci9wcmV0dGllci1jb25maWcnO1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdwcmV0dGllci1wbHVnaW4tamF2YScsICdAd2lsbGJvb3N0ZXIvcHJldHRpZXItY29uZmlnJyk7XG4gIH1cbiAgaWYgKGhhc0phdmEpIHtcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgncHJldHRpZXInKTtcbiAgfSBlbHNlIHtcbiAgICByZW1vdmVQcmV0dGllckFydGlmYWN0cyhqc29uT2JqKTtcbiAgfVxuXG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snbGludC1zdGFnZWQnXTtcbiAgZGVsZXRlIChqc29uT2JqIGFzIFBhY2thZ2VKc29uICYgeyAnbGludC1zdGFnZWQnPzogdW5rbm93biB9KVsnbGludC1zdGFnZWQnXTtcblxuICBpZiAoY29uZmlnLmlzUm9vdCkge1xuICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5odXNreTtcbiAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLnBvc3RpbnN0YWxsO1xuICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucG9zdHB1Ymxpc2g7XG4gICAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5wcmVwdWJsaXNoT25seTtcbiAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLnByZXBhY2s7XG4gICAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5wb3N0cGFjaztcbiAgICBqc29uT2JqLnNjcmlwdHMucHJlcGFyZSA9ICdsZWZ0aG9vayBpbnN0YWxsIHx8IHRydWUnO1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdsZWZ0aG9vaycpO1xuXG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuc2VtYW50aWNSZWxlYXNlKSB7XG4gICAgICBpZiAoXG4gICAgICAgICFqc29uT2JqLmRldkRlcGVuZGVuY2llc1snc2VtYW50aWMtcmVsZWFzZSddICYmXG4gICAgICAgICFqc29uT2JqLmRldkRlcGVuZGVuY2llc1snbXVsdGktc2VtYW50aWMtcmVsZWFzZSddICYmXG4gICAgICAgICFqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHFpd2kvbXVsdGktc2VtYW50aWMtcmVsZWFzZSddXG4gICAgICApIHtcbiAgICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ3NlbWFudGljLXJlbGVhc2UnKTtcbiAgICAgIH1cbiAgICAgIGpzb25PYmoudmVyc2lvbiA9ICcwLjAuMC1zZW1hbnRpY2FsbHktcmVsZWFzZWQnO1xuICAgIH1cblxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRUZXN0KSB7XG4gICAgICAvLyBTaW5jZSBhcnRpbGxlcnkgcmVxdWlyZXMgYSBzcGVjaWZpYyB2ZXJzaW9uIG9mIEBwbGF5d3JpZ2h0L3Rlc3RcbiAgICAgIGNvbnN0IGhhc0FydGlsbGVyeSA9IGpzb25PYmouZGVwZW5kZW5jaWVzLmFydGlsbGVyeSB8fCBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5hcnRpbGxlcnk7XG4gICAgICAvLyBTaW5jZSBsbG0tdG9vbGJveCByZXF1aXJlcyBAcGxheXdyaWdodC90ZXN0IGluIGRlcGVuZGVuY2llc1xuICAgICAgaWYgKCFoYXNBcnRpbGxlcnkgJiYgIWpzb25PYmouZGVwZW5kZW5jaWVzWydAcGxheXdyaWdodC90ZXN0J10pIHtcbiAgICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0BwbGF5d3JpZ2h0L3Rlc3QnKTtcbiAgICAgIH1cbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llcy5wbGF5d3JpZ2h0O1xuICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQ7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucykge1xuICAgICAgLy8gV2UgZG9uJ3QgYWxsb3cgbm9uLWFycmF5IHdvcmtzcGFjZXMgaW4gbW9ub3JlcG8uXG4gICAgICBqc29uT2JqLndvcmtzcGFjZXMgPSBBcnJheS5pc0FycmF5KGpzb25PYmoud29ya3NwYWNlcylcbiAgICAgICAgPyBtZXJnZS5hbGwoW2pzb25PYmoud29ya3NwYWNlcywgWydwYWNrYWdlcy8qJ11dLCB7XG4gICAgICAgICAgICBhcnJheU1lcmdlOiBjb21iaW5lTWVyZ2UsXG4gICAgICAgICAgfSlcbiAgICAgICAgOiBbJ3BhY2thZ2VzLyonXTtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoanNvbk9iai53b3Jrc3BhY2VzKSkge1xuICAgICAganNvbk9iai53b3Jrc3BhY2VzID0ganNvbk9iai53b3Jrc3BhY2VzLmZpbHRlcihcbiAgICAgICAgKHdvcmtzcGFjZSkgPT5cbiAgICAgICAgICBmZy5nbG9iU3luYyh3b3Jrc3BhY2UsIHtcbiAgICAgICAgICAgIGRvdDogdHJ1ZSxcbiAgICAgICAgICAgIGN3ZDogY29uZmlnLmRpclBhdGgsXG4gICAgICAgICAgICBpZ25vcmU6IGdsb2JJZ25vcmUsXG4gICAgICAgICAgfSkubGVuZ3RoID4gMFxuICAgICAgKTtcbiAgICAgIGlmIChqc29uT2JqLndvcmtzcGFjZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLndvcmtzcGFjZXM7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKCFpc1diUGFja2FnZShqc29uT2JqKSkge1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKHdiRGVwZW5kZW5jeSk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcud2IgfHwgY29uZmlnLmlzQnVuKSB7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoanNvbk9iai5zY3JpcHRzKSkge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIGNvbnRpbnVlO1xuICAgICAganNvbk9iai5zY3JpcHRzW2tleV0gPSB2YWx1ZS5yZXBsYWNlQWxsKC93YlxccytkYi9ndSwgJ3diIHByaXNtYScpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGJ1aWxkLXRzIG93bnMgVHlwZVNjcmlwdCBleGVjdXRpb24gYW5kIGRlY2xhcmF0aW9uIGVtaXQuIHdiZnkgbXVzdCBhbHdheXNcbiAgLy8ga2VlcCBleGlzdGluZyBidWlsZC10cyB1c2VycyBjdXJyZW50IGJlY2F1c2Ugb2xkZXIgcmVsZWFzZXMgY2FuIGVtaXQgLmQudHNcbiAgLy8gZmlsZXMgYXQgcGF0aHMgdGhhdCBubyBsb25nZXIgbWF0Y2ggcGFja2FnZSBleHBvcnRzLlxuICBpZiAoXG4gICAganNvbk9iai5kZXBlbmRlbmNpZXNbYnVpbGRUc0RlcGVuZGVuY3ldIHx8XG4gICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbYnVpbGRUc0RlcGVuZGVuY3ldIHx8XG4gICAgT2JqZWN0LnZhbHVlcyhqc29uT2JqLnNjcmlwdHMpLnNvbWUoKHNjcmlwdCkgPT4gc2NyaXB0Py5pbmNsdWRlcyhidWlsZFRzRGVwZW5kZW5jeSkpXG4gICkge1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKGJ1aWxkVHNEZXBlbmRlbmN5KTtcbiAgfVxuICBpZiAoZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKSkge1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKC4uLm94bGludERlcHMpO1xuICB9XG5cbiAgY29uc3QgdHNjb25maWdCYXNlRGVwZW5kZW5jaWVzID0gZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKSA/IGdldFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyhjb25maWcpIDogW107XG4gIGF3YWl0IHJlbW92ZVVudXNlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyhjb25maWcsIGpzb25PYmosIHRzY29uZmlnQmFzZURlcGVuZGVuY2llcyk7XG4gIGRldkRlcGVuZGVuY2llcy5wdXNoKC4uLnRzY29uZmlnQmFzZURlcGVuZGVuY2llcyk7XG5cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXMpIHtcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCh0eXBlc2NyaXB0R29EZXBlbmRlbmN5KTtcbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgICAvLyBOZXh0LmpzIHN0aWxsIHVzZXMgdGhlIGB0eXBlc2NyaXB0YCBwYWNrYWdlIGR1cmluZyBkZXYvYnVpbGQgc3RhcnR1cCBmb3JcbiAgICAgIC8vIFR5cGVTY3JpcHQgYXBwcyBldmVuIHdoZW4gcmVwb3NpdG9yaWVzIGRlbGVnYXRlIGV4cGxpY2l0IHR5cGVjaGVja2luZyB0byB0c2dvLlxuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2godHlwZXNjcmlwdERlcGVuZGVuY3kpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnQHR5cGVzL2J1bicpO1xuICAgIH0gZWxzZSBpZiAoIWNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAdHlwZXMvbm9kZScpO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBqc29uT2JqLmRlcGVuZGVuY2llcy5qZXN0IHx8XG4gICAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5qZXN0IHx8XG4gICAgICBqc29uT2JqLmRlcGVuZGVuY2llc1snQGplc3QvZ2xvYmFscyddIHx8XG4gICAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQGplc3QvZ2xvYmFscyddIHx8XG4gICAgICBqc29uT2JqLmRlcGVuZGVuY2llc1sndHMtamVzdCddIHx8XG4gICAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llc1sndHMtamVzdCddXG4gICAgKSB7XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnQHR5cGVzL2plc3QnKTtcbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRlcGVuZGVuY2llczogZGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhZGVwLmluY2x1ZGVzKCdAd2lsbGJvb3N0ZXIvJykpLFxuICAgICAgZGV2RGVwZW5kZW5jaWVzOiBkZXZEZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFkZXAuaW5jbHVkZXMoJ0B3aWxsYm9vc3Rlci8nKSksXG4gICAgICBweXRob25EZXZEZXBlbmRlbmNpZXMsXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7IGRlcGVuZGVuY2llcywgZGV2RGVwZW5kZW5jaWVzLCBweXRob25EZXZEZXBlbmRlbmNpZXMgfTtcbn1cblxuZnVuY3Rpb24gbW92ZU1hbmFnZWRUb29sRGVwZW5kZW5jaWVzVG9EZXZEZXBlbmRlbmNpZXMoanNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbik6IHZvaWQge1xuICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2YgW3diRGVwZW5kZW5jeSwgYnVpbGRUc0RlcGVuZGVuY3ldKSB7XG4gICAgaWYgKCFqc29uT2JqLmRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSkgY29udGludWU7XG4gICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0gPz89IGpzb25PYmouZGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldO1xuICAgIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBub3JtYWxpemVQYWNrYWdlTWV0YWRhdGEoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbixcbiAgZGVwZW5kZW5jeVVwZGF0ZXM6IERlcGVuZGVuY3lVcGRhdGVzXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFqc29uT2JqLm5hbWUpIHtcbiAgICBqc29uT2JqLm5hbWUgPSBwYXRoLmJhc2VuYW1lKGNvbmZpZy5kaXJQYXRoKTtcbiAgfVxuXG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMpIHtcbiAgICBqc29uT2JqLnByaXZhdGUgPSB0cnVlO1xuICB9XG4gIGlmICghanNvbk9iai5saWNlbnNlKSB7XG4gICAganNvbk9iai5saWNlbnNlID0gJ1VOTElDRU5TRUQnO1xuICB9XG4gIGlmICghanNvbk9iai5wcml2YXRlICYmIGpzb25PYmoubGljZW5zZSAhPT0gJ1VOTElDRU5TRUQnICYmIHJvb3RDb25maWcuaXNQdWJsaWNSZXBvKSB7XG4gICAganNvbk9iai5wdWJsaXNoQ29uZmlnID8/PSB7fTtcbiAgICBqc29uT2JqLnB1Ymxpc2hDb25maWcuYWNjZXNzID8/PSAncHVibGljJztcbiAgfVxuICBjb25zdCBbb3duZXJdID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGNvbmZpZy5yZXBvc2l0b3J5ID8/ICcnKTtcbiAgaWYgKG93bmVyID09PSAnV2lsbEJvb3N0ZXInIHx8IG93bmVyID09PSAnV2lsbEJvb3N0ZXJMYWInKSB7XG4gICAganNvbk9iai5hdXRob3IgPSAnV2lsbEJvb3N0ZXIgSW5jLic7XG4gIH1cbiAgYXdhaXQgbm9ybWFsaXplUHVibGlzaGVkQ29uZmlnUGFja2FnZU1ldGFkYXRhKGNvbmZpZywganNvbk9iaik7XG4gIGlmICghY29uZmlnLmlzUm9vdCAmJiBqc29uT2JqLnByaXZhdGUgJiYgIWpzb25PYmoubWFpbikge1xuICAgIC8vIE1ha2UgVlNDb2RlIHBvc3NpYmxlIHRvIHJlZmFjdG9yIGNvZGUgYWNyb3NzIHN1YnBhY2thZ2VzLlxuICAgIGpzb25PYmoubWFpbiA9ICcuL3NyYyc7XG4gIH1cblxuICAvLyBZYXJuIHRyZWF0cyB0aGUgbGVnYWN5IG5wbS9jaGFsayByZXNvbHV0aW9uIGFsaWFzIGFzIGFuIGludmFsaWQgcGFja2FnZSB0b2tlbi5cbiAgZGVsZXRlIGpzb25PYmoucmVzb2x1dGlvbnM/LlsnbnBtL2NoYWxrJ107XG5cbiAgaWYgKCFjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMpIHtcbiAgICBpZiAoIWNvbmZpZy5pc0J1bikge1xuICAgICAgaWYgKCFjb25maWcuZG9lc0NvbnRhaW5KYXZhU2NyaXB0ICYmICFjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0KSB7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMubGludDtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snbGludC1maXgnXTtcbiAgICAgICAgZm9yIChjb25zdCBzY3JpcHROYW1lIG9mIFsnY2xlYW51cCddKSB7XG4gICAgICAgICAgY29uc3Qgc2NyaXB0ID0ganNvbk9iai5zY3JpcHRzW3NjcmlwdE5hbWVdO1xuICAgICAgICAgIGlmICghc2NyaXB0KSBjb250aW51ZTtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHNbc2NyaXB0TmFtZV0gPSBzY3JpcHQucmVwbGFjZSgvID8mJiA/eWFybiBsaW50LWZpeCg/OiAtLXF1aWV0KT8vLCAnJyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGpzb25PYmouc2NyaXB0c1snbGludC1maXgnXSA9IGpzb25PYmouc2NyaXB0c1snbGludC1maXgnXSA/PyAneWFybiBsaW50IC0tZml4JztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgIGpzb25PYmouc2NyaXB0cy5saW50ID0gJ2ZsdXR0ZXIgYW5hbHl6ZSc7XG4gICAgICBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J10gPSAneWFybiBsaW50JztcbiAgICAgIGNvbnN0IGRpcnMgPSBbJ2xpYicsICd0ZXN0JywgJ3Rlc3RfZHJpdmVyJ10uZmlsdGVyKChkaXIpID0+IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBkaXIpKSk7XG4gICAgICBpZiAoZGlycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGpzb25PYmouc2NyaXB0c1snZm9ybWF0LWNvZGUnXSA9IGBkYXJ0IGZvcm1hdCAkKGZpbmQgJHtkaXJzLmpvaW4oXG4gICAgICAgICAgJyAnXG4gICAgICAgICl9IC1uYW1lIGdlbmVyYXRlZCAtcHJ1bmUgLW8gLW5hbWUgJyouZnJlZXplZC5kYXJ0JyAtcHJ1bmUgLW8gLW5hbWUgJyouZy5kYXJ0JyAtcHJ1bmUgLW8gLW5hbWUgJyouZGFydCcgLXByaW50KWA7XG4gICAgICAgIGpzb25PYmouc2NyaXB0cy5mb3JtYXQgPSBhcHBlbmRGb3JtYXRDb2RlQ29tbWFuZChqc29uT2JqLnNjcmlwdHMuZm9ybWF0LCBjb25maWcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHB5dGhvblBhY2thZ2VNYW5hZ2VyID0gZ2V0UHl0aG9uUGFja2FnZU1hbmFnZXIoY29uZmlnKTtcbiAgICBpZiAocHl0aG9uUGFja2FnZU1hbmFnZXIpIHtcbiAgICAgIGlmIChqc29uT2JqLnNjcmlwdHMucG9zdGluc3RhbGwgPT09ICdwb2V0cnkgaW5zdGFsbCcpIHtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5wb3N0aW5zdGFsbDtcbiAgICAgIH1cbiAgICAgIGpzb25PYmouc2NyaXB0c1snY29tbW9uL2NpLXNldHVwJ10gPSBgeWFybiBzZXR1cC0ke3B5dGhvblBhY2thZ2VNYW5hZ2VyfWA7XG4gICAgICBkZWxldGUganNvbk9iai5zY3JpcHRzW2BzZXR1cC0ke3B5dGhvblBhY2thZ2VNYW5hZ2VyID09PSAncG9ldHJ5JyA/ICd1dicgOiAncG9ldHJ5J31gXTtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3NldHVwLXBvZXRyeS1hc2RmJ107XG4gICAgICBqc29uT2JqLnNjcmlwdHNbYHNldHVwLSR7cHl0aG9uUGFja2FnZU1hbmFnZXJ9YF0gPSBnZXRQeXRob25TZXR1cENvbW1hbmQocHl0aG9uUGFja2FnZU1hbmFnZXIpO1xuICAgICAgY29uc3QgcHl0aG9uRmlsZXMgPSBhd2FpdCBmZy5nbG9iKCcqKi8qLnB5Jywge1xuICAgICAgICBjd2Q6IGNvbmZpZy5kaXJQYXRoLFxuICAgICAgICBkb3Q6IHRydWUsXG4gICAgICAgIGlnbm9yZTogZ2xvYklnbm9yZSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZGlyTmFtZVNldCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgZm9yIChjb25zdCBweXRob25GaWxlIG9mIHB5dGhvbkZpbGVzKSB7XG4gICAgICAgIGNvbnN0IFtmaXJzdCwgc2Vjb25kXSA9IHB5dGhvbkZpbGUuc3BsaXQoJy8nKTtcbiAgICAgICAgaWYgKGZpcnN0ICYmIHNlY29uZCkge1xuICAgICAgICAgIGRpck5hbWVTZXQuYWRkKGZpcnN0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGRpck5hbWVTZXQuc2l6ZSA+IDApIHtcbiAgICAgICAgY29uc3QgZGlyTmFtZXNTdHIgPSBbLi4uZGlyTmFtZVNldF0uam9pbignICcpO1xuICAgICAgICBjb25zdCBweXRob25SdW5uZXIgPSBgJHtweXRob25QYWNrYWdlTWFuYWdlcn0gcnVuYDtcbiAgICAgICAganNvbk9iai5zY3JpcHRzWydmb3JtYXQtY29kZSddID1cbiAgICAgICAgICBgJHtweXRob25SdW5uZXJ9IGlzb3J0IC0tcHJvZmlsZSBibGFjayAke2Rpck5hbWVzU3RyfSAmJiAke3B5dGhvblJ1bm5lcn0gYmxhY2sgJHtkaXJOYW1lc1N0cn1gO1xuICAgICAgICBpZiAoanNvbk9iai5zY3JpcHRzLmxpbnQpIHtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHMubGludCA9IGAke3B5dGhvblJ1bm5lcn0gZmxha2U4ICR7ZGlyTmFtZXNTdHJ9ICYmICR7anNvbk9iai5zY3JpcHRzLmxpbnR9YDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHMubGludCA9IGAke3B5dGhvblJ1bm5lcn0gZmxha2U4ICR7ZGlyTmFtZXNTdHJ9YDtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J10gPSAneWFybiBsaW50JztcbiAgICAgICAgfVxuICAgICAgICBqc29uT2JqLnNjcmlwdHMuZm9ybWF0ID0gYXBwZW5kRm9ybWF0Q29kZUNvbW1hbmQoanNvbk9iai5zY3JpcHRzLmZvcm1hdCwgY29uZmlnKTtcbiAgICAgICAgZGVwZW5kZW5jeVVwZGF0ZXMucHl0aG9uRGV2RGVwZW5kZW5jaWVzLnB1c2goJ2JsYWNrJywgJ2lzb3J0JywgJ2ZsYWtlOCcpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcucmVwb3NpdG9yeSB8fCBqc29uT2JqLnJlcG9zaXRvcnkpIHtcbiAgICBqc29uT2JqLnJlcG9zaXRvcnkgPSBmb3JtYXRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24oY29uZmlnLnJlcG9zaXRvcnkgPz8ganNvbk9iai5yZXBvc2l0b3J5LCBqc29uT2JqLnJlcG9zaXRvcnkpO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHopIHtcbiAgICBpZiAoIWpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXT8uc3RhcnRzV2l0aCgnYmxpdHogY29kZWdlbicpKSB7XG4gICAgICBqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10gPSAnYmxpdHogY29kZWdlbic7XG4gICAgfSBlbHNlIGlmICghanNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddLmluY2x1ZGVzKCdibGl0eiBwcmlzbWEgZ2VuZXJhdGUnKSkge1xuICAgICAganNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddID0ganNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddLnJlcGxhY2UoXG4gICAgICAgICdibGl0eiBjb2RlZ2VuJyxcbiAgICAgICAgJ2JsaXR6IGNvZGVnZW4gJiYgYmxpdHogcHJpc21hIGdlbmVyYXRlJ1xuICAgICAgKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEgJiYgIWpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXT8uc3RhcnRzV2l0aCgncHJpc21hIGdlbmVyYXRlJykpIHtcbiAgICBqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10gPSAncHJpc21hIGdlbmVyYXRlJztcbiAgfVxuICBhZGRHZW5JMThuVHNQb3N0aW5zdGFsbFNjcmlwdChjb25maWcsIGpzb25PYmopO1xuXG4gIGlmICghanNvbk9iai5kZXBlbmRlbmNpZXMucHJldHRpZXIpIHtcbiAgICAvLyBCZWNhdXNlIEB0eXBlcy9wcmV0dGllciBibG9ja3MgcHJldHRpZXIgZXhlY3V0aW9uLlxuICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHR5cGVzL3ByZXR0aWVyJ107XG4gIH1cbn1cblxuZnVuY3Rpb24gYXBwZW5kRm9ybWF0Q29kZUNvbW1hbmQoZm9ybWF0U2NyaXB0OiBzdHJpbmcgfCB1bmRlZmluZWQsIGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIC8vIEJ1biBwcm9qZWN0cyBtYXkgbm90IGhhdmUgYSBZYXJuIGxvY2tmaWxlLCBzbyBnZW5lcmF0ZWQgcGFja2FnZSBzY3JpcHRzXG4gIC8vIG11c3QgaW52b2tlIGxvY2FsIHBhY2thZ2Ugc2NyaXB0cyB0aHJvdWdoIHRoZSByZXBvc2l0b3J5J3MgcGFja2FnZSBtYW5hZ2VyLlxuICBjb25zdCBzY3JpcHRSdW5uZXIgPSBjb25maWcuaXNCdW4gPyAnYnVuIHJ1bicgOiAneWFybic7XG4gIHJldHVybiBmb3JtYXRTY3JpcHQgPyBgJHtmb3JtYXRTY3JpcHR9ICYmICR7c2NyaXB0UnVubmVyfSBmb3JtYXQtY29kZWAgOiBgJHtzY3JpcHRSdW5uZXJ9IGZvcm1hdC1jb2RlYDtcbn1cblxuZnVuY3Rpb24gYWRkR2VuSTE4blRzUG9zdGluc3RhbGxTY3JpcHQoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGNvbnN0IGNvbW1hbmQgPSBnZXRHZW5JMThuVHNDb21tYW5kKGNvbmZpZywganNvbk9iai5zY3JpcHRzKTtcbiAgaWYgKCFjb21tYW5kKSByZXR1cm47XG5cbiAgY29uc3QgcG9zdGluc3RhbGwgPSBqc29uT2JqLnNjcmlwdHMucG9zdGluc3RhbGw7XG4gIGlmICghcG9zdGluc3RhbGwpIHtcbiAgICBqc29uT2JqLnNjcmlwdHMucG9zdGluc3RhbGwgPSBjb21tYW5kO1xuICB9IGVsc2UgaWYgKCFwb3N0aW5zdGFsbC5pbmNsdWRlcyhjb21tYW5kKSkge1xuICAgIGpzb25PYmouc2NyaXB0cy5wb3N0aW5zdGFsbCA9IGAke3Bvc3RpbnN0YWxsfSAmJiAke2NvbW1hbmR9YDtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBub3JtYWxpemVQdWJsaXNoZWRDb25maWdQYWNrYWdlTWV0YWRhdGEoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvblxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghaXNQdWJsaXNoZWRXaWxsYm9vc3RlckNvbmZpZ3NQYWNrYWdlKGNvbmZpZykpIHJldHVybjtcblxuICBjb25zdCBjb25maWdNanNQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnY29uZmlnLm1qcycpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoY29uZmlnTWpzUGF0aCkpIHJldHVybjtcblxuICBqc29uT2JqLnR5cGUgPSAnbW9kdWxlJztcblxuICBjb25zdCBjb25maWdEdHNQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnY29uZmlnLmQudHMnKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGNvbmZpZ0R0c1BhdGgpKSByZXR1cm47XG5cbiAganNvbk9iai5maWxlcyA9IFsuLi5uZXcgU2V0KFsuLi4oanNvbk9iai5maWxlcyA/PyBbXSksICdjb25maWcuZC5tdHMnXSldO1xuICAvLyBOb2RlTmV4dCByZXNvbHZlcyBhIHJlbGF0aXZlIGAuL2NvbmZpZy5tanNgIGltcG9ydCB0byBgY29uZmlnLmQubXRzYCwgbm90XG4gIC8vIHRoZSBwYWNrYWdlLWxldmVsIGB0eXBlc2AgZmllbGQuIEtlZXAgdGhlIHB1Ymxpc2hlZCBjb25maWcgaW1wb3J0YWJsZSBmcm9tXG4gIC8vIHBhY2thZ2UtbG9jYWwgVHlwZVNjcmlwdCBsaW50ZXIgc2V0dGluZ3MuXG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2NvbmZpZy5kLm10cycpLCBjb25maWdEbXRzQ29udGVudCkpO1xufVxuXG5jb25zdCBjb25maWdEbXRzQ29udGVudCA9IGBleHBvcnQgeyBkZWZhdWx0IH0gZnJvbSAnLi9jb25maWcuanMnO1xuYDtcblxuZnVuY3Rpb24gYWRkRGVwZW5kZW5jeVZlcnNpb25zVG9QYWNrYWdlSnNvbihqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uLCBkZXBlbmRlbmN5VXBkYXRlczogRGVwZW5kZW5jeVVwZGF0ZXMpOiB2b2lkIHtcbiAgY29uc3QgcGFja2FnZUpzb25EZXBlbmRlbmNpZXMgPSBqc29uT2JqLmRlcGVuZGVuY2llcztcbiAgY29uc3QgcGFja2FnZUpzb25EZXZEZXBlbmRlbmNpZXMgPSBqc29uT2JqLmRldkRlcGVuZGVuY2llcztcbiAgZGVwZW5kZW5jeVVwZGF0ZXMuZGVwZW5kZW5jaWVzID0gYWRkUGFja2FnZUpzb25EZXBlbmRlbmNpZXMocGFja2FnZUpzb25EZXBlbmRlbmNpZXMsIGRlcGVuZGVuY3lVcGRhdGVzLmRlcGVuZGVuY2llcyk7XG4gIGRlcGVuZGVuY3lVcGRhdGVzLmRldkRlcGVuZGVuY2llcyA9IGRlcGVuZGVuY3lVcGRhdGVzLmRldkRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIXBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcF0pO1xuICBkZXBlbmRlbmN5VXBkYXRlcy5kZXZEZXBlbmRlbmNpZXMgPSBhZGRQYWNrYWdlSnNvbkRlcGVuZGVuY2llcyhcbiAgICBwYWNrYWdlSnNvbkRldkRlcGVuZGVuY2llcyxcbiAgICBkZXBlbmRlbmN5VXBkYXRlcy5kZXZEZXBlbmRlbmNpZXNcbiAgKTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlRW1wdHlEZXBlbmRlbmN5U2VjdGlvbnMoanNvbk9iajogUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBrZXkgb2YgZGVwZW5kZW5jeVNlY3Rpb25LZXlzKSB7XG4gICAgY29uc3Qgc2VjdGlvbiA9IGpzb25PYmpba2V5XTtcbiAgICBpZiAoc2VjdGlvbiAmJiBPYmplY3Qua2V5cyhzZWN0aW9uKS5sZW5ndGggPT09IDApIHtcbiAgICAgIFJlZmxlY3QuZGVsZXRlUHJvcGVydHkoanNvbk9iaiwga2V5KTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5zdGFsbERlcGVuZGVuY3lVcGRhdGVzKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFBhY2thZ2VKc29uLFxuICBkZXBlbmRlbmN5VXBkYXRlczogRGVwZW5kZW5jeVVwZGF0ZXMsXG4gIHBhY2thZ2VNYW5hZ2VyOiAnYnVuJyB8ICd5YXJuJ1xuKTogdm9pZCB7XG4gIGNvbnN0IGRlcGVuZGVuY2llcyA9IGRlcGVuZGVuY3lVcGRhdGVzLmRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzPy5bZGVwXSk7XG4gIGluc3RhbGxOcG1EZXBlbmRlbmNpZXMoY29uZmlnLCBwYWNrYWdlTWFuYWdlciwganNvbk9iai5kZXBlbmRlbmNpZXMgPz8ge30sIGRlcGVuZGVuY2llcywgZmFsc2UpO1xuXG4gIGNvbnN0IGRldkRlcGVuZGVuY2llcyA9IGRlcGVuZGVuY3lVcGRhdGVzLmRldkRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWpzb25PYmouZGVwZW5kZW5jaWVzPy5bZGVwXSk7XG4gIGluc3RhbGxOcG1EZXBlbmRlbmNpZXMoY29uZmlnLCBwYWNrYWdlTWFuYWdlciwganNvbk9iai5kZXZEZXBlbmRlbmNpZXMgPz8ge30sIGRldkRlcGVuZGVuY2llcywgdHJ1ZSk7XG5cbiAgY29uc3QgcHl0aG9uUGFja2FnZU1hbmFnZXIgPSBnZXRQeXRob25QYWNrYWdlTWFuYWdlcihjb25maWcpO1xuICBpZiAocHl0aG9uUGFja2FnZU1hbmFnZXIgJiYgZGVwZW5kZW5jeVVwZGF0ZXMucHl0aG9uRGV2RGVwZW5kZW5jaWVzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSBbLi4ubmV3IFNldChkZXBlbmRlbmN5VXBkYXRlcy5weXRob25EZXZEZXBlbmRlbmNpZXMpXTtcbiAgICBpZiAocHl0aG9uUGFja2FnZU1hbmFnZXIgPT09ICdwb2V0cnknKSB7XG4gICAgICBzcGF3blN5bmMoJ3BvZXRyeScsIFsnYWRkJywgJy0tZ3JvdXAnLCAnZGV2JywgLi4uZGVwZW5kZW5jaWVzXSwgY29uZmlnLmRpclBhdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzcGF3blN5bmMoJ3V2JywgWydhZGQnLCAnLS1kZXYnLCAuLi5kZXBlbmRlbmNpZXNdLCBjb25maWcuZGlyUGF0aCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldFB5dGhvblBhY2thZ2VNYW5hZ2VyKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6ICdwb2V0cnknIHwgJ3V2JyB8IHVuZGVmaW5lZCB7XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5VdkxvY2spIHJldHVybiAndXYnO1xuICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jaykgcmV0dXJuICdwb2V0cnknO1xufVxuXG5mdW5jdGlvbiBnZXRQeXRob25TZXR1cENvbW1hbmQocGFja2FnZU1hbmFnZXI6ICdwb2V0cnknIHwgJ3V2Jyk6IHN0cmluZyB7XG4gIGlmIChwYWNrYWdlTWFuYWdlciA9PT0gJ3V2JykgcmV0dXJuICd1diBzeW5jIC0tZnJvemVuJztcbiAgcmV0dXJuICdwb2V0cnkgY29uZmlnIHZpcnR1YWxlbnZzLmluLXByb2plY3QgdHJ1ZSAmJiBwb2V0cnkgZW52IHVzZSAkKG1pc2UgY3VycmVudCBweXRob24pICYmIHBvZXRyeSBydW4gcGlwIGluc3RhbGwgLS11cGdyYWRlIHBpcCAmJiBwb2V0cnkgaW5zdGFsbCc7XG59XG5cbmZ1bmN0aW9uIGluc3RhbGxOcG1EZXBlbmRlbmNpZXMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcGFja2FnZU1hbmFnZXI6ICdidW4nIHwgJ3lhcm4nLFxuICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llczogUGFydGlhbDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PixcbiAgZGVwZW5kZW5jaWVzOiBzdHJpbmdbXSxcbiAgZGV2OiBib29sZWFuXG4pOiB2b2lkIHtcbiAgaWYgKGRlcGVuZGVuY2llcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICBjb25zdCBkZXBlbmRlbmN5U3BlY2lmaWVycyA9IFtcbiAgICAuLi5uZXcgU2V0KFxuICAgICAgZGVwZW5kZW5jaWVzLm1hcCgoZGVwZW5kZW5jeSkgPT5cbiAgICAgICAgZ2V0SW5zdGFsbERlcGVuZGVuY3lTcGVjaWZpZXIoZGVwZW5kZW5jeSwgcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0sIHBhY2thZ2VNYW5hZ2VyKVxuICAgICAgKVxuICAgICksXG4gIF07XG4gIHNwYXduU3luYyhcbiAgICBwYWNrYWdlTWFuYWdlcixcbiAgICBbJ2FkZCcsIC4uLihkZXYgPyBbJy1EJ10gOiBbXSksIC4uLihjb25maWcuaXNCdW4gPyBbJy0tZXhhY3QnXSA6IFtdKSwgLi4uZGVwZW5kZW5jeVNwZWNpZmllcnNdLFxuICAgIGNvbmZpZy5kaXJQYXRoXG4gICk7XG59XG5cbmZ1bmN0aW9uIGdldEluc3RhbGxEZXBlbmRlbmN5U3BlY2lmaWVyKFxuICBkZXBlbmRlbmN5OiBzdHJpbmcsXG4gIGN1cnJlbnRWZXJzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIHBhY2thZ2VNYW5hZ2VyOiAnYnVuJyB8ICd5YXJuJ1xuKTogc3RyaW5nIHtcbiAgLy8gWWFybiBwcmVmZXJzIGxvY2FsIHdvcmtzcGFjZXMgd2hlbiBhZGRpbmcgYSBiYXJlIHBhY2thZ2UgbmFtZS4gUGFzc2luZyB0aGVcbiAgLy8gcmVzb2x2ZWQgdmVyc2lvbiBrZWVwcyBtYW5hZ2VkIHRvb2xzIGFzIG5wbSBkZXBlbmRlbmNpZXMgaW4gY29uZmlnLXBhY2thZ2VcbiAgLy8gbW9ub3JlcG9zLCB3aGVyZSB0aG9zZSBwYWNrYWdlIG5hbWVzIGNhbiBhbHNvIGV4aXN0IGFzIHdvcmtzcGFjZXMuXG4gIGlmIChwYWNrYWdlTWFuYWdlciA9PT0gJ3lhcm4nICYmIGN1cnJlbnRWZXJzaW9uICYmICFpc1dvcmtzcGFjZVByb3RvY29sUmFuZ2UoY3VycmVudFZlcnNpb24pKSB7XG4gICAgcmV0dXJuIGAke2RlcGVuZGVuY3l9QCR7Y3VycmVudFZlcnNpb259YDtcbiAgfVxuXG4gIHJldHVybiBnZXREZXBlbmRlbmN5U3BlY2lmaWVyKGRlcGVuZGVuY3kpO1xufVxuXG5mdW5jdGlvbiBhZGRQYWNrYWdlSnNvbkRlcGVuZGVuY2llcyhcbiAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXM6IFBhcnRpYWw8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4sXG4gIGRlcGVuZGVuY2llczogc3RyaW5nW11cbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgZGVwZW5kZW5jaWVzVG9JbnN0YWxsOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2YgbmV3IFNldChkZXBlbmRlbmNpZXMpKSB7XG4gICAgY29uc3Qgc2hvdWxkVXBkYXRlRXhpc3RpbmdEZXBlbmRlbmN5ID0gc2hvdWxkVXBkYXRlRXhpc3RpbmdNYW5hZ2VkRGVwZW5kZW5jeShcbiAgICAgIGRlcGVuZGVuY3ksXG4gICAgICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XVxuICAgICk7XG4gICAgaWYgKHNob3VsZFVwZGF0ZUV4aXN0aW5nRGVwZW5kZW5jeSkge1xuICAgICAgZGVwZW5kZW5jaWVzVG9JbnN0YWxsLnB1c2goZGVwZW5kZW5jeSk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldICYmXG4gICAgICAhc2hvdWxkVXBkYXRlRXhpc3RpbmdEZXBlbmRlbmN5ICYmXG4gICAgICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSAhPT0gJyonXG4gICAgKVxuICAgICAgY29udGludWU7XG4gICAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0gPSBnZXRMYXRlc3REZXBlbmRlbmN5VmVyc2lvbihkZXBlbmRlbmN5KTtcbiAgfVxuICByZXR1cm4gZGVwZW5kZW5jaWVzVG9JbnN0YWxsO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRQYWNrYWdlSnNvbldpdGhQcm9qZWN0Rm9ybWF0dGVyKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHBhY2thZ2VNYW5hZ2VyOiAnYnVuJyB8ICd5YXJuJyxcbiAgZmlsZVBhdGg6IHN0cmluZ1xuKTogdm9pZCB7XG4gIGNvbnN0IHJlbGF0aXZlRmlsZVBhdGggPSBwYXRoLnJlbGF0aXZlKGNvbmZpZy5kaXJQYXRoLCBmaWxlUGF0aCk7XG4gIGlmICghcmVsYXRpdmVGaWxlUGF0aCkgcmV0dXJuO1xuXG4gIC8vIFJldXNlIHRoZSB0YXJnZXQgcmVwb3NpdG9yeSdzIG93biBmb3JtYXR0ZXIgYWZ0ZXIgZGVwZW5kZW5jeSBpbnN0YWxsYXRpb24gc29cbiAgLy8gcGFja2FnZS5qc29uIG1hdGNoZXMgd2hhdGV2ZXIgaXRzIGN1cnJlbnQgc29ydC1wYWNrYWdlLWpzb24gdmVyc2lvbiBleHBlY3RzLlxuICAvLyBUaGlzIGF2b2lkcyBmb2xsb3ctdXAgYXV0b2ZpeCBjb21taXRzIGNhdXNlZCBvbmx5IGJ5IGZvcm1hdHRlciB2ZXJzaW9uIGRyaWZ0XG4gIC8vIGJldHdlZW4gd2JmeSBhbmQgdGhlIHByb2plY3QgYmVpbmcgdXBkYXRlZC5cbiAgaWYgKHBhY2thZ2VNYW5hZ2VyID09PSAnYnVuJykge1xuICAgIHNwYXduU3luYygnYnVueCcsIFsnc29ydC1wYWNrYWdlLWpzb24nLCByZWxhdGl2ZUZpbGVQYXRoXSwgY29uZmlnLmRpclBhdGgpO1xuICB9IGVsc2Uge1xuICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydzb3J0LXBhY2thZ2UtanNvbicsIHJlbGF0aXZlRmlsZVBhdGhdLCBjb25maWcuZGlyUGF0aCk7XG4gIH1cbn1cblxuLy8gVE9ETzogcmVtb3ZlIHRoZSBmb2xsb3dpbmcgbWlncmF0aW9uIGNvZGUgaW4gZnV0dXJlXG5hc3luYyBmdW5jdGlvbiByZW1vdmVEZXByZWNhdGVkU3R1ZmYoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogU2V0UmVxdWlyZWQ8UGFja2FnZUpzb24sICdzY3JpcHRzJyB8ICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcycgfCAncGVlckRlcGVuZGVuY2llcyc+XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKGpzb25PYmouYXV0aG9yID09PSAnV2lsbEJvb3N0ZXIgTExDJykge1xuICAgIGpzb25PYmouYXV0aG9yID0gJ1dpbGxCb29zdGVyIEluYy4nO1xuICB9XG4gIHJlbW92ZVNlbGZEZXBlbmRlbmN5KGNvbmZpZywganNvbk9iaik7XG4gIHJlcGxhY2VXaWxsQm9vc3RlckNvbmZpZ3NXb3Jrc3BhY2VEZXBlbmRlbmN5UmFuZ2VzKGNvbmZpZywganNvbk9iaik7XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3NvcnQtcGFja2FnZS1qc29uJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3NvcnQtYWxsLXBhY2thZ2UtanNvbiddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydjaGVjay1hbGwtZm9yLWFpJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2NoZWNrLWZvci1haSddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWyd0eXBlY2hlY2svd2FybiddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWyd0eXBlY2hlY2s6Z2VuLWNvZGUnXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sndHlwZWNoZWNrOmNvZGVnZW4nXTtcbiAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzLnRzbGliO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9yZW5vdmF0ZS1jb25maWcnXTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvdHNjb25maWcnXTtcbiAgLy8gTmV4dC5qcyBzdGlsbCByZXF1aXJlcyB0aGUgYHR5cGVzY3JpcHRgIHBhY2thZ2UgYXQgYnVpbGQvZGV2IHRpbWUgZm9yXG4gIC8vIFR5cGVTY3JpcHQgcHJvamVjdHMgZXZlbiB3aGVuIHJlcG9zIHVzZSB0c2dvIGZvciBleHBsaWNpdCB0eXBlY2hlY2tpbmcuXG4gIGlmICghY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW3R5cGVzY3JpcHREZXBlbmRlbmN5XTtcbiAgfVxuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXMubGVybmE7XG4gIC8vIFRvIGluc3RhbGwgdGhlIGxhdGVzdCBwaW5zdFxuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXMucGluc3Q7XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2ZsdXR0ZXItZm9ybWF0J107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2Zvcm1hdC1mbHV0dGVyJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3B5dGhvbi1mb3JtYXQnXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snZm9ybWF0LXB5dGhvbiddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzLnByZXR0aWVyO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydjaGVjay1hbGwnXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sndmVyaWZ5LWNvZGUnXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sndmVyaWZ5LWNvZGUtd2l0aC10ZXN0cyddO1xuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnbGVybmEuanNvbicpLCB7IGZvcmNlOiB0cnVlIH0pKTtcblxuICByZW1vdmVXaWxsQm9vc3RlckNvbmZpZ3NNYW5hZ2VkRGVwZW5kZW5jaWVzKGNvbmZpZywganNvbk9iaik7XG4gIHJlbW92ZU9ic29sZXRlTGludERlcGVuZGVuY2llcyhqc29uT2JqLCBjb25maWcpO1xufVxuXG5mdW5jdGlvbiByZW1vdmVTZWxmRGVwZW5kZW5jeShcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBTZXRSZXF1aXJlZDxQYWNrYWdlSnNvbiwgJ2RlcGVuZGVuY2llcycgfCAnZGV2RGVwZW5kZW5jaWVzJyB8ICdwZWVyRGVwZW5kZW5jaWVzJz5cbik6IHZvaWQge1xuICBjb25zdCBwYWNrYWdlTmFtZSA9IGpzb25PYmoubmFtZSB8fCBwYXRoLmJhc2VuYW1lKGNvbmZpZy5kaXJQYXRoKTtcblxuICAvLyBBIHBhY2thZ2UgY2FuIGltcG9ydCBpdHNlbGYgdGhyb3VnaCBOb2RlJ3MgcGFja2FnZSBzZWxmLXJlZmVyZW5jZSB3aXRob3V0XG4gIC8vIGRlY2xhcmluZyBpdHNlbGY7IGtlZXBpbmcgdGhhdCBlZGdlIGJyZWFrcyBtb25vcmVwbyByZWxlYXNlIHRvcG9sb2dpY2FsIHNvcnRpbmcuXG4gIGZvciAoY29uc3Qgc2VjdGlvbiBvZiBnZXREZXBlbmRlbmN5U2VjdGlvbnMoanNvbk9iaikpIHtcbiAgICBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KHNlY3Rpb24sIHBhY2thZ2VOYW1lKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXBsYWNlV2lsbEJvb3N0ZXJDb25maWdzV29ya3NwYWNlRGVwZW5kZW5jeVJhbmdlcyhjb25maWc6IFBhY2thZ2VDb25maWcsIGpzb25PYmo6IFBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGlmICghY29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzKSByZXR1cm47XG5cbiAgZm9yIChjb25zdCBzZWN0aW9uIG9mIGdldERlcGVuZGVuY3lTZWN0aW9ucyhqc29uT2JqKSkge1xuICAgIGZvciAoY29uc3QgW2RlcGVuZGVuY3ksIHZlcnNpb25dIG9mIE9iamVjdC5lbnRyaWVzKHNlY3Rpb24pKSB7XG4gICAgICBpZiAoIXZlcnNpb24pIGNvbnRpbnVlO1xuICAgICAgaWYgKCFpc1dvcmtzcGFjZVByb3RvY29sUmFuZ2UodmVyc2lvbikpIGNvbnRpbnVlO1xuICAgICAgLy8gd2lsbGJvb3N0ZXItY29uZmlncyBwdWJsaXNoZXMgdGhlc2UgcGFja2FnZXMgaW5kZXBlbmRlbnRseSwgc28gZ2VuZXJhdGVkXG4gICAgICAvLyBwYWNrYWdlIG1ldGFkYXRhIG11c3QgZGVzY3JpYmUgbnBtIHJlbGVhc2UgZWRnZXMgaW5zdGVhZCBvZiBsb2NhbFxuICAgICAgLy8gd29ya3NwYWNlIGVkZ2VzIHRoYXQgcmVsZWFzZSB0b29saW5nIHRyZWF0cyBhcyBtb25vcmVwbyBncmFwaCBsaW5rcy5cbiAgICAgIC8vIFRoZSBmaW5hbCBgeWFybiBpbnN0YWxsIC0tbm8taW1tdXRhYmxlYCBzeW5jcyB0aGUgbG9ja2ZpbGUgYWZ0ZXIgdGhpc1xuICAgICAgLy8gbWlncmF0aW9uLCBldmVuIHdoZW4gdGhlIGRlcGVuZGVuY3kgaXMgbm90IHBhcnQgb2Ygd2JmeSdzIG1hbmFnZWQgbGlzdC5cbiAgICAgIHNlY3Rpb25bZGVwZW5kZW5jeV0gPSBnZXRMYXRlc3REZXBlbmRlbmN5VmVyc2lvbihkZXBlbmRlbmN5KTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVtb3ZlV2lsbEJvb3N0ZXJDb25maWdzTWFuYWdlZERlcGVuZGVuY2llcyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBTZXRSZXF1aXJlZDxQYWNrYWdlSnNvbiwgJ2RlcGVuZGVuY2llcycgfCAnZGV2RGVwZW5kZW5jaWVzJyB8ICdwZWVyRGVwZW5kZW5jaWVzJz5cbik6IHZvaWQge1xuICBpZiAoIWNvbmZpZy5pc1dpbGxCb29zdGVyQ29uZmlncykgcmV0dXJuO1xuXG4gIGNvbnN0IHNlY3Rpb25zID0gZ2V0RGVwZW5kZW5jeVNlY3Rpb25zKGpzb25PYmopO1xuICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2Ygd2lsbEJvb3N0ZXJDb25maWdzTWFuYWdlZERlcGVuZGVuY2llcykge1xuICAgIC8vIHdpbGxib29zdGVyLWNvbmZpZ3Mgb3ducyB0aGVzZSBjb25maWcgcGFja2FnZXMuIFBhY2thZ2UtbG9jYWwgZm9ybWF0dGVyXG4gICAgLy8gYW5kIGxpbnRlciBjb25maWcgZmlsZXMgYXJlIHJlcG8gdG9vbGluZywgbm90IHB1Ymxpc2hlZCBwYWNrYWdlIGRhdGEsIHNvXG4gICAgLy8gdGhlIHBhY2thZ2UgbWV0YWRhdGEgb25seSBuZWVkcyB0aGUgZm9ybWF0dGVyL2xpbnRlciBleGVjdXRhYmxlcy5cbiAgICBmb3IgKGNvbnN0IHNlY3Rpb24gb2Ygc2VjdGlvbnMpIHtcbiAgICAgIFJlZmxlY3QuZGVsZXRlUHJvcGVydHkoc2VjdGlvbiwgZGVwZW5kZW5jeSk7XG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZVVudXNlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uLFxuICB1c2VkRGVwZW5kZW5jaWVzOiBzdHJpbmdbXVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHVzZWREZXBlbmRlbmN5U2V0ID0gbmV3IFNldCh1c2VkRGVwZW5kZW5jaWVzKTtcbiAgY29uc3QgZXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMgPSBhd2FpdCBnZXRFeGlzdGluZ1RzY29uZmlnQmFzZURlcGVuZGVuY2llcyhjb25maWcpO1xuICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2YgbWFuYWdlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcykge1xuICAgIGlmICh1c2VkRGVwZW5kZW5jeVNldC5oYXMoZGVwZW5kZW5jeSkgfHwgZXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMuaGFzKGRlcGVuZGVuY3kpKSBjb250aW51ZTtcbiAgICAvLyB3YmZ5IG93bnMgdGhlc2UgYmFzZS1jb25maWcgcGFja2FnZXMuIFJlbW92ZSBzdGFsZSB2YXJpYW50cyB3aGVuIHJlcG9cbiAgICAvLyBjYXBhYmlsaXRpZXMgY2hhbmdlLCBzdWNoIGFzIE5leHQuanMgdGFraW5nIG93bmVyc2hpcCBvZiB0c2NvbmZpZy5qc29uLlxuICAgIGZvciAoY29uc3Qgc2VjdGlvbiBvZiBnZXREZXBlbmRlbmN5U2VjdGlvbnMoanNvbk9iaikpIHtcbiAgICAgIFJlZmxlY3QuZGVsZXRlUHJvcGVydHkoc2VjdGlvbiwgZGVwZW5kZW5jeSk7XG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEV4aXN0aW5nVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8U2V0PHN0cmluZz4+IHtcbiAgY29uc3QgZXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgZmlsZVBhdGhzID0gYXdhaXQgZmcuZ2xvYignKiovdHNjb25maWcqLmpzb24nLCB7XG4gICAgY3dkOiBjb25maWcuZGlyUGF0aCxcbiAgICBkb3Q6IHRydWUsXG4gICAgaWdub3JlOiBnbG9iSWdub3JlLFxuICB9KTtcblxuICBmb3IgKGNvbnN0IGZpbGVQYXRoIG9mIGZpbGVQYXRocykge1xuICAgIGNvbnN0IGFic29sdXRlRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGZpbGVQYXRoKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGFyc2VkID0gdHMucGFyc2VDb25maWdGaWxlVGV4dFRvSnNvbihcbiAgICAgICAgYWJzb2x1dGVGaWxlUGF0aCxcbiAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoYWJzb2x1dGVGaWxlUGF0aCwgJ3V0ZjgnKVxuICAgICAgKTtcbiAgICAgIGlmIChwYXJzZWQuZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBQcmVzZXJ2ZSBtYW5hZ2VkIEB0c2NvbmZpZyBkZXBlbmRlbmNpZXMgYmVjYXVzZSAke2Fic29sdXRlRmlsZVBhdGh9IGNvdWxkIG5vdCBiZSBwYXJzZWQ6ICR7Zm9ybWF0VHNEaWFnbm9zdGljKHBhcnNlZC5lcnJvcil9YFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gbmV3IFNldChtYW5hZ2VkVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgdmFsdWUgb2Ygbm9ybWFsaXplVHNjb25maWdFeHRlbmRzKChwYXJzZWQuY29uZmlnIGFzIHsgZXh0ZW5kcz86IHVua25vd24gfSB8IHVuZGVmaW5lZCk/LmV4dGVuZHMpKSB7XG4gICAgICAgIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiBtYW5hZ2VkVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKSB7XG4gICAgICAgICAgaWYgKHZhbHVlID09PSBkZXBlbmRlbmN5IHx8IHZhbHVlLnN0YXJ0c1dpdGgoYCR7ZGVwZW5kZW5jeX0vYCkpIHtcbiAgICAgICAgICAgIGV4aXN0aW5nVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzLmFkZChkZXBlbmRlbmN5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgUHJlc2VydmUgbWFuYWdlZCBAdHNjb25maWcgZGVwZW5kZW5jaWVzIGJlY2F1c2UgJHthYnNvbHV0ZUZpbGVQYXRofSBjb3VsZCBub3QgYmUgcmVhZDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YFxuICAgICAgKTtcbiAgICAgIHJldHVybiBuZXcgU2V0KG1hbmFnZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBleGlzdGluZ1RzY29uZmlnQmFzZURlcGVuZGVuY2llcztcbn1cblxuZnVuY3Rpb24gZm9ybWF0VHNEaWFnbm9zdGljKGRpYWdub3N0aWM6IHRzLkRpYWdub3N0aWMpOiBzdHJpbmcge1xuICByZXR1cm4gdHMuZmxhdHRlbkRpYWdub3N0aWNNZXNzYWdlVGV4dChkaWFnbm9zdGljLm1lc3NhZ2VUZXh0LCAnXFxuJyk7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVRzY29uZmlnRXh0ZW5kcyh2YWx1ZTogdW5rbm93bik6IHN0cmluZ1tdIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHJldHVybiBbdmFsdWVdO1xuICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gW107XG4gIHJldHVybiB2YWx1ZS5maWx0ZXIoKGl0ZW0pOiBpdGVtIGlzIHN0cmluZyA9PiB0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycpO1xufVxuXG5mdW5jdGlvbiBnZXREZXBlbmRlbmN5U2VjdGlvbnMoanNvbk9iajogUGFja2FnZUpzb24pOiBQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+W10ge1xuICByZXR1cm4gZGVwZW5kZW5jeVNlY3Rpb25LZXlzXG4gICAgLm1hcCgoa2V5KSA9PiBqc29uT2JqW2tleV0pXG4gICAgLmZpbHRlcigoc2VjdGlvbik6IHNlY3Rpb24gaXMgUGFydGlhbDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiA9PiAhIXNlY3Rpb24pO1xufVxuXG5mdW5jdGlvbiBnZXRMYXRlc3REZXBlbmRlbmN5VmVyc2lvbihkZXBlbmRlbmN5OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBjYWNoZWRWZXJzaW9uID0gbGF0ZXN0RGVwZW5kZW5jeVZlcnNpb25DYWNoZS5nZXQoZGVwZW5kZW5jeSk7XG4gIGlmIChjYWNoZWRWZXJzaW9uKSByZXR1cm4gY2FjaGVkVmVyc2lvbjtcblxuICBjb25zdCB2ZXJzaW9uID0gZ2V0RGVwZW5kZW5jeVZlcnNpb25Gcm9tTnBtKGRlcGVuZGVuY3kpO1xuICBsYXRlc3REZXBlbmRlbmN5VmVyc2lvbkNhY2hlLnNldChkZXBlbmRlbmN5LCB2ZXJzaW9uKTtcbiAgcmV0dXJuIHZlcnNpb247XG59XG5cbmZ1bmN0aW9uIGdldERlcGVuZGVuY3lWZXJzaW9uRnJvbU5wbShkZXBlbmRlbmN5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBucG0ncyBsYXRlc3QgZGlzdC10YWcgc3RpbGwgdHJhY2tzIFRTNyBkZXYgc25hcHNob3RzOyB3YmZ5IHNob3VsZCBmb2xsb3dcbiAgLy8gdGhlIHB1YmxpYyBiZXRhIGNoYW5uZWwgdW50aWwgdGhlIHN0YWJsZSBUUzcgcGFja2FnZSBsYXlvdXQgaXMgZmluYWxpemVkLlxuICByZXR1cm4gKFxuICAgIHNwYXduU3luY0FuZFJldHVyblN0ZG91dChcbiAgICAgICducG0nLFxuICAgICAgWydzaG93JywgZ2V0RGVwZW5kZW5jeVNwZWNpZmllcihkZXBlbmRlbmN5KSwgJ3ZlcnNpb24nLCAnLS13b3Jrc3BhY2VzPWZhbHNlJ10sXG4gICAgICBwcm9jZXNzLmN3ZCgpXG4gICAgKSB8fCAnKidcbiAgKTtcbn1cblxuZnVuY3Rpb24gZ2V0RGVwZW5kZW5jeVNwZWNpZmllcihkZXBlbmRlbmN5OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gZGVwZW5kZW5jeSA9PT0gdHlwZXNjcmlwdEdvRGVwZW5kZW5jeSA/IGAke2RlcGVuZGVuY3l9QGJldGFgIDogZGVwZW5kZW5jeTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlT2Jzb2xldGVMaW50RGVwZW5kZW5jaWVzKFxuICBqc29uT2JqOiBTZXRSZXF1aXJlZDxQYWNrYWdlSnNvbiwgJ2RlcGVuZGVuY2llcycgfCAnZGV2RGVwZW5kZW5jaWVzJyB8ICdwZWVyRGVwZW5kZW5jaWVzJz4sXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZ1xuKTogdm9pZCB7XG4gIGNvbnN0IHByZXNlcnZlTWljcm9tYXRjaCA9IHNob3VsZFByZXNlcnZlTWljcm9tYXRjaChjb25maWcpO1xuICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2Ygb2Jzb2xldGVMaW50RGVwZW5kZW5jaWVzKSB7XG4gICAgaWYgKHByZXNlcnZlTWljcm9tYXRjaCAmJiBtaWNyb21hdGNoUGFja2FnZU5hbWVzLmhhcyhkZXBlbmRlbmN5KSkgY29udGludWU7XG4gICAgaWYgKHNob3VsZFByZXNlcnZlQ29uZmlnUGFja2FnZUxpbnREZXBlbmRlbmN5KGpzb25PYmosIGNvbmZpZywgZGVwZW5kZW5jeSkpIGNvbnRpbnVlO1xuICAgIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XTtcbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV07XG4gICAgZGVsZXRlIGpzb25PYmoucGVlckRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRQcmVzZXJ2ZUNvbmZpZ1BhY2thZ2VMaW50RGVwZW5kZW5jeShcbiAganNvbk9iajogU2V0UmVxdWlyZWQ8UGFja2FnZUpzb24sICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcycgfCAncGVlckRlcGVuZGVuY2llcyc+LFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGRlcGVuZGVuY3k6IHN0cmluZ1xuKTogYm9vbGVhbiB7XG4gIGlmICghaXNQdWJsaXNoZWRXaWxsYm9vc3RlckNvbmZpZ3NQYWNrYWdlKGNvbmZpZykpIHJldHVybiBmYWxzZTtcbiAgaWYgKGpzb25PYmoucGVlckRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSkgcmV0dXJuIHRydWU7XG5cbiAgLy8gUHVibGlzaGVkIGNvbmZpZyBwYWNrYWdlcyBuZWVkIGxvY2FsIHR5cGUtb25seSBkZXBzIHRvIHZhbGlkYXRlIHRoZVxuICAvLyBwYWNrYWdlLXByb3ZpZGVkIGNvbmZpZyBkZWNsYXJhdGlvbnMgdW5kZXIgWWFybiBQblAuXG4gIHJldHVybiBkZXBlbmRlbmN5ID09PSAnQHR5cGVzL2VzbGludCcgJiYgISFqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXMuZXNsaW50O1xufVxuXG5mdW5jdGlvbiBzaG91bGRQcmVzZXJ2ZU1pY3JvbWF0Y2goY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIC8vIHdpbGxib29zdGVyLWNvbmZpZ3Mgc3VicGFja2FnZXMgcHVibGlzaCBjb25maWcgZmlsZXMgYXMgdGhlaXIgcHJvZHVjdCwgc29cbiAgLy8gbWljcm9tYXRjaCBpcyBwYWNrYWdlIGRhdGEgdGhlcmUuIE90aGVyIHJlcG9zIGtlZXAgbWljcm9tYXRjaCBvbmx5IHdoZW5cbiAgLy8gcHJvZHVjdCBjb2RlIGltcG9ydHMgaXQ7IG90aGVyd2lzZSBpdCBpcyB0cmVhdGVkIGFzIG9ic29sZXRlIEVTTGludC1lcmFcbiAgLy8gdG9vbGluZy5cbiAgcmV0dXJuIChjb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3MgJiYgIWNvbmZpZy5pc1Jvb3QpIHx8IGRvZXNQcm9kdWN0Q29kZUltcG9ydE1pY3JvbWF0Y2goY29uZmlnLmRpclBhdGgpO1xufVxuXG5mdW5jdGlvbiBkb2VzUHJvZHVjdENvZGVJbXBvcnRNaWNyb21hdGNoKGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBmaWxlUGF0aHMgPSBmZy5nbG9iU3luYygnc3JjLyoqLyoue2pzLGpzeCxtanMsY2pzLHRzLHRzeCxtdHMsY3RzfScsIHtcbiAgICBjd2Q6IGRpclBhdGgsXG4gICAgZG90OiB0cnVlLFxuICAgIGlnbm9yZTogZ2xvYklnbm9yZSxcbiAgfSk7XG4gIHJldHVybiBmaWxlUGF0aHMuc29tZSgoZmlsZVBhdGgpID0+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIG1pY3JvbWF0Y2hJbXBvcnRQYXR0ZXJuLnRlc3QoZnMucmVhZEZpbGVTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCBmaWxlUGF0aCksICd1dGY4JykpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFVwZGF0ZUV4aXN0aW5nTWFuYWdlZERlcGVuZGVuY3koZGVwZW5kZW5jeTogc3RyaW5nLCBjdXJyZW50VmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIGlmICghY3VycmVudFZlcnNpb24pIHJldHVybiB0cnVlO1xuICBpZiAoY3VycmVudFZlcnNpb24gPT09ICcqJykgcmV0dXJuIHRydWU7XG4gIGlmIChpc1dvcmtzcGFjZVByb3RvY29sUmFuZ2UoY3VycmVudFZlcnNpb24pKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKGRlcGVuZGVuY3kgPT09IHR5cGVzY3JpcHRHb0RlcGVuZGVuY3kpIHJldHVybiBpc05ld2VyTWFuYWdlZERlcGVuZGVuY3lWZXJzaW9uKGRlcGVuZGVuY3ksIGN1cnJlbnRWZXJzaW9uKTtcbiAgLy8gd2JmeS1tYW5hZ2VkIHRvb2xzIG11c3QgYmUga2VwdCBjdXJyZW50IGV2ZW4gd2hlbiB0aGUgcGFja2FnZSBhbHJlYWR5IHBpbnNcbiAgLy8gYSBjb25jcmV0ZSB2ZXJzaW9uLiBJbiBwYXJ0aWN1bGFyLCBidWlsZC10cyBvd25zIGRlY2xhcmF0aW9uIG91dHB1dCBwYXRocy5cbiAgcmV0dXJuIGRlcGVuZGVuY3kgPT09ICdAd2lsbGJvb3N0ZXIvd2InIHx8IGRlcGVuZGVuY3kgPT09IGJ1aWxkVHNEZXBlbmRlbmN5IHx8IG94bGludERlcHMuaW5jbHVkZXMoZGVwZW5kZW5jeSk7XG59XG5cbmZ1bmN0aW9uIGlzTmV3ZXJNYW5hZ2VkRGVwZW5kZW5jeVZlcnNpb24oZGVwZW5kZW5jeTogc3RyaW5nLCBjdXJyZW50VmVyc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGxhdGVzdFZlcnNpb24gPSBnZXRMYXRlc3REZXBlbmRlbmN5VmVyc2lvbihkZXBlbmRlbmN5KTtcbiAgY29uc3QgdmFsaWRMYXRlc3RWZXJzaW9uID0gc2VtdmVyLnZhbGlkKGxhdGVzdFZlcnNpb24pO1xuICBjb25zdCB2YWxpZEN1cnJlbnRWZXJzaW9uID0gc2VtdmVyLnZhbGlkKGN1cnJlbnRWZXJzaW9uKTtcbiAgLy8gVGhlIFR5cGVTY3JpcHQgYmV0YSBkaXN0LXRhZyBjYW4gbGFnIGJlaGluZCBuZXdlciBjb25jcmV0ZSBkZXYgc25hcHNob3RzXG4gIC8vIGFscmVhZHkgcGlubmVkIGJ5IFJlbm92YXRlLiBLZWVwIHRoZSBleGlzdGluZyBwaW4gaW5zdGVhZCBvZiBkb3duZ3JhZGluZy5cbiAgcmV0dXJuICF2YWxpZExhdGVzdFZlcnNpb24gfHwgIXZhbGlkQ3VycmVudFZlcnNpb24gfHwgc2VtdmVyLmd0KHZhbGlkTGF0ZXN0VmVyc2lvbiwgdmFsaWRDdXJyZW50VmVyc2lvbik7XG59XG5cbmZ1bmN0aW9uIGlzV29ya3NwYWNlUHJvdG9jb2xSYW5nZSh2ZXJzaW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHZlcnNpb24uc3RhcnRzV2l0aCgnd29ya3NwYWNlOicpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24oXG4gIHJlcG9zaXRvcnk6IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J10sXG4gIGV4aXN0aW5nUmVwb3NpdG9yeT86IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J11cbik6IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J10ge1xuICBjb25zdCBub3JtYWxpemVkUmVwb3NpdG9yeSA9IG5vcm1hbGl6ZVJlcG9zaXRvcnlVcmxGb3JQYWNrYWdlSnNvbihyZXBvc2l0b3J5KTtcbiAgaWYgKG5vcm1hbGl6ZWRSZXBvc2l0b3J5KSB7XG4gICAgcmV0dXJuIGJ1aWxkTm9ybWFsaXplZFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbihub3JtYWxpemVkUmVwb3NpdG9yeSwgcmVwb3NpdG9yeSwgZXhpc3RpbmdSZXBvc2l0b3J5KTtcbiAgfVxuXG4gIGNvbnN0IG5vcm1hbGl6ZWRFeGlzdGluZ1JlcG9zaXRvcnkgPSBub3JtYWxpemVSZXBvc2l0b3J5VXJsRm9yUGFja2FnZUpzb24oZXhpc3RpbmdSZXBvc2l0b3J5KTtcbiAgaWYgKG5vcm1hbGl6ZWRFeGlzdGluZ1JlcG9zaXRvcnkpIHtcbiAgICByZXR1cm4gYnVpbGROb3JtYWxpemVkUmVwb3NpdG9yeUZvclBhY2thZ2VKc29uKG5vcm1hbGl6ZWRFeGlzdGluZ1JlcG9zaXRvcnksIGV4aXN0aW5nUmVwb3NpdG9yeSk7XG4gIH1cblxuICByZXR1cm4gcmVwb3NpdG9yeTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplUmVwb3NpdG9yeVVybEZvclBhY2thZ2VKc29uKHJlcG9zaXRvcnk6IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J10pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAodHlwZW9mIHJlcG9zaXRvcnkgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKCFyZXBvc2l0b3J5LnN0YXJ0c1dpdGgoJ2dpdGh1YjonKSkgcmV0dXJuO1xuXG4gICAgY29uc3QgW293bmVyLCByZXBvXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShyZXBvc2l0b3J5KTtcbiAgICBpZiAoIW93bmVyIHx8ICFyZXBvKSByZXR1cm47XG4gICAgcmV0dXJuIGBnaXQraHR0cHM6Ly9naXRodWIuY29tLyR7b3duZXJ9LyR7cmVwb30uZ2l0YDtcbiAgfVxuXG4gIGNvbnN0IHJlcG9zaXRvcnlVcmwgPSByZXBvc2l0b3J5Py51cmw7XG4gIGlmICh0eXBlb2YgcmVwb3NpdG9yeVVybCAhPT0gJ3N0cmluZycpIHJldHVybjtcblxuICBjb25zdCBtYXRjaGVkID0gL14oPzpnaXRcXCspP2h0dHBzOlxcL1xcL2dpdGh1YlxcLmNvbVxcLyhbXi9dKylcXC8oW14vXSs/KSg/OlxcLmdpdCk/JC91LmV4ZWMocmVwb3NpdG9yeVVybCk7XG4gIGlmICghbWF0Y2hlZCkgcmV0dXJuO1xuXG4gIGNvbnN0IFssIG93bmVyLCByZXBvXSA9IG1hdGNoZWQ7XG4gIHJldHVybiBgZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS8ke293bmVyfS8ke3JlcG99LmdpdGA7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkTm9ybWFsaXplZFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbihcbiAgbm9ybWFsaXplZFVybDogc3RyaW5nLFxuICByZXBvc2l0b3J5OiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddLFxuICBleGlzdGluZ1JlcG9zaXRvcnk/OiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddXG4pOiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddIHtcbiAgY29uc3QgcmVwb3NpdG9yeU9iaiA9XG4gICAgdHlwZW9mIHJlcG9zaXRvcnkgPT09ICdvYmplY3QnXG4gICAgICA/IHJlcG9zaXRvcnlcbiAgICAgIDogdHlwZW9mIGV4aXN0aW5nUmVwb3NpdG9yeSA9PT0gJ29iamVjdCdcbiAgICAgICAgPyBleGlzdGluZ1JlcG9zaXRvcnlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5yZXBvc2l0b3J5T2JqLFxuICAgIHR5cGU6ICdnaXQnLFxuICAgIHVybDogbm9ybWFsaXplZFVybCxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlU2NyaXB0cyhjb25maWc6IFBhY2thZ2VDb25maWcsIG9sZFNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgIGNvbnN0IGhhc1R5cGVjaGVjayA9IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXM7XG4gICAgY29uc3Qgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgIGNsZWFudXA6ICdidW4gLS1idW4gd2IgbGludCAtLWZpeCAtLWZvcm1hdCcsXG4gICAgICBmb3JtYXQ6IGBidW4gLS1idW4gd2IgbGludCAtLWZvcm1hdGAsXG4gICAgICBsaW50OiBgYnVuIC0tYnVuIHdiIGxpbnRgLFxuICAgICAgJ2xpbnQtZml4JzogJ2J1biAtLWJ1biB3YiBsaW50IC0tZml4JyxcbiAgICAgIHRlc3Q6ICdidW4gd2IgdGVzdCcsXG4gICAgICB0eXBlY2hlY2s6ICdidW4gLS1idW4gd2IgdHlwZWNoZWNrJyxcbiAgICAgIHZlcmlmeTogJ2J1biAtLWJ1biB3YiB2ZXJpZnknLFxuICAgICAgJ3ZlcmlmeS1mdWxsJzogJ2J1biAtLWJ1biB3YiB2ZXJpZnkgLS1mdWxsJyxcbiAgICB9O1xuICAgIGFwcGx5TWlzZVRhc2tTY3JpcHRzKGNvbmZpZywgc2NyaXB0cywgb2xkU2NyaXB0cywgWydidWlsZCcsICdkZXYnLCAnc3RhcnQnLCAndGVzdCcsICd0eXBlY2hlY2snXSk7XG4gICAgaWYgKCFoYXNUeXBlY2hlY2spIHtcbiAgICAgIGRlbGV0ZSBzY3JpcHRzLnR5cGVjaGVjaztcbiAgICB9IGVsc2UgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHlyaWdodCkge1xuICAgICAgc2NyaXB0cy50eXBlY2hlY2sgKz0gJyAmJiBweXJpZ2h0JztcbiAgICB9XG4gICAgcmV0dXJuIHNjcmlwdHM7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgaGFzVHlwZWNoZWNrID0gY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcztcbiAgICBjb25zdCBoYXNKc09yVHMgPSBkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpO1xuICAgIGNvbnN0IGhhc0phdmEgPSBkb2VzQ29udGFpbkphdmEoY29uZmlnKTtcbiAgICBjb25zdCBvbGRUZXN0ID0gb2xkU2NyaXB0cy50ZXN0O1xuICAgIGxldCBzY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgY2xlYW51cDogJ3lhcm4gZm9ybWF0ICYmIHlhcm4gbGludC1maXgnLFxuICAgICAgZm9ybWF0OiBnZW5lcmF0ZUZvcm1hdFNjcmlwdChoYXNKc09yVHMsIGhhc0phdmEpLFxuICAgICAgbGludDogYG94bGludCAtLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuIC5gLFxuICAgICAgJ2xpbnQtZml4JzogJ3lhcm4gbGludCAtLWZpeCcsXG4gICAgICAnZm9ybWF0LWNvZGUnOiBgb3hmbXQgLS13cml0ZSAtLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuIC4gJyEqKi9wYWNrYWdlLmpzb24nYCxcbiAgICAgIHR5cGVjaGVjazogJ3RzZ28gLS1ub0VtaXQnLFxuICAgIH07XG4gICAgaWYgKGhhc0phdmEpIHtcbiAgICAgIHNjcmlwdHMucHJldHRpZnkgPSBgcHJldHRpZXIgLS1jYWNoZSAtLWNvbG9yIC0tbm8tZXJyb3Itb24tdW5tYXRjaGVkLXBhdHRlcm4gLS13cml0ZSBcIioqL3suKi8sfSoueyR7ZXh0ZW5zaW9ucy5wcmV0dGllck9ubHkuam9pbignLCcpfX1cIiBcIiEqKi90ZXN0ey0sL31maXh0dXJlcy8qKlwiYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucykge1xuICAgICAgc2NyaXB0cyA9IG1lcmdlKFxuICAgICAgICB7IC4uLnNjcmlwdHMgfSxcbiAgICAgICAge1xuICAgICAgICAgIGZvcm1hdDogYCR7c2NyaXB0cy5mb3JtYXR9ICYmIHlhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsIC0tcGFyYWxsZWwgLS12ZXJib3NlIHJ1biBmb3JtYXRgLFxuICAgICAgICAgIGxpbnQ6IGB5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCAtLXBhcmFsbGVsIC0tdmVyYm9zZSBydW4gbGludGAsXG4gICAgICAgICAgJ2xpbnQtZml4JzogJ3lhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsIC0tcGFyYWxsZWwgLS12ZXJib3NlIHJ1biBsaW50LWZpeCcsXG4gICAgICAgICAgLy8gQ0k9MSBwcmV2ZW50cyB2aXRlc3QgZnJvbSBlbmFibGluZyB3YXRjaC5cbiAgICAgICAgICAvLyBGT1JDRV9DT0xPUj0zIG1ha2Ugd2IgZW5hYmxlIGNvbG9yIG91dHB1dC5cbiAgICAgICAgICB0ZXN0OiAnQ0k9MSBGT1JDRV9DT0xPUj0zIHlhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsIC0tdmVyYm9zZSBydW4gdGVzdCcsXG4gICAgICAgICAgdHlwZWNoZWNrOiAneWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwgLS1wYXJhbGxlbCAtLXZlcmJvc2UgcnVuIHR5cGVjaGVjaycsXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICBpZiAoaGFzSmF2YSkge1xuICAgICAgICBzY3JpcHRzLnByZXR0aWZ5ID0gYHByZXR0aWVyIC0tY2FjaGUgLS1jb2xvciAtLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuIC0td3JpdGUgXCIqKi97LiovLH0qLnske2V4dGVuc2lvbnMucHJldHRpZXJPbmx5LmpvaW4oXG4gICAgICAgICAgJywnXG4gICAgICAgICl9fVwiIFwiISoqL3BhY2thZ2VzLyoqXCIgXCIhKiovdGVzdHstLC99Zml4dHVyZXMvKipcImA7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjb25maWcuZGVwZW5kaW5nLnB5cmlnaHQpIHtcbiAgICAgIHNjcmlwdHMudHlwZWNoZWNrID0gc2NyaXB0cy50eXBlY2hlY2sgPyBgJHtzY3JpcHRzLnR5cGVjaGVja30gJiYgYCA6ICcnO1xuICAgICAgc2NyaXB0cy50eXBlY2hlY2sgKz0gJ3B5cmlnaHQnO1xuICAgIH1cbiAgICBpZiAob2xkVGVzdD8uaW5jbHVkZXMoJ3diIHRlc3QnKSkge1xuICAgICAgc2NyaXB0cy50ZXN0ID0gb2xkVGVzdDtcbiAgICB9XG4gICAgaWYgKCFoYXNKc09yVHMpIHtcbiAgICAgIGRlbGV0ZSBzY3JpcHRzWydmb3JtYXQtY29kZSddO1xuICAgICAgZGVsZXRlIHNjcmlwdHMubGludDtcbiAgICAgIGRlbGV0ZSBzY3JpcHRzWydsaW50LWZpeCddO1xuICAgIH1cbiAgICBpZiAoIWhhc1R5cGVjaGVjaykge1xuICAgICAgZGVsZXRlIHNjcmlwdHMudHlwZWNoZWNrO1xuICAgIH0gZWxzZSBpZiAoY29uZmlnLmRlcGVuZGluZy53Yikge1xuICAgICAgc2NyaXB0cy50eXBlY2hlY2sgPSAnd2IgdHlwZWNoZWNrJztcbiAgICB9XG4gICAgaWYgKGlzV2JQYWNrYWdlKGNvbmZpZy5wYWNrYWdlSnNvbikpIHtcbiAgICAgIHNjcmlwdHMudmVyaWZ5ID0gb2xkU2NyaXB0cy52ZXJpZnkgPz8gJ3lhcm4gd29ya3NwYWNlIEB3aWxsYm9vc3Rlci93YiBzdGFydCAtLXdvcmtpbmctZGlyIFwiJElOSVRfQ1dEXCIgdmVyaWZ5JztcbiAgICAgIHNjcmlwdHNbJ3ZlcmlmeS1mdWxsJ10gPSBvbGRTY3JpcHRzWyd2ZXJpZnktZnVsbCddID8/ICd5YXJuIHZlcmlmeSAtLWZ1bGwnO1xuICAgIH0gZWxzZSB7XG4gICAgICBzY3JpcHRzLnZlcmlmeSA9ICd3YiB2ZXJpZnknO1xuICAgICAgc2NyaXB0c1sndmVyaWZ5LWZ1bGwnXSA9ICd3YiB2ZXJpZnkgLS1mdWxsJztcbiAgICB9XG4gICAgYXBwbHlNaXNlVGFza1NjcmlwdHMoY29uZmlnLCBzY3JpcHRzLCBvbGRTY3JpcHRzLCBbJ2J1aWxkJywgJ2RldicsICdzdGFydCcsICd0ZXN0JywgJ3R5cGVjaGVjayddKTtcbiAgICByZXR1cm4gc2NyaXB0cztcbiAgfVxufVxuXG5mdW5jdGlvbiBpc1diUGFja2FnZShwYWNrYWdlSnNvbjogUGFja2FnZUpzb24gfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIHBhY2thZ2VKc29uPy5uYW1lID09PSB3YkRlcGVuZGVuY3k7XG59XG5cbmZ1bmN0aW9uIGFwcGx5TWlzZVRhc2tTY3JpcHRzKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHNjcmlwdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIG9sZFNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMsXG4gIG5hbWVzOiBzdHJpbmdbXVxuKTogdm9pZCB7XG4gIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykge1xuICAgIGlmICghaGFzTWlzZVRhc2soY29uZmlnLCBuYW1lKSkgY29udGludWU7XG4gICAgaWYgKGRvZXNNaXNlVGFza0NhbGxQYWNrYWdlU2NyaXB0KGNvbmZpZywgbmFtZSkpIGNvbnRpbnVlO1xuICAgIGlmIChvbGRTY3JpcHRzW25hbWVdICYmICFpc1diZnlNYW5hZ2VkTWlzZUJyaWRnZShvbGRTY3JpcHRzW25hbWVdLCBuYW1lKSAmJiAhKG5hbWUgaW4gc2NyaXB0cykpIGNvbnRpbnVlO1xuICAgIHNjcmlwdHNbbmFtZV0gPSBgbWlzZSBydW4gJHtuYW1lfWA7XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFzTWlzZVRhc2soY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIE9iamVjdC5oYXNPd24oY29uZmlnLm1pc2VUYXNrcywgbmFtZSk7XG59XG5cbmZ1bmN0aW9uIGRvZXNNaXNlVGFza0NhbGxQYWNrYWdlU2NyaXB0KGNvbmZpZzogUGFja2FnZUNvbmZpZywgbmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHRhc2sgPSBjb25maWcubWlzZVRhc2tzW25hbWVdO1xuICBpZiAoIXRhc2spIHJldHVybiBmYWxzZTtcbiAgY29uc3QgcGFja2FnZU1hbmFnZXJzID0gWydidW4nLCAneWFybicsICducG0nLCAncG5wbSddO1xuICByZXR1cm4gcGFja2FnZU1hbmFnZXJzLnNvbWUoKHBhY2thZ2VNYW5hZ2VyKSA9PlxuICAgIG5ldyBSZWdFeHAoU3RyaW5nLnJhd2BcXGIke3BhY2thZ2VNYW5hZ2VyfVxccysoPzpydW5cXHMrKT8ke2VzY2FwZVJlZ0V4cChuYW1lKX0oPyFbYS16QS1aMC05X1xcLTouXSlgLCAndScpLnRlc3QodGFzaylcbiAgKTtcbn1cblxuZnVuY3Rpb24gaXNXYmZ5TWFuYWdlZE1pc2VCcmlkZ2Uoc2NyaXB0OiB1bmtub3duLCBuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHNjcmlwdCA9PT0gYG1pc2UgcnVuICR7bmFtZX1gO1xufVxuXG5mdW5jdGlvbiBlc2NhcGVSZWdFeHAodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB2YWx1ZS5yZXBsYWNlQWxsKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgU3RyaW5nLnJhd2BcXCQmYCk7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlRm9ybWF0U2NyaXB0KGhhc0pzT3JUczogYm9vbGVhbiwgaGFzSmF2YTogYm9vbGVhbik6IHN0cmluZyB7XG4gIGNvbnN0IGNvbW1hbmRzID0gWydzb3J0LXBhY2thZ2UtanNvbiddO1xuICBpZiAoaGFzSnNPclRzKSB7XG4gICAgY29tbWFuZHMucHVzaCgneWFybiBmb3JtYXQtY29kZScpO1xuICB9XG4gIGlmIChoYXNKYXZhKSB7XG4gICAgY29tbWFuZHMucHVzaCgneWFybiBwcmV0dGlmeScpO1xuICB9XG4gIHJldHVybiBjb21tYW5kcy5qb2luKCcgJiYgJyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUHJldHRpZXJTdWZmaXgoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy5wcmV0dGllcmlnbm9yZScpO1xuICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKS5jYXRjaCgoKSA9PiAnJyk7XG4gIGNvbnN0IGluZGV4ID0gZXhpc3RpbmdDb250ZW50LmluZGV4T2YoaWdub3JlRmlsZVV0aWwuc2VwYXJhdG9yUHJlZml4KTtcbiAgaWYgKGluZGV4ID09PSAtMSkgcmV0dXJuICcnO1xuXG4gIGNvbnN0IG9yaWdpbmFsQ29udGVudCA9IGV4aXN0aW5nQ29udGVudC5zbGljZSgwLCBpbmRleCk7XG4gIGNvbnN0IGxpbmVzID0gb3JpZ2luYWxDb250ZW50XG4gICAgLnNwbGl0KCdcXG4nKVxuICAgIC5tYXAoKGxpbmUpID0+IHtcbiAgICAgIGNvbnN0IG5ld0xpbmUgPSBsaW5lLnRyaW0oKTtcbiAgICAgIHJldHVybiBuZXdMaW5lLmVuZHNXaXRoKCcvJykgPyBuZXdMaW5lLnNsaWNlKDAsIC0xKSA6IG5ld0xpbmU7XG4gICAgfSlcbiAgICAuZmlsdGVyKChsKSA9PiBsICYmICFsLnN0YXJ0c1dpdGgoJyMnKSAmJiAhbC5pbmNsdWRlcygnLycpKTtcblxuICByZXR1cm4gYCR7bGluZXMubWFwKChsaW5lKSA9PiBgIFwiISoqLyR7bGluZX0vKipcImApLmpvaW4oJycpfSB8fCB0cnVlYDtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlUHJldHRpZXJBcnRpZmFjdHMoanNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbik6IHZvaWQge1xuICBkZWxldGUganNvbk9iai5wcmV0dGllcjtcbiAgY29uc3QgZGVwZW5kZW5jeVNlY3Rpb25zOiBBcnJheTxQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+IHwgdW5kZWZpbmVkPiA9IFtcbiAgICBqc29uT2JqLmRlcGVuZGVuY2llcyxcbiAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llcyxcbiAgICBqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXMsXG4gIF07XG4gIGZvciAoY29uc3Qgc2VjdGlvbiBvZiBkZXBlbmRlbmN5U2VjdGlvbnMpIHtcbiAgICBpZiAoIXNlY3Rpb24pIGNvbnRpbnVlO1xuICAgIGRlbGV0ZSBzZWN0aW9uLnByZXR0aWVyO1xuICAgIGRlbGV0ZSBzZWN0aW9uWydwcmV0dGllci1wbHVnaW4tamF2YSddO1xuICAgIGRlbGV0ZSBzZWN0aW9uWydwcmV0dGllci1wbHVnaW4tcHJpc21hJ107XG4gICAgZGVsZXRlIHNlY3Rpb25bJ0B3aWxsYm9vc3Rlci9wcmV0dGllci1jb25maWcnXTtcbiAgICBkZWxldGUgc2VjdGlvblsnQHR5cGVzL3ByZXR0aWVyJ107XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gdXBkYXRlUHJpdmF0ZVBhY2thZ2VzKGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcGFja2FnZU5hbWVzID0gbmV3IFNldChbLi4uT2JqZWN0LmtleXMoanNvbk9iai5kZXBlbmRlbmNpZXMpLCAuLi5PYmplY3Qua2V5cyhqc29uT2JqLmRldkRlcGVuZGVuY2llcyldKTtcbiAgY29uc3QgcHJpdmF0ZVBhY2thZ2VzOiB7XG4gICAgcGFja2FnZU5hbWU6IHN0cmluZztcbiAgICByZXBvOiBzdHJpbmc7XG4gICAgdGFyZ2V0OiAnZGVwZW5kZW5jaWVzJyB8ICdkZXZEZXBlbmRlbmNpZXMnO1xuICB9W10gPSBbXG4gICAgeyBwYWNrYWdlTmFtZTogJ0B3aWxsYm9vc3Rlci9hdXRoJywgcmVwbzogJ2F1dGgnLCB0YXJnZXQ6ICdkZXBlbmRlbmNpZXMnIH0sXG4gICAgeyBwYWNrYWdlTmFtZTogJ0BkaXNjb3JkLWJvdC9zaGFyZWQnLCByZXBvOiAnZGlzY29yZC1ib3QnLCB0YXJnZXQ6ICdkZXBlbmRlbmNpZXMnIH0sXG4gICAgeyBwYWNrYWdlTmFtZTogJ0B3aWxsYm9vc3Rlci9jb2RlLWFuYWx5emVyJywgcmVwbzogJ2NvZGUtYW5hbHl6ZXInLCB0YXJnZXQ6ICdkZXZEZXBlbmRlbmNpZXMnIH0sXG4gICAgeyBwYWNrYWdlTmFtZTogJ0B3aWxsYm9vc3Rlci9qdWRnZScsIHJlcG86ICdqdWRnZScsIHRhcmdldDogJ2RlcGVuZGVuY2llcycgfSxcbiAgICB7IHBhY2thZ2VOYW1lOiAnQHdpbGxib29zdGVyL2xsbS1wcm94eScsIHJlcG86ICdsbG0tcHJveHknLCB0YXJnZXQ6ICdkZXBlbmRlbmNpZXMnIH0sXG4gIF07XG5cbiAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgcHJpdmF0ZVBhY2thZ2VzLm1hcChhc3luYyAoeyBwYWNrYWdlTmFtZSwgcmVwbywgdGFyZ2V0IH0pID0+IHtcbiAgICAgIGlmICghcGFja2FnZU5hbWVzLmhhcyhwYWNrYWdlTmFtZSkgfHwgaXNXb3Jrc3BhY2VQYWNrYWdlKGpzb25PYmosIHBhY2thZ2VOYW1lKSkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBvdGhlclRhcmdldCA9IHRhcmdldCA9PT0gJ2RlcGVuZGVuY2llcycgPyAnZGV2RGVwZW5kZW5jaWVzJyA6ICdkZXBlbmRlbmNpZXMnO1xuICAgICAgLy8gVGhlIGxpbnQgcnVsZSBkaXNhbGxvd3MgYGRlbGV0ZWAgd2l0aCBjb21wdXRlZCBwYWNrYWdlIG5hbWVzOyBSZWZsZWN0IGhhcyB0aGUgc2FtZSBkZWxldGlvbiBzZW1hbnRpY3MgaGVyZS5cbiAgICAgIFJlZmxlY3QuZGVsZXRlUHJvcGVydHkoanNvbk9ialtvdGhlclRhcmdldF0sIHBhY2thZ2VOYW1lKTtcbiAgICAgIGpzb25PYmpbdGFyZ2V0XVtwYWNrYWdlTmFtZV0gPSBhd2FpdCBnZXRMYXRlc3RQcml2YXRlUGFja2FnZVNwZWNpZmllcihyZXBvKTtcbiAgICB9KVxuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRMYXRlc3RQcml2YXRlUGFja2FnZVNwZWNpZmllcihyZXBvOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBjb21taXRIYXNoID0gYXdhaXQgZ2V0TGF0ZXN0Q29tbWl0SGFzaCgnV2lsbEJvb3N0ZXJMYWInLCByZXBvKTtcbiAgcmV0dXJuIGBnaXRAZ2l0aHViLmNvbTpXaWxsQm9vc3RlckxhYi8ke3JlcG99LmdpdCMke2NvbW1pdEhhc2h9YDtcbn1cblxuZnVuY3Rpb24gaXNXb3Jrc3BhY2VQYWNrYWdlKGpzb25PYmo6IFBhY2thZ2VKc29uLCBwYWNrYWdlTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAoanNvbk9iai5kZXZEZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV0gfHwganNvbk9iai5kZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV0gfHwgJycpLmluY2x1ZGVzKCd3b3Jrc3BhY2UnKTtcbn1cbiIsImltcG9ydCB7IHNwYXduU3luY0FuZFJldHVyblN0ZG91dCB9IGZyb20gJy4uL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMYXRlc3RDb21taXRIYXNoKG9yZ2FuaXphdGlvbjogc3RyaW5nLCByZXBvOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICB0cnkge1xuICAgIGNvbnN0IHJlcG9VcmwgPSBgZ2l0QGdpdGh1Yi5jb206JHtvcmdhbml6YXRpb259LyR7cmVwb30uZ2l0YDtcbiAgICBjb25zdCBvdXRwdXQgPSBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoJ2dpdCcsIFsnbHMtcmVtb3RlJywgcmVwb1VybCwgJ0hFQUQnXSwgcHJvY2Vzcy5jd2QoKSk7XG4gICAgY29uc3QgY29tbWl0SGFzaCA9IG91dHB1dC5zcGxpdCgvXFxzKy8pWzBdO1xuICAgIGlmICghY29tbWl0SGFzaCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBjb21taXRzIGZvdW5kIGZvciAke29yZ2FuaXphdGlvbn0vJHtyZXBvfWApO1xuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGNvbW1pdEhhc2gpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYEZhaWxlZCB0byBmZXRjaCBjb21taXRzIGZvciAke29yZ2FuaXphdGlvbn0vJHtyZXBvfTogJHtTdHJpbmcoZXJyb3IpfWApKTtcbiAgfVxufVxuIiwiLy8gb3hsaW50LWRpc2FibGUgZXNsaW50LXBsdWdpbi1pbXBvcnQvbm8tbmFtZWQtYXMtZGVmYXVsdC1tZW1iZXIgLS0gTmFtZXNwYWNlIFlBTUwgY2FsbHMgbWFrZSBkdW1wIHVzYWdlIGNsZWFyZXIuXG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeWFtbCBmcm9tICdqcy15YW1sJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZ2V0R2VuSTE4blRzQ29tbWFuZCB9IGZyb20gJy4uL3V0aWxzL2dlbkkxOG5Ucy5qcyc7XG5pbXBvcnQgeyBkb2VzQ29udGFpbkphdmEsIGRvZXNDb250YWluSnNPclRzIH0gZnJvbSAnLi4vdXRpbHMvcGFja2FnZUNhcGFiaWxpdGllcy5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuXG5pbXBvcnQgeyBnZW5lcmF0ZVNjcmlwdHMgfSBmcm9tICcuL3BhY2thZ2VKc29uLmpzJztcblxuaW50ZXJmYWNlIExlZnRob29rU2V0dGluZ3Mge1xuICBnbG9iX21hdGNoZXI6ICdkb3VibGVzdGFyJztcbiAgJ3Bvc3QtbWVyZ2UnOiB7XG4gICAgam9iczogTGVmdGhvb2tKb2JbXTtcbiAgfTtcbiAgJ3ByZS1jb21taXQnOiB7XG4gICAgam9iczogTGVmdGhvb2tKb2JbXTtcbiAgfTtcbiAgJ3ByZS1wdXNoJzoge1xuICAgIGpvYnM6IExlZnRob29rSm9iW107XG4gIH07XG59XG5cbmludGVyZmFjZSBMZWZ0aG9va0pvYiB7XG4gIG5hbWU6IHN0cmluZztcbiAgZ2xvYj86IHN0cmluZztcbiAgcnVuPzogc3RyaW5nO1xuICBzY3JpcHQ/OiBzdHJpbmc7XG4gIHJ1bm5lcj86ICdiYXNoJztcbiAgc3RhZ2VfZml4ZWQ/OiB0cnVlO1xufVxuXG5jb25zdCBiYXNlU2V0dGluZ3M6IE9taXQ8TGVmdGhvb2tTZXR0aW5ncywgJ3ByZS1jb21taXQnPiA9IHtcbiAgZ2xvYl9tYXRjaGVyOiAnZG91Ymxlc3RhcicsXG4gICdwb3N0LW1lcmdlJzoge1xuICAgIGpvYnM6IFtcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3ByZXBhcmUnLFxuICAgICAgICBzY3JpcHQ6ICdwcmVwYXJlLnNoJyxcbiAgICAgICAgcnVubmVyOiAnYmFzaCcsXG4gICAgICB9LFxuICAgIF0sXG4gIH0sXG4gICdwcmUtcHVzaCc6IHtcbiAgICBqb2JzOiBbXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdjaGVjaycsXG4gICAgICAgIHNjcmlwdDogJ2NoZWNrLnNoJyxcbiAgICAgICAgcnVubmVyOiAnYmFzaCcsXG4gICAgICB9LFxuICAgIF0sXG4gIH0sXG59O1xuXG5jb25zdCBwcmVDb21taXRTZXR0aW5nczogTGVmdGhvb2tTZXR0aW5nc1sncHJlLWNvbW1pdCddID0ge1xuICBqb2JzOiBbXG4gICAge1xuICAgICAgbmFtZTogJ2NsZWFudXAnLFxuICAgICAgZ2xvYjogJycsXG4gICAgICBydW46ICcnLFxuICAgICAgc3RhZ2VfZml4ZWQ6IHRydWUsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnY2hlY2stbWlncmF0aW9ucycsXG4gICAgICBnbG9iOiAnKiovbWlncmF0aW9uLnNxbCcsXG4gICAgICBydW46IGBcbmZhaWxlZD0wXG4jIExlZnRob29rIGV4cGFuZHMge3N0YWdlZF9maWxlc30gYXMgc2hlbGwtZXNjYXBlZCBhcmdzLCBzbyBwYXRocyB3aXRoIHNwYWNlcyBzdGF5IGludGFjdC5cbmZvciBmaWxlIGluIHtzdGFnZWRfZmlsZXN9OyBkb1xuICBpZiBncmVwIC1xICdXYXJuaW5nczonIFwiJGZpbGVcIjsgdGhlblxuICAgIGVjaG8gXCJNaWdyYXRpb24gU1FMIGZpbGUgKCRmaWxlKSBjb250YWlucyB3YXJuaW5ncyEgUGxlYXNlIHNvbHZlIHRoZSB3YXJuaW5ncyBhbmQgY29tbWl0IGFnYWluLlwiXG4gICAgZmFpbGVkPTFcbiAgZmlcbmRvbmVcbmV4aXQgXCIkZmFpbGVkXCJcbmAudHJpbSgpLFxuICAgIH0sXG4gIF0sXG59O1xuXG5jb25zdCBzY3JpcHRzID0ge1xuICBwb3N0TWVyZ2U6IGBcbiMhL2Jpbi9iYXNoXG5cbmNoYW5nZWRfZmlsZXM9XCIkKGdpdCBkaWZmLXRyZWUgLXIgLS1uYW1lLW9ubHkgLS1uby1jb21taXQtaWQgT1JJR19IRUFEIEhFQUQpXCJcblxucnVuX2lmX2NoYW5nZWQoKSB7XG4gIGlmIGVjaG8gXCIkY2hhbmdlZF9maWxlc1wiIHwgZ3JlcCAtLXF1aWV0IC1FIFwiJDFcIjsgdGhlblxuICAgIGV2YWwgXCIkMlwiXG4gIGZpXG59XG5gLnRyaW0oKSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUxlZnRob29rVXBkYXRpbmdQYWNrYWdlSnNvbihjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUxlZnRob29rVXBkYXRpbmdQYWNrYWdlSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBjb3JlKGNvbmZpZyk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmxlZnRob29rJyk7XG4gIGNvbnN0IGh1c2t5RGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5odXNreScpO1xuICBjb25zdCBoYXNIdXNreURpciA9IGZzLmV4aXN0c1N5bmMoaHVza3lEaXJQYXRoKTtcbiAgY29uc3QgeyBsaW50IH0gPSBnZW5lcmF0ZVNjcmlwdHMoY29uZmlnLCB7fSk7XG4gIGNvbnN0IHNldHRpbmdzOiBQYXJ0aWFsPExlZnRob29rU2V0dGluZ3M+ID0ge1xuICAgIC4uLmJhc2VTZXR0aW5ncyxcbiAgICAncHJlLWNvbW1pdCc6IHtcbiAgICAgIGpvYnM6IGdldFByZUNvbW1pdEpvYnMoY29uZmlnKSxcbiAgICB9LFxuICB9O1xuICBpZiAoIWxpbnQpIHtcbiAgICBkZWxldGUgc2V0dGluZ3NbJ3ByZS1wdXNoJ107XG4gIH1cbiAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgIGZzLnByb21pc2VzLndyaXRlRmlsZShcbiAgICAgIHBhdGguam9pbihjb25maWcuZGlyUGF0aCwgJ2xlZnRob29rLnltbCcpLFxuICAgICAgeWFtbC5kdW1wKHNldHRpbmdzLCB7XG4gICAgICAgIGxpbmVXaWR0aDogLTEsXG4gICAgICAgIG5vQ29tcGF0TW9kZTogdHJ1ZSxcbiAgICAgICAgc3R5bGVzOiB7XG4gICAgICAgICAgJyEhbnVsbCc6ICdlbXB0eScsXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICksXG4gICAgZnMucHJvbWlzZXMucm0oZGlyUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pLFxuICBdKTtcbiAgaWYgKGhhc0h1c2t5RGlyKSB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgZnMucHJvbWlzZXMucm0oaHVza3lEaXJQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSksXG4gICAgICBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuaHVza3lyYy5qc29uJyksIHsgZm9yY2U6IHRydWUgfSksXG4gICAgXSk7XG4gICAgc3Bhd25TeW5jKCdnaXQnLCBbJ2NvbmZpZycsICctLXVuc2V0JywgJ2NvcmUuaG9va3NQYXRoJ10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgfVxuXG4gIGlmIChsaW50KSB7XG4gICAgY29uc3QgcHJlUHVzaCA9IGdldFByZVB1c2hTY3JpcHQoY29uZmlnKTtcbiAgICBmcy5ta2RpclN5bmMocGF0aC5qb2luKGRpclBhdGgsICdwcmUtcHVzaCcpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKGRpclBhdGgsICdwcmUtcHVzaCcsICdjaGVjay5zaCcpLCBwcmVQdXNoICsgJ1xcbicsIHtcbiAgICAgIG1vZGU6IDBvNzU1LFxuICAgIH0pO1xuICB9XG4gIGNvbnN0IHBvc3RNZXJnZUNvbW1hbmQgPSBgJHtzY3JpcHRzLnBvc3RNZXJnZX1cXG5cXG4ke2dlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMoY29uZmlnKS5qb2luKCdcXG4nKX1cXG5gO1xuICBmcy5ta2RpclN5bmMocGF0aC5qb2luKGRpclBhdGgsICdwb3N0LW1lcmdlJyksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwb3N0LW1lcmdlJywgJ3ByZXBhcmUuc2gnKSwgcG9zdE1lcmdlQ29tbWFuZCwge1xuICAgIG1vZGU6IDBvNzU1LFxuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0UHJlUHVzaFNjcmlwdChjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBsZXQgbGludENvbW1hbmQ6IHN0cmluZztcbiAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgIC8vIEJ1biByZXBvcyByZWNlaXZlIHdiIGFzIHBhcnQgb2Ygd2JmeSdzIG1hbmFnZWQgdG9vbGNoYWluLCBzbyBnZW5lcmF0ZSB0aGVcbiAgICAvLyBmaW5hbCBob29rIGNvbW1hbmQgb24gdGhlIGZpcnN0IHJ1biBpbnN0ZWFkIG9mIGNoYW5naW5nIGl0IG9uIHRoZSBzZWNvbmQuXG4gICAgbGludENvbW1hbmQgPSAnYnVuIC0tYnVuIHdiIGxpbnQnO1xuICB9IGVsc2Uge1xuICAgIGxpbnRDb21tYW5kID0gY29uZmlnLmRlcGVuZGluZy53YiA/ICd5YXJuIHdiIGxpbnQnIDogJ3lhcm4gcnVuIGxpbnQnO1xuICB9XG4gIGNvbnN0IHF1aWV0TGludENvbW1hbmQgPSBgJHtsaW50Q29tbWFuZH0gLS1xdWlldGA7XG4gIC8vIE5vIHNlcGFyYXRlIHR5cGVjaGVjayBzdGVwIG5lZWRlZCDigJQgdGhlIGxpbnQgY29tbWFuZCBhbHJlYWR5IGluY2x1ZGVzIHR5cGVjaGVja2luZy5cbiAgaWYgKGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJykpIHtcbiAgICByZXR1cm4gYFxuIyEvYmluL2Jhc2hcblxuaWYgWyAkKGdpdCBicmFuY2ggLS1zaG93LWN1cnJlbnQpID0gXCJtYWluXCIgXSAmJiBbICQoZ2l0IGNvbmZpZyB1c2VyLmVtYWlsKSAhPSBcImV4a2F6dXVAZ21haWwuY29tXCIgXTsgdGhlblxuICBlY2hvIFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCJcbiAgZWNobyBcIioqKiBEb24ndCBwdXNoIG1haW4gYnJhbmNoIGRpcmVjdGx5LiBVc2UgUFIhICoqKlwiXG4gIGVjaG8gXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIlxuICBleGl0IDFcbmZpXG5cbiR7cXVpZXRMaW50Q29tbWFuZH1cbmAudHJpbSgpO1xuICB9XG4gIHJldHVybiBxdWlldExpbnRDb21tYW5kO1xufVxuXG5mdW5jdGlvbiBnZXRQcmVDb21taXRKb2JzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IExlZnRob29rSm9iW10ge1xuICByZXR1cm4gcHJlQ29tbWl0U2V0dGluZ3Muam9icy5tYXAoKGpvYikgPT5cbiAgICBqb2IubmFtZSA9PT0gJ2NsZWFudXAnXG4gICAgICA/IHtcbiAgICAgICAgICAuLi5qb2IsXG4gICAgICAgICAgZ2xvYjogZ2V0Q2xlYW51cEdsb2JzKGNvbmZpZyksXG4gICAgICAgICAgcnVuOiBnZXRDbGVhbnVwQ29tbWFuZChjb25maWcpLFxuICAgICAgICB9XG4gICAgICA6IGpvYlxuICApO1xufVxuXG5mdW5jdGlvbiBnZXRDbGVhbnVwR2xvYnMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgLy8gTGV0IGB3YiBsaW50IC0tZm9ybWF0YCBkZWNpZGUgd2hldGhlciBQcmV0dGllciBpcyBhdmFpbGFibGU7IHRoZSBob29rXG4gIC8vIHN0aWxsIG5lZWRzIHRvIHRyaWdnZXIgd2hlbiBhZGRpbmcgdGhlIGZpcnN0IHByZXR0aWVyLW9ubHkgZmlsZS5cbiAgY29uc3Qgc3VwcG9ydGVkRXh0ZW5zaW9ucyA9XG4gICAgY29uZmlnLmlzQnVuIHx8IGNvbmZpZy5kZXBlbmRpbmcud2IgfHwgZG9lc0NvbnRhaW5KYXZhKGNvbmZpZykgPyBbLi4uZXh0ZW5zaW9ucy5wcmV0dGllck9ubHldIDogW107XG4gIGlmIChkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpKSB7XG4gICAgc3VwcG9ydGVkRXh0ZW5zaW9ucy5wdXNoKC4uLmV4dGVuc2lvbnMub3hmbXQsIC4uLmV4dGVuc2lvbnMub3hsaW50KTtcbiAgfVxuICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jayB8fCBjb25maWcuZG9lc0NvbnRhaW5VdkxvY2spIHtcbiAgICBzdXBwb3J0ZWRFeHRlbnNpb25zLnB1c2goJ3B5Jyk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgc3VwcG9ydGVkRXh0ZW5zaW9ucy5wdXNoKCdkYXJ0Jyk7XG4gIH1cbiAgY29uc3QgZmlsdGVyZWRFeHRlbnNpb25zID0gWy4uLm5ldyBTZXQoc3VwcG9ydGVkRXh0ZW5zaW9ucyldLnRvU29ydGVkKCk7XG4gIHJldHVybiBgKiovKi57JHtmaWx0ZXJlZEV4dGVuc2lvbnMuam9pbignLCcpfX1gO1xufVxuXG5mdW5jdGlvbiBnZXRDbGVhbnVwQ29tbWFuZChjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBpZiAoaGFzTG9jYWxXYldvcmtzcGFjZShjb25maWcpKSB7XG4gICAgcmV0dXJuIFN0cmluZy5yYXdgXG4jIExlZnRob29rIGV4cGFuZHMge3N0YWdlZF9maWxlc30gYXMgc2hlbGwtZXNjYXBlZCBhcmdzLCBzbyBwYXRocyB3aXRoIHNwYWNlcyBzdGF5IGludGFjdC5cbnlhcm4gd29ya3NwYWNlIEB3aWxsYm9vc3Rlci93YiBzdGFydCAtLXdvcmtpbmctZGlyIFwiJChnaXQgcmV2LXBhcnNlIC0tc2hvdy10b3BsZXZlbClcIiBsaW50IC0tZml4IC0tZm9ybWF0IC0tIHtzdGFnZWRfZmlsZXN9XG5gLnRyaW0oKTtcbiAgfVxuICAvLyBQeXRob24tb25seSBCdW4gcmVwb3MgaW5zdGFsbCB3YiBmb3Igc2hhcmVkIHNjcmlwdHMgYnV0IG5vdCBPeGxpbnQsIHNvXG4gIC8vIHN0YWdlZC1maWxlIGhvb2tzIG11c3QgdXNlIHRoZSBsYW5ndWFnZS1zcGVjaWZpYyBmb3JtYXR0ZXIgcGF0aCBiZWxvdy5cbiAgY29uc3QgY2FuVXNlV2JGb3JTdGFnZWRGaWxlcyA9IGRvZXNDb250YWluSnNPclRzKGNvbmZpZykgfHwgZG9lc0NvbnRhaW5KYXZhKGNvbmZpZyk7XG4gIGlmICgoY29uZmlnLmlzQnVuIHx8IGNvbmZpZy5kZXBlbmRpbmcud2IpICYmIGNhblVzZVdiRm9yU3RhZ2VkRmlsZXMpIHtcbiAgICByZXR1cm4gYFxuIyBMZWZ0aG9vayBleHBhbmRzIHtzdGFnZWRfZmlsZXN9IGFzIHNoZWxsLWVzY2FwZWQgYXJncywgc28gcGF0aHMgd2l0aCBzcGFjZXMgc3RheSBpbnRhY3QuXG4ke2NvbmZpZy5pc0J1biA/ICdidW4gLS1idW4gd2InIDogJ3lhcm4gd2InfSBsaW50IC0tZml4IC0tZm9ybWF0IC0tIHtzdGFnZWRfZmlsZXN9XG5gLnRyaW0oKTtcbiAgfVxuXG4gIGNvbnN0IG94bGludFBhdHRlcm4gPSBleHRlbnNpb25zLm94bGludC5tYXAoKGV4dGVuc2lvbikgPT4gU3RyaW5nLnJhd2BcXC4ke2V4dGVuc2lvbn0kYCkuam9pbignfCcpO1xuICBjb25zdCBveGZtdFBhdHRlcm4gPSBleHRlbnNpb25zLm94Zm10Lm1hcCgoZXh0ZW5zaW9uKSA9PiBTdHJpbmcucmF3YFxcLiR7ZXh0ZW5zaW9ufSRgKS5qb2luKCd8Jyk7XG4gIGNvbnN0IHByZXR0aWVyUGF0dGVybiA9IGV4dGVuc2lvbnMucHJldHRpZXJPbmx5Lm1hcCgoZXh0ZW5zaW9uKSA9PiBTdHJpbmcucmF3YFxcLiR7ZXh0ZW5zaW9ufSRgKS5qb2luKCd8Jyk7XG4gIGNvbnN0IGhhc0pzT3JUcyA9IGRvZXNDb250YWluSnNPclRzKGNvbmZpZyk7XG4gIGNvbnN0IGhhc0phdmEgPSBkb2VzQ29udGFpbkphdmEoY29uZmlnKTtcblxuICByZXR1cm4gU3RyaW5nLnJhd2BcbiMgTGVmdGhvb2sgZXhwYW5kcyB7c3RhZ2VkX2ZpbGVzfSBhcyBzaGVsbC1lc2NhcGVkIGFyZ3MsIHNvIHBhdGhzIHdpdGggc3BhY2VzIHN0YXkgaW50YWN0LlxuJHtoYXNKc09yVHMgPyBTdHJpbmcucmF3YG94bGludF9maWxlcz1cIiQocHJpbnRmICclc1xcbicge3N0YWdlZF9maWxlc30gfCBncmVwIC1FICcoJHtveGxpbnRQYXR0ZXJufSknIHx8IHRydWUpXCJgIDogJyd9XG4ke2hhc0pzT3JUcyA/IFN0cmluZy5yYXdgb3hmbXRfZmlsZXM9XCIkKHByaW50ZiAnJXNcXG4nIHtzdGFnZWRfZmlsZXN9IHwgZ3JlcCAtRSAnKCR7b3hmbXRQYXR0ZXJufSknIHwgZ3JlcCAtdiAtRSAnKF58LylwYWNrYWdlXFwuanNvbiQnIHx8IHRydWUpXCJgIDogJyd9XG4ke2hhc0phdmEgPyBTdHJpbmcucmF3YHByZXR0aWVyX2ZpbGVzPVwiJChwcmludGYgJyVzXFxuJyB7c3RhZ2VkX2ZpbGVzfSB8IGdyZXAgLUUgJygke3ByZXR0aWVyUGF0dGVybn0pJyB8fCB0cnVlKVwiYCA6ICcnfVxucGFja2FnZV9qc29uX2ZpbGVzPVwiJChwcmludGYgJyVzXFxuJyB7c3RhZ2VkX2ZpbGVzfSB8IGdyZXAgLUUgJyhefC8pcGFja2FnZVxcLmpzb24kJyB8fCB0cnVlKVwiXG4ke2hhc1B5dGhvblBhY2thZ2VNYW5hZ2VyKGNvbmZpZykgPyBTdHJpbmcucmF3YHB5dGhvbl9maWxlcz1cIiQocHJpbnRmICclc1xcbicge3N0YWdlZF9maWxlc30gfCBncmVwIC1FICdcXC5weSQnIHx8IHRydWUpXCJgIDogJyd9XG4ke2NvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sID8gU3RyaW5nLnJhd2BkYXJ0X2ZpbGVzPVwiJChwcmludGYgJyVzXFxuJyB7c3RhZ2VkX2ZpbGVzfSB8IGdyZXAgLUUgJ1xcLmRhcnQkJyB8IGdyZXAgLXYgJ2dlbmVyYXRlZCcgfCBncmVwIC12ICdcXC5mcmVlemVkXFwuZGFydCQnIHwgZ3JlcCAtdiAnXFwuZ1xcLmRhcnQkJyB8fCB0cnVlKVwiYCA6ICcnfVxuXG4ke1xuICBoYXNKc09yVHNcbiAgICA/IFN0cmluZy5yYXdgXG5pZiBbIC1uIFwiJG94Zm10X2ZpbGVzXCIgXTsgdGhlblxuICBub2RlIG5vZGVfbW9kdWxlcy8uYmluL294Zm10IC0td3JpdGUgLS1uby1lcnJvci1vbi11bm1hdGNoZWQtcGF0dGVybiAnISoqL3BhY2thZ2UuanNvbicgJG94Zm10X2ZpbGVzXG5maVxuYFxuICAgIDogJydcbn1cbiR7XG4gIGhhc0phdmFcbiAgICA/IFN0cmluZy5yYXdgaWYgWyAtbiBcIiRwcmV0dGllcl9maWxlc1wiIF07IHRoZW5cbiAgbm9kZSBub2RlX21vZHVsZXMvLmJpbi9wcmV0dGllciAtLWNhY2hlIC0td3JpdGUgLS1pZ25vcmUtdW5rbm93biAtLSAkcHJldHRpZXJfZmlsZXNcbmZpYFxuICAgIDogJydcbn1cbiR7XG4gIGhhc0pzT3JUc1xuICAgID8gU3RyaW5nLnJhd2BcbmlmIFsgLW4gXCIkb3hsaW50X2ZpbGVzXCIgXTsgdGhlblxuICBub2RlIG5vZGVfbW9kdWxlcy8uYmluL294bGludCAtLWZpeCAkb3hsaW50X2ZpbGVzXG5maVxuYFxuICAgIDogJydcbn1cbmlmIFsgLW4gXCIkcGFja2FnZV9qc29uX2ZpbGVzXCIgXTsgdGhlblxuICBub2RlIG5vZGVfbW9kdWxlcy8uYmluL3NvcnQtcGFja2FnZS1qc29uIC0tICRwYWNrYWdlX2pzb25fZmlsZXNcbmZpXG4ke1xuICBoYXNQeXRob25QYWNrYWdlTWFuYWdlcihjb25maWcpXG4gICAgPyBgaWYgWyAtbiBcIiRweXRob25fZmlsZXNcIiBdOyB0aGVuXG4gICR7Z2V0UHl0aG9uUnVubmVyKGNvbmZpZyl9IGlzb3J0IC0tcHJvZmlsZSBibGFjayAtLWZpbHRlci1maWxlcyAkcHl0aG9uX2ZpbGVzXG4gICR7Z2V0UHl0aG9uUnVubmVyKGNvbmZpZyl9IGJsYWNrICRweXRob25fZmlsZXNcbiAgJHtnZXRQeXRob25SdW5uZXIoY29uZmlnKX0gZmxha2U4ICRweXRob25fZmlsZXNcbmZpYFxuICAgIDogJydcbn1cbiR7XG4gIGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sXG4gICAgPyBgaWYgWyAtbiBcIiRkYXJ0X2ZpbGVzXCIgXTsgdGhlblxuICBkYXJ0IGZvcm1hdCAkZGFydF9maWxlc1xuZmlgXG4gICAgOiAnJ1xufVxuYC50cmltKCk7XG59XG5cbmZ1bmN0aW9uIGhhc0xvY2FsV2JXb3Jrc3BhY2UoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIGlmICghY29uZmlnLmlzUm9vdCkgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IGxvY2FsV2JQYWNrYWdlSnNvblBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdwYWNrYWdlcycsICd3YicsICdwYWNrYWdlLmpzb24nKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGxvY2FsV2JQYWNrYWdlSnNvblBhdGgpKSByZXR1cm4gZmFsc2U7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKGxvY2FsV2JQYWNrYWdlSnNvblBhdGgsICd1dGY4JykpIGFzIHsgbmFtZT86IHN0cmluZyB9O1xuICAgIHJldHVybiBwYWNrYWdlSnNvbi5uYW1lID09PSAnQHdpbGxib29zdGVyL3diJztcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nW10ge1xuICBjb25zdCBwb3N0TWVyZ2VDb21tYW5kczogc3RyaW5nW10gPSBbXTtcbiAgaWYgKGNvbmZpZy5oYXNWZXJzaW9uU2V0dGluZ3MpIHtcbiAgICBjb25zdCB0b29sc0NoYW5nZWRQYXR0ZXJuID0gU3RyaW5nLnJhd2AobWlzZVxcLnRvbWx8XFwubWlzZVxcLnRvbWx8XFwudG9vbC12ZXJzaW9uc3xcXC4uKy12ZXJzaW9uKWA7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiJHt0b29sc0NoYW5nZWRQYXR0ZXJufVwiIFwibWlzZSBpbnN0YWxsXCJgKTtcbiAgfVxuICBjb25zdCBpbnN0YWxsQ29tbWFuZCA9IGNvbmZpZy5pc0J1biA/ICdidW4gaW5zdGFsbCcgOiAneWFybic7XG4gIGNvbnN0IHJtTmV4dERpcmVjdG9yeSA9IGNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHwgY29uZmlnLmRlcGVuZGluZy5uZXh0ID8gJyAmJiBybSAtUmYgLm5leHQnIDogJyc7XG4gIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcInBhY2thZ2VcXC5qc29uXCIgXCIke2luc3RhbGxDb21tYW5kfSR7cm1OZXh0RGlyZWN0b3J5fVwiYCk7XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrKSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwicG9ldHJ5XFwubG9ja1wiIFwicG9ldHJ5IGluc3RhbGxcImApO1xuICB9XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5VdkxvY2spIHtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCJ1dlxcLmxvY2tcIiBcInV2IHN5bmMgLS1mcm96ZW5cImApO1xuICB9XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6KSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIuKlxcLnByaXNtYVwiIFwibm9kZSBub2RlX21vZHVsZXMvLmJpbi9ibGl0eiBwcmlzbWEgbWlncmF0ZSBkZXBsb3lcImAsXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiLipcXC5wcmlzbWFcIiBcIm5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vYmxpdHogcHJpc21hIGdlbmVyYXRlXCJgLFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIi4qXFwucHJpc21hXCIgXCJub2RlIG5vZGVfbW9kdWxlcy8uYmluL2JsaXR6IGNvZGVnZW5cImBcbiAgICApO1xuICB9IGVsc2UgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHJpc21hKSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIuKlxcLnByaXNtYVwiIFwibm9kZSBub2RlX21vZHVsZXMvLmJpbi9kb3RlbnYgLWMgZGV2ZWxvcG1lbnQgLS0gbm9kZSBub2RlX21vZHVsZXMvLmJpbi9wcmlzbWEgbWlncmF0ZSBkZXBsb3lcImAsXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiLipcXC5wcmlzbWFcIiBcIm5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vZG90ZW52IC1jIGRldmVsb3BtZW50IC0tIG5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vcHJpc21hIGdlbmVyYXRlXCJgXG4gICAgKTtcbiAgfVxuICBjb25zdCBnZW5JMThuVHNDb21tYW5kID0gZ2V0R2VuSTE4blRzQ29tbWFuZChjb25maWcsIGNvbmZpZy5wYWNrYWdlSnNvbj8uc2NyaXB0cyk7XG4gIGlmIChnZW5JMThuVHNDb21tYW5kKSB7XG4gICAgLy8gZ2VuLWkxOG4tdHMgb3V0cHV0cyBhcmUgY29tbW9ubHkgaWdub3JlZCwgc28gcG9zdC1tZXJnZSByZWdlbmVyYXRlcyB0aGVtIGFmdGVyIHB1bGxlZCByZXNvdXJjZSBjaGFuZ2VzLlxuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIihefC8paTE4bi8uKlxcLmpzb24kXCIgXCIke2dlbkkxOG5Uc0NvbW1hbmR9XCJgKTtcbiAgfVxuICByZXR1cm4gcG9zdE1lcmdlQ29tbWFuZHM7XG59XG5cbmZ1bmN0aW9uIGhhc1B5dGhvblBhY2thZ2VNYW5hZ2VyKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jayB8fCBjb25maWcuZG9lc0NvbnRhaW5VdkxvY2s7XG59XG5cbmZ1bmN0aW9uIGdldFB5dGhvblJ1bm5lcihjb25maWc6IFBhY2thZ2VDb25maWcpOiAncG9ldHJ5IHJ1bicgfCAndXYgcnVuJyB7XG4gIHJldHVybiBjb25maWcuZG9lc0NvbnRhaW5VdkxvY2sgPyAndXYgcnVuJyA6ICdwb2V0cnkgcnVuJztcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUxpbnRzdGFnZWRyYyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUxpbnRzdGFnZWRyYycsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oYCR7Y29uZmlnLmRpclBhdGh9Ly5saW50c3RhZ2VkcmMuY2pzYCwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oYCR7Y29uZmlnLmRpclBhdGh9Ly5saW50c3RhZ2VkcmMuanNgLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShgJHtjb25maWcuZGlyUGF0aH0vLmxpbnRzdGFnZWRyYy5qc29uYCwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgXSk7XG4gIH0pO1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUNvbmZpZ0NvbnRlbnQoY29udGVudDogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGNvbnRlbnQ/LnRyaW0oKTtcbn1cbiIsImV4cG9ydCB0eXBlIENvbmZpZ0Jsb2NrTmFtZSA9ICdiYXNlJyB8ICdleHBvcnQnO1xuXG5pbnRlcmZhY2UgTWFuYWdlZENvbmZpZ0Jsb2Nrc09wdGlvbnMge1xuICBibG9ja05hbWVzOiByZWFkb25seSBDb25maWdCbG9ja05hbWVbXTtcbiAgbWFya2VyUHJlZml4OiBzdHJpbmc7XG4gIHRvb2xOYW1lOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBHZXRDb25maWdDb250ZW50T3B0aW9ucyB7XG4gIGRlc2lyZWRDb250ZW50OiBzdHJpbmc7XG4gIGV4aXN0aW5nQ29udGVudDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBmaWxlUGF0aDogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgTWFuYWdlZENvbmZpZ0Jsb2NrcyB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYmxvY2tOYW1lczogcmVhZG9ubHkgQ29uZmlnQmxvY2tOYW1lW107XG5cbiAgcHJpdmF0ZSByZWFkb25seSBtYXJrZXJQcmVmaXg6IHN0cmluZztcblxuICBwcml2YXRlIHJlYWRvbmx5IHRvb2xOYW1lOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogTWFuYWdlZENvbmZpZ0Jsb2Nrc09wdGlvbnMpIHtcbiAgICB0aGlzLmJsb2NrTmFtZXMgPSBvcHRpb25zLmJsb2NrTmFtZXM7XG4gICAgdGhpcy5tYXJrZXJQcmVmaXggPSBvcHRpb25zLm1hcmtlclByZWZpeDtcbiAgICB0aGlzLnRvb2xOYW1lID0gb3B0aW9ucy50b29sTmFtZTtcbiAgfVxuXG4gIGdldENvbmZpZ0NvbnRlbnQob3B0aW9uczogR2V0Q29uZmlnQ29udGVudE9wdGlvbnMpOiBzdHJpbmcge1xuICAgIGlmICghb3B0aW9ucy5leGlzdGluZ0NvbnRlbnQpIHJldHVybiBvcHRpb25zLmRlc2lyZWRDb250ZW50O1xuICAgIGlmICh0aGlzLmhhc01hbmFnZWRCbG9ja3Mob3B0aW9ucy5leGlzdGluZ0NvbnRlbnQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXBsYWNlTWFuYWdlZEJsb2NrcyhvcHRpb25zLmV4aXN0aW5nQ29udGVudCwgb3B0aW9ucy5kZXNpcmVkQ29udGVudCwgb3B0aW9ucy5maWxlUGF0aCk7XG4gICAgfVxuICAgIHJldHVybiBvcHRpb25zLmRlc2lyZWRDb250ZW50O1xuICB9XG5cbiAgZ2V0QmxvY2soYmxvY2tOYW1lOiBDb25maWdCbG9ja05hbWUsIGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuZ2V0U3RhcnRNYXJrZXIoYmxvY2tOYW1lKX1cbiR7Y29udGVudH1cbiR7dGhpcy5nZXRFbmRNYXJrZXIoYmxvY2tOYW1lKX1gO1xuICB9XG5cbiAgaGFzTWFuYWdlZEJsb2Nrcyhjb250ZW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5ibG9ja05hbWVzLnNvbWUoKGJsb2NrTmFtZSkgPT4gY29udGVudC5pbmNsdWRlcyh0aGlzLmdldFN0YXJ0TWFya2VyKGJsb2NrTmFtZSkpKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVwbGFjZU1hbmFnZWRCbG9ja3MoZXhpc3RpbmdDb250ZW50OiBzdHJpbmcsIGRlc2lyZWRDb250ZW50OiBzdHJpbmcsIGZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCBjb250ZW50ID0gZXhpc3RpbmdDb250ZW50O1xuICAgIGZvciAoY29uc3QgYmxvY2tOYW1lIG9mIHRoaXMuYmxvY2tOYW1lcykge1xuICAgICAgY29uc3QgcmVwbGFjZW1lbnQgPSB0aGlzLmV4dHJhY3RNYW5hZ2VkQmxvY2soZGVzaXJlZENvbnRlbnQsIGJsb2NrTmFtZSk7XG4gICAgICBpZiAoIXJlcGxhY2VtZW50KSBjb250aW51ZTtcblxuICAgICAgY29uc3QgbmV4dENvbnRlbnQgPSB0aGlzLnJlcGxhY2VNYW5hZ2VkQmxvY2soY29udGVudCwgYmxvY2tOYW1lLCByZXBsYWNlbWVudCk7XG4gICAgICBpZiAoIW5leHRDb250ZW50KSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCB1cGRhdGluZyBpbmNvbXBsZXRlICR7YmxvY2tOYW1lfSBibG9jayBpbiAke3RoaXMudG9vbE5hbWV9IGNvbmZpZzogJHtmaWxlUGF0aH1gKTtcbiAgICAgICAgcmV0dXJuIGV4aXN0aW5nQ29udGVudDtcbiAgICAgIH1cbiAgICAgIGNvbnRlbnQgPSBuZXh0Q29udGVudDtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRlbnQ7XG4gIH1cblxuICBwcml2YXRlIGV4dHJhY3RNYW5hZ2VkQmxvY2soY29udGVudDogc3RyaW5nLCBibG9ja05hbWU6IENvbmZpZ0Jsb2NrTmFtZSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TWFuYWdlZEJsb2NrUmVnRXhwKGJsb2NrTmFtZSkuZXhlYyhjb250ZW50KT8uWzBdO1xuICB9XG5cbiAgcHJpdmF0ZSByZXBsYWNlTWFuYWdlZEJsb2NrKGNvbnRlbnQ6IHN0cmluZywgYmxvY2tOYW1lOiBDb25maWdCbG9ja05hbWUsIHJlcGxhY2VtZW50OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHBhdHRlcm4gPSB0aGlzLmdldE1hbmFnZWRCbG9ja1JlZ0V4cChibG9ja05hbWUpO1xuICAgIGlmICghcGF0dGVybi50ZXN0KGNvbnRlbnQpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiBjb250ZW50LnJlcGxhY2UocGF0dGVybiwgcmVwbGFjZW1lbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRNYW5hZ2VkQmxvY2tSZWdFeHAoYmxvY2tOYW1lOiBDb25maWdCbG9ja05hbWUpOiBSZWdFeHAge1xuICAgIHJldHVybiBuZXcgUmVnRXhwKFxuICAgICAgYCR7ZXNjYXBlUmVnRXhwKHRoaXMuZ2V0U3RhcnRNYXJrZXIoYmxvY2tOYW1lKSl9W1xcXFxzXFxcXFNdKj8ke2VzY2FwZVJlZ0V4cCh0aGlzLmdldEVuZE1hcmtlcihibG9ja05hbWUpKX1gXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U3RhcnRNYXJrZXIoYmxvY2tOYW1lOiBDb25maWdCbG9ja05hbWUpOiBzdHJpbmcge1xuICAgIHJldHVybiBgLy8gd2JmeTpzdGFydCAke3RoaXMubWFya2VyUHJlZml4fS0ke2Jsb2NrTmFtZX1gO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRFbmRNYXJrZXIoYmxvY2tOYW1lOiBDb25maWdCbG9ja05hbWUpOiBzdHJpbmcge1xuICAgIHJldHVybiBgLy8gd2JmeTplbmQgJHt0aGlzLm1hcmtlclByZWZpeH0tJHtibG9ja05hbWV9YDtcbiAgfVxufVxuXG5mdW5jdGlvbiBlc2NhcGVSZWdFeHAodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB2YWx1ZS5yZXBsYWNlQWxsKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgU3RyaW5nLnJhd2BcXCQmYCk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmltcG9ydCB7IG5vcm1hbGl6ZUNvbmZpZ0NvbnRlbnQgfSBmcm9tICcuL2NvbmZpZ0NvbnRlbnQuanMnO1xuaW1wb3J0IHsgTWFuYWdlZENvbmZpZ0Jsb2NrcyB9IGZyb20gJy4vbWFuYWdlZENvbmZpZ0Jsb2NrLmpzJztcblxuY29uc3QgbWFuYWdlZENvbmZpZ0Jsb2NrcyA9IG5ldyBNYW5hZ2VkQ29uZmlnQmxvY2tzKHtcbiAgYmxvY2tOYW1lczogWydiYXNlJywgJ2V4cG9ydCddLFxuICBtYXJrZXJQcmVmaXg6ICdveGZtdCcsXG4gIHRvb2xOYW1lOiAnb3hmbXQnLFxufSk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZU94Zm10Q29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlT3hmbXRDb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgbGVnYWN5SnNvbkNvbmZpZ1BhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcub3hmbXRyYy5qc29uJyk7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdveGZtdC5jb25maWcudHMnKTtcbiAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoKTtcbiAgICBjb25zdCBkZXNpcmVkQ29udGVudCA9IG1hbmFnZWRDb25maWdCbG9ja3MuZ2V0Q29uZmlnQ29udGVudCh7XG4gICAgICBkZXNpcmVkQ29udGVudDogZ2V0Q29uZmlnQ29udGVudChjb25maWcpLFxuICAgICAgZXhpc3RpbmdDb250ZW50LFxuICAgICAgZmlsZVBhdGgsXG4gICAgfSk7XG4gICAgY29uc3QgcHJvbWlzZXMgPSBbcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKGxlZ2FjeUpzb25Db25maWdQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKV07XG4gICAgaWYgKG5vcm1hbGl6ZUNvbmZpZ0NvbnRlbnQoZXhpc3RpbmdDb250ZW50KSAhPT0gbm9ybWFsaXplQ29uZmlnQ29udGVudChkZXNpcmVkQ29udGVudCkpIHtcbiAgICAgIHByb21pc2VzLnB1c2gocHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGRlc2lyZWRDb250ZW50KSkpO1xuICAgIH1cbiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRDb25maWdDb250ZW50KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIC8vIENvbW1vbkpTIHBhY2thZ2VzIG5lZWQgcmVxdWlyZS9tb2R1bGUuZXhwb3J0cyBoZXJlOiBveGZtdCBjb25maWcgZmlsZXMgYXJlXG4gIC8vIG9ubHkgYXV0by1kaXNjb3ZlcmVkIGFzIC50cywgYW5kIHRoZSBzaGFyZWQgY29uZmlnIHBhY2thZ2UgaXMgRVNNLW9ubHkuXG4gIGlmICghY29uZmlnLmlzRXNtUGFja2FnZSkge1xuICAgIHJldHVybiBgJHttYW5hZ2VkQ29uZmlnQmxvY2tzLmdldEJsb2NrKFxuICAgICAgJ2Jhc2UnLFxuICAgICAgYC8vIG94bGludC1kaXNhYmxlIHR5cGVzY3JpcHQoVFMyNTkxKSwgdW5pY29ybi9wcmVmZXItbW9kdWxlIC0tIE94Zm10IGNvbmZpZyBmaWxlcyBhcmUgb25seSBhdXRvLWRpc2NvdmVyZWQgYXMgLnRzLCBhbmQgQ29tbW9uSlMgYXZvaWRzIE5vZGUgdHlwZWxlc3MgRVNNIHdhcm5pbmdzLlxuY29uc3Qgb3hmbXRDb25maWcgPSByZXF1aXJlKCdAd2lsbGJvb3N0ZXIvb3hmbXQtY29uZmlnJyk7XG5cbmNvbnN0IG94Zm10UmVzb2x2ZWRDb25maWcgPSBveGZtdENvbmZpZy5kZWZhdWx0ID8/IG94Zm10Q29uZmlnO2BcbiAgICApfVxuXG4ke21hbmFnZWRDb25maWdCbG9ja3MuZ2V0QmxvY2soJ2V4cG9ydCcsICdtb2R1bGUuZXhwb3J0cyA9IG94Zm10UmVzb2x2ZWRDb25maWc7Jyl9XG5gO1xuICB9XG5cbiAgcmV0dXJuIGAke21hbmFnZWRDb25maWdCbG9ja3MuZ2V0QmxvY2soJ2Jhc2UnLCBcImltcG9ydCBjb25maWcgZnJvbSAnQHdpbGxib29zdGVyL294Zm10LWNvbmZpZyc7XCIpfVxuXG4ke21hbmFnZWRDb25maWdCbG9ja3MuZ2V0QmxvY2soJ2V4cG9ydCcsICdleHBvcnQgZGVmYXVsdCBjb25maWc7Jyl9XG5gO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgaXNQdWJsaXNoZWRXaWxsYm9vc3RlckNvbmZpZ3NQYWNrYWdlIH0gZnJvbSAnLi4vdXRpbHMvd2lsbGJvb3N0ZXJDb25maWdzVXRpbC5qcyc7XG5cbmltcG9ydCB7IG5vcm1hbGl6ZUNvbmZpZ0NvbnRlbnQgfSBmcm9tICcuL2NvbmZpZ0NvbnRlbnQuanMnO1xuaW1wb3J0IHsgTWFuYWdlZENvbmZpZ0Jsb2NrcyB9IGZyb20gJy4vbWFuYWdlZENvbmZpZ0Jsb2NrLmpzJztcblxuY29uc3QgbWFuYWdlZENvbmZpZ0Jsb2NrcyA9IG5ldyBNYW5hZ2VkQ29uZmlnQmxvY2tzKHtcbiAgYmxvY2tOYW1lczogWydiYXNlJywgJ2V4cG9ydCddLFxuICBtYXJrZXJQcmVmaXg6ICdveGxpbnQnLFxuICB0b29sTmFtZTogJ294bGludCcsXG59KTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlT3hsaW50Q29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZywgX3Jvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZU94bGludENvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICAvLyB3aWxsYm9vc3Rlci1jb25maWdzIHB1Ymxpc2hlcyBjb25maWcgZmlsZXMgYXMgcHJvZHVjdCBjb2RlLCBzbyBtaWdyYXRpb25cbiAgICAvLyBtdXN0IG5vdCByZW1vdmUgcGFja2FnZS1wcm92aWRlZCBsaW50ZXIgc2V0dGluZ3MuIEdlbmVyYXRlZCBmaWxlcyB3aXRoXG4gICAgLy8gbWFuYWdlZCBibG9ja3MgYXJlIHN0aWxsIHNhZmUgdG8gdXBkYXRlLlxuICAgIGNvbnN0IHNob3VsZFByZXNlcnZlUHVibGlzaGVkTGludGVyQ29uZmlnID0gaXNQdWJsaXNoZWRXaWxsYm9vc3RlckNvbmZpZ3NQYWNrYWdlKGNvbmZpZyk7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdveGxpbnQuY29uZmlnLnRzJyk7XG4gICAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihmaWxlUGF0aCk7XG4gICAgY29uc3Qgc2hvdWxkUHJlc2VydmVFeGlzdGluZ0NvbnRlbnQgPVxuICAgICAgc2hvdWxkUHJlc2VydmVQdWJsaXNoZWRMaW50ZXJDb25maWcgJiYgZXhpc3RpbmdDb250ZW50ICYmICFtYW5hZ2VkQ29uZmlnQmxvY2tzLmhhc01hbmFnZWRCbG9ja3MoZXhpc3RpbmdDb250ZW50KTtcbiAgICBjb25zdCBkZXNpcmVkQ29udGVudCA9IHNob3VsZFByZXNlcnZlRXhpc3RpbmdDb250ZW50XG4gICAgICA/IGV4aXN0aW5nQ29udGVudFxuICAgICAgOiByZXBsYWNlTGVnYWN5Q29uZmlnUmVmZXJlbmNlcyhcbiAgICAgICAgICBtYW5hZ2VkQ29uZmlnQmxvY2tzLmdldENvbmZpZ0NvbnRlbnQoe1xuICAgICAgICAgICAgZGVzaXJlZENvbnRlbnQ6IGdldENvbmZpZ0NvbnRlbnQoY29uZmlnKSxcbiAgICAgICAgICAgIGV4aXN0aW5nQ29udGVudCxcbiAgICAgICAgICAgIGZpbGVQYXRoLFxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG5cbiAgICBjb25zdCBwcm9taXNlczogUHJvbWlzZTx2b2lkPltdID0gW107XG4gICAgaWYgKCFzaG91bGRQcmVzZXJ2ZVB1Ymxpc2hlZExpbnRlckNvbmZpZykge1xuICAgICAgcHJvbWlzZXMucHVzaChcbiAgICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5veGxpbnRyYy5qc29uJyksIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnYmlvbWUuanNvbicpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2Jpb21lLmpzb25jJyksIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmVzbGludHJjJyksIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmVzbGludHJjLmNqcycpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lc2xpbnRyYy5qcycpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lc2xpbnRyYy5qc29uJyksIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmVzbGludHJjLnlhbWwnKSwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZXNsaW50cmMueW1sJyksIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnZXNsaW50LmNvbmZpZy5janMnKSwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdlc2xpbnQuY29uZmlnLmpzJyksIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnZXNsaW50LmNvbmZpZy5tanMnKSwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdlc2xpbnQuY29uZmlnLnRzJyksIHsgZm9yY2U6IHRydWUgfSkpXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAobm9ybWFsaXplQ29uZmlnQ29udGVudChleGlzdGluZ0NvbnRlbnQpICE9PSBub3JtYWxpemVDb25maWdDb250ZW50KGRlc2lyZWRDb250ZW50KSkge1xuICAgICAgcHJvbWlzZXMucHVzaChwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgZGVzaXJlZENvbnRlbnQpKSk7XG4gICAgfVxuICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VMZWdhY3lDb25maWdSZWZlcmVuY2VzKGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBjb250ZW50LnJlcGxhY2VBbGwoJ2NvbmZpZy4nLCAnb3hsaW50UmVzb2x2ZWRDb25maWcuJyk7XG59XG5cbmZ1bmN0aW9uIGdldENvbmZpZ0NvbnRlbnQoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgY29uc3QgaXNSb290Q29uZmlnID0gY29uZmlnLmlzUm9vdDtcblxuICAvLyBEbyBub3QgY29sbGFwc2UgdGhpcyB0byBhIHN0YXRpYyBpbXBvcnQgZm9yIGV2ZXJ5IHBhY2thZ2UuIENvbW1vbkpTIHBhY2thZ2VzXG4gIC8vIHR5cGUtY2hlY2sgYXV0by1kaXNjb3ZlcmVkIG94bGludC5jb25maWcudHMgYXMgQ29tbW9uSlMsIHNvIGltcG9ydGluZyB0aGUgRVNNXG4gIC8vIEB3aWxsYm9vc3Rlci9veGxpbnQtY29uZmlnIHBhY2thZ2UgdHJpZ2dlcnMgVFMxNDc5LiBLZWVwIHRoaXMgaW4gc3luYyB3aXRoXG4gIC8vIGxpdGVyYWN5LXRlc3QncyBnZW5lcmF0ZWQgY29uZmlnIHBhdHRlcm4uXG4gIGlmICghY29uZmlnLmlzRXNtUGFja2FnZSkge1xuICAgIHJldHVybiBgJHttYW5hZ2VkQ29uZmlnQmxvY2tzLmdldEJsb2NrKFxuICAgICAgJ2Jhc2UnLFxuICAgICAgYC8vIG94bGludC1kaXNhYmxlIHR5cGVzY3JpcHQoVFMyNTkxKSwgdW5pY29ybi9wcmVmZXItbW9kdWxlIC0tIE94bGludCBvbmx5IGF1dG8tZGlzY292ZXJzIC50cyBjb25maWcgZmlsZXMsIGFuZCBDb21tb25KUyBhdm9pZHMgTm9kZSB0eXBlbGVzcyBFU00gd2FybmluZ3MuXG5jb25zdCBveGxpbnRCYXNlQ29uZmlnID0gcmVxdWlyZSgnQHdpbGxib29zdGVyL294bGludC1jb25maWcnKTtcblxuJHtnZXRSZXNvbHZlZENvbmZpZ0NvbnRlbnQoJ294bGludEJhc2VDb25maWcuZGVmYXVsdCA/PyBveGxpbnRCYXNlQ29uZmlnJywgaXNSb290Q29uZmlnKX1gXG4gICAgKX1cblxuJHttYW5hZ2VkQ29uZmlnQmxvY2tzLmdldEJsb2NrKCdleHBvcnQnLCAnbW9kdWxlLmV4cG9ydHMgPSBveGxpbnRSZXNvbHZlZENvbmZpZzsnKX1cbmA7XG4gIH1cblxuICByZXR1cm4gYCR7bWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRCbG9jayhcbiAgICAnYmFzZScsXG4gICAgYGltcG9ydCBveGxpbnRCYXNlQ29uZmlnIGZyb20gJ0B3aWxsYm9vc3Rlci9veGxpbnQtY29uZmlnJztcblxuJHtnZXRSZXNvbHZlZENvbmZpZ0NvbnRlbnQoJ294bGludEJhc2VDb25maWcnLCBpc1Jvb3RDb25maWcpfWBcbiAgKX1cblxuJHttYW5hZ2VkQ29uZmlnQmxvY2tzLmdldEJsb2NrKCdleHBvcnQnLCAnZXhwb3J0IGRlZmF1bHQgb3hsaW50UmVzb2x2ZWRDb25maWc7Jyl9XG5gO1xufVxuXG5mdW5jdGlvbiBnZXRSZXNvbHZlZENvbmZpZ0NvbnRlbnQoYmFzZUNvbmZpZ05hbWU6IHN0cmluZywgaXNSb290Q29uZmlnOiBib29sZWFuKTogc3RyaW5nIHtcbiAgaWYgKGlzUm9vdENvbmZpZykge1xuICAgIHJldHVybiBgY29uc3Qgb3hsaW50UmVzb2x2ZWRDb25maWcgPSAke2Jhc2VDb25maWdOYW1lfTtgO1xuICB9XG5cbiAgcmV0dXJuIGAvLyBPeGxpbnQgb25seSBzdXBwb3J0cyB0eXBlLWF3YXJlIG9wdGlvbnMgaW4gdGhlIHJvb3QgY29uZmlnLCB3aGlsZSBpdFxuLy8gc3RpbGwgYXV0by1kaXNjb3ZlcnMgcGFja2FnZS1sb2NhbCBjb25maWcgZmlsZXMgaW4gbW9ub3JlcG9zLiBLZWVwIHRoaXMgYXMgYVxuLy8gcGxhaW4gb2JqZWN0IGNvcHkgc28gcGFja2FnZSB0eXBlY2hlY2tzIGRvIG5vdCBleHBvcnQgb3hsaW50J3MgcHJpdmF0ZSBoZWxwZXJcbi8vIHR5cGVzIHRocm91Z2ggdGhlIGdlbmVyYXRlZCBjb25maWcgdmFyaWFibGUuXG5jb25zdCBveGxpbnRSZXNvbHZlZENvbmZpZzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7IC4uLiR7YmFzZUNvbmZpZ05hbWV9IH07XG5kZWxldGUgb3hsaW50UmVzb2x2ZWRDb25maWcub3B0aW9ucztgO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgZG9lc0NvbnRhaW5KYXZhIH0gZnJvbSAnLi4vdXRpbHMvcGFja2FnZUNhcGFiaWxpdGllcy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgY29tbW9uQ29udGVudCA9IGBcbjNyZC1wYXJ0eS9cbmFuZHJvaWQvXG5pb3MvXG5uby1mb3JtYXQvXG50ZXN0LWZpeHR1cmVzL1xudGVzdC9maXh0dXJlcy9cbiouZC50c1xuKi5taW4uanNcbi55YXJuL1xuLnBucC5qc1xuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUHJldHRpZXJpZ25vcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVQcmV0dGllcmlnbm9yZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5wcmV0dGllcmlnbm9yZScpO1xuICAgIGlmICghZG9lc0NvbnRhaW5KYXZhKGNvbmZpZykpIHtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNvbnRlbnQgPSAoYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihmaWxlUGF0aCkpID8/ICcnO1xuICAgIGNvbnN0IGhlYWRVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldEhlYWRVc2VyQ29udGVudChjb250ZW50KTtcbiAgICBjb25zdCB0YWlsVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRUYWlsVXNlckNvbnRlbnQoY29udGVudCk7XG5cbiAgICBjb25zdCBnaXRpZ25vcmVGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRpZ25vcmUnKTtcbiAgICBjb25zdCBnaXRpZ25vcmVDb250ZW50ID0gKGF3YWl0IGlnbm9yZUZpbGVVdGlsLnJlYWRHaXRpZ25vcmVXaXRob3V0U2VwYXJhdG9ycyhnaXRpZ25vcmVGaWxlUGF0aCkpIHx8ICcnO1xuXG4gICAgbGV0IGFkZGl0aW9uYWxDb250ZW50ID0gJyc7XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBhZGRpdGlvbmFsQ29udGVudCA9IGBcbmFuZHJvaWQvYXBwL1xuaW9zL1J1bm5lci9Bc3NldHMueGNhc3NldHMvXG5wdWJzcGVjLnlhbWxcbmA7XG4gICAgfVxuXG4gICAgY29uc3QgbmV3Q29udGVudCA9IGhlYWRVc2VyQ29udGVudCArIGNvbW1vbkNvbnRlbnQgKyBhZGRpdGlvbmFsQ29udGVudCArIGdpdGlnbm9yZUNvbnRlbnQgKyB0YWlsVXNlckNvbnRlbnQ7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBqc29uT2JqID0ge1xuICB2ZW52UGF0aDogJy4nLFxuICB2ZW52OiAnLnZlbnYnLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBsZXQgbmV3U2V0dGluZ3M6IG9iamVjdCA9IHN0cnVjdHVyZWRDbG9uZShqc29uT2JqKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3B5cmlnaHRjb25maWcuanNvbicpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBvbGRTZXR0aW5ncyA9IEpTT04ucGFyc2Uob2xkQ29udGVudCkgYXMgb2JqZWN0O1xuICAgICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MsIHVuZGVmaW5lZCwgMik7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IHNlbWFudGljUmVsZWFzZUJhZGdlID1cbiAgJ1shW3NlbWFudGljLXJlbGVhc2VdKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vYmFkZ2UvJTIwJTIwJUYwJTlGJTkzJUE2JUYwJTlGJTlBJTgwLXNlbWFudGljLS1yZWxlYXNlLWUxMDA3OS5zdmcpXShodHRwczovL2dpdGh1Yi5jb20vc2VtYW50aWMtcmVsZWFzZS9zZW1hbnRpYy1yZWxlYXNlKSc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVJlYWRtZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVJlYWRtZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ1JFQURNRS5tZCcpO1xuICAgIGxldCBuZXdDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG5cbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcucmVsZWFzZXJjLmpzb24nKSkpIHtcbiAgICAgIG5ld0NvbnRlbnQgPSBpbnNlcnRCYWRnZShuZXdDb250ZW50LCBzZW1hbnRpY1JlbGVhc2VCYWRnZSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVwb3NpdG9yeSA9IGNvbmZpZy5yZXBvc2l0b3J5Py5zbGljZShjb25maWcucmVwb3NpdG9yeS5pbmRleE9mKCc6JykgKyAxKTtcbiAgICBjb25zdCB3b3JrZmxvd3NQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicsICd3b3JrZmxvd3MnKTtcbiAgICBjb25zdCBmaWxlTmFtZXMgPSBmcy5leGlzdHNTeW5jKHdvcmtmbG93c1BhdGgpID8gZnMucmVhZGRpclN5bmMod29ya2Zsb3dzUGF0aCkgOiBbXTtcbiAgICBmb3IgKGNvbnN0IGZpbGVOYW1lIG9mIGZpbGVOYW1lcykge1xuICAgICAgaWYgKCFmaWxlTmFtZS5zdGFydHNXaXRoKCd0ZXN0JykgJiYgIWZpbGVOYW1lLnN0YXJ0c1dpdGgoJ2RlcGxveScpKSBjb250aW51ZTtcblxuICAgICAgbGV0IGJhZGdlTmFtZSA9IGZpbGVOYW1lO1xuICAgICAgYmFkZ2VOYW1lID0gKGJhZGdlTmFtZVswXSB8fCAnJykudG9VcHBlckNhc2UoKSArIGJhZGdlTmFtZS5zbGljZSgxLCBiYWRnZU5hbWUuaW5kZXhPZignLicpKTtcbiAgICAgIGJhZGdlTmFtZSA9IGJhZGdlTmFtZS5yZXBsYWNlKCctJywgJyAnKTtcbiAgICAgIGlmICghcmVwb3NpdG9yeSkgY29udGludWU7XG4gICAgICBjb25zdCBiYWRnZSA9IGBbIVske2JhZGdlTmFtZX1dKGh0dHBzOi8vZ2l0aHViLmNvbS8ke3JlcG9zaXRvcnl9L2FjdGlvbnMvd29ya2Zsb3dzLyR7ZmlsZU5hbWV9L2JhZGdlLnN2ZyldKGh0dHBzOi8vZ2l0aHViLmNvbS8ke3JlcG9zaXRvcnl9L2FjdGlvbnMvd29ya2Zsb3dzLyR7ZmlsZU5hbWV9KWA7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGAuZ2l0aHViL3dvcmtmbG93cy8ke2ZpbGVOYW1lfWApKSkge1xuICAgICAgICBuZXdDb250ZW50ID0gcmVtb3ZlR2l0SHViQWN0aW9uc0JhZGdlKG5ld0NvbnRlbnQsIGJhZGdlTmFtZSwgZmlsZU5hbWUpO1xuICAgICAgICBuZXdDb250ZW50ID0gaW5zZXJ0QmFkZ2UobmV3Q29udGVudCwgYmFkZ2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5zZXJ0QmFkZ2UocmVhZG1lOiBzdHJpbmcsIGJhZGdlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyDml6LjgatiYWRnZeOBjOOBguOCi+WgtOWQiOOBr+WJiumZpFxuICByZWFkbWUgPSByZWFkbWUucmVwbGFjZShiYWRnZSwgJycpLnJlcGxhY2VBbGwoL1xcblxcblxcbisvZywgJ1xcblxcbicpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcmVhZG1lLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHJlYWRtZVtpIC0gMV0gPT09ICdcXG4nICYmIHJlYWRtZVtpXSA9PT0gJ1xcbicpIHtcbiAgICAgIGNvbnN0IGJlZm9yZSA9IHJlYWRtZS5zbGljZSgwLCBpICsgMSk7XG4gICAgICBsZXQgYWZ0ZXIgPSByZWFkbWUuc2xpY2UoaSArIDEpO1xuICAgICAgaWYgKCFhZnRlci5zdGFydHNXaXRoKCdbJykgJiYgIWFmdGVyLnN0YXJ0c1dpdGgoJyEnKSkge1xuICAgICAgICBhZnRlciA9IGBcXG4ke2FmdGVyfWA7XG4gICAgICB9XG4gICAgICByZXR1cm4gYCR7YmVmb3JlfSR7YmFkZ2V9XFxuJHthZnRlcn1gO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYCR7cmVhZG1lfVxcbiR7YmFkZ2V9XFxuYDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUdpdEh1YkFjdGlvbnNCYWRnZShyZWFkbWU6IHN0cmluZywgYmFkZ2VOYW1lOiBzdHJpbmcsIGZpbGVOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBlc2NhcGVkQmFkZ2VOYW1lID0gZXNjYXBlUmVnRXhwKGJhZGdlTmFtZSk7XG4gIGNvbnN0IGVzY2FwZWRGaWxlTmFtZSA9IGVzY2FwZVJlZ0V4cChmaWxlTmFtZSk7XG4gIHJldHVybiByZWFkbWVcbiAgICAucmVwbGFjZUFsbChcbiAgICAgIG5ldyBSZWdFeHAoXG4gICAgICAgIFN0cmluZy5yYXdgXFxbIVxcWyR7ZXNjYXBlZEJhZGdlTmFtZX1cXF1cXChodHRwczovL2dpdGh1YlxcLmNvbS9bXi9cXHMpXSsvW14vXFxzKV0rL2FjdGlvbnMvd29ya2Zsb3dzLyR7ZXNjYXBlZEZpbGVOYW1lfS9iYWRnZVxcLnN2Z1xcKVxcXVxcKGh0dHBzOi8vZ2l0aHViXFwuY29tL1teL1xccyldKy9bXi9cXHMpXSsvYWN0aW9ucy93b3JrZmxvd3MvJHtlc2NhcGVkRmlsZU5hbWV9XFwpXFxuP2AsXG4gICAgICAgICdndSdcbiAgICAgICksXG4gICAgICAnJ1xuICAgIClcbiAgICAucmVwbGFjZUFsbCgvXFxuXFxuXFxuKy9nLCAnXFxuXFxuJyk7XG59XG5cbmZ1bmN0aW9uIGVzY2FwZVJlZ0V4cCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHZhbHVlLnJlcGxhY2VBbGwoL1suKis/XiR7fSgpfFtcXF1cXFxcXS9nLCBTdHJpbmcucmF3YFxcJCZgKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgb3ZlcndyaXRlTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVJlbGVhc2VyYyhyb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVSZWxlYXNlcmMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLnJlbGVhc2VyYy5qc29uJyk7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgc2V0dGluZ3MgPSBKU09OLnBhcnNlKGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpKSBhcyB7XG4gICAgICBwbHVnaW5zPzogKHN0cmluZyB8IFtzdHJpbmcsIHVua25vd25dKVtdO1xuICAgIH07XG4gICAgY29uc3QgcGx1Z2lucyA9IHNldHRpbmdzLnBsdWdpbnMgPz8gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwbHVnaW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBwbHVnaW5FbnRyeSA9IHBsdWdpbnNbaV07XG4gICAgICBjb25zdCBpc0FycmF5ID0gQXJyYXkuaXNBcnJheShwbHVnaW5FbnRyeSk7XG4gICAgICBjb25zdCBwbHVnaW4gPSBpc0FycmF5ID8gcGx1Z2luRW50cnlbMF0gOiBwbHVnaW5FbnRyeTtcbiAgICAgIGNvbnN0IG9sZENvbmZpZyA9IChpc0FycmF5ICYmIHBsdWdpbkVudHJ5WzFdKSB8fCB7fTtcbiAgICAgIGlmIChwbHVnaW4gPT09ICdAc2VtYW50aWMtcmVsZWFzZS9jb21taXQtYW5hbHl6ZXInKSB7XG4gICAgICAgIHBsdWdpbnNbaV0gPSBbXG4gICAgICAgICAgJ0BzZW1hbnRpYy1yZWxlYXNlL2NvbW1pdC1hbmFseXplcicsXG4gICAgICAgICAgbWVyZ2UuYWxsKFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBvbGRDb25maWcsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwcmVzZXQ6ICdjb252ZW50aW9uYWxjb21taXRzJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH1cbiAgICAgICAgICApLFxuICAgICAgICBdO1xuICAgICAgfSBlbHNlIGlmIChwbHVnaW4gPT09ICdAc2VtYW50aWMtcmVsZWFzZS9naXRodWInKSB7XG4gICAgICAgIHBsdWdpbnNbaV0gPSBbXG4gICAgICAgICAgJ0BzZW1hbnRpYy1yZWxlYXNlL2dpdGh1YicsXG4gICAgICAgICAgbWVyZ2UuYWxsKFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBvbGRDb25maWcsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAvLyBjZi4gaHR0cHM6Ly9naXRodWIuY29tL3NlbWFudGljLXJlbGVhc2Uvc2VtYW50aWMtcmVsZWFzZS9pc3N1ZXMvMjIwNCNpc3N1ZWNvbW1lbnQtMTUwODQxNzcwNFxuICAgICAgICAgICAgICAgIHN1Y2Nlc3NDb21tZW50Q29uZGl0aW9uOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBmYWlsQ29tbWVudENvbmRpdGlvbjogZmFsc2UsXG4gICAgICAgICAgICAgICAgbGFiZWxzOiBbJ3I6IHNlbWFudGljLXJlbGVhc2UnXSxcbiAgICAgICAgICAgICAgICByZWxlYXNlZExhYmVsczogWydyZWxlYXNlZCA6Ym9va21hcms6J10sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgeyBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSB9XG4gICAgICAgICAgKSxcbiAgICAgICAgXTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KHNldHRpbmdzLCB1bmRlZmluZWQsIDIpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QganNvbk9iaiA9IHtcbiAgJHNjaGVtYTogJ2h0dHBzOi8vZG9jcy5yZW5vdmF0ZWJvdC5jb20vcmVub3ZhdGUtc2NoZW1hLmpzb24nLFxuICBleHRlbmRzOiBbJ2dpdGh1Yj5XaWxsQm9vc3Rlci93aWxsYm9vc3Rlci1jb25maWdzOnJlbm92YXRlLmpzb241J10sXG59O1xuXG50eXBlIFNldHRpbmdzID0gdHlwZW9mIGpzb25PYmogJiB7IHBhY2thZ2VSdWxlcz86IHsgbWF0Y2hQYWNrYWdlTmFtZXM6IHN0cmluZ1tdOyBlbmFibGVkPzogYm9vbGVhbiB9W10gfTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUmVub3ZhdGVKc29uKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUmVub3ZhdGVKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGxldCBuZXdTZXR0aW5ncyA9IHN0cnVjdHVyZWRDbG9uZShqc29uT2JqKSBhcyBTZXR0aW5ncztcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3Jlbm92YXRlLmpzb24nKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhgJHtmaWxlUGF0aH01YCkpIHtcbiAgICAgIC8vIFNpbmNlIGl0IGlzIGRpZmZpY3VsdCBmb3IgcGFyc2luZyByZW5vdmF0ZS5qc29uNSwgd2UgZG8gbm90aGluZ1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3Qgb2xkU2V0dGluZ3MgPSBKU09OLnBhcnNlKG9sZENvbnRlbnQpIGFzIFNldHRpbmdzO1xuICAgICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7XG4gICAgICAgIGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlLFxuICAgICAgfSkgYXMgU2V0dGluZ3M7XG4gICAgICBuZXdTZXR0aW5ncy5leHRlbmRzID0gbmV3U2V0dGluZ3MuZXh0ZW5kcy5maWx0ZXIoKGl0ZW06IHN0cmluZykgPT4gaXRlbSAhPT0gJ0B3aWxsYm9vc3RlcicpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cblxuICAgIC8vIERvbid0IHVwZ3JhZGUgTmV4dC5qcyBhdXRvbWF0aWNhbGx5XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHopIHtcbiAgICAgIG5ld1NldHRpbmdzLnBhY2thZ2VSdWxlcyA/Pz0gW107XG4gICAgICBpZiAoXG4gICAgICAgICFuZXdTZXR0aW5ncy5wYWNrYWdlUnVsZXMuc29tZSgocnVsZTogeyBtYXRjaFBhY2thZ2VOYW1lcz86IHN0cmluZ1tdIH0pID0+XG4gICAgICAgICAgcnVsZS5tYXRjaFBhY2thZ2VOYW1lcz8uaW5jbHVkZXMoJ25leHQnKVxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgbmV3U2V0dGluZ3MucGFja2FnZVJ1bGVzLnB1c2goeyBtYXRjaFBhY2thZ2VOYW1lczogWyduZXh0J10sIGVuYWJsZWQ6IGZhbHNlIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZGVwZW5kYWJvdCcpLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnJlbm92YXRlcmMuanNvbicpLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MsIHVuZGVmaW5lZCwgMik7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbnN0YWxsQWdlbnRTa2lsbHMoX3Jvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdpbnN0YWxsQWdlbnRTa2lsbHMnLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gVE9ETzogV2UgYXJlIHRlbXBvcmFyaWx5IG5vdCBpbnN0YWxsaW5nIG1hbmFnZWQgYWdlbnQgc2tpbGxzIGludG8gcmVwb3MuXG4gICAgLy8gYXdhaXQgcnVuSW5zdGFsbEFnZW50U2tpbGxzKF9yb290Q29uZmlnKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCB0eXBlIHsgVHNDb25maWdKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGNvbWJpbmVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBzb3J0S2V5cyB9IGZyb20gJy4uL3V0aWxzL29iamVjdFV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBnZXRUc2NvbmZpZ0V4dGVuZHMgfSBmcm9tICcuLi91dGlscy90c2NvbmZpZ0Jhc2UuanMnO1xuXG5jb25zdCByb290SnNvbk9iaiA9IHtcbiAgY29tcGlsZXJPcHRpb25zOiB7XG4gICAgYWx3YXlzU3RyaWN0OiB0cnVlLFxuICAgIG5vVW5jaGVja2VkSW5kZXhlZEFjY2VzczogdHJ1ZSwgLy8gZm9yIEB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItbnVsbGlzaC1jb2FsZXNjaW5nXG4gICAgYWxsb3dTeW50aGV0aWNEZWZhdWx0SW1wb3J0czogdHJ1ZSwgLy8gYWxsb3cgYGltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdgXG4gICAgZXNNb2R1bGVJbnRlcm9wOiB0cnVlLCAvLyBhbGxvdyBkZWZhdWx0IGltcG9ydCBmcm9tIENvbW1vbkpTL0FNRC9VTUQgbW9kdWxlc1xuICAgIHJlc29sdmVKc29uTW9kdWxlOiB0cnVlLCAvLyBhbGxvdyB0byBpbXBvcnQgSlNPTiBmaWxlc1xuICAgIGltcG9ydEhlbHBlcnM6IGZhbHNlLFxuICAgIG5vRW1pdDogdHJ1ZSxcbiAgfSxcbiAgZXhjbHVkZTogWydwYWNrYWdlcy8qL3Rlc3QvZml4dHVyZXMnLCAndGVzdC9maXh0dXJlcyddLFxuICBpbmNsdWRlOiBbXG4gICAgJyouY29uZmlnLnRzJyxcbiAgICAncGFja2FnZXMvKi8qLmNvbmZpZy50cycsXG4gICAgJ3BhY2thZ2VzLyovc2NyaXB0cy8qKi8qJyxcbiAgICAncGFja2FnZXMvKi9zcmMvKiovKicsXG4gICAgJ3BhY2thZ2VzLyovdGVzdC8qKi8qJyxcbiAgICAnc2NyaXB0cy8qKi8qJyxcbiAgICAnc3JjLyoqLyonLFxuICAgICd0ZXN0LyoqLyonLFxuICBdLFxufTtcblxuY29uc3Qgc3ViSnNvbk9iaiA9IHtcbiAgY29tcGlsZXJPcHRpb25zOiB7XG4gICAgYWx3YXlzU3RyaWN0OiB0cnVlLFxuICAgIG5vVW5jaGVja2VkSW5kZXhlZEFjY2VzczogdHJ1ZSwgLy8gZm9yIEB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItbnVsbGlzaC1jb2FsZXNjaW5nXG4gICAgYWxsb3dTeW50aGV0aWNEZWZhdWx0SW1wb3J0czogdHJ1ZSwgLy8gYWxsb3cgYGltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdgXG4gICAgZXNNb2R1bGVJbnRlcm9wOiB0cnVlLCAvLyBhbGxvdyBkZWZhdWx0IGltcG9ydCBmcm9tIENvbW1vbkpTL0FNRC9VTUQgbW9kdWxlc1xuICAgIHJlc29sdmVKc29uTW9kdWxlOiB0cnVlLCAvLyBhbGxvdyB0byBpbXBvcnQgSlNPTiBmaWxlc1xuICAgIGltcG9ydEhlbHBlcnM6IGZhbHNlLFxuICAgIG5vRW1pdDogdHJ1ZSxcbiAgfSxcbiAgZXhjbHVkZTogWyd0ZXN0L2ZpeHR1cmVzJ10sXG4gIC8vIHdiZnkgZ2VuZXJhdGVzIHJvb3QtbGV2ZWwgdG9vbCBjb25maWdzIHN1Y2ggYXMgcGxheXdyaWdodC5jb25maWcudHMsIGFuZFxuICAvLyB0eXBlLWF3YXJlIGxpbnRpbmcgbmVlZHMgdGhvc2UgZmlsZXMgaW4gdGhlIHByb2plY3QgdG8gc2VlIE5vZGUvQnVuIGdsb2JhbHMuXG4gIGluY2x1ZGU6IFsnKi5jb25maWcudHMnLCAnc2NyaXB0cy8qKi8qJywgJ3NyYy8qKi8qJywgJ3Rlc3QvKiovKiddLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlVHNjb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVUc2NvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eiB8fCBjb25maWcuZGVwZW5kaW5nLm5leHQpIHtcbiAgICAgIGF3YWl0IGNsZWFudXBMZWdhY3lUc2NvbmZpZ01vZHVsZVNldHRpbmdzKGNvbmZpZyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IG5ld1NldHRpbmdzID0gc3RydWN0dXJlZENsb25lKGNvbmZpZy5pc1Jvb3QgPyByb290SnNvbk9iaiA6IHN1Ykpzb25PYmopIGFzIFRzQ29uZmlnSnNvbjtcbiAgICBjb25zdCBnZW5lcmF0ZWRUeXBlcyA9IGdldEdlbmVyYXRlZFR5cGVzKGNvbmZpZyk7XG4gICAgbmV3U2V0dGluZ3MuZXh0ZW5kcyA9IGdldFRzY29uZmlnRXh0ZW5kcyhjb25maWcpO1xuICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyA/Pz0ge307XG4gICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLnJvb3REaXIgPSBnZXRSb290RGlyKGNvbmZpZyk7XG4gICAgaWYgKGdlbmVyYXRlZFR5cGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyA9IHsgLi4ubmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLCB0eXBlczogZ2VuZXJhdGVkVHlwZXMgfTtcbiAgICB9XG4gICAgaWYgKCFjb25maWcuZG9lc0NvbnRhaW5Kc3hPclRzeCAmJiAhY29uZmlnLmRvZXNDb250YWluSnN4T3JUc3hJblBhY2thZ2VzKSB7XG4gICAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5qc3g7XG4gICAgfSBlbHNlIGlmICghY29uZmlnLmlzQnVuICYmICFjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMgPSB7IC4uLm5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucywganN4OiAncmVhY3QtanN4JyB9O1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmlzUm9vdCAmJiAhY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zKSB7XG4gICAgICBuZXdTZXR0aW5ncy5pbmNsdWRlID0gbmV3U2V0dGluZ3MuaW5jbHVkZT8uZmlsdGVyKChkaXJQYXRoOiBzdHJpbmcpID0+ICFkaXJQYXRoLnN0YXJ0c1dpdGgoJ3BhY2thZ2VzLyovJykpO1xuICAgICAgbmV3U2V0dGluZ3MuZXhjbHVkZSA9IG5ld1NldHRpbmdzLmV4Y2x1ZGU/LmZpbHRlcigoZGlyUGF0aDogc3RyaW5nKSA9PiAhZGlyUGF0aC5zdGFydHNXaXRoKCdwYWNrYWdlcy8qLycpKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHJpc21hKSB7XG4gICAgICAvLyBQcmlzbWEgc2VlZHMgYW5kIG1pZ3JhdGlvbiBoZWxwZXIgc2NyaXB0cyBvZnRlbiBsaXZlIG91dHNpZGUgc3JjLCBidXRcbiAgICAgIC8vIHR5cGUtYXdhcmUgbGludGluZyBzdGlsbCBuZWVkcyB0aGVtIGNvdmVyZWQgYnkgdGhlIHByb2plY3QgY29uZmlnLlxuICAgICAgYWRkSW5jbHVkZVBhdGgobmV3U2V0dGluZ3MsICdwcmlzbWEvKiovKicpO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAndHNjb25maWcuanNvbicpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG9sZFNldHRpbmdzID0gSlNPTi5wYXJzZShleGlzdGluZ0NvbnRlbnQpIGFzIFRzQ29uZmlnSnNvbjtcbiAgICAgIGNvbnN0IGV4aXN0aW5nVHlwZXMgPSBub3JtYWxpemVTdHJpbmdBcnJheShvbGRTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LnR5cGVzKTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nRW1pdE1ldGFkYXRhID0gcGlja0V4aXN0aW5nRW1pdE1ldGFkYXRhKG9sZFNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyk7XG4gICAgICBuZXdTZXR0aW5ncy5leHRlbmRzID0gbWVyZ2VUc2NvbmZpZ0V4dGVuZHMobmV3U2V0dGluZ3MuZXh0ZW5kcywgb2xkU2V0dGluZ3MuZXh0ZW5kcyk7XG4gICAgICBkZWxldGUgb2xkU2V0dGluZ3MuZXh0ZW5kcztcbiAgICAgIGRlbGV0ZSBvbGRTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmpzeDtcbiAgICAgIG5ld1NldHRpbmdzID0gbWVyZ2UuYWxsKFtuZXdTZXR0aW5ncywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzXSwgeyBhcnJheU1lcmdlOiBjb21iaW5lTWVyZ2UgfSk7XG4gICAgICBuZXdTZXR0aW5ncy5pbmNsdWRlID0gbmV3U2V0dGluZ3MuaW5jbHVkZT8uZmlsdGVyKFxuICAgICAgICAoZGlyUGF0aDogc3RyaW5nKSA9PlxuICAgICAgICAgICFkaXJQYXRoLmluY2x1ZGVzKCdAdHlwZXMnKSAmJiAhZGlyUGF0aC5pbmNsdWRlcygnX190ZXN0c19fLycpICYmICFkaXJQYXRoLmluY2x1ZGVzKCd0ZXN0cy8nKVxuICAgICAgKTtcbiAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyA/Pz0ge307XG4gICAgICAvLyB3YmZ5LWdlbmVyYXRlZCB0c2NvbmZpZy5qc29uIGlzIGEgbGludC90eXBlY2hlY2sgcHJvamVjdCwgbm90IHRoZSBlbWl0XG4gICAgICAvLyBjb250cmFjdC4gSXQgbXVzdCBrZWVwIHJvb3REaXIgYnJvYWQgZW5vdWdoIGZvciByb290IGNvbmZpZyBmaWxlcyxcbiAgICAgIC8vIHNjcmlwdHMsIHNyYywgYW5kIHRlc3RzLiBidWlsZC10cyBvd25zIGVtaXQgYW5kIGNyZWF0ZXMgYSB0ZW1wb3JhcnlcbiAgICAgIC8vIHNyYy1vbmx5IHRzY29uZmlnIHdpdGggbm9FbWl0PWZhbHNlLCBlbWl0RGVjbGFyYXRpb25Pbmx5PXRydWUsXG4gICAgICAvLyByb290RGlyPVwic3JjXCIsIGFuZCBpbmNsdWRlPVtcInNyYy8qKi8qXCJdLCBzbyBwcmVzZXJ2aW5nIG5vRW1pdD1mYWxzZSBvclxuICAgICAgLy8gcm9vdERpcj1cInNyY1wiIGhlcmUgd291bGQgb25seSBicmVhayBub24tc3JjIHR5cGUtYXdhcmUgbGludCBjb3ZlcmFnZS5cbiAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyA9IHsgLi4ubmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLCAuLi5leGlzdGluZ0VtaXRNZXRhZGF0YSB9O1xuICAgICAgZW5zdXJlVHNFeHRlbnNpb25FbWl0Q29tcGF0aWJpbGl0eShuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMpO1xuXG4gICAgICBjb25zdCBtZXJnZWRUeXBlcyA9IFsuLi5uZXcgU2V0KFsuLi5maWx0ZXJFeGlzdGluZ1R5cGVzKGV4aXN0aW5nVHlwZXMsIGdlbmVyYXRlZFR5cGVzKSwgLi4uZ2VuZXJhdGVkVHlwZXNdKV07XG4gICAgICBpZiAobWVyZ2VkVHlwZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMudHlwZXMgPSBtZXJnZWRUeXBlcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMudHlwZXM7XG4gICAgICB9XG4gICAgICBpZiAoc2hvdWxkRGVsZXRlVHlwZVJvb3RzKGdlbmVyYXRlZFR5cGVzKSkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLnR5cGVSb290cztcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gICAgc29ydEtleXMobmV3U2V0dGluZ3MpO1xuICAgIG5ld1NldHRpbmdzLmluY2x1ZGU/LnNvcnQoKTtcbiAgICAvLyBEb24ndCB1c2Ugb2xkIGRlY29yYXRvclxuICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmV4cGVyaW1lbnRhbERlY29yYXRvcnM7XG4gICAgLy8gUGFja2FnZSBpbXBvcnRzIHNob3VsZCByZXNvbHZlIHRocm91Z2ggcGFja2FnZSBleHBvcnRzIGluc3RlYWQgb2YgYmFzZVVybC5cbiAgICAvLyBwYXRocyBpcyBpbnRlbnRpb25hbGx5IHByZXNlcnZlZCBzbyByZXBvLWxvY2FsIHRvb2xpbmcgY2FuIGtlZXAgZXhwbGljaXRcbiAgICAvLyBhbGlhc2VzIHdpdGhvdXQgcmVseWluZyBvbiBiYXNlVXJsJ3MgYnJvYWQgZmFsbGJhY2sgcmVzb2x1dGlvbi5cbiAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5iYXNlVXJsO1xuICAgIGRlbGV0ZUxlZ2FjeU1vZHVsZVNldHRpbmdzKG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucywgY29uZmlnKTtcbiAgICBub3JtYWxpemVDb21tb25Kc1RzY29uZmlnU2V0dGluZ3MobmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLCBjb25maWcpO1xuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy52ZXJiYXRpbU1vZHVsZVN5bnRheDtcbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KG5ld1NldHRpbmdzLCB1bmRlZmluZWQsIDIpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjbGVhbnVwTGVnYWN5VHNjb25maWdNb2R1bGVTZXR0aW5ncyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICd0c2NvbmZpZy5qc29uJyk7XG4gIHRyeSB7XG4gICAgY29uc3Qgc2V0dGluZ3MgPSBKU09OLnBhcnNlKGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpKSBhcyBUc0NvbmZpZ0pzb247XG4gICAgbm9ybWFsaXplTmV4dFRzY29uZmlnTW9kdWxlU2V0dGluZ3Moc2V0dGluZ3MuY29tcGlsZXJPcHRpb25zKTtcbiAgICBub3JtYWxpemVOZXh0VHNjb25maWdQYXRoQWxpYXNlcyhzZXR0aW5ncy5jb21waWxlck9wdGlvbnMpO1xuICAgIGFkZFNjcmlwdHNJbmNsdWRlRm9yRnJhbWV3b3JrUHJvamVjdChzZXR0aW5ncyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIEpTT04uc3RyaW5naWZ5KHNldHRpbmdzLCB1bmRlZmluZWQsIDIpKSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIE5leHQvQmxpdHogb3duIHRoZWlyIHRzY29uZmlnIHNoYXBlLCBidXQgVHlwZVNjcmlwdCA2IG5vIGxvbmdlciBhY2NlcHRzXG4gICAgLy8gbm9kZTEwIHJlc29sdmVyIHNwZWxsaW5ncyB0aGF0IG9sZGVyIHByb2plY3RzIGNvbW1vbmx5IGluaGVyaXRlZC5cbiAgfVxufVxuXG5mdW5jdGlvbiBhZGRTY3JpcHRzSW5jbHVkZUZvckZyYW1ld29ya1Byb2plY3Qoc2V0dGluZ3M6IFRzQ29uZmlnSnNvbik6IHZvaWQge1xuICAvLyBPbWl0dGluZyBpbmNsdWRlIGxldHMgZnJhbWV3b3JrIHRzY29uZmlncyBrZWVwIFR5cGVTY3JpcHQncyBkZWZhdWx0XG4gIC8vIFwiYWxsIFRTL1RTWCBmaWxlc1wiIGJlaGF2aW9yLCB3aGljaCBhbHJlYWR5IGNvdmVycyBzY3JpcHRzLlxuICBpZiAoIXNldHRpbmdzLmluY2x1ZGUpIHJldHVybjtcbiAgaWYgKHNldHRpbmdzLmluY2x1ZGUuaW5jbHVkZXMoJ3NjcmlwdHMvKiovKicpKSByZXR1cm47XG5cbiAgc2V0dGluZ3MuaW5jbHVkZS5wdXNoKCdzY3JpcHRzLyoqLyonKTtcbiAgc2V0dGluZ3MuaW5jbHVkZS5zb3J0KCk7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZU5leHRUc2NvbmZpZ01vZHVsZVNldHRpbmdzKGNvbXBpbGVyT3B0aW9uczogVHNDb25maWdKc29uLkNvbXBpbGVyT3B0aW9ucyB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICBpZiAoIWNvbXBpbGVyT3B0aW9ucykgcmV0dXJuO1xuICBpZiAoXG4gICAgY29tcGlsZXJPcHRpb25zLm1vZHVsZVJlc29sdXRpb24gPT09ICdub2RlJyB8fFxuICAgIGNvbXBpbGVyT3B0aW9ucy5tb2R1bGVSZXNvbHV0aW9uID09PSAnTm9kZScgfHxcbiAgICBjb21waWxlck9wdGlvbnMubW9kdWxlUmVzb2x1dGlvbiA9PT0gJ25vZGUxMCcgfHxcbiAgICBjb21waWxlck9wdGlvbnMubW9kdWxlUmVzb2x1dGlvbiA9PT0gdW5kZWZpbmVkXG4gICkge1xuICAgIC8vIE5leHQuanMgd3JpdGVzIFwibm9kZVwiIGR1cmluZyBidWlsZCB3aGVuIHRoaXMgb3B0aW9uIGlzIG1pc3NpbmcsIGJ1dFxuICAgIC8vIHRzZ29saW50IHRyZWF0cyB0aGF0IHNwZWxsaW5nIGFzIHRoZSByZW1vdmVkIG5vZGUxMCByZXNvbHZlci5cbiAgICBjb21waWxlck9wdGlvbnMubW9kdWxlUmVzb2x1dGlvbiA9ICdidW5kbGVyJztcbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVOZXh0VHNjb25maWdQYXRoQWxpYXNlcyhjb21waWxlck9wdGlvbnM6IFRzQ29uZmlnSnNvbi5Db21waWxlck9wdGlvbnMgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgaWYgKCFjb21waWxlck9wdGlvbnMpIHJldHVybjtcblxuICAvLyB0c2dvbGludCBmb2xsb3dzIFR5cGVTY3JpcHQgNiB2YWxpZGF0aW9uLCB3aGVyZSBiYXNlVXJsIGlzIHJlbW92ZWQgYW5kXG4gIC8vIHBhdGggdGFyZ2V0cyBtdXN0IGJlIGV4cGxpY2l0bHkgcmVsYXRpdmUuIE5leHQuanMgc3RpbGwgYWNjZXB0cyB0aGUgYWxpYXNcbiAgLy8gc2hhcGUgYWZ0ZXIgZWFjaCB0YXJnZXQgaXMgd3JpdHRlbiB3aXRoIGEgbGVhZGluZyAuLy5cbiAgZGVsZXRlIGNvbXBpbGVyT3B0aW9ucy5iYXNlVXJsO1xuICBpZiAoIWNvbXBpbGVyT3B0aW9ucy5wYXRocykgcmV0dXJuO1xuXG4gIGZvciAoY29uc3QgW2FsaWFzLCB0YXJnZXRzXSBvZiBPYmplY3QuZW50cmllcyhjb21waWxlck9wdGlvbnMucGF0aHMpKSB7XG4gICAgY29tcGlsZXJPcHRpb25zLnBhdGhzW2FsaWFzXSA9IG5vcm1hbGl6ZVBhdGhBbGlhc1RhcmdldHModGFyZ2V0cyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplUGF0aEFsaWFzVGFyZ2V0cyh0YXJnZXRzOiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIHRhcmdldHMubWFwKCh0YXJnZXQpID0+IHtcbiAgICBpZiAodGFyZ2V0LnN0YXJ0c1dpdGgoJy4vJykgfHwgdGFyZ2V0LnN0YXJ0c1dpdGgoJy4uLycpIHx8IHBhdGguaXNBYnNvbHV0ZSh0YXJnZXQpKSByZXR1cm4gdGFyZ2V0O1xuICAgIHJldHVybiBgLi8ke3RhcmdldH1gO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0Um9vdERpcihjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBpZiAoY29uZmlnLmlzUm9vdCkgcmV0dXJuICcuJztcbiAgcmV0dXJuIGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLi4nLCAnLi4nLCAncGFja2FnZS5qc29uJykpID8gJy4uLy4uJyA6ICcuJztcbn1cblxuZnVuY3Rpb24gbWVyZ2VUc2NvbmZpZ0V4dGVuZHMoXG4gIGdlbmVyYXRlZEV4dGVuZHM6IFRzQ29uZmlnSnNvblsnZXh0ZW5kcyddLFxuICBleGlzdGluZ0V4dGVuZHM6IFRzQ29uZmlnSnNvblsnZXh0ZW5kcyddXG4pOiBUc0NvbmZpZ0pzb25bJ2V4dGVuZHMnXSB7XG4gIGNvbnN0IG1lcmdlZEV4dGVuZHMgPSBbLi4ubm9ybWFsaXplRXh0ZW5kcyhnZW5lcmF0ZWRFeHRlbmRzKSwgLi4ubm9ybWFsaXplRXh0ZW5kcyhleGlzdGluZ0V4dGVuZHMpXTtcbiAgY29uc3QgdW5pcXVlRXh0ZW5kcyA9IFsuLi5uZXcgU2V0KG1lcmdlZEV4dGVuZHMpXTtcbiAgaWYgKHVuaXF1ZUV4dGVuZHMubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAodW5pcXVlRXh0ZW5kcy5sZW5ndGggPT09IDEpIHJldHVybiB1bmlxdWVFeHRlbmRzWzBdO1xuICByZXR1cm4gdW5pcXVlRXh0ZW5kcztcbn1cblxuZnVuY3Rpb24gYWRkSW5jbHVkZVBhdGgoc2V0dGluZ3M6IFRzQ29uZmlnSnNvbiwgZGlyUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIHNldHRpbmdzLmluY2x1ZGUgPz89IFtdO1xuICBpZiAoIXNldHRpbmdzLmluY2x1ZGUuaW5jbHVkZXMoZGlyUGF0aCkpIHtcbiAgICBzZXR0aW5ncy5pbmNsdWRlLnB1c2goZGlyUGF0aCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplRXh0ZW5kcyh2YWx1ZTogVHNDb25maWdKc29uWydleHRlbmRzJ10pOiBzdHJpbmdbXSB7XG4gIGlmICghdmFsdWUpIHJldHVybiBbXTtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVTdHJpbmdBcnJheSh2YWx1ZTogdW5rbm93bik6IHN0cmluZ1tdIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHJldHVybiBbdmFsdWVdO1xuICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gW107XG4gIHJldHVybiB2YWx1ZS5maWx0ZXIoKGl0ZW0pOiBpdGVtIGlzIHN0cmluZyA9PiB0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycpO1xufVxuXG5mdW5jdGlvbiBzaG91bGREZWxldGVUeXBlUm9vdHModHlwZU5hbWVzOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICAvLyBPbmx5IGdlbmVyYXRlZCBwYWNrYWdlLW93bmVkIHRlc3QgdHlwZXMgc2hvdWxkIHRyaWdnZXIgdGhpcy4gVXNlci1kZWZpbmVkIHNsYXNoLWJhc2VkXG4gIC8vIGVudHJpZXMgbWF5IGludGVudGlvbmFsbHkgcmVseSBvbiBjdXN0b20gdHlwZVJvb3RzIGFuZCBzaG91bGQgYmUgcHJlc2VydmVkIGFzLWlzLlxuICByZXR1cm4gdHlwZU5hbWVzLnNvbWUoKHR5cGVOYW1lKSA9PiB0eXBlTmFtZSA9PT0gJ2N5cHJlc3MnIHx8IHR5cGVOYW1lLmluY2x1ZGVzKCcvJykpO1xufVxuXG5mdW5jdGlvbiBmaWx0ZXJFeGlzdGluZ1R5cGVzKGV4aXN0aW5nVHlwZXM6IHN0cmluZ1tdLCBnZW5lcmF0ZWRUeXBlczogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGdlbmVyYXRlZFR5cGVTZXQgPSBuZXcgU2V0KGdlbmVyYXRlZFR5cGVzKTtcbiAgcmV0dXJuIGV4aXN0aW5nVHlwZXMuZmlsdGVyKCh0eXBlTmFtZSkgPT4ge1xuICAgIC8vIHdiZnkgb3ducyB0aGVzZSBwYWNrYWdlLXByb3ZpZGVkIHRlc3QgZ2xvYmFscy4gRHJvcCBzdGFsZSBlbnRyaWVzIHdoZW4gdGhlXG4gICAgLy8gY29ycmVzcG9uZGluZyBkZXBlbmRlbmN5IGlzIG5vIGxvbmdlciBwcmVzZW50IHNvIFR5cGVTY3JpcHQgd29uJ3QgcmVxdWlyZVxuICAgIC8vIG1pc3NpbmcgcGFja2FnZXMgc3VjaCBhcyB2aXRlc3QuXG4gICAgaWYgKGlzR2VuZXJhdGVkVGVzdEdsb2JhbFR5cGUodHlwZU5hbWUpICYmICFnZW5lcmF0ZWRUeXBlU2V0Lmhhcyh0eXBlTmFtZSkpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGlzR2VuZXJhdGVkVGVzdEdsb2JhbFR5cGUodHlwZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZU5hbWUgPT09ICdjeXByZXNzJyB8fCB0eXBlTmFtZSA9PT0gJ2plc3QnIHx8IHR5cGVOYW1lID09PSAnbW9jaGEnIHx8IHR5cGVOYW1lID09PSAndml0ZXN0L2dsb2JhbHMnO1xufVxuXG5mdW5jdGlvbiBlbnN1cmVUc0V4dGVuc2lvbkVtaXRDb21wYXRpYmlsaXR5KGNvbXBpbGVyT3B0aW9uczogVHNDb25maWdKc29uLkNvbXBpbGVyT3B0aW9ucyB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICBpZiAoIWNvbXBpbGVyT3B0aW9ucykgcmV0dXJuO1xuICBpZiAoY29tcGlsZXJPcHRpb25zLm5vRW1pdCAhPT0gZmFsc2UgfHwgY29tcGlsZXJPcHRpb25zLmVtaXREZWNsYXJhdGlvbk9ubHkgPT09IHRydWUpIHJldHVybjtcblxuICAvLyBAdHNjb25maWcvYnVuIGVuYWJsZXMgYWxsb3dJbXBvcnRpbmdUc0V4dGVuc2lvbnMsIHdoaWNoIFR5cGVTY3JpcHQgcGVybWl0c1xuICAvLyBkdXJpbmcgZW1pdCBvbmx5IHdoZW4gcmVsYXRpdmUgVFMgZXh0ZW5zaW9ucyBhcmUgcmV3cml0dGVuLlxuICBjb21waWxlck9wdGlvbnMucmV3cml0ZVJlbGF0aXZlSW1wb3J0RXh0ZW5zaW9ucyA9IHRydWU7XG59XG5cbmZ1bmN0aW9uIGRlbGV0ZUxlZ2FjeU1vZHVsZVNldHRpbmdzKFxuICBjb21waWxlck9wdGlvbnM6IFRzQ29uZmlnSnNvbi5Db21waWxlck9wdGlvbnMgfCB1bmRlZmluZWQsXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZ1xuKTogdm9pZCB7XG4gIGlmICghY29tcGlsZXJPcHRpb25zKSByZXR1cm47XG5cbiAgLy8gVHlwZVNjcmlwdCA2IHJlbW92ZWQgdGhlIG9sZCBub2RlMTAgcmVzb2x2ZXIgc3BlbGxpbmcsIHNvIGluaGVyaXRlZCBiYXNlIGNvbmZpZ3NcbiAgLy8gc2hvdWxkIGNob29zZSB0aGUgcmVzb2x2ZXIgdW5sZXNzIGEgcHJvamVjdCBhbHJlYWR5IG9wdGVkIGludG8gYSBtb2Rlcm4gb25lLlxuICBpZiAoXG4gICAgY29tcGlsZXJPcHRpb25zLm1vZHVsZVJlc29sdXRpb24gPT09ICdub2RlJyB8fFxuICAgIGNvbXBpbGVyT3B0aW9ucy5tb2R1bGVSZXNvbHV0aW9uID09PSAnTm9kZScgfHxcbiAgICBjb21waWxlck9wdGlvbnMubW9kdWxlUmVzb2x1dGlvbiA9PT0gJ25vZGUxMCdcbiAgKSB7XG4gICAgZGVsZXRlIGNvbXBpbGVyT3B0aW9ucy5tb2R1bGVSZXNvbHV0aW9uO1xuICB9XG4gIGlmIChjb25maWcuaXNCdW4gfHwgY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSB8fCBjb21waWxlck9wdGlvbnMubW9kdWxlICE9PSAnRVNOZXh0JykgcmV0dXJuO1xuXG4gIC8vIE5vZGUgYmFzZSBjb25maWdzIG5vdyBwYWlyIHRoZWlyIHJlc29sdmVyIHdpdGggYSBtYXRjaGluZyBtb2R1bGUga2luZC4gS2VlcGluZ1xuICAvLyBvbGRlciBFU05leHQgb3ZlcnJpZGVzIGNyZWF0ZXMgaW52YWxpZCBnZW5lcmF0ZWQgY29uZmlncyBmb3IgVFMgNi5cbiAgZGVsZXRlIGNvbXBpbGVyT3B0aW9ucy5tb2R1bGU7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUNvbW1vbkpzVHNjb25maWdTZXR0aW5ncyhcbiAgY29tcGlsZXJPcHRpb25zOiBUc0NvbmZpZ0pzb24uQ29tcGlsZXJPcHRpb25zIHwgdW5kZWZpbmVkLFxuICBjb25maWc6IFBhY2thZ2VDb25maWdcbik6IHZvaWQge1xuICBpZiAoIWNvbXBpbGVyT3B0aW9ucyB8fCBjb25maWcuaXNCdW4gfHwgY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSB8fCBjb25maWcuaXNFc21QYWNrYWdlKSByZXR1cm47XG5cbiAgaWYgKGNvbXBpbGVyT3B0aW9ucy5tb2R1bGU/LnRvTG93ZXJDYXNlKCkgPT09ICdjb21tb25qcycpIHtcbiAgICAvLyBAdHNjb25maWcvbm9kZS1sdHMgbm93IHByb3ZpZGVzIG1vZHVsZVJlc29sdXRpb249bm9kZTE2LiBUeXBlU2NyaXB0IHJlcXVpcmVzXG4gICAgLy8gdGhlIG1vZHVsZSBraW5kIHRvIG1vdmUgd2l0aCB0aGF0IHJlc29sdmVyLCB3aGlsZSB2ZXJiYXRpbU1vZHVsZVN5bnRheD1mYWxzZVxuICAgIC8vIHByZXNlcnZlcyB0aGUgbG9uZy1zdGFuZGluZyBDb21tb25KUyBlbWl0IHNoYXBlIGZvciBleGlzdGluZyBwYWNrYWdlcy5cbiAgICBjb21waWxlck9wdGlvbnMubW9kdWxlID0gJ05vZGUxNic7XG4gIH1cbiAgY29tcGlsZXJPcHRpb25zLnZlcmJhdGltTW9kdWxlU3ludGF4ID0gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHBpY2tFeGlzdGluZ0VtaXRNZXRhZGF0YShcbiAgY29tcGlsZXJPcHRpb25zOiBUc0NvbmZpZ0pzb25bJ2NvbXBpbGVyT3B0aW9ucyddXG4pOiBQaWNrPE5vbk51bGxhYmxlPFRzQ29uZmlnSnNvblsnY29tcGlsZXJPcHRpb25zJ10+LCAnZGVjbGFyYXRpb24nIHwgJ2RlY2xhcmF0aW9uTWFwJyB8ICdzb3VyY2VNYXAnPiB7XG4gIGNvbnN0IGVtaXRPcHRpb25zID0ge30gYXMgUGljazxcbiAgICBOb25OdWxsYWJsZTxUc0NvbmZpZ0pzb25bJ2NvbXBpbGVyT3B0aW9ucyddPixcbiAgICAnZGVjbGFyYXRpb24nIHwgJ2RlY2xhcmF0aW9uTWFwJyB8ICdzb3VyY2VNYXAnXG4gID47XG4gIGZvciAoY29uc3Qga2V5IG9mIFsnZGVjbGFyYXRpb24nLCAnZGVjbGFyYXRpb25NYXAnLCAnc291cmNlTWFwJ10gYXMgY29uc3QpIHtcbiAgICBjb25zdCB2YWx1ZSA9IGNvbXBpbGVyT3B0aW9ucz8uW2tleV07XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGVtaXRPcHRpb25zW2tleV0gPSB2YWx1ZSBhcyBuZXZlcjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVtaXRPcHRpb25zO1xufVxuXG5mdW5jdGlvbiBnZXRHZW5lcmF0ZWRUeXBlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHR5cGVOYW1lcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBkZXBlbmRlbmNpZXMgPSB7XG4gICAgLi4uY29uZmlnLnBhY2thZ2VKc29uPy5kZXBlbmRlbmNpZXMsXG4gICAgLi4uY29uZmlnLnBhY2thZ2VKc29uPy5kZXZEZXBlbmRlbmNpZXMsXG4gIH07XG5cbiAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgIHR5cGVOYW1lcy5hZGQoJ2J1bicpO1xuICB9IGVsc2UgaWYgKCFjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgdHlwZU5hbWVzLmFkZCgnbm9kZScpO1xuICB9XG4gIGlmIChcbiAgICBkZXBlbmRlbmNpZXMuamVzdCB8fFxuICAgIGRlcGVuZGVuY2llc1snQGplc3QvZ2xvYmFscyddIHx8XG4gICAgZGVwZW5kZW5jaWVzWydqZXN0LWVudmlyb25tZW50LWpzZG9tJ10gfHxcbiAgICBkZXBlbmRlbmNpZXNbJ3RzLWplc3QnXVxuICApIHtcbiAgICB0eXBlTmFtZXMuYWRkKCdqZXN0Jyk7XG4gIH1cbiAgaWYgKGRlcGVuZGVuY2llcy52aXRlc3QpIHtcbiAgICB0eXBlTmFtZXMuYWRkKCd2aXRlc3QvZ2xvYmFscycpO1xuICB9XG4gIGlmIChkZXBlbmRlbmNpZXMubW9jaGEpIHtcbiAgICB0eXBlTmFtZXMuYWRkKCdtb2NoYScpO1xuICB9XG4gIGlmIChkZXBlbmRlbmNpZXMuY3lwcmVzcykge1xuICAgIHR5cGVOYW1lcy5hZGQoJ2N5cHJlc3MnKTtcbiAgfVxuXG4gIHJldHVybiBbLi4udHlwZU5hbWVzXTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgc29ydEtleXMgfSBmcm9tICcuLi91dGlscy9vYmplY3RVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBleGNsdWRlRmlsZVBhdHRlcm5zID0gW1xuICAnKiovLmdpdC9vYmplY3RzLyoqJyxcbiAgJyoqLy5naXQvc3VidHJlZS1jYWNoZS8qKicsXG4gICcqKi9ub2RlX21vZHVsZXMvKionLFxuICAnKiovdG1wLyoqJyxcbiAgJyoqL3RlbXAvKionLFxuICAnKiovZGlzdC8qKicsXG5dO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVZzY29kZVNldHRpbmdzJywgYXN5bmMgKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy52c2NvZGUnLCAnc2V0dGluZ3MuanNvbicpO1xuICAgICAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBsZXQgc2V0dGluZ3MgPSBKU09OLnBhcnNlKGV4aXN0aW5nQ29udGVudCkgYXMgb2JqZWN0O1xuICAgICAgZm9yIChjb25zdCBleGNsdWRlRmlsZVBhdHRlcm4gb2YgZXhjbHVkZUZpbGVQYXR0ZXJucykge1xuICAgICAgICBzZXR0aW5ncyA9IG1lcmdlLmFsbChbc2V0dGluZ3MsIGV4Y2x1ZGVTZXR0aW5nKGV4Y2x1ZGVGaWxlUGF0dGVybildKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrIHx8IGNvbmZpZy5kb2VzQ29udGFpblV2TG9jaykge1xuICAgICAgICBzZXR0aW5ncyA9IG1lcmdlLmFsbChbc2V0dGluZ3MsIGV4Y2x1ZGVTZXR0aW5nKCcqKi8udmVudi8qKicpXSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgICAgIHNldHRpbmdzID0gbWVyZ2UuYWxsKFtzZXR0aW5ncywgZXhjbHVkZVNldHRpbmcoJyoqLy5uZXh0LyoqJyldKTtcbiAgICAgIH1cbiAgICAgIC8vIExMTeOBq+OCiOOCi3ZpYmUgY29kaW5n44Gn44Gv44CB6Ieq5YuV44OV44Kp44O844Oe44OD44OI44KE44Kz44O844OJ44Ki44Kv44K344On44Oz44KS54Sh5Yq55YyW44GZ44KL44GT44Go44GnXG4gICAgICAvLyDnlJ/miJDjgZXjgozjgZ/jgrPjg7zjg4njga7lhYPjga7lvaLlvI/jgpLntq3mjIHjgafjgY3jgotcbiAgICAgIGlmICgnZWRpdG9yLmNvZGVBY3Rpb25zT25TYXZlJyBpbiBzZXR0aW5ncykge1xuICAgICAgICBkZWxldGUgc2V0dGluZ3NbJ2VkaXRvci5jb2RlQWN0aW9uc09uU2F2ZSddO1xuICAgICAgfVxuICAgICAgaWYgKCdlZGl0b3IuZm9ybWF0T25TYXZlJyBpbiBzZXR0aW5ncykge1xuICAgICAgICBkZWxldGUgc2V0dGluZ3NbJ2VkaXRvci5mb3JtYXRPblNhdmUnXTtcbiAgICAgIH1cbiAgICAgIHNvcnRLZXlzKHNldHRpbmdzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShzZXR0aW5ncywgdW5kZWZpbmVkLCAyKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZXhjbHVkZVNldHRpbmcoZXhjbHVkZUZpbGVQYXR0ZXJuOiBzdHJpbmcpOiBvYmplY3Qge1xuICByZXR1cm4ge1xuICAgICdmaWxlcy53YXRjaGVyRXhjbHVkZSc6IHtcbiAgICAgIFtleGNsdWRlRmlsZVBhdHRlcm5dOiB0cnVlLFxuICAgIH0sXG4gIH07XG59XG4iLCIvLyBveGxpbnQtZGlzYWJsZSBlc2xpbnQtcGx1Z2luLWltcG9ydC9uby1uYW1lZC1hcy1kZWZhdWx0LW1lbWJlciAtLSBOYW1lc3BhY2UgWUFNTCBjYWxscyBtYWtlIGxvYWQvZHVtcCB1c2FnZSBjbGVhcmVyLlxuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBDb25maWd1cmF0aW9uVmFsdWVNYXAgfSBmcm9tICdAeWFybnBrZy9jb3JlJztcbmltcG9ydCB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuaW1wb3J0IHNlbXZlciBmcm9tICdzZW12ZXInO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHNwYXduU3luYywgc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0IH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcblxudHlwZSBTZXR0aW5ncyA9IHtcbiAgYXBwcm92ZWRHaXRSZXBvc2l0b3JpZXM/OiBzdHJpbmdbXTtcbiAgZGVmYXVsdFNlbXZlclJhbmdlUHJlZml4OiBzdHJpbmc7XG4gIGVuYWJsZVNjcmlwdHM/OiBib29sZWFuO1xuICBubU1vZGU6IHN0cmluZztcbiAgbm9kZUxpbmtlcjogc3RyaW5nO1xuICBucG1NaW5pbWFsQWdlR2F0ZT86IHN0cmluZztcbiAgbnBtUHJlYXBwcm92ZWRQYWNrYWdlcz86IHN0cmluZ1tdO1xuICBwbHVnaW5zPzogUGx1Z2luW107XG59ICYgUGFydGlhbDxDb25maWd1cmF0aW9uVmFsdWVNYXA+O1xuXG5pbnRlcmZhY2UgUGx1Z2luIHtcbiAgY2hlY2tzdW06IHN0cmluZztcbiAgcGF0aDogc3RyaW5nO1xuICBzcGVjOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVlhcm5yY1ltbChjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVlhcm5yY1ltbCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB5YXJucmNZbWxQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm5yYy55bWwnKTtcbiAgICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oeWFybnJjWW1sUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgICAgZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm4nKSwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgICApO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICAgIGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3lhcm4ubG9jaycpLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSlcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudFZlcnNpb24gPSBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoJ3lhcm4nLCBbJy0tdmVyc2lvbiddLCBjb25maWcuZGlyUGF0aCk7XG4gICAgY29uc3QgbGF0ZXN0VmVyc2lvbiA9IGdldExhdGVzdFZlcnNpb24oJ0B5YXJucGtnL2NsaScsIGNvbmZpZy5kaXJQYXRoKTtcbiAgICBpZiAoaXNOZXdlclZlcnNpb24obGF0ZXN0VmVyc2lvbiwgY3VycmVudFZlcnNpb24pKSB7XG4gICAgICBzcGF3blN5bmMoJ3lhcm4nLCBbJ3NldCcsICd2ZXJzaW9uJywgbGF0ZXN0VmVyc2lvbl0sIGNvbmZpZy5kaXJQYXRoLCAxKTtcbiAgICB9XG5cbiAgICBjb25zdCByZWxlYXNlc1BhdGggPSBwYXRoLmpvaW4oY29uZmlnLmRpclBhdGgsICcueWFybicsICdyZWxlYXNlcycpO1xuICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHJlbGVhc2VzUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgZm9yIChjb25zdCBmaWxlIG9mIGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIocmVsZWFzZXNQYXRoKSkge1xuICAgICAgaWYgKGZpbGUuc3RhcnRzV2l0aCgneWFybi0nKSAmJiAhZmlsZS5zdGFydHNXaXRoKGB5YXJuLSR7bGF0ZXN0VmVyc2lvbn0uYCkpIHtcbiAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGguam9pbihyZWxlYXNlc1BhdGgsIGZpbGUpKSk7XG4gICAgICAgIGNvbnNvbGUubG9nKCdSZW1vdmVkJywgcGF0aC5qb2luKHJlbGVhc2VzUGF0aCwgZmlsZSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHlhcm5yY1BhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcueWFybnJjJyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHlhcm5yY1BhdGgsIHsgZm9yY2U6IHRydWUgfSkpO1xuXG4gICAgbGV0IHNldHRpbmdzID0ge30gYXMgU2V0dGluZ3M7XG4gICAgdHJ5IHtcbiAgICAgIHNldHRpbmdzID0gKHlhbWwubG9hZChhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZSh5YXJucmNZbWxQYXRoLCAndXRmOCcpKSBhcyBTZXR0aW5ncyB8IHVuZGVmaW5lZCkgPz8gc2V0dGluZ3M7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICAgIHNldHRpbmdzLmRlZmF1bHRTZW12ZXJSYW5nZVByZWZpeCA9ICcnO1xuICAgIC8vIEluc3RhbGwtdGltZSBzY3JpcHRzIGFyZSBhIGNvbW1vbiBzdXBwbHktY2hhaW4gZXhlY3V0aW9uIHBhdGguIEtlZXAgdGhpc1xuICAgIC8vIGV4cGxpY2l0IHNvIHN0YWxlIHByb2plY3Qgc2V0dGluZ3MgY2Fubm90IHJlLWVuYWJsZSB0aGVtIGdsb2JhbGx5LlxuICAgIHNldHRpbmdzLmVuYWJsZVNjcmlwdHMgPSBmYWxzZTtcbiAgICBzZXR0aW5ncy5ub2RlTGlua2VyID0gJ25vZGUtbW9kdWxlcyc7XG4gICAgc2V0dGluZ3Mubm1Nb2RlID0gJ2hhcmRsaW5rcy1nbG9iYWwnO1xuICAgIHNldHRpbmdzLm5wbU1pbmltYWxBZ2VHYXRlID0gJzVkJztcbiAgICBzZXR0aW5ncy5hcHByb3ZlZEdpdFJlcG9zaXRvcmllcyA9IFtcbiAgICAgIC8vIFlhcm4gNC4xNCBibG9ja3MgZ2l0IGRlcGVuZGVuY2llcyB1bmxlc3MgdGhlIHJlcG9zaXRvcnkgVVJMIGlzIGV4cGxpY2l0bHkgYWxsb3dlZC5cbiAgICAgICdodHRwczovL2dpdGh1Yi5jb20vV2lsbEJvb3N0ZXIvKi5naXQnLFxuICAgICAgJ3NzaDovL2dpdEBnaXRodWIuY29tL1dpbGxCb29zdGVyLyouZ2l0JyxcbiAgICAgICdodHRwczovL2dpdGh1Yi5jb20vV2lsbEJvb3N0ZXJMYWIvKi5naXQnLFxuICAgICAgJ3NzaDovL2dpdEBnaXRodWIuY29tL1dpbGxCb29zdGVyTGFiLyouZ2l0JyxcbiAgICBdO1xuICAgIHNldHRpbmdzLm5wbVByZWFwcHJvdmVkUGFja2FnZXMgPSBbXG4gICAgICAvLyAtLS0tLS0tLS0tIFNUQVJUOiBXZSBiZWxpZXZlIG91ciBwYWNrYWdlcyBhcmUgc2FmZSAtLS0tLS0tLS0tXG4gICAgICAnQGV4ZXJjb2RlLyonLFxuICAgICAgJ0B3aWxsYm9vc3Rlci8qJyxcbiAgICAgICdhZ2VudC1ydW50aW1lLWtpdCcsXG4gICAgICAnYXQtZGVjb3JhdG9ycycsXG4gICAgICAnYnVpbGQtdHMnLFxuICAgICAgJ2dlbi1pMThuLXRzJyxcbiAgICAgICdvbmUtd2F5LWdpdC1zeW5jJyxcbiAgICAgIC8vIC0tLS0tLS0tLS0gRU5EOiBXZSBiZWxpZXZlIG91ciBwYWNrYWdlcyBhcmUgc2FmZSAtLS0tLS0tLS0tXG5cbiAgICAgIC8vIFRvIGRlYWwgd2l0aCBDVkUgbGlrZSBodHRwczovL25leHRqcy5vcmcvYmxvZy9DVkUtMjAyNS02NjQ3OFxuICAgICAgJ25leHQnLFxuICAgICAgJ0BuZXh0LyonLFxuICAgICAgJ0B0eXBlcy8qJyxcbiAgICAgICdAdHlwZXNjcmlwdC8qJyxcbiAgICAgICdAb3hmbXQvKicsXG4gICAgICAnQG94bGludC8qJyxcbiAgICAgICdAb3hsaW50LXRzZ29saW50LyonLFxuICAgICAgJ294Zm10JyxcbiAgICAgICdveGxpbnQnLFxuICAgICAgJ294bGludC10c2dvbGludCcsXG4gICAgICAncmVhY3QnLFxuICAgICAgJ3JlYWN0LWRvbScsXG4gICAgXTtcbiAgICBkZWxldGUgc2V0dGluZ3MuY29tcHJlc3Npb25MZXZlbDtcbiAgICBpZiAoc2V0dGluZ3MuaW5qZWN0RW52aXJvbm1lbnRGaWxlcz8ubGVuZ3RoID09PSAwKSB7XG4gICAgICBkZWxldGUgc2V0dGluZ3MuaW5qZWN0RW52aXJvbm1lbnRGaWxlcztcbiAgICB9XG4gICAgLy8gY2YuIGh0dHBzOi8vZ2l0aHViLmNvbS95YXJucGtnL2JlcnJ5L3B1bGwvNDY5OFxuICAgIHNldHRpbmdzLmVuYWJsZUdsb2JhbENhY2hlID0gdHJ1ZTtcbiAgICBjb25zdCBvcmlnaW5hbExlbmd0aCA9IHNldHRpbmdzLnBsdWdpbnM/Lmxlbmd0aCA/PyAwO1xuICAgIHNldHRpbmdzLnBsdWdpbnMgPSBzZXR0aW5ncy5wbHVnaW5zPy5maWx0ZXIoKHApID0+IHAucGF0aCAhPT0gJy55YXJuL3BsdWdpbnMvdW5kZWZpbmVkLmNqcycpID8/IFtdO1xuICAgIGlmIChzZXR0aW5ncy5wbHVnaW5zLmxlbmd0aCAhPT0gb3JpZ2luYWxMZW5ndGgpIHtcbiAgICAgIGNvbnN0IHBsdWdpblBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcueWFybicsICdwbHVnaW5zJywgJ3VuZGVmaW5lZC5janMnKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwbHVnaW5QYXRoLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICB9XG4gICAgaWYgKHNldHRpbmdzLnBsdWdpbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICBkZWxldGUgc2V0dGluZ3MucGx1Z2lucztcbiAgICB9XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHlhcm5yY1ltbFBhdGgsIHlhbWwuZHVtcChzZXR0aW5ncywgeyBsaW5lV2lkdGg6IC0xIH0pKTtcblxuICAgIHNwYXduU3luYygneWFybicsIFsnZGx4JywgJ3lhcm4tcGx1Z2luLWF1dG8taW5zdGFsbCddLCBjb25maWcuZGlyUGF0aCk7XG4gICAgLy8gVGhlIHRhcmdldCByZXBvIG1heSBub3QgaGF2ZSBwcmV0dGllciBpbnN0YWxsZWQgeWV0LCBhbmQgeWFybi1wbHVnaW4tYXV0by1pbnN0YWxsIGVkaXRzIHRoaXMgZmlsZSBhZnRlciBqcy15YW1sLlxuICAgIHNwYXduU3luYygneWFybicsIGdldFlhcm5yY1ByZXR0aWVyQXJncyhjb25maWcuZGlyUGF0aCwgeWFybnJjWW1sUGF0aCksIGNvbmZpZy5kaXJQYXRoKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRZYXJucmNQcmV0dGllckFyZ3MoZGlyUGF0aDogc3RyaW5nLCB5YXJucmNZbWxQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBbJ2RseCcsICdwcmV0dGllcicsICctLW5vLWNvbmZpZycsICctLXdyaXRlJywgcGF0aC5yZWxhdGl2ZShkaXJQYXRoLCB5YXJucmNZbWxQYXRoKV07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMYXRlc3RWZXJzaW9uKHBhY2thZ2VOYW1lOiBzdHJpbmcsIGRpclBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoJ25wbScsIFsnc2hvdycsIHBhY2thZ2VOYW1lLCAndmVyc2lvbiddLCBkaXJQYXRoKSB8fCAnMC4wLjAnO1xufVxuXG5mdW5jdGlvbiBpc05ld2VyVmVyc2lvbihuZXdWZXJzaW9uOiBzdHJpbmcsIG9sZFZlcnNpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCB2YWxpZE5ld1ZlcnNpb24gPSBzZW12ZXIudmFsaWQobmV3VmVyc2lvbik7XG4gIGlmICghdmFsaWROZXdWZXJzaW9uKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIHNlbXZlci5ndCh2YWxpZE5ld1ZlcnNpb24sIHNlbXZlci52YWxpZChvbGRWZXJzaW9uKSA/PyAnMC4wLjAnKTtcbn1cbiIsImltcG9ydCB0eXBlIHsgT2N0b2tpdCB9IGZyb20gJ0BvY3Rva2l0L2NvcmUnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZXRPY3Rva2l0LCBnaXRIdWJVdGlsLCBoYXNHaXRIdWJUb2tlbiB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0dXBMYWJlbHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignc2V0dXBMYWJlbHMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgW293bmVyLCByZXBvXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShjb25maWcucmVwb3NpdG9yeSA/PyAnJyk7XG4gICAgaWYgKCFvd25lciB8fCAhcmVwbykgcmV0dXJuO1xuICAgIGlmIChvd25lciAhPT0gJ1dpbGxCb29zdGVyJyAmJiBvd25lciAhPT0gJ1dpbGxCb29zdGVyTGFiJykgcmV0dXJuO1xuICAgIGlmICghaGFzR2l0SHViVG9rZW4ob3duZXIpKSByZXR1cm47XG5cbiAgICBjb25zdCBvY3Rva2l0ID0gZ2V0T2N0b2tpdChvd25lcik7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2QxOiB4LWVhc3kgOmhlZGdlaG9nOicsICdFREU5RkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkMjogZWFzeSA6cmFiYml0MjonLCAnRERENkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDM6IG1lZGl1bSA6b3g6JywgJ0M0QjVGRCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2Q0OiBoYXJkIDpzcXVpZDonLCAnQTc4QkZBJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDU6IHgtaGFyZCA6d2hhbGUyOicsICc4QjVDRjYnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdwMTogY3JpdGljYWwgOmZpcmU6OmZpcmU6OmZpcmU6JywgJ0VGNDQ0NCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3AyOiB1cmdlbnQgOmZpcmU6OmZpcmU6JywgJ0Y4NzE3MScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3AzOiBpbXBvcnRhbnQgOmZpcmU6JywgJ0ZDQTVBNScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3A0OiBuaWNlIHRvIGhhdmUgOmRyb3BsZXQ6JywgJ0ZFQ0FDQScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IGJsaXR6JywgJzUzMDBiYycpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IGZpcmViYXNlJywgJ2ZmY2EyOCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IHByaXNtYScsICcwYzM0NGInKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiByZWFjdCcsICc2MWRhZmInKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiBzdmVsdGUnLCAnZmYzZTAwJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogc2VtYW50aWMtcmVsZWFzZScsICc0OTQ5NDknKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyZWFkeSA6cm9ja2V0OicsICcyMkM1NUUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyZXZpZXcgcmVxdWVzdGVkIDptYWc6JywgJ0ZCQ0EwNCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JlbGVhc2VkIDpib29rbWFyazonLCAnNjM2NkYxJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogMC41aCA6Y2xvY2sxMjMwOicsICdGM0Y0RjYnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiAxaCA6Y2xvY2sxOicsICdFNUU3RUInKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiAyaCA6Y2xvY2syOicsICdEMUQ1REInKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiAzaCA6Y2xvY2szOicsICc5Q0EzQUYnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiA1aCA6Y2xvY2s1OicsICc2QjcyODAnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiA4aCA6Y2xvY2s4OicsICc0QjU1NjMnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiAxM2ggOmNsb2NrMTonLCAnMzc0MTUxJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogYnVpbGQgOmhhbW1lcjonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogY2hvcmUgOmJyb29tOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBjaSA6Y29uc3RydWN0aW9uX3dvcmtlcjonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogZG9jcyA6bWVtbzonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogZmVhdCA6c3BhcmtsZXM6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGZpeCA6YnVnOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBwZXJmIDp6YXA6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IHJlZmFjdG9yIDpyZWN5Y2xlOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBzdHlsZSA6bGlwc3RpY2s6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IHRlc3QgOnRlc3RfdHViZTonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncHJvamVjdCcsICcyNDI5MkYnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdmb2N1c2VkIDpkYXJ0OicsICcyMkM1NUUnKTtcblxuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdidWcnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZG9jdW1lbnRhdGlvbicpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkdXBsaWNhdGUnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZW5oYW5jZW1lbnQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZ29vZCBmaXJzdCBpc3N1ZScpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdoZWxwIHdhbnRlZCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdpbnZhbGlkJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3F1ZXN0aW9uJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3dvbnRmaXgnKTtcblxuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyZWFkeScpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyZXZpZXcgcmVxdWVzdGVkJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JlbGVhc2VkJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3NlbWFudGljLXJlbGVhc2UnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnbGxtLXByIDpyb2JvdDonKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnYWktcHIgOnJvYm90OicpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdnZW4tcHItYWxsIDpyb2JvdDonKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZ2VuLXByLWNsYXVkZSA6cm9ib3Q6Jyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2dlbi1wci1jb2RleCA6cm9ib3Q6Jyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2dlbi1wci1nZW1pbmkgOnJvYm90OicpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1NraXAgc2V0dXBMYWJlbHMgZHVlIHRvOicsIChlcnJvciBhcyBFcnJvciB8IHVuZGVmaW5lZCk/LnN0YWNrID8/IGVycm9yKTtcbiAgICB9XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzZXR1cExhYmVsKG9jdG9raXQ6IE9jdG9raXQsIG93bmVyOiBzdHJpbmcsIHJlcG86IHN0cmluZywgbmFtZTogc3RyaW5nLCBjb2xvcjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgLy8gSXNzdWVzIHBlcm1pc3Npb25cbiAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ1BPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVscycsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIG5hbWUsXG4gICAgICBjb2xvcixcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gSXNzdWVzIHBlcm1pc3Npb25cbiAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ1BBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHMve25hbWV9Jywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgbmFtZSxcbiAgICAgIGNvbG9yLFxuICAgIH0pO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUxhYmVsKG9jdG9raXQ6IE9jdG9raXQsIG93bmVyOiBzdHJpbmcsIHJlcG86IHN0cmluZywgbmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgLy8gSXNzdWVzIHBlcm1pc3Npb25cbiAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ0RFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vbGFiZWxzL3tuYW1lfScsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIG5hbWUsXG4gICAgfSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuIiwiaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gJ25vZGU6bW9kdWxlJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBkb3RlbnYgZnJvbSAnZG90ZW52JztcbmltcG9ydCB0eXBlIHNvZGl1bU1vZHVsZSBmcm9tICdsaWJzb2RpdW0td3JhcHBlcnMnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4uL29wdGlvbnMuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZXRPY3Rva2l0LCBnaXRIdWJVdGlsLCBoYXNHaXRIdWJUb2tlbiB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuXG5jb25zdCBERVBSRUNBVEVEX1NFQ1JFVF9OQU1FUyA9IFsnUkVBRFlfRElTQ09SRF9XRUJIT09LX1VSTCcsICdHSF9CT1RfUEFUJywgJ1BVQkxJQ19HSF9CT1RfUEFUJ107XG5jb25zdCByZXF1aXJlID0gY3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0dXBTZWNyZXRzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ3NldHVwU2VjcmV0cycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBbb3duZXIsIHJlcG9dID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGNvbmZpZy5yZXBvc2l0b3J5ID8/ICcnKTtcbiAgICBpZiAoIW93bmVyIHx8ICFyZXBvIHx8IG93bmVyICE9PSAnV2lsbEJvb3N0ZXJMYWInKSByZXR1cm47XG4gICAgaWYgKCFoYXNHaXRIdWJUb2tlbihvd25lcikgfHwgIW9wdGlvbnMuZG9lc1VwbG9hZEVudlZhcnMpIHJldHVybjtcblxuICAgIGNvbnN0IHBhcnNlZCA9IGRvdGVudi5jb25maWcoeyBwYXRoOiBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZW52JyksIHF1aWV0OiB0cnVlIH0pLnBhcnNlZCA/PyB7fTtcbiAgICBpZiAoT2JqZWN0LmtleXMocGFyc2VkKS5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIGNvbnN0IG9jdG9raXQgPSBnZXRPY3Rva2l0KG93bmVyKTtcblxuICAgIHRyeSB7XG4gICAgICBmb3IgKGNvbnN0IHNlY3JldE5hbWUgb2YgREVQUkVDQVRFRF9TRUNSRVRfTkFNRVMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBSZXF1aXJlcyBTZWNyZXRzIHBlcm1pc3Npb25cbiAgICAgICAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ0RFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9zZWNyZXRzL3tzZWNyZXRfbmFtZX0nLCB7XG4gICAgICAgICAgICBvd25lcixcbiAgICAgICAgICAgIHJlcG8sXG4gICAgICAgICAgICBzZWNyZXRfbmFtZTogc2VjcmV0TmFtZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gZG8gbm90aGluZ1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFJlcXVpcmVzIFNlY3JldHMgcGVybWlzc2lvblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ0dFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9zZWNyZXRzL3B1YmxpYy1rZXknLCB7XG4gICAgICAgIG93bmVyLFxuICAgICAgICByZXBvLFxuICAgICAgfSk7XG4gICAgICBjb25zdCB7IGtleSwga2V5X2lkOiBrZXlJZCB9ID0gcmVzcG9uc2UuZGF0YTtcblxuICAgICAgY29uc3Qgc29kaXVtID0gZ2V0U29kaXVtKCk7XG4gICAgICBhd2FpdCBzb2RpdW0ucmVhZHk7XG5cbiAgICAgIGZvciAoY29uc3QgW25hbWUsIHNlY3JldF0gb2YgT2JqZWN0LmVudHJpZXMocGFyc2VkKSkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgbmFtZSA9PT0gJ0dIX0JPVF9QQVQnIHx8XG4gICAgICAgICAgbmFtZSA9PT0gJ0dIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSJyB8fFxuICAgICAgICAgIG5hbWUgPT09ICdHSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUkxBQidcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb252ZXJ0IFNlY3JldCAmIEJhc2U2NCBrZXkgdG8gVWludDhBcnJheS5cbiAgICAgICAgY29uc3QgcmF3S2V5ID0gc29kaXVtLmZyb21fYmFzZTY0KGtleSwgc29kaXVtLmJhc2U2NF92YXJpYW50cy5PUklHSU5BTCk7XG4gICAgICAgIGNvbnN0IHJhd1NlYyA9IHNvZGl1bS5mcm9tX3N0cmluZyhzZWNyZXQpO1xuXG4gICAgICAgIC8vIEVuY3J5cHQgdGhlIHNlY3JldCB1c2luZyBMaWJTb2RpdW1cbiAgICAgICAgY29uc3QgZW5jQnl0ZXMgPSBzb2RpdW0uY3J5cHRvX2JveF9zZWFsKHJhd1NlYywgcmF3S2V5KTtcblxuICAgICAgICAvLyBDb252ZXJ0IGVuY3J5cHRlZCBVaW50OEFycmF5IHRvIEJhc2U2NFxuICAgICAgICBjb25zdCBlbmNCYXNlNjQgPSBzb2RpdW0udG9fYmFzZTY0KGVuY0J5dGVzLCBzb2RpdW0uYmFzZTY0X3ZhcmlhbnRzLk9SSUdJTkFMKTtcblxuICAgICAgICAvLyBSZXF1aXJlcyBTZWNyZXRzIHBlcm1pc3Npb25cbiAgICAgICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvc2VjcmV0cy97c2VjcmV0X25hbWV9Jywge1xuICAgICAgICAgIG93bmVyLFxuICAgICAgICAgIHJlcG8sXG4gICAgICAgICAgc2VjcmV0X25hbWU6IG5hbWUsXG4gICAgICAgICAgZW5jcnlwdGVkX3ZhbHVlOiBlbmNCYXNlNjQsXG4gICAgICAgICAga2V5X2lkOiBrZXlJZCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybignU2tpcCBzZXR1cFNlY3JldHMgZHVlIHRvOicsIChlcnJvciBhcyBFcnJvciB8IHVuZGVmaW5lZCk/LnN0YWNrID8/IGVycm9yKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRTb2RpdW0oKTogdHlwZW9mIHNvZGl1bU1vZHVsZSB7XG4gIC8vIGxpYnNvZGl1bS13cmFwcGVycycgRVNNIGVudHJ5IGNhbiBiaW5kIHRvIGxpYnNvZGl1bUAwLjguMywgd2hvc2UgZGVmYXVsdFxuICAvLyBleHBvcnQgbm8gbG9uZ2VyIGV4cG9zZXMgcmVhZHkuIFRoZSBDb21tb25KUyBlbnRyeSBrZWVwcyB0aGUgQVBJIHNoYXBlLlxuICByZXR1cm4gcmVxdWlyZSgnbGlic29kaXVtLXdyYXBwZXJzJykgYXMgdHlwZW9mIHNvZGl1bU1vZHVsZTtcbn1cbiIsImltcG9ydCB7IHdpdGhSZXRyeSB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliL3NyYyc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdldE9jdG9raXQsIGdpdEh1YlV0aWwsIGhhc0dpdEh1YlRva2VuIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cEdpdEh1YlNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ3NldHVwR2l0SHViU2V0dGluZ3MnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgW293bmVyLCByZXBvXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShjb25maWcucmVwb3NpdG9yeSA/PyAnJyk7XG4gICAgaWYgKCFvd25lciB8fCAhcmVwbykgcmV0dXJuO1xuICAgIGlmIChvd25lciAhPT0gJ1dpbGxCb29zdGVyJyAmJiBvd25lciAhPT0gJ1dpbGxCb29zdGVyTGFiJykgcmV0dXJuO1xuICAgIGlmICghaGFzR2l0SHViVG9rZW4ob3duZXIpKSByZXR1cm47XG5cbiAgICBjb25zdCBvY3Rva2l0ID0gZ2V0T2N0b2tpdChvd25lcik7XG5cbiAgICB0cnkge1xuICAgICAgLy8gUmVwb3NpdG9yeSBzZXR0aW5ncyBuZWVkIGFkbWluaXN0cmF0aW9uIHBlcm1pc3Npb24sIHVubGlrZSBmaWxlIGdlbmVyYXRpb24uXG4gICAgICBhd2FpdCB3aXRoUmV0cnkoXG4gICAgICAgICgpID0+XG4gICAgICAgICAgb2N0b2tpdC5yZXF1ZXN0KCdQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30nLCB7XG4gICAgICAgICAgICBvd25lcixcbiAgICAgICAgICAgIHJlcG8sXG4gICAgICAgICAgICBhbGxvd19hdXRvX21lcmdlOiB0cnVlLFxuICAgICAgICAgICAgYWxsb3dfbWVyZ2VfY29tbWl0OiBmYWxzZSxcbiAgICAgICAgICAgIGFsbG93X3NxdWFzaF9tZXJnZTogdHJ1ZSxcbiAgICAgICAgICAgIGFsbG93X3JlYmFzZV9tZXJnZTogZmFsc2UsXG4gICAgICAgICAgICBhbGxvd191cGRhdGVfYnJhbmNoOiB0cnVlLFxuICAgICAgICAgICAgZGVsZXRlX2JyYW5jaF9vbl9tZXJnZTogdHJ1ZSxcbiAgICAgICAgICAgIHNxdWFzaF9tZXJnZV9jb21taXRfdGl0bGU6ICdQUl9USVRMRScsXG4gICAgICAgICAgICBzcXVhc2hfbWVyZ2VfY29tbWl0X21lc3NhZ2U6ICdCTEFOSycsXG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICdYLUdpdEh1Yi1BcGktVmVyc2lvbic6ICcyMDIyLTExLTI4JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAuLi4oY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3Rlci8nKSA/IHsgYWxsb3dfYXV0b19tZXJnZTogdHJ1ZSB9IDoge30pLFxuICAgICAgICAgIH0pLFxuICAgICAgICB7XG4gICAgICAgICAgc2hvdWxkUmV0cnk6IChlcnJvcikgPT4gIWlzR2l0SHViUGVybWlzc2lvbk9yVmlzaWJpbGl0eUVycm9yKGVycm9yKSxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKCFpc0dpdEh1YlBlcm1pc3Npb25PclZpc2liaWxpdHlFcnJvcihlcnJvcikpIHRocm93IGVycm9yO1xuXG4gICAgICAvLyBMb2NhbCB3YmZ5IHJ1bnMgb2Z0ZW4gaGF2ZSBwdXNoIHBlcm1pc3Npb24gd2l0aG91dCBhZG1pbiBwZXJtaXNzaW9uLlxuICAgICAgY29uc29sZS53YXJuKCdTa2lwIHNldHVwR2l0SHViU2V0dGluZ3MgZHVlIHRvOicsIChlcnJvciBhcyBFcnJvciB8IHVuZGVmaW5lZCk/LnN0YWNrID8/IGVycm9yKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBpc0dpdEh1YlBlcm1pc3Npb25PclZpc2liaWxpdHlFcnJvcihlcnJvcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAoIWVycm9yIHx8IHR5cGVvZiBlcnJvciAhPT0gJ29iamVjdCcgfHwgISgnc3RhdHVzJyBpbiBlcnJvcikpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIGVycm9yLnN0YXR1cyA9PT0gNDAxIHx8IGVycm9yLnN0YXR1cyA9PT0gNDAzIHx8IGVycm9yLnN0YXR1cyA9PT0gNDA0O1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgZGlzdGFuY2UgfSBmcm9tICdmYXN0ZXN0LWxldmVuc2h0ZWluJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBwYWNrYWdlTWFuYWdlclJ1blBsYWNlaG9sZGVyID0gJ19fUE1fUlVOX18nO1xuXG5jb25zdCB0ZW1wbGF0ZXMgPSB7XG4gICdwdWxsX3JlcXVlc3RfdGVtcGxhdGUubWQnOiBgXG5DbG9zZSAjPElzc3VlTnVtYmVyPlxuXG4jIyBTZWxmIENoZWNrXG5cbi0gWyBdIEkndmUgY29uZmlybWVkIFxcYEFsbCBjaGVja3MgaGF2ZSBwYXNzZWRcXGAgb24gdGhpcyBwYWdlLlxuICAtIFBSIHRpdGxlIGZvbGxvd3MgW0FuZ3VsYXIncyBjb21taXQgbWVzc2FnZSBmb3JtYXRdKGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvYmxvYi9tYWluL0NPTlRSSUJVVElORy5tZCMtY29tbWl0LW1lc3NhZ2UtZm9ybWF0KS5cbiAgLSBQUiB0aXRsZSBkb2Vzbid0IGhhdmUgXFxgV0lQOlxcYC5cbiAgLSBUaGUgdGVzdCBjb21tYW5kIChlLmcuLCBcXGAke3BhY2thZ2VNYW5hZ2VyUnVuUGxhY2Vob2xkZXJ9IHRlc3RcXGApIHBhc3NlZC5cbiAgLSBUaGUgbGludCBjb21tYW5kIChlLmcuLCBcXGAke3BhY2thZ2VNYW5hZ2VyUnVuUGxhY2Vob2xkZXJ9IGxpbnRcXGApIHBhc3NlZC5cbiAgLSBZb3UgbWF5IGxlYXZlIHRoaXMgYm94IHVuY2hlY2tlZCBkdWUgdG8gbG9uZyB3b3JrZmxvd3MuXG4tIFsgXSBJJ3ZlIHJldmlld2VkIG15IGNoYW5nZXMgb24gdGhlIEdpdEh1YiBkaWZmIHZpZXcuXG4tIFsgXSBJJ3ZlIHdyaXR0ZW4gdGhlIHN0ZXBzIHRvIHRlc3QgbXkgY2hhbmdlcy5cbi0gWyBdIEkndmUgYWRkZWQgc2NyZWVuc2hvdHMgKGlmIHRoZSBVSSBjaGFuZ2VkKS5cbiAgLSBZb3UgbWF5IGxlYXZlIHRoaXMgYm94IHVuY2hlY2tlZCBpZiB5b3UgZGlkbid0IG1vZGlmeSB0aGUgVUkuXG5cbjwhLS0gUGxlYXNlIGFkZCBzY3JlZW5zaG90cyBpZiB5b3UgbW9kaWZ5IHRoZSBVSS5cbnwgQ3VycmVudCAgICAgICAgICAgICAgICAgIHwgSW4gY29taW5nICAgICAgICAgICAgICAgIHxcbnwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHxcbnwgPGltZyBzcmM9XCJcIiB3aWR0aD1cIjQwMFwiPiB8IDxpbWcgc3JjPVwiXCIgd2lkdGg9XCI0MDBcIj4gfFxuLS0+XG5cbjwhLS0gUGxlYXNlIGFkZCBzdGVwcyB0byB0ZXN0IHlvdXIgY2hhbmdlcy5cbiMjIFN0ZXBzIHRvIFRlc3RcblxuMS4gT3BlbiBodHRwOi8vbG9jYWxob3N0LWV4ZXJjb2RlLndpbGxib29zdGVyLm5ldDozMDAwL2phLUpQL2NvdXJzZXMvX2V4YW1wbGUvbGVzc29ucy9fZXhhbXBsZV9hX3BsdXNfYi9wcm9ibGVtcy9fZXhhbXBsZV9hX3BsdXNfYiBhZnRlciBsb2dpbi5cbjIuIFNlbGVjdCB0aGUgbGFuZ3VhZ2UgXFxgQ1xcYC5cbjMuIFdyaXRlIHRoZSBmb2xsb3dpbmcgY29kZTpcbiAgIFxcYFxcYFxcYGNcbiAgICNpbmNsdWRlIDxzdGRpby5oPlxuXG4gICBpbnQgbWFpbih2b2lkKSB7XG4gICAgIGludCBhLCBiO1xuXG4gICAgIHNjYW5mKFwiJWQgJWRcIiwgJmEsICZiKTtcbiAgICAgcHJpbnRmKFwiJWRcIiwgYSArIGIpO1xuICAgICByZXR1cm4gMDtcbiAgIH1cbiAgIFxcYFxcYFxcYFxuNC4gUHVzaCBcXGBTdWJtaXRcXGAgYnV0dG9uLlxuNS4gLi4uXG4tLT5cbmAudHJpbSgpLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlR2l0SHViVGVtcGxhdGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlR2l0SHViVGVtcGxhdGVzJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghY29uZmlnLmlzV2lsbEJvb3N0ZXJSZXBvKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbZmlsZU5hbWUsIG5ld0NvbnRlbnRdIG9mIE9iamVjdC5lbnRyaWVzKHRlbXBsYXRlcykpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhcHBseVBhY2thZ2VNYW5hZ2VyVGVtcGxhdGUobmV3Q29udGVudCwgY29uZmlnKTtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicsIGZpbGVOYW1lKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSkge1xuICAgICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICAgIGlmIChkaXN0YW5jZShvbGRDb250ZW50LCBjb250ZW50KSA+IGNvbnRlbnQubGVuZ3RoIC8gMikge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRodWInKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgY29udGVudCkpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGFwcGx5UGFja2FnZU1hbmFnZXJUZW1wbGF0ZSh0ZW1wbGF0ZTogc3RyaW5nLCBjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBjb25zdCBwYWNrYWdlTWFuYWdlckNvbW1hbmQgPSBjb25maWcuaXNCdW4gPyAnYnVuIHJ1bicgOiAneWFybic7XG4gIHJldHVybiB0ZW1wbGF0ZS5yZXBsYWNlQWxsKHBhY2thZ2VNYW5hZ2VyUnVuUGxhY2Vob2xkZXIsIHBhY2thZ2VNYW5hZ2VyQ29tbWFuZCk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgZnNwIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYic7XG5pbXBvcnQgeyBzaW1wbGVHaXQgfSBmcm9tICdzaW1wbGUtZ2l0JztcbmltcG9ydCB0b21sIGZyb20gJ3Ntb2wtdG9tbCc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcbmltcG9ydCB7IHogfSBmcm9tICd6b2QnO1xuXG5pbXBvcnQgeyBnZXRPY3Rva2l0LCBnaXRIdWJVdGlsIH0gZnJvbSAnLi91dGlscy9naXRodWJVdGlsLmpzJztcbmltcG9ydCB7IGdsb2JJZ25vcmUgfSBmcm9tICcuL3V0aWxzL2dsb2JVdGlsLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBQYWNrYWdlQ29uZmlnIHtcbiAgZGlyUGF0aDogc3RyaW5nO1xuICBkb2NrZXJmaWxlOiBzdHJpbmc7XG4gIGlzUm9vdDogYm9vbGVhbjtcbiAgaXNQdWJsaWNSZXBvOiBib29sZWFuO1xuICBpc1JlZmVycmVkQnlPdGhlclJlcG86IGJvb2xlYW47XG4gIHJlcG9zaXRvcnk/OiBzdHJpbmc7XG4gIHJlcG9BdXRob3I/OiBzdHJpbmc7XG4gIHJlcG9OYW1lPzogc3RyaW5nO1xuICBpc1dpbGxCb29zdGVyUmVwbzogYm9vbGVhbjtcbiAgaXNCdW46IGJvb2xlYW47XG4gIGlzRXNtUGFja2FnZTogYm9vbGVhbjtcbiAgaXNXaWxsQm9vc3RlckNvbmZpZ3M6IGJvb2xlYW47XG4gIC8vIGRlcGVuZGVuY3kgaW5mb3JtYXRpb25cbiAgZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluRG9ja2VyZmlsZTogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5HZW1maWxlOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkdvTW9kOiBib29sZWFuO1xuICBkb2VzQ29udGFpblBhY2thZ2VKc29uOiBib29sZWFuO1xuICBkb2VzQ29udGFpblBvZXRyeUxvY2s6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVXZMb2NrOiBib29sZWFuO1xuICBkb2VzQ29udGFpblBvbVhtbDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5QdWJzcGVjWWFtbDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5UZW1wbGF0ZVlhbWw6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVnNjb2RlU2V0dGluZ3NKc29uOiBib29sZWFuO1xuICAvLyBzb3VyY2UgY29kZSBmaWxlc1xuICBkb2VzQ29udGFpbkphdmFTY3JpcHQ6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVHlwZVNjcmlwdDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Kc3hPclRzeDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5KYXZhOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkphdmFTY3JpcHRJblBhY2thZ2VzOiBib29sZWFuO1xuICBkb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkpzeE9yVHN4SW5QYWNrYWdlczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5KYXZhSW5QYWNrYWdlczogYm9vbGVhbjtcblxuICBkZXBlbmRpbmc6IHtcbiAgICBibGl0ejogYm9vbGVhbjtcbiAgICBmaXJlYmFzZTogYm9vbGVhbjtcbiAgICBnZW5JMThuVHM6IGJvb2xlYW47XG4gICAgbGl0ZXN0cmVhbTogYm9vbGVhbjtcbiAgICBuZXh0OiBib29sZWFuO1xuICAgIHBsYXl3cmlnaHRUZXN0OiBib29sZWFuO1xuICAgIHByaXNtYTogYm9vbGVhbjtcbiAgICBweXJpZ2h0OiBib29sZWFuO1xuICAgIHJlYWN0OiBib29sZWFuO1xuICAgIHJlYWN0TmF0aXZlOiBib29sZWFuO1xuICAgIHNlbWFudGljUmVsZWFzZTogYm9vbGVhbjtcbiAgICBzdG9yeWJvb2s6IGJvb2xlYW47XG4gICAgd2I6IGJvb2xlYW47XG4gIH07XG4gIHJlbGVhc2U6IHtcbiAgICBicmFuY2hlczogc3RyaW5nW107XG4gICAgZ2l0aHViOiBib29sZWFuO1xuICAgIG5wbTogYm9vbGVhbjtcbiAgfTtcbiAgaGFzVmVyc2lvblNldHRpbmdzOiBib29sZWFuO1xuICBtaXNlVGFza3M6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIHBhY2thZ2VKc29uPzogUGFja2FnZUpzb247XG4gIHdiZnlKc29uPzogV2JmeUpzb247XG59XG5cbnR5cGUgV2JmeUpzb24gPSB6LmluZmVyPHR5cGVvZiB3YmZ5SnNvblNjaGVtYT47XG5cbmNvbnN0IHdiZnlKc29uU2NoZW1hID0gei5vYmplY3Qoe1xuICB0eXBvczogelxuICAgIC5vYmplY3Qoe1xuICAgICAgYWxsOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgICAgZG9jOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgICAgdHM6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgICB0ZXh0OiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgIH0pXG4gICAgLm9wdGlvbmFsKCksXG59KTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFBhY2thZ2VDb25maWcoXG4gIGRpclBhdGg6IHN0cmluZyxcbiAgcm9vdENvbmZpZz86IFBhY2thZ2VDb25maWdcbik6IFByb21pc2U8UGFja2FnZUNvbmZpZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICB0cnkge1xuICAgIGNvbnN0IGRvZXNDb250YWluUGFja2FnZUpzb24gPSBmcy5leGlzdHNTeW5jKHBhY2thZ2VKc29uUGF0aCk7XG4gICAgbGV0IGRlcGVuZGVuY2llczogUGFja2FnZUpzb25bJ2RlcGVuZGVuY2llcyddID0ge307XG4gICAgbGV0IGRldkRlcGVuZGVuY2llczogUGFja2FnZUpzb25bJ2RldkRlcGVuZGVuY2llcyddID0ge307XG4gICAgbGV0IHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiA9IHt9O1xuICAgIGxldCBlc21QYWNrYWdlID0gZmFsc2U7XG4gICAgaWYgKGRvZXNDb250YWluUGFja2FnZUpzb24pIHtcbiAgICAgIGNvbnN0IHBhY2thZ2VKc29uVGV4dCA9IGZzLnJlYWRGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgsICd1dGY4Jyk7XG4gICAgICBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UocGFja2FnZUpzb25UZXh0KSBhcyBQYWNrYWdlSnNvbjtcbiAgICAgIGRlcGVuZGVuY2llcyA9IHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICAgIGRldkRlcGVuZGVuY2llcyA9IHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICAgIGVzbVBhY2thZ2UgPSBwYWNrYWdlSnNvbi50eXBlID09PSAnbW9kdWxlJztcbiAgICB9XG5cbiAgICBsZXQgcmVsZWFzZUJyYW5jaGVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCByZWxlYXNlUGx1Z2luczogc3RyaW5nW10gPSBbXTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVsZWFzZXJjSnNvblBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy5yZWxlYXNlcmMuanNvbicpO1xuICAgICAgY29uc3QganNvbiA9IEpTT04ucGFyc2UoYXdhaXQgZnNwLnJlYWRGaWxlKHJlbGVhc2VyY0pzb25QYXRoLCAndXRmOCcpKSBhc1xuICAgICAgICB8IHtcbiAgICAgICAgICAgIGJyYW5jaGVzOiBzdHJpbmdbXTtcbiAgICAgICAgICAgIHBsdWdpbnM/OiBzdHJpbmdbXVtdO1xuICAgICAgICAgIH1cbiAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICByZWxlYXNlQnJhbmNoZXMgPSBqc29uPy5icmFuY2hlcyA/PyBbXTtcbiAgICAgIHJlbGVhc2VQbHVnaW5zID0ganNvbj8ucGx1Z2lucz8uZmxhdCgpID8/IFtdO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cblxuICAgIGNvbnN0IGlzUm9vdCA9XG4gICAgICBwYXRoLmJhc2VuYW1lKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLi4nKSkgIT09ICdwYWNrYWdlcycgfHxcbiAgICAgICFmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLi4nLCAnLi4nLCAncGFja2FnZS5qc29uJykpO1xuXG4gICAgbGV0IHJlcG9JbmZvOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICBpZiAoaXNSb290KSB7XG4gICAgICByZXBvSW5mbyA9IGF3YWl0IGZldGNoUmVwb0luZm8oZGlyUGF0aCwgcGFja2FnZUpzb24pO1xuICAgIH1cblxuICAgIGxldCBoYXNWZXJzaW9uU2V0dGluZ3MgPSBoYXNWZXJzaW9uU2V0dGluZ3NGaWxlKGRpclBhdGgpO1xuICAgIGZvciAoY29uc3QgcHJlZml4IG9mIFsnamF2YScsICdub2RlJywgJ3B5dGhvbiddKSB7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgYC4ke3ByZWZpeH0tdmVyc2lvbmApKSkge1xuICAgICAgICBoYXNWZXJzaW9uU2V0dGluZ3MgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgZG9ja2VyZmlsZSA9ICcnO1xuICAgIHRyeSB7XG4gICAgICBkb2NrZXJmaWxlID0gYXdhaXQgZnNwLnJlYWRGaWxlKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnRG9ja2VyZmlsZScpLCAndXRmOCcpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cblxuICAgIC8vIFJlYWQgd2JmeS5qc29uXG4gICAgY29uc3Qgd2JmeUpzb25QYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICd3YmZ5Lmpzb24nKTtcbiAgICBsZXQgd2JmeUpzb246IFdiZnlKc29uIHwgdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB3YmZ5SnNvblRleHQgPSBhd2FpdCBmc3AucmVhZEZpbGUod2JmeUpzb25QYXRoLCAndXRmOCcpO1xuICAgICAgd2JmeUpzb24gPSB3YmZ5SnNvblNjaGVtYS5wYXJzZShKU09OLnBhcnNlKHdiZnlKc29uVGV4dCkpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cblxuICAgIGNvbnN0IHJlcG9GdWxsTmFtZSA9IHR5cGVvZiByZXBvSW5mbz8uZnVsbF9uYW1lID09PSAnc3RyaW5nJyA/IHJlcG9JbmZvLmZ1bGxfbmFtZSA6IHVuZGVmaW5lZDtcbiAgICBsZXQgcmVwb0F1dGhvcjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGxldCByZXBvTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmIChyZXBvRnVsbE5hbWUpIHtcbiAgICAgIGNvbnN0IHJlcG9QYXJ0cyA9IHJlcG9GdWxsTmFtZS5zcGxpdCgnLycpO1xuICAgICAgaWYgKHJlcG9QYXJ0cy5sZW5ndGggPj0gMikge1xuICAgICAgICByZXBvQXV0aG9yID0gcmVwb1BhcnRzWzBdO1xuICAgICAgICByZXBvTmFtZSA9IHJlcG9QYXJ0c1sxXTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcmVwb3NpdG9yeSA9IHJlcG9GdWxsTmFtZSA/IGBnaXRodWI6JHtyZXBvRnVsbE5hbWV9YCA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBjb25maWc6IFBhY2thZ2VDb25maWcgPSB7XG4gICAgICBkaXJQYXRoLFxuICAgICAgZG9ja2VyZmlsZSxcbiAgICAgIGlzUm9vdCxcbiAgICAgIGlzUHVibGljUmVwbzogcmVwb0luZm8/LnByaXZhdGUgPT09IGZhbHNlLFxuICAgICAgaXNSZWZlcnJlZEJ5T3RoZXJSZXBvOiAhIXBhY2thZ2VKc29uLmZpbGVzLFxuICAgICAgcmVwb3NpdG9yeSxcbiAgICAgIHJlcG9BdXRob3IsXG4gICAgICByZXBvTmFtZSxcbiAgICAgIGlzV2lsbEJvb3N0ZXJSZXBvOiBCb29sZWFuKFxuICAgICAgICByZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXIvJykgfHwgcmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyTGFiLycpXG4gICAgICApLFxuICAgICAgaXNCdW46IHJvb3RDb25maWc/LmlzQnVuIHx8IGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGRpclBhdGgsICdidW4ubG9jaycpKSxcbiAgICAgIGlzRXNtUGFja2FnZTogZXNtUGFja2FnZSxcbiAgICAgIGlzV2lsbEJvb3N0ZXJDb25maWdzOiBwYWNrYWdlSnNvblBhdGguaW5jbHVkZXMoJy93aWxsYm9vc3Rlci1jb25maWdzJyksXG4gICAgICBkb2VzQ29udGFpblN1YlBhY2thZ2VKc29uczogY29udGFpbnNBbnkoJ3BhY2thZ2VzLyoqL3BhY2thZ2UuanNvbicsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5Eb2NrZXJmaWxlOiAhIWRvY2tlcmZpbGUgfHwgZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2RvY2tlci1jb21wb3NlLnltbCcpKSxcbiAgICAgIGRvZXNDb250YWluR2VtZmlsZTogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ0dlbWZpbGUnKSksXG4gICAgICBkb2VzQ29udGFpbkdvTW9kOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnZ28ubW9kJykpLFxuICAgICAgZG9lc0NvbnRhaW5QYWNrYWdlSnNvbjogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSxcbiAgICAgIGRvZXNDb250YWluUG9ldHJ5TG9jazogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BvZXRyeS5sb2NrJykpLFxuICAgICAgZG9lc0NvbnRhaW5VdkxvY2s6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICd1di5sb2NrJykpLFxuICAgICAgZG9lc0NvbnRhaW5Qb21YbWw6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwb20ueG1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5QdWJzcGVjWWFtbDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3B1YnNwZWMueWFtbCcpKSxcbiAgICAgIGRvZXNDb250YWluVGVtcGxhdGVZYW1sOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAndGVtcGxhdGUueWFtbCcpKSxcbiAgICAgIGRvZXNDb250YWluVnNjb2RlU2V0dGluZ3NKc29uOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLnZzY29kZScsICdzZXR0aW5ncy5qc29uJykpLFxuICAgICAgZG9lc0NvbnRhaW5KYXZhU2NyaXB0OiBjb250YWluc0FueSgne2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjanMsbWpzLGpzLGpzeH0nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluVHlwZVNjcmlwdDogY29udGFpbnNBbnkoJ3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y3RzLG10cyx0cyx0c3h9JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbkpzeE9yVHN4OiBjb250YWluc0FueSgne2FwcCxzcmMsdGVzdH0vKiovKi57dCxqfXN4JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbkphdmE6IGNvbnRhaW5zQW55KCcqKi8qLmphdmEnLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluSmF2YVNjcmlwdEluUGFja2FnZXM6IGNvbnRhaW5zQW55KCdwYWNrYWdlcy8qKi97YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4fScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlczogY29udGFpbnNBbnkoJ3BhY2thZ2VzLyoqL3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y3RzLG10cyx0cyx0c3h9JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbkpzeE9yVHN4SW5QYWNrYWdlczogY29udGFpbnNBbnkoJ3BhY2thZ2VzLyoqL3thcHAsc3JjLHRlc3R9LyoqLyoue3Qsan1zeCcsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5KYXZhSW5QYWNrYWdlczogY29udGFpbnNBbnkoJ3BhY2thZ2VzLyoqLyouamF2YScsIGRpclBhdGgpLFxuICAgICAgZGVwZW5kaW5nOiB7XG4gICAgICAgIGJsaXR6OiAhIWRlcGVuZGVuY2llcy5ibGl0eixcbiAgICAgICAgZmlyZWJhc2U6ICEhZGV2RGVwZW5kZW5jaWVzWydmaXJlYmFzZS10b29scyddLFxuICAgICAgICBnZW5JMThuVHM6ICEhZGVwZW5kZW5jaWVzWydnZW4taTE4bi10cyddIHx8ICEhZGV2RGVwZW5kZW5jaWVzWydnZW4taTE4bi10cyddLFxuICAgICAgICBsaXRlc3RyZWFtOiBkb2NrZXJmaWxlLmluY2x1ZGVzKCdpbnN0YWxsLWxpdGVzdHJlYW0uc2gnKSxcbiAgICAgICAgcmVhY3Q6ICEhZGVwZW5kZW5jaWVzLnJlYWN0LFxuICAgICAgICBuZXh0OiAhIWRlcGVuZGVuY2llcy5uZXh0LFxuICAgICAgICBwbGF5d3JpZ2h0VGVzdDpcbiAgICAgICAgICAhIWRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddIHx8ICEhZGV2RGVwZW5kZW5jaWVzWydAcGxheXdyaWdodC90ZXN0J10gfHwgISFkZXZEZXBlbmRlbmNpZXMucGxheXdyaWdodCxcbiAgICAgICAgcHJpc21hOiAhIWRlcGVuZGVuY2llc1snQHByaXNtYS9jbGllbnQnXSB8fCAhIWRldkRlcGVuZGVuY2llcy5wcmlzbWEsXG4gICAgICAgIHB5cmlnaHQ6ICEhZGV2RGVwZW5kZW5jaWVzLnB5cmlnaHQsXG4gICAgICAgIHJlYWN0TmF0aXZlOiAhIWRlcGVuZGVuY2llc1sncmVhY3QtbmF0aXZlJ10sXG4gICAgICAgIHNlbWFudGljUmVsZWFzZTogISEoXG4gICAgICAgICAgZGV2RGVwZW5kZW5jaWVzWydzZW1hbnRpYy1yZWxlYXNlJ10gfHxcbiAgICAgICAgICByZWxlYXNlQnJhbmNoZXMubGVuZ3RoID4gMCB8fFxuICAgICAgICAgIHJlbGVhc2VQbHVnaW5zLmxlbmd0aCA+IDBcbiAgICAgICAgKSxcbiAgICAgICAgc3Rvcnlib29rOiAhIWRldkRlcGVuZGVuY2llc1snQHN0b3J5Ym9vay9yZWFjdCddLFxuICAgICAgICB3YjogISFkZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci93YiddIHx8ICEhZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvd2InXSxcbiAgICAgIH0sXG4gICAgICByZWxlYXNlOiB7XG4gICAgICAgIGJyYW5jaGVzOiByZWxlYXNlQnJhbmNoZXMsXG4gICAgICAgIGdpdGh1YjogcmVsZWFzZVBsdWdpbnMuaW5jbHVkZXMoJ0BzZW1hbnRpYy1yZWxlYXNlL2dpdGh1YicpLFxuICAgICAgICBucG06IHJlbGVhc2VQbHVnaW5zLmluY2x1ZGVzKCdAc2VtYW50aWMtcmVsZWFzZS9ucG0nKSxcbiAgICAgIH0sXG4gICAgICBoYXNWZXJzaW9uU2V0dGluZ3MsXG4gICAgICBtaXNlVGFza3M6IGF3YWl0IHJlYWRNaXNlVGFza3MoZGlyUGF0aCksXG4gICAgICBwYWNrYWdlSnNvbixcbiAgICAgIHdiZnlKc29uLFxuICAgIH07XG4gICAgaWYgKFxuICAgICAgY29uZmlnLmRvZXNDb250YWluR2VtZmlsZSB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluR29Nb2QgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5VdkxvY2sgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblBvbVhtbCB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblRlbXBsYXRlWWFtbFxuICAgICkge1xuICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5mdW5jdGlvbiBoYXNWZXJzaW9uU2V0dGluZ3NGaWxlKGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBjdXJyZW50ID0gcGF0aC5yZXNvbHZlKGRpclBhdGgpO1xuICByZXR1cm4gKFxuICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGN1cnJlbnQsICdtaXNlLnRvbWwnKSkgfHxcbiAgICBmcy5leGlzdHNTeW5jKHBhdGguam9pbihjdXJyZW50LCAnLm1pc2UudG9tbCcpKSB8fFxuICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGN1cnJlbnQsICcudG9vbC12ZXJzaW9ucycpKVxuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkTWlzZVRhc2tzKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4ge1xuICBjb25zdCB0YXNrczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBmb3IgKGNvbnN0IGZpbGVOYW1lIG9mIFsnbWlzZS50b21sJywgJy5taXNlLnRvbWwnXSkge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsIGZpbGVOYW1lKTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2V0dGluZ3MgPSB0b21sLnBhcnNlKGF3YWl0IGZzcC5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKSkgYXMgeyB0YXNrcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH07XG4gICAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc2V0dGluZ3MudGFza3MgPz8ge30pKSB7XG4gICAgICAgIHRhc2tzW25hbWVdID0gcmVhZE1pc2VUYXNrQ29tbWFuZCh2YWx1ZSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBNaXNzaW5nIG9yIHRlbXBvcmFyaWx5IGludmFsaWQgbWlzZSBmaWxlcyBzaG91bGQgbm90IGJsb2NrIG90aGVyIHdiZnkgZ2VuZXJhdG9ycy5cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRhc2tzO1xufVxuXG5mdW5jdGlvbiByZWFkTWlzZVRhc2tDb21tYW5kKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHJldHVybiB2YWx1ZTtcbiAgLy8gUHJlc2VydmUgYXJyYXktZm9ybSBtaXNlIGNvbW1hbmRzIHNvIHJlY3Vyc2lvbiBjaGVja3MgY2FuIHN0aWxsIHNlZSBwYWNrYWdlIHNjcmlwdCBjYWxscy5cbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gdmFsdWUuZmlsdGVyKChjb21tYW5kKTogY29tbWFuZCBpcyBzdHJpbmcgPT4gdHlwZW9mIGNvbW1hbmQgPT09ICdzdHJpbmcnKS5qb2luKCdcXG4nKTtcbiAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHJldHVybiByZWFkTWlzZVRhc2tDb21tYW5kKCh2YWx1ZSBhcyB7IHJ1bj86IHVua25vd24gfSkucnVuKTtcbiAgcmV0dXJuICcnO1xufVxuXG5mdW5jdGlvbiBjb250YWluc0FueShwYXR0ZXJuOiBzdHJpbmcsIGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZmcuZ2xvYlN5bmMocGF0dGVybiwgeyBkb3Q6IHRydWUsIGN3ZDogZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH0pLmxlbmd0aCA+IDA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoUmVwb0luZm8oZGlyUGF0aDogc3RyaW5nLCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGdpdCA9IHNpbXBsZUdpdChkaXJQYXRoKTtcbiAgY29uc3QgcmVtb3RlcyA9IGF3YWl0IGdpdC5nZXRSZW1vdGVzKHRydWUpO1xuICBjb25zdCBvcmlnaW4gPSByZW1vdGVzLmZpbmQoKHIpID0+IHIubmFtZSA9PT0gJ29yaWdpbicpO1xuICBjb25zdCByZW1vdGVVcmwgPSBvcmlnaW4/LnJlZnMuZmV0Y2ggPz8gb3JpZ2luPy5yZWZzLnB1c2g7XG4gIGlmICh0eXBlb2YgcmVtb3RlVXJsID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXF1ZXN0UmVwb0luZm8ocmVtb3RlVXJsKTtcbiAgICBpZiAoanNvbikgcmV0dXJuIGpzb247XG4gIH1cblxuICBjb25zdCB1cmwgPSB0eXBlb2YgcGFja2FnZUpzb24ucmVwb3NpdG9yeSA9PT0gJ3N0cmluZycgPyBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5IDogcGFja2FnZUpzb24ucmVwb3NpdG9yeT8udXJsO1xuICBpZiAodXJsKSB7XG4gICAgY29uc3QganNvbiA9IGF3YWl0IHJlcXVlc3RSZXBvSW5mbyh1cmwpO1xuICAgIGlmIChqc29uICYmIGpzb24ubWVzc2FnZSAhPT0gJ05vdCBGb3VuZCcpIHJldHVybiBqc29uO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlcXVlc3RSZXBvSW5mbyh1cmxPckZ1bGxOYW1lOiBzdHJpbmcpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IFtvcmcsIG5hbWVdID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKHVybE9yRnVsbE5hbWUpO1xuICBpZiAoIW9yZyB8fCAhbmFtZSkgcmV0dXJuO1xuXG4gIHRyeSB7XG4gICAgLy8gTWV0YWRhdGEgcGVybWlzc2lvblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZ2V0T2N0b2tpdCgpLnJlcXVlc3QoJ0dFVCAvcmVwb3Mve293bmVyfS97cmVwb30nLCB7XG4gICAgICBvd25lcjogb3JnLFxuICAgICAgcmVwbzogbmFtZSxcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzcG9uc2UuZGF0YTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zdCByZWRpcmVjdGVkRnVsbE5hbWUgPSBnZXRSZWRpcmVjdGVkUmVwb0Z1bGxOYW1lKGVycm9yKTtcbiAgICBpZiAocmVkaXJlY3RlZEZ1bGxOYW1lKSB7XG4gICAgICByZXR1cm4geyBmdWxsX25hbWU6IHJlZGlyZWN0ZWRGdWxsTmFtZSB9O1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRSZWRpcmVjdGVkUmVwb0Z1bGxOYW1lKGVycm9yOiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFlcnJvciB8fCB0eXBlb2YgZXJyb3IgIT09ICdvYmplY3QnKSByZXR1cm47XG5cbiAgY29uc3QgcmVzcG9uc2UgPVxuICAgICdyZXNwb25zZScgaW4gZXJyb3JcbiAgICAgID8gKGVycm9yIGFzIHsgcmVzcG9uc2U/OiB7IHN0YXR1cz86IG51bWJlcjsgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4gfSB9KS5yZXNwb25zZVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlPy5zdGF0dXMgPz8gKGVycm9yIGFzIHsgc3RhdHVzPzogbnVtYmVyIH0pLnN0YXR1cztcbiAgaWYgKHN0YXR1cyAhPT0gMzAxICYmIHN0YXR1cyAhPT0gMzAyKSByZXR1cm47XG5cbiAgY29uc3QgbG9jYXRpb24gPSByZXNwb25zZT8uaGVhZGVycz8ubG9jYXRpb247XG4gIGlmICh0eXBlb2YgbG9jYXRpb24gIT09ICdzdHJpbmcnKSByZXR1cm47XG5cbiAgY29uc3QgW29yZywgbmFtZV0gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUobG9jYXRpb24pO1xuICBpZiAoIW9yZyB8fCAhbmFtZSkgcmV0dXJuO1xuXG4gIHJldHVybiBgJHtvcmd9LyR7bmFtZX1gO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmNvbnN0IGRlcGVuZGVuY3lTZWN0aW9uS2V5cyA9IFsnZGVwZW5kZW5jaWVzJywgJ2RldkRlcGVuZGVuY2llcycsICdvcHRpb25hbERlcGVuZGVuY2llcycsICdwZWVyRGVwZW5kZW5jaWVzJ10gYXMgY29uc3Q7XG5jb25zdCBhbGxvd2VkR2l0SHViT3JnYW5pemF0aW9uUGF0dGVybiA9IFN0cmluZy5yYXdgKD86V2lsbEJvb3N0ZXJ8V2lsbEJvb3N0ZXJMYWIpYDtcbmNvbnN0IGFsbG93ZWRHaXREZXBlbmRlbmN5UGF0dGVybnMgPSBbXG4gIG5ldyBSZWdFeHAoYF4ke2FsbG93ZWRHaXRIdWJPcmdhbml6YXRpb25QYXR0ZXJufS9bXiNcXFxcc10rKD86I1xcXFxTKyk/JGAsICd1JyksXG4gIG5ldyBSZWdFeHAoYF5naXRodWI6JHthbGxvd2VkR2l0SHViT3JnYW5pemF0aW9uUGF0dGVybn0vW14jXFxcXHNdKyg/OiNcXFxcUyspPyRgLCAndScpLFxuICBuZXcgUmVnRXhwKFxuICAgIGBeKD86Z2l0XFxcXCspP2h0dHBzOi8vZ2l0aHViXFxcXC5jb20vJHthbGxvd2VkR2l0SHViT3JnYW5pemF0aW9uUGF0dGVybn0vW14jXFxcXHNdKyg/OlxcXFwuZ2l0KT8oPzojXFxcXFMrKT8kYCxcbiAgICAndSdcbiAgKSxcbiAgbmV3IFJlZ0V4cChcbiAgICBgXig/OmdpdFxcXFwrKT9zc2g6Ly9naXRAZ2l0aHViXFxcXC5jb21bOi9dJHthbGxvd2VkR2l0SHViT3JnYW5pemF0aW9uUGF0dGVybn0vW14jXFxcXHNdKyg/OlxcXFwuZ2l0KT8oPzojXFxcXFMrKT8kYCxcbiAgICAndSdcbiAgKSxcbiAgbmV3IFJlZ0V4cChgXig/OmdpdFxcXFwrKT9naXRAZ2l0aHViXFxcXC5jb206JHthbGxvd2VkR2l0SHViT3JnYW5pemF0aW9uUGF0dGVybn0vW14jXFxcXHNdKyg/OlxcXFwuZ2l0KT8oPzojXFxcXFMrKT8kYCwgJ3UnKSxcbl07XG5cbmludGVyZmFjZSBEaXNhbGxvd2VkRGVwZW5kZW5jeVNvdXJjZSB7XG4gIGRlcGVuZGVuY3lOYW1lOiBzdHJpbmc7XG4gIGRpclBhdGg6IHN0cmluZztcbiAgc2VjdGlvbk5hbWU6ICh0eXBlb2YgZGVwZW5kZW5jeVNlY3Rpb25LZXlzKVtudW1iZXJdO1xuICBzcGVjaWZpZXI6IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFNhZmVEZXBlbmRlbmN5U291cmNlcyhjb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiB2b2lkIHtcbiAgY29uc3QgZGlzYWxsb3dlZFNvdXJjZXMgPSBjb25maWdzLmZsYXRNYXAoZ2V0RGlzYWxsb3dlZERlcGVuZGVuY3lTb3VyY2VzKTtcbiAgaWYgKGRpc2FsbG93ZWRTb3VyY2VzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gIGNvbnN0IGRldGFpbHMgPSBkaXNhbGxvd2VkU291cmNlc1xuICAgIC5tYXAoXG4gICAgICAoeyBkZXBlbmRlbmN5TmFtZSwgZGlyUGF0aCwgc2VjdGlvbk5hbWUsIHNwZWNpZmllciB9KSA9PlxuICAgICAgICBgLSAke3BhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJyl9OiAke3NlY3Rpb25OYW1lfS4ke2RlcGVuZGVuY3lOYW1lfSB1c2VzICR7c3BlY2lmaWVyfWBcbiAgICApXG4gICAgLmpvaW4oJ1xcbicpO1xuXG4gIHRocm93IG5ldyBFcnJvcihcbiAgICBgRGlzYWxsb3dlZCBHaXQgZGVwZW5kZW5jeSBzb3VyY2VzIGZvdW5kLlxcbk9ubHkgV2lsbEJvb3N0ZXIgYW5kIFdpbGxCb29zdGVyTGFiIEdpdEh1YiBkZXBlbmRlbmNpZXMgYXJlIGFsbG93ZWQuXFxuJHtkZXRhaWxzfWBcbiAgKTtcbn1cblxuZnVuY3Rpb24gZ2V0RGlzYWxsb3dlZERlcGVuZGVuY3lTb3VyY2VzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IERpc2FsbG93ZWREZXBlbmRlbmN5U291cmNlW10ge1xuICBjb25zdCBwYWNrYWdlSnNvbiA9IGNvbmZpZy5wYWNrYWdlSnNvbjtcbiAgaWYgKCFwYWNrYWdlSnNvbikgcmV0dXJuIFtdO1xuXG4gIGNvbnN0IGRpc2FsbG93ZWRTb3VyY2VzOiBEaXNhbGxvd2VkRGVwZW5kZW5jeVNvdXJjZVtdID0gW107XG4gIGZvciAoY29uc3Qgc2VjdGlvbk5hbWUgb2YgZGVwZW5kZW5jeVNlY3Rpb25LZXlzKSB7XG4gICAgY29uc3Qgc2VjdGlvbiA9IHBhY2thZ2VKc29uW3NlY3Rpb25OYW1lXTtcbiAgICBpZiAoIXNlY3Rpb24pIGNvbnRpbnVlO1xuXG4gICAgZm9yIChjb25zdCBbZGVwZW5kZW5jeU5hbWUsIHNwZWNpZmllcl0gb2YgT2JqZWN0LmVudHJpZXMoc2VjdGlvbikpIHtcbiAgICAgIGlmICghc3BlY2lmaWVyKSBjb250aW51ZTtcbiAgICAgIGlmICghaXNHaXREZXBlbmRlbmN5U3BlY2lmaWVyKHNwZWNpZmllcikpIGNvbnRpbnVlO1xuICAgICAgaWYgKGlzQWxsb3dlZEdpdERlcGVuZGVuY3lTcGVjaWZpZXIoc3BlY2lmaWVyKSkgY29udGludWU7XG5cbiAgICAgIGRpc2FsbG93ZWRTb3VyY2VzLnB1c2goe1xuICAgICAgICBkZXBlbmRlbmN5TmFtZSxcbiAgICAgICAgZGlyUGF0aDogY29uZmlnLmRpclBhdGgsXG4gICAgICAgIHNlY3Rpb25OYW1lLFxuICAgICAgICBzcGVjaWZpZXIsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRpc2FsbG93ZWRTb3VyY2VzO1xufVxuXG5mdW5jdGlvbiBpc0dpdERlcGVuZGVuY3lTcGVjaWZpZXIoc3BlY2lmaWVyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBpc0dpdEh1YlNob3J0aGFuZFNwZWNpZmllcihzcGVjaWZpZXIpIHx8XG4gICAgL14oPzpiaXRidWNrZXR8Z2lzdHxnaXRodWJ8Z2l0bGFiKTovdS50ZXN0KHNwZWNpZmllcikgfHxcbiAgICAvXmh0dHBzPzpcXC9cXC8oPzpiaXRidWNrZXRcXC5vcmd8Z2l0aHViXFwuY29tfGdpdGxhYlxcLmNvbSlcXC8vdS50ZXN0KHNwZWNpZmllcikgfHxcbiAgICAvXig/Omh0dHBzP3xzc2gpOlxcL1xcL1xcUytcXC5naXQoPzojXFxTKyk/JC91LnRlc3Qoc3BlY2lmaWVyKSB8fFxuICAgIC9eW15AXFxzXStAW146XFxzXSs6XFxTKyg/OiNcXFMrKT8kL3UudGVzdChzcGVjaWZpZXIpIHx8XG4gICAgc3BlY2lmaWVyLnN0YXJ0c1dpdGgoJ2dpdDonKSB8fFxuICAgIHNwZWNpZmllci5zdGFydHNXaXRoKCdnaXQrJykgfHxcbiAgICBzcGVjaWZpZXIuc3RhcnRzV2l0aCgnc3NoOi8vZ2l0QCcpXG4gICk7XG59XG5cbmZ1bmN0aW9uIGlzR2l0SHViU2hvcnRoYW5kU3BlY2lmaWVyKHNwZWNpZmllcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAvXlthLXpBLVowLTldW1xcdy4tXSpcXC9bXFx3Li1dKyg/OiNcXFMrKT8kL3UudGVzdChzcGVjaWZpZXIpO1xufVxuXG5mdW5jdGlvbiBpc0FsbG93ZWRHaXREZXBlbmRlbmN5U3BlY2lmaWVyKHNwZWNpZmllcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBhbGxvd2VkR2l0RGVwZW5kZW5jeVBhdHRlcm5zLnNvbWUoKHBhdHRlcm4pID0+IHBhdHRlcm4udGVzdChzcGVjaWZpZXIpKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGlnbm9yZUVycm9yQXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi9zcmMnO1xuaW1wb3J0IHlhcmdzIGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZml4TmV4dENvbmZpZ0pzb24gfSBmcm9tICcuL2ZpeGVycy9uZXh0Q29uZmlnLmpzJztcbmltcG9ydCB7IGZpeFBsYXl3cmlnaHRDb25maWcgfSBmcm9tICcuL2ZpeGVycy9wbGF5d3JpZ2h0Q29uZmlnLmpzJztcbmltcG9ydCB7IGZpeFByaXNtYUVudkZpbGVzIH0gZnJvbSAnLi9maXhlcnMvcHJpc21hLmpzJztcbmltcG9ydCB7IGZpeFRlc3REaXJlY3Rvcmllc1VwZGF0aW5nUGFja2FnZUpzb24gfSBmcm9tICcuL2ZpeGVycy90ZXN0RGlyZWN0b3J5LmpzJztcbmltcG9ydCB7IGZpeFR5cGVEZWZpbml0aW9ucyB9IGZyb20gJy4vZml4ZXJzL3R5cGVEZWZpbml0aW9uLmpzJztcbmltcG9ydCB7IGZpeFR5cG9zIH0gZnJvbSAnLi9maXhlcnMvdHlwb3MuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9hZ2VudHMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVCdW5maWdUb21sIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2J1bmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZURvY2tlcmlnbm9yZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9kb2NrZXJpZ25vcmUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVFZGl0b3Jjb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvZWRpdG9yY29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2VtaW5pQ29uZmlnIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dlbWluaUNvbmZpZy5qcyc7XG5pbXBvcnQgeyByZW1vdmVHZW1pbmlTZXR0aW5ncyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9nZW1pbmlTZXR0aW5ncy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMgfSBmcm9tICcuL2dlbmVyYXRvcnMvZ2l0YXR0cmlidXRlcy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUdpdGlnbm9yZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9naXRpZ25vcmUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVJZGVhU2V0dGluZ3MgfSBmcm9tICcuL2dlbmVyYXRvcnMvaWRlYS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUxlZnRob29rVXBkYXRpbmdQYWNrYWdlSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9sZWZ0aG9vay5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUxpbnRzdGFnZWRyYyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9saW50c3RhZ2VkcmMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVQYWNrYWdlSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9wYWNrYWdlSnNvbi5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZU94Zm10Q29uZmlnIH0gZnJvbSAnLi9nZW5lcmF0b3JzL294Zm10Q29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlT3hsaW50Q29uZmlnIH0gZnJvbSAnLi9nZW5lcmF0b3JzL294bGludENvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVByZXR0aWVyaWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3ByZXR0aWVyaWdub3JlLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24gfSBmcm9tICcuL2dlbmVyYXRvcnMvcHlyaWdodENvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJlYWRtZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9yZWFkbWUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVSZWxlYXNlcmMgfSBmcm9tICcuL2dlbmVyYXRvcnMvcmVsZWFzZXJjLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUmVub3ZhdGVKc29uIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3Jlbm92YXRlSnNvbi5qcyc7XG5pbXBvcnQgeyBpbnN0YWxsQWdlbnRTa2lsbHMgfSBmcm9tICcuL2dlbmVyYXRvcnMvc2tpbGxzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlVHNjb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvdHNjb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyB9IGZyb20gJy4vZ2VuZXJhdG9ycy92c2NvZGVTZXR0aW5ncy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVdvcmtmbG93cywgaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8gfSBmcm9tICcuL2dlbmVyYXRvcnMvd29ya2Zsb3cuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVZYXJucmNZbWwgfSBmcm9tICcuL2dlbmVyYXRvcnMveWFybnJjLmpzJztcbmltcG9ydCB7IHNldHVwTGFiZWxzIH0gZnJvbSAnLi9naXRodWIvbGFiZWwuanMnO1xuaW1wb3J0IHsgc2V0dXBTZWNyZXRzIH0gZnJvbSAnLi9naXRodWIvc2VjcmV0LmpzJztcbmltcG9ydCB7IHNldHVwR2l0SHViU2V0dGluZ3MgfSBmcm9tICcuL2dpdGh1Yi9zZXR0aW5ncy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcyB9IGZyb20gJy4vZ2l0aHViL3RlbXBsYXRlLmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuL29wdGlvbnMuanMnO1xuaW1wb3J0IHsgZ2V0UGFja2FnZUNvbmZpZyB9IGZyb20gJy4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBhc3NlcnRTYWZlRGVwZW5kZW5jeVNvdXJjZXMgfSBmcm9tICcuL3V0aWxzL2RlcGVuZGVuY3lTb3VyY2VQb2xpY3kuanMnO1xuaW1wb3J0IHsgZG9lc0NvbnRhaW5Kc09yVHMgfSBmcm9tICcuL3V0aWxzL3BhY2thZ2VDYXBhYmlsaXRpZXMuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHNwYXduU3luYywgc3Bhd25TeW5jQW5kUmV0dXJuU3RhdHVzIH0gZnJvbSAnLi91dGlscy9zcGF3blV0aWwuanMnO1xuXG5hc3luYyBmdW5jdGlvbiBtYWluKCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBhcmd2ID0gYXdhaXQgeWFyZ3MocHJvY2Vzcy5hcmd2LnNsaWNlKDIpKVxuICAgIC5jb21tYW5kKCckMCBbcGF0aHMuLl0nLCAnTWFrZSBhIGdpdmVuIHByb2plY3QgZm9sbG93IHRoZSBXaWxsQm9vc3RlciBzdGFuZGFyZCcsICh5YXJncykgPT4ge1xuICAgICAgeWFyZ3MucG9zaXRpb25hbCgncGF0aHMnLCB7XG4gICAgICAgIGRlc2NyaWJlOiAncHJvamVjdCBwYXRocyB0byBiZSB3YmZpZWQnLFxuICAgICAgICBhcnJheTogdHJ1ZSxcbiAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgIGRlZmF1bHQ6IFsnLiddLFxuICAgICAgfSk7XG4gICAgfSlcbiAgICAub3B0aW9ucyh7XG4gICAgICBlbnY6IHtcbiAgICAgICAgZGVzY3JpcHRpb246ICdVcGxvYWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFzIHNlY3JldHMgdG8gR2l0SHViJyxcbiAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgYWxpYXM6ICdlJyxcbiAgICAgIH0sXG4gICAgICBza2lwRGVwczoge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ1NraXAgZGVwZW5kZW5jeSBpbnN0YWxsYXRpb24nLFxuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICBhbGlhczogJ2QnLFxuICAgICAgfSxcbiAgICAgIHZlcmJvc2U6IHtcbiAgICAgICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIG9yIG5vdCB0byBlbmFibGUgdmVyYm9zZSBtb2RlJyxcbiAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgYWxpYXM6ICd2JyxcbiAgICAgIH0sXG4gICAgfSlcbiAgICAudmVyc2lvbihnZXRWZXJzaW9uKCkpXG4gICAgLnN0cmljdCgpLmFyZ3Y7XG4gIG9wdGlvbnMuaXNWZXJib3NlID0gYXJndi52ZXJib3NlO1xuICBvcHRpb25zLmRvZXNVcGxvYWRFbnZWYXJzID0gYXJndi5lbnY7XG5cbiAgbGV0IGhhc0ludmFsaWRQYWNrYWdlQ29uZmlnID0gZmFsc2U7XG4gIGZvciAoY29uc3Qgcm9vdERpclBhdGggb2YgYXJndi5wYXRocyBhcyBzdHJpbmdbXSkge1xuICAgIGNvbnN0IHBhY2thZ2VzRGlyUGF0aCA9IHBhdGguam9pbihyb290RGlyUGF0aCwgJ3BhY2thZ2VzJyk7XG4gICAgY29uc3QgZGlyZW50cyA9IChhd2FpdCBpZ25vcmVFcnJvckFzeW5jKCgpID0+IGZzLnByb21pc2VzLnJlYWRkaXIocGFja2FnZXNEaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpKSA/PyBbXTtcbiAgICBjb25zdCBzdWJEaXJQYXRocyA9IGRpcmVudHMuZmlsdGVyKChkKSA9PiBkLmlzRGlyZWN0b3J5KCkpLm1hcCgoZCkgPT4gcGF0aC5qb2luKHBhY2thZ2VzRGlyUGF0aCwgZC5uYW1lKSk7XG5cbiAgICBhd2FpdCBmaXhUZXN0RGlyZWN0b3JpZXNVcGRhdGluZ1BhY2thZ2VKc29uKFtyb290RGlyUGF0aCwgLi4uc3ViRGlyUGF0aHNdKTtcblxuICAgIGNvbnN0IHJvb3RDb25maWcgPSBhd2FpdCBnZXRQYWNrYWdlQ29uZmlnKHJvb3REaXJQYXRoKTtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdyb290Q29uZmlnOicsIHJvb3RDb25maWcpO1xuICAgIH1cbiAgICBpZiAoIXJvb3RDb25maWcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYHRoZXJlIGlzIG5vIHZhbGlkIHBhY2thZ2UuanNvbiBpbiAke3Jvb3REaXJQYXRofWApO1xuICAgICAgaGFzSW52YWxpZFBhY2thZ2VDb25maWcgPSB0cnVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGFiYnJldmlhdGlvblByb21pc2UgPSBmaXhUeXBvcyhyb290Q29uZmlnKTtcblxuICAgIGNvbnN0IG51bGxhYmxlU3ViUGFja2FnZUNvbmZpZ3MgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHN1YkRpclBhdGhzLm1hcCgoc3ViRGlyUGF0aCkgPT4gZ2V0UGFja2FnZUNvbmZpZyhzdWJEaXJQYXRoLCByb290Q29uZmlnKSlcbiAgICApO1xuICAgIGNvbnN0IHN1YlBhY2thZ2VDb25maWdzID0gbnVsbGFibGVTdWJQYWNrYWdlQ29uZmlncy5maWx0ZXIoKGNvbmZpZykgPT4gISFjb25maWcpO1xuICAgIGNvbnN0IGFsbFBhY2thZ2VDb25maWdzID0gW3Jvb3RDb25maWcsIC4uLnN1YlBhY2thZ2VDb25maWdzXTtcblxuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgZm9yIChjb25zdCBjb25maWcgb2YgYWxsUGFja2FnZUNvbmZpZ3MpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGNvbmZpZyk7XG4gICAgICB9XG4gICAgfVxuICAgIGFzc2VydFNhZmVEZXBlbmRlbmN5U291cmNlcyhhbGxQYWNrYWdlQ29uZmlncyk7XG5cbiAgICAvLyBJbnN0YWxsIHlhcm4gYmVycnlcbiAgICBhd2FpdCBnZW5lcmF0ZVlhcm5yY1ltbChyb290Q29uZmlnKTtcbiAgICBpZiAocm9vdENvbmZpZy5pc0J1bikge1xuICAgICAgYXdhaXQgZ2VuZXJhdGVCdW5maWdUb21sKHJvb3RDb25maWcpO1xuICAgIH1cblxuICAgIGNvbnN0IHNob3VsZFJ1bldvcmtmbG93cyA9XG4gICAgICAhaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8ocm9vdENvbmZpZy5yZXBvc2l0b3J5KSAmJlxuICAgICAgKHJvb3RDb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyLycpIHx8XG4gICAgICAgIHJvb3RDb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyTGFiLycpKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBmaXhQcmlzbWFFbnZGaWxlcyhyb290Q29uZmlnKSxcbiAgICAgIGFiYnJldmlhdGlvblByb21pc2UudGhlbigoKSA9PiBnZW5lcmF0ZVJlYWRtZShyb290Q29uZmlnKSksXG4gICAgICBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zKHJvb3RDb25maWcsIGFsbFBhY2thZ2VDb25maWdzKSxcbiAgICAgIGdlbmVyYXRlRG9ja2VyaWdub3JlKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVFZGl0b3Jjb25maWcocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUdlbWluaUNvbmZpZyhyb290Q29uZmlnLCBhbGxQYWNrYWdlQ29uZmlncyksXG4gICAgICByZW1vdmVHZW1pbmlTZXR0aW5ncyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlR2l0YXR0cmlidXRlcyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlR2l0SHViVGVtcGxhdGVzKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVJZGVhU2V0dGluZ3Mocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZVJlbm92YXRlSnNvbihyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlUmVsZWFzZXJjKHJvb3RDb25maWcpLFxuICAgICAgLi4uKHNob3VsZFJ1bldvcmtmbG93cyA/IFtnZW5lcmF0ZVdvcmtmbG93cyhyb290Q29uZmlnKV0gOiBbXSksXG4gICAgICBzZXR1cExhYmVscyhyb290Q29uZmlnKSxcbiAgICAgIHNldHVwU2VjcmV0cyhyb290Q29uZmlnKSxcbiAgICAgIHNldHVwR2l0SHViU2V0dGluZ3Mocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUxlZnRob29rVXBkYXRpbmdQYWNrYWdlSnNvbihyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlTGludHN0YWdlZHJjKHJvb3RDb25maWcpLFxuICAgIF0pO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcblxuICAgIGNvbnN0IHByb21pc2VzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGNvbmZpZyBvZiBhbGxQYWNrYWdlQ29uZmlncykge1xuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXMpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChmaXhUeXBlRGVmaW5pdGlvbnMoY29uZmlnLCBjb25maWcuaXNSb290ID8gYWxsUGFja2FnZUNvbmZpZ3MgOiBbY29uZmlnXSkpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChmaXhQbGF5d3JpZ2h0Q29uZmlnKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGZpeE5leHRDb25maWdKc29uKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgYXdhaXQgZ2VuZXJhdGVHaXRpZ25vcmUoY29uZmlnLCByb290Q29uZmlnKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgICAgIGlmICghY29uZmlnLmlzUm9vdCAmJiAhY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBhd2FpdCBnZW5lcmF0ZVByZXR0aWVyaWdub3JlKGNvbmZpZyk7XG4gICAgICBhd2FpdCBnZW5lcmF0ZVBhY2thZ2VKc29uKGNvbmZpZywgcm9vdENvbmZpZywgYXJndi5za2lwRGVwcyk7XG5cbiAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVMaW50c3RhZ2VkcmMoY29uZmlnKSk7XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluVnNjb2RlU2V0dGluZ3NKc29uICYmIGNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyhjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVUc2NvbmZpZyhjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVPeGZtdENvbmZpZyhjb25maWcpKTtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZU94bGludENvbmZpZyhjb25maWcsIHJvb3RDb25maWcpKTtcbiAgICAgIH0gZWxzZSBpZiAoIWNvbmZpZy5pc1Jvb3QgJiYgY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24gJiYgZG9lc0NvbnRhaW5Kc09yVHMocm9vdENvbmZpZykpIHtcbiAgICAgICAgLy8gTW9ub3JlcG8gdmVyaWZpY2F0aW9uIGNhbiBpbnZva2Ugb3hsaW50IGZyb20gZXZlcnkgd29ya3NwYWNlLiBHaXZlXG4gICAgICAgIC8vIG5vbi1jb2RlIHBhY2thZ2VzIGEgbG9jYWwgY29uZmlnIHNvIG94bGludCBkb2VzIG5vdCBjbGltYiB0byB0aGVcbiAgICAgICAgLy8gcm9vdCBjb25maWcgYW5kIHJlamVjdCByb290LW9ubHkgdHlwZS1hd2FyZSBvcHRpb25zIGZyb20gYSBwYWNrYWdlIGN3ZC5cbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZU94bGludENvbmZpZyhjb25maWcsIHJvb3RDb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnB5cmlnaHQpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZVB5cmlnaHRDb25maWdKc29uKGNvbmZpZykpO1xuICAgICAgfVxuICAgIH1cbiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuXG4gICAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSByb290Q29uZmlnLmlzQnVuID8gJ2J1bicgOiAneWFybic7XG4gICAgLy8gUmVmcmVzaCBsb2NrIGZpbGVzXG4gICAgaWYgKHJvb3RDb25maWcuaXNCdW4pIHtcbiAgICAgIGF3YWl0IGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdyZWZyZXNoQnVuTG9jaycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgIHJlZnJlc2hCdW5Mb2NrKHJvb3REaXJQYXRoKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnaW5zdGFsbCcsICctLW5vLWltbXV0YWJsZSddLCByb290RGlyUGF0aCk7XG4gICAgfVxuICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydjbGVhbnVwJ10sIHJvb3REaXJQYXRoKTtcblxuICAgIGF3YWl0IGluc3RhbGxBZ2VudFNraWxscyhyb290Q29uZmlnKTtcbiAgfVxuICBpZiAoaGFzSW52YWxpZFBhY2thZ2VDb25maWcpIHtcbiAgICBwcm9jZXNzLmV4aXRDb2RlID0gMTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZWZyZXNoQnVuTG9jayhyb290RGlyUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIC8vIHdiZnkgc2hvdWxkIHVwZGF0ZSBvbmx5IHRoZSBwYWNrYWdlcyBpdCBleHBsaWNpdGx5IG1hbmFnZXMgdGhyb3VnaCBidW4gYWRkLlxuICAvLyBSdW5uaW5nIGJ1biB1cGRhdGUgaGVyZSByZWZyZXNoZXMgdW5yZWxhdGVkIGFwcGxpY2F0aW9uIGRlcGVuZGVuY2llcyBhbmRcbiAgLy8gY2FuIGNoYW5nZSBwcm9kdWN0IGJlaGF2aW9yLCBzbyBrZWVwIHRoZSBleGlzdGluZyBsb2NrIGFuZCByZWNvbmNpbGUgaXQuXG4gIGNvbnN0IHN0YXR1cyA9IHNwYXduU3luY0FuZFJldHVyblN0YXR1cygnYnVuJywgWydpbnN0YWxsJ10sIHJvb3REaXJQYXRoKTtcbiAgaWYgKHN0YXR1cyAhPT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHJlZnJlc2ggQnVuIGxvY2tmaWxlOiBidW4gaW5zdGFsbCBleGl0ZWQgd2l0aCBzdGF0dXMgJHtzdGF0dXN9YCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0VmVyc2lvbigpOiBzdHJpbmcge1xuICBsZXQgcGFja2FnZUpzb25EaXIgPSBwYXRoLmRpcm5hbWUobmV3IFVSTChpbXBvcnQubWV0YS51cmwpLnBhdGhuYW1lKTtcbiAgd2hpbGUgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihwYWNrYWdlSnNvbkRpciwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgIHBhY2thZ2VKc29uRGlyID0gcGF0aC5kaXJuYW1lKHBhY2thZ2VKc29uRGlyKTtcbiAgfVxuICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihwYWNrYWdlSnNvbkRpciwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpKSBhcyB7XG4gICAgdmVyc2lvbjogc3RyaW5nO1xuICB9O1xuICByZXR1cm4gcGFja2FnZUpzb24udmVyc2lvbjtcbn1cblxuYXdhaXQgbWFpbigpO1xuIl0sIm5hbWVzIjpbImFzeW5jIiwic2xlZXAiLCJtaWxsaXNlY29uZHMiLCJQcm9taXNlIiwicmVzb2x2ZSIsInNldFRpbWVvdXQiLCJpZ25vcmVFcnJvckFzeW5jIiwiZm4iLCJpZ25vcmVFbm9lbnRBc3luYyIsImVycm9yIiwiY29kZSIsIm9wdGlvbnMiLCJpc1ZlcmJvc2UiLCJkb2VzVXBsb2FkRW52VmFycyIsImxvZ2dlciIsImZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24iLCJuYW1lIiwiZnVuYyIsImNvbnNvbGUiLCJpbmZvIiwiRXJyb3IiLCJzdGFjayIsIlN0cmluZyIsImZzVXRpbCIsInJlYWRGaWxlSWdub3JpbmdFcnJvciIsImZpbGVQYXRoIiwiZnMiLCJwcm9taXNlcyIsInJlYWRGaWxlIiwiZ2VuZXJhdGVGaWxlIiwiY29udGVudCIsIm1rZGlyIiwicGF0aCIsImRpcm5hbWUiLCJyZWN1cnNpdmUiLCJub3JtYWxpemVkQ29udGVudCIsInRyaW0iLCJ3cml0ZUZpbGUiLCJwcm9taXNlUG9vbCIsIlByb21pc2VQb29sIiwiZml4TmV4dENvbmZpZ0pzb24iLCJjb25maWciLCJtYXAiLCJleHQiLCJkaXJQYXRoIiwiZmluZCIsInAiLCJleGlzdHNTeW5jIiwib2xkQ29udGVudCIsIm9iamVjdExpdGVyYWwiLCJzb3VyY2UiLCJ0cyIsImNyZWF0ZVNvdXJjZUZpbGUiLCJTY3JpcHRUYXJnZXQiLCJMYXRlc3QiLCJTY3JpcHRLaW5kIiwiSlMiLCJ2aXNpdCIsIm5vZGUiLCJpc0V4cG9ydEFzc2lnbm1lbnQiLCJpc09iamVjdExpdGVyYWxFeHByZXNzaW9uIiwiZXhwcmVzc2lvbiIsImlzQmluYXJ5RXhwcmVzc2lvbiIsIm9wZXJhdG9yVG9rZW4iLCJraW5kIiwiU3ludGF4S2luZCIsIkVxdWFsc1Rva2VuIiwibGVmdCIsImdldFRleHQiLCJyaWdodCIsImZvckVhY2hDaGlsZCIsImdldE5leHRDb25maWdPYmplY3RMaXRlcmFsIiwicHJvcGVydHlUZXh0cyIsIlNldCIsInByb3BlcnRpZXMiLCJwcm9wZXJ0eSIsImhhcyIsInB1c2giLCJsZW5ndGgiLCJpbnNlcnRpb25Qb2ludCIsImdldEVuZCIsImxhc3RQcm9wZXJ0eSIsImF0IiwiaGFzVHJhaWxpbmdDb21tYSIsInNsaWNlIiwiaW5jbHVkZXMiLCJwcmVmaXgiLCJuZXdDb250ZW50Iiwiam9pbiIsInJ1biIsImRvZXNDb250YWluSnNPclRzIiwiZG9lc0NvbnRhaW5KYXZhU2NyaXB0IiwiZG9lc0NvbnRhaW5KYXZhU2NyaXB0SW5QYWNrYWdlcyIsImRvZXNDb250YWluVHlwZVNjcmlwdCIsImRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXMiLCJkb2VzQ29udGFpbkphdmEiLCJkb2VzQ29udGFpbkphdmFJblBhY2thZ2VzIiwiZ2V0UGFja2FnZU1hbmFnZXJDb21tYW5kIiwiaXNCdW4iLCJsaXRlcmFsIiwidmFsdWUiLCJhc09iamVjdCIsImV4dHJhTWVtYmVycyIsInRvUGFyc2VkT2JqZWN0IiwibWVtYmVyT3JkZXIiLCJPYmplY3QiLCJrZXlzIiwia2V5IiwiXyIsImluZGV4IiwiZml4UGxheXdyaWdodENvbmZpZyIsImVudkZpbGVQYXRoIiwiZW52RmlsZU5hbWVzIiwiZW52RmlsZVBhdGhzIiwiY3VycmVudERpclBhdGgiLCJmaWxlTmFtZSIsImdldEVudkZpbGVQYXRocyIsInRlc3QiLCJhc3NlcnROZXh0UHVibGljQmFzZVVybCIsImV4dHJhY3RlZE9iamVjdExpdGVyYWwiLCJUUyIsImZvdW5kIiwiaXNDYWxsRXhwcmVzc2lvbiIsImZpcnN0QXJndW1lbnQiLCJhcmd1bWVudHMiLCJ1bmRlZmluZWQiLCJleHRyYWN0RGVmaW5lQ29uZmlnT2JqZWN0TGl0ZXJhbCIsInBhcnNlZCIsInBhcnNlT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24iLCJtZXJnZWQiLCJtZXJnZVBhcnNlZE9iamVjdHMiLCJmb3JiaWRPbmx5IiwicmV0cmllcyIsInVzZSIsImJhc2VVUkwiLCJ0cmFjZSIsInNjcmVlbnNob3QiLCJ2aWRlbyIsIndlYlNlcnZlciIsImNvbW1hbmQiLCJnZXRXYlN0YXJ0VGVzdENvbW1hbmQiLCJ1cmwiLCJyZXVzZUV4aXN0aW5nU2VydmVyIiwidGltZW91dCIsInN0ZG91dCIsInN0ZGVyciIsImVudiIsImdyYWNlZnVsU2h1dGRvd24iLCJjcmVhdGVEZWZhdWx0Q29uZmlnIiwib2JqZWN0Iiwic2V0V2ViU2VydmVyQ29tbWFuZCIsIm5ld09iamVjdExpdGVyYWwiLCJzdHJpbmdpZnlWYWx1ZSIsInN0YXJ0IiwiZ2V0U3RhcnQiLCJlbmQiLCJiYXNlIiwib3ZlcnJpZGUiLCJvdmVycmlkZVByb3BlcnR5S2V5cyIsImZpbHRlciIsIm1lbWJlciIsImVudHJpZXMiLCJtZXJnZVBhcnNlZFZhbHVlIiwicGFyc2VFeHByZXNzaW9uIiwicGFyc2VkT2JqZWN0IiwiaXNBcnJheUxpdGVyYWxFeHByZXNzaW9uIiwiZWxlbWVudHMiLCJlbGVtZW50Iiwic29tZSIsImlzU2hvcnRoYW5kUHJvcGVydHlBc3NpZ25tZW50IiwiaXNQcm9wZXJ0eUFzc2lnbm1lbnQiLCJpc0lkZW50aWZpZXIiLCJpc1N0cmluZ0xpdGVyYWwiLCJpbml0aWFsaXplciIsImxldmVsIiwiY2xvc2luZ0luZGVudCIsInJlcGVhdCIsImluZGVudCIsIml0ZW0iLCJzdHJpbmdpZmllZCIsInNwbGl0IiwiZW1pdHRlZFByb3BlcnRpZXMiLCJsYXN0UHJvcGVydHlJbmRleEJ5S2V5IiwiTWFwIiwic2V0IiwiZ2V0TGFzdFByb3BlcnR5SW5kZXhCeUtleSIsImxpbmVzIiwiZmxhdE1hcCIsInN0cmluZ2lmeU9iamVjdE1lbWJlciIsImdldCIsImFkZCIsInN0cmluZ2lmeU9iamVjdFByb3BlcnR5IiwibGluZSIsImdsb2JJZ25vcmUiLCJmaXhQcmlzbWFFbnZGaWxlcyIsInNob3VsZEFkZENvbm5lY3Rpb25MaW1pdCIsImRlcGVuZGluZyIsInByaXNtYSIsImRlcGVuZGVuY2llcyIsInBhY2thZ2VKc29uIiwiZGV2RGVwZW5kZW5jaWVzIiwic2hvdWxkQWRkU3FsaXRlQ29ubmVjdGlvbkxpbWl0IiwiZW52RmlsZXMiLCJmZyIsImdsb2IiLCJkb3QiLCJjd2QiLCJpZ25vcmUiLCJlbnZGaWxlIiwicmVwbGFjZUFsbCIsIm1hdGNoIiwibm9ybWFsaXplU3FsaXRlRGF0YWJhc2VVcmwiLCJxdWVyeVN0YXJ0IiwiaW5kZXhPZiIsInBhdGhQYXJ0IiwicXVlcnlQYXJ0IiwicGFyYW1zIiwiVVJMU2VhcmNoUGFyYW1zIiwiZGVsZXRlIiwibm9ybWFsaXplZFF1ZXJ5IiwidG9TdHJpbmciLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJzb3J0T2JqZWN0QnlLZXlOYW1lTGlzdCIsInNvcnRXaXRoIiwic29ydEZuIiwidG90YWwiLCJvYmplY3RLZXlzIiwic29ydCIsIklOREVOVF9SRUdFWCIsIklOREVOVF9UWVBFX1NQQUNFIiwic2hvdWxkSWdub3JlU2luZ2xlU3BhY2UiLCJpZ25vcmVTaW5nbGVTcGFjZXMiLCJpbmRlbnRUeXBlIiwibWFrZUluZGVudHNNYXAiLCJzdHJpbmciLCJpbmRlbnRzIiwicHJldmlvdXNJbmRlbnRUeXBlIiwicHJldmlvdXNTaXplIiwibWF0Y2hlcyIsIndlaWdodCIsImluZGVudERpZmZlcmVuY2UiLCJhYnNvbHV0ZUluZGVudERpZmZlcmVuY2UiLCJNYXRoIiwiYWJzIiwiZW5jb2RlSW5kZW50c0tleSIsImVudHJ5IiwiaW5kZW50QW1vdW50IiwiZGV0ZWN0SW5kZW50IiwiVHlwZUVycm9yIiwic2l6ZSIsImtleU9mTW9zdFVzZWRJbmRlbnQiLCJyZXN1bHQiLCJtYXhVc2VkIiwibWF4V2VpZ2h0IiwidXNlZENvdW50IiwiZ2V0TW9zdFVzZWRLZXkiLCJ0eXBlIiwiYW1vdW50IiwiaW5kZW50c0tleSIsIk51bWJlciIsIm1ha2VJbmRlbnRTdHJpbmciLCJkZXRlY3ROZXdsaW5lR3JhY2VmdWwiLCJuZXdsaW5lcyIsImNybGYiLCJuZXdsaW5lIiwiZGV0ZWN0TmV3bGluZSIsInBpcGUiLCJmbnMiLCJ4IiwiYXJncyIsInJlZHVjZSIsIm9uQXJyYXkiLCJBcnJheSIsImlzQXJyYXkiLCJvblN0cmluZ0FycmF5IiwiZXZlcnkiLCJ1bmlxIiwieHMiLCJzb3J0QXJyYXkiLCJhcnJheSIsInRvU29ydGVkIiwidW5pcUFuZFNvcnRBcnJheSIsIm9uT2JqZWN0IiwiZ2V0UHJvdG90eXBlT2YiLCJTeW1ib2wiLCJ0b1N0cmluZ1RhZyIsIml0ZXJhdG9yIiwiaXNQbGFpbk9iamVjdCIsInNvcnRPYmplY3RCeSIsImNvbXBhcmF0b3IiLCJkZWVwIiwib3ZlciIsImZyb21FbnRyaWVzIiwic29ydE9iamVjdEtleXMiLCJvYmplY3RHcm91cEJ5IiwiZ3JvdXBCeSIsImNhbGxiYWNrIiwiY3JlYXRlIiwic29ydE9iamVjdCIsInNvcnRVUkxPYmplY3QiLCJzb3J0UGVvcGxlT2JqZWN0Iiwic29ydERpcmVjdG9yaWVzIiwib3ZlclByb3BlcnR5IiwiaGFzT3duIiwic29ydEdpdEhvb2tzIiwicGFyc2VOYW1lQW5kVmVyc2lvblJhbmdlIiwic3BlY2lmaWVyIiwibmFtZUFuZFZlcnNpb24iLCJhdE1hdGNoZXMiLCJtYXRjaEFsbCIsInNwbGl0SW5kZXgiLCJwb3AiLCJzdWJzdHJpbmciLCJyYW5nZSIsInNvcnRPYmplY3RCeVNlbXZlciIsImEiLCJiIiwiYU5hbWUiLCJhUmFuZ2UiLCJiTmFtZSIsImJSYW5nZSIsImxvY2FsZUNvbXBhcmUiLCJzZW12ZXJDb21wYXJlIiwic2VtdmVyTWluVmVyc2lvbiIsImdldFBhY2thZ2VOYW1lIiwiaWRlbnQiLCJzdGFydHNXaXRoIiwiY2FjaGUiLCJzaG91bGRTb3J0RGVwZW5kZW5jaWVzTGlrZU5wbSIsInBhY2thZ2VNYW5hZ2VyIiwiZGV2RW5naW5lcyIsInBucG0iLCJlbmdpbmVzIiwibnBtIiwicHJvY2VzcyIsImhhc1lhcm5PclBucG1GaWxlcyIsInNvcnREZXBlbmRlbmNpZXMiLCJzb3J0V29ya3NwYWNlcyIsInNvcnRFc2xpbnRDb25maWciLCJvdmVycmlkZXMiLCJydWxlMSIsInJ1bGUyIiwic29ydFZTQ29kZUJhZGdlT2JqZWN0Iiwic29ydFByZXR0aWVyQ29uZmlnIiwic29ydFZvbHRhIiwic29ydERldkVuZ2luZXMiLCJzb3J0UG5wbUNvbmZpZyIsImRlZmF1bHROcG1TY3JpcHRzIiwiaGFzRGV2RGVwZW5kZW5jeSIsImRlcGVuZGVuY3kiLCJydW5TUmVnRXhwIiwiaGFzU2VxdWVudGlhbFNjcmlwdCIsImZpZWxkIiwidmFsdWVzIiwic2NyaXB0IiwiaXNTZXF1ZW50aWFsU2NyaXB0Iiwic29ydFNjcmlwdE5hbWVzIiwiZ3JvdXBNYXAiLCJpZHgiLCJmcm9tIiwiZ3JvdXBLZXkiLCJjaGlsZHJlbiIsImsiLCJzb3J0U2NyaXB0cyIsInNjcmlwdHMiLCJuYW1lcyIsInByZWZpeGFibGUiLCJvbWl0dGVkIiwicmVwbGFjZSIsInNvcnRDb25kaXRpb25zIiwiY29uZGl0aW9ucyIsImRlZmF1bHRDb25kaXRpb25zIiwicmVzdENvbmRpdGlvbnMiLCJjb25kaXRpb24iLCJzb3J0RXhwb3J0cyIsImV4cG9ydHMiLCJwYXRocyIsImZpZWxkcyIsIm1haW50YWluZXJzIiwiY29udHJpYnV0b3JzIiwicGFja2FnZU5hbWVBIiwicGFja2FnZU5hbWVCIiwiYmFkZ2UiLCJkZWZhdWx0U29ydE9yZGVyIiwib3ZlckZpZWxkcyIsIkJvb2xlYW4iLCJzb3J0UGFja2FnZUpzb24iLCJqc29uSXNoIiwianNvbiIsImVuZENoYXJhY3RlcnMiLCJKU09OIiwicGFyc2UiLCJzdHJpbmdpZnkiLCJlZGl0U3RyaW5nSlNPTiIsInNvcnRPcmRlciIsInByaXZhdGVLZXlzIiwicHVibGljS2V5cyIsImZpeFRlc3REaXJlY3Rvcmllc1VwZGF0aW5nUGFja2FnZUpzb24iLCJwYWNrYWdlRGlyUGF0aHMiLCJhbGwiLCJwYWNrYWdlSnNvblBhdGgiLCJwYWNrYWdlRGlyUGF0aCIsIm5ld1Rlc3REaXJQYXRoIiwib2xkVGVzdERpck5hbWUiLCJvbGRUZXN0RGlyUGF0aCIsIm1vdmVUZXN0RGlyZWN0b3J5IiwiZGlkVXBkYXRlU2NyaXB0Iiwic2NyaXB0TmFtZSIsIm5ld1NjcmlwdCIsInJlbmFtZSIsImRpcmVudHMiLCJyZWFkZGlyIiwid2l0aEZpbGVUeXBlcyIsIm9sZFBhdGgiLCJkaXJlbnQiLCJuZXdQYXRoIiwibmV3UGF0aFN0YXQiLCJzdGF0IiwiaXNEaXJlY3RvcnkiLCJybSIsImZpeFR5cGVEZWZpbml0aW9ucyIsImNvbmZpZ3NJbmNsdWRpbmdDaGlsZHJlbiIsImxpYlR5cGVEaXJQYXRoIiwic3JjVHlwZURpclBhdGgiLCJpc1Jvb3QiLCJkb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucyIsImRpck5hbWUiLCJoYXNUeXBlRGVjbGFyYXRpb25FeHRlbnNpb24iLCJlbmRzV2l0aCIsInBhY2thZ2VOYW1lIiwiaGFzTGlicmFyeSIsImlzRmlsZSIsIm92ZXJ3cml0ZU1lcmdlIiwiZGVzdGluYXRpb25BcnJheSIsInNvdXJjZUFycmF5IiwiY29tYmluZU1lcmdlIiwidGFyZ2V0IiwiZGVzdGluYXRpb24iLCJjbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZCIsImlzTWVyZ2VhYmxlT2JqZWN0IiwibWVyZ2UiLCJzb3J0S2V5cyIsIm9iaiIsImtleUFuZFZhbHVlcyIsImtleTEiLCJrZXkyIiwicHVibGljUmVwb0F1dG9maXhXb3JrZmxvdyIsIm9uIiwicHVsbF9yZXF1ZXN0IiwiYnJhbmNoZXMiLCJwZXJtaXNzaW9ucyIsImNvbnRlbnRzIiwiY29uY3VycmVuY3kiLCJncm91cCIsImpvYnMiLCJhdXRvZml4IiwicHJpdmF0ZVJlcG9BdXRvZml4V29ya2Zsb3ciLCJ1c2VzIiwid29ya2Zsb3dzIiwicmVsZWFzZSIsInB1bGxfcmVxdWVzdF90YXJnZXQiLCJ0eXBlcyIsInN5bmMiLCJnZW5lcmF0ZVdvcmtmbG93cyIsInJvb3RDb25maWciLCJpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyIsInJlcG9zaXRvcnkiLCJ3b3JrZmxvd3NQYXRoIiwic2VtYW50aWNZbWxQYXRoIiwiZm9yY2UiLCJpc09ic29sZXRlR2VuUHJXb3JrZmxvd0ZpbGVOYW1lIiwiZmlsZU5hbWVTZXQiLCJzZW1hbnRpY1JlbGVhc2UiLCJiYXNlbmFtZSIsIndyaXRlV29ya2Zsb3dZYW1sIiwiZGVwbG95UHJvZHVjdGlvbldvcmtmbG93RXhpc3RzIiwid3JpdGVZYW1sIiwiaXNQdWJsaWNSZXBvIiwic3RydWN0dXJlZENsb25lIiwic3RlcHMiLCJ3aXRoIiwiYnVpbGQiLCJhdXRvZml4V29ya2Zsb3ciLCJhdXRvZml4Sm9iIiwiZ2VuZXJhdGVBdXRvZml4V29ya2Zsb3ciLCJuZXdTZXR0aW5ncyIsIm9sZFNldHRpbmdzIiwieWFtbCIsImxvYWQiLCJhcnJheU1lcmdlIiwibW92ZVRvQm90dG9tIiwiYWN0aW9ucyIsInRyaWdnZXJfZGVwbG95X3dvcmtmbG93IiwiaXNSZXVzYWJsZVdvcmtmbG93Iiwiam9iIiwibm9ybWFsaXplSm9iIiwic2NoZWR1bGUiLCJicmFuY2giLCJzeW5jX3BhcmFtc193aXRob3V0X2Rlc3QiLCJ3b3JrZmxvd19kaXNwYXRjaCIsInNlY3JldHMiLCJOUE1fVE9LRU4iLCJHSF9UT0tFTiIsIkZJUkVCQVNFX1RPS0VOIiwiR0NQX1NBX0tFWV9KU09OX0ZPUl9GSVJFQkFTRSIsIkRJU0NPUkRfV0VCSE9PS19VUkwiLCJzZXJ2ZXJfdXJsIiwiZG90X2Vudl9wYXRoIiwiRkxZX0FQSV9UT0tFTiIsImRlcGxveV9jb21tYW5kIiwiZG9lc0NvbnRhaW5Eb2NrZXJmaWxlIiwiY2lfbGFiZWwiLCJnaXRodWJfaG9zdGVkX3J1bm5lciIsIm5ld1NlY3JldHMiLCJ5YW1sVGV4dCIsImR1bXAiLCJsaW5lV2lkdGgiLCJub0NvbXBhdE1vZGUiLCJzdHlsZXMiLCJmaXhUeXBvcyIsInBhY2thZ2VDb25maWciLCJkb2NGaWxlcyIsIm1kRmlsZSIsImZpeFR5cG9zSW5UZXh0IiwicmVwbGFjZVdpdGhDb25maWciLCJ0c0ZpbGVzIiwidHNGaWxlIiwiY29tbWVudCIsInRleHRCYXNlZEZpbGVzIiwiZmlsZSIsInByb21pc2VBbGwiLCJwcm9wTmFtZSIsImJlZm9yZSIsImFmdGVyIiwid2JmeUpzb24iLCJ0eXBvcyIsImdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbnMiLCJhbGxDb25maWdzIiwiYWdlbnRzRXh0cmFQYXRoIiwiZXh0cmFDb250ZW50IiwidG9vbE5hbWUiLCJnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb24iLCJjdXJzb3JSdWxlc1BhdGgiLCJjdXJzb3JSdWxlc0NvbnRlbnQiLCJmcm9udG1hdHRlciIsImJvZHkiLCJnZW5lcmF0ZUN1cnNvckdlbmVyYWxNZGNDb250ZW50IiwiYmFzZUNvbnRlbnQiLCJkZXNjcmlwdGlvbiIsImlzV2lsbEJvb3N0ZXJSZXBvIiwiY29uZmlncyIsInBsYXl3cmlnaHRUZXN0IiwiZ2VuZXJhdGVBZ2VudENvZGluZ1N0eWxlIiwiaGFzTmV3U2VjdGlvbiIsImMiLCJnZW5JMThuVHMiLCJyZWFjdCIsIm5leHQiLCJtaW5pbXVtUmVsZWFzZUFnZUV4Y2x1ZGVzIiwiZ2VuZXJhdGVCdW5maWdUb21sIiwiZXhpc3RpbmdDb250ZW50IiwicmVhZEZpbGVTeW5jIiwiYnVuZmlnVG9tbCIsInBhcnNlQnVuZmlnVG9tbCIsImJ1biIsImdlbmVyYXRlUnVuU2VjdGlvbiIsImluc3RhbGwiLCJleGFjdCIsInVzZXJDb250ZW50SGVhZGVyIiwidXNlckNvbnRlbnRIZWFkZXJSZWdleCIsInNlcGFyYXRvciIsImRlZmF1bHRIZWFkVXNlckNvbnRlbnQiLCJkZWZhdWx0VGFpbFVzZXJDb250ZW50IiwiaWdub3JlRmlsZVV0aWwiLCJzZXBhcmF0b3JQcmVmaXgiLCJyZWFkR2l0aWdub3JlV2l0aG91dFNlcGFyYXRvcnMiLCJsYXN0SGVhZGVySW5kZXgiLCJnZXRJbmRleE9mVGFpbFVzZXJDb250ZW50SGVhZGVyIiwiZ2V0SGVhZFVzZXJDb250ZW50IiwidGhpcyIsImdldFRhaWxVc2VyQ29udGVudCIsImlzQmVycnlaZXJvSW5zdGFsbEVuYWJsZWQiLCJsYXN0SW5kZXgiLCJsYXN0SW5kZXhPZiIsImdlbmVyYXRlRG9ja2VyaWdub3JlIiwiZXh0ZW5zaW9ucyIsImNvZGVXaXRoMkluZGVudFNpemUiLCJjb2RlV2l0aDRJbmRlbnRTaXplIiwibWFya2Rvd25MaWtlIiwib3hsaW50Iiwib3hmbXQiLCJwcmV0dGllck9ubHkiLCJnZW5lcmF0ZUV4dGVuc2lvbnMiLCJnZW5lcmF0ZUVkaXRvcmNvbmZpZyIsImRlZmF1bHRDb25maWciLCJoYXZlX2Z1biIsImNvZGVfcmV2aWV3IiwiZGlzYWJsZSIsImNvbW1lbnRfc2V2ZXJpdHlfdGhyZXNob2xkIiwibWF4X3Jldmlld19jb21tZW50cyIsInB1bGxfcmVxdWVzdF9vcGVuZWQiLCJoZWxwIiwic3VtbWFyeSIsImlnbm9yZV9wYXR0ZXJucyIsImdlbmVyYXRlR2VtaW5pQ29uZmlnIiwiY29uZmlnRmlsZVBhdGgiLCJzdHlsZWd1aWRlRmlsZVBhdGgiLCJuZXdDb25maWciLCJvbGRDb25maWciLCJ5YW1sQ29udGVudCIsImNvZGluZ1J1bGVFeHRyYUNvbnRlbnQiLCJ0cmltU3RhcnQiLCJzdHlsZWd1aWRlQ29udGVudCIsInRyaW1FbmQiLCJyZW1vdmVHZW1pbmlTZXR0aW5ncyIsImdlbmVyYXRlR2l0YXR0cmlidXRlcyIsImRlZmF1bHROYW1lcyIsImdlbmVyYXRlR2l0aWdub3JlIiwiaGVhZFVzZXJDb250ZW50IiwidGFpbFVzZXJDb250ZW50IiwiZG9lc0NvbnRhaW5HZW1maWxlIiwiZG9lc0NvbnRhaW5Hb01vZCIsImRvZXNDb250YWluUGFja2FnZUpzb24iLCJkb2VzQ29udGFpblBvbVhtbCIsImRvZXNDb250YWluUHVic3BlY1lhbWwiLCJkb2VzQ29udGFpblRlbXBsYXRlWWFtbCIsImRvZXNDb250YWluUG9ldHJ5TG9jayIsImRvZXNDb250YWluVXZMb2NrIiwiYmxpdHoiLCJmaXJlYmFzZSIsInJlYWN0TmF0aXZlIiwic3Rvcnlib29rIiwibGl0ZXN0cmVhbSIsImdlbmVyYXRlZCIsInJlYWRDYWNoZSIsInJlc3BvbnNlIiwiZmV0Y2giLCJyZXNwb25zZVRleHQiLCJ0ZXh0Iiwib2siLCJ3cml0ZUNhY2hlIiwib3MiLCJob21lZGlyIiwiRGF0ZSIsIm5vdyIsIm10aW1lTXMiLCJveGZtdFByb2dyYW0iLCJwcmV0dGllclByb2dyYW0iLCJnZW5lcmF0ZUlkZWFTZXR0aW5ncyIsInRhc2tPcHRpb25zIiwicHJvZ3JhbSIsInRhc2siLCJjcmVhdGVUYXNrT3B0aW9ucyIsInJ1bm5lciIsImV4dGVuc2lvbiIsImdldFdhdGNoZXJUYXNrc0NvbnRlbnQiLCJnZXRHZW5JMThuVHNDb21tYW5kIiwic3Bhd25TeW5jIiwicmV0cnkiLCJzcGF3blN5bmNBbmRSZXR1cm5TdGF0dXMiLCJuZXdDbWQiLCJuZXdBcmdzIiwiZ2V0U3Bhd25TeW5jQXJncyIsInN0YXR1cyIsImNoaWxkX3Byb2Nlc3MiLCJzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQiLCJzdGRpbyIsInByb2MiLCJzIiwibWVzc2FnZSIsIlBBVEgiLCJCRVJSWV9CSU5fRk9MREVSIiwiZW5jb2RpbmciLCJzaGVsbCIsImdpdEh1YlV0aWwiLCJnZXRPcmdBbmROYW1lIiwidXJsT3JGdWxsTmFtZSIsInVybFdpdGhvdXRQcm90b2NvbCIsIm9jdG9raXRDYWNoZSIsImdldE9jdG9raXQiLCJvd25lciIsImNhY2hlZCIsIm9jdG9raXQiLCJPY3Rva2l0IiwiYXV0aCIsImdldEdpdEh1YlRva2VuIiwiaGFzR2l0SHViVG9rZW4iLCJHSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUiIsImdldEdpdEh1YkNsaVRva2VuIiwiR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVJMQUIiLCJHSVRIVUJfVE9LRU4iLCJnaXRIdWJDbGlUb2tlbiIsImNoaWxkUHJvY2VzcyIsImV4ZWNGaWxlU3luYyIsIm1hbmFnZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMiLCJpc1B1Ymxpc2hlZFdpbGxib29zdGVyQ29uZmlnc1BhY2thZ2UiLCJpc1dpbGxCb29zdGVyQ29uZmlncyIsInByaXZhdGUiLCJmaWxlcyIsIm94bGludERlcHMiLCJ0eXBlc2NyaXB0R29EZXBlbmRlbmN5IiwidHlwZXNjcmlwdERlcGVuZGVuY3kiLCJ3YkRlcGVuZGVuY3kiLCJidWlsZFRzRGVwZW5kZW5jeSIsIndpbGxCb29zdGVyQ29uZmlnc01hbmFnZWREZXBlbmRlbmNpZXMiLCJvYnNvbGV0ZUxpbnREZXBlbmRlbmNpZXMiLCJtaWNyb21hdGNoUGFja2FnZU5hbWVzIiwibWljcm9tYXRjaEltcG9ydFBhdHRlcm4iLCJsYXRlc3REZXBlbmRlbmN5VmVyc2lvbkNhY2hlIiwiZGVwZW5kZW5jeVNlY3Rpb25LZXlzIiwiZ2VuZXJhdGVQYWNrYWdlSnNvbiIsInNraXBBZGRpbmdEZXBzIiwianNvbk9iaiIsImpzb25UZXh0IiwicGVlckRlcGVuZGVuY2llcyIsInJlYWRQYWNrYWdlSnNvbiIsImF1dGhvciIsInNlY3Rpb24iLCJnZXREZXBlbmRlbmN5U2VjdGlvbnMiLCJSZWZsZWN0IiwiZGVsZXRlUHJvcGVydHkiLCJyZW1vdmVTZWxmRGVwZW5kZW5jeSIsInZlcnNpb24iLCJpc1dvcmtzcGFjZVByb3RvY29sUmFuZ2UiLCJnZXRMYXRlc3REZXBlbmRlbmN5VmVyc2lvbiIsInJlcGxhY2VXaWxsQm9vc3RlckNvbmZpZ3NXb3Jrc3BhY2VEZXBlbmRlbmN5UmFuZ2VzIiwidHNsaWIiLCJsZXJuYSIsInBpbnN0IiwicHJldHRpZXIiLCJzZWN0aW9ucyIsInJlbW92ZVdpbGxCb29zdGVyQ29uZmlnc01hbmFnZWREZXBlbmRlbmNpZXMiLCJwcmVzZXJ2ZU1pY3JvbWF0Y2giLCJmaWxlUGF0aHMiLCJnbG9iU3luYyIsImRvZXNQcm9kdWN0Q29kZUltcG9ydE1pY3JvbWF0Y2giLCJzaG91bGRQcmVzZXJ2ZU1pY3JvbWF0Y2giLCJzaG91bGRQcmVzZXJ2ZUNvbmZpZ1BhY2thZ2VMaW50RGVwZW5kZW5jeSIsInJlbW92ZU9ic29sZXRlTGludERlcGVuZGVuY2llcyIsInJlbW92ZURlcHJlY2F0ZWRTdHVmZiIsInJlbW92ZUxlZ2FjeUluc3RhbGxDb21tYW5kcyIsImdlbmVyYXRlU2NyaXB0cyIsInByZXR0aWZ5IiwiY2F0Y2giLCJvcmlnaW5hbENvbnRlbnQiLCJuZXdMaW5lIiwibCIsImdlbmVyYXRlUHJldHRpZXJTdWZmaXgiLCJub3JtYWxpemVZYXJuV29ya3NwYWNlRm9yZWFjaFNjcmlwdHMiLCJ1cGRhdGVTY3JpcHRzIiwibW92ZU1hbmFnZWRUb29sRGVwZW5kZW5jaWVzVG9EZXZEZXBlbmRlbmNpZXMiLCJkZXBlbmRlbmN5VXBkYXRlcyIsInB5dGhvbkRldkRlcGVuZGVuY2llcyIsImhhc0phdmEiLCJkZXBlbmRlbmN5U2VjdGlvbnMiLCJyZW1vdmVQcmV0dGllckFydGlmYWN0cyIsImh1c2t5IiwicG9zdGluc3RhbGwiLCJwb3N0cHVibGlzaCIsInByZXB1Ymxpc2hPbmx5IiwicHJlcGFjayIsInBvc3RwYWNrIiwicHJlcGFyZSIsImFydGlsbGVyeSIsInBsYXl3cmlnaHQiLCJ3b3Jrc3BhY2VzIiwid29ya3NwYWNlIiwiaXNXYlBhY2thZ2UiLCJ3YiIsInRzY29uZmlnQmFzZURlcGVuZGVuY2llcyIsImdldFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyIsInVzZWREZXBlbmRlbmNpZXMiLCJ1c2VkRGVwZW5kZW5jeVNldCIsImV4aXN0aW5nVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzIiwiYWJzb2x1dGVGaWxlUGF0aCIsInBhcnNlQ29uZmlnRmlsZVRleHRUb0pzb24iLCJ3YXJuIiwiZm9ybWF0VHNEaWFnbm9zdGljIiwibm9ybWFsaXplVHNjb25maWdFeHRlbmRzIiwiZXh0ZW5kcyIsImdldEV4aXN0aW5nVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzIiwicmVtb3ZlVW51c2VkVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzIiwiamVzdCIsImRlcCIsImFwcGx5UGFja2FnZUpzb25Db252ZW50aW9ucyIsImxpY2Vuc2UiLCJwdWJsaXNoQ29uZmlnIiwiYWNjZXNzIiwiY29uZmlnTWpzUGF0aCIsImNvbmZpZ0R0c1BhdGgiLCJjb25maWdEbXRzQ29udGVudCIsIm5vcm1hbGl6ZVB1Ymxpc2hlZENvbmZpZ1BhY2thZ2VNZXRhZGF0YSIsIm1haW4iLCJyZXNvbHV0aW9ucyIsImxpbnQiLCJkaXJzIiwiZGlyIiwiZm9ybWF0IiwiYXBwZW5kRm9ybWF0Q29kZUNvbW1hbmQiLCJweXRob25QYWNrYWdlTWFuYWdlciIsImdldFB5dGhvblBhY2thZ2VNYW5hZ2VyIiwicHl0aG9uRmlsZXMiLCJkaXJOYW1lU2V0IiwicHl0aG9uRmlsZSIsImZpcnN0Iiwic2Vjb25kIiwiZGlyTmFtZXNTdHIiLCJweXRob25SdW5uZXIiLCJleGlzdGluZ1JlcG9zaXRvcnkiLCJub3JtYWxpemVkUmVwb3NpdG9yeSIsIm5vcm1hbGl6ZVJlcG9zaXRvcnlVcmxGb3JQYWNrYWdlSnNvbiIsImJ1aWxkTm9ybWFsaXplZFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbiIsIm5vcm1hbGl6ZWRFeGlzdGluZ1JlcG9zaXRvcnkiLCJmb3JtYXRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24iLCJhZGRHZW5JMThuVHNQb3N0aW5zdGFsbFNjcmlwdCIsIm5vcm1hbGl6ZVBhY2thZ2VNZXRhZGF0YSIsInBhY2thZ2VKc29uRGVwZW5kZW5jaWVzIiwicGFja2FnZUpzb25EZXZEZXBlbmRlbmNpZXMiLCJhZGRQYWNrYWdlSnNvbkRlcGVuZGVuY2llcyIsImFkZERlcGVuZGVuY3lWZXJzaW9uc1RvUGFja2FnZUpzb24iLCJwYWNrYWdlTmFtZXMiLCJwcml2YXRlUGFja2FnZXMiLCJyZXBvIiwiaXNXb3Jrc3BhY2VQYWNrYWdlIiwib3RoZXJUYXJnZXQiLCJjb21taXRIYXNoIiwib3JnYW5pemF0aW9uIiwicmVqZWN0IiwiZ2V0TGF0ZXN0Q29tbWl0SGFzaCIsImdldExhdGVzdFByaXZhdGVQYWNrYWdlU3BlY2lmaWVyIiwidXBkYXRlUHJpdmF0ZVBhY2thZ2VzIiwicmVtb3ZlRW1wdHlEZXBlbmRlbmN5U2VjdGlvbnMiLCJzZXJpYWxpemVQYWNrYWdlSnNvbiIsImluc3RhbGxOcG1EZXBlbmRlbmNpZXMiLCJpbnN0YWxsRGVwZW5kZW5jeVVwZGF0ZXMiLCJyZWxhdGl2ZUZpbGVQYXRoIiwicmVsYXRpdmUiLCJmb3JtYXRQYWNrYWdlSnNvbldpdGhQcm9qZWN0Rm9ybWF0dGVyIiwiY29yZSIsImZvcm1hdFNjcmlwdCIsInNjcmlwdFJ1bm5lciIsImRldiIsImRlcGVuZGVuY3lTcGVjaWZpZXJzIiwiY3VycmVudFZlcnNpb24iLCJnZXREZXBlbmRlbmN5U3BlY2lmaWVyIiwiZ2V0SW5zdGFsbERlcGVuZGVuY3lTcGVjaWZpZXIiLCJkZXBlbmRlbmNpZXNUb0luc3RhbGwiLCJzaG91bGRVcGRhdGVFeGlzdGluZ0RlcGVuZGVuY3kiLCJzaG91bGRVcGRhdGVFeGlzdGluZ01hbmFnZWREZXBlbmRlbmN5IiwiZGlhZ25vc3RpYyIsImZsYXR0ZW5EaWFnbm9zdGljTWVzc2FnZVRleHQiLCJtZXNzYWdlVGV4dCIsImNhY2hlZFZlcnNpb24iLCJnZXREZXBlbmRlbmN5VmVyc2lvbkZyb21OcG0iLCJlc2xpbnQiLCJsYXRlc3RWZXJzaW9uIiwidmFsaWRMYXRlc3RWZXJzaW9uIiwic2VtdmVyIiwidmFsaWQiLCJ2YWxpZEN1cnJlbnRWZXJzaW9uIiwiZ3QiLCJpc05ld2VyTWFuYWdlZERlcGVuZGVuY3lWZXJzaW9uIiwicmVwb3NpdG9yeVVybCIsIm1hdGNoZWQiLCJleGVjIiwibm9ybWFsaXplZFVybCIsIm9sZFNjcmlwdHMiLCJoYXNUeXBlY2hlY2siLCJjbGVhbnVwIiwidHlwZWNoZWNrIiwidmVyaWZ5IiwiYXBwbHlNaXNlVGFza1NjcmlwdHMiLCJweXJpZ2h0IiwiaGFzSnNPclRzIiwib2xkVGVzdCIsImdlbmVyYXRlRm9ybWF0U2NyaXB0IiwiaGFzTWlzZVRhc2siLCJkb2VzTWlzZVRhc2tDYWxsUGFja2FnZVNjcmlwdCIsImlzV2JmeU1hbmFnZWRNaXNlQnJpZGdlIiwibWlzZVRhc2tzIiwiUmVnRXhwIiwicmF3IiwiY29tbWFuZHMiLCJiYXNlU2V0dGluZ3MiLCJnbG9iX21hdGNoZXIiLCJwcmVDb21taXRTZXR0aW5ncyIsInN0YWdlX2ZpeGVkIiwiZ2VuZXJhdGVMZWZ0aG9va1VwZGF0aW5nUGFja2FnZUpzb24iLCJodXNreURpclBhdGgiLCJoYXNIdXNreURpciIsInNldHRpbmdzIiwiZ2V0UHJlQ29tbWl0Sm9icyIsInByZVB1c2giLCJsaW50Q29tbWFuZCIsInF1aWV0TGludENvbW1hbmQiLCJnZXRQcmVQdXNoU2NyaXB0IiwibWtkaXJTeW5jIiwibW9kZSIsInBvc3RNZXJnZUNvbW1hbmQiLCJwb3N0TWVyZ2VDb21tYW5kcyIsImhhc1ZlcnNpb25TZXR0aW5ncyIsInRvb2xzQ2hhbmdlZFBhdHRlcm4iLCJpbnN0YWxsQ29tbWFuZCIsInJtTmV4dERpcmVjdG9yeSIsImdlbkkxOG5Uc0NvbW1hbmQiLCJnZW5lcmF0ZVBvc3RNZXJnZUNvbW1hbmRzIiwiZ2V0Q2xlYW51cEdsb2JzIiwiZ2V0Q2xlYW51cENvbW1hbmQiLCJzdXBwb3J0ZWRFeHRlbnNpb25zIiwibG9jYWxXYlBhY2thZ2VKc29uUGF0aCIsImhhc0xvY2FsV2JXb3Jrc3BhY2UiLCJjYW5Vc2VXYkZvclN0YWdlZEZpbGVzIiwib3hsaW50UGF0dGVybiIsIm94Zm10UGF0dGVybiIsInByZXR0aWVyUGF0dGVybiIsImhhc1B5dGhvblBhY2thZ2VNYW5hZ2VyIiwiZ2V0UHl0aG9uUnVubmVyIiwiZ2VuZXJhdGVMaW50c3RhZ2VkcmMiLCJub3JtYWxpemVDb25maWdDb250ZW50IiwiTWFuYWdlZENvbmZpZ0Jsb2NrcyIsImNvbnN0cnVjdG9yIiwiYmxvY2tOYW1lcyIsIm1hcmtlclByZWZpeCIsImdldENvbmZpZ0NvbnRlbnQiLCJoYXNNYW5hZ2VkQmxvY2tzIiwicmVwbGFjZU1hbmFnZWRCbG9ja3MiLCJkZXNpcmVkQ29udGVudCIsImdldEJsb2NrIiwiYmxvY2tOYW1lIiwiZ2V0U3RhcnRNYXJrZXIiLCJnZXRFbmRNYXJrZXIiLCJyZXBsYWNlbWVudCIsImV4dHJhY3RNYW5hZ2VkQmxvY2siLCJuZXh0Q29udGVudCIsInJlcGxhY2VNYW5hZ2VkQmxvY2siLCJnZXRNYW5hZ2VkQmxvY2tSZWdFeHAiLCJwYXR0ZXJuIiwiZXNjYXBlUmVnRXhwIiwibWFuYWdlZENvbmZpZ0Jsb2NrcyIsImdlbmVyYXRlT3hmbXRDb25maWciLCJsZWdhY3lKc29uQ29uZmlnUGF0aCIsImlzRXNtUGFja2FnZSIsImdlbmVyYXRlT3hsaW50Q29uZmlnIiwiX3Jvb3RDb25maWciLCJzaG91bGRQcmVzZXJ2ZVB1Ymxpc2hlZExpbnRlckNvbmZpZyIsImlzUm9vdENvbmZpZyIsImdldFJlc29sdmVkQ29uZmlnQ29udGVudCIsImJhc2VDb25maWdOYW1lIiwiZ2VuZXJhdGVQcmV0dGllcmlnbm9yZSIsImdpdGlnbm9yZUZpbGVQYXRoIiwiZ2l0aWdub3JlQ29udGVudCIsImFkZGl0aW9uYWxDb250ZW50IiwidmVudlBhdGgiLCJ2ZW52IiwiZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbiIsImdlbmVyYXRlUmVhZG1lIiwiaW5zZXJ0QmFkZ2UiLCJmaWxlTmFtZXMiLCJyZWFkZGlyU3luYyIsImJhZGdlTmFtZSIsInRvVXBwZXJDYXNlIiwicmVtb3ZlR2l0SHViQWN0aW9uc0JhZGdlIiwicmVhZG1lIiwiaSIsImVzY2FwZWRCYWRnZU5hbWUiLCJlc2NhcGVkRmlsZU5hbWUiLCJnZW5lcmF0ZVJlbGVhc2VyYyIsInBsdWdpbnMiLCJwbHVnaW5FbnRyeSIsInBsdWdpbiIsInByZXNldCIsInN1Y2Nlc3NDb21tZW50Q29uZGl0aW9uIiwiZmFpbENvbW1lbnRDb25kaXRpb24iLCJsYWJlbHMiLCJyZWxlYXNlZExhYmVscyIsIiRzY2hlbWEiLCJnZW5lcmF0ZVJlbm92YXRlSnNvbiIsInBhY2thZ2VSdWxlcyIsInJ1bGUiLCJtYXRjaFBhY2thZ2VOYW1lcyIsImVuYWJsZWQiLCJpbnN0YWxsQWdlbnRTa2lsbHMiLCJyb290SnNvbk9iaiIsImNvbXBpbGVyT3B0aW9ucyIsImFsd2F5c1N0cmljdCIsIm5vVW5jaGVja2VkSW5kZXhlZEFjY2VzcyIsImFsbG93U3ludGhldGljRGVmYXVsdEltcG9ydHMiLCJlc01vZHVsZUludGVyb3AiLCJyZXNvbHZlSnNvbk1vZHVsZSIsImltcG9ydEhlbHBlcnMiLCJub0VtaXQiLCJleGNsdWRlIiwiaW5jbHVkZSIsInN1Ykpzb25PYmoiLCJnZW5lcmF0ZVRzY29uZmlnIiwibW9kdWxlUmVzb2x1dGlvbiIsIm5vcm1hbGl6ZU5leHRUc2NvbmZpZ01vZHVsZVNldHRpbmdzIiwiYmFzZVVybCIsImFsaWFzIiwidGFyZ2V0cyIsIm5vcm1hbGl6ZVBhdGhBbGlhc1RhcmdldHMiLCJub3JtYWxpemVOZXh0VHNjb25maWdQYXRoQWxpYXNlcyIsImFkZFNjcmlwdHNJbmNsdWRlRm9yRnJhbWV3b3JrUHJvamVjdCIsImNsZWFudXBMZWdhY3lUc2NvbmZpZ01vZHVsZVNldHRpbmdzIiwiZ2VuZXJhdGVkVHlwZXMiLCJ0eXBlTmFtZXMiLCJ2aXRlc3QiLCJtb2NoYSIsImN5cHJlc3MiLCJnZXRHZW5lcmF0ZWRUeXBlcyIsImdldFRzY29uZmlnRXh0ZW5kcyIsInJvb3REaXIiLCJnZXRSb290RGlyIiwiZG9lc0NvbnRhaW5Kc3hPclRzeCIsImRvZXNDb250YWluSnN4T3JUc3hJblBhY2thZ2VzIiwianN4IiwiYWRkSW5jbHVkZVBhdGgiLCJleGlzdGluZ1R5cGVzIiwiZXhpc3RpbmdFbWl0TWV0YWRhdGEiLCJlbWl0T3B0aW9ucyIsInBpY2tFeGlzdGluZ0VtaXRNZXRhZGF0YSIsImdlbmVyYXRlZEV4dGVuZHMiLCJleGlzdGluZ0V4dGVuZHMiLCJtZXJnZWRFeHRlbmRzIiwibm9ybWFsaXplRXh0ZW5kcyIsInVuaXF1ZUV4dGVuZHMiLCJtZXJnZVRzY29uZmlnRXh0ZW5kcyIsImVtaXREZWNsYXJhdGlvbk9ubHkiLCJyZXdyaXRlUmVsYXRpdmVJbXBvcnRFeHRlbnNpb25zIiwiZW5zdXJlVHNFeHRlbnNpb25FbWl0Q29tcGF0aWJpbGl0eSIsIm1lcmdlZFR5cGVzIiwiZmlsdGVyRXhpc3RpbmdUeXBlcyIsInR5cGVOYW1lIiwidHlwZVJvb3RzIiwiZXhwZXJpbWVudGFsRGVjb3JhdG9ycyIsIm1vZHVsZSIsImRlbGV0ZUxlZ2FjeU1vZHVsZVNldHRpbmdzIiwidG9Mb3dlckNhc2UiLCJ2ZXJiYXRpbU1vZHVsZVN5bnRheCIsIm5vcm1hbGl6ZUNvbW1vbkpzVHNjb25maWdTZXR0aW5ncyIsImlzQWJzb2x1dGUiLCJnZW5lcmF0ZWRUeXBlU2V0IiwiaXNHZW5lcmF0ZWRUZXN0R2xvYmFsVHlwZSIsImV4Y2x1ZGVGaWxlUGF0dGVybnMiLCJnZW5lcmF0ZVZzY29kZVNldHRpbmdzIiwiZXhjbHVkZUZpbGVQYXR0ZXJuIiwiZXhjbHVkZVNldHRpbmciLCJnZW5lcmF0ZVlhcm5yY1ltbCIsInlhcm5yY1ltbFBhdGgiLCJnZXRMYXRlc3RWZXJzaW9uIiwibmV3VmVyc2lvbiIsIm9sZFZlcnNpb24iLCJ2YWxpZE5ld1ZlcnNpb24iLCJpc05ld2VyVmVyc2lvbiIsInJlbGVhc2VzUGF0aCIsInlhcm5yY1BhdGgiLCJkZWZhdWx0U2VtdmVyUmFuZ2VQcmVmaXgiLCJlbmFibGVTY3JpcHRzIiwibm9kZUxpbmtlciIsIm5tTW9kZSIsIm5wbU1pbmltYWxBZ2VHYXRlIiwiYXBwcm92ZWRHaXRSZXBvc2l0b3JpZXMiLCJucG1QcmVhcHByb3ZlZFBhY2thZ2VzIiwiY29tcHJlc3Npb25MZXZlbCIsImluamVjdEVudmlyb25tZW50RmlsZXMiLCJlbmFibGVHbG9iYWxDYWNoZSIsIm9yaWdpbmFsTGVuZ3RoIiwicGx1Z2luUGF0aCIsImdldFlhcm5yY1ByZXR0aWVyQXJncyIsInNldHVwTGFiZWxzIiwic2V0dXBMYWJlbCIsImRlbGV0ZUxhYmVsIiwiY29sb3IiLCJyZXF1ZXN0IiwiREVQUkVDQVRFRF9TRUNSRVRfTkFNRVMiLCJyZXF1aXJlIiwiY3JlYXRlUmVxdWlyZSIsInNldHVwU2VjcmV0cyIsImRvdGVudiIsInF1aWV0Iiwic2VjcmV0TmFtZSIsInNlY3JldF9uYW1lIiwia2V5X2lkIiwia2V5SWQiLCJkYXRhIiwic29kaXVtIiwicmVhZHkiLCJzZWNyZXQiLCJyYXdLZXkiLCJmcm9tX2Jhc2U2NCIsImJhc2U2NF92YXJpYW50cyIsIk9SSUdJTkFMIiwicmF3U2VjIiwiZnJvbV9zdHJpbmciLCJlbmNCeXRlcyIsImNyeXB0b19ib3hfc2VhbCIsImVuY0Jhc2U2NCIsInRvX2Jhc2U2NCIsImVuY3J5cHRlZF92YWx1ZSIsInNldHVwR2l0SHViU2V0dGluZ3MiLCJiZWZvcmVSZXRyeSIsImhhbmRsZUVycm9yIiwicmV0cnlDb3VudCIsInJldHJ5TG9nZ2VyIiwic2hvdWxkUmV0cnkiLCJzbGVlcE1pbGxpc2Vjb25kcyIsInVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzIiwiZmFpbGVkQ291bnQiLCJ3aXRoUmV0cnkiLCJhbGxvd19hdXRvX21lcmdlIiwiYWxsb3dfbWVyZ2VfY29tbWl0IiwiYWxsb3dfc3F1YXNoX21lcmdlIiwiYWxsb3dfcmViYXNlX21lcmdlIiwiYWxsb3dfdXBkYXRlX2JyYW5jaCIsImRlbGV0ZV9icmFuY2hfb25fbWVyZ2UiLCJzcXVhc2hfbWVyZ2VfY29tbWl0X3RpdGxlIiwic3F1YXNoX21lcmdlX2NvbW1pdF9tZXNzYWdlIiwiaGVhZGVycyIsImlzR2l0SHViUGVybWlzc2lvbk9yVmlzaWJpbGl0eUVycm9yIiwicGFja2FnZU1hbmFnZXJSdW5QbGFjZWhvbGRlciIsInRlbXBsYXRlcyIsImdlbmVyYXRlR2l0SHViVGVtcGxhdGVzIiwiYXBwbHlQYWNrYWdlTWFuYWdlclRlbXBsYXRlIiwiZGlzdGFuY2UiLCJ0ZW1wbGF0ZSIsInBhY2thZ2VNYW5hZ2VyQ29tbWFuZCIsIndiZnlKc29uU2NoZW1hIiwieiIsInJlY29yZCIsIm9wdGlvbmFsIiwiZG9jIiwiZ2V0UGFja2FnZUNvbmZpZyIsImVzbVBhY2thZ2UiLCJwYWNrYWdlSnNvblRleHQiLCJyZWxlYXNlQnJhbmNoZXMiLCJyZWxlYXNlUGx1Z2lucyIsInJlbGVhc2VyY0pzb25QYXRoIiwiZnNwIiwiZmxhdCIsInJlcG9JbmZvIiwiZ2l0Iiwic2ltcGxlR2l0Iiwib3JpZ2luIiwiZ2V0UmVtb3RlcyIsInIiLCJyZW1vdGVVcmwiLCJyZWZzIiwicmVxdWVzdFJlcG9JbmZvIiwiZmV0Y2hSZXBvSW5mbyIsImN1cnJlbnQiLCJoYXNWZXJzaW9uU2V0dGluZ3NGaWxlIiwiZG9ja2VyZmlsZSIsIndiZnlKc29uUGF0aCIsIndiZnlKc29uVGV4dCIsInJlcG9GdWxsTmFtZSIsImZ1bGxfbmFtZSIsInJlcG9BdXRob3IiLCJyZXBvTmFtZSIsInJlcG9QYXJ0cyIsImlzUmVmZXJyZWRCeU90aGVyUmVwbyIsImNvbnRhaW5zQW55IiwiZG9lc0NvbnRhaW5Wc2NvZGVTZXR0aW5nc0pzb24iLCJnaXRodWIiLCJyZWFkTWlzZVRhc2tzIiwidGFza3MiLCJ0b21sIiwicmVhZE1pc2VUYXNrQ29tbWFuZCIsIm9yZyIsInJlZGlyZWN0ZWRGdWxsTmFtZSIsImxvY2F0aW9uIiwiZ2V0UmVkaXJlY3RlZFJlcG9GdWxsTmFtZSIsImFsbG93ZWRHaXRIdWJPcmdhbml6YXRpb25QYXR0ZXJuIiwiYWxsb3dlZEdpdERlcGVuZGVuY3lQYXR0ZXJucyIsImFzc2VydFNhZmVEZXBlbmRlbmN5U291cmNlcyIsImRpc2FsbG93ZWRTb3VyY2VzIiwiZ2V0RGlzYWxsb3dlZERlcGVuZGVuY3lTb3VyY2VzIiwiZGV0YWlscyIsImRlcGVuZGVuY3lOYW1lIiwic2VjdGlvbk5hbWUiLCJpc0dpdERlcGVuZGVuY3lTcGVjaWZpZXIiLCJpc0FsbG93ZWRHaXREZXBlbmRlbmN5U3BlY2lmaWVyIiwiaXNHaXRIdWJTaG9ydGhhbmRTcGVjaWZpZXIiLCJyZWZyZXNoQnVuTG9jayIsInJvb3REaXJQYXRoIiwiYXJndiIsInlhcmdzIiwicG9zaXRpb25hbCIsImRlc2NyaWJlIiwiZGVmYXVsdCIsInNraXBEZXBzIiwidmVyYm9zZSIsInBhY2thZ2VKc29uRGlyIiwiVVJMIiwicGF0aG5hbWUiLCJnZXRWZXJzaW9uIiwic3RyaWN0IiwiaGFzSW52YWxpZFBhY2thZ2VDb25maWciLCJwYWNrYWdlc0RpclBhdGgiLCJzdWJEaXJQYXRocyIsImQiLCJhYmJyZXZpYXRpb25Qcm9taXNlIiwic3ViUGFja2FnZUNvbmZpZ3MiLCJzdWJEaXJQYXRoIiwiYWxsUGFja2FnZUNvbmZpZ3MiLCJzaG91bGRSdW5Xb3JrZmxvd3MiLCJ0aGVuIiwiZXhpdENvZGUiXSwibWFwcGluZ3MiOiI4cEJBQU9BLGVBQWVDLEVBQU1DLEdBQzFCLE9BQU8sSUFBSUMsUUFBU0MsR0FBWUMsV0FBV0QsRUFBU0YsR0FDdEQsQ0NpQ09GLGVBQWVNLEVBQW9CQyxHQUN4QyxJQUNFLGFBQWFBLEdBQ2YsQ0FBRSxNQUNBLENBRUosQ0FFT1AsZUFBZVEsRUFBcUJELEdBQ3pDLElBQ0UsYUFBYUEsR0FDZixDQUFFLE1BQU9FLEdBQ1AsR0FBcUIsaUJBQVZBLEdBQXNCQSxHQUFTLFNBQVVBLEdBQXdCLFdBQWZBLEVBQU1DLEtBQ2pFLE9BRUYsTUFBTUQsQ0FDUixDQUNGLENDL0NPLE1BQU1FLEVBQVUsSUFMdkIsTUFDRUMsV0FBWSxFQUNaQyxtQkFBb0IsR0NnQmYsTUFBTUMsRUFBUyxJQWhCdEIsTUFDRSwrQkFBTUMsQ0FBMEJDLEVBQWNDLEdBQ3hDTixFQUFRQyxXQUNWTSxRQUFRQyxLQUFLLGFBQWFILHFCQUU1QixVQUNRQyxHQUNSLENBQUUsTUFBT1IsR0FDUFMsUUFBUUMsS0FBSyxxQkFBcUJILE1BQVNQLGFBQWlCVyxNQUFRWCxFQUFNWSxNQUFRQyxPQUFPYixNQUMzRixDQUNJRSxFQUFRQyxXQUNWTSxRQUFRQyxLQUFLLGNBQWNILG1CQUUvQixHQ1pXTyxFQUFTLENBQ3BCLDJCQUFNQyxDQUFzQkMsR0FDMUIsSUFDRSxhQUFhQyxFQUFHQyxTQUFTQyxTQUFTSCxFQUFVLE9BQzlDLENBQUUsTUFDQSxDQUVKLEVBQ0Esa0JBQU1JLENBQWFKLEVBQWtC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ZixNQUNkb3VCLEVBQXFCLENBQUNydUIsR0FBa0JDLElBQWUsR0FDM0Q2bEIsR0FBWTdsQixHQUNacW1CLEdBQWFybUIsR0FDYjJuQixHQUFvQjNuQixHQUNwQnVhLEdBQW9DdmEsR0FDcENxYyxHQUFxQnJjLFdBRWpCNWEsRUFBWThlLGFBRWxCLE1BQU16ZixFQUE0QixHQUNsQyxJQUFLLE1BQU1jLEtBQVU0b0MsR0FDZjVvQyxFQUFPb0QsdUJBQXlCcEQsRUFBT3FELGtDQUN6Q25FLEVBQVNrRCxLQUFLeVYsR0FBbUI3WCxFQUFRQSxFQUFPaVksT0FBUzJ3QixFQUFvQixDQUFDNW9DLEtBRTVFQSxFQUFPMkosVUFBVXFXLGdCQUNuQjlnQixFQUFTa0QsS0FBS2lDLEVBQW9CckUsSUFFaENBLEVBQU8ySixVQUFVMlcsTUFDbkJwaEIsRUFBU2tELEtBQUtyQyxFQUFrQkMsVUFFNUJra0IsR0FBa0Jsa0IsRUFBUXlhLFNBQzFCNWEsRUFBWThlLGNBQ2IzZSxFQUFPaVksUUFBV2pZLEVBQU91a0IsZ0NBR3hCc1UsR0FBdUI3NEIsU0FDdkIrcEIsR0FBb0IvcEIsRUFBUXlhLEVBQVlndEIsRUFBS0ssVUFFbkQ1b0MsRUFBU2tELEtBQUswMEIsR0FBcUI5MkIsSUFDL0JBLEVBQU9rbUMsK0JBQWlDbG1DLEVBQU91a0Isd0JBQ2pEcmxCLEVBQVNrRCxLQUFLeThCLEdBQXVCNytCLEtBRW5DQSxFQUFPb0QsdUJBQXlCcEQsRUFBT3FELGtDQUN6Q25FLEVBQVNrRCxLQUFLdTVCLEdBQWlCMzdCLElBRTdCaUQsRUFBa0JqRCxJQUNwQmQsRUFBU2tELEtBQUtnMkIsR0FBb0JwNEIsSUFDbENkLEVBQVNrRCxLQUFLbTJCLEdBQXFCdjRCLE1BQ3pCQSxFQUFPaVksUUFBVWpZLEVBQU91a0Isd0JBQTBCdGhCLEVBQWtCd1gsSUFJOUV2YixFQUFTa0QsS0FBS20yQixHQUFxQnY0QixJQUVqQ0EsRUFBTzJKLFVBQVVzcUIsU0FDbkIvMEIsRUFBU2tELEtBQUsrMkIsR0FBMEJuNUIsV0FHdEN0QyxRQUFROFksSUFBSXRYLFNBQ1pXLEVBQVk4ZSxhQUVsQixNQUFNek0sRUFBaUJ1SSxFQUFXaFgsTUFBUSxNQUFRLE9BRTlDZ1gsRUFBV2hYLFlBQ1BwRixFQUFPQywwQkFBMEIsaUJBQWtCZixnQkFDakRHLFFBQVFDLFVBQ2Q0cEMsR0FBZUMsS0FHakI5Z0IsR0FBVXhVLEVBQWdCLENBQUMsVUFBVyxrQkFBbUJzMUIsR0FFM0Q5Z0IsR0FBVXhVLEVBQWdCLENBQUMsV0FBWXMxQixTQUVqQzFNLElBQ1IsQ0FDSXVOLElBQ0Y5MUIsUUFBUXcyQixTQUFXLEVBRXZCLENBdUJNOVoiLCJ4X2dvb2dsZV9pZ25vcmVMaXN0IjpbMTEsMTIsMTMsMTQsMTVdfQ==
|