wbfy 3.5.1 → 3.5.3
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";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/promises";import a from"fast-glob";import{PromisePool as c}from"minimal-promise-pool";import{Octokit as l}from"@octokit/core";import p from"node:child_process";import d from"deepmerge";import u from"js-yaml";import m from"lodash.clonedeep";import f from"node:os";import g from"dotenv";import h from"libsodium-wrappers";import{distance as y}from"fastest-levenshtein";import{simpleGit as w}from"simple-git";import{z as b}from"zod";const v=new class{constructor(){this.isVerbose=!1,this.doesUploadEnvVars=!1}};const k=new class{async functionIgnoringException(e,t){v.isVerbose&&console.info(`--------- ${e} start ---------`);try{await t()}catch(t){console.info(`Error occurred in ${e}: ${t instanceof Error?t.stack:String(t)}}`)}v.isVerbose&&console.info(`---------- ${e} end ----------`)}};async function j(e){return k.functionIgnoringException("fixDockerfile",async()=>{if(!e.doesContainsDockerfile)return;const n=e.dockerfile,s=n;n!==s&&await r.writeFile(t.join(e.dirPath,"Dockerfile"),s)})}async function x(n){return k.functionIgnoringException("fixPlaywrightConfig",async()=>{const s=t.join(n.dirPath,"playwright.config.ts");if(!e.existsSync(s))return;const i=await e.promises.readFile(s,"utf8"),o=i.replace(/retries:.+,/,"retries: process.env.PWDEBUG ? 0 : process.env.CI ? 5 : 1,");i!==o&&await e.promises.writeFile(s,o)})}const _=["**/node_modules/**","**/.venv/**","**/test-fixtures/**","**/test/fixtures/**","**/dist/**","**/build/**","**/target/**","**/temp/**","**/tmp/**"];async function P(e){return k.functionIgnoringException("fixPrismaEnvFiles",async()=>{const n=await a.glob(["*.env","*.env.*"],{dot:!0,cwd:e.dirPath,ignore:_});for(const s of n){const n=t.resolve(e.dirPath,s),i=(await r.readFile(n,"utf8")).replace(/DATABASE_URL="?(.+\.sqlite3)"?[\n$]/,'DATABASE_URL="$1?connection_limit=1"\n');await r.writeFile(n,i)}})}async function S(n){return k.functionIgnoringException("fixTestDirectoriesUpdatingPackageJson",async()=>{await Promise.all(n.map(async n=>{const s=t.join(n,"test");for(const i of["__tests__","tests"]){const o=t.join(n,i);try{await e.promises.rename(o,s);const r=await e.promises.readFile(t.join(n,"package.json"),"utf8"),a=r.replaceAll(i,"test");if(r===a)return;await e.promises.writeFile(t.join(n,"package.json"),a)}catch{}}}))})}const $=new c;async function F(e,s){return k.functionIgnoringException("fixTypeDefinitions",async()=>{const i=t.resolve(e.dirPath,"@types"),o=e.isRoot&&e.doesContainsSubPackageJsons?void 0:t.resolve(e.dirPath,"src","types"),a=await n(()=>r.readdir(i,{withFileTypes:!0}));if(a)for(const e of a){const a=e.name.slice(0,-5),c=e.name.endsWith(".d.ts");let l=c?a:e.name;l.includes("__")&&(l=`@${l.replace("__","/")}`);const p=s.some(e=>e.packageJson?.dependencies?.[l]||e.packageJson?.devDependencies?.[l]);e.isFile()&&c?p?(await r.mkdir(t.join(i,a)),await $.run(()=>r.rename(t.join(i,e.name),t.join(i,a,"index.d.ts")))):o&&(await r.mkdir(o,{recursive:!0}),await $.run(()=>r.rename(t.join(i,e.name),t.join(o,e.name)))):e.isDirectory()&&o&&!p&&(await r.mkdir(o,{recursive:!0}),await $.run(()=>n(()=>r.rename(t.join(i,e.name,"index.d.ts"),t.join(o,`${e.name}.d.ts`)))))}})}const C={async readFileIgnoringError(t){try{return await e.promises.readFile(t,"utf8")}catch{}},async generateFile(n,s){await e.promises.mkdir(t.dirname(n),{recursive:!0}),await e.promises.writeFile(n,s)}};async function E(n){return k.functionIgnoringException("fixTypos",async()=>{const s=n.dirPath,i=await a.glob("**/*.md",{dot:!0,cwd:s,ignore:_});v.isVerbose&&console.info(`Found ${i.length} markdown files in ${s}`);for(const o of i){const i=t.join(s,o);await $.run(async()=>{const t=await e.promises.readFile(i,"utf8");let s=B(t);s=I(s,n,"doc"),t!==s&&await C.generateFile(i,s)})}const o=await a.glob(["{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx,cts,mts,ts,tsx}","packages/**/{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx,cts,mts,ts,tsx}"],{dot:!0,cwd:s,ignore:_});v.isVerbose&&console.info(`Found ${o.length} TypeScript files in ${s}`);for(const i of o){const o=t.join(s,i),r=await e.promises.readFile(o,"utf8");let a=O(r);a=I(a,n,"ts"),r!==a&&await C.generateFile(o,a)}const r=await a.glob("**/*.{csv,htm,html,tsv,xml,yaml,yml}",{dot:!0,cwd:s,ignore:_});v.isVerbose&&console.info(`Found ${r.length} text-based files in ${s}`);for(const i of r){const o=t.join(s,i),r=await e.promises.readFile(o,"utf8");let a=B(r);a=I(a,n,"text"),r!==a&&await C.generateFile(o,a)}await $.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){return e.replaceAll(/\/\/(.*)c\.f\./g,"//$1cf.").replaceAll(/\/\/(.*)eg\./g,"//$1e.g.").replaceAll(/\/\/(.*)ie\./g,"//$1i.e.")}function I(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}async function D(e,n){return k.functionIgnoringException("generateAgentInstructions",async()=>{if(!e.isRoot)return;const s=t.resolve(e.dirPath,"AGENTS_EXTRA.md"),i=await C.readFileIgnoringError(s),o=function(e,t,n){const s=e.isBun?"bun":"yarn",i=`\n## Project Information\n\n- Name: ${e.packageJson?.name}\n- Description: ${e.packageJson?.description}\n- Package Manager: ${s}\n\n## General Instructions\n\n${t.some(e=>e.depending.genI18nTs)?'- If you introduce new string literals in React components, update language resource files in `i18n` directory like `i18n/ja-JP.json`. Reference these strings using the `i18n` utility, for example: `i18n.pages.home.title()` for `{ "pages": { "home": { "title": "My App" } } }`.':""}\n- After making code changes, commit them to the current branch using the \`--no-verify\` option. Make sure to add a new line at the end of your commit message with: \`Co-authored-by: WillBooster (Agent) <agent@willbooster.com>\`.\n- Once you have committed your changes, run \`${s} check-for-ai\` to perform type checking and linting.\n- When your work is fully complete, run \`${s} check-all-for-ai\` to execute all tests (note: this may take up to 30 minutes).\n- Once \`${s} check-all-for-ai\` passes, commit any remaining changes to the current branch and push.\n\n## Coding Style\n\n- When adding new functions or classes, define them below any functions or classes that call them to maintain clear call order.\n${t.some(e=>e.depending.next)?"- Since this project uses the React Compiler, you do not need to use `useCallback` or `useMemo` for performance optimization.":""}\n`.replaceAll(/\n{3,}/g,"\n\n").trim();return n?i+"\n\n"+n.trim():i}(e,n,i);for(const n of["AGENTS.md","CLAUDE.md","GEMINI.md"]){const s=t.resolve(e.dirPath,n);await $.run(()=>C.generateFile(s,o))}})}const T=process.env.GH_BOT_PAT||process.env.PUBLIC_GH_BOT_PAT||process.env.GH_TOKEN||process.env.GITHUB_TOKEN,A=!!T,R=new l({auth:T});const W=new class{getOrgAndName(e){const t=e.split(":").at(-1),n=t?.split("/");return[n?.at(-2)??"",n?.at(-1)?.replace(/.git$/,"")??""]}};function L(e,t,n,s=0){do{const[s,i,o]=N(e,t,n);if(0===p.spawnSync(s,i,o).status)break}while(--s>=0)}function J(e,t,n){const[s,i,o]=N(e,t,n);o.stdio="pipe";const r=p.spawnSync(s,i,o),a=r.stderr.toString().trim();return a&&console.error(`${s} [${i.map(e=>`"${e}"`).join(", ")}] caused the following error:\n ${a}`),r.stdout.toString().trim()}function N(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",`${e} ${t.join(" ")}`],e="bash"),[e,t,{cwd:n,env:s,shell:!1,stdio:"inherit"}]}function z(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 G="3.9.19",M="zulu-11.74.15",U="2.0.4",H="14.2.5";async function q(n){return k.functionIgnoringException("generateToolVersions",async()=>{await async function(n){if(!n.versionsText)return;const s=n.versionsText.trim().split("\n").map(e=>{const[t,n]=e.trim().split(/\s+/);return`${Y.has(t)?" ":""}${t} ${n}`}).sort().map(e=>e.trim()).filter(e=>!e.startsWith("lefthook")),i=[...new Set(s)];if(n.doesContainsPoetryLock){const e=await fetch("https://pypi.org/pypi/poetry/json"),t=await e.json(),n=t?.info?.version;n&&V(i,"poetry",n),V(i,"python",G,!0)}n.depending.firebase&&V(i,"java",M,!0);if(n.doesContainsPackageJson)if(n.isBun){const e=await async function(e,t){try{const n=(await R.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)}}("oven-sh","bun");e&&V(i,"bun",e)}else{const e=J("npm",["show","yarn","version"],n.dirPath);V(i,"yarn",e)}for(const s of K){const i=t.resolve(n.dirPath,`.${s}-version`);e.promises.rm(i,{force:!0})}const o=t.resolve(n.dirPath,".tool-versions");await(i.length>0?$.run(()=>e.promises.writeFile(o,i.join("\n")+"\n")):$.run(()=>e.promises.rm(o,{force:!0}))),await $.promiseAll(),L("asdf",["plugin","update","--all"],n.dirPath),L("asdf",["install"],n.dirPath)}(n)})}const Y=new Set(["java","nodejs","bun","python"]),K=["java","node","python"];function V(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+/);z(n)>z(t)&&(e[i]=o)}}function X(e,t){return t}function Q(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]=d(e[i],o,n):e.includes(o)||s.push(o);return s}async function Z(n){return k.functionIgnoringException("generateBiomeJsonc",async()=>{let s={root:n.isRoot,$schema:"./node_modules/@biomejs/biome/configuration_schema.json",extends:["@willbooster/biome-config"]};const i=t.resolve(n.dirPath,"biome.jsonc");try{const t=await e.promises.readFile(i,"utf8"),n=JSON.parse(t);s=d.all([s,n,s],{arrayMerge:X})}catch{}const o=JSON.stringify(s);await $.run(()=>C.generateFile(i,o))})}async function ee(n){return k.functionIgnoringException("generateBunfigToml",async()=>{const s=t.resolve(n.dirPath,"bunfig.toml"),i=e.existsSync(s)&&e.readFileSync(s,"utf8").includes("exact = false")?"telemetry = false\n\n[install]\nexact = false\n\n[run]\nbun = true\n":"telemetry = false\n\n[install]\nexact = true\n\n[run]\nbun = true\n";await $.run(()=>C.generateFile(s,i))})}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(t){try{let n=await e.promises.readFile(t,"utf8");const s=ae(n);return s>0&&(n=n.slice(0,s-1)),n.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(t){try{return(await e.promises.readFile(t,"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(n){return k.functionIgnoringException("generateDockerignore",async()=>{const s=t.resolve(n.dirPath,".dockerignore");if(n.doesContainsDockerfile){const e=await C.readFileIgnoringError(s)??"",t=re.getHeadUserContent(e)+"\n**/.idea\n**/*.sqlite3*\n**/.yarn/install-state.gz\n**/.venv\n"+re.getTailUserContent(e);await $.run(()=>C.generateFile(s,t))}else await e.promises.rm(s,{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","sh"].sort(),codeWith4IndentSize:["go","gradle","java","py"].sort(),markdownLike:["md"].sort(),eslint:["cjs","mjs","js","cts","mts","ts","tsx","jsx"].sort(),prettier:["cjs","mjs","java","js","jsx","cts","mts","ts","tsx","json","json5","jsonc","css","htm","html","md","scss","vue","yaml","yml"].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.markdownLike)}\nmax_line_length = off\ntrim_trailing_whitespace = false\n\n[{Makefile,*.mk}]\nindent_style = tab\n`;async function de(e){return k.functionIgnoringException("generateEditorconfig",async()=>{const n=t.resolve(e.dirPath,".editorconfig");await $.run(()=>C.generateFile(n,pe))})}function ue(e){return e.length>1?`[*.{${e.join(",")}}]`:`[*.${e[0]}]`}async function me(n){return k.functionIgnoringException("generateEslintrc",async()=>{await $.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintrc.json"),{force:!0})),await $.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintignore"),{force:!0})),await $.run(()=>e.promises.rm(t.resolve(n.dirPath,"eslint.config.js"),{force:!0}));const s=t.resolve(n.dirPath,"eslint.config.mjs");if(n.isBun)await $.run(()=>e.promises.rm(s,{force:!0}));else if(n.eslintBase){try{if(!(await e.promises.readFile(s,"utf8")).includes("export { default }"))return}catch{}await $.run(()=>C.generateFile(s,`export { default } from '${n.eslintBase}';`))}})}const fe={have_fun:!0,code_review:{disable:!1,comment_severity_threshold:"MEDIUM",max_review_comments:-1,pull_request_opened:{help:!1,summary:!0,code_review:!0}},ignore_patterns:["**/__generated__"]};async function ge(n){return k.functionIgnoringException("generateGeminiConfig",async()=>{if(!n.isRoot)return;const s=t.resolve(n.dirPath,".gemini"),i=t.resolve(s,"config.yml"),o=t.resolve(s,"styleguide.md");let r=m(fe);try{const t=await e.promises.readFile(i,"utf8"),n=u.load(t);r=d.all([r,n,r],{arrayMerge:X})}catch{}const a=u.dump(r,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}});await Promise.all([$.run(()=>C.generateFile(i,a)),$.run(()=>C.generateFile(o,"日本語でレビューしてください。"))])})}async function he(n){return k.functionIgnoringException("generateGeminiSettings",async()=>{if(!n.isRoot)return;const s=t.resolve(n.dirPath,".gemini"),i=t.resolve(s,"settings.json");await e.promises.rm(i,{force:!0})})}const ye=`* 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 we(e){return k.functionIgnoringException("generateGitattributes",async()=>{const n=t.resolve(e.dirPath,".gitattributes");await $.run(()=>C.generateFile(n,ye))})}const be=["windows","macos","linux","jetbrains","visualstudiocode","emacs","vim","yarn"];async function ve(e,n){return k.functionIgnoringException("generateGitignore",async()=>{const s=t.resolve(e.dirPath,".gitignore"),i=await C.readFileIgnoringError(s)??"";let o=re.getHeadUserContent(i)+"\n!.keep\n.aider*\n.env.production\n.idea/AugmentWebviewStateStore.xml\n.idea/copilot/chatSessions/\n.devcontainer/\n*/mount/*.hash\n__generated__/\ndist/\ntemp/\n";const r=re.getTailUserContent(i),a=[...be];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"),e.depending.prisma&&(o+="*.sqlite3*\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 xe(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 $.run(()=>je(e,t)),v.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 $.run(()=>C.generateFile(s,l))})}const ke=t.join(f.homedir(),".cache","wbfy","gitignore");async function je(n,s){await e.promises.mkdir(ke,{recursive:!0}),await e.promises.writeFile(t.join(ke,n),s)}async function xe(n){try{const s=await e.promises.stat(t.join(ke,n));if(Date.now()-s.mtimeMs>216e5)return;return await e.promises.readFile(t.join(ke,n),"utf8")}catch{}}async function _e(e,t){try{const{data:n}=await R.request("GET /repos/{owner}/{repo}/commits",{owner:e,repo:t,per_page:1});if(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}: ${String(n)}`)}}const Pe={getLintFixSuffix:e=>e.doesContainsJsxOrTsx?' --rule "{ react-hooks/exhaustive-deps: 0 }"':""},Se=["eslint","eslint-config-flat-gitignore","eslint-config-prettier","eslint-plugin-sort-class-members","eslint-plugin-sort-destructure-keys","eslint-plugin-unicorn","eslint-plugin-unused-imports","globals"],$e=[...Se,"typescript-eslint","eslint-import-resolver-typescript"],Fe=["eslint-plugin-react","eslint-plugin-react-hooks","eslint-plugin-react-compiler"],Ce={"@willbooster/eslint-config-js":["@willbooster/eslint-config-js","eslint-plugin-import-x",...Se],"@willbooster/eslint-config-js-react":["@willbooster/eslint-config-js-react","eslint-plugin-import-x",...Se,...Fe],"@willbooster/eslint-config-ts":["@willbooster/eslint-config-ts","eslint-plugin-import-x",...$e],"@willbooster/eslint-config-ts-react":["@willbooster/eslint-config-ts-react","eslint-plugin-import-x",...$e,...Fe],"@willbooster/eslint-config-next":["@willbooster/eslint-config-next","eslint-plugin-import","eslint-config-next",...$e,...Fe]};async function Ee(n,s,i){return k.functionIgnoringException("generatePackageJson",async()=>{await async function(n,s,i){const o=t.resolve(n.dirPath,"package.json"),r=await e.promises.readFile(o,"utf8"),c=JSON.parse(r);c.scripts=c.scripts||{},c.dependencies=c.dependencies||{},c.devDependencies=c.devDependencies||{},c.peerDependencies=c.peerDependencies||{};const l=n.isBun?"bun":"yarn";await async function(t,n){"WillBooster LLC"===n.author&&(n.author="WillBooster Inc.");if(delete n.scripts["sort-package-json"],delete n.scripts["sort-all-package-json"],delete n.scripts["typecheck/warn"],delete n.scripts["typecheck:gen-code"],delete n.scripts["typecheck:codegen"],delete n.dependencies.tslib,delete n.devDependencies["@willbooster/eslint-config"],delete n.devDependencies["@willbooster/eslint-config-react"],delete n.devDependencies["@willbooster/renovate-config"],delete n.devDependencies["@willbooster/tsconfig"],delete n.devDependencies["eslint-import-resolver-node"],delete n.devDependencies["eslint-plugin-prettier"],delete n.devDependencies.lerna,delete n.devDependencies.pinst,delete n.scripts["flutter-format"],delete n.scripts["format-flutter"],delete n.scripts["python-format"],delete n.scripts["format-python"],delete n.scripts.prettier,delete n.scripts["check-all"],!t.isWillBoosterConfigs)for(const e of Object.values(Ce))for(const t of e)delete n.devDependencies[t];await $.run(()=>e.promises.rm("lerna.json",{force:!0})),delete n.devDependencies["@typescript-eslint/eslint-plugin"],delete n.devDependencies["@typescript-eslint/parser"],delete n.devDependencies["eslint-plugin-import"]}(s,c);for(const[e,t]of Object.entries(c.scripts))t.includes("git clone")||(c.scripts[e]=t.replace(/yarn\s*&&\s*/,"").replace(/yarn\s*install\s*&&\s*/,""));c.scripts=d(c.scripts,Be(n)),"check-for-ai"in c.scripts&&("gen-code"in c.scripts&&(c.scripts["check-for-ai"]=`${l} gen-code > /dev/null && ${c.scripts["check-for-ai"]}`),c.scripts["check-for-ai"]=`${l} install > /dev/null && ${c.scripts["check-for-ai"]}`);n.isBun?delete c.scripts.prettify:c.scripts.prettify+=await async function(n){const s=t.resolve(n,".prettierignore"),i=await e.promises.readFile(s,"utf8"),o=i.indexOf(re.separatorPrefix);if(-1===o)return"";const r=i.slice(0,o);return r.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("")}(n.dirPath);for(const[e,t]of Object.entries(c.scripts))t?.includes("yarn workspaces foreach")&&(t.includes("--all")||t.includes("--recursive")||t.includes("--since")||t.includes("--worktree")||(c.scripts[e]=t.replace("yarn workspaces foreach","yarn workspaces foreach --all")));let p=[],u=["prettier","sort-package-json"];const m=[];e.existsSync(t.join(s.dirPath,".prettierrc.json"))||e.existsSync(t.join(n.dirPath,".prettierrc.json"))||(c.prettier="@willbooster/prettier-config",u.push("prettier-plugin-java","@willbooster/prettier-config"));n.isBun?delete c.devDependencies["lint-staged"]:u.push("lint-staged");if(n.isRoot){if(n.isBun?(delete c.devDependencies.husky,delete c.devDependencies.pinst,c.scripts.prepare="lefthook install || true",u.push("lefthook")):(u.push("husky"),c.scripts.prepare="husky || true",c.scripts.postinstall="husky || true",(n.isPublicRepo||n.isReferredByOtherRepo)&&(u.push("pinst"),c.scripts.prepack="pinst --disable",c.scripts.postpack="pinst --enable")),n.depending.semanticRelease&&(c.devDependencies["semantic-release"]||c.devDependencies["multi-semantic-release"]||c.devDependencies["@qiwi/multi-semantic-release"]||u.push("semantic-release"),c.version="0.0.0-semantically-released"),n.depending.playwrightTest){c.dependencies.artillery||c.devDependencies.artillery||c.dependencies["@playwright/test"]||(u.push("@playwright/test"),delete c.dependencies["@playwright/test"]),delete c.dependencies.playwright,delete c.devDependencies.playwright}n.doesContainsSubPackageJsons?c.workspaces=Array.isArray(c.workspaces)?d.all([c.workspaces,["packages/*"]],{arrayMerge:Q}):["packages/*"]:Array.isArray(c.workspaces)&&(c.workspaces=c.workspaces.filter(e=>a.globSync(e,{dot:!0,cwd:n.dirPath,ignore:_}).length>0),0===c.workspaces.length&&delete c.workspaces)}if(n.depending.wb||n.isBun){c.dependencies["@willbooster/wb"]?p.push("@willbooster/wb"):u.push("@willbooster/wb");for(const[e,t]of Object.entries(c.scripts))c.scripts[e]=t.replace(/wb\s+db/,"wb prisma")}(n.doesContainsJavaScript||n.doesContainsJavaScriptInPackages||n.doesContainsTypeScript||n.doesContainsTypeScriptInPackages)&&(n.isBun?(u.push("@biomejs/biome","@willbooster/biome-config"),delete c.devDependencies.eslint,delete c.devDependencies.micromatch,delete c.devDependencies["typescript-eslint"]):u.push("eslint","micromatch"));(n.doesContainsTypeScript||n.doesContainsTypeScriptInPackages)&&(u.push("typescript"),n.isBun&&u.push("@types/bun"));n.eslintBase&&u.push(...Ce[n.eslintBase]);n.isWillBoosterConfigs&&(p=p.filter(e=>!e.includes("@willbooster/")),u=u.filter(e=>!e.includes("@willbooster/")));c.name||(c.name=t.basename(n.dirPath));n.doesContainsSubPackageJsons&&(c.private=!0);c.license||(c.license="UNLICENSED");!c.private&&"UNLICENSED"!==c.license&&s.isPublicRepo&&(c.publishConfig??={},c.publishConfig.access??="public");const[f]=W.getOrgAndName(n.repository??"");"WillBooster"!==f&&"WillBoosterLab"!==f||(c.author="WillBooster Inc.");n.isRoot||!c.private||c.main||(c.main="./src");if(delete c.resolutions?.["npm/chalk"],!n.doesContainsSubPackageJsons){if(n.isBun||(n.doesContainsJavaScript||n.doesContainsTypeScript?c.scripts["lint-fix"]+=Pe.getLintFixSuffix(n):(delete c.scripts.lint,delete c.scripts["lint-fix"],c.scripts.cleanup=c.scripts.cleanup?.replace(" && yarn lint-fix",""))),n.doesContainsPubspecYaml){c.scripts.lint="flutter analyze",c.scripts["lint-fix"]="yarn lint";const s=["lib","test","test_driver"].filter(s=>e.existsSync(t.resolve(n.dirPath,s)));s.length>0&&(c.scripts["format-code"]=`flutter format $(find ${s.join(" ")} -name generated -prune -o -name '*.freezed.dart' -prune -o -name '*.g.dart' -prune -o -name '*.dart' -print)`,c.scripts.format+=" && yarn format-code")}if(n.doesContainsPoetryLock){"poetry install"===c.scripts.postinstall&&delete c.scripts.postinstall;const e=await a.glob("**/*.py",{cwd:n.dirPath,dot:!0,ignore:_}),t=new Set;for(const n of e){const[e,s]=n.split(/[/\\]/);s&&t.add(e)}if(t.size>0){const e=[...t].join(" ");c.scripts["format-code"]=`poetry run isort --profile black ${e} && poetry run black ${e}`,c.scripts.lint?c.scripts.lint=`poetry run flake8 ${e} && ${c.scripts.lint}`:(c.scripts.lint=`poetry run flake8 ${e}`,c.scripts["lint-fix"]="yarn lint"),c.scripts.format+=" && yarn format-code",m.push("black","isort","flake8")}}n.repository&&(c.repository=n.repository)}n.depending.blitz?(p.push(`blitz@${U}`,`@blitzjs/auth@${U}`,`@blitzjs/next@${U}`,`@blitzjs/rpc@${U}`,`next@${H}`),u=u.filter(e=>"eslint-plugin-react"!==e&&"eslint-plugin-react-hooks"!==e),c.scripts["gen-code"]?.startsWith("blitz codegen")?c.scripts["gen-code"].includes("blitz prisma generate")||(c.scripts["gen-code"]=c.scripts["gen-code"].replace("blitz codegen","blitz codegen && blitz prisma generate")):c.scripts["gen-code"]="blitz codegen"):n.depending.prisma&&!c.scripts["gen-code"]?.startsWith("prisma generate")&&(c.scripts["gen-code"]="prisma generate");c.dependencies?.prettier||delete c.devDependencies["@types/prettier"];0===Object.keys(c.dependencies).length&&delete c.dependencies;0===Object.keys(c.devDependencies).length&&delete c.devDependencies;0===Object.keys(c.peerDependencies).length&&delete c.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(t.has("@willbooster/auth")&&!Oe(e,"@willbooster/auth")){delete e.devDependencies["@willbooster/auth"];const t=await _e("WillBoosterLab","auth");e.dependencies["@willbooster/auth"]=`git@github.com:WillBoosterLab/auth.git#${t}`}if(t.has("@discord-bot/shared")&&!Oe(e,"@discord-bot/shared")){delete e.devDependencies["@discord-bot/shared"];const t=await _e("WillBoosterLab","discord-bot");e.dependencies["@discord-bot/shared"]=`git@github.com:WillBoosterLab/discord-bot.git#${t}`}if(t.has("@willbooster/code-analyzer")&&!Oe(e,"@willbooster/code-analyzer")){delete e.dependencies["@willbooster/code-analyzer"];const t=await _e("WillBoosterLab","code-analyzer");e.devDependencies["@willbooster/code-analyzer"]=`git@github.com:WillBoosterLab/code-analyzer.git#workspace=@code-analyzer/client&commit=${t}`}if(t.has("@willbooster/judge")&&!Oe(e,"@willbooster/judge")){delete e.devDependencies["@willbooster/judge"];const t=await _e("WillBoosterLab","judge");e.dependencies["@willbooster/judge"]=`git@github.com:WillBoosterLab/judge.git#${t}`}if(t.has("@willbooster/llm-proxy")&&!Oe(e,"@willbooster/llm-proxy")){delete e.devDependencies["@willbooster/llm-proxy"];const t=await _e("WillBoosterLab","llm-proxy");e.dependencies["@willbooster/llm-proxy"]=`git@github.com:WillBoosterLab/llm-proxy.git#${t}`}}(c),n.isBun&&delete c.packageManager;let g=JSON.stringify(c);g=await async function(n,s,i){const o=[];for(const[e]of Object.keys(n))":"!==e[0]&&e.includes(":")&&o.push([e,e.replaceAll(":","-")]);if(0===o.length)return s;for(const[e,t]of o)s=s.replaceAll(e,t);const r=await a.glob(["**/*.{md,cjs,mjs,js,jsx,cts,mts,ts,tsx}","**/Dockerfile"],{cwd:i.dirPath,dot:!0,ignore:_});for(const n of r)await $.run(async()=>{const s=t.join(i.dirPath,n),r=await e.promises.readFile(s,"utf8");let a=r;for(const[e,t]of o)a=a.replaceAll(e,t);a!==r&&await e.promises.writeFile(s,a)});return await $.promiseAll(),s}(c.scripts,g,n),await e.promises.writeFile(o,g),i||(p=p.filter(e=>!c.devDependencies?.[e]),p.length>0&&(n.isBun?(L(l,["remove",...new Set(p)],n.dirPath),L(l,["add","--exact",...new Set(p)],n.dirPath)):L(l,["add",...new Set(p)],n.dirPath)),u=u.filter(e=>!c.dependencies?.[e]),u.length>0&&(n.isBun?(L(l,["remove",...new Set(u)],n.dirPath),L(l,["add","-D","--exact",...new Set(u)],n.dirPath)):L(l,["add","-D",...new Set(u)],n.dirPath)),m.length>0&&L("poetry",["add","--group","dev",...new Set(m)],n.dirPath))}(n,s,i)})}function Be(e){if(e.isBun){const t={"check-all-for-ai":"bun run check-for-ai && bun run test --silent","check-for-ai":"bun run cleanup && bun run typecheck",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 wb test",typecheck:"bun --bun wb typecheck"};return e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages||delete t.typecheck,t}{let t={"check-all-for-ai":"yarn check-for-ai && yarn test --silent","check-for-ai":"yarn format > /dev/null 2> /dev/null || true && yarn lint-fix --quiet && yarn typecheck",cleanup:"yarn format && yarn lint-fix",format:"sort-package-json && yarn prettify",lint:"eslint --color","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=d({...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}}function Oe(e,t){return(e.devDependencies?.[t]||e.dependencies?.[t]||"").includes("workspace")}const Ie={preCommit:"node node_modules/.bin/lint-staged",prePush:"yarn typecheck",prePushForLab:'\nif [ $(git branch --show-current) = "main" ]; then\n echo "************************************************"\n echo "*** Don\'t push main branch directly. Use PR! ***"\n echo "************************************************"\n exit 1\nfi\n\nyarn typecheck\n'.trim(),prePushForLabExceptAdmin:'\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 De(n){return k.functionIgnoringException("generateHuskyrcUpdatingPackageJson",async()=>{await async function(n){const s=t.resolve(n.dirPath,"package.json"),i=await e.promises.readFile(s,"utf8"),o=JSON.parse(i);o.scripts||={},delete o.scripts.postinstall,delete o.scripts.postpublish,delete o.scripts.prepare,delete o.scripts.prepublishOnly,delete o.scripts.prepack,delete o.scripts.postpack;const r=t.resolve(n.dirPath,".husky");if(await Promise.all([e.promises.writeFile(s,JSON.stringify(o,void 0,2)),e.promises.rm(r,{force:!0,recursive:!0})]),n.isBun)return void L("git",["config","--unset","core.hooksPath"],n.dirPath);L("yarn",["dlx","husky-init","--yarn2"],n.dirPath);const a=t.resolve(r,"pre-commit");await $.run(()=>e.promises.rm(t.resolve(n.dirPath,".huskyrc.json"),{force:!0})),await $.run(()=>e.promises.writeFile(a,Ie.preCommit+"\n"));const{typecheck:c}=Be(n);if(c){let s=n.repository?.startsWith("github:WillBoosterLab/")?n.repository?.toLocaleLowerCase().includes("exercode")?Ie.prePushForLab:Ie.prePushForLabExceptAdmin:Ie.prePush;s=s.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 $.run(()=>e.promises.writeFile(t.resolve(r,"pre-push"),s+"\n",{mode:493}))}const l=`${Ie.postMerge}\n\n${Te(n).join("\n")}\n`;await $.run(()=>e.promises.writeFile(t.resolve(r,"post-merge"),l,{mode:493}))}(n)})}function Te(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(String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/blitz prisma migrate deploy"`,String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/blitz prisma generate"`,String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/blitz codegen"`):e.depending.prisma&&t.push(String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/dotenv -c development -- node node_modules/.bin/prisma migrate deploy"`,String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/dotenv -c development -- node node_modules/.bin/prisma generate"`),t}function Ae(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 Re=`<?xml version="1.0" encoding="UTF-8"?>\n<project version="4">\n <component name="ProjectTasksOptions">\n${le.prettier.map(e=>Ae("node","node_modules/.bin/prettier --cache --write","Prettier",e)).join("")}\n </component>\n</project>\n`,We=`<?xml version="1.0" encoding="UTF-8"?>\n<project version="4">\n <component name="ProjectTasksOptions">\n${le.prettier.map(e=>Ae("bun","--bun node_modules/.bin/biome check --fix --no-errors-on-unmatched --skip-parse-errors","Biome",e)).join("")}\n </component>\n</project>\n`;async function Le(n){return k.functionIgnoringException("generateIdeaSettings",async()=>{const s=t.resolve(n.dirPath,".idea");if(e.existsSync(s)){const i=t.resolve(s,"watcherTasks.xml");await(n.doesContainsJavaScript||n.doesContainsJavaScriptInPackages||n.doesContainsTypeScript||n.doesContainsTypeScriptInPackages||n.doesContainsPackageJson&&!n.doesContainsPubspecYaml&&!n.doesContainsGemfile&&!n.doesContainsGoMod&&!n.doesContainsPomXml?$.run(()=>C.generateFile(i,n.isBun?We:Re)):$.run(()=>e.promises.rm(i,{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 ze(n){return k.functionIgnoringException("generateLefthookUpdatingPackageJson",async()=>{await async function(n){const s=t.resolve(n.dirPath,".lefthook");await Promise.all([e.promises.writeFile(t.join(n.dirPath,"lefthook.yml"),u.dump(Je,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}})),e.promises.rm(s,{force:!0,recursive:!0})]);const{typecheck:i}=Be(n);if(i){const i=n.repository?.startsWith("github:WillBoosterLab/")?Ne.prePushForLab:Ne.prePush;e.mkdirSync(t.join(s,"pre-push"),{recursive:!0}),await $.run(()=>e.promises.writeFile(t.join(s,"pre-push","check.sh"),i+"\n",{mode:493}))}const o=`${Ne.postMerge}\n\n${Te(n).join("\n")}\n`;e.mkdirSync(t.join(s,"post-merge"),{recursive:!0}),await $.run(()=>e.promises.writeFile(t.resolve(s,"post-merge","prepare.sh"),o,{mode:493}))}(n)})}const Ge={node:["src","test","scripts"].sort(),blitz:["src","test","scripts","db","integrations","mailers"].sort()};async function Me(n){return k.functionIgnoringException("generateLintstagedrc",async()=>{await async function(n){const s=t.resolve(n.dirPath,".lintstagedrc.cjs");if(n.isBun)return void await $.run(()=>e.promises.rm(s,{force:!0}));const i=n.isRoot?"node node_modules/.bin/":"node ../../node_modules/.bin/",o=[];if(n.doesContainsJavaScript||n.doesContainsTypeScript){const e=`\n '${Ue(n)}': [${JSON.stringify(`${i}eslint --fix${Pe.getLintFixSuffix(n)}`)}, '${i}prettier --cache --write'],`;o.push(e)}const r=n.isRoot?" && !file.includes('/packages/')":"";o.push(`\n './**/*.{${le.prettier.join(",")}}': files => {\n let filteredFiles = files.filter(file => !file.includes('/test-fixtures/') && !file.includes('/test/fixtures/')${r});${function(e){return e.doesContainsJavaScript||e.doesContainsTypeScript?`\n\n filteredFiles = filteredFiles.map((file) => path.relative('', file));\n filteredFiles = micromatch.not(filteredFiles, '${Ue(e)}');\n filteredFiles = filteredFiles.map((file) => path.resolve(file));`:""}(n)}\n if (filteredFiles.length === 0) return [];\n const commands = [\`${i}prettier --cache --write \${filteredFiles.join(' ')}\`];\n if (filteredFiles.some(file => file.endsWith('package.json'))) {\n commands.push('${i}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},`),n.doesContainsPubspecYaml&&o.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 },");n.doesContainsPoetryLock&&o.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${n.doesContainsJavaScript||n.doesContainsTypeScript?"const micromatch = require('micromatch');\n":""}\nmodule.exports = {${o.join("")}\n};\n`;await $.run(()=>e.promises.rm(t.resolve(n.dirPath,".lintstagedrc.js"),{force:!0})),await $.run(()=>e.promises.rm(t.resolve(n.dirPath,".lintstagedrc.json"),{force:!0})),await $.run(()=>C.generateFile(s,a))}(n)})}function Ue(e){const t=function(e){return e.depending.blitz?Ge.blitz:Ge.node}(e).map(e=>`${e}/**/`);return`{,${t.join(",")}}*.{${le.eslint.join(",")}}`}async function He(n){return k.functionIgnoringException("generateNextConfigJson",async()=>{const s=["js","mjs","cjs"].map(e=>t.resolve(n.dirPath,`next.config.${e}`)).find(t=>e.existsSync(t));if(!s)return;const i=(await e.promises.readFile(s,"utf8")).replace(/=\s*{([\S\s]*)};/,(e,t)=>(t.includes("eslint:")||(t+="eslint: { ignoreDuringBuilds: true },"),t.includes("typescript:")||(t+="typescript: { ignoreBuildErrors: true },"),`= {${t}};`));await $.run(()=>C.generateFile(s,i))})}async function qe(e){return k.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/\ntest/fixtures/\n*.d.ts\n*.min.js\n.yarn/\n.pnp.js\n"+c+a+o;await $.run(()=>C.generateFile(n,l))})}const Ye={venvPath:".",venv:".venv"};async function Ke(n){return k.functionIgnoringException("generatePyrightConfigJson",async()=>{let s=m(Ye);const i=t.resolve(n.dirPath,"pyrightconfig.json");try{const t=await e.promises.readFile(i,"utf8"),n=JSON.parse(t);s=d.all([s,n,s],{arrayMerge:X})}catch{}const o=JSON.stringify(s);await $.run(()=>C.generateFile(i,o))})}async function Ve(n){return k.functionIgnoringException("generateReadme",async()=>{const s=t.resolve(n.dirPath,"README.md");let i=await e.promises.readFile(s,"utf8");e.existsSync(t.resolve(n.dirPath,".releaserc.json"))&&(i=Xe(i,"[](https://github.com/semantic-release/semantic-release)"));const o=n.repository?.slice(n.repository?.indexOf(":")+1),r=e.readdirSync(`${n.dirPath}/.github/workflows`);for(const s of r){if(!s.startsWith("test")&&!s.startsWith("deploy"))continue;let r=s;r=r[0].toUpperCase()+r.slice(1,r.indexOf(".")),r=r.replace("-"," ");const a=`[](https://github.com/${o}/actions/workflows/${s})`;e.existsSync(t.resolve(n.dirPath,`.github/workflows/${s}`))&&(i=Xe(i,a))}await $.run(()=>C.generateFile(s,i))})}function Xe(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 Qe(n){return k.functionIgnoringException("generateReleaserc",async()=>{const s=t.resolve(n.dirPath,".releaserc.json"),i=JSON.parse(await e.promises.readFile(s,"utf8")),o=i?.plugins||[];for(let e=0;e<o.length;e++){const t=Array.isArray(o[e])?o[e][0]:o[e],n=Array.isArray(o[e])&&o[e][1]||{};if("@semantic-release/commit-analyzer"===t)o[e]=["@semantic-release/commit-analyzer",d.all([n,{preset:"conventionalcommits"}],{arrayMerge:X})];else if("@semantic-release/github"===t){const{failComment:t,successComment:s,...i}=n;o[e]=["@semantic-release/github",d.all([i,{successCommentCondition:!1,failCommentCondition:!1,labels:["r: semantic-release"],releasedLabels:["released :bookmark:"]}],{arrayMerge:X})]}}const r=JSON.stringify(i);await $.run(()=>C.generateFile(s,r))})}const Ze={$schema:"https://docs.renovatebot.com/renovate-schema.json",extends:["github>WillBooster/willbooster-configs:renovate.json5"]};async function et(n){return k.functionIgnoringException("generateRenovateJson",async()=>{let s=m(Ze);const i=t.resolve(n.dirPath,"renovate.json");if(e.existsSync(`${i}5`))return;try{const t=await e.promises.readFile(i,"utf8"),n=JSON.parse(t);s=d.all([s,n,s],{arrayMerge:X}),s.extends=s.extends.filter(e=>"@willbooster"!==e)}catch{}n.depending.blitz&&(s.packageRules??=[],s.packageRules.some(e=>e.matchPackageNames.includes("next"))||s.packageRules.push({matchPackageNames:["next"],enabled:!1})),await $.run(()=>e.promises.rm(t.resolve(n.dirPath,".dependabot"),{force:!0})),await $.run(()=>e.promises.rm(t.resolve(n.dirPath,".renovaterc.json"),{force:!0}));const o=JSON.stringify(s);await $.run(()=>C.generateFile(i,o))})}function tt(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&&tt(s);return e}const nt={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,erasableSyntaxOnly:!0,outDir:"dist",typeRoots:["./node_modules/@types","./@types"]},exclude:["packages/*/test/fixtures","test/fixtures"],include:["packages/*/scripts/**/*","packages/*/src/**/*","packages/*/test/**/*","scripts/**/*","src/**/*","test/**/*"]},st={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,erasableSyntaxOnly:!0,outDir:"dist",typeRoots:["../../node_modules/@types","../../@types","./@types"]},exclude:["test/fixtures"],include:["scripts/**/*","src/**/*","test/**/*"]};async function it(n){return k.functionIgnoringException("generateTsconfig",async()=>{if(n.depending.blitz||n.depending.next)return;let s=m(n.isRoot?nt:st);n.doesContainsJsxOrTsx||n.doesContainsJsxOrTsxInPackages||delete s.compilerOptions?.jsx,n.isRoot&&!n.doesContainsSubPackageJsons&&(s.include=s.include?.filter(e=>!e.startsWith("packages/*/")),s.exclude=s.exclude?.filter(e=>!e.startsWith("packages/*/"))),n.isEsmPackage&&(s.compilerOptions={...s.compilerOptions,module:"NodeNext",moduleResolution:"NodeNext"});const i=t.resolve(n.dirPath,"tsconfig.json");try{const t=await e.promises.readFile(i,"utf8"),o=JSON.parse(t);"./node_modules/@willbooster/tsconfig/tsconfig.json"===o.extends&&delete o.extends,delete s.compilerOptions?.target,n.isEsmPackage||(delete s.compilerOptions?.module,delete s.compilerOptions?.moduleResolution),o.compilerOptions?.jsx&&delete s.compilerOptions?.jsx,s=d.all([s,o,s],{arrayMerge:Q}),s.include=s.include?.filter(e=>!e.includes("@types")&&!e.includes("__tests__/")&&!e.includes("tests/"))}catch{}tt(s),s.include?.sort();const o=JSON.stringify(s);delete s.compilerOptions?.experimentalDecorators,await $.run(()=>C.generateFile(i,o))})}const ot=["**/.git/objects/**","**/.git/subtree-cache/**","**/node_modules/**","**/tmp/**","**/temp/**","**/dist/**"];async function rt(n){return k.functionIgnoringException("generateVscodeSettings",async()=>{try{const s=t.resolve(n.dirPath,".vscode","settings.json"),i=await e.promises.readFile(s,"utf8");let o=JSON.parse(i);for(const e of ot)o=d.all([o,at(e)]);n.doesContainsPoetryLock&&(o=d.all([o,at("**/.venv/**")])),n.depending.next&&(o=d.all([o,at("**/.next/**")])),"editor.codeActionsOnSave"in o&&delete o["editor.codeActionsOnSave"],"editor.formatOnSave"in o&&delete o["editor.formatOnSave"],tt(o??{});const r=JSON.stringify(o,void 0,2);await $.run(()=>C.generateFile(s,r))}catch{}})}function at(e){return{"files.watcherExclude":{[e]:!0}}}const ct={test:{name:"Test",on:{pull_request:null,push:{branches:["main","wbfy"]}},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 lt(n){return k.functionIgnoringException("generateWorkflow",async()=>{const s=t.resolve(n.dirPath,".github","workflows");await e.promises.mkdir(s,{recursive:!0});const i=t.resolve(n.dirPath,".github","semantic.yml");await $.run(()=>e.promises.rm(i,{force:!0,recursive:!0}));const o=await e.promises.readdir(s,{withFileTypes:!0}),r=new Set(["test.yml","wbfy.yml","wbfy-merge.yml","semantic-pr.yml","close-comment.yml","add-issue-to-project.yml",...o.filter(e=>e.isFile()&&e.name.endsWith(".yml")).map(e=>e.name)]);n.depending.semanticRelease&&r.add("release.yml"),(n.isPublicRepo||n.repository?.startsWith("github:WillBoosterLab/"))&&(r.add("add-ready-issue-to-project.yml"),r.add("notify-ready.yml"));for(const e of r){const i=t.basename(e,".yml");await $.run(()=>pt(n,s,i))}await $.run(()=>e.promises.rm(t.join(s,"add-focused-issue-to-project.yml"),{force:!0,recursive:!0}))})}async function pt(n,s,i){let o=m(ct[i]??{});const r=t.join(s,`${i}.yml`);try{const t=await e.promises.readFile(r,"utf8"),n=u.load(t);o=d.all([o,n,o],{arrayMerge:Q})}catch{}i.startsWith("deploy")&&(o={...o,concurrency:{group:"${{ github.workflow }}","cancel-in-progress":!1}},o.jobs&&function(e,t){const n=e[t];delete e[t],e[t]=n}(o,"jobs"),o.on?.push&&(o.on.push["paths-ignore"]=[...new Set(["**.md","**/docs/**",...o.on.push["paths-ignore"]??[]])]));for(const e of Object.values(o.jobs)){if(!e.uses?.includes?.("/reusable-workflows/"))return;dt(n,e,i)}switch(i){case"release":if(o.on?.schedule)delete o.on.push;else{if(!(o.on?.push&&n.release.branches.length>0))return void await e.promises.rm(t.join(s,"release.yml"),{force:!0});o.on.push.branches=n.release.branches}break;case"test":delete o.on?.pull_request?.["paths-ignore"],delete o.on?.push?.["paths-ignore"],o.on?.push&&(o.on.push.branches=o.on.push.branches.filter(e=>"renovate/**"!==e));break;case"wbfy":o.on&&ut(o,20,24);break;case"wbfy-merge":ut(o,1,4)}if(function(e){delete e.jobs["add-to-project"]}(o),await mt(o,r),"release"===i)await e.promises.rm(t.join(s,"semantic-release.yml"),{force:!0});else if("sync"===i){if(await e.promises.rm(t.join(s,"sync-init.yml"),{force:!0}),!o.jobs.sync||!o.jobs.sync.with)return;o.jobs["sync-force"]=o.jobs.sync;const n=o.jobs.sync.with.sync_params_without_dest;if("string"!=typeof n)return;o.jobs.sync.with.sync_params_without_dest=`--force ${n}`,o.name="Force to Sync",o.on={workflow_dispatch:null},delete o.jobs.sync,await mt(o,t.join(s,"sync-force.yml"))}}function dt(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;"string"==typeof e&&(t.with.sync_params_without_dest=e.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&&"string"==typeof t.with.deploy_command&&(t.with.deploy_command=t.with.deploy_command.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||n.startsWith("deploy")?e.isPublicRepo&&(t.with.github_hosted_runner=!0):delete t.with.github_hosted_runner,Object.keys(t.with).length>0?tt(t.with):delete t.with,Object.keys(t.secrets).length>0){const e=tt(t.secrets);delete t.secrets,t.secrets=e}else delete t.secrets}function ut(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 mt(t,n){const s=u.dump(t,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}});await e.promises.writeFile(n,s)}async function ft(n){return k.functionIgnoringException("generateYarnrcYml",async()=>{const s=t.resolve(n.dirPath,".yarnrc.yml");if(n.isBun)return await $.run(()=>e.promises.rm(s,{force:!0})),await $.run(()=>e.promises.rm(t.resolve(n.dirPath,".yarn"),{force:!0,recursive:!0})),void await $.run(()=>e.promises.rm(t.resolve(n.dirPath,"yarn.lock"),{force:!0,recursive:!0}));const i=J("yarn",["--version"],n.dirPath),o=function(e,t){const n=J("npm",["show",e,"versions","--json"],t);return JSON.parse(n).at(-1)}("@yarnpkg/cli",n.dirPath);gt(i)<=gt(o)&&i!==o&&L("yarn",["set","version",o],n.dirPath,1);const r=t.join(n.dirPath,".yarn","releases");await e.promises.mkdir(r,{recursive:!0});for(const n of await e.promises.readdir(r))n.startsWith("yarn-")&&!n.startsWith(`yarn-${o}.`)&&await $.run(()=>e.promises.rm(t.join(r,n)));const a=t.resolve(n.dirPath,".yarnrc");await $.run(()=>e.promises.rm(a,{force:!0}));const c=u.load(await e.promises.readFile(s,"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 s=t.resolve(n.dirPath,".yarnrc","undefined.cjs");await $.run(()=>e.promises.rm(s,{force:!0}))}0===c.plugins.length&&delete c.plugins,await e.promises.writeFile(s,u.dump(c,{lineWidth:-1})),L("yarn",["dlx","yarn-plugin-auto-install"],n.dirPath)})}function gt(e){const[t]=e.split(".");return Number(t)}async function ht(e){return k.functionIgnoringException("setupLabels",async()=>{if(!A)return;const[t,n]=W.getOrgAndName(e.repository??"");if(t&&n&&("WillBooster"===t||"WillBoosterLab"===t))try{await yt(t,n,"d1: x-easy :hedgehog:","EDE9FE"),await yt(t,n,"d2: easy :rabbit2:","DDD6FE"),await yt(t,n,"d3: medium :ox:","C4B5FD"),await yt(t,n,"d4: hard :squid:","A78BFA"),await yt(t,n,"d5: x-hard :whale2:","8B5CF6"),await yt(t,n,"p1: critical :fire::fire::fire:","EF4444"),await yt(t,n,"p2: urgent :fire::fire:","F87171"),await yt(t,n,"p3: important :fire:","FCA5A5"),await yt(t,n,"p4: nice to have :droplet:","FECACA"),await yt(t,n,"r: blitz","5300bc"),await yt(t,n,"r: firebase","ffca28"),await yt(t,n,"r: prisma","0c344b"),await yt(t,n,"r: react","61dafb"),await yt(t,n,"r: svelte","ff3e00"),await yt(t,n,"r: semantic-release","494949"),await yt(t,n,"ready :rocket:","22C55E"),await yt(t,n,"review requested :mag:","FBCA04"),await yt(t,n,"released :bookmark:","6366F1"),await yt(t,n,"s: 0.5h :clock1230:","F3F4F6"),await yt(t,n,"s: 1h :clock1:","E5E7EB"),await yt(t,n,"s: 2h :clock2:","D1D5DB"),await yt(t,n,"s: 3h :clock3:","9CA3AF"),await yt(t,n,"s: 5h :clock5:","6B7280"),await yt(t,n,"s: 8h :clock8:","4B5563"),await yt(t,n,"s: 13h :clock1:","374151"),await yt(t,n,"t: build :hammer:","BFDBFE"),await yt(t,n,"t: chore :broom:","BFDBFE"),await yt(t,n,"t: ci :construction_worker:","BFDBFE"),await yt(t,n,"t: docs :memo:","BFDBFE"),await yt(t,n,"t: feat :sparkles:","BFDBFE"),await yt(t,n,"t: fix :bug:","BFDBFE"),await yt(t,n,"t: perf :zap:","BFDBFE"),await yt(t,n,"t: refactor :recycle:","BFDBFE"),await yt(t,n,"t: style :lipstick:","BFDBFE"),await yt(t,n,"t: test :test_tube:","BFDBFE"),await yt(t,n,"project","24292F"),await yt(t,n,"focused :dart:","22C55E"),await yt(t,n,"ai-pr :robot:","00B4D8"),await wt(t,n,"bug"),await wt(t,n,"documentation"),await wt(t,n,"duplicate"),await wt(t,n,"enhancement"),await wt(t,n,"good first issue"),await wt(t,n,"help wanted"),await wt(t,n,"invalid"),await wt(t,n,"question"),await wt(t,n,"wontfix"),await wt(t,n,"ready"),await wt(t,n,"review requested"),await wt(t,n,"released"),await wt(t,n,"semantic-release"),await wt(t,n,"llm-pr :robot:")}catch(e){console.warn("Skip setupLabels due to:",e?.stack??e)}})}async function yt(e,t,n,s){try{await R.request("POST /repos/{owner}/{repo}/labels",{owner:e,repo:t,name:n,color:s})}catch{await R.request("PATCH /repos/{owner}/{repo}/labels/{name}",{owner:e,repo:t,name:n,color:s})}}async function wt(e,t,n){try{await R.request("DELETE /repos/{owner}/{repo}/labels/{name}",{owner:e,repo:t,name:n})}catch{}}const bt=["READY_DISCORD_WEBHOOK_URL"];async function vt(e){return k.functionIgnoringException("setupSecrets",async()=>{if(!A||!v.doesUploadEnvVars)return;const[t,n]=W.getOrgAndName(e.repository??"");if(!t||!n||"WillBoosterLab"!==t)return;const s=g.config().parsed||{};if(0!==Object.keys(s).length)try{for(const e of bt)try{await R.request("DELETE /repos/{owner}/{repo}/actions/secrets/{secret_name}",{owner:t,repo:n,secret_name:e})}catch{}const i=await R.request("GET /repos/{owner}/{repo}/actions/secrets/public-key",{owner:t,repo:n}),{key:o,key_id:r}=i.data;await h.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=h.from_base64(o,h.base64_variants.ORIGINAL),c=h.from_string(a),l=h.crypto_box_seal(c,s),p=h.to_base64(l,h.base64_variants.ORIGINAL);await R.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 kt(e){const[t,n]=W.getOrgAndName(e.repository??"");t&&n&&("WillBooster"!==t&&"WillBoosterLab"!==t||await s(()=>R.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 jt={"pull_request_template.md":'\nClose #<IssueNumber>\n\n## Self Check\n\n- [ ] I\'ve confirmed `All checks have passed` on this page.\n - PR title follows [Angular\'s commit message format](https://github.com/angular/angular/blob/main/CONTRIBUTING.md#-commit-message-format).\n - PR title doesn\'t have `WIP:`.\n - The test command (e.g., `yarn test`) passed.\n - The lint command (e.g., `yarn lint`) passed.\n - You may leave this box unchecked due to long workflows.\n- [ ] I\'ve reviewed my changes on the GitHub diff view.\n- [ ] I\'ve written the steps to test my changes.\n- [ ] I\'ve added screenshots (if the UI changed).\n - You may leave this box unchecked if you didn\'t modify the UI.\n\n\x3c!-- Please add screenshots if you modify the UI.\n| Current | In coming |\n| ------------------------ | ------------------------ |\n| <img src="" width="400"> | <img src="" width="400"> |\n--\x3e\n\n\x3c!-- Please add steps to test your changes.\n## Steps to Test\n\n1. Open http://localhost-exercode.willbooster.net:3000/ja-JP/courses/_example/lessons/_example_a_plus_b/problems/_example_a_plus_b after login.\n2. Select the language `C`.\n3. Write the following code:\n ```c\n #include <stdio.h>\n\n int main(void) {\n int a, b;\n\n scanf("%d %d", &a, &b);\n printf("%d", a + b);\n return 0;\n }\n ```\n4. Push `Submit` button.\n5. ...\n--\x3e\n'.trim()};async function xt(n){return k.functionIgnoringException("generateGitHubTemplates",async()=>{for(const[s,i]of Object.entries(jt)){const o=t.resolve(n.dirPath,".github",s);if(e.existsSync(o)){const t=await e.promises.readFile(o,"utf8");if(y(t,i)>i.length/2)continue}await e.promises.mkdir(t.resolve(n.dirPath,".github"),{recursive:!0}),await $.run(()=>C.generateFile(o,i))}})}const _t=b.object({typos:b.object({all:b.record(b.string()).optional(),doc:b.record(b.string()).optional(),ts:b.record(b.string()).optional(),text:b.record(b.string()).optional()}).optional()});async function Pt(n,s){const i=t.resolve(n,"package.json");try{const o=e.existsSync(i);let a={},c={},l={},p=!1;if(o){const t=e.readFileSync(i,"utf8");l=JSON.parse(t),a=l.dependencies??{},c=l.devDependencies??{},p="module"===l.type}let d=[],u=[];try{const e=t.resolve(n,".releaserc.json"),s=JSON.parse(await r.readFile(e,"utf8"));d=s?.branches||[],u=s?.plugins?.flat()||[]}catch{}const m="packages"!==t.basename(t.resolve(n,".."))||!e.existsSync(t.resolve(n,"..","..","package.json"));let f;m&&(f=await async function(e,t){const n=w(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 $t(i);if(e)return e}const o="string"==typeof t.repository?t.repository:t.repository?.url;if(o){const e=await $t(o);if(e&&"Not Found"!==e.message)return e}}(n,l));let g="";try{g+=(await r.readFile(t.resolve(n,".tool-versions"),"utf8")).trim()}catch{}for(const[e,s]of[["java","java"],["node","nodejs"],["python","python"]])try{const i=await r.readFile(t.resolve(n,`.${e}-version`),"utf8");g&&(g+="\n"),g+=s+" "+i.trim()}catch{}let h="";try{h=await r.readFile(t.resolve(n,"Dockerfile"),"utf8")}catch{}const y=t.resolve(n,"wbfy.json");let b;try{const e=await r.readFile(y,"utf8");b=_t.parse(JSON.parse(e))}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||e.existsSync(t.join(n,"bunfig.toml")),isEsmPackage:p,isWillBoosterConfigs:i.includes(`${t.sep}willbooster-configs`),doesContainsSubPackageJsons:St("packages/**/package.json",n),doesContainsDockerfile:!!h||e.existsSync(t.resolve(n,"docker-compose.yml")),doesContainsGemfile:e.existsSync(t.resolve(n,"Gemfile")),doesContainsGoMod:e.existsSync(t.resolve(n,"go.mod")),doesContainsPackageJson:e.existsSync(t.resolve(n,"package.json")),doesContainsPoetryLock:e.existsSync(t.resolve(n,"poetry.lock")),doesContainsPomXml:e.existsSync(t.resolve(n,"pom.xml")),doesContainsPubspecYaml:e.existsSync(t.resolve(n,"pubspec.yaml")),doesContainsTemplateYaml:e.existsSync(t.resolve(n,"template.yaml")),doesContainsVscodeSettingsJson:e.existsSync(t.resolve(n,".vscode","settings.json")),doesContainsJavaScript:St("{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx}",n),doesContainsTypeScript:St("{app,src,test,scripts}/**/*.{cts,mts,ts,tsx}",n),doesContainsJsxOrTsx:St("{app,src,test}/**/*.{t,j}sx",n),doesContainsJavaScriptInPackages:St("packages/**/{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx}",n),doesContainsTypeScriptInPackages:St("packages/**/{app,src,test,scripts}/**/*.{cts,mts,ts,tsx}",n),doesContainsJsxOrTsxInPackages:St("packages/**/{app,src,test}/**/*.{t,j}sx",n),depending:{blitz:!!a.blitz,firebase:!!c["firebase-tools"],genI18nTs:!!c["gen-i18n-ts"],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:b};if(v.isBun||(v.eslintBase=function(e){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 St(e,t){return a.globSync(e,{dot:!0,cwd:t,ignore:_}).length>0}async function $t(e){const[t,n]=W.getOrgAndName(e);if(!t||!n)return;const s={full_name:`${t}/${n}`};try{const e=await R.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;v.isVerbose=n.verbose,v.doesUploadEnvVars=n.env;for(const s of n.paths){const o=t.join(s,"packages"),r=(await i(()=>e.promises.readdir(o,{withFileTypes:!0}))??[]).filter(e=>e.isDirectory()).map(e=>t.join(o,e.name));await S([s,...r]);const a=await Pt(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=>Pt(e,a)))).filter(e=>!!e),p=[a,...l];if(v.isVerbose)for(const e of p)console.info(e);await q(a),await ft(a),await Promise.all([j(a),P(a),c.then(()=>Ve(a)),D(a,p),ce(a),de(a),ge(a),he(a),we(a),xt(a),Le(a),et(a),Qe(a),lt(a),ht(a),vt(a),kt(a),...a.isBun?[ee(a),De(a).then(()=>ze(a))]:[De(a)],Me(a)]),await $.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(x(e)),e.depending.next&&d.push(He(e)),await ve(e,a),await $.promiseAll(),(e.isRoot||e.doesContainsPackageJson)&&(await qe(e),await Ee(e,a,n.skipDeps),d.push(Me(e)),e.doesContainsVscodeSettingsJson&&e.doesContainsPackageJson&&d.push(rt(e)),(e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages)&&d.push(it(e)),(e.doesContainsJavaScript||e.doesContainsJavaScriptInPackages||e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages)&&(a.isBun&&d.push(Z(e)),a.isWillBoosterConfigs||d.push(me(e))),e.depending.pyright&&d.push(Ke(e)));await Promise.all(d),await $.promiseAll();const u=a.isBun?"bun":"yarn";if(L(u,["cleanup"],s),a.isBun){L(u,["update"],s);const n=t.join(s,"bun.lockb");e.existsSync(n)&&(e.promises.rm(n),L(u,["install","--save-text-lockfile","--frozen-lockfile","--lockfile-only"],s))}else L(u,["install"],s)}}();
|
2
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9vcHRpb25zLnRzIiwiLi4vc3JjL2xvZ2dlci50cyIsIi4uL3NyYy9maXhlcnMvZG9ja2VyZmlsZS50cyIsIi4uL3NyYy9maXhlcnMvcGxheXdyaWdodENvbmZpZy50cyIsIi4uL3NyYy91dGlscy9nbG9iVXRpbC50cyIsIi4uL3NyYy9maXhlcnMvcHJpc21hLnRzIiwiLi4vc3JjL2ZpeGVycy90ZXN0RGlyZWN0b3J5LnRzIiwiLi4vc3JjL3V0aWxzL3Byb21pc2VQb29sLnRzIiwiLi4vc3JjL2ZpeGVycy90eXBlRGVmaW5pdGlvbi50cyIsIi4uL3NyYy91dGlscy9mc1V0aWwudHMiLCIuLi9zcmMvZml4ZXJzL3R5cG9zLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvYWdlbnRzLnRzIiwiLi4vc3JjL3V0aWxzL2dpdGh1YlV0aWwudHMiLCIuLi9zcmMvdXRpbHMvc3Bhd25VdGlsLnRzIiwiLi4vc3JjL3V0aWxzL3ZlcnNpb24udHMiLCIuLi9zcmMvdXRpbHMvdmVyc2lvbkNvbnN0YW50cy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2FzZGYudHMiLCIuLi9zcmMvdXRpbHMvbWVyZ2VVdGlsLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvYmlvbWUudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9idW5maWcudHMiLCIuLi9zcmMvdXRpbHMvaWdub3JlRmlsZVV0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9kb2NrZXJpZ25vcmUudHMiLCIuLi9zcmMvdXRpbHMvZXh0ZW5zaW9ucy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2VkaXRvcmNvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2VzbGludENvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2dlbWluaUNvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2dlbWluaVNldHRpbmdzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2l0YXR0cmlidXRlcy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2dpdGlnbm9yZS50cyIsIi4uL3NyYy9naXRodWIvY29tbWl0LnRzIiwiLi4vc3JjL3V0aWxzL2VzbGludFV0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9wYWNrYWdlSnNvbi50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2h1c2t5cmMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9pZGVhLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvbGVmdGhvb2sudHMiLCIuLi9zcmMvdXRpbHMvc3JjRGlyZWN0b3JpZXMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9saW50c3RhZ2VkcmMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9uZXh0Y29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcHJldHRpZXJpZ25vcmUudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9weXJpZ2h0Y29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVhZG1lLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVsZWFzZXJjLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVub3ZhdGVKc29uLnRzIiwiLi4vc3JjL3V0aWxzL29iamVjdFV0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy90c2NvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3ZzY29kZVNldHRpbmdzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvd29ya2Zsb3cudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy95YXJucmMudHMiLCIuLi9zcmMvZ2l0aHViL2xhYmVsLnRzIiwiLi4vc3JjL2dpdGh1Yi9zZWNyZXQudHMiLCIuLi9zcmMvZ2l0aHViL3NldHRpbmdzLnRzIiwiLi4vc3JjL2dpdGh1Yi90ZW1wbGF0ZS50cyIsIi4uL3NyYy9wYWNrYWdlQ29uZmlnLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImNsYXNzIE9wdGlvbnMge1xuICBpc1ZlcmJvc2U6IGJvb2xlYW47XG4gIGRvZXNVcGxvYWRFbnZWYXJzOiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuaXNWZXJib3NlID0gZmFsc2U7XG4gICAgdGhpcy5kb2VzVXBsb2FkRW52VmFycyA9IGZhbHNlO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTtcbiIsImltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuL29wdGlvbnMuanMnO1xuXG5jbGFzcyBMb2dnZXIge1xuICBhc3luYyBmdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKG5hbWU6IHN0cmluZywgZnVuYzogKCkgPT4gUHJvbWlzZTx2b2lkPik6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGAtLS0tLS0tLS0gJHtuYW1lfSBzdGFydCAtLS0tLS0tLS1gKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZ1bmMoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5pbmZvKGBFcnJvciBvY2N1cnJlZCBpbiAke25hbWV9OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5zdGFjayA6IFN0cmluZyhlcnJvcil9fWApO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgLS0tLS0tLS0tLSAke25hbWV9IGVuZCAtLS0tLS0tLS0tYCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBsb2dnZXIgPSBuZXcgTG9nZ2VyKCk7XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhEb2NrZXJmaWxlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeERvY2tlcmZpbGUnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFjb25maWcuZG9lc0NvbnRhaW5zRG9ja2VyZmlsZSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2xkQ29udGVudCA9IGNvbmZpZy5kb2NrZXJmaWxlO1xuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBvbGRDb250ZW50O1xuXG4gICAgaWYgKG9sZENvbnRlbnQgPT09IG5ld0NvbnRlbnQpIHJldHVybjtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUocGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAnRG9ja2VyZmlsZScpLCBuZXdDb250ZW50KTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhQbGF5d3JpZ2h0Q29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFBsYXl3cmlnaHRDb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oY29uZmlnLmRpclBhdGgsICdwbGF5d3JpZ2h0LmNvbmZpZy50cycpO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHJldHVybjtcblxuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcblxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBvbGRDb250ZW50LnJlcGxhY2UoL3JldHJpZXM6LissLywgJ3JldHJpZXM6IHByb2Nlc3MuZW52LlBXREVCVUcgPyAwIDogcHJvY2Vzcy5lbnYuQ0kgPyA1IDogMSwnKTtcbiAgICBpZiAob2xkQ29udGVudCA9PT0gbmV3Q29udGVudCkgcmV0dXJuO1xuXG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KTtcbiAgfSk7XG59XG4iLCJleHBvcnQgY29uc3QgZ2xvYklnbm9yZSA9IFtcbiAgJyoqL25vZGVfbW9kdWxlcy8qKicsXG4gICcqKi8udmVudi8qKicsXG4gICcqKi90ZXN0LWZpeHR1cmVzLyoqJyxcbiAgJyoqL3Rlc3QvZml4dHVyZXMvKionLFxuICAnKiovZGlzdC8qKicsXG4gICcqKi9idWlsZC8qKicsXG4gICcqKi90YXJnZXQvKionLFxuICAnKiovdGVtcC8qKicsXG4gICcqKi90bXAvKionLFxuXTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnbG9iSWdub3JlIH0gZnJvbSAnLi4vdXRpbHMvZ2xvYlV0aWwuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4UHJpc21hRW52RmlsZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4UHJpc21hRW52RmlsZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZW52RmlsZXMgPSBhd2FpdCBmZy5nbG9iKFsnKi5lbnYnLCAnKi5lbnYuKiddLCB7IGRvdDogdHJ1ZSwgY3dkOiBjb25maWcuZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH0pO1xuICAgIGZvciAoY29uc3QgZW52RmlsZSBvZiBlbnZGaWxlcykge1xuICAgICAgY29uc3QgZW52RmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGVudkZpbGUpO1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGVudkZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3QgbmV3Q29udGVudCA9IGNvbnRlbnQucmVwbGFjZShcbiAgICAgICAgL0RBVEFCQVNFX1VSTD1cIj8oLitcXC5zcWxpdGUzKVwiP1tcXG4kXS8sXG4gICAgICAgICdEQVRBQkFTRV9VUkw9XCIkMT9jb25uZWN0aW9uX2xpbWl0PTFcIlxcbidcbiAgICAgICk7XG4gICAgICBhd2FpdCBmcy53cml0ZUZpbGUoZW52RmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgIH1cbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4VGVzdERpcmVjdG9yaWVzVXBkYXRpbmdQYWNrYWdlSnNvbihwYWNrYWdlRGlyUGF0aHM6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4VGVzdERpcmVjdG9yaWVzVXBkYXRpbmdQYWNrYWdlSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHBhY2thZ2VEaXJQYXRocy5tYXAoYXN5bmMgKHBhY2thZ2VEaXJQYXRoKSA9PiB7XG4gICAgICAgIGNvbnN0IG5ld1Rlc3REaXJQYXRoID0gcGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAndGVzdCcpO1xuICAgICAgICBmb3IgKGNvbnN0IG9sZFRlc3REaXJOYW1lIG9mIFsnX190ZXN0c19fJywgJ3Rlc3RzJ10pIHtcbiAgICAgICAgICBjb25zdCBvbGRUZXN0RGlyUGF0aCA9IHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgb2xkVGVzdERpck5hbWUpO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy5yZW5hbWUob2xkVGVzdERpclBhdGgsIG5ld1Rlc3REaXJQYXRoKTtcbiAgICAgICAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKTtcbiAgICAgICAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBvbGRDb250ZW50LnJlcGxhY2VBbGwob2xkVGVzdERpck5hbWUsICd0ZXN0Jyk7XG4gICAgICAgICAgICBpZiAob2xkQ29udGVudCA9PT0gbmV3Q29udGVudCkgcmV0dXJuO1xuXG4gICAgICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAncGFja2FnZS5qc29uJyksIG5ld0NvbnRlbnQpO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gZG8gbm90aGluZ1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICB9KTtcbn1cbiIsImltcG9ydCB7IFByb21pc2VQb29sIH0gZnJvbSAnbWluaW1hbC1wcm9taXNlLXBvb2wnO1xuXG5leHBvcnQgY29uc3QgcHJvbWlzZVBvb2wgPSBuZXcgUHJvbWlzZVBvb2woKTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGlnbm9yZUVub2VudEFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWInO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFR5cGVEZWZpbml0aW9ucyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBjb25maWdzSW5jbHVkaW5nQ2hpbGRyZW46IFBhY2thZ2VDb25maWdbXVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4VHlwZURlZmluaXRpb25zJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGxpYlR5cGVEaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnQHR5cGVzJyk7XG4gICAgY29uc3Qgc3JjVHlwZURpclBhdGggPVxuICAgICAgY29uZmlnLmlzUm9vdCAmJiBjb25maWcuZG9lc0NvbnRhaW5zU3ViUGFja2FnZUpzb25zID8gdW5kZWZpbmVkIDogcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnc3JjJywgJ3R5cGVzJyk7XG5cbiAgICBjb25zdCBkaXJlbnRzID0gYXdhaXQgaWdub3JlRW5vZW50QXN5bmMoKCkgPT4gZnMucmVhZGRpcihsaWJUeXBlRGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKTtcbiAgICBpZiAoIWRpcmVudHMpIHJldHVybjtcblxuICAgIGZvciAoY29uc3QgZGlyZW50IG9mIGRpcmVudHMpIHtcbiAgICAgIGNvbnN0IGRpck5hbWUgPSBkaXJlbnQubmFtZS5zbGljZSgwLCAtNSk7XG4gICAgICBjb25zdCBoYXNUeXBlRGVjbGFyYXRpb25FeHRlbnNpb24gPSBkaXJlbnQubmFtZS5lbmRzV2l0aCgnLmQudHMnKTtcbiAgICAgIGxldCBwYWNrYWdlTmFtZSA9IGhhc1R5cGVEZWNsYXJhdGlvbkV4dGVuc2lvbiA/IGRpck5hbWUgOiBkaXJlbnQubmFtZTtcbiAgICAgIGlmIChwYWNrYWdlTmFtZS5pbmNsdWRlcygnX18nKSkge1xuICAgICAgICBwYWNrYWdlTmFtZSA9IGBAJHtwYWNrYWdlTmFtZS5yZXBsYWNlKCdfXycsICcvJyl9YDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGhhc0xpYnJhcnkgPSBjb25maWdzSW5jbHVkaW5nQ2hpbGRyZW4uc29tZShcbiAgICAgICAgKGNvbmZpZykgPT5cbiAgICAgICAgICBjb25maWcucGFja2FnZUpzb24/LmRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSB8fCBjb25maWcucGFja2FnZUpzb24/LmRldkRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXVxuICAgICAgKTtcblxuICAgICAgaWYgKGRpcmVudC5pc0ZpbGUoKSAmJiBoYXNUeXBlRGVjbGFyYXRpb25FeHRlbnNpb24pIHtcbiAgICAgICAgaWYgKGhhc0xpYnJhcnkpIHtcbiAgICAgICAgICAvLyBNb3ZlIEB0eXBlcy88bmFtZT4vaW5kZXguZC50cyBpZiBpbnN0YWxsZWRcbiAgICAgICAgICBhd2FpdCBmcy5ta2RpcihwYXRoLmpvaW4obGliVHlwZURpclBhdGgsIGRpck5hbWUpKTtcbiAgICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgICAgICAgIGZzLnJlbmFtZShwYXRoLmpvaW4obGliVHlwZURpclBhdGgsIGRpcmVudC5uYW1lKSwgcGF0aC5qb2luKGxpYlR5cGVEaXJQYXRoLCBkaXJOYW1lLCAnaW5kZXguZC50cycpKVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3JjVHlwZURpclBhdGgpIHtcbiAgICAgICAgICAvLyBNb3ZlIHNyYy90eXBlcy88bmFtZT4gaWYgbm90IGluc3RhbGxlZFxuICAgICAgICAgIGF3YWl0IGZzLm1rZGlyKHNyY1R5cGVEaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgICAgICAgIGZzLnJlbmFtZShwYXRoLmpvaW4obGliVHlwZURpclBhdGgsIGRpcmVudC5uYW1lKSwgcGF0aC5qb2luKHNyY1R5cGVEaXJQYXRoLCBkaXJlbnQubmFtZSkpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChkaXJlbnQuaXNEaXJlY3RvcnkoKSAmJiBzcmNUeXBlRGlyUGF0aCAmJiAhaGFzTGlicmFyeSkge1xuICAgICAgICAvLyBNb3ZlIHNyYy90eXBlcy88bmFtZT4uZC50cyBpZiBub3QgaW5zdGFsbGVkXG4gICAgICAgIGF3YWl0IGZzLm1rZGlyKHNyY1R5cGVEaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICAgICAgaWdub3JlRW5vZW50QXN5bmMoKCkgPT5cbiAgICAgICAgICAgIGZzLnJlbmFtZShcbiAgICAgICAgICAgICAgcGF0aC5qb2luKGxpYlR5cGVEaXJQYXRoLCBkaXJlbnQubmFtZSwgJ2luZGV4LmQudHMnKSxcbiAgICAgICAgICAgICAgcGF0aC5qb2luKHNyY1R5cGVEaXJQYXRoLCBgJHtkaXJlbnQubmFtZX0uZC50c2ApXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5leHBvcnQgY29uc3QgZnNVdGlsID0ge1xuICBhc3luYyByZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gIH0sXG4gIGFzeW5jIGdlbmVyYXRlRmlsZShmaWxlUGF0aDogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihwYXRoLmRpcm5hbWUoZmlsZVBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQpO1xuICAgIGNvbnNvbGUubG9nKGBHZW5lcmF0ZWQvVXBkYXRlZCAke2ZpbGVQYXRofWApO1xuICB9LFxufTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4uL29wdGlvbnMuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJy4uL3V0aWxzL2dsb2JVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4VHlwb3MocGFja2FnZUNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFR5cG9zJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGRpclBhdGggPSBwYWNrYWdlQ29uZmlnLmRpclBhdGg7XG4gICAgY29uc3QgZG9jRmlsZXMgPSBhd2FpdCBmZy5nbG9iKCcqKi8qLm1kJywgeyBkb3Q6IHRydWUsIGN3ZDogZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH0pO1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBGb3VuZCAke2RvY0ZpbGVzLmxlbmd0aH0gbWFya2Rvd24gZmlsZXMgaW4gJHtkaXJQYXRofWApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IG1kRmlsZSBvZiBkb2NGaWxlcykge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgbWRGaWxlKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bihhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgICAgbGV0IG5ld0NvbnRlbnQgPSBmaXhUeXBvc0luVGV4dChjb250ZW50KTtcbiAgICAgICAgbmV3Q29udGVudCA9IHJlcGxhY2VXaXRoQ29uZmlnKG5ld0NvbnRlbnQsIHBhY2thZ2VDb25maWcsICdkb2MnKTtcbiAgICAgICAgaWYgKGNvbnRlbnQgIT09IG5ld0NvbnRlbnQpIHtcbiAgICAgICAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgdHNGaWxlcyA9IGF3YWl0IGZnLmdsb2IoXG4gICAgICBbXG4gICAgICAgICd7YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4LGN0cyxtdHMsdHMsdHN4fScsXG4gICAgICAgICdwYWNrYWdlcy8qKi97YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4LGN0cyxtdHMsdHMsdHN4fScsXG4gICAgICBdLFxuICAgICAgeyBkb3Q6IHRydWUsIGN3ZDogZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH1cbiAgICApO1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBGb3VuZCAke3RzRmlsZXMubGVuZ3RofSBUeXBlU2NyaXB0IGZpbGVzIGluICR7ZGlyUGF0aH1gKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCB0c0ZpbGUgb2YgdHNGaWxlcykge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgdHNGaWxlKTtcbiAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGxldCBuZXdDb250ZW50ID0gZml4VHlwb3NJbkNvZGUob2xkQ29udGVudCk7XG4gICAgICBuZXdDb250ZW50ID0gcmVwbGFjZVdpdGhDb25maWcobmV3Q29udGVudCwgcGFja2FnZUNvbmZpZywgJ3RzJyk7XG5cbiAgICAgIGlmIChvbGRDb250ZW50ID09PSBuZXdDb250ZW50KSBjb250aW51ZTtcbiAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgIH1cblxuICAgIGNvbnN0IHRleHRCYXNlZEZpbGVzID0gYXdhaXQgZmcuZ2xvYignKiovKi57Y3N2LGh0bSxodG1sLHRzdix4bWwseWFtbCx5bWx9Jywge1xuICAgICAgZG90OiB0cnVlLFxuICAgICAgY3dkOiBkaXJQYXRoLFxuICAgICAgaWdub3JlOiBnbG9iSWdub3JlLFxuICAgIH0pO1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBGb3VuZCAke3RleHRCYXNlZEZpbGVzLmxlbmd0aH0gdGV4dC1iYXNlZCBmaWxlcyBpbiAke2RpclBhdGh9YCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgZmlsZSBvZiB0ZXh0QmFzZWRGaWxlcykge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgZmlsZSk7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBsZXQgbmV3Q29udGVudCA9IGZpeFR5cG9zSW5UZXh0KG9sZENvbnRlbnQpO1xuICAgICAgbmV3Q29udGVudCA9IHJlcGxhY2VXaXRoQ29uZmlnKG5ld0NvbnRlbnQsIHBhY2thZ2VDb25maWcsICd0ZXh0Jyk7XG5cbiAgICAgIGlmIChvbGRDb250ZW50ID09PSBuZXdDb250ZW50KSBjb250aW51ZTtcbiAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgIH1cblxuICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaXhUeXBvc0luVGV4dChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gY29udGVudFxuICAgIC5yZXBsYWNlQWxsKC9cXGJjXFwuZlxcLihbXiRdKS9nLCAnY2YuJDEnKVxuICAgIC5yZXBsYWNlQWxsKC9cXGJlZ1xcLihbXiRdKS9nLCAnZS5nLiQxJylcbiAgICAucmVwbGFjZUFsbCgvXFxiaWVcXC4oW14kXSkvZywgJ2kuZS4kMScpO1xufVxuXG5mdW5jdGlvbiBmaXhUeXBvc0luQ29kZShjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gY29udGVudFxuICAgIC5yZXBsYWNlQWxsKC9cXC9cXC8oLiopY1xcLmZcXC4vZywgJy8vJDFjZi4nKVxuICAgIC5yZXBsYWNlQWxsKC9cXC9cXC8oLiopZWdcXC4vZywgJy8vJDFlLmcuJylcbiAgICAucmVwbGFjZUFsbCgvXFwvXFwvKC4qKWllXFwuL2csICcvLyQxaS5lLicpO1xufVxuXG5mdW5jdGlvbiByZXBsYWNlV2l0aENvbmZpZyhuZXdDb250ZW50OiBzdHJpbmcsIHBhY2thZ2VDb25maWc6IFBhY2thZ2VDb25maWcsIHByb3BOYW1lOiAnZG9jJyB8ICd0cycgfCAndGV4dCcpOiBzdHJpbmcge1xuICBmb3IgKGNvbnN0IFtiZWZvcmUsIGFmdGVyXSBvZiBPYmplY3QuZW50cmllcyhwYWNrYWdlQ29uZmlnLndiZnlKc29uPy50eXBvcz8uYWxsID8/IHt9KSkge1xuICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2VBbGwoYmVmb3JlLCBhZnRlcik7XG4gIH1cbiAgZm9yIChjb25zdCBbYmVmb3JlLCBhZnRlcl0gb2YgT2JqZWN0LmVudHJpZXMocGFja2FnZUNvbmZpZy53YmZ5SnNvbj8udHlwb3M/Lltwcm9wTmFtZV0gPz8ge30pKSB7XG4gICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZUFsbChiZWZvcmUsIGFmdGVyKTtcbiAgfVxuICByZXR1cm4gbmV3Q29udGVudDtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbnMoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghY29uZmlnLmlzUm9vdCkgcmV0dXJuO1xuXG4gICAgLy8gQ2hlY2sgaWYgQUdFTlRTX0VYVFJBLm1kIGV4aXN0cyBhbmQgcmVhZCBpdHMgY29udGVudFxuICAgIGNvbnN0IGFnZW50c0V4dHJhUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ0FHRU5UU19FWFRSQS5tZCcpO1xuICAgIGNvbnN0IGV4dHJhQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoYWdlbnRzRXh0cmFQYXRoKTtcblxuICAgIGNvbnN0IGNvbnRlbnQgPSBnZW5lcmF0ZUNsYXVkZUNvbnRlbnQoY29uZmlnLCBhbGxDb25maWdzLCBleHRyYUNvbnRlbnQpO1xuICAgIGZvciAoY29uc3QgZmlsZU5hbWUgb2YgWydBR0VOVFMubWQnLCAnQ0xBVURFLm1kJywgJ0dFTUlOSS5tZCddKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgZmlsZU5hbWUpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQpKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUNsYXVkZUNvbnRlbnQoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10sIGV4dHJhQ29udGVudD86IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gY29uZmlnLmlzQnVuID8gJ2J1bicgOiAneWFybic7XG4gIGNvbnN0IGJhc2VDb250ZW50ID0gYFxuIyMgUHJvamVjdCBJbmZvcm1hdGlvblxuXG4tIE5hbWU6ICR7Y29uZmlnLnBhY2thZ2VKc29uPy5uYW1lfVxuLSBEZXNjcmlwdGlvbjogJHtjb25maWcucGFja2FnZUpzb24/LmRlc2NyaXB0aW9ufVxuLSBQYWNrYWdlIE1hbmFnZXI6ICR7cGFja2FnZU1hbmFnZXJ9XG5cbiMjIEdlbmVyYWwgSW5zdHJ1Y3Rpb25zXG5cbiR7XG4gIGFsbENvbmZpZ3Muc29tZSgoYykgPT4gYy5kZXBlbmRpbmcuZ2VuSTE4blRzKVxuICAgID8gYC0gSWYgeW91IGludHJvZHVjZSBuZXcgc3RyaW5nIGxpdGVyYWxzIGluIFJlYWN0IGNvbXBvbmVudHMsIHVwZGF0ZSBsYW5ndWFnZSByZXNvdXJjZSBmaWxlcyBpbiBcXGBpMThuXFxgIGRpcmVjdG9yeSBsaWtlIFxcYGkxOG4vamEtSlAuanNvblxcYC4gUmVmZXJlbmNlIHRoZXNlIHN0cmluZ3MgdXNpbmcgdGhlIFxcYGkxOG5cXGAgdXRpbGl0eSwgZm9yIGV4YW1wbGU6IFxcYGkxOG4ucGFnZXMuaG9tZS50aXRsZSgpXFxgIGZvciBcXGB7IFwicGFnZXNcIjogeyBcImhvbWVcIjogeyBcInRpdGxlXCI6IFwiTXkgQXBwXCIgfSB9IH1cXGAuYFxuICAgIDogJydcbn1cbi0gQWZ0ZXIgbWFraW5nIGNvZGUgY2hhbmdlcywgY29tbWl0IHRoZW0gdG8gdGhlIGN1cnJlbnQgYnJhbmNoIHVzaW5nIHRoZSBcXGAtLW5vLXZlcmlmeVxcYCBvcHRpb24uIE1ha2Ugc3VyZSB0byBhZGQgYSBuZXcgbGluZSBhdCB0aGUgZW5kIG9mIHlvdXIgY29tbWl0IG1lc3NhZ2Ugd2l0aDogXFxgQ28tYXV0aG9yZWQtYnk6IFdpbGxCb29zdGVyIChBZ2VudCkgPGFnZW50QHdpbGxib29zdGVyLmNvbT5cXGAuXG4tIE9uY2UgeW91IGhhdmUgY29tbWl0dGVkIHlvdXIgY2hhbmdlcywgcnVuIFxcYCR7cGFja2FnZU1hbmFnZXJ9IGNoZWNrLWZvci1haVxcYCB0byBwZXJmb3JtIHR5cGUgY2hlY2tpbmcgYW5kIGxpbnRpbmcuXG4tIFdoZW4geW91ciB3b3JrIGlzIGZ1bGx5IGNvbXBsZXRlLCBydW4gXFxgJHtwYWNrYWdlTWFuYWdlcn0gY2hlY2stYWxsLWZvci1haVxcYCB0byBleGVjdXRlIGFsbCB0ZXN0cyAobm90ZTogdGhpcyBtYXkgdGFrZSB1cCB0byAzMCBtaW51dGVzKS5cbi0gT25jZSBcXGAke3BhY2thZ2VNYW5hZ2VyfSBjaGVjay1hbGwtZm9yLWFpXFxgIHBhc3NlcywgY29tbWl0IGFueSByZW1haW5pbmcgY2hhbmdlcyB0byB0aGUgY3VycmVudCBicmFuY2ggYW5kIHB1c2guXG5cbiMjIENvZGluZyBTdHlsZVxuXG4tIFdoZW4gYWRkaW5nIG5ldyBmdW5jdGlvbnMgb3IgY2xhc3NlcywgZGVmaW5lIHRoZW0gYmVsb3cgYW55IGZ1bmN0aW9ucyBvciBjbGFzc2VzIHRoYXQgY2FsbCB0aGVtIHRvIG1haW50YWluIGNsZWFyIGNhbGwgb3JkZXIuXG4ke1xuICBhbGxDb25maWdzLnNvbWUoKGMpID0+IGMuZGVwZW5kaW5nLm5leHQpXG4gICAgPyBgLSBTaW5jZSB0aGlzIHByb2plY3QgdXNlcyB0aGUgUmVhY3QgQ29tcGlsZXIsIHlvdSBkbyBub3QgbmVlZCB0byB1c2UgXFxgdXNlQ2FsbGJhY2tcXGAgb3IgXFxgdXNlTWVtb1xcYCBmb3IgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uLmBcbiAgICA6ICcnXG59XG5gXG4gICAgLnJlcGxhY2VBbGwoL1xcbnszLH0vZywgJ1xcblxcbicpXG4gICAgLnRyaW0oKTtcblxuICByZXR1cm4gZXh0cmFDb250ZW50ID8gYmFzZUNvbnRlbnQgKyAnXFxuXFxuJyArIGV4dHJhQ29udGVudC50cmltKCkgOiBiYXNlQ29udGVudDtcbn1cbiIsImltcG9ydCB7IE9jdG9raXQgfSBmcm9tICdAb2N0b2tpdC9jb3JlJztcblxuY29uc3QgdG9rZW4gPVxuICBwcm9jZXNzLmVudi5HSF9CT1RfUEFUIHx8IHByb2Nlc3MuZW52LlBVQkxJQ19HSF9CT1RfUEFUIHx8IHByb2Nlc3MuZW52LkdIX1RPS0VOIHx8IHByb2Nlc3MuZW52LkdJVEhVQl9UT0tFTjtcbmV4cG9ydCBjb25zdCBoYXNHaXRIdWJUb2tlbiA9ICEhdG9rZW47XG5leHBvcnQgY29uc3Qgb2N0b2tpdCA9IG5ldyBPY3Rva2l0KHtcbiAgYXV0aDogdG9rZW4sXG59KTtcblxuY2xhc3MgR2l0SHViVXRpbCB7XG4gIGdldE9yZ0FuZE5hbWUodXJsT3JGdWxsTmFtZTogc3RyaW5nKTogW3N0cmluZywgc3RyaW5nXSB7XG4gICAgY29uc3QgdXJsV2l0aG91dFByb3RvY29sID0gdXJsT3JGdWxsTmFtZS5zcGxpdCgnOicpLmF0KC0xKTtcbiAgICBjb25zdCBuYW1lcyA9IHVybFdpdGhvdXRQcm90b2NvbD8uc3BsaXQoJy8nKTtcbiAgICBjb25zdCBvcmcgPSBuYW1lcz8uYXQoLTIpID8/ICcnO1xuICAgIGNvbnN0IG5hbWUgPSBuYW1lcz8uYXQoLTEpPy5yZXBsYWNlKC8uZ2l0JC8sICcnKSA/PyAnJztcbiAgICByZXR1cm4gW29yZywgbmFtZV07XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGdpdEh1YlV0aWwgPSBuZXcgR2l0SHViVXRpbCgpO1xuIiwiaW1wb3J0IHR5cGUgeyBTcGF3blN5bmNPcHRpb25zIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3blN5bmMoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcsIHJldHJ5ID0gMCk6IHZvaWQge1xuICBkbyB7XG4gICAgY29uc3QgW25ld0NtZCwgbmV3QXJncywgb3B0aW9uc10gPSBnZXRTcGF3blN5bmNBcmdzKGNvbW1hbmQsIGFyZ3MsIGN3ZCk7XG4gICAgY29uc29sZS5sb2coYCQgJHtuZXdDbWR9ICR7bmV3QXJncy5qb2luKCcgJyl9IGF0ICR7Y3dkfWApO1xuICAgIGNvbnN0IHJldCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKG5ld0NtZCwgbmV3QXJncywgb3B0aW9ucyk7XG4gICAgaWYgKHJldC5zdGF0dXMgPT09IDApIGJyZWFrO1xuICB9IHdoaWxlICgtLXJldHJ5ID49IDApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3Bhd25TeW5jV2l0aFN0cmluZ1Jlc3VsdChjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IFtuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnNdID0gZ2V0U3Bhd25TeW5jQXJncyhjb21tYW5kLCBhcmdzLCBjd2QpO1xuICBvcHRpb25zLnN0ZGlvID0gJ3BpcGUnO1xuICBjb25zdCBwcm9jID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMobmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zKTtcbiAgY29uc3QgZXJyb3IgPSBwcm9jLnN0ZGVyci50b1N0cmluZygpLnRyaW0oKTtcbiAgaWYgKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihgJHtuZXdDbWR9IFske25ld0FyZ3MubWFwKChzKSA9PiBgXCIke3N9XCJgKS5qb2luKCcsICcpfV0gY2F1c2VkIHRoZSBmb2xsb3dpbmcgZXJyb3I6XFxuICR7ZXJyb3J9YCk7XG4gIH1cbiAgcmV0dXJuIHByb2Muc3Rkb3V0LnRvU3RyaW5nKCkudHJpbSgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3Bhd25TeW5jQXJncyhjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZyk6IFtzdHJpbmcsIHN0cmluZ1tdLCBTcGF3blN5bmNPcHRpb25zXSB7XG4gIGNvbnN0IGVudiA9IHsgLi4ucHJvY2Vzcy5lbnYgfTtcbiAgLy8gUmVtb3ZlIGJlcnJ5IGZyb20gUEFUSFxuICBpZiAoZW52LlBBVEggJiYgZW52LkJFUlJZX0JJTl9GT0xERVIpIHtcbiAgICBlbnYuUEFUSCA9IGVudi5QQVRILnJlcGxhY2UoYCR7ZW52LkJFUlJZX0JJTl9GT0xERVJ9OmAsICcnKTtcbiAgfVxuXG4gIGlmIChlbnYuQVNERl9ESVIpIHtcbiAgICBhcmdzID0gWyctbCcsICctYycsIGAke2NvbW1hbmR9ICR7YXJncy5qb2luKCcgJyl9YF07XG4gICAgY29tbWFuZCA9ICdiYXNoJztcbiAgfVxuICByZXR1cm4gW1xuICAgIGNvbW1hbmQsXG4gICAgYXJncyxcbiAgICB7XG4gICAgICBjd2QsXG4gICAgICBlbnYsXG4gICAgICBzaGVsbDogZmFsc2UsXG4gICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIH0sXG4gIF07XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gY29udmVydFZlcnNpb25JbnRvTnVtYmVyKHZlcnNpb246IHN0cmluZyk6IG51bWJlciB7XG4gIC8vIGUuZy4gamF2YSBhZG9wdG9wZW5qZGstMTEuMC4xNys4XG4gIGNvbnN0IG51bWJlcnMgPSB2ZXJzaW9uXG4gICAgLnNwbGl0KC9bKy4tXS8pXG4gICAgLm1hcChOdW1iZXIpXG4gICAgLmZpbHRlcigobnVtKSA9PiAhTnVtYmVyLmlzTmFOKG51bSkpO1xuICBsZXQgdmVyc2lvbk51bWJlciA9IDA7XG4gIGxldCBkaXZpc29yID0gMTtcbiAgZm9yIChjb25zdCBudW0gb2YgbnVtYmVycykge1xuICAgIHZlcnNpb25OdW1iZXIgKz0gbnVtICogZGl2aXNvcjtcbiAgICBkaXZpc29yIC89IDEwMDA7XG4gIH1cbiAgcmV0dXJuIHZlcnNpb25OdW1iZXI7XG59XG4iLCJleHBvcnQgY29uc3QgUFlUSE9OX1ZFUlNJT04gPSAnMy45LjE5JztcbmV4cG9ydCBjb25zdCBKQVZBX1ZFUlNJT04gPSAnenVsdS0xMS43NC4xNSc7XG4vLyBCZWNhdXNlIFdlYktpdCBjYW5ub3QgbG9nLWluIG9uIEJsaXR6IHYyLjAuNStcbmV4cG9ydCBjb25zdCBCTElUWl9WRVJTSU9OID0gJzIuMC40JztcbmV4cG9ydCBjb25zdCBORVhUX1ZFUlNJT04gPSAnMTQuMi41JztcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IG9jdG9raXQgfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jLCBzcGF3blN5bmNXaXRoU3RyaW5nUmVzdWx0IH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcbmltcG9ydCB7IGNvbnZlcnRWZXJzaW9uSW50b051bWJlciB9IGZyb20gJy4uL3V0aWxzL3ZlcnNpb24uanMnO1xuaW1wb3J0IHsgSkFWQV9WRVJTSU9OLCBQWVRIT05fVkVSU0lPTiB9IGZyb20gJy4uL3V0aWxzL3ZlcnNpb25Db25zdGFudHMuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVUb29sVmVyc2lvbnMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVUb29sVmVyc2lvbnMnLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgY29yZShjb25maWcpO1xuICB9KTtcbn1cblxuY29uc3QgQ09SRV9UT09MUyA9IG5ldyBTZXQoWydqYXZhJywgJ25vZGVqcycsICdidW4nLCAncHl0aG9uJ10pO1xuY29uc3QgREVQUkVDQVRFRF9WRVJTSU9OX1BSRUZJWEVTID0gWydqYXZhJywgJ25vZGUnLCAncHl0aG9uJ107XG5cbmFzeW5jIGZ1bmN0aW9uIGNvcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghY29uZmlnLnZlcnNpb25zVGV4dCkgcmV0dXJuO1xuXG4gIGNvbnN0IGR1cGxpY2F0YWJsZUxpbmVzID0gY29uZmlnLnZlcnNpb25zVGV4dFxuICAgIC50cmltKClcbiAgICAuc3BsaXQoJ1xcbicpXG4gICAgLm1hcCgobGluZSkgPT4ge1xuICAgICAgY29uc3QgW25hbWUsIHZlcnNpb25dID0gbGluZS50cmltKCkuc3BsaXQoL1xccysvKTtcbiAgICAgIC8vIFRvIG1vdmUgdGhlIHRvcCBvZiB0aGUgc29ydGVkIGxpc3QsIHdlIG5lZWQgdG8gYWRkIGEgc3BhY2UuXG4gICAgICByZXR1cm4gYCR7Q09SRV9UT09MUy5oYXMobmFtZSkgPyAnICcgOiAnJ30ke25hbWV9ICR7dmVyc2lvbn1gO1xuICAgIH0pXG4gICAgLnNvcnQoKVxuICAgIC8vIFJlbW92ZSBhZGRlZCBzcGFjZXMuXG4gICAgLm1hcCgobGluZSkgPT4gbGluZS50cmltKCkpXG4gICAgLy8gVE9ETzogcmVtb3ZlIHRoZSBmb2xsb3dpbmcgbGluZSBhZnRlciBsZWZ0aG9vayBpcyBpbnN0YWxsZWQgdmlhIG5wbS5cbiAgICAuZmlsdGVyKChsaW5lKSA9PiAhbGluZS5zdGFydHNXaXRoKCdsZWZ0aG9vaycpKTtcbiAgY29uc3QgbGluZXMgPSBbLi4ubmV3IFNldChkdXBsaWNhdGFibGVMaW5lcyldO1xuXG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5zUG9ldHJ5TG9jaykge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJ2h0dHBzOi8vcHlwaS5vcmcvcHlwaS9wb2V0cnkvanNvbicpO1xuICAgIGNvbnN0IGpzb24gPSAoYXdhaXQgcmVzcG9uc2UuanNvbigpKSBhcyB7IGluZm8/OiB7IHZlcnNpb246IHN0cmluZyB9IH0gfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgcG9ldHJ5VmVyc2lvbiA9IGpzb24/LmluZm8/LnZlcnNpb247XG4gICAgaWYgKHBvZXRyeVZlcnNpb24pIHtcbiAgICAgIHVwZGF0ZVZlcnNpb24obGluZXMsICdwb2V0cnknLCBwb2V0cnlWZXJzaW9uKTtcbiAgICB9XG4gICAgdXBkYXRlVmVyc2lvbihsaW5lcywgJ3B5dGhvbicsIFBZVEhPTl9WRVJTSU9OLCB0cnVlKTtcbiAgfVxuICBpZiAoY29uZmlnLmRlcGVuZGluZy5maXJlYmFzZSkge1xuICAgIHVwZGF0ZVZlcnNpb24obGluZXMsICdqYXZhJywgSkFWQV9WRVJTSU9OLCB0cnVlKTtcbiAgfVxuICBpZiAoY29uZmlnLmRvZXNDb250YWluc1BhY2thZ2VKc29uKSB7XG4gICAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgICAgY29uc3QgYnVuVmVyc2lvbiA9IGF3YWl0IGdldExhdGVzdFZlcnNpb25Gcm9tVGFnT25HaXRIdWIoJ292ZW4tc2gnLCAnYnVuJyk7XG4gICAgICBpZiAoYnVuVmVyc2lvbikgdXBkYXRlVmVyc2lvbihsaW5lcywgJ2J1bicsIGJ1blZlcnNpb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB2ZXJzaW9uID0gc3Bhd25TeW5jV2l0aFN0cmluZ1Jlc3VsdCgnbnBtJywgWydzaG93JywgJ3lhcm4nLCAndmVyc2lvbiddLCBjb25maWcuZGlyUGF0aCk7XG4gICAgICB1cGRhdGVWZXJzaW9uKGxpbmVzLCAneWFybicsIHZlcnNpb24pO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3QgcHJlZml4IG9mIERFUFJFQ0FURURfVkVSU0lPTl9QUkVGSVhFUykge1xuICAgIGNvbnN0IHZlcnNpb25QYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBgLiR7cHJlZml4fS12ZXJzaW9uYCk7XG4gICAgdm9pZCBmcy5wcm9taXNlcy5ybSh2ZXJzaW9uUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIGNvbnN0IHRvb2xWZXJzaW9uc1BhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcudG9vbC12ZXJzaW9ucycpO1xuICBhd2FpdCAobGluZXMubGVuZ3RoID4gMFxuICAgID8gcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLndyaXRlRmlsZSh0b29sVmVyc2lvbnNQYXRoLCBsaW5lcy5qb2luKCdcXG4nKSArICdcXG4nKSlcbiAgICA6IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybSh0b29sVmVyc2lvbnNQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKSk7XG4gIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgc3Bhd25TeW5jKCdhc2RmJywgWydwbHVnaW4nLCAndXBkYXRlJywgJy0tYWxsJ10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgc3Bhd25TeW5jKCdhc2RmJywgWydpbnN0YWxsJ10sIGNvbmZpZy5kaXJQYXRoKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlVmVyc2lvbihsaW5lczogc3RyaW5nW10sIHRvb2xOYW1lOiBzdHJpbmcsIG5ld1ZlcnNpb246IHN0cmluZywgaGVhZCA9IGZhbHNlKTogdm9pZCB7XG4gIGNvbnN0IGluZGV4ID0gbGluZXMuZmluZEluZGV4KChsKSA9PiBsLnNwbGl0KC9cXHMrLylbMF0gPT09IHRvb2xOYW1lKTtcbiAgY29uc3QgbmV3TGluZSA9IGAke3Rvb2xOYW1lfSAke25ld1ZlcnNpb259YDtcbiAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgIGxpbmVzLnNwbGljZShoZWFkID8gMCA6IGxpbmVzLmxlbmd0aCwgMCwgbmV3TGluZSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgWywgdmVyc2lvbl0gPSBsaW5lc1tpbmRleF0uc3BsaXQoL1xccysvKTtcbiAgICBpZiAoY29udmVydFZlcnNpb25JbnRvTnVtYmVyKG5ld1ZlcnNpb24pID4gY29udmVydFZlcnNpb25JbnRvTnVtYmVyKHZlcnNpb24pKSB7XG4gICAgICBsaW5lc1tpbmRleF0gPSBuZXdMaW5lO1xuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRMYXRlc3RWZXJzaW9uRnJvbVRhZ09uR2l0SHViKG9yZ2FuaXphdGlvbjogc3RyaW5nLCByZXBvc2l0b3J5OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIC8vIEZldGNoIHRoZSBsYXRlc3QgcmVsZWFzZSBmcm9tIHRoZSByZXBvc2l0b3J5XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ0dFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcmVsZWFzZXMvbGF0ZXN0Jywge1xuICAgICAgb3duZXI6IG9yZ2FuaXphdGlvbixcbiAgICAgIHJlcG86IHJlcG9zaXRvcnksXG4gICAgfSk7XG4gICAgY29uc3QgdmVyc2lvbiA9IHJlc3BvbnNlLmRhdGEudGFnX25hbWU7XG4gICAgY29uc3QgaW5kZXggPSB2ZXJzaW9uLmxhc3RJbmRleE9mKCd2Jyk7XG4gICAgY29uc3QgdmVyc2lvbk51bWJlclRleHQgPSBpbmRleCA9PT0gLTEgPyB2ZXJzaW9uIDogdmVyc2lvbi5zbGljZShpbmRleCArIDEpO1xuICAgIC8vIENoZWNrIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaXMgYSBudW1iZXJcbiAgICByZXR1cm4gL15cXGQvLnRlc3QodmVyc2lvbk51bWJlclRleHQpID8gdmVyc2lvbk51bWJlclRleHQgOiB1bmRlZmluZWQ7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGZldGNoIEJ1biB0YWdzIGR1ZSB0bzonLCBlcnJvcik7XG4gICAgcmV0dXJuO1xuICB9XG59XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWFzc2lnbm1lbnQsIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtY2FsbCwgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzLCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWFyZ3VtZW50ICovXG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5leHBvcnQgZnVuY3Rpb24gb3ZlcndyaXRlTWVyZ2U8VD4oZGVzdGluYXRpb25BcnJheTogVFtdLCBzb3VyY2VBcnJheTogVFtdKTogVFtdIHtcbiAgcmV0dXJuIHNvdXJjZUFycmF5O1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGZ1bmN0aW9uIGNvbWJpbmVNZXJnZSh0YXJnZXQ6IG9iamVjdFtdLCBzb3VyY2U6IG9iamVjdFtdLCBvcHRpb25zOiBhbnkpOiBvYmplY3RbXSB7XG4gIGNvbnN0IGRlc3RpbmF0aW9uID0gWy4uLnRhcmdldF07XG5cbiAgZm9yIChjb25zdCBbaW5kZXgsIGl0ZW1dIG9mIHNvdXJjZS5lbnRyaWVzKCkpIHtcbiAgICBpZiAoZGVzdGluYXRpb25baW5kZXhdID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGRlc3RpbmF0aW9uW2luZGV4XSA9IG9wdGlvbnMuY2xvbmVVbmxlc3NPdGhlcndpc2VTcGVjaWZpZWQoaXRlbSwgb3B0aW9ucyk7XG4gICAgfSBlbHNlIGlmIChvcHRpb25zLmlzTWVyZ2VhYmxlT2JqZWN0KGl0ZW0pKSB7XG4gICAgICBkZXN0aW5hdGlvbltpbmRleF0gPSBtZXJnZSh0YXJnZXRbaW5kZXhdLCBpdGVtLCBvcHRpb25zKTtcbiAgICB9IGVsc2UgaWYgKCF0YXJnZXQuaW5jbHVkZXMoaXRlbSkpIHtcbiAgICAgIGRlc3RpbmF0aW9uLnB1c2goaXRlbSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBkZXN0aW5hdGlvbjtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgb3ZlcndyaXRlTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUJpb21lSnNvbmMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVCaW9tZUpzb25jJywgYXN5bmMgKCkgPT4ge1xuICAgIGxldCBuZXdTZXR0aW5nczogb2JqZWN0ID0ge1xuICAgICAgcm9vdDogY29uZmlnLmlzUm9vdCxcbiAgICAgICRzY2hlbWE6ICcuL25vZGVfbW9kdWxlcy9AYmlvbWVqcy9iaW9tZS9jb25maWd1cmF0aW9uX3NjaGVtYS5qc29uJyxcbiAgICAgIGV4dGVuZHM6IFsnQHdpbGxib29zdGVyL2Jpb21lLWNvbmZpZyddLFxuICAgIH07XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdiaW9tZS5qc29uYycpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBvbGRTZXR0aW5ncyA9IEpTT04ucGFyc2Uob2xkQ29udGVudCkgYXMgb2JqZWN0O1xuICAgICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBuZXdDb250ZW50V2l0aEV4YWN0VHJ1ZSA9IGB0ZWxlbWV0cnkgPSBmYWxzZVxuXG5baW5zdGFsbF1cbmV4YWN0ID0gdHJ1ZVxuXG5bcnVuXVxuYnVuID0gdHJ1ZVxuYDtcblxuY29uc3QgbmV3Q29udGVudFdpdGhFeGFjdEZhbHNlID0gYHRlbGVtZXRyeSA9IGZhbHNlXG5cbltpbnN0YWxsXVxuZXhhY3QgPSBmYWxzZVxuXG5bcnVuXVxuYnVuID0gdHJ1ZVxuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQnVuZmlnVG9tbChjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUJ1bmZpZ1RvbWwnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdidW5maWcudG9tbCcpO1xuICAgIGNvbnN0IGNvbnRlbnQgPVxuICAgICAgZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkgJiYgZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmOCcpLmluY2x1ZGVzKCdleGFjdCA9IGZhbHNlJylcbiAgICAgICAgPyBuZXdDb250ZW50V2l0aEV4YWN0RmFsc2VcbiAgICAgICAgOiBuZXdDb250ZW50V2l0aEV4YWN0VHJ1ZTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgY29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcblxuY29uc3QgdXNlckNvbnRlbnRIZWFkZXIgPSAnIyBQcm9qZWN0LXNwZWNpZmljIHNldHRpbmdzJztcbmNvbnN0IHVzZXJDb250ZW50SGVhZGVyUmVnZXggPSAvIyBQcm9qZWN0LXNwZWNpZmljIHNldHRpbmdzW15cXG5dKlxcbi9nbTtcbmNvbnN0IHNlcGFyYXRvciA9ICcjIEdlbmVyYXRlZCBieSB3YmZ5JztcbmNvbnN0IHNlcGFyYXRvclByZWZpeCA9ICcjIEdlbmVyYXRlZCBieSAnO1xuY29uc3QgZGVmYXVsdEhlYWRVc2VyQ29udGVudCA9IGAke3VzZXJDb250ZW50SGVhZGVyfSAoaGVhZClcblxuXG4ke3NlcGFyYXRvcn1cbmA7XG5jb25zdCBkZWZhdWx0VGFpbFVzZXJDb250ZW50ID0gYFxuJHt1c2VyQ29udGVudEhlYWRlcn0gKHRhaWwpXG5gO1xuXG5leHBvcnQgY29uc3QgaWdub3JlRmlsZVV0aWwgPSB7XG4gIHNlcGFyYXRvcixcbiAgc2VwYXJhdG9yUHJlZml4LFxuICBkZWZhdWx0SGVhZFVzZXJDb250ZW50LFxuICBkZWZhdWx0VGFpbFVzZXJDb250ZW50LFxuICBhc3luYyByZWFkR2l0aWdub3JlV2l0aG91dFNlcGFyYXRvcnMoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGxldCBjb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBsYXN0SGVhZGVySW5kZXggPSBnZXRJbmRleE9mVGFpbFVzZXJDb250ZW50SGVhZGVyKGNvbnRlbnQpO1xuICAgICAgaWYgKGxhc3RIZWFkZXJJbmRleCA+IDApIHtcbiAgICAgICAgY29udGVudCA9IGNvbnRlbnQuc2xpY2UoMCwgbGFzdEhlYWRlckluZGV4IC0gMSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gKFxuICAgICAgICBjb250ZW50XG4gICAgICAgICAgLnJlcGxhY2VBbGwodXNlckNvbnRlbnRIZWFkZXJSZWdleCwgJycpXG4gICAgICAgICAgLnJlcGxhY2VBbGwoLyMgR2VuZXJhdGVkIGJ5IFteXFxuXSpcXG4vZ20sICcnKVxuICAgICAgICAgIC5yZXBsYWNlQWxsKC9cXHI/XFxuXFxyP1xcbihcXHI/XFxuKSsvZ20sICdcXG5cXG4nKVxuICAgICAgICAgIC50cmltKCkgKyAnXFxuJ1xuICAgICAgKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gIH0sXG4gIGdldEhlYWRVc2VyQ29udGVudChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGluZGV4ID0gY29udGVudC5pbmRleE9mKHRoaXMuc2VwYXJhdG9yUHJlZml4KTtcbiAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICByZXR1cm4gY29udGVudFxuICAgICAgICAuc2xpY2UoMCwgY29udGVudC5pbmRleE9mKCdcXG4nLCBpbmRleCkgKyAxKVxuICAgICAgICAucmVwbGFjZUFsbCh1c2VyQ29udGVudEhlYWRlclJlZ2V4LCBgJHt1c2VyQ29udGVudEhlYWRlcn0gKGhlYWQpXFxuYCk7XG4gICAgfVxuICAgIHJldHVybiBkZWZhdWx0SGVhZFVzZXJDb250ZW50O1xuICB9LFxuICBnZXRUYWlsVXNlckNvbnRlbnQoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBsYXN0SGVhZGVySW5kZXggPSBnZXRJbmRleE9mVGFpbFVzZXJDb250ZW50SGVhZGVyKGNvbnRlbnQpO1xuICAgIGlmIChsYXN0SGVhZGVySW5kZXggPiAwKSB7XG4gICAgICByZXR1cm4gY29udGVudC5zbGljZShsYXN0SGVhZGVySW5kZXggLSAxKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlZmF1bHRUYWlsVXNlckNvbnRlbnQ7XG4gIH0sXG4gIGFzeW5jIGlzQmVycnlaZXJvSW5zdGFsbEVuYWJsZWQoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICByZXR1cm4gY29udGVudC5pbmNsdWRlcygnXFxuIS55YXJuL2NhY2hlJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LFxufTtcblxuZnVuY3Rpb24gZ2V0SW5kZXhPZlRhaWxVc2VyQ29udGVudEhlYWRlcihjb250ZW50OiBzdHJpbmcpOiBudW1iZXIge1xuICBjb25zdCBpbmRleCA9IGNvbnRlbnQuaW5kZXhPZih1c2VyQ29udGVudEhlYWRlcik7XG4gIGNvbnN0IGxhc3RJbmRleCA9IGNvbnRlbnQubGFzdEluZGV4T2YodXNlckNvbnRlbnRIZWFkZXIpO1xuICByZXR1cm4gbGFzdEluZGV4ID4gaW5kZXggPyBsYXN0SW5kZXggOiAtMTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBpZ25vcmVGaWxlVXRpbCB9IGZyb20gJy4uL3V0aWxzL2lnbm9yZUZpbGVVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG4vLyBFeGVyY29kZeOBp+OBr25vZGVfbW9kdWxlc+OCkkNPUFnjgZnjgovlv4XopoHjgYzjgYLjgovjgZ/jgoHjgIFub2RlX21vZHVsZXPjgpLpmaTlpJbjgZfjgabjga/jgYTjgZHjgarjgYTjgIJcbmNvbnN0IGNvbW1vbkNvbnRlbnQgPSBgXG4qKi8uaWRlYVxuKiovKi5zcWxpdGUzKlxuKiovLnlhcm4vaW5zdGFsbC1zdGF0ZS5nelxuKiovLnZlbnZcbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZURvY2tlcmlnbm9yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZURvY2tlcmlnbm9yZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5kb2NrZXJpZ25vcmUnKTtcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc0RvY2tlcmZpbGUpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSAoYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihmaWxlUGF0aCkpID8/ICcnO1xuICAgICAgY29uc3QgaGVhZFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQpO1xuICAgICAgY29uc3QgdGFpbFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0VGFpbFVzZXJDb250ZW50KGNvbnRlbnQpO1xuXG4gICAgICBjb25zdCBuZXdDb250ZW50ID0gaGVhZFVzZXJDb250ZW50ICsgY29tbW9uQ29udGVudCArIHRhaWxVc2VyQ29udGVudDtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgIH1cbiAgfSk7XG59XG4iLCJleHBvcnQgY29uc3QgZXh0ZW5zaW9ucyA9IHtcbiAgY29kZVdpdGgySW5kZW50U2l6ZTogW1xuICAgICdjanMnLFxuICAgICdtanMnLFxuICAgICdqcycsXG4gICAgJ2pzeCcsXG4gICAgJ2N0cycsXG4gICAgJ210cycsXG4gICAgJ3RzJyxcbiAgICAndHN4JyxcbiAgICAnanNvbicsXG4gICAgJ2pzb241JyxcbiAgICAnanNvbmMnLFxuICAgICdjcHAnLFxuICAgICdkYXJ0JyxcbiAgICAnaHRtJyxcbiAgICAnaHRtbCcsXG4gICAgJ3B1JyxcbiAgICAncHVtbCcsXG4gICAgJ3JiJyxcbiAgICAndnVlJyxcbiAgICAneG1sJyxcbiAgICAneWFtbCcsXG4gICAgJ3ltbCcsXG4gICAgJ3NoJyxcbiAgXS5zb3J0KCksXG4gIGNvZGVXaXRoNEluZGVudFNpemU6IFsnZ28nLCAnZ3JhZGxlJywgJ2phdmEnLCAncHknXS5zb3J0KCksXG4gIG1hcmtkb3duTGlrZTogWydtZCddLnNvcnQoKSxcbiAgZXNsaW50OiBbJ2NqcycsICdtanMnLCAnanMnLCAnY3RzJywgJ210cycsICd0cycsICd0c3gnLCAnanN4J10uc29ydCgpLFxuICBwcmV0dGllcjogW1xuICAgICdjanMnLFxuICAgICdtanMnLFxuICAgICdqYXZhJyxcbiAgICAnanMnLFxuICAgICdqc3gnLFxuICAgICdjdHMnLFxuICAgICdtdHMnLFxuICAgICd0cycsXG4gICAgJ3RzeCcsXG4gICAgJ2pzb24nLFxuICAgICdqc29uNScsXG4gICAgJ2pzb25jJyxcbiAgICAnY3NzJyxcbiAgICAnaHRtJyxcbiAgICAnaHRtbCcsXG4gICAgJ21kJyxcbiAgICAnc2NzcycsXG4gICAgJ3Z1ZScsXG4gICAgJ3lhbWwnLFxuICAgICd5bWwnLFxuICBdLnNvcnQoKSxcbiAgLy8gY2YuIGh0dHBzOi8vYmlvbWVqcy5kZXYvaW50ZXJuYWxzL2xhbmd1YWdlLXN1cHBvcnQvXG4gIGJpb21lOiBbXG4gICAgJ2NqcycsXG4gICAgJ21qcycsXG4gICAgJ2pzJyxcbiAgICAnanN4JyxcbiAgICAnY3RzJyxcbiAgICAnbXRzJyxcbiAgICAndHMnLFxuICAgICd0c3gnLFxuICAgICdqc29uJyxcbiAgICAnanNvbjUnLFxuICAgICdqc29uYycsXG4gICAgJ2h0bScsXG4gICAgJ2h0bWwnLFxuICAgICd2dWUnLFxuICAgICdzdmVsdGUnLFxuICAgICdhc3RybycsXG4gICAgJ2NzcycsXG4gICAgJ3lhbWwnLFxuICAgICd5bWwnLFxuICAgICdncWwnLFxuICBdLnNvcnQoKSxcbn07XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IG5ld0NvbnRlbnQgPSBgcm9vdCA9IHRydWVcblxuWypdXG5jaGFyc2V0ID0gdXRmLThcbmVuZF9vZl9saW5lID0gbGZcbmluc2VydF9maW5hbF9uZXdsaW5lID0gdHJ1ZVxudHJpbV90cmFpbGluZ193aGl0ZXNwYWNlID0gdHJ1ZVxuXG4ke2dlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zLmNvZGVXaXRoMkluZGVudFNpemUpfVxuaW5kZW50X3NpemUgPSAyXG5pbmRlbnRfc3R5bGUgPSBzcGFjZVxuXG4ke2dlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zLmNvZGVXaXRoNEluZGVudFNpemUpfVxuaW5kZW50X3NpemUgPSA0XG5pbmRlbnRfc3R5bGUgPSBzcGFjZVxuXG4ke2dlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zLm1hcmtkb3duTGlrZSl9XG5tYXhfbGluZV9sZW5ndGggPSBvZmZcbnRyaW1fdHJhaWxpbmdfd2hpdGVzcGFjZSA9IGZhbHNlXG5cblt7TWFrZWZpbGUsKi5ta31dXG5pbmRlbnRfc3R5bGUgPSB0YWJcbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUVkaXRvcmNvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUVkaXRvcmNvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lZGl0b3Jjb25maWcnKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGV4dGVuc2lvbnMubGVuZ3RoID4gMSA/IGBbKi57JHtleHRlbnNpb25zLmpvaW4oJywnKX19XWAgOiBgWyouJHtleHRlbnNpb25zWzBdfV1gO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVFc2xpbnRyYyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUVzbGludHJjJywgYXN5bmMgKCkgPT4ge1xuICAgIC8vIFJlbW92ZSBkZXByZWNhdGVkIGZpbGVzXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lc2xpbnRyYy5qc29uJyksIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZXNsaW50aWdub3JlJyksIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdlc2xpbnQuY29uZmlnLmpzJyksIHsgZm9yY2U6IHRydWUgfSkpO1xuXG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdlc2xpbnQuY29uZmlnLm1qcycpO1xuICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFjb25maWcuZXNsaW50QmFzZSkgcmV0dXJuO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGlmICghb2xkQ29udGVudC5pbmNsdWRlcygnZXhwb3J0IHsgZGVmYXVsdCB9JykpIHJldHVybjtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgYGV4cG9ydCB7IGRlZmF1bHQgfSBmcm9tICcke2NvbmZpZy5lc2xpbnRCYXNlfSc7YCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IHlhbWwgZnJvbSAnanMteWFtbCc7XG5pbXBvcnQgY2xvbmVEZWVwIGZyb20gJ2xvZGFzaC5jbG9uZWRlZXAnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgb3ZlcndyaXRlTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGRlZmF1bHRDb25maWcgPSB7XG4gIGhhdmVfZnVuOiB0cnVlLFxuICBjb2RlX3Jldmlldzoge1xuICAgIGRpc2FibGU6IGZhbHNlLFxuICAgIGNvbW1lbnRfc2V2ZXJpdHlfdGhyZXNob2xkOiAnTUVESVVNJyxcbiAgICBtYXhfcmV2aWV3X2NvbW1lbnRzOiAtMSxcbiAgICBwdWxsX3JlcXVlc3Rfb3BlbmVkOiB7XG4gICAgICBoZWxwOiBmYWxzZSxcbiAgICAgIHN1bW1hcnk6IHRydWUsXG4gICAgICBjb2RlX3JldmlldzogdHJ1ZSxcbiAgICB9LFxuICB9LFxuICBpZ25vcmVfcGF0dGVybnM6IFsnKiovX19nZW5lcmF0ZWRfXyddLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlR2VtaW5pQ29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlR2VtaW5pQ29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghY29uZmlnLmlzUm9vdCkgcmV0dXJuO1xuXG4gICAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5nZW1pbmknKTtcbiAgICBjb25zdCBjb25maWdGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnY29uZmlnLnltbCcpO1xuICAgIGNvbnN0IHN0eWxlZ3VpZGVGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnc3R5bGVndWlkZS5tZCcpO1xuXG4gICAgbGV0IG5ld0NvbmZpZzogb2JqZWN0ID0gY2xvbmVEZWVwKGRlZmF1bHRDb25maWcpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoY29uZmlnRmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBvbGRDb25maWcgPSB5YW1sLmxvYWQob2xkQ29udGVudCkgYXMgb2JqZWN0O1xuICAgICAgbmV3Q29uZmlnID0gbWVyZ2UuYWxsKFtuZXdDb25maWcsIG9sZENvbmZpZywgbmV3Q29uZmlnXSwgeyBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmcgLSBmaWxlIGRvZXNuJ3QgZXhpc3Qgb3IgY2FuJ3QgYmUgcGFyc2VkXG4gICAgfVxuXG4gICAgY29uc3QgeWFtbENvbnRlbnQgPSB5YW1sLmR1bXAobmV3Q29uZmlnLCB7XG4gICAgICBsaW5lV2lkdGg6IC0xLFxuICAgICAgbm9Db21wYXRNb2RlOiB0cnVlLFxuICAgICAgc3R5bGVzOiB7XG4gICAgICAgICchIW51bGwnOiAnZW1wdHknLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHN0eWxlZ3VpZGVDb250ZW50ID0gJ+aXpeacrOiqnuOBp+ODrOODk+ODpeODvOOBl+OBpuOBj+OBoOOBleOBhOOAgic7XG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShjb25maWdGaWxlUGF0aCwgeWFtbENvbnRlbnQpKSxcbiAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKHN0eWxlZ3VpZGVGaWxlUGF0aCwgc3R5bGVndWlkZUNvbnRlbnQpKSxcbiAgICBdKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW1vdmVHZW1pbmlTZXR0aW5ncyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdlbWluaVNldHRpbmdzJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghY29uZmlnLmlzUm9vdCkgcmV0dXJuO1xuXG4gICAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5nZW1pbmknKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnc2V0dGluZ3MuanNvbicpO1xuICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pO1xuICB9KTtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuLy8gY2YuIGh0dHBzOi8vYnVuLnNoL2d1aWRlcy9pbnN0YWxsL2dpdC1kaWZmLWJ1bi1sb2NrZmlsZVxuY29uc3QgbmV3Q29udGVudCA9IGAqIHRleHQ9YXV0b1xuXG4qLmxvY2tiIGJpbmFyeSBkaWZmPWxvY2tiXG4qLnZjcHJvaiB0ZXh0IGVvbD1jcmxmXG5cbiR7Wy4uLmV4dGVuc2lvbnMuY29kZVdpdGgySW5kZW50U2l6ZSwgLi4uZXh0ZW5zaW9ucy5jb2RlV2l0aDRJbmRlbnRTaXplLCAuLi5leHRlbnNpb25zLm1hcmtkb3duTGlrZV1cbiAgLm1hcCgoZXh0KSA9PiBgKi4ke2V4dH0gdGV4dCBlb2w9bGZgKVxuICAuam9pbignXFxuJyl9XG5cbmRpc3QvKiogbGluZ3Vpc3QtZ2VuZXJhdGVkPXRydWVcbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGF0dHJpYnV0ZXMnKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBvcyBmcm9tICdub2RlOm9zJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBpZ25vcmVGaWxlVXRpbCB9IGZyb20gJy4uL3V0aWxzL2lnbm9yZUZpbGVVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBkZWZhdWx0TmFtZXMgPSBbJ3dpbmRvd3MnLCAnbWFjb3MnLCAnbGludXgnLCAnamV0YnJhaW5zJywgJ3Zpc3VhbHN0dWRpb2NvZGUnLCAnZW1hY3MnLCAndmltJywgJ3lhcm4nXTtcblxuY29uc3QgY29tbW9uQ29udGVudCA9IGBcbiEua2VlcFxuLmFpZGVyKlxuLmVudi5wcm9kdWN0aW9uXG4uaWRlYS9BdWdtZW50V2Vidmlld1N0YXRlU3RvcmUueG1sXG4uaWRlYS9jb3BpbG90L2NoYXRTZXNzaW9ucy9cbi5kZXZjb250YWluZXIvXG4qL21vdW50LyouaGFzaFxuX19nZW5lcmF0ZWRfXy9cbmRpc3QvXG50ZW1wL1xuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlR2l0aWdub3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZywgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlR2l0aWdub3JlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGlnbm9yZScpO1xuICAgIGNvbnN0IGNvbnRlbnQgPSAoYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihmaWxlUGF0aCkpID8/ICcnO1xuICAgIGxldCBoZWFkVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRIZWFkVXNlckNvbnRlbnQoY29udGVudCkgKyBjb21tb25Db250ZW50O1xuICAgIGNvbnN0IHRhaWxVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldFRhaWxVc2VyQ29udGVudChjb250ZW50KTtcblxuICAgIGNvbnN0IG5hbWVzID0gWy4uLmRlZmF1bHROYW1lc107XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNHZW1maWxlKSB7XG4gICAgICBuYW1lcy5wdXNoKCdydWJ5Jyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zR29Nb2QpIHtcbiAgICAgIG5hbWVzLnB1c2goJ2dvJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYCR7cGF0aC5iYXNlbmFtZShjb25maWcuZGlyUGF0aCl9XG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc1BhY2thZ2VKc29uKSB7XG4gICAgICBuYW1lcy5wdXNoKCdub2RlJyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zUG9tWG1sKSB7XG4gICAgICBuYW1lcy5wdXNoKCdtYXZlbicpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuaWRlYS9nb29nbGUtamF2YS1mb3JtYXQueG1sXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc1B1YnNwZWNZYW1sKSB7XG4gICAgICBuYW1lcy5wdXNoKCdmbHV0dGVyJywgJ0FuZHJvaWRTdHVkaW8nLCAncnVieScpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuZmx1dHRlci1wbHVnaW5zLWRlcGVuZGVuY2llc1xuYW5kcm9pZC9rZXkucHJvcGVydGllc1xuaW9zLy5idW5kbGVcbi5pZGVhL3J1bkNvbmZpZ3VyYXRpb25zLnhtbFxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNUZW1wbGF0ZVlhbWwpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLmF3cy1zYW0vXG5wYWNrYWdlZC55YW1sXG5gO1xuICAgIH1cbiAgICAvLyBCZWNhdXNlIC52ZW52IHNob3VsZCBiZSBpZ25vcmVkIG9uIHJvb3QgZGlyZWN0b3J5XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNQb2V0cnlMb2NrKSB7XG4gICAgICBuYW1lcy5wdXNoKCdweXRob24nKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLnZlbnYvXG5gO1xuICAgIH1cblxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6KSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5ibGl0ei9cbi5ibGl0eioqXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgICBuYW1lcy5wdXNoKCduZXh0anMnKTtcbiAgICB9XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLmZpcmViYXNlIHx8IGNvbmZpZy5kZXBlbmRpbmcuZmlyZWJhc2UpIHtcbiAgICAgIG5hbWVzLnB1c2goJ2ZpcmViYXNlJyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnByaXNtYSkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAqLnNxbGl0ZTMqXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0VGVzdCkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGB0ZXN0LXJlc3VsdHMvXG5gO1xuICAgIH1cbiAgICBpZiAocm9vdENvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUgfHwgY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgICAgbmFtZXMucHVzaCgncmVhY3RuYXRpdmUnKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgZ29vZ2xlLXNlcnZpY2VzLmpzb25cbmFuZHJvaWQvYXBwL3NyYy9tYWluL2Fzc2V0cy9cbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnN0b3J5Ym9vaykge1xuICAgICAgbmFtZXMucHVzaCgnc3Rvcnlib29ranMnKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubGl0ZXN0cmVhbSkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGBnY3Atc2Eta2V5Lmpzb25cbmA7XG4gICAgfVxuXG4gICAgbGV0IGdlbmVyYXRlZCA9ICcnO1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykge1xuICAgICAgbGV0IGNvbnRlbnQgPSAoYXdhaXQgcmVhZENhY2hlKG5hbWUpKSA/PyAnJztcbiAgICAgIGlmICghY29udGVudCkge1xuICAgICAgICBjb25zdCB1cmwgPSBgaHR0cHM6Ly93d3cudG9wdGFsLmNvbS9kZXZlbG9wZXJzL2dpdGlnbm9yZS9hcGkvJHtuYW1lfWA7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsKTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2VUZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgICBpZiAoIXJlc3BvbnNlLm9rIHx8IHJlc3BvbnNlVGV4dC5pbmNsdWRlcygnQXR0ZW50aW9uIFJlcXVpcmVkIScpIHx8IHJlc3BvbnNlVGV4dC5pbmNsdWRlcygnPHRpdGxlPicpKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGZldGNoICR7dXJsfWApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb250ZW50ID0gcmVzcG9uc2VUZXh0LnRyaW0oKTtcbiAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IHdyaXRlQ2FjaGUobmFtZSwgY29udGVudCkpO1xuICAgICAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oYEZldGNoZWQgJHt1cmx9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChnZW5lcmF0ZWQpIGdlbmVyYXRlZCArPSAnXFxuJztcbiAgICAgIGdlbmVyYXRlZCArPSBjb250ZW50ICsgJ1xcbic7XG4gICAgfVxuICAgIGlmICghKGF3YWl0IGlnbm9yZUZpbGVVdGlsLmlzQmVycnlaZXJvSW5zdGFsbEVuYWJsZWQoZmlsZVBhdGgpKSkge1xuICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2UoJyEueWFybi9jYWNoZScsICcjICEueWFybi9jYWNoZScpLnJlcGxhY2UoJyMgLnBucC4qJywgJy5wbnAuKicpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc1BvbVhtbCB8fCBjb25maWcuZG9lc0NvbnRhaW5zUHVic3BlY1lhbWwpIHtcbiAgICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZFxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9hcnRpZmFjdHMkL2dtLCAnLmlkZWEvYXJ0aWZhY3RzJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvY29tcGlsZXIueG1sJC9nbSwgJy5pZGVhL2NvbXBpbGVyLnhtbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL2phclJlcG9zaXRvcmllcy54bWwkL2dtLCAnLmlkZWEvamFyUmVwb3NpdG9yaWVzLnhtbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL21vZHVsZXMueG1sJC9nbSwgJy5pZGVhL21vZHVsZXMueG1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvKi5pbWwkL2dtLCAnLmlkZWEvKi5pbWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9tb2R1bGVzJC9nbSwgJy5pZGVhL21vZHVsZXMnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgKi5pbWwkL2dtLCAnKi5pbWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgKi5pcHIkL2dtLCAnKi5pcHInKTtcbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zUHVic3BlY1lhbWwpIHtcbiAgICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2VBbGwoL14uaWRlYVxcL21vZHVsZXMueG1sJC9nbSwgJyMgLmlkZWEvbW9kdWxlcy54bWwnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2VBbGwoL14uaWRlYVxcLz8kL2dtLCAnIyAuaWRlYScpO1xuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSB8fCBjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlIHx8IGNvbmZpZy5kb2VzQ29udGFpbnNQdWJzcGVjWWFtbCkge1xuICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2VBbGwoL14oLmlkZWFcXC8uKykkL2dtLCAnJDFcXG5hbmRyb2lkLyQxJyk7XG4gICAgfVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBoZWFkVXNlckNvbnRlbnQgKyAnXFxuJyArIGdlbmVyYXRlZCArIHRhaWxVc2VyQ29udGVudDtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuY29uc3QgZGlyUGF0aCA9IHBhdGguam9pbihvcy5ob21lZGlyKCksICcuY2FjaGUnLCAnd2JmeScsICdnaXRpZ25vcmUnKTtcblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVDYWNoZShuYW1lOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihkaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGguam9pbihkaXJQYXRoLCBuYW1lKSwgY29udGVudCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRDYWNoZShuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IHN0YXQgPSBhd2FpdCBmcy5wcm9taXNlcy5zdGF0KHBhdGguam9pbihkaXJQYXRoLCBuYW1lKSk7XG4gICAgaWYgKERhdGUubm93KCkgLSBzdGF0Lm10aW1lTXMgPiA2ICogNjAgKiA2MCAqIDEwMDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHBhdGguam9pbihkaXJQYXRoLCBuYW1lKSwgJ3V0ZjgnKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG4iLCJpbXBvcnQgeyBvY3Rva2l0IH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRMYXRlc3RDb21taXRIYXNoKG9yZ2FuaXphdGlvbjogc3RyaW5nLCByZXBvOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICB0cnkge1xuICAgIGNvbnN0IHsgZGF0YTogY29tbWl0cyB9ID0gYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbW1pdHMnLCB7XG4gICAgICBvd25lcjogb3JnYW5pemF0aW9uLFxuICAgICAgcmVwbyxcbiAgICAgIHBlcl9wYWdlOiAxLFxuICAgIH0pO1xuICAgIGlmIChjb21taXRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBjb21taXRzIGZvdW5kIGZvciAke29yZ2FuaXphdGlvbn0vJHtyZXBvfWApO1xuICAgIH1cbiAgICByZXR1cm4gY29tbWl0c1swXS5zaGE7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggY29tbWl0cyBmb3IgJHtvcmdhbml6YXRpb259LyR7cmVwb306ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmV4cG9ydCBjb25zdCBFc2xpbnRVdGlsID0ge1xuICBnZXRMaW50Rml4U3VmZml4KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGNvbmZpZy5kb2VzQ29udGFpbnNKc3hPclRzeCA/ICcgLS1ydWxlIFwieyByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHM6IDAgfVwiJyA6ICcnO1xuICB9LFxufTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYic7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uLCBTZXRSZXF1aXJlZCB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGdldExhdGVzdENvbW1pdEhhc2ggfSBmcm9tICcuLi9naXRodWIvY29tbWl0LmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEVzbGludEV4dGVuc2lvbkJhc2UsIFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IEVzbGludFV0aWwgfSBmcm9tICcuLi91dGlscy9lc2xpbnRVdGlsLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGdpdEh1YlV0aWwgfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcbmltcG9ydCB7IGdsb2JJZ25vcmUgfSBmcm9tICcuLi91dGlscy9nbG9iVXRpbC5qcyc7XG5pbXBvcnQgeyBpZ25vcmVGaWxlVXRpbCB9IGZyb20gJy4uL3V0aWxzL2lnbm9yZUZpbGVVdGlsLmpzJztcbmltcG9ydCB7IGNvbWJpbmVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHNwYXduU3luYyB9IGZyb20gJy4uL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5pbXBvcnQgeyBCTElUWl9WRVJTSU9OLCBORVhUX1ZFUlNJT04gfSBmcm9tICcuLi91dGlscy92ZXJzaW9uQ29uc3RhbnRzLmpzJztcblxuY29uc3QganNDb21tb25EZXBzID0gW1xuICAnZXNsaW50JyxcbiAgJ2VzbGludC1jb25maWctZmxhdC1naXRpZ25vcmUnLFxuICAnZXNsaW50LWNvbmZpZy1wcmV0dGllcicsXG4gICdlc2xpbnQtcGx1Z2luLXNvcnQtY2xhc3MtbWVtYmVycycsXG4gICdlc2xpbnQtcGx1Z2luLXNvcnQtZGVzdHJ1Y3R1cmUta2V5cycsXG4gICdlc2xpbnQtcGx1Z2luLXVuaWNvcm4nLFxuICAnZXNsaW50LXBsdWdpbi11bnVzZWQtaW1wb3J0cycsXG4gICdnbG9iYWxzJyxcbl07XG5cbmNvbnN0IHRzQ29tbW9uRGVwcyA9IFsuLi5qc0NvbW1vbkRlcHMsICd0eXBlc2NyaXB0LWVzbGludCcsICdlc2xpbnQtaW1wb3J0LXJlc29sdmVyLXR5cGVzY3JpcHQnXTtcblxuY29uc3QgcmVhY3RDb21tb25EZXBzID0gWydlc2xpbnQtcGx1Z2luLXJlYWN0JywgJ2VzbGludC1wbHVnaW4tcmVhY3QtaG9va3MnLCAnZXNsaW50LXBsdWdpbi1yZWFjdC1jb21waWxlciddO1xuXG5jb25zdCBlc2xpbnREZXBzOiBSZWNvcmQ8RXNsaW50RXh0ZW5zaW9uQmFzZSwgc3RyaW5nW10+ID0ge1xuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMnOiBbJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzJywgJ2VzbGludC1wbHVnaW4taW1wb3J0LXgnLCAuLi5qc0NvbW1vbkRlcHNdLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMtcmVhY3QnOiBbXG4gICAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzLXJlYWN0JyxcbiAgICAnZXNsaW50LXBsdWdpbi1pbXBvcnQteCcsXG4gICAgLi4uanNDb21tb25EZXBzLFxuICAgIC4uLnJlYWN0Q29tbW9uRGVwcyxcbiAgXSxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzJzogWydAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cycsICdlc2xpbnQtcGx1Z2luLWltcG9ydC14JywgLi4udHNDb21tb25EZXBzXSxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzLXJlYWN0JzogW1xuICAgICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cy1yZWFjdCcsXG4gICAgJ2VzbGludC1wbHVnaW4taW1wb3J0LXgnLFxuICAgIC4uLnRzQ29tbW9uRGVwcyxcbiAgICAuLi5yZWFjdENvbW1vbkRlcHMsXG4gIF0sXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1uZXh0JzogW1xuICAgICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1uZXh0JyxcbiAgICAnZXNsaW50LXBsdWdpbi1pbXBvcnQnLFxuICAgICdlc2xpbnQtY29uZmlnLW5leHQnLFxuICAgIC4uLnRzQ29tbW9uRGVwcyxcbiAgICAuLi5yZWFjdENvbW1vbkRlcHMsXG4gIF0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQYWNrYWdlSnNvbihcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBza2lwQWRkaW5nRGVwczogYm9vbGVhblxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVQYWNrYWdlSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBjb3JlKGNvbmZpZywgcm9vdENvbmZpZywgc2tpcEFkZGluZ0RlcHMpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29yZShjb25maWc6IFBhY2thZ2VDb25maWcsIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsIHNraXBBZGRpbmdEZXBzOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIGNvbnN0IGpzb25UZXh0ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gIGNvbnN0IGpzb25PYmogPSBKU09OLnBhcnNlKGpzb25UZXh0KSBhcyBQYWNrYWdlSnNvbjtcbiAganNvbk9iai5zY3JpcHRzID0ganNvbk9iai5zY3JpcHRzIHx8IHt9O1xuICBqc29uT2JqLmRlcGVuZGVuY2llcyA9IGpzb25PYmouZGVwZW5kZW5jaWVzIHx8IHt9O1xuICBqc29uT2JqLmRldkRlcGVuZGVuY2llcyA9IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzIHx8IHt9O1xuICBqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXMgPSBqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXMgfHwge307XG4gIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gY29uZmlnLmlzQnVuID8gJ2J1bicgOiAneWFybic7XG5cbiAgYXdhaXQgcmVtb3ZlRGVwcmVjYXRlZFN0dWZmKFxuICAgIHJvb3RDb25maWcsXG4gICAganNvbk9iaiBhcyBTZXRSZXF1aXJlZDxQYWNrYWdlSnNvbiwgJ3NjcmlwdHMnIHwgJ2RlcGVuZGVuY2llcycgfCAnZGV2RGVwZW5kZW5jaWVzJz5cbiAgKTtcblxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhqc29uT2JqLnNjcmlwdHMgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPikpIHtcbiAgICAvLyBGcmVzaCByZXBvIHN0aWxsIHJlcXVpcmVzICd5YXJuIGluc3RhbGwnXG4gICAgaWYgKCF2YWx1ZS5pbmNsdWRlcygnZ2l0IGNsb25lJykpIHtcbiAgICAgIGpzb25PYmouc2NyaXB0c1trZXldID0gdmFsdWUucmVwbGFjZSgveWFyblxccyomJlxccyovLCAnJykucmVwbGFjZSgveWFyblxccyppbnN0YWxsXFxzKiYmXFxzKi8sICcnKTtcbiAgICB9XG4gIH1cblxuICBqc29uT2JqLnNjcmlwdHMgPSBtZXJnZShqc29uT2JqLnNjcmlwdHMsIGdlbmVyYXRlU2NyaXB0cyhjb25maWcpKTtcblxuICBpZiAoJ2NoZWNrLWZvci1haScgaW4ganNvbk9iai5zY3JpcHRzKSB7XG4gICAgaWYgKCdnZW4tY29kZScgaW4ganNvbk9iai5zY3JpcHRzKSB7XG4gICAgICBqc29uT2JqLnNjcmlwdHNbJ2NoZWNrLWZvci1haSddID0gYCR7cGFja2FnZU1hbmFnZXJ9IGdlbi1jb2RlID4gL2Rldi9udWxsICYmICR7anNvbk9iai5zY3JpcHRzWydjaGVjay1mb3ItYWknXX1gO1xuICAgIH1cbiAgICBqc29uT2JqLnNjcmlwdHNbJ2NoZWNrLWZvci1haSddID0gYCR7cGFja2FnZU1hbmFnZXJ9IGluc3RhbGwgPiAvZGV2L251bGwgJiYgJHtqc29uT2JqLnNjcmlwdHNbJ2NoZWNrLWZvci1haSddfWA7XG4gIH1cblxuICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5wcmV0dGlmeTtcbiAgfSBlbHNlIHtcbiAgICBqc29uT2JqLnNjcmlwdHMucHJldHRpZnkgKz0gYXdhaXQgZ2VuZXJhdGVQcmV0dGllclN1ZmZpeChjb25maWcuZGlyUGF0aCk7XG4gIH1cbiAgLy8gRGVhbCB3aXRoIGJyZWFraW5nIGNoYW5nZXMgaW4geWFybiBiZXJyeSA0LjAuMC1yYy40OVxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhqc29uT2JqLnNjcmlwdHMpKSB7XG4gICAgaWYgKCF2YWx1ZT8uaW5jbHVkZXMoJ3lhcm4gd29ya3NwYWNlcyBmb3JlYWNoJykpIGNvbnRpbnVlO1xuICAgIGlmIChcbiAgICAgIHZhbHVlLmluY2x1ZGVzKCctLWFsbCcpIHx8XG4gICAgICB2YWx1ZS5pbmNsdWRlcygnLS1yZWN1cnNpdmUnKSB8fFxuICAgICAgdmFsdWUuaW5jbHVkZXMoJy0tc2luY2UnKSB8fFxuICAgICAgdmFsdWUuaW5jbHVkZXMoJy0td29ya3RyZWUnKVxuICAgIClcbiAgICAgIGNvbnRpbnVlO1xuICAgIGpzb25PYmouc2NyaXB0c1trZXldID0gdmFsdWUucmVwbGFjZSgneWFybiB3b3Jrc3BhY2VzIGZvcmVhY2gnLCAneWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwnKTtcbiAgfVxuXG4gIGxldCBkZXBlbmRlbmNpZXM6IHN0cmluZ1tdID0gW107XG4gIGxldCBkZXZEZXBlbmRlbmNpZXMgPSBbJ3ByZXR0aWVyJywgJ3NvcnQtcGFja2FnZS1qc29uJ107XG4gIGNvbnN0IHBvZXRyeURldkRlcGVuZGVuY2llczogc3RyaW5nW10gPSBbXTtcblxuICBpZiAoXG4gICAgIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHJvb3RDb25maWcuZGlyUGF0aCwgJy5wcmV0dGllcnJjLmpzb24nKSkgJiZcbiAgICAhZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY29uZmlnLmRpclBhdGgsICcucHJldHRpZXJyYy5qc29uJykpXG4gICkge1xuICAgIGpzb25PYmoucHJldHRpZXIgPSAnQHdpbGxib29zdGVyL3ByZXR0aWVyLWNvbmZpZyc7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ3ByZXR0aWVyLXBsdWdpbi1qYXZhJywgJ0B3aWxsYm9vc3Rlci9wcmV0dGllci1jb25maWcnKTtcbiAgfVxuXG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ2xpbnQtc3RhZ2VkJ107XG4gIH0gZWxzZSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ2xpbnQtc3RhZ2VkJyk7XG4gIH1cblxuICBpZiAoY29uZmlnLmlzUm9vdCkge1xuICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snaHVza3knXTtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1sncGluc3QnXTtcbiAgICAgIGpzb25PYmouc2NyaXB0cy5wcmVwYXJlID0gJ2xlZnRob29rIGluc3RhbGwgfHwgdHJ1ZSc7XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnbGVmdGhvb2snKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVG8gaW5zdGFsbCB0aGUgbGF0ZXN0IGh1c2t5XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnaHVza3knKTtcbiAgICAgIC8vICd8fCB0cnVlJyBhdm9pZHMgZXJyb3JzIHdoZW4gaHVza3kgaXMgbm90IGluc3RhbGxlZC5cbiAgICAgIGpzb25PYmouc2NyaXB0cy5wcmVwYXJlID0gJ2h1c2t5IHx8IHRydWUnOyAvLyBmb3Igbm9uLXlhcm4gcGFja2FnZSBtYW5hZ2Vycy5cbiAgICAgIGpzb25PYmouc2NyaXB0cy5wb3N0aW5zdGFsbCA9ICdodXNreSB8fCB0cnVlJzsgLy8gZm9yIHlhcm4uXG4gICAgICBpZiAoY29uZmlnLmlzUHVibGljUmVwbyB8fCBjb25maWcuaXNSZWZlcnJlZEJ5T3RoZXJSZXBvKSB7XG4gICAgICAgIC8vIFRvIGluc3RhbGwgdGhlIGxhdGVzdCBwaW5zdFxuICAgICAgICAvLyBodHRwczovL3R5cGljb2RlLmdpdGh1Yi5pby9odXNreS8jLz9pZD1pbnN0YWxsLTFcbiAgICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ3BpbnN0Jyk7XG4gICAgICAgIGpzb25PYmouc2NyaXB0cy5wcmVwYWNrID0gJ3BpbnN0IC0tZGlzYWJsZSc7XG4gICAgICAgIGpzb25PYmouc2NyaXB0cy5wb3N0cGFjayA9ICdwaW5zdCAtLWVuYWJsZSc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuc2VtYW50aWNSZWxlYXNlKSB7XG4gICAgICBpZiAoXG4gICAgICAgICFqc29uT2JqLmRldkRlcGVuZGVuY2llc1snc2VtYW50aWMtcmVsZWFzZSddICYmXG4gICAgICAgICFqc29uT2JqLmRldkRlcGVuZGVuY2llc1snbXVsdGktc2VtYW50aWMtcmVsZWFzZSddICYmXG4gICAgICAgICFqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHFpd2kvbXVsdGktc2VtYW50aWMtcmVsZWFzZSddXG4gICAgICApIHtcbiAgICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ3NlbWFudGljLXJlbGVhc2UnKTtcbiAgICAgIH1cbiAgICAgIGpzb25PYmoudmVyc2lvbiA9ICcwLjAuMC1zZW1hbnRpY2FsbHktcmVsZWFzZWQnO1xuICAgIH1cblxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRUZXN0KSB7XG4gICAgICAvLyBTaW5jZSBhcnRpbGxlcnkgcmVxdWlyZXMgYSBzcGVjaWZpYyB2ZXJzaW9uIG9mIEBwbGF5d3JpZ2h0L3Rlc3RcbiAgICAgIGNvbnN0IGhhc0FydGlsbGVyeSA9IGpzb25PYmouZGVwZW5kZW5jaWVzWydhcnRpbGxlcnknXSB8fCBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snYXJ0aWxsZXJ5J107XG4gICAgICAvLyBTaW5jZSBsbG0tdG9vbGJveCByZXF1aXJlcyBAcGxheXdyaWdodC90ZXN0IGluIGRlcGVuZGVuY2llc1xuICAgICAgaWYgKCFoYXNBcnRpbGxlcnkgJiYgIWpzb25PYmouZGVwZW5kZW5jaWVzWydAcGxheXdyaWdodC90ZXN0J10pIHtcbiAgICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0BwbGF5d3JpZ2h0L3Rlc3QnKTtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzWydAcGxheXdyaWdodC90ZXN0J107XG4gICAgICB9XG4gICAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXNbJ3BsYXl3cmlnaHQnXTtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1sncGxheXdyaWdodCddO1xuICAgIH1cblxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zU3ViUGFja2FnZUpzb25zKSB7XG4gICAgICAvLyBXZSBkb24ndCBhbGxvdyBub24tYXJyYXkgd29ya3NwYWNlcyBpbiBtb25vcmVwby5cbiAgICAgIGpzb25PYmoud29ya3NwYWNlcyA9IEFycmF5LmlzQXJyYXkoanNvbk9iai53b3Jrc3BhY2VzKVxuICAgICAgICA/IG1lcmdlLmFsbChbanNvbk9iai53b3Jrc3BhY2VzLCBbJ3BhY2thZ2VzLyonXV0sIHtcbiAgICAgICAgICAgIGFycmF5TWVyZ2U6IGNvbWJpbmVNZXJnZSxcbiAgICAgICAgICB9KVxuICAgICAgICA6IFsncGFja2FnZXMvKiddO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShqc29uT2JqLndvcmtzcGFjZXMpKSB7XG4gICAgICBqc29uT2JqLndvcmtzcGFjZXMgPSBqc29uT2JqLndvcmtzcGFjZXMuZmlsdGVyKFxuICAgICAgICAod29ya3NwYWNlKSA9PlxuICAgICAgICAgIGZnLmdsb2JTeW5jKHdvcmtzcGFjZSwge1xuICAgICAgICAgICAgZG90OiB0cnVlLFxuICAgICAgICAgICAgY3dkOiBjb25maWcuZGlyUGF0aCxcbiAgICAgICAgICAgIGlnbm9yZTogZ2xvYklnbm9yZSxcbiAgICAgICAgICB9KS5sZW5ndGggPiAwXG4gICAgICApO1xuICAgICAgaWYgKGpzb25PYmoud29ya3NwYWNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgZGVsZXRlIGpzb25PYmoud29ya3NwYWNlcztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlnLmRlcGVuZGluZy53YiB8fCBjb25maWcuaXNCdW4pIHtcbiAgICBpZiAoanNvbk9iai5kZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci93YiddKSB7XG4gICAgICBkZXBlbmRlbmNpZXMucHVzaCgnQHdpbGxib29zdGVyL3diJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAd2lsbGJvb3N0ZXIvd2InKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoanNvbk9iai5zY3JpcHRzIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4pKSB7XG4gICAgICBqc29uT2JqLnNjcmlwdHNba2V5XSA9IHZhbHVlLnJlcGxhY2UoL3diXFxzK2RiLywgJ3diIHByaXNtYScpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChcbiAgICBjb25maWcuZG9lc0NvbnRhaW5zSmF2YVNjcmlwdCB8fFxuICAgIGNvbmZpZy5kb2VzQ29udGFpbnNKYXZhU2NyaXB0SW5QYWNrYWdlcyB8fFxuICAgIGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0IHx8XG4gICAgY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHRJblBhY2thZ2VzXG4gICkge1xuICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAYmlvbWVqcy9iaW9tZScsICdAd2lsbGJvb3N0ZXIvYmlvbWUtY29uZmlnJyk7XG4gICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ2VzbGludCddO1xuICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydtaWNyb21hdGNoJ107XG4gICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ3R5cGVzY3JpcHQtZXNsaW50J107XG4gICAgfSBlbHNlIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdlc2xpbnQnLCAnbWljcm9tYXRjaCcpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdEluUGFja2FnZXMpIHtcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgndHlwZXNjcmlwdCcpO1xuICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAdHlwZXMvYnVuJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5lc2xpbnRCYXNlKSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goLi4uZXNsaW50RGVwc1tjb25maWcuZXNsaW50QmFzZV0pO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5pc1dpbGxCb29zdGVyQ29uZmlncykge1xuICAgIGRlcGVuZGVuY2llcyA9IGRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWRlcC5pbmNsdWRlcygnQHdpbGxib29zdGVyLycpKTtcbiAgICBkZXZEZXBlbmRlbmNpZXMgPSBkZXZEZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFkZXAuaW5jbHVkZXMoJ0B3aWxsYm9vc3Rlci8nKSk7XG4gIH1cblxuICBpZiAoIWpzb25PYmoubmFtZSkge1xuICAgIGpzb25PYmoubmFtZSA9IHBhdGguYmFzZW5hbWUoY29uZmlnLmRpclBhdGgpO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNTdWJQYWNrYWdlSnNvbnMpIHtcbiAgICBqc29uT2JqLnByaXZhdGUgPSB0cnVlO1xuICB9XG4gIGlmICghanNvbk9iai5saWNlbnNlKSB7XG4gICAganNvbk9iai5saWNlbnNlID0gJ1VOTElDRU5TRUQnO1xuICB9XG4gIGlmICghanNvbk9iai5wcml2YXRlICYmIGpzb25PYmoubGljZW5zZSAhPT0gJ1VOTElDRU5TRUQnICYmIHJvb3RDb25maWcuaXNQdWJsaWNSZXBvKSB7XG4gICAganNvbk9iai5wdWJsaXNoQ29uZmlnID8/PSB7fTtcbiAgICBqc29uT2JqLnB1Ymxpc2hDb25maWcuYWNjZXNzID8/PSAncHVibGljJztcbiAgfVxuICBjb25zdCBbb3duZXJdID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGNvbmZpZy5yZXBvc2l0b3J5ID8/ICcnKTtcbiAgaWYgKG93bmVyID09PSAnV2lsbEJvb3N0ZXInIHx8IG93bmVyID09PSAnV2lsbEJvb3N0ZXJMYWInKSB7XG4gICAganNvbk9iai5hdXRob3IgPSAnV2lsbEJvb3N0ZXIgSW5jLic7XG4gIH1cbiAgaWYgKCFjb25maWcuaXNSb290ICYmIGpzb25PYmoucHJpdmF0ZSAmJiAhanNvbk9iai5tYWluKSB7XG4gICAgLy8gTWFrZSBWU0NvZGUgcG9zc2libGUgdG8gcmVmYWN0b3IgY29kZSBhY3Jvc3Mgc3VicGFja2FnZXMuXG4gICAganNvbk9iai5tYWluID0gJy4vc3JjJztcbiAgfVxuXG4gIC8vIEJlY2F1c2UgYFwicmVzb2x1dGlvbnNcIjogeyBcIm5wbS9jaGFsa1wiOiBcIl40LjEuMlwiIH0sYCBjYXVzZXMgXCJJbnZhbGlkIG5wbSB0b2tlblwiXG4gIGRlbGV0ZSBqc29uT2JqLnJlc29sdXRpb25zPy5bJ25wbS9jaGFsayddO1xuXG4gIGlmICghY29uZmlnLmRvZXNDb250YWluc1N1YlBhY2thZ2VKc29ucykge1xuICAgIGlmICghY29uZmlnLmlzQnVuKSB7XG4gICAgICBpZiAoIWNvbmZpZy5kb2VzQ29udGFpbnNKYXZhU2NyaXB0ICYmICFjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdCkge1xuICAgICAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLmxpbnQ7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J107XG4gICAgICAgIGpzb25PYmouc2NyaXB0cy5jbGVhbnVwID0ganNvbk9iai5zY3JpcHRzLmNsZWFudXA/LnJlcGxhY2UoJyAmJiB5YXJuIGxpbnQtZml4JywgJycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAganNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddICs9IEVzbGludFV0aWwuZ2V0TGludEZpeFN1ZmZpeChjb25maWcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zUHVic3BlY1lhbWwpIHtcbiAgICAgIGpzb25PYmouc2NyaXB0cy5saW50ID0gJ2ZsdXR0ZXIgYW5hbHl6ZSc7XG4gICAgICBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J10gPSAneWFybiBsaW50JztcbiAgICAgIGNvbnN0IGRpcnMgPSBbJ2xpYicsICd0ZXN0JywgJ3Rlc3RfZHJpdmVyJ10uZmlsdGVyKChkaXIpID0+IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBkaXIpKSk7XG4gICAgICBpZiAoZGlycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGpzb25PYmouc2NyaXB0c1snZm9ybWF0LWNvZGUnXSA9IGBmbHV0dGVyIGZvcm1hdCAkKGZpbmQgJHtkaXJzLmpvaW4oXG4gICAgICAgICAgJyAnXG4gICAgICAgICl9IC1uYW1lIGdlbmVyYXRlZCAtcHJ1bmUgLW8gLW5hbWUgJyouZnJlZXplZC5kYXJ0JyAtcHJ1bmUgLW8gLW5hbWUgJyouZy5kYXJ0JyAtcHJ1bmUgLW8gLW5hbWUgJyouZGFydCcgLXByaW50KWA7XG4gICAgICAgIGpzb25PYmouc2NyaXB0cy5mb3JtYXQgKz0gYCAmJiB5YXJuIGZvcm1hdC1jb2RlYDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc1BvZXRyeUxvY2spIHtcbiAgICAgIGlmIChqc29uT2JqLnNjcmlwdHMucG9zdGluc3RhbGwgPT09ICdwb2V0cnkgaW5zdGFsbCcpIHtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5wb3N0aW5zdGFsbDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHB5dGhvbkZpbGVzID0gYXdhaXQgZmcuZ2xvYignKiovKi5weScsIHtcbiAgICAgICAgY3dkOiBjb25maWcuZGlyUGF0aCxcbiAgICAgICAgZG90OiB0cnVlLFxuICAgICAgICBpZ25vcmU6IGdsb2JJZ25vcmUsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGRpck5hbWVTZXQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgIGZvciAoY29uc3QgcHl0aG9uRmlsZSBvZiBweXRob25GaWxlcykge1xuICAgICAgICBjb25zdCBbZmlyc3QsIHNlY29uZF0gPSBweXRob25GaWxlLnNwbGl0KC9bL1xcXFxdLyk7XG4gICAgICAgIGlmIChzZWNvbmQpIHtcbiAgICAgICAgICBkaXJOYW1lU2V0LmFkZChmaXJzdCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChkaXJOYW1lU2V0LnNpemUgPiAwKSB7XG4gICAgICAgIGNvbnN0IGRpck5hbWVzU3RyID0gWy4uLmRpck5hbWVTZXRdLmpvaW4oJyAnKTtcbiAgICAgICAganNvbk9iai5zY3JpcHRzWydmb3JtYXQtY29kZSddID1cbiAgICAgICAgICBgcG9ldHJ5IHJ1biBpc29ydCAtLXByb2ZpbGUgYmxhY2sgJHtkaXJOYW1lc1N0cn0gJiYgcG9ldHJ5IHJ1biBibGFjayAke2Rpck5hbWVzU3RyfWA7XG4gICAgICAgIGlmIChqc29uT2JqLnNjcmlwdHMubGludCkge1xuICAgICAgICAgIGpzb25PYmouc2NyaXB0cy5saW50ID0gYHBvZXRyeSBydW4gZmxha2U4ICR7ZGlyTmFtZXNTdHJ9ICYmICR7anNvbk9iai5zY3JpcHRzLmxpbnR9YDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHMubGludCA9IGBwb2V0cnkgcnVuIGZsYWtlOCAke2Rpck5hbWVzU3RyfWA7XG4gICAgICAgICAganNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddID0gJ3lhcm4gbGludCc7XG4gICAgICAgIH1cbiAgICAgICAganNvbk9iai5zY3JpcHRzLmZvcm1hdCArPSBgICYmIHlhcm4gZm9ybWF0LWNvZGVgO1xuICAgICAgICBwb2V0cnlEZXZEZXBlbmRlbmNpZXMucHVzaCgnYmxhY2snLCAnaXNvcnQnLCAnZmxha2U4Jyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5yZXBvc2l0b3J5KSB7XG4gICAgICBqc29uT2JqLnJlcG9zaXRvcnkgPSBjb25maWcucmVwb3NpdG9yeTtcbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eikge1xuICAgIGRlcGVuZGVuY2llcy5wdXNoKFxuICAgICAgYGJsaXR6QCR7QkxJVFpfVkVSU0lPTn1gLFxuICAgICAgYEBibGl0empzL2F1dGhAJHtCTElUWl9WRVJTSU9OfWAsXG4gICAgICBgQGJsaXR6anMvbmV4dEAke0JMSVRaX1ZFUlNJT059YCxcbiAgICAgIGBAYmxpdHpqcy9ycGNAJHtCTElUWl9WRVJTSU9OfWAsXG4gICAgICBgbmV4dEAke05FWFRfVkVSU0lPTn1gXG4gICAgKTtcbiAgICAvLyBQcmVmZXIgZXNsaW50LWNvbmZpZy1uZXh0J3MgZGVwZW5kZW5jaWVzXG4gICAgZGV2RGVwZW5kZW5jaWVzID0gZGV2RGVwZW5kZW5jaWVzLmZpbHRlcigoZCkgPT4gZCAhPT0gJ2VzbGludC1wbHVnaW4tcmVhY3QnICYmIGQgIT09ICdlc2xpbnQtcGx1Z2luLXJlYWN0LWhvb2tzJyk7XG4gICAgaWYgKCFqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10/LnN0YXJ0c1dpdGgoJ2JsaXR6IGNvZGVnZW4nKSkge1xuICAgICAganNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddID0gJ2JsaXR6IGNvZGVnZW4nO1xuICAgIH0gZWxzZSBpZiAoIWpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXS5pbmNsdWRlcygnYmxpdHogcHJpc21hIGdlbmVyYXRlJykpIHtcbiAgICAgIGpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXSA9IGpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXS5yZXBsYWNlKFxuICAgICAgICAnYmxpdHogY29kZWdlbicsXG4gICAgICAgICdibGl0eiBjb2RlZ2VuICYmIGJsaXR6IHByaXNtYSBnZW5lcmF0ZSdcbiAgICAgICk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHJpc21hICYmICFqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10/LnN0YXJ0c1dpdGgoJ3ByaXNtYSBnZW5lcmF0ZScpKSB7XG4gICAganNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddID0gJ3ByaXNtYSBnZW5lcmF0ZSc7XG4gIH1cblxuICBpZiAoIWpzb25PYmouZGVwZW5kZW5jaWVzPy5wcmV0dGllcikge1xuICAgIC8vIEJlY2F1c2UgQHR5cGVzL3ByZXR0aWVyIGJsb2NrcyBwcmV0dGllciBleGVjdXRpb24uXG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAdHlwZXMvcHJldHRpZXInXTtcbiAgfVxuXG4gIGlmIChPYmplY3Qua2V5cyhqc29uT2JqLmRlcGVuZGVuY2llcykubGVuZ3RoID09PSAwKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzO1xuICB9XG4gIGlmIChPYmplY3Qua2V5cyhqc29uT2JqLmRldkRlcGVuZGVuY2llcykubGVuZ3RoID09PSAwKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzO1xuICB9XG4gIGlmIChPYmplY3Qua2V5cyhqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgIGRlbGV0ZSBqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXM7XG4gIH1cblxuICBhd2FpdCB1cGRhdGVQcml2YXRlUGFja2FnZXMoanNvbk9iaik7XG5cbiAgaWYgKGNvbmZpZy5pc0J1bikgZGVsZXRlIGpzb25PYmoucGFja2FnZU1hbmFnZXI7XG4gIGxldCBuZXdKc29uVGV4dCA9IEpTT04uc3RyaW5naWZ5KGpzb25PYmopO1xuICBuZXdKc29uVGV4dCA9IGF3YWl0IGZpeFNjcmlwdE5hbWVzKGpzb25PYmouc2NyaXB0cywgbmV3SnNvblRleHQsIGNvbmZpZyk7XG4gIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShmaWxlUGF0aCwgbmV3SnNvblRleHQpO1xuXG4gIGlmICghc2tpcEFkZGluZ0RlcHMpIHtcbiAgICAvLyBXZSBjYW5ub3QgYWRkIGRlcGVuZGVuY2llcyB3aGljaCBhcmUgYWxyZWFkeSBpbmNsdWRlZCBpbiBkZXZEZXBlbmRlbmNpZXMuXG4gICAgZGVwZW5kZW5jaWVzID0gZGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhanNvbk9iai5kZXZEZXBlbmRlbmNpZXM/LltkZXBdKTtcbiAgICBpZiAoZGVwZW5kZW5jaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ3JlbW92ZScsIC4uLm5ldyBTZXQoZGVwZW5kZW5jaWVzKV0sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICAgICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ2FkZCcsICctLWV4YWN0JywgLi4ubmV3IFNldChkZXBlbmRlbmNpZXMpXSwgY29uZmlnLmRpclBhdGgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ2FkZCcsIC4uLm5ldyBTZXQoZGVwZW5kZW5jaWVzKV0sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gV2UgY2Fubm90IGFkZCBkZXZEZXBlbmRlbmNpZXMgd2hpY2ggYXJlIGFscmVhZHkgaW5jbHVkZWQgaW4gZGVwZW5kZW5jaWVzLlxuICAgIGRldkRlcGVuZGVuY2llcyA9IGRldkRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWpzb25PYmouZGVwZW5kZW5jaWVzPy5bZGVwXSk7XG4gICAgaWYgKGRldkRlcGVuZGVuY2llcy5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydyZW1vdmUnLCAuLi5uZXcgU2V0KGRldkRlcGVuZGVuY2llcyldLCBjb25maWcuZGlyUGF0aCk7XG4gICAgICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydhZGQnLCAnLUQnLCAnLS1leGFjdCcsIC4uLm5ldyBTZXQoZGV2RGVwZW5kZW5jaWVzKV0sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydhZGQnLCAnLUQnLCAuLi5uZXcgU2V0KGRldkRlcGVuZGVuY2llcyldLCBjb25maWcuZGlyUGF0aCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChwb2V0cnlEZXZEZXBlbmRlbmNpZXMubGVuZ3RoID4gMCkge1xuICAgICAgc3Bhd25TeW5jKCdwb2V0cnknLCBbJ2FkZCcsICctLWdyb3VwJywgJ2RldicsIC4uLm5ldyBTZXQocG9ldHJ5RGV2RGVwZW5kZW5jaWVzKV0sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICB9XG4gIH1cbn1cblxuLy8gVE9ETzogcmVtb3ZlIHRoZSBmb2xsb3dpbmcgbWlncmF0aW9uIGNvZGUgaW4gZnV0dXJlXG5hc3luYyBmdW5jdGlvbiByZW1vdmVEZXByZWNhdGVkU3R1ZmYoXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFNldFJlcXVpcmVkPFBhY2thZ2VKc29uLCAnc2NyaXB0cycgfCAnZGVwZW5kZW5jaWVzJyB8ICdkZXZEZXBlbmRlbmNpZXMnPlxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChqc29uT2JqLmF1dGhvciA9PT0gJ1dpbGxCb29zdGVyIExMQycpIHtcbiAgICBqc29uT2JqLmF1dGhvciA9ICdXaWxsQm9vc3RlciBJbmMuJztcbiAgfVxuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydzb3J0LXBhY2thZ2UtanNvbiddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydzb3J0LWFsbC1wYWNrYWdlLWpzb24nXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sndHlwZWNoZWNrL3dhcm4nXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sndHlwZWNoZWNrOmdlbi1jb2RlJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3R5cGVjaGVjazpjb2RlZ2VuJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llc1sndHNsaWInXTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZyddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXJlYWN0J107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3Jlbm92YXRlLWNvbmZpZyddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci90c2NvbmZpZyddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ2VzbGludC1pbXBvcnQtcmVzb2x2ZXItbm9kZSddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ2VzbGludC1wbHVnaW4tcHJldHRpZXInXTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydsZXJuYSddO1xuICAvLyBUbyBpbnN0YWxsIHRoZSBsYXRlc3QgcGluc3RcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydwaW5zdCddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydmbHV0dGVyLWZvcm1hdCddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydmb3JtYXQtZmx1dHRlciddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydweXRob24tZm9ybWF0J107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2Zvcm1hdC1weXRob24nXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sncHJldHRpZXInXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snY2hlY2stYWxsJ107XG4gIGlmICghcm9vdENvbmZpZy5pc1dpbGxCb29zdGVyQ29uZmlncykge1xuICAgIGZvciAoY29uc3QgZGVwcyBvZiBPYmplY3QudmFsdWVzKGVzbGludERlcHMpKSB7XG4gICAgICBmb3IgKGNvbnN0IGRlcCBvZiBkZXBzKSB7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1tkZXBdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oJ2xlcm5hLmpzb24nLCB7IGZvcmNlOiB0cnVlIH0pKTtcblxuICAvLyBNaWdyYXRlIGZyb20gRVNMaW50IGxlZ2FjeSBjb25maWdzIHRvIGZsYXQgY29uZmlncyxcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAdHlwZXNjcmlwdC1lc2xpbnQvZXNsaW50LXBsdWdpbiddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B0eXBlc2NyaXB0LWVzbGludC9wYXJzZXInXTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydlc2xpbnQtcGx1Z2luLWltcG9ydCddO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVTY3JpcHRzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgY29uc3Qgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICdjaGVjay1hbGwtZm9yLWFpJzogJ2J1biBydW4gY2hlY2stZm9yLWFpICYmIGJ1biBydW4gdGVzdCAtLXNpbGVudCcsXG4gICAgICAnY2hlY2stZm9yLWFpJzogJ2J1biBydW4gY2xlYW51cCAmJiBidW4gcnVuIHR5cGVjaGVjaycsXG4gICAgICBjbGVhbnVwOiAnYnVuIC0tYnVuIHdiIGxpbnQgLS1maXggLS1mb3JtYXQnLFxuICAgICAgZm9ybWF0OiBgYnVuIC0tYnVuIHdiIGxpbnQgLS1mb3JtYXRgLFxuICAgICAgbGludDogYGJ1biAtLWJ1biB3YiBsaW50YCxcbiAgICAgICdsaW50LWZpeCc6ICdidW4gLS1idW4gd2IgbGludCAtLWZpeCcsXG4gICAgICB0ZXN0OiAnYnVuIHdiIHRlc3QnLFxuICAgICAgdHlwZWNoZWNrOiAnYnVuIC0tYnVuIHdiIHR5cGVjaGVjaycsXG4gICAgfTtcbiAgICBpZiAoIWNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0ICYmICFjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdEluUGFja2FnZXMpIHtcbiAgICAgIGRlbGV0ZSBzY3JpcHRzLnR5cGVjaGVjaztcbiAgICB9XG4gICAgcmV0dXJuIHNjcmlwdHM7XG4gIH0gZWxzZSB7XG4gICAgbGV0IHNjcmlwdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAnY2hlY2stYWxsLWZvci1haSc6ICd5YXJuIGNoZWNrLWZvci1haSAmJiB5YXJuIHRlc3QgLS1zaWxlbnQnLFxuICAgICAgJ2NoZWNrLWZvci1haSc6ICd5YXJuIGZvcm1hdCA+IC9kZXYvbnVsbCAyPiAvZGV2L251bGwgfHwgdHJ1ZSAmJiB5YXJuIGxpbnQtZml4IC0tcXVpZXQgJiYgeWFybiB0eXBlY2hlY2snLFxuICAgICAgY2xlYW51cDogJ3lhcm4gZm9ybWF0ICYmIHlhcm4gbGludC1maXgnLFxuICAgICAgZm9ybWF0OiBgc29ydC1wYWNrYWdlLWpzb24gJiYgeWFybiBwcmV0dGlmeWAsXG4gICAgICBsaW50OiBgZXNsaW50IC0tY29sb3JgLFxuICAgICAgJ2xpbnQtZml4JzogJ3lhcm4gbGludCAtLWZpeCcsXG4gICAgICBwcmV0dGlmeTogYHByZXR0aWVyIC0tY2FjaGUgLS1jb2xvciAtLXdyaXRlIFwiKiovey4qLyx9Ki57JHtleHRlbnNpb25zLnByZXR0aWVyLmpvaW4oJywnKX19XCIgXCIhKiovdGVzdHstLC99Zml4dHVyZXMvKipcImAsXG4gICAgICB0eXBlY2hlY2s6ICd0c2MgLS1ub0VtaXQgLS1QcmV0dHknLFxuICAgIH07XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNTdWJQYWNrYWdlSnNvbnMpIHtcbiAgICAgIGNvbnN0IG9sZFRlc3QgPSBzY3JpcHRzLnRlc3Q7XG4gICAgICBzY3JpcHRzID0gbWVyZ2UoXG4gICAgICAgIHsgLi4uc2NyaXB0cyB9LFxuICAgICAgICB7XG4gICAgICAgICAgZm9ybWF0OiBgc29ydC1wYWNrYWdlLWpzb24gJiYgeWFybiBwcmV0dGlmeSAmJiB5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCAtLXBhcmFsbGVsIC0tdmVyYm9zZSBydW4gZm9ybWF0YCxcbiAgICAgICAgICBsaW50OiBgeWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwgLS1wYXJhbGxlbCAtLXZlcmJvc2UgcnVuIGxpbnRgLFxuICAgICAgICAgICdsaW50LWZpeCc6ICd5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCAtLXBhcmFsbGVsIC0tdmVyYm9zZSBydW4gbGludC1maXgnLFxuICAgICAgICAgIHByZXR0aWZ5OiBgcHJldHRpZXIgLS1jYWNoZSAtLWNvbG9yIC0td3JpdGUgXCIqKi97LiovLH0qLnske2V4dGVuc2lvbnMucHJldHRpZXIuam9pbihcbiAgICAgICAgICAgICcsJ1xuICAgICAgICAgICl9fVwiIFwiISoqL3BhY2thZ2VzLyoqXCIgXCIhKiovdGVzdHstLC99Zml4dHVyZXMvKipcImAsXG4gICAgICAgICAgLy8gQ0k9MSBwcmV2ZW50cyB2aXRlc3QgZnJvbSBlbmFibGluZyB3YXRjaC5cbiAgICAgICAgICAvLyBGT1JDRV9DT0xPUj0zIG1ha2Ugd2IgZW5hYmxlIGNvbG9yIG91dHB1dC5cbiAgICAgICAgICB0ZXN0OiAnQ0k9MSBGT1JDRV9DT0xPUj0zIHlhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsIC0tdmVyYm9zZSBydW4gdGVzdCcsXG4gICAgICAgICAgdHlwZWNoZWNrOiAneWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwgLS1wYXJhbGxlbCAtLXZlcmJvc2UgcnVuIHR5cGVjaGVjaycsXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICBpZiAob2xkVGVzdD8uaW5jbHVkZXMoJ3diIHRlc3QnKSkge1xuICAgICAgICBzY3JpcHRzLnRlc3QgPSBvbGRUZXN0O1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY29uZmlnLmRlcGVuZGluZy5weXJpZ2h0KSB7XG4gICAgICBzY3JpcHRzLnR5cGVjaGVjayA9IHNjcmlwdHMudHlwZWNoZWNrID8gYCR7c2NyaXB0cy50eXBlY2hlY2t9ICYmIGAgOiAnJztcbiAgICAgIHNjcmlwdHMudHlwZWNoZWNrICs9ICdweXJpZ2h0JztcbiAgICB9XG5cbiAgICBpZiAoIWNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0ICYmICFjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdEluUGFja2FnZXMpIHtcbiAgICAgIGRlbGV0ZSBzY3JpcHRzLnR5cGVjaGVjaztcbiAgICB9IGVsc2UgaWYgKGNvbmZpZy5kZXBlbmRpbmcud2IpIHtcbiAgICAgIHNjcmlwdHMudHlwZWNoZWNrID0gJ3diIHR5cGVjaGVjayc7XG4gICAgfVxuICAgIHJldHVybiBzY3JpcHRzO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUHJldHRpZXJTdWZmaXgoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy5wcmV0dGllcmlnbm9yZScpO1xuICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgY29uc3QgaW5kZXggPSBleGlzdGluZ0NvbnRlbnQuaW5kZXhPZihpZ25vcmVGaWxlVXRpbC5zZXBhcmF0b3JQcmVmaXgpO1xuICBpZiAoaW5kZXggPT09IC0xKSByZXR1cm4gJyc7XG5cbiAgY29uc3Qgb3JpZ2luYWxDb250ZW50ID0gZXhpc3RpbmdDb250ZW50LnNsaWNlKDAsIGluZGV4KTtcbiAgY29uc3QgbGluZXMgPSBvcmlnaW5hbENvbnRlbnRcbiAgICAuc3BsaXQoJ1xcbicpXG4gICAgLm1hcCgobGluZSkgPT4ge1xuICAgICAgY29uc3QgbmV3TGluZSA9IGxpbmUudHJpbSgpO1xuICAgICAgcmV0dXJuIG5ld0xpbmUuZW5kc1dpdGgoJy8nKSA/IG5ld0xpbmUuc2xpY2UoMCwgLTEpIDogbmV3TGluZTtcbiAgICB9KVxuICAgIC5maWx0ZXIoKGwpID0+IGwgJiYgIWwuc3RhcnRzV2l0aCgnIycpICYmICFsLmluY2x1ZGVzKCcvJykpO1xuXG4gIHJldHVybiBsaW5lcy5tYXAoKGxpbmUpID0+IGAgXCIhKiovJHtsaW5lfS8qKlwiYCkuam9pbignJyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZpeFNjcmlwdE5hbWVzKFxuICBzY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzLFxuICBuZXdKc29uVGV4dDogc3RyaW5nLFxuICBjb25maWc6IFBhY2thZ2VDb25maWdcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IG9sZEFuZE5ld1NjcmlwdE5hbWVzOiBbc3RyaW5nLCBzdHJpbmddW10gPSBbXTtcbiAgZm9yIChjb25zdCBba2V5XSBvZiBPYmplY3Qua2V5cyhzY3JpcHRzKSkge1xuICAgIGlmIChrZXlbMF0gIT09ICc6JyAmJiBrZXkuaW5jbHVkZXMoJzonKSkge1xuICAgICAgb2xkQW5kTmV3U2NyaXB0TmFtZXMucHVzaChba2V5LCBrZXkucmVwbGFjZUFsbCgnOicsICctJyldKTtcbiAgICB9XG4gIH1cbiAgaWYgKG9sZEFuZE5ld1NjcmlwdE5hbWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG5ld0pzb25UZXh0O1xuXG4gIGZvciAoY29uc3QgW29sZE5hbWUsIG5ld05hbWVdIG9mIG9sZEFuZE5ld1NjcmlwdE5hbWVzKSB7XG4gICAgbmV3SnNvblRleHQgPSBuZXdKc29uVGV4dC5yZXBsYWNlQWxsKG9sZE5hbWUsIG5ld05hbWUpO1xuICB9XG4gIGNvbnN0IGZpbGVzID0gYXdhaXQgZmcuZ2xvYihbJyoqLyoue21kLGNqcyxtanMsanMsanN4LGN0cyxtdHMsdHMsdHN4fScsICcqKi9Eb2NrZXJmaWxlJ10sIHtcbiAgICBjd2Q6IGNvbmZpZy5kaXJQYXRoLFxuICAgIGRvdDogdHJ1ZSxcbiAgICBpZ25vcmU6IGdsb2JJZ25vcmUsXG4gIH0pO1xuICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oY29uZmlnLmRpclBhdGgsIGZpbGUpO1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgbGV0IG5ld0NvbnRlbnQgPSBvbGRDb250ZW50O1xuICAgICAgZm9yIChjb25zdCBbb2xkTmFtZSwgbmV3TmFtZV0gb2Ygb2xkQW5kTmV3U2NyaXB0TmFtZXMpIHtcbiAgICAgICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZUFsbChvbGROYW1lLCBuZXdOYW1lKTtcbiAgICAgIH1cbiAgICAgIGlmIChuZXdDb250ZW50ICE9PSBvbGRDb250ZW50KSB7XG4gICAgICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICByZXR1cm4gbmV3SnNvblRleHQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVByaXZhdGVQYWNrYWdlcyhqc29uT2JqOiBQYWNrYWdlSnNvbik6IFByb21pc2U8dm9pZD4ge1xuICBqc29uT2JqLmRlcGVuZGVuY2llcyA9IGpzb25PYmouZGVwZW5kZW5jaWVzIHx8IHt9O1xuICBqc29uT2JqLmRldkRlcGVuZGVuY2llcyA9IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzIHx8IHt9O1xuICBjb25zdCBwYWNrYWdlTmFtZXMgPSBuZXcgU2V0KFsuLi5PYmplY3Qua2V5cyhqc29uT2JqLmRlcGVuZGVuY2llcyksIC4uLk9iamVjdC5rZXlzKGpzb25PYmouZGV2RGVwZW5kZW5jaWVzKV0pO1xuICBpZiAocGFja2FnZU5hbWVzLmhhcygnQHdpbGxib29zdGVyL2F1dGgnKSAmJiAhaXNXb3Jrc3BhY2VQYWNrYWdlKGpzb25PYmosICdAd2lsbGJvb3N0ZXIvYXV0aCcpKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvYXV0aCddO1xuICAgIGNvbnN0IGNvbW1pdEhhc2ggPSBhd2FpdCBnZXRMYXRlc3RDb21taXRIYXNoKCdXaWxsQm9vc3RlckxhYicsICdhdXRoJyk7XG4gICAganNvbk9iai5kZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9hdXRoJ10gPSBgZ2l0QGdpdGh1Yi5jb206V2lsbEJvb3N0ZXJMYWIvYXV0aC5naXQjJHtjb21taXRIYXNofWA7XG4gIH1cbiAgaWYgKHBhY2thZ2VOYW1lcy5oYXMoJ0BkaXNjb3JkLWJvdC9zaGFyZWQnKSAmJiAhaXNXb3Jrc3BhY2VQYWNrYWdlKGpzb25PYmosICdAZGlzY29yZC1ib3Qvc2hhcmVkJykpIHtcbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0BkaXNjb3JkLWJvdC9zaGFyZWQnXTtcbiAgICBjb25zdCBjb21taXRIYXNoID0gYXdhaXQgZ2V0TGF0ZXN0Q29tbWl0SGFzaCgnV2lsbEJvb3N0ZXJMYWInLCAnZGlzY29yZC1ib3QnKTtcbiAgICBqc29uT2JqLmRlcGVuZGVuY2llc1snQGRpc2NvcmQtYm90L3NoYXJlZCddID0gYGdpdEBnaXRodWIuY29tOldpbGxCb29zdGVyTGFiL2Rpc2NvcmQtYm90LmdpdCMke2NvbW1pdEhhc2h9YDtcbiAgfVxuXG4gIGlmIChwYWNrYWdlTmFtZXMuaGFzKCdAd2lsbGJvb3N0ZXIvY29kZS1hbmFseXplcicpICYmICFpc1dvcmtzcGFjZVBhY2thZ2UoanNvbk9iaiwgJ0B3aWxsYm9vc3Rlci9jb2RlLWFuYWx5emVyJykpIHtcbiAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9jb2RlLWFuYWx5emVyJ107XG4gICAgY29uc3QgY29tbWl0SGFzaCA9IGF3YWl0IGdldExhdGVzdENvbW1pdEhhc2goJ1dpbGxCb29zdGVyTGFiJywgJ2NvZGUtYW5hbHl6ZXInKTtcbiAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL2NvZGUtYW5hbHl6ZXInXSA9XG4gICAgICBgZ2l0QGdpdGh1Yi5jb206V2lsbEJvb3N0ZXJMYWIvY29kZS1hbmFseXplci5naXQjd29ya3NwYWNlPUBjb2RlLWFuYWx5emVyL2NsaWVudCZjb21taXQ9JHtjb21taXRIYXNofWA7XG4gIH1cbiAgaWYgKHBhY2thZ2VOYW1lcy5oYXMoJ0B3aWxsYm9vc3Rlci9qdWRnZScpICYmICFpc1dvcmtzcGFjZVBhY2thZ2UoanNvbk9iaiwgJ0B3aWxsYm9vc3Rlci9qdWRnZScpKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvanVkZ2UnXTtcbiAgICBjb25zdCBjb21taXRIYXNoID0gYXdhaXQgZ2V0TGF0ZXN0Q29tbWl0SGFzaCgnV2lsbEJvb3N0ZXJMYWInLCAnanVkZ2UnKTtcbiAgICBqc29uT2JqLmRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL2p1ZGdlJ10gPSBgZ2l0QGdpdGh1Yi5jb206V2lsbEJvb3N0ZXJMYWIvanVkZ2UuZ2l0IyR7Y29tbWl0SGFzaH1gO1xuICB9XG4gIGlmIChwYWNrYWdlTmFtZXMuaGFzKCdAd2lsbGJvb3N0ZXIvbGxtLXByb3h5JykgJiYgIWlzV29ya3NwYWNlUGFja2FnZShqc29uT2JqLCAnQHdpbGxib29zdGVyL2xsbS1wcm94eScpKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvbGxtLXByb3h5J107XG4gICAgY29uc3QgY29tbWl0SGFzaCA9IGF3YWl0IGdldExhdGVzdENvbW1pdEhhc2goJ1dpbGxCb29zdGVyTGFiJywgJ2xsbS1wcm94eScpO1xuICAgIGpzb25PYmouZGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvbGxtLXByb3h5J10gPSBgZ2l0QGdpdGh1Yi5jb206V2lsbEJvb3N0ZXJMYWIvbGxtLXByb3h5LmdpdCMke2NvbW1pdEhhc2h9YDtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc1dvcmtzcGFjZVBhY2thZ2UoanNvbk9iajogUGFja2FnZUpzb24sIHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIChqc29uT2JqLmRldkRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSB8fCBqc29uT2JqLmRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSB8fCAnJykuaW5jbHVkZXMoJ3dvcmtzcGFjZScpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jIH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcblxuaW1wb3J0IHsgZ2VuZXJhdGVTY3JpcHRzIH0gZnJvbSAnLi9wYWNrYWdlSnNvbi5qcyc7XG5cbmNvbnN0IHNjcmlwdHMgPSB7XG4gIHByZUNvbW1pdDogJ25vZGUgbm9kZV9tb2R1bGVzLy5iaW4vbGludC1zdGFnZWQnLFxuICBwcmVQdXNoOiBgeWFybiB0eXBlY2hlY2tgLFxuICBwcmVQdXNoRm9yTGFiOiBgXG5pZiBbICQoZ2l0IGJyYW5jaCAtLXNob3ctY3VycmVudCkgPSBcIm1haW5cIiBdOyB0aGVuXG4gIGVjaG8gXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIlxuICBlY2hvIFwiKioqIERvbid0IHB1c2ggbWFpbiBicmFuY2ggZGlyZWN0bHkuIFVzZSBQUiEgKioqXCJcbiAgZWNobyBcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiXG4gIGV4aXQgMVxuZmlcblxueWFybiB0eXBlY2hlY2tcbmAudHJpbSgpLFxuICBwcmVQdXNoRm9yTGFiRXhjZXB0QWRtaW46IGBcbmlmIFsgJChnaXQgYnJhbmNoIC0tc2hvdy1jdXJyZW50KSA9IFwibWFpblwiIF0gJiYgWyAkKGdpdCBjb25maWcgdXNlci5lbWFpbCkgIT0gXCJleGthenV1QGdtYWlsLmNvbVwiIF07IHRoZW5cbiAgZWNobyBcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiXG4gIGVjaG8gXCIqKiogRG9uJ3QgcHVzaCBtYWluIGJyYW5jaCBkaXJlY3RseS4gVXNlIFBSISAqKipcIlxuICBlY2hvIFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCJcbiAgZXhpdCAxXG5maVxuXG55YXJuIHR5cGVjaGVja1xuYC50cmltKCksXG4gIHBvc3RNZXJnZTogYFxuY2hhbmdlZF9maWxlcz1cIiQoZ2l0IGRpZmYtdHJlZSAtciAtLW5hbWUtb25seSAtLW5vLWNvbW1pdC1pZCBPUklHX0hFQUQgSEVBRClcIlxuXG5ydW5faWZfY2hhbmdlZCgpIHtcbiAgaWYgZWNobyBcIiRjaGFuZ2VkX2ZpbGVzXCIgfCBncmVwIC0tcXVpZXQgLUUgXCIkMVwiOyB0aGVuXG4gICAgZXZhbCBcIiQyXCJcbiAgZmlcbn1cbmAudHJpbSgpLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlSHVza3lyY1VwZGF0aW5nUGFja2FnZUpzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVIdXNreXJjVXBkYXRpbmdQYWNrYWdlSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBjb3JlKGNvbmZpZyk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgY29uc3QganNvblRleHQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShwYWNrYWdlSnNvblBhdGgsICd1dGY4Jyk7XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShqc29uVGV4dCkgYXMgUGFja2FnZUpzb247XG4gIHBhY2thZ2VKc29uLnNjcmlwdHMgfHw9IHt9O1xuICBkZWxldGUgcGFja2FnZUpzb24uc2NyaXB0c1sncG9zdGluc3RhbGwnXTtcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnNjcmlwdHNbJ3Bvc3RwdWJsaXNoJ107XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5zY3JpcHRzWydwcmVwYXJlJ107XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5zY3JpcHRzWydwcmVwdWJsaXNoT25seSddO1xuICBkZWxldGUgcGFja2FnZUpzb24uc2NyaXB0c1sncHJlcGFjayddO1xuICBkZWxldGUgcGFja2FnZUpzb24uc2NyaXB0c1sncG9zdHBhY2snXTtcblxuICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmh1c2t5Jyk7XG4gIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICBmcy5wcm9taXNlcy53cml0ZUZpbGUocGFja2FnZUpzb25QYXRoLCBKU09OLnN0cmluZ2lmeShwYWNrYWdlSnNvbiwgdW5kZWZpbmVkLCAyKSksXG4gICAgZnMucHJvbWlzZXMucm0oZGlyUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pLFxuICBdKTtcbiAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgIHNwYXduU3luYygnZ2l0JywgWydjb25maWcnLCAnLS11bnNldCcsICdjb3JlLmhvb2tzUGF0aCddLCBjb25maWcuZGlyUGF0aCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgc3Bhd25TeW5jKCd5YXJuJywgWydkbHgnLCAnaHVza3ktaW5pdCcsICctLXlhcm4yJ10sIGNvbmZpZy5kaXJQYXRoKTtcblxuICBjb25zdCBwcmVDb21taXRGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncHJlLWNvbW1pdCcpO1xuXG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuaHVza3lyYy5qc29uJyksIHsgZm9yY2U6IHRydWUgfSkpO1xuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMud3JpdGVGaWxlKHByZUNvbW1pdEZpbGVQYXRoLCBzY3JpcHRzLnByZUNvbW1pdCArICdcXG4nKSk7XG5cbiAgY29uc3QgeyB0eXBlY2hlY2sgfSA9IGdlbmVyYXRlU2NyaXB0cyhjb25maWcpO1xuICBpZiAodHlwZWNoZWNrKSB7XG4gICAgbGV0IHByZVB1c2ggPSBjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyTGFiLycpXG4gICAgICA/IGNvbmZpZy5yZXBvc2l0b3J5Py50b0xvY2FsZUxvd2VyQ2FzZSgpLmluY2x1ZGVzKCdleGVyY29kZScpXG4gICAgICAgID8gc2NyaXB0cy5wcmVQdXNoRm9yTGFiXG4gICAgICAgIDogc2NyaXB0cy5wcmVQdXNoRm9yTGFiRXhjZXB0QWRtaW5cbiAgICAgIDogc2NyaXB0cy5wcmVQdXNoO1xuICAgIHByZVB1c2ggPSBwcmVQdXNoLnJlcGxhY2UoXG4gICAgICAneWFybiB0eXBlY2hlY2snLFxuICAgICAgdHlwZWNoZWNrXG4gICAgICAgIC5yZXBsYWNlKCd0c2MgJywgJ25vZGUgbm9kZV9tb2R1bGVzLy5iaW4vdHNjICcpXG4gICAgICAgIC5yZXBsYWNlKCd3YiAnLCAnbm9kZSBub2RlX21vZHVsZXMvLmJpbi93YiAnKVxuICAgICAgICAvLyBweXJpZ2h0IGhhcyBubyBhcmd1bWVudHNcbiAgICAgICAgLnJlcGxhY2UoJ3B5cmlnaHQnLCAnbm9kZSBub2RlX21vZHVsZXMvLmJpbi9weXJpZ2h0JylcbiAgICApO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncHJlLXB1c2gnKSwgcHJlUHVzaCArICdcXG4nLCB7XG4gICAgICAgIG1vZGU6IDBvNzU1LFxuICAgICAgfSlcbiAgICApO1xuICB9XG4gIGNvbnN0IHBvc3RNZXJnZUNvbW1hbmQgPSBgJHtzY3JpcHRzLnBvc3RNZXJnZX1cXG5cXG4ke2dlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMoY29uZmlnKS5qb2luKCdcXG4nKX1cXG5gO1xuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwb3N0LW1lcmdlJyksIHBvc3RNZXJnZUNvbW1hbmQsIHtcbiAgICAgIG1vZGU6IDBvNzU1LFxuICAgIH0pXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVBvc3RNZXJnZUNvbW1hbmRzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgcG9zdE1lcmdlQ29tbWFuZHM6IHN0cmluZ1tdID0gW107XG4gIGlmIChjb25maWcudmVyc2lvbnNUZXh0KSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCJcXC4uKy12ZXJzaW9uXCIgXCJhd2sgJ3twcmludCBcXCQxfScgLnRvb2wtdmVyc2lvbnMgfCB4YXJncyAtSXt9IGFzZGYgcGx1Z2luIGFkZCB7fVwiYCxcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCJcXC4uKy12ZXJzaW9uXCIgXCJhc2RmIHBsdWdpbiB1cGRhdGUgLS1hbGxcImBcbiAgICApO1xuICB9XG4gIC8vIFB5dGhvbuOBjOOBquOBhOOBqOOCpOODs+OCueODiOODvOODq+OBp+OBjeOBquOBhOWHpueQhuezu+OBjOWtmOWcqOOBmeOCi+OBn+OCgeOAgeW8t+WItueahOOBq+acgOWIneOBq+OCpOODs+OCueODiOODvOODq+OBmeOCi+OAglxuICBpZiAoY29uZmlnLnZlcnNpb25zVGV4dD8uaW5jbHVkZXMoJ3B5dGhvbiAnKSkge1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIlxcLi4rLXZlcnNpb25cIiBcImFzZGYgaW5zdGFsbCBweXRob25cImApO1xuICB9XG4gIGlmIChjb25maWcudmVyc2lvbnNUZXh0KSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiXFwuListdmVyc2lvblwiIFwiYXNkZiBpbnN0YWxsXCJgKTtcbiAgfVxuICBjb25zdCBpbnN0YWxsQ29tbWFuZCA9IGNvbmZpZy5pc0J1biA/ICdidW4gaW5zdGFsbCcgOiAneWFybic7XG4gIGNvbnN0IHJtTmV4dERpcmVjdG9yeSA9IGNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHwgY29uZmlnLmRlcGVuZGluZy5uZXh0ID8gJyAmJiBybSAtUmYgLm5leHQnIDogJyc7XG4gIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goYHJ1bl9pZl9jaGFuZ2VkIFwicGFja2FnZVxcXFwuanNvblwiIFwiJHtpbnN0YWxsQ29tbWFuZH0ke3JtTmV4dERpcmVjdG9yeX1cImApO1xuICBpZiAoY29uZmlnLmRvZXNDb250YWluc1BvZXRyeUxvY2spIHtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCJwb2V0cnlcXC5sb2NrXCIgXCJwb2V0cnkgaW5zdGFsbFwiYCk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHopIHtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIi4qXFwucHJpc21hXCIgXCJub2RlIG5vZGVfbW9kdWxlcy8uYmluL2JsaXR6IHByaXNtYSBtaWdyYXRlIGRlcGxveVwiYCxcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIuKlxcLnByaXNtYVwiIFwibm9kZSBub2RlX21vZHVsZXMvLmJpbi9ibGl0eiBwcmlzbWEgZ2VuZXJhdGVcImAsXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiLipcXC5wcmlzbWFcIiBcIm5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vYmxpdHogY29kZWdlblwiYFxuICAgICk7XG4gIH0gZWxzZSBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEpIHtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIi4qXFwucHJpc21hXCIgXCJub2RlIG5vZGVfbW9kdWxlcy8uYmluL2RvdGVudiAtYyBkZXZlbG9wbWVudCAtLSBub2RlIG5vZGVfbW9kdWxlcy8uYmluL3ByaXNtYSBtaWdyYXRlIGRlcGxveVwiYCxcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIuKlxcLnByaXNtYVwiIFwibm9kZSBub2RlX21vZHVsZXMvLmJpbi9kb3RlbnYgLWMgZGV2ZWxvcG1lbnQgLS0gbm9kZSBub2RlX21vZHVsZXMvLmJpbi9wcmlzbWEgZ2VuZXJhdGVcImBcbiAgICApO1xuICB9XG4gIHJldHVybiBwb3N0TWVyZ2VDb21tYW5kcztcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZnVuY3Rpb24gY3JlYXRlVGFza09wdGlvbnMocnVubmVyOiBzdHJpbmcsIGFyZ3M6IHN0cmluZywgbmFtZTogc3RyaW5nLCBleHRlbnNpb246IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgICAgIDxUYXNrT3B0aW9ucyBpc0VuYWJsZWQ9XCJ0cnVlXCI+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJhcmd1bWVudHNcIiB2YWx1ZT1cIiR7YXJnc30gJEZpbGVQYXRoUmVsYXRpdmVUb1Byb2plY3RSb290JFwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJjaGVja1N5bnRheEVycm9yc1wiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiZGVzY3JpcHRpb25cIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiZXhpdENvZGVCZWhhdmlvclwiIHZhbHVlPVwiRVJST1JcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiZmlsZUV4dGVuc2lvblwiIHZhbHVlPVwiJHtleHRlbnNpb259XCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImltbWVkaWF0ZVN5bmNcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cIm5hbWVcIiB2YWx1ZT1cIiR7bmFtZX0gKC4ke2V4dGVuc2lvbn0pXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cIm91dHB1dFwiIHZhbHVlPVwiJEZpbGVQYXRoUmVsYXRpdmVUb1Byb2plY3RSb290JFwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJvdXRwdXRGaWx0ZXJzXCI+XG4gICAgICAgIDxhcnJheSAvPlxuICAgICAgPC9vcHRpb24+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJvdXRwdXRGcm9tU3Rkb3V0XCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJwcm9ncmFtXCIgdmFsdWU9XCIke3J1bm5lcn1cIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwicnVuT25FeHRlcm5hbENoYW5nZXNcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cInNjb3BlTmFtZVwiIHZhbHVlPVwiUHJvamVjdCBGaWxlc1wiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJ0cmFja09ubHlSb290XCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJ3b3JraW5nRGlyXCIgdmFsdWU9XCIkUHJvamVjdEZpbGVEaXIkXCIgLz5cbiAgICAgIDxlbnZzIC8+XG4gICAgPC9UYXNrT3B0aW9ucz5cbmA7XG59XG5cbmNvbnN0IHByZXR0aWVyQ29udGVudCA9IGA8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cbjxwcm9qZWN0IHZlcnNpb249XCI0XCI+XG4gIDxjb21wb25lbnQgbmFtZT1cIlByb2plY3RUYXNrc09wdGlvbnNcIj5cbiR7ZXh0ZW5zaW9ucy5wcmV0dGllci5tYXAoKGV4dCkgPT4gY3JlYXRlVGFza09wdGlvbnMoJ25vZGUnLCAnbm9kZV9tb2R1bGVzLy5iaW4vcHJldHRpZXIgLS1jYWNoZSAtLXdyaXRlJywgJ1ByZXR0aWVyJywgZXh0KSkuam9pbignJyl9XG4gIDwvY29tcG9uZW50PlxuPC9wcm9qZWN0PlxuYDtcblxuY29uc3QgYmlvbWVDb250ZW50ID0gYDw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuPHByb2plY3QgdmVyc2lvbj1cIjRcIj5cbiAgPGNvbXBvbmVudCBuYW1lPVwiUHJvamVjdFRhc2tzT3B0aW9uc1wiPlxuJHtleHRlbnNpb25zLnByZXR0aWVyLm1hcCgoZXh0KSA9PiBjcmVhdGVUYXNrT3B0aW9ucygnYnVuJywgJy0tYnVuIG5vZGVfbW9kdWxlcy8uYmluL2Jpb21lIGNoZWNrIC0tZml4IC0tbm8tZXJyb3JzLW9uLXVubWF0Y2hlZCAtLXNraXAtcGFyc2UtZXJyb3JzJywgJ0Jpb21lJywgZXh0KSkuam9pbignJyl9XG4gIDwvY29tcG9uZW50PlxuPC9wcm9qZWN0PlxuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlSWRlYVNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlSWRlYVNldHRpbmdzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuaWRlYScpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGRpclBhdGgpKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnd2F0Y2hlclRhc2tzLnhtbCcpO1xuICAgICAgYXdhaXQgKGNvbmZpZy5kb2VzQ29udGFpbnNKYXZhU2NyaXB0IHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5zSmF2YVNjcmlwdEluUGFja2FnZXMgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0IHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdEluUGFja2FnZXMgfHxcbiAgICAgIChjb25maWcuZG9lc0NvbnRhaW5zUGFja2FnZUpzb24gJiZcbiAgICAgICAgIWNvbmZpZy5kb2VzQ29udGFpbnNQdWJzcGVjWWFtbCAmJlxuICAgICAgICAhY29uZmlnLmRvZXNDb250YWluc0dlbWZpbGUgJiZcbiAgICAgICAgIWNvbmZpZy5kb2VzQ29udGFpbnNHb01vZCAmJlxuICAgICAgICAhY29uZmlnLmRvZXNDb250YWluc1BvbVhtbClcbiAgICAgICAgPyBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgY29uZmlnLmlzQnVuID8gYmlvbWVDb250ZW50IDogcHJldHRpZXJDb250ZW50KSlcbiAgICAgICAgOiBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSkpKTtcbiAgICB9XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHlhbWwgZnJvbSAnanMteWFtbCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5pbXBvcnQgeyBnZW5lcmF0ZVBvc3RNZXJnZUNvbW1hbmRzIH0gZnJvbSAnLi9odXNreXJjLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlU2NyaXB0cyB9IGZyb20gJy4vcGFja2FnZUpzb24uanMnO1xuXG5jb25zdCBuZXdTZXR0aW5ncyA9IHtcbiAgJ3Bvc3QtbWVyZ2UnOiB7XG4gICAgc2NyaXB0czoge1xuICAgICAgJ3ByZXBhcmUuc2gnOiB7XG4gICAgICAgIHJ1bm5lcjogJ2Jhc2gnLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAncHJlLWNvbW1pdCc6IHtcbiAgICBjb21tYW5kczoge1xuICAgICAgY2xlYW51cDoge1xuICAgICAgICBnbG9iOiAnKi57Y2pzLGNzcyxjdHMsaHRtLGh0bWwsanMsanNvbixqc29uNSxqc29uYyxqc3gsbWQsbWpzLG10cyxzY3NzLHRzLHRzeCx2dWUseWFtbCx5bWx9JyxcbiAgICAgICAgcnVuOiAnYnVuIC0tYnVuIHdiIGxpbnQgLS1maXggLS1mb3JtYXQge3N0YWdlZF9maWxlc30gJiYgZ2l0IGFkZCB7c3RhZ2VkX2ZpbGVzfScsXG4gICAgICB9LFxuICAgICAgJ2NoZWNrLW1pZ3JhdGlvbnMnOiB7XG4gICAgICAgIGdsb2I6ICcqKi9taWdyYXRpb24uc3FsJyxcbiAgICAgICAgcnVuOiBgXG5pZiBncmVwIC1xICdXYXJuaW5nczonIHtzdGFnZWRfZmlsZXN9OyB0aGVuXG4gIGVjaG8gXCJNaWdyYXRpb24gU1FMIGZpbGVzICh7c3RhZ2VkX2ZpbGVzfSkgY29udGFpbiB3YXJuaW5ncyEgUGxlYXNlIHNvbHZlIHRoZSB3YXJuaW5ncyBhbmQgY29tbWl0IGFnYWluLlwiXG4gIGV4aXQgMVxuZmlcbmAudHJpbSgpLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAncHJlLXB1c2gnOiB7XG4gICAgc2NyaXB0czoge1xuICAgICAgJ2NoZWNrLnNoJzoge1xuICAgICAgICBydW5uZXI6ICdiYXNoJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbn07XG5cbmNvbnN0IHNjcmlwdHMgPSB7XG4gIHByZVB1c2g6IGBidW4gLS1idW4gbm9kZV9tb2R1bGVzLy5iaW4vd2IgdHlwZWNoZWNrYCxcbiAgcHJlUHVzaEZvckxhYjogYFxuIyEvYmluL2Jhc2hcblxuaWYgWyAkKGdpdCBicmFuY2ggLS1zaG93LWN1cnJlbnQpID0gXCJtYWluXCIgXSAmJiBbICQoZ2l0IGNvbmZpZyB1c2VyLmVtYWlsKSAhPSBcImV4a2F6dXVAZ21haWwuY29tXCIgXTsgdGhlblxuICBlY2hvIFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCJcbiAgZWNobyBcIioqKiBEb24ndCBwdXNoIG1haW4gYnJhbmNoIGRpcmVjdGx5LiBVc2UgUFIhICoqKlwiXG4gIGVjaG8gXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIlxuICBleGl0IDFcbmZpXG5cbmJ1biAtLWJ1biBub2RlX21vZHVsZXMvLmJpbi93YiB0eXBlY2hlY2tcbmAudHJpbSgpLFxuICBwb3N0TWVyZ2U6IGBcbiMhL2Jpbi9iYXNoXG5cbmNoYW5nZWRfZmlsZXM9XCIkKGdpdCBkaWZmLXRyZWUgLXIgLS1uYW1lLW9ubHkgLS1uby1jb21taXQtaWQgT1JJR19IRUFEIEhFQUQpXCJcblxucnVuX2lmX2NoYW5nZWQoKSB7XG4gIGlmIGVjaG8gXCIkY2hhbmdlZF9maWxlc1wiIHwgZ3JlcCAtLXF1aWV0IC1FIFwiJDFcIjsgdGhlblxuICAgIGV2YWwgXCIkMlwiXG4gIGZpXG59XG5gLnRyaW0oKSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUxlZnRob29rVXBkYXRpbmdQYWNrYWdlSnNvbihjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUxlZnRob29rVXBkYXRpbmdQYWNrYWdlSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBjb3JlKGNvbmZpZyk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmxlZnRob29rJyk7XG4gIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICBmcy5wcm9taXNlcy53cml0ZUZpbGUoXG4gICAgICBwYXRoLmpvaW4oY29uZmlnLmRpclBhdGgsICdsZWZ0aG9vay55bWwnKSxcbiAgICAgIHlhbWwuZHVtcChuZXdTZXR0aW5ncywge1xuICAgICAgICBsaW5lV2lkdGg6IC0xLFxuICAgICAgICBub0NvbXBhdE1vZGU6IHRydWUsXG4gICAgICAgIHN0eWxlczoge1xuICAgICAgICAgICchIW51bGwnOiAnZW1wdHknLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICApLFxuICAgIGZzLnByb21pc2VzLnJtKGRpclBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KSxcbiAgXSk7XG5cbiAgY29uc3QgeyB0eXBlY2hlY2sgfSA9IGdlbmVyYXRlU2NyaXB0cyhjb25maWcpO1xuICBpZiAodHlwZWNoZWNrKSB7XG4gICAgY29uc3QgcHJlUHVzaCA9IGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJykgPyBzY3JpcHRzLnByZVB1c2hGb3JMYWIgOiBzY3JpcHRzLnByZVB1c2g7XG4gICAgZnMubWtkaXJTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncHJlLXB1c2gnKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKGRpclBhdGgsICdwcmUtcHVzaCcsICdjaGVjay5zaCcpLCBwcmVQdXNoICsgJ1xcbicsIHtcbiAgICAgICAgbW9kZTogMG83NTUsXG4gICAgICB9KVxuICAgICk7XG4gIH1cbiAgY29uc3QgcG9zdE1lcmdlQ29tbWFuZCA9IGAke3NjcmlwdHMucG9zdE1lcmdlfVxcblxcbiR7Z2VuZXJhdGVQb3N0TWVyZ2VDb21tYW5kcyhjb25maWcpLmpvaW4oJ1xcbicpfVxcbmA7XG4gIGZzLm1rZGlyU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ3Bvc3QtbWVyZ2UnKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgIGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3Bvc3QtbWVyZ2UnLCAncHJlcGFyZS5zaCcpLCBwb3N0TWVyZ2VDb21tYW5kLCB7XG4gICAgICBtb2RlOiAwbzc1NSxcbiAgICB9KVxuICApO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmNvbnN0IHNyY0RpcmVjdG9yaWVzID0ge1xuICBub2RlOiBbJ3NyYycsICd0ZXN0JywgJ3NjcmlwdHMnXS5zb3J0KCksXG4gIGJsaXR6OiBbJ3NyYycsICd0ZXN0JywgJ3NjcmlwdHMnLCAnZGInLCAnaW50ZWdyYXRpb25zJywgJ21haWxlcnMnXS5zb3J0KCksXG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3JjRGlycyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmdbXSB7XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6KSB7XG4gICAgcmV0dXJuIHNyY0RpcmVjdG9yaWVzLmJsaXR6O1xuICB9XG4gIHJldHVybiBzcmNEaXJlY3Rvcmllcy5ub2RlO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgRXNsaW50VXRpbCB9IGZyb20gJy4uL3V0aWxzL2VzbGludFV0aWwuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgZ2V0U3JjRGlycyB9IGZyb20gJy4uL3V0aWxzL3NyY0RpcmVjdG9yaWVzLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlTGludHN0YWdlZHJjKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlTGludHN0YWdlZHJjJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IGNvcmUoY29uZmlnKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmxpbnRzdGFnZWRyYy5janMnKTtcbiAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcGFja2FnZVByZWZpeCA9IGNvbmZpZy5pc1Jvb3QgPyAnbm9kZSBub2RlX21vZHVsZXMvLmJpbi8nIDogJ25vZGUgLi4vLi4vbm9kZV9tb2R1bGVzLy5iaW4vJztcbiAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5zSmF2YVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdCkge1xuICAgIGNvbnN0IGVzbGludCA9IGBcbiAgJyR7Z2V0RXNsaW50S2V5KGNvbmZpZyl9JzogWyR7SlNPTi5zdHJpbmdpZnkoXG4gICAgYCR7cGFja2FnZVByZWZpeH1lc2xpbnQgLS1maXgke0VzbGludFV0aWwuZ2V0TGludEZpeFN1ZmZpeChjb25maWcpfWBcbiAgKX0sICcke3BhY2thZ2VQcmVmaXh9cHJldHRpZXIgLS1jYWNoZSAtLXdyaXRlJ10sYDtcbiAgICBsaW5lcy5wdXNoKGVzbGludCk7XG4gIH1cbiAgY29uc3QgcGFja2FnZXNGaWx0ZXIgPSBjb25maWcuaXNSb290ID8gXCIgJiYgIWZpbGUuaW5jbHVkZXMoJy9wYWNrYWdlcy8nKVwiIDogJyc7XG4gIGxpbmVzLnB1c2goYFxuICAnLi8qKi8qLnske2V4dGVuc2lvbnMucHJldHRpZXIuam9pbignLCcpfX0nOiBmaWxlcyA9PiB7XG4gICAgbGV0IGZpbHRlcmVkRmlsZXMgPSBmaWxlcy5maWx0ZXIoZmlsZSA9PiAhZmlsZS5pbmNsdWRlcygnL3Rlc3QtZml4dHVyZXMvJykgJiYgIWZpbGUuaW5jbHVkZXMoJy90ZXN0L2ZpeHR1cmVzLycpJHtwYWNrYWdlc0ZpbHRlcn0pOyR7Z2V0RXNsaW50RmlsdGVyRm9yUHJldHRpZXIoY29uZmlnKX1cbiAgICBpZiAoZmlsdGVyZWRGaWxlcy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcbiAgICBjb25zdCBjb21tYW5kcyA9IFtcXGAke3BhY2thZ2VQcmVmaXh9cHJldHRpZXIgLS1jYWNoZSAtLXdyaXRlIFxcJHtmaWx0ZXJlZEZpbGVzLmpvaW4oJyAnKX1cXGBdO1xuICAgIGlmIChmaWx0ZXJlZEZpbGVzLnNvbWUoZmlsZSA9PiBmaWxlLmVuZHNXaXRoKCdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICAgIGNvbW1hbmRzLnB1c2goJyR7cGFja2FnZVByZWZpeH1zb3J0LXBhY2thZ2UtanNvbicpO1xuICAgIH1cbiAgICByZXR1cm4gY29tbWFuZHM7XG4gIH0sXG4gICcuLyoqL21pZ3JhdGlvbi5zcWwnOiAoZmlsZXMpID0+IHtcbiAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmaWxlLCAndXRmLTgnKTtcbiAgICBpZiAoY29udGVudC5pbmNsdWRlcygnV2FybmluZ3M6JykpIHtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIFxcYCEhISBNaWdyYXRpb24gU1FMIGZpbGUgKFxcJHtwYXRoLnJlbGF0aXZlKCcnLCBmaWxlKX0pIGNvbnRhaW5zIHdhcm5pbmdzICEhISBTb2x2ZSB0aGUgd2FybmluZ3MgYW5kIGNvbW1pdCBhZ2Fpbi5cXGAsXG4gICAgICBdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gW107XG59LGApO1xuICBpZiAoY29uZmlnLmRvZXNDb250YWluc1B1YnNwZWNZYW1sKSB7XG4gICAgbGluZXMucHVzaChgXG4gICcuL3tsaWIsdGVzdCx0ZXN0X2RyaXZlcn0vKiovKi5kYXJ0JzogZmlsZXMgPT4ge1xuICAgIGNvbnN0IGZpbHRlcmVkRmlsZXMgPSBmaWxlcy5maWx0ZXIoZmlsZSA9PiAhZmlsZS5pbmNsdWRlcygnZ2VuZXJhdGVkJykpXG4gICAgICAuZmlsdGVyKGZpbGUgPT4gIWZpbGUuZW5kc1dpdGgoJy5mcmVlemVkLmRhcnQnKSAmJiAhZmlsZS5lbmRzV2l0aCgnLmcuZGFydCcpKTtcbiAgICBpZiAoZmlsdGVyZWRGaWxlcy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcbiAgICByZXR1cm4gW1xcYGZsdXR0ZXIgZm9ybWF0IFxcJHtmaWx0ZXJlZEZpbGVzLmpvaW4oJyAnKX1cXGBdO1xuICB9LGApO1xuICB9XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5zUG9ldHJ5TG9jaykge1xuICAgIGxpbmVzLnB1c2goYFxuICAnLi8qKi8qLnB5JzogW1xuICAgICdwb2V0cnkgcnVuIGlzb3J0IC0tcHJvZmlsZSBibGFjayAtLWZpbHRlci1maWxlcycsXG4gICAgJ3BvZXRyeSBydW4gYmxhY2snLFxuICAgICdwb2V0cnkgcnVuIGZsYWtlOCdcbiAgXSxgKTtcbiAgfVxuXG4gIGNvbnN0IG5ld0NvbnRlbnQgPSBgY29uc3QgZnMgPSByZXF1aXJlKCdmcycpO1xuY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcbiR7Y29uZmlnLmRvZXNDb250YWluc0phdmFTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHQgPyBcImNvbnN0IG1pY3JvbWF0Y2ggPSByZXF1aXJlKCdtaWNyb21hdGNoJyk7XFxuXCIgOiAnJ31cbm1vZHVsZS5leHBvcnRzID0geyR7bGluZXMuam9pbignJyl9XG59O1xuYDtcblxuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmxpbnRzdGFnZWRyYy5qcycpLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5saW50c3RhZ2VkcmMuanNvbicpLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbn1cblxuZnVuY3Rpb24gZ2V0RXNsaW50S2V5KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIGNvbnN0IGRpcnMgPSBnZXRTcmNEaXJzKGNvbmZpZykubWFwKChkaXIpID0+IGAke2Rpcn0vKiovYCk7XG4gIHJldHVybiBgeywke2RpcnMuam9pbignLCcpfX0qLnske2V4dGVuc2lvbnMuZXNsaW50LmpvaW4oJywnKX19YDtcbn1cblxuZnVuY3Rpb24gZ2V0RXNsaW50RmlsdGVyRm9yUHJldHRpZXIoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNvbmZpZy5kb2VzQ29udGFpbnNKYXZhU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0XG4gICAgPyBgXFxuXG4gICAgZmlsdGVyZWRGaWxlcyA9IGZpbHRlcmVkRmlsZXMubWFwKChmaWxlKSA9PiBwYXRoLnJlbGF0aXZlKCcnLCBmaWxlKSk7XG4gICAgZmlsdGVyZWRGaWxlcyA9IG1pY3JvbWF0Y2gubm90KGZpbHRlcmVkRmlsZXMsICcke2dldEVzbGludEtleShjb25maWcpfScpO1xuICAgIGZpbHRlcmVkRmlsZXMgPSBmaWx0ZXJlZEZpbGVzLm1hcCgoZmlsZSkgPT4gcGF0aC5yZXNvbHZlKGZpbGUpKTtgXG4gICAgOiAnJztcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlTmV4dENvbmZpZ0pzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVOZXh0Q29uZmlnSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IFsnanMnLCAnbWpzJywgJ2NqcyddXG4gICAgICAubWFwKChleHQpID0+IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgYG5leHQuY29uZmlnLiR7ZXh0fWApKVxuICAgICAgLmZpbmQoKHApID0+IGZzLmV4aXN0c1N5bmMocCkpO1xuICAgIGlmICghZmlsZVBhdGgpIHJldHVybjtcblxuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAvLyBSZXBsYWNlIHRoZSBKU09OIG9iamVjdCBmcm9tIHRoZSBmaWxlXG4gICAgY29uc3QgbmV3Q29udGVudCA9IG9sZENvbnRlbnQucmVwbGFjZSgvPVxccyp7KFtcXFNcXHNdKil9Oy8sIChfLCBzZXR0aW5nc1RleHQ6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKCFzZXR0aW5nc1RleHQuaW5jbHVkZXMoJ2VzbGludDonKSkge1xuICAgICAgICBzZXR0aW5nc1RleHQgKz0gJ2VzbGludDogeyBpZ25vcmVEdXJpbmdCdWlsZHM6IHRydWUgfSwnO1xuICAgICAgfVxuICAgICAgaWYgKCFzZXR0aW5nc1RleHQuaW5jbHVkZXMoJ3R5cGVzY3JpcHQ6JykpIHtcbiAgICAgICAgc2V0dGluZ3NUZXh0ICs9ICd0eXBlc2NyaXB0OiB7IGlnbm9yZUJ1aWxkRXJyb3JzOiB0cnVlIH0sJztcbiAgICAgIH1cbiAgICAgIHJldHVybiBgPSB7JHtzZXR0aW5nc1RleHR9fTtgO1xuICAgIH0pO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGNvbW1vbkNvbnRlbnQgPSBgXG4zcmQtcGFydHkvXG5hbmRyb2lkL1xuaW9zL1xubm8tZm9ybWF0L1xudGVzdC1maXh0dXJlcy9cbnRlc3QvZml4dHVyZXMvXG4qLmQudHNcbioubWluLmpzXG4ueWFybi9cbi5wbnAuanNcbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVByZXR0aWVyaWdub3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUHJldHRpZXJpZ25vcmUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcucHJldHRpZXJpZ25vcmUnKTtcbiAgICBjb25zdCBjb250ZW50ID0gKGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGgpKSA/PyAnJztcbiAgICBjb25zdCBoZWFkVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRIZWFkVXNlckNvbnRlbnQoY29udGVudCk7XG4gICAgY29uc3QgdGFpbFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0VGFpbFVzZXJDb250ZW50KGNvbnRlbnQpO1xuXG4gICAgY29uc3QgZ2l0aWdub3JlRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aWdub3JlJyk7XG4gICAgY29uc3QgZ2l0aWdub3JlQ29udGVudCA9IChhd2FpdCBpZ25vcmVGaWxlVXRpbC5yZWFkR2l0aWdub3JlV2l0aG91dFNlcGFyYXRvcnMoZ2l0aWdub3JlRmlsZVBhdGgpKSB8fCAnJztcblxuICAgIGxldCBhZGRpdGlvbmFsQ29udGVudCA9ICcnO1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zUHVic3BlY1lhbWwpIHtcbiAgICAgIGFkZGl0aW9uYWxDb250ZW50ID0gYFxuYW5kcm9pZC9hcHAvXG5pb3MvUnVubmVyL0Fzc2V0cy54Y2Fzc2V0cy9cbnB1YnNwZWMueWFtbFxuYDtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdDb250ZW50ID0gaGVhZFVzZXJDb250ZW50ICsgY29tbW9uQ29udGVudCArIGFkZGl0aW9uYWxDb250ZW50ICsgZ2l0aWdub3JlQ29udGVudCArIHRhaWxVc2VyQ29udGVudDtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IGNsb25lRGVlcCBmcm9tICdsb2Rhc2guY2xvbmVkZWVwJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBqc29uT2JqID0ge1xuICB2ZW52UGF0aDogJy4nLFxuICB2ZW52OiAnLnZlbnYnLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBsZXQgbmV3U2V0dGluZ3M6IG9iamVjdCA9IGNsb25lRGVlcChqc29uT2JqKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3B5cmlnaHRjb25maWcuanNvbicpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBvbGRTZXR0aW5ncyA9IEpTT04ucGFyc2Uob2xkQ29udGVudCkgYXMgb2JqZWN0O1xuICAgICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBzZW1hbnRpY1JlbGVhc2VCYWRnZSA9XG4gICdbIVtzZW1hbnRpYy1yZWxlYXNlXShodHRwczovL2ltZy5zaGllbGRzLmlvL2JhZGdlLyUyMCUyMCVGMCU5RiU5MyVBNiVGMCU5RiU5QSU4MC1zZW1hbnRpYy0tcmVsZWFzZS1lMTAwNzkuc3ZnKV0oaHR0cHM6Ly9naXRodWIuY29tL3NlbWFudGljLXJlbGVhc2Uvc2VtYW50aWMtcmVsZWFzZSknO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZWFkbWUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVSZWFkbWUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdSRUFETUUubWQnKTtcbiAgICBsZXQgbmV3Q29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuXG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnJlbGVhc2VyYy5qc29uJykpKSB7XG4gICAgICBuZXdDb250ZW50ID0gaW5zZXJ0QmFkZ2UobmV3Q29udGVudCwgc2VtYW50aWNSZWxlYXNlQmFkZ2UpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcG9zaXRvcnkgPSBjb25maWcucmVwb3NpdG9yeT8uc2xpY2UoY29uZmlnLnJlcG9zaXRvcnk/LmluZGV4T2YoJzonKSArIDEpO1xuICAgIGNvbnN0IGZpbGVOYW1lcyA9IGZzLnJlYWRkaXJTeW5jKGAke2NvbmZpZy5kaXJQYXRofS8uZ2l0aHViL3dvcmtmbG93c2ApO1xuICAgIGZvciAoY29uc3QgZmlsZU5hbWUgb2YgZmlsZU5hbWVzKSB7XG4gICAgICBpZiAoIWZpbGVOYW1lLnN0YXJ0c1dpdGgoJ3Rlc3QnKSAmJiAhZmlsZU5hbWUuc3RhcnRzV2l0aCgnZGVwbG95JykpIGNvbnRpbnVlO1xuXG4gICAgICBsZXQgYmFkZ2VOYW1lID0gZmlsZU5hbWU7XG4gICAgICBiYWRnZU5hbWUgPSBiYWRnZU5hbWVbMF0udG9VcHBlckNhc2UoKSArIGJhZGdlTmFtZS5zbGljZSgxLCBiYWRnZU5hbWUuaW5kZXhPZignLicpKTtcbiAgICAgIGJhZGdlTmFtZSA9IGJhZGdlTmFtZS5yZXBsYWNlKCctJywgJyAnKTtcbiAgICAgIGNvbnN0IGJhZGdlID0gYFshWyR7YmFkZ2VOYW1lfV0oaHR0cHM6Ly9naXRodWIuY29tLyR7cmVwb3NpdG9yeX0vYWN0aW9ucy93b3JrZmxvd3MvJHtmaWxlTmFtZX0vYmFkZ2Uuc3ZnKV0oaHR0cHM6Ly9naXRodWIuY29tLyR7cmVwb3NpdG9yeX0vYWN0aW9ucy93b3JrZmxvd3MvJHtmaWxlTmFtZX0pYDtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgYC5naXRodWIvd29ya2Zsb3dzLyR7ZmlsZU5hbWV9YCkpKSB7XG4gICAgICAgIG5ld0NvbnRlbnQgPSBpbnNlcnRCYWRnZShuZXdDb250ZW50LCBiYWRnZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbnNlcnRCYWRnZShyZWFkbWU6IHN0cmluZywgYmFkZ2U6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIOaXouOBq2JhZGdl44GM44GC44KL5aC05ZCI44Gv5YmK6ZmkXG4gIHJlYWRtZSA9IHJlYWRtZS5yZXBsYWNlKGJhZGdlLCAnJykucmVwbGFjZUFsbCgvXFxuXFxuXFxuKy9nLCAnXFxuXFxuJyk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByZWFkbWUubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAocmVhZG1lW2kgLSAxXSA9PT0gJ1xcbicgJiYgcmVhZG1lW2ldID09PSAnXFxuJykge1xuICAgICAgY29uc3QgYmVmb3JlID0gcmVhZG1lLnNsaWNlKDAsIGkgKyAxKTtcbiAgICAgIGxldCBhZnRlciA9IHJlYWRtZS5zbGljZShpICsgMSk7XG4gICAgICBpZiAoIWFmdGVyLnN0YXJ0c1dpdGgoJ1snKSAmJiAhYWZ0ZXIuc3RhcnRzV2l0aCgnIScpKSB7XG4gICAgICAgIGFmdGVyID0gYFxcbiR7YWZ0ZXJ9YDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBgJHtiZWZvcmV9JHtiYWRnZX1cXG4ke2FmdGVyfWA7XG4gICAgfVxuICB9XG4gIHJldHVybiBgJHtyZWFkbWV9XFxuJHtiYWRnZX1cXG5gO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUmVsZWFzZXJjKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVJlbGVhc2VyYycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcucmVsZWFzZXJjLmpzb24nKTtcbiAgICBjb25zdCBzZXR0aW5ncyA9IEpTT04ucGFyc2UoYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4JykpIGFzIHtcbiAgICAgIHBsdWdpbnM6IChzdHJpbmcgfCBbc3RyaW5nLCB1bmtub3duXSlbXTtcbiAgICB9O1xuICAgIGNvbnN0IHBsdWdpbnMgPSBzZXR0aW5ncz8ucGx1Z2lucyB8fCBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBsdWdpbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHBsdWdpbiA9IEFycmF5LmlzQXJyYXkocGx1Z2luc1tpXSkgPyBwbHVnaW5zW2ldWzBdIDogcGx1Z2luc1tpXTtcbiAgICAgIGNvbnN0IG9sZENvbmZpZyA9IChBcnJheS5pc0FycmF5KHBsdWdpbnNbaV0pICYmIHBsdWdpbnNbaV1bMV0pIHx8IHt9O1xuICAgICAgaWYgKHBsdWdpbiA9PT0gJ0BzZW1hbnRpYy1yZWxlYXNlL2NvbW1pdC1hbmFseXplcicpIHtcbiAgICAgICAgcGx1Z2luc1tpXSA9IFtcbiAgICAgICAgICAnQHNlbWFudGljLXJlbGVhc2UvY29tbWl0LWFuYWx5emVyJyxcbiAgICAgICAgICBtZXJnZS5hbGwoXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIG9sZENvbmZpZyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHByZXNldDogJ2NvbnZlbnRpb25hbGNvbW1pdHMnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfVxuICAgICAgICAgICksXG4gICAgICAgIF07XG4gICAgICB9IGVsc2UgaWYgKHBsdWdpbiA9PT0gJ0BzZW1hbnRpYy1yZWxlYXNlL2dpdGh1YicpIHtcbiAgICAgICAgLy8gUmVtb3ZlIGRlcHJlY2F0ZWQgc3VjY2Vzc0NvbW1lbnQgYW5kIGZhaWxDb21tZW50IHByb3BlcnRpZXMgZnJvbSBvbGRDb25maWdcbiAgICAgICAgY29uc3QgeyBmYWlsQ29tbWVudDogXzEsIHN1Y2Nlc3NDb21tZW50OiBfMiwgLi4uY2xlYW5PbGRDb25maWcgfSA9IG9sZENvbmZpZyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgcGx1Z2luc1tpXSA9IFtcbiAgICAgICAgICAnQHNlbWFudGljLXJlbGVhc2UvZ2l0aHViJyxcbiAgICAgICAgICBtZXJnZS5hbGwoXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIGNsZWFuT2xkQ29uZmlnLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLy8gY2YuIGh0dHBzOi8vZ2l0aHViLmNvbS9zZW1hbnRpYy1yZWxlYXNlL3NlbWFudGljLXJlbGVhc2UvaXNzdWVzLzIyMDQjaXNzdWVjb21tZW50LTE1MDg0MTc3MDRcbiAgICAgICAgICAgICAgICBzdWNjZXNzQ29tbWVudENvbmRpdGlvbjogZmFsc2UsXG4gICAgICAgICAgICAgICAgZmFpbENvbW1lbnRDb25kaXRpb246IGZhbHNlLFxuICAgICAgICAgICAgICAgIGxhYmVsczogWydyOiBzZW1hbnRpYy1yZWxlYXNlJ10sXG4gICAgICAgICAgICAgICAgcmVsZWFzZWRMYWJlbHM6IFsncmVsZWFzZWQgOmJvb2ttYXJrOiddLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfVxuICAgICAgICAgICksXG4gICAgICAgIF07XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShzZXR0aW5ncyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCBjbG9uZURlZXAgZnJvbSAnbG9kYXNoLmNsb25lZGVlcCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QganNvbk9iaiA9IHtcbiAgJHNjaGVtYTogJ2h0dHBzOi8vZG9jcy5yZW5vdmF0ZWJvdC5jb20vcmVub3ZhdGUtc2NoZW1hLmpzb24nLFxuICBleHRlbmRzOiBbJ2dpdGh1Yj5XaWxsQm9vc3Rlci93aWxsYm9vc3Rlci1jb25maWdzOnJlbm92YXRlLmpzb241J10sXG59O1xuXG50eXBlIFNldHRpbmdzID0gdHlwZW9mIGpzb25PYmogJiB7IHBhY2thZ2VSdWxlczogeyBtYXRjaFBhY2thZ2VOYW1lczogc3RyaW5nW107IGVuYWJsZWQ/OiBib29sZWFuIH1bXSB9O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZW5vdmF0ZUpzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVSZW5vdmF0ZUpzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgbGV0IG5ld1NldHRpbmdzID0gY2xvbmVEZWVwKGpzb25PYmopIGFzIFNldHRpbmdzO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAncmVub3ZhdGUuanNvbicpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGAke2ZpbGVQYXRofTVgKSkge1xuICAgICAgLy8gU2luY2UgaXQgaXMgZGlmZmljdWx0IGZvciBwYXJzaW5nIHJlbm92YXRlLmpzb241LCB3ZSBkbyBub3RoaW5nXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBvbGRTZXR0aW5ncyA9IEpTT04ucGFyc2Uob2xkQ29udGVudCkgYXMgU2V0dGluZ3M7XG4gICAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHtcbiAgICAgICAgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UsXG4gICAgICB9KSBhcyBTZXR0aW5ncztcbiAgICAgIG5ld1NldHRpbmdzLmV4dGVuZHMgPSBuZXdTZXR0aW5ncy5leHRlbmRzLmZpbHRlcigoaXRlbTogc3RyaW5nKSA9PiBpdGVtICE9PSAnQHdpbGxib29zdGVyJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgLy8gRG9uJ3QgdXBncmFkZSBOZXh0LmpzIGF1dG9tYXRpY2FsbHlcbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eikge1xuICAgICAgbmV3U2V0dGluZ3MucGFja2FnZVJ1bGVzID8/PSBbXTtcbiAgICAgIGlmIChcbiAgICAgICAgIW5ld1NldHRpbmdzLnBhY2thZ2VSdWxlcy5zb21lKChydWxlOiB7IG1hdGNoUGFja2FnZU5hbWVzOiBzdHJpbmdbXSB9KSA9PlxuICAgICAgICAgIHJ1bGUubWF0Y2hQYWNrYWdlTmFtZXMuaW5jbHVkZXMoJ25leHQnKVxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgbmV3U2V0dGluZ3MucGFja2FnZVJ1bGVzLnB1c2goeyBtYXRjaFBhY2thZ2VOYW1lczogWyduZXh0J10sIGVuYWJsZWQ6IGZhbHNlIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZGVwZW5kYWJvdCcpLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnJlbm92YXRlcmMuanNvbicpLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIG1vdmVUb0JvdHRvbTxUT2JqIGV4dGVuZHMgUmVjb3JkPFRLZXksIHVua25vd24+LCBUS2V5IGV4dGVuZHMgc3RyaW5nIHwgbnVtYmVyIHwgc3ltYm9sPihcbiAgb2JqOiBUT2JqLFxuICBrZXk6IFRLZXlcbik6IFRPYmoge1xuICBjb25zdCB2YWx1ZSA9IG9ialtrZXldO1xuICBkZWxldGUgb2JqW2tleV07XG4gIChvYmogYXMgUmVjb3JkPFRLZXksIHVua25vd24+KVtrZXldID0gdmFsdWU7XG4gIHJldHVybiBvYmo7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzb3J0S2V5czxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KG9iajogVCk6IFQge1xuICBjb25zdCBrZXlBbmRWYWx1ZXMgPSBPYmplY3QuZW50cmllcyhvYmopLnNvcnQoKFtrZXkxXSwgW2tleTJdKSA9PiBrZXkxLmxvY2FsZUNvbXBhcmUoa2V5MikpO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBrZXlBbmRWYWx1ZXMpIHtcbiAgICBkZWxldGUgb2JqW2tleV07XG4gICAgKG9iaiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSA9IHZhbHVlO1xuXG4gICAgLy8gaWYgdmFsdWUgaXMgYW4gb2JqZWN0LCBzb3J0IHRoZSBrZXlzIG9mIHRoZSBvYmplY3RcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgc29ydEtleXModmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb2JqO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgY2xvbmVEZWVwIGZyb20gJ2xvZGFzaC5jbG9uZWRlZXAnO1xuaW1wb3J0IHR5cGUgeyBUc0NvbmZpZ0pzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgY29tYmluZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHNvcnRLZXlzIH0gZnJvbSAnLi4vdXRpbHMvb2JqZWN0VXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3Qgcm9vdEpzb25PYmogPSB7XG4gIGNvbXBpbGVyT3B0aW9uczoge1xuICAgIHRhcmdldDogJ0VTMjAyMicsIC8vIGJlY2F1c2UgZGVjb3JhdG9ycyBzaG91bGQgYmUgdHJhbnNwaWxlZCB0byBFUzIwMjIgb24gTm9kZS5qc1xuICAgIG1vZHVsZTogJ0VTTmV4dCcsXG4gICAgbW9kdWxlUmVzb2x1dGlvbjogJ05vZGUnLFxuICAgIGpzeDogJ3JlYWN0LWpzeCcsXG4gICAgYWx3YXlzU3RyaWN0OiB0cnVlLFxuICAgIHN0cmljdDogdHJ1ZSxcbiAgICBza2lwTGliQ2hlY2s6IHRydWUsIC8vIGJlY2F1c2UgbGlicmFyaWVzIG1heSBoYXZlIGJyb2tlbiB0eXBlc1xuICAgIGFsbG93U3ludGhldGljRGVmYXVsdEltcG9ydHM6IHRydWUsIC8vIGFsbG93IGBpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnYFxuICAgIGVzTW9kdWxlSW50ZXJvcDogdHJ1ZSwgLy8gYWxsb3cgZGVmYXVsdCBpbXBvcnQgZnJvbSBDb21tb25KUy9BTUQvVU1EIG1vZHVsZXNcbiAgICByZXNvbHZlSnNvbk1vZHVsZTogdHJ1ZSwgLy8gYWxsb3cgdG8gaW1wb3J0IEpTT04gZmlsZXNcbiAgICBkZWNsYXJhdGlvbjogdHJ1ZSxcbiAgICBzb3VyY2VNYXA6IHRydWUsXG4gICAgaW1wb3J0SGVscGVyczogZmFsc2UsXG4gICAgZXJhc2FibGVTeW50YXhPbmx5OiB0cnVlLFxuICAgIG91dERpcjogJ2Rpc3QnLFxuICAgIHR5cGVSb290czogWycuL25vZGVfbW9kdWxlcy9AdHlwZXMnLCAnLi9AdHlwZXMnXSxcbiAgfSxcbiAgZXhjbHVkZTogWydwYWNrYWdlcy8qL3Rlc3QvZml4dHVyZXMnLCAndGVzdC9maXh0dXJlcyddLFxuICBpbmNsdWRlOiBbXG4gICAgJ3BhY2thZ2VzLyovc2NyaXB0cy8qKi8qJyxcbiAgICAncGFja2FnZXMvKi9zcmMvKiovKicsXG4gICAgJ3BhY2thZ2VzLyovdGVzdC8qKi8qJyxcbiAgICAnc2NyaXB0cy8qKi8qJyxcbiAgICAnc3JjLyoqLyonLFxuICAgICd0ZXN0LyoqLyonLFxuICBdLFxufTtcblxuY29uc3Qgc3ViSnNvbk9iaiA9IHtcbiAgY29tcGlsZXJPcHRpb25zOiB7XG4gICAgdGFyZ2V0OiAnRVMyMDIyJywgLy8gYmVjYXVzZSBkZWNvcmF0b3JzIHNob3VsZCBiZSB0cmFuc3BpbGVkIHRvIEVTMjAyMiBvbiBOb2RlLmpzXG4gICAgbW9kdWxlOiAnRVNOZXh0JyxcbiAgICBtb2R1bGVSZXNvbHV0aW9uOiAnTm9kZScsXG4gICAganN4OiAncmVhY3QtanN4JyxcbiAgICBhbHdheXNTdHJpY3Q6IHRydWUsXG4gICAgc3RyaWN0OiB0cnVlLFxuICAgIHNraXBMaWJDaGVjazogdHJ1ZSwgLy8gYmVjYXVzZSBsaWJyYXJpZXMgbWF5IGhhdmUgYnJva2VuIHR5cGVzXG4gICAgYWxsb3dTeW50aGV0aWNEZWZhdWx0SW1wb3J0czogdHJ1ZSwgLy8gYWxsb3cgYGltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdgXG4gICAgZXNNb2R1bGVJbnRlcm9wOiB0cnVlLCAvLyBhbGxvdyBkZWZhdWx0IGltcG9ydCBmcm9tIENvbW1vbkpTL0FNRC9VTUQgbW9kdWxlc1xuICAgIHJlc29sdmVKc29uTW9kdWxlOiB0cnVlLCAvLyBhbGxvdyB0byBpbXBvcnQgSlNPTiBmaWxlc1xuICAgIGRlY2xhcmF0aW9uOiB0cnVlLFxuICAgIHNvdXJjZU1hcDogdHJ1ZSxcbiAgICBpbXBvcnRIZWxwZXJzOiBmYWxzZSxcbiAgICBlcmFzYWJsZVN5bnRheE9ubHk6IHRydWUsXG4gICAgb3V0RGlyOiAnZGlzdCcsXG4gICAgdHlwZVJvb3RzOiBbJy4uLy4uL25vZGVfbW9kdWxlcy9AdHlwZXMnLCAnLi4vLi4vQHR5cGVzJywgJy4vQHR5cGVzJ10sXG4gIH0sXG4gIGV4Y2x1ZGU6IFsndGVzdC9maXh0dXJlcyddLFxuICBpbmNsdWRlOiBbJ3NjcmlwdHMvKiovKicsICdzcmMvKiovKicsICd0ZXN0LyoqLyonXSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVRzY29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlVHNjb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHwgY29uZmlnLmRlcGVuZGluZy5uZXh0KSByZXR1cm47XG5cbiAgICBsZXQgbmV3U2V0dGluZ3MgPSBjbG9uZURlZXAoY29uZmlnLmlzUm9vdCA/IHJvb3RKc29uT2JqIDogc3ViSnNvbk9iaikgYXMgVHNDb25maWdKc29uO1xuICAgIGlmICghY29uZmlnLmRvZXNDb250YWluc0pzeE9yVHN4ICYmICFjb25maWcuZG9lc0NvbnRhaW5zSnN4T3JUc3hJblBhY2thZ2VzKSB7XG4gICAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5qc3g7XG4gICAgfVxuICAgIGlmIChjb25maWcuaXNSb290ICYmICFjb25maWcuZG9lc0NvbnRhaW5zU3ViUGFja2FnZUpzb25zKSB7XG4gICAgICBuZXdTZXR0aW5ncy5pbmNsdWRlID0gbmV3U2V0dGluZ3MuaW5jbHVkZT8uZmlsdGVyKChkaXJQYXRoOiBzdHJpbmcpID0+ICFkaXJQYXRoLnN0YXJ0c1dpdGgoJ3BhY2thZ2VzLyovJykpO1xuICAgICAgbmV3U2V0dGluZ3MuZXhjbHVkZSA9IG5ld1NldHRpbmdzLmV4Y2x1ZGU/LmZpbHRlcigoZGlyUGF0aDogc3RyaW5nKSA9PiAhZGlyUGF0aC5zdGFydHNXaXRoKCdwYWNrYWdlcy8qLycpKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5pc0VzbVBhY2thZ2UpIHtcbiAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyA9IHtcbiAgICAgICAgLi4ubmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLFxuICAgICAgICBtb2R1bGU6ICdOb2RlTmV4dCcsXG4gICAgICAgIG1vZHVsZVJlc29sdXRpb246ICdOb2RlTmV4dCcsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAndHNjb25maWcuanNvbicpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG9sZFNldHRpbmdzID0gSlNPTi5wYXJzZShleGlzdGluZ0NvbnRlbnQpIGFzIFRzQ29uZmlnSnNvbjtcbiAgICAgIGlmIChvbGRTZXR0aW5ncy5leHRlbmRzID09PSAnLi9ub2RlX21vZHVsZXMvQHdpbGxib29zdGVyL3RzY29uZmlnL3RzY29uZmlnLmpzb24nKSB7XG4gICAgICAgIGRlbGV0ZSBvbGRTZXR0aW5ncy5leHRlbmRzO1xuICAgICAgfVxuICAgICAgLy8gRG9uJ3QgbW9kaWZ5IFwidGFyZ2V0XCIsIFwibW9kdWxlXCIgYW5kIFwibW9kdWxlUmVzb2x1dGlvblwiLlxuICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8udGFyZ2V0O1xuICAgICAgaWYgKCFjb25maWcuaXNFc21QYWNrYWdlKSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/Lm1vZHVsZTtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8ubW9kdWxlUmVzb2x1dGlvbjtcbiAgICAgIH1cbiAgICAgIGlmIChvbGRTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmpzeCkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5qc3g7XG4gICAgICB9XG4gICAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHsgYXJyYXlNZXJnZTogY29tYmluZU1lcmdlIH0pO1xuICAgICAgbmV3U2V0dGluZ3MuaW5jbHVkZSA9IG5ld1NldHRpbmdzLmluY2x1ZGU/LmZpbHRlcihcbiAgICAgICAgKGRpclBhdGg6IHN0cmluZykgPT5cbiAgICAgICAgICAhZGlyUGF0aC5pbmNsdWRlcygnQHR5cGVzJykgJiYgIWRpclBhdGguaW5jbHVkZXMoJ19fdGVzdHNfXy8nKSAmJiAhZGlyUGF0aC5pbmNsdWRlcygndGVzdHMvJylcbiAgICAgICk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICAgIHNvcnRLZXlzKG5ld1NldHRpbmdzKTtcbiAgICBuZXdTZXR0aW5ncy5pbmNsdWRlPy5zb3J0KCk7XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KG5ld1NldHRpbmdzKTtcbiAgICAvLyBEb24ndCB1c2Ugb2xkIGRlY29yYXRvclxuICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmV4cGVyaW1lbnRhbERlY29yYXRvcnM7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHNvcnRLZXlzIH0gZnJvbSAnLi4vdXRpbHMvb2JqZWN0VXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgZXhjbHVkZUZpbGVQYXR0ZXJucyA9IFtcbiAgJyoqLy5naXQvb2JqZWN0cy8qKicsXG4gICcqKi8uZ2l0L3N1YnRyZWUtY2FjaGUvKionLFxuICAnKiovbm9kZV9tb2R1bGVzLyoqJyxcbiAgJyoqL3RtcC8qKicsXG4gICcqKi90ZW1wLyoqJyxcbiAgJyoqL2Rpc3QvKionLFxuXTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlVnNjb2RlU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncycsIGFzeW5jICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcudnNjb2RlJywgJ3NldHRpbmdzLmpzb24nKTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgbGV0IHNldHRpbmdzID0gSlNPTi5wYXJzZShleGlzdGluZ0NvbnRlbnQpIGFzIG9iamVjdDtcbiAgICAgIGZvciAoY29uc3QgZXhjbHVkZUZpbGVQYXR0ZXJuIG9mIGV4Y2x1ZGVGaWxlUGF0dGVybnMpIHtcbiAgICAgICAgc2V0dGluZ3MgPSBtZXJnZS5hbGwoW3NldHRpbmdzLCBleGNsdWRlU2V0dGluZyhleGNsdWRlRmlsZVBhdHRlcm4pXSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc1BvZXRyeUxvY2spIHtcbiAgICAgICAgc2V0dGluZ3MgPSBtZXJnZS5hbGwoW3NldHRpbmdzLCBleGNsdWRlU2V0dGluZygnKiovLnZlbnYvKionKV0pO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgICBzZXR0aW5ncyA9IG1lcmdlLmFsbChbc2V0dGluZ3MsIGV4Y2x1ZGVTZXR0aW5nKCcqKi8ubmV4dC8qKicpXSk7XG4gICAgICB9XG4gICAgICAvLyBMTE3jgavjgojjgot2aWJlIGNvZGluZ+OBp+OBr+OAgeiHquWLleODleOCqeODvOODnuODg+ODiOOChOOCs+ODvOODieOCouOCr+OCt+ODp+ODs+OCkueEoeWKueWMluOBmeOCi+OBk+OBqOOBp1xuICAgICAgLy8g55Sf5oiQ44GV44KM44Gf44Kz44O844OJ44Gu5YWD44Gu5b2i5byP44KS57at5oyB44Gn44GN44KLXG4gICAgICBpZiAoJ2VkaXRvci5jb2RlQWN0aW9uc09uU2F2ZScgaW4gc2V0dGluZ3MpIHtcbiAgICAgICAgZGVsZXRlIHNldHRpbmdzWydlZGl0b3IuY29kZUFjdGlvbnNPblNhdmUnXTtcbiAgICAgIH1cbiAgICAgIGlmICgnZWRpdG9yLmZvcm1hdE9uU2F2ZScgaW4gc2V0dGluZ3MpIHtcbiAgICAgICAgZGVsZXRlIHNldHRpbmdzWydlZGl0b3IuZm9ybWF0T25TYXZlJ107XG4gICAgICB9XG4gICAgICBzb3J0S2V5cygoc2V0dGluZ3MgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID8/IHt9KTtcbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShzZXR0aW5ncywgdW5kZWZpbmVkLCAyKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZXhjbHVkZVNldHRpbmcoZXhjbHVkZUZpbGVQYXR0ZXJuOiBzdHJpbmcpOiBvYmplY3Qge1xuICByZXR1cm4ge1xuICAgICdmaWxlcy53YXRjaGVyRXhjbHVkZSc6IHtcbiAgICAgIFtleGNsdWRlRmlsZVBhdHRlcm5dOiB0cnVlLFxuICAgIH0sXG4gIH07XG59XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSB1bmljb3JuL25vLW51bGwgKi9cblxuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgeWFtbCBmcm9tICdqcy15YW1sJztcbmltcG9ydCBjbG9uZURlZXAgZnJvbSAnbG9kYXNoLmNsb25lZGVlcCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGNvbWJpbmVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBtb3ZlVG9Cb3R0b20sIHNvcnRLZXlzIH0gZnJvbSAnLi4vdXRpbHMvb2JqZWN0VXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW50ZXJmYWNlIFdvcmtmbG93IHtcbiAgbmFtZTogc3RyaW5nO1xuICBvbjogT247XG4gIGNvbmN1cnJlbmN5PzogQ29uY3VycmVuY3k7XG4gIGpvYnM6IHsgW2tleTogc3RyaW5nXTogSm9iIH07XG59XG5cbmludGVyZmFjZSBDb25jdXJyZW5jeSB7XG4gIGdyb3VwOiBzdHJpbmc7XG4gICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgT24ge1xuICBpc3N1ZXM/OiBUeXBlcztcbiAgcHVsbF9yZXF1ZXN0PzogUHVsbFJlcXVlc3Q7XG4gIHB1bGxfcmVxdWVzdF90YXJnZXQ/OiBUeXBlcztcbiAgcHVzaD86IFB1c2g7XG4gIHNjaGVkdWxlPzogU2NoZWR1bGVbXTtcbiAgd29ya2Zsb3dfZGlzcGF0Y2g/OiBudWxsO1xufVxuXG5pbnRlcmZhY2UgUHVsbFJlcXVlc3Qge1xuICAncGF0aHMtaWdub3JlJz86IHN0cmluZ1tdO1xuICB0eXBlcz86IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgUHVzaCB7XG4gIGJyYW5jaGVzOiBzdHJpbmdbXTtcbiAgJ3BhdGhzLWlnbm9yZSc/OiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIFNjaGVkdWxlIHtcbiAgY3Jvbjogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgVHlwZXMge1xuICB0eXBlczogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBKb2Ige1xuICB1c2VzOiBzdHJpbmc7XG4gIHNlY3JldHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgd2l0aD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG5jb25zdCB3b3JrZmxvd3MgPSB7XG4gIHRlc3Q6IHtcbiAgICBuYW1lOiAnVGVzdCcsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdDogbnVsbCxcbiAgICAgIHB1c2g6IHtcbiAgICAgICAgYnJhbmNoZXM6IFsnbWFpbicsICd3YmZ5J10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgLy8gY2YuIGh0dHBzOi8vZG9jcy5naXRodWIuY29tL2VuL2FjdGlvbnMvdXNpbmctam9icy91c2luZy1jb25jdXJyZW5jeSNleGFtcGxlLW9ubHktY2FuY2VsLWluLXByb2dyZXNzLWpvYnMtb3ItcnVucy1mb3ItdGhlLWN1cnJlbnQtd29ya2Zsb3dcbiAgICBjb25jdXJyZW5jeToge1xuICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19LSR7eyBnaXRodWIucmVmIH19JyxcbiAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiB0cnVlLFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgdGVzdDoge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3Rlc3QueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICByZWxlYXNlOiB7XG4gICAgbmFtZTogJ1JlbGVhc2UnLFxuICAgIG9uOiB7XG4gICAgICBwdXNoOiB7XG4gICAgICAgIGJyYW5jaGVzOiBbXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBjb25jdXJyZW5jeToge1xuICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19JyxcbiAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiBmYWxzZSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgIHJlbGVhc2U6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9yZWxlYXNlLnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgd2JmeToge1xuICAgIG5hbWU6ICdXaWxsYm9vc3RlcmlmeScsXG4gICAgb246IHtcbiAgICAgIHdvcmtmbG93X2Rpc3BhdGNoOiBudWxsLFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgd2JmeToge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3diZnkueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAnd2JmeS1tZXJnZSc6IHtcbiAgICBuYW1lOiAnTWVyZ2Ugd2JmeScsXG4gICAgb246IHtcbiAgICAgIHdvcmtmbG93X2Rpc3BhdGNoOiBudWxsLFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ3diZnktbWVyZ2UnOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3Mvd2JmeS1tZXJnZS55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gICdzZW1hbnRpYy1wcic6IHtcbiAgICBuYW1lOiAnTGludCBQUiB0aXRsZScsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdF90YXJnZXQ6IHtcbiAgICAgICAgdHlwZXM6IFsnb3BlbmVkJywgJ2VkaXRlZCcsICdzeW5jaHJvbml6ZSddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgICdzZW1hbnRpYy1wcic6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9zZW1hbnRpYy1wci55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIHN5bmM6IHtcbiAgICBuYW1lOiAnU3luYycsXG4gICAgb246IHt9LFxuICAgIGpvYnM6IHtcbiAgICAgIHN5bmM6IHsgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9zeW5jLnltbEBtYWluJyB9LFxuICAgIH0sXG4gIH0sXG4gICdub3RpZnktcmVhZHknOiB7XG4gICAgbmFtZTogJ05vdGlmeSByZWFkeScsXG4gICAgb246IHtcbiAgICAgIGlzc3Vlczoge1xuICAgICAgICB0eXBlczogWydsYWJlbGVkJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ25vdGlmeS1yZWFkeSc6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9ub3RpZnktcmVhZHkueW1sQG1haW4nLFxuICAgICAgICBzZWNyZXRzOiB7XG4gICAgICAgICAgRElTQ09SRF9XRUJIT09LX1VSTDogJyR7eyBzZWNyZXRzLkRJU0NPUkRfV0VCSE9PS19VUkxfRk9SX1JFQURZIH19JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ2Nsb3NlLWNvbW1lbnQnOiB7XG4gICAgbmFtZTogJ0FkZCBjbG9zZSBjb21tZW50JyxcbiAgICBvbjoge1xuICAgICAgcHVsbF9yZXF1ZXN0OiB7XG4gICAgICAgIHR5cGVzOiBbJ29wZW5lZCddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgICdjbG9zZS1jb21tZW50Jzoge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL2Nsb3NlLWNvbW1lbnQueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAnYWRkLWlzc3VlLXRvLXByb2plY3QnOiB7XG4gICAgbmFtZTogJ0FkZCBpc3N1ZSB0byBHaXRIdWIgcHJvamVjdCcsXG4gICAgb246IHtcbiAgICAgIGlzc3Vlczoge1xuICAgICAgICB0eXBlczogWydsYWJlbGVkJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ2FkZC1pc3N1ZS10by1wcm9qZWN0Jzoge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL2FkZC1pc3N1ZS10by1wcm9qZWN0LnltbEBtYWluJyxcbiAgICAgICAgc2VjcmV0czoge1xuICAgICAgICAgIEdIX1BST0pFQ1RfVVJMOiAnJHt7IHNlY3JldHMuR0hfUFJPSkVDVF9VUkwgfX0nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAnYWRkLXJlYWR5LWlzc3VlLXRvLXByb2plY3QnOiB7XG4gICAgbmFtZTogJ0FkZCByZWFkeSBpc3N1ZSB0byBHaXRIdWIgcHJvamVjdCcsXG4gICAgb246IHtcbiAgICAgIGlzc3Vlczoge1xuICAgICAgICB0eXBlczogWydsYWJlbGVkJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ2FkZC1yZWFkeS1pc3N1ZS10by1wcm9qZWN0Jzoge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL2FkZC1pc3N1ZS10by1wcm9qZWN0LnltbEBtYWluJyxcbiAgICAgICAgd2l0aDoge1xuICAgICAgICAgIGxhYmVsZWQ6ICdyZWFkeSA6cm9ja2V0OicsXG4gICAgICAgIH0sXG4gICAgICAgIHNlY3JldHM6IHtcbiAgICAgICAgICBHSF9QUk9KRUNUX1VSTDogJ2h0dHBzOi8vZ2l0aHViLmNvbS9vcmdzL1dpbGxCb29zdGVyTGFiL3Byb2plY3RzLzUnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxufSBhcyBjb25zdDtcblxudHlwZSBLbm93bktpbmQgPSBrZXlvZiB0eXBlb2Ygd29ya2Zsb3dzIHwgJ2RlcGxveSc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVdvcmtmbG93cyhyb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVXb3JrZmxvdycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB3b3JrZmxvd3NQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5naXRodWInLCAnd29ya2Zsb3dzJyk7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIod29ya2Zsb3dzUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICAvLyBSZW1vdmUgY29uZmlnIG9mIHNlbWFudGljIHB1bGwgcmVxdWVzdFxuICAgIGNvbnN0IHNlbWFudGljWW1sUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcuZ2l0aHViJywgJ3NlbWFudGljLnltbCcpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShzZW1hbnRpY1ltbFBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KSk7XG5cbiAgICBjb25zdCBlbnRyaWVzID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcih3b3JrZmxvd3NQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgY29uc3QgZmlsZU5hbWVTZXQgPSBuZXcgU2V0KFtcbiAgICAgICd0ZXN0LnltbCcsXG4gICAgICAnd2JmeS55bWwnLFxuICAgICAgJ3diZnktbWVyZ2UueW1sJyxcbiAgICAgICdzZW1hbnRpYy1wci55bWwnLFxuICAgICAgJ2Nsb3NlLWNvbW1lbnQueW1sJyxcbiAgICAgICdhZGQtaXNzdWUtdG8tcHJvamVjdC55bWwnLFxuICAgICAgLi4uZW50cmllcy5maWx0ZXIoKGRpcmVudCkgPT4gZGlyZW50LmlzRmlsZSgpICYmIGRpcmVudC5uYW1lLmVuZHNXaXRoKCcueW1sJykpLm1hcCgoZGlyZW50KSA9PiBkaXJlbnQubmFtZSksXG4gICAgXSk7XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLnNlbWFudGljUmVsZWFzZSkge1xuICAgICAgZmlsZU5hbWVTZXQuYWRkKCdyZWxlYXNlLnltbCcpO1xuICAgIH1cbiAgICBpZiAocm9vdENvbmZpZy5pc1B1YmxpY1JlcG8gfHwgcm9vdENvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJykpIHtcbiAgICAgIGZpbGVOYW1lU2V0LmFkZCgnYWRkLXJlYWR5LWlzc3VlLXRvLXByb2plY3QueW1sJyk7XG4gICAgICBmaWxlTmFtZVNldC5hZGQoJ25vdGlmeS1yZWFkeS55bWwnKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGZpbGVOYW1lIG9mIGZpbGVOYW1lU2V0KSB7XG4gICAgICAvLyDlrp/pmpvjga9Lbm93bktpbmTku6XlpJbjga7lgKTjgoLku6PlhaXjgZXjgozjgovjgZPjgajjgavms6jmhI9cbiAgICAgIGNvbnN0IGtpbmQgPSBwYXRoLmJhc2VuYW1lKGZpbGVOYW1lLCAnLnltbCcpIGFzIEtub3duS2luZDtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiB3cml0ZVdvcmtmbG93WWFtbChyb290Q29uZmlnLCB3b3JrZmxvd3NQYXRoLCBraW5kKSk7XG4gICAgfVxuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsICdhZGQtZm9jdXNlZC1pc3N1ZS10by1wcm9qZWN0LnltbCcpLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSlcbiAgICApO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVXb3JrZmxvd1lhbWwoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCB3b3JrZmxvd3NQYXRoOiBzdHJpbmcsIGtpbmQ6IEtub3duS2luZCk6IFByb21pc2U8dm9pZD4ge1xuICBsZXQgbmV3U2V0dGluZ3MgPSBjbG9uZURlZXAod29ya2Zsb3dzW2tpbmQgYXMga2V5b2YgdHlwZW9mIHdvcmtmbG93c10gPz8ge30pIGFzIFdvcmtmbG93O1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCBgJHtraW5kfS55bWxgKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgY29uc3Qgb2xkU2V0dGluZ3MgPSB5YW1sLmxvYWQob2xkQ29udGVudCkgYXMgV29ya2Zsb3c7XG4gICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7IGFycmF5TWVyZ2U6IGNvbWJpbmVNZXJnZSB9KSBhcyBXb3JrZmxvdztcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG5cbiAgaWYgKGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykpIHtcbiAgICBuZXdTZXR0aW5ncyA9IHtcbiAgICAgIC4uLm5ld1NldHRpbmdzLFxuICAgICAgY29uY3VycmVuY3k6IHtcbiAgICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19JyxcbiAgICAgICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IGZhbHNlLFxuICAgICAgfSxcbiAgICB9O1xuICAgIC8vIE1vdmUgam9icyB0byB0aGUgYm90dG9tXG4gICAgaWYgKG5ld1NldHRpbmdzLmpvYnMpIHtcbiAgICAgIG1vdmVUb0JvdHRvbShuZXdTZXR0aW5ncywgJ2pvYnMnKTtcbiAgICB9XG4gICAgaWYgKG5ld1NldHRpbmdzLm9uPy5wdXNoKSB7XG4gICAgICBuZXdTZXR0aW5ncy5vbi5wdXNoWydwYXRocy1pZ25vcmUnXSA9IFtcbiAgICAgICAgLi4ubmV3IFNldChbJyoqLm1kJywgJyoqL2RvY3MvKionLCAuLi4obmV3U2V0dGluZ3Mub24ucHVzaFsncGF0aHMtaWdub3JlJ10gPz8gW10pXSksXG4gICAgICBdO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3Qgam9iIG9mIE9iamVjdC52YWx1ZXMobmV3U2V0dGluZ3Muam9icykpIHtcbiAgICAvLyBJZ25vcmUgbm9uLXJldXNhYmxlIHdvcmtmbG93c1xuICAgIGlmICgham9iLnVzZXM/LmluY2x1ZGVzPy4oJy9yZXVzYWJsZS13b3JrZmxvd3MvJykpIHJldHVybjtcblxuICAgIG5vcm1hbGl6ZUpvYihjb25maWcsIGpvYiwga2luZCk7XG4gIH1cblxuICBzd2l0Y2ggKGtpbmQpIHtcbiAgICBjYXNlICdyZWxlYXNlJzoge1xuICAgICAgaWYgKG5ld1NldHRpbmdzLm9uPy5zY2hlZHVsZSkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3Mub24ucHVzaDtcbiAgICAgIH0gZWxzZSBpZiAobmV3U2V0dGluZ3Mub24/LnB1c2ggJiYgY29uZmlnLnJlbGVhc2UuYnJhbmNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBuZXdTZXR0aW5ncy5vbi5wdXNoLmJyYW5jaGVzID0gY29uZmlnLnJlbGVhc2UuYnJhbmNoZXM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBEb24ndCB1c2UgcmVsZWFzZS55bWwgaWYgcmVsZWFzZSBicmFuY2ggaXMgbm90IHNwZWNpZmllZFxuICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgJ3JlbGVhc2UueW1sJyksIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlICd0ZXN0Jzoge1xuICAgICAgLy8gRG9uJ3QgdXNlIGBwYXRocy1pZ25vcmVgIGZvciB0ZXN0IGJlY2F1c2UgR2l0SHViJ3MgQnJhbmNoIFByb3RlY3Rpb24gYW5kIFJ1bGVzZXRzIHJlcXVpcmUgam9iIHJ1bm5pbmcuXG4gICAgICBkZWxldGUgbmV3U2V0dGluZ3Mub24/LnB1bGxfcmVxdWVzdD8uWydwYXRocy1pZ25vcmUnXTtcbiAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5vbj8ucHVzaD8uWydwYXRocy1pZ25vcmUnXTtcbiAgICAgIGlmIChuZXdTZXR0aW5ncy5vbj8ucHVzaCkge1xuICAgICAgICBuZXdTZXR0aW5ncy5vbi5wdXNoLmJyYW5jaGVzID0gbmV3U2V0dGluZ3Mub24ucHVzaC5icmFuY2hlcy5maWx0ZXIoKGJyYW5jaCkgPT4gYnJhbmNoICE9PSAncmVub3ZhdGUvKionKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlICd3YmZ5Jzoge1xuICAgICAgaWYgKG5ld1NldHRpbmdzLm9uKSBzZXRTY2hlZHVsZShuZXdTZXR0aW5ncywgMjAsIDI0KTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlICd3YmZ5LW1lcmdlJzoge1xuICAgICAgc2V0U2NoZWR1bGUobmV3U2V0dGluZ3MsIDEsIDQpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIC8vIE5vIGRlZmF1bHRcbiAgfVxuICBtaWdyYXRlV29ya2Zsb3cobmV3U2V0dGluZ3MpO1xuICBhd2FpdCB3cml0ZVlhbWwobmV3U2V0dGluZ3MsIGZpbGVQYXRoKTtcblxuICBpZiAoa2luZCA9PT0gJ3JlbGVhc2UnKSB7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsICdzZW1hbnRpYy1yZWxlYXNlLnltbCcpLCB7IGZvcmNlOiB0cnVlIH0pO1xuICB9IGVsc2UgaWYgKGtpbmQgPT09ICdzeW5jJykge1xuICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAnc3luYy1pbml0LnltbCcpLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgIGlmICghbmV3U2V0dGluZ3Muam9icy5zeW5jIHx8ICFuZXdTZXR0aW5ncy5qb2JzLnN5bmMud2l0aCkgcmV0dXJuO1xuXG4gICAgLy8gR2VuZXJhdGUgc3luYy1mb3JjZS55bWwgYmFzZWQgb24gc3luYy55bWwgaWYgaXQgZXhpc3RzLlxuICAgIG5ld1NldHRpbmdzLmpvYnNbJ3N5bmMtZm9yY2UnXSA9IG5ld1NldHRpbmdzLmpvYnMuc3luYztcbiAgICBjb25zdCBwYXJhbXMgPSBuZXdTZXR0aW5ncy5qb2JzLnN5bmMud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3Q7XG4gICAgaWYgKHR5cGVvZiBwYXJhbXMgIT09ICdzdHJpbmcnKSByZXR1cm47XG5cbiAgICBuZXdTZXR0aW5ncy5qb2JzLnN5bmMud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3QgPSBgLS1mb3JjZSAke3BhcmFtc31gO1xuICAgIG5ld1NldHRpbmdzLm5hbWUgPSAnRm9yY2UgdG8gU3luYyc7XG4gICAgbmV3U2V0dGluZ3Mub24gPSB7IHdvcmtmbG93X2Rpc3BhdGNoOiBudWxsIH07XG4gICAgZGVsZXRlIG5ld1NldHRpbmdzLmpvYnMuc3luYztcbiAgICBhd2FpdCB3cml0ZVlhbWwobmV3U2V0dGluZ3MsIHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAnc3luYy1mb3JjZS55bWwnKSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplSm9iKGNvbmZpZzogUGFja2FnZUNvbmZpZywgam9iOiBKb2IsIGtpbmQ6IEtub3duS2luZCk6IHZvaWQge1xuICBqb2Iud2l0aCB8fD0ge307XG4gIGpvYi5zZWNyZXRzIHx8PSB7fTtcblxuICBpZiAoXG4gICAga2luZCA9PT0gJ3Rlc3QnIHx8XG4gICAga2luZCA9PT0gJ3JlbGVhc2UnIHx8XG4gICAga2luZCA9PT0gJ3diZnknIHx8XG4gICAga2luZCA9PT0gJ3diZnktbWVyZ2UnIHx8XG4gICAga2luZCA9PT0gJ2FkZC1pc3N1ZS10by1wcm9qZWN0JyB8fFxuICAgIGtpbmQgPT09ICdhZGQtcmVhZHktaXNzdWUtdG8tcHJvamVjdCdcbiAgKSB7XG4gICAgam9iLnNlY3JldHNbJ0dIX1RPS0VOJ10gPSBjb25maWcuaXNQdWJsaWNSZXBvID8gJyR7eyBzZWNyZXRzLlBVQkxJQ19HSF9CT1RfUEFUIH19JyA6ICcke3sgc2VjcmV0cy5HSF9CT1RfUEFUIH19JztcbiAgfVxuICBpZiAoY29uZmlnLnJlbGVhc2UubnBtICYmIChraW5kID09PSAncmVsZWFzZScgfHwga2luZCA9PT0gJ3Rlc3QnKSkge1xuICAgIGpvYi5zZWNyZXRzWydOUE1fVE9LRU4nXSA9ICcke3sgc2VjcmV0cy5OUE1fVE9LRU4gfX0nO1xuICB9XG4gIGlmIChqb2Iuc2VjcmV0c1snRklSRUJBU0VfVE9LRU4nXSkge1xuICAgIGpvYi5zZWNyZXRzWydHQ1BfU0FfS0VZX0pTT05fRk9SX0ZJUkVCQVNFJ10gPSAnJHt7IHNlY3JldHMuR0NQX1NBX0tFWV9KU09OX0ZPUl9GSVJFQkFTRSB9fSc7XG4gICAgZGVsZXRlIGpvYi5zZWNyZXRzWydGSVJFQkFTRV9UT0tFTiddO1xuICB9XG4gIGlmIChcbiAgICAoam9iLnNlY3JldHNbJ0RJU0NPUkRfV0VCSE9PS19VUkwnXSAmJiAoa2luZCA9PT0gJ3JlbGVhc2UnIHx8IGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykpKSB8fFxuICAgIChqb2Iud2l0aC5zZXJ2ZXJfdXJsICYmIGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykpXG4gICkge1xuICAgIGpvYi5zZWNyZXRzWydESVNDT1JEX1dFQkhPT0tfVVJMJ10gPSAnJHt7IHNlY3JldHMuRElTQ09SRF9XRUJIT09LX1VSTF9GT1JfUkVMRUFTRSB9fSc7XG4gIH1cblxuICBpZiAoa2luZCA9PT0gJ3N5bmMnKSB7XG4gICAgY29uc3QgcGFyYW1zID0gam9iLndpdGg/LnN5bmNfcGFyYW1zX3dpdGhvdXRfZGVzdDtcbiAgICBpZiAodHlwZW9mIHBhcmFtcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGpvYi53aXRoLnN5bmNfcGFyYW1zX3dpdGhvdXRfZGVzdCA9IHBhcmFtcy5yZXBsYWNlKCdzeW5jICcsICcnKTtcbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3Rlci8nKSkge1xuICAgIGpvYi51c2VzID0gam9iLnVzZXMucmVwbGFjZSgnV2lsbEJvb3N0ZXJMYWIvJywgJ1dpbGxCb29zdGVyLycpO1xuICB9IGVsc2UgaWYgKGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJykpIHtcbiAgICBqb2IudXNlcyA9IGpvYi51c2VzLnJlcGxhY2UoJ1dpbGxCb29zdGVyLycsICdXaWxsQm9vc3RlckxhYi8nKTtcbiAgfVxuXG4gIC8vIFJlbW92ZSByZWR1bmRhbnQgcGFyYW1ldGVyc1xuICBpZiAoam9iLndpdGhbJ2RvdF9lbnZfcGF0aCddID09PSAnLmVudicpIHtcbiAgICBkZWxldGUgam9iLndpdGhbJ2RvdF9lbnZfcGF0aCddO1xuICB9XG4gIC8vIFJlbW92ZSBkZXByZWNhdGVkIHBhcmFtZXRlcnNcbiAgbWlncmF0ZUpvYihqb2IpO1xuXG4gIC8vIERvbid0IHVzZSBgZmx5IGRlcGxveSAtLWpzb25gIHNpbmNlIGl0IGNhdXNlcyBhbiBlcnJvclxuICBpZiAoa2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSAmJiBqb2Iuc2VjcmV0c1snRkxZX0FQSV9UT0tFTiddICYmIHR5cGVvZiBqb2Iud2l0aFsnZGVwbG95X2NvbW1hbmQnXSA9PT0gJ3N0cmluZycpIHtcbiAgICBqb2Iud2l0aFsnZGVwbG95X2NvbW1hbmQnXSA9IGpvYi53aXRoWydkZXBsb3lfY29tbWFuZCddLnJlcGxhY2UoL1xccystLWpzb24vLCAnJyk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNEb2NrZXJmaWxlKSB7XG4gICAgaWYgKGpvYi53aXRoWydjaV9zaXplJ10gIT09ICdleHRyYS1sYXJnZScgJiYgKGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykgfHwga2luZC5zdGFydHNXaXRoKCd0ZXN0JykpKSB7XG4gICAgICBqb2Iud2l0aFsnY2lfc2l6ZSddID0gJ2xhcmdlJztcbiAgICB9XG4gICAgaWYgKGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykpIHtcbiAgICAgIGpvYi53aXRoWydjcHVfYXJjaCddID0gJ1g2NCc7XG4gICAgfVxuICB9XG4gIC8vIEJlY2F1c2UgZ2l0aHViLmV2ZW50LnJlcG9zaXRvcnkucHJpdmF0ZSBpcyBhbHdheXMgdHJ1ZSBpZiBqb2IgaXMgc2NoZWR1bGVkXG4gIGlmIChraW5kID09PSAncmVsZWFzZScgfHwga2luZCA9PT0gJ3Rlc3QnIHx8IGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykpIHtcbiAgICBpZiAoY29uZmlnLmlzUHVibGljUmVwbykge1xuICAgICAgam9iLndpdGhbJ2dpdGh1Yl9ob3N0ZWRfcnVubmVyJ10gPSB0cnVlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBkZWxldGUgam9iLndpdGhbJ2dpdGh1Yl9ob3N0ZWRfcnVubmVyJ107XG4gIH1cblxuICBpZiAoT2JqZWN0LmtleXMoam9iLndpdGgpLmxlbmd0aCA+IDApIHtcbiAgICBzb3J0S2V5cyhqb2Iud2l0aCk7XG4gIH0gZWxzZSB7XG4gICAgZGVsZXRlIGpvYi53aXRoO1xuICB9XG4gIGlmIChPYmplY3Qua2V5cyhqb2Iuc2VjcmV0cykubGVuZ3RoID4gMCkge1xuICAgIC8vIE1vdmUgc2VjcmV0cyBwcm9wIGFmdGVyIHdpdGggcHJvcFxuICAgIGNvbnN0IG5ld1NlY3JldHMgPSBzb3J0S2V5cyhqb2Iuc2VjcmV0cyk7XG4gICAgZGVsZXRlIGpvYi5zZWNyZXRzO1xuICAgIGpvYi5zZWNyZXRzID0gbmV3U2VjcmV0cztcbiAgfSBlbHNlIHtcbiAgICBkZWxldGUgam9iLnNlY3JldHM7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2V0U2NoZWR1bGUobmV3U2V0dGluZ3M6IFdvcmtmbG93LCBpbmNsdXNpdmVNaW5Ib3VySnN0OiBudW1iZXIsIGV4Y2x1c2l2ZU1heEhvdXJKc3Q6IG51bWJlcik6IHZvaWQge1xuICBjb25zdCBbbWludXRlVXRjLCBob3VyVXRjXSA9ICgobmV3U2V0dGluZ3Mub24uc2NoZWR1bGU/LlswXT8uY3JvbiBhcyBzdHJpbmcpIHx8ICcnKS5zcGxpdCgnICcpLm1hcChOdW1iZXIpO1xuICBpZiAobWludXRlVXRjICE9PSAwICYmIE51bWJlci5pc0ludGVnZXIoaG91clV0YykpIHtcbiAgICBjb25zdCBob3VySnN0ID0gKGhvdXJVdGMgKyA5KSAlIDI0O1xuICAgIGNvbnN0IGluUmFuZ2UgPVxuICAgICAgaW5jbHVzaXZlTWluSG91ckpzdCA8IGV4Y2x1c2l2ZU1heEhvdXJKc3RcbiAgICAgICAgPyBpbmNsdXNpdmVNaW5Ib3VySnN0IDw9IGhvdXJKc3QgJiYgaG91ckpzdCA8IGV4Y2x1c2l2ZU1heEhvdXJKc3RcbiAgICAgICAgOiBpbmNsdXNpdmVNaW5Ib3VySnN0IDw9IGhvdXJKc3QgfHwgaG91ckpzdCA8IGV4Y2x1c2l2ZU1heEhvdXJKc3Q7XG4gICAgaWYgKGluUmFuZ2UpIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IG1pbkpzdCA9IDEgKyBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiA1OSk7XG4gIGNvbnN0IGhvdXJKc3QgPSBpbmNsdXNpdmVNaW5Ib3VySnN0ICsgTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKGV4Y2x1c2l2ZU1heEhvdXJKc3QgLSBpbmNsdXNpdmVNaW5Ib3VySnN0KSk7XG4gIGNvbnN0IGNyb24gPSBgJHttaW5Kc3R9ICR7KGhvdXJKc3QgLSA5ICsgMjQpICUgMjR9ICogKiAqYDtcbiAgbmV3U2V0dGluZ3Mub24uc2NoZWR1bGUgPSBbeyBjcm9uIH1dO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZVlhbWwobmV3U2V0dGluZ3M6IFdvcmtmbG93LCBmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHlhbWxUZXh0ID0geWFtbC5kdW1wKG5ld1NldHRpbmdzLCB7IGxpbmVXaWR0aDogLTEsIG5vQ29tcGF0TW9kZTogdHJ1ZSwgc3R5bGVzOiB7ICchIW51bGwnOiAnZW1wdHknIH0gfSk7XG4gIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShmaWxlUGF0aCwgeWFtbFRleHQpO1xufVxuXG5mdW5jdGlvbiBtaWdyYXRlV29ya2Zsb3cobmV3U2V0dGluZ3M6IFdvcmtmbG93KTogdm9pZCB7XG4gIC8vIFRPRE86IFJlbW92ZSB0aGVtIGFmdGVyIDIwMjMtMDMtMzFcbiAgZGVsZXRlIG5ld1NldHRpbmdzLmpvYnNbJ2FkZC10by1wcm9qZWN0J107XG59XG5cbmZ1bmN0aW9uIG1pZ3JhdGVKb2Ioam9iOiBKb2IpOiB2b2lkIHtcbiAgLy8gVE9ETzogUmVtb3ZlIHRoZW0gYWZ0ZXIgMjAyMy0wMy0zMVxuICBpZiAoIWpvYi53aXRoKSByZXR1cm47XG4gIGRlbGV0ZSBqb2Iud2l0aFsnbm9uX3NlbGZfaG9zdGVkJ107XG4gIGRlbGV0ZSBqb2Iud2l0aFsnbm90aWZ5X2Rpc2NvcmQnXTtcbiAgZGVsZXRlIGpvYi53aXRoWydyZXF1aXJlX2ZseSddO1xuICBkZWxldGUgam9iLndpdGhbJ3JlcXVpcmVfZ2Nsb3VkJ107XG4gIGRlbGV0ZSBqb2Iud2l0aFsnY3B1X2FyY2gnXTtcbiAgZGVsZXRlIGpvYi53aXRoWydsYWJlbCddO1xuICBkZWxldGUgam9iLndpdGhbJ2xhYmVsT3BlcmF0b3InXTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgQ29uZmlndXJhdGlvblZhbHVlTWFwIH0gZnJvbSAnQHlhcm5wa2cvY29yZSc7XG5pbXBvcnQgeWFtbCBmcm9tICdqcy15YW1sJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMsIHNwYXduU3luY1dpdGhTdHJpbmdSZXN1bHQgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuXG5pbnRlcmZhY2UgU2V0dGluZ3MgZXh0ZW5kcyBQYXJ0aWFsPENvbmZpZ3VyYXRpb25WYWx1ZU1hcD4ge1xuICBkZWZhdWx0U2VtdmVyUmFuZ2VQcmVmaXg6IHN0cmluZztcbiAgbm1Nb2RlOiBzdHJpbmc7XG4gIG5vZGVMaW5rZXI6IHN0cmluZztcbiAgcGx1Z2lucz86IFBsdWdpbltdO1xufVxuXG5pbnRlcmZhY2UgUGx1Z2luIHtcbiAgY2hlY2tzdW06IHN0cmluZztcbiAgcGF0aDogc3RyaW5nO1xuICBzcGVjOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVlhcm5yY1ltbChjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVlhcm5yY1ltbCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB5YXJucmNZbWxQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm5yYy55bWwnKTtcbiAgICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oeWFybnJjWW1sUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgICAgZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm4nKSwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgICApO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICAgIGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3lhcm4ubG9jaycpLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSlcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudFZlcnNpb24gPSBzcGF3blN5bmNXaXRoU3RyaW5nUmVzdWx0KCd5YXJuJywgWyctLXZlcnNpb24nXSwgY29uZmlnLmRpclBhdGgpO1xuICAgIGNvbnN0IGxhdGVzdFZlcnNpb24gPSBnZXRMYXRlc3RWZXJzaW9uKCdAeWFybnBrZy9jbGknLCBjb25maWcuZGlyUGF0aCk7XG4gICAgaWYgKGdldE1ham9yTnVtYmVyKGN1cnJlbnRWZXJzaW9uKSA8PSBnZXRNYWpvck51bWJlcihsYXRlc3RWZXJzaW9uKSAmJiBjdXJyZW50VmVyc2lvbiAhPT0gbGF0ZXN0VmVyc2lvbikge1xuICAgICAgc3Bhd25TeW5jKCd5YXJuJywgWydzZXQnLCAndmVyc2lvbicsIGxhdGVzdFZlcnNpb25dLCBjb25maWcuZGlyUGF0aCwgMSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVsZWFzZXNQYXRoID0gcGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm4nLCAncmVsZWFzZXMnKTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihyZWxlYXNlc1BhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGZvciAoY29uc3QgZmlsZSBvZiBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKHJlbGVhc2VzUGF0aCkpIHtcbiAgICAgIGlmIChmaWxlLnN0YXJ0c1dpdGgoJ3lhcm4tJykgJiYgIWZpbGUuc3RhcnRzV2l0aChgeWFybi0ke2xhdGVzdFZlcnNpb259LmApKSB7XG4gICAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4ocmVsZWFzZXNQYXRoLCBmaWxlKSkpO1xuICAgICAgICBjb25zb2xlLmxvZygnUmVtb3ZlZCcsIHBhdGguam9pbihyZWxlYXNlc1BhdGgsIGZpbGUpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB5YXJucmNQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm5yYycpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybSh5YXJucmNQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKTtcblxuICAgIGNvbnN0IHNldHRpbmdzID0geWFtbC5sb2FkKGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHlhcm5yY1ltbFBhdGgsICd1dGY4JykpIGFzIFNldHRpbmdzO1xuICAgIHNldHRpbmdzLmRlZmF1bHRTZW12ZXJSYW5nZVByZWZpeCA9ICcnO1xuICAgIHNldHRpbmdzLm5vZGVMaW5rZXIgPSAnbm9kZS1tb2R1bGVzJztcbiAgICBzZXR0aW5ncy5ubU1vZGUgPSAnaGFyZGxpbmtzLWdsb2JhbCc7XG4gICAgZGVsZXRlIHNldHRpbmdzLmNvbXByZXNzaW9uTGV2ZWw7XG4gICAgaWYgKHNldHRpbmdzLmluamVjdEVudmlyb25tZW50RmlsZXM/Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgZGVsZXRlIHNldHRpbmdzLmluamVjdEVudmlyb25tZW50RmlsZXM7XG4gICAgfVxuICAgIC8vIGNmLiBodHRwczovL2dpdGh1Yi5jb20veWFybnBrZy9iZXJyeS9wdWxsLzQ2OThcbiAgICBzZXR0aW5ncy5lbmFibGVHbG9iYWxDYWNoZSA9IHRydWU7XG4gICAgY29uc3Qgb3JpZ2luYWxMZW5ndGggPSBzZXR0aW5ncy5wbHVnaW5zPy5sZW5ndGggPz8gMDtcbiAgICBzZXR0aW5ncy5wbHVnaW5zID0gc2V0dGluZ3MucGx1Z2lucz8uZmlsdGVyKChwKSA9PiBwLnBhdGggIT09ICcueWFybi9wbHVnaW5zL3VuZGVmaW5lZC5janMnKSA/PyBbXTtcbiAgICBpZiAoc2V0dGluZ3MucGx1Z2lucy5sZW5ndGggIT09IG9yaWdpbmFsTGVuZ3RoKSB7XG4gICAgICBjb25zdCBwbHVnaW5QYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm5yYycsICd1bmRlZmluZWQuY2pzJyk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGx1Z2luUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgfVxuICAgIGlmIChzZXR0aW5ncy5wbHVnaW5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZGVsZXRlIHNldHRpbmdzLnBsdWdpbnM7XG4gICAgfVxuICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZSh5YXJucmNZbWxQYXRoLCB5YW1sLmR1bXAoc2V0dGluZ3MsIHsgbGluZVdpZHRoOiAtMSB9KSk7XG5cbiAgICBzcGF3blN5bmMoJ3lhcm4nLCBbJ2RseCcsICd5YXJuLXBsdWdpbi1hdXRvLWluc3RhbGwnXSwgY29uZmlnLmRpclBhdGgpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldExhdGVzdFZlcnNpb24ocGFja2FnZU5hbWU6IHN0cmluZywgZGlyUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgdmVyc2lvbnNKc29uID0gc3Bhd25TeW5jV2l0aFN0cmluZ1Jlc3VsdCgnbnBtJywgWydzaG93JywgcGFja2FnZU5hbWUsICd2ZXJzaW9ucycsICctLWpzb24nXSwgZGlyUGF0aCk7XG4gIGNvbnN0IHZlcnNpb25zID0gSlNPTi5wYXJzZSh2ZXJzaW9uc0pzb24pIGFzIHN0cmluZ1tdO1xuICByZXR1cm4gdmVyc2lvbnMuYXQoLTEpIGFzIHN0cmluZztcbn1cbmZ1bmN0aW9uIGdldE1ham9yTnVtYmVyKHZlcnNpb246IHN0cmluZyk6IG51bWJlciB7XG4gIGNvbnN0IFttYWpvcl0gPSB2ZXJzaW9uLnNwbGl0KCcuJyk7XG4gIHJldHVybiBOdW1iZXIobWFqb3IpO1xufVxuIiwiaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2l0SHViVXRpbCwgaGFzR2l0SHViVG9rZW4sIG9jdG9raXQgfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwTGFiZWxzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ3NldHVwTGFiZWxzJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghaGFzR2l0SHViVG9rZW4pIHJldHVybjtcblxuICAgIGNvbnN0IFtvd25lciwgcmVwb10gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUoY29uZmlnLnJlcG9zaXRvcnkgPz8gJycpO1xuICAgIGlmICghb3duZXIgfHwgIXJlcG8pIHJldHVybjtcbiAgICBpZiAob3duZXIgIT09ICdXaWxsQm9vc3RlcicgJiYgb3duZXIgIT09ICdXaWxsQm9vc3RlckxhYicpIHJldHVybjtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAnZDE6IHgtZWFzeSA6aGVkZ2Vob2c6JywgJ0VERTlGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ2QyOiBlYXN5IDpyYWJiaXQyOicsICdEREQ2RkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdkMzogbWVkaXVtIDpveDonLCAnQzRCNUZEJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAnZDQ6IGhhcmQgOnNxdWlkOicsICdBNzhCRkEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdkNTogeC1oYXJkIDp3aGFsZTI6JywgJzhCNUNGNicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3AxOiBjcml0aWNhbCA6ZmlyZTo6ZmlyZTo6ZmlyZTonLCAnRUY0NDQ0Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAncDI6IHVyZ2VudCA6ZmlyZTo6ZmlyZTonLCAnRjg3MTcxJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAncDM6IGltcG9ydGFudCA6ZmlyZTonLCAnRkNBNUE1Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAncDQ6IG5pY2UgdG8gaGF2ZSA6ZHJvcGxldDonLCAnRkVDQUNBJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAncjogYmxpdHonLCAnNTMwMGJjJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAncjogZmlyZWJhc2UnLCAnZmZjYTI4Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAncjogcHJpc21hJywgJzBjMzQ0YicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3I6IHJlYWN0JywgJzYxZGFmYicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3I6IHN2ZWx0ZScsICdmZjNlMDAnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdyOiBzZW1hbnRpYy1yZWxlYXNlJywgJzQ5NDk0OScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3JlYWR5IDpyb2NrZXQ6JywgJzIyQzU1RScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3JldmlldyByZXF1ZXN0ZWQgOm1hZzonLCAnRkJDQTA0Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAncmVsZWFzZWQgOmJvb2ttYXJrOicsICc2MzY2RjEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdzOiAwLjVoIDpjbG9jazEyMzA6JywgJ0YzRjRGNicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3M6IDFoIDpjbG9jazE6JywgJ0U1RTdFQicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3M6IDJoIDpjbG9jazI6JywgJ0QxRDVEQicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3M6IDNoIDpjbG9jazM6JywgJzlDQTNBRicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3M6IDVoIDpjbG9jazU6JywgJzZCNzI4MCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3M6IDhoIDpjbG9jazg6JywgJzRCNTU2MycpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3M6IDEzaCA6Y2xvY2sxOicsICczNzQxNTEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICd0OiBidWlsZCA6aGFtbWVyOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICd0OiBjaG9yZSA6YnJvb206JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3Q6IGNpIDpjb25zdHJ1Y3Rpb25fd29ya2VyOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICd0OiBkb2NzIDptZW1vOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICd0OiBmZWF0IDpzcGFya2xlczonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAndDogZml4IDpidWc6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3Q6IHBlcmYgOnphcDonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAndDogcmVmYWN0b3IgOnJlY3ljbGU6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3Q6IHN0eWxlIDpsaXBzdGljazonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAndDogdGVzdCA6dGVzdF90dWJlOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdwcm9qZWN0JywgJzI0MjkyRicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ2ZvY3VzZWQgOmRhcnQ6JywgJzIyQzU1RScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ2FpLXByIDpyb2JvdDonLCAnMDBCNEQ4Jyk7XG5cbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG93bmVyLCByZXBvLCAnYnVnJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvd25lciwgcmVwbywgJ2RvY3VtZW50YXRpb24nKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG93bmVyLCByZXBvLCAnZHVwbGljYXRlJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvd25lciwgcmVwbywgJ2VuaGFuY2VtZW50Jyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvd25lciwgcmVwbywgJ2dvb2QgZmlyc3QgaXNzdWUnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG93bmVyLCByZXBvLCAnaGVscCB3YW50ZWQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG93bmVyLCByZXBvLCAnaW52YWxpZCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob3duZXIsIHJlcG8sICdxdWVzdGlvbicpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob3duZXIsIHJlcG8sICd3b250Zml4Jyk7XG5cbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG93bmVyLCByZXBvLCAncmVhZHknKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG93bmVyLCByZXBvLCAncmV2aWV3IHJlcXVlc3RlZCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob3duZXIsIHJlcG8sICdyZWxlYXNlZCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob3duZXIsIHJlcG8sICdzZW1hbnRpYy1yZWxlYXNlJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvd25lciwgcmVwbywgJ2xsbS1wciA6cm9ib3Q6Jyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybignU2tpcCBzZXR1cExhYmVscyBkdWUgdG86JywgKGVycm9yIGFzIEVycm9yKT8uc3RhY2sgPz8gZXJyb3IpO1xuICAgIH1cbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNldHVwTGFiZWwob3duZXI6IHN0cmluZywgcmVwbzogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIGNvbG9yOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ1BPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVscycsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIG5hbWUsXG4gICAgICBjb2xvcixcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vbGFiZWxzL3tuYW1lfScsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIG5hbWUsXG4gICAgICBjb2xvcixcbiAgICB9KTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBkZWxldGVMYWJlbChvd25lcjogc3RyaW5nLCByZXBvOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHMve25hbWV9Jywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgbmFtZSxcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBpbXBvcnQteC9uby1uYW1lZC1hcy1kZWZhdWx0LW1lbWJlciAqL1xuXG5pbXBvcnQgZG90ZW52IGZyb20gJ2RvdGVudic7XG5pbXBvcnQgc29kaXVtIGZyb20gJ2xpYnNvZGl1bS13cmFwcGVycyc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdpdEh1YlV0aWwsIGhhc0dpdEh1YlRva2VuLCBvY3Rva2l0IH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmNvbnN0IGRlcHJlY2F0ZWRTZWNyZXROYW1lcyA9IFsnUkVBRFlfRElTQ09SRF9XRUJIT09LX1VSTCddO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0dXBTZWNyZXRzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ3NldHVwU2VjcmV0cycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWhhc0dpdEh1YlRva2VuIHx8ICFvcHRpb25zLmRvZXNVcGxvYWRFbnZWYXJzKSByZXR1cm47XG5cbiAgICBjb25zdCBbb3duZXIsIHJlcG9dID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGNvbmZpZy5yZXBvc2l0b3J5ID8/ICcnKTtcbiAgICBpZiAoIW93bmVyIHx8ICFyZXBvIHx8IG93bmVyICE9PSAnV2lsbEJvb3N0ZXJMYWInKSByZXR1cm47XG5cbiAgICBjb25zdCBwYXJzZWQgPSBkb3RlbnYuY29uZmlnKCkucGFyc2VkIHx8IHt9O1xuICAgIGlmIChPYmplY3Qua2V5cyhwYXJzZWQpLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgdHJ5IHtcbiAgICAgIGZvciAoY29uc3Qgc2VjcmV0TmFtZSBvZiBkZXByZWNhdGVkU2VjcmV0TmFtZXMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ0RFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9zZWNyZXRzL3tzZWNyZXRfbmFtZX0nLCB7XG4gICAgICAgICAgICBvd25lcixcbiAgICAgICAgICAgIHJlcG8sXG4gICAgICAgICAgICBzZWNyZXRfbmFtZTogc2VjcmV0TmFtZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gZG8gbm90aGluZ1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvc2VjcmV0cy9wdWJsaWMta2V5Jywge1xuICAgICAgICBvd25lcixcbiAgICAgICAgcmVwbyxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgeyBrZXksIGtleV9pZDoga2V5SWQgfSA9IHJlc3BvbnNlLmRhdGE7XG5cbiAgICAgIGF3YWl0IHNvZGl1bS5yZWFkeTtcblxuICAgICAgZm9yIChjb25zdCBbbmFtZSwgc2VjcmV0XSBvZiBPYmplY3QuZW50cmllcyhwYXJzZWQpKSB7XG4gICAgICAgIGlmIChjb25maWcuaXNQdWJsaWNSZXBvICYmIG5hbWUgPT09ICdHSF9CT1RfUEFUJykgY29udGludWU7XG4gICAgICAgIGlmICghY29uZmlnLmlzUHVibGljUmVwbyAmJiBuYW1lID09PSAnUFVCTElDX0dIX0JPVF9QQVQnKSBjb250aW51ZTtcblxuICAgICAgICAvLyBDb252ZXJ0IFNlY3JldCAmIEJhc2U2NCBrZXkgdG8gVWludDhBcnJheS5cbiAgICAgICAgY29uc3QgcmF3S2V5ID0gc29kaXVtLmZyb21fYmFzZTY0KGtleSwgc29kaXVtLmJhc2U2NF92YXJpYW50cy5PUklHSU5BTCk7XG4gICAgICAgIGNvbnN0IHJhd1NlYyA9IHNvZGl1bS5mcm9tX3N0cmluZyhzZWNyZXQpO1xuXG4gICAgICAgIC8vIEVuY3J5cHQgdGhlIHNlY3JldCB1c2luZyBMaWJTb2RpdW1cbiAgICAgICAgY29uc3QgZW5jQnl0ZXMgPSBzb2RpdW0uY3J5cHRvX2JveF9zZWFsKHJhd1NlYywgcmF3S2V5KTtcblxuICAgICAgICAvLyBDb252ZXJ0IGVuY3J5cHRlZCBVaW50OEFycmF5IHRvIEJhc2U2NFxuICAgICAgICBjb25zdCBlbmNCYXNlNjQgPSBzb2RpdW0udG9fYmFzZTY0KGVuY0J5dGVzLCBzb2RpdW0uYmFzZTY0X3ZhcmlhbnRzLk9SSUdJTkFMKTtcblxuICAgICAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ1BVVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9zZWNyZXRzL3tzZWNyZXRfbmFtZX0nLCB7XG4gICAgICAgICAgb3duZXIsXG4gICAgICAgICAgcmVwbyxcbiAgICAgICAgICBzZWNyZXRfbmFtZTogbmFtZSxcbiAgICAgICAgICBlbmNyeXB0ZWRfdmFsdWU6IGVuY0Jhc2U2NCxcbiAgICAgICAgICBrZXlfaWQ6IGtleUlkLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKCdTa2lwIHNldHVwU2VjcmV0cyBkdWUgdG86JywgKGVycm9yIGFzIEVycm9yKT8uc3RhY2sgPz8gZXJyb3IpO1xuICAgIH1cbiAgfSk7XG59XG4iLCJpbXBvcnQgeyB3aXRoUmV0cnkgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYic7XG5cbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2l0SHViVXRpbCwgb2N0b2tpdCB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0dXBHaXRIdWJTZXR0aW5ncyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgW293bmVyLCByZXBvXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShjb25maWcucmVwb3NpdG9yeSA/PyAnJyk7XG4gIGlmICghb3duZXIgfHwgIXJlcG8pIHJldHVybjtcbiAgaWYgKG93bmVyICE9PSAnV2lsbEJvb3N0ZXInICYmIG93bmVyICE9PSAnV2lsbEJvb3N0ZXJMYWInKSByZXR1cm47XG5cbiAgYXdhaXQgd2l0aFJldHJ5KCgpID0+XG4gICAgb2N0b2tpdC5yZXF1ZXN0KCdQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30nLCB7XG4gICAgICBvd25lcixcbiAgICAgIHJlcG8sXG4gICAgICBhbGxvd19tZXJnZV9jb21taXQ6IGZhbHNlLFxuICAgICAgYWxsb3dfc3F1YXNoX21lcmdlOiB0cnVlLFxuICAgICAgYWxsb3dfcmViYXNlX21lcmdlOiBmYWxzZSxcbiAgICAgIGRlbGV0ZV9icmFuY2hfb25fbWVyZ2U6IHRydWUsXG4gICAgICBzcXVhc2hfbWVyZ2VfY29tbWl0X3RpdGxlOiAnUFJfVElUTEUnLFxuICAgICAgc3F1YXNoX21lcmdlX2NvbW1pdF9tZXNzYWdlOiAnQkxBTksnLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAnWC1HaXRIdWItQXBpLVZlcnNpb24nOiAnMjAyMi0xMS0yOCcsXG4gICAgICB9LFxuICAgICAgLi4uKGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXIvJykgPyB7IGFsbG93X2F1dG9fbWVyZ2U6IHRydWUgfSA6IHt9KSxcbiAgICB9KVxuICApO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgZGlzdGFuY2UgfSBmcm9tICdmYXN0ZXN0LWxldmVuc2h0ZWluJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCB0ZW1wbGF0ZXMgPSB7XG4gICdwdWxsX3JlcXVlc3RfdGVtcGxhdGUubWQnOiBgXG5DbG9zZSAjPElzc3VlTnVtYmVyPlxuXG4jIyBTZWxmIENoZWNrXG5cbi0gWyBdIEkndmUgY29uZmlybWVkIFxcYEFsbCBjaGVja3MgaGF2ZSBwYXNzZWRcXGAgb24gdGhpcyBwYWdlLlxuICAtIFBSIHRpdGxlIGZvbGxvd3MgW0FuZ3VsYXIncyBjb21taXQgbWVzc2FnZSBmb3JtYXRdKGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvYmxvYi9tYWluL0NPTlRSSUJVVElORy5tZCMtY29tbWl0LW1lc3NhZ2UtZm9ybWF0KS5cbiAgLSBQUiB0aXRsZSBkb2Vzbid0IGhhdmUgXFxgV0lQOlxcYC5cbiAgLSBUaGUgdGVzdCBjb21tYW5kIChlLmcuLCBcXGB5YXJuIHRlc3RcXGApIHBhc3NlZC5cbiAgLSBUaGUgbGludCBjb21tYW5kIChlLmcuLCBcXGB5YXJuIGxpbnRcXGApIHBhc3NlZC5cbiAgLSBZb3UgbWF5IGxlYXZlIHRoaXMgYm94IHVuY2hlY2tlZCBkdWUgdG8gbG9uZyB3b3JrZmxvd3MuXG4tIFsgXSBJJ3ZlIHJldmlld2VkIG15IGNoYW5nZXMgb24gdGhlIEdpdEh1YiBkaWZmIHZpZXcuXG4tIFsgXSBJJ3ZlIHdyaXR0ZW4gdGhlIHN0ZXBzIHRvIHRlc3QgbXkgY2hhbmdlcy5cbi0gWyBdIEkndmUgYWRkZWQgc2NyZWVuc2hvdHMgKGlmIHRoZSBVSSBjaGFuZ2VkKS5cbiAgLSBZb3UgbWF5IGxlYXZlIHRoaXMgYm94IHVuY2hlY2tlZCBpZiB5b3UgZGlkbid0IG1vZGlmeSB0aGUgVUkuXG5cbjwhLS0gUGxlYXNlIGFkZCBzY3JlZW5zaG90cyBpZiB5b3UgbW9kaWZ5IHRoZSBVSS5cbnwgQ3VycmVudCAgICAgICAgICAgICAgICAgIHwgSW4gY29taW5nICAgICAgICAgICAgICAgIHxcbnwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHxcbnwgPGltZyBzcmM9XCJcIiB3aWR0aD1cIjQwMFwiPiB8IDxpbWcgc3JjPVwiXCIgd2lkdGg9XCI0MDBcIj4gfFxuLS0+XG5cbjwhLS0gUGxlYXNlIGFkZCBzdGVwcyB0byB0ZXN0IHlvdXIgY2hhbmdlcy5cbiMjIFN0ZXBzIHRvIFRlc3RcblxuMS4gT3BlbiBodHRwOi8vbG9jYWxob3N0LWV4ZXJjb2RlLndpbGxib29zdGVyLm5ldDozMDAwL2phLUpQL2NvdXJzZXMvX2V4YW1wbGUvbGVzc29ucy9fZXhhbXBsZV9hX3BsdXNfYi9wcm9ibGVtcy9fZXhhbXBsZV9hX3BsdXNfYiBhZnRlciBsb2dpbi5cbjIuIFNlbGVjdCB0aGUgbGFuZ3VhZ2UgXFxgQ1xcYC5cbjMuIFdyaXRlIHRoZSBmb2xsb3dpbmcgY29kZTpcbiAgIFxcYFxcYFxcYGNcbiAgICNpbmNsdWRlIDxzdGRpby5oPlxuXG4gICBpbnQgbWFpbih2b2lkKSB7XG4gICAgIGludCBhLCBiO1xuXG4gICAgIHNjYW5mKFwiJWQgJWRcIiwgJmEsICZiKTtcbiAgICAgcHJpbnRmKFwiJWRcIiwgYSArIGIpO1xuICAgICByZXR1cm4gMDtcbiAgIH1cbiAgIFxcYFxcYFxcYFxuNC4gUHVzaCBcXGBTdWJtaXRcXGAgYnV0dG9uLlxuNS4gLi4uXG4tLT5cbmAudHJpbSgpLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlR2l0SHViVGVtcGxhdGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlR2l0SHViVGVtcGxhdGVzJywgYXN5bmMgKCkgPT4ge1xuICAgIGZvciAoY29uc3QgW2ZpbGVOYW1lLCBuZXdDb250ZW50XSBvZiBPYmplY3QuZW50cmllcyh0ZW1wbGF0ZXMpKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRodWInLCBmaWxlTmFtZSk7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHtcbiAgICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgICBpZiAoZGlzdGFuY2Uob2xkQ29udGVudCwgbmV3Q29udGVudCkgPiBuZXdDb250ZW50Lmxlbmd0aCAvIDIpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aHViJyksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgICB9XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IGZzcCBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuaW1wb3J0IHsgc2ltcGxlR2l0IH0gZnJvbSAnc2ltcGxlLWdpdCc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcbmltcG9ydCB7IHogfSBmcm9tICd6b2QnO1xuXG5pbXBvcnQgeyBnaXRIdWJVdGlsLCBvY3Rva2l0IH0gZnJvbSAnLi91dGlscy9naXRodWJVdGlsLmpzJztcbmltcG9ydCB7IGdsb2JJZ25vcmUgfSBmcm9tICcuL3V0aWxzL2dsb2JVdGlsLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBQYWNrYWdlQ29uZmlnIHtcbiAgZGlyUGF0aDogc3RyaW5nO1xuICBkb2NrZXJmaWxlOiBzdHJpbmc7XG4gIGlzUm9vdDogYm9vbGVhbjtcbiAgaXNQdWJsaWNSZXBvOiBib29sZWFuO1xuICBpc1JlZmVycmVkQnlPdGhlclJlcG86IGJvb2xlYW47XG4gIHJlcG9zaXRvcnk/OiBzdHJpbmc7XG4gIGlzQnVuOiBib29sZWFuO1xuICBpc0VzbVBhY2thZ2U6IGJvb2xlYW47XG4gIGlzV2lsbEJvb3N0ZXJDb25maWdzOiBib29sZWFuO1xuICBkb2VzQ29udGFpbnNTdWJQYWNrYWdlSnNvbnM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluc0RvY2tlcmZpbGU6IGJvb2xlYW47XG4gIGRvZXNDb250YWluc0dlbWZpbGU6IGJvb2xlYW47XG4gIGRvZXNDb250YWluc0dvTW9kOiBib29sZWFuO1xuICBkb2VzQ29udGFpbnNQYWNrYWdlSnNvbjogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5zUG9ldHJ5TG9jazogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5zUG9tWG1sOiBib29sZWFuO1xuICBkb2VzQ29udGFpbnNQdWJzcGVjWWFtbDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5zVGVtcGxhdGVZYW1sOiBib29sZWFuO1xuICBkb2VzQ29udGFpbnNWc2NvZGVTZXR0aW5nc0pzb246IGJvb2xlYW47XG5cbiAgZG9lc0NvbnRhaW5zSmF2YVNjcmlwdDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5zVHlwZVNjcmlwdDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5zSnN4T3JUc3g6IGJvb2xlYW47XG4gIGRvZXNDb250YWluc0phdmFTY3JpcHRJblBhY2thZ2VzOiBib29sZWFuO1xuICBkb2VzQ29udGFpbnNUeXBlU2NyaXB0SW5QYWNrYWdlczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5zSnN4T3JUc3hJblBhY2thZ2VzOiBib29sZWFuO1xuICBkZXBlbmRpbmc6IHtcbiAgICBibGl0ejogYm9vbGVhbjtcbiAgICBmaXJlYmFzZTogYm9vbGVhbjtcbiAgICBnZW5JMThuVHM6IGJvb2xlYW47XG4gICAgbGl0ZXN0cmVhbTogYm9vbGVhbjtcbiAgICBuZXh0OiBib29sZWFuO1xuICAgIHBsYXl3cmlnaHRUZXN0OiBib29sZWFuO1xuICAgIHByaXNtYTogYm9vbGVhbjtcbiAgICBweXJpZ2h0OiBib29sZWFuO1xuICAgIHJlYWN0TmF0aXZlOiBib29sZWFuO1xuICAgIHNlbWFudGljUmVsZWFzZTogYm9vbGVhbjtcbiAgICBzdG9yeWJvb2s6IGJvb2xlYW47XG4gICAgd2I6IGJvb2xlYW47XG4gIH07XG4gIHJlbGVhc2U6IHtcbiAgICBicmFuY2hlczogc3RyaW5nW107XG4gICAgZ2l0aHViOiBib29sZWFuO1xuICAgIG5wbTogYm9vbGVhbjtcbiAgfTtcbiAgZXNsaW50QmFzZT86IEVzbGludEV4dGVuc2lvbkJhc2U7XG4gIHZlcnNpb25zVGV4dD86IHN0cmluZztcbiAgcGFja2FnZUpzb24/OiBQYWNrYWdlSnNvbjtcbiAgd2JmeUpzb24/OiBXYmZ5SnNvbjtcbn1cblxudHlwZSBXYmZ5SnNvbiA9IHouaW5mZXI8dHlwZW9mIHdiZnlKc29uU2NoZW1hPjtcblxuY29uc3Qgd2JmeUpzb25TY2hlbWEgPSB6Lm9iamVjdCh7XG4gIHR5cG9zOiB6XG4gICAgLm9iamVjdCh7XG4gICAgICBhbGw6IHoucmVjb3JkKHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgICBkb2M6IHoucmVjb3JkKHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgICB0czogei5yZWNvcmQoei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICAgIHRleHQ6IHoucmVjb3JkKHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgfSlcbiAgICAub3B0aW9uYWwoKSxcbn0pO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UGFja2FnZUNvbmZpZyhcbiAgZGlyUGF0aDogc3RyaW5nLFxuICByb290Q29uZmlnPzogUGFja2FnZUNvbmZpZ1xuKTogUHJvbWlzZTxQYWNrYWdlQ29uZmlnIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIHRyeSB7XG4gICAgY29uc3QgZG9lc0NvbnRhaW5zUGFja2FnZUpzb24gPSBmcy5leGlzdHNTeW5jKHBhY2thZ2VKc29uUGF0aCk7XG4gICAgbGV0IGRlcGVuZGVuY2llczogUGFja2FnZUpzb25bJ2RlcGVuZGVuY2llcyddID0ge307XG4gICAgbGV0IGRldkRlcGVuZGVuY2llczogUGFja2FnZUpzb25bJ2RldkRlcGVuZGVuY2llcyddID0ge307XG4gICAgbGV0IHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiA9IHt9O1xuICAgIGxldCBlc21QYWNrYWdlID0gZmFsc2U7XG4gICAgaWYgKGRvZXNDb250YWluc1BhY2thZ2VKc29uKSB7XG4gICAgICBjb25zdCBwYWNrYWdlSnNvblRleHQgPSBmcy5yZWFkRmlsZVN5bmMocGFja2FnZUpzb25QYXRoLCAndXRmOCcpO1xuICAgICAgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKHBhY2thZ2VKc29uVGV4dCkgYXMgUGFja2FnZUpzb247XG4gICAgICBkZXBlbmRlbmNpZXMgPSBwYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge307XG4gICAgICBkZXZEZXBlbmRlbmNpZXMgPSBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gICAgICBlc21QYWNrYWdlID0gcGFja2FnZUpzb24udHlwZSA9PT0gJ21vZHVsZSc7XG4gICAgfVxuXG4gICAgbGV0IHJlbGVhc2VCcmFuY2hlczogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgcmVsZWFzZVBsdWdpbnM6IHN0cmluZ1tdID0gW107XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlbGVhc2VyY0pzb25QYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICcucmVsZWFzZXJjLmpzb24nKTtcbiAgICAgIGNvbnN0IGpzb24gPSBKU09OLnBhcnNlKGF3YWl0IGZzcC5yZWFkRmlsZShyZWxlYXNlcmNKc29uUGF0aCwgJ3V0ZjgnKSkgYXNcbiAgICAgICAgfCB7XG4gICAgICAgICAgICBicmFuY2hlczogc3RyaW5nW107XG4gICAgICAgICAgICBwbHVnaW5zPzogc3RyaW5nW11bXTtcbiAgICAgICAgICB9XG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgcmVsZWFzZUJyYW5jaGVzID0ganNvbj8uYnJhbmNoZXMgfHwgW107XG4gICAgICByZWxlYXNlUGx1Z2lucyA9IGpzb24/LnBsdWdpbnM/LmZsYXQoKSB8fCBbXTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICBjb25zdCBpc1Jvb3QgPVxuICAgICAgcGF0aC5iYXNlbmFtZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy4uJykpICE9PSAncGFja2FnZXMnIHx8XG4gICAgICAhZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy4uJywgJy4uJywgJ3BhY2thZ2UuanNvbicpKTtcblxuICAgIGxldCByZXBvSW5mbzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgaWYgKGlzUm9vdCkge1xuICAgICAgcmVwb0luZm8gPSBhd2FpdCBmZXRjaFJlcG9JbmZvKGRpclBhdGgsIHBhY2thZ2VKc29uKTtcbiAgICB9XG5cbiAgICBsZXQgdmVyc2lvbnNUZXh0ID0gJyc7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmc3AucmVhZEZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsICcudG9vbC12ZXJzaW9ucycpLCAndXRmOCcpO1xuICAgICAgdmVyc2lvbnNUZXh0ICs9IGNvbnRlbnQudHJpbSgpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtwcmVmaXgsIG5hbWVdIG9mIFtcbiAgICAgIFsnamF2YScsICdqYXZhJ10sXG4gICAgICBbJ25vZGUnLCAnbm9kZWpzJ10sXG4gICAgICBbJ3B5dGhvbicsICdweXRob24nXSxcbiAgICBdKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBub2RlVmVyc2lvbkNvbnRlbnQgPSBhd2FpdCBmc3AucmVhZEZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsIGAuJHtwcmVmaXh9LXZlcnNpb25gKSwgJ3V0ZjgnKTtcbiAgICAgICAgaWYgKHZlcnNpb25zVGV4dCkge1xuICAgICAgICAgIHZlcnNpb25zVGV4dCArPSAnXFxuJztcbiAgICAgICAgfVxuICAgICAgICB2ZXJzaW9uc1RleHQgKz0gbmFtZSArICcgJyArIG5vZGVWZXJzaW9uQ29udGVudC50cmltKCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gZG8gbm90aGluZ1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBkb2NrZXJmaWxlID0gJyc7XG4gICAgdHJ5IHtcbiAgICAgIGRvY2tlcmZpbGUgPSBhd2FpdCBmc3AucmVhZEZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsICdEb2NrZXJmaWxlJyksICd1dGY4Jyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgLy8gUmVhZCB3YmZ5Lmpzb25cbiAgICBjb25zdCB3YmZ5SnNvblBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3diZnkuanNvbicpO1xuICAgIGxldCB3YmZ5SnNvbjogV2JmeUpzb24gfCB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHdiZnlKc29uVGV4dCA9IGF3YWl0IGZzcC5yZWFkRmlsZSh3YmZ5SnNvblBhdGgsICd1dGY4Jyk7XG4gICAgICB3YmZ5SnNvbiA9IHdiZnlKc29uU2NoZW1hLnBhcnNlKEpTT04ucGFyc2Uod2JmeUpzb25UZXh0KSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgY29uc3QgY29uZmlnOiBQYWNrYWdlQ29uZmlnID0ge1xuICAgICAgZGlyUGF0aCxcbiAgICAgIGRvY2tlcmZpbGUsXG4gICAgICBpc1Jvb3QsXG4gICAgICBpc1B1YmxpY1JlcG86IHJlcG9JbmZvPy5wcml2YXRlID09PSBmYWxzZSxcbiAgICAgIGlzUmVmZXJyZWRCeU90aGVyUmVwbzogISFwYWNrYWdlSnNvbi5maWxlcyxcbiAgICAgIHJlcG9zaXRvcnk6IHJlcG9JbmZvPy5mdWxsX25hbWUgPyBgZ2l0aHViOiR7cmVwb0luZm8uZnVsbF9uYW1lIGFzIHN0cmluZ31gIDogdW5kZWZpbmVkLFxuICAgICAgaXNCdW46IHJvb3RDb25maWc/LmlzQnVuIHx8IGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGRpclBhdGgsICdidW5maWcudG9tbCcpKSxcbiAgICAgIGlzRXNtUGFja2FnZTogZXNtUGFja2FnZSxcbiAgICAgIGlzV2lsbEJvb3N0ZXJDb25maWdzOiBwYWNrYWdlSnNvblBhdGguaW5jbHVkZXMoYCR7cGF0aC5zZXB9d2lsbGJvb3N0ZXItY29uZmlnc2ApLFxuICAgICAgZG9lc0NvbnRhaW5zU3ViUGFja2FnZUpzb25zOiBjb250YWluc0FueSgncGFja2FnZXMvKiovcGFja2FnZS5qc29uJywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbnNEb2NrZXJmaWxlOiAhIWRvY2tlcmZpbGUgfHwgZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2RvY2tlci1jb21wb3NlLnltbCcpKSxcbiAgICAgIGRvZXNDb250YWluc0dlbWZpbGU6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdHZW1maWxlJykpLFxuICAgICAgZG9lc0NvbnRhaW5zR29Nb2Q6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdnby5tb2QnKSksXG4gICAgICBkb2VzQ29udGFpbnNQYWNrYWdlSnNvbjogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSxcbiAgICAgIGRvZXNDb250YWluc1BvZXRyeUxvY2s6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwb2V0cnkubG9jaycpKSxcbiAgICAgIGRvZXNDb250YWluc1BvbVhtbDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BvbS54bWwnKSksXG4gICAgICBkb2VzQ29udGFpbnNQdWJzcGVjWWFtbDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3B1YnNwZWMueWFtbCcpKSxcbiAgICAgIGRvZXNDb250YWluc1RlbXBsYXRlWWFtbDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3RlbXBsYXRlLnlhbWwnKSksXG4gICAgICBkb2VzQ29udGFpbnNWc2NvZGVTZXR0aW5nc0pzb246IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICcudnNjb2RlJywgJ3NldHRpbmdzLmpzb24nKSksXG4gICAgICBkb2VzQ29udGFpbnNKYXZhU2NyaXB0OiBjb250YWluc0FueSgne2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjanMsbWpzLGpzLGpzeH0nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluc1R5cGVTY3JpcHQ6IGNvbnRhaW5zQW55KCd7YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2N0cyxtdHMsdHMsdHN4fScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5zSnN4T3JUc3g6IGNvbnRhaW5zQW55KCd7YXBwLHNyYyx0ZXN0fS8qKi8qLnt0LGp9c3gnLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluc0phdmFTY3JpcHRJblBhY2thZ2VzOiBjb250YWluc0FueShcbiAgICAgICAgJ3BhY2thZ2VzLyoqL3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3h9JyxcbiAgICAgICAgZGlyUGF0aFxuICAgICAgKSxcbiAgICAgIGRvZXNDb250YWluc1R5cGVTY3JpcHRJblBhY2thZ2VzOiBjb250YWluc0FueShcbiAgICAgICAgJ3BhY2thZ2VzLyoqL3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y3RzLG10cyx0cyx0c3h9JyxcbiAgICAgICAgZGlyUGF0aFxuICAgICAgKSxcbiAgICAgIGRvZXNDb250YWluc0pzeE9yVHN4SW5QYWNrYWdlczogY29udGFpbnNBbnkoJ3BhY2thZ2VzLyoqL3thcHAsc3JjLHRlc3R9LyoqLyoue3Qsan1zeCcsIGRpclBhdGgpLFxuICAgICAgZGVwZW5kaW5nOiB7XG4gICAgICAgIGJsaXR6OiAhIWRlcGVuZGVuY2llc1snYmxpdHonXSxcbiAgICAgICAgZmlyZWJhc2U6ICEhZGV2RGVwZW5kZW5jaWVzWydmaXJlYmFzZS10b29scyddLFxuICAgICAgICBnZW5JMThuVHM6ICEhZGV2RGVwZW5kZW5jaWVzWydnZW4taTE4bi10cyddLFxuICAgICAgICBsaXRlc3RyZWFtOiBkb2NrZXJmaWxlLmluY2x1ZGVzKCdpbnN0YWxsLWxpdGVzdHJlYW0uc2gnKSxcbiAgICAgICAgbmV4dDogISFkZXBlbmRlbmNpZXNbJ25leHQnXSxcbiAgICAgICAgcGxheXdyaWdodFRlc3Q6XG4gICAgICAgICAgISFkZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXSB8fFxuICAgICAgICAgICEhZGV2RGVwZW5kZW5jaWVzWydAcGxheXdyaWdodC90ZXN0J10gfHxcbiAgICAgICAgICAhIWRldkRlcGVuZGVuY2llc1sncGxheXdyaWdodCddLFxuICAgICAgICBwcmlzbWE6ICEhZGVwZW5kZW5jaWVzWydAcHJpc21hL2NsaWVudCddIHx8ICEhZGV2RGVwZW5kZW5jaWVzWydwcmlzbWEnXSxcbiAgICAgICAgcHlyaWdodDogISFkZXZEZXBlbmRlbmNpZXNbJ3B5cmlnaHQnXSxcbiAgICAgICAgcmVhY3ROYXRpdmU6ICEhZGVwZW5kZW5jaWVzWydyZWFjdC1uYXRpdmUnXSxcbiAgICAgICAgc2VtYW50aWNSZWxlYXNlOiAhIShcbiAgICAgICAgICBkZXZEZXBlbmRlbmNpZXNbJ3NlbWFudGljLXJlbGVhc2UnXSB8fFxuICAgICAgICAgIHJlbGVhc2VCcmFuY2hlcy5sZW5ndGggPiAwIHx8XG4gICAgICAgICAgcmVsZWFzZVBsdWdpbnMubGVuZ3RoID4gMFxuICAgICAgICApLFxuICAgICAgICBzdG9yeWJvb2s6ICEhZGV2RGVwZW5kZW5jaWVzWydAc3Rvcnlib29rL3JlYWN0J10sXG4gICAgICAgIHdiOiAhIWRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3diJ10gfHwgISFkZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci93YiddLFxuICAgICAgfSxcbiAgICAgIHJlbGVhc2U6IHtcbiAgICAgICAgYnJhbmNoZXM6IHJlbGVhc2VCcmFuY2hlcyxcbiAgICAgICAgZ2l0aHViOiByZWxlYXNlUGx1Z2lucy5pbmNsdWRlcygnQHNlbWFudGljLXJlbGVhc2UvZ2l0aHViJyksXG4gICAgICAgIG5wbTogcmVsZWFzZVBsdWdpbnMuaW5jbHVkZXMoJ0BzZW1hbnRpYy1yZWxlYXNlL25wbScpLFxuICAgICAgfSxcbiAgICAgIHZlcnNpb25zVGV4dCxcbiAgICAgIHBhY2thZ2VKc29uLFxuICAgICAgd2JmeUpzb24sXG4gICAgfTtcbiAgICBpZiAoIWNvbmZpZy5pc0J1bikge1xuICAgICAgY29uZmlnLmVzbGludEJhc2UgPSBnZXRFc2xpbnRFeHRlbnNpb25CYXNlKGNvbmZpZyk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbnNHZW1maWxlIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5zR29Nb2QgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbnNQYWNrYWdlSnNvbiB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluc1BvZXRyeUxvY2sgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbnNQb21YbWwgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbnNQdWJzcGVjWWFtbCB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluc1RlbXBsYXRlWWFtbFxuICAgICkge1xuICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5mdW5jdGlvbiBjb250YWluc0FueShwYXR0ZXJuOiBzdHJpbmcsIGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZmcuZ2xvYlN5bmMocGF0dGVybiwgeyBkb3Q6IHRydWUsIGN3ZDogZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH0pLmxlbmd0aCA+IDA7XG59XG5cbmV4cG9ydCB0eXBlIEVzbGludEV4dGVuc2lvbkJhc2UgPVxuICB8ICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cy1yZWFjdCdcbiAgfCAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMnXG4gIHwgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzLXJlYWN0J1xuICB8ICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcydcbiAgfCAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctbmV4dCc7XG5cbmZ1bmN0aW9uIGdldEVzbGludEV4dGVuc2lvbkJhc2UoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogRXNsaW50RXh0ZW5zaW9uQmFzZSB8IHVuZGVmaW5lZCB7XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLm5leHQpIHtcbiAgICByZXR1cm4gJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLW5leHQnO1xuICB9IGVsc2UgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0KSB7XG4gICAgcmV0dXJuIGNvbmZpZy5kb2VzQ29udGFpbnNKc3hPclRzeCA/ICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cy1yZWFjdCcgOiAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMnO1xuICB9IGVsc2Uge1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zSnN4T3JUc3gpIHtcbiAgICAgIHJldHVybiAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMtcmVhY3QnO1xuICAgIH0gZWxzZSBpZiAoY29uZmlnLmRvZXNDb250YWluc0phdmFTY3JpcHQpIHtcbiAgICAgIHJldHVybiAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMnO1xuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaFJlcG9JbmZvKGRpclBhdGg6IHN0cmluZywgcGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBnaXQgPSBzaW1wbGVHaXQoZGlyUGF0aCk7XG4gIGNvbnN0IHJlbW90ZXMgPSBhd2FpdCBnaXQuZ2V0UmVtb3Rlcyh0cnVlKTtcbiAgY29uc3Qgb3JpZ2luID0gcmVtb3Rlcy5maW5kKChyKSA9PiByLm5hbWUgPT09ICdvcmlnaW4nKTtcbiAgY29uc3QgcmVtb3RlVXJsID0gb3JpZ2luPy5yZWZzPy5mZXRjaCA/PyBvcmlnaW4/LnJlZnM/LnB1c2g7XG4gIGlmICh0eXBlb2YgcmVtb3RlVXJsID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXF1ZXN0UmVwb0luZm8ocmVtb3RlVXJsKTtcbiAgICBpZiAoanNvbikgcmV0dXJuIGpzb247XG4gIH1cblxuICBjb25zdCB1cmwgPSB0eXBlb2YgcGFja2FnZUpzb24ucmVwb3NpdG9yeSA9PT0gJ3N0cmluZycgPyBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5IDogcGFja2FnZUpzb24ucmVwb3NpdG9yeT8udXJsO1xuICBpZiAodXJsKSB7XG4gICAgY29uc3QganNvbiA9IGF3YWl0IHJlcXVlc3RSZXBvSW5mbyh1cmwpO1xuICAgIGlmIChqc29uICYmIGpzb24ubWVzc2FnZSAhPT0gJ05vdCBGb3VuZCcpIHJldHVybiBqc29uO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlcXVlc3RSZXBvSW5mbyh1cmxPckZ1bGxOYW1lOiBzdHJpbmcpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IFtvcmcsIG5hbWVdID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKHVybE9yRnVsbE5hbWUpO1xuICBpZiAoIW9yZyB8fCAhbmFtZSkgcmV0dXJuO1xuXG4gIGNvbnN0IHJldCA9IHsgZnVsbF9uYW1lOiBgJHtvcmd9LyR7bmFtZX1gIH07XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ0dFVCAvcmVwb3Mve293bmVyfS97cmVwb30nLCB7XG4gICAgICBvd25lcjogb3JnLFxuICAgICAgcmVwbzogbmFtZSxcbiAgICB9KTtcbiAgICBPYmplY3QuYXNzaWduKHJldCwgcmVzcG9uc2UuZGF0YSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgaWdub3JlRXJyb3JBc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliJztcbmltcG9ydCB5YXJncyBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpeERvY2tlcmZpbGUgfSBmcm9tICcuL2ZpeGVycy9kb2NrZXJmaWxlLmpzJztcbmltcG9ydCB7IGZpeFBsYXl3cmlnaHRDb25maWcgfSBmcm9tICcuL2ZpeGVycy9wbGF5d3JpZ2h0Q29uZmlnLmpzJztcbmltcG9ydCB7IGZpeFByaXNtYUVudkZpbGVzIH0gZnJvbSAnLi9maXhlcnMvcHJpc21hLmpzJztcbmltcG9ydCB7IGZpeFRlc3REaXJlY3Rvcmllc1VwZGF0aW5nUGFja2FnZUpzb24gfSBmcm9tICcuL2ZpeGVycy90ZXN0RGlyZWN0b3J5LmpzJztcbmltcG9ydCB7IGZpeFR5cGVEZWZpbml0aW9ucyB9IGZyb20gJy4vZml4ZXJzL3R5cGVEZWZpbml0aW9uLmpzJztcbmltcG9ydCB7IGZpeFR5cG9zIH0gZnJvbSAnLi9maXhlcnMvdHlwb3MuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9hZ2VudHMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVUb29sVmVyc2lvbnMgfSBmcm9tICcuL2dlbmVyYXRvcnMvYXNkZi5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUJpb21lSnNvbmMgfSBmcm9tICcuL2dlbmVyYXRvcnMvYmlvbWUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVCdW5maWdUb21sIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2J1bmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZURvY2tlcmlnbm9yZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9kb2NrZXJpZ25vcmUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVFZGl0b3Jjb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvZWRpdG9yY29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlRXNsaW50cmMgfSBmcm9tICcuL2dlbmVyYXRvcnMvZXNsaW50Q29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2VtaW5pQ29uZmlnIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dlbWluaUNvbmZpZy5qcyc7XG5pbXBvcnQgeyByZW1vdmVHZW1pbmlTZXR0aW5ncyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9nZW1pbmlTZXR0aW5ncy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMgfSBmcm9tICcuL2dlbmVyYXRvcnMvZ2l0YXR0cmlidXRlcy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUdpdGlnbm9yZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9naXRpZ25vcmUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVIdXNreXJjVXBkYXRpbmdQYWNrYWdlSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9odXNreXJjLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlSWRlYVNldHRpbmdzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2lkZWEuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVMZWZ0aG9va1VwZGF0aW5nUGFja2FnZUpzb24gfSBmcm9tICcuL2dlbmVyYXRvcnMvbGVmdGhvb2suanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVMaW50c3RhZ2VkcmMgfSBmcm9tICcuL2dlbmVyYXRvcnMvbGludHN0YWdlZHJjLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlTmV4dENvbmZpZ0pzb24gfSBmcm9tICcuL2dlbmVyYXRvcnMvbmV4dGNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVBhY2thZ2VKc29uIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3BhY2thZ2VKc29uLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUHJldHRpZXJpZ25vcmUgfSBmcm9tICcuL2dlbmVyYXRvcnMvcHJldHRpZXJpZ25vcmUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9weXJpZ2h0Y29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUmVhZG1lIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3JlYWRtZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJlbGVhc2VyYyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9yZWxlYXNlcmMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVSZW5vdmF0ZUpzb24gfSBmcm9tICcuL2dlbmVyYXRvcnMvcmVub3ZhdGVKc29uLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlVHNjb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvdHNjb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyB9IGZyb20gJy4vZ2VuZXJhdG9ycy92c2NvZGVTZXR0aW5ncy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVdvcmtmbG93cyB9IGZyb20gJy4vZ2VuZXJhdG9ycy93b3JrZmxvdy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVlhcm5yY1ltbCB9IGZyb20gJy4vZ2VuZXJhdG9ycy95YXJucmMuanMnO1xuaW1wb3J0IHsgc2V0dXBMYWJlbHMgfSBmcm9tICcuL2dpdGh1Yi9sYWJlbC5qcyc7XG5pbXBvcnQgeyBzZXR1cFNlY3JldHMgfSBmcm9tICcuL2dpdGh1Yi9zZWNyZXQuanMnO1xuaW1wb3J0IHsgc2V0dXBHaXRIdWJTZXR0aW5ncyB9IGZyb20gJy4vZ2l0aHViL3NldHRpbmdzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2l0SHViVGVtcGxhdGVzIH0gZnJvbSAnLi9naXRodWIvdGVtcGxhdGUuanMnO1xuaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgeyBnZXRQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMgfSBmcm9tICcuL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5cbmFzeW5jIGZ1bmN0aW9uIG1haW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGFyZ3YgPSBhd2FpdCB5YXJncyhwcm9jZXNzLmFyZ3Yuc2xpY2UoMikpXG4gICAgLmNvbW1hbmQoJyQwIFtwYXRocy4uXScsICdNYWtlIGEgZ2l2ZW4gcHJvamVjdCBmb2xsb3cgdGhlIFdpbGxCb29zdGVyIHN0YW5kYXJkJywgKHlhcmdzKSA9PiB7XG4gICAgICB5YXJncy5wb3NpdGlvbmFsKCdwYXRocycsIHtcbiAgICAgICAgZGVzY3JpYmU6ICdwcm9qZWN0IHBhdGhzIHRvIGJlIHdiZmllZCcsXG4gICAgICAgIGFycmF5OiB0cnVlLFxuICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgZGVmYXVsdDogWycuJ10sXG4gICAgICB9KTtcbiAgICB9KVxuICAgIC5vcHRpb25zKHtcbiAgICAgIGVudjoge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ1VwbG9hZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXMgc2VjcmV0cyB0byBHaXRIdWInLFxuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICBhbGlhczogJ2UnLFxuICAgICAgfSxcbiAgICAgIHNraXBEZXBzOiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiAnU2tpcCBkZXBlbmRlbmN5IGluc3RhbGxhdGlvbicsXG4gICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgIGFsaWFzOiAnZCcsXG4gICAgICB9LFxuICAgICAgdmVyYm9zZToge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgb3Igbm90IHRvIGVuYWJsZSB2ZXJib3NlIG1vZGUnLFxuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICBhbGlhczogJ3YnLFxuICAgICAgfSxcbiAgICB9KVxuICAgIC5zdHJpY3QoKS5hcmd2O1xuICBvcHRpb25zLmlzVmVyYm9zZSA9IGFyZ3YudmVyYm9zZTtcbiAgb3B0aW9ucy5kb2VzVXBsb2FkRW52VmFycyA9IGFyZ3YuZW52O1xuXG4gIGZvciAoY29uc3Qgcm9vdERpclBhdGggb2YgYXJndi5wYXRocyBhcyBzdHJpbmdbXSkge1xuICAgIGNvbnN0IHBhY2thZ2VzRGlyUGF0aCA9IHBhdGguam9pbihyb290RGlyUGF0aCwgJ3BhY2thZ2VzJyk7XG4gICAgY29uc3QgZGlyZW50cyA9IChhd2FpdCBpZ25vcmVFcnJvckFzeW5jKCgpID0+IGZzLnByb21pc2VzLnJlYWRkaXIocGFja2FnZXNEaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpKSA/PyBbXTtcbiAgICBjb25zdCBzdWJEaXJQYXRocyA9IGRpcmVudHMuZmlsdGVyKChkKSA9PiBkLmlzRGlyZWN0b3J5KCkpLm1hcCgoZCkgPT4gcGF0aC5qb2luKHBhY2thZ2VzRGlyUGF0aCwgZC5uYW1lKSk7XG5cbiAgICBhd2FpdCBmaXhUZXN0RGlyZWN0b3JpZXNVcGRhdGluZ1BhY2thZ2VKc29uKFtyb290RGlyUGF0aCwgLi4uc3ViRGlyUGF0aHNdKTtcblxuICAgIGNvbnN0IHJvb3RDb25maWcgPSBhd2FpdCBnZXRQYWNrYWdlQ29uZmlnKHJvb3REaXJQYXRoKTtcbiAgICBjb25zb2xlLmxvZygncm9vdENvbmZpZzonLCByb290Q29uZmlnKTtcbiAgICBpZiAoIXJvb3RDb25maWcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYHRoZXJlIGlzIG5vIHZhbGlkIHBhY2thZ2UuanNvbiBpbiAke3Jvb3REaXJQYXRofWApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGFiYnJldmlhdGlvblByb21pc2UgPSBmaXhUeXBvcyhyb290Q29uZmlnKTtcblxuICAgIGNvbnN0IG51bGxhYmxlU3ViUGFja2FnZUNvbmZpZ3MgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHN1YkRpclBhdGhzLm1hcCgoc3ViRGlyUGF0aCkgPT4gZ2V0UGFja2FnZUNvbmZpZyhzdWJEaXJQYXRoLCByb290Q29uZmlnKSlcbiAgICApO1xuICAgIGNvbnN0IHN1YlBhY2thZ2VDb25maWdzID0gbnVsbGFibGVTdWJQYWNrYWdlQ29uZmlncy5maWx0ZXIoKGNvbmZpZykgPT4gISFjb25maWcpO1xuICAgIGNvbnN0IGFsbFBhY2thZ2VDb25maWdzID0gW3Jvb3RDb25maWcsIC4uLnN1YlBhY2thZ2VDb25maWdzXTtcblxuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgZm9yIChjb25zdCBjb25maWcgb2YgYWxsUGFja2FnZUNvbmZpZ3MpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGNvbmZpZyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSW5zdGFsbCB0b29scyB2aWEgYXNkZiBhdCBmaXJzdFxuICAgIGF3YWl0IGdlbmVyYXRlVG9vbFZlcnNpb25zKHJvb3RDb25maWcpO1xuICAgIC8vIEluc3RhbGwgeWFybiBiZXJyeVxuICAgIGF3YWl0IGdlbmVyYXRlWWFybnJjWW1sKHJvb3RDb25maWcpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIGZpeERvY2tlcmZpbGUocm9vdENvbmZpZyksXG4gICAgICBmaXhQcmlzbWFFbnZGaWxlcyhyb290Q29uZmlnKSxcbiAgICAgIGFiYnJldmlhdGlvblByb21pc2UudGhlbigoKSA9PiBnZW5lcmF0ZVJlYWRtZShyb290Q29uZmlnKSksXG4gICAgICBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zKHJvb3RDb25maWcsIGFsbFBhY2thZ2VDb25maWdzKSxcbiAgICAgIGdlbmVyYXRlRG9ja2VyaWdub3JlKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVFZGl0b3Jjb25maWcocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUdlbWluaUNvbmZpZyhyb290Q29uZmlnKSxcbiAgICAgIHJlbW92ZUdlbWluaVNldHRpbmdzKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUlkZWFTZXR0aW5ncyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlUmVub3ZhdGVKc29uKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVSZWxlYXNlcmMocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZVdvcmtmbG93cyhyb290Q29uZmlnKSxcbiAgICAgIHNldHVwTGFiZWxzKHJvb3RDb25maWcpLFxuICAgICAgc2V0dXBTZWNyZXRzKHJvb3RDb25maWcpLFxuICAgICAgc2V0dXBHaXRIdWJTZXR0aW5ncyhyb290Q29uZmlnKSxcbiAgICAgIC4uLihyb290Q29uZmlnLmlzQnVuXG4gICAgICAgID8gW1xuICAgICAgICAgICAgZ2VuZXJhdGVCdW5maWdUb21sKHJvb3RDb25maWcpLFxuICAgICAgICAgICAgZ2VuZXJhdGVIdXNreXJjVXBkYXRpbmdQYWNrYWdlSnNvbihyb290Q29uZmlnKS50aGVuKCgpID0+IGdlbmVyYXRlTGVmdGhvb2tVcGRhdGluZ1BhY2thZ2VKc29uKHJvb3RDb25maWcpKSxcbiAgICAgICAgICBdXG4gICAgICAgIDogW2dlbmVyYXRlSHVza3lyY1VwZGF0aW5nUGFja2FnZUpzb24ocm9vdENvbmZpZyldKSxcbiAgICAgIGdlbmVyYXRlTGludHN0YWdlZHJjKHJvb3RDb25maWcpLFxuICAgIF0pO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcblxuICAgIGNvbnN0IHByb21pc2VzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGNvbmZpZyBvZiBhbGxQYWNrYWdlQ29uZmlncykge1xuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGZpeFR5cGVEZWZpbml0aW9ucyhjb25maWcsIGNvbmZpZy5pc1Jvb3QgPyBhbGxQYWNrYWdlQ29uZmlncyA6IFtjb25maWddKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0VGVzdCkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGZpeFBsYXl3cmlnaHRDb25maWcoY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVOZXh0Q29uZmlnSnNvbihjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IGdlbmVyYXRlR2l0aWdub3JlKGNvbmZpZywgcm9vdENvbmZpZyk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG4gICAgICBpZiAoIWNvbmZpZy5pc1Jvb3QgJiYgIWNvbmZpZy5kb2VzQ29udGFpbnNQYWNrYWdlSnNvbikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IGdlbmVyYXRlUHJldHRpZXJpZ25vcmUoY29uZmlnKTtcbiAgICAgIGF3YWl0IGdlbmVyYXRlUGFja2FnZUpzb24oY29uZmlnLCByb290Q29uZmlnLCBhcmd2LnNraXBEZXBzKTtcblxuICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZUxpbnRzdGFnZWRyYyhjb25maWcpKTtcbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zVnNjb2RlU2V0dGluZ3NKc29uICYmIGNvbmZpZy5kb2VzQ29udGFpbnNQYWNrYWdlSnNvbikge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlVnNjb2RlU2V0dGluZ3MoY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHRJblBhY2thZ2VzKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVUc2NvbmZpZyhjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgY29uZmlnLmRvZXNDb250YWluc0phdmFTY3JpcHQgfHxcbiAgICAgICAgY29uZmlnLmRvZXNDb250YWluc0phdmFTY3JpcHRJblBhY2thZ2VzIHx8XG4gICAgICAgIGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0IHx8XG4gICAgICAgIGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0SW5QYWNrYWdlc1xuICAgICAgKSB7XG4gICAgICAgIGlmIChyb290Q29uZmlnLmlzQnVuKSB7XG4gICAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZUJpb21lSnNvbmMoY29uZmlnKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFyb290Q29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzKSB7XG4gICAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZUVzbGludHJjKGNvbmZpZykpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5weXJpZ2h0KSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbihjb25maWcpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcblxuICAgIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gcm9vdENvbmZpZy5pc0J1biA/ICdidW4nIDogJ3lhcm4nO1xuICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydjbGVhbnVwJ10sIHJvb3REaXJQYXRoKTtcbiAgICAvLyAneWFybiBpbnN0YWxsJyBzaG91bGQgYmUgYWZ0ZXIgYHlhcm4gY2xlYW51cGAgYmVjYXVzZSB5YXJuIGJlcnJ5IGdlbmVyYXRlcyB5YXJuLmxvY2tcbiAgICAvLyBjb3JyZXNwb25kaW5nIHRvIHRoZSBjb250ZW50cyBvZiBkZXBlbmRhbnQgc3ViLXBhY2thZ2UgaW4gbW9ub3JlcG9cbiAgICBpZiAocm9vdENvbmZpZy5pc0J1bikge1xuICAgICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ3VwZGF0ZSddLCByb290RGlyUGF0aCk7XG4gICAgICAvLyBUT0RPOiBSZW1vdmUgdGhlIGZvbGxvd2luZyBsaW5lIGFmdGVyIHRoZXJlIGlzIG5vIGJ1bi5sb2NrYlxuICAgICAgY29uc3QgYnVuTG9ja2JQYXRoID0gcGF0aC5qb2luKHJvb3REaXJQYXRoLCAnYnVuLmxvY2tiJyk7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhidW5Mb2NrYlBhdGgpKSB7XG4gICAgICAgIHZvaWQgZnMucHJvbWlzZXMucm0oYnVuTG9ja2JQYXRoKTtcbiAgICAgICAgc3Bhd25TeW5jKFxuICAgICAgICAgIHBhY2thZ2VNYW5hZ2VyLFxuICAgICAgICAgIFsnaW5zdGFsbCcsICctLXNhdmUtdGV4dC1sb2NrZmlsZScsICctLWZyb3plbi1sb2NrZmlsZScsICctLWxvY2tmaWxlLW9ubHknXSxcbiAgICAgICAgICByb290RGlyUGF0aFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnaW5zdGFsbCddLCByb290RGlyUGF0aCk7XG4gICAgfVxuICB9XG59XG5cbmF3YWl0IG1haW4oKTtcbiJdLCJuYW1lcyI6WyJvcHRpb25zIiwiY29uc3RydWN0b3IiLCJ0aGlzIiwiaXNWZXJib3NlIiwiZG9lc1VwbG9hZEVudlZhcnMiLCJsb2dnZXIiLCJmdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uIiwibmFtZSIsImZ1bmMiLCJjb25zb2xlIiwiaW5mbyIsImVycm9yIiwiRXJyb3IiLCJzdGFjayIsIlN0cmluZyIsImFzeW5jIiwiZml4RG9ja2VyZmlsZSIsImNvbmZpZyIsImRvZXNDb250YWluc0RvY2tlcmZpbGUiLCJvbGRDb250ZW50IiwiZG9ja2VyZmlsZSIsIm5ld0NvbnRlbnQiLCJmcyIsIndyaXRlRmlsZSIsInBhdGgiLCJqb2luIiwiZGlyUGF0aCIsImZpeFBsYXl3cmlnaHRDb25maWciLCJmaWxlUGF0aCIsImV4aXN0c1N5bmMiLCJwcm9taXNlcyIsInJlYWRGaWxlIiwicmVwbGFjZSIsImdsb2JJZ25vcmUiLCJmaXhQcmlzbWFFbnZGaWxlcyIsImVudkZpbGVzIiwiZmciLCJnbG9iIiwiZG90IiwiY3dkIiwiaWdub3JlIiwiZW52RmlsZSIsImVudkZpbGVQYXRoIiwicmVzb2x2ZSIsImZpeFRlc3REaXJlY3Rvcmllc1VwZGF0aW5nUGFja2FnZUpzb24iLCJwYWNrYWdlRGlyUGF0aHMiLCJQcm9taXNlIiwiYWxsIiwibWFwIiwibmV3VGVzdERpclBhdGgiLCJwYWNrYWdlRGlyUGF0aCIsIm9sZFRlc3REaXJOYW1lIiwib2xkVGVzdERpclBhdGgiLCJyZW5hbWUiLCJyZXBsYWNlQWxsIiwicHJvbWlzZVBvb2wiLCJQcm9taXNlUG9vbCIsImZpeFR5cGVEZWZpbml0aW9ucyIsImNvbmZpZ3NJbmNsdWRpbmdDaGlsZHJlbiIsImxpYlR5cGVEaXJQYXRoIiwic3JjVHlwZURpclBhdGgiLCJpc1Jvb3QiLCJkb2VzQ29udGFpbnNTdWJQYWNrYWdlSnNvbnMiLCJ1bmRlZmluZWQiLCJkaXJlbnRzIiwiaWdub3JlRW5vZW50QXN5bmMiLCJyZWFkZGlyIiwid2l0aEZpbGVUeXBlcyIsImRpcmVudCIsImRpck5hbWUiLCJzbGljZSIsImhhc1R5cGVEZWNsYXJhdGlvbkV4dGVuc2lvbiIsImVuZHNXaXRoIiwicGFja2FnZU5hbWUiLCJpbmNsdWRlcyIsImhhc0xpYnJhcnkiLCJzb21lIiwicGFja2FnZUpzb24iLCJkZXBlbmRlbmNpZXMiLCJkZXZEZXBlbmRlbmNpZXMiLCJpc0ZpbGUiLCJta2RpciIsInJ1biIsInJlY3Vyc2l2ZSIsImlzRGlyZWN0b3J5IiwiZnNVdGlsIiwicmVhZEZpbGVJZ25vcmluZ0Vycm9yIiwiZ2VuZXJhdGVGaWxlIiwiY29udGVudCIsImRpcm5hbWUiLCJmaXhUeXBvcyIsInBhY2thZ2VDb25maWciLCJkb2NGaWxlcyIsImxlbmd0aCIsIm1kRmlsZSIsImZpeFR5cG9zSW5UZXh0IiwicmVwbGFjZVdpdGhDb25maWciLCJ0c0ZpbGVzIiwidHNGaWxlIiwiZml4VHlwb3NJbkNvZGUiLCJ0ZXh0QmFzZWRGaWxlcyIsImZpbGUiLCJwcm9taXNlQWxsIiwicHJvcE5hbWUiLCJiZWZvcmUiLCJhZnRlciIsIk9iamVjdCIsImVudHJpZXMiLCJ3YmZ5SnNvbiIsInR5cG9zIiwiZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucyIsImFsbENvbmZpZ3MiLCJhZ2VudHNFeHRyYVBhdGgiLCJleHRyYUNvbnRlbnQiLCJwYWNrYWdlTWFuYWdlciIsImlzQnVuIiwiYmFzZUNvbnRlbnQiLCJkZXNjcmlwdGlvbiIsImMiLCJkZXBlbmRpbmciLCJnZW5JMThuVHMiLCJuZXh0IiwidHJpbSIsImdlbmVyYXRlQ2xhdWRlQ29udGVudCIsImZpbGVOYW1lIiwidG9rZW4iLCJwcm9jZXNzIiwiZW52IiwiR0hfQk9UX1BBVCIsIlBVQkxJQ19HSF9CT1RfUEFUIiwiR0hfVE9LRU4iLCJHSVRIVUJfVE9LRU4iLCJoYXNHaXRIdWJUb2tlbiIsIm9jdG9raXQiLCJPY3Rva2l0IiwiYXV0aCIsImdpdEh1YlV0aWwiLCJnZXRPcmdBbmROYW1lIiwidXJsT3JGdWxsTmFtZSIsInVybFdpdGhvdXRQcm90b2NvbCIsInNwbGl0IiwiYXQiLCJuYW1lcyIsInNwYXduU3luYyIsImNvbW1hbmQiLCJhcmdzIiwicmV0cnkiLCJuZXdDbWQiLCJuZXdBcmdzIiwiZ2V0U3Bhd25TeW5jQXJncyIsImNoaWxkX3Byb2Nlc3MiLCJzdGF0dXMiLCJzcGF3blN5bmNXaXRoU3RyaW5nUmVzdWx0Iiwic3RkaW8iLCJwcm9jIiwic3RkZXJyIiwidG9TdHJpbmciLCJzIiwic3Rkb3V0IiwiUEFUSCIsIkJFUlJZX0JJTl9GT0xERVIiLCJBU0RGX0RJUiIsInNoZWxsIiwiY29udmVydFZlcnNpb25JbnRvTnVtYmVyIiwidmVyc2lvbiIsIm51bWJlcnMiLCJOdW1iZXIiLCJmaWx0ZXIiLCJudW0iLCJpc05hTiIsInZlcnNpb25OdW1iZXIiLCJkaXZpc29yIiwiUFlUSE9OX1ZFUlNJT04iLCJKQVZBX1ZFUlNJT04iLCJCTElUWl9WRVJTSU9OIiwiTkVYVF9WRVJTSU9OIiwiZ2VuZXJhdGVUb29sVmVyc2lvbnMiLCJ2ZXJzaW9uc1RleHQiLCJkdXBsaWNhdGFibGVMaW5lcyIsImxpbmUiLCJDT1JFX1RPT0xTIiwiaGFzIiwic29ydCIsInN0YXJ0c1dpdGgiLCJsaW5lcyIsIlNldCIsImRvZXNDb250YWluc1BvZXRyeUxvY2siLCJyZXNwb25zZSIsImZldGNoIiwianNvbiIsInBvZXRyeVZlcnNpb24iLCJ1cGRhdGVWZXJzaW9uIiwiZmlyZWJhc2UiLCJkb2VzQ29udGFpbnNQYWNrYWdlSnNvbiIsImJ1blZlcnNpb24iLCJvcmdhbml6YXRpb24iLCJyZXBvc2l0b3J5IiwicmVxdWVzdCIsIm93bmVyIiwicmVwbyIsImRhdGEiLCJ0YWdfbmFtZSIsImluZGV4IiwibGFzdEluZGV4T2YiLCJ2ZXJzaW9uTnVtYmVyVGV4dCIsInRlc3QiLCJnZXRMYXRlc3RWZXJzaW9uRnJvbVRhZ09uR2l0SHViIiwicHJlZml4IiwiREVQUkVDQVRFRF9WRVJTSU9OX1BSRUZJWEVTIiwidmVyc2lvblBhdGgiLCJybSIsImZvcmNlIiwidG9vbFZlcnNpb25zUGF0aCIsImNvcmUiLCJ0b29sTmFtZSIsIm5ld1ZlcnNpb24iLCJoZWFkIiwiZmluZEluZGV4IiwibCIsIm5ld0xpbmUiLCJzcGxpY2UiLCJvdmVyd3JpdGVNZXJnZSIsImRlc3RpbmF0aW9uQXJyYXkiLCJzb3VyY2VBcnJheSIsImNvbWJpbmVNZXJnZSIsInRhcmdldCIsInNvdXJjZSIsImRlc3RpbmF0aW9uIiwiaXRlbSIsImNsb25lVW5sZXNzT3RoZXJ3aXNlU3BlY2lmaWVkIiwiaXNNZXJnZWFibGVPYmplY3QiLCJtZXJnZSIsInB1c2giLCJnZW5lcmF0ZUJpb21lSnNvbmMiLCJuZXdTZXR0aW5ncyIsInJvb3QiLCIkc2NoZW1hIiwiZXh0ZW5kcyIsIm9sZFNldHRpbmdzIiwiSlNPTiIsInBhcnNlIiwiYXJyYXlNZXJnZSIsInN0cmluZ2lmeSIsImdlbmVyYXRlQnVuZmlnVG9tbCIsInJlYWRGaWxlU3luYyIsInVzZXJDb250ZW50SGVhZGVyIiwidXNlckNvbnRlbnRIZWFkZXJSZWdleCIsInNlcGFyYXRvciIsImRlZmF1bHRIZWFkVXNlckNvbnRlbnQiLCJkZWZhdWx0VGFpbFVzZXJDb250ZW50IiwiaWdub3JlRmlsZVV0aWwiLCJzZXBhcmF0b3JQcmVmaXgiLCJyZWFkR2l0aWdub3JlV2l0aG91dFNlcGFyYXRvcnMiLCJsYXN0SGVhZGVySW5kZXgiLCJnZXRJbmRleE9mVGFpbFVzZXJDb250ZW50SGVhZGVyIiwiZ2V0SGVhZFVzZXJDb250ZW50IiwiaW5kZXhPZiIsImdldFRhaWxVc2VyQ29udGVudCIsImlzQmVycnlaZXJvSW5zdGFsbEVuYWJsZWQiLCJsYXN0SW5kZXgiLCJnZW5lcmF0ZURvY2tlcmlnbm9yZSIsImV4dGVuc2lvbnMiLCJjb2RlV2l0aDJJbmRlbnRTaXplIiwiY29kZVdpdGg0SW5kZW50U2l6ZSIsIm1hcmtkb3duTGlrZSIsImVzbGludCIsInByZXR0aWVyIiwiZ2VuZXJhdGVFeHRlbnNpb25zIiwiZ2VuZXJhdGVFZGl0b3Jjb25maWciLCJnZW5lcmF0ZUVzbGludHJjIiwiZXNsaW50QmFzZSIsImRlZmF1bHRDb25maWciLCJoYXZlX2Z1biIsImNvZGVfcmV2aWV3IiwiZGlzYWJsZSIsImNvbW1lbnRfc2V2ZXJpdHlfdGhyZXNob2xkIiwibWF4X3Jldmlld19jb21tZW50cyIsInB1bGxfcmVxdWVzdF9vcGVuZWQiLCJoZWxwIiwic3VtbWFyeSIsImlnbm9yZV9wYXR0ZXJucyIsImdlbmVyYXRlR2VtaW5pQ29uZmlnIiwiY29uZmlnRmlsZVBhdGgiLCJzdHlsZWd1aWRlRmlsZVBhdGgiLCJuZXdDb25maWciLCJjbG9uZURlZXAiLCJvbGRDb25maWciLCJ5YW1sIiwibG9hZCIsInlhbWxDb250ZW50IiwiZHVtcCIsImxpbmVXaWR0aCIsIm5vQ29tcGF0TW9kZSIsInN0eWxlcyIsInJlbW92ZUdlbWluaVNldHRpbmdzIiwiZXh0IiwiZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzIiwiZGVmYXVsdE5hbWVzIiwiZ2VuZXJhdGVHaXRpZ25vcmUiLCJyb290Q29uZmlnIiwiaGVhZFVzZXJDb250ZW50IiwidGFpbFVzZXJDb250ZW50IiwiZG9lc0NvbnRhaW5zR2VtZmlsZSIsImRvZXNDb250YWluc0dvTW9kIiwiYmFzZW5hbWUiLCJkb2VzQ29udGFpbnNQb21YbWwiLCJkb2VzQ29udGFpbnNQdWJzcGVjWWFtbCIsImRvZXNDb250YWluc1RlbXBsYXRlWWFtbCIsImJsaXR6IiwicHJpc21hIiwicGxheXdyaWdodFRlc3QiLCJyZWFjdE5hdGl2ZSIsInN0b3J5Ym9vayIsImxpdGVzdHJlYW0iLCJnZW5lcmF0ZWQiLCJyZWFkQ2FjaGUiLCJ1cmwiLCJyZXNwb25zZVRleHQiLCJ0ZXh0Iiwib2siLCJ3cml0ZUNhY2hlIiwib3MiLCJob21lZGlyIiwic3RhdCIsIkRhdGUiLCJub3ciLCJtdGltZU1zIiwiZ2V0TGF0ZXN0Q29tbWl0SGFzaCIsImNvbW1pdHMiLCJwZXJfcGFnZSIsInNoYSIsIkVzbGludFV0aWwiLCJnZXRMaW50Rml4U3VmZml4IiwiZG9lc0NvbnRhaW5zSnN4T3JUc3giLCJqc0NvbW1vbkRlcHMiLCJ0c0NvbW1vbkRlcHMiLCJyZWFjdENvbW1vbkRlcHMiLCJlc2xpbnREZXBzIiwiZ2VuZXJhdGVQYWNrYWdlSnNvbiIsInNraXBBZGRpbmdEZXBzIiwianNvblRleHQiLCJqc29uT2JqIiwic2NyaXB0cyIsInBlZXJEZXBlbmRlbmNpZXMiLCJhdXRob3IiLCJpc1dpbGxCb29zdGVyQ29uZmlncyIsImRlcHMiLCJ2YWx1ZXMiLCJkZXAiLCJyZW1vdmVEZXByZWNhdGVkU3R1ZmYiLCJrZXkiLCJ2YWx1ZSIsImdlbmVyYXRlU2NyaXB0cyIsInByZXR0aWZ5IiwiZXhpc3RpbmdDb250ZW50Iiwib3JpZ2luYWxDb250ZW50IiwiZ2VuZXJhdGVQcmV0dGllclN1ZmZpeCIsInBvZXRyeURldkRlcGVuZGVuY2llcyIsInByZXBhcmUiLCJwb3N0aW5zdGFsbCIsImlzUHVibGljUmVwbyIsImlzUmVmZXJyZWRCeU90aGVyUmVwbyIsInByZXBhY2siLCJwb3N0cGFjayIsInNlbWFudGljUmVsZWFzZSIsIndvcmtzcGFjZXMiLCJBcnJheSIsImlzQXJyYXkiLCJ3b3Jrc3BhY2UiLCJnbG9iU3luYyIsIndiIiwiZG9lc0NvbnRhaW5zSmF2YVNjcmlwdCIsImRvZXNDb250YWluc0phdmFTY3JpcHRJblBhY2thZ2VzIiwiZG9lc0NvbnRhaW5zVHlwZVNjcmlwdCIsImRvZXNDb250YWluc1R5cGVTY3JpcHRJblBhY2thZ2VzIiwicHJpdmF0ZSIsImxpY2Vuc2UiLCJwdWJsaXNoQ29uZmlnIiwiYWNjZXNzIiwibWFpbiIsInJlc29sdXRpb25zIiwibGludCIsImNsZWFudXAiLCJkaXJzIiwiZGlyIiwiZm9ybWF0IiwicHl0aG9uRmlsZXMiLCJkaXJOYW1lU2V0IiwicHl0aG9uRmlsZSIsImZpcnN0Iiwic2Vjb25kIiwiYWRkIiwic2l6ZSIsImRpck5hbWVzU3RyIiwiZCIsImtleXMiLCJwYWNrYWdlTmFtZXMiLCJpc1dvcmtzcGFjZVBhY2thZ2UiLCJjb21taXRIYXNoIiwidXBkYXRlUHJpdmF0ZVBhY2thZ2VzIiwibmV3SnNvblRleHQiLCJvbGRBbmROZXdTY3JpcHROYW1lcyIsIm9sZE5hbWUiLCJuZXdOYW1lIiwiZmlsZXMiLCJmaXhTY3JpcHROYW1lcyIsInR5cGVjaGVjayIsIm9sZFRlc3QiLCJweXJpZ2h0IiwicHJlQ29tbWl0IiwicHJlUHVzaCIsInByZVB1c2hGb3JMYWIiLCJwcmVQdXNoRm9yTGFiRXhjZXB0QWRtaW4iLCJwb3N0TWVyZ2UiLCJnZW5lcmF0ZUh1c2t5cmNVcGRhdGluZ1BhY2thZ2VKc29uIiwicGFja2FnZUpzb25QYXRoIiwicHJlQ29tbWl0RmlsZVBhdGgiLCJ0b0xvY2FsZUxvd2VyQ2FzZSIsIm1vZGUiLCJwb3N0TWVyZ2VDb21tYW5kIiwiZ2VuZXJhdGVQb3N0TWVyZ2VDb21tYW5kcyIsInBvc3RNZXJnZUNvbW1hbmRzIiwicmF3IiwiaW5zdGFsbENvbW1hbmQiLCJybU5leHREaXJlY3RvcnkiLCJjcmVhdGVUYXNrT3B0aW9ucyIsInJ1bm5lciIsImV4dGVuc2lvbiIsInByZXR0aWVyQ29udGVudCIsImJpb21lQ29udGVudCIsImdlbmVyYXRlSWRlYVNldHRpbmdzIiwiY29tbWFuZHMiLCJnZW5lcmF0ZUxlZnRob29rVXBkYXRpbmdQYWNrYWdlSnNvbiIsIm1rZGlyU3luYyIsInNyY0RpcmVjdG9yaWVzIiwibm9kZSIsImdlbmVyYXRlTGludHN0YWdlZHJjIiwicGFja2FnZVByZWZpeCIsImdldEVzbGludEtleSIsInBhY2thZ2VzRmlsdGVyIiwiZ2V0RXNsaW50RmlsdGVyRm9yUHJldHRpZXIiLCJnZXRTcmNEaXJzIiwiZ2VuZXJhdGVOZXh0Q29uZmlnSnNvbiIsImZpbmQiLCJwIiwiXyIsInNldHRpbmdzVGV4dCIsImdlbmVyYXRlUHJldHRpZXJpZ25vcmUiLCJnaXRpZ25vcmVGaWxlUGF0aCIsImdpdGlnbm9yZUNvbnRlbnQiLCJhZGRpdGlvbmFsQ29udGVudCIsInZlbnZQYXRoIiwidmVudiIsImdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24iLCJnZW5lcmF0ZVJlYWRtZSIsImluc2VydEJhZGdlIiwiZmlsZU5hbWVzIiwicmVhZGRpclN5bmMiLCJiYWRnZU5hbWUiLCJ0b1VwcGVyQ2FzZSIsImJhZGdlIiwicmVhZG1lIiwiaSIsImdlbmVyYXRlUmVsZWFzZXJjIiwic2V0dGluZ3MiLCJwbHVnaW5zIiwicGx1Z2luIiwicHJlc2V0IiwiZmFpbENvbW1lbnQiLCJfMSIsInN1Y2Nlc3NDb21tZW50IiwiXzIiLCJjbGVhbk9sZENvbmZpZyIsInN1Y2Nlc3NDb21tZW50Q29uZGl0aW9uIiwiZmFpbENvbW1lbnRDb25kaXRpb24iLCJsYWJlbHMiLCJyZWxlYXNlZExhYmVscyIsImdlbmVyYXRlUmVub3ZhdGVKc29uIiwicGFja2FnZVJ1bGVzIiwicnVsZSIsIm1hdGNoUGFja2FnZU5hbWVzIiwiZW5hYmxlZCIsInNvcnRLZXlzIiwib2JqIiwia2V5QW5kVmFsdWVzIiwia2V5MSIsImtleTIiLCJsb2NhbGVDb21wYXJlIiwicm9vdEpzb25PYmoiLCJjb21waWxlck9wdGlvbnMiLCJtb2R1bGUiLCJtb2R1bGVSZXNvbHV0aW9uIiwianN4IiwiYWx3YXlzU3RyaWN0Iiwic3RyaWN0Iiwic2tpcExpYkNoZWNrIiwiYWxsb3dTeW50aGV0aWNEZWZhdWx0SW1wb3J0cyIsImVzTW9kdWxlSW50ZXJvcCIsInJlc29sdmVKc29uTW9kdWxlIiwiZGVjbGFyYXRpb24iLCJzb3VyY2VNYXAiLCJpbXBvcnRIZWxwZXJzIiwiZXJhc2FibGVTeW50YXhPbmx5Iiwib3V0RGlyIiwidHlwZVJvb3RzIiwiZXhjbHVkZSIsImluY2x1ZGUiLCJzdWJKc29uT2JqIiwiZ2VuZXJhdGVUc2NvbmZpZyIsImRvZXNDb250YWluc0pzeE9yVHN4SW5QYWNrYWdlcyIsImlzRXNtUGFja2FnZSIsImV4cGVyaW1lbnRhbERlY29yYXRvcnMiLCJleGNsdWRlRmlsZVBhdHRlcm5zIiwiZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyIsImV4Y2x1ZGVGaWxlUGF0dGVybiIsImV4Y2x1ZGVTZXR0aW5nIiwid29ya2Zsb3dzIiwib24iLCJwdWxsX3JlcXVlc3QiLCJicmFuY2hlcyIsImNvbmN1cnJlbmN5IiwiZ3JvdXAiLCJqb2JzIiwidXNlcyIsInJlbGVhc2UiLCJ3YmZ5Iiwid29ya2Zsb3dfZGlzcGF0Y2giLCJwdWxsX3JlcXVlc3RfdGFyZ2V0IiwidHlwZXMiLCJzeW5jIiwiaXNzdWVzIiwic2VjcmV0cyIsIkRJU0NPUkRfV0VCSE9PS19VUkwiLCJHSF9QUk9KRUNUX1VSTCIsIndpdGgiLCJsYWJlbGVkIiwiZ2VuZXJhdGVXb3JrZmxvd3MiLCJ3b3JrZmxvd3NQYXRoIiwic2VtYW50aWNZbWxQYXRoIiwiZmlsZU5hbWVTZXQiLCJraW5kIiwid3JpdGVXb3JrZmxvd1lhbWwiLCJtb3ZlVG9Cb3R0b20iLCJqb2IiLCJub3JtYWxpemVKb2IiLCJzY2hlZHVsZSIsImJyYW5jaCIsInNldFNjaGVkdWxlIiwibWlncmF0ZVdvcmtmbG93Iiwid3JpdGVZYW1sIiwicGFyYW1zIiwic3luY19wYXJhbXNfd2l0aG91dF9kZXN0IiwibnBtIiwic2VydmVyX3VybCIsIm1pZ3JhdGVKb2IiLCJuZXdTZWNyZXRzIiwiaW5jbHVzaXZlTWluSG91ckpzdCIsImV4Y2x1c2l2ZU1heEhvdXJKc3QiLCJtaW51dGVVdGMiLCJob3VyVXRjIiwiY3JvbiIsImlzSW50ZWdlciIsImhvdXJKc3QiLCJNYXRoIiwiZmxvb3IiLCJyYW5kb20iLCJ5YW1sVGV4dCIsImdlbmVyYXRlWWFybnJjWW1sIiwieWFybnJjWW1sUGF0aCIsImN1cnJlbnRWZXJzaW9uIiwibGF0ZXN0VmVyc2lvbiIsInZlcnNpb25zSnNvbiIsImdldExhdGVzdFZlcnNpb24iLCJnZXRNYWpvck51bWJlciIsInJlbGVhc2VzUGF0aCIsInlhcm5yY1BhdGgiLCJkZWZhdWx0U2VtdmVyUmFuZ2VQcmVmaXgiLCJub2RlTGlua2VyIiwibm1Nb2RlIiwiY29tcHJlc3Npb25MZXZlbCIsImluamVjdEVudmlyb25tZW50RmlsZXMiLCJlbmFibGVHbG9iYWxDYWNoZSIsIm9yaWdpbmFsTGVuZ3RoIiwicGx1Z2luUGF0aCIsIm1ham9yIiwic2V0dXBMYWJlbHMiLCJzZXR1cExhYmVsIiwiZGVsZXRlTGFiZWwiLCJ3YXJuIiwiY29sb3IiLCJkZXByZWNhdGVkU2VjcmV0TmFtZXMiLCJzZXR1cFNlY3JldHMiLCJwYXJzZWQiLCJkb3RlbnYiLCJzZWNyZXROYW1lIiwic2VjcmV0X25hbWUiLCJrZXlfaWQiLCJrZXlJZCIsInNvZGl1bSIsInJlYWR5Iiwic2VjcmV0IiwicmF3S2V5IiwiZnJvbV9iYXNlNjQiLCJiYXNlNjRfdmFyaWFudHMiLCJPUklHSU5BTCIsInJhd1NlYyIsImZyb21fc3RyaW5nIiwiZW5jQnl0ZXMiLCJjcnlwdG9fYm94X3NlYWwiLCJlbmNCYXNlNjQiLCJ0b19iYXNlNjQiLCJlbmNyeXB0ZWRfdmFsdWUiLCJzZXR1cEdpdEh1YlNldHRpbmdzIiwid2l0aFJldHJ5IiwiYWxsb3dfbWVyZ2VfY29tbWl0IiwiYWxsb3dfc3F1YXNoX21lcmdlIiwiYWxsb3dfcmViYXNlX21lcmdlIiwiZGVsZXRlX2JyYW5jaF9vbl9tZXJnZSIsInNxdWFzaF9tZXJnZV9jb21taXRfdGl0bGUiLCJzcXVhc2hfbWVyZ2VfY29tbWl0X21lc3NhZ2UiLCJoZWFkZXJzIiwiYWxsb3dfYXV0b19tZXJnZSIsInRlbXBsYXRlcyIsImdlbmVyYXRlR2l0SHViVGVtcGxhdGVzIiwiZGlzdGFuY2UiLCJ3YmZ5SnNvblNjaGVtYSIsInoiLCJvYmplY3QiLCJyZWNvcmQiLCJzdHJpbmciLCJvcHRpb25hbCIsImRvYyIsInRzIiwiZ2V0UGFja2FnZUNvbmZpZyIsImVzbVBhY2thZ2UiLCJwYWNrYWdlSnNvblRleHQiLCJ0eXBlIiwicmVsZWFzZUJyYW5jaGVzIiwicmVsZWFzZVBsdWdpbnMiLCJyZWxlYXNlcmNKc29uUGF0aCIsImZzcCIsImZsYXQiLCJyZXBvSW5mbyIsImdpdCIsInNpbXBsZUdpdCIsIm9yaWdpbiIsImdldFJlbW90ZXMiLCJyIiwicmVtb3RlVXJsIiwicmVmcyIsInJlcXVlc3RSZXBvSW5mbyIsIm1lc3NhZ2UiLCJmZXRjaFJlcG9JbmZvIiwibm9kZVZlcnNpb25Db250ZW50Iiwid2JmeUpzb25QYXRoIiwid2JmeUpzb25UZXh0IiwiZnVsbF9uYW1lIiwic2VwIiwiY29udGFpbnNBbnkiLCJkb2VzQ29udGFpbnNWc2NvZGVTZXR0aW5nc0pzb24iLCJnaXRodWIiLCJnZXRFc2xpbnRFeHRlbnNpb25CYXNlIiwicGF0dGVybiIsIm9yZyIsInJldCIsImFzc2lnbiIsImFyZ3YiLCJ5YXJncyIsInBvc2l0aW9uYWwiLCJkZXNjcmliZSIsImFycmF5IiwiZGVmYXVsdCIsImFsaWFzIiwic2tpcERlcHMiLCJ2ZXJib3NlIiwicm9vdERpclBhdGgiLCJwYXRocyIsInBhY2thZ2VzRGlyUGF0aCIsInN1YkRpclBhdGhzIiwiaWdub3JlRXJyb3JBc3luYyIsImFiYnJldmlhdGlvblByb21pc2UiLCJzdWJQYWNrYWdlQ29uZmlncyIsInN1YkRpclBhdGgiLCJhbGxQYWNrYWdlQ29uZmlncyIsInRoZW4iLCJidW5Mb2NrYlBhdGgiXSwibWFwcGluZ3MiOiJ5bUJBVU8sTUFBTUEsRUFBVSxJQVZ2QixNQUlFQyxXQUFBQSxHQUNFQyxLQUFLQyxXQUFZLEVBQ2pCRCxLQUFLRSxtQkFBb0IsQ0FDM0IsR0NXSyxNQUFNQyxFQUFTLElBaEJ0QixNQUNFLCtCQUFNQyxDQUEwQkMsRUFBY0MsR0FDeENSLEVBQVFHLFdBQ1ZNLFFBQVFDLEtBQUssYUFBYUgscUJBRTVCLFVBQ1FDLEdBQ1IsQ0FBRSxNQUFPRyxHQUNQRixRQUFRQyxLQUFLLHFCQUFxQkgsTUFBU0ksYUFBaUJDLE1BQVFELEVBQU1FLE1BQVFDLE9BQU9ILE1BQzNGLENBQ0lYLEVBQVFHLFdBQ1ZNLFFBQVFDLEtBQUssY0FBY0gsbUJBRS9CLEdDVEtRLGVBQWVDLEVBQWNDLEdBQ2xDLE9BQU9aLEVBQU9DLDBCQUEwQixnQkFBaUJTLFVBQ3ZELElBQUtFLEVBQU9DLHVCQUF3QixPQUVwQyxNQUFNQyxFQUFhRixFQUFPRyxXQUNwQkMsRUFBYUYsRUFFZkEsSUFBZUUsU0FDYkMsRUFBR0MsVUFBVUMsRUFBS0MsS0FBS1IsRUFBT1MsUUFBUyxjQUFlTCxJQUVoRSxDQ1ZPTixlQUFlWSxFQUFvQlYsR0FDeEMsT0FBT1osRUFBT0MsMEJBQTBCLHNCQUF1QlMsVUFDN0QsTUFBTWEsRUFBV0osRUFBS0MsS0FBS1IsRUFBT1MsUUFBUyx3QkFDM0MsSUFBS0osRUFBR08sV0FBV0QsR0FBVyxPQUU5QixNQUFNVCxRQUFtQkcsRUFBR1EsU0FBU0MsU0FBU0gsRUFBVSxRQUVsRFAsRUFBYUYsRUFBV2EsUUFBUSxjQUFlLDhEQUNqRGIsSUFBZUUsU0FFYkMsRUFBR1EsU0FBU1AsVUFBVUssRUFBVVAsSUFFMUMsQ0NsQk8sTUFBTVksRUFBYSxDQUN4QixxQkFDQSxjQUNBLHNCQUNBLHNCQUNBLGFBQ0EsY0FDQSxlQUNBLGFBQ0EsYUNBS2xCLGVBQWVtQixFQUFrQmpCLEdBQ3RDLE9BQU9aLEVBQU9DLDBCQUEwQixvQkFBcUJTLFVBQzNELE1BQU1vQixRQUFpQkMsRUFBR0MsS0FBSyxDQUFDLFFBQVMsV0FBWSxDQUFFQyxLQUFLLEVBQU1DLElBQUt0QixFQUFPUyxRQUFTYyxPQUFRUCxJQUMvRixJQUFLLE1BQU1RLEtBQVdOLEVBQVUsQ0FDOUIsTUFBTU8sRUFBY2xCLEVBQUttQixRQUFRMUIsRUFBT1MsUUFBU2UsR0FFM0NwQixTQURnQkMsRUFBR1MsU0FBU1csRUFBYSxTQUNwQlYsUUFDekIsc0NBQ0EsZ0RBRUlWLEVBQUdDLFVBQVVtQixFQUFhckIsRUFDbEMsR0FFSixDQ2pCT04sZUFBZTZCLEVBQXNDQyxHQUMxRCxPQUFPeEMsRUFBT0MsMEJBQTBCLHdDQUF5Q1MsZ0JBQ3pFK0IsUUFBUUMsSUFDWkYsRUFBZ0JHLElBQUlqQyxVQUNsQixNQUFNa0MsRUFBaUJ6QixFQUFLQyxLQUFLeUIsRUFBZ0IsUUFDakQsSUFBSyxNQUFNQyxJQUFrQixDQUFDLFlBQWEsU0FBVSxDQUNuRCxNQUFNQyxFQUFpQjVCLEVBQUtDLEtBQUt5QixFQUFnQkMsR0FDakQsVUFDUTdCLEVBQUdRLFNBQVN1QixPQUFPRCxFQUFnQkgsR0FDekMsTUFBTTlCLFFBQW1CRyxFQUFHUSxTQUFTQyxTQUFTUCxFQUFLQyxLQUFLeUIsRUFBZ0IsZ0JBQWlCLFFBQ25GN0IsRUFBYUYsRUFBV21DLFdBQVdILEVBQWdCLFFBQ3pELEdBQUloQyxJQUFlRSxFQUFZLGFBRXpCQyxFQUFHUSxTQUFTUCxVQUFVQyxFQUFLQyxLQUFLeUIsRUFBZ0IsZ0JBQWlCN0IsRUFDekUsQ0FBRSxNQUNBLENBRUosTUFJUixDQ3hCTyxNQUFNa0MsRUFBYyxJQUFJQyxFQ094QnpDLGVBQWUwQyxFQUNwQnhDLEVBQ0F5QyxHQUVBLE9BQU9yRCxFQUFPQywwQkFBMEIscUJBQXNCUyxVQUM1RCxNQUFNNEMsRUFBaUJuQyxFQUFLbUIsUUFBUTFCLEVBQU9TLFFBQVMsVUFDOUNrQyxFQUNKM0MsRUFBTzRDLFFBQVU1QyxFQUFPNkMsaUNBQThCQyxFQUFZdkMsRUFBS21CLFFBQVExQixFQUFPUyxRQUFTLE1BQU8sU0FFbEdzQyxRQUFnQkMsRUFBa0IsSUFBTTNDLEVBQUc0QyxRQUFRUCxFQUFnQixDQUFFUSxlQUFlLEtBQzFGLEdBQUtILEVBRUwsSUFBSyxNQUFNSSxLQUFVSixFQUFTLENBQzVCLE1BQU1LLEVBQVVELEVBQU83RCxLQUFLK0QsTUFBTSxHQUFHLEdBQy9CQyxFQUE4QkgsRUFBTzdELEtBQUtpRSxTQUFTLFNBQ3pELElBQUlDLEVBQWNGLEVBQThCRixFQUFVRCxFQUFPN0QsS0FDN0RrRSxFQUFZQyxTQUFTLFFBQ3ZCRCxFQUFjLElBQUlBLEVBQVl6QyxRQUFRLEtBQU0sUUFFOUMsTUFBTTJDLEVBQWFqQixFQUF5QmtCLEtBQ3pDM0QsR0FDQ0EsRUFBTzRELGFBQWFDLGVBQWVMLElBQWdCeEQsRUFBTzRELGFBQWFFLGtCQUFrQk4sSUFHekZMLEVBQU9ZLFVBQVlULEVBQ2pCSSxTQUVJckQsRUFBRzJELE1BQU16RCxFQUFLQyxLQUFLa0MsRUFBZ0JVLFVBQ25DZCxFQUFZMkIsSUFBSSxJQUNwQjVELEVBQUcrQixPQUFPN0IsRUFBS0MsS0FBS2tDLEVBQWdCUyxFQUFPN0QsTUFBT2lCLEVBQUtDLEtBQUtrQyxFQUFnQlUsRUFBUyxpQkFFOUVULFVBRUh0QyxFQUFHMkQsTUFBTXJCLEVBQWdCLENBQUV1QixXQUFXLFVBQ3RDNUIsRUFBWTJCLElBQUksSUFDcEI1RCxFQUFHK0IsT0FBTzdCLEVBQUtDLEtBQUtrQyxFQUFnQlMsRUFBTzdELE1BQU9pQixFQUFLQyxLQUFLbUMsRUFBZ0JRLEVBQU83RCxTQUc5RTZELEVBQU9nQixlQUFpQnhCLElBQW1CZSxVQUU5Q3JELEVBQUcyRCxNQUFNckIsRUFBZ0IsQ0FBRXVCLFdBQVcsVUFDdEM1QixFQUFZMkIsSUFBSSxJQUNwQmpCLEVBQWtCLElBQ2hCM0MsRUFBRytCLE9BQ0Q3QixFQUFLQyxLQUFLa0MsRUFBZ0JTLEVBQU83RCxLQUFNLGNBQ3ZDaUIsRUFBS0MsS0FBS21DLEVBQWdCLEdBQUdRLEVBQU83RCxnQkFLOUMsR0FFSixDQzFETyxNQUFNOEUsRUFBUyxDQUNwQiwyQkFBTUMsQ0FBc0IxRCxHQUMxQixJQUNFLGFBQWFOLEVBQUdRLFNBQVNDLFNBQVNILEVBQVUsT0FDOUMsQ0FBRSxNQUNBLENBRUosRUFDQSxrQkFBTTJELENBQWEzRCxFQUFrQjRELFNBQzdCbEUsRUFBR1EsU0FBU21ELE1BQU16RCxFQUFLaUUsUUFBUTdELEdBQVcsQ0FBRXVELFdBQVcsVUFDdkQ3RCxFQUFHUSxTQUFTUCxVQUFVSyxFQUFVNEQsRUFFeEMsR0NIS3pFLGVBQWUyRSxFQUFTQyxHQUM3QixPQUFPdEYsRUFBT0MsMEJBQTBCLFdBQVlTLFVBQ2xELE1BQU1XLEVBQVVpRSxFQUFjakUsUUFDeEJrRSxRQUFpQnhELEVBQUdDLEtBQUssVUFBVyxDQUFFQyxLQUFLLEVBQU1DLElBQUtiLEVBQVNjLE9BQVFQLElBQ3pFakMsRUFBUUcsV0FDVk0sUUFBUUMsS0FBSyxTQUFTa0YsRUFBU0MsNEJBQTRCbkUsS0FFN0QsSUFBSyxNQUFNb0UsS0FBVUYsRUFBVSxDQUM3QixNQUFNaEUsRUFBV0osRUFBS0MsS0FBS0MsRUFBU29FLFNBQzlCdkMsRUFBWTJCLElBQUluRSxVQUNwQixNQUFNeUUsUUFBZ0JsRSxFQUFHUSxTQUFTQyxTQUFTSCxFQUFVLFFBQ3JELElBQUlQLEVBQWEwRSxFQUFlUCxHQUNoQ25FLEVBQWEyRSxFQUFrQjNFLEVBQVlzRSxFQUFlLE9BQ3RESCxJQUFZbkUsU0FDUmdFLEVBQU9FLGFBQWEzRCxFQUFVUCxJQUcxQyxDQUVBLE1BQU00RSxRQUFnQjdELEVBQUdDLEtBQ3ZCLENBQ0UsOERBQ0EsMkVBRUYsQ0FBRUMsS0FBSyxFQUFNQyxJQUFLYixFQUFTYyxPQUFRUCxJQUVqQ2pDLEVBQVFHLFdBQ1ZNLFFBQVFDLEtBQUssU0FBU3VGLEVBQVFKLDhCQUE4Qm5FLEtBRTlELElBQUssTUFBTXdFLEtBQVVELEVBQVMsQ0FDNUIsTUFBTXJFLEVBQVdKLEVBQUtDLEtBQUtDLEVBQVN3RSxHQUM5Qi9FLFFBQW1CRyxFQUFHUSxTQUFTQyxTQUFTSCxFQUFVLFFBQ3hELElBQUlQLEVBQWE4RSxFQUFlaEYsR0FDaENFLEVBQWEyRSxFQUFrQjNFLEVBQVlzRSxFQUFlLE1BRXREeEUsSUFBZUUsU0FDYmdFLEVBQU9FLGFBQWEzRCxFQUFVUCxFQUN0QyxDQUVBLE1BQU0rRSxRQUF1QmhFLEVBQUdDLEtBQUssdUNBQXdDLENBQzNFQyxLQUFLLEVBQ0xDLElBQUtiLEVBQ0xjLE9BQVFQLElBRU5qQyxFQUFRRyxXQUNWTSxRQUFRQyxLQUFLLFNBQVMwRixFQUFlUCw4QkFBOEJuRSxLQUVyRSxJQUFLLE1BQU0yRSxLQUFRRCxFQUFnQixDQUNqQyxNQUFNeEUsRUFBV0osRUFBS0MsS0FBS0MsRUFBUzJFLEdBQzlCbEYsUUFBbUJHLEVBQUdRLFNBQVNDLFNBQVNILEVBQVUsUUFDeEQsSUFBSVAsRUFBYTBFLEVBQWU1RSxHQUNoQ0UsRUFBYTJFLEVBQWtCM0UsRUFBWXNFLEVBQWUsUUFFdER4RSxJQUFlRSxTQUNiZ0UsRUFBT0UsYUFBYTNELEVBQVVQLEVBQ3RDLE9BRU1rQyxFQUFZK0MsY0FFdEIsQ0FFTyxTQUFTUCxFQUFlUCxHQUM3QixPQUFPQSxFQUNKbEMsV0FBVyxrQkFBbUIsU0FDOUJBLFdBQVcsZ0JBQWlCLFVBQzVCQSxXQUFXLGdCQUFpQixTQUNqQyxDQUVBLFNBQVM2QyxFQUFlWCxHQUN0QixPQUFPQSxFQUNKbEMsV0FBVyxrQkFBbUIsV0FDOUJBLFdBQVcsZ0JBQWlCLFlBQzVCQSxXQUFXLGdCQUFpQixXQUNqQyxDQUVBLFNBQVMwQyxFQUFrQjNFLEVBQW9Cc0UsRUFBOEJZLEdBQzNFLElBQUssTUFBT0MsRUFBUUMsS0FBVUMsT0FBT0MsUUFBUWhCLEVBQWNpQixVQUFVQyxPQUFPOUQsS0FBTyxDQUFBLEdBQ2pGMUIsRUFBYUEsRUFBV2lDLFdBQVdrRCxFQUFRQyxHQUU3QyxJQUFLLE1BQU9ELEVBQVFDLEtBQVVDLE9BQU9DLFFBQVFoQixFQUFjaUIsVUFBVUMsUUFBUU4sSUFBYSxDQUFBLEdBQ3hGbEYsRUFBYUEsRUFBV2lDLFdBQVdrRCxFQUFRQyxHQUU3QyxPQUFPcEYsQ0FDVCxDQ3hGT04sZUFBZStGLEVBQTBCN0YsRUFBdUI4RixHQUNyRSxPQUFPMUcsRUFBT0MsMEJBQTBCLDRCQUE2QlMsVUFDbkUsSUFBS0UsRUFBTzRDLE9BQVEsT0FHcEIsTUFBTW1ELEVBQWtCeEYsRUFBS21CLFFBQVExQixFQUFPUyxRQUFTLG1CQUMvQ3VGLFFBQXFCNUIsRUFBT0Msc0JBQXNCMEIsR0FFbER4QixFQVFWLFNBQStCdkUsRUFBdUI4RixFQUE2QkUsR0FDakYsTUFBTUMsRUFBaUJqRyxFQUFPa0csTUFBUSxNQUFRLE9BQ3hDQyxFQUFjLHVDQUdabkcsRUFBTzRELGFBQWF0RSx3QkFDYlUsRUFBTzRELGFBQWF3QyxtQ0FDaEJILG1DQUtuQkgsRUFBV25DLEtBQU0wQyxHQUFNQSxFQUFFQyxVQUFVQyxXQUMvQix3UkFDQSw0UkFHMENOLHFHQUNKQSwrRkFDakNBLG9QQU1USCxFQUFXbkMsS0FBTTBDLEdBQU1BLEVBQUVDLFVBQVVFLE1BQy9CLGdJQUNBLE9BR0RuRSxXQUFXLFVBQVcsUUFDdEJvRSxPQUVILE9BQU9ULEVBQWVHLEVBQWMsT0FBU0gsRUFBYVMsT0FBU04sQ0FDckUsQ0ExQ29CTyxDQUFzQjFHLEVBQVE4RixFQUFZRSxHQUMxRCxJQUFLLE1BQU1XLElBQVksQ0FBQyxZQUFhLFlBQWEsYUFBYyxDQUM5RCxNQUFNaEcsRUFBV0osRUFBS21CLFFBQVExQixFQUFPUyxRQUFTa0csU0FDeENyRSxFQUFZMkIsSUFBSSxJQUFNRyxFQUFPRSxhQUFhM0QsRUFBVTRELEdBQzVELEdBRUosQ0NuQkEsTUFBTXFDLEVBQ0pDLFFBQVFDLElBQUlDLFlBQWNGLFFBQVFDLElBQUlFLG1CQUFxQkgsUUFBUUMsSUFBSUcsVUFBWUosUUFBUUMsSUFBSUksYUFDcEZDLElBQW1CUCxFQUNuQlEsRUFBVSxJQUFJQyxFQUFRLENBQ2pDQyxLQUFNVixJQWFELE1BQU1XLEVBQWEsSUFWMUIsTUFDRUMsYUFBQUEsQ0FBY0MsR0FDWixNQUFNQyxFQUFxQkQsRUFBY0UsTUFBTSxLQUFLQyxPQUM5Q0MsRUFBUUgsR0FBb0JDLE1BQU0sS0FHeEMsTUFBTyxDQUZLRSxHQUFPRCxJQUFHLElBQU8sR0FDaEJDLEdBQU9ELElBQUcsSUFBSzdHLFFBQVEsUUFBUyxLQUFPLEdBRXRELEdDYkssU0FBUytHLEVBQVVDLEVBQWlCQyxFQUFnQjFHLEVBQWEyRyxFQUFRLEdBQzlFLEVBQUcsQ0FDRCxNQUFPQyxFQUFRQyxFQUFTcEosR0FBV3FKLEVBQWlCTCxFQUFTQyxFQUFNMUcsR0FHbkUsR0FBbUIsSUFEUCtHLEVBQWNQLFVBQVVJLEVBQVFDLEVBQVNwSixHQUM3Q3VKLE9BQWMsS0FDeEIsU0FBV0wsR0FBUyxFQUN0QixDQUVPLFNBQVNNLEVBQTBCUixFQUFpQkMsRUFBZ0IxRyxHQUN6RSxNQUFPNEcsRUFBUUMsRUFBU3BKLEdBQVdxSixFQUFpQkwsRUFBU0MsRUFBTTFHLEdBQ25FdkMsRUFBUXlKLE1BQVEsT0FDaEIsTUFBTUMsRUFBT0osRUFBY1AsVUFBVUksRUFBUUMsRUFBU3BKLEdBQ2hEVyxFQUFRK0ksRUFBS0MsT0FBT0MsV0FBV2xDLE9BSXJDLE9BSEkvRyxHQUNGRixRQUFRRSxNQUFNLEdBQUd3SSxNQUFXQyxFQUFRcEcsSUFBSzZHLEdBQU0sSUFBSUEsTUFBTXBJLEtBQUssd0NBQXdDZCxLQUVqRytJLEVBQUtJLE9BQU9GLFdBQVdsQyxNQUNoQyxDQUVPLFNBQVMyQixFQUFpQkwsRUFBaUJDLEVBQWdCMUcsR0FDaEUsTUFBTXdGLEVBQU0sSUFBS0QsUUFBUUMsS0FVekIsT0FSSUEsRUFBSWdDLE1BQVFoQyxFQUFJaUMsbUJBQ2xCakMsRUFBSWdDLEtBQU9oQyxFQUFJZ0MsS0FBSy9ILFFBQVEsR0FBRytGLEVBQUlpQyxvQkFBcUIsS0FHdERqQyxFQUFJa0MsV0FDTmhCLEVBQU8sQ0FBQyxLQUFNLEtBQU0sR0FBR0QsS0FBV0MsRUFBS3hILEtBQUssUUFDNUN1SCxFQUFVLFFBRUwsQ0FDTEEsRUFDQUMsRUFDQSxDQUNFMUcsTUFDQXdGLE1BQ0FtQyxPQUFPLEVBQ1BULE1BQU8sV0FHYixDQzVDTyxTQUFTVSxFQUF5QkMsR0FFdkMsTUFBTUMsRUFBVUQsRUFDYnhCLE1BQU0sU0FDTjVGLElBQUlzSCxRQUNKQyxPQUFRQyxJQUFTRixPQUFPRyxNQUFNRCxJQUNqQyxJQUFJRSxFQUFnQixFQUNoQkMsRUFBVSxFQUNkLElBQUssTUFBTUgsS0FBT0gsRUFDaEJLLEdBQWlCRixFQUFNRyxFQUN2QkEsR0FBVyxJQUViLE9BQU9ELENBQ1QsQ0NiTyxNQUFNRSxFQUFpQixTQUNqQkMsRUFBZSxnQkFFZkMsRUFBZ0IsUUFDaEJDLEVBQWUsU0NPckJoSyxlQUFlaUssRUFBcUIvSixHQUN6QyxPQUFPWixFQUFPQywwQkFBMEIsdUJBQXdCUyxnQkFRbEVBLGVBQW9CRSxHQUNsQixJQUFLQSxFQUFPZ0ssYUFBYyxPQUUxQixNQUFNQyxFQUFvQmpLLEVBQU9nSyxhQUM5QnZELE9BQ0FrQixNQUFNLE1BQ041RixJQUFLbUksSUFDSixNQUFPNUssRUFBTTZKLEdBQVdlLEVBQUt6RCxPQUFPa0IsTUFBTSxPQUUxQyxNQUFPLEdBQUd3QyxFQUFXQyxJQUFJOUssR0FBUSxJQUFNLEtBQUtBLEtBQVE2SixNQUVyRGtCLE9BRUF0SSxJQUFLbUksR0FBU0EsRUFBS3pELFFBRW5CNkMsT0FBUVksSUFBVUEsRUFBS0ksV0FBVyxhQUMvQkMsRUFBUSxJQUFJLElBQUlDLElBQUlQLElBRTFCLEdBQUlqSyxFQUFPeUssdUJBQXdCLENBQ2pDLE1BQU1DLFFBQWlCQyxNQUFNLHFDQUN2QkMsUUFBY0YsRUFBU0UsT0FDdkJDLEVBQWdCRCxHQUFNbkwsTUFBTTBKLFFBQzlCMEIsR0FDRkMsRUFBY1AsRUFBTyxTQUFVTSxHQUVqQ0MsRUFBY1AsRUFBTyxTQUFVWixHQUFnQixFQUNqRCxDQUNJM0osRUFBT3NHLFVBQVV5RSxVQUNuQkQsRUFBY1AsRUFBTyxPQUFRWCxHQUFjLEdBRTdDLEdBQUk1SixFQUFPZ0wsd0JBQ1QsR0FBSWhMLEVBQU9rRyxNQUFPLENBQ2hCLE1BQU0rRSxRQW1DWm5MLGVBQStDb0wsRUFBc0JDLEdBQ25FLElBRUUsTUFJTWhDLFNBSmlCL0IsRUFBUWdFLFFBQVEsNENBQTZDLENBQ2xGQyxNQUFPSCxFQUNQSSxLQUFNSCxLQUVpQkksS0FBS0MsU0FDeEJDLEVBQVF0QyxFQUFRdUMsWUFBWSxLQUM1QkMsR0FBK0IsSUFBWEYsRUFBZXRDLEVBQVVBLEVBQVE5RixNQUFNb0ksRUFBUSxHQUV6RSxNQUFPLE1BQU1HLEtBQUtELEdBQXFCQSxPQUFvQjdJLENBQzdELENBQUUsTUFBT3BELEdBRVAsWUFEQUYsUUFBUUUsTUFBTSxtQ0FBb0NBLEVBRXBELENBQ0YsQ0FuRCtCbU0sQ0FBZ0MsVUFBVyxPQUNoRVosR0FBWUgsRUFBY1AsRUFBTyxNQUFPVSxFQUM5QyxLQUFPLENBQ0wsTUFBTTlCLEVBQVVaLEVBQTBCLE1BQU8sQ0FBQyxPQUFRLE9BQVEsV0FBWXZJLEVBQU9TLFNBQ3JGcUssRUFBY1AsRUFBTyxPQUFRcEIsRUFDL0IsQ0FHRixJQUFLLE1BQU0yQyxLQUFVQyxFQUE2QixDQUNoRCxNQUFNQyxFQUFjekwsRUFBS21CLFFBQVExQixFQUFPUyxRQUFTLElBQUlxTCxhQUNoRHpMLEVBQUdRLFNBQVNvTCxHQUFHRCxFQUFhLENBQUVFLE9BQU8sR0FDNUMsQ0FFQSxNQUFNQyxFQUFtQjVMLEVBQUttQixRQUFRMUIsRUFBT1MsUUFBUyx3QkFDL0M4SixFQUFNM0YsT0FBUyxFQUNsQnRDLEVBQVkyQixJQUFJLElBQU01RCxFQUFHUSxTQUFTUCxVQUFVNkwsRUFBa0I1QixFQUFNL0osS0FBSyxNQUFRLE9BQ2pGOEIsRUFBWTJCLElBQUksSUFBTTVELEVBQUdRLFNBQVNvTCxHQUFHRSxFQUFrQixDQUFFRCxPQUFPLFlBQzlENUosRUFBWStDLGFBQ2xCeUMsRUFBVSxPQUFRLENBQUMsU0FBVSxTQUFVLFNBQVU5SCxFQUFPUyxTQUN4RHFILEVBQVUsT0FBUSxDQUFDLFdBQVk5SCxFQUFPUyxRQUN4QyxDQTNEVTJMLENBQUtwTSxJQUVmLENBRUEsTUFBTW1LLEVBQWEsSUFBSUssSUFBSSxDQUFDLE9BQVEsU0FBVSxNQUFPLFdBQy9DdUIsRUFBOEIsQ0FBQyxPQUFRLE9BQVEsVUF3RHJELFNBQVNqQixFQUFjUCxFQUFpQjhCLEVBQWtCQyxFQUFvQkMsR0FBTyxHQUNuRixNQUFNZCxFQUFRbEIsRUFBTWlDLFVBQVdDLEdBQU1BLEVBQUU5RSxNQUFNLE9BQU8sS0FBTzBFLEdBQ3JESyxFQUFVLEdBQUdMLEtBQVlDLElBQy9CLElBQWMsSUFBVmIsRUFDRmxCLEVBQU1vQyxPQUFPSixFQUFPLEVBQUloQyxFQUFNM0YsT0FBUSxFQUFHOEgsT0FDcEMsQ0FDTCxNQUFNLENBQUd2RCxHQUFXb0IsRUFBTWtCLEdBQU85RCxNQUFNLE9BQ25DdUIsRUFBeUJvRCxHQUFjcEQsRUFBeUJDLEtBQ2xFb0IsRUFBTWtCLEdBQVNpQixFQUVuQixDQUNGLENDakZPLFNBQVNFLEVBQWtCQyxFQUF1QkMsR0FDdkQsT0FBT0EsQ0FDVCxDQUdPLFNBQVNDLEVBQWFDLEVBQWtCQyxFQUFrQmxPLEdBQy9ELE1BQU1tTyxFQUFjLElBQUlGLEdBRXhCLElBQUssTUFBT3ZCLEVBQU8wQixLQUFTRixFQUFPdkgsZUFDTjVDLElBQXZCb0ssRUFBWXpCLEdBQ2R5QixFQUFZekIsR0FBUzFNLEVBQVFxTyw4QkFBOEJELEVBQU1wTyxHQUN4REEsRUFBUXNPLGtCQUFrQkYsR0FDbkNELEVBQVl6QixHQUFTNkIsRUFBTU4sRUFBT3ZCLEdBQVEwQixFQUFNcE8sR0FDdENpTyxFQUFPdkosU0FBUzBKLElBQzFCRCxFQUFZSyxLQUFLSixHQUdyQixPQUFPRCxDQUNULENDWE9wTixlQUFlME4sRUFBbUJ4TixHQUN2QyxPQUFPWixFQUFPQywwQkFBMEIscUJBQXNCUyxVQUM1RCxJQUFJMk4sRUFBc0IsQ0FDeEJDLEtBQU0xTixFQUFPNEMsT0FDYitLLFFBQVMsMERBQ1RDLFFBQVMsQ0FBQyw4QkFFWixNQUFNak4sRUFBV0osRUFBS21CLFFBQVExQixFQUFPUyxRQUFTLGVBQzlDLElBQ0UsTUFBTVAsUUFBbUJHLEVBQUdRLFNBQVNDLFNBQVNILEVBQVUsUUFDbERrTixFQUFjQyxLQUFLQyxNQUFNN04sR0FDL0J1TixFQUFjSCxFQUFNeEwsSUFBSSxDQUFDMkwsRUFBYUksRUFBYUosR0FBYyxDQUFFTyxXQUFZcEIsR0FDakYsQ0FBRSxNQUNBLENBRUYsTUFBTXhNLEVBQWEwTixLQUFLRyxVQUFVUixTQUM1Qm5MLEVBQVkyQixJQUFJLElBQU1HLEVBQU9FLGFBQWEzRCxFQUFVUCxLQUU5RCxDQ0hPTixlQUFlb08sR0FBbUJsTyxHQUN2QyxPQUFPWixFQUFPQywwQkFBMEIscUJBQXNCUyxVQUM1RCxNQUFNYSxFQUFXSixFQUFLbUIsUUFBUTFCLEVBQU9TLFFBQVMsZUFDeEM4RCxFQUNKbEUsRUFBR08sV0FBV0QsSUFBYU4sRUFBRzhOLGFBQWF4TixFQUFVLFFBQVE4QyxTQUFTLGlCQWIzQyx1RUFURCw0RUF5QnRCbkIsRUFBWTJCLElBQUksSUFBTUcsRUFBT0UsYUFBYTNELEVBQVU0RCxLQUU5RCxDQ2pDQSxNQUFNNkosR0FBb0IsOEJBQ3BCQyxHQUF5Qix3Q0FDekJDLEdBQVksc0JBRVpDLEdBQXlCLEdBQUdILGtCQUdoQ0UsT0FFSUUsR0FBeUIsS0FDN0JKLGNBR1dLLEdBQWlCLENBQzVCSCxhQUNBSSxnQkFac0Isa0JBYXRCSCwwQkFDQUMsMEJBQ0Esb0NBQU1HLENBQStCaE8sR0FDbkMsSUFDRSxJQUFJNEQsUUFBZ0JsRSxFQUFHUSxTQUFTQyxTQUFTSCxFQUFVLFFBQ25ELE1BQU1pTyxFQUFrQkMsR0FBZ0N0SyxHQUl4RCxPQUhJcUssRUFBa0IsSUFDcEJySyxFQUFVQSxFQUFRbEIsTUFBTSxFQUFHdUwsRUFBa0IsSUFHN0NySyxFQUNHbEMsV0FBV2dNLEdBQXdCLElBQ25DaE0sV0FBVyw0QkFBNkIsSUFDeENBLFdBQVcsdUJBQXdCLFFBQ25Db0UsT0FBUyxJQUVoQixDQUFFLE1BQ0EsQ0FFSixFQUNBcUksa0JBQUFBLENBQW1CdkssR0FDakIsTUFBTWtILEVBQVFsSCxFQUFRd0ssUUFBUTlQLEtBQUt5UCxpQkFDbkMsT0FBYyxJQUFWakQsRUFDS2xILEVBQ0psQixNQUFNLEVBQUdrQixFQUFRd0ssUUFBUSxLQUFNdEQsR0FBUyxHQUN4Q3BKLFdBQVdnTSxHQUF3QixHQUFHRCxlQUVwQ0csRUFDVCxFQUNBUyxrQkFBQUEsQ0FBbUJ6SyxHQUNqQixNQUFNcUssRUFBa0JDLEdBQWdDdEssR0FDeEQsT0FBSXFLLEVBQWtCLEVBQ2JySyxFQUFRbEIsTUFBTXVMLEVBQWtCLEdBRWxDSixFQUNULEVBQ0EsK0JBQU1TLENBQTBCdE8sR0FDOUIsSUFFRSxhQURzQk4sRUFBR1EsU0FBU0MsU0FBU0gsRUFBVSxTQUN0QzhDLFNBQVMsaUJBQzFCLENBQUUsTUFDQSxPQUFPLENBQ1QsQ0FDRixHQUdGLFNBQVNvTCxHQUFnQ3RLLEdBQ3ZDLE1BQU1rSCxFQUFRbEgsRUFBUXdLLFFBQVFYLElBQ3hCYyxFQUFZM0ssRUFBUW1ILFlBQVkwQyxJQUN0QyxPQUFPYyxFQUFZekQsRUFBUXlELEdBQVksQ0FDekMsQ0NuRE9wUCxlQUFlcVAsR0FBcUJuUCxHQUN6QyxPQUFPWixFQUFPQywwQkFBMEIsdUJBQXdCUyxVQUM5RCxNQUFNYSxFQUFXSixFQUFLbUIsUUFBUTFCLEVBQU9TLFFBQVMsaUJBQzlDLEdBQUlULEVBQU9DLHVCQUF3QixDQUNqQyxNQUFNc0UsUUFBaUJILEVBQU9DLHNCQUFzQjFELElBQWMsR0FJNURQLEVBSGtCcU8sR0FBZUssbUJBQW1CdkssR0FaMUMsbUVBYVFrSyxHQUFlTyxtQkFBbUJ6SyxTQUdwRGpDLEVBQVkyQixJQUFJLElBQU1HLEVBQU9FLGFBQWEzRCxFQUFVUCxHQUM1RCxZQUNRQyxFQUFHUSxTQUFTb0wsR0FBR3RMLEVBQVUsQ0FBRXVMLE9BQU8sS0FHOUMsQ0MvQk8sTUFBTWtELEdBQWEsQ0FDeEJDLG9CQUFxQixDQUNuQixNQUNBLE1BQ0EsS0FDQSxNQUNBLE1BQ0EsTUFDQSxLQUNBLE1BQ0EsT0FDQSxRQUNBLFFBQ0EsTUFDQSxPQUNBLE1BQ0EsT0FDQSxLQUNBLE9BQ0EsS0FDQSxNQUNBLE1BQ0EsT0FDQSxNQUNBLE1BQ0FoRixPQUNGaUYsb0JBQXFCLENBQUMsS0FBTSxTQUFVLE9BQVEsTUFBTWpGLE9BQ3BEa0YsYUFBYyxDQUFDLE1BQU1sRixPQUNyQm1GLE9BQVEsQ0FBQyxNQUFPLE1BQU8sS0FBTSxNQUFPLE1BQU8sS0FBTSxNQUFPLE9BQU9uRixPQUMvRG9GLFNBQVUsQ0FDUixNQUNBLE1BQ0EsT0FDQSxLQUNBLE1BQ0EsTUFDQSxNQUNBLEtBQ0EsTUFDQSxPQUNBLFFBQ0EsUUFDQSxNQUNBLE1BQ0EsT0FDQSxLQUNBLE9BQ0EsTUFDQSxPQUNBLE9BQ0FwRixRQzFDRWpLLEdBQWEsMEhBUWpCc1AsR0FBbUJOLEdBQVdDLGtFQUk5QkssR0FBbUJOLEdBQVdFLGtFQUk5QkksR0FBbUJOLEdBQVdHLG9IQVF6QnpQLGVBQWU2UCxHQUFxQjNQLEdBQ3pDLE9BQU9aLEVBQU9DLDBCQUEwQix1QkFBd0JTLFVBQzlELE1BQU1hLEVBQVdKLEVBQUttQixRQUFRMUIsRUFBT1MsUUFBUyx1QkFDeEM2QixFQUFZMkIsSUFBSSxJQUFNRyxFQUFPRSxhQUFhM0QsRUFBVVAsTUFFOUQsQ0FFQSxTQUFTc1AsR0FBbUJOLEdBQzFCLE9BQU9BLEVBQVd4SyxPQUFTLEVBQUksT0FBT3dLLEVBQVc1TyxLQUFLLFNBQVcsTUFBTTRPLEVBQVcsS0FDcEYsQ0NqQ090UCxlQUFlOFAsR0FBaUI1UCxHQUNyQyxPQUFPWixFQUFPQywwQkFBMEIsbUJBQW9CUyxnQkFFcER3QyxFQUFZMkIsSUFBSSxJQUFNNUQsRUFBR1EsU0FBU29MLEdBQUcxTCxFQUFLbUIsUUFBUTFCLEVBQU9TLFFBQVMsa0JBQW1CLENBQUV5TCxPQUFPLFdBQzlGNUosRUFBWTJCLElBQUksSUFBTTVELEVBQUdRLFNBQVNvTCxHQUFHMUwsRUFBS21CLFFBQVExQixFQUFPUyxRQUFTLGlCQUFrQixDQUFFeUwsT0FBTyxXQUM3RjVKLEVBQVkyQixJQUFJLElBQU01RCxFQUFHUSxTQUFTb0wsR0FBRzFMLEVBQUttQixRQUFRMUIsRUFBT1MsUUFBUyxvQkFBcUIsQ0FBRXlMLE9BQU8sS0FFdEcsTUFBTXZMLEVBQVdKLEVBQUttQixRQUFRMUIsRUFBT1MsUUFBUyxxQkFDOUMsR0FBSVQsRUFBT2tHLFlBQ0g1RCxFQUFZMkIsSUFBSSxJQUFNNUQsRUFBR1EsU0FBU29MLEdBQUd0TCxFQUFVLENBQUV1TCxPQUFPLFVBSWhFLEdBQUtsTSxFQUFPNlAsV0FBWixDQUVBLElBRUUsV0FEeUJ4UCxFQUFHUSxTQUFTQyxTQUFTSCxFQUFVLFNBQ3hDOEMsU0FBUyxzQkFBdUIsTUFDbEQsQ0FBRSxNQUNBLE9BR0luQixFQUFZMkIsSUFBSSxJQUFNRyxFQUFPRSxhQUFhM0QsRUFBVSw0QkFBNEJYLEVBQU82UCxnQkFUckUsR0FXNUIsQ0NuQkEsTUFBTUMsR0FBZ0IsQ0FDcEJDLFVBQVUsRUFDVkMsWUFBYSxDQUNYQyxTQUFTLEVBQ1RDLDJCQUE0QixTQUM1QkMscUJBQXFCLEVBQ3JCQyxvQkFBcUIsQ0FDbkJDLE1BQU0sRUFDTkMsU0FBUyxFQUNUTixhQUFhLElBR2pCTyxnQkFBaUIsQ0FBQyxxQkFHYnpRLGVBQWUwUSxHQUFxQnhRLEdBQ3pDLE9BQU9aLEVBQU9DLDBCQUEwQix1QkFBd0JTLFVBQzlELElBQUtFLEVBQU80QyxPQUFRLE9BRXBCLE1BQU1uQyxFQUFVRixFQUFLbUIsUUFBUTFCLEVBQU9TLFFBQVMsV0FDdkNnUSxFQUFpQmxRLEVBQUttQixRQUFRakIsRUFBUyxjQUN2Q2lRLEVBQXFCblEsRUFBS21CLFFBQVFqQixFQUFTLGlCQUVqRCxJQUFJa1EsRUFBb0JDLEVBQVVkLElBQ2xDLElBQ0UsTUFBTTVQLFFBQW1CRyxFQUFHUSxTQUFTQyxTQUFTMlAsRUFBZ0IsUUFDeERJLEVBQVlDLEVBQUtDLEtBQUs3USxHQUM1QnlRLEVBQVlyRCxFQUFNeEwsSUFBSSxDQUFDNk8sRUFBV0UsRUFBV0YsR0FBWSxDQUFFM0MsV0FBWXBCLEdBQ3pFLENBQUUsTUFDQSxDQUdGLE1BQU1vRSxFQUFjRixFQUFLRyxLQUFLTixFQUFXLENBQ3ZDTyxXQUFXLEVBQ1hDLGNBQWMsRUFDZEMsT0FBUSxDQUNOLFNBQVUsaUJBTVJ2UCxRQUFRQyxJQUFJLENBQ2hCUSxFQUFZMkIsSUFBSSxJQUFNRyxFQUFPRSxhQUFhbU0sRUFBZ0JPLElBQzFEMU8sRUFBWTJCLElBQUksSUFBTUcsRUFBT0UsYUFBYW9NLEVBSmxCLHVCQU85QixDQ3RETzVRLGVBQWV1UixHQUFxQnJSLEdBQ3pDLE9BQU9aLEVBQU9DLDBCQUEwQix5QkFBMEJTLFVBQ2hFLElBQUtFLEVBQU80QyxPQUFRLE9BRXBCLE1BQU1uQyxFQUFVRixFQUFLbUIsUUFBUTFCLEVBQU9TLFFBQVMsV0FDdkNFLEVBQVdKLEVBQUttQixRQUFRakIsRUFBUyx1QkFDakNKLEVBQUdRLFNBQVNvTCxHQUFHdEwsRUFBVSxDQUFFdUwsT0FBTyxLQUU1QyxDQ0xBLE1BQU05TCxHQUFhLHVFQUtqQixJQUFJZ1AsR0FBV0MsdUJBQXdCRCxHQUFXRSx1QkFBd0JGLEdBQVdHLGNBQ3BGeE4sSUFBS3VQLEdBQVEsS0FBS0EsaUJBQ2xCOVEsS0FBSyw2Q0FLRFYsZUFBZXlSLEdBQXNCdlIsR0FDMUMsT0FBT1osRUFBT0MsMEJBQTBCLHdCQUF5QlMsVUFDL0QsTUFBTWEsRUFBV0osRUFBS21CLFFBQVExQixFQUFPUyxRQUFTLHdCQUN4QzZCLEVBQVkyQixJQUFJLElBQU1HLEVBQU9FLGFBQWEzRCxFQUFVUCxNQUU5RCxDQ2ZBLE1BQU1vUixHQUFlLENBQUMsVUFBVyxRQUFTLFFBQVMsWUFBYSxtQkFBb0IsUUFBUyxNQUFPLFFBZTdGMVIsZUFBZTJSLEdBQWtCelIsRUFBdUIwUixHQUM3RCxPQUFPdFMsRUFBT0MsMEJBQTBCLG9CQUFxQlMsVUFDM0QsTUFBTWEsRUFBV0osRUFBS21CLFFBQVExQixFQUFPUyxRQUFTLGNBQ3hDOEQsUUFBaUJILEVBQU9DLHNCQUFzQjFELElBQWMsR0FDbEUsSUFBSWdSLEVBQWtCbEQsR0FBZUssbUJBQW1CdkssR0FqQnRDLHNLQWtCbEIsTUFBTXFOLEVBQWtCbkQsR0FBZU8sbUJBQW1CekssR0FFcERzRCxFQUFRLElBQUkySixJQUNkeFIsRUFBTzZSLHFCQUNUaEssRUFBTTBGLEtBQUssUUFFVHZOLEVBQU84UixvQkFDVGpLLEVBQU0wRixLQUFLLE1BQ1hvRSxHQUFtQixHQUFHcFIsRUFBS3dSLFNBQVMvUixFQUFPUyxjQUd6Q1QsRUFBT2dMLHlCQUNUbkQsRUFBTTBGLEtBQUssUUFFVHZOLEVBQU9nUyxxQkFDVG5LLEVBQU0wRixLQUFLLFNBQ1hvRSxHQUFtQixrQ0FHakIzUixFQUFPaVMsMEJBQ1RwSyxFQUFNMEYsS0FBSyxVQUFXLGdCQUFpQixRQUN2Q29FLEdBQW1CLHFHQU1qQjNSLEVBQU9rUywyQkFDVFAsR0FBbUIsOEJBS2pCM1IsRUFBT3lLLHlCQUNUNUMsRUFBTTBGLEtBQUssVUFDWG9FLEdBQW1CLFlBSWpCM1IsRUFBT3NHLFVBQVU2TCxRQUNuQlIsR0FBbUIsdUJBSWpCM1IsRUFBT3NHLFVBQVVFLE1BQ25CcUIsRUFBTTBGLEtBQUssV0FFVG1FLEVBQVdwTCxVQUFVeUUsVUFBWS9LLEVBQU9zRyxVQUFVeUUsV0FDcERsRCxFQUFNMEYsS0FBSyxZQUVUdk4sRUFBT3NHLFVBQVU4TCxTQUNuQlQsR0FBbUIsZ0JBR2pCM1IsRUFBT3NHLFVBQVUrTCxpQkFDbkJWLEdBQW1CLG9CQUdqQkQsRUFBV3BMLFVBQVVnTSxhQUFldFMsRUFBT3NHLFVBQVVnTSxlQUN2RHpLLEVBQU0wRixLQUFLLGVBQ1hvRSxHQUFtQix3REFJakIzUixFQUFPc0csVUFBVWlNLFdBQ25CMUssRUFBTTBGLEtBQUssZUFFVHZOLEVBQU9zRyxVQUFVa00sYUFDbkJiLEdBQW1CLHFCQUlyQixJQUFJYyxFQUFZLEdBQ2hCLElBQUssTUFBTW5ULEtBQVF1SSxFQUFPLENBQ3hCLElBQUl0RCxRQUFpQm1PLEdBQVVwVCxJQUFVLEdBQ3pDLElBQUtpRixFQUFTLENBQ1osTUFBTW9PLEVBQU0sbURBQW1EclQsSUFDekRvTCxRQUFpQkMsTUFBTWdJLEdBQ3ZCQyxRQUFxQmxJLEVBQVNtSSxPQUNwQyxJQUFLbkksRUFBU29JLElBQU1GLEVBQWFuUCxTQUFTLHdCQUEwQm1QLEVBQWFuUCxTQUFTLFdBRXhGLFlBREFqRSxRQUFRRSxNQUFNLG1CQUFtQmlULEtBR25DcE8sRUFBVXFPLEVBQWFuTSxhQUNqQm5FLEVBQVkyQixJQUFJLElBQU04TyxHQUFXelQsRUFBTWlGLElBQ3pDeEYsRUFBUUcsV0FDVk0sUUFBUUMsS0FBSyxXQUFXa1QsSUFFNUIsQ0FDSUYsSUFBV0EsR0FBYSxNQUM1QkEsR0FBYWxPLEVBQVUsSUFDekIsT0FDWWtLLEdBQWVRLDBCQUEwQnRPLEtBQ25EOFIsRUFBWUEsRUFBVTFSLFFBQVEsZUFBZ0Isa0JBQWtCQSxRQUFRLFdBQVksWUFFbEZmLEVBQU9nUyxvQkFBc0JoUyxFQUFPaVMsMkJBQ3RDUSxFQUFZQSxFQUNUcFEsV0FBVyx5QkFBMEIsbUJBQ3JDQSxXQUFXLDRCQUE2QixzQkFDeENBLFdBQVcsbUNBQW9DLDZCQUMvQ0EsV0FBVywyQkFBNEIscUJBQ3ZDQSxXQUFXLHFCQUFzQixlQUNqQ0EsV0FBVyx1QkFBd0IsaUJBQ25DQSxXQUFXLGNBQWUsU0FDMUJBLFdBQVcsY0FBZSxTQUN6QnJDLEVBQU9pUywwQkFDVFEsRUFBWUEsRUFBVXBRLFdBQVcseUJBQTBCLHlCQUcvRG9RLEVBQVlBLEVBQVVwUSxXQUFXLGVBQWdCLFlBQzdDcVAsRUFBV3BMLFVBQVVnTSxhQUFldFMsRUFBT3NHLFVBQVVnTSxhQUFldFMsRUFBT2lTLDJCQUM3RVEsRUFBWUEsRUFBVXBRLFdBQVcsa0JBQW1CLG1CQUV0RCxNQUFNakMsRUFBYXVSLEVBQWtCLEtBQU9jLEVBQVliLFFBQ2xEdFAsRUFBWTJCLElBQUksSUFBTUcsRUFBT0UsYUFBYTNELEVBQVVQLEtBRTlELENBRUEsTUFBTUssR0FBVUYsRUFBS0MsS0FBS3dTLEVBQUdDLFVBQVcsU0FBVSxPQUFRLGFBRTFEblQsZUFBZWlULEdBQVd6VCxFQUFjaUYsU0FDaENsRSxFQUFHUSxTQUFTbUQsTUFBTXZELEdBQVMsQ0FBRXlELFdBQVcsVUFDeEM3RCxFQUFHUSxTQUFTUCxVQUFVQyxFQUFLQyxLQUFLQyxHQUFTbkIsR0FBT2lGLEVBQ3hELENBRUF6RSxlQUFlNFMsR0FBVXBULEdBQ3ZCLElBQ0UsTUFBTTRULFFBQWE3UyxFQUFHUSxTQUFTcVMsS0FBSzNTLEVBQUtDLEtBQUtDLEdBQVNuQixJQUN2RCxHQUFJNlQsS0FBS0MsTUFBUUYsRUFBS0csUUFBVSxNQUM5QixPQUVGLGFBQWFoVCxFQUFHUSxTQUFTQyxTQUFTUCxFQUFLQyxLQUFLQyxHQUFTbkIsR0FBTyxPQUM5RCxDQUFFLE1BQ0EsQ0FFSixDQ3BLT1EsZUFBZXdULEdBQW9CcEksRUFBc0JJLEdBQzlELElBQ0UsTUFBUUMsS0FBTWdJLFNBQWtCbk0sRUFBUWdFLFFBQVEsb0NBQXFDLENBQ25GQyxNQUFPSCxFQUNQSSxPQUNBa0ksU0FBVSxJQUVaLEdBQXVCLElBQW5CRCxFQUFRM08sT0FDVixNQUFNLElBQUlqRixNQUFNLHdCQUF3QnVMLEtBQWdCSSxLQUUxRCxPQUFPaUksRUFBUSxHQUFHRSxHQUNwQixDQUFFLE1BQU8vVCxHQUNQLE1BQU0sSUFBSUMsTUFBTSwrQkFBK0J1TCxLQUFnQkksTUFBU3pMLE9BQU9ILEtBQ2pGLENBQ0YsQ0NkTyxNQUFNZ1UsR0FBYSxDQUN4QkMsaUJBQWlCM1QsR0FDUkEsRUFBTzRULHFCQUF1QiwrQ0FBaUQsSUNnQnBGQyxHQUFlLENBQ25CLFNBQ0EsK0JBQ0EseUJBQ0EsbUNBQ0Esc0NBQ0Esd0JBQ0EsK0JBQ0EsV0FHSUMsR0FBZSxJQUFJRCxHQUFjLG9CQUFxQixxQ0FFdERFLEdBQWtCLENBQUMsc0JBQXVCLDRCQUE2QixnQ0FFdkVDLEdBQW9ELENBQ3hELGdDQUFpQyxDQUFDLGdDQUFpQyw0QkFBNkJILElBQ2hHLHNDQUF1QyxDQUNyQyxzQ0FDQSw0QkFDR0EsTUFDQUUsSUFFTCxnQ0FBaUMsQ0FBQyxnQ0FBaUMsNEJBQTZCRCxJQUNoRyxzQ0FBdUMsQ0FDckMsc0NBQ0EsNEJBQ0dBLE1BQ0FDLElBRUwsa0NBQW1DLENBQ2pDLGtDQUNBLHVCQUNBLHdCQUNHRCxNQUNBQyxLQUlBalUsZUFBZW1VLEdBQ3BCalUsRUFDQTBSLEVBQ0F3QyxHQUVBLE9BQU85VSxFQUFPQywwQkFBMEIsc0JBQXVCUyxnQkFLakVBLGVBQW9CRSxFQUF1QjBSLEVBQTJCd0MsR0FDcEUsTUFBTXZULEVBQVdKLEVBQUttQixRQUFRMUIsRUFBT1MsUUFBUyxnQkFDeEMwVCxRQUFpQjlULEVBQUdRLFNBQVNDLFNBQVNILEVBQVUsUUFDaER5VCxFQUFVdEcsS0FBS0MsTUFBTW9HLEdBQzNCQyxFQUFRQyxRQUFVRCxFQUFRQyxTQUFXLENBQUEsRUFDckNELEVBQVF2USxhQUFldVEsRUFBUXZRLGNBQWdCLENBQUEsRUFDL0N1USxFQUFRdFEsZ0JBQWtCc1EsRUFBUXRRLGlCQUFtQixDQUFBLEVBQ3JEc1EsRUFBUUUsaUJBQW1CRixFQUFRRSxrQkFBb0IsQ0FBQSxFQUN2RCxNQUFNck8sRUFBaUJqRyxFQUFPa0csTUFBUSxNQUFRLGFBcVVoRHBHLGVBQ0U0UixFQUNBMEMsR0FFdUIsb0JBQW5CQSxFQUFRRyxTQUNWSCxFQUFRRyxPQUFTLG9CQXVCbkIsVUFyQk9ILEVBQVFDLFFBQVEsNEJBQ2hCRCxFQUFRQyxRQUFRLGdDQUNoQkQsRUFBUUMsUUFBUSx5QkFDaEJELEVBQVFDLFFBQVEsNkJBQ2hCRCxFQUFRQyxRQUFRLDRCQUNoQkQsRUFBUXZRLGFBQW9CLGFBQzVCdVEsRUFBUXRRLGdCQUFnQixxQ0FDeEJzUSxFQUFRdFEsZ0JBQWdCLDJDQUN4QnNRLEVBQVF0USxnQkFBZ0IsdUNBQ3hCc1EsRUFBUXRRLGdCQUFnQixnQ0FDeEJzUSxFQUFRdFEsZ0JBQWdCLHNDQUN4QnNRLEVBQVF0USxnQkFBZ0IsaUNBQ3hCc1EsRUFBUXRRLGdCQUF1QixhQUUvQnNRLEVBQVF0USxnQkFBdUIsYUFDL0JzUSxFQUFRQyxRQUFRLHlCQUNoQkQsRUFBUUMsUUFBUSx5QkFDaEJELEVBQVFDLFFBQVEsd0JBQ2hCRCxFQUFRQyxRQUFRLHdCQUNoQkQsRUFBUUMsUUFBa0IsZ0JBQzFCRCxFQUFRQyxRQUFRLGNBQ2xCM0MsRUFBVzhDLHFCQUNkLElBQUssTUFBTUMsS0FBUWhQLE9BQU9pUCxPQUFPVixJQUMvQixJQUFLLE1BQU1XLEtBQU9GLFNBQ1RMLEVBQVF0USxnQkFBZ0I2USxTQUkvQnJTLEVBQVkyQixJQUFJLElBQU01RCxFQUFHUSxTQUFTb0wsR0FBRyxhQUFjLENBQUVDLE9BQU8sWUFHM0RrSSxFQUFRdFEsZ0JBQWdCLDJDQUN4QnNRLEVBQVF0USxnQkFBZ0Isb0NBQ3hCc1EsRUFBUXRRLGdCQUFnQix1QkFDakMsQ0E1V1E4USxDQUNKbEQsRUFDQTBDLEdBR0YsSUFBSyxNQUFPUyxFQUFLQyxLQUFVclAsT0FBT0MsUUFBUTBPLEVBQVFDLFNBRTNDUyxFQUFNclIsU0FBUyxlQUNsQjJRLEVBQVFDLFFBQVFRLEdBQU9DLEVBQU0vVCxRQUFRLGVBQWdCLElBQUlBLFFBQVEseUJBQTBCLEtBSS9GcVQsRUFBUUMsUUFBVS9HLEVBQU04RyxFQUFRQyxRQUFTVSxHQUFnQi9VLElBRXJELGlCQUFrQm9VLEVBQVFDLFVBQ3hCLGFBQWNELEVBQVFDLFVBQ3hCRCxFQUFRQyxRQUFRLGdCQUFrQixHQUFHcE8sNkJBQTBDbU8sRUFBUUMsUUFBUSxtQkFFakdELEVBQVFDLFFBQVEsZ0JBQWtCLEdBQUdwTyw0QkFBeUNtTyxFQUFRQyxRQUFRLG1CQUc1RnJVLEVBQU9rRyxhQUNGa08sRUFBUUMsUUFBUVcsU0FFdkJaLEVBQVFDLFFBQVFXLGdCQW1acEJsVixlQUFzQ1csR0FDcEMsTUFBTUUsRUFBV0osRUFBS21CLFFBQVFqQixFQUFTLG1CQUNqQ3dVLFFBQXdCNVUsRUFBR1EsU0FBU0MsU0FBU0gsRUFBVSxRQUN2RDhLLEVBQVF3SixFQUFnQmxHLFFBQVFOLEdBQWVDLGlCQUNyRCxJQUFjLElBQVZqRCxFQUFjLE1BQU8sR0FFekIsTUFBTXlKLEVBQWtCRCxFQUFnQjVSLE1BQU0sRUFBR29JLEdBU2pELE9BUmN5SixFQUNYdk4sTUFBTSxNQUNONUYsSUFBS21JLElBQ0osTUFBTXdDLEVBQVV4QyxFQUFLekQsT0FDckIsT0FBT2lHLEVBQVFuSixTQUFTLEtBQU9tSixFQUFRckosTUFBTSxHQUFHLEdBQU1xSixJQUV2RHBELE9BQVFtRCxHQUFNQSxJQUFNQSxFQUFFbkMsV0FBVyxPQUFTbUMsRUFBRWhKLFNBQVMsTUFFM0MxQixJQUFLbUksR0FBUyxTQUFTQSxTQUFZMUosS0FBSyxHQUN2RCxDQW5hc0MyVSxDQUF1Qm5WLEVBQU9TLFNBR2xFLElBQUssTUFBT29VLEVBQUtDLEtBQVVyUCxPQUFPQyxRQUFRME8sRUFBUUMsU0FDM0NTLEdBQU9yUixTQUFTLDZCQUVuQnFSLEVBQU1yUixTQUFTLFVBQ2ZxUixFQUFNclIsU0FBUyxnQkFDZnFSLEVBQU1yUixTQUFTLFlBQ2ZxUixFQUFNclIsU0FBUyxnQkFHakIyUSxFQUFRQyxRQUFRUSxHQUFPQyxFQUFNL1QsUUFBUSwwQkFBMkIsbUNBR2xFLElBQUk4QyxFQUF5QixHQUN6QkMsRUFBa0IsQ0FBQyxXQUFZLHFCQUNuQyxNQUFNc1IsRUFBa0MsR0FHckMvVSxFQUFHTyxXQUFXTCxFQUFLQyxLQUFLa1IsRUFBV2pSLFFBQVMsc0JBQzVDSixFQUFHTyxXQUFXTCxFQUFLQyxLQUFLUixFQUFPUyxRQUFTLHVCQUV6QzJULEVBQVEzRSxTQUFXLCtCQUNuQjNMLEVBQWdCeUosS0FBSyx1QkFBd0IsaUNBRzNDdk4sRUFBT2tHLGFBQ0ZrTyxFQUFRdFEsZ0JBQWdCLGVBRS9CQSxFQUFnQnlKLEtBQUssZUFHdkIsR0FBSXZOLEVBQU80QyxPQUFRLENBZ0NqQixHQS9CSTVDLEVBQU9rRyxjQUNGa08sRUFBUXRRLGdCQUF1QixhQUMvQnNRLEVBQVF0USxnQkFBdUIsTUFDdENzUSxFQUFRQyxRQUFRZ0IsUUFBVSwyQkFDMUJ2UixFQUFnQnlKLEtBQUssY0FHckJ6SixFQUFnQnlKLEtBQUssU0FFckI2RyxFQUFRQyxRQUFRZ0IsUUFBVSxnQkFDMUJqQixFQUFRQyxRQUFRaUIsWUFBYyxpQkFDMUJ0VixFQUFPdVYsY0FBZ0J2VixFQUFPd1YseUJBR2hDMVIsRUFBZ0J5SixLQUFLLFNBQ3JCNkcsRUFBUUMsUUFBUW9CLFFBQVUsa0JBQzFCckIsRUFBUUMsUUFBUXFCLFNBQVcsbUJBSTNCMVYsRUFBT3NHLFVBQVVxUCxrQkFFaEJ2QixFQUFRdFEsZ0JBQWdCLHFCQUN4QnNRLEVBQVF0USxnQkFBZ0IsMkJBQ3hCc1EsRUFBUXRRLGdCQUFnQixpQ0FFekJBLEVBQWdCeUosS0FBSyxvQkFFdkI2RyxFQUFRakwsUUFBVSwrQkFHaEJuSixFQUFPc0csVUFBVStMLGVBQWdCLENBRWQrQixFQUFRdlEsYUFBd0IsV0FBS3VRLEVBQVF0USxnQkFBMkIsV0FFdkVzUSxFQUFRdlEsYUFBYSxzQkFDekNDLEVBQWdCeUosS0FBSywyQkFDZDZHLEVBQVF2USxhQUFhLDRCQUV2QnVRLEVBQVF2USxhQUF5QixrQkFDakN1USxFQUFRdFEsZ0JBQTRCLFVBQzdDLENBRUk5RCxFQUFPNkMsNEJBRVR1UixFQUFRd0IsV0FBYUMsTUFBTUMsUUFBUTFCLEVBQVF3QixZQUN2Q3RJLEVBQU14TCxJQUFJLENBQUNzUyxFQUFRd0IsV0FBWSxDQUFDLGVBQWdCLENBQzlDNUgsV0FBWWpCLElBRWQsQ0FBQyxjQUNJOEksTUFBTUMsUUFBUTFCLEVBQVF3QixjQUMvQnhCLEVBQVF3QixXQUFheEIsRUFBUXdCLFdBQVd0TSxPQUNyQ3lNLEdBQ0M1VSxFQUFHNlUsU0FBU0QsRUFBVyxDQUNyQjFVLEtBQUssRUFDTEMsSUFBS3RCLEVBQU9TLFFBQ1pjLE9BQVFQLElBQ1A0RCxPQUFTLEdBRWtCLElBQTlCd1AsRUFBUXdCLFdBQVdoUixlQUNkd1AsRUFBUXdCLFdBR3JCLENBRUEsR0FBSTVWLEVBQU9zRyxVQUFVMlAsSUFBTWpXLEVBQU9rRyxNQUFPLENBQ25Da08sRUFBUXZRLGFBQWEsbUJBQ3ZCQSxFQUFhMEosS0FBSyxtQkFFbEJ6SixFQUFnQnlKLEtBQUssbUJBRXZCLElBQUssTUFBT3NILEVBQUtDLEtBQVVyUCxPQUFPQyxRQUFRME8sRUFBUUMsU0FDaERELEVBQVFDLFFBQVFRLEdBQU9DLEVBQU0vVCxRQUFRLFVBQVcsWUFFcEQsRUFHRWYsRUFBT2tXLHdCQUNQbFcsRUFBT21XLGtDQUNQblcsRUFBT29XLHdCQUNQcFcsRUFBT3FXLG9DQUVIclcsRUFBT2tHLE9BQ1RwQyxFQUFnQnlKLEtBQUssaUJBQWtCLG9DQUNoQzZHLEVBQVF0USxnQkFBd0IsY0FDaENzUSxFQUFRdFEsZ0JBQTRCLGtCQUNwQ3NRLEVBQVF0USxnQkFBZ0Isc0JBRS9CQSxFQUFnQnlKLEtBQUssU0FBVSxnQkFJL0J2TixFQUFPb1csd0JBQTBCcFcsRUFBT3FXLG9DQUMxQ3ZTLEVBQWdCeUosS0FBSyxjQUNqQnZOLEVBQU9rRyxPQUNUcEMsRUFBZ0J5SixLQUFLLGVBSXJCdk4sRUFBTzZQLFlBQ1QvTCxFQUFnQnlKLFFBQVF5RyxHQUFXaFUsRUFBTzZQLGFBR3hDN1AsRUFBT3dVLHVCQUNUM1EsRUFBZUEsRUFBYXlGLE9BQVFxTCxJQUFTQSxFQUFJbFIsU0FBUyxrQkFDMURLLEVBQWtCQSxFQUFnQndGLE9BQVFxTCxJQUFTQSxFQUFJbFIsU0FBUyxtQkFHN0QyUSxFQUFROVUsT0FDWDhVLEVBQVE5VSxLQUFPaUIsRUFBS3dSLFNBQVMvUixFQUFPUyxVQUdsQ1QsRUFBTzZDLDhCQUNUdVIsRUFBUWtDLFNBQVUsR0FFZmxDLEVBQVFtQyxVQUNYbkMsRUFBUW1DLFFBQVUsZUFFZm5DLEVBQVFrQyxTQUErQixlQUFwQmxDLEVBQVFtQyxTQUE0QjdFLEVBQVc2RCxlQUNyRW5CLEVBQVFvQyxnQkFBa0IsQ0FBQSxFQUMxQnBDLEVBQVFvQyxjQUFjQyxTQUFXLFVBRW5DLE1BQU9wTCxHQUFTOUQsRUFBV0MsY0FBY3hILEVBQU9tTCxZQUFjLElBQ2hELGdCQUFWRSxHQUFxQyxtQkFBVkEsSUFDN0IrSSxFQUFRRyxPQUFTLG9CQUVkdlUsRUFBTzRDLFNBQVV3UixFQUFRa0MsU0FBWWxDLEVBQVFzQyxPQUVoRHRDLEVBQVFzQyxLQUFPLFNBTWpCLFVBRk90QyxFQUFRdUMsY0FBYyxjQUV4QjNXLEVBQU82Qyw0QkFBNkIsQ0FXdkMsR0FWSzdDLEVBQU9rRyxRQUNMbEcsRUFBT2tXLHdCQUEyQmxXLEVBQU9vVyx1QkFLNUNoQyxFQUFRQyxRQUFRLGFBQWVYLEdBQVdDLGlCQUFpQjNULFdBSnBEb1UsRUFBUUMsUUFBUXVDLFlBQ2hCeEMsRUFBUUMsUUFBUSxZQUN2QkQsRUFBUUMsUUFBUXdDLFFBQVV6QyxFQUFRQyxRQUFRd0MsU0FBUzlWLFFBQVEsb0JBQXFCLE1BTWhGZixFQUFPaVMsd0JBQXlCLENBQ2xDbUMsRUFBUUMsUUFBUXVDLEtBQU8sa0JBQ3ZCeEMsRUFBUUMsUUFBUSxZQUFjLFlBQzlCLE1BQU15QyxFQUFPLENBQUMsTUFBTyxPQUFRLGVBQWV4TixPQUFReU4sR0FBUTFXLEVBQUdPLFdBQVdMLEVBQUttQixRQUFRMUIsRUFBT1MsUUFBU3NXLEtBQ25HRCxFQUFLbFMsT0FBUyxJQUNoQndQLEVBQVFDLFFBQVEsZUFBaUIseUJBQXlCeUMsRUFBS3RXLEtBQzdELG9IQUVGNFQsRUFBUUMsUUFBUTJDLFFBQVUsdUJBRTlCLENBRUEsR0FBSWhYLEVBQU95Syx1QkFBd0IsQ0FDRyxtQkFBaEMySixFQUFRQyxRQUFRaUIsb0JBQ1hsQixFQUFRQyxRQUFRaUIsWUFFekIsTUFBTTJCLFFBQW9COVYsRUFBR0MsS0FBSyxVQUFXLENBQzNDRSxJQUFLdEIsRUFBT1MsUUFDWlksS0FBSyxFQUNMRSxPQUFRUCxJQUVKa1csRUFBYSxJQUFJMU0sSUFDdkIsSUFBSyxNQUFNMk0sS0FBY0YsRUFBYSxDQUNwQyxNQUFPRyxFQUFPQyxHQUFVRixFQUFXeFAsTUFBTSxTQUNyQzBQLEdBQ0ZILEVBQVdJLElBQUlGLEVBRW5CLENBQ0EsR0FBSUYsRUFBV0ssS0FBTyxFQUFHLENBQ3ZCLE1BQU1DLEVBQWMsSUFBSU4sR0FBWTFXLEtBQUssS0FDekM0VCxFQUFRQyxRQUFRLGVBQ2Qsb0NBQW9DbUQseUJBQW1DQSxJQUNyRXBELEVBQVFDLFFBQVF1QyxLQUNsQnhDLEVBQVFDLFFBQVF1QyxLQUFPLHFCQUFxQlksUUFBa0JwRCxFQUFRQyxRQUFRdUMsUUFFOUV4QyxFQUFRQyxRQUFRdUMsS0FBTyxxQkFBcUJZLElBQzVDcEQsRUFBUUMsUUFBUSxZQUFjLGFBRWhDRCxFQUFRQyxRQUFRMkMsUUFBVSx1QkFDMUI1QixFQUFzQjdILEtBQUssUUFBUyxRQUFTLFNBQy9DLENBQ0YsQ0FFSXZOLEVBQU9tTCxhQUNUaUosRUFBUWpKLFdBQWFuTCxFQUFPbUwsV0FFaEMsQ0FFSW5MLEVBQU9zRyxVQUFVNkwsT0FDbkJ0TyxFQUFhMEosS0FDWCxTQUFTMUQsSUFDVCxpQkFBaUJBLElBQ2pCLGlCQUFpQkEsSUFDakIsZ0JBQWdCQSxJQUNoQixRQUFRQyxLQUdWaEcsRUFBa0JBLEVBQWdCd0YsT0FBUW1PLEdBQVksd0JBQU5BLEdBQXFDLDhCQUFOQSxHQUMxRXJELEVBQVFDLFFBQVEsYUFBYS9KLFdBQVcsaUJBRWpDOEosRUFBUUMsUUFBUSxZQUFZNVEsU0FBUywyQkFDL0MyUSxFQUFRQyxRQUFRLFlBQWNELEVBQVFDLFFBQVEsWUFBWXRULFFBQ3hELGdCQUNBLDJDQUpGcVQsRUFBUUMsUUFBUSxZQUFjLGlCQU92QnJVLEVBQU9zRyxVQUFVOEwsU0FBV2dDLEVBQVFDLFFBQVEsYUFBYS9KLFdBQVcscUJBQzdFOEosRUFBUUMsUUFBUSxZQUFjLG1CQUczQkQsRUFBUXZRLGNBQWM0TCxpQkFFbEIyRSxFQUFRdFEsZ0JBQWdCLG1CQUdnQixJQUE3QzJCLE9BQU9pUyxLQUFLdEQsRUFBUXZRLGNBQWNlLGVBQzdCd1AsRUFBUXZRLGFBRW1DLElBQWhENEIsT0FBT2lTLEtBQUt0RCxFQUFRdFEsaUJBQWlCYyxlQUNoQ3dQLEVBQVF0USxnQkFFb0MsSUFBakQyQixPQUFPaVMsS0FBS3RELEVBQVFFLGtCQUFrQjFQLGVBQ2pDd1AsRUFBUUUsdUJBc01uQnhVLGVBQXFDc1UsR0FDbkNBLEVBQVF2USxhQUFldVEsRUFBUXZRLGNBQWdCLENBQUEsRUFDL0N1USxFQUFRdFEsZ0JBQWtCc1EsRUFBUXRRLGlCQUFtQixDQUFBLEVBQ3JELE1BQU02VCxFQUFlLElBQUluTixJQUFJLElBQUkvRSxPQUFPaVMsS0FBS3RELEVBQVF2USxpQkFBa0I0QixPQUFPaVMsS0FBS3RELEVBQVF0USxtQkFDM0YsR0FBSTZULEVBQWF2TixJQUFJLHVCQUF5QndOLEdBQW1CeEQsRUFBUyxxQkFBc0IsUUFDdkZBLEVBQVF0USxnQkFBZ0IscUJBQy9CLE1BQU0rVCxRQUFtQnZFLEdBQW9CLGlCQUFrQixRQUMvRGMsRUFBUXZRLGFBQWEscUJBQXVCLDBDQUEwQ2dVLEdBQ3hGLENBQ0EsR0FBSUYsRUFBYXZOLElBQUkseUJBQTJCd04sR0FBbUJ4RCxFQUFTLHVCQUF3QixRQUMzRkEsRUFBUXRRLGdCQUFnQix1QkFDL0IsTUFBTStULFFBQW1CdkUsR0FBb0IsaUJBQWtCLGVBQy9EYyxFQUFRdlEsYUFBYSx1QkFBeUIsaURBQWlEZ1UsR0FDakcsQ0FFQSxHQUFJRixFQUFhdk4sSUFBSSxnQ0FBa0N3TixHQUFtQnhELEVBQVMsOEJBQStCLFFBQ3pHQSxFQUFRdlEsYUFBYSw4QkFDNUIsTUFBTWdVLFFBQW1CdkUsR0FBb0IsaUJBQWtCLGlCQUMvRGMsRUFBUXRRLGdCQUFnQiw4QkFDdEIsMEZBQTBGK1QsR0FDOUYsQ0FDQSxHQUFJRixFQUFhdk4sSUFBSSx3QkFBMEJ3TixHQUFtQnhELEVBQVMsc0JBQXVCLFFBQ3pGQSxFQUFRdFEsZ0JBQWdCLHNCQUMvQixNQUFNK1QsUUFBbUJ2RSxHQUFvQixpQkFBa0IsU0FDL0RjLEVBQVF2USxhQUFhLHNCQUF3QiwyQ0FBMkNnVSxHQUMxRixDQUNBLEdBQUlGLEVBQWF2TixJQUFJLDRCQUE4QndOLEdBQW1CeEQsRUFBUywwQkFBMkIsUUFDakdBLEVBQVF0USxnQkFBZ0IsMEJBQy9CLE1BQU0rVCxRQUFtQnZFLEdBQW9CLGlCQUFrQixhQUMvRGMsRUFBUXZRLGFBQWEsMEJBQTRCLCtDQUErQ2dVLEdBQ2xHLENBQ0YsQ0FsT1FDLENBQXNCMUQsR0FFeEJwVSxFQUFPa0csY0FBY2tPLEVBQVFuTyxlQUNqQyxJQUFJOFIsRUFBY2pLLEtBQUtHLFVBQVVtRyxHQUNqQzJELFFBeUpGalksZUFDRXVVLEVBQ0EwRCxFQUNBL1gsR0FFQSxNQUFNZ1ksRUFBMkMsR0FDakQsSUFBSyxNQUFPbkQsS0FBUXBQLE9BQU9pUyxLQUFLckQsR0FDZixNQUFYUSxFQUFJLElBQWNBLEVBQUlwUixTQUFTLE1BQ2pDdVUsRUFBcUJ6SyxLQUFLLENBQUNzSCxFQUFLQSxFQUFJeFMsV0FBVyxJQUFLLE9BR3hELEdBQW9DLElBQWhDMlYsRUFBcUJwVCxPQUFjLE9BQU9tVCxFQUU5QyxJQUFLLE1BQU9FLEVBQVNDLEtBQVlGLEVBQy9CRCxFQUFjQSxFQUFZMVYsV0FBVzRWLEVBQVNDLEdBRWhELE1BQU1DLFFBQWNoWCxFQUFHQyxLQUFLLENBQUMsMENBQTJDLGlCQUFrQixDQUN4RkUsSUFBS3RCLEVBQU9TLFFBQ1pZLEtBQUssRUFDTEUsT0FBUVAsSUFFVixJQUFLLE1BQU1vRSxLQUFRK1MsUUFDWDdWLEVBQVkyQixJQUFJbkUsVUFDcEIsTUFBTWEsRUFBV0osRUFBS0MsS0FBS1IsRUFBT1MsUUFBUzJFLEdBQ3JDbEYsUUFBbUJHLEVBQUdRLFNBQVNDLFNBQVNILEVBQVUsUUFDeEQsSUFBSVAsRUFBYUYsRUFDakIsSUFBSyxNQUFPK1gsRUFBU0MsS0FBWUYsRUFDL0I1WCxFQUFhQSxFQUFXaUMsV0FBVzRWLEVBQVNDLEdBRTFDOVgsSUFBZUYsU0FDWEcsRUFBR1EsU0FBU1AsVUFBVUssRUFBVVAsS0FLNUMsYUFETWtDLEVBQVkrQyxhQUNYMFMsQ0FDVCxDQTdMc0JLLENBQWVoRSxFQUFRQyxRQUFTMEQsRUFBYS9YLFNBQzNESyxFQUFHUSxTQUFTUCxVQUFVSyxFQUFVb1gsR0FFakM3RCxJQUVIclEsRUFBZUEsRUFBYXlGLE9BQVFxTCxJQUFTUCxFQUFRdFEsa0JBQWtCNlEsSUFDbkU5USxFQUFhZSxPQUFTLElBQ3BCNUUsRUFBT2tHLE9BQ1Q0QixFQUFVN0IsRUFBZ0IsQ0FBQyxZQUFhLElBQUl1RSxJQUFJM0csSUFBZ0I3RCxFQUFPUyxTQUN2RXFILEVBQVU3QixFQUFnQixDQUFDLE1BQU8sYUFBYyxJQUFJdUUsSUFBSTNHLElBQWdCN0QsRUFBT1MsVUFFL0VxSCxFQUFVN0IsRUFBZ0IsQ0FBQyxTQUFVLElBQUl1RSxJQUFJM0csSUFBZ0I3RCxFQUFPUyxVQUl4RXFELEVBQWtCQSxFQUFnQndGLE9BQVFxTCxJQUFTUCxFQUFRdlEsZUFBZThRLElBQ3RFN1EsRUFBZ0JjLE9BQVMsSUFDdkI1RSxFQUFPa0csT0FDVDRCLEVBQVU3QixFQUFnQixDQUFDLFlBQWEsSUFBSXVFLElBQUkxRyxJQUFtQjlELEVBQU9TLFNBQzFFcUgsRUFBVTdCLEVBQWdCLENBQUMsTUFBTyxLQUFNLGFBQWMsSUFBSXVFLElBQUkxRyxJQUFtQjlELEVBQU9TLFVBRXhGcUgsRUFBVTdCLEVBQWdCLENBQUMsTUFBTyxRQUFTLElBQUl1RSxJQUFJMUcsSUFBbUI5RCxFQUFPUyxVQUc3RTJVLEVBQXNCeFEsT0FBUyxHQUNqQ2tELEVBQVUsU0FBVSxDQUFDLE1BQU8sVUFBVyxTQUFVLElBQUkwQyxJQUFJNEssSUFBeUJwVixFQUFPUyxTQUcvRixDQTlVVTJMLENBQUtwTSxFQUFRMFIsRUFBWXdDLElBRW5DLENBMFhPLFNBQVNhLEdBQWdCL1UsR0FDOUIsR0FBSUEsRUFBT2tHLE1BQU8sQ0FDaEIsTUFBTW1PLEVBQWtDLENBQ3RDLG1CQUFvQixnREFDcEIsZUFBZ0IsdUNBQ2hCd0MsUUFBUyxtQ0FDVEcsT0FBUSw2QkFDUkosS0FBTSxvQkFDTixXQUFZLDBCQUNaaEwsS0FBTSxjQUNOeU0sVUFBVywwQkFLYixPQUhLclksRUFBT29XLHdCQUEyQnBXLEVBQU9xVyx5Q0FDckNoQyxFQUFRZ0UsVUFFVmhFLENBQ1QsQ0FBTyxDQUNMLElBQUlBLEVBQWtDLENBQ3BDLG1CQUFvQiwwQ0FDcEIsZUFBZ0IsMEZBQ2hCd0MsUUFBUywrQkFDVEcsT0FBUSxxQ0FDUkosS0FBTSxpQkFDTixXQUFZLGtCQUNaNUIsU0FBVSxpREFBaUQ1RixHQUFXSyxTQUFTalAsS0FBSyxvQ0FDcEY2WCxVQUFXLHlCQUViLEdBQUlyWSxFQUFPNkMsNEJBQTZCLENBQ3RDLE1BQU15VixFQUFVakUsRUFBUXpJLEtBQ3hCeUksRUFBVS9HLEVBQ1IsSUFBSytHLEdBQ0wsQ0FDRTJDLE9BQVEsc0dBQ1JKLEtBQU0sOERBQ04sV0FBWSxrRUFDWjVCLFNBQVUsaURBQWlENUYsR0FBV0ssU0FBU2pQLEtBQzdFLHNEQUlGb0wsS0FBTSxzRUFDTnlNLFVBQVcscUVBR1hDLEdBQVM3VSxTQUFTLGFBQ3BCNFEsRUFBUXpJLEtBQU8wTSxFQUVuQixNQUFXdFksRUFBT3NHLFVBQVVpUyxVQUMxQmxFLEVBQVFnRSxVQUFZaEUsRUFBUWdFLFVBQVksR0FBR2hFLEVBQVFnRSxnQkFBa0IsR0FDckVoRSxFQUFRZ0UsV0FBYSxXQVF2QixPQUxLclksRUFBT29XLHdCQUEyQnBXLEVBQU9xVyxpQ0FFbkNyVyxFQUFPc0csVUFBVTJQLEtBQzFCNUIsRUFBUWdFLFVBQVksdUJBRmJoRSxFQUFRZ0UsVUFJVmhFLENBQ1QsQ0FDRixDQTJGQSxTQUFTdUQsR0FBbUJ4RCxFQUFzQjVRLEdBQ2hELE9BQVE0USxFQUFRdFEsa0JBQWtCTixJQUFnQjRRLEVBQVF2USxlQUFlTCxJQUFnQixJQUFJQyxTQUFTLFlBQ3hHLENDemtCQSxNQUFNNFEsR0FBVSxDQUNkbUUsVUFBVyxxQ0FDWEMsUUFBUyxpQkFDVEMsY0FBZSwyUUFTZmpTLE9BQ0FrUyx5QkFBMEIsa1VBUzFCbFMsT0FDQW1TLFVBQVcsMkxBUVhuUyxRQUdLM0csZUFBZStZLEdBQW1DN1ksR0FDdkQsT0FBT1osRUFBT0MsMEJBQTBCLHFDQUFzQ1MsZ0JBS2hGQSxlQUFvQkUsR0FDbEIsTUFBTThZLEVBQWtCdlksRUFBS21CLFFBQVExQixFQUFPUyxRQUFTLGdCQUMvQzBULFFBQWlCOVQsRUFBR1EsU0FBU0MsU0FBU2dZLEVBQWlCLFFBQ3ZEbFYsRUFBY2tLLEtBQUtDLE1BQU1vRyxHQUMvQnZRLEVBQVl5USxVQUFZLENBQUEsU0FDakJ6USxFQUFZeVEsUUFBcUIsbUJBQ2pDelEsRUFBWXlRLFFBQXFCLG1CQUNqQ3pRLEVBQVl5USxRQUFpQixlQUM3QnpRLEVBQVl5USxRQUF3QixzQkFDcEN6USxFQUFZeVEsUUFBaUIsZUFDN0J6USxFQUFZeVEsUUFBa0IsU0FFckMsTUFBTTVULEVBQVVGLEVBQUttQixRQUFRMUIsRUFBT1MsUUFBUyxVQUs3QyxTQUpNb0IsUUFBUUMsSUFBSSxDQUNoQnpCLEVBQUdRLFNBQVNQLFVBQVV3WSxFQUFpQmhMLEtBQUtHLFVBQVVySyxPQUFhZCxFQUFXLElBQzlFekMsRUFBR1EsU0FBU29MLEdBQUd4TCxFQUFTLENBQUV5TCxPQUFPLEVBQU1oSSxXQUFXLE1BRWhEbEUsRUFBT2tHLE1BRVQsWUFEQTRCLEVBQVUsTUFBTyxDQUFDLFNBQVUsVUFBVyxrQkFBbUI5SCxFQUFPUyxTQUluRXFILEVBQVUsT0FBUSxDQUFDLE1BQU8sYUFBYyxXQUFZOUgsRUFBT1MsU0FFM0QsTUFBTXNZLEVBQW9CeFksRUFBS21CLFFBQVFqQixFQUFTLG9CQUUxQzZCLEVBQVkyQixJQUFJLElBQU01RCxFQUFHUSxTQUFTb0wsR0FBRzFMLEVBQUttQixRQUFRMUIsRUFBT1MsUUFBUyxpQkFBa0IsQ0FBRXlMLE9BQU8sV0FDN0Y1SixFQUFZMkIsSUFBSSxJQUFNNUQsRUFBR1EsU0FBU1AsVUFBVXlZLEVBQW1CMUUsR0FBUW1FLFVBQVksT0FFekYsTUFBTUgsVUFBRUEsR0FBY3RELEdBQWdCL1UsR0FDdEMsR0FBSXFZLEVBQVcsQ0FDYixJQUFJSSxFQUFVelksRUFBT21MLFlBQVliLFdBQVcsMEJBQ3hDdEssRUFBT21MLFlBQVk2TixvQkFBb0J2VixTQUFTLFlBQzlDNFEsR0FBUXFFLGNBQ1JyRSxHQUFRc0UseUJBQ1Z0RSxHQUFRb0UsUUFDWkEsRUFBVUEsRUFBUTFYLFFBQ2hCLGlCQUNBc1gsRUFDR3RYLFFBQVEsT0FBUSwrQkFDaEJBLFFBQVEsTUFBTyw4QkFFZkEsUUFBUSxVQUFXLHlDQUVsQnVCLEVBQVkyQixJQUFJLElBQ3BCNUQsRUFBR1EsU0FBU1AsVUFBVUMsRUFBS21CLFFBQVFqQixFQUFTLFlBQWFnWSxFQUFVLEtBQU0sQ0FDdkVRLEtBQU0sTUFHWixDQUNBLE1BQU1DLEVBQW1CLEdBQUc3RSxHQUFRdUUsZ0JBQWdCTyxHQUEwQm5aLEdBQVFRLEtBQUssZ0JBQ3JGOEIsRUFBWTJCLElBQUksSUFDcEI1RCxFQUFHUSxTQUFTUCxVQUFVQyxFQUFLbUIsUUFBUWpCLEVBQVMsY0FBZXlZLEVBQWtCLENBQzNFRCxLQUFNLE1BR1osQ0E1RFU3TSxDQUFLcE0sSUFFZixDQTRETyxTQUFTbVosR0FBMEJuWixHQUN4QyxNQUFNb1osRUFBOEIsR0FDaENwWixFQUFPZ0ssY0FDVG9QLEVBQWtCN0wsS0FDaEIxTixPQUFPd1osR0FBRyxtR0FDVnhaLE9BQU93WixHQUFHLDREQUlWclosRUFBT2dLLGNBQWN2RyxTQUFTLFlBQ2hDMlYsRUFBa0I3TCxLQUFLMU4sT0FBT3daLEdBQUcsdURBRS9CclosRUFBT2dLLGNBQ1RvUCxFQUFrQjdMLEtBQUsxTixPQUFPd1osR0FBRyxnREFFbkMsTUFBTUMsRUFBaUJ0WixFQUFPa0csTUFBUSxjQUFnQixPQUNoRHFULEVBQWtCdlosRUFBT3NHLFVBQVU2TCxPQUFTblMsRUFBT3NHLFVBQVVFLEtBQU8sbUJBQXFCLEdBaUIvRixPQWhCQTRTLEVBQWtCN0wsS0FBSyxvQ0FBb0MrTCxJQUFpQkMsTUFDeEV2WixFQUFPeUssd0JBQ1QyTyxFQUFrQjdMLEtBQUsxTixPQUFPd1osR0FBRyxrREFFL0JyWixFQUFPc0csVUFBVTZMLE1BQ25CaUgsRUFBa0I3TCxLQUNoQjFOLE9BQU93WixHQUFHLG1GQUNWeFosT0FBT3daLEdBQUcsNkVBQ1Z4WixPQUFPd1osR0FBRyxzRUFFSHJaLEVBQU9zRyxVQUFVOEwsUUFDMUJnSCxFQUFrQjdMLEtBQ2hCMU4sT0FBT3daLEdBQUcsNkhBQ1Z4WixPQUFPd1osR0FBRyx3SEFHUEQsQ0FDVCxDQ3ZJQSxTQUFTSSxHQUFrQkMsRUFBZ0J6UixFQUFjMUksRUFBY29hLEdBQ3JFLE1BQU8sNkVBQytCMVIsME9BSUkwUixnR0FFVHBhLE9BQVVvYSx3UEFNUEQsb1JBUXRDLENBRUEsTUFBTUUsR0FBa0IsNEdBR3RCdkssR0FBV0ssU0FBUzFOLElBQUt1UCxHQUFRa0ksR0FBa0IsT0FBUSw2Q0FBOEMsV0FBWWxJLElBQU05USxLQUFLLG9DQUs1SG9aLEdBQWUsNEdBR25CeEssR0FBV0ssU0FBUzFOLElBQUt1UCxHQUFRa0ksR0FBa0IsTUFBTyx5RkFBMEYsUUFBU2xJLElBQU05USxLQUFLLG9DQUtuS1YsZUFBZStaLEdBQXFCN1osR0FDekMsT0FBT1osRUFBT0MsMEJBQTBCLHVCQUF3QlMsVUFDOUQsTUFBTVcsRUFBVUYsRUFBS21CLFFBQVExQixFQUFPUyxRQUFTLFNBQzdDLEdBQUlKLEVBQUdPLFdBQVdILEdBQVUsQ0FDMUIsTUFBTUUsRUFBV0osRUFBS21CLFFBQVFqQixFQUFTLDBCQUNoQ1QsRUFBT2tXLHdCQUNkbFcsRUFBT21XLGtDQUNQblcsRUFBT29XLHdCQUNQcFcsRUFBT3FXLGtDQUNOclcsRUFBT2dMLDBCQUNMaEwsRUFBT2lTLDBCQUNQalMsRUFBTzZSLHNCQUNQN1IsRUFBTzhSLG9CQUNQOVIsRUFBT2dTLG1CQUNOMVAsRUFBWTJCLElBQUksSUFBTUcsRUFBT0UsYUFBYTNELEVBQVVYLEVBQU9rRyxNQUFRMFQsR0FBZUQsS0FDbEZyWCxFQUFZMkIsSUFBSSxJQUFNNUQsRUFBR1EsU0FBU29MLEdBQUd0TCxFQUFVLENBQUV1TCxPQUFPLEtBQzlELEdBRUosQ0N2REEsTUFBTXVCLEdBQWMsQ0FDbEIsYUFBYyxDQUNaNEcsUUFBUyxDQUNQLGFBQWMsQ0FDWm9GLE9BQVEsVUFJZCxhQUFjLENBQ1pLLFNBQVUsQ0FDUmpELFFBQVMsQ0FDUHpWLEtBQU0sdUZBQ042QyxJQUFLLDZFQUVQLG1CQUFvQixDQUNsQjdDLEtBQU0sbUJBQ042QyxJQUFLLCtLQUtYd0MsVUFJQSxXQUFZLENBQ1Y0TixRQUFTLENBQ1AsV0FBWSxDQUNWb0YsT0FBUSxXQU1WcEYsR0FBVSxDQUNkb0UsUUFBUywyQ0FDVEMsY0FBZSwyV0FXZmpTLE9BQ0FtUyxVQUFXLDBNQVVYblMsUUFHSzNHLGVBQWVpYSxHQUFvQy9aLEdBQ3hELE9BQU9aLEVBQU9DLDBCQUEwQixzQ0FBdUNTLGdCQUtqRkEsZUFBb0JFLEdBQ2xCLE1BQU1TLEVBQVVGLEVBQUttQixRQUFRMUIsRUFBT1MsUUFBUyxtQkFDdkNvQixRQUFRQyxJQUFJLENBQ2hCekIsRUFBR1EsU0FBU1AsVUFDVkMsRUFBS0MsS0FBS1IsRUFBT1MsUUFBUyxnQkFDMUJxUSxFQUFLRyxLQUFLeEQsR0FBYSxDQUNyQnlELFdBQVcsRUFDWEMsY0FBYyxFQUNkQyxPQUFRLENBQ04sU0FBVSxZQUloQi9RLEVBQUdRLFNBQVNvTCxHQUFHeEwsRUFBUyxDQUFFeUwsT0FBTyxFQUFNaEksV0FBVyxNQUdwRCxNQUFNbVUsVUFBRUEsR0FBY3RELEdBQWdCL1UsR0FDdEMsR0FBSXFZLEVBQVcsQ0FDYixNQUFNSSxFQUFVelksRUFBT21MLFlBQVliLFdBQVcsMEJBQTRCK0osR0FBUXFFLGNBQWdCckUsR0FBUW9FLFFBQzFHcFksRUFBRzJaLFVBQVV6WixFQUFLQyxLQUFLQyxFQUFTLFlBQWEsQ0FBRXlELFdBQVcsVUFDcEQ1QixFQUFZMkIsSUFBSSxJQUNwQjVELEVBQUdRLFNBQVNQLFVBQVVDLEVBQUtDLEtBQUtDLEVBQVMsV0FBWSxZQUFhZ1ksRUFBVSxLQUFNLENBQ2hGUSxLQUFNLE1BR1osQ0FDQSxNQUFNQyxFQUFtQixHQUFHN0UsR0FBUXVFLGdCQUFnQk8sR0FBMEJuWixHQUFRUSxLQUFLLFVBQzNGSCxFQUFHMlosVUFBVXpaLEVBQUtDLEtBQUtDLEVBQVMsY0FBZSxDQUFFeUQsV0FBVyxVQUN0RDVCLEVBQVkyQixJQUFJLElBQ3BCNUQsRUFBR1EsU0FBU1AsVUFBVUMsRUFBS21CLFFBQVFqQixFQUFTLGFBQWMsY0FBZXlZLEVBQWtCLENBQ3pGRCxLQUFNLE1BR1osQ0FyQ1U3TSxDQUFLcE0sSUFFZixDQzNFQSxNQUFNaWEsR0FBaUIsQ0FDckJDLEtBQU0sQ0FBQyxNQUFPLE9BQVEsV0FBVzdQLE9BQ2pDOEgsTUFBTyxDQUFDLE1BQU8sT0FBUSxVQUFXLEtBQU0sZUFBZ0IsV0FBVzlILFFDTzlEdkssZUFBZXFhLEdBQXFCbmEsR0FDekMsT0FBT1osRUFBT0MsMEJBQTBCLHVCQUF3QlMsZ0JBS2xFQSxlQUFvQkUsR0FDbEIsTUFBTVcsRUFBV0osRUFBS21CLFFBQVExQixFQUFPUyxRQUFTLHFCQUM5QyxHQUFJVCxFQUFPa0csTUFFVCxrQkFETTVELEVBQVkyQixJQUFJLElBQU01RCxFQUFHUSxTQUFTb0wsR0FBR3RMLEVBQVUsQ0FBRXVMLE9BQU8sS0FJaEUsTUFBTWtPLEVBQWdCcGEsRUFBTzRDLE9BQVMsMEJBQTRCLGdDQUM1RDJILEVBQWtCLEdBQ3hCLEdBQUl2SyxFQUFPa1csd0JBQTBCbFcsRUFBT29XLHVCQUF3QixDQUNsRSxNQUFNNUcsRUFBUyxRQUNkNkssR0FBYXJhLFNBQWM4TixLQUFLRyxVQUNqQyxHQUFHbU0sZ0JBQTRCMUcsR0FBV0MsaUJBQWlCM1QsV0FDdERvYSwrQkFDTDdQLEVBQU1nRCxLQUFLaUMsRUFDYixDQUNBLE1BQU04SyxFQUFpQnRhLEVBQU80QyxPQUFTLG1DQUFxQyxHQUM1RTJILEVBQU1nRCxLQUFLLGdCQUNBNkIsR0FBV0ssU0FBU2pQLEtBQUssMElBQytFOFosTUFzRHJILFNBQW9DdGEsR0FDbEMsT0FBT0EsRUFBT2tXLHdCQUEwQmxXLEVBQU9vVyx1QkFDM0MscUlBRStDaUUsR0FBYXJhLDhFQUU1RCxFQUNOLENBN0R3SXVhLENBQTJCdmEsK0VBRXpJb2EseUpBRUhBLHNaQWVqQnBhLEVBQU9pUyx5QkFDVDFILEVBQU1nRCxLQUFLLDRVQVFUdk4sRUFBT3lLLHdCQUNURixFQUFNZ0QsS0FBSyxzSUFRYixNQUFNbk4sRUFBYSw2REFFbkJKLEVBQU9rVyx3QkFBMEJsVyxFQUFPb1csdUJBQXlCLDhDQUFnRCx5QkFDL0Y3TCxFQUFNL0osS0FBSyxrQkFJdkI4QixFQUFZMkIsSUFBSSxJQUFNNUQsRUFBR1EsU0FBU29MLEdBQUcxTCxFQUFLbUIsUUFBUTFCLEVBQU9TLFFBQVMsb0JBQXFCLENBQUV5TCxPQUFPLFdBQ2hHNUosRUFBWTJCLElBQUksSUFBTTVELEVBQUdRLFNBQVNvTCxHQUFHMUwsRUFBS21CLFFBQVExQixFQUFPUyxRQUFTLHNCQUF1QixDQUFFeUwsT0FBTyxXQUNsRzVKLEVBQVkyQixJQUFJLElBQU1HLEVBQU9FLGFBQWEzRCxFQUFVUCxHQUM1RCxDQXRFVWdNLENBQUtwTSxJQUVmLENBc0VBLFNBQVNxYSxHQUFhcmEsR0FDcEIsTUFBTThXLEVEL0VELFNBQW9COVcsR0FDekIsT0FBSUEsRUFBT3NHLFVBQVU2TCxNQUNaOEgsR0FBZTlILE1BRWpCOEgsR0FBZUMsSUFDeEIsQ0MwRWVNLENBQVd4YSxHQUFRK0IsSUFBS2dWLEdBQVEsR0FBR0EsU0FDaEQsTUFBTyxLQUFLRCxFQUFLdFcsS0FBSyxXQUFXNE8sR0FBV0ksT0FBT2hQLEtBQUssT0FDMUQsQ0NoRk9WLGVBQWUyYSxHQUF1QnphLEdBQzNDLE9BQU9aLEVBQU9DLDBCQUEwQix5QkFBMEJTLFVBQ2hFLE1BQU1hLEVBQVcsQ0FBQyxLQUFNLE1BQU8sT0FDNUJvQixJQUFLdVAsR0FBUS9RLEVBQUttQixRQUFRMUIsRUFBT1MsUUFBUyxlQUFlNlEsTUFDekRvSixLQUFNQyxHQUFNdGEsRUFBR08sV0FBVytaLElBQzdCLElBQUtoYSxFQUFVLE9BRWYsTUFFTVAsU0FGbUJDLEVBQUdRLFNBQVNDLFNBQVNILEVBQVUsU0FFMUJJLFFBQVEsbUJBQW9CLENBQUM2WixFQUFHQyxLQUN2REEsRUFBYXBYLFNBQVMsYUFDekJvWCxHQUFnQix5Q0FFYkEsRUFBYXBYLFNBQVMsaUJBQ3pCb1gsR0FBZ0IsNENBRVgsTUFBTUEsY0FFVHZZLEVBQVkyQixJQUFJLElBQU1HLEVBQU9FLGFBQWEzRCxFQUFVUCxLQUU5RCxDQ1BPTixlQUFlZ2IsR0FBdUI5YSxHQUMzQyxPQUFPWixFQUFPQywwQkFBMEIseUJBQTBCUyxVQUNoRSxNQUFNYSxFQUFXSixFQUFLbUIsUUFBUTFCLEVBQU9TLFFBQVMsbUJBQ3hDOEQsUUFBaUJILEVBQU9DLHNCQUFzQjFELElBQWMsR0FDNURnUixFQUFrQmxELEdBQWVLLG1CQUFtQnZLLEdBQ3BEcU4sRUFBa0JuRCxHQUFlTyxtQkFBbUJ6SyxHQUVwRHdXLEVBQW9CeGEsRUFBS21CLFFBQVExQixFQUFPUyxRQUFTLGNBQ2pEdWEsUUFBMEJ2TSxHQUFlRSwrQkFBK0JvTSxJQUF1QixHQUVyRyxJQUFJRSxFQUFvQixHQUNwQmpiLEVBQU9pUywwQkFDVGdKLEVBQW9CLCtEQU90QixNQUFNN2EsRUFBYXVSLEVBaENELGdIQWdDbUNzSixFQUFvQkQsRUFBbUJwSixRQUN0RnRQLEVBQVkyQixJQUFJLElBQU1HLEVBQU9FLGFBQWEzRCxFQUFVUCxLQUU5RCxDQy9CQSxNQUFNZ1UsR0FBVSxDQUNkOEcsU0FBVSxJQUNWQyxLQUFNLFNBR0RyYixlQUFlc2IsR0FBMEJwYixHQUM5QyxPQUFPWixFQUFPQywwQkFBMEIsNEJBQTZCUyxVQUNuRSxJQUFJMk4sRUFBc0JtRCxFQUFVd0QsSUFDcEMsTUFBTXpULEVBQVdKLEVBQUttQixRQUFRMUIsRUFBT1MsUUFBUyxzQkFDOUMsSUFDRSxNQUFNUCxRQUFtQkcsRUFBR1EsU0FBU0MsU0FBU0gsRUFBVSxRQUNsRGtOLEVBQWNDLEtBQUtDLE1BQU03TixHQUMvQnVOLEVBQWNILEVBQU14TCxJQUFJLENBQUMyTCxFQUFhSSxFQUFhSixHQUFjLENBQUVPLFdBQVlwQixHQUNqRixDQUFFLE1BQ0EsQ0FFRixNQUFNeE0sRUFBYTBOLEtBQUtHLFVBQVVSLFNBQzVCbkwsRUFBWTJCLElBQUksSUFBTUcsRUFBT0UsYUFBYTNELEVBQVVQLEtBRTlELENDcEJPTixlQUFldWIsR0FBZXJiLEdBQ25DLE9BQU9aLEVBQU9DLDBCQUEwQixpQkFBa0JTLFVBQ3hELE1BQU1hLEVBQVdKLEVBQUttQixRQUFRMUIsRUFBT1MsUUFBUyxhQUM5QyxJQUFJTCxRQUFtQkMsRUFBR1EsU0FBU0MsU0FBU0gsRUFBVSxRQUVsRE4sRUFBR08sV0FBV0wsRUFBS21CLFFBQVExQixFQUFPUyxRQUFTLHNCQUM3Q0wsRUFBYWtiLEdBQVlsYixFQVI3QiwwS0FXRSxNQUFNK0ssRUFBYW5MLEVBQU9tTCxZQUFZOUgsTUFBTXJELEVBQU9tTCxZQUFZNEQsUUFBUSxLQUFPLEdBQ3hFd00sRUFBWWxiLEVBQUdtYixZQUFZLEdBQUd4YixFQUFPUyw2QkFDM0MsSUFBSyxNQUFNa0csS0FBWTRVLEVBQVcsQ0FDaEMsSUFBSzVVLEVBQVMyRCxXQUFXLFVBQVkzRCxFQUFTMkQsV0FBVyxVQUFXLFNBRXBFLElBQUltUixFQUFZOVUsRUFDaEI4VSxFQUFZQSxFQUFVLEdBQUdDLGNBQWdCRCxFQUFVcFksTUFBTSxFQUFHb1ksRUFBVTFNLFFBQVEsTUFDOUUwTSxFQUFZQSxFQUFVMWEsUUFBUSxJQUFLLEtBQ25DLE1BQU00YSxFQUFRLE1BQU1GLHlCQUFpQ3RRLHVCQUFnQ3hFLG9DQUEyQ3dFLHVCQUFnQ3hFLEtBQzVKdEcsRUFBR08sV0FBV0wsRUFBS21CLFFBQVExQixFQUFPUyxRQUFTLHFCQUFxQmtHLFFBQ2xFdkcsRUFBYWtiLEdBQVlsYixFQUFZdWIsR0FFekMsT0FFTXJaLEVBQVkyQixJQUFJLElBQU1HLEVBQU9FLGFBQWEzRCxFQUFVUCxLQUU5RCxDQUVPLFNBQVNrYixHQUFZTSxFQUFnQkQsR0FFMUNDLEVBQVNBLEVBQU83YSxRQUFRNGEsRUFBTyxJQUFJdFosV0FBVyxXQUFZLFFBRTFELElBQUssSUFBSXdaLEVBQUksRUFBR0EsRUFBSUQsRUFBT2hYLE9BQVFpWCxJQUNqQyxHQUFzQixPQUFsQkQsRUFBT0MsRUFBSSxJQUE2QixPQUFkRCxFQUFPQyxHQUFhLENBQ2hELE1BQU10VyxFQUFTcVcsRUFBT3ZZLE1BQU0sRUFBR3dZLEVBQUksR0FDbkMsSUFBSXJXLEVBQVFvVyxFQUFPdlksTUFBTXdZLEVBQUksR0FJN0IsT0FIS3JXLEVBQU04RSxXQUFXLE1BQVM5RSxFQUFNOEUsV0FBVyxPQUM5QzlFLEVBQVEsS0FBS0EsS0FFUixHQUFHRCxJQUFTb1csTUFBVW5XLEdBQy9CLENBRUYsTUFBTyxHQUFHb1csTUFBV0QsS0FDdkIsQ0MxQ083YixlQUFlZ2MsR0FBa0JwSyxHQUN0QyxPQUFPdFMsRUFBT0MsMEJBQTBCLG9CQUFxQlMsVUFDM0QsTUFBTWEsRUFBV0osRUFBS21CLFFBQVFnUSxFQUFXalIsUUFBUyxtQkFDNUNzYixFQUFXak8sS0FBS0MsWUFBWTFOLEVBQUdRLFNBQVNDLFNBQVNILEVBQVUsU0FHM0RxYixFQUFVRCxHQUFVQyxTQUFXLEdBQ3JDLElBQUssSUFBSUgsRUFBSSxFQUFHQSxFQUFJRyxFQUFRcFgsT0FBUWlYLElBQUssQ0FDdkMsTUFBTUksRUFBU3BHLE1BQU1DLFFBQVFrRyxFQUFRSCxJQUFNRyxFQUFRSCxHQUFHLEdBQUtHLEVBQVFILEdBQzdEaEwsRUFBYWdGLE1BQU1DLFFBQVFrRyxFQUFRSCxLQUFPRyxFQUFRSCxHQUFHLElBQU8sQ0FBQSxFQUNsRSxHQUFlLHNDQUFYSSxFQUNGRCxFQUFRSCxHQUFLLENBQ1gsb0NBQ0F2TyxFQUFNeEwsSUFDSixDQUNFK08sRUFDQSxDQUNFcUwsT0FBUSx3QkFHWixDQUFFbE8sV0FBWXBCLFVBR2IsR0FBZSw2QkFBWHFQLEVBQXVDLENBRWhELE1BQVFFLFlBQWFDLEVBQUlDLGVBQWdCQyxLQUFPQyxHQUFtQjFMLEVBQ25FbUwsRUFBUUgsR0FBSyxDQUNYLDJCQUNBdk8sRUFBTXhMLElBQ0osQ0FDRXlhLEVBQ0EsQ0FFRUMseUJBQXlCLEVBQ3pCQyxzQkFBc0IsRUFDdEJDLE9BQVEsQ0FBQyx1QkFDVEMsZUFBZ0IsQ0FBQyx5QkFHckIsQ0FBRTNPLFdBQVlwQixJQUdwQixDQUNGLENBQ0EsTUFBTXhNLEVBQWEwTixLQUFLRyxVQUFVOE4sU0FDNUJ6WixFQUFZMkIsSUFBSSxJQUFNRyxFQUFPRSxhQUFhM0QsRUFBVVAsS0FFOUQsQ0M5Q0EsTUFBTWdVLEdBQVUsQ0FDZHpHLFFBQVMsb0RBQ1RDLFFBQVMsQ0FBQywwREFLTDlOLGVBQWU4YyxHQUFxQjVjLEdBQ3pDLE9BQU9aLEVBQU9DLDBCQUEwQix1QkFBd0JTLFVBQzlELElBQUkyTixFQUFjbUQsRUFBVXdELElBQzVCLE1BQU16VCxFQUFXSixFQUFLbUIsUUFBUTFCLEVBQU9TLFFBQVMsaUJBQzlDLEdBQUlKLEVBQUdPLFdBQVcsR0FBR0QsTUFFbkIsT0FFRixJQUNFLE1BQU1ULFFBQW1CRyxFQUFHUSxTQUFTQyxTQUFTSCxFQUFVLFFBQ2xEa04sRUFBY0MsS0FBS0MsTUFBTTdOLEdBQy9CdU4sRUFBY0gsRUFBTXhMLElBQUksQ0FBQzJMLEVBQWFJLEVBQWFKLEdBQWMsQ0FDL0RPLFdBQVlwQixJQUVkYSxFQUFZRyxRQUFVSCxFQUFZRyxRQUFRdEUsT0FBUTZELEdBQTBCLGlCQUFUQSxFQUNyRSxDQUFFLE1BQ0EsQ0FJRW5OLEVBQU9zRyxVQUFVNkwsUUFDbkIxRSxFQUFZb1AsZUFBaUIsR0FFMUJwUCxFQUFZb1AsYUFBYWxaLEtBQU1tWixHQUM5QkEsRUFBS0Msa0JBQWtCdFosU0FBUyxVQUdsQ2dLLEVBQVlvUCxhQUFhdFAsS0FBSyxDQUFFd1Asa0JBQW1CLENBQUMsUUFBU0MsU0FBUyxXQUlwRTFhLEVBQVkyQixJQUFJLElBQU01RCxFQUFHUSxTQUFTb0wsR0FBRzFMLEVBQUttQixRQUFRMUIsRUFBT1MsUUFBUyxlQUFnQixDQUFFeUwsT0FBTyxXQUMzRjVKLEVBQVkyQixJQUFJLElBQU01RCxFQUFHUSxTQUFTb0wsR0FBRzFMLEVBQUttQixRQUFRMUIsRUFBT1MsUUFBUyxvQkFBcUIsQ0FBRXlMLE9BQU8sS0FDdEcsTUFBTTlMLEVBQWEwTixLQUFLRyxVQUFVUixTQUM1Qm5MLEVBQVkyQixJQUFJLElBQU1HLEVBQU9FLGFBQWEzRCxFQUFVUCxLQUU5RCxDQzdDTyxTQUFTNmMsR0FBNENDLEdBQzFELE1BQU1DLEVBQWUxWCxPQUFPQyxRQUFRd1gsR0FBSzdTLEtBQUssRUFBRStTLElBQVFDLEtBQVVELEVBQUtFLGNBQWNELElBQ3JGLElBQUssTUFBT3hJLEVBQUtDLEtBQVVxSSxTQUNsQkQsRUFBSXJJLEdBQ1ZxSSxFQUFnQ3JJLEdBQU9DLEVBR25CLGlCQUFWQSxHQUFnQyxPQUFWQSxHQUMvQm1JLEdBQVNuSSxHQUdiLE9BQU9vSSxDQUNULENDUkEsTUFBTUssR0FBYyxDQUNsQkMsZ0JBQWlCLENBQ2Z4USxPQUFRLFNBQ1J5USxPQUFRLFNBQ1JDLGlCQUFrQixPQUNsQkMsSUFBSyxZQUNMQyxjQUFjLEVBQ2RDLFFBQVEsRUFDUkMsY0FBYyxFQUNkQyw4QkFBOEIsRUFDOUJDLGlCQUFpQixFQUNqQkMsbUJBQW1CLEVBQ25CQyxhQUFhLEVBQ2JDLFdBQVcsRUFDWEMsZUFBZSxFQUNmQyxvQkFBb0IsRUFDcEJDLE9BQVEsT0FDUkMsVUFBVyxDQUFDLHdCQUF5QixhQUV2Q0MsUUFBUyxDQUFDLDJCQUE0QixpQkFDdENDLFFBQVMsQ0FDUCwwQkFDQSxzQkFDQSx1QkFDQSxlQUNBLFdBQ0EsY0FJRUMsR0FBYSxDQUNqQmxCLGdCQUFpQixDQUNmeFEsT0FBUSxTQUNSeVEsT0FBUSxTQUNSQyxpQkFBa0IsT0FDbEJDLElBQUssWUFDTEMsY0FBYyxFQUNkQyxRQUFRLEVBQ1JDLGNBQWMsRUFDZEMsOEJBQThCLEVBQzlCQyxpQkFBaUIsRUFDakJDLG1CQUFtQixFQUNuQkMsYUFBYSxFQUNiQyxXQUFXLEVBQ1hDLGVBQWUsRUFDZkMsb0JBQW9CLEVBQ3BCQyxPQUFRLE9BQ1JDLFVBQVcsQ0FBQyw0QkFBNkIsZUFBZ0IsYUFFM0RDLFFBQVMsQ0FBQyxpQkFDVkMsUUFBUyxDQUFDLGVBQWdCLFdBQVksY0FHakMzZSxlQUFlNmUsR0FBaUIzZSxHQUNyQyxPQUFPWixFQUFPQywwQkFBMEIsbUJBQW9CUyxVQUMxRCxHQUFJRSxFQUFPc0csVUFBVTZMLE9BQVNuUyxFQUFPc0csVUFBVUUsS0FBTSxPQUVyRCxJQUFJaUgsRUFBY21ELEVBQVU1USxFQUFPNEMsT0FBUzJhLEdBQWNtQixJQUNyRDFlLEVBQU80VCxzQkFBeUI1VCxFQUFPNGUsdUNBQ25DblIsRUFBWStQLGlCQUFpQkcsSUFFbEMzZCxFQUFPNEMsU0FBVzVDLEVBQU82Qyw4QkFDM0I0SyxFQUFZZ1IsUUFBVWhSLEVBQVlnUixTQUFTblYsT0FBUTdJLElBQXFCQSxFQUFRNkosV0FBVyxnQkFDM0ZtRCxFQUFZK1EsUUFBVS9RLEVBQVkrUSxTQUFTbFYsT0FBUTdJLElBQXFCQSxFQUFRNkosV0FBVyxpQkFFekZ0SyxFQUFPNmUsZUFDVHBSLEVBQVkrUCxnQkFBa0IsSUFDekIvUCxFQUFZK1AsZ0JBQ2ZDLE9BQVEsV0FDUkMsaUJBQWtCLGFBSXRCLE1BQU0vYyxFQUFXSixFQUFLbUIsUUFBUTFCLEVBQU9TLFFBQVMsaUJBQzlDLElBQ0UsTUFBTXdVLFFBQXdCNVUsRUFBR1EsU0FBU0MsU0FBU0gsRUFBVSxRQUN2RGtOLEVBQWNDLEtBQUtDLE1BQU1rSCxHQUNILHVEQUF4QnBILEVBQVlELGdCQUNQQyxFQUFZRCxlQUdkSCxFQUFZK1AsaUJBQWlCeFEsT0FDL0JoTixFQUFPNmUsc0JBQ0hwUixFQUFZK1AsaUJBQWlCQyxjQUM3QmhRLEVBQVkrUCxpQkFBaUJFLGtCQUVsQzdQLEVBQVkyUCxpQkFBaUJHLFlBQ3hCbFEsRUFBWStQLGlCQUFpQkcsSUFFdENsUSxFQUFjSCxFQUFNeEwsSUFBSSxDQUFDMkwsRUFBYUksRUFBYUosR0FBYyxDQUFFTyxXQUFZakIsSUFDL0VVLEVBQVlnUixRQUFVaFIsRUFBWWdSLFNBQVNuVixPQUN4QzdJLElBQ0VBLEVBQVFnRCxTQUFTLFlBQWNoRCxFQUFRZ0QsU0FBUyxnQkFBa0JoRCxFQUFRZ0QsU0FBUyxVQUUxRixDQUFFLE1BQ0EsQ0FFRndaLEdBQVN4UCxHQUNUQSxFQUFZZ1IsU0FBU3BVLE9BQ3JCLE1BQU1qSyxFQUFhME4sS0FBS0csVUFBVVIsVUFFM0JBLEVBQVkrUCxpQkFBaUJzQiw2QkFDOUJ4YyxFQUFZMkIsSUFBSSxJQUFNRyxFQUFPRSxhQUFhM0QsRUFBVVAsS0FFOUQsQ0MzR0EsTUFBTTJlLEdBQXNCLENBQzFCLHFCQUNBLDJCQUNBLHFCQUNBLFlBQ0EsYUFDQSxjQUdLamYsZUFBZWtmLEdBQXVCaGYsR0FDM0MsT0FBT1osRUFBT0MsMEJBQTBCLHlCQUEwQlMsVUFDaEUsSUFDRSxNQUFNYSxFQUFXSixFQUFLbUIsUUFBUTFCLEVBQU9TLFFBQVMsVUFBVyxpQkFDbkR3VSxRQUF3QjVVLEVBQUdRLFNBQVNDLFNBQVNILEVBQVUsUUFDN0QsSUFBSW9iLEVBQVdqTyxLQUFLQyxNQUFNa0gsR0FDMUIsSUFBSyxNQUFNZ0ssS0FBc0JGLEdBQy9CaEQsRUFBV3pPLEVBQU14TCxJQUFJLENBQUNpYSxFQUFVbUQsR0FBZUQsS0FFN0NqZixFQUFPeUsseUJBQ1RzUixFQUFXek8sRUFBTXhMLElBQUksQ0FBQ2lhLEVBQVVtRCxHQUFlLGtCQUU3Q2xmLEVBQU9zRyxVQUFVRSxPQUNuQnVWLEVBQVd6TyxFQUFNeEwsSUFBSSxDQUFDaWEsRUFBVW1ELEdBQWUsa0JBSTdDLDZCQUE4Qm5ELFVBQ3pCQSxFQUFTLDRCQUVkLHdCQUF5QkEsVUFDcEJBLEVBQVMsdUJBRWxCa0IsR0FBVWxCLEdBQXdDLElBQ2xELE1BQU0zYixFQUFhME4sS0FBS0csVUFBVThOLE9BQVVqWixFQUFXLFNBQ2pEUixFQUFZMkIsSUFBSSxJQUFNRyxFQUFPRSxhQUFhM0QsRUFBVVAsR0FDNUQsQ0FBRSxNQUNBLEdBR04sQ0FFQSxTQUFTOGUsR0FBZUQsR0FDdEIsTUFBTyxDQUNMLHVCQUF3QixDQUN0QkEsQ0FBQ0EsSUFBcUIsR0FHNUIsQ0NFQSxNQUFNRSxHQUFZLENBQ2hCdlQsS0FBTSxDQUNKdE0sS0FBTSxPQUNOOGYsR0FBSSxDQUNGQyxhQUFjLEtBQ2Q5UixLQUFNLENBQ0orUixTQUFVLENBQUMsT0FBUSxVQUl2QkMsWUFBYSxDQUNYQyxNQUFPLDJDQUNQLHNCQUFzQixHQUV4QkMsS0FBTSxDQUNKN1QsS0FBTSxDQUNKOFQsS0FBTSxvRUFJWkMsUUFBUyxDQUNQcmdCLEtBQU0sVUFDTjhmLEdBQUksQ0FDRjdSLEtBQU0sQ0FDSitSLFNBQVUsS0FHZEMsWUFBYSxDQUNYQyxNQUFPLHlCQUNQLHNCQUFzQixHQUV4QkMsS0FBTSxDQUNKRSxRQUFTLENBQ1BELEtBQU0sdUVBSVpFLEtBQU0sQ0FDSnRnQixLQUFNLGlCQUNOOGYsR0FBSSxDQUNGUyxrQkFBbUIsTUFFckJKLEtBQU0sQ0FDSkcsS0FBTSxDQUNKRixLQUFNLG9FQUlaLGFBQWMsQ0FDWnBnQixLQUFNLGFBQ044ZixHQUFJLENBQ0ZTLGtCQUFtQixNQUVyQkosS0FBTSxDQUNKLGFBQWMsQ0FDWkMsS0FBTSwwRUFJWixjQUFlLENBQ2JwZ0IsS0FBTSxnQkFDTjhmLEdBQUksQ0FDRlUsb0JBQXFCLENBQ25CQyxNQUFPLENBQUMsU0FBVSxTQUFVLGlCQUdoQ04sS0FBTSxDQUNKLGNBQWUsQ0FDYkMsS0FBTSwyRUFJWk0sS0FBTSxDQUNKMWdCLEtBQU0sT0FDTjhmLEdBQUksQ0FBQSxFQUNKSyxLQUFNLENBQ0pPLEtBQU0sQ0FBRU4sS0FBTSxvRUFHbEIsZUFBZ0IsQ0FDZHBnQixLQUFNLGVBQ044ZixHQUFJLENBQ0ZhLE9BQVEsQ0FDTkYsTUFBTyxDQUFDLGFBR1pOLEtBQU0sQ0FDSixlQUFnQixDQUNkQyxLQUFNLHlFQUNOUSxRQUFTLENBQ1BDLG9CQUFxQixtREFLN0IsZ0JBQWlCLENBQ2Y3Z0IsS0FBTSxvQkFDTjhmLEdBQUksQ0FDRkMsYUFBYyxDQUNaVSxNQUFPLENBQUMsWUFHWk4sS0FBTSxDQUNKLGdCQUFpQixDQUNmQyxLQUFNLDZFQUlaLHVCQUF3QixDQUN0QnBnQixLQUFNLDhCQUNOOGYsR0FBSSxDQUNGYSxPQUFRLENBQ05GLE1BQU8sQ0FBQyxhQUdaTixLQUFNLENBQ0osdUJBQXdCLENBQ3RCQyxLQUFNLGlGQUNOUSxRQUFTLENBQ1BFLGVBQWdCLG9DQUt4Qiw2QkFBOEIsQ0FDNUI5Z0IsS0FBTSxvQ0FDTjhmLEdBQUksQ0FDRmEsT0FBUSxDQUNORixNQUFPLENBQUMsYUFHWk4sS0FBTSxDQUNKLDZCQUE4QixDQUM1QkMsS0FBTSxpRkFDTlcsS0FBTSxDQUNKQyxRQUFTLGtCQUVYSixRQUFTLENBQ1BFLGVBQWdCLHlEQVNuQnRnQixlQUFleWdCLEdBQWtCN08sR0FDdEMsT0FBT3RTLEVBQU9DLDBCQUEwQixtQkFBb0JTLFVBQzFELE1BQU0wZ0IsRUFBZ0JqZ0IsRUFBS21CLFFBQVFnUSxFQUFXalIsUUFBUyxVQUFXLG1CQUM1REosRUFBR1EsU0FBU21ELE1BQU13YyxFQUFlLENBQUV0YyxXQUFXLElBR3BELE1BQU11YyxFQUFrQmxnQixFQUFLbUIsUUFBUWdRLEVBQVdqUixRQUFTLFVBQVcsc0JBQzlENkIsRUFBWTJCLElBQUksSUFBTTVELEVBQUdRLFNBQVNvTCxHQUFHd1UsRUFBaUIsQ0FBRXZVLE9BQU8sRUFBTWhJLFdBQVcsS0FFdEYsTUFBTXdCLFFBQWdCckYsRUFBR1EsU0FBU29DLFFBQVF1ZCxFQUFlLENBQUV0ZCxlQUFlLElBQ3BFd2QsRUFBYyxJQUFJbFcsSUFBSSxDQUMxQixXQUNBLFdBQ0EsaUJBQ0Esa0JBQ0Esb0JBQ0EsOEJBQ0c5RSxFQUFRNEQsT0FBUW5HLEdBQVdBLEVBQU9ZLFVBQVlaLEVBQU83RCxLQUFLaUUsU0FBUyxTQUFTeEIsSUFBS29CLEdBQVdBLEVBQU83RCxRQUVwR29TLEVBQVdwTCxVQUFVcVAsaUJBQ3ZCK0ssRUFBWXBKLElBQUksZ0JBRWQ1RixFQUFXNkQsY0FBZ0I3RCxFQUFXdkcsWUFBWWIsV0FBVyw2QkFDL0RvVyxFQUFZcEosSUFBSSxrQ0FDaEJvSixFQUFZcEosSUFBSSxxQkFHbEIsSUFBSyxNQUFNM1EsS0FBWStaLEVBQWEsQ0FFbEMsTUFBTUMsRUFBT3BnQixFQUFLd1IsU0FBU3BMLEVBQVUsY0FDL0JyRSxFQUFZMkIsSUFBSSxJQUFNMmMsR0FBa0JsUCxFQUFZOE8sRUFBZUcsR0FDM0UsT0FDTXJlLEVBQVkyQixJQUFJLElBQ3BCNUQsRUFBR1EsU0FBU29MLEdBQUcxTCxFQUFLQyxLQUFLZ2dCLEVBQWUsb0NBQXFDLENBQUV0VSxPQUFPLEVBQU1oSSxXQUFXLE1BRzdHLENBRUFwRSxlQUFlOGdCLEdBQWtCNWdCLEVBQXVCd2dCLEVBQXVCRyxHQUM3RSxJQUFJbFQsRUFBY21ELEVBQVV1TyxHQUFVd0IsSUFBbUMsQ0FBQSxHQUN6RSxNQUFNaGdCLEVBQVdKLEVBQUtDLEtBQUtnZ0IsRUFBZSxHQUFHRyxTQUM3QyxJQUNFLE1BQU16Z0IsUUFBbUJHLEVBQUdRLFNBQVNDLFNBQVNILEVBQVUsUUFDbERrTixFQUFjaUQsRUFBS0MsS0FBSzdRLEdBQzlCdU4sRUFBY0gsRUFBTXhMLElBQUksQ0FBQzJMLEVBQWFJLEVBQWFKLEdBQWMsQ0FBRU8sV0FBWWpCLEdBQ2pGLENBQUUsTUFDQSxDQUdFNFQsRUFBS3JXLFdBQVcsWUFDbEJtRCxFQUFjLElBQ1RBLEVBQ0g4UixZQUFhLENBQ1hDLE1BQU8seUJBQ1Asc0JBQXNCLElBSXRCL1IsRUFBWWdTLE1IelFiLFNBQ0x2QyxFQUNBckksR0FFQSxNQUFNQyxFQUFRb0ksRUFBSXJJLFVBQ1hxSSxFQUFJckksR0FDVnFJLEVBQThCckksR0FBT0MsQ0FFeEMsQ0drUU0rTCxDQUFhcFQsRUFBYSxRQUV4QkEsRUFBWTJSLElBQUk3UixPQUNsQkUsRUFBWTJSLEdBQUc3UixLQUFLLGdCQUFrQixJQUNqQyxJQUFJL0MsSUFBSSxDQUFDLFFBQVMsZ0JBQWtCaUQsRUFBWTJSLEdBQUc3UixLQUFLLGlCQUFtQixRQUtwRixJQUFLLE1BQU11VCxLQUFPcmIsT0FBT2lQLE9BQU9qSCxFQUFZZ1MsTUFBTyxDQUVqRCxJQUFLcUIsRUFBSXBCLE1BQU1qYyxXQUFXLHdCQUF5QixPQUVuRHNkLEdBQWEvZ0IsRUFBUThnQixFQUFLSCxFQUM1QixDQUVBLE9BQVFBLEdBQ04sSUFBSyxVQUNILEdBQUlsVCxFQUFZMlIsSUFBSTRCLGdCQUNYdlQsRUFBWTJSLEdBQUc3UixTQUNqQixNQUFJRSxFQUFZMlIsSUFBSTdSLE1BQVF2TixFQUFPMmYsUUFBUUwsU0FBUzFhLE9BQVMsR0FLbEUsa0JBRE12RSxFQUFHUSxTQUFTb0wsR0FBRzFMLEVBQUtDLEtBQUtnZ0IsRUFBZSxlQUFnQixDQUFFdFUsT0FBTyxJQUh2RXVCLEVBQVkyUixHQUFHN1IsS0FBSytSLFNBQVd0ZixFQUFPMmYsUUFBUUwsUUFLaEQsQ0FDQSxNQUVGLElBQUssY0FFSTdSLEVBQVkyUixJQUFJQyxlQUFlLHVCQUMvQjVSLEVBQVkyUixJQUFJN1IsT0FBTyxnQkFDMUJFLEVBQVkyUixJQUFJN1IsT0FDbEJFLEVBQVkyUixHQUFHN1IsS0FBSytSLFNBQVc3UixFQUFZMlIsR0FBRzdSLEtBQUsrUixTQUFTaFcsT0FBUTJYLEdBQXNCLGdCQUFYQSxJQUVqRixNQUVGLElBQUssT0FDQ3hULEVBQVkyUixJQUFJOEIsR0FBWXpULEVBQWEsR0FBSSxJQUNqRCxNQUVGLElBQUssYUFDSHlULEdBQVl6VCxFQUFhLEVBQUcsR0FRaEMsR0E2SEYsU0FBeUJBLFVBRWhCQSxFQUFZZ1MsS0FBSyxpQkFDMUIsQ0FuSUUwQixDQUFnQjFULFNBQ1YyVCxHQUFVM1QsRUFBYTlNLEdBRWhCLFlBQVRnZ0IsUUFDSXRnQixFQUFHUSxTQUFTb0wsR0FBRzFMLEVBQUtDLEtBQUtnZ0IsRUFBZSx3QkFBeUIsQ0FBRXRVLE9BQU8sU0FDM0UsR0FBYSxTQUFUeVUsRUFBaUIsQ0FFMUIsU0FETXRnQixFQUFHUSxTQUFTb0wsR0FBRzFMLEVBQUtDLEtBQUtnZ0IsRUFBZSxpQkFBa0IsQ0FBRXRVLE9BQU8sS0FDcEV1QixFQUFZZ1MsS0FBS08sT0FBU3ZTLEVBQVlnUyxLQUFLTyxLQUFLSyxLQUFNLE9BRzNENVMsRUFBWWdTLEtBQUssY0FBZ0JoUyxFQUFZZ1MsS0FBS08sS0FDbEQsTUFBTXFCLEVBQVM1VCxFQUFZZ1MsS0FBS08sS0FBS0ssS0FBS2lCLHlCQUMxQyxHQUFzQixpQkFBWEQsRUFBcUIsT0FFaEM1VCxFQUFZZ1MsS0FBS08sS0FBS0ssS0FBS2lCLHlCQUEyQixXQUFXRCxJQUNqRTVULEVBQVluTyxLQUFPLGdCQUNuQm1PLEVBQVkyUixHQUFLLENBQUVTLGtCQUFtQixhQUMvQnBTLEVBQVlnUyxLQUFLTyxXQUNsQm9CLEdBQVUzVCxFQUFhbE4sRUFBS0MsS0FBS2dnQixFQUFlLGtCQUN4RCxDQUNGLENBRUEsU0FBU08sR0FBYS9nQixFQUF1QjhnQixFQUFVSCxHQTRCckQsR0EzQkFHLEVBQUlULE9BQVMsQ0FBQSxFQUNiUyxFQUFJWixVQUFZLENBQUEsRUFHTCxTQUFUUyxHQUNTLFlBQVRBLEdBQ1MsU0FBVEEsR0FDUyxlQUFUQSxHQUNTLHlCQUFUQSxHQUNTLCtCQUFUQSxJQUVBRyxFQUFJWixRQUFrQixTQUFJbGdCLEVBQU91VixhQUFlLG1DQUFxQyw4QkFFbkZ2VixFQUFPMmYsUUFBUTRCLEtBQWlCLFlBQVRaLEdBQStCLFNBQVRBLElBQy9DRyxFQUFJWixRQUFtQixVQUFJLDRCQUV6QlksRUFBSVosUUFBd0IsaUJBQzlCWSxFQUFJWixRQUFzQyw2QkFBSSxxREFDdkNZLEVBQUlaLFFBQXdCLGlCQUdsQ1ksRUFBSVosUUFBNkIsc0JBQWUsWUFBVFMsR0FBc0JBLEVBQUtyVyxXQUFXLFlBQzdFd1csRUFBSVQsS0FBS21CLFlBQWNiLEVBQUtyVyxXQUFXLGFBRXhDd1csRUFBSVosUUFBNkIsb0JBQUksa0RBRzFCLFNBQVRTLEVBQWlCLENBQ25CLE1BQU1VLEVBQVNQLEVBQUlULE1BQU1pQix5QkFDSCxpQkFBWEQsSUFDVFAsRUFBSVQsS0FBS2lCLHlCQUEyQkQsRUFBT3RnQixRQUFRLFFBQVMsSUFFaEUsQ0F5Q0EsR0F2Q0lmLEVBQU9tTCxZQUFZYixXQUFXLHVCQUNoQ3dXLEVBQUlwQixLQUFPb0IsRUFBSXBCLEtBQUszZSxRQUFRLGtCQUFtQixnQkFDdENmLEVBQU9tTCxZQUFZYixXQUFXLDRCQUN2Q3dXLEVBQUlwQixLQUFPb0IsRUFBSXBCLEtBQUszZSxRQUFRLGVBQWdCLG9CQUliLFNBQTdCK2YsRUFBSVQsS0FBbUIscUJBQ2xCUyxFQUFJVCxLQUFtQixhQW9FbEMsU0FBb0JTLEdBRWxCLElBQUtBLEVBQUlULEtBQU0sY0FDUlMsRUFBSVQsS0FBc0IsdUJBQzFCUyxFQUFJVCxLQUFxQixzQkFDekJTLEVBQUlULEtBQWtCLG1CQUN0QlMsRUFBSVQsS0FBcUIsc0JBQ3pCUyxFQUFJVCxLQUFlLGdCQUNuQlMsRUFBSVQsS0FBWSxhQUNoQlMsRUFBSVQsS0FBb0IsYUFDakMsQ0EzRUVvQixDQUFXWCxHQUdQSCxFQUFLclcsV0FBVyxXQUFhd1csRUFBSVosUUFBdUIsZUFBMkMsaUJBQS9CWSxFQUFJVCxLQUFxQixpQkFDL0ZTLEVBQUlULEtBQXFCLGVBQUlTLEVBQUlULEtBQXFCLGVBQUV0ZixRQUFRLFlBQWEsS0FFM0VmLEVBQU9DLHlCQUNtQixnQkFBeEI2Z0IsRUFBSVQsS0FBYyxVQUF3Qk0sRUFBS3JXLFdBQVcsV0FBYXFXLEVBQUtyVyxXQUFXLFdBQ3pGd1csRUFBSVQsS0FBYyxRQUFJLFNBRXBCTSxFQUFLclcsV0FBVyxZQUNsQndXLEVBQUlULEtBQWUsU0FBSSxRQUlkLFlBQVRNLEdBQStCLFNBQVRBLEdBQW1CQSxFQUFLclcsV0FBVyxVQUN2RHRLLEVBQU91VixlQUNUdUwsRUFBSVQsS0FBMkIsc0JBQUksVUFHOUJTLEVBQUlULEtBQTJCLHFCQUdwQzVhLE9BQU9pUyxLQUFLb0osRUFBSVQsTUFBTXpiLE9BQVMsRUFDakNxWSxHQUFTNkQsRUFBSVQsYUFFTlMsRUFBSVQsS0FFVDVhLE9BQU9pUyxLQUFLb0osRUFBSVosU0FBU3RiLE9BQVMsRUFBRyxDQUV2QyxNQUFNOGMsRUFBYXpFLEdBQVM2RCxFQUFJWixnQkFDekJZLEVBQUlaLFFBQ1hZLEVBQUlaLFFBQVV3QixDQUNoQixhQUNTWixFQUFJWixPQUVmLENBRUEsU0FBU2dCLEdBQVl6VCxFQUF1QmtVLEVBQTZCQyxHQUN2RSxNQUFPQyxFQUFXQyxJQUFhclUsRUFBWTJSLEdBQUc0QixXQUFXLElBQUllLE1BQW1CLElBQUlwYSxNQUFNLEtBQUs1RixJQUFJc0gsUUFDbkcsR0FBa0IsSUFBZHdZLEdBQW1CeFksT0FBTzJZLFVBQVVGLEdBQVUsQ0FDaEQsTUFBTUcsR0FBV0gsRUFBVSxHQUFLLEdBS2hDLEdBSEVILEVBQXNCQyxFQUNsQkQsR0FBdUJNLEdBQVdBLEVBQVVMLEVBQzVDRCxHQUF1Qk0sR0FBV0EsRUFBVUwsRUFDckMsTUFDZixDQUVBLE1BRU1HLEVBQU8sR0FGRSxFQUFJRyxLQUFLQyxNQUFzQixHQUFoQkQsS0FBS0UsY0FDbkJULEVBQXNCTyxLQUFLQyxNQUFNRCxLQUFLRSxVQUFZUixFQUFzQkQsSUFDbkQsRUFBSSxJQUFNLFdBQy9DbFUsRUFBWTJSLEdBQUc0QixTQUFXLENBQUMsQ0FBRWUsUUFDL0IsQ0FFQWppQixlQUFlc2hCLEdBQVUzVCxFQUF1QjlNLEdBQzlDLE1BQU0waEIsRUFBV3ZSLEVBQUtHLEtBQUt4RCxFQUFhLENBQUV5RCxXQUFXLEVBQUlDLGNBQWMsRUFBTUMsT0FBUSxDQUFFLFNBQVUsaUJBQzNGL1EsRUFBR1EsU0FBU1AsVUFBVUssRUFBVTBoQixFQUN4QyxDQ2hhT3ZpQixlQUFld2lCLEdBQWtCdGlCLEdBQ3RDLE9BQU9aLEVBQU9DLDBCQUEwQixvQkFBcUJTLFVBQzNELE1BQU15aUIsRUFBZ0JoaUIsRUFBS21CLFFBQVExQixFQUFPUyxRQUFTLGVBQ25ELEdBQUlULEVBQU9rRyxNQVFULGFBUE01RCxFQUFZMkIsSUFBSSxJQUFNNUQsRUFBR1EsU0FBU29MLEdBQUdzVyxFQUFlLENBQUVyVyxPQUFPLFdBQzdENUosRUFBWTJCLElBQUksSUFDcEI1RCxFQUFHUSxTQUFTb0wsR0FBRzFMLEVBQUttQixRQUFRMUIsRUFBT1MsUUFBUyxTQUFVLENBQUV5TCxPQUFPLEVBQU1oSSxXQUFXLGdCQUU1RTVCLEVBQVkyQixJQUFJLElBQ3BCNUQsRUFBR1EsU0FBU29MLEdBQUcxTCxFQUFLbUIsUUFBUTFCLEVBQU9TLFFBQVMsYUFBYyxDQUFFeUwsT0FBTyxFQUFNaEksV0FBVyxLQUt4RixNQUFNc2UsRUFBaUJqYSxFQUEwQixPQUFRLENBQUMsYUFBY3ZJLEVBQU9TLFNBQ3pFZ2lCLEVBMENILFNBQTBCamYsRUFBcUIvQyxHQUNwRCxNQUFNaWlCLEVBQWVuYSxFQUEwQixNQUFPLENBQUMsT0FBUS9FLEVBQWEsV0FBWSxVQUFXL0MsR0FFbkcsT0FEaUJxTixLQUFLQyxNQUFNMlUsR0FDWjlhLE1BQ2xCLENBOUMwQithLENBQWlCLGVBQWdCM2lCLEVBQU9TLFNBQzFEbWlCLEdBQWVKLElBQW1CSSxHQUFlSCxJQUFrQkQsSUFBbUJDLEdBQ3hGM2EsRUFBVSxPQUFRLENBQUMsTUFBTyxVQUFXMmEsR0FBZ0J6aUIsRUFBT1MsUUFBUyxHQUd2RSxNQUFNb2lCLEVBQWV0aUIsRUFBS0MsS0FBS1IsRUFBT1MsUUFBUyxRQUFTLGtCQUNsREosRUFBR1EsU0FBU21ELE1BQU02ZSxFQUFjLENBQUUzZSxXQUFXLElBQ25ELElBQUssTUFBTWtCLFdBQWMvRSxFQUFHUSxTQUFTb0MsUUFBUTRmLEdBQ3ZDemQsRUFBS2tGLFdBQVcsV0FBYWxGLEVBQUtrRixXQUFXLFFBQVFtWSxhQUNqRG5nQixFQUFZMkIsSUFBSSxJQUFNNUQsRUFBR1EsU0FBU29MLEdBQUcxTCxFQUFLQyxLQUFLcWlCLEVBQWN6ZCxLQUt2RSxNQUFNMGQsRUFBYXZpQixFQUFLbUIsUUFBUTFCLEVBQU9TLFFBQVMsaUJBQzFDNkIsRUFBWTJCLElBQUksSUFBTTVELEVBQUdRLFNBQVNvTCxHQUFHNlcsRUFBWSxDQUFFNVcsT0FBTyxLQUVoRSxNQUFNNlAsRUFBV2pMLEVBQUtDLFdBQVcxUSxFQUFHUSxTQUFTQyxTQUFTeWhCLEVBQWUsU0FDckV4RyxFQUFTZ0gseUJBQTJCLEdBQ3BDaEgsRUFBU2lILFdBQWEsZUFDdEJqSCxFQUFTa0gsT0FBUywwQkFDWGxILEVBQVNtSCxpQkFDZ0MsSUFBNUNuSCxFQUFTb0gsd0JBQXdCdmUsZUFDNUJtWCxFQUFTb0gsdUJBR2xCcEgsRUFBU3FILG1CQUFvQixFQUM3QixNQUFNQyxFQUFpQnRILEVBQVNDLFNBQVNwWCxRQUFVLEVBRW5ELEdBREFtWCxFQUFTQyxRQUFVRCxFQUFTQyxTQUFTMVMsT0FBUXFSLEdBQWlCLGdDQUFYQSxFQUFFcGEsT0FBMkMsR0FDNUZ3YixFQUFTQyxRQUFRcFgsU0FBV3llLEVBQWdCLENBQzlDLE1BQU1DLEVBQWEvaUIsRUFBS21CLFFBQVExQixFQUFPUyxRQUFTLFVBQVcsdUJBQ3JENkIsRUFBWTJCLElBQUksSUFBTTVELEVBQUdRLFNBQVNvTCxHQUFHcVgsRUFBWSxDQUFFcFgsT0FBTyxJQUNsRSxDQUNnQyxJQUE1QjZQLEVBQVNDLFFBQVFwWCxlQUNabVgsRUFBU0MsY0FFWjNiLEVBQUdRLFNBQVNQLFVBQVVpaUIsRUFBZXpSLEVBQUtHLEtBQUs4SyxFQUFVLENBQUU3SyxXQUFXLEtBRTVFcEosRUFBVSxPQUFRLENBQUMsTUFBTyw0QkFBNkI5SCxFQUFPUyxVQUVsRSxDQU9BLFNBQVNtaUIsR0FBZXpaLEdBQ3RCLE1BQU9vYSxHQUFTcGEsRUFBUXhCLE1BQU0sS0FDOUIsT0FBTzBCLE9BQU9rYSxFQUNoQixDQ3JGT3pqQixlQUFlMGpCLEdBQVl4akIsR0FDaEMsT0FBT1osRUFBT0MsMEJBQTBCLGNBQWVTLFVBQ3JELElBQUtxSCxFQUFnQixPQUVyQixNQUFPa0UsRUFBT0MsR0FBUS9ELEVBQVdDLGNBQWN4SCxFQUFPbUwsWUFBYyxJQUNwRSxHQUFLRSxHQUFVQyxJQUNELGdCQUFWRCxHQUFxQyxtQkFBVkEsR0FFL0IsVUFDUW9ZLEdBQVdwWSxFQUFPQyxFQUFNLHdCQUF5QixnQkFDakRtWSxHQUFXcFksRUFBT0MsRUFBTSxxQkFBc0IsZ0JBQzlDbVksR0FBV3BZLEVBQU9DLEVBQU0sa0JBQW1CLGdCQUMzQ21ZLEdBQVdwWSxFQUFPQyxFQUFNLG1CQUFvQixnQkFDNUNtWSxHQUFXcFksRUFBT0MsRUFBTSxzQkFBdUIsZ0JBQy9DbVksR0FBV3BZLEVBQU9DLEVBQU0sa0NBQW1DLGdCQUMzRG1ZLEdBQVdwWSxFQUFPQyxFQUFNLDBCQUEyQixnQkFDbkRtWSxHQUFXcFksRUFBT0MsRUFBTSx1QkFBd0IsZ0JBQ2hEbVksR0FBV3BZLEVBQU9DLEVBQU0sNkJBQThCLGdCQUN0RG1ZLEdBQVdwWSxFQUFPQyxFQUFNLFdBQVksZ0JBQ3BDbVksR0FBV3BZLEVBQU9DLEVBQU0sY0FBZSxnQkFDdkNtWSxHQUFXcFksRUFBT0MsRUFBTSxZQUFhLGdCQUNyQ21ZLEdBQVdwWSxFQUFPQyxFQUFNLFdBQVksZ0JBQ3BDbVksR0FBV3BZLEVBQU9DLEVBQU0sWUFBYSxnQkFDckNtWSxHQUFXcFksRUFBT0MsRUFBTSxzQkFBdUIsZ0JBQy9DbVksR0FBV3BZLEVBQU9DLEVBQU0saUJBQWtCLGdCQUMxQ21ZLEdBQVdwWSxFQUFPQyxFQUFNLHlCQUEwQixnQkFDbERtWSxHQUFXcFksRUFBT0MsRUFBTSxzQkFBdUIsZ0JBQy9DbVksR0FBV3BZLEVBQU9DLEVBQU0sc0JBQXVCLGdCQUMvQ21ZLEdBQVdwWSxFQUFPQyxFQUFNLGlCQUFrQixnQkFDMUNtWSxHQUFXcFksRUFBT0MsRUFBTSxpQkFBa0IsZ0JBQzFDbVksR0FBV3BZLEVBQU9DLEVBQU0saUJBQWtCLGdCQUMxQ21ZLEdBQVdwWSxFQUFPQyxFQUFNLGlCQUFrQixnQkFDMUNtWSxHQUFXcFksRUFBT0MsRUFBTSxpQkFBa0IsZ0JBQzFDbVksR0FBV3BZLEVBQU9DLEVBQU0sa0JBQW1CLGdCQUMzQ21ZLEdBQVdwWSxFQUFPQyxFQUFNLG9CQUFxQixnQkFDN0NtWSxHQUFXcFksRUFBT0MsRUFBTSxtQkFBb0IsZ0JBQzVDbVksR0FBV3BZLEVBQU9DLEVBQU0sOEJBQStCLGdCQUN2RG1ZLEdBQVdwWSxFQUFPQyxFQUFNLGlCQUFrQixnQkFDMUNtWSxHQUFXcFksRUFBT0MsRUFBTSxxQkFBc0IsZ0JBQzlDbVksR0FBV3BZLEVBQU9DLEVBQU0sZUFBZ0IsZ0JBQ3hDbVksR0FBV3BZLEVBQU9DLEVBQU0sZ0JBQWlCLGdCQUN6Q21ZLEdBQVdwWSxFQUFPQyxFQUFNLHdCQUF5QixnQkFDakRtWSxHQUFXcFksRUFBT0MsRUFBTSxzQkFBdUIsZ0JBQy9DbVksR0FBV3BZLEVBQU9DLEVBQU0sc0JBQXVCLGdCQUMvQ21ZLEdBQVdwWSxFQUFPQyxFQUFNLFVBQVcsZ0JBQ25DbVksR0FBV3BZLEVBQU9DLEVBQU0saUJBQWtCLGdCQUMxQ21ZLEdBQVdwWSxFQUFPQyxFQUFNLGdCQUFpQixnQkFFekNvWSxHQUFZclksRUFBT0MsRUFBTSxhQUN6Qm9ZLEdBQVlyWSxFQUFPQyxFQUFNLHVCQUN6Qm9ZLEdBQVlyWSxFQUFPQyxFQUFNLG1CQUN6Qm9ZLEdBQVlyWSxFQUFPQyxFQUFNLHFCQUN6Qm9ZLEdBQVlyWSxFQUFPQyxFQUFNLDBCQUN6Qm9ZLEdBQVlyWSxFQUFPQyxFQUFNLHFCQUN6Qm9ZLEdBQVlyWSxFQUFPQyxFQUFNLGlCQUN6Qm9ZLEdBQVlyWSxFQUFPQyxFQUFNLGtCQUN6Qm9ZLEdBQVlyWSxFQUFPQyxFQUFNLGlCQUV6Qm9ZLEdBQVlyWSxFQUFPQyxFQUFNLGVBQ3pCb1ksR0FBWXJZLEVBQU9DLEVBQU0sMEJBQ3pCb1ksR0FBWXJZLEVBQU9DLEVBQU0sa0JBQ3pCb1ksR0FBWXJZLEVBQU9DLEVBQU0sMEJBQ3pCb1ksR0FBWXJZLEVBQU9DLEVBQU0saUJBQ2pDLENBQUUsTUFBTzVMLEdBQ1BGLFFBQVFta0IsS0FBSywyQkFBNkJqa0IsR0FBaUJFLE9BQVNGLEVBQ3RFLEdBRUosQ0FFQUksZUFBZTJqQixHQUFXcFksRUFBZUMsRUFBY2hNLEVBQWNza0IsR0FDbkUsVUFDUXhjLEVBQVFnRSxRQUFRLG9DQUFxQyxDQUN6REMsUUFDQUMsT0FDQWhNLE9BQ0Fza0IsU0FFSixDQUFFLFlBQ014YyxFQUFRZ0UsUUFBUSw0Q0FBNkMsQ0FDakVDLFFBQ0FDLE9BQ0FoTSxPQUNBc2tCLFNBRUosQ0FDRixDQUVBOWpCLGVBQWU0akIsR0FBWXJZLEVBQWVDLEVBQWNoTSxHQUN0RCxVQUNROEgsRUFBUWdFLFFBQVEsNkNBQThDLENBQ2xFQyxRQUNBQyxPQUNBaE0sUUFFSixDQUFFLE1BQ0EsQ0FFSixDQzNGQSxNQUFNdWtCLEdBQXdCLENBQUMsNkJBRXhCL2pCLGVBQWVna0IsR0FBYTlqQixHQUNqQyxPQUFPWixFQUFPQywwQkFBMEIsZUFBZ0JTLFVBQ3RELElBQUtxSCxJQUFtQnBJLEVBQVFJLGtCQUFtQixPQUVuRCxNQUFPa00sRUFBT0MsR0FBUS9ELEVBQVdDLGNBQWN4SCxFQUFPbUwsWUFBYyxJQUNwRSxJQUFLRSxJQUFVQyxHQUFrQixtQkFBVkQsRUFBNEIsT0FFbkQsTUFBTTBZLEVBQVNDLEVBQU9oa0IsU0FBUytqQixRQUFVLENBQUEsRUFDekMsR0FBbUMsSUFBL0J0ZSxPQUFPaVMsS0FBS3FNLEdBQVFuZixPQUV4QixJQUNFLElBQUssTUFBTXFmLEtBQWNKLEdBQ3ZCLFVBQ1F6YyxFQUFRZ0UsUUFBUSw2REFBOEQsQ0FDbEZDLFFBQ0FDLE9BQ0E0WSxZQUFhRCxHQUVqQixDQUFFLE1BQ0EsQ0FJSixNQUFNdlosUUFBaUJ0RCxFQUFRZ0UsUUFBUSx1REFBd0QsQ0FDN0ZDLFFBQ0FDLFVBRUl1SixJQUFFQSxFQUFLc1AsT0FBUUMsR0FBVTFaLEVBQVNhLFdBRWxDOFksRUFBT0MsTUFFYixJQUFLLE1BQU9obEIsRUFBTWlsQixLQUFXOWUsT0FBT0MsUUFBUXFlLEdBQVMsQ0FDbkQsR0FBSS9qQixFQUFPdVYsY0FBeUIsZUFBVGpXLEVBQXVCLFNBQ2xELElBQUtVLEVBQU91VixjQUF5QixzQkFBVGpXLEVBQThCLFNBRzFELE1BQU1rbEIsRUFBU0gsRUFBT0ksWUFBWTVQLEVBQUt3UCxFQUFPSyxnQkFBZ0JDLFVBQ3hEQyxFQUFTUCxFQUFPUSxZQUFZTixHQUc1Qk8sRUFBV1QsRUFBT1UsZ0JBQWdCSCxFQUFRSixHQUcxQ1EsRUFBWVgsRUFBT1ksVUFBVUgsRUFBVVQsRUFBT0ssZ0JBQWdCQyxnQkFFOUR2ZCxFQUFRZ0UsUUFBUSwwREFBMkQsQ0FDL0VDLFFBQ0FDLE9BQ0E0WSxZQUFhNWtCLEVBQ2I0bEIsZ0JBQWlCRixFQUNqQmIsT0FBUUMsR0FFWixDQUNGLENBQUUsTUFBTzFrQixHQUNQRixRQUFRbWtCLEtBQUssNEJBQThCamtCLEdBQWlCRSxPQUFTRixFQUN2RSxHQUVKLENDaEVPSSxlQUFlcWxCLEdBQW9CbmxCLEdBQ3hDLE1BQU9xTCxFQUFPQyxHQUFRL0QsRUFBV0MsY0FBY3hILEVBQU9tTCxZQUFjLElBQy9ERSxHQUFVQyxJQUNELGdCQUFWRCxHQUFxQyxtQkFBVkEsU0FFekIrWixFQUFVLElBQ2RoZSxFQUFRZ0UsUUFBUSw4QkFBK0IsQ0FDN0NDLFFBQ0FDLE9BQ0ErWixvQkFBb0IsRUFDcEJDLG9CQUFvQixFQUNwQkMsb0JBQW9CLEVBQ3BCQyx3QkFBd0IsRUFDeEJDLDBCQUEyQixXQUMzQkMsNEJBQTZCLFFBQzdCQyxRQUFTLENBQ1AsdUJBQXdCLGlCQUV0QjNsQixFQUFPbUwsWUFBWWIsV0FBVyx1QkFBeUIsQ0FBRXNiLGtCQUFrQixHQUFTLENBQUEsS0FHOUYsQ0NoQkEsTUFBTUMsR0FBWSxDQUNoQiwyQkFBNEIsNDJDQTBDNUJwZixRQUdLM0csZUFBZWdtQixHQUF3QjlsQixHQUM1QyxPQUFPWixFQUFPQywwQkFBMEIsMEJBQTJCUyxVQUNqRSxJQUFLLE1BQU82RyxFQUFVdkcsS0FBZXFGLE9BQU9DLFFBQVFtZ0IsSUFBWSxDQUM5RCxNQUFNbGxCLEVBQVdKLEVBQUttQixRQUFRMUIsRUFBT1MsUUFBUyxVQUFXa0csR0FDekQsR0FBSXRHLEVBQUdPLFdBQVdELEdBQVcsQ0FDM0IsTUFBTVQsUUFBbUJHLEVBQUdRLFNBQVNDLFNBQVNILEVBQVUsUUFDeEQsR0FBSW9sQixFQUFTN2xCLEVBQVlFLEdBQWNBLEVBQVd3RSxPQUFTLEVBQ3pELFFBRUosT0FFTXZFLEVBQUdRLFNBQVNtRCxNQUFNekQsRUFBS21CLFFBQVExQixFQUFPUyxRQUFTLFdBQVksQ0FBRXlELFdBQVcsVUFDeEU1QixFQUFZMkIsSUFBSSxJQUFNRyxFQUFPRSxhQUFhM0QsRUFBVVAsR0FDNUQsR0FFSixDQ0xBLE1BQU00bEIsR0FBaUJDLEVBQUVDLE9BQU8sQ0FDOUJ0Z0IsTUFBT3FnQixFQUNKQyxPQUFPLENBQ05wa0IsSUFBS21rQixFQUFFRSxPQUFPRixFQUFFRyxVQUFVQyxXQUMxQkMsSUFBS0wsRUFBRUUsT0FBT0YsRUFBRUcsVUFBVUMsV0FDMUJFLEdBQUlOLEVBQUVFLE9BQU9GLEVBQUVHLFVBQVVDLFdBQ3pCeFQsS0FBTW9ULEVBQUVFLE9BQU9GLEVBQUVHLFVBQVVDLGFBRTVCQSxhQUdFdm1CLGVBQWUwbUIsR0FDcEIvbEIsRUFDQWlSLEdBRUEsTUFBTW9ILEVBQWtCdlksRUFBS21CLFFBQVFqQixFQUFTLGdCQUM5QyxJQUNFLE1BQU11SyxFQUEwQjNLLEVBQUdPLFdBQVdrWSxHQUM5QyxJQUFJalYsRUFBNEMsQ0FBQSxFQUM1Q0MsRUFBa0QsQ0FBQSxFQUNsREYsRUFBMkIsQ0FBQSxFQUMzQjZpQixHQUFhLEVBQ2pCLEdBQUl6YixFQUF5QixDQUMzQixNQUFNMGIsRUFBa0JybUIsRUFBRzhOLGFBQWEySyxFQUFpQixRQUN6RGxWLEVBQWNrSyxLQUFLQyxNQUFNMlksR0FDekI3aUIsRUFBZUQsRUFBWUMsY0FBZ0IsQ0FBQSxFQUMzQ0MsRUFBa0JGLEVBQVlFLGlCQUFtQixDQUFBLEVBQ2pEMmlCLEVBQWtDLFdBQXJCN2lCLEVBQVkraUIsSUFDM0IsQ0FFQSxJQUFJQyxFQUE0QixHQUM1QkMsRUFBMkIsR0FDL0IsSUFDRSxNQUFNQyxFQUFvQnZtQixFQUFLbUIsUUFBUWpCLEVBQVMsbUJBQzFDbUssRUFBT2tELEtBQUtDLFlBQVlnWixFQUFJam1CLFNBQVNnbUIsRUFBbUIsU0FNOURGLEVBQWtCaGMsR0FBTTBVLFVBQVksR0FDcEN1SCxFQUFpQmpjLEdBQU1vUixTQUFTZ0wsUUFBVSxFQUM1QyxDQUFFLE1BQ0EsQ0FHRixNQUFNcGtCLEVBQzJDLGFBQS9DckMsRUFBS3dSLFNBQVN4UixFQUFLbUIsUUFBUWpCLEVBQVMsU0FDbkNKLEVBQUdPLFdBQVdMLEVBQUttQixRQUFRakIsRUFBUyxLQUFNLEtBQU0saUJBRW5ELElBQUl3bUIsRUFDQXJrQixJQUNGcWtCLFFBcUpObm5CLGVBQTZCVyxFQUFpQm1ELEdBQzVDLE1BQU1zakIsRUFBTUMsRUFBVTFtQixHQUVoQjJtQixTQURnQkYsRUFBSUcsWUFBVyxJQUNkM00sS0FBTTRNLEdBQWlCLFdBQVhBLEVBQUVob0IsTUFDL0Jpb0IsRUFBWUgsR0FBUUksTUFBTTdjLE9BQVN5YyxHQUFRSSxNQUFNamEsS0FDdkQsR0FBeUIsaUJBQWRnYSxFQUF3QixDQUNqQyxNQUFNM2MsUUFBYTZjLEdBQWdCRixHQUNuQyxHQUFJM2MsRUFBTSxPQUFPQSxDQUNuQixDQUVBLE1BQU0rSCxFQUF3QyxpQkFBM0IvTyxFQUFZdUgsV0FBMEJ2SCxFQUFZdUgsV0FBYXZILEVBQVl1SCxZQUFZd0gsSUFDMUcsR0FBSUEsRUFBSyxDQUNQLE1BQU0vSCxRQUFhNmMsR0FBZ0I5VSxHQUNuQyxHQUFJL0gsR0FBeUIsY0FBakJBLEVBQUs4YyxRQUF5QixPQUFPOWMsQ0FDbkQsQ0FDRixDQXBLdUIrYyxDQUFjbG5CLEVBQVNtRCxJQUcxQyxJQUFJb0csRUFBZSxHQUNuQixJQUVFQSxVQURzQitjLEVBQUlqbUIsU0FBU1AsRUFBS21CLFFBQVFqQixFQUFTLGtCQUFtQixTQUNwRGdHLE1BQzFCLENBQUUsTUFDQSxDQUVGLElBQUssTUFBT3FGLEVBQVF4TSxJQUFTLENBQzNCLENBQUMsT0FBUSxRQUNULENBQUMsT0FBUSxVQUNULENBQUMsU0FBVSxXQUVYLElBQ0UsTUFBTXNvQixRQUEyQmIsRUFBSWptQixTQUFTUCxFQUFLbUIsUUFBUWpCLEVBQVMsSUFBSXFMLGFBQW1CLFFBQ3ZGOUIsSUFDRkEsR0FBZ0IsTUFFbEJBLEdBQWdCMUssRUFBTyxJQUFNc29CLEVBQW1CbmhCLE1BQ2xELENBQUUsTUFDQSxDQUlKLElBQUl0RyxFQUFhLEdBQ2pCLElBQ0VBLFFBQW1CNG1CLEVBQUlqbUIsU0FBU1AsRUFBS21CLFFBQVFqQixFQUFTLGNBQWUsT0FDdkUsQ0FBRSxNQUNBLENBSUYsTUFBTW9uQixFQUFldG5CLEVBQUttQixRQUFRakIsRUFBUyxhQUMzQyxJQUFJa0YsRUFDSixJQUNFLE1BQU1taUIsUUFBcUJmLEVBQUlqbUIsU0FBUyttQixFQUFjLFFBQ3REbGlCLEVBQVdxZ0IsR0FBZWpZLE1BQU1ELEtBQUtDLE1BQU0rWixHQUM3QyxDQUFFLE1BQ0EsQ0FHRixNQUFNOW5CLEVBQXdCLENBQzVCUyxVQUNBTixhQUNBeUMsU0FDQTJTLGNBQW9DLElBQXRCMFIsR0FBVTNRLFFBQ3hCZCx3QkFBeUI1UixFQUFZdVUsTUFDckNoTixXQUFZOGIsR0FBVWMsVUFBWSxVQUFVZCxFQUFTYyxpQkFBd0JqbEIsRUFDN0VvRCxNQUFPd0wsR0FBWXhMLE9BQVM3RixFQUFHTyxXQUFXTCxFQUFLQyxLQUFLQyxFQUFTLGdCQUM3RG9lLGFBQWM0SCxFQUNkalMscUJBQXNCc0UsRUFBZ0JyVixTQUFTLEdBQUdsRCxFQUFLeW5CLDBCQUN2RG5sQiw0QkFBNkJvbEIsR0FBWSwyQkFBNEJ4bkIsR0FDckVSLHlCQUEwQkUsR0FBY0UsRUFBR08sV0FBV0wsRUFBS21CLFFBQVFqQixFQUFTLHVCQUM1RW9SLG9CQUFxQnhSLEVBQUdPLFdBQVdMLEVBQUttQixRQUFRakIsRUFBUyxZQUN6RHFSLGtCQUFtQnpSLEVBQUdPLFdBQVdMLEVBQUttQixRQUFRakIsRUFBUyxXQUN2RHVLLHdCQUF5QjNLLEVBQUdPLFdBQVdMLEVBQUttQixRQUFRakIsRUFBUyxpQkFDN0RnSyx1QkFBd0JwSyxFQUFHTyxXQUFXTCxFQUFLbUIsUUFBUWpCLEVBQVMsZ0JBQzVEdVIsbUJBQW9CM1IsRUFBR08sV0FBV0wsRUFBS21CLFFBQVFqQixFQUFTLFlBQ3hEd1Isd0JBQXlCNVIsRUFBR08sV0FBV0wsRUFBS21CLFFBQVFqQixFQUFTLGlCQUM3RHlSLHlCQUEwQjdSLEVBQUdPLFdBQVdMLEVBQUttQixRQUFRakIsRUFBUyxrQkFDOUR5bkIsK0JBQWdDN25CLEVBQUdPLFdBQVdMLEVBQUttQixRQUFRakIsRUFBUyxVQUFXLGtCQUMvRXlWLHVCQUF3QitSLEdBQVksK0NBQWdEeG5CLEdBQ3BGMlYsdUJBQXdCNlIsR0FBWSwrQ0FBZ0R4bkIsR0FDcEZtVCxxQkFBc0JxVSxHQUFZLDhCQUErQnhuQixHQUNqRTBWLGlDQUFrQzhSLEdBQ2hDLDJEQUNBeG5CLEdBRUY0VixpQ0FBa0M0UixHQUNoQywyREFDQXhuQixHQUVGbWUsK0JBQWdDcUosR0FBWSwwQ0FBMkN4bkIsR0FDdkY2RixVQUFXLENBQ1Q2TCxRQUFTdE8sRUFBb0IsTUFDN0JrSCxXQUFZakgsRUFBZ0Isa0JBQzVCeUMsWUFBYXpDLEVBQWdCLGVBQzdCME8sV0FBWXJTLEVBQVdzRCxTQUFTLHlCQUNoQytDLE9BQVEzQyxFQUFtQixLQUMzQndPLGlCQUNJeE8sRUFBYSx1QkFDYkMsRUFBZ0IsdUJBQ2hCQSxFQUE0QixXQUNoQ3NPLFNBQVV2TyxFQUFhLHFCQUF1QkMsRUFBd0IsT0FDdEV5VSxVQUFXelUsRUFBeUIsUUFDcEN3TyxjQUFlek8sRUFBYSxnQkFDNUI4UixtQkFDRTdSLEVBQWdCLHFCQUNoQjhpQixFQUFnQmhpQixPQUFTLEdBQ3pCaWlCLEVBQWVqaUIsT0FBUyxHQUUxQjJOLFlBQWF6TyxFQUFnQixvQkFDN0JtUyxLQUFNcFMsRUFBYSxzQkFBd0JDLEVBQWdCLG9CQUU3RDZiLFFBQVMsQ0FDUEwsU0FBVXNILEVBQ1Z1QixPQUFRdEIsRUFBZXBqQixTQUFTLDRCQUNoQzhkLElBQUtzRixFQUFlcGpCLFNBQVMsMEJBRS9CdUcsZUFDQXBHLGNBQ0ErQixZQUtGLEdBSEszRixFQUFPa0csUUFDVmxHLEVBQU82UCxXQTZCYixTQUFnQzdQLEdBQzlCLEdBQUlBLEVBQU9zRyxVQUFVRSxLQUNuQixNQUFPLGtDQUNGLEdBQUl4RyxFQUFPb1csdUJBQ2hCLE9BQU9wVyxFQUFPNFQscUJBQXVCLHNDQUF3QyxnQ0FFN0UsR0FBSTVULEVBQU80VCxxQkFDVCxNQUFPLHNDQUNGLEdBQUk1VCxFQUFPa1csdUJBQ2hCLE1BQU8sK0JBR2IsQ0F6QzBCa1MsQ0FBdUJwb0IsSUFHM0NBLEVBQU82UixxQkFDUDdSLEVBQU84UixtQkFDUDlSLEVBQU9nTCx5QkFDUGhMLEVBQU95Syx3QkFDUHpLLEVBQU9nUyxvQkFDUGhTLEVBQU9pUyx5QkFDUGpTLEVBQU9rUyx5QkFFUCxPQUFPbFMsQ0FFWCxDQUFFLE1BQ0EsQ0FFSixDQUVBLFNBQVNpb0IsR0FBWUksRUFBaUI1bkIsR0FDcEMsT0FBT1UsRUFBRzZVLFNBQVNxUyxFQUFTLENBQUVobkIsS0FBSyxFQUFNQyxJQUFLYixFQUFTYyxPQUFRUCxJQUFjNEQsT0FBUyxDQUN4RixDQXdDQTlFLGVBQWUybkIsR0FBZ0JoZ0IsR0FDN0IsTUFBTzZnQixFQUFLaHBCLEdBQVFpSSxFQUFXQyxjQUFjQyxHQUM3QyxJQUFLNmdCLElBQVFocEIsRUFBTSxPQUVuQixNQUFNaXBCLEVBQU0sQ0FBRVIsVUFBVyxHQUFHTyxLQUFPaHBCLEtBQ25DLElBQ0UsTUFBTW9MLFFBQWlCdEQsRUFBUWdFLFFBQVEsNEJBQTZCLENBQ2xFQyxNQUFPaWQsRUFDUGhkLEtBQU1oTSxJQUVSbUcsT0FBTytpQixPQUFPRCxFQUFLN2QsRUFBU2EsS0FDOUIsQ0FBRSxNQUNBLENBRUYsT0FBT2dkLENBQ1QsT0M1UEF6b0IsaUJBQ0UsTUFBTTJvQixRQUFhQyxFQUFNN2hCLFFBQVE0aEIsS0FBS3BsQixNQUFNLElBQ3pDMEUsUUFBUSxlQUFnQix1REFBeUQyZ0IsSUFDaEZBLEVBQU1DLFdBQVcsUUFBUyxDQUN4QkMsU0FBVSw2QkFDVkMsT0FBTyxFQUNQbEMsS0FBTSxTQUNObUMsUUFBUyxDQUFDLFNBR2IvcEIsUUFBUSxDQUNQK0gsSUFBSyxDQUNIVixZQUFhLG9EQUNidWdCLEtBQU0sVUFDTm1DLFNBQVMsRUFDVEMsTUFBTyxLQUVUQyxTQUFVLENBQ1I1aUIsWUFBYSwrQkFDYnVnQixLQUFNLFVBQ05tQyxTQUFTLEVBQ1RDLE1BQU8sS0FFVEUsUUFBUyxDQUNQN2lCLFlBQWEsd0NBQ2J1Z0IsS0FBTSxVQUNObUMsU0FBUyxFQUNUQyxNQUFPLE9BR1ZsTCxTQUFTNEssS0FDWjFwQixFQUFRRyxVQUFZdXBCLEVBQUtRLFFBQ3pCbHFCLEVBQVFJLGtCQUFvQnNwQixFQUFLM2hCLElBRWpDLElBQUssTUFBTW9pQixLQUFlVCxFQUFLVSxNQUFtQixDQUNoRCxNQUFNQyxFQUFrQjdvQixFQUFLQyxLQUFLMG9CLEVBQWEsWUFFekNHLFNBRGlCQyxFQUFpQixJQUFNanBCLEVBQUdRLFNBQVNvQyxRQUFRbW1CLEVBQWlCLENBQUVsbUIsZUFBZSxNQUFhLElBQ3JGb0csT0FBUW1PLEdBQU1BLEVBQUV0VCxlQUFlcEMsSUFBSzBWLEdBQU1sWCxFQUFLQyxLQUFLNG9CLEVBQWlCM1IsRUFBRW5ZLGFBRTdGcUMsRUFBc0MsQ0FBQ3VuQixLQUFnQkcsSUFFN0QsTUFBTTNYLFFBQW1COFUsR0FBaUIwQyxHQUUxQyxJQUFLeFgsRUFBWSxDQUNmbFMsUUFBUUUsTUFBTSxxQ0FBcUN3cEIsS0FDbkQsUUFDRixDQUNBLE1BQU1LLEVBQXNCOWtCLEVBQVNpTixHQUsvQjhYLFNBSGtDM25CLFFBQVFDLElBQzlDdW5CLEVBQVl0bkIsSUFBSzBuQixHQUFlakQsR0FBaUJpRCxFQUFZL1gsTUFFWHBJLE9BQVF0SixLQUFhQSxHQUNuRTBwQixFQUFvQixDQUFDaFksS0FBZThYLEdBRTFDLEdBQUl6cUIsRUFBUUcsVUFDVixJQUFLLE1BQU1jLEtBQVUwcEIsRUFDbkJscUIsUUFBUUMsS0FBS08sU0FLWCtKLEVBQXFCMkgsU0FFckI0USxHQUFrQjVRLFNBQ2xCN1AsUUFBUUMsSUFBSSxDQUNoQi9CLEVBQWMyUixHQUNkelEsRUFBa0J5USxHQUNsQjZYLEVBQW9CSSxLQUFLLElBQU10TyxHQUFlM0osSUFDOUM3TCxFQUEwQjZMLEVBQVlnWSxHQUN0Q3ZhLEdBQXFCdUMsR0FDckIvQixHQUFxQitCLEdBQ3JCbEIsR0FBcUJrQixHQUNyQkwsR0FBcUJLLEdBQ3JCSCxHQUFzQkcsR0FDdEJvVSxHQUF3QnBVLEdBQ3hCbUksR0FBcUJuSSxHQUNyQmtMLEdBQXFCbEwsR0FDckJvSyxHQUFrQnBLLEdBQ2xCNk8sR0FBa0I3TyxHQUNsQjhSLEdBQVk5UixHQUNab1MsR0FBYXBTLEdBQ2J5VCxHQUFvQnpULE1BQ2hCQSxFQUFXeEwsTUFDWCxDQUNFZ0ksR0FBbUJ3RCxHQUNuQm1ILEdBQW1DbkgsR0FBWWlZLEtBQUssSUFBTTVQLEdBQW9DckksS0FFaEcsQ0FBQ21ILEdBQW1DbkgsSUFDeEN5SSxHQUFxQnpJLFdBRWpCcFAsRUFBWStDLGFBRWxCLE1BQU14RSxFQUE0QixHQUNsQyxJQUFLLE1BQU1iLEtBQVUwcEIsR0FDZjFwQixFQUFPb1csd0JBQTBCcFcsRUFBT3FXLG1DQUMxQ3hWLEVBQVMwTSxLQUFLL0ssRUFBbUJ4QyxFQUFRQSxFQUFPNEMsT0FBUzhtQixFQUFvQixDQUFDMXBCLEtBRTVFQSxFQUFPc0csVUFBVStMLGdCQUNuQnhSLEVBQVMwTSxLQUFLN00sRUFBb0JWLElBRWhDQSxFQUFPc0csVUFBVUUsTUFDbkIzRixFQUFTME0sS0FBS2tOLEdBQXVCemEsVUFFakN5UixHQUFrQnpSLEVBQVEwUixTQUMxQnBQLEVBQVkrQyxjQUNickYsRUFBTzRDLFFBQVc1QyxFQUFPZ0wsaUNBR3hCOFAsR0FBdUI5YSxTQUN2QmlVLEdBQW9CalUsRUFBUTBSLEVBQVkrVyxFQUFLTyxVQUVuRG5vQixFQUFTME0sS0FBSzRNLEdBQXFCbmEsSUFDL0JBLEVBQU9rb0IsZ0NBQWtDbG9CLEVBQU9nTCx5QkFDbERuSyxFQUFTME0sS0FBS3lSLEdBQXVCaGYsS0FFbkNBLEVBQU9vVyx3QkFBMEJwVyxFQUFPcVcsbUNBQzFDeFYsRUFBUzBNLEtBQUtvUixHQUFpQjNlLEtBRy9CQSxFQUFPa1csd0JBQ1BsVyxFQUFPbVcsa0NBQ1BuVyxFQUFPb1csd0JBQ1BwVyxFQUFPcVcsb0NBRUgzRSxFQUFXeEwsT0FDYnJGLEVBQVMwTSxLQUFLQyxFQUFtQnhOLElBRTlCMFIsRUFBVzhDLHNCQUNkM1QsRUFBUzBNLEtBQUtxQyxHQUFpQjVQLEtBRy9CQSxFQUFPc0csVUFBVWlTLFNBQ25CMVgsRUFBUzBNLEtBQUs2TixHQUEwQnBiLFdBR3RDNkIsUUFBUUMsSUFBSWpCLFNBQ1p5QixFQUFZK0MsYUFFbEIsTUFBTVksRUFBaUJ5TCxFQUFXeEwsTUFBUSxNQUFRLE9BSWxELEdBSEE0QixFQUFVN0IsRUFBZ0IsQ0FBQyxXQUFZaWpCLEdBR25DeFgsRUFBV3hMLE1BQU8sQ0FDcEI0QixFQUFVN0IsRUFBZ0IsQ0FBQyxVQUFXaWpCLEdBRXRDLE1BQU1VLEVBQWVycEIsRUFBS0MsS0FBSzBvQixFQUFhLGFBQ3hDN29CLEVBQUdPLFdBQVdncEIsS0FDWHZwQixFQUFHUSxTQUFTb0wsR0FBRzJkLEdBQ3BCOWhCLEVBQ0U3QixFQUNBLENBQUMsVUFBVyx1QkFBd0Isb0JBQXFCLG1CQUN6RGlqQixHQUdOLE1BQ0VwaEIsRUFBVTdCLEVBQWdCLENBQUMsV0FBWWlqQixFQUUzQyxDQUNGLENBRU14UyJ9
|
1
|
+
import e from"node:fs";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/promises";import a from"fast-glob";import{PromisePool as c}from"minimal-promise-pool";import{Octokit as l}from"@octokit/core";import p from"node:child_process";import d from"deepmerge";import u from"js-yaml";import m from"lodash.clonedeep";import f from"node:os";import g from"dotenv";import h from"libsodium-wrappers";import{distance as y}from"fastest-levenshtein";import{simpleGit as w}from"simple-git";import{z as b}from"zod";const v=new class{constructor(){this.isVerbose=!1,this.doesUploadEnvVars=!1}};const k=new class{async functionIgnoringException(e,t){v.isVerbose&&console.info(`--------- ${e} start ---------`);try{await t()}catch(t){console.info(`Error occurred in ${e}: ${t instanceof Error?t.stack:String(t)}}`)}v.isVerbose&&console.info(`---------- ${e} end ----------`)}};async function j(e){return k.functionIgnoringException("fixDockerfile",async()=>{if(!e.doesContainsDockerfile)return;const n=e.dockerfile,s=n;n!==s&&await r.writeFile(t.join(e.dirPath,"Dockerfile"),s)})}async function x(n){return k.functionIgnoringException("fixPlaywrightConfig",async()=>{const s=t.join(n.dirPath,"playwright.config.ts");if(!e.existsSync(s))return;const i=await e.promises.readFile(s,"utf8"),o=i.replace(/retries:.+,/,"retries: process.env.PWDEBUG ? 0 : process.env.CI ? 5 : 1,");i!==o&&await e.promises.writeFile(s,o)})}const _=["**/node_modules/**","**/.venv/**","**/test-fixtures/**","**/test/fixtures/**","**/dist/**","**/build/**","**/target/**","**/temp/**","**/tmp/**"];async function P(e){return k.functionIgnoringException("fixPrismaEnvFiles",async()=>{const n=await a.glob(["*.env","*.env.*"],{dot:!0,cwd:e.dirPath,ignore:_});for(const s of n){const n=t.resolve(e.dirPath,s),i=(await r.readFile(n,"utf8")).replace(/DATABASE_URL="?(.+\.sqlite3)"?[\n$]/,'DATABASE_URL="$1?connection_limit=1"\n');await r.writeFile(n,i)}})}async function S(n){return k.functionIgnoringException("fixTestDirectoriesUpdatingPackageJson",async()=>{await Promise.all(n.map(async n=>{const s=t.join(n,"test");for(const i of["__tests__","tests"]){const o=t.join(n,i);try{await e.promises.rename(o,s);const r=await e.promises.readFile(t.join(n,"package.json"),"utf8"),a=r.replaceAll(i,"test");if(r===a)return;await e.promises.writeFile(t.join(n,"package.json"),a)}catch{}}}))})}const $=new c;async function C(e,s){return k.functionIgnoringException("fixTypeDefinitions",async()=>{const i=t.resolve(e.dirPath,"@types"),o=e.isRoot&&e.doesContainsSubPackageJsons?void 0:t.resolve(e.dirPath,"src","types"),a=await n(()=>r.readdir(i,{withFileTypes:!0}));if(a)for(const e of a){const a=e.name.slice(0,-5),c=e.name.endsWith(".d.ts");let l=c?a:e.name;l.includes("__")&&(l=`@${l.replace("__","/")}`);const p=s.some(e=>e.packageJson?.dependencies?.[l]||e.packageJson?.devDependencies?.[l]);e.isFile()&&c?p?(await r.mkdir(t.join(i,a)),await $.run(()=>r.rename(t.join(i,e.name),t.join(i,a,"index.d.ts")))):o&&(await r.mkdir(o,{recursive:!0}),await $.run(()=>r.rename(t.join(i,e.name),t.join(o,e.name)))):e.isDirectory()&&o&&!p&&(await r.mkdir(o,{recursive:!0}),await $.run(()=>n(()=>r.rename(t.join(i,e.name,"index.d.ts"),t.join(o,`${e.name}.d.ts`)))))}})}const F={async readFileIgnoringError(t){try{return await e.promises.readFile(t,"utf8")}catch{}},async generateFile(n,s){await e.promises.mkdir(t.dirname(n),{recursive:!0}),await e.promises.writeFile(n,s)}};async function E(n){return k.functionIgnoringException("fixTypos",async()=>{const s=n.dirPath,i=await a.glob("**/*.md",{dot:!0,cwd:s,ignore:_});v.isVerbose&&console.info(`Found ${i.length} markdown files in ${s}`);for(const o of i){const i=t.join(s,o);await $.run(async()=>{const t=await e.promises.readFile(i,"utf8");let s=B(t);s=I(s,n,"doc"),t!==s&&await F.generateFile(i,s)})}const o=await a.glob(["{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx,cts,mts,ts,tsx}","packages/**/{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx,cts,mts,ts,tsx}"],{dot:!0,cwd:s,ignore:_});v.isVerbose&&console.info(`Found ${o.length} TypeScript files in ${s}`);for(const i of o){const o=t.join(s,i),r=await e.promises.readFile(o,"utf8");let a=O(r);a=I(a,n,"ts"),r!==a&&await F.generateFile(o,a)}const r=await a.glob("**/*.{csv,htm,html,tsv,xml,yaml,yml}",{dot:!0,cwd:s,ignore:_});v.isVerbose&&console.info(`Found ${r.length} text-based files in ${s}`);for(const i of r){const o=t.join(s,i),r=await e.promises.readFile(o,"utf8");let a=B(r);a=I(a,n,"text"),r!==a&&await F.generateFile(o,a)}await $.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){return e.replaceAll(/\/\/(.*)c\.f\./g,"//$1cf.").replaceAll(/\/\/(.*)eg\./g,"//$1e.g.").replaceAll(/\/\/(.*)ie\./g,"//$1i.e.")}function I(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}async function D(e,n){return k.functionIgnoringException("generateAgentInstructions",async()=>{if(!e.isRoot)return;const s=t.resolve(e.dirPath,"AGENTS_EXTRA.md"),i=await F.readFileIgnoringError(s);for(const[s,o]of[["AGENTS.md","Codex CLI"],["CLAUDE.md","Claude Code"],["GEMINI.md","Gemini CLI"]]){const r=T(e,n,o,i),a=t.resolve(e.dirPath,s);await $.run(()=>F.generateFile(a,r))}})}function T(e,t,n,s){const i=e.isBun?"bun":"yarn",o=`\n## Project Information\n\n- Name: ${e.packageJson?.name}\n- Description: ${e.packageJson?.description}\n- Package Manager: ${i}\n\n## General Instructions\n\n${t.some(e=>e.depending.genI18nTs)?'- If you introduce new string literals in React components, update language resource files in `i18n` directory like `i18n/ja-JP.json`. Reference these strings using the `i18n` utility, for example: `i18n.pages.home.title()` for `{ "pages": { "home": { "title": "My App" } } }`.':""}\n- After making code changes, run \`${i} check-for-ai\` to perform type checking and linting.\n- Once you have checked your changes, commit them to the current branch using the \`--no-verify\` option. Make sure to add a new line at the end of your commit message with: \`Co-authored-by: WillBooster (${n}) <agent@willbooster.com>\`.\n- When your work is fully complete, run \`${i} check-all-for-ai\` to execute all tests (note: this may take up to 30 minutes).\n\n## Coding Style\n\n- When adding new functions or classes, define them below any functions or classes that call them to maintain clear call order.\n${t.some(e=>e.depending.next)?"- Since this project uses the React Compiler, you do not need to use `useCallback` or `useMemo` for performance optimization.":""}\n`.replaceAll(/\n{3,}/g,"\n\n").trim();return s?o+"\n\n"+s.trim():o}const A=process.env.GH_BOT_PAT||process.env.PUBLIC_GH_BOT_PAT||process.env.GH_TOKEN||process.env.GITHUB_TOKEN,R=!!A,W=new l({auth:A});const L=new class{getOrgAndName(e){const t=e.split(":").at(-1),n=t?.split("/");return[n?.at(-2)??"",n?.at(-1)?.replace(/.git$/,"")??""]}};function J(e,t,n,s=0){do{const[s,i,o]=z(e,t,n);if(0===p.spawnSync(s,i,o).status)break}while(--s>=0)}function N(e,t,n){const[s,i,o]=z(e,t,n);o.stdio="pipe";const r=p.spawnSync(s,i,o),a=r.stderr.toString().trim();return a&&console.error(`${s} [${i.map(e=>`"${e}"`).join(", ")}] caused the following error:\n ${a}`),r.stdout.toString().trim()}function z(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",`${e} ${t.join(" ")}`],e="bash"),[e,t,{cwd:n,env:s,shell:!1,stdio:"inherit"}]}function G(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 M="3.9.19",U="zulu-11.74.15",H="2.0.4",q="14.2.5";async function Y(n){return k.functionIgnoringException("generateToolVersions",async()=>{await async function(n){if(!n.versionsText)return;const s=n.versionsText.trim().split("\n").map(e=>{const[t,n]=e.trim().split(/\s+/);return`${K.has(t)?" ":""}${t} ${n}`}).sort().map(e=>e.trim()).filter(e=>!e.startsWith("lefthook")),i=[...new Set(s)];if(n.doesContainsPoetryLock){const e=await fetch("https://pypi.org/pypi/poetry/json"),t=await e.json(),n=t?.info?.version;n&&X(i,"poetry",n),X(i,"python",M,!0)}n.depending.firebase&&X(i,"java",U,!0);if(n.doesContainsPackageJson)if(n.isBun){const e=await async function(e,t){try{const n=(await W.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)}}("oven-sh","bun");e&&X(i,"bun",e)}else{const e=N("npm",["show","yarn","version"],n.dirPath);X(i,"yarn",e)}for(const s of V){const i=t.resolve(n.dirPath,`.${s}-version`);e.promises.rm(i,{force:!0})}const o=t.resolve(n.dirPath,".tool-versions");await(i.length>0?$.run(()=>e.promises.writeFile(o,i.join("\n")+"\n")):$.run(()=>e.promises.rm(o,{force:!0}))),await $.promiseAll(),J("asdf",["plugin","update","--all"],n.dirPath),J("asdf",["install"],n.dirPath)}(n)})}const K=new Set(["java","nodejs","bun","python"]),V=["java","node","python"];function X(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+/);G(n)>G(t)&&(e[i]=o)}}function Q(e,t){return t}function Z(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]=d(e[i],o,n):e.includes(o)||s.push(o);return s}async function ee(n){return k.functionIgnoringException("generateBiomeJsonc",async()=>{let s={root:n.isRoot,$schema:"./node_modules/@biomejs/biome/configuration_schema.json",extends:["@willbooster/biome-config"]};const i=t.resolve(n.dirPath,"biome.jsonc");try{const t=await e.promises.readFile(i,"utf8"),n=JSON.parse(t);s=d.all([s,n,s],{arrayMerge:Q})}catch{}const o=JSON.stringify(s);await $.run(()=>F.generateFile(i,o))})}async function te(n){return k.functionIgnoringException("generateBunfigToml",async()=>{const s=t.resolve(n.dirPath,"bunfig.toml"),i=e.existsSync(s)&&e.readFileSync(s,"utf8").includes("exact = false")?"telemetry = false\n\n[install]\nexact = false\n\n[run]\nbun = true\n":"telemetry = false\n\n[install]\nexact = true\n\n[run]\nbun = true\n";await $.run(()=>F.generateFile(s,i))})}const ne="# Project-specific settings",se=/# Project-specific settings[^\n]*\n/gm,ie="# Generated by wbfy",oe=`${ne} (head)\n\n\n${ie}\n`,re=`\n${ne} (tail)\n`,ae={separator:ie,separatorPrefix:"# Generated by ",defaultHeadUserContent:oe,defaultTailUserContent:re,async readGitignoreWithoutSeparators(t){try{let n=await e.promises.readFile(t,"utf8");const s=ce(n);return s>0&&(n=n.slice(0,s-1)),n.replaceAll(se,"").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(se,`${ne} (head)\n`):oe},getTailUserContent(e){const t=ce(e);return t>0?e.slice(t-1):re},async isBerryZeroInstallEnabled(t){try{return(await e.promises.readFile(t,"utf8")).includes("\n!.yarn/cache")}catch{return!1}}};function ce(e){const t=e.indexOf(ne),n=e.lastIndexOf(ne);return n>t?n:-1}async function le(n){return k.functionIgnoringException("generateDockerignore",async()=>{const s=t.resolve(n.dirPath,".dockerignore");if(n.doesContainsDockerfile){const e=await F.readFileIgnoringError(s)??"",t=ae.getHeadUserContent(e)+"\n**/.idea\n**/*.sqlite3*\n**/.yarn/install-state.gz\n**/.venv\n"+ae.getTailUserContent(e);await $.run(()=>F.generateFile(s,t))}else await e.promises.rm(s,{force:!0})})}const pe={codeWith2IndentSize:["cjs","mjs","js","jsx","cts","mts","ts","tsx","json","json5","jsonc","cpp","dart","htm","html","pu","puml","rb","vue","xml","yaml","yml","sh"].sort(),codeWith4IndentSize:["go","gradle","java","py"].sort(),markdownLike:["md"].sort(),eslint:["cjs","mjs","js","cts","mts","ts","tsx","jsx"].sort(),prettier:["cjs","mjs","java","js","jsx","cts","mts","ts","tsx","json","json5","jsonc","css","htm","html","md","scss","vue","yaml","yml"].sort()},de=`root = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\ninsert_final_newline = true\ntrim_trailing_whitespace = true\n\n${me(pe.codeWith2IndentSize)}\nindent_size = 2\nindent_style = space\n\n${me(pe.codeWith4IndentSize)}\nindent_size = 4\nindent_style = space\n\n${me(pe.markdownLike)}\nmax_line_length = off\ntrim_trailing_whitespace = false\n\n[{Makefile,*.mk}]\nindent_style = tab\n`;async function ue(e){return k.functionIgnoringException("generateEditorconfig",async()=>{const n=t.resolve(e.dirPath,".editorconfig");await $.run(()=>F.generateFile(n,de))})}function me(e){return e.length>1?`[*.{${e.join(",")}}]`:`[*.${e[0]}]`}async function fe(n){return k.functionIgnoringException("generateEslintrc",async()=>{await $.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintrc.json"),{force:!0})),await $.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintignore"),{force:!0})),await $.run(()=>e.promises.rm(t.resolve(n.dirPath,"eslint.config.js"),{force:!0}));const s=t.resolve(n.dirPath,"eslint.config.mjs");if(n.isBun)await $.run(()=>e.promises.rm(s,{force:!0}));else if(n.eslintBase){try{if(!(await e.promises.readFile(s,"utf8")).includes("export { default }"))return}catch{}await $.run(()=>F.generateFile(s,`export { default } from '${n.eslintBase}';`))}})}const ge={have_fun:!0,code_review:{disable:!1,comment_severity_threshold:"MEDIUM",max_review_comments:-1,pull_request_opened:{help:!1,summary:!0,code_review:!0}},ignore_patterns:["**/__generated__"]};async function he(n){return k.functionIgnoringException("generateGeminiConfig",async()=>{if(!n.isRoot)return;const s=t.resolve(n.dirPath,".gemini"),i=t.resolve(s,"config.yml"),o=t.resolve(s,"styleguide.md");let r=m(ge);try{const t=await e.promises.readFile(i,"utf8"),n=u.load(t);r=d.all([r,n,r],{arrayMerge:Q})}catch{}const a=u.dump(r,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}});await Promise.all([$.run(()=>F.generateFile(i,a)),$.run(()=>F.generateFile(o,"日本語でレビューしてください。"))])})}async function ye(n){return k.functionIgnoringException("generateGeminiSettings",async()=>{if(!n.isRoot)return;const s=t.resolve(n.dirPath,".gemini"),i=t.resolve(s,"settings.json");await e.promises.rm(i,{force:!0})})}const we=`* text=auto\n\n*.lockb binary diff=lockb\n*.vcproj text eol=crlf\n\n${[...pe.codeWith2IndentSize,...pe.codeWith4IndentSize,...pe.markdownLike].map(e=>`*.${e} text eol=lf`).join("\n")}\n\ndist/** linguist-generated=true\n`;async function be(e){return k.functionIgnoringException("generateGitattributes",async()=>{const n=t.resolve(e.dirPath,".gitattributes");await $.run(()=>F.generateFile(n,we))})}const ve=["windows","macos","linux","jetbrains","visualstudiocode","emacs","vim","yarn"];async function ke(e,n){return k.functionIgnoringException("generateGitignore",async()=>{const s=t.resolve(e.dirPath,".gitignore"),i=await F.readFileIgnoringError(s)??"";let o=ae.getHeadUserContent(i)+"\n!.keep\n.aider*\n.env.production\n.idea/AugmentWebviewStateStore.xml\n.idea/copilot/chatSessions/\n.devcontainer/\n*/mount/*.hash\n__generated__/\ndist/\ntemp/\n";const r=ae.getTailUserContent(i),a=[...ve];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"),e.depending.prisma&&(o+="*.sqlite3*\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 _e(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 $.run(()=>xe(e,t)),v.isVerbose&&console.info(`Fetched ${n}`)}c&&(c+="\n"),c+=t+"\n"}await ae.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 $.run(()=>F.generateFile(s,l))})}const je=t.join(f.homedir(),".cache","wbfy","gitignore");async function xe(n,s){await e.promises.mkdir(je,{recursive:!0}),await e.promises.writeFile(t.join(je,n),s)}async function _e(n){try{const s=await e.promises.stat(t.join(je,n));if(Date.now()-s.mtimeMs>216e5)return;return await e.promises.readFile(t.join(je,n),"utf8")}catch{}}async function Pe(e,t){try{const{data:n}=await W.request("GET /repos/{owner}/{repo}/commits",{owner:e,repo:t,per_page:1});if(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}: ${String(n)}`)}}const Se={getLintFixSuffix:e=>e.doesContainsJsxOrTsx?' --rule "{ react-hooks/exhaustive-deps: 0 }"':""},$e=["eslint","eslint-config-flat-gitignore","eslint-config-prettier","eslint-plugin-sort-class-members","eslint-plugin-sort-destructure-keys","eslint-plugin-unicorn","eslint-plugin-unused-imports","globals"],Ce=[...$e,"typescript-eslint","eslint-import-resolver-typescript"],Fe=["eslint-plugin-react","eslint-plugin-react-hooks","eslint-plugin-react-compiler"],Ee={"@willbooster/eslint-config-js":["@willbooster/eslint-config-js","eslint-plugin-import-x",...$e],"@willbooster/eslint-config-js-react":["@willbooster/eslint-config-js-react","eslint-plugin-import-x",...$e,...Fe],"@willbooster/eslint-config-ts":["@willbooster/eslint-config-ts","eslint-plugin-import-x",...Ce],"@willbooster/eslint-config-ts-react":["@willbooster/eslint-config-ts-react","eslint-plugin-import-x",...Ce,...Fe],"@willbooster/eslint-config-next":["@willbooster/eslint-config-next","eslint-plugin-import","eslint-config-next",...Ce,...Fe]};async function Be(n,s,i){return k.functionIgnoringException("generatePackageJson",async()=>{await async function(n,s,i){const o=t.resolve(n.dirPath,"package.json"),r=await e.promises.readFile(o,"utf8"),c=JSON.parse(r);c.scripts=c.scripts||{},c.dependencies=c.dependencies||{},c.devDependencies=c.devDependencies||{},c.peerDependencies=c.peerDependencies||{};const l=n.isBun?"bun":"yarn";await async function(t,n){"WillBooster LLC"===n.author&&(n.author="WillBooster Inc.");if(delete n.scripts["sort-package-json"],delete n.scripts["sort-all-package-json"],delete n.scripts["typecheck/warn"],delete n.scripts["typecheck:gen-code"],delete n.scripts["typecheck:codegen"],delete n.dependencies.tslib,delete n.devDependencies["@willbooster/eslint-config"],delete n.devDependencies["@willbooster/eslint-config-react"],delete n.devDependencies["@willbooster/renovate-config"],delete n.devDependencies["@willbooster/tsconfig"],delete n.devDependencies["eslint-import-resolver-node"],delete n.devDependencies["eslint-plugin-prettier"],delete n.devDependencies.lerna,delete n.devDependencies.pinst,delete n.scripts["flutter-format"],delete n.scripts["format-flutter"],delete n.scripts["python-format"],delete n.scripts["format-python"],delete n.scripts.prettier,delete n.scripts["check-all"],!t.isWillBoosterConfigs)for(const e of Object.values(Ee))for(const t of e)delete n.devDependencies[t];await $.run(()=>e.promises.rm("lerna.json",{force:!0})),delete n.devDependencies["@typescript-eslint/eslint-plugin"],delete n.devDependencies["@typescript-eslint/parser"],delete n.devDependencies["eslint-plugin-import"]}(s,c);for(const[e,t]of Object.entries(c.scripts))t.includes("git clone")||(c.scripts[e]=t.replace(/yarn\s*&&\s*/,"").replace(/yarn\s*install\s*&&\s*/,""));c.scripts=d(c.scripts,Oe(n)),"check-for-ai"in c.scripts&&("gen-code"in c.scripts&&(c.scripts["check-for-ai"]=`${l} gen-code > /dev/null && ${c.scripts["check-for-ai"]}`),c.scripts["check-for-ai"]=`${l} install > /dev/null && ${c.scripts["check-for-ai"]}`);n.isBun?delete c.scripts.prettify:c.scripts.prettify+=await async function(n){const s=t.resolve(n,".prettierignore"),i=await e.promises.readFile(s,"utf8"),o=i.indexOf(ae.separatorPrefix);if(-1===o)return"";const r=i.slice(0,o);return`${r.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("")} || true`}(n.dirPath);for(const[e,t]of Object.entries(c.scripts))t?.includes("yarn workspaces foreach")&&(t.includes("--all")||t.includes("--recursive")||t.includes("--since")||t.includes("--worktree")||(c.scripts[e]=t.replace("yarn workspaces foreach","yarn workspaces foreach --all")));let p=[],u=["prettier","sort-package-json"];const m=[];e.existsSync(t.join(s.dirPath,".prettierrc.json"))||e.existsSync(t.join(n.dirPath,".prettierrc.json"))||(c.prettier="@willbooster/prettier-config",u.push("prettier-plugin-java","@willbooster/prettier-config"));n.isBun?delete c.devDependencies["lint-staged"]:u.push("lint-staged");if(n.isRoot){if(n.isBun?(delete c.devDependencies.husky,delete c.devDependencies.pinst,c.scripts.prepare="lefthook install || true",u.push("lefthook")):(u.push("husky"),c.scripts.prepare="husky || true",c.scripts.postinstall="husky || true",(n.isPublicRepo||n.isReferredByOtherRepo)&&(u.push("pinst"),c.scripts.prepack="pinst --disable",c.scripts.postpack="pinst --enable")),n.depending.semanticRelease&&(c.devDependencies["semantic-release"]||c.devDependencies["multi-semantic-release"]||c.devDependencies["@qiwi/multi-semantic-release"]||u.push("semantic-release"),c.version="0.0.0-semantically-released"),n.depending.playwrightTest){c.dependencies.artillery||c.devDependencies.artillery||c.dependencies["@playwright/test"]||(u.push("@playwright/test"),delete c.dependencies["@playwright/test"]),delete c.dependencies.playwright,delete c.devDependencies.playwright}n.doesContainsSubPackageJsons?c.workspaces=Array.isArray(c.workspaces)?d.all([c.workspaces,["packages/*"]],{arrayMerge:Z}):["packages/*"]:Array.isArray(c.workspaces)&&(c.workspaces=c.workspaces.filter(e=>a.globSync(e,{dot:!0,cwd:n.dirPath,ignore:_}).length>0),0===c.workspaces.length&&delete c.workspaces)}if(n.depending.wb||n.isBun){c.dependencies["@willbooster/wb"]?p.push("@willbooster/wb"):u.push("@willbooster/wb");for(const[e,t]of Object.entries(c.scripts))c.scripts[e]=t.replace(/wb\s+db/,"wb prisma")}(n.doesContainsJavaScript||n.doesContainsJavaScriptInPackages||n.doesContainsTypeScript||n.doesContainsTypeScriptInPackages)&&(n.isBun?(u.push("@biomejs/biome","@willbooster/biome-config"),delete c.devDependencies.eslint,delete c.devDependencies.micromatch,delete c.devDependencies["typescript-eslint"]):u.push("eslint","micromatch"));(n.doesContainsTypeScript||n.doesContainsTypeScriptInPackages)&&(u.push("typescript"),n.isBun&&u.push("@types/bun"));n.eslintBase&&u.push(...Ee[n.eslintBase]);n.isWillBoosterConfigs&&(p=p.filter(e=>!e.includes("@willbooster/")),u=u.filter(e=>!e.includes("@willbooster/")));c.name||(c.name=t.basename(n.dirPath));n.doesContainsSubPackageJsons&&(c.private=!0);c.license||(c.license="UNLICENSED");!c.private&&"UNLICENSED"!==c.license&&s.isPublicRepo&&(c.publishConfig??={},c.publishConfig.access??="public");const[f]=L.getOrgAndName(n.repository??"");"WillBooster"!==f&&"WillBoosterLab"!==f||(c.author="WillBooster Inc.");n.isRoot||!c.private||c.main||(c.main="./src");if(delete c.resolutions?.["npm/chalk"],!n.doesContainsSubPackageJsons){if(n.isBun||(n.doesContainsJavaScript||n.doesContainsTypeScript?c.scripts["lint-fix"]+=Se.getLintFixSuffix(n):(delete c.scripts.lint,delete c.scripts["lint-fix"],c.scripts.cleanup=c.scripts.cleanup?.replace(" && yarn lint-fix",""))),n.doesContainsPubspecYaml){c.scripts.lint="flutter analyze",c.scripts["lint-fix"]="yarn lint";const s=["lib","test","test_driver"].filter(s=>e.existsSync(t.resolve(n.dirPath,s)));s.length>0&&(c.scripts["format-code"]=`flutter format $(find ${s.join(" ")} -name generated -prune -o -name '*.freezed.dart' -prune -o -name '*.g.dart' -prune -o -name '*.dart' -print)`,c.scripts.format+=" && yarn format-code")}if(n.doesContainsPoetryLock){"poetry install"===c.scripts.postinstall&&delete c.scripts.postinstall;const e=await a.glob("**/*.py",{cwd:n.dirPath,dot:!0,ignore:_}),t=new Set;for(const n of e){const[e,s]=n.split(/[/\\]/);s&&t.add(e)}if(t.size>0){const e=[...t].join(" ");c.scripts["format-code"]=`poetry run isort --profile black ${e} && poetry run black ${e}`,c.scripts.lint?c.scripts.lint=`poetry run flake8 ${e} && ${c.scripts.lint}`:(c.scripts.lint=`poetry run flake8 ${e}`,c.scripts["lint-fix"]="yarn lint"),c.scripts.format+=" && yarn format-code",m.push("black","isort","flake8")}}n.repository&&(c.repository=n.repository)}n.depending.blitz?(p.push(`blitz@${H}`,`@blitzjs/auth@${H}`,`@blitzjs/next@${H}`,`@blitzjs/rpc@${H}`,`next@${q}`),u=u.filter(e=>"eslint-plugin-react"!==e&&"eslint-plugin-react-hooks"!==e),c.scripts["gen-code"]?.startsWith("blitz codegen")?c.scripts["gen-code"].includes("blitz prisma generate")||(c.scripts["gen-code"]=c.scripts["gen-code"].replace("blitz codegen","blitz codegen && blitz prisma generate")):c.scripts["gen-code"]="blitz codegen"):n.depending.prisma&&!c.scripts["gen-code"]?.startsWith("prisma generate")&&(c.scripts["gen-code"]="prisma generate");c.dependencies?.prettier||delete c.devDependencies["@types/prettier"];0===Object.keys(c.dependencies).length&&delete c.dependencies;0===Object.keys(c.devDependencies).length&&delete c.devDependencies;0===Object.keys(c.peerDependencies).length&&delete c.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(t.has("@willbooster/auth")&&!Ie(e,"@willbooster/auth")){delete e.devDependencies["@willbooster/auth"];const t=await Pe("WillBoosterLab","auth");e.dependencies["@willbooster/auth"]=`git@github.com:WillBoosterLab/auth.git#${t}`}if(t.has("@discord-bot/shared")&&!Ie(e,"@discord-bot/shared")){delete e.devDependencies["@discord-bot/shared"];const t=await Pe("WillBoosterLab","discord-bot");e.dependencies["@discord-bot/shared"]=`git@github.com:WillBoosterLab/discord-bot.git#${t}`}if(t.has("@willbooster/code-analyzer")&&!Ie(e,"@willbooster/code-analyzer")){delete e.dependencies["@willbooster/code-analyzer"];const t=await Pe("WillBoosterLab","code-analyzer");e.devDependencies["@willbooster/code-analyzer"]=`git@github.com:WillBoosterLab/code-analyzer.git#workspace=@code-analyzer/client&commit=${t}`}if(t.has("@willbooster/judge")&&!Ie(e,"@willbooster/judge")){delete e.devDependencies["@willbooster/judge"];const t=await Pe("WillBoosterLab","judge");e.dependencies["@willbooster/judge"]=`git@github.com:WillBoosterLab/judge.git#${t}`}if(t.has("@willbooster/llm-proxy")&&!Ie(e,"@willbooster/llm-proxy")){delete e.devDependencies["@willbooster/llm-proxy"];const t=await Pe("WillBoosterLab","llm-proxy");e.dependencies["@willbooster/llm-proxy"]=`git@github.com:WillBoosterLab/llm-proxy.git#${t}`}}(c),n.isBun&&delete c.packageManager;let g=JSON.stringify(c);g=await async function(n,s,i){const o=[];for(const[e]of Object.keys(n))":"!==e[0]&&e.includes(":")&&o.push([e,e.replaceAll(":","-")]);if(0===o.length)return s;for(const[e,t]of o)s=s.replaceAll(e,t);const r=await a.glob(["**/*.{md,cjs,mjs,js,jsx,cts,mts,ts,tsx}","**/Dockerfile"],{cwd:i.dirPath,dot:!0,ignore:_});for(const n of r)await $.run(async()=>{const s=t.join(i.dirPath,n),r=await e.promises.readFile(s,"utf8");let a=r;for(const[e,t]of o)a=a.replaceAll(e,t);a!==r&&await e.promises.writeFile(s,a)});return await $.promiseAll(),s}(c.scripts,g,n),await e.promises.writeFile(o,g),i||(p=p.filter(e=>!c.devDependencies?.[e]),p.length>0&&(n.isBun?(J(l,["remove",...new Set(p)],n.dirPath),J(l,["add","--exact",...new Set(p)],n.dirPath)):J(l,["add",...new Set(p)],n.dirPath)),u=u.filter(e=>!c.dependencies?.[e]),u.length>0&&(n.isBun?(J(l,["remove",...new Set(u)],n.dirPath),J(l,["add","-D","--exact",...new Set(u)],n.dirPath)):J(l,["add","-D",...new Set(u)],n.dirPath)),m.length>0&&J("poetry",["add","--group","dev",...new Set(m)],n.dirPath))}(n,s,i)})}function Oe(e){if(e.isBun){const t={"check-all-for-ai":"bun run check-for-ai && bun run test --silent","check-for-ai":"bun run cleanup && bun run typecheck",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 wb test",typecheck:"bun --bun wb typecheck"};return e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages||delete t.typecheck,t}{let t={"check-all-for-ai":"yarn check-for-ai && yarn test --silent","check-for-ai":"yarn format > /dev/null 2> /dev/null || true && yarn lint-fix --quiet && yarn typecheck",cleanup:"yarn format && yarn lint-fix",format:"sort-package-json && yarn prettify",lint:"eslint --color","lint-fix":"yarn lint --fix",prettify:`prettier --cache --color --write "**/{.*/,}*.{${pe.prettier.join(",")}}" "!**/test{-,/}fixtures/**"`,typecheck:"tsc --noEmit --Pretty"};if(e.doesContainsSubPackageJsons){const e=t.test;t=d({...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 "**/{.*/,}*.{${pe.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}}function Ie(e,t){return(e.devDependencies?.[t]||e.dependencies?.[t]||"").includes("workspace")}const De={preCommit:"node node_modules/.bin/lint-staged",prePush:"yarn typecheck",prePushForLab:'\nif [ $(git branch --show-current) = "main" ]; then\n echo "************************************************"\n echo "*** Don\'t push main branch directly. Use PR! ***"\n echo "************************************************"\n exit 1\nfi\n\nyarn typecheck\n'.trim(),prePushForLabExceptAdmin:'\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 Te(n){return k.functionIgnoringException("generateHuskyrcUpdatingPackageJson",async()=>{await async function(n){const s=t.resolve(n.dirPath,"package.json"),i=await e.promises.readFile(s,"utf8"),o=JSON.parse(i);o.scripts||={},delete o.scripts.postinstall,delete o.scripts.postpublish,delete o.scripts.prepare,delete o.scripts.prepublishOnly,delete o.scripts.prepack,delete o.scripts.postpack;const r=t.resolve(n.dirPath,".husky");if(await Promise.all([e.promises.writeFile(s,JSON.stringify(o,void 0,2)),e.promises.rm(r,{force:!0,recursive:!0})]),n.isBun)return void J("git",["config","--unset","core.hooksPath"],n.dirPath);J("yarn",["dlx","husky-init","--yarn2"],n.dirPath);const a=t.resolve(r,"pre-commit");await $.run(()=>e.promises.rm(t.resolve(n.dirPath,".huskyrc.json"),{force:!0})),await $.run(()=>e.promises.writeFile(a,De.preCommit+"\n"));const{typecheck:c}=Oe(n);if(c){let s=n.repository?.startsWith("github:WillBoosterLab/")?n.repository?.toLocaleLowerCase().includes("exercode")?De.prePushForLab:De.prePushForLabExceptAdmin:De.prePush;s=s.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 $.run(()=>e.promises.writeFile(t.resolve(r,"pre-push"),s+"\n",{mode:493}))}const l=`${De.postMerge}\n\n${Ae(n).join("\n")}\n`;await $.run(()=>e.promises.writeFile(t.resolve(r,"post-merge"),l,{mode:493}))}(n)})}function Ae(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(String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/blitz prisma migrate deploy"`,String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/blitz prisma generate"`,String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/blitz codegen"`):e.depending.prisma&&t.push(String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/dotenv -c development -- node node_modules/.bin/prisma migrate deploy"`,String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/dotenv -c development -- node node_modules/.bin/prisma generate"`),t}function Re(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 We=`<?xml version="1.0" encoding="UTF-8"?>\n<project version="4">\n <component name="ProjectTasksOptions">\n${pe.prettier.map(e=>Re("node","node_modules/.bin/prettier --cache --write","Prettier",e)).join("")}\n </component>\n</project>\n`,Le=`<?xml version="1.0" encoding="UTF-8"?>\n<project version="4">\n <component name="ProjectTasksOptions">\n${pe.prettier.map(e=>Re("bun","--bun node_modules/.bin/biome check --fix --no-errors-on-unmatched --skip-parse-errors","Biome",e)).join("")}\n </component>\n</project>\n`;async function Je(n){return k.functionIgnoringException("generateIdeaSettings",async()=>{const s=t.resolve(n.dirPath,".idea");if(e.existsSync(s)){const i=t.resolve(s,"watcherTasks.xml");await(n.doesContainsJavaScript||n.doesContainsJavaScriptInPackages||n.doesContainsTypeScript||n.doesContainsTypeScriptInPackages||n.doesContainsPackageJson&&!n.doesContainsPubspecYaml&&!n.doesContainsGemfile&&!n.doesContainsGoMod&&!n.doesContainsPomXml?$.run(()=>F.generateFile(i,n.isBun?Le:We)):$.run(()=>e.promises.rm(i,{force:!0})))}})}const Ne={"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"}}}},ze={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 Ge(n){return k.functionIgnoringException("generateLefthookUpdatingPackageJson",async()=>{await async function(n){const s=t.resolve(n.dirPath,".lefthook");await Promise.all([e.promises.writeFile(t.join(n.dirPath,"lefthook.yml"),u.dump(Ne,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}})),e.promises.rm(s,{force:!0,recursive:!0})]);const{typecheck:i}=Oe(n);if(i){const i=n.repository?.startsWith("github:WillBoosterLab/")?ze.prePushForLab:ze.prePush;e.mkdirSync(t.join(s,"pre-push"),{recursive:!0}),await $.run(()=>e.promises.writeFile(t.join(s,"pre-push","check.sh"),i+"\n",{mode:493}))}const o=`${ze.postMerge}\n\n${Ae(n).join("\n")}\n`;e.mkdirSync(t.join(s,"post-merge"),{recursive:!0}),await $.run(()=>e.promises.writeFile(t.resolve(s,"post-merge","prepare.sh"),o,{mode:493}))}(n)})}const Me={node:["src","test","scripts"].sort(),blitz:["src","test","scripts","db","integrations","mailers"].sort()};async function Ue(n){return k.functionIgnoringException("generateLintstagedrc",async()=>{await async function(n){const s=t.resolve(n.dirPath,".lintstagedrc.cjs");if(n.isBun)return void await $.run(()=>e.promises.rm(s,{force:!0}));const i=n.isRoot?"node node_modules/.bin/":"node ../../node_modules/.bin/",o=[];if(n.doesContainsJavaScript||n.doesContainsTypeScript){const e=`\n '${He(n)}': [${JSON.stringify(`${i}eslint --fix${Se.getLintFixSuffix(n)}`)}, '${i}prettier --cache --write'],`;o.push(e)}const r=n.isRoot?" && !file.includes('/packages/')":"";o.push(`\n './**/*.{${pe.prettier.join(",")}}': files => {\n let filteredFiles = files.filter(file => !file.includes('/test-fixtures/') && !file.includes('/test/fixtures/')${r});${function(e){return e.doesContainsJavaScript||e.doesContainsTypeScript?`\n\n filteredFiles = filteredFiles.map((file) => path.relative('', file));\n filteredFiles = micromatch.not(filteredFiles, '${He(e)}');\n filteredFiles = filteredFiles.map((file) => path.resolve(file));`:""}(n)}\n if (filteredFiles.length === 0) return [];\n const commands = [\`${i}prettier --cache --write \${filteredFiles.join(' ')}\`];\n if (filteredFiles.some(file => file.endsWith('package.json'))) {\n commands.push('${i}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},`),n.doesContainsPubspecYaml&&o.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 },");n.doesContainsPoetryLock&&o.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${n.doesContainsJavaScript||n.doesContainsTypeScript?"const micromatch = require('micromatch');\n":""}\nmodule.exports = {${o.join("")}\n};\n`;await $.run(()=>e.promises.rm(t.resolve(n.dirPath,".lintstagedrc.js"),{force:!0})),await $.run(()=>e.promises.rm(t.resolve(n.dirPath,".lintstagedrc.json"),{force:!0})),await $.run(()=>F.generateFile(s,a))}(n)})}function He(e){const t=function(e){return e.depending.blitz?Me.blitz:Me.node}(e).map(e=>`${e}/**/`);return`{,${t.join(",")}}*.{${pe.eslint.join(",")}}`}async function qe(n){return k.functionIgnoringException("generateNextConfigJson",async()=>{const s=["js","mjs","cjs"].map(e=>t.resolve(n.dirPath,`next.config.${e}`)).find(t=>e.existsSync(t));if(!s)return;const i=(await e.promises.readFile(s,"utf8")).replace(/=\s*{([\S\s]*)};/,(e,t)=>(t.includes("eslint:")||(t+="eslint: { ignoreDuringBuilds: true },"),t.includes("typescript:")||(t+="typescript: { ignoreBuildErrors: true },"),`= {${t}};`));await $.run(()=>F.generateFile(s,i))})}async function Ye(e){return k.functionIgnoringException("generatePrettierignore",async()=>{const n=t.resolve(e.dirPath,".prettierignore"),s=await F.readFileIgnoringError(n)??"",i=ae.getHeadUserContent(s),o=ae.getTailUserContent(s),r=t.resolve(e.dirPath,".gitignore"),a=await ae.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/\ntest/fixtures/\n*.d.ts\n*.min.js\n.yarn/\n.pnp.js\n"+c+a+o;await $.run(()=>F.generateFile(n,l))})}const Ke={venvPath:".",venv:".venv"};async function Ve(n){return k.functionIgnoringException("generatePyrightConfigJson",async()=>{let s=m(Ke);const i=t.resolve(n.dirPath,"pyrightconfig.json");try{const t=await e.promises.readFile(i,"utf8"),n=JSON.parse(t);s=d.all([s,n,s],{arrayMerge:Q})}catch{}const o=JSON.stringify(s);await $.run(()=>F.generateFile(i,o))})}async function Xe(n){return k.functionIgnoringException("generateReadme",async()=>{const s=t.resolve(n.dirPath,"README.md");let i=await e.promises.readFile(s,"utf8");e.existsSync(t.resolve(n.dirPath,".releaserc.json"))&&(i=Qe(i,"[](https://github.com/semantic-release/semantic-release)"));const o=n.repository?.slice(n.repository?.indexOf(":")+1),r=e.readdirSync(`${n.dirPath}/.github/workflows`);for(const s of r){if(!s.startsWith("test")&&!s.startsWith("deploy"))continue;let r=s;r=r[0].toUpperCase()+r.slice(1,r.indexOf(".")),r=r.replace("-"," ");const a=`[](https://github.com/${o}/actions/workflows/${s})`;e.existsSync(t.resolve(n.dirPath,`.github/workflows/${s}`))&&(i=Qe(i,a))}await $.run(()=>F.generateFile(s,i))})}function Qe(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 Ze(n){return k.functionIgnoringException("generateReleaserc",async()=>{const s=t.resolve(n.dirPath,".releaserc.json"),i=JSON.parse(await e.promises.readFile(s,"utf8")),o=i?.plugins||[];for(let e=0;e<o.length;e++){const t=Array.isArray(o[e])?o[e][0]:o[e],n=Array.isArray(o[e])&&o[e][1]||{};if("@semantic-release/commit-analyzer"===t)o[e]=["@semantic-release/commit-analyzer",d.all([n,{preset:"conventionalcommits"}],{arrayMerge:Q})];else if("@semantic-release/github"===t){const{failComment:t,successComment:s,...i}=n;o[e]=["@semantic-release/github",d.all([i,{successCommentCondition:!1,failCommentCondition:!1,labels:["r: semantic-release"],releasedLabels:["released :bookmark:"]}],{arrayMerge:Q})]}}const r=JSON.stringify(i);await $.run(()=>F.generateFile(s,r))})}const et={$schema:"https://docs.renovatebot.com/renovate-schema.json",extends:["github>WillBooster/willbooster-configs:renovate.json5"]};async function tt(n){return k.functionIgnoringException("generateRenovateJson",async()=>{let s=m(et);const i=t.resolve(n.dirPath,"renovate.json");if(e.existsSync(`${i}5`))return;try{const t=await e.promises.readFile(i,"utf8"),n=JSON.parse(t);s=d.all([s,n,s],{arrayMerge:Q}),s.extends=s.extends.filter(e=>"@willbooster"!==e)}catch{}n.depending.blitz&&(s.packageRules??=[],s.packageRules.some(e=>e.matchPackageNames.includes("next"))||s.packageRules.push({matchPackageNames:["next"],enabled:!1})),await $.run(()=>e.promises.rm(t.resolve(n.dirPath,".dependabot"),{force:!0})),await $.run(()=>e.promises.rm(t.resolve(n.dirPath,".renovaterc.json"),{force:!0}));const o=JSON.stringify(s);await $.run(()=>F.generateFile(i,o))})}function nt(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&&nt(s);return e}const st={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,erasableSyntaxOnly:!0,outDir:"dist",typeRoots:["./node_modules/@types","./@types"]},exclude:["packages/*/test/fixtures","test/fixtures"],include:["packages/*/scripts/**/*","packages/*/src/**/*","packages/*/test/**/*","scripts/**/*","src/**/*","test/**/*"]},it={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,erasableSyntaxOnly:!0,outDir:"dist",typeRoots:["../../node_modules/@types","../../@types","./@types"]},exclude:["test/fixtures"],include:["scripts/**/*","src/**/*","test/**/*"]};async function ot(n){return k.functionIgnoringException("generateTsconfig",async()=>{if(n.depending.blitz||n.depending.next)return;let s=m(n.isRoot?st:it);n.doesContainsJsxOrTsx||n.doesContainsJsxOrTsxInPackages||delete s.compilerOptions?.jsx,n.isRoot&&!n.doesContainsSubPackageJsons&&(s.include=s.include?.filter(e=>!e.startsWith("packages/*/")),s.exclude=s.exclude?.filter(e=>!e.startsWith("packages/*/"))),n.isEsmPackage&&(s.compilerOptions={...s.compilerOptions,module:"NodeNext",moduleResolution:"NodeNext"});const i=t.resolve(n.dirPath,"tsconfig.json");try{const t=await e.promises.readFile(i,"utf8"),o=JSON.parse(t);"./node_modules/@willbooster/tsconfig/tsconfig.json"===o.extends&&delete o.extends,delete s.compilerOptions?.target,n.isEsmPackage||(delete s.compilerOptions?.module,delete s.compilerOptions?.moduleResolution),o.compilerOptions?.jsx&&delete s.compilerOptions?.jsx,s=d.all([s,o,s],{arrayMerge:Z}),s.include=s.include?.filter(e=>!e.includes("@types")&&!e.includes("__tests__/")&&!e.includes("tests/"))}catch{}nt(s),s.include?.sort();const o=JSON.stringify(s);delete s.compilerOptions?.experimentalDecorators,await $.run(()=>F.generateFile(i,o))})}const rt=["**/.git/objects/**","**/.git/subtree-cache/**","**/node_modules/**","**/tmp/**","**/temp/**","**/dist/**"];async function at(n){return k.functionIgnoringException("generateVscodeSettings",async()=>{try{const s=t.resolve(n.dirPath,".vscode","settings.json"),i=await e.promises.readFile(s,"utf8");let o=JSON.parse(i);for(const e of rt)o=d.all([o,ct(e)]);n.doesContainsPoetryLock&&(o=d.all([o,ct("**/.venv/**")])),n.depending.next&&(o=d.all([o,ct("**/.next/**")])),"editor.codeActionsOnSave"in o&&delete o["editor.codeActionsOnSave"],"editor.formatOnSave"in o&&delete o["editor.formatOnSave"],nt(o??{});const r=JSON.stringify(o,void 0,2);await $.run(()=>F.generateFile(s,r))}catch{}})}function ct(e){return{"files.watcherExclude":{[e]:!0}}}const lt={test:{name:"Test",on:{pull_request:null,push:{branches:["main","wbfy"]}},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 pt(n){return k.functionIgnoringException("generateWorkflow",async()=>{const s=t.resolve(n.dirPath,".github","workflows");await e.promises.mkdir(s,{recursive:!0});const i=t.resolve(n.dirPath,".github","semantic.yml");await $.run(()=>e.promises.rm(i,{force:!0,recursive:!0}));const o=await e.promises.readdir(s,{withFileTypes:!0}),r=new Set(["test.yml","wbfy.yml","wbfy-merge.yml","semantic-pr.yml","close-comment.yml","add-issue-to-project.yml",...o.filter(e=>e.isFile()&&e.name.endsWith(".yml")).map(e=>e.name)]);n.depending.semanticRelease&&r.add("release.yml"),(n.isPublicRepo||n.repository?.startsWith("github:WillBoosterLab/"))&&(r.add("add-ready-issue-to-project.yml"),r.add("notify-ready.yml"));for(const e of r){const i=t.basename(e,".yml");await $.run(()=>dt(n,s,i))}await $.run(()=>e.promises.rm(t.join(s,"add-focused-issue-to-project.yml"),{force:!0,recursive:!0}))})}async function dt(n,s,i){let o=m(lt[i]??{});const r=t.join(s,`${i}.yml`);try{const t=await e.promises.readFile(r,"utf8"),n=u.load(t);o=d.all([o,n,o],{arrayMerge:Z})}catch{}i.startsWith("deploy")&&(o={...o,concurrency:{group:"${{ github.workflow }}","cancel-in-progress":!1}},o.jobs&&function(e,t){const n=e[t];delete e[t],e[t]=n}(o,"jobs"),o.on?.push&&(o.on.push["paths-ignore"]=[...new Set(["**.md","**/docs/**",...o.on.push["paths-ignore"]??[]])]));for(const e of Object.values(o.jobs)){if(!e.uses?.includes?.("/reusable-workflows/"))return;ut(n,e,i)}switch(i){case"release":if(o.on?.schedule)delete o.on.push;else{if(!(o.on?.push&&n.release.branches.length>0))return void await e.promises.rm(t.join(s,"release.yml"),{force:!0});o.on.push.branches=n.release.branches}break;case"test":delete o.on?.pull_request?.["paths-ignore"],delete o.on?.push?.["paths-ignore"],o.on?.push&&(o.on.push.branches=o.on.push.branches.filter(e=>"renovate/**"!==e));break;case"wbfy":o.on&&mt(o,20,24);break;case"wbfy-merge":mt(o,1,4)}if(function(e){delete e.jobs["add-to-project"]}(o),await ft(o,r),"release"===i)await e.promises.rm(t.join(s,"semantic-release.yml"),{force:!0});else if("sync"===i){if(await e.promises.rm(t.join(s,"sync-init.yml"),{force:!0}),!o.jobs.sync||!o.jobs.sync.with)return;o.jobs["sync-force"]=o.jobs.sync;const n=o.jobs.sync.with.sync_params_without_dest;if("string"!=typeof n)return;o.jobs.sync.with.sync_params_without_dest=`--force ${n}`,o.name="Force to Sync",o.on={workflow_dispatch:null},delete o.jobs.sync,await ft(o,t.join(s,"sync-force.yml"))}}function ut(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;"string"==typeof e&&(t.with.sync_params_without_dest=e.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&&"string"==typeof t.with.deploy_command&&(t.with.deploy_command=t.with.deploy_command.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||n.startsWith("deploy")?e.isPublicRepo&&(t.with.github_hosted_runner=!0):delete t.with.github_hosted_runner,Object.keys(t.with).length>0?nt(t.with):delete t.with,Object.keys(t.secrets).length>0){const e=nt(t.secrets);delete t.secrets,t.secrets=e}else delete t.secrets}function mt(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 ft(t,n){const s=u.dump(t,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}});await e.promises.writeFile(n,s)}async function gt(n){return k.functionIgnoringException("generateYarnrcYml",async()=>{const s=t.resolve(n.dirPath,".yarnrc.yml");if(n.isBun)return await $.run(()=>e.promises.rm(s,{force:!0})),await $.run(()=>e.promises.rm(t.resolve(n.dirPath,".yarn"),{force:!0,recursive:!0})),void await $.run(()=>e.promises.rm(t.resolve(n.dirPath,"yarn.lock"),{force:!0,recursive:!0}));const i=N("yarn",["--version"],n.dirPath),o=function(e,t){const n=N("npm",["show",e,"versions","--json"],t);return JSON.parse(n).at(-1)}("@yarnpkg/cli",n.dirPath);ht(i)<=ht(o)&&i!==o&&J("yarn",["set","version",o],n.dirPath,1);const r=t.join(n.dirPath,".yarn","releases");await e.promises.mkdir(r,{recursive:!0});for(const n of await e.promises.readdir(r))n.startsWith("yarn-")&&!n.startsWith(`yarn-${o}.`)&&await $.run(()=>e.promises.rm(t.join(r,n)));const a=t.resolve(n.dirPath,".yarnrc");await $.run(()=>e.promises.rm(a,{force:!0}));const c=u.load(await e.promises.readFile(s,"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 s=t.resolve(n.dirPath,".yarnrc","undefined.cjs");await $.run(()=>e.promises.rm(s,{force:!0}))}0===c.plugins.length&&delete c.plugins,await e.promises.writeFile(s,u.dump(c,{lineWidth:-1})),J("yarn",["dlx","yarn-plugin-auto-install"],n.dirPath)})}function ht(e){const[t]=e.split(".");return Number(t)}async function yt(e){return k.functionIgnoringException("setupLabels",async()=>{if(!R)return;const[t,n]=L.getOrgAndName(e.repository??"");if(t&&n&&("WillBooster"===t||"WillBoosterLab"===t))try{await wt(t,n,"d1: x-easy :hedgehog:","EDE9FE"),await wt(t,n,"d2: easy :rabbit2:","DDD6FE"),await wt(t,n,"d3: medium :ox:","C4B5FD"),await wt(t,n,"d4: hard :squid:","A78BFA"),await wt(t,n,"d5: x-hard :whale2:","8B5CF6"),await wt(t,n,"p1: critical :fire::fire::fire:","EF4444"),await wt(t,n,"p2: urgent :fire::fire:","F87171"),await wt(t,n,"p3: important :fire:","FCA5A5"),await wt(t,n,"p4: nice to have :droplet:","FECACA"),await wt(t,n,"r: blitz","5300bc"),await wt(t,n,"r: firebase","ffca28"),await wt(t,n,"r: prisma","0c344b"),await wt(t,n,"r: react","61dafb"),await wt(t,n,"r: svelte","ff3e00"),await wt(t,n,"r: semantic-release","494949"),await wt(t,n,"ready :rocket:","22C55E"),await wt(t,n,"review requested :mag:","FBCA04"),await wt(t,n,"released :bookmark:","6366F1"),await wt(t,n,"s: 0.5h :clock1230:","F3F4F6"),await wt(t,n,"s: 1h :clock1:","E5E7EB"),await wt(t,n,"s: 2h :clock2:","D1D5DB"),await wt(t,n,"s: 3h :clock3:","9CA3AF"),await wt(t,n,"s: 5h :clock5:","6B7280"),await wt(t,n,"s: 8h :clock8:","4B5563"),await wt(t,n,"s: 13h :clock1:","374151"),await wt(t,n,"t: build :hammer:","BFDBFE"),await wt(t,n,"t: chore :broom:","BFDBFE"),await wt(t,n,"t: ci :construction_worker:","BFDBFE"),await wt(t,n,"t: docs :memo:","BFDBFE"),await wt(t,n,"t: feat :sparkles:","BFDBFE"),await wt(t,n,"t: fix :bug:","BFDBFE"),await wt(t,n,"t: perf :zap:","BFDBFE"),await wt(t,n,"t: refactor :recycle:","BFDBFE"),await wt(t,n,"t: style :lipstick:","BFDBFE"),await wt(t,n,"t: test :test_tube:","BFDBFE"),await wt(t,n,"project","24292F"),await wt(t,n,"focused :dart:","22C55E"),await wt(t,n,"ai-pr :robot:","00B4D8"),await bt(t,n,"bug"),await bt(t,n,"documentation"),await bt(t,n,"duplicate"),await bt(t,n,"enhancement"),await bt(t,n,"good first issue"),await bt(t,n,"help wanted"),await bt(t,n,"invalid"),await bt(t,n,"question"),await bt(t,n,"wontfix"),await bt(t,n,"ready"),await bt(t,n,"review requested"),await bt(t,n,"released"),await bt(t,n,"semantic-release"),await bt(t,n,"llm-pr :robot:")}catch(e){console.warn("Skip setupLabels due to:",e?.stack??e)}})}async function wt(e,t,n,s){try{await W.request("POST /repos/{owner}/{repo}/labels",{owner:e,repo:t,name:n,color:s})}catch{await W.request("PATCH /repos/{owner}/{repo}/labels/{name}",{owner:e,repo:t,name:n,color:s})}}async function bt(e,t,n){try{await W.request("DELETE /repos/{owner}/{repo}/labels/{name}",{owner:e,repo:t,name:n})}catch{}}const vt=["READY_DISCORD_WEBHOOK_URL"];async function kt(e){return k.functionIgnoringException("setupSecrets",async()=>{if(!R||!v.doesUploadEnvVars)return;const[t,n]=L.getOrgAndName(e.repository??"");if(!t||!n||"WillBoosterLab"!==t)return;const s=g.config().parsed||{};if(0!==Object.keys(s).length)try{for(const e of vt)try{await W.request("DELETE /repos/{owner}/{repo}/actions/secrets/{secret_name}",{owner:t,repo:n,secret_name:e})}catch{}const i=await W.request("GET /repos/{owner}/{repo}/actions/secrets/public-key",{owner:t,repo:n}),{key:o,key_id:r}=i.data;await h.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=h.from_base64(o,h.base64_variants.ORIGINAL),c=h.from_string(a),l=h.crypto_box_seal(c,s),p=h.to_base64(l,h.base64_variants.ORIGINAL);await W.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 jt(e){const[t,n]=L.getOrgAndName(e.repository??"");t&&n&&("WillBooster"!==t&&"WillBoosterLab"!==t||await s(()=>W.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 xt={"pull_request_template.md":'\nClose #<IssueNumber>\n\n## Self Check\n\n- [ ] I\'ve confirmed `All checks have passed` on this page.\n - PR title follows [Angular\'s commit message format](https://github.com/angular/angular/blob/main/CONTRIBUTING.md#-commit-message-format).\n - PR title doesn\'t have `WIP:`.\n - The test command (e.g., `yarn test`) passed.\n - The lint command (e.g., `yarn lint`) passed.\n - You may leave this box unchecked due to long workflows.\n- [ ] I\'ve reviewed my changes on the GitHub diff view.\n- [ ] I\'ve written the steps to test my changes.\n- [ ] I\'ve added screenshots (if the UI changed).\n - You may leave this box unchecked if you didn\'t modify the UI.\n\n\x3c!-- Please add screenshots if you modify the UI.\n| Current | In coming |\n| ------------------------ | ------------------------ |\n| <img src="" width="400"> | <img src="" width="400"> |\n--\x3e\n\n\x3c!-- Please add steps to test your changes.\n## Steps to Test\n\n1. Open http://localhost-exercode.willbooster.net:3000/ja-JP/courses/_example/lessons/_example_a_plus_b/problems/_example_a_plus_b after login.\n2. Select the language `C`.\n3. Write the following code:\n ```c\n #include <stdio.h>\n\n int main(void) {\n int a, b;\n\n scanf("%d %d", &a, &b);\n printf("%d", a + b);\n return 0;\n }\n ```\n4. Push `Submit` button.\n5. ...\n--\x3e\n'.trim()};async function _t(n){return k.functionIgnoringException("generateGitHubTemplates",async()=>{for(const[s,i]of Object.entries(xt)){const o=t.resolve(n.dirPath,".github",s);if(e.existsSync(o)){const t=await e.promises.readFile(o,"utf8");if(y(t,i)>i.length/2)continue}await e.promises.mkdir(t.resolve(n.dirPath,".github"),{recursive:!0}),await $.run(()=>F.generateFile(o,i))}})}const Pt=b.object({typos:b.object({all:b.record(b.string()).optional(),doc:b.record(b.string()).optional(),ts:b.record(b.string()).optional(),text:b.record(b.string()).optional()}).optional()});async function St(n,s){const i=t.resolve(n,"package.json");try{const o=e.existsSync(i);let a={},c={},l={},p=!1;if(o){const t=e.readFileSync(i,"utf8");l=JSON.parse(t),a=l.dependencies??{},c=l.devDependencies??{},p="module"===l.type}let d=[],u=[];try{const e=t.resolve(n,".releaserc.json"),s=JSON.parse(await r.readFile(e,"utf8"));d=s?.branches||[],u=s?.plugins?.flat()||[]}catch{}const m="packages"!==t.basename(t.resolve(n,".."))||!e.existsSync(t.resolve(n,"..","..","package.json"));let f;m&&(f=await async function(e,t){const n=w(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 Ct(i);if(e)return e}const o="string"==typeof t.repository?t.repository:t.repository?.url;if(o){const e=await Ct(o);if(e&&"Not Found"!==e.message)return e}}(n,l));let g="";try{g+=(await r.readFile(t.resolve(n,".tool-versions"),"utf8")).trim()}catch{}for(const[e,s]of[["java","java"],["node","nodejs"],["python","python"]])try{const i=await r.readFile(t.resolve(n,`.${e}-version`),"utf8");g&&(g+="\n"),g+=s+" "+i.trim()}catch{}let h="";try{h=await r.readFile(t.resolve(n,"Dockerfile"),"utf8")}catch{}const y=t.resolve(n,"wbfy.json");let b;try{const e=await r.readFile(y,"utf8");b=Pt.parse(JSON.parse(e))}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||e.existsSync(t.join(n,"bunfig.toml")),isEsmPackage:p,isWillBoosterConfigs:i.includes(`${t.sep}willbooster-configs`),doesContainsSubPackageJsons:$t("packages/**/package.json",n),doesContainsDockerfile:!!h||e.existsSync(t.resolve(n,"docker-compose.yml")),doesContainsGemfile:e.existsSync(t.resolve(n,"Gemfile")),doesContainsGoMod:e.existsSync(t.resolve(n,"go.mod")),doesContainsPackageJson:e.existsSync(t.resolve(n,"package.json")),doesContainsPoetryLock:e.existsSync(t.resolve(n,"poetry.lock")),doesContainsPomXml:e.existsSync(t.resolve(n,"pom.xml")),doesContainsPubspecYaml:e.existsSync(t.resolve(n,"pubspec.yaml")),doesContainsTemplateYaml:e.existsSync(t.resolve(n,"template.yaml")),doesContainsVscodeSettingsJson:e.existsSync(t.resolve(n,".vscode","settings.json")),doesContainsJavaScript:$t("{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx}",n),doesContainsTypeScript:$t("{app,src,test,scripts}/**/*.{cts,mts,ts,tsx}",n),doesContainsJsxOrTsx:$t("{app,src,test}/**/*.{t,j}sx",n),doesContainsJavaScriptInPackages:$t("packages/**/{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx}",n),doesContainsTypeScriptInPackages:$t("packages/**/{app,src,test,scripts}/**/*.{cts,mts,ts,tsx}",n),doesContainsJsxOrTsxInPackages:$t("packages/**/{app,src,test}/**/*.{t,j}sx",n),depending:{blitz:!!a.blitz,firebase:!!c["firebase-tools"],genI18nTs:!!c["gen-i18n-ts"],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:b};if(v.isBun||(v.eslintBase=function(e){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 a.globSync(e,{dot:!0,cwd:t,ignore:_}).length>0}async function Ct(e){const[t,n]=L.getOrgAndName(e);if(!t||!n)return;const s={full_name:`${t}/${n}`};try{const e=await W.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;v.isVerbose=n.verbose,v.doesUploadEnvVars=n.env;for(const s of n.paths){const o=t.join(s,"packages"),r=(await i(()=>e.promises.readdir(o,{withFileTypes:!0}))??[]).filter(e=>e.isDirectory()).map(e=>t.join(o,e.name));await S([s,...r]);const a=await St(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=>St(e,a)))).filter(e=>!!e),p=[a,...l];if(v.isVerbose)for(const e of p)console.info(e);await Y(a),await gt(a),await Promise.all([j(a),P(a),c.then(()=>Xe(a)),D(a,p),le(a),ue(a),he(a),ye(a),be(a),_t(a),Je(a),tt(a),Ze(a),pt(a),yt(a),kt(a),jt(a),...a.isBun?[te(a),Te(a).then(()=>Ge(a))]:[Te(a)],Ue(a)]),await $.promiseAll();const d=[];for(const e of p)(e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages)&&d.push(C(e,e.isRoot?p:[e])),e.depending.playwrightTest&&d.push(x(e)),e.depending.next&&d.push(qe(e)),await ke(e,a),await $.promiseAll(),(e.isRoot||e.doesContainsPackageJson)&&(await Ye(e),await Be(e,a,n.skipDeps),d.push(Ue(e)),e.doesContainsVscodeSettingsJson&&e.doesContainsPackageJson&&d.push(at(e)),(e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages)&&d.push(ot(e)),(e.doesContainsJavaScript||e.doesContainsJavaScriptInPackages||e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages)&&(a.isBun&&d.push(ee(e)),a.isWillBoosterConfigs||d.push(fe(e))),e.depending.pyright&&d.push(Ve(e)));await Promise.all(d),await $.promiseAll();const u=a.isBun?"bun":"yarn";if(J(u,["cleanup"],s),a.isBun){J(u,["update"],s);const n=t.join(s,"bun.lockb");e.existsSync(n)&&(e.promises.rm(n),J(u,["install","--save-text-lockfile","--frozen-lockfile","--lockfile-only"],s))}else J(u,["install"],s)}}();
|
2
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9vcHRpb25zLnRzIiwiLi4vc3JjL2xvZ2dlci50cyIsIi4uL3NyYy9maXhlcnMvZG9ja2VyZmlsZS50cyIsIi4uL3NyYy9maXhlcnMvcGxheXdyaWdodENvbmZpZy50cyIsIi4uL3NyYy91dGlscy9nbG9iVXRpbC50cyIsIi4uL3NyYy9maXhlcnMvcHJpc21hLnRzIiwiLi4vc3JjL2ZpeGVycy90ZXN0RGlyZWN0b3J5LnRzIiwiLi4vc3JjL3V0aWxzL3Byb21pc2VQb29sLnRzIiwiLi4vc3JjL2ZpeGVycy90eXBlRGVmaW5pdGlvbi50cyIsIi4uL3NyYy91dGlscy9mc1V0aWwudHMiLCIuLi9zcmMvZml4ZXJzL3R5cG9zLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvYWdlbnRzLnRzIiwiLi4vc3JjL3V0aWxzL2dpdGh1YlV0aWwudHMiLCIuLi9zcmMvdXRpbHMvc3Bhd25VdGlsLnRzIiwiLi4vc3JjL3V0aWxzL3ZlcnNpb24udHMiLCIuLi9zcmMvdXRpbHMvdmVyc2lvbkNvbnN0YW50cy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2FzZGYudHMiLCIuLi9zcmMvdXRpbHMvbWVyZ2VVdGlsLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvYmlvbWUudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9idW5maWcudHMiLCIuLi9zcmMvdXRpbHMvaWdub3JlRmlsZVV0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9kb2NrZXJpZ25vcmUudHMiLCIuLi9zcmMvdXRpbHMvZXh0ZW5zaW9ucy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2VkaXRvcmNvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2VzbGludENvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2dlbWluaUNvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2dlbWluaVNldHRpbmdzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2l0YXR0cmlidXRlcy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2dpdGlnbm9yZS50cyIsIi4uL3NyYy9naXRodWIvY29tbWl0LnRzIiwiLi4vc3JjL3V0aWxzL2VzbGludFV0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9wYWNrYWdlSnNvbi50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2h1c2t5cmMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9pZGVhLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvbGVmdGhvb2sudHMiLCIuLi9zcmMvdXRpbHMvc3JjRGlyZWN0b3JpZXMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9saW50c3RhZ2VkcmMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9uZXh0Y29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcHJldHRpZXJpZ25vcmUudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9weXJpZ2h0Y29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVhZG1lLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVsZWFzZXJjLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVub3ZhdGVKc29uLnRzIiwiLi4vc3JjL3V0aWxzL29iamVjdFV0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy90c2NvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3ZzY29kZVNldHRpbmdzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvd29ya2Zsb3cudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy95YXJucmMudHMiLCIuLi9zcmMvZ2l0aHViL2xhYmVsLnRzIiwiLi4vc3JjL2dpdGh1Yi9zZWNyZXQudHMiLCIuLi9zcmMvZ2l0aHViL3NldHRpbmdzLnRzIiwiLi4vc3JjL2dpdGh1Yi90ZW1wbGF0ZS50cyIsIi4uL3NyYy9wYWNrYWdlQ29uZmlnLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImNsYXNzIE9wdGlvbnMge1xuICBpc1ZlcmJvc2U6IGJvb2xlYW47XG4gIGRvZXNVcGxvYWRFbnZWYXJzOiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuaXNWZXJib3NlID0gZmFsc2U7XG4gICAgdGhpcy5kb2VzVXBsb2FkRW52VmFycyA9IGZhbHNlO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTtcbiIsImltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuL29wdGlvbnMuanMnO1xuXG5jbGFzcyBMb2dnZXIge1xuICBhc3luYyBmdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKG5hbWU6IHN0cmluZywgZnVuYzogKCkgPT4gUHJvbWlzZTx2b2lkPik6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGAtLS0tLS0tLS0gJHtuYW1lfSBzdGFydCAtLS0tLS0tLS1gKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZ1bmMoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5pbmZvKGBFcnJvciBvY2N1cnJlZCBpbiAke25hbWV9OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5zdGFjayA6IFN0cmluZyhlcnJvcil9fWApO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgLS0tLS0tLS0tLSAke25hbWV9IGVuZCAtLS0tLS0tLS0tYCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBsb2dnZXIgPSBuZXcgTG9nZ2VyKCk7XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhEb2NrZXJmaWxlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeERvY2tlcmZpbGUnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFjb25maWcuZG9lc0NvbnRhaW5zRG9ja2VyZmlsZSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2xkQ29udGVudCA9IGNvbmZpZy5kb2NrZXJmaWxlO1xuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBvbGRDb250ZW50O1xuXG4gICAgaWYgKG9sZENvbnRlbnQgPT09IG5ld0NvbnRlbnQpIHJldHVybjtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUocGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAnRG9ja2VyZmlsZScpLCBuZXdDb250ZW50KTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhQbGF5d3JpZ2h0Q29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFBsYXl3cmlnaHRDb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oY29uZmlnLmRpclBhdGgsICdwbGF5d3JpZ2h0LmNvbmZpZy50cycpO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHJldHVybjtcblxuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcblxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBvbGRDb250ZW50LnJlcGxhY2UoL3JldHJpZXM6LissLywgJ3JldHJpZXM6IHByb2Nlc3MuZW52LlBXREVCVUcgPyAwIDogcHJvY2Vzcy5lbnYuQ0kgPyA1IDogMSwnKTtcbiAgICBpZiAob2xkQ29udGVudCA9PT0gbmV3Q29udGVudCkgcmV0dXJuO1xuXG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KTtcbiAgfSk7XG59XG4iLCJleHBvcnQgY29uc3QgZ2xvYklnbm9yZSA9IFtcbiAgJyoqL25vZGVfbW9kdWxlcy8qKicsXG4gICcqKi8udmVudi8qKicsXG4gICcqKi90ZXN0LWZpeHR1cmVzLyoqJyxcbiAgJyoqL3Rlc3QvZml4dHVyZXMvKionLFxuICAnKiovZGlzdC8qKicsXG4gICcqKi9idWlsZC8qKicsXG4gICcqKi90YXJnZXQvKionLFxuICAnKiovdGVtcC8qKicsXG4gICcqKi90bXAvKionLFxuXTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnbG9iSWdub3JlIH0gZnJvbSAnLi4vdXRpbHMvZ2xvYlV0aWwuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4UHJpc21hRW52RmlsZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4UHJpc21hRW52RmlsZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZW52RmlsZXMgPSBhd2FpdCBmZy5nbG9iKFsnKi5lbnYnLCAnKi5lbnYuKiddLCB7IGRvdDogdHJ1ZSwgY3dkOiBjb25maWcuZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH0pO1xuICAgIGZvciAoY29uc3QgZW52RmlsZSBvZiBlbnZGaWxlcykge1xuICAgICAgY29uc3QgZW52RmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGVudkZpbGUpO1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGVudkZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3QgbmV3Q29udGVudCA9IGNvbnRlbnQucmVwbGFjZShcbiAgICAgICAgL0RBVEFCQVNFX1VSTD1cIj8oLitcXC5zcWxpdGUzKVwiP1tcXG4kXS8sXG4gICAgICAgICdEQVRBQkFTRV9VUkw9XCIkMT9jb25uZWN0aW9uX2xpbWl0PTFcIlxcbidcbiAgICAgICk7XG4gICAgICBhd2FpdCBmcy53cml0ZUZpbGUoZW52RmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgIH1cbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4VGVzdERpcmVjdG9yaWVzVXBkYXRpbmdQYWNrYWdlSnNvbihwYWNrYWdlRGlyUGF0aHM6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4VGVzdERpcmVjdG9yaWVzVXBkYXRpbmdQYWNrYWdlSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHBhY2thZ2VEaXJQYXRocy5tYXAoYXN5bmMgKHBhY2thZ2VEaXJQYXRoKSA9PiB7XG4gICAgICAgIGNvbnN0IG5ld1Rlc3REaXJQYXRoID0gcGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAndGVzdCcpO1xuICAgICAgICBmb3IgKGNvbnN0IG9sZFRlc3REaXJOYW1lIG9mIFsnX190ZXN0c19fJywgJ3Rlc3RzJ10pIHtcbiAgICAgICAgICBjb25zdCBvbGRUZXN0RGlyUGF0aCA9IHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgb2xkVGVzdERpck5hbWUpO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy5yZW5hbWUob2xkVGVzdERpclBhdGgsIG5ld1Rlc3REaXJQYXRoKTtcbiAgICAgICAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKTtcbiAgICAgICAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBvbGRDb250ZW50LnJlcGxhY2VBbGwob2xkVGVzdERpck5hbWUsICd0ZXN0Jyk7XG4gICAgICAgICAgICBpZiAob2xkQ29udGVudCA9PT0gbmV3Q29udGVudCkgcmV0dXJuO1xuXG4gICAgICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAncGFja2FnZS5qc29uJyksIG5ld0NvbnRlbnQpO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gZG8gbm90aGluZ1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICB9KTtcbn1cbiIsImltcG9ydCB7IFByb21pc2VQb29sIH0gZnJvbSAnbWluaW1hbC1wcm9taXNlLXBvb2wnO1xuXG5leHBvcnQgY29uc3QgcHJvbWlzZVBvb2wgPSBuZXcgUHJvbWlzZVBvb2woKTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGlnbm9yZUVub2VudEFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWInO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFR5cGVEZWZpbml0aW9ucyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBjb25maWdzSW5jbHVkaW5nQ2hpbGRyZW46IFBhY2thZ2VDb25maWdbXVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4VHlwZURlZmluaXRpb25zJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGxpYlR5cGVEaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnQHR5cGVzJyk7XG4gICAgY29uc3Qgc3JjVHlwZURpclBhdGggPVxuICAgICAgY29uZmlnLmlzUm9vdCAmJiBjb25maWcuZG9lc0NvbnRhaW5zU3ViUGFja2FnZUpzb25zID8gdW5kZWZpbmVkIDogcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnc3JjJywgJ3R5cGVzJyk7XG5cbiAgICBjb25zdCBkaXJlbnRzID0gYXdhaXQgaWdub3JlRW5vZW50QXN5bmMoKCkgPT4gZnMucmVhZGRpcihsaWJUeXBlRGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKTtcbiAgICBpZiAoIWRpcmVudHMpIHJldHVybjtcblxuICAgIGZvciAoY29uc3QgZGlyZW50IG9mIGRpcmVudHMpIHtcbiAgICAgIGNvbnN0IGRpck5hbWUgPSBkaXJlbnQubmFtZS5zbGljZSgwLCAtNSk7XG4gICAgICBjb25zdCBoYXNUeXBlRGVjbGFyYXRpb25FeHRlbnNpb24gPSBkaXJlbnQubmFtZS5lbmRzV2l0aCgnLmQudHMnKTtcbiAgICAgIGxldCBwYWNrYWdlTmFtZSA9IGhhc1R5cGVEZWNsYXJhdGlvbkV4dGVuc2lvbiA/IGRpck5hbWUgOiBkaXJlbnQubmFtZTtcbiAgICAgIGlmIChwYWNrYWdlTmFtZS5pbmNsdWRlcygnX18nKSkge1xuICAgICAgICBwYWNrYWdlTmFtZSA9IGBAJHtwYWNrYWdlTmFtZS5yZXBsYWNlKCdfXycsICcvJyl9YDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGhhc0xpYnJhcnkgPSBjb25maWdzSW5jbHVkaW5nQ2hpbGRyZW4uc29tZShcbiAgICAgICAgKGNvbmZpZykgPT5cbiAgICAgICAgICBjb25maWcucGFja2FnZUpzb24/LmRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSB8fCBjb25maWcucGFja2FnZUpzb24/LmRldkRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXVxuICAgICAgKTtcblxuICAgICAgaWYgKGRpcmVudC5pc0ZpbGUoKSAmJiBoYXNUeXBlRGVjbGFyYXRpb25FeHRlbnNpb24pIHtcbiAgICAgICAgaWYgKGhhc0xpYnJhcnkpIHtcbiAgICAgICAgICAvLyBNb3ZlIEB0eXBlcy88bmFtZT4vaW5kZXguZC50cyBpZiBpbnN0YWxsZWRcbiAgICAgICAgICBhd2FpdCBmcy5ta2RpcihwYXRoLmpvaW4obGliVHlwZURpclBhdGgsIGRpck5hbWUpKTtcbiAgICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgICAgICAgIGZzLnJlbmFtZShwYXRoLmpvaW4obGliVHlwZURpclBhdGgsIGRpcmVudC5uYW1lKSwgcGF0aC5qb2luKGxpYlR5cGVEaXJQYXRoLCBkaXJOYW1lLCAnaW5kZXguZC50cycpKVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3JjVHlwZURpclBhdGgpIHtcbiAgICAgICAgICAvLyBNb3ZlIHNyYy90eXBlcy88bmFtZT4gaWYgbm90IGluc3RhbGxlZFxuICAgICAgICAgIGF3YWl0IGZzLm1rZGlyKHNyY1R5cGVEaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgICAgICAgIGZzLnJlbmFtZShwYXRoLmpvaW4obGliVHlwZURpclBhdGgsIGRpcmVudC5uYW1lKSwgcGF0aC5qb2luKHNyY1R5cGVEaXJQYXRoLCBkaXJlbnQubmFtZSkpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChkaXJlbnQuaXNEaXJlY3RvcnkoKSAmJiBzcmNUeXBlRGlyUGF0aCAmJiAhaGFzTGlicmFyeSkge1xuICAgICAgICAvLyBNb3ZlIHNyYy90eXBlcy88bmFtZT4uZC50cyBpZiBub3QgaW5zdGFsbGVkXG4gICAgICAgIGF3YWl0IGZzLm1rZGlyKHNyY1R5cGVEaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICAgICAgaWdub3JlRW5vZW50QXN5bmMoKCkgPT5cbiAgICAgICAgICAgIGZzLnJlbmFtZShcbiAgICAgICAgICAgICAgcGF0aC5qb2luKGxpYlR5cGVEaXJQYXRoLCBkaXJlbnQubmFtZSwgJ2luZGV4LmQudHMnKSxcbiAgICAgICAgICAgICAgcGF0aC5qb2luKHNyY1R5cGVEaXJQYXRoLCBgJHtkaXJlbnQubmFtZX0uZC50c2ApXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5leHBvcnQgY29uc3QgZnNVdGlsID0ge1xuICBhc3luYyByZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gIH0sXG4gIGFzeW5jIGdlbmVyYXRlRmlsZShmaWxlUGF0aDogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihwYXRoLmRpcm5hbWUoZmlsZVBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQpO1xuICAgIGNvbnNvbGUubG9nKGBHZW5lcmF0ZWQvVXBkYXRlZCAke2ZpbGVQYXRofWApO1xuICB9LFxufTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4uL29wdGlvbnMuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJy4uL3V0aWxzL2dsb2JVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4VHlwb3MocGFja2FnZUNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFR5cG9zJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGRpclBhdGggPSBwYWNrYWdlQ29uZmlnLmRpclBhdGg7XG4gICAgY29uc3QgZG9jRmlsZXMgPSBhd2FpdCBmZy5nbG9iKCcqKi8qLm1kJywgeyBkb3Q6IHRydWUsIGN3ZDogZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH0pO1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBGb3VuZCAke2RvY0ZpbGVzLmxlbmd0aH0gbWFya2Rvd24gZmlsZXMgaW4gJHtkaXJQYXRofWApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IG1kRmlsZSBvZiBkb2NGaWxlcykge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgbWRGaWxlKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bihhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgICAgbGV0IG5ld0NvbnRlbnQgPSBmaXhUeXBvc0luVGV4dChjb250ZW50KTtcbiAgICAgICAgbmV3Q29udGVudCA9IHJlcGxhY2VXaXRoQ29uZmlnKG5ld0NvbnRlbnQsIHBhY2thZ2VDb25maWcsICdkb2MnKTtcbiAgICAgICAgaWYgKGNvbnRlbnQgIT09IG5ld0NvbnRlbnQpIHtcbiAgICAgICAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgdHNGaWxlcyA9IGF3YWl0IGZnLmdsb2IoXG4gICAgICBbXG4gICAgICAgICd7YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4LGN0cyxtdHMsdHMsdHN4fScsXG4gICAgICAgICdwYWNrYWdlcy8qKi97YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4LGN0cyxtdHMsdHMsdHN4fScsXG4gICAgICBdLFxuICAgICAgeyBkb3Q6IHRydWUsIGN3ZDogZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH1cbiAgICApO1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBGb3VuZCAke3RzRmlsZXMubGVuZ3RofSBUeXBlU2NyaXB0IGZpbGVzIGluICR7ZGlyUGF0aH1gKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCB0c0ZpbGUgb2YgdHNGaWxlcykge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgdHNGaWxlKTtcbiAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGxldCBuZXdDb250ZW50ID0gZml4VHlwb3NJbkNvZGUob2xkQ29udGVudCk7XG4gICAgICBuZXdDb250ZW50ID0gcmVwbGFjZVdpdGhDb25maWcobmV3Q29udGVudCwgcGFja2FnZUNvbmZpZywgJ3RzJyk7XG5cbiAgICAgIGlmIChvbGRDb250ZW50ID09PSBuZXdDb250ZW50KSBjb250aW51ZTtcbiAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgIH1cblxuICAgIGNvbnN0IHRleHRCYXNlZEZpbGVzID0gYXdhaXQgZmcuZ2xvYignKiovKi57Y3N2LGh0bSxodG1sLHRzdix4bWwseWFtbCx5bWx9Jywge1xuICAgICAgZG90OiB0cnVlLFxuICAgICAgY3dkOiBkaXJQYXRoLFxuICAgICAgaWdub3JlOiBnbG9iSWdub3JlLFxuICAgIH0pO1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBGb3VuZCAke3RleHRCYXNlZEZpbGVzLmxlbmd0aH0gdGV4dC1iYXNlZCBmaWxlcyBpbiAke2RpclBhdGh9YCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgZmlsZSBvZiB0ZXh0QmFzZWRGaWxlcykge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgZmlsZSk7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBsZXQgbmV3Q29udGVudCA9IGZpeFR5cG9zSW5UZXh0KG9sZENvbnRlbnQpO1xuICAgICAgbmV3Q29udGVudCA9IHJlcGxhY2VXaXRoQ29uZmlnKG5ld0NvbnRlbnQsIHBhY2thZ2VDb25maWcsICd0ZXh0Jyk7XG5cbiAgICAgIGlmIChvbGRDb250ZW50ID09PSBuZXdDb250ZW50KSBjb250aW51ZTtcbiAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgIH1cblxuICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaXhUeXBvc0luVGV4dChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gY29udGVudFxuICAgIC5yZXBsYWNlQWxsKC9cXGJjXFwuZlxcLihbXiRdKS9nLCAnY2YuJDEnKVxuICAgIC5yZXBsYWNlQWxsKC9cXGJlZ1xcLihbXiRdKS9nLCAnZS5nLiQxJylcbiAgICAucmVwbGFjZUFsbCgvXFxiaWVcXC4oW14kXSkvZywgJ2kuZS4kMScpO1xufVxuXG5mdW5jdGlvbiBmaXhUeXBvc0luQ29kZShjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gY29udGVudFxuICAgIC5yZXBsYWNlQWxsKC9cXC9cXC8oLiopY1xcLmZcXC4vZywgJy8vJDFjZi4nKVxuICAgIC5yZXBsYWNlQWxsKC9cXC9cXC8oLiopZWdcXC4vZywgJy8vJDFlLmcuJylcbiAgICAucmVwbGFjZUFsbCgvXFwvXFwvKC4qKWllXFwuL2csICcvLyQxaS5lLicpO1xufVxuXG5mdW5jdGlvbiByZXBsYWNlV2l0aENvbmZpZyhuZXdDb250ZW50OiBzdHJpbmcsIHBhY2thZ2VDb25maWc6IFBhY2thZ2VDb25maWcsIHByb3BOYW1lOiAnZG9jJyB8ICd0cycgfCAndGV4dCcpOiBzdHJpbmcge1xuICBmb3IgKGNvbnN0IFtiZWZvcmUsIGFmdGVyXSBvZiBPYmplY3QuZW50cmllcyhwYWNrYWdlQ29uZmlnLndiZnlKc29uPy50eXBvcz8uYWxsID8/IHt9KSkge1xuICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2VBbGwoYmVmb3JlLCBhZnRlcik7XG4gIH1cbiAgZm9yIChjb25zdCBbYmVmb3JlLCBhZnRlcl0gb2YgT2JqZWN0LmVudHJpZXMocGFja2FnZUNvbmZpZy53YmZ5SnNvbj8udHlwb3M/Lltwcm9wTmFtZV0gPz8ge30pKSB7XG4gICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZUFsbChiZWZvcmUsIGFmdGVyKTtcbiAgfVxuICByZXR1cm4gbmV3Q29udGVudDtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbnMoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghY29uZmlnLmlzUm9vdCkgcmV0dXJuO1xuXG4gICAgLy8gQ2hlY2sgaWYgQUdFTlRTX0VYVFJBLm1kIGV4aXN0cyBhbmQgcmVhZCBpdHMgY29udGVudFxuICAgIGNvbnN0IGFnZW50c0V4dHJhUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ0FHRU5UU19FWFRSQS5tZCcpO1xuICAgIGNvbnN0IGV4dHJhQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoYWdlbnRzRXh0cmFQYXRoKTtcblxuICAgIGZvciAoY29uc3QgW2ZpbGVOYW1lLCB0b29sTmFtZV0gb2YgW1xuICAgICAgWydBR0VOVFMubWQnLCAnQ29kZXggQ0xJJ10sXG4gICAgICBbJ0NMQVVERS5tZCcsICdDbGF1ZGUgQ29kZSddLFxuICAgICAgWydHRU1JTkkubWQnLCAnR2VtaW5pIENMSSddLFxuICAgIF0pIHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBnZW5lcmF0ZUNsYXVkZUNvbnRlbnQoY29uZmlnLCBhbGxDb25maWdzLCB0b29sTmFtZSwgZXh0cmFDb250ZW50KTtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBmaWxlTmFtZSk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgY29udGVudCkpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlQ2xhdWRlQ29udGVudChcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10sXG4gIHRvb2xOYW1lOiBzdHJpbmcsXG4gIGV4dHJhQ29udGVudD86IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSBjb25maWcuaXNCdW4gPyAnYnVuJyA6ICd5YXJuJztcbiAgY29uc3QgYmFzZUNvbnRlbnQgPSBgXG4jIyBQcm9qZWN0IEluZm9ybWF0aW9uXG5cbi0gTmFtZTogJHtjb25maWcucGFja2FnZUpzb24/Lm5hbWV9XG4tIERlc2NyaXB0aW9uOiAke2NvbmZpZy5wYWNrYWdlSnNvbj8uZGVzY3JpcHRpb259XG4tIFBhY2thZ2UgTWFuYWdlcjogJHtwYWNrYWdlTWFuYWdlcn1cblxuIyMgR2VuZXJhbCBJbnN0cnVjdGlvbnNcblxuJHtcbiAgYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRlcGVuZGluZy5nZW5JMThuVHMpXG4gICAgPyBgLSBJZiB5b3UgaW50cm9kdWNlIG5ldyBzdHJpbmcgbGl0ZXJhbHMgaW4gUmVhY3QgY29tcG9uZW50cywgdXBkYXRlIGxhbmd1YWdlIHJlc291cmNlIGZpbGVzIGluIFxcYGkxOG5cXGAgZGlyZWN0b3J5IGxpa2UgXFxgaTE4bi9qYS1KUC5qc29uXFxgLiBSZWZlcmVuY2UgdGhlc2Ugc3RyaW5ncyB1c2luZyB0aGUgXFxgaTE4blxcYCB1dGlsaXR5LCBmb3IgZXhhbXBsZTogXFxgaTE4bi5wYWdlcy5ob21lLnRpdGxlKClcXGAgZm9yIFxcYHsgXCJwYWdlc1wiOiB7IFwiaG9tZVwiOiB7IFwidGl0bGVcIjogXCJNeSBBcHBcIiB9IH0gfVxcYC5gXG4gICAgOiAnJ1xufVxuLSBBZnRlciBtYWtpbmcgY29kZSBjaGFuZ2VzLCBydW4gXFxgJHtwYWNrYWdlTWFuYWdlcn0gY2hlY2stZm9yLWFpXFxgIHRvIHBlcmZvcm0gdHlwZSBjaGVja2luZyBhbmQgbGludGluZy5cbi0gT25jZSB5b3UgaGF2ZSBjaGVja2VkIHlvdXIgY2hhbmdlcywgY29tbWl0IHRoZW0gdG8gdGhlIGN1cnJlbnQgYnJhbmNoIHVzaW5nIHRoZSBcXGAtLW5vLXZlcmlmeVxcYCBvcHRpb24uIE1ha2Ugc3VyZSB0byBhZGQgYSBuZXcgbGluZSBhdCB0aGUgZW5kIG9mIHlvdXIgY29tbWl0IG1lc3NhZ2Ugd2l0aDogXFxgQ28tYXV0aG9yZWQtYnk6IFdpbGxCb29zdGVyICgke3Rvb2xOYW1lfSkgPGFnZW50QHdpbGxib29zdGVyLmNvbT5cXGAuXG4tIFdoZW4geW91ciB3b3JrIGlzIGZ1bGx5IGNvbXBsZXRlLCBydW4gXFxgJHtwYWNrYWdlTWFuYWdlcn0gY2hlY2stYWxsLWZvci1haVxcYCB0byBleGVjdXRlIGFsbCB0ZXN0cyAobm90ZTogdGhpcyBtYXkgdGFrZSB1cCB0byAzMCBtaW51dGVzKS5cblxuIyMgQ29kaW5nIFN0eWxlXG5cbi0gV2hlbiBhZGRpbmcgbmV3IGZ1bmN0aW9ucyBvciBjbGFzc2VzLCBkZWZpbmUgdGhlbSBiZWxvdyBhbnkgZnVuY3Rpb25zIG9yIGNsYXNzZXMgdGhhdCBjYWxsIHRoZW0gdG8gbWFpbnRhaW4gY2xlYXIgY2FsbCBvcmRlci5cbiR7XG4gIGFsbENvbmZpZ3Muc29tZSgoYykgPT4gYy5kZXBlbmRpbmcubmV4dClcbiAgICA/IGAtIFNpbmNlIHRoaXMgcHJvamVjdCB1c2VzIHRoZSBSZWFjdCBDb21waWxlciwgeW91IGRvIG5vdCBuZWVkIHRvIHVzZSBcXGB1c2VDYWxsYmFja1xcYCBvciBcXGB1c2VNZW1vXFxgIGZvciBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24uYFxuICAgIDogJydcbn1cbmBcbiAgICAucmVwbGFjZUFsbCgvXFxuezMsfS9nLCAnXFxuXFxuJylcbiAgICAudHJpbSgpO1xuXG4gIHJldHVybiBleHRyYUNvbnRlbnQgPyBiYXNlQ29udGVudCArICdcXG5cXG4nICsgZXh0cmFDb250ZW50LnRyaW0oKSA6IGJhc2VDb250ZW50O1xufVxuIiwiaW1wb3J0IHsgT2N0b2tpdCB9IGZyb20gJ0BvY3Rva2l0L2NvcmUnO1xuXG5jb25zdCB0b2tlbiA9XG4gIHByb2Nlc3MuZW52LkdIX0JPVF9QQVQgfHwgcHJvY2Vzcy5lbnYuUFVCTElDX0dIX0JPVF9QQVQgfHwgcHJvY2Vzcy5lbnYuR0hfVE9LRU4gfHwgcHJvY2Vzcy5lbnYuR0lUSFVCX1RPS0VOO1xuZXhwb3J0IGNvbnN0IGhhc0dpdEh1YlRva2VuID0gISF0b2tlbjtcbmV4cG9ydCBjb25zdCBvY3Rva2l0ID0gbmV3IE9jdG9raXQoe1xuICBhdXRoOiB0b2tlbixcbn0pO1xuXG5jbGFzcyBHaXRIdWJVdGlsIHtcbiAgZ2V0T3JnQW5kTmFtZSh1cmxPckZ1bGxOYW1lOiBzdHJpbmcpOiBbc3RyaW5nLCBzdHJpbmddIHtcbiAgICBjb25zdCB1cmxXaXRob3V0UHJvdG9jb2wgPSB1cmxPckZ1bGxOYW1lLnNwbGl0KCc6JykuYXQoLTEpO1xuICAgIGNvbnN0IG5hbWVzID0gdXJsV2l0aG91dFByb3RvY29sPy5zcGxpdCgnLycpO1xuICAgIGNvbnN0IG9yZyA9IG5hbWVzPy5hdCgtMikgPz8gJyc7XG4gICAgY29uc3QgbmFtZSA9IG5hbWVzPy5hdCgtMSk/LnJlcGxhY2UoLy5naXQkLywgJycpID8/ICcnO1xuICAgIHJldHVybiBbb3JnLCBuYW1lXTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZ2l0SHViVXRpbCA9IG5ldyBHaXRIdWJVdGlsKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFNwYXduU3luY09wdGlvbnMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXduU3luYyhjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZywgcmV0cnkgPSAwKTogdm9pZCB7XG4gIGRvIHtcbiAgICBjb25zdCBbbmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zXSA9IGdldFNwYXduU3luY0FyZ3MoY29tbWFuZCwgYXJncywgY3dkKTtcbiAgICBjb25zb2xlLmxvZyhgJCAke25ld0NtZH0gJHtuZXdBcmdzLmpvaW4oJyAnKX0gYXQgJHtjd2R9YCk7XG4gICAgY29uc3QgcmV0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMobmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zKTtcbiAgICBpZiAocmV0LnN0YXR1cyA9PT0gMCkgYnJlYWs7XG4gIH0gd2hpbGUgKC0tcmV0cnkgPj0gMCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3blN5bmNXaXRoU3RyaW5nUmVzdWx0KGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgW25ld0NtZCwgbmV3QXJncywgb3B0aW9uc10gPSBnZXRTcGF3blN5bmNBcmdzKGNvbW1hbmQsIGFyZ3MsIGN3ZCk7XG4gIG9wdGlvbnMuc3RkaW8gPSAncGlwZSc7XG4gIGNvbnN0IHByb2MgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnMpO1xuICBjb25zdCBlcnJvciA9IHByb2Muc3RkZXJyLnRvU3RyaW5nKCkudHJpbSgpO1xuICBpZiAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKGAke25ld0NtZH0gWyR7bmV3QXJncy5tYXAoKHMpID0+IGBcIiR7c31cImApLmpvaW4oJywgJyl9XSBjYXVzZWQgdGhlIGZvbGxvd2luZyBlcnJvcjpcXG4gJHtlcnJvcn1gKTtcbiAgfVxuICByZXR1cm4gcHJvYy5zdGRvdXQudG9TdHJpbmcoKS50cmltKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTcGF3blN5bmNBcmdzKGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nKTogW3N0cmluZywgc3RyaW5nW10sIFNwYXduU3luY09wdGlvbnNdIHtcbiAgY29uc3QgZW52ID0geyAuLi5wcm9jZXNzLmVudiB9O1xuICAvLyBSZW1vdmUgYmVycnkgZnJvbSBQQVRIXG4gIGlmIChlbnYuUEFUSCAmJiBlbnYuQkVSUllfQklOX0ZPTERFUikge1xuICAgIGVudi5QQVRIID0gZW52LlBBVEgucmVwbGFjZShgJHtlbnYuQkVSUllfQklOX0ZPTERFUn06YCwgJycpO1xuICB9XG5cbiAgaWYgKGVudi5BU0RGX0RJUikge1xuICAgIGFyZ3MgPSBbJy1sJywgJy1jJywgYCR7Y29tbWFuZH0gJHthcmdzLmpvaW4oJyAnKX1gXTtcbiAgICBjb21tYW5kID0gJ2Jhc2gnO1xuICB9XG4gIHJldHVybiBbXG4gICAgY29tbWFuZCxcbiAgICBhcmdzLFxuICAgIHtcbiAgICAgIGN3ZCxcbiAgICAgIGVudixcbiAgICAgIHNoZWxsOiBmYWxzZSxcbiAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgfSxcbiAgXTtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0VmVyc2lvbkludG9OdW1iZXIodmVyc2lvbjogc3RyaW5nKTogbnVtYmVyIHtcbiAgLy8gZS5nLiBqYXZhIGFkb3B0b3Blbmpkay0xMS4wLjE3KzhcbiAgY29uc3QgbnVtYmVycyA9IHZlcnNpb25cbiAgICAuc3BsaXQoL1srLi1dLylcbiAgICAubWFwKE51bWJlcilcbiAgICAuZmlsdGVyKChudW0pID0+ICFOdW1iZXIuaXNOYU4obnVtKSk7XG4gIGxldCB2ZXJzaW9uTnVtYmVyID0gMDtcbiAgbGV0IGRpdmlzb3IgPSAxO1xuICBmb3IgKGNvbnN0IG51bSBvZiBudW1iZXJzKSB7XG4gICAgdmVyc2lvbk51bWJlciArPSBudW0gKiBkaXZpc29yO1xuICAgIGRpdmlzb3IgLz0gMTAwMDtcbiAgfVxuICByZXR1cm4gdmVyc2lvbk51bWJlcjtcbn1cbiIsImV4cG9ydCBjb25zdCBQWVRIT05fVkVSU0lPTiA9ICczLjkuMTknO1xuZXhwb3J0IGNvbnN0IEpBVkFfVkVSU0lPTiA9ICd6dWx1LTExLjc0LjE1Jztcbi8vIEJlY2F1c2UgV2ViS2l0IGNhbm5vdCBsb2ctaW4gb24gQmxpdHogdjIuMC41K1xuZXhwb3J0IGNvbnN0IEJMSVRaX1ZFUlNJT04gPSAnMi4wLjQnO1xuZXhwb3J0IGNvbnN0IE5FWFRfVkVSU0lPTiA9ICcxNC4yLjUnO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgb2N0b2tpdCB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMsIHNwYXduU3luY1dpdGhTdHJpbmdSZXN1bHQgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuaW1wb3J0IHsgY29udmVydFZlcnNpb25JbnRvTnVtYmVyIH0gZnJvbSAnLi4vdXRpbHMvdmVyc2lvbi5qcyc7XG5pbXBvcnQgeyBKQVZBX1ZFUlNJT04sIFBZVEhPTl9WRVJTSU9OIH0gZnJvbSAnLi4vdXRpbHMvdmVyc2lvbkNvbnN0YW50cy5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVRvb2xWZXJzaW9ucyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVRvb2xWZXJzaW9ucycsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBjb3JlKGNvbmZpZyk7XG4gIH0pO1xufVxuXG5jb25zdCBDT1JFX1RPT0xTID0gbmV3IFNldChbJ2phdmEnLCAnbm9kZWpzJywgJ2J1bicsICdweXRob24nXSk7XG5jb25zdCBERVBSRUNBVEVEX1ZFUlNJT05fUFJFRklYRVMgPSBbJ2phdmEnLCAnbm9kZScsICdweXRob24nXTtcblxuYXN5bmMgZnVuY3Rpb24gY29yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFjb25maWcudmVyc2lvbnNUZXh0KSByZXR1cm47XG5cbiAgY29uc3QgZHVwbGljYXRhYmxlTGluZXMgPSBjb25maWcudmVyc2lvbnNUZXh0XG4gICAgLnRyaW0oKVxuICAgIC5zcGxpdCgnXFxuJylcbiAgICAubWFwKChsaW5lKSA9PiB7XG4gICAgICBjb25zdCBbbmFtZSwgdmVyc2lvbl0gPSBsaW5lLnRyaW0oKS5zcGxpdCgvXFxzKy8pO1xuICAgICAgLy8gVG8gbW92ZSB0aGUgdG9wIG9mIHRoZSBzb3J0ZWQgbGlzdCwgd2UgbmVlZCB0byBhZGQgYSBzcGFjZS5cbiAgICAgIHJldHVybiBgJHtDT1JFX1RPT0xTLmhhcyhuYW1lKSA/ICcgJyA6ICcnfSR7bmFtZX0gJHt2ZXJzaW9ufWA7XG4gICAgfSlcbiAgICAuc29ydCgpXG4gICAgLy8gUmVtb3ZlIGFkZGVkIHNwYWNlcy5cbiAgICAubWFwKChsaW5lKSA9PiBsaW5lLnRyaW0oKSlcbiAgICAvLyBUT0RPOiByZW1vdmUgdGhlIGZvbGxvd2luZyBsaW5lIGFmdGVyIGxlZnRob29rIGlzIGluc3RhbGxlZCB2aWEgbnBtLlxuICAgIC5maWx0ZXIoKGxpbmUpID0+ICFsaW5lLnN0YXJ0c1dpdGgoJ2xlZnRob29rJykpO1xuICBjb25zdCBsaW5lcyA9IFsuLi5uZXcgU2V0KGR1cGxpY2F0YWJsZUxpbmVzKV07XG5cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNQb2V0cnlMb2NrKSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnaHR0cHM6Ly9weXBpLm9yZy9weXBpL3BvZXRyeS9qc29uJyk7XG4gICAgY29uc3QganNvbiA9IChhd2FpdCByZXNwb25zZS5qc29uKCkpIGFzIHsgaW5mbz86IHsgdmVyc2lvbjogc3RyaW5nIH0gfSB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCBwb2V0cnlWZXJzaW9uID0ganNvbj8uaW5mbz8udmVyc2lvbjtcbiAgICBpZiAocG9ldHJ5VmVyc2lvbikge1xuICAgICAgdXBkYXRlVmVyc2lvbihsaW5lcywgJ3BvZXRyeScsIHBvZXRyeVZlcnNpb24pO1xuICAgIH1cbiAgICB1cGRhdGVWZXJzaW9uKGxpbmVzLCAncHl0aG9uJywgUFlUSE9OX1ZFUlNJT04sIHRydWUpO1xuICB9XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLmZpcmViYXNlKSB7XG4gICAgdXBkYXRlVmVyc2lvbihsaW5lcywgJ2phdmEnLCBKQVZBX1ZFUlNJT04sIHRydWUpO1xuICB9XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5zUGFja2FnZUpzb24pIHtcbiAgICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgICBjb25zdCBidW5WZXJzaW9uID0gYXdhaXQgZ2V0TGF0ZXN0VmVyc2lvbkZyb21UYWdPbkdpdEh1Yignb3Zlbi1zaCcsICdidW4nKTtcbiAgICAgIGlmIChidW5WZXJzaW9uKSB1cGRhdGVWZXJzaW9uKGxpbmVzLCAnYnVuJywgYnVuVmVyc2lvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHZlcnNpb24gPSBzcGF3blN5bmNXaXRoU3RyaW5nUmVzdWx0KCducG0nLCBbJ3Nob3cnLCAneWFybicsICd2ZXJzaW9uJ10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICAgIHVwZGF0ZVZlcnNpb24obGluZXMsICd5YXJuJywgdmVyc2lvbik7XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBwcmVmaXggb2YgREVQUkVDQVRFRF9WRVJTSU9OX1BSRUZJWEVTKSB7XG4gICAgY29uc3QgdmVyc2lvblBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGAuJHtwcmVmaXh9LXZlcnNpb25gKTtcbiAgICB2b2lkIGZzLnByb21pc2VzLnJtKHZlcnNpb25QYXRoLCB7IGZvcmNlOiB0cnVlIH0pO1xuICB9XG5cbiAgY29uc3QgdG9vbFZlcnNpb25zUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy50b29sLXZlcnNpb25zJyk7XG4gIGF3YWl0IChsaW5lcy5sZW5ndGggPiAwXG4gICAgPyBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMud3JpdGVGaWxlKHRvb2xWZXJzaW9uc1BhdGgsIGxpbmVzLmpvaW4oJ1xcbicpICsgJ1xcbicpKVxuICAgIDogcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHRvb2xWZXJzaW9uc1BhdGgsIHsgZm9yY2U6IHRydWUgfSkpKTtcbiAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICBzcGF3blN5bmMoJ2FzZGYnLCBbJ3BsdWdpbicsICd1cGRhdGUnLCAnLS1hbGwnXSwgY29uZmlnLmRpclBhdGgpO1xuICBzcGF3blN5bmMoJ2FzZGYnLCBbJ2luc3RhbGwnXSwgY29uZmlnLmRpclBhdGgpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVWZXJzaW9uKGxpbmVzOiBzdHJpbmdbXSwgdG9vbE5hbWU6IHN0cmluZywgbmV3VmVyc2lvbjogc3RyaW5nLCBoZWFkID0gZmFsc2UpOiB2b2lkIHtcbiAgY29uc3QgaW5kZXggPSBsaW5lcy5maW5kSW5kZXgoKGwpID0+IGwuc3BsaXQoL1xccysvKVswXSA9PT0gdG9vbE5hbWUpO1xuICBjb25zdCBuZXdMaW5lID0gYCR7dG9vbE5hbWV9ICR7bmV3VmVyc2lvbn1gO1xuICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgbGluZXMuc3BsaWNlKGhlYWQgPyAwIDogbGluZXMubGVuZ3RoLCAwLCBuZXdMaW5lKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBbLCB2ZXJzaW9uXSA9IGxpbmVzW2luZGV4XS5zcGxpdCgvXFxzKy8pO1xuICAgIGlmIChjb252ZXJ0VmVyc2lvbkludG9OdW1iZXIobmV3VmVyc2lvbikgPiBjb252ZXJ0VmVyc2lvbkludG9OdW1iZXIodmVyc2lvbikpIHtcbiAgICAgIGxpbmVzW2luZGV4XSA9IG5ld0xpbmU7XG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldExhdGVzdFZlcnNpb25Gcm9tVGFnT25HaXRIdWIob3JnYW5pemF0aW9uOiBzdHJpbmcsIHJlcG9zaXRvcnk6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgLy8gRmV0Y2ggdGhlIGxhdGVzdCByZWxlYXNlIGZyb20gdGhlIHJlcG9zaXRvcnlcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG9jdG9raXQucmVxdWVzdCgnR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9yZWxlYXNlcy9sYXRlc3QnLCB7XG4gICAgICBvd25lcjogb3JnYW5pemF0aW9uLFxuICAgICAgcmVwbzogcmVwb3NpdG9yeSxcbiAgICB9KTtcbiAgICBjb25zdCB2ZXJzaW9uID0gcmVzcG9uc2UuZGF0YS50YWdfbmFtZTtcbiAgICBjb25zdCBpbmRleCA9IHZlcnNpb24ubGFzdEluZGV4T2YoJ3YnKTtcbiAgICBjb25zdCB2ZXJzaW9uTnVtYmVyVGV4dCA9IGluZGV4ID09PSAtMSA/IHZlcnNpb24gOiB2ZXJzaW9uLnNsaWNlKGluZGV4ICsgMSk7XG4gICAgLy8gQ2hlY2sgdGhlIGZpcnN0IGNoYXJhY3RlciBpcyBhIG51bWJlclxuICAgIHJldHVybiAvXlxcZC8udGVzdCh2ZXJzaW9uTnVtYmVyVGV4dCkgPyB2ZXJzaW9uTnVtYmVyVGV4dCA6IHVuZGVmaW5lZDtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gZmV0Y2ggQnVuIHRhZ3MgZHVlIHRvOicsIGVycm9yKTtcbiAgICByZXR1cm47XG4gIH1cbn1cbiIsIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtYXNzaWdubWVudCwgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1jYWxsLCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3MsIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtYXJndW1lbnQgKi9cblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBvdmVyd3JpdGVNZXJnZTxUPihkZXN0aW5hdGlvbkFycmF5OiBUW10sIHNvdXJjZUFycmF5OiBUW10pOiBUW10ge1xuICByZXR1cm4gc291cmNlQXJyYXk7XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgZnVuY3Rpb24gY29tYmluZU1lcmdlKHRhcmdldDogb2JqZWN0W10sIHNvdXJjZTogb2JqZWN0W10sIG9wdGlvbnM6IGFueSk6IG9iamVjdFtdIHtcbiAgY29uc3QgZGVzdGluYXRpb24gPSBbLi4udGFyZ2V0XTtcblxuICBmb3IgKGNvbnN0IFtpbmRleCwgaXRlbV0gb2Ygc291cmNlLmVudHJpZXMoKSkge1xuICAgIGlmIChkZXN0aW5hdGlvbltpbmRleF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgZGVzdGluYXRpb25baW5kZXhdID0gb3B0aW9ucy5jbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZChpdGVtLCBvcHRpb25zKTtcbiAgICB9IGVsc2UgaWYgKG9wdGlvbnMuaXNNZXJnZWFibGVPYmplY3QoaXRlbSkpIHtcbiAgICAgIGRlc3RpbmF0aW9uW2luZGV4XSA9IG1lcmdlKHRhcmdldFtpbmRleF0sIGl0ZW0sIG9wdGlvbnMpO1xuICAgIH0gZWxzZSBpZiAoIXRhcmdldC5pbmNsdWRlcyhpdGVtKSkge1xuICAgICAgZGVzdGluYXRpb24ucHVzaChpdGVtKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRlc3RpbmF0aW9uO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQmlvbWVKc29uYyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUJpb21lSnNvbmMnLCBhc3luYyAoKSA9PiB7XG4gICAgbGV0IG5ld1NldHRpbmdzOiBvYmplY3QgPSB7XG4gICAgICByb290OiBjb25maWcuaXNSb290LFxuICAgICAgJHNjaGVtYTogJy4vbm9kZV9tb2R1bGVzL0BiaW9tZWpzL2Jpb21lL2NvbmZpZ3VyYXRpb25fc2NoZW1hLmpzb24nLFxuICAgICAgZXh0ZW5kczogWydAd2lsbGJvb3N0ZXIvYmlvbWUtY29uZmlnJ10sXG4gICAgfTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2Jpb21lLmpzb25jJyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG9sZFNldHRpbmdzID0gSlNPTi5wYXJzZShvbGRDb250ZW50KSBhcyBvYmplY3Q7XG4gICAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShuZXdTZXR0aW5ncyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IG5ld0NvbnRlbnRXaXRoRXhhY3RUcnVlID0gYHRlbGVtZXRyeSA9IGZhbHNlXG5cbltpbnN0YWxsXVxuZXhhY3QgPSB0cnVlXG5cbltydW5dXG5idW4gPSB0cnVlXG5gO1xuXG5jb25zdCBuZXdDb250ZW50V2l0aEV4YWN0RmFsc2UgPSBgdGVsZW1ldHJ5ID0gZmFsc2VcblxuW2luc3RhbGxdXG5leGFjdCA9IGZhbHNlXG5cbltydW5dXG5idW4gPSB0cnVlXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVCdW5maWdUb21sKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlQnVuZmlnVG9tbCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2J1bmZpZy50b21sJyk7XG4gICAgY29uc3QgY29udGVudCA9XG4gICAgICBmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSAmJiBmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGY4JykuaW5jbHVkZXMoJ2V4YWN0ID0gZmFsc2UnKVxuICAgICAgICA/IG5ld0NvbnRlbnRXaXRoRXhhY3RGYWxzZVxuICAgICAgICA6IG5ld0NvbnRlbnRXaXRoRXhhY3RUcnVlO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuXG5jb25zdCB1c2VyQ29udGVudEhlYWRlciA9ICcjIFByb2plY3Qtc3BlY2lmaWMgc2V0dGluZ3MnO1xuY29uc3QgdXNlckNvbnRlbnRIZWFkZXJSZWdleCA9IC8jIFByb2plY3Qtc3BlY2lmaWMgc2V0dGluZ3NbXlxcbl0qXFxuL2dtO1xuY29uc3Qgc2VwYXJhdG9yID0gJyMgR2VuZXJhdGVkIGJ5IHdiZnknO1xuY29uc3Qgc2VwYXJhdG9yUHJlZml4ID0gJyMgR2VuZXJhdGVkIGJ5ICc7XG5jb25zdCBkZWZhdWx0SGVhZFVzZXJDb250ZW50ID0gYCR7dXNlckNvbnRlbnRIZWFkZXJ9IChoZWFkKVxuXG5cbiR7c2VwYXJhdG9yfVxuYDtcbmNvbnN0IGRlZmF1bHRUYWlsVXNlckNvbnRlbnQgPSBgXG4ke3VzZXJDb250ZW50SGVhZGVyfSAodGFpbClcbmA7XG5cbmV4cG9ydCBjb25zdCBpZ25vcmVGaWxlVXRpbCA9IHtcbiAgc2VwYXJhdG9yLFxuICBzZXBhcmF0b3JQcmVmaXgsXG4gIGRlZmF1bHRIZWFkVXNlckNvbnRlbnQsXG4gIGRlZmF1bHRUYWlsVXNlckNvbnRlbnQsXG4gIGFzeW5jIHJlYWRHaXRpZ25vcmVXaXRob3V0U2VwYXJhdG9ycyhmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICB0cnkge1xuICAgICAgbGV0IGNvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IGxhc3RIZWFkZXJJbmRleCA9IGdldEluZGV4T2ZUYWlsVXNlckNvbnRlbnRIZWFkZXIoY29udGVudCk7XG4gICAgICBpZiAobGFzdEhlYWRlckluZGV4ID4gMCkge1xuICAgICAgICBjb250ZW50ID0gY29udGVudC5zbGljZSgwLCBsYXN0SGVhZGVySW5kZXggLSAxKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNvbnRlbnRcbiAgICAgICAgICAucmVwbGFjZUFsbCh1c2VyQ29udGVudEhlYWRlclJlZ2V4LCAnJylcbiAgICAgICAgICAucmVwbGFjZUFsbCgvIyBHZW5lcmF0ZWQgYnkgW15cXG5dKlxcbi9nbSwgJycpXG4gICAgICAgICAgLnJlcGxhY2VBbGwoL1xccj9cXG5cXHI/XFxuKFxccj9cXG4pKy9nbSwgJ1xcblxcbicpXG4gICAgICAgICAgLnRyaW0oKSArICdcXG4nXG4gICAgICApO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgfSxcbiAgZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgaW5kZXggPSBjb250ZW50LmluZGV4T2YodGhpcy5zZXBhcmF0b3JQcmVmaXgpO1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgIHJldHVybiBjb250ZW50XG4gICAgICAgIC5zbGljZSgwLCBjb250ZW50LmluZGV4T2YoJ1xcbicsIGluZGV4KSArIDEpXG4gICAgICAgIC5yZXBsYWNlQWxsKHVzZXJDb250ZW50SGVhZGVyUmVnZXgsIGAke3VzZXJDb250ZW50SGVhZGVyfSAoaGVhZClcXG5gKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlZmF1bHRIZWFkVXNlckNvbnRlbnQ7XG4gIH0sXG4gIGdldFRhaWxVc2VyQ29udGVudChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGxhc3RIZWFkZXJJbmRleCA9IGdldEluZGV4T2ZUYWlsVXNlckNvbnRlbnRIZWFkZXIoY29udGVudCk7XG4gICAgaWYgKGxhc3RIZWFkZXJJbmRleCA+IDApIHtcbiAgICAgIHJldHVybiBjb250ZW50LnNsaWNlKGxhc3RIZWFkZXJJbmRleCAtIDEpO1xuICAgIH1cbiAgICByZXR1cm4gZGVmYXVsdFRhaWxVc2VyQ29udGVudDtcbiAgfSxcbiAgYXN5bmMgaXNCZXJyeVplcm9JbnN0YWxsRW5hYmxlZChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIHJldHVybiBjb250ZW50LmluY2x1ZGVzKCdcXG4hLnlhcm4vY2FjaGUnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0sXG59O1xuXG5mdW5jdGlvbiBnZXRJbmRleE9mVGFpbFVzZXJDb250ZW50SGVhZGVyKGNvbnRlbnQ6IHN0cmluZyk6IG51bWJlciB7XG4gIGNvbnN0IGluZGV4ID0gY29udGVudC5pbmRleE9mKHVzZXJDb250ZW50SGVhZGVyKTtcbiAgY29uc3QgbGFzdEluZGV4ID0gY29udGVudC5sYXN0SW5kZXhPZih1c2VyQ29udGVudEhlYWRlcik7XG4gIHJldHVybiBsYXN0SW5kZXggPiBpbmRleCA/IGxhc3RJbmRleCA6IC0xO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbi8vIEV4ZXJjb2Rl44Gn44Gvbm9kZV9tb2R1bGVz44KSQ09QWeOBmeOCi+W/heimgeOBjOOBguOCi+OBn+OCgeOAgW5vZGVfbW9kdWxlc+OCkumZpOWkluOBl+OBpuOBr+OBhOOBkeOBquOBhOOAglxuY29uc3QgY29tbW9uQ29udGVudCA9IGBcbioqLy5pZGVhXG4qKi8qLnNxbGl0ZTMqXG4qKi8ueWFybi9pbnN0YWxsLXN0YXRlLmd6XG4qKi8udmVudlxuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRG9ja2VyaWdub3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlRG9ja2VyaWdub3JlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmRvY2tlcmlnbm9yZScpO1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zRG9ja2VyZmlsZSkge1xuICAgICAgY29uc3QgY29udGVudCA9IChhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoKSkgPz8gJyc7XG4gICAgICBjb25zdCBoZWFkVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRIZWFkVXNlckNvbnRlbnQoY29udGVudCk7XG4gICAgICBjb25zdCB0YWlsVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRUYWlsVXNlckNvbnRlbnQoY29udGVudCk7XG5cbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBoZWFkVXNlckNvbnRlbnQgKyBjb21tb25Db250ZW50ICsgdGFpbFVzZXJDb250ZW50O1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgfVxuICB9KTtcbn1cbiIsImV4cG9ydCBjb25zdCBleHRlbnNpb25zID0ge1xuICBjb2RlV2l0aDJJbmRlbnRTaXplOiBbXG4gICAgJ2NqcycsXG4gICAgJ21qcycsXG4gICAgJ2pzJyxcbiAgICAnanN4JyxcbiAgICAnY3RzJyxcbiAgICAnbXRzJyxcbiAgICAndHMnLFxuICAgICd0c3gnLFxuICAgICdqc29uJyxcbiAgICAnanNvbjUnLFxuICAgICdqc29uYycsXG4gICAgJ2NwcCcsXG4gICAgJ2RhcnQnLFxuICAgICdodG0nLFxuICAgICdodG1sJyxcbiAgICAncHUnLFxuICAgICdwdW1sJyxcbiAgICAncmInLFxuICAgICd2dWUnLFxuICAgICd4bWwnLFxuICAgICd5YW1sJyxcbiAgICAneW1sJyxcbiAgICAnc2gnLFxuICBdLnNvcnQoKSxcbiAgY29kZVdpdGg0SW5kZW50U2l6ZTogWydnbycsICdncmFkbGUnLCAnamF2YScsICdweSddLnNvcnQoKSxcbiAgbWFya2Rvd25MaWtlOiBbJ21kJ10uc29ydCgpLFxuICBlc2xpbnQ6IFsnY2pzJywgJ21qcycsICdqcycsICdjdHMnLCAnbXRzJywgJ3RzJywgJ3RzeCcsICdqc3gnXS5zb3J0KCksXG4gIHByZXR0aWVyOiBbXG4gICAgJ2NqcycsXG4gICAgJ21qcycsXG4gICAgJ2phdmEnLFxuICAgICdqcycsXG4gICAgJ2pzeCcsXG4gICAgJ2N0cycsXG4gICAgJ210cycsXG4gICAgJ3RzJyxcbiAgICAndHN4JyxcbiAgICAnanNvbicsXG4gICAgJ2pzb241JyxcbiAgICAnanNvbmMnLFxuICAgICdjc3MnLFxuICAgICdodG0nLFxuICAgICdodG1sJyxcbiAgICAnbWQnLFxuICAgICdzY3NzJyxcbiAgICAndnVlJyxcbiAgICAneWFtbCcsXG4gICAgJ3ltbCcsXG4gIF0uc29ydCgpLFxuICAvLyBjZi4gaHR0cHM6Ly9iaW9tZWpzLmRldi9pbnRlcm5hbHMvbGFuZ3VhZ2Utc3VwcG9ydC9cbiAgYmlvbWU6IFtcbiAgICAnY2pzJyxcbiAgICAnbWpzJyxcbiAgICAnanMnLFxuICAgICdqc3gnLFxuICAgICdjdHMnLFxuICAgICdtdHMnLFxuICAgICd0cycsXG4gICAgJ3RzeCcsXG4gICAgJ2pzb24nLFxuICAgICdqc29uNScsXG4gICAgJ2pzb25jJyxcbiAgICAnaHRtJyxcbiAgICAnaHRtbCcsXG4gICAgJ3Z1ZScsXG4gICAgJ3N2ZWx0ZScsXG4gICAgJ2FzdHJvJyxcbiAgICAnY3NzJyxcbiAgICAneWFtbCcsXG4gICAgJ3ltbCcsXG4gICAgJ2dxbCcsXG4gIF0uc29ydCgpLFxufTtcbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgbmV3Q29udGVudCA9IGByb290ID0gdHJ1ZVxuXG5bKl1cbmNoYXJzZXQgPSB1dGYtOFxuZW5kX29mX2xpbmUgPSBsZlxuaW5zZXJ0X2ZpbmFsX25ld2xpbmUgPSB0cnVlXG50cmltX3RyYWlsaW5nX3doaXRlc3BhY2UgPSB0cnVlXG5cbiR7Z2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnMuY29kZVdpdGgySW5kZW50U2l6ZSl9XG5pbmRlbnRfc2l6ZSA9IDJcbmluZGVudF9zdHlsZSA9IHNwYWNlXG5cbiR7Z2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnMuY29kZVdpdGg0SW5kZW50U2l6ZSl9XG5pbmRlbnRfc2l6ZSA9IDRcbmluZGVudF9zdHlsZSA9IHNwYWNlXG5cbiR7Z2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnMubWFya2Rvd25MaWtlKX1cbm1heF9saW5lX2xlbmd0aCA9IG9mZlxudHJpbV90cmFpbGluZ193aGl0ZXNwYWNlID0gZmFsc2VcblxuW3tNYWtlZmlsZSwqLm1rfV1cbmluZGVudF9zdHlsZSA9IHRhYlxuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRWRpdG9yY29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlRWRpdG9yY29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmVkaXRvcmNvbmZpZycpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUV4dGVuc2lvbnMoZXh0ZW5zaW9uczogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gZXh0ZW5zaW9ucy5sZW5ndGggPiAxID8gYFsqLnske2V4dGVuc2lvbnMuam9pbignLCcpfX1dYCA6IGBbKi4ke2V4dGVuc2lvbnNbMF19XWA7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUVzbGludHJjKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlRXNsaW50cmMnLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gUmVtb3ZlIGRlcHJlY2F0ZWQgZmlsZXNcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmVzbGludHJjLmpzb24nKSwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lc2xpbnRpZ25vcmUnKSwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2VzbGludC5jb25maWcuanMnKSwgeyBmb3JjZTogdHJ1ZSB9KSk7XG5cbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2VzbGludC5jb25maWcubWpzJyk7XG4gICAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWNvbmZpZy5lc2xpbnRCYXNlKSByZXR1cm47XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgaWYgKCFvbGRDb250ZW50LmluY2x1ZGVzKCdleHBvcnQgeyBkZWZhdWx0IH0nKSkgcmV0dXJuO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cblxuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBgZXhwb3J0IHsgZGVmYXVsdCB9IGZyb20gJyR7Y29uZmlnLmVzbGludEJhc2V9JztgKSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgeWFtbCBmcm9tICdqcy15YW1sJztcbmltcG9ydCBjbG9uZURlZXAgZnJvbSAnbG9kYXNoLmNsb25lZGVlcCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgZGVmYXVsdENvbmZpZyA9IHtcbiAgaGF2ZV9mdW46IHRydWUsXG4gIGNvZGVfcmV2aWV3OiB7XG4gICAgZGlzYWJsZTogZmFsc2UsXG4gICAgY29tbWVudF9zZXZlcml0eV90aHJlc2hvbGQ6ICdNRURJVU0nLFxuICAgIG1heF9yZXZpZXdfY29tbWVudHM6IC0xLFxuICAgIHB1bGxfcmVxdWVzdF9vcGVuZWQ6IHtcbiAgICAgIGhlbHA6IGZhbHNlLFxuICAgICAgc3VtbWFyeTogdHJ1ZSxcbiAgICAgIGNvZGVfcmV2aWV3OiB0cnVlLFxuICAgIH0sXG4gIH0sXG4gIGlnbm9yZV9wYXR0ZXJuczogWycqKi9fX2dlbmVyYXRlZF9fJ10sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHZW1pbmlDb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHZW1pbmlDb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFjb25maWcuaXNSb290KSByZXR1cm47XG5cbiAgICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdlbWluaScpO1xuICAgIGNvbnN0IGNvbmZpZ0ZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdjb25maWcueW1sJyk7XG4gICAgY29uc3Qgc3R5bGVndWlkZUZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdzdHlsZWd1aWRlLm1kJyk7XG5cbiAgICBsZXQgbmV3Q29uZmlnOiBvYmplY3QgPSBjbG9uZURlZXAoZGVmYXVsdENvbmZpZyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShjb25maWdGaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG9sZENvbmZpZyA9IHlhbWwubG9hZChvbGRDb250ZW50KSBhcyBvYmplY3Q7XG4gICAgICBuZXdDb25maWcgPSBtZXJnZS5hbGwoW25ld0NvbmZpZywgb2xkQ29uZmlnLCBuZXdDb25maWddLCB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZyAtIGZpbGUgZG9lc24ndCBleGlzdCBvciBjYW4ndCBiZSBwYXJzZWRcbiAgICB9XG5cbiAgICBjb25zdCB5YW1sQ29udGVudCA9IHlhbWwuZHVtcChuZXdDb25maWcsIHtcbiAgICAgIGxpbmVXaWR0aDogLTEsXG4gICAgICBub0NvbXBhdE1vZGU6IHRydWUsXG4gICAgICBzdHlsZXM6IHtcbiAgICAgICAgJyEhbnVsbCc6ICdlbXB0eScsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgY29uc3Qgc3R5bGVndWlkZUNvbnRlbnQgPSAn5pel5pys6Kqe44Gn44Os44OT44Ol44O844GX44Gm44GP44Gg44GV44GE44CCJztcblxuICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGNvbmZpZ0ZpbGVQYXRoLCB5YW1sQ29udGVudCkpLFxuICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoc3R5bGVndWlkZUZpbGVQYXRoLCBzdHlsZWd1aWRlQ29udGVudCkpLFxuICAgIF0pO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbW92ZUdlbWluaVNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlR2VtaW5pU2V0dGluZ3MnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFjb25maWcuaXNSb290KSByZXR1cm47XG5cbiAgICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdlbWluaScpO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdzZXR0aW5ncy5qc29uJyk7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG4vLyBjZi4gaHR0cHM6Ly9idW4uc2gvZ3VpZGVzL2luc3RhbGwvZ2l0LWRpZmYtYnVuLWxvY2tmaWxlXG5jb25zdCBuZXdDb250ZW50ID0gYCogdGV4dD1hdXRvXG5cbioubG9ja2IgYmluYXJ5IGRpZmY9bG9ja2JcbioudmNwcm9qIHRleHQgZW9sPWNybGZcblxuJHtbLi4uZXh0ZW5zaW9ucy5jb2RlV2l0aDJJbmRlbnRTaXplLCAuLi5leHRlbnNpb25zLmNvZGVXaXRoNEluZGVudFNpemUsIC4uLmV4dGVuc2lvbnMubWFya2Rvd25MaWtlXVxuICAubWFwKChleHQpID0+IGAqLiR7ZXh0fSB0ZXh0IGVvbD1sZmApXG4gIC5qb2luKCdcXG4nKX1cblxuZGlzdC8qKiBsaW5ndWlzdC1nZW5lcmF0ZWQ9dHJ1ZVxuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlR2l0YXR0cmlidXRlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0YXR0cmlidXRlcycpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IG9zIGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuLi9vcHRpb25zLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGRlZmF1bHROYW1lcyA9IFsnd2luZG93cycsICdtYWNvcycsICdsaW51eCcsICdqZXRicmFpbnMnLCAndmlzdWFsc3R1ZGlvY29kZScsICdlbWFjcycsICd2aW0nLCAneWFybiddO1xuXG5jb25zdCBjb21tb25Db250ZW50ID0gYFxuIS5rZWVwXG4uYWlkZXIqXG4uZW52LnByb2R1Y3Rpb25cbi5pZGVhL0F1Z21lbnRXZWJ2aWV3U3RhdGVTdG9yZS54bWxcbi5pZGVhL2NvcGlsb3QvY2hhdFNlc3Npb25zL1xuLmRldmNvbnRhaW5lci9cbiovbW91bnQvKi5oYXNoXG5fX2dlbmVyYXRlZF9fL1xuZGlzdC9cbnRlbXAvXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHaXRpZ25vcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHaXRpZ25vcmUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aWdub3JlJyk7XG4gICAgY29uc3QgY29udGVudCA9IChhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoKSkgPz8gJyc7XG4gICAgbGV0IGhlYWRVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldEhlYWRVc2VyQ29udGVudChjb250ZW50KSArIGNvbW1vbkNvbnRlbnQ7XG4gICAgY29uc3QgdGFpbFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0VGFpbFVzZXJDb250ZW50KGNvbnRlbnQpO1xuXG4gICAgY29uc3QgbmFtZXMgPSBbLi4uZGVmYXVsdE5hbWVzXTtcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc0dlbWZpbGUpIHtcbiAgICAgIG5hbWVzLnB1c2goJ3J1YnknKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNHb01vZCkge1xuICAgICAgbmFtZXMucHVzaCgnZ28nKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgJHtwYXRoLmJhc2VuYW1lKGNvbmZpZy5kaXJQYXRoKX1cbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zUGFja2FnZUpzb24pIHtcbiAgICAgIG5hbWVzLnB1c2goJ25vZGUnKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNQb21YbWwpIHtcbiAgICAgIG5hbWVzLnB1c2goJ21hdmVuJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5pZGVhL2dvb2dsZS1qYXZhLWZvcm1hdC54bWxcbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zUHVic3BlY1lhbWwpIHtcbiAgICAgIG5hbWVzLnB1c2goJ2ZsdXR0ZXInLCAnQW5kcm9pZFN0dWRpbycsICdydWJ5Jyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5mbHV0dGVyLXBsdWdpbnMtZGVwZW5kZW5jaWVzXG5hbmRyb2lkL2tleS5wcm9wZXJ0aWVzXG5pb3MvLmJ1bmRsZVxuLmlkZWEvcnVuQ29uZmlndXJhdGlvbnMueG1sXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc1RlbXBsYXRlWWFtbCkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuYXdzLXNhbS9cbnBhY2thZ2VkLnlhbWxcbmA7XG4gICAgfVxuICAgIC8vIEJlY2F1c2UgLnZlbnYgc2hvdWxkIGJlIGlnbm9yZWQgb24gcm9vdCBkaXJlY3RvcnlcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc1BvZXRyeUxvY2spIHtcbiAgICAgIG5hbWVzLnB1c2goJ3B5dGhvbicpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAudmVudi9cbmA7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHopIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLmJsaXR6L1xuLmJsaXR6KipcbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLm5leHQpIHtcbiAgICAgIG5hbWVzLnB1c2goJ25leHRqcycpO1xuICAgIH1cbiAgICBpZiAocm9vdENvbmZpZy5kZXBlbmRpbmcuZmlyZWJhc2UgfHwgY29uZmlnLmRlcGVuZGluZy5maXJlYmFzZSkge1xuICAgICAgbmFtZXMucHVzaCgnZmlyZWJhc2UnKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHJpc21hKSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYCouc3FsaXRlMypcbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRUZXN0KSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYHRlc3QtcmVzdWx0cy9cbmA7XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSB8fCBjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgICBuYW1lcy5wdXNoKCdyZWFjdG5hdGl2ZScpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGBnb29nbGUtc2VydmljZXMuanNvblxuYW5kcm9pZC9hcHAvc3JjL21haW4vYXNzZXRzL1xuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuc3Rvcnlib29rKSB7XG4gICAgICBuYW1lcy5wdXNoKCdzdG9yeWJvb2tqcycpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5saXRlc3RyZWFtKSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYGdjcC1zYS1rZXkuanNvblxuYDtcbiAgICB9XG5cbiAgICBsZXQgZ2VuZXJhdGVkID0gJyc7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7XG4gICAgICBsZXQgY29udGVudCA9IChhd2FpdCByZWFkQ2FjaGUobmFtZSkpID8/ICcnO1xuICAgICAgaWYgKCFjb250ZW50KSB7XG4gICAgICAgIGNvbnN0IHVybCA9IGBodHRwczovL3d3dy50b3B0YWwuY29tL2RldmVsb3BlcnMvZ2l0aWdub3JlL2FwaS8ke25hbWV9YDtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwpO1xuICAgICAgICBjb25zdCByZXNwb25zZVRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgICAgIGlmICghcmVzcG9uc2Uub2sgfHwgcmVzcG9uc2VUZXh0LmluY2x1ZGVzKCdBdHRlbnRpb24gUmVxdWlyZWQhJykgfHwgcmVzcG9uc2VUZXh0LmluY2x1ZGVzKCc8dGl0bGU+JykpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggJHt1cmx9YCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRlbnQgPSByZXNwb25zZVRleHQudHJpbSgpO1xuICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gd3JpdGVDYWNoZShuYW1lLCBjb250ZW50KSk7XG4gICAgICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhgRmV0Y2hlZCAke3VybH1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGdlbmVyYXRlZCkgZ2VuZXJhdGVkICs9ICdcXG4nO1xuICAgICAgZ2VuZXJhdGVkICs9IGNvbnRlbnQgKyAnXFxuJztcbiAgICB9XG4gICAgaWYgKCEoYXdhaXQgaWdub3JlRmlsZVV0aWwuaXNCZXJyeVplcm9JbnN0YWxsRW5hYmxlZChmaWxlUGF0aCkpKSB7XG4gICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZSgnIS55YXJuL2NhY2hlJywgJyMgIS55YXJuL2NhY2hlJykucmVwbGFjZSgnIyAucG5wLionLCAnLnBucC4qJyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zUG9tWG1sIHx8IGNvbmZpZy5kb2VzQ29udGFpbnNQdWJzcGVjWWFtbCkge1xuICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL2FydGlmYWN0cyQvZ20sICcuaWRlYS9hcnRpZmFjdHMnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9jb21waWxlci54bWwkL2dtLCAnLmlkZWEvY29tcGlsZXIueG1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvamFyUmVwb3NpdG9yaWVzLnhtbCQvZ20sICcuaWRlYS9qYXJSZXBvc2l0b3JpZXMueG1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvbW9kdWxlcy54bWwkL2dtLCAnLmlkZWEvbW9kdWxlcy54bWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC8qLmltbCQvZ20sICcuaWRlYS8qLmltbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL21vZHVsZXMkL2dtLCAnLmlkZWEvbW9kdWxlcycpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAqLmltbCQvZ20sICcqLmltbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAqLmlwciQvZ20sICcqLmlwcicpO1xuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNQdWJzcGVjWWFtbCkge1xuICAgICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZUFsbCgvXi5pZGVhXFwvbW9kdWxlcy54bWwkL2dtLCAnIyAuaWRlYS9tb2R1bGVzLnhtbCcpO1xuICAgICAgfVxuICAgIH1cbiAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZUFsbCgvXi5pZGVhXFwvPyQvZ20sICcjIC5pZGVhJyk7XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlIHx8IGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUgfHwgY29uZmlnLmRvZXNDb250YWluc1B1YnNwZWNZYW1sKSB7XG4gICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZUFsbCgvXiguaWRlYVxcLy4rKSQvZ20sICckMVxcbmFuZHJvaWQvJDEnKTtcbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGVudCA9IGhlYWRVc2VyQ29udGVudCArICdcXG4nICsgZ2VuZXJhdGVkICsgdGFpbFVzZXJDb250ZW50O1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5jb25zdCBkaXJQYXRoID0gcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5jYWNoZScsICd3YmZ5JywgJ2dpdGlnbm9yZScpO1xuXG5hc3luYyBmdW5jdGlvbiB3cml0ZUNhY2hlKG5hbWU6IHN0cmluZywgY29udGVudDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKGRpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpLCBjb250ZW50KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZENhY2hlKG5hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdCA9IGF3YWl0IGZzLnByb21pc2VzLnN0YXQocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpKTtcbiAgICBpZiAoRGF0ZS5ub3coKSAtIHN0YXQubXRpbWVNcyA+IDYgKiA2MCAqIDYwICogMTAwMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpLCAndXRmOCcpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cbiIsImltcG9ydCB7IG9jdG9raXQgfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldExhdGVzdENvbW1pdEhhc2gob3JnYW5pemF0aW9uOiBzdHJpbmcsIHJlcG86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgeyBkYXRhOiBjb21taXRzIH0gPSBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ0dFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbWl0cycsIHtcbiAgICAgIG93bmVyOiBvcmdhbml6YXRpb24sXG4gICAgICByZXBvLFxuICAgICAgcGVyX3BhZ2U6IDEsXG4gICAgfSk7XG4gICAgaWYgKGNvbW1pdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGNvbW1pdHMgZm91bmQgZm9yICR7b3JnYW5pemF0aW9ufS8ke3JlcG99YCk7XG4gICAgfVxuICAgIHJldHVybiBjb21taXRzWzBdLnNoYTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBmZXRjaCBjb21taXRzIGZvciAke29yZ2FuaXphdGlvbn0vJHtyZXBvfTogJHtTdHJpbmcoZXJyb3IpfWApO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuZXhwb3J0IGNvbnN0IEVzbGludFV0aWwgPSB7XG4gIGdldExpbnRGaXhTdWZmaXgoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gY29uZmlnLmRvZXNDb250YWluc0pzeE9yVHN4ID8gJyAtLXJ1bGUgXCJ7IHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwczogMCB9XCInIDogJyc7XG4gIH0sXG59O1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24sIFNldFJlcXVpcmVkIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgZ2V0TGF0ZXN0Q29tbWl0SGFzaCB9IGZyb20gJy4uL2dpdGh1Yi9jb21taXQuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgRXNsaW50RXh0ZW5zaW9uQmFzZSwgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgRXNsaW50VXRpbCB9IGZyb20gJy4uL3V0aWxzL2VzbGludFV0aWwuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZ2l0SHViVXRpbCB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJy4uL3V0aWxzL2dsb2JVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgY29tYmluZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jIH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcbmltcG9ydCB7IEJMSVRaX1ZFUlNJT04sIE5FWFRfVkVSU0lPTiB9IGZyb20gJy4uL3V0aWxzL3ZlcnNpb25Db25zdGFudHMuanMnO1xuXG5jb25zdCBqc0NvbW1vbkRlcHMgPSBbXG4gICdlc2xpbnQnLFxuICAnZXNsaW50LWNvbmZpZy1mbGF0LWdpdGlnbm9yZScsXG4gICdlc2xpbnQtY29uZmlnLXByZXR0aWVyJyxcbiAgJ2VzbGludC1wbHVnaW4tc29ydC1jbGFzcy1tZW1iZXJzJyxcbiAgJ2VzbGludC1wbHVnaW4tc29ydC1kZXN0cnVjdHVyZS1rZXlzJyxcbiAgJ2VzbGludC1wbHVnaW4tdW5pY29ybicsXG4gICdlc2xpbnQtcGx1Z2luLXVudXNlZC1pbXBvcnRzJyxcbiAgJ2dsb2JhbHMnLFxuXTtcblxuY29uc3QgdHNDb21tb25EZXBzID0gWy4uLmpzQ29tbW9uRGVwcywgJ3R5cGVzY3JpcHQtZXNsaW50JywgJ2VzbGludC1pbXBvcnQtcmVzb2x2ZXItdHlwZXNjcmlwdCddO1xuXG5jb25zdCByZWFjdENvbW1vbkRlcHMgPSBbJ2VzbGludC1wbHVnaW4tcmVhY3QnLCAnZXNsaW50LXBsdWdpbi1yZWFjdC1ob29rcycsICdlc2xpbnQtcGx1Z2luLXJlYWN0LWNvbXBpbGVyJ107XG5cbmNvbnN0IGVzbGludERlcHM6IFJlY29yZDxFc2xpbnRFeHRlbnNpb25CYXNlLCBzdHJpbmdbXT4gPSB7XG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcyc6IFsnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMnLCAnZXNsaW50LXBsdWdpbi1pbXBvcnQteCcsIC4uLmpzQ29tbW9uRGVwc10sXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcy1yZWFjdCc6IFtcbiAgICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMtcmVhY3QnLFxuICAgICdlc2xpbnQtcGx1Z2luLWltcG9ydC14JyxcbiAgICAuLi5qc0NvbW1vbkRlcHMsXG4gICAgLi4ucmVhY3RDb21tb25EZXBzLFxuICBdLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMnOiBbJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzJywgJ2VzbGludC1wbHVnaW4taW1wb3J0LXgnLCAuLi50c0NvbW1vbkRlcHNdLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMtcmVhY3QnOiBbXG4gICAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzLXJlYWN0JyxcbiAgICAnZXNsaW50LXBsdWdpbi1pbXBvcnQteCcsXG4gICAgLi4udHNDb21tb25EZXBzLFxuICAgIC4uLnJlYWN0Q29tbW9uRGVwcyxcbiAgXSxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLW5leHQnOiBbXG4gICAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLW5leHQnLFxuICAgICdlc2xpbnQtcGx1Z2luLWltcG9ydCcsXG4gICAgJ2VzbGludC1jb25maWctbmV4dCcsXG4gICAgLi4udHNDb21tb25EZXBzLFxuICAgIC4uLnJlYWN0Q29tbW9uRGVwcyxcbiAgXSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVBhY2thZ2VKc29uKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHNraXBBZGRpbmdEZXBzOiBib29sZWFuXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVBhY2thZ2VKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IGNvcmUoY29uZmlnLCByb290Q29uZmlnLCBza2lwQWRkaW5nRGVwcyk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZywgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZywgc2tpcEFkZGluZ0RlcHM6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgY29uc3QganNvblRleHQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgY29uc3QganNvbk9iaiA9IEpTT04ucGFyc2UoanNvblRleHQpIGFzIFBhY2thZ2VKc29uO1xuICBqc29uT2JqLnNjcmlwdHMgPSBqc29uT2JqLnNjcmlwdHMgfHwge307XG4gIGpzb25PYmouZGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXBlbmRlbmNpZXMgfHwge307XG4gIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXZEZXBlbmRlbmNpZXMgfHwge307XG4gIGpzb25PYmoucGVlckRlcGVuZGVuY2llcyA9IGpzb25PYmoucGVlckRlcGVuZGVuY2llcyB8fCB7fTtcbiAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSBjb25maWcuaXNCdW4gPyAnYnVuJyA6ICd5YXJuJztcblxuICBhd2FpdCByZW1vdmVEZXByZWNhdGVkU3R1ZmYoXG4gICAgcm9vdENvbmZpZyxcbiAgICBqc29uT2JqIGFzIFNldFJlcXVpcmVkPFBhY2thZ2VKc29uLCAnc2NyaXB0cycgfCAnZGVwZW5kZW5jaWVzJyB8ICdkZXZEZXBlbmRlbmNpZXMnPlxuICApO1xuXG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGpzb25PYmouc2NyaXB0cyBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSkge1xuICAgIC8vIEZyZXNoIHJlcG8gc3RpbGwgcmVxdWlyZXMgJ3lhcm4gaW5zdGFsbCdcbiAgICBpZiAoIXZhbHVlLmluY2x1ZGVzKCdnaXQgY2xvbmUnKSkge1xuICAgICAganNvbk9iai5zY3JpcHRzW2tleV0gPSB2YWx1ZS5yZXBsYWNlKC95YXJuXFxzKiYmXFxzKi8sICcnKS5yZXBsYWNlKC95YXJuXFxzKmluc3RhbGxcXHMqJiZcXHMqLywgJycpO1xuICAgIH1cbiAgfVxuXG4gIGpzb25PYmouc2NyaXB0cyA9IG1lcmdlKGpzb25PYmouc2NyaXB0cywgZ2VuZXJhdGVTY3JpcHRzKGNvbmZpZykpO1xuXG4gIGlmICgnY2hlY2stZm9yLWFpJyBpbiBqc29uT2JqLnNjcmlwdHMpIHtcbiAgICBpZiAoJ2dlbi1jb2RlJyBpbiBqc29uT2JqLnNjcmlwdHMpIHtcbiAgICAgIGpzb25PYmouc2NyaXB0c1snY2hlY2stZm9yLWFpJ10gPSBgJHtwYWNrYWdlTWFuYWdlcn0gZ2VuLWNvZGUgPiAvZGV2L251bGwgJiYgJHtqc29uT2JqLnNjcmlwdHNbJ2NoZWNrLWZvci1haSddfWA7XG4gICAgfVxuICAgIGpzb25PYmouc2NyaXB0c1snY2hlY2stZm9yLWFpJ10gPSBgJHtwYWNrYWdlTWFuYWdlcn0gaW5zdGFsbCA+IC9kZXYvbnVsbCAmJiAke2pzb25PYmouc2NyaXB0c1snY2hlY2stZm9yLWFpJ119YDtcbiAgfVxuXG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLnByZXR0aWZ5O1xuICB9IGVsc2Uge1xuICAgIGpzb25PYmouc2NyaXB0cy5wcmV0dGlmeSArPSBhd2FpdCBnZW5lcmF0ZVByZXR0aWVyU3VmZml4KGNvbmZpZy5kaXJQYXRoKTtcbiAgfVxuICAvLyBEZWFsIHdpdGggYnJlYWtpbmcgY2hhbmdlcyBpbiB5YXJuIGJlcnJ5IDQuMC4wLXJjLjQ5XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGpzb25PYmouc2NyaXB0cykpIHtcbiAgICBpZiAoIXZhbHVlPy5pbmNsdWRlcygneWFybiB3b3Jrc3BhY2VzIGZvcmVhY2gnKSkgY29udGludWU7XG4gICAgaWYgKFxuICAgICAgdmFsdWUuaW5jbHVkZXMoJy0tYWxsJykgfHxcbiAgICAgIHZhbHVlLmluY2x1ZGVzKCctLXJlY3Vyc2l2ZScpIHx8XG4gICAgICB2YWx1ZS5pbmNsdWRlcygnLS1zaW5jZScpIHx8XG4gICAgICB2YWx1ZS5pbmNsdWRlcygnLS13b3JrdHJlZScpXG4gICAgKVxuICAgICAgY29udGludWU7XG4gICAganNvbk9iai5zY3JpcHRzW2tleV0gPSB2YWx1ZS5yZXBsYWNlKCd5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCcsICd5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCcpO1xuICB9XG5cbiAgbGV0IGRlcGVuZGVuY2llczogc3RyaW5nW10gPSBbXTtcbiAgbGV0IGRldkRlcGVuZGVuY2llcyA9IFsncHJldHRpZXInLCAnc29ydC1wYWNrYWdlLWpzb24nXTtcbiAgY29uc3QgcG9ldHJ5RGV2RGVwZW5kZW5jaWVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGlmIChcbiAgICAhZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocm9vdENvbmZpZy5kaXJQYXRoLCAnLnByZXR0aWVycmMuanNvbicpKSAmJlxuICAgICFmcy5leGlzdHNTeW5jKHBhdGguam9pbihjb25maWcuZGlyUGF0aCwgJy5wcmV0dGllcnJjLmpzb24nKSlcbiAgKSB7XG4gICAganNvbk9iai5wcmV0dGllciA9ICdAd2lsbGJvb3N0ZXIvcHJldHRpZXItY29uZmlnJztcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgncHJldHRpZXItcGx1Z2luLWphdmEnLCAnQHdpbGxib29zdGVyL3ByZXR0aWVyLWNvbmZpZycpO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snbGludC1zdGFnZWQnXTtcbiAgfSBlbHNlIHtcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnbGludC1zdGFnZWQnKTtcbiAgfVxuXG4gIGlmIChjb25maWcuaXNSb290KSB7XG4gICAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydodXNreSddO1xuICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydwaW5zdCddO1xuICAgICAganNvbk9iai5zY3JpcHRzLnByZXBhcmUgPSAnbGVmdGhvb2sgaW5zdGFsbCB8fCB0cnVlJztcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdsZWZ0aG9vaycpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUbyBpbnN0YWxsIHRoZSBsYXRlc3QgaHVza3lcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdodXNreScpO1xuICAgICAgLy8gJ3x8IHRydWUnIGF2b2lkcyBlcnJvcnMgd2hlbiBodXNreSBpcyBub3QgaW5zdGFsbGVkLlxuICAgICAganNvbk9iai5zY3JpcHRzLnByZXBhcmUgPSAnaHVza3kgfHwgdHJ1ZSc7IC8vIGZvciBub24teWFybiBwYWNrYWdlIG1hbmFnZXJzLlxuICAgICAganNvbk9iai5zY3JpcHRzLnBvc3RpbnN0YWxsID0gJ2h1c2t5IHx8IHRydWUnOyAvLyBmb3IgeWFybi5cbiAgICAgIGlmIChjb25maWcuaXNQdWJsaWNSZXBvIHx8IGNvbmZpZy5pc1JlZmVycmVkQnlPdGhlclJlcG8pIHtcbiAgICAgICAgLy8gVG8gaW5zdGFsbCB0aGUgbGF0ZXN0IHBpbnN0XG4gICAgICAgIC8vIGh0dHBzOi8vdHlwaWNvZGUuZ2l0aHViLmlvL2h1c2t5LyMvP2lkPWluc3RhbGwtMVxuICAgICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgncGluc3QnKTtcbiAgICAgICAganNvbk9iai5zY3JpcHRzLnByZXBhY2sgPSAncGluc3QgLS1kaXNhYmxlJztcbiAgICAgICAganNvbk9iai5zY3JpcHRzLnBvc3RwYWNrID0gJ3BpbnN0IC0tZW5hYmxlJztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5zZW1hbnRpY1JlbGVhc2UpIHtcbiAgICAgIGlmIChcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydzZW1hbnRpYy1yZWxlYXNlJ10gJiZcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydtdWx0aS1zZW1hbnRpYy1yZWxlYXNlJ10gJiZcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAcWl3aS9tdWx0aS1zZW1hbnRpYy1yZWxlYXNlJ11cbiAgICAgICkge1xuICAgICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnc2VtYW50aWMtcmVsZWFzZScpO1xuICAgICAgfVxuICAgICAganNvbk9iai52ZXJzaW9uID0gJzAuMC4wLXNlbWFudGljYWxseS1yZWxlYXNlZCc7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpIHtcbiAgICAgIC8vIFNpbmNlIGFydGlsbGVyeSByZXF1aXJlcyBhIHNwZWNpZmljIHZlcnNpb24gb2YgQHBsYXl3cmlnaHQvdGVzdFxuICAgICAgY29uc3QgaGFzQXJ0aWxsZXJ5ID0ganNvbk9iai5kZXBlbmRlbmNpZXNbJ2FydGlsbGVyeSddIHx8IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydhcnRpbGxlcnknXTtcbiAgICAgIC8vIFNpbmNlIGxsbS10b29sYm94IHJlcXVpcmVzIEBwbGF5d3JpZ2h0L3Rlc3QgaW4gZGVwZW5kZW5jaWVzXG4gICAgICBpZiAoIWhhc0FydGlsbGVyeSAmJiAhanNvbk9iai5kZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXSkge1xuICAgICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnQHBsYXl3cmlnaHQvdGVzdCcpO1xuICAgICAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXTtcbiAgICAgIH1cbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llc1sncGxheXdyaWdodCddO1xuICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydwbGF5d3JpZ2h0J107XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNTdWJQYWNrYWdlSnNvbnMpIHtcbiAgICAgIC8vIFdlIGRvbid0IGFsbG93IG5vbi1hcnJheSB3b3Jrc3BhY2VzIGluIG1vbm9yZXBvLlxuICAgICAganNvbk9iai53b3Jrc3BhY2VzID0gQXJyYXkuaXNBcnJheShqc29uT2JqLndvcmtzcGFjZXMpXG4gICAgICAgID8gbWVyZ2UuYWxsKFtqc29uT2JqLndvcmtzcGFjZXMsIFsncGFja2FnZXMvKiddXSwge1xuICAgICAgICAgICAgYXJyYXlNZXJnZTogY29tYmluZU1lcmdlLFxuICAgICAgICAgIH0pXG4gICAgICAgIDogWydwYWNrYWdlcy8qJ107XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGpzb25PYmoud29ya3NwYWNlcykpIHtcbiAgICAgIGpzb25PYmoud29ya3NwYWNlcyA9IGpzb25PYmoud29ya3NwYWNlcy5maWx0ZXIoXG4gICAgICAgICh3b3Jrc3BhY2UpID0+XG4gICAgICAgICAgZmcuZ2xvYlN5bmMod29ya3NwYWNlLCB7XG4gICAgICAgICAgICBkb3Q6IHRydWUsXG4gICAgICAgICAgICBjd2Q6IGNvbmZpZy5kaXJQYXRoLFxuICAgICAgICAgICAgaWdub3JlOiBnbG9iSWdub3JlLFxuICAgICAgICAgIH0pLmxlbmd0aCA+IDBcbiAgICAgICk7XG4gICAgICBpZiAoanNvbk9iai53b3Jrc3BhY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBkZWxldGUganNvbk9iai53b3Jrc3BhY2VzO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcuZGVwZW5kaW5nLndiIHx8IGNvbmZpZy5pc0J1bikge1xuICAgIGlmIChqc29uT2JqLmRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3diJ10pIHtcbiAgICAgIGRlcGVuZGVuY2llcy5wdXNoKCdAd2lsbGJvb3N0ZXIvd2InKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0B3aWxsYm9vc3Rlci93YicpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhqc29uT2JqLnNjcmlwdHMgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPikpIHtcbiAgICAgIGpzb25PYmouc2NyaXB0c1trZXldID0gdmFsdWUucmVwbGFjZSgvd2JcXHMrZGIvLCAnd2IgcHJpc21hJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKFxuICAgIGNvbmZpZy5kb2VzQ29udGFpbnNKYXZhU2NyaXB0IHx8XG4gICAgY29uZmlnLmRvZXNDb250YWluc0phdmFTY3JpcHRJblBhY2thZ2VzIHx8XG4gICAgY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHQgfHxcbiAgICBjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdEluUGFja2FnZXNcbiAgKSB7XG4gICAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0BiaW9tZWpzL2Jpb21lJywgJ0B3aWxsYm9vc3Rlci9iaW9tZS1jb25maWcnKTtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snZXNsaW50J107XG4gICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ21pY3JvbWF0Y2gnXTtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1sndHlwZXNjcmlwdC1lc2xpbnQnXTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ2VzbGludCcsICdtaWNyb21hdGNoJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCd0eXBlc2NyaXB0Jyk7XG4gICAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0B0eXBlcy9idW4nKTtcbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlnLmVzbGludEJhc2UpIHtcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCguLi5lc2xpbnREZXBzW2NvbmZpZy5lc2xpbnRCYXNlXSk7XG4gIH1cblxuICBpZiAoY29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzKSB7XG4gICAgZGVwZW5kZW5jaWVzID0gZGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhZGVwLmluY2x1ZGVzKCdAd2lsbGJvb3N0ZXIvJykpO1xuICAgIGRldkRlcGVuZGVuY2llcyA9IGRldkRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWRlcC5pbmNsdWRlcygnQHdpbGxib29zdGVyLycpKTtcbiAgfVxuXG4gIGlmICghanNvbk9iai5uYW1lKSB7XG4gICAganNvbk9iai5uYW1lID0gcGF0aC5iYXNlbmFtZShjb25maWcuZGlyUGF0aCk7XG4gIH1cblxuICBpZiAoY29uZmlnLmRvZXNDb250YWluc1N1YlBhY2thZ2VKc29ucykge1xuICAgIGpzb25PYmoucHJpdmF0ZSA9IHRydWU7XG4gIH1cbiAgaWYgKCFqc29uT2JqLmxpY2Vuc2UpIHtcbiAgICBqc29uT2JqLmxpY2Vuc2UgPSAnVU5MSUNFTlNFRCc7XG4gIH1cbiAgaWYgKCFqc29uT2JqLnByaXZhdGUgJiYganNvbk9iai5saWNlbnNlICE9PSAnVU5MSUNFTlNFRCcgJiYgcm9vdENvbmZpZy5pc1B1YmxpY1JlcG8pIHtcbiAgICBqc29uT2JqLnB1Ymxpc2hDb25maWcgPz89IHt9O1xuICAgIGpzb25PYmoucHVibGlzaENvbmZpZy5hY2Nlc3MgPz89ICdwdWJsaWMnO1xuICB9XG4gIGNvbnN0IFtvd25lcl0gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUoY29uZmlnLnJlcG9zaXRvcnkgPz8gJycpO1xuICBpZiAob3duZXIgPT09ICdXaWxsQm9vc3RlcicgfHwgb3duZXIgPT09ICdXaWxsQm9vc3RlckxhYicpIHtcbiAgICBqc29uT2JqLmF1dGhvciA9ICdXaWxsQm9vc3RlciBJbmMuJztcbiAgfVxuICBpZiAoIWNvbmZpZy5pc1Jvb3QgJiYganNvbk9iai5wcml2YXRlICYmICFqc29uT2JqLm1haW4pIHtcbiAgICAvLyBNYWtlIFZTQ29kZSBwb3NzaWJsZSB0byByZWZhY3RvciBjb2RlIGFjcm9zcyBzdWJwYWNrYWdlcy5cbiAgICBqc29uT2JqLm1haW4gPSAnLi9zcmMnO1xuICB9XG5cbiAgLy8gQmVjYXVzZSBgXCJyZXNvbHV0aW9uc1wiOiB7IFwibnBtL2NoYWxrXCI6IFwiXjQuMS4yXCIgfSxgIGNhdXNlcyBcIkludmFsaWQgbnBtIHRva2VuXCJcbiAgZGVsZXRlIGpzb25PYmoucmVzb2x1dGlvbnM/LlsnbnBtL2NoYWxrJ107XG5cbiAgaWYgKCFjb25maWcuZG9lc0NvbnRhaW5zU3ViUGFja2FnZUpzb25zKSB7XG4gICAgaWYgKCFjb25maWcuaXNCdW4pIHtcbiAgICAgIGlmICghY29uZmlnLmRvZXNDb250YWluc0phdmFTY3JpcHQgJiYgIWNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0KSB7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMubGludDtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snbGludC1maXgnXTtcbiAgICAgICAganNvbk9iai5zY3JpcHRzLmNsZWFudXAgPSBqc29uT2JqLnNjcmlwdHMuY2xlYW51cD8ucmVwbGFjZSgnICYmIHlhcm4gbGludC1maXgnLCAnJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J10gKz0gRXNsaW50VXRpbC5nZXRMaW50Rml4U3VmZml4KGNvbmZpZyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNQdWJzcGVjWWFtbCkge1xuICAgICAganNvbk9iai5zY3JpcHRzLmxpbnQgPSAnZmx1dHRlciBhbmFseXplJztcbiAgICAgIGpzb25PYmouc2NyaXB0c1snbGludC1maXgnXSA9ICd5YXJuIGxpbnQnO1xuICAgICAgY29uc3QgZGlycyA9IFsnbGliJywgJ3Rlc3QnLCAndGVzdF9kcml2ZXInXS5maWx0ZXIoKGRpcikgPT4gZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGRpcikpKTtcbiAgICAgIGlmIChkaXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAganNvbk9iai5zY3JpcHRzWydmb3JtYXQtY29kZSddID0gYGZsdXR0ZXIgZm9ybWF0ICQoZmluZCAke2RpcnMuam9pbihcbiAgICAgICAgICAnICdcbiAgICAgICAgKX0gLW5hbWUgZ2VuZXJhdGVkIC1wcnVuZSAtbyAtbmFtZSAnKi5mcmVlemVkLmRhcnQnIC1wcnVuZSAtbyAtbmFtZSAnKi5nLmRhcnQnIC1wcnVuZSAtbyAtbmFtZSAnKi5kYXJ0JyAtcHJpbnQpYDtcbiAgICAgICAganNvbk9iai5zY3JpcHRzLmZvcm1hdCArPSBgICYmIHlhcm4gZm9ybWF0LWNvZGVgO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zUG9ldHJ5TG9jaykge1xuICAgICAgaWYgKGpzb25PYmouc2NyaXB0cy5wb3N0aW5zdGFsbCA9PT0gJ3BvZXRyeSBpbnN0YWxsJykge1xuICAgICAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLnBvc3RpbnN0YWxsO1xuICAgICAgfVxuICAgICAgY29uc3QgcHl0aG9uRmlsZXMgPSBhd2FpdCBmZy5nbG9iKCcqKi8qLnB5Jywge1xuICAgICAgICBjd2Q6IGNvbmZpZy5kaXJQYXRoLFxuICAgICAgICBkb3Q6IHRydWUsXG4gICAgICAgIGlnbm9yZTogZ2xvYklnbm9yZSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZGlyTmFtZVNldCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgZm9yIChjb25zdCBweXRob25GaWxlIG9mIHB5dGhvbkZpbGVzKSB7XG4gICAgICAgIGNvbnN0IFtmaXJzdCwgc2Vjb25kXSA9IHB5dGhvbkZpbGUuc3BsaXQoL1svXFxcXF0vKTtcbiAgICAgICAgaWYgKHNlY29uZCkge1xuICAgICAgICAgIGRpck5hbWVTZXQuYWRkKGZpcnN0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGRpck5hbWVTZXQuc2l6ZSA+IDApIHtcbiAgICAgICAgY29uc3QgZGlyTmFtZXNTdHIgPSBbLi4uZGlyTmFtZVNldF0uam9pbignICcpO1xuICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2Zvcm1hdC1jb2RlJ10gPVxuICAgICAgICAgIGBwb2V0cnkgcnVuIGlzb3J0IC0tcHJvZmlsZSBibGFjayAke2Rpck5hbWVzU3RyfSAmJiBwb2V0cnkgcnVuIGJsYWNrICR7ZGlyTmFtZXNTdHJ9YDtcbiAgICAgICAgaWYgKGpzb25PYmouc2NyaXB0cy5saW50KSB7XG4gICAgICAgICAganNvbk9iai5zY3JpcHRzLmxpbnQgPSBgcG9ldHJ5IHJ1biBmbGFrZTggJHtkaXJOYW1lc1N0cn0gJiYgJHtqc29uT2JqLnNjcmlwdHMubGludH1gO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGpzb25PYmouc2NyaXB0cy5saW50ID0gYHBvZXRyeSBydW4gZmxha2U4ICR7ZGlyTmFtZXNTdHJ9YDtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J10gPSAneWFybiBsaW50JztcbiAgICAgICAgfVxuICAgICAgICBqc29uT2JqLnNjcmlwdHMuZm9ybWF0ICs9IGAgJiYgeWFybiBmb3JtYXQtY29kZWA7XG4gICAgICAgIHBvZXRyeURldkRlcGVuZGVuY2llcy5wdXNoKCdibGFjaycsICdpc29ydCcsICdmbGFrZTgnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLnJlcG9zaXRvcnkpIHtcbiAgICAgIGpzb25PYmoucmVwb3NpdG9yeSA9IGNvbmZpZy5yZXBvc2l0b3J5O1xuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6KSB7XG4gICAgZGVwZW5kZW5jaWVzLnB1c2goXG4gICAgICBgYmxpdHpAJHtCTElUWl9WRVJTSU9OfWAsXG4gICAgICBgQGJsaXR6anMvYXV0aEAke0JMSVRaX1ZFUlNJT059YCxcbiAgICAgIGBAYmxpdHpqcy9uZXh0QCR7QkxJVFpfVkVSU0lPTn1gLFxuICAgICAgYEBibGl0empzL3JwY0Ake0JMSVRaX1ZFUlNJT059YCxcbiAgICAgIGBuZXh0QCR7TkVYVF9WRVJTSU9OfWBcbiAgICApO1xuICAgIC8vIFByZWZlciBlc2xpbnQtY29uZmlnLW5leHQncyBkZXBlbmRlbmNpZXNcbiAgICBkZXZEZXBlbmRlbmNpZXMgPSBkZXZEZXBlbmRlbmNpZXMuZmlsdGVyKChkKSA9PiBkICE9PSAnZXNsaW50LXBsdWdpbi1yZWFjdCcgJiYgZCAhPT0gJ2VzbGludC1wbHVnaW4tcmVhY3QtaG9va3MnKTtcbiAgICBpZiAoIWpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXT8uc3RhcnRzV2l0aCgnYmxpdHogY29kZWdlbicpKSB7XG4gICAgICBqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10gPSAnYmxpdHogY29kZWdlbic7XG4gICAgfSBlbHNlIGlmICghanNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddLmluY2x1ZGVzKCdibGl0eiBwcmlzbWEgZ2VuZXJhdGUnKSkge1xuICAgICAganNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddID0ganNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddLnJlcGxhY2UoXG4gICAgICAgICdibGl0eiBjb2RlZ2VuJyxcbiAgICAgICAgJ2JsaXR6IGNvZGVnZW4gJiYgYmxpdHogcHJpc21hIGdlbmVyYXRlJ1xuICAgICAgKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEgJiYgIWpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXT8uc3RhcnRzV2l0aCgncHJpc21hIGdlbmVyYXRlJykpIHtcbiAgICBqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10gPSAncHJpc21hIGdlbmVyYXRlJztcbiAgfVxuXG4gIGlmICghanNvbk9iai5kZXBlbmRlbmNpZXM/LnByZXR0aWVyKSB7XG4gICAgLy8gQmVjYXVzZSBAdHlwZXMvcHJldHRpZXIgYmxvY2tzIHByZXR0aWVyIGV4ZWN1dGlvbi5cbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B0eXBlcy9wcmV0dGllciddO1xuICB9XG5cbiAgaWYgKE9iamVjdC5rZXlzKGpzb25PYmouZGVwZW5kZW5jaWVzKS5sZW5ndGggPT09IDApIHtcbiAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXM7XG4gIH1cbiAgaWYgKE9iamVjdC5rZXlzKGpzb25PYmouZGV2RGVwZW5kZW5jaWVzKS5sZW5ndGggPT09IDApIHtcbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXM7XG4gIH1cbiAgaWYgKE9iamVjdC5rZXlzKGpzb25PYmoucGVlckRlcGVuZGVuY2llcykubGVuZ3RoID09PSAwKSB7XG4gICAgZGVsZXRlIGpzb25PYmoucGVlckRlcGVuZGVuY2llcztcbiAgfVxuXG4gIGF3YWl0IHVwZGF0ZVByaXZhdGVQYWNrYWdlcyhqc29uT2JqKTtcblxuICBpZiAoY29uZmlnLmlzQnVuKSBkZWxldGUganNvbk9iai5wYWNrYWdlTWFuYWdlcjtcbiAgbGV0IG5ld0pzb25UZXh0ID0gSlNPTi5zdHJpbmdpZnkoanNvbk9iaik7XG4gIG5ld0pzb25UZXh0ID0gYXdhaXQgZml4U2NyaXB0TmFtZXMoanNvbk9iai5zY3JpcHRzLCBuZXdKc29uVGV4dCwgY29uZmlnKTtcbiAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGZpbGVQYXRoLCBuZXdKc29uVGV4dCk7XG5cbiAgaWYgKCFza2lwQWRkaW5nRGVwcykge1xuICAgIC8vIFdlIGNhbm5vdCBhZGQgZGVwZW5kZW5jaWVzIHdoaWNoIGFyZSBhbHJlYWR5IGluY2x1ZGVkIGluIGRldkRlcGVuZGVuY2llcy5cbiAgICBkZXBlbmRlbmNpZXMgPSBkZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFqc29uT2JqLmRldkRlcGVuZGVuY2llcz8uW2RlcF0pO1xuICAgIGlmIChkZXBlbmRlbmNpZXMubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgICAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsncmVtb3ZlJywgLi4ubmV3IFNldChkZXBlbmRlbmNpZXMpXSwgY29uZmlnLmRpclBhdGgpO1xuICAgICAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnYWRkJywgJy0tZXhhY3QnLCAuLi5uZXcgU2V0KGRlcGVuZGVuY2llcyldLCBjb25maWcuZGlyUGF0aCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnYWRkJywgLi4ubmV3IFNldChkZXBlbmRlbmNpZXMpXSwgY29uZmlnLmRpclBhdGgpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBXZSBjYW5ub3QgYWRkIGRldkRlcGVuZGVuY2llcyB3aGljaCBhcmUgYWxyZWFkeSBpbmNsdWRlZCBpbiBkZXBlbmRlbmNpZXMuXG4gICAgZGV2RGVwZW5kZW5jaWVzID0gZGV2RGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhanNvbk9iai5kZXBlbmRlbmNpZXM/LltkZXBdKTtcbiAgICBpZiAoZGV2RGVwZW5kZW5jaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ3JlbW92ZScsIC4uLm5ldyBTZXQoZGV2RGVwZW5kZW5jaWVzKV0sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICAgICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ2FkZCcsICctRCcsICctLWV4YWN0JywgLi4ubmV3IFNldChkZXZEZXBlbmRlbmNpZXMpXSwgY29uZmlnLmRpclBhdGgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ2FkZCcsICctRCcsIC4uLm5ldyBTZXQoZGV2RGVwZW5kZW5jaWVzKV0sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHBvZXRyeURldkRlcGVuZGVuY2llcy5sZW5ndGggPiAwKSB7XG4gICAgICBzcGF3blN5bmMoJ3BvZXRyeScsIFsnYWRkJywgJy0tZ3JvdXAnLCAnZGV2JywgLi4ubmV3IFNldChwb2V0cnlEZXZEZXBlbmRlbmNpZXMpXSwgY29uZmlnLmRpclBhdGgpO1xuICAgIH1cbiAgfVxufVxuXG4vLyBUT0RPOiByZW1vdmUgdGhlIGZvbGxvd2luZyBtaWdyYXRpb24gY29kZSBpbiBmdXR1cmVcbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZURlcHJlY2F0ZWRTdHVmZihcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogU2V0UmVxdWlyZWQ8UGFja2FnZUpzb24sICdzY3JpcHRzJyB8ICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcyc+XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKGpzb25PYmouYXV0aG9yID09PSAnV2lsbEJvb3N0ZXIgTExDJykge1xuICAgIGpzb25PYmouYXV0aG9yID0gJ1dpbGxCb29zdGVyIEluYy4nO1xuICB9XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3NvcnQtcGFja2FnZS1qc29uJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3NvcnQtYWxsLXBhY2thZ2UtanNvbiddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWyd0eXBlY2hlY2svd2FybiddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWyd0eXBlY2hlY2s6Z2VuLWNvZGUnXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sndHlwZWNoZWNrOmNvZGVnZW4nXTtcbiAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzWyd0c2xpYiddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL2VzbGludC1jb25maWctcmVhY3QnXTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvcmVub3ZhdGUtY29uZmlnJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3RzY29uZmlnJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snZXNsaW50LWltcG9ydC1yZXNvbHZlci1ub2RlJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snZXNsaW50LXBsdWdpbi1wcmV0dGllciddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ2xlcm5hJ107XG4gIC8vIFRvIGluc3RhbGwgdGhlIGxhdGVzdCBwaW5zdFxuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ3BpbnN0J107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2ZsdXR0ZXItZm9ybWF0J107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2Zvcm1hdC1mbHV0dGVyJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3B5dGhvbi1mb3JtYXQnXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snZm9ybWF0LXB5dGhvbiddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydwcmV0dGllciddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydjaGVjay1hbGwnXTtcbiAgaWYgKCFyb290Q29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzKSB7XG4gICAgZm9yIChjb25zdCBkZXBzIG9mIE9iamVjdC52YWx1ZXMoZXNsaW50RGVwcykpIHtcbiAgICAgIGZvciAoY29uc3QgZGVwIG9mIGRlcHMpIHtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW2RlcF07XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybSgnbGVybmEuanNvbicsIHsgZm9yY2U6IHRydWUgfSkpO1xuXG4gIC8vIE1pZ3JhdGUgZnJvbSBFU0xpbnQgbGVnYWN5IGNvbmZpZ3MgdG8gZmxhdCBjb25maWdzLFxuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B0eXBlc2NyaXB0LWVzbGludC9lc2xpbnQtcGx1Z2luJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHR5cGVzY3JpcHQtZXNsaW50L3BhcnNlciddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ2VzbGludC1wbHVnaW4taW1wb3J0J107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVNjcmlwdHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICBjb25zdCBzY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgJ2NoZWNrLWFsbC1mb3ItYWknOiAnYnVuIHJ1biBjaGVjay1mb3ItYWkgJiYgYnVuIHJ1biB0ZXN0IC0tc2lsZW50JyxcbiAgICAgICdjaGVjay1mb3ItYWknOiAnYnVuIHJ1biBjbGVhbnVwICYmIGJ1biBydW4gdHlwZWNoZWNrJyxcbiAgICAgIGNsZWFudXA6ICdidW4gLS1idW4gd2IgbGludCAtLWZpeCAtLWZvcm1hdCcsXG4gICAgICBmb3JtYXQ6IGBidW4gLS1idW4gd2IgbGludCAtLWZvcm1hdGAsXG4gICAgICBsaW50OiBgYnVuIC0tYnVuIHdiIGxpbnRgLFxuICAgICAgJ2xpbnQtZml4JzogJ2J1biAtLWJ1biB3YiBsaW50IC0tZml4JyxcbiAgICAgIHRlc3Q6ICdidW4gd2IgdGVzdCcsXG4gICAgICB0eXBlY2hlY2s6ICdidW4gLS1idW4gd2IgdHlwZWNoZWNrJyxcbiAgICB9O1xuICAgIGlmICghY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHQgJiYgIWNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgICAgZGVsZXRlIHNjcmlwdHMudHlwZWNoZWNrO1xuICAgIH1cbiAgICByZXR1cm4gc2NyaXB0cztcbiAgfSBlbHNlIHtcbiAgICBsZXQgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICdjaGVjay1hbGwtZm9yLWFpJzogJ3lhcm4gY2hlY2stZm9yLWFpICYmIHlhcm4gdGVzdCAtLXNpbGVudCcsXG4gICAgICAnY2hlY2stZm9yLWFpJzogJ3lhcm4gZm9ybWF0ID4gL2Rldi9udWxsIDI+IC9kZXYvbnVsbCB8fCB0cnVlICYmIHlhcm4gbGludC1maXggLS1xdWlldCAmJiB5YXJuIHR5cGVjaGVjaycsXG4gICAgICBjbGVhbnVwOiAneWFybiBmb3JtYXQgJiYgeWFybiBsaW50LWZpeCcsXG4gICAgICBmb3JtYXQ6IGBzb3J0LXBhY2thZ2UtanNvbiAmJiB5YXJuIHByZXR0aWZ5YCxcbiAgICAgIGxpbnQ6IGBlc2xpbnQgLS1jb2xvcmAsXG4gICAgICAnbGludC1maXgnOiAneWFybiBsaW50IC0tZml4JyxcbiAgICAgIHByZXR0aWZ5OiBgcHJldHRpZXIgLS1jYWNoZSAtLWNvbG9yIC0td3JpdGUgXCIqKi97LiovLH0qLnske2V4dGVuc2lvbnMucHJldHRpZXIuam9pbignLCcpfX1cIiBcIiEqKi90ZXN0ey0sL31maXh0dXJlcy8qKlwiYCxcbiAgICAgIHR5cGVjaGVjazogJ3RzYyAtLW5vRW1pdCAtLVByZXR0eScsXG4gICAgfTtcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc1N1YlBhY2thZ2VKc29ucykge1xuICAgICAgY29uc3Qgb2xkVGVzdCA9IHNjcmlwdHMudGVzdDtcbiAgICAgIHNjcmlwdHMgPSBtZXJnZShcbiAgICAgICAgeyAuLi5zY3JpcHRzIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBmb3JtYXQ6IGBzb3J0LXBhY2thZ2UtanNvbiAmJiB5YXJuIHByZXR0aWZ5ICYmIHlhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsIC0tcGFyYWxsZWwgLS12ZXJib3NlIHJ1biBmb3JtYXRgLFxuICAgICAgICAgIGxpbnQ6IGB5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCAtLXBhcmFsbGVsIC0tdmVyYm9zZSBydW4gbGludGAsXG4gICAgICAgICAgJ2xpbnQtZml4JzogJ3lhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsIC0tcGFyYWxsZWwgLS12ZXJib3NlIHJ1biBsaW50LWZpeCcsXG4gICAgICAgICAgcHJldHRpZnk6IGBwcmV0dGllciAtLWNhY2hlIC0tY29sb3IgLS13cml0ZSBcIioqL3suKi8sfSoueyR7ZXh0ZW5zaW9ucy5wcmV0dGllci5qb2luKFxuICAgICAgICAgICAgJywnXG4gICAgICAgICAgKX19XCIgXCIhKiovcGFja2FnZXMvKipcIiBcIiEqKi90ZXN0ey0sL31maXh0dXJlcy8qKlwiYCxcbiAgICAgICAgICAvLyBDST0xIHByZXZlbnRzIHZpdGVzdCBmcm9tIGVuYWJsaW5nIHdhdGNoLlxuICAgICAgICAgIC8vIEZPUkNFX0NPTE9SPTMgbWFrZSB3YiBlbmFibGUgY29sb3Igb3V0cHV0LlxuICAgICAgICAgIHRlc3Q6ICdDST0xIEZPUkNFX0NPTE9SPTMgeWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwgLS12ZXJib3NlIHJ1biB0ZXN0JyxcbiAgICAgICAgICB0eXBlY2hlY2s6ICd5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCAtLXBhcmFsbGVsIC0tdmVyYm9zZSBydW4gdHlwZWNoZWNrJyxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIGlmIChvbGRUZXN0Py5pbmNsdWRlcygnd2IgdGVzdCcpKSB7XG4gICAgICAgIHNjcmlwdHMudGVzdCA9IG9sZFRlc3Q7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjb25maWcuZGVwZW5kaW5nLnB5cmlnaHQpIHtcbiAgICAgIHNjcmlwdHMudHlwZWNoZWNrID0gc2NyaXB0cy50eXBlY2hlY2sgPyBgJHtzY3JpcHRzLnR5cGVjaGVja30gJiYgYCA6ICcnO1xuICAgICAgc2NyaXB0cy50eXBlY2hlY2sgKz0gJ3B5cmlnaHQnO1xuICAgIH1cblxuICAgIGlmICghY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHQgJiYgIWNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgICAgZGVsZXRlIHNjcmlwdHMudHlwZWNoZWNrO1xuICAgIH0gZWxzZSBpZiAoY29uZmlnLmRlcGVuZGluZy53Yikge1xuICAgICAgc2NyaXB0cy50eXBlY2hlY2sgPSAnd2IgdHlwZWNoZWNrJztcbiAgICB9XG4gICAgcmV0dXJuIHNjcmlwdHM7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQcmV0dGllclN1ZmZpeChkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLnByZXR0aWVyaWdub3JlJyk7XG4gIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICBjb25zdCBpbmRleCA9IGV4aXN0aW5nQ29udGVudC5pbmRleE9mKGlnbm9yZUZpbGVVdGlsLnNlcGFyYXRvclByZWZpeCk7XG4gIGlmIChpbmRleCA9PT0gLTEpIHJldHVybiAnJztcblxuICBjb25zdCBvcmlnaW5hbENvbnRlbnQgPSBleGlzdGluZ0NvbnRlbnQuc2xpY2UoMCwgaW5kZXgpO1xuICBjb25zdCBsaW5lcyA9IG9yaWdpbmFsQ29udGVudFxuICAgIC5zcGxpdCgnXFxuJylcbiAgICAubWFwKChsaW5lKSA9PiB7XG4gICAgICBjb25zdCBuZXdMaW5lID0gbGluZS50cmltKCk7XG4gICAgICByZXR1cm4gbmV3TGluZS5lbmRzV2l0aCgnLycpID8gbmV3TGluZS5zbGljZSgwLCAtMSkgOiBuZXdMaW5lO1xuICAgIH0pXG4gICAgLmZpbHRlcigobCkgPT4gbCAmJiAhbC5zdGFydHNXaXRoKCcjJykgJiYgIWwuaW5jbHVkZXMoJy8nKSk7XG5cbiAgcmV0dXJuIGAke2xpbmVzLm1hcCgobGluZSkgPT4gYCBcIiEqKi8ke2xpbmV9LyoqXCJgKS5qb2luKCcnKX0gfHwgdHJ1ZWA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZpeFNjcmlwdE5hbWVzKFxuICBzY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzLFxuICBuZXdKc29uVGV4dDogc3RyaW5nLFxuICBjb25maWc6IFBhY2thZ2VDb25maWdcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IG9sZEFuZE5ld1NjcmlwdE5hbWVzOiBbc3RyaW5nLCBzdHJpbmddW10gPSBbXTtcbiAgZm9yIChjb25zdCBba2V5XSBvZiBPYmplY3Qua2V5cyhzY3JpcHRzKSkge1xuICAgIGlmIChrZXlbMF0gIT09ICc6JyAmJiBrZXkuaW5jbHVkZXMoJzonKSkge1xuICAgICAgb2xkQW5kTmV3U2NyaXB0TmFtZXMucHVzaChba2V5LCBrZXkucmVwbGFjZUFsbCgnOicsICctJyldKTtcbiAgICB9XG4gIH1cbiAgaWYgKG9sZEFuZE5ld1NjcmlwdE5hbWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG5ld0pzb25UZXh0O1xuXG4gIGZvciAoY29uc3QgW29sZE5hbWUsIG5ld05hbWVdIG9mIG9sZEFuZE5ld1NjcmlwdE5hbWVzKSB7XG4gICAgbmV3SnNvblRleHQgPSBuZXdKc29uVGV4dC5yZXBsYWNlQWxsKG9sZE5hbWUsIG5ld05hbWUpO1xuICB9XG4gIGNvbnN0IGZpbGVzID0gYXdhaXQgZmcuZ2xvYihbJyoqLyoue21kLGNqcyxtanMsanMsanN4LGN0cyxtdHMsdHMsdHN4fScsICcqKi9Eb2NrZXJmaWxlJ10sIHtcbiAgICBjd2Q6IGNvbmZpZy5kaXJQYXRoLFxuICAgIGRvdDogdHJ1ZSxcbiAgICBpZ25vcmU6IGdsb2JJZ25vcmUsXG4gIH0pO1xuICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oY29uZmlnLmRpclBhdGgsIGZpbGUpO1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgbGV0IG5ld0NvbnRlbnQgPSBvbGRDb250ZW50O1xuICAgICAgZm9yIChjb25zdCBbb2xkTmFtZSwgbmV3TmFtZV0gb2Ygb2xkQW5kTmV3U2NyaXB0TmFtZXMpIHtcbiAgICAgICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZUFsbChvbGROYW1lLCBuZXdOYW1lKTtcbiAgICAgIH1cbiAgICAgIGlmIChuZXdDb250ZW50ICE9PSBvbGRDb250ZW50KSB7XG4gICAgICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICByZXR1cm4gbmV3SnNvblRleHQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVByaXZhdGVQYWNrYWdlcyhqc29uT2JqOiBQYWNrYWdlSnNvbik6IFByb21pc2U8dm9pZD4ge1xuICBqc29uT2JqLmRlcGVuZGVuY2llcyA9IGpzb25PYmouZGVwZW5kZW5jaWVzIHx8IHt9O1xuICBqc29uT2JqLmRldkRlcGVuZGVuY2llcyA9IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzIHx8IHt9O1xuICBjb25zdCBwYWNrYWdlTmFtZXMgPSBuZXcgU2V0KFsuLi5PYmplY3Qua2V5cyhqc29uT2JqLmRlcGVuZGVuY2llcyksIC4uLk9iamVjdC5rZXlzKGpzb25PYmouZGV2RGVwZW5kZW5jaWVzKV0pO1xuICBpZiAocGFja2FnZU5hbWVzLmhhcygnQHdpbGxib29zdGVyL2F1dGgnKSAmJiAhaXNXb3Jrc3BhY2VQYWNrYWdlKGpzb25PYmosICdAd2lsbGJvb3N0ZXIvYXV0aCcpKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvYXV0aCddO1xuICAgIGNvbnN0IGNvbW1pdEhhc2ggPSBhd2FpdCBnZXRMYXRlc3RDb21taXRIYXNoKCdXaWxsQm9vc3RlckxhYicsICdhdXRoJyk7XG4gICAganNvbk9iai5kZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9hdXRoJ10gPSBgZ2l0QGdpdGh1Yi5jb206V2lsbEJvb3N0ZXJMYWIvYXV0aC5naXQjJHtjb21taXRIYXNofWA7XG4gIH1cbiAgaWYgKHBhY2thZ2VOYW1lcy5oYXMoJ0BkaXNjb3JkLWJvdC9zaGFyZWQnKSAmJiAhaXNXb3Jrc3BhY2VQYWNrYWdlKGpzb25PYmosICdAZGlzY29yZC1ib3Qvc2hhcmVkJykpIHtcbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0BkaXNjb3JkLWJvdC9zaGFyZWQnXTtcbiAgICBjb25zdCBjb21taXRIYXNoID0gYXdhaXQgZ2V0TGF0ZXN0Q29tbWl0SGFzaCgnV2lsbEJvb3N0ZXJMYWInLCAnZGlzY29yZC1ib3QnKTtcbiAgICBqc29uT2JqLmRlcGVuZGVuY2llc1snQGRpc2NvcmQtYm90L3NoYXJlZCddID0gYGdpdEBnaXRodWIuY29tOldpbGxCb29zdGVyTGFiL2Rpc2NvcmQtYm90LmdpdCMke2NvbW1pdEhhc2h9YDtcbiAgfVxuXG4gIGlmIChwYWNrYWdlTmFtZXMuaGFzKCdAd2lsbGJvb3N0ZXIvY29kZS1hbmFseXplcicpICYmICFpc1dvcmtzcGFjZVBhY2thZ2UoanNvbk9iaiwgJ0B3aWxsYm9vc3Rlci9jb2RlLWFuYWx5emVyJykpIHtcbiAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9jb2RlLWFuYWx5emVyJ107XG4gICAgY29uc3QgY29tbWl0SGFzaCA9IGF3YWl0IGdldExhdGVzdENvbW1pdEhhc2goJ1dpbGxCb29zdGVyTGFiJywgJ2NvZGUtYW5hbHl6ZXInKTtcbiAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL2NvZGUtYW5hbHl6ZXInXSA9XG4gICAgICBgZ2l0QGdpdGh1Yi5jb206V2lsbEJvb3N0ZXJMYWIvY29kZS1hbmFseXplci5naXQjd29ya3NwYWNlPUBjb2RlLWFuYWx5emVyL2NsaWVudCZjb21taXQ9JHtjb21taXRIYXNofWA7XG4gIH1cbiAgaWYgKHBhY2thZ2VOYW1lcy5oYXMoJ0B3aWxsYm9vc3Rlci9qdWRnZScpICYmICFpc1dvcmtzcGFjZVBhY2thZ2UoanNvbk9iaiwgJ0B3aWxsYm9vc3Rlci9qdWRnZScpKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvanVkZ2UnXTtcbiAgICBjb25zdCBjb21taXRIYXNoID0gYXdhaXQgZ2V0TGF0ZXN0Q29tbWl0SGFzaCgnV2lsbEJvb3N0ZXJMYWInLCAnanVkZ2UnKTtcbiAgICBqc29uT2JqLmRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL2p1ZGdlJ10gPSBgZ2l0QGdpdGh1Yi5jb206V2lsbEJvb3N0ZXJMYWIvanVkZ2UuZ2l0IyR7Y29tbWl0SGFzaH1gO1xuICB9XG4gIGlmIChwYWNrYWdlTmFtZXMuaGFzKCdAd2lsbGJvb3N0ZXIvbGxtLXByb3h5JykgJiYgIWlzV29ya3NwYWNlUGFja2FnZShqc29uT2JqLCAnQHdpbGxib29zdGVyL2xsbS1wcm94eScpKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvbGxtLXByb3h5J107XG4gICAgY29uc3QgY29tbWl0SGFzaCA9IGF3YWl0IGdldExhdGVzdENvbW1pdEhhc2goJ1dpbGxCb29zdGVyTGFiJywgJ2xsbS1wcm94eScpO1xuICAgIGpzb25PYmouZGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvbGxtLXByb3h5J10gPSBgZ2l0QGdpdGh1Yi5jb206V2lsbEJvb3N0ZXJMYWIvbGxtLXByb3h5LmdpdCMke2NvbW1pdEhhc2h9YDtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc1dvcmtzcGFjZVBhY2thZ2UoanNvbk9iajogUGFja2FnZUpzb24sIHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIChqc29uT2JqLmRldkRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSB8fCBqc29uT2JqLmRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSB8fCAnJykuaW5jbHVkZXMoJ3dvcmtzcGFjZScpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jIH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcblxuaW1wb3J0IHsgZ2VuZXJhdGVTY3JpcHRzIH0gZnJvbSAnLi9wYWNrYWdlSnNvbi5qcyc7XG5cbmNvbnN0IHNjcmlwdHMgPSB7XG4gIHByZUNvbW1pdDogJ25vZGUgbm9kZV9tb2R1bGVzLy5iaW4vbGludC1zdGFnZWQnLFxuICBwcmVQdXNoOiBgeWFybiB0eXBlY2hlY2tgLFxuICBwcmVQdXNoRm9yTGFiOiBgXG5pZiBbICQoZ2l0IGJyYW5jaCAtLXNob3ctY3VycmVudCkgPSBcIm1haW5cIiBdOyB0aGVuXG4gIGVjaG8gXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIlxuICBlY2hvIFwiKioqIERvbid0IHB1c2ggbWFpbiBicmFuY2ggZGlyZWN0bHkuIFVzZSBQUiEgKioqXCJcbiAgZWNobyBcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiXG4gIGV4aXQgMVxuZmlcblxueWFybiB0eXBlY2hlY2tcbmAudHJpbSgpLFxuICBwcmVQdXNoRm9yTGFiRXhjZXB0QWRtaW46IGBcbmlmIFsgJChnaXQgYnJhbmNoIC0tc2hvdy1jdXJyZW50KSA9IFwibWFpblwiIF0gJiYgWyAkKGdpdCBjb25maWcgdXNlci5lbWFpbCkgIT0gXCJleGthenV1QGdtYWlsLmNvbVwiIF07IHRoZW5cbiAgZWNobyBcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiXG4gIGVjaG8gXCIqKiogRG9uJ3QgcHVzaCBtYWluIGJyYW5jaCBkaXJlY3RseS4gVXNlIFBSISAqKipcIlxuICBlY2hvIFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCJcbiAgZXhpdCAxXG5maVxuXG55YXJuIHR5cGVjaGVja1xuYC50cmltKCksXG4gIHBvc3RNZXJnZTogYFxuY2hhbmdlZF9maWxlcz1cIiQoZ2l0IGRpZmYtdHJlZSAtciAtLW5hbWUtb25seSAtLW5vLWNvbW1pdC1pZCBPUklHX0hFQUQgSEVBRClcIlxuXG5ydW5faWZfY2hhbmdlZCgpIHtcbiAgaWYgZWNobyBcIiRjaGFuZ2VkX2ZpbGVzXCIgfCBncmVwIC0tcXVpZXQgLUUgXCIkMVwiOyB0aGVuXG4gICAgZXZhbCBcIiQyXCJcbiAgZmlcbn1cbmAudHJpbSgpLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlSHVza3lyY1VwZGF0aW5nUGFja2FnZUpzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVIdXNreXJjVXBkYXRpbmdQYWNrYWdlSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBjb3JlKGNvbmZpZyk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgY29uc3QganNvblRleHQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShwYWNrYWdlSnNvblBhdGgsICd1dGY4Jyk7XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShqc29uVGV4dCkgYXMgUGFja2FnZUpzb247XG4gIHBhY2thZ2VKc29uLnNjcmlwdHMgfHw9IHt9O1xuICBkZWxldGUgcGFja2FnZUpzb24uc2NyaXB0c1sncG9zdGluc3RhbGwnXTtcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnNjcmlwdHNbJ3Bvc3RwdWJsaXNoJ107XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5zY3JpcHRzWydwcmVwYXJlJ107XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5zY3JpcHRzWydwcmVwdWJsaXNoT25seSddO1xuICBkZWxldGUgcGFja2FnZUpzb24uc2NyaXB0c1sncHJlcGFjayddO1xuICBkZWxldGUgcGFja2FnZUpzb24uc2NyaXB0c1sncG9zdHBhY2snXTtcblxuICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmh1c2t5Jyk7XG4gIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICBmcy5wcm9taXNlcy53cml0ZUZpbGUocGFja2FnZUpzb25QYXRoLCBKU09OLnN0cmluZ2lmeShwYWNrYWdlSnNvbiwgdW5kZWZpbmVkLCAyKSksXG4gICAgZnMucHJvbWlzZXMucm0oZGlyUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pLFxuICBdKTtcbiAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgIHNwYXduU3luYygnZ2l0JywgWydjb25maWcnLCAnLS11bnNldCcsICdjb3JlLmhvb2tzUGF0aCddLCBjb25maWcuZGlyUGF0aCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgc3Bhd25TeW5jKCd5YXJuJywgWydkbHgnLCAnaHVza3ktaW5pdCcsICctLXlhcm4yJ10sIGNvbmZpZy5kaXJQYXRoKTtcblxuICBjb25zdCBwcmVDb21taXRGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncHJlLWNvbW1pdCcpO1xuXG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuaHVza3lyYy5qc29uJyksIHsgZm9yY2U6IHRydWUgfSkpO1xuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMud3JpdGVGaWxlKHByZUNvbW1pdEZpbGVQYXRoLCBzY3JpcHRzLnByZUNvbW1pdCArICdcXG4nKSk7XG5cbiAgY29uc3QgeyB0eXBlY2hlY2sgfSA9IGdlbmVyYXRlU2NyaXB0cyhjb25maWcpO1xuICBpZiAodHlwZWNoZWNrKSB7XG4gICAgbGV0IHByZVB1c2ggPSBjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyTGFiLycpXG4gICAgICA/IGNvbmZpZy5yZXBvc2l0b3J5Py50b0xvY2FsZUxvd2VyQ2FzZSgpLmluY2x1ZGVzKCdleGVyY29kZScpXG4gICAgICAgID8gc2NyaXB0cy5wcmVQdXNoRm9yTGFiXG4gICAgICAgIDogc2NyaXB0cy5wcmVQdXNoRm9yTGFiRXhjZXB0QWRtaW5cbiAgICAgIDogc2NyaXB0cy5wcmVQdXNoO1xuICAgIHByZVB1c2ggPSBwcmVQdXNoLnJlcGxhY2UoXG4gICAgICAneWFybiB0eXBlY2hlY2snLFxuICAgICAgdHlwZWNoZWNrXG4gICAgICAgIC5yZXBsYWNlKCd0c2MgJywgJ25vZGUgbm9kZV9tb2R1bGVzLy5iaW4vdHNjICcpXG4gICAgICAgIC5yZXBsYWNlKCd3YiAnLCAnbm9kZSBub2RlX21vZHVsZXMvLmJpbi93YiAnKVxuICAgICAgICAvLyBweXJpZ2h0IGhhcyBubyBhcmd1bWVudHNcbiAgICAgICAgLnJlcGxhY2UoJ3B5cmlnaHQnLCAnbm9kZSBub2RlX21vZHVsZXMvLmJpbi9weXJpZ2h0JylcbiAgICApO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncHJlLXB1c2gnKSwgcHJlUHVzaCArICdcXG4nLCB7XG4gICAgICAgIG1vZGU6IDBvNzU1LFxuICAgICAgfSlcbiAgICApO1xuICB9XG4gIGNvbnN0IHBvc3RNZXJnZUNvbW1hbmQgPSBgJHtzY3JpcHRzLnBvc3RNZXJnZX1cXG5cXG4ke2dlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMoY29uZmlnKS5qb2luKCdcXG4nKX1cXG5gO1xuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwb3N0LW1lcmdlJyksIHBvc3RNZXJnZUNvbW1hbmQsIHtcbiAgICAgIG1vZGU6IDBvNzU1LFxuICAgIH0pXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVBvc3RNZXJnZUNvbW1hbmRzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgcG9zdE1lcmdlQ29tbWFuZHM6IHN0cmluZ1tdID0gW107XG4gIGlmIChjb25maWcudmVyc2lvbnNUZXh0KSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCJcXC4uKy12ZXJzaW9uXCIgXCJhd2sgJ3twcmludCBcXCQxfScgLnRvb2wtdmVyc2lvbnMgfCB4YXJncyAtSXt9IGFzZGYgcGx1Z2luIGFkZCB7fVwiYCxcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCJcXC4uKy12ZXJzaW9uXCIgXCJhc2RmIHBsdWdpbiB1cGRhdGUgLS1hbGxcImBcbiAgICApO1xuICB9XG4gIC8vIFB5dGhvbuOBjOOBquOBhOOBqOOCpOODs+OCueODiOODvOODq+OBp+OBjeOBquOBhOWHpueQhuezu+OBjOWtmOWcqOOBmeOCi+OBn+OCgeOAgeW8t+WItueahOOBq+acgOWIneOBq+OCpOODs+OCueODiOODvOODq+OBmeOCi+OAglxuICBpZiAoY29uZmlnLnZlcnNpb25zVGV4dD8uaW5jbHVkZXMoJ3B5dGhvbiAnKSkge1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIlxcLi4rLXZlcnNpb25cIiBcImFzZGYgaW5zdGFsbCBweXRob25cImApO1xuICB9XG4gIGlmIChjb25maWcudmVyc2lvbnNUZXh0KSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiXFwuListdmVyc2lvblwiIFwiYXNkZiBpbnN0YWxsXCJgKTtcbiAgfVxuICBjb25zdCBpbnN0YWxsQ29tbWFuZCA9IGNvbmZpZy5pc0J1biA/ICdidW4gaW5zdGFsbCcgOiAneWFybic7XG4gIGNvbnN0IHJtTmV4dERpcmVjdG9yeSA9IGNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHwgY29uZmlnLmRlcGVuZGluZy5uZXh0ID8gJyAmJiBybSAtUmYgLm5leHQnIDogJyc7XG4gIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goYHJ1bl9pZl9jaGFuZ2VkIFwicGFja2FnZVxcXFwuanNvblwiIFwiJHtpbnN0YWxsQ29tbWFuZH0ke3JtTmV4dERpcmVjdG9yeX1cImApO1xuICBpZiAoY29uZmlnLmRvZXNDb250YWluc1BvZXRyeUxvY2spIHtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCJwb2V0cnlcXC5sb2NrXCIgXCJwb2V0cnkgaW5zdGFsbFwiYCk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHopIHtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIi4qXFwucHJpc21hXCIgXCJub2RlIG5vZGVfbW9kdWxlcy8uYmluL2JsaXR6IHByaXNtYSBtaWdyYXRlIGRlcGxveVwiYCxcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIuKlxcLnByaXNtYVwiIFwibm9kZSBub2RlX21vZHVsZXMvLmJpbi9ibGl0eiBwcmlzbWEgZ2VuZXJhdGVcImAsXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiLipcXC5wcmlzbWFcIiBcIm5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vYmxpdHogY29kZWdlblwiYFxuICAgICk7XG4gIH0gZWxzZSBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEpIHtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIi4qXFwucHJpc21hXCIgXCJub2RlIG5vZGVfbW9kdWxlcy8uYmluL2RvdGVudiAtYyBkZXZlbG9wbWVudCAtLSBub2RlIG5vZGVfbW9kdWxlcy8uYmluL3ByaXNtYSBtaWdyYXRlIGRlcGxveVwiYCxcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIuKlxcLnByaXNtYVwiIFwibm9kZSBub2RlX21vZHVsZXMvLmJpbi9kb3RlbnYgLWMgZGV2ZWxvcG1lbnQgLS0gbm9kZSBub2RlX21vZHVsZXMvLmJpbi9wcmlzbWEgZ2VuZXJhdGVcImBcbiAgICApO1xuICB9XG4gIHJldHVybiBwb3N0TWVyZ2VDb21tYW5kcztcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZnVuY3Rpb24gY3JlYXRlVGFza09wdGlvbnMocnVubmVyOiBzdHJpbmcsIGFyZ3M6IHN0cmluZywgbmFtZTogc3RyaW5nLCBleHRlbnNpb246IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgICAgIDxUYXNrT3B0aW9ucyBpc0VuYWJsZWQ9XCJ0cnVlXCI+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJhcmd1bWVudHNcIiB2YWx1ZT1cIiR7YXJnc30gJEZpbGVQYXRoUmVsYXRpdmVUb1Byb2plY3RSb290JFwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJjaGVja1N5bnRheEVycm9yc1wiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiZGVzY3JpcHRpb25cIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiZXhpdENvZGVCZWhhdmlvclwiIHZhbHVlPVwiRVJST1JcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiZmlsZUV4dGVuc2lvblwiIHZhbHVlPVwiJHtleHRlbnNpb259XCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImltbWVkaWF0ZVN5bmNcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cIm5hbWVcIiB2YWx1ZT1cIiR7bmFtZX0gKC4ke2V4dGVuc2lvbn0pXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cIm91dHB1dFwiIHZhbHVlPVwiJEZpbGVQYXRoUmVsYXRpdmVUb1Byb2plY3RSb290JFwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJvdXRwdXRGaWx0ZXJzXCI+XG4gICAgICAgIDxhcnJheSAvPlxuICAgICAgPC9vcHRpb24+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJvdXRwdXRGcm9tU3Rkb3V0XCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJwcm9ncmFtXCIgdmFsdWU9XCIke3J1bm5lcn1cIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwicnVuT25FeHRlcm5hbENoYW5nZXNcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cInNjb3BlTmFtZVwiIHZhbHVlPVwiUHJvamVjdCBGaWxlc1wiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJ0cmFja09ubHlSb290XCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJ3b3JraW5nRGlyXCIgdmFsdWU9XCIkUHJvamVjdEZpbGVEaXIkXCIgLz5cbiAgICAgIDxlbnZzIC8+XG4gICAgPC9UYXNrT3B0aW9ucz5cbmA7XG59XG5cbmNvbnN0IHByZXR0aWVyQ29udGVudCA9IGA8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cbjxwcm9qZWN0IHZlcnNpb249XCI0XCI+XG4gIDxjb21wb25lbnQgbmFtZT1cIlByb2plY3RUYXNrc09wdGlvbnNcIj5cbiR7ZXh0ZW5zaW9ucy5wcmV0dGllci5tYXAoKGV4dCkgPT4gY3JlYXRlVGFza09wdGlvbnMoJ25vZGUnLCAnbm9kZV9tb2R1bGVzLy5iaW4vcHJldHRpZXIgLS1jYWNoZSAtLXdyaXRlJywgJ1ByZXR0aWVyJywgZXh0KSkuam9pbignJyl9XG4gIDwvY29tcG9uZW50PlxuPC9wcm9qZWN0PlxuYDtcblxuY29uc3QgYmlvbWVDb250ZW50ID0gYDw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuPHByb2plY3QgdmVyc2lvbj1cIjRcIj5cbiAgPGNvbXBvbmVudCBuYW1lPVwiUHJvamVjdFRhc2tzT3B0aW9uc1wiPlxuJHtleHRlbnNpb25zLnByZXR0aWVyLm1hcCgoZXh0KSA9PiBjcmVhdGVUYXNrT3B0aW9ucygnYnVuJywgJy0tYnVuIG5vZGVfbW9kdWxlcy8uYmluL2Jpb21lIGNoZWNrIC0tZml4IC0tbm8tZXJyb3JzLW9uLXVubWF0Y2hlZCAtLXNraXAtcGFyc2UtZXJyb3JzJywgJ0Jpb21lJywgZXh0KSkuam9pbignJyl9XG4gIDwvY29tcG9uZW50PlxuPC9wcm9qZWN0PlxuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlSWRlYVNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlSWRlYVNldHRpbmdzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuaWRlYScpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGRpclBhdGgpKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnd2F0Y2hlclRhc2tzLnhtbCcpO1xuICAgICAgYXdhaXQgKGNvbmZpZy5kb2VzQ29udGFpbnNKYXZhU2NyaXB0IHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5zSmF2YVNjcmlwdEluUGFja2FnZXMgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0IHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdEluUGFja2FnZXMgfHxcbiAgICAgIChjb25maWcuZG9lc0NvbnRhaW5zUGFja2FnZUpzb24gJiZcbiAgICAgICAgIWNvbmZpZy5kb2VzQ29udGFpbnNQdWJzcGVjWWFtbCAmJlxuICAgICAgICAhY29uZmlnLmRvZXNDb250YWluc0dlbWZpbGUgJiZcbiAgICAgICAgIWNvbmZpZy5kb2VzQ29udGFpbnNHb01vZCAmJlxuICAgICAgICAhY29uZmlnLmRvZXNDb250YWluc1BvbVhtbClcbiAgICAgICAgPyBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgY29uZmlnLmlzQnVuID8gYmlvbWVDb250ZW50IDogcHJldHRpZXJDb250ZW50KSlcbiAgICAgICAgOiBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSkpKTtcbiAgICB9XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHlhbWwgZnJvbSAnanMteWFtbCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5pbXBvcnQgeyBnZW5lcmF0ZVBvc3RNZXJnZUNvbW1hbmRzIH0gZnJvbSAnLi9odXNreXJjLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlU2NyaXB0cyB9IGZyb20gJy4vcGFja2FnZUpzb24uanMnO1xuXG5jb25zdCBuZXdTZXR0aW5ncyA9IHtcbiAgJ3Bvc3QtbWVyZ2UnOiB7XG4gICAgc2NyaXB0czoge1xuICAgICAgJ3ByZXBhcmUuc2gnOiB7XG4gICAgICAgIHJ1bm5lcjogJ2Jhc2gnLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAncHJlLWNvbW1pdCc6IHtcbiAgICBjb21tYW5kczoge1xuICAgICAgY2xlYW51cDoge1xuICAgICAgICBnbG9iOiAnKi57Y2pzLGNzcyxjdHMsaHRtLGh0bWwsanMsanNvbixqc29uNSxqc29uYyxqc3gsbWQsbWpzLG10cyxzY3NzLHRzLHRzeCx2dWUseWFtbCx5bWx9JyxcbiAgICAgICAgcnVuOiAnYnVuIC0tYnVuIHdiIGxpbnQgLS1maXggLS1mb3JtYXQge3N0YWdlZF9maWxlc30gJiYgZ2l0IGFkZCB7c3RhZ2VkX2ZpbGVzfScsXG4gICAgICB9LFxuICAgICAgJ2NoZWNrLW1pZ3JhdGlvbnMnOiB7XG4gICAgICAgIGdsb2I6ICcqKi9taWdyYXRpb24uc3FsJyxcbiAgICAgICAgcnVuOiBgXG5pZiBncmVwIC1xICdXYXJuaW5nczonIHtzdGFnZWRfZmlsZXN9OyB0aGVuXG4gIGVjaG8gXCJNaWdyYXRpb24gU1FMIGZpbGVzICh7c3RhZ2VkX2ZpbGVzfSkgY29udGFpbiB3YXJuaW5ncyEgUGxlYXNlIHNvbHZlIHRoZSB3YXJuaW5ncyBhbmQgY29tbWl0IGFnYWluLlwiXG4gIGV4aXQgMVxuZmlcbmAudHJpbSgpLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAncHJlLXB1c2gnOiB7XG4gICAgc2NyaXB0czoge1xuICAgICAgJ2NoZWNrLnNoJzoge1xuICAgICAgICBydW5uZXI6ICdiYXNoJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbn07XG5cbmNvbnN0IHNjcmlwdHMgPSB7XG4gIHByZVB1c2g6IGBidW4gLS1idW4gbm9kZV9tb2R1bGVzLy5iaW4vd2IgdHlwZWNoZWNrYCxcbiAgcHJlUHVzaEZvckxhYjogYFxuIyEvYmluL2Jhc2hcblxuaWYgWyAkKGdpdCBicmFuY2ggLS1zaG93LWN1cnJlbnQpID0gXCJtYWluXCIgXSAmJiBbICQoZ2l0IGNvbmZpZyB1c2VyLmVtYWlsKSAhPSBcImV4a2F6dXVAZ21haWwuY29tXCIgXTsgdGhlblxuICBlY2hvIFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCJcbiAgZWNobyBcIioqKiBEb24ndCBwdXNoIG1haW4gYnJhbmNoIGRpcmVjdGx5LiBVc2UgUFIhICoqKlwiXG4gIGVjaG8gXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIlxuICBleGl0IDFcbmZpXG5cbmJ1biAtLWJ1biBub2RlX21vZHVsZXMvLmJpbi93YiB0eXBlY2hlY2tcbmAudHJpbSgpLFxuICBwb3N0TWVyZ2U6IGBcbiMhL2Jpbi9iYXNoXG5cbmNoYW5nZWRfZmlsZXM9XCIkKGdpdCBkaWZmLXRyZWUgLXIgLS1uYW1lLW9ubHkgLS1uby1jb21taXQtaWQgT1JJR19IRUFEIEhFQUQpXCJcblxucnVuX2lmX2NoYW5nZWQoKSB7XG4gIGlmIGVjaG8gXCIkY2hhbmdlZF9maWxlc1wiIHwgZ3JlcCAtLXF1aWV0IC1FIFwiJDFcIjsgdGhlblxuICAgIGV2YWwgXCIkMlwiXG4gIGZpXG59XG5gLnRyaW0oKSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUxlZnRob29rVXBkYXRpbmdQYWNrYWdlSnNvbihjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUxlZnRob29rVXBkYXRpbmdQYWNrYWdlSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBjb3JlKGNvbmZpZyk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmxlZnRob29rJyk7XG4gIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICBmcy5wcm9taXNlcy53cml0ZUZpbGUoXG4gICAgICBwYXRoLmpvaW4oY29uZmlnLmRpclBhdGgsICdsZWZ0aG9vay55bWwnKSxcbiAgICAgIHlhbWwuZHVtcChuZXdTZXR0aW5ncywge1xuICAgICAgICBsaW5lV2lkdGg6IC0xLFxuICAgICAgICBub0NvbXBhdE1vZGU6IHRydWUsXG4gICAgICAgIHN0eWxlczoge1xuICAgICAgICAgICchIW51bGwnOiAnZW1wdHknLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICApLFxuICAgIGZzLnByb21pc2VzLnJtKGRpclBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KSxcbiAgXSk7XG5cbiAgY29uc3QgeyB0eXBlY2hlY2sgfSA9IGdlbmVyYXRlU2NyaXB0cyhjb25maWcpO1xuICBpZiAodHlwZWNoZWNrKSB7XG4gICAgY29uc3QgcHJlUHVzaCA9IGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJykgPyBzY3JpcHRzLnByZVB1c2hGb3JMYWIgOiBzY3JpcHRzLnByZVB1c2g7XG4gICAgZnMubWtkaXJTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncHJlLXB1c2gnKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKGRpclBhdGgsICdwcmUtcHVzaCcsICdjaGVjay5zaCcpLCBwcmVQdXNoICsgJ1xcbicsIHtcbiAgICAgICAgbW9kZTogMG83NTUsXG4gICAgICB9KVxuICAgICk7XG4gIH1cbiAgY29uc3QgcG9zdE1lcmdlQ29tbWFuZCA9IGAke3NjcmlwdHMucG9zdE1lcmdlfVxcblxcbiR7Z2VuZXJhdGVQb3N0TWVyZ2VDb21tYW5kcyhjb25maWcpLmpvaW4oJ1xcbicpfVxcbmA7XG4gIGZzLm1rZGlyU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ3Bvc3QtbWVyZ2UnKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgIGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3Bvc3QtbWVyZ2UnLCAncHJlcGFyZS5zaCcpLCBwb3N0TWVyZ2VDb21tYW5kLCB7XG4gICAgICBtb2RlOiAwbzc1NSxcbiAgICB9KVxuICApO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmNvbnN0IHNyY0RpcmVjdG9yaWVzID0ge1xuICBub2RlOiBbJ3NyYycsICd0ZXN0JywgJ3NjcmlwdHMnXS5zb3J0KCksXG4gIGJsaXR6OiBbJ3NyYycsICd0ZXN0JywgJ3NjcmlwdHMnLCAnZGInLCAnaW50ZWdyYXRpb25zJywgJ21haWxlcnMnXS5zb3J0KCksXG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3JjRGlycyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmdbXSB7XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6KSB7XG4gICAgcmV0dXJuIHNyY0RpcmVjdG9yaWVzLmJsaXR6O1xuICB9XG4gIHJldHVybiBzcmNEaXJlY3Rvcmllcy5ub2RlO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgRXNsaW50VXRpbCB9IGZyb20gJy4uL3V0aWxzL2VzbGludFV0aWwuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgZ2V0U3JjRGlycyB9IGZyb20gJy4uL3V0aWxzL3NyY0RpcmVjdG9yaWVzLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlTGludHN0YWdlZHJjKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlTGludHN0YWdlZHJjJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IGNvcmUoY29uZmlnKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmxpbnRzdGFnZWRyYy5janMnKTtcbiAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcGFja2FnZVByZWZpeCA9IGNvbmZpZy5pc1Jvb3QgPyAnbm9kZSBub2RlX21vZHVsZXMvLmJpbi8nIDogJ25vZGUgLi4vLi4vbm9kZV9tb2R1bGVzLy5iaW4vJztcbiAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5zSmF2YVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdCkge1xuICAgIGNvbnN0IGVzbGludCA9IGBcbiAgJyR7Z2V0RXNsaW50S2V5KGNvbmZpZyl9JzogWyR7SlNPTi5zdHJpbmdpZnkoXG4gICAgYCR7cGFja2FnZVByZWZpeH1lc2xpbnQgLS1maXgke0VzbGludFV0aWwuZ2V0TGludEZpeFN1ZmZpeChjb25maWcpfWBcbiAgKX0sICcke3BhY2thZ2VQcmVmaXh9cHJldHRpZXIgLS1jYWNoZSAtLXdyaXRlJ10sYDtcbiAgICBsaW5lcy5wdXNoKGVzbGludCk7XG4gIH1cbiAgY29uc3QgcGFja2FnZXNGaWx0ZXIgPSBjb25maWcuaXNSb290ID8gXCIgJiYgIWZpbGUuaW5jbHVkZXMoJy9wYWNrYWdlcy8nKVwiIDogJyc7XG4gIGxpbmVzLnB1c2goYFxuICAnLi8qKi8qLnske2V4dGVuc2lvbnMucHJldHRpZXIuam9pbignLCcpfX0nOiBmaWxlcyA9PiB7XG4gICAgbGV0IGZpbHRlcmVkRmlsZXMgPSBmaWxlcy5maWx0ZXIoZmlsZSA9PiAhZmlsZS5pbmNsdWRlcygnL3Rlc3QtZml4dHVyZXMvJykgJiYgIWZpbGUuaW5jbHVkZXMoJy90ZXN0L2ZpeHR1cmVzLycpJHtwYWNrYWdlc0ZpbHRlcn0pOyR7Z2V0RXNsaW50RmlsdGVyRm9yUHJldHRpZXIoY29uZmlnKX1cbiAgICBpZiAoZmlsdGVyZWRGaWxlcy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcbiAgICBjb25zdCBjb21tYW5kcyA9IFtcXGAke3BhY2thZ2VQcmVmaXh9cHJldHRpZXIgLS1jYWNoZSAtLXdyaXRlIFxcJHtmaWx0ZXJlZEZpbGVzLmpvaW4oJyAnKX1cXGBdO1xuICAgIGlmIChmaWx0ZXJlZEZpbGVzLnNvbWUoZmlsZSA9PiBmaWxlLmVuZHNXaXRoKCdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICAgIGNvbW1hbmRzLnB1c2goJyR7cGFja2FnZVByZWZpeH1zb3J0LXBhY2thZ2UtanNvbicpO1xuICAgIH1cbiAgICByZXR1cm4gY29tbWFuZHM7XG4gIH0sXG4gICcuLyoqL21pZ3JhdGlvbi5zcWwnOiAoZmlsZXMpID0+IHtcbiAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmaWxlLCAndXRmLTgnKTtcbiAgICBpZiAoY29udGVudC5pbmNsdWRlcygnV2FybmluZ3M6JykpIHtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIFxcYCEhISBNaWdyYXRpb24gU1FMIGZpbGUgKFxcJHtwYXRoLnJlbGF0aXZlKCcnLCBmaWxlKX0pIGNvbnRhaW5zIHdhcm5pbmdzICEhISBTb2x2ZSB0aGUgd2FybmluZ3MgYW5kIGNvbW1pdCBhZ2Fpbi5cXGAsXG4gICAgICBdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gW107XG59LGApO1xuICBpZiAoY29uZmlnLmRvZXNDb250YWluc1B1YnNwZWNZYW1sKSB7XG4gICAgbGluZXMucHVzaChgXG4gICcuL3tsaWIsdGVzdCx0ZXN0X2RyaXZlcn0vKiovKi5kYXJ0JzogZmlsZXMgPT4ge1xuICAgIGNvbnN0IGZpbHRlcmVkRmlsZXMgPSBmaWxlcy5maWx0ZXIoZmlsZSA9PiAhZmlsZS5pbmNsdWRlcygnZ2VuZXJhdGVkJykpXG4gICAgICAuZmlsdGVyKGZpbGUgPT4gIWZpbGUuZW5kc1dpdGgoJy5mcmVlemVkLmRhcnQnKSAmJiAhZmlsZS5lbmRzV2l0aCgnLmcuZGFydCcpKTtcbiAgICBpZiAoZmlsdGVyZWRGaWxlcy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcbiAgICByZXR1cm4gW1xcYGZsdXR0ZXIgZm9ybWF0IFxcJHtmaWx0ZXJlZEZpbGVzLmpvaW4oJyAnKX1cXGBdO1xuICB9LGApO1xuICB9XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5zUG9ldHJ5TG9jaykge1xuICAgIGxpbmVzLnB1c2goYFxuICAnLi8qKi8qLnB5JzogW1xuICAgICdwb2V0cnkgcnVuIGlzb3J0IC0tcHJvZmlsZSBibGFjayAtLWZpbHRlci1maWxlcycsXG4gICAgJ3BvZXRyeSBydW4gYmxhY2snLFxuICAgICdwb2V0cnkgcnVuIGZsYWtlOCdcbiAgXSxgKTtcbiAgfVxuXG4gIGNvbnN0IG5ld0NvbnRlbnQgPSBgY29uc3QgZnMgPSByZXF1aXJlKCdmcycpO1xuY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcbiR7Y29uZmlnLmRvZXNDb250YWluc0phdmFTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHQgPyBcImNvbnN0IG1pY3JvbWF0Y2ggPSByZXF1aXJlKCdtaWNyb21hdGNoJyk7XFxuXCIgOiAnJ31cbm1vZHVsZS5leHBvcnRzID0geyR7bGluZXMuam9pbignJyl9XG59O1xuYDtcblxuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmxpbnRzdGFnZWRyYy5qcycpLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5saW50c3RhZ2VkcmMuanNvbicpLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbn1cblxuZnVuY3Rpb24gZ2V0RXNsaW50S2V5KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIGNvbnN0IGRpcnMgPSBnZXRTcmNEaXJzKGNvbmZpZykubWFwKChkaXIpID0+IGAke2Rpcn0vKiovYCk7XG4gIHJldHVybiBgeywke2RpcnMuam9pbignLCcpfX0qLnske2V4dGVuc2lvbnMuZXNsaW50LmpvaW4oJywnKX19YDtcbn1cblxuZnVuY3Rpb24gZ2V0RXNsaW50RmlsdGVyRm9yUHJldHRpZXIoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNvbmZpZy5kb2VzQ29udGFpbnNKYXZhU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0XG4gICAgPyBgXFxuXG4gICAgZmlsdGVyZWRGaWxlcyA9IGZpbHRlcmVkRmlsZXMubWFwKChmaWxlKSA9PiBwYXRoLnJlbGF0aXZlKCcnLCBmaWxlKSk7XG4gICAgZmlsdGVyZWRGaWxlcyA9IG1pY3JvbWF0Y2gubm90KGZpbHRlcmVkRmlsZXMsICcke2dldEVzbGludEtleShjb25maWcpfScpO1xuICAgIGZpbHRlcmVkRmlsZXMgPSBmaWx0ZXJlZEZpbGVzLm1hcCgoZmlsZSkgPT4gcGF0aC5yZXNvbHZlKGZpbGUpKTtgXG4gICAgOiAnJztcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlTmV4dENvbmZpZ0pzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVOZXh0Q29uZmlnSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IFsnanMnLCAnbWpzJywgJ2NqcyddXG4gICAgICAubWFwKChleHQpID0+IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgYG5leHQuY29uZmlnLiR7ZXh0fWApKVxuICAgICAgLmZpbmQoKHApID0+IGZzLmV4aXN0c1N5bmMocCkpO1xuICAgIGlmICghZmlsZVBhdGgpIHJldHVybjtcblxuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAvLyBSZXBsYWNlIHRoZSBKU09OIG9iamVjdCBmcm9tIHRoZSBmaWxlXG4gICAgY29uc3QgbmV3Q29udGVudCA9IG9sZENvbnRlbnQucmVwbGFjZSgvPVxccyp7KFtcXFNcXHNdKil9Oy8sIChfLCBzZXR0aW5nc1RleHQ6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKCFzZXR0aW5nc1RleHQuaW5jbHVkZXMoJ2VzbGludDonKSkge1xuICAgICAgICBzZXR0aW5nc1RleHQgKz0gJ2VzbGludDogeyBpZ25vcmVEdXJpbmdCdWlsZHM6IHRydWUgfSwnO1xuICAgICAgfVxuICAgICAgaWYgKCFzZXR0aW5nc1RleHQuaW5jbHVkZXMoJ3R5cGVzY3JpcHQ6JykpIHtcbiAgICAgICAgc2V0dGluZ3NUZXh0ICs9ICd0eXBlc2NyaXB0OiB7IGlnbm9yZUJ1aWxkRXJyb3JzOiB0cnVlIH0sJztcbiAgICAgIH1cbiAgICAgIHJldHVybiBgPSB7JHtzZXR0aW5nc1RleHR9fTtgO1xuICAgIH0pO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGNvbW1vbkNvbnRlbnQgPSBgXG4zcmQtcGFydHkvXG5hbmRyb2lkL1xuaW9zL1xubm8tZm9ybWF0L1xudGVzdC1maXh0dXJlcy9cbnRlc3QvZml4dHVyZXMvXG4qLmQudHNcbioubWluLmpzXG4ueWFybi9cbi5wbnAuanNcbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVByZXR0aWVyaWdub3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUHJldHRpZXJpZ25vcmUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcucHJldHRpZXJpZ25vcmUnKTtcbiAgICBjb25zdCBjb250ZW50ID0gKGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGgpKSA/PyAnJztcbiAgICBjb25zdCBoZWFkVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRIZWFkVXNlckNvbnRlbnQoY29udGVudCk7XG4gICAgY29uc3QgdGFpbFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0VGFpbFVzZXJDb250ZW50KGNvbnRlbnQpO1xuXG4gICAgY29uc3QgZ2l0aWdub3JlRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aWdub3JlJyk7XG4gICAgY29uc3QgZ2l0aWdub3JlQ29udGVudCA9IChhd2FpdCBpZ25vcmVGaWxlVXRpbC5yZWFkR2l0aWdub3JlV2l0aG91dFNlcGFyYXRvcnMoZ2l0aWdub3JlRmlsZVBhdGgpKSB8fCAnJztcblxuICAgIGxldCBhZGRpdGlvbmFsQ29udGVudCA9ICcnO1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zUHVic3BlY1lhbWwpIHtcbiAgICAgIGFkZGl0aW9uYWxDb250ZW50ID0gYFxuYW5kcm9pZC9hcHAvXG5pb3MvUnVubmVyL0Fzc2V0cy54Y2Fzc2V0cy9cbnB1YnNwZWMueWFtbFxuYDtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdDb250ZW50ID0gaGVhZFVzZXJDb250ZW50ICsgY29tbW9uQ29udGVudCArIGFkZGl0aW9uYWxDb250ZW50ICsgZ2l0aWdub3JlQ29udGVudCArIHRhaWxVc2VyQ29udGVudDtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IGNsb25lRGVlcCBmcm9tICdsb2Rhc2guY2xvbmVkZWVwJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBqc29uT2JqID0ge1xuICB2ZW52UGF0aDogJy4nLFxuICB2ZW52OiAnLnZlbnYnLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBsZXQgbmV3U2V0dGluZ3M6IG9iamVjdCA9IGNsb25lRGVlcChqc29uT2JqKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3B5cmlnaHRjb25maWcuanNvbicpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBvbGRTZXR0aW5ncyA9IEpTT04ucGFyc2Uob2xkQ29udGVudCkgYXMgb2JqZWN0O1xuICAgICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBzZW1hbnRpY1JlbGVhc2VCYWRnZSA9XG4gICdbIVtzZW1hbnRpYy1yZWxlYXNlXShodHRwczovL2ltZy5zaGllbGRzLmlvL2JhZGdlLyUyMCUyMCVGMCU5RiU5MyVBNiVGMCU5RiU5QSU4MC1zZW1hbnRpYy0tcmVsZWFzZS1lMTAwNzkuc3ZnKV0oaHR0cHM6Ly9naXRodWIuY29tL3NlbWFudGljLXJlbGVhc2Uvc2VtYW50aWMtcmVsZWFzZSknO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZWFkbWUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVSZWFkbWUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdSRUFETUUubWQnKTtcbiAgICBsZXQgbmV3Q29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuXG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnJlbGVhc2VyYy5qc29uJykpKSB7XG4gICAgICBuZXdDb250ZW50ID0gaW5zZXJ0QmFkZ2UobmV3Q29udGVudCwgc2VtYW50aWNSZWxlYXNlQmFkZ2UpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcG9zaXRvcnkgPSBjb25maWcucmVwb3NpdG9yeT8uc2xpY2UoY29uZmlnLnJlcG9zaXRvcnk/LmluZGV4T2YoJzonKSArIDEpO1xuICAgIGNvbnN0IGZpbGVOYW1lcyA9IGZzLnJlYWRkaXJTeW5jKGAke2NvbmZpZy5kaXJQYXRofS8uZ2l0aHViL3dvcmtmbG93c2ApO1xuICAgIGZvciAoY29uc3QgZmlsZU5hbWUgb2YgZmlsZU5hbWVzKSB7XG4gICAgICBpZiAoIWZpbGVOYW1lLnN0YXJ0c1dpdGgoJ3Rlc3QnKSAmJiAhZmlsZU5hbWUuc3RhcnRzV2l0aCgnZGVwbG95JykpIGNvbnRpbnVlO1xuXG4gICAgICBsZXQgYmFkZ2VOYW1lID0gZmlsZU5hbWU7XG4gICAgICBiYWRnZU5hbWUgPSBiYWRnZU5hbWVbMF0udG9VcHBlckNhc2UoKSArIGJhZGdlTmFtZS5zbGljZSgxLCBiYWRnZU5hbWUuaW5kZXhPZignLicpKTtcbiAgICAgIGJhZGdlTmFtZSA9IGJhZGdlTmFtZS5yZXBsYWNlKCctJywgJyAnKTtcbiAgICAgIGNvbnN0IGJhZGdlID0gYFshWyR7YmFkZ2VOYW1lfV0oaHR0cHM6Ly9naXRodWIuY29tLyR7cmVwb3NpdG9yeX0vYWN0aW9ucy93b3JrZmxvd3MvJHtmaWxlTmFtZX0vYmFkZ2Uuc3ZnKV0oaHR0cHM6Ly9naXRodWIuY29tLyR7cmVwb3NpdG9yeX0vYWN0aW9ucy93b3JrZmxvd3MvJHtmaWxlTmFtZX0pYDtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgYC5naXRodWIvd29ya2Zsb3dzLyR7ZmlsZU5hbWV9YCkpKSB7XG4gICAgICAgIG5ld0NvbnRlbnQgPSBpbnNlcnRCYWRnZShuZXdDb250ZW50LCBiYWRnZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbnNlcnRCYWRnZShyZWFkbWU6IHN0cmluZywgYmFkZ2U6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIOaXouOBq2JhZGdl44GM44GC44KL5aC05ZCI44Gv5YmK6ZmkXG4gIHJlYWRtZSA9IHJlYWRtZS5yZXBsYWNlKGJhZGdlLCAnJykucmVwbGFjZUFsbCgvXFxuXFxuXFxuKy9nLCAnXFxuXFxuJyk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByZWFkbWUubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAocmVhZG1lW2kgLSAxXSA9PT0gJ1xcbicgJiYgcmVhZG1lW2ldID09PSAnXFxuJykge1xuICAgICAgY29uc3QgYmVmb3JlID0gcmVhZG1lLnNsaWNlKDAsIGkgKyAxKTtcbiAgICAgIGxldCBhZnRlciA9IHJlYWRtZS5zbGljZShpICsgMSk7XG4gICAgICBpZiAoIWFmdGVyLnN0YXJ0c1dpdGgoJ1snKSAmJiAhYWZ0ZXIuc3RhcnRzV2l0aCgnIScpKSB7XG4gICAgICAgIGFmdGVyID0gYFxcbiR7YWZ0ZXJ9YDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBgJHtiZWZvcmV9JHtiYWRnZX1cXG4ke2FmdGVyfWA7XG4gICAgfVxuICB9XG4gIHJldHVybiBgJHtyZWFkbWV9XFxuJHtiYWRnZX1cXG5gO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUmVsZWFzZXJjKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVJlbGVhc2VyYycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcucmVsZWFzZXJjLmpzb24nKTtcbiAgICBjb25zdCBzZXR0aW5ncyA9IEpTT04ucGFyc2UoYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4JykpIGFzIHtcbiAgICAgIHBsdWdpbnM6IChzdHJpbmcgfCBbc3RyaW5nLCB1bmtub3duXSlbXTtcbiAgICB9O1xuICAgIGNvbnN0IHBsdWdpbnMgPSBzZXR0aW5ncz8ucGx1Z2lucyB8fCBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBsdWdpbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHBsdWdpbiA9IEFycmF5LmlzQXJyYXkocGx1Z2luc1tpXSkgPyBwbHVnaW5zW2ldWzBdIDogcGx1Z2luc1tpXTtcbiAgICAgIGNvbnN0IG9sZENvbmZpZyA9IChBcnJheS5pc0FycmF5KHBsdWdpbnNbaV0pICYmIHBsdWdpbnNbaV1bMV0pIHx8IHt9O1xuICAgICAgaWYgKHBsdWdpbiA9PT0gJ0BzZW1hbnRpYy1yZWxlYXNlL2NvbW1pdC1hbmFseXplcicpIHtcbiAgICAgICAgcGx1Z2luc1tpXSA9IFtcbiAgICAgICAgICAnQHNlbWFudGljLXJlbGVhc2UvY29tbWl0LWFuYWx5emVyJyxcbiAgICAgICAgICBtZXJnZS5hbGwoXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIG9sZENvbmZpZyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHByZXNldDogJ2NvbnZlbnRpb25hbGNvbW1pdHMnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfVxuICAgICAgICAgICksXG4gICAgICAgIF07XG4gICAgICB9IGVsc2UgaWYgKHBsdWdpbiA9PT0gJ0BzZW1hbnRpYy1yZWxlYXNlL2dpdGh1YicpIHtcbiAgICAgICAgLy8gUmVtb3ZlIGRlcHJlY2F0ZWQgc3VjY2Vzc0NvbW1lbnQgYW5kIGZhaWxDb21tZW50IHByb3BlcnRpZXMgZnJvbSBvbGRDb25maWdcbiAgICAgICAgY29uc3QgeyBmYWlsQ29tbWVudDogXzEsIHN1Y2Nlc3NDb21tZW50OiBfMiwgLi4uY2xlYW5PbGRDb25maWcgfSA9IG9sZENvbmZpZyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgcGx1Z2luc1tpXSA9IFtcbiAgICAgICAgICAnQHNlbWFudGljLXJlbGVhc2UvZ2l0aHViJyxcbiAgICAgICAgICBtZXJnZS5hbGwoXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIGNsZWFuT2xkQ29uZmlnLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLy8gY2YuIGh0dHBzOi8vZ2l0aHViLmNvbS9zZW1hbnRpYy1yZWxlYXNlL3NlbWFudGljLXJlbGVhc2UvaXNzdWVzLzIyMDQjaXNzdWVjb21tZW50LTE1MDg0MTc3MDRcbiAgICAgICAgICAgICAgICBzdWNjZXNzQ29tbWVudENvbmRpdGlvbjogZmFsc2UsXG4gICAgICAgICAgICAgICAgZmFpbENvbW1lbnRDb25kaXRpb246IGZhbHNlLFxuICAgICAgICAgICAgICAgIGxhYmVsczogWydyOiBzZW1hbnRpYy1yZWxlYXNlJ10sXG4gICAgICAgICAgICAgICAgcmVsZWFzZWRMYWJlbHM6IFsncmVsZWFzZWQgOmJvb2ttYXJrOiddLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfVxuICAgICAgICAgICksXG4gICAgICAgIF07XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShzZXR0aW5ncyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCBjbG9uZURlZXAgZnJvbSAnbG9kYXNoLmNsb25lZGVlcCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QganNvbk9iaiA9IHtcbiAgJHNjaGVtYTogJ2h0dHBzOi8vZG9jcy5yZW5vdmF0ZWJvdC5jb20vcmVub3ZhdGUtc2NoZW1hLmpzb24nLFxuICBleHRlbmRzOiBbJ2dpdGh1Yj5XaWxsQm9vc3Rlci93aWxsYm9vc3Rlci1jb25maWdzOnJlbm92YXRlLmpzb241J10sXG59O1xuXG50eXBlIFNldHRpbmdzID0gdHlwZW9mIGpzb25PYmogJiB7IHBhY2thZ2VSdWxlczogeyBtYXRjaFBhY2thZ2VOYW1lczogc3RyaW5nW107IGVuYWJsZWQ/OiBib29sZWFuIH1bXSB9O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZW5vdmF0ZUpzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVSZW5vdmF0ZUpzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgbGV0IG5ld1NldHRpbmdzID0gY2xvbmVEZWVwKGpzb25PYmopIGFzIFNldHRpbmdzO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAncmVub3ZhdGUuanNvbicpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGAke2ZpbGVQYXRofTVgKSkge1xuICAgICAgLy8gU2luY2UgaXQgaXMgZGlmZmljdWx0IGZvciBwYXJzaW5nIHJlbm92YXRlLmpzb241LCB3ZSBkbyBub3RoaW5nXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBvbGRTZXR0aW5ncyA9IEpTT04ucGFyc2Uob2xkQ29udGVudCkgYXMgU2V0dGluZ3M7XG4gICAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHtcbiAgICAgICAgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UsXG4gICAgICB9KSBhcyBTZXR0aW5ncztcbiAgICAgIG5ld1NldHRpbmdzLmV4dGVuZHMgPSBuZXdTZXR0aW5ncy5leHRlbmRzLmZpbHRlcigoaXRlbTogc3RyaW5nKSA9PiBpdGVtICE9PSAnQHdpbGxib29zdGVyJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgLy8gRG9uJ3QgdXBncmFkZSBOZXh0LmpzIGF1dG9tYXRpY2FsbHlcbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eikge1xuICAgICAgbmV3U2V0dGluZ3MucGFja2FnZVJ1bGVzID8/PSBbXTtcbiAgICAgIGlmIChcbiAgICAgICAgIW5ld1NldHRpbmdzLnBhY2thZ2VSdWxlcy5zb21lKChydWxlOiB7IG1hdGNoUGFja2FnZU5hbWVzOiBzdHJpbmdbXSB9KSA9PlxuICAgICAgICAgIHJ1bGUubWF0Y2hQYWNrYWdlTmFtZXMuaW5jbHVkZXMoJ25leHQnKVxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgbmV3U2V0dGluZ3MucGFja2FnZVJ1bGVzLnB1c2goeyBtYXRjaFBhY2thZ2VOYW1lczogWyduZXh0J10sIGVuYWJsZWQ6IGZhbHNlIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZGVwZW5kYWJvdCcpLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnJlbm92YXRlcmMuanNvbicpLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIG1vdmVUb0JvdHRvbTxUT2JqIGV4dGVuZHMgUmVjb3JkPFRLZXksIHVua25vd24+LCBUS2V5IGV4dGVuZHMgc3RyaW5nIHwgbnVtYmVyIHwgc3ltYm9sPihcbiAgb2JqOiBUT2JqLFxuICBrZXk6IFRLZXlcbik6IFRPYmoge1xuICBjb25zdCB2YWx1ZSA9IG9ialtrZXldO1xuICBkZWxldGUgb2JqW2tleV07XG4gIChvYmogYXMgUmVjb3JkPFRLZXksIHVua25vd24+KVtrZXldID0gdmFsdWU7XG4gIHJldHVybiBvYmo7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzb3J0S2V5czxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KG9iajogVCk6IFQge1xuICBjb25zdCBrZXlBbmRWYWx1ZXMgPSBPYmplY3QuZW50cmllcyhvYmopLnNvcnQoKFtrZXkxXSwgW2tleTJdKSA9PiBrZXkxLmxvY2FsZUNvbXBhcmUoa2V5MikpO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBrZXlBbmRWYWx1ZXMpIHtcbiAgICBkZWxldGUgb2JqW2tleV07XG4gICAgKG9iaiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSA9IHZhbHVlO1xuXG4gICAgLy8gaWYgdmFsdWUgaXMgYW4gb2JqZWN0LCBzb3J0IHRoZSBrZXlzIG9mIHRoZSBvYmplY3RcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgc29ydEtleXModmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb2JqO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgY2xvbmVEZWVwIGZyb20gJ2xvZGFzaC5jbG9uZWRlZXAnO1xuaW1wb3J0IHR5cGUgeyBUc0NvbmZpZ0pzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgY29tYmluZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHNvcnRLZXlzIH0gZnJvbSAnLi4vdXRpbHMvb2JqZWN0VXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3Qgcm9vdEpzb25PYmogPSB7XG4gIGNvbXBpbGVyT3B0aW9uczoge1xuICAgIHRhcmdldDogJ0VTMjAyMicsIC8vIGJlY2F1c2UgZGVjb3JhdG9ycyBzaG91bGQgYmUgdHJhbnNwaWxlZCB0byBFUzIwMjIgb24gTm9kZS5qc1xuICAgIG1vZHVsZTogJ0VTTmV4dCcsXG4gICAgbW9kdWxlUmVzb2x1dGlvbjogJ05vZGUnLFxuICAgIGpzeDogJ3JlYWN0LWpzeCcsXG4gICAgYWx3YXlzU3RyaWN0OiB0cnVlLFxuICAgIHN0cmljdDogdHJ1ZSxcbiAgICBza2lwTGliQ2hlY2s6IHRydWUsIC8vIGJlY2F1c2UgbGlicmFyaWVzIG1heSBoYXZlIGJyb2tlbiB0eXBlc1xuICAgIGFsbG93U3ludGhldGljRGVmYXVsdEltcG9ydHM6IHRydWUsIC8vIGFsbG93IGBpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnYFxuICAgIGVzTW9kdWxlSW50ZXJvcDogdHJ1ZSwgLy8gYWxsb3cgZGVmYXVsdCBpbXBvcnQgZnJvbSBDb21tb25KUy9BTUQvVU1EIG1vZHVsZXNcbiAgICByZXNvbHZlSnNvbk1vZHVsZTogdHJ1ZSwgLy8gYWxsb3cgdG8gaW1wb3J0IEpTT04gZmlsZXNcbiAgICBkZWNsYXJhdGlvbjogdHJ1ZSxcbiAgICBzb3VyY2VNYXA6IHRydWUsXG4gICAgaW1wb3J0SGVscGVyczogZmFsc2UsXG4gICAgZXJhc2FibGVTeW50YXhPbmx5OiB0cnVlLFxuICAgIG91dERpcjogJ2Rpc3QnLFxuICAgIHR5cGVSb290czogWycuL25vZGVfbW9kdWxlcy9AdHlwZXMnLCAnLi9AdHlwZXMnXSxcbiAgfSxcbiAgZXhjbHVkZTogWydwYWNrYWdlcy8qL3Rlc3QvZml4dHVyZXMnLCAndGVzdC9maXh0dXJlcyddLFxuICBpbmNsdWRlOiBbXG4gICAgJ3BhY2thZ2VzLyovc2NyaXB0cy8qKi8qJyxcbiAgICAncGFja2FnZXMvKi9zcmMvKiovKicsXG4gICAgJ3BhY2thZ2VzLyovdGVzdC8qKi8qJyxcbiAgICAnc2NyaXB0cy8qKi8qJyxcbiAgICAnc3JjLyoqLyonLFxuICAgICd0ZXN0LyoqLyonLFxuICBdLFxufTtcblxuY29uc3Qgc3ViSnNvbk9iaiA9IHtcbiAgY29tcGlsZXJPcHRpb25zOiB7XG4gICAgdGFyZ2V0OiAnRVMyMDIyJywgLy8gYmVjYXVzZSBkZWNvcmF0b3JzIHNob3VsZCBiZSB0cmFuc3BpbGVkIHRvIEVTMjAyMiBvbiBOb2RlLmpzXG4gICAgbW9kdWxlOiAnRVNOZXh0JyxcbiAgICBtb2R1bGVSZXNvbHV0aW9uOiAnTm9kZScsXG4gICAganN4OiAncmVhY3QtanN4JyxcbiAgICBhbHdheXNTdHJpY3Q6IHRydWUsXG4gICAgc3RyaWN0OiB0cnVlLFxuICAgIHNraXBMaWJDaGVjazogdHJ1ZSwgLy8gYmVjYXVzZSBsaWJyYXJpZXMgbWF5IGhhdmUgYnJva2VuIHR5cGVzXG4gICAgYWxsb3dTeW50aGV0aWNEZWZhdWx0SW1wb3J0czogdHJ1ZSwgLy8gYWxsb3cgYGltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdgXG4gICAgZXNNb2R1bGVJbnRlcm9wOiB0cnVlLCAvLyBhbGxvdyBkZWZhdWx0IGltcG9ydCBmcm9tIENvbW1vbkpTL0FNRC9VTUQgbW9kdWxlc1xuICAgIHJlc29sdmVKc29uTW9kdWxlOiB0cnVlLCAvLyBhbGxvdyB0byBpbXBvcnQgSlNPTiBmaWxlc1xuICAgIGRlY2xhcmF0aW9uOiB0cnVlLFxuICAgIHNvdXJjZU1hcDogdHJ1ZSxcbiAgICBpbXBvcnRIZWxwZXJzOiBmYWxzZSxcbiAgICBlcmFzYWJsZVN5bnRheE9ubHk6IHRydWUsXG4gICAgb3V0RGlyOiAnZGlzdCcsXG4gICAgdHlwZVJvb3RzOiBbJy4uLy4uL25vZGVfbW9kdWxlcy9AdHlwZXMnLCAnLi4vLi4vQHR5cGVzJywgJy4vQHR5cGVzJ10sXG4gIH0sXG4gIGV4Y2x1ZGU6IFsndGVzdC9maXh0dXJlcyddLFxuICBpbmNsdWRlOiBbJ3NjcmlwdHMvKiovKicsICdzcmMvKiovKicsICd0ZXN0LyoqLyonXSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVRzY29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlVHNjb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHwgY29uZmlnLmRlcGVuZGluZy5uZXh0KSByZXR1cm47XG5cbiAgICBsZXQgbmV3U2V0dGluZ3MgPSBjbG9uZURlZXAoY29uZmlnLmlzUm9vdCA/IHJvb3RKc29uT2JqIDogc3ViSnNvbk9iaikgYXMgVHNDb25maWdKc29uO1xuICAgIGlmICghY29uZmlnLmRvZXNDb250YWluc0pzeE9yVHN4ICYmICFjb25maWcuZG9lc0NvbnRhaW5zSnN4T3JUc3hJblBhY2thZ2VzKSB7XG4gICAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5qc3g7XG4gICAgfVxuICAgIGlmIChjb25maWcuaXNSb290ICYmICFjb25maWcuZG9lc0NvbnRhaW5zU3ViUGFja2FnZUpzb25zKSB7XG4gICAgICBuZXdTZXR0aW5ncy5pbmNsdWRlID0gbmV3U2V0dGluZ3MuaW5jbHVkZT8uZmlsdGVyKChkaXJQYXRoOiBzdHJpbmcpID0+ICFkaXJQYXRoLnN0YXJ0c1dpdGgoJ3BhY2thZ2VzLyovJykpO1xuICAgICAgbmV3U2V0dGluZ3MuZXhjbHVkZSA9IG5ld1NldHRpbmdzLmV4Y2x1ZGU/LmZpbHRlcigoZGlyUGF0aDogc3RyaW5nKSA9PiAhZGlyUGF0aC5zdGFydHNXaXRoKCdwYWNrYWdlcy8qLycpKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5pc0VzbVBhY2thZ2UpIHtcbiAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyA9IHtcbiAgICAgICAgLi4ubmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLFxuICAgICAgICBtb2R1bGU6ICdOb2RlTmV4dCcsXG4gICAgICAgIG1vZHVsZVJlc29sdXRpb246ICdOb2RlTmV4dCcsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAndHNjb25maWcuanNvbicpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG9sZFNldHRpbmdzID0gSlNPTi5wYXJzZShleGlzdGluZ0NvbnRlbnQpIGFzIFRzQ29uZmlnSnNvbjtcbiAgICAgIGlmIChvbGRTZXR0aW5ncy5leHRlbmRzID09PSAnLi9ub2RlX21vZHVsZXMvQHdpbGxib29zdGVyL3RzY29uZmlnL3RzY29uZmlnLmpzb24nKSB7XG4gICAgICAgIGRlbGV0ZSBvbGRTZXR0aW5ncy5leHRlbmRzO1xuICAgICAgfVxuICAgICAgLy8gRG9uJ3QgbW9kaWZ5IFwidGFyZ2V0XCIsIFwibW9kdWxlXCIgYW5kIFwibW9kdWxlUmVzb2x1dGlvblwiLlxuICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8udGFyZ2V0O1xuICAgICAgaWYgKCFjb25maWcuaXNFc21QYWNrYWdlKSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/Lm1vZHVsZTtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8ubW9kdWxlUmVzb2x1dGlvbjtcbiAgICAgIH1cbiAgICAgIGlmIChvbGRTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmpzeCkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5qc3g7XG4gICAgICB9XG4gICAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHsgYXJyYXlNZXJnZTogY29tYmluZU1lcmdlIH0pO1xuICAgICAgbmV3U2V0dGluZ3MuaW5jbHVkZSA9IG5ld1NldHRpbmdzLmluY2x1ZGU/LmZpbHRlcihcbiAgICAgICAgKGRpclBhdGg6IHN0cmluZykgPT5cbiAgICAgICAgICAhZGlyUGF0aC5pbmNsdWRlcygnQHR5cGVzJykgJiYgIWRpclBhdGguaW5jbHVkZXMoJ19fdGVzdHNfXy8nKSAmJiAhZGlyUGF0aC5pbmNsdWRlcygndGVzdHMvJylcbiAgICAgICk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICAgIHNvcnRLZXlzKG5ld1NldHRpbmdzKTtcbiAgICBuZXdTZXR0aW5ncy5pbmNsdWRlPy5zb3J0KCk7XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KG5ld1NldHRpbmdzKTtcbiAgICAvLyBEb24ndCB1c2Ugb2xkIGRlY29yYXRvclxuICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmV4cGVyaW1lbnRhbERlY29yYXRvcnM7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHNvcnRLZXlzIH0gZnJvbSAnLi4vdXRpbHMvb2JqZWN0VXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgZXhjbHVkZUZpbGVQYXR0ZXJucyA9IFtcbiAgJyoqLy5naXQvb2JqZWN0cy8qKicsXG4gICcqKi8uZ2l0L3N1YnRyZWUtY2FjaGUvKionLFxuICAnKiovbm9kZV9tb2R1bGVzLyoqJyxcbiAgJyoqL3RtcC8qKicsXG4gICcqKi90ZW1wLyoqJyxcbiAgJyoqL2Rpc3QvKionLFxuXTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlVnNjb2RlU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncycsIGFzeW5jICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcudnNjb2RlJywgJ3NldHRpbmdzLmpzb24nKTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgbGV0IHNldHRpbmdzID0gSlNPTi5wYXJzZShleGlzdGluZ0NvbnRlbnQpIGFzIG9iamVjdDtcbiAgICAgIGZvciAoY29uc3QgZXhjbHVkZUZpbGVQYXR0ZXJuIG9mIGV4Y2x1ZGVGaWxlUGF0dGVybnMpIHtcbiAgICAgICAgc2V0dGluZ3MgPSBtZXJnZS5hbGwoW3NldHRpbmdzLCBleGNsdWRlU2V0dGluZyhleGNsdWRlRmlsZVBhdHRlcm4pXSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc1BvZXRyeUxvY2spIHtcbiAgICAgICAgc2V0dGluZ3MgPSBtZXJnZS5hbGwoW3NldHRpbmdzLCBleGNsdWRlU2V0dGluZygnKiovLnZlbnYvKionKV0pO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgICBzZXR0aW5ncyA9IG1lcmdlLmFsbChbc2V0dGluZ3MsIGV4Y2x1ZGVTZXR0aW5nKCcqKi8ubmV4dC8qKicpXSk7XG4gICAgICB9XG4gICAgICAvLyBMTE3jgavjgojjgot2aWJlIGNvZGluZ+OBp+OBr+OAgeiHquWLleODleOCqeODvOODnuODg+ODiOOChOOCs+ODvOODieOCouOCr+OCt+ODp+ODs+OCkueEoeWKueWMluOBmeOCi+OBk+OBqOOBp1xuICAgICAgLy8g55Sf5oiQ44GV44KM44Gf44Kz44O844OJ44Gu5YWD44Gu5b2i5byP44KS57at5oyB44Gn44GN44KLXG4gICAgICBpZiAoJ2VkaXRvci5jb2RlQWN0aW9uc09uU2F2ZScgaW4gc2V0dGluZ3MpIHtcbiAgICAgICAgZGVsZXRlIHNldHRpbmdzWydlZGl0b3IuY29kZUFjdGlvbnNPblNhdmUnXTtcbiAgICAgIH1cbiAgICAgIGlmICgnZWRpdG9yLmZvcm1hdE9uU2F2ZScgaW4gc2V0dGluZ3MpIHtcbiAgICAgICAgZGVsZXRlIHNldHRpbmdzWydlZGl0b3IuZm9ybWF0T25TYXZlJ107XG4gICAgICB9XG4gICAgICBzb3J0S2V5cygoc2V0dGluZ3MgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID8/IHt9KTtcbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShzZXR0aW5ncywgdW5kZWZpbmVkLCAyKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZXhjbHVkZVNldHRpbmcoZXhjbHVkZUZpbGVQYXR0ZXJuOiBzdHJpbmcpOiBvYmplY3Qge1xuICByZXR1cm4ge1xuICAgICdmaWxlcy53YXRjaGVyRXhjbHVkZSc6IHtcbiAgICAgIFtleGNsdWRlRmlsZVBhdHRlcm5dOiB0cnVlLFxuICAgIH0sXG4gIH07XG59XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSB1bmljb3JuL25vLW51bGwgKi9cblxuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgeWFtbCBmcm9tICdqcy15YW1sJztcbmltcG9ydCBjbG9uZURlZXAgZnJvbSAnbG9kYXNoLmNsb25lZGVlcCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGNvbWJpbmVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBtb3ZlVG9Cb3R0b20sIHNvcnRLZXlzIH0gZnJvbSAnLi4vdXRpbHMvb2JqZWN0VXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW50ZXJmYWNlIFdvcmtmbG93IHtcbiAgbmFtZTogc3RyaW5nO1xuICBvbjogT247XG4gIGNvbmN1cnJlbmN5PzogQ29uY3VycmVuY3k7XG4gIGpvYnM6IHsgW2tleTogc3RyaW5nXTogSm9iIH07XG59XG5cbmludGVyZmFjZSBDb25jdXJyZW5jeSB7XG4gIGdyb3VwOiBzdHJpbmc7XG4gICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgT24ge1xuICBpc3N1ZXM/OiBUeXBlcztcbiAgcHVsbF9yZXF1ZXN0PzogUHVsbFJlcXVlc3Q7XG4gIHB1bGxfcmVxdWVzdF90YXJnZXQ/OiBUeXBlcztcbiAgcHVzaD86IFB1c2g7XG4gIHNjaGVkdWxlPzogU2NoZWR1bGVbXTtcbiAgd29ya2Zsb3dfZGlzcGF0Y2g/OiBudWxsO1xufVxuXG5pbnRlcmZhY2UgUHVsbFJlcXVlc3Qge1xuICAncGF0aHMtaWdub3JlJz86IHN0cmluZ1tdO1xuICB0eXBlcz86IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgUHVzaCB7XG4gIGJyYW5jaGVzOiBzdHJpbmdbXTtcbiAgJ3BhdGhzLWlnbm9yZSc/OiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIFNjaGVkdWxlIHtcbiAgY3Jvbjogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgVHlwZXMge1xuICB0eXBlczogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBKb2Ige1xuICB1c2VzOiBzdHJpbmc7XG4gIHNlY3JldHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgd2l0aD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG5jb25zdCB3b3JrZmxvd3MgPSB7XG4gIHRlc3Q6IHtcbiAgICBuYW1lOiAnVGVzdCcsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdDogbnVsbCxcbiAgICAgIHB1c2g6IHtcbiAgICAgICAgYnJhbmNoZXM6IFsnbWFpbicsICd3YmZ5J10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgLy8gY2YuIGh0dHBzOi8vZG9jcy5naXRodWIuY29tL2VuL2FjdGlvbnMvdXNpbmctam9icy91c2luZy1jb25jdXJyZW5jeSNleGFtcGxlLW9ubHktY2FuY2VsLWluLXByb2dyZXNzLWpvYnMtb3ItcnVucy1mb3ItdGhlLWN1cnJlbnQtd29ya2Zsb3dcbiAgICBjb25jdXJyZW5jeToge1xuICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19LSR7eyBnaXRodWIucmVmIH19JyxcbiAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiB0cnVlLFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgdGVzdDoge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3Rlc3QueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICByZWxlYXNlOiB7XG4gICAgbmFtZTogJ1JlbGVhc2UnLFxuICAgIG9uOiB7XG4gICAgICBwdXNoOiB7XG4gICAgICAgIGJyYW5jaGVzOiBbXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBjb25jdXJyZW5jeToge1xuICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19JyxcbiAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiBmYWxzZSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgIHJlbGVhc2U6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9yZWxlYXNlLnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgd2JmeToge1xuICAgIG5hbWU6ICdXaWxsYm9vc3RlcmlmeScsXG4gICAgb246IHtcbiAgICAgIHdvcmtmbG93X2Rpc3BhdGNoOiBudWxsLFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgd2JmeToge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3diZnkueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAnd2JmeS1tZXJnZSc6IHtcbiAgICBuYW1lOiAnTWVyZ2Ugd2JmeScsXG4gICAgb246IHtcbiAgICAgIHdvcmtmbG93X2Rpc3BhdGNoOiBudWxsLFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ3diZnktbWVyZ2UnOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3Mvd2JmeS1tZXJnZS55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gICdzZW1hbnRpYy1wcic6IHtcbiAgICBuYW1lOiAnTGludCBQUiB0aXRsZScsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdF90YXJnZXQ6IHtcbiAgICAgICAgdHlwZXM6IFsnb3BlbmVkJywgJ2VkaXRlZCcsICdzeW5jaHJvbml6ZSddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgICdzZW1hbnRpYy1wcic6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9zZW1hbnRpYy1wci55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIHN5bmM6IHtcbiAgICBuYW1lOiAnU3luYycsXG4gICAgb246IHt9LFxuICAgIGpvYnM6IHtcbiAgICAgIHN5bmM6IHsgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9zeW5jLnltbEBtYWluJyB9LFxuICAgIH0sXG4gIH0sXG4gICdub3RpZnktcmVhZHknOiB7XG4gICAgbmFtZTogJ05vdGlmeSByZWFkeScsXG4gICAgb246IHtcbiAgICAgIGlzc3Vlczoge1xuICAgICAgICB0eXBlczogWydsYWJlbGVkJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ25vdGlmeS1yZWFkeSc6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9ub3RpZnktcmVhZHkueW1sQG1haW4nLFxuICAgICAgICBzZWNyZXRzOiB7XG4gICAgICAgICAgRElTQ09SRF9XRUJIT09LX1VSTDogJyR7eyBzZWNyZXRzLkRJU0NPUkRfV0VCSE9PS19VUkxfRk9SX1JFQURZIH19JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ2Nsb3NlLWNvbW1lbnQnOiB7XG4gICAgbmFtZTogJ0FkZCBjbG9zZSBjb21tZW50JyxcbiAgICBvbjoge1xuICAgICAgcHVsbF9yZXF1ZXN0OiB7XG4gICAgICAgIHR5cGVzOiBbJ29wZW5lZCddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgICdjbG9zZS1jb21tZW50Jzoge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL2Nsb3NlLWNvbW1lbnQueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAnYWRkLWlzc3VlLXRvLXByb2plY3QnOiB7XG4gICAgbmFtZTogJ0FkZCBpc3N1ZSB0byBHaXRIdWIgcHJvamVjdCcsXG4gICAgb246IHtcbiAgICAgIGlzc3Vlczoge1xuICAgICAgICB0eXBlczogWydsYWJlbGVkJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ2FkZC1pc3N1ZS10by1wcm9qZWN0Jzoge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL2FkZC1pc3N1ZS10by1wcm9qZWN0LnltbEBtYWluJyxcbiAgICAgICAgc2VjcmV0czoge1xuICAgICAgICAgIEdIX1BST0pFQ1RfVVJMOiAnJHt7IHNlY3JldHMuR0hfUFJPSkVDVF9VUkwgfX0nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAnYWRkLXJlYWR5LWlzc3VlLXRvLXByb2plY3QnOiB7XG4gICAgbmFtZTogJ0FkZCByZWFkeSBpc3N1ZSB0byBHaXRIdWIgcHJvamVjdCcsXG4gICAgb246IHtcbiAgICAgIGlzc3Vlczoge1xuICAgICAgICB0eXBlczogWydsYWJlbGVkJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ2FkZC1yZWFkeS1pc3N1ZS10by1wcm9qZWN0Jzoge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL2FkZC1pc3N1ZS10by1wcm9qZWN0LnltbEBtYWluJyxcbiAgICAgICAgd2l0aDoge1xuICAgICAgICAgIGxhYmVsZWQ6ICdyZWFkeSA6cm9ja2V0OicsXG4gICAgICAgIH0sXG4gICAgICAgIHNlY3JldHM6IHtcbiAgICAgICAgICBHSF9QUk9KRUNUX1VSTDogJ2h0dHBzOi8vZ2l0aHViLmNvbS9vcmdzL1dpbGxCb29zdGVyTGFiL3Byb2plY3RzLzUnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxufSBhcyBjb25zdDtcblxudHlwZSBLbm93bktpbmQgPSBrZXlvZiB0eXBlb2Ygd29ya2Zsb3dzIHwgJ2RlcGxveSc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVdvcmtmbG93cyhyb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVXb3JrZmxvdycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB3b3JrZmxvd3NQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5naXRodWInLCAnd29ya2Zsb3dzJyk7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIod29ya2Zsb3dzUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICAvLyBSZW1vdmUgY29uZmlnIG9mIHNlbWFudGljIHB1bGwgcmVxdWVzdFxuICAgIGNvbnN0IHNlbWFudGljWW1sUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcuZ2l0aHViJywgJ3NlbWFudGljLnltbCcpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShzZW1hbnRpY1ltbFBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KSk7XG5cbiAgICBjb25zdCBlbnRyaWVzID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcih3b3JrZmxvd3NQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgY29uc3QgZmlsZU5hbWVTZXQgPSBuZXcgU2V0KFtcbiAgICAgICd0ZXN0LnltbCcsXG4gICAgICAnd2JmeS55bWwnLFxuICAgICAgJ3diZnktbWVyZ2UueW1sJyxcbiAgICAgICdzZW1hbnRpYy1wci55bWwnLFxuICAgICAgJ2Nsb3NlLWNvbW1lbnQueW1sJyxcbiAgICAgICdhZGQtaXNzdWUtdG8tcHJvamVjdC55bWwnLFxuICAgICAgLi4uZW50cmllcy5maWx0ZXIoKGRpcmVudCkgPT4gZGlyZW50LmlzRmlsZSgpICYmIGRpcmVudC5uYW1lLmVuZHNXaXRoKCcueW1sJykpLm1hcCgoZGlyZW50KSA9PiBkaXJlbnQubmFtZSksXG4gICAgXSk7XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLnNlbWFudGljUmVsZWFzZSkge1xuICAgICAgZmlsZU5hbWVTZXQuYWRkKCdyZWxlYXNlLnltbCcpO1xuICAgIH1cbiAgICBpZiAocm9vdENvbmZpZy5pc1B1YmxpY1JlcG8gfHwgcm9vdENvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJykpIHtcbiAgICAgIGZpbGVOYW1lU2V0LmFkZCgnYWRkLXJlYWR5LWlzc3VlLXRvLXByb2plY3QueW1sJyk7XG4gICAgICBmaWxlTmFtZVNldC5hZGQoJ25vdGlmeS1yZWFkeS55bWwnKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGZpbGVOYW1lIG9mIGZpbGVOYW1lU2V0KSB7XG4gICAgICAvLyDlrp/pmpvjga9Lbm93bktpbmTku6XlpJbjga7lgKTjgoLku6PlhaXjgZXjgozjgovjgZPjgajjgavms6jmhI9cbiAgICAgIGNvbnN0IGtpbmQgPSBwYXRoLmJhc2VuYW1lKGZpbGVOYW1lLCAnLnltbCcpIGFzIEtub3duS2luZDtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiB3cml0ZVdvcmtmbG93WWFtbChyb290Q29uZmlnLCB3b3JrZmxvd3NQYXRoLCBraW5kKSk7XG4gICAgfVxuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsICdhZGQtZm9jdXNlZC1pc3N1ZS10by1wcm9qZWN0LnltbCcpLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSlcbiAgICApO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVXb3JrZmxvd1lhbWwoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCB3b3JrZmxvd3NQYXRoOiBzdHJpbmcsIGtpbmQ6IEtub3duS2luZCk6IFByb21pc2U8dm9pZD4ge1xuICBsZXQgbmV3U2V0dGluZ3MgPSBjbG9uZURlZXAod29ya2Zsb3dzW2tpbmQgYXMga2V5b2YgdHlwZW9mIHdvcmtmbG93c10gPz8ge30pIGFzIFdvcmtmbG93O1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCBgJHtraW5kfS55bWxgKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgY29uc3Qgb2xkU2V0dGluZ3MgPSB5YW1sLmxvYWQob2xkQ29udGVudCkgYXMgV29ya2Zsb3c7XG4gICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7IGFycmF5TWVyZ2U6IGNvbWJpbmVNZXJnZSB9KSBhcyBXb3JrZmxvdztcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG5cbiAgaWYgKGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykpIHtcbiAgICBuZXdTZXR0aW5ncyA9IHtcbiAgICAgIC4uLm5ld1NldHRpbmdzLFxuICAgICAgY29uY3VycmVuY3k6IHtcbiAgICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19JyxcbiAgICAgICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IGZhbHNlLFxuICAgICAgfSxcbiAgICB9O1xuICAgIC8vIE1vdmUgam9icyB0byB0aGUgYm90dG9tXG4gICAgaWYgKG5ld1NldHRpbmdzLmpvYnMpIHtcbiAgICAgIG1vdmVUb0JvdHRvbShuZXdTZXR0aW5ncywgJ2pvYnMnKTtcbiAgICB9XG4gICAgaWYgKG5ld1NldHRpbmdzLm9uPy5wdXNoKSB7XG4gICAgICBuZXdTZXR0aW5ncy5vbi5wdXNoWydwYXRocy1pZ25vcmUnXSA9IFtcbiAgICAgICAgLi4ubmV3IFNldChbJyoqLm1kJywgJyoqL2RvY3MvKionLCAuLi4obmV3U2V0dGluZ3Mub24ucHVzaFsncGF0aHMtaWdub3JlJ10gPz8gW10pXSksXG4gICAgICBdO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3Qgam9iIG9mIE9iamVjdC52YWx1ZXMobmV3U2V0dGluZ3Muam9icykpIHtcbiAgICAvLyBJZ25vcmUgbm9uLXJldXNhYmxlIHdvcmtmbG93c1xuICAgIGlmICgham9iLnVzZXM/LmluY2x1ZGVzPy4oJy9yZXVzYWJsZS13b3JrZmxvd3MvJykpIHJldHVybjtcblxuICAgIG5vcm1hbGl6ZUpvYihjb25maWcsIGpvYiwga2luZCk7XG4gIH1cblxuICBzd2l0Y2ggKGtpbmQpIHtcbiAgICBjYXNlICdyZWxlYXNlJzoge1xuICAgICAgaWYgKG5ld1NldHRpbmdzLm9uPy5zY2hlZHVsZSkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3Mub24ucHVzaDtcbiAgICAgIH0gZWxzZSBpZiAobmV3U2V0dGluZ3Mub24/LnB1c2ggJiYgY29uZmlnLnJlbGVhc2UuYnJhbmNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBuZXdTZXR0aW5ncy5vbi5wdXNoLmJyYW5jaGVzID0gY29uZmlnLnJlbGVhc2UuYnJhbmNoZXM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBEb24ndCB1c2UgcmVsZWFzZS55bWwgaWYgcmVsZWFzZSBicmFuY2ggaXMgbm90IHNwZWNpZmllZFxuICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgJ3JlbGVhc2UueW1sJyksIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlICd0ZXN0Jzoge1xuICAgICAgLy8gRG9uJ3QgdXNlIGBwYXRocy1pZ25vcmVgIGZvciB0ZXN0IGJlY2F1c2UgR2l0SHViJ3MgQnJhbmNoIFByb3RlY3Rpb24gYW5kIFJ1bGVzZXRzIHJlcXVpcmUgam9iIHJ1bm5pbmcuXG4gICAgICBkZWxldGUgbmV3U2V0dGluZ3Mub24/LnB1bGxfcmVxdWVzdD8uWydwYXRocy1pZ25vcmUnXTtcbiAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5vbj8ucHVzaD8uWydwYXRocy1pZ25vcmUnXTtcbiAgICAgIGlmIChuZXdTZXR0aW5ncy5vbj8ucHVzaCkge1xuICAgICAgICBuZXdTZXR0aW5ncy5vbi5wdXNoLmJyYW5jaGVzID0gbmV3U2V0dGluZ3Mub24ucHVzaC5icmFuY2hlcy5maWx0ZXIoKGJyYW5jaCkgPT4gYnJhbmNoICE9PSAncmVub3ZhdGUvKionKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlICd3YmZ5Jzoge1xuICAgICAgaWYgKG5ld1NldHRpbmdzLm9uKSBzZXRTY2hlZHVsZShuZXdTZXR0aW5ncywgMjAsIDI0KTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlICd3YmZ5LW1lcmdlJzoge1xuICAgICAgc2V0U2NoZWR1bGUobmV3U2V0dGluZ3MsIDEsIDQpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIC8vIE5vIGRlZmF1bHRcbiAgfVxuICBtaWdyYXRlV29ya2Zsb3cobmV3U2V0dGluZ3MpO1xuICBhd2FpdCB3cml0ZVlhbWwobmV3U2V0dGluZ3MsIGZpbGVQYXRoKTtcblxuICBpZiAoa2luZCA9PT0gJ3JlbGVhc2UnKSB7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsICdzZW1hbnRpYy1yZWxlYXNlLnltbCcpLCB7IGZvcmNlOiB0cnVlIH0pO1xuICB9IGVsc2UgaWYgKGtpbmQgPT09ICdzeW5jJykge1xuICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAnc3luYy1pbml0LnltbCcpLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgIGlmICghbmV3U2V0dGluZ3Muam9icy5zeW5jIHx8ICFuZXdTZXR0aW5ncy5qb2JzLnN5bmMud2l0aCkgcmV0dXJuO1xuXG4gICAgLy8gR2VuZXJhdGUgc3luYy1mb3JjZS55bWwgYmFzZWQgb24gc3luYy55bWwgaWYgaXQgZXhpc3RzLlxuICAgIG5ld1NldHRpbmdzLmpvYnNbJ3N5bmMtZm9yY2UnXSA9IG5ld1NldHRpbmdzLmpvYnMuc3luYztcbiAgICBjb25zdCBwYXJhbXMgPSBuZXdTZXR0aW5ncy5qb2JzLnN5bmMud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3Q7XG4gICAgaWYgKHR5cGVvZiBwYXJhbXMgIT09ICdzdHJpbmcnKSByZXR1cm47XG5cbiAgICBuZXdTZXR0aW5ncy5qb2JzLnN5bmMud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3QgPSBgLS1mb3JjZSAke3BhcmFtc31gO1xuICAgIG5ld1NldHRpbmdzLm5hbWUgPSAnRm9yY2UgdG8gU3luYyc7XG4gICAgbmV3U2V0dGluZ3Mub24gPSB7IHdvcmtmbG93X2Rpc3BhdGNoOiBudWxsIH07XG4gICAgZGVsZXRlIG5ld1NldHRpbmdzLmpvYnMuc3luYztcbiAgICBhd2FpdCB3cml0ZVlhbWwobmV3U2V0dGluZ3MsIHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAnc3luYy1mb3JjZS55bWwnKSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplSm9iKGNvbmZpZzogUGFja2FnZUNvbmZpZywgam9iOiBKb2IsIGtpbmQ6IEtub3duS2luZCk6IHZvaWQge1xuICBqb2Iud2l0aCB8fD0ge307XG4gIGpvYi5zZWNyZXRzIHx8PSB7fTtcblxuICBpZiAoXG4gICAga2luZCA9PT0gJ3Rlc3QnIHx8XG4gICAga2luZCA9PT0gJ3JlbGVhc2UnIHx8XG4gICAga2luZCA9PT0gJ3diZnknIHx8XG4gICAga2luZCA9PT0gJ3diZnktbWVyZ2UnIHx8XG4gICAga2luZCA9PT0gJ2FkZC1pc3N1ZS10by1wcm9qZWN0JyB8fFxuICAgIGtpbmQgPT09ICdhZGQtcmVhZHktaXNzdWUtdG8tcHJvamVjdCdcbiAgKSB7XG4gICAgam9iLnNlY3JldHNbJ0dIX1RPS0VOJ10gPSBjb25maWcuaXNQdWJsaWNSZXBvID8gJyR7eyBzZWNyZXRzLlBVQkxJQ19HSF9CT1RfUEFUIH19JyA6ICcke3sgc2VjcmV0cy5HSF9CT1RfUEFUIH19JztcbiAgfVxuICBpZiAoY29uZmlnLnJlbGVhc2UubnBtICYmIChraW5kID09PSAncmVsZWFzZScgfHwga2luZCA9PT0gJ3Rlc3QnKSkge1xuICAgIGpvYi5zZWNyZXRzWydOUE1fVE9LRU4nXSA9ICcke3sgc2VjcmV0cy5OUE1fVE9LRU4gfX0nO1xuICB9XG4gIGlmIChqb2Iuc2VjcmV0c1snRklSRUJBU0VfVE9LRU4nXSkge1xuICAgIGpvYi5zZWNyZXRzWydHQ1BfU0FfS0VZX0pTT05fRk9SX0ZJUkVCQVNFJ10gPSAnJHt7IHNlY3JldHMuR0NQX1NBX0tFWV9KU09OX0ZPUl9GSVJFQkFTRSB9fSc7XG4gICAgZGVsZXRlIGpvYi5zZWNyZXRzWydGSVJFQkFTRV9UT0tFTiddO1xuICB9XG4gIGlmIChcbiAgICAoam9iLnNlY3JldHNbJ0RJU0NPUkRfV0VCSE9PS19VUkwnXSAmJiAoa2luZCA9PT0gJ3JlbGVhc2UnIHx8IGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykpKSB8fFxuICAgIChqb2Iud2l0aC5zZXJ2ZXJfdXJsICYmIGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykpXG4gICkge1xuICAgIGpvYi5zZWNyZXRzWydESVNDT1JEX1dFQkhPT0tfVVJMJ10gPSAnJHt7IHNlY3JldHMuRElTQ09SRF9XRUJIT09LX1VSTF9GT1JfUkVMRUFTRSB9fSc7XG4gIH1cblxuICBpZiAoa2luZCA9PT0gJ3N5bmMnKSB7XG4gICAgY29uc3QgcGFyYW1zID0gam9iLndpdGg/LnN5bmNfcGFyYW1zX3dpdGhvdXRfZGVzdDtcbiAgICBpZiAodHlwZW9mIHBhcmFtcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGpvYi53aXRoLnN5bmNfcGFyYW1zX3dpdGhvdXRfZGVzdCA9IHBhcmFtcy5yZXBsYWNlKCdzeW5jICcsICcnKTtcbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3Rlci8nKSkge1xuICAgIGpvYi51c2VzID0gam9iLnVzZXMucmVwbGFjZSgnV2lsbEJvb3N0ZXJMYWIvJywgJ1dpbGxCb29zdGVyLycpO1xuICB9IGVsc2UgaWYgKGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJykpIHtcbiAgICBqb2IudXNlcyA9IGpvYi51c2VzLnJlcGxhY2UoJ1dpbGxCb29zdGVyLycsICdXaWxsQm9vc3RlckxhYi8nKTtcbiAgfVxuXG4gIC8vIFJlbW92ZSByZWR1bmRhbnQgcGFyYW1ldGVyc1xuICBpZiAoam9iLndpdGhbJ2RvdF9lbnZfcGF0aCddID09PSAnLmVudicpIHtcbiAgICBkZWxldGUgam9iLndpdGhbJ2RvdF9lbnZfcGF0aCddO1xuICB9XG4gIC8vIFJlbW92ZSBkZXByZWNhdGVkIHBhcmFtZXRlcnNcbiAgbWlncmF0ZUpvYihqb2IpO1xuXG4gIC8vIERvbid0IHVzZSBgZmx5IGRlcGxveSAtLWpzb25gIHNpbmNlIGl0IGNhdXNlcyBhbiBlcnJvclxuICBpZiAoa2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSAmJiBqb2Iuc2VjcmV0c1snRkxZX0FQSV9UT0tFTiddICYmIHR5cGVvZiBqb2Iud2l0aFsnZGVwbG95X2NvbW1hbmQnXSA9PT0gJ3N0cmluZycpIHtcbiAgICBqb2Iud2l0aFsnZGVwbG95X2NvbW1hbmQnXSA9IGpvYi53aXRoWydkZXBsb3lfY29tbWFuZCddLnJlcGxhY2UoL1xccystLWpzb24vLCAnJyk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNEb2NrZXJmaWxlKSB7XG4gICAgaWYgKGpvYi53aXRoWydjaV9zaXplJ10gIT09ICdleHRyYS1sYXJnZScgJiYgKGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykgfHwga2luZC5zdGFydHNXaXRoKCd0ZXN0JykpKSB7XG4gICAgICBqb2Iud2l0aFsnY2lfc2l6ZSddID0gJ2xhcmdlJztcbiAgICB9XG4gICAgaWYgKGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykpIHtcbiAgICAgIGpvYi53aXRoWydjcHVfYXJjaCddID0gJ1g2NCc7XG4gICAgfVxuICB9XG4gIC8vIEJlY2F1c2UgZ2l0aHViLmV2ZW50LnJlcG9zaXRvcnkucHJpdmF0ZSBpcyBhbHdheXMgdHJ1ZSBpZiBqb2IgaXMgc2NoZWR1bGVkXG4gIGlmIChraW5kID09PSAncmVsZWFzZScgfHwga2luZCA9PT0gJ3Rlc3QnIHx8IGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykpIHtcbiAgICBpZiAoY29uZmlnLmlzUHVibGljUmVwbykge1xuICAgICAgam9iLndpdGhbJ2dpdGh1Yl9ob3N0ZWRfcnVubmVyJ10gPSB0cnVlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBkZWxldGUgam9iLndpdGhbJ2dpdGh1Yl9ob3N0ZWRfcnVubmVyJ107XG4gIH1cblxuICBpZiAoT2JqZWN0LmtleXMoam9iLndpdGgpLmxlbmd0aCA+IDApIHtcbiAgICBzb3J0S2V5cyhqb2Iud2l0aCk7XG4gIH0gZWxzZSB7XG4gICAgZGVsZXRlIGpvYi53aXRoO1xuICB9XG4gIGlmIChPYmplY3Qua2V5cyhqb2Iuc2VjcmV0cykubGVuZ3RoID4gMCkge1xuICAgIC8vIE1vdmUgc2VjcmV0cyBwcm9wIGFmdGVyIHdpdGggcHJvcFxuICAgIGNvbnN0IG5ld1NlY3JldHMgPSBzb3J0S2V5cyhqb2Iuc2VjcmV0cyk7XG4gICAgZGVsZXRlIGpvYi5zZWNyZXRzO1xuICAgIGpvYi5zZWNyZXRzID0gbmV3U2VjcmV0cztcbiAgfSBlbHNlIHtcbiAgICBkZWxldGUgam9iLnNlY3JldHM7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2V0U2NoZWR1bGUobmV3U2V0dGluZ3M6IFdvcmtmbG93LCBpbmNsdXNpdmVNaW5Ib3VySnN0OiBudW1iZXIsIGV4Y2x1c2l2ZU1heEhvdXJKc3Q6IG51bWJlcik6IHZvaWQge1xuICBjb25zdCBbbWludXRlVXRjLCBob3VyVXRjXSA9ICgobmV3U2V0dGluZ3Mub24uc2NoZWR1bGU/LlswXT8uY3JvbiBhcyBzdHJpbmcpIHx8ICcnKS5zcGxpdCgnICcpLm1hcChOdW1iZXIpO1xuICBpZiAobWludXRlVXRjICE9PSAwICYmIE51bWJlci5pc0ludGVnZXIoaG91clV0YykpIHtcbiAgICBjb25zdCBob3VySnN0ID0gKGhvdXJVdGMgKyA5KSAlIDI0O1xuICAgIGNvbnN0IGluUmFuZ2UgPVxuICAgICAgaW5jbHVzaXZlTWluSG91ckpzdCA8IGV4Y2x1c2l2ZU1heEhvdXJKc3RcbiAgICAgICAgPyBpbmNsdXNpdmVNaW5Ib3VySnN0IDw9IGhvdXJKc3QgJiYgaG91ckpzdCA8IGV4Y2x1c2l2ZU1heEhvdXJKc3RcbiAgICAgICAgOiBpbmNsdXNpdmVNaW5Ib3VySnN0IDw9IGhvdXJKc3QgfHwgaG91ckpzdCA8IGV4Y2x1c2l2ZU1heEhvdXJKc3Q7XG4gICAgaWYgKGluUmFuZ2UpIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IG1pbkpzdCA9IDEgKyBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiA1OSk7XG4gIGNvbnN0IGhvdXJKc3QgPSBpbmNsdXNpdmVNaW5Ib3VySnN0ICsgTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKGV4Y2x1c2l2ZU1heEhvdXJKc3QgLSBpbmNsdXNpdmVNaW5Ib3VySnN0KSk7XG4gIGNvbnN0IGNyb24gPSBgJHttaW5Kc3R9ICR7KGhvdXJKc3QgLSA5ICsgMjQpICUgMjR9ICogKiAqYDtcbiAgbmV3U2V0dGluZ3Mub24uc2NoZWR1bGUgPSBbeyBjcm9uIH1dO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZVlhbWwobmV3U2V0dGluZ3M6IFdvcmtmbG93LCBmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHlhbWxUZXh0ID0geWFtbC5kdW1wKG5ld1NldHRpbmdzLCB7IGxpbmVXaWR0aDogLTEsIG5vQ29tcGF0TW9kZTogdHJ1ZSwgc3R5bGVzOiB7ICchIW51bGwnOiAnZW1wdHknIH0gfSk7XG4gIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShmaWxlUGF0aCwgeWFtbFRleHQpO1xufVxuXG5mdW5jdGlvbiBtaWdyYXRlV29ya2Zsb3cobmV3U2V0dGluZ3M6IFdvcmtmbG93KTogdm9pZCB7XG4gIC8vIFRPRE86IFJlbW92ZSB0aGVtIGFmdGVyIDIwMjMtMDMtMzFcbiAgZGVsZXRlIG5ld1NldHRpbmdzLmpvYnNbJ2FkZC10by1wcm9qZWN0J107XG59XG5cbmZ1bmN0aW9uIG1pZ3JhdGVKb2Ioam9iOiBKb2IpOiB2b2lkIHtcbiAgLy8gVE9ETzogUmVtb3ZlIHRoZW0gYWZ0ZXIgMjAyMy0wMy0zMVxuICBpZiAoIWpvYi53aXRoKSByZXR1cm47XG4gIGRlbGV0ZSBqb2Iud2l0aFsnbm9uX3NlbGZfaG9zdGVkJ107XG4gIGRlbGV0ZSBqb2Iud2l0aFsnbm90aWZ5X2Rpc2NvcmQnXTtcbiAgZGVsZXRlIGpvYi53aXRoWydyZXF1aXJlX2ZseSddO1xuICBkZWxldGUgam9iLndpdGhbJ3JlcXVpcmVfZ2Nsb3VkJ107XG4gIGRlbGV0ZSBqb2Iud2l0aFsnY3B1X2FyY2gnXTtcbiAgZGVsZXRlIGpvYi53aXRoWydsYWJlbCddO1xuICBkZWxldGUgam9iLndpdGhbJ2xhYmVsT3BlcmF0b3InXTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgQ29uZmlndXJhdGlvblZhbHVlTWFwIH0gZnJvbSAnQHlhcm5wa2cvY29yZSc7XG5pbXBvcnQgeWFtbCBmcm9tICdqcy15YW1sJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMsIHNwYXduU3luY1dpdGhTdHJpbmdSZXN1bHQgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuXG5pbnRlcmZhY2UgU2V0dGluZ3MgZXh0ZW5kcyBQYXJ0aWFsPENvbmZpZ3VyYXRpb25WYWx1ZU1hcD4ge1xuICBkZWZhdWx0U2VtdmVyUmFuZ2VQcmVmaXg6IHN0cmluZztcbiAgbm1Nb2RlOiBzdHJpbmc7XG4gIG5vZGVMaW5rZXI6IHN0cmluZztcbiAgcGx1Z2lucz86IFBsdWdpbltdO1xufVxuXG5pbnRlcmZhY2UgUGx1Z2luIHtcbiAgY2hlY2tzdW06IHN0cmluZztcbiAgcGF0aDogc3RyaW5nO1xuICBzcGVjOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVlhcm5yY1ltbChjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVlhcm5yY1ltbCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB5YXJucmNZbWxQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm5yYy55bWwnKTtcbiAgICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oeWFybnJjWW1sUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgICAgZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm4nKSwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgICApO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICAgIGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3lhcm4ubG9jaycpLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSlcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudFZlcnNpb24gPSBzcGF3blN5bmNXaXRoU3RyaW5nUmVzdWx0KCd5YXJuJywgWyctLXZlcnNpb24nXSwgY29uZmlnLmRpclBhdGgpO1xuICAgIGNvbnN0IGxhdGVzdFZlcnNpb24gPSBnZXRMYXRlc3RWZXJzaW9uKCdAeWFybnBrZy9jbGknLCBjb25maWcuZGlyUGF0aCk7XG4gICAgaWYgKGdldE1ham9yTnVtYmVyKGN1cnJlbnRWZXJzaW9uKSA8PSBnZXRNYWpvck51bWJlcihsYXRlc3RWZXJzaW9uKSAmJiBjdXJyZW50VmVyc2lvbiAhPT0gbGF0ZXN0VmVyc2lvbikge1xuICAgICAgc3Bhd25TeW5jKCd5YXJuJywgWydzZXQnLCAndmVyc2lvbicsIGxhdGVzdFZlcnNpb25dLCBjb25maWcuZGlyUGF0aCwgMSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVsZWFzZXNQYXRoID0gcGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm4nLCAncmVsZWFzZXMnKTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihyZWxlYXNlc1BhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGZvciAoY29uc3QgZmlsZSBvZiBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKHJlbGVhc2VzUGF0aCkpIHtcbiAgICAgIGlmIChmaWxlLnN0YXJ0c1dpdGgoJ3lhcm4tJykgJiYgIWZpbGUuc3RhcnRzV2l0aChgeWFybi0ke2xhdGVzdFZlcnNpb259LmApKSB7XG4gICAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4ocmVsZWFzZXNQYXRoLCBmaWxlKSkpO1xuICAgICAgICBjb25zb2xlLmxvZygnUmVtb3ZlZCcsIHBhdGguam9pbihyZWxlYXNlc1BhdGgsIGZpbGUpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB5YXJucmNQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm5yYycpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybSh5YXJucmNQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKTtcblxuICAgIGNvbnN0IHNldHRpbmdzID0geWFtbC5sb2FkKGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHlhcm5yY1ltbFBhdGgsICd1dGY4JykpIGFzIFNldHRpbmdzO1xuICAgIHNldHRpbmdzLmRlZmF1bHRTZW12ZXJSYW5nZVByZWZpeCA9ICcnO1xuICAgIHNldHRpbmdzLm5vZGVMaW5rZXIgPSAnbm9kZS1tb2R1bGVzJztcbiAgICBzZXR0aW5ncy5ubU1vZGUgPSAnaGFyZGxpbmtzLWdsb2JhbCc7XG4gICAgZGVsZXRlIHNldHRpbmdzLmNvbXByZXNzaW9uTGV2ZWw7XG4gICAgaWYgKHNldHRpbmdzLmluamVjdEVudmlyb25tZW50RmlsZXM/Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgZGVsZXRlIHNldHRpbmdzLmluamVjdEVudmlyb25tZW50RmlsZXM7XG4gICAgfVxuICAgIC8vIGNmLiBodHRwczovL2dpdGh1Yi5jb20veWFybnBrZy9iZXJyeS9wdWxsLzQ2OThcbiAgICBzZXR0aW5ncy5lbmFibGVHbG9iYWxDYWNoZSA9IHRydWU7XG4gICAgY29uc3Qgb3JpZ2luYWxMZW5ndGggPSBzZXR0aW5ncy5wbHVnaW5zPy5sZW5ndGggPz8gMDtcbiAgICBzZXR0aW5ncy5wbHVnaW5zID0gc2V0dGluZ3MucGx1Z2lucz8uZmlsdGVyKChwKSA9PiBwLnBhdGggIT09ICcueWFybi9wbHVnaW5zL3VuZGVmaW5lZC5janMnKSA/PyBbXTtcbiAgICBpZiAoc2V0dGluZ3MucGx1Z2lucy5sZW5ndGggIT09IG9yaWdpbmFsTGVuZ3RoKSB7XG4gICAgICBjb25zdCBwbHVnaW5QYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm5yYycsICd1bmRlZmluZWQuY2pzJyk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGx1Z2luUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgfVxuICAgIGlmIChzZXR0aW5ncy5wbHVnaW5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZGVsZXRlIHNldHRpbmdzLnBsdWdpbnM7XG4gICAgfVxuICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZSh5YXJucmNZbWxQYXRoLCB5YW1sLmR1bXAoc2V0dGluZ3MsIHsgbGluZVdpZHRoOiAtMSB9KSk7XG5cbiAgICBzcGF3blN5bmMoJ3lhcm4nLCBbJ2RseCcsICd5YXJuLXBsdWdpbi1hdXRvLWluc3RhbGwnXSwgY29uZmlnLmRpclBhdGgpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldExhdGVzdFZlcnNpb24ocGFja2FnZU5hbWU6IHN0cmluZywgZGlyUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgdmVyc2lvbnNKc29uID0gc3Bhd25TeW5jV2l0aFN0cmluZ1Jlc3VsdCgnbnBtJywgWydzaG93JywgcGFja2FnZU5hbWUsICd2ZXJzaW9ucycsICctLWpzb24nXSwgZGlyUGF0aCk7XG4gIGNvbnN0IHZlcnNpb25zID0gSlNPTi5wYXJzZSh2ZXJzaW9uc0pzb24pIGFzIHN0cmluZ1tdO1xuICByZXR1cm4gdmVyc2lvbnMuYXQoLTEpIGFzIHN0cmluZztcbn1cbmZ1bmN0aW9uIGdldE1ham9yTnVtYmVyKHZlcnNpb246IHN0cmluZyk6IG51bWJlciB7XG4gIGNvbnN0IFttYWpvcl0gPSB2ZXJzaW9uLnNwbGl0KCcuJyk7XG4gIHJldHVybiBOdW1iZXIobWFqb3IpO1xufVxuIiwiaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2l0SHViVXRpbCwgaGFzR2l0SHViVG9rZW4sIG9jdG9raXQgfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwTGFiZWxzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ3NldHVwTGFiZWxzJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghaGFzR2l0SHViVG9rZW4pIHJldHVybjtcblxuICAgIGNvbnN0IFtvd25lciwgcmVwb10gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUoY29uZmlnLnJlcG9zaXRvcnkgPz8gJycpO1xuICAgIGlmICghb3duZXIgfHwgIXJlcG8pIHJldHVybjtcbiAgICBpZiAob3duZXIgIT09ICdXaWxsQm9vc3RlcicgJiYgb3duZXIgIT09ICdXaWxsQm9vc3RlckxhYicpIHJldHVybjtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAnZDE6IHgtZWFzeSA6aGVkZ2Vob2c6JywgJ0VERTlGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ2QyOiBlYXN5IDpyYWJiaXQyOicsICdEREQ2RkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdkMzogbWVkaXVtIDpveDonLCAnQzRCNUZEJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAnZDQ6IGhhcmQgOnNxdWlkOicsICdBNzhCRkEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdkNTogeC1oYXJkIDp3aGFsZTI6JywgJzhCNUNGNicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3AxOiBjcml0aWNhbCA6ZmlyZTo6ZmlyZTo6ZmlyZTonLCAnRUY0NDQ0Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAncDI6IHVyZ2VudCA6ZmlyZTo6ZmlyZTonLCAnRjg3MTcxJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAncDM6IGltcG9ydGFudCA6ZmlyZTonLCAnRkNBNUE1Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAncDQ6IG5pY2UgdG8gaGF2ZSA6ZHJvcGxldDonLCAnRkVDQUNBJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAncjogYmxpdHonLCAnNTMwMGJjJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAncjogZmlyZWJhc2UnLCAnZmZjYTI4Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAncjogcHJpc21hJywgJzBjMzQ0YicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3I6IHJlYWN0JywgJzYxZGFmYicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3I6IHN2ZWx0ZScsICdmZjNlMDAnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdyOiBzZW1hbnRpYy1yZWxlYXNlJywgJzQ5NDk0OScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3JlYWR5IDpyb2NrZXQ6JywgJzIyQzU1RScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3JldmlldyByZXF1ZXN0ZWQgOm1hZzonLCAnRkJDQTA0Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAncmVsZWFzZWQgOmJvb2ttYXJrOicsICc2MzY2RjEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdzOiAwLjVoIDpjbG9jazEyMzA6JywgJ0YzRjRGNicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3M6IDFoIDpjbG9jazE6JywgJ0U1RTdFQicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3M6IDJoIDpjbG9jazI6JywgJ0QxRDVEQicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3M6IDNoIDpjbG9jazM6JywgJzlDQTNBRicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3M6IDVoIDpjbG9jazU6JywgJzZCNzI4MCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3M6IDhoIDpjbG9jazg6JywgJzRCNTU2MycpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3M6IDEzaCA6Y2xvY2sxOicsICczNzQxNTEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICd0OiBidWlsZCA6aGFtbWVyOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICd0OiBjaG9yZSA6YnJvb206JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3Q6IGNpIDpjb25zdHJ1Y3Rpb25fd29ya2VyOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICd0OiBkb2NzIDptZW1vOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICd0OiBmZWF0IDpzcGFya2xlczonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAndDogZml4IDpidWc6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3Q6IHBlcmYgOnphcDonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAndDogcmVmYWN0b3IgOnJlY3ljbGU6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3Q6IHN0eWxlIDpsaXBzdGljazonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAndDogdGVzdCA6dGVzdF90dWJlOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdwcm9qZWN0JywgJzI0MjkyRicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ2ZvY3VzZWQgOmRhcnQ6JywgJzIyQzU1RScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ2FpLXByIDpyb2JvdDonLCAnMDBCNEQ4Jyk7XG5cbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG93bmVyLCByZXBvLCAnYnVnJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvd25lciwgcmVwbywgJ2RvY3VtZW50YXRpb24nKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG93bmVyLCByZXBvLCAnZHVwbGljYXRlJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvd25lciwgcmVwbywgJ2VuaGFuY2VtZW50Jyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvd25lciwgcmVwbywgJ2dvb2QgZmlyc3QgaXNzdWUnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG93bmVyLCByZXBvLCAnaGVscCB3YW50ZWQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG93bmVyLCByZXBvLCAnaW52YWxpZCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob3duZXIsIHJlcG8sICdxdWVzdGlvbicpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob3duZXIsIHJlcG8sICd3b250Zml4Jyk7XG5cbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG93bmVyLCByZXBvLCAncmVhZHknKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG93bmVyLCByZXBvLCAncmV2aWV3IHJlcXVlc3RlZCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob3duZXIsIHJlcG8sICdyZWxlYXNlZCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob3duZXIsIHJlcG8sICdzZW1hbnRpYy1yZWxlYXNlJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvd25lciwgcmVwbywgJ2xsbS1wciA6cm9ib3Q6Jyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybignU2tpcCBzZXR1cExhYmVscyBkdWUgdG86JywgKGVycm9yIGFzIEVycm9yKT8uc3RhY2sgPz8gZXJyb3IpO1xuICAgIH1cbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNldHVwTGFiZWwob3duZXI6IHN0cmluZywgcmVwbzogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIGNvbG9yOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ1BPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVscycsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIG5hbWUsXG4gICAgICBjb2xvcixcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vbGFiZWxzL3tuYW1lfScsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIG5hbWUsXG4gICAgICBjb2xvcixcbiAgICB9KTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBkZWxldGVMYWJlbChvd25lcjogc3RyaW5nLCByZXBvOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHMve25hbWV9Jywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgbmFtZSxcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBpbXBvcnQteC9uby1uYW1lZC1hcy1kZWZhdWx0LW1lbWJlciAqL1xuXG5pbXBvcnQgZG90ZW52IGZyb20gJ2RvdGVudic7XG5pbXBvcnQgc29kaXVtIGZyb20gJ2xpYnNvZGl1bS13cmFwcGVycyc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdpdEh1YlV0aWwsIGhhc0dpdEh1YlRva2VuLCBvY3Rva2l0IH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmNvbnN0IGRlcHJlY2F0ZWRTZWNyZXROYW1lcyA9IFsnUkVBRFlfRElTQ09SRF9XRUJIT09LX1VSTCddO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0dXBTZWNyZXRzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ3NldHVwU2VjcmV0cycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWhhc0dpdEh1YlRva2VuIHx8ICFvcHRpb25zLmRvZXNVcGxvYWRFbnZWYXJzKSByZXR1cm47XG5cbiAgICBjb25zdCBbb3duZXIsIHJlcG9dID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGNvbmZpZy5yZXBvc2l0b3J5ID8/ICcnKTtcbiAgICBpZiAoIW93bmVyIHx8ICFyZXBvIHx8IG93bmVyICE9PSAnV2lsbEJvb3N0ZXJMYWInKSByZXR1cm47XG5cbiAgICBjb25zdCBwYXJzZWQgPSBkb3RlbnYuY29uZmlnKCkucGFyc2VkIHx8IHt9O1xuICAgIGlmIChPYmplY3Qua2V5cyhwYXJzZWQpLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgdHJ5IHtcbiAgICAgIGZvciAoY29uc3Qgc2VjcmV0TmFtZSBvZiBkZXByZWNhdGVkU2VjcmV0TmFtZXMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ0RFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9zZWNyZXRzL3tzZWNyZXRfbmFtZX0nLCB7XG4gICAgICAgICAgICBvd25lcixcbiAgICAgICAgICAgIHJlcG8sXG4gICAgICAgICAgICBzZWNyZXRfbmFtZTogc2VjcmV0TmFtZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gZG8gbm90aGluZ1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvc2VjcmV0cy9wdWJsaWMta2V5Jywge1xuICAgICAgICBvd25lcixcbiAgICAgICAgcmVwbyxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgeyBrZXksIGtleV9pZDoga2V5SWQgfSA9IHJlc3BvbnNlLmRhdGE7XG5cbiAgICAgIGF3YWl0IHNvZGl1bS5yZWFkeTtcblxuICAgICAgZm9yIChjb25zdCBbbmFtZSwgc2VjcmV0XSBvZiBPYmplY3QuZW50cmllcyhwYXJzZWQpKSB7XG4gICAgICAgIGlmIChjb25maWcuaXNQdWJsaWNSZXBvICYmIG5hbWUgPT09ICdHSF9CT1RfUEFUJykgY29udGludWU7XG4gICAgICAgIGlmICghY29uZmlnLmlzUHVibGljUmVwbyAmJiBuYW1lID09PSAnUFVCTElDX0dIX0JPVF9QQVQnKSBjb250aW51ZTtcblxuICAgICAgICAvLyBDb252ZXJ0IFNlY3JldCAmIEJhc2U2NCBrZXkgdG8gVWludDhBcnJheS5cbiAgICAgICAgY29uc3QgcmF3S2V5ID0gc29kaXVtLmZyb21fYmFzZTY0KGtleSwgc29kaXVtLmJhc2U2NF92YXJpYW50cy5PUklHSU5BTCk7XG4gICAgICAgIGNvbnN0IHJhd1NlYyA9IHNvZGl1bS5mcm9tX3N0cmluZyhzZWNyZXQpO1xuXG4gICAgICAgIC8vIEVuY3J5cHQgdGhlIHNlY3JldCB1c2luZyBMaWJTb2RpdW1cbiAgICAgICAgY29uc3QgZW5jQnl0ZXMgPSBzb2RpdW0uY3J5cHRvX2JveF9zZWFsKHJhd1NlYywgcmF3S2V5KTtcblxuICAgICAgICAvLyBDb252ZXJ0IGVuY3J5cHRlZCBVaW50OEFycmF5IHRvIEJhc2U2NFxuICAgICAgICBjb25zdCBlbmNCYXNlNjQgPSBzb2RpdW0udG9fYmFzZTY0KGVuY0J5dGVzLCBzb2RpdW0uYmFzZTY0X3ZhcmlhbnRzLk9SSUdJTkFMKTtcblxuICAgICAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ1BVVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9zZWNyZXRzL3tzZWNyZXRfbmFtZX0nLCB7XG4gICAgICAgICAgb3duZXIsXG4gICAgICAgICAgcmVwbyxcbiAgICAgICAgICBzZWNyZXRfbmFtZTogbmFtZSxcbiAgICAgICAgICBlbmNyeXB0ZWRfdmFsdWU6IGVuY0Jhc2U2NCxcbiAgICAgICAgICBrZXlfaWQ6IGtleUlkLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKCdTa2lwIHNldHVwU2VjcmV0cyBkdWUgdG86JywgKGVycm9yIGFzIEVycm9yKT8uc3RhY2sgPz8gZXJyb3IpO1xuICAgIH1cbiAgfSk7XG59XG4iLCJpbXBvcnQgeyB3aXRoUmV0cnkgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYic7XG5cbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2l0SHViVXRpbCwgb2N0b2tpdCB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0dXBHaXRIdWJTZXR0aW5ncyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgW293bmVyLCByZXBvXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShjb25maWcucmVwb3NpdG9yeSA/PyAnJyk7XG4gIGlmICghb3duZXIgfHwgIXJlcG8pIHJldHVybjtcbiAgaWYgKG93bmVyICE9PSAnV2lsbEJvb3N0ZXInICYmIG93bmVyICE9PSAnV2lsbEJvb3N0ZXJMYWInKSByZXR1cm47XG5cbiAgYXdhaXQgd2l0aFJldHJ5KCgpID0+XG4gICAgb2N0b2tpdC5yZXF1ZXN0KCdQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30nLCB7XG4gICAgICBvd25lcixcbiAgICAgIHJlcG8sXG4gICAgICBhbGxvd19tZXJnZV9jb21taXQ6IGZhbHNlLFxuICAgICAgYWxsb3dfc3F1YXNoX21lcmdlOiB0cnVlLFxuICAgICAgYWxsb3dfcmViYXNlX21lcmdlOiBmYWxzZSxcbiAgICAgIGRlbGV0ZV9icmFuY2hfb25fbWVyZ2U6IHRydWUsXG4gICAgICBzcXVhc2hfbWVyZ2VfY29tbWl0X3RpdGxlOiAnUFJfVElUTEUnLFxuICAgICAgc3F1YXNoX21lcmdlX2NvbW1pdF9tZXNzYWdlOiAnQkxBTksnLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAnWC1HaXRIdWItQXBpLVZlcnNpb24nOiAnMjAyMi0xMS0yOCcsXG4gICAgICB9LFxuICAgICAgLi4uKGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXIvJykgPyB7IGFsbG93X2F1dG9fbWVyZ2U6IHRydWUgfSA6IHt9KSxcbiAgICB9KVxuICApO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgZGlzdGFuY2UgfSBmcm9tICdmYXN0ZXN0LWxldmVuc2h0ZWluJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCB0ZW1wbGF0ZXMgPSB7XG4gICdwdWxsX3JlcXVlc3RfdGVtcGxhdGUubWQnOiBgXG5DbG9zZSAjPElzc3VlTnVtYmVyPlxuXG4jIyBTZWxmIENoZWNrXG5cbi0gWyBdIEkndmUgY29uZmlybWVkIFxcYEFsbCBjaGVja3MgaGF2ZSBwYXNzZWRcXGAgb24gdGhpcyBwYWdlLlxuICAtIFBSIHRpdGxlIGZvbGxvd3MgW0FuZ3VsYXIncyBjb21taXQgbWVzc2FnZSBmb3JtYXRdKGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvYmxvYi9tYWluL0NPTlRSSUJVVElORy5tZCMtY29tbWl0LW1lc3NhZ2UtZm9ybWF0KS5cbiAgLSBQUiB0aXRsZSBkb2Vzbid0IGhhdmUgXFxgV0lQOlxcYC5cbiAgLSBUaGUgdGVzdCBjb21tYW5kIChlLmcuLCBcXGB5YXJuIHRlc3RcXGApIHBhc3NlZC5cbiAgLSBUaGUgbGludCBjb21tYW5kIChlLmcuLCBcXGB5YXJuIGxpbnRcXGApIHBhc3NlZC5cbiAgLSBZb3UgbWF5IGxlYXZlIHRoaXMgYm94IHVuY2hlY2tlZCBkdWUgdG8gbG9uZyB3b3JrZmxvd3MuXG4tIFsgXSBJJ3ZlIHJldmlld2VkIG15IGNoYW5nZXMgb24gdGhlIEdpdEh1YiBkaWZmIHZpZXcuXG4tIFsgXSBJJ3ZlIHdyaXR0ZW4gdGhlIHN0ZXBzIHRvIHRlc3QgbXkgY2hhbmdlcy5cbi0gWyBdIEkndmUgYWRkZWQgc2NyZWVuc2hvdHMgKGlmIHRoZSBVSSBjaGFuZ2VkKS5cbiAgLSBZb3UgbWF5IGxlYXZlIHRoaXMgYm94IHVuY2hlY2tlZCBpZiB5b3UgZGlkbid0IG1vZGlmeSB0aGUgVUkuXG5cbjwhLS0gUGxlYXNlIGFkZCBzY3JlZW5zaG90cyBpZiB5b3UgbW9kaWZ5IHRoZSBVSS5cbnwgQ3VycmVudCAgICAgICAgICAgICAgICAgIHwgSW4gY29taW5nICAgICAgICAgICAgICAgIHxcbnwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHxcbnwgPGltZyBzcmM9XCJcIiB3aWR0aD1cIjQwMFwiPiB8IDxpbWcgc3JjPVwiXCIgd2lkdGg9XCI0MDBcIj4gfFxuLS0+XG5cbjwhLS0gUGxlYXNlIGFkZCBzdGVwcyB0byB0ZXN0IHlvdXIgY2hhbmdlcy5cbiMjIFN0ZXBzIHRvIFRlc3RcblxuMS4gT3BlbiBodHRwOi8vbG9jYWxob3N0LWV4ZXJjb2RlLndpbGxib29zdGVyLm5ldDozMDAwL2phLUpQL2NvdXJzZXMvX2V4YW1wbGUvbGVzc29ucy9fZXhhbXBsZV9hX3BsdXNfYi9wcm9ibGVtcy9fZXhhbXBsZV9hX3BsdXNfYiBhZnRlciBsb2dpbi5cbjIuIFNlbGVjdCB0aGUgbGFuZ3VhZ2UgXFxgQ1xcYC5cbjMuIFdyaXRlIHRoZSBmb2xsb3dpbmcgY29kZTpcbiAgIFxcYFxcYFxcYGNcbiAgICNpbmNsdWRlIDxzdGRpby5oPlxuXG4gICBpbnQgbWFpbih2b2lkKSB7XG4gICAgIGludCBhLCBiO1xuXG4gICAgIHNjYW5mKFwiJWQgJWRcIiwgJmEsICZiKTtcbiAgICAgcHJpbnRmKFwiJWRcIiwgYSArIGIpO1xuICAgICByZXR1cm4gMDtcbiAgIH1cbiAgIFxcYFxcYFxcYFxuNC4gUHVzaCBcXGBTdWJtaXRcXGAgYnV0dG9uLlxuNS4gLi4uXG4tLT5cbmAudHJpbSgpLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlR2l0SHViVGVtcGxhdGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlR2l0SHViVGVtcGxhdGVzJywgYXN5bmMgKCkgPT4ge1xuICAgIGZvciAoY29uc3QgW2ZpbGVOYW1lLCBuZXdDb250ZW50XSBvZiBPYmplY3QuZW50cmllcyh0ZW1wbGF0ZXMpKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRodWInLCBmaWxlTmFtZSk7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHtcbiAgICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgICBpZiAoZGlzdGFuY2Uob2xkQ29udGVudCwgbmV3Q29udGVudCkgPiBuZXdDb250ZW50Lmxlbmd0aCAvIDIpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aHViJyksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgICB9XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IGZzcCBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuaW1wb3J0IHsgc2ltcGxlR2l0IH0gZnJvbSAnc2ltcGxlLWdpdCc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcbmltcG9ydCB7IHogfSBmcm9tICd6b2QnO1xuXG5pbXBvcnQgeyBnaXRIdWJVdGlsLCBvY3Rva2l0IH0gZnJvbSAnLi91dGlscy9naXRodWJVdGlsLmpzJztcbmltcG9ydCB7IGdsb2JJZ25vcmUgfSBmcm9tICcuL3V0aWxzL2dsb2JVdGlsLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBQYWNrYWdlQ29uZmlnIHtcbiAgZGlyUGF0aDogc3RyaW5nO1xuICBkb2NrZXJmaWxlOiBzdHJpbmc7XG4gIGlzUm9vdDogYm9vbGVhbjtcbiAgaXNQdWJsaWNSZXBvOiBib29sZWFuO1xuICBpc1JlZmVycmVkQnlPdGhlclJlcG86IGJvb2xlYW47XG4gIHJlcG9zaXRvcnk/OiBzdHJpbmc7XG4gIGlzQnVuOiBib29sZWFuO1xuICBpc0VzbVBhY2thZ2U6IGJvb2xlYW47XG4gIGlzV2lsbEJvb3N0ZXJDb25maWdzOiBib29sZWFuO1xuICBkb2VzQ29udGFpbnNTdWJQYWNrYWdlSnNvbnM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluc0RvY2tlcmZpbGU6IGJvb2xlYW47XG4gIGRvZXNDb250YWluc0dlbWZpbGU6IGJvb2xlYW47XG4gIGRvZXNDb250YWluc0dvTW9kOiBib29sZWFuO1xuICBkb2VzQ29udGFpbnNQYWNrYWdlSnNvbjogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5zUG9ldHJ5TG9jazogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5zUG9tWG1sOiBib29sZWFuO1xuICBkb2VzQ29udGFpbnNQdWJzcGVjWWFtbDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5zVGVtcGxhdGVZYW1sOiBib29sZWFuO1xuICBkb2VzQ29udGFpbnNWc2NvZGVTZXR0aW5nc0pzb246IGJvb2xlYW47XG5cbiAgZG9lc0NvbnRhaW5zSmF2YVNjcmlwdDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5zVHlwZVNjcmlwdDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5zSnN4T3JUc3g6IGJvb2xlYW47XG4gIGRvZXNDb250YWluc0phdmFTY3JpcHRJblBhY2thZ2VzOiBib29sZWFuO1xuICBkb2VzQ29udGFpbnNUeXBlU2NyaXB0SW5QYWNrYWdlczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5zSnN4T3JUc3hJblBhY2thZ2VzOiBib29sZWFuO1xuICBkZXBlbmRpbmc6IHtcbiAgICBibGl0ejogYm9vbGVhbjtcbiAgICBmaXJlYmFzZTogYm9vbGVhbjtcbiAgICBnZW5JMThuVHM6IGJvb2xlYW47XG4gICAgbGl0ZXN0cmVhbTogYm9vbGVhbjtcbiAgICBuZXh0OiBib29sZWFuO1xuICAgIHBsYXl3cmlnaHRUZXN0OiBib29sZWFuO1xuICAgIHByaXNtYTogYm9vbGVhbjtcbiAgICBweXJpZ2h0OiBib29sZWFuO1xuICAgIHJlYWN0TmF0aXZlOiBib29sZWFuO1xuICAgIHNlbWFudGljUmVsZWFzZTogYm9vbGVhbjtcbiAgICBzdG9yeWJvb2s6IGJvb2xlYW47XG4gICAgd2I6IGJvb2xlYW47XG4gIH07XG4gIHJlbGVhc2U6IHtcbiAgICBicmFuY2hlczogc3RyaW5nW107XG4gICAgZ2l0aHViOiBib29sZWFuO1xuICAgIG5wbTogYm9vbGVhbjtcbiAgfTtcbiAgZXNsaW50QmFzZT86IEVzbGludEV4dGVuc2lvbkJhc2U7XG4gIHZlcnNpb25zVGV4dD86IHN0cmluZztcbiAgcGFja2FnZUpzb24/OiBQYWNrYWdlSnNvbjtcbiAgd2JmeUpzb24/OiBXYmZ5SnNvbjtcbn1cblxudHlwZSBXYmZ5SnNvbiA9IHouaW5mZXI8dHlwZW9mIHdiZnlKc29uU2NoZW1hPjtcblxuY29uc3Qgd2JmeUpzb25TY2hlbWEgPSB6Lm9iamVjdCh7XG4gIHR5cG9zOiB6XG4gICAgLm9iamVjdCh7XG4gICAgICBhbGw6IHoucmVjb3JkKHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgICBkb2M6IHoucmVjb3JkKHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgICB0czogei5yZWNvcmQoei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICAgIHRleHQ6IHoucmVjb3JkKHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgfSlcbiAgICAub3B0aW9uYWwoKSxcbn0pO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UGFja2FnZUNvbmZpZyhcbiAgZGlyUGF0aDogc3RyaW5nLFxuICByb290Q29uZmlnPzogUGFja2FnZUNvbmZpZ1xuKTogUHJvbWlzZTxQYWNrYWdlQ29uZmlnIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIHRyeSB7XG4gICAgY29uc3QgZG9lc0NvbnRhaW5zUGFja2FnZUpzb24gPSBmcy5leGlzdHNTeW5jKHBhY2thZ2VKc29uUGF0aCk7XG4gICAgbGV0IGRlcGVuZGVuY2llczogUGFja2FnZUpzb25bJ2RlcGVuZGVuY2llcyddID0ge307XG4gICAgbGV0IGRldkRlcGVuZGVuY2llczogUGFja2FnZUpzb25bJ2RldkRlcGVuZGVuY2llcyddID0ge307XG4gICAgbGV0IHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiA9IHt9O1xuICAgIGxldCBlc21QYWNrYWdlID0gZmFsc2U7XG4gICAgaWYgKGRvZXNDb250YWluc1BhY2thZ2VKc29uKSB7XG4gICAgICBjb25zdCBwYWNrYWdlSnNvblRleHQgPSBmcy5yZWFkRmlsZVN5bmMocGFja2FnZUpzb25QYXRoLCAndXRmOCcpO1xuICAgICAgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKHBhY2thZ2VKc29uVGV4dCkgYXMgUGFja2FnZUpzb247XG4gICAgICBkZXBlbmRlbmNpZXMgPSBwYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge307XG4gICAgICBkZXZEZXBlbmRlbmNpZXMgPSBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gICAgICBlc21QYWNrYWdlID0gcGFja2FnZUpzb24udHlwZSA9PT0gJ21vZHVsZSc7XG4gICAgfVxuXG4gICAgbGV0IHJlbGVhc2VCcmFuY2hlczogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgcmVsZWFzZVBsdWdpbnM6IHN0cmluZ1tdID0gW107XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlbGVhc2VyY0pzb25QYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICcucmVsZWFzZXJjLmpzb24nKTtcbiAgICAgIGNvbnN0IGpzb24gPSBKU09OLnBhcnNlKGF3YWl0IGZzcC5yZWFkRmlsZShyZWxlYXNlcmNKc29uUGF0aCwgJ3V0ZjgnKSkgYXNcbiAgICAgICAgfCB7XG4gICAgICAgICAgICBicmFuY2hlczogc3RyaW5nW107XG4gICAgICAgICAgICBwbHVnaW5zPzogc3RyaW5nW11bXTtcbiAgICAgICAgICB9XG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgcmVsZWFzZUJyYW5jaGVzID0ganNvbj8uYnJhbmNoZXMgfHwgW107XG4gICAgICByZWxlYXNlUGx1Z2lucyA9IGpzb24/LnBsdWdpbnM/LmZsYXQoKSB8fCBbXTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICBjb25zdCBpc1Jvb3QgPVxuICAgICAgcGF0aC5iYXNlbmFtZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy4uJykpICE9PSAncGFja2FnZXMnIHx8XG4gICAgICAhZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy4uJywgJy4uJywgJ3BhY2thZ2UuanNvbicpKTtcblxuICAgIGxldCByZXBvSW5mbzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgaWYgKGlzUm9vdCkge1xuICAgICAgcmVwb0luZm8gPSBhd2FpdCBmZXRjaFJlcG9JbmZvKGRpclBhdGgsIHBhY2thZ2VKc29uKTtcbiAgICB9XG5cbiAgICBsZXQgdmVyc2lvbnNUZXh0ID0gJyc7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmc3AucmVhZEZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsICcudG9vbC12ZXJzaW9ucycpLCAndXRmOCcpO1xuICAgICAgdmVyc2lvbnNUZXh0ICs9IGNvbnRlbnQudHJpbSgpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtwcmVmaXgsIG5hbWVdIG9mIFtcbiAgICAgIFsnamF2YScsICdqYXZhJ10sXG4gICAgICBbJ25vZGUnLCAnbm9kZWpzJ10sXG4gICAgICBbJ3B5dGhvbicsICdweXRob24nXSxcbiAgICBdKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBub2RlVmVyc2lvbkNvbnRlbnQgPSBhd2FpdCBmc3AucmVhZEZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsIGAuJHtwcmVmaXh9LXZlcnNpb25gKSwgJ3V0ZjgnKTtcbiAgICAgICAgaWYgKHZlcnNpb25zVGV4dCkge1xuICAgICAgICAgIHZlcnNpb25zVGV4dCArPSAnXFxuJztcbiAgICAgICAgfVxuICAgICAgICB2ZXJzaW9uc1RleHQgKz0gbmFtZSArICcgJyArIG5vZGVWZXJzaW9uQ29udGVudC50cmltKCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gZG8gbm90aGluZ1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBkb2NrZXJmaWxlID0gJyc7XG4gICAgdHJ5IHtcbiAgICAgIGRvY2tlcmZpbGUgPSBhd2FpdCBmc3AucmVhZEZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsICdEb2NrZXJmaWxlJyksICd1dGY4Jyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgLy8gUmVhZCB3YmZ5Lmpzb25cbiAgICBjb25zdCB3YmZ5SnNvblBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3diZnkuanNvbicpO1xuICAgIGxldCB3YmZ5SnNvbjogV2JmeUpzb24gfCB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHdiZnlKc29uVGV4dCA9IGF3YWl0IGZzcC5yZWFkRmlsZSh3YmZ5SnNvblBhdGgsICd1dGY4Jyk7XG4gICAgICB3YmZ5SnNvbiA9IHdiZnlKc29uU2NoZW1hLnBhcnNlKEpTT04ucGFyc2Uod2JmeUpzb25UZXh0KSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgY29uc3QgY29uZmlnOiBQYWNrYWdlQ29uZmlnID0ge1xuICAgICAgZGlyUGF0aCxcbiAgICAgIGRvY2tlcmZpbGUsXG4gICAgICBpc1Jvb3QsXG4gICAgICBpc1B1YmxpY1JlcG86IHJlcG9JbmZvPy5wcml2YXRlID09PSBmYWxzZSxcbiAgICAgIGlzUmVmZXJyZWRCeU90aGVyUmVwbzogISFwYWNrYWdlSnNvbi5maWxlcyxcbiAgICAgIHJlcG9zaXRvcnk6IHJlcG9JbmZvPy5mdWxsX25hbWUgPyBgZ2l0aHViOiR7cmVwb0luZm8uZnVsbF9uYW1lIGFzIHN0cmluZ31gIDogdW5kZWZpbmVkLFxuICAgICAgaXNCdW46IHJvb3RDb25maWc/LmlzQnVuIHx8IGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGRpclBhdGgsICdidW5maWcudG9tbCcpKSxcbiAgICAgIGlzRXNtUGFja2FnZTogZXNtUGFja2FnZSxcbiAgICAgIGlzV2lsbEJvb3N0ZXJDb25maWdzOiBwYWNrYWdlSnNvblBhdGguaW5jbHVkZXMoYCR7cGF0aC5zZXB9d2lsbGJvb3N0ZXItY29uZmlnc2ApLFxuICAgICAgZG9lc0NvbnRhaW5zU3ViUGFja2FnZUpzb25zOiBjb250YWluc0FueSgncGFja2FnZXMvKiovcGFja2FnZS5qc29uJywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbnNEb2NrZXJmaWxlOiAhIWRvY2tlcmZpbGUgfHwgZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2RvY2tlci1jb21wb3NlLnltbCcpKSxcbiAgICAgIGRvZXNDb250YWluc0dlbWZpbGU6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdHZW1maWxlJykpLFxuICAgICAgZG9lc0NvbnRhaW5zR29Nb2Q6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdnby5tb2QnKSksXG4gICAgICBkb2VzQ29udGFpbnNQYWNrYWdlSnNvbjogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSxcbiAgICAgIGRvZXNDb250YWluc1BvZXRyeUxvY2s6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwb2V0cnkubG9jaycpKSxcbiAgICAgIGRvZXNDb250YWluc1BvbVhtbDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BvbS54bWwnKSksXG4gICAgICBkb2VzQ29udGFpbnNQdWJzcGVjWWFtbDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3B1YnNwZWMueWFtbCcpKSxcbiAgICAgIGRvZXNDb250YWluc1RlbXBsYXRlWWFtbDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3RlbXBsYXRlLnlhbWwnKSksXG4gICAgICBkb2VzQ29udGFpbnNWc2NvZGVTZXR0aW5nc0pzb246IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICcudnNjb2RlJywgJ3NldHRpbmdzLmpzb24nKSksXG4gICAgICBkb2VzQ29udGFpbnNKYXZhU2NyaXB0OiBjb250YWluc0FueSgne2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjanMsbWpzLGpzLGpzeH0nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluc1R5cGVTY3JpcHQ6IGNvbnRhaW5zQW55KCd7YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2N0cyxtdHMsdHMsdHN4fScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5zSnN4T3JUc3g6IGNvbnRhaW5zQW55KCd7YXBwLHNyYyx0ZXN0fS8qKi8qLnt0LGp9c3gnLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluc0phdmFTY3JpcHRJblBhY2thZ2VzOiBjb250YWluc0FueShcbiAgICAgICAgJ3BhY2thZ2VzLyoqL3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3h9JyxcbiAgICAgICAgZGlyUGF0aFxuICAgICAgKSxcbiAgICAgIGRvZXNDb250YWluc1R5cGVTY3JpcHRJblBhY2thZ2VzOiBjb250YWluc0FueShcbiAgICAgICAgJ3BhY2thZ2VzLyoqL3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y3RzLG10cyx0cyx0c3h9JyxcbiAgICAgICAgZGlyUGF0aFxuICAgICAgKSxcbiAgICAgIGRvZXNDb250YWluc0pzeE9yVHN4SW5QYWNrYWdlczogY29udGFpbnNBbnkoJ3BhY2thZ2VzLyoqL3thcHAsc3JjLHRlc3R9LyoqLyoue3Qsan1zeCcsIGRpclBhdGgpLFxuICAgICAgZGVwZW5kaW5nOiB7XG4gICAgICAgIGJsaXR6OiAhIWRlcGVuZGVuY2llc1snYmxpdHonXSxcbiAgICAgICAgZmlyZWJhc2U6ICEhZGV2RGVwZW5kZW5jaWVzWydmaXJlYmFzZS10b29scyddLFxuICAgICAgICBnZW5JMThuVHM6ICEhZGV2RGVwZW5kZW5jaWVzWydnZW4taTE4bi10cyddLFxuICAgICAgICBsaXRlc3RyZWFtOiBkb2NrZXJmaWxlLmluY2x1ZGVzKCdpbnN0YWxsLWxpdGVzdHJlYW0uc2gnKSxcbiAgICAgICAgbmV4dDogISFkZXBlbmRlbmNpZXNbJ25leHQnXSxcbiAgICAgICAgcGxheXdyaWdodFRlc3Q6XG4gICAgICAgICAgISFkZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXSB8fFxuICAgICAgICAgICEhZGV2RGVwZW5kZW5jaWVzWydAcGxheXdyaWdodC90ZXN0J10gfHxcbiAgICAgICAgICAhIWRldkRlcGVuZGVuY2llc1sncGxheXdyaWdodCddLFxuICAgICAgICBwcmlzbWE6ICEhZGVwZW5kZW5jaWVzWydAcHJpc21hL2NsaWVudCddIHx8ICEhZGV2RGVwZW5kZW5jaWVzWydwcmlzbWEnXSxcbiAgICAgICAgcHlyaWdodDogISFkZXZEZXBlbmRlbmNpZXNbJ3B5cmlnaHQnXSxcbiAgICAgICAgcmVhY3ROYXRpdmU6ICEhZGVwZW5kZW5jaWVzWydyZWFjdC1uYXRpdmUnXSxcbiAgICAgICAgc2VtYW50aWNSZWxlYXNlOiAhIShcbiAgICAgICAgICBkZXZEZXBlbmRlbmNpZXNbJ3NlbWFudGljLXJlbGVhc2UnXSB8fFxuICAgICAgICAgIHJlbGVhc2VCcmFuY2hlcy5sZW5ndGggPiAwIHx8XG4gICAgICAgICAgcmVsZWFzZVBsdWdpbnMubGVuZ3RoID4gMFxuICAgICAgICApLFxuICAgICAgICBzdG9yeWJvb2s6ICEhZGV2RGVwZW5kZW5jaWVzWydAc3Rvcnlib29rL3JlYWN0J10sXG4gICAgICAgIHdiOiAhIWRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3diJ10gfHwgISFkZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci93YiddLFxuICAgICAgfSxcbiAgICAgIHJlbGVhc2U6IHtcbiAgICAgICAgYnJhbmNoZXM6IHJlbGVhc2VCcmFuY2hlcyxcbiAgICAgICAgZ2l0aHViOiByZWxlYXNlUGx1Z2lucy5pbmNsdWRlcygnQHNlbWFudGljLXJlbGVhc2UvZ2l0aHViJyksXG4gICAgICAgIG5wbTogcmVsZWFzZVBsdWdpbnMuaW5jbHVkZXMoJ0BzZW1hbnRpYy1yZWxlYXNlL25wbScpLFxuICAgICAgfSxcbiAgICAgIHZlcnNpb25zVGV4dCxcbiAgICAgIHBhY2thZ2VKc29uLFxuICAgICAgd2JmeUpzb24sXG4gICAgfTtcbiAgICBpZiAoIWNvbmZpZy5pc0J1bikge1xuICAgICAgY29uZmlnLmVzbGludEJhc2UgPSBnZXRFc2xpbnRFeHRlbnNpb25CYXNlKGNvbmZpZyk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbnNHZW1maWxlIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5zR29Nb2QgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbnNQYWNrYWdlSnNvbiB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluc1BvZXRyeUxvY2sgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbnNQb21YbWwgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbnNQdWJzcGVjWWFtbCB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluc1RlbXBsYXRlWWFtbFxuICAgICkge1xuICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5mdW5jdGlvbiBjb250YWluc0FueShwYXR0ZXJuOiBzdHJpbmcsIGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZmcuZ2xvYlN5bmMocGF0dGVybiwgeyBkb3Q6IHRydWUsIGN3ZDogZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH0pLmxlbmd0aCA+IDA7XG59XG5cbmV4cG9ydCB0eXBlIEVzbGludEV4dGVuc2lvbkJhc2UgPVxuICB8ICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cy1yZWFjdCdcbiAgfCAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMnXG4gIHwgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzLXJlYWN0J1xuICB8ICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcydcbiAgfCAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctbmV4dCc7XG5cbmZ1bmN0aW9uIGdldEVzbGludEV4dGVuc2lvbkJhc2UoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogRXNsaW50RXh0ZW5zaW9uQmFzZSB8IHVuZGVmaW5lZCB7XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLm5leHQpIHtcbiAgICByZXR1cm4gJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLW5leHQnO1xuICB9IGVsc2UgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0KSB7XG4gICAgcmV0dXJuIGNvbmZpZy5kb2VzQ29udGFpbnNKc3hPclRzeCA/ICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cy1yZWFjdCcgOiAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMnO1xuICB9IGVsc2Uge1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zSnN4T3JUc3gpIHtcbiAgICAgIHJldHVybiAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMtcmVhY3QnO1xuICAgIH0gZWxzZSBpZiAoY29uZmlnLmRvZXNDb250YWluc0phdmFTY3JpcHQpIHtcbiAgICAgIHJldHVybiAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMnO1xuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaFJlcG9JbmZvKGRpclBhdGg6IHN0cmluZywgcGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBnaXQgPSBzaW1wbGVHaXQoZGlyUGF0aCk7XG4gIGNvbnN0IHJlbW90ZXMgPSBhd2FpdCBnaXQuZ2V0UmVtb3Rlcyh0cnVlKTtcbiAgY29uc3Qgb3JpZ2luID0gcmVtb3Rlcy5maW5kKChyKSA9PiByLm5hbWUgPT09ICdvcmlnaW4nKTtcbiAgY29uc3QgcmVtb3RlVXJsID0gb3JpZ2luPy5yZWZzPy5mZXRjaCA/PyBvcmlnaW4/LnJlZnM/LnB1c2g7XG4gIGlmICh0eXBlb2YgcmVtb3RlVXJsID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXF1ZXN0UmVwb0luZm8ocmVtb3RlVXJsKTtcbiAgICBpZiAoanNvbikgcmV0dXJuIGpzb247XG4gIH1cblxuICBjb25zdCB1cmwgPSB0eXBlb2YgcGFja2FnZUpzb24ucmVwb3NpdG9yeSA9PT0gJ3N0cmluZycgPyBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5IDogcGFja2FnZUpzb24ucmVwb3NpdG9yeT8udXJsO1xuICBpZiAodXJsKSB7XG4gICAgY29uc3QganNvbiA9IGF3YWl0IHJlcXVlc3RSZXBvSW5mbyh1cmwpO1xuICAgIGlmIChqc29uICYmIGpzb24ubWVzc2FnZSAhPT0gJ05vdCBGb3VuZCcpIHJldHVybiBqc29uO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlcXVlc3RSZXBvSW5mbyh1cmxPckZ1bGxOYW1lOiBzdHJpbmcpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IFtvcmcsIG5hbWVdID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKHVybE9yRnVsbE5hbWUpO1xuICBpZiAoIW9yZyB8fCAhbmFtZSkgcmV0dXJuO1xuXG4gIGNvbnN0IHJldCA9IHsgZnVsbF9uYW1lOiBgJHtvcmd9LyR7bmFtZX1gIH07XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ0dFVCAvcmVwb3Mve293bmVyfS97cmVwb30nLCB7XG4gICAgICBvd25lcjogb3JnLFxuICAgICAgcmVwbzogbmFtZSxcbiAgICB9KTtcbiAgICBPYmplY3QuYXNzaWduKHJldCwgcmVzcG9uc2UuZGF0YSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgaWdub3JlRXJyb3JBc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliJztcbmltcG9ydCB5YXJncyBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpeERvY2tlcmZpbGUgfSBmcm9tICcuL2ZpeGVycy9kb2NrZXJmaWxlLmpzJztcbmltcG9ydCB7IGZpeFBsYXl3cmlnaHRDb25maWcgfSBmcm9tICcuL2ZpeGVycy9wbGF5d3JpZ2h0Q29uZmlnLmpzJztcbmltcG9ydCB7IGZpeFByaXNtYUVudkZpbGVzIH0gZnJvbSAnLi9maXhlcnMvcHJpc21hLmpzJztcbmltcG9ydCB7IGZpeFRlc3REaXJlY3Rvcmllc1VwZGF0aW5nUGFja2FnZUpzb24gfSBmcm9tICcuL2ZpeGVycy90ZXN0RGlyZWN0b3J5LmpzJztcbmltcG9ydCB7IGZpeFR5cGVEZWZpbml0aW9ucyB9IGZyb20gJy4vZml4ZXJzL3R5cGVEZWZpbml0aW9uLmpzJztcbmltcG9ydCB7IGZpeFR5cG9zIH0gZnJvbSAnLi9maXhlcnMvdHlwb3MuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9hZ2VudHMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVUb29sVmVyc2lvbnMgfSBmcm9tICcuL2dlbmVyYXRvcnMvYXNkZi5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUJpb21lSnNvbmMgfSBmcm9tICcuL2dlbmVyYXRvcnMvYmlvbWUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVCdW5maWdUb21sIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2J1bmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZURvY2tlcmlnbm9yZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9kb2NrZXJpZ25vcmUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVFZGl0b3Jjb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvZWRpdG9yY29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlRXNsaW50cmMgfSBmcm9tICcuL2dlbmVyYXRvcnMvZXNsaW50Q29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2VtaW5pQ29uZmlnIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dlbWluaUNvbmZpZy5qcyc7XG5pbXBvcnQgeyByZW1vdmVHZW1pbmlTZXR0aW5ncyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9nZW1pbmlTZXR0aW5ncy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMgfSBmcm9tICcuL2dlbmVyYXRvcnMvZ2l0YXR0cmlidXRlcy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUdpdGlnbm9yZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9naXRpZ25vcmUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVIdXNreXJjVXBkYXRpbmdQYWNrYWdlSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9odXNreXJjLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlSWRlYVNldHRpbmdzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2lkZWEuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVMZWZ0aG9va1VwZGF0aW5nUGFja2FnZUpzb24gfSBmcm9tICcuL2dlbmVyYXRvcnMvbGVmdGhvb2suanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVMaW50c3RhZ2VkcmMgfSBmcm9tICcuL2dlbmVyYXRvcnMvbGludHN0YWdlZHJjLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlTmV4dENvbmZpZ0pzb24gfSBmcm9tICcuL2dlbmVyYXRvcnMvbmV4dGNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVBhY2thZ2VKc29uIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3BhY2thZ2VKc29uLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUHJldHRpZXJpZ25vcmUgfSBmcm9tICcuL2dlbmVyYXRvcnMvcHJldHRpZXJpZ25vcmUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9weXJpZ2h0Y29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUmVhZG1lIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3JlYWRtZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJlbGVhc2VyYyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9yZWxlYXNlcmMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVSZW5vdmF0ZUpzb24gfSBmcm9tICcuL2dlbmVyYXRvcnMvcmVub3ZhdGVKc29uLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlVHNjb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvdHNjb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyB9IGZyb20gJy4vZ2VuZXJhdG9ycy92c2NvZGVTZXR0aW5ncy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVdvcmtmbG93cyB9IGZyb20gJy4vZ2VuZXJhdG9ycy93b3JrZmxvdy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVlhcm5yY1ltbCB9IGZyb20gJy4vZ2VuZXJhdG9ycy95YXJucmMuanMnO1xuaW1wb3J0IHsgc2V0dXBMYWJlbHMgfSBmcm9tICcuL2dpdGh1Yi9sYWJlbC5qcyc7XG5pbXBvcnQgeyBzZXR1cFNlY3JldHMgfSBmcm9tICcuL2dpdGh1Yi9zZWNyZXQuanMnO1xuaW1wb3J0IHsgc2V0dXBHaXRIdWJTZXR0aW5ncyB9IGZyb20gJy4vZ2l0aHViL3NldHRpbmdzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2l0SHViVGVtcGxhdGVzIH0gZnJvbSAnLi9naXRodWIvdGVtcGxhdGUuanMnO1xuaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgeyBnZXRQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMgfSBmcm9tICcuL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5cbmFzeW5jIGZ1bmN0aW9uIG1haW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGFyZ3YgPSBhd2FpdCB5YXJncyhwcm9jZXNzLmFyZ3Yuc2xpY2UoMikpXG4gICAgLmNvbW1hbmQoJyQwIFtwYXRocy4uXScsICdNYWtlIGEgZ2l2ZW4gcHJvamVjdCBmb2xsb3cgdGhlIFdpbGxCb29zdGVyIHN0YW5kYXJkJywgKHlhcmdzKSA9PiB7XG4gICAgICB5YXJncy5wb3NpdGlvbmFsKCdwYXRocycsIHtcbiAgICAgICAgZGVzY3JpYmU6ICdwcm9qZWN0IHBhdGhzIHRvIGJlIHdiZmllZCcsXG4gICAgICAgIGFycmF5OiB0cnVlLFxuICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgZGVmYXVsdDogWycuJ10sXG4gICAgICB9KTtcbiAgICB9KVxuICAgIC5vcHRpb25zKHtcbiAgICAgIGVudjoge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ1VwbG9hZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXMgc2VjcmV0cyB0byBHaXRIdWInLFxuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICBhbGlhczogJ2UnLFxuICAgICAgfSxcbiAgICAgIHNraXBEZXBzOiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiAnU2tpcCBkZXBlbmRlbmN5IGluc3RhbGxhdGlvbicsXG4gICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgIGFsaWFzOiAnZCcsXG4gICAgICB9LFxuICAgICAgdmVyYm9zZToge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgb3Igbm90IHRvIGVuYWJsZSB2ZXJib3NlIG1vZGUnLFxuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICBhbGlhczogJ3YnLFxuICAgICAgfSxcbiAgICB9KVxuICAgIC5zdHJpY3QoKS5hcmd2O1xuICBvcHRpb25zLmlzVmVyYm9zZSA9IGFyZ3YudmVyYm9zZTtcbiAgb3B0aW9ucy5kb2VzVXBsb2FkRW52VmFycyA9IGFyZ3YuZW52O1xuXG4gIGZvciAoY29uc3Qgcm9vdERpclBhdGggb2YgYXJndi5wYXRocyBhcyBzdHJpbmdbXSkge1xuICAgIGNvbnN0IHBhY2thZ2VzRGlyUGF0aCA9IHBhdGguam9pbihyb290RGlyUGF0aCwgJ3BhY2thZ2VzJyk7XG4gICAgY29uc3QgZGlyZW50cyA9IChhd2FpdCBpZ25vcmVFcnJvckFzeW5jKCgpID0+IGZzLnByb21pc2VzLnJlYWRkaXIocGFja2FnZXNEaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpKSA/PyBbXTtcbiAgICBjb25zdCBzdWJEaXJQYXRocyA9IGRpcmVudHMuZmlsdGVyKChkKSA9PiBkLmlzRGlyZWN0b3J5KCkpLm1hcCgoZCkgPT4gcGF0aC5qb2luKHBhY2thZ2VzRGlyUGF0aCwgZC5uYW1lKSk7XG5cbiAgICBhd2FpdCBmaXhUZXN0RGlyZWN0b3JpZXNVcGRhdGluZ1BhY2thZ2VKc29uKFtyb290RGlyUGF0aCwgLi4uc3ViRGlyUGF0aHNdKTtcblxuICAgIGNvbnN0IHJvb3RDb25maWcgPSBhd2FpdCBnZXRQYWNrYWdlQ29uZmlnKHJvb3REaXJQYXRoKTtcbiAgICBjb25zb2xlLmxvZygncm9vdENvbmZpZzonLCByb290Q29uZmlnKTtcbiAgICBpZiAoIXJvb3RDb25maWcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYHRoZXJlIGlzIG5vIHZhbGlkIHBhY2thZ2UuanNvbiBpbiAke3Jvb3REaXJQYXRofWApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGFiYnJldmlhdGlvblByb21pc2UgPSBmaXhUeXBvcyhyb290Q29uZmlnKTtcblxuICAgIGNvbnN0IG51bGxhYmxlU3ViUGFja2FnZUNvbmZpZ3MgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHN1YkRpclBhdGhzLm1hcCgoc3ViRGlyUGF0aCkgPT4gZ2V0UGFja2FnZUNvbmZpZyhzdWJEaXJQYXRoLCByb290Q29uZmlnKSlcbiAgICApO1xuICAgIGNvbnN0IHN1YlBhY2thZ2VDb25maWdzID0gbnVsbGFibGVTdWJQYWNrYWdlQ29uZmlncy5maWx0ZXIoKGNvbmZpZykgPT4gISFjb25maWcpO1xuICAgIGNvbnN0IGFsbFBhY2thZ2VDb25maWdzID0gW3Jvb3RDb25maWcsIC4uLnN1YlBhY2thZ2VDb25maWdzXTtcblxuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgZm9yIChjb25zdCBjb25maWcgb2YgYWxsUGFja2FnZUNvbmZpZ3MpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGNvbmZpZyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSW5zdGFsbCB0b29scyB2aWEgYXNkZiBhdCBmaXJzdFxuICAgIGF3YWl0IGdlbmVyYXRlVG9vbFZlcnNpb25zKHJvb3RDb25maWcpO1xuICAgIC8vIEluc3RhbGwgeWFybiBiZXJyeVxuICAgIGF3YWl0IGdlbmVyYXRlWWFybnJjWW1sKHJvb3RDb25maWcpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIGZpeERvY2tlcmZpbGUocm9vdENvbmZpZyksXG4gICAgICBmaXhQcmlzbWFFbnZGaWxlcyhyb290Q29uZmlnKSxcbiAgICAgIGFiYnJldmlhdGlvblByb21pc2UudGhlbigoKSA9PiBnZW5lcmF0ZVJlYWRtZShyb290Q29uZmlnKSksXG4gICAgICBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zKHJvb3RDb25maWcsIGFsbFBhY2thZ2VDb25maWdzKSxcbiAgICAgIGdlbmVyYXRlRG9ja2VyaWdub3JlKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVFZGl0b3Jjb25maWcocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUdlbWluaUNvbmZpZyhyb290Q29uZmlnKSxcbiAgICAgIHJlbW92ZUdlbWluaVNldHRpbmdzKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUlkZWFTZXR0aW5ncyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlUmVub3ZhdGVKc29uKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVSZWxlYXNlcmMocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZVdvcmtmbG93cyhyb290Q29uZmlnKSxcbiAgICAgIHNldHVwTGFiZWxzKHJvb3RDb25maWcpLFxuICAgICAgc2V0dXBTZWNyZXRzKHJvb3RDb25maWcpLFxuICAgICAgc2V0dXBHaXRIdWJTZXR0aW5ncyhyb290Q29uZmlnKSxcbiAgICAgIC4uLihyb290Q29uZmlnLmlzQnVuXG4gICAgICAgID8gW1xuICAgICAgICAgICAgZ2VuZXJhdGVCdW5maWdUb21sKHJvb3RDb25maWcpLFxuICAgICAgICAgICAgZ2VuZXJhdGVIdXNreXJjVXBkYXRpbmdQYWNrYWdlSnNvbihyb290Q29uZmlnKS50aGVuKCgpID0+IGdlbmVyYXRlTGVmdGhvb2tVcGRhdGluZ1BhY2thZ2VKc29uKHJvb3RDb25maWcpKSxcbiAgICAgICAgICBdXG4gICAgICAgIDogW2dlbmVyYXRlSHVza3lyY1VwZGF0aW5nUGFja2FnZUpzb24ocm9vdENvbmZpZyldKSxcbiAgICAgIGdlbmVyYXRlTGludHN0YWdlZHJjKHJvb3RDb25maWcpLFxuICAgIF0pO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcblxuICAgIGNvbnN0IHByb21pc2VzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGNvbmZpZyBvZiBhbGxQYWNrYWdlQ29uZmlncykge1xuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGZpeFR5cGVEZWZpbml0aW9ucyhjb25maWcsIGNvbmZpZy5pc1Jvb3QgPyBhbGxQYWNrYWdlQ29uZmlncyA6IFtjb25maWddKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0VGVzdCkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGZpeFBsYXl3cmlnaHRDb25maWcoY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVOZXh0Q29uZmlnSnNvbihjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IGdlbmVyYXRlR2l0aWdub3JlKGNvbmZpZywgcm9vdENvbmZpZyk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG4gICAgICBpZiAoIWNvbmZpZy5pc1Jvb3QgJiYgIWNvbmZpZy5kb2VzQ29udGFpbnNQYWNrYWdlSnNvbikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IGdlbmVyYXRlUHJldHRpZXJpZ25vcmUoY29uZmlnKTtcbiAgICAgIGF3YWl0IGdlbmVyYXRlUGFja2FnZUpzb24oY29uZmlnLCByb290Q29uZmlnLCBhcmd2LnNraXBEZXBzKTtcblxuICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZUxpbnRzdGFnZWRyYyhjb25maWcpKTtcbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zVnNjb2RlU2V0dGluZ3NKc29uICYmIGNvbmZpZy5kb2VzQ29udGFpbnNQYWNrYWdlSnNvbikge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlVnNjb2RlU2V0dGluZ3MoY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHRJblBhY2thZ2VzKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVUc2NvbmZpZyhjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgY29uZmlnLmRvZXNDb250YWluc0phdmFTY3JpcHQgfHxcbiAgICAgICAgY29uZmlnLmRvZXNDb250YWluc0phdmFTY3JpcHRJblBhY2thZ2VzIHx8XG4gICAgICAgIGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0IHx8XG4gICAgICAgIGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0SW5QYWNrYWdlc1xuICAgICAgKSB7XG4gICAgICAgIGlmIChyb290Q29uZmlnLmlzQnVuKSB7XG4gICAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZUJpb21lSnNvbmMoY29uZmlnKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFyb290Q29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzKSB7XG4gICAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZUVzbGludHJjKGNvbmZpZykpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5weXJpZ2h0KSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbihjb25maWcpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcblxuICAgIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gcm9vdENvbmZpZy5pc0J1biA/ICdidW4nIDogJ3lhcm4nO1xuICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydjbGVhbnVwJ10sIHJvb3REaXJQYXRoKTtcbiAgICAvLyAneWFybiBpbnN0YWxsJyBzaG91bGQgYmUgYWZ0ZXIgYHlhcm4gY2xlYW51cGAgYmVjYXVzZSB5YXJuIGJlcnJ5IGdlbmVyYXRlcyB5YXJuLmxvY2tcbiAgICAvLyBjb3JyZXNwb25kaW5nIHRvIHRoZSBjb250ZW50cyBvZiBkZXBlbmRhbnQgc3ViLXBhY2thZ2UgaW4gbW9ub3JlcG9cbiAgICBpZiAocm9vdENvbmZpZy5pc0J1bikge1xuICAgICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ3VwZGF0ZSddLCByb290RGlyUGF0aCk7XG4gICAgICAvLyBUT0RPOiBSZW1vdmUgdGhlIGZvbGxvd2luZyBsaW5lIGFmdGVyIHRoZXJlIGlzIG5vIGJ1bi5sb2NrYlxuICAgICAgY29uc3QgYnVuTG9ja2JQYXRoID0gcGF0aC5qb2luKHJvb3REaXJQYXRoLCAnYnVuLmxvY2tiJyk7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhidW5Mb2NrYlBhdGgpKSB7XG4gICAgICAgIHZvaWQgZnMucHJvbWlzZXMucm0oYnVuTG9ja2JQYXRoKTtcbiAgICAgICAgc3Bhd25TeW5jKFxuICAgICAgICAgIHBhY2thZ2VNYW5hZ2VyLFxuICAgICAgICAgIFsnaW5zdGFsbCcsICctLXNhdmUtdGV4dC1sb2NrZmlsZScsICctLWZyb3plbi1sb2NrZmlsZScsICctLWxvY2tmaWxlLW9ubHknXSxcbiAgICAgICAgICByb290RGlyUGF0aFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnaW5zdGFsbCddLCByb290RGlyUGF0aCk7XG4gICAgfVxuICB9XG59XG5cbmF3YWl0IG1haW4oKTtcbiJdLCJuYW1lcyI6WyJvcHRpb25zIiwiY29uc3RydWN0b3IiLCJ0aGlzIiwiaXNWZXJib3NlIiwiZG9lc1VwbG9hZEVudlZhcnMiLCJsb2dnZXIiLCJmdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uIiwibmFtZSIsImZ1bmMiLCJjb25zb2xlIiwiaW5mbyIsImVycm9yIiwiRXJyb3IiLCJzdGFjayIsIlN0cmluZyIsImFzeW5jIiwiZml4RG9ja2VyZmlsZSIsImNvbmZpZyIsImRvZXNDb250YWluc0RvY2tlcmZpbGUiLCJvbGRDb250ZW50IiwiZG9ja2VyZmlsZSIsIm5ld0NvbnRlbnQiLCJmcyIsIndyaXRlRmlsZSIsInBhdGgiLCJqb2luIiwiZGlyUGF0aCIsImZpeFBsYXl3cmlnaHRDb25maWciLCJmaWxlUGF0aCIsImV4aXN0c1N5bmMiLCJwcm9taXNlcyIsInJlYWRGaWxlIiwicmVwbGFjZSIsImdsb2JJZ25vcmUiLCJmaXhQcmlzbWFFbnZGaWxlcyIsImVudkZpbGVzIiwiZmciLCJnbG9iIiwiZG90IiwiY3dkIiwiaWdub3JlIiwiZW52RmlsZSIsImVudkZpbGVQYXRoIiwicmVzb2x2ZSIsImZpeFRlc3REaXJlY3Rvcmllc1VwZGF0aW5nUGFja2FnZUpzb24iLCJwYWNrYWdlRGlyUGF0aHMiLCJQcm9taXNlIiwiYWxsIiwibWFwIiwibmV3VGVzdERpclBhdGgiLCJwYWNrYWdlRGlyUGF0aCIsIm9sZFRlc3REaXJOYW1lIiwib2xkVGVzdERpclBhdGgiLCJyZW5hbWUiLCJyZXBsYWNlQWxsIiwicHJvbWlzZVBvb2wiLCJQcm9taXNlUG9vbCIsImZpeFR5cGVEZWZpbml0aW9ucyIsImNvbmZpZ3NJbmNsdWRpbmdDaGlsZHJlbiIsImxpYlR5cGVEaXJQYXRoIiwic3JjVHlwZURpclBhdGgiLCJpc1Jvb3QiLCJkb2VzQ29udGFpbnNTdWJQYWNrYWdlSnNvbnMiLCJ1bmRlZmluZWQiLCJkaXJlbnRzIiwiaWdub3JlRW5vZW50QXN5bmMiLCJyZWFkZGlyIiwid2l0aEZpbGVUeXBlcyIsImRpcmVudCIsImRpck5hbWUiLCJzbGljZSIsImhhc1R5cGVEZWNsYXJhdGlvbkV4dGVuc2lvbiIsImVuZHNXaXRoIiwicGFja2FnZU5hbWUiLCJpbmNsdWRlcyIsImhhc0xpYnJhcnkiLCJzb21lIiwicGFja2FnZUpzb24iLCJkZXBlbmRlbmNpZXMiLCJkZXZEZXBlbmRlbmNpZXMiLCJpc0ZpbGUiLCJta2RpciIsInJ1biIsInJlY3Vyc2l2ZSIsImlzRGlyZWN0b3J5IiwiZnNVdGlsIiwicmVhZEZpbGVJZ25vcmluZ0Vycm9yIiwiZ2VuZXJhdGVGaWxlIiwiY29udGVudCIsImRpcm5hbWUiLCJmaXhUeXBvcyIsInBhY2thZ2VDb25maWciLCJkb2NGaWxlcyIsImxlbmd0aCIsIm1kRmlsZSIsImZpeFR5cG9zSW5UZXh0IiwicmVwbGFjZVdpdGhDb25maWciLCJ0c0ZpbGVzIiwidHNGaWxlIiwiZml4VHlwb3NJbkNvZGUiLCJ0ZXh0QmFzZWRGaWxlcyIsImZpbGUiLCJwcm9taXNlQWxsIiwicHJvcE5hbWUiLCJiZWZvcmUiLCJhZnRlciIsIk9iamVjdCIsImVudHJpZXMiLCJ3YmZ5SnNvbiIsInR5cG9zIiwiZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucyIsImFsbENvbmZpZ3MiLCJhZ2VudHNFeHRyYVBhdGgiLCJleHRyYUNvbnRlbnQiLCJmaWxlTmFtZSIsInRvb2xOYW1lIiwiZ2VuZXJhdGVDbGF1ZGVDb250ZW50IiwicGFja2FnZU1hbmFnZXIiLCJpc0J1biIsImJhc2VDb250ZW50IiwiZGVzY3JpcHRpb24iLCJjIiwiZGVwZW5kaW5nIiwiZ2VuSTE4blRzIiwibmV4dCIsInRyaW0iLCJ0b2tlbiIsInByb2Nlc3MiLCJlbnYiLCJHSF9CT1RfUEFUIiwiUFVCTElDX0dIX0JPVF9QQVQiLCJHSF9UT0tFTiIsIkdJVEhVQl9UT0tFTiIsImhhc0dpdEh1YlRva2VuIiwib2N0b2tpdCIsIk9jdG9raXQiLCJhdXRoIiwiZ2l0SHViVXRpbCIsImdldE9yZ0FuZE5hbWUiLCJ1cmxPckZ1bGxOYW1lIiwidXJsV2l0aG91dFByb3RvY29sIiwic3BsaXQiLCJhdCIsIm5hbWVzIiwic3Bhd25TeW5jIiwiY29tbWFuZCIsImFyZ3MiLCJyZXRyeSIsIm5ld0NtZCIsIm5ld0FyZ3MiLCJnZXRTcGF3blN5bmNBcmdzIiwiY2hpbGRfcHJvY2VzcyIsInN0YXR1cyIsInNwYXduU3luY1dpdGhTdHJpbmdSZXN1bHQiLCJzdGRpbyIsInByb2MiLCJzdGRlcnIiLCJ0b1N0cmluZyIsInMiLCJzdGRvdXQiLCJQQVRIIiwiQkVSUllfQklOX0ZPTERFUiIsIkFTREZfRElSIiwic2hlbGwiLCJjb252ZXJ0VmVyc2lvbkludG9OdW1iZXIiLCJ2ZXJzaW9uIiwibnVtYmVycyIsIk51bWJlciIsImZpbHRlciIsIm51bSIsImlzTmFOIiwidmVyc2lvbk51bWJlciIsImRpdmlzb3IiLCJQWVRIT05fVkVSU0lPTiIsIkpBVkFfVkVSU0lPTiIsIkJMSVRaX1ZFUlNJT04iLCJORVhUX1ZFUlNJT04iLCJnZW5lcmF0ZVRvb2xWZXJzaW9ucyIsInZlcnNpb25zVGV4dCIsImR1cGxpY2F0YWJsZUxpbmVzIiwibGluZSIsIkNPUkVfVE9PTFMiLCJoYXMiLCJzb3J0Iiwic3RhcnRzV2l0aCIsImxpbmVzIiwiU2V0IiwiZG9lc0NvbnRhaW5zUG9ldHJ5TG9jayIsInJlc3BvbnNlIiwiZmV0Y2giLCJqc29uIiwicG9ldHJ5VmVyc2lvbiIsInVwZGF0ZVZlcnNpb24iLCJmaXJlYmFzZSIsImRvZXNDb250YWluc1BhY2thZ2VKc29uIiwiYnVuVmVyc2lvbiIsIm9yZ2FuaXphdGlvbiIsInJlcG9zaXRvcnkiLCJyZXF1ZXN0Iiwib3duZXIiLCJyZXBvIiwiZGF0YSIsInRhZ19uYW1lIiwiaW5kZXgiLCJsYXN0SW5kZXhPZiIsInZlcnNpb25OdW1iZXJUZXh0IiwidGVzdCIsImdldExhdGVzdFZlcnNpb25Gcm9tVGFnT25HaXRIdWIiLCJwcmVmaXgiLCJERVBSRUNBVEVEX1ZFUlNJT05fUFJFRklYRVMiLCJ2ZXJzaW9uUGF0aCIsInJtIiwiZm9yY2UiLCJ0b29sVmVyc2lvbnNQYXRoIiwiY29yZSIsIm5ld1ZlcnNpb24iLCJoZWFkIiwiZmluZEluZGV4IiwibCIsIm5ld0xpbmUiLCJzcGxpY2UiLCJvdmVyd3JpdGVNZXJnZSIsImRlc3RpbmF0aW9uQXJyYXkiLCJzb3VyY2VBcnJheSIsImNvbWJpbmVNZXJnZSIsInRhcmdldCIsInNvdXJjZSIsImRlc3RpbmF0aW9uIiwiaXRlbSIsImNsb25lVW5sZXNzT3RoZXJ3aXNlU3BlY2lmaWVkIiwiaXNNZXJnZWFibGVPYmplY3QiLCJtZXJnZSIsInB1c2giLCJnZW5lcmF0ZUJpb21lSnNvbmMiLCJuZXdTZXR0aW5ncyIsInJvb3QiLCIkc2NoZW1hIiwiZXh0ZW5kcyIsIm9sZFNldHRpbmdzIiwiSlNPTiIsInBhcnNlIiwiYXJyYXlNZXJnZSIsInN0cmluZ2lmeSIsImdlbmVyYXRlQnVuZmlnVG9tbCIsInJlYWRGaWxlU3luYyIsInVzZXJDb250ZW50SGVhZGVyIiwidXNlckNvbnRlbnRIZWFkZXJSZWdleCIsInNlcGFyYXRvciIsImRlZmF1bHRIZWFkVXNlckNvbnRlbnQiLCJkZWZhdWx0VGFpbFVzZXJDb250ZW50IiwiaWdub3JlRmlsZVV0aWwiLCJzZXBhcmF0b3JQcmVmaXgiLCJyZWFkR2l0aWdub3JlV2l0aG91dFNlcGFyYXRvcnMiLCJsYXN0SGVhZGVySW5kZXgiLCJnZXRJbmRleE9mVGFpbFVzZXJDb250ZW50SGVhZGVyIiwiZ2V0SGVhZFVzZXJDb250ZW50IiwiaW5kZXhPZiIsImdldFRhaWxVc2VyQ29udGVudCIsImlzQmVycnlaZXJvSW5zdGFsbEVuYWJsZWQiLCJsYXN0SW5kZXgiLCJnZW5lcmF0ZURvY2tlcmlnbm9yZSIsImV4dGVuc2lvbnMiLCJjb2RlV2l0aDJJbmRlbnRTaXplIiwiY29kZVdpdGg0SW5kZW50U2l6ZSIsIm1hcmtkb3duTGlrZSIsImVzbGludCIsInByZXR0aWVyIiwiZ2VuZXJhdGVFeHRlbnNpb25zIiwiZ2VuZXJhdGVFZGl0b3Jjb25maWciLCJnZW5lcmF0ZUVzbGludHJjIiwiZXNsaW50QmFzZSIsImRlZmF1bHRDb25maWciLCJoYXZlX2Z1biIsImNvZGVfcmV2aWV3IiwiZGlzYWJsZSIsImNvbW1lbnRfc2V2ZXJpdHlfdGhyZXNob2xkIiwibWF4X3Jldmlld19jb21tZW50cyIsInB1bGxfcmVxdWVzdF9vcGVuZWQiLCJoZWxwIiwic3VtbWFyeSIsImlnbm9yZV9wYXR0ZXJucyIsImdlbmVyYXRlR2VtaW5pQ29uZmlnIiwiY29uZmlnRmlsZVBhdGgiLCJzdHlsZWd1aWRlRmlsZVBhdGgiLCJuZXdDb25maWciLCJjbG9uZURlZXAiLCJvbGRDb25maWciLCJ5YW1sIiwibG9hZCIsInlhbWxDb250ZW50IiwiZHVtcCIsImxpbmVXaWR0aCIsIm5vQ29tcGF0TW9kZSIsInN0eWxlcyIsInJlbW92ZUdlbWluaVNldHRpbmdzIiwiZXh0IiwiZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzIiwiZGVmYXVsdE5hbWVzIiwiZ2VuZXJhdGVHaXRpZ25vcmUiLCJyb290Q29uZmlnIiwiaGVhZFVzZXJDb250ZW50IiwidGFpbFVzZXJDb250ZW50IiwiZG9lc0NvbnRhaW5zR2VtZmlsZSIsImRvZXNDb250YWluc0dvTW9kIiwiYmFzZW5hbWUiLCJkb2VzQ29udGFpbnNQb21YbWwiLCJkb2VzQ29udGFpbnNQdWJzcGVjWWFtbCIsImRvZXNDb250YWluc1RlbXBsYXRlWWFtbCIsImJsaXR6IiwicHJpc21hIiwicGxheXdyaWdodFRlc3QiLCJyZWFjdE5hdGl2ZSIsInN0b3J5Ym9vayIsImxpdGVzdHJlYW0iLCJnZW5lcmF0ZWQiLCJyZWFkQ2FjaGUiLCJ1cmwiLCJyZXNwb25zZVRleHQiLCJ0ZXh0Iiwib2siLCJ3cml0ZUNhY2hlIiwib3MiLCJob21lZGlyIiwic3RhdCIsIkRhdGUiLCJub3ciLCJtdGltZU1zIiwiZ2V0TGF0ZXN0Q29tbWl0SGFzaCIsImNvbW1pdHMiLCJwZXJfcGFnZSIsInNoYSIsIkVzbGludFV0aWwiLCJnZXRMaW50Rml4U3VmZml4IiwiZG9lc0NvbnRhaW5zSnN4T3JUc3giLCJqc0NvbW1vbkRlcHMiLCJ0c0NvbW1vbkRlcHMiLCJyZWFjdENvbW1vbkRlcHMiLCJlc2xpbnREZXBzIiwiZ2VuZXJhdGVQYWNrYWdlSnNvbiIsInNraXBBZGRpbmdEZXBzIiwianNvblRleHQiLCJqc29uT2JqIiwic2NyaXB0cyIsInBlZXJEZXBlbmRlbmNpZXMiLCJhdXRob3IiLCJpc1dpbGxCb29zdGVyQ29uZmlncyIsImRlcHMiLCJ2YWx1ZXMiLCJkZXAiLCJyZW1vdmVEZXByZWNhdGVkU3R1ZmYiLCJrZXkiLCJ2YWx1ZSIsImdlbmVyYXRlU2NyaXB0cyIsInByZXR0aWZ5IiwiZXhpc3RpbmdDb250ZW50Iiwib3JpZ2luYWxDb250ZW50IiwiZ2VuZXJhdGVQcmV0dGllclN1ZmZpeCIsInBvZXRyeURldkRlcGVuZGVuY2llcyIsInByZXBhcmUiLCJwb3N0aW5zdGFsbCIsImlzUHVibGljUmVwbyIsImlzUmVmZXJyZWRCeU90aGVyUmVwbyIsInByZXBhY2siLCJwb3N0cGFjayIsInNlbWFudGljUmVsZWFzZSIsIndvcmtzcGFjZXMiLCJBcnJheSIsImlzQXJyYXkiLCJ3b3Jrc3BhY2UiLCJnbG9iU3luYyIsIndiIiwiZG9lc0NvbnRhaW5zSmF2YVNjcmlwdCIsImRvZXNDb250YWluc0phdmFTY3JpcHRJblBhY2thZ2VzIiwiZG9lc0NvbnRhaW5zVHlwZVNjcmlwdCIsImRvZXNDb250YWluc1R5cGVTY3JpcHRJblBhY2thZ2VzIiwicHJpdmF0ZSIsImxpY2Vuc2UiLCJwdWJsaXNoQ29uZmlnIiwiYWNjZXNzIiwibWFpbiIsInJlc29sdXRpb25zIiwibGludCIsImNsZWFudXAiLCJkaXJzIiwiZGlyIiwiZm9ybWF0IiwicHl0aG9uRmlsZXMiLCJkaXJOYW1lU2V0IiwicHl0aG9uRmlsZSIsImZpcnN0Iiwic2Vjb25kIiwiYWRkIiwic2l6ZSIsImRpck5hbWVzU3RyIiwiZCIsImtleXMiLCJwYWNrYWdlTmFtZXMiLCJpc1dvcmtzcGFjZVBhY2thZ2UiLCJjb21taXRIYXNoIiwidXBkYXRlUHJpdmF0ZVBhY2thZ2VzIiwibmV3SnNvblRleHQiLCJvbGRBbmROZXdTY3JpcHROYW1lcyIsIm9sZE5hbWUiLCJuZXdOYW1lIiwiZmlsZXMiLCJmaXhTY3JpcHROYW1lcyIsInR5cGVjaGVjayIsIm9sZFRlc3QiLCJweXJpZ2h0IiwicHJlQ29tbWl0IiwicHJlUHVzaCIsInByZVB1c2hGb3JMYWIiLCJwcmVQdXNoRm9yTGFiRXhjZXB0QWRtaW4iLCJwb3N0TWVyZ2UiLCJnZW5lcmF0ZUh1c2t5cmNVcGRhdGluZ1BhY2thZ2VKc29uIiwicGFja2FnZUpzb25QYXRoIiwicHJlQ29tbWl0RmlsZVBhdGgiLCJ0b0xvY2FsZUxvd2VyQ2FzZSIsIm1vZGUiLCJwb3N0TWVyZ2VDb21tYW5kIiwiZ2VuZXJhdGVQb3N0TWVyZ2VDb21tYW5kcyIsInBvc3RNZXJnZUNvbW1hbmRzIiwicmF3IiwiaW5zdGFsbENvbW1hbmQiLCJybU5leHREaXJlY3RvcnkiLCJjcmVhdGVUYXNrT3B0aW9ucyIsInJ1bm5lciIsImV4dGVuc2lvbiIsInByZXR0aWVyQ29udGVudCIsImJpb21lQ29udGVudCIsImdlbmVyYXRlSWRlYVNldHRpbmdzIiwiY29tbWFuZHMiLCJnZW5lcmF0ZUxlZnRob29rVXBkYXRpbmdQYWNrYWdlSnNvbiIsIm1rZGlyU3luYyIsInNyY0RpcmVjdG9yaWVzIiwibm9kZSIsImdlbmVyYXRlTGludHN0YWdlZHJjIiwicGFja2FnZVByZWZpeCIsImdldEVzbGludEtleSIsInBhY2thZ2VzRmlsdGVyIiwiZ2V0RXNsaW50RmlsdGVyRm9yUHJldHRpZXIiLCJnZXRTcmNEaXJzIiwiZ2VuZXJhdGVOZXh0Q29uZmlnSnNvbiIsImZpbmQiLCJwIiwiXyIsInNldHRpbmdzVGV4dCIsImdlbmVyYXRlUHJldHRpZXJpZ25vcmUiLCJnaXRpZ25vcmVGaWxlUGF0aCIsImdpdGlnbm9yZUNvbnRlbnQiLCJhZGRpdGlvbmFsQ29udGVudCIsInZlbnZQYXRoIiwidmVudiIsImdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24iLCJnZW5lcmF0ZVJlYWRtZSIsImluc2VydEJhZGdlIiwiZmlsZU5hbWVzIiwicmVhZGRpclN5bmMiLCJiYWRnZU5hbWUiLCJ0b1VwcGVyQ2FzZSIsImJhZGdlIiwicmVhZG1lIiwiaSIsImdlbmVyYXRlUmVsZWFzZXJjIiwic2V0dGluZ3MiLCJwbHVnaW5zIiwicGx1Z2luIiwicHJlc2V0IiwiZmFpbENvbW1lbnQiLCJfMSIsInN1Y2Nlc3NDb21tZW50IiwiXzIiLCJjbGVhbk9sZENvbmZpZyIsInN1Y2Nlc3NDb21tZW50Q29uZGl0aW9uIiwiZmFpbENvbW1lbnRDb25kaXRpb24iLCJsYWJlbHMiLCJyZWxlYXNlZExhYmVscyIsImdlbmVyYXRlUmVub3ZhdGVKc29uIiwicGFja2FnZVJ1bGVzIiwicnVsZSIsIm1hdGNoUGFja2FnZU5hbWVzIiwiZW5hYmxlZCIsInNvcnRLZXlzIiwib2JqIiwia2V5QW5kVmFsdWVzIiwia2V5MSIsImtleTIiLCJsb2NhbGVDb21wYXJlIiwicm9vdEpzb25PYmoiLCJjb21waWxlck9wdGlvbnMiLCJtb2R1bGUiLCJtb2R1bGVSZXNvbHV0aW9uIiwianN4IiwiYWx3YXlzU3RyaWN0Iiwic3RyaWN0Iiwic2tpcExpYkNoZWNrIiwiYWxsb3dTeW50aGV0aWNEZWZhdWx0SW1wb3J0cyIsImVzTW9kdWxlSW50ZXJvcCIsInJlc29sdmVKc29uTW9kdWxlIiwiZGVjbGFyYXRpb24iLCJzb3VyY2VNYXAiLCJpbXBvcnRIZWxwZXJzIiwiZXJhc2FibGVTeW50YXhPbmx5Iiwib3V0RGlyIiwidHlwZVJvb3RzIiwiZXhjbHVkZSIsImluY2x1ZGUiLCJzdWJKc29uT2JqIiwiZ2VuZXJhdGVUc2NvbmZpZyIsImRvZXNDb250YWluc0pzeE9yVHN4SW5QYWNrYWdlcyIsImlzRXNtUGFja2FnZSIsImV4cGVyaW1lbnRhbERlY29yYXRvcnMiLCJleGNsdWRlRmlsZVBhdHRlcm5zIiwiZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyIsImV4Y2x1ZGVGaWxlUGF0dGVybiIsImV4Y2x1ZGVTZXR0aW5nIiwid29ya2Zsb3dzIiwib24iLCJwdWxsX3JlcXVlc3QiLCJicmFuY2hlcyIsImNvbmN1cnJlbmN5IiwiZ3JvdXAiLCJqb2JzIiwidXNlcyIsInJlbGVhc2UiLCJ3YmZ5Iiwid29ya2Zsb3dfZGlzcGF0Y2giLCJwdWxsX3JlcXVlc3RfdGFyZ2V0IiwidHlwZXMiLCJzeW5jIiwiaXNzdWVzIiwic2VjcmV0cyIsIkRJU0NPUkRfV0VCSE9PS19VUkwiLCJHSF9QUk9KRUNUX1VSTCIsIndpdGgiLCJsYWJlbGVkIiwiZ2VuZXJhdGVXb3JrZmxvd3MiLCJ3b3JrZmxvd3NQYXRoIiwic2VtYW50aWNZbWxQYXRoIiwiZmlsZU5hbWVTZXQiLCJraW5kIiwid3JpdGVXb3JrZmxvd1lhbWwiLCJtb3ZlVG9Cb3R0b20iLCJqb2IiLCJub3JtYWxpemVKb2IiLCJzY2hlZHVsZSIsImJyYW5jaCIsInNldFNjaGVkdWxlIiwibWlncmF0ZVdvcmtmbG93Iiwid3JpdGVZYW1sIiwicGFyYW1zIiwic3luY19wYXJhbXNfd2l0aG91dF9kZXN0IiwibnBtIiwic2VydmVyX3VybCIsIm1pZ3JhdGVKb2IiLCJuZXdTZWNyZXRzIiwiaW5jbHVzaXZlTWluSG91ckpzdCIsImV4Y2x1c2l2ZU1heEhvdXJKc3QiLCJtaW51dGVVdGMiLCJob3VyVXRjIiwiY3JvbiIsImlzSW50ZWdlciIsImhvdXJKc3QiLCJNYXRoIiwiZmxvb3IiLCJyYW5kb20iLCJ5YW1sVGV4dCIsImdlbmVyYXRlWWFybnJjWW1sIiwieWFybnJjWW1sUGF0aCIsImN1cnJlbnRWZXJzaW9uIiwibGF0ZXN0VmVyc2lvbiIsInZlcnNpb25zSnNvbiIsImdldExhdGVzdFZlcnNpb24iLCJnZXRNYWpvck51bWJlciIsInJlbGVhc2VzUGF0aCIsInlhcm5yY1BhdGgiLCJkZWZhdWx0U2VtdmVyUmFuZ2VQcmVmaXgiLCJub2RlTGlua2VyIiwibm1Nb2RlIiwiY29tcHJlc3Npb25MZXZlbCIsImluamVjdEVudmlyb25tZW50RmlsZXMiLCJlbmFibGVHbG9iYWxDYWNoZSIsIm9yaWdpbmFsTGVuZ3RoIiwicGx1Z2luUGF0aCIsIm1ham9yIiwic2V0dXBMYWJlbHMiLCJzZXR1cExhYmVsIiwiZGVsZXRlTGFiZWwiLCJ3YXJuIiwiY29sb3IiLCJkZXByZWNhdGVkU2VjcmV0TmFtZXMiLCJzZXR1cFNlY3JldHMiLCJwYXJzZWQiLCJkb3RlbnYiLCJzZWNyZXROYW1lIiwic2VjcmV0X25hbWUiLCJrZXlfaWQiLCJrZXlJZCIsInNvZGl1bSIsInJlYWR5Iiwic2VjcmV0IiwicmF3S2V5IiwiZnJvbV9iYXNlNjQiLCJiYXNlNjRfdmFyaWFudHMiLCJPUklHSU5BTCIsInJhd1NlYyIsImZyb21fc3RyaW5nIiwiZW5jQnl0ZXMiLCJjcnlwdG9fYm94X3NlYWwiLCJlbmNCYXNlNjQiLCJ0b19iYXNlNjQiLCJlbmNyeXB0ZWRfdmFsdWUiLCJzZXR1cEdpdEh1YlNldHRpbmdzIiwid2l0aFJldHJ5IiwiYWxsb3dfbWVyZ2VfY29tbWl0IiwiYWxsb3dfc3F1YXNoX21lcmdlIiwiYWxsb3dfcmViYXNlX21lcmdlIiwiZGVsZXRlX2JyYW5jaF9vbl9tZXJnZSIsInNxdWFzaF9tZXJnZV9jb21taXRfdGl0bGUiLCJzcXVhc2hfbWVyZ2VfY29tbWl0X21lc3NhZ2UiLCJoZWFkZXJzIiwiYWxsb3dfYXV0b19tZXJnZSIsInRlbXBsYXRlcyIsImdlbmVyYXRlR2l0SHViVGVtcGxhdGVzIiwiZGlzdGFuY2UiLCJ3YmZ5SnNvblNjaGVtYSIsInoiLCJvYmplY3QiLCJyZWNvcmQiLCJzdHJpbmciLCJvcHRpb25hbCIsImRvYyIsInRzIiwiZ2V0UGFja2FnZUNvbmZpZyIsImVzbVBhY2thZ2UiLCJwYWNrYWdlSnNvblRleHQiLCJ0eXBlIiwicmVsZWFzZUJyYW5jaGVzIiwicmVsZWFzZVBsdWdpbnMiLCJyZWxlYXNlcmNKc29uUGF0aCIsImZzcCIsImZsYXQiLCJyZXBvSW5mbyIsImdpdCIsInNpbXBsZUdpdCIsIm9yaWdpbiIsImdldFJlbW90ZXMiLCJyIiwicmVtb3RlVXJsIiwicmVmcyIsInJlcXVlc3RSZXBvSW5mbyIsIm1lc3NhZ2UiLCJmZXRjaFJlcG9JbmZvIiwibm9kZVZlcnNpb25Db250ZW50Iiwid2JmeUpzb25QYXRoIiwid2JmeUpzb25UZXh0IiwiZnVsbF9uYW1lIiwic2VwIiwiY29udGFpbnNBbnkiLCJkb2VzQ29udGFpbnNWc2NvZGVTZXR0aW5nc0pzb24iLCJnaXRodWIiLCJnZXRFc2xpbnRFeHRlbnNpb25CYXNlIiwicGF0dGVybiIsIm9yZyIsInJldCIsImFzc2lnbiIsImFyZ3YiLCJ5YXJncyIsInBvc2l0aW9uYWwiLCJkZXNjcmliZSIsImFycmF5IiwiZGVmYXVsdCIsImFsaWFzIiwic2tpcERlcHMiLCJ2ZXJib3NlIiwicm9vdERpclBhdGgiLCJwYXRocyIsInBhY2thZ2VzRGlyUGF0aCIsInN1YkRpclBhdGhzIiwiaWdub3JlRXJyb3JBc3luYyIsImFiYnJldmlhdGlvblByb21pc2UiLCJzdWJQYWNrYWdlQ29uZmlncyIsInN1YkRpclBhdGgiLCJhbGxQYWNrYWdlQ29uZmlncyIsInRoZW4iLCJidW5Mb2NrYlBhdGgiXSwibWFwcGluZ3MiOiJ5bUJBVU8sTUFBTUEsRUFBVSxJQVZ2QixNQUlFQyxXQUFBQSxHQUNFQyxLQUFLQyxXQUFZLEVBQ2pCRCxLQUFLRSxtQkFBb0IsQ0FDM0IsR0NXSyxNQUFNQyxFQUFTLElBaEJ0QixNQUNFLCtCQUFNQyxDQUEwQkMsRUFBY0MsR0FDeENSLEVBQVFHLFdBQ1ZNLFFBQVFDLEtBQUssYUFBYUgscUJBRTVCLFVBQ1FDLEdBQ1IsQ0FBRSxNQUFPRyxHQUNQRixRQUFRQyxLQUFLLHFCQUFxQkgsTUFBU0ksYUFBaUJDLE1BQVFELEVBQU1FLE1BQVFDLE9BQU9ILE1BQzNGLENBQ0lYLEVBQVFHLFdBQ1ZNLFFBQVFDLEtBQUssY0FBY0gsbUJBRS9CLEdDVEtRLGVBQWVDLEVBQWNDLEdBQ2xDLE9BQU9aLEVBQU9DLDBCQUEwQixnQkFBaUJTLFVBQ3ZELElBQUtFLEVBQU9DLHVC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
|