wbfy 2.25.0 → 2.25.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +2 -2
- package/package.json +1 -1
package/dist/index.js
CHANGED
@@ -1,2 +1,2 @@
|
|
1
|
-
import e from"node:fs/promises";import t from"node:path";import{ignoreEnoentAsync as n,withRetry as s,ignoreErrorAsync as i}from"@willbooster/shared-lib";import o from"yargs";import r from"node:fs";import{globby as a,globbySync as c}from"globby";import{PromisePool as l}from"minimal-promise-pool";import{Octokit as p}from"@octokit/core";import d from"node:child_process";import u from"deepmerge";import m from"lodash.clonedeep";import f from"node:os";import g from"js-yaml";import h from"dotenv";import y from"libsodium-wrappers";import{distance as w}from"fastest-levenshtein";import{simpleGit as b}from"simple-git";import{z as v}from"zod";const k=new class{constructor(){this.isVerbose=!1,this.doesUploadEnvVars=!1}};const j=new class{async functionIgnoringException(e,t){k.isVerbose&&console.info(`--------- ${e} start ---------`);try{await t()}catch(t){console.info(`Error occurred in ${e}: ${t instanceof Error?t.stack:t}}`)}k.isVerbose&&console.info(`---------- ${e} end ----------`)}};async function x(n){return j.functionIgnoringException("fixDockerfile",(async()=>{if(!n.doesContainsDockerfile)return;const s=n.dockerfile,i=s;s!==i&&await e.writeFile(t.join(n.dirPath,"Dockerfile"),i)}))}async function _(e){return j.functionIgnoringException("fixPlaywrightConfig",(async()=>{const n=t.join(e.dirPath,"playwright.config.ts");if(!r.existsSync(n))return;const s=await r.promises.readFile(n,"utf8"),i=s.replace(/retries:.+,/,"retries: process.env.PWDEBUG ? 0 : process.env.CI ? 5 : 1,");s!==i&&await r.promises.writeFile(n,i)}))}async function P(n){return j.functionIgnoringException("fixPrismaEnvFiles",(async()=>{const s=await a(["*.env","*.env.*"],{dot:!0,cwd:n.dirPath});for(const i of s){const s=t.resolve(n.dirPath,i),o=(await e.readFile(s,"utf8")).replace(/DATABASE_URL="?(.+\.sqlite3)"?[\n$]/,'DATABASE_URL="$1?connection_limit=1"\n');await e.writeFile(s,o)}}))}async function $(e){return j.functionIgnoringException("fixTestDirectoriesUpdatingPackageJson",(async()=>{await Promise.all(e.map((async e=>{const n=t.join(e,"__tests__"),s=t.join(e,"tests");try{await r.promises.rename(n,s);const i=await r.promises.readFile(t.join(e,"package.json"),"utf8"),o=i.replaceAll("__tests__","tests");if(i===o)return;await r.promises.writeFile(t.join(e,"package.json"),o)}catch{}})))}))}const S=new l;async function F(s,i){return j.functionIgnoringException("fixTypeDefinitions",(async()=>{const o=t.resolve(s.dirPath,"@types"),r=s.isRoot&&s.doesContainsSubPackageJsons?void 0:t.resolve(s.dirPath,"src","types"),a=await n((()=>e.readdir(o,{withFileTypes:!0})));if(a)for(const s of a){const a=s.name.slice(0,-5),c=s.name.endsWith(".d.ts");let l=c?a:s.name;l.includes("__")&&(l=`@${l.replace("__","/")}`);const p=i.some((e=>e.packageJson?.dependencies?.[l]||e.packageJson?.devDependencies?.[l]));s.isFile()&&c?p?(await e.mkdir(t.join(o,a)),await S.run((()=>e.rename(t.join(o,s.name),t.join(o,a,"index.d.ts"))))):r&&(await e.mkdir(r,{recursive:!0}),await S.run((()=>e.rename(t.join(o,s.name),t.join(r,s.name))))):s.isDirectory()&&r&&!p&&(await e.mkdir(r,{recursive:!0}),await S.run((()=>n((()=>e.rename(t.join(o,s.name,"index.d.ts"),t.join(r,`${s.name}.d.ts`)))))))}}))}const C={async readFileIgnoringError(t){try{return await e.readFile(t,"utf8")}catch{}},async generateFile(t,n){await e.writeFile(t,n)}};async function E(e){return j.functionIgnoringException("fixAbbreviations",(async()=>{const n=e.dirPath,s=await a("**/*.md",{dot:!0,cwd:n,gitignore:!0});k.isVerbose&&console.info(`Found ${s.length} markdown files in ${n}`);for(const i of s){const s=t.join(n,i);await S.run((async()=>{const t=await r.promises.readFile(s,"utf8");let n=B(t);n=O(n,e,"doc"),t!==n&&await C.generateFile(s,n)}))}const i=await a(["{app,src,tests,scripts}/**/*.{cjs,mjs,js,jsx,cts,mts,ts,tsx}","packages/**/{app,src,tests,scripts}/**/*.{cjs,mjs,js,jsx,cts,mts,ts,tsx}"],{dot:!0,cwd:n,gitignore:!0});k.isVerbose&&console.info(`Found ${i.length} TypeScript files in ${n}`);for(const s of i){const i=t.join(n,s),o=await r.promises.readFile(i,"utf8");let a=o.replaceAll(/\/\/(.*)c\.f\./g,"//$1cf.").replaceAll(/\/\/(.*)eg\./g,"//$1e.g.").replaceAll(/\/\/(.*)ie\./g,"//$1i.e.");a=O(a,e,"ts"),o!==a&&await C.generateFile(i,a)}const o=await a("**/*.{csv,htm,html,tsv,xml,yaml,yml}",{dot:!0,cwd:n,gitignore:!0});k.isVerbose&&console.info(`Found ${o.length} text-based files in ${n}`);for(const s of o){const i=t.join(n,s),o=await r.promises.readFile(i,"utf8");let a=o.replaceAll(/\/\/(.*)c\.f\./g,"//$1cf.").replaceAll(/\/\/(.*)eg\./g,"//$1e.g.").replaceAll(/\/\/(.*)ie\./g,"//$1i.e.");a=O(a,e,"text"),o!==a&&await C.generateFile(i,a)}await S.promiseAll()}))}function B(e){return e.replaceAll(/\bc\.f\.([^$])/g,"cf.$1").replaceAll(/\beg\.([^$])/g,"e.g.$1").replaceAll(/\bie\.([^$])/g,"i.e.$1")}function O(e,t,n){for(const[n,s]of Object.entries(t.wbfyJson?.typos?.all??{}))e=e.replaceAll(n,s);for(const[s,i]of Object.entries(t.wbfyJson?.typos?.[n]??{}))e=e.replaceAll(s,i);return e}const I=process.env.GH_BOT_PAT||process.env.PUBLIC_GH_BOT_PAT||process.env.GH_TOKEN||process.env.GITHUB_TOKEN,D=!!I,T=new p({auth:I});const A=new class{getOrgAndName(e){const t=e.split(":").at(-1),n=t?.split("/");return[n?.at(-2)??"",n?.at(-1)?.replace(/.git$/,"")??""]}};function R(e,t,n,s=0){do{const[s,i,o]=J(e,t,n);if(0===d.spawnSync(s,i,o).status)break}while(--s>=0)}function W(e,t,n){const[s,i,o]=J(e,t,n);o.stdio="pipe";const r=d.spawnSync(s,i,o),a=r.stderr.toString().trim();return a&&console.error(`${s} [${i.map((e=>`"${e}"`))}] caused the following error:\n ${a}`),r.stdout.toString().trim()}function J(e,t,n){const s={...process.env};return s.PATH&&s.BERRY_BIN_FOLDER&&(s.PATH=s.PATH.replace(`${s.BERRY_BIN_FOLDER}:`,"")),s.ASDF_DIR&&(t=["-l","-c",`. ${s.ASDF_DIR}/asdf.sh && ${e} ${t.join(" ")}`],e="bash"),[e,t,{cwd:n,env:s,shell:!1,stdio:"inherit"}]}function N(e){const t=e.split(/[+.-]/).map(Number).filter((e=>!Number.isNaN(e)));let n=0,s=1;for(const e of t)n+=e*s,s/=1e3;return n}const L="3.9.19",z="zulu-11.74.15",G="2.0.4",U="14.2.5";async function H(e){return j.functionIgnoringException("generateToolVersions",(async()=>{await async function(e){if(!e.versionsText)return;const n=e.versionsText.trim().split("\n").map((e=>{const[t,n]=e.trim().split(/\s+/);return`${M.has(t)?" ":""}${t} ${n}`})).sort().map((e=>e.trim())),s=[...new Set(n)];if(e.doesContainsPoetryLock){const e=await fetch("https://pypi.org/pypi/poetry/json"),t=await e.json(),n=t?.info?.version;n&&Y(s,"poetry",t?.info?.version),Y(s,"python",L,!0)}e.depending.firebase&&Y(s,"java",z,!0);if(e.doesContainsPackageJson)if(e.isBun){const e=await K("evilmartians","lefthook");e&&Y(s,"lefthook",e);const t=await K("oven-sh","bun");t&&Y(s,"bun",t)}else{const t=W("npm",["show","yarn","version"],e.dirPath);Y(s,"yarn",t)}for(const n of q){const s=t.resolve(e.dirPath,`.${n}-version`);r.promises.rm(s,{force:!0})}const i=t.resolve(e.dirPath,".tool-versions");await(s.length>0?S.run((()=>r.promises.writeFile(i,s.join("\n")+"\n"))):S.run((()=>r.promises.rm(i,{force:!0})))),await S.promiseAll(),R("asdf",["plugin","update","--all"],e.dirPath),R("asdf",["install"],e.dirPath)}(e)}))}const M=new Set(["java","nodejs","bun","python"]),q=["java","node","python"];function Y(e,t,n,s=!1){const i=e.findIndex((e=>e.split(/\s+/)[0]===t)),o=`${t} ${n}`;if(-1===i)e.splice(s?0:e.length,0,o);else{const[,t]=e[i].split(/\s+/);N(n)>N(t)&&(e[i]=o)}}async function K(e,t){try{const n=(await T.request("GET /repos/{owner}/{repo}/releases/latest",{owner:e,repo:t})).data.tag_name,s=n.lastIndexOf("v"),i=-1===s?n:n.slice(s+1);return/^\d/.test(i)?i:void 0}catch(e){return void console.error("Failed to fetch Bun tags due to:",e)}}function V(e,t){return t}function X(e,t,n){const s=[...e];for(const[i,o]of t.entries())void 0===s[i]?s[i]=n.cloneUnlessOtherwiseSpecified(o,n):n.isMergeableObject(o)?s[i]=u(e[i],o,n):e.includes(o)||s.push(o);return s}const Q={$schema:"./node_modules/@biomejs/biome/configuration_schema.json",extends:["@willbooster/biome-config"]};async function Z(e){return j.functionIgnoringException("generateBiomeJsonc",(async()=>{let n=m(Q);const s=t.resolve(e.dirPath,"biome.jsonc");try{const e=await r.promises.readFile(s,"utf8"),t=JSON.parse(e);n=u.all([n,t,n],{arrayMerge:V})}catch{}const i=JSON.stringify(n);await S.run((()=>C.generateFile(s,i)))}))}async function ee(e){return j.functionIgnoringException("generateBunfigToml",(async()=>{const n=t.resolve(e.dirPath,"bunfig.toml");await S.run((()=>C.generateFile(n,"telemetry = false\n\n[install]\nexact = true\n\n[run]\nbun = true\n\n")))}))}const te="# Project-specific settings",ne=/# Project-specific settings[^\n]*\n/gm,se="# Generated by wbfy",ie=`${te} (head)\n\n\n${se}\n`,oe=`\n${te} (tail)\n`,re={separator:se,separatorPrefix:"# Generated by ",defaultHeadUserContent:ie,defaultTailUserContent:oe,async readGitignoreWithoutSeparators(e){try{let t=await r.promises.readFile(e,"utf8");const n=ae(t);return n>0&&(t=t.slice(0,n-1)),t.replaceAll(ne,"").replaceAll(/# Generated by [^\n]*\n/gm,"").replaceAll(/\r?\n\r?\n(\r?\n)+/gm,"\n\n").trim()+"\n"}catch{}},getHeadUserContent(e){const t=e.indexOf(this.separatorPrefix);return-1!==t?e.slice(0,e.indexOf("\n",t)+1).replaceAll(ne,`${te} (head)\n`):ie},getTailUserContent(e){const t=ae(e);return t>0?e.slice(t-1):oe},async isBerryZeroInstallEnabled(e){try{return(await r.promises.readFile(e,"utf8")).includes("\n!.yarn/cache")}catch{return!1}}};function ae(e){const t=e.indexOf(te),n=e.lastIndexOf(te);return n>t?n:-1}async function ce(e){return j.functionIgnoringException("generateDockerignore",(async()=>{const n=t.resolve(e.dirPath,".dockerignore");if(e.doesContainsDockerfile){const e=await C.readFileIgnoringError(n)??"",t=re.getHeadUserContent(e)+"\n**/.idea\n**/*.sqlite3*\n**/.yarn/install-state.gz\n**/.venv\n"+re.getTailUserContent(e);await S.run((()=>C.generateFile(n,t)))}else await r.promises.rm(n,{force:!0})}))}const le={codeWith2IndentSize:["cjs","mjs","js","jsx","cts","mts","ts","tsx","json","json5","jsonc","cpp","dart","htm","html","pu","puml","rb","vue","xml","yaml","yml"].sort(),codeWith4IndentSize:["go","gradle","py"].sort(),codeWith8IndentSize:["sh"].sort(),markdownLike:["md"].sort(),eslint:["cjs","mjs","js","cts","mts","ts","tsx","jsx"].sort(),prettier:["cjs","mjs","js","jsx","cts","mts","ts","tsx","json","json5","jsonc","css","htm","html","md","scss","vue","yaml","yml"].sort(),biome:["cjs","mjs","js","jsx","cts","mts","ts","tsx","json","json5","jsonc","htm","html","vue","svelte","astro","css","yaml","yml","gql"].sort()},pe=`root = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\ninsert_final_newline = true\ntrim_trailing_whitespace = true\n\n${ue(le.codeWith2IndentSize)}\nindent_size = 2\nindent_style = space\n\n${ue(le.codeWith4IndentSize)}\nindent_size = 4\nindent_style = space\n\n${ue(le.codeWith8IndentSize)}\nindent_size = 8\nindent_style = space\n\n${ue(le.markdownLike)}\nmax_line_length = off\ntrim_trailing_whitespace = false\n\n[{Makefile,*.mk}]\nindent_style = tab\n`;async function de(e){return j.functionIgnoringException("generateEditorconfig",(async()=>{const n=t.resolve(e.dirPath,".editorconfig");await S.run((()=>C.generateFile(n,pe)))}))}function ue(e){return e.length>1?`[*.{${e.join(",")}}]`:`[*.${e[0]}]`}async function me(e){return j.functionIgnoringException("generateEslintignore",(async()=>{const n=t.resolve(e.dirPath,".eslintignore");if(e.isBun)return void await S.run((()=>r.promises.rm(n,{force:!0})));const s=await C.readFileIgnoringError(n)??"",i=re.getHeadUserContent(s),o=re.getTailUserContent(s),a=t.resolve(e.dirPath,".gitignore"),c=i+"\n3rd-party/\n@types/\n__generated__/\nandroid/\nios/\nno-format/\ntest-fixtures/\n*.config.*js\n*.d.ts\n*.min.*js\n.yarn/\n.pnp.js\n"+(await re.readGitignoreWithoutSeparators(a)||"")+o;await S.run((()=>C.generateFile(n,c)))}))}async function fe(e,n){return j.functionIgnoringException("generateEslintrc",(async()=>{const s=t.resolve(e.dirPath,".eslintrc.json");if(e.isBun)return void await S.run((()=>r.promises.rm(s,{force:!0})));const i=[];e.eslintBase&&i.push(e.eslintBase),e!==n&&i.push("../../.eslintrc.json");let o={root:!0,extends:i};try{const t=await r.promises.readFile(s,"utf8"),n=JSON.parse(t);n.extends&&(n.extends=n.extends.filter((e=>!e.startsWith("@willbooster/")&&"../../.eslintrc.json"!==e))),0===i.length&&(n.extends=[]);const a=o.extends;o.extends=n.extends,n.extends=a,o=u.all([o,n,o],{arrayMerge:X}),e.depending.blitz&&(o.extends=o.extends.filter((e=>"./node_modules/@blitzjs/next/eslint"!==e)))}catch{}const a=JSON.stringify(o);await S.run((()=>C.generateFile(s,a)))}))}const ge=`* text=auto\n\n*.lockb binary diff=lockb\n*.vcproj text eol=crlf\n\n${[...le.codeWith2IndentSize,...le.codeWith4IndentSize,...le.markdownLike].map((e=>`*.${e} text eol=lf`)).join("\n")}\n\ndist/** linguist-generated=true\n`;async function he(e){return j.functionIgnoringException("generateGitattributes",(async()=>{const n=t.resolve(e.dirPath,".gitattributes");await S.run((()=>C.generateFile(n,ge)))}))}const ye=["windows","macos","linux","jetbrains","visualstudiocode","emacs","vim","yarn"];async function we(e,n){return j.functionIgnoringException("generateGitignore",(async()=>{const s=t.resolve(e.dirPath,".gitignore"),i=await C.readFileIgnoringError(s)??"";let o=re.getHeadUserContent(i)+"\n!.keep\n.env.production\n*/mount/*.hash\n.idea/copilot/chatSessions/\n.devcontainer/\ndist/\ntemp/\n";const r=re.getTailUserContent(i),a=[...ye];e.doesContainsGemfile&&a.push("ruby"),e.doesContainsGoMod&&(a.push("go"),o+=`${t.basename(e.dirPath)}\n`),e.doesContainsPackageJson&&a.push("node"),e.doesContainsPomXml&&(a.push("maven"),o+=".idea/google-java-format.xml\n"),e.doesContainsPubspecYaml&&(a.push("flutter","AndroidStudio","ruby"),o+=".flutter-plugins-dependencies\nandroid/key.properties\nios/.bundle\n.idea/runConfigurations.xml\n"),e.doesContainsTemplateYaml&&(o+=".aws-sam/\npackaged.yaml\n"),e.doesContainsPoetryLock&&(a.push("python"),o+=".venv/\n"),e.depending.blitz&&(o+=".blitz/\n.blitz**\n"),e.depending.next&&a.push("nextjs"),(n.depending.firebase||e.depending.firebase)&&a.push("firebase"),n.depending.prisma&&(o+="*.sqlite3*\n*.sqlite3-journal\n"),e.depending.playwrightTest&&(o+="test-results/\n"),(n.depending.reactNative||e.depending.reactNative)&&(a.push("reactnative"),o+="google-services.json\nandroid/app/src/main/assets/\n"),e.depending.storybook&&a.push("storybookjs"),e.depending.litestream&&(o+="gcp-sa-key.json\n");let c="";for(const e of a){let t=await ke(e)??"";if(!t){const n=`https://www.toptal.com/developers/gitignore/api/${e}`,s=await fetch(n),i=await s.text();if(!s.ok||i.includes("Attention Required!")||i.includes("<title>"))return void console.error(`Failed to fetch ${n}`);t=i.trim(),await S.run((()=>ve(e,t))),k.isVerbose&&console.info(`Fetched ${n}`)}c&&(c+="\n"),c+=t+"\n"}await re.isBerryZeroInstallEnabled(s)||(c=c.replace("!.yarn/cache","# !.yarn/cache").replace("# .pnp.*",".pnp.*")),(e.doesContainsPomXml||e.doesContainsPubspecYaml)&&(c=c.replaceAll(/^# .idea\/artifacts$/gm,".idea/artifacts").replaceAll(/^# .idea\/compiler.xml$/gm,".idea/compiler.xml").replaceAll(/^# .idea\/jarRepositories.xml$/gm,".idea/jarRepositories.xml").replaceAll(/^# .idea\/modules.xml$/gm,".idea/modules.xml").replaceAll(/^# .idea\/*.iml$/gm,".idea/*.iml").replaceAll(/^# .idea\/modules$/gm,".idea/modules").replaceAll(/^# *.iml$/gm,"*.iml").replaceAll(/^# *.ipr$/gm,"*.ipr"),e.doesContainsPubspecYaml&&(c=c.replaceAll(/^.idea\/modules.xml$/gm,"# .idea/modules.xml"))),c=c.replaceAll(/^.idea\/?$/gm,"# .idea"),(n.depending.reactNative||e.depending.reactNative||e.doesContainsPubspecYaml)&&(c=c.replaceAll(/^(.idea\/.+)$/gm,"$1\nandroid/$1"));const l=o+"\n"+c+r;await S.run((()=>C.generateFile(s,l)))}))}const be=t.join(f.homedir(),".cache","wbfy","gitignore");async function ve(e,n){await r.promises.mkdir(be,{recursive:!0}),await r.promises.writeFile(t.join(be,e),n)}async function ke(e){try{const n=await r.promises.stat(t.join(be,e));if(Date.now()-n.mtimeMs>216e5)return;return await r.promises.readFile(t.join(be,e),"utf8")}catch{}}async function je(e,t){try{const{data:n}=await T.request("GET /repos/{owner}/{repo}/commits",{owner:e,repo:t,per_page:1});if(console.info("commits:",n),0===n.length)throw new Error(`No commits found for ${e}/${t}`);return n[0].sha}catch(n){throw new Error(`Failed to fetch commits for ${e}/${t}: ${n}`)}}const xe={getLintFixSuffix:e=>e.doesContainsJsxOrTsx?' --rule "{ react-hooks/exhaustive-deps: 0 }"':""},_e={node:["src","tests","scripts"].sort(),blitz:["src","tests","scripts","db","integrations","mailers"].sort()};function Pe(e){return e.depending.blitz?_e.blitz:_e.node}const $e=["eslint@8.57.0","eslint-config-prettier","eslint-plugin-import","eslint-plugin-sort-class-members","eslint-plugin-sort-destructure-keys","eslint-plugin-unicorn"],Se=[...$e,"@typescript-eslint/eslint-plugin","@typescript-eslint/parser","eslint-import-resolver-typescript"],Fe=["eslint-plugin-react","eslint-plugin-react-hooks"],Ce={"@willbooster/eslint-config-js":["@willbooster/eslint-config-js",...$e],"@willbooster/eslint-config-js-react":["@willbooster/eslint-config-js-react",...$e,...Fe],"@willbooster/eslint-config-ts":["@willbooster/eslint-config-ts",...Se],"@willbooster/eslint-config-ts-react":["@willbooster/eslint-config-ts-react",...Se,...Fe],"@willbooster/eslint-config-blitz-next":["@willbooster/eslint-config-blitz-next","eslint-config-next",...Se,...Fe],"@willbooster/eslint-config-next":["@willbooster/eslint-config-next","eslint-config-next",...Se,...Fe]};async function Ee(e,n,s){return j.functionIgnoringException("generatePackageJson",(async()=>{await async function(e,n,s){const i=t.resolve(e.dirPath,"package.json"),o=await r.promises.readFile(i,"utf8"),l=JSON.parse(o);l.scripts=l.scripts||{},l.dependencies=l.dependencies||{},l.devDependencies=l.devDependencies||{},l.peerDependencies=l.peerDependencies||{},await async function(e,t){"WillBooster LLC"===t.author&&(t.author="WillBooster Inc.");if(delete t.scripts["sort-package-json"],delete t.scripts["sort-all-package-json"],delete t.scripts["typecheck/warn"],delete t.scripts["typecheck:gen-code"],delete t.scripts["typecheck:codegen"],delete t.dependencies.tslib,delete t.devDependencies["@willbooster/eslint-config"],delete t.devDependencies["@willbooster/eslint-config-react"],delete t.devDependencies["@willbooster/renovate-config"],delete t.devDependencies["@willbooster/tsconfig"],delete t.devDependencies["eslint-import-resolver-node"],delete t.devDependencies["eslint-plugin-prettier"],delete t.devDependencies.lerna,delete t.devDependencies.pinst,delete t.scripts["flutter-format"],delete t.scripts["format-flutter"],delete t.scripts["python-format"],delete t.scripts["format-python"],delete t.scripts.prettier,!e.isWillBoosterConfigs)for(const e of Object.values(Ce))for(const n of e)delete t.devDependencies[n];await S.run((()=>r.promises.rm("lerna.json",{force:!0})))}(n,l),"@willbooster/prettier-config"!==l.name&&(l.prettier="@willbooster/prettier-config");for(const[e,t]of Object.entries(l.scripts))t.includes("git clone")||(l.scripts[e]=t.replace(/yarn\s*&&\s*/,"").replace(/yarn\s*install\s*&&\s*/,""));l.scripts=u(l.scripts,Be(e)),e.isBun?delete l.scripts.prettify:l.scripts.prettify+=await async function(e){const n=t.resolve(e,".prettierignore"),s=await r.promises.readFile(n,"utf8"),i=s.indexOf(re.separatorPrefix);if(-1===i)return"";const o=s.slice(0,i);return o.split("\n").map((e=>{const t=e.trim();return t.endsWith("/")?t.slice(0,-1):t})).filter((e=>e&&!e.startsWith("#")&&!e.includes("/"))).map((e=>` "!**/${e}/**"`)).join("")}(e.dirPath);for(const[e,t]of Object.entries(l.scripts))t?.includes("yarn workspaces foreach")&&(t.includes("--all")||t.includes("--recursive")||t.includes("--since")||t.includes("--worktree")||(l.scripts[e]=t.replace("yarn workspaces foreach","yarn workspaces foreach --all")));let p=[],d=["prettier","sort-package-json","@willbooster/prettier-config"];const m=[];e.isBun?delete l.devDependencies["lint-staged"]:d.push("lint-staged");if(e.isRoot){if(e.isBun?(delete l.devDependencies.husky,delete l.devDependencies.pinst,l.scripts.prepare="lefthook install || true"):(d.push("husky"),l.scripts.prepare="husky || true",l.scripts.postinstall="husky || true",(e.isPublicRepo||e.isReferredByOtherRepo)&&(d.push("pinst"),l.scripts.prepack="pinst --disable",l.scripts.postpack="pinst --enable")),e.depending.semanticRelease){const e=l.devDependencies["multi-semantic-release"]||l.devDependencies["@qiwi/multi-semantic-release"]?"@6.1.0":"";d.push(`conventional-changelog-conventionalcommits${e}`),l.devDependencies["semantic-release"]||l.devDependencies["multi-semantic-release"]||l.devDependencies["@qiwi/multi-semantic-release"]||d.push("semantic-release"),l.version="0.0.0-semantically-released"}e.depending.playwrightTest&&(l.dependencies["@playwright/test"]||(d.push("@playwright/test"),delete l.dependencies["@playwright/test"]),delete l.dependencies.playwright,delete l.devDependencies.playwright),e.doesContainsSubPackageJsons?l.workspaces=Array.isArray(l.workspaces)?u.all([l.workspaces,["packages/*"]],{arrayMerge:X}):["packages/*"]:Array.isArray(l.workspaces)&&(l.workspaces=l.workspaces.filter((t=>c(t,{dot:!0,cwd:e.dirPath,gitignore:!0}).length>0)),0===l.workspaces.length&&delete l.workspaces)}if(e.depending.wb||e.isBun){l.dependencies["@willbooster/wb"]?p.push("@willbooster/wb"):d.push("@willbooster/wb");for(const[e,t]of Object.entries(l.scripts))l.scripts[e]=t.replace(/wb\s+db/,"wb prisma")}(e.doesContainsJavaScript||e.doesContainsJavaScriptInPackages||e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages)&&(e.isBun?(d.push("@biomejs/biome","@willbooster/biome-config"),delete l.devDependencies.eslint,delete l.devDependencies.micromatch,delete l.devDependencies["@typescript-eslint/parser"]):(d.push("eslint@8.57.0","micromatch"),e.doesContainsTypeScriptInPackages&&d.push("@typescript-eslint/parser")));(e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages)&&(d.push("typescript"),e.isBun&&d.push("@types/bun"));e.eslintBase&&d.push(...Ce[e.eslintBase]);e.isWillBoosterConfigs&&(p=p.filter((e=>!e.includes("@willbooster/"))),d=d.filter((e=>!e.includes("@willbooster/"))));l.name||(l.name=t.basename(e.dirPath));e.doesContainsSubPackageJsons&&(l.private=!0);l.license||(l.license="UNLICENSED");!l.private&&"UNLICENSED"!==l.license&&n.isPublicRepo&&(l.publishConfig??={},l.publishConfig.access??="public");const[f]=A.getOrgAndName(e.repository??"");"WillBooster"!==f&&"WillBoosterLab"!==f||(l.author="WillBooster Inc.");e.isRoot||!l.private||l.main||(l.main="./src");if(delete l.resolutions?.["npm/chalk"],!e.doesContainsSubPackageJsons){if(e.isBun||(e.doesContainsJavaScript||e.doesContainsTypeScript?l.scripts["lint-fix"]+=xe.getLintFixSuffix(e):(delete l.scripts.lint,delete l.scripts["lint-fix"],l.scripts.cleanup=l.scripts.cleanup?.replace(" && yarn lint-fix",""))),e.doesContainsPubspecYaml){l.scripts.lint="flutter analyze",l.scripts["lint-fix"]="yarn lint";const n=["lib","test","test_driver"].filter((n=>r.existsSync(t.resolve(e.dirPath,n))));n.length>0&&(l.scripts["format-code"]=`flutter format $(find ${n.join(" ")} -name generated -prune -o -name '*.freezed.dart' -prune -o -name '*.g.dart' -prune -o -name '*.dart' -print)`,l.scripts.format+=" && yarn format-code")}if(e.doesContainsPoetryLock){"poetry install"===l.scripts.postinstall&&delete l.scripts.postinstall;const t=await a("**/*.py",{cwd:e.dirPath,dot:!0,gitignore:!0,ignore:["test-fixtures"]}),n=new Set;for(const e of t){const[t,s]=e.split(/[/\\]/);s&&n.add(t)}if(n.size>0){const e=[...n].join(" ");l.scripts["format-code"]=`poetry run isort --profile black ${e} && poetry run black ${e}`,l.scripts.lint?l.scripts.lint=`poetry run flake8 ${e} && ${l.scripts.lint}`:(l.scripts.lint=`poetry run flake8 ${e}`,l.scripts["lint-fix"]="yarn lint"),l.scripts.format+=" && yarn format-code",m.push("black","isort","flake8")}}e.repository&&(l.repository=e.repository)}e.depending.blitz?(p.push(`blitz@${G}`,`@blitzjs/auth@${G}`,`@blitzjs/next@${G}`,`@blitzjs/rpc@${G}`,`next@${U}`),d=d.filter((e=>"eslint-plugin-react"!==e&&"eslint-plugin-react-hooks"!==e)),l.scripts["gen-code"]?.startsWith("blitz codegen")?l.scripts["gen-code"].includes("blitz prisma generate")||(l.scripts["gen-code"]=l.scripts["gen-code"].replace("blitz codegen","blitz codegen && blitz prisma generate")):l.scripts["gen-code"]="blitz codegen"):e.depending.prisma&&!l.scripts["gen-code"]?.startsWith("prisma generate")&&(l.scripts["gen-code"]="prisma generate");e.depending.next&&delete l.devDependencies["@types/react"];l.dependencies?.prettier||delete l.devDependencies["@types/prettier"];0===Object.keys(l.dependencies).length&&delete l.dependencies;0===Object.keys(l.devDependencies).length&&delete l.devDependencies;0===Object.keys(l.peerDependencies).length&&delete l.peerDependencies;await async function(e){e.dependencies=e.dependencies||{},e.devDependencies=e.devDependencies||{};const t=new Set([...Object.keys(e.dependencies),...Object.keys(e.devDependencies)]);if(console.info("packageNames:",t),t.has("@willbooster/auth")){delete e.devDependencies["@willbooster/auth"];const t=await je("WillBoosterLab","auth");e.dependencies["@willbooster/auth"]=`git@github.com:WillBoosterLab/auth.git#${t}`}else if(t.has("@willbooster/code-analyzer")){delete e.dependencies["@willbooster/code-analyzer"];const t=await je("WillBoosterLab","code-analyzer");e.devDependencies["@willbooster/code-analyzer"]=`git@github.com:WillBoosterLab/code-analyzer.git#workspace=@code-analyzer/client&commit=${t}`}else if(t.has("@willbooster/judge")){delete e.dependencies["@willbooster/judge"];const t=await je("WillBoosterLab","judge");e.devDependencies["@willbooster/judge"]=`git@github.com:WillBoosterLab/judge.git#${t}`}else if(t.has("@willbooster/llm-proxy")){delete e.dependencies["@willbooster/llm-proxy"];const t=await je("WillBoosterLab","llm-proxy");e.devDependencies["@willbooster/llm-proxy"]=`git@github.com:WillBoosterLab/llm-proxy.git#workspace=@llm-proxy/client&commit=${t}`}}(l);let g=JSON.stringify(l);if(g=await async function(e,n,s){const i=[];for(const[t]of Object.keys(e))":"!==t[0]&&t.includes(":")&&i.push([t,t.replaceAll(":","-")]);if(0===i.length)return n;for(const[e,t]of i)n=n.replaceAll(e,t);const o=await a(["**/*.{md,cjs,mjs,js,jsx,cts,mts,ts,tsx}","**/Dockerfile"],{cwd:s.dirPath,dot:!0,gitignore:!0});for(const e of o)await S.run((async()=>{const n=t.join(s.dirPath,e),o=await r.promises.readFile(n,"utf8");let a=o;for(const[e,t]of i)a=a.replaceAll(e,t);a!==o&&await r.promises.writeFile(n,a)}));return await S.promiseAll(),n}(l.scripts,g,e),await r.promises.writeFile(i,g),!s){p=p.filter((e=>!l.devDependencies?.[e]));const t=e.isBun?"bun":"yarn";p.length>0&&R(t,["add",...new Set(p)],e.dirPath),d=d.filter((e=>!l.dependencies?.[e])),d.length>0&&R(t,["add","-D",...new Set(d)],e.dirPath),m.length>0&&R("poetry",["add","--group","dev",...new Set(m)],e.dirPath)}}(e,n,s)}))}function Be(e){if(e.isBun){const t={cleanup:"bun --bun wb lint --fix --format",format:"bun --bun wb lint --format",lint:"bun --bun wb lint","lint-fix":"bun --bun wb lint --fix",test:"bun --bun wb test",typecheck:"bun --bun wb typecheck"};return e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages||delete t.typecheck,t}{let t={cleanup:"yarn format && yarn lint-fix",format:"sort-package-json && yarn prettify",lint:`eslint --color "./{${Pe(e)}}/**/*.{${le.eslint.join(",")}}"`,"lint-fix":"yarn lint --fix",prettify:`prettier --cache --color --write "**/{.*/,}*.{${le.prettier.join(",")}}" "!**/test-fixtures/**"`,typecheck:"tsc --noEmit --Pretty"};if(e.doesContainsSubPackageJsons){const e=t.test;t=u({...t},{format:"sort-package-json && yarn prettify && yarn workspaces foreach --all --parallel --verbose run format",lint:"yarn workspaces foreach --all --parallel --verbose run lint","lint-fix":"yarn workspaces foreach --all --parallel --verbose run lint-fix",prettify:`prettier --cache --color --write "**/{.*/,}*.{${le.prettier.join(",")}}" "!**/packages/**" "!**/test-fixtures/**"`,test:"CI=1 FORCE_COLOR=3 yarn workspaces foreach --all --verbose run test",typecheck:"yarn workspaces foreach --all --parallel --verbose run typecheck"}),e?.includes("wb test")&&(t.test=e)}else e.depending.pyright&&(t.typecheck=t.typecheck?`${t.typecheck} && `:"",t.typecheck+="pyright");return e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages?e.depending.wb&&(t.typecheck="wb typecheck"):delete t.typecheck,t}}const Oe={preCommit:"node node_modules/.bin/lint-staged",prePush:"yarn typecheck",prePushForLab:'\nif [ $(git branch --show-current) = "main" ] && [ $(git config user.email) != "exkazuu@gmail.com" ]; then\n echo "************************************************"\n echo "*** Don\'t push main branch directly. Use PR! ***"\n echo "************************************************"\n exit 1\nfi\n\nyarn typecheck\n'.trim(),postMerge:'\nchanged_files="$(git diff-tree -r --name-only --no-commit-id ORIG_HEAD HEAD)"\n\nrun_if_changed() {\n if echo "$changed_files" | grep --quiet -E "$1"; then\n eval "$2"\n fi\n}\n'.trim()};async function Ie(e){return j.functionIgnoringException("generateHuskyrcUpdatingPackageJson",(async()=>{await async function(e){const n=t.resolve(e.dirPath,"package.json"),s=await r.promises.readFile(n,"utf8"),i=JSON.parse(s);i.scripts||={},delete i.scripts.postinstall,delete i.scripts.postpublish,delete i.scripts.prepare,delete i.scripts.prepublishOnly,delete i.scripts.prepack,delete i.scripts.postpack;const o=t.resolve(e.dirPath,".husky");if(await Promise.all([r.promises.writeFile(n,JSON.stringify(i,void 0,2)),r.promises.rm(o,{force:!0,recursive:!0})]),e.isBun)return void R("git",["config","--unset","core.hooksPath"],e.dirPath);R("yarn",["dlx","husky-init","--yarn2"],e.dirPath);const a=t.resolve(o,"pre-commit");await S.run((()=>r.promises.rm(t.resolve(e.dirPath,".huskyrc.json"),{force:!0}))),await S.run((()=>r.promises.writeFile(a,Oe.preCommit+"\n")));const{typecheck:c}=Be(e);if(c){let n=e.repository?.startsWith("github:WillBoosterLab/")?Oe.prePushForLab:Oe.prePush;n=n.replace("yarn typecheck",c.replace("tsc ","node node_modules/.bin/tsc ").replace("wb ","node node_modules/.bin/wb ").replace("pyright","node node_modules/.bin/pyright")),await S.run((()=>r.promises.writeFile(t.resolve(o,"pre-push"),n+"\n",{mode:493})))}const l=`${Oe.postMerge}\n\n${De(e).join("\n")}\n`;await S.run((()=>r.promises.writeFile(t.resolve(o,"post-merge"),l,{mode:493})))}(e)}))}function De(e){const t=[];e.versionsText&&t.push(String.raw`run_if_changed "\..+-version" "awk '{print \$1}' .tool-versions | xargs -I{} asdf plugin add {}"`,String.raw`run_if_changed "\..+-version" "asdf plugin update --all"`),e.versionsText?.includes("python ")&&t.push(String.raw`run_if_changed "\..+-version" "asdf install python"`),e.versionsText&&t.push(String.raw`run_if_changed "\..+-version" "asdf install"`);const n=e.isBun?"bun install":"yarn",s=e.depending.blitz||e.depending.next?" && rm -Rf .next":"";return t.push(`run_if_changed "package\\.json" "${n}${s}"`),e.doesContainsPoetryLock&&t.push(String.raw`run_if_changed "poetry\.lock" "poetry install"`),e.depending.blitz?t.push('run_if_changed "db/schema.prisma" "node node_modules/.bin/blitz prisma migrate deploy"','run_if_changed "db/schema.prisma" "node node_modules/.bin/blitz prisma generate"','run_if_changed "db/schema.prisma" "node node_modules/.bin/blitz codegen"'):e.depending.prisma&&t.push('run_if_changed "prisma/schema.prisma" "node node_modules/.bin/dotenv -c development -- node node_modules/.bin/prisma migrate deploy"','run_if_changed "prisma/schema.prisma" "node node_modules/.bin/dotenv -c development -- node node_modules/.bin/prisma generate"'),t}function Te(e,t,n,s){return` <TaskOptions isEnabled="true">\n <option name="arguments" value="${t} $FilePathRelativeToProjectRoot$" />\n <option name="checkSyntaxErrors" value="false" />\n <option name="description" />\n <option name="exitCodeBehavior" value="ERROR" />\n <option name="fileExtension" value="${s}" />\n <option name="immediateSync" value="false" />\n <option name="name" value="${n} (.${s})" />\n <option name="output" value="$FilePathRelativeToProjectRoot$" />\n <option name="outputFilters">\n <array />\n </option>\n <option name="outputFromStdout" value="false" />\n <option name="program" value="${e}" />\n <option name="runOnExternalChanges" value="false" />\n <option name="scopeName" value="Project Files" />\n <option name="trackOnlyRoot" value="false" />\n <option name="workingDir" value="$ProjectFileDir$" />\n <envs />\n </TaskOptions>\n`}const Ae=`<?xml version="1.0" encoding="UTF-8"?>\n<project version="4">\n <component name="ProjectTasksOptions">\n${le.prettier.map((e=>Te("node","node_modules/.bin/prettier --cache --write","Prettier",e))).join("")}\n </component>\n</project>\n`,Re=`<?xml version="1.0" encoding="UTF-8"?>\n<project version="4">\n <component name="ProjectTasksOptions">\n${le.prettier.map((e=>Te("bun","--bun node_modules/.bin/biome check --fix --no-errors-on-unmatched --skip-errors","Biome",e))).join("")}\n </component>\n</project>\n`;async function We(e){return j.functionIgnoringException("generateIdeaSettings",(async()=>{const n=t.resolve(e.dirPath,".idea");if(r.existsSync(n)){const s=t.resolve(n,"watcherTasks.xml");await(e.doesContainsJavaScript||e.doesContainsJavaScriptInPackages||e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages||e.doesContainsPackageJson&&!e.doesContainsPubspecYaml&&!e.doesContainsGemfile&&!e.doesContainsGoMod&&!e.doesContainsPomXml?S.run((()=>C.generateFile(s,e.isBun?Re:Ae))):S.run((()=>r.promises.rm(s,{force:!0}))))}}))}const Je={"post-merge":{scripts:{"prepare.sh":{runner:"bash"}}},"pre-commit":{commands:{cleanup:{glob:"*.{cjs,css,cts,htm,html,js,json,json5,jsonc,jsx,md,mjs,mts,scss,ts,tsx,vue,yaml,yml}",run:"bun --bun wb lint --fix --format {staged_files} && git add {staged_files}"},"check-migrations":{glob:"**/migration.sql",run:"\nif grep -q 'Warnings:' {staged_files}; then\n echo \"Migration SQL files ({staged_files}) contain warnings! Please solve the warnings and commit again.\"\n exit 1\nfi\n".trim()}}},"pre-push":{scripts:{"check.sh":{runner:"bash"}}}},Ne={prePush:"bun --bun node_modules/.bin/wb typecheck",prePushForLab:'\n#!/bin/bash\n\nif [ $(git branch --show-current) = "main" ] && [ $(git config user.email) != "exkazuu@gmail.com" ]; then\n echo "************************************************"\n echo "*** Don\'t push main branch directly. Use PR! ***"\n echo "************************************************"\n exit 1\nfi\n\nbun --bun node_modules/.bin/wb typecheck\n'.trim(),postMerge:'\n#!/bin/bash\n\nchanged_files="$(git diff-tree -r --name-only --no-commit-id ORIG_HEAD HEAD)"\n\nrun_if_changed() {\n if echo "$changed_files" | grep --quiet -E "$1"; then\n eval "$2"\n fi\n}\n'.trim()};async function Le(e){return j.functionIgnoringException("generateLefthookUpdatingPackageJson",(async()=>{await async function(e){const n=t.resolve(e.dirPath,".lefthook");await Promise.all([r.promises.writeFile(t.join(e.dirPath,"lefthook.yml"),g.dump(Je,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}})),r.promises.rm(n,{force:!0,recursive:!0})]);const{typecheck:s}=Be(e);if(s){const s=e.repository?.startsWith("github:WillBoosterLab/")?Ne.prePushForLab:Ne.prePush;r.mkdirSync(t.join(n,"pre-push"),{recursive:!0}),await S.run((()=>r.promises.writeFile(t.join(n,"pre-push","check.sh"),s+"\n",{mode:493})))}const i=`${Ne.postMerge}\n\n${De(e).join("\n")}\n`;r.mkdirSync(t.join(n,"post-merge"),{recursive:!0}),await S.run((()=>r.promises.writeFile(t.resolve(n,"post-merge","prepare.sh"),i,{mode:493})))}(e)}))}async function ze(e){return j.functionIgnoringException("generateLintstagedrc",(async()=>{await async function(e){const n=t.resolve(e.dirPath,".lintstagedrc.cjs");if(e.isBun)return void await S.run((()=>r.promises.rm(n,{force:!0})));const s=e.isRoot?"node node_modules/.bin/":"node ../../node_modules/.bin/",i=[];if(e.doesContainsJavaScript||e.doesContainsTypeScript){const t=`\n '${Ge(e)}': [${JSON.stringify(`${s}eslint --fix${xe.getLintFixSuffix(e)}`)}, '${s}prettier --cache --write'],`;i.push(t)}const o=e.isRoot?" && !file.includes('/packages/')":"";i.push(`\n './**/*.{${le.prettier.join(",")}}': files => {\n let filteredFiles = files.filter(file => !file.includes('/test-fixtures/')${o});${function(e){return e.doesContainsJavaScript||e.doesContainsTypeScript?`\n\n filteredFiles = filteredFiles.map((file) => path.relative('', file));\n filteredFiles = micromatch.not(filteredFiles, '${Ge(e)}');\n filteredFiles = filteredFiles.map((file) => path.resolve(file));`:""}(e)}\n if (filteredFiles.length === 0) return [];\n const commands = [\`${s}prettier --cache --write \${filteredFiles.join(' ')}\`];\n if (filteredFiles.some(file => file.endsWith('package.json'))) {\n commands.push('${s}sort-package-json');\n }\n return commands;\n },\n './**/migration.sql': (files) => {\n for (const file of files) {\n const content = fs.readFileSync(file, 'utf-8');\n if (content.includes('Warnings:')) {\n return [\n \`!!! Migration SQL file (\${path.relative('', file)}) contains warnings !!! Solve the warnings and commit again.\`,\n ];\n }\n }\n return [];\n},`),e.doesContainsPubspecYaml&&i.push("\n './{lib,test,test_driver}/**/*.dart': files => {\n const filteredFiles = files.filter(file => !file.includes('generated'))\n .filter(file => !file.endsWith('.freezed.dart') && !file.endsWith('.g.dart'));\n if (filteredFiles.length === 0) return [];\n return [`flutter format ${filteredFiles.join(' ')}`];\n },");e.doesContainsPoetryLock&&i.push("\n './**/*.py': [\n 'poetry run isort --profile black --filter-files',\n 'poetry run black',\n 'poetry run flake8'\n ],");const a=`const path = require('path');\n${e.doesContainsJavaScript||e.doesContainsTypeScript?"const micromatch = require('micromatch');\n":""}\nmodule.exports = {${i.join("")}\n};\n`;await S.run((()=>r.promises.rm(t.resolve(e.dirPath,".lintstagedrc.js"),{force:!0}))),await S.run((()=>r.promises.rm(t.resolve(e.dirPath,".lintstagedrc.json"),{force:!0}))),await S.run((()=>C.generateFile(n,a)))}(e)}))}function Ge(e){return`./{${Pe(e).join(",")}}/**/*.{${le.eslint.join(",")}}`}async function Ue(e){return j.functionIgnoringException("generateNextConfigJson",(async()=>{const n=["js","mjs","cjs"].map((n=>t.resolve(e.dirPath,`next.config.${n}`))).find((e=>r.existsSync(e)));if(!n)return;const s=(await r.promises.readFile(n,"utf8")).replace(/=\s*{([\S\s]*)};/,((e,t)=>(t.includes("eslint:")||(t+="eslint: { ignoreDuringBuilds: true },"),t.includes("typescript:")||(t+="typescript: { ignoreBuildErrors: true },"),`= {${t}};`)));await S.run((()=>C.generateFile(n,s)))}))}async function He(e){return j.functionIgnoringException("generatePrettierignore",(async()=>{const n=t.resolve(e.dirPath,".prettierignore"),s=await C.readFileIgnoringError(n)??"",i=re.getHeadUserContent(s),o=re.getTailUserContent(s),r=t.resolve(e.dirPath,".gitignore"),a=await re.readGitignoreWithoutSeparators(r)||"";let c="";e.doesContainsPubspecYaml&&(c="\nandroid/app/\nios/Runner/Assets.xcassets/\npubspec.yaml\n");const l=i+"\n3rd-party/\nandroid/\nios/\nno-format/\ntest-fixtures/\n*.d.ts\n*.min.js\n.yarn/\n.pnp.js\n"+c+a+o;await S.run((()=>C.generateFile(n,l)))}))}const Me={venvPath:".",venv:".venv"};async function qe(e){return j.functionIgnoringException("generatePyrightConfigJson",(async()=>{let n=m(Me);const s=t.resolve(e.dirPath,"pyrightconfig.json");try{const e=await r.promises.readFile(s,"utf8"),t=JSON.parse(e);n=u.all([n,t,n],{arrayMerge:V})}catch{}const i=JSON.stringify(n);await S.run((()=>C.generateFile(s,i)))}))}async function Ye(e){return j.functionIgnoringException("generateReadme",(async()=>{const n=t.resolve(e.dirPath,"README.md");let s=await r.promises.readFile(n,"utf8");r.existsSync(t.resolve(e.dirPath,".releaserc.json"))&&(s=Ke(s,"[](https://github.com/semantic-release/semantic-release)"));const i=e.repository?.slice(e.repository?.indexOf(":")+1),o=r.readdirSync(`${e.dirPath}/.github/workflows`);for(const n of o){if(!n.startsWith("test")&&!n.startsWith("deploy"))continue;let o=n;o=o[0].toUpperCase()+o.slice(1,o.indexOf(".")),o=o.replace("-"," ");const a=`[](https://github.com/${i}/actions/workflows/${n})`;r.existsSync(t.resolve(e.dirPath,`.github/workflows/${n}`))&&(s=Ke(s,a))}await S.run((()=>C.generateFile(n,s)))}))}function Ke(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 s=e.slice(0,n+1);let i=e.slice(n+1);return i.startsWith("[")||i.startsWith("!")||(i=`\n${i}`),`${s}${t}\n${i}`}return`${e}\n${t}\n`}async function Ve(e){return j.functionIgnoringException("generateReleaserc",(async()=>{const n=t.resolve(e.dirPath,".releaserc.json"),s=JSON.parse(await r.promises.readFile(n,"utf8")),i=s?.plugins||[];for(let e=0;e<i.length;e++){const t=Array.isArray(i[e])?i[e][0]:i[e],n=Array.isArray(i[e])&&i[e][1]||{};"@semantic-release/commit-analyzer"===t?i[e]=["@semantic-release/commit-analyzer",u.all([n,{preset:"conventionalcommits"}],{arrayMerge:V})]:"@semantic-release/github"===t&&(i[e]=["@semantic-release/github",u.all([n,{successComment:!1,failComment:!1,labels:["r: semantic-release"],releasedLabels:["released :bookmark:"]}],{arrayMerge:V})])}const o=JSON.stringify(s);await S.run((()=>C.generateFile(n,o)))}))}const Xe={$schema:"https://docs.renovatebot.com/renovate-schema.json",extends:["github>WillBooster/willbooster-configs:renovate.json5"]};async function Qe(e){return j.functionIgnoringException("generateRenovateJson",(async()=>{let n=m(Xe);const s=t.resolve(e.dirPath,"renovate.json");if(r.existsSync(`${s}5`))return;try{const e=await r.promises.readFile(s,"utf8"),t=JSON.parse(e);n=u.all([n,t,n],{arrayMerge:V}),n.extends=n.extends.filter((e=>"@willbooster"!==e))}catch{}e.depending.blitz&&(n.packageRules??=[],n.packageRules.some((e=>e.packageNames.includes("next")))||n.packageRules.push({packageNames:["next"],enabled:!1})),await S.run((()=>r.promises.rm(t.resolve(e.dirPath,".dependabot"),{force:!0}))),await S.run((()=>r.promises.rm(t.resolve(e.dirPath,".renovaterc.json"),{force:!0})));const i=JSON.stringify(n);await S.run((()=>C.generateFile(s,i)))}))}function Ze(e){const t=Object.entries(e).sort((([e],[t])=>e.localeCompare(t)));for(const[n,s]of t)delete e[n],e[n]=s,"object"==typeof s&&null!==s&&Ze(s);return e}const et={compilerOptions:{target:"ES2022",module:"ESNext",moduleResolution:"Node",jsx:"react-jsx",alwaysStrict:!0,strict:!0,skipLibCheck:!0,allowSyntheticDefaultImports:!0,esModuleInterop:!0,resolveJsonModule:!0,declaration:!0,sourceMap:!0,importHelpers:!1,outDir:"dist",typeRoots:["./node_modules/@types","./@types"]},include:["src/**/*","tests/**/*","scripts/**/*","packages/*/src/**/*","packages/*/tests/**/*","packages/*/scripts/**/*"]},tt={compilerOptions:{target:"ES2022",module:"ESNext",moduleResolution:"Node",jsx:"react-jsx",alwaysStrict:!0,strict:!0,skipLibCheck:!0,allowSyntheticDefaultImports:!0,esModuleInterop:!0,resolveJsonModule:!0,declaration:!0,sourceMap:!0,importHelpers:!1,outDir:"dist",typeRoots:["../../node_modules/@types","../../@types","./@types"]},include:["src/**/*","tests/**/*","scripts/**/*"]};async function nt(e){return j.functionIgnoringException("generateTsconfig",(async()=>{if(e.depending.blitz||e.depending.next)return;let n=m(e.isRoot?et:tt);e.doesContainsJsxOrTsx||e.doesContainsJsxOrTsxInPackages||delete n.compilerOptions?.jsx,e.isRoot&&!e.doesContainsSubPackageJsons&&(n.include=n.include?.filter((e=>!e.startsWith("packages/*/")))),e.isEsmPackage&&(n.compilerOptions={...n.compilerOptions,module:"NodeNext",moduleResolution:"NodeNext"});const s=t.resolve(e.dirPath,"tsconfig.json");try{const t=await r.promises.readFile(s,"utf8"),i=JSON.parse(t);"./node_modules/@willbooster/tsconfig/tsconfig.json"===i.extends&&delete i.extends,delete n.compilerOptions?.target,e.isEsmPackage||(delete n.compilerOptions?.module,delete n.compilerOptions?.moduleResolution),i.compilerOptions?.jsx&&delete n.compilerOptions?.jsx,n=u.all([n,i,n],{arrayMerge:X}),n.include=n.include?.filter((e=>!e.includes("@types")&&!e.includes("__tests__")))}catch{}Ze(n),n.include?.sort();const i=JSON.stringify(n);delete n.compilerOptions?.experimentalDecorators,await S.run((()=>C.generateFile(s,i)))}))}const st=["**/.git/objects/**","**/.git/subtree-cache/**","**/node_modules/**","**/tmp/**","**/temp/**","**/dist/**"];async function it(e){return j.functionIgnoringException("generateVscodeSettings",(async()=>{try{const n=t.resolve(e.dirPath,".vscode","settings.json"),s=await r.promises.readFile(n,"utf8");let i=JSON.parse(s);for(const e of st)i=u.all([i,ot(e)]);e.doesContainsPoetryLock&&(i=u.all([i,ot("**/.venv/**")])),e.depending.next&&(i=u.all([i,ot("**/.next/**")])),Ze(i??{});const o=JSON.stringify(i,void 0,2);await S.run((()=>C.generateFile(n,o)))}catch{}}))}function ot(e){return{"files.watcherExclude":{[e]:!0}}}const rt={test:{name:"Test",on:{pull_request:{"paths-ignore":["**.md","**/docs/**"]},push:{branches:["main","wbfy"],"paths-ignore":["**.md","**/docs/**"]}},concurrency:{group:"${{ github.workflow }}-${{ github.ref }}","cancel-in-progress":!0},jobs:{test:{uses:"WillBooster/reusable-workflows/.github/workflows/test.yml@main"}}},release:{name:"Release",on:{push:{branches:[]}},concurrency:{group:"${{ github.workflow }}","cancel-in-progress":!1},jobs:{release:{uses:"WillBooster/reusable-workflows/.github/workflows/release.yml@main"}}},wbfy:{name:"Willboosterify",on:{workflow_dispatch:null},jobs:{wbfy:{uses:"WillBooster/reusable-workflows/.github/workflows/wbfy.yml@main"}}},"wbfy-merge":{name:"Merge wbfy",on:{workflow_dispatch:null},jobs:{"wbfy-merge":{uses:"WillBooster/reusable-workflows/.github/workflows/wbfy-merge.yml@main"}}},"semantic-pr":{name:"Lint PR title",on:{pull_request_target:{types:["opened","edited","synchronize"]}},jobs:{"semantic-pr":{uses:"WillBooster/reusable-workflows/.github/workflows/semantic-pr.yml@main"}}},sync:{name:"Sync",on:{},jobs:{sync:{uses:"WillBooster/reusable-workflows/.github/workflows/sync.yml@main"}}},"notify-ready":{name:"Notify ready",on:{issues:{types:["labeled"]}},jobs:{"notify-ready":{uses:"WillBooster/reusable-workflows/.github/workflows/notify-ready.yml@main",secrets:{DISCORD_WEBHOOK_URL:"${{ secrets.DISCORD_WEBHOOK_URL_FOR_READY }}"}}}},"close-comment":{name:"Add close comment",on:{pull_request:{types:["opened"]}},jobs:{"close-comment":{uses:"WillBooster/reusable-workflows/.github/workflows/close-comment.yml@main"}}},"add-issue-to-project":{name:"Add issue to GitHub project",on:{issues:{types:["labeled"]}},jobs:{"add-issue-to-project":{uses:"WillBooster/reusable-workflows/.github/workflows/add-issue-to-project.yml@main",secrets:{GH_PROJECT_URL:"${{ secrets.GH_PROJECT_URL }}"}}}},"add-ready-issue-to-project":{name:"Add ready issue to GitHub project",on:{issues:{types:["labeled"]}},jobs:{"add-ready-issue-to-project":{uses:"WillBooster/reusable-workflows/.github/workflows/add-issue-to-project.yml@main",with:{labeled:"ready :rocket:"},secrets:{GH_PROJECT_URL:"https://github.com/orgs/WillBoosterLab/projects/5"}}}}};async function at(e){return j.functionIgnoringException("generateWorkflow",(async()=>{const n=t.resolve(e.dirPath,".github","workflows");await r.promises.mkdir(n,{recursive:!0});const s=t.resolve(e.dirPath,".github","semantic.yml");await S.run((()=>r.promises.rm(s,{force:!0,recursive:!0})));const i=await r.promises.readdir(n,{withFileTypes:!0}),o=new Set(["test.yml","wbfy.yml","wbfy-merge.yml","semantic-pr.yml","close-comment.yml","add-issue-to-project.yml",...i.filter((e=>e.isFile()&&e.name.endsWith(".yml"))).map((e=>e.name))]);e.depending.semanticRelease&&o.add("release.yml"),(e.isPublicRepo||e.repository?.startsWith("github:WillBoosterLab/"))&&(o.add("add-ready-issue-to-project.yml"),o.add("notify-ready.yml"));for(const s of o){const i=t.basename(s,".yml");await S.run((()=>ct(e,n,i)))}await S.run((()=>r.promises.rm(t.join(n,"add-focused-issue-to-project.yml"),{force:!0,recursive:!0})))}))}async function ct(e,n,s){let i=m(rt[s]??{});const o=t.join(n,`${s}.yml`);try{const e=await r.promises.readFile(o,"utf8"),t=g.load(e);i=u.all([i,t,i],{arrayMerge:X})}catch{}s.startsWith("deploy")&&(i={...i,concurrency:{group:"${{ github.workflow }}","cancel-in-progress":!1}},i.jobs&&function(e,t){const n=e[t];delete e[t],e[t]=n}(i,"jobs"),i.on?.push&&(i.on.push["paths-ignore"]=[...new Set([...i.on.push["paths-ignore"]??[],"**.md","**/docs/**"])]));for(const t of Object.values(i.jobs)){if(!t.uses?.includes?.("/reusable-workflows/"))return;lt(e,t,s)}switch(s){case"release":if(i.on?.schedule)delete i.on.push;else{if(!(i.on?.push&&e.release.branches.length>0))return void await r.promises.rm(t.join(n,"release.yml"),{force:!0});i.on.push.branches=e.release.branches}break;case"test":i.on?.push&&(i.on.push.branches=i.on.push.branches.filter((e=>"renovate/**"!==e)));break;case"wbfy":i.on&&pt(i,20,24);break;case"wbfy-merge":pt(i,1,4)}if(function(e){delete e.jobs["add-to-project"]}(i),await dt(i,o),"release"===s)await r.promises.rm(t.join(n,"semantic-release.yml"),{force:!0});else if("sync"===s){if(await r.promises.rm(t.join(n,"sync-init.yml"),{force:!0}),!i.jobs.sync||!i.jobs.sync.with)return;i.jobs["sync-force"]=i.jobs.sync;const e=i.jobs.sync.with.sync_params_without_dest;if(!e)return;i.jobs.sync.with.sync_params_without_dest=`--force ${e}`,i.name="Force to Sync",i.on={workflow_dispatch:null},delete i.jobs.sync,await dt(i,t.join(n,"sync-force.yml"))}}function lt(e,t,n){if(t.with||={},t.secrets||={},"test"!==n&&"release"!==n&&"wbfy"!==n&&"wbfy-merge"!==n&&"add-issue-to-project"!==n&&"add-ready-issue-to-project"!==n||(t.secrets.GH_TOKEN=e.isPublicRepo?"${{ secrets.PUBLIC_GH_BOT_PAT }}":"${{ secrets.GH_BOT_PAT }}"),!e.release.npm||"release"!==n&&"test"!==n||(t.secrets.NPM_TOKEN="${{ secrets.NPM_TOKEN }}"),t.secrets.FIREBASE_TOKEN&&(t.secrets.GCP_SA_KEY_JSON_FOR_FIREBASE="${{ secrets.GCP_SA_KEY_JSON_FOR_FIREBASE }}",delete t.secrets.FIREBASE_TOKEN),(t.secrets.DISCORD_WEBHOOK_URL&&("release"===n||n.startsWith("deploy"))||t.with.server_url&&n.startsWith("deploy"))&&(t.secrets.DISCORD_WEBHOOK_URL="${{ secrets.DISCORD_WEBHOOK_URL_FOR_RELEASE }}"),"sync"===n){const e=t.with?.sync_params_without_dest;e&&(t.with.sync_params_without_dest=e.toString().replace("sync ",""))}if(e.repository?.startsWith("github:WillBooster/")?t.uses=t.uses.replace("WillBoosterLab/","WillBooster/"):e.repository?.startsWith("github:WillBoosterLab/")&&(t.uses=t.uses.replace("WillBooster/","WillBoosterLab/")),".env"===t.with.dot_env_path&&delete t.with.dot_env_path,function(e){if(!e.with)return;delete e.with.non_self_hosted,delete e.with.notify_discord,delete e.with.require_fly,delete e.with.require_gcloud,delete e.with.cpu_arch,delete e.with.label,delete e.with.labelOperator}(t),n.startsWith("deploy")&&t.secrets.FLY_API_TOKEN&&t.with.deploy_command&&(t.with.deploy_command=t.with.deploy_command.toString().replace(/\s+--json/,"")),e.doesContainsDockerfile&&("extra-large"!==t.with.ci_size&&(n.startsWith("deploy")||n.startsWith("test"))&&(t.with.ci_size="large"),n.startsWith("deploy")&&(t.with.cpu_arch="X64")),"release"===n||"test"===n||"wbfy"===n||"wbfy-merge"===n||n.startsWith("deploy")?e.isPublicRepo&&(t.with.github_hosted_runner=!0):delete t.with.github_hosted_runner,Object.keys(t.with).length>0?Ze(t.with):delete t.with,Object.keys(t.secrets).length>0){const e=Ze(t.secrets);delete t.secrets,t.secrets=e}else delete t.secrets}function pt(e,t,n){const[s,i]=(e.on.schedule?.[0]?.cron??"").split(" ").map(Number);if(0!==s&&Number.isInteger(i)){const e=(i+9)%24;if(t<n?t<=e&&e<n:t<=e||e<n)return}const o=`${1+Math.floor(59*Math.random())} ${(t+Math.floor(Math.random()*(n-t))-9+24)%24} * * *`;e.on.schedule=[{cron:o}]}async function dt(e,t){const n=g.dump(e,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}});await r.promises.writeFile(t,n)}async function ut(e){return j.functionIgnoringException("generateYarnrcYml",(async()=>{const n=t.resolve(e.dirPath,".yarnrc.yml");if(e.isBun)return await S.run((()=>r.promises.rm(n,{force:!0}))),await S.run((()=>r.promises.rm(t.resolve(e.dirPath,".yarn"),{force:!0,recursive:!0}))),void await S.run((()=>r.promises.rm(t.resolve(e.dirPath,"yarn.lock"),{force:!0,recursive:!0})));const s=W("yarn",["--version"],e.dirPath),i=function(e,t){const n=W("npm",["show",e,"versions","--json"],t);return JSON.parse(n).at(-1)}("@yarnpkg/cli",e.dirPath);mt(s)<=mt(i)&&s!==i&&R("yarn",["set","version",i],e.dirPath,1);const o=t.join(e.dirPath,".yarn","releases");await r.promises.mkdir(o,{recursive:!0});for(const e of await r.promises.readdir(o))e.startsWith("yarn-")&&!e.startsWith(`yarn-${i}.`)&&await S.run((()=>r.promises.rm(t.join(o,e))));const a=t.resolve(e.dirPath,".yarnrc");await S.run((()=>r.promises.rm(a,{force:!0})));const c=g.load(await r.promises.readFile(n,"utf8"));c.defaultSemverRangePrefix="",c.nodeLinker="node-modules",c.nmMode="hardlinks-global",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 n=t.resolve(e.dirPath,".yarnrc","undefined.cjs");await S.run((()=>r.promises.rm(n,{force:!0})))}0===c.plugins.length&&delete c.plugins,await r.promises.writeFile(n,g.dump(c,{lineWidth:-1})),R("yarn",["dlx","yarn-plugin-auto-install"],e.dirPath)}))}function mt(e){const[t]=e.split(".");return Number(t)}async function ft(e){return j.functionIgnoringException("setupLabels",(async()=>{if(!D)return;const[t,n]=A.getOrgAndName(e.repository??"");if(t&&n&&("WillBooster"===t||"WillBoosterLab"===t))try{await gt(t,n,"d1: x-easy :hedgehog:","EDE9FE"),await gt(t,n,"d2: easy :rabbit2:","DDD6FE"),await gt(t,n,"d3: medium :ox:","C4B5FD"),await gt(t,n,"d4: hard :squid:","A78BFA"),await gt(t,n,"d5: x-hard :whale2:","8B5CF6"),await gt(t,n,"p1: critical :fire::fire::fire:","EF4444"),await gt(t,n,"p2: urgent :fire::fire:","F87171"),await gt(t,n,"p3: important :fire:","FCA5A5"),await gt(t,n,"p4: nice to have :droplet:","FECACA"),await gt(t,n,"r: blitz","5300bc"),await gt(t,n,"r: firebase","ffca28"),await gt(t,n,"r: prisma","0c344b"),await gt(t,n,"r: react","61dafb"),await gt(t,n,"r: svelte","ff3e00"),await gt(t,n,"r: semantic-release","494949"),await gt(t,n,"ready :rocket:","22C55E"),await gt(t,n,"review requested :mag:","FBCA04"),await gt(t,n,"released :bookmark:","6366F1"),await gt(t,n,"s: 0.5h :clock1230:","F3F4F6"),await gt(t,n,"s: 1h :clock1:","E5E7EB"),await gt(t,n,"s: 2h :clock2:","D1D5DB"),await gt(t,n,"s: 3h :clock3:","9CA3AF"),await gt(t,n,"s: 5h :clock5:","6B7280"),await gt(t,n,"s: 8h :clock8:","4B5563"),await gt(t,n,"s: 13h :clock1:","374151"),await gt(t,n,"t: build :hammer:","BFDBFE"),await gt(t,n,"t: chore :broom:","BFDBFE"),await gt(t,n,"t: ci :construction_worker:","BFDBFE"),await gt(t,n,"t: docs :memo:","BFDBFE"),await gt(t,n,"t: feat :sparkles:","BFDBFE"),await gt(t,n,"t: fix :bug:","BFDBFE"),await gt(t,n,"t: perf :zap:","BFDBFE"),await gt(t,n,"t: refactor :recycle:","BFDBFE"),await gt(t,n,"t: style :lipstick:","BFDBFE"),await gt(t,n,"t: test :test_tube:","BFDBFE"),await gt(t,n,"project","24292F"),await gt(t,n,"focused :dart:","22C55E"),await ht(t,n,"bug"),await ht(t,n,"documentation"),await ht(t,n,"duplicate"),await ht(t,n,"enhancement"),await ht(t,n,"good first issue"),await ht(t,n,"help wanted"),await ht(t,n,"invalid"),await ht(t,n,"question"),await ht(t,n,"wontfix"),await ht(t,n,"ready"),await ht(t,n,"review requested"),await ht(t,n,"released"),await ht(t,n,"semantic-release")}catch(e){console.warn("Skip setupLabels due to:",e?.stack??e)}}))}async function gt(e,t,n,s){try{await T.request("POST /repos/{owner}/{repo}/labels",{owner:e,repo:t,name:n,color:s})}catch{await T.request("PATCH /repos/{owner}/{repo}/labels/{name}",{owner:e,repo:t,name:n,color:s})}}async function ht(e,t,n){try{await T.request("DELETE /repos/{owner}/{repo}/labels/{name}",{owner:e,repo:t,name:n})}catch{}}const yt=["READY_DISCORD_WEBHOOK_URL"];async function wt(e){return j.functionIgnoringException("setupSecrets",(async()=>{if(!D||!k.doesUploadEnvVars)return;const[t,n]=A.getOrgAndName(e.repository??"");if(!t||!n||"WillBoosterLab"!==t)return;const s=h.config().parsed||{};if(0!==Object.keys(s).length)try{for(const e of yt)try{await T.request("DELETE /repos/{owner}/{repo}/actions/secrets/{secret_name}",{owner:t,repo:n,secret_name:e})}catch{}const i=await T.request("GET /repos/{owner}/{repo}/actions/secrets/public-key",{owner:t,repo:n}),{key:o,key_id:r}=i.data;await y.ready;for(const[i,a]of Object.entries(s)){if(e.isPublicRepo&&"GH_BOT_PAT"===i)continue;if(!e.isPublicRepo&&"PUBLIC_GH_BOT_PAT"===i)continue;const s=y.from_base64(o,y.base64_variants.ORIGINAL),c=y.from_string(a),l=y.crypto_box_seal(c,s),p=y.to_base64(l,y.base64_variants.ORIGINAL);await T.request("PUT /repos/{owner}/{repo}/actions/secrets/{secret_name}",{owner:t,repo:n,secret_name:i,encrypted_value:p,key_id:r})}}catch(e){console.warn("Skip setupSecrets due to:",e?.stack??e)}}))}async function bt(e){const[t,n]=A.getOrgAndName(e.repository??"");t&&n&&("WillBooster"!==t&&"WillBoosterLab"!==t||await s((()=>T.request("PATCH /repos/{owner}/{repo}",{owner:t,repo:n,allow_merge_commit:!1,allow_squash_merge:!0,allow_rebase_merge:!1,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}:{}}))))}const vt={"pull_request_template.md":'\nClose #<IssueNumber>\n\n## Self Check\n\n- [ ] I\'ve confirmed `All checks have passed` on this page. (このページで `All checks have passed` が表示されていることを確認した。)\n - You may leave this box unchecked due to long workflows.\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 - All tests are passed.\n - Test command (e.g., `yarn test`) is passed.\n - Lint command (e.g., `yarn lint`) is passed.\n- [ ] I\'ve reviewed my changes on GitHub PR\'s diff view. (GitHub上で自分の変更内容を確認した。)\n- [ ] I\'ve written the steps to test. (テスト手順を記載した。)\n- [ ] I\'ve added screenshots. (UIを変更した場合、スクリーンショットを追加した。)\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## 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\n\x3c!-- 日本語で記述しても大丈夫です。 --\x3e\n'.trim()};async function kt(e){return j.functionIgnoringException("generateGitHubTemplates",(async()=>{for(const[n,s]of Object.entries(vt)){const i=t.resolve(e.dirPath,".github",n);if(r.existsSync(i)){const e=await r.promises.readFile(i,"utf8");if(w(e,s)>s.length/2)continue}await r.promises.mkdir(t.resolve(e.dirPath,".github"),{recursive:!0}),await S.run((()=>C.generateFile(i,s)))}}))}const jt=v.object({typos:v.object({all:v.record(v.string()).optional(),doc:v.record(v.string()).optional(),ts:v.record(v.string()).optional(),text:v.record(v.string()).optional()}).optional()});async function xt(n,s){const i=t.resolve(n,"package.json");try{const o=r.existsSync(i);let a={},c={},l={},p=!1;if(o){const e=r.readFileSync(i,"utf8");l=JSON.parse(e),a=l.dependencies??{},c=l.devDependencies??{},p="module"===l.type}let d=[],u=[];try{const s=t.resolve(n,".releaserc.json"),i=JSON.parse(await e.readFile(s,"utf8"));d=i?.branches||[],u=i?.plugins?.flat()||[]}catch{}const m="packages"!==t.basename(t.resolve(n,".."))||!r.existsSync(t.resolve(n,"..","..","package.json"));let f;m&&(f=await async function(e,t){const n=b(e),s=(await n.getRemotes(!0)).find((e=>"origin"===e.name)),i=s?.refs?.fetch??s?.refs?.push;if("string"==typeof i){const e=await Pt(i);if(e)return e}const o="string"==typeof t.repository?t.repository:t.repository?.url;if(o){const e=await Pt(o);if(e&&"Not Found"!==e.message)return e}}(n,l));let g="";try{g+=(await e.readFile(t.resolve(n,".tool-versions"),"utf8")).trim()}catch{}for(const[s,i]of[["java","java"],["node","nodejs"],["python","python"]])try{const o=await e.readFile(t.resolve(n,`.${s}-version`),"utf8");g&&(g+="\n"),g+=i+" "+o.trim()}catch{}let h="";try{h=await e.readFile(t.resolve(n,"Dockerfile"),"utf8")}catch{}const y=t.resolve(n,"wbfy.json");let w;try{const t=await e.readFile(y,"utf8");w=jt.parse(JSON.parse(t))}catch{}const v={dirPath:n,dockerfile:h,isRoot:m,isPublicRepo:!1===f?.private,isReferredByOtherRepo:!!l.files,repository:f?.full_name?`github:${f?.full_name}`:void 0,isBun:s?.isBun||r.existsSync(t.join(n,"bunfig.toml")),isEsmPackage:p,isWillBoosterConfigs:i.includes(`${t.sep}willbooster-configs`),doesContainsSubPackageJsons:_t("packages/**/package.json",n),doesContainsDockerfile:!!h||r.existsSync(t.resolve(n,"docker-compose.yml")),doesContainsGemfile:r.existsSync(t.resolve(n,"Gemfile")),doesContainsGoMod:r.existsSync(t.resolve(n,"go.mod")),doesContainsPackageJson:r.existsSync(t.resolve(n,"package.json")),doesContainsPoetryLock:r.existsSync(t.resolve(n,"poetry.lock")),doesContainsPomXml:r.existsSync(t.resolve(n,"pom.xml")),doesContainsPubspecYaml:r.existsSync(t.resolve(n,"pubspec.yaml")),doesContainsTemplateYaml:r.existsSync(t.resolve(n,"template.yaml")),doesContainsVscodeSettingsJson:r.existsSync(t.resolve(n,".vscode","settings.json")),doesContainsJavaScript:_t("{app,src,tests,scripts}/**/*.{cjs,mjs,js,jsx}",n),doesContainsTypeScript:_t("{app,src,tests,scripts}/**/*.{cts,mts,ts,tsx}",n),doesContainsJsxOrTsx:_t("{app,src,tests}/**/*.{t,j}sx",n),doesContainsJavaScriptInPackages:_t("packages/**/{app,src,tests,scripts}/**/*.{cjs,mjs,js,jsx}",n),doesContainsTypeScriptInPackages:_t("packages/**/{app,src,tests,scripts}/**/*.{cts,mts,ts,tsx}",n),doesContainsJsxOrTsxInPackages:_t("packages/**/{app,src,tests}/**/*.{t,j}sx",n),depending:{blitz:!!a.blitz,firebase:!!c["firebase-tools"],litestream:h.includes("install-litestream.sh"),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")},versionsText:g,packageJson:l,wbfyJson:w};if(v.isBun||(v.eslintBase=function(e){if(e.depending.blitz)return"@willbooster/eslint-config-blitz-next";if(e.depending.next)return"@willbooster/eslint-config-next";if(e.doesContainsTypeScript)return e.doesContainsJsxOrTsx?"@willbooster/eslint-config-ts-react":"@willbooster/eslint-config-ts";if(e.doesContainsJsxOrTsx)return"@willbooster/eslint-config-js-react";if(e.doesContainsJavaScript)return"@willbooster/eslint-config-js"}(v)),v.doesContainsGemfile||v.doesContainsGoMod||v.doesContainsPackageJson||v.doesContainsPoetryLock||v.doesContainsPomXml||v.doesContainsPubspecYaml||v.doesContainsTemplateYaml)return v}catch{}}function _t(e,t){return c(e,{dot:!0,cwd:t}).length>0}async function Pt(e){const[t,n]=A.getOrgAndName(e);if(!t||!n)return;const s={full_name:`${t}/${n}`};try{const e=await T.request("GET /repos/{owner}/{repo}",{owner:t,repo:n});Object.assign(s,e.data)}catch{}return s}await async function(){const n=await o(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"}}).strict().argv;k.isVerbose=n.verbose,k.doesUploadEnvVars=n.env;for(const s of n.paths){const o=t.join(s,"packages"),r=(await i((()=>e.readdir(o,{withFileTypes:!0})))??[]).filter((e=>e.isDirectory())).map((e=>t.join(o,e.name)));await $([s,...r]);const a=await xt(s);if(!a){console.error(`there is no valid package.json in ${s}`);continue}const c=E(a),l=(await Promise.all(r.map((e=>xt(e,a))))).filter((e=>!!e)),p=[a,...l];if(k.isVerbose)for(const e of p)console.info(e);await H(a),await ut(a),await Promise.all([x(a),P(a),c.then((()=>Ye(a))),ce(a),de(a),he(a),kt(a),We(a),Qe(a),Ve(a),at(a),ft(a),wt(a),bt(a),...a.isBun?[ee(a),Ie(a).then((()=>Le(a)))]:[Ie(a)],ze(a)]),await S.promiseAll();const d=[];for(const e of p)(e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages)&&d.push(F(e,e.isRoot?p:[e])),e.depending.playwrightTest&&d.push(_(e)),e.depending.next&&d.push(Ue(e)),await we(e,a),await S.promiseAll(),(e.isRoot||e.doesContainsPackageJson)&&(await He(e),await Ee(e,a,n.skipDeps),d.push(ze(e)),e.doesContainsVscodeSettingsJson&&e.doesContainsPackageJson&&d.push(it(e)),(e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages)&&d.push(nt(e)),(e.doesContainsJavaScript||e.doesContainsJavaScriptInPackages||e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages)&&(a.isBun&&d.push(Z(e)),a.isWillBoosterConfigs||d.push(fe(e,a)),d.push(me(e))),e.depending.pyright&&d.push(qe(e)));await Promise.all(d),await S.promiseAll();const u=a.isBun?"bun":"yarn";R(u,["cleanup"],s),a.isBun?R(u,["update"],s):R(u,["install"],s)}}();
|
2
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9vcHRpb25zLnRzIiwiLi4vc3JjL2xvZ2dlci50cyIsIi4uL3NyYy9maXhlcnMvZG9ja2VyZmlsZS50cyIsIi4uL3NyYy9maXhlcnMvcGxheXdyaWdodENvbmZpZy50cyIsIi4uL3NyYy9maXhlcnMvcHJpc21hLnRzIiwiLi4vc3JjL2ZpeGVycy90ZXN0RGlyZWN0b3J5LnRzIiwiLi4vc3JjL3V0aWxzL3Byb21pc2VQb29sLnRzIiwiLi4vc3JjL2ZpeGVycy90eXBlRGVmaW5pdGlvbi50cyIsIi4uL3NyYy91dGlscy9mc1V0aWwudHMiLCIuLi9zcmMvZml4ZXJzL3R5cG9zLnRzIiwiLi4vc3JjL3V0aWxzL2dpdGh1YlV0aWwudHMiLCIuLi9zcmMvdXRpbHMvc3Bhd25VdGlsLnRzIiwiLi4vc3JjL3V0aWxzL3ZlcnNpb24udHMiLCIuLi9zcmMvdXRpbHMvdmVyc2lvbkNvbnN0YW50cy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2FzZGYudHMiLCIuLi9zcmMvdXRpbHMvbWVyZ2VVdGlsLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvYmlvbWUudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9idW5maWcudHMiLCIuLi9zcmMvdXRpbHMvaWdub3JlRmlsZVV0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9kb2NrZXJpZ25vcmUudHMiLCIuLi9zcmMvdXRpbHMvZXh0ZW5zaW9ucy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2VkaXRvcmNvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2VzbGludGlnbm9yZS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2VzbGludHJjLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2l0YXR0cmlidXRlcy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2dpdGlnbm9yZS50cyIsIi4uL3NyYy9naXRodWIvY29tbWl0LnRzIiwiLi4vc3JjL3V0aWxzL2VzbGludFV0aWwudHMiLCIuLi9zcmMvdXRpbHMvc3JjRGlyZWN0b3JpZXMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9wYWNrYWdlSnNvbi50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2h1c2t5cmMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9pZGVhLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvbGVmdGhvb2sudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9saW50c3RhZ2VkcmMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9uZXh0Y29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcHJldHRpZXJpZ25vcmUudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9weXJpZ2h0Y29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVhZG1lLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVsZWFzZXJjLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVub3ZhdGVyYy50cyIsIi4uL3NyYy91dGlscy9vYmplY3RVdGlsLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvdHNjb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy92c2NvZGVTZXR0aW5ncy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3dvcmtmbG93LnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMveWFybnJjLnRzIiwiLi4vc3JjL2dpdGh1Yi9sYWJlbC50cyIsIi4uL3NyYy9naXRodWIvc2VjcmV0LnRzIiwiLi4vc3JjL2dpdGh1Yi9zZXR0aW5ncy50cyIsIi4uL3NyYy9naXRodWIvdGVtcGxhdGUudHMiLCIuLi9zcmMvcGFja2FnZUNvbmZpZy50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJjbGFzcyBPcHRpb25zIHtcbiAgaXNWZXJib3NlOiBib29sZWFuO1xuICBkb2VzVXBsb2FkRW52VmFyczogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmlzVmVyYm9zZSA9IGZhbHNlO1xuICAgIHRoaXMuZG9lc1VwbG9hZEVudlZhcnMgPSBmYWxzZTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7XG4iLCJpbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi9vcHRpb25zLmpzJztcblxuY2xhc3MgTG9nZ2VyIHtcbiAgYXN5bmMgZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbihuYW1lOiBzdHJpbmcsIGZ1bmM6ICgpID0+IFByb21pc2U8dm9pZD4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgLS0tLS0tLS0tICR7bmFtZX0gc3RhcnQgLS0tLS0tLS0tYCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmdW5jKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRXJyb3Igb2NjdXJyZWQgaW4gJHtuYW1lfTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3Iuc3RhY2sgOiBlcnJvcn19YCk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGAtLS0tLS0tLS0tICR7bmFtZX0gZW5kIC0tLS0tLS0tLS1gKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGxvZ2dlciA9IG5ldyBMb2dnZXIoKTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeERvY2tlcmZpbGUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4RG9ja2VyZmlsZScsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWNvbmZpZy5kb2VzQ29udGFpbnNEb2NrZXJmaWxlKSByZXR1cm47XG5cbiAgICBjb25zdCBvbGRDb250ZW50ID0gY29uZmlnLmRvY2tlcmZpbGU7XG4gICAgY29uc3QgbmV3Q29udGVudCA9IG9sZENvbnRlbnQ7XG5cbiAgICBpZiAob2xkQ29udGVudCA9PT0gbmV3Q29udGVudCkgcmV0dXJuO1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZShwYXRoLmpvaW4oY29uZmlnLmRpclBhdGgsICdEb2NrZXJmaWxlJyksIG5ld0NvbnRlbnQpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFBsYXl3cmlnaHRDb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4UGxheXdyaWdodENvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihjb25maWcuZGlyUGF0aCwgJ3BsYXl3cmlnaHQuY29uZmlnLnRzJyk7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuXG4gICAgY29uc3QgbmV3Q29udGVudCA9IG9sZENvbnRlbnQucmVwbGFjZSgvcmV0cmllczouKywvLCAncmV0cmllczogcHJvY2Vzcy5lbnYuUFdERUJVRyA/IDAgOiBwcm9jZXNzLmVudi5DSSA/IDUgOiAxLCcpO1xuICAgIGlmIChvbGRDb250ZW50ID09PSBuZXdDb250ZW50KSByZXR1cm47XG5cbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGdsb2JieSB9IGZyb20gJ2dsb2JieSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFByaXNtYUVudkZpbGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFByaXNtYUVudkZpbGVzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGVudkZpbGVzID0gYXdhaXQgZ2xvYmJ5KFsnKi5lbnYnLCAnKi5lbnYuKiddLCB7IGRvdDogdHJ1ZSwgY3dkOiBjb25maWcuZGlyUGF0aCB9KTtcbiAgICBmb3IgKGNvbnN0IGVudkZpbGUgb2YgZW52RmlsZXMpIHtcbiAgICAgIGNvbnN0IGVudkZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBlbnZGaWxlKTtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShlbnZGaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoXG4gICAgICAgIC9EQVRBQkFTRV9VUkw9XCI/KC4rXFwuc3FsaXRlMylcIj9bXFxuJF0vLFxuICAgICAgICAnREFUQUJBU0VfVVJMPVwiJDE/Y29ubmVjdGlvbl9saW1pdD0xXCJcXG4nXG4gICAgICApO1xuICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKGVudkZpbGVQYXRoLCBuZXdDb250ZW50KTtcbiAgICB9XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFRlc3REaXJlY3Rvcmllc1VwZGF0aW5nUGFja2FnZUpzb24ocGFja2FnZURpclBhdGhzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFRlc3REaXJlY3Rvcmllc1VwZGF0aW5nUGFja2FnZUpzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBwYWNrYWdlRGlyUGF0aHMubWFwKGFzeW5jIChwYWNrYWdlRGlyUGF0aCkgPT4ge1xuICAgICAgICBjb25zdCBvbGRUZXN0RGlyUGF0aCA9IHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ19fdGVzdHNfXycpO1xuICAgICAgICBjb25zdCBuZXdUZXN0RGlyUGF0aCA9IHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ3Rlc3RzJyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMucmVuYW1lKG9sZFRlc3REaXJQYXRoLCBuZXdUZXN0RGlyUGF0aCk7XG4gICAgICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpO1xuICAgICAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBvbGRDb250ZW50LnJlcGxhY2VBbGwoJ19fdGVzdHNfXycsICd0ZXN0cycpO1xuICAgICAgICAgIGlmIChvbGRDb250ZW50ID09PSBuZXdDb250ZW50KSByZXR1cm47XG5cbiAgICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAncGFja2FnZS5qc29uJyksIG5ld0NvbnRlbnQpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgeyBQcm9taXNlUG9vbCB9IGZyb20gJ21pbmltYWwtcHJvbWlzZS1wb29sJztcblxuZXhwb3J0IGNvbnN0IHByb21pc2VQb29sID0gbmV3IFByb21pc2VQb29sKCk7XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBpZ25vcmVFbm9lbnRBc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhUeXBlRGVmaW5pdGlvbnMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgY29uZmlnc0luY2x1ZGluZ0NoaWxkcmVuOiBQYWNrYWdlQ29uZmlnW11cbik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFR5cGVEZWZpbml0aW9ucycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBsaWJUeXBlRGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ0B0eXBlcycpO1xuICAgIGNvbnN0IHNyY1R5cGVEaXJQYXRoID1cbiAgICAgIGNvbmZpZy5pc1Jvb3QgJiYgY29uZmlnLmRvZXNDb250YWluc1N1YlBhY2thZ2VKc29ucyA/IHVuZGVmaW5lZCA6IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3NyYycsICd0eXBlcycpO1xuXG4gICAgY29uc3QgZGlyZW50cyA9IGF3YWl0IGlnbm9yZUVub2VudEFzeW5jKCgpID0+IGZzLnJlYWRkaXIobGliVHlwZURpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KSk7XG4gICAgaWYgKCFkaXJlbnRzKSByZXR1cm47XG5cbiAgICBmb3IgKGNvbnN0IGRpcmVudCBvZiBkaXJlbnRzKSB7XG4gICAgICBjb25zdCBkaXJOYW1lID0gZGlyZW50Lm5hbWUuc2xpY2UoMCwgLTUpO1xuICAgICAgY29uc3QgaGFzVHlwZURlY2xhcmF0aW9uRXh0ZW5zaW9uID0gZGlyZW50Lm5hbWUuZW5kc1dpdGgoJy5kLnRzJyk7XG4gICAgICBsZXQgcGFja2FnZU5hbWUgPSBoYXNUeXBlRGVjbGFyYXRpb25FeHRlbnNpb24gPyBkaXJOYW1lIDogZGlyZW50Lm5hbWU7XG4gICAgICBpZiAocGFja2FnZU5hbWUuaW5jbHVkZXMoJ19fJykpIHtcbiAgICAgICAgcGFja2FnZU5hbWUgPSBgQCR7cGFja2FnZU5hbWUucmVwbGFjZSgnX18nLCAnLycpfWA7XG4gICAgICB9XG4gICAgICBjb25zdCBoYXNMaWJyYXJ5ID0gY29uZmlnc0luY2x1ZGluZ0NoaWxkcmVuLnNvbWUoXG4gICAgICAgIChjb25maWcpID0+XG4gICAgICAgICAgY29uZmlnLnBhY2thZ2VKc29uPy5kZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV0gfHwgY29uZmlnLnBhY2thZ2VKc29uPy5kZXZEZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV1cbiAgICAgICk7XG5cbiAgICAgIGlmIChkaXJlbnQuaXNGaWxlKCkgJiYgaGFzVHlwZURlY2xhcmF0aW9uRXh0ZW5zaW9uKSB7XG4gICAgICAgIGlmIChoYXNMaWJyYXJ5KSB7XG4gICAgICAgICAgLy8gTW92ZSBAdHlwZXMvPG5hbWU+L2luZGV4LmQudHMgaWYgaW5zdGFsbGVkXG4gICAgICAgICAgYXdhaXQgZnMubWtkaXIocGF0aC5qb2luKGxpYlR5cGVEaXJQYXRoLCBkaXJOYW1lKSk7XG4gICAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICAgICAgICBmcy5yZW5hbWUocGF0aC5qb2luKGxpYlR5cGVEaXJQYXRoLCBkaXJlbnQubmFtZSksIHBhdGguam9pbihsaWJUeXBlRGlyUGF0aCwgZGlyTmFtZSwgJ2luZGV4LmQudHMnKSlcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKHNyY1R5cGVEaXJQYXRoKSB7XG4gICAgICAgICAgLy8gTW92ZSBzcmMvdHlwZXMvPG5hbWU+IGlmIG5vdCBpbnN0YWxsZWRcbiAgICAgICAgICBhd2FpdCBmcy5ta2RpcihzcmNUeXBlRGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICAgICAgICBmcy5yZW5hbWUocGF0aC5qb2luKGxpYlR5cGVEaXJQYXRoLCBkaXJlbnQubmFtZSksIHBhdGguam9pbihzcmNUeXBlRGlyUGF0aCwgZGlyZW50Lm5hbWUpKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZGlyZW50LmlzRGlyZWN0b3J5KCkgJiYgc3JjVHlwZURpclBhdGggJiYgIWhhc0xpYnJhcnkpIHtcbiAgICAgICAgLy8gTW92ZSBzcmMvdHlwZXMvPG5hbWU+LmQudHMgaWYgbm90IGluc3RhbGxlZFxuICAgICAgICBhd2FpdCBmcy5ta2RpcihzcmNUeXBlRGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgICAgIGlnbm9yZUVub2VudEFzeW5jKCgpID0+XG4gICAgICAgICAgICBmcy5yZW5hbWUoXG4gICAgICAgICAgICAgIHBhdGguam9pbihsaWJUeXBlRGlyUGF0aCwgZGlyZW50Lm5hbWUsICdpbmRleC5kLnRzJyksXG4gICAgICAgICAgICAgIHBhdGguam9pbihzcmNUeXBlRGlyUGF0aCwgYCR7ZGlyZW50Lm5hbWV9LmQudHNgKVxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzcCBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcblxuZXhwb3J0IGNvbnN0IGZzVXRpbCA9IHtcbiAgYXN5bmMgcmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZnNwLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgfSxcbiAgYXN5bmMgZ2VuZXJhdGVGaWxlKGZpbGVQYXRoOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IGZzcC53cml0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQpO1xuICAgIGNvbnNvbGUubG9nKGBHZW5lcmF0ZWQvVXBkYXRlZCAke2ZpbGVQYXRofWApO1xuICB9LFxufTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGdsb2JieSB9IGZyb20gJ2dsb2JieSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFR5cG9zKHBhY2thZ2VDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhBYmJyZXZpYXRpb25zJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGRpclBhdGggPSBwYWNrYWdlQ29uZmlnLmRpclBhdGg7XG4gICAgY29uc3QgZG9jRmlsZXMgPSBhd2FpdCBnbG9iYnkoJyoqLyoubWQnLCB7IGRvdDogdHJ1ZSwgY3dkOiBkaXJQYXRoLCBnaXRpZ25vcmU6IHRydWUgfSk7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYEZvdW5kICR7ZG9jRmlsZXMubGVuZ3RofSBtYXJrZG93biBmaWxlcyBpbiAke2RpclBhdGh9YCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgbWRGaWxlIG9mIGRvY0ZpbGVzKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBtZEZpbGUpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgICBsZXQgbmV3Q29udGVudCA9IGZpeEFiYnJldmlhdGlvbnNJblRleHQoY29udGVudCk7XG4gICAgICAgIG5ld0NvbnRlbnQgPSByZXBsYWNlV2l0aENvbmZpZyhuZXdDb250ZW50LCBwYWNrYWdlQ29uZmlnLCAnZG9jJyk7XG4gICAgICAgIGlmIChjb250ZW50ICE9PSBuZXdDb250ZW50KSB7XG4gICAgICAgICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHRzRmlsZXMgPSBhd2FpdCBnbG9iYnkoXG4gICAgICBbXG4gICAgICAgICd7YXBwLHNyYyx0ZXN0cyxzY3JpcHRzfS8qKi8qLntjanMsbWpzLGpzLGpzeCxjdHMsbXRzLHRzLHRzeH0nLFxuICAgICAgICAncGFja2FnZXMvKiove2FwcCxzcmMsdGVzdHMsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3gsY3RzLG10cyx0cyx0c3h9JyxcbiAgICAgIF0sXG4gICAgICB7IGRvdDogdHJ1ZSwgY3dkOiBkaXJQYXRoLCBnaXRpZ25vcmU6IHRydWUgfVxuICAgICk7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYEZvdW5kICR7dHNGaWxlcy5sZW5ndGh9IFR5cGVTY3JpcHQgZmlsZXMgaW4gJHtkaXJQYXRofWApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHRzRmlsZSBvZiB0c0ZpbGVzKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCB0c0ZpbGUpO1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgbGV0IG5ld0NvbnRlbnQgPSBvbGRDb250ZW50XG4gICAgICAgIC5yZXBsYWNlQWxsKC9cXC9cXC8oLiopY1xcLmZcXC4vZywgJy8vJDFjZi4nKVxuICAgICAgICAucmVwbGFjZUFsbCgvXFwvXFwvKC4qKWVnXFwuL2csICcvLyQxZS5nLicpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9cXC9cXC8oLiopaWVcXC4vZywgJy8vJDFpLmUuJyk7XG4gICAgICBuZXdDb250ZW50ID0gcmVwbGFjZVdpdGhDb25maWcobmV3Q29udGVudCwgcGFja2FnZUNvbmZpZywgJ3RzJyk7XG5cbiAgICAgIGlmIChvbGRDb250ZW50ID09PSBuZXdDb250ZW50KSBjb250aW51ZTtcbiAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgIH1cblxuICAgIGNvbnN0IHRleHRCYXNlZEZpbGVzID0gYXdhaXQgZ2xvYmJ5KCcqKi8qLntjc3YsaHRtLGh0bWwsdHN2LHhtbCx5YW1sLHltbH0nLCB7XG4gICAgICBkb3Q6IHRydWUsXG4gICAgICBjd2Q6IGRpclBhdGgsXG4gICAgICBnaXRpZ25vcmU6IHRydWUsXG4gICAgfSk7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYEZvdW5kICR7dGV4dEJhc2VkRmlsZXMubGVuZ3RofSB0ZXh0LWJhc2VkIGZpbGVzIGluICR7ZGlyUGF0aH1gKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBmaWxlIG9mIHRleHRCYXNlZEZpbGVzKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBmaWxlKTtcbiAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGxldCBuZXdDb250ZW50ID0gb2xkQ29udGVudFxuICAgICAgICAucmVwbGFjZUFsbCgvXFwvXFwvKC4qKWNcXC5mXFwuL2csICcvLyQxY2YuJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL1xcL1xcLyguKillZ1xcLi9nLCAnLy8kMWUuZy4nKVxuICAgICAgICAucmVwbGFjZUFsbCgvXFwvXFwvKC4qKWllXFwuL2csICcvLyQxaS5lLicpO1xuICAgICAgbmV3Q29udGVudCA9IHJlcGxhY2VXaXRoQ29uZmlnKG5ld0NvbnRlbnQsIHBhY2thZ2VDb25maWcsICd0ZXh0Jyk7XG5cbiAgICAgIGlmIChvbGRDb250ZW50ID09PSBuZXdDb250ZW50KSBjb250aW51ZTtcbiAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgIH1cblxuICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaXhBYmJyZXZpYXRpb25zSW5UZXh0KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBjb250ZW50XG4gICAgLnJlcGxhY2VBbGwoL1xcYmNcXC5mXFwuKFteJF0pL2csICdjZi4kMScpXG4gICAgLnJlcGxhY2VBbGwoL1xcYmVnXFwuKFteJF0pL2csICdlLmcuJDEnKVxuICAgIC5yZXBsYWNlQWxsKC9cXGJpZVxcLihbXiRdKS9nLCAnaS5lLiQxJyk7XG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VXaXRoQ29uZmlnKG5ld0NvbnRlbnQ6IHN0cmluZywgcGFja2FnZUNvbmZpZzogUGFja2FnZUNvbmZpZywgcHJvcE5hbWU6ICdkb2MnIHwgJ3RzJyB8ICd0ZXh0Jyk6IHN0cmluZyB7XG4gIGZvciAoY29uc3QgW2JlZm9yZSwgYWZ0ZXJdIG9mIE9iamVjdC5lbnRyaWVzKHBhY2thZ2VDb25maWcud2JmeUpzb24/LnR5cG9zPy5hbGwgPz8ge30pKSB7XG4gICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZUFsbChiZWZvcmUsIGFmdGVyKTtcbiAgfVxuICBmb3IgKGNvbnN0IFtiZWZvcmUsIGFmdGVyXSBvZiBPYmplY3QuZW50cmllcyhwYWNrYWdlQ29uZmlnLndiZnlKc29uPy50eXBvcz8uW3Byb3BOYW1lXSA/PyB7fSkpIHtcbiAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlQWxsKGJlZm9yZSwgYWZ0ZXIpO1xuICB9XG4gIHJldHVybiBuZXdDb250ZW50O1xufVxuIiwiaW1wb3J0IHsgT2N0b2tpdCB9IGZyb20gJ0BvY3Rva2l0L2NvcmUnO1xuXG5jb25zdCB0b2tlbiA9XG4gIHByb2Nlc3MuZW52LkdIX0JPVF9QQVQgfHwgcHJvY2Vzcy5lbnYuUFVCTElDX0dIX0JPVF9QQVQgfHwgcHJvY2Vzcy5lbnYuR0hfVE9LRU4gfHwgcHJvY2Vzcy5lbnYuR0lUSFVCX1RPS0VOO1xuZXhwb3J0IGNvbnN0IGhhc0dpdEh1YlRva2VuID0gISF0b2tlbjtcbmV4cG9ydCBjb25zdCBvY3Rva2l0ID0gbmV3IE9jdG9raXQoe1xuICBhdXRoOiB0b2tlbixcbn0pO1xuXG5jbGFzcyBHaXRIdWJVdGlsIHtcbiAgZ2V0T3JnQW5kTmFtZSh1cmxPckZ1bGxOYW1lOiBzdHJpbmcpOiBbc3RyaW5nLCBzdHJpbmddIHtcbiAgICBjb25zdCB1cmxXaXRob3V0UHJvdG9jb2wgPSB1cmxPckZ1bGxOYW1lLnNwbGl0KCc6JykuYXQoLTEpO1xuICAgIGNvbnN0IG5hbWVzID0gdXJsV2l0aG91dFByb3RvY29sPy5zcGxpdCgnLycpO1xuICAgIGNvbnN0IG9yZyA9IG5hbWVzPy5hdCgtMikgPz8gJyc7XG4gICAgY29uc3QgbmFtZSA9IG5hbWVzPy5hdCgtMSk/LnJlcGxhY2UoLy5naXQkLywgJycpID8/ICcnO1xuICAgIHJldHVybiBbb3JnLCBuYW1lXTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZ2l0SHViVXRpbCA9IG5ldyBHaXRIdWJVdGlsKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFNwYXduU3luY09wdGlvbnMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXduU3luYyhjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZywgcmV0cnkgPSAwKTogdm9pZCB7XG4gIGRvIHtcbiAgICBjb25zdCBbbmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zXSA9IGdldFNwYXduU3luY0FyZ3MoY29tbWFuZCwgYXJncywgY3dkKTtcbiAgICBjb25zb2xlLmxvZyhgJCAke25ld0NtZH0gJHtuZXdBcmdzLmpvaW4oJyAnKX0gYXQgJHtvcHRpb25zLmN3ZH1gKTtcbiAgICBjb25zdCByZXQgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnMpO1xuICAgIGlmIChyZXQuc3RhdHVzID09PSAwKSBicmVhaztcbiAgfSB3aGlsZSAoLS1yZXRyeSA+PSAwKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXduU3luY1dpdGhTdHJpbmdSZXN1bHQoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBbbmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zXSA9IGdldFNwYXduU3luY0FyZ3MoY29tbWFuZCwgYXJncywgY3dkKTtcbiAgb3B0aW9ucy5zdGRpbyA9ICdwaXBlJztcbiAgY29uc3QgcHJvYyA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKG5ld0NtZCwgbmV3QXJncywgb3B0aW9ucyk7XG4gIGNvbnN0IGVycm9yID0gcHJvYy5zdGRlcnIudG9TdHJpbmcoKS50cmltKCk7XG4gIGlmIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoYCR7bmV3Q21kfSBbJHtuZXdBcmdzLm1hcCgocykgPT4gYFwiJHtzfVwiYCl9XSBjYXVzZWQgdGhlIGZvbGxvd2luZyBlcnJvcjpcXG4gJHtlcnJvcn1gKTtcbiAgfVxuICByZXR1cm4gcHJvYy5zdGRvdXQudG9TdHJpbmcoKS50cmltKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTcGF3blN5bmNBcmdzKGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nKTogW3N0cmluZywgc3RyaW5nW10sIFNwYXduU3luY09wdGlvbnNdIHtcbiAgY29uc3QgZW52ID0geyAuLi5wcm9jZXNzLmVudiB9O1xuICAvLyBSZW1vdmUgYmVycnkgZnJvbSBQQVRIXG4gIGlmIChlbnYuUEFUSCAmJiBlbnYuQkVSUllfQklOX0ZPTERFUikge1xuICAgIGVudi5QQVRIID0gZW52LlBBVEgucmVwbGFjZShgJHtlbnYuQkVSUllfQklOX0ZPTERFUn06YCwgJycpO1xuICB9XG5cbiAgaWYgKGVudi5BU0RGX0RJUikge1xuICAgIGFyZ3MgPSBbJy1sJywgJy1jJywgYC4gJHtlbnYuQVNERl9ESVJ9L2FzZGYuc2ggJiYgJHtjb21tYW5kfSAke2FyZ3Muam9pbignICcpfWBdO1xuICAgIGNvbW1hbmQgPSAnYmFzaCc7XG4gIH1cbiAgcmV0dXJuIFtcbiAgICBjb21tYW5kLFxuICAgIGFyZ3MsXG4gICAge1xuICAgICAgY3dkLFxuICAgICAgZW52LFxuICAgICAgc2hlbGw6IGZhbHNlLFxuICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICB9LFxuICBdO1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRWZXJzaW9uSW50b051bWJlcih2ZXJzaW9uOiBzdHJpbmcpOiBudW1iZXIge1xuICAvLyBlLmcuIGphdmEgYWRvcHRvcGVuamRrLTExLjAuMTcrOFxuICBjb25zdCBudW1iZXJzID0gdmVyc2lvblxuICAgIC5zcGxpdCgvWysuLV0vKVxuICAgIC5tYXAoTnVtYmVyKVxuICAgIC5maWx0ZXIoKG51bSkgPT4gIU51bWJlci5pc05hTihudW0pKTtcbiAgbGV0IHZlcnNpb25OdW1iZXIgPSAwO1xuICBsZXQgZGl2aXNvciA9IDE7XG4gIGZvciAoY29uc3QgbnVtIG9mIG51bWJlcnMpIHtcbiAgICB2ZXJzaW9uTnVtYmVyICs9IG51bSAqIGRpdmlzb3I7XG4gICAgZGl2aXNvciAvPSAxMDAwO1xuICB9XG4gIHJldHVybiB2ZXJzaW9uTnVtYmVyO1xufVxuIiwiZXhwb3J0IGNvbnN0IFBZVEhPTl9WRVJTSU9OID0gJzMuOS4xOSc7XG5leHBvcnQgY29uc3QgSkFWQV9WRVJTSU9OID0gJ3p1bHUtMTEuNzQuMTUnO1xuLy8gQmVjYXVzZSBXZWJLaXQgY2Fubm90IGxvZy1pbiBvbiBCbGl0eiB2Mi4wLjUrXG5leHBvcnQgY29uc3QgQkxJVFpfVkVSU0lPTiA9ICcyLjAuNCc7XG5leHBvcnQgY29uc3QgTkVYVF9WRVJTSU9OID0gJzE0LjIuNSc7XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBvY3Rva2l0IH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHNwYXduU3luYywgc3Bhd25TeW5jV2l0aFN0cmluZ1Jlc3VsdCB9IGZyb20gJy4uL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5pbXBvcnQgeyBjb252ZXJ0VmVyc2lvbkludG9OdW1iZXIgfSBmcm9tICcuLi91dGlscy92ZXJzaW9uLmpzJztcbmltcG9ydCB7IEpBVkFfVkVSU0lPTiwgUFlUSE9OX1ZFUlNJT04gfSBmcm9tICcuLi91dGlscy92ZXJzaW9uQ29uc3RhbnRzLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlVG9vbFZlcnNpb25zKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlVG9vbFZlcnNpb25zJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IGNvcmUoY29uZmlnKTtcbiAgfSk7XG59XG5cbmNvbnN0IENPUkVfVE9PTFMgPSBuZXcgU2V0KFsnamF2YScsICdub2RlanMnLCAnYnVuJywgJ3B5dGhvbiddKTtcbmNvbnN0IERFUFJFQ0FURURfVkVSU0lPTl9QUkVGSVhFUyA9IFsnamF2YScsICdub2RlJywgJ3B5dGhvbiddO1xuXG5hc3luYyBmdW5jdGlvbiBjb3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIWNvbmZpZy52ZXJzaW9uc1RleHQpIHJldHVybjtcblxuICBjb25zdCBkdXBsaWNhdGFibGVMaW5lcyA9IGNvbmZpZy52ZXJzaW9uc1RleHRcbiAgICAudHJpbSgpXG4gICAgLnNwbGl0KCdcXG4nKVxuICAgIC5tYXAoKGxpbmUpID0+IHtcbiAgICAgIGNvbnN0IFtuYW1lLCB2ZXJzaW9uXSA9IGxpbmUudHJpbSgpLnNwbGl0KC9cXHMrLyk7XG4gICAgICAvLyBUbyBtb3ZlIHRoZSB0b3Agb2YgdGhlIGxpc3QsIHdlIG5lZWQgdG8gYWRkIGEgc3BhY2UuXG4gICAgICByZXR1cm4gYCR7Q09SRV9UT09MUy5oYXMobmFtZSkgPyAnICcgOiAnJ30ke25hbWV9ICR7dmVyc2lvbn1gO1xuICAgIH0pXG4gICAgLnNvcnQoKVxuICAgIC8vIFJlbW92ZSBhZGRlZCBzcGFjZXMuXG4gICAgLm1hcCgobGluZSkgPT4gbGluZS50cmltKCkpO1xuICBjb25zdCBsaW5lcyA9IFsuLi5uZXcgU2V0KGR1cGxpY2F0YWJsZUxpbmVzKV07XG5cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNQb2V0cnlMb2NrKSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnaHR0cHM6Ly9weXBpLm9yZy9weXBpL3BvZXRyeS9qc29uJyk7XG4gICAgY29uc3QganNvbiA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICBjb25zdCBwb2V0cnlWZXJzaW9uID0ganNvbj8uaW5mbz8udmVyc2lvbjtcbiAgICBpZiAocG9ldHJ5VmVyc2lvbikge1xuICAgICAgdXBkYXRlVmVyc2lvbihsaW5lcywgJ3BvZXRyeScsIGpzb24/LmluZm8/LnZlcnNpb24pO1xuICAgIH1cbiAgICB1cGRhdGVWZXJzaW9uKGxpbmVzLCAncHl0aG9uJywgUFlUSE9OX1ZFUlNJT04sIHRydWUpO1xuICB9XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLmZpcmViYXNlKSB7XG4gICAgdXBkYXRlVmVyc2lvbihsaW5lcywgJ2phdmEnLCBKQVZBX1ZFUlNJT04sIHRydWUpO1xuICB9XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5zUGFja2FnZUpzb24pIHtcbiAgICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgICBjb25zdCBsZWZ0aG9va1ZlcnNpb24gPSBhd2FpdCBnZXRMYXRlc3RWZXJzaW9uRnJvbVRhZ09uR2l0SHViKCdldmlsbWFydGlhbnMnLCAnbGVmdGhvb2snKTtcbiAgICAgIGlmIChsZWZ0aG9va1ZlcnNpb24pIHVwZGF0ZVZlcnNpb24obGluZXMsICdsZWZ0aG9vaycsIGxlZnRob29rVmVyc2lvbik7XG5cbiAgICAgIGNvbnN0IGJ1blZlcnNpb24gPSBhd2FpdCBnZXRMYXRlc3RWZXJzaW9uRnJvbVRhZ09uR2l0SHViKCdvdmVuLXNoJywgJ2J1bicpO1xuICAgICAgaWYgKGJ1blZlcnNpb24pIHVwZGF0ZVZlcnNpb24obGluZXMsICdidW4nLCBidW5WZXJzaW9uKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdmVyc2lvbiA9IHNwYXduU3luY1dpdGhTdHJpbmdSZXN1bHQoJ25wbScsIFsnc2hvdycsICd5YXJuJywgJ3ZlcnNpb24nXSwgY29uZmlnLmRpclBhdGgpO1xuICAgICAgdXBkYXRlVmVyc2lvbihsaW5lcywgJ3lhcm4nLCB2ZXJzaW9uKTtcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IHByZWZpeCBvZiBERVBSRUNBVEVEX1ZFUlNJT05fUFJFRklYRVMpIHtcbiAgICBjb25zdCB2ZXJzaW9uUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgYC4ke3ByZWZpeH0tdmVyc2lvbmApO1xuICAgIHZvaWQgZnMucHJvbWlzZXMucm0odmVyc2lvblBhdGgsIHsgZm9yY2U6IHRydWUgfSk7XG4gIH1cblxuICBjb25zdCB0b29sVmVyc2lvbnNQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnRvb2wtdmVyc2lvbnMnKTtcbiAgYXdhaXQgKGxpbmVzLmxlbmd0aCA+IDBcbiAgICA/IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy53cml0ZUZpbGUodG9vbFZlcnNpb25zUGF0aCwgbGluZXMuam9pbignXFxuJykgKyAnXFxuJykpXG4gICAgOiBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0odG9vbFZlcnNpb25zUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSkpO1xuICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG4gIHNwYXduU3luYygnYXNkZicsIFsncGx1Z2luJywgJ3VwZGF0ZScsICctLWFsbCddLCBjb25maWcuZGlyUGF0aCk7XG4gIHNwYXduU3luYygnYXNkZicsIFsnaW5zdGFsbCddLCBjb25maWcuZGlyUGF0aCk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVZlcnNpb24obGluZXM6IHN0cmluZ1tdLCB0b29sTmFtZTogc3RyaW5nLCBuZXdWZXJzaW9uOiBzdHJpbmcsIGhlYWQgPSBmYWxzZSk6IHZvaWQge1xuICBjb25zdCBpbmRleCA9IGxpbmVzLmZpbmRJbmRleCgobCkgPT4gbC5zcGxpdCgvXFxzKy8pWzBdID09PSB0b29sTmFtZSk7XG4gIGNvbnN0IG5ld0xpbmUgPSBgJHt0b29sTmFtZX0gJHtuZXdWZXJzaW9ufWA7XG4gIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICBsaW5lcy5zcGxpY2UoaGVhZCA/IDAgOiBsaW5lcy5sZW5ndGgsIDAsIG5ld0xpbmUpO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IFssIHZlcnNpb25dID0gbGluZXNbaW5kZXhdLnNwbGl0KC9cXHMrLyk7XG4gICAgaWYgKGNvbnZlcnRWZXJzaW9uSW50b051bWJlcihuZXdWZXJzaW9uKSA+IGNvbnZlcnRWZXJzaW9uSW50b051bWJlcih2ZXJzaW9uKSkge1xuICAgICAgbGluZXNbaW5kZXhdID0gbmV3TGluZTtcbiAgICB9XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0TGF0ZXN0VmVyc2lvbkZyb21UYWdPbkdpdEh1Yihvcmdhbml6YXRpb246IHN0cmluZywgcmVwb3NpdG9yeTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICAvLyBGZXRjaCB0aGUgbGF0ZXN0IHJlbGVhc2UgZnJvbSB0aGUgcmVwb3NpdG9yeVxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3JlbGVhc2VzL2xhdGVzdCcsIHtcbiAgICAgIG93bmVyOiBvcmdhbml6YXRpb24sXG4gICAgICByZXBvOiByZXBvc2l0b3J5LFxuICAgIH0pO1xuICAgIGNvbnN0IHZlcnNpb24gPSByZXNwb25zZS5kYXRhLnRhZ19uYW1lO1xuICAgIGNvbnN0IGluZGV4ID0gdmVyc2lvbi5sYXN0SW5kZXhPZigndicpO1xuICAgIGNvbnN0IHZlcnNpb25OdW1iZXJUZXh0ID0gaW5kZXggPT09IC0xID8gdmVyc2lvbiA6IHZlcnNpb24uc2xpY2UoaW5kZXggKyAxKTtcbiAgICAvLyBDaGVjayB0aGUgZmlyc3QgY2hhcmFjdGVyIGlzIGEgbnVtYmVyXG4gICAgcmV0dXJuIC9eXFxkLy50ZXN0KHZlcnNpb25OdW1iZXJUZXh0KSA/IHZlcnNpb25OdW1iZXJUZXh0IDogdW5kZWZpbmVkO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBmZXRjaCBCdW4gdGFncyBkdWUgdG86JywgZXJyb3IpO1xuICAgIHJldHVybjtcbiAgfVxufVxuIiwiaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBvdmVyd3JpdGVNZXJnZTxUPihkZXN0aW5hdGlvbkFycmF5OiBUW10sIHNvdXJjZUFycmF5OiBUW10pOiBUW10ge1xuICByZXR1cm4gc291cmNlQXJyYXk7XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgZnVuY3Rpb24gY29tYmluZU1lcmdlKHRhcmdldDogYW55W10sIHNvdXJjZTogYW55W10sIG9wdGlvbnM6IGFueSk6IGFueVtdIHtcbiAgY29uc3QgZGVzdGluYXRpb24gPSBbLi4udGFyZ2V0XTtcblxuICBmb3IgKGNvbnN0IFtpbmRleCwgaXRlbV0gb2Ygc291cmNlLmVudHJpZXMoKSkge1xuICAgIGlmIChkZXN0aW5hdGlvbltpbmRleF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgZGVzdGluYXRpb25baW5kZXhdID0gb3B0aW9ucy5jbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZChpdGVtLCBvcHRpb25zKTtcbiAgICB9IGVsc2UgaWYgKG9wdGlvbnMuaXNNZXJnZWFibGVPYmplY3QoaXRlbSkpIHtcbiAgICAgIGRlc3RpbmF0aW9uW2luZGV4XSA9IG1lcmdlKHRhcmdldFtpbmRleF0sIGl0ZW0sIG9wdGlvbnMpO1xuICAgIH0gZWxzZSBpZiAoIXRhcmdldC5pbmNsdWRlcyhpdGVtKSkge1xuICAgICAgZGVzdGluYXRpb24ucHVzaChpdGVtKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRlc3RpbmF0aW9uO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgY2xvbmVEZWVwIGZyb20gJ2xvZGFzaC5jbG9uZWRlZXAnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgb3ZlcndyaXRlTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGpzb25PYmogPSB7XG4gICRzY2hlbWE6ICcuL25vZGVfbW9kdWxlcy9AYmlvbWVqcy9iaW9tZS9jb25maWd1cmF0aW9uX3NjaGVtYS5qc29uJyxcbiAgZXh0ZW5kczogWydAd2lsbGJvb3N0ZXIvYmlvbWUtY29uZmlnJ10sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVCaW9tZUpzb25jKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlQmlvbWVKc29uYycsIGFzeW5jICgpID0+IHtcbiAgICBsZXQgbmV3U2V0dGluZ3M6IHVua25vd24gPSBjbG9uZURlZXAoanNvbk9iaik7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdiaW9tZS5qc29uYycpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBvbGRTZXR0aW5ncyA9IEpTT04ucGFyc2Uob2xkQ29udGVudCk7XG4gICAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShuZXdTZXR0aW5ncyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IG5ld0NvbnRlbnQgPSBgdGVsZW1ldHJ5ID0gZmFsc2VcblxuW2luc3RhbGxdXG5leGFjdCA9IHRydWVcblxuW3J1bl1cbmJ1biA9IHRydWVcblxuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQnVuZmlnVG9tbChjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUJ1bmZpZ1RvbWwnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdidW5maWcudG9tbCcpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuXG5jb25zdCB1c2VyQ29udGVudEhlYWRlciA9ICcjIFByb2plY3Qtc3BlY2lmaWMgc2V0dGluZ3MnO1xuY29uc3QgdXNlckNvbnRlbnRIZWFkZXJSZWdleCA9IC8jIFByb2plY3Qtc3BlY2lmaWMgc2V0dGluZ3NbXlxcbl0qXFxuL2dtO1xuY29uc3Qgc2VwYXJhdG9yID0gJyMgR2VuZXJhdGVkIGJ5IHdiZnknO1xuY29uc3Qgc2VwYXJhdG9yUHJlZml4ID0gJyMgR2VuZXJhdGVkIGJ5ICc7XG5jb25zdCBkZWZhdWx0SGVhZFVzZXJDb250ZW50ID0gYCR7dXNlckNvbnRlbnRIZWFkZXJ9IChoZWFkKVxuXG5cbiR7c2VwYXJhdG9yfVxuYDtcbmNvbnN0IGRlZmF1bHRUYWlsVXNlckNvbnRlbnQgPSBgXG4ke3VzZXJDb250ZW50SGVhZGVyfSAodGFpbClcbmA7XG5cbmV4cG9ydCBjb25zdCBpZ25vcmVGaWxlVXRpbCA9IHtcbiAgc2VwYXJhdG9yLFxuICBzZXBhcmF0b3JQcmVmaXgsXG4gIGRlZmF1bHRIZWFkVXNlckNvbnRlbnQsXG4gIGRlZmF1bHRUYWlsVXNlckNvbnRlbnQsXG4gIGFzeW5jIHJlYWRHaXRpZ25vcmVXaXRob3V0U2VwYXJhdG9ycyhmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICB0cnkge1xuICAgICAgbGV0IGNvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IGxhc3RIZWFkZXJJbmRleCA9IGdldEluZGV4T2ZUYWlsVXNlckNvbnRlbnRIZWFkZXIoY29udGVudCk7XG4gICAgICBpZiAobGFzdEhlYWRlckluZGV4ID4gMCkge1xuICAgICAgICBjb250ZW50ID0gY29udGVudC5zbGljZSgwLCBsYXN0SGVhZGVySW5kZXggLSAxKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNvbnRlbnRcbiAgICAgICAgICAucmVwbGFjZUFsbCh1c2VyQ29udGVudEhlYWRlclJlZ2V4LCAnJylcbiAgICAgICAgICAucmVwbGFjZUFsbCgvIyBHZW5lcmF0ZWQgYnkgW15cXG5dKlxcbi9nbSwgJycpXG4gICAgICAgICAgLnJlcGxhY2VBbGwoL1xccj9cXG5cXHI/XFxuKFxccj9cXG4pKy9nbSwgJ1xcblxcbicpXG4gICAgICAgICAgLnRyaW0oKSArICdcXG4nXG4gICAgICApO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgfSxcbiAgZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgaW5kZXggPSBjb250ZW50LmluZGV4T2YodGhpcy5zZXBhcmF0b3JQcmVmaXgpO1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgIHJldHVybiBjb250ZW50XG4gICAgICAgIC5zbGljZSgwLCBjb250ZW50LmluZGV4T2YoJ1xcbicsIGluZGV4KSArIDEpXG4gICAgICAgIC5yZXBsYWNlQWxsKHVzZXJDb250ZW50SGVhZGVyUmVnZXgsIGAke3VzZXJDb250ZW50SGVhZGVyfSAoaGVhZClcXG5gKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlZmF1bHRIZWFkVXNlckNvbnRlbnQ7XG4gIH0sXG4gIGdldFRhaWxVc2VyQ29udGVudChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGxhc3RIZWFkZXJJbmRleCA9IGdldEluZGV4T2ZUYWlsVXNlckNvbnRlbnRIZWFkZXIoY29udGVudCk7XG4gICAgaWYgKGxhc3RIZWFkZXJJbmRleCA+IDApIHtcbiAgICAgIHJldHVybiBjb250ZW50LnNsaWNlKGxhc3RIZWFkZXJJbmRleCAtIDEpO1xuICAgIH1cbiAgICByZXR1cm4gZGVmYXVsdFRhaWxVc2VyQ29udGVudDtcbiAgfSxcbiAgYXN5bmMgaXNCZXJyeVplcm9JbnN0YWxsRW5hYmxlZChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIHJldHVybiBjb250ZW50LmluY2x1ZGVzKCdcXG4hLnlhcm4vY2FjaGUnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0sXG59O1xuXG5mdW5jdGlvbiBnZXRJbmRleE9mVGFpbFVzZXJDb250ZW50SGVhZGVyKGNvbnRlbnQ6IHN0cmluZyk6IG51bWJlciB7XG4gIGNvbnN0IGluZGV4ID0gY29udGVudC5pbmRleE9mKHVzZXJDb250ZW50SGVhZGVyKTtcbiAgY29uc3QgbGFzdEluZGV4ID0gY29udGVudC5sYXN0SW5kZXhPZih1c2VyQ29udGVudEhlYWRlcik7XG4gIHJldHVybiBsYXN0SW5kZXggPiBpbmRleCA/IGxhc3RJbmRleCA6IC0xO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbi8vIEV4ZXJjb2Rl44Gn44Gvbm9kZV9tb2R1bGVz44KSQ09QWeOBmeOCi+W/heimgeOBjOOBguOCi+OBn+OCgeOAgW5vZGVfbW9kdWxlc+OCkumZpOWkluOBl+OBpuOBr+OBhOOBkeOBquOBhOOAglxuY29uc3QgY29tbW9uQ29udGVudCA9IGBcbioqLy5pZGVhXG4qKi8qLnNxbGl0ZTMqXG4qKi8ueWFybi9pbnN0YWxsLXN0YXRlLmd6XG4qKi8udmVudlxuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRG9ja2VyaWdub3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlRG9ja2VyaWdub3JlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmRvY2tlcmlnbm9yZScpO1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zRG9ja2VyZmlsZSkge1xuICAgICAgY29uc3QgY29udGVudCA9IChhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoKSkgPz8gJyc7XG4gICAgICBjb25zdCBoZWFkVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRIZWFkVXNlckNvbnRlbnQoY29udGVudCk7XG4gICAgICBjb25zdCB0YWlsVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRUYWlsVXNlckNvbnRlbnQoY29udGVudCk7XG5cbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBoZWFkVXNlckNvbnRlbnQgKyBjb21tb25Db250ZW50ICsgdGFpbFVzZXJDb250ZW50O1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgfVxuICB9KTtcbn1cbiIsImV4cG9ydCBjb25zdCBleHRlbnNpb25zID0ge1xuICBjb2RlV2l0aDJJbmRlbnRTaXplOiBbXG4gICAgJ2NqcycsXG4gICAgJ21qcycsXG4gICAgJ2pzJyxcbiAgICAnanN4JyxcbiAgICAnY3RzJyxcbiAgICAnbXRzJyxcbiAgICAndHMnLFxuICAgICd0c3gnLFxuICAgICdqc29uJyxcbiAgICAnanNvbjUnLFxuICAgICdqc29uYycsXG4gICAgJ2NwcCcsXG4gICAgJ2RhcnQnLFxuICAgICdodG0nLFxuICAgICdodG1sJyxcbiAgICAncHUnLFxuICAgICdwdW1sJyxcbiAgICAncmInLFxuICAgICd2dWUnLFxuICAgICd4bWwnLFxuICAgICd5YW1sJyxcbiAgICAneW1sJyxcbiAgXS5zb3J0KCksXG4gIGNvZGVXaXRoNEluZGVudFNpemU6IFsnZ28nLCAnZ3JhZGxlJywgJ3B5J10uc29ydCgpLFxuICBjb2RlV2l0aDhJbmRlbnRTaXplOiBbJ3NoJ10uc29ydCgpLFxuICBtYXJrZG93bkxpa2U6IFsnbWQnXS5zb3J0KCksXG4gIGVzbGludDogWydjanMnLCAnbWpzJywgJ2pzJywgJ2N0cycsICdtdHMnLCAndHMnLCAndHN4JywgJ2pzeCddLnNvcnQoKSxcbiAgcHJldHRpZXI6IFtcbiAgICAnY2pzJyxcbiAgICAnbWpzJyxcbiAgICAnanMnLFxuICAgICdqc3gnLFxuICAgICdjdHMnLFxuICAgICdtdHMnLFxuICAgICd0cycsXG4gICAgJ3RzeCcsXG4gICAgJ2pzb24nLFxuICAgICdqc29uNScsXG4gICAgJ2pzb25jJyxcbiAgICAnY3NzJyxcbiAgICAnaHRtJyxcbiAgICAnaHRtbCcsXG4gICAgJ21kJyxcbiAgICAnc2NzcycsXG4gICAgJ3Z1ZScsXG4gICAgJ3lhbWwnLFxuICAgICd5bWwnLFxuICBdLnNvcnQoKSxcbiAgLy8gY2YuIGh0dHBzOi8vYmlvbWVqcy5kZXYvaW50ZXJuYWxzL2xhbmd1YWdlLXN1cHBvcnQvXG4gIGJpb21lOiBbXG4gICAgJ2NqcycsXG4gICAgJ21qcycsXG4gICAgJ2pzJyxcbiAgICAnanN4JyxcbiAgICAnY3RzJyxcbiAgICAnbXRzJyxcbiAgICAndHMnLFxuICAgICd0c3gnLFxuICAgICdqc29uJyxcbiAgICAnanNvbjUnLFxuICAgICdqc29uYycsXG4gICAgJ2h0bScsXG4gICAgJ2h0bWwnLFxuICAgICd2dWUnLFxuICAgICdzdmVsdGUnLFxuICAgICdhc3RybycsXG4gICAgJ2NzcycsXG4gICAgJ3lhbWwnLFxuICAgICd5bWwnLFxuICAgICdncWwnLFxuICBdLnNvcnQoKSxcbn07XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IG5ld0NvbnRlbnQgPSBgcm9vdCA9IHRydWVcblxuWypdXG5jaGFyc2V0ID0gdXRmLThcbmVuZF9vZl9saW5lID0gbGZcbmluc2VydF9maW5hbF9uZXdsaW5lID0gdHJ1ZVxudHJpbV90cmFpbGluZ193aGl0ZXNwYWNlID0gdHJ1ZVxuXG4ke2dlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zLmNvZGVXaXRoMkluZGVudFNpemUpfVxuaW5kZW50X3NpemUgPSAyXG5pbmRlbnRfc3R5bGUgPSBzcGFjZVxuXG4ke2dlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zLmNvZGVXaXRoNEluZGVudFNpemUpfVxuaW5kZW50X3NpemUgPSA0XG5pbmRlbnRfc3R5bGUgPSBzcGFjZVxuXG4ke2dlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zLmNvZGVXaXRoOEluZGVudFNpemUpfVxuaW5kZW50X3NpemUgPSA4XG5pbmRlbnRfc3R5bGUgPSBzcGFjZVxuXG4ke2dlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zLm1hcmtkb3duTGlrZSl9XG5tYXhfbGluZV9sZW5ndGggPSBvZmZcbnRyaW1fdHJhaWxpbmdfd2hpdGVzcGFjZSA9IGZhbHNlXG5cblt7TWFrZWZpbGUsKi5ta31dXG5pbmRlbnRfc3R5bGUgPSB0YWJcbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUVkaXRvcmNvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUVkaXRvcmNvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lZGl0b3Jjb25maWcnKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGV4dGVuc2lvbnMubGVuZ3RoID4gMSA/IGBbKi57JHtleHRlbnNpb25zLmpvaW4oJywnKX19XWAgOiBgWyouJHtleHRlbnNpb25zWzBdfV1gO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGNvbW1vbkNvbnRlbnQgPSBgXG4zcmQtcGFydHkvXG5AdHlwZXMvXG5fX2dlbmVyYXRlZF9fL1xuYW5kcm9pZC9cbmlvcy9cbm5vLWZvcm1hdC9cbnRlc3QtZml4dHVyZXMvXG4qLmNvbmZpZy4qanNcbiouZC50c1xuKi5taW4uKmpzXG4ueWFybi9cbi5wbnAuanNcbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUVzbGludGlnbm9yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUVzbGludGlnbm9yZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lc2xpbnRpZ25vcmUnKTtcbiAgICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbnRlbnQgPSAoYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihmaWxlUGF0aCkpID8/ICcnO1xuICAgIGNvbnN0IGhlYWRVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldEhlYWRVc2VyQ29udGVudChjb250ZW50KTtcbiAgICBjb25zdCB0YWlsVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRUYWlsVXNlckNvbnRlbnQoY29udGVudCk7XG5cbiAgICBjb25zdCBnaXRpZ25vcmVGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRpZ25vcmUnKTtcbiAgICBjb25zdCBnaXRpZ25vcmVDb250ZW50ID0gKGF3YWl0IGlnbm9yZUZpbGVVdGlsLnJlYWRHaXRpZ25vcmVXaXRob3V0U2VwYXJhdG9ycyhnaXRpZ25vcmVGaWxlUGF0aCkpIHx8ICcnO1xuXG4gICAgY29uc3QgbmV3Q29udGVudCA9IGhlYWRVc2VyQ29udGVudCArIGNvbW1vbkNvbnRlbnQgKyBnaXRpZ25vcmVDb250ZW50ICsgdGFpbFVzZXJDb250ZW50O1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBjb21iaW5lTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUVzbGludHJjKGNvbmZpZzogUGFja2FnZUNvbmZpZywgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlRXNsaW50cmMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZXNsaW50cmMuanNvbicpO1xuICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYmFzZXMgPSBbXTtcbiAgICBpZiAoY29uZmlnLmVzbGludEJhc2UpIHtcbiAgICAgIGJhc2VzLnB1c2goY29uZmlnLmVzbGludEJhc2UpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnICE9PSByb290Q29uZmlnKSB7XG4gICAgICBiYXNlcy5wdXNoKCcuLi8uLi8uZXNsaW50cmMuanNvbicpO1xuICAgIH1cbiAgICBsZXQgbmV3U2V0dGluZ3MgPSB7IHJvb3Q6IHRydWUsIGV4dGVuZHM6IGJhc2VzIH07XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3Qgb2xkU2V0dGluZ3MgPSBKU09OLnBhcnNlKG9sZENvbnRlbnQpO1xuICAgICAgaWYgKG9sZFNldHRpbmdzLmV4dGVuZHMpIHtcbiAgICAgICAgb2xkU2V0dGluZ3MuZXh0ZW5kcyA9IG9sZFNldHRpbmdzLmV4dGVuZHMuZmlsdGVyKFxuICAgICAgICAgIChleHQ6IHN0cmluZykgPT4gIWV4dC5zdGFydHNXaXRoKCdAd2lsbGJvb3N0ZXIvJykgJiYgZXh0ICE9PSAnLi4vLi4vLmVzbGludHJjLmpzb24nXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoYmFzZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIG9sZFNldHRpbmdzLmV4dGVuZHMgPSBbXTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG5ld0V4dGVuZHMgPSBuZXdTZXR0aW5ncy5leHRlbmRzO1xuICAgICAgbmV3U2V0dGluZ3MuZXh0ZW5kcyA9IG9sZFNldHRpbmdzLmV4dGVuZHM7XG4gICAgICBvbGRTZXR0aW5ncy5leHRlbmRzID0gbmV3RXh0ZW5kcztcbiAgICAgIG5ld1NldHRpbmdzID0gbWVyZ2UuYWxsKFtuZXdTZXR0aW5ncywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzXSwge1xuICAgICAgICBhcnJheU1lcmdlOiBjb21iaW5lTWVyZ2UsXG4gICAgICB9KSBhcyB0eXBlb2YgbmV3U2V0dGluZ3M7XG4gICAgICAvLyBUT0RPOiBSZW1vdmUgdGhlIGZvbGxvd2luZyBjb2RlIGFmdGVyIGFsbCBCbGl0ei5qcyBwcm9qZWN0cyBhcmUgdXBkYXRlZC5cbiAgICAgIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6KSB7XG4gICAgICAgIG5ld1NldHRpbmdzLmV4dGVuZHMgPSBuZXdTZXR0aW5ncy5leHRlbmRzLmZpbHRlcihcbiAgICAgICAgICAoZXh0OiBzdHJpbmcpID0+IGV4dCAhPT0gJy4vbm9kZV9tb2R1bGVzL0BibGl0empzL25leHQvZXNsaW50J1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG4vLyBjZi4gaHR0cHM6Ly9idW4uc2gvZ3VpZGVzL2luc3RhbGwvZ2l0LWRpZmYtYnVuLWxvY2tmaWxlXG5jb25zdCBuZXdDb250ZW50ID0gYCogdGV4dD1hdXRvXG5cbioubG9ja2IgYmluYXJ5IGRpZmY9bG9ja2JcbioudmNwcm9qIHRleHQgZW9sPWNybGZcblxuJHtbLi4uZXh0ZW5zaW9ucy5jb2RlV2l0aDJJbmRlbnRTaXplLCAuLi5leHRlbnNpb25zLmNvZGVXaXRoNEluZGVudFNpemUsIC4uLmV4dGVuc2lvbnMubWFya2Rvd25MaWtlXVxuICAubWFwKChleHQpID0+IGAqLiR7ZXh0fSB0ZXh0IGVvbD1sZmApXG4gIC5qb2luKCdcXG4nKX1cblxuZGlzdC8qKiBsaW5ndWlzdC1nZW5lcmF0ZWQ9dHJ1ZVxuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlR2l0YXR0cmlidXRlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0YXR0cmlidXRlcycpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IG9zIGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuLi9vcHRpb25zLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGRlZmF1bHROYW1lcyA9IFsnd2luZG93cycsICdtYWNvcycsICdsaW51eCcsICdqZXRicmFpbnMnLCAndmlzdWFsc3R1ZGlvY29kZScsICdlbWFjcycsICd2aW0nLCAneWFybiddO1xuXG5jb25zdCBjb21tb25Db250ZW50ID0gYFxuIS5rZWVwXG4uZW52LnByb2R1Y3Rpb25cbiovbW91bnQvKi5oYXNoXG4uaWRlYS9jb3BpbG90L2NoYXRTZXNzaW9ucy9cbi5kZXZjb250YWluZXIvXG5kaXN0L1xudGVtcC9cbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUdpdGlnbm9yZShjb25maWc6IFBhY2thZ2VDb25maWcsIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdpdGlnbm9yZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRpZ25vcmUnKTtcbiAgICBjb25zdCBjb250ZW50ID0gKGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGgpKSA/PyAnJztcbiAgICBsZXQgaGVhZFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQpICsgY29tbW9uQ29udGVudDtcbiAgICBjb25zdCB0YWlsVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRUYWlsVXNlckNvbnRlbnQoY29udGVudCk7XG5cbiAgICBjb25zdCBuYW1lcyA9IFsuLi5kZWZhdWx0TmFtZXNdO1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zR2VtZmlsZSkge1xuICAgICAgbmFtZXMucHVzaCgncnVieScpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc0dvTW9kKSB7XG4gICAgICBuYW1lcy5wdXNoKCdnbycpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAke3BhdGguYmFzZW5hbWUoY29uZmlnLmRpclBhdGgpfVxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNQYWNrYWdlSnNvbikge1xuICAgICAgbmFtZXMucHVzaCgnbm9kZScpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc1BvbVhtbCkge1xuICAgICAgbmFtZXMucHVzaCgnbWF2ZW4nKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLmlkZWEvZ29vZ2xlLWphdmEtZm9ybWF0LnhtbFxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNQdWJzcGVjWWFtbCkge1xuICAgICAgbmFtZXMucHVzaCgnZmx1dHRlcicsICdBbmRyb2lkU3R1ZGlvJywgJ3J1YnknKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLmZsdXR0ZXItcGx1Z2lucy1kZXBlbmRlbmNpZXNcbmFuZHJvaWQva2V5LnByb3BlcnRpZXNcbmlvcy8uYnVuZGxlXG4uaWRlYS9ydW5Db25maWd1cmF0aW9ucy54bWxcbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zVGVtcGxhdGVZYW1sKSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5hd3Mtc2FtL1xucGFja2FnZWQueWFtbFxuYDtcbiAgICB9XG4gICAgLy8gQmVjYXVzZSAudmVudiBzaG91bGQgYmUgaWdub3JlZCBvbiByb290IGRpcmVjdG9yeVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zUG9ldHJ5TG9jaykge1xuICAgICAgbmFtZXMucHVzaCgncHl0aG9uJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC52ZW52L1xuYDtcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eikge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuYmxpdHovXG4uYmxpdHoqKlxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgbmFtZXMucHVzaCgnbmV4dGpzJyk7XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5maXJlYmFzZSB8fCBjb25maWcuZGVwZW5kaW5nLmZpcmViYXNlKSB7XG4gICAgICBuYW1lcy5wdXNoKCdmaXJlYmFzZScpO1xuICAgIH1cbiAgICBpZiAocm9vdENvbmZpZy5kZXBlbmRpbmcucHJpc21hKSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYCouc3FsaXRlMypcbiouc3FsaXRlMy1qb3VybmFsXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0VGVzdCkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGB0ZXN0LXJlc3VsdHMvXG5gO1xuICAgIH1cbiAgICBpZiAocm9vdENvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUgfHwgY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgICAgbmFtZXMucHVzaCgncmVhY3RuYXRpdmUnKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgZ29vZ2xlLXNlcnZpY2VzLmpzb25cbmFuZHJvaWQvYXBwL3NyYy9tYWluL2Fzc2V0cy9cbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnN0b3J5Ym9vaykge1xuICAgICAgbmFtZXMucHVzaCgnc3Rvcnlib29ranMnKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubGl0ZXN0cmVhbSkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGBnY3Atc2Eta2V5Lmpzb25cbmA7XG4gICAgfVxuXG4gICAgbGV0IGdlbmVyYXRlZCA9ICcnO1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykge1xuICAgICAgbGV0IGNvbnRlbnQgPSAoYXdhaXQgcmVhZENhY2hlKG5hbWUpKSA/PyAnJztcbiAgICAgIGlmICghY29udGVudCkge1xuICAgICAgICBjb25zdCB1cmwgPSBgaHR0cHM6Ly93d3cudG9wdGFsLmNvbS9kZXZlbG9wZXJzL2dpdGlnbm9yZS9hcGkvJHtuYW1lfWA7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsKTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2VUZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgICBpZiAoIXJlc3BvbnNlLm9rIHx8IHJlc3BvbnNlVGV4dC5pbmNsdWRlcygnQXR0ZW50aW9uIFJlcXVpcmVkIScpIHx8IHJlc3BvbnNlVGV4dC5pbmNsdWRlcygnPHRpdGxlPicpKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGZldGNoICR7dXJsfWApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb250ZW50ID0gcmVzcG9uc2VUZXh0LnRyaW0oKTtcbiAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IHdyaXRlQ2FjaGUobmFtZSwgY29udGVudCkpO1xuICAgICAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oYEZldGNoZWQgJHt1cmx9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChnZW5lcmF0ZWQpIGdlbmVyYXRlZCArPSAnXFxuJztcbiAgICAgIGdlbmVyYXRlZCArPSBjb250ZW50ICsgJ1xcbic7XG4gICAgfVxuICAgIGlmICghKGF3YWl0IGlnbm9yZUZpbGVVdGlsLmlzQmVycnlaZXJvSW5zdGFsbEVuYWJsZWQoZmlsZVBhdGgpKSkge1xuICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2UoJyEueWFybi9jYWNoZScsICcjICEueWFybi9jYWNoZScpLnJlcGxhY2UoJyMgLnBucC4qJywgJy5wbnAuKicpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc1BvbVhtbCB8fCBjb25maWcuZG9lc0NvbnRhaW5zUHVic3BlY1lhbWwpIHtcbiAgICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZFxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9hcnRpZmFjdHMkL2dtLCAnLmlkZWEvYXJ0aWZhY3RzJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvY29tcGlsZXIueG1sJC9nbSwgJy5pZGVhL2NvbXBpbGVyLnhtbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL2phclJlcG9zaXRvcmllcy54bWwkL2dtLCAnLmlkZWEvamFyUmVwb3NpdG9yaWVzLnhtbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL21vZHVsZXMueG1sJC9nbSwgJy5pZGVhL21vZHVsZXMueG1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvKi5pbWwkL2dtLCAnLmlkZWEvKi5pbWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9tb2R1bGVzJC9nbSwgJy5pZGVhL21vZHVsZXMnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgKi5pbWwkL2dtLCAnKi5pbWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgKi5pcHIkL2dtLCAnKi5pcHInKTtcbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zUHVic3BlY1lhbWwpIHtcbiAgICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2VBbGwoL14uaWRlYVxcL21vZHVsZXMueG1sJC9nbSwgJyMgLmlkZWEvbW9kdWxlcy54bWwnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2VBbGwoL14uaWRlYVxcLz8kL2dtLCAnIyAuaWRlYScpO1xuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSB8fCBjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlIHx8IGNvbmZpZy5kb2VzQ29udGFpbnNQdWJzcGVjWWFtbCkge1xuICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2VBbGwoL14oLmlkZWFcXC8uKykkL2dtLCAnJDFcXG5hbmRyb2lkLyQxJyk7XG4gICAgfVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBoZWFkVXNlckNvbnRlbnQgKyAnXFxuJyArIGdlbmVyYXRlZCArIHRhaWxVc2VyQ29udGVudDtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuY29uc3QgZGlyUGF0aCA9IHBhdGguam9pbihvcy5ob21lZGlyKCksICcuY2FjaGUnLCAnd2JmeScsICdnaXRpZ25vcmUnKTtcblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVDYWNoZShuYW1lOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihkaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGguam9pbihkaXJQYXRoLCBuYW1lKSwgY29udGVudCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRDYWNoZShuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IHN0YXQgPSBhd2FpdCBmcy5wcm9taXNlcy5zdGF0KHBhdGguam9pbihkaXJQYXRoLCBuYW1lKSk7XG4gICAgaWYgKERhdGUubm93KCkgLSBzdGF0Lm10aW1lTXMgPiA2ICogNjAgKiA2MCAqIDEwMDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHBhdGguam9pbihkaXJQYXRoLCBuYW1lKSwgJ3V0ZjgnKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG4iLCJpbXBvcnQgeyBvY3Rva2l0IH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRMYXRlc3RDb21taXRIYXNoKG9yZ2FuaXphdGlvbjogc3RyaW5nLCByZXBvOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICB0cnkge1xuICAgIGNvbnN0IHsgZGF0YTogY29tbWl0cyB9ID0gYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbW1pdHMnLCB7XG4gICAgICBvd25lcjogb3JnYW5pemF0aW9uLFxuICAgICAgcmVwbyxcbiAgICAgIHBlcl9wYWdlOiAxLFxuICAgIH0pO1xuICAgIGNvbnNvbGUuaW5mbygnY29tbWl0czonLCBjb21taXRzKTtcbiAgICBpZiAoY29tbWl0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gY29tbWl0cyBmb3VuZCBmb3IgJHtvcmdhbml6YXRpb259LyR7cmVwb31gKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbW1pdHNbMF0uc2hhO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGZldGNoIGNvbW1pdHMgZm9yICR7b3JnYW5pemF0aW9ufS8ke3JlcG99OiAke2Vycm9yfWApO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuZXhwb3J0IGNvbnN0IEVzbGludFV0aWwgPSB7XG4gIGdldExpbnRGaXhTdWZmaXgoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gY29uZmlnLmRvZXNDb250YWluc0pzeE9yVHN4ID8gJyAtLXJ1bGUgXCJ7IHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwczogMCB9XCInIDogJyc7XG4gIH0sXG59O1xuIiwiaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmNvbnN0IHNyY0RpcmVjdG9yaWVzID0ge1xuICBub2RlOiBbJ3NyYycsICd0ZXN0cycsICdzY3JpcHRzJ10uc29ydCgpLFxuICBibGl0ejogWydzcmMnLCAndGVzdHMnLCAnc2NyaXB0cycsICdkYicsICdpbnRlZ3JhdGlvbnMnLCAnbWFpbGVycyddLnNvcnQoKSxcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTcmNEaXJzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZ1tdIHtcbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHopIHtcbiAgICByZXR1cm4gc3JjRGlyZWN0b3JpZXMuYmxpdHo7XG4gIH1cbiAgcmV0dXJuIHNyY0RpcmVjdG9yaWVzLm5vZGU7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCB7IGdsb2JieSwgZ2xvYmJ5U3luYyB9IGZyb20gJ2dsb2JieSc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uLCBTZXRSZXF1aXJlZCB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGdldExhdGVzdENvbW1pdEhhc2ggfSBmcm9tICcuLi9naXRodWIvY29tbWl0LmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEVzbGludEV4dGVuc2lvbkJhc2UsIFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IEVzbGludFV0aWwgfSBmcm9tICcuLi91dGlscy9lc2xpbnRVdGlsLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGdpdEh1YlV0aWwgfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgY29tYmluZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jIH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcbmltcG9ydCB7IGdldFNyY0RpcnMgfSBmcm9tICcuLi91dGlscy9zcmNEaXJlY3Rvcmllcy5qcyc7XG5pbXBvcnQgeyBCTElUWl9WRVJTSU9OLCBORVhUX1ZFUlNJT04gfSBmcm9tICcuLi91dGlscy92ZXJzaW9uQ29uc3RhbnRzLmpzJztcblxuY29uc3QganNDb21tb25EZXBzID0gW1xuICAnZXNsaW50QDguNTcuMCcsXG4gICdlc2xpbnQtY29uZmlnLXByZXR0aWVyJyxcbiAgJ2VzbGludC1wbHVnaW4taW1wb3J0JyxcbiAgJ2VzbGludC1wbHVnaW4tc29ydC1jbGFzcy1tZW1iZXJzJyxcbiAgJ2VzbGludC1wbHVnaW4tc29ydC1kZXN0cnVjdHVyZS1rZXlzJyxcbiAgJ2VzbGludC1wbHVnaW4tdW5pY29ybicsXG5dO1xuXG5jb25zdCB0c0NvbW1vbkRlcHMgPSBbXG4gIC4uLmpzQ29tbW9uRGVwcyxcbiAgJ0B0eXBlc2NyaXB0LWVzbGludC9lc2xpbnQtcGx1Z2luJyxcbiAgJ0B0eXBlc2NyaXB0LWVzbGludC9wYXJzZXInLFxuICAnZXNsaW50LWltcG9ydC1yZXNvbHZlci10eXBlc2NyaXB0Jyxcbl07XG5cbmNvbnN0IHJlYWN0Q29tbW9uRGVwcyA9IFsnZXNsaW50LXBsdWdpbi1yZWFjdCcsICdlc2xpbnQtcGx1Z2luLXJlYWN0LWhvb2tzJ107XG5cbmNvbnN0IGVzbGludERlcHM6IFJlY29yZDxFc2xpbnRFeHRlbnNpb25CYXNlLCBzdHJpbmdbXT4gPSB7XG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcyc6IFsnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMnLCAuLi5qc0NvbW1vbkRlcHNdLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMtcmVhY3QnOiBbJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzLXJlYWN0JywgLi4uanNDb21tb25EZXBzLCAuLi5yZWFjdENvbW1vbkRlcHNdLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMnOiBbJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzJywgLi4udHNDb21tb25EZXBzXSxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzLXJlYWN0JzogWydAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cy1yZWFjdCcsIC4uLnRzQ29tbW9uRGVwcywgLi4ucmVhY3RDb21tb25EZXBzXSxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWJsaXR6LW5leHQnOiBbXG4gICAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWJsaXR6LW5leHQnLFxuICAgICdlc2xpbnQtY29uZmlnLW5leHQnLFxuICAgIC4uLnRzQ29tbW9uRGVwcyxcbiAgICAuLi5yZWFjdENvbW1vbkRlcHMsXG4gIF0sXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1uZXh0JzogW1xuICAgICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1uZXh0JyxcbiAgICAnZXNsaW50LWNvbmZpZy1uZXh0JyxcbiAgICAuLi50c0NvbW1vbkRlcHMsXG4gICAgLi4ucmVhY3RDb21tb25EZXBzLFxuICBdLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUGFja2FnZUpzb24oXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgc2tpcEFkZGluZ0RlcHM6IGJvb2xlYW5cbik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUGFja2FnZUpzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgY29yZShjb25maWcsIHJvb3RDb25maWcsIHNraXBBZGRpbmdEZXBzKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLCBza2lwQWRkaW5nRGVwczogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICBjb25zdCBqc29uVGV4dCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICBjb25zdCBqc29uT2JqID0gSlNPTi5wYXJzZShqc29uVGV4dCkgYXMgUGFja2FnZUpzb247XG4gIGpzb25PYmouc2NyaXB0cyA9IGpzb25PYmouc2NyaXB0cyB8fCB7fTtcbiAganNvbk9iai5kZXBlbmRlbmNpZXMgPSBqc29uT2JqLmRlcGVuZGVuY2llcyB8fCB7fTtcbiAganNvbk9iai5kZXZEZXBlbmRlbmNpZXMgPSBqc29uT2JqLmRldkRlcGVuZGVuY2llcyB8fCB7fTtcbiAganNvbk9iai5wZWVyRGVwZW5kZW5jaWVzID0ganNvbk9iai5wZWVyRGVwZW5kZW5jaWVzIHx8IHt9O1xuXG4gIGF3YWl0IHJlbW92ZURlcHJlY2F0ZWRTdHVmZihcbiAgICByb290Q29uZmlnLFxuICAgIGpzb25PYmogYXMgU2V0UmVxdWlyZWQ8UGFja2FnZUpzb24sICdzY3JpcHRzJyB8ICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcyc+XG4gICk7XG5cbiAgaWYgKGpzb25PYmoubmFtZSAhPT0gJ0B3aWxsYm9vc3Rlci9wcmV0dGllci1jb25maWcnKSB7XG4gICAganNvbk9iai5wcmV0dGllciA9ICdAd2lsbGJvb3N0ZXIvcHJldHRpZXItY29uZmlnJztcbiAgfVxuXG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGpzb25PYmouc2NyaXB0cyBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSkge1xuICAgIC8vIEZyZXNoIHJlcG8gc3RpbGwgcmVxdWlyZXMgJ3lhcm4gaW5zdGFsbCdcbiAgICBpZiAoIXZhbHVlLmluY2x1ZGVzKCdnaXQgY2xvbmUnKSkge1xuICAgICAganNvbk9iai5zY3JpcHRzW2tleV0gPSB2YWx1ZS5yZXBsYWNlKC95YXJuXFxzKiYmXFxzKi8sICcnKS5yZXBsYWNlKC95YXJuXFxzKmluc3RhbGxcXHMqJiZcXHMqLywgJycpO1xuICAgIH1cbiAgfVxuXG4gIGpzb25PYmouc2NyaXB0cyA9IG1lcmdlKGpzb25PYmouc2NyaXB0cywgZ2VuZXJhdGVTY3JpcHRzKGNvbmZpZykpO1xuICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5wcmV0dGlmeTtcbiAgfSBlbHNlIHtcbiAgICBqc29uT2JqLnNjcmlwdHMucHJldHRpZnkgKz0gYXdhaXQgZ2VuZXJhdGVQcmV0dGllclN1ZmZpeChjb25maWcuZGlyUGF0aCk7XG4gIH1cbiAgLy8gRGVhbCB3aXRoIGJyZWFraW5nIGNoYW5nZXMgaW4geWFybiBiZXJyeSA0LjAuMC1yYy40OVxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhqc29uT2JqLnNjcmlwdHMpKSB7XG4gICAgaWYgKCF2YWx1ZT8uaW5jbHVkZXMoJ3lhcm4gd29ya3NwYWNlcyBmb3JlYWNoJykpIGNvbnRpbnVlO1xuICAgIGlmIChcbiAgICAgIHZhbHVlLmluY2x1ZGVzKCctLWFsbCcpIHx8XG4gICAgICB2YWx1ZS5pbmNsdWRlcygnLS1yZWN1cnNpdmUnKSB8fFxuICAgICAgdmFsdWUuaW5jbHVkZXMoJy0tc2luY2UnKSB8fFxuICAgICAgdmFsdWUuaW5jbHVkZXMoJy0td29ya3RyZWUnKVxuICAgIClcbiAgICAgIGNvbnRpbnVlO1xuICAgIGpzb25PYmouc2NyaXB0c1trZXldID0gdmFsdWUucmVwbGFjZSgneWFybiB3b3Jrc3BhY2VzIGZvcmVhY2gnLCAneWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwnKTtcbiAgfVxuXG4gIGxldCBkZXBlbmRlbmNpZXM6IHN0cmluZ1tdID0gW107XG4gIGxldCBkZXZEZXBlbmRlbmNpZXMgPSBbJ3ByZXR0aWVyJywgJ3NvcnQtcGFja2FnZS1qc29uJywgJ0B3aWxsYm9vc3Rlci9wcmV0dGllci1jb25maWcnXTtcbiAgY29uc3QgcG9ldHJ5RGV2RGVwZW5kZW5jaWVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ2xpbnQtc3RhZ2VkJ107XG4gIH0gZWxzZSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ2xpbnQtc3RhZ2VkJyk7XG4gIH1cblxuICBpZiAoY29uZmlnLmlzUm9vdCkge1xuICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snaHVza3knXTtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1sncGluc3QnXTtcbiAgICAgIGpzb25PYmouc2NyaXB0cy5wcmVwYXJlID0gJ2xlZnRob29rIGluc3RhbGwgfHwgdHJ1ZSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRvIGluc3RhbGwgdGhlIGxhdGVzdCBodXNreVxuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ2h1c2t5Jyk7XG4gICAgICAvLyAnfHwgdHJ1ZScgYXZvaWRzIGVycm9ycyB3aGVuIGh1c2t5IGlzIG5vdCBpbnN0YWxsZWQuXG4gICAgICBqc29uT2JqLnNjcmlwdHMucHJlcGFyZSA9ICdodXNreSB8fCB0cnVlJzsgLy8gZm9yIG5vbi15YXJuIHBhY2thZ2UgbWFuYWdlcnMuXG4gICAgICBqc29uT2JqLnNjcmlwdHMucG9zdGluc3RhbGwgPSAnaHVza3kgfHwgdHJ1ZSc7IC8vIGZvciB5YXJuLlxuICAgICAgaWYgKGNvbmZpZy5pc1B1YmxpY1JlcG8gfHwgY29uZmlnLmlzUmVmZXJyZWRCeU90aGVyUmVwbykge1xuICAgICAgICAvLyBUbyBpbnN0YWxsIHRoZSBsYXRlc3QgcGluc3RcbiAgICAgICAgLy8gaHR0cHM6Ly90eXBpY29kZS5naXRodWIuaW8vaHVza3kvIy8/aWQ9aW5zdGFsbC0xXG4gICAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdwaW5zdCcpO1xuICAgICAgICBqc29uT2JqLnNjcmlwdHMucHJlcGFjayA9ICdwaW5zdCAtLWRpc2FibGUnO1xuICAgICAgICBqc29uT2JqLnNjcmlwdHMucG9zdHBhY2sgPSAncGluc3QgLS1lbmFibGUnO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5zZW1hbnRpY1JlbGVhc2UpIHtcbiAgICAgIGNvbnN0IHZlcnNpb24gPVxuICAgICAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snbXVsdGktc2VtYW50aWMtcmVsZWFzZSddIHx8IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAcWl3aS9tdWx0aS1zZW1hbnRpYy1yZWxlYXNlJ11cbiAgICAgICAgICA/IC8vIFRPRE86IHJlbW92ZSB0aGUgdmVyc2lvbiBzcGVjaWZpY2F0aW9uIGFmdGVyIG11bHRpLXNlbWFudGljLXJlbGVhc2Ugc3VwcG9ydHMgdmVyc2lvbiA3K1xuICAgICAgICAgICAgJ0A2LjEuMCdcbiAgICAgICAgICA6ICcnO1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goYGNvbnZlbnRpb25hbC1jaGFuZ2Vsb2ctY29udmVudGlvbmFsY29tbWl0cyR7dmVyc2lvbn1gKTtcbiAgICAgIGlmIChcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydzZW1hbnRpYy1yZWxlYXNlJ10gJiZcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydtdWx0aS1zZW1hbnRpYy1yZWxlYXNlJ10gJiZcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAcWl3aS9tdWx0aS1zZW1hbnRpYy1yZWxlYXNlJ11cbiAgICAgICkge1xuICAgICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnc2VtYW50aWMtcmVsZWFzZScpO1xuICAgICAgfVxuICAgICAganNvbk9iai52ZXJzaW9uID0gJzAuMC4wLXNlbWFudGljYWxseS1yZWxlYXNlZCc7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRUZXN0KSB7XG4gICAgICAvLyBTaW5jZSBsbG0tdG9vbGJveCByZXF1aXJlcyBAcGxheXdyaWdodC90ZXN0IGluIGRlcGVuZGVuY2llc1xuICAgICAgaWYgKCFqc29uT2JqLmRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddKSB7XG4gICAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAcGxheXdyaWdodC90ZXN0Jyk7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddO1xuICAgICAgfVxuICAgICAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzWydwbGF5d3JpZ2h0J107XG4gICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ3BsYXl3cmlnaHQnXTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNTdWJQYWNrYWdlSnNvbnMpIHtcbiAgICAgIC8vIFdlIGRvbid0IGFsbG93IG5vbi1hcnJheSB3b3Jrc3BhY2VzIGluIG1vbm9yZXBvLlxuICAgICAganNvbk9iai53b3Jrc3BhY2VzID0gQXJyYXkuaXNBcnJheShqc29uT2JqLndvcmtzcGFjZXMpXG4gICAgICAgID8gbWVyZ2UuYWxsKFtqc29uT2JqLndvcmtzcGFjZXMsIFsncGFja2FnZXMvKiddXSwge1xuICAgICAgICAgICAgYXJyYXlNZXJnZTogY29tYmluZU1lcmdlLFxuICAgICAgICAgIH0pXG4gICAgICAgIDogWydwYWNrYWdlcy8qJ107XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGpzb25PYmoud29ya3NwYWNlcykpIHtcbiAgICAgIGpzb25PYmoud29ya3NwYWNlcyA9IGpzb25PYmoud29ya3NwYWNlcy5maWx0ZXIoXG4gICAgICAgICh3b3Jrc3BhY2UpID0+XG4gICAgICAgICAgZ2xvYmJ5U3luYyh3b3Jrc3BhY2UsIHtcbiAgICAgICAgICAgIGRvdDogdHJ1ZSxcbiAgICAgICAgICAgIGN3ZDogY29uZmlnLmRpclBhdGgsXG4gICAgICAgICAgICBnaXRpZ25vcmU6IHRydWUsXG4gICAgICAgICAgfSkubGVuZ3RoID4gMFxuICAgICAgKTtcbiAgICAgIGlmIChqc29uT2JqLndvcmtzcGFjZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLndvcmtzcGFjZXM7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLndiIHx8IGNvbmZpZy5pc0J1bikge1xuICAgIGlmIChqc29uT2JqLmRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3diJ10pIHtcbiAgICAgIGRlcGVuZGVuY2llcy5wdXNoKCdAd2lsbGJvb3N0ZXIvd2InKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0B3aWxsYm9vc3Rlci93YicpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhqc29uT2JqLnNjcmlwdHMgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPikpIHtcbiAgICAgIGpzb25PYmouc2NyaXB0c1trZXldID0gdmFsdWUucmVwbGFjZSgvd2JcXHMrZGIvLCAnd2IgcHJpc21hJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKFxuICAgIGNvbmZpZy5kb2VzQ29udGFpbnNKYXZhU2NyaXB0IHx8XG4gICAgY29uZmlnLmRvZXNDb250YWluc0phdmFTY3JpcHRJblBhY2thZ2VzIHx8XG4gICAgY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHQgfHxcbiAgICBjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdEluUGFja2FnZXNcbiAgKSB7XG4gICAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0BiaW9tZWpzL2Jpb21lJywgJ0B3aWxsYm9vc3Rlci9iaW9tZS1jb25maWcnKTtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snZXNsaW50J107XG4gICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ21pY3JvbWF0Y2gnXTtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHR5cGVzY3JpcHQtZXNsaW50L3BhcnNlciddO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnZXNsaW50QDguNTcuMCcsICdtaWNyb21hdGNoJyk7XG4gICAgICAvLyBUT0RPOiBub3QgbmVlZGVkIGFueW1vcmU/XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHRJblBhY2thZ2VzKSB7XG4gICAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAdHlwZXNjcmlwdC1lc2xpbnQvcGFyc2VyJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCd0eXBlc2NyaXB0Jyk7XG4gICAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0B0eXBlcy9idW4nKTtcbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlnLmVzbGludEJhc2UpIHtcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCguLi5lc2xpbnREZXBzW2NvbmZpZy5lc2xpbnRCYXNlXSk7XG4gIH1cblxuICBpZiAoY29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzKSB7XG4gICAgZGVwZW5kZW5jaWVzID0gZGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhZGVwLmluY2x1ZGVzKCdAd2lsbGJvb3N0ZXIvJykpO1xuICAgIGRldkRlcGVuZGVuY2llcyA9IGRldkRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWRlcC5pbmNsdWRlcygnQHdpbGxib29zdGVyLycpKTtcbiAgfVxuXG4gIGlmICghanNvbk9iai5uYW1lKSB7XG4gICAganNvbk9iai5uYW1lID0gcGF0aC5iYXNlbmFtZShjb25maWcuZGlyUGF0aCk7XG4gIH1cblxuICBpZiAoY29uZmlnLmRvZXNDb250YWluc1N1YlBhY2thZ2VKc29ucykge1xuICAgIGpzb25PYmoucHJpdmF0ZSA9IHRydWU7XG4gIH1cbiAgaWYgKCFqc29uT2JqLmxpY2Vuc2UpIHtcbiAgICBqc29uT2JqLmxpY2Vuc2UgPSAnVU5MSUNFTlNFRCc7XG4gIH1cbiAgaWYgKCFqc29uT2JqLnByaXZhdGUgJiYganNvbk9iai5saWNlbnNlICE9PSAnVU5MSUNFTlNFRCcgJiYgcm9vdENvbmZpZy5pc1B1YmxpY1JlcG8pIHtcbiAgICBqc29uT2JqLnB1Ymxpc2hDb25maWcgPz89IHt9O1xuICAgIGpzb25PYmoucHVibGlzaENvbmZpZy5hY2Nlc3MgPz89ICdwdWJsaWMnO1xuICB9XG4gIGNvbnN0IFtvd25lcl0gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUoY29uZmlnLnJlcG9zaXRvcnkgPz8gJycpO1xuICBpZiAob3duZXIgPT09ICdXaWxsQm9vc3RlcicgfHwgb3duZXIgPT09ICdXaWxsQm9vc3RlckxhYicpIHtcbiAgICBqc29uT2JqLmF1dGhvciA9ICdXaWxsQm9vc3RlciBJbmMuJztcbiAgfVxuICBpZiAoIWNvbmZpZy5pc1Jvb3QgJiYganNvbk9iai5wcml2YXRlICYmICFqc29uT2JqLm1haW4pIHtcbiAgICAvLyBNYWtlIFZTQ29kZSBwb3NzaWJsZSB0byByZWZhY3RvciBjb2RlIGFjcm9zcyBzdWJwYWNrYWdlcy5cbiAgICBqc29uT2JqLm1haW4gPSAnLi9zcmMnO1xuICB9XG5cbiAgLy8gQmVjYXVzZSBgXCJyZXNvbHV0aW9uc1wiOiB7IFwibnBtL2NoYWxrXCI6IFwiXjQuMS4yXCIgfSxgIGNhdXNlcyBcIkludmFsaWQgbnBtIHRva2VuXCJcbiAgZGVsZXRlIGpzb25PYmoucmVzb2x1dGlvbnM/LlsnbnBtL2NoYWxrJ107XG5cbiAgaWYgKCFjb25maWcuZG9lc0NvbnRhaW5zU3ViUGFja2FnZUpzb25zKSB7XG4gICAgaWYgKCFjb25maWcuaXNCdW4pIHtcbiAgICAgIGlmICghY29uZmlnLmRvZXNDb250YWluc0phdmFTY3JpcHQgJiYgIWNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0KSB7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMubGludDtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snbGludC1maXgnXTtcbiAgICAgICAganNvbk9iai5zY3JpcHRzLmNsZWFudXAgPSBqc29uT2JqLnNjcmlwdHMuY2xlYW51cD8ucmVwbGFjZSgnICYmIHlhcm4gbGludC1maXgnLCAnJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J10gKz0gRXNsaW50VXRpbC5nZXRMaW50Rml4U3VmZml4KGNvbmZpZyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNQdWJzcGVjWWFtbCkge1xuICAgICAganNvbk9iai5zY3JpcHRzLmxpbnQgPSAnZmx1dHRlciBhbmFseXplJztcbiAgICAgIGpzb25PYmouc2NyaXB0c1snbGludC1maXgnXSA9ICd5YXJuIGxpbnQnO1xuICAgICAgY29uc3QgZGlycyA9IFsnbGliJywgJ3Rlc3QnLCAndGVzdF9kcml2ZXInXS5maWx0ZXIoKGRpcikgPT4gZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGRpcikpKTtcbiAgICAgIGlmIChkaXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAganNvbk9iai5zY3JpcHRzWydmb3JtYXQtY29kZSddID0gYGZsdXR0ZXIgZm9ybWF0ICQoZmluZCAke2RpcnMuam9pbihcbiAgICAgICAgICAnICdcbiAgICAgICAgKX0gLW5hbWUgZ2VuZXJhdGVkIC1wcnVuZSAtbyAtbmFtZSAnKi5mcmVlemVkLmRhcnQnIC1wcnVuZSAtbyAtbmFtZSAnKi5nLmRhcnQnIC1wcnVuZSAtbyAtbmFtZSAnKi5kYXJ0JyAtcHJpbnQpYDtcbiAgICAgICAganNvbk9iai5zY3JpcHRzLmZvcm1hdCArPSBgICYmIHlhcm4gZm9ybWF0LWNvZGVgO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zUG9ldHJ5TG9jaykge1xuICAgICAgaWYgKGpzb25PYmouc2NyaXB0cy5wb3N0aW5zdGFsbCA9PT0gJ3BvZXRyeSBpbnN0YWxsJykge1xuICAgICAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLnBvc3RpbnN0YWxsO1xuICAgICAgfVxuICAgICAgY29uc3QgcHl0aG9uRmlsZXMgPSBhd2FpdCBnbG9iYnkoJyoqLyoucHknLCB7XG4gICAgICAgIGN3ZDogY29uZmlnLmRpclBhdGgsXG4gICAgICAgIGRvdDogdHJ1ZSxcbiAgICAgICAgZ2l0aWdub3JlOiB0cnVlLFxuICAgICAgICBpZ25vcmU6IFsndGVzdC1maXh0dXJlcyddLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBkaXJOYW1lU2V0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICBmb3IgKGNvbnN0IHB5dGhvbkZpbGUgb2YgcHl0aG9uRmlsZXMpIHtcbiAgICAgICAgY29uc3QgW2ZpcnN0LCBzZWNvbmRdID0gcHl0aG9uRmlsZS5zcGxpdCgvWy9cXFxcXS8pO1xuICAgICAgICBpZiAoc2Vjb25kKSB7XG4gICAgICAgICAgZGlyTmFtZVNldC5hZGQoZmlyc3QpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZGlyTmFtZVNldC5zaXplID4gMCkge1xuICAgICAgICBjb25zdCBkaXJOYW1lc1N0ciA9IFsuLi5kaXJOYW1lU2V0XS5qb2luKCcgJyk7XG4gICAgICAgIGpzb25PYmouc2NyaXB0c1snZm9ybWF0LWNvZGUnXSA9XG4gICAgICAgICAgYHBvZXRyeSBydW4gaXNvcnQgLS1wcm9maWxlIGJsYWNrICR7ZGlyTmFtZXNTdHJ9ICYmIHBvZXRyeSBydW4gYmxhY2sgJHtkaXJOYW1lc1N0cn1gO1xuICAgICAgICBpZiAoanNvbk9iai5zY3JpcHRzLmxpbnQpIHtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHMubGludCA9IGBwb2V0cnkgcnVuIGZsYWtlOCAke2Rpck5hbWVzU3RyfSAmJiAke2pzb25PYmouc2NyaXB0cy5saW50fWA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAganNvbk9iai5zY3JpcHRzLmxpbnQgPSBgcG9ldHJ5IHJ1biBmbGFrZTggJHtkaXJOYW1lc1N0cn1gO1xuICAgICAgICAgIGpzb25PYmouc2NyaXB0c1snbGludC1maXgnXSA9ICd5YXJuIGxpbnQnO1xuICAgICAgICB9XG4gICAgICAgIGpzb25PYmouc2NyaXB0cy5mb3JtYXQgKz0gYCAmJiB5YXJuIGZvcm1hdC1jb2RlYDtcbiAgICAgICAgcG9ldHJ5RGV2RGVwZW5kZW5jaWVzLnB1c2goJ2JsYWNrJywgJ2lzb3J0JywgJ2ZsYWtlOCcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb25maWcucmVwb3NpdG9yeSkge1xuICAgICAganNvbk9iai5yZXBvc2l0b3J5ID0gY29uZmlnLnJlcG9zaXRvcnk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHopIHtcbiAgICBkZXBlbmRlbmNpZXMucHVzaChcbiAgICAgIGBibGl0ekAke0JMSVRaX1ZFUlNJT059YCxcbiAgICAgIGBAYmxpdHpqcy9hdXRoQCR7QkxJVFpfVkVSU0lPTn1gLFxuICAgICAgYEBibGl0empzL25leHRAJHtCTElUWl9WRVJTSU9OfWAsXG4gICAgICBgQGJsaXR6anMvcnBjQCR7QkxJVFpfVkVSU0lPTn1gLFxuICAgICAgYG5leHRAJHtORVhUX1ZFUlNJT059YFxuICAgICk7XG4gICAgLy8gUHJlZmVyIGVzbGludC1jb25maWctbmV4dCdzIGRlcGVuZGVuY2llc1xuICAgIGRldkRlcGVuZGVuY2llcyA9IGRldkRlcGVuZGVuY2llcy5maWx0ZXIoKGQpID0+IGQgIT09ICdlc2xpbnQtcGx1Z2luLXJlYWN0JyAmJiBkICE9PSAnZXNsaW50LXBsdWdpbi1yZWFjdC1ob29rcycpO1xuICAgIGlmICghanNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddPy5zdGFydHNXaXRoKCdibGl0eiBjb2RlZ2VuJykpIHtcbiAgICAgIGpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXSA9ICdibGl0eiBjb2RlZ2VuJztcbiAgICB9IGVsc2UgaWYgKCFqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10uaW5jbHVkZXMoJ2JsaXR6IHByaXNtYSBnZW5lcmF0ZScpKSB7XG4gICAgICBqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10gPSBqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10ucmVwbGFjZShcbiAgICAgICAgJ2JsaXR6IGNvZGVnZW4nLFxuICAgICAgICAnYmxpdHogY29kZWdlbiAmJiBibGl0eiBwcmlzbWEgZ2VuZXJhdGUnXG4gICAgICApO1xuICAgIH1cbiAgfSBlbHNlIGlmIChjb25maWcuZGVwZW5kaW5nLnByaXNtYSAmJiAhanNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddPy5zdGFydHNXaXRoKCdwcmlzbWEgZ2VuZXJhdGUnKSkge1xuICAgIGpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXSA9ICdwcmlzbWEgZ2VuZXJhdGUnO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgIC8vIFRvIHByZXZlbnQgbXVsdGlwbGUgdmVyc2lvbnMgb2YgQHR5cGVzL3JlYWN0IGZyb20gbWl4aW5nLlxuICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHR5cGVzL3JlYWN0J107XG4gIH1cblxuICBpZiAoIWpzb25PYmouZGVwZW5kZW5jaWVzPy5wcmV0dGllcikge1xuICAgIC8vIEJlY2F1c2UgQHR5cGVzL3ByZXR0aWVyIGJsb2NrcyBwcmV0dGllciBleGVjdXRpb24uXG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAdHlwZXMvcHJldHRpZXInXTtcbiAgfVxuXG4gIGlmIChPYmplY3Qua2V5cyhqc29uT2JqLmRlcGVuZGVuY2llcykubGVuZ3RoID09PSAwKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzO1xuICB9XG4gIGlmIChPYmplY3Qua2V5cyhqc29uT2JqLmRldkRlcGVuZGVuY2llcykubGVuZ3RoID09PSAwKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzO1xuICB9XG4gIGlmIChPYmplY3Qua2V5cyhqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgIGRlbGV0ZSBqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXM7XG4gIH1cblxuICBhd2FpdCB1cGRhdGVQcml2YXRlUGFja2FnZXMoanNvbk9iaik7XG5cbiAgbGV0IG5ld0pzb25UZXh0ID0gSlNPTi5zdHJpbmdpZnkoanNvbk9iaik7XG4gIG5ld0pzb25UZXh0ID0gYXdhaXQgZml4U2NyaXB0TmFtZXMoanNvbk9iai5zY3JpcHRzLCBuZXdKc29uVGV4dCwgY29uZmlnKTtcbiAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGZpbGVQYXRoLCBuZXdKc29uVGV4dCk7XG5cbiAgaWYgKCFza2lwQWRkaW5nRGVwcykge1xuICAgIC8vIFdlIGNhbm5vdCBhZGQgZGVwZW5kZW5jaWVzIHdoaWNoIGFyZSBhbHJlYWR5IGluY2x1ZGVkIGluIGRldkRlcGVuZGVuY2llcy5cbiAgICBkZXBlbmRlbmNpZXMgPSBkZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFqc29uT2JqLmRldkRlcGVuZGVuY2llcz8uW2RlcF0pO1xuICAgIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gY29uZmlnLmlzQnVuID8gJ2J1bicgOiAneWFybic7XG4gICAgaWYgKGRlcGVuZGVuY2llcy5sZW5ndGggPiAwKSB7XG4gICAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnYWRkJywgLi4ubmV3IFNldChkZXBlbmRlbmNpZXMpXSwgY29uZmlnLmRpclBhdGgpO1xuICAgIH1cbiAgICAvLyBXZSBjYW5ub3QgYWRkIGRldkRlcGVuZGVuY2llcyB3aGljaCBhcmUgYWxyZWFkeSBpbmNsdWRlZCBpbiBkZXBlbmRlbmNpZXMuXG4gICAgZGV2RGVwZW5kZW5jaWVzID0gZGV2RGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhanNvbk9iai5kZXBlbmRlbmNpZXM/LltkZXBdKTtcbiAgICBpZiAoZGV2RGVwZW5kZW5jaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydhZGQnLCAnLUQnLCAuLi5uZXcgU2V0KGRldkRlcGVuZGVuY2llcyldLCBjb25maWcuZGlyUGF0aCk7XG4gICAgfVxuICAgIGlmIChwb2V0cnlEZXZEZXBlbmRlbmNpZXMubGVuZ3RoID4gMCkge1xuICAgICAgc3Bhd25TeW5jKCdwb2V0cnknLCBbJ2FkZCcsICctLWdyb3VwJywgJ2RldicsIC4uLm5ldyBTZXQocG9ldHJ5RGV2RGVwZW5kZW5jaWVzKV0sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICB9XG4gIH1cbn1cblxuLy8gVE9ETzogcmVtb3ZlIHRoZSBmb2xsb3dpbmcgbWlncmF0aW9uIGNvZGUgaW4gZnV0dXJlXG5hc3luYyBmdW5jdGlvbiByZW1vdmVEZXByZWNhdGVkU3R1ZmYoXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFNldFJlcXVpcmVkPFBhY2thZ2VKc29uLCAnc2NyaXB0cycgfCAnZGVwZW5kZW5jaWVzJyB8ICdkZXZEZXBlbmRlbmNpZXMnPlxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChqc29uT2JqLmF1dGhvciA9PT0gJ1dpbGxCb29zdGVyIExMQycpIHtcbiAgICBqc29uT2JqLmF1dGhvciA9ICdXaWxsQm9vc3RlciBJbmMuJztcbiAgfVxuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydzb3J0LXBhY2thZ2UtanNvbiddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydzb3J0LWFsbC1wYWNrYWdlLWpzb24nXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sndHlwZWNoZWNrL3dhcm4nXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sndHlwZWNoZWNrOmdlbi1jb2RlJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3R5cGVjaGVjazpjb2RlZ2VuJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llc1sndHNsaWInXTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZyddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXJlYWN0J107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3Jlbm92YXRlLWNvbmZpZyddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci90c2NvbmZpZyddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ2VzbGludC1pbXBvcnQtcmVzb2x2ZXItbm9kZSddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ2VzbGludC1wbHVnaW4tcHJldHRpZXInXTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydsZXJuYSddO1xuICAvLyBUbyBpbnN0YWxsIHRoZSBsYXRlc3QgcGluc3RcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydwaW5zdCddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydmbHV0dGVyLWZvcm1hdCddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydmb3JtYXQtZmx1dHRlciddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydweXRob24tZm9ybWF0J107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2Zvcm1hdC1weXRob24nXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sncHJldHRpZXInXTtcbiAgaWYgKCFyb290Q29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzKSB7XG4gICAgZm9yIChjb25zdCBkZXBzIG9mIE9iamVjdC52YWx1ZXMoZXNsaW50RGVwcykpIHtcbiAgICAgIGZvciAoY29uc3QgZGVwIG9mIGRlcHMpIHtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW2RlcF07XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybSgnbGVybmEuanNvbicsIHsgZm9yY2U6IHRydWUgfSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVTY3JpcHRzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgY29uc3Qgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgIGNsZWFudXA6ICdidW4gLS1idW4gd2IgbGludCAtLWZpeCAtLWZvcm1hdCcsXG4gICAgICBmb3JtYXQ6IGBidW4gLS1idW4gd2IgbGludCAtLWZvcm1hdGAsXG4gICAgICBsaW50OiBgYnVuIC0tYnVuIHdiIGxpbnRgLFxuICAgICAgJ2xpbnQtZml4JzogJ2J1biAtLWJ1biB3YiBsaW50IC0tZml4JyxcbiAgICAgIHRlc3Q6ICdidW4gLS1idW4gd2IgdGVzdCcsXG4gICAgICB0eXBlY2hlY2s6ICdidW4gLS1idW4gd2IgdHlwZWNoZWNrJyxcbiAgICB9O1xuICAgIGlmICghY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHQgJiYgIWNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgICAgZGVsZXRlIHNjcmlwdHMudHlwZWNoZWNrO1xuICAgIH1cbiAgICByZXR1cm4gc2NyaXB0cztcbiAgfSBlbHNlIHtcbiAgICBsZXQgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgIGNsZWFudXA6ICd5YXJuIGZvcm1hdCAmJiB5YXJuIGxpbnQtZml4JyxcbiAgICAgIGZvcm1hdDogYHNvcnQtcGFja2FnZS1qc29uICYmIHlhcm4gcHJldHRpZnlgLFxuICAgICAgbGludDogYGVzbGludCAtLWNvbG9yIFwiLi97JHtnZXRTcmNEaXJzKGNvbmZpZyl9fS8qKi8qLnske2V4dGVuc2lvbnMuZXNsaW50LmpvaW4oJywnKX19XCJgLFxuICAgICAgJ2xpbnQtZml4JzogJ3lhcm4gbGludCAtLWZpeCcsXG4gICAgICBwcmV0dGlmeTogYHByZXR0aWVyIC0tY2FjaGUgLS1jb2xvciAtLXdyaXRlIFwiKiovey4qLyx9Ki57JHtleHRlbnNpb25zLnByZXR0aWVyLmpvaW4oJywnKX19XCIgXCIhKiovdGVzdC1maXh0dXJlcy8qKlwiYCxcbiAgICAgIHR5cGVjaGVjazogJ3RzYyAtLW5vRW1pdCAtLVByZXR0eScsXG4gICAgfTtcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc1N1YlBhY2thZ2VKc29ucykge1xuICAgICAgY29uc3Qgb2xkVGVzdCA9IHNjcmlwdHMudGVzdDtcbiAgICAgIHNjcmlwdHMgPSBtZXJnZShcbiAgICAgICAgeyAuLi5zY3JpcHRzIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBmb3JtYXQ6IGBzb3J0LXBhY2thZ2UtanNvbiAmJiB5YXJuIHByZXR0aWZ5ICYmIHlhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsIC0tcGFyYWxsZWwgLS12ZXJib3NlIHJ1biBmb3JtYXRgLFxuICAgICAgICAgIGxpbnQ6IGB5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCAtLXBhcmFsbGVsIC0tdmVyYm9zZSBydW4gbGludGAsXG4gICAgICAgICAgJ2xpbnQtZml4JzogJ3lhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsIC0tcGFyYWxsZWwgLS12ZXJib3NlIHJ1biBsaW50LWZpeCcsXG4gICAgICAgICAgcHJldHRpZnk6IGBwcmV0dGllciAtLWNhY2hlIC0tY29sb3IgLS13cml0ZSBcIioqL3suKi8sfSoueyR7ZXh0ZW5zaW9ucy5wcmV0dGllci5qb2luKFxuICAgICAgICAgICAgJywnXG4gICAgICAgICAgKX19XCIgXCIhKiovcGFja2FnZXMvKipcIiBcIiEqKi90ZXN0LWZpeHR1cmVzLyoqXCJgLFxuICAgICAgICAgIC8vIENJPTEgcHJldmVudHMgdml0ZXN0IGZyb20gZW5hYmxpbmcgd2F0Y2guXG4gICAgICAgICAgLy8gRk9SQ0VfQ09MT1I9MyBtYWtlIHdiIGVuYWJsZSBjb2xvciBvdXRwdXQuXG4gICAgICAgICAgdGVzdDogJ0NJPTEgRk9SQ0VfQ09MT1I9MyB5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCAtLXZlcmJvc2UgcnVuIHRlc3QnLFxuICAgICAgICAgIHR5cGVjaGVjazogJ3lhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsIC0tcGFyYWxsZWwgLS12ZXJib3NlIHJ1biB0eXBlY2hlY2snLFxuICAgICAgICB9XG4gICAgICApO1xuICAgICAgaWYgKG9sZFRlc3Q/LmluY2x1ZGVzKCd3YiB0ZXN0JykpIHtcbiAgICAgICAgc2NyaXB0cy50ZXN0ID0gb2xkVGVzdDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHlyaWdodCkge1xuICAgICAgc2NyaXB0cy50eXBlY2hlY2sgPSBzY3JpcHRzLnR5cGVjaGVjayA/IGAke3NjcmlwdHMudHlwZWNoZWNrfSAmJiBgIDogJyc7XG4gICAgICBzY3JpcHRzLnR5cGVjaGVjayArPSAncHlyaWdodCc7XG4gICAgfVxuXG4gICAgaWYgKCFjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdCAmJiAhY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHRJblBhY2thZ2VzKSB7XG4gICAgICBkZWxldGUgc2NyaXB0cy50eXBlY2hlY2s7XG4gICAgfSBlbHNlIGlmIChjb25maWcuZGVwZW5kaW5nLndiKSB7XG4gICAgICBzY3JpcHRzLnR5cGVjaGVjayA9ICd3YiB0eXBlY2hlY2snO1xuICAgIH1cbiAgICByZXR1cm4gc2NyaXB0cztcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVByZXR0aWVyU3VmZml4KGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICcucHJldHRpZXJpZ25vcmUnKTtcbiAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gIGNvbnN0IGluZGV4ID0gZXhpc3RpbmdDb250ZW50LmluZGV4T2YoaWdub3JlRmlsZVV0aWwuc2VwYXJhdG9yUHJlZml4KTtcbiAgaWYgKGluZGV4ID09PSAtMSkgcmV0dXJuICcnO1xuXG4gIGNvbnN0IG9yaWdpbmFsQ29udGVudCA9IGV4aXN0aW5nQ29udGVudC5zbGljZSgwLCBpbmRleCk7XG4gIGNvbnN0IGxpbmVzID0gb3JpZ2luYWxDb250ZW50XG4gICAgLnNwbGl0KCdcXG4nKVxuICAgIC5tYXAoKGxpbmUpID0+IHtcbiAgICAgIGNvbnN0IG5ld0xpbmUgPSBsaW5lLnRyaW0oKTtcbiAgICAgIHJldHVybiBuZXdMaW5lLmVuZHNXaXRoKCcvJykgPyBuZXdMaW5lLnNsaWNlKDAsIC0xKSA6IG5ld0xpbmU7XG4gICAgfSlcbiAgICAuZmlsdGVyKChsKSA9PiBsICYmICFsLnN0YXJ0c1dpdGgoJyMnKSAmJiAhbC5pbmNsdWRlcygnLycpKTtcblxuICByZXR1cm4gbGluZXMubWFwKChsaW5lKSA9PiBgIFwiISoqLyR7bGluZX0vKipcImApLmpvaW4oJycpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmaXhTY3JpcHROYW1lcyhcbiAgc2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cyxcbiAgbmV3SnNvblRleHQ6IHN0cmluZyxcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBvbGRBbmROZXdTY3JpcHROYW1lczogW3N0cmluZywgc3RyaW5nXVtdID0gW107XG4gIGZvciAoY29uc3QgW2tleV0gb2YgT2JqZWN0LmtleXMoc2NyaXB0cykpIHtcbiAgICBpZiAoa2V5WzBdICE9PSAnOicgJiYga2V5LmluY2x1ZGVzKCc6JykpIHtcbiAgICAgIG9sZEFuZE5ld1NjcmlwdE5hbWVzLnB1c2goW2tleSwga2V5LnJlcGxhY2VBbGwoJzonLCAnLScpXSk7XG4gICAgfVxuICB9XG4gIGlmIChvbGRBbmROZXdTY3JpcHROYW1lcy5sZW5ndGggPT09IDApIHJldHVybiBuZXdKc29uVGV4dDtcblxuICBmb3IgKGNvbnN0IFtvbGROYW1lLCBuZXdOYW1lXSBvZiBvbGRBbmROZXdTY3JpcHROYW1lcykge1xuICAgIG5ld0pzb25UZXh0ID0gbmV3SnNvblRleHQucmVwbGFjZUFsbChvbGROYW1lLCBuZXdOYW1lKTtcbiAgfVxuICBjb25zdCBmaWxlcyA9IGF3YWl0IGdsb2JieShbJyoqLyoue21kLGNqcyxtanMsanMsanN4LGN0cyxtdHMsdHMsdHN4fScsICcqKi9Eb2NrZXJmaWxlJ10sIHtcbiAgICBjd2Q6IGNvbmZpZy5kaXJQYXRoLFxuICAgIGRvdDogdHJ1ZSxcbiAgICBnaXRpZ25vcmU6IHRydWUsXG4gIH0pO1xuICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oY29uZmlnLmRpclBhdGgsIGZpbGUpO1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgbGV0IG5ld0NvbnRlbnQgPSBvbGRDb250ZW50O1xuICAgICAgZm9yIChjb25zdCBbb2xkTmFtZSwgbmV3TmFtZV0gb2Ygb2xkQW5kTmV3U2NyaXB0TmFtZXMpIHtcbiAgICAgICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZUFsbChvbGROYW1lLCBuZXdOYW1lKTtcbiAgICAgIH1cbiAgICAgIGlmIChuZXdDb250ZW50ICE9PSBvbGRDb250ZW50KSB7XG4gICAgICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICByZXR1cm4gbmV3SnNvblRleHQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVByaXZhdGVQYWNrYWdlcyhqc29uT2JqOiBQYWNrYWdlSnNvbik6IFByb21pc2U8dm9pZD4ge1xuICBqc29uT2JqLmRlcGVuZGVuY2llcyA9IGpzb25PYmouZGVwZW5kZW5jaWVzIHx8IHt9O1xuICBqc29uT2JqLmRldkRlcGVuZGVuY2llcyA9IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzIHx8IHt9O1xuICBjb25zdCBwYWNrYWdlTmFtZXMgPSBuZXcgU2V0KFsuLi5PYmplY3Qua2V5cyhqc29uT2JqLmRlcGVuZGVuY2llcyksIC4uLk9iamVjdC5rZXlzKGpzb25PYmouZGV2RGVwZW5kZW5jaWVzKV0pO1xuICBjb25zb2xlLmluZm8oJ3BhY2thZ2VOYW1lczonLCBwYWNrYWdlTmFtZXMpO1xuICBpZiAocGFja2FnZU5hbWVzLmhhcygnQHdpbGxib29zdGVyL2F1dGgnKSkge1xuICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL2F1dGgnXTtcbiAgICBjb25zdCBjb21taXRIYXNoID0gYXdhaXQgZ2V0TGF0ZXN0Q29tbWl0SGFzaCgnV2lsbEJvb3N0ZXJMYWInLCAnYXV0aCcpO1xuICAgIGpzb25PYmouZGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvYXV0aCddID0gYGdpdEBnaXRodWIuY29tOldpbGxCb29zdGVyTGFiL2F1dGguZ2l0IyR7Y29tbWl0SGFzaH1gO1xuICB9IGVsc2UgaWYgKHBhY2thZ2VOYW1lcy5oYXMoJ0B3aWxsYm9vc3Rlci9jb2RlLWFuYWx5emVyJykpIHtcbiAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9jb2RlLWFuYWx5emVyJ107XG4gICAgY29uc3QgY29tbWl0SGFzaCA9IGF3YWl0IGdldExhdGVzdENvbW1pdEhhc2goJ1dpbGxCb29zdGVyTGFiJywgJ2NvZGUtYW5hbHl6ZXInKTtcbiAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL2NvZGUtYW5hbHl6ZXInXSA9XG4gICAgICBgZ2l0QGdpdGh1Yi5jb206V2lsbEJvb3N0ZXJMYWIvY29kZS1hbmFseXplci5naXQjd29ya3NwYWNlPUBjb2RlLWFuYWx5emVyL2NsaWVudCZjb21taXQ9JHtjb21taXRIYXNofWA7XG4gIH0gZWxzZSBpZiAocGFja2FnZU5hbWVzLmhhcygnQHdpbGxib29zdGVyL2p1ZGdlJykpIHtcbiAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9qdWRnZSddO1xuICAgIGNvbnN0IGNvbW1pdEhhc2ggPSBhd2FpdCBnZXRMYXRlc3RDb21taXRIYXNoKCdXaWxsQm9vc3RlckxhYicsICdqdWRnZScpO1xuICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvanVkZ2UnXSA9IGBnaXRAZ2l0aHViLmNvbTpXaWxsQm9vc3RlckxhYi9qdWRnZS5naXQjJHtjb21taXRIYXNofWA7XG4gIH0gZWxzZSBpZiAocGFja2FnZU5hbWVzLmhhcygnQHdpbGxib29zdGVyL2xsbS1wcm94eScpKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvbGxtLXByb3h5J107XG4gICAgY29uc3QgY29tbWl0SGFzaCA9IGF3YWl0IGdldExhdGVzdENvbW1pdEhhc2goJ1dpbGxCb29zdGVyTGFiJywgJ2xsbS1wcm94eScpO1xuICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvbGxtLXByb3h5J10gPVxuICAgICAgYGdpdEBnaXRodWIuY29tOldpbGxCb29zdGVyTGFiL2xsbS1wcm94eS5naXQjd29ya3NwYWNlPUBsbG0tcHJveHkvY2xpZW50JmNvbW1pdD0ke2NvbW1pdEhhc2h9YDtcbiAgfVxufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuXG5pbXBvcnQgeyBnZW5lcmF0ZVNjcmlwdHMgfSBmcm9tICcuL3BhY2thZ2VKc29uLmpzJztcblxuY29uc3Qgc2NyaXB0cyA9IHtcbiAgcHJlQ29tbWl0OiAnbm9kZSBub2RlX21vZHVsZXMvLmJpbi9saW50LXN0YWdlZCcsXG4gIHByZVB1c2g6IGB5YXJuIHR5cGVjaGVja2AsXG4gIHByZVB1c2hGb3JMYWI6IGBcbmlmIFsgJChnaXQgYnJhbmNoIC0tc2hvdy1jdXJyZW50KSA9IFwibWFpblwiIF0gJiYgWyAkKGdpdCBjb25maWcgdXNlci5lbWFpbCkgIT0gXCJleGthenV1QGdtYWlsLmNvbVwiIF07IHRoZW5cbiAgZWNobyBcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiXG4gIGVjaG8gXCIqKiogRG9uJ3QgcHVzaCBtYWluIGJyYW5jaCBkaXJlY3RseS4gVXNlIFBSISAqKipcIlxuICBlY2hvIFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCJcbiAgZXhpdCAxXG5maVxuXG55YXJuIHR5cGVjaGVja1xuYC50cmltKCksXG4gIHBvc3RNZXJnZTogYFxuY2hhbmdlZF9maWxlcz1cIiQoZ2l0IGRpZmYtdHJlZSAtciAtLW5hbWUtb25seSAtLW5vLWNvbW1pdC1pZCBPUklHX0hFQUQgSEVBRClcIlxuXG5ydW5faWZfY2hhbmdlZCgpIHtcbiAgaWYgZWNobyBcIiRjaGFuZ2VkX2ZpbGVzXCIgfCBncmVwIC0tcXVpZXQgLUUgXCIkMVwiOyB0aGVuXG4gICAgZXZhbCBcIiQyXCJcbiAgZmlcbn1cbmAudHJpbSgpLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlSHVza3lyY1VwZGF0aW5nUGFja2FnZUpzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVIdXNreXJjVXBkYXRpbmdQYWNrYWdlSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBjb3JlKGNvbmZpZyk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgY29uc3QganNvblRleHQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShwYWNrYWdlSnNvblBhdGgsICd1dGY4Jyk7XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShqc29uVGV4dCk7XG4gIHBhY2thZ2VKc29uLnNjcmlwdHMgfHw9IHt9O1xuICBkZWxldGUgcGFja2FnZUpzb24uc2NyaXB0c1sncG9zdGluc3RhbGwnXTtcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnNjcmlwdHNbJ3Bvc3RwdWJsaXNoJ107XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5zY3JpcHRzWydwcmVwYXJlJ107XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5zY3JpcHRzWydwcmVwdWJsaXNoT25seSddO1xuICBkZWxldGUgcGFja2FnZUpzb24uc2NyaXB0c1sncHJlcGFjayddO1xuICBkZWxldGUgcGFja2FnZUpzb24uc2NyaXB0c1sncG9zdHBhY2snXTtcblxuICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmh1c2t5Jyk7XG4gIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICBmcy5wcm9taXNlcy53cml0ZUZpbGUocGFja2FnZUpzb25QYXRoLCBKU09OLnN0cmluZ2lmeShwYWNrYWdlSnNvbiwgdW5kZWZpbmVkLCAyKSksXG4gICAgZnMucHJvbWlzZXMucm0oZGlyUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pLFxuICBdKTtcbiAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgIHNwYXduU3luYygnZ2l0JywgWydjb25maWcnLCAnLS11bnNldCcsICdjb3JlLmhvb2tzUGF0aCddLCBjb25maWcuZGlyUGF0aCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgc3Bhd25TeW5jKCd5YXJuJywgWydkbHgnLCAnaHVza3ktaW5pdCcsICctLXlhcm4yJ10sIGNvbmZpZy5kaXJQYXRoKTtcblxuICBjb25zdCBwcmVDb21taXRGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncHJlLWNvbW1pdCcpO1xuXG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuaHVza3lyYy5qc29uJyksIHsgZm9yY2U6IHRydWUgfSkpO1xuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMud3JpdGVGaWxlKHByZUNvbW1pdEZpbGVQYXRoLCBzY3JpcHRzLnByZUNvbW1pdCArICdcXG4nKSk7XG5cbiAgY29uc3QgeyB0eXBlY2hlY2sgfSA9IGdlbmVyYXRlU2NyaXB0cyhjb25maWcpO1xuICBpZiAodHlwZWNoZWNrKSB7XG4gICAgbGV0IHByZVB1c2ggPSBjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyTGFiLycpID8gc2NyaXB0cy5wcmVQdXNoRm9yTGFiIDogc2NyaXB0cy5wcmVQdXNoO1xuICAgIHByZVB1c2ggPSBwcmVQdXNoLnJlcGxhY2UoXG4gICAgICAneWFybiB0eXBlY2hlY2snLFxuICAgICAgdHlwZWNoZWNrXG4gICAgICAgIC5yZXBsYWNlKCd0c2MgJywgJ25vZGUgbm9kZV9tb2R1bGVzLy5iaW4vdHNjICcpXG4gICAgICAgIC5yZXBsYWNlKCd3YiAnLCAnbm9kZSBub2RlX21vZHVsZXMvLmJpbi93YiAnKVxuICAgICAgICAvLyBweXJpZ2h0IGhhcyBubyBhcmd1bWVudHNcbiAgICAgICAgLnJlcGxhY2UoJ3B5cmlnaHQnLCAnbm9kZSBub2RlX21vZHVsZXMvLmJpbi9weXJpZ2h0JylcbiAgICApO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncHJlLXB1c2gnKSwgcHJlUHVzaCArICdcXG4nLCB7XG4gICAgICAgIG1vZGU6IDBvNzU1LFxuICAgICAgfSlcbiAgICApO1xuICB9XG4gIGNvbnN0IHBvc3RNZXJnZUNvbW1hbmQgPSBgJHtzY3JpcHRzLnBvc3RNZXJnZX1cXG5cXG4ke2dlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMoY29uZmlnKS5qb2luKCdcXG4nKX1cXG5gO1xuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwb3N0LW1lcmdlJyksIHBvc3RNZXJnZUNvbW1hbmQsIHtcbiAgICAgIG1vZGU6IDBvNzU1LFxuICAgIH0pXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVBvc3RNZXJnZUNvbW1hbmRzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgcG9zdE1lcmdlQ29tbWFuZHM6IHN0cmluZ1tdID0gW107XG4gIGlmIChjb25maWcudmVyc2lvbnNUZXh0KSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCJcXC4uKy12ZXJzaW9uXCIgXCJhd2sgJ3twcmludCBcXCQxfScgLnRvb2wtdmVyc2lvbnMgfCB4YXJncyAtSXt9IGFzZGYgcGx1Z2luIGFkZCB7fVwiYCxcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCJcXC4uKy12ZXJzaW9uXCIgXCJhc2RmIHBsdWdpbiB1cGRhdGUgLS1hbGxcImBcbiAgICApO1xuICB9XG4gIC8vIFB5dGhvbuOBjOOBquOBhOOBqOOCpOODs+OCueODiOODvOODq+OBp+OBjeOBquOBhOWHpueQhuezu+OBjOWtmOWcqOOBmeOCi+OBn+OCgeOAgeW8t+WItueahOOBq+acgOWIneOBq+OCpOODs+OCueODiOODvOODq+OBmeOCi+OAglxuICBpZiAoY29uZmlnLnZlcnNpb25zVGV4dD8uaW5jbHVkZXMoJ3B5dGhvbiAnKSkge1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIlxcLi4rLXZlcnNpb25cIiBcImFzZGYgaW5zdGFsbCBweXRob25cImApO1xuICB9XG4gIGlmIChjb25maWcudmVyc2lvbnNUZXh0KSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiXFwuListdmVyc2lvblwiIFwiYXNkZiBpbnN0YWxsXCJgKTtcbiAgfVxuICBjb25zdCBpbnN0YWxsQ29tbWFuZCA9IGNvbmZpZy5pc0J1biA/ICdidW4gaW5zdGFsbCcgOiAneWFybic7XG4gIGNvbnN0IHJtTmV4dERpcmVjdG9yeSA9IGNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHwgY29uZmlnLmRlcGVuZGluZy5uZXh0ID8gJyAmJiBybSAtUmYgLm5leHQnIDogJyc7XG4gIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goYHJ1bl9pZl9jaGFuZ2VkIFwicGFja2FnZVxcXFwuanNvblwiIFwiJHtpbnN0YWxsQ29tbWFuZH0ke3JtTmV4dERpcmVjdG9yeX1cImApO1xuICBpZiAoY29uZmlnLmRvZXNDb250YWluc1BvZXRyeUxvY2spIHtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCJwb2V0cnlcXC5sb2NrXCIgXCJwb2V0cnkgaW5zdGFsbFwiYCk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHopIHtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFxuICAgICAgJ3J1bl9pZl9jaGFuZ2VkIFwiZGIvc2NoZW1hLnByaXNtYVwiIFwibm9kZSBub2RlX21vZHVsZXMvLmJpbi9ibGl0eiBwcmlzbWEgbWlncmF0ZSBkZXBsb3lcIicsXG4gICAgICAncnVuX2lmX2NoYW5nZWQgXCJkYi9zY2hlbWEucHJpc21hXCIgXCJub2RlIG5vZGVfbW9kdWxlcy8uYmluL2JsaXR6IHByaXNtYSBnZW5lcmF0ZVwiJyxcbiAgICAgICdydW5faWZfY2hhbmdlZCBcImRiL3NjaGVtYS5wcmlzbWFcIiBcIm5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vYmxpdHogY29kZWdlblwiJ1xuICAgICk7XG4gIH0gZWxzZSBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEpIHtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFxuICAgICAgJ3J1bl9pZl9jaGFuZ2VkIFwicHJpc21hL3NjaGVtYS5wcmlzbWFcIiBcIm5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vZG90ZW52IC1jIGRldmVsb3BtZW50IC0tIG5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vcHJpc21hIG1pZ3JhdGUgZGVwbG95XCInLFxuICAgICAgJ3J1bl9pZl9jaGFuZ2VkIFwicHJpc21hL3NjaGVtYS5wcmlzbWFcIiBcIm5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vZG90ZW52IC1jIGRldmVsb3BtZW50IC0tIG5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vcHJpc21hIGdlbmVyYXRlXCInXG4gICAgKTtcbiAgfVxuICByZXR1cm4gcG9zdE1lcmdlQ29tbWFuZHM7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmZ1bmN0aW9uIGNyZWF0ZVRhc2tPcHRpb25zKHJ1bm5lcjogc3RyaW5nLCBhcmdzOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgZXh0ZW5zaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCAgICA8VGFza09wdGlvbnMgaXNFbmFibGVkPVwidHJ1ZVwiPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiYXJndW1lbnRzXCIgdmFsdWU9XCIke2FyZ3N9ICRGaWxlUGF0aFJlbGF0aXZlVG9Qcm9qZWN0Um9vdCRcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiY2hlY2tTeW50YXhFcnJvcnNcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImRlc2NyaXB0aW9uXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImV4aXRDb2RlQmVoYXZpb3JcIiB2YWx1ZT1cIkVSUk9SXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImZpbGVFeHRlbnNpb25cIiB2YWx1ZT1cIiR7ZXh0ZW5zaW9ufVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJpbW1lZGlhdGVTeW5jXCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJuYW1lXCIgdmFsdWU9XCIke25hbWV9ICguJHtleHRlbnNpb259KVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJvdXRwdXRcIiB2YWx1ZT1cIiRGaWxlUGF0aFJlbGF0aXZlVG9Qcm9qZWN0Um9vdCRcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwib3V0cHV0RmlsdGVyc1wiPlxuICAgICAgICA8YXJyYXkgLz5cbiAgICAgIDwvb3B0aW9uPlxuICAgICAgPG9wdGlvbiBuYW1lPVwib3V0cHV0RnJvbVN0ZG91dFwiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwicHJvZ3JhbVwiIHZhbHVlPVwiJHtydW5uZXJ9XCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cInJ1bk9uRXh0ZXJuYWxDaGFuZ2VzXCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJzY29wZU5hbWVcIiB2YWx1ZT1cIlByb2plY3QgRmlsZXNcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwidHJhY2tPbmx5Um9vdFwiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwid29ya2luZ0RpclwiIHZhbHVlPVwiJFByb2plY3RGaWxlRGlyJFwiIC8+XG4gICAgICA8ZW52cyAvPlxuICAgIDwvVGFza09wdGlvbnM+XG5gO1xufVxuXG5jb25zdCBwcmV0dGllckNvbnRlbnQgPSBgPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG48cHJvamVjdCB2ZXJzaW9uPVwiNFwiPlxuICA8Y29tcG9uZW50IG5hbWU9XCJQcm9qZWN0VGFza3NPcHRpb25zXCI+XG4ke2V4dGVuc2lvbnMucHJldHRpZXIubWFwKChleHQpID0+IGNyZWF0ZVRhc2tPcHRpb25zKCdub2RlJywgJ25vZGVfbW9kdWxlcy8uYmluL3ByZXR0aWVyIC0tY2FjaGUgLS13cml0ZScsICdQcmV0dGllcicsIGV4dCkpLmpvaW4oJycpfVxuICA8L2NvbXBvbmVudD5cbjwvcHJvamVjdD5cbmA7XG5cbmNvbnN0IGJpb21lQ29udGVudCA9IGA8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cbjxwcm9qZWN0IHZlcnNpb249XCI0XCI+XG4gIDxjb21wb25lbnQgbmFtZT1cIlByb2plY3RUYXNrc09wdGlvbnNcIj5cbiR7ZXh0ZW5zaW9ucy5wcmV0dGllci5tYXAoKGV4dCkgPT4gY3JlYXRlVGFza09wdGlvbnMoJ2J1bicsICctLWJ1biBub2RlX21vZHVsZXMvLmJpbi9iaW9tZSBjaGVjayAtLWZpeCAtLW5vLWVycm9ycy1vbi11bm1hdGNoZWQgLS1za2lwLWVycm9ycycsICdCaW9tZScsIGV4dCkpLmpvaW4oJycpfVxuICA8L2NvbXBvbmVudD5cbjwvcHJvamVjdD5cbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUlkZWFTZXR0aW5ncyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUlkZWFTZXR0aW5ncycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmlkZWEnKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhkaXJQYXRoKSkge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3dhdGNoZXJUYXNrcy54bWwnKTtcbiAgICAgIGF3YWl0IChjb25maWcuZG9lc0NvbnRhaW5zSmF2YVNjcmlwdCB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluc0phdmFTY3JpcHRJblBhY2thZ2VzIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdCB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHRJblBhY2thZ2VzIHx8XG4gICAgICAoY29uZmlnLmRvZXNDb250YWluc1BhY2thZ2VKc29uICYmXG4gICAgICAgICFjb25maWcuZG9lc0NvbnRhaW5zUHVic3BlY1lhbWwgJiZcbiAgICAgICAgIWNvbmZpZy5kb2VzQ29udGFpbnNHZW1maWxlICYmXG4gICAgICAgICFjb25maWcuZG9lc0NvbnRhaW5zR29Nb2QgJiZcbiAgICAgICAgIWNvbmZpZy5kb2VzQ29udGFpbnNQb21YbWwpXG4gICAgICAgID8gcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGNvbmZpZy5pc0J1biA/IGJpb21lQ29udGVudCA6IHByZXR0aWVyQ29udGVudCkpXG4gICAgICAgIDogcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKSk7XG4gICAgfVxuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW1wb3J0IHsgZ2VuZXJhdGVQb3N0TWVyZ2VDb21tYW5kcyB9IGZyb20gJy4vaHVza3lyYy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVNjcmlwdHMgfSBmcm9tICcuL3BhY2thZ2VKc29uLmpzJztcblxuY29uc3QgbmV3U2V0dGluZ3MgPSB7XG4gICdwb3N0LW1lcmdlJzoge1xuICAgIHNjcmlwdHM6IHtcbiAgICAgICdwcmVwYXJlLnNoJzoge1xuICAgICAgICBydW5uZXI6ICdiYXNoJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ3ByZS1jb21taXQnOiB7XG4gICAgY29tbWFuZHM6IHtcbiAgICAgIGNsZWFudXA6IHtcbiAgICAgICAgZ2xvYjogJyoue2Nqcyxjc3MsY3RzLGh0bSxodG1sLGpzLGpzb24sanNvbjUsanNvbmMsanN4LG1kLG1qcyxtdHMsc2Nzcyx0cyx0c3gsdnVlLHlhbWwseW1sfScsXG4gICAgICAgIHJ1bjogJ2J1biAtLWJ1biB3YiBsaW50IC0tZml4IC0tZm9ybWF0IHtzdGFnZWRfZmlsZXN9ICYmIGdpdCBhZGQge3N0YWdlZF9maWxlc30nLFxuICAgICAgfSxcbiAgICAgICdjaGVjay1taWdyYXRpb25zJzoge1xuICAgICAgICBnbG9iOiAnKiovbWlncmF0aW9uLnNxbCcsXG4gICAgICAgIHJ1bjogYFxuaWYgZ3JlcCAtcSAnV2FybmluZ3M6JyB7c3RhZ2VkX2ZpbGVzfTsgdGhlblxuICBlY2hvIFwiTWlncmF0aW9uIFNRTCBmaWxlcyAoe3N0YWdlZF9maWxlc30pIGNvbnRhaW4gd2FybmluZ3MhIFBsZWFzZSBzb2x2ZSB0aGUgd2FybmluZ3MgYW5kIGNvbW1pdCBhZ2Fpbi5cIlxuICBleGl0IDFcbmZpXG5gLnRyaW0oKSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ3ByZS1wdXNoJzoge1xuICAgIHNjcmlwdHM6IHtcbiAgICAgICdjaGVjay5zaCc6IHtcbiAgICAgICAgcnVubmVyOiAnYmFzaCcsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG59O1xuXG5jb25zdCBzY3JpcHRzID0ge1xuICBwcmVQdXNoOiBgYnVuIC0tYnVuIG5vZGVfbW9kdWxlcy8uYmluL3diIHR5cGVjaGVja2AsXG4gIHByZVB1c2hGb3JMYWI6IGBcbiMhL2Jpbi9iYXNoXG5cbmlmIFsgJChnaXQgYnJhbmNoIC0tc2hvdy1jdXJyZW50KSA9IFwibWFpblwiIF0gJiYgWyAkKGdpdCBjb25maWcgdXNlci5lbWFpbCkgIT0gXCJleGthenV1QGdtYWlsLmNvbVwiIF07IHRoZW5cbiAgZWNobyBcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiXG4gIGVjaG8gXCIqKiogRG9uJ3QgcHVzaCBtYWluIGJyYW5jaCBkaXJlY3RseS4gVXNlIFBSISAqKipcIlxuICBlY2hvIFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCJcbiAgZXhpdCAxXG5maVxuXG5idW4gLS1idW4gbm9kZV9tb2R1bGVzLy5iaW4vd2IgdHlwZWNoZWNrXG5gLnRyaW0oKSxcbiAgcG9zdE1lcmdlOiBgXG4jIS9iaW4vYmFzaFxuXG5jaGFuZ2VkX2ZpbGVzPVwiJChnaXQgZGlmZi10cmVlIC1yIC0tbmFtZS1vbmx5IC0tbm8tY29tbWl0LWlkIE9SSUdfSEVBRCBIRUFEKVwiXG5cbnJ1bl9pZl9jaGFuZ2VkKCkge1xuICBpZiBlY2hvIFwiJGNoYW5nZWRfZmlsZXNcIiB8IGdyZXAgLS1xdWlldCAtRSBcIiQxXCI7IHRoZW5cbiAgICBldmFsIFwiJDJcIlxuICBmaVxufVxuYC50cmltKCksXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVMZWZ0aG9va1VwZGF0aW5nUGFja2FnZUpzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVMZWZ0aG9va1VwZGF0aW5nUGFja2FnZUpzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgY29yZShjb25maWcpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5sZWZ0aG9vaycpO1xuICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgZnMucHJvbWlzZXMud3JpdGVGaWxlKFxuICAgICAgcGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAnbGVmdGhvb2sueW1sJyksXG4gICAgICB5YW1sLmR1bXAobmV3U2V0dGluZ3MsIHtcbiAgICAgICAgbGluZVdpZHRoOiAtMSxcbiAgICAgICAgbm9Db21wYXRNb2RlOiB0cnVlLFxuICAgICAgICBzdHlsZXM6IHtcbiAgICAgICAgICAnISFudWxsJzogJ2VtcHR5JyxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgKSxcbiAgICBmcy5wcm9taXNlcy5ybShkaXJQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSksXG4gIF0pO1xuXG4gIGNvbnN0IHsgdHlwZWNoZWNrIH0gPSBnZW5lcmF0ZVNjcmlwdHMoY29uZmlnKTtcbiAgaWYgKHR5cGVjaGVjaykge1xuICAgIGNvbnN0IHByZVB1c2ggPSBjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyTGFiLycpID8gc2NyaXB0cy5wcmVQdXNoRm9yTGFiIDogc2NyaXB0cy5wcmVQdXNoO1xuICAgIGZzLm1rZGlyU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ3ByZS1wdXNoJyksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGguam9pbihkaXJQYXRoLCAncHJlLXB1c2gnLCAnY2hlY2suc2gnKSwgcHJlUHVzaCArICdcXG4nLCB7XG4gICAgICAgIG1vZGU6IDBvNzU1LFxuICAgICAgfSlcbiAgICApO1xuICB9XG4gIGNvbnN0IHBvc3RNZXJnZUNvbW1hbmQgPSBgJHtzY3JpcHRzLnBvc3RNZXJnZX1cXG5cXG4ke2dlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMoY29uZmlnKS5qb2luKCdcXG4nKX1cXG5gO1xuICBmcy5ta2RpclN5bmMocGF0aC5qb2luKGRpclBhdGgsICdwb3N0LW1lcmdlJyksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwb3N0LW1lcmdlJywgJ3ByZXBhcmUuc2gnKSwgcG9zdE1lcmdlQ29tbWFuZCwge1xuICAgICAgbW9kZTogMG83NTUsXG4gICAgfSlcbiAgKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IEVzbGludFV0aWwgfSBmcm9tICcuLi91dGlscy9lc2xpbnRVdGlsLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IGdldFNyY0RpcnMgfSBmcm9tICcuLi91dGlscy9zcmNEaXJlY3Rvcmllcy5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUxpbnRzdGFnZWRyYyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUxpbnRzdGFnZWRyYycsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBjb3JlKGNvbmZpZyk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5saW50c3RhZ2VkcmMuY2pzJyk7XG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHBhY2thZ2VQcmVmaXggPSBjb25maWcuaXNSb290ID8gJ25vZGUgbm9kZV9tb2R1bGVzLy5iaW4vJyA6ICdub2RlIC4uLy4uL25vZGVfbW9kdWxlcy8uYmluLyc7XG4gIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuICBpZiAoY29uZmlnLmRvZXNDb250YWluc0phdmFTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHQpIHtcbiAgICBjb25zdCBlc2xpbnQgPSBgXG4gICcke2dldEVzbGludEtleShjb25maWcpfSc6IFske0pTT04uc3RyaW5naWZ5KFxuICAgIGAke3BhY2thZ2VQcmVmaXh9ZXNsaW50IC0tZml4JHtFc2xpbnRVdGlsLmdldExpbnRGaXhTdWZmaXgoY29uZmlnKX1gXG4gICl9LCAnJHtwYWNrYWdlUHJlZml4fXByZXR0aWVyIC0tY2FjaGUgLS13cml0ZSddLGA7XG4gICAgbGluZXMucHVzaChlc2xpbnQpO1xuICB9XG4gIGNvbnN0IHBhY2thZ2VzRmlsdGVyID0gY29uZmlnLmlzUm9vdCA/IFwiICYmICFmaWxlLmluY2x1ZGVzKCcvcGFja2FnZXMvJylcIiA6ICcnO1xuICBsaW5lcy5wdXNoKGBcbiAgJy4vKiovKi57JHtleHRlbnNpb25zLnByZXR0aWVyLmpvaW4oJywnKX19JzogZmlsZXMgPT4ge1xuICAgIGxldCBmaWx0ZXJlZEZpbGVzID0gZmlsZXMuZmlsdGVyKGZpbGUgPT4gIWZpbGUuaW5jbHVkZXMoJy90ZXN0LWZpeHR1cmVzLycpJHtwYWNrYWdlc0ZpbHRlcn0pOyR7Z2V0RXNsaW50RmlsdGVyRm9yUHJldHRpZXIoY29uZmlnKX1cbiAgICBpZiAoZmlsdGVyZWRGaWxlcy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcbiAgICBjb25zdCBjb21tYW5kcyA9IFtcXGAke3BhY2thZ2VQcmVmaXh9cHJldHRpZXIgLS1jYWNoZSAtLXdyaXRlIFxcJHtmaWx0ZXJlZEZpbGVzLmpvaW4oJyAnKX1cXGBdO1xuICAgIGlmIChmaWx0ZXJlZEZpbGVzLnNvbWUoZmlsZSA9PiBmaWxlLmVuZHNXaXRoKCdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICAgIGNvbW1hbmRzLnB1c2goJyR7cGFja2FnZVByZWZpeH1zb3J0LXBhY2thZ2UtanNvbicpO1xuICAgIH1cbiAgICByZXR1cm4gY29tbWFuZHM7XG4gIH0sXG4gICcuLyoqL21pZ3JhdGlvbi5zcWwnOiAoZmlsZXMpID0+IHtcbiAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmaWxlLCAndXRmLTgnKTtcbiAgICBpZiAoY29udGVudC5pbmNsdWRlcygnV2FybmluZ3M6JykpIHtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIFxcYCEhISBNaWdyYXRpb24gU1FMIGZpbGUgKFxcJHtwYXRoLnJlbGF0aXZlKCcnLCBmaWxlKX0pIGNvbnRhaW5zIHdhcm5pbmdzICEhISBTb2x2ZSB0aGUgd2FybmluZ3MgYW5kIGNvbW1pdCBhZ2Fpbi5cXGAsXG4gICAgICBdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gW107XG59LGApO1xuICBpZiAoY29uZmlnLmRvZXNDb250YWluc1B1YnNwZWNZYW1sKSB7XG4gICAgbGluZXMucHVzaChgXG4gICcuL3tsaWIsdGVzdCx0ZXN0X2RyaXZlcn0vKiovKi5kYXJ0JzogZmlsZXMgPT4ge1xuICAgIGNvbnN0IGZpbHRlcmVkRmlsZXMgPSBmaWxlcy5maWx0ZXIoZmlsZSA9PiAhZmlsZS5pbmNsdWRlcygnZ2VuZXJhdGVkJykpXG4gICAgICAuZmlsdGVyKGZpbGUgPT4gIWZpbGUuZW5kc1dpdGgoJy5mcmVlemVkLmRhcnQnKSAmJiAhZmlsZS5lbmRzV2l0aCgnLmcuZGFydCcpKTtcbiAgICBpZiAoZmlsdGVyZWRGaWxlcy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcbiAgICByZXR1cm4gW1xcYGZsdXR0ZXIgZm9ybWF0IFxcJHtmaWx0ZXJlZEZpbGVzLmpvaW4oJyAnKX1cXGBdO1xuICB9LGApO1xuICB9XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5zUG9ldHJ5TG9jaykge1xuICAgIGxpbmVzLnB1c2goYFxuICAnLi8qKi8qLnB5JzogW1xuICAgICdwb2V0cnkgcnVuIGlzb3J0IC0tcHJvZmlsZSBibGFjayAtLWZpbHRlci1maWxlcycsXG4gICAgJ3BvZXRyeSBydW4gYmxhY2snLFxuICAgICdwb2V0cnkgcnVuIGZsYWtlOCdcbiAgXSxgKTtcbiAgfVxuXG4gIGNvbnN0IG5ld0NvbnRlbnQgPSBgY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcbiR7Y29uZmlnLmRvZXNDb250YWluc0phdmFTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHQgPyBcImNvbnN0IG1pY3JvbWF0Y2ggPSByZXF1aXJlKCdtaWNyb21hdGNoJyk7XFxuXCIgOiAnJ31cbm1vZHVsZS5leHBvcnRzID0geyR7bGluZXMuam9pbignJyl9XG59O1xuYDtcblxuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmxpbnRzdGFnZWRyYy5qcycpLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5saW50c3RhZ2VkcmMuanNvbicpLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbn1cblxuZnVuY3Rpb24gZ2V0RXNsaW50S2V5KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIGNvbnN0IGRpcnMgPSBnZXRTcmNEaXJzKGNvbmZpZyk7XG4gIHJldHVybiBgLi97JHtkaXJzLmpvaW4oJywnKX19LyoqLyoueyR7ZXh0ZW5zaW9ucy5lc2xpbnQuam9pbignLCcpfX1gO1xufVxuXG5mdW5jdGlvbiBnZXRFc2xpbnRGaWx0ZXJGb3JQcmV0dGllcihjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICByZXR1cm4gY29uZmlnLmRvZXNDb250YWluc0phdmFTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHRcbiAgICA/IGBcXG5cbiAgICBmaWx0ZXJlZEZpbGVzID0gZmlsdGVyZWRGaWxlcy5tYXAoKGZpbGUpID0+IHBhdGgucmVsYXRpdmUoJycsIGZpbGUpKTtcbiAgICBmaWx0ZXJlZEZpbGVzID0gbWljcm9tYXRjaC5ub3QoZmlsdGVyZWRGaWxlcywgJyR7Z2V0RXNsaW50S2V5KGNvbmZpZyl9Jyk7XG4gICAgZmlsdGVyZWRGaWxlcyA9IGZpbHRlcmVkRmlsZXMubWFwKChmaWxlKSA9PiBwYXRoLnJlc29sdmUoZmlsZSkpO2BcbiAgICA6ICcnO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVOZXh0Q29uZmlnSnNvbihjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZU5leHRDb25maWdKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gWydqcycsICdtanMnLCAnY2pzJ11cbiAgICAgIC5tYXAoKGV4dCkgPT4gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBgbmV4dC5jb25maWcuJHtleHR9YCkpXG4gICAgICAuZmluZCgocCkgPT4gZnMuZXhpc3RzU3luYyhwKSk7XG4gICAgaWYgKCFmaWxlUGF0aCkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgIC8vIFJlcGxhY2UgdGhlIEpTT04gb2JqZWN0IGZyb20gdGhlIGZpbGVcbiAgICBjb25zdCBuZXdDb250ZW50ID0gb2xkQ29udGVudC5yZXBsYWNlKC89XFxzKnsoW1xcU1xcc10qKX07LywgKF8sIHNldHRpbmdzVGV4dCkgPT4ge1xuICAgICAgaWYgKCFzZXR0aW5nc1RleHQuaW5jbHVkZXMoJ2VzbGludDonKSkge1xuICAgICAgICBzZXR0aW5nc1RleHQgKz0gJ2VzbGludDogeyBpZ25vcmVEdXJpbmdCdWlsZHM6IHRydWUgfSwnO1xuICAgICAgfVxuICAgICAgaWYgKCFzZXR0aW5nc1RleHQuaW5jbHVkZXMoJ3R5cGVzY3JpcHQ6JykpIHtcbiAgICAgICAgc2V0dGluZ3NUZXh0ICs9ICd0eXBlc2NyaXB0OiB7IGlnbm9yZUJ1aWxkRXJyb3JzOiB0cnVlIH0sJztcbiAgICAgIH1cbiAgICAgIHJldHVybiBgPSB7JHtzZXR0aW5nc1RleHR9fTtgO1xuICAgIH0pO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGNvbW1vbkNvbnRlbnQgPSBgXG4zcmQtcGFydHkvXG5hbmRyb2lkL1xuaW9zL1xubm8tZm9ybWF0L1xudGVzdC1maXh0dXJlcy9cbiouZC50c1xuKi5taW4uanNcbi55YXJuL1xuLnBucC5qc1xuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUHJldHRpZXJpZ25vcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVQcmV0dGllcmlnbm9yZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5wcmV0dGllcmlnbm9yZScpO1xuICAgIGNvbnN0IGNvbnRlbnQgPSAoYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihmaWxlUGF0aCkpID8/ICcnO1xuICAgIGNvbnN0IGhlYWRVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldEhlYWRVc2VyQ29udGVudChjb250ZW50KTtcbiAgICBjb25zdCB0YWlsVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRUYWlsVXNlckNvbnRlbnQoY29udGVudCk7XG5cbiAgICBjb25zdCBnaXRpZ25vcmVGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRpZ25vcmUnKTtcbiAgICBjb25zdCBnaXRpZ25vcmVDb250ZW50ID0gKGF3YWl0IGlnbm9yZUZpbGVVdGlsLnJlYWRHaXRpZ25vcmVXaXRob3V0U2VwYXJhdG9ycyhnaXRpZ25vcmVGaWxlUGF0aCkpIHx8ICcnO1xuXG4gICAgbGV0IGFkZGl0aW9uYWxDb250ZW50ID0gJyc7XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNQdWJzcGVjWWFtbCkge1xuICAgICAgYWRkaXRpb25hbENvbnRlbnQgPSBgXG5hbmRyb2lkL2FwcC9cbmlvcy9SdW5uZXIvQXNzZXRzLnhjYXNzZXRzL1xucHVic3BlYy55YW1sXG5gO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBoZWFkVXNlckNvbnRlbnQgKyBjb21tb25Db250ZW50ICsgYWRkaXRpb25hbENvbnRlbnQgKyBnaXRpZ25vcmVDb250ZW50ICsgdGFpbFVzZXJDb250ZW50O1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgY2xvbmVEZWVwIGZyb20gJ2xvZGFzaC5jbG9uZWRlZXAnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgb3ZlcndyaXRlTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGpzb25PYmogPSB7XG4gIHZlbnZQYXRoOiAnLicsXG4gIHZlbnY6ICcudmVudicsXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbihjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVB5cmlnaHRDb25maWdKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGxldCBuZXdTZXR0aW5nczogdW5rbm93biA9IGNsb25lRGVlcChqc29uT2JqKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3B5cmlnaHRjb25maWcuanNvbicpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBvbGRTZXR0aW5ncyA9IEpTT04ucGFyc2Uob2xkQ29udGVudCk7XG4gICAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShuZXdTZXR0aW5ncyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IHNlbWFudGljUmVsZWFzZUJhZGdlID1cbiAgJ1shW3NlbWFudGljLXJlbGVhc2VdKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vYmFkZ2UvJTIwJTIwJUYwJTlGJTkzJUE2JUYwJTlGJTlBJTgwLXNlbWFudGljLS1yZWxlYXNlLWUxMDA3OS5zdmcpXShodHRwczovL2dpdGh1Yi5jb20vc2VtYW50aWMtcmVsZWFzZS9zZW1hbnRpYy1yZWxlYXNlKSc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVJlYWRtZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVJlYWRtZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ1JFQURNRS5tZCcpO1xuICAgIGxldCBuZXdDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG5cbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcucmVsZWFzZXJjLmpzb24nKSkpIHtcbiAgICAgIG5ld0NvbnRlbnQgPSBpbnNlcnRCYWRnZShuZXdDb250ZW50LCBzZW1hbnRpY1JlbGVhc2VCYWRnZSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVwb3NpdG9yeSA9IGNvbmZpZy5yZXBvc2l0b3J5Py5zbGljZShjb25maWcucmVwb3NpdG9yeT8uaW5kZXhPZignOicpICsgMSk7XG4gICAgY29uc3QgZmlsZU5hbWVzID0gZnMucmVhZGRpclN5bmMoYCR7Y29uZmlnLmRpclBhdGh9Ly5naXRodWIvd29ya2Zsb3dzYCk7XG4gICAgZm9yIChjb25zdCBmaWxlTmFtZSBvZiBmaWxlTmFtZXMpIHtcbiAgICAgIGlmICghZmlsZU5hbWUuc3RhcnRzV2l0aCgndGVzdCcpICYmICFmaWxlTmFtZS5zdGFydHNXaXRoKCdkZXBsb3knKSkgY29udGludWU7XG5cbiAgICAgIGxldCBiYWRnZU5hbWUgPSBmaWxlTmFtZTtcbiAgICAgIGJhZGdlTmFtZSA9IGJhZGdlTmFtZVswXS50b1VwcGVyQ2FzZSgpICsgYmFkZ2VOYW1lLnNsaWNlKDEsIGJhZGdlTmFtZS5pbmRleE9mKCcuJykpO1xuICAgICAgYmFkZ2VOYW1lID0gYmFkZ2VOYW1lLnJlcGxhY2UoJy0nLCAnICcpO1xuICAgICAgY29uc3QgYmFkZ2UgPSBgWyFbJHtiYWRnZU5hbWV9XShodHRwczovL2dpdGh1Yi5jb20vJHtyZXBvc2l0b3J5fS9hY3Rpb25zL3dvcmtmbG93cy8ke2ZpbGVOYW1lfS9iYWRnZS5zdmcpXShodHRwczovL2dpdGh1Yi5jb20vJHtyZXBvc2l0b3J5fS9hY3Rpb25zL3dvcmtmbG93cy8ke2ZpbGVOYW1lfSlgO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBgLmdpdGh1Yi93b3JrZmxvd3MvJHtmaWxlTmFtZX1gKSkpIHtcbiAgICAgICAgbmV3Q29udGVudCA9IGluc2VydEJhZGdlKG5ld0NvbnRlbnQsIGJhZGdlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluc2VydEJhZGdlKHJlYWRtZTogc3RyaW5nLCBiYWRnZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8g5pei44GrYmFkZ2XjgYzjgYLjgovloLTlkIjjga/liYrpmaRcbiAgcmVhZG1lID0gcmVhZG1lLnJlcGxhY2UoYmFkZ2UsICcnKS5yZXBsYWNlQWxsKC9cXG5cXG5cXG4rL2csICdcXG5cXG4nKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHJlYWRtZS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChyZWFkbWVbaSAtIDFdID09PSAnXFxuJyAmJiByZWFkbWVbaV0gPT09ICdcXG4nKSB7XG4gICAgICBjb25zdCBiZWZvcmUgPSByZWFkbWUuc2xpY2UoMCwgaSArIDEpO1xuICAgICAgbGV0IGFmdGVyID0gcmVhZG1lLnNsaWNlKGkgKyAxKTtcbiAgICAgIGlmICghYWZ0ZXIuc3RhcnRzV2l0aCgnWycpICYmICFhZnRlci5zdGFydHNXaXRoKCchJykpIHtcbiAgICAgICAgYWZ0ZXIgPSBgXFxuJHthZnRlcn1gO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGAke2JlZm9yZX0ke2JhZGdlfVxcbiR7YWZ0ZXJ9YDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGAke3JlYWRtZX1cXG4ke2JhZGdlfVxcbmA7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZWxlYXNlcmMocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUmVsZWFzZXJjJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5yZWxlYXNlcmMuanNvbicpO1xuICAgIGNvbnN0IHNldHRpbmdzID0gSlNPTi5wYXJzZShhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKSk7XG4gICAgY29uc3QgcGx1Z2lucyA9IHNldHRpbmdzPy5wbHVnaW5zIHx8IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGx1Z2lucy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgcGx1Z2luID0gQXJyYXkuaXNBcnJheShwbHVnaW5zW2ldKSA/IHBsdWdpbnNbaV1bMF0gOiBwbHVnaW5zW2ldO1xuICAgICAgY29uc3Qgb2xkQ29uZmlnID0gKEFycmF5LmlzQXJyYXkocGx1Z2luc1tpXSkgJiYgcGx1Z2luc1tpXVsxXSkgfHwge307XG4gICAgICBpZiAocGx1Z2luID09PSAnQHNlbWFudGljLXJlbGVhc2UvY29tbWl0LWFuYWx5emVyJykge1xuICAgICAgICBwbHVnaW5zW2ldID0gW1xuICAgICAgICAgICdAc2VtYW50aWMtcmVsZWFzZS9jb21taXQtYW5hbHl6ZXInLFxuICAgICAgICAgIG1lcmdlLmFsbChcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgb2xkQ29uZmlnLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcHJlc2V0OiAnY29udmVudGlvbmFsY29tbWl0cycsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgeyBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSB9XG4gICAgICAgICAgKSxcbiAgICAgICAgXTtcbiAgICAgIH0gZWxzZSBpZiAocGx1Z2luID09PSAnQHNlbWFudGljLXJlbGVhc2UvZ2l0aHViJykge1xuICAgICAgICBwbHVnaW5zW2ldID0gW1xuICAgICAgICAgICdAc2VtYW50aWMtcmVsZWFzZS9naXRodWInLFxuICAgICAgICAgIG1lcmdlLmFsbChcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgb2xkQ29uZmlnLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLy8gY2YuIGh0dHBzOi8vZ2l0aHViLmNvbS9zZW1hbnRpYy1yZWxlYXNlL3NlbWFudGljLXJlbGVhc2UvaXNzdWVzLzIyMDQjaXNzdWVjb21tZW50LTE1MDg0MTc3MDRcbiAgICAgICAgICAgICAgICBzdWNjZXNzQ29tbWVudDogZmFsc2UsXG4gICAgICAgICAgICAgICAgZmFpbENvbW1lbnQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGxhYmVsczogWydyOiBzZW1hbnRpYy1yZWxlYXNlJ10sXG4gICAgICAgICAgICAgICAgcmVsZWFzZWRMYWJlbHM6IFsncmVsZWFzZWQgOmJvb2ttYXJrOiddLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfVxuICAgICAgICAgICksXG4gICAgICAgIF07XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShzZXR0aW5ncyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCBjbG9uZURlZXAgZnJvbSAnbG9kYXNoLmNsb25lZGVlcCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QganNvbk9iaiA9IHtcbiAgJHNjaGVtYTogJ2h0dHBzOi8vZG9jcy5yZW5vdmF0ZWJvdC5jb20vcmVub3ZhdGUtc2NoZW1hLmpzb24nLFxuICBleHRlbmRzOiBbJ2dpdGh1Yj5XaWxsQm9vc3Rlci93aWxsYm9vc3Rlci1jb25maWdzOnJlbm92YXRlLmpzb241J10sXG59O1xuXG50eXBlIFNldHRpbmdzID0gdHlwZW9mIGpzb25PYmogJiB7IHBhY2thZ2VSdWxlczogeyBwYWNrYWdlTmFtZXM6IHN0cmluZ1tdOyBlbmFibGVkPzogYm9vbGVhbiB9W10gfTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUmVub3ZhdGVKc29uKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUmVub3ZhdGVKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGxldCBuZXdTZXR0aW5ncyA9IGNsb25lRGVlcChqc29uT2JqKSBhcyBTZXR0aW5ncztcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3Jlbm92YXRlLmpzb24nKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhgJHtmaWxlUGF0aH01YCkpIHtcbiAgICAgIC8vIFNpbmNlIGl0IGlzIGRpZmZpY3VsdCBmb3IgcGFyc2luZyByZW5vdmF0ZS5qc29uNSwgd2UgZG8gbm90aGluZ1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3Qgb2xkU2V0dGluZ3MgPSBKU09OLnBhcnNlKG9sZENvbnRlbnQpO1xuICAgICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7XG4gICAgICAgIGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlLFxuICAgICAgfSkgYXMgU2V0dGluZ3M7XG4gICAgICBuZXdTZXR0aW5ncy5leHRlbmRzID0gbmV3U2V0dGluZ3MuZXh0ZW5kcy5maWx0ZXIoKGl0ZW06IHN0cmluZykgPT4gaXRlbSAhPT0gJ0B3aWxsYm9vc3RlcicpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cblxuICAgIC8vIERvbid0IHVwZ3JhZGUgTmV4dC5qcyBhdXRvbWF0aWNhbGx5XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHopIHtcbiAgICAgIG5ld1NldHRpbmdzLnBhY2thZ2VSdWxlcyA/Pz0gW107XG4gICAgICBpZiAoIW5ld1NldHRpbmdzLnBhY2thZ2VSdWxlcy5zb21lKChydWxlOiB7IHBhY2thZ2VOYW1lczogc3RyaW5nW10gfSkgPT4gcnVsZS5wYWNrYWdlTmFtZXMuaW5jbHVkZXMoJ25leHQnKSkpIHtcbiAgICAgICAgbmV3U2V0dGluZ3MucGFja2FnZVJ1bGVzLnB1c2goeyBwYWNrYWdlTmFtZXM6IFsnbmV4dCddLCBlbmFibGVkOiBmYWxzZSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmRlcGVuZGFib3QnKSwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5yZW5vdmF0ZXJjLmpzb24nKSwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KG5ld1NldHRpbmdzKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBtb3ZlVG9Cb3R0b208VE9iaiBleHRlbmRzIFJlY29yZDxUS2V5LCB1bmtub3duPiwgVEtleSBleHRlbmRzIHN0cmluZyB8IG51bWJlciB8IHN5bWJvbD4oXG4gIG9iajogVE9iaixcbiAga2V5OiBUS2V5XG4pOiBUT2JqIHtcbiAgY29uc3QgdmFsdWUgPSBvYmpba2V5XTtcbiAgZGVsZXRlIG9ialtrZXldO1xuICAob2JqIGFzIFJlY29yZDxUS2V5LCB1bmtub3duPilba2V5XSA9IHZhbHVlO1xuICByZXR1cm4gb2JqO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc29ydEtleXM8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PihvYmo6IFQpOiBUIHtcbiAgY29uc3Qga2V5QW5kVmFsdWVzID0gT2JqZWN0LmVudHJpZXMob2JqKS5zb3J0KChba2V5MV0sIFtrZXkyXSkgPT4ga2V5MS5sb2NhbGVDb21wYXJlKGtleTIpKTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2Yga2V5QW5kVmFsdWVzKSB7XG4gICAgZGVsZXRlIG9ialtrZXldO1xuICAgIChvYmogYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0gPSB2YWx1ZTtcblxuICAgIC8vIGlmIHZhbHVlIGlzIGFuIG9iamVjdCwgc29ydCB0aGUga2V5cyBvZiB0aGUgb2JqZWN0XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgIHNvcnRLZXlzKHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG9iajtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IGNsb25lRGVlcCBmcm9tICdsb2Rhc2guY2xvbmVkZWVwJztcbmltcG9ydCB0eXBlIHsgVHNDb25maWdKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGNvbWJpbmVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBzb3J0S2V5cyB9IGZyb20gJy4uL3V0aWxzL29iamVjdFV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IHJvb3RKc29uT2JqID0ge1xuICBjb21waWxlck9wdGlvbnM6IHtcbiAgICB0YXJnZXQ6ICdFUzIwMjInLCAvLyBiZWNhdXNlIGRlY29yYXRvcnMgc2hvdWxkIGJlIHRyYW5zcGlsZWQgdG8gRVMyMDIyIG9uIE5vZGUuanNcbiAgICBtb2R1bGU6ICdFU05leHQnLFxuICAgIG1vZHVsZVJlc29sdXRpb246ICdOb2RlJyxcbiAgICBqc3g6ICdyZWFjdC1qc3gnLFxuICAgIGFsd2F5c1N0cmljdDogdHJ1ZSxcbiAgICBzdHJpY3Q6IHRydWUsXG4gICAgc2tpcExpYkNoZWNrOiB0cnVlLCAvLyBiZWNhdXNlIGxpYnJhcmllcyBtYXkgaGF2ZSBicm9rZW4gdHlwZXNcbiAgICBhbGxvd1N5bnRoZXRpY0RlZmF1bHRJbXBvcnRzOiB0cnVlLCAvLyBhbGxvdyBgaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J2BcbiAgICBlc01vZHVsZUludGVyb3A6IHRydWUsIC8vIGFsbG93IGRlZmF1bHQgaW1wb3J0IGZyb20gQ29tbW9uSlMvQU1EL1VNRCBtb2R1bGVzXG4gICAgcmVzb2x2ZUpzb25Nb2R1bGU6IHRydWUsIC8vIGFsbG93IHRvIGltcG9ydCBKU09OIGZpbGVzXG4gICAgZGVjbGFyYXRpb246IHRydWUsXG4gICAgc291cmNlTWFwOiB0cnVlLFxuICAgIGltcG9ydEhlbHBlcnM6IGZhbHNlLFxuICAgIG91dERpcjogJ2Rpc3QnLFxuICAgIHR5cGVSb290czogWycuL25vZGVfbW9kdWxlcy9AdHlwZXMnLCAnLi9AdHlwZXMnXSxcbiAgfSxcbiAgaW5jbHVkZTogW1xuICAgICdzcmMvKiovKicsXG4gICAgJ3Rlc3RzLyoqLyonLFxuICAgICdzY3JpcHRzLyoqLyonLFxuICAgICdwYWNrYWdlcy8qL3NyYy8qKi8qJyxcbiAgICAncGFja2FnZXMvKi90ZXN0cy8qKi8qJyxcbiAgICAncGFja2FnZXMvKi9zY3JpcHRzLyoqLyonLFxuICBdLFxufTtcblxuY29uc3Qgc3ViSnNvbk9iaiA9IHtcbiAgY29tcGlsZXJPcHRpb25zOiB7XG4gICAgdGFyZ2V0OiAnRVMyMDIyJywgLy8gYmVjYXVzZSBkZWNvcmF0b3JzIHNob3VsZCBiZSB0cmFuc3BpbGVkIHRvIEVTMjAyMiBvbiBOb2RlLmpzXG4gICAgbW9kdWxlOiAnRVNOZXh0JyxcbiAgICBtb2R1bGVSZXNvbHV0aW9uOiAnTm9kZScsXG4gICAganN4OiAncmVhY3QtanN4JyxcbiAgICBhbHdheXNTdHJpY3Q6IHRydWUsXG4gICAgc3RyaWN0OiB0cnVlLFxuICAgIHNraXBMaWJDaGVjazogdHJ1ZSwgLy8gYmVjYXVzZSBsaWJyYXJpZXMgbWF5IGhhdmUgYnJva2VuIHR5cGVzXG4gICAgYWxsb3dTeW50aGV0aWNEZWZhdWx0SW1wb3J0czogdHJ1ZSwgLy8gYWxsb3cgYGltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdgXG4gICAgZXNNb2R1bGVJbnRlcm9wOiB0cnVlLCAvLyBhbGxvdyBkZWZhdWx0IGltcG9ydCBmcm9tIENvbW1vbkpTL0FNRC9VTUQgbW9kdWxlc1xuICAgIHJlc29sdmVKc29uTW9kdWxlOiB0cnVlLCAvLyBhbGxvdyB0byBpbXBvcnQgSlNPTiBmaWxlc1xuICAgIGRlY2xhcmF0aW9uOiB0cnVlLFxuICAgIHNvdXJjZU1hcDogdHJ1ZSxcbiAgICBpbXBvcnRIZWxwZXJzOiBmYWxzZSxcbiAgICBvdXREaXI6ICdkaXN0JyxcbiAgICB0eXBlUm9vdHM6IFsnLi4vLi4vbm9kZV9tb2R1bGVzL0B0eXBlcycsICcuLi8uLi9AdHlwZXMnLCAnLi9AdHlwZXMnXSxcbiAgfSxcbiAgaW5jbHVkZTogWydzcmMvKiovKicsICd0ZXN0cy8qKi8qJywgJ3NjcmlwdHMvKiovKiddLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlVHNjb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVUc2NvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eiB8fCBjb25maWcuZGVwZW5kaW5nLm5leHQpIHJldHVybjtcblxuICAgIGxldCBuZXdTZXR0aW5ncyA9IGNsb25lRGVlcChjb25maWcuaXNSb290ID8gcm9vdEpzb25PYmogOiBzdWJKc29uT2JqKSBhcyBUc0NvbmZpZ0pzb247XG4gICAgaWYgKCFjb25maWcuZG9lc0NvbnRhaW5zSnN4T3JUc3ggJiYgIWNvbmZpZy5kb2VzQ29udGFpbnNKc3hPclRzeEluUGFja2FnZXMpIHtcbiAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmpzeDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5pc1Jvb3QgJiYgIWNvbmZpZy5kb2VzQ29udGFpbnNTdWJQYWNrYWdlSnNvbnMpIHtcbiAgICAgIG5ld1NldHRpbmdzLmluY2x1ZGUgPSBuZXdTZXR0aW5ncy5pbmNsdWRlPy5maWx0ZXIoKGRpclBhdGg6IHN0cmluZykgPT4gIWRpclBhdGguc3RhcnRzV2l0aCgncGFja2FnZXMvKi8nKSk7XG4gICAgfVxuICAgIGlmIChjb25maWcuaXNFc21QYWNrYWdlKSB7XG4gICAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMgPSB7XG4gICAgICAgIC4uLm5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyxcbiAgICAgICAgbW9kdWxlOiAnTm9kZU5leHQnLFxuICAgICAgICBtb2R1bGVSZXNvbHV0aW9uOiAnTm9kZU5leHQnLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3RzY29uZmlnLmpzb24nKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBvbGRTZXR0aW5ncyA9IEpTT04ucGFyc2UoZXhpc3RpbmdDb250ZW50KSBhcyBUc0NvbmZpZ0pzb247XG4gICAgICBpZiAob2xkU2V0dGluZ3MuZXh0ZW5kcyA9PT0gJy4vbm9kZV9tb2R1bGVzL0B3aWxsYm9vc3Rlci90c2NvbmZpZy90c2NvbmZpZy5qc29uJykge1xuICAgICAgICBkZWxldGUgb2xkU2V0dGluZ3MuZXh0ZW5kcztcbiAgICAgIH1cbiAgICAgIC8vIERvbid0IG1vZGlmeSBcInRhcmdldFwiLCBcIm1vZHVsZVwiIGFuZCBcIm1vZHVsZVJlc29sdXRpb25cIi5cbiAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LnRhcmdldDtcbiAgICAgIGlmICghY29uZmlnLmlzRXNtUGFja2FnZSkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5tb2R1bGU7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/Lm1vZHVsZVJlc29sdXRpb247XG4gICAgICB9XG4gICAgICBpZiAob2xkU2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5qc3gpIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8uanN4O1xuICAgICAgfVxuICAgICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7IGFycmF5TWVyZ2U6IGNvbWJpbmVNZXJnZSB9KTtcbiAgICAgIG5ld1NldHRpbmdzLmluY2x1ZGUgPSBuZXdTZXR0aW5ncy5pbmNsdWRlPy5maWx0ZXIoXG4gICAgICAgIChkaXJQYXRoOiBzdHJpbmcpID0+ICFkaXJQYXRoLmluY2x1ZGVzKCdAdHlwZXMnKSAmJiAhZGlyUGF0aC5pbmNsdWRlcygnX190ZXN0c19fJylcbiAgICAgICk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICAgIHNvcnRLZXlzKG5ld1NldHRpbmdzKTtcbiAgICBuZXdTZXR0aW5ncy5pbmNsdWRlPy5zb3J0KCk7XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KG5ld1NldHRpbmdzKTtcbiAgICAvLyBEb24ndCB1c2Ugb2xkIGRlY29yYXRvclxuICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmV4cGVyaW1lbnRhbERlY29yYXRvcnM7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHNvcnRLZXlzIH0gZnJvbSAnLi4vdXRpbHMvb2JqZWN0VXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgZXhjbHVkZUZpbGVQYXR0ZXJucyA9IFtcbiAgJyoqLy5naXQvb2JqZWN0cy8qKicsXG4gICcqKi8uZ2l0L3N1YnRyZWUtY2FjaGUvKionLFxuICAnKiovbm9kZV9tb2R1bGVzLyoqJyxcbiAgJyoqL3RtcC8qKicsXG4gICcqKi90ZW1wLyoqJyxcbiAgJyoqL2Rpc3QvKionLFxuXTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlVnNjb2RlU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncycsIGFzeW5jICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcudnNjb2RlJywgJ3NldHRpbmdzLmpzb24nKTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgbGV0IHNldHRpbmdzID0gSlNPTi5wYXJzZShleGlzdGluZ0NvbnRlbnQpO1xuICAgICAgZm9yIChjb25zdCBleGNsdWRlRmlsZVBhdHRlcm4gb2YgZXhjbHVkZUZpbGVQYXR0ZXJucykge1xuICAgICAgICBzZXR0aW5ncyA9IG1lcmdlLmFsbChbc2V0dGluZ3MsIGV4Y2x1ZGVTZXR0aW5nKGV4Y2x1ZGVGaWxlUGF0dGVybildKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zUG9ldHJ5TG9jaykge1xuICAgICAgICBzZXR0aW5ncyA9IG1lcmdlLmFsbChbc2V0dGluZ3MsIGV4Y2x1ZGVTZXR0aW5nKCcqKi8udmVudi8qKicpXSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgICAgIHNldHRpbmdzID0gbWVyZ2UuYWxsKFtzZXR0aW5ncywgZXhjbHVkZVNldHRpbmcoJyoqLy5uZXh0LyoqJyldKTtcbiAgICAgIH1cbiAgICAgIHNvcnRLZXlzKHNldHRpbmdzID8/IHt9KTtcbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShzZXR0aW5ncywgdW5kZWZpbmVkLCAyKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZXhjbHVkZVNldHRpbmcoZXhjbHVkZUZpbGVQYXR0ZXJuOiBzdHJpbmcpOiB1bmtub3duIHtcbiAgcmV0dXJuIHtcbiAgICAnZmlsZXMud2F0Y2hlckV4Y2x1ZGUnOiB7XG4gICAgICBbZXhjbHVkZUZpbGVQYXR0ZXJuXTogdHJ1ZSxcbiAgICB9LFxuICB9O1xufVxuIiwiLyogZXNsaW50LWRpc2FibGUgdW5pY29ybi9uby1udWxsICovXG5cbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IHlhbWwgZnJvbSAnanMteWFtbCc7XG5pbXBvcnQgY2xvbmVEZWVwIGZyb20gJ2xvZGFzaC5jbG9uZWRlZXAnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBjb21iaW5lTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgbW92ZVRvQm90dG9tLCBzb3J0S2V5cyB9IGZyb20gJy4uL3V0aWxzL29iamVjdFV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmludGVyZmFjZSBXb3JrZmxvdyB7XG4gIG5hbWU6IHN0cmluZztcbiAgb246IE9uO1xuICBjb25jdXJyZW5jeT86IENvbmN1cnJlbmN5O1xuICBqb2JzOiB7IFtrZXk6IHN0cmluZ106IEpvYiB9O1xufVxuXG5pbnRlcmZhY2UgQ29uY3VycmVuY3kge1xuICBncm91cDogc3RyaW5nO1xuICAnY2FuY2VsLWluLXByb2dyZXNzJzogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIE9uIHtcbiAgaXNzdWVzPzogVHlwZXM7XG4gIHB1bGxfcmVxdWVzdD86IFB1bGxSZXF1ZXN0O1xuICBwdWxsX3JlcXVlc3RfdGFyZ2V0PzogVHlwZXM7XG4gIHB1c2g/OiBQdXNoO1xuICBzY2hlZHVsZT86IFNjaGVkdWxlW107XG4gIHdvcmtmbG93X2Rpc3BhdGNoPzogbnVsbDtcbn1cblxuaW50ZXJmYWNlIFB1bGxSZXF1ZXN0IHtcbiAgJ3BhdGhzLWlnbm9yZSc/OiBzdHJpbmdbXTtcbiAgdHlwZXM/OiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIFB1c2gge1xuICBicmFuY2hlczogc3RyaW5nW107XG4gICdwYXRocy1pZ25vcmUnPzogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBTY2hlZHVsZSB7XG4gIGNyb246IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFR5cGVzIHtcbiAgdHlwZXM6IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgSm9iIHtcbiAgdXNlczogc3RyaW5nO1xuICBzZWNyZXRzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHdpdGg/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuY29uc3Qgd29ya2Zsb3dzID0ge1xuICB0ZXN0OiB7XG4gICAgbmFtZTogJ1Rlc3QnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3Q6IHtcbiAgICAgICAgJ3BhdGhzLWlnbm9yZSc6IFsnKioubWQnLCAnKiovZG9jcy8qKiddLFxuICAgICAgfSxcbiAgICAgIHB1c2g6IHtcbiAgICAgICAgYnJhbmNoZXM6IFsnbWFpbicsICd3YmZ5J10sXG4gICAgICAgICdwYXRocy1pZ25vcmUnOiBbJyoqLm1kJywgJyoqL2RvY3MvKionXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICAvLyBjZi4gaHR0cHM6Ly9kb2NzLmdpdGh1Yi5jb20vZW4vYWN0aW9ucy91c2luZy1qb2JzL3VzaW5nLWNvbmN1cnJlbmN5I2V4YW1wbGUtb25seS1jYW5jZWwtaW4tcHJvZ3Jlc3Mtam9icy1vci1ydW5zLWZvci10aGUtY3VycmVudC13b3JrZmxvd1xuICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0tJHt7IGdpdGh1Yi5yZWYgfX0nLFxuICAgICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IHRydWUsXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICB0ZXN0OiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvdGVzdC55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIHJlbGVhc2U6IHtcbiAgICBuYW1lOiAnUmVsZWFzZScsXG4gICAgb246IHtcbiAgICAgIHB1c2g6IHtcbiAgICAgICAgYnJhbmNoZXM6IFtdLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0nLFxuICAgICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IGZhbHNlLFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgcmVsZWFzZToge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3JlbGVhc2UueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICB3YmZ5OiB7XG4gICAgbmFtZTogJ1dpbGxib29zdGVyaWZ5JyxcbiAgICBvbjoge1xuICAgICAgd29ya2Zsb3dfZGlzcGF0Y2g6IG51bGwsXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICB3YmZ5OiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3Mvd2JmeS55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gICd3YmZ5LW1lcmdlJzoge1xuICAgIG5hbWU6ICdNZXJnZSB3YmZ5JyxcbiAgICBvbjoge1xuICAgICAgd29ya2Zsb3dfZGlzcGF0Y2g6IG51bGwsXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnd2JmeS1tZXJnZSc6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy93YmZ5LW1lcmdlLnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ3NlbWFudGljLXByJzoge1xuICAgIG5hbWU6ICdMaW50IFBSIHRpdGxlJyxcbiAgICBvbjoge1xuICAgICAgcHVsbF9yZXF1ZXN0X3RhcmdldDoge1xuICAgICAgICB0eXBlczogWydvcGVuZWQnLCAnZWRpdGVkJywgJ3N5bmNocm9uaXplJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ3NlbWFudGljLXByJzoge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3NlbWFudGljLXByLnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgc3luYzoge1xuICAgIG5hbWU6ICdTeW5jJyxcbiAgICBvbjoge30sXG4gICAgam9iczoge1xuICAgICAgc3luYzogeyB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3N5bmMueW1sQG1haW4nIH0sXG4gICAgfSxcbiAgfSxcbiAgJ25vdGlmeS1yZWFkeSc6IHtcbiAgICBuYW1lOiAnTm90aWZ5IHJlYWR5JyxcbiAgICBvbjoge1xuICAgICAgaXNzdWVzOiB7XG4gICAgICAgIHR5cGVzOiBbJ2xhYmVsZWQnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnbm90aWZ5LXJlYWR5Jzoge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL25vdGlmeS1yZWFkeS55bWxAbWFpbicsXG4gICAgICAgIHNlY3JldHM6IHtcbiAgICAgICAgICBESVNDT1JEX1dFQkhPT0tfVVJMOiAnJHt7IHNlY3JldHMuRElTQ09SRF9XRUJIT09LX1VSTF9GT1JfUkVBRFkgfX0nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAnY2xvc2UtY29tbWVudCc6IHtcbiAgICBuYW1lOiAnQWRkIGNsb3NlIGNvbW1lbnQnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3Q6IHtcbiAgICAgICAgdHlwZXM6IFsnb3BlbmVkJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ2Nsb3NlLWNvbW1lbnQnOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvY2xvc2UtY29tbWVudC55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gICdhZGQtaXNzdWUtdG8tcHJvamVjdCc6IHtcbiAgICBuYW1lOiAnQWRkIGlzc3VlIHRvIEdpdEh1YiBwcm9qZWN0JyxcbiAgICBvbjoge1xuICAgICAgaXNzdWVzOiB7XG4gICAgICAgIHR5cGVzOiBbJ2xhYmVsZWQnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnYWRkLWlzc3VlLXRvLXByb2plY3QnOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvYWRkLWlzc3VlLXRvLXByb2plY3QueW1sQG1haW4nLFxuICAgICAgICBzZWNyZXRzOiB7XG4gICAgICAgICAgR0hfUFJPSkVDVF9VUkw6ICcke3sgc2VjcmV0cy5HSF9QUk9KRUNUX1VSTCB9fScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gICdhZGQtcmVhZHktaXNzdWUtdG8tcHJvamVjdCc6IHtcbiAgICBuYW1lOiAnQWRkIHJlYWR5IGlzc3VlIHRvIEdpdEh1YiBwcm9qZWN0JyxcbiAgICBvbjoge1xuICAgICAgaXNzdWVzOiB7XG4gICAgICAgIHR5cGVzOiBbJ2xhYmVsZWQnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnYWRkLXJlYWR5LWlzc3VlLXRvLXByb2plY3QnOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvYWRkLWlzc3VlLXRvLXByb2plY3QueW1sQG1haW4nLFxuICAgICAgICB3aXRoOiB7XG4gICAgICAgICAgbGFiZWxlZDogJ3JlYWR5IDpyb2NrZXQ6JyxcbiAgICAgICAgfSxcbiAgICAgICAgc2VjcmV0czoge1xuICAgICAgICAgIEdIX1BST0pFQ1RfVVJMOiAnaHR0cHM6Ly9naXRodWIuY29tL29yZ3MvV2lsbEJvb3N0ZXJMYWIvcHJvamVjdHMvNScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG59IGFzIGNvbnN0O1xuXG50eXBlIEtub3duS2luZCA9IGtleW9mIHR5cGVvZiB3b3JrZmxvd3MgfCAnZGVwbG95JztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlV29ya2Zsb3dzKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVdvcmtmbG93JywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHdvcmtmbG93c1BhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicsICd3b3JrZmxvd3MnKTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2Rpcih3b3JrZmxvd3NQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIC8vIFJlbW92ZSBjb25maWcgb2Ygc2VtYW50aWMgcHVsbCByZXF1ZXN0XG4gICAgY29uc3Qgc2VtYW50aWNZbWxQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5naXRodWInLCAnc2VtYW50aWMueW1sJyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHNlbWFudGljWW1sUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pKTtcblxuICAgIGNvbnN0IGVudHJpZXMgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKHdvcmtmbG93c1BhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICBjb25zdCBmaWxlTmFtZVNldCA9IG5ldyBTZXQoW1xuICAgICAgJ3Rlc3QueW1sJyxcbiAgICAgICd3YmZ5LnltbCcsXG4gICAgICAnd2JmeS1tZXJnZS55bWwnLFxuICAgICAgJ3NlbWFudGljLXByLnltbCcsXG4gICAgICAnY2xvc2UtY29tbWVudC55bWwnLFxuICAgICAgJ2FkZC1pc3N1ZS10by1wcm9qZWN0LnltbCcsXG4gICAgICAuLi5lbnRyaWVzLmZpbHRlcigoZGlyZW50KSA9PiBkaXJlbnQuaXNGaWxlKCkgJiYgZGlyZW50Lm5hbWUuZW5kc1dpdGgoJy55bWwnKSkubWFwKChkaXJlbnQpID0+IGRpcmVudC5uYW1lKSxcbiAgICBdKTtcbiAgICBpZiAocm9vdENvbmZpZy5kZXBlbmRpbmcuc2VtYW50aWNSZWxlYXNlKSB7XG4gICAgICBmaWxlTmFtZVNldC5hZGQoJ3JlbGVhc2UueW1sJyk7XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmlzUHVibGljUmVwbyB8fCByb290Q29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKSkge1xuICAgICAgZmlsZU5hbWVTZXQuYWRkKCdhZGQtcmVhZHktaXNzdWUtdG8tcHJvamVjdC55bWwnKTtcbiAgICAgIGZpbGVOYW1lU2V0LmFkZCgnbm90aWZ5LXJlYWR5LnltbCcpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgZmlsZU5hbWUgb2YgZmlsZU5hbWVTZXQpIHtcbiAgICAgIC8vIOWun+mam+OBr0tub3duS2luZOS7peWkluOBruWApOOCguS7o+WFpeOBleOCjOOCi+OBk+OBqOOBq+azqOaEj1xuICAgICAgY29uc3Qga2luZCA9IHBhdGguYmFzZW5hbWUoZmlsZU5hbWUsICcueW1sJykgYXMgS25vd25LaW5kO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IHdyaXRlV29ya2Zsb3dZYW1sKHJvb3RDb25maWcsIHdvcmtmbG93c1BhdGgsIGtpbmQpKTtcbiAgICB9XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgJ2FkZC1mb2N1c2VkLWlzc3VlLXRvLXByb2plY3QueW1sJyksIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgICk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZVdvcmtmbG93WWFtbChjb25maWc6IFBhY2thZ2VDb25maWcsIHdvcmtmbG93c1BhdGg6IHN0cmluZywga2luZDogS25vd25LaW5kKTogUHJvbWlzZTx2b2lkPiB7XG4gIGxldCBuZXdTZXR0aW5ncyA9IGNsb25lRGVlcCh3b3JrZmxvd3Nba2luZCBhcyBrZXlvZiB0eXBlb2Ygd29ya2Zsb3dzXSA/PyB7fSkgYXMgV29ya2Zsb3c7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKHdvcmtmbG93c1BhdGgsIGAke2tpbmR9LnltbGApO1xuICB0cnkge1xuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICBjb25zdCBvbGRTZXR0aW5ncyA9IHlhbWwubG9hZChvbGRDb250ZW50KSBhcyBXb3JrZmxvdztcbiAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHsgYXJyYXlNZXJnZTogY29tYmluZU1lcmdlIH0pIGFzIFdvcmtmbG93O1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cblxuICBpZiAoa2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSkge1xuICAgIG5ld1NldHRpbmdzID0ge1xuICAgICAgLi4ubmV3U2V0dGluZ3MsXG4gICAgICBjb25jdXJyZW5jeToge1xuICAgICAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0nLFxuICAgICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogZmFsc2UsXG4gICAgICB9LFxuICAgIH07XG4gICAgLy8gTW92ZSBqb2JzIHRvIHRoZSBib3R0b21cbiAgICBpZiAobmV3U2V0dGluZ3Muam9icykge1xuICAgICAgbW92ZVRvQm90dG9tKG5ld1NldHRpbmdzLCAnam9icycpO1xuICAgIH1cbiAgICBpZiAobmV3U2V0dGluZ3Mub24/LnB1c2gpIHtcbiAgICAgIG5ld1NldHRpbmdzLm9uLnB1c2hbJ3BhdGhzLWlnbm9yZSddID0gW1xuICAgICAgICAuLi5uZXcgU2V0PHN0cmluZz4oWy4uLihuZXdTZXR0aW5ncy5vbi5wdXNoWydwYXRocy1pZ25vcmUnXSA/PyBbXSksICcqKi5tZCcsICcqKi9kb2NzLyoqJ10pLFxuICAgICAgXTtcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IGpvYiBvZiBPYmplY3QudmFsdWVzKG5ld1NldHRpbmdzLmpvYnMpKSB7XG4gICAgLy8gSWdub3JlIG5vbi1yZXVzYWJsZSB3b3JrZmxvd3NcbiAgICBpZiAoIWpvYi51c2VzPy5pbmNsdWRlcz8uKCcvcmV1c2FibGUtd29ya2Zsb3dzLycpKSByZXR1cm47XG5cbiAgICBub3JtYWxpemVKb2IoY29uZmlnLCBqb2IsIGtpbmQpO1xuICB9XG5cbiAgc3dpdGNoIChraW5kKSB7XG4gICAgY2FzZSAncmVsZWFzZSc6IHtcbiAgICAgIGlmIChuZXdTZXR0aW5ncy5vbj8uc2NoZWR1bGUpIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLm9uLnB1c2g7XG4gICAgICB9IGVsc2UgaWYgKG5ld1NldHRpbmdzLm9uPy5wdXNoICYmIGNvbmZpZy5yZWxlYXNlLmJyYW5jaGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbmV3U2V0dGluZ3Mub24ucHVzaC5icmFuY2hlcyA9IGNvbmZpZy5yZWxlYXNlLmJyYW5jaGVzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRG9uJ3QgdXNlIHJlbGVhc2UueW1sIGlmIHJlbGVhc2UgYnJhbmNoIGlzIG5vdCBzcGVjaWZpZWRcbiAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsICdyZWxlYXNlLnltbCcpLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSAndGVzdCc6IHtcbiAgICAgIGlmIChuZXdTZXR0aW5ncy5vbj8ucHVzaCkge1xuICAgICAgICBuZXdTZXR0aW5ncy5vbi5wdXNoLmJyYW5jaGVzID0gbmV3U2V0dGluZ3Mub24ucHVzaC5icmFuY2hlcy5maWx0ZXIoKGJyYW5jaCkgPT4gYnJhbmNoICE9PSAncmVub3ZhdGUvKionKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlICd3YmZ5Jzoge1xuICAgICAgaWYgKG5ld1NldHRpbmdzLm9uKSBzZXRTY2hlZHVsZShuZXdTZXR0aW5ncywgMjAsIDI0KTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlICd3YmZ5LW1lcmdlJzoge1xuICAgICAgc2V0U2NoZWR1bGUobmV3U2V0dGluZ3MsIDEsIDQpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIC8vIE5vIGRlZmF1bHRcbiAgfVxuICBtaWdyYXRlV29ya2Zsb3cobmV3U2V0dGluZ3MpO1xuICBhd2FpdCB3cml0ZVlhbWwobmV3U2V0dGluZ3MsIGZpbGVQYXRoKTtcblxuICBpZiAoa2luZCA9PT0gJ3JlbGVhc2UnKSB7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsICdzZW1hbnRpYy1yZWxlYXNlLnltbCcpLCB7IGZvcmNlOiB0cnVlIH0pO1xuICB9IGVsc2UgaWYgKGtpbmQgPT09ICdzeW5jJykge1xuICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAnc3luYy1pbml0LnltbCcpLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgIGlmICghbmV3U2V0dGluZ3Muam9icy5zeW5jIHx8ICFuZXdTZXR0aW5ncy5qb2JzLnN5bmMud2l0aCkgcmV0dXJuO1xuXG4gICAgbmV3U2V0dGluZ3Muam9ic1snc3luYy1mb3JjZSddID0gbmV3U2V0dGluZ3Muam9icy5zeW5jO1xuICAgIGNvbnN0IHBhcmFtcyA9IG5ld1NldHRpbmdzLmpvYnMuc3luYy53aXRoLnN5bmNfcGFyYW1zX3dpdGhvdXRfZGVzdDtcbiAgICBpZiAoIXBhcmFtcykgcmV0dXJuO1xuXG4gICAgbmV3U2V0dGluZ3Muam9icy5zeW5jLndpdGguc3luY19wYXJhbXNfd2l0aG91dF9kZXN0ID0gYC0tZm9yY2UgJHtwYXJhbXN9YDtcbiAgICBuZXdTZXR0aW5ncy5uYW1lID0gJ0ZvcmNlIHRvIFN5bmMnO1xuICAgIG5ld1NldHRpbmdzLm9uID0geyB3b3JrZmxvd19kaXNwYXRjaDogbnVsbCB9O1xuICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5qb2JzLnN5bmM7XG4gICAgYXdhaXQgd3JpdGVZYW1sKG5ld1NldHRpbmdzLCBwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgJ3N5bmMtZm9yY2UueW1sJykpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUpvYihjb25maWc6IFBhY2thZ2VDb25maWcsIGpvYjogSm9iLCBraW5kOiBLbm93bktpbmQpOiB2b2lkIHtcbiAgam9iLndpdGggfHw9IHt9O1xuICBqb2Iuc2VjcmV0cyB8fD0ge307XG5cbiAgaWYgKFxuICAgIGtpbmQgPT09ICd0ZXN0JyB8fFxuICAgIGtpbmQgPT09ICdyZWxlYXNlJyB8fFxuICAgIGtpbmQgPT09ICd3YmZ5JyB8fFxuICAgIGtpbmQgPT09ICd3YmZ5LW1lcmdlJyB8fFxuICAgIGtpbmQgPT09ICdhZGQtaXNzdWUtdG8tcHJvamVjdCcgfHxcbiAgICBraW5kID09PSAnYWRkLXJlYWR5LWlzc3VlLXRvLXByb2plY3QnXG4gICkge1xuICAgIGpvYi5zZWNyZXRzWydHSF9UT0tFTiddID0gY29uZmlnLmlzUHVibGljUmVwbyA/ICcke3sgc2VjcmV0cy5QVUJMSUNfR0hfQk9UX1BBVCB9fScgOiAnJHt7IHNlY3JldHMuR0hfQk9UX1BBVCB9fSc7XG4gIH1cbiAgaWYgKGNvbmZpZy5yZWxlYXNlLm5wbSAmJiAoa2luZCA9PT0gJ3JlbGVhc2UnIHx8IGtpbmQgPT09ICd0ZXN0JykpIHtcbiAgICBqb2Iuc2VjcmV0c1snTlBNX1RPS0VOJ10gPSAnJHt7IHNlY3JldHMuTlBNX1RPS0VOIH19JztcbiAgfVxuICBpZiAoam9iLnNlY3JldHNbJ0ZJUkVCQVNFX1RPS0VOJ10pIHtcbiAgICBqb2Iuc2VjcmV0c1snR0NQX1NBX0tFWV9KU09OX0ZPUl9GSVJFQkFTRSddID0gJyR7eyBzZWNyZXRzLkdDUF9TQV9LRVlfSlNPTl9GT1JfRklSRUJBU0UgfX0nO1xuICAgIGRlbGV0ZSBqb2Iuc2VjcmV0c1snRklSRUJBU0VfVE9LRU4nXTtcbiAgfVxuICBpZiAoXG4gICAgKGpvYi5zZWNyZXRzWydESVNDT1JEX1dFQkhPT0tfVVJMJ10gJiYgKGtpbmQgPT09ICdyZWxlYXNlJyB8fCBraW5kLnN0YXJ0c1dpdGgoJ2RlcGxveScpKSkgfHxcbiAgICAoam9iLndpdGguc2VydmVyX3VybCAmJiBraW5kLnN0YXJ0c1dpdGgoJ2RlcGxveScpKVxuICApIHtcbiAgICBqb2Iuc2VjcmV0c1snRElTQ09SRF9XRUJIT09LX1VSTCddID0gJyR7eyBzZWNyZXRzLkRJU0NPUkRfV0VCSE9PS19VUkxfRk9SX1JFTEVBU0UgfX0nO1xuICB9XG5cbiAgaWYgKGtpbmQgPT09ICdzeW5jJykge1xuICAgIGNvbnN0IHBhcmFtcyA9IGpvYi53aXRoPy5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3Q7XG4gICAgaWYgKHBhcmFtcykge1xuICAgICAgam9iLndpdGguc3luY19wYXJhbXNfd2l0aG91dF9kZXN0ID0gcGFyYW1zLnRvU3RyaW5nKCkucmVwbGFjZSgnc3luYyAnLCAnJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXIvJykpIHtcbiAgICBqb2IudXNlcyA9IGpvYi51c2VzLnJlcGxhY2UoJ1dpbGxCb29zdGVyTGFiLycsICdXaWxsQm9vc3Rlci8nKTtcbiAgfSBlbHNlIGlmIChjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyTGFiLycpKSB7XG4gICAgam9iLnVzZXMgPSBqb2IudXNlcy5yZXBsYWNlKCdXaWxsQm9vc3Rlci8nLCAnV2lsbEJvb3N0ZXJMYWIvJyk7XG4gIH1cblxuICAvLyBSZW1vdmUgcmVkdW5kYW50IHBhcmFtZXRlcnNcbiAgaWYgKGpvYi53aXRoWydkb3RfZW52X3BhdGgnXSA9PT0gJy5lbnYnKSB7XG4gICAgZGVsZXRlIGpvYi53aXRoWydkb3RfZW52X3BhdGgnXTtcbiAgfVxuICAvLyBSZW1vdmUgZGVwcmVjYXRlZCBwYXJhbWV0ZXJzXG4gIG1pZ3JhdGVKb2Ioam9iKTtcblxuICAvLyBEb24ndCB1c2UgYGZseSBkZXBsb3kgLS1qc29uYCBzaW5jZSBpdCBjYXVzZXMgYW4gZXJyb3JcbiAgaWYgKGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykgJiYgam9iLnNlY3JldHNbJ0ZMWV9BUElfVE9LRU4nXSAmJiBqb2Iud2l0aFsnZGVwbG95X2NvbW1hbmQnXSkge1xuICAgIGpvYi53aXRoWydkZXBsb3lfY29tbWFuZCddID0gam9iLndpdGhbJ2RlcGxveV9jb21tYW5kJ10udG9TdHJpbmcoKS5yZXBsYWNlKC9cXHMrLS1qc29uLywgJycpO1xuICB9XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5zRG9ja2VyZmlsZSkge1xuICAgIGlmIChqb2Iud2l0aFsnY2lfc2l6ZSddICE9PSAnZXh0cmEtbGFyZ2UnICYmIChraW5kLnN0YXJ0c1dpdGgoJ2RlcGxveScpIHx8IGtpbmQuc3RhcnRzV2l0aCgndGVzdCcpKSkge1xuICAgICAgam9iLndpdGhbJ2NpX3NpemUnXSA9ICdsYXJnZSc7XG4gICAgfVxuICAgIGlmIChraW5kLnN0YXJ0c1dpdGgoJ2RlcGxveScpKSB7XG4gICAgICBqb2Iud2l0aFsnY3B1X2FyY2gnXSA9ICdYNjQnO1xuICAgIH1cbiAgfVxuICAvLyBCZWNhdXNlIGdpdGh1Yi5ldmVudC5yZXBvc2l0b3J5LnByaXZhdGUgaXMgYWx3YXlzIHRydWUgaWYgam9iIGlzIHNjaGVkdWxlZFxuICBpZiAoa2luZCA9PT0gJ3JlbGVhc2UnIHx8IGtpbmQgPT09ICd0ZXN0JyB8fCBraW5kID09PSAnd2JmeScgfHwga2luZCA9PT0gJ3diZnktbWVyZ2UnIHx8IGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykpIHtcbiAgICBpZiAoY29uZmlnLmlzUHVibGljUmVwbykge1xuICAgICAgam9iLndpdGhbJ2dpdGh1Yl9ob3N0ZWRfcnVubmVyJ10gPSB0cnVlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBkZWxldGUgam9iLndpdGhbJ2dpdGh1Yl9ob3N0ZWRfcnVubmVyJ107XG4gIH1cblxuICBpZiAoT2JqZWN0LmtleXMoam9iLndpdGgpLmxlbmd0aCA+IDApIHtcbiAgICBzb3J0S2V5cyhqb2Iud2l0aCk7XG4gIH0gZWxzZSB7XG4gICAgZGVsZXRlIGpvYi53aXRoO1xuICB9XG4gIGlmIChPYmplY3Qua2V5cyhqb2Iuc2VjcmV0cykubGVuZ3RoID4gMCkge1xuICAgIC8vIE1vdmUgc2VjcmV0cyBwcm9wIGFmdGVyIHdpdGggcHJvcFxuICAgIGNvbnN0IG5ld1NlY3JldHMgPSBzb3J0S2V5cyhqb2Iuc2VjcmV0cyk7XG4gICAgZGVsZXRlIGpvYi5zZWNyZXRzO1xuICAgIGpvYi5zZWNyZXRzID0gbmV3U2VjcmV0cztcbiAgfSBlbHNlIHtcbiAgICBkZWxldGUgam9iLnNlY3JldHM7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2V0U2NoZWR1bGUobmV3U2V0dGluZ3M6IFdvcmtmbG93LCBpbmNsdXNpdmVNaW5Ib3VySnN0OiBudW1iZXIsIGV4Y2x1c2l2ZU1heEhvdXJKc3Q6IG51bWJlcik6IHZvaWQge1xuICBjb25zdCBbbWludXRlVXRjLCBob3VyVXRjXSA9ICgobmV3U2V0dGluZ3Mub24uc2NoZWR1bGU/LlswXT8uY3JvbiBhcyBzdHJpbmcpID8/ICcnKS5zcGxpdCgnICcpLm1hcChOdW1iZXIpO1xuICBpZiAobWludXRlVXRjICE9PSAwICYmIE51bWJlci5pc0ludGVnZXIoaG91clV0YykpIHtcbiAgICBjb25zdCBob3VySnN0ID0gKGhvdXJVdGMgKyA5KSAlIDI0O1xuICAgIGNvbnN0IGluUmFuZ2UgPVxuICAgICAgaW5jbHVzaXZlTWluSG91ckpzdCA8IGV4Y2x1c2l2ZU1heEhvdXJKc3RcbiAgICAgICAgPyBpbmNsdXNpdmVNaW5Ib3VySnN0IDw9IGhvdXJKc3QgJiYgaG91ckpzdCA8IGV4Y2x1c2l2ZU1heEhvdXJKc3RcbiAgICAgICAgOiBpbmNsdXNpdmVNaW5Ib3VySnN0IDw9IGhvdXJKc3QgfHwgaG91ckpzdCA8IGV4Y2x1c2l2ZU1heEhvdXJKc3Q7XG4gICAgaWYgKGluUmFuZ2UpIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IG1pbkpzdCA9IDEgKyBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiA1OSk7XG4gIGNvbnN0IGhvdXJKc3QgPSBpbmNsdXNpdmVNaW5Ib3VySnN0ICsgTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKGV4Y2x1c2l2ZU1heEhvdXJKc3QgLSBpbmNsdXNpdmVNaW5Ib3VySnN0KSk7XG4gIGNvbnN0IGNyb24gPSBgJHttaW5Kc3R9ICR7KGhvdXJKc3QgLSA5ICsgMjQpICUgMjR9ICogKiAqYDtcbiAgbmV3U2V0dGluZ3Mub24uc2NoZWR1bGUgPSBbeyBjcm9uIH1dO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZVlhbWwobmV3U2V0dGluZ3M6IFdvcmtmbG93LCBmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHlhbWxUZXh0ID0geWFtbC5kdW1wKG5ld1NldHRpbmdzLCB7XG4gICAgbGluZVdpZHRoOiAtMSxcbiAgICBub0NvbXBhdE1vZGU6IHRydWUsXG4gICAgc3R5bGVzOiB7XG4gICAgICAnISFudWxsJzogJ2VtcHR5JyxcbiAgICB9LFxuICB9KTtcbiAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGZpbGVQYXRoLCB5YW1sVGV4dCk7XG59XG5cbmZ1bmN0aW9uIG1pZ3JhdGVXb3JrZmxvdyhuZXdTZXR0aW5nczogV29ya2Zsb3cpOiB2b2lkIHtcbiAgLy8gVE9ETzogUmVtb3ZlIHRoZW0gYWZ0ZXIgMjAyMy0wMy0zMVxuICBkZWxldGUgbmV3U2V0dGluZ3Muam9ic1snYWRkLXRvLXByb2plY3QnXTtcbn1cblxuZnVuY3Rpb24gbWlncmF0ZUpvYihqb2I6IEpvYik6IHZvaWQge1xuICAvLyBUT0RPOiBSZW1vdmUgdGhlbSBhZnRlciAyMDIzLTAzLTMxXG4gIGlmICgham9iLndpdGgpIHJldHVybjtcbiAgZGVsZXRlIGpvYi53aXRoWydub25fc2VsZl9ob3N0ZWQnXTtcbiAgZGVsZXRlIGpvYi53aXRoWydub3RpZnlfZGlzY29yZCddO1xuICBkZWxldGUgam9iLndpdGhbJ3JlcXVpcmVfZmx5J107XG4gIGRlbGV0ZSBqb2Iud2l0aFsncmVxdWlyZV9nY2xvdWQnXTtcbiAgZGVsZXRlIGpvYi53aXRoWydjcHVfYXJjaCddO1xuICBkZWxldGUgam9iLndpdGhbJ2xhYmVsJ107XG4gIGRlbGV0ZSBqb2Iud2l0aFsnbGFiZWxPcGVyYXRvciddO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBDb25maWd1cmF0aW9uVmFsdWVNYXAgfSBmcm9tICdAeWFybnBrZy9jb3JlJztcbmltcG9ydCB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHNwYXduU3luYywgc3Bhd25TeW5jV2l0aFN0cmluZ1Jlc3VsdCB9IGZyb20gJy4uL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5cbmludGVyZmFjZSBTZXR0aW5ncyBleHRlbmRzIFBhcnRpYWw8Q29uZmlndXJhdGlvblZhbHVlTWFwPiB7XG4gIGRlZmF1bHRTZW12ZXJSYW5nZVByZWZpeDogc3RyaW5nO1xuICBubU1vZGU6IHN0cmluZztcbiAgbm9kZUxpbmtlcjogc3RyaW5nO1xuICBwbHVnaW5zPzogUGx1Z2luW107XG59XG5cbmludGVyZmFjZSBQbHVnaW4ge1xuICBjaGVja3N1bTogc3RyaW5nO1xuICBwYXRoOiBzdHJpbmc7XG4gIHNwZWM6IHN0cmluZztcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlWWFybnJjWW1sKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlWWFybnJjWW1sJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHlhcm5yY1ltbFBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcueWFybnJjLnltbCcpO1xuICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybSh5YXJucmNZbWxQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgICBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcueWFybicpLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSlcbiAgICAgICk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgICAgZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAneWFybi5sb2NrJyksIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50VmVyc2lvbiA9IHNwYXduU3luY1dpdGhTdHJpbmdSZXN1bHQoJ3lhcm4nLCBbJy0tdmVyc2lvbiddLCBjb25maWcuZGlyUGF0aCk7XG4gICAgY29uc3QgbGF0ZXN0VmVyc2lvbiA9IGdldExhdGVzdFZlcnNpb24oJ0B5YXJucGtnL2NsaScsIGNvbmZpZy5kaXJQYXRoKTtcbiAgICBpZiAoZ2V0TWFqb3JOdW1iZXIoY3VycmVudFZlcnNpb24pIDw9IGdldE1ham9yTnVtYmVyKGxhdGVzdFZlcnNpb24pICYmIGN1cnJlbnRWZXJzaW9uICE9PSBsYXRlc3RWZXJzaW9uKSB7XG4gICAgICBzcGF3blN5bmMoJ3lhcm4nLCBbJ3NldCcsICd2ZXJzaW9uJywgbGF0ZXN0VmVyc2lvbl0sIGNvbmZpZy5kaXJQYXRoLCAxKTtcbiAgICB9XG5cbiAgICBjb25zdCByZWxlYXNlc1BhdGggPSBwYXRoLmpvaW4oY29uZmlnLmRpclBhdGgsICcueWFybicsICdyZWxlYXNlcycpO1xuICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHJlbGVhc2VzUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgZm9yIChjb25zdCBmaWxlIG9mIGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIocmVsZWFzZXNQYXRoKSkge1xuICAgICAgaWYgKGZpbGUuc3RhcnRzV2l0aCgneWFybi0nKSAmJiAhZmlsZS5zdGFydHNXaXRoKGB5YXJuLSR7bGF0ZXN0VmVyc2lvbn0uYCkpIHtcbiAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGguam9pbihyZWxlYXNlc1BhdGgsIGZpbGUpKSk7XG4gICAgICAgIGNvbnNvbGUubG9nKCdSZW1vdmVkJywgcGF0aC5qb2luKHJlbGVhc2VzUGF0aCwgZmlsZSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHlhcm5yY1BhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcueWFybnJjJyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHlhcm5yY1BhdGgsIHsgZm9yY2U6IHRydWUgfSkpO1xuXG4gICAgY29uc3Qgc2V0dGluZ3MgPSB5YW1sLmxvYWQoYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoeWFybnJjWW1sUGF0aCwgJ3V0ZjgnKSkgYXMgU2V0dGluZ3M7XG4gICAgc2V0dGluZ3MuZGVmYXVsdFNlbXZlclJhbmdlUHJlZml4ID0gJyc7XG4gICAgc2V0dGluZ3Mubm9kZUxpbmtlciA9ICdub2RlLW1vZHVsZXMnO1xuICAgIHNldHRpbmdzLm5tTW9kZSA9ICdoYXJkbGlua3MtZ2xvYmFsJztcbiAgICBkZWxldGUgc2V0dGluZ3MuY29tcHJlc3Npb25MZXZlbDtcbiAgICBpZiAoc2V0dGluZ3MuaW5qZWN0RW52aXJvbm1lbnRGaWxlcz8ubGVuZ3RoID09PSAwKSB7XG4gICAgICBkZWxldGUgc2V0dGluZ3MuaW5qZWN0RW52aXJvbm1lbnRGaWxlcztcbiAgICB9XG4gICAgLy8gY2YuIGh0dHBzOi8vZ2l0aHViLmNvbS95YXJucGtnL2JlcnJ5L3B1bGwvNDY5OFxuICAgIHNldHRpbmdzLmVuYWJsZUdsb2JhbENhY2hlID0gdHJ1ZTtcbiAgICBjb25zdCBvcmlnaW5hbExlbmd0aCA9IHNldHRpbmdzLnBsdWdpbnM/Lmxlbmd0aCA/PyAwO1xuICAgIHNldHRpbmdzLnBsdWdpbnMgPSBzZXR0aW5ncy5wbHVnaW5zPy5maWx0ZXIoKHApID0+IHAucGF0aCAhPT0gJy55YXJuL3BsdWdpbnMvdW5kZWZpbmVkLmNqcycpID8/IFtdO1xuICAgIGlmIChzZXR0aW5ncy5wbHVnaW5zLmxlbmd0aCAhPT0gb3JpZ2luYWxMZW5ndGgpIHtcbiAgICAgIGNvbnN0IHBsdWdpblBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcueWFybnJjJywgJ3VuZGVmaW5lZC5janMnKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwbHVnaW5QYXRoLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICB9XG4gICAgaWYgKHNldHRpbmdzLnBsdWdpbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICBkZWxldGUgc2V0dGluZ3MucGx1Z2lucztcbiAgICB9XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHlhcm5yY1ltbFBhdGgsIHlhbWwuZHVtcChzZXR0aW5ncywgeyBsaW5lV2lkdGg6IC0xIH0pKTtcblxuICAgIHNwYXduU3luYygneWFybicsIFsnZGx4JywgJ3lhcm4tcGx1Z2luLWF1dG8taW5zdGFsbCddLCBjb25maWcuZGlyUGF0aCk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGF0ZXN0VmVyc2lvbihwYWNrYWdlTmFtZTogc3RyaW5nLCBkaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCB2ZXJzaW9uc0pzb24gPSBzcGF3blN5bmNXaXRoU3RyaW5nUmVzdWx0KCducG0nLCBbJ3Nob3cnLCBwYWNrYWdlTmFtZSwgJ3ZlcnNpb25zJywgJy0tanNvbiddLCBkaXJQYXRoKTtcbiAgY29uc3QgdmVyc2lvbnMgPSBKU09OLnBhcnNlKHZlcnNpb25zSnNvbikgYXMgc3RyaW5nW107XG4gIHJldHVybiB2ZXJzaW9ucy5hdCgtMSkgYXMgc3RyaW5nO1xufVxuZnVuY3Rpb24gZ2V0TWFqb3JOdW1iZXIodmVyc2lvbjogc3RyaW5nKTogbnVtYmVyIHtcbiAgY29uc3QgW21ham9yXSA9IHZlcnNpb24uc3BsaXQoJy4nKTtcbiAgcmV0dXJuIE51bWJlcihtYWpvcik7XG59XG4iLCJpbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnaXRIdWJVdGlsLCBoYXNHaXRIdWJUb2tlbiwgb2N0b2tpdCB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0dXBMYWJlbHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignc2V0dXBMYWJlbHMnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFoYXNHaXRIdWJUb2tlbikgcmV0dXJuO1xuXG4gICAgY29uc3QgW293bmVyLCByZXBvXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShjb25maWcucmVwb3NpdG9yeSA/PyAnJyk7XG4gICAgaWYgKCFvd25lciB8fCAhcmVwbykgcmV0dXJuO1xuICAgIGlmIChvd25lciAhPT0gJ1dpbGxCb29zdGVyJyAmJiBvd25lciAhPT0gJ1dpbGxCb29zdGVyTGFiJykgcmV0dXJuO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdkMTogeC1lYXN5IDpoZWRnZWhvZzonLCAnRURFOUZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAnZDI6IGVhc3kgOnJhYmJpdDI6JywgJ0RERDZGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ2QzOiBtZWRpdW0gOm94OicsICdDNEI1RkQnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdkNDogaGFyZCA6c3F1aWQ6JywgJ0E3OEJGQScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ2Q1OiB4LWhhcmQgOndoYWxlMjonLCAnOEI1Q0Y2Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAncDE6IGNyaXRpY2FsIDpmaXJlOjpmaXJlOjpmaXJlOicsICdFRjQ0NDQnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdwMjogdXJnZW50IDpmaXJlOjpmaXJlOicsICdGODcxNzEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdwMzogaW1wb3J0YW50IDpmaXJlOicsICdGQ0E1QTUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdwNDogbmljZSB0byBoYXZlIDpkcm9wbGV0OicsICdGRUNBQ0EnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdyOiBibGl0eicsICc1MzAwYmMnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdyOiBmaXJlYmFzZScsICdmZmNhMjgnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdyOiBwcmlzbWEnLCAnMGMzNDRiJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAncjogcmVhY3QnLCAnNjFkYWZiJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAncjogc3ZlbHRlJywgJ2ZmM2UwMCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3I6IHNlbWFudGljLXJlbGVhc2UnLCAnNDk0OTQ5Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAncmVhZHkgOnJvY2tldDonLCAnMjJDNTVFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAncmV2aWV3IHJlcXVlc3RlZCA6bWFnOicsICdGQkNBMDQnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdyZWxlYXNlZCA6Ym9va21hcms6JywgJzYzNjZGMScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3M6IDAuNWggOmNsb2NrMTIzMDonLCAnRjNGNEY2Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAnczogMWggOmNsb2NrMTonLCAnRTVFN0VCJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAnczogMmggOmNsb2NrMjonLCAnRDFENURCJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAnczogM2ggOmNsb2NrMzonLCAnOUNBM0FGJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAnczogNWggOmNsb2NrNTonLCAnNkI3MjgwJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAnczogOGggOmNsb2NrODonLCAnNEI1NTYzJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAnczogMTNoIDpjbG9jazE6JywgJzM3NDE1MScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3Q6IGJ1aWxkIDpoYW1tZXI6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3Q6IGNob3JlIDpicm9vbTonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAndDogY2kgOmNvbnN0cnVjdGlvbl93b3JrZXI6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3Q6IGRvY3MgOm1lbW86JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3Q6IGZlYXQgOnNwYXJrbGVzOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICd0OiBmaXggOmJ1ZzonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAndDogcGVyZiA6emFwOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICd0OiByZWZhY3RvciA6cmVjeWNsZTonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAndDogc3R5bGUgOmxpcHN0aWNrOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICd0OiB0ZXN0IDp0ZXN0X3R1YmU6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3Byb2plY3QnLCAnMjQyOTJGJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAnZm9jdXNlZCA6ZGFydDonLCAnMjJDNTVFJyk7XG5cbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG93bmVyLCByZXBvLCAnYnVnJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvd25lciwgcmVwbywgJ2RvY3VtZW50YXRpb24nKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG93bmVyLCByZXBvLCAnZHVwbGljYXRlJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvd25lciwgcmVwbywgJ2VuaGFuY2VtZW50Jyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvd25lciwgcmVwbywgJ2dvb2QgZmlyc3QgaXNzdWUnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG93bmVyLCByZXBvLCAnaGVscCB3YW50ZWQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG93bmVyLCByZXBvLCAnaW52YWxpZCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob3duZXIsIHJlcG8sICdxdWVzdGlvbicpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob3duZXIsIHJlcG8sICd3b250Zml4Jyk7XG5cbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG93bmVyLCByZXBvLCAncmVhZHknKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG93bmVyLCByZXBvLCAncmV2aWV3IHJlcXVlc3RlZCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob3duZXIsIHJlcG8sICdyZWxlYXNlZCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob3duZXIsIHJlcG8sICdzZW1hbnRpYy1yZWxlYXNlJyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybignU2tpcCBzZXR1cExhYmVscyBkdWUgdG86JywgKGVycm9yIGFzIEVycm9yKT8uc3RhY2sgPz8gZXJyb3IpO1xuICAgIH1cbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNldHVwTGFiZWwob3duZXI6IHN0cmluZywgcmVwbzogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIGNvbG9yOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ1BPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVscycsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIG5hbWUsXG4gICAgICBjb2xvcixcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vbGFiZWxzL3tuYW1lfScsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIG5hbWUsXG4gICAgICBjb2xvcixcbiAgICB9KTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBkZWxldGVMYWJlbChvd25lcjogc3RyaW5nLCByZXBvOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHMve25hbWV9Jywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgbmFtZSxcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBpbXBvcnQvbm8tbmFtZWQtYXMtZGVmYXVsdC1tZW1iZXIgKi9cblxuaW1wb3J0IGRvdGVudiBmcm9tICdkb3RlbnYnO1xuaW1wb3J0IHNvZGl1bSBmcm9tICdsaWJzb2RpdW0td3JhcHBlcnMnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4uL29wdGlvbnMuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnaXRIdWJVdGlsLCBoYXNHaXRIdWJUb2tlbiwgb2N0b2tpdCB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuXG5jb25zdCBkZXByZWNhdGVkU2VjcmV0TmFtZXMgPSBbJ1JFQURZX0RJU0NPUkRfV0VCSE9PS19VUkwnXTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwU2VjcmV0cyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdzZXR1cFNlY3JldHMnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFoYXNHaXRIdWJUb2tlbiB8fCAhb3B0aW9ucy5kb2VzVXBsb2FkRW52VmFycykgcmV0dXJuO1xuXG4gICAgY29uc3QgW293bmVyLCByZXBvXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShjb25maWcucmVwb3NpdG9yeSA/PyAnJyk7XG4gICAgaWYgKCFvd25lciB8fCAhcmVwbyB8fCBvd25lciAhPT0gJ1dpbGxCb29zdGVyTGFiJykgcmV0dXJuO1xuXG4gICAgY29uc3QgcGFyc2VkID0gZG90ZW52LmNvbmZpZygpLnBhcnNlZCB8fCB7fTtcbiAgICBpZiAoT2JqZWN0LmtleXMocGFyc2VkKS5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIHRyeSB7XG4gICAgICBmb3IgKGNvbnN0IHNlY3JldE5hbWUgb2YgZGVwcmVjYXRlZFNlY3JldE5hbWVzKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvc2VjcmV0cy97c2VjcmV0X25hbWV9Jywge1xuICAgICAgICAgICAgb3duZXIsXG4gICAgICAgICAgICByZXBvLFxuICAgICAgICAgICAgc2VjcmV0X25hbWU6IHNlY3JldE5hbWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG9jdG9raXQucmVxdWVzdCgnR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3NlY3JldHMvcHVibGljLWtleScsIHtcbiAgICAgICAgb3duZXIsXG4gICAgICAgIHJlcG8sXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHsga2V5LCBrZXlfaWQ6IGtleUlkIH0gPSByZXNwb25zZS5kYXRhO1xuXG4gICAgICBhd2FpdCBzb2RpdW0ucmVhZHk7XG5cbiAgICAgIGZvciAoY29uc3QgW25hbWUsIHNlY3JldF0gb2YgT2JqZWN0LmVudHJpZXMocGFyc2VkKSkge1xuICAgICAgICBpZiAoY29uZmlnLmlzUHVibGljUmVwbyAmJiBuYW1lID09PSAnR0hfQk9UX1BBVCcpIGNvbnRpbnVlO1xuICAgICAgICBpZiAoIWNvbmZpZy5pc1B1YmxpY1JlcG8gJiYgbmFtZSA9PT0gJ1BVQkxJQ19HSF9CT1RfUEFUJykgY29udGludWU7XG5cbiAgICAgICAgLy8gQ29udmVydCBTZWNyZXQgJiBCYXNlNjQga2V5IHRvIFVpbnQ4QXJyYXkuXG4gICAgICAgIGNvbnN0IHJhd0tleSA9IHNvZGl1bS5mcm9tX2Jhc2U2NChrZXksIHNvZGl1bS5iYXNlNjRfdmFyaWFudHMuT1JJR0lOQUwpO1xuICAgICAgICBjb25zdCByYXdTZWMgPSBzb2RpdW0uZnJvbV9zdHJpbmcoc2VjcmV0KTtcblxuICAgICAgICAvLyBFbmNyeXB0IHRoZSBzZWNyZXQgdXNpbmcgTGliU29kaXVtXG4gICAgICAgIGNvbnN0IGVuY0J5dGVzID0gc29kaXVtLmNyeXB0b19ib3hfc2VhbChyYXdTZWMsIHJhd0tleSk7XG5cbiAgICAgICAgLy8gQ29udmVydCBlbmNyeXB0ZWQgVWludDhBcnJheSB0byBCYXNlNjRcbiAgICAgICAgY29uc3QgZW5jQmFzZTY0ID0gc29kaXVtLnRvX2Jhc2U2NChlbmNCeXRlcywgc29kaXVtLmJhc2U2NF92YXJpYW50cy5PUklHSU5BTCk7XG5cbiAgICAgICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvc2VjcmV0cy97c2VjcmV0X25hbWV9Jywge1xuICAgICAgICAgIG93bmVyLFxuICAgICAgICAgIHJlcG8sXG4gICAgICAgICAgc2VjcmV0X25hbWU6IG5hbWUsXG4gICAgICAgICAgZW5jcnlwdGVkX3ZhbHVlOiBlbmNCYXNlNjQsXG4gICAgICAgICAga2V5X2lkOiBrZXlJZCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybignU2tpcCBzZXR1cFNlY3JldHMgZHVlIHRvOicsIChlcnJvciBhcyBFcnJvcik/LnN0YWNrID8/IGVycm9yKTtcbiAgICB9XG4gIH0pO1xufVxuIiwiaW1wb3J0IHsgd2l0aFJldHJ5IH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWInO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdpdEh1YlV0aWwsIG9jdG9raXQgfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwR2l0SHViU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IFtvd25lciwgcmVwb10gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUoY29uZmlnLnJlcG9zaXRvcnkgPz8gJycpO1xuICBpZiAoIW93bmVyIHx8ICFyZXBvKSByZXR1cm47XG4gIGlmIChvd25lciAhPT0gJ1dpbGxCb29zdGVyJyAmJiBvd25lciAhPT0gJ1dpbGxCb29zdGVyTGFiJykgcmV0dXJuO1xuXG4gIGF3YWl0IHdpdGhSZXRyeSgoKSA9PlxuICAgIG9jdG9raXQucmVxdWVzdCgnUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99Jywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgYWxsb3dfbWVyZ2VfY29tbWl0OiBmYWxzZSxcbiAgICAgIGFsbG93X3NxdWFzaF9tZXJnZTogdHJ1ZSxcbiAgICAgIGFsbG93X3JlYmFzZV9tZXJnZTogZmFsc2UsXG4gICAgICBkZWxldGVfYnJhbmNoX29uX21lcmdlOiB0cnVlLFxuICAgICAgc3F1YXNoX21lcmdlX2NvbW1pdF90aXRsZTogJ1BSX1RJVExFJyxcbiAgICAgIHNxdWFzaF9tZXJnZV9jb21taXRfbWVzc2FnZTogJ0JMQU5LJyxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ1gtR2l0SHViLUFwaS1WZXJzaW9uJzogJzIwMjItMTEtMjgnLFxuICAgICAgfSxcbiAgICAgIC4uLihjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyLycpID8geyBhbGxvd19hdXRvX21lcmdlOiB0cnVlIH0gOiB7fSksXG4gICAgfSlcbiAgKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGRpc3RhbmNlIH0gZnJvbSAnZmFzdGVzdC1sZXZlbnNodGVpbic7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgdGVtcGxhdGVzID0ge1xuICAncHVsbF9yZXF1ZXN0X3RlbXBsYXRlLm1kJzogYFxuQ2xvc2UgIzxJc3N1ZU51bWJlcj5cblxuIyMgU2VsZiBDaGVja1xuXG4tIFsgXSBJJ3ZlIGNvbmZpcm1lZCBcXGBBbGwgY2hlY2tzIGhhdmUgcGFzc2VkXFxgIG9uIHRoaXMgcGFnZS4g77yI44GT44Gu44Oa44O844K444GnIFxcYEFsbCBjaGVja3MgaGF2ZSBwYXNzZWRcXGAg44GM6KGo56S644GV44KM44Gm44GE44KL44GT44Go44KS56K66KqN44GX44Gf44CC77yJXG4gIC0gWW91IG1heSBsZWF2ZSB0aGlzIGJveCB1bmNoZWNrZWQgZHVlIHRvIGxvbmcgd29ya2Zsb3dzLlxuICAtIFBSIHRpdGxlIGZvbGxvd3MgW0FuZ3VsYXIncyBjb21taXQgbWVzc2FnZSBmb3JtYXRdKGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvYmxvYi9tYWluL0NPTlRSSUJVVElORy5tZCMtY29tbWl0LW1lc3NhZ2UtZm9ybWF0KS5cbiAgICAtIFBSIHRpdGxlIGRvZXNuJ3QgaGF2ZSBcXGBXSVA6XFxgLlxuICAtIEFsbCB0ZXN0cyBhcmUgcGFzc2VkLlxuICAgIC0gVGVzdCBjb21tYW5kIChlLmcuLCBcXGB5YXJuIHRlc3RcXGApIGlzIHBhc3NlZC5cbiAgICAtIExpbnQgY29tbWFuZCAoZS5nLiwgXFxgeWFybiBsaW50XFxgKSBpcyBwYXNzZWQuXG4tIFsgXSBJJ3ZlIHJldmlld2VkIG15IGNoYW5nZXMgb24gR2l0SHViIFBSJ3MgZGlmZiB2aWV3LiDvvIhHaXRIdWLkuIrjgafoh6rliIbjga7lpInmm7TlhoXlrrnjgpLnorroqo3jgZfjgZ/jgILvvIlcbi0gWyBdIEkndmUgd3JpdHRlbiB0aGUgc3RlcHMgdG8gdGVzdC4g77yI44OG44K544OI5omL6aCG44KS6KiY6LyJ44GX44Gf44CC77yJXG4tIFsgXSBJJ3ZlIGFkZGVkIHNjcmVlbnNob3RzLiDvvIhVSeOCkuWkieabtOOBl+OBn+WgtOWQiOOAgeOCueOCr+ODquODvOODs+OCt+ODp+ODg+ODiOOCkui/veWKoOOBl+OBn+OAgu+8iVxuICAtIFlvdSBtYXkgbGVhdmUgdGhpcyBib3ggdW5jaGVja2VkIGlmIHlvdSBkaWRuJ3QgbW9kaWZ5IHRoZSBVSS5cblxuPCEtLSBQbGVhc2UgYWRkIHNjcmVlbnNob3RzIGlmIHlvdSBtb2RpZnkgdGhlIFVJLlxufCBDdXJyZW50ICAgICAgICAgICAgICAgICAgfCBJbiBjb21pbmcgICAgICAgICAgICAgICAgfFxufCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfFxufCA8aW1nIHNyYz1cIlwiIHdpZHRoPVwiNDAwXCI+IHwgPGltZyBzcmM9XCJcIiB3aWR0aD1cIjQwMFwiPiB8XG4tLT5cblxuIyMgU3RlcHMgdG8gVGVzdFxuXG4xLiBPcGVuIGh0dHA6Ly9sb2NhbGhvc3QtZXhlcmNvZGUud2lsbGJvb3N0ZXIubmV0OjMwMDAvamEtSlAvY291cnNlcy9fZXhhbXBsZS9sZXNzb25zL19leGFtcGxlX2FfcGx1c19iL3Byb2JsZW1zL19leGFtcGxlX2FfcGx1c19iIGFmdGVyIGxvZ2luLlxuMi4gU2VsZWN0IHRoZSBsYW5ndWFnZSBcXGBDXFxgLlxuMy4gV3JpdGUgdGhlIGZvbGxvd2luZyBjb2RlOlxuICAgXFxgXFxgXFxgY1xuICAgI2luY2x1ZGUgPHN0ZGlvLmg+XG5cbiAgIGludCBtYWluKHZvaWQpIHtcbiAgICAgaW50IGEsIGI7XG5cbiAgICAgc2NhbmYoXCIlZCAlZFwiLCAmYSwgJmIpO1xuICAgICBwcmludGYoXCIlZFwiLCBhICsgYik7XG4gICAgIHJldHVybiAwO1xuICAgfVxuICAgXFxgXFxgXFxgXG40LiBQdXNoIFxcYFN1Ym1pdFxcYCBidXR0b24uXG41LiAuLi5cblxuPCEtLSDml6XmnKzoqp7jgafoqJjov7DjgZfjgabjgoLlpKfkuIjlpKvjgafjgZnjgIIgLS0+XG5gLnRyaW0oKSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcycsIGFzeW5jICgpID0+IHtcbiAgICBmb3IgKGNvbnN0IFtmaWxlTmFtZSwgbmV3Q29udGVudF0gb2YgT2JqZWN0LmVudHJpZXModGVtcGxhdGVzKSkge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aHViJywgZmlsZU5hbWUpO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSB7XG4gICAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgICAgaWYgKGRpc3RhbmNlKG9sZENvbnRlbnQsIG5ld0NvbnRlbnQpID4gbmV3Q29udGVudC5sZW5ndGggLyAyKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gICAgfVxuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBmc3AgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBnbG9iYnlTeW5jIH0gZnJvbSAnZ2xvYmJ5JztcbmltcG9ydCB7IHNpbXBsZUdpdCB9IGZyb20gJ3NpbXBsZS1naXQnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5pbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcblxuaW1wb3J0IHsgZ2l0SHViVXRpbCwgb2N0b2tpdCB9IGZyb20gJy4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFja2FnZUNvbmZpZyB7XG4gIGRpclBhdGg6IHN0cmluZztcbiAgZG9ja2VyZmlsZTogc3RyaW5nO1xuICBpc1Jvb3Q6IGJvb2xlYW47XG4gIGlzUHVibGljUmVwbzogYm9vbGVhbjtcbiAgaXNSZWZlcnJlZEJ5T3RoZXJSZXBvOiBib29sZWFuO1xuICByZXBvc2l0b3J5Pzogc3RyaW5nO1xuICBpc0J1bjogYm9vbGVhbjtcbiAgaXNFc21QYWNrYWdlOiBib29sZWFuO1xuICBpc1dpbGxCb29zdGVyQ29uZmlnczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5zU3ViUGFja2FnZUpzb25zOiBib29sZWFuO1xuICBkb2VzQ29udGFpbnNEb2NrZXJmaWxlOiBib29sZWFuO1xuICBkb2VzQ29udGFpbnNHZW1maWxlOiBib29sZWFuO1xuICBkb2VzQ29udGFpbnNHb01vZDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5zUGFja2FnZUpzb246IGJvb2xlYW47XG4gIGRvZXNDb250YWluc1BvZXRyeUxvY2s6IGJvb2xlYW47XG4gIGRvZXNDb250YWluc1BvbVhtbDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5zUHVic3BlY1lhbWw6IGJvb2xlYW47XG4gIGRvZXNDb250YWluc1RlbXBsYXRlWWFtbDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5zVnNjb2RlU2V0dGluZ3NKc29uOiBib29sZWFuO1xuXG4gIGRvZXNDb250YWluc0phdmFTY3JpcHQ6IGJvb2xlYW47XG4gIGRvZXNDb250YWluc1R5cGVTY3JpcHQ6IGJvb2xlYW47XG4gIGRvZXNDb250YWluc0pzeE9yVHN4OiBib29sZWFuO1xuICBkb2VzQ29udGFpbnNKYXZhU2NyaXB0SW5QYWNrYWdlczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5zVHlwZVNjcmlwdEluUGFja2FnZXM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluc0pzeE9yVHN4SW5QYWNrYWdlczogYm9vbGVhbjtcbiAgZGVwZW5kaW5nOiB7XG4gICAgYmxpdHo6IGJvb2xlYW47XG4gICAgZmlyZWJhc2U6IGJvb2xlYW47XG4gICAgbGl0ZXN0cmVhbTogYm9vbGVhbjtcbiAgICBuZXh0OiBib29sZWFuO1xuICAgIHBsYXl3cmlnaHRUZXN0OiBib29sZWFuO1xuICAgIHByaXNtYTogYm9vbGVhbjtcbiAgICBweXJpZ2h0OiBib29sZWFuO1xuICAgIHJlYWN0TmF0aXZlOiBib29sZWFuO1xuICAgIHNlbWFudGljUmVsZWFzZTogYm9vbGVhbjtcbiAgICBzdG9yeWJvb2s6IGJvb2xlYW47XG4gICAgd2I6IGJvb2xlYW47XG4gIH07XG4gIHJlbGVhc2U6IHtcbiAgICBicmFuY2hlczogc3RyaW5nW107XG4gICAgZ2l0aHViOiBib29sZWFuO1xuICAgIG5wbTogYm9vbGVhbjtcbiAgfTtcbiAgZXNsaW50QmFzZT86IEVzbGludEV4dGVuc2lvbkJhc2U7XG4gIHZlcnNpb25zVGV4dD86IHN0cmluZztcbiAgcGFja2FnZUpzb24/OiBQYWNrYWdlSnNvbjtcbiAgd2JmeUpzb24/OiBXYmZ5SnNvbjtcbn1cblxudHlwZSBXYmZ5SnNvbiA9IHouaW5mZXI8dHlwZW9mIHdiZnlKc29uU2NoZW1hPjtcblxuY29uc3Qgd2JmeUpzb25TY2hlbWEgPSB6Lm9iamVjdCh7XG4gIHR5cG9zOiB6XG4gICAgLm9iamVjdCh7XG4gICAgICBhbGw6IHoucmVjb3JkKHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgICBkb2M6IHoucmVjb3JkKHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgICB0czogei5yZWNvcmQoei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICAgIHRleHQ6IHoucmVjb3JkKHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgfSlcbiAgICAub3B0aW9uYWwoKSxcbn0pO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UGFja2FnZUNvbmZpZyhcbiAgZGlyUGF0aDogc3RyaW5nLFxuICByb290Q29uZmlnPzogUGFja2FnZUNvbmZpZ1xuKTogUHJvbWlzZTxQYWNrYWdlQ29uZmlnIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIHRyeSB7XG4gICAgY29uc3QgZG9lc0NvbnRhaW5zUGFja2FnZUpzb24gPSBmcy5leGlzdHNTeW5jKHBhY2thZ2VKc29uUGF0aCk7XG4gICAgbGV0IGRlcGVuZGVuY2llczogUGFja2FnZUpzb25bJ2RlcGVuZGVuY2llcyddID0ge307XG4gICAgbGV0IGRldkRlcGVuZGVuY2llczogUGFja2FnZUpzb25bJ2RldkRlcGVuZGVuY2llcyddID0ge307XG4gICAgbGV0IHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiA9IHt9O1xuICAgIGxldCBlc21QYWNrYWdlID0gZmFsc2U7XG4gICAgaWYgKGRvZXNDb250YWluc1BhY2thZ2VKc29uKSB7XG4gICAgICBjb25zdCBwYWNrYWdlSnNvblRleHQgPSBmcy5yZWFkRmlsZVN5bmMocGFja2FnZUpzb25QYXRoLCAndXRmOCcpO1xuICAgICAgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKHBhY2thZ2VKc29uVGV4dCk7XG4gICAgICBkZXBlbmRlbmNpZXMgPSBwYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge307XG4gICAgICBkZXZEZXBlbmRlbmNpZXMgPSBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gICAgICBlc21QYWNrYWdlID0gcGFja2FnZUpzb24udHlwZSA9PT0gJ21vZHVsZSc7XG4gICAgfVxuXG4gICAgbGV0IHJlbGVhc2VCcmFuY2hlczogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgcmVsZWFzZVBsdWdpbnM6IHN0cmluZ1tdID0gW107XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlbGVhc2VyY0pzb25QYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICcucmVsZWFzZXJjLmpzb24nKTtcbiAgICAgIGNvbnN0IGpzb24gPSBKU09OLnBhcnNlKGF3YWl0IGZzcC5yZWFkRmlsZShyZWxlYXNlcmNKc29uUGF0aCwgJ3V0ZjgnKSk7XG4gICAgICByZWxlYXNlQnJhbmNoZXMgPSBqc29uPy5icmFuY2hlcyB8fCBbXTtcbiAgICAgIHJlbGVhc2VQbHVnaW5zID0ganNvbj8ucGx1Z2lucz8uZmxhdCgpIHx8IFtdO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cblxuICAgIGNvbnN0IGlzUm9vdCA9XG4gICAgICBwYXRoLmJhc2VuYW1lKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLi4nKSkgIT09ICdwYWNrYWdlcycgfHxcbiAgICAgICFmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLi4nLCAnLi4nLCAncGFja2FnZS5qc29uJykpO1xuXG4gICAgbGV0IHJlcG9JbmZvOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICBpZiAoaXNSb290KSB7XG4gICAgICByZXBvSW5mbyA9IGF3YWl0IGZldGNoUmVwb0luZm8oZGlyUGF0aCwgcGFja2FnZUpzb24pO1xuICAgIH1cblxuICAgIGxldCB2ZXJzaW9uc1RleHQgPSAnJztcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzcC5yZWFkRmlsZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy50b29sLXZlcnNpb25zJyksICd1dGY4Jyk7XG4gICAgICB2ZXJzaW9uc1RleHQgKz0gY29udGVudC50cmltKCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICAgIGZvciAoY29uc3QgW3ByZWZpeCwgbmFtZV0gb2YgW1xuICAgICAgWydqYXZhJywgJ2phdmEnXSxcbiAgICAgIFsnbm9kZScsICdub2RlanMnXSxcbiAgICAgIFsncHl0aG9uJywgJ3B5dGhvbiddLFxuICAgIF0pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IG5vZGVWZXJzaW9uQ29udGVudCA9IGF3YWl0IGZzcC5yZWFkRmlsZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgYC4ke3ByZWZpeH0tdmVyc2lvbmApLCAndXRmOCcpO1xuICAgICAgICBpZiAodmVyc2lvbnNUZXh0KSB7XG4gICAgICAgICAgdmVyc2lvbnNUZXh0ICs9ICdcXG4nO1xuICAgICAgICB9XG4gICAgICAgIHZlcnNpb25zVGV4dCArPSBuYW1lICsgJyAnICsgbm9kZVZlcnNpb25Db250ZW50LnRyaW0oKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGRvY2tlcmZpbGUgPSAnJztcbiAgICB0cnkge1xuICAgICAgZG9ja2VyZmlsZSA9IGF3YWl0IGZzcC5yZWFkRmlsZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ0RvY2tlcmZpbGUnKSwgJ3V0ZjgnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICAvLyBSZWFkIHdiZnkuanNvblxuICAgIGNvbnN0IHdiZnlKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnd2JmeS5qc29uJyk7XG4gICAgbGV0IHdiZnlKc29uOiBXYmZ5SnNvbiB8IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgd2JmeUpzb25UZXh0ID0gYXdhaXQgZnNwLnJlYWRGaWxlKHdiZnlKc29uUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIHdiZnlKc29uID0gd2JmeUpzb25TY2hlbWEucGFyc2UoSlNPTi5wYXJzZSh3YmZ5SnNvblRleHQpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICBjb25zdCBjb25maWc6IFBhY2thZ2VDb25maWcgPSB7XG4gICAgICBkaXJQYXRoLFxuICAgICAgZG9ja2VyZmlsZSxcbiAgICAgIGlzUm9vdCxcbiAgICAgIGlzUHVibGljUmVwbzogcmVwb0luZm8/LnByaXZhdGUgPT09IGZhbHNlLFxuICAgICAgaXNSZWZlcnJlZEJ5T3RoZXJSZXBvOiAhIXBhY2thZ2VKc29uLmZpbGVzLFxuICAgICAgcmVwb3NpdG9yeTogcmVwb0luZm8/LmZ1bGxfbmFtZSA/IGBnaXRodWI6JHtyZXBvSW5mbz8uZnVsbF9uYW1lfWAgOiB1bmRlZmluZWQsXG4gICAgICBpc0J1bjogcm9vdENvbmZpZz8uaXNCdW4gfHwgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ2J1bmZpZy50b21sJykpLFxuICAgICAgaXNFc21QYWNrYWdlOiBlc21QYWNrYWdlLFxuICAgICAgaXNXaWxsQm9vc3RlckNvbmZpZ3M6IHBhY2thZ2VKc29uUGF0aC5pbmNsdWRlcyhgJHtwYXRoLnNlcH13aWxsYm9vc3Rlci1jb25maWdzYCksXG4gICAgICBkb2VzQ29udGFpbnNTdWJQYWNrYWdlSnNvbnM6IGNvbnRhaW5zQW55KCdwYWNrYWdlcy8qKi9wYWNrYWdlLmpzb24nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluc0RvY2tlcmZpbGU6ICEhZG9ja2VyZmlsZSB8fCBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnZG9ja2VyLWNvbXBvc2UueW1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5zR2VtZmlsZTogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ0dlbWZpbGUnKSksXG4gICAgICBkb2VzQ29udGFpbnNHb01vZDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2dvLm1vZCcpKSxcbiAgICAgIGRvZXNDb250YWluc1BhY2thZ2VKc29uOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncGFja2FnZS5qc29uJykpLFxuICAgICAgZG9lc0NvbnRhaW5zUG9ldHJ5TG9jazogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BvZXRyeS5sb2NrJykpLFxuICAgICAgZG9lc0NvbnRhaW5zUG9tWG1sOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncG9tLnhtbCcpKSxcbiAgICAgIGRvZXNDb250YWluc1B1YnNwZWNZYW1sOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncHVic3BlYy55YW1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5zVGVtcGxhdGVZYW1sOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAndGVtcGxhdGUueWFtbCcpKSxcbiAgICAgIGRvZXNDb250YWluc1ZzY29kZVNldHRpbmdzSnNvbjogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy52c2NvZGUnLCAnc2V0dGluZ3MuanNvbicpKSxcbiAgICAgIGRvZXNDb250YWluc0phdmFTY3JpcHQ6IGNvbnRhaW5zQW55KCd7YXBwLHNyYyx0ZXN0cyxzY3JpcHRzfS8qKi8qLntjanMsbWpzLGpzLGpzeH0nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluc1R5cGVTY3JpcHQ6IGNvbnRhaW5zQW55KCd7YXBwLHNyYyx0ZXN0cyxzY3JpcHRzfS8qKi8qLntjdHMsbXRzLHRzLHRzeH0nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluc0pzeE9yVHN4OiBjb250YWluc0FueSgne2FwcCxzcmMsdGVzdHN9LyoqLyoue3Qsan1zeCcsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5zSmF2YVNjcmlwdEluUGFja2FnZXM6IGNvbnRhaW5zQW55KFxuICAgICAgICAncGFja2FnZXMvKiove2FwcCxzcmMsdGVzdHMsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3h9JyxcbiAgICAgICAgZGlyUGF0aFxuICAgICAgKSxcbiAgICAgIGRvZXNDb250YWluc1R5cGVTY3JpcHRJblBhY2thZ2VzOiBjb250YWluc0FueShcbiAgICAgICAgJ3BhY2thZ2VzLyoqL3thcHAsc3JjLHRlc3RzLHNjcmlwdHN9LyoqLyoue2N0cyxtdHMsdHMsdHN4fScsXG4gICAgICAgIGRpclBhdGhcbiAgICAgICksXG4gICAgICBkb2VzQ29udGFpbnNKc3hPclRzeEluUGFja2FnZXM6IGNvbnRhaW5zQW55KCdwYWNrYWdlcy8qKi97YXBwLHNyYyx0ZXN0c30vKiovKi57dCxqfXN4JywgZGlyUGF0aCksXG4gICAgICBkZXBlbmRpbmc6IHtcbiAgICAgICAgYmxpdHo6ICEhZGVwZW5kZW5jaWVzWydibGl0eiddLFxuICAgICAgICBmaXJlYmFzZTogISFkZXZEZXBlbmRlbmNpZXNbJ2ZpcmViYXNlLXRvb2xzJ10sXG4gICAgICAgIGxpdGVzdHJlYW06IGRvY2tlcmZpbGUuaW5jbHVkZXMoJ2luc3RhbGwtbGl0ZXN0cmVhbS5zaCcpLFxuICAgICAgICBuZXh0OiAhIWRlcGVuZGVuY2llc1snbmV4dCddLFxuICAgICAgICBwbGF5d3JpZ2h0VGVzdDpcbiAgICAgICAgICAhIWRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddIHx8XG4gICAgICAgICAgISFkZXZEZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXSB8fFxuICAgICAgICAgICEhZGV2RGVwZW5kZW5jaWVzWydwbGF5d3JpZ2h0J10sXG4gICAgICAgIHByaXNtYTogISFkZXBlbmRlbmNpZXNbJ0BwcmlzbWEvY2xpZW50J10gfHwgISFkZXZEZXBlbmRlbmNpZXNbJ3ByaXNtYSddLFxuICAgICAgICBweXJpZ2h0OiAhIWRldkRlcGVuZGVuY2llc1sncHlyaWdodCddLFxuICAgICAgICByZWFjdE5hdGl2ZTogISFkZXBlbmRlbmNpZXNbJ3JlYWN0LW5hdGl2ZSddLFxuICAgICAgICBzZW1hbnRpY1JlbGVhc2U6ICEhKFxuICAgICAgICAgIGRldkRlcGVuZGVuY2llc1snc2VtYW50aWMtcmVsZWFzZSddIHx8XG4gICAgICAgICAgcmVsZWFzZUJyYW5jaGVzLmxlbmd0aCA+IDAgfHxcbiAgICAgICAgICByZWxlYXNlUGx1Z2lucy5sZW5ndGggPiAwXG4gICAgICAgICksXG4gICAgICAgIHN0b3J5Ym9vazogISFkZXZEZXBlbmRlbmNpZXNbJ0BzdG9yeWJvb2svcmVhY3QnXSxcbiAgICAgICAgd2I6ICEhZGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvd2InXSB8fCAhIWRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3diJ10sXG4gICAgICB9LFxuICAgICAgcmVsZWFzZToge1xuICAgICAgICBicmFuY2hlczogcmVsZWFzZUJyYW5jaGVzLFxuICAgICAgICBnaXRodWI6IHJlbGVhc2VQbHVnaW5zLmluY2x1ZGVzKCdAc2VtYW50aWMtcmVsZWFzZS9naXRodWInKSxcbiAgICAgICAgbnBtOiByZWxlYXNlUGx1Z2lucy5pbmNsdWRlcygnQHNlbWFudGljLXJlbGVhc2UvbnBtJyksXG4gICAgICB9LFxuICAgICAgdmVyc2lvbnNUZXh0LFxuICAgICAgcGFja2FnZUpzb24sXG4gICAgICB3YmZ5SnNvbixcbiAgICB9O1xuICAgIGlmICghY29uZmlnLmlzQnVuKSB7XG4gICAgICBjb25maWcuZXNsaW50QmFzZSA9IGdldEVzbGludEV4dGVuc2lvbkJhc2UoY29uZmlnKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgY29uZmlnLmRvZXNDb250YWluc0dlbWZpbGUgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbnNHb01vZCB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluc1BhY2thZ2VKc29uIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5zUG9ldHJ5TG9jayB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluc1BvbVhtbCB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluc1B1YnNwZWNZYW1sIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5zVGVtcGxhdGVZYW1sXG4gICAgKSB7XG4gICAgICByZXR1cm4gY29uZmlnO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbnRhaW5zQW55KHBhdHRlcm46IHN0cmluZywgZGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBnbG9iYnlTeW5jKHBhdHRlcm4sIHsgZG90OiB0cnVlLCBjd2Q6IGRpclBhdGggfSkubGVuZ3RoID4gMDtcbn1cblxuZXhwb3J0IHR5cGUgRXNsaW50RXh0ZW5zaW9uQmFzZSA9XG4gIHwgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzLXJlYWN0J1xuICB8ICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cydcbiAgfCAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMtcmVhY3QnXG4gIHwgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzJ1xuICB8ICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1uZXh0J1xuICB8ICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1ibGl0ei1uZXh0JztcblxuZnVuY3Rpb24gZ2V0RXNsaW50RXh0ZW5zaW9uQmFzZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBFc2xpbnRFeHRlbnNpb25CYXNlIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHopIHtcbiAgICByZXR1cm4gJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWJsaXR6LW5leHQnO1xuICB9IGVsc2UgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgIHJldHVybiAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctbmV4dCc7XG4gIH0gZWxzZSBpZiAoY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHQpIHtcbiAgICByZXR1cm4gY29uZmlnLmRvZXNDb250YWluc0pzeE9yVHN4ID8gJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzLXJlYWN0JyA6ICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cyc7XG4gIH0gZWxzZSB7XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNKc3hPclRzeCkge1xuICAgICAgcmV0dXJuICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcy1yZWFjdCc7XG4gICAgfSBlbHNlIGlmIChjb25maWcuZG9lc0NvbnRhaW5zSmF2YVNjcmlwdCkge1xuICAgICAgcmV0dXJuICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcyc7XG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoUmVwb0luZm8oZGlyUGF0aDogc3RyaW5nLCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGdpdCA9IHNpbXBsZUdpdChkaXJQYXRoKTtcbiAgY29uc3QgcmVtb3RlcyA9IGF3YWl0IGdpdC5nZXRSZW1vdGVzKHRydWUpO1xuICBjb25zdCBvcmlnaW4gPSByZW1vdGVzLmZpbmQoKHIpID0+IHIubmFtZSA9PT0gJ29yaWdpbicpO1xuICBjb25zdCByZW1vdGVVcmwgPSBvcmlnaW4/LnJlZnM/LmZldGNoID8/IG9yaWdpbj8ucmVmcz8ucHVzaDtcbiAgaWYgKHR5cGVvZiByZW1vdGVVcmwgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QganNvbiA9IGF3YWl0IHJlcXVlc3RSZXBvSW5mbyhyZW1vdGVVcmwpO1xuICAgIGlmIChqc29uKSByZXR1cm4ganNvbjtcbiAgfVxuXG4gIGNvbnN0IHVybCA9IHR5cGVvZiBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5ID09PSAnc3RyaW5nJyA/IHBhY2thZ2VKc29uLnJlcG9zaXRvcnkgOiBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5Py51cmw7XG4gIGlmICh1cmwpIHtcbiAgICBjb25zdCBqc29uID0gYXdhaXQgcmVxdWVzdFJlcG9JbmZvKHVybCk7XG4gICAgaWYgKGpzb24gJiYganNvbi5tZXNzYWdlICE9PSAnTm90IEZvdW5kJykgcmV0dXJuIGpzb247XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVxdWVzdFJlcG9JbmZvKHVybE9yRnVsbE5hbWU6IHN0cmluZyk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgW29yZywgbmFtZV0gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUodXJsT3JGdWxsTmFtZSk7XG4gIGlmICghb3JnIHx8ICFuYW1lKSByZXR1cm47XG5cbiAgY29uc3QgcmV0ID0geyBmdWxsX25hbWU6IGAke29yZ30vJHtuYW1lfWAgfTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG9jdG9raXQucmVxdWVzdCgnR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfScsIHtcbiAgICAgIG93bmVyOiBvcmcsXG4gICAgICByZXBvOiBuYW1lLFxuICAgIH0pO1xuICAgIE9iamVjdC5hc3NpZ24ocmV0LCByZXNwb25zZS5kYXRhKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG4gIHJldHVybiByZXQ7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBpZ25vcmVFcnJvckFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWInO1xuaW1wb3J0IHlhcmdzIGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZml4RG9ja2VyZmlsZSB9IGZyb20gJy4vZml4ZXJzL2RvY2tlcmZpbGUuanMnO1xuaW1wb3J0IHsgZml4UGxheXdyaWdodENvbmZpZyB9IGZyb20gJy4vZml4ZXJzL3BsYXl3cmlnaHRDb25maWcuanMnO1xuaW1wb3J0IHsgZml4UHJpc21hRW52RmlsZXMgfSBmcm9tICcuL2ZpeGVycy9wcmlzbWEuanMnO1xuaW1wb3J0IHsgZml4VGVzdERpcmVjdG9yaWVzVXBkYXRpbmdQYWNrYWdlSnNvbiB9IGZyb20gJy4vZml4ZXJzL3Rlc3REaXJlY3RvcnkuanMnO1xuaW1wb3J0IHsgZml4VHlwZURlZmluaXRpb25zIH0gZnJvbSAnLi9maXhlcnMvdHlwZURlZmluaXRpb24uanMnO1xuaW1wb3J0IHsgZml4VHlwb3MgfSBmcm9tICcuL2ZpeGVycy90eXBvcy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVRvb2xWZXJzaW9ucyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9hc2RmLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlQmlvbWVKc29uYyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9iaW9tZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUJ1bmZpZ1RvbWwgfSBmcm9tICcuL2dlbmVyYXRvcnMvYnVuZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlRG9ja2VyaWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2RvY2tlcmlnbm9yZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUVkaXRvcmNvbmZpZyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9lZGl0b3Jjb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVFc2xpbnRpZ25vcmUgfSBmcm9tICcuL2dlbmVyYXRvcnMvZXNsaW50aWdub3JlLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlRXNsaW50cmMgfSBmcm9tICcuL2dlbmVyYXRvcnMvZXNsaW50cmMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dpdGF0dHJpYnV0ZXMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVHaXRpZ25vcmUgfSBmcm9tICcuL2dlbmVyYXRvcnMvZ2l0aWdub3JlLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlSHVza3lyY1VwZGF0aW5nUGFja2FnZUpzb24gfSBmcm9tICcuL2dlbmVyYXRvcnMvaHVza3lyYy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUlkZWFTZXR0aW5ncyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9pZGVhLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlTGVmdGhvb2tVcGRhdGluZ1BhY2thZ2VKc29uIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2xlZnRob29rLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlTGludHN0YWdlZHJjIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2xpbnRzdGFnZWRyYy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZU5leHRDb25maWdKc29uIH0gZnJvbSAnLi9nZW5lcmF0b3JzL25leHRjb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVQYWNrYWdlSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9wYWNrYWdlSnNvbi5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVByZXR0aWVyaWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3ByZXR0aWVyaWdub3JlLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24gfSBmcm9tICcuL2dlbmVyYXRvcnMvcHlyaWdodGNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJlYWRtZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9yZWFkbWUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVSZWxlYXNlcmMgfSBmcm9tICcuL2dlbmVyYXRvcnMvcmVsZWFzZXJjLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUmVub3ZhdGVKc29uIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3Jlbm92YXRlcmMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVUc2NvbmZpZyB9IGZyb20gJy4vZ2VuZXJhdG9ycy90c2NvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVZzY29kZVNldHRpbmdzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3ZzY29kZVNldHRpbmdzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlV29ya2Zsb3dzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3dvcmtmbG93LmpzJztcbmltcG9ydCB7IGdlbmVyYXRlWWFybnJjWW1sIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3lhcm5yYy5qcyc7XG5pbXBvcnQgeyBzZXR1cExhYmVscyB9IGZyb20gJy4vZ2l0aHViL2xhYmVsLmpzJztcbmltcG9ydCB7IHNldHVwU2VjcmV0cyB9IGZyb20gJy4vZ2l0aHViL3NlY3JldC5qcyc7XG5pbXBvcnQgeyBzZXR1cEdpdEh1YlNldHRpbmdzIH0gZnJvbSAnLi9naXRodWIvc2V0dGluZ3MuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMgfSBmcm9tICcuL2dpdGh1Yi90ZW1wbGF0ZS5qcyc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi9vcHRpb25zLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZXRQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMgfSBmcm9tICcuL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5cbmFzeW5jIGZ1bmN0aW9uIG1haW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGFyZ3YgPSBhd2FpdCB5YXJncyhwcm9jZXNzLmFyZ3Yuc2xpY2UoMikpXG4gICAgLmNvbW1hbmQoJyQwIFtwYXRocy4uXScsICdNYWtlIGEgZ2l2ZW4gcHJvamVjdCBmb2xsb3cgdGhlIFdpbGxCb29zdGVyIHN0YW5kYXJkJywgKHlhcmdzKSA9PiB7XG4gICAgICB5YXJncy5wb3NpdGlvbmFsKCdwYXRocycsIHtcbiAgICAgICAgZGVzY3JpYmU6ICdwcm9qZWN0IHBhdGhzIHRvIGJlIHdiZmllZCcsXG4gICAgICAgIGFycmF5OiB0cnVlLFxuICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgZGVmYXVsdDogWycuJ10sXG4gICAgICB9KTtcbiAgICB9KVxuICAgIC5vcHRpb25zKHtcbiAgICAgIGVudjoge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ1VwbG9hZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXMgc2VjcmV0cyB0byBHaXRIdWInLFxuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICBhbGlhczogJ2UnLFxuICAgICAgfSxcbiAgICAgIHNraXBEZXBzOiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiAnU2tpcCBkZXBlbmRlbmN5IGluc3RhbGxhdGlvbicsXG4gICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgIGFsaWFzOiAnZCcsXG4gICAgICB9LFxuICAgICAgdmVyYm9zZToge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgb3Igbm90IHRvIGVuYWJsZSB2ZXJib3NlIG1vZGUnLFxuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICBhbGlhczogJ3YnLFxuICAgICAgfSxcbiAgICB9KVxuICAgIC5zdHJpY3QoKS5hcmd2O1xuICBvcHRpb25zLmlzVmVyYm9zZSA9IGFyZ3YudmVyYm9zZTtcbiAgb3B0aW9ucy5kb2VzVXBsb2FkRW52VmFycyA9IGFyZ3YuZW52O1xuXG4gIGZvciAoY29uc3Qgcm9vdERpclBhdGggb2YgYXJndi5wYXRocyBhcyBzdHJpbmdbXSkge1xuICAgIGNvbnN0IHBhY2thZ2VzRGlyUGF0aCA9IHBhdGguam9pbihyb290RGlyUGF0aCwgJ3BhY2thZ2VzJyk7XG4gICAgY29uc3QgZGlyZW50cyA9IChhd2FpdCBpZ25vcmVFcnJvckFzeW5jKCgpID0+IGZzLnJlYWRkaXIocGFja2FnZXNEaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpKSA/PyBbXTtcbiAgICBjb25zdCBzdWJEaXJQYXRocyA9IGRpcmVudHMuZmlsdGVyKChkKSA9PiBkLmlzRGlyZWN0b3J5KCkpLm1hcCgoZCkgPT4gcGF0aC5qb2luKHBhY2thZ2VzRGlyUGF0aCwgZC5uYW1lKSk7XG5cbiAgICBhd2FpdCBmaXhUZXN0RGlyZWN0b3JpZXNVcGRhdGluZ1BhY2thZ2VKc29uKFtyb290RGlyUGF0aCwgLi4uc3ViRGlyUGF0aHNdKTtcblxuICAgIGNvbnN0IHJvb3RDb25maWcgPSBhd2FpdCBnZXRQYWNrYWdlQ29uZmlnKHJvb3REaXJQYXRoKTtcbiAgICBpZiAoIXJvb3RDb25maWcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYHRoZXJlIGlzIG5vIHZhbGlkIHBhY2thZ2UuanNvbiBpbiAke3Jvb3REaXJQYXRofWApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGFiYnJldmlhdGlvblByb21pc2UgPSBmaXhUeXBvcyhyb290Q29uZmlnKTtcblxuICAgIGNvbnN0IG51bGxhYmxlU3ViUGFja2FnZUNvbmZpZ3MgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHN1YkRpclBhdGhzLm1hcCgoc3ViRGlyUGF0aCkgPT4gZ2V0UGFja2FnZUNvbmZpZyhzdWJEaXJQYXRoLCByb290Q29uZmlnKSlcbiAgICApO1xuICAgIGNvbnN0IHN1YlBhY2thZ2VDb25maWdzID0gbnVsbGFibGVTdWJQYWNrYWdlQ29uZmlncy5maWx0ZXIoKGNvbmZpZykgPT4gISFjb25maWcpIGFzIFBhY2thZ2VDb25maWdbXTtcbiAgICBjb25zdCBhbGxQYWNrYWdlQ29uZmlncyA9IFtyb290Q29uZmlnLCAuLi5zdWJQYWNrYWdlQ29uZmlnc107XG5cbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGZvciAoY29uc3QgY29uZmlnIG9mIGFsbFBhY2thZ2VDb25maWdzKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhjb25maWcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEluc3RhbGwgdG9vbHMgdmlhIGFzZGYgYXQgZmlyc3RcbiAgICBhd2FpdCBnZW5lcmF0ZVRvb2xWZXJzaW9ucyhyb290Q29uZmlnKTtcbiAgICAvLyBJbnN0YWxsIHlhcm4gYmVycnlcbiAgICBhd2FpdCBnZW5lcmF0ZVlhcm5yY1ltbChyb290Q29uZmlnKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBmaXhEb2NrZXJmaWxlKHJvb3RDb25maWcpLFxuICAgICAgZml4UHJpc21hRW52RmlsZXMocm9vdENvbmZpZyksXG4gICAgICBhYmJyZXZpYXRpb25Qcm9taXNlLnRoZW4oKCkgPT4gZ2VuZXJhdGVSZWFkbWUocm9vdENvbmZpZykpLFxuICAgICAgZ2VuZXJhdGVEb2NrZXJpZ25vcmUocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUVkaXRvcmNvbmZpZyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlR2l0YXR0cmlidXRlcyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlR2l0SHViVGVtcGxhdGVzKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVJZGVhU2V0dGluZ3Mocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZVJlbm92YXRlSnNvbihyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlUmVsZWFzZXJjKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVXb3JrZmxvd3Mocm9vdENvbmZpZyksXG4gICAgICBzZXR1cExhYmVscyhyb290Q29uZmlnKSxcbiAgICAgIHNldHVwU2VjcmV0cyhyb290Q29uZmlnKSxcbiAgICAgIHNldHVwR2l0SHViU2V0dGluZ3Mocm9vdENvbmZpZyksXG4gICAgICAuLi4ocm9vdENvbmZpZy5pc0J1blxuICAgICAgICA/IFtcbiAgICAgICAgICAgIGdlbmVyYXRlQnVuZmlnVG9tbChyb290Q29uZmlnKSxcbiAgICAgICAgICAgIGdlbmVyYXRlSHVza3lyY1VwZGF0aW5nUGFja2FnZUpzb24ocm9vdENvbmZpZykudGhlbigoKSA9PiBnZW5lcmF0ZUxlZnRob29rVXBkYXRpbmdQYWNrYWdlSnNvbihyb290Q29uZmlnKSksXG4gICAgICAgICAgXVxuICAgICAgICA6IFtnZW5lcmF0ZUh1c2t5cmNVcGRhdGluZ1BhY2thZ2VKc29uKHJvb3RDb25maWcpXSksXG4gICAgICBnZW5lcmF0ZUxpbnRzdGFnZWRyYyhyb290Q29uZmlnKSxcbiAgICBdKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG5cbiAgICBjb25zdCBwcm9taXNlczogUHJvbWlzZTx2b2lkPltdID0gW107XG4gICAgZm9yIChjb25zdCBjb25maWcgb2YgYWxsUGFja2FnZUNvbmZpZ3MpIHtcbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdEluUGFja2FnZXMpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChmaXhUeXBlRGVmaW5pdGlvbnMoY29uZmlnLCBjb25maWcuaXNSb290ID8gYWxsUGFja2FnZUNvbmZpZ3MgOiBbY29uZmlnXSkpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChmaXhQbGF5d3JpZ2h0Q29uZmlnKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlTmV4dENvbmZpZ0pzb24oY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBhd2FpdCBnZW5lcmF0ZUdpdGlnbm9yZShjb25maWcsIHJvb3RDb25maWcpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICAgICAgaWYgKCFjb25maWcuaXNSb290ICYmICFjb25maWcuZG9lc0NvbnRhaW5zUGFja2FnZUpzb24pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBhd2FpdCBnZW5lcmF0ZVByZXR0aWVyaWdub3JlKGNvbmZpZyk7XG4gICAgICBhd2FpdCBnZW5lcmF0ZVBhY2thZ2VKc29uKGNvbmZpZywgcm9vdENvbmZpZywgYXJndi5za2lwRGVwcyk7XG5cbiAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVMaW50c3RhZ2VkcmMoY29uZmlnKSk7XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc1ZzY29kZVNldHRpbmdzSnNvbiAmJiBjb25maWcuZG9lc0NvbnRhaW5zUGFja2FnZUpzb24pIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZVZzY29kZVNldHRpbmdzKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlVHNjb25maWcoY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIGNvbmZpZy5kb2VzQ29udGFpbnNKYXZhU2NyaXB0IHx8XG4gICAgICAgIGNvbmZpZy5kb2VzQ29udGFpbnNKYXZhU2NyaXB0SW5QYWNrYWdlcyB8fFxuICAgICAgICBjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdCB8fFxuICAgICAgICBjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdEluUGFja2FnZXNcbiAgICAgICkge1xuICAgICAgICBpZiAocm9vdENvbmZpZy5pc0J1bikge1xuICAgICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVCaW9tZUpzb25jKGNvbmZpZykpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcm9vdENvbmZpZy5pc1dpbGxCb29zdGVyQ29uZmlncykge1xuICAgICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVFc2xpbnRyYyhjb25maWcsIHJvb3RDb25maWcpKTtcbiAgICAgICAgfVxuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlRXNsaW50aWdub3JlKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHlyaWdodCkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24oY29uZmlnKSk7XG4gICAgICB9XG4gICAgfVxuICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG5cbiAgICBjb25zdCBwYWNrYWdlTWFuYWdlciA9IHJvb3RDb25maWcuaXNCdW4gPyAnYnVuJyA6ICd5YXJuJztcbiAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnY2xlYW51cCddLCByb290RGlyUGF0aCk7XG4gICAgLy8gJ3lhcm4gaW5zdGFsbCcgc2hvdWxkIGJlIGFmdGVyIGB5YXJuIGNsZWFudXBgIGJlY2F1c2UgeWFybiBiZXJyeSBnZW5lcmF0ZXMgeWFybi5sb2NrXG4gICAgLy8gY29ycmVzcG9uZGluZyB0byB0aGUgY29udGVudHMgb2YgZGVwZW5kYW50IHN1Yi1wYWNrYWdlIGluIG1vbm9yZXBvXG4gICAgaWYgKHJvb3RDb25maWcuaXNCdW4pIHtcbiAgICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWyd1cGRhdGUnXSwgcm9vdERpclBhdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnaW5zdGFsbCddLCByb290RGlyUGF0aCk7XG4gICAgfVxuICB9XG59XG5cbmF3YWl0IG1haW4oKTtcbiJdLCJuYW1lcyI6WyJvcHRpb25zIiwiY29uc3RydWN0b3IiLCJ0aGlzIiwiaXNWZXJib3NlIiwiZG9lc1VwbG9hZEVudlZhcnMiLCJsb2dnZXIiLCJmdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uIiwibmFtZSIsImZ1bmMiLCJjb25zb2xlIiwiaW5mbyIsImVycm9yIiwiRXJyb3IiLCJzdGFjayIsImFzeW5jIiwiZml4RG9ja2VyZmlsZSIsImNvbmZpZyIsImRvZXNDb250YWluc0RvY2tlcmZpbGUiLCJvbGRDb250ZW50IiwiZG9ja2VyZmlsZSIsIm5ld0NvbnRlbnQiLCJmcyIsIndyaXRlRmlsZSIsInBhdGgiLCJqb2luIiwiZGlyUGF0aCIsImZpeFBsYXl3cmlnaHRDb25maWciLCJmaWxlUGF0aCIsImV4aXN0c1N5bmMiLCJwcm9taXNlcyIsInJlYWRGaWxlIiwicmVwbGFjZSIsImZpeFByaXNtYUVudkZpbGVzIiwiZW52RmlsZXMiLCJnbG9iYnkiLCJkb3QiLCJjd2QiLCJlbnZGaWxlIiwiZW52RmlsZVBhdGgiLCJyZXNvbHZlIiwiZml4VGVzdERpcmVjdG9yaWVzVXBkYXRpbmdQYWNrYWdlSnNvbiIsInBhY2thZ2VEaXJQYXRocyIsIlByb21pc2UiLCJhbGwiLCJtYXAiLCJvbGRUZXN0RGlyUGF0aCIsInBhY2thZ2VEaXJQYXRoIiwibmV3VGVzdERpclBhdGgiLCJyZW5hbWUiLCJyZXBsYWNlQWxsIiwicHJvbWlzZVBvb2wiLCJQcm9taXNlUG9vbCIsImZpeFR5cGVEZWZpbml0aW9ucyIsImNvbmZpZ3NJbmNsdWRpbmdDaGlsZHJlbiIsImxpYlR5cGVEaXJQYXRoIiwic3JjVHlwZURpclBhdGgiLCJpc1Jvb3QiLCJkb2VzQ29udGFpbnNTdWJQYWNrYWdlSnNvbnMiLCJ1bmRlZmluZWQiLCJkaXJlbnRzIiwiaWdub3JlRW5vZW50QXN5bmMiLCJyZWFkZGlyIiwid2l0aEZpbGVUeXBlcyIsImRpcmVudCIsImRpck5hbWUiLCJzbGljZSIsImhhc1R5cGVEZWNsYXJhdGlvbkV4dGVuc2lvbiIsImVuZHNXaXRoIiwicGFja2FnZU5hbWUiLCJpbmNsdWRlcyIsImhhc0xpYnJhcnkiLCJzb21lIiwicGFja2FnZUpzb24iLCJkZXBlbmRlbmNpZXMiLCJkZXZEZXBlbmRlbmNpZXMiLCJpc0ZpbGUiLCJta2RpciIsInJ1biIsInJlY3Vyc2l2ZSIsImlzRGlyZWN0b3J5IiwiZnNVdGlsIiwicmVhZEZpbGVJZ25vcmluZ0Vycm9yIiwiZnNwIiwiZ2VuZXJhdGVGaWxlIiwiY29udGVudCIsImZpeFR5cG9zIiwicGFja2FnZUNvbmZpZyIsImRvY0ZpbGVzIiwiZ2l0aWdub3JlIiwibGVuZ3RoIiwibWRGaWxlIiwiZml4QWJicmV2aWF0aW9uc0luVGV4dCIsInJlcGxhY2VXaXRoQ29uZmlnIiwidHNGaWxlcyIsInRzRmlsZSIsInRleHRCYXNlZEZpbGVzIiwiZmlsZSIsInByb21pc2VBbGwiLCJwcm9wTmFtZSIsImJlZm9yZSIsImFmdGVyIiwiT2JqZWN0IiwiZW50cmllcyIsIndiZnlKc29uIiwidHlwb3MiLCJ0b2tlbiIsInByb2Nlc3MiLCJlbnYiLCJHSF9CT1RfUEFUIiwiUFVCTElDX0dIX0JPVF9QQVQiLCJHSF9UT0tFTiIsIkdJVEhVQl9UT0tFTiIsImhhc0dpdEh1YlRva2VuIiwib2N0b2tpdCIsIk9jdG9raXQiLCJhdXRoIiwiZ2l0SHViVXRpbCIsImdldE9yZ0FuZE5hbWUiLCJ1cmxPckZ1bGxOYW1lIiwidXJsV2l0aG91dFByb3RvY29sIiwic3BsaXQiLCJhdCIsIm5hbWVzIiwic3Bhd25TeW5jIiwiY29tbWFuZCIsImFyZ3MiLCJyZXRyeSIsIm5ld0NtZCIsIm5ld0FyZ3MiLCJnZXRTcGF3blN5bmNBcmdzIiwiY2hpbGRfcHJvY2VzcyIsInN0YXR1cyIsInNwYXduU3luY1dpdGhTdHJpbmdSZXN1bHQiLCJzdGRpbyIsInByb2MiLCJzdGRlcnIiLCJ0b1N0cmluZyIsInRyaW0iLCJzIiwic3Rkb3V0IiwiUEFUSCIsIkJFUlJZX0JJTl9GT0xERVIiLCJBU0RGX0RJUiIsInNoZWxsIiwiY29udmVydFZlcnNpb25JbnRvTnVtYmVyIiwidmVyc2lvbiIsIm51bWJlcnMiLCJOdW1iZXIiLCJmaWx0ZXIiLCJudW0iLCJpc05hTiIsInZlcnNpb25OdW1iZXIiLCJkaXZpc29yIiwiUFlUSE9OX1ZFUlNJT04iLCJKQVZBX1ZFUlNJT04iLCJCTElUWl9WRVJTSU9OIiwiTkVYVF9WRVJTSU9OIiwiZ2VuZXJhdGVUb29sVmVyc2lvbnMiLCJ2ZXJzaW9uc1RleHQiLCJkdXBsaWNhdGFibGVMaW5lcyIsImxpbmUiLCJDT1JFX1RPT0xTIiwiaGFzIiwic29ydCIsImxpbmVzIiwiU2V0IiwiZG9lc0NvbnRhaW5zUG9ldHJ5TG9jayIsInJlc3BvbnNlIiwiZmV0Y2giLCJqc29uIiwicG9ldHJ5VmVyc2lvbiIsInVwZGF0ZVZlcnNpb24iLCJkZXBlbmRpbmciLCJmaXJlYmFzZSIsImRvZXNDb250YWluc1BhY2thZ2VKc29uIiwiaXNCdW4iLCJsZWZ0aG9va1ZlcnNpb24iLCJnZXRMYXRlc3RWZXJzaW9uRnJvbVRhZ09uR2l0SHViIiwiYnVuVmVyc2lvbiIsInByZWZpeCIsIkRFUFJFQ0FURURfVkVSU0lPTl9QUkVGSVhFUyIsInZlcnNpb25QYXRoIiwicm0iLCJmb3JjZSIsInRvb2xWZXJzaW9uc1BhdGgiLCJjb3JlIiwidG9vbE5hbWUiLCJuZXdWZXJzaW9uIiwiaGVhZCIsImluZGV4IiwiZmluZEluZGV4IiwibCIsIm5ld0xpbmUiLCJzcGxpY2UiLCJvcmdhbml6YXRpb24iLCJyZXBvc2l0b3J5IiwicmVxdWVzdCIsIm93bmVyIiwicmVwbyIsImRhdGEiLCJ0YWdfbmFtZSIsImxhc3RJbmRleE9mIiwidmVyc2lvbk51bWJlclRleHQiLCJ0ZXN0Iiwib3ZlcndyaXRlTWVyZ2UiLCJkZXN0aW5hdGlvbkFycmF5Iiwic291cmNlQXJyYXkiLCJjb21iaW5lTWVyZ2UiLCJ0YXJnZXQiLCJzb3VyY2UiLCJkZXN0aW5hdGlvbiIsIml0ZW0iLCJjbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZCIsImlzTWVyZ2VhYmxlT2JqZWN0IiwibWVyZ2UiLCJwdXNoIiwianNvbk9iaiIsIiRzY2hlbWEiLCJleHRlbmRzIiwiZ2VuZXJhdGVCaW9tZUpzb25jIiwibmV3U2V0dGluZ3MiLCJjbG9uZURlZXAiLCJvbGRTZXR0aW5ncyIsIkpTT04iLCJwYXJzZSIsImFycmF5TWVyZ2UiLCJzdHJpbmdpZnkiLCJnZW5lcmF0ZUJ1bmZpZ1RvbWwiLCJ1c2VyQ29udGVudEhlYWRlciIsInVzZXJDb250ZW50SGVhZGVyUmVnZXgiLCJzZXBhcmF0b3IiLCJkZWZhdWx0SGVhZFVzZXJDb250ZW50IiwiZGVmYXVsdFRhaWxVc2VyQ29udGVudCIsImlnbm9yZUZpbGVVdGlsIiwic2VwYXJhdG9yUHJlZml4IiwicmVhZEdpdGlnbm9yZVdpdGhvdXRTZXBhcmF0b3JzIiwibGFzdEhlYWRlckluZGV4IiwiZ2V0SW5kZXhPZlRhaWxVc2VyQ29udGVudEhlYWRlciIsImdldEhlYWRVc2VyQ29udGVudCIsImluZGV4T2YiLCJnZXRUYWlsVXNlckNvbnRlbnQiLCJpc0JlcnJ5WmVyb0luc3RhbGxFbmFibGVkIiwibGFzdEluZGV4IiwiZ2VuZXJhdGVEb2NrZXJpZ25vcmUiLCJleHRlbnNpb25zIiwiY29kZVdpdGgySW5kZW50U2l6ZSIsImNvZGVXaXRoNEluZGVudFNpemUiLCJjb2RlV2l0aDhJbmRlbnRTaXplIiwibWFya2Rvd25MaWtlIiwiZXNsaW50IiwicHJldHRpZXIiLCJiaW9tZSIsImdlbmVyYXRlRXh0ZW5zaW9ucyIsImdlbmVyYXRlRWRpdG9yY29uZmlnIiwiZ2VuZXJhdGVFc2xpbnRpZ25vcmUiLCJoZWFkVXNlckNvbnRlbnQiLCJ0YWlsVXNlckNvbnRlbnQiLCJnaXRpZ25vcmVGaWxlUGF0aCIsImdlbmVyYXRlRXNsaW50cmMiLCJyb290Q29uZmlnIiwiYmFzZXMiLCJlc2xpbnRCYXNlIiwicm9vdCIsImV4dCIsInN0YXJ0c1dpdGgiLCJuZXdFeHRlbmRzIiwiYmxpdHoiLCJnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMiLCJkZWZhdWx0TmFtZXMiLCJnZW5lcmF0ZUdpdGlnbm9yZSIsImRvZXNDb250YWluc0dlbWZpbGUiLCJkb2VzQ29udGFpbnNHb01vZCIsImJhc2VuYW1lIiwiZG9lc0NvbnRhaW5zUG9tWG1sIiwiZG9lc0NvbnRhaW5zUHVic3BlY1lhbWwiLCJkb2VzQ29udGFpbnNUZW1wbGF0ZVlhbWwiLCJuZXh0IiwicHJpc21hIiwicGxheXdyaWdodFRlc3QiLCJyZWFjdE5hdGl2ZSIsInN0b3J5Ym9vayIsImxpdGVzdHJlYW0iLCJnZW5lcmF0ZWQiLCJyZWFkQ2FjaGUiLCJ1cmwiLCJyZXNwb25zZVRleHQiLCJ0ZXh0Iiwib2siLCJ3cml0ZUNhY2hlIiwib3MiLCJob21lZGlyIiwic3RhdCIsIkRhdGUiLCJub3ciLCJtdGltZU1zIiwiZ2V0TGF0ZXN0Q29tbWl0SGFzaCIsImNvbW1pdHMiLCJwZXJfcGFnZSIsInNoYSIsIkVzbGludFV0aWwiLCJnZXRMaW50Rml4U3VmZml4IiwiZG9lc0NvbnRhaW5zSnN4T3JUc3giLCJzcmNEaXJlY3RvcmllcyIsIm5vZGUiLCJnZXRTcmNEaXJzIiwianNDb21tb25EZXBzIiwidHNDb21tb25EZXBzIiwicmVhY3RDb21tb25EZXBzIiwiZXNsaW50RGVwcyIsImdlbmVyYXRlUGFja2FnZUpzb24iLCJza2lwQWRkaW5nRGVwcyIsImpzb25UZXh0Iiwic2NyaXB0cyIsInBlZXJEZXBlbmRlbmNpZXMiLCJhdXRob3IiLCJpc1dpbGxCb29zdGVyQ29uZmlncyIsImRlcHMiLCJ2YWx1ZXMiLCJkZXAiLCJyZW1vdmVEZXByZWNhdGVkU3R1ZmYiLCJrZXkiLCJ2YWx1ZSIsImdlbmVyYXRlU2NyaXB0cyIsInByZXR0aWZ5IiwiZXhpc3RpbmdDb250ZW50Iiwib3JpZ2luYWxDb250ZW50IiwiZ2VuZXJhdGVQcmV0dGllclN1ZmZpeCIsInBvZXRyeURldkRlcGVuZGVuY2llcyIsInByZXBhcmUiLCJwb3N0aW5zdGFsbCIsImlzUHVibGljUmVwbyIsImlzUmVmZXJyZWRCeU90aGVyUmVwbyIsInByZXBhY2siLCJwb3N0cGFjayIsInNlbWFudGljUmVsZWFzZSIsIndvcmtzcGFjZXMiLCJBcnJheSIsImlzQXJyYXkiLCJ3b3Jrc3BhY2UiLCJnbG9iYnlTeW5jIiwid2IiLCJkb2VzQ29udGFpbnNKYXZhU2NyaXB0IiwiZG9lc0NvbnRhaW5zSmF2YVNjcmlwdEluUGFja2FnZXMiLCJkb2VzQ29udGFpbnNUeXBlU2NyaXB0IiwiZG9lc0NvbnRhaW5zVHlwZVNjcmlwdEluUGFja2FnZXMiLCJwcml2YXRlIiwibGljZW5zZSIsInB1Ymxpc2hDb25maWciLCJhY2Nlc3MiLCJtYWluIiwicmVzb2x1dGlvbnMiLCJsaW50IiwiY2xlYW51cCIsImRpcnMiLCJkaXIiLCJmb3JtYXQiLCJweXRob25GaWxlcyIsImlnbm9yZSIsImRpck5hbWVTZXQiLCJweXRob25GaWxlIiwiZmlyc3QiLCJzZWNvbmQiLCJhZGQiLCJzaXplIiwiZGlyTmFtZXNTdHIiLCJkIiwia2V5cyIsInBhY2thZ2VOYW1lcyIsImNvbW1pdEhhc2giLCJ1cGRhdGVQcml2YXRlUGFja2FnZXMiLCJuZXdKc29uVGV4dCIsIm9sZEFuZE5ld1NjcmlwdE5hbWVzIiwib2xkTmFtZSIsIm5ld05hbWUiLCJmaWxlcyIsImZpeFNjcmlwdE5hbWVzIiwicGFja2FnZU1hbmFnZXIiLCJ0eXBlY2hlY2siLCJvbGRUZXN0IiwicHlyaWdodCIsInByZUNvbW1pdCIsInByZVB1c2giLCJwcmVQdXNoRm9yTGFiIiwicG9zdE1lcmdlIiwiZ2VuZXJhdGVIdXNreXJjVXBkYXRpbmdQYWNrYWdlSnNvbiIsInBhY2thZ2VKc29uUGF0aCIsInByZUNvbW1pdEZpbGVQYXRoIiwibW9kZSIsInBvc3RNZXJnZUNvbW1hbmQiLCJnZW5lcmF0ZVBvc3RNZXJnZUNvbW1hbmRzIiwicG9zdE1lcmdlQ29tbWFuZHMiLCJTdHJpbmciLCJyYXciLCJpbnN0YWxsQ29tbWFuZCIsInJtTmV4dERpcmVjdG9yeSIsImNyZWF0ZVRhc2tPcHRpb25zIiwicnVubmVyIiwiZXh0ZW5zaW9uIiwicHJldHRpZXJDb250ZW50IiwiYmlvbWVDb250ZW50IiwiZ2VuZXJhdGVJZGVhU2V0dGluZ3MiLCJjb21tYW5kcyIsImdsb2IiLCJnZW5lcmF0ZUxlZnRob29rVXBkYXRpbmdQYWNrYWdlSnNvbiIsInlhbWwiLCJkdW1wIiwibGluZVdpZHRoIiwibm9Db21wYXRNb2RlIiwic3R5bGVzIiwibWtkaXJTeW5jIiwiZ2VuZXJhdGVMaW50c3RhZ2VkcmMiLCJwYWNrYWdlUHJlZml4IiwiZ2V0RXNsaW50S2V5IiwicGFja2FnZXNGaWx0ZXIiLCJnZXRFc2xpbnRGaWx0ZXJGb3JQcmV0dGllciIsImdlbmVyYXRlTmV4dENvbmZpZ0pzb24iLCJmaW5kIiwicCIsIl8iLCJzZXR0aW5nc1RleHQiLCJnZW5lcmF0ZVByZXR0aWVyaWdub3JlIiwiZ2l0aWdub3JlQ29udGVudCIsImFkZGl0aW9uYWxDb250ZW50IiwidmVudlBhdGgiLCJ2ZW52IiwiZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbiIsImdlbmVyYXRlUmVhZG1lIiwiaW5zZXJ0QmFkZ2UiLCJmaWxlTmFtZXMiLCJyZWFkZGlyU3luYyIsImZpbGVOYW1lIiwiYmFkZ2VOYW1lIiwidG9VcHBlckNhc2UiLCJiYWRnZSIsInJlYWRtZSIsImkiLCJnZW5lcmF0ZVJlbGVhc2VyYyIsInNldHRpbmdzIiwicGx1Z2lucyIsInBsdWdpbiIsIm9sZENvbmZpZyIsInByZXNldCIsInN1Y2Nlc3NDb21tZW50IiwiZmFpbENvbW1lbnQiLCJsYWJlbHMiLCJyZWxlYXNlZExhYmVscyIsImdlbmVyYXRlUmVub3ZhdGVKc29uIiwicGFja2FnZVJ1bGVzIiwicnVsZSIsImVuYWJsZWQiLCJzb3J0S2V5cyIsIm9iaiIsImtleUFuZFZhbHVlcyIsImtleTEiLCJrZXkyIiwibG9jYWxlQ29tcGFyZSIsInJvb3RKc29uT2JqIiwiY29tcGlsZXJPcHRpb25zIiwibW9kdWxlIiwibW9kdWxlUmVzb2x1dGlvbiIsImpzeCIsImFsd2F5c1N0cmljdCIsInN0cmljdCIsInNraXBMaWJDaGVjayIsImFsbG93U3ludGhldGljRGVmYXVsdEltcG9ydHMiLCJlc01vZHVsZUludGVyb3AiLCJyZXNvbHZlSnNvbk1vZHVsZSIsImRlY2xhcmF0aW9uIiwic291cmNlTWFwIiwiaW1wb3J0SGVscGVycyIsIm91dERpciIsInR5cGVSb290cyIsImluY2x1ZGUiLCJzdWJKc29uT2JqIiwiZ2VuZXJhdGVUc2NvbmZpZyIsImRvZXNDb250YWluc0pzeE9yVHN4SW5QYWNrYWdlcyIsImlzRXNtUGFja2FnZSIsImV4cGVyaW1lbnRhbERlY29yYXRvcnMiLCJleGNsdWRlRmlsZVBhdHRlcm5zIiwiZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyIsImV4Y2x1ZGVGaWxlUGF0dGVybiIsImV4Y2x1ZGVTZXR0aW5nIiwid29ya2Zsb3dzIiwib24iLCJwdWxsX3JlcXVlc3QiLCJicmFuY2hlcyIsImNvbmN1cnJlbmN5IiwiZ3JvdXAiLCJqb2JzIiwidXNlcyIsInJlbGVhc2UiLCJ3YmZ5Iiwid29ya2Zsb3dfZGlzcGF0Y2giLCJwdWxsX3JlcXVlc3RfdGFyZ2V0IiwidHlwZXMiLCJzeW5jIiwiaXNzdWVzIiwic2VjcmV0cyIsIkRJU0NPUkRfV0VCSE9PS19VUkwiLCJHSF9QUk9KRUNUX1VSTCIsIndpdGgiLCJsYWJlbGVkIiwiZ2VuZXJhdGVXb3JrZmxvd3MiLCJ3b3JrZmxvd3NQYXRoIiwic2VtYW50aWNZbWxQYXRoIiwiZmlsZU5hbWVTZXQiLCJraW5kIiwid3JpdGVXb3JrZmxvd1lhbWwiLCJsb2FkIiwibW92ZVRvQm90dG9tIiwiam9iIiwibm9ybWFsaXplSm9iIiwic2NoZWR1bGUiLCJicmFuY2giLCJzZXRTY2hlZHVsZSIsIm1pZ3JhdGVXb3JrZmxvdyIsIndyaXRlWWFtbCIsInBhcmFtcyIsInN5bmNfcGFyYW1zX3dpdGhvdXRfZGVzdCIsIm5wbSIsInNlcnZlcl91cmwiLCJtaWdyYXRlSm9iIiwibmV3U2VjcmV0cyIsImluY2x1c2l2ZU1pbkhvdXJKc3QiLCJleGNsdXNpdmVNYXhIb3VySnN0IiwibWludXRlVXRjIiwiaG91clV0YyIsImNyb24iLCJpc0ludGVnZXIiLCJob3VySnN0IiwiTWF0aCIsImZsb29yIiwicmFuZG9tIiwieWFtbFRleHQiLCJnZW5lcmF0ZVlhcm5yY1ltbCIsInlhcm5yY1ltbFBhdGgiLCJjdXJyZW50VmVyc2lvbiIsImxhdGVzdFZlcnNpb24iLCJ2ZXJzaW9uc0pzb24iLCJnZXRMYXRlc3RWZXJzaW9uIiwiZ2V0TWFqb3JOdW1iZXIiLCJyZWxlYXNlc1BhdGgiLCJ5YXJucmNQYXRoIiwiZGVmYXVsdFNlbXZlclJhbmdlUHJlZml4Iiwibm9kZUxpbmtlciIsIm5tTW9kZSIsImNvbXByZXNzaW9uTGV2ZWwiLCJpbmplY3RFbnZpcm9ubWVudEZpbGVzIiwiZW5hYmxlR2xvYmFsQ2FjaGUiLCJvcmlnaW5hbExlbmd0aCIsInBsdWdpblBhdGgiLCJtYWpvciIsInNldHVwTGFiZWxzIiwic2V0dXBMYWJlbCIsImRlbGV0ZUxhYmVsIiwid2FybiIsImNvbG9yIiwiZGVwcmVjYXRlZFNlY3JldE5hbWVzIiwic2V0dXBTZWNyZXRzIiwicGFyc2VkIiwiZG90ZW52Iiwic2VjcmV0TmFtZSIsInNlY3JldF9uYW1lIiwia2V5X2lkIiwia2V5SWQiLCJzb2RpdW0iLCJyZWFkeSIsInNlY3JldCIsInJhd0tleSIsImZyb21fYmFzZTY0IiwiYmFzZTY0X3ZhcmlhbnRzIiwiT1JJR0lOQUwiLCJyYXdTZWMiLCJmcm9tX3N0cmluZyIsImVuY0J5dGVzIiwiY3J5cHRvX2JveF9zZWFsIiwiZW5jQmFzZTY0IiwidG9fYmFzZTY0IiwiZW5jcnlwdGVkX3ZhbHVlIiwic2V0dXBHaXRIdWJTZXR0aW5ncyIsIndpdGhSZXRyeSIsImFsbG93X21lcmdlX2NvbW1pdCIsImFsbG93X3NxdWFzaF9tZXJnZSIsImFsbG93X3JlYmFzZV9tZXJnZSIsImRlbGV0ZV9icmFuY2hfb25fbWVyZ2UiLCJzcXVhc2hfbWVyZ2VfY29tbWl0X3RpdGxlIiwic3F1YXNoX21lcmdlX2NvbW1pdF9tZXNzYWdlIiwiaGVhZGVycyIsImFsbG93X2F1dG9fbWVyZ2UiLCJ0ZW1wbGF0ZXMiLCJnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcyIsImRpc3RhbmNlIiwid2JmeUpzb25TY2hlbWEiLCJ6Iiwib2JqZWN0IiwicmVjb3JkIiwic3RyaW5nIiwib3B0aW9uYWwiLCJkb2MiLCJ0cyIsImdldFBhY2thZ2VDb25maWciLCJlc21QYWNrYWdlIiwicGFja2FnZUpzb25UZXh0IiwicmVhZEZpbGVTeW5jIiwidHlwZSIsInJlbGVhc2VCcmFuY2hlcyIsInJlbGVhc2VQbHVnaW5zIiwicmVsZWFzZXJjSnNvblBhdGgiLCJmbGF0IiwicmVwb0luZm8iLCJnaXQiLCJzaW1wbGVHaXQiLCJvcmlnaW4iLCJnZXRSZW1vdGVzIiwiciIsInJlbW90ZVVybCIsInJlZnMiLCJyZXF1ZXN0UmVwb0luZm8iLCJtZXNzYWdlIiwiZmV0Y2hSZXBvSW5mbyIsIm5vZGVWZXJzaW9uQ29udGVudCIsIndiZnlKc29uUGF0aCIsIndiZnlKc29uVGV4dCIsImZ1bGxfbmFtZSIsInNlcCIsImNvbnRhaW5zQW55IiwiZG9lc0NvbnRhaW5zVnNjb2RlU2V0dGluZ3NKc29uIiwiZ2l0aHViIiwiZ2V0RXNsaW50RXh0ZW5zaW9uQmFzZSIsInBhdHRlcm4iLCJvcmciLCJyZXQiLCJhc3NpZ24iLCJhcmd2IiwieWFyZ3MiLCJwb3NpdGlvbmFsIiwiZGVzY3JpYmUiLCJhcnJheSIsImRlZmF1bHQiLCJkZXNjcmlwdGlvbiIsImFsaWFzIiwic2tpcERlcHMiLCJ2ZXJib3NlIiwicm9vdERpclBhdGgiLCJwYXRocyIsInBhY2thZ2VzRGlyUGF0aCIsInN1YkRpclBhdGhzIiwiaWdub3JlRXJyb3JBc3luYyIsImFiYnJldmlhdGlvblByb21pc2UiLCJzdWJQYWNrYWdlQ29uZmlncyIsInN1YkRpclBhdGgiLCJhbGxQYWNrYWdlQ29uZmlncyIsInRoZW4iXSwibWFwcGluZ3MiOiJnb0JBVU8sTUFBTUEsRUFBVSxJQVZ2QixNQUlFQyxXQUFBQSxHQUNFQyxLQUFLQyxXQUFZLEVBQ2pCRCxLQUFLRSxtQkFBb0IsQ0FDM0IsR0NXSyxNQUFNQyxFQUFTLElBaEJ0QixNQUNFLCtCQUFNQyxDQUEwQkMsRUFBY0MsR0FDeENSLEVBQVFHLFdBQ1ZNLFFBQVFDLEtBQUssYUFBYUgscUJBRTVCLFVBQ1FDLEdBQ1AsQ0FBQyxNQUFPRyxHQUNQRixRQUFRQyxLQUFLLHFCQUFxQkgsTUFBU0ksYUFBaUJDLE1BQVFELEVBQU1FLE1BQVFGLEtBQ3BGLENBQ0lYLEVBQVFHLFdBQ1ZNLFFBQVFDLEtBQUssY0FBY0gsbUJBRS9CLEdDVEtPLGVBQWVDLEVBQWNDLEdBQ2xDLE9BQU9YLEVBQU9DLDBCQUEwQixpQkFBaUJRLFVBQ3ZELElBQUtFLEVBQU9DLHVCQUF3QixPQUVwQyxNQUFNQyxFQUFhRixF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
|
1
|
+
import e from"node:fs/promises";import t from"node:path";import{ignoreEnoentAsync as n,withRetry as s,ignoreErrorAsync as i}from"@willbooster/shared-lib";import o from"yargs";import r from"node:fs";import{globby as a,globbySync as c}from"globby";import{PromisePool as l}from"minimal-promise-pool";import{Octokit as p}from"@octokit/core";import d from"node:child_process";import u from"deepmerge";import m from"lodash.clonedeep";import f from"node:os";import g from"js-yaml";import h from"dotenv";import y from"libsodium-wrappers";import{distance as w}from"fastest-levenshtein";import{simpleGit as b}from"simple-git";import{z as v}from"zod";const k=new class{constructor(){this.isVerbose=!1,this.doesUploadEnvVars=!1}};const j=new class{async functionIgnoringException(e,t){k.isVerbose&&console.info(`--------- ${e} start ---------`);try{await t()}catch(t){console.info(`Error occurred in ${e}: ${t instanceof Error?t.stack:t}}`)}k.isVerbose&&console.info(`---------- ${e} end ----------`)}};async function x(n){return j.functionIgnoringException("fixDockerfile",(async()=>{if(!n.doesContainsDockerfile)return;const s=n.dockerfile,i=s;s!==i&&await e.writeFile(t.join(n.dirPath,"Dockerfile"),i)}))}async function _(e){return j.functionIgnoringException("fixPlaywrightConfig",(async()=>{const n=t.join(e.dirPath,"playwright.config.ts");if(!r.existsSync(n))return;const s=await r.promises.readFile(n,"utf8"),i=s.replace(/retries:.+,/,"retries: process.env.PWDEBUG ? 0 : process.env.CI ? 5 : 1,");s!==i&&await r.promises.writeFile(n,i)}))}async function P(n){return j.functionIgnoringException("fixPrismaEnvFiles",(async()=>{const s=await a(["*.env","*.env.*"],{dot:!0,cwd:n.dirPath});for(const i of s){const s=t.resolve(n.dirPath,i),o=(await e.readFile(s,"utf8")).replace(/DATABASE_URL="?(.+\.sqlite3)"?[\n$]/,'DATABASE_URL="$1?connection_limit=1"\n');await e.writeFile(s,o)}}))}async function $(e){return j.functionIgnoringException("fixTestDirectoriesUpdatingPackageJson",(async()=>{await Promise.all(e.map((async e=>{const n=t.join(e,"__tests__"),s=t.join(e,"tests");try{await r.promises.rename(n,s);const i=await r.promises.readFile(t.join(e,"package.json"),"utf8"),o=i.replaceAll("__tests__","tests");if(i===o)return;await r.promises.writeFile(t.join(e,"package.json"),o)}catch{}})))}))}const S=new l;async function F(s,i){return j.functionIgnoringException("fixTypeDefinitions",(async()=>{const o=t.resolve(s.dirPath,"@types"),r=s.isRoot&&s.doesContainsSubPackageJsons?void 0:t.resolve(s.dirPath,"src","types"),a=await n((()=>e.readdir(o,{withFileTypes:!0})));if(a)for(const s of a){const a=s.name.slice(0,-5),c=s.name.endsWith(".d.ts");let l=c?a:s.name;l.includes("__")&&(l=`@${l.replace("__","/")}`);const p=i.some((e=>e.packageJson?.dependencies?.[l]||e.packageJson?.devDependencies?.[l]));s.isFile()&&c?p?(await e.mkdir(t.join(o,a)),await S.run((()=>e.rename(t.join(o,s.name),t.join(o,a,"index.d.ts"))))):r&&(await e.mkdir(r,{recursive:!0}),await S.run((()=>e.rename(t.join(o,s.name),t.join(r,s.name))))):s.isDirectory()&&r&&!p&&(await e.mkdir(r,{recursive:!0}),await S.run((()=>n((()=>e.rename(t.join(o,s.name,"index.d.ts"),t.join(r,`${s.name}.d.ts`)))))))}}))}const C={async readFileIgnoringError(t){try{return await e.readFile(t,"utf8")}catch{}},async generateFile(t,n){await e.writeFile(t,n)}};async function E(e){return j.functionIgnoringException("fixAbbreviations",(async()=>{const n=e.dirPath,s=await a("**/*.md",{dot:!0,cwd:n,gitignore:!0});k.isVerbose&&console.info(`Found ${s.length} markdown files in ${n}`);for(const i of s){const s=t.join(n,i);await S.run((async()=>{const t=await r.promises.readFile(s,"utf8");let n=B(t);n=O(n,e,"doc"),t!==n&&await C.generateFile(s,n)}))}const i=await a(["{app,src,tests,scripts}/**/*.{cjs,mjs,js,jsx,cts,mts,ts,tsx}","packages/**/{app,src,tests,scripts}/**/*.{cjs,mjs,js,jsx,cts,mts,ts,tsx}"],{dot:!0,cwd:n,gitignore:!0});k.isVerbose&&console.info(`Found ${i.length} TypeScript files in ${n}`);for(const s of i){const i=t.join(n,s),o=await r.promises.readFile(i,"utf8");let a=o.replaceAll(/\/\/(.*)c\.f\./g,"//$1cf.").replaceAll(/\/\/(.*)eg\./g,"//$1e.g.").replaceAll(/\/\/(.*)ie\./g,"//$1i.e.");a=O(a,e,"ts"),o!==a&&await C.generateFile(i,a)}const o=await a("**/*.{csv,htm,html,tsv,xml,yaml,yml}",{dot:!0,cwd:n,gitignore:!0});k.isVerbose&&console.info(`Found ${o.length} text-based files in ${n}`);for(const s of o){const i=t.join(n,s),o=await r.promises.readFile(i,"utf8");let a=o.replaceAll(/\/\/(.*)c\.f\./g,"//$1cf.").replaceAll(/\/\/(.*)eg\./g,"//$1e.g.").replaceAll(/\/\/(.*)ie\./g,"//$1i.e.");a=O(a,e,"text"),o!==a&&await C.generateFile(i,a)}await S.promiseAll()}))}function B(e){return e.replaceAll(/\bc\.f\.([^$])/g,"cf.$1").replaceAll(/\beg\.([^$])/g,"e.g.$1").replaceAll(/\bie\.([^$])/g,"i.e.$1")}function O(e,t,n){for(const[n,s]of Object.entries(t.wbfyJson?.typos?.all??{}))e=e.replaceAll(n,s);for(const[s,i]of Object.entries(t.wbfyJson?.typos?.[n]??{}))e=e.replaceAll(s,i);return e}const I=process.env.GH_BOT_PAT||process.env.PUBLIC_GH_BOT_PAT||process.env.GH_TOKEN||process.env.GITHUB_TOKEN,D=!!I,T=new p({auth:I});const A=new class{getOrgAndName(e){const t=e.split(":").at(-1),n=t?.split("/");return[n?.at(-2)??"",n?.at(-1)?.replace(/.git$/,"")??""]}};function R(e,t,n,s=0){do{const[s,i,o]=J(e,t,n);if(0===d.spawnSync(s,i,o).status)break}while(--s>=0)}function W(e,t,n){const[s,i,o]=J(e,t,n);o.stdio="pipe";const r=d.spawnSync(s,i,o),a=r.stderr.toString().trim();return a&&console.error(`${s} [${i.map((e=>`"${e}"`))}] caused the following error:\n ${a}`),r.stdout.toString().trim()}function J(e,t,n){const s={...process.env};return s.PATH&&s.BERRY_BIN_FOLDER&&(s.PATH=s.PATH.replace(`${s.BERRY_BIN_FOLDER}:`,"")),s.ASDF_DIR&&(t=["-l","-c",`. ${s.ASDF_DIR}/asdf.sh && ${e} ${t.join(" ")}`],e="bash"),[e,t,{cwd:n,env:s,shell:!1,stdio:"inherit"}]}function N(e){const t=e.split(/[+.-]/).map(Number).filter((e=>!Number.isNaN(e)));let n=0,s=1;for(const e of t)n+=e*s,s/=1e3;return n}const L="3.9.19",z="zulu-11.74.15",G="2.0.4",U="14.2.5";async function H(e){return j.functionIgnoringException("generateToolVersions",(async()=>{await async function(e){if(!e.versionsText)return;const n=e.versionsText.trim().split("\n").map((e=>{const[t,n]=e.trim().split(/\s+/);return`${M.has(t)?" ":""}${t} ${n}`})).sort().map((e=>e.trim())),s=[...new Set(n)];if(e.doesContainsPoetryLock){const e=await fetch("https://pypi.org/pypi/poetry/json"),t=await e.json(),n=t?.info?.version;n&&Y(s,"poetry",t?.info?.version),Y(s,"python",L,!0)}e.depending.firebase&&Y(s,"java",z,!0);if(e.doesContainsPackageJson)if(e.isBun){const e=await K("evilmartians","lefthook");e&&Y(s,"lefthook",e);const t=await K("oven-sh","bun");t&&Y(s,"bun",t)}else{const t=W("npm",["show","yarn","version"],e.dirPath);Y(s,"yarn",t)}for(const n of q){const s=t.resolve(e.dirPath,`.${n}-version`);r.promises.rm(s,{force:!0})}const i=t.resolve(e.dirPath,".tool-versions");await(s.length>0?S.run((()=>r.promises.writeFile(i,s.join("\n")+"\n"))):S.run((()=>r.promises.rm(i,{force:!0})))),await S.promiseAll(),R("asdf",["plugin","update","--all"],e.dirPath),R("asdf",["install"],e.dirPath)}(e)}))}const M=new Set(["java","nodejs","bun","python"]),q=["java","node","python"];function Y(e,t,n,s=!1){const i=e.findIndex((e=>e.split(/\s+/)[0]===t)),o=`${t} ${n}`;if(-1===i)e.splice(s?0:e.length,0,o);else{const[,t]=e[i].split(/\s+/);N(n)>N(t)&&(e[i]=o)}}async function K(e,t){try{const n=(await T.request("GET /repos/{owner}/{repo}/releases/latest",{owner:e,repo:t})).data.tag_name,s=n.lastIndexOf("v"),i=-1===s?n:n.slice(s+1);return/^\d/.test(i)?i:void 0}catch(e){return void console.error("Failed to fetch Bun tags due to:",e)}}function V(e,t){return t}function X(e,t,n){const s=[...e];for(const[i,o]of t.entries())void 0===s[i]?s[i]=n.cloneUnlessOtherwiseSpecified(o,n):n.isMergeableObject(o)?s[i]=u(e[i],o,n):e.includes(o)||s.push(o);return s}const Q={$schema:"./node_modules/@biomejs/biome/configuration_schema.json",extends:["@willbooster/biome-config"]};async function Z(e){return j.functionIgnoringException("generateBiomeJsonc",(async()=>{let n=m(Q);const s=t.resolve(e.dirPath,"biome.jsonc");try{const e=await r.promises.readFile(s,"utf8"),t=JSON.parse(e);n=u.all([n,t,n],{arrayMerge:V})}catch{}const i=JSON.stringify(n);await S.run((()=>C.generateFile(s,i)))}))}async function ee(e){return j.functionIgnoringException("generateBunfigToml",(async()=>{const n=t.resolve(e.dirPath,"bunfig.toml");await S.run((()=>C.generateFile(n,"telemetry = false\n\n[install]\nexact = true\n\n[run]\nbun = true\n\n")))}))}const te="# Project-specific settings",ne=/# Project-specific settings[^\n]*\n/gm,se="# Generated by wbfy",ie=`${te} (head)\n\n\n${se}\n`,oe=`\n${te} (tail)\n`,re={separator:se,separatorPrefix:"# Generated by ",defaultHeadUserContent:ie,defaultTailUserContent:oe,async readGitignoreWithoutSeparators(e){try{let t=await r.promises.readFile(e,"utf8");const n=ae(t);return n>0&&(t=t.slice(0,n-1)),t.replaceAll(ne,"").replaceAll(/# Generated by [^\n]*\n/gm,"").replaceAll(/\r?\n\r?\n(\r?\n)+/gm,"\n\n").trim()+"\n"}catch{}},getHeadUserContent(e){const t=e.indexOf(this.separatorPrefix);return-1!==t?e.slice(0,e.indexOf("\n",t)+1).replaceAll(ne,`${te} (head)\n`):ie},getTailUserContent(e){const t=ae(e);return t>0?e.slice(t-1):oe},async isBerryZeroInstallEnabled(e){try{return(await r.promises.readFile(e,"utf8")).includes("\n!.yarn/cache")}catch{return!1}}};function ae(e){const t=e.indexOf(te),n=e.lastIndexOf(te);return n>t?n:-1}async function ce(e){return j.functionIgnoringException("generateDockerignore",(async()=>{const n=t.resolve(e.dirPath,".dockerignore");if(e.doesContainsDockerfile){const e=await C.readFileIgnoringError(n)??"",t=re.getHeadUserContent(e)+"\n**/.idea\n**/*.sqlite3*\n**/.yarn/install-state.gz\n**/.venv\n"+re.getTailUserContent(e);await S.run((()=>C.generateFile(n,t)))}else await r.promises.rm(n,{force:!0})}))}const le={codeWith2IndentSize:["cjs","mjs","js","jsx","cts","mts","ts","tsx","json","json5","jsonc","cpp","dart","htm","html","pu","puml","rb","vue","xml","yaml","yml"].sort(),codeWith4IndentSize:["go","gradle","py"].sort(),codeWith8IndentSize:["sh"].sort(),markdownLike:["md"].sort(),eslint:["cjs","mjs","js","cts","mts","ts","tsx","jsx"].sort(),prettier:["cjs","mjs","js","jsx","cts","mts","ts","tsx","json","json5","jsonc","css","htm","html","md","scss","vue","yaml","yml"].sort(),biome:["cjs","mjs","js","jsx","cts","mts","ts","tsx","json","json5","jsonc","htm","html","vue","svelte","astro","css","yaml","yml","gql"].sort()},pe=`root = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\ninsert_final_newline = true\ntrim_trailing_whitespace = true\n\n${ue(le.codeWith2IndentSize)}\nindent_size = 2\nindent_style = space\n\n${ue(le.codeWith4IndentSize)}\nindent_size = 4\nindent_style = space\n\n${ue(le.codeWith8IndentSize)}\nindent_size = 8\nindent_style = space\n\n${ue(le.markdownLike)}\nmax_line_length = off\ntrim_trailing_whitespace = false\n\n[{Makefile,*.mk}]\nindent_style = tab\n`;async function de(e){return j.functionIgnoringException("generateEditorconfig",(async()=>{const n=t.resolve(e.dirPath,".editorconfig");await S.run((()=>C.generateFile(n,pe)))}))}function ue(e){return e.length>1?`[*.{${e.join(",")}}]`:`[*.${e[0]}]`}async function me(e){return j.functionIgnoringException("generateEslintignore",(async()=>{const n=t.resolve(e.dirPath,".eslintignore");if(e.isBun)return void await S.run((()=>r.promises.rm(n,{force:!0})));const s=await C.readFileIgnoringError(n)??"",i=re.getHeadUserContent(s),o=re.getTailUserContent(s),a=t.resolve(e.dirPath,".gitignore"),c=i+"\n3rd-party/\n@types/\n__generated__/\nandroid/\nios/\nno-format/\ntest-fixtures/\n*.config.*js\n*.d.ts\n*.min.*js\n.yarn/\n.pnp.js\n"+(await re.readGitignoreWithoutSeparators(a)||"")+o;await S.run((()=>C.generateFile(n,c)))}))}async function fe(e,n){return j.functionIgnoringException("generateEslintrc",(async()=>{const s=t.resolve(e.dirPath,".eslintrc.json");if(e.isBun)return void await S.run((()=>r.promises.rm(s,{force:!0})));const i=[];e.eslintBase&&i.push(e.eslintBase),e!==n&&i.push("../../.eslintrc.json");let o={root:!0,extends:i};try{const t=await r.promises.readFile(s,"utf8"),n=JSON.parse(t);n.extends&&(n.extends=n.extends.filter((e=>!e.startsWith("@willbooster/")&&"../../.eslintrc.json"!==e))),0===i.length&&(n.extends=[]);const a=o.extends;o.extends=n.extends,n.extends=a,o=u.all([o,n,o],{arrayMerge:X}),e.depending.blitz&&(o.extends=o.extends.filter((e=>"./node_modules/@blitzjs/next/eslint"!==e)))}catch{}const a=JSON.stringify(o);await S.run((()=>C.generateFile(s,a)))}))}const ge=`* text=auto\n\n*.lockb binary diff=lockb\n*.vcproj text eol=crlf\n\n${[...le.codeWith2IndentSize,...le.codeWith4IndentSize,...le.markdownLike].map((e=>`*.${e} text eol=lf`)).join("\n")}\n\ndist/** linguist-generated=true\n`;async function he(e){return j.functionIgnoringException("generateGitattributes",(async()=>{const n=t.resolve(e.dirPath,".gitattributes");await S.run((()=>C.generateFile(n,ge)))}))}const ye=["windows","macos","linux","jetbrains","visualstudiocode","emacs","vim","yarn"];async function we(e,n){return j.functionIgnoringException("generateGitignore",(async()=>{const s=t.resolve(e.dirPath,".gitignore"),i=await C.readFileIgnoringError(s)??"";let o=re.getHeadUserContent(i)+"\n!.keep\n.env.production\n*/mount/*.hash\n.idea/copilot/chatSessions/\n.devcontainer/\ndist/\ntemp/\n";const r=re.getTailUserContent(i),a=[...ye];e.doesContainsGemfile&&a.push("ruby"),e.doesContainsGoMod&&(a.push("go"),o+=`${t.basename(e.dirPath)}\n`),e.doesContainsPackageJson&&a.push("node"),e.doesContainsPomXml&&(a.push("maven"),o+=".idea/google-java-format.xml\n"),e.doesContainsPubspecYaml&&(a.push("flutter","AndroidStudio","ruby"),o+=".flutter-plugins-dependencies\nandroid/key.properties\nios/.bundle\n.idea/runConfigurations.xml\n"),e.doesContainsTemplateYaml&&(o+=".aws-sam/\npackaged.yaml\n"),e.doesContainsPoetryLock&&(a.push("python"),o+=".venv/\n"),e.depending.blitz&&(o+=".blitz/\n.blitz**\n"),e.depending.next&&a.push("nextjs"),(n.depending.firebase||e.depending.firebase)&&a.push("firebase"),n.depending.prisma&&(o+="*.sqlite3*\n*.sqlite3-journal\n"),e.depending.playwrightTest&&(o+="test-results/\n"),(n.depending.reactNative||e.depending.reactNative)&&(a.push("reactnative"),o+="google-services.json\nandroid/app/src/main/assets/\n"),e.depending.storybook&&a.push("storybookjs"),e.depending.litestream&&(o+="gcp-sa-key.json\n");let c="";for(const e of a){let t=await ke(e)??"";if(!t){const n=`https://www.toptal.com/developers/gitignore/api/${e}`,s=await fetch(n),i=await s.text();if(!s.ok||i.includes("Attention Required!")||i.includes("<title>"))return void console.error(`Failed to fetch ${n}`);t=i.trim(),await S.run((()=>ve(e,t))),k.isVerbose&&console.info(`Fetched ${n}`)}c&&(c+="\n"),c+=t+"\n"}await re.isBerryZeroInstallEnabled(s)||(c=c.replace("!.yarn/cache","# !.yarn/cache").replace("# .pnp.*",".pnp.*")),(e.doesContainsPomXml||e.doesContainsPubspecYaml)&&(c=c.replaceAll(/^# .idea\/artifacts$/gm,".idea/artifacts").replaceAll(/^# .idea\/compiler.xml$/gm,".idea/compiler.xml").replaceAll(/^# .idea\/jarRepositories.xml$/gm,".idea/jarRepositories.xml").replaceAll(/^# .idea\/modules.xml$/gm,".idea/modules.xml").replaceAll(/^# .idea\/*.iml$/gm,".idea/*.iml").replaceAll(/^# .idea\/modules$/gm,".idea/modules").replaceAll(/^# *.iml$/gm,"*.iml").replaceAll(/^# *.ipr$/gm,"*.ipr"),e.doesContainsPubspecYaml&&(c=c.replaceAll(/^.idea\/modules.xml$/gm,"# .idea/modules.xml"))),c=c.replaceAll(/^.idea\/?$/gm,"# .idea"),(n.depending.reactNative||e.depending.reactNative||e.doesContainsPubspecYaml)&&(c=c.replaceAll(/^(.idea\/.+)$/gm,"$1\nandroid/$1"));const l=o+"\n"+c+r;await S.run((()=>C.generateFile(s,l)))}))}const be=t.join(f.homedir(),".cache","wbfy","gitignore");async function ve(e,n){await r.promises.mkdir(be,{recursive:!0}),await r.promises.writeFile(t.join(be,e),n)}async function ke(e){try{const n=await r.promises.stat(t.join(be,e));if(Date.now()-n.mtimeMs>216e5)return;return await r.promises.readFile(t.join(be,e),"utf8")}catch{}}async function je(e,t){try{const{data:n}=await T.request("GET /repos/{owner}/{repo}/commits",{owner:e,repo:t,per_page:1});if(console.info("commits:",n),0===n.length)throw new Error(`No commits found for ${e}/${t}`);return n[0].sha}catch(n){throw new Error(`Failed to fetch commits for ${e}/${t}: ${n}`)}}const xe={getLintFixSuffix:e=>e.doesContainsJsxOrTsx?' --rule "{ react-hooks/exhaustive-deps: 0 }"':""},_e={node:["src","tests","scripts"].sort(),blitz:["src","tests","scripts","db","integrations","mailers"].sort()};function Pe(e){return e.depending.blitz?_e.blitz:_e.node}const $e=["eslint@8.57.0","eslint-config-prettier","eslint-plugin-import","eslint-plugin-sort-class-members","eslint-plugin-sort-destructure-keys","eslint-plugin-unicorn"],Se=[...$e,"@typescript-eslint/eslint-plugin","@typescript-eslint/parser","eslint-import-resolver-typescript"],Fe=["eslint-plugin-react","eslint-plugin-react-hooks"],Ce={"@willbooster/eslint-config-js":["@willbooster/eslint-config-js",...$e],"@willbooster/eslint-config-js-react":["@willbooster/eslint-config-js-react",...$e,...Fe],"@willbooster/eslint-config-ts":["@willbooster/eslint-config-ts",...Se],"@willbooster/eslint-config-ts-react":["@willbooster/eslint-config-ts-react",...Se,...Fe],"@willbooster/eslint-config-blitz-next":["@willbooster/eslint-config-blitz-next","eslint-config-next",...Se,...Fe],"@willbooster/eslint-config-next":["@willbooster/eslint-config-next","eslint-config-next",...Se,...Fe]};async function Ee(e,n,s){return j.functionIgnoringException("generatePackageJson",(async()=>{await async function(e,n,s){const i=t.resolve(e.dirPath,"package.json"),o=await r.promises.readFile(i,"utf8"),l=JSON.parse(o);l.scripts=l.scripts||{},l.dependencies=l.dependencies||{},l.devDependencies=l.devDependencies||{},l.peerDependencies=l.peerDependencies||{},await async function(e,t){"WillBooster LLC"===t.author&&(t.author="WillBooster Inc.");if(delete t.scripts["sort-package-json"],delete t.scripts["sort-all-package-json"],delete t.scripts["typecheck/warn"],delete t.scripts["typecheck:gen-code"],delete t.scripts["typecheck:codegen"],delete t.dependencies.tslib,delete t.devDependencies["@willbooster/eslint-config"],delete t.devDependencies["@willbooster/eslint-config-react"],delete t.devDependencies["@willbooster/renovate-config"],delete t.devDependencies["@willbooster/tsconfig"],delete t.devDependencies["eslint-import-resolver-node"],delete t.devDependencies["eslint-plugin-prettier"],delete t.devDependencies.lerna,delete t.devDependencies.pinst,delete t.scripts["flutter-format"],delete t.scripts["format-flutter"],delete t.scripts["python-format"],delete t.scripts["format-python"],delete t.scripts.prettier,!e.isWillBoosterConfigs)for(const e of Object.values(Ce))for(const n of e)delete t.devDependencies[n];await S.run((()=>r.promises.rm("lerna.json",{force:!0})))}(n,l),"@willbooster/prettier-config"!==l.name&&(l.prettier="@willbooster/prettier-config");for(const[e,t]of Object.entries(l.scripts))t.includes("git clone")||(l.scripts[e]=t.replace(/yarn\s*&&\s*/,"").replace(/yarn\s*install\s*&&\s*/,""));l.scripts=u(l.scripts,Be(e)),e.isBun?delete l.scripts.prettify:l.scripts.prettify+=await async function(e){const n=t.resolve(e,".prettierignore"),s=await r.promises.readFile(n,"utf8"),i=s.indexOf(re.separatorPrefix);if(-1===i)return"";const o=s.slice(0,i);return o.split("\n").map((e=>{const t=e.trim();return t.endsWith("/")?t.slice(0,-1):t})).filter((e=>e&&!e.startsWith("#")&&!e.includes("/"))).map((e=>` "!**/${e}/**"`)).join("")}(e.dirPath);for(const[e,t]of Object.entries(l.scripts))t?.includes("yarn workspaces foreach")&&(t.includes("--all")||t.includes("--recursive")||t.includes("--since")||t.includes("--worktree")||(l.scripts[e]=t.replace("yarn workspaces foreach","yarn workspaces foreach --all")));let p=[],d=["prettier","sort-package-json","@willbooster/prettier-config"];const m=[];e.isBun?delete l.devDependencies["lint-staged"]:d.push("lint-staged");if(e.isRoot){if(e.isBun?(delete l.devDependencies.husky,delete l.devDependencies.pinst,l.scripts.prepare="lefthook install || true"):(d.push("husky"),l.scripts.prepare="husky || true",l.scripts.postinstall="husky || true",(e.isPublicRepo||e.isReferredByOtherRepo)&&(d.push("pinst"),l.scripts.prepack="pinst --disable",l.scripts.postpack="pinst --enable")),e.depending.semanticRelease){const e=l.devDependencies["multi-semantic-release"]||l.devDependencies["@qiwi/multi-semantic-release"]?"@6.1.0":"";d.push(`conventional-changelog-conventionalcommits${e}`),l.devDependencies["semantic-release"]||l.devDependencies["multi-semantic-release"]||l.devDependencies["@qiwi/multi-semantic-release"]||d.push("semantic-release"),l.version="0.0.0-semantically-released"}e.depending.playwrightTest&&(l.dependencies["@playwright/test"]||(d.push("@playwright/test"),delete l.dependencies["@playwright/test"]),delete l.dependencies.playwright,delete l.devDependencies.playwright),e.doesContainsSubPackageJsons?l.workspaces=Array.isArray(l.workspaces)?u.all([l.workspaces,["packages/*"]],{arrayMerge:X}):["packages/*"]:Array.isArray(l.workspaces)&&(l.workspaces=l.workspaces.filter((t=>c(t,{dot:!0,cwd:e.dirPath,gitignore:!0}).length>0)),0===l.workspaces.length&&delete l.workspaces)}if(e.depending.wb||e.isBun){l.dependencies["@willbooster/wb"]?p.push("@willbooster/wb"):d.push("@willbooster/wb");for(const[e,t]of Object.entries(l.scripts))l.scripts[e]=t.replace(/wb\s+db/,"wb prisma")}(e.doesContainsJavaScript||e.doesContainsJavaScriptInPackages||e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages)&&(e.isBun?(d.push("@biomejs/biome","@willbooster/biome-config"),delete l.devDependencies.eslint,delete l.devDependencies.micromatch,delete l.devDependencies["@typescript-eslint/parser"]):(d.push("eslint@8.57.0","micromatch"),e.doesContainsTypeScriptInPackages&&d.push("@typescript-eslint/parser")));(e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages)&&(d.push("typescript"),e.isBun&&d.push("@types/bun"));e.eslintBase&&d.push(...Ce[e.eslintBase]);e.isWillBoosterConfigs&&(p=p.filter((e=>!e.includes("@willbooster/"))),d=d.filter((e=>!e.includes("@willbooster/"))));l.name||(l.name=t.basename(e.dirPath));e.doesContainsSubPackageJsons&&(l.private=!0);l.license||(l.license="UNLICENSED");!l.private&&"UNLICENSED"!==l.license&&n.isPublicRepo&&(l.publishConfig??={},l.publishConfig.access??="public");const[f]=A.getOrgAndName(e.repository??"");"WillBooster"!==f&&"WillBoosterLab"!==f||(l.author="WillBooster Inc.");e.isRoot||!l.private||l.main||(l.main="./src");if(delete l.resolutions?.["npm/chalk"],!e.doesContainsSubPackageJsons){if(e.isBun||(e.doesContainsJavaScript||e.doesContainsTypeScript?l.scripts["lint-fix"]+=xe.getLintFixSuffix(e):(delete l.scripts.lint,delete l.scripts["lint-fix"],l.scripts.cleanup=l.scripts.cleanup?.replace(" && yarn lint-fix",""))),e.doesContainsPubspecYaml){l.scripts.lint="flutter analyze",l.scripts["lint-fix"]="yarn lint";const n=["lib","test","test_driver"].filter((n=>r.existsSync(t.resolve(e.dirPath,n))));n.length>0&&(l.scripts["format-code"]=`flutter format $(find ${n.join(" ")} -name generated -prune -o -name '*.freezed.dart' -prune -o -name '*.g.dart' -prune -o -name '*.dart' -print)`,l.scripts.format+=" && yarn format-code")}if(e.doesContainsPoetryLock){"poetry install"===l.scripts.postinstall&&delete l.scripts.postinstall;const t=await a("**/*.py",{cwd:e.dirPath,dot:!0,gitignore:!0,ignore:["test-fixtures"]}),n=new Set;for(const e of t){const[t,s]=e.split(/[/\\]/);s&&n.add(t)}if(n.size>0){const e=[...n].join(" ");l.scripts["format-code"]=`poetry run isort --profile black ${e} && poetry run black ${e}`,l.scripts.lint?l.scripts.lint=`poetry run flake8 ${e} && ${l.scripts.lint}`:(l.scripts.lint=`poetry run flake8 ${e}`,l.scripts["lint-fix"]="yarn lint"),l.scripts.format+=" && yarn format-code",m.push("black","isort","flake8")}}e.repository&&(l.repository=e.repository)}e.depending.blitz?(p.push(`blitz@${G}`,`@blitzjs/auth@${G}`,`@blitzjs/next@${G}`,`@blitzjs/rpc@${G}`,`next@${U}`),d=d.filter((e=>"eslint-plugin-react"!==e&&"eslint-plugin-react-hooks"!==e)),l.scripts["gen-code"]?.startsWith("blitz codegen")?l.scripts["gen-code"].includes("blitz prisma generate")||(l.scripts["gen-code"]=l.scripts["gen-code"].replace("blitz codegen","blitz codegen && blitz prisma generate")):l.scripts["gen-code"]="blitz codegen"):e.depending.prisma&&!l.scripts["gen-code"]?.startsWith("prisma generate")&&(l.scripts["gen-code"]="prisma generate");e.depending.next&&delete l.devDependencies["@types/react"];l.dependencies?.prettier||delete l.devDependencies["@types/prettier"];0===Object.keys(l.dependencies).length&&delete l.dependencies;0===Object.keys(l.devDependencies).length&&delete l.devDependencies;0===Object.keys(l.peerDependencies).length&&delete l.peerDependencies;await async function(e){e.dependencies=e.dependencies||{},e.devDependencies=e.devDependencies||{};const t=new Set([...Object.keys(e.dependencies),...Object.keys(e.devDependencies)]);if(console.info("packageNames:",t),t.has("@willbooster/auth")){delete e.devDependencies["@willbooster/auth"];const t=await je("WillBoosterLab","auth");e.dependencies["@willbooster/auth"]=`git@github.com:WillBoosterLab/auth.git#${t}`}else if(t.has("@willbooster/code-analyzer")){delete e.dependencies["@willbooster/code-analyzer"];const t=await je("WillBoosterLab","code-analyzer");e.devDependencies["@willbooster/code-analyzer"]=`git@github.com:WillBoosterLab/code-analyzer.git#workspace=@code-analyzer/client&commit=${t}`}else if(t.has("@willbooster/judge")){delete e.dependencies["@willbooster/judge"];const t=await je("WillBoosterLab","judge");e.devDependencies["@willbooster/judge"]=`git@github.com:WillBoosterLab/judge.git#${t}`}else if(t.has("@willbooster/llm-proxy")){delete e.dependencies["@willbooster/llm-proxy"];const t=await je("WillBoosterLab","llm-proxy");e.devDependencies["@willbooster/llm-proxy"]=`git@github.com:WillBoosterLab/llm-proxy.git#workspace=@llm-proxy/client&commit=${t}`}}(l);let g=JSON.stringify(l);if(g=await async function(e,n,s){const i=[];for(const[t]of Object.keys(e))":"!==t[0]&&t.includes(":")&&i.push([t,t.replaceAll(":","-")]);if(0===i.length)return n;for(const[e,t]of i)n=n.replaceAll(e,t);const o=await a(["**/*.{md,cjs,mjs,js,jsx,cts,mts,ts,tsx}","**/Dockerfile"],{cwd:s.dirPath,dot:!0,gitignore:!0});for(const e of o)await S.run((async()=>{const n=t.join(s.dirPath,e),o=await r.promises.readFile(n,"utf8");let a=o;for(const[e,t]of i)a=a.replaceAll(e,t);a!==o&&await r.promises.writeFile(n,a)}));return await S.promiseAll(),n}(l.scripts,g,e),await r.promises.writeFile(i,g),!s){p=p.filter((e=>!l.devDependencies?.[e]));const t=e.isBun?"bun":"yarn";p.length>0&&R(t,["add",...new Set(p)],e.dirPath),d=d.filter((e=>!l.dependencies?.[e])),d.length>0&&R(t,["add","-D",...new Set(d)],e.dirPath),m.length>0&&R("poetry",["add","--group","dev",...new Set(m)],e.dirPath)}}(e,n,s)}))}function Be(e){if(e.isBun){const t={cleanup:"bun --bun wb lint --fix --format",format:"bun --bun wb lint --format",lint:"bun --bun wb lint","lint-fix":"bun --bun wb lint --fix",test:"bun --bun wb test",typecheck:"bun --bun wb typecheck"};return e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages||delete t.typecheck,t}{let t={cleanup:"yarn format && yarn lint-fix",format:"sort-package-json && yarn prettify",lint:`eslint --color "./{${Pe(e)}}/**/*.{${le.eslint.join(",")}}"`,"lint-fix":"yarn lint --fix",prettify:`prettier --cache --color --write "**/{.*/,}*.{${le.prettier.join(",")}}" "!**/test-fixtures/**"`,typecheck:"tsc --noEmit --Pretty"};if(e.doesContainsSubPackageJsons){const e=t.test;t=u({...t},{format:"sort-package-json && yarn prettify && yarn workspaces foreach --all --parallel --verbose run format",lint:"yarn workspaces foreach --all --parallel --verbose run lint","lint-fix":"yarn workspaces foreach --all --parallel --verbose run lint-fix",prettify:`prettier --cache --color --write "**/{.*/,}*.{${le.prettier.join(",")}}" "!**/packages/**" "!**/test-fixtures/**"`,test:"CI=1 FORCE_COLOR=3 yarn workspaces foreach --all --verbose run test",typecheck:"yarn workspaces foreach --all --parallel --verbose run typecheck"}),e?.includes("wb test")&&(t.test=e)}else e.depending.pyright&&(t.typecheck=t.typecheck?`${t.typecheck} && `:"",t.typecheck+="pyright");return e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages?e.depending.wb&&(t.typecheck="wb typecheck"):delete t.typecheck,t}}const Oe={preCommit:"node node_modules/.bin/lint-staged",prePush:"yarn typecheck",prePushForLab:'\nif [ $(git branch --show-current) = "main" ] && [ $(git config user.email) != "exkazuu@gmail.com" ]; then\n echo "************************************************"\n echo "*** Don\'t push main branch directly. Use PR! ***"\n echo "************************************************"\n exit 1\nfi\n\nyarn typecheck\n'.trim(),postMerge:'\nchanged_files="$(git diff-tree -r --name-only --no-commit-id ORIG_HEAD HEAD)"\n\nrun_if_changed() {\n if echo "$changed_files" | grep --quiet -E "$1"; then\n eval "$2"\n fi\n}\n'.trim()};async function Ie(e){return j.functionIgnoringException("generateHuskyrcUpdatingPackageJson",(async()=>{await async function(e){const n=t.resolve(e.dirPath,"package.json"),s=await r.promises.readFile(n,"utf8"),i=JSON.parse(s);i.scripts||={},delete i.scripts.postinstall,delete i.scripts.postpublish,delete i.scripts.prepare,delete i.scripts.prepublishOnly,delete i.scripts.prepack,delete i.scripts.postpack;const o=t.resolve(e.dirPath,".husky");if(await Promise.all([r.promises.writeFile(n,JSON.stringify(i,void 0,2)),r.promises.rm(o,{force:!0,recursive:!0})]),e.isBun)return void R("git",["config","--unset","core.hooksPath"],e.dirPath);R("yarn",["dlx","husky-init","--yarn2"],e.dirPath);const a=t.resolve(o,"pre-commit");await S.run((()=>r.promises.rm(t.resolve(e.dirPath,".huskyrc.json"),{force:!0}))),await S.run((()=>r.promises.writeFile(a,Oe.preCommit+"\n")));const{typecheck:c}=Be(e);if(c){let n=e.repository?.startsWith("github:WillBoosterLab/")?Oe.prePushForLab:Oe.prePush;n=n.replace("yarn typecheck",c.replace("tsc ","node node_modules/.bin/tsc ").replace("wb ","node node_modules/.bin/wb ").replace("pyright","node node_modules/.bin/pyright")),await S.run((()=>r.promises.writeFile(t.resolve(o,"pre-push"),n+"\n",{mode:493})))}const l=`${Oe.postMerge}\n\n${De(e).join("\n")}\n`;await S.run((()=>r.promises.writeFile(t.resolve(o,"post-merge"),l,{mode:493})))}(e)}))}function De(e){const t=[];e.versionsText&&t.push(String.raw`run_if_changed "\..+-version" "awk '{print \$1}' .tool-versions | xargs -I{} asdf plugin add {}"`,String.raw`run_if_changed "\..+-version" "asdf plugin update --all"`),e.versionsText?.includes("python ")&&t.push(String.raw`run_if_changed "\..+-version" "asdf install python"`),e.versionsText&&t.push(String.raw`run_if_changed "\..+-version" "asdf install"`);const n=e.isBun?"bun install":"yarn",s=e.depending.blitz||e.depending.next?" && rm -Rf .next":"";return t.push(`run_if_changed "package\\.json" "${n}${s}"`),e.doesContainsPoetryLock&&t.push(String.raw`run_if_changed "poetry\.lock" "poetry install"`),e.depending.blitz?t.push('run_if_changed "db/schema.prisma" "node node_modules/.bin/blitz prisma migrate deploy"','run_if_changed "db/schema.prisma" "node node_modules/.bin/blitz prisma generate"','run_if_changed "db/schema.prisma" "node node_modules/.bin/blitz codegen"'):e.depending.prisma&&t.push('run_if_changed "prisma/schema.prisma" "node node_modules/.bin/dotenv -c development -- node node_modules/.bin/prisma migrate deploy"','run_if_changed "prisma/schema.prisma" "node node_modules/.bin/dotenv -c development -- node node_modules/.bin/prisma generate"'),t}function Te(e,t,n,s){return` <TaskOptions isEnabled="true">\n <option name="arguments" value="${t} $FilePathRelativeToProjectRoot$" />\n <option name="checkSyntaxErrors" value="false" />\n <option name="description" />\n <option name="exitCodeBehavior" value="ERROR" />\n <option name="fileExtension" value="${s}" />\n <option name="immediateSync" value="false" />\n <option name="name" value="${n} (.${s})" />\n <option name="output" value="$FilePathRelativeToProjectRoot$" />\n <option name="outputFilters">\n <array />\n </option>\n <option name="outputFromStdout" value="false" />\n <option name="program" value="${e}" />\n <option name="runOnExternalChanges" value="false" />\n <option name="scopeName" value="Project Files" />\n <option name="trackOnlyRoot" value="false" />\n <option name="workingDir" value="$ProjectFileDir$" />\n <envs />\n </TaskOptions>\n`}const Ae=`<?xml version="1.0" encoding="UTF-8"?>\n<project version="4">\n <component name="ProjectTasksOptions">\n${le.prettier.map((e=>Te("node","node_modules/.bin/prettier --cache --write","Prettier",e))).join("")}\n </component>\n</project>\n`,Re=`<?xml version="1.0" encoding="UTF-8"?>\n<project version="4">\n <component name="ProjectTasksOptions">\n${le.prettier.map((e=>Te("bun","--bun node_modules/.bin/biome check --fix --no-errors-on-unmatched --skip-errors","Biome",e))).join("")}\n </component>\n</project>\n`;async function We(e){return j.functionIgnoringException("generateIdeaSettings",(async()=>{const n=t.resolve(e.dirPath,".idea");if(r.existsSync(n)){const s=t.resolve(n,"watcherTasks.xml");await(e.doesContainsJavaScript||e.doesContainsJavaScriptInPackages||e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages||e.doesContainsPackageJson&&!e.doesContainsPubspecYaml&&!e.doesContainsGemfile&&!e.doesContainsGoMod&&!e.doesContainsPomXml?S.run((()=>C.generateFile(s,e.isBun?Re:Ae))):S.run((()=>r.promises.rm(s,{force:!0}))))}}))}const Je={"post-merge":{scripts:{"prepare.sh":{runner:"bash"}}},"pre-commit":{commands:{cleanup:{glob:"*.{cjs,css,cts,htm,html,js,json,json5,jsonc,jsx,md,mjs,mts,scss,ts,tsx,vue,yaml,yml}",run:"bun --bun wb lint --fix --format {staged_files} && git add {staged_files}"},"check-migrations":{glob:"**/migration.sql",run:"\nif grep -q 'Warnings:' {staged_files}; then\n echo \"Migration SQL files ({staged_files}) contain warnings! Please solve the warnings and commit again.\"\n exit 1\nfi\n".trim()}}},"pre-push":{scripts:{"check.sh":{runner:"bash"}}}},Ne={prePush:"bun --bun node_modules/.bin/wb typecheck",prePushForLab:'\n#!/bin/bash\n\nif [ $(git branch --show-current) = "main" ] && [ $(git config user.email) != "exkazuu@gmail.com" ]; then\n echo "************************************************"\n echo "*** Don\'t push main branch directly. Use PR! ***"\n echo "************************************************"\n exit 1\nfi\n\nbun --bun node_modules/.bin/wb typecheck\n'.trim(),postMerge:'\n#!/bin/bash\n\nchanged_files="$(git diff-tree -r --name-only --no-commit-id ORIG_HEAD HEAD)"\n\nrun_if_changed() {\n if echo "$changed_files" | grep --quiet -E "$1"; then\n eval "$2"\n fi\n}\n'.trim()};async function Le(e){return j.functionIgnoringException("generateLefthookUpdatingPackageJson",(async()=>{await async function(e){const n=t.resolve(e.dirPath,".lefthook");await Promise.all([r.promises.writeFile(t.join(e.dirPath,"lefthook.yml"),g.dump(Je,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}})),r.promises.rm(n,{force:!0,recursive:!0})]);const{typecheck:s}=Be(e);if(s){const s=e.repository?.startsWith("github:WillBoosterLab/")?Ne.prePushForLab:Ne.prePush;r.mkdirSync(t.join(n,"pre-push"),{recursive:!0}),await S.run((()=>r.promises.writeFile(t.join(n,"pre-push","check.sh"),s+"\n",{mode:493})))}const i=`${Ne.postMerge}\n\n${De(e).join("\n")}\n`;r.mkdirSync(t.join(n,"post-merge"),{recursive:!0}),await S.run((()=>r.promises.writeFile(t.resolve(n,"post-merge","prepare.sh"),i,{mode:493})))}(e)}))}async function ze(e){return j.functionIgnoringException("generateLintstagedrc",(async()=>{await async function(e){const n=t.resolve(e.dirPath,".lintstagedrc.cjs");if(e.isBun)return void await S.run((()=>r.promises.rm(n,{force:!0})));const s=e.isRoot?"node node_modules/.bin/":"node ../../node_modules/.bin/",i=[];if(e.doesContainsJavaScript||e.doesContainsTypeScript){const t=`\n '${Ge(e)}': [${JSON.stringify(`${s}eslint --fix${xe.getLintFixSuffix(e)}`)}, '${s}prettier --cache --write'],`;i.push(t)}const o=e.isRoot?" && !file.includes('/packages/')":"";i.push(`\n './**/*.{${le.prettier.join(",")}}': files => {\n let filteredFiles = files.filter(file => !file.includes('/test-fixtures/')${o});${function(e){return e.doesContainsJavaScript||e.doesContainsTypeScript?`\n\n filteredFiles = filteredFiles.map((file) => path.relative('', file));\n filteredFiles = micromatch.not(filteredFiles, '${Ge(e)}');\n filteredFiles = filteredFiles.map((file) => path.resolve(file));`:""}(e)}\n if (filteredFiles.length === 0) return [];\n const commands = [\`${s}prettier --cache --write \${filteredFiles.join(' ')}\`];\n if (filteredFiles.some(file => file.endsWith('package.json'))) {\n commands.push('${s}sort-package-json');\n }\n return commands;\n },\n './**/migration.sql': (files) => {\n for (const file of files) {\n const content = fs.readFileSync(file, 'utf-8');\n if (content.includes('Warnings:')) {\n return [\n \`!!! Migration SQL file (\${path.relative('', file)}) contains warnings !!! Solve the warnings and commit again.\`,\n ];\n }\n }\n return [];\n},`),e.doesContainsPubspecYaml&&i.push("\n './{lib,test,test_driver}/**/*.dart': files => {\n const filteredFiles = files.filter(file => !file.includes('generated'))\n .filter(file => !file.endsWith('.freezed.dart') && !file.endsWith('.g.dart'));\n if (filteredFiles.length === 0) return [];\n return [`flutter format ${filteredFiles.join(' ')}`];\n },");e.doesContainsPoetryLock&&i.push("\n './**/*.py': [\n 'poetry run isort --profile black --filter-files',\n 'poetry run black',\n 'poetry run flake8'\n ],");const a=`const fs = require('fs');\nconst path = require('path');\n${e.doesContainsJavaScript||e.doesContainsTypeScript?"const micromatch = require('micromatch');\n":""}\nmodule.exports = {${i.join("")}\n};\n`;await S.run((()=>r.promises.rm(t.resolve(e.dirPath,".lintstagedrc.js"),{force:!0}))),await S.run((()=>r.promises.rm(t.resolve(e.dirPath,".lintstagedrc.json"),{force:!0}))),await S.run((()=>C.generateFile(n,a)))}(e)}))}function Ge(e){return`./{${Pe(e).join(",")}}/**/*.{${le.eslint.join(",")}}`}async function Ue(e){return j.functionIgnoringException("generateNextConfigJson",(async()=>{const n=["js","mjs","cjs"].map((n=>t.resolve(e.dirPath,`next.config.${n}`))).find((e=>r.existsSync(e)));if(!n)return;const s=(await r.promises.readFile(n,"utf8")).replace(/=\s*{([\S\s]*)};/,((e,t)=>(t.includes("eslint:")||(t+="eslint: { ignoreDuringBuilds: true },"),t.includes("typescript:")||(t+="typescript: { ignoreBuildErrors: true },"),`= {${t}};`)));await S.run((()=>C.generateFile(n,s)))}))}async function He(e){return j.functionIgnoringException("generatePrettierignore",(async()=>{const n=t.resolve(e.dirPath,".prettierignore"),s=await C.readFileIgnoringError(n)??"",i=re.getHeadUserContent(s),o=re.getTailUserContent(s),r=t.resolve(e.dirPath,".gitignore"),a=await re.readGitignoreWithoutSeparators(r)||"";let c="";e.doesContainsPubspecYaml&&(c="\nandroid/app/\nios/Runner/Assets.xcassets/\npubspec.yaml\n");const l=i+"\n3rd-party/\nandroid/\nios/\nno-format/\ntest-fixtures/\n*.d.ts\n*.min.js\n.yarn/\n.pnp.js\n"+c+a+o;await S.run((()=>C.generateFile(n,l)))}))}const Me={venvPath:".",venv:".venv"};async function qe(e){return j.functionIgnoringException("generatePyrightConfigJson",(async()=>{let n=m(Me);const s=t.resolve(e.dirPath,"pyrightconfig.json");try{const e=await r.promises.readFile(s,"utf8"),t=JSON.parse(e);n=u.all([n,t,n],{arrayMerge:V})}catch{}const i=JSON.stringify(n);await S.run((()=>C.generateFile(s,i)))}))}async function Ye(e){return j.functionIgnoringException("generateReadme",(async()=>{const n=t.resolve(e.dirPath,"README.md");let s=await r.promises.readFile(n,"utf8");r.existsSync(t.resolve(e.dirPath,".releaserc.json"))&&(s=Ke(s,"[](https://github.com/semantic-release/semantic-release)"));const i=e.repository?.slice(e.repository?.indexOf(":")+1),o=r.readdirSync(`${e.dirPath}/.github/workflows`);for(const n of o){if(!n.startsWith("test")&&!n.startsWith("deploy"))continue;let o=n;o=o[0].toUpperCase()+o.slice(1,o.indexOf(".")),o=o.replace("-"," ");const a=`[](https://github.com/${i}/actions/workflows/${n})`;r.existsSync(t.resolve(e.dirPath,`.github/workflows/${n}`))&&(s=Ke(s,a))}await S.run((()=>C.generateFile(n,s)))}))}function Ke(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 s=e.slice(0,n+1);let i=e.slice(n+1);return i.startsWith("[")||i.startsWith("!")||(i=`\n${i}`),`${s}${t}\n${i}`}return`${e}\n${t}\n`}async function Ve(e){return j.functionIgnoringException("generateReleaserc",(async()=>{const n=t.resolve(e.dirPath,".releaserc.json"),s=JSON.parse(await r.promises.readFile(n,"utf8")),i=s?.plugins||[];for(let e=0;e<i.length;e++){const t=Array.isArray(i[e])?i[e][0]:i[e],n=Array.isArray(i[e])&&i[e][1]||{};"@semantic-release/commit-analyzer"===t?i[e]=["@semantic-release/commit-analyzer",u.all([n,{preset:"conventionalcommits"}],{arrayMerge:V})]:"@semantic-release/github"===t&&(i[e]=["@semantic-release/github",u.all([n,{successComment:!1,failComment:!1,labels:["r: semantic-release"],releasedLabels:["released :bookmark:"]}],{arrayMerge:V})])}const o=JSON.stringify(s);await S.run((()=>C.generateFile(n,o)))}))}const Xe={$schema:"https://docs.renovatebot.com/renovate-schema.json",extends:["github>WillBooster/willbooster-configs:renovate.json5"]};async function Qe(e){return j.functionIgnoringException("generateRenovateJson",(async()=>{let n=m(Xe);const s=t.resolve(e.dirPath,"renovate.json");if(r.existsSync(`${s}5`))return;try{const e=await r.promises.readFile(s,"utf8"),t=JSON.parse(e);n=u.all([n,t,n],{arrayMerge:V}),n.extends=n.extends.filter((e=>"@willbooster"!==e))}catch{}e.depending.blitz&&(n.packageRules??=[],n.packageRules.some((e=>e.packageNames.includes("next")))||n.packageRules.push({packageNames:["next"],enabled:!1})),await S.run((()=>r.promises.rm(t.resolve(e.dirPath,".dependabot"),{force:!0}))),await S.run((()=>r.promises.rm(t.resolve(e.dirPath,".renovaterc.json"),{force:!0})));const i=JSON.stringify(n);await S.run((()=>C.generateFile(s,i)))}))}function Ze(e){const t=Object.entries(e).sort((([e],[t])=>e.localeCompare(t)));for(const[n,s]of t)delete e[n],e[n]=s,"object"==typeof s&&null!==s&&Ze(s);return e}const et={compilerOptions:{target:"ES2022",module:"ESNext",moduleResolution:"Node",jsx:"react-jsx",alwaysStrict:!0,strict:!0,skipLibCheck:!0,allowSyntheticDefaultImports:!0,esModuleInterop:!0,resolveJsonModule:!0,declaration:!0,sourceMap:!0,importHelpers:!1,outDir:"dist",typeRoots:["./node_modules/@types","./@types"]},include:["src/**/*","tests/**/*","scripts/**/*","packages/*/src/**/*","packages/*/tests/**/*","packages/*/scripts/**/*"]},tt={compilerOptions:{target:"ES2022",module:"ESNext",moduleResolution:"Node",jsx:"react-jsx",alwaysStrict:!0,strict:!0,skipLibCheck:!0,allowSyntheticDefaultImports:!0,esModuleInterop:!0,resolveJsonModule:!0,declaration:!0,sourceMap:!0,importHelpers:!1,outDir:"dist",typeRoots:["../../node_modules/@types","../../@types","./@types"]},include:["src/**/*","tests/**/*","scripts/**/*"]};async function nt(e){return j.functionIgnoringException("generateTsconfig",(async()=>{if(e.depending.blitz||e.depending.next)return;let n=m(e.isRoot?et:tt);e.doesContainsJsxOrTsx||e.doesContainsJsxOrTsxInPackages||delete n.compilerOptions?.jsx,e.isRoot&&!e.doesContainsSubPackageJsons&&(n.include=n.include?.filter((e=>!e.startsWith("packages/*/")))),e.isEsmPackage&&(n.compilerOptions={...n.compilerOptions,module:"NodeNext",moduleResolution:"NodeNext"});const s=t.resolve(e.dirPath,"tsconfig.json");try{const t=await r.promises.readFile(s,"utf8"),i=JSON.parse(t);"./node_modules/@willbooster/tsconfig/tsconfig.json"===i.extends&&delete i.extends,delete n.compilerOptions?.target,e.isEsmPackage||(delete n.compilerOptions?.module,delete n.compilerOptions?.moduleResolution),i.compilerOptions?.jsx&&delete n.compilerOptions?.jsx,n=u.all([n,i,n],{arrayMerge:X}),n.include=n.include?.filter((e=>!e.includes("@types")&&!e.includes("__tests__")))}catch{}Ze(n),n.include?.sort();const i=JSON.stringify(n);delete n.compilerOptions?.experimentalDecorators,await S.run((()=>C.generateFile(s,i)))}))}const st=["**/.git/objects/**","**/.git/subtree-cache/**","**/node_modules/**","**/tmp/**","**/temp/**","**/dist/**"];async function it(e){return j.functionIgnoringException("generateVscodeSettings",(async()=>{try{const n=t.resolve(e.dirPath,".vscode","settings.json"),s=await r.promises.readFile(n,"utf8");let i=JSON.parse(s);for(const e of st)i=u.all([i,ot(e)]);e.doesContainsPoetryLock&&(i=u.all([i,ot("**/.venv/**")])),e.depending.next&&(i=u.all([i,ot("**/.next/**")])),Ze(i??{});const o=JSON.stringify(i,void 0,2);await S.run((()=>C.generateFile(n,o)))}catch{}}))}function ot(e){return{"files.watcherExclude":{[e]:!0}}}const rt={test:{name:"Test",on:{pull_request:{"paths-ignore":["**.md","**/docs/**"]},push:{branches:["main","wbfy"],"paths-ignore":["**.md","**/docs/**"]}},concurrency:{group:"${{ github.workflow }}-${{ github.ref }}","cancel-in-progress":!0},jobs:{test:{uses:"WillBooster/reusable-workflows/.github/workflows/test.yml@main"}}},release:{name:"Release",on:{push:{branches:[]}},concurrency:{group:"${{ github.workflow }}","cancel-in-progress":!1},jobs:{release:{uses:"WillBooster/reusable-workflows/.github/workflows/release.yml@main"}}},wbfy:{name:"Willboosterify",on:{workflow_dispatch:null},jobs:{wbfy:{uses:"WillBooster/reusable-workflows/.github/workflows/wbfy.yml@main"}}},"wbfy-merge":{name:"Merge wbfy",on:{workflow_dispatch:null},jobs:{"wbfy-merge":{uses:"WillBooster/reusable-workflows/.github/workflows/wbfy-merge.yml@main"}}},"semantic-pr":{name:"Lint PR title",on:{pull_request_target:{types:["opened","edited","synchronize"]}},jobs:{"semantic-pr":{uses:"WillBooster/reusable-workflows/.github/workflows/semantic-pr.yml@main"}}},sync:{name:"Sync",on:{},jobs:{sync:{uses:"WillBooster/reusable-workflows/.github/workflows/sync.yml@main"}}},"notify-ready":{name:"Notify ready",on:{issues:{types:["labeled"]}},jobs:{"notify-ready":{uses:"WillBooster/reusable-workflows/.github/workflows/notify-ready.yml@main",secrets:{DISCORD_WEBHOOK_URL:"${{ secrets.DISCORD_WEBHOOK_URL_FOR_READY }}"}}}},"close-comment":{name:"Add close comment",on:{pull_request:{types:["opened"]}},jobs:{"close-comment":{uses:"WillBooster/reusable-workflows/.github/workflows/close-comment.yml@main"}}},"add-issue-to-project":{name:"Add issue to GitHub project",on:{issues:{types:["labeled"]}},jobs:{"add-issue-to-project":{uses:"WillBooster/reusable-workflows/.github/workflows/add-issue-to-project.yml@main",secrets:{GH_PROJECT_URL:"${{ secrets.GH_PROJECT_URL }}"}}}},"add-ready-issue-to-project":{name:"Add ready issue to GitHub project",on:{issues:{types:["labeled"]}},jobs:{"add-ready-issue-to-project":{uses:"WillBooster/reusable-workflows/.github/workflows/add-issue-to-project.yml@main",with:{labeled:"ready :rocket:"},secrets:{GH_PROJECT_URL:"https://github.com/orgs/WillBoosterLab/projects/5"}}}}};async function at(e){return j.functionIgnoringException("generateWorkflow",(async()=>{const n=t.resolve(e.dirPath,".github","workflows");await r.promises.mkdir(n,{recursive:!0});const s=t.resolve(e.dirPath,".github","semantic.yml");await S.run((()=>r.promises.rm(s,{force:!0,recursive:!0})));const i=await r.promises.readdir(n,{withFileTypes:!0}),o=new Set(["test.yml","wbfy.yml","wbfy-merge.yml","semantic-pr.yml","close-comment.yml","add-issue-to-project.yml",...i.filter((e=>e.isFile()&&e.name.endsWith(".yml"))).map((e=>e.name))]);e.depending.semanticRelease&&o.add("release.yml"),(e.isPublicRepo||e.repository?.startsWith("github:WillBoosterLab/"))&&(o.add("add-ready-issue-to-project.yml"),o.add("notify-ready.yml"));for(const s of o){const i=t.basename(s,".yml");await S.run((()=>ct(e,n,i)))}await S.run((()=>r.promises.rm(t.join(n,"add-focused-issue-to-project.yml"),{force:!0,recursive:!0})))}))}async function ct(e,n,s){let i=m(rt[s]??{});const o=t.join(n,`${s}.yml`);try{const e=await r.promises.readFile(o,"utf8"),t=g.load(e);i=u.all([i,t,i],{arrayMerge:X})}catch{}s.startsWith("deploy")&&(i={...i,concurrency:{group:"${{ github.workflow }}","cancel-in-progress":!1}},i.jobs&&function(e,t){const n=e[t];delete e[t],e[t]=n}(i,"jobs"),i.on?.push&&(i.on.push["paths-ignore"]=[...new Set([...i.on.push["paths-ignore"]??[],"**.md","**/docs/**"])]));for(const t of Object.values(i.jobs)){if(!t.uses?.includes?.("/reusable-workflows/"))return;lt(e,t,s)}switch(s){case"release":if(i.on?.schedule)delete i.on.push;else{if(!(i.on?.push&&e.release.branches.length>0))return void await r.promises.rm(t.join(n,"release.yml"),{force:!0});i.on.push.branches=e.release.branches}break;case"test":i.on?.push&&(i.on.push.branches=i.on.push.branches.filter((e=>"renovate/**"!==e)));break;case"wbfy":i.on&&pt(i,20,24);break;case"wbfy-merge":pt(i,1,4)}if(function(e){delete e.jobs["add-to-project"]}(i),await dt(i,o),"release"===s)await r.promises.rm(t.join(n,"semantic-release.yml"),{force:!0});else if("sync"===s){if(await r.promises.rm(t.join(n,"sync-init.yml"),{force:!0}),!i.jobs.sync||!i.jobs.sync.with)return;i.jobs["sync-force"]=i.jobs.sync;const e=i.jobs.sync.with.sync_params_without_dest;if(!e)return;i.jobs.sync.with.sync_params_without_dest=`--force ${e}`,i.name="Force to Sync",i.on={workflow_dispatch:null},delete i.jobs.sync,await dt(i,t.join(n,"sync-force.yml"))}}function lt(e,t,n){if(t.with||={},t.secrets||={},"test"!==n&&"release"!==n&&"wbfy"!==n&&"wbfy-merge"!==n&&"add-issue-to-project"!==n&&"add-ready-issue-to-project"!==n||(t.secrets.GH_TOKEN=e.isPublicRepo?"${{ secrets.PUBLIC_GH_BOT_PAT }}":"${{ secrets.GH_BOT_PAT }}"),!e.release.npm||"release"!==n&&"test"!==n||(t.secrets.NPM_TOKEN="${{ secrets.NPM_TOKEN }}"),t.secrets.FIREBASE_TOKEN&&(t.secrets.GCP_SA_KEY_JSON_FOR_FIREBASE="${{ secrets.GCP_SA_KEY_JSON_FOR_FIREBASE }}",delete t.secrets.FIREBASE_TOKEN),(t.secrets.DISCORD_WEBHOOK_URL&&("release"===n||n.startsWith("deploy"))||t.with.server_url&&n.startsWith("deploy"))&&(t.secrets.DISCORD_WEBHOOK_URL="${{ secrets.DISCORD_WEBHOOK_URL_FOR_RELEASE }}"),"sync"===n){const e=t.with?.sync_params_without_dest;e&&(t.with.sync_params_without_dest=e.toString().replace("sync ",""))}if(e.repository?.startsWith("github:WillBooster/")?t.uses=t.uses.replace("WillBoosterLab/","WillBooster/"):e.repository?.startsWith("github:WillBoosterLab/")&&(t.uses=t.uses.replace("WillBooster/","WillBoosterLab/")),".env"===t.with.dot_env_path&&delete t.with.dot_env_path,function(e){if(!e.with)return;delete e.with.non_self_hosted,delete e.with.notify_discord,delete e.with.require_fly,delete e.with.require_gcloud,delete e.with.cpu_arch,delete e.with.label,delete e.with.labelOperator}(t),n.startsWith("deploy")&&t.secrets.FLY_API_TOKEN&&t.with.deploy_command&&(t.with.deploy_command=t.with.deploy_command.toString().replace(/\s+--json/,"")),e.doesContainsDockerfile&&("extra-large"!==t.with.ci_size&&(n.startsWith("deploy")||n.startsWith("test"))&&(t.with.ci_size="large"),n.startsWith("deploy")&&(t.with.cpu_arch="X64")),"release"===n||"test"===n||"wbfy"===n||"wbfy-merge"===n||n.startsWith("deploy")?e.isPublicRepo&&(t.with.github_hosted_runner=!0):delete t.with.github_hosted_runner,Object.keys(t.with).length>0?Ze(t.with):delete t.with,Object.keys(t.secrets).length>0){const e=Ze(t.secrets);delete t.secrets,t.secrets=e}else delete t.secrets}function pt(e,t,n){const[s,i]=(e.on.schedule?.[0]?.cron??"").split(" ").map(Number);if(0!==s&&Number.isInteger(i)){const e=(i+9)%24;if(t<n?t<=e&&e<n:t<=e||e<n)return}const o=`${1+Math.floor(59*Math.random())} ${(t+Math.floor(Math.random()*(n-t))-9+24)%24} * * *`;e.on.schedule=[{cron:o}]}async function dt(e,t){const n=g.dump(e,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}});await r.promises.writeFile(t,n)}async function ut(e){return j.functionIgnoringException("generateYarnrcYml",(async()=>{const n=t.resolve(e.dirPath,".yarnrc.yml");if(e.isBun)return await S.run((()=>r.promises.rm(n,{force:!0}))),await S.run((()=>r.promises.rm(t.resolve(e.dirPath,".yarn"),{force:!0,recursive:!0}))),void await S.run((()=>r.promises.rm(t.resolve(e.dirPath,"yarn.lock"),{force:!0,recursive:!0})));const s=W("yarn",["--version"],e.dirPath),i=function(e,t){const n=W("npm",["show",e,"versions","--json"],t);return JSON.parse(n).at(-1)}("@yarnpkg/cli",e.dirPath);mt(s)<=mt(i)&&s!==i&&R("yarn",["set","version",i],e.dirPath,1);const o=t.join(e.dirPath,".yarn","releases");await r.promises.mkdir(o,{recursive:!0});for(const e of await r.promises.readdir(o))e.startsWith("yarn-")&&!e.startsWith(`yarn-${i}.`)&&await S.run((()=>r.promises.rm(t.join(o,e))));const a=t.resolve(e.dirPath,".yarnrc");await S.run((()=>r.promises.rm(a,{force:!0})));const c=g.load(await r.promises.readFile(n,"utf8"));c.defaultSemverRangePrefix="",c.nodeLinker="node-modules",c.nmMode="hardlinks-global",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 n=t.resolve(e.dirPath,".yarnrc","undefined.cjs");await S.run((()=>r.promises.rm(n,{force:!0})))}0===c.plugins.length&&delete c.plugins,await r.promises.writeFile(n,g.dump(c,{lineWidth:-1})),R("yarn",["dlx","yarn-plugin-auto-install"],e.dirPath)}))}function mt(e){const[t]=e.split(".");return Number(t)}async function ft(e){return j.functionIgnoringException("setupLabels",(async()=>{if(!D)return;const[t,n]=A.getOrgAndName(e.repository??"");if(t&&n&&("WillBooster"===t||"WillBoosterLab"===t))try{await gt(t,n,"d1: x-easy :hedgehog:","EDE9FE"),await gt(t,n,"d2: easy :rabbit2:","DDD6FE"),await gt(t,n,"d3: medium :ox:","C4B5FD"),await gt(t,n,"d4: hard :squid:","A78BFA"),await gt(t,n,"d5: x-hard :whale2:","8B5CF6"),await gt(t,n,"p1: critical :fire::fire::fire:","EF4444"),await gt(t,n,"p2: urgent :fire::fire:","F87171"),await gt(t,n,"p3: important :fire:","FCA5A5"),await gt(t,n,"p4: nice to have :droplet:","FECACA"),await gt(t,n,"r: blitz","5300bc"),await gt(t,n,"r: firebase","ffca28"),await gt(t,n,"r: prisma","0c344b"),await gt(t,n,"r: react","61dafb"),await gt(t,n,"r: svelte","ff3e00"),await gt(t,n,"r: semantic-release","494949"),await gt(t,n,"ready :rocket:","22C55E"),await gt(t,n,"review requested :mag:","FBCA04"),await gt(t,n,"released :bookmark:","6366F1"),await gt(t,n,"s: 0.5h :clock1230:","F3F4F6"),await gt(t,n,"s: 1h :clock1:","E5E7EB"),await gt(t,n,"s: 2h :clock2:","D1D5DB"),await gt(t,n,"s: 3h :clock3:","9CA3AF"),await gt(t,n,"s: 5h :clock5:","6B7280"),await gt(t,n,"s: 8h :clock8:","4B5563"),await gt(t,n,"s: 13h :clock1:","374151"),await gt(t,n,"t: build :hammer:","BFDBFE"),await gt(t,n,"t: chore :broom:","BFDBFE"),await gt(t,n,"t: ci :construction_worker:","BFDBFE"),await gt(t,n,"t: docs :memo:","BFDBFE"),await gt(t,n,"t: feat :sparkles:","BFDBFE"),await gt(t,n,"t: fix :bug:","BFDBFE"),await gt(t,n,"t: perf :zap:","BFDBFE"),await gt(t,n,"t: refactor :recycle:","BFDBFE"),await gt(t,n,"t: style :lipstick:","BFDBFE"),await gt(t,n,"t: test :test_tube:","BFDBFE"),await gt(t,n,"project","24292F"),await gt(t,n,"focused :dart:","22C55E"),await ht(t,n,"bug"),await ht(t,n,"documentation"),await ht(t,n,"duplicate"),await ht(t,n,"enhancement"),await ht(t,n,"good first issue"),await ht(t,n,"help wanted"),await ht(t,n,"invalid"),await ht(t,n,"question"),await ht(t,n,"wontfix"),await ht(t,n,"ready"),await ht(t,n,"review requested"),await ht(t,n,"released"),await ht(t,n,"semantic-release")}catch(e){console.warn("Skip setupLabels due to:",e?.stack??e)}}))}async function gt(e,t,n,s){try{await T.request("POST /repos/{owner}/{repo}/labels",{owner:e,repo:t,name:n,color:s})}catch{await T.request("PATCH /repos/{owner}/{repo}/labels/{name}",{owner:e,repo:t,name:n,color:s})}}async function ht(e,t,n){try{await T.request("DELETE /repos/{owner}/{repo}/labels/{name}",{owner:e,repo:t,name:n})}catch{}}const yt=["READY_DISCORD_WEBHOOK_URL"];async function wt(e){return j.functionIgnoringException("setupSecrets",(async()=>{if(!D||!k.doesUploadEnvVars)return;const[t,n]=A.getOrgAndName(e.repository??"");if(!t||!n||"WillBoosterLab"!==t)return;const s=h.config().parsed||{};if(0!==Object.keys(s).length)try{for(const e of yt)try{await T.request("DELETE /repos/{owner}/{repo}/actions/secrets/{secret_name}",{owner:t,repo:n,secret_name:e})}catch{}const i=await T.request("GET /repos/{owner}/{repo}/actions/secrets/public-key",{owner:t,repo:n}),{key:o,key_id:r}=i.data;await y.ready;for(const[i,a]of Object.entries(s)){if(e.isPublicRepo&&"GH_BOT_PAT"===i)continue;if(!e.isPublicRepo&&"PUBLIC_GH_BOT_PAT"===i)continue;const s=y.from_base64(o,y.base64_variants.ORIGINAL),c=y.from_string(a),l=y.crypto_box_seal(c,s),p=y.to_base64(l,y.base64_variants.ORIGINAL);await T.request("PUT /repos/{owner}/{repo}/actions/secrets/{secret_name}",{owner:t,repo:n,secret_name:i,encrypted_value:p,key_id:r})}}catch(e){console.warn("Skip setupSecrets due to:",e?.stack??e)}}))}async function bt(e){const[t,n]=A.getOrgAndName(e.repository??"");t&&n&&("WillBooster"!==t&&"WillBoosterLab"!==t||await s((()=>T.request("PATCH /repos/{owner}/{repo}",{owner:t,repo:n,allow_merge_commit:!1,allow_squash_merge:!0,allow_rebase_merge:!1,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}:{}}))))}const vt={"pull_request_template.md":'\nClose #<IssueNumber>\n\n## Self Check\n\n- [ ] I\'ve confirmed `All checks have passed` on this page. (このページで `All checks have passed` が表示されていることを確認した。)\n - You may leave this box unchecked due to long workflows.\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 - All tests are passed.\n - Test command (e.g., `yarn test`) is passed.\n - Lint command (e.g., `yarn lint`) is passed.\n- [ ] I\'ve reviewed my changes on GitHub PR\'s diff view. (GitHub上で自分の変更内容を確認した。)\n- [ ] I\'ve written the steps to test. (テスト手順を記載した。)\n- [ ] I\'ve added screenshots. (UIを変更した場合、スクリーンショットを追加した。)\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## 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\n\x3c!-- 日本語で記述しても大丈夫です。 --\x3e\n'.trim()};async function kt(e){return j.functionIgnoringException("generateGitHubTemplates",(async()=>{for(const[n,s]of Object.entries(vt)){const i=t.resolve(e.dirPath,".github",n);if(r.existsSync(i)){const e=await r.promises.readFile(i,"utf8");if(w(e,s)>s.length/2)continue}await r.promises.mkdir(t.resolve(e.dirPath,".github"),{recursive:!0}),await S.run((()=>C.generateFile(i,s)))}}))}const jt=v.object({typos:v.object({all:v.record(v.string()).optional(),doc:v.record(v.string()).optional(),ts:v.record(v.string()).optional(),text:v.record(v.string()).optional()}).optional()});async function xt(n,s){const i=t.resolve(n,"package.json");try{const o=r.existsSync(i);let a={},c={},l={},p=!1;if(o){const e=r.readFileSync(i,"utf8");l=JSON.parse(e),a=l.dependencies??{},c=l.devDependencies??{},p="module"===l.type}let d=[],u=[];try{const s=t.resolve(n,".releaserc.json"),i=JSON.parse(await e.readFile(s,"utf8"));d=i?.branches||[],u=i?.plugins?.flat()||[]}catch{}const m="packages"!==t.basename(t.resolve(n,".."))||!r.existsSync(t.resolve(n,"..","..","package.json"));let f;m&&(f=await async function(e,t){const n=b(e),s=(await n.getRemotes(!0)).find((e=>"origin"===e.name)),i=s?.refs?.fetch??s?.refs?.push;if("string"==typeof i){const e=await Pt(i);if(e)return e}const o="string"==typeof t.repository?t.repository:t.repository?.url;if(o){const e=await Pt(o);if(e&&"Not Found"!==e.message)return e}}(n,l));let g="";try{g+=(await e.readFile(t.resolve(n,".tool-versions"),"utf8")).trim()}catch{}for(const[s,i]of[["java","java"],["node","nodejs"],["python","python"]])try{const o=await e.readFile(t.resolve(n,`.${s}-version`),"utf8");g&&(g+="\n"),g+=i+" "+o.trim()}catch{}let h="";try{h=await e.readFile(t.resolve(n,"Dockerfile"),"utf8")}catch{}const y=t.resolve(n,"wbfy.json");let w;try{const t=await e.readFile(y,"utf8");w=jt.parse(JSON.parse(t))}catch{}const v={dirPath:n,dockerfile:h,isRoot:m,isPublicRepo:!1===f?.private,isReferredByOtherRepo:!!l.files,repository:f?.full_name?`github:${f?.full_name}`:void 0,isBun:s?.isBun||r.existsSync(t.join(n,"bunfig.toml")),isEsmPackage:p,isWillBoosterConfigs:i.includes(`${t.sep}willbooster-configs`),doesContainsSubPackageJsons:_t("packages/**/package.json",n),doesContainsDockerfile:!!h||r.existsSync(t.resolve(n,"docker-compose.yml")),doesContainsGemfile:r.existsSync(t.resolve(n,"Gemfile")),doesContainsGoMod:r.existsSync(t.resolve(n,"go.mod")),doesContainsPackageJson:r.existsSync(t.resolve(n,"package.json")),doesContainsPoetryLock:r.existsSync(t.resolve(n,"poetry.lock")),doesContainsPomXml:r.existsSync(t.resolve(n,"pom.xml")),doesContainsPubspecYaml:r.existsSync(t.resolve(n,"pubspec.yaml")),doesContainsTemplateYaml:r.existsSync(t.resolve(n,"template.yaml")),doesContainsVscodeSettingsJson:r.existsSync(t.resolve(n,".vscode","settings.json")),doesContainsJavaScript:_t("{app,src,tests,scripts}/**/*.{cjs,mjs,js,jsx}",n),doesContainsTypeScript:_t("{app,src,tests,scripts}/**/*.{cts,mts,ts,tsx}",n),doesContainsJsxOrTsx:_t("{app,src,tests}/**/*.{t,j}sx",n),doesContainsJavaScriptInPackages:_t("packages/**/{app,src,tests,scripts}/**/*.{cjs,mjs,js,jsx}",n),doesContainsTypeScriptInPackages:_t("packages/**/{app,src,tests,scripts}/**/*.{cts,mts,ts,tsx}",n),doesContainsJsxOrTsxInPackages:_t("packages/**/{app,src,tests}/**/*.{t,j}sx",n),depending:{blitz:!!a.blitz,firebase:!!c["firebase-tools"],litestream:h.includes("install-litestream.sh"),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")},versionsText:g,packageJson:l,wbfyJson:w};if(v.isBun||(v.eslintBase=function(e){if(e.depending.blitz)return"@willbooster/eslint-config-blitz-next";if(e.depending.next)return"@willbooster/eslint-config-next";if(e.doesContainsTypeScript)return e.doesContainsJsxOrTsx?"@willbooster/eslint-config-ts-react":"@willbooster/eslint-config-ts";if(e.doesContainsJsxOrTsx)return"@willbooster/eslint-config-js-react";if(e.doesContainsJavaScript)return"@willbooster/eslint-config-js"}(v)),v.doesContainsGemfile||v.doesContainsGoMod||v.doesContainsPackageJson||v.doesContainsPoetryLock||v.doesContainsPomXml||v.doesContainsPubspecYaml||v.doesContainsTemplateYaml)return v}catch{}}function _t(e,t){return c(e,{dot:!0,cwd:t}).length>0}async function Pt(e){const[t,n]=A.getOrgAndName(e);if(!t||!n)return;const s={full_name:`${t}/${n}`};try{const e=await T.request("GET /repos/{owner}/{repo}",{owner:t,repo:n});Object.assign(s,e.data)}catch{}return s}await async function(){const n=await o(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"}}).strict().argv;k.isVerbose=n.verbose,k.doesUploadEnvVars=n.env;for(const s of n.paths){const o=t.join(s,"packages"),r=(await i((()=>e.readdir(o,{withFileTypes:!0})))??[]).filter((e=>e.isDirectory())).map((e=>t.join(o,e.name)));await $([s,...r]);const a=await xt(s);if(!a){console.error(`there is no valid package.json in ${s}`);continue}const c=E(a),l=(await Promise.all(r.map((e=>xt(e,a))))).filter((e=>!!e)),p=[a,...l];if(k.isVerbose)for(const e of p)console.info(e);await H(a),await ut(a),await Promise.all([x(a),P(a),c.then((()=>Ye(a))),ce(a),de(a),he(a),kt(a),We(a),Qe(a),Ve(a),at(a),ft(a),wt(a),bt(a),...a.isBun?[ee(a),Ie(a).then((()=>Le(a)))]:[Ie(a)],ze(a)]),await S.promiseAll();const d=[];for(const e of p)(e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages)&&d.push(F(e,e.isRoot?p:[e])),e.depending.playwrightTest&&d.push(_(e)),e.depending.next&&d.push(Ue(e)),await we(e,a),await S.promiseAll(),(e.isRoot||e.doesContainsPackageJson)&&(await He(e),await Ee(e,a,n.skipDeps),d.push(ze(e)),e.doesContainsVscodeSettingsJson&&e.doesContainsPackageJson&&d.push(it(e)),(e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages)&&d.push(nt(e)),(e.doesContainsJavaScript||e.doesContainsJavaScriptInPackages||e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages)&&(a.isBun&&d.push(Z(e)),a.isWillBoosterConfigs||d.push(fe(e,a)),d.push(me(e))),e.depending.pyright&&d.push(qe(e)));await Promise.all(d),await S.promiseAll();const u=a.isBun?"bun":"yarn";R(u,["cleanup"],s),a.isBun?R(u,["update"],s):R(u,["install"],s)}}();
|
2
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9vcHRpb25zLnRzIiwiLi4vc3JjL2xvZ2dlci50cyIsIi4uL3NyYy9maXhlcnMvZG9ja2VyZmlsZS50cyIsIi4uL3NyYy9maXhlcnMvcGxheXdyaWdodENvbmZpZy50cyIsIi4uL3NyYy9maXhlcnMvcHJpc21hLnRzIiwiLi4vc3JjL2ZpeGVycy90ZXN0RGlyZWN0b3J5LnRzIiwiLi4vc3JjL3V0aWxzL3Byb21pc2VQb29sLnRzIiwiLi4vc3JjL2ZpeGVycy90eXBlRGVmaW5pdGlvbi50cyIsIi4uL3NyYy91dGlscy9mc1V0aWwudHMiLCIuLi9zcmMvZml4ZXJzL3R5cG9zLnRzIiwiLi4vc3JjL3V0aWxzL2dpdGh1YlV0aWwudHMiLCIuLi9zcmMvdXRpbHMvc3Bhd25VdGlsLnRzIiwiLi4vc3JjL3V0aWxzL3ZlcnNpb24udHMiLCIuLi9zcmMvdXRpbHMvdmVyc2lvbkNvbnN0YW50cy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2FzZGYudHMiLCIuLi9zcmMvdXRpbHMvbWVyZ2VVdGlsLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvYmlvbWUudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9idW5maWcudHMiLCIuLi9zcmMvdXRpbHMvaWdub3JlRmlsZVV0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9kb2NrZXJpZ25vcmUudHMiLCIuLi9zcmMvdXRpbHMvZXh0ZW5zaW9ucy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2VkaXRvcmNvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2VzbGludGlnbm9yZS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2VzbGludHJjLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2l0YXR0cmlidXRlcy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2dpdGlnbm9yZS50cyIsIi4uL3NyYy9naXRodWIvY29tbWl0LnRzIiwiLi4vc3JjL3V0aWxzL2VzbGludFV0aWwudHMiLCIuLi9zcmMvdXRpbHMvc3JjRGlyZWN0b3JpZXMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9wYWNrYWdlSnNvbi50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2h1c2t5cmMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9pZGVhLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvbGVmdGhvb2sudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9saW50c3RhZ2VkcmMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9uZXh0Y29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcHJldHRpZXJpZ25vcmUudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9weXJpZ2h0Y29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVhZG1lLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVsZWFzZXJjLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVub3ZhdGVyYy50cyIsIi4uL3NyYy91dGlscy9vYmplY3RVdGlsLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvdHNjb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy92c2NvZGVTZXR0aW5ncy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3dvcmtmbG93LnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMveWFybnJjLnRzIiwiLi4vc3JjL2dpdGh1Yi9sYWJlbC50cyIsIi4uL3NyYy9naXRodWIvc2VjcmV0LnRzIiwiLi4vc3JjL2dpdGh1Yi9zZXR0aW5ncy50cyIsIi4uL3NyYy9naXRodWIvdGVtcGxhdGUudHMiLCIuLi9zcmMvcGFja2FnZUNvbmZpZy50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJjbGFzcyBPcHRpb25zIHtcbiAgaXNWZXJib3NlOiBib29sZWFuO1xuICBkb2VzVXBsb2FkRW52VmFyczogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmlzVmVyYm9zZSA9IGZhbHNlO1xuICAgIHRoaXMuZG9lc1VwbG9hZEVudlZhcnMgPSBmYWxzZTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7XG4iLCJpbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi9vcHRpb25zLmpzJztcblxuY2xhc3MgTG9nZ2VyIHtcbiAgYXN5bmMgZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbihuYW1lOiBzdHJpbmcsIGZ1bmM6ICgpID0+IFByb21pc2U8dm9pZD4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgLS0tLS0tLS0tICR7bmFtZX0gc3RhcnQgLS0tLS0tLS0tYCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmdW5jKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRXJyb3Igb2NjdXJyZWQgaW4gJHtuYW1lfTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3Iuc3RhY2sgOiBlcnJvcn19YCk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGAtLS0tLS0tLS0tICR7bmFtZX0gZW5kIC0tLS0tLS0tLS1gKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGxvZ2dlciA9IG5ldyBMb2dnZXIoKTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeERvY2tlcmZpbGUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4RG9ja2VyZmlsZScsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWNvbmZpZy5kb2VzQ29udGFpbnNEb2NrZXJmaWxlKSByZXR1cm47XG5cbiAgICBjb25zdCBvbGRDb250ZW50ID0gY29uZmlnLmRvY2tlcmZpbGU7XG4gICAgY29uc3QgbmV3Q29udGVudCA9IG9sZENvbnRlbnQ7XG5cbiAgICBpZiAob2xkQ29udGVudCA9PT0gbmV3Q29udGVudCkgcmV0dXJuO1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZShwYXRoLmpvaW4oY29uZmlnLmRpclBhdGgsICdEb2NrZXJmaWxlJyksIG5ld0NvbnRlbnQpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFBsYXl3cmlnaHRDb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4UGxheXdyaWdodENvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihjb25maWcuZGlyUGF0aCwgJ3BsYXl3cmlnaHQuY29uZmlnLnRzJyk7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuXG4gICAgY29uc3QgbmV3Q29udGVudCA9IG9sZENvbnRlbnQucmVwbGFjZSgvcmV0cmllczouKywvLCAncmV0cmllczogcHJvY2Vzcy5lbnYuUFdERUJVRyA/IDAgOiBwcm9jZXNzLmVudi5DSSA/IDUgOiAxLCcpO1xuICAgIGlmIChvbGRDb250ZW50ID09PSBuZXdDb250ZW50KSByZXR1cm47XG5cbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGdsb2JieSB9IGZyb20gJ2dsb2JieSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFByaXNtYUVudkZpbGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFByaXNtYUVudkZpbGVzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGVudkZpbGVzID0gYXdhaXQgZ2xvYmJ5KFsnKi5lbnYnLCAnKi5lbnYuKiddLCB7IGRvdDogdHJ1ZSwgY3dkOiBjb25maWcuZGlyUGF0aCB9KTtcbiAgICBmb3IgKGNvbnN0IGVudkZpbGUgb2YgZW52RmlsZXMpIHtcbiAgICAgIGNvbnN0IGVudkZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBlbnZGaWxlKTtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShlbnZGaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoXG4gICAgICAgIC9EQVRBQkFTRV9VUkw9XCI/KC4rXFwuc3FsaXRlMylcIj9bXFxuJF0vLFxuICAgICAgICAnREFUQUJBU0VfVVJMPVwiJDE/Y29ubmVjdGlvbl9saW1pdD0xXCJcXG4nXG4gICAgICApO1xuICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKGVudkZpbGVQYXRoLCBuZXdDb250ZW50KTtcbiAgICB9XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFRlc3REaXJlY3Rvcmllc1VwZGF0aW5nUGFja2FnZUpzb24ocGFja2FnZURpclBhdGhzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFRlc3REaXJlY3Rvcmllc1VwZGF0aW5nUGFja2FnZUpzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBwYWNrYWdlRGlyUGF0aHMubWFwKGFzeW5jIChwYWNrYWdlRGlyUGF0aCkgPT4ge1xuICAgICAgICBjb25zdCBvbGRUZXN0RGlyUGF0aCA9IHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ19fdGVzdHNfXycpO1xuICAgICAgICBjb25zdCBuZXdUZXN0RGlyUGF0aCA9IHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ3Rlc3RzJyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMucmVuYW1lKG9sZFRlc3REaXJQYXRoLCBuZXdUZXN0RGlyUGF0aCk7XG4gICAgICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpO1xuICAgICAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBvbGRDb250ZW50LnJlcGxhY2VBbGwoJ19fdGVzdHNfXycsICd0ZXN0cycpO1xuICAgICAgICAgIGlmIChvbGRDb250ZW50ID09PSBuZXdDb250ZW50KSByZXR1cm47XG5cbiAgICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAncGFja2FnZS5qc29uJyksIG5ld0NvbnRlbnQpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgeyBQcm9taXNlUG9vbCB9IGZyb20gJ21pbmltYWwtcHJvbWlzZS1wb29sJztcblxuZXhwb3J0IGNvbnN0IHByb21pc2VQb29sID0gbmV3IFByb21pc2VQb29sKCk7XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBpZ25vcmVFbm9lbnRBc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhUeXBlRGVmaW5pdGlvbnMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgY29uZmlnc0luY2x1ZGluZ0NoaWxkcmVuOiBQYWNrYWdlQ29uZmlnW11cbik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFR5cGVEZWZpbml0aW9ucycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBsaWJUeXBlRGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ0B0eXBlcycpO1xuICAgIGNvbnN0IHNyY1R5cGVEaXJQYXRoID1cbiAgICAgIGNvbmZpZy5pc1Jvb3QgJiYgY29uZmlnLmRvZXNDb250YWluc1N1YlBhY2thZ2VKc29ucyA/IHVuZGVmaW5lZCA6IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3NyYycsICd0eXBlcycpO1xuXG4gICAgY29uc3QgZGlyZW50cyA9IGF3YWl0IGlnbm9yZUVub2VudEFzeW5jKCgpID0+IGZzLnJlYWRkaXIobGliVHlwZURpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KSk7XG4gICAgaWYgKCFkaXJlbnRzKSByZXR1cm47XG5cbiAgICBmb3IgKGNvbnN0IGRpcmVudCBvZiBkaXJlbnRzKSB7XG4gICAgICBjb25zdCBkaXJOYW1lID0gZGlyZW50Lm5hbWUuc2xpY2UoMCwgLTUpO1xuICAgICAgY29uc3QgaGFzVHlwZURlY2xhcmF0aW9uRXh0ZW5zaW9uID0gZGlyZW50Lm5hbWUuZW5kc1dpdGgoJy5kLnRzJyk7XG4gICAgICBsZXQgcGFja2FnZU5hbWUgPSBoYXNUeXBlRGVjbGFyYXRpb25FeHRlbnNpb24gPyBkaXJOYW1lIDogZGlyZW50Lm5hbWU7XG4gICAgICBpZiAocGFja2FnZU5hbWUuaW5jbHVkZXMoJ19fJykpIHtcbiAgICAgICAgcGFja2FnZU5hbWUgPSBgQCR7cGFja2FnZU5hbWUucmVwbGFjZSgnX18nLCAnLycpfWA7XG4gICAgICB9XG4gICAgICBjb25zdCBoYXNMaWJyYXJ5ID0gY29uZmlnc0luY2x1ZGluZ0NoaWxkcmVuLnNvbWUoXG4gICAgICAgIChjb25maWcpID0+XG4gICAgICAgICAgY29uZmlnLnBhY2thZ2VKc29uPy5kZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV0gfHwgY29uZmlnLnBhY2thZ2VKc29uPy5kZXZEZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV1cbiAgICAgICk7XG5cbiAgICAgIGlmIChkaXJlbnQuaXNGaWxlKCkgJiYgaGFzVHlwZURlY2xhcmF0aW9uRXh0ZW5zaW9uKSB7XG4gICAgICAgIGlmIChoYXNMaWJyYXJ5KSB7XG4gICAgICAgICAgLy8gTW92ZSBAdHlwZXMvPG5hbWU+L2luZGV4LmQudHMgaWYgaW5zdGFsbGVkXG4gICAgICAgICAgYXdhaXQgZnMubWtkaXIocGF0aC5qb2luKGxpYlR5cGVEaXJQYXRoLCBkaXJOYW1lKSk7XG4gICAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICAgICAgICBmcy5yZW5hbWUocGF0aC5qb2luKGxpYlR5cGVEaXJQYXRoLCBkaXJlbnQubmFtZSksIHBhdGguam9pbihsaWJUeXBlRGlyUGF0aCwgZGlyTmFtZSwgJ2luZGV4LmQudHMnKSlcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKHNyY1R5cGVEaXJQYXRoKSB7XG4gICAgICAgICAgLy8gTW92ZSBzcmMvdHlwZXMvPG5hbWU+IGlmIG5vdCBpbnN0YWxsZWRcbiAgICAgICAgICBhd2FpdCBmcy5ta2RpcihzcmNUeXBlRGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICAgICAgICBmcy5yZW5hbWUocGF0aC5qb2luKGxpYlR5cGVEaXJQYXRoLCBkaXJlbnQubmFtZSksIHBhdGguam9pbihzcmNUeXBlRGlyUGF0aCwgZGlyZW50Lm5hbWUpKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZGlyZW50LmlzRGlyZWN0b3J5KCkgJiYgc3JjVHlwZURpclBhdGggJiYgIWhhc0xpYnJhcnkpIHtcbiAgICAgICAgLy8gTW92ZSBzcmMvdHlwZXMvPG5hbWU+LmQudHMgaWYgbm90IGluc3RhbGxlZFxuICAgICAgICBhd2FpdCBmcy5ta2RpcihzcmNUeXBlRGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgICAgIGlnbm9yZUVub2VudEFzeW5jKCgpID0+XG4gICAgICAgICAgICBmcy5yZW5hbWUoXG4gICAgICAgICAgICAgIHBhdGguam9pbihsaWJUeXBlRGlyUGF0aCwgZGlyZW50Lm5hbWUsICdpbmRleC5kLnRzJyksXG4gICAgICAgICAgICAgIHBhdGguam9pbihzcmNUeXBlRGlyUGF0aCwgYCR7ZGlyZW50Lm5hbWV9LmQudHNgKVxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzcCBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcblxuZXhwb3J0IGNvbnN0IGZzVXRpbCA9IHtcbiAgYXN5bmMgcmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZnNwLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgfSxcbiAgYXN5bmMgZ2VuZXJhdGVGaWxlKGZpbGVQYXRoOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IGZzcC53cml0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQpO1xuICAgIGNvbnNvbGUubG9nKGBHZW5lcmF0ZWQvVXBkYXRlZCAke2ZpbGVQYXRofWApO1xuICB9LFxufTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGdsb2JieSB9IGZyb20gJ2dsb2JieSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFR5cG9zKHBhY2thZ2VDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhBYmJyZXZpYXRpb25zJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGRpclBhdGggPSBwYWNrYWdlQ29uZmlnLmRpclBhdGg7XG4gICAgY29uc3QgZG9jRmlsZXMgPSBhd2FpdCBnbG9iYnkoJyoqLyoubWQnLCB7IGRvdDogdHJ1ZSwgY3dkOiBkaXJQYXRoLCBnaXRpZ25vcmU6IHRydWUgfSk7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYEZvdW5kICR7ZG9jRmlsZXMubGVuZ3RofSBtYXJrZG93biBmaWxlcyBpbiAke2RpclBhdGh9YCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgbWRGaWxlIG9mIGRvY0ZpbGVzKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBtZEZpbGUpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgICBsZXQgbmV3Q29udGVudCA9IGZpeEFiYnJldmlhdGlvbnNJblRleHQoY29udGVudCk7XG4gICAgICAgIG5ld0NvbnRlbnQgPSByZXBsYWNlV2l0aENvbmZpZyhuZXdDb250ZW50LCBwYWNrYWdlQ29uZmlnLCAnZG9jJyk7XG4gICAgICAgIGlmIChjb250ZW50ICE9PSBuZXdDb250ZW50KSB7XG4gICAgICAgICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHRzRmlsZXMgPSBhd2FpdCBnbG9iYnkoXG4gICAgICBbXG4gICAgICAgICd7YXBwLHNyYyx0ZXN0cyxzY3JpcHRzfS8qKi8qLntjanMsbWpzLGpzLGpzeCxjdHMsbXRzLHRzLHRzeH0nLFxuICAgICAgICAncGFja2FnZXMvKiove2FwcCxzcmMsdGVzdHMsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3gsY3RzLG10cyx0cyx0c3h9JyxcbiAgICAgIF0sXG4gICAgICB7IGRvdDogdHJ1ZSwgY3dkOiBkaXJQYXRoLCBnaXRpZ25vcmU6IHRydWUgfVxuICAgICk7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYEZvdW5kICR7dHNGaWxlcy5sZW5ndGh9IFR5cGVTY3JpcHQgZmlsZXMgaW4gJHtkaXJQYXRofWApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHRzRmlsZSBvZiB0c0ZpbGVzKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCB0c0ZpbGUpO1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgbGV0IG5ld0NvbnRlbnQgPSBvbGRDb250ZW50XG4gICAgICAgIC5yZXBsYWNlQWxsKC9cXC9cXC8oLiopY1xcLmZcXC4vZywgJy8vJDFjZi4nKVxuICAgICAgICAucmVwbGFjZUFsbCgvXFwvXFwvKC4qKWVnXFwuL2csICcvLyQxZS5nLicpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9cXC9cXC8oLiopaWVcXC4vZywgJy8vJDFpLmUuJyk7XG4gICAgICBuZXdDb250ZW50ID0gcmVwbGFjZVdpdGhDb25maWcobmV3Q29udGVudCwgcGFja2FnZUNvbmZpZywgJ3RzJyk7XG5cbiAgICAgIGlmIChvbGRDb250ZW50ID09PSBuZXdDb250ZW50KSBjb250aW51ZTtcbiAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgIH1cblxuICAgIGNvbnN0IHRleHRCYXNlZEZpbGVzID0gYXdhaXQgZ2xvYmJ5KCcqKi8qLntjc3YsaHRtLGh0bWwsdHN2LHhtbCx5YW1sLHltbH0nLCB7XG4gICAgICBkb3Q6IHRydWUsXG4gICAgICBjd2Q6IGRpclBhdGgsXG4gICAgICBnaXRpZ25vcmU6IHRydWUsXG4gICAgfSk7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYEZvdW5kICR7dGV4dEJhc2VkRmlsZXMubGVuZ3RofSB0ZXh0LWJhc2VkIGZpbGVzIGluICR7ZGlyUGF0aH1gKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBmaWxlIG9mIHRleHRCYXNlZEZpbGVzKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBmaWxlKTtcbiAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGxldCBuZXdDb250ZW50ID0gb2xkQ29udGVudFxuICAgICAgICAucmVwbGFjZUFsbCgvXFwvXFwvKC4qKWNcXC5mXFwuL2csICcvLyQxY2YuJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL1xcL1xcLyguKillZ1xcLi9nLCAnLy8kMWUuZy4nKVxuICAgICAgICAucmVwbGFjZUFsbCgvXFwvXFwvKC4qKWllXFwuL2csICcvLyQxaS5lLicpO1xuICAgICAgbmV3Q29udGVudCA9IHJlcGxhY2VXaXRoQ29uZmlnKG5ld0NvbnRlbnQsIHBhY2thZ2VDb25maWcsICd0ZXh0Jyk7XG5cbiAgICAgIGlmIChvbGRDb250ZW50ID09PSBuZXdDb250ZW50KSBjb250aW51ZTtcbiAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgIH1cblxuICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaXhBYmJyZXZpYXRpb25zSW5UZXh0KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBjb250ZW50XG4gICAgLnJlcGxhY2VBbGwoL1xcYmNcXC5mXFwuKFteJF0pL2csICdjZi4kMScpXG4gICAgLnJlcGxhY2VBbGwoL1xcYmVnXFwuKFteJF0pL2csICdlLmcuJDEnKVxuICAgIC5yZXBsYWNlQWxsKC9cXGJpZVxcLihbXiRdKS9nLCAnaS5lLiQxJyk7XG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VXaXRoQ29uZmlnKG5ld0NvbnRlbnQ6IHN0cmluZywgcGFja2FnZUNvbmZpZzogUGFja2FnZUNvbmZpZywgcHJvcE5hbWU6ICdkb2MnIHwgJ3RzJyB8ICd0ZXh0Jyk6IHN0cmluZyB7XG4gIGZvciAoY29uc3QgW2JlZm9yZSwgYWZ0ZXJdIG9mIE9iamVjdC5lbnRyaWVzKHBhY2thZ2VDb25maWcud2JmeUpzb24/LnR5cG9zPy5hbGwgPz8ge30pKSB7XG4gICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZUFsbChiZWZvcmUsIGFmdGVyKTtcbiAgfVxuICBmb3IgKGNvbnN0IFtiZWZvcmUsIGFmdGVyXSBvZiBPYmplY3QuZW50cmllcyhwYWNrYWdlQ29uZmlnLndiZnlKc29uPy50eXBvcz8uW3Byb3BOYW1lXSA/PyB7fSkpIHtcbiAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlQWxsKGJlZm9yZSwgYWZ0ZXIpO1xuICB9XG4gIHJldHVybiBuZXdDb250ZW50O1xufVxuIiwiaW1wb3J0IHsgT2N0b2tpdCB9IGZyb20gJ0BvY3Rva2l0L2NvcmUnO1xuXG5jb25zdCB0b2tlbiA9XG4gIHByb2Nlc3MuZW52LkdIX0JPVF9QQVQgfHwgcHJvY2Vzcy5lbnYuUFVCTElDX0dIX0JPVF9QQVQgfHwgcHJvY2Vzcy5lbnYuR0hfVE9LRU4gfHwgcHJvY2Vzcy5lbnYuR0lUSFVCX1RPS0VOO1xuZXhwb3J0IGNvbnN0IGhhc0dpdEh1YlRva2VuID0gISF0b2tlbjtcbmV4cG9ydCBjb25zdCBvY3Rva2l0ID0gbmV3IE9jdG9raXQoe1xuICBhdXRoOiB0b2tlbixcbn0pO1xuXG5jbGFzcyBHaXRIdWJVdGlsIHtcbiAgZ2V0T3JnQW5kTmFtZSh1cmxPckZ1bGxOYW1lOiBzdHJpbmcpOiBbc3RyaW5nLCBzdHJpbmddIHtcbiAgICBjb25zdCB1cmxXaXRob3V0UHJvdG9jb2wgPSB1cmxPckZ1bGxOYW1lLnNwbGl0KCc6JykuYXQoLTEpO1xuICAgIGNvbnN0IG5hbWVzID0gdXJsV2l0aG91dFByb3RvY29sPy5zcGxpdCgnLycpO1xuICAgIGNvbnN0IG9yZyA9IG5hbWVzPy5hdCgtMikgPz8gJyc7XG4gICAgY29uc3QgbmFtZSA9IG5hbWVzPy5hdCgtMSk/LnJlcGxhY2UoLy5naXQkLywgJycpID8/ICcnO1xuICAgIHJldHVybiBbb3JnLCBuYW1lXTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZ2l0SHViVXRpbCA9IG5ldyBHaXRIdWJVdGlsKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFNwYXduU3luY09wdGlvbnMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXduU3luYyhjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZywgcmV0cnkgPSAwKTogdm9pZCB7XG4gIGRvIHtcbiAgICBjb25zdCBbbmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zXSA9IGdldFNwYXduU3luY0FyZ3MoY29tbWFuZCwgYXJncywgY3dkKTtcbiAgICBjb25zb2xlLmxvZyhgJCAke25ld0NtZH0gJHtuZXdBcmdzLmpvaW4oJyAnKX0gYXQgJHtvcHRpb25zLmN3ZH1gKTtcbiAgICBjb25zdCByZXQgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnMpO1xuICAgIGlmIChyZXQuc3RhdHVzID09PSAwKSBicmVhaztcbiAgfSB3aGlsZSAoLS1yZXRyeSA+PSAwKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXduU3luY1dpdGhTdHJpbmdSZXN1bHQoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBbbmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zXSA9IGdldFNwYXduU3luY0FyZ3MoY29tbWFuZCwgYXJncywgY3dkKTtcbiAgb3B0aW9ucy5zdGRpbyA9ICdwaXBlJztcbiAgY29uc3QgcHJvYyA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKG5ld0NtZCwgbmV3QXJncywgb3B0aW9ucyk7XG4gIGNvbnN0IGVycm9yID0gcHJvYy5zdGRlcnIudG9TdHJpbmcoKS50cmltKCk7XG4gIGlmIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoYCR7bmV3Q21kfSBbJHtuZXdBcmdzLm1hcCgocykgPT4gYFwiJHtzfVwiYCl9XSBjYXVzZWQgdGhlIGZvbGxvd2luZyBlcnJvcjpcXG4gJHtlcnJvcn1gKTtcbiAgfVxuICByZXR1cm4gcHJvYy5zdGRvdXQudG9TdHJpbmcoKS50cmltKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTcGF3blN5bmNBcmdzKGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nKTogW3N0cmluZywgc3RyaW5nW10sIFNwYXduU3luY09wdGlvbnNdIHtcbiAgY29uc3QgZW52ID0geyAuLi5wcm9jZXNzLmVudiB9O1xuICAvLyBSZW1vdmUgYmVycnkgZnJvbSBQQVRIXG4gIGlmIChlbnYuUEFUSCAmJiBlbnYuQkVSUllfQklOX0ZPTERFUikge1xuICAgIGVudi5QQVRIID0gZW52LlBBVEgucmVwbGFjZShgJHtlbnYuQkVSUllfQklOX0ZPTERFUn06YCwgJycpO1xuICB9XG5cbiAgaWYgKGVudi5BU0RGX0RJUikge1xuICAgIGFyZ3MgPSBbJy1sJywgJy1jJywgYC4gJHtlbnYuQVNERl9ESVJ9L2FzZGYuc2ggJiYgJHtjb21tYW5kfSAke2FyZ3Muam9pbignICcpfWBdO1xuICAgIGNvbW1hbmQgPSAnYmFzaCc7XG4gIH1cbiAgcmV0dXJuIFtcbiAgICBjb21tYW5kLFxuICAgIGFyZ3MsXG4gICAge1xuICAgICAgY3dkLFxuICAgICAgZW52LFxuICAgICAgc2hlbGw6IGZhbHNlLFxuICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICB9LFxuICBdO1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRWZXJzaW9uSW50b051bWJlcih2ZXJzaW9uOiBzdHJpbmcpOiBudW1iZXIge1xuICAvLyBlLmcuIGphdmEgYWRvcHRvcGVuamRrLTExLjAuMTcrOFxuICBjb25zdCBudW1iZXJzID0gdmVyc2lvblxuICAgIC5zcGxpdCgvWysuLV0vKVxuICAgIC5tYXAoTnVtYmVyKVxuICAgIC5maWx0ZXIoKG51bSkgPT4gIU51bWJlci5pc05hTihudW0pKTtcbiAgbGV0IHZlcnNpb25OdW1iZXIgPSAwO1xuICBsZXQgZGl2aXNvciA9IDE7XG4gIGZvciAoY29uc3QgbnVtIG9mIG51bWJlcnMpIHtcbiAgICB2ZXJzaW9uTnVtYmVyICs9IG51bSAqIGRpdmlzb3I7XG4gICAgZGl2aXNvciAvPSAxMDAwO1xuICB9XG4gIHJldHVybiB2ZXJzaW9uTnVtYmVyO1xufVxuIiwiZXhwb3J0IGNvbnN0IFBZVEhPTl9WRVJTSU9OID0gJzMuOS4xOSc7XG5leHBvcnQgY29uc3QgSkFWQV9WRVJTSU9OID0gJ3p1bHUtMTEuNzQuMTUnO1xuLy8gQmVjYXVzZSBXZWJLaXQgY2Fubm90IGxvZy1pbiBvbiBCbGl0eiB2Mi4wLjUrXG5leHBvcnQgY29uc3QgQkxJVFpfVkVSU0lPTiA9ICcyLjAuNCc7XG5leHBvcnQgY29uc3QgTkVYVF9WRVJTSU9OID0gJzE0LjIuNSc7XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBvY3Rva2l0IH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHNwYXduU3luYywgc3Bhd25TeW5jV2l0aFN0cmluZ1Jlc3VsdCB9IGZyb20gJy4uL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5pbXBvcnQgeyBjb252ZXJ0VmVyc2lvbkludG9OdW1iZXIgfSBmcm9tICcuLi91dGlscy92ZXJzaW9uLmpzJztcbmltcG9ydCB7IEpBVkFfVkVSU0lPTiwgUFlUSE9OX1ZFUlNJT04gfSBmcm9tICcuLi91dGlscy92ZXJzaW9uQ29uc3RhbnRzLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlVG9vbFZlcnNpb25zKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlVG9vbFZlcnNpb25zJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IGNvcmUoY29uZmlnKTtcbiAgfSk7XG59XG5cbmNvbnN0IENPUkVfVE9PTFMgPSBuZXcgU2V0KFsnamF2YScsICdub2RlanMnLCAnYnVuJywgJ3B5dGhvbiddKTtcbmNvbnN0IERFUFJFQ0FURURfVkVSU0lPTl9QUkVGSVhFUyA9IFsnamF2YScsICdub2RlJywgJ3B5dGhvbiddO1xuXG5hc3luYyBmdW5jdGlvbiBjb3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIWNvbmZpZy52ZXJzaW9uc1RleHQpIHJldHVybjtcblxuICBjb25zdCBkdXBsaWNhdGFibGVMaW5lcyA9IGNvbmZpZy52ZXJzaW9uc1RleHRcbiAgICAudHJpbSgpXG4gICAgLnNwbGl0KCdcXG4nKVxuICAgIC5tYXAoKGxpbmUpID0+IHtcbiAgICAgIGNvbnN0IFtuYW1lLCB2ZXJzaW9uXSA9IGxpbmUudHJpbSgpLnNwbGl0KC9cXHMrLyk7XG4gICAgICAvLyBUbyBtb3ZlIHRoZSB0b3Agb2YgdGhlIGxpc3QsIHdlIG5lZWQgdG8gYWRkIGEgc3BhY2UuXG4gICAgICByZXR1cm4gYCR7Q09SRV9UT09MUy5oYXMobmFtZSkgPyAnICcgOiAnJ30ke25hbWV9ICR7dmVyc2lvbn1gO1xuICAgIH0pXG4gICAgLnNvcnQoKVxuICAgIC8vIFJlbW92ZSBhZGRlZCBzcGFjZXMuXG4gICAgLm1hcCgobGluZSkgPT4gbGluZS50cmltKCkpO1xuICBjb25zdCBsaW5lcyA9IFsuLi5uZXcgU2V0KGR1cGxpY2F0YWJsZUxpbmVzKV07XG5cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNQb2V0cnlMb2NrKSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnaHR0cHM6Ly9weXBpLm9yZy9weXBpL3BvZXRyeS9qc29uJyk7XG4gICAgY29uc3QganNvbiA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICBjb25zdCBwb2V0cnlWZXJzaW9uID0ganNvbj8uaW5mbz8udmVyc2lvbjtcbiAgICBpZiAocG9ldHJ5VmVyc2lvbikge1xuICAgICAgdXBkYXRlVmVyc2lvbihsaW5lcywgJ3BvZXRyeScsIGpzb24/LmluZm8/LnZlcnNpb24pO1xuICAgIH1cbiAgICB1cGRhdGVWZXJzaW9uKGxpbmVzLCAncHl0aG9uJywgUFlUSE9OX1ZFUlNJT04sIHRydWUpO1xuICB9XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLmZpcmViYXNlKSB7XG4gICAgdXBkYXRlVmVyc2lvbihsaW5lcywgJ2phdmEnLCBKQVZBX1ZFUlNJT04sIHRydWUpO1xuICB9XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5zUGFja2FnZUpzb24pIHtcbiAgICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgICBjb25zdCBsZWZ0aG9va1ZlcnNpb24gPSBhd2FpdCBnZXRMYXRlc3RWZXJzaW9uRnJvbVRhZ09uR2l0SHViKCdldmlsbWFydGlhbnMnLCAnbGVmdGhvb2snKTtcbiAgICAgIGlmIChsZWZ0aG9va1ZlcnNpb24pIHVwZGF0ZVZlcnNpb24obGluZXMsICdsZWZ0aG9vaycsIGxlZnRob29rVmVyc2lvbik7XG5cbiAgICAgIGNvbnN0IGJ1blZlcnNpb24gPSBhd2FpdCBnZXRMYXRlc3RWZXJzaW9uRnJvbVRhZ09uR2l0SHViKCdvdmVuLXNoJywgJ2J1bicpO1xuICAgICAgaWYgKGJ1blZlcnNpb24pIHVwZGF0ZVZlcnNpb24obGluZXMsICdidW4nLCBidW5WZXJzaW9uKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdmVyc2lvbiA9IHNwYXduU3luY1dpdGhTdHJpbmdSZXN1bHQoJ25wbScsIFsnc2hvdycsICd5YXJuJywgJ3ZlcnNpb24nXSwgY29uZmlnLmRpclBhdGgpO1xuICAgICAgdXBkYXRlVmVyc2lvbihsaW5lcywgJ3lhcm4nLCB2ZXJzaW9uKTtcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IHByZWZpeCBvZiBERVBSRUNBVEVEX1ZFUlNJT05fUFJFRklYRVMpIHtcbiAgICBjb25zdCB2ZXJzaW9uUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgYC4ke3ByZWZpeH0tdmVyc2lvbmApO1xuICAgIHZvaWQgZnMucHJvbWlzZXMucm0odmVyc2lvblBhdGgsIHsgZm9yY2U6IHRydWUgfSk7XG4gIH1cblxuICBjb25zdCB0b29sVmVyc2lvbnNQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnRvb2wtdmVyc2lvbnMnKTtcbiAgYXdhaXQgKGxpbmVzLmxlbmd0aCA+IDBcbiAgICA/IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy53cml0ZUZpbGUodG9vbFZlcnNpb25zUGF0aCwgbGluZXMuam9pbignXFxuJykgKyAnXFxuJykpXG4gICAgOiBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0odG9vbFZlcnNpb25zUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSkpO1xuICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG4gIHNwYXduU3luYygnYXNkZicsIFsncGx1Z2luJywgJ3VwZGF0ZScsICctLWFsbCddLCBjb25maWcuZGlyUGF0aCk7XG4gIHNwYXduU3luYygnYXNkZicsIFsnaW5zdGFsbCddLCBjb25maWcuZGlyUGF0aCk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVZlcnNpb24obGluZXM6IHN0cmluZ1tdLCB0b29sTmFtZTogc3RyaW5nLCBuZXdWZXJzaW9uOiBzdHJpbmcsIGhlYWQgPSBmYWxzZSk6IHZvaWQge1xuICBjb25zdCBpbmRleCA9IGxpbmVzLmZpbmRJbmRleCgobCkgPT4gbC5zcGxpdCgvXFxzKy8pWzBdID09PSB0b29sTmFtZSk7XG4gIGNvbnN0IG5ld0xpbmUgPSBgJHt0b29sTmFtZX0gJHtuZXdWZXJzaW9ufWA7XG4gIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICBsaW5lcy5zcGxpY2UoaGVhZCA/IDAgOiBsaW5lcy5sZW5ndGgsIDAsIG5ld0xpbmUpO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IFssIHZlcnNpb25dID0gbGluZXNbaW5kZXhdLnNwbGl0KC9cXHMrLyk7XG4gICAgaWYgKGNvbnZlcnRWZXJzaW9uSW50b051bWJlcihuZXdWZXJzaW9uKSA+IGNvbnZlcnRWZXJzaW9uSW50b051bWJlcih2ZXJzaW9uKSkge1xuICAgICAgbGluZXNbaW5kZXhdID0gbmV3TGluZTtcbiAgICB9XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0TGF0ZXN0VmVyc2lvbkZyb21UYWdPbkdpdEh1Yihvcmdhbml6YXRpb246IHN0cmluZywgcmVwb3NpdG9yeTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICAvLyBGZXRjaCB0aGUgbGF0ZXN0IHJlbGVhc2UgZnJvbSB0aGUgcmVwb3NpdG9yeVxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3JlbGVhc2VzL2xhdGVzdCcsIHtcbiAgICAgIG93bmVyOiBvcmdhbml6YXRpb24sXG4gICAgICByZXBvOiByZXBvc2l0b3J5LFxuICAgIH0pO1xuICAgIGNvbnN0IHZlcnNpb24gPSByZXNwb25zZS5kYXRhLnRhZ19uYW1lO1xuICAgIGNvbnN0IGluZGV4ID0gdmVyc2lvbi5sYXN0SW5kZXhPZigndicpO1xuICAgIGNvbnN0IHZlcnNpb25OdW1iZXJUZXh0ID0gaW5kZXggPT09IC0xID8gdmVyc2lvbiA6IHZlcnNpb24uc2xpY2UoaW5kZXggKyAxKTtcbiAgICAvLyBDaGVjayB0aGUgZmlyc3QgY2hhcmFjdGVyIGlzIGEgbnVtYmVyXG4gICAgcmV0dXJuIC9eXFxkLy50ZXN0KHZlcnNpb25OdW1iZXJUZXh0KSA/IHZlcnNpb25OdW1iZXJUZXh0IDogdW5kZWZpbmVkO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBmZXRjaCBCdW4gdGFncyBkdWUgdG86JywgZXJyb3IpO1xuICAgIHJldHVybjtcbiAgfVxufVxuIiwiaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBvdmVyd3JpdGVNZXJnZTxUPihkZXN0aW5hdGlvbkFycmF5OiBUW10sIHNvdXJjZUFycmF5OiBUW10pOiBUW10ge1xuICByZXR1cm4gc291cmNlQXJyYXk7XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgZnVuY3Rpb24gY29tYmluZU1lcmdlKHRhcmdldDogYW55W10sIHNvdXJjZTogYW55W10sIG9wdGlvbnM6IGFueSk6IGFueVtdIHtcbiAgY29uc3QgZGVzdGluYXRpb24gPSBbLi4udGFyZ2V0XTtcblxuICBmb3IgKGNvbnN0IFtpbmRleCwgaXRlbV0gb2Ygc291cmNlLmVudHJpZXMoKSkge1xuICAgIGlmIChkZXN0aW5hdGlvbltpbmRleF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgZGVzdGluYXRpb25baW5kZXhdID0gb3B0aW9ucy5jbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZChpdGVtLCBvcHRpb25zKTtcbiAgICB9IGVsc2UgaWYgKG9wdGlvbnMuaXNNZXJnZWFibGVPYmplY3QoaXRlbSkpIHtcbiAgICAgIGRlc3RpbmF0aW9uW2luZGV4XSA9IG1lcmdlKHRhcmdldFtpbmRleF0sIGl0ZW0sIG9wdGlvbnMpO1xuICAgIH0gZWxzZSBpZiAoIXRhcmdldC5pbmNsdWRlcyhpdGVtKSkge1xuICAgICAgZGVzdGluYXRpb24ucHVzaChpdGVtKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRlc3RpbmF0aW9uO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgY2xvbmVEZWVwIGZyb20gJ2xvZGFzaC5jbG9uZWRlZXAnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgb3ZlcndyaXRlTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGpzb25PYmogPSB7XG4gICRzY2hlbWE6ICcuL25vZGVfbW9kdWxlcy9AYmlvbWVqcy9iaW9tZS9jb25maWd1cmF0aW9uX3NjaGVtYS5qc29uJyxcbiAgZXh0ZW5kczogWydAd2lsbGJvb3N0ZXIvYmlvbWUtY29uZmlnJ10sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVCaW9tZUpzb25jKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlQmlvbWVKc29uYycsIGFzeW5jICgpID0+IHtcbiAgICBsZXQgbmV3U2V0dGluZ3M6IHVua25vd24gPSBjbG9uZURlZXAoanNvbk9iaik7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdiaW9tZS5qc29uYycpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBvbGRTZXR0aW5ncyA9IEpTT04ucGFyc2Uob2xkQ29udGVudCk7XG4gICAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShuZXdTZXR0aW5ncyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IG5ld0NvbnRlbnQgPSBgdGVsZW1ldHJ5ID0gZmFsc2VcblxuW2luc3RhbGxdXG5leGFjdCA9IHRydWVcblxuW3J1bl1cbmJ1biA9IHRydWVcblxuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQnVuZmlnVG9tbChjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUJ1bmZpZ1RvbWwnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdidW5maWcudG9tbCcpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuXG5jb25zdCB1c2VyQ29udGVudEhlYWRlciA9ICcjIFByb2plY3Qtc3BlY2lmaWMgc2V0dGluZ3MnO1xuY29uc3QgdXNlckNvbnRlbnRIZWFkZXJSZWdleCA9IC8jIFByb2plY3Qtc3BlY2lmaWMgc2V0dGluZ3NbXlxcbl0qXFxuL2dtO1xuY29uc3Qgc2VwYXJhdG9yID0gJyMgR2VuZXJhdGVkIGJ5IHdiZnknO1xuY29uc3Qgc2VwYXJhdG9yUHJlZml4ID0gJyMgR2VuZXJhdGVkIGJ5ICc7XG5jb25zdCBkZWZhdWx0SGVhZFVzZXJDb250ZW50ID0gYCR7dXNlckNvbnRlbnRIZWFkZXJ9IChoZWFkKVxuXG5cbiR7c2VwYXJhdG9yfVxuYDtcbmNvbnN0IGRlZmF1bHRUYWlsVXNlckNvbnRlbnQgPSBgXG4ke3VzZXJDb250ZW50SGVhZGVyfSAodGFpbClcbmA7XG5cbmV4cG9ydCBjb25zdCBpZ25vcmVGaWxlVXRpbCA9IHtcbiAgc2VwYXJhdG9yLFxuICBzZXBhcmF0b3JQcmVmaXgsXG4gIGRlZmF1bHRIZWFkVXNlckNvbnRlbnQsXG4gIGRlZmF1bHRUYWlsVXNlckNvbnRlbnQsXG4gIGFzeW5jIHJlYWRHaXRpZ25vcmVXaXRob3V0U2VwYXJhdG9ycyhmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICB0cnkge1xuICAgICAgbGV0IGNvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IGxhc3RIZWFkZXJJbmRleCA9IGdldEluZGV4T2ZUYWlsVXNlckNvbnRlbnRIZWFkZXIoY29udGVudCk7XG4gICAgICBpZiAobGFzdEhlYWRlckluZGV4ID4gMCkge1xuICAgICAgICBjb250ZW50ID0gY29udGVudC5zbGljZSgwLCBsYXN0SGVhZGVySW5kZXggLSAxKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNvbnRlbnRcbiAgICAgICAgICAucmVwbGFjZUFsbCh1c2VyQ29udGVudEhlYWRlclJlZ2V4LCAnJylcbiAgICAgICAgICAucmVwbGFjZUFsbCgvIyBHZW5lcmF0ZWQgYnkgW15cXG5dKlxcbi9nbSwgJycpXG4gICAgICAgICAgLnJlcGxhY2VBbGwoL1xccj9cXG5cXHI/XFxuKFxccj9cXG4pKy9nbSwgJ1xcblxcbicpXG4gICAgICAgICAgLnRyaW0oKSArICdcXG4nXG4gICAgICApO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgfSxcbiAgZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgaW5kZXggPSBjb250ZW50LmluZGV4T2YodGhpcy5zZXBhcmF0b3JQcmVmaXgpO1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgIHJldHVybiBjb250ZW50XG4gICAgICAgIC5zbGljZSgwLCBjb250ZW50LmluZGV4T2YoJ1xcbicsIGluZGV4KSArIDEpXG4gICAgICAgIC5yZXBsYWNlQWxsKHVzZXJDb250ZW50SGVhZGVyUmVnZXgsIGAke3VzZXJDb250ZW50SGVhZGVyfSAoaGVhZClcXG5gKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlZmF1bHRIZWFkVXNlckNvbnRlbnQ7XG4gIH0sXG4gIGdldFRhaWxVc2VyQ29udGVudChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGxhc3RIZWFkZXJJbmRleCA9IGdldEluZGV4T2ZUYWlsVXNlckNvbnRlbnRIZWFkZXIoY29udGVudCk7XG4gICAgaWYgKGxhc3RIZWFkZXJJbmRleCA+IDApIHtcbiAgICAgIHJldHVybiBjb250ZW50LnNsaWNlKGxhc3RIZWFkZXJJbmRleCAtIDEpO1xuICAgIH1cbiAgICByZXR1cm4gZGVmYXVsdFRhaWxVc2VyQ29udGVudDtcbiAgfSxcbiAgYXN5bmMgaXNCZXJyeVplcm9JbnN0YWxsRW5hYmxlZChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIHJldHVybiBjb250ZW50LmluY2x1ZGVzKCdcXG4hLnlhcm4vY2FjaGUnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0sXG59O1xuXG5mdW5jdGlvbiBnZXRJbmRleE9mVGFpbFVzZXJDb250ZW50SGVhZGVyKGNvbnRlbnQ6IHN0cmluZyk6IG51bWJlciB7XG4gIGNvbnN0IGluZGV4ID0gY29udGVudC5pbmRleE9mKHVzZXJDb250ZW50SGVhZGVyKTtcbiAgY29uc3QgbGFzdEluZGV4ID0gY29udGVudC5sYXN0SW5kZXhPZih1c2VyQ29udGVudEhlYWRlcik7XG4gIHJldHVybiBsYXN0SW5kZXggPiBpbmRleCA/IGxhc3RJbmRleCA6IC0xO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbi8vIEV4ZXJjb2Rl44Gn44Gvbm9kZV9tb2R1bGVz44KSQ09QWeOBmeOCi+W/heimgeOBjOOBguOCi+OBn+OCgeOAgW5vZGVfbW9kdWxlc+OCkumZpOWkluOBl+OBpuOBr+OBhOOBkeOBquOBhOOAglxuY29uc3QgY29tbW9uQ29udGVudCA9IGBcbioqLy5pZGVhXG4qKi8qLnNxbGl0ZTMqXG4qKi8ueWFybi9pbnN0YWxsLXN0YXRlLmd6XG4qKi8udmVudlxuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRG9ja2VyaWdub3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlRG9ja2VyaWdub3JlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmRvY2tlcmlnbm9yZScpO1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zRG9ja2VyZmlsZSkge1xuICAgICAgY29uc3QgY29udGVudCA9IChhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoKSkgPz8gJyc7XG4gICAgICBjb25zdCBoZWFkVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRIZWFkVXNlckNvbnRlbnQoY29udGVudCk7XG4gICAgICBjb25zdCB0YWlsVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRUYWlsVXNlckNvbnRlbnQoY29udGVudCk7XG5cbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBoZWFkVXNlckNvbnRlbnQgKyBjb21tb25Db250ZW50ICsgdGFpbFVzZXJDb250ZW50O1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgfVxuICB9KTtcbn1cbiIsImV4cG9ydCBjb25zdCBleHRlbnNpb25zID0ge1xuICBjb2RlV2l0aDJJbmRlbnRTaXplOiBbXG4gICAgJ2NqcycsXG4gICAgJ21qcycsXG4gICAgJ2pzJyxcbiAgICAnanN4JyxcbiAgICAnY3RzJyxcbiAgICAnbXRzJyxcbiAgICAndHMnLFxuICAgICd0c3gnLFxuICAgICdqc29uJyxcbiAgICAnanNvbjUnLFxuICAgICdqc29uYycsXG4gICAgJ2NwcCcsXG4gICAgJ2RhcnQnLFxuICAgICdodG0nLFxuICAgICdodG1sJyxcbiAgICAncHUnLFxuICAgICdwdW1sJyxcbiAgICAncmInLFxuICAgICd2dWUnLFxuICAgICd4bWwnLFxuICAgICd5YW1sJyxcbiAgICAneW1sJyxcbiAgXS5zb3J0KCksXG4gIGNvZGVXaXRoNEluZGVudFNpemU6IFsnZ28nLCAnZ3JhZGxlJywgJ3B5J10uc29ydCgpLFxuICBjb2RlV2l0aDhJbmRlbnRTaXplOiBbJ3NoJ10uc29ydCgpLFxuICBtYXJrZG93bkxpa2U6IFsnbWQnXS5zb3J0KCksXG4gIGVzbGludDogWydjanMnLCAnbWpzJywgJ2pzJywgJ2N0cycsICdtdHMnLCAndHMnLCAndHN4JywgJ2pzeCddLnNvcnQoKSxcbiAgcHJldHRpZXI6IFtcbiAgICAnY2pzJyxcbiAgICAnbWpzJyxcbiAgICAnanMnLFxuICAgICdqc3gnLFxuICAgICdjdHMnLFxuICAgICdtdHMnLFxuICAgICd0cycsXG4gICAgJ3RzeCcsXG4gICAgJ2pzb24nLFxuICAgICdqc29uNScsXG4gICAgJ2pzb25jJyxcbiAgICAnY3NzJyxcbiAgICAnaHRtJyxcbiAgICAnaHRtbCcsXG4gICAgJ21kJyxcbiAgICAnc2NzcycsXG4gICAgJ3Z1ZScsXG4gICAgJ3lhbWwnLFxuICAgICd5bWwnLFxuICBdLnNvcnQoKSxcbiAgLy8gY2YuIGh0dHBzOi8vYmlvbWVqcy5kZXYvaW50ZXJuYWxzL2xhbmd1YWdlLXN1cHBvcnQvXG4gIGJpb21lOiBbXG4gICAgJ2NqcycsXG4gICAgJ21qcycsXG4gICAgJ2pzJyxcbiAgICAnanN4JyxcbiAgICAnY3RzJyxcbiAgICAnbXRzJyxcbiAgICAndHMnLFxuICAgICd0c3gnLFxuICAgICdqc29uJyxcbiAgICAnanNvbjUnLFxuICAgICdqc29uYycsXG4gICAgJ2h0bScsXG4gICAgJ2h0bWwnLFxuICAgICd2dWUnLFxuICAgICdzdmVsdGUnLFxuICAgICdhc3RybycsXG4gICAgJ2NzcycsXG4gICAgJ3lhbWwnLFxuICAgICd5bWwnLFxuICAgICdncWwnLFxuICBdLnNvcnQoKSxcbn07XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IG5ld0NvbnRlbnQgPSBgcm9vdCA9IHRydWVcblxuWypdXG5jaGFyc2V0ID0gdXRmLThcbmVuZF9vZl9saW5lID0gbGZcbmluc2VydF9maW5hbF9uZXdsaW5lID0gdHJ1ZVxudHJpbV90cmFpbGluZ193aGl0ZXNwYWNlID0gdHJ1ZVxuXG4ke2dlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zLmNvZGVXaXRoMkluZGVudFNpemUpfVxuaW5kZW50X3NpemUgPSAyXG5pbmRlbnRfc3R5bGUgPSBzcGFjZVxuXG4ke2dlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zLmNvZGVXaXRoNEluZGVudFNpemUpfVxuaW5kZW50X3NpemUgPSA0XG5pbmRlbnRfc3R5bGUgPSBzcGFjZVxuXG4ke2dlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zLmNvZGVXaXRoOEluZGVudFNpemUpfVxuaW5kZW50X3NpemUgPSA4XG5pbmRlbnRfc3R5bGUgPSBzcGFjZVxuXG4ke2dlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zLm1hcmtkb3duTGlrZSl9XG5tYXhfbGluZV9sZW5ndGggPSBvZmZcbnRyaW1fdHJhaWxpbmdfd2hpdGVzcGFjZSA9IGZhbHNlXG5cblt7TWFrZWZpbGUsKi5ta31dXG5pbmRlbnRfc3R5bGUgPSB0YWJcbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUVkaXRvcmNvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUVkaXRvcmNvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lZGl0b3Jjb25maWcnKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGV4dGVuc2lvbnMubGVuZ3RoID4gMSA/IGBbKi57JHtleHRlbnNpb25zLmpvaW4oJywnKX19XWAgOiBgWyouJHtleHRlbnNpb25zWzBdfV1gO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGNvbW1vbkNvbnRlbnQgPSBgXG4zcmQtcGFydHkvXG5AdHlwZXMvXG5fX2dlbmVyYXRlZF9fL1xuYW5kcm9pZC9cbmlvcy9cbm5vLWZvcm1hdC9cbnRlc3QtZml4dHVyZXMvXG4qLmNvbmZpZy4qanNcbiouZC50c1xuKi5taW4uKmpzXG4ueWFybi9cbi5wbnAuanNcbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUVzbGludGlnbm9yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUVzbGludGlnbm9yZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lc2xpbnRpZ25vcmUnKTtcbiAgICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbnRlbnQgPSAoYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihmaWxlUGF0aCkpID8/ICcnO1xuICAgIGNvbnN0IGhlYWRVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldEhlYWRVc2VyQ29udGVudChjb250ZW50KTtcbiAgICBjb25zdCB0YWlsVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRUYWlsVXNlckNvbnRlbnQoY29udGVudCk7XG5cbiAgICBjb25zdCBnaXRpZ25vcmVGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRpZ25vcmUnKTtcbiAgICBjb25zdCBnaXRpZ25vcmVDb250ZW50ID0gKGF3YWl0IGlnbm9yZUZpbGVVdGlsLnJlYWRHaXRpZ25vcmVXaXRob3V0U2VwYXJhdG9ycyhnaXRpZ25vcmVGaWxlUGF0aCkpIHx8ICcnO1xuXG4gICAgY29uc3QgbmV3Q29udGVudCA9IGhlYWRVc2VyQ29udGVudCArIGNvbW1vbkNvbnRlbnQgKyBnaXRpZ25vcmVDb250ZW50ICsgdGFpbFVzZXJDb250ZW50O1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBjb21iaW5lTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUVzbGludHJjKGNvbmZpZzogUGFja2FnZUNvbmZpZywgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlRXNsaW50cmMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZXNsaW50cmMuanNvbicpO1xuICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYmFzZXMgPSBbXTtcbiAgICBpZiAoY29uZmlnLmVzbGludEJhc2UpIHtcbiAgICAgIGJhc2VzLnB1c2goY29uZmlnLmVzbGludEJhc2UpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnICE9PSByb290Q29uZmlnKSB7XG4gICAgICBiYXNlcy5wdXNoKCcuLi8uLi8uZXNsaW50cmMuanNvbicpO1xuICAgIH1cbiAgICBsZXQgbmV3U2V0dGluZ3MgPSB7IHJvb3Q6IHRydWUsIGV4dGVuZHM6IGJhc2VzIH07XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3Qgb2xkU2V0dGluZ3MgPSBKU09OLnBhcnNlKG9sZENvbnRlbnQpO1xuICAgICAgaWYgKG9sZFNldHRpbmdzLmV4dGVuZHMpIHtcbiAgICAgICAgb2xkU2V0dGluZ3MuZXh0ZW5kcyA9IG9sZFNldHRpbmdzLmV4dGVuZHMuZmlsdGVyKFxuICAgICAgICAgIChleHQ6IHN0cmluZykgPT4gIWV4dC5zdGFydHNXaXRoKCdAd2lsbGJvb3N0ZXIvJykgJiYgZXh0ICE9PSAnLi4vLi4vLmVzbGludHJjLmpzb24nXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoYmFzZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIG9sZFNldHRpbmdzLmV4dGVuZHMgPSBbXTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG5ld0V4dGVuZHMgPSBuZXdTZXR0aW5ncy5leHRlbmRzO1xuICAgICAgbmV3U2V0dGluZ3MuZXh0ZW5kcyA9IG9sZFNldHRpbmdzLmV4dGVuZHM7XG4gICAgICBvbGRTZXR0aW5ncy5leHRlbmRzID0gbmV3RXh0ZW5kcztcbiAgICAgIG5ld1NldHRpbmdzID0gbWVyZ2UuYWxsKFtuZXdTZXR0aW5ncywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzXSwge1xuICAgICAgICBhcnJheU1lcmdlOiBjb21iaW5lTWVyZ2UsXG4gICAgICB9KSBhcyB0eXBlb2YgbmV3U2V0dGluZ3M7XG4gICAgICAvLyBUT0RPOiBSZW1vdmUgdGhlIGZvbGxvd2luZyBjb2RlIGFmdGVyIGFsbCBCbGl0ei5qcyBwcm9qZWN0cyBhcmUgdXBkYXRlZC5cbiAgICAgIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6KSB7XG4gICAgICAgIG5ld1NldHRpbmdzLmV4dGVuZHMgPSBuZXdTZXR0aW5ncy5leHRlbmRzLmZpbHRlcihcbiAgICAgICAgICAoZXh0OiBzdHJpbmcpID0+IGV4dCAhPT0gJy4vbm9kZV9tb2R1bGVzL0BibGl0empzL25leHQvZXNsaW50J1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG4vLyBjZi4gaHR0cHM6Ly9idW4uc2gvZ3VpZGVzL2luc3RhbGwvZ2l0LWRpZmYtYnVuLWxvY2tmaWxlXG5jb25zdCBuZXdDb250ZW50ID0gYCogdGV4dD1hdXRvXG5cbioubG9ja2IgYmluYXJ5IGRpZmY9bG9ja2JcbioudmNwcm9qIHRleHQgZW9sPWNybGZcblxuJHtbLi4uZXh0ZW5zaW9ucy5jb2RlV2l0aDJJbmRlbnRTaXplLCAuLi5leHRlbnNpb25zLmNvZGVXaXRoNEluZGVudFNpemUsIC4uLmV4dGVuc2lvbnMubWFya2Rvd25MaWtlXVxuICAubWFwKChleHQpID0+IGAqLiR7ZXh0fSB0ZXh0IGVvbD1sZmApXG4gIC5qb2luKCdcXG4nKX1cblxuZGlzdC8qKiBsaW5ndWlzdC1nZW5lcmF0ZWQ9dHJ1ZVxuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlR2l0YXR0cmlidXRlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0YXR0cmlidXRlcycpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IG9zIGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuLi9vcHRpb25zLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGRlZmF1bHROYW1lcyA9IFsnd2luZG93cycsICdtYWNvcycsICdsaW51eCcsICdqZXRicmFpbnMnLCAndmlzdWFsc3R1ZGlvY29kZScsICdlbWFjcycsICd2aW0nLCAneWFybiddO1xuXG5jb25zdCBjb21tb25Db250ZW50ID0gYFxuIS5rZWVwXG4uZW52LnByb2R1Y3Rpb25cbiovbW91bnQvKi5oYXNoXG4uaWRlYS9jb3BpbG90L2NoYXRTZXNzaW9ucy9cbi5kZXZjb250YWluZXIvXG5kaXN0L1xudGVtcC9cbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUdpdGlnbm9yZShjb25maWc6IFBhY2thZ2VDb25maWcsIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdpdGlnbm9yZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRpZ25vcmUnKTtcbiAgICBjb25zdCBjb250ZW50ID0gKGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGgpKSA/PyAnJztcbiAgICBsZXQgaGVhZFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQpICsgY29tbW9uQ29udGVudDtcbiAgICBjb25zdCB0YWlsVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRUYWlsVXNlckNvbnRlbnQoY29udGVudCk7XG5cbiAgICBjb25zdCBuYW1lcyA9IFsuLi5kZWZhdWx0TmFtZXNdO1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zR2VtZmlsZSkge1xuICAgICAgbmFtZXMucHVzaCgncnVieScpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc0dvTW9kKSB7XG4gICAgICBuYW1lcy5wdXNoKCdnbycpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAke3BhdGguYmFzZW5hbWUoY29uZmlnLmRpclBhdGgpfVxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNQYWNrYWdlSnNvbikge1xuICAgICAgbmFtZXMucHVzaCgnbm9kZScpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc1BvbVhtbCkge1xuICAgICAgbmFtZXMucHVzaCgnbWF2ZW4nKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLmlkZWEvZ29vZ2xlLWphdmEtZm9ybWF0LnhtbFxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNQdWJzcGVjWWFtbCkge1xuICAgICAgbmFtZXMucHVzaCgnZmx1dHRlcicsICdBbmRyb2lkU3R1ZGlvJywgJ3J1YnknKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLmZsdXR0ZXItcGx1Z2lucy1kZXBlbmRlbmNpZXNcbmFuZHJvaWQva2V5LnByb3BlcnRpZXNcbmlvcy8uYnVuZGxlXG4uaWRlYS9ydW5Db25maWd1cmF0aW9ucy54bWxcbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zVGVtcGxhdGVZYW1sKSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5hd3Mtc2FtL1xucGFja2FnZWQueWFtbFxuYDtcbiAgICB9XG4gICAgLy8gQmVjYXVzZSAudmVudiBzaG91bGQgYmUgaWdub3JlZCBvbiByb290IGRpcmVjdG9yeVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zUG9ldHJ5TG9jaykge1xuICAgICAgbmFtZXMucHVzaCgncHl0aG9uJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC52ZW52L1xuYDtcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eikge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuYmxpdHovXG4uYmxpdHoqKlxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgbmFtZXMucHVzaCgnbmV4dGpzJyk7XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5maXJlYmFzZSB8fCBjb25maWcuZGVwZW5kaW5nLmZpcmViYXNlKSB7XG4gICAgICBuYW1lcy5wdXNoKCdmaXJlYmFzZScpO1xuICAgIH1cbiAgICBpZiAocm9vdENvbmZpZy5kZXBlbmRpbmcucHJpc21hKSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYCouc3FsaXRlMypcbiouc3FsaXRlMy1qb3VybmFsXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0VGVzdCkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGB0ZXN0LXJlc3VsdHMvXG5gO1xuICAgIH1cbiAgICBpZiAocm9vdENvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUgfHwgY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgICAgbmFtZXMucHVzaCgncmVhY3RuYXRpdmUnKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgZ29vZ2xlLXNlcnZpY2VzLmpzb25cbmFuZHJvaWQvYXBwL3NyYy9tYWluL2Fzc2V0cy9cbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnN0b3J5Ym9vaykge1xuICAgICAgbmFtZXMucHVzaCgnc3Rvcnlib29ranMnKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubGl0ZXN0cmVhbSkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGBnY3Atc2Eta2V5Lmpzb25cbmA7XG4gICAgfVxuXG4gICAgbGV0IGdlbmVyYXRlZCA9ICcnO1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykge1xuICAgICAgbGV0IGNvbnRlbnQgPSAoYXdhaXQgcmVhZENhY2hlKG5hbWUpKSA/PyAnJztcbiAgICAgIGlmICghY29udGVudCkge1xuICAgICAgICBjb25zdCB1cmwgPSBgaHR0cHM6Ly93d3cudG9wdGFsLmNvbS9kZXZlbG9wZXJzL2dpdGlnbm9yZS9hcGkvJHtuYW1lfWA7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsKTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2VUZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgICBpZiAoIXJlc3BvbnNlLm9rIHx8IHJlc3BvbnNlVGV4dC5pbmNsdWRlcygnQXR0ZW50aW9uIFJlcXVpcmVkIScpIHx8IHJlc3BvbnNlVGV4dC5pbmNsdWRlcygnPHRpdGxlPicpKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGZldGNoICR7dXJsfWApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb250ZW50ID0gcmVzcG9uc2VUZXh0LnRyaW0oKTtcbiAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IHdyaXRlQ2FjaGUobmFtZSwgY29udGVudCkpO1xuICAgICAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oYEZldGNoZWQgJHt1cmx9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChnZW5lcmF0ZWQpIGdlbmVyYXRlZCArPSAnXFxuJztcbiAgICAgIGdlbmVyYXRlZCArPSBjb250ZW50ICsgJ1xcbic7XG4gICAgfVxuICAgIGlmICghKGF3YWl0IGlnbm9yZUZpbGVVdGlsLmlzQmVycnlaZXJvSW5zdGFsbEVuYWJsZWQoZmlsZVBhdGgpKSkge1xuICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2UoJyEueWFybi9jYWNoZScsICcjICEueWFybi9jYWNoZScpLnJlcGxhY2UoJyMgLnBucC4qJywgJy5wbnAuKicpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc1BvbVhtbCB8fCBjb25maWcuZG9lc0NvbnRhaW5zUHVic3BlY1lhbWwpIHtcbiAgICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZFxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9hcnRpZmFjdHMkL2dtLCAnLmlkZWEvYXJ0aWZhY3RzJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvY29tcGlsZXIueG1sJC9nbSwgJy5pZGVhL2NvbXBpbGVyLnhtbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL2phclJlcG9zaXRvcmllcy54bWwkL2dtLCAnLmlkZWEvamFyUmVwb3NpdG9yaWVzLnhtbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL21vZHVsZXMueG1sJC9nbSwgJy5pZGVhL21vZHVsZXMueG1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvKi5pbWwkL2dtLCAnLmlkZWEvKi5pbWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9tb2R1bGVzJC9nbSwgJy5pZGVhL21vZHVsZXMnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgKi5pbWwkL2dtLCAnKi5pbWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgKi5pcHIkL2dtLCAnKi5pcHInKTtcbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zUHVic3BlY1lhbWwpIHtcbiAgICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2VBbGwoL14uaWRlYVxcL21vZHVsZXMueG1sJC9nbSwgJyMgLmlkZWEvbW9kdWxlcy54bWwnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2VBbGwoL14uaWRlYVxcLz8kL2dtLCAnIyAuaWRlYScpO1xuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSB8fCBjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlIHx8IGNvbmZpZy5kb2VzQ29udGFpbnNQdWJzcGVjWWFtbCkge1xuICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2VBbGwoL14oLmlkZWFcXC8uKykkL2dtLCAnJDFcXG5hbmRyb2lkLyQxJyk7XG4gICAgfVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBoZWFkVXNlckNvbnRlbnQgKyAnXFxuJyArIGdlbmVyYXRlZCArIHRhaWxVc2VyQ29udGVudDtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuY29uc3QgZGlyUGF0aCA9IHBhdGguam9pbihvcy5ob21lZGlyKCksICcuY2FjaGUnLCAnd2JmeScsICdnaXRpZ25vcmUnKTtcblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVDYWNoZShuYW1lOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihkaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGguam9pbihkaXJQYXRoLCBuYW1lKSwgY29udGVudCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRDYWNoZShuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IHN0YXQgPSBhd2FpdCBmcy5wcm9taXNlcy5zdGF0KHBhdGguam9pbihkaXJQYXRoLCBuYW1lKSk7XG4gICAgaWYgKERhdGUubm93KCkgLSBzdGF0Lm10aW1lTXMgPiA2ICogNjAgKiA2MCAqIDEwMDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHBhdGguam9pbihkaXJQYXRoLCBuYW1lKSwgJ3V0ZjgnKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG4iLCJpbXBvcnQgeyBvY3Rva2l0IH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRMYXRlc3RDb21taXRIYXNoKG9yZ2FuaXphdGlvbjogc3RyaW5nLCByZXBvOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICB0cnkge1xuICAgIGNvbnN0IHsgZGF0YTogY29tbWl0cyB9ID0gYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbW1pdHMnLCB7XG4gICAgICBvd25lcjogb3JnYW5pemF0aW9uLFxuICAgICAgcmVwbyxcbiAgICAgIHBlcl9wYWdlOiAxLFxuICAgIH0pO1xuICAgIGNvbnNvbGUuaW5mbygnY29tbWl0czonLCBjb21taXRzKTtcbiAgICBpZiAoY29tbWl0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gY29tbWl0cyBmb3VuZCBmb3IgJHtvcmdhbml6YXRpb259LyR7cmVwb31gKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbW1pdHNbMF0uc2hhO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGZldGNoIGNvbW1pdHMgZm9yICR7b3JnYW5pemF0aW9ufS8ke3JlcG99OiAke2Vycm9yfWApO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuZXhwb3J0IGNvbnN0IEVzbGludFV0aWwgPSB7XG4gIGdldExpbnRGaXhTdWZmaXgoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gY29uZmlnLmRvZXNDb250YWluc0pzeE9yVHN4ID8gJyAtLXJ1bGUgXCJ7IHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwczogMCB9XCInIDogJyc7XG4gIH0sXG59O1xuIiwiaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmNvbnN0IHNyY0RpcmVjdG9yaWVzID0ge1xuICBub2RlOiBbJ3NyYycsICd0ZXN0cycsICdzY3JpcHRzJ10uc29ydCgpLFxuICBibGl0ejogWydzcmMnLCAndGVzdHMnLCAnc2NyaXB0cycsICdkYicsICdpbnRlZ3JhdGlvbnMnLCAnbWFpbGVycyddLnNvcnQoKSxcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTcmNEaXJzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZ1tdIHtcbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHopIHtcbiAgICByZXR1cm4gc3JjRGlyZWN0b3JpZXMuYmxpdHo7XG4gIH1cbiAgcmV0dXJuIHNyY0RpcmVjdG9yaWVzLm5vZGU7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCB7IGdsb2JieSwgZ2xvYmJ5U3luYyB9IGZyb20gJ2dsb2JieSc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uLCBTZXRSZXF1aXJlZCB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGdldExhdGVzdENvbW1pdEhhc2ggfSBmcm9tICcuLi9naXRodWIvY29tbWl0LmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEVzbGludEV4dGVuc2lvbkJhc2UsIFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IEVzbGludFV0aWwgfSBmcm9tICcuLi91dGlscy9lc2xpbnRVdGlsLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGdpdEh1YlV0aWwgfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgY29tYmluZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jIH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcbmltcG9ydCB7IGdldFNyY0RpcnMgfSBmcm9tICcuLi91dGlscy9zcmNEaXJlY3Rvcmllcy5qcyc7XG5pbXBvcnQgeyBCTElUWl9WRVJTSU9OLCBORVhUX1ZFUlNJT04gfSBmcm9tICcuLi91dGlscy92ZXJzaW9uQ29uc3RhbnRzLmpzJztcblxuY29uc3QganNDb21tb25EZXBzID0gW1xuICAnZXNsaW50QDguNTcuMCcsXG4gICdlc2xpbnQtY29uZmlnLXByZXR0aWVyJyxcbiAgJ2VzbGludC1wbHVnaW4taW1wb3J0JyxcbiAgJ2VzbGludC1wbHVnaW4tc29ydC1jbGFzcy1tZW1iZXJzJyxcbiAgJ2VzbGludC1wbHVnaW4tc29ydC1kZXN0cnVjdHVyZS1rZXlzJyxcbiAgJ2VzbGludC1wbHVnaW4tdW5pY29ybicsXG5dO1xuXG5jb25zdCB0c0NvbW1vbkRlcHMgPSBbXG4gIC4uLmpzQ29tbW9uRGVwcyxcbiAgJ0B0eXBlc2NyaXB0LWVzbGludC9lc2xpbnQtcGx1Z2luJyxcbiAgJ0B0eXBlc2NyaXB0LWVzbGludC9wYXJzZXInLFxuICAnZXNsaW50LWltcG9ydC1yZXNvbHZlci10eXBlc2NyaXB0Jyxcbl07XG5cbmNvbnN0IHJlYWN0Q29tbW9uRGVwcyA9IFsnZXNsaW50LXBsdWdpbi1yZWFjdCcsICdlc2xpbnQtcGx1Z2luLXJlYWN0LWhvb2tzJ107XG5cbmNvbnN0IGVzbGludERlcHM6IFJlY29yZDxFc2xpbnRFeHRlbnNpb25CYXNlLCBzdHJpbmdbXT4gPSB7XG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcyc6IFsnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMnLCAuLi5qc0NvbW1vbkRlcHNdLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMtcmVhY3QnOiBbJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzLXJlYWN0JywgLi4uanNDb21tb25EZXBzLCAuLi5yZWFjdENvbW1vbkRlcHNdLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMnOiBbJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzJywgLi4udHNDb21tb25EZXBzXSxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzLXJlYWN0JzogWydAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cy1yZWFjdCcsIC4uLnRzQ29tbW9uRGVwcywgLi4ucmVhY3RDb21tb25EZXBzXSxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWJsaXR6LW5leHQnOiBbXG4gICAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWJsaXR6LW5leHQnLFxuICAgICdlc2xpbnQtY29uZmlnLW5leHQnLFxuICAgIC4uLnRzQ29tbW9uRGVwcyxcbiAgICAuLi5yZWFjdENvbW1vbkRlcHMsXG4gIF0sXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1uZXh0JzogW1xuICAgICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1uZXh0JyxcbiAgICAnZXNsaW50LWNvbmZpZy1uZXh0JyxcbiAgICAuLi50c0NvbW1vbkRlcHMsXG4gICAgLi4ucmVhY3RDb21tb25EZXBzLFxuICBdLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUGFja2FnZUpzb24oXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgc2tpcEFkZGluZ0RlcHM6IGJvb2xlYW5cbik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUGFja2FnZUpzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgY29yZShjb25maWcsIHJvb3RDb25maWcsIHNraXBBZGRpbmdEZXBzKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLCBza2lwQWRkaW5nRGVwczogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICBjb25zdCBqc29uVGV4dCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICBjb25zdCBqc29uT2JqID0gSlNPTi5wYXJzZShqc29uVGV4dCkgYXMgUGFja2FnZUpzb247XG4gIGpzb25PYmouc2NyaXB0cyA9IGpzb25PYmouc2NyaXB0cyB8fCB7fTtcbiAganNvbk9iai5kZXBlbmRlbmNpZXMgPSBqc29uT2JqLmRlcGVuZGVuY2llcyB8fCB7fTtcbiAganNvbk9iai5kZXZEZXBlbmRlbmNpZXMgPSBqc29uT2JqLmRldkRlcGVuZGVuY2llcyB8fCB7fTtcbiAganNvbk9iai5wZWVyRGVwZW5kZW5jaWVzID0ganNvbk9iai5wZWVyRGVwZW5kZW5jaWVzIHx8IHt9O1xuXG4gIGF3YWl0IHJlbW92ZURlcHJlY2F0ZWRTdHVmZihcbiAgICByb290Q29uZmlnLFxuICAgIGpzb25PYmogYXMgU2V0UmVxdWlyZWQ8UGFja2FnZUpzb24sICdzY3JpcHRzJyB8ICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcyc+XG4gICk7XG5cbiAgaWYgKGpzb25PYmoubmFtZSAhPT0gJ0B3aWxsYm9vc3Rlci9wcmV0dGllci1jb25maWcnKSB7XG4gICAganNvbk9iai5wcmV0dGllciA9ICdAd2lsbGJvb3N0ZXIvcHJldHRpZXItY29uZmlnJztcbiAgfVxuXG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGpzb25PYmouc2NyaXB0cyBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSkge1xuICAgIC8vIEZyZXNoIHJlcG8gc3RpbGwgcmVxdWlyZXMgJ3lhcm4gaW5zdGFsbCdcbiAgICBpZiAoIXZhbHVlLmluY2x1ZGVzKCdnaXQgY2xvbmUnKSkge1xuICAgICAganNvbk9iai5zY3JpcHRzW2tleV0gPSB2YWx1ZS5yZXBsYWNlKC95YXJuXFxzKiYmXFxzKi8sICcnKS5yZXBsYWNlKC95YXJuXFxzKmluc3RhbGxcXHMqJiZcXHMqLywgJycpO1xuICAgIH1cbiAgfVxuXG4gIGpzb25PYmouc2NyaXB0cyA9IG1lcmdlKGpzb25PYmouc2NyaXB0cywgZ2VuZXJhdGVTY3JpcHRzKGNvbmZpZykpO1xuICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5wcmV0dGlmeTtcbiAgfSBlbHNlIHtcbiAgICBqc29uT2JqLnNjcmlwdHMucHJldHRpZnkgKz0gYXdhaXQgZ2VuZXJhdGVQcmV0dGllclN1ZmZpeChjb25maWcuZGlyUGF0aCk7XG4gIH1cbiAgLy8gRGVhbCB3aXRoIGJyZWFraW5nIGNoYW5nZXMgaW4geWFybiBiZXJyeSA0LjAuMC1yYy40OVxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhqc29uT2JqLnNjcmlwdHMpKSB7XG4gICAgaWYgKCF2YWx1ZT8uaW5jbHVkZXMoJ3lhcm4gd29ya3NwYWNlcyBmb3JlYWNoJykpIGNvbnRpbnVlO1xuICAgIGlmIChcbiAgICAgIHZhbHVlLmluY2x1ZGVzKCctLWFsbCcpIHx8XG4gICAgICB2YWx1ZS5pbmNsdWRlcygnLS1yZWN1cnNpdmUnKSB8fFxuICAgICAgdmFsdWUuaW5jbHVkZXMoJy0tc2luY2UnKSB8fFxuICAgICAgdmFsdWUuaW5jbHVkZXMoJy0td29ya3RyZWUnKVxuICAgIClcbiAgICAgIGNvbnRpbnVlO1xuICAgIGpzb25PYmouc2NyaXB0c1trZXldID0gdmFsdWUucmVwbGFjZSgneWFybiB3b3Jrc3BhY2VzIGZvcmVhY2gnLCAneWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwnKTtcbiAgfVxuXG4gIGxldCBkZXBlbmRlbmNpZXM6IHN0cmluZ1tdID0gW107XG4gIGxldCBkZXZEZXBlbmRlbmNpZXMgPSBbJ3ByZXR0aWVyJywgJ3NvcnQtcGFja2FnZS1qc29uJywgJ0B3aWxsYm9vc3Rlci9wcmV0dGllci1jb25maWcnXTtcbiAgY29uc3QgcG9ldHJ5RGV2RGVwZW5kZW5jaWVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ2xpbnQtc3RhZ2VkJ107XG4gIH0gZWxzZSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ2xpbnQtc3RhZ2VkJyk7XG4gIH1cblxuICBpZiAoY29uZmlnLmlzUm9vdCkge1xuICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snaHVza3knXTtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1sncGluc3QnXTtcbiAgICAgIGpzb25PYmouc2NyaXB0cy5wcmVwYXJlID0gJ2xlZnRob29rIGluc3RhbGwgfHwgdHJ1ZSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRvIGluc3RhbGwgdGhlIGxhdGVzdCBodXNreVxuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ2h1c2t5Jyk7XG4gICAgICAvLyAnfHwgdHJ1ZScgYXZvaWRzIGVycm9ycyB3aGVuIGh1c2t5IGlzIG5vdCBpbnN0YWxsZWQuXG4gICAgICBqc29uT2JqLnNjcmlwdHMucHJlcGFyZSA9ICdodXNreSB8fCB0cnVlJzsgLy8gZm9yIG5vbi15YXJuIHBhY2thZ2UgbWFuYWdlcnMuXG4gICAgICBqc29uT2JqLnNjcmlwdHMucG9zdGluc3RhbGwgPSAnaHVza3kgfHwgdHJ1ZSc7IC8vIGZvciB5YXJuLlxuICAgICAgaWYgKGNvbmZpZy5pc1B1YmxpY1JlcG8gfHwgY29uZmlnLmlzUmVmZXJyZWRCeU90aGVyUmVwbykge1xuICAgICAgICAvLyBUbyBpbnN0YWxsIHRoZSBsYXRlc3QgcGluc3RcbiAgICAgICAgLy8gaHR0cHM6Ly90eXBpY29kZS5naXRodWIuaW8vaHVza3kvIy8/aWQ9aW5zdGFsbC0xXG4gICAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdwaW5zdCcpO1xuICAgICAgICBqc29uT2JqLnNjcmlwdHMucHJlcGFjayA9ICdwaW5zdCAtLWRpc2FibGUnO1xuICAgICAgICBqc29uT2JqLnNjcmlwdHMucG9zdHBhY2sgPSAncGluc3QgLS1lbmFibGUnO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5zZW1hbnRpY1JlbGVhc2UpIHtcbiAgICAgIGNvbnN0IHZlcnNpb24gPVxuICAgICAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snbXVsdGktc2VtYW50aWMtcmVsZWFzZSddIHx8IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAcWl3aS9tdWx0aS1zZW1hbnRpYy1yZWxlYXNlJ11cbiAgICAgICAgICA/IC8vIFRPRE86IHJlbW92ZSB0aGUgdmVyc2lvbiBzcGVjaWZpY2F0aW9uIGFmdGVyIG11bHRpLXNlbWFudGljLXJlbGVhc2Ugc3VwcG9ydHMgdmVyc2lvbiA3K1xuICAgICAgICAgICAgJ0A2LjEuMCdcbiAgICAgICAgICA6ICcnO1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goYGNvbnZlbnRpb25hbC1jaGFuZ2Vsb2ctY29udmVudGlvbmFsY29tbWl0cyR7dmVyc2lvbn1gKTtcbiAgICAgIGlmIChcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydzZW1hbnRpYy1yZWxlYXNlJ10gJiZcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydtdWx0aS1zZW1hbnRpYy1yZWxlYXNlJ10gJiZcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAcWl3aS9tdWx0aS1zZW1hbnRpYy1yZWxlYXNlJ11cbiAgICAgICkge1xuICAgICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnc2VtYW50aWMtcmVsZWFzZScpO1xuICAgICAgfVxuICAgICAganNvbk9iai52ZXJzaW9uID0gJzAuMC4wLXNlbWFudGljYWxseS1yZWxlYXNlZCc7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRUZXN0KSB7XG4gICAgICAvLyBTaW5jZSBsbG0tdG9vbGJveCByZXF1aXJlcyBAcGxheXdyaWdodC90ZXN0IGluIGRlcGVuZGVuY2llc1xuICAgICAgaWYgKCFqc29uT2JqLmRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddKSB7XG4gICAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAcGxheXdyaWdodC90ZXN0Jyk7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddO1xuICAgICAgfVxuICAgICAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzWydwbGF5d3JpZ2h0J107XG4gICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ3BsYXl3cmlnaHQnXTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNTdWJQYWNrYWdlSnNvbnMpIHtcbiAgICAgIC8vIFdlIGRvbid0IGFsbG93IG5vbi1hcnJheSB3b3Jrc3BhY2VzIGluIG1vbm9yZXBvLlxuICAgICAganNvbk9iai53b3Jrc3BhY2VzID0gQXJyYXkuaXNBcnJheShqc29uT2JqLndvcmtzcGFjZXMpXG4gICAgICAgID8gbWVyZ2UuYWxsKFtqc29uT2JqLndvcmtzcGFjZXMsIFsncGFja2FnZXMvKiddXSwge1xuICAgICAgICAgICAgYXJyYXlNZXJnZTogY29tYmluZU1lcmdlLFxuICAgICAgICAgIH0pXG4gICAgICAgIDogWydwYWNrYWdlcy8qJ107XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGpzb25PYmoud29ya3NwYWNlcykpIHtcbiAgICAgIGpzb25PYmoud29ya3NwYWNlcyA9IGpzb25PYmoud29ya3NwYWNlcy5maWx0ZXIoXG4gICAgICAgICh3b3Jrc3BhY2UpID0+XG4gICAgICAgICAgZ2xvYmJ5U3luYyh3b3Jrc3BhY2UsIHtcbiAgICAgICAgICAgIGRvdDogdHJ1ZSxcbiAgICAgICAgICAgIGN3ZDogY29uZmlnLmRpclBhdGgsXG4gICAgICAgICAgICBnaXRpZ25vcmU6IHRydWUsXG4gICAgICAgICAgfSkubGVuZ3RoID4gMFxuICAgICAgKTtcbiAgICAgIGlmIChqc29uT2JqLndvcmtzcGFjZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLndvcmtzcGFjZXM7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLndiIHx8IGNvbmZpZy5pc0J1bikge1xuICAgIGlmIChqc29uT2JqLmRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3diJ10pIHtcbiAgICAgIGRlcGVuZGVuY2llcy5wdXNoKCdAd2lsbGJvb3N0ZXIvd2InKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0B3aWxsYm9vc3Rlci93YicpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhqc29uT2JqLnNjcmlwdHMgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPikpIHtcbiAgICAgIGpzb25PYmouc2NyaXB0c1trZXldID0gdmFsdWUucmVwbGFjZSgvd2JcXHMrZGIvLCAnd2IgcHJpc21hJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKFxuICAgIGNvbmZpZy5kb2VzQ29udGFpbnNKYXZhU2NyaXB0IHx8XG4gICAgY29uZmlnLmRvZXNDb250YWluc0phdmFTY3JpcHRJblBhY2thZ2VzIHx8XG4gICAgY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHQgfHxcbiAgICBjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdEluUGFja2FnZXNcbiAgKSB7XG4gICAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0BiaW9tZWpzL2Jpb21lJywgJ0B3aWxsYm9vc3Rlci9iaW9tZS1jb25maWcnKTtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snZXNsaW50J107XG4gICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ21pY3JvbWF0Y2gnXTtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHR5cGVzY3JpcHQtZXNsaW50L3BhcnNlciddO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnZXNsaW50QDguNTcuMCcsICdtaWNyb21hdGNoJyk7XG4gICAgICAvLyBUT0RPOiBub3QgbmVlZGVkIGFueW1vcmU/XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHRJblBhY2thZ2VzKSB7XG4gICAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAdHlwZXNjcmlwdC1lc2xpbnQvcGFyc2VyJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCd0eXBlc2NyaXB0Jyk7XG4gICAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0B0eXBlcy9idW4nKTtcbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlnLmVzbGludEJhc2UpIHtcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCguLi5lc2xpbnREZXBzW2NvbmZpZy5lc2xpbnRCYXNlXSk7XG4gIH1cblxuICBpZiAoY29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzKSB7XG4gICAgZGVwZW5kZW5jaWVzID0gZGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhZGVwLmluY2x1ZGVzKCdAd2lsbGJvb3N0ZXIvJykpO1xuICAgIGRldkRlcGVuZGVuY2llcyA9IGRldkRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWRlcC5pbmNsdWRlcygnQHdpbGxib29zdGVyLycpKTtcbiAgfVxuXG4gIGlmICghanNvbk9iai5uYW1lKSB7XG4gICAganNvbk9iai5uYW1lID0gcGF0aC5iYXNlbmFtZShjb25maWcuZGlyUGF0aCk7XG4gIH1cblxuICBpZiAoY29uZmlnLmRvZXNDb250YWluc1N1YlBhY2thZ2VKc29ucykge1xuICAgIGpzb25PYmoucHJpdmF0ZSA9IHRydWU7XG4gIH1cbiAgaWYgKCFqc29uT2JqLmxpY2Vuc2UpIHtcbiAgICBqc29uT2JqLmxpY2Vuc2UgPSAnVU5MSUNFTlNFRCc7XG4gIH1cbiAgaWYgKCFqc29uT2JqLnByaXZhdGUgJiYganNvbk9iai5saWNlbnNlICE9PSAnVU5MSUNFTlNFRCcgJiYgcm9vdENvbmZpZy5pc1B1YmxpY1JlcG8pIHtcbiAgICBqc29uT2JqLnB1Ymxpc2hDb25maWcgPz89IHt9O1xuICAgIGpzb25PYmoucHVibGlzaENvbmZpZy5hY2Nlc3MgPz89ICdwdWJsaWMnO1xuICB9XG4gIGNvbnN0IFtvd25lcl0gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUoY29uZmlnLnJlcG9zaXRvcnkgPz8gJycpO1xuICBpZiAob3duZXIgPT09ICdXaWxsQm9vc3RlcicgfHwgb3duZXIgPT09ICdXaWxsQm9vc3RlckxhYicpIHtcbiAgICBqc29uT2JqLmF1dGhvciA9ICdXaWxsQm9vc3RlciBJbmMuJztcbiAgfVxuICBpZiAoIWNvbmZpZy5pc1Jvb3QgJiYganNvbk9iai5wcml2YXRlICYmICFqc29uT2JqLm1haW4pIHtcbiAgICAvLyBNYWtlIFZTQ29kZSBwb3NzaWJsZSB0byByZWZhY3RvciBjb2RlIGFjcm9zcyBzdWJwYWNrYWdlcy5cbiAgICBqc29uT2JqLm1haW4gPSAnLi9zcmMnO1xuICB9XG5cbiAgLy8gQmVjYXVzZSBgXCJyZXNvbHV0aW9uc1wiOiB7IFwibnBtL2NoYWxrXCI6IFwiXjQuMS4yXCIgfSxgIGNhdXNlcyBcIkludmFsaWQgbnBtIHRva2VuXCJcbiAgZGVsZXRlIGpzb25PYmoucmVzb2x1dGlvbnM/LlsnbnBtL2NoYWxrJ107XG5cbiAgaWYgKCFjb25maWcuZG9lc0NvbnRhaW5zU3ViUGFja2FnZUpzb25zKSB7XG4gICAgaWYgKCFjb25maWcuaXNCdW4pIHtcbiAgICAgIGlmICghY29uZmlnLmRvZXNDb250YWluc0phdmFTY3JpcHQgJiYgIWNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0KSB7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMubGludDtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snbGludC1maXgnXTtcbiAgICAgICAganNvbk9iai5zY3JpcHRzLmNsZWFudXAgPSBqc29uT2JqLnNjcmlwdHMuY2xlYW51cD8ucmVwbGFjZSgnICYmIHlhcm4gbGludC1maXgnLCAnJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J10gKz0gRXNsaW50VXRpbC5nZXRMaW50Rml4U3VmZml4KGNvbmZpZyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNQdWJzcGVjWWFtbCkge1xuICAgICAganNvbk9iai5zY3JpcHRzLmxpbnQgPSAnZmx1dHRlciBhbmFseXplJztcbiAgICAgIGpzb25PYmouc2NyaXB0c1snbGludC1maXgnXSA9ICd5YXJuIGxpbnQnO1xuICAgICAgY29uc3QgZGlycyA9IFsnbGliJywgJ3Rlc3QnLCAndGVzdF9kcml2ZXInXS5maWx0ZXIoKGRpcikgPT4gZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGRpcikpKTtcbiAgICAgIGlmIChkaXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAganNvbk9iai5zY3JpcHRzWydmb3JtYXQtY29kZSddID0gYGZsdXR0ZXIgZm9ybWF0ICQoZmluZCAke2RpcnMuam9pbihcbiAgICAgICAgICAnICdcbiAgICAgICAgKX0gLW5hbWUgZ2VuZXJhdGVkIC1wcnVuZSAtbyAtbmFtZSAnKi5mcmVlemVkLmRhcnQnIC1wcnVuZSAtbyAtbmFtZSAnKi5nLmRhcnQnIC1wcnVuZSAtbyAtbmFtZSAnKi5kYXJ0JyAtcHJpbnQpYDtcbiAgICAgICAganNvbk9iai5zY3JpcHRzLmZvcm1hdCArPSBgICYmIHlhcm4gZm9ybWF0LWNvZGVgO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zUG9ldHJ5TG9jaykge1xuICAgICAgaWYgKGpzb25PYmouc2NyaXB0cy5wb3N0aW5zdGFsbCA9PT0gJ3BvZXRyeSBpbnN0YWxsJykge1xuICAgICAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLnBvc3RpbnN0YWxsO1xuICAgICAgfVxuICAgICAgY29uc3QgcHl0aG9uRmlsZXMgPSBhd2FpdCBnbG9iYnkoJyoqLyoucHknLCB7XG4gICAgICAgIGN3ZDogY29uZmlnLmRpclBhdGgsXG4gICAgICAgIGRvdDogdHJ1ZSxcbiAgICAgICAgZ2l0aWdub3JlOiB0cnVlLFxuICAgICAgICBpZ25vcmU6IFsndGVzdC1maXh0dXJlcyddLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBkaXJOYW1lU2V0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICBmb3IgKGNvbnN0IHB5dGhvbkZpbGUgb2YgcHl0aG9uRmlsZXMpIHtcbiAgICAgICAgY29uc3QgW2ZpcnN0LCBzZWNvbmRdID0gcHl0aG9uRmlsZS5zcGxpdCgvWy9cXFxcXS8pO1xuICAgICAgICBpZiAoc2Vjb25kKSB7XG4gICAgICAgICAgZGlyTmFtZVNldC5hZGQoZmlyc3QpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZGlyTmFtZVNldC5zaXplID4gMCkge1xuICAgICAgICBjb25zdCBkaXJOYW1lc1N0ciA9IFsuLi5kaXJOYW1lU2V0XS5qb2luKCcgJyk7XG4gICAgICAgIGpzb25PYmouc2NyaXB0c1snZm9ybWF0LWNvZGUnXSA9XG4gICAgICAgICAgYHBvZXRyeSBydW4gaXNvcnQgLS1wcm9maWxlIGJsYWNrICR7ZGlyTmFtZXNTdHJ9ICYmIHBvZXRyeSBydW4gYmxhY2sgJHtkaXJOYW1lc1N0cn1gO1xuICAgICAgICBpZiAoanNvbk9iai5zY3JpcHRzLmxpbnQpIHtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHMubGludCA9IGBwb2V0cnkgcnVuIGZsYWtlOCAke2Rpck5hbWVzU3RyfSAmJiAke2pzb25PYmouc2NyaXB0cy5saW50fWA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAganNvbk9iai5zY3JpcHRzLmxpbnQgPSBgcG9ldHJ5IHJ1biBmbGFrZTggJHtkaXJOYW1lc1N0cn1gO1xuICAgICAgICAgIGpzb25PYmouc2NyaXB0c1snbGludC1maXgnXSA9ICd5YXJuIGxpbnQnO1xuICAgICAgICB9XG4gICAgICAgIGpzb25PYmouc2NyaXB0cy5mb3JtYXQgKz0gYCAmJiB5YXJuIGZvcm1hdC1jb2RlYDtcbiAgICAgICAgcG9ldHJ5RGV2RGVwZW5kZW5jaWVzLnB1c2goJ2JsYWNrJywgJ2lzb3J0JywgJ2ZsYWtlOCcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb25maWcucmVwb3NpdG9yeSkge1xuICAgICAganNvbk9iai5yZXBvc2l0b3J5ID0gY29uZmlnLnJlcG9zaXRvcnk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHopIHtcbiAgICBkZXBlbmRlbmNpZXMucHVzaChcbiAgICAgIGBibGl0ekAke0JMSVRaX1ZFUlNJT059YCxcbiAgICAgIGBAYmxpdHpqcy9hdXRoQCR7QkxJVFpfVkVSU0lPTn1gLFxuICAgICAgYEBibGl0empzL25leHRAJHtCTElUWl9WRVJTSU9OfWAsXG4gICAgICBgQGJsaXR6anMvcnBjQCR7QkxJVFpfVkVSU0lPTn1gLFxuICAgICAgYG5leHRAJHtORVhUX1ZFUlNJT059YFxuICAgICk7XG4gICAgLy8gUHJlZmVyIGVzbGludC1jb25maWctbmV4dCdzIGRlcGVuZGVuY2llc1xuICAgIGRldkRlcGVuZGVuY2llcyA9IGRldkRlcGVuZGVuY2llcy5maWx0ZXIoKGQpID0+IGQgIT09ICdlc2xpbnQtcGx1Z2luLXJlYWN0JyAmJiBkICE9PSAnZXNsaW50LXBsdWdpbi1yZWFjdC1ob29rcycpO1xuICAgIGlmICghanNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddPy5zdGFydHNXaXRoKCdibGl0eiBjb2RlZ2VuJykpIHtcbiAgICAgIGpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXSA9ICdibGl0eiBjb2RlZ2VuJztcbiAgICB9IGVsc2UgaWYgKCFqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10uaW5jbHVkZXMoJ2JsaXR6IHByaXNtYSBnZW5lcmF0ZScpKSB7XG4gICAgICBqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10gPSBqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10ucmVwbGFjZShcbiAgICAgICAgJ2JsaXR6IGNvZGVnZW4nLFxuICAgICAgICAnYmxpdHogY29kZWdlbiAmJiBibGl0eiBwcmlzbWEgZ2VuZXJhdGUnXG4gICAgICApO1xuICAgIH1cbiAgfSBlbHNlIGlmIChjb25maWcuZGVwZW5kaW5nLnByaXNtYSAmJiAhanNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddPy5zdGFydHNXaXRoKCdwcmlzbWEgZ2VuZXJhdGUnKSkge1xuICAgIGpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXSA9ICdwcmlzbWEgZ2VuZXJhdGUnO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgIC8vIFRvIHByZXZlbnQgbXVsdGlwbGUgdmVyc2lvbnMgb2YgQHR5cGVzL3JlYWN0IGZyb20gbWl4aW5nLlxuICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHR5cGVzL3JlYWN0J107XG4gIH1cblxuICBpZiAoIWpzb25PYmouZGVwZW5kZW5jaWVzPy5wcmV0dGllcikge1xuICAgIC8vIEJlY2F1c2UgQHR5cGVzL3ByZXR0aWVyIGJsb2NrcyBwcmV0dGllciBleGVjdXRpb24uXG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAdHlwZXMvcHJldHRpZXInXTtcbiAgfVxuXG4gIGlmIChPYmplY3Qua2V5cyhqc29uT2JqLmRlcGVuZGVuY2llcykubGVuZ3RoID09PSAwKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzO1xuICB9XG4gIGlmIChPYmplY3Qua2V5cyhqc29uT2JqLmRldkRlcGVuZGVuY2llcykubGVuZ3RoID09PSAwKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzO1xuICB9XG4gIGlmIChPYmplY3Qua2V5cyhqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgIGRlbGV0ZSBqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXM7XG4gIH1cblxuICBhd2FpdCB1cGRhdGVQcml2YXRlUGFja2FnZXMoanNvbk9iaik7XG5cbiAgbGV0IG5ld0pzb25UZXh0ID0gSlNPTi5zdHJpbmdpZnkoanNvbk9iaik7XG4gIG5ld0pzb25UZXh0ID0gYXdhaXQgZml4U2NyaXB0TmFtZXMoanNvbk9iai5zY3JpcHRzLCBuZXdKc29uVGV4dCwgY29uZmlnKTtcbiAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGZpbGVQYXRoLCBuZXdKc29uVGV4dCk7XG5cbiAgaWYgKCFza2lwQWRkaW5nRGVwcykge1xuICAgIC8vIFdlIGNhbm5vdCBhZGQgZGVwZW5kZW5jaWVzIHdoaWNoIGFyZSBhbHJlYWR5IGluY2x1ZGVkIGluIGRldkRlcGVuZGVuY2llcy5cbiAgICBkZXBlbmRlbmNpZXMgPSBkZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFqc29uT2JqLmRldkRlcGVuZGVuY2llcz8uW2RlcF0pO1xuICAgIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gY29uZmlnLmlzQnVuID8gJ2J1bicgOiAneWFybic7XG4gICAgaWYgKGRlcGVuZGVuY2llcy5sZW5ndGggPiAwKSB7XG4gICAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnYWRkJywgLi4ubmV3IFNldChkZXBlbmRlbmNpZXMpXSwgY29uZmlnLmRpclBhdGgpO1xuICAgIH1cbiAgICAvLyBXZSBjYW5ub3QgYWRkIGRldkRlcGVuZGVuY2llcyB3aGljaCBhcmUgYWxyZWFkeSBpbmNsdWRlZCBpbiBkZXBlbmRlbmNpZXMuXG4gICAgZGV2RGVwZW5kZW5jaWVzID0gZGV2RGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhanNvbk9iai5kZXBlbmRlbmNpZXM/LltkZXBdKTtcbiAgICBpZiAoZGV2RGVwZW5kZW5jaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydhZGQnLCAnLUQnLCAuLi5uZXcgU2V0KGRldkRlcGVuZGVuY2llcyldLCBjb25maWcuZGlyUGF0aCk7XG4gICAgfVxuICAgIGlmIChwb2V0cnlEZXZEZXBlbmRlbmNpZXMubGVuZ3RoID4gMCkge1xuICAgICAgc3Bhd25TeW5jKCdwb2V0cnknLCBbJ2FkZCcsICctLWdyb3VwJywgJ2RldicsIC4uLm5ldyBTZXQocG9ldHJ5RGV2RGVwZW5kZW5jaWVzKV0sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICB9XG4gIH1cbn1cblxuLy8gVE9ETzogcmVtb3ZlIHRoZSBmb2xsb3dpbmcgbWlncmF0aW9uIGNvZGUgaW4gZnV0dXJlXG5hc3luYyBmdW5jdGlvbiByZW1vdmVEZXByZWNhdGVkU3R1ZmYoXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFNldFJlcXVpcmVkPFBhY2thZ2VKc29uLCAnc2NyaXB0cycgfCAnZGVwZW5kZW5jaWVzJyB8ICdkZXZEZXBlbmRlbmNpZXMnPlxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChqc29uT2JqLmF1dGhvciA9PT0gJ1dpbGxCb29zdGVyIExMQycpIHtcbiAgICBqc29uT2JqLmF1dGhvciA9ICdXaWxsQm9vc3RlciBJbmMuJztcbiAgfVxuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydzb3J0LXBhY2thZ2UtanNvbiddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydzb3J0LWFsbC1wYWNrYWdlLWpzb24nXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sndHlwZWNoZWNrL3dhcm4nXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sndHlwZWNoZWNrOmdlbi1jb2RlJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3R5cGVjaGVjazpjb2RlZ2VuJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llc1sndHNsaWInXTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZyddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXJlYWN0J107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3Jlbm92YXRlLWNvbmZpZyddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci90c2NvbmZpZyddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ2VzbGludC1pbXBvcnQtcmVzb2x2ZXItbm9kZSddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ2VzbGludC1wbHVnaW4tcHJldHRpZXInXTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydsZXJuYSddO1xuICAvLyBUbyBpbnN0YWxsIHRoZSBsYXRlc3QgcGluc3RcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydwaW5zdCddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydmbHV0dGVyLWZvcm1hdCddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydmb3JtYXQtZmx1dHRlciddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydweXRob24tZm9ybWF0J107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2Zvcm1hdC1weXRob24nXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sncHJldHRpZXInXTtcbiAgaWYgKCFyb290Q29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzKSB7XG4gICAgZm9yIChjb25zdCBkZXBzIG9mIE9iamVjdC52YWx1ZXMoZXNsaW50RGVwcykpIHtcbiAgICAgIGZvciAoY29uc3QgZGVwIG9mIGRlcHMpIHtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW2RlcF07XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybSgnbGVybmEuanNvbicsIHsgZm9yY2U6IHRydWUgfSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVTY3JpcHRzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgY29uc3Qgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgIGNsZWFudXA6ICdidW4gLS1idW4gd2IgbGludCAtLWZpeCAtLWZvcm1hdCcsXG4gICAgICBmb3JtYXQ6IGBidW4gLS1idW4gd2IgbGludCAtLWZvcm1hdGAsXG4gICAgICBsaW50OiBgYnVuIC0tYnVuIHdiIGxpbnRgLFxuICAgICAgJ2xpbnQtZml4JzogJ2J1biAtLWJ1biB3YiBsaW50IC0tZml4JyxcbiAgICAgIHRlc3Q6ICdidW4gLS1idW4gd2IgdGVzdCcsXG4gICAgICB0eXBlY2hlY2s6ICdidW4gLS1idW4gd2IgdHlwZWNoZWNrJyxcbiAgICB9O1xuICAgIGlmICghY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHQgJiYgIWNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgICAgZGVsZXRlIHNjcmlwdHMudHlwZWNoZWNrO1xuICAgIH1cbiAgICByZXR1cm4gc2NyaXB0cztcbiAgfSBlbHNlIHtcbiAgICBsZXQgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgIGNsZWFudXA6ICd5YXJuIGZvcm1hdCAmJiB5YXJuIGxpbnQtZml4JyxcbiAgICAgIGZvcm1hdDogYHNvcnQtcGFja2FnZS1qc29uICYmIHlhcm4gcHJldHRpZnlgLFxuICAgICAgbGludDogYGVzbGludCAtLWNvbG9yIFwiLi97JHtnZXRTcmNEaXJzKGNvbmZpZyl9fS8qKi8qLnske2V4dGVuc2lvbnMuZXNsaW50LmpvaW4oJywnKX19XCJgLFxuICAgICAgJ2xpbnQtZml4JzogJ3lhcm4gbGludCAtLWZpeCcsXG4gICAgICBwcmV0dGlmeTogYHByZXR0aWVyIC0tY2FjaGUgLS1jb2xvciAtLXdyaXRlIFwiKiovey4qLyx9Ki57JHtleHRlbnNpb25zLnByZXR0aWVyLmpvaW4oJywnKX19XCIgXCIhKiovdGVzdC1maXh0dXJlcy8qKlwiYCxcbiAgICAgIHR5cGVjaGVjazogJ3RzYyAtLW5vRW1pdCAtLVByZXR0eScsXG4gICAgfTtcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc1N1YlBhY2thZ2VKc29ucykge1xuICAgICAgY29uc3Qgb2xkVGVzdCA9IHNjcmlwdHMudGVzdDtcbiAgICAgIHNjcmlwdHMgPSBtZXJnZShcbiAgICAgICAgeyAuLi5zY3JpcHRzIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBmb3JtYXQ6IGBzb3J0LXBhY2thZ2UtanNvbiAmJiB5YXJuIHByZXR0aWZ5ICYmIHlhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsIC0tcGFyYWxsZWwgLS12ZXJib3NlIHJ1biBmb3JtYXRgLFxuICAgICAgICAgIGxpbnQ6IGB5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCAtLXBhcmFsbGVsIC0tdmVyYm9zZSBydW4gbGludGAsXG4gICAgICAgICAgJ2xpbnQtZml4JzogJ3lhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsIC0tcGFyYWxsZWwgLS12ZXJib3NlIHJ1biBsaW50LWZpeCcsXG4gICAgICAgICAgcHJldHRpZnk6IGBwcmV0dGllciAtLWNhY2hlIC0tY29sb3IgLS13cml0ZSBcIioqL3suKi8sfSoueyR7ZXh0ZW5zaW9ucy5wcmV0dGllci5qb2luKFxuICAgICAgICAgICAgJywnXG4gICAgICAgICAgKX19XCIgXCIhKiovcGFja2FnZXMvKipcIiBcIiEqKi90ZXN0LWZpeHR1cmVzLyoqXCJgLFxuICAgICAgICAgIC8vIENJPTEgcHJldmVudHMgdml0ZXN0IGZyb20gZW5hYmxpbmcgd2F0Y2guXG4gICAgICAgICAgLy8gRk9SQ0VfQ09MT1I9MyBtYWtlIHdiIGVuYWJsZSBjb2xvciBvdXRwdXQuXG4gICAgICAgICAgdGVzdDogJ0NJPTEgRk9SQ0VfQ09MT1I9MyB5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCAtLXZlcmJvc2UgcnVuIHRlc3QnLFxuICAgICAgICAgIHR5cGVjaGVjazogJ3lhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsIC0tcGFyYWxsZWwgLS12ZXJib3NlIHJ1biB0eXBlY2hlY2snLFxuICAgICAgICB9XG4gICAgICApO1xuICAgICAgaWYgKG9sZFRlc3Q/LmluY2x1ZGVzKCd3YiB0ZXN0JykpIHtcbiAgICAgICAgc2NyaXB0cy50ZXN0ID0gb2xkVGVzdDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHlyaWdodCkge1xuICAgICAgc2NyaXB0cy50eXBlY2hlY2sgPSBzY3JpcHRzLnR5cGVjaGVjayA/IGAke3NjcmlwdHMudHlwZWNoZWNrfSAmJiBgIDogJyc7XG4gICAgICBzY3JpcHRzLnR5cGVjaGVjayArPSAncHlyaWdodCc7XG4gICAgfVxuXG4gICAgaWYgKCFjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdCAmJiAhY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHRJblBhY2thZ2VzKSB7XG4gICAgICBkZWxldGUgc2NyaXB0cy50eXBlY2hlY2s7XG4gICAgfSBlbHNlIGlmIChjb25maWcuZGVwZW5kaW5nLndiKSB7XG4gICAgICBzY3JpcHRzLnR5cGVjaGVjayA9ICd3YiB0eXBlY2hlY2snO1xuICAgIH1cbiAgICByZXR1cm4gc2NyaXB0cztcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVByZXR0aWVyU3VmZml4KGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICcucHJldHRpZXJpZ25vcmUnKTtcbiAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gIGNvbnN0IGluZGV4ID0gZXhpc3RpbmdDb250ZW50LmluZGV4T2YoaWdub3JlRmlsZVV0aWwuc2VwYXJhdG9yUHJlZml4KTtcbiAgaWYgKGluZGV4ID09PSAtMSkgcmV0dXJuICcnO1xuXG4gIGNvbnN0IG9yaWdpbmFsQ29udGVudCA9IGV4aXN0aW5nQ29udGVudC5zbGljZSgwLCBpbmRleCk7XG4gIGNvbnN0IGxpbmVzID0gb3JpZ2luYWxDb250ZW50XG4gICAgLnNwbGl0KCdcXG4nKVxuICAgIC5tYXAoKGxpbmUpID0+IHtcbiAgICAgIGNvbnN0IG5ld0xpbmUgPSBsaW5lLnRyaW0oKTtcbiAgICAgIHJldHVybiBuZXdMaW5lLmVuZHNXaXRoKCcvJykgPyBuZXdMaW5lLnNsaWNlKDAsIC0xKSA6IG5ld0xpbmU7XG4gICAgfSlcbiAgICAuZmlsdGVyKChsKSA9PiBsICYmICFsLnN0YXJ0c1dpdGgoJyMnKSAmJiAhbC5pbmNsdWRlcygnLycpKTtcblxuICByZXR1cm4gbGluZXMubWFwKChsaW5lKSA9PiBgIFwiISoqLyR7bGluZX0vKipcImApLmpvaW4oJycpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmaXhTY3JpcHROYW1lcyhcbiAgc2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cyxcbiAgbmV3SnNvblRleHQ6IHN0cmluZyxcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBvbGRBbmROZXdTY3JpcHROYW1lczogW3N0cmluZywgc3RyaW5nXVtdID0gW107XG4gIGZvciAoY29uc3QgW2tleV0gb2YgT2JqZWN0LmtleXMoc2NyaXB0cykpIHtcbiAgICBpZiAoa2V5WzBdICE9PSAnOicgJiYga2V5LmluY2x1ZGVzKCc6JykpIHtcbiAgICAgIG9sZEFuZE5ld1NjcmlwdE5hbWVzLnB1c2goW2tleSwga2V5LnJlcGxhY2VBbGwoJzonLCAnLScpXSk7XG4gICAgfVxuICB9XG4gIGlmIChvbGRBbmROZXdTY3JpcHROYW1lcy5sZW5ndGggPT09IDApIHJldHVybiBuZXdKc29uVGV4dDtcblxuICBmb3IgKGNvbnN0IFtvbGROYW1lLCBuZXdOYW1lXSBvZiBvbGRBbmROZXdTY3JpcHROYW1lcykge1xuICAgIG5ld0pzb25UZXh0ID0gbmV3SnNvblRleHQucmVwbGFjZUFsbChvbGROYW1lLCBuZXdOYW1lKTtcbiAgfVxuICBjb25zdCBmaWxlcyA9IGF3YWl0IGdsb2JieShbJyoqLyoue21kLGNqcyxtanMsanMsanN4LGN0cyxtdHMsdHMsdHN4fScsICcqKi9Eb2NrZXJmaWxlJ10sIHtcbiAgICBjd2Q6IGNvbmZpZy5kaXJQYXRoLFxuICAgIGRvdDogdHJ1ZSxcbiAgICBnaXRpZ25vcmU6IHRydWUsXG4gIH0pO1xuICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oY29uZmlnLmRpclBhdGgsIGZpbGUpO1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgbGV0IG5ld0NvbnRlbnQgPSBvbGRDb250ZW50O1xuICAgICAgZm9yIChjb25zdCBbb2xkTmFtZSwgbmV3TmFtZV0gb2Ygb2xkQW5kTmV3U2NyaXB0TmFtZXMpIHtcbiAgICAgICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZUFsbChvbGROYW1lLCBuZXdOYW1lKTtcbiAgICAgIH1cbiAgICAgIGlmIChuZXdDb250ZW50ICE9PSBvbGRDb250ZW50KSB7XG4gICAgICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICByZXR1cm4gbmV3SnNvblRleHQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVByaXZhdGVQYWNrYWdlcyhqc29uT2JqOiBQYWNrYWdlSnNvbik6IFByb21pc2U8dm9pZD4ge1xuICBqc29uT2JqLmRlcGVuZGVuY2llcyA9IGpzb25PYmouZGVwZW5kZW5jaWVzIHx8IHt9O1xuICBqc29uT2JqLmRldkRlcGVuZGVuY2llcyA9IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzIHx8IHt9O1xuICBjb25zdCBwYWNrYWdlTmFtZXMgPSBuZXcgU2V0KFsuLi5PYmplY3Qua2V5cyhqc29uT2JqLmRlcGVuZGVuY2llcyksIC4uLk9iamVjdC5rZXlzKGpzb25PYmouZGV2RGVwZW5kZW5jaWVzKV0pO1xuICBjb25zb2xlLmluZm8oJ3BhY2thZ2VOYW1lczonLCBwYWNrYWdlTmFtZXMpO1xuICBpZiAocGFja2FnZU5hbWVzLmhhcygnQHdpbGxib29zdGVyL2F1dGgnKSkge1xuICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL2F1dGgnXTtcbiAgICBjb25zdCBjb21taXRIYXNoID0gYXdhaXQgZ2V0TGF0ZXN0Q29tbWl0SGFzaCgnV2lsbEJvb3N0ZXJMYWInLCAnYXV0aCcpO1xuICAgIGpzb25PYmouZGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvYXV0aCddID0gYGdpdEBnaXRodWIuY29tOldpbGxCb29zdGVyTGFiL2F1dGguZ2l0IyR7Y29tbWl0SGFzaH1gO1xuICB9IGVsc2UgaWYgKHBhY2thZ2VOYW1lcy5oYXMoJ0B3aWxsYm9vc3Rlci9jb2RlLWFuYWx5emVyJykpIHtcbiAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9jb2RlLWFuYWx5emVyJ107XG4gICAgY29uc3QgY29tbWl0SGFzaCA9IGF3YWl0IGdldExhdGVzdENvbW1pdEhhc2goJ1dpbGxCb29zdGVyTGFiJywgJ2NvZGUtYW5hbHl6ZXInKTtcbiAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL2NvZGUtYW5hbHl6ZXInXSA9XG4gICAgICBgZ2l0QGdpdGh1Yi5jb206V2lsbEJvb3N0ZXJMYWIvY29kZS1hbmFseXplci5naXQjd29ya3NwYWNlPUBjb2RlLWFuYWx5emVyL2NsaWVudCZjb21taXQ9JHtjb21taXRIYXNofWA7XG4gIH0gZWxzZSBpZiAocGFja2FnZU5hbWVzLmhhcygnQHdpbGxib29zdGVyL2p1ZGdlJykpIHtcbiAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9qdWRnZSddO1xuICAgIGNvbnN0IGNvbW1pdEhhc2ggPSBhd2FpdCBnZXRMYXRlc3RDb21taXRIYXNoKCdXaWxsQm9vc3RlckxhYicsICdqdWRnZScpO1xuICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvanVkZ2UnXSA9IGBnaXRAZ2l0aHViLmNvbTpXaWxsQm9vc3RlckxhYi9qdWRnZS5naXQjJHtjb21taXRIYXNofWA7XG4gIH0gZWxzZSBpZiAocGFja2FnZU5hbWVzLmhhcygnQHdpbGxib29zdGVyL2xsbS1wcm94eScpKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvbGxtLXByb3h5J107XG4gICAgY29uc3QgY29tbWl0SGFzaCA9IGF3YWl0IGdldExhdGVzdENvbW1pdEhhc2goJ1dpbGxCb29zdGVyTGFiJywgJ2xsbS1wcm94eScpO1xuICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvbGxtLXByb3h5J10gPVxuICAgICAgYGdpdEBnaXRodWIuY29tOldpbGxCb29zdGVyTGFiL2xsbS1wcm94eS5naXQjd29ya3NwYWNlPUBsbG0tcHJveHkvY2xpZW50JmNvbW1pdD0ke2NvbW1pdEhhc2h9YDtcbiAgfVxufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuXG5pbXBvcnQgeyBnZW5lcmF0ZVNjcmlwdHMgfSBmcm9tICcuL3BhY2thZ2VKc29uLmpzJztcblxuY29uc3Qgc2NyaXB0cyA9IHtcbiAgcHJlQ29tbWl0OiAnbm9kZSBub2RlX21vZHVsZXMvLmJpbi9saW50LXN0YWdlZCcsXG4gIHByZVB1c2g6IGB5YXJuIHR5cGVjaGVja2AsXG4gIHByZVB1c2hGb3JMYWI6IGBcbmlmIFsgJChnaXQgYnJhbmNoIC0tc2hvdy1jdXJyZW50KSA9IFwibWFpblwiIF0gJiYgWyAkKGdpdCBjb25maWcgdXNlci5lbWFpbCkgIT0gXCJleGthenV1QGdtYWlsLmNvbVwiIF07IHRoZW5cbiAgZWNobyBcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiXG4gIGVjaG8gXCIqKiogRG9uJ3QgcHVzaCBtYWluIGJyYW5jaCBkaXJlY3RseS4gVXNlIFBSISAqKipcIlxuICBlY2hvIFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCJcbiAgZXhpdCAxXG5maVxuXG55YXJuIHR5cGVjaGVja1xuYC50cmltKCksXG4gIHBvc3RNZXJnZTogYFxuY2hhbmdlZF9maWxlcz1cIiQoZ2l0IGRpZmYtdHJlZSAtciAtLW5hbWUtb25seSAtLW5vLWNvbW1pdC1pZCBPUklHX0hFQUQgSEVBRClcIlxuXG5ydW5faWZfY2hhbmdlZCgpIHtcbiAgaWYgZWNobyBcIiRjaGFuZ2VkX2ZpbGVzXCIgfCBncmVwIC0tcXVpZXQgLUUgXCIkMVwiOyB0aGVuXG4gICAgZXZhbCBcIiQyXCJcbiAgZmlcbn1cbmAudHJpbSgpLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlSHVza3lyY1VwZGF0aW5nUGFja2FnZUpzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVIdXNreXJjVXBkYXRpbmdQYWNrYWdlSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBjb3JlKGNvbmZpZyk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgY29uc3QganNvblRleHQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShwYWNrYWdlSnNvblBhdGgsICd1dGY4Jyk7XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShqc29uVGV4dCk7XG4gIHBhY2thZ2VKc29uLnNjcmlwdHMgfHw9IHt9O1xuICBkZWxldGUgcGFja2FnZUpzb24uc2NyaXB0c1sncG9zdGluc3RhbGwnXTtcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnNjcmlwdHNbJ3Bvc3RwdWJsaXNoJ107XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5zY3JpcHRzWydwcmVwYXJlJ107XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5zY3JpcHRzWydwcmVwdWJsaXNoT25seSddO1xuICBkZWxldGUgcGFja2FnZUpzb24uc2NyaXB0c1sncHJlcGFjayddO1xuICBkZWxldGUgcGFja2FnZUpzb24uc2NyaXB0c1sncG9zdHBhY2snXTtcblxuICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmh1c2t5Jyk7XG4gIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICBmcy5wcm9taXNlcy53cml0ZUZpbGUocGFja2FnZUpzb25QYXRoLCBKU09OLnN0cmluZ2lmeShwYWNrYWdlSnNvbiwgdW5kZWZpbmVkLCAyKSksXG4gICAgZnMucHJvbWlzZXMucm0oZGlyUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pLFxuICBdKTtcbiAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgIHNwYXduU3luYygnZ2l0JywgWydjb25maWcnLCAnLS11bnNldCcsICdjb3JlLmhvb2tzUGF0aCddLCBjb25maWcuZGlyUGF0aCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgc3Bhd25TeW5jKCd5YXJuJywgWydkbHgnLCAnaHVza3ktaW5pdCcsICctLXlhcm4yJ10sIGNvbmZpZy5kaXJQYXRoKTtcblxuICBjb25zdCBwcmVDb21taXRGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncHJlLWNvbW1pdCcpO1xuXG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuaHVza3lyYy5qc29uJyksIHsgZm9yY2U6IHRydWUgfSkpO1xuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMud3JpdGVGaWxlKHByZUNvbW1pdEZpbGVQYXRoLCBzY3JpcHRzLnByZUNvbW1pdCArICdcXG4nKSk7XG5cbiAgY29uc3QgeyB0eXBlY2hlY2sgfSA9IGdlbmVyYXRlU2NyaXB0cyhjb25maWcpO1xuICBpZiAodHlwZWNoZWNrKSB7XG4gICAgbGV0IHByZVB1c2ggPSBjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyTGFiLycpID8gc2NyaXB0cy5wcmVQdXNoRm9yTGFiIDogc2NyaXB0cy5wcmVQdXNoO1xuICAgIHByZVB1c2ggPSBwcmVQdXNoLnJlcGxhY2UoXG4gICAgICAneWFybiB0eXBlY2hlY2snLFxuICAgICAgdHlwZWNoZWNrXG4gICAgICAgIC5yZXBsYWNlKCd0c2MgJywgJ25vZGUgbm9kZV9tb2R1bGVzLy5iaW4vdHNjICcpXG4gICAgICAgIC5yZXBsYWNlKCd3YiAnLCAnbm9kZSBub2RlX21vZHVsZXMvLmJpbi93YiAnKVxuICAgICAgICAvLyBweXJpZ2h0IGhhcyBubyBhcmd1bWVudHNcbiAgICAgICAgLnJlcGxhY2UoJ3B5cmlnaHQnLCAnbm9kZSBub2RlX21vZHVsZXMvLmJpbi9weXJpZ2h0JylcbiAgICApO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncHJlLXB1c2gnKSwgcHJlUHVzaCArICdcXG4nLCB7XG4gICAgICAgIG1vZGU6IDBvNzU1LFxuICAgICAgfSlcbiAgICApO1xuICB9XG4gIGNvbnN0IHBvc3RNZXJnZUNvbW1hbmQgPSBgJHtzY3JpcHRzLnBvc3RNZXJnZX1cXG5cXG4ke2dlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMoY29uZmlnKS5qb2luKCdcXG4nKX1cXG5gO1xuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwb3N0LW1lcmdlJyksIHBvc3RNZXJnZUNvbW1hbmQsIHtcbiAgICAgIG1vZGU6IDBvNzU1LFxuICAgIH0pXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVBvc3RNZXJnZUNvbW1hbmRzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgcG9zdE1lcmdlQ29tbWFuZHM6IHN0cmluZ1tdID0gW107XG4gIGlmIChjb25maWcudmVyc2lvbnNUZXh0KSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCJcXC4uKy12ZXJzaW9uXCIgXCJhd2sgJ3twcmludCBcXCQxfScgLnRvb2wtdmVyc2lvbnMgfCB4YXJncyAtSXt9IGFzZGYgcGx1Z2luIGFkZCB7fVwiYCxcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCJcXC4uKy12ZXJzaW9uXCIgXCJhc2RmIHBsdWdpbiB1cGRhdGUgLS1hbGxcImBcbiAgICApO1xuICB9XG4gIC8vIFB5dGhvbuOBjOOBquOBhOOBqOOCpOODs+OCueODiOODvOODq+OBp+OBjeOBquOBhOWHpueQhuezu+OBjOWtmOWcqOOBmeOCi+OBn+OCgeOAgeW8t+WItueahOOBq+acgOWIneOBq+OCpOODs+OCueODiOODvOODq+OBmeOCi+OAglxuICBpZiAoY29uZmlnLnZlcnNpb25zVGV4dD8uaW5jbHVkZXMoJ3B5dGhvbiAnKSkge1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIlxcLi4rLXZlcnNpb25cIiBcImFzZGYgaW5zdGFsbCBweXRob25cImApO1xuICB9XG4gIGlmIChjb25maWcudmVyc2lvbnNUZXh0KSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiXFwuListdmVyc2lvblwiIFwiYXNkZiBpbnN0YWxsXCJgKTtcbiAgfVxuICBjb25zdCBpbnN0YWxsQ29tbWFuZCA9IGNvbmZpZy5pc0J1biA/ICdidW4gaW5zdGFsbCcgOiAneWFybic7XG4gIGNvbnN0IHJtTmV4dERpcmVjdG9yeSA9IGNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHwgY29uZmlnLmRlcGVuZGluZy5uZXh0ID8gJyAmJiBybSAtUmYgLm5leHQnIDogJyc7XG4gIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goYHJ1bl9pZl9jaGFuZ2VkIFwicGFja2FnZVxcXFwuanNvblwiIFwiJHtpbnN0YWxsQ29tbWFuZH0ke3JtTmV4dERpcmVjdG9yeX1cImApO1xuICBpZiAoY29uZmlnLmRvZXNDb250YWluc1BvZXRyeUxvY2spIHtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCJwb2V0cnlcXC5sb2NrXCIgXCJwb2V0cnkgaW5zdGFsbFwiYCk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHopIHtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFxuICAgICAgJ3J1bl9pZl9jaGFuZ2VkIFwiZGIvc2NoZW1hLnByaXNtYVwiIFwibm9kZSBub2RlX21vZHVsZXMvLmJpbi9ibGl0eiBwcmlzbWEgbWlncmF0ZSBkZXBsb3lcIicsXG4gICAgICAncnVuX2lmX2NoYW5nZWQgXCJkYi9zY2hlbWEucHJpc21hXCIgXCJub2RlIG5vZGVfbW9kdWxlcy8uYmluL2JsaXR6IHByaXNtYSBnZW5lcmF0ZVwiJyxcbiAgICAgICdydW5faWZfY2hhbmdlZCBcImRiL3NjaGVtYS5wcmlzbWFcIiBcIm5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vYmxpdHogY29kZWdlblwiJ1xuICAgICk7XG4gIH0gZWxzZSBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEpIHtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFxuICAgICAgJ3J1bl9pZl9jaGFuZ2VkIFwicHJpc21hL3NjaGVtYS5wcmlzbWFcIiBcIm5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vZG90ZW52IC1jIGRldmVsb3BtZW50IC0tIG5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vcHJpc21hIG1pZ3JhdGUgZGVwbG95XCInLFxuICAgICAgJ3J1bl9pZl9jaGFuZ2VkIFwicHJpc21hL3NjaGVtYS5wcmlzbWFcIiBcIm5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vZG90ZW52IC1jIGRldmVsb3BtZW50IC0tIG5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vcHJpc21hIGdlbmVyYXRlXCInXG4gICAgKTtcbiAgfVxuICByZXR1cm4gcG9zdE1lcmdlQ29tbWFuZHM7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmZ1bmN0aW9uIGNyZWF0ZVRhc2tPcHRpb25zKHJ1bm5lcjogc3RyaW5nLCBhcmdzOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgZXh0ZW5zaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCAgICA8VGFza09wdGlvbnMgaXNFbmFibGVkPVwidHJ1ZVwiPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiYXJndW1lbnRzXCIgdmFsdWU9XCIke2FyZ3N9ICRGaWxlUGF0aFJlbGF0aXZlVG9Qcm9qZWN0Um9vdCRcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiY2hlY2tTeW50YXhFcnJvcnNcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImRlc2NyaXB0aW9uXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImV4aXRDb2RlQmVoYXZpb3JcIiB2YWx1ZT1cIkVSUk9SXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImZpbGVFeHRlbnNpb25cIiB2YWx1ZT1cIiR7ZXh0ZW5zaW9ufVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJpbW1lZGlhdGVTeW5jXCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJuYW1lXCIgdmFsdWU9XCIke25hbWV9ICguJHtleHRlbnNpb259KVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJvdXRwdXRcIiB2YWx1ZT1cIiRGaWxlUGF0aFJlbGF0aXZlVG9Qcm9qZWN0Um9vdCRcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwib3V0cHV0RmlsdGVyc1wiPlxuICAgICAgICA8YXJyYXkgLz5cbiAgICAgIDwvb3B0aW9uPlxuICAgICAgPG9wdGlvbiBuYW1lPVwib3V0cHV0RnJvbVN0ZG91dFwiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwicHJvZ3JhbVwiIHZhbHVlPVwiJHtydW5uZXJ9XCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cInJ1bk9uRXh0ZXJuYWxDaGFuZ2VzXCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJzY29wZU5hbWVcIiB2YWx1ZT1cIlByb2plY3QgRmlsZXNcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwidHJhY2tPbmx5Um9vdFwiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwid29ya2luZ0RpclwiIHZhbHVlPVwiJFByb2plY3RGaWxlRGlyJFwiIC8+XG4gICAgICA8ZW52cyAvPlxuICAgIDwvVGFza09wdGlvbnM+XG5gO1xufVxuXG5jb25zdCBwcmV0dGllckNvbnRlbnQgPSBgPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG48cHJvamVjdCB2ZXJzaW9uPVwiNFwiPlxuICA8Y29tcG9uZW50IG5hbWU9XCJQcm9qZWN0VGFza3NPcHRpb25zXCI+XG4ke2V4dGVuc2lvbnMucHJldHRpZXIubWFwKChleHQpID0+IGNyZWF0ZVRhc2tPcHRpb25zKCdub2RlJywgJ25vZGVfbW9kdWxlcy8uYmluL3ByZXR0aWVyIC0tY2FjaGUgLS13cml0ZScsICdQcmV0dGllcicsIGV4dCkpLmpvaW4oJycpfVxuICA8L2NvbXBvbmVudD5cbjwvcHJvamVjdD5cbmA7XG5cbmNvbnN0IGJpb21lQ29udGVudCA9IGA8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cbjxwcm9qZWN0IHZlcnNpb249XCI0XCI+XG4gIDxjb21wb25lbnQgbmFtZT1cIlByb2plY3RUYXNrc09wdGlvbnNcIj5cbiR7ZXh0ZW5zaW9ucy5wcmV0dGllci5tYXAoKGV4dCkgPT4gY3JlYXRlVGFza09wdGlvbnMoJ2J1bicsICctLWJ1biBub2RlX21vZHVsZXMvLmJpbi9iaW9tZSBjaGVjayAtLWZpeCAtLW5vLWVycm9ycy1vbi11bm1hdGNoZWQgLS1za2lwLWVycm9ycycsICdCaW9tZScsIGV4dCkpLmpvaW4oJycpfVxuICA8L2NvbXBvbmVudD5cbjwvcHJvamVjdD5cbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUlkZWFTZXR0aW5ncyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUlkZWFTZXR0aW5ncycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmlkZWEnKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhkaXJQYXRoKSkge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3dhdGNoZXJUYXNrcy54bWwnKTtcbiAgICAgIGF3YWl0IChjb25maWcuZG9lc0NvbnRhaW5zSmF2YVNjcmlwdCB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluc0phdmFTY3JpcHRJblBhY2thZ2VzIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdCB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHRJblBhY2thZ2VzIHx8XG4gICAgICAoY29uZmlnLmRvZXNDb250YWluc1BhY2thZ2VKc29uICYmXG4gICAgICAgICFjb25maWcuZG9lc0NvbnRhaW5zUHVic3BlY1lhbWwgJiZcbiAgICAgICAgIWNvbmZpZy5kb2VzQ29udGFpbnNHZW1maWxlICYmXG4gICAgICAgICFjb25maWcuZG9lc0NvbnRhaW5zR29Nb2QgJiZcbiAgICAgICAgIWNvbmZpZy5kb2VzQ29udGFpbnNQb21YbWwpXG4gICAgICAgID8gcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGNvbmZpZy5pc0J1biA/IGJpb21lQ29udGVudCA6IHByZXR0aWVyQ29udGVudCkpXG4gICAgICAgIDogcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKSk7XG4gICAgfVxuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW1wb3J0IHsgZ2VuZXJhdGVQb3N0TWVyZ2VDb21tYW5kcyB9IGZyb20gJy4vaHVza3lyYy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVNjcmlwdHMgfSBmcm9tICcuL3BhY2thZ2VKc29uLmpzJztcblxuY29uc3QgbmV3U2V0dGluZ3MgPSB7XG4gICdwb3N0LW1lcmdlJzoge1xuICAgIHNjcmlwdHM6IHtcbiAgICAgICdwcmVwYXJlLnNoJzoge1xuICAgICAgICBydW5uZXI6ICdiYXNoJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ3ByZS1jb21taXQnOiB7XG4gICAgY29tbWFuZHM6IHtcbiAgICAgIGNsZWFudXA6IHtcbiAgICAgICAgZ2xvYjogJyoue2Nqcyxjc3MsY3RzLGh0bSxodG1sLGpzLGpzb24sanNvbjUsanNvbmMsanN4LG1kLG1qcyxtdHMsc2Nzcyx0cyx0c3gsdnVlLHlhbWwseW1sfScsXG4gICAgICAgIHJ1bjogJ2J1biAtLWJ1biB3YiBsaW50IC0tZml4IC0tZm9ybWF0IHtzdGFnZWRfZmlsZXN9ICYmIGdpdCBhZGQge3N0YWdlZF9maWxlc30nLFxuICAgICAgfSxcbiAgICAgICdjaGVjay1taWdyYXRpb25zJzoge1xuICAgICAgICBnbG9iOiAnKiovbWlncmF0aW9uLnNxbCcsXG4gICAgICAgIHJ1bjogYFxuaWYgZ3JlcCAtcSAnV2FybmluZ3M6JyB7c3RhZ2VkX2ZpbGVzfTsgdGhlblxuICBlY2hvIFwiTWlncmF0aW9uIFNRTCBmaWxlcyAoe3N0YWdlZF9maWxlc30pIGNvbnRhaW4gd2FybmluZ3MhIFBsZWFzZSBzb2x2ZSB0aGUgd2FybmluZ3MgYW5kIGNvbW1pdCBhZ2Fpbi5cIlxuICBleGl0IDFcbmZpXG5gLnRyaW0oKSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ3ByZS1wdXNoJzoge1xuICAgIHNjcmlwdHM6IHtcbiAgICAgICdjaGVjay5zaCc6IHtcbiAgICAgICAgcnVubmVyOiAnYmFzaCcsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG59O1xuXG5jb25zdCBzY3JpcHRzID0ge1xuICBwcmVQdXNoOiBgYnVuIC0tYnVuIG5vZGVfbW9kdWxlcy8uYmluL3diIHR5cGVjaGVja2AsXG4gIHByZVB1c2hGb3JMYWI6IGBcbiMhL2Jpbi9iYXNoXG5cbmlmIFsgJChnaXQgYnJhbmNoIC0tc2hvdy1jdXJyZW50KSA9IFwibWFpblwiIF0gJiYgWyAkKGdpdCBjb25maWcgdXNlci5lbWFpbCkgIT0gXCJleGthenV1QGdtYWlsLmNvbVwiIF07IHRoZW5cbiAgZWNobyBcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiXG4gIGVjaG8gXCIqKiogRG9uJ3QgcHVzaCBtYWluIGJyYW5jaCBkaXJlY3RseS4gVXNlIFBSISAqKipcIlxuICBlY2hvIFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCJcbiAgZXhpdCAxXG5maVxuXG5idW4gLS1idW4gbm9kZV9tb2R1bGVzLy5iaW4vd2IgdHlwZWNoZWNrXG5gLnRyaW0oKSxcbiAgcG9zdE1lcmdlOiBgXG4jIS9iaW4vYmFzaFxuXG5jaGFuZ2VkX2ZpbGVzPVwiJChnaXQgZGlmZi10cmVlIC1yIC0tbmFtZS1vbmx5IC0tbm8tY29tbWl0LWlkIE9SSUdfSEVBRCBIRUFEKVwiXG5cbnJ1bl9pZl9jaGFuZ2VkKCkge1xuICBpZiBlY2hvIFwiJGNoYW5nZWRfZmlsZXNcIiB8IGdyZXAgLS1xdWlldCAtRSBcIiQxXCI7IHRoZW5cbiAgICBldmFsIFwiJDJcIlxuICBmaVxufVxuYC50cmltKCksXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVMZWZ0aG9va1VwZGF0aW5nUGFja2FnZUpzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVMZWZ0aG9va1VwZGF0aW5nUGFja2FnZUpzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgY29yZShjb25maWcpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5sZWZ0aG9vaycpO1xuICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgZnMucHJvbWlzZXMud3JpdGVGaWxlKFxuICAgICAgcGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAnbGVmdGhvb2sueW1sJyksXG4gICAgICB5YW1sLmR1bXAobmV3U2V0dGluZ3MsIHtcbiAgICAgICAgbGluZVdpZHRoOiAtMSxcbiAgICAgICAgbm9Db21wYXRNb2RlOiB0cnVlLFxuICAgICAgICBzdHlsZXM6IHtcbiAgICAgICAgICAnISFudWxsJzogJ2VtcHR5JyxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgKSxcbiAgICBmcy5wcm9taXNlcy5ybShkaXJQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSksXG4gIF0pO1xuXG4gIGNvbnN0IHsgdHlwZWNoZWNrIH0gPSBnZW5lcmF0ZVNjcmlwdHMoY29uZmlnKTtcbiAgaWYgKHR5cGVjaGVjaykge1xuICAgIGNvbnN0IHByZVB1c2ggPSBjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyTGFiLycpID8gc2NyaXB0cy5wcmVQdXNoRm9yTGFiIDogc2NyaXB0cy5wcmVQdXNoO1xuICAgIGZzLm1rZGlyU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ3ByZS1wdXNoJyksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGguam9pbihkaXJQYXRoLCAncHJlLXB1c2gnLCAnY2hlY2suc2gnKSwgcHJlUHVzaCArICdcXG4nLCB7XG4gICAgICAgIG1vZGU6IDBvNzU1LFxuICAgICAgfSlcbiAgICApO1xuICB9XG4gIGNvbnN0IHBvc3RNZXJnZUNvbW1hbmQgPSBgJHtzY3JpcHRzLnBvc3RNZXJnZX1cXG5cXG4ke2dlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMoY29uZmlnKS5qb2luKCdcXG4nKX1cXG5gO1xuICBmcy5ta2RpclN5bmMocGF0aC5qb2luKGRpclBhdGgsICdwb3N0LW1lcmdlJyksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwb3N0LW1lcmdlJywgJ3ByZXBhcmUuc2gnKSwgcG9zdE1lcmdlQ29tbWFuZCwge1xuICAgICAgbW9kZTogMG83NTUsXG4gICAgfSlcbiAgKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IEVzbGludFV0aWwgfSBmcm9tICcuLi91dGlscy9lc2xpbnRVdGlsLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IGdldFNyY0RpcnMgfSBmcm9tICcuLi91dGlscy9zcmNEaXJlY3Rvcmllcy5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUxpbnRzdGFnZWRyYyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUxpbnRzdGFnZWRyYycsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBjb3JlKGNvbmZpZyk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5saW50c3RhZ2VkcmMuY2pzJyk7XG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHBhY2thZ2VQcmVmaXggPSBjb25maWcuaXNSb290ID8gJ25vZGUgbm9kZV9tb2R1bGVzLy5iaW4vJyA6ICdub2RlIC4uLy4uL25vZGVfbW9kdWxlcy8uYmluLyc7XG4gIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuICBpZiAoY29uZmlnLmRvZXNDb250YWluc0phdmFTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHQpIHtcbiAgICBjb25zdCBlc2xpbnQgPSBgXG4gICcke2dldEVzbGludEtleShjb25maWcpfSc6IFske0pTT04uc3RyaW5naWZ5KFxuICAgIGAke3BhY2thZ2VQcmVmaXh9ZXNsaW50IC0tZml4JHtFc2xpbnRVdGlsLmdldExpbnRGaXhTdWZmaXgoY29uZmlnKX1gXG4gICl9LCAnJHtwYWNrYWdlUHJlZml4fXByZXR0aWVyIC0tY2FjaGUgLS13cml0ZSddLGA7XG4gICAgbGluZXMucHVzaChlc2xpbnQpO1xuICB9XG4gIGNvbnN0IHBhY2thZ2VzRmlsdGVyID0gY29uZmlnLmlzUm9vdCA/IFwiICYmICFmaWxlLmluY2x1ZGVzKCcvcGFja2FnZXMvJylcIiA6ICcnO1xuICBsaW5lcy5wdXNoKGBcbiAgJy4vKiovKi57JHtleHRlbnNpb25zLnByZXR0aWVyLmpvaW4oJywnKX19JzogZmlsZXMgPT4ge1xuICAgIGxldCBmaWx0ZXJlZEZpbGVzID0gZmlsZXMuZmlsdGVyKGZpbGUgPT4gIWZpbGUuaW5jbHVkZXMoJy90ZXN0LWZpeHR1cmVzLycpJHtwYWNrYWdlc0ZpbHRlcn0pOyR7Z2V0RXNsaW50RmlsdGVyRm9yUHJldHRpZXIoY29uZmlnKX1cbiAgICBpZiAoZmlsdGVyZWRGaWxlcy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcbiAgICBjb25zdCBjb21tYW5kcyA9IFtcXGAke3BhY2thZ2VQcmVmaXh9cHJldHRpZXIgLS1jYWNoZSAtLXdyaXRlIFxcJHtmaWx0ZXJlZEZpbGVzLmpvaW4oJyAnKX1cXGBdO1xuICAgIGlmIChmaWx0ZXJlZEZpbGVzLnNvbWUoZmlsZSA9PiBmaWxlLmVuZHNXaXRoKCdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICAgIGNvbW1hbmRzLnB1c2goJyR7cGFja2FnZVByZWZpeH1zb3J0LXBhY2thZ2UtanNvbicpO1xuICAgIH1cbiAgICByZXR1cm4gY29tbWFuZHM7XG4gIH0sXG4gICcuLyoqL21pZ3JhdGlvbi5zcWwnOiAoZmlsZXMpID0+IHtcbiAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmaWxlLCAndXRmLTgnKTtcbiAgICBpZiAoY29udGVudC5pbmNsdWRlcygnV2FybmluZ3M6JykpIHtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIFxcYCEhISBNaWdyYXRpb24gU1FMIGZpbGUgKFxcJHtwYXRoLnJlbGF0aXZlKCcnLCBmaWxlKX0pIGNvbnRhaW5zIHdhcm5pbmdzICEhISBTb2x2ZSB0aGUgd2FybmluZ3MgYW5kIGNvbW1pdCBhZ2Fpbi5cXGAsXG4gICAgICBdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gW107XG59LGApO1xuICBpZiAoY29uZmlnLmRvZXNDb250YWluc1B1YnNwZWNZYW1sKSB7XG4gICAgbGluZXMucHVzaChgXG4gICcuL3tsaWIsdGVzdCx0ZXN0X2RyaXZlcn0vKiovKi5kYXJ0JzogZmlsZXMgPT4ge1xuICAgIGNvbnN0IGZpbHRlcmVkRmlsZXMgPSBmaWxlcy5maWx0ZXIoZmlsZSA9PiAhZmlsZS5pbmNsdWRlcygnZ2VuZXJhdGVkJykpXG4gICAgICAuZmlsdGVyKGZpbGUgPT4gIWZpbGUuZW5kc1dpdGgoJy5mcmVlemVkLmRhcnQnKSAmJiAhZmlsZS5lbmRzV2l0aCgnLmcuZGFydCcpKTtcbiAgICBpZiAoZmlsdGVyZWRGaWxlcy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcbiAgICByZXR1cm4gW1xcYGZsdXR0ZXIgZm9ybWF0IFxcJHtmaWx0ZXJlZEZpbGVzLmpvaW4oJyAnKX1cXGBdO1xuICB9LGApO1xuICB9XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5zUG9ldHJ5TG9jaykge1xuICAgIGxpbmVzLnB1c2goYFxuICAnLi8qKi8qLnB5JzogW1xuICAgICdwb2V0cnkgcnVuIGlzb3J0IC0tcHJvZmlsZSBibGFjayAtLWZpbHRlci1maWxlcycsXG4gICAgJ3BvZXRyeSBydW4gYmxhY2snLFxuICAgICdwb2V0cnkgcnVuIGZsYWtlOCdcbiAgXSxgKTtcbiAgfVxuXG4gIGNvbnN0IG5ld0NvbnRlbnQgPSBgY29uc3QgZnMgPSByZXF1aXJlKCdmcycpO1xuY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcbiR7Y29uZmlnLmRvZXNDb250YWluc0phdmFTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHQgPyBcImNvbnN0IG1pY3JvbWF0Y2ggPSByZXF1aXJlKCdtaWNyb21hdGNoJyk7XFxuXCIgOiAnJ31cbm1vZHVsZS5leHBvcnRzID0geyR7bGluZXMuam9pbignJyl9XG59O1xuYDtcblxuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmxpbnRzdGFnZWRyYy5qcycpLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5saW50c3RhZ2VkcmMuanNvbicpLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbn1cblxuZnVuY3Rpb24gZ2V0RXNsaW50S2V5KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIGNvbnN0IGRpcnMgPSBnZXRTcmNEaXJzKGNvbmZpZyk7XG4gIHJldHVybiBgLi97JHtkaXJzLmpvaW4oJywnKX19LyoqLyoueyR7ZXh0ZW5zaW9ucy5lc2xpbnQuam9pbignLCcpfX1gO1xufVxuXG5mdW5jdGlvbiBnZXRFc2xpbnRGaWx0ZXJGb3JQcmV0dGllcihjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICByZXR1cm4gY29uZmlnLmRvZXNDb250YWluc0phdmFTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHRcbiAgICA/IGBcXG5cbiAgICBmaWx0ZXJlZEZpbGVzID0gZmlsdGVyZWRGaWxlcy5tYXAoKGZpbGUpID0+IHBhdGgucmVsYXRpdmUoJycsIGZpbGUpKTtcbiAgICBmaWx0ZXJlZEZpbGVzID0gbWljcm9tYXRjaC5ub3QoZmlsdGVyZWRGaWxlcywgJyR7Z2V0RXNsaW50S2V5KGNvbmZpZyl9Jyk7XG4gICAgZmlsdGVyZWRGaWxlcyA9IGZpbHRlcmVkRmlsZXMubWFwKChmaWxlKSA9PiBwYXRoLnJlc29sdmUoZmlsZSkpO2BcbiAgICA6ICcnO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVOZXh0Q29uZmlnSnNvbihjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZU5leHRDb25maWdKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gWydqcycsICdtanMnLCAnY2pzJ11cbiAgICAgIC5tYXAoKGV4dCkgPT4gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBgbmV4dC5jb25maWcuJHtleHR9YCkpXG4gICAgICAuZmluZCgocCkgPT4gZnMuZXhpc3RzU3luYyhwKSk7XG4gICAgaWYgKCFmaWxlUGF0aCkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgIC8vIFJlcGxhY2UgdGhlIEpTT04gb2JqZWN0IGZyb20gdGhlIGZpbGVcbiAgICBjb25zdCBuZXdDb250ZW50ID0gb2xkQ29udGVudC5yZXBsYWNlKC89XFxzKnsoW1xcU1xcc10qKX07LywgKF8sIHNldHRpbmdzVGV4dCkgPT4ge1xuICAgICAgaWYgKCFzZXR0aW5nc1RleHQuaW5jbHVkZXMoJ2VzbGludDonKSkge1xuICAgICAgICBzZXR0aW5nc1RleHQgKz0gJ2VzbGludDogeyBpZ25vcmVEdXJpbmdCdWlsZHM6IHRydWUgfSwnO1xuICAgICAgfVxuICAgICAgaWYgKCFzZXR0aW5nc1RleHQuaW5jbHVkZXMoJ3R5cGVzY3JpcHQ6JykpIHtcbiAgICAgICAgc2V0dGluZ3NUZXh0ICs9ICd0eXBlc2NyaXB0OiB7IGlnbm9yZUJ1aWxkRXJyb3JzOiB0cnVlIH0sJztcbiAgICAgIH1cbiAgICAgIHJldHVybiBgPSB7JHtzZXR0aW5nc1RleHR9fTtgO1xuICAgIH0pO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGNvbW1vbkNvbnRlbnQgPSBgXG4zcmQtcGFydHkvXG5hbmRyb2lkL1xuaW9zL1xubm8tZm9ybWF0L1xudGVzdC1maXh0dXJlcy9cbiouZC50c1xuKi5taW4uanNcbi55YXJuL1xuLnBucC5qc1xuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUHJldHRpZXJpZ25vcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVQcmV0dGllcmlnbm9yZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5wcmV0dGllcmlnbm9yZScpO1xuICAgIGNvbnN0IGNvbnRlbnQgPSAoYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihmaWxlUGF0aCkpID8/ICcnO1xuICAgIGNvbnN0IGhlYWRVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldEhlYWRVc2VyQ29udGVudChjb250ZW50KTtcbiAgICBjb25zdCB0YWlsVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRUYWlsVXNlckNvbnRlbnQoY29udGVudCk7XG5cbiAgICBjb25zdCBnaXRpZ25vcmVGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRpZ25vcmUnKTtcbiAgICBjb25zdCBnaXRpZ25vcmVDb250ZW50ID0gKGF3YWl0IGlnbm9yZUZpbGVVdGlsLnJlYWRHaXRpZ25vcmVXaXRob3V0U2VwYXJhdG9ycyhnaXRpZ25vcmVGaWxlUGF0aCkpIHx8ICcnO1xuXG4gICAgbGV0IGFkZGl0aW9uYWxDb250ZW50ID0gJyc7XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNQdWJzcGVjWWFtbCkge1xuICAgICAgYWRkaXRpb25hbENvbnRlbnQgPSBgXG5hbmRyb2lkL2FwcC9cbmlvcy9SdW5uZXIvQXNzZXRzLnhjYXNzZXRzL1xucHVic3BlYy55YW1sXG5gO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBoZWFkVXNlckNvbnRlbnQgKyBjb21tb25Db250ZW50ICsgYWRkaXRpb25hbENvbnRlbnQgKyBnaXRpZ25vcmVDb250ZW50ICsgdGFpbFVzZXJDb250ZW50O1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgY2xvbmVEZWVwIGZyb20gJ2xvZGFzaC5jbG9uZWRlZXAnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgb3ZlcndyaXRlTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGpzb25PYmogPSB7XG4gIHZlbnZQYXRoOiAnLicsXG4gIHZlbnY6ICcudmVudicsXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbihjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVB5cmlnaHRDb25maWdKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGxldCBuZXdTZXR0aW5nczogdW5rbm93biA9IGNsb25lRGVlcChqc29uT2JqKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3B5cmlnaHRjb25maWcuanNvbicpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBvbGRTZXR0aW5ncyA9IEpTT04ucGFyc2Uob2xkQ29udGVudCk7XG4gICAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShuZXdTZXR0aW5ncyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IHNlbWFudGljUmVsZWFzZUJhZGdlID1cbiAgJ1shW3NlbWFudGljLXJlbGVhc2VdKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vYmFkZ2UvJTIwJTIwJUYwJTlGJTkzJUE2JUYwJTlGJTlBJTgwLXNlbWFudGljLS1yZWxlYXNlLWUxMDA3OS5zdmcpXShodHRwczovL2dpdGh1Yi5jb20vc2VtYW50aWMtcmVsZWFzZS9zZW1hbnRpYy1yZWxlYXNlKSc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVJlYWRtZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVJlYWRtZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ1JFQURNRS5tZCcpO1xuICAgIGxldCBuZXdDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG5cbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcucmVsZWFzZXJjLmpzb24nKSkpIHtcbiAgICAgIG5ld0NvbnRlbnQgPSBpbnNlcnRCYWRnZShuZXdDb250ZW50LCBzZW1hbnRpY1JlbGVhc2VCYWRnZSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVwb3NpdG9yeSA9IGNvbmZpZy5yZXBvc2l0b3J5Py5zbGljZShjb25maWcucmVwb3NpdG9yeT8uaW5kZXhPZignOicpICsgMSk7XG4gICAgY29uc3QgZmlsZU5hbWVzID0gZnMucmVhZGRpclN5bmMoYCR7Y29uZmlnLmRpclBhdGh9Ly5naXRodWIvd29ya2Zsb3dzYCk7XG4gICAgZm9yIChjb25zdCBmaWxlTmFtZSBvZiBmaWxlTmFtZXMpIHtcbiAgICAgIGlmICghZmlsZU5hbWUuc3RhcnRzV2l0aCgndGVzdCcpICYmICFmaWxlTmFtZS5zdGFydHNXaXRoKCdkZXBsb3knKSkgY29udGludWU7XG5cbiAgICAgIGxldCBiYWRnZU5hbWUgPSBmaWxlTmFtZTtcbiAgICAgIGJhZGdlTmFtZSA9IGJhZGdlTmFtZVswXS50b1VwcGVyQ2FzZSgpICsgYmFkZ2VOYW1lLnNsaWNlKDEsIGJhZGdlTmFtZS5pbmRleE9mKCcuJykpO1xuICAgICAgYmFkZ2VOYW1lID0gYmFkZ2VOYW1lLnJlcGxhY2UoJy0nLCAnICcpO1xuICAgICAgY29uc3QgYmFkZ2UgPSBgWyFbJHtiYWRnZU5hbWV9XShodHRwczovL2dpdGh1Yi5jb20vJHtyZXBvc2l0b3J5fS9hY3Rpb25zL3dvcmtmbG93cy8ke2ZpbGVOYW1lfS9iYWRnZS5zdmcpXShodHRwczovL2dpdGh1Yi5jb20vJHtyZXBvc2l0b3J5fS9hY3Rpb25zL3dvcmtmbG93cy8ke2ZpbGVOYW1lfSlgO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBgLmdpdGh1Yi93b3JrZmxvd3MvJHtmaWxlTmFtZX1gKSkpIHtcbiAgICAgICAgbmV3Q29udGVudCA9IGluc2VydEJhZGdlKG5ld0NvbnRlbnQsIGJhZGdlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluc2VydEJhZGdlKHJlYWRtZTogc3RyaW5nLCBiYWRnZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8g5pei44GrYmFkZ2XjgYzjgYLjgovloLTlkIjjga/liYrpmaRcbiAgcmVhZG1lID0gcmVhZG1lLnJlcGxhY2UoYmFkZ2UsICcnKS5yZXBsYWNlQWxsKC9cXG5cXG5cXG4rL2csICdcXG5cXG4nKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHJlYWRtZS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChyZWFkbWVbaSAtIDFdID09PSAnXFxuJyAmJiByZWFkbWVbaV0gPT09ICdcXG4nKSB7XG4gICAgICBjb25zdCBiZWZvcmUgPSByZWFkbWUuc2xpY2UoMCwgaSArIDEpO1xuICAgICAgbGV0IGFmdGVyID0gcmVhZG1lLnNsaWNlKGkgKyAxKTtcbiAgICAgIGlmICghYWZ0ZXIuc3RhcnRzV2l0aCgnWycpICYmICFhZnRlci5zdGFydHNXaXRoKCchJykpIHtcbiAgICAgICAgYWZ0ZXIgPSBgXFxuJHthZnRlcn1gO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGAke2JlZm9yZX0ke2JhZGdlfVxcbiR7YWZ0ZXJ9YDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGAke3JlYWRtZX1cXG4ke2JhZGdlfVxcbmA7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZWxlYXNlcmMocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUmVsZWFzZXJjJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5yZWxlYXNlcmMuanNvbicpO1xuICAgIGNvbnN0IHNldHRpbmdzID0gSlNPTi5wYXJzZShhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKSk7XG4gICAgY29uc3QgcGx1Z2lucyA9IHNldHRpbmdzPy5wbHVnaW5zIHx8IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGx1Z2lucy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgcGx1Z2luID0gQXJyYXkuaXNBcnJheShwbHVnaW5zW2ldKSA/IHBsdWdpbnNbaV1bMF0gOiBwbHVnaW5zW2ldO1xuICAgICAgY29uc3Qgb2xkQ29uZmlnID0gKEFycmF5LmlzQXJyYXkocGx1Z2luc1tpXSkgJiYgcGx1Z2luc1tpXVsxXSkgfHwge307XG4gICAgICBpZiAocGx1Z2luID09PSAnQHNlbWFudGljLXJlbGVhc2UvY29tbWl0LWFuYWx5emVyJykge1xuICAgICAgICBwbHVnaW5zW2ldID0gW1xuICAgICAgICAgICdAc2VtYW50aWMtcmVsZWFzZS9jb21taXQtYW5hbHl6ZXInLFxuICAgICAgICAgIG1lcmdlLmFsbChcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgb2xkQ29uZmlnLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcHJlc2V0OiAnY29udmVudGlvbmFsY29tbWl0cycsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgeyBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSB9XG4gICAgICAgICAgKSxcbiAgICAgICAgXTtcbiAgICAgIH0gZWxzZSBpZiAocGx1Z2luID09PSAnQHNlbWFudGljLXJlbGVhc2UvZ2l0aHViJykge1xuICAgICAgICBwbHVnaW5zW2ldID0gW1xuICAgICAgICAgICdAc2VtYW50aWMtcmVsZWFzZS9naXRodWInLFxuICAgICAgICAgIG1lcmdlLmFsbChcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgb2xkQ29uZmlnLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLy8gY2YuIGh0dHBzOi8vZ2l0aHViLmNvbS9zZW1hbnRpYy1yZWxlYXNlL3NlbWFudGljLXJlbGVhc2UvaXNzdWVzLzIyMDQjaXNzdWVjb21tZW50LTE1MDg0MTc3MDRcbiAgICAgICAgICAgICAgICBzdWNjZXNzQ29tbWVudDogZmFsc2UsXG4gICAgICAgICAgICAgICAgZmFpbENvbW1lbnQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGxhYmVsczogWydyOiBzZW1hbnRpYy1yZWxlYXNlJ10sXG4gICAgICAgICAgICAgICAgcmVsZWFzZWRMYWJlbHM6IFsncmVsZWFzZWQgOmJvb2ttYXJrOiddLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfVxuICAgICAgICAgICksXG4gICAgICAgIF07XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShzZXR0aW5ncyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCBjbG9uZURlZXAgZnJvbSAnbG9kYXNoLmNsb25lZGVlcCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QganNvbk9iaiA9IHtcbiAgJHNjaGVtYTogJ2h0dHBzOi8vZG9jcy5yZW5vdmF0ZWJvdC5jb20vcmVub3ZhdGUtc2NoZW1hLmpzb24nLFxuICBleHRlbmRzOiBbJ2dpdGh1Yj5XaWxsQm9vc3Rlci93aWxsYm9vc3Rlci1jb25maWdzOnJlbm92YXRlLmpzb241J10sXG59O1xuXG50eXBlIFNldHRpbmdzID0gdHlwZW9mIGpzb25PYmogJiB7IHBhY2thZ2VSdWxlczogeyBwYWNrYWdlTmFtZXM6IHN0cmluZ1tdOyBlbmFibGVkPzogYm9vbGVhbiB9W10gfTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUmVub3ZhdGVKc29uKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUmVub3ZhdGVKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGxldCBuZXdTZXR0aW5ncyA9IGNsb25lRGVlcChqc29uT2JqKSBhcyBTZXR0aW5ncztcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3Jlbm92YXRlLmpzb24nKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhgJHtmaWxlUGF0aH01YCkpIHtcbiAgICAgIC8vIFNpbmNlIGl0IGlzIGRpZmZpY3VsdCBmb3IgcGFyc2luZyByZW5vdmF0ZS5qc29uNSwgd2UgZG8gbm90aGluZ1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3Qgb2xkU2V0dGluZ3MgPSBKU09OLnBhcnNlKG9sZENvbnRlbnQpO1xuICAgICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7XG4gICAgICAgIGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlLFxuICAgICAgfSkgYXMgU2V0dGluZ3M7XG4gICAgICBuZXdTZXR0aW5ncy5leHRlbmRzID0gbmV3U2V0dGluZ3MuZXh0ZW5kcy5maWx0ZXIoKGl0ZW06IHN0cmluZykgPT4gaXRlbSAhPT0gJ0B3aWxsYm9vc3RlcicpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cblxuICAgIC8vIERvbid0IHVwZ3JhZGUgTmV4dC5qcyBhdXRvbWF0aWNhbGx5XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHopIHtcbiAgICAgIG5ld1NldHRpbmdzLnBhY2thZ2VSdWxlcyA/Pz0gW107XG4gICAgICBpZiAoIW5ld1NldHRpbmdzLnBhY2thZ2VSdWxlcy5zb21lKChydWxlOiB7IHBhY2thZ2VOYW1lczogc3RyaW5nW10gfSkgPT4gcnVsZS5wYWNrYWdlTmFtZXMuaW5jbHVkZXMoJ25leHQnKSkpIHtcbiAgICAgICAgbmV3U2V0dGluZ3MucGFja2FnZVJ1bGVzLnB1c2goeyBwYWNrYWdlTmFtZXM6IFsnbmV4dCddLCBlbmFibGVkOiBmYWxzZSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmRlcGVuZGFib3QnKSwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5yZW5vdmF0ZXJjLmpzb24nKSwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KG5ld1NldHRpbmdzKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBtb3ZlVG9Cb3R0b208VE9iaiBleHRlbmRzIFJlY29yZDxUS2V5LCB1bmtub3duPiwgVEtleSBleHRlbmRzIHN0cmluZyB8IG51bWJlciB8IHN5bWJvbD4oXG4gIG9iajogVE9iaixcbiAga2V5OiBUS2V5XG4pOiBUT2JqIHtcbiAgY29uc3QgdmFsdWUgPSBvYmpba2V5XTtcbiAgZGVsZXRlIG9ialtrZXldO1xuICAob2JqIGFzIFJlY29yZDxUS2V5LCB1bmtub3duPilba2V5XSA9IHZhbHVlO1xuICByZXR1cm4gb2JqO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc29ydEtleXM8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PihvYmo6IFQpOiBUIHtcbiAgY29uc3Qga2V5QW5kVmFsdWVzID0gT2JqZWN0LmVudHJpZXMob2JqKS5zb3J0KChba2V5MV0sIFtrZXkyXSkgPT4ga2V5MS5sb2NhbGVDb21wYXJlKGtleTIpKTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2Yga2V5QW5kVmFsdWVzKSB7XG4gICAgZGVsZXRlIG9ialtrZXldO1xuICAgIChvYmogYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0gPSB2YWx1ZTtcblxuICAgIC8vIGlmIHZhbHVlIGlzIGFuIG9iamVjdCwgc29ydCB0aGUga2V5cyBvZiB0aGUgb2JqZWN0XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgIHNvcnRLZXlzKHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG9iajtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IGNsb25lRGVlcCBmcm9tICdsb2Rhc2guY2xvbmVkZWVwJztcbmltcG9ydCB0eXBlIHsgVHNDb25maWdKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGNvbWJpbmVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBzb3J0S2V5cyB9IGZyb20gJy4uL3V0aWxzL29iamVjdFV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IHJvb3RKc29uT2JqID0ge1xuICBjb21waWxlck9wdGlvbnM6IHtcbiAgICB0YXJnZXQ6ICdFUzIwMjInLCAvLyBiZWNhdXNlIGRlY29yYXRvcnMgc2hvdWxkIGJlIHRyYW5zcGlsZWQgdG8gRVMyMDIyIG9uIE5vZGUuanNcbiAgICBtb2R1bGU6ICdFU05leHQnLFxuICAgIG1vZHVsZVJlc29sdXRpb246ICdOb2RlJyxcbiAgICBqc3g6ICdyZWFjdC1qc3gnLFxuICAgIGFsd2F5c1N0cmljdDogdHJ1ZSxcbiAgICBzdHJpY3Q6IHRydWUsXG4gICAgc2tpcExpYkNoZWNrOiB0cnVlLCAvLyBiZWNhdXNlIGxpYnJhcmllcyBtYXkgaGF2ZSBicm9rZW4gdHlwZXNcbiAgICBhbGxvd1N5bnRoZXRpY0RlZmF1bHRJbXBvcnRzOiB0cnVlLCAvLyBhbGxvdyBgaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J2BcbiAgICBlc01vZHVsZUludGVyb3A6IHRydWUsIC8vIGFsbG93IGRlZmF1bHQgaW1wb3J0IGZyb20gQ29tbW9uSlMvQU1EL1VNRCBtb2R1bGVzXG4gICAgcmVzb2x2ZUpzb25Nb2R1bGU6IHRydWUsIC8vIGFsbG93IHRvIGltcG9ydCBKU09OIGZpbGVzXG4gICAgZGVjbGFyYXRpb246IHRydWUsXG4gICAgc291cmNlTWFwOiB0cnVlLFxuICAgIGltcG9ydEhlbHBlcnM6IGZhbHNlLFxuICAgIG91dERpcjogJ2Rpc3QnLFxuICAgIHR5cGVSb290czogWycuL25vZGVfbW9kdWxlcy9AdHlwZXMnLCAnLi9AdHlwZXMnXSxcbiAgfSxcbiAgaW5jbHVkZTogW1xuICAgICdzcmMvKiovKicsXG4gICAgJ3Rlc3RzLyoqLyonLFxuICAgICdzY3JpcHRzLyoqLyonLFxuICAgICdwYWNrYWdlcy8qL3NyYy8qKi8qJyxcbiAgICAncGFja2FnZXMvKi90ZXN0cy8qKi8qJyxcbiAgICAncGFja2FnZXMvKi9zY3JpcHRzLyoqLyonLFxuICBdLFxufTtcblxuY29uc3Qgc3ViSnNvbk9iaiA9IHtcbiAgY29tcGlsZXJPcHRpb25zOiB7XG4gICAgdGFyZ2V0OiAnRVMyMDIyJywgLy8gYmVjYXVzZSBkZWNvcmF0b3JzIHNob3VsZCBiZSB0cmFuc3BpbGVkIHRvIEVTMjAyMiBvbiBOb2RlLmpzXG4gICAgbW9kdWxlOiAnRVNOZXh0JyxcbiAgICBtb2R1bGVSZXNvbHV0aW9uOiAnTm9kZScsXG4gICAganN4OiAncmVhY3QtanN4JyxcbiAgICBhbHdheXNTdHJpY3Q6IHRydWUsXG4gICAgc3RyaWN0OiB0cnVlLFxuICAgIHNraXBMaWJDaGVjazogdHJ1ZSwgLy8gYmVjYXVzZSBsaWJyYXJpZXMgbWF5IGhhdmUgYnJva2VuIHR5cGVzXG4gICAgYWxsb3dTeW50aGV0aWNEZWZhdWx0SW1wb3J0czogdHJ1ZSwgLy8gYWxsb3cgYGltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdgXG4gICAgZXNNb2R1bGVJbnRlcm9wOiB0cnVlLCAvLyBhbGxvdyBkZWZhdWx0IGltcG9ydCBmcm9tIENvbW1vbkpTL0FNRC9VTUQgbW9kdWxlc1xuICAgIHJlc29sdmVKc29uTW9kdWxlOiB0cnVlLCAvLyBhbGxvdyB0byBpbXBvcnQgSlNPTiBmaWxlc1xuICAgIGRlY2xhcmF0aW9uOiB0cnVlLFxuICAgIHNvdXJjZU1hcDogdHJ1ZSxcbiAgICBpbXBvcnRIZWxwZXJzOiBmYWxzZSxcbiAgICBvdXREaXI6ICdkaXN0JyxcbiAgICB0eXBlUm9vdHM6IFsnLi4vLi4vbm9kZV9tb2R1bGVzL0B0eXBlcycsICcuLi8uLi9AdHlwZXMnLCAnLi9AdHlwZXMnXSxcbiAgfSxcbiAgaW5jbHVkZTogWydzcmMvKiovKicsICd0ZXN0cy8qKi8qJywgJ3NjcmlwdHMvKiovKiddLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlVHNjb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVUc2NvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eiB8fCBjb25maWcuZGVwZW5kaW5nLm5leHQpIHJldHVybjtcblxuICAgIGxldCBuZXdTZXR0aW5ncyA9IGNsb25lRGVlcChjb25maWcuaXNSb290ID8gcm9vdEpzb25PYmogOiBzdWJKc29uT2JqKSBhcyBUc0NvbmZpZ0pzb247XG4gICAgaWYgKCFjb25maWcuZG9lc0NvbnRhaW5zSnN4T3JUc3ggJiYgIWNvbmZpZy5kb2VzQ29udGFpbnNKc3hPclRzeEluUGFja2FnZXMpIHtcbiAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmpzeDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5pc1Jvb3QgJiYgIWNvbmZpZy5kb2VzQ29udGFpbnNTdWJQYWNrYWdlSnNvbnMpIHtcbiAgICAgIG5ld1NldHRpbmdzLmluY2x1ZGUgPSBuZXdTZXR0aW5ncy5pbmNsdWRlPy5maWx0ZXIoKGRpclBhdGg6IHN0cmluZykgPT4gIWRpclBhdGguc3RhcnRzV2l0aCgncGFja2FnZXMvKi8nKSk7XG4gICAgfVxuICAgIGlmIChjb25maWcuaXNFc21QYWNrYWdlKSB7XG4gICAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMgPSB7XG4gICAgICAgIC4uLm5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyxcbiAgICAgICAgbW9kdWxlOiAnTm9kZU5leHQnLFxuICAgICAgICBtb2R1bGVSZXNvbHV0aW9uOiAnTm9kZU5leHQnLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3RzY29uZmlnLmpzb24nKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBvbGRTZXR0aW5ncyA9IEpTT04ucGFyc2UoZXhpc3RpbmdDb250ZW50KSBhcyBUc0NvbmZpZ0pzb247XG4gICAgICBpZiAob2xkU2V0dGluZ3MuZXh0ZW5kcyA9PT0gJy4vbm9kZV9tb2R1bGVzL0B3aWxsYm9vc3Rlci90c2NvbmZpZy90c2NvbmZpZy5qc29uJykge1xuICAgICAgICBkZWxldGUgb2xkU2V0dGluZ3MuZXh0ZW5kcztcbiAgICAgIH1cbiAgICAgIC8vIERvbid0IG1vZGlmeSBcInRhcmdldFwiLCBcIm1vZHVsZVwiIGFuZCBcIm1vZHVsZVJlc29sdXRpb25cIi5cbiAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LnRhcmdldDtcbiAgICAgIGlmICghY29uZmlnLmlzRXNtUGFja2FnZSkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5tb2R1bGU7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/Lm1vZHVsZVJlc29sdXRpb247XG4gICAgICB9XG4gICAgICBpZiAob2xkU2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5qc3gpIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8uanN4O1xuICAgICAgfVxuICAgICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7IGFycmF5TWVyZ2U6IGNvbWJpbmVNZXJnZSB9KTtcbiAgICAgIG5ld1NldHRpbmdzLmluY2x1ZGUgPSBuZXdTZXR0aW5ncy5pbmNsdWRlPy5maWx0ZXIoXG4gICAgICAgIChkaXJQYXRoOiBzdHJpbmcpID0+ICFkaXJQYXRoLmluY2x1ZGVzKCdAdHlwZXMnKSAmJiAhZGlyUGF0aC5pbmNsdWRlcygnX190ZXN0c19fJylcbiAgICAgICk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICAgIHNvcnRLZXlzKG5ld1NldHRpbmdzKTtcbiAgICBuZXdTZXR0aW5ncy5pbmNsdWRlPy5zb3J0KCk7XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KG5ld1NldHRpbmdzKTtcbiAgICAvLyBEb24ndCB1c2Ugb2xkIGRlY29yYXRvclxuICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmV4cGVyaW1lbnRhbERlY29yYXRvcnM7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHNvcnRLZXlzIH0gZnJvbSAnLi4vdXRpbHMvb2JqZWN0VXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgZXhjbHVkZUZpbGVQYXR0ZXJucyA9IFtcbiAgJyoqLy5naXQvb2JqZWN0cy8qKicsXG4gICcqKi8uZ2l0L3N1YnRyZWUtY2FjaGUvKionLFxuICAnKiovbm9kZV9tb2R1bGVzLyoqJyxcbiAgJyoqL3RtcC8qKicsXG4gICcqKi90ZW1wLyoqJyxcbiAgJyoqL2Rpc3QvKionLFxuXTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlVnNjb2RlU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncycsIGFzeW5jICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcudnNjb2RlJywgJ3NldHRpbmdzLmpzb24nKTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgbGV0IHNldHRpbmdzID0gSlNPTi5wYXJzZShleGlzdGluZ0NvbnRlbnQpO1xuICAgICAgZm9yIChjb25zdCBleGNsdWRlRmlsZVBhdHRlcm4gb2YgZXhjbHVkZUZpbGVQYXR0ZXJucykge1xuICAgICAgICBzZXR0aW5ncyA9IG1lcmdlLmFsbChbc2V0dGluZ3MsIGV4Y2x1ZGVTZXR0aW5nKGV4Y2x1ZGVGaWxlUGF0dGVybildKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zUG9ldHJ5TG9jaykge1xuICAgICAgICBzZXR0aW5ncyA9IG1lcmdlLmFsbChbc2V0dGluZ3MsIGV4Y2x1ZGVTZXR0aW5nKCcqKi8udmVudi8qKicpXSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgICAgIHNldHRpbmdzID0gbWVyZ2UuYWxsKFtzZXR0aW5ncywgZXhjbHVkZVNldHRpbmcoJyoqLy5uZXh0LyoqJyldKTtcbiAgICAgIH1cbiAgICAgIHNvcnRLZXlzKHNldHRpbmdzID8/IHt9KTtcbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShzZXR0aW5ncywgdW5kZWZpbmVkLCAyKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZXhjbHVkZVNldHRpbmcoZXhjbHVkZUZpbGVQYXR0ZXJuOiBzdHJpbmcpOiB1bmtub3duIHtcbiAgcmV0dXJuIHtcbiAgICAnZmlsZXMud2F0Y2hlckV4Y2x1ZGUnOiB7XG4gICAgICBbZXhjbHVkZUZpbGVQYXR0ZXJuXTogdHJ1ZSxcbiAgICB9LFxuICB9O1xufVxuIiwiLyogZXNsaW50LWRpc2FibGUgdW5pY29ybi9uby1udWxsICovXG5cbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IHlhbWwgZnJvbSAnanMteWFtbCc7XG5pbXBvcnQgY2xvbmVEZWVwIGZyb20gJ2xvZGFzaC5jbG9uZWRlZXAnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBjb21iaW5lTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgbW92ZVRvQm90dG9tLCBzb3J0S2V5cyB9IGZyb20gJy4uL3V0aWxzL29iamVjdFV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmludGVyZmFjZSBXb3JrZmxvdyB7XG4gIG5hbWU6IHN0cmluZztcbiAgb246IE9uO1xuICBjb25jdXJyZW5jeT86IENvbmN1cnJlbmN5O1xuICBqb2JzOiB7IFtrZXk6IHN0cmluZ106IEpvYiB9O1xufVxuXG5pbnRlcmZhY2UgQ29uY3VycmVuY3kge1xuICBncm91cDogc3RyaW5nO1xuICAnY2FuY2VsLWluLXByb2dyZXNzJzogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIE9uIHtcbiAgaXNzdWVzPzogVHlwZXM7XG4gIHB1bGxfcmVxdWVzdD86IFB1bGxSZXF1ZXN0O1xuICBwdWxsX3JlcXVlc3RfdGFyZ2V0PzogVHlwZXM7XG4gIHB1c2g/OiBQdXNoO1xuICBzY2hlZHVsZT86IFNjaGVkdWxlW107XG4gIHdvcmtmbG93X2Rpc3BhdGNoPzogbnVsbDtcbn1cblxuaW50ZXJmYWNlIFB1bGxSZXF1ZXN0IHtcbiAgJ3BhdGhzLWlnbm9yZSc/OiBzdHJpbmdbXTtcbiAgdHlwZXM/OiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIFB1c2gge1xuICBicmFuY2hlczogc3RyaW5nW107XG4gICdwYXRocy1pZ25vcmUnPzogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBTY2hlZHVsZSB7XG4gIGNyb246IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFR5cGVzIHtcbiAgdHlwZXM6IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgSm9iIHtcbiAgdXNlczogc3RyaW5nO1xuICBzZWNyZXRzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHdpdGg/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuY29uc3Qgd29ya2Zsb3dzID0ge1xuICB0ZXN0OiB7XG4gICAgbmFtZTogJ1Rlc3QnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3Q6IHtcbiAgICAgICAgJ3BhdGhzLWlnbm9yZSc6IFsnKioubWQnLCAnKiovZG9jcy8qKiddLFxuICAgICAgfSxcbiAgICAgIHB1c2g6IHtcbiAgICAgICAgYnJhbmNoZXM6IFsnbWFpbicsICd3YmZ5J10sXG4gICAgICAgICdwYXRocy1pZ25vcmUnOiBbJyoqLm1kJywgJyoqL2RvY3MvKionXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICAvLyBjZi4gaHR0cHM6Ly9kb2NzLmdpdGh1Yi5jb20vZW4vYWN0aW9ucy91c2luZy1qb2JzL3VzaW5nLWNvbmN1cnJlbmN5I2V4YW1wbGUtb25seS1jYW5jZWwtaW4tcHJvZ3Jlc3Mtam9icy1vci1ydW5zLWZvci10aGUtY3VycmVudC13b3JrZmxvd1xuICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0tJHt7IGdpdGh1Yi5yZWYgfX0nLFxuICAgICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IHRydWUsXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICB0ZXN0OiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvdGVzdC55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIHJlbGVhc2U6IHtcbiAgICBuYW1lOiAnUmVsZWFzZScsXG4gICAgb246IHtcbiAgICAgIHB1c2g6IHtcbiAgICAgICAgYnJhbmNoZXM6IFtdLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0nLFxuICAgICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IGZhbHNlLFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgcmVsZWFzZToge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3JlbGVhc2UueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICB3YmZ5OiB7XG4gICAgbmFtZTogJ1dpbGxib29zdGVyaWZ5JyxcbiAgICBvbjoge1xuICAgICAgd29ya2Zsb3dfZGlzcGF0Y2g6IG51bGwsXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICB3YmZ5OiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3Mvd2JmeS55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gICd3YmZ5LW1lcmdlJzoge1xuICAgIG5hbWU6ICdNZXJnZSB3YmZ5JyxcbiAgICBvbjoge1xuICAgICAgd29ya2Zsb3dfZGlzcGF0Y2g6IG51bGwsXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnd2JmeS1tZXJnZSc6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy93YmZ5LW1lcmdlLnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ3NlbWFudGljLXByJzoge1xuICAgIG5hbWU6ICdMaW50IFBSIHRpdGxlJyxcbiAgICBvbjoge1xuICAgICAgcHVsbF9yZXF1ZXN0X3RhcmdldDoge1xuICAgICAgICB0eXBlczogWydvcGVuZWQnLCAnZWRpdGVkJywgJ3N5bmNocm9uaXplJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ3NlbWFudGljLXByJzoge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3NlbWFudGljLXByLnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgc3luYzoge1xuICAgIG5hbWU6ICdTeW5jJyxcbiAgICBvbjoge30sXG4gICAgam9iczoge1xuICAgICAgc3luYzogeyB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3N5bmMueW1sQG1haW4nIH0sXG4gICAgfSxcbiAgfSxcbiAgJ25vdGlmeS1yZWFkeSc6IHtcbiAgICBuYW1lOiAnTm90aWZ5IHJlYWR5JyxcbiAgICBvbjoge1xuICAgICAgaXNzdWVzOiB7XG4gICAgICAgIHR5cGVzOiBbJ2xhYmVsZWQnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnbm90aWZ5LXJlYWR5Jzoge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL25vdGlmeS1yZWFkeS55bWxAbWFpbicsXG4gICAgICAgIHNlY3JldHM6IHtcbiAgICAgICAgICBESVNDT1JEX1dFQkhPT0tfVVJMOiAnJHt7IHNlY3JldHMuRElTQ09SRF9XRUJIT09LX1VSTF9GT1JfUkVBRFkgfX0nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAnY2xvc2UtY29tbWVudCc6IHtcbiAgICBuYW1lOiAnQWRkIGNsb3NlIGNvbW1lbnQnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3Q6IHtcbiAgICAgICAgdHlwZXM6IFsnb3BlbmVkJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ2Nsb3NlLWNvbW1lbnQnOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvY2xvc2UtY29tbWVudC55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gICdhZGQtaXNzdWUtdG8tcHJvamVjdCc6IHtcbiAgICBuYW1lOiAnQWRkIGlzc3VlIHRvIEdpdEh1YiBwcm9qZWN0JyxcbiAgICBvbjoge1xuICAgICAgaXNzdWVzOiB7XG4gICAgICAgIHR5cGVzOiBbJ2xhYmVsZWQnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnYWRkLWlzc3VlLXRvLXByb2plY3QnOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvYWRkLWlzc3VlLXRvLXByb2plY3QueW1sQG1haW4nLFxuICAgICAgICBzZWNyZXRzOiB7XG4gICAgICAgICAgR0hfUFJPSkVDVF9VUkw6ICcke3sgc2VjcmV0cy5HSF9QUk9KRUNUX1VSTCB9fScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gICdhZGQtcmVhZHktaXNzdWUtdG8tcHJvamVjdCc6IHtcbiAgICBuYW1lOiAnQWRkIHJlYWR5IGlzc3VlIHRvIEdpdEh1YiBwcm9qZWN0JyxcbiAgICBvbjoge1xuICAgICAgaXNzdWVzOiB7XG4gICAgICAgIHR5cGVzOiBbJ2xhYmVsZWQnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnYWRkLXJlYWR5LWlzc3VlLXRvLXByb2plY3QnOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvYWRkLWlzc3VlLXRvLXByb2plY3QueW1sQG1haW4nLFxuICAgICAgICB3aXRoOiB7XG4gICAgICAgICAgbGFiZWxlZDogJ3JlYWR5IDpyb2NrZXQ6JyxcbiAgICAgICAgfSxcbiAgICAgICAgc2VjcmV0czoge1xuICAgICAgICAgIEdIX1BST0pFQ1RfVVJMOiAnaHR0cHM6Ly9naXRodWIuY29tL29yZ3MvV2lsbEJvb3N0ZXJMYWIvcHJvamVjdHMvNScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG59IGFzIGNvbnN0O1xuXG50eXBlIEtub3duS2luZCA9IGtleW9mIHR5cGVvZiB3b3JrZmxvd3MgfCAnZGVwbG95JztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlV29ya2Zsb3dzKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVdvcmtmbG93JywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHdvcmtmbG93c1BhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicsICd3b3JrZmxvd3MnKTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2Rpcih3b3JrZmxvd3NQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIC8vIFJlbW92ZSBjb25maWcgb2Ygc2VtYW50aWMgcHVsbCByZXF1ZXN0XG4gICAgY29uc3Qgc2VtYW50aWNZbWxQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5naXRodWInLCAnc2VtYW50aWMueW1sJyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHNlbWFudGljWW1sUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pKTtcblxuICAgIGNvbnN0IGVudHJpZXMgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKHdvcmtmbG93c1BhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICBjb25zdCBmaWxlTmFtZVNldCA9IG5ldyBTZXQoW1xuICAgICAgJ3Rlc3QueW1sJyxcbiAgICAgICd3YmZ5LnltbCcsXG4gICAgICAnd2JmeS1tZXJnZS55bWwnLFxuICAgICAgJ3NlbWFudGljLXByLnltbCcsXG4gICAgICAnY2xvc2UtY29tbWVudC55bWwnLFxuICAgICAgJ2FkZC1pc3N1ZS10by1wcm9qZWN0LnltbCcsXG4gICAgICAuLi5lbnRyaWVzLmZpbHRlcigoZGlyZW50KSA9PiBkaXJlbnQuaXNGaWxlKCkgJiYgZGlyZW50Lm5hbWUuZW5kc1dpdGgoJy55bWwnKSkubWFwKChkaXJlbnQpID0+IGRpcmVudC5uYW1lKSxcbiAgICBdKTtcbiAgICBpZiAocm9vdENvbmZpZy5kZXBlbmRpbmcuc2VtYW50aWNSZWxlYXNlKSB7XG4gICAgICBmaWxlTmFtZVNldC5hZGQoJ3JlbGVhc2UueW1sJyk7XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmlzUHVibGljUmVwbyB8fCByb290Q29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKSkge1xuICAgICAgZmlsZU5hbWVTZXQuYWRkKCdhZGQtcmVhZHktaXNzdWUtdG8tcHJvamVjdC55bWwnKTtcbiAgICAgIGZpbGVOYW1lU2V0LmFkZCgnbm90aWZ5LXJlYWR5LnltbCcpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgZmlsZU5hbWUgb2YgZmlsZU5hbWVTZXQpIHtcbiAgICAgIC8vIOWun+mam+OBr0tub3duS2luZOS7peWkluOBruWApOOCguS7o+WFpeOBleOCjOOCi+OBk+OBqOOBq+azqOaEj1xuICAgICAgY29uc3Qga2luZCA9IHBhdGguYmFzZW5hbWUoZmlsZU5hbWUsICcueW1sJykgYXMgS25vd25LaW5kO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IHdyaXRlV29ya2Zsb3dZYW1sKHJvb3RDb25maWcsIHdvcmtmbG93c1BhdGgsIGtpbmQpKTtcbiAgICB9XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgJ2FkZC1mb2N1c2VkLWlzc3VlLXRvLXByb2plY3QueW1sJyksIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgICk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZVdvcmtmbG93WWFtbChjb25maWc6IFBhY2thZ2VDb25maWcsIHdvcmtmbG93c1BhdGg6IHN0cmluZywga2luZDogS25vd25LaW5kKTogUHJvbWlzZTx2b2lkPiB7XG4gIGxldCBuZXdTZXR0aW5ncyA9IGNsb25lRGVlcCh3b3JrZmxvd3Nba2luZCBhcyBrZXlvZiB0eXBlb2Ygd29ya2Zsb3dzXSA/PyB7fSkgYXMgV29ya2Zsb3c7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKHdvcmtmbG93c1BhdGgsIGAke2tpbmR9LnltbGApO1xuICB0cnkge1xuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICBjb25zdCBvbGRTZXR0aW5ncyA9IHlhbWwubG9hZChvbGRDb250ZW50KSBhcyBXb3JrZmxvdztcbiAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHsgYXJyYXlNZXJnZTogY29tYmluZU1lcmdlIH0pIGFzIFdvcmtmbG93O1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cblxuICBpZiAoa2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSkge1xuICAgIG5ld1NldHRpbmdzID0ge1xuICAgICAgLi4ubmV3U2V0dGluZ3MsXG4gICAgICBjb25jdXJyZW5jeToge1xuICAgICAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0nLFxuICAgICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogZmFsc2UsXG4gICAgICB9LFxuICAgIH07XG4gICAgLy8gTW92ZSBqb2JzIHRvIHRoZSBib3R0b21cbiAgICBpZiAobmV3U2V0dGluZ3Muam9icykge1xuICAgICAgbW92ZVRvQm90dG9tKG5ld1NldHRpbmdzLCAnam9icycpO1xuICAgIH1cbiAgICBpZiAobmV3U2V0dGluZ3Mub24/LnB1c2gpIHtcbiAgICAgIG5ld1NldHRpbmdzLm9uLnB1c2hbJ3BhdGhzLWlnbm9yZSddID0gW1xuICAgICAgICAuLi5uZXcgU2V0PHN0cmluZz4oWy4uLihuZXdTZXR0aW5ncy5vbi5wdXNoWydwYXRocy1pZ25vcmUnXSA/PyBbXSksICcqKi5tZCcsICcqKi9kb2NzLyoqJ10pLFxuICAgICAgXTtcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IGpvYiBvZiBPYmplY3QudmFsdWVzKG5ld1NldHRpbmdzLmpvYnMpKSB7XG4gICAgLy8gSWdub3JlIG5vbi1yZXVzYWJsZSB3b3JrZmxvd3NcbiAgICBpZiAoIWpvYi51c2VzPy5pbmNsdWRlcz8uKCcvcmV1c2FibGUtd29ya2Zsb3dzLycpKSByZXR1cm47XG5cbiAgICBub3JtYWxpemVKb2IoY29uZmlnLCBqb2IsIGtpbmQpO1xuICB9XG5cbiAgc3dpdGNoIChraW5kKSB7XG4gICAgY2FzZSAncmVsZWFzZSc6IHtcbiAgICAgIGlmIChuZXdTZXR0aW5ncy5vbj8uc2NoZWR1bGUpIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLm9uLnB1c2g7XG4gICAgICB9IGVsc2UgaWYgKG5ld1NldHRpbmdzLm9uPy5wdXNoICYmIGNvbmZpZy5yZWxlYXNlLmJyYW5jaGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbmV3U2V0dGluZ3Mub24ucHVzaC5icmFuY2hlcyA9IGNvbmZpZy5yZWxlYXNlLmJyYW5jaGVzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRG9uJ3QgdXNlIHJlbGVhc2UueW1sIGlmIHJlbGVhc2UgYnJhbmNoIGlzIG5vdCBzcGVjaWZpZWRcbiAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsICdyZWxlYXNlLnltbCcpLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSAndGVzdCc6IHtcbiAgICAgIGlmIChuZXdTZXR0aW5ncy5vbj8ucHVzaCkge1xuICAgICAgICBuZXdTZXR0aW5ncy5vbi5wdXNoLmJyYW5jaGVzID0gbmV3U2V0dGluZ3Mub24ucHVzaC5icmFuY2hlcy5maWx0ZXIoKGJyYW5jaCkgPT4gYnJhbmNoICE9PSAncmVub3ZhdGUvKionKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlICd3YmZ5Jzoge1xuICAgICAgaWYgKG5ld1NldHRpbmdzLm9uKSBzZXRTY2hlZHVsZShuZXdTZXR0aW5ncywgMjAsIDI0KTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlICd3YmZ5LW1lcmdlJzoge1xuICAgICAgc2V0U2NoZWR1bGUobmV3U2V0dGluZ3MsIDEsIDQpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIC8vIE5vIGRlZmF1bHRcbiAgfVxuICBtaWdyYXRlV29ya2Zsb3cobmV3U2V0dGluZ3MpO1xuICBhd2FpdCB3cml0ZVlhbWwobmV3U2V0dGluZ3MsIGZpbGVQYXRoKTtcblxuICBpZiAoa2luZCA9PT0gJ3JlbGVhc2UnKSB7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsICdzZW1hbnRpYy1yZWxlYXNlLnltbCcpLCB7IGZvcmNlOiB0cnVlIH0pO1xuICB9IGVsc2UgaWYgKGtpbmQgPT09ICdzeW5jJykge1xuICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAnc3luYy1pbml0LnltbCcpLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgIGlmICghbmV3U2V0dGluZ3Muam9icy5zeW5jIHx8ICFuZXdTZXR0aW5ncy5qb2JzLnN5bmMud2l0aCkgcmV0dXJuO1xuXG4gICAgbmV3U2V0dGluZ3Muam9ic1snc3luYy1mb3JjZSddID0gbmV3U2V0dGluZ3Muam9icy5zeW5jO1xuICAgIGNvbnN0IHBhcmFtcyA9IG5ld1NldHRpbmdzLmpvYnMuc3luYy53aXRoLnN5bmNfcGFyYW1zX3dpdGhvdXRfZGVzdDtcbiAgICBpZiAoIXBhcmFtcykgcmV0dXJuO1xuXG4gICAgbmV3U2V0dGluZ3Muam9icy5zeW5jLndpdGguc3luY19wYXJhbXNfd2l0aG91dF9kZXN0ID0gYC0tZm9yY2UgJHtwYXJhbXN9YDtcbiAgICBuZXdTZXR0aW5ncy5uYW1lID0gJ0ZvcmNlIHRvIFN5bmMnO1xuICAgIG5ld1NldHRpbmdzLm9uID0geyB3b3JrZmxvd19kaXNwYXRjaDogbnVsbCB9O1xuICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5qb2JzLnN5bmM7XG4gICAgYXdhaXQgd3JpdGVZYW1sKG5ld1NldHRpbmdzLCBwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgJ3N5bmMtZm9yY2UueW1sJykpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUpvYihjb25maWc6IFBhY2thZ2VDb25maWcsIGpvYjogSm9iLCBraW5kOiBLbm93bktpbmQpOiB2b2lkIHtcbiAgam9iLndpdGggfHw9IHt9O1xuICBqb2Iuc2VjcmV0cyB8fD0ge307XG5cbiAgaWYgKFxuICAgIGtpbmQgPT09ICd0ZXN0JyB8fFxuICAgIGtpbmQgPT09ICdyZWxlYXNlJyB8fFxuICAgIGtpbmQgPT09ICd3YmZ5JyB8fFxuICAgIGtpbmQgPT09ICd3YmZ5LW1lcmdlJyB8fFxuICAgIGtpbmQgPT09ICdhZGQtaXNzdWUtdG8tcHJvamVjdCcgfHxcbiAgICBraW5kID09PSAnYWRkLXJlYWR5LWlzc3VlLXRvLXByb2plY3QnXG4gICkge1xuICAgIGpvYi5zZWNyZXRzWydHSF9UT0tFTiddID0gY29uZmlnLmlzUHVibGljUmVwbyA/ICcke3sgc2VjcmV0cy5QVUJMSUNfR0hfQk9UX1BBVCB9fScgOiAnJHt7IHNlY3JldHMuR0hfQk9UX1BBVCB9fSc7XG4gIH1cbiAgaWYgKGNvbmZpZy5yZWxlYXNlLm5wbSAmJiAoa2luZCA9PT0gJ3JlbGVhc2UnIHx8IGtpbmQgPT09ICd0ZXN0JykpIHtcbiAgICBqb2Iuc2VjcmV0c1snTlBNX1RPS0VOJ10gPSAnJHt7IHNlY3JldHMuTlBNX1RPS0VOIH19JztcbiAgfVxuICBpZiAoam9iLnNlY3JldHNbJ0ZJUkVCQVNFX1RPS0VOJ10pIHtcbiAgICBqb2Iuc2VjcmV0c1snR0NQX1NBX0tFWV9KU09OX0ZPUl9GSVJFQkFTRSddID0gJyR7eyBzZWNyZXRzLkdDUF9TQV9LRVlfSlNPTl9GT1JfRklSRUJBU0UgfX0nO1xuICAgIGRlbGV0ZSBqb2Iuc2VjcmV0c1snRklSRUJBU0VfVE9LRU4nXTtcbiAgfVxuICBpZiAoXG4gICAgKGpvYi5zZWNyZXRzWydESVNDT1JEX1dFQkhPT0tfVVJMJ10gJiYgKGtpbmQgPT09ICdyZWxlYXNlJyB8fCBraW5kLnN0YXJ0c1dpdGgoJ2RlcGxveScpKSkgfHxcbiAgICAoam9iLndpdGguc2VydmVyX3VybCAmJiBraW5kLnN0YXJ0c1dpdGgoJ2RlcGxveScpKVxuICApIHtcbiAgICBqb2Iuc2VjcmV0c1snRElTQ09SRF9XRUJIT09LX1VSTCddID0gJyR7eyBzZWNyZXRzLkRJU0NPUkRfV0VCSE9PS19VUkxfRk9SX1JFTEVBU0UgfX0nO1xuICB9XG5cbiAgaWYgKGtpbmQgPT09ICdzeW5jJykge1xuICAgIGNvbnN0IHBhcmFtcyA9IGpvYi53aXRoPy5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3Q7XG4gICAgaWYgKHBhcmFtcykge1xuICAgICAgam9iLndpdGguc3luY19wYXJhbXNfd2l0aG91dF9kZXN0ID0gcGFyYW1zLnRvU3RyaW5nKCkucmVwbGFjZSgnc3luYyAnLCAnJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXIvJykpIHtcbiAgICBqb2IudXNlcyA9IGpvYi51c2VzLnJlcGxhY2UoJ1dpbGxCb29zdGVyTGFiLycsICdXaWxsQm9vc3Rlci8nKTtcbiAgfSBlbHNlIGlmIChjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyTGFiLycpKSB7XG4gICAgam9iLnVzZXMgPSBqb2IudXNlcy5yZXBsYWNlKCdXaWxsQm9vc3Rlci8nLCAnV2lsbEJvb3N0ZXJMYWIvJyk7XG4gIH1cblxuICAvLyBSZW1vdmUgcmVkdW5kYW50IHBhcmFtZXRlcnNcbiAgaWYgKGpvYi53aXRoWydkb3RfZW52X3BhdGgnXSA9PT0gJy5lbnYnKSB7XG4gICAgZGVsZXRlIGpvYi53aXRoWydkb3RfZW52X3BhdGgnXTtcbiAgfVxuICAvLyBSZW1vdmUgZGVwcmVjYXRlZCBwYXJhbWV0ZXJzXG4gIG1pZ3JhdGVKb2Ioam9iKTtcblxuICAvLyBEb24ndCB1c2UgYGZseSBkZXBsb3kgLS1qc29uYCBzaW5jZSBpdCBjYXVzZXMgYW4gZXJyb3JcbiAgaWYgKGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykgJiYgam9iLnNlY3JldHNbJ0ZMWV9BUElfVE9LRU4nXSAmJiBqb2Iud2l0aFsnZGVwbG95X2NvbW1hbmQnXSkge1xuICAgIGpvYi53aXRoWydkZXBsb3lfY29tbWFuZCddID0gam9iLndpdGhbJ2RlcGxveV9jb21tYW5kJ10udG9TdHJpbmcoKS5yZXBsYWNlKC9cXHMrLS1qc29uLywgJycpO1xuICB9XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5zRG9ja2VyZmlsZSkge1xuICAgIGlmIChqb2Iud2l0aFsnY2lfc2l6ZSddICE9PSAnZXh0cmEtbGFyZ2UnICYmIChraW5kLnN0YXJ0c1dpdGgoJ2RlcGxveScpIHx8IGtpbmQuc3RhcnRzV2l0aCgndGVzdCcpKSkge1xuICAgICAgam9iLndpdGhbJ2NpX3NpemUnXSA9ICdsYXJnZSc7XG4gICAgfVxuICAgIGlmIChraW5kLnN0YXJ0c1dpdGgoJ2RlcGxveScpKSB7XG4gICAgICBqb2Iud2l0aFsnY3B1X2FyY2gnXSA9ICdYNjQnO1xuICAgIH1cbiAgfVxuICAvLyBCZWNhdXNlIGdpdGh1Yi5ldmVudC5yZXBvc2l0b3J5LnByaXZhdGUgaXMgYWx3YXlzIHRydWUgaWYgam9iIGlzIHNjaGVkdWxlZFxuICBpZiAoa2luZCA9PT0gJ3JlbGVhc2UnIHx8IGtpbmQgPT09ICd0ZXN0JyB8fCBraW5kID09PSAnd2JmeScgfHwga2luZCA9PT0gJ3diZnktbWVyZ2UnIHx8IGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykpIHtcbiAgICBpZiAoY29uZmlnLmlzUHVibGljUmVwbykge1xuICAgICAgam9iLndpdGhbJ2dpdGh1Yl9ob3N0ZWRfcnVubmVyJ10gPSB0cnVlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBkZWxldGUgam9iLndpdGhbJ2dpdGh1Yl9ob3N0ZWRfcnVubmVyJ107XG4gIH1cblxuICBpZiAoT2JqZWN0LmtleXMoam9iLndpdGgpLmxlbmd0aCA+IDApIHtcbiAgICBzb3J0S2V5cyhqb2Iud2l0aCk7XG4gIH0gZWxzZSB7XG4gICAgZGVsZXRlIGpvYi53aXRoO1xuICB9XG4gIGlmIChPYmplY3Qua2V5cyhqb2Iuc2VjcmV0cykubGVuZ3RoID4gMCkge1xuICAgIC8vIE1vdmUgc2VjcmV0cyBwcm9wIGFmdGVyIHdpdGggcHJvcFxuICAgIGNvbnN0IG5ld1NlY3JldHMgPSBzb3J0S2V5cyhqb2Iuc2VjcmV0cyk7XG4gICAgZGVsZXRlIGpvYi5zZWNyZXRzO1xuICAgIGpvYi5zZWNyZXRzID0gbmV3U2VjcmV0cztcbiAgfSBlbHNlIHtcbiAgICBkZWxldGUgam9iLnNlY3JldHM7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2V0U2NoZWR1bGUobmV3U2V0dGluZ3M6IFdvcmtmbG93LCBpbmNsdXNpdmVNaW5Ib3VySnN0OiBudW1iZXIsIGV4Y2x1c2l2ZU1heEhvdXJKc3Q6IG51bWJlcik6IHZvaWQge1xuICBjb25zdCBbbWludXRlVXRjLCBob3VyVXRjXSA9ICgobmV3U2V0dGluZ3Mub24uc2NoZWR1bGU/LlswXT8uY3JvbiBhcyBzdHJpbmcpID8/ICcnKS5zcGxpdCgnICcpLm1hcChOdW1iZXIpO1xuICBpZiAobWludXRlVXRjICE9PSAwICYmIE51bWJlci5pc0ludGVnZXIoaG91clV0YykpIHtcbiAgICBjb25zdCBob3VySnN0ID0gKGhvdXJVdGMgKyA5KSAlIDI0O1xuICAgIGNvbnN0IGluUmFuZ2UgPVxuICAgICAgaW5jbHVzaXZlTWluSG91ckpzdCA8IGV4Y2x1c2l2ZU1heEhvdXJKc3RcbiAgICAgICAgPyBpbmNsdXNpdmVNaW5Ib3VySnN0IDw9IGhvdXJKc3QgJiYgaG91ckpzdCA8IGV4Y2x1c2l2ZU1heEhvdXJKc3RcbiAgICAgICAgOiBpbmNsdXNpdmVNaW5Ib3VySnN0IDw9IGhvdXJKc3QgfHwgaG91ckpzdCA8IGV4Y2x1c2l2ZU1heEhvdXJKc3Q7XG4gICAgaWYgKGluUmFuZ2UpIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IG1pbkpzdCA9IDEgKyBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiA1OSk7XG4gIGNvbnN0IGhvdXJKc3QgPSBpbmNsdXNpdmVNaW5Ib3VySnN0ICsgTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKGV4Y2x1c2l2ZU1heEhvdXJKc3QgLSBpbmNsdXNpdmVNaW5Ib3VySnN0KSk7XG4gIGNvbnN0IGNyb24gPSBgJHttaW5Kc3R9ICR7KGhvdXJKc3QgLSA5ICsgMjQpICUgMjR9ICogKiAqYDtcbiAgbmV3U2V0dGluZ3Mub24uc2NoZWR1bGUgPSBbeyBjcm9uIH1dO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZVlhbWwobmV3U2V0dGluZ3M6IFdvcmtmbG93LCBmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHlhbWxUZXh0ID0geWFtbC5kdW1wKG5ld1NldHRpbmdzLCB7XG4gICAgbGluZVdpZHRoOiAtMSxcbiAgICBub0NvbXBhdE1vZGU6IHRydWUsXG4gICAgc3R5bGVzOiB7XG4gICAgICAnISFudWxsJzogJ2VtcHR5JyxcbiAgICB9LFxuICB9KTtcbiAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGZpbGVQYXRoLCB5YW1sVGV4dCk7XG59XG5cbmZ1bmN0aW9uIG1pZ3JhdGVXb3JrZmxvdyhuZXdTZXR0aW5nczogV29ya2Zsb3cpOiB2b2lkIHtcbiAgLy8gVE9ETzogUmVtb3ZlIHRoZW0gYWZ0ZXIgMjAyMy0wMy0zMVxuICBkZWxldGUgbmV3U2V0dGluZ3Muam9ic1snYWRkLXRvLXByb2plY3QnXTtcbn1cblxuZnVuY3Rpb24gbWlncmF0ZUpvYihqb2I6IEpvYik6IHZvaWQge1xuICAvLyBUT0RPOiBSZW1vdmUgdGhlbSBhZnRlciAyMDIzLTAzLTMxXG4gIGlmICgham9iLndpdGgpIHJldHVybjtcbiAgZGVsZXRlIGpvYi53aXRoWydub25fc2VsZl9ob3N0ZWQnXTtcbiAgZGVsZXRlIGpvYi53aXRoWydub3RpZnlfZGlzY29yZCddO1xuICBkZWxldGUgam9iLndpdGhbJ3JlcXVpcmVfZmx5J107XG4gIGRlbGV0ZSBqb2Iud2l0aFsncmVxdWlyZV9nY2xvdWQnXTtcbiAgZGVsZXRlIGpvYi53aXRoWydjcHVfYXJjaCddO1xuICBkZWxldGUgam9iLndpdGhbJ2xhYmVsJ107XG4gIGRlbGV0ZSBqb2Iud2l0aFsnbGFiZWxPcGVyYXRvciddO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBDb25maWd1cmF0aW9uVmFsdWVNYXAgfSBmcm9tICdAeWFybnBrZy9jb3JlJztcbmltcG9ydCB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHNwYXduU3luYywgc3Bhd25TeW5jV2l0aFN0cmluZ1Jlc3VsdCB9IGZyb20gJy4uL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5cbmludGVyZmFjZSBTZXR0aW5ncyBleHRlbmRzIFBhcnRpYWw8Q29uZmlndXJhdGlvblZhbHVlTWFwPiB7XG4gIGRlZmF1bHRTZW12ZXJSYW5nZVByZWZpeDogc3RyaW5nO1xuICBubU1vZGU6IHN0cmluZztcbiAgbm9kZUxpbmtlcjogc3RyaW5nO1xuICBwbHVnaW5zPzogUGx1Z2luW107XG59XG5cbmludGVyZmFjZSBQbHVnaW4ge1xuICBjaGVja3N1bTogc3RyaW5nO1xuICBwYXRoOiBzdHJpbmc7XG4gIHNwZWM6IHN0cmluZztcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlWWFybnJjWW1sKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlWWFybnJjWW1sJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHlhcm5yY1ltbFBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcueWFybnJjLnltbCcpO1xuICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybSh5YXJucmNZbWxQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgICBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcueWFybicpLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSlcbiAgICAgICk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgICAgZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAneWFybi5sb2NrJyksIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50VmVyc2lvbiA9IHNwYXduU3luY1dpdGhTdHJpbmdSZXN1bHQoJ3lhcm4nLCBbJy0tdmVyc2lvbiddLCBjb25maWcuZGlyUGF0aCk7XG4gICAgY29uc3QgbGF0ZXN0VmVyc2lvbiA9IGdldExhdGVzdFZlcnNpb24oJ0B5YXJucGtnL2NsaScsIGNvbmZpZy5kaXJQYXRoKTtcbiAgICBpZiAoZ2V0TWFqb3JOdW1iZXIoY3VycmVudFZlcnNpb24pIDw9IGdldE1ham9yTnVtYmVyKGxhdGVzdFZlcnNpb24pICYmIGN1cnJlbnRWZXJzaW9uICE9PSBsYXRlc3RWZXJzaW9uKSB7XG4gICAgICBzcGF3blN5bmMoJ3lhcm4nLCBbJ3NldCcsICd2ZXJzaW9uJywgbGF0ZXN0VmVyc2lvbl0sIGNvbmZpZy5kaXJQYXRoLCAxKTtcbiAgICB9XG5cbiAgICBjb25zdCByZWxlYXNlc1BhdGggPSBwYXRoLmpvaW4oY29uZmlnLmRpclBhdGgsICcueWFybicsICdyZWxlYXNlcycpO1xuICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHJlbGVhc2VzUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgZm9yIChjb25zdCBmaWxlIG9mIGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIocmVsZWFzZXNQYXRoKSkge1xuICAgICAgaWYgKGZpbGUuc3RhcnRzV2l0aCgneWFybi0nKSAmJiAhZmlsZS5zdGFydHNXaXRoKGB5YXJuLSR7bGF0ZXN0VmVyc2lvbn0uYCkpIHtcbiAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGguam9pbihyZWxlYXNlc1BhdGgsIGZpbGUpKSk7XG4gICAgICAgIGNvbnNvbGUubG9nKCdSZW1vdmVkJywgcGF0aC5qb2luKHJlbGVhc2VzUGF0aCwgZmlsZSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHlhcm5yY1BhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcueWFybnJjJyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHlhcm5yY1BhdGgsIHsgZm9yY2U6IHRydWUgfSkpO1xuXG4gICAgY29uc3Qgc2V0dGluZ3MgPSB5YW1sLmxvYWQoYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoeWFybnJjWW1sUGF0aCwgJ3V0ZjgnKSkgYXMgU2V0dGluZ3M7XG4gICAgc2V0dGluZ3MuZGVmYXVsdFNlbXZlclJhbmdlUHJlZml4ID0gJyc7XG4gICAgc2V0dGluZ3Mubm9kZUxpbmtlciA9ICdub2RlLW1vZHVsZXMnO1xuICAgIHNldHRpbmdzLm5tTW9kZSA9ICdoYXJkbGlua3MtZ2xvYmFsJztcbiAgICBkZWxldGUgc2V0dGluZ3MuY29tcHJlc3Npb25MZXZlbDtcbiAgICBpZiAoc2V0dGluZ3MuaW5qZWN0RW52aXJvbm1lbnRGaWxlcz8ubGVuZ3RoID09PSAwKSB7XG4gICAgICBkZWxldGUgc2V0dGluZ3MuaW5qZWN0RW52aXJvbm1lbnRGaWxlcztcbiAgICB9XG4gICAgLy8gY2YuIGh0dHBzOi8vZ2l0aHViLmNvbS95YXJucGtnL2JlcnJ5L3B1bGwvNDY5OFxuICAgIHNldHRpbmdzLmVuYWJsZUdsb2JhbENhY2hlID0gdHJ1ZTtcbiAgICBjb25zdCBvcmlnaW5hbExlbmd0aCA9IHNldHRpbmdzLnBsdWdpbnM/Lmxlbmd0aCA/PyAwO1xuICAgIHNldHRpbmdzLnBsdWdpbnMgPSBzZXR0aW5ncy5wbHVnaW5zPy5maWx0ZXIoKHApID0+IHAucGF0aCAhPT0gJy55YXJuL3BsdWdpbnMvdW5kZWZpbmVkLmNqcycpID8/IFtdO1xuICAgIGlmIChzZXR0aW5ncy5wbHVnaW5zLmxlbmd0aCAhPT0gb3JpZ2luYWxMZW5ndGgpIHtcbiAgICAgIGNvbnN0IHBsdWdpblBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcueWFybnJjJywgJ3VuZGVmaW5lZC5janMnKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwbHVnaW5QYXRoLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICB9XG4gICAgaWYgKHNldHRpbmdzLnBsdWdpbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICBkZWxldGUgc2V0dGluZ3MucGx1Z2lucztcbiAgICB9XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHlhcm5yY1ltbFBhdGgsIHlhbWwuZHVtcChzZXR0aW5ncywgeyBsaW5lV2lkdGg6IC0xIH0pKTtcblxuICAgIHNwYXduU3luYygneWFybicsIFsnZGx4JywgJ3lhcm4tcGx1Z2luLWF1dG8taW5zdGFsbCddLCBjb25maWcuZGlyUGF0aCk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGF0ZXN0VmVyc2lvbihwYWNrYWdlTmFtZTogc3RyaW5nLCBkaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCB2ZXJzaW9uc0pzb24gPSBzcGF3blN5bmNXaXRoU3RyaW5nUmVzdWx0KCducG0nLCBbJ3Nob3cnLCBwYWNrYWdlTmFtZSwgJ3ZlcnNpb25zJywgJy0tanNvbiddLCBkaXJQYXRoKTtcbiAgY29uc3QgdmVyc2lvbnMgPSBKU09OLnBhcnNlKHZlcnNpb25zSnNvbikgYXMgc3RyaW5nW107XG4gIHJldHVybiB2ZXJzaW9ucy5hdCgtMSkgYXMgc3RyaW5nO1xufVxuZnVuY3Rpb24gZ2V0TWFqb3JOdW1iZXIodmVyc2lvbjogc3RyaW5nKTogbnVtYmVyIHtcbiAgY29uc3QgW21ham9yXSA9IHZlcnNpb24uc3BsaXQoJy4nKTtcbiAgcmV0dXJuIE51bWJlcihtYWpvcik7XG59XG4iLCJpbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnaXRIdWJVdGlsLCBoYXNHaXRIdWJUb2tlbiwgb2N0b2tpdCB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0dXBMYWJlbHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignc2V0dXBMYWJlbHMnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFoYXNHaXRIdWJUb2tlbikgcmV0dXJuO1xuXG4gICAgY29uc3QgW293bmVyLCByZXBvXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShjb25maWcucmVwb3NpdG9yeSA/PyAnJyk7XG4gICAgaWYgKCFvd25lciB8fCAhcmVwbykgcmV0dXJuO1xuICAgIGlmIChvd25lciAhPT0gJ1dpbGxCb29zdGVyJyAmJiBvd25lciAhPT0gJ1dpbGxCb29zdGVyTGFiJykgcmV0dXJuO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdkMTogeC1lYXN5IDpoZWRnZWhvZzonLCAnRURFOUZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAnZDI6IGVhc3kgOnJhYmJpdDI6JywgJ0RERDZGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ2QzOiBtZWRpdW0gOm94OicsICdDNEI1RkQnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdkNDogaGFyZCA6c3F1aWQ6JywgJ0E3OEJGQScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ2Q1OiB4LWhhcmQgOndoYWxlMjonLCAnOEI1Q0Y2Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAncDE6IGNyaXRpY2FsIDpmaXJlOjpmaXJlOjpmaXJlOicsICdFRjQ0NDQnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdwMjogdXJnZW50IDpmaXJlOjpmaXJlOicsICdGODcxNzEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdwMzogaW1wb3J0YW50IDpmaXJlOicsICdGQ0E1QTUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdwNDogbmljZSB0byBoYXZlIDpkcm9wbGV0OicsICdGRUNBQ0EnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdyOiBibGl0eicsICc1MzAwYmMnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdyOiBmaXJlYmFzZScsICdmZmNhMjgnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdyOiBwcmlzbWEnLCAnMGMzNDRiJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAncjogcmVhY3QnLCAnNjFkYWZiJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAncjogc3ZlbHRlJywgJ2ZmM2UwMCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3I6IHNlbWFudGljLXJlbGVhc2UnLCAnNDk0OTQ5Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAncmVhZHkgOnJvY2tldDonLCAnMjJDNTVFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAncmV2aWV3IHJlcXVlc3RlZCA6bWFnOicsICdGQkNBMDQnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdyZWxlYXNlZCA6Ym9va21hcms6JywgJzYzNjZGMScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3M6IDAuNWggOmNsb2NrMTIzMDonLCAnRjNGNEY2Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAnczogMWggOmNsb2NrMTonLCAnRTVFN0VCJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAnczogMmggOmNsb2NrMjonLCAnRDFENURCJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAnczogM2ggOmNsb2NrMzonLCAnOUNBM0FGJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAnczogNWggOmNsb2NrNTonLCAnNkI3MjgwJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAnczogOGggOmNsb2NrODonLCAnNEI1NTYzJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAnczogMTNoIDpjbG9jazE6JywgJzM3NDE1MScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3Q6IGJ1aWxkIDpoYW1tZXI6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3Q6IGNob3JlIDpicm9vbTonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAndDogY2kgOmNvbnN0cnVjdGlvbl93b3JrZXI6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3Q6IGRvY3MgOm1lbW86JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3Q6IGZlYXQgOnNwYXJrbGVzOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICd0OiBmaXggOmJ1ZzonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAndDogcGVyZiA6emFwOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICd0OiByZWZhY3RvciA6cmVjeWNsZTonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAndDogc3R5bGUgOmxpcHN0aWNrOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICd0OiB0ZXN0IDp0ZXN0X3R1YmU6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3Byb2plY3QnLCAnMjQyOTJGJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAnZm9jdXNlZCA6ZGFydDonLCAnMjJDNTVFJyk7XG5cbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG93bmVyLCByZXBvLCAnYnVnJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvd25lciwgcmVwbywgJ2RvY3VtZW50YXRpb24nKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG93bmVyLCByZXBvLCAnZHVwbGljYXRlJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvd25lciwgcmVwbywgJ2VuaGFuY2VtZW50Jyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvd25lciwgcmVwbywgJ2dvb2QgZmlyc3QgaXNzdWUnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG93bmVyLCByZXBvLCAnaGVscCB3YW50ZWQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG93bmVyLCByZXBvLCAnaW52YWxpZCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob3duZXIsIHJlcG8sICdxdWVzdGlvbicpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob3duZXIsIHJlcG8sICd3b250Zml4Jyk7XG5cbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG93bmVyLCByZXBvLCAncmVhZHknKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG93bmVyLCByZXBvLCAncmV2aWV3IHJlcXVlc3RlZCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob3duZXIsIHJlcG8sICdyZWxlYXNlZCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob3duZXIsIHJlcG8sICdzZW1hbnRpYy1yZWxlYXNlJyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybignU2tpcCBzZXR1cExhYmVscyBkdWUgdG86JywgKGVycm9yIGFzIEVycm9yKT8uc3RhY2sgPz8gZXJyb3IpO1xuICAgIH1cbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNldHVwTGFiZWwob3duZXI6IHN0cmluZywgcmVwbzogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIGNvbG9yOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ1BPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVscycsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIG5hbWUsXG4gICAgICBjb2xvcixcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vbGFiZWxzL3tuYW1lfScsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIG5hbWUsXG4gICAgICBjb2xvcixcbiAgICB9KTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBkZWxldGVMYWJlbChvd25lcjogc3RyaW5nLCByZXBvOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHMve25hbWV9Jywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgbmFtZSxcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBpbXBvcnQvbm8tbmFtZWQtYXMtZGVmYXVsdC1tZW1iZXIgKi9cblxuaW1wb3J0IGRvdGVudiBmcm9tICdkb3RlbnYnO1xuaW1wb3J0IHNvZGl1bSBmcm9tICdsaWJzb2RpdW0td3JhcHBlcnMnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4uL29wdGlvbnMuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnaXRIdWJVdGlsLCBoYXNHaXRIdWJUb2tlbiwgb2N0b2tpdCB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuXG5jb25zdCBkZXByZWNhdGVkU2VjcmV0TmFtZXMgPSBbJ1JFQURZX0RJU0NPUkRfV0VCSE9PS19VUkwnXTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwU2VjcmV0cyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdzZXR1cFNlY3JldHMnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFoYXNHaXRIdWJUb2tlbiB8fCAhb3B0aW9ucy5kb2VzVXBsb2FkRW52VmFycykgcmV0dXJuO1xuXG4gICAgY29uc3QgW293bmVyLCByZXBvXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShjb25maWcucmVwb3NpdG9yeSA/PyAnJyk7XG4gICAgaWYgKCFvd25lciB8fCAhcmVwbyB8fCBvd25lciAhPT0gJ1dpbGxCb29zdGVyTGFiJykgcmV0dXJuO1xuXG4gICAgY29uc3QgcGFyc2VkID0gZG90ZW52LmNvbmZpZygpLnBhcnNlZCB8fCB7fTtcbiAgICBpZiAoT2JqZWN0LmtleXMocGFyc2VkKS5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIHRyeSB7XG4gICAgICBmb3IgKGNvbnN0IHNlY3JldE5hbWUgb2YgZGVwcmVjYXRlZFNlY3JldE5hbWVzKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvc2VjcmV0cy97c2VjcmV0X25hbWV9Jywge1xuICAgICAgICAgICAgb3duZXIsXG4gICAgICAgICAgICByZXBvLFxuICAgICAgICAgICAgc2VjcmV0X25hbWU6IHNlY3JldE5hbWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG9jdG9raXQucmVxdWVzdCgnR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3NlY3JldHMvcHVibGljLWtleScsIHtcbiAgICAgICAgb3duZXIsXG4gICAgICAgIHJlcG8sXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHsga2V5LCBrZXlfaWQ6IGtleUlkIH0gPSByZXNwb25zZS5kYXRhO1xuXG4gICAgICBhd2FpdCBzb2RpdW0ucmVhZHk7XG5cbiAgICAgIGZvciAoY29uc3QgW25hbWUsIHNlY3JldF0gb2YgT2JqZWN0LmVudHJpZXMocGFyc2VkKSkge1xuICAgICAgICBpZiAoY29uZmlnLmlzUHVibGljUmVwbyAmJiBuYW1lID09PSAnR0hfQk9UX1BBVCcpIGNvbnRpbnVlO1xuICAgICAgICBpZiAoIWNvbmZpZy5pc1B1YmxpY1JlcG8gJiYgbmFtZSA9PT0gJ1BVQkxJQ19HSF9CT1RfUEFUJykgY29udGludWU7XG5cbiAgICAgICAgLy8gQ29udmVydCBTZWNyZXQgJiBCYXNlNjQga2V5IHRvIFVpbnQ4QXJyYXkuXG4gICAgICAgIGNvbnN0IHJhd0tleSA9IHNvZGl1bS5mcm9tX2Jhc2U2NChrZXksIHNvZGl1bS5iYXNlNjRfdmFyaWFudHMuT1JJR0lOQUwpO1xuICAgICAgICBjb25zdCByYXdTZWMgPSBzb2RpdW0uZnJvbV9zdHJpbmcoc2VjcmV0KTtcblxuICAgICAgICAvLyBFbmNyeXB0IHRoZSBzZWNyZXQgdXNpbmcgTGliU29kaXVtXG4gICAgICAgIGNvbnN0IGVuY0J5dGVzID0gc29kaXVtLmNyeXB0b19ib3hfc2VhbChyYXdTZWMsIHJhd0tleSk7XG5cbiAgICAgICAgLy8gQ29udmVydCBlbmNyeXB0ZWQgVWludDhBcnJheSB0byBCYXNlNjRcbiAgICAgICAgY29uc3QgZW5jQmFzZTY0ID0gc29kaXVtLnRvX2Jhc2U2NChlbmNCeXRlcywgc29kaXVtLmJhc2U2NF92YXJpYW50cy5PUklHSU5BTCk7XG5cbiAgICAgICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvc2VjcmV0cy97c2VjcmV0X25hbWV9Jywge1xuICAgICAgICAgIG93bmVyLFxuICAgICAgICAgIHJlcG8sXG4gICAgICAgICAgc2VjcmV0X25hbWU6IG5hbWUsXG4gICAgICAgICAgZW5jcnlwdGVkX3ZhbHVlOiBlbmNCYXNlNjQsXG4gICAgICAgICAga2V5X2lkOiBrZXlJZCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybignU2tpcCBzZXR1cFNlY3JldHMgZHVlIHRvOicsIChlcnJvciBhcyBFcnJvcik/LnN0YWNrID8/IGVycm9yKTtcbiAgICB9XG4gIH0pO1xufVxuIiwiaW1wb3J0IHsgd2l0aFJldHJ5IH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWInO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdpdEh1YlV0aWwsIG9jdG9raXQgfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwR2l0SHViU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IFtvd25lciwgcmVwb10gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUoY29uZmlnLnJlcG9zaXRvcnkgPz8gJycpO1xuICBpZiAoIW93bmVyIHx8ICFyZXBvKSByZXR1cm47XG4gIGlmIChvd25lciAhPT0gJ1dpbGxCb29zdGVyJyAmJiBvd25lciAhPT0gJ1dpbGxCb29zdGVyTGFiJykgcmV0dXJuO1xuXG4gIGF3YWl0IHdpdGhSZXRyeSgoKSA9PlxuICAgIG9jdG9raXQucmVxdWVzdCgnUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99Jywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgYWxsb3dfbWVyZ2VfY29tbWl0OiBmYWxzZSxcbiAgICAgIGFsbG93X3NxdWFzaF9tZXJnZTogdHJ1ZSxcbiAgICAgIGFsbG93X3JlYmFzZV9tZXJnZTogZmFsc2UsXG4gICAgICBkZWxldGVfYnJhbmNoX29uX21lcmdlOiB0cnVlLFxuICAgICAgc3F1YXNoX21lcmdlX2NvbW1pdF90aXRsZTogJ1BSX1RJVExFJyxcbiAgICAgIHNxdWFzaF9tZXJnZV9jb21taXRfbWVzc2FnZTogJ0JMQU5LJyxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ1gtR2l0SHViLUFwaS1WZXJzaW9uJzogJzIwMjItMTEtMjgnLFxuICAgICAgfSxcbiAgICAgIC4uLihjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyLycpID8geyBhbGxvd19hdXRvX21lcmdlOiB0cnVlIH0gOiB7fSksXG4gICAgfSlcbiAgKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGRpc3RhbmNlIH0gZnJvbSAnZmFzdGVzdC1sZXZlbnNodGVpbic7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgdGVtcGxhdGVzID0ge1xuICAncHVsbF9yZXF1ZXN0X3RlbXBsYXRlLm1kJzogYFxuQ2xvc2UgIzxJc3N1ZU51bWJlcj5cblxuIyMgU2VsZiBDaGVja1xuXG4tIFsgXSBJJ3ZlIGNvbmZpcm1lZCBcXGBBbGwgY2hlY2tzIGhhdmUgcGFzc2VkXFxgIG9uIHRoaXMgcGFnZS4g77yI44GT44Gu44Oa44O844K444GnIFxcYEFsbCBjaGVja3MgaGF2ZSBwYXNzZWRcXGAg44GM6KGo56S644GV44KM44Gm44GE44KL44GT44Go44KS56K66KqN44GX44Gf44CC77yJXG4gIC0gWW91IG1heSBsZWF2ZSB0aGlzIGJveCB1bmNoZWNrZWQgZHVlIHRvIGxvbmcgd29ya2Zsb3dzLlxuICAtIFBSIHRpdGxlIGZvbGxvd3MgW0FuZ3VsYXIncyBjb21taXQgbWVzc2FnZSBmb3JtYXRdKGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvYmxvYi9tYWluL0NPTlRSSUJVVElORy5tZCMtY29tbWl0LW1lc3NhZ2UtZm9ybWF0KS5cbiAgICAtIFBSIHRpdGxlIGRvZXNuJ3QgaGF2ZSBcXGBXSVA6XFxgLlxuICAtIEFsbCB0ZXN0cyBhcmUgcGFzc2VkLlxuICAgIC0gVGVzdCBjb21tYW5kIChlLmcuLCBcXGB5YXJuIHRlc3RcXGApIGlzIHBhc3NlZC5cbiAgICAtIExpbnQgY29tbWFuZCAoZS5nLiwgXFxgeWFybiBsaW50XFxgKSBpcyBwYXNzZWQuXG4tIFsgXSBJJ3ZlIHJldmlld2VkIG15IGNoYW5nZXMgb24gR2l0SHViIFBSJ3MgZGlmZiB2aWV3LiDvvIhHaXRIdWLkuIrjgafoh6rliIbjga7lpInmm7TlhoXlrrnjgpLnorroqo3jgZfjgZ/jgILvvIlcbi0gWyBdIEkndmUgd3JpdHRlbiB0aGUgc3RlcHMgdG8gdGVzdC4g77yI44OG44K544OI5omL6aCG44KS6KiY6LyJ44GX44Gf44CC77yJXG4tIFsgXSBJJ3ZlIGFkZGVkIHNjcmVlbnNob3RzLiDvvIhVSeOCkuWkieabtOOBl+OBn+WgtOWQiOOAgeOCueOCr+ODquODvOODs+OCt+ODp+ODg+ODiOOCkui/veWKoOOBl+OBn+OAgu+8iVxuICAtIFlvdSBtYXkgbGVhdmUgdGhpcyBib3ggdW5jaGVja2VkIGlmIHlvdSBkaWRuJ3QgbW9kaWZ5IHRoZSBVSS5cblxuPCEtLSBQbGVhc2UgYWRkIHNjcmVlbnNob3RzIGlmIHlvdSBtb2RpZnkgdGhlIFVJLlxufCBDdXJyZW50ICAgICAgICAgICAgICAgICAgfCBJbiBjb21pbmcgICAgICAgICAgICAgICAgfFxufCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfFxufCA8aW1nIHNyYz1cIlwiIHdpZHRoPVwiNDAwXCI+IHwgPGltZyBzcmM9XCJcIiB3aWR0aD1cIjQwMFwiPiB8XG4tLT5cblxuIyMgU3RlcHMgdG8gVGVzdFxuXG4xLiBPcGVuIGh0dHA6Ly9sb2NhbGhvc3QtZXhlcmNvZGUud2lsbGJvb3N0ZXIubmV0OjMwMDAvamEtSlAvY291cnNlcy9fZXhhbXBsZS9sZXNzb25zL19leGFtcGxlX2FfcGx1c19iL3Byb2JsZW1zL19leGFtcGxlX2FfcGx1c19iIGFmdGVyIGxvZ2luLlxuMi4gU2VsZWN0IHRoZSBsYW5ndWFnZSBcXGBDXFxgLlxuMy4gV3JpdGUgdGhlIGZvbGxvd2luZyBjb2RlOlxuICAgXFxgXFxgXFxgY1xuICAgI2luY2x1ZGUgPHN0ZGlvLmg+XG5cbiAgIGludCBtYWluKHZvaWQpIHtcbiAgICAgaW50IGEsIGI7XG5cbiAgICAgc2NhbmYoXCIlZCAlZFwiLCAmYSwgJmIpO1xuICAgICBwcmludGYoXCIlZFwiLCBhICsgYik7XG4gICAgIHJldHVybiAwO1xuICAgfVxuICAgXFxgXFxgXFxgXG40LiBQdXNoIFxcYFN1Ym1pdFxcYCBidXR0b24uXG41LiAuLi5cblxuPCEtLSDml6XmnKzoqp7jgafoqJjov7DjgZfjgabjgoLlpKfkuIjlpKvjgafjgZnjgIIgLS0+XG5gLnRyaW0oKSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcycsIGFzeW5jICgpID0+IHtcbiAgICBmb3IgKGNvbnN0IFtmaWxlTmFtZSwgbmV3Q29udGVudF0gb2YgT2JqZWN0LmVudHJpZXModGVtcGxhdGVzKSkge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aHViJywgZmlsZU5hbWUpO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSB7XG4gICAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgICAgaWYgKGRpc3RhbmNlKG9sZENvbnRlbnQsIG5ld0NvbnRlbnQpID4gbmV3Q29udGVudC5sZW5ndGggLyAyKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gICAgfVxuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBmc3AgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBnbG9iYnlTeW5jIH0gZnJvbSAnZ2xvYmJ5JztcbmltcG9ydCB7IHNpbXBsZUdpdCB9IGZyb20gJ3NpbXBsZS1naXQnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5pbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcblxuaW1wb3J0IHsgZ2l0SHViVXRpbCwgb2N0b2tpdCB9IGZyb20gJy4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFja2FnZUNvbmZpZyB7XG4gIGRpclBhdGg6IHN0cmluZztcbiAgZG9ja2VyZmlsZTogc3RyaW5nO1xuICBpc1Jvb3Q6IGJvb2xlYW47XG4gIGlzUHVibGljUmVwbzogYm9vbGVhbjtcbiAgaXNSZWZlcnJlZEJ5T3RoZXJSZXBvOiBib29sZWFuO1xuICByZXBvc2l0b3J5Pzogc3RyaW5nO1xuICBpc0J1bjogYm9vbGVhbjtcbiAgaXNFc21QYWNrYWdlOiBib29sZWFuO1xuICBpc1dpbGxCb29zdGVyQ29uZmlnczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5zU3ViUGFja2FnZUpzb25zOiBib29sZWFuO1xuICBkb2VzQ29udGFpbnNEb2NrZXJmaWxlOiBib29sZWFuO1xuICBkb2VzQ29udGFpbnNHZW1maWxlOiBib29sZWFuO1xuICBkb2VzQ29udGFpbnNHb01vZDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5zUGFja2FnZUpzb246IGJvb2xlYW47XG4gIGRvZXNDb250YWluc1BvZXRyeUxvY2s6IGJvb2xlYW47XG4gIGRvZXNDb250YWluc1BvbVhtbDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5zUHVic3BlY1lhbWw6IGJvb2xlYW47XG4gIGRvZXNDb250YWluc1RlbXBsYXRlWWFtbDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5zVnNjb2RlU2V0dGluZ3NKc29uOiBib29sZWFuO1xuXG4gIGRvZXNDb250YWluc0phdmFTY3JpcHQ6IGJvb2xlYW47XG4gIGRvZXNDb250YWluc1R5cGVTY3JpcHQ6IGJvb2xlYW47XG4gIGRvZXNDb250YWluc0pzeE9yVHN4OiBib29sZWFuO1xuICBkb2VzQ29udGFpbnNKYXZhU2NyaXB0SW5QYWNrYWdlczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5zVHlwZVNjcmlwdEluUGFja2FnZXM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluc0pzeE9yVHN4SW5QYWNrYWdlczogYm9vbGVhbjtcbiAgZGVwZW5kaW5nOiB7XG4gICAgYmxpdHo6IGJvb2xlYW47XG4gICAgZmlyZWJhc2U6IGJvb2xlYW47XG4gICAgbGl0ZXN0cmVhbTogYm9vbGVhbjtcbiAgICBuZXh0OiBib29sZWFuO1xuICAgIHBsYXl3cmlnaHRUZXN0OiBib29sZWFuO1xuICAgIHByaXNtYTogYm9vbGVhbjtcbiAgICBweXJpZ2h0OiBib29sZWFuO1xuICAgIHJlYWN0TmF0aXZlOiBib29sZWFuO1xuICAgIHNlbWFudGljUmVsZWFzZTogYm9vbGVhbjtcbiAgICBzdG9yeWJvb2s6IGJvb2xlYW47XG4gICAgd2I6IGJvb2xlYW47XG4gIH07XG4gIHJlbGVhc2U6IHtcbiAgICBicmFuY2hlczogc3RyaW5nW107XG4gICAgZ2l0aHViOiBib29sZWFuO1xuICAgIG5wbTogYm9vbGVhbjtcbiAgfTtcbiAgZXNsaW50QmFzZT86IEVzbGludEV4dGVuc2lvbkJhc2U7XG4gIHZlcnNpb25zVGV4dD86IHN0cmluZztcbiAgcGFja2FnZUpzb24/OiBQYWNrYWdlSnNvbjtcbiAgd2JmeUpzb24/OiBXYmZ5SnNvbjtcbn1cblxudHlwZSBXYmZ5SnNvbiA9IHouaW5mZXI8dHlwZW9mIHdiZnlKc29uU2NoZW1hPjtcblxuY29uc3Qgd2JmeUpzb25TY2hlbWEgPSB6Lm9iamVjdCh7XG4gIHR5cG9zOiB6XG4gICAgLm9iamVjdCh7XG4gICAgICBhbGw6IHoucmVjb3JkKHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgICBkb2M6IHoucmVjb3JkKHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgICB0czogei5yZWNvcmQoei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICAgIHRleHQ6IHoucmVjb3JkKHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgfSlcbiAgICAub3B0aW9uYWwoKSxcbn0pO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UGFja2FnZUNvbmZpZyhcbiAgZGlyUGF0aDogc3RyaW5nLFxuICByb290Q29uZmlnPzogUGFja2FnZUNvbmZpZ1xuKTogUHJvbWlzZTxQYWNrYWdlQ29uZmlnIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIHRyeSB7XG4gICAgY29uc3QgZG9lc0NvbnRhaW5zUGFja2FnZUpzb24gPSBmcy5leGlzdHNTeW5jKHBhY2thZ2VKc29uUGF0aCk7XG4gICAgbGV0IGRlcGVuZGVuY2llczogUGFja2FnZUpzb25bJ2RlcGVuZGVuY2llcyddID0ge307XG4gICAgbGV0IGRldkRlcGVuZGVuY2llczogUGFja2FnZUpzb25bJ2RldkRlcGVuZGVuY2llcyddID0ge307XG4gICAgbGV0IHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiA9IHt9O1xuICAgIGxldCBlc21QYWNrYWdlID0gZmFsc2U7XG4gICAgaWYgKGRvZXNDb250YWluc1BhY2thZ2VKc29uKSB7XG4gICAgICBjb25zdCBwYWNrYWdlSnNvblRleHQgPSBmcy5yZWFkRmlsZVN5bmMocGFja2FnZUpzb25QYXRoLCAndXRmOCcpO1xuICAgICAgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKHBhY2thZ2VKc29uVGV4dCk7XG4gICAgICBkZXBlbmRlbmNpZXMgPSBwYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge307XG4gICAgICBkZXZEZXBlbmRlbmNpZXMgPSBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gICAgICBlc21QYWNrYWdlID0gcGFja2FnZUpzb24udHlwZSA9PT0gJ21vZHVsZSc7XG4gICAgfVxuXG4gICAgbGV0IHJlbGVhc2VCcmFuY2hlczogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgcmVsZWFzZVBsdWdpbnM6IHN0cmluZ1tdID0gW107XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlbGVhc2VyY0pzb25QYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICcucmVsZWFzZXJjLmpzb24nKTtcbiAgICAgIGNvbnN0IGpzb24gPSBKU09OLnBhcnNlKGF3YWl0IGZzcC5yZWFkRmlsZShyZWxlYXNlcmNKc29uUGF0aCwgJ3V0ZjgnKSk7XG4gICAgICByZWxlYXNlQnJhbmNoZXMgPSBqc29uPy5icmFuY2hlcyB8fCBbXTtcbiAgICAgIHJlbGVhc2VQbHVnaW5zID0ganNvbj8ucGx1Z2lucz8uZmxhdCgpIHx8IFtdO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cblxuICAgIGNvbnN0IGlzUm9vdCA9XG4gICAgICBwYXRoLmJhc2VuYW1lKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLi4nKSkgIT09ICdwYWNrYWdlcycgfHxcbiAgICAgICFmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLi4nLCAnLi4nLCAncGFja2FnZS5qc29uJykpO1xuXG4gICAgbGV0IHJlcG9JbmZvOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICBpZiAoaXNSb290KSB7XG4gICAgICByZXBvSW5mbyA9IGF3YWl0IGZldGNoUmVwb0luZm8oZGlyUGF0aCwgcGFja2FnZUpzb24pO1xuICAgIH1cblxuICAgIGxldCB2ZXJzaW9uc1RleHQgPSAnJztcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzcC5yZWFkRmlsZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy50b29sLXZlcnNpb25zJyksICd1dGY4Jyk7XG4gICAgICB2ZXJzaW9uc1RleHQgKz0gY29udGVudC50cmltKCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICAgIGZvciAoY29uc3QgW3ByZWZpeCwgbmFtZV0gb2YgW1xuICAgICAgWydqYXZhJywgJ2phdmEnXSxcbiAgICAgIFsnbm9kZScsICdub2RlanMnXSxcbiAgICAgIFsncHl0aG9uJywgJ3B5dGhvbiddLFxuICAgIF0pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IG5vZGVWZXJzaW9uQ29udGVudCA9IGF3YWl0IGZzcC5yZWFkRmlsZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgYC4ke3ByZWZpeH0tdmVyc2lvbmApLCAndXRmOCcpO1xuICAgICAgICBpZiAodmVyc2lvbnNUZXh0KSB7XG4gICAgICAgICAgdmVyc2lvbnNUZXh0ICs9ICdcXG4nO1xuICAgICAgICB9XG4gICAgICAgIHZlcnNpb25zVGV4dCArPSBuYW1lICsgJyAnICsgbm9kZVZlcnNpb25Db250ZW50LnRyaW0oKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGRvY2tlcmZpbGUgPSAnJztcbiAgICB0cnkge1xuICAgICAgZG9ja2VyZmlsZSA9IGF3YWl0IGZzcC5yZWFkRmlsZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ0RvY2tlcmZpbGUnKSwgJ3V0ZjgnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICAvLyBSZWFkIHdiZnkuanNvblxuICAgIGNvbnN0IHdiZnlKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnd2JmeS5qc29uJyk7XG4gICAgbGV0IHdiZnlKc29uOiBXYmZ5SnNvbiB8IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgd2JmeUpzb25UZXh0ID0gYXdhaXQgZnNwLnJlYWRGaWxlKHdiZnlKc29uUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIHdiZnlKc29uID0gd2JmeUpzb25TY2hlbWEucGFyc2UoSlNPTi5wYXJzZSh3YmZ5SnNvblRleHQpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICBjb25zdCBjb25maWc6IFBhY2thZ2VDb25maWcgPSB7XG4gICAgICBkaXJQYXRoLFxuICAgICAgZG9ja2VyZmlsZSxcbiAgICAgIGlzUm9vdCxcbiAgICAgIGlzUHVibGljUmVwbzogcmVwb0luZm8/LnByaXZhdGUgPT09IGZhbHNlLFxuICAgICAgaXNSZWZlcnJlZEJ5T3RoZXJSZXBvOiAhIXBhY2thZ2VKc29uLmZpbGVzLFxuICAgICAgcmVwb3NpdG9yeTogcmVwb0luZm8/LmZ1bGxfbmFtZSA/IGBnaXRodWI6JHtyZXBvSW5mbz8uZnVsbF9uYW1lfWAgOiB1bmRlZmluZWQsXG4gICAgICBpc0J1bjogcm9vdENvbmZpZz8uaXNCdW4gfHwgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ2J1bmZpZy50b21sJykpLFxuICAgICAgaXNFc21QYWNrYWdlOiBlc21QYWNrYWdlLFxuICAgICAgaXNXaWxsQm9vc3RlckNvbmZpZ3M6IHBhY2thZ2VKc29uUGF0aC5pbmNsdWRlcyhgJHtwYXRoLnNlcH13aWxsYm9vc3Rlci1jb25maWdzYCksXG4gICAgICBkb2VzQ29udGFpbnNTdWJQYWNrYWdlSnNvbnM6IGNvbnRhaW5zQW55KCdwYWNrYWdlcy8qKi9wYWNrYWdlLmpzb24nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluc0RvY2tlcmZpbGU6ICEhZG9ja2VyZmlsZSB8fCBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnZG9ja2VyLWNvbXBvc2UueW1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5zR2VtZmlsZTogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ0dlbWZpbGUnKSksXG4gICAgICBkb2VzQ29udGFpbnNHb01vZDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2dvLm1vZCcpKSxcbiAgICAgIGRvZXNDb250YWluc1BhY2thZ2VKc29uOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncGFja2FnZS5qc29uJykpLFxuICAgICAgZG9lc0NvbnRhaW5zUG9ldHJ5TG9jazogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BvZXRyeS5sb2NrJykpLFxuICAgICAgZG9lc0NvbnRhaW5zUG9tWG1sOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncG9tLnhtbCcpKSxcbiAgICAgIGRvZXNDb250YWluc1B1YnNwZWNZYW1sOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncHVic3BlYy55YW1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5zVGVtcGxhdGVZYW1sOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAndGVtcGxhdGUueWFtbCcpKSxcbiAgICAgIGRvZXNDb250YWluc1ZzY29kZVNldHRpbmdzSnNvbjogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy52c2NvZGUnLCAnc2V0dGluZ3MuanNvbicpKSxcbiAgICAgIGRvZXNDb250YWluc0phdmFTY3JpcHQ6IGNvbnRhaW5zQW55KCd7YXBwLHNyYyx0ZXN0cyxzY3JpcHRzfS8qKi8qLntjanMsbWpzLGpzLGpzeH0nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluc1R5cGVTY3JpcHQ6IGNvbnRhaW5zQW55KCd7YXBwLHNyYyx0ZXN0cyxzY3JpcHRzfS8qKi8qLntjdHMsbXRzLHRzLHRzeH0nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluc0pzeE9yVHN4OiBjb250YWluc0FueSgne2FwcCxzcmMsdGVzdHN9LyoqLyoue3Qsan1zeCcsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5zSmF2YVNjcmlwdEluUGFja2FnZXM6IGNvbnRhaW5zQW55KFxuICAgICAgICAncGFja2FnZXMvKiove2FwcCxzcmMsdGVzdHMsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3h9JyxcbiAgICAgICAgZGlyUGF0aFxuICAgICAgKSxcbiAgICAgIGRvZXNDb250YWluc1R5cGVTY3JpcHRJblBhY2thZ2VzOiBjb250YWluc0FueShcbiAgICAgICAgJ3BhY2thZ2VzLyoqL3thcHAsc3JjLHRlc3RzLHNjcmlwdHN9LyoqLyoue2N0cyxtdHMsdHMsdHN4fScsXG4gICAgICAgIGRpclBhdGhcbiAgICAgICksXG4gICAgICBkb2VzQ29udGFpbnNKc3hPclRzeEluUGFja2FnZXM6IGNvbnRhaW5zQW55KCdwYWNrYWdlcy8qKi97YXBwLHNyYyx0ZXN0c30vKiovKi57dCxqfXN4JywgZGlyUGF0aCksXG4gICAgICBkZXBlbmRpbmc6IHtcbiAgICAgICAgYmxpdHo6ICEhZGVwZW5kZW5jaWVzWydibGl0eiddLFxuICAgICAgICBmaXJlYmFzZTogISFkZXZEZXBlbmRlbmNpZXNbJ2ZpcmViYXNlLXRvb2xzJ10sXG4gICAgICAgIGxpdGVzdHJlYW06IGRvY2tlcmZpbGUuaW5jbHVkZXMoJ2luc3RhbGwtbGl0ZXN0cmVhbS5zaCcpLFxuICAgICAgICBuZXh0OiAhIWRlcGVuZGVuY2llc1snbmV4dCddLFxuICAgICAgICBwbGF5d3JpZ2h0VGVzdDpcbiAgICAgICAgICAhIWRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddIHx8XG4gICAgICAgICAgISFkZXZEZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXSB8fFxuICAgICAgICAgICEhZGV2RGVwZW5kZW5jaWVzWydwbGF5d3JpZ2h0J10sXG4gICAgICAgIHByaXNtYTogISFkZXBlbmRlbmNpZXNbJ0BwcmlzbWEvY2xpZW50J10gfHwgISFkZXZEZXBlbmRlbmNpZXNbJ3ByaXNtYSddLFxuICAgICAgICBweXJpZ2h0OiAhIWRldkRlcGVuZGVuY2llc1sncHlyaWdodCddLFxuICAgICAgICByZWFjdE5hdGl2ZTogISFkZXBlbmRlbmNpZXNbJ3JlYWN0LW5hdGl2ZSddLFxuICAgICAgICBzZW1hbnRpY1JlbGVhc2U6ICEhKFxuICAgICAgICAgIGRldkRlcGVuZGVuY2llc1snc2VtYW50aWMtcmVsZWFzZSddIHx8XG4gICAgICAgICAgcmVsZWFzZUJyYW5jaGVzLmxlbmd0aCA+IDAgfHxcbiAgICAgICAgICByZWxlYXNlUGx1Z2lucy5sZW5ndGggPiAwXG4gICAgICAgICksXG4gICAgICAgIHN0b3J5Ym9vazogISFkZXZEZXBlbmRlbmNpZXNbJ0BzdG9yeWJvb2svcmVhY3QnXSxcbiAgICAgICAgd2I6ICEhZGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvd2InXSB8fCAhIWRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3diJ10sXG4gICAgICB9LFxuICAgICAgcmVsZWFzZToge1xuICAgICAgICBicmFuY2hlczogcmVsZWFzZUJyYW5jaGVzLFxuICAgICAgICBnaXRodWI6IHJlbGVhc2VQbHVnaW5zLmluY2x1ZGVzKCdAc2VtYW50aWMtcmVsZWFzZS9naXRodWInKSxcbiAgICAgICAgbnBtOiByZWxlYXNlUGx1Z2lucy5pbmNsdWRlcygnQHNlbWFudGljLXJlbGVhc2UvbnBtJyksXG4gICAgICB9LFxuICAgICAgdmVyc2lvbnNUZXh0LFxuICAgICAgcGFja2FnZUpzb24sXG4gICAgICB3YmZ5SnNvbixcbiAgICB9O1xuICAgIGlmICghY29uZmlnLmlzQnVuKSB7XG4gICAgICBjb25maWcuZXNsaW50QmFzZSA9IGdldEVzbGludEV4dGVuc2lvbkJhc2UoY29uZmlnKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgY29uZmlnLmRvZXNDb250YWluc0dlbWZpbGUgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbnNHb01vZCB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluc1BhY2thZ2VKc29uIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5zUG9ldHJ5TG9jayB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluc1BvbVhtbCB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluc1B1YnNwZWNZYW1sIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5zVGVtcGxhdGVZYW1sXG4gICAgKSB7XG4gICAgICByZXR1cm4gY29uZmlnO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbnRhaW5zQW55KHBhdHRlcm46IHN0cmluZywgZGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBnbG9iYnlTeW5jKHBhdHRlcm4sIHsgZG90OiB0cnVlLCBjd2Q6IGRpclBhdGggfSkubGVuZ3RoID4gMDtcbn1cblxuZXhwb3J0IHR5cGUgRXNsaW50RXh0ZW5zaW9uQmFzZSA9XG4gIHwgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzLXJlYWN0J1xuICB8ICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cydcbiAgfCAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMtcmVhY3QnXG4gIHwgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzJ1xuICB8ICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1uZXh0J1xuICB8ICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1ibGl0ei1uZXh0JztcblxuZnVuY3Rpb24gZ2V0RXNsaW50RXh0ZW5zaW9uQmFzZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBFc2xpbnRFeHRlbnNpb25CYXNlIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHopIHtcbiAgICByZXR1cm4gJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWJsaXR6LW5leHQnO1xuICB9IGVsc2UgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgIHJldHVybiAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctbmV4dCc7XG4gIH0gZWxzZSBpZiAoY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHQpIHtcbiAgICByZXR1cm4gY29uZmlnLmRvZXNDb250YWluc0pzeE9yVHN4ID8gJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzLXJlYWN0JyA6ICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cyc7XG4gIH0gZWxzZSB7XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNKc3hPclRzeCkge1xuICAgICAgcmV0dXJuICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcy1yZWFjdCc7XG4gICAgfSBlbHNlIGlmIChjb25maWcuZG9lc0NvbnRhaW5zSmF2YVNjcmlwdCkge1xuICAgICAgcmV0dXJuICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcyc7XG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoUmVwb0luZm8oZGlyUGF0aDogc3RyaW5nLCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGdpdCA9IHNpbXBsZUdpdChkaXJQYXRoKTtcbiAgY29uc3QgcmVtb3RlcyA9IGF3YWl0IGdpdC5nZXRSZW1vdGVzKHRydWUpO1xuICBjb25zdCBvcmlnaW4gPSByZW1vdGVzLmZpbmQoKHIpID0+IHIubmFtZSA9PT0gJ29yaWdpbicpO1xuICBjb25zdCByZW1vdGVVcmwgPSBvcmlnaW4/LnJlZnM/LmZldGNoID8/IG9yaWdpbj8ucmVmcz8ucHVzaDtcbiAgaWYgKHR5cGVvZiByZW1vdGVVcmwgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QganNvbiA9IGF3YWl0IHJlcXVlc3RSZXBvSW5mbyhyZW1vdGVVcmwpO1xuICAgIGlmIChqc29uKSByZXR1cm4ganNvbjtcbiAgfVxuXG4gIGNvbnN0IHVybCA9IHR5cGVvZiBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5ID09PSAnc3RyaW5nJyA/IHBhY2thZ2VKc29uLnJlcG9zaXRvcnkgOiBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5Py51cmw7XG4gIGlmICh1cmwpIHtcbiAgICBjb25zdCBqc29uID0gYXdhaXQgcmVxdWVzdFJlcG9JbmZvKHVybCk7XG4gICAgaWYgKGpzb24gJiYganNvbi5tZXNzYWdlICE9PSAnTm90IEZvdW5kJykgcmV0dXJuIGpzb247XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVxdWVzdFJlcG9JbmZvKHVybE9yRnVsbE5hbWU6IHN0cmluZyk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgW29yZywgbmFtZV0gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUodXJsT3JGdWxsTmFtZSk7XG4gIGlmICghb3JnIHx8ICFuYW1lKSByZXR1cm47XG5cbiAgY29uc3QgcmV0ID0geyBmdWxsX25hbWU6IGAke29yZ30vJHtuYW1lfWAgfTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG9jdG9raXQucmVxdWVzdCgnR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfScsIHtcbiAgICAgIG93bmVyOiBvcmcsXG4gICAgICByZXBvOiBuYW1lLFxuICAgIH0pO1xuICAgIE9iamVjdC5hc3NpZ24ocmV0LCByZXNwb25zZS5kYXRhKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG4gIHJldHVybiByZXQ7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBpZ25vcmVFcnJvckFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWInO1xuaW1wb3J0IHlhcmdzIGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZml4RG9ja2VyZmlsZSB9IGZyb20gJy4vZml4ZXJzL2RvY2tlcmZpbGUuanMnO1xuaW1wb3J0IHsgZml4UGxheXdyaWdodENvbmZpZyB9IGZyb20gJy4vZml4ZXJzL3BsYXl3cmlnaHRDb25maWcuanMnO1xuaW1wb3J0IHsgZml4UHJpc21hRW52RmlsZXMgfSBmcm9tICcuL2ZpeGVycy9wcmlzbWEuanMnO1xuaW1wb3J0IHsgZml4VGVzdERpcmVjdG9yaWVzVXBkYXRpbmdQYWNrYWdlSnNvbiB9IGZyb20gJy4vZml4ZXJzL3Rlc3REaXJlY3RvcnkuanMnO1xuaW1wb3J0IHsgZml4VHlwZURlZmluaXRpb25zIH0gZnJvbSAnLi9maXhlcnMvdHlwZURlZmluaXRpb24uanMnO1xuaW1wb3J0IHsgZml4VHlwb3MgfSBmcm9tICcuL2ZpeGVycy90eXBvcy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVRvb2xWZXJzaW9ucyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9hc2RmLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlQmlvbWVKc29uYyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9iaW9tZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUJ1bmZpZ1RvbWwgfSBmcm9tICcuL2dlbmVyYXRvcnMvYnVuZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlRG9ja2VyaWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2RvY2tlcmlnbm9yZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUVkaXRvcmNvbmZpZyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9lZGl0b3Jjb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVFc2xpbnRpZ25vcmUgfSBmcm9tICcuL2dlbmVyYXRvcnMvZXNsaW50aWdub3JlLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlRXNsaW50cmMgfSBmcm9tICcuL2dlbmVyYXRvcnMvZXNsaW50cmMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dpdGF0dHJpYnV0ZXMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVHaXRpZ25vcmUgfSBmcm9tICcuL2dlbmVyYXRvcnMvZ2l0aWdub3JlLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlSHVza3lyY1VwZGF0aW5nUGFja2FnZUpzb24gfSBmcm9tICcuL2dlbmVyYXRvcnMvaHVza3lyYy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUlkZWFTZXR0aW5ncyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9pZGVhLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlTGVmdGhvb2tVcGRhdGluZ1BhY2thZ2VKc29uIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2xlZnRob29rLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlTGludHN0YWdlZHJjIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2xpbnRzdGFnZWRyYy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZU5leHRDb25maWdKc29uIH0gZnJvbSAnLi9nZW5lcmF0b3JzL25leHRjb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVQYWNrYWdlSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9wYWNrYWdlSnNvbi5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVByZXR0aWVyaWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3ByZXR0aWVyaWdub3JlLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24gfSBmcm9tICcuL2dlbmVyYXRvcnMvcHlyaWdodGNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJlYWRtZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9yZWFkbWUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVSZWxlYXNlcmMgfSBmcm9tICcuL2dlbmVyYXRvcnMvcmVsZWFzZXJjLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUmVub3ZhdGVKc29uIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3Jlbm92YXRlcmMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVUc2NvbmZpZyB9IGZyb20gJy4vZ2VuZXJhdG9ycy90c2NvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVZzY29kZVNldHRpbmdzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3ZzY29kZVNldHRpbmdzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlV29ya2Zsb3dzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3dvcmtmbG93LmpzJztcbmltcG9ydCB7IGdlbmVyYXRlWWFybnJjWW1sIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3lhcm5yYy5qcyc7XG5pbXBvcnQgeyBzZXR1cExhYmVscyB9IGZyb20gJy4vZ2l0aHViL2xhYmVsLmpzJztcbmltcG9ydCB7IHNldHVwU2VjcmV0cyB9IGZyb20gJy4vZ2l0aHViL3NlY3JldC5qcyc7XG5pbXBvcnQgeyBzZXR1cEdpdEh1YlNldHRpbmdzIH0gZnJvbSAnLi9naXRodWIvc2V0dGluZ3MuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMgfSBmcm9tICcuL2dpdGh1Yi90ZW1wbGF0ZS5qcyc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi9vcHRpb25zLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZXRQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMgfSBmcm9tICcuL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5cbmFzeW5jIGZ1bmN0aW9uIG1haW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGFyZ3YgPSBhd2FpdCB5YXJncyhwcm9jZXNzLmFyZ3Yuc2xpY2UoMikpXG4gICAgLmNvbW1hbmQoJyQwIFtwYXRocy4uXScsICdNYWtlIGEgZ2l2ZW4gcHJvamVjdCBmb2xsb3cgdGhlIFdpbGxCb29zdGVyIHN0YW5kYXJkJywgKHlhcmdzKSA9PiB7XG4gICAgICB5YXJncy5wb3NpdGlvbmFsKCdwYXRocycsIHtcbiAgICAgICAgZGVzY3JpYmU6ICdwcm9qZWN0IHBhdGhzIHRvIGJlIHdiZmllZCcsXG4gICAgICAgIGFycmF5OiB0cnVlLFxuICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgZGVmYXVsdDogWycuJ10sXG4gICAgICB9KTtcbiAgICB9KVxuICAgIC5vcHRpb25zKHtcbiAgICAgIGVudjoge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ1VwbG9hZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXMgc2VjcmV0cyB0byBHaXRIdWInLFxuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICBhbGlhczogJ2UnLFxuICAgICAgfSxcbiAgICAgIHNraXBEZXBzOiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiAnU2tpcCBkZXBlbmRlbmN5IGluc3RhbGxhdGlvbicsXG4gICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgIGFsaWFzOiAnZCcsXG4gICAgICB9LFxuICAgICAgdmVyYm9zZToge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgb3Igbm90IHRvIGVuYWJsZSB2ZXJib3NlIG1vZGUnLFxuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICBhbGlhczogJ3YnLFxuICAgICAgfSxcbiAgICB9KVxuICAgIC5zdHJpY3QoKS5hcmd2O1xuICBvcHRpb25zLmlzVmVyYm9zZSA9IGFyZ3YudmVyYm9zZTtcbiAgb3B0aW9ucy5kb2VzVXBsb2FkRW52VmFycyA9IGFyZ3YuZW52O1xuXG4gIGZvciAoY29uc3Qgcm9vdERpclBhdGggb2YgYXJndi5wYXRocyBhcyBzdHJpbmdbXSkge1xuICAgIGNvbnN0IHBhY2thZ2VzRGlyUGF0aCA9IHBhdGguam9pbihyb290RGlyUGF0aCwgJ3BhY2thZ2VzJyk7XG4gICAgY29uc3QgZGlyZW50cyA9IChhd2FpdCBpZ25vcmVFcnJvckFzeW5jKCgpID0+IGZzLnJlYWRkaXIocGFja2FnZXNEaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpKSA/PyBbXTtcbiAgICBjb25zdCBzdWJEaXJQYXRocyA9IGRpcmVudHMuZmlsdGVyKChkKSA9PiBkLmlzRGlyZWN0b3J5KCkpLm1hcCgoZCkgPT4gcGF0aC5qb2luKHBhY2thZ2VzRGlyUGF0aCwgZC5uYW1lKSk7XG5cbiAgICBhd2FpdCBmaXhUZXN0RGlyZWN0b3JpZXNVcGRhdGluZ1BhY2thZ2VKc29uKFtyb290RGlyUGF0aCwgLi4uc3ViRGlyUGF0aHNdKTtcblxuICAgIGNvbnN0IHJvb3RDb25maWcgPSBhd2FpdCBnZXRQYWNrYWdlQ29uZmlnKHJvb3REaXJQYXRoKTtcbiAgICBpZiAoIXJvb3RDb25maWcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYHRoZXJlIGlzIG5vIHZhbGlkIHBhY2thZ2UuanNvbiBpbiAke3Jvb3REaXJQYXRofWApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGFiYnJldmlhdGlvblByb21pc2UgPSBmaXhUeXBvcyhyb290Q29uZmlnKTtcblxuICAgIGNvbnN0IG51bGxhYmxlU3ViUGFja2FnZUNvbmZpZ3MgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHN1YkRpclBhdGhzLm1hcCgoc3ViRGlyUGF0aCkgPT4gZ2V0UGFja2FnZUNvbmZpZyhzdWJEaXJQYXRoLCByb290Q29uZmlnKSlcbiAgICApO1xuICAgIGNvbnN0IHN1YlBhY2thZ2VDb25maWdzID0gbnVsbGFibGVTdWJQYWNrYWdlQ29uZmlncy5maWx0ZXIoKGNvbmZpZykgPT4gISFjb25maWcpIGFzIFBhY2thZ2VDb25maWdbXTtcbiAgICBjb25zdCBhbGxQYWNrYWdlQ29uZmlncyA9IFtyb290Q29uZmlnLCAuLi5zdWJQYWNrYWdlQ29uZmlnc107XG5cbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGZvciAoY29uc3QgY29uZmlnIG9mIGFsbFBhY2thZ2VDb25maWdzKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhjb25maWcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEluc3RhbGwgdG9vbHMgdmlhIGFzZGYgYXQgZmlyc3RcbiAgICBhd2FpdCBnZW5lcmF0ZVRvb2xWZXJzaW9ucyhyb290Q29uZmlnKTtcbiAgICAvLyBJbnN0YWxsIHlhcm4gYmVycnlcbiAgICBhd2FpdCBnZW5lcmF0ZVlhcm5yY1ltbChyb290Q29uZmlnKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBmaXhEb2NrZXJmaWxlKHJvb3RDb25maWcpLFxuICAgICAgZml4UHJpc21hRW52RmlsZXMocm9vdENvbmZpZyksXG4gICAgICBhYmJyZXZpYXRpb25Qcm9taXNlLnRoZW4oKCkgPT4gZ2VuZXJhdGVSZWFkbWUocm9vdENvbmZpZykpLFxuICAgICAgZ2VuZXJhdGVEb2NrZXJpZ25vcmUocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUVkaXRvcmNvbmZpZyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlR2l0YXR0cmlidXRlcyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlR2l0SHViVGVtcGxhdGVzKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVJZGVhU2V0dGluZ3Mocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZVJlbm92YXRlSnNvbihyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlUmVsZWFzZXJjKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVXb3JrZmxvd3Mocm9vdENvbmZpZyksXG4gICAgICBzZXR1cExhYmVscyhyb290Q29uZmlnKSxcbiAgICAgIHNldHVwU2VjcmV0cyhyb290Q29uZmlnKSxcbiAgICAgIHNldHVwR2l0SHViU2V0dGluZ3Mocm9vdENvbmZpZyksXG4gICAgICAuLi4ocm9vdENvbmZpZy5pc0J1blxuICAgICAgICA/IFtcbiAgICAgICAgICAgIGdlbmVyYXRlQnVuZmlnVG9tbChyb290Q29uZmlnKSxcbiAgICAgICAgICAgIGdlbmVyYXRlSHVza3lyY1VwZGF0aW5nUGFja2FnZUpzb24ocm9vdENvbmZpZykudGhlbigoKSA9PiBnZW5lcmF0ZUxlZnRob29rVXBkYXRpbmdQYWNrYWdlSnNvbihyb290Q29uZmlnKSksXG4gICAgICAgICAgXVxuICAgICAgICA6IFtnZW5lcmF0ZUh1c2t5cmNVcGRhdGluZ1BhY2thZ2VKc29uKHJvb3RDb25maWcpXSksXG4gICAgICBnZW5lcmF0ZUxpbnRzdGFnZWRyYyhyb290Q29uZmlnKSxcbiAgICBdKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG5cbiAgICBjb25zdCBwcm9taXNlczogUHJvbWlzZTx2b2lkPltdID0gW107XG4gICAgZm9yIChjb25zdCBjb25maWcgb2YgYWxsUGFja2FnZUNvbmZpZ3MpIHtcbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdEluUGFja2FnZXMpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChmaXhUeXBlRGVmaW5pdGlvbnMoY29uZmlnLCBjb25maWcuaXNSb290ID8gYWxsUGFja2FnZUNvbmZpZ3MgOiBbY29uZmlnXSkpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChmaXhQbGF5d3JpZ2h0Q29uZmlnKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlTmV4dENvbmZpZ0pzb24oY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBhd2FpdCBnZW5lcmF0ZUdpdGlnbm9yZShjb25maWcsIHJvb3RDb25maWcpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICAgICAgaWYgKCFjb25maWcuaXNSb290ICYmICFjb25maWcuZG9lc0NvbnRhaW5zUGFja2FnZUpzb24pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBhd2FpdCBnZW5lcmF0ZVByZXR0aWVyaWdub3JlKGNvbmZpZyk7XG4gICAgICBhd2FpdCBnZW5lcmF0ZVBhY2thZ2VKc29uKGNvbmZpZywgcm9vdENvbmZpZywgYXJndi5za2lwRGVwcyk7XG5cbiAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVMaW50c3RhZ2VkcmMoY29uZmlnKSk7XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc1ZzY29kZVNldHRpbmdzSnNvbiAmJiBjb25maWcuZG9lc0NvbnRhaW5zUGFja2FnZUpzb24pIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZVZzY29kZVNldHRpbmdzKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlVHNjb25maWcoY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIGNvbmZpZy5kb2VzQ29udGFpbnNKYXZhU2NyaXB0IHx8XG4gICAgICAgIGNvbmZpZy5kb2VzQ29udGFpbnNKYXZhU2NyaXB0SW5QYWNrYWdlcyB8fFxuICAgICAgICBjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdCB8fFxuICAgICAgICBjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdEluUGFja2FnZXNcbiAgICAgICkge1xuICAgICAgICBpZiAocm9vdENvbmZpZy5pc0J1bikge1xuICAgICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVCaW9tZUpzb25jKGNvbmZpZykpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcm9vdENvbmZpZy5pc1dpbGxCb29zdGVyQ29uZmlncykge1xuICAgICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVFc2xpbnRyYyhjb25maWcsIHJvb3RDb25maWcpKTtcbiAgICAgICAgfVxuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlRXNsaW50aWdub3JlKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHlyaWdodCkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24oY29uZmlnKSk7XG4gICAgICB9XG4gICAgfVxuICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG5cbiAgICBjb25zdCBwYWNrYWdlTWFuYWdlciA9IHJvb3RDb25maWcuaXNCdW4gPyAnYnVuJyA6ICd5YXJuJztcbiAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnY2xlYW51cCddLCByb290RGlyUGF0aCk7XG4gICAgLy8gJ3lhcm4gaW5zdGFsbCcgc2hvdWxkIGJlIGFmdGVyIGB5YXJuIGNsZWFudXBgIGJlY2F1c2UgeWFybiBiZXJyeSBnZW5lcmF0ZXMgeWFybi5sb2NrXG4gICAgLy8gY29ycmVzcG9uZGluZyB0byB0aGUgY29udGVudHMgb2YgZGVwZW5kYW50IHN1Yi1wYWNrYWdlIGluIG1vbm9yZXBvXG4gICAgaWYgKHJvb3RDb25maWcuaXNCdW4pIHtcbiAgICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWyd1cGRhdGUnXSwgcm9vdERpclBhdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnaW5zdGFsbCddLCByb290RGlyUGF0aCk7XG4gICAgfVxuICB9XG59XG5cbmF3YWl0IG1haW4oKTtcbiJdLCJuYW1lcyI6WyJvcHRpb25zIiwiY29uc3RydWN0b3IiLCJ0aGlzIiwiaXNWZXJib3NlIiwiZG9lc1VwbG9hZEVudlZhcnMiLCJsb2dnZXIiLCJmdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uIiwibmFtZSIsImZ1bmMiLCJjb25zb2xlIiwiaW5mbyIsImVycm9yIiwiRXJyb3IiLCJzdGFjayIsImFzeW5jIiwiZml4RG9ja2VyZmlsZSIsImNvbmZpZyIsImRvZXNDb250YWluc0RvY2tlcmZpbGUiLCJvbGRDb250ZW50IiwiZG9ja2VyZmlsZSIsIm5ld0NvbnRlbnQiLCJmcyIsIndyaXRlRmlsZSIsInBhdGgiLCJqb2luIiwiZGlyUGF0aCIsImZpeFBsYXl3cmlnaHRDb25maWciLCJmaWxlUGF0aCIsImV4aXN0c1N5bmMiLCJwcm9taXNlcyIsInJlYWRGaWxlIiwicmVwbGFjZSIsImZpeFByaXNtYUVudkZpbGVzIiwiZW52RmlsZXMiLCJnbG9iYnkiLCJkb3QiLCJjd2QiLCJlbnZGaWxlIiwiZW52RmlsZVBhdGgiLCJyZXNvbHZlIiwiZml4VGVzdERpcmVjdG9yaWVzVXBkYXRpbmdQYWNrYWdlSnNvbiIsInBhY2thZ2VEaXJQYXRocyIsIlByb21pc2UiLCJhbGwiLCJtYXAiLCJvbGRUZXN0RGlyUGF0aCIsInBhY2thZ2VEaXJQYXRoIiwibmV3VGVzdERpclBhdGgiLCJyZW5hbWUiLCJyZXBsYWNlQWxsIiwicHJvbWlzZVBvb2wiLCJQcm9taXNlUG9vbCIsImZpeFR5cGVEZWZpbml0aW9ucyIsImNvbmZpZ3NJbmNsdWRpbmdDaGlsZHJlbiIsImxpYlR5cGVEaXJQYXRoIiwic3JjVHlwZURpclBhdGgiLCJpc1Jvb3QiLCJkb2VzQ29udGFpbnNTdWJQYWNrYWdlSnNvbnMiLCJ1bmRlZmluZWQiLCJkaXJlbnRzIiwiaWdub3JlRW5vZW50QXN5bmMiLCJyZWFkZGlyIiwid2l0aEZpbGVUeXBlcyIsImRpcmVudCIsImRpck5hbWUiLCJzbGljZSIsImhhc1R5cGVEZWNsYXJhdGlvbkV4dGVuc2lvbiIsImVuZHNXaXRoIiwicGFja2FnZU5hbWUiLCJpbmNsdWRlcyIsImhhc0xpYnJhcnkiLCJzb21lIiwicGFja2FnZUpzb24iLCJkZXBlbmRlbmNpZXMiLCJkZXZEZXBlbmRlbmNpZXMiLCJpc0ZpbGUiLCJta2RpciIsInJ1biIsInJlY3Vyc2l2ZSIsImlzRGlyZWN0b3J5IiwiZnNVdGlsIiwicmVhZEZpbGVJZ25vcmluZ0Vycm9yIiwiZnNwIiwiZ2VuZXJhdGVGaWxlIiwiY29udGVudCIsImZpeFR5cG9zIiwicGFja2FnZUNvbmZpZyIsImRvY0ZpbGVzIiwiZ2l0aWdub3JlIiwibGVuZ3RoIiwibWRGaWxlIiwiZml4QWJicmV2aWF0aW9uc0luVGV4dCIsInJlcGxhY2VXaXRoQ29uZmlnIiwidHNGaWxlcyIsInRzRmlsZSIsInRleHRCYXNlZEZpbGVzIiwiZmlsZSIsInByb21pc2VBbGwiLCJwcm9wTmFtZSIsImJlZm9yZSIsImFmdGVyIiwiT2JqZWN0IiwiZW50cmllcyIsIndiZnlKc29uIiwidHlwb3MiLCJ0b2tlbiIsInByb2Nlc3MiLCJlbnYiLCJHSF9CT1RfUEFUIiwiUFVCTElDX0dIX0JPVF9QQVQiLCJHSF9UT0tFTiIsIkdJVEhVQl9UT0tFTiIsImhhc0dpdEh1YlRva2VuIiwib2N0b2tpdCIsIk9jdG9raXQiLCJhdXRoIiwiZ2l0SHViVXRpbCIsImdldE9yZ0FuZE5hbWUiLCJ1cmxPckZ1bGxOYW1lIiwidXJsV2l0aG91dFByb3RvY29sIiwic3BsaXQiLCJhdCIsIm5hbWVzIiwic3Bhd25TeW5jIiwiY29tbWFuZCIsImFyZ3MiLCJyZXRyeSIsIm5ld0NtZCIsIm5ld0FyZ3MiLCJnZXRTcGF3blN5bmNBcmdzIiwiY2hpbGRfcHJvY2VzcyIsInN0YXR1cyIsInNwYXduU3luY1dpdGhTdHJpbmdSZXN1bHQiLCJzdGRpbyIsInByb2MiLCJzdGRlcnIiLCJ0b1N0cmluZyIsInRyaW0iLCJzIiwic3Rkb3V0IiwiUEFUSCIsIkJFUlJZX0JJTl9GT0xERVIiLCJBU0RGX0RJUiIsInNoZWxsIiwiY29udmVydFZlcnNpb25JbnRvTnVtYmVyIiwidmVyc2lvbiIsIm51bWJlcnMiLCJOdW1iZXIiLCJmaWx0ZXIiLCJudW0iLCJpc05hTiIsInZlcnNpb25OdW1iZXIiLCJkaXZpc29yIiwiUFlUSE9OX1ZFUlNJT04iLCJKQVZBX1ZFUlNJT04iLCJCTElUWl9WRVJTSU9OIiwiTkVYVF9WRVJTSU9OIiwiZ2VuZXJhdGVUb29sVmVyc2lvbnMiLCJ2ZXJzaW9uc1RleHQiLCJkdXBsaWNhdGFibGVMaW5lcyIsImxpbmUiLCJDT1JFX1RPT0xTIiwiaGFzIiwic29ydCIsImxpbmVzIiwiU2V0IiwiZG9lc0NvbnRhaW5zUG9ldHJ5TG9jayIsInJlc3BvbnNlIiwiZmV0Y2giLCJqc29uIiwicG9ldHJ5VmVyc2lvbiIsInVwZGF0ZVZlcnNpb24iLCJkZXBlbmRpbmciLCJmaXJlYmFzZSIsImRvZXNDb250YWluc1BhY2thZ2VKc29uIiwiaXNCdW4iLCJsZWZ0aG9va1ZlcnNpb24iLCJnZXRMYXRlc3RWZXJzaW9uRnJvbVRhZ09uR2l0SHViIiwiYnVuVmVyc2lvbiIsInByZWZpeCIsIkRFUFJFQ0FURURfVkVSU0lPTl9QUkVGSVhFUyIsInZlcnNpb25QYXRoIiwicm0iLCJmb3JjZSIsInRvb2xWZXJzaW9uc1BhdGgiLCJjb3JlIiwidG9vbE5hbWUiLCJuZXdWZXJzaW9uIiwiaGVhZCIsImluZGV4IiwiZmluZEluZGV4IiwibCIsIm5ld0xpbmUiLCJzcGxpY2UiLCJvcmdhbml6YXRpb24iLCJyZXBvc2l0b3J5IiwicmVxdWVzdCIsIm93bmVyIiwicmVwbyIsImRhdGEiLCJ0YWdfbmFtZSIsImxhc3RJbmRleE9mIiwidmVyc2lvbk51bWJlclRleHQiLCJ0ZXN0Iiwib3ZlcndyaXRlTWVyZ2UiLCJkZXN0aW5hdGlvbkFycmF5Iiwic291cmNlQXJyYXkiLCJjb21iaW5lTWVyZ2UiLCJ0YXJnZXQiLCJzb3VyY2UiLCJkZXN0aW5hdGlvbiIsIml0ZW0iLCJjbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZCIsImlzTWVyZ2VhYmxlT2JqZWN0IiwibWVyZ2UiLCJwdXNoIiwianNvbk9iaiIsIiRzY2hlbWEiLCJleHRlbmRzIiwiZ2VuZXJhdGVCaW9tZUpzb25jIiwibmV3U2V0dGluZ3MiLCJjbG9uZURlZXAiLCJvbGRTZXR0aW5ncyIsIkpTT04iLCJwYXJzZSIsImFycmF5TWVyZ2UiLCJzdHJpbmdpZnkiLCJnZW5lcmF0ZUJ1bmZpZ1RvbWwiLCJ1c2VyQ29udGVudEhlYWRlciIsInVzZXJDb250ZW50SGVhZGVyUmVnZXgiLCJzZXBhcmF0b3IiLCJkZWZhdWx0SGVhZFVzZXJDb250ZW50IiwiZGVmYXVsdFRhaWxVc2VyQ29udGVudCIsImlnbm9yZUZpbGVVdGlsIiwic2VwYXJhdG9yUHJlZml4IiwicmVhZEdpdGlnbm9yZVdpdGhvdXRTZXBhcmF0b3JzIiwibGFzdEhlYWRlckluZGV4IiwiZ2V0SW5kZXhPZlRhaWxVc2VyQ29udGVudEhlYWRlciIsImdldEhlYWRVc2VyQ29udGVudCIsImluZGV4T2YiLCJnZXRUYWlsVXNlckNvbnRlbnQiLCJpc0JlcnJ5WmVyb0luc3RhbGxFbmFibGVkIiwibGFzdEluZGV4IiwiZ2VuZXJhdGVEb2NrZXJpZ25vcmUiLCJleHRlbnNpb25zIiwiY29kZVdpdGgySW5kZW50U2l6ZSIsImNvZGVXaXRoNEluZGVudFNpemUiLCJjb2RlV2l0aDhJbmRlbnRTaXplIiwibWFya2Rvd25MaWtlIiwiZXNsaW50IiwicHJldHRpZXIiLCJiaW9tZSIsImdlbmVyYXRlRXh0ZW5zaW9ucyIsImdlbmVyYXRlRWRpdG9yY29uZmlnIiwiZ2VuZXJhdGVFc2xpbnRpZ25vcmUiLCJoZWFkVXNlckNvbnRlbnQiLCJ0YWlsVXNlckNvbnRlbnQiLCJnaXRpZ25vcmVGaWxlUGF0aCIsImdlbmVyYXRlRXNsaW50cmMiLCJyb290Q29uZmlnIiwiYmFzZXMiLCJlc2xpbnRCYXNlIiwicm9vdCIsImV4dCIsInN0YXJ0c1dpdGgiLCJuZXdFeHRlbmRzIiwiYmxpdHoiLCJnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMiLCJkZWZhdWx0TmFtZXMiLCJnZW5lcmF0ZUdpdGlnbm9yZSIsImRvZXNDb250YWluc0dlbWZpbGUiLCJkb2VzQ29udGFpbnNHb01vZCIsImJhc2VuYW1lIiwiZG9lc0NvbnRhaW5zUG9tWG1sIiwiZG9lc0NvbnRhaW5zUHVic3BlY1lhbWwiLCJkb2VzQ29udGFpbnNUZW1wbGF0ZVlhbWwiLCJuZXh0IiwicHJpc21hIiwicGxheXdyaWdodFRlc3QiLCJyZWFjdE5hdGl2ZSIsInN0b3J5Ym9vayIsImxpdGVzdHJlYW0iLCJnZW5lcmF0ZWQiLCJyZWFkQ2FjaGUiLCJ1cmwiLCJyZXNwb25zZVRleHQiLCJ0ZXh0Iiwib2siLCJ3cml0ZUNhY2hlIiwib3MiLCJob21lZGlyIiwic3RhdCIsIkRhdGUiLCJub3ciLCJtdGltZU1zIiwiZ2V0TGF0ZXN0Q29tbWl0SGFzaCIsImNvbW1pdHMiLCJwZXJfcGFnZSIsInNoYSIsIkVzbGludFV0aWwiLCJnZXRMaW50Rml4U3VmZml4IiwiZG9lc0NvbnRhaW5zSnN4T3JUc3giLCJzcmNEaXJlY3RvcmllcyIsIm5vZGUiLCJnZXRTcmNEaXJzIiwianNDb21tb25EZXBzIiwidHNDb21tb25EZXBzIiwicmVhY3RDb21tb25EZXBzIiwiZXNsaW50RGVwcyIsImdlbmVyYXRlUGFja2FnZUpzb24iLCJza2lwQWRkaW5nRGVwcyIsImpzb25UZXh0Iiwic2NyaXB0cyIsInBlZXJEZXBlbmRlbmNpZXMiLCJhdXRob3IiLCJpc1dpbGxCb29zdGVyQ29uZmlncyIsImRlcHMiLCJ2YWx1ZXMiLCJkZXAiLCJyZW1vdmVEZXByZWNhdGVkU3R1ZmYiLCJrZXkiLCJ2YWx1ZSIsImdlbmVyYXRlU2NyaXB0cyIsInByZXR0aWZ5IiwiZXhpc3RpbmdDb250ZW50Iiwib3JpZ2luYWxDb250ZW50IiwiZ2VuZXJhdGVQcmV0dGllclN1ZmZpeCIsInBvZXRyeURldkRlcGVuZGVuY2llcyIsInByZXBhcmUiLCJwb3N0aW5zdGFsbCIsImlzUHVibGljUmVwbyIsImlzUmVmZXJyZWRCeU90aGVyUmVwbyIsInByZXBhY2siLCJwb3N0cGFjayIsInNlbWFudGljUmVsZWFzZSIsIndvcmtzcGFjZXMiLCJBcnJheSIsImlzQXJyYXkiLCJ3b3Jrc3BhY2UiLCJnbG9iYnlTeW5jIiwid2IiLCJkb2VzQ29udGFpbnNKYXZhU2NyaXB0IiwiZG9lc0NvbnRhaW5zSmF2YVNjcmlwdEluUGFja2FnZXMiLCJkb2VzQ29udGFpbnNUeXBlU2NyaXB0IiwiZG9lc0NvbnRhaW5zVHlwZVNjcmlwdEluUGFja2FnZXMiLCJwcml2YXRlIiwibGljZW5zZSIsInB1Ymxpc2hDb25maWciLCJhY2Nlc3MiLCJtYWluIiwicmVzb2x1dGlvbnMiLCJsaW50IiwiY2xlYW51cCIsImRpcnMiLCJkaXIiLCJmb3JtYXQiLCJweXRob25GaWxlcyIsImlnbm9yZSIsImRpck5hbWVTZXQiLCJweXRob25GaWxlIiwiZmlyc3QiLCJzZWNvbmQiLCJhZGQiLCJzaXplIiwiZGlyTmFtZXNTdHIiLCJkIiwia2V5cyIsInBhY2thZ2VOYW1lcyIsImNvbW1pdEhhc2giLCJ1cGRhdGVQcml2YXRlUGFja2FnZXMiLCJuZXdKc29uVGV4dCIsIm9sZEFuZE5ld1NjcmlwdE5hbWVzIiwib2xkTmFtZSIsIm5ld05hbWUiLCJmaWxlcyIsImZpeFNjcmlwdE5hbWVzIiwicGFja2FnZU1hbmFnZXIiLCJ0eXBlY2hlY2siLCJvbGRUZXN0IiwicHlyaWdodCIsInByZUNvbW1pdCIsInByZVB1c2giLCJwcmVQdXNoRm9yTGFiIiwicG9zdE1lcmdlIiwiZ2VuZXJhdGVIdXNreXJjVXBkYXRpbmdQYWNrYWdlSnNvbiIsInBhY2thZ2VKc29uUGF0aCIsInByZUNvbW1pdEZpbGVQYXRoIiwibW9kZSIsInBvc3RNZXJnZUNvbW1hbmQiLCJnZW5lcmF0ZVBvc3RNZXJnZUNvbW1hbmRzIiwicG9zdE1lcmdlQ29tbWFuZHMiLCJTdHJpbmciLCJyYXciLCJpbnN0YWxsQ29tbWFuZCIsInJtTmV4dERpcmVjdG9yeSIsImNyZWF0ZVRhc2tPcHRpb25zIiwicnVubmVyIiwiZXh0ZW5zaW9uIiwicHJldHRpZXJDb250ZW50IiwiYmlvbWVDb250ZW50IiwiZ2VuZXJhdGVJZGVhU2V0dGluZ3MiLCJjb21tYW5kcyIsImdsb2IiLCJnZW5lcmF0ZUxlZnRob29rVXBkYXRpbmdQYWNrYWdlSnNvbiIsInlhbWwiLCJkdW1wIiwibGluZVdpZHRoIiwibm9Db21wYXRNb2RlIiwic3R5bGVzIiwibWtkaXJTeW5jIiwiZ2VuZXJhdGVMaW50c3RhZ2VkcmMiLCJwYWNrYWdlUHJlZml4IiwiZ2V0RXNsaW50S2V5IiwicGFja2FnZXNGaWx0ZXIiLCJnZXRFc2xpbnRGaWx0ZXJGb3JQcmV0dGllciIsImdlbmVyYXRlTmV4dENvbmZpZ0pzb24iLCJmaW5kIiwicCIsIl8iLCJzZXR0aW5nc1RleHQiLCJnZW5lcmF0ZVByZXR0aWVyaWdub3JlIiwiZ2l0aWdub3JlQ29udGVudCIsImFkZGl0aW9uYWxDb250ZW50IiwidmVudlBhdGgiLCJ2ZW52IiwiZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbiIsImdlbmVyYXRlUmVhZG1lIiwiaW5zZXJ0QmFkZ2UiLCJmaWxlTmFtZXMiLCJyZWFkZGlyU3luYyIsImZpbGVOYW1lIiwiYmFkZ2VOYW1lIiwidG9VcHBlckNhc2UiLCJiYWRnZSIsInJlYWRtZSIsImkiLCJnZW5lcmF0ZVJlbGVhc2VyYyIsInNldHRpbmdzIiwicGx1Z2lucyIsInBsdWdpbiIsIm9sZENvbmZpZyIsInByZXNldCIsInN1Y2Nlc3NDb21tZW50IiwiZmFpbENvbW1lbnQiLCJsYWJlbHMiLCJyZWxlYXNlZExhYmVscyIsImdlbmVyYXRlUmVub3ZhdGVKc29uIiwicGFja2FnZVJ1bGVzIiwicnVsZSIsImVuYWJsZWQiLCJzb3J0S2V5cyIsIm9iaiIsImtleUFuZFZhbHVlcyIsImtleTEiLCJrZXkyIiwibG9jYWxlQ29tcGFyZSIsInJvb3RKc29uT2JqIiwiY29tcGlsZXJPcHRpb25zIiwibW9kdWxlIiwibW9kdWxlUmVzb2x1dGlvbiIsImpzeCIsImFsd2F5c1N0cmljdCIsInN0cmljdCIsInNraXBMaWJDaGVjayIsImFsbG93U3ludGhldGljRGVmYXVsdEltcG9ydHMiLCJlc01vZHVsZUludGVyb3AiLCJyZXNvbHZlSnNvbk1vZHVsZSIsImRlY2xhcmF0aW9uIiwic291cmNlTWFwIiwiaW1wb3J0SGVscGVycyIsIm91dERpciIsInR5cGVSb290cyIsImluY2x1ZGUiLCJzdWJKc29uT2JqIiwiZ2VuZXJhdGVUc2NvbmZpZyIsImRvZXNDb250YWluc0pzeE9yVHN4SW5QYWNrYWdlcyIsImlzRXNtUGFja2FnZSIsImV4cGVyaW1lbnRhbERlY29yYXRvcnMiLCJleGNsdWRlRmlsZVBhdHRlcm5zIiwiZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyIsImV4Y2x1ZGVGaWxlUGF0dGVybiIsImV4Y2x1ZGVTZXR0aW5nIiwid29ya2Zsb3dzIiwib24iLCJwdWxsX3JlcXVlc3QiLCJicmFuY2hlcyIsImNvbmN1cnJlbmN5IiwiZ3JvdXAiLCJqb2JzIiwidXNlcyIsInJlbGVhc2UiLCJ3YmZ5Iiwid29ya2Zsb3dfZGlzcGF0Y2giLCJwdWxsX3JlcXVlc3RfdGFyZ2V0IiwidHlwZXMiLCJzeW5jIiwiaXNzdWVzIiwic2VjcmV0cyIsIkRJU0NPUkRfV0VCSE9PS19VUkwiLCJHSF9QUk9KRUNUX1VSTCIsIndpdGgiLCJsYWJlbGVkIiwiZ2VuZXJhdGVXb3JrZmxvd3MiLCJ3b3JrZmxvd3NQYXRoIiwic2VtYW50aWNZbWxQYXRoIiwiZmlsZU5hbWVTZXQiLCJraW5kIiwid3JpdGVXb3JrZmxvd1lhbWwiLCJsb2FkIiwibW92ZVRvQm90dG9tIiwiam9iIiwibm9ybWFsaXplSm9iIiwic2NoZWR1bGUiLCJicmFuY2giLCJzZXRTY2hlZHVsZSIsIm1pZ3JhdGVXb3JrZmxvdyIsIndyaXRlWWFtbCIsInBhcmFtcyIsInN5bmNfcGFyYW1zX3dpdGhvdXRfZGVzdCIsIm5wbSIsInNlcnZlcl91cmwiLCJtaWdyYXRlSm9iIiwibmV3U2VjcmV0cyIsImluY2x1c2l2ZU1pbkhvdXJKc3QiLCJleGNsdXNpdmVNYXhIb3VySnN0IiwibWludXRlVXRjIiwiaG91clV0YyIsImNyb24iLCJpc0ludGVnZXIiLCJob3VySnN0IiwiTWF0aCIsImZsb29yIiwicmFuZG9tIiwieWFtbFRleHQiLCJnZW5lcmF0ZVlhcm5yY1ltbCIsInlhcm5yY1ltbFBhdGgiLCJjdXJyZW50VmVyc2lvbiIsImxhdGVzdFZlcnNpb24iLCJ2ZXJzaW9uc0pzb24iLCJnZXRMYXRlc3RWZXJzaW9uIiwiZ2V0TWFqb3JOdW1iZXIiLCJyZWxlYXNlc1BhdGgiLCJ5YXJucmNQYXRoIiwiZGVmYXVsdFNlbXZlclJhbmdlUHJlZml4Iiwibm9kZUxpbmtlciIsIm5tTW9kZSIsImNvbXByZXNzaW9uTGV2ZWwiLCJpbmplY3RFbnZpcm9ubWVudEZpbGVzIiwiZW5hYmxlR2xvYmFsQ2FjaGUiLCJvcmlnaW5hbExlbmd0aCIsInBsdWdpblBhdGgiLCJtYWpvciIsInNldHVwTGFiZWxzIiwic2V0dXBMYWJlbCIsImRlbGV0ZUxhYmVsIiwid2FybiIsImNvbG9yIiwiZGVwcmVjYXRlZFNlY3JldE5hbWVzIiwic2V0dXBTZWNyZXRzIiwicGFyc2VkIiwiZG90ZW52Iiwic2VjcmV0TmFtZSIsInNlY3JldF9uYW1lIiwia2V5X2lkIiwia2V5SWQiLCJzb2RpdW0iLCJyZWFkeSIsInNlY3JldCIsInJhd0tleSIsImZyb21fYmFzZTY0IiwiYmFzZTY0X3ZhcmlhbnRzIiwiT1JJR0lOQUwiLCJyYXdTZWMiLCJmcm9tX3N0cmluZyIsImVuY0J5dGVzIiwiY3J5cHRvX2JveF9zZWFsIiwiZW5jQmFzZTY0IiwidG9fYmFzZTY0IiwiZW5jcnlwdGVkX3ZhbHVlIiwic2V0dXBHaXRIdWJTZXR0aW5ncyIsIndpdGhSZXRyeSIsImFsbG93X21lcmdlX2NvbW1pdCIsImFsbG93X3NxdWFzaF9tZXJnZSIsImFsbG93X3JlYmFzZV9tZXJnZSIsImRlbGV0ZV9icmFuY2hfb25fbWVyZ2UiLCJzcXVhc2hfbWVyZ2VfY29tbWl0X3RpdGxlIiwic3F1YXNoX21lcmdlX2NvbW1pdF9tZXNzYWdlIiwiaGVhZGVycyIsImFsbG93X2F1dG9fbWVyZ2UiLCJ0ZW1wbGF0ZXMiLCJnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcyIsImRpc3RhbmNlIiwid2JmeUpzb25TY2hlbWEiLCJ6Iiwib2JqZWN0IiwicmVjb3JkIiwic3RyaW5nIiwib3B0aW9uYWwiLCJkb2MiLCJ0cyIsImdldFBhY2thZ2VDb25maWciLCJlc21QYWNrYWdlIiwicGFja2FnZUpzb25UZXh0IiwicmVhZEZpbGVTeW5jIiwidHlwZSIsInJlbGVhc2VCcmFuY2hlcyIsInJlbGVhc2VQbHVnaW5zIiwicmVsZWFzZXJjSnNvblBhdGgiLCJmbGF0IiwicmVwb0luZm8iLCJnaXQiLCJzaW1wbGVHaXQiLCJvcmlnaW4iLCJnZXRSZW1vdGVzIiwiciIsInJlbW90ZVVybCIsInJlZnMiLCJyZXF1ZXN0UmVwb0luZm8iLCJtZXNzYWdlIiwiZmV0Y2hSZXBvSW5mbyIsIm5vZGVWZXJzaW9uQ29udGVudCIsIndiZnlKc29uUGF0aCIsIndiZnlKc29uVGV4dCIsImZ1bGxfbmFtZSIsInNlcCIsImNvbnRhaW5zQW55IiwiZG9lc0NvbnRhaW5zVnNjb2RlU2V0dGluZ3NKc29uIiwiZ2l0aHViIiwiZ2V0RXNsaW50RXh0ZW5zaW9uQmFzZSIsInBhdHRlcm4iLCJvcmciLCJyZXQiLCJhc3NpZ24iLCJhcmd2IiwieWFyZ3MiLCJwb3NpdGlvbmFsIiwiZGVzY3JpYmUiLCJhcnJheSIsImRlZmF1bHQiLCJkZXNjcmlwdGlvbiIsImFsaWFzIiwic2tpcERlcHMiLCJ2ZXJib3NlIiwicm9vdERpclBhdGgiLCJwYXRocyIsInBhY2thZ2VzRGlyUGF0aCIsInN1YkRpclBhdGhzIiwiaWdub3JlRXJyb3JBc3luYyIsImFiYnJldmlhdGlvblByb21pc2UiLCJzdWJQYWNrYWdlQ29uZmlncyIsInN1YkRpclBhdGgiLCJhbGxQYWNrYWdlQ29uZmlncyIsInRoZW4iXSwibWFwcGluZ3MiOiJnb0JBVU8sTUFBTUEsRUFBVSxJQVZ2QixNQUlFQyxXQUFBQSxHQUNFQyxLQUFLQyxXQUFZLEVBQ2pCRCxLQUFLRSxtQkFBb0IsQ0FDM0IsR0NXSyxNQUFNQyxFQUFTLElBaEJ0QixNQUNFLCtCQUFNQyxDQUEwQkMsRUFBY0MsR0FDeENSLEVBQVFHLFdBQ1ZNLFFBQVFDLEtBQUssYUFBYUgscUJBRTVCLFVBQ1FDLEdBQ1AsQ0FBQyxNQUFPRyxHQUNQRixRQUFRQyxLQUFLLHFCQUFxQkgsTUFBU0ksYUFBaUJDLE1BQVFELEVBQU1FLE1BQVFGLEtBQ3BGLENBQ0lYLEVBQVFHLFdBQ1ZNLFFBQVFDLEtBQUssY0FBY0gsbUJBRS9CLEdDVEtPLGVBQWVDLEVBQWNDLEdBQ2xDLE9BQU9YLEVBQU9DLDBCQUEwQixpQkFBaUJRLFVBQ3ZELElBQUtFLEVBQU9D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
|