wbfy 5.11.14 → 5.11.16

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.
Files changed (2) hide show
  1. package/dist/index.js +3 -3
  2. package/package.json +3 -3
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
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 r from"yargs";import o from"node:fs/promises";import{PromisePool as a}from"minimal-promise-pool";import c from"deepmerge";import l from"typescript";import p from"fast-glob";import d from"js-yaml";import u from"lodash.clonedeep";import{parse as m}from"smol-toml";import g from"node:os";import f from"node:child_process";import{Octokit as h}from"@octokit/core";import y from"dotenv";import w from"libsodium-wrappers";import{distance as b}from"fastest-levenshtein";import{simpleGit as v}from"simple-git";import{z as k}from"zod";const x=new class{isVerbose=!1;doesUploadEnvVars=!1};const _=new class{async functionIgnoringException(e,t){x.isVerbose&&console.info(`--------- ${e} start ---------`);try{await t()}catch(t){console.info(`Error occurred in ${e}: ${t instanceof Error?t.stack:String(t)}}`)}x.isVerbose&&console.info(`---------- ${e} end ----------`)}};async function j(e){return _.functionIgnoringException("fixDockerfile",async()=>{if(!e.doesContainDockerfile)return;const n=e.dockerfile,s=n;n!==s&&await o.writeFile(t.join(e.dirPath,"Dockerfile"),s)})}const S={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});let i=s.replaceAll("\r\n","\n").trim();i&&(i+="\n"),await e.promises.writeFile(n,i)}},$=new a;async function P(n){return _.functionIgnoringException("fixNextConfigJson",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(()=>S.generateFile(s,i))})}const C=e=>({kind:"literal",value:e}),E=e=>({kind:"object",value:e}),B={forbidOnly:C("!!process.env.CI"),retries:C("process.env.PWDEBUG ? 0 : process.env.CI ? 5 : 1"),use:E({baseURL:C("process.env.NEXT_PUBLIC_BASE_URL"),trace:C("process.env.CI ? 'on-first-retry' : 'retain-on-failure'"),screenshot:C("process.env.CI ? 'only-on-failure' : 'only-on-failure'"),video:C("process.env.CI ? 'retain-on-failure' : 'retain-on-failure'")}),webServer:E({command:C("'yarn start-test-server'"),url:C("process.env.NEXT_PUBLIC_BASE_URL"),reuseExistingServer:C("!!process.env.CI"),timeout:C("300_000"),stdout:C("'pipe'"),stderr:C("'pipe'"),env:C("{\n ...process.env,\n PRISMA_USER_CONSENT_FOR_DANGEROUS_AI_ACTION: 'true',\n}"),gracefulShutdown:C("{\n signal: 'SIGTERM',\n timeout: 500,\n}")})};async function O(n){return _.functionIgnoringException("fixPlaywrightConfig",async()=>{const s=t.resolve(n.dirPath,"playwright.config.ts");if(!e.existsSync(s))return;const i=await e.promises.readFile(s,"utf8"),r=/defineConfig\s*\(\s*(\{[\s\S]*?})\s*\);?/.exec(i),o=r?.[1];if(!o)return;const a=function(e){const t=l.createSourceFile("playwright-config.ts",`const config = ${e};`,l.ScriptTarget.Latest,!0,l.ScriptKind.TS),n=t.statements[0];if(!n||!l.isVariableStatement(n))return;const s=n.declarationList.declarations[0];if(!s?.initializer||!l.isObjectLiteralExpression(s.initializer))return;return F(s.initializer,t)}(o);if(!a)return;const p=c.all([B,a]);Boolean(n.packageJson?.scripts?.["start-test-server"])||delete p.webServer;const d=await async function(n){const s=[t.resolve(n,".env"),t.resolve(n,"mise.toml")];for(const t of s)try{const n=await e.promises.readFile(t,"utf8");if(/NEXT_PUBLIC_BASE_URL\s*=/m.test(n))return!0}catch{}return!1}(n.dirPath);if(!d){const e=p.use;"object"===e?.kind&&delete e.value.baseURL}const u=T(p,0),m=i.replace(o,u);await $.run(()=>S.generateFile(s,m))})}function F(e,t){const n={};for(const s of e.properties){if(!l.isPropertyAssignment(s)||!l.isIdentifier(s.name)&&!l.isStringLiteral(s.name))return;const e=A(s.initializer,t);if(void 0===e)return;n[s.name.getText(t)]=e}return n}function A(e,t){if(l.isObjectLiteralExpression(e)){const n=F(e,t);return n?E(n):C(e.getText(t))}if(l.isArrayLiteralExpression(e)){const n=e.elements.map(e=>A(e,t));return n.some(e=>void 0===e)?C(e.getText(t)):{kind:"array",value:n}}return C(e.getText(t))}function I(e,t){return"array"===e.kind?function(e,t){if(0===e.length)return"[]";const n=" ".repeat(t+1),s=e.map(e=>{const s=I(e,t+1).split("\n");if(s[s.length-1]=`${s.at(-1)},`,"literal"===e.kind)for(let e=1;e<s.length;e+=1)s[e]=`${n}${s[e]}`;return s[0]=`${n}${s[0]}`,s.join("\n")}),i=" ".repeat(t);return`[\n${s.join("\n")}\n${i}]`}(e.value,t):"literal"===e.kind?e.value:T(e.value,t)}function T(e,t){const n=" ".repeat(t+1),s=Object.entries(e).map(([e,s])=>{const i=I(s,t+1).split("\n");if(i[i.length-1]=`${i.at(-1)},`,"literal"===s.kind)for(let e=1;e<i.length;e+=1)i[e]=`${n}${i[e]}`;return i[0]=`${n}${e}: ${i[0]}`,i.join("\n")}),i=" ".repeat(t);return 0===s.length?`{\n${i}}`:`{\n${s.join("\n")}\n${i}}`}const D=["**/node_modules/**","**/.venv/**","**/test-fixtures/**","**/test/fixtures/**","**/dist/**","**/build/**","**/target/**","**/temp/**","**/tmp/**"];async function R(e){return _.functionIgnoringException("fixPrismaEnvFiles",async()=>{const n=await p.glob(["*.env","*.env.*"],{dot:!0,cwd:e.dirPath,ignore:D});for(const s of n){const n=t.resolve(e.dirPath,s),i=(await o.readFile(n,"utf8")).replace(/DATABASE_URL="?(.+\.sqlite3)"?[\n$]/,'DATABASE_URL="$1?connection_limit=1"\n');await o.writeFile(n,i)}})}async function W(n){return _.functionIgnoringException("fixTestDirectoriesUpdatingPackageJson",async()=>{await Promise.all(n.map(async n=>{const s=t.join(n,"test");for(const i of["__tests__","tests"]){const r=t.join(n,i);try{await e.promises.rename(r,s);const o=await e.promises.readFile(t.join(n,"package.json"),"utf8"),a=o.replaceAll(i,"test");if(o===a)return;await e.promises.writeFile(t.join(n,"package.json"),a)}catch{}}}))})}async function L(e,s){return _.functionIgnoringException("fixTypeDefinitions",async()=>{const i=t.resolve(e.dirPath,"@types"),r=e.isRoot&&e.doesContainSubPackageJsons?void 0:t.resolve(e.dirPath,"src","types"),a=await n(()=>o.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 o.mkdir(t.join(i,a)),await $.run(()=>o.rename(t.join(i,e.name),t.join(i,a,"index.d.ts")))):r&&(await o.mkdir(r,{recursive:!0}),await $.run(()=>o.rename(t.join(i,e.name),t.join(r,e.name)))):e.isDirectory()&&r&&!p&&(await o.mkdir(r,{recursive:!0}),await $.run(()=>n(()=>o.rename(t.join(i,e.name,"index.d.ts"),t.join(r,`${e.name}.d.ts`)))))}})}function N(e,t){return t}function J(e,t,n){const s=[...e];for(const[i,r]of t.entries())void 0===s[i]?s[i]=n.cloneUnlessOtherwiseSpecified(r,n):n.isMergeableObject(r)?s[i]=c(e[i],r,n):e.includes(r)||s.push(r);return s}function G(e){const t=Object.entries(e).toSorted(([e],[t])=>e.localeCompare(t));for(const[n,s]of t)delete e[n],e[n]=s,"object"==typeof s&&null!==s&&G(s);return e}const U={name:"autofix.ci",on:{pull_request:null,push:{branches:["main"]}},permissions:{contents:"read"},concurrency:{group:"autofix-${{ github.head_ref }}","cancel-in-progress":!0},jobs:{autofix:{"runs-on":"ubuntu-latest"}}},z={name:"Fix code automatically",on:{pull_request:null},concurrency:{group:"${{ github.workflow }}-${{ github.ref }}","cancel-in-progress":!0},jobs:{autofix:{uses:"WillBooster/reusable-workflows/.github/workflows/autofix.yml@main"}}},M={test:{name:"Test",on:{pull_request:null,push:{branches:["main","wbfy"]}},concurrency:{group:"${{ github.workflow }}-${{ github.ref }}","cancel-in-progress":!0},permissions:{contents:"write"},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},permissions:{"id-token":"write",contents:"write"},jobs:{release:{uses:"WillBooster/reusable-workflows/.github/workflows/release.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:{},permissions:{contents:"write"},jobs:{sync:{uses:"WillBooster/reusable-workflows/.github/workflows/sync.yml@main"}}},"close-comment":{name:"Add close comment",on:{pull_request:{types:["opened"]}},jobs:{"close-comment":{uses:"WillBooster/reusable-workflows/.github/workflows/close-comment.yml@main"}}},"gen-pr-claude":{name:"Generate PR with Claude Code",on:{issues:{types:["labeled"]},pull_request:{types:["labeled"]}},jobs:{"gen-pr":{if:"contains(github.event.label.name, 'gen-pr-all') || contains(github.event.label.name, 'gen-pr-claude')",uses:"WillBooster/reusable-workflows/.github/workflows/gen-pr.yml@main",with:{"coding-tool":"claude-code","issue-number":"${{ github.event.issue.number || github.event.number }}","test-command":"yarn|bun check-all-for-ai"},secrets:{CLAUDE_CODE_OAUTH_TOKEN:"${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}"}}}},"gen-pr-codex":{name:"Generate PR with Codex CLI",on:{issues:{types:["labeled"]},pull_request:{types:["labeled"]}},jobs:{"gen-pr":{if:"contains(github.event.label.name, 'gen-pr-all') || contains(github.event.label.name, 'gen-pr-codex')",uses:"WillBooster/reusable-workflows/.github/workflows/gen-pr.yml@main",with:{"coding-tool":"codex-cli","issue-number":"${{ github.event.issue.number || github.event.number }}","test-command":"yarn|bun check-all-for-ai"},secrets:{OPENAI_API_KEY:"${{ secrets.OPENAI_API_KEY }}"}}}},"gen-pr-gemini":{name:"Generate PR with Gemini CLI",on:{issues:{types:["labeled"]},pull_request:{types:["labeled"]}},jobs:{"gen-pr":{if:"contains(github.event.label.name, 'gen-pr-all') || contains(github.event.label.name, 'gen-pr-gemini')",uses:"WillBooster/reusable-workflows/.github/workflows/gen-pr.yml@main",with:{"coding-tool":"gemini-cli","issue-number":"${{ github.event.issue.number || github.event.number }}","test-command":"yarn|bun check-all-for-ai"},secrets:{GEMINI_API_KEY:"${{ secrets.GEMINI_API_KEY }}"}}}}};async function q(n){return _.functionIgnoringException("generateWorkflow",async()=>{if(H(n.repository))return;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 r=await e.promises.readdir(s,{withFileTypes:!0}),o=new Set(["test.yml","autofix.yml","semantic-pr.yml","close-comment.yml","gen-pr-claude.yml","gen-pr-codex.yml","gen-pr-gemini.yml",...r.filter(e=>e.isFile()&&e.name.endsWith(".yml")).map(e=>e.name)]);n.depending.semanticRelease&&o.add("release.yml");for(const e of o){const i=t.basename(e,".yml");await $.run(()=>Y(n,s,i))}})}function H(e){return e?.endsWith("/reusable-workflows")??!1}async function Y(n,s,i){const r=t.join(s,`${i}.yml`),o=e.existsSync(t.join(s,"deploy-production.yml"));if("autofix"===i)return void await V(function(e){if(!e.isPublicRepo)return u(z);const t=e.isBun?"bun":"yarn",n=[{uses:"actions/checkout@v6"},{uses:"actions/setup-node@v6",with:{"check-latest":!0}},...e.isBun?[{uses:"oven-sh/setup-bun@v1",with:{"bun-version":"latest"}}]:[],{run:`${t} install`},{run:`${t} run cleanup`}];e.packageJson?.scripts?.build&&n.push({run:`${t} run build`});n.push({uses:"autofix-ci/action@v1"});const s=u(U),i=s.jobs.autofix??{"runs-on":"ubuntu-latest"};return s.jobs.autofix={...i,steps:n},s}(n),r);let a=u(i in M?M[i]:{});if(!("jobs"in a))return;try{const t=await e.promises.readFile(r,"utf8"),n=d.load(t);a=c.all([a,n,a],{arrayMerge:J})}catch{}i.startsWith("deploy")&&(a={...a,concurrency:{group:"${{ github.workflow }}","cancel-in-progress":!1}},function(e,t){const n=e[t];delete e[t],e[t]=n}(a,"jobs"),a.on?.push&&(a.on.push["paths-ignore"]=[...new Set(["**.md","**/docs/**",...a.on.push["paths-ignore"]??[]])])),"release"===i&&a.jobs.release&&o&&(a.permissions??={},a.permissions.actions="write",a.jobs.release.with??={},a.jobs.release.with.trigger_deploy_workflow="deploy-production.yml");let l=!1;for(const e of Object.values(a.jobs))e.uses?.includes("/reusable-workflows/")&&(K(n,e,i),l=!0);if(l){switch(i){case"release":if(a.on?.schedule)delete a.on.push;else{if(!(a.on?.push&&n.release.branches.length>0))return void await e.promises.rm(t.join(s,"release.yml"),{force:!0});a.on.push.branches=n.release.branches}n.isPublicRepo?(a.permissions??={},a.permissions["id-token"]="write"):delete a.permissions?.["id-token"];break;case"test":a.on?.pull_request&&delete a.on.pull_request["paths-ignore"],a.on?.push&&(delete a.on.push["paths-ignore"],a.on.push.branches=a.on.push.branches.filter(e=>"renovate/**"!==e))}if(await V(a,r),"sync"===i){if(await e.promises.rm(t.join(s,"sync-init.yml"),{force:!0}),!a.jobs.sync?.with)return;a.jobs["sync-force"]=a.jobs.sync;const n=a.jobs.sync.with.sync_params_without_dest;if("string"!=typeof n)return;a.jobs.sync.with.sync_params_without_dest=`--force ${n}`,a.name="Force to Sync",a.on={workflow_dispatch:null},delete a.jobs.sync,await V(a,t.join(s,"sync-force.yml"))}}}function K(e,t,n){if(t.with??={},t.secrets??={},delete t.secrets.NPM_TOKEN,"test"!==n&&"release"!==n&&"gen-pr-claude"!==n&&"gen-pr-codex"!==n&&"gen-pr-gemini"!==n||(t.secrets.GH_TOKEN="${{ secrets.GITHUB_TOKEN }}"),"gen-pr-claude"!==n&&"gen-pr-codex"!==n&&"gen-pr-gemini"!==n||(t.with["test-command"]=e.isBun?"bun run check-all-for-ai":"yarn check-all-for-ai"),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,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.doesContainDockerfile&&!t.with.ci_label&&n.startsWith("test")&&(t.with.ci_label="large"),"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?G(t.with):delete t.with,Object.keys(t.secrets).length>0){const e=G(t.secrets);delete t.secrets,t.secrets=e}else delete t.secrets}async function V(t,n){const s=d.dump(t,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}});await e.promises.writeFile(n,s)}async function X(n){return _.functionIgnoringException("fixTypos",async()=>{if(H(n.repository))return;const s=n.dirPath,i=await p.glob("**/*.md",{dot:!0,cwd:s,ignore:D});x.isVerbose&&console.info(`Found ${i.length} markdown files in ${s}`);for(const r of i){const i=t.join(s,r);await $.run(async()=>{const t=await e.promises.readFile(i,"utf8");let s=Z(t);s=ee(s,n,"doc"),t!==s&&await S.generateFile(i,s)})}const r=await p.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:D});x.isVerbose&&console.info(`Found ${r.length} TypeScript files in ${s}`);for(const i of r){const r=t.join(s,i),o=await e.promises.readFile(r,"utf8");let a=Q(o);a=ee(a,n,"ts"),o!==a&&await S.generateFile(r,a)}const o=await p.glob("**/*.{csv,htm,html,tsv,xml,yaml,yml}",{dot:!0,cwd:s,ignore:D});x.isVerbose&&console.info(`Found ${o.length} text-based files in ${s}`);for(const i of o){const r=t.join(s,i),o=await e.promises.readFile(r,"utf8");let a=Z(o);a=ee(a,n,"text"),o!==a&&await S.generateFile(r,a)}await $.promiseAll()})}function Z(e){return e.replaceAll(/\bc\.f\.([^$])/g,"cf.$1").replaceAll(/\beg\.([^$])/g,"e.g.$1").replaceAll(/\bie\.([^$])/g,"i.e.$1")}function Q(e){return e.replaceAll(/\/\/(.*)c\.f\./g,"//$1cf.").replaceAll(/\/\/(.*)eg\./g,"//$1e.g.").replaceAll(/\/\/(.*)ie\./g,"//$1i.e.")}function ee(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 te(e,n){return _.functionIgnoringException("generateAgentInstructions",async()=>{if(!e.isRoot)return;const s=t.resolve(e.dirPath,"AGENTS_EXTRA.md"),i=await S.readFileIgnoringError(s);for(const[s,r]of[["AGENTS.md","Codex CLI"],["CLAUDE.md","Claude Code"],["GEMINI.md","Gemini CLI"]]){const o=ne(e,n,r,i),a=t.resolve(e.dirPath,s);await $.run(()=>S.generateFile(a,o))}const r=t.resolve(e.dirPath,".cursor/rules/general.mdc"),o=function(e,t,n){const s="---\ndescription: General Coding Rules\nglobs:\nalwaysApply: true\n---",i=ne(e,t,"Cursor",n);return`${s}\n\n${i}`}(e,n,i);await $.run(()=>S.generateFile(r,o))})}function ne(e,t,n,s){const i=e.isBun?"bun":"yarn",r=`\n## Project Information\n\n- Name: \`${e.packageJson?.name||"unknown"}\`\n- Description: ${e.packageJson?.description}\n- Package Manager: ${i}\n\n## General Instructions\n\n- Create a new branch if the current branch is \`main\`.\n- Run any \`git\` commands sequentially.\n- Write tests ONLY if explicitly requested.\n - Make sure to continue to modify the tests and code until the tests pass.\n- When writing tests, ensure they reset any related persistent data, as our test infrastructure does not clear it automatically.\n- Before fixing issues, always investigate the root cause first (e.g., by gathering debug logs, taking screenshots, etc.).\n- After making code changes, run \`${i} check-all-for-ai\` to execute all tests (takes up to 1 hour) or \`${i} check-for-ai\` for type checking and linting only (takes up to 10 minutes).\n - If you are confident your changes will not break any tests, you may use \`check-for-ai\`.\n- Once you have verified your changes, commit and push them to the current (non-main) branch then create a PR via \`gh\`.\n - Follow the conventional commits; your commit message should start with \`feat:\`, \`fix:\`, etc.\n - If not specified, make sure to add a new line at the end of your commit message${e.isWillBoosterRepo?` with: \`Co-authored-by: WillBooster (${n}) <agent@willbooster.com>\``:""}.\n - Always create new commits. Avoid using \`--amend\`.\n${t.some(e=>e.hasStartTestServer)?`- Use \`${i} run start-test-server\` to launch a web server for debugging or testing.`:""}\n\n${se(t)}\n`.replaceAll(/\.\n\n+-/g,".\n-").replaceAll(/\n{3,}/g,"\n\n").trim(),o=s?.trim().startsWith("#");return r+(s?o?"\n\n"+s.trim():"\n"+s:"")}function se(e){return`\n## Coding Style\n\n- Simplify code as much as possible to eliminate redundancy.\n- Design each module with high cohesion, grouping related functionality together.\n - Refactor existing large modules into smaller, focused modules when necessary.\n - Create well-organized directory structures with low coupling and high cohesion.\n- Place calling functions or classes in the file above the functions or classes they call to maintain a clear top-down order.\n - e.g. \`function caller() { callee(); } function callee() { ... }\`\n- Write comments that explain "why" rather than "what". Avoid stating what can be understood from the code itself.\n- Prefer \`undefined\` over \`null\` unless explicitly required by APIs or libraries.\n- Prefer using a single template literal for prompts instead of \`join()\` with an array of strings.\n${e.some(e=>e.depending.genI18nTs)?'- When introducing new string literals in React components, update the language resource files in the `i18n` directory (e.g., `i18n/ja-JP.json`). Reference these strings using the `i18n` utility. For example, use `i18n.pages.home.title()` for `{ "pages": { "home": { "title": "My App" } } }`.':""}\n${e.some(e=>e.depending.react||e.depending.next)?"- Prefer `useImmer` for storing an array or an object to `useState`.":""}\n${e.some(e=>e.depending.next)?"\n- Since this project uses the React Compiler, you do not need to use `useCallback` or `useMemo` for performance optimization.\n- Assume there is only a single server instance.\n":""}\n`.replaceAll(/\.\n\n+-/g,".\n-").replaceAll(/\n{3,}/g,"\n\n").trim()}async function ie(n){return _.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=c.all([s,n,s],{arrayMerge:N})}catch{}const r=JSON.stringify(s);await $.run(()=>S.generateFile(i,r))})}const re=["@exercode/problem-utils","@next/env","@next/eslint-plugin-next","@next/font","@next/rspack-binding-linux-arm64-gnu","@next/rspack-binding-linux-arm64-musl","@next/rspack-binding-linux-x64-gnu","@next/rspack-binding-linux-x64-musl","@next/swc-android-arm-eabi","@next/swc-android-arm64","@next/swc-darwin-arm64","@next/swc-darwin-x64","@next/swc-freebsd-x64","@next/swc-linux-arm-gnueabihf","@next/swc-linux-arm64-gnu","@next/swc-linux-arm64-musl","@next/swc-linux-x64-gnu","@next/swc-linux-x64-musl","@next/swc-wasm-nodejs","@next/swc-wasm-web","@next/swc-win32-arm64-msvc","@next/swc-win32-ia32-msvc","@next/swc-win32-x64-msvc","@next/third-parties","@willbooster/agent-skills","@willbooster/babel-configs","@willbooster/biome-config","@willbooster/eslint-config-blitz-next","@willbooster/eslint-config-js","@willbooster/eslint-config-js-react","@willbooster/eslint-config-next","@willbooster/eslint-config-ts","@willbooster/eslint-config-ts-react","@willbooster/oxfmt-config","@willbooster/oxlint-config","@willbooster/prettier-config","@willbooster/renovate-config","@willbooster/shared-lib","@willbooster/shared-lib-blitz-next","@willbooster/shared-lib-next","@willbooster/shared-lib-node","@willbooster/shared-lib-react","@willbooster/wb","next","react","react-dom"],oe=e=>{const t=function(e){if(!e)return;try{return m(e)}catch{return}}(e);return`env = false\ntelemetry = false\n\n${function(e){return"boolean"==typeof e?.run?.bun?`[run]\nbun = ${e.run.bun}\n`:""}(t)}\n[install]\nexact = ${!1===t?.install?.exact?"false":"true"}\nlinker = "hoisted"\nminimumReleaseAge = 432000 # 5 days\nminimumReleaseAgeExcludes = [\n${re.map(e=>` "${e}",`).join("\n")}\n]\n`};async function ae(n){return _.functionIgnoringException("generateBunfigToml",async()=>{const s=t.resolve(n.dirPath,"bunfig.toml"),i=e.existsSync(s)?e.readFileSync(s,"utf8"):void 0,r=oe(i);await $.run(()=>S.generateFile(s,r))})}const ce="# Project-specific settings",le=/# Project-specific settings[^\n]*\n/gm,pe="# Generated by wbfy",de=`${ce} (head)\n\n\n${pe}\n`,ue=`\n${ce} (tail)\n`,me={separator:pe,separatorPrefix:"# Generated by ",defaultHeadUserContent:de,defaultTailUserContent:ue,async readGitignoreWithoutSeparators(t){try{let n=await e.promises.readFile(t,"utf8");const s=ge(n);return s>0&&(n=n.slice(0,s-1)),n.replaceAll(le,"").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(le,`${ce} (head)\n`):de},getTailUserContent(e){const t=ge(e);return t>0?e.slice(t-1):ue},async isBerryZeroInstallEnabled(t){try{return(await e.promises.readFile(t,"utf8")).includes("\n!.yarn/cache")}catch{return!1}}};function ge(e){const t=e.indexOf(ce),n=e.lastIndexOf(ce);return n>t?n:-1}async function fe(n){return _.functionIgnoringException("generateDockerignore",async()=>{const s=t.resolve(n.dirPath,".dockerignore");if(n.doesContainDockerfile){const e=await S.readFileIgnoringError(s)??"",t=me.getHeadUserContent(e)+"\n**/.idea\n**/*.sqlite3*\n**/.yarn/install-state.gz\n**/.venv\n"+me.getTailUserContent(e);await $.run(()=>S.generateFile(s,t))}else await e.promises.rm(s,{force:!0})})}const he={codeWith2IndentSize:["cjs","mjs","js","jsx","cts","mts","ts","tsx","json","json5","jsonc","cpp","dart","htm","html","pu","puml","rb","vue","xml","yaml","yml","sh"].toSorted(),codeWith4IndentSize:["go","gradle","java","py"].toSorted(),markdownLike:["md"].toSorted(),eslint:["cjs","mjs","js","cts","mts","ts","tsx","jsx"].toSorted(),prettier:["cjs","mjs","java","js","jsx","cts","mts","ts","tsx","json","json5","jsonc","css","htm","html","md","scss","vue","yaml","yml"].toSorted(),biome:["cjs","mjs","js","jsx","cts","mts","ts","tsx","json","json5","jsonc","htm","html","vue","svelte","astro","css","yaml","yml","gql"].toSorted()},ye=`root = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\ninsert_final_newline = true\ntrim_trailing_whitespace = true\n\n${be(he.codeWith2IndentSize)}\nindent_size = 2\nindent_style = space\n\n${be(he.codeWith4IndentSize)}\nindent_size = 4\nindent_style = space\n\n${be(he.markdownLike)}\nmax_line_length = off\ntrim_trailing_whitespace = false\n\n[{Makefile,*.mk}]\nindent_style = tab\n`;async function we(e){return _.functionIgnoringException("generateEditorconfig",async()=>{const n=t.resolve(e.dirPath,".editorconfig");await $.run(()=>S.generateFile(n,ye))})}function be(e){return e.length>1?`[*.{${e.join(",")}}]`:`[*.${e[0]}]`}async function ve(n){return _.functionIgnoringException("generateEslintrc",async()=>{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(()=>S.generateFile(s,`export { default } from '${n.eslintBase}';`))}})}const ke={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 xe(n,s){return _.functionIgnoringException("generateGeminiConfig",async()=>{if(!n.isRoot)return;const i=t.resolve(n.dirPath,".gemini"),r=t.resolve(i,"config.yml"),o=t.resolve(i,"styleguide.md"),a=t.resolve(n.dirPath,"AGENTS_EXTRA.md");let l=u(ke);try{const t=await e.promises.readFile(r,"utf8"),n=d.load(t);l=c.all([l,n,l],{arrayMerge:N})}catch{}const p=d.dump(l,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}}),m=await S.readFileIgnoringError(a),g=`以下のコーディング規約を踏まえて、日本語でレビューしてください。\n\n${se(s)}${m?`\n\n${m.trimEnd()}`:""}`,f=[$.run(()=>S.generateFile(r,p))];e.existsSync(o)||f.push($.run(()=>S.generateFile(o,g))),await Promise.all(f)})}async function _e(n){return _.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 je=`* text=auto\n\n*.lockb binary diff=lockb\n*.vcproj text eol=crlf\n\n${[...he.codeWith2IndentSize,...he.codeWith4IndentSize,...he.markdownLike].map(e=>`*.${e} text eol=lf`).join("\n")}\n\ndist/** linguist-generated=true\n`;async function Se(e){return _.functionIgnoringException("generateGitattributes",async()=>{const n=t.resolve(e.dirPath,".gitattributes");await $.run(()=>S.generateFile(n,je))})}const $e=["windows","macos","linux","jetbrains","visualstudiocode","emacs","vim","yarn"];async function Pe(e,n){return _.functionIgnoringException("generateGitignore",async()=>{const s=t.resolve(e.dirPath,".gitignore"),i=await S.readFileIgnoringError(s)??"";let r=me.getHeadUserContent(i)+"\n!.keep\n.aider*\n.env.production\n*/mount/*.hash\n.devcontainer/\n.idea/AugmentWebviewStateStore.xml\n.idea/copilot.*\n.idea/copilot/chatSessions/\n.playwright-cli/\n.serena/\n.tmp/\n__generated__/\n@willbooster/\ndist/\ntemp/\ntmp/\n";const o=me.getTailUserContent(i),a=[...$e];e.doesContainGemfile&&a.push("ruby"),e.doesContainGoMod&&(a.push("go"),r+=`${t.basename(e.dirPath)}\n`),e.doesContainPackageJson&&a.push("node"),e.doesContainPomXml&&(a.push("maven"),r+=".idea/google-java-format.xml\n"),e.doesContainPubspecYaml&&(a.push("flutter","AndroidStudio","ruby"),r+=".flutter-plugins-dependencies\nandroid/key.properties\nios/.bundle\n.idea/runConfigurations.xml\n"),e.doesContainTemplateYaml&&(r+=".aws-sam/\npackaged.yaml\n"),e.doesContainPoetryLock&&(a.push("python"),r+=".venv/\n"),e.depending.blitz&&(r+=".blitz/\n.blitz**\n"),e.depending.next&&a.push("nextjs"),(n.depending.firebase||e.depending.firebase)&&a.push("firebase"),e.depending.prisma&&(r+="*.sqlite3*\n"),e.depending.playwrightTest&&(r+="playwright-report/\ntest-results/\n"),(n.depending.reactNative||e.depending.reactNative)&&(a.push("reactnative"),r+="google-services.json\nandroid/app/src/main/assets/\n"),e.depending.storybook&&a.push("storybookjs"),e.depending.litestream&&(r+="gcp-sa-key.json\n");let c="";for(const e of a){let t=await Be(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(()=>Ee(e,t)),x.isVerbose&&console.info(`Fetched ${n}`)}c&&(c+="\n"),c+=t+"\n"}await me.isBerryZeroInstallEnabled(s)||(c=c.replace("!.yarn/cache","# !.yarn/cache").replace("# .pnp.*",".pnp.*")),(e.doesContainPomXml||e.doesContainPubspecYaml)&&(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.doesContainPubspecYaml&&(c=c.replaceAll(/^.idea\/modules.xml$/gm,"# .idea/modules.xml"))),c=c.replaceAll(/^.idea\/?$/gm,"# .idea"),(n.depending.reactNative||e.depending.reactNative||e.doesContainPubspecYaml)&&(c=c.replaceAll(/^(.idea\/.+)$/gm,"$1\nandroid/$1"));const l=r+"\n"+c+o;await $.run(()=>S.generateFile(s,l))})}const Ce=t.join(g.homedir(),".cache","wbfy","gitignore");async function Ee(n,s){await e.promises.mkdir(Ce,{recursive:!0}),await e.promises.writeFile(t.join(Ce,n),s)}async function Be(n){try{const s=await e.promises.stat(t.join(Ce,n));if(Date.now()-s.mtimeMs>216e5)return;return await e.promises.readFile(t.join(Ce,n),"utf8")}catch{}}function Oe(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 Fe=`<?xml version="1.0" encoding="UTF-8"?>\n<project version="4">\n <component name="ProjectTasksOptions">\n${he.prettier.map(e=>Oe("node","node_modules/.bin/prettier --cache --write","Prettier",e)).join("")}\n </component>\n</project>\n`,Ae=`<?xml version="1.0" encoding="UTF-8"?>\n<project version="4">\n <component name="ProjectTasksOptions">\n${he.prettier.map(e=>Oe("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 Ie(n){return _.functionIgnoringException("generateIdeaSettings",async()=>{const s=t.resolve(n.dirPath,".idea");if(e.existsSync(s)){const i=t.resolve(s,"watcherTasks.xml");await(n.doesContainJavaScript||n.doesContainJavaScriptInPackages||n.doesContainTypeScript||n.doesContainTypeScriptInPackages||n.doesContainPackageJson&&!n.doesContainPubspecYaml&&!n.doesContainGemfile&&!n.doesContainGoMod&&!n.doesContainPomXml?$.run(()=>S.generateFile(i,n.isBun?Ae:Fe)):$.run(()=>e.promises.rm(i,{force:!0})))}})}function Te(e,t,n,s=0){do{const[s,i,r]=Re(e,t,n);if(0===f.spawnSync(s,i,r).status)break}while(--s>=0)}function De(e,t,n){const[s,i,r]=Re(e,t,n);r.stdio="pipe";const o=f.spawnSync(s,i,r),a=o.stderr??"",c="string"==typeof a?a.trim():a.toString().trim();o.error?console.error(`${s} [${i.map(e=>`"${e}"`).join(", ")}] failed with: ${o.error.message}`):c&&console.error(`${s} [${i.map(e=>`"${e}"`).join(", ")}] outputs the following content to stderr:\n${c}`);const l=o.stdout??"";return"string"==typeof l?l.trim():l.toString().trim()}function Re(e,t,n){const s={...process.env};return s.PATH&&s.BERRY_BIN_FOLDER&&(s.PATH=s.PATH.replace(`${s.BERRY_BIN_FOLDER}:`,"")),[e,t,{cwd:n,env:s,encoding:"utf8",shell:!1,stdio:"inherit"}]}function We(e,t){try{const n=`git@github.com:${e}/${t}.git`,s=De("git",["ls-remote",n,"HEAD"],process.cwd()).split(/\s+/)[0];if(!s)throw new Error(`No commits found for ${e}/${t}`);return Promise.resolve(s)}catch(n){return Promise.reject(new Error(`Failed to fetch commits for ${e}/${t}: ${String(n)}`))}}const Le={getLintFixSuffix:e=>e.doesContainJsxOrTsx?' --rule "{ react-hooks/exhaustive-deps: 0 }"':""};const Ne=new class{getOrgAndName(e){const t=e.split(":").at(-1),n=t?.split("/");return[n?.at(-2)??"",n?.at(-1)?.replace(/.git$/,"")??""]}},Je=new Map;function Ge(e){const t=e??"",n=Je.get(t);if(n)return n;const s=new h({auth:ze(e)||void 0});return Je.set(t,s),s}function Ue(e){return!!ze(e)}function ze(e){return"WillBooster"===e?process.env.GH_BOT_PAT_FOR_WILLBOOSTER:"WillBoosterLab"===e?process.env.GH_BOT_PAT_FOR_WILLBOOSTERLAB:process.env.GH_BOT_PAT_FOR_WILLBOOSTER||process.env.GH_BOT_PAT_FOR_WILLBOOSTERLAB||process.env.GH_TOKEN||process.env.GITHUB_TOKEN}const Me={"@eslint/js":"^9",eslint:"^9","eslint-plugin-sort-class-members":"1.21.0",typescript:"^5"};function qe(e){return e.isWillBoosterConfigs&&!0===e.packageJson?.name?.startsWith("@willbooster/eslint-config-")}const He=["@eslint/js","eslint","eslint-config-flat-gitignore","eslint-config-prettier","eslint-plugin-import-x","eslint-plugin-sort-class-members","eslint-plugin-sort-destructure-keys","eslint-plugin-unicorn","eslint-plugin-unused-imports","globals"],Ye=[...He,"typescript-eslint","eslint-import-resolver-typescript"],Ke=["eslint-plugin-react","eslint-plugin-react-hooks","eslint-plugin-react-compiler"],Ve={"@willbooster/eslint-config-js":["@willbooster/eslint-config-js",...He],"@willbooster/eslint-config-js-react":["@willbooster/eslint-config-js-react",...He,...Ke],"@willbooster/eslint-config-ts":["@willbooster/eslint-config-ts",...Ye],"@willbooster/eslint-config-ts-react":["@willbooster/eslint-config-ts-react",...Ye,...Ke],"@willbooster/eslint-config-next":["@willbooster/eslint-config-next","@next/eslint-plugin-next",...Ye,...Ke]};async function Xe(n,s,i){return _.functionIgnoringException("generatePackageJson",async()=>{await async function(n,s,i){const r=t.resolve(n.dirPath,"package.json"),o=await e.promises.readFile(r,"utf8"),a=JSON.parse(o);a.scripts=a.scripts??{},a.dependencies=a.dependencies??{},a.devDependencies=a.devDependencies??{},a.peerDependencies=a.peerDependencies??{};const l=n.isBun?"bun":"yarn";await async function(t){"WillBooster LLC"===t.author&&(t.author="WillBooster Inc.");delete t.scripts["sort-package-json"],delete t.scripts["sort-all-package-json"],delete t.scripts["typecheck/warn"],delete t.scripts["typecheck:gen-code"],delete t.scripts["typecheck:codegen"],delete t.dependencies.tslib,delete t.devDependencies["@willbooster/eslint-config"],delete t.devDependencies["@willbooster/eslint-config-react"],delete t.devDependencies["@willbooster/renovate-config"],delete t.devDependencies["@willbooster/tsconfig"],delete t.devDependencies["eslint-import-resolver-node"],delete t.devDependencies["eslint-plugin-prettier"],delete t.devDependencies.lerna,delete t.devDependencies.pinst,delete t.scripts["flutter-format"],delete t.scripts["format-flutter"],delete t.scripts["python-format"],delete t.scripts["format-python"],delete t.scripts.prettier,delete t.scripts["check-all"],await $.run(()=>e.promises.rm("lerna.json",{force:!0})),delete t.devDependencies["@typescript-eslint/eslint-plugin"],delete t.devDependencies["@typescript-eslint/parser"],delete t.devDependencies["eslint-plugin-import"]}(a);for(const[e,t]of Object.entries(a.scripts))t.includes("git clone")||(a.scripts[e]=t.replace(/yarn\s*&&\s*/,"").replace(/yarn\s*install\s*&&\s*/,""));a.scripts=c(a.scripts,tt(n,a.scripts)),"check-for-ai"in a.scripts&&("gen-code"in a.scripts&&(a.scripts["check-for-ai"]=`${l} gen-code > /dev/null && ${a.scripts["check-for-ai"]}`),a.scripts["check-for-ai"]=`${l} install > /dev/null && ${a.scripts["check-for-ai"]}`);n.isBun?delete a.scripts.prettify:a.scripts.prettify=(a.scripts.prettify??"")+await async function(n){const s=t.resolve(n,".prettierignore"),i=await e.promises.readFile(s,"utf8"),r=i.indexOf(me.separatorPrefix);if(-1===r)return"";const o=i.slice(0,r);return`${o.split("\n").map(e=>{const t=e.trim();return t.endsWith("/")?t.slice(0,-1):t}).filter(e=>e&&!e.startsWith("#")&&!e.includes("/")).map(e=>` "!**/${e}/**"`).join("")} || true`}(n.dirPath);for(const[e,t]of Object.entries(a.scripts))t?.includes("yarn workspaces foreach")&&(t.includes("--all")||t.includes("--recursive")||t.includes("--since")||t.includes("--worktree")||(a.scripts[e]=t.replace("yarn workspaces foreach","yarn workspaces foreach --all")));let d=[],u=["prettier","sort-package-json"];const m=[];e.existsSync(t.join(s.dirPath,".prettierrc.json"))||e.existsSync(t.join(n.dirPath,".prettierrc.json"))||(a.prettier="@willbooster/prettier-config",u.push("prettier-plugin-java","@willbooster/prettier-config"));if(delete a.devDependencies["lint-staged"],delete a["lint-staged"],n.isRoot){if(delete a.devDependencies.husky,delete a.devDependencies.pinst,delete a.scripts.postinstall,delete a.scripts.postpublish,delete a.scripts.prepublishOnly,delete a.scripts.prepack,delete a.scripts.postpack,a.scripts.prepare="lefthook install || true",u.push("lefthook"),n.depending.semanticRelease&&(a.devDependencies["semantic-release"]||a.devDependencies["multi-semantic-release"]||a.devDependencies["@qiwi/multi-semantic-release"]||u.push("semantic-release"),a.version="0.0.0-semantically-released"),n.depending.playwrightTest){a.dependencies.artillery||a.devDependencies.artillery||a.dependencies["@playwright/test"]||(u.push("@playwright/test"),delete a.dependencies["@playwright/test"]),delete a.dependencies.playwright,delete a.devDependencies.playwright}n.doesContainSubPackageJsons?a.workspaces=Array.isArray(a.workspaces)?c.all([a.workspaces,["packages/*"]],{arrayMerge:J}):["packages/*"]:Array.isArray(a.workspaces)&&(a.workspaces=a.workspaces.filter(e=>p.globSync(e,{dot:!0,cwd:n.dirPath,ignore:D}).length>0),0===a.workspaces.length&&delete a.workspaces)}if(n.depending.wb||n.isBun){a.dependencies["@willbooster/wb"]?d.push("@willbooster/wb"):u.push("@willbooster/wb");for(const[e,t]of Object.entries(a.scripts))a.scripts[e]=t.replace(/wb\s+db/,"wb prisma")}(n.doesContainJavaScript||n.doesContainJavaScriptInPackages||n.doesContainTypeScript||n.doesContainTypeScriptInPackages)&&(n.isBun?(u.push("@biomejs/biome","@willbooster/biome-config"),delete a.devDependencies.eslint,delete a.devDependencies.micromatch,delete a.devDependencies["typescript-eslint"]):u.push("eslint","micromatch"));(n.doesContainJavaScript||n.doesContainJavaScriptInPackages||n.doesContainTypeScript||n.doesContainTypeScriptInPackages)&&u.push(...function(e){return e.isBun?["@tsconfig/bun"]:e.depending.reactNative?["@tsconfig/react-native"]:["@tsconfig/node-lts","@tsconfig/node-ts"]}(n));(n.doesContainTypeScript||n.doesContainTypeScriptInPackages)&&(u.push("typescript"),n.isBun?u.push("@types/bun"):n.depending.reactNative||u.push("@types/node"),(a.dependencies.jest||a.devDependencies.jest||a.dependencies["@jest/globals"]||a.devDependencies["@jest/globals"]||a.dependencies["ts-jest"]||a.devDependencies["ts-jest"])&&u.push("@types/jest"));n.eslintBase&&u.push(...Ve[n.eslintBase]);n.isWillBoosterConfigs&&(d=d.filter(e=>!e.includes("@willbooster/")),u=u.filter(e=>!e.includes("@willbooster/")));a.name||(a.name=t.basename(n.dirPath));n.doesContainSubPackageJsons&&(a.private=!0);a.license||(a.license="UNLICENSED");!a.private&&"UNLICENSED"!==a.license&&s.isPublicRepo&&(a.publishConfig??={},a.publishConfig.access??="public");const[g]=Ne.getOrgAndName(n.repository??"");"WillBooster"!==g&&"WillBoosterLab"!==g||(a.author="WillBooster Inc.");n.isRoot||!a.private||a.main||(a.main="./src");if(delete a.resolutions?.["npm/chalk"],!n.doesContainSubPackageJsons){if(!n.isBun)if(n.doesContainJavaScript||n.doesContainTypeScript)a.scripts["lint-fix"]=(a.scripts["lint-fix"]??"")+Le.getLintFixSuffix(n);else{delete a.scripts.lint,delete a.scripts["lint-fix"];for(const e of["cleanup","check-for-ai"]){const t=a.scripts[e];t&&(a.scripts[e]=t.replace(/ ?&& ?yarn lint-fix(?: --quiet)?/,""))}}if(n.doesContainPubspecYaml){a.scripts.lint="flutter analyze",a.scripts["lint-fix"]="yarn lint";const s=["lib","test","test_driver"].filter(s=>e.existsSync(t.resolve(n.dirPath,s)));s.length>0&&(a.scripts["format-code"]=`dart format $(find ${s.join(" ")} -name generated -prune -o -name '*.freezed.dart' -prune -o -name '*.g.dart' -prune -o -name '*.dart' -print)`,a.scripts.format=(a.scripts.format??"")+" && yarn format-code")}if(n.doesContainPoetryLock){"poetry install"===a.scripts.postinstall&&delete a.scripts.postinstall;const e=await p.glob("**/*.py",{cwd:n.dirPath,dot:!0,ignore:D}),t=new Set;for(const n of e){const[e,s]=n.split(/[/\\]/);e&&s&&t.add(e)}if(t.size>0){const e=[...t].join(" ");a.scripts["format-code"]=`poetry run isort --profile black ${e} && poetry run black ${e}`,a.scripts.lint?a.scripts.lint=`poetry run flake8 ${e} && ${a.scripts.lint}`:(a.scripts.lint=`poetry run flake8 ${e}`,a.scripts["lint-fix"]="yarn lint"),a.scripts.format=(a.scripts.format??"")+" && yarn format-code",m.push("black","isort","flake8")}}}(n.repository||a.repository)&&(a.repository=function(e,t){const n=Qe(e);if(n)return et(n,e,t);const s=Qe(t);if(s)return et(s,t);return e}(n.repository??a.repository,a.repository));n.depending.blitz?a.scripts["gen-code"]?.startsWith("blitz codegen")?a.scripts["gen-code"].includes("blitz prisma generate")||(a.scripts["gen-code"]=a.scripts["gen-code"].replace("blitz codegen","blitz codegen && blitz prisma generate")):a.scripts["gen-code"]="blitz codegen":n.depending.prisma&&!a.scripts["gen-code"]?.startsWith("prisma generate")&&(a.scripts["gen-code"]="prisma generate");a.dependencies.prettier||delete a.devDependencies["@types/prettier"];0===Object.keys(a.dependencies).length&&delete a.dependencies;0===Object.keys(a.devDependencies).length&&delete a.devDependencies;0===Object.keys(a.peerDependencies).length&&delete a.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")&&!nt(e,"@willbooster/auth")){delete e.devDependencies["@willbooster/auth"];const t=await We("WillBoosterLab","auth");e.dependencies["@willbooster/auth"]=`git@github.com:WillBoosterLab/auth.git#${t}`}if(t.has("@discord-bot/shared")&&!nt(e,"@discord-bot/shared")){delete e.devDependencies["@discord-bot/shared"];const t=await We("WillBoosterLab","discord-bot");e.dependencies["@discord-bot/shared"]=`git@github.com:WillBoosterLab/discord-bot.git#${t}`}if(t.has("@willbooster/code-analyzer")&&!nt(e,"@willbooster/code-analyzer")){delete e.dependencies["@willbooster/code-analyzer"];const t=await We("WillBoosterLab","code-analyzer");e.devDependencies["@willbooster/code-analyzer"]=`git@github.com:WillBoosterLab/code-analyzer.git#${t}`}if(t.has("@willbooster/judge")&&!nt(e,"@willbooster/judge")){delete e.devDependencies["@willbooster/judge"];const t=await We("WillBoosterLab","judge");e.dependencies["@willbooster/judge"]=`git@github.com:WillBoosterLab/judge.git#${t}`}if(t.has("@willbooster/llm-proxy")&&!nt(e,"@willbooster/llm-proxy")){delete e.devDependencies["@willbooster/llm-proxy"];const t=await We("WillBoosterLab","llm-proxy");e.dependencies["@willbooster/llm-proxy"]=`git@github.com:WillBoosterLab/llm-proxy.git#${t}`}}(a),n.isBun&&delete a.packageManager;let f=JSON.stringify(a);if(f=await async function(n,s,i){const r=[];for(const[e]of Object.keys(n))e&&!e.startsWith(":")&&e.includes(":")&&r.push([e,e.replaceAll(":","-")]);if(0===r.length)return s;for(const[e,t]of r)s=s.replaceAll(e,t);const o=await p.glob(["**/*.{md,cjs,mjs,js,jsx,cts,mts,ts,tsx}","**/Dockerfile"],{cwd:i.dirPath,dot:!0,ignore:D});for(const n of o)await $.run(async()=>{const s=t.join(i.dirPath,n),o=await e.promises.readFile(s,"utf8");let a=o;for(const[e,t]of r)a=a.replaceAll(e,t);a!==o&&await e.promises.writeFile(s,a)});return await $.promiseAll(),s}(a.scripts,f,n),await e.promises.writeFile(r,f),!i){if(d=d.filter(e=>!a.devDependencies?.[e]),d.length>0){const e=[...new Set(d)],t=e.map(e=>Ze(e));n.isBun?(Te(l,["remove",...e],n.dirPath),Te(l,["add","--exact",...t],n.dirPath)):Te(l,["add",...t],n.dirPath)}if(u=u.filter(e=>!a.dependencies?.[e]),u.length>0){const e=[...new Set(u)],t=e.map(e=>Ze(e));n.isBun?(Te(l,["remove",...e],n.dirPath),Te(l,["add","-D","--exact",...t],n.dirPath)):Te(l,["add","-D",...t],n.dirPath)}m.length>0&&Te("poetry",["add","--group","dev",...new Set(m)],n.dirPath)}}(n,s,i)})}function Ze(e){return function(e){for(const[t,n]of Object.entries(Me))if(t===e)return`${t}@${n}`}(e)??e}function Qe(e){if("string"==typeof e){if(!e.startsWith("github:"))return;const[t,n]=Ne.getOrgAndName(e);if(!t||!n)return;return`git+https://github.com/${t}/${n}.git`}const t=e?.url;if("string"!=typeof t)return;const n=/^(?:git\+)?https:\/\/github\.com\/([^/]+)\/([^/]+?)(?:\.git)?$/u.exec(t);if(!n)return;const[,s,i]=n;return`git+https://github.com/${s}/${i}.git`}function et(e,t,n){return{..."object"==typeof t?t:"object"==typeof n?n:void 0,type:"git",url:e}}function tt(e,t){if(e.isBun){const t=e.doesContainTypeScript||e.doesContainTypeScriptInPackages,n={"check-all-for-ai":"bun run check-for-ai && bun run test","check-for-ai":"bun run cleanup"+(t?" && 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 t||delete n.typecheck,n}{const n=e.doesContainTypeScript||e.doesContainTypeScriptInPackages,s=t.test;let i={"check-all-for-ai":"yarn check-for-ai && yarn test","check-for-ai":`yarn format > /dev/null 2> /dev/null || true${n?" && yarn typecheck":""} && yarn lint-fix --quiet`,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 "**/{.*/,}*.{${he.prettier.join(",")}}" "!**/test{-,/}fixtures/**"`,typecheck:"tsc --noEmit"};return e.doesContainSubPackageJsons?i=c({...i},{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 "**/{.*/,}*.{${he.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.depending.pyright&&(i.typecheck=i.typecheck?`${i.typecheck} && `:"",i.typecheck+="pyright"),s?.includes("wb test")&&(i.test=s),n?e.depending.wb&&(i.typecheck="wb typecheck"):delete i.typecheck,i}}function nt(e,t){return(e.devDependencies?.[t]||e.dependencies?.[t]||"").includes("workspace")}const st={"post-merge":{scripts:{"prepare.sh":{runner:"bash"}}},"pre-push":{scripts:{"check.sh":{runner:"bash"}}}},it={commands:{cleanup:{glob:"",run:""},"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()}}},rt='\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 ot(n){return _.functionIgnoringException("generateLefthookUpdatingPackageJson",async()=>{await async function(n){const s=t.resolve(n.dirPath,".lefthook"),i=t.resolve(n.dirPath,".husky"),r=e.existsSync(i),{typecheck:o}=tt(n,{}),a={...st,"pre-commit":{...it,commands:{...it.commands,cleanup:{...it.commands.cleanup,glob:at(n),run:ct(n)}}}};o||delete a["pre-push"];await Promise.all([e.promises.writeFile(t.join(n.dirPath,"lefthook.yml"),d.dump(a,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}})),e.promises.rm(s,{force:!0,recursive:!0})]),r&&(await Promise.all([e.promises.rm(i,{force:!0,recursive:!0}),e.promises.rm(t.resolve(n.dirPath,".huskyrc.json"),{force:!0})]),Te("git",["config","--unset","core.hooksPath"],n.dirPath));if(o){const i=function(e){let t;t=e.isBun?e.depending.wb?"bun --bun wb typecheck":"bun run typecheck":e.depending.wb?"yarn wb typecheck":"yarn run typecheck";if(e.repository?.startsWith("github:WillBoosterLab/"))return`\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\n${t}\n`.trim();return t}(n);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 c=`${rt}\n\n${function(e){const t=[];if(e.hasVersionSettings){const e=String.raw`(mise\.toml|\.mise\.toml|\.tool-versions|\..+-version)`;t.push(String.raw`run_if_changed "${e}" "mise install"`)}const n=e.isBun?"bun install":"yarn",s=e.depending.blitz||e.depending.next?" && rm -Rf .next":"";t.push(String.raw`run_if_changed "package\.json" "${n}${s}"`),e.doesContainPoetryLock&&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"`);return t}(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"),c,{mode:493}))}(n)})}function at(e){const t=[...he.prettier,...he.eslint,...e.depending.wb||e.isBun?he.biome:[]];e.doesContainPoetryLock&&t.push("py"),e.doesContainPubspecYaml&&t.push("dart");return`**/*.{${[...new Set(t)].filter(t=>e.isBun||!["astro","gql","svelte"].includes(t)).toSorted().join(",")}}`}function ct(n){if(function(n){if(!n.isRoot)return!1;const s=t.resolve(n.dirPath,"packages","wb","package.json");if(!e.existsSync(s))return!1;try{return"@willbooster/wb"===JSON.parse(e.readFileSync(s,"utf8")).name}catch{return!1}}(n))return'yarn workspace @willbooster/wb start --working-dir "$(git rev-parse --show-toplevel)" lint --fix --format -- {staged_files} && git add -- {staged_files}';if(n.isBun||n.depending.wb){const e=n.isBun?"bun":"yarn";return`${n.depending.wb?(n.isBun?"bun --bun wb":"yarn wb")+" lint --fix --format -- {staged_files}":`${e} run format && ${e} run lint-fix`} && git add -- {staged_files}`}const s=n.doesContainJsxOrTsx||n.doesContainJsxOrTsxInPackages?' --rule "{ react-hooks/exhaustive-deps: 0 }"':"",i=he.eslint.map(e=>String.raw`\.${e}$`).join("|");return String.raw`
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 r from"yargs";import o from"node:fs/promises";import{PromisePool as a}from"minimal-promise-pool";import c from"deepmerge";import l from"typescript";import p from"fast-glob";import d from"js-yaml";import u from"lodash.clonedeep";import{parse as m}from"smol-toml";import g from"node:os";import f from"node:child_process";import{Octokit as h}from"@octokit/core";import y from"dotenv";import w from"libsodium-wrappers";import{distance as b}from"fastest-levenshtein";import{simpleGit as v}from"simple-git";import{z as k}from"zod";const x=new class{isVerbose=!1;doesUploadEnvVars=!1};const _=new class{async functionIgnoringException(e,t){x.isVerbose&&console.info(`--------- ${e} start ---------`);try{await t()}catch(t){console.info(`Error occurred in ${e}: ${t instanceof Error?t.stack:String(t)}}`)}x.isVerbose&&console.info(`---------- ${e} end ----------`)}};async function j(e){return _.functionIgnoringException("fixDockerfile",async()=>{if(!e.doesContainDockerfile)return;const n=e.dockerfile,s=n;n!==s&&await o.writeFile(t.join(e.dirPath,"Dockerfile"),s)})}const S={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});let i=s.replaceAll("\r\n","\n").trim();i&&(i+="\n"),await e.promises.writeFile(n,i)}},$=new a;async function P(n){return _.functionIgnoringException("fixNextConfigJson",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(()=>S.generateFile(s,i))})}const C=e=>({kind:"literal",value:e}),E=e=>({kind:"object",value:e}),O={forbidOnly:C("!!process.env.CI"),retries:C("process.env.PWDEBUG ? 0 : process.env.CI ? 5 : 1"),use:E({baseURL:C("process.env.NEXT_PUBLIC_BASE_URL"),trace:C("process.env.CI ? 'on-first-retry' : 'retain-on-failure'"),screenshot:C("process.env.CI ? 'only-on-failure' : 'only-on-failure'"),video:C("process.env.CI ? 'retain-on-failure' : 'retain-on-failure'")}),webServer:E({command:C("'yarn start-test-server'"),url:C("process.env.NEXT_PUBLIC_BASE_URL"),reuseExistingServer:C("!!process.env.CI"),timeout:C("300_000"),stdout:C("'pipe'"),stderr:C("'pipe'"),env:C("{\n ...process.env,\n PRISMA_USER_CONSENT_FOR_DANGEROUS_AI_ACTION: 'true',\n}"),gracefulShutdown:C("{\n signal: 'SIGTERM',\n timeout: 500,\n}")})};async function B(n){return _.functionIgnoringException("fixPlaywrightConfig",async()=>{const s=t.resolve(n.dirPath,"playwright.config.ts");if(!e.existsSync(s))return;const i=await e.promises.readFile(s,"utf8"),r=/defineConfig\s*\(\s*(\{[\s\S]*?})\s*\);?/.exec(i),o=r?.[1];if(!o)return;const a=function(e){const t=l.createSourceFile("playwright-config.ts",`const config = ${e};`,l.ScriptTarget.Latest,!0,l.ScriptKind.TS),n=t.statements[0];if(!n||!l.isVariableStatement(n))return;const s=n.declarationList.declarations[0];if(!s?.initializer||!l.isObjectLiteralExpression(s.initializer))return;return F(s.initializer,t)}(o);if(!a)return;const p=c.all([O,a]);Boolean(n.packageJson?.scripts?.["start-test-server"])||delete p.webServer;const d=await async function(n){const s=[t.resolve(n,".env"),t.resolve(n,"mise.toml")];for(const t of s)try{const n=await e.promises.readFile(t,"utf8");if(/NEXT_PUBLIC_BASE_URL\s*=/m.test(n))return!0}catch{}return!1}(n.dirPath);if(!d){const e=p.use;"object"===e?.kind&&delete e.value.baseURL}const u=T(p,0),m=i.replace(o,u);await $.run(()=>S.generateFile(s,m))})}function F(e,t){const n={};for(const s of e.properties){if(!l.isPropertyAssignment(s)||!l.isIdentifier(s.name)&&!l.isStringLiteral(s.name))return;const e=A(s.initializer,t);if(void 0===e)return;n[s.name.getText(t)]=e}return n}function A(e,t){if(l.isObjectLiteralExpression(e)){const n=F(e,t);return n?E(n):C(e.getText(t))}if(l.isArrayLiteralExpression(e)){const n=e.elements.map(e=>A(e,t));return n.some(e=>void 0===e)?C(e.getText(t)):{kind:"array",value:n}}return C(e.getText(t))}function I(e,t){return"array"===e.kind?function(e,t){if(0===e.length)return"[]";const n=" ".repeat(t+1),s=e.map(e=>{const s=I(e,t+1).split("\n");if(s[s.length-1]=`${s.at(-1)},`,"literal"===e.kind)for(let e=1;e<s.length;e+=1)s[e]=`${n}${s[e]}`;return s[0]=`${n}${s[0]}`,s.join("\n")}),i=" ".repeat(t);return`[\n${s.join("\n")}\n${i}]`}(e.value,t):"literal"===e.kind?e.value:T(e.value,t)}function T(e,t){const n=" ".repeat(t+1),s=Object.entries(e).map(([e,s])=>{const i=I(s,t+1).split("\n");if(i[i.length-1]=`${i.at(-1)},`,"literal"===s.kind)for(let e=1;e<i.length;e+=1)i[e]=`${n}${i[e]}`;return i[0]=`${n}${e}: ${i[0]}`,i.join("\n")}),i=" ".repeat(t);return 0===s.length?`{\n${i}}`:`{\n${s.join("\n")}\n${i}}`}const D=["**/node_modules/**","**/.venv/**","**/test-fixtures/**","**/test/fixtures/**","**/dist/**","**/build/**","**/target/**","**/temp/**","**/tmp/**"];async function R(e){return _.functionIgnoringException("fixPrismaEnvFiles",async()=>{const n=await p.glob(["*.env","*.env.*"],{dot:!0,cwd:e.dirPath,ignore:D});for(const s of n){const n=t.resolve(e.dirPath,s),i=(await o.readFile(n,"utf8")).replace(/DATABASE_URL="?(.+\.sqlite3)"?[\n$]/,'DATABASE_URL="$1?connection_limit=1"\n');await o.writeFile(n,i)}})}async function W(n){return _.functionIgnoringException("fixTestDirectoriesUpdatingPackageJson",async()=>{await Promise.all(n.map(async n=>{const s=t.join(n,"test");for(const i of["__tests__","tests"]){const r=t.join(n,i);try{await e.promises.rename(r,s);const o=await e.promises.readFile(t.join(n,"package.json"),"utf8"),a=o.replaceAll(i,"test");if(o===a)return;await e.promises.writeFile(t.join(n,"package.json"),a)}catch{}}}))})}async function L(e,s){return _.functionIgnoringException("fixTypeDefinitions",async()=>{const i=t.resolve(e.dirPath,"@types"),r=e.isRoot&&e.doesContainSubPackageJsons?void 0:t.resolve(e.dirPath,"src","types"),a=await n(()=>o.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 o.mkdir(t.join(i,a)),await $.run(()=>o.rename(t.join(i,e.name),t.join(i,a,"index.d.ts")))):r&&(await o.mkdir(r,{recursive:!0}),await $.run(()=>o.rename(t.join(i,e.name),t.join(r,e.name)))):e.isDirectory()&&r&&!p&&(await o.mkdir(r,{recursive:!0}),await $.run(()=>n(()=>o.rename(t.join(i,e.name,"index.d.ts"),t.join(r,`${e.name}.d.ts`)))))}})}function N(e,t){return t}function J(e,t,n){const s=[...e];for(const[i,r]of t.entries())void 0===s[i]?s[i]=n.cloneUnlessOtherwiseSpecified(r,n):n.isMergeableObject(r)?s[i]=c(e[i],r,n):e.includes(r)||s.push(r);return s}function G(e){const t=Object.entries(e).toSorted(([e],[t])=>e.localeCompare(t));for(const[n,s]of t)delete e[n],e[n]=s,"object"==typeof s&&null!==s&&G(s);return e}const U={name:"autofix.ci",on:{pull_request:null,push:{branches:["main"]}},permissions:{contents:"read"},concurrency:{group:"autofix-${{ github.head_ref }}","cancel-in-progress":!0},jobs:{autofix:{"runs-on":"ubuntu-latest"}}},z={name:"Fix code automatically",on:{pull_request:null},concurrency:{group:"${{ github.workflow }}-${{ github.ref }}","cancel-in-progress":!0},jobs:{autofix:{uses:"WillBooster/reusable-workflows/.github/workflows/autofix.yml@main"}}},M={test:{name:"Test",on:{pull_request:null,push:{branches:["main","wbfy"]}},concurrency:{group:"${{ github.workflow }}-${{ github.ref }}","cancel-in-progress":!0},permissions:{contents:"write"},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},permissions:{"id-token":"write",contents:"write"},jobs:{release:{uses:"WillBooster/reusable-workflows/.github/workflows/release.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:{},permissions:{contents:"write"},jobs:{sync:{uses:"WillBooster/reusable-workflows/.github/workflows/sync.yml@main"}}},"close-comment":{name:"Add close comment",on:{pull_request:{types:["opened"]}},jobs:{"close-comment":{uses:"WillBooster/reusable-workflows/.github/workflows/close-comment.yml@main"}}},"gen-pr-claude":{name:"Generate PR with Claude Code",on:{issues:{types:["labeled"]},pull_request:{types:["labeled"]}},jobs:{"gen-pr":{if:"contains(github.event.label.name, 'gen-pr-all') || contains(github.event.label.name, 'gen-pr-claude')",uses:"WillBooster/reusable-workflows/.github/workflows/gen-pr.yml@main",with:{"coding-tool":"claude-code","issue-number":"${{ github.event.issue.number || github.event.number }}","test-command":"yarn|bun check-all-for-ai"},secrets:{CLAUDE_CODE_OAUTH_TOKEN:"${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}"}}}},"gen-pr-codex":{name:"Generate PR with Codex CLI",on:{issues:{types:["labeled"]},pull_request:{types:["labeled"]}},jobs:{"gen-pr":{if:"contains(github.event.label.name, 'gen-pr-all') || contains(github.event.label.name, 'gen-pr-codex')",uses:"WillBooster/reusable-workflows/.github/workflows/gen-pr.yml@main",with:{"coding-tool":"codex-cli","issue-number":"${{ github.event.issue.number || github.event.number }}","test-command":"yarn|bun check-all-for-ai"},secrets:{OPENAI_API_KEY:"${{ secrets.OPENAI_API_KEY }}"}}}},"gen-pr-gemini":{name:"Generate PR with Gemini CLI",on:{issues:{types:["labeled"]},pull_request:{types:["labeled"]}},jobs:{"gen-pr":{if:"contains(github.event.label.name, 'gen-pr-all') || contains(github.event.label.name, 'gen-pr-gemini')",uses:"WillBooster/reusable-workflows/.github/workflows/gen-pr.yml@main",with:{"coding-tool":"gemini-cli","issue-number":"${{ github.event.issue.number || github.event.number }}","test-command":"yarn|bun check-all-for-ai"},secrets:{GEMINI_API_KEY:"${{ secrets.GEMINI_API_KEY }}"}}}}};async function q(n){return _.functionIgnoringException("generateWorkflow",async()=>{if(H(n.repository))return;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 r=await e.promises.readdir(s,{withFileTypes:!0}),o=new Set(["test.yml","autofix.yml","semantic-pr.yml","close-comment.yml","gen-pr-claude.yml","gen-pr-codex.yml","gen-pr-gemini.yml",...r.filter(e=>e.isFile()&&e.name.endsWith(".yml")).map(e=>e.name)]);n.depending.semanticRelease&&o.add("release.yml");for(const e of o){const i=t.basename(e,".yml");await $.run(()=>Y(n,s,i))}})}function H(e){return e?.endsWith("/reusable-workflows")??!1}async function Y(n,s,i){const r=t.join(s,`${i}.yml`),o=e.existsSync(t.join(s,"deploy-production.yml"));if("autofix"===i)return void await V(function(e){if(!e.isPublicRepo)return u(z);const t=e.isBun?"bun":"yarn",n=[{uses:"actions/checkout@v6"},{uses:"actions/setup-node@v6",with:{"check-latest":!0}},...e.isBun?[{uses:"oven-sh/setup-bun@v1",with:{"bun-version":"latest"}}]:[],{run:`${t} install`},{run:`${t} run cleanup`}];e.packageJson?.scripts?.build&&n.push({run:`${t} run build`});n.push({uses:"autofix-ci/action@v1"});const s=u(U),i=s.jobs.autofix??{"runs-on":"ubuntu-latest"};return s.jobs.autofix={...i,steps:n},s}(n),r);let a=u(i in M?M[i]:{});if(!("jobs"in a))return;try{const t=await e.promises.readFile(r,"utf8"),n=d.load(t);a=c.all([a,n,a],{arrayMerge:J})}catch{}i.startsWith("deploy")&&(a={...a,concurrency:{group:"${{ github.workflow }}","cancel-in-progress":!1}},function(e,t){const n=e[t];delete e[t],e[t]=n}(a,"jobs"),a.on?.push&&(a.on.push["paths-ignore"]=[...new Set(["**.md","**/docs/**",...a.on.push["paths-ignore"]??[]])])),"release"===i&&a.jobs.release&&o&&(a.permissions??={},a.permissions.actions="write",a.jobs.release.with??={},a.jobs.release.with.trigger_deploy_workflow="deploy-production.yml");let l=!1;for(const e of Object.values(a.jobs))e.uses?.includes("/reusable-workflows/")&&(K(n,e,i),l=!0);if(l){switch(i){case"release":if(a.on?.schedule)delete a.on.push;else{if(!(a.on?.push&&n.release.branches.length>0))return void await e.promises.rm(t.join(s,"release.yml"),{force:!0});a.on.push.branches=n.release.branches}n.isPublicRepo?(a.permissions??={},a.permissions["id-token"]="write"):delete a.permissions?.["id-token"];break;case"test":a.on?.pull_request&&delete a.on.pull_request["paths-ignore"],a.on?.push&&(delete a.on.push["paths-ignore"],a.on.push.branches=a.on.push.branches.filter(e=>"renovate/**"!==e))}if(await V(a,r),"sync"===i){if(await e.promises.rm(t.join(s,"sync-init.yml"),{force:!0}),!a.jobs.sync?.with)return;a.jobs["sync-force"]=a.jobs.sync;const n=a.jobs.sync.with.sync_params_without_dest;if("string"!=typeof n)return;a.jobs.sync.with.sync_params_without_dest=`--force ${n}`,a.name="Force to Sync",a.on={workflow_dispatch:null},delete a.jobs.sync,await V(a,t.join(s,"sync-force.yml"))}}}function K(e,t,n){if(t.with??={},t.secrets??={},delete t.secrets.NPM_TOKEN,"test"!==n&&"release"!==n&&"gen-pr-claude"!==n&&"gen-pr-codex"!==n&&"gen-pr-gemini"!==n||(t.secrets.GH_TOKEN="${{ secrets.GITHUB_TOKEN }}"),"gen-pr-claude"!==n&&"gen-pr-codex"!==n&&"gen-pr-gemini"!==n||(t.with["test-command"]=e.isBun?"bun run check-all-for-ai":"yarn check-all-for-ai"),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,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.doesContainDockerfile&&!t.with.ci_label&&n.startsWith("test")&&(t.with.ci_label="large"),"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?G(t.with):delete t.with,Object.keys(t.secrets).length>0){const e=G(t.secrets);delete t.secrets,t.secrets=e}else delete t.secrets}async function V(t,n){const s=d.dump(t,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}});await e.promises.writeFile(n,s)}async function X(n){return _.functionIgnoringException("fixTypos",async()=>{if(H(n.repository))return;const s=n.dirPath,i=await p.glob("**/*.md",{dot:!0,cwd:s,ignore:D});x.isVerbose&&console.info(`Found ${i.length} markdown files in ${s}`);for(const r of i){const i=t.join(s,r);await $.run(async()=>{const t=await e.promises.readFile(i,"utf8");let s=Z(t);s=ee(s,n,"doc"),t!==s&&await S.generateFile(i,s)})}const r=await p.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:D});x.isVerbose&&console.info(`Found ${r.length} TypeScript files in ${s}`);for(const i of r){const r=t.join(s,i),o=await e.promises.readFile(r,"utf8");let a=Q(o);a=ee(a,n,"ts"),o!==a&&await S.generateFile(r,a)}const o=await p.glob("**/*.{csv,htm,html,tsv,xml,yaml,yml}",{dot:!0,cwd:s,ignore:D});x.isVerbose&&console.info(`Found ${o.length} text-based files in ${s}`);for(const i of o){const r=t.join(s,i),o=await e.promises.readFile(r,"utf8");let a=Z(o);a=ee(a,n,"text"),o!==a&&await S.generateFile(r,a)}await $.promiseAll()})}function Z(e){return e.replaceAll(/\bc\.f\.([^$])/g,"cf.$1").replaceAll(/\beg\.([^$])/g,"e.g.$1").replaceAll(/\bie\.([^$])/g,"i.e.$1")}function Q(e){return e.replaceAll(/\/\/(.*)c\.f\./g,"//$1cf.").replaceAll(/\/\/(.*)eg\./g,"//$1e.g.").replaceAll(/\/\/(.*)ie\./g,"//$1i.e.")}function ee(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 te(e,n){return _.functionIgnoringException("generateAgentInstructions",async()=>{if(!e.isRoot)return;const s=t.resolve(e.dirPath,"AGENTS_EXTRA.md"),i=await S.readFileIgnoringError(s);for(const[s,r]of[["AGENTS.md","Codex CLI"],["CLAUDE.md","Claude Code"],["GEMINI.md","Gemini CLI"]]){const o=ne(e,n,r,i),a=t.resolve(e.dirPath,s);await $.run(()=>S.generateFile(a,o))}const r=t.resolve(e.dirPath,".cursor/rules/general.mdc"),o=function(e,t,n){const s="---\ndescription: General Coding Rules\nglobs:\nalwaysApply: true\n---",i=ne(e,t,"Cursor",n);return`${s}\n\n${i}`}(e,n,i);await $.run(()=>S.generateFile(r,o))})}function ne(e,t,n,s){const i=e.isBun?"bun":"yarn",r=`\n## Project Information\n\n- Name: \`${e.packageJson?.name||"unknown"}\`\n- Description: ${e.packageJson?.description}\n- Package Manager: ${i}\n\n## General Instructions\n\n- Create a new branch if the current branch is \`main\`.\n- Run any \`git\` commands sequentially.\n- Write tests ONLY if explicitly requested. If requested, follow these rules:\n - Continue modifying the tests and code until all tests pass.\n - Ensure tests reset any related persistent data, as our test infrastructure does not clear it automatically.\n - Prefer actual API calls over mocks. Use mocks when actual calls are impractical, have unintended side effects, or are explicitly requested.\n- Before fixing issues, always investigate the root cause first (e.g., by gathering debug logs, taking screenshots, etc.).\n- After making code changes, run \`${i} check-all-for-ai\` to execute all tests (takes up to 1 hour) or \`${i} check-for-ai\` for type checking and linting only (takes up to 10 minutes).\n - If you are confident your changes will not break any tests, you may use \`check-for-ai\`.\n- Once you have verified your changes, commit and push them to the current (non-main) branch then create a PR via \`gh\`.\n - Follow the conventional commits; your commit message should start with \`feat:\`, \`fix:\`, etc.\n - If not specified, make sure to add a new line at the end of your commit message${e.isWillBoosterRepo?` with: \`Co-authored-by: WillBooster (${n}) <agent@willbooster.com>\``:""}.\n - Always create new commits. Avoid using \`--amend\`.\n${t.some(e=>e.hasStartTestServer)?`- Use \`${i} run start-test-server\` to launch a web server for debugging or testing.`:""}\n\n${se(t)}\n`.replaceAll(/\.\n\n+-/g,".\n-").replaceAll(/\n{3,}/g,"\n\n").trim(),o=s?.trim().startsWith("#");return r+(s?o?"\n\n"+s.trim():"\n"+s:"")}function se(e){return`\n## Coding Style\n\n- Simplify code as much as possible to eliminate redundancy.\n- Design each module with high cohesion, grouping related functionality together.\n - Refactor existing large modules into smaller, focused modules when necessary.\n - Create well-organized directory structures with low coupling and high cohesion.\n- Place calling functions in the file above the functions they call to maintain a clear top-down order.\n - e.g. \`function caller() { callee(); } function callee() { ... }\`\n- Write comments that explain "why" rather than "what". Avoid stating what can be understood from the code itself.\n- Prefer \`undefined\` over \`null\` unless explicitly required by APIs or libraries.\n- Prefer using a single template literal for prompts instead of \`join()\` with an array of strings.\n${e.some(e=>e.depending.genI18nTs)?'- When introducing new string literals in React components, update the language resource files in the `i18n` directory (e.g., `i18n/ja-JP.json`). Reference these strings using the `i18n` utility. For example, use `i18n.pages.home.title()` for `{ "pages": { "home": { "title": "My App" } } }`.':""}\n${e.some(e=>e.depending.react||e.depending.next)?"- Prefer `useImmer` for storing an array or an object to `useState`.":""}\n${e.some(e=>e.depending.next)?"\n- Since this project uses the React Compiler, you do not need to use `useCallback` or `useMemo` for performance optimization.\n- Assume there is only a single server instance.\n":""}\n`.replaceAll(/\.\n\n+-/g,".\n-").replaceAll(/\n{3,}/g,"\n\n").trim()}async function ie(n){return _.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=c.all([s,n,s],{arrayMerge:N})}catch{}const r=JSON.stringify(s);await $.run(()=>S.generateFile(i,r))})}const re=["@exercode/problem-utils","@next/env","@next/eslint-plugin-next","@next/font","@next/rspack-binding-linux-arm64-gnu","@next/rspack-binding-linux-arm64-musl","@next/rspack-binding-linux-x64-gnu","@next/rspack-binding-linux-x64-musl","@next/swc-android-arm-eabi","@next/swc-android-arm64","@next/swc-darwin-arm64","@next/swc-darwin-x64","@next/swc-freebsd-x64","@next/swc-linux-arm-gnueabihf","@next/swc-linux-arm64-gnu","@next/swc-linux-arm64-musl","@next/swc-linux-x64-gnu","@next/swc-linux-x64-musl","@next/swc-wasm-nodejs","@next/swc-wasm-web","@next/swc-win32-arm64-msvc","@next/swc-win32-ia32-msvc","@next/swc-win32-x64-msvc","@next/third-parties","@willbooster/agent-skills","@willbooster/babel-configs","@willbooster/biome-config","@willbooster/eslint-config-blitz-next","@willbooster/eslint-config-js","@willbooster/eslint-config-js-react","@willbooster/eslint-config-next","@willbooster/eslint-config-ts","@willbooster/eslint-config-ts-react","@willbooster/oxfmt-config","@willbooster/oxlint-config","@willbooster/prettier-config","@willbooster/renovate-config","@willbooster/shared-lib","@willbooster/shared-lib-blitz-next","@willbooster/shared-lib-next","@willbooster/shared-lib-node","@willbooster/shared-lib-react","@willbooster/wb","next","react","react-dom"],oe=e=>{const t=function(e){if(!e)return;try{return m(e)}catch{return}}(e);return`env = false\ntelemetry = false\n\n${function(e){return"boolean"==typeof e?.run?.bun?`[run]\nbun = ${e.run.bun}\n`:""}(t)}\n[install]\nexact = ${!1===t?.install?.exact?"false":"true"}\nlinker = "hoisted"\nminimumReleaseAge = 432000 # 5 days\nminimumReleaseAgeExcludes = [\n${re.map(e=>` "${e}",`).join("\n")}\n]\n`};async function ae(n){return _.functionIgnoringException("generateBunfigToml",async()=>{const s=t.resolve(n.dirPath,"bunfig.toml"),i=e.existsSync(s)?e.readFileSync(s,"utf8"):void 0,r=oe(i);await $.run(()=>S.generateFile(s,r))})}const ce="# Project-specific settings",le=/# Project-specific settings[^\n]*\n/gm,pe="# Generated by wbfy",de=`${ce} (head)\n\n\n${pe}\n`,ue=`\n${ce} (tail)\n`,me={separator:pe,separatorPrefix:"# Generated by ",defaultHeadUserContent:de,defaultTailUserContent:ue,async readGitignoreWithoutSeparators(t){try{let n=await e.promises.readFile(t,"utf8");const s=ge(n);return s>0&&(n=n.slice(0,s-1)),n.replaceAll(le,"").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(le,`${ce} (head)\n`):de},getTailUserContent(e){const t=ge(e);return t>0?e.slice(t-1):ue},async isBerryZeroInstallEnabled(t){try{return(await e.promises.readFile(t,"utf8")).includes("\n!.yarn/cache")}catch{return!1}}};function ge(e){const t=e.indexOf(ce),n=e.lastIndexOf(ce);return n>t?n:-1}async function fe(n){return _.functionIgnoringException("generateDockerignore",async()=>{const s=t.resolve(n.dirPath,".dockerignore");if(n.doesContainDockerfile){const e=await S.readFileIgnoringError(s)??"",t=me.getHeadUserContent(e)+"\n**/.idea\n**/*.sqlite3*\n**/.yarn/install-state.gz\n**/.venv\n"+me.getTailUserContent(e);await $.run(()=>S.generateFile(s,t))}else await e.promises.rm(s,{force:!0})})}const he={codeWith2IndentSize:["cjs","mjs","js","jsx","cts","mts","ts","tsx","json","json5","jsonc","cpp","dart","htm","html","pu","puml","rb","vue","xml","yaml","yml","sh"].toSorted(),codeWith4IndentSize:["go","gradle","java","py"].toSorted(),markdownLike:["md"].toSorted(),eslint:["cjs","mjs","js","cts","mts","ts","tsx","jsx"].toSorted(),prettier:["cjs","mjs","java","js","jsx","cts","mts","ts","tsx","json","json5","jsonc","css","htm","html","md","scss","vue","yaml","yml"].toSorted(),biome:["cjs","mjs","js","jsx","cts","mts","ts","tsx","json","json5","jsonc","htm","html","vue","svelte","astro","css","yaml","yml","gql"].toSorted()},ye=`root = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\ninsert_final_newline = true\ntrim_trailing_whitespace = true\n\n${be(he.codeWith2IndentSize)}\nindent_size = 2\nindent_style = space\n\n${be(he.codeWith4IndentSize)}\nindent_size = 4\nindent_style = space\n\n${be(he.markdownLike)}\nmax_line_length = off\ntrim_trailing_whitespace = false\n\n[{Makefile,*.mk}]\nindent_style = tab\n`;async function we(e){return _.functionIgnoringException("generateEditorconfig",async()=>{const n=t.resolve(e.dirPath,".editorconfig");await $.run(()=>S.generateFile(n,ye))})}function be(e){return e.length>1?`[*.{${e.join(",")}}]`:`[*.${e[0]}]`}async function ve(n){return _.functionIgnoringException("generateEslintrc",async()=>{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(()=>S.generateFile(s,`export { default } from '${n.eslintBase}';`))}})}const ke={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 xe(n,s){return _.functionIgnoringException("generateGeminiConfig",async()=>{if(!n.isRoot)return;const i=t.resolve(n.dirPath,".gemini"),r=t.resolve(i,"config.yml"),o=t.resolve(i,"styleguide.md"),a=t.resolve(n.dirPath,"AGENTS_EXTRA.md");let l=u(ke);try{const t=await e.promises.readFile(r,"utf8"),n=d.load(t);l=c.all([l,n,l],{arrayMerge:N})}catch{}const p=d.dump(l,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}}),m=await S.readFileIgnoringError(a),g=m?.trimStart().startsWith("#")?void 0:m,f=`以下のコーディング規約を踏まえて、日本語でレビューしてください。\n\n${se(s)}${g?`\n\n${g.trimEnd()}`:""}`,h=[$.run(()=>S.generateFile(r,p)),$.run(()=>S.generateFile(o,f))];await Promise.all(h)})}async function _e(n){return _.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 je=`* text=auto\n\n*.lockb binary diff=lockb\n*.vcproj text eol=crlf\n\n${[...he.codeWith2IndentSize,...he.codeWith4IndentSize,...he.markdownLike].map(e=>`*.${e} text eol=lf`).join("\n")}\n\ndist/** linguist-generated=true\n`;async function Se(e){return _.functionIgnoringException("generateGitattributes",async()=>{const n=t.resolve(e.dirPath,".gitattributes");await $.run(()=>S.generateFile(n,je))})}const $e=["windows","macos","linux","jetbrains","visualstudiocode","emacs","vim","yarn"];async function Pe(e,n){return _.functionIgnoringException("generateGitignore",async()=>{const s=t.resolve(e.dirPath,".gitignore"),i=await S.readFileIgnoringError(s)??"";let r=me.getHeadUserContent(i)+"\n!.keep\n.aider*\n.env.production\n*/mount/*.hash\n.devcontainer/\n.idea/AugmentWebviewStateStore.xml\n.idea/copilot.*\n.idea/copilot/chatSessions/\n.playwright-cli/\n.serena/\n.tmp/\n__generated__/\n@willbooster/\ndist/\ntemp/\ntmp/\n";const o=me.getTailUserContent(i),a=[...$e];e.doesContainGemfile&&a.push("ruby"),e.doesContainGoMod&&(a.push("go"),r+=`${t.basename(e.dirPath)}\n`),e.doesContainPackageJson&&a.push("node"),e.doesContainPomXml&&(a.push("maven"),r+=".idea/google-java-format.xml\n"),e.doesContainPubspecYaml&&(a.push("flutter","AndroidStudio","ruby"),r+=".flutter-plugins-dependencies\nandroid/key.properties\nios/.bundle\n.idea/runConfigurations.xml\n"),e.doesContainTemplateYaml&&(r+=".aws-sam/\npackaged.yaml\n"),e.doesContainPoetryLock&&(a.push("python"),r+=".venv/\n"),e.depending.blitz&&(r+=".blitz/\n.blitz**\n"),e.depending.next&&a.push("nextjs"),(n.depending.firebase||e.depending.firebase)&&a.push("firebase"),e.depending.prisma&&(r+="*.sqlite3*\n"),e.depending.playwrightTest&&(r+="playwright-report/\ntest-results/\n"),(n.depending.reactNative||e.depending.reactNative)&&(a.push("reactnative"),r+="google-services.json\nandroid/app/src/main/assets/\n"),e.depending.storybook&&a.push("storybookjs"),e.depending.litestream&&(r+="gcp-sa-key.json\n");let c="";for(const e of a){let t=await Oe(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(()=>Ee(e,t)),x.isVerbose&&console.info(`Fetched ${n}`)}c&&(c+="\n"),c+=t+"\n"}await me.isBerryZeroInstallEnabled(s)||(c=c.replace("!.yarn/cache","# !.yarn/cache").replace("# .pnp.*",".pnp.*")),(e.doesContainPomXml||e.doesContainPubspecYaml)&&(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.doesContainPubspecYaml&&(c=c.replaceAll(/^.idea\/modules.xml$/gm,"# .idea/modules.xml"))),c=c.replaceAll(/^.idea\/?$/gm,"# .idea"),(n.depending.reactNative||e.depending.reactNative||e.doesContainPubspecYaml)&&(c=c.replaceAll(/^(.idea\/.+)$/gm,"$1\nandroid/$1"));const l=r+"\n"+c+o;await $.run(()=>S.generateFile(s,l))})}const Ce=t.join(g.homedir(),".cache","wbfy","gitignore");async function Ee(n,s){await e.promises.mkdir(Ce,{recursive:!0}),await e.promises.writeFile(t.join(Ce,n),s)}async function Oe(n){try{const s=await e.promises.stat(t.join(Ce,n));if(Date.now()-s.mtimeMs>216e5)return;return await e.promises.readFile(t.join(Ce,n),"utf8")}catch{}}function Be(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 Fe=`<?xml version="1.0" encoding="UTF-8"?>\n<project version="4">\n <component name="ProjectTasksOptions">\n${he.prettier.map(e=>Be("node","node_modules/.bin/prettier --cache --write","Prettier",e)).join("")}\n </component>\n</project>\n`,Ae=`<?xml version="1.0" encoding="UTF-8"?>\n<project version="4">\n <component name="ProjectTasksOptions">\n${he.prettier.map(e=>Be("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 Ie(n){return _.functionIgnoringException("generateIdeaSettings",async()=>{const s=t.resolve(n.dirPath,".idea");if(e.existsSync(s)){const i=t.resolve(s,"watcherTasks.xml");await(n.doesContainJavaScript||n.doesContainJavaScriptInPackages||n.doesContainTypeScript||n.doesContainTypeScriptInPackages||n.doesContainPackageJson&&!n.doesContainPubspecYaml&&!n.doesContainGemfile&&!n.doesContainGoMod&&!n.doesContainPomXml?$.run(()=>S.generateFile(i,n.isBun?Ae:Fe)):$.run(()=>e.promises.rm(i,{force:!0})))}})}function Te(e,t,n,s=0){do{const[s,i,r]=Re(e,t,n);if(0===f.spawnSync(s,i,r).status)break}while(--s>=0)}function De(e,t,n){const[s,i,r]=Re(e,t,n);r.stdio="pipe";const o=f.spawnSync(s,i,r),a=o.stderr??"",c="string"==typeof a?a.trim():a.toString().trim();o.error?console.error(`${s} [${i.map(e=>`"${e}"`).join(", ")}] failed with: ${o.error.message}`):c&&console.error(`${s} [${i.map(e=>`"${e}"`).join(", ")}] outputs the following content to stderr:\n${c}`);const l=o.stdout??"";return"string"==typeof l?l.trim():l.toString().trim()}function Re(e,t,n){const s={...process.env};return s.PATH&&s.BERRY_BIN_FOLDER&&(s.PATH=s.PATH.replace(`${s.BERRY_BIN_FOLDER}:`,"")),[e,t,{cwd:n,env:s,encoding:"utf8",shell:!1,stdio:"inherit"}]}const We={getLintFixSuffix:e=>e.doesContainJsxOrTsx?' --rule "{ react-hooks/exhaustive-deps: 0 }"':""};const Le=new class{getOrgAndName(e){const t=e.split(":").at(-1),n=t?.split("/");return[n?.at(-2)??"",n?.at(-1)?.replace(/.git$/,"")??""]}},Ne=new Map;function Je(e){const t=e??"",n=Ne.get(t);if(n)return n;const s=new h({auth:Ue(e)||void 0});return Ne.set(t,s),s}function Ge(e){return!!Ue(e)}function Ue(e){return"WillBooster"===e?process.env.GH_BOT_PAT_FOR_WILLBOOSTER:"WillBoosterLab"===e?process.env.GH_BOT_PAT_FOR_WILLBOOSTERLAB:process.env.GH_BOT_PAT_FOR_WILLBOOSTER||process.env.GH_BOT_PAT_FOR_WILLBOOSTERLAB||process.env.GH_TOKEN||process.env.GITHUB_TOKEN}const ze={"@eslint/js":"^9.39.4",eslint:"^9.39.4",typescript:"^5.9.3"};function Me(e){return e.isWillBoosterConfigs&&!0===e.packageJson?.name?.startsWith("@willbooster/eslint-config-")}const qe=["@eslint/js","eslint","eslint-config-flat-gitignore","eslint-config-prettier","eslint-plugin-import-x","eslint-plugin-sort-class-members","eslint-plugin-sort-destructure-keys","eslint-plugin-unicorn","eslint-plugin-unused-imports","globals"],He=[...qe,"typescript-eslint","eslint-import-resolver-typescript"],Ye=["eslint-plugin-react","eslint-plugin-react-hooks","eslint-plugin-react-compiler"],Ke={"@willbooster/eslint-config-js":["@willbooster/eslint-config-js",...qe],"@willbooster/eslint-config-js-react":["@willbooster/eslint-config-js-react",...qe,...Ye],"@willbooster/eslint-config-ts":["@willbooster/eslint-config-ts",...He],"@willbooster/eslint-config-ts-react":["@willbooster/eslint-config-ts-react",...He,...Ye],"@willbooster/eslint-config-next":["@willbooster/eslint-config-next","@next/eslint-plugin-next",...He,...Ye]};async function Ve(n,s,i){return _.functionIgnoringException("generatePackageJson",async()=>{await async function(n,s,i){const r=t.resolve(n.dirPath,"package.json"),o=await e.promises.readFile(r,"utf8"),a=JSON.parse(o);a.scripts=a.scripts??{},a.dependencies=a.dependencies??{},a.devDependencies=a.devDependencies??{},a.peerDependencies=a.peerDependencies??{};const l=n.isBun?"bun":"yarn";await async function(t){"WillBooster LLC"===t.author&&(t.author="WillBooster Inc.");delete t.scripts["sort-package-json"],delete t.scripts["sort-all-package-json"],delete t.scripts["typecheck/warn"],delete t.scripts["typecheck:gen-code"],delete t.scripts["typecheck:codegen"],delete t.dependencies.tslib,delete t.devDependencies["@willbooster/eslint-config"],delete t.devDependencies["@willbooster/eslint-config-react"],delete t.devDependencies["@willbooster/renovate-config"],delete t.devDependencies["@willbooster/tsconfig"],delete t.devDependencies["eslint-import-resolver-node"],delete t.devDependencies["eslint-plugin-prettier"],delete t.devDependencies.lerna,delete t.devDependencies.pinst,delete t.scripts["flutter-format"],delete t.scripts["format-flutter"],delete t.scripts["python-format"],delete t.scripts["format-python"],delete t.scripts.prettier,delete t.scripts["check-all"],await $.run(()=>e.promises.rm("lerna.json",{force:!0})),delete t.devDependencies["@typescript-eslint/eslint-plugin"],delete t.devDependencies["@typescript-eslint/parser"],delete t.devDependencies["eslint-plugin-import"]}(a);for(const[e,t]of Object.entries(a.scripts))t.includes("git clone")||(a.scripts[e]=t.replace(/yarn\s*&&\s*/,"").replace(/yarn\s*install\s*&&\s*/,""));a.scripts=c(a.scripts,et(n,a.scripts)),"check-for-ai"in a.scripts&&("gen-code"in a.scripts&&(a.scripts["check-for-ai"]=`${l} gen-code > /dev/null && ${a.scripts["check-for-ai"]}`),a.scripts["check-for-ai"]=`${l} install > /dev/null && ${a.scripts["check-for-ai"]}`);n.isBun?delete a.scripts.prettify:a.scripts.prettify=(a.scripts.prettify??"")+await async function(n){const s=t.resolve(n,".prettierignore"),i=await e.promises.readFile(s,"utf8"),r=i.indexOf(me.separatorPrefix);if(-1===r)return"";const o=i.slice(0,r);return`${o.split("\n").map(e=>{const t=e.trim();return t.endsWith("/")?t.slice(0,-1):t}).filter(e=>e&&!e.startsWith("#")&&!e.includes("/")).map(e=>` "!**/${e}/**"`).join("")} || true`}(n.dirPath);for(const[e,t]of Object.entries(a.scripts))t?.includes("yarn workspaces foreach")&&(t.includes("--all")||t.includes("--recursive")||t.includes("--since")||t.includes("--worktree")||(a.scripts[e]=t.replace("yarn workspaces foreach","yarn workspaces foreach --all")));let d=[],u=["prettier","sort-package-json"];const m=[];e.existsSync(t.join(s.dirPath,".prettierrc.json"))||e.existsSync(t.join(n.dirPath,".prettierrc.json"))||(a.prettier="@willbooster/prettier-config",u.push("prettier-plugin-java","@willbooster/prettier-config"));if(delete a.devDependencies["lint-staged"],delete a["lint-staged"],n.isRoot){if(delete a.devDependencies.husky,delete a.devDependencies.pinst,delete a.scripts.postinstall,delete a.scripts.postpublish,delete a.scripts.prepublishOnly,delete a.scripts.prepack,delete a.scripts.postpack,a.scripts.prepare="lefthook install || true",u.push("lefthook"),n.depending.semanticRelease&&(a.devDependencies["semantic-release"]||a.devDependencies["multi-semantic-release"]||a.devDependencies["@qiwi/multi-semantic-release"]||u.push("semantic-release"),a.version="0.0.0-semantically-released"),n.depending.playwrightTest){a.dependencies.artillery||a.devDependencies.artillery||a.dependencies["@playwright/test"]||(u.push("@playwright/test"),delete a.dependencies["@playwright/test"]),delete a.dependencies.playwright,delete a.devDependencies.playwright}n.doesContainSubPackageJsons?a.workspaces=Array.isArray(a.workspaces)?c.all([a.workspaces,["packages/*"]],{arrayMerge:J}):["packages/*"]:Array.isArray(a.workspaces)&&(a.workspaces=a.workspaces.filter(e=>p.globSync(e,{dot:!0,cwd:n.dirPath,ignore:D}).length>0),0===a.workspaces.length&&delete a.workspaces)}if(n.depending.wb||n.isBun){a.dependencies["@willbooster/wb"]?d.push("@willbooster/wb"):u.push("@willbooster/wb");for(const[e,t]of Object.entries(a.scripts))a.scripts[e]=t.replace(/wb\s+db/,"wb prisma")}(n.doesContainJavaScript||n.doesContainJavaScriptInPackages||n.doesContainTypeScript||n.doesContainTypeScriptInPackages)&&(n.isBun?(u.push("@biomejs/biome","@willbooster/biome-config"),delete a.devDependencies.eslint,delete a.devDependencies.micromatch,delete a.devDependencies["typescript-eslint"]):u.push("eslint","micromatch"));(n.doesContainJavaScript||n.doesContainJavaScriptInPackages||n.doesContainTypeScript||n.doesContainTypeScriptInPackages)&&u.push(...function(e){return e.isBun?["@tsconfig/bun"]:e.depending.reactNative?["@tsconfig/react-native"]:["@tsconfig/node-lts","@tsconfig/node-ts"]}(n));(n.doesContainTypeScript||n.doesContainTypeScriptInPackages)&&(u.push("typescript"),n.isBun?u.push("@types/bun"):n.depending.reactNative||u.push("@types/node"),(a.dependencies.jest||a.devDependencies.jest||a.dependencies["@jest/globals"]||a.devDependencies["@jest/globals"]||a.dependencies["ts-jest"]||a.devDependencies["ts-jest"])&&u.push("@types/jest"));n.eslintBase&&u.push(...Ke[n.eslintBase]);n.isWillBoosterConfigs&&(d=d.filter(e=>!e.includes("@willbooster/")),u=u.filter(e=>!e.includes("@willbooster/")));a.name||(a.name=t.basename(n.dirPath));n.doesContainSubPackageJsons&&(a.private=!0);a.license||(a.license="UNLICENSED");!a.private&&"UNLICENSED"!==a.license&&s.isPublicRepo&&(a.publishConfig??={},a.publishConfig.access??="public");const[g]=Le.getOrgAndName(n.repository??"");"WillBooster"!==g&&"WillBoosterLab"!==g||(a.author="WillBooster Inc.");n.isRoot||!a.private||a.main||(a.main="./src");if(delete a.resolutions?.["npm/chalk"],!n.doesContainSubPackageJsons){if(!n.isBun)if(n.doesContainJavaScript||n.doesContainTypeScript)a.scripts["lint-fix"]=(a.scripts["lint-fix"]??"")+We.getLintFixSuffix(n);else{delete a.scripts.lint,delete a.scripts["lint-fix"];for(const e of["cleanup","check-for-ai"]){const t=a.scripts[e];t&&(a.scripts[e]=t.replace(/ ?&& ?yarn lint-fix(?: --quiet)?/,""))}}if(n.doesContainPubspecYaml){a.scripts.lint="flutter analyze",a.scripts["lint-fix"]="yarn lint";const s=["lib","test","test_driver"].filter(s=>e.existsSync(t.resolve(n.dirPath,s)));s.length>0&&(a.scripts["format-code"]=`dart format $(find ${s.join(" ")} -name generated -prune -o -name '*.freezed.dart' -prune -o -name '*.g.dart' -prune -o -name '*.dart' -print)`,a.scripts.format=(a.scripts.format??"")+" && yarn format-code")}if(n.doesContainPoetryLock){"poetry install"===a.scripts.postinstall&&delete a.scripts.postinstall;const e=await p.glob("**/*.py",{cwd:n.dirPath,dot:!0,ignore:D}),t=new Set;for(const n of e){const[e,s]=n.split(/[/\\]/);e&&s&&t.add(e)}if(t.size>0){const e=[...t].join(" ");a.scripts["format-code"]=`poetry run isort --profile black ${e} && poetry run black ${e}`,a.scripts.lint?a.scripts.lint=`poetry run flake8 ${e} && ${a.scripts.lint}`:(a.scripts.lint=`poetry run flake8 ${e}`,a.scripts["lint-fix"]="yarn lint"),a.scripts.format=(a.scripts.format??"")+" && yarn format-code",m.push("black","isort","flake8")}}}(n.repository||a.repository)&&(a.repository=function(e,t){const n=Ze(e);if(n)return Qe(n,e,t);const s=Ze(t);if(s)return Qe(s,t);return e}(n.repository??a.repository,a.repository));n.depending.blitz?a.scripts["gen-code"]?.startsWith("blitz codegen")?a.scripts["gen-code"].includes("blitz prisma generate")||(a.scripts["gen-code"]=a.scripts["gen-code"].replace("blitz codegen","blitz codegen && blitz prisma generate")):a.scripts["gen-code"]="blitz codegen":n.depending.prisma&&!a.scripts["gen-code"]?.startsWith("prisma generate")&&(a.scripts["gen-code"]="prisma generate");a.dependencies.prettier||delete a.devDependencies["@types/prettier"];0===Object.keys(a.dependencies).length&&delete a.dependencies;0===Object.keys(a.devDependencies).length&&delete a.devDependencies;0===Object.keys(a.peerDependencies).length&&delete a.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)]);t.has("@willbooster/auth")&&!nt(e,"@willbooster/auth")&&(delete e.devDependencies["@willbooster/auth"],e.dependencies["@willbooster/auth"]=await tt("auth"));t.has("@discord-bot/shared")&&!nt(e,"@discord-bot/shared")&&(delete e.devDependencies["@discord-bot/shared"],e.dependencies["@discord-bot/shared"]=await tt("discord-bot"));t.has("@willbooster/code-analyzer")&&!nt(e,"@willbooster/code-analyzer")&&(delete e.dependencies["@willbooster/code-analyzer"],e.devDependencies["@willbooster/code-analyzer"]=await tt("code-analyzer"));t.has("@willbooster/judge")&&!nt(e,"@willbooster/judge")&&(delete e.devDependencies["@willbooster/judge"],e.dependencies["@willbooster/judge"]=await tt("judge"));t.has("@willbooster/llm-proxy")&&!nt(e,"@willbooster/llm-proxy")&&(delete e.devDependencies["@willbooster/llm-proxy"],e.dependencies["@willbooster/llm-proxy"]=await tt("llm-proxy"))}(a),n.isBun&&delete a.packageManager;let f=JSON.stringify(a);if(f=await async function(n,s,i){const r=[];for(const[e]of Object.keys(n))e&&!e.startsWith(":")&&e.includes(":")&&r.push([e,e.replaceAll(":","-")]);if(0===r.length)return s;for(const[e,t]of r)s=s.replaceAll(e,t);const o=await p.glob(["**/*.{md,cjs,mjs,js,jsx,cts,mts,ts,tsx}","**/Dockerfile"],{cwd:i.dirPath,dot:!0,ignore:D});for(const n of o)await $.run(async()=>{const s=t.join(i.dirPath,n),o=await e.promises.readFile(s,"utf8");let a=o;for(const[e,t]of r)a=a.replaceAll(e,t);a!==o&&await e.promises.writeFile(s,a)});return await $.promiseAll(),s}(a.scripts,f,n),await e.promises.writeFile(r,f),!i){if(d=d.filter(e=>!a.devDependencies?.[e]),d.length>0){const e=[...new Set(d)],t=e.map(e=>Xe(e));n.isBun?(Te(l,["remove",...e],n.dirPath),Te(l,["add","--exact",...t],n.dirPath)):Te(l,["add",...t],n.dirPath)}if(u=u.filter(e=>!a.dependencies?.[e]),u.length>0){const e=[...new Set(u)],t=e.map(e=>Xe(e));n.isBun?(Te(l,["remove",...e],n.dirPath),Te(l,["add","-D","--exact",...t],n.dirPath)):Te(l,["add","-D",...t],n.dirPath)}m.length>0&&Te("poetry",["add","--group","dev",...new Set(m)],n.dirPath)}}(n,s,i)})}function Xe(e){return function(e){for(const[t,n]of Object.entries(ze))if(t===e)return`${t}@${n}`}(e)??e}function Ze(e){if("string"==typeof e){if(!e.startsWith("github:"))return;const[t,n]=Le.getOrgAndName(e);if(!t||!n)return;return`git+https://github.com/${t}/${n}.git`}const t=e?.url;if("string"!=typeof t)return;const n=/^(?:git\+)?https:\/\/github\.com\/([^/]+)\/([^/]+?)(?:\.git)?$/u.exec(t);if(!n)return;const[,s,i]=n;return`git+https://github.com/${s}/${i}.git`}function Qe(e,t,n){return{..."object"==typeof t?t:"object"==typeof n?n:void 0,type:"git",url:e}}function et(e,t){if(e.isBun){const t=e.doesContainTypeScript||e.doesContainTypeScriptInPackages,n={"check-all-for-ai":"bun run check-for-ai && bun run test","check-for-ai":"bun run cleanup"+(t?" && 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 t||delete n.typecheck,n}{const n=e.doesContainTypeScript||e.doesContainTypeScriptInPackages,s=t.test;let i={"check-all-for-ai":"yarn check-for-ai && yarn test","check-for-ai":`yarn format > /dev/null 2> /dev/null || true${n?" && yarn typecheck":""} && yarn lint-fix --quiet`,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 "**/{.*/,}*.{${he.prettier.join(",")}}" "!**/test{-,/}fixtures/**"`,typecheck:"tsc --noEmit"};return e.doesContainSubPackageJsons?i=c({...i},{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 "**/{.*/,}*.{${he.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.depending.pyright&&(i.typecheck=i.typecheck?`${i.typecheck} && `:"",i.typecheck+="pyright"),s?.includes("wb test")&&(i.test=s),n?e.depending.wb&&(i.typecheck="wb typecheck"):delete i.typecheck,i}}async function tt(e){const t=await function(e,t){try{const n=De("git",["ls-remote",`git@github.com:${e}/${t}.git`,"HEAD"],process.cwd()).split(/\s+/)[0];if(!n)throw new Error(`No commits found for ${e}/${t}`);return Promise.resolve(n)}catch(n){return Promise.reject(new Error(`Failed to fetch commits for ${e}/${t}: ${String(n)}`))}}("WillBoosterLab",e);return`git@github.com:WillBoosterLab/${e}.git#${t}`}function nt(e,t){return(e.devDependencies?.[t]||e.dependencies?.[t]||"").includes("workspace")}const st={"post-merge":{scripts:{"prepare.sh":{runner:"bash"}}},"pre-push":{scripts:{"check.sh":{runner:"bash"}}}},it={commands:{cleanup:{glob:"",run:""},"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()}}},rt='\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 ot(n){return _.functionIgnoringException("generateLefthookUpdatingPackageJson",async()=>{await async function(n){const s=t.resolve(n.dirPath,".lefthook"),i=t.resolve(n.dirPath,".husky"),r=e.existsSync(i),{typecheck:o}=et(n,{}),a={...st,"pre-commit":{...it,commands:{...it.commands,cleanup:{...it.commands.cleanup,glob:at(n),run:ct(n)}}}};o||delete a["pre-push"];await Promise.all([e.promises.writeFile(t.join(n.dirPath,"lefthook.yml"),d.dump(a,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}})),e.promises.rm(s,{force:!0,recursive:!0})]),r&&(await Promise.all([e.promises.rm(i,{force:!0,recursive:!0}),e.promises.rm(t.resolve(n.dirPath,".huskyrc.json"),{force:!0})]),Te("git",["config","--unset","core.hooksPath"],n.dirPath));if(o){const i=function(e){let t;t=e.isBun?e.depending.wb?"bun --bun wb typecheck":"bun run typecheck":e.depending.wb?"yarn wb typecheck":"yarn run typecheck";if(e.repository?.startsWith("github:WillBoosterLab/"))return`\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\n${t}\n`.trim();return t}(n);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 c=`${rt}\n\n${function(e){const t=[];if(e.hasVersionSettings){const e=String.raw`(mise\.toml|\.mise\.toml|\.tool-versions|\..+-version)`;t.push(String.raw`run_if_changed "${e}" "mise install"`)}const n=e.isBun?"bun install":"yarn",s=e.depending.blitz||e.depending.next?" && rm -Rf .next":"";t.push(String.raw`run_if_changed "package\.json" "${n}${s}"`),e.doesContainPoetryLock&&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"`);return t}(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"),c,{mode:493}))}(n)})}function at(e){const t=[...he.prettier,...he.eslint,...e.depending.wb||e.isBun?he.biome:[]];e.doesContainPoetryLock&&t.push("py"),e.doesContainPubspecYaml&&t.push("dart");return`**/*.{${[...new Set(t)].filter(t=>e.isBun||!["astro","gql","svelte"].includes(t)).toSorted().join(",")}}`}function ct(n){if(function(n){if(!n.isRoot)return!1;const s=t.resolve(n.dirPath,"packages","wb","package.json");if(!e.existsSync(s))return!1;try{return"@willbooster/wb"===JSON.parse(e.readFileSync(s,"utf8")).name}catch{return!1}}(n))return'yarn workspace @willbooster/wb start --working-dir "$(git rev-parse --show-toplevel)" lint --fix --format -- {staged_files} && git add -- {staged_files}';if(n.isBun||n.depending.wb){const e=n.isBun?"bun":"yarn";return`${n.depending.wb?(n.isBun?"bun --bun wb":"yarn wb")+" lint --fix --format -- {staged_files}":`${e} run format && ${e} run lint-fix`} && git add -- {staged_files}`}const s=n.doesContainJsxOrTsx||n.doesContainJsxOrTsxInPackages?' --rule "{ react-hooks/exhaustive-deps: 0 }"':"",i=he.eslint.map(e=>String.raw`\.${e}$`).join("|");return String.raw`
2
2
  eslint_files="$(printf '%s\n' {staged_files} | grep -E '(${i})' || true)"
3
3
  package_json_files="$(printf '%s\n' {staged_files} | grep -E '(^|/)package\.json$' || true)"
4
4
  ${n.doesContainPoetryLock?String.raw`python_files="$(printf '%s\n' {staged_files} | grep -E '\.py$' || true)"`:""}
@@ -14,5 +14,5 @@ fi
14
14
  ${n.doesContainPoetryLock?'if [ -n "$python_files" ]; then\n poetry run isort --profile black --filter-files $python_files\n poetry run black $python_files\n poetry run flake8 $python_files\nfi':""}
15
15
  ${n.doesContainPubspecYaml?'if [ -n "$dart_files" ]; then\n dart format $dart_files\nfi':""}
16
16
  git add -- {staged_files}
17
- `.trim()}async function lt(t){return _.functionIgnoringException("generateLintstagedrc",async()=>{await Promise.all([$.run(()=>e.promises.rm(`${t.dirPath}/.lintstagedrc.cjs`,{force:!0})),$.run(()=>e.promises.rm(`${t.dirPath}/.lintstagedrc.js`,{force:!0})),$.run(()=>e.promises.rm(`${t.dirPath}/.lintstagedrc.json`,{force:!0}))])})}async function pt(e){return _.functionIgnoringException("generatePrettierignore",async()=>{const n=t.resolve(e.dirPath,".prettierignore"),s=await S.readFileIgnoringError(n)??"",i=me.getHeadUserContent(s),r=me.getTailUserContent(s),o=t.resolve(e.dirPath,".gitignore"),a=await me.readGitignoreWithoutSeparators(o)||"";let c="";e.doesContainPubspecYaml&&(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+r;await $.run(()=>S.generateFile(n,l))})}const dt={venvPath:".",venv:".venv"};async function ut(n){return _.functionIgnoringException("generatePyrightConfigJson",async()=>{let s=u(dt);const i=t.resolve(n.dirPath,"pyrightconfig.json");try{const t=await e.promises.readFile(i,"utf8"),n=JSON.parse(t);s=c.all([s,n,s],{arrayMerge:N})}catch{}const r=JSON.stringify(s);await $.run(()=>S.generateFile(i,r))})}async function mt(n){return _.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=gt(i,"[![semantic-release](https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg)](https://github.com/semantic-release/semantic-release)"));const r=n.repository?.slice(n.repository.indexOf(":")+1),o=e.readdirSync(`${n.dirPath}/.github/workflows`);for(const s of o){if(!s.startsWith("test")&&!s.startsWith("deploy"))continue;let o=s;if(o=(o[0]||"").toUpperCase()+o.slice(1,o.indexOf(".")),o=o.replace("-"," "),!r)continue;const a=`[![${o}](https://github.com/${r}/actions/workflows/${s}/badge.svg)](https://github.com/${r}/actions/workflows/${s})`;e.existsSync(t.resolve(n.dirPath,`.github/workflows/${s}`))&&(i=gt(i,a))}await $.run(()=>S.generateFile(s,i))})}function gt(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 ft(n){return _.functionIgnoringException("generateReleaserc",async()=>{const s=t.resolve(n.dirPath,".releaserc.json");if(!e.existsSync(s))return;const i=JSON.parse(await e.promises.readFile(s,"utf8")),r=i.plugins??[];for(let e=0;e<r.length;e++){const t=Array.isArray(r[e])?r[e]?.[0]:r[e],n=Array.isArray(r[e])&&r[e]?.[1]||{};"@semantic-release/commit-analyzer"===t?r[e]=["@semantic-release/commit-analyzer",c.all([n,{preset:"conventionalcommits"}],{arrayMerge:N})]:"@semantic-release/github"===t&&(r[e]=["@semantic-release/github",c.all([n,{successCommentCondition:!1,failCommentCondition:!1,labels:["r: semantic-release"],releasedLabels:["released :bookmark:"]}],{arrayMerge:N})])}const o=JSON.stringify(i);await $.run(()=>S.generateFile(s,o))})}const ht={$schema:"https://docs.renovatebot.com/renovate-schema.json",extends:["github>WillBooster/willbooster-configs:renovate.json5"]};async function yt(n){return _.functionIgnoringException("generateRenovateJson",async()=>{let s=u(ht);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=c.all([s,n,s],{arrayMerge:N}),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 r=JSON.stringify(s);await $.run(()=>S.generateFile(i,r))})}async function wt(e){return _.functionIgnoringException("installAgentSkills",async()=>{await Promise.all([o.rm(t.resolve(e.dirPath,".agents"),{force:!0,recursive:!0}),o.rm(t.resolve(e.dirPath,".claude"),{force:!0,recursive:!0}),o.rm(t.resolve(e.dirPath,"skills-lock.json"),{force:!0})])})}const bt={node:["src","test","scripts"].toSorted(),blitz:["src","test","scripts","db","integrations","mailers"].toSorted()};function vt(e){return e.depending.blitz?bt.blitz:bt.node}const kt={compilerOptions:{alwaysStrict:!0,noUncheckedIndexedAccess:!0,allowSyntheticDefaultImports:!0,esModuleInterop:!0,resolveJsonModule:!0,declaration:!0,sourceMap:!0,importHelpers:!1,outDir:"dist"},exclude:["packages/*/test/fixtures","test/fixtures"],include:["packages/*/scripts/**/*","packages/*/src/**/*","packages/*/test/**/*","scripts/**/*","src/**/*","test/**/*"]},xt={compilerOptions:{alwaysStrict:!0,noUncheckedIndexedAccess:!0,allowSyntheticDefaultImports:!0,esModuleInterop:!0,resolveJsonModule:!0,declaration:!0,sourceMap:!0,importHelpers:!1,outDir:"dist"},exclude:["test/fixtures"],include:["scripts/**/*","src/**/*","test/**/*"]};async function _t(n){return _.functionIgnoringException("generateTsconfig",async()=>{if(n.depending.blitz||n.depending.next)return;let s=u(n.isRoot?kt:xt);const i=function(n){const s=vt(n).filter(s=>e.existsSync(t.resolve(n.dirPath,s)));if(n.isRoot&&n.doesContainSubPackageJsons){const i=t.resolve(n.dirPath,"packages");if(e.existsSync(i)&&e.readdirSync(i,{withFileTypes:!0}).some(s=>s.isDirectory()&&vt(n).some(n=>e.existsSync(t.resolve(i,s.name,n)))))return s.length>0?".":"./packages"}if(1===s.length)return`./${s[0]}`;if(s.length>1)return"."}(n),r=function(e){const t=new Set,n={...e.packageJson?.dependencies,...e.packageJson?.devDependencies};e.isBun?t.add("bun"):e.depending.reactNative||t.add("node");(n.jest||n["@jest/globals"]||n["jest-environment-jsdom"]||n["ts-jest"])&&t.add("jest");n.vitest&&t.add("vitest/globals");n.mocha&&t.add("mocha");n.cypress&&t.add("cypress");return[...t]}(n);s.extends=function(e){return e.isBun?"@tsconfig/bun/tsconfig.json":e.depending.reactNative?"@tsconfig/react-native/tsconfig.json":["@tsconfig/node-lts/tsconfig.json","@tsconfig/node-ts/tsconfig.json"]}(n),i&&(s.compilerOptions={...s.compilerOptions,rootDir:i}),r.length>0&&(s.compilerOptions={...s.compilerOptions,types:r}),n.doesContainJsxOrTsx||n.doesContainJsxOrTsxInPackages?n.isBun||n.depending.reactNative||(s.compilerOptions={...s.compilerOptions,jsx:"react-jsx"}):delete s.compilerOptions?.jsx,n.isRoot&&!n.doesContainSubPackageJsons&&(s.include=s.include?.filter(e=>!e.startsWith("packages/*/")),s.exclude=s.exclude?.filter(e=>!e.startsWith("packages/*/")));const o=t.resolve(n.dirPath,"tsconfig.json");try{const t=await e.promises.readFile(o,"utf8"),n=JSON.parse(t),l=n.compilerOptions?.rootDir,p=(a=n.compilerOptions?.types,"string"==typeof a?[a]:Array.isArray(a)?a.filter(e=>"string"==typeof e):[]);s.extends=function(e,t){const n=[...jt(e),...jt(t)],s=[...new Set(n)];return 0===s.length?void 0:1===s.length?s[0]:s}(s.extends,n.extends),delete n.extends,delete n.compilerOptions?.jsx,s=c.all([s,n,s],{arrayMerge:J}),s.include=s.include?.filter(e=>!e.includes("@types")&&!e.includes("__tests__/")&&!e.includes("tests/")),s.compilerOptions??={},l?s.compilerOptions.rootDir=l:i?s.compilerOptions.rootDir=i:delete s.compilerOptions.rootDir;const d=[...new Set([...p,...r])];d.length>0?s.compilerOptions.types=d:delete s.compilerOptions.types,r.some(e=>"cypress"===e||e.includes("/"))&&delete s.compilerOptions.typeRoots}catch{}var a;G(s),s.include?.sort(),delete s.compilerOptions?.experimentalDecorators,n.depending.reactNative&&delete s.compilerOptions?.verbatimModuleSyntax;const l=JSON.stringify(s);await $.run(()=>S.generateFile(o,l))})}function jt(e){return e?Array.isArray(e)?e:[e]:[]}const St=["**/.git/objects/**","**/.git/subtree-cache/**","**/node_modules/**","**/tmp/**","**/temp/**","**/dist/**"];async function $t(n){return _.functionIgnoringException("generateVscodeSettings",async()=>{try{const s=t.resolve(n.dirPath,".vscode","settings.json"),i=await e.promises.readFile(s,"utf8");let r=JSON.parse(i);for(const e of St)r=c.all([r,Pt(e)]);n.doesContainPoetryLock&&(r=c.all([r,Pt("**/.venv/**")])),n.depending.next&&(r=c.all([r,Pt("**/.next/**")])),"editor.codeActionsOnSave"in r&&delete r["editor.codeActionsOnSave"],"editor.formatOnSave"in r&&delete r["editor.formatOnSave"],G(r);const o=JSON.stringify(r,void 0,2);await $.run(()=>S.generateFile(s,o))}catch{}})}function Pt(e){return{"files.watcherExclude":{[e]:!0}}}async function Ct(n){return _.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=De("yarn",["--version"],n.dirPath),r=function(e,t){const n=De("npm",["show",e,"versions","--json"],t);return JSON.parse(n).at(-1)}("@yarnpkg/cli",n.dirPath);Et(i)<=Et(r)&&i!==r&&Te("yarn",["set","version",r],n.dirPath,1);const o=t.join(n.dirPath,".yarn","releases");await e.promises.mkdir(o,{recursive:!0});for(const n of await e.promises.readdir(o))n.startsWith("yarn-")&&!n.startsWith(`yarn-${r}.`)&&await $.run(()=>e.promises.rm(t.join(o,n)));const a=t.resolve(n.dirPath,".yarnrc");await $.run(()=>e.promises.rm(a,{force:!0}));const c=d.load(await e.promises.readFile(s,"utf8"));c.defaultSemverRangePrefix="",c.nodeLinker="node-modules",c.nmMode="hardlinks-global",c.npmMinimalAgeGate="5d",c.npmPreapprovedPackages=["@exercode/*","@willbooster/*","next","@next/*","react","react-dom"],delete c.compressionLevel,0===c.injectEnvironmentFiles?.length&&delete c.injectEnvironmentFiles,c.enableGlobalCache=!0;const l=c.plugins?.length??0;if(c.plugins=c.plugins?.filter(e=>".yarn/plugins/undefined.cjs"!==e.path)??[],c.plugins.length!==l){const 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,d.dump(c,{lineWidth:-1})),Te("yarn",["dlx","yarn-plugin-auto-install"],n.dirPath)})}function Et(e){const[t]=e.split(".");return Number(t)}async function Bt(e){return _.functionIgnoringException("setupLabels",async()=>{const[t,n]=Ne.getOrgAndName(e.repository??"");if(!t||!n)return;if("WillBooster"!==t&&"WillBoosterLab"!==t)return;if(!Ue(t))return;const s=Ge(t);try{await Ot(s,t,n,"d1: x-easy :hedgehog:","EDE9FE"),await Ot(s,t,n,"d2: easy :rabbit2:","DDD6FE"),await Ot(s,t,n,"d3: medium :ox:","C4B5FD"),await Ot(s,t,n,"d4: hard :squid:","A78BFA"),await Ot(s,t,n,"d5: x-hard :whale2:","8B5CF6"),await Ot(s,t,n,"p1: critical :fire::fire::fire:","EF4444"),await Ot(s,t,n,"p2: urgent :fire::fire:","F87171"),await Ot(s,t,n,"p3: important :fire:","FCA5A5"),await Ot(s,t,n,"p4: nice to have :droplet:","FECACA"),await Ot(s,t,n,"r: blitz","5300bc"),await Ot(s,t,n,"r: firebase","ffca28"),await Ot(s,t,n,"r: prisma","0c344b"),await Ot(s,t,n,"r: react","61dafb"),await Ot(s,t,n,"r: svelte","ff3e00"),await Ot(s,t,n,"r: semantic-release","494949"),await Ot(s,t,n,"ready :rocket:","22C55E"),await Ot(s,t,n,"review requested :mag:","FBCA04"),await Ot(s,t,n,"released :bookmark:","6366F1"),await Ot(s,t,n,"s: 0.5h :clock1230:","F3F4F6"),await Ot(s,t,n,"s: 1h :clock1:","E5E7EB"),await Ot(s,t,n,"s: 2h :clock2:","D1D5DB"),await Ot(s,t,n,"s: 3h :clock3:","9CA3AF"),await Ot(s,t,n,"s: 5h :clock5:","6B7280"),await Ot(s,t,n,"s: 8h :clock8:","4B5563"),await Ot(s,t,n,"s: 13h :clock1:","374151"),await Ot(s,t,n,"t: build :hammer:","BFDBFE"),await Ot(s,t,n,"t: chore :broom:","BFDBFE"),await Ot(s,t,n,"t: ci :construction_worker:","BFDBFE"),await Ot(s,t,n,"t: docs :memo:","BFDBFE"),await Ot(s,t,n,"t: feat :sparkles:","BFDBFE"),await Ot(s,t,n,"t: fix :bug:","BFDBFE"),await Ot(s,t,n,"t: perf :zap:","BFDBFE"),await Ot(s,t,n,"t: refactor :recycle:","BFDBFE"),await Ot(s,t,n,"t: style :lipstick:","BFDBFE"),await Ot(s,t,n,"t: test :test_tube:","BFDBFE"),await Ot(s,t,n,"project","24292F"),await Ot(s,t,n,"focused :dart:","22C55E"),await Ot(s,t,n,"gen-pr-all :robot:","00B4D8"),await Ot(s,t,n,"gen-pr-claude :robot:","00B4D8"),await Ot(s,t,n,"gen-pr-codex :robot:","00B4D8"),await Ot(s,t,n,"gen-pr-gemini :robot:","00B4D8"),await Ft(s,t,n,"bug"),await Ft(s,t,n,"documentation"),await Ft(s,t,n,"duplicate"),await Ft(s,t,n,"enhancement"),await Ft(s,t,n,"good first issue"),await Ft(s,t,n,"help wanted"),await Ft(s,t,n,"invalid"),await Ft(s,t,n,"question"),await Ft(s,t,n,"wontfix"),await Ft(s,t,n,"ready"),await Ft(s,t,n,"review requested"),await Ft(s,t,n,"released"),await Ft(s,t,n,"semantic-release"),await Ft(s,t,n,"llm-pr :robot:"),await Ft(s,t,n,"ai-pr :robot:")}catch(e){console.warn("Skip setupLabels due to:",e?.stack??e)}})}async function Ot(e,t,n,s,i){try{await e.request("POST /repos/{owner}/{repo}/labels",{owner:t,repo:n,name:s,color:i})}catch{await e.request("PATCH /repos/{owner}/{repo}/labels/{name}",{owner:t,repo:n,name:s,color:i})}}async function Ft(e,t,n,s){try{await e.request("DELETE /repos/{owner}/{repo}/labels/{name}",{owner:t,repo:n,name:s})}catch{}}const At=["READY_DISCORD_WEBHOOK_URL","GH_BOT_PAT","PUBLIC_GH_BOT_PAT"];async function It(e){return _.functionIgnoringException("setupSecrets",async()=>{const[t,n]=Ne.getOrgAndName(e.repository??"");if(!t||!n||"WillBoosterLab"!==t)return;if(!Ue(t)||!x.doesUploadEnvVars)return;const s=y.config().parsed??{};if(0===Object.keys(s).length)return;const i=Ge(t);try{for(const e of At)try{await i.request("DELETE /repos/{owner}/{repo}/actions/secrets/{secret_name}",{owner:t,repo:n,secret_name:e})}catch{}const e=await i.request("GET /repos/{owner}/{repo}/actions/secrets/public-key",{owner:t,repo:n}),{key:r,key_id:o}=e.data;await w.ready;for(const[e,a]of Object.entries(s)){if("GH_BOT_PAT"===e||"GH_BOT_PAT_FOR_WILLBOOSTER"===e||"GH_BOT_PAT_FOR_WILLBOOSTERLAB"===e)continue;const s=w.from_base64(r,w.base64_variants.ORIGINAL),c=w.from_string(a),l=w.crypto_box_seal(c,s),p=w.to_base64(l,w.base64_variants.ORIGINAL);await i.request("PUT /repos/{owner}/{repo}/actions/secrets/{secret_name}",{owner:t,repo:n,secret_name:e,encrypted_value:p,key_id:o})}}catch(e){console.warn("Skip setupSecrets due to:",e?.stack??e)}})}async function Tt(e){const[t,n]=Ne.getOrgAndName(e.repository??"");if(!t||!n)return;if("WillBooster"!==t&&"WillBoosterLab"!==t)return;if(!Ue(t))return;const i=Ge(t);await s(()=>i.request("PATCH /repos/{owner}/{repo}",{owner:t,repo:n,allow_auto_merge:!0,allow_merge_commit:!1,allow_squash_merge:!0,allow_rebase_merge:!1,allow_update_branch:!0,delete_branch_on_merge:!0,squash_merge_commit_title:"PR_TITLE",squash_merge_commit_message:"BLANK",headers:{"X-GitHub-Api-Version":"2022-11-28"},...e.repository?.startsWith("github:WillBooster/")?{allow_auto_merge:!0}:{}}))}const Dt="__PM_RUN__",Rt={"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., \`${Dt} test\`) passed.\n - The lint command (e.g., \`${Dt} 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 Wt(n){return _.functionIgnoringException("generateGitHubTemplates",async()=>{for(const[s,i]of Object.entries(Rt)){const r=Lt(i,n),o=t.resolve(n.dirPath,".github",s);if(e.existsSync(o)){const t=await e.promises.readFile(o,"utf8");if(b(t,r)>r.length/2)continue}await e.promises.mkdir(t.resolve(n.dirPath,".github"),{recursive:!0}),await $.run(()=>S.generateFile(o,r))}})}function Lt(e,t){const n=t.isBun?"bun run":"yarn";return e.replaceAll(Dt,n)}const Nt=k.object({typos:k.object({all:k.record(k.string(),k.string()).optional(),doc:k.record(k.string(),k.string()).optional(),ts:k.record(k.string(),k.string()).optional(),text:k.record(k.string(),k.string()).optional()}).optional()});async function Jt(n,s){const i=t.resolve(n,"package.json");try{const r=e.existsSync(i);let a={},c={},l={},p=!1;if(r){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 o.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 g;m&&(g=await async function(e,t){const n=v(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 Ut(i);if(e)return e}const r="string"==typeof t.repository?t.repository:t.repository?.url;if(r){const e=await Ut(r);if(e&&"Not Found"!==e.message)return e}}(n,l));let f=function(n){const s=t.resolve(n);return e.existsSync(t.join(s,"mise.toml"))||e.existsSync(t.join(s,".mise.toml"))||e.existsSync(t.join(s,".tool-versions"))}(n);for(const s of["java","node","python"])if(e.existsSync(t.resolve(n,`.${s}-version`))){f=!0;break}let h="";try{h=await o.readFile(t.resolve(n,"Dockerfile"),"utf8")}catch{}const y=t.resolve(n,"wbfy.json");let w;try{const e=await o.readFile(y,"utf8");w=Nt.parse(JSON.parse(e))}catch{}const b="string"==typeof g?.full_name?g.full_name:void 0;let k,x;if(b){const e=b.split("/");e.length>=2&&(k=e[0],x=e[1])}const _=b?`github:${b}`:void 0,j={dirPath:n,dockerfile:h,isRoot:m,isPublicRepo:!1===g?.private,isReferredByOtherRepo:!!l.files,repository:_,repoAuthor:k,repoName:x,isWillBoosterRepo:Boolean(_?.startsWith("github:WillBooster/")||_?.startsWith("github:WillBoosterLab/")),isBun:s?.isBun||e.existsSync(t.join(n,"bun.lock")),isEsmPackage:p,isWillBoosterConfigs:i.includes(`${t.sep}willbooster-configs`),doesContainSubPackageJsons:Gt("packages/**/package.json",n),doesContainDockerfile:!!h||e.existsSync(t.resolve(n,"docker-compose.yml")),doesContainGemfile:e.existsSync(t.resolve(n,"Gemfile")),doesContainGoMod:e.existsSync(t.resolve(n,"go.mod")),doesContainPackageJson:e.existsSync(t.resolve(n,"package.json")),doesContainPoetryLock:e.existsSync(t.resolve(n,"poetry.lock")),doesContainPomXml:e.existsSync(t.resolve(n,"pom.xml")),doesContainPubspecYaml:e.existsSync(t.resolve(n,"pubspec.yaml")),doesContainTemplateYaml:e.existsSync(t.resolve(n,"template.yaml")),doesContainVscodeSettingsJson:e.existsSync(t.resolve(n,".vscode","settings.json")),doesContainJavaScript:Gt("{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx}",n),doesContainTypeScript:Gt("{app,src,test,scripts}/**/*.{cts,mts,ts,tsx}",n),doesContainJsxOrTsx:Gt("{app,src,test}/**/*.{t,j}sx",n),doesContainJavaScriptInPackages:Gt("packages/**/{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx}",n),doesContainTypeScriptInPackages:Gt("packages/**/{app,src,test,scripts}/**/*.{cts,mts,ts,tsx}",n),doesContainJsxOrTsxInPackages:Gt("packages/**/{app,src,test}/**/*.{t,j}sx",n),hasStartTestServer:!!l.scripts?.["start-test-server"],depending:{blitz:!!a.blitz,firebase:!!c["firebase-tools"],genI18nTs:!!c["gen-i18n-ts"],litestream:h.includes("install-litestream.sh"),react:!!a.react,next:!!a.next,playwrightTest:!!a["@playwright/test"]||!!c["@playwright/test"]||!!c.playwright,prisma:!!a["@prisma/client"]||!!c.prisma,pyright:!!c.pyright,reactNative:!!a["react-native"],semanticRelease:!!(c["semantic-release"]||d.length>0||u.length>0),storybook:!!c["@storybook/react"],wb:!!a["@willbooster/wb"]||!!c["@willbooster/wb"]},release:{branches:d,github:u.includes("@semantic-release/github"),npm:u.includes("@semantic-release/npm")},hasVersionSettings:f,packageJson:l,wbfyJson:w};if(j.isBun||(j.eslintBase=function(e){if(e.depending.next)return"@willbooster/eslint-config-next";if(e.doesContainTypeScript)return e.doesContainJsxOrTsx?"@willbooster/eslint-config-ts-react":"@willbooster/eslint-config-ts";if(e.doesContainJsxOrTsx)return"@willbooster/eslint-config-js-react";if(e.doesContainJavaScript)return"@willbooster/eslint-config-js"}(j)),j.doesContainGemfile||j.doesContainGoMod||j.doesContainPackageJson||j.doesContainPoetryLock||j.doesContainPomXml||j.doesContainPubspecYaml||j.doesContainTemplateYaml)return j}catch{}}function Gt(e,t){return p.globSync(e,{dot:!0,cwd:t,ignore:D}).length>0}async function Ut(e){const[t,n]=Ne.getOrgAndName(e);if(!t||!n)return;const s={full_name:`${t}/${n}`};try{const e=await Ge().request("GET /repos/{owner}/{repo}",{owner:t,repo:n});Object.assign(s,e.data)}catch(e){const t=function(e){if(!e||"object"!=typeof e)return;const t="response"in e?e.response:void 0,n=t?.status??e.status;if(301!==n&&302!==n)return;const s=t?.headers?.location;if("string"!=typeof s)return;const[i,r]=Ne.getOrgAndName(s);if(!i||!r)return;return`${i}/${r}`}(e);t&&(s.full_name=t)}return s}await async function(){const n=await r(process.argv.slice(2)).command("$0 [paths..]","Make a given project follow the WillBooster standard",e=>{e.positional("paths",{describe:"project paths to be wbfied",array:!0,type:"string",default:["."]})}).options({env:{description:"Upload environment variables as secrets to GitHub",type:"boolean",default:!1,alias:"e"},skipDeps:{description:"Skip dependency installation",type:"boolean",default:!1,alias:"d"},verbose:{description:"Whether or not to enable verbose mode",type:"boolean",default:!1,alias:"v"}}).version(function(){let n=t.dirname(new URL(import.meta.url).pathname);for(;!e.existsSync(t.join(n,"package.json"));)n=t.dirname(n);return JSON.parse(e.readFileSync(t.join(n,"package.json"),"utf8")).version}()).strict().argv;x.isVerbose=n.verbose,x.doesUploadEnvVars=n.env;for(const s of n.paths){const r=t.join(s,"packages"),o=(await i(()=>e.promises.readdir(r,{withFileTypes:!0}))??[]).filter(e=>e.isDirectory()).map(e=>t.join(r,e.name));await W([s,...o]);const a=await Jt(s);if(!a){console.error(`there is no valid package.json in ${s}`);continue}const c=X(a),l=(await Promise.all(o.map(e=>Jt(e,a)))).filter(e=>!!e),p=[a,...l];if(x.isVerbose)for(const e of p)console.info(e);await Ct(a),a.isBun&&await ae(a);const d=!H(a.repository)&&(a.repository?.startsWith("github:WillBooster/")||a.repository?.startsWith("github:WillBoosterLab/"));await Promise.all([j(a),R(a),c.then(()=>mt(a)),te(a,p),fe(a),we(a),xe(a,p),_e(a),Se(a),Wt(a),Ie(a),yt(a),ft(a),...d?[q(a)]:[],Bt(a),It(a),Tt(a),ot(a),lt(a)]),await $.promiseAll();const u=[];for(const e of p)qe(e)||((e.doesContainTypeScript||e.doesContainTypeScriptInPackages)&&u.push(L(e,e.isRoot?p:[e])),e.depending.playwrightTest&&u.push(O(e)),e.depending.next&&u.push(P(e)),await Pe(e,a),await $.promiseAll(),(e.isRoot||e.doesContainPackageJson)&&(await pt(e),await Xe(e,a,n.skipDeps),u.push(lt(e)),e.doesContainVscodeSettingsJson&&e.doesContainPackageJson&&u.push($t(e)),(e.doesContainTypeScript||e.doesContainTypeScriptInPackages)&&u.push(_t(e)),(e.doesContainJavaScript||e.doesContainJavaScriptInPackages||e.doesContainTypeScript||e.doesContainTypeScriptInPackages)&&(a.isBun&&u.push(ie(e)),a.isWillBoosterConfigs||u.push(ve(e))),e.depending.pyright&&u.push(ut(e))));await Promise.all(u),await $.promiseAll();const m=a.isBun?"bun":"yarn";a.isBun?(e.rmSync(t.join(s,"bun.lock"),{force:!0}),Te(m,["update"],s)):(e.rmSync(t.join(s,"yarn.lock"),{force:!0}),Te(m,["install","--no-immutable"],s)),Te(m,["cleanup"],s),a.isBun||Te(m,["install","--no-immutable"],s),await wt(a)}}();
18
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9vcHRpb25zLnRzIiwiLi4vc3JjL2xvZ2dlci50cyIsIi4uL3NyYy9maXhlcnMvZG9ja2VyZmlsZS50cyIsIi4uL3NyYy91dGlscy9mc1V0aWwudHMiLCIuLi9zcmMvdXRpbHMvcHJvbWlzZVBvb2wudHMiLCIuLi9zcmMvZml4ZXJzL25leHRDb25maWcudHMiLCIuLi9zcmMvZml4ZXJzL3BsYXl3cmlnaHRDb25maWcudHMiLCIuLi9zcmMvdXRpbHMvZ2xvYlV0aWwudHMiLCIuLi9zcmMvZml4ZXJzL3ByaXNtYS50cyIsIi4uL3NyYy9maXhlcnMvdGVzdERpcmVjdG9yeS50cyIsIi4uL3NyYy9maXhlcnMvdHlwZURlZmluaXRpb24udHMiLCIuLi9zcmMvdXRpbHMvbWVyZ2VVdGlsLnRzIiwiLi4vc3JjL3V0aWxzL29iamVjdFV0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy93b3JrZmxvdy50cyIsIi4uL3NyYy9maXhlcnMvdHlwb3MudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9hZ2VudHMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9iaW9tZS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2J1bmZpZy50cyIsIi4uL3NyYy91dGlscy9pZ25vcmVGaWxlVXRpbC50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2RvY2tlcmlnbm9yZS50cyIsIi4uL3NyYy91dGlscy9leHRlbnNpb25zLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZWRpdG9yY29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZXNsaW50Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2VtaW5pQ29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2VtaW5pU2V0dGluZ3MudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9naXRhdHRyaWJ1dGVzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2l0aWdub3JlLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvaWRlYS50cyIsIi4uL3NyYy91dGlscy9zcGF3blV0aWwudHMiLCIuLi9zcmMvZ2l0aHViL2NvbW1pdC50cyIsIi4uL3NyYy91dGlscy9lc2xpbnRVdGlsLnRzIiwiLi4vc3JjL3V0aWxzL2dpdGh1YlV0aWwudHMiLCIuLi9zcmMvdXRpbHMvd2lsbGJvb3N0ZXJDb25maWdzVXRpbC50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3BhY2thZ2VKc29uLnRzIiwiLi4vc3JjL3V0aWxzL3RzY29uZmlnQmFzZS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2xlZnRob29rLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvbGludHN0YWdlZHJjLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcHJldHRpZXJpZ25vcmUudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9weXJpZ2h0Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVhZG1lLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVsZWFzZXJjLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVub3ZhdGVKc29uLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvc2tpbGxzLnRzIiwiLi4vc3JjL3V0aWxzL3NyY0RpcmVjdG9yaWVzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvdHNjb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy92c2NvZGVTZXR0aW5ncy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3lhcm5yYy50cyIsIi4uL3NyYy9naXRodWIvbGFiZWwudHMiLCIuLi9zcmMvZ2l0aHViL3NlY3JldC50cyIsIi4uL3NyYy9naXRodWIvc2V0dGluZ3MudHMiLCIuLi9zcmMvZ2l0aHViL3RlbXBsYXRlLnRzIiwiLi4vc3JjL3BhY2thZ2VDb25maWcudHMiLCIuLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiY2xhc3MgT3B0aW9ucyB7XG4gIGlzVmVyYm9zZSA9IGZhbHNlO1xuICBkb2VzVXBsb2FkRW52VmFycyA9IGZhbHNlO1xufVxuXG5leHBvcnQgY29uc3Qgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7XG4iLCJpbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi9vcHRpb25zLmpzJztcblxuY2xhc3MgTG9nZ2VyIHtcbiAgYXN5bmMgZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbihuYW1lOiBzdHJpbmcsIGZ1bmM6ICgpID0+IFByb21pc2U8dm9pZD4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgLS0tLS0tLS0tICR7bmFtZX0gc3RhcnQgLS0tLS0tLS0tYCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmdW5jKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRXJyb3Igb2NjdXJyZWQgaW4gJHtuYW1lfTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3Iuc3RhY2sgOiBTdHJpbmcoZXJyb3IpfX1gKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYC0tLS0tLS0tLS0gJHtuYW1lfSBlbmQgLS0tLS0tLS0tLWApO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgbG9nZ2VyID0gbmV3IExvZ2dlcigpO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4RG9ja2VyZmlsZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhEb2NrZXJmaWxlJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghY29uZmlnLmRvZXNDb250YWluRG9ja2VyZmlsZSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2xkQ29udGVudCA9IGNvbmZpZy5kb2NrZXJmaWxlO1xuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBvbGRDb250ZW50O1xuXG4gICAgaWYgKG9sZENvbnRlbnQgPT09IG5ld0NvbnRlbnQpIHJldHVybjtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUocGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAnRG9ja2VyZmlsZScpLCBuZXdDb250ZW50KTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5leHBvcnQgY29uc3QgZnNVdGlsID0ge1xuICBhc3luYyByZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gIH0sXG4gIGFzeW5jIGdlbmVyYXRlRmlsZShmaWxlUGF0aDogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihwYXRoLmRpcm5hbWUoZmlsZVBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBsZXQgbm9ybWFsaXplZENvbnRlbnQgPSBjb250ZW50LnJlcGxhY2VBbGwoJ1xcclxcbicsICdcXG4nKS50cmltKCk7XG4gICAgaWYgKG5vcm1hbGl6ZWRDb250ZW50KSB7XG4gICAgICBub3JtYWxpemVkQ29udGVudCArPSAnXFxuJztcbiAgICB9XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGZpbGVQYXRoLCBub3JtYWxpemVkQ29udGVudCk7XG4gICAgY29uc29sZS5sb2coYEdlbmVyYXRlZC9VcGRhdGVkICR7ZmlsZVBhdGh9YCk7XG4gIH0sXG59O1xuIiwiaW1wb3J0IHsgUHJvbWlzZVBvb2wgfSBmcm9tICdtaW5pbWFsLXByb21pc2UtcG9vbCc7XG5cbmV4cG9ydCBjb25zdCBwcm9taXNlUG9vbCA9IG5ldyBQcm9taXNlUG9vbCgpO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4TmV4dENvbmZpZ0pzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4TmV4dENvbmZpZ0pzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBbJ2pzJywgJ21qcycsICdjanMnXVxuICAgICAgLm1hcCgoZXh0KSA9PiBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGBuZXh0LmNvbmZpZy4ke2V4dH1gKSlcbiAgICAgIC5maW5kKChwKSA9PiBmcy5leGlzdHNTeW5jKHApKTtcbiAgICBpZiAoIWZpbGVQYXRoKSByZXR1cm47XG5cbiAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgLy8gUmVwbGFjZSB0aGUgSlNPTiBvYmplY3QgZnJvbSB0aGUgZmlsZVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBvbGRDb250ZW50LnJlcGxhY2UoLz1cXHMqeyhbXFxTXFxzXSopfTsvLCAoXywgc2V0dGluZ3NUZXh0OiBzdHJpbmcpID0+IHtcbiAgICAgIGlmICghc2V0dGluZ3NUZXh0LmluY2x1ZGVzKCdlc2xpbnQ6JykpIHtcbiAgICAgICAgc2V0dGluZ3NUZXh0ICs9ICdlc2xpbnQ6IHsgaWdub3JlRHVyaW5nQnVpbGRzOiB0cnVlIH0sJztcbiAgICAgIH1cbiAgICAgIGlmICghc2V0dGluZ3NUZXh0LmluY2x1ZGVzKCd0eXBlc2NyaXB0OicpKSB7XG4gICAgICAgIHNldHRpbmdzVGV4dCArPSAndHlwZXNjcmlwdDogeyBpZ25vcmVCdWlsZEVycm9yczogdHJ1ZSB9LCc7XG4gICAgICB9XG4gICAgICByZXR1cm4gYD0geyR7c2V0dGluZ3NUZXh0fX07YDtcbiAgICB9KTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IHRzIGZyb20gJ3R5cGVzY3JpcHQnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbnR5cGUgUGFyc2VkVmFsdWUgPVxuICB8IHsga2luZDogJ2FycmF5JzsgdmFsdWU6IFBhcnNlZFZhbHVlW10gfVxuICB8IHsga2luZDogJ2xpdGVyYWwnOyB2YWx1ZTogc3RyaW5nIH1cbiAgfCB7IGtpbmQ6ICdvYmplY3QnOyB2YWx1ZTogUGFyc2VkT2JqZWN0IH07XG50eXBlIFBhcnNlZE9iamVjdCA9IFJlY29yZDxzdHJpbmcsIFBhcnNlZFZhbHVlPjtcblxuY29uc3QgbGl0ZXJhbCA9ICh2YWx1ZTogc3RyaW5nKTogUGFyc2VkVmFsdWUgPT4gKHsga2luZDogJ2xpdGVyYWwnLCB2YWx1ZSB9KTtcbmNvbnN0IGFzQXJyYXkgPSAodmFsdWU6IFBhcnNlZFZhbHVlW10pOiBQYXJzZWRWYWx1ZSA9PiAoeyBraW5kOiAnYXJyYXknLCB2YWx1ZSB9KTtcbmNvbnN0IGFzT2JqZWN0ID0gKHZhbHVlOiBQYXJzZWRPYmplY3QpOiBQYXJzZWRWYWx1ZSA9PiAoeyBraW5kOiAnb2JqZWN0JywgdmFsdWUgfSk7XG5cbmNvbnN0IGRlZmF1bHRDb25maWc6IFBhcnNlZE9iamVjdCA9IHtcbiAgZm9yYmlkT25seTogbGl0ZXJhbCgnISFwcm9jZXNzLmVudi5DSScpLFxuICByZXRyaWVzOiBsaXRlcmFsKCdwcm9jZXNzLmVudi5QV0RFQlVHID8gMCA6IHByb2Nlc3MuZW52LkNJID8gNSA6IDEnKSxcbiAgdXNlOiBhc09iamVjdCh7XG4gICAgYmFzZVVSTDogbGl0ZXJhbCgncHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfQkFTRV9VUkwnKSxcbiAgICB0cmFjZTogbGl0ZXJhbChcInByb2Nlc3MuZW52LkNJID8gJ29uLWZpcnN0LXJldHJ5JyA6ICdyZXRhaW4tb24tZmFpbHVyZSdcIiksXG4gICAgc2NyZWVuc2hvdDogbGl0ZXJhbChcInByb2Nlc3MuZW52LkNJID8gJ29ubHktb24tZmFpbHVyZScgOiAnb25seS1vbi1mYWlsdXJlJ1wiKSxcbiAgICB2aWRlbzogbGl0ZXJhbChcInByb2Nlc3MuZW52LkNJID8gJ3JldGFpbi1vbi1mYWlsdXJlJyA6ICdyZXRhaW4tb24tZmFpbHVyZSdcIiksXG4gIH0pLFxuICB3ZWJTZXJ2ZXI6IGFzT2JqZWN0KHtcbiAgICBjb21tYW5kOiBsaXRlcmFsKFwiJ3lhcm4gc3RhcnQtdGVzdC1zZXJ2ZXInXCIpLFxuICAgIHVybDogbGl0ZXJhbCgncHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfQkFTRV9VUkwnKSxcbiAgICByZXVzZUV4aXN0aW5nU2VydmVyOiBsaXRlcmFsKCchIXByb2Nlc3MuZW52LkNJJyksXG4gICAgdGltZW91dDogbGl0ZXJhbCgnMzAwXzAwMCcpLFxuICAgIHN0ZG91dDogbGl0ZXJhbChcIidwaXBlJ1wiKSxcbiAgICBzdGRlcnI6IGxpdGVyYWwoXCIncGlwZSdcIiksXG4gICAgZW52OiBsaXRlcmFsKGB7XG4gIC4uLnByb2Nlc3MuZW52LFxuICBQUklTTUFfVVNFUl9DT05TRU5UX0ZPUl9EQU5HRVJPVVNfQUlfQUNUSU9OOiAndHJ1ZScsXG59YCksXG4gICAgZ3JhY2VmdWxTaHV0ZG93bjogbGl0ZXJhbChge1xuICBzaWduYWw6ICdTSUdURVJNJyxcbiAgdGltZW91dDogNTAwLFxufWApLFxuICB9KSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhQbGF5d3JpZ2h0Q29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFBsYXl3cmlnaHRDb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGBwbGF5d3JpZ2h0LmNvbmZpZy50c2ApO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHJldHVybjtcblxuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICBjb25zdCBtYXRjaCA9IC9kZWZpbmVDb25maWdcXHMqXFwoXFxzKihcXHtbXFxzXFxTXSo/fSlcXHMqXFwpOz8vLmV4ZWMob2xkQ29udGVudCk7XG4gICAgY29uc3Qgb2JqZWN0TGl0ZXJhbCA9IG1hdGNoPy5bMV07XG4gICAgaWYgKCFvYmplY3RMaXRlcmFsKSByZXR1cm47XG5cbiAgICBjb25zdCBwYXJzZWQgPSBwYXJzZU9iamVjdExpdGVyYWwob2JqZWN0TGl0ZXJhbCk7XG4gICAgaWYgKCFwYXJzZWQpIHJldHVybjtcblxuICAgIC8vIEtlZXAgZmlsbGluZyBtaXNzaW5nIGRlZmF1bHRzLCBidXQgZG9uJ3Qgb3ZlcndyaXRlIGxvY2FsIGFkanVzdG1lbnRzIG9uIGV2ZXJ5IHJlZ2VuZXJhdGlvbi5cbiAgICBjb25zdCBtZXJnZWQgPSBtZXJnZS5hbGw8UGFyc2VkT2JqZWN0PihbZGVmYXVsdENvbmZpZywgcGFyc2VkXSk7XG4gICAgY29uc3QgaGFzU3RhcnRUZXN0U2VydmVyID0gQm9vbGVhbihjb25maWcucGFja2FnZUpzb24/LnNjcmlwdHM/Llsnc3RhcnQtdGVzdC1zZXJ2ZXInXSk7XG4gICAgaWYgKCFoYXNTdGFydFRlc3RTZXJ2ZXIpIHtcbiAgICAgIGRlbGV0ZSBtZXJnZWQud2ViU2VydmVyO1xuICAgIH1cblxuICAgIGNvbnN0IGhhc0Jhc2VVcmwgPSBhd2FpdCBoYXNOZXh0UHVibGljQmFzZVVybChjb25maWcuZGlyUGF0aCk7XG4gICAgaWYgKCFoYXNCYXNlVXJsKSB7XG4gICAgICBjb25zdCB1c2VDb25maWcgPSBtZXJnZWQudXNlO1xuICAgICAgaWYgKHVzZUNvbmZpZz8ua2luZCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgZGVsZXRlIHVzZUNvbmZpZy52YWx1ZS5iYXNlVVJMO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG5ld09iamVjdExpdGVyYWwgPSBzdHJpbmdpZnlPYmplY3QobWVyZ2VkLCAwKTtcbiAgICBjb25zdCBuZXdDb250ZW50ID0gb2xkQ29udGVudC5yZXBsYWNlKG9iamVjdExpdGVyYWwsIG5ld09iamVjdExpdGVyYWwpO1xuXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGhhc05leHRQdWJsaWNCYXNlVXJsKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBlbnZGaWxlUGF0aHMgPSBbcGF0aC5yZXNvbHZlKGRpclBhdGgsICcuZW52JyksIHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnbWlzZS50b21sJyldO1xuICBmb3IgKGNvbnN0IGVudkZpbGVQYXRoIG9mIGVudkZpbGVQYXRocykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZW52RmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBpZiAoL05FWFRfUFVCTElDX0JBU0VfVVJMXFxzKj0vbS50ZXN0KGNvbnRlbnQpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gTWlzc2luZyBlbnYgZmlsZXMgYXJlIGV4cGVjdGVkIGluIHNvbWUgcmVwb3MuXG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gcGFyc2VPYmplY3RMaXRlcmFsKG9iamVjdExpdGVyYWw6IHN0cmluZyk6IFBhcnNlZE9iamVjdCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHNvdXJjZSA9IHRzLmNyZWF0ZVNvdXJjZUZpbGUoXG4gICAgJ3BsYXl3cmlnaHQtY29uZmlnLnRzJyxcbiAgICBgY29uc3QgY29uZmlnID0gJHtvYmplY3RMaXRlcmFsfTtgLFxuICAgIHRzLlNjcmlwdFRhcmdldC5MYXRlc3QsXG4gICAgdHJ1ZSxcbiAgICB0cy5TY3JpcHRLaW5kLlRTXG4gICk7XG4gIGNvbnN0IHN0YXRlbWVudCA9IHNvdXJjZS5zdGF0ZW1lbnRzWzBdO1xuICBpZiAoIXN0YXRlbWVudCB8fCAhdHMuaXNWYXJpYWJsZVN0YXRlbWVudChzdGF0ZW1lbnQpKSByZXR1cm47XG4gIGNvbnN0IGRlY2xhcmF0aW9uID0gc3RhdGVtZW50LmRlY2xhcmF0aW9uTGlzdC5kZWNsYXJhdGlvbnNbMF07XG4gIGlmICghZGVjbGFyYXRpb24/LmluaXRpYWxpemVyIHx8ICF0cy5pc09iamVjdExpdGVyYWxFeHByZXNzaW9uKGRlY2xhcmF0aW9uLmluaXRpYWxpemVyKSkgcmV0dXJuO1xuICByZXR1cm4gcGFyc2VPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihkZWNsYXJhdGlvbi5pbml0aWFsaXplciwgc291cmNlKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihcbiAgb2JqZWN0TGl0ZXJhbDogdHMuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24sXG4gIHNvdXJjZTogdHMuU291cmNlRmlsZVxuKTogUGFyc2VkT2JqZWN0IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcGFyc2VkOiBQYXJzZWRPYmplY3QgPSB7fTtcbiAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBvYmplY3RMaXRlcmFsLnByb3BlcnRpZXMpIHtcbiAgICBpZiAoIXRzLmlzUHJvcGVydHlBc3NpZ25tZW50KHByb3BlcnR5KSB8fCAoIXRzLmlzSWRlbnRpZmllcihwcm9wZXJ0eS5uYW1lKSAmJiAhdHMuaXNTdHJpbmdMaXRlcmFsKHByb3BlcnR5Lm5hbWUpKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZSA9IHBhcnNlRXhwcmVzc2lvbihwcm9wZXJ0eS5pbml0aWFsaXplciwgc291cmNlKTtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgIHBhcnNlZFtwcm9wZXJ0eS5uYW1lLmdldFRleHQoc291cmNlKV0gPSB2YWx1ZTtcbiAgfVxuICByZXR1cm4gcGFyc2VkO1xufVxuXG5mdW5jdGlvbiBwYXJzZUV4cHJlc3Npb24oZXhwcmVzc2lvbjogdHMuRXhwcmVzc2lvbiwgc291cmNlOiB0cy5Tb3VyY2VGaWxlKTogUGFyc2VkVmFsdWUgfCB1bmRlZmluZWQge1xuICBpZiAodHMuaXNPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihleHByZXNzaW9uKSkge1xuICAgIGNvbnN0IHBhcnNlZE9iamVjdCA9IHBhcnNlT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oZXhwcmVzc2lvbiwgc291cmNlKTtcbiAgICByZXR1cm4gcGFyc2VkT2JqZWN0ID8gYXNPYmplY3QocGFyc2VkT2JqZWN0KSA6IGxpdGVyYWwoZXhwcmVzc2lvbi5nZXRUZXh0KHNvdXJjZSkpO1xuICB9XG4gIGlmICh0cy5pc0FycmF5TGl0ZXJhbEV4cHJlc3Npb24oZXhwcmVzc2lvbikpIHtcbiAgICBjb25zdCBlbGVtZW50cyA9IGV4cHJlc3Npb24uZWxlbWVudHMubWFwKChlbGVtZW50KSA9PiBwYXJzZUV4cHJlc3Npb24oZWxlbWVudCwgc291cmNlKSk7XG4gICAgaWYgKGVsZW1lbnRzLnNvbWUoKGVsZW1lbnQpOiBlbGVtZW50IGlzIHVuZGVmaW5lZCA9PiBlbGVtZW50ID09PSB1bmRlZmluZWQpKSB7XG4gICAgICByZXR1cm4gbGl0ZXJhbChleHByZXNzaW9uLmdldFRleHQoc291cmNlKSk7XG4gICAgfVxuICAgIHJldHVybiBhc0FycmF5KGVsZW1lbnRzIGFzIFBhcnNlZFZhbHVlW10pO1xuICB9XG4gIHJldHVybiBsaXRlcmFsKGV4cHJlc3Npb24uZ2V0VGV4dChzb3VyY2UpKTtcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5VmFsdWUodmFsdWU6IFBhcnNlZFZhbHVlLCBsZXZlbDogbnVtYmVyKTogc3RyaW5nIHtcbiAgaWYgKHZhbHVlLmtpbmQgPT09ICdhcnJheScpIHtcbiAgICByZXR1cm4gc3RyaW5naWZ5QXJyYXkodmFsdWUudmFsdWUsIGxldmVsKTtcbiAgfVxuICBpZiAodmFsdWUua2luZCA9PT0gJ2xpdGVyYWwnKSByZXR1cm4gdmFsdWUudmFsdWU7XG4gIHJldHVybiBzdHJpbmdpZnlPYmplY3QodmFsdWUudmFsdWUsIGxldmVsKTtcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5QXJyYXkodmFsdWVzOiBQYXJzZWRWYWx1ZVtdLCBsZXZlbDogbnVtYmVyKTogc3RyaW5nIHtcbiAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDApIHJldHVybiAnW10nO1xuICBjb25zdCBpbmRlbnQgPSAnICAnLnJlcGVhdChsZXZlbCArIDEpO1xuICBjb25zdCBsaW5lcyA9IHZhbHVlcy5tYXAoKHZhbHVlKSA9PiB7XG4gICAgY29uc3Qgc3RyaW5naWZpZWQgPSBzdHJpbmdpZnlWYWx1ZSh2YWx1ZSwgbGV2ZWwgKyAxKS5zcGxpdCgnXFxuJyk7XG4gICAgc3RyaW5naWZpZWRbc3RyaW5naWZpZWQubGVuZ3RoIC0gMV0gPSBgJHtzdHJpbmdpZmllZC5hdCgtMSl9LGA7XG4gICAgaWYgKHZhbHVlLmtpbmQgPT09ICdsaXRlcmFsJykge1xuICAgICAgZm9yIChsZXQgaW5kZXggPSAxOyBpbmRleCA8IHN0cmluZ2lmaWVkLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgICBzdHJpbmdpZmllZFtpbmRleF0gPSBgJHtpbmRlbnR9JHtzdHJpbmdpZmllZFtpbmRleF19YDtcbiAgICAgIH1cbiAgICB9XG4gICAgc3RyaW5naWZpZWRbMF0gPSBgJHtpbmRlbnR9JHtzdHJpbmdpZmllZFswXX1gO1xuICAgIHJldHVybiBzdHJpbmdpZmllZC5qb2luKCdcXG4nKTtcbiAgfSk7XG4gIGNvbnN0IGNsb3NpbmdJbmRlbnQgPSAnICAnLnJlcGVhdChsZXZlbCk7XG4gIHJldHVybiBgW1xcbiR7bGluZXMuam9pbignXFxuJyl9XFxuJHtjbG9zaW5nSW5kZW50fV1gO1xufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnlPYmplY3Qob2JqZWN0OiBQYXJzZWRPYmplY3QsIGxldmVsOiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCBpbmRlbnQgPSAnICAnLnJlcGVhdChsZXZlbCArIDEpO1xuICBjb25zdCBsaW5lcyA9IE9iamVjdC5lbnRyaWVzKG9iamVjdCkubWFwKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICBjb25zdCBzdHJpbmdpZmllZCA9IHN0cmluZ2lmeVZhbHVlKHZhbHVlLCBsZXZlbCArIDEpLnNwbGl0KCdcXG4nKTtcbiAgICBzdHJpbmdpZmllZFtzdHJpbmdpZmllZC5sZW5ndGggLSAxXSA9IGAke3N0cmluZ2lmaWVkLmF0KC0xKX0sYDtcbiAgICBpZiAodmFsdWUua2luZCA9PT0gJ2xpdGVyYWwnKSB7XG4gICAgICBmb3IgKGxldCBpbmRleCA9IDE7IGluZGV4IDwgc3RyaW5naWZpZWQubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICAgIHN0cmluZ2lmaWVkW2luZGV4XSA9IGAke2luZGVudH0ke3N0cmluZ2lmaWVkW2luZGV4XX1gO1xuICAgICAgfVxuICAgIH1cbiAgICBzdHJpbmdpZmllZFswXSA9IGAke2luZGVudH0ke2tleX06ICR7c3RyaW5naWZpZWRbMF19YDtcbiAgICByZXR1cm4gc3RyaW5naWZpZWQuam9pbignXFxuJyk7XG4gIH0pO1xuICBjb25zdCBjbG9zaW5nSW5kZW50ID0gJyAgJy5yZXBlYXQobGV2ZWwpO1xuICBpZiAobGluZXMubGVuZ3RoID09PSAwKSByZXR1cm4gYHtcXG4ke2Nsb3NpbmdJbmRlbnR9fWA7XG4gIHJldHVybiBge1xcbiR7bGluZXMuam9pbignXFxuJyl9XFxuJHtjbG9zaW5nSW5kZW50fX1gO1xufVxuIiwiZXhwb3J0IGNvbnN0IGdsb2JJZ25vcmUgPSBbXG4gICcqKi9ub2RlX21vZHVsZXMvKionLFxuICAnKiovLnZlbnYvKionLFxuICAnKiovdGVzdC1maXh0dXJlcy8qKicsXG4gICcqKi90ZXN0L2ZpeHR1cmVzLyoqJyxcbiAgJyoqL2Rpc3QvKionLFxuICAnKiovYnVpbGQvKionLFxuICAnKiovdGFyZ2V0LyoqJyxcbiAgJyoqL3RlbXAvKionLFxuICAnKiovdG1wLyoqJyxcbl07XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJy4uL3V0aWxzL2dsb2JVdGlsLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFByaXNtYUVudkZpbGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFByaXNtYUVudkZpbGVzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGVudkZpbGVzID0gYXdhaXQgZmcuZ2xvYihbJyouZW52JywgJyouZW52LionXSwgeyBkb3Q6IHRydWUsIGN3ZDogY29uZmlnLmRpclBhdGgsIGlnbm9yZTogZ2xvYklnbm9yZSB9KTtcbiAgICBmb3IgKGNvbnN0IGVudkZpbGUgb2YgZW52RmlsZXMpIHtcbiAgICAgIGNvbnN0IGVudkZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBlbnZGaWxlKTtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShlbnZGaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoXG4gICAgICAgIC9EQVRBQkFTRV9VUkw9XCI/KC4rXFwuc3FsaXRlMylcIj9bXFxuJF0vLFxuICAgICAgICAnREFUQUJBU0VfVVJMPVwiJDE/Y29ubmVjdGlvbl9saW1pdD0xXCJcXG4nXG4gICAgICApO1xuICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKGVudkZpbGVQYXRoLCBuZXdDb250ZW50KTtcbiAgICB9XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFRlc3REaXJlY3Rvcmllc1VwZGF0aW5nUGFja2FnZUpzb24ocGFja2FnZURpclBhdGhzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFRlc3REaXJlY3Rvcmllc1VwZGF0aW5nUGFja2FnZUpzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBwYWNrYWdlRGlyUGF0aHMubWFwKGFzeW5jIChwYWNrYWdlRGlyUGF0aCkgPT4ge1xuICAgICAgICBjb25zdCBuZXdUZXN0RGlyUGF0aCA9IHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ3Rlc3QnKTtcbiAgICAgICAgZm9yIChjb25zdCBvbGRUZXN0RGlyTmFtZSBvZiBbJ19fdGVzdHNfXycsICd0ZXN0cyddKSB7XG4gICAgICAgICAgY29uc3Qgb2xkVGVzdERpclBhdGggPSBwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsIG9sZFRlc3REaXJOYW1lKTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMucmVuYW1lKG9sZFRlc3REaXJQYXRoLCBuZXdUZXN0RGlyUGF0aCk7XG4gICAgICAgICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUocGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAncGFja2FnZS5qc29uJyksICd1dGY4Jyk7XG4gICAgICAgICAgICBjb25zdCBuZXdDb250ZW50ID0gb2xkQ29udGVudC5yZXBsYWNlQWxsKG9sZFRlc3REaXJOYW1lLCAndGVzdCcpO1xuICAgICAgICAgICAgaWYgKG9sZENvbnRlbnQgPT09IG5ld0NvbnRlbnQpIHJldHVybjtcblxuICAgICAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpLCBuZXdDb250ZW50KTtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBpZ25vcmVFbm9lbnRBc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhUeXBlRGVmaW5pdGlvbnMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgY29uZmlnc0luY2x1ZGluZ0NoaWxkcmVuOiBQYWNrYWdlQ29uZmlnW11cbik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFR5cGVEZWZpbml0aW9ucycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBsaWJUeXBlRGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ0B0eXBlcycpO1xuICAgIGNvbnN0IHNyY1R5cGVEaXJQYXRoID1cbiAgICAgIGNvbmZpZy5pc1Jvb3QgJiYgY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zID8gdW5kZWZpbmVkIDogcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnc3JjJywgJ3R5cGVzJyk7XG5cbiAgICBjb25zdCBkaXJlbnRzID0gYXdhaXQgaWdub3JlRW5vZW50QXN5bmMoKCkgPT4gZnMucmVhZGRpcihsaWJUeXBlRGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKTtcbiAgICBpZiAoIWRpcmVudHMpIHJldHVybjtcblxuICAgIGZvciAoY29uc3QgZGlyZW50IG9mIGRpcmVudHMpIHtcbiAgICAgIGNvbnN0IGRpck5hbWUgPSBkaXJlbnQubmFtZS5zbGljZSgwLCAtNSk7XG4gICAgICBjb25zdCBoYXNUeXBlRGVjbGFyYXRpb25FeHRlbnNpb24gPSBkaXJlbnQubmFtZS5lbmRzV2l0aCgnLmQudHMnKTtcbiAgICAgIGxldCBwYWNrYWdlTmFtZSA9IGhhc1R5cGVEZWNsYXJhdGlvbkV4dGVuc2lvbiA/IGRpck5hbWUgOiBkaXJlbnQubmFtZTtcbiAgICAgIGlmIChwYWNrYWdlTmFtZS5pbmNsdWRlcygnX18nKSkge1xuICAgICAgICBwYWNrYWdlTmFtZSA9IGBAJHtwYWNrYWdlTmFtZS5yZXBsYWNlKCdfXycsICcvJyl9YDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGhhc0xpYnJhcnkgPSBjb25maWdzSW5jbHVkaW5nQ2hpbGRyZW4uc29tZShcbiAgICAgICAgKGNvbmZpZykgPT5cbiAgICAgICAgICBjb25maWcucGFja2FnZUpzb24/LmRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSB8fCBjb25maWcucGFja2FnZUpzb24/LmRldkRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXVxuICAgICAgKTtcblxuICAgICAgaWYgKGRpcmVudC5pc0ZpbGUoKSAmJiBoYXNUeXBlRGVjbGFyYXRpb25FeHRlbnNpb24pIHtcbiAgICAgICAgaWYgKGhhc0xpYnJhcnkpIHtcbiAgICAgICAgICAvLyBNb3ZlIEB0eXBlcy88bmFtZT4vaW5kZXguZC50cyBpZiBpbnN0YWxsZWRcbiAgICAgICAgICBhd2FpdCBmcy5ta2RpcihwYXRoLmpvaW4obGliVHlwZURpclBhdGgsIGRpck5hbWUpKTtcbiAgICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgICAgICAgIGZzLnJlbmFtZShwYXRoLmpvaW4obGliVHlwZURpclBhdGgsIGRpcmVudC5uYW1lKSwgcGF0aC5qb2luKGxpYlR5cGVEaXJQYXRoLCBkaXJOYW1lLCAnaW5kZXguZC50cycpKVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3JjVHlwZURpclBhdGgpIHtcbiAgICAgICAgICAvLyBNb3ZlIHNyYy90eXBlcy88bmFtZT4gaWYgbm90IGluc3RhbGxlZFxuICAgICAgICAgIGF3YWl0IGZzLm1rZGlyKHNyY1R5cGVEaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgICAgICAgIGZzLnJlbmFtZShwYXRoLmpvaW4obGliVHlwZURpclBhdGgsIGRpcmVudC5uYW1lKSwgcGF0aC5qb2luKHNyY1R5cGVEaXJQYXRoLCBkaXJlbnQubmFtZSkpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChkaXJlbnQuaXNEaXJlY3RvcnkoKSAmJiBzcmNUeXBlRGlyUGF0aCAmJiAhaGFzTGlicmFyeSkge1xuICAgICAgICAvLyBNb3ZlIHNyYy90eXBlcy88bmFtZT4uZC50cyBpZiBub3QgaW5zdGFsbGVkXG4gICAgICAgIGF3YWl0IGZzLm1rZGlyKHNyY1R5cGVEaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICAgICAgaWdub3JlRW5vZW50QXN5bmMoKCkgPT5cbiAgICAgICAgICAgIGZzLnJlbmFtZShcbiAgICAgICAgICAgICAgcGF0aC5qb2luKGxpYlR5cGVEaXJQYXRoLCBkaXJlbnQubmFtZSwgJ2luZGV4LmQudHMnKSxcbiAgICAgICAgICAgICAgcGF0aC5qb2luKHNyY1R5cGVEaXJQYXRoLCBgJHtkaXJlbnQubmFtZX0uZC50c2ApXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWFzc2lnbm1lbnQsIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtY2FsbCwgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzLCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWFyZ3VtZW50ICovXG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5leHBvcnQgZnVuY3Rpb24gb3ZlcndyaXRlTWVyZ2U8VD4oZGVzdGluYXRpb25BcnJheTogVFtdLCBzb3VyY2VBcnJheTogVFtdKTogVFtdIHtcbiAgcmV0dXJuIHNvdXJjZUFycmF5O1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGZ1bmN0aW9uIGNvbWJpbmVNZXJnZSh0YXJnZXQ6IG9iamVjdFtdLCBzb3VyY2U6IG9iamVjdFtdLCBvcHRpb25zOiBhbnkpOiBvYmplY3RbXSB7XG4gIGNvbnN0IGRlc3RpbmF0aW9uID0gWy4uLnRhcmdldF07XG5cbiAgZm9yIChjb25zdCBbaW5kZXgsIGl0ZW1dIG9mIHNvdXJjZS5lbnRyaWVzKCkpIHtcbiAgICBpZiAoZGVzdGluYXRpb25baW5kZXhdID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGRlc3RpbmF0aW9uW2luZGV4XSA9IG9wdGlvbnMuY2xvbmVVbmxlc3NPdGhlcndpc2VTcGVjaWZpZWQoaXRlbSwgb3B0aW9ucyk7XG4gICAgfSBlbHNlIGlmIChvcHRpb25zLmlzTWVyZ2VhYmxlT2JqZWN0KGl0ZW0pKSB7XG4gICAgICBkZXN0aW5hdGlvbltpbmRleF0gPSBtZXJnZSh0YXJnZXRbaW5kZXhdIGFzIG9iamVjdCwgaXRlbSwgb3B0aW9ucyk7XG4gICAgfSBlbHNlIGlmICghdGFyZ2V0LmluY2x1ZGVzKGl0ZW0pKSB7XG4gICAgICBkZXN0aW5hdGlvbi5wdXNoKGl0ZW0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGVzdGluYXRpb247XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gbW92ZVRvQm90dG9tPFRPYmogZXh0ZW5kcyBSZWNvcmQ8VEtleSwgdW5rbm93bj4sIFRLZXkgZXh0ZW5kcyBzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2w+KFxuICBvYmo6IFRPYmosXG4gIGtleTogVEtleVxuKTogVE9iaiB7XG4gIGNvbnN0IHZhbHVlID0gb2JqW2tleV07XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgZGVsZXRlIG9ialtrZXldO1xuICAob2JqIGFzIFJlY29yZDxUS2V5LCB1bmtub3duPilba2V5XSA9IHZhbHVlO1xuICByZXR1cm4gb2JqO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc29ydEtleXM8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PihvYmo6IFQpOiBUIHtcbiAgY29uc3Qga2V5QW5kVmFsdWVzID0gT2JqZWN0LmVudHJpZXMob2JqKS50b1NvcnRlZCgoW2tleTFdLCBba2V5Ml0pID0+IGtleTEubG9jYWxlQ29tcGFyZShrZXkyKSk7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGtleUFuZFZhbHVlcykge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgICBkZWxldGUgb2JqW2tleV07XG4gICAgKG9iaiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSA9IHZhbHVlO1xuXG4gICAgLy8gaWYgdmFsdWUgaXMgYW4gb2JqZWN0LCBzb3J0IHRoZSBrZXlzIG9mIHRoZSBvYmplY3RcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgc29ydEtleXModmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb2JqO1xufVxuIiwiLyogZXNsaW50LWRpc2FibGUgdW5pY29ybi9uby1udWxsICovXG5cbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IHlhbWwgZnJvbSAnanMteWFtbCc7XG5pbXBvcnQgY2xvbmVEZWVwIGZyb20gJ2xvZGFzaC5jbG9uZWRlZXAnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBjb21iaW5lTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgbW92ZVRvQm90dG9tLCBzb3J0S2V5cyB9IGZyb20gJy4uL3V0aWxzL29iamVjdFV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmludGVyZmFjZSBXb3JrZmxvdyB7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIG9uPzogT247XG4gIGNvbmN1cnJlbmN5PzogQ29uY3VycmVuY3k7XG4gIHBlcm1pc3Npb25zPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgam9iczogUmVjb3JkPHN0cmluZywgSm9iPjtcbn1cblxuaW50ZXJmYWNlIENvbmN1cnJlbmN5IHtcbiAgZ3JvdXA6IHN0cmluZztcbiAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBPbiB7XG4gIGlzc3Vlcz86IFR5cGVzIHwgbnVsbDtcbiAgcHVsbF9yZXF1ZXN0PzogUHVsbFJlcXVlc3QgfCBudWxsO1xuICBwdWxsX3JlcXVlc3RfdGFyZ2V0PzogVHlwZXMgfCBudWxsO1xuICBwdXNoPzogUHVzaDtcbiAgc2NoZWR1bGU/OiBTY2hlZHVsZVtdO1xuICB3b3JrZmxvd19kaXNwYXRjaD86IG51bGw7XG59XG5cbmludGVyZmFjZSBQdWxsUmVxdWVzdCB7XG4gICdwYXRocy1pZ25vcmUnPzogc3RyaW5nW107XG4gIHR5cGVzPzogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBQdXNoIHtcbiAgYnJhbmNoZXM6IHN0cmluZ1tdO1xuICAncGF0aHMtaWdub3JlJz86IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgU2NoZWR1bGUge1xuICBjcm9uOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBUeXBlcyB7XG4gIHR5cGVzOiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIEpvYiB7XG4gICdydW5zLW9uJz86IHN0cmluZztcbiAgcGVybWlzc2lvbnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBzdGVwcz86IFN0ZXBbXTtcbiAgdXNlcz86IHN0cmluZztcbiAgaWY/OiBzdHJpbmc7XG4gIHNlY3JldHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgd2l0aD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG5pbnRlcmZhY2UgU3RlcCB7XG4gIHVzZXM/OiBzdHJpbmc7XG4gIHdpdGg/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcnVuPzogc3RyaW5nO1xufVxuXG5jb25zdCBwdWJsaWNSZXBvQXV0b2ZpeFdvcmtmbG93OiBXb3JrZmxvdyA9IHtcbiAgbmFtZTogJ2F1dG9maXguY2knLFxuICBvbjoge1xuICAgIHB1bGxfcmVxdWVzdDogbnVsbCxcbiAgICBwdXNoOiB7XG4gICAgICBicmFuY2hlczogWydtYWluJ10sXG4gICAgfSxcbiAgfSxcbiAgcGVybWlzc2lvbnM6IHtcbiAgICBjb250ZW50czogJ3JlYWQnLFxuICB9LFxuICBjb25jdXJyZW5jeToge1xuICAgIGdyb3VwOiAnYXV0b2ZpeC0ke3sgZ2l0aHViLmhlYWRfcmVmIH19JyxcbiAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogdHJ1ZSxcbiAgfSxcbiAgam9iczoge1xuICAgIGF1dG9maXg6IHsgJ3J1bnMtb24nOiAndWJ1bnR1LWxhdGVzdCcgfSxcbiAgfSxcbn07XG5cbmNvbnN0IHByaXZhdGVSZXBvQXV0b2ZpeFdvcmtmbG93OiBXb3JrZmxvdyA9IHtcbiAgbmFtZTogJ0ZpeCBjb2RlIGF1dG9tYXRpY2FsbHknLFxuICBvbjoge1xuICAgIHB1bGxfcmVxdWVzdDogbnVsbCxcbiAgfSxcbiAgY29uY3VycmVuY3k6IHtcbiAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0tJHt7IGdpdGh1Yi5yZWYgfX0nLFxuICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiB0cnVlLFxuICB9LFxuICBqb2JzOiB7XG4gICAgYXV0b2ZpeDoge1xuICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9hdXRvZml4LnltbEBtYWluJyxcbiAgICB9LFxuICB9LFxufTtcblxuY29uc3Qgd29ya2Zsb3dzID0ge1xuICB0ZXN0OiB7XG4gICAgbmFtZTogJ1Rlc3QnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3Q6IG51bGwsXG4gICAgICBwdXNoOiB7XG4gICAgICAgIGJyYW5jaGVzOiBbJ21haW4nLCAnd2JmeSddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIC8vIGNmLiBodHRwczovL2RvY3MuZ2l0aHViLmNvbS9lbi9hY3Rpb25zL3VzaW5nLWpvYnMvdXNpbmctY29uY3VycmVuY3kjZXhhbXBsZS1vbmx5LWNhbmNlbC1pbi1wcm9ncmVzcy1qb2JzLW9yLXJ1bnMtZm9yLXRoZS1jdXJyZW50LXdvcmtmbG93XG4gICAgY29uY3VycmVuY3k6IHtcbiAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fS0ke3sgZ2l0aHViLnJlZiB9fScsXG4gICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogdHJ1ZSxcbiAgICB9LFxuICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAvLyBmb3IgbGludGVyIGZpeFxuICAgICAgY29udGVudHM6ICd3cml0ZScsXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICB0ZXN0OiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvdGVzdC55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIHJlbGVhc2U6IHtcbiAgICBuYW1lOiAnUmVsZWFzZScsXG4gICAgb246IHtcbiAgICAgIHB1c2g6IHtcbiAgICAgICAgYnJhbmNoZXM6IFtdLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0nLFxuICAgICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IGZhbHNlLFxuICAgIH0sXG4gICAgcGVybWlzc2lvbnM6IHtcbiAgICAgIC8vIGh0dHBzOi8vZG9jcy5ucG1qcy5jb20vdHJ1c3RlZC1wdWJsaXNoZXJzI3N0ZXAtMi1jb25maWd1cmUteW91ci1jaWNkLXdvcmtmbG93XG4gICAgICAnaWQtdG9rZW4nOiAnd3JpdGUnLFxuICAgICAgLy8gZm9yIHNlbWFudGljLXJlbGVhc2VcbiAgICAgIGNvbnRlbnRzOiAnd3JpdGUnLFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgcmVsZWFzZToge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3JlbGVhc2UueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAnc2VtYW50aWMtcHInOiB7XG4gICAgbmFtZTogJ0xpbnQgUFIgdGl0bGUnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3RfdGFyZ2V0OiB7XG4gICAgICAgIHR5cGVzOiBbJ29wZW5lZCcsICdlZGl0ZWQnLCAnc3luY2hyb25pemUnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnc2VtYW50aWMtcHInOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3Mvc2VtYW50aWMtcHIueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICBzeW5jOiB7XG4gICAgbmFtZTogJ1N5bmMnLFxuICAgIG9uOiB7fSxcbiAgICBwZXJtaXNzaW9uczoge1xuICAgICAgLy8gZm9yIGNvbW1pdGluZyBjaGFuZ2VzXG4gICAgICBjb250ZW50czogJ3dyaXRlJyxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgIHN5bmM6IHsgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9zeW5jLnltbEBtYWluJyB9LFxuICAgIH0sXG4gIH0sXG4gICdjbG9zZS1jb21tZW50Jzoge1xuICAgIG5hbWU6ICdBZGQgY2xvc2UgY29tbWVudCcsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdDoge1xuICAgICAgICB0eXBlczogWydvcGVuZWQnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnY2xvc2UtY29tbWVudCc6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9jbG9zZS1jb21tZW50LnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ2dlbi1wci1jbGF1ZGUnOiB7XG4gICAgbmFtZTogJ0dlbmVyYXRlIFBSIHdpdGggQ2xhdWRlIENvZGUnLFxuICAgIG9uOiB7XG4gICAgICBpc3N1ZXM6IHtcbiAgICAgICAgdHlwZXM6IFsnbGFiZWxlZCddLFxuICAgICAgfSxcbiAgICAgIHB1bGxfcmVxdWVzdDoge1xuICAgICAgICB0eXBlczogWydsYWJlbGVkJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ2dlbi1wcic6IHtcbiAgICAgICAgaWY6IFwiY29udGFpbnMoZ2l0aHViLmV2ZW50LmxhYmVsLm5hbWUsICdnZW4tcHItYWxsJykgfHwgY29udGFpbnMoZ2l0aHViLmV2ZW50LmxhYmVsLm5hbWUsICdnZW4tcHItY2xhdWRlJylcIixcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9nZW4tcHIueW1sQG1haW4nLFxuICAgICAgICB3aXRoOiB7XG4gICAgICAgICAgJ2NvZGluZy10b29sJzogJ2NsYXVkZS1jb2RlJyxcbiAgICAgICAgICAnaXNzdWUtbnVtYmVyJzogJyR7eyBnaXRodWIuZXZlbnQuaXNzdWUubnVtYmVyIHx8IGdpdGh1Yi5ldmVudC5udW1iZXIgfX0nLFxuICAgICAgICAgICd0ZXN0LWNvbW1hbmQnOiAneWFybnxidW4gY2hlY2stYWxsLWZvci1haScsXG4gICAgICAgIH0sXG4gICAgICAgIHNlY3JldHM6IHtcbiAgICAgICAgICBDTEFVREVfQ09ERV9PQVVUSF9UT0tFTjogJyR7eyBzZWNyZXRzLkNMQVVERV9DT0RFX09BVVRIX1RPS0VOIH19JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ2dlbi1wci1jb2RleCc6IHtcbiAgICBuYW1lOiAnR2VuZXJhdGUgUFIgd2l0aCBDb2RleCBDTEknLFxuICAgIG9uOiB7XG4gICAgICBpc3N1ZXM6IHtcbiAgICAgICAgdHlwZXM6IFsnbGFiZWxlZCddLFxuICAgICAgfSxcbiAgICAgIHB1bGxfcmVxdWVzdDoge1xuICAgICAgICB0eXBlczogWydsYWJlbGVkJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ2dlbi1wcic6IHtcbiAgICAgICAgaWY6IFwiY29udGFpbnMoZ2l0aHViLmV2ZW50LmxhYmVsLm5hbWUsICdnZW4tcHItYWxsJykgfHwgY29udGFpbnMoZ2l0aHViLmV2ZW50LmxhYmVsLm5hbWUsICdnZW4tcHItY29kZXgnKVwiLFxuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL2dlbi1wci55bWxAbWFpbicsXG4gICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAnY29kaW5nLXRvb2wnOiAnY29kZXgtY2xpJyxcbiAgICAgICAgICAnaXNzdWUtbnVtYmVyJzogJyR7eyBnaXRodWIuZXZlbnQuaXNzdWUubnVtYmVyIHx8IGdpdGh1Yi5ldmVudC5udW1iZXIgfX0nLFxuICAgICAgICAgICd0ZXN0LWNvbW1hbmQnOiAneWFybnxidW4gY2hlY2stYWxsLWZvci1haScsXG4gICAgICAgIH0sXG4gICAgICAgIHNlY3JldHM6IHtcbiAgICAgICAgICBPUEVOQUlfQVBJX0tFWTogJyR7eyBzZWNyZXRzLk9QRU5BSV9BUElfS0VZIH19JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ2dlbi1wci1nZW1pbmknOiB7XG4gICAgbmFtZTogJ0dlbmVyYXRlIFBSIHdpdGggR2VtaW5pIENMSScsXG4gICAgb246IHtcbiAgICAgIGlzc3Vlczoge1xuICAgICAgICB0eXBlczogWydsYWJlbGVkJ10sXG4gICAgICB9LFxuICAgICAgcHVsbF9yZXF1ZXN0OiB7XG4gICAgICAgIHR5cGVzOiBbJ2xhYmVsZWQnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnZ2VuLXByJzoge1xuICAgICAgICBpZjogXCJjb250YWlucyhnaXRodWIuZXZlbnQubGFiZWwubmFtZSwgJ2dlbi1wci1hbGwnKSB8fCBjb250YWlucyhnaXRodWIuZXZlbnQubGFiZWwubmFtZSwgJ2dlbi1wci1nZW1pbmknKVwiLFxuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL2dlbi1wci55bWxAbWFpbicsXG4gICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAnY29kaW5nLXRvb2wnOiAnZ2VtaW5pLWNsaScsXG4gICAgICAgICAgJ2lzc3VlLW51bWJlcic6ICcke3sgZ2l0aHViLmV2ZW50Lmlzc3VlLm51bWJlciB8fCBnaXRodWIuZXZlbnQubnVtYmVyIH19JyxcbiAgICAgICAgICAndGVzdC1jb21tYW5kJzogJ3lhcm58YnVuIGNoZWNrLWFsbC1mb3ItYWknLFxuICAgICAgICB9LFxuICAgICAgICBzZWNyZXRzOiB7XG4gICAgICAgICAgR0VNSU5JX0FQSV9LRVk6ICcke3sgc2VjcmV0cy5HRU1JTklfQVBJX0tFWSB9fScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG59IGFzIGNvbnN0O1xuXG50eXBlIEtub3duS2luZCA9IGtleW9mIHR5cGVvZiB3b3JrZmxvd3MgfCAnZGVwbG95JyB8ICdhdXRvZml4JztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlV29ya2Zsb3dzKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVdvcmtmbG93JywgYXN5bmMgKCkgPT4ge1xuICAgIGlmIChpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyhyb290Q29uZmlnLnJlcG9zaXRvcnkpKSB7XG4gICAgICAvLyBEb24ndCB0b3VjaCByZXVzYWJsZS13b3JrZmxvd3MgcmVwbyBiZWNhdXNlIGl0IGhvc3RzIHVwc3RyZWFtIHdvcmtmbG93IGRlZmluaXRpb25zLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHdvcmtmbG93c1BhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicsICd3b3JrZmxvd3MnKTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2Rpcih3b3JrZmxvd3NQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIC8vIFJlbW92ZSBjb25maWcgb2Ygc2VtYW50aWMgcHVsbCByZXF1ZXN0XG4gICAgY29uc3Qgc2VtYW50aWNZbWxQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5naXRodWInLCAnc2VtYW50aWMueW1sJyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHNlbWFudGljWW1sUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pKTtcblxuICAgIGNvbnN0IGVudHJpZXMgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKHdvcmtmbG93c1BhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICBjb25zdCBmaWxlTmFtZVNldCA9IG5ldyBTZXQoW1xuICAgICAgJ3Rlc3QueW1sJyxcbiAgICAgICdhdXRvZml4LnltbCcsXG4gICAgICAnc2VtYW50aWMtcHIueW1sJyxcbiAgICAgICdjbG9zZS1jb21tZW50LnltbCcsXG4gICAgICAnZ2VuLXByLWNsYXVkZS55bWwnLFxuICAgICAgJ2dlbi1wci1jb2RleC55bWwnLFxuICAgICAgJ2dlbi1wci1nZW1pbmkueW1sJyxcbiAgICAgIC4uLmVudHJpZXMuZmlsdGVyKChkaXJlbnQpID0+IGRpcmVudC5pc0ZpbGUoKSAmJiBkaXJlbnQubmFtZS5lbmRzV2l0aCgnLnltbCcpKS5tYXAoKGRpcmVudCkgPT4gZGlyZW50Lm5hbWUpLFxuICAgIF0pO1xuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5zZW1hbnRpY1JlbGVhc2UpIHtcbiAgICAgIGZpbGVOYW1lU2V0LmFkZCgncmVsZWFzZS55bWwnKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGZpbGVOYW1lIG9mIGZpbGVOYW1lU2V0KSB7XG4gICAgICAvLyDlrp/pmpvjga9Lbm93bktpbmTku6XlpJbjga7lgKTjgoLku6PlhaXjgZXjgozjgovjgZPjgajjgavms6jmhI9cbiAgICAgIGNvbnN0IGtpbmQgPSBwYXRoLmJhc2VuYW1lKGZpbGVOYW1lLCAnLnltbCcpIGFzIEtub3duS2luZDtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiB3cml0ZVdvcmtmbG93WWFtbChyb290Q29uZmlnLCB3b3JrZmxvd3NQYXRoLCBraW5kKSk7XG4gICAgfVxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHJlcG9zaXRvcnk/OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHJlcG9zaXRvcnk/LmVuZHNXaXRoKCcvcmV1c2FibGUtd29ya2Zsb3dzJykgPz8gZmFsc2U7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlV29ya2Zsb3dZYW1sKGNvbmZpZzogUGFja2FnZUNvbmZpZywgd29ya2Zsb3dzUGF0aDogc3RyaW5nLCBraW5kOiBLbm93bktpbmQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgYCR7a2luZH0ueW1sYCk7XG4gIGNvbnN0IGRlcGxveVByb2R1Y3Rpb25Xb3JrZmxvd0V4aXN0cyA9IGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsICdkZXBsb3ktcHJvZHVjdGlvbi55bWwnKSk7XG5cbiAgaWYgKGtpbmQgPT09ICdhdXRvZml4Jykge1xuICAgIGF3YWl0IHdyaXRlWWFtbChnZW5lcmF0ZUF1dG9maXhXb3JrZmxvdyhjb25maWcpLCBmaWxlUGF0aCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGV0IG5ld1NldHRpbmdzID0gY2xvbmVEZWVwKGtpbmQgaW4gd29ya2Zsb3dzID8gd29ya2Zsb3dzW2tpbmQgYXMga2V5b2YgdHlwZW9mIHdvcmtmbG93c10gOiB7fSkgYXMgV29ya2Zsb3c7XG4gIC8vIFNraXAgYSBicm9rZW4gd29ya2Zsb3dcbiAgaWYgKCEoJ2pvYnMnIGluIG5ld1NldHRpbmdzKSkgcmV0dXJuO1xuXG4gIHRyeSB7XG4gICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgIGNvbnN0IG9sZFNldHRpbmdzID0geWFtbC5sb2FkKG9sZENvbnRlbnQpIGFzIFdvcmtmbG93O1xuICAgIG5ld1NldHRpbmdzID0gbWVyZ2UuYWxsKFtuZXdTZXR0aW5ncywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzXSwgeyBhcnJheU1lcmdlOiBjb21iaW5lTWVyZ2UgfSkgYXMgV29ya2Zsb3c7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxuXG4gIGlmIChraW5kLnN0YXJ0c1dpdGgoJ2RlcGxveScpKSB7XG4gICAgbmV3U2V0dGluZ3MgPSB7XG4gICAgICAuLi5uZXdTZXR0aW5ncyxcbiAgICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fScsXG4gICAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgfTtcbiAgICAvLyBNb3ZlIGpvYnMgdG8gdGhlIGJvdHRvbVxuICAgIG1vdmVUb0JvdHRvbShuZXdTZXR0aW5ncywgJ2pvYnMnKTtcbiAgICBpZiAobmV3U2V0dGluZ3Mub24/LnB1c2gpIHtcbiAgICAgIG5ld1NldHRpbmdzLm9uLnB1c2hbJ3BhdGhzLWlnbm9yZSddID0gW1xuICAgICAgICAuLi5uZXcgU2V0KFsnKioubWQnLCAnKiovZG9jcy8qKicsIC4uLihuZXdTZXR0aW5ncy5vbi5wdXNoWydwYXRocy1pZ25vcmUnXSA/PyBbXSldKSxcbiAgICAgIF07XG4gICAgfVxuICB9XG5cbiAgaWYgKGtpbmQgPT09ICdyZWxlYXNlJyAmJiBuZXdTZXR0aW5ncy5qb2JzLnJlbGVhc2UgJiYgZGVwbG95UHJvZHVjdGlvbldvcmtmbG93RXhpc3RzKSB7XG4gICAgbmV3U2V0dGluZ3MucGVybWlzc2lvbnMgPz89IHt9O1xuICAgIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zLmFjdGlvbnMgPSAnd3JpdGUnO1xuICAgIG5ld1NldHRpbmdzLmpvYnMucmVsZWFzZS53aXRoID8/PSB7fTtcbiAgICBuZXdTZXR0aW5ncy5qb2JzLnJlbGVhc2Uud2l0aC50cmlnZ2VyX2RlcGxveV93b3JrZmxvdyA9ICdkZXBsb3ktcHJvZHVjdGlvbi55bWwnO1xuICB9XG5cbiAgbGV0IGlzUmV1c2FibGVXb3JrZmxvdyA9IGZhbHNlO1xuICBmb3IgKGNvbnN0IGpvYiBvZiBPYmplY3QudmFsdWVzKG5ld1NldHRpbmdzLmpvYnMpKSB7XG4gICAgLy8gSWdub3JlIG5vbi1yZXVzYWJsZSB3b3JrZmxvd3NcbiAgICBpZiAoIWpvYi51c2VzPy5pbmNsdWRlcygnL3JldXNhYmxlLXdvcmtmbG93cy8nKSkgY29udGludWU7XG5cbiAgICBub3JtYWxpemVKb2IoY29uZmlnLCBqb2IsIGtpbmQpO1xuICAgIGlzUmV1c2FibGVXb3JrZmxvdyA9IHRydWU7XG4gIH1cbiAgaWYgKCFpc1JldXNhYmxlV29ya2Zsb3cpIHJldHVybjtcblxuICBzd2l0Y2ggKGtpbmQpIHtcbiAgICBjYXNlICdyZWxlYXNlJzoge1xuICAgICAgaWYgKG5ld1NldHRpbmdzLm9uPy5zY2hlZHVsZSkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3Mub24ucHVzaDtcbiAgICAgIH0gZWxzZSBpZiAobmV3U2V0dGluZ3Mub24/LnB1c2ggJiYgY29uZmlnLnJlbGVhc2UuYnJhbmNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBuZXdTZXR0aW5ncy5vbi5wdXNoLmJyYW5jaGVzID0gY29uZmlnLnJlbGVhc2UuYnJhbmNoZXM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBEb24ndCB1c2UgcmVsZWFzZS55bWwgaWYgcmVsZWFzZSBicmFuY2ggaXMgbm90IHNwZWNpZmllZFxuICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgJ3JlbGVhc2UueW1sJyksIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuaXNQdWJsaWNSZXBvKSB7XG4gICAgICAgIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zID8/PSB7fTtcbiAgICAgICAgbmV3U2V0dGluZ3MucGVybWlzc2lvbnNbJ2lkLXRva2VuJ10gPSAnd3JpdGUnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zPy5bJ2lkLXRva2VuJ107XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSAndGVzdCc6IHtcbiAgICAgIC8vIERvbid0IHVzZSBgcGF0aHMtaWdub3JlYCBmb3IgdGVzdCBiZWNhdXNlIEdpdEh1YidzIEJyYW5jaCBQcm90ZWN0aW9uIGFuZCBSdWxlc2V0cyByZXF1aXJlIGpvYiBydW5uaW5nLlxuICAgICAgaWYgKG5ld1NldHRpbmdzLm9uPy5wdWxsX3JlcXVlc3QpIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLm9uLnB1bGxfcmVxdWVzdFsncGF0aHMtaWdub3JlJ107XG4gICAgICB9XG4gICAgICBpZiAobmV3U2V0dGluZ3Mub24/LnB1c2gpIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLm9uLnB1c2hbJ3BhdGhzLWlnbm9yZSddO1xuICAgICAgICBuZXdTZXR0aW5ncy5vbi5wdXNoLmJyYW5jaGVzID0gbmV3U2V0dGluZ3Mub24ucHVzaC5icmFuY2hlcy5maWx0ZXIoKGJyYW5jaCkgPT4gYnJhbmNoICE9PSAncmVub3ZhdGUvKionKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICAvLyBObyBkZWZhdWx0XG4gIH1cbiAgYXdhaXQgd3JpdGVZYW1sKG5ld1NldHRpbmdzLCBmaWxlUGF0aCk7XG5cbiAgaWYgKGtpbmQgPT09ICdzeW5jJykge1xuICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAnc3luYy1pbml0LnltbCcpLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgIGlmICghbmV3U2V0dGluZ3Muam9icy5zeW5jPy53aXRoKSByZXR1cm47XG5cbiAgICAvLyBHZW5lcmF0ZSBzeW5jLWZvcmNlLnltbCBiYXNlZCBvbiBzeW5jLnltbCBpZiBpdCBleGlzdHMuXG4gICAgbmV3U2V0dGluZ3Muam9ic1snc3luYy1mb3JjZSddID0gbmV3U2V0dGluZ3Muam9icy5zeW5jO1xuICAgIGNvbnN0IHBhcmFtcyA9IG5ld1NldHRpbmdzLmpvYnMuc3luYy53aXRoLnN5bmNfcGFyYW1zX3dpdGhvdXRfZGVzdDtcbiAgICBpZiAodHlwZW9mIHBhcmFtcyAhPT0gJ3N0cmluZycpIHJldHVybjtcblxuICAgIG5ld1NldHRpbmdzLmpvYnMuc3luYy53aXRoLnN5bmNfcGFyYW1zX3dpdGhvdXRfZGVzdCA9IGAtLWZvcmNlICR7cGFyYW1zfWA7XG4gICAgbmV3U2V0dGluZ3MubmFtZSA9ICdGb3JjZSB0byBTeW5jJztcbiAgICBuZXdTZXR0aW5ncy5vbiA9IHsgd29ya2Zsb3dfZGlzcGF0Y2g6IG51bGwgfTtcbiAgICBkZWxldGUgbmV3U2V0dGluZ3Muam9icy5zeW5jO1xuICAgIGF3YWl0IHdyaXRlWWFtbChuZXdTZXR0aW5ncywgcGF0aC5qb2luKHdvcmtmbG93c1BhdGgsICdzeW5jLWZvcmNlLnltbCcpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVKb2IoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBqb2I6IEpvYiwga2luZDogS25vd25LaW5kKTogdm9pZCB7XG4gIGpvYi53aXRoID8/PSB7fTtcbiAgam9iLnNlY3JldHMgPz89IHt9O1xuICAvLyBVc2UgdHJ1c3RlZCBwdWJsaXNoaW5nIGluc3RlYWQgb2YgTlBNX1RPS0VOXG4gIGRlbGV0ZSBqb2Iuc2VjcmV0cy5OUE1fVE9LRU47XG5cbiAgaWYgKFxuICAgIGtpbmQgPT09ICd0ZXN0JyB8fFxuICAgIGtpbmQgPT09ICdyZWxlYXNlJyB8fFxuICAgIGtpbmQgPT09ICdnZW4tcHItY2xhdWRlJyB8fFxuICAgIGtpbmQgPT09ICdnZW4tcHItY29kZXgnIHx8XG4gICAga2luZCA9PT0gJ2dlbi1wci1nZW1pbmknXG4gICkge1xuICAgIGpvYi5zZWNyZXRzLkdIX1RPS0VOID0gJyR7eyBzZWNyZXRzLkdJVEhVQl9UT0tFTiB9fSc7XG4gIH1cblxuICAvLyBTZXQgdGVzdC1jb21tYW5kIGZvciBnZW4tcHIgd29ya2Zsb3dzIGJhc2VkIG9uIHBhY2thZ2UgbWFuYWdlclxuICBpZiAoa2luZCA9PT0gJ2dlbi1wci1jbGF1ZGUnIHx8IGtpbmQgPT09ICdnZW4tcHItY29kZXgnIHx8IGtpbmQgPT09ICdnZW4tcHItZ2VtaW5pJykge1xuICAgIGpvYi53aXRoWyd0ZXN0LWNvbW1hbmQnXSA9IGNvbmZpZy5pc0J1biA/ICdidW4gcnVuIGNoZWNrLWFsbC1mb3ItYWknIDogJ3lhcm4gY2hlY2stYWxsLWZvci1haSc7XG4gIH1cbiAgaWYgKGpvYi5zZWNyZXRzLkZJUkVCQVNFX1RPS0VOKSB7XG4gICAgam9iLnNlY3JldHMuR0NQX1NBX0tFWV9KU09OX0ZPUl9GSVJFQkFTRSA9ICcke3sgc2VjcmV0cy5HQ1BfU0FfS0VZX0pTT05fRk9SX0ZJUkVCQVNFIH19JztcbiAgICBkZWxldGUgam9iLnNlY3JldHMuRklSRUJBU0VfVE9LRU47XG4gIH1cbiAgaWYgKFxuICAgIChqb2Iuc2VjcmV0cy5ESVNDT1JEX1dFQkhPT0tfVVJMICYmIChraW5kID09PSAncmVsZWFzZScgfHwga2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSkpIHx8XG4gICAgKGpvYi53aXRoLnNlcnZlcl91cmwgJiYga2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSlcbiAgKSB7XG4gICAgam9iLnNlY3JldHMuRElTQ09SRF9XRUJIT09LX1VSTCA9ICcke3sgc2VjcmV0cy5ESVNDT1JEX1dFQkhPT0tfVVJMX0ZPUl9SRUxFQVNFIH19JztcbiAgfVxuXG4gIGlmIChraW5kID09PSAnc3luYycpIHtcbiAgICBjb25zdCBwYXJhbXMgPSBqb2Iud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3Q7XG4gICAgaWYgKHR5cGVvZiBwYXJhbXMgPT09ICdzdHJpbmcnKSB7XG4gICAgICBqb2Iud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3QgPSBwYXJhbXMucmVwbGFjZSgnc3luYyAnLCAnJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXIvJykpIHtcbiAgICBqb2IudXNlcyA9IGpvYi51c2VzPy5yZXBsYWNlKCdXaWxsQm9vc3RlckxhYi8nLCAnV2lsbEJvb3N0ZXIvJyk7XG4gIH0gZWxzZSBpZiAoY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKSkge1xuICAgIGpvYi51c2VzID0gam9iLnVzZXM/LnJlcGxhY2UoJ1dpbGxCb29zdGVyLycsICdXaWxsQm9vc3RlckxhYi8nKTtcbiAgfVxuXG4gIC8vIFJlbW92ZSByZWR1bmRhbnQgcGFyYW1ldGVyc1xuICBpZiAoam9iLndpdGguZG90X2Vudl9wYXRoID09PSAnLmVudicpIHtcbiAgICBkZWxldGUgam9iLndpdGguZG90X2Vudl9wYXRoO1xuICB9XG5cbiAgLy8gRG9uJ3QgdXNlIGBmbHkgZGVwbG95IC0tanNvbmAgc2luY2UgaXQgY2F1c2VzIGFuIGVycm9yXG4gIGlmIChraW5kLnN0YXJ0c1dpdGgoJ2RlcGxveScpICYmIGpvYi5zZWNyZXRzLkZMWV9BUElfVE9LRU4gJiYgdHlwZW9mIGpvYi53aXRoLmRlcGxveV9jb21tYW5kID09PSAnc3RyaW5nJykge1xuICAgIGpvYi53aXRoLmRlcGxveV9jb21tYW5kID0gam9iLndpdGguZGVwbG95X2NvbW1hbmQucmVwbGFjZSgvXFxzKy0tanNvbi8sICcnKTtcbiAgfVxuICBpZiAoY29uZmlnLmRvZXNDb250YWluRG9ja2VyZmlsZSAmJiAham9iLndpdGguY2lfbGFiZWwgJiYga2luZC5zdGFydHNXaXRoKCd0ZXN0JykpIHtcbiAgICBqb2Iud2l0aC5jaV9sYWJlbCA9ICdsYXJnZSc7XG4gIH1cbiAgLy8gQmVjYXVzZSBnaXRodWIuZXZlbnQucmVwb3NpdG9yeS5wcml2YXRlIGlzIGFsd2F5cyB0cnVlIGlmIGpvYiBpcyBzY2hlZHVsZWRcbiAgaWYgKGtpbmQgPT09ICdyZWxlYXNlJyB8fCBraW5kID09PSAndGVzdCcgfHwga2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSkge1xuICAgIGlmIChjb25maWcuaXNQdWJsaWNSZXBvKSB7XG4gICAgICBqb2Iud2l0aC5naXRodWJfaG9zdGVkX3J1bm5lciA9IHRydWU7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGRlbGV0ZSBqb2Iud2l0aC5naXRodWJfaG9zdGVkX3J1bm5lcjtcbiAgfVxuXG4gIGlmIChPYmplY3Qua2V5cyhqb2Iud2l0aCkubGVuZ3RoID4gMCkge1xuICAgIHNvcnRLZXlzKGpvYi53aXRoKTtcbiAgfSBlbHNlIHtcbiAgICBkZWxldGUgam9iLndpdGg7XG4gIH1cbiAgaWYgKE9iamVjdC5rZXlzKGpvYi5zZWNyZXRzKS5sZW5ndGggPiAwKSB7XG4gICAgLy8gTW92ZSBzZWNyZXRzIHByb3AgYWZ0ZXIgd2l0aCBwcm9wXG4gICAgY29uc3QgbmV3U2VjcmV0cyA9IHNvcnRLZXlzKGpvYi5zZWNyZXRzKTtcbiAgICBkZWxldGUgam9iLnNlY3JldHM7XG4gICAgam9iLnNlY3JldHMgPSBuZXdTZWNyZXRzO1xuICB9IGVsc2Uge1xuICAgIGRlbGV0ZSBqb2Iuc2VjcmV0cztcbiAgfVxufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUF1dG9maXhXb3JrZmxvdyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBXb3JrZmxvdyB7XG4gIGlmICghY29uZmlnLmlzUHVibGljUmVwbykge1xuICAgIHJldHVybiBjbG9uZURlZXAocHJpdmF0ZVJlcG9BdXRvZml4V29ya2Zsb3cpO1xuICB9XG5cbiAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSBjb25maWcuaXNCdW4gPyAnYnVuJyA6ICd5YXJuJztcbiAgY29uc3Qgc3RlcHM6IFN0ZXBbXSA9IFtcbiAgICB7IHVzZXM6ICdhY3Rpb25zL2NoZWNrb3V0QHY2JyB9LFxuICAgIHsgdXNlczogJ2FjdGlvbnMvc2V0dXAtbm9kZUB2NicsIHdpdGg6IHsgJ2NoZWNrLWxhdGVzdCc6IHRydWUgfSB9LFxuICAgIC4uLihjb25maWcuaXNCdW4gPyBbeyB1c2VzOiAnb3Zlbi1zaC9zZXR1cC1idW5AdjEnLCB3aXRoOiB7ICdidW4tdmVyc2lvbic6ICdsYXRlc3QnIH0gfV0gOiBbXSksXG4gICAgeyBydW46IGAke3BhY2thZ2VNYW5hZ2VyfSBpbnN0YWxsYCB9LFxuICAgIHsgcnVuOiBgJHtwYWNrYWdlTWFuYWdlcn0gcnVuIGNsZWFudXBgIH0sXG4gIF07XG4gIGlmIChjb25maWcucGFja2FnZUpzb24/LnNjcmlwdHM/LmJ1aWxkKSB7XG4gICAgc3RlcHMucHVzaCh7IHJ1bjogYCR7cGFja2FnZU1hbmFnZXJ9IHJ1biBidWlsZGAgfSk7XG4gIH1cbiAgc3RlcHMucHVzaCh7IHVzZXM6ICdhdXRvZml4LWNpL2FjdGlvbkB2MScgfSk7XG5cbiAgY29uc3QgYXV0b2ZpeFdvcmtmbG93ID0gY2xvbmVEZWVwKHB1YmxpY1JlcG9BdXRvZml4V29ya2Zsb3cpO1xuICBjb25zdCBhdXRvZml4Sm9iID0gYXV0b2ZpeFdvcmtmbG93LmpvYnMuYXV0b2ZpeCA/PyB7ICdydW5zLW9uJzogJ3VidW50dS1sYXRlc3QnIH07XG4gIGF1dG9maXhXb3JrZmxvdy5qb2JzLmF1dG9maXggPSB7IC4uLmF1dG9maXhKb2IsIHN0ZXBzIH07XG4gIHJldHVybiBhdXRvZml4V29ya2Zsb3c7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlWWFtbChuZXdTZXR0aW5nczogV29ya2Zsb3csIGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeWFtbFRleHQgPSB5YW1sLmR1bXAobmV3U2V0dGluZ3MsIHsgbGluZVdpZHRoOiAtMSwgbm9Db21wYXRNb2RlOiB0cnVlLCBzdHlsZXM6IHsgJyEhbnVsbCc6ICdlbXB0eScgfSB9KTtcbiAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGZpbGVQYXRoLCB5YW1sVGV4dCk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcblxuaW1wb3J0IHsgaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8gfSBmcm9tICcuLi9nZW5lcmF0b3JzL3dvcmtmbG93LmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBnbG9iSWdub3JlIH0gZnJvbSAnLi4vdXRpbHMvZ2xvYlV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhUeXBvcyhwYWNrYWdlQ29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4VHlwb3MnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHBhY2thZ2VDb25maWcucmVwb3NpdG9yeSkpIHJldHVybjtcblxuICAgIGNvbnN0IGRpclBhdGggPSBwYWNrYWdlQ29uZmlnLmRpclBhdGg7XG4gICAgY29uc3QgZG9jRmlsZXMgPSBhd2FpdCBmZy5nbG9iKCcqKi8qLm1kJywgeyBkb3Q6IHRydWUsIGN3ZDogZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH0pO1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBGb3VuZCAke2RvY0ZpbGVzLmxlbmd0aH0gbWFya2Rvd24gZmlsZXMgaW4gJHtkaXJQYXRofWApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IG1kRmlsZSBvZiBkb2NGaWxlcykge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgbWRGaWxlKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bihhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgICAgbGV0IG5ld0NvbnRlbnQgPSBmaXhUeXBvc0luVGV4dChjb250ZW50KTtcbiAgICAgICAgbmV3Q29udGVudCA9IHJlcGxhY2VXaXRoQ29uZmlnKG5ld0NvbnRlbnQsIHBhY2thZ2VDb25maWcsICdkb2MnKTtcbiAgICAgICAgaWYgKGNvbnRlbnQgIT09IG5ld0NvbnRlbnQpIHtcbiAgICAgICAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgdHNGaWxlcyA9IGF3YWl0IGZnLmdsb2IoXG4gICAgICBbXG4gICAgICAgICd7YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4LGN0cyxtdHMsdHMsdHN4fScsXG4gICAgICAgICdwYWNrYWdlcy8qKi97YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4LGN0cyxtdHMsdHMsdHN4fScsXG4gICAgICBdLFxuICAgICAgeyBkb3Q6IHRydWUsIGN3ZDogZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH1cbiAgICApO1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBGb3VuZCAke3RzRmlsZXMubGVuZ3RofSBUeXBlU2NyaXB0IGZpbGVzIGluICR7ZGlyUGF0aH1gKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCB0c0ZpbGUgb2YgdHNGaWxlcykge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgdHNGaWxlKTtcbiAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGxldCBuZXdDb250ZW50ID0gZml4VHlwb3NJbkNvZGUob2xkQ29udGVudCk7XG4gICAgICBuZXdDb250ZW50ID0gcmVwbGFjZVdpdGhDb25maWcobmV3Q29udGVudCwgcGFja2FnZUNvbmZpZywgJ3RzJyk7XG5cbiAgICAgIGlmIChvbGRDb250ZW50ID09PSBuZXdDb250ZW50KSBjb250aW51ZTtcbiAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgIH1cblxuICAgIGNvbnN0IHRleHRCYXNlZEZpbGVzID0gYXdhaXQgZmcuZ2xvYignKiovKi57Y3N2LGh0bSxodG1sLHRzdix4bWwseWFtbCx5bWx9Jywge1xuICAgICAgZG90OiB0cnVlLFxuICAgICAgY3dkOiBkaXJQYXRoLFxuICAgICAgaWdub3JlOiBnbG9iSWdub3JlLFxuICAgIH0pO1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBGb3VuZCAke3RleHRCYXNlZEZpbGVzLmxlbmd0aH0gdGV4dC1iYXNlZCBmaWxlcyBpbiAke2RpclBhdGh9YCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgZmlsZSBvZiB0ZXh0QmFzZWRGaWxlcykge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgZmlsZSk7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBsZXQgbmV3Q29udGVudCA9IGZpeFR5cG9zSW5UZXh0KG9sZENvbnRlbnQpO1xuICAgICAgbmV3Q29udGVudCA9IHJlcGxhY2VXaXRoQ29uZmlnKG5ld0NvbnRlbnQsIHBhY2thZ2VDb25maWcsICd0ZXh0Jyk7XG5cbiAgICAgIGlmIChvbGRDb250ZW50ID09PSBuZXdDb250ZW50KSBjb250aW51ZTtcbiAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgIH1cblxuICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaXhUeXBvc0luVGV4dChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gY29udGVudFxuICAgIC5yZXBsYWNlQWxsKC9cXGJjXFwuZlxcLihbXiRdKS9nLCAnY2YuJDEnKVxuICAgIC5yZXBsYWNlQWxsKC9cXGJlZ1xcLihbXiRdKS9nLCAnZS5nLiQxJylcbiAgICAucmVwbGFjZUFsbCgvXFxiaWVcXC4oW14kXSkvZywgJ2kuZS4kMScpO1xufVxuXG5mdW5jdGlvbiBmaXhUeXBvc0luQ29kZShjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gY29udGVudFxuICAgIC5yZXBsYWNlQWxsKC9cXC9cXC8oLiopY1xcLmZcXC4vZywgJy8vJDFjZi4nKVxuICAgIC5yZXBsYWNlQWxsKC9cXC9cXC8oLiopZWdcXC4vZywgJy8vJDFlLmcuJylcbiAgICAucmVwbGFjZUFsbCgvXFwvXFwvKC4qKWllXFwuL2csICcvLyQxaS5lLicpO1xufVxuXG5mdW5jdGlvbiByZXBsYWNlV2l0aENvbmZpZyhuZXdDb250ZW50OiBzdHJpbmcsIHBhY2thZ2VDb25maWc6IFBhY2thZ2VDb25maWcsIHByb3BOYW1lOiAnZG9jJyB8ICd0cycgfCAndGV4dCcpOiBzdHJpbmcge1xuICBmb3IgKGNvbnN0IFtiZWZvcmUsIGFmdGVyXSBvZiBPYmplY3QuZW50cmllcyhwYWNrYWdlQ29uZmlnLndiZnlKc29uPy50eXBvcz8uYWxsID8/IHt9KSkge1xuICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2VBbGwoYmVmb3JlLCBhZnRlcik7XG4gIH1cbiAgZm9yIChjb25zdCBbYmVmb3JlLCBhZnRlcl0gb2YgT2JqZWN0LmVudHJpZXMocGFja2FnZUNvbmZpZy53YmZ5SnNvbj8udHlwb3M/Lltwcm9wTmFtZV0gPz8ge30pKSB7XG4gICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZUFsbChiZWZvcmUsIGFmdGVyKTtcbiAgfVxuICByZXR1cm4gbmV3Q29udGVudDtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbnMocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZywgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIXJvb3RDb25maWcuaXNSb290KSByZXR1cm47XG5cbiAgICAvLyBDaGVjayBpZiBBR0VOVFNfRVhUUkEubWQgZXhpc3RzIGFuZCByZWFkIGl0cyBjb250ZW50XG4gICAgY29uc3QgYWdlbnRzRXh0cmFQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJ0FHRU5UU19FWFRSQS5tZCcpO1xuICAgIGNvbnN0IGV4dHJhQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoYWdlbnRzRXh0cmFQYXRoKTtcblxuICAgIGZvciAoY29uc3QgW2ZpbGVOYW1lLCB0b29sTmFtZV0gb2YgW1xuICAgICAgWydBR0VOVFMubWQnLCAnQ29kZXggQ0xJJ10sXG4gICAgICBbJ0NMQVVERS5tZCcsICdDbGF1ZGUgQ29kZSddLFxuICAgICAgWydHRU1JTkkubWQnLCAnR2VtaW5pIENMSSddLFxuICAgIF0gYXMgY29uc3QpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb24ocm9vdENvbmZpZywgYWxsQ29uZmlncywgdG9vbE5hbWUsIGV4dHJhQ29udGVudCk7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsIGZpbGVOYW1lKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb250ZW50KSk7XG4gICAgfVxuXG4gICAgY29uc3QgY3Vyc29yUnVsZXNQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5jdXJzb3IvcnVsZXMvZ2VuZXJhbC5tZGMnKTtcbiAgICBjb25zdCBjdXJzb3JSdWxlc0NvbnRlbnQgPSBnZW5lcmF0ZUN1cnNvckdlbmVyYWxNZGNDb250ZW50KHJvb3RDb25maWcsIGFsbENvbmZpZ3MsIGV4dHJhQ29udGVudCk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoY3Vyc29yUnVsZXNQYXRoLCBjdXJzb3JSdWxlc0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbihcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdLFxuICB0b29sTmFtZTogc3RyaW5nLFxuICBleHRyYUNvbnRlbnQ/OiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gcm9vdENvbmZpZy5pc0J1biA/ICdidW4nIDogJ3lhcm4nO1xuICBjb25zdCBiYXNlQ29udGVudCA9IGBcbiMjIFByb2plY3QgSW5mb3JtYXRpb25cblxuLSBOYW1lOiBcXGAke3Jvb3RDb25maWcucGFja2FnZUpzb24/Lm5hbWUgfHwgJ3Vua25vd24nfVxcYFxuLSBEZXNjcmlwdGlvbjogJHtyb290Q29uZmlnLnBhY2thZ2VKc29uPy5kZXNjcmlwdGlvbn1cbi0gUGFja2FnZSBNYW5hZ2VyOiAke3BhY2thZ2VNYW5hZ2VyfVxuXG4jIyBHZW5lcmFsIEluc3RydWN0aW9uc1xuXG4tIENyZWF0ZSBhIG5ldyBicmFuY2ggaWYgdGhlIGN1cnJlbnQgYnJhbmNoIGlzIFxcYG1haW5cXGAuXG4tIFJ1biBhbnkgXFxgZ2l0XFxgIGNvbW1hbmRzIHNlcXVlbnRpYWxseS5cbi0gV3JpdGUgdGVzdHMgT05MWSBpZiBleHBsaWNpdGx5IHJlcXVlc3RlZC5cbiAgLSBNYWtlIHN1cmUgdG8gY29udGludWUgdG8gbW9kaWZ5IHRoZSB0ZXN0cyBhbmQgY29kZSB1bnRpbCB0aGUgdGVzdHMgcGFzcy5cbi0gV2hlbiB3cml0aW5nIHRlc3RzLCBlbnN1cmUgdGhleSByZXNldCBhbnkgcmVsYXRlZCBwZXJzaXN0ZW50IGRhdGEsIGFzIG91ciB0ZXN0IGluZnJhc3RydWN0dXJlIGRvZXMgbm90IGNsZWFyIGl0IGF1dG9tYXRpY2FsbHkuXG4tIEJlZm9yZSBmaXhpbmcgaXNzdWVzLCBhbHdheXMgaW52ZXN0aWdhdGUgdGhlIHJvb3QgY2F1c2UgZmlyc3QgKGUuZy4sIGJ5IGdhdGhlcmluZyBkZWJ1ZyBsb2dzLCB0YWtpbmcgc2NyZWVuc2hvdHMsIGV0Yy4pLlxuLSBBZnRlciBtYWtpbmcgY29kZSBjaGFuZ2VzLCBydW4gXFxgJHtwYWNrYWdlTWFuYWdlcn0gY2hlY2stYWxsLWZvci1haVxcYCB0byBleGVjdXRlIGFsbCB0ZXN0cyAodGFrZXMgdXAgdG8gMSBob3VyKSBvciBcXGAke3BhY2thZ2VNYW5hZ2VyfSBjaGVjay1mb3ItYWlcXGAgZm9yIHR5cGUgY2hlY2tpbmcgYW5kIGxpbnRpbmcgb25seSAodGFrZXMgdXAgdG8gMTAgbWludXRlcykuXG4gIC0gSWYgeW91IGFyZSBjb25maWRlbnQgeW91ciBjaGFuZ2VzIHdpbGwgbm90IGJyZWFrIGFueSB0ZXN0cywgeW91IG1heSB1c2UgXFxgY2hlY2stZm9yLWFpXFxgLlxuLSBPbmNlIHlvdSBoYXZlIHZlcmlmaWVkIHlvdXIgY2hhbmdlcywgY29tbWl0IGFuZCBwdXNoIHRoZW0gdG8gdGhlIGN1cnJlbnQgKG5vbi1tYWluKSBicmFuY2ggdGhlbiBjcmVhdGUgYSBQUiB2aWEgXFxgZ2hcXGAuXG4gIC0gRm9sbG93IHRoZSBjb252ZW50aW9uYWwgY29tbWl0czsgeW91ciBjb21taXQgbWVzc2FnZSBzaG91bGQgc3RhcnQgd2l0aCBcXGBmZWF0OlxcYCwgXFxgZml4OlxcYCwgZXRjLlxuICAtIElmIG5vdCBzcGVjaWZpZWQsIG1ha2Ugc3VyZSB0byBhZGQgYSBuZXcgbGluZSBhdCB0aGUgZW5kIG9mIHlvdXIgY29tbWl0IG1lc3NhZ2Uke3Jvb3RDb25maWcuaXNXaWxsQm9vc3RlclJlcG8gPyBgIHdpdGg6IFxcYENvLWF1dGhvcmVkLWJ5OiBXaWxsQm9vc3RlciAoJHt0b29sTmFtZX0pIDxhZ2VudEB3aWxsYm9vc3Rlci5jb20+XFxgYCA6ICcnfS5cbiAgLSBBbHdheXMgY3JlYXRlIG5ldyBjb21taXRzLiBBdm9pZCB1c2luZyBcXGAtLWFtZW5kXFxgLlxuJHtcbiAgYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmhhc1N0YXJ0VGVzdFNlcnZlcilcbiAgICA/IGAtIFVzZSBcXGAke3BhY2thZ2VNYW5hZ2VyfSBydW4gc3RhcnQtdGVzdC1zZXJ2ZXJcXGAgdG8gbGF1bmNoIGEgd2ViIHNlcnZlciBmb3IgZGVidWdnaW5nIG9yIHRlc3RpbmcuYFxuICAgIDogJydcbn1cblxuJHtnZW5lcmF0ZUFnZW50Q29kaW5nU3R5bGUoYWxsQ29uZmlncyl9XG5gXG4gICAgLnJlcGxhY2VBbGwoL1xcLlxcblxcbistL2csICcuXFxuLScpXG4gICAgLnJlcGxhY2VBbGwoL1xcbnszLH0vZywgJ1xcblxcbicpXG4gICAgLnRyaW0oKTtcblxuICBjb25zdCBoYXNOZXdTZWN0aW9uID0gZXh0cmFDb250ZW50Py50cmltKCkuc3RhcnRzV2l0aCgnIycpO1xuICBjb25zdCBub3JtYWxpemVkRXh0cmFDb250ZW50ID0gZXh0cmFDb250ZW50XG4gICAgPyBoYXNOZXdTZWN0aW9uXG4gICAgICA/ICdcXG5cXG4nICsgZXh0cmFDb250ZW50LnRyaW0oKVxuICAgICAgOiAnXFxuJyArIGV4dHJhQ29udGVudFxuICAgIDogJyc7XG4gIHJldHVybiBiYXNlQ29udGVudCArIG5vcm1hbGl6ZWRFeHRyYUNvbnRlbnQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUFnZW50Q29kaW5nU3R5bGUoYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBcbiMjIENvZGluZyBTdHlsZVxuXG4tIFNpbXBsaWZ5IGNvZGUgYXMgbXVjaCBhcyBwb3NzaWJsZSB0byBlbGltaW5hdGUgcmVkdW5kYW5jeS5cbi0gRGVzaWduIGVhY2ggbW9kdWxlIHdpdGggaGlnaCBjb2hlc2lvbiwgZ3JvdXBpbmcgcmVsYXRlZCBmdW5jdGlvbmFsaXR5IHRvZ2V0aGVyLlxuICAtIFJlZmFjdG9yIGV4aXN0aW5nIGxhcmdlIG1vZHVsZXMgaW50byBzbWFsbGVyLCBmb2N1c2VkIG1vZHVsZXMgd2hlbiBuZWNlc3NhcnkuXG4gIC0gQ3JlYXRlIHdlbGwtb3JnYW5pemVkIGRpcmVjdG9yeSBzdHJ1Y3R1cmVzIHdpdGggbG93IGNvdXBsaW5nIGFuZCBoaWdoIGNvaGVzaW9uLlxuLSBQbGFjZSBjYWxsaW5nIGZ1bmN0aW9ucyBvciBjbGFzc2VzIGluIHRoZSBmaWxlIGFib3ZlIHRoZSBmdW5jdGlvbnMgb3IgY2xhc3NlcyB0aGV5IGNhbGwgdG8gbWFpbnRhaW4gYSBjbGVhciB0b3AtZG93biBvcmRlci5cbiAgLSBlLmcuIFxcYGZ1bmN0aW9uIGNhbGxlcigpIHsgY2FsbGVlKCk7IH0gZnVuY3Rpb24gY2FsbGVlKCkgeyAuLi4gfVxcYFxuLSBXcml0ZSBjb21tZW50cyB0aGF0IGV4cGxhaW4gXCJ3aHlcIiByYXRoZXIgdGhhbiBcIndoYXRcIi4gQXZvaWQgc3RhdGluZyB3aGF0IGNhbiBiZSB1bmRlcnN0b29kIGZyb20gdGhlIGNvZGUgaXRzZWxmLlxuLSBQcmVmZXIgXFxgdW5kZWZpbmVkXFxgIG92ZXIgXFxgbnVsbFxcYCB1bmxlc3MgZXhwbGljaXRseSByZXF1aXJlZCBieSBBUElzIG9yIGxpYnJhcmllcy5cbi0gUHJlZmVyIHVzaW5nIGEgc2luZ2xlIHRlbXBsYXRlIGxpdGVyYWwgZm9yIHByb21wdHMgaW5zdGVhZCBvZiBcXGBqb2luKClcXGAgd2l0aCBhbiBhcnJheSBvZiBzdHJpbmdzLlxuJHtcbiAgYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRlcGVuZGluZy5nZW5JMThuVHMpXG4gICAgPyBgLSBXaGVuIGludHJvZHVjaW5nIG5ldyBzdHJpbmcgbGl0ZXJhbHMgaW4gUmVhY3QgY29tcG9uZW50cywgdXBkYXRlIHRoZSBsYW5ndWFnZSByZXNvdXJjZSBmaWxlcyBpbiB0aGUgXFxgaTE4blxcYCBkaXJlY3RvcnkgKGUuZy4sIFxcYGkxOG4vamEtSlAuanNvblxcYCkuIFJlZmVyZW5jZSB0aGVzZSBzdHJpbmdzIHVzaW5nIHRoZSBcXGBpMThuXFxgIHV0aWxpdHkuIEZvciBleGFtcGxlLCB1c2UgXFxgaTE4bi5wYWdlcy5ob21lLnRpdGxlKClcXGAgZm9yIFxcYHsgXCJwYWdlc1wiOiB7IFwiaG9tZVwiOiB7IFwidGl0bGVcIjogXCJNeSBBcHBcIiB9IH0gfVxcYC5gXG4gICAgOiAnJ1xufVxuJHtcbiAgYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRlcGVuZGluZy5yZWFjdCB8fCBjLmRlcGVuZGluZy5uZXh0KVxuICAgID8gYC0gUHJlZmVyIFxcYHVzZUltbWVyXFxgIGZvciBzdG9yaW5nIGFuIGFycmF5IG9yIGFuIG9iamVjdCB0byBcXGB1c2VTdGF0ZVxcYC5gXG4gICAgOiAnJ1xufVxuJHtcbiAgYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRlcGVuZGluZy5uZXh0KVxuICAgID8gYFxuLSBTaW5jZSB0aGlzIHByb2plY3QgdXNlcyB0aGUgUmVhY3QgQ29tcGlsZXIsIHlvdSBkbyBub3QgbmVlZCB0byB1c2UgXFxgdXNlQ2FsbGJhY2tcXGAgb3IgXFxgdXNlTWVtb1xcYCBmb3IgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uLlxuLSBBc3N1bWUgdGhlcmUgaXMgb25seSBhIHNpbmdsZSBzZXJ2ZXIgaW5zdGFuY2UuXG5gXG4gICAgOiAnJ1xufVxuYFxuICAgIC5yZXBsYWNlQWxsKC9cXC5cXG5cXG4rLS9nLCAnLlxcbi0nKVxuICAgIC5yZXBsYWNlQWxsKC9cXG57Myx9L2csICdcXG5cXG4nKVxuICAgIC50cmltKCk7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlQ3Vyc29yR2VuZXJhbE1kY0NvbnRlbnQoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdLFxuICBleHRyYUNvbnRlbnQ/OiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIGNvbnN0IGZyb250bWF0dGVyID0gYC0tLVxcbmRlc2NyaXB0aW9uOiBHZW5lcmFsIENvZGluZyBSdWxlc1xcbmdsb2JzOlxcbmFsd2F5c0FwcGx5OiB0cnVlXFxuLS0tYDtcbiAgY29uc3QgYm9keSA9IGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbihjb25maWcsIGFsbENvbmZpZ3MsICdDdXJzb3InLCBleHRyYUNvbnRlbnQpO1xuICByZXR1cm4gYCR7ZnJvbnRtYXR0ZXJ9XFxuXFxuJHtib2R5fWA7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVCaW9tZUpzb25jKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlQmlvbWVKc29uYycsIGFzeW5jICgpID0+IHtcbiAgICBsZXQgbmV3U2V0dGluZ3M6IG9iamVjdCA9IHtcbiAgICAgIHJvb3Q6IGNvbmZpZy5pc1Jvb3QsXG4gICAgICAkc2NoZW1hOiAnLi9ub2RlX21vZHVsZXMvQGJpb21lanMvYmlvbWUvY29uZmlndXJhdGlvbl9zY2hlbWEuanNvbicsXG4gICAgICBleHRlbmRzOiBbJ0B3aWxsYm9vc3Rlci9iaW9tZS1jb25maWcnXSxcbiAgICB9O1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnYmlvbWUuanNvbmMnKTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3Qgb2xkU2V0dGluZ3MgPSBKU09OLnBhcnNlKG9sZENvbnRlbnQpIGFzIG9iamVjdDtcbiAgICAgIG5ld1NldHRpbmdzID0gbWVyZ2UuYWxsKFtuZXdTZXR0aW5ncywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzXSwgeyBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KG5ld1NldHRpbmdzKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IHBhcnNlIH0gZnJvbSAnc21vbC10b21sJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5pbnRlcmZhY2UgQnVuZmlnVG9tbCB7XG4gIGluc3RhbGw/OiB7XG4gICAgZXhhY3Q/OiBib29sZWFuO1xuICB9O1xuICBydW4/OiB7XG4gICAgYnVuPzogYm9vbGVhbjtcbiAgfTtcbn1cblxuY29uc3QgbWluaW11bVJlbGVhc2VBZ2VFeGNsdWRlcyA9IFtcbiAgJ0BleGVyY29kZS9wcm9ibGVtLXV0aWxzJyxcbiAgJ0BuZXh0L2VudicsXG4gICdAbmV4dC9lc2xpbnQtcGx1Z2luLW5leHQnLFxuICAnQG5leHQvZm9udCcsXG4gICdAbmV4dC9yc3BhY2stYmluZGluZy1saW51eC1hcm02NC1nbnUnLFxuICAnQG5leHQvcnNwYWNrLWJpbmRpbmctbGludXgtYXJtNjQtbXVzbCcsXG4gICdAbmV4dC9yc3BhY2stYmluZGluZy1saW51eC14NjQtZ251JyxcbiAgJ0BuZXh0L3JzcGFjay1iaW5kaW5nLWxpbnV4LXg2NC1tdXNsJyxcbiAgJ0BuZXh0L3N3Yy1hbmRyb2lkLWFybS1lYWJpJyxcbiAgJ0BuZXh0L3N3Yy1hbmRyb2lkLWFybTY0JyxcbiAgJ0BuZXh0L3N3Yy1kYXJ3aW4tYXJtNjQnLFxuICAnQG5leHQvc3djLWRhcndpbi14NjQnLFxuICAnQG5leHQvc3djLWZyZWVic2QteDY0JyxcbiAgJ0BuZXh0L3N3Yy1saW51eC1hcm0tZ251ZWFiaWhmJyxcbiAgJ0BuZXh0L3N3Yy1saW51eC1hcm02NC1nbnUnLFxuICAnQG5leHQvc3djLWxpbnV4LWFybTY0LW11c2wnLFxuICAnQG5leHQvc3djLWxpbnV4LXg2NC1nbnUnLFxuICAnQG5leHQvc3djLWxpbnV4LXg2NC1tdXNsJyxcbiAgJ0BuZXh0L3N3Yy13YXNtLW5vZGVqcycsXG4gICdAbmV4dC9zd2Mtd2FzbS13ZWInLFxuICAnQG5leHQvc3djLXdpbjMyLWFybTY0LW1zdmMnLFxuICAnQG5leHQvc3djLXdpbjMyLWlhMzItbXN2YycsXG4gICdAbmV4dC9zd2Mtd2luMzIteDY0LW1zdmMnLFxuICAnQG5leHQvdGhpcmQtcGFydGllcycsXG4gICdAd2lsbGJvb3N0ZXIvYWdlbnQtc2tpbGxzJyxcbiAgJ0B3aWxsYm9vc3Rlci9iYWJlbC1jb25maWdzJyxcbiAgJ0B3aWxsYm9vc3Rlci9iaW9tZS1jb25maWcnLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctYmxpdHotbmV4dCcsXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcycsXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcy1yZWFjdCcsXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1uZXh0JyxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzJyxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzLXJlYWN0JyxcbiAgJ0B3aWxsYm9vc3Rlci9veGZtdC1jb25maWcnLFxuICAnQHdpbGxib29zdGVyL294bGludC1jb25maWcnLFxuICAnQHdpbGxib29zdGVyL3ByZXR0aWVyLWNvbmZpZycsXG4gICdAd2lsbGJvb3N0ZXIvcmVub3ZhdGUtY29uZmlnJyxcbiAgJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliJyxcbiAgJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLWJsaXR6LW5leHQnLFxuICAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbmV4dCcsXG4gICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlJyxcbiAgJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLXJlYWN0JyxcbiAgJ0B3aWxsYm9vc3Rlci93YicsXG4gICduZXh0JyxcbiAgJ3JlYWN0JyxcbiAgJ3JlYWN0LWRvbScsXG5dO1xuXG5jb25zdCBuZXdDb250ZW50ID0gKGV4aXN0aW5nQ29udGVudDogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nID0+IHtcbiAgY29uc3QgYnVuZmlnVG9tbCA9IHBhcnNlQnVuZmlnVG9tbChleGlzdGluZ0NvbnRlbnQpO1xuICByZXR1cm4gYGVudiA9IGZhbHNlXG50ZWxlbWV0cnkgPSBmYWxzZVxuXG4ke2dlbmVyYXRlUnVuU2VjdGlvbihidW5maWdUb21sKX1cbltpbnN0YWxsXVxuZXhhY3QgPSAke2J1bmZpZ1RvbWw/Lmluc3RhbGw/LmV4YWN0ID09PSBmYWxzZSA/ICdmYWxzZScgOiAndHJ1ZSd9XG5saW5rZXIgPSBcImhvaXN0ZWRcIlxubWluaW11bVJlbGVhc2VBZ2UgPSA0MzIwMDAgIyA1IGRheXNcbm1pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXMgPSBbXG4ke21pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXMubWFwKChwYWNrYWdlTmFtZSkgPT4gYCAgICBcIiR7cGFja2FnZU5hbWV9XCIsYCkuam9pbignXFxuJyl9XG5dXG5gO1xufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQnVuZmlnVG9tbChjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUJ1bmZpZ1RvbWwnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdidW5maWcudG9tbCcpO1xuICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpID8gZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmOCcpIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGNvbnRlbnQgPSBuZXdDb250ZW50KGV4aXN0aW5nQ29udGVudCk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlQnVuZmlnVG9tbChjb250ZW50OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBCdW5maWdUb21sIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFjb250ZW50KSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBwYXJzZShjb250ZW50KSBhcyBCdW5maWdUb21sO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlUnVuU2VjdGlvbihidW5maWdUb21sOiBCdW5maWdUb21sIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgcmV0dXJuIHR5cGVvZiBidW5maWdUb21sPy5ydW4/LmJ1biA9PT0gJ2Jvb2xlYW4nID8gYFtydW5dXFxuYnVuID0gJHtidW5maWdUb21sLnJ1bi5idW59XFxuYCA6ICcnO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuXG5jb25zdCB1c2VyQ29udGVudEhlYWRlciA9ICcjIFByb2plY3Qtc3BlY2lmaWMgc2V0dGluZ3MnO1xuY29uc3QgdXNlckNvbnRlbnRIZWFkZXJSZWdleCA9IC8jIFByb2plY3Qtc3BlY2lmaWMgc2V0dGluZ3NbXlxcbl0qXFxuL2dtO1xuY29uc3Qgc2VwYXJhdG9yID0gJyMgR2VuZXJhdGVkIGJ5IHdiZnknO1xuY29uc3Qgc2VwYXJhdG9yUHJlZml4ID0gJyMgR2VuZXJhdGVkIGJ5ICc7XG5jb25zdCBkZWZhdWx0SGVhZFVzZXJDb250ZW50ID0gYCR7dXNlckNvbnRlbnRIZWFkZXJ9IChoZWFkKVxuXG5cbiR7c2VwYXJhdG9yfVxuYDtcbmNvbnN0IGRlZmF1bHRUYWlsVXNlckNvbnRlbnQgPSBgXG4ke3VzZXJDb250ZW50SGVhZGVyfSAodGFpbClcbmA7XG5cbmV4cG9ydCBjb25zdCBpZ25vcmVGaWxlVXRpbCA9IHtcbiAgc2VwYXJhdG9yLFxuICBzZXBhcmF0b3JQcmVmaXgsXG4gIGRlZmF1bHRIZWFkVXNlckNvbnRlbnQsXG4gIGRlZmF1bHRUYWlsVXNlckNvbnRlbnQsXG4gIGFzeW5jIHJlYWRHaXRpZ25vcmVXaXRob3V0U2VwYXJhdG9ycyhmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICB0cnkge1xuICAgICAgbGV0IGNvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IGxhc3RIZWFkZXJJbmRleCA9IGdldEluZGV4T2ZUYWlsVXNlckNvbnRlbnRIZWFkZXIoY29udGVudCk7XG4gICAgICBpZiAobGFzdEhlYWRlckluZGV4ID4gMCkge1xuICAgICAgICBjb250ZW50ID0gY29udGVudC5zbGljZSgwLCBsYXN0SGVhZGVySW5kZXggLSAxKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNvbnRlbnRcbiAgICAgICAgICAucmVwbGFjZUFsbCh1c2VyQ29udGVudEhlYWRlclJlZ2V4LCAnJylcbiAgICAgICAgICAucmVwbGFjZUFsbCgvIyBHZW5lcmF0ZWQgYnkgW15cXG5dKlxcbi9nbSwgJycpXG4gICAgICAgICAgLnJlcGxhY2VBbGwoL1xccj9cXG5cXHI/XFxuKFxccj9cXG4pKy9nbSwgJ1xcblxcbicpXG4gICAgICAgICAgLnRyaW0oKSArICdcXG4nXG4gICAgICApO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgfSxcbiAgZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgaW5kZXggPSBjb250ZW50LmluZGV4T2YodGhpcy5zZXBhcmF0b3JQcmVmaXgpO1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgIHJldHVybiBjb250ZW50XG4gICAgICAgIC5zbGljZSgwLCBjb250ZW50LmluZGV4T2YoJ1xcbicsIGluZGV4KSArIDEpXG4gICAgICAgIC5yZXBsYWNlQWxsKHVzZXJDb250ZW50SGVhZGVyUmVnZXgsIGAke3VzZXJDb250ZW50SGVhZGVyfSAoaGVhZClcXG5gKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlZmF1bHRIZWFkVXNlckNvbnRlbnQ7XG4gIH0sXG4gIGdldFRhaWxVc2VyQ29udGVudChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGxhc3RIZWFkZXJJbmRleCA9IGdldEluZGV4T2ZUYWlsVXNlckNvbnRlbnRIZWFkZXIoY29udGVudCk7XG4gICAgaWYgKGxhc3RIZWFkZXJJbmRleCA+IDApIHtcbiAgICAgIHJldHVybiBjb250ZW50LnNsaWNlKGxhc3RIZWFkZXJJbmRleCAtIDEpO1xuICAgIH1cbiAgICByZXR1cm4gZGVmYXVsdFRhaWxVc2VyQ29udGVudDtcbiAgfSxcbiAgYXN5bmMgaXNCZXJyeVplcm9JbnN0YWxsRW5hYmxlZChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIHJldHVybiBjb250ZW50LmluY2x1ZGVzKCdcXG4hLnlhcm4vY2FjaGUnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0sXG59O1xuXG5mdW5jdGlvbiBnZXRJbmRleE9mVGFpbFVzZXJDb250ZW50SGVhZGVyKGNvbnRlbnQ6IHN0cmluZyk6IG51bWJlciB7XG4gIGNvbnN0IGluZGV4ID0gY29udGVudC5pbmRleE9mKHVzZXJDb250ZW50SGVhZGVyKTtcbiAgY29uc3QgbGFzdEluZGV4ID0gY29udGVudC5sYXN0SW5kZXhPZih1c2VyQ29udGVudEhlYWRlcik7XG4gIHJldHVybiBsYXN0SW5kZXggPiBpbmRleCA/IGxhc3RJbmRleCA6IC0xO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbi8vIEV4ZXJjb2Rl44Gn44Gvbm9kZV9tb2R1bGVz44KSQ09QWeOBmeOCi+W/heimgeOBjOOBguOCi+OBn+OCgeOAgW5vZGVfbW9kdWxlc+OCkumZpOWkluOBl+OBpuOBr+OBhOOBkeOBquOBhOOAglxuY29uc3QgY29tbW9uQ29udGVudCA9IGBcbioqLy5pZGVhXG4qKi8qLnNxbGl0ZTMqXG4qKi8ueWFybi9pbnN0YWxsLXN0YXRlLmd6XG4qKi8udmVudlxuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRG9ja2VyaWdub3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlRG9ja2VyaWdub3JlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmRvY2tlcmlnbm9yZScpO1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Eb2NrZXJmaWxlKSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gKGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGgpKSA/PyAnJztcbiAgICAgIGNvbnN0IGhlYWRVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldEhlYWRVc2VyQ29udGVudChjb250ZW50KTtcbiAgICAgIGNvbnN0IHRhaWxVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldFRhaWxVc2VyQ29udGVudChjb250ZW50KTtcblxuICAgICAgY29uc3QgbmV3Q29udGVudCA9IGhlYWRVc2VyQ29udGVudCArIGNvbW1vbkNvbnRlbnQgKyB0YWlsVXNlckNvbnRlbnQ7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH0pO1xufVxuIiwiZXhwb3J0IGNvbnN0IGV4dGVuc2lvbnMgPSB7XG4gIGNvZGVXaXRoMkluZGVudFNpemU6IFtcbiAgICAnY2pzJyxcbiAgICAnbWpzJyxcbiAgICAnanMnLFxuICAgICdqc3gnLFxuICAgICdjdHMnLFxuICAgICdtdHMnLFxuICAgICd0cycsXG4gICAgJ3RzeCcsXG4gICAgJ2pzb24nLFxuICAgICdqc29uNScsXG4gICAgJ2pzb25jJyxcbiAgICAnY3BwJyxcbiAgICAnZGFydCcsXG4gICAgJ2h0bScsXG4gICAgJ2h0bWwnLFxuICAgICdwdScsXG4gICAgJ3B1bWwnLFxuICAgICdyYicsXG4gICAgJ3Z1ZScsXG4gICAgJ3htbCcsXG4gICAgJ3lhbWwnLFxuICAgICd5bWwnLFxuICAgICdzaCcsXG4gIF0udG9Tb3J0ZWQoKSxcbiAgY29kZVdpdGg0SW5kZW50U2l6ZTogWydnbycsICdncmFkbGUnLCAnamF2YScsICdweSddLnRvU29ydGVkKCksXG4gIG1hcmtkb3duTGlrZTogWydtZCddLnRvU29ydGVkKCksXG4gIGVzbGludDogWydjanMnLCAnbWpzJywgJ2pzJywgJ2N0cycsICdtdHMnLCAndHMnLCAndHN4JywgJ2pzeCddLnRvU29ydGVkKCksXG4gIHByZXR0aWVyOiBbXG4gICAgJ2NqcycsXG4gICAgJ21qcycsXG4gICAgJ2phdmEnLFxuICAgICdqcycsXG4gICAgJ2pzeCcsXG4gICAgJ2N0cycsXG4gICAgJ210cycsXG4gICAgJ3RzJyxcbiAgICAndHN4JyxcbiAgICAnanNvbicsXG4gICAgJ2pzb241JyxcbiAgICAnanNvbmMnLFxuICAgICdjc3MnLFxuICAgICdodG0nLFxuICAgICdodG1sJyxcbiAgICAnbWQnLFxuICAgICdzY3NzJyxcbiAgICAndnVlJyxcbiAgICAneWFtbCcsXG4gICAgJ3ltbCcsXG4gIF0udG9Tb3J0ZWQoKSxcbiAgLy8gY2YuIGh0dHBzOi8vYmlvbWVqcy5kZXYvaW50ZXJuYWxzL2xhbmd1YWdlLXN1cHBvcnQvXG4gIGJpb21lOiBbXG4gICAgJ2NqcycsXG4gICAgJ21qcycsXG4gICAgJ2pzJyxcbiAgICAnanN4JyxcbiAgICAnY3RzJyxcbiAgICAnbXRzJyxcbiAgICAndHMnLFxuICAgICd0c3gnLFxuICAgICdqc29uJyxcbiAgICAnanNvbjUnLFxuICAgICdqc29uYycsXG4gICAgJ2h0bScsXG4gICAgJ2h0bWwnLFxuICAgICd2dWUnLFxuICAgICdzdmVsdGUnLFxuICAgICdhc3RybycsXG4gICAgJ2NzcycsXG4gICAgJ3lhbWwnLFxuICAgICd5bWwnLFxuICAgICdncWwnLFxuICBdLnRvU29ydGVkKCksXG59O1xuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBuZXdDb250ZW50ID0gYHJvb3QgPSB0cnVlXG5cblsqXVxuY2hhcnNldCA9IHV0Zi04XG5lbmRfb2ZfbGluZSA9IGxmXG5pbnNlcnRfZmluYWxfbmV3bGluZSA9IHRydWVcbnRyaW1fdHJhaWxpbmdfd2hpdGVzcGFjZSA9IHRydWVcblxuJHtnZW5lcmF0ZUV4dGVuc2lvbnMoZXh0ZW5zaW9ucy5jb2RlV2l0aDJJbmRlbnRTaXplKX1cbmluZGVudF9zaXplID0gMlxuaW5kZW50X3N0eWxlID0gc3BhY2VcblxuJHtnZW5lcmF0ZUV4dGVuc2lvbnMoZXh0ZW5zaW9ucy5jb2RlV2l0aDRJbmRlbnRTaXplKX1cbmluZGVudF9zaXplID0gNFxuaW5kZW50X3N0eWxlID0gc3BhY2VcblxuJHtnZW5lcmF0ZUV4dGVuc2lvbnMoZXh0ZW5zaW9ucy5tYXJrZG93bkxpa2UpfVxubWF4X2xpbmVfbGVuZ3RoID0gb2ZmXG50cmltX3RyYWlsaW5nX3doaXRlc3BhY2UgPSBmYWxzZVxuXG5be01ha2VmaWxlLCoubWt9XVxuaW5kZW50X3N0eWxlID0gdGFiXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVFZGl0b3Jjb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVFZGl0b3Jjb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZWRpdG9yY29uZmlnJyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIHJldHVybiBleHRlbnNpb25zLmxlbmd0aCA+IDEgPyBgWyoueyR7ZXh0ZW5zaW9ucy5qb2luKCcsJyl9fV1gIDogYFsqLiR7ZXh0ZW5zaW9uc1swXX1dYDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRXNsaW50cmMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVFc2xpbnRyYycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2VzbGludC5jb25maWcubWpzJyk7XG4gICAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWNvbmZpZy5lc2xpbnRCYXNlKSByZXR1cm47XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgaWYgKCFvbGRDb250ZW50LmluY2x1ZGVzKCdleHBvcnQgeyBkZWZhdWx0IH0nKSkgcmV0dXJuO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cblxuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBgZXhwb3J0IHsgZGVmYXVsdCB9IGZyb20gJyR7Y29uZmlnLmVzbGludEJhc2V9JztgKSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgeWFtbCBmcm9tICdqcy15YW1sJztcbmltcG9ydCBjbG9uZURlZXAgZnJvbSAnbG9kYXNoLmNsb25lZGVlcCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW1wb3J0IHsgZ2VuZXJhdGVBZ2VudENvZGluZ1N0eWxlIH0gZnJvbSAnLi9hZ2VudHMuanMnO1xuXG5jb25zdCBkZWZhdWx0Q29uZmlnID0ge1xuICBoYXZlX2Z1bjogdHJ1ZSxcbiAgY29kZV9yZXZpZXc6IHtcbiAgICBkaXNhYmxlOiBmYWxzZSxcbiAgICBjb21tZW50X3NldmVyaXR5X3RocmVzaG9sZDogJ01FRElVTScsXG4gICAgbWF4X3Jldmlld19jb21tZW50czogLTEsXG4gICAgcHVsbF9yZXF1ZXN0X29wZW5lZDoge1xuICAgICAgaGVscDogZmFsc2UsXG4gICAgICBzdW1tYXJ5OiB0cnVlLFxuICAgICAgY29kZV9yZXZpZXc6IHRydWUsXG4gICAgfSxcbiAgfSxcbiAgaWdub3JlX3BhdHRlcm5zOiBbJyoqL19fZ2VuZXJhdGVkX18nXSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUdlbWluaUNvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcsIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlR2VtaW5pQ29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghY29uZmlnLmlzUm9vdCkgcmV0dXJuO1xuXG4gICAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5nZW1pbmknKTtcbiAgICBjb25zdCBjb25maWdGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnY29uZmlnLnltbCcpO1xuICAgIGNvbnN0IHN0eWxlZ3VpZGVGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnc3R5bGVndWlkZS5tZCcpO1xuICAgIGNvbnN0IGFnZW50c0V4dHJhUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ0FHRU5UU19FWFRSQS5tZCcpO1xuXG4gICAgbGV0IG5ld0NvbmZpZzogb2JqZWN0ID0gY2xvbmVEZWVwKGRlZmF1bHRDb25maWcpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoY29uZmlnRmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBvbGRDb25maWcgPSB5YW1sLmxvYWQob2xkQ29udGVudCkgYXMgb2JqZWN0O1xuICAgICAgbmV3Q29uZmlnID0gbWVyZ2UuYWxsKFtuZXdDb25maWcsIG9sZENvbmZpZywgbmV3Q29uZmlnXSwgeyBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmcgLSBmaWxlIGRvZXNuJ3QgZXhpc3Qgb3IgY2FuJ3QgYmUgcGFyc2VkXG4gICAgfVxuXG4gICAgY29uc3QgeWFtbENvbnRlbnQgPSB5YW1sLmR1bXAobmV3Q29uZmlnLCB7XG4gICAgICBsaW5lV2lkdGg6IC0xLFxuICAgICAgbm9Db21wYXRNb2RlOiB0cnVlLFxuICAgICAgc3R5bGVzOiB7XG4gICAgICAgICchIW51bGwnOiAnZW1wdHknLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGV4dHJhQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoYWdlbnRzRXh0cmFQYXRoKTtcbiAgICBjb25zdCBzdHlsZWd1aWRlQ29udGVudCA9IGDku6XkuIvjga7jgrPjg7zjg4fjgqPjg7PjgrDopo/ntITjgpLouI/jgb7jgYjjgabjgIHml6XmnKzoqp7jgafjg6zjg5Pjg6Xjg7zjgZfjgabjgY/jgaDjgZXjgYTjgIJcXG5cXG4ke2dlbmVyYXRlQWdlbnRDb2RpbmdTdHlsZShhbGxDb25maWdzKX0ke1xuICAgICAgZXh0cmFDb250ZW50ID8gYFxcblxcbiR7ZXh0cmFDb250ZW50LnRyaW1FbmQoKX1gIDogJydcbiAgICB9YDtcblxuICAgIGNvbnN0IHByb21pc2VzID0gW3Byb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGNvbmZpZ0ZpbGVQYXRoLCB5YW1sQ29udGVudCkpXTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoc3R5bGVndWlkZUZpbGVQYXRoKSkge1xuICAgICAgcHJvbWlzZXMucHVzaChwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShzdHlsZWd1aWRlRmlsZVBhdGgsIHN0eWxlZ3VpZGVDb250ZW50KSkpO1xuICAgIH1cbiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVtb3ZlR2VtaW5pU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHZW1pbmlTZXR0aW5ncycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWNvbmZpZy5pc1Jvb3QpIHJldHVybjtcblxuICAgIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2VtaW5pJyk7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3NldHRpbmdzLmpzb24nKTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbi8vIGNmLiBodHRwczovL2J1bi5zaC9ndWlkZXMvaW5zdGFsbC9naXQtZGlmZi1idW4tbG9ja2ZpbGVcbmNvbnN0IG5ld0NvbnRlbnQgPSBgKiB0ZXh0PWF1dG9cblxuKi5sb2NrYiBiaW5hcnkgZGlmZj1sb2NrYlxuKi52Y3Byb2ogdGV4dCBlb2w9Y3JsZlxuXG4ke1suLi5leHRlbnNpb25zLmNvZGVXaXRoMkluZGVudFNpemUsIC4uLmV4dGVuc2lvbnMuY29kZVdpdGg0SW5kZW50U2l6ZSwgLi4uZXh0ZW5zaW9ucy5tYXJrZG93bkxpa2VdXG4gIC5tYXAoKGV4dCkgPT4gYCouJHtleHR9IHRleHQgZW9sPWxmYClcbiAgLmpvaW4oJ1xcbicpfVxuXG5kaXN0LyoqIGxpbmd1aXN0LWdlbmVyYXRlZD10cnVlXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlR2l0YXR0cmlidXRlcycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRhdHRyaWJ1dGVzJyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgb3MgZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4uL29wdGlvbnMuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgaWdub3JlRmlsZVV0aWwgfSBmcm9tICcuLi91dGlscy9pZ25vcmVGaWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgZGVmYXVsdE5hbWVzID0gWyd3aW5kb3dzJywgJ21hY29zJywgJ2xpbnV4JywgJ2pldGJyYWlucycsICd2aXN1YWxzdHVkaW9jb2RlJywgJ2VtYWNzJywgJ3ZpbScsICd5YXJuJ107XG5cbmNvbnN0IGNvbW1vbkNvbnRlbnQgPSBgXG4hLmtlZXBcbi5haWRlcipcbi5lbnYucHJvZHVjdGlvblxuKi9tb3VudC8qLmhhc2hcbi5kZXZjb250YWluZXIvXG4uaWRlYS9BdWdtZW50V2Vidmlld1N0YXRlU3RvcmUueG1sXG4uaWRlYS9jb3BpbG90Lipcbi5pZGVhL2NvcGlsb3QvY2hhdFNlc3Npb25zL1xuLnBsYXl3cmlnaHQtY2xpL1xuLnNlcmVuYS9cbi50bXAvXG5fX2dlbmVyYXRlZF9fL1xuQHdpbGxib29zdGVyL1xuZGlzdC9cbnRlbXAvXG50bXAvXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHaXRpZ25vcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHaXRpZ25vcmUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aWdub3JlJyk7XG4gICAgY29uc3QgY29udGVudCA9IChhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoKSkgPz8gJyc7XG4gICAgbGV0IGhlYWRVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldEhlYWRVc2VyQ29udGVudChjb250ZW50KSArIGNvbW1vbkNvbnRlbnQ7XG4gICAgY29uc3QgdGFpbFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0VGFpbFVzZXJDb250ZW50KGNvbnRlbnQpO1xuXG4gICAgY29uc3QgbmFtZXMgPSBbLi4uZGVmYXVsdE5hbWVzXTtcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluR2VtZmlsZSkge1xuICAgICAgbmFtZXMucHVzaCgncnVieScpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluR29Nb2QpIHtcbiAgICAgIG5hbWVzLnB1c2goJ2dvJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYCR7cGF0aC5iYXNlbmFtZShjb25maWcuZGlyUGF0aCl9XG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24pIHtcbiAgICAgIG5hbWVzLnB1c2goJ25vZGUnKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvbVhtbCkge1xuICAgICAgbmFtZXMucHVzaCgnbWF2ZW4nKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLmlkZWEvZ29vZ2xlLWphdmEtZm9ybWF0LnhtbFxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBuYW1lcy5wdXNoKCdmbHV0dGVyJywgJ0FuZHJvaWRTdHVkaW8nLCAncnVieScpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuZmx1dHRlci1wbHVnaW5zLWRlcGVuZGVuY2llc1xuYW5kcm9pZC9rZXkucHJvcGVydGllc1xuaW9zLy5idW5kbGVcbi5pZGVhL3J1bkNvbmZpZ3VyYXRpb25zLnhtbFxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblRlbXBsYXRlWWFtbCkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuYXdzLXNhbS9cbnBhY2thZ2VkLnlhbWxcbmA7XG4gICAgfVxuICAgIC8vIEJlY2F1c2UgLnZlbnYgc2hvdWxkIGJlIGlnbm9yZWQgb24gcm9vdCBkaXJlY3RvcnlcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jaykge1xuICAgICAgbmFtZXMucHVzaCgncHl0aG9uJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC52ZW52L1xuYDtcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eikge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuYmxpdHovXG4uYmxpdHoqKlxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgbmFtZXMucHVzaCgnbmV4dGpzJyk7XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5maXJlYmFzZSB8fCBjb25maWcuZGVwZW5kaW5nLmZpcmViYXNlKSB7XG4gICAgICBuYW1lcy5wdXNoKCdmaXJlYmFzZScpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgKi5zcWxpdGUzKlxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgcGxheXdyaWdodC1yZXBvcnQvXG50ZXN0LXJlc3VsdHMvXG5gO1xuICAgIH1cbiAgICBpZiAocm9vdENvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUgfHwgY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgICAgbmFtZXMucHVzaCgncmVhY3RuYXRpdmUnKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgZ29vZ2xlLXNlcnZpY2VzLmpzb25cbmFuZHJvaWQvYXBwL3NyYy9tYWluL2Fzc2V0cy9cbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnN0b3J5Ym9vaykge1xuICAgICAgbmFtZXMucHVzaCgnc3Rvcnlib29ranMnKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubGl0ZXN0cmVhbSkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGBnY3Atc2Eta2V5Lmpzb25cbmA7XG4gICAgfVxuXG4gICAgbGV0IGdlbmVyYXRlZCA9ICcnO1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykge1xuICAgICAgbGV0IGNvbnRlbnQgPSAoYXdhaXQgcmVhZENhY2hlKG5hbWUpKSA/PyAnJztcbiAgICAgIGlmICghY29udGVudCkge1xuICAgICAgICBjb25zdCB1cmwgPSBgaHR0cHM6Ly93d3cudG9wdGFsLmNvbS9kZXZlbG9wZXJzL2dpdGlnbm9yZS9hcGkvJHtuYW1lfWA7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsKTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2VUZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgICBpZiAoIXJlc3BvbnNlLm9rIHx8IHJlc3BvbnNlVGV4dC5pbmNsdWRlcygnQXR0ZW50aW9uIFJlcXVpcmVkIScpIHx8IHJlc3BvbnNlVGV4dC5pbmNsdWRlcygnPHRpdGxlPicpKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGZldGNoICR7dXJsfWApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb250ZW50ID0gcmVzcG9uc2VUZXh0LnRyaW0oKTtcbiAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IHdyaXRlQ2FjaGUobmFtZSwgY29udGVudCkpO1xuICAgICAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oYEZldGNoZWQgJHt1cmx9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChnZW5lcmF0ZWQpIGdlbmVyYXRlZCArPSAnXFxuJztcbiAgICAgIGdlbmVyYXRlZCArPSBjb250ZW50ICsgJ1xcbic7XG4gICAgfVxuICAgIGlmICghKGF3YWl0IGlnbm9yZUZpbGVVdGlsLmlzQmVycnlaZXJvSW5zdGFsbEVuYWJsZWQoZmlsZVBhdGgpKSkge1xuICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2UoJyEueWFybi9jYWNoZScsICcjICEueWFybi9jYWNoZScpLnJlcGxhY2UoJyMgLnBucC4qJywgJy5wbnAuKicpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9tWG1sIHx8IGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWRcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvYXJ0aWZhY3RzJC9nbSwgJy5pZGVhL2FydGlmYWN0cycpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL2NvbXBpbGVyLnhtbCQvZ20sICcuaWRlYS9jb21waWxlci54bWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9qYXJSZXBvc2l0b3JpZXMueG1sJC9nbSwgJy5pZGVhL2phclJlcG9zaXRvcmllcy54bWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9tb2R1bGVzLnhtbCQvZ20sICcuaWRlYS9tb2R1bGVzLnhtbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcLyouaW1sJC9nbSwgJy5pZGVhLyouaW1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvbW9kdWxlcyQvZ20sICcuaWRlYS9tb2R1bGVzJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jICouaW1sJC9nbSwgJyouaW1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jICouaXByJC9nbSwgJyouaXByJyk7XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2VBbGwoL14uaWRlYVxcL21vZHVsZXMueG1sJC9nbSwgJyMgLmlkZWEvbW9kdWxlcy54bWwnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2VBbGwoL14uaWRlYVxcLz8kL2dtLCAnIyAuaWRlYScpO1xuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSB8fCBjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlIHx8IGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZUFsbCgvXiguaWRlYVxcLy4rKSQvZ20sICckMVxcbmFuZHJvaWQvJDEnKTtcbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGVudCA9IGhlYWRVc2VyQ29udGVudCArICdcXG4nICsgZ2VuZXJhdGVkICsgdGFpbFVzZXJDb250ZW50O1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5jb25zdCBkaXJQYXRoID0gcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5jYWNoZScsICd3YmZ5JywgJ2dpdGlnbm9yZScpO1xuXG5hc3luYyBmdW5jdGlvbiB3cml0ZUNhY2hlKG5hbWU6IHN0cmluZywgY29udGVudDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKGRpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpLCBjb250ZW50KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZENhY2hlKG5hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdCA9IGF3YWl0IGZzLnByb21pc2VzLnN0YXQocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpKTtcbiAgICBpZiAoRGF0ZS5ub3coKSAtIHN0YXQubXRpbWVNcyA+IDYgKiA2MCAqIDYwICogMTAwMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpLCAndXRmOCcpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZnVuY3Rpb24gY3JlYXRlVGFza09wdGlvbnMocnVubmVyOiBzdHJpbmcsIGFyZ3M6IHN0cmluZywgbmFtZTogc3RyaW5nLCBleHRlbnNpb246IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgICAgIDxUYXNrT3B0aW9ucyBpc0VuYWJsZWQ9XCJ0cnVlXCI+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJhcmd1bWVudHNcIiB2YWx1ZT1cIiR7YXJnc30gJEZpbGVQYXRoUmVsYXRpdmVUb1Byb2plY3RSb290JFwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJjaGVja1N5bnRheEVycm9yc1wiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiZGVzY3JpcHRpb25cIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiZXhpdENvZGVCZWhhdmlvclwiIHZhbHVlPVwiRVJST1JcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiZmlsZUV4dGVuc2lvblwiIHZhbHVlPVwiJHtleHRlbnNpb259XCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImltbWVkaWF0ZVN5bmNcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cIm5hbWVcIiB2YWx1ZT1cIiR7bmFtZX0gKC4ke2V4dGVuc2lvbn0pXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cIm91dHB1dFwiIHZhbHVlPVwiJEZpbGVQYXRoUmVsYXRpdmVUb1Byb2plY3RSb290JFwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJvdXRwdXRGaWx0ZXJzXCI+XG4gICAgICAgIDxhcnJheSAvPlxuICAgICAgPC9vcHRpb24+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJvdXRwdXRGcm9tU3Rkb3V0XCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJwcm9ncmFtXCIgdmFsdWU9XCIke3J1bm5lcn1cIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwicnVuT25FeHRlcm5hbENoYW5nZXNcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cInNjb3BlTmFtZVwiIHZhbHVlPVwiUHJvamVjdCBGaWxlc1wiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJ0cmFja09ubHlSb290XCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJ3b3JraW5nRGlyXCIgdmFsdWU9XCIkUHJvamVjdEZpbGVEaXIkXCIgLz5cbiAgICAgIDxlbnZzIC8+XG4gICAgPC9UYXNrT3B0aW9ucz5cbmA7XG59XG5cbmNvbnN0IHByZXR0aWVyQ29udGVudCA9IGA8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cbjxwcm9qZWN0IHZlcnNpb249XCI0XCI+XG4gIDxjb21wb25lbnQgbmFtZT1cIlByb2plY3RUYXNrc09wdGlvbnNcIj5cbiR7ZXh0ZW5zaW9ucy5wcmV0dGllci5tYXAoKGV4dCkgPT4gY3JlYXRlVGFza09wdGlvbnMoJ25vZGUnLCAnbm9kZV9tb2R1bGVzLy5iaW4vcHJldHRpZXIgLS1jYWNoZSAtLXdyaXRlJywgJ1ByZXR0aWVyJywgZXh0KSkuam9pbignJyl9XG4gIDwvY29tcG9uZW50PlxuPC9wcm9qZWN0PlxuYDtcblxuY29uc3QgYmlvbWVDb250ZW50ID0gYDw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuPHByb2plY3QgdmVyc2lvbj1cIjRcIj5cbiAgPGNvbXBvbmVudCBuYW1lPVwiUHJvamVjdFRhc2tzT3B0aW9uc1wiPlxuJHtleHRlbnNpb25zLnByZXR0aWVyLm1hcCgoZXh0KSA9PiBjcmVhdGVUYXNrT3B0aW9ucygnYnVuJywgJy0tYnVuIG5vZGVfbW9kdWxlcy8uYmluL2Jpb21lIGNoZWNrIC0tZml4IC0tbm8tZXJyb3JzLW9uLXVubWF0Y2hlZCAtLXNraXAtcGFyc2UtZXJyb3JzJywgJ0Jpb21lJywgZXh0KSkuam9pbignJyl9XG4gIDwvY29tcG9uZW50PlxuPC9wcm9qZWN0PlxuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlSWRlYVNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlSWRlYVNldHRpbmdzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuaWRlYScpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGRpclBhdGgpKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnd2F0Y2hlclRhc2tzLnhtbCcpO1xuICAgICAgYXdhaXQgKGNvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHQgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHRJblBhY2thZ2VzIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcyB8fFxuICAgICAgKGNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uICYmXG4gICAgICAgICFjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCAmJlxuICAgICAgICAhY29uZmlnLmRvZXNDb250YWluR2VtZmlsZSAmJlxuICAgICAgICAhY29uZmlnLmRvZXNDb250YWluR29Nb2QgJiZcbiAgICAgICAgIWNvbmZpZy5kb2VzQ29udGFpblBvbVhtbClcbiAgICAgICAgPyBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgY29uZmlnLmlzQnVuID8gYmlvbWVDb250ZW50IDogcHJldHRpZXJDb250ZW50KSlcbiAgICAgICAgOiBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSkpKTtcbiAgICB9XG4gIH0pO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBTcGF3blN5bmNPcHRpb25zIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3blN5bmMoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcsIHJldHJ5ID0gMCk6IHZvaWQge1xuICBkbyB7XG4gICAgY29uc3QgW25ld0NtZCwgbmV3QXJncywgb3B0aW9uc10gPSBnZXRTcGF3blN5bmNBcmdzKGNvbW1hbmQsIGFyZ3MsIGN3ZCk7XG4gICAgY29uc29sZS5sb2coYCQgJHtuZXdDbWR9ICR7bmV3QXJncy5qb2luKCcgJyl9IGF0ICR7Y3dkfWApO1xuICAgIGNvbnN0IHJldCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKG5ld0NtZCwgbmV3QXJncywgb3B0aW9ucyk7XG4gICAgaWYgKHJldC5zdGF0dXMgPT09IDApIGJyZWFrO1xuICB9IHdoaWxlICgtLXJldHJ5ID49IDApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgW25ld0NtZCwgbmV3QXJncywgb3B0aW9uc10gPSBnZXRTcGF3blN5bmNBcmdzKGNvbW1hbmQsIGFyZ3MsIGN3ZCk7XG4gIG9wdGlvbnMuc3RkaW8gPSAncGlwZSc7XG4gIGNvbnN0IHByb2MgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnMpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvbiAtLSBzcGF3blN5bmMgcmV0dXJucyBudWxsIHN0ZGVyciBvbiBFTk9FTlQuXG4gIGNvbnN0IHN0ZGVyciA9IHByb2Muc3RkZXJyID8/ICcnO1xuICBjb25zdCBlcnJvciA9IHR5cGVvZiBzdGRlcnIgPT09ICdzdHJpbmcnID8gc3RkZXJyLnRyaW0oKSA6IHN0ZGVyci50b1N0cmluZygpLnRyaW0oKTtcbiAgaWYgKHByb2MuZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKGAke25ld0NtZH0gWyR7bmV3QXJncy5tYXAoKHMpID0+IGBcIiR7c31cImApLmpvaW4oJywgJyl9XSBmYWlsZWQgd2l0aDogJHtwcm9jLmVycm9yLm1lc3NhZ2V9YCk7XG4gIH0gZWxzZSBpZiAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgYCR7bmV3Q21kfSBbJHtuZXdBcmdzLm1hcCgocykgPT4gYFwiJHtzfVwiYCkuam9pbignLCAnKX1dIG91dHB1dHMgdGhlIGZvbGxvd2luZyBjb250ZW50IHRvIHN0ZGVycjpcXG4ke2Vycm9yfWBcbiAgICApO1xuICB9XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uIC0tIHNwYXduU3luYyByZXR1cm5zIG51bGwgc3Rkb3V0IG9uIEVOT0VOVC5cbiAgY29uc3Qgc3Rkb3V0ID0gcHJvYy5zdGRvdXQgPz8gJyc7XG4gIHJldHVybiB0eXBlb2Ygc3Rkb3V0ID09PSAnc3RyaW5nJyA/IHN0ZG91dC50cmltKCkgOiBzdGRvdXQudG9TdHJpbmcoKS50cmltKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTcGF3blN5bmNBcmdzKGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nKTogW3N0cmluZywgc3RyaW5nW10sIFNwYXduU3luY09wdGlvbnNdIHtcbiAgY29uc3QgZW52ID0geyAuLi5wcm9jZXNzLmVudiB9O1xuICAvLyBSZW1vdmUgYmVycnkgZnJvbSBQQVRIXG4gIGlmIChlbnYuUEFUSCAmJiBlbnYuQkVSUllfQklOX0ZPTERFUikge1xuICAgIGVudi5QQVRIID0gZW52LlBBVEgucmVwbGFjZShgJHtlbnYuQkVSUllfQklOX0ZPTERFUn06YCwgJycpO1xuICB9XG5cbiAgcmV0dXJuIFtcbiAgICBjb21tYW5kLFxuICAgIGFyZ3MsXG4gICAge1xuICAgICAgY3dkLFxuICAgICAgZW52LFxuICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICAgIHNoZWxsOiBmYWxzZSxcbiAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgfSxcbiAgXTtcbn1cbiIsImltcG9ydCB7IHNwYXduU3luY0FuZFJldHVyblN0ZG91dCB9IGZyb20gJy4uL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMYXRlc3RDb21taXRIYXNoKG9yZ2FuaXphdGlvbjogc3RyaW5nLCByZXBvOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICB0cnkge1xuICAgIGNvbnN0IHJlcG9VcmwgPSBgZ2l0QGdpdGh1Yi5jb206JHtvcmdhbml6YXRpb259LyR7cmVwb30uZ2l0YDtcbiAgICBjb25zdCBvdXRwdXQgPSBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoJ2dpdCcsIFsnbHMtcmVtb3RlJywgcmVwb1VybCwgJ0hFQUQnXSwgcHJvY2Vzcy5jd2QoKSk7XG4gICAgY29uc3QgY29tbWl0SGFzaCA9IG91dHB1dC5zcGxpdCgvXFxzKy8pWzBdO1xuICAgIGlmICghY29tbWl0SGFzaCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBjb21taXRzIGZvdW5kIGZvciAke29yZ2FuaXphdGlvbn0vJHtyZXBvfWApO1xuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGNvbW1pdEhhc2gpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYEZhaWxlZCB0byBmZXRjaCBjb21taXRzIGZvciAke29yZ2FuaXphdGlvbn0vJHtyZXBvfTogJHtTdHJpbmcoZXJyb3IpfWApKTtcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmV4cG9ydCBjb25zdCBFc2xpbnRVdGlsID0ge1xuICBnZXRMaW50Rml4U3VmZml4KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGNvbmZpZy5kb2VzQ29udGFpbkpzeE9yVHN4ID8gJyAtLXJ1bGUgXCJ7IHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwczogMCB9XCInIDogJyc7XG4gIH0sXG59O1xuIiwiaW1wb3J0IHsgT2N0b2tpdCB9IGZyb20gJ0BvY3Rva2l0L2NvcmUnO1xuXG5jbGFzcyBHaXRIdWJVdGlsIHtcbiAgZ2V0T3JnQW5kTmFtZSh1cmxPckZ1bGxOYW1lOiBzdHJpbmcpOiBbc3RyaW5nLCBzdHJpbmddIHtcbiAgICBjb25zdCB1cmxXaXRob3V0UHJvdG9jb2wgPSB1cmxPckZ1bGxOYW1lLnNwbGl0KCc6JykuYXQoLTEpO1xuICAgIGNvbnN0IG5hbWVzID0gdXJsV2l0aG91dFByb3RvY29sPy5zcGxpdCgnLycpO1xuICAgIGNvbnN0IG9yZyA9IG5hbWVzPy5hdCgtMikgPz8gJyc7XG4gICAgY29uc3QgbmFtZSA9IG5hbWVzPy5hdCgtMSk/LnJlcGxhY2UoLy5naXQkLywgJycpID8/ICcnO1xuICAgIHJldHVybiBbb3JnLCBuYW1lXTtcbiAgfVxufVxuZXhwb3J0IGNvbnN0IGdpdEh1YlV0aWwgPSBuZXcgR2l0SHViVXRpbCgpO1xuXG5jb25zdCBvY3Rva2l0Q2FjaGUgPSBuZXcgTWFwPHN0cmluZywgT2N0b2tpdD4oKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldE9jdG9raXQob3duZXI/OiBzdHJpbmcpOiBPY3Rva2l0IHtcbiAgY29uc3Qga2V5ID0gb3duZXIgPz8gJyc7XG4gIGNvbnN0IGNhY2hlZCA9IG9jdG9raXRDYWNoZS5nZXQoa2V5KTtcbiAgaWYgKGNhY2hlZCkgcmV0dXJuIGNhY2hlZDtcblxuICBjb25zdCBvY3Rva2l0ID0gbmV3IE9jdG9raXQoe1xuICAgIGF1dGg6IGdldEdpdEh1YlRva2VuKG93bmVyKSB8fCB1bmRlZmluZWQsXG4gIH0pO1xuICBvY3Rva2l0Q2FjaGUuc2V0KGtleSwgb2N0b2tpdCk7XG4gIHJldHVybiBvY3Rva2l0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzR2l0SHViVG9rZW4ob3duZXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gISFnZXRHaXRIdWJUb2tlbihvd25lcik7XG59XG5cbmZ1bmN0aW9uIGdldEdpdEh1YlRva2VuKG93bmVyPzogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKG93bmVyID09PSAnV2lsbEJvb3N0ZXInKSB7XG4gICAgcmV0dXJuIHByb2Nlc3MuZW52LkdIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSO1xuICB9XG4gIGlmIChvd25lciA9PT0gJ1dpbGxCb29zdGVyTGFiJykge1xuICAgIHJldHVybiBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUkxBQjtcbiAgfVxuICByZXR1cm4gKFxuICAgIHByb2Nlc3MuZW52LkdIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSIHx8XG4gICAgcHJvY2Vzcy5lbnYuR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVJMQUIgfHxcbiAgICBwcm9jZXNzLmVudi5HSF9UT0tFTiB8fFxuICAgIHByb2Nlc3MuZW52LkdJVEhVQl9UT0tFTlxuICApO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmNvbnN0IEVTTElOVF9DT05GSUdfUFJFRklYID0gJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLSc7XG5jb25zdCBwaW5uZWREZXBlbmRlbmN5U3BlY2lmaWVycyA9IHtcbiAgJ0Blc2xpbnQvanMnOiAnXjknLFxuICBlc2xpbnQ6ICdeOScsXG4gIC8vIDEuMjIuMCBpcyBwdWJsaXNoZWQgd2l0aG91dCBkaXN0Lywgd2hpY2ggYnJlYWtzIEVTTGludCBjb25maWcgcmVzb2x1dGlvbi5cbiAgJ2VzbGludC1wbHVnaW4tc29ydC1jbGFzcy1tZW1iZXJzJzogJzEuMjEuMCcsXG4gIHR5cGVzY3JpcHQ6ICdeNScsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgZnVuY3Rpb24gc2hvdWxkU2tpcFdpbGxib29zdGVyQ29uZmlnc0VzbGludFBhY2thZ2UoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIHJldHVybiBjb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3MgJiYgY29uZmlnLnBhY2thZ2VKc29uPy5uYW1lPy5zdGFydHNXaXRoKEVTTElOVF9DT05GSUdfUFJFRklYKSA9PT0gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFBpbm5lZERlcGVuZGVuY3lTcGVjaWZpZXIoZGVwZW5kZW5jeTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocGlubmVkRGVwZW5kZW5jeVNwZWNpZmllcnMpKSB7XG4gICAgaWYgKGtleSA9PT0gZGVwZW5kZW5jeSkge1xuICAgICAgcmV0dXJuIGAke2tleX1AJHt2YWx1ZX1gO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiwgU2V0UmVxdWlyZWQgfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBnZXRMYXRlc3RDb21taXRIYXNoIH0gZnJvbSAnLi4vZ2l0aHViL2NvbW1pdC5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBFc2xpbnRFeHRlbnNpb25CYXNlLCBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBFc2xpbnRVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZXNsaW50VXRpbC5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBnaXRIdWJVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5pbXBvcnQgeyBnbG9iSWdub3JlIH0gZnJvbSAnLi4vdXRpbHMvZ2xvYlV0aWwuanMnO1xuaW1wb3J0IHsgaWdub3JlRmlsZVV0aWwgfSBmcm9tICcuLi91dGlscy9pZ25vcmVGaWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBjb21iaW5lTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuaW1wb3J0IHsgZ2V0VHNjb25maWdCYXNlRGVwZW5kZW5jaWVzIH0gZnJvbSAnLi4vdXRpbHMvdHNjb25maWdCYXNlLmpzJztcbmltcG9ydCB7IGdldFBpbm5lZERlcGVuZGVuY3lTcGVjaWZpZXIgfSBmcm9tICcuLi91dGlscy93aWxsYm9vc3RlckNvbmZpZ3NVdGlsLmpzJztcblxuY29uc3QganNDb21tb25EZXBzID0gW1xuICAnQGVzbGludC9qcycsXG4gICdlc2xpbnQnLFxuICAnZXNsaW50LWNvbmZpZy1mbGF0LWdpdGlnbm9yZScsXG4gICdlc2xpbnQtY29uZmlnLXByZXR0aWVyJyxcbiAgJ2VzbGludC1wbHVnaW4taW1wb3J0LXgnLFxuICAnZXNsaW50LXBsdWdpbi1zb3J0LWNsYXNzLW1lbWJlcnMnLFxuICAnZXNsaW50LXBsdWdpbi1zb3J0LWRlc3RydWN0dXJlLWtleXMnLFxuICAnZXNsaW50LXBsdWdpbi11bmljb3JuJyxcbiAgJ2VzbGludC1wbHVnaW4tdW51c2VkLWltcG9ydHMnLFxuICAnZ2xvYmFscycsXG5dO1xuXG5jb25zdCB0c0NvbW1vbkRlcHMgPSBbLi4uanNDb21tb25EZXBzLCAndHlwZXNjcmlwdC1lc2xpbnQnLCAnZXNsaW50LWltcG9ydC1yZXNvbHZlci10eXBlc2NyaXB0J107XG5cbmNvbnN0IHJlYWN0Q29tbW9uRGVwcyA9IFsnZXNsaW50LXBsdWdpbi1yZWFjdCcsICdlc2xpbnQtcGx1Z2luLXJlYWN0LWhvb2tzJywgJ2VzbGludC1wbHVnaW4tcmVhY3QtY29tcGlsZXInXTtcblxuY29uc3QgZXNsaW50RGVwczogUmVjb3JkPEVzbGludEV4dGVuc2lvbkJhc2UsIHN0cmluZ1tdPiA9IHtcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzJzogWydAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcycsIC4uLmpzQ29tbW9uRGVwc10sXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcy1yZWFjdCc6IFsnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMtcmVhY3QnLCAuLi5qc0NvbW1vbkRlcHMsIC4uLnJlYWN0Q29tbW9uRGVwc10sXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cyc6IFsnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMnLCAuLi50c0NvbW1vbkRlcHNdLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMtcmVhY3QnOiBbJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzLXJlYWN0JywgLi4udHNDb21tb25EZXBzLCAuLi5yZWFjdENvbW1vbkRlcHNdLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctbmV4dCc6IFtcbiAgICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctbmV4dCcsXG4gICAgJ0BuZXh0L2VzbGludC1wbHVnaW4tbmV4dCcsXG4gICAgLi4udHNDb21tb25EZXBzLFxuICAgIC4uLnJlYWN0Q29tbW9uRGVwcyxcbiAgXSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVBhY2thZ2VKc29uKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHNraXBBZGRpbmdEZXBzOiBib29sZWFuXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVBhY2thZ2VKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IGNvcmUoY29uZmlnLCByb290Q29uZmlnLCBza2lwQWRkaW5nRGVwcyk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZywgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZywgc2tpcEFkZGluZ0RlcHM6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgY29uc3QganNvblRleHQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgY29uc3QganNvbk9iaiA9IEpTT04ucGFyc2UoanNvblRleHQpIGFzIFBhY2thZ2VKc29uO1xuICBqc29uT2JqLnNjcmlwdHMgPSBqc29uT2JqLnNjcmlwdHMgPz8ge307XG4gIGpzb25PYmouZGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXBlbmRlbmNpZXMgPz8ge307XG4gIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gIGpzb25PYmoucGVlckRlcGVuZGVuY2llcyA9IGpzb25PYmoucGVlckRlcGVuZGVuY2llcyA/PyB7fTtcbiAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSBjb25maWcuaXNCdW4gPyAnYnVuJyA6ICd5YXJuJztcblxuICBhd2FpdCByZW1vdmVEZXByZWNhdGVkU3R1ZmYoanNvbk9iaiBhcyBTZXRSZXF1aXJlZDxQYWNrYWdlSnNvbiwgJ3NjcmlwdHMnIHwgJ2RlcGVuZGVuY2llcycgfCAnZGV2RGVwZW5kZW5jaWVzJz4pO1xuXG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGpzb25PYmouc2NyaXB0cyBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSkge1xuICAgIC8vIEZyZXNoIHJlcG8gc3RpbGwgcmVxdWlyZXMgJ3lhcm4gaW5zdGFsbCdcbiAgICBpZiAoIXZhbHVlLmluY2x1ZGVzKCdnaXQgY2xvbmUnKSkge1xuICAgICAganNvbk9iai5zY3JpcHRzW2tleV0gPSB2YWx1ZS5yZXBsYWNlKC95YXJuXFxzKiYmXFxzKi8sICcnKS5yZXBsYWNlKC95YXJuXFxzKmluc3RhbGxcXHMqJiZcXHMqLywgJycpO1xuICAgIH1cbiAgfVxuXG4gIGpzb25PYmouc2NyaXB0cyA9IG1lcmdlKGpzb25PYmouc2NyaXB0cywgZ2VuZXJhdGVTY3JpcHRzKGNvbmZpZywganNvbk9iai5zY3JpcHRzKSk7XG5cbiAgaWYgKCdjaGVjay1mb3ItYWknIGluIGpzb25PYmouc2NyaXB0cykge1xuICAgIGlmICgnZ2VuLWNvZGUnIGluIGpzb25PYmouc2NyaXB0cykge1xuICAgICAganNvbk9iai5zY3JpcHRzWydjaGVjay1mb3ItYWknXSA9IGAke3BhY2thZ2VNYW5hZ2VyfSBnZW4tY29kZSA+IC9kZXYvbnVsbCAmJiAke2pzb25PYmouc2NyaXB0c1snY2hlY2stZm9yLWFpJ119YDtcbiAgICB9XG4gICAganNvbk9iai5zY3JpcHRzWydjaGVjay1mb3ItYWknXSA9IGAke3BhY2thZ2VNYW5hZ2VyfSBpbnN0YWxsID4gL2Rldi9udWxsICYmICR7anNvbk9iai5zY3JpcHRzWydjaGVjay1mb3ItYWknXX1gO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucHJldHRpZnk7XG4gIH0gZWxzZSB7XG4gICAganNvbk9iai5zY3JpcHRzLnByZXR0aWZ5ID0gKGpzb25PYmouc2NyaXB0cy5wcmV0dGlmeSA/PyAnJykgKyAoYXdhaXQgZ2VuZXJhdGVQcmV0dGllclN1ZmZpeChjb25maWcuZGlyUGF0aCkpO1xuICB9XG4gIC8vIERlYWwgd2l0aCBicmVha2luZyBjaGFuZ2VzIGluIHlhcm4gYmVycnkgNC4wLjAtcmMuNDlcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoanNvbk9iai5zY3JpcHRzKSkge1xuICAgIGlmICghdmFsdWU/LmluY2x1ZGVzKCd5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCcpKSBjb250aW51ZTtcbiAgICBpZiAoXG4gICAgICB2YWx1ZS5pbmNsdWRlcygnLS1hbGwnKSB8fFxuICAgICAgdmFsdWUuaW5jbHVkZXMoJy0tcmVjdXJzaXZlJykgfHxcbiAgICAgIHZhbHVlLmluY2x1ZGVzKCctLXNpbmNlJykgfHxcbiAgICAgIHZhbHVlLmluY2x1ZGVzKCctLXdvcmt0cmVlJylcbiAgICApXG4gICAgICBjb250aW51ZTtcbiAgICBqc29uT2JqLnNjcmlwdHNba2V5XSA9IHZhbHVlLnJlcGxhY2UoJ3lhcm4gd29ya3NwYWNlcyBmb3JlYWNoJywgJ3lhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsJyk7XG4gIH1cblxuICBsZXQgZGVwZW5kZW5jaWVzOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgZGV2RGVwZW5kZW5jaWVzID0gWydwcmV0dGllcicsICdzb3J0LXBhY2thZ2UtanNvbiddO1xuICBjb25zdCBwb2V0cnlEZXZEZXBlbmRlbmNpZXM6IHN0cmluZ1tdID0gW107XG5cbiAgaWYgKFxuICAgICFmcy5leGlzdHNTeW5jKHBhdGguam9pbihyb290Q29uZmlnLmRpclBhdGgsICcucHJldHRpZXJyYy5qc29uJykpICYmXG4gICAgIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAnLnByZXR0aWVycmMuanNvbicpKVxuICApIHtcbiAgICBqc29uT2JqLnByZXR0aWVyID0gJ0B3aWxsYm9vc3Rlci9wcmV0dGllci1jb25maWcnO1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdwcmV0dGllci1wbHVnaW4tamF2YScsICdAd2lsbGJvb3N0ZXIvcHJldHRpZXItY29uZmlnJyk7XG4gIH1cblxuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ2xpbnQtc3RhZ2VkJ107XG4gIGRlbGV0ZSAoanNvbk9iaiBhcyBQYWNrYWdlSnNvbiAmIHsgJ2xpbnQtc3RhZ2VkJz86IHVua25vd24gfSlbJ2xpbnQtc3RhZ2VkJ107XG5cbiAgaWYgKGNvbmZpZy5pc1Jvb3QpIHtcbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXMuaHVza3k7XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLnBpbnN0O1xuICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucG9zdGluc3RhbGw7XG4gICAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5wb3N0cHVibGlzaDtcbiAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLnByZXB1Ymxpc2hPbmx5O1xuICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucHJlcGFjaztcbiAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLnBvc3RwYWNrO1xuICAgIGpzb25PYmouc2NyaXB0cy5wcmVwYXJlID0gJ2xlZnRob29rIGluc3RhbGwgfHwgdHJ1ZSc7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ2xlZnRob29rJyk7XG5cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5zZW1hbnRpY1JlbGVhc2UpIHtcbiAgICAgIGlmIChcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydzZW1hbnRpYy1yZWxlYXNlJ10gJiZcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydtdWx0aS1zZW1hbnRpYy1yZWxlYXNlJ10gJiZcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAcWl3aS9tdWx0aS1zZW1hbnRpYy1yZWxlYXNlJ11cbiAgICAgICkge1xuICAgICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnc2VtYW50aWMtcmVsZWFzZScpO1xuICAgICAgfVxuICAgICAganNvbk9iai52ZXJzaW9uID0gJzAuMC4wLXNlbWFudGljYWxseS1yZWxlYXNlZCc7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpIHtcbiAgICAgIC8vIFNpbmNlIGFydGlsbGVyeSByZXF1aXJlcyBhIHNwZWNpZmljIHZlcnNpb24gb2YgQHBsYXl3cmlnaHQvdGVzdFxuICAgICAgY29uc3QgaGFzQXJ0aWxsZXJ5ID0ganNvbk9iai5kZXBlbmRlbmNpZXMuYXJ0aWxsZXJ5IHx8IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLmFydGlsbGVyeTtcbiAgICAgIC8vIFNpbmNlIGxsbS10b29sYm94IHJlcXVpcmVzIEBwbGF5d3JpZ2h0L3Rlc3QgaW4gZGVwZW5kZW5jaWVzXG4gICAgICBpZiAoIWhhc0FydGlsbGVyeSAmJiAhanNvbk9iai5kZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXSkge1xuICAgICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnQHBsYXl3cmlnaHQvdGVzdCcpO1xuICAgICAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXTtcbiAgICAgIH1cbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llcy5wbGF5d3JpZ2h0O1xuICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQ7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucykge1xuICAgICAgLy8gV2UgZG9uJ3QgYWxsb3cgbm9uLWFycmF5IHdvcmtzcGFjZXMgaW4gbW9ub3JlcG8uXG4gICAgICBqc29uT2JqLndvcmtzcGFjZXMgPSBBcnJheS5pc0FycmF5KGpzb25PYmoud29ya3NwYWNlcylcbiAgICAgICAgPyBtZXJnZS5hbGwoW2pzb25PYmoud29ya3NwYWNlcywgWydwYWNrYWdlcy8qJ11dLCB7XG4gICAgICAgICAgICBhcnJheU1lcmdlOiBjb21iaW5lTWVyZ2UsXG4gICAgICAgICAgfSlcbiAgICAgICAgOiBbJ3BhY2thZ2VzLyonXTtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoanNvbk9iai53b3Jrc3BhY2VzKSkge1xuICAgICAganNvbk9iai53b3Jrc3BhY2VzID0ganNvbk9iai53b3Jrc3BhY2VzLmZpbHRlcihcbiAgICAgICAgKHdvcmtzcGFjZSkgPT5cbiAgICAgICAgICBmZy5nbG9iU3luYyh3b3Jrc3BhY2UsIHtcbiAgICAgICAgICAgIGRvdDogdHJ1ZSxcbiAgICAgICAgICAgIGN3ZDogY29uZmlnLmRpclBhdGgsXG4gICAgICAgICAgICBpZ25vcmU6IGdsb2JJZ25vcmUsXG4gICAgICAgICAgfSkubGVuZ3RoID4gMFxuICAgICAgKTtcbiAgICAgIGlmIChqc29uT2JqLndvcmtzcGFjZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLndvcmtzcGFjZXM7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcud2IgfHwgY29uZmlnLmlzQnVuKSB7XG4gICAgaWYgKGpzb25PYmouZGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvd2InXSkge1xuICAgICAgZGVwZW5kZW5jaWVzLnB1c2goJ0B3aWxsYm9vc3Rlci93YicpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnQHdpbGxib29zdGVyL3diJyk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGpzb25PYmouc2NyaXB0cyBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSkge1xuICAgICAganNvbk9iai5zY3JpcHRzW2tleV0gPSB2YWx1ZS5yZXBsYWNlKC93YlxccytkYi8sICd3YiBwcmlzbWEnKTtcbiAgICB9XG4gIH1cblxuICBpZiAoXG4gICAgY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdCB8fFxuICAgIGNvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHRJblBhY2thZ2VzIHx8XG4gICAgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fFxuICAgIGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzXG4gICkge1xuICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAYmlvbWVqcy9iaW9tZScsICdAd2lsbGJvb3N0ZXIvYmlvbWUtY29uZmlnJyk7XG4gICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXMuZXNsaW50O1xuICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLm1pY3JvbWF0Y2g7XG4gICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ3R5cGVzY3JpcHQtZXNsaW50J107XG4gICAgfSBlbHNlIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdlc2xpbnQnLCAnbWljcm9tYXRjaCcpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChcbiAgICBjb25maWcuZG9lc0NvbnRhaW5KYXZhU2NyaXB0IHx8XG4gICAgY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdEluUGFja2FnZXMgfHxcbiAgICBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8XG4gICAgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXNcbiAgKSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goLi4uZ2V0VHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKGNvbmZpZykpO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXMpIHtcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgndHlwZXNjcmlwdCcpO1xuICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAdHlwZXMvYnVuJyk7XG4gICAgfSBlbHNlIGlmICghY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0B0eXBlcy9ub2RlJyk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGpzb25PYmouZGVwZW5kZW5jaWVzLmplc3QgfHxcbiAgICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLmplc3QgfHxcbiAgICAgIGpzb25PYmouZGVwZW5kZW5jaWVzWydAamVzdC9nbG9iYWxzJ10gfHxcbiAgICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAamVzdC9nbG9iYWxzJ10gfHxcbiAgICAgIGpzb25PYmouZGVwZW5kZW5jaWVzWyd0cy1qZXN0J10gfHxcbiAgICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWyd0cy1qZXN0J11cbiAgICApIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAdHlwZXMvamVzdCcpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcuZXNsaW50QmFzZSkge1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKC4uLmVzbGludERlcHNbY29uZmlnLmVzbGludEJhc2VdKTtcbiAgfVxuXG4gIGlmIChjb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3MpIHtcbiAgICBkZXBlbmRlbmNpZXMgPSBkZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFkZXAuaW5jbHVkZXMoJ0B3aWxsYm9vc3Rlci8nKSk7XG4gICAgZGV2RGVwZW5kZW5jaWVzID0gZGV2RGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhZGVwLmluY2x1ZGVzKCdAd2lsbGJvb3N0ZXIvJykpO1xuICB9XG5cbiAgaWYgKCFqc29uT2JqLm5hbWUpIHtcbiAgICBqc29uT2JqLm5hbWUgPSBwYXRoLmJhc2VuYW1lKGNvbmZpZy5kaXJQYXRoKTtcbiAgfVxuXG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMpIHtcbiAgICBqc29uT2JqLnByaXZhdGUgPSB0cnVlO1xuICB9XG4gIGlmICghanNvbk9iai5saWNlbnNlKSB7XG4gICAganNvbk9iai5saWNlbnNlID0gJ1VOTElDRU5TRUQnO1xuICB9XG4gIGlmICghanNvbk9iai5wcml2YXRlICYmIGpzb25PYmoubGljZW5zZSAhPT0gJ1VOTElDRU5TRUQnICYmIHJvb3RDb25maWcuaXNQdWJsaWNSZXBvKSB7XG4gICAganNvbk9iai5wdWJsaXNoQ29uZmlnID8/PSB7fTtcbiAgICBqc29uT2JqLnB1Ymxpc2hDb25maWcuYWNjZXNzID8/PSAncHVibGljJztcbiAgfVxuICBjb25zdCBbb3duZXJdID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGNvbmZpZy5yZXBvc2l0b3J5ID8/ICcnKTtcbiAgaWYgKG93bmVyID09PSAnV2lsbEJvb3N0ZXInIHx8IG93bmVyID09PSAnV2lsbEJvb3N0ZXJMYWInKSB7XG4gICAganNvbk9iai5hdXRob3IgPSAnV2lsbEJvb3N0ZXIgSW5jLic7XG4gIH1cbiAgaWYgKCFjb25maWcuaXNSb290ICYmIGpzb25PYmoucHJpdmF0ZSAmJiAhanNvbk9iai5tYWluKSB7XG4gICAgLy8gTWFrZSBWU0NvZGUgcG9zc2libGUgdG8gcmVmYWN0b3IgY29kZSBhY3Jvc3Mgc3VicGFja2FnZXMuXG4gICAganNvbk9iai5tYWluID0gJy4vc3JjJztcbiAgfVxuXG4gIC8vIEJlY2F1c2UgYFwicmVzb2x1dGlvbnNcIjogeyBcIm5wbS9jaGFsa1wiOiBcIl40LjEuMlwiIH0sYCBjYXVzZXMgXCJJbnZhbGlkIG5wbSB0b2tlblwiXG4gIGRlbGV0ZSBqc29uT2JqLnJlc29sdXRpb25zPy5bJ25wbS9jaGFsayddO1xuXG4gIGlmICghY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zKSB7XG4gICAgaWYgKCFjb25maWcuaXNCdW4pIHtcbiAgICAgIGlmICghY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdCAmJiAhY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCkge1xuICAgICAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLmxpbnQ7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J107XG4gICAgICAgIGZvciAoY29uc3Qgc2NyaXB0TmFtZSBvZiBbJ2NsZWFudXAnLCAnY2hlY2stZm9yLWFpJ10pIHtcbiAgICAgICAgICBjb25zdCBzY3JpcHQgPSBqc29uT2JqLnNjcmlwdHNbc2NyaXB0TmFtZV07XG4gICAgICAgICAgaWYgKCFzY3JpcHQpIGNvbnRpbnVlO1xuICAgICAgICAgIGpzb25PYmouc2NyaXB0c1tzY3JpcHROYW1lXSA9IHNjcmlwdC5yZXBsYWNlKC8gPyYmID95YXJuIGxpbnQtZml4KD86IC0tcXVpZXQpPy8sICcnKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAganNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddID0gKGpzb25PYmouc2NyaXB0c1snbGludC1maXgnXSA/PyAnJykgKyBFc2xpbnRVdGlsLmdldExpbnRGaXhTdWZmaXgoY29uZmlnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgIGpzb25PYmouc2NyaXB0cy5saW50ID0gJ2ZsdXR0ZXIgYW5hbHl6ZSc7XG4gICAgICBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J10gPSAneWFybiBsaW50JztcbiAgICAgIGNvbnN0IGRpcnMgPSBbJ2xpYicsICd0ZXN0JywgJ3Rlc3RfZHJpdmVyJ10uZmlsdGVyKChkaXIpID0+IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBkaXIpKSk7XG4gICAgICBpZiAoZGlycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGpzb25PYmouc2NyaXB0c1snZm9ybWF0LWNvZGUnXSA9IGBkYXJ0IGZvcm1hdCAkKGZpbmQgJHtkaXJzLmpvaW4oXG4gICAgICAgICAgJyAnXG4gICAgICAgICl9IC1uYW1lIGdlbmVyYXRlZCAtcHJ1bmUgLW8gLW5hbWUgJyouZnJlZXplZC5kYXJ0JyAtcHJ1bmUgLW8gLW5hbWUgJyouZy5kYXJ0JyAtcHJ1bmUgLW8gLW5hbWUgJyouZGFydCcgLXByaW50KWA7XG4gICAgICAgIGpzb25PYmouc2NyaXB0cy5mb3JtYXQgPSAoanNvbk9iai5zY3JpcHRzLmZvcm1hdCA/PyAnJykgKyBgICYmIHlhcm4gZm9ybWF0LWNvZGVgO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrKSB7XG4gICAgICBpZiAoanNvbk9iai5zY3JpcHRzLnBvc3RpbnN0YWxsID09PSAncG9ldHJ5IGluc3RhbGwnKSB7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucG9zdGluc3RhbGw7XG4gICAgICB9XG4gICAgICBjb25zdCBweXRob25GaWxlcyA9IGF3YWl0IGZnLmdsb2IoJyoqLyoucHknLCB7XG4gICAgICAgIGN3ZDogY29uZmlnLmRpclBhdGgsXG4gICAgICAgIGRvdDogdHJ1ZSxcbiAgICAgICAgaWdub3JlOiBnbG9iSWdub3JlLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBkaXJOYW1lU2V0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICBmb3IgKGNvbnN0IHB5dGhvbkZpbGUgb2YgcHl0aG9uRmlsZXMpIHtcbiAgICAgICAgY29uc3QgW2ZpcnN0LCBzZWNvbmRdID0gcHl0aG9uRmlsZS5zcGxpdCgvWy9cXFxcXS8pO1xuICAgICAgICBpZiAoZmlyc3QgJiYgc2Vjb25kKSB7XG4gICAgICAgICAgZGlyTmFtZVNldC5hZGQoZmlyc3QpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZGlyTmFtZVNldC5zaXplID4gMCkge1xuICAgICAgICBjb25zdCBkaXJOYW1lc1N0ciA9IFsuLi5kaXJOYW1lU2V0XS5qb2luKCcgJyk7XG4gICAgICAgIGpzb25PYmouc2NyaXB0c1snZm9ybWF0LWNvZGUnXSA9XG4gICAgICAgICAgYHBvZXRyeSBydW4gaXNvcnQgLS1wcm9maWxlIGJsYWNrICR7ZGlyTmFtZXNTdHJ9ICYmIHBvZXRyeSBydW4gYmxhY2sgJHtkaXJOYW1lc1N0cn1gO1xuICAgICAgICBpZiAoanNvbk9iai5zY3JpcHRzLmxpbnQpIHtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHMubGludCA9IGBwb2V0cnkgcnVuIGZsYWtlOCAke2Rpck5hbWVzU3RyfSAmJiAke2pzb25PYmouc2NyaXB0cy5saW50fWA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAganNvbk9iai5zY3JpcHRzLmxpbnQgPSBgcG9ldHJ5IHJ1biBmbGFrZTggJHtkaXJOYW1lc1N0cn1gO1xuICAgICAgICAgIGpzb25PYmouc2NyaXB0c1snbGludC1maXgnXSA9ICd5YXJuIGxpbnQnO1xuICAgICAgICB9XG4gICAgICAgIGpzb25PYmouc2NyaXB0cy5mb3JtYXQgPSAoanNvbk9iai5zY3JpcHRzLmZvcm1hdCA/PyAnJykgKyBgICYmIHlhcm4gZm9ybWF0LWNvZGVgO1xuICAgICAgICBwb2V0cnlEZXZEZXBlbmRlbmNpZXMucHVzaCgnYmxhY2snLCAnaXNvcnQnLCAnZmxha2U4Jyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5yZXBvc2l0b3J5IHx8IGpzb25PYmoucmVwb3NpdG9yeSkge1xuICAgIGpzb25PYmoucmVwb3NpdG9yeSA9IGZvcm1hdFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbihjb25maWcucmVwb3NpdG9yeSA/PyBqc29uT2JqLnJlcG9zaXRvcnksIGpzb25PYmoucmVwb3NpdG9yeSk7XG4gIH1cblxuICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eikge1xuICAgIGlmICghanNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddPy5zdGFydHNXaXRoKCdibGl0eiBjb2RlZ2VuJykpIHtcbiAgICAgIGpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXSA9ICdibGl0eiBjb2RlZ2VuJztcbiAgICB9IGVsc2UgaWYgKCFqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10uaW5jbHVkZXMoJ2JsaXR6IHByaXNtYSBnZW5lcmF0ZScpKSB7XG4gICAgICBqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10gPSBqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10ucmVwbGFjZShcbiAgICAgICAgJ2JsaXR6IGNvZGVnZW4nLFxuICAgICAgICAnYmxpdHogY29kZWdlbiAmJiBibGl0eiBwcmlzbWEgZ2VuZXJhdGUnXG4gICAgICApO1xuICAgIH1cbiAgfSBlbHNlIGlmIChjb25maWcuZGVwZW5kaW5nLnByaXNtYSAmJiAhanNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddPy5zdGFydHNXaXRoKCdwcmlzbWEgZ2VuZXJhdGUnKSkge1xuICAgIGpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXSA9ICdwcmlzbWEgZ2VuZXJhdGUnO1xuICB9XG5cbiAgaWYgKCFqc29uT2JqLmRlcGVuZGVuY2llcy5wcmV0dGllcikge1xuICAgIC8vIEJlY2F1c2UgQHR5cGVzL3ByZXR0aWVyIGJsb2NrcyBwcmV0dGllciBleGVjdXRpb24uXG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAdHlwZXMvcHJldHRpZXInXTtcbiAgfVxuXG4gIGlmIChPYmplY3Qua2V5cyhqc29uT2JqLmRlcGVuZGVuY2llcykubGVuZ3RoID09PSAwKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzO1xuICB9XG4gIGlmIChPYmplY3Qua2V5cyhqc29uT2JqLmRldkRlcGVuZGVuY2llcykubGVuZ3RoID09PSAwKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzO1xuICB9XG4gIGlmIChPYmplY3Qua2V5cyhqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgIGRlbGV0ZSBqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXM7XG4gIH1cblxuICBhd2FpdCB1cGRhdGVQcml2YXRlUGFja2FnZXMoanNvbk9iaik7XG5cbiAgaWYgKGNvbmZpZy5pc0J1bikgZGVsZXRlIGpzb25PYmoucGFja2FnZU1hbmFnZXI7XG4gIGxldCBuZXdKc29uVGV4dCA9IEpTT04uc3RyaW5naWZ5KGpzb25PYmopO1xuICBuZXdKc29uVGV4dCA9IGF3YWl0IGZpeFNjcmlwdE5hbWVzKGpzb25PYmouc2NyaXB0cywgbmV3SnNvblRleHQsIGNvbmZpZyk7XG4gIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShmaWxlUGF0aCwgbmV3SnNvblRleHQpO1xuXG4gIGlmICghc2tpcEFkZGluZ0RlcHMpIHtcbiAgICAvLyBXZSBjYW5ub3QgYWRkIGRlcGVuZGVuY2llcyB3aGljaCBhcmUgYWxyZWFkeSBpbmNsdWRlZCBpbiBkZXZEZXBlbmRlbmNpZXMuXG4gICAgZGVwZW5kZW5jaWVzID0gZGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhanNvbk9iai5kZXZEZXBlbmRlbmNpZXM/LltkZXBdKTtcbiAgICBpZiAoZGVwZW5kZW5jaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHVuaXF1ZURlcGVuZGVuY2llcyA9IFsuLi5uZXcgU2V0KGRlcGVuZGVuY2llcyldO1xuICAgICAgY29uc3QgZGVwZW5kZW5jeVNwZWNpZmllcnMgPSB1bmlxdWVEZXBlbmRlbmNpZXMubWFwKChkZXBlbmRlbmN5KSA9PiBnZXREZXBlbmRlbmN5U3BlY2lmaWVyKGRlcGVuZGVuY3kpKTtcbiAgICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ3JlbW92ZScsIC4uLnVuaXF1ZURlcGVuZGVuY2llc10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICAgICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ2FkZCcsICctLWV4YWN0JywgLi4uZGVwZW5kZW5jeVNwZWNpZmllcnNdLCBjb25maWcuZGlyUGF0aCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJbnRlbnRpb25hbGx5IG9taXQgdmVyc2lvbnMgdG8gdXBkYXRlIGRlcGVuZGVuY2llcyB0byB0aGUgbGF0ZXN0IHZlcnNpb25zIHdpdGggWWFybi5cbiAgICAgICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ2FkZCcsIC4uLmRlcGVuZGVuY3lTcGVjaWZpZXJzXSwgY29uZmlnLmRpclBhdGgpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBXZSBjYW5ub3QgYWRkIGRldkRlcGVuZGVuY2llcyB3aGljaCBhcmUgYWxyZWFkeSBpbmNsdWRlZCBpbiBkZXBlbmRlbmNpZXMuXG4gICAgZGV2RGVwZW5kZW5jaWVzID0gZGV2RGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhanNvbk9iai5kZXBlbmRlbmNpZXM/LltkZXBdKTtcbiAgICBpZiAoZGV2RGVwZW5kZW5jaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHVuaXF1ZURldkRlcGVuZGVuY2llcyA9IFsuLi5uZXcgU2V0KGRldkRlcGVuZGVuY2llcyldO1xuICAgICAgY29uc3QgZGV2RGVwZW5kZW5jeVNwZWNpZmllcnMgPSB1bmlxdWVEZXZEZXBlbmRlbmNpZXMubWFwKChkZXBlbmRlbmN5KSA9PiBnZXREZXBlbmRlbmN5U3BlY2lmaWVyKGRlcGVuZGVuY3kpKTtcbiAgICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ3JlbW92ZScsIC4uLnVuaXF1ZURldkRlcGVuZGVuY2llc10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICAgICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ2FkZCcsICctRCcsICctLWV4YWN0JywgLi4uZGV2RGVwZW5kZW5jeVNwZWNpZmllcnNdLCBjb25maWcuZGlyUGF0aCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJbnRlbnRpb25hbGx5IG9taXQgdmVyc2lvbnMgdG8gdXBkYXRlIGRlcGVuZGVuY2llcyB0byB0aGUgbGF0ZXN0IHZlcnNpb25zIHdpdGggWWFybi5cbiAgICAgICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ2FkZCcsICctRCcsIC4uLmRldkRlcGVuZGVuY3lTcGVjaWZpZXJzXSwgY29uZmlnLmRpclBhdGgpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocG9ldHJ5RGV2RGVwZW5kZW5jaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHNwYXduU3luYygncG9ldHJ5JywgWydhZGQnLCAnLS1ncm91cCcsICdkZXYnLCAuLi5uZXcgU2V0KHBvZXRyeURldkRlcGVuZGVuY2llcyldLCBjb25maWcuZGlyUGF0aCk7XG4gICAgfVxuICB9XG59XG5cbi8vIFRPRE86IHJlbW92ZSB0aGUgZm9sbG93aW5nIG1pZ3JhdGlvbiBjb2RlIGluIGZ1dHVyZVxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlRGVwcmVjYXRlZFN0dWZmKFxuICBqc29uT2JqOiBTZXRSZXF1aXJlZDxQYWNrYWdlSnNvbiwgJ3NjcmlwdHMnIHwgJ2RlcGVuZGVuY2llcycgfCAnZGV2RGVwZW5kZW5jaWVzJz5cbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoanNvbk9iai5hdXRob3IgPT09ICdXaWxsQm9vc3RlciBMTEMnKSB7XG4gICAganNvbk9iai5hdXRob3IgPSAnV2lsbEJvb3N0ZXIgSW5jLic7XG4gIH1cbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snc29ydC1wYWNrYWdlLWpzb24nXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snc29ydC1hbGwtcGFja2FnZS1qc29uJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3R5cGVjaGVjay93YXJuJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3R5cGVjaGVjazpnZW4tY29kZSddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWyd0eXBlY2hlY2s6Y29kZWdlbiddO1xuICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXMudHNsaWI7XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL2VzbGludC1jb25maWcnXTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1yZWFjdCddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9yZW5vdmF0ZS1jb25maWcnXTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvdHNjb25maWcnXTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydlc2xpbnQtaW1wb3J0LXJlc29sdmVyLW5vZGUnXTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydlc2xpbnQtcGx1Z2luLXByZXR0aWVyJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5sZXJuYTtcbiAgLy8gVG8gaW5zdGFsbCB0aGUgbGF0ZXN0IHBpbnN0XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5waW5zdDtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snZmx1dHRlci1mb3JtYXQnXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snZm9ybWF0LWZsdXR0ZXInXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sncHl0aG9uLWZvcm1hdCddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydmb3JtYXQtcHl0aG9uJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucHJldHRpZXI7XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2NoZWNrLWFsbCddO1xuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oJ2xlcm5hLmpzb24nLCB7IGZvcmNlOiB0cnVlIH0pKTtcblxuICAvLyBNaWdyYXRlIGZyb20gRVNMaW50IGxlZ2FjeSBjb25maWdzIHRvIGZsYXQgY29uZmlncyxcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAdHlwZXNjcmlwdC1lc2xpbnQvZXNsaW50LXBsdWdpbiddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B0eXBlc2NyaXB0LWVzbGludC9wYXJzZXInXTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydlc2xpbnQtcGx1Z2luLWltcG9ydCddO1xufVxuXG5mdW5jdGlvbiBnZXREZXBlbmRlbmN5U3BlY2lmaWVyKGRlcGVuZGVuY3k6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBnZXRQaW5uZWREZXBlbmRlbmN5U3BlY2lmaWVyKGRlcGVuZGVuY3kpID8/IGRlcGVuZGVuY3k7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbihcbiAgcmVwb3NpdG9yeTogUGFja2FnZUpzb25bJ3JlcG9zaXRvcnknXSxcbiAgZXhpc3RpbmdSZXBvc2l0b3J5PzogUGFja2FnZUpzb25bJ3JlcG9zaXRvcnknXVxuKTogUGFja2FnZUpzb25bJ3JlcG9zaXRvcnknXSB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRSZXBvc2l0b3J5ID0gbm9ybWFsaXplUmVwb3NpdG9yeVVybEZvclBhY2thZ2VKc29uKHJlcG9zaXRvcnkpO1xuICBpZiAobm9ybWFsaXplZFJlcG9zaXRvcnkpIHtcbiAgICByZXR1cm4gYnVpbGROb3JtYWxpemVkUmVwb3NpdG9yeUZvclBhY2thZ2VKc29uKG5vcm1hbGl6ZWRSZXBvc2l0b3J5LCByZXBvc2l0b3J5LCBleGlzdGluZ1JlcG9zaXRvcnkpO1xuICB9XG5cbiAgY29uc3Qgbm9ybWFsaXplZEV4aXN0aW5nUmVwb3NpdG9yeSA9IG5vcm1hbGl6ZVJlcG9zaXRvcnlVcmxGb3JQYWNrYWdlSnNvbihleGlzdGluZ1JlcG9zaXRvcnkpO1xuICBpZiAobm9ybWFsaXplZEV4aXN0aW5nUmVwb3NpdG9yeSkge1xuICAgIHJldHVybiBidWlsZE5vcm1hbGl6ZWRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24obm9ybWFsaXplZEV4aXN0aW5nUmVwb3NpdG9yeSwgZXhpc3RpbmdSZXBvc2l0b3J5KTtcbiAgfVxuXG4gIHJldHVybiByZXBvc2l0b3J5O1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVSZXBvc2l0b3J5VXJsRm9yUGFja2FnZUpzb24ocmVwb3NpdG9yeTogUGFja2FnZUpzb25bJ3JlcG9zaXRvcnknXSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICh0eXBlb2YgcmVwb3NpdG9yeSA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAoIXJlcG9zaXRvcnkuc3RhcnRzV2l0aCgnZ2l0aHViOicpKSByZXR1cm47XG5cbiAgICBjb25zdCBbb3duZXIsIHJlcG9dID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKHJlcG9zaXRvcnkpO1xuICAgIGlmICghb3duZXIgfHwgIXJlcG8pIHJldHVybjtcbiAgICByZXR1cm4gYGdpdCtodHRwczovL2dpdGh1Yi5jb20vJHtvd25lcn0vJHtyZXBvfS5naXRgO1xuICB9XG5cbiAgY29uc3QgcmVwb3NpdG9yeVVybCA9IHJlcG9zaXRvcnk/LnVybDtcbiAgaWYgKHR5cGVvZiByZXBvc2l0b3J5VXJsICE9PSAnc3RyaW5nJykgcmV0dXJuO1xuXG4gIGNvbnN0IG1hdGNoZWQgPSAvXig/OmdpdFxcKyk/aHR0cHM6XFwvXFwvZ2l0aHViXFwuY29tXFwvKFteL10rKVxcLyhbXi9dKz8pKD86XFwuZ2l0KT8kL3UuZXhlYyhyZXBvc2l0b3J5VXJsKTtcbiAgaWYgKCFtYXRjaGVkKSByZXR1cm47XG5cbiAgY29uc3QgWywgb3duZXIsIHJlcG9dID0gbWF0Y2hlZDtcbiAgcmV0dXJuIGBnaXQraHR0cHM6Ly9naXRodWIuY29tLyR7b3duZXJ9LyR7cmVwb30uZ2l0YDtcbn1cblxuZnVuY3Rpb24gYnVpbGROb3JtYWxpemVkUmVwb3NpdG9yeUZvclBhY2thZ2VKc29uKFxuICBub3JtYWxpemVkVXJsOiBzdHJpbmcsXG4gIHJlcG9zaXRvcnk6IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J10sXG4gIGV4aXN0aW5nUmVwb3NpdG9yeT86IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J11cbik6IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J10ge1xuICBjb25zdCByZXBvc2l0b3J5T2JqID1cbiAgICB0eXBlb2YgcmVwb3NpdG9yeSA9PT0gJ29iamVjdCdcbiAgICAgID8gcmVwb3NpdG9yeVxuICAgICAgOiB0eXBlb2YgZXhpc3RpbmdSZXBvc2l0b3J5ID09PSAnb2JqZWN0J1xuICAgICAgICA/IGV4aXN0aW5nUmVwb3NpdG9yeVxuICAgICAgICA6IHVuZGVmaW5lZDtcblxuICByZXR1cm4ge1xuICAgIC4uLnJlcG9zaXRvcnlPYmosXG4gICAgdHlwZTogJ2dpdCcsXG4gICAgdXJsOiBub3JtYWxpemVkVXJsLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVTY3JpcHRzKGNvbmZpZzogUGFja2FnZUNvbmZpZywgb2xkU2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgY29uc3QgaGFzVHlwZWNoZWNrID0gY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcztcbiAgICBjb25zdCBzY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgJ2NoZWNrLWFsbC1mb3ItYWknOiAnYnVuIHJ1biBjaGVjay1mb3ItYWkgJiYgYnVuIHJ1biB0ZXN0JyxcbiAgICAgICdjaGVjay1mb3ItYWknOiBgYnVuIHJ1biBjbGVhbnVwJHtoYXNUeXBlY2hlY2sgPyAnICYmIGJ1biBydW4gdHlwZWNoZWNrJyA6ICcnfWAsXG4gICAgICBjbGVhbnVwOiAnYnVuIC0tYnVuIHdiIGxpbnQgLS1maXggLS1mb3JtYXQnLFxuICAgICAgZm9ybWF0OiBgYnVuIC0tYnVuIHdiIGxpbnQgLS1mb3JtYXRgLFxuICAgICAgbGludDogYGJ1biAtLWJ1biB3YiBsaW50YCxcbiAgICAgICdsaW50LWZpeCc6ICdidW4gLS1idW4gd2IgbGludCAtLWZpeCcsXG4gICAgICB0ZXN0OiAnYnVuIHdiIHRlc3QnLFxuICAgICAgdHlwZWNoZWNrOiAnYnVuIC0tYnVuIHdiIHR5cGVjaGVjaycsXG4gICAgfTtcbiAgICBpZiAoIWhhc1R5cGVjaGVjaykge1xuICAgICAgZGVsZXRlIHNjcmlwdHMudHlwZWNoZWNrO1xuICAgIH1cbiAgICByZXR1cm4gc2NyaXB0cztcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBoYXNUeXBlY2hlY2sgPSBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzO1xuICAgIGNvbnN0IG9sZFRlc3QgPSBvbGRTY3JpcHRzLnRlc3Q7XG4gICAgbGV0IHNjcmlwdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAnY2hlY2stYWxsLWZvci1haSc6ICd5YXJuIGNoZWNrLWZvci1haSAmJiB5YXJuIHRlc3QnLFxuICAgICAgJ2NoZWNrLWZvci1haSc6IGB5YXJuIGZvcm1hdCA+IC9kZXYvbnVsbCAyPiAvZGV2L251bGwgfHwgdHJ1ZSR7XG4gICAgICAgIGhhc1R5cGVjaGVjayA/ICcgJiYgeWFybiB0eXBlY2hlY2snIDogJydcbiAgICAgIH0gJiYgeWFybiBsaW50LWZpeCAtLXF1aWV0YCxcbiAgICAgIGNsZWFudXA6ICd5YXJuIGZvcm1hdCAmJiB5YXJuIGxpbnQtZml4JyxcbiAgICAgIGZvcm1hdDogYHNvcnQtcGFja2FnZS1qc29uICYmIHlhcm4gcHJldHRpZnlgLFxuICAgICAgbGludDogYGVzbGludCAtLWNvbG9yYCxcbiAgICAgICdsaW50LWZpeCc6ICd5YXJuIGxpbnQgLS1maXgnLFxuICAgICAgcHJldHRpZnk6IGBwcmV0dGllciAtLWNhY2hlIC0tY29sb3IgLS13cml0ZSBcIioqL3suKi8sfSoueyR7ZXh0ZW5zaW9ucy5wcmV0dGllci5qb2luKCcsJyl9fVwiIFwiISoqL3Rlc3R7LSwvfWZpeHR1cmVzLyoqXCJgLFxuICAgICAgdHlwZWNoZWNrOiAndHNjIC0tbm9FbWl0JyxcbiAgICB9O1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMpIHtcbiAgICAgIHNjcmlwdHMgPSBtZXJnZShcbiAgICAgICAgeyAuLi5zY3JpcHRzIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBmb3JtYXQ6IGBzb3J0LXBhY2thZ2UtanNvbiAmJiB5YXJuIHByZXR0aWZ5ICYmIHlhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsIC0tcGFyYWxsZWwgLS12ZXJib3NlIHJ1biBmb3JtYXRgLFxuICAgICAgICAgIGxpbnQ6IGB5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCAtLXBhcmFsbGVsIC0tdmVyYm9zZSBydW4gbGludGAsXG4gICAgICAgICAgJ2xpbnQtZml4JzogJ3lhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsIC0tcGFyYWxsZWwgLS12ZXJib3NlIHJ1biBsaW50LWZpeCcsXG4gICAgICAgICAgcHJldHRpZnk6IGBwcmV0dGllciAtLWNhY2hlIC0tY29sb3IgLS13cml0ZSBcIioqL3suKi8sfSoueyR7ZXh0ZW5zaW9ucy5wcmV0dGllci5qb2luKFxuICAgICAgICAgICAgJywnXG4gICAgICAgICAgKX19XCIgXCIhKiovcGFja2FnZXMvKipcIiBcIiEqKi90ZXN0ey0sL31maXh0dXJlcy8qKlwiYCxcbiAgICAgICAgICAvLyBDST0xIHByZXZlbnRzIHZpdGVzdCBmcm9tIGVuYWJsaW5nIHdhdGNoLlxuICAgICAgICAgIC8vIEZPUkNFX0NPTE9SPTMgbWFrZSB3YiBlbmFibGUgY29sb3Igb3V0cHV0LlxuICAgICAgICAgIHRlc3Q6ICdDST0xIEZPUkNFX0NPTE9SPTMgeWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwgLS12ZXJib3NlIHJ1biB0ZXN0JyxcbiAgICAgICAgICB0eXBlY2hlY2s6ICd5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCAtLXBhcmFsbGVsIC0tdmVyYm9zZSBydW4gdHlwZWNoZWNrJyxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHlyaWdodCkge1xuICAgICAgc2NyaXB0cy50eXBlY2hlY2sgPSBzY3JpcHRzLnR5cGVjaGVjayA/IGAke3NjcmlwdHMudHlwZWNoZWNrfSAmJiBgIDogJyc7XG4gICAgICBzY3JpcHRzLnR5cGVjaGVjayArPSAncHlyaWdodCc7XG4gICAgfVxuICAgIGlmIChvbGRUZXN0Py5pbmNsdWRlcygnd2IgdGVzdCcpKSB7XG4gICAgICBzY3JpcHRzLnRlc3QgPSBvbGRUZXN0O1xuICAgIH1cblxuICAgIGlmICghaGFzVHlwZWNoZWNrKSB7XG4gICAgICBkZWxldGUgc2NyaXB0cy50eXBlY2hlY2s7XG4gICAgfSBlbHNlIGlmIChjb25maWcuZGVwZW5kaW5nLndiKSB7XG4gICAgICBzY3JpcHRzLnR5cGVjaGVjayA9ICd3YiB0eXBlY2hlY2snO1xuICAgIH1cbiAgICByZXR1cm4gc2NyaXB0cztcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVByZXR0aWVyU3VmZml4KGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICcucHJldHRpZXJpZ25vcmUnKTtcbiAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gIGNvbnN0IGluZGV4ID0gZXhpc3RpbmdDb250ZW50LmluZGV4T2YoaWdub3JlRmlsZVV0aWwuc2VwYXJhdG9yUHJlZml4KTtcbiAgaWYgKGluZGV4ID09PSAtMSkgcmV0dXJuICcnO1xuXG4gIGNvbnN0IG9yaWdpbmFsQ29udGVudCA9IGV4aXN0aW5nQ29udGVudC5zbGljZSgwLCBpbmRleCk7XG4gIGNvbnN0IGxpbmVzID0gb3JpZ2luYWxDb250ZW50XG4gICAgLnNwbGl0KCdcXG4nKVxuICAgIC5tYXAoKGxpbmUpID0+IHtcbiAgICAgIGNvbnN0IG5ld0xpbmUgPSBsaW5lLnRyaW0oKTtcbiAgICAgIHJldHVybiBuZXdMaW5lLmVuZHNXaXRoKCcvJykgPyBuZXdMaW5lLnNsaWNlKDAsIC0xKSA6IG5ld0xpbmU7XG4gICAgfSlcbiAgICAuZmlsdGVyKChsKSA9PiBsICYmICFsLnN0YXJ0c1dpdGgoJyMnKSAmJiAhbC5pbmNsdWRlcygnLycpKTtcblxuICByZXR1cm4gYCR7bGluZXMubWFwKChsaW5lKSA9PiBgIFwiISoqLyR7bGluZX0vKipcImApLmpvaW4oJycpfSB8fCB0cnVlYDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZml4U2NyaXB0TmFtZXMoXG4gIHNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMsXG4gIG5ld0pzb25UZXh0OiBzdHJpbmcsXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZ1xuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3Qgb2xkQW5kTmV3U2NyaXB0TmFtZXM6IFtzdHJpbmcsIHN0cmluZ11bXSA9IFtdO1xuICBmb3IgKGNvbnN0IFtrZXldIG9mIE9iamVjdC5rZXlzKHNjcmlwdHMpKSB7XG4gICAgaWYgKGtleSAmJiAha2V5LnN0YXJ0c1dpdGgoJzonKSAmJiBrZXkuaW5jbHVkZXMoJzonKSkge1xuICAgICAgb2xkQW5kTmV3U2NyaXB0TmFtZXMucHVzaChba2V5LCBrZXkucmVwbGFjZUFsbCgnOicsICctJyldKTtcbiAgICB9XG4gIH1cbiAgaWYgKG9sZEFuZE5ld1NjcmlwdE5hbWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG5ld0pzb25UZXh0O1xuXG4gIGZvciAoY29uc3QgW29sZE5hbWUsIG5ld05hbWVdIG9mIG9sZEFuZE5ld1NjcmlwdE5hbWVzKSB7XG4gICAgbmV3SnNvblRleHQgPSBuZXdKc29uVGV4dC5yZXBsYWNlQWxsKG9sZE5hbWUsIG5ld05hbWUpO1xuICB9XG4gIGNvbnN0IGZpbGVzID0gYXdhaXQgZmcuZ2xvYihbJyoqLyoue21kLGNqcyxtanMsanMsanN4LGN0cyxtdHMsdHMsdHN4fScsICcqKi9Eb2NrZXJmaWxlJ10sIHtcbiAgICBjd2Q6IGNvbmZpZy5kaXJQYXRoLFxuICAgIGRvdDogdHJ1ZSxcbiAgICBpZ25vcmU6IGdsb2JJZ25vcmUsXG4gIH0pO1xuICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oY29uZmlnLmRpclBhdGgsIGZpbGUpO1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgbGV0IG5ld0NvbnRlbnQgPSBvbGRDb250ZW50O1xuICAgICAgZm9yIChjb25zdCBbb2xkTmFtZSwgbmV3TmFtZV0gb2Ygb2xkQW5kTmV3U2NyaXB0TmFtZXMpIHtcbiAgICAgICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZUFsbChvbGROYW1lLCBuZXdOYW1lKTtcbiAgICAgIH1cbiAgICAgIGlmIChuZXdDb250ZW50ICE9PSBvbGRDb250ZW50KSB7XG4gICAgICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICByZXR1cm4gbmV3SnNvblRleHQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVByaXZhdGVQYWNrYWdlcyhqc29uT2JqOiBQYWNrYWdlSnNvbik6IFByb21pc2U8dm9pZD4ge1xuICBqc29uT2JqLmRlcGVuZGVuY2llcyA9IGpzb25PYmouZGVwZW5kZW5jaWVzID8/IHt9O1xuICBqc29uT2JqLmRldkRlcGVuZGVuY2llcyA9IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICBjb25zdCBwYWNrYWdlTmFtZXMgPSBuZXcgU2V0KFsuLi5PYmplY3Qua2V5cyhqc29uT2JqLmRlcGVuZGVuY2llcyksIC4uLk9iamVjdC5rZXlzKGpzb25PYmouZGV2RGVwZW5kZW5jaWVzKV0pO1xuICBpZiAocGFja2FnZU5hbWVzLmhhcygnQHdpbGxib29zdGVyL2F1dGgnKSAmJiAhaXNXb3Jrc3BhY2VQYWNrYWdlKGpzb25PYmosICdAd2lsbGJvb3N0ZXIvYXV0aCcpKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvYXV0aCddO1xuICAgIGNvbnN0IGNvbW1pdEhhc2ggPSBhd2FpdCBnZXRMYXRlc3RDb21taXRIYXNoKCdXaWxsQm9vc3RlckxhYicsICdhdXRoJyk7XG4gICAganNvbk9iai5kZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9hdXRoJ10gPSBgZ2l0QGdpdGh1Yi5jb206V2lsbEJvb3N0ZXJMYWIvYXV0aC5naXQjJHtjb21taXRIYXNofWA7XG4gIH1cbiAgaWYgKHBhY2thZ2VOYW1lcy5oYXMoJ0BkaXNjb3JkLWJvdC9zaGFyZWQnKSAmJiAhaXNXb3Jrc3BhY2VQYWNrYWdlKGpzb25PYmosICdAZGlzY29yZC1ib3Qvc2hhcmVkJykpIHtcbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0BkaXNjb3JkLWJvdC9zaGFyZWQnXTtcbiAgICBjb25zdCBjb21taXRIYXNoID0gYXdhaXQgZ2V0TGF0ZXN0Q29tbWl0SGFzaCgnV2lsbEJvb3N0ZXJMYWInLCAnZGlzY29yZC1ib3QnKTtcbiAgICBqc29uT2JqLmRlcGVuZGVuY2llc1snQGRpc2NvcmQtYm90L3NoYXJlZCddID0gYGdpdEBnaXRodWIuY29tOldpbGxCb29zdGVyTGFiL2Rpc2NvcmQtYm90LmdpdCMke2NvbW1pdEhhc2h9YDtcbiAgfVxuXG4gIGlmIChwYWNrYWdlTmFtZXMuaGFzKCdAd2lsbGJvb3N0ZXIvY29kZS1hbmFseXplcicpICYmICFpc1dvcmtzcGFjZVBhY2thZ2UoanNvbk9iaiwgJ0B3aWxsYm9vc3Rlci9jb2RlLWFuYWx5emVyJykpIHtcbiAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9jb2RlLWFuYWx5emVyJ107XG4gICAgY29uc3QgY29tbWl0SGFzaCA9IGF3YWl0IGdldExhdGVzdENvbW1pdEhhc2goJ1dpbGxCb29zdGVyTGFiJywgJ2NvZGUtYW5hbHl6ZXInKTtcbiAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL2NvZGUtYW5hbHl6ZXInXSA9XG4gICAgICBgZ2l0QGdpdGh1Yi5jb206V2lsbEJvb3N0ZXJMYWIvY29kZS1hbmFseXplci5naXQjJHtjb21taXRIYXNofWA7XG4gIH1cbiAgaWYgKHBhY2thZ2VOYW1lcy5oYXMoJ0B3aWxsYm9vc3Rlci9qdWRnZScpICYmICFpc1dvcmtzcGFjZVBhY2thZ2UoanNvbk9iaiwgJ0B3aWxsYm9vc3Rlci9qdWRnZScpKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvanVkZ2UnXTtcbiAgICBjb25zdCBjb21taXRIYXNoID0gYXdhaXQgZ2V0TGF0ZXN0Q29tbWl0SGFzaCgnV2lsbEJvb3N0ZXJMYWInLCAnanVkZ2UnKTtcbiAgICBqc29uT2JqLmRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL2p1ZGdlJ10gPSBgZ2l0QGdpdGh1Yi5jb206V2lsbEJvb3N0ZXJMYWIvanVkZ2UuZ2l0IyR7Y29tbWl0SGFzaH1gO1xuICB9XG4gIGlmIChwYWNrYWdlTmFtZXMuaGFzKCdAd2lsbGJvb3N0ZXIvbGxtLXByb3h5JykgJiYgIWlzV29ya3NwYWNlUGFja2FnZShqc29uT2JqLCAnQHdpbGxib29zdGVyL2xsbS1wcm94eScpKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvbGxtLXByb3h5J107XG4gICAgY29uc3QgY29tbWl0SGFzaCA9IGF3YWl0IGdldExhdGVzdENvbW1pdEhhc2goJ1dpbGxCb29zdGVyTGFiJywgJ2xsbS1wcm94eScpO1xuICAgIGpzb25PYmouZGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvbGxtLXByb3h5J10gPSBgZ2l0QGdpdGh1Yi5jb206V2lsbEJvb3N0ZXJMYWIvbGxtLXByb3h5LmdpdCMke2NvbW1pdEhhc2h9YDtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc1dvcmtzcGFjZVBhY2thZ2UoanNvbk9iajogUGFja2FnZUpzb24sIHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIChqc29uT2JqLmRldkRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSB8fCBqc29uT2JqLmRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSB8fCAnJykuaW5jbHVkZXMoJ3dvcmtzcGFjZScpO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUc2NvbmZpZ0V4dGVuZHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgcmV0dXJuICdAdHNjb25maWcvYnVuL3RzY29uZmlnLmpzb24nO1xuICB9XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgcmV0dXJuICdAdHNjb25maWcvcmVhY3QtbmF0aXZlL3RzY29uZmlnLmpzb24nO1xuICB9XG4gIHJldHVybiBbJ0B0c2NvbmZpZy9ub2RlLWx0cy90c2NvbmZpZy5qc29uJywgJ0B0c2NvbmZpZy9ub2RlLXRzL3RzY29uZmlnLmpzb24nXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmdbXSB7XG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICByZXR1cm4gWydAdHNjb25maWcvYnVuJ107XG4gIH1cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICByZXR1cm4gWydAdHNjb25maWcvcmVhY3QtbmF0aXZlJ107XG4gIH1cbiAgcmV0dXJuIFsnQHRzY29uZmlnL25vZGUtbHRzJywgJ0B0c2NvbmZpZy9ub2RlLXRzJ107XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeWFtbCBmcm9tICdqcy15YW1sJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuXG5pbXBvcnQgeyBnZW5lcmF0ZVNjcmlwdHMgfSBmcm9tICcuL3BhY2thZ2VKc29uLmpzJztcblxuaW50ZXJmYWNlIExlZnRob29rU2V0dGluZ3Mge1xuICAncG9zdC1tZXJnZSc6IHtcbiAgICBzY3JpcHRzOiB7XG4gICAgICAncHJlcGFyZS5zaCc6IHtcbiAgICAgICAgcnVubmVyOiAnYmFzaCc7XG4gICAgICB9O1xuICAgIH07XG4gIH07XG4gICdwcmUtY29tbWl0Jzoge1xuICAgIGNvbW1hbmRzOiB7XG4gICAgICBjbGVhbnVwOiB7XG4gICAgICAgIGdsb2I6IHN0cmluZztcbiAgICAgICAgcnVuOiBzdHJpbmc7XG4gICAgICB9O1xuICAgICAgJ2NoZWNrLW1pZ3JhdGlvbnMnOiB7XG4gICAgICAgIGdsb2I6IHN0cmluZztcbiAgICAgICAgcnVuOiBzdHJpbmc7XG4gICAgICB9O1xuICAgIH07XG4gIH07XG4gICdwcmUtcHVzaCc6IHtcbiAgICBzY3JpcHRzOiB7XG4gICAgICAnY2hlY2suc2gnOiB7XG4gICAgICAgIHJ1bm5lcjogJ2Jhc2gnO1xuICAgICAgfTtcbiAgICB9O1xuICB9O1xufVxuXG5jb25zdCBiYXNlU2V0dGluZ3M6IE9taXQ8TGVmdGhvb2tTZXR0aW5ncywgJ3ByZS1jb21taXQnPiA9IHtcbiAgJ3Bvc3QtbWVyZ2UnOiB7XG4gICAgc2NyaXB0czoge1xuICAgICAgJ3ByZXBhcmUuc2gnOiB7XG4gICAgICAgIHJ1bm5lcjogJ2Jhc2gnLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAncHJlLXB1c2gnOiB7XG4gICAgc2NyaXB0czoge1xuICAgICAgJ2NoZWNrLnNoJzoge1xuICAgICAgICBydW5uZXI6ICdiYXNoJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbn07XG5cbmNvbnN0IHByZUNvbW1pdFNldHRpbmdzOiBMZWZ0aG9va1NldHRpbmdzWydwcmUtY29tbWl0J10gPSB7XG4gIGNvbW1hbmRzOiB7XG4gICAgY2xlYW51cDoge1xuICAgICAgZ2xvYjogJycsXG4gICAgICBydW46ICcnLFxuICAgIH0sXG4gICAgJ2NoZWNrLW1pZ3JhdGlvbnMnOiB7XG4gICAgICBnbG9iOiAnKiovbWlncmF0aW9uLnNxbCcsXG4gICAgICBydW46IGBcbmlmIGdyZXAgLXEgJ1dhcm5pbmdzOicge3N0YWdlZF9maWxlc307IHRoZW5cbiAgZWNobyBcIk1pZ3JhdGlvbiBTUUwgZmlsZXMgKHtzdGFnZWRfZmlsZXN9KSBjb250YWluIHdhcm5pbmdzISBQbGVhc2Ugc29sdmUgdGhlIHdhcm5pbmdzIGFuZCBjb21taXQgYWdhaW4uXCJcbiAgZXhpdCAxXG5maVxuYC50cmltKCksXG4gICAgfSxcbiAgfSxcbn07XG5cbmNvbnN0IHNjcmlwdHMgPSB7XG4gIHBvc3RNZXJnZTogYFxuIyEvYmluL2Jhc2hcblxuY2hhbmdlZF9maWxlcz1cIiQoZ2l0IGRpZmYtdHJlZSAtciAtLW5hbWUtb25seSAtLW5vLWNvbW1pdC1pZCBPUklHX0hFQUQgSEVBRClcIlxuXG5ydW5faWZfY2hhbmdlZCgpIHtcbiAgaWYgZWNobyBcIiRjaGFuZ2VkX2ZpbGVzXCIgfCBncmVwIC0tcXVpZXQgLUUgXCIkMVwiOyB0aGVuXG4gICAgZXZhbCBcIiQyXCJcbiAgZmlcbn1cbmAudHJpbSgpLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlTGVmdGhvb2tVcGRhdGluZ1BhY2thZ2VKc29uKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlTGVmdGhvb2tVcGRhdGluZ1BhY2thZ2VKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IGNvcmUoY29uZmlnKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcubGVmdGhvb2snKTtcbiAgY29uc3QgaHVza3lEaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmh1c2t5Jyk7XG4gIGNvbnN0IGhhc0h1c2t5RGlyID0gZnMuZXhpc3RzU3luYyhodXNreURpclBhdGgpO1xuICBjb25zdCB7IHR5cGVjaGVjayB9ID0gZ2VuZXJhdGVTY3JpcHRzKGNvbmZpZywge30pO1xuICBjb25zdCBzZXR0aW5nczogUGFydGlhbDxMZWZ0aG9va1NldHRpbmdzPiA9IHtcbiAgICAuLi5iYXNlU2V0dGluZ3MsXG4gICAgJ3ByZS1jb21taXQnOiB7XG4gICAgICAuLi5wcmVDb21taXRTZXR0aW5ncyxcbiAgICAgIGNvbW1hbmRzOiB7XG4gICAgICAgIC4uLnByZUNvbW1pdFNldHRpbmdzLmNvbW1hbmRzLFxuICAgICAgICBjbGVhbnVwOiB7XG4gICAgICAgICAgLi4ucHJlQ29tbWl0U2V0dGluZ3MuY29tbWFuZHMuY2xlYW51cCxcbiAgICAgICAgICBnbG9iOiBnZXRDbGVhbnVwR2xvYnMoY29uZmlnKSxcbiAgICAgICAgICBydW46IGdldENsZWFudXBDb21tYW5kKGNvbmZpZyksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIH07XG4gIGlmICghdHlwZWNoZWNrKSB7XG4gICAgZGVsZXRlIHNldHRpbmdzWydwcmUtcHVzaCddO1xuICB9XG4gIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICBmcy5wcm9taXNlcy53cml0ZUZpbGUoXG4gICAgICBwYXRoLmpvaW4oY29uZmlnLmRpclBhdGgsICdsZWZ0aG9vay55bWwnKSxcbiAgICAgIHlhbWwuZHVtcChzZXR0aW5ncywge1xuICAgICAgICBsaW5lV2lkdGg6IC0xLFxuICAgICAgICBub0NvbXBhdE1vZGU6IHRydWUsXG4gICAgICAgIHN0eWxlczoge1xuICAgICAgICAgICchIW51bGwnOiAnZW1wdHknLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICApLFxuICAgIGZzLnByb21pc2VzLnJtKGRpclBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KSxcbiAgXSk7XG4gIGlmIChoYXNIdXNreURpcikge1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIGZzLnByb21pc2VzLnJtKGh1c2t5RGlyUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pLFxuICAgICAgZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmh1c2t5cmMuanNvbicpLCB7IGZvcmNlOiB0cnVlIH0pLFxuICAgIF0pO1xuICAgIHNwYXduU3luYygnZ2l0JywgWydjb25maWcnLCAnLS11bnNldCcsICdjb3JlLmhvb2tzUGF0aCddLCBjb25maWcuZGlyUGF0aCk7XG4gIH1cblxuICBpZiAodHlwZWNoZWNrKSB7XG4gICAgY29uc3QgcHJlUHVzaCA9IGdldFByZVB1c2hTY3JpcHQoY29uZmlnKTtcbiAgICBmcy5ta2RpclN5bmMocGF0aC5qb2luKGRpclBhdGgsICdwcmUtcHVzaCcpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgIGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLmpvaW4oZGlyUGF0aCwgJ3ByZS1wdXNoJywgJ2NoZWNrLnNoJyksIHByZVB1c2ggKyAnXFxuJywge1xuICAgICAgICBtb2RlOiAwbzc1NSxcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuICBjb25zdCBwb3N0TWVyZ2VDb21tYW5kID0gYCR7c2NyaXB0cy5wb3N0TWVyZ2V9XFxuXFxuJHtnZW5lcmF0ZVBvc3RNZXJnZUNvbW1hbmRzKGNvbmZpZykuam9pbignXFxuJyl9XFxuYDtcbiAgZnMubWtkaXJTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncG9zdC1tZXJnZScpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncG9zdC1tZXJnZScsICdwcmVwYXJlLnNoJyksIHBvc3RNZXJnZUNvbW1hbmQsIHtcbiAgICAgIG1vZGU6IDBvNzU1LFxuICAgIH0pXG4gICk7XG59XG5cbmZ1bmN0aW9uIGdldFByZVB1c2hTY3JpcHQoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgbGV0IHR5cGVjaGVja0NvbW1hbmQ6IHN0cmluZztcbiAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgIHR5cGVjaGVja0NvbW1hbmQgPSBjb25maWcuZGVwZW5kaW5nLndiID8gJ2J1biAtLWJ1biB3YiB0eXBlY2hlY2snIDogJ2J1biBydW4gdHlwZWNoZWNrJztcbiAgfSBlbHNlIHtcbiAgICB0eXBlY2hlY2tDb21tYW5kID0gY29uZmlnLmRlcGVuZGluZy53YiA/ICd5YXJuIHdiIHR5cGVjaGVjaycgOiAneWFybiBydW4gdHlwZWNoZWNrJztcbiAgfVxuICBpZiAoY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKSkge1xuICAgIHJldHVybiBgXG4jIS9iaW4vYmFzaFxuXG5pZiBbICQoZ2l0IGJyYW5jaCAtLXNob3ctY3VycmVudCkgPSBcIm1haW5cIiBdICYmIFsgJChnaXQgY29uZmlnIHVzZXIuZW1haWwpICE9IFwiZXhrYXp1dUBnbWFpbC5jb21cIiBdOyB0aGVuXG4gIGVjaG8gXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIlxuICBlY2hvIFwiKioqIERvbid0IHB1c2ggbWFpbiBicmFuY2ggZGlyZWN0bHkuIFVzZSBQUiEgKioqXCJcbiAgZWNobyBcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiXG4gIGV4aXQgMVxuZmlcblxuJHt0eXBlY2hlY2tDb21tYW5kfVxuYC50cmltKCk7XG4gIH1cbiAgcmV0dXJuIHR5cGVjaGVja0NvbW1hbmQ7XG59XG5cbmZ1bmN0aW9uIGdldENsZWFudXBHbG9icyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBjb25zdCBzdXBwb3J0ZWRFeHRlbnNpb25zID0gW1xuICAgIC4uLmV4dGVuc2lvbnMucHJldHRpZXIsXG4gICAgLi4uZXh0ZW5zaW9ucy5lc2xpbnQsXG4gICAgLi4uKGNvbmZpZy5kZXBlbmRpbmcud2IgfHwgY29uZmlnLmlzQnVuID8gZXh0ZW5zaW9ucy5iaW9tZSA6IFtdKSxcbiAgXTtcbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2spIHtcbiAgICBzdXBwb3J0ZWRFeHRlbnNpb25zLnB1c2goJ3B5Jyk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgc3VwcG9ydGVkRXh0ZW5zaW9ucy5wdXNoKCdkYXJ0Jyk7XG4gIH1cbiAgY29uc3QgZmlsdGVyZWRFeHRlbnNpb25zID0gWy4uLm5ldyBTZXQoc3VwcG9ydGVkRXh0ZW5zaW9ucyldXG4gICAgLmZpbHRlcigoZXh0ZW5zaW9uKSA9PiBjb25maWcuaXNCdW4gfHwgIVsnYXN0cm8nLCAnZ3FsJywgJ3N2ZWx0ZSddLmluY2x1ZGVzKGV4dGVuc2lvbikpXG4gICAgLnRvU29ydGVkKCk7XG4gIHJldHVybiBgKiovKi57JHtmaWx0ZXJlZEV4dGVuc2lvbnMuam9pbignLCcpfX1gO1xufVxuXG5mdW5jdGlvbiBnZXRDbGVhbnVwQ29tbWFuZChjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBpZiAoaGFzTG9jYWxXYldvcmtzcGFjZShjb25maWcpKSB7XG4gICAgcmV0dXJuICd5YXJuIHdvcmtzcGFjZSBAd2lsbGJvb3N0ZXIvd2Igc3RhcnQgLS13b3JraW5nLWRpciBcIiQoZ2l0IHJldi1wYXJzZSAtLXNob3ctdG9wbGV2ZWwpXCIgbGludCAtLWZpeCAtLWZvcm1hdCAtLSB7c3RhZ2VkX2ZpbGVzfSAmJiBnaXQgYWRkIC0tIHtzdGFnZWRfZmlsZXN9JztcbiAgfVxuICBpZiAoY29uZmlnLmlzQnVuIHx8IGNvbmZpZy5kZXBlbmRpbmcud2IpIHtcbiAgICBjb25zdCBwYWNrYWdlTWFuYWdlciA9IGNvbmZpZy5pc0J1biA/ICdidW4nIDogJ3lhcm4nO1xuICAgIGNvbnN0IGNvbW1hbmQgPSBjb25maWcuZGVwZW5kaW5nLndiXG4gICAgICA/IGAke2NvbmZpZy5pc0J1biA/ICdidW4gLS1idW4gd2InIDogJ3lhcm4gd2InfSBsaW50IC0tZml4IC0tZm9ybWF0IC0tIHtzdGFnZWRfZmlsZXN9YFxuICAgICAgOiBgJHtwYWNrYWdlTWFuYWdlcn0gcnVuIGZvcm1hdCAmJiAke3BhY2thZ2VNYW5hZ2VyfSBydW4gbGludC1maXhgO1xuICAgIHJldHVybiBgJHtjb21tYW5kfSAmJiBnaXQgYWRkIC0tIHtzdGFnZWRfZmlsZXN9YDtcbiAgfVxuXG4gIGNvbnN0IGVzbGludFJ1bGVTdWZmaXggPVxuICAgIGNvbmZpZy5kb2VzQ29udGFpbkpzeE9yVHN4IHx8IGNvbmZpZy5kb2VzQ29udGFpbkpzeE9yVHN4SW5QYWNrYWdlc1xuICAgICAgPyAnIC0tcnVsZSBcInsgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzOiAwIH1cIidcbiAgICAgIDogJyc7XG4gIGNvbnN0IGVzbGludFBhdHRlcm4gPSBleHRlbnNpb25zLmVzbGludC5tYXAoKGV4dGVuc2lvbikgPT4gU3RyaW5nLnJhd2BcXC4ke2V4dGVuc2lvbn0kYCkuam9pbignfCcpO1xuXG4gIHJldHVybiBTdHJpbmcucmF3YFxuZXNsaW50X2ZpbGVzPVwiJChwcmludGYgJyVzXFxuJyB7c3RhZ2VkX2ZpbGVzfSB8IGdyZXAgLUUgJygke2VzbGludFBhdHRlcm59KScgfHwgdHJ1ZSlcIlxucGFja2FnZV9qc29uX2ZpbGVzPVwiJChwcmludGYgJyVzXFxuJyB7c3RhZ2VkX2ZpbGVzfSB8IGdyZXAgLUUgJyhefC8pcGFja2FnZVxcLmpzb24kJyB8fCB0cnVlKVwiXG4ke2NvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2sgPyBTdHJpbmcucmF3YHB5dGhvbl9maWxlcz1cIiQocHJpbnRmICclc1xcbicge3N0YWdlZF9maWxlc30gfCBncmVwIC1FICdcXC5weSQnIHx8IHRydWUpXCJgIDogJyd9XG4ke2NvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sID8gU3RyaW5nLnJhd2BkYXJ0X2ZpbGVzPVwiJChwcmludGYgJyVzXFxuJyB7c3RhZ2VkX2ZpbGVzfSB8IGdyZXAgLUUgJ1xcLmRhcnQkJyB8IGdyZXAgLXYgJ2dlbmVyYXRlZCcgfCBncmVwIC12ICdcXC5mcmVlemVkXFwuZGFydCQnIHwgZ3JlcCAtdiAnXFwuZ1xcLmRhcnQkJyB8fCB0cnVlKVwiYCA6ICcnfVxuXG5ub2RlIG5vZGVfbW9kdWxlcy8uYmluL3ByZXR0aWVyIC0tY2FjaGUgLS13cml0ZSAtLWlnbm9yZS11bmtub3duIC0tIHtzdGFnZWRfZmlsZXN9XG5pZiBbIC1uIFwiJGVzbGludF9maWxlc1wiIF07IHRoZW5cbiAgbm9kZSBub2RlX21vZHVsZXMvLmJpbi9lc2xpbnQgLS1jb2xvciAtLWZpeCR7ZXNsaW50UnVsZVN1ZmZpeH0gLS0gJGVzbGludF9maWxlc1xuZmlcbmlmIFsgLW4gXCIkcGFja2FnZV9qc29uX2ZpbGVzXCIgXTsgdGhlblxuICBub2RlIG5vZGVfbW9kdWxlcy8uYmluL3NvcnQtcGFja2FnZS1qc29uIC0tICRwYWNrYWdlX2pzb25fZmlsZXNcbmZpXG4ke1xuICBjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrXG4gICAgPyBgaWYgWyAtbiBcIiRweXRob25fZmlsZXNcIiBdOyB0aGVuXG4gIHBvZXRyeSBydW4gaXNvcnQgLS1wcm9maWxlIGJsYWNrIC0tZmlsdGVyLWZpbGVzICRweXRob25fZmlsZXNcbiAgcG9ldHJ5IHJ1biBibGFjayAkcHl0aG9uX2ZpbGVzXG4gIHBvZXRyeSBydW4gZmxha2U4ICRweXRob25fZmlsZXNcbmZpYFxuICAgIDogJydcbn1cbiR7XG4gIGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sXG4gICAgPyBgaWYgWyAtbiBcIiRkYXJ0X2ZpbGVzXCIgXTsgdGhlblxuICBkYXJ0IGZvcm1hdCAkZGFydF9maWxlc1xuZmlgXG4gICAgOiAnJ1xufVxuZ2l0IGFkZCAtLSB7c3RhZ2VkX2ZpbGVzfVxuYC50cmltKCk7XG59XG5cbmZ1bmN0aW9uIGhhc0xvY2FsV2JXb3Jrc3BhY2UoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIGlmICghY29uZmlnLmlzUm9vdCkgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IGxvY2FsV2JQYWNrYWdlSnNvblBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdwYWNrYWdlcycsICd3YicsICdwYWNrYWdlLmpzb24nKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGxvY2FsV2JQYWNrYWdlSnNvblBhdGgpKSByZXR1cm4gZmFsc2U7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKGxvY2FsV2JQYWNrYWdlSnNvblBhdGgsICd1dGY4JykpIGFzIHsgbmFtZT86IHN0cmluZyB9O1xuICAgIHJldHVybiBwYWNrYWdlSnNvbi5uYW1lID09PSAnQHdpbGxib29zdGVyL3diJztcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nW10ge1xuICBjb25zdCBwb3N0TWVyZ2VDb21tYW5kczogc3RyaW5nW10gPSBbXTtcbiAgaWYgKGNvbmZpZy5oYXNWZXJzaW9uU2V0dGluZ3MpIHtcbiAgICBjb25zdCB0b29sc0NoYW5nZWRQYXR0ZXJuID0gU3RyaW5nLnJhd2AobWlzZVxcLnRvbWx8XFwubWlzZVxcLnRvbWx8XFwudG9vbC12ZXJzaW9uc3xcXC4uKy12ZXJzaW9uKWA7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiJHt0b29sc0NoYW5nZWRQYXR0ZXJufVwiIFwibWlzZSBpbnN0YWxsXCJgKTtcbiAgfVxuICBjb25zdCBpbnN0YWxsQ29tbWFuZCA9IGNvbmZpZy5pc0J1biA/ICdidW4gaW5zdGFsbCcgOiAneWFybic7XG4gIGNvbnN0IHJtTmV4dERpcmVjdG9yeSA9IGNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHwgY29uZmlnLmRlcGVuZGluZy5uZXh0ID8gJyAmJiBybSAtUmYgLm5leHQnIDogJyc7XG4gIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcInBhY2thZ2VcXC5qc29uXCIgXCIke2luc3RhbGxDb21tYW5kfSR7cm1OZXh0RGlyZWN0b3J5fVwiYCk7XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrKSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwicG9ldHJ5XFwubG9ja1wiIFwicG9ldHJ5IGluc3RhbGxcImApO1xuICB9XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6KSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIuKlxcLnByaXNtYVwiIFwibm9kZSBub2RlX21vZHVsZXMvLmJpbi9ibGl0eiBwcmlzbWEgbWlncmF0ZSBkZXBsb3lcImAsXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiLipcXC5wcmlzbWFcIiBcIm5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vYmxpdHogcHJpc21hIGdlbmVyYXRlXCJgLFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIi4qXFwucHJpc21hXCIgXCJub2RlIG5vZGVfbW9kdWxlcy8uYmluL2JsaXR6IGNvZGVnZW5cImBcbiAgICApO1xuICB9IGVsc2UgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHJpc21hKSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIuKlxcLnByaXNtYVwiIFwibm9kZSBub2RlX21vZHVsZXMvLmJpbi9kb3RlbnYgLWMgZGV2ZWxvcG1lbnQgLS0gbm9kZSBub2RlX21vZHVsZXMvLmJpbi9wcmlzbWEgbWlncmF0ZSBkZXBsb3lcImAsXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiLipcXC5wcmlzbWFcIiBcIm5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vZG90ZW52IC1jIGRldmVsb3BtZW50IC0tIG5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vcHJpc21hIGdlbmVyYXRlXCJgXG4gICAgKTtcbiAgfVxuICByZXR1cm4gcG9zdE1lcmdlQ29tbWFuZHM7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVMaW50c3RhZ2VkcmMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVMaW50c3RhZ2VkcmMnLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKGAke2NvbmZpZy5kaXJQYXRofS8ubGludHN0YWdlZHJjLmNqc2AsIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKGAke2NvbmZpZy5kaXJQYXRofS8ubGludHN0YWdlZHJjLmpzYCwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oYCR7Y29uZmlnLmRpclBhdGh9Ly5saW50c3RhZ2VkcmMuanNvbmAsIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgIF0pO1xuICB9KTtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBpZ25vcmVGaWxlVXRpbCB9IGZyb20gJy4uL3V0aWxzL2lnbm9yZUZpbGVVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBjb21tb25Db250ZW50ID0gYFxuM3JkLXBhcnR5L1xuYW5kcm9pZC9cbmlvcy9cbm5vLWZvcm1hdC9cbnRlc3QtZml4dHVyZXMvXG50ZXN0L2ZpeHR1cmVzL1xuKi5kLnRzXG4qLm1pbi5qc1xuLnlhcm4vXG4ucG5wLmpzXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQcmV0dGllcmlnbm9yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVByZXR0aWVyaWdub3JlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnByZXR0aWVyaWdub3JlJyk7XG4gICAgY29uc3QgY29udGVudCA9IChhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoKSkgPz8gJyc7XG4gICAgY29uc3QgaGVhZFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQpO1xuICAgIGNvbnN0IHRhaWxVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldFRhaWxVc2VyQ29udGVudChjb250ZW50KTtcblxuICAgIGNvbnN0IGdpdGlnbm9yZUZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGlnbm9yZScpO1xuICAgIGNvbnN0IGdpdGlnbm9yZUNvbnRlbnQgPSAoYXdhaXQgaWdub3JlRmlsZVV0aWwucmVhZEdpdGlnbm9yZVdpdGhvdXRTZXBhcmF0b3JzKGdpdGlnbm9yZUZpbGVQYXRoKSkgfHwgJyc7XG5cbiAgICBsZXQgYWRkaXRpb25hbENvbnRlbnQgPSAnJztcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgIGFkZGl0aW9uYWxDb250ZW50ID0gYFxuYW5kcm9pZC9hcHAvXG5pb3MvUnVubmVyL0Fzc2V0cy54Y2Fzc2V0cy9cbnB1YnNwZWMueWFtbFxuYDtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdDb250ZW50ID0gaGVhZFVzZXJDb250ZW50ICsgY29tbW9uQ29udGVudCArIGFkZGl0aW9uYWxDb250ZW50ICsgZ2l0aWdub3JlQ29udGVudCArIHRhaWxVc2VyQ29udGVudDtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IGNsb25lRGVlcCBmcm9tICdsb2Rhc2guY2xvbmVkZWVwJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBqc29uT2JqID0ge1xuICB2ZW52UGF0aDogJy4nLFxuICB2ZW52OiAnLnZlbnYnLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBsZXQgbmV3U2V0dGluZ3M6IG9iamVjdCA9IGNsb25lRGVlcChqc29uT2JqKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3B5cmlnaHRjb25maWcuanNvbicpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBvbGRTZXR0aW5ncyA9IEpTT04ucGFyc2Uob2xkQ29udGVudCkgYXMgb2JqZWN0O1xuICAgICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBzZW1hbnRpY1JlbGVhc2VCYWRnZSA9XG4gICdbIVtzZW1hbnRpYy1yZWxlYXNlXShodHRwczovL2ltZy5zaGllbGRzLmlvL2JhZGdlLyUyMCUyMCVGMCU5RiU5MyVBNiVGMCU5RiU5QSU4MC1zZW1hbnRpYy0tcmVsZWFzZS1lMTAwNzkuc3ZnKV0oaHR0cHM6Ly9naXRodWIuY29tL3NlbWFudGljLXJlbGVhc2Uvc2VtYW50aWMtcmVsZWFzZSknO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZWFkbWUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVSZWFkbWUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdSRUFETUUubWQnKTtcbiAgICBsZXQgbmV3Q29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuXG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnJlbGVhc2VyYy5qc29uJykpKSB7XG4gICAgICBuZXdDb250ZW50ID0gaW5zZXJ0QmFkZ2UobmV3Q29udGVudCwgc2VtYW50aWNSZWxlYXNlQmFkZ2UpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcG9zaXRvcnkgPSBjb25maWcucmVwb3NpdG9yeT8uc2xpY2UoY29uZmlnLnJlcG9zaXRvcnkuaW5kZXhPZignOicpICsgMSk7XG4gICAgY29uc3QgZmlsZU5hbWVzID0gZnMucmVhZGRpclN5bmMoYCR7Y29uZmlnLmRpclBhdGh9Ly5naXRodWIvd29ya2Zsb3dzYCk7XG4gICAgZm9yIChjb25zdCBmaWxlTmFtZSBvZiBmaWxlTmFtZXMpIHtcbiAgICAgIGlmICghZmlsZU5hbWUuc3RhcnRzV2l0aCgndGVzdCcpICYmICFmaWxlTmFtZS5zdGFydHNXaXRoKCdkZXBsb3knKSkgY29udGludWU7XG5cbiAgICAgIGxldCBiYWRnZU5hbWUgPSBmaWxlTmFtZTtcbiAgICAgIGJhZGdlTmFtZSA9IChiYWRnZU5hbWVbMF0gfHwgJycpLnRvVXBwZXJDYXNlKCkgKyBiYWRnZU5hbWUuc2xpY2UoMSwgYmFkZ2VOYW1lLmluZGV4T2YoJy4nKSk7XG4gICAgICBiYWRnZU5hbWUgPSBiYWRnZU5hbWUucmVwbGFjZSgnLScsICcgJyk7XG4gICAgICBpZiAoIXJlcG9zaXRvcnkpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgYmFkZ2UgPSBgWyFbJHtiYWRnZU5hbWV9XShodHRwczovL2dpdGh1Yi5jb20vJHtyZXBvc2l0b3J5fS9hY3Rpb25zL3dvcmtmbG93cy8ke2ZpbGVOYW1lfS9iYWRnZS5zdmcpXShodHRwczovL2dpdGh1Yi5jb20vJHtyZXBvc2l0b3J5fS9hY3Rpb25zL3dvcmtmbG93cy8ke2ZpbGVOYW1lfSlgO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBgLmdpdGh1Yi93b3JrZmxvd3MvJHtmaWxlTmFtZX1gKSkpIHtcbiAgICAgICAgbmV3Q29udGVudCA9IGluc2VydEJhZGdlKG5ld0NvbnRlbnQsIGJhZGdlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluc2VydEJhZGdlKHJlYWRtZTogc3RyaW5nLCBiYWRnZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8g5pei44GrYmFkZ2XjgYzjgYLjgovloLTlkIjjga/liYrpmaRcbiAgcmVhZG1lID0gcmVhZG1lLnJlcGxhY2UoYmFkZ2UsICcnKS5yZXBsYWNlQWxsKC9cXG5cXG5cXG4rL2csICdcXG5cXG4nKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHJlYWRtZS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChyZWFkbWVbaSAtIDFdID09PSAnXFxuJyAmJiByZWFkbWVbaV0gPT09ICdcXG4nKSB7XG4gICAgICBjb25zdCBiZWZvcmUgPSByZWFkbWUuc2xpY2UoMCwgaSArIDEpO1xuICAgICAgbGV0IGFmdGVyID0gcmVhZG1lLnNsaWNlKGkgKyAxKTtcbiAgICAgIGlmICghYWZ0ZXIuc3RhcnRzV2l0aCgnWycpICYmICFhZnRlci5zdGFydHNXaXRoKCchJykpIHtcbiAgICAgICAgYWZ0ZXIgPSBgXFxuJHthZnRlcn1gO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGAke2JlZm9yZX0ke2JhZGdlfVxcbiR7YWZ0ZXJ9YDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGAke3JlYWRtZX1cXG4ke2JhZGdlfVxcbmA7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZWxlYXNlcmMocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUmVsZWFzZXJjJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5yZWxlYXNlcmMuanNvbicpO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHJldHVybjtcblxuICAgIGNvbnN0IHNldHRpbmdzID0gSlNPTi5wYXJzZShhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKSkgYXMge1xuICAgICAgcGx1Z2lucz86IChzdHJpbmcgfCBbc3RyaW5nLCB1bmtub3duXSlbXTtcbiAgICB9O1xuICAgIGNvbnN0IHBsdWdpbnMgPSBzZXR0aW5ncy5wbHVnaW5zID8/IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGx1Z2lucy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgcGx1Z2luID0gQXJyYXkuaXNBcnJheShwbHVnaW5zW2ldKSA/IHBsdWdpbnNbaV0/LlswXSA6IHBsdWdpbnNbaV07XG4gICAgICBjb25zdCBvbGRDb25maWcgPSAoQXJyYXkuaXNBcnJheShwbHVnaW5zW2ldKSAmJiBwbHVnaW5zW2ldPy5bMV0pIHx8IHt9O1xuICAgICAgaWYgKHBsdWdpbiA9PT0gJ0BzZW1hbnRpYy1yZWxlYXNlL2NvbW1pdC1hbmFseXplcicpIHtcbiAgICAgICAgcGx1Z2luc1tpXSA9IFtcbiAgICAgICAgICAnQHNlbWFudGljLXJlbGVhc2UvY29tbWl0LWFuYWx5emVyJyxcbiAgICAgICAgICBtZXJnZS5hbGwoXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIG9sZENvbmZpZyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHByZXNldDogJ2NvbnZlbnRpb25hbGNvbW1pdHMnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfVxuICAgICAgICAgICksXG4gICAgICAgIF07XG4gICAgICB9IGVsc2UgaWYgKHBsdWdpbiA9PT0gJ0BzZW1hbnRpYy1yZWxlYXNlL2dpdGh1YicpIHtcbiAgICAgICAgcGx1Z2luc1tpXSA9IFtcbiAgICAgICAgICAnQHNlbWFudGljLXJlbGVhc2UvZ2l0aHViJyxcbiAgICAgICAgICBtZXJnZS5hbGwoXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIG9sZENvbmZpZyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIC8vIGNmLiBodHRwczovL2dpdGh1Yi5jb20vc2VtYW50aWMtcmVsZWFzZS9zZW1hbnRpYy1yZWxlYXNlL2lzc3Vlcy8yMjA0I2lzc3VlY29tbWVudC0xNTA4NDE3NzA0XG4gICAgICAgICAgICAgICAgc3VjY2Vzc0NvbW1lbnRDb25kaXRpb246IGZhbHNlLFxuICAgICAgICAgICAgICAgIGZhaWxDb21tZW50Q29uZGl0aW9uOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBsYWJlbHM6IFsncjogc2VtYW50aWMtcmVsZWFzZSddLFxuICAgICAgICAgICAgICAgIHJlbGVhc2VkTGFiZWxzOiBbJ3JlbGVhc2VkIDpib29rbWFyazonXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH1cbiAgICAgICAgICApLFxuICAgICAgICBdO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgY2xvbmVEZWVwIGZyb20gJ2xvZGFzaC5jbG9uZWRlZXAnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgb3ZlcndyaXRlTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGpzb25PYmogPSB7XG4gICRzY2hlbWE6ICdodHRwczovL2RvY3MucmVub3ZhdGVib3QuY29tL3Jlbm92YXRlLXNjaGVtYS5qc29uJyxcbiAgZXh0ZW5kczogWydnaXRodWI+V2lsbEJvb3N0ZXIvd2lsbGJvb3N0ZXItY29uZmlnczpyZW5vdmF0ZS5qc29uNSddLFxufTtcblxudHlwZSBTZXR0aW5ncyA9IHR5cGVvZiBqc29uT2JqICYgeyBwYWNrYWdlUnVsZXM/OiB7IG1hdGNoUGFja2FnZU5hbWVzOiBzdHJpbmdbXTsgZW5hYmxlZD86IGJvb2xlYW4gfVtdIH07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVJlbm92YXRlSnNvbihjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVJlbm92YXRlSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBsZXQgbmV3U2V0dGluZ3MgPSBjbG9uZURlZXAoanNvbk9iaikgYXMgU2V0dGluZ3M7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdyZW5vdmF0ZS5qc29uJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoYCR7ZmlsZVBhdGh9NWApKSB7XG4gICAgICAvLyBTaW5jZSBpdCBpcyBkaWZmaWN1bHQgZm9yIHBhcnNpbmcgcmVub3ZhdGUuanNvbjUsIHdlIGRvIG5vdGhpbmdcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG9sZFNldHRpbmdzID0gSlNPTi5wYXJzZShvbGRDb250ZW50KSBhcyBTZXR0aW5ncztcbiAgICAgIG5ld1NldHRpbmdzID0gbWVyZ2UuYWxsKFtuZXdTZXR0aW5ncywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzXSwge1xuICAgICAgICBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSxcbiAgICAgIH0pIGFzIFNldHRpbmdzO1xuICAgICAgbmV3U2V0dGluZ3MuZXh0ZW5kcyA9IG5ld1NldHRpbmdzLmV4dGVuZHMuZmlsdGVyKChpdGVtOiBzdHJpbmcpID0+IGl0ZW0gIT09ICdAd2lsbGJvb3N0ZXInKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICAvLyBEb24ndCB1cGdyYWRlIE5leHQuanMgYXV0b21hdGljYWxseVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6KSB7XG4gICAgICBuZXdTZXR0aW5ncy5wYWNrYWdlUnVsZXMgPz89IFtdO1xuICAgICAgaWYgKFxuICAgICAgICAhbmV3U2V0dGluZ3MucGFja2FnZVJ1bGVzLnNvbWUoKHJ1bGU6IHsgbWF0Y2hQYWNrYWdlTmFtZXM/OiBzdHJpbmdbXSB9KSA9PlxuICAgICAgICAgIHJ1bGUubWF0Y2hQYWNrYWdlTmFtZXM/LmluY2x1ZGVzKCduZXh0JylcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIG5ld1NldHRpbmdzLnBhY2thZ2VSdWxlcy5wdXNoKHsgbWF0Y2hQYWNrYWdlTmFtZXM6IFsnbmV4dCddLCBlbmFibGVkOiBmYWxzZSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmRlcGVuZGFib3QnKSwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5yZW5vdmF0ZXJjLmpzb24nKSwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KG5ld1NldHRpbmdzKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuLy8gY29uc3QgdGFyZ2V0QWdlbnRzID0gWydjbGF1ZGUtY29kZScsICdjb2RleCcsICdjdXJzb3InLCAnZ2VtaW5pLWNsaSddO1xuLy8gY29uc3QgaW5zdGFsbFRhcmdldEFnZW50QXJncyA9IHRhcmdldEFnZW50cy5mbGF0TWFwKChhZ2VudCkgPT4gWyctLWFnZW50JywgYWdlbnRdKTtcbi8vIGNvbnN0IHNraWxsc1JlcG8gPSAnV2lsbEJvb3N0ZXIvYWdlbnQtc2tpbGxzJztcbi8vIGNvbnN0IHBsYXl3cmlnaHRTa2lsbE5hbWUgPSAncGxheXdyaWdodC1jbGknO1xuLy8gY29uc3Qgbm9uV2ViUmVtb3ZhbEFnZW50QXJncyA9IFsnLS1hZ2VudCcsICd1bml2ZXJzYWwnLCAuLi5pbnN0YWxsVGFyZ2V0QWdlbnRBcmdzXTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGluc3RhbGxBZ2VudFNraWxscyhyb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignaW5zdGFsbEFnZW50U2tpbGxzJywgYXN5bmMgKCkgPT4ge1xuICAgIC8vIFRPRE86IFdlIGFyZSB0ZW1wb3JhcmlseSByZW1vdmluZyBhZ2VudCBza2lsbHMgZnJvbSB0aGUgcmVwb1xuICAgIC8vIGF3YWl0IHJ1bkluc3RhbGxBZ2VudFNraWxscyhyb290Q29uZmlnKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBmcy5ybShwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLmFnZW50cycpLCB7XG4gICAgICAgIGZvcmNlOiB0cnVlLFxuICAgICAgICByZWN1cnNpdmU6IHRydWUsXG4gICAgICB9KSxcbiAgICAgIGZzLnJtKHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcuY2xhdWRlJyksIHtcbiAgICAgICAgZm9yY2U6IHRydWUsXG4gICAgICAgIHJlY3Vyc2l2ZTogdHJ1ZSxcbiAgICAgIH0pLFxuICAgICAgZnMucm0ocGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJ3NraWxscy1sb2NrLmpzb24nKSwge1xuICAgICAgICBmb3JjZTogdHJ1ZSxcbiAgICAgIH0pLFxuICAgIF0pO1xuICB9KTtcbn1cblxuLy8gZnVuY3Rpb24gaXNXZWJBcHBSZWxhdGVkKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuLy8gICByZXR1cm4gKFxuLy8gICAgIGNvbmZpZy5kZXBlbmRpbmcubmV4dCB8fFxuLy8gICAgIGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QgfHxcbi8vICAgICBjb25maWcuZGVwZW5kaW5nLnJlYWN0IHx8XG4vLyAgICAgY29uZmlnLmRlcGVuZGluZy5zdG9yeWJvb2sgfHxcbi8vICAgICBjb25maWcuZG9lc0NvbnRhaW5Kc3hPclRzeCB8fFxuLy8gICAgIGNvbmZpZy5kb2VzQ29udGFpbkpzeE9yVHN4SW5QYWNrYWdlc1xuLy8gICApO1xuLy8gfVxuLy9cbi8vIGFzeW5jIGZ1bmN0aW9uIHJ1bkluc3RhbGxBZ2VudFNraWxscyhyb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4vLyAgIGlmICghcm9vdENvbmZpZy5pc1Jvb3QpIHJldHVybjtcbi8vXG4vLyAgIGNvbnN0IGNvbW1vbkFyZ3MgPSBbJy0teWVzJywgJ3NraWxsc0BsYXRlc3QnLCAnYWRkJywgc2tpbGxzUmVwbywgLi4uaW5zdGFsbFRhcmdldEFnZW50QXJncywgJy0tc2tpbGwnLCAnKicsICctLXllcyddO1xuLy8gICBzcGF3blN5bmMoJ25weCcsIGNvbW1vbkFyZ3MsIHJvb3RDb25maWcuZGlyUGF0aCk7XG4vL1xuLy8gICBpZiAoaXNXZWJBcHBSZWxhdGVkKHJvb3RDb25maWcpKSByZXR1cm47XG4vL1xuLy8gICBzcGF3blN5bmMoXG4vLyAgICAgJ25weCcsXG4vLyAgICAgWydza2lsbHNAbGF0ZXN0JywgJ3JlbW92ZScsIHBsYXl3cmlnaHRTa2lsbE5hbWUsIC4uLm5vbldlYlJlbW92YWxBZ2VudEFyZ3MsICctLXllcyddLFxuLy8gICAgIHJvb3RDb25maWcuZGlyUGF0aFxuLy8gICApO1xuLy8gICBhd2FpdCBQcm9taXNlLmFsbChbXG4vLyAgICAgLy8gVGhlIFZlcmNlbCBDTEkgbGVhdmVzIHRoZSBzaGFyZWQgdW5pdmVyc2FsIGluc3RhbGwgYmVoaW5kIGluIHRoaXMgZmxvdyxcbi8vICAgICAvLyBzbyBub24td2ViIHJlcG9zIG5lZWQgYW4gZXhwbGljaXQgY2xlYW51cCBwYXNzIHRvIGVuZm9yY2UgdGhlIGZpbmFsIHN0YXRlLlxuLy8gICAgIHJlbW92ZVNraWxsRGlyZWN0b3J5KHJvb3RDb25maWcuZGlyUGF0aCwgJy5hZ2VudHMvc2tpbGxzJyksXG4vLyAgICAgcmVtb3ZlU2tpbGxEaXJlY3Rvcnkocm9vdENvbmZpZy5kaXJQYXRoLCAnLmNsYXVkZS9za2lsbHMnKSxcbi8vICAgICByZW1vdmVTa2lsbERpcmVjdG9yeShyb290Q29uZmlnLmRpclBhdGgsICcuY29kZXgvc2tpbGxzJyksXG4vLyAgICAgcmVtb3ZlU2tpbGxEaXJlY3Rvcnkocm9vdENvbmZpZy5kaXJQYXRoLCAnLmN1cnNvci9za2lsbHMnKSxcbi8vICAgICByZW1vdmVTa2lsbERpcmVjdG9yeShyb290Q29uZmlnLmRpclBhdGgsICcuZ2VtaW5pL3NraWxscycpLFxuLy8gICAgIHJlbW92ZVNraWxsRGlyZWN0b3J5KHJvb3RDb25maWcuZGlyUGF0aCwgJy5nZW1pbmkvY29tbWFuZHMnKSxcbi8vICAgICByZW1vdmVTa2lsbExvY2tFbnRyeShyb290Q29uZmlnLmRpclBhdGgpLFxuLy8gICBdKTtcbi8vIH1cbi8vXG4vLyBhc3luYyBmdW5jdGlvbiByZW1vdmVTa2lsbERpcmVjdG9yeShyb290RGlyUGF0aDogc3RyaW5nLCByZWxhdGl2ZVBhcmVudERpclBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuLy8gICBhd2FpdCBmcy5ybShwYXRoLnJlc29sdmUocm9vdERpclBhdGgsIHJlbGF0aXZlUGFyZW50RGlyUGF0aCwgcGxheXdyaWdodFNraWxsTmFtZSksIHtcbi8vICAgICBmb3JjZTogdHJ1ZSxcbi8vICAgICByZWN1cnNpdmU6IHRydWUsXG4vLyAgIH0pO1xuLy8gfVxuLy9cbi8vIGFzeW5jIGZ1bmN0aW9uIHJlbW92ZVNraWxsTG9ja0VudHJ5KHJvb3REaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbi8vICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUocm9vdERpclBhdGgsICdza2lsbHMtbG9jay5qc29uJyk7XG4vLyAgIHRyeSB7XG4vLyAgICAgY29uc3QganNvblRleHQgPSBhd2FpdCBmcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbi8vICAgICBjb25zdCBqc29uOiB1bmtub3duID0gSlNPTi5wYXJzZShqc29uVGV4dCk7XG4vLyAgICAgaWYgKCFpc1NraWxsTG9ja0pzb24oanNvbikgfHwgIWpzb24uc2tpbGxzW3BsYXl3cmlnaHRTa2lsbE5hbWVdKSByZXR1cm47XG4vLyAgICAganNvbi5za2lsbHMgPSBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoanNvbi5za2lsbHMpLmZpbHRlcigoW25hbWVdKSA9PiBuYW1lICE9PSBwbGF5d3JpZ2h0U2tpbGxOYW1lKSk7XG4vLyAgICAgYXdhaXQgZnMud3JpdGVGaWxlKGZpbGVQYXRoLCBKU09OLnN0cmluZ2lmeShqc29uLCB1bmRlZmluZWQsIDIpICsgJ1xcbicpO1xuLy8gICB9IGNhdGNoIHtcbi8vICAgICAvLyBJZ25vcmUgaWYgdGhlIHNraWxsIGxvY2sgZG9lcyBub3QgZXhpc3QgeWV0IG9yIGlzIHVucmVhZGFibGUuXG4vLyAgIH1cbi8vIH1cbi8vXG4vLyBmdW5jdGlvbiBpc1NraWxsTG9ja0pzb24oanNvbjogdW5rbm93bik6IGpzb24gaXMgeyBza2lsbHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0ge1xuLy8gICByZXR1cm4gKFxuLy8gICAgIHR5cGVvZiBqc29uID09PSAnb2JqZWN0JyAmJlxuLy8gICAgIGpzb24gIT09IG51bGwgJiZcbi8vICAgICAnc2tpbGxzJyBpbiBqc29uICYmXG4vLyAgICAgdHlwZW9mIGpzb24uc2tpbGxzID09PSAnb2JqZWN0JyAmJlxuLy8gICAgIGpzb24uc2tpbGxzICE9PSBudWxsICYmXG4vLyAgICAgIUFycmF5LmlzQXJyYXkoanNvbi5za2lsbHMpXG4vLyAgICk7XG4vLyB9XG4iLCJpbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuY29uc3Qgc3JjRGlyZWN0b3JpZXMgPSB7XG4gIG5vZGU6IFsnc3JjJywgJ3Rlc3QnLCAnc2NyaXB0cyddLnRvU29ydGVkKCksXG4gIGJsaXR6OiBbJ3NyYycsICd0ZXN0JywgJ3NjcmlwdHMnLCAnZGInLCAnaW50ZWdyYXRpb25zJywgJ21haWxlcnMnXS50b1NvcnRlZCgpLFxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNyY0RpcnMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nW10ge1xuICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eikge1xuICAgIHJldHVybiBzcmNEaXJlY3Rvcmllcy5ibGl0ejtcbiAgfVxuICByZXR1cm4gc3JjRGlyZWN0b3JpZXMubm9kZTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IGNsb25lRGVlcCBmcm9tICdsb2Rhc2guY2xvbmVkZWVwJztcbmltcG9ydCB0eXBlIHsgVHNDb25maWdKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGNvbWJpbmVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBzb3J0S2V5cyB9IGZyb20gJy4uL3V0aWxzL29iamVjdFV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBnZXRTcmNEaXJzIH0gZnJvbSAnLi4vdXRpbHMvc3JjRGlyZWN0b3JpZXMuanMnO1xuaW1wb3J0IHsgZ2V0VHNjb25maWdFeHRlbmRzIH0gZnJvbSAnLi4vdXRpbHMvdHNjb25maWdCYXNlLmpzJztcblxuY29uc3Qgcm9vdEpzb25PYmogPSB7XG4gIGNvbXBpbGVyT3B0aW9uczoge1xuICAgIGFsd2F5c1N0cmljdDogdHJ1ZSxcbiAgICBub1VuY2hlY2tlZEluZGV4ZWRBY2Nlc3M6IHRydWUsIC8vIGZvciBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLW51bGxpc2gtY29hbGVzY2luZ1xuICAgIGFsbG93U3ludGhldGljRGVmYXVsdEltcG9ydHM6IHRydWUsIC8vIGFsbG93IGBpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnYFxuICAgIGVzTW9kdWxlSW50ZXJvcDogdHJ1ZSwgLy8gYWxsb3cgZGVmYXVsdCBpbXBvcnQgZnJvbSBDb21tb25KUy9BTUQvVU1EIG1vZHVsZXNcbiAgICByZXNvbHZlSnNvbk1vZHVsZTogdHJ1ZSwgLy8gYWxsb3cgdG8gaW1wb3J0IEpTT04gZmlsZXNcbiAgICBkZWNsYXJhdGlvbjogdHJ1ZSxcbiAgICBzb3VyY2VNYXA6IHRydWUsXG4gICAgaW1wb3J0SGVscGVyczogZmFsc2UsXG4gICAgb3V0RGlyOiAnZGlzdCcsXG4gIH0sXG4gIGV4Y2x1ZGU6IFsncGFja2FnZXMvKi90ZXN0L2ZpeHR1cmVzJywgJ3Rlc3QvZml4dHVyZXMnXSxcbiAgaW5jbHVkZTogW1xuICAgICdwYWNrYWdlcy8qL3NjcmlwdHMvKiovKicsXG4gICAgJ3BhY2thZ2VzLyovc3JjLyoqLyonLFxuICAgICdwYWNrYWdlcy8qL3Rlc3QvKiovKicsXG4gICAgJ3NjcmlwdHMvKiovKicsXG4gICAgJ3NyYy8qKi8qJyxcbiAgICAndGVzdC8qKi8qJyxcbiAgXSxcbn07XG5cbmNvbnN0IHN1Ykpzb25PYmogPSB7XG4gIGNvbXBpbGVyT3B0aW9uczoge1xuICAgIGFsd2F5c1N0cmljdDogdHJ1ZSxcbiAgICBub1VuY2hlY2tlZEluZGV4ZWRBY2Nlc3M6IHRydWUsIC8vIGZvciBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLW51bGxpc2gtY29hbGVzY2luZ1xuICAgIGFsbG93U3ludGhldGljRGVmYXVsdEltcG9ydHM6IHRydWUsIC8vIGFsbG93IGBpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnYFxuICAgIGVzTW9kdWxlSW50ZXJvcDogdHJ1ZSwgLy8gYWxsb3cgZGVmYXVsdCBpbXBvcnQgZnJvbSBDb21tb25KUy9BTUQvVU1EIG1vZHVsZXNcbiAgICByZXNvbHZlSnNvbk1vZHVsZTogdHJ1ZSwgLy8gYWxsb3cgdG8gaW1wb3J0IEpTT04gZmlsZXNcbiAgICBkZWNsYXJhdGlvbjogdHJ1ZSxcbiAgICBzb3VyY2VNYXA6IHRydWUsXG4gICAgaW1wb3J0SGVscGVyczogZmFsc2UsXG4gICAgb3V0RGlyOiAnZGlzdCcsXG4gIH0sXG4gIGV4Y2x1ZGU6IFsndGVzdC9maXh0dXJlcyddLFxuICBpbmNsdWRlOiBbJ3NjcmlwdHMvKiovKicsICdzcmMvKiovKicsICd0ZXN0LyoqLyonXSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVRzY29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlVHNjb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHwgY29uZmlnLmRlcGVuZGluZy5uZXh0KSByZXR1cm47XG5cbiAgICBsZXQgbmV3U2V0dGluZ3MgPSBjbG9uZURlZXAoY29uZmlnLmlzUm9vdCA/IHJvb3RKc29uT2JqIDogc3ViSnNvbk9iaikgYXMgVHNDb25maWdKc29uO1xuICAgIGNvbnN0IGdlbmVyYXRlZFJvb3REaXIgPSBnZXRHZW5lcmF0ZWRSb290RGlyKGNvbmZpZyk7XG4gICAgY29uc3QgZ2VuZXJhdGVkVHlwZXMgPSBnZXRHZW5lcmF0ZWRUeXBlcyhjb25maWcpO1xuICAgIG5ld1NldHRpbmdzLmV4dGVuZHMgPSBnZXRUc2NvbmZpZ0V4dGVuZHMoY29uZmlnKTtcbiAgICBpZiAoZ2VuZXJhdGVkUm9vdERpcikge1xuICAgICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zID0geyAuLi5uZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMsIHJvb3REaXI6IGdlbmVyYXRlZFJvb3REaXIgfTtcbiAgICB9XG4gICAgaWYgKGdlbmVyYXRlZFR5cGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyA9IHsgLi4ubmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLCB0eXBlczogZ2VuZXJhdGVkVHlwZXMgfTtcbiAgICB9XG4gICAgaWYgKCFjb25maWcuZG9lc0NvbnRhaW5Kc3hPclRzeCAmJiAhY29uZmlnLmRvZXNDb250YWluSnN4T3JUc3hJblBhY2thZ2VzKSB7XG4gICAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5qc3g7XG4gICAgfSBlbHNlIGlmICghY29uZmlnLmlzQnVuICYmICFjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMgPSB7IC4uLm5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucywganN4OiAncmVhY3QtanN4JyB9O1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmlzUm9vdCAmJiAhY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zKSB7XG4gICAgICBuZXdTZXR0aW5ncy5pbmNsdWRlID0gbmV3U2V0dGluZ3MuaW5jbHVkZT8uZmlsdGVyKChkaXJQYXRoOiBzdHJpbmcpID0+ICFkaXJQYXRoLnN0YXJ0c1dpdGgoJ3BhY2thZ2VzLyovJykpO1xuICAgICAgbmV3U2V0dGluZ3MuZXhjbHVkZSA9IG5ld1NldHRpbmdzLmV4Y2x1ZGU/LmZpbHRlcigoZGlyUGF0aDogc3RyaW5nKSA9PiAhZGlyUGF0aC5zdGFydHNXaXRoKCdwYWNrYWdlcy8qLycpKTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3RzY29uZmlnLmpzb24nKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBvbGRTZXR0aW5ncyA9IEpTT04ucGFyc2UoZXhpc3RpbmdDb250ZW50KSBhcyBUc0NvbmZpZ0pzb247XG4gICAgICBjb25zdCBleGlzdGluZ1Jvb3REaXIgPSBvbGRTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LnJvb3REaXI7XG4gICAgICBjb25zdCBleGlzdGluZ1R5cGVzID0gbm9ybWFsaXplU3RyaW5nQXJyYXkob2xkU2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy50eXBlcyk7XG4gICAgICBuZXdTZXR0aW5ncy5leHRlbmRzID0gbWVyZ2VUc2NvbmZpZ0V4dGVuZHMobmV3U2V0dGluZ3MuZXh0ZW5kcywgb2xkU2V0dGluZ3MuZXh0ZW5kcyk7XG4gICAgICBkZWxldGUgb2xkU2V0dGluZ3MuZXh0ZW5kcztcbiAgICAgIGRlbGV0ZSBvbGRTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmpzeDtcbiAgICAgIG5ld1NldHRpbmdzID0gbWVyZ2UuYWxsKFtuZXdTZXR0aW5ncywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzXSwgeyBhcnJheU1lcmdlOiBjb21iaW5lTWVyZ2UgfSk7XG4gICAgICBuZXdTZXR0aW5ncy5pbmNsdWRlID0gbmV3U2V0dGluZ3MuaW5jbHVkZT8uZmlsdGVyKFxuICAgICAgICAoZGlyUGF0aDogc3RyaW5nKSA9PlxuICAgICAgICAgICFkaXJQYXRoLmluY2x1ZGVzKCdAdHlwZXMnKSAmJiAhZGlyUGF0aC5pbmNsdWRlcygnX190ZXN0c19fLycpICYmICFkaXJQYXRoLmluY2x1ZGVzKCd0ZXN0cy8nKVxuICAgICAgKTtcbiAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyA/Pz0ge307XG4gICAgICBpZiAoZXhpc3RpbmdSb290RGlyKSB7XG4gICAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucy5yb290RGlyID0gZXhpc3RpbmdSb290RGlyO1xuICAgICAgfSBlbHNlIGlmIChnZW5lcmF0ZWRSb290RGlyKSB7XG4gICAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucy5yb290RGlyID0gZ2VuZXJhdGVkUm9vdERpcjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMucm9vdERpcjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbWVyZ2VkVHlwZXMgPSBbLi4ubmV3IFNldChbLi4uZXhpc3RpbmdUeXBlcywgLi4uZ2VuZXJhdGVkVHlwZXNdKV07XG4gICAgICBpZiAobWVyZ2VkVHlwZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMudHlwZXMgPSBtZXJnZWRUeXBlcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMudHlwZXM7XG4gICAgICB9XG4gICAgICBpZiAoc2hvdWxkRGVsZXRlVHlwZVJvb3RzKGdlbmVyYXRlZFR5cGVzKSkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLnR5cGVSb290cztcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gICAgc29ydEtleXMobmV3U2V0dGluZ3MpO1xuICAgIG5ld1NldHRpbmdzLmluY2x1ZGU/LnNvcnQoKTtcbiAgICAvLyBEb24ndCB1c2Ugb2xkIGRlY29yYXRvclxuICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmV4cGVyaW1lbnRhbERlY29yYXRvcnM7XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LnZlcmJhdGltTW9kdWxlU3ludGF4O1xuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBtZXJnZVRzY29uZmlnRXh0ZW5kcyhcbiAgZ2VuZXJhdGVkRXh0ZW5kczogVHNDb25maWdKc29uWydleHRlbmRzJ10sXG4gIGV4aXN0aW5nRXh0ZW5kczogVHNDb25maWdKc29uWydleHRlbmRzJ11cbik6IFRzQ29uZmlnSnNvblsnZXh0ZW5kcyddIHtcbiAgY29uc3QgbWVyZ2VkRXh0ZW5kcyA9IFsuLi5ub3JtYWxpemVFeHRlbmRzKGdlbmVyYXRlZEV4dGVuZHMpLCAuLi5ub3JtYWxpemVFeHRlbmRzKGV4aXN0aW5nRXh0ZW5kcyldO1xuICBjb25zdCB1bmlxdWVFeHRlbmRzID0gWy4uLm5ldyBTZXQobWVyZ2VkRXh0ZW5kcyldO1xuICBpZiAodW5pcXVlRXh0ZW5kcy5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmICh1bmlxdWVFeHRlbmRzLmxlbmd0aCA9PT0gMSkgcmV0dXJuIHVuaXF1ZUV4dGVuZHNbMF07XG4gIHJldHVybiB1bmlxdWVFeHRlbmRzO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVFeHRlbmRzKHZhbHVlOiBUc0NvbmZpZ0pzb25bJ2V4dGVuZHMnXSk6IHN0cmluZ1tdIHtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIFtdO1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVN0cmluZ0FycmF5KHZhbHVlOiB1bmtub3duKTogc3RyaW5nW10ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgcmV0dXJuIFt2YWx1ZV07XG4gIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiBbXTtcbiAgcmV0dXJuIHZhbHVlLmZpbHRlcigoaXRlbSk6IGl0ZW0gaXMgc3RyaW5nID0+IHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJyk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZERlbGV0ZVR5cGVSb290cyh0eXBlTmFtZXM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gIC8vIE9ubHkgZ2VuZXJhdGVkIHBhY2thZ2Utb3duZWQgdGVzdCB0eXBlcyBzaG91bGQgdHJpZ2dlciB0aGlzLiBVc2VyLWRlZmluZWQgc2xhc2gtYmFzZWRcbiAgLy8gZW50cmllcyBtYXkgaW50ZW50aW9uYWxseSByZWx5IG9uIGN1c3RvbSB0eXBlUm9vdHMgYW5kIHNob3VsZCBiZSBwcmVzZXJ2ZWQgYXMtaXMuXG4gIHJldHVybiB0eXBlTmFtZXMuc29tZSgodHlwZU5hbWUpID0+IHR5cGVOYW1lID09PSAnY3lwcmVzcycgfHwgdHlwZU5hbWUuaW5jbHVkZXMoJy8nKSk7XG59XG5cbmZ1bmN0aW9uIGdldEdlbmVyYXRlZFJvb3REaXIoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZXhpc3RpbmdSb290U291cmNlRGlycyA9IGdldFNyY0RpcnMoY29uZmlnKS5maWx0ZXIoKGRpck5hbWUpID0+XG4gICAgZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGRpck5hbWUpKVxuICApO1xuXG4gIGlmIChjb25maWcuaXNSb290ICYmIGNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucykge1xuICAgIGNvbnN0IHBhY2thZ2VzRGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3BhY2thZ2VzJyk7XG4gICAgY29uc3QgaGFzU3ViUGFja2FnZVNvdXJjZXMgPVxuICAgICAgZnMuZXhpc3RzU3luYyhwYWNrYWdlc0RpclBhdGgpICYmXG4gICAgICBmc1xuICAgICAgICAucmVhZGRpclN5bmMocGFja2FnZXNEaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSlcbiAgICAgICAgLnNvbWUoXG4gICAgICAgICAgKGRpcmVudCkgPT5cbiAgICAgICAgICAgIGRpcmVudC5pc0RpcmVjdG9yeSgpICYmXG4gICAgICAgICAgICBnZXRTcmNEaXJzKGNvbmZpZykuc29tZSgoZGlyTmFtZSkgPT4gZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUocGFja2FnZXNEaXJQYXRoLCBkaXJlbnQubmFtZSwgZGlyTmFtZSkpKVxuICAgICAgICApO1xuICAgIGlmIChoYXNTdWJQYWNrYWdlU291cmNlcykge1xuICAgICAgcmV0dXJuIGV4aXN0aW5nUm9vdFNvdXJjZURpcnMubGVuZ3RoID4gMCA/ICcuJyA6ICcuL3BhY2thZ2VzJztcbiAgICB9XG4gIH1cblxuICBpZiAoZXhpc3RpbmdSb290U291cmNlRGlycy5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gYC4vJHtleGlzdGluZ1Jvb3RTb3VyY2VEaXJzWzBdfWA7XG4gIH1cbiAgaWYgKGV4aXN0aW5nUm9vdFNvdXJjZURpcnMubGVuZ3RoID4gMSkge1xuICAgIHJldHVybiAnLic7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0R2VuZXJhdGVkVHlwZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nW10ge1xuICBjb25zdCB0eXBlTmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgZGVwZW5kZW5jaWVzID0ge1xuICAgIC4uLmNvbmZpZy5wYWNrYWdlSnNvbj8uZGVwZW5kZW5jaWVzLFxuICAgIC4uLmNvbmZpZy5wYWNrYWdlSnNvbj8uZGV2RGVwZW5kZW5jaWVzLFxuICB9O1xuXG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICB0eXBlTmFtZXMuYWRkKCdidW4nKTtcbiAgfSBlbHNlIGlmICghY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgIHR5cGVOYW1lcy5hZGQoJ25vZGUnKTtcbiAgfVxuICBpZiAoXG4gICAgZGVwZW5kZW5jaWVzLmplc3QgfHxcbiAgICBkZXBlbmRlbmNpZXNbJ0BqZXN0L2dsb2JhbHMnXSB8fFxuICAgIGRlcGVuZGVuY2llc1snamVzdC1lbnZpcm9ubWVudC1qc2RvbSddIHx8XG4gICAgZGVwZW5kZW5jaWVzWyd0cy1qZXN0J11cbiAgKSB7XG4gICAgdHlwZU5hbWVzLmFkZCgnamVzdCcpO1xuICB9XG4gIGlmIChkZXBlbmRlbmNpZXMudml0ZXN0KSB7XG4gICAgdHlwZU5hbWVzLmFkZCgndml0ZXN0L2dsb2JhbHMnKTtcbiAgfVxuICBpZiAoZGVwZW5kZW5jaWVzLm1vY2hhKSB7XG4gICAgdHlwZU5hbWVzLmFkZCgnbW9jaGEnKTtcbiAgfVxuICBpZiAoZGVwZW5kZW5jaWVzLmN5cHJlc3MpIHtcbiAgICB0eXBlTmFtZXMuYWRkKCdjeXByZXNzJyk7XG4gIH1cblxuICByZXR1cm4gWy4uLnR5cGVOYW1lc107XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHNvcnRLZXlzIH0gZnJvbSAnLi4vdXRpbHMvb2JqZWN0VXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgZXhjbHVkZUZpbGVQYXR0ZXJucyA9IFtcbiAgJyoqLy5naXQvb2JqZWN0cy8qKicsXG4gICcqKi8uZ2l0L3N1YnRyZWUtY2FjaGUvKionLFxuICAnKiovbm9kZV9tb2R1bGVzLyoqJyxcbiAgJyoqL3RtcC8qKicsXG4gICcqKi90ZW1wLyoqJyxcbiAgJyoqL2Rpc3QvKionLFxuXTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlVnNjb2RlU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncycsIGFzeW5jICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcudnNjb2RlJywgJ3NldHRpbmdzLmpzb24nKTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgbGV0IHNldHRpbmdzID0gSlNPTi5wYXJzZShleGlzdGluZ0NvbnRlbnQpIGFzIG9iamVjdDtcbiAgICAgIGZvciAoY29uc3QgZXhjbHVkZUZpbGVQYXR0ZXJuIG9mIGV4Y2x1ZGVGaWxlUGF0dGVybnMpIHtcbiAgICAgICAgc2V0dGluZ3MgPSBtZXJnZS5hbGwoW3NldHRpbmdzLCBleGNsdWRlU2V0dGluZyhleGNsdWRlRmlsZVBhdHRlcm4pXSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jaykge1xuICAgICAgICBzZXR0aW5ncyA9IG1lcmdlLmFsbChbc2V0dGluZ3MsIGV4Y2x1ZGVTZXR0aW5nKCcqKi8udmVudi8qKicpXSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgICAgIHNldHRpbmdzID0gbWVyZ2UuYWxsKFtzZXR0aW5ncywgZXhjbHVkZVNldHRpbmcoJyoqLy5uZXh0LyoqJyldKTtcbiAgICAgIH1cbiAgICAgIC8vIExMTeOBq+OCiOOCi3ZpYmUgY29kaW5n44Gn44Gv44CB6Ieq5YuV44OV44Kp44O844Oe44OD44OI44KE44Kz44O844OJ44Ki44Kv44K344On44Oz44KS54Sh5Yq55YyW44GZ44KL44GT44Go44GnXG4gICAgICAvLyDnlJ/miJDjgZXjgozjgZ/jgrPjg7zjg4njga7lhYPjga7lvaLlvI/jgpLntq3mjIHjgafjgY3jgotcbiAgICAgIGlmICgnZWRpdG9yLmNvZGVBY3Rpb25zT25TYXZlJyBpbiBzZXR0aW5ncykge1xuICAgICAgICBkZWxldGUgc2V0dGluZ3NbJ2VkaXRvci5jb2RlQWN0aW9uc09uU2F2ZSddO1xuICAgICAgfVxuICAgICAgaWYgKCdlZGl0b3IuZm9ybWF0T25TYXZlJyBpbiBzZXR0aW5ncykge1xuICAgICAgICBkZWxldGUgc2V0dGluZ3NbJ2VkaXRvci5mb3JtYXRPblNhdmUnXTtcbiAgICAgIH1cbiAgICAgIHNvcnRLZXlzKHNldHRpbmdzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShzZXR0aW5ncywgdW5kZWZpbmVkLCAyKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZXhjbHVkZVNldHRpbmcoZXhjbHVkZUZpbGVQYXR0ZXJuOiBzdHJpbmcpOiBvYmplY3Qge1xuICByZXR1cm4ge1xuICAgICdmaWxlcy53YXRjaGVyRXhjbHVkZSc6IHtcbiAgICAgIFtleGNsdWRlRmlsZVBhdHRlcm5dOiB0cnVlLFxuICAgIH0sXG4gIH07XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IENvbmZpZ3VyYXRpb25WYWx1ZU1hcCB9IGZyb20gJ0B5YXJucGtnL2NvcmUnO1xuaW1wb3J0IHlhbWwgZnJvbSAnanMteWFtbCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jLCBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuXG50eXBlIFNldHRpbmdzID0ge1xuICBkZWZhdWx0U2VtdmVyUmFuZ2VQcmVmaXg6IHN0cmluZztcbiAgbm1Nb2RlOiBzdHJpbmc7XG4gIG5vZGVMaW5rZXI6IHN0cmluZztcbiAgbnBtTWluaW1hbEFnZUdhdGU/OiBzdHJpbmc7XG4gIG5wbVByZWFwcHJvdmVkUGFja2FnZXM/OiBzdHJpbmdbXTtcbiAgcGx1Z2lucz86IFBsdWdpbltdO1xufSAmIFBhcnRpYWw8Q29uZmlndXJhdGlvblZhbHVlTWFwPjtcblxuaW50ZXJmYWNlIFBsdWdpbiB7XG4gIGNoZWNrc3VtOiBzdHJpbmc7XG4gIHBhdGg6IHN0cmluZztcbiAgc3BlYzogc3RyaW5nO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVZYXJucmNZbWwoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVZYXJucmNZbWwnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeWFybnJjWW1sUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy55YXJucmMueW1sJyk7XG4gICAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHlhcm5yY1ltbFBhdGgsIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICAgIGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy55YXJuJyksIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgICAgKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgICBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICd5YXJuLmxvY2snKSwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRWZXJzaW9uID0gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KCd5YXJuJywgWyctLXZlcnNpb24nXSwgY29uZmlnLmRpclBhdGgpO1xuICAgIGNvbnN0IGxhdGVzdFZlcnNpb24gPSBnZXRMYXRlc3RWZXJzaW9uKCdAeWFybnBrZy9jbGknLCBjb25maWcuZGlyUGF0aCk7XG4gICAgaWYgKGdldE1ham9yTnVtYmVyKGN1cnJlbnRWZXJzaW9uKSA8PSBnZXRNYWpvck51bWJlcihsYXRlc3RWZXJzaW9uKSAmJiBjdXJyZW50VmVyc2lvbiAhPT0gbGF0ZXN0VmVyc2lvbikge1xuICAgICAgc3Bhd25TeW5jKCd5YXJuJywgWydzZXQnLCAndmVyc2lvbicsIGxhdGVzdFZlcnNpb25dLCBjb25maWcuZGlyUGF0aCwgMSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVsZWFzZXNQYXRoID0gcGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm4nLCAncmVsZWFzZXMnKTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihyZWxlYXNlc1BhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGZvciAoY29uc3QgZmlsZSBvZiBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKHJlbGVhc2VzUGF0aCkpIHtcbiAgICAgIGlmIChmaWxlLnN0YXJ0c1dpdGgoJ3lhcm4tJykgJiYgIWZpbGUuc3RhcnRzV2l0aChgeWFybi0ke2xhdGVzdFZlcnNpb259LmApKSB7XG4gICAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4ocmVsZWFzZXNQYXRoLCBmaWxlKSkpO1xuICAgICAgICBjb25zb2xlLmxvZygnUmVtb3ZlZCcsIHBhdGguam9pbihyZWxlYXNlc1BhdGgsIGZpbGUpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB5YXJucmNQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm5yYycpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybSh5YXJucmNQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKTtcblxuICAgIGNvbnN0IHNldHRpbmdzID0geWFtbC5sb2FkKGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHlhcm5yY1ltbFBhdGgsICd1dGY4JykpIGFzIFNldHRpbmdzO1xuICAgIHNldHRpbmdzLmRlZmF1bHRTZW12ZXJSYW5nZVByZWZpeCA9ICcnO1xuICAgIHNldHRpbmdzLm5vZGVMaW5rZXIgPSAnbm9kZS1tb2R1bGVzJztcbiAgICBzZXR0aW5ncy5ubU1vZGUgPSAnaGFyZGxpbmtzLWdsb2JhbCc7XG4gICAgc2V0dGluZ3MubnBtTWluaW1hbEFnZUdhdGUgPSAnNWQnO1xuICAgIHNldHRpbmdzLm5wbVByZWFwcHJvdmVkUGFja2FnZXMgPSBbXG4gICAgICAvLyBXZSBiZWxpZXZlIHdlIGFyZSBzYWZlXG4gICAgICAnQGV4ZXJjb2RlLyonLFxuICAgICAgJ0B3aWxsYm9vc3Rlci8qJyxcbiAgICAgIC8vIFRvIGRlYWwgd2l0aCBDVkUgbGlrZSBodHRwczovL25leHRqcy5vcmcvYmxvZy9DVkUtMjAyNS02NjQ3OFxuICAgICAgJ25leHQnLFxuICAgICAgJ0BuZXh0LyonLFxuICAgICAgJ3JlYWN0JyxcbiAgICAgICdyZWFjdC1kb20nLFxuICAgIF07XG4gICAgZGVsZXRlIHNldHRpbmdzLmNvbXByZXNzaW9uTGV2ZWw7XG4gICAgaWYgKHNldHRpbmdzLmluamVjdEVudmlyb25tZW50RmlsZXM/Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgZGVsZXRlIHNldHRpbmdzLmluamVjdEVudmlyb25tZW50RmlsZXM7XG4gICAgfVxuICAgIC8vIGNmLiBodHRwczovL2dpdGh1Yi5jb20veWFybnBrZy9iZXJyeS9wdWxsLzQ2OThcbiAgICBzZXR0aW5ncy5lbmFibGVHbG9iYWxDYWNoZSA9IHRydWU7XG4gICAgY29uc3Qgb3JpZ2luYWxMZW5ndGggPSBzZXR0aW5ncy5wbHVnaW5zPy5sZW5ndGggPz8gMDtcbiAgICBzZXR0aW5ncy5wbHVnaW5zID0gc2V0dGluZ3MucGx1Z2lucz8uZmlsdGVyKChwKSA9PiBwLnBhdGggIT09ICcueWFybi9wbHVnaW5zL3VuZGVmaW5lZC5janMnKSA/PyBbXTtcbiAgICBpZiAoc2V0dGluZ3MucGx1Z2lucy5sZW5ndGggIT09IG9yaWdpbmFsTGVuZ3RoKSB7XG4gICAgICBjb25zdCBwbHVnaW5QYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm5yYycsICd1bmRlZmluZWQuY2pzJyk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGx1Z2luUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgfVxuICAgIGlmIChzZXR0aW5ncy5wbHVnaW5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZGVsZXRlIHNldHRpbmdzLnBsdWdpbnM7XG4gICAgfVxuICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZSh5YXJucmNZbWxQYXRoLCB5YW1sLmR1bXAoc2V0dGluZ3MsIHsgbGluZVdpZHRoOiAtMSB9KSk7XG5cbiAgICBzcGF3blN5bmMoJ3lhcm4nLCBbJ2RseCcsICd5YXJuLXBsdWdpbi1hdXRvLWluc3RhbGwnXSwgY29uZmlnLmRpclBhdGgpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldExhdGVzdFZlcnNpb24ocGFja2FnZU5hbWU6IHN0cmluZywgZGlyUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgdmVyc2lvbnNKc29uID0gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KCducG0nLCBbJ3Nob3cnLCBwYWNrYWdlTmFtZSwgJ3ZlcnNpb25zJywgJy0tanNvbiddLCBkaXJQYXRoKTtcbiAgY29uc3QgdmVyc2lvbnMgPSBKU09OLnBhcnNlKHZlcnNpb25zSnNvbikgYXMgc3RyaW5nW107XG4gIHJldHVybiB2ZXJzaW9ucy5hdCgtMSkgYXMgc3RyaW5nO1xufVxuZnVuY3Rpb24gZ2V0TWFqb3JOdW1iZXIodmVyc2lvbjogc3RyaW5nKTogbnVtYmVyIHtcbiAgY29uc3QgW21ham9yXSA9IHZlcnNpb24uc3BsaXQoJy4nKTtcbiAgcmV0dXJuIE51bWJlcihtYWpvcik7XG59XG4iLCJpbXBvcnQgdHlwZSB7IE9jdG9raXQgfSBmcm9tICdAb2N0b2tpdC9jb3JlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2V0T2N0b2tpdCwgZ2l0SHViVXRpbCwgaGFzR2l0SHViVG9rZW4gfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwTGFiZWxzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ3NldHVwTGFiZWxzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IFtvd25lciwgcmVwb10gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUoY29uZmlnLnJlcG9zaXRvcnkgPz8gJycpO1xuICAgIGlmICghb3duZXIgfHwgIXJlcG8pIHJldHVybjtcbiAgICBpZiAob3duZXIgIT09ICdXaWxsQm9vc3RlcicgJiYgb3duZXIgIT09ICdXaWxsQm9vc3RlckxhYicpIHJldHVybjtcbiAgICBpZiAoIWhhc0dpdEh1YlRva2VuKG93bmVyKSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2N0b2tpdCA9IGdldE9jdG9raXQob3duZXIpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkMTogeC1lYXN5IDpoZWRnZWhvZzonLCAnRURFOUZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDI6IGVhc3kgOnJhYmJpdDI6JywgJ0RERDZGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2QzOiBtZWRpdW0gOm94OicsICdDNEI1RkQnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkNDogaGFyZCA6c3F1aWQ6JywgJ0E3OEJGQScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2Q1OiB4LWhhcmQgOndoYWxlMjonLCAnOEI1Q0Y2Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncDE6IGNyaXRpY2FsIDpmaXJlOjpmaXJlOjpmaXJlOicsICdFRjQ0NDQnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdwMjogdXJnZW50IDpmaXJlOjpmaXJlOicsICdGODcxNzEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdwMzogaW1wb3J0YW50IDpmaXJlOicsICdGQ0E1QTUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdwNDogbmljZSB0byBoYXZlIDpkcm9wbGV0OicsICdGRUNBQ0EnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiBibGl0eicsICc1MzAwYmMnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiBmaXJlYmFzZScsICdmZmNhMjgnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiBwcmlzbWEnLCAnMGMzNDRiJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogcmVhY3QnLCAnNjFkYWZiJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogc3ZlbHRlJywgJ2ZmM2UwMCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IHNlbWFudGljLXJlbGVhc2UnLCAnNDk0OTQ5Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmVhZHkgOnJvY2tldDonLCAnMjJDNTVFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmV2aWV3IHJlcXVlc3RlZCA6bWFnOicsICdGQkNBMDQnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyZWxlYXNlZCA6Ym9va21hcms6JywgJzYzNjZGMScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDAuNWggOmNsb2NrMTIzMDonLCAnRjNGNEY2Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogMWggOmNsb2NrMTonLCAnRTVFN0VCJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogMmggOmNsb2NrMjonLCAnRDFENURCJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogM2ggOmNsb2NrMzonLCAnOUNBM0FGJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogNWggOmNsb2NrNTonLCAnNkI3MjgwJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogOGggOmNsb2NrODonLCAnNEI1NTYzJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogMTNoIDpjbG9jazE6JywgJzM3NDE1MScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGJ1aWxkIDpoYW1tZXI6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGNob3JlIDpicm9vbTonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogY2kgOmNvbnN0cnVjdGlvbl93b3JrZXI6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGRvY3MgOm1lbW86JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGZlYXQgOnNwYXJrbGVzOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBmaXggOmJ1ZzonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogcGVyZiA6emFwOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiByZWZhY3RvciA6cmVjeWNsZTonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogc3R5bGUgOmxpcHN0aWNrOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiB0ZXN0IDp0ZXN0X3R1YmU6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Byb2plY3QnLCAnMjQyOTJGJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZm9jdXNlZCA6ZGFydDonLCAnMjJDNTVFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZ2VuLXByLWFsbCA6cm9ib3Q6JywgJzAwQjREOCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2dlbi1wci1jbGF1ZGUgOnJvYm90OicsICcwMEI0RDgnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdnZW4tcHItY29kZXggOnJvYm90OicsICcwMEI0RDgnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdnZW4tcHItZ2VtaW5pIDpyb2JvdDonLCAnMDBCNEQ4Jyk7XG5cbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnYnVnJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2RvY3VtZW50YXRpb24nKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZHVwbGljYXRlJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2VuaGFuY2VtZW50Jyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2dvb2QgZmlyc3QgaXNzdWUnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnaGVscCB3YW50ZWQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnaW52YWxpZCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdxdWVzdGlvbicpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd3b250Zml4Jyk7XG5cbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmVhZHknKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmV2aWV3IHJlcXVlc3RlZCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyZWxlYXNlZCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzZW1hbnRpYy1yZWxlYXNlJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2xsbS1wciA6cm9ib3Q6Jyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2FpLXByIDpyb2JvdDonKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKCdTa2lwIHNldHVwTGFiZWxzIGR1ZSB0bzonLCAoZXJyb3IgYXMgRXJyb3IgfCB1bmRlZmluZWQpPy5zdGFjayA/PyBlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0dXBMYWJlbChvY3Rva2l0OiBPY3Rva2l0LCBvd25lcjogc3RyaW5nLCByZXBvOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgY29sb3I6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIC8vIElzc3VlcyBwZXJtaXNzaW9uXG4gICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHMnLCB7XG4gICAgICBvd25lcixcbiAgICAgIHJlcG8sXG4gICAgICBuYW1lLFxuICAgICAgY29sb3IsXG4gICAgfSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIElzc3VlcyBwZXJtaXNzaW9uXG4gICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vbGFiZWxzL3tuYW1lfScsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIG5hbWUsXG4gICAgICBjb2xvcixcbiAgICB9KTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBkZWxldGVMYWJlbChvY3Rva2l0OiBPY3Rva2l0LCBvd25lcjogc3RyaW5nLCByZXBvOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIC8vIElzc3VlcyBwZXJtaXNzaW9uXG4gICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVscy97bmFtZX0nLCB7XG4gICAgICBvd25lcixcbiAgICAgIHJlcG8sXG4gICAgICBuYW1lLFxuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cbiIsImltcG9ydCBkb3RlbnYgZnJvbSAnZG90ZW52JztcbmltcG9ydCBzb2RpdW0gZnJvbSAnbGlic29kaXVtLXdyYXBwZXJzJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuLi9vcHRpb25zLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2V0T2N0b2tpdCwgZ2l0SHViVXRpbCwgaGFzR2l0SHViVG9rZW4gfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcblxuY29uc3QgREVQUkVDQVRFRF9TRUNSRVRfTkFNRVMgPSBbJ1JFQURZX0RJU0NPUkRfV0VCSE9PS19VUkwnLCAnR0hfQk9UX1BBVCcsICdQVUJMSUNfR0hfQk9UX1BBVCddO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0dXBTZWNyZXRzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ3NldHVwU2VjcmV0cycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBbb3duZXIsIHJlcG9dID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGNvbmZpZy5yZXBvc2l0b3J5ID8/ICcnKTtcbiAgICBpZiAoIW93bmVyIHx8ICFyZXBvIHx8IG93bmVyICE9PSAnV2lsbEJvb3N0ZXJMYWInKSByZXR1cm47XG4gICAgaWYgKCFoYXNHaXRIdWJUb2tlbihvd25lcikgfHwgIW9wdGlvbnMuZG9lc1VwbG9hZEVudlZhcnMpIHJldHVybjtcblxuICAgIGNvbnN0IHBhcnNlZCA9IGRvdGVudi5jb25maWcoKS5wYXJzZWQgPz8ge307XG4gICAgaWYgKE9iamVjdC5rZXlzKHBhcnNlZCkubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICBjb25zdCBvY3Rva2l0ID0gZ2V0T2N0b2tpdChvd25lcik7XG5cbiAgICB0cnkge1xuICAgICAgZm9yIChjb25zdCBzZWNyZXROYW1lIG9mIERFUFJFQ0FURURfU0VDUkVUX05BTUVTKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gUmVxdWlyZXMgU2VjcmV0cyBwZXJtaXNzaW9uXG4gICAgICAgICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvc2VjcmV0cy97c2VjcmV0X25hbWV9Jywge1xuICAgICAgICAgICAgb3duZXIsXG4gICAgICAgICAgICByZXBvLFxuICAgICAgICAgICAgc2VjcmV0X25hbWU6IHNlY3JldE5hbWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBSZXF1aXJlcyBTZWNyZXRzIHBlcm1pc3Npb25cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvc2VjcmV0cy9wdWJsaWMta2V5Jywge1xuICAgICAgICBvd25lcixcbiAgICAgICAgcmVwbyxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgeyBrZXksIGtleV9pZDoga2V5SWQgfSA9IHJlc3BvbnNlLmRhdGE7XG5cbiAgICAgIGF3YWl0IHNvZGl1bS5yZWFkeTtcblxuICAgICAgZm9yIChjb25zdCBbbmFtZSwgc2VjcmV0XSBvZiBPYmplY3QuZW50cmllcyhwYXJzZWQpKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBuYW1lID09PSAnR0hfQk9UX1BBVCcgfHxcbiAgICAgICAgICBuYW1lID09PSAnR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVInIHx8XG4gICAgICAgICAgbmFtZSA9PT0gJ0dIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSTEFCJ1xuICAgICAgICApIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbnZlcnQgU2VjcmV0ICYgQmFzZTY0IGtleSB0byBVaW50OEFycmF5LlxuICAgICAgICBjb25zdCByYXdLZXkgPSBzb2RpdW0uZnJvbV9iYXNlNjQoa2V5LCBzb2RpdW0uYmFzZTY0X3ZhcmlhbnRzLk9SSUdJTkFMKTtcbiAgICAgICAgY29uc3QgcmF3U2VjID0gc29kaXVtLmZyb21fc3RyaW5nKHNlY3JldCk7XG5cbiAgICAgICAgLy8gRW5jcnlwdCB0aGUgc2VjcmV0IHVzaW5nIExpYlNvZGl1bVxuICAgICAgICBjb25zdCBlbmNCeXRlcyA9IHNvZGl1bS5jcnlwdG9fYm94X3NlYWwocmF3U2VjLCByYXdLZXkpO1xuXG4gICAgICAgIC8vIENvbnZlcnQgZW5jcnlwdGVkIFVpbnQ4QXJyYXkgdG8gQmFzZTY0XG4gICAgICAgIGNvbnN0IGVuY0Jhc2U2NCA9IHNvZGl1bS50b19iYXNlNjQoZW5jQnl0ZXMsIHNvZGl1bS5iYXNlNjRfdmFyaWFudHMuT1JJR0lOQUwpO1xuXG4gICAgICAgIC8vIFJlcXVpcmVzIFNlY3JldHMgcGVybWlzc2lvblxuICAgICAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ1BVVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9zZWNyZXRzL3tzZWNyZXRfbmFtZX0nLCB7XG4gICAgICAgICAgb3duZXIsXG4gICAgICAgICAgcmVwbyxcbiAgICAgICAgICBzZWNyZXRfbmFtZTogbmFtZSxcbiAgICAgICAgICBlbmNyeXB0ZWRfdmFsdWU6IGVuY0Jhc2U2NCxcbiAgICAgICAgICBrZXlfaWQ6IGtleUlkLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKCdTa2lwIHNldHVwU2VjcmV0cyBkdWUgdG86JywgKGVycm9yIGFzIEVycm9yIHwgdW5kZWZpbmVkKT8uc3RhY2sgPz8gZXJyb3IpO1xuICAgIH1cbiAgfSk7XG59XG4iLCJpbXBvcnQgeyB3aXRoUmV0cnkgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYic7XG5cbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2V0T2N0b2tpdCwgZ2l0SHViVXRpbCwgaGFzR2l0SHViVG9rZW4gfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwR2l0SHViU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IFtvd25lciwgcmVwb10gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUoY29uZmlnLnJlcG9zaXRvcnkgPz8gJycpO1xuICBpZiAoIW93bmVyIHx8ICFyZXBvKSByZXR1cm47XG4gIGlmIChvd25lciAhPT0gJ1dpbGxCb29zdGVyJyAmJiBvd25lciAhPT0gJ1dpbGxCb29zdGVyTGFiJykgcmV0dXJuO1xuICBpZiAoIWhhc0dpdEh1YlRva2VuKG93bmVyKSkgcmV0dXJuO1xuXG4gIGNvbnN0IG9jdG9raXQgPSBnZXRPY3Rva2l0KG93bmVyKTtcblxuICAvLyBBZG1pbmlzdHJhdGlvbiBwZXJtaXNzaW9uXG4gIGF3YWl0IHdpdGhSZXRyeSgoKSA9PlxuICAgIG9jdG9raXQucmVxdWVzdCgnUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99Jywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgYWxsb3dfYXV0b19tZXJnZTogdHJ1ZSxcbiAgICAgIGFsbG93X21lcmdlX2NvbW1pdDogZmFsc2UsXG4gICAgICBhbGxvd19zcXVhc2hfbWVyZ2U6IHRydWUsXG4gICAgICBhbGxvd19yZWJhc2VfbWVyZ2U6IGZhbHNlLFxuICAgICAgYWxsb3dfdXBkYXRlX2JyYW5jaDogdHJ1ZSxcbiAgICAgIGRlbGV0ZV9icmFuY2hfb25fbWVyZ2U6IHRydWUsXG4gICAgICBzcXVhc2hfbWVyZ2VfY29tbWl0X3RpdGxlOiAnUFJfVElUTEUnLFxuICAgICAgc3F1YXNoX21lcmdlX2NvbW1pdF9tZXNzYWdlOiAnQkxBTksnLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAnWC1HaXRIdWItQXBpLVZlcnNpb24nOiAnMjAyMi0xMS0yOCcsXG4gICAgICB9LFxuICAgICAgLi4uKGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXIvJykgPyB7IGFsbG93X2F1dG9fbWVyZ2U6IHRydWUgfSA6IHt9KSxcbiAgICB9KVxuICApO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgZGlzdGFuY2UgfSBmcm9tICdmYXN0ZXN0LWxldmVuc2h0ZWluJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBwYWNrYWdlTWFuYWdlclJ1blBsYWNlaG9sZGVyID0gJ19fUE1fUlVOX18nO1xuXG5jb25zdCB0ZW1wbGF0ZXMgPSB7XG4gICdwdWxsX3JlcXVlc3RfdGVtcGxhdGUubWQnOiBgXG5DbG9zZSAjPElzc3VlTnVtYmVyPlxuXG4jIyBTZWxmIENoZWNrXG5cbi0gWyBdIEkndmUgY29uZmlybWVkIFxcYEFsbCBjaGVja3MgaGF2ZSBwYXNzZWRcXGAgb24gdGhpcyBwYWdlLlxuICAtIFBSIHRpdGxlIGZvbGxvd3MgW0FuZ3VsYXIncyBjb21taXQgbWVzc2FnZSBmb3JtYXRdKGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvYmxvYi9tYWluL0NPTlRSSUJVVElORy5tZCMtY29tbWl0LW1lc3NhZ2UtZm9ybWF0KS5cbiAgLSBQUiB0aXRsZSBkb2Vzbid0IGhhdmUgXFxgV0lQOlxcYC5cbiAgLSBUaGUgdGVzdCBjb21tYW5kIChlLmcuLCBcXGAke3BhY2thZ2VNYW5hZ2VyUnVuUGxhY2Vob2xkZXJ9IHRlc3RcXGApIHBhc3NlZC5cbiAgLSBUaGUgbGludCBjb21tYW5kIChlLmcuLCBcXGAke3BhY2thZ2VNYW5hZ2VyUnVuUGxhY2Vob2xkZXJ9IGxpbnRcXGApIHBhc3NlZC5cbiAgLSBZb3UgbWF5IGxlYXZlIHRoaXMgYm94IHVuY2hlY2tlZCBkdWUgdG8gbG9uZyB3b3JrZmxvd3MuXG4tIFsgXSBJJ3ZlIHJldmlld2VkIG15IGNoYW5nZXMgb24gdGhlIEdpdEh1YiBkaWZmIHZpZXcuXG4tIFsgXSBJJ3ZlIHdyaXR0ZW4gdGhlIHN0ZXBzIHRvIHRlc3QgbXkgY2hhbmdlcy5cbi0gWyBdIEkndmUgYWRkZWQgc2NyZWVuc2hvdHMgKGlmIHRoZSBVSSBjaGFuZ2VkKS5cbiAgLSBZb3UgbWF5IGxlYXZlIHRoaXMgYm94IHVuY2hlY2tlZCBpZiB5b3UgZGlkbid0IG1vZGlmeSB0aGUgVUkuXG5cbjwhLS0gUGxlYXNlIGFkZCBzY3JlZW5zaG90cyBpZiB5b3UgbW9kaWZ5IHRoZSBVSS5cbnwgQ3VycmVudCAgICAgICAgICAgICAgICAgIHwgSW4gY29taW5nICAgICAgICAgICAgICAgIHxcbnwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHxcbnwgPGltZyBzcmM9XCJcIiB3aWR0aD1cIjQwMFwiPiB8IDxpbWcgc3JjPVwiXCIgd2lkdGg9XCI0MDBcIj4gfFxuLS0+XG5cbjwhLS0gUGxlYXNlIGFkZCBzdGVwcyB0byB0ZXN0IHlvdXIgY2hhbmdlcy5cbiMjIFN0ZXBzIHRvIFRlc3RcblxuMS4gT3BlbiBodHRwOi8vbG9jYWxob3N0LWV4ZXJjb2RlLndpbGxib29zdGVyLm5ldDozMDAwL2phLUpQL2NvdXJzZXMvX2V4YW1wbGUvbGVzc29ucy9fZXhhbXBsZV9hX3BsdXNfYi9wcm9ibGVtcy9fZXhhbXBsZV9hX3BsdXNfYiBhZnRlciBsb2dpbi5cbjIuIFNlbGVjdCB0aGUgbGFuZ3VhZ2UgXFxgQ1xcYC5cbjMuIFdyaXRlIHRoZSBmb2xsb3dpbmcgY29kZTpcbiAgIFxcYFxcYFxcYGNcbiAgICNpbmNsdWRlIDxzdGRpby5oPlxuXG4gICBpbnQgbWFpbih2b2lkKSB7XG4gICAgIGludCBhLCBiO1xuXG4gICAgIHNjYW5mKFwiJWQgJWRcIiwgJmEsICZiKTtcbiAgICAgcHJpbnRmKFwiJWRcIiwgYSArIGIpO1xuICAgICByZXR1cm4gMDtcbiAgIH1cbiAgIFxcYFxcYFxcYFxuNC4gUHVzaCBcXGBTdWJtaXRcXGAgYnV0dG9uLlxuNS4gLi4uXG4tLT5cbmAudHJpbSgpLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlR2l0SHViVGVtcGxhdGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlR2l0SHViVGVtcGxhdGVzJywgYXN5bmMgKCkgPT4ge1xuICAgIGZvciAoY29uc3QgW2ZpbGVOYW1lLCBuZXdDb250ZW50XSBvZiBPYmplY3QuZW50cmllcyh0ZW1wbGF0ZXMpKSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXBwbHlQYWNrYWdlTWFuYWdlclRlbXBsYXRlKG5ld0NvbnRlbnQsIGNvbmZpZyk7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRodWInLCBmaWxlTmFtZSk7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHtcbiAgICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgICBpZiAoZGlzdGFuY2Uob2xkQ29udGVudCwgY29udGVudCkgPiBjb250ZW50Lmxlbmd0aCAvIDIpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aHViJyksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQpKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBhcHBseVBhY2thZ2VNYW5hZ2VyVGVtcGxhdGUodGVtcGxhdGU6IHN0cmluZywgY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgY29uc3QgcGFja2FnZU1hbmFnZXJDb21tYW5kID0gY29uZmlnLmlzQnVuID8gJ2J1biBydW4nIDogJ3lhcm4nO1xuICByZXR1cm4gdGVtcGxhdGUucmVwbGFjZUFsbChwYWNrYWdlTWFuYWdlclJ1blBsYWNlaG9sZGVyLCBwYWNrYWdlTWFuYWdlckNvbW1hbmQpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IGZzcCBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuaW1wb3J0IHsgc2ltcGxlR2l0IH0gZnJvbSAnc2ltcGxlLWdpdCc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcbmltcG9ydCB7IHogfSBmcm9tICd6b2QnO1xuXG5pbXBvcnQgeyBnZXRPY3Rva2l0LCBnaXRIdWJVdGlsIH0gZnJvbSAnLi91dGlscy9naXRodWJVdGlsLmpzJztcbmltcG9ydCB7IGdsb2JJZ25vcmUgfSBmcm9tICcuL3V0aWxzL2dsb2JVdGlsLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBQYWNrYWdlQ29uZmlnIHtcbiAgZGlyUGF0aDogc3RyaW5nO1xuICBkb2NrZXJmaWxlOiBzdHJpbmc7XG4gIGlzUm9vdDogYm9vbGVhbjtcbiAgaXNQdWJsaWNSZXBvOiBib29sZWFuO1xuICBpc1JlZmVycmVkQnlPdGhlclJlcG86IGJvb2xlYW47XG4gIHJlcG9zaXRvcnk/OiBzdHJpbmc7XG4gIHJlcG9BdXRob3I/OiBzdHJpbmc7XG4gIHJlcG9OYW1lPzogc3RyaW5nO1xuICBpc1dpbGxCb29zdGVyUmVwbzogYm9vbGVhbjtcbiAgaXNCdW46IGJvb2xlYW47XG4gIGlzRXNtUGFja2FnZTogYm9vbGVhbjtcbiAgaXNXaWxsQm9vc3RlckNvbmZpZ3M6IGJvb2xlYW47XG4gIC8vIGRlcGVuZGVuY3kgaW5mb3JtYXRpb25cbiAgZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluRG9ja2VyZmlsZTogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5HZW1maWxlOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkdvTW9kOiBib29sZWFuO1xuICBkb2VzQ29udGFpblBhY2thZ2VKc29uOiBib29sZWFuO1xuICBkb2VzQ29udGFpblBvZXRyeUxvY2s6IGJvb2xlYW47XG4gIGRvZXNDb250YWluUG9tWG1sOiBib29sZWFuO1xuICBkb2VzQ29udGFpblB1YnNwZWNZYW1sOiBib29sZWFuO1xuICBkb2VzQ29udGFpblRlbXBsYXRlWWFtbDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Wc2NvZGVTZXR0aW5nc0pzb246IGJvb2xlYW47XG4gIC8vIHNvdXJjZSBjb2RlIGZpbGVzXG4gIGRvZXNDb250YWluSmF2YVNjcmlwdDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5UeXBlU2NyaXB0OiBib29sZWFuO1xuICBkb2VzQ29udGFpbkpzeE9yVHN4OiBib29sZWFuO1xuICBkb2VzQ29udGFpbkphdmFTY3JpcHRJblBhY2thZ2VzOiBib29sZWFuO1xuICBkb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkpzeE9yVHN4SW5QYWNrYWdlczogYm9vbGVhbjtcblxuICBoYXNTdGFydFRlc3RTZXJ2ZXI6IGJvb2xlYW47XG5cbiAgZGVwZW5kaW5nOiB7XG4gICAgYmxpdHo6IGJvb2xlYW47XG4gICAgZmlyZWJhc2U6IGJvb2xlYW47XG4gICAgZ2VuSTE4blRzOiBib29sZWFuO1xuICAgIGxpdGVzdHJlYW06IGJvb2xlYW47XG4gICAgbmV4dDogYm9vbGVhbjtcbiAgICBwbGF5d3JpZ2h0VGVzdDogYm9vbGVhbjtcbiAgICBwcmlzbWE6IGJvb2xlYW47XG4gICAgcHlyaWdodDogYm9vbGVhbjtcbiAgICByZWFjdDogYm9vbGVhbjtcbiAgICByZWFjdE5hdGl2ZTogYm9vbGVhbjtcbiAgICBzZW1hbnRpY1JlbGVhc2U6IGJvb2xlYW47XG4gICAgc3Rvcnlib29rOiBib29sZWFuO1xuICAgIHdiOiBib29sZWFuO1xuICB9O1xuICByZWxlYXNlOiB7XG4gICAgYnJhbmNoZXM6IHN0cmluZ1tdO1xuICAgIGdpdGh1YjogYm9vbGVhbjtcbiAgICBucG06IGJvb2xlYW47XG4gIH07XG4gIGVzbGludEJhc2U/OiBFc2xpbnRFeHRlbnNpb25CYXNlO1xuICBoYXNWZXJzaW9uU2V0dGluZ3M6IGJvb2xlYW47XG4gIHBhY2thZ2VKc29uPzogUGFja2FnZUpzb247XG4gIHdiZnlKc29uPzogV2JmeUpzb247XG59XG5cbnR5cGUgV2JmeUpzb24gPSB6LmluZmVyPHR5cGVvZiB3YmZ5SnNvblNjaGVtYT47XG5cbmNvbnN0IHdiZnlKc29uU2NoZW1hID0gei5vYmplY3Qoe1xuICB0eXBvczogelxuICAgIC5vYmplY3Qoe1xuICAgICAgYWxsOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgICAgZG9jOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgICAgdHM6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgICB0ZXh0OiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgIH0pXG4gICAgLm9wdGlvbmFsKCksXG59KTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFBhY2thZ2VDb25maWcoXG4gIGRpclBhdGg6IHN0cmluZyxcbiAgcm9vdENvbmZpZz86IFBhY2thZ2VDb25maWdcbik6IFByb21pc2U8UGFja2FnZUNvbmZpZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICB0cnkge1xuICAgIGNvbnN0IGRvZXNDb250YWluUGFja2FnZUpzb24gPSBmcy5leGlzdHNTeW5jKHBhY2thZ2VKc29uUGF0aCk7XG4gICAgbGV0IGRlcGVuZGVuY2llczogUGFja2FnZUpzb25bJ2RlcGVuZGVuY2llcyddID0ge307XG4gICAgbGV0IGRldkRlcGVuZGVuY2llczogUGFja2FnZUpzb25bJ2RldkRlcGVuZGVuY2llcyddID0ge307XG4gICAgbGV0IHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiA9IHt9O1xuICAgIGxldCBlc21QYWNrYWdlID0gZmFsc2U7XG4gICAgaWYgKGRvZXNDb250YWluUGFja2FnZUpzb24pIHtcbiAgICAgIGNvbnN0IHBhY2thZ2VKc29uVGV4dCA9IGZzLnJlYWRGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgsICd1dGY4Jyk7XG4gICAgICBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UocGFja2FnZUpzb25UZXh0KSBhcyBQYWNrYWdlSnNvbjtcbiAgICAgIGRlcGVuZGVuY2llcyA9IHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICAgIGRldkRlcGVuZGVuY2llcyA9IHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICAgIGVzbVBhY2thZ2UgPSBwYWNrYWdlSnNvbi50eXBlID09PSAnbW9kdWxlJztcbiAgICB9XG5cbiAgICBsZXQgcmVsZWFzZUJyYW5jaGVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCByZWxlYXNlUGx1Z2luczogc3RyaW5nW10gPSBbXTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVsZWFzZXJjSnNvblBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy5yZWxlYXNlcmMuanNvbicpO1xuICAgICAgY29uc3QganNvbiA9IEpTT04ucGFyc2UoYXdhaXQgZnNwLnJlYWRGaWxlKHJlbGVhc2VyY0pzb25QYXRoLCAndXRmOCcpKSBhc1xuICAgICAgICB8IHtcbiAgICAgICAgICAgIGJyYW5jaGVzOiBzdHJpbmdbXTtcbiAgICAgICAgICAgIHBsdWdpbnM/OiBzdHJpbmdbXVtdO1xuICAgICAgICAgIH1cbiAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICByZWxlYXNlQnJhbmNoZXMgPSBqc29uPy5icmFuY2hlcyA/PyBbXTtcbiAgICAgIHJlbGVhc2VQbHVnaW5zID0ganNvbj8ucGx1Z2lucz8uZmxhdCgpID8/IFtdO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cblxuICAgIGNvbnN0IGlzUm9vdCA9XG4gICAgICBwYXRoLmJhc2VuYW1lKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLi4nKSkgIT09ICdwYWNrYWdlcycgfHxcbiAgICAgICFmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLi4nLCAnLi4nLCAncGFja2FnZS5qc29uJykpO1xuXG4gICAgbGV0IHJlcG9JbmZvOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICBpZiAoaXNSb290KSB7XG4gICAgICByZXBvSW5mbyA9IGF3YWl0IGZldGNoUmVwb0luZm8oZGlyUGF0aCwgcGFja2FnZUpzb24pO1xuICAgIH1cblxuICAgIGxldCBoYXNWZXJzaW9uU2V0dGluZ3MgPSBoYXNWZXJzaW9uU2V0dGluZ3NGaWxlKGRpclBhdGgpO1xuICAgIGZvciAoY29uc3QgcHJlZml4IG9mIFsnamF2YScsICdub2RlJywgJ3B5dGhvbiddKSB7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgYC4ke3ByZWZpeH0tdmVyc2lvbmApKSkge1xuICAgICAgICBoYXNWZXJzaW9uU2V0dGluZ3MgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgZG9ja2VyZmlsZSA9ICcnO1xuICAgIHRyeSB7XG4gICAgICBkb2NrZXJmaWxlID0gYXdhaXQgZnNwLnJlYWRGaWxlKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnRG9ja2VyZmlsZScpLCAndXRmOCcpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cblxuICAgIC8vIFJlYWQgd2JmeS5qc29uXG4gICAgY29uc3Qgd2JmeUpzb25QYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICd3YmZ5Lmpzb24nKTtcbiAgICBsZXQgd2JmeUpzb246IFdiZnlKc29uIHwgdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB3YmZ5SnNvblRleHQgPSBhd2FpdCBmc3AucmVhZEZpbGUod2JmeUpzb25QYXRoLCAndXRmOCcpO1xuICAgICAgd2JmeUpzb24gPSB3YmZ5SnNvblNjaGVtYS5wYXJzZShKU09OLnBhcnNlKHdiZnlKc29uVGV4dCkpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cblxuICAgIGNvbnN0IHJlcG9GdWxsTmFtZSA9IHR5cGVvZiByZXBvSW5mbz8uZnVsbF9uYW1lID09PSAnc3RyaW5nJyA/IHJlcG9JbmZvLmZ1bGxfbmFtZSA6IHVuZGVmaW5lZDtcbiAgICBsZXQgcmVwb0F1dGhvcjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGxldCByZXBvTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmIChyZXBvRnVsbE5hbWUpIHtcbiAgICAgIGNvbnN0IHJlcG9QYXJ0cyA9IHJlcG9GdWxsTmFtZS5zcGxpdCgnLycpO1xuICAgICAgaWYgKHJlcG9QYXJ0cy5sZW5ndGggPj0gMikge1xuICAgICAgICByZXBvQXV0aG9yID0gcmVwb1BhcnRzWzBdO1xuICAgICAgICByZXBvTmFtZSA9IHJlcG9QYXJ0c1sxXTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcmVwb3NpdG9yeSA9IHJlcG9GdWxsTmFtZSA/IGBnaXRodWI6JHtyZXBvRnVsbE5hbWV9YCA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBjb25maWc6IFBhY2thZ2VDb25maWcgPSB7XG4gICAgICBkaXJQYXRoLFxuICAgICAgZG9ja2VyZmlsZSxcbiAgICAgIGlzUm9vdCxcbiAgICAgIGlzUHVibGljUmVwbzogcmVwb0luZm8/LnByaXZhdGUgPT09IGZhbHNlLFxuICAgICAgaXNSZWZlcnJlZEJ5T3RoZXJSZXBvOiAhIXBhY2thZ2VKc29uLmZpbGVzLFxuICAgICAgcmVwb3NpdG9yeSxcbiAgICAgIHJlcG9BdXRob3IsXG4gICAgICByZXBvTmFtZSxcbiAgICAgIGlzV2lsbEJvb3N0ZXJSZXBvOiBCb29sZWFuKFxuICAgICAgICByZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXIvJykgfHwgcmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyTGFiLycpXG4gICAgICApLFxuICAgICAgaXNCdW46IHJvb3RDb25maWc/LmlzQnVuIHx8IGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGRpclBhdGgsICdidW4ubG9jaycpKSxcbiAgICAgIGlzRXNtUGFja2FnZTogZXNtUGFja2FnZSxcbiAgICAgIGlzV2lsbEJvb3N0ZXJDb25maWdzOiBwYWNrYWdlSnNvblBhdGguaW5jbHVkZXMoYCR7cGF0aC5zZXB9d2lsbGJvb3N0ZXItY29uZmlnc2ApLFxuICAgICAgZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnM6IGNvbnRhaW5zQW55KCdwYWNrYWdlcy8qKi9wYWNrYWdlLmpzb24nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluRG9ja2VyZmlsZTogISFkb2NrZXJmaWxlIHx8IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdkb2NrZXItY29tcG9zZS55bWwnKSksXG4gICAgICBkb2VzQ29udGFpbkdlbWZpbGU6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdHZW1maWxlJykpLFxuICAgICAgZG9lc0NvbnRhaW5Hb01vZDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2dvLm1vZCcpKSxcbiAgICAgIGRvZXNDb250YWluUGFja2FnZUpzb246IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKSksXG4gICAgICBkb2VzQ29udGFpblBvZXRyeUxvY2s6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwb2V0cnkubG9jaycpKSxcbiAgICAgIGRvZXNDb250YWluUG9tWG1sOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncG9tLnhtbCcpKSxcbiAgICAgIGRvZXNDb250YWluUHVic3BlY1lhbWw6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwdWJzcGVjLnlhbWwnKSksXG4gICAgICBkb2VzQ29udGFpblRlbXBsYXRlWWFtbDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3RlbXBsYXRlLnlhbWwnKSksXG4gICAgICBkb2VzQ29udGFpblZzY29kZVNldHRpbmdzSnNvbjogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy52c2NvZGUnLCAnc2V0dGluZ3MuanNvbicpKSxcbiAgICAgIGRvZXNDb250YWluSmF2YVNjcmlwdDogY29udGFpbnNBbnkoJ3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3h9JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpblR5cGVTY3JpcHQ6IGNvbnRhaW5zQW55KCd7YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2N0cyxtdHMsdHMsdHN4fScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5Kc3hPclRzeDogY29udGFpbnNBbnkoJ3thcHAsc3JjLHRlc3R9LyoqLyoue3Qsan1zeCcsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5KYXZhU2NyaXB0SW5QYWNrYWdlczogY29udGFpbnNBbnkoJ3BhY2thZ2VzLyoqL3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3h9JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzOiBjb250YWluc0FueSgncGFja2FnZXMvKiove2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjdHMsbXRzLHRzLHRzeH0nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluSnN4T3JUc3hJblBhY2thZ2VzOiBjb250YWluc0FueSgncGFja2FnZXMvKiove2FwcCxzcmMsdGVzdH0vKiovKi57dCxqfXN4JywgZGlyUGF0aCksXG4gICAgICBoYXNTdGFydFRlc3RTZXJ2ZXI6ICEhcGFja2FnZUpzb24uc2NyaXB0cz8uWydzdGFydC10ZXN0LXNlcnZlciddLFxuICAgICAgZGVwZW5kaW5nOiB7XG4gICAgICAgIGJsaXR6OiAhIWRlcGVuZGVuY2llcy5ibGl0eixcbiAgICAgICAgZmlyZWJhc2U6ICEhZGV2RGVwZW5kZW5jaWVzWydmaXJlYmFzZS10b29scyddLFxuICAgICAgICBnZW5JMThuVHM6ICEhZGV2RGVwZW5kZW5jaWVzWydnZW4taTE4bi10cyddLFxuICAgICAgICBsaXRlc3RyZWFtOiBkb2NrZXJmaWxlLmluY2x1ZGVzKCdpbnN0YWxsLWxpdGVzdHJlYW0uc2gnKSxcbiAgICAgICAgcmVhY3Q6ICEhZGVwZW5kZW5jaWVzLnJlYWN0LFxuICAgICAgICBuZXh0OiAhIWRlcGVuZGVuY2llcy5uZXh0LFxuICAgICAgICBwbGF5d3JpZ2h0VGVzdDpcbiAgICAgICAgICAhIWRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddIHx8ICEhZGV2RGVwZW5kZW5jaWVzWydAcGxheXdyaWdodC90ZXN0J10gfHwgISFkZXZEZXBlbmRlbmNpZXMucGxheXdyaWdodCxcbiAgICAgICAgcHJpc21hOiAhIWRlcGVuZGVuY2llc1snQHByaXNtYS9jbGllbnQnXSB8fCAhIWRldkRlcGVuZGVuY2llcy5wcmlzbWEsXG4gICAgICAgIHB5cmlnaHQ6ICEhZGV2RGVwZW5kZW5jaWVzLnB5cmlnaHQsXG4gICAgICAgIHJlYWN0TmF0aXZlOiAhIWRlcGVuZGVuY2llc1sncmVhY3QtbmF0aXZlJ10sXG4gICAgICAgIHNlbWFudGljUmVsZWFzZTogISEoXG4gICAgICAgICAgZGV2RGVwZW5kZW5jaWVzWydzZW1hbnRpYy1yZWxlYXNlJ10gfHxcbiAgICAgICAgICByZWxlYXNlQnJhbmNoZXMubGVuZ3RoID4gMCB8fFxuICAgICAgICAgIHJlbGVhc2VQbHVnaW5zLmxlbmd0aCA+IDBcbiAgICAgICAgKSxcbiAgICAgICAgc3Rvcnlib29rOiAhIWRldkRlcGVuZGVuY2llc1snQHN0b3J5Ym9vay9yZWFjdCddLFxuICAgICAgICB3YjogISFkZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci93YiddIHx8ICEhZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvd2InXSxcbiAgICAgIH0sXG4gICAgICByZWxlYXNlOiB7XG4gICAgICAgIGJyYW5jaGVzOiByZWxlYXNlQnJhbmNoZXMsXG4gICAgICAgIGdpdGh1YjogcmVsZWFzZVBsdWdpbnMuaW5jbHVkZXMoJ0BzZW1hbnRpYy1yZWxlYXNlL2dpdGh1YicpLFxuICAgICAgICBucG06IHJlbGVhc2VQbHVnaW5zLmluY2x1ZGVzKCdAc2VtYW50aWMtcmVsZWFzZS9ucG0nKSxcbiAgICAgIH0sXG4gICAgICBoYXNWZXJzaW9uU2V0dGluZ3MsXG4gICAgICBwYWNrYWdlSnNvbixcbiAgICAgIHdiZnlKc29uLFxuICAgIH07XG4gICAgaWYgKCFjb25maWcuaXNCdW4pIHtcbiAgICAgIGNvbmZpZy5lc2xpbnRCYXNlID0gZ2V0RXNsaW50RXh0ZW5zaW9uQmFzZShjb25maWcpO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5HZW1maWxlIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5Hb01vZCB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24gfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2sgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblBvbVhtbCB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblRlbXBsYXRlWWFtbFxuICAgICkge1xuICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5mdW5jdGlvbiBoYXNWZXJzaW9uU2V0dGluZ3NGaWxlKGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBjdXJyZW50ID0gcGF0aC5yZXNvbHZlKGRpclBhdGgpO1xuICByZXR1cm4gKFxuICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGN1cnJlbnQsICdtaXNlLnRvbWwnKSkgfHxcbiAgICBmcy5leGlzdHNTeW5jKHBhdGguam9pbihjdXJyZW50LCAnLm1pc2UudG9tbCcpKSB8fFxuICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGN1cnJlbnQsICcudG9vbC12ZXJzaW9ucycpKVxuICApO1xufVxuXG5mdW5jdGlvbiBjb250YWluc0FueShwYXR0ZXJuOiBzdHJpbmcsIGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZmcuZ2xvYlN5bmMocGF0dGVybiwgeyBkb3Q6IHRydWUsIGN3ZDogZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH0pLmxlbmd0aCA+IDA7XG59XG5cbmV4cG9ydCB0eXBlIEVzbGludEV4dGVuc2lvbkJhc2UgPVxuICB8ICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cy1yZWFjdCdcbiAgfCAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMnXG4gIHwgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzLXJlYWN0J1xuICB8ICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcydcbiAgfCAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctbmV4dCc7XG5cbmZ1bmN0aW9uIGdldEVzbGludEV4dGVuc2lvbkJhc2UoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogRXNsaW50RXh0ZW5zaW9uQmFzZSB8IHVuZGVmaW5lZCB7XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLm5leHQpIHtcbiAgICByZXR1cm4gJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLW5leHQnO1xuICB9IGVsc2UgaWYgKGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQpIHtcbiAgICByZXR1cm4gY29uZmlnLmRvZXNDb250YWluSnN4T3JUc3ggPyAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMtcmVhY3QnIDogJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzJztcbiAgfSBlbHNlIHtcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluSnN4T3JUc3gpIHtcbiAgICAgIHJldHVybiAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMtcmVhY3QnO1xuICAgIH0gZWxzZSBpZiAoY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdCkge1xuICAgICAgcmV0dXJuICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcyc7XG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoUmVwb0luZm8oZGlyUGF0aDogc3RyaW5nLCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGdpdCA9IHNpbXBsZUdpdChkaXJQYXRoKTtcbiAgY29uc3QgcmVtb3RlcyA9IGF3YWl0IGdpdC5nZXRSZW1vdGVzKHRydWUpO1xuICBjb25zdCBvcmlnaW4gPSByZW1vdGVzLmZpbmQoKHIpID0+IHIubmFtZSA9PT0gJ29yaWdpbicpO1xuICBjb25zdCByZW1vdGVVcmwgPSBvcmlnaW4/LnJlZnMuZmV0Y2ggPz8gb3JpZ2luPy5yZWZzLnB1c2g7XG4gIGlmICh0eXBlb2YgcmVtb3RlVXJsID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXF1ZXN0UmVwb0luZm8ocmVtb3RlVXJsKTtcbiAgICBpZiAoanNvbikgcmV0dXJuIGpzb247XG4gIH1cblxuICBjb25zdCB1cmwgPSB0eXBlb2YgcGFja2FnZUpzb24ucmVwb3NpdG9yeSA9PT0gJ3N0cmluZycgPyBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5IDogcGFja2FnZUpzb24ucmVwb3NpdG9yeT8udXJsO1xuICBpZiAodXJsKSB7XG4gICAgY29uc3QganNvbiA9IGF3YWl0IHJlcXVlc3RSZXBvSW5mbyh1cmwpO1xuICAgIGlmIChqc29uICYmIGpzb24ubWVzc2FnZSAhPT0gJ05vdCBGb3VuZCcpIHJldHVybiBqc29uO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlcXVlc3RSZXBvSW5mbyh1cmxPckZ1bGxOYW1lOiBzdHJpbmcpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IFtvcmcsIG5hbWVdID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKHVybE9yRnVsbE5hbWUpO1xuICBpZiAoIW9yZyB8fCAhbmFtZSkgcmV0dXJuO1xuXG4gIGNvbnN0IHJldCA9IHsgZnVsbF9uYW1lOiBgJHtvcmd9LyR7bmFtZX1gIH07XG4gIHRyeSB7XG4gICAgLy8gTWV0YWRhdGEgcGVybWlzc2lvblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZ2V0T2N0b2tpdCgpLnJlcXVlc3QoJ0dFVCAvcmVwb3Mve293bmVyfS97cmVwb30nLCB7XG4gICAgICBvd25lcjogb3JnLFxuICAgICAgcmVwbzogbmFtZSxcbiAgICB9KTtcbiAgICBPYmplY3QuYXNzaWduKHJldCwgcmVzcG9uc2UuZGF0YSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3QgcmVkaXJlY3RlZEZ1bGxOYW1lID0gZ2V0UmVkaXJlY3RlZFJlcG9GdWxsTmFtZShlcnJvcik7XG4gICAgaWYgKHJlZGlyZWN0ZWRGdWxsTmFtZSkge1xuICAgICAgcmV0LmZ1bGxfbmFtZSA9IHJlZGlyZWN0ZWRGdWxsTmFtZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gZ2V0UmVkaXJlY3RlZFJlcG9GdWxsTmFtZShlcnJvcjogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghZXJyb3IgfHwgdHlwZW9mIGVycm9yICE9PSAnb2JqZWN0JykgcmV0dXJuO1xuXG4gIGNvbnN0IHJlc3BvbnNlID1cbiAgICAncmVzcG9uc2UnIGluIGVycm9yXG4gICAgICA/IChlcnJvciBhcyB7IHJlc3BvbnNlPzogeyBzdGF0dXM/OiBudW1iZXI7IGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IH0gfSkucmVzcG9uc2VcbiAgICAgIDogdW5kZWZpbmVkO1xuICBjb25zdCBzdGF0dXMgPSByZXNwb25zZT8uc3RhdHVzID8/IChlcnJvciBhcyB7IHN0YXR1cz86IG51bWJlciB9KS5zdGF0dXM7XG4gIGlmIChzdGF0dXMgIT09IDMwMSAmJiBzdGF0dXMgIT09IDMwMikgcmV0dXJuO1xuXG4gIGNvbnN0IGxvY2F0aW9uID0gcmVzcG9uc2U/LmhlYWRlcnM/LmxvY2F0aW9uO1xuICBpZiAodHlwZW9mIGxvY2F0aW9uICE9PSAnc3RyaW5nJykgcmV0dXJuO1xuXG4gIGNvbnN0IFtvcmcsIG5hbWVdID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGxvY2F0aW9uKTtcbiAgaWYgKCFvcmcgfHwgIW5hbWUpIHJldHVybjtcblxuICByZXR1cm4gYCR7b3JnfS8ke25hbWV9YDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGlnbm9yZUVycm9yQXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYic7XG5pbXBvcnQgeWFyZ3MgZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaXhEb2NrZXJmaWxlIH0gZnJvbSAnLi9maXhlcnMvZG9ja2VyZmlsZS5qcyc7XG5pbXBvcnQgeyBmaXhOZXh0Q29uZmlnSnNvbiB9IGZyb20gJy4vZml4ZXJzL25leHRDb25maWcuanMnO1xuaW1wb3J0IHsgZml4UGxheXdyaWdodENvbmZpZyB9IGZyb20gJy4vZml4ZXJzL3BsYXl3cmlnaHRDb25maWcuanMnO1xuaW1wb3J0IHsgZml4UHJpc21hRW52RmlsZXMgfSBmcm9tICcuL2ZpeGVycy9wcmlzbWEuanMnO1xuaW1wb3J0IHsgZml4VGVzdERpcmVjdG9yaWVzVXBkYXRpbmdQYWNrYWdlSnNvbiB9IGZyb20gJy4vZml4ZXJzL3Rlc3REaXJlY3RvcnkuanMnO1xuaW1wb3J0IHsgZml4VHlwZURlZmluaXRpb25zIH0gZnJvbSAnLi9maXhlcnMvdHlwZURlZmluaXRpb24uanMnO1xuaW1wb3J0IHsgZml4VHlwb3MgfSBmcm9tICcuL2ZpeGVycy90eXBvcy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2FnZW50cy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUJpb21lSnNvbmMgfSBmcm9tICcuL2dlbmVyYXRvcnMvYmlvbWUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVCdW5maWdUb21sIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2J1bmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZURvY2tlcmlnbm9yZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9kb2NrZXJpZ25vcmUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVFZGl0b3Jjb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvZWRpdG9yY29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlRXNsaW50cmMgfSBmcm9tICcuL2dlbmVyYXRvcnMvZXNsaW50Q29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2VtaW5pQ29uZmlnIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dlbWluaUNvbmZpZy5qcyc7XG5pbXBvcnQgeyByZW1vdmVHZW1pbmlTZXR0aW5ncyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9nZW1pbmlTZXR0aW5ncy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMgfSBmcm9tICcuL2dlbmVyYXRvcnMvZ2l0YXR0cmlidXRlcy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUdpdGlnbm9yZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9naXRpZ25vcmUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVJZGVhU2V0dGluZ3MgfSBmcm9tICcuL2dlbmVyYXRvcnMvaWRlYS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUxlZnRob29rVXBkYXRpbmdQYWNrYWdlSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9sZWZ0aG9vay5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUxpbnRzdGFnZWRyYyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9saW50c3RhZ2VkcmMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVQYWNrYWdlSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9wYWNrYWdlSnNvbi5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVByZXR0aWVyaWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3ByZXR0aWVyaWdub3JlLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24gfSBmcm9tICcuL2dlbmVyYXRvcnMvcHlyaWdodENvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJlYWRtZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9yZWFkbWUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVSZWxlYXNlcmMgfSBmcm9tICcuL2dlbmVyYXRvcnMvcmVsZWFzZXJjLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUmVub3ZhdGVKc29uIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3Jlbm92YXRlSnNvbi5qcyc7XG5pbXBvcnQgeyBpbnN0YWxsQWdlbnRTa2lsbHMgfSBmcm9tICcuL2dlbmVyYXRvcnMvc2tpbGxzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlVHNjb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvdHNjb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyB9IGZyb20gJy4vZ2VuZXJhdG9ycy92c2NvZGVTZXR0aW5ncy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVdvcmtmbG93cywgaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8gfSBmcm9tICcuL2dlbmVyYXRvcnMvd29ya2Zsb3cuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVZYXJucmNZbWwgfSBmcm9tICcuL2dlbmVyYXRvcnMveWFybnJjLmpzJztcbmltcG9ydCB7IHNldHVwTGFiZWxzIH0gZnJvbSAnLi9naXRodWIvbGFiZWwuanMnO1xuaW1wb3J0IHsgc2V0dXBTZWNyZXRzIH0gZnJvbSAnLi9naXRodWIvc2VjcmV0LmpzJztcbmltcG9ydCB7IHNldHVwR2l0SHViU2V0dGluZ3MgfSBmcm9tICcuL2dpdGh1Yi9zZXR0aW5ncy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcyB9IGZyb20gJy4vZ2l0aHViL3RlbXBsYXRlLmpzJztcbmltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuL29wdGlvbnMuanMnO1xuaW1wb3J0IHsgZ2V0UGFja2FnZUNvbmZpZyB9IGZyb20gJy4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jIH0gZnJvbSAnLi91dGlscy9zcGF3blV0aWwuanMnO1xuaW1wb3J0IHsgc2hvdWxkU2tpcFdpbGxib29zdGVyQ29uZmlnc0VzbGludFBhY2thZ2UgfSBmcm9tICcuL3V0aWxzL3dpbGxib29zdGVyQ29uZmlnc1V0aWwuanMnO1xuXG5hc3luYyBmdW5jdGlvbiBtYWluKCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBhcmd2ID0gYXdhaXQgeWFyZ3MocHJvY2Vzcy5hcmd2LnNsaWNlKDIpKVxuICAgIC5jb21tYW5kKCckMCBbcGF0aHMuLl0nLCAnTWFrZSBhIGdpdmVuIHByb2plY3QgZm9sbG93IHRoZSBXaWxsQm9vc3RlciBzdGFuZGFyZCcsICh5YXJncykgPT4ge1xuICAgICAgeWFyZ3MucG9zaXRpb25hbCgncGF0aHMnLCB7XG4gICAgICAgIGRlc2NyaWJlOiAncHJvamVjdCBwYXRocyB0byBiZSB3YmZpZWQnLFxuICAgICAgICBhcnJheTogdHJ1ZSxcbiAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgIGRlZmF1bHQ6IFsnLiddLFxuICAgICAgfSk7XG4gICAgfSlcbiAgICAub3B0aW9ucyh7XG4gICAgICBlbnY6IHtcbiAgICAgICAgZGVzY3JpcHRpb246ICdVcGxvYWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFzIHNlY3JldHMgdG8gR2l0SHViJyxcbiAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgYWxpYXM6ICdlJyxcbiAgICAgIH0sXG4gICAgICBza2lwRGVwczoge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ1NraXAgZGVwZW5kZW5jeSBpbnN0YWxsYXRpb24nLFxuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICBhbGlhczogJ2QnLFxuICAgICAgfSxcbiAgICAgIHZlcmJvc2U6IHtcbiAgICAgICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIG9yIG5vdCB0byBlbmFibGUgdmVyYm9zZSBtb2RlJyxcbiAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgYWxpYXM6ICd2JyxcbiAgICAgIH0sXG4gICAgfSlcbiAgICAudmVyc2lvbihnZXRWZXJzaW9uKCkpXG4gICAgLnN0cmljdCgpLmFyZ3Y7XG4gIG9wdGlvbnMuaXNWZXJib3NlID0gYXJndi52ZXJib3NlO1xuICBvcHRpb25zLmRvZXNVcGxvYWRFbnZWYXJzID0gYXJndi5lbnY7XG5cbiAgZm9yIChjb25zdCByb290RGlyUGF0aCBvZiBhcmd2LnBhdGhzIGFzIHN0cmluZ1tdKSB7XG4gICAgY29uc3QgcGFja2FnZXNEaXJQYXRoID0gcGF0aC5qb2luKHJvb3REaXJQYXRoLCAncGFja2FnZXMnKTtcbiAgICBjb25zdCBkaXJlbnRzID0gKGF3YWl0IGlnbm9yZUVycm9yQXN5bmMoKCkgPT4gZnMucHJvbWlzZXMucmVhZGRpcihwYWNrYWdlc0RpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KSkpID8/IFtdO1xuICAgIGNvbnN0IHN1YkRpclBhdGhzID0gZGlyZW50cy5maWx0ZXIoKGQpID0+IGQuaXNEaXJlY3RvcnkoKSkubWFwKChkKSA9PiBwYXRoLmpvaW4ocGFja2FnZXNEaXJQYXRoLCBkLm5hbWUpKTtcblxuICAgIGF3YWl0IGZpeFRlc3REaXJlY3Rvcmllc1VwZGF0aW5nUGFja2FnZUpzb24oW3Jvb3REaXJQYXRoLCAuLi5zdWJEaXJQYXRoc10pO1xuXG4gICAgY29uc3Qgcm9vdENvbmZpZyA9IGF3YWl0IGdldFBhY2thZ2VDb25maWcocm9vdERpclBhdGgpO1xuICAgIGNvbnNvbGUubG9nKCdyb290Q29uZmlnOicsIHJvb3RDb25maWcpO1xuICAgIGlmICghcm9vdENvbmZpZykge1xuICAgICAgY29uc29sZS5lcnJvcihgdGhlcmUgaXMgbm8gdmFsaWQgcGFja2FnZS5qc29uIGluICR7cm9vdERpclBhdGh9YCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgYWJicmV2aWF0aW9uUHJvbWlzZSA9IGZpeFR5cG9zKHJvb3RDb25maWcpO1xuXG4gICAgY29uc3QgbnVsbGFibGVTdWJQYWNrYWdlQ29uZmlncyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgc3ViRGlyUGF0aHMubWFwKChzdWJEaXJQYXRoKSA9PiBnZXRQYWNrYWdlQ29uZmlnKHN1YkRpclBhdGgsIHJvb3RDb25maWcpKVxuICAgICk7XG4gICAgY29uc3Qgc3ViUGFja2FnZUNvbmZpZ3MgPSBudWxsYWJsZVN1YlBhY2thZ2VDb25maWdzLmZpbHRlcigoY29uZmlnKSA9PiAhIWNvbmZpZyk7XG4gICAgY29uc3QgYWxsUGFja2FnZUNvbmZpZ3MgPSBbcm9vdENvbmZpZywgLi4uc3ViUGFja2FnZUNvbmZpZ3NdO1xuXG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBmb3IgKGNvbnN0IGNvbmZpZyBvZiBhbGxQYWNrYWdlQ29uZmlncykge1xuICAgICAgICBjb25zb2xlLmluZm8oY29uZmlnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJbnN0YWxsIHlhcm4gYmVycnlcbiAgICBhd2FpdCBnZW5lcmF0ZVlhcm5yY1ltbChyb290Q29uZmlnKTtcbiAgICBpZiAocm9vdENvbmZpZy5pc0J1bikge1xuICAgICAgYXdhaXQgZ2VuZXJhdGVCdW5maWdUb21sKHJvb3RDb25maWcpO1xuICAgIH1cblxuICAgIGNvbnN0IHNob3VsZFJ1bldvcmtmbG93cyA9XG4gICAgICAhaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8ocm9vdENvbmZpZy5yZXBvc2l0b3J5KSAmJlxuICAgICAgKHJvb3RDb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyLycpIHx8XG4gICAgICAgIHJvb3RDb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyTGFiLycpKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBmaXhEb2NrZXJmaWxlKHJvb3RDb25maWcpLFxuICAgICAgZml4UHJpc21hRW52RmlsZXMocm9vdENvbmZpZyksXG4gICAgICBhYmJyZXZpYXRpb25Qcm9taXNlLnRoZW4oKCkgPT4gZ2VuZXJhdGVSZWFkbWUocm9vdENvbmZpZykpLFxuICAgICAgZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucyhyb290Q29uZmlnLCBhbGxQYWNrYWdlQ29uZmlncyksXG4gICAgICBnZW5lcmF0ZURvY2tlcmlnbm9yZShyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlRWRpdG9yY29uZmlnKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVHZW1pbmlDb25maWcocm9vdENvbmZpZywgYWxsUGFja2FnZUNvbmZpZ3MpLFxuICAgICAgcmVtb3ZlR2VtaW5pU2V0dGluZ3Mocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlSWRlYVNldHRpbmdzKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVSZW5vdmF0ZUpzb24ocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZVJlbGVhc2VyYyhyb290Q29uZmlnKSxcbiAgICAgIC4uLihzaG91bGRSdW5Xb3JrZmxvd3MgPyBbZ2VuZXJhdGVXb3JrZmxvd3Mocm9vdENvbmZpZyldIDogW10pLFxuICAgICAgc2V0dXBMYWJlbHMocm9vdENvbmZpZyksXG4gICAgICBzZXR1cFNlY3JldHMocm9vdENvbmZpZyksXG4gICAgICBzZXR1cEdpdEh1YlNldHRpbmdzKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVMZWZ0aG9va1VwZGF0aW5nUGFja2FnZUpzb24ocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUxpbnRzdGFnZWRyYyhyb290Q29uZmlnKSxcbiAgICBdKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG5cbiAgICBjb25zdCBwcm9taXNlczogUHJvbWlzZTx2b2lkPltdID0gW107XG4gICAgZm9yIChjb25zdCBjb25maWcgb2YgYWxsUGFja2FnZUNvbmZpZ3MpIHtcbiAgICAgIGlmIChzaG91bGRTa2lwV2lsbGJvb3N0ZXJDb25maWdzRXNsaW50UGFja2FnZShjb25maWcpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXMpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChmaXhUeXBlRGVmaW5pdGlvbnMoY29uZmlnLCBjb25maWcuaXNSb290ID8gYWxsUGFja2FnZUNvbmZpZ3MgOiBbY29uZmlnXSkpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChmaXhQbGF5d3JpZ2h0Q29uZmlnKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGZpeE5leHRDb25maWdKc29uKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgYXdhaXQgZ2VuZXJhdGVHaXRpZ25vcmUoY29uZmlnLCByb290Q29uZmlnKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgICAgIGlmICghY29uZmlnLmlzUm9vdCAmJiAhY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBhd2FpdCBnZW5lcmF0ZVByZXR0aWVyaWdub3JlKGNvbmZpZyk7XG4gICAgICBhd2FpdCBnZW5lcmF0ZVBhY2thZ2VKc29uKGNvbmZpZywgcm9vdENvbmZpZywgYXJndi5za2lwRGVwcyk7XG5cbiAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVMaW50c3RhZ2VkcmMoY29uZmlnKSk7XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluVnNjb2RlU2V0dGluZ3NKc29uICYmIGNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyhjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVUc2NvbmZpZyhjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdCB8fFxuICAgICAgICBjb25maWcuZG9lc0NvbnRhaW5KYXZhU2NyaXB0SW5QYWNrYWdlcyB8fFxuICAgICAgICBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8XG4gICAgICAgIGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzXG4gICAgICApIHtcbiAgICAgICAgaWYgKHJvb3RDb25maWcuaXNCdW4pIHtcbiAgICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlQmlvbWVKc29uYyhjb25maWcpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJvb3RDb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3MpIHtcbiAgICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlRXNsaW50cmMoY29uZmlnKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnB5cmlnaHQpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZVB5cmlnaHRDb25maWdKc29uKGNvbmZpZykpO1xuICAgICAgfVxuICAgIH1cbiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuXG4gICAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSByb290Q29uZmlnLmlzQnVuID8gJ2J1bicgOiAneWFybic7XG4gICAgLy8gUmVmcmVzaCBsb2NrIGZpbGVzXG4gICAgaWYgKHJvb3RDb25maWcuaXNCdW4pIHtcbiAgICAgIGZzLnJtU3luYyhwYXRoLmpvaW4ocm9vdERpclBhdGgsICdidW4ubG9jaycpLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ3VwZGF0ZSddLCByb290RGlyUGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZzLnJtU3luYyhwYXRoLmpvaW4ocm9vdERpclBhdGgsICd5YXJuLmxvY2snKSwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydpbnN0YWxsJywgJy0tbm8taW1tdXRhYmxlJ10sIHJvb3REaXJQYXRoKTtcbiAgICB9XG4gICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ2NsZWFudXAnXSwgcm9vdERpclBhdGgpO1xuICAgIC8vICd5YXJuIGluc3RhbGwnIHNob3VsZCBiZSBhZnRlciBgeWFybiBjbGVhbnVwYCBiZWNhdXNlIHlhcm4gYmVycnkgZ2VuZXJhdGVzIHlhcm4ubG9ja1xuICAgIC8vIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGNvbnRlbnRzIG9mIGRlcGVuZGFudCBzdWItcGFja2FnZSBpbiBtb25vcmVwb1xuICAgIGlmICghcm9vdENvbmZpZy5pc0J1bikge1xuICAgICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ2luc3RhbGwnLCAnLS1uby1pbW11dGFibGUnXSwgcm9vdERpclBhdGgpO1xuICAgIH1cblxuICAgIGF3YWl0IGluc3RhbGxBZ2VudFNraWxscyhyb290Q29uZmlnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRWZXJzaW9uKCk6IHN0cmluZyB7XG4gIGxldCBwYWNrYWdlSnNvbkRpciA9IHBhdGguZGlybmFtZShuZXcgVVJMKGltcG9ydC5tZXRhLnVybCkucGF0aG5hbWUpO1xuICB3aGlsZSAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHBhY2thZ2VKc29uRGlyLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgcGFja2FnZUpzb25EaXIgPSBwYXRoLmRpcm5hbWUocGFja2FnZUpzb25EaXIpO1xuICB9XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHBhY2thZ2VKc29uRGlyLCAncGFja2FnZS5qc29uJyksICd1dGY4JykpIGFzIHtcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG4gIH07XG4gIHJldHVybiBwYWNrYWdlSnNvbi52ZXJzaW9uO1xufVxuXG5hd2FpdCBtYWluKCk7XG4iXSwibmFtZXMiOlsib3B0aW9ucyIsImlzVmVyYm9zZSIsImRvZXNVcGxvYWRFbnZWYXJzIiwibG9nZ2VyIiwiZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbiIsIm5hbWUiLCJmdW5jIiwiY29uc29sZSIsImluZm8iLCJlcnJvciIsIkVycm9yIiwic3RhY2siLCJTdHJpbmciLCJhc3luYyIsImZpeERvY2tlcmZpbGUiLCJjb25maWciLCJkb2VzQ29udGFpbkRvY2tlcmZpbGUiLCJvbGRDb250ZW50IiwiZG9ja2VyZmlsZSIsIm5ld0NvbnRlbnQiLCJmcyIsIndyaXRlRmlsZSIsInBhdGgiLCJqb2luIiwiZGlyUGF0aCIsImZzVXRpbCIsInJlYWRGaWxlSWdub3JpbmdFcnJvciIsImZpbGVQYXRoIiwicHJvbWlzZXMiLCJyZWFkRmlsZSIsImdlbmVyYXRlRmlsZSIsImNvbnRlbnQiLCJta2RpciIsImRpcm5hbWUiLCJyZWN1cnNpdmUiLCJub3JtYWxpemVkQ29udGVudCIsInJlcGxhY2VBbGwiLCJ0cmltIiwicHJvbWlzZVBvb2wiLCJQcm9taXNlUG9vbCIsImZpeE5leHRDb25maWdKc29uIiwibWFwIiwiZXh0IiwicmVzb2x2ZSIsImZpbmQiLCJwIiwiZXhpc3RzU3luYyIsInJlcGxhY2UiLCJfIiwic2V0dGluZ3NUZXh0IiwiaW5jbHVkZXMiLCJydW4iLCJsaXRlcmFsIiwidmFsdWUiLCJraW5kIiwiYXNPYmplY3QiLCJkZWZhdWx0Q29uZmlnIiwiZm9yYmlkT25seSIsInJldHJpZXMiLCJ1c2UiLCJiYXNlVVJMIiwidHJhY2UiLCJzY3JlZW5zaG90IiwidmlkZW8iLCJ3ZWJTZXJ2ZXIiLCJjb21tYW5kIiwidXJsIiwicmV1c2VFeGlzdGluZ1NlcnZlciIsInRpbWVvdXQiLCJzdGRvdXQiLCJzdGRlcnIiLCJlbnYiLCJncmFjZWZ1bFNodXRkb3duIiwiZml4UGxheXdyaWdodENvbmZpZyIsIm1hdGNoIiwiZXhlYyIsIm9iamVjdExpdGVyYWwiLCJwYXJzZWQiLCJzb3VyY2UiLCJ0cyIsImNyZWF0ZVNvdXJjZUZpbGUiLCJTY3JpcHRUYXJnZXQiLCJMYXRlc3QiLCJTY3JpcHRLaW5kIiwiVFMiLCJzdGF0ZW1lbnQiLCJzdGF0ZW1lbnRzIiwiaXNWYXJpYWJsZVN0YXRlbWVudCIsImRlY2xhcmF0aW9uIiwiZGVjbGFyYXRpb25MaXN0IiwiZGVjbGFyYXRpb25zIiwiaW5pdGlhbGl6ZXIiLCJpc09iamVjdExpdGVyYWxFeHByZXNzaW9uIiwicGFyc2VPYmplY3RMaXRlcmFsRXhwcmVzc2lvbiIsInBhcnNlT2JqZWN0TGl0ZXJhbCIsIm1lcmdlZCIsIm1lcmdlIiwiYWxsIiwiQm9vbGVhbiIsInBhY2thZ2VKc29uIiwic2NyaXB0cyIsImhhc0Jhc2VVcmwiLCJlbnZGaWxlUGF0aHMiLCJlbnZGaWxlUGF0aCIsInRlc3QiLCJoYXNOZXh0UHVibGljQmFzZVVybCIsInVzZUNvbmZpZyIsIm5ld09iamVjdExpdGVyYWwiLCJzdHJpbmdpZnlPYmplY3QiLCJwcm9wZXJ0eSIsInByb3BlcnRpZXMiLCJpc1Byb3BlcnR5QXNzaWdubWVudCIsImlzSWRlbnRpZmllciIsImlzU3RyaW5nTGl0ZXJhbCIsInBhcnNlRXhwcmVzc2lvbiIsInVuZGVmaW5lZCIsImdldFRleHQiLCJleHByZXNzaW9uIiwicGFyc2VkT2JqZWN0IiwiaXNBcnJheUxpdGVyYWxFeHByZXNzaW9uIiwiZWxlbWVudHMiLCJlbGVtZW50Iiwic29tZSIsInN0cmluZ2lmeVZhbHVlIiwibGV2ZWwiLCJ2YWx1ZXMiLCJsZW5ndGgiLCJpbmRlbnQiLCJyZXBlYXQiLCJsaW5lcyIsInN0cmluZ2lmaWVkIiwic3BsaXQiLCJhdCIsImluZGV4IiwiY2xvc2luZ0luZGVudCIsInN0cmluZ2lmeUFycmF5Iiwib2JqZWN0IiwiT2JqZWN0IiwiZW50cmllcyIsImtleSIsImdsb2JJZ25vcmUiLCJmaXhQcmlzbWFFbnZGaWxlcyIsImVudkZpbGVzIiwiZmciLCJnbG9iIiwiZG90IiwiY3dkIiwiaWdub3JlIiwiZW52RmlsZSIsImZpeFRlc3REaXJlY3Rvcmllc1VwZGF0aW5nUGFja2FnZUpzb24iLCJwYWNrYWdlRGlyUGF0aHMiLCJQcm9taXNlIiwibmV3VGVzdERpclBhdGgiLCJwYWNrYWdlRGlyUGF0aCIsIm9sZFRlc3REaXJOYW1lIiwib2xkVGVzdERpclBhdGgiLCJyZW5hbWUiLCJmaXhUeXBlRGVmaW5pdGlvbnMiLCJjb25maWdzSW5jbHVkaW5nQ2hpbGRyZW4iLCJsaWJUeXBlRGlyUGF0aCIsInNyY1R5cGVEaXJQYXRoIiwiaXNSb290IiwiZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMiLCJkaXJlbnRzIiwiaWdub3JlRW5vZW50QXN5bmMiLCJyZWFkZGlyIiwid2l0aEZpbGVUeXBlcyIsImRpcmVudCIsImRpck5hbWUiLCJzbGljZSIsImhhc1R5cGVEZWNsYXJhdGlvbkV4dGVuc2lvbiIsImVuZHNXaXRoIiwicGFja2FnZU5hbWUiLCJoYXNMaWJyYXJ5IiwiZGVwZW5kZW5jaWVzIiwiZGV2RGVwZW5kZW5jaWVzIiwiaXNGaWxlIiwiaXNEaXJlY3RvcnkiLCJvdmVyd3JpdGVNZXJnZSIsImRlc3RpbmF0aW9uQXJyYXkiLCJzb3VyY2VBcnJheSIsImNvbWJpbmVNZXJnZSIsInRhcmdldCIsImRlc3RpbmF0aW9uIiwiaXRlbSIsImNsb25lVW5sZXNzT3RoZXJ3aXNlU3BlY2lmaWVkIiwiaXNNZXJnZWFibGVPYmplY3QiLCJwdXNoIiwic29ydEtleXMiLCJvYmoiLCJrZXlBbmRWYWx1ZXMiLCJ0b1NvcnRlZCIsImtleTEiLCJrZXkyIiwibG9jYWxlQ29tcGFyZSIsInB1YmxpY1JlcG9BdXRvZml4V29ya2Zsb3ciLCJvbiIsInB1bGxfcmVxdWVzdCIsImJyYW5jaGVzIiwicGVybWlzc2lvbnMiLCJjb250ZW50cyIsImNvbmN1cnJlbmN5IiwiZ3JvdXAiLCJqb2JzIiwiYXV0b2ZpeCIsInByaXZhdGVSZXBvQXV0b2ZpeFdvcmtmbG93IiwidXNlcyIsIndvcmtmbG93cyIsInJlbGVhc2UiLCJwdWxsX3JlcXVlc3RfdGFyZ2V0IiwidHlwZXMiLCJzeW5jIiwiaXNzdWVzIiwiaWYiLCJ3aXRoIiwic2VjcmV0cyIsIkNMQVVERV9DT0RFX09BVVRIX1RPS0VOIiwiT1BFTkFJX0FQSV9LRVkiLCJHRU1JTklfQVBJX0tFWSIsImdlbmVyYXRlV29ya2Zsb3dzIiwicm9vdENvbmZpZyIsImlzUmV1c2FibGVXb3JrZmxvd3NSZXBvIiwicmVwb3NpdG9yeSIsIndvcmtmbG93c1BhdGgiLCJzZW1hbnRpY1ltbFBhdGgiLCJybSIsImZvcmNlIiwiZmlsZU5hbWVTZXQiLCJTZXQiLCJmaWx0ZXIiLCJkZXBlbmRpbmciLCJzZW1hbnRpY1JlbGVhc2UiLCJhZGQiLCJmaWxlTmFtZSIsImJhc2VuYW1lIiwid3JpdGVXb3JrZmxvd1lhbWwiLCJkZXBsb3lQcm9kdWN0aW9uV29ya2Zsb3dFeGlzdHMiLCJ3cml0ZVlhbWwiLCJpc1B1YmxpY1JlcG8iLCJjbG9uZURlZXAiLCJwYWNrYWdlTWFuYWdlciIsImlzQnVuIiwic3RlcHMiLCJidWlsZCIsImF1dG9maXhXb3JrZmxvdyIsImF1dG9maXhKb2IiLCJnZW5lcmF0ZUF1dG9maXhXb3JrZmxvdyIsIm5ld1NldHRpbmdzIiwib2xkU2V0dGluZ3MiLCJ5YW1sIiwibG9hZCIsImFycmF5TWVyZ2UiLCJzdGFydHNXaXRoIiwibW92ZVRvQm90dG9tIiwiYWN0aW9ucyIsInRyaWdnZXJfZGVwbG95X3dvcmtmbG93IiwiaXNSZXVzYWJsZVdvcmtmbG93Iiwiam9iIiwibm9ybWFsaXplSm9iIiwic2NoZWR1bGUiLCJicmFuY2giLCJwYXJhbXMiLCJzeW5jX3BhcmFtc193aXRob3V0X2Rlc3QiLCJ3b3JrZmxvd19kaXNwYXRjaCIsIk5QTV9UT0tFTiIsIkdIX1RPS0VOIiwiRklSRUJBU0VfVE9LRU4iLCJHQ1BfU0FfS0VZX0pTT05fRk9SX0ZJUkVCQVNFIiwiRElTQ09SRF9XRUJIT09LX1VSTCIsInNlcnZlcl91cmwiLCJkb3RfZW52X3BhdGgiLCJGTFlfQVBJX1RPS0VOIiwiZGVwbG95X2NvbW1hbmQiLCJjaV9sYWJlbCIsImdpdGh1Yl9ob3N0ZWRfcnVubmVyIiwia2V5cyIsIm5ld1NlY3JldHMiLCJ5YW1sVGV4dCIsImR1bXAiLCJsaW5lV2lkdGgiLCJub0NvbXBhdE1vZGUiLCJzdHlsZXMiLCJmaXhUeXBvcyIsInBhY2thZ2VDb25maWciLCJkb2NGaWxlcyIsIm1kRmlsZSIsImZpeFR5cG9zSW5UZXh0IiwicmVwbGFjZVdpdGhDb25maWciLCJ0c0ZpbGVzIiwidHNGaWxlIiwiZml4VHlwb3NJbkNvZGUiLCJ0ZXh0QmFzZWRGaWxlcyIsImZpbGUiLCJwcm9taXNlQWxsIiwicHJvcE5hbWUiLCJiZWZvcmUiLCJhZnRlciIsIndiZnlKc29uIiwidHlwb3MiLCJnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zIiwiYWxsQ29uZmlncyIsImFnZW50c0V4dHJhUGF0aCIsImV4dHJhQ29udGVudCIsInRvb2xOYW1lIiwiZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9uIiwiY3Vyc29yUnVsZXNQYXRoIiwiY3Vyc29yUnVsZXNDb250ZW50IiwiZnJvbnRtYXR0ZXIiLCJib2R5IiwiZ2VuZXJhdGVDdXJzb3JHZW5lcmFsTWRjQ29udGVudCIsImJhc2VDb250ZW50IiwiZGVzY3JpcHRpb24iLCJpc1dpbGxCb29zdGVyUmVwbyIsImMiLCJoYXNTdGFydFRlc3RTZXJ2ZXIiLCJnZW5lcmF0ZUFnZW50Q29kaW5nU3R5bGUiLCJoYXNOZXdTZWN0aW9uIiwiZ2VuSTE4blRzIiwicmVhY3QiLCJuZXh0IiwiZ2VuZXJhdGVCaW9tZUpzb25jIiwicm9vdCIsIiRzY2hlbWEiLCJleHRlbmRzIiwiSlNPTiIsInBhcnNlIiwic3RyaW5naWZ5IiwibWluaW11bVJlbGVhc2VBZ2VFeGNsdWRlcyIsImV4aXN0aW5nQ29udGVudCIsImJ1bmZpZ1RvbWwiLCJwYXJzZUJ1bmZpZ1RvbWwiLCJidW4iLCJnZW5lcmF0ZVJ1blNlY3Rpb24iLCJpbnN0YWxsIiwiZXhhY3QiLCJnZW5lcmF0ZUJ1bmZpZ1RvbWwiLCJyZWFkRmlsZVN5bmMiLCJ1c2VyQ29udGVudEhlYWRlciIsInVzZXJDb250ZW50SGVhZGVyUmVnZXgiLCJzZXBhcmF0b3IiLCJkZWZhdWx0SGVhZFVzZXJDb250ZW50IiwiZGVmYXVsdFRhaWxVc2VyQ29udGVudCIsImlnbm9yZUZpbGVVdGlsIiwic2VwYXJhdG9yUHJlZml4IiwicmVhZEdpdGlnbm9yZVdpdGhvdXRTZXBhcmF0b3JzIiwibGFzdEhlYWRlckluZGV4IiwiZ2V0SW5kZXhPZlRhaWxVc2VyQ29udGVudEhlYWRlciIsImdldEhlYWRVc2VyQ29udGVudCIsImluZGV4T2YiLCJ0aGlzIiwiZ2V0VGFpbFVzZXJDb250ZW50IiwiaXNCZXJyeVplcm9JbnN0YWxsRW5hYmxlZCIsImxhc3RJbmRleCIsImxhc3RJbmRleE9mIiwiZ2VuZXJhdGVEb2NrZXJpZ25vcmUiLCJleHRlbnNpb25zIiwiY29kZVdpdGgySW5kZW50U2l6ZSIsImNvZGVXaXRoNEluZGVudFNpemUiLCJtYXJrZG93bkxpa2UiLCJlc2xpbnQiLCJwcmV0dGllciIsImJpb21lIiwiZ2VuZXJhdGVFeHRlbnNpb25zIiwiZ2VuZXJhdGVFZGl0b3Jjb25maWciLCJnZW5lcmF0ZUVzbGludHJjIiwiZXNsaW50QmFzZSIsImhhdmVfZnVuIiwiY29kZV9yZXZpZXciLCJkaXNhYmxlIiwiY29tbWVudF9zZXZlcml0eV90aHJlc2hvbGQiLCJtYXhfcmV2aWV3X2NvbW1lbnRzIiwicHVsbF9yZXF1ZXN0X29wZW5lZCIsImhlbHAiLCJzdW1tYXJ5IiwiaWdub3JlX3BhdHRlcm5zIiwiZ2VuZXJhdGVHZW1pbmlDb25maWciLCJjb25maWdGaWxlUGF0aCIsInN0eWxlZ3VpZGVGaWxlUGF0aCIsIm5ld0NvbmZpZyIsIm9sZENvbmZpZyIsInlhbWxDb250ZW50Iiwic3R5bGVndWlkZUNvbnRlbnQiLCJ0cmltRW5kIiwicmVtb3ZlR2VtaW5pU2V0dGluZ3MiLCJnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMiLCJkZWZhdWx0TmFtZXMiLCJnZW5lcmF0ZUdpdGlnbm9yZSIsImhlYWRVc2VyQ29udGVudCIsInRhaWxVc2VyQ29udGVudCIsIm5hbWVzIiwiZG9lc0NvbnRhaW5HZW1maWxlIiwiZG9lc0NvbnRhaW5Hb01vZCIsImRvZXNDb250YWluUGFja2FnZUpzb24iLCJkb2VzQ29udGFpblBvbVhtbCIsImRvZXNDb250YWluUHVic3BlY1lhbWwiLCJkb2VzQ29udGFpblRlbXBsYXRlWWFtbCIsImRvZXNDb250YWluUG9ldHJ5TG9jayIsImJsaXR6IiwiZmlyZWJhc2UiLCJwcmlzbWEiLCJwbGF5d3JpZ2h0VGVzdCIsInJlYWN0TmF0aXZlIiwic3Rvcnlib29rIiwibGl0ZXN0cmVhbSIsImdlbmVyYXRlZCIsInJlYWRDYWNoZSIsInJlc3BvbnNlIiwiZmV0Y2giLCJyZXNwb25zZVRleHQiLCJ0ZXh0Iiwib2siLCJ3cml0ZUNhY2hlIiwib3MiLCJob21lZGlyIiwic3RhdCIsIkRhdGUiLCJub3ciLCJtdGltZU1zIiwiY3JlYXRlVGFza09wdGlvbnMiLCJydW5uZXIiLCJhcmdzIiwiZXh0ZW5zaW9uIiwicHJldHRpZXJDb250ZW50IiwiYmlvbWVDb250ZW50IiwiZ2VuZXJhdGVJZGVhU2V0dGluZ3MiLCJkb2VzQ29udGFpbkphdmFTY3JpcHQiLCJkb2VzQ29udGFpbkphdmFTY3JpcHRJblBhY2thZ2VzIiwiZG9lc0NvbnRhaW5UeXBlU2NyaXB0IiwiZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcyIsInNwYXduU3luYyIsInJldHJ5IiwibmV3Q21kIiwibmV3QXJncyIsImdldFNwYXduU3luY0FyZ3MiLCJjaGlsZF9wcm9jZXNzIiwic3RhdHVzIiwic3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0Iiwic3RkaW8iLCJwcm9jIiwidG9TdHJpbmciLCJzIiwibWVzc2FnZSIsInByb2Nlc3MiLCJQQVRIIiwiQkVSUllfQklOX0ZPTERFUiIsImVuY29kaW5nIiwic2hlbGwiLCJnZXRMYXRlc3RDb21taXRIYXNoIiwib3JnYW5pemF0aW9uIiwicmVwbyIsInJlcG9VcmwiLCJjb21taXRIYXNoIiwicmVqZWN0IiwiRXNsaW50VXRpbCIsImdldExpbnRGaXhTdWZmaXgiLCJkb2VzQ29udGFpbkpzeE9yVHN4IiwiZ2l0SHViVXRpbCIsImdldE9yZ0FuZE5hbWUiLCJ1cmxPckZ1bGxOYW1lIiwidXJsV2l0aG91dFByb3RvY29sIiwib2N0b2tpdENhY2hlIiwiTWFwIiwiZ2V0T2N0b2tpdCIsIm93bmVyIiwiY2FjaGVkIiwiZ2V0Iiwib2N0b2tpdCIsIk9jdG9raXQiLCJhdXRoIiwiZ2V0R2l0SHViVG9rZW4iLCJzZXQiLCJoYXNHaXRIdWJUb2tlbiIsIkdIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSIiwiR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVJMQUIiLCJHSVRIVUJfVE9LRU4iLCJwaW5uZWREZXBlbmRlbmN5U3BlY2lmaWVycyIsInR5cGVzY3JpcHQiLCJzaG91bGRTa2lwV2lsbGJvb3N0ZXJDb25maWdzRXNsaW50UGFja2FnZSIsImlzV2lsbEJvb3N0ZXJDb25maWdzIiwianNDb21tb25EZXBzIiwidHNDb21tb25EZXBzIiwicmVhY3RDb21tb25EZXBzIiwiZXNsaW50RGVwcyIsImdlbmVyYXRlUGFja2FnZUpzb24iLCJza2lwQWRkaW5nRGVwcyIsImpzb25UZXh0IiwianNvbk9iaiIsInBlZXJEZXBlbmRlbmNpZXMiLCJhdXRob3IiLCJ0c2xpYiIsImxlcm5hIiwicGluc3QiLCJyZW1vdmVEZXByZWNhdGVkU3R1ZmYiLCJnZW5lcmF0ZVNjcmlwdHMiLCJwcmV0dGlmeSIsIm9yaWdpbmFsQ29udGVudCIsImxpbmUiLCJuZXdMaW5lIiwibCIsImdlbmVyYXRlUHJldHRpZXJTdWZmaXgiLCJwb2V0cnlEZXZEZXBlbmRlbmNpZXMiLCJodXNreSIsInBvc3RpbnN0YWxsIiwicG9zdHB1Ymxpc2giLCJwcmVwdWJsaXNoT25seSIsInByZXBhY2siLCJwb3N0cGFjayIsInByZXBhcmUiLCJ2ZXJzaW9uIiwiYXJ0aWxsZXJ5IiwicGxheXdyaWdodCIsIndvcmtzcGFjZXMiLCJBcnJheSIsImlzQXJyYXkiLCJ3b3Jrc3BhY2UiLCJnbG9iU3luYyIsIndiIiwibWljcm9tYXRjaCIsImdldFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyIsImplc3QiLCJkZXAiLCJwcml2YXRlIiwibGljZW5zZSIsInB1Ymxpc2hDb25maWciLCJhY2Nlc3MiLCJtYWluIiwicmVzb2x1dGlvbnMiLCJsaW50Iiwic2NyaXB0TmFtZSIsInNjcmlwdCIsImRpcnMiLCJkaXIiLCJmb3JtYXQiLCJweXRob25GaWxlcyIsImRpck5hbWVTZXQiLCJweXRob25GaWxlIiwiZmlyc3QiLCJzZWNvbmQiLCJzaXplIiwiZGlyTmFtZXNTdHIiLCJleGlzdGluZ1JlcG9zaXRvcnkiLCJub3JtYWxpemVkUmVwb3NpdG9yeSIsIm5vcm1hbGl6ZVJlcG9zaXRvcnlVcmxGb3JQYWNrYWdlSnNvbiIsImJ1aWxkTm9ybWFsaXplZFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbiIsIm5vcm1hbGl6ZWRFeGlzdGluZ1JlcG9zaXRvcnkiLCJmb3JtYXRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24iLCJwYWNrYWdlTmFtZXMiLCJoYXMiLCJpc1dvcmtzcGFjZVBhY2thZ2UiLCJ1cGRhdGVQcml2YXRlUGFja2FnZXMiLCJuZXdKc29uVGV4dCIsIm9sZEFuZE5ld1NjcmlwdE5hbWVzIiwib2xkTmFtZSIsIm5ld05hbWUiLCJmaWxlcyIsImZpeFNjcmlwdE5hbWVzIiwidW5pcXVlRGVwZW5kZW5jaWVzIiwiZGVwZW5kZW5jeVNwZWNpZmllcnMiLCJkZXBlbmRlbmN5IiwiZ2V0RGVwZW5kZW5jeVNwZWNpZmllciIsInVuaXF1ZURldkRlcGVuZGVuY2llcyIsImRldkRlcGVuZGVuY3lTcGVjaWZpZXJzIiwiY29yZSIsImdldFBpbm5lZERlcGVuZGVuY3lTcGVjaWZpZXIiLCJyZXBvc2l0b3J5VXJsIiwibWF0Y2hlZCIsIm5vcm1hbGl6ZWRVcmwiLCJ0eXBlIiwib2xkU2NyaXB0cyIsImhhc1R5cGVjaGVjayIsImNsZWFudXAiLCJ0eXBlY2hlY2siLCJvbGRUZXN0IiwicHlyaWdodCIsImJhc2VTZXR0aW5ncyIsInByZUNvbW1pdFNldHRpbmdzIiwiY29tbWFuZHMiLCJnZW5lcmF0ZUxlZnRob29rVXBkYXRpbmdQYWNrYWdlSnNvbiIsImh1c2t5RGlyUGF0aCIsImhhc0h1c2t5RGlyIiwic2V0dGluZ3MiLCJnZXRDbGVhbnVwR2xvYnMiLCJnZXRDbGVhbnVwQ29tbWFuZCIsInByZVB1c2giLCJ0eXBlY2hlY2tDb21tYW5kIiwiZ2V0UHJlUHVzaFNjcmlwdCIsIm1rZGlyU3luYyIsIm1vZGUiLCJwb3N0TWVyZ2VDb21tYW5kIiwicG9zdE1lcmdlQ29tbWFuZHMiLCJoYXNWZXJzaW9uU2V0dGluZ3MiLCJ0b29sc0NoYW5nZWRQYXR0ZXJuIiwicmF3IiwiaW5zdGFsbENvbW1hbmQiLCJybU5leHREaXJlY3RvcnkiLCJnZW5lcmF0ZVBvc3RNZXJnZUNvbW1hbmRzIiwic3VwcG9ydGVkRXh0ZW5zaW9ucyIsImxvY2FsV2JQYWNrYWdlSnNvblBhdGgiLCJoYXNMb2NhbFdiV29ya3NwYWNlIiwiZXNsaW50UnVsZVN1ZmZpeCIsImRvZXNDb250YWluSnN4T3JUc3hJblBhY2thZ2VzIiwiZXNsaW50UGF0dGVybiIsImdlbmVyYXRlTGludHN0YWdlZHJjIiwiZ2VuZXJhdGVQcmV0dGllcmlnbm9yZSIsImdpdGlnbm9yZUZpbGVQYXRoIiwiZ2l0aWdub3JlQ29udGVudCIsImFkZGl0aW9uYWxDb250ZW50IiwidmVudlBhdGgiLCJ2ZW52IiwiZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbiIsImdlbmVyYXRlUmVhZG1lIiwiaW5zZXJ0QmFkZ2UiLCJmaWxlTmFtZXMiLCJyZWFkZGlyU3luYyIsImJhZGdlTmFtZSIsInRvVXBwZXJDYXNlIiwiYmFkZ2UiLCJyZWFkbWUiLCJpIiwiZ2VuZXJhdGVSZWxlYXNlcmMiLCJwbHVnaW5zIiwicGx1Z2luIiwicHJlc2V0Iiwic3VjY2Vzc0NvbW1lbnRDb25kaXRpb24iLCJmYWlsQ29tbWVudENvbmRpdGlvbiIsImxhYmVscyIsInJlbGVhc2VkTGFiZWxzIiwiZ2VuZXJhdGVSZW5vdmF0ZUpzb24iLCJwYWNrYWdlUnVsZXMiLCJydWxlIiwibWF0Y2hQYWNrYWdlTmFtZXMiLCJlbmFibGVkIiwiaW5zdGFsbEFnZW50U2tpbGxzIiwic3JjRGlyZWN0b3JpZXMiLCJub2RlIiwiZ2V0U3JjRGlycyIsInJvb3RKc29uT2JqIiwiY29tcGlsZXJPcHRpb25zIiwiYWx3YXlzU3RyaWN0Iiwibm9VbmNoZWNrZWRJbmRleGVkQWNjZXNzIiwiYWxsb3dTeW50aGV0aWNEZWZhdWx0SW1wb3J0cyIsImVzTW9kdWxlSW50ZXJvcCIsInJlc29sdmVKc29uTW9kdWxlIiwic291cmNlTWFwIiwiaW1wb3J0SGVscGVycyIsIm91dERpciIsImV4Y2x1ZGUiLCJpbmNsdWRlIiwic3ViSnNvbk9iaiIsImdlbmVyYXRlVHNjb25maWciLCJnZW5lcmF0ZWRSb290RGlyIiwiZXhpc3RpbmdSb290U291cmNlRGlycyIsInBhY2thZ2VzRGlyUGF0aCIsImdldEdlbmVyYXRlZFJvb3REaXIiLCJnZW5lcmF0ZWRUeXBlcyIsInR5cGVOYW1lcyIsInZpdGVzdCIsIm1vY2hhIiwiY3lwcmVzcyIsImdldEdlbmVyYXRlZFR5cGVzIiwiZ2V0VHNjb25maWdFeHRlbmRzIiwicm9vdERpciIsImpzeCIsImV4aXN0aW5nUm9vdERpciIsImV4aXN0aW5nVHlwZXMiLCJnZW5lcmF0ZWRFeHRlbmRzIiwiZXhpc3RpbmdFeHRlbmRzIiwibWVyZ2VkRXh0ZW5kcyIsIm5vcm1hbGl6ZUV4dGVuZHMiLCJ1bmlxdWVFeHRlbmRzIiwibWVyZ2VUc2NvbmZpZ0V4dGVuZHMiLCJtZXJnZWRUeXBlcyIsInR5cGVOYW1lIiwidHlwZVJvb3RzIiwic29ydCIsImV4cGVyaW1lbnRhbERlY29yYXRvcnMiLCJ2ZXJiYXRpbU1vZHVsZVN5bnRheCIsImV4Y2x1ZGVGaWxlUGF0dGVybnMiLCJnZW5lcmF0ZVZzY29kZVNldHRpbmdzIiwiZXhjbHVkZUZpbGVQYXR0ZXJuIiwiZXhjbHVkZVNldHRpbmciLCJnZW5lcmF0ZVlhcm5yY1ltbCIsInlhcm5yY1ltbFBhdGgiLCJjdXJyZW50VmVyc2lvbiIsImxhdGVzdFZlcnNpb24iLCJ2ZXJzaW9uc0pzb24iLCJnZXRMYXRlc3RWZXJzaW9uIiwiZ2V0TWFqb3JOdW1iZXIiLCJyZWxlYXNlc1BhdGgiLCJ5YXJucmNQYXRoIiwiZGVmYXVsdFNlbXZlclJhbmdlUHJlZml4Iiwibm9kZUxpbmtlciIsIm5tTW9kZSIsIm5wbU1pbmltYWxBZ2VHYXRlIiwibnBtUHJlYXBwcm92ZWRQYWNrYWdlcyIsImNvbXByZXNzaW9uTGV2ZWwiLCJpbmplY3RFbnZpcm9ubWVudEZpbGVzIiwiZW5hYmxlR2xvYmFsQ2FjaGUiLCJvcmlnaW5hbExlbmd0aCIsInBsdWdpblBhdGgiLCJtYWpvciIsIk51bWJlciIsInNldHVwTGFiZWxzIiwic2V0dXBMYWJlbCIsImRlbGV0ZUxhYmVsIiwid2FybiIsImNvbG9yIiwicmVxdWVzdCIsIkRFUFJFQ0FURURfU0VDUkVUX05BTUVTIiwic2V0dXBTZWNyZXRzIiwiZG90ZW52Iiwic2VjcmV0TmFtZSIsInNlY3JldF9uYW1lIiwia2V5X2lkIiwia2V5SWQiLCJkYXRhIiwic29kaXVtIiwicmVhZHkiLCJzZWNyZXQiLCJyYXdLZXkiLCJmcm9tX2Jhc2U2NCIsImJhc2U2NF92YXJpYW50cyIsIk9SSUdJTkFMIiwicmF3U2VjIiwiZnJvbV9zdHJpbmciLCJlbmNCeXRlcyIsImNyeXB0b19ib3hfc2VhbCIsImVuY0Jhc2U2NCIsInRvX2Jhc2U2NCIsImVuY3J5cHRlZF92YWx1ZSIsInNldHVwR2l0SHViU2V0dGluZ3MiLCJ3aXRoUmV0cnkiLCJhbGxvd19hdXRvX21lcmdlIiwiYWxsb3dfbWVyZ2VfY29tbWl0IiwiYWxsb3dfc3F1YXNoX21lcmdlIiwiYWxsb3dfcmViYXNlX21lcmdlIiwiYWxsb3dfdXBkYXRlX2JyYW5jaCIsImRlbGV0ZV9icmFuY2hfb25fbWVyZ2UiLCJzcXVhc2hfbWVyZ2VfY29tbWl0X3RpdGxlIiwic3F1YXNoX21lcmdlX2NvbW1pdF9tZXNzYWdlIiwiaGVhZGVycyIsInBhY2thZ2VNYW5hZ2VyUnVuUGxhY2Vob2xkZXIiLCJ0ZW1wbGF0ZXMiLCJnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcyIsImFwcGx5UGFja2FnZU1hbmFnZXJUZW1wbGF0ZSIsImRpc3RhbmNlIiwidGVtcGxhdGUiLCJwYWNrYWdlTWFuYWdlckNvbW1hbmQiLCJ3YmZ5SnNvblNjaGVtYSIsInoiLCJyZWNvcmQiLCJzdHJpbmciLCJvcHRpb25hbCIsImRvYyIsImdldFBhY2thZ2VDb25maWciLCJwYWNrYWdlSnNvblBhdGgiLCJlc21QYWNrYWdlIiwicGFja2FnZUpzb25UZXh0IiwicmVsZWFzZUJyYW5jaGVzIiwicmVsZWFzZVBsdWdpbnMiLCJyZWxlYXNlcmNKc29uUGF0aCIsImpzb24iLCJmc3AiLCJmbGF0IiwicmVwb0luZm8iLCJnaXQiLCJzaW1wbGVHaXQiLCJvcmlnaW4iLCJnZXRSZW1vdGVzIiwiciIsInJlbW90ZVVybCIsInJlZnMiLCJyZXF1ZXN0UmVwb0luZm8iLCJmZXRjaFJlcG9JbmZvIiwiY3VycmVudCIsImhhc1ZlcnNpb25TZXR0aW5nc0ZpbGUiLCJwcmVmaXgiLCJ3YmZ5SnNvblBhdGgiLCJ3YmZ5SnNvblRleHQiLCJyZXBvRnVsbE5hbWUiLCJmdWxsX25hbWUiLCJyZXBvQXV0aG9yIiwicmVwb05hbWUiLCJyZXBvUGFydHMiLCJpc1JlZmVycmVkQnlPdGhlclJlcG8iLCJpc0VzbVBhY2thZ2UiLCJzZXAiLCJjb250YWluc0FueSIsImRvZXNDb250YWluVnNjb2RlU2V0dGluZ3NKc29uIiwiZ2l0aHViIiwibnBtIiwiZ2V0RXNsaW50RXh0ZW5zaW9uQmFzZSIsInBhdHRlcm4iLCJvcmciLCJyZXQiLCJhc3NpZ24iLCJyZWRpcmVjdGVkRnVsbE5hbWUiLCJsb2NhdGlvbiIsImdldFJlZGlyZWN0ZWRSZXBvRnVsbE5hbWUiLCJhcmd2IiwieWFyZ3MiLCJwb3NpdGlvbmFsIiwiZGVzY3JpYmUiLCJhcnJheSIsImRlZmF1bHQiLCJhbGlhcyIsInNraXBEZXBzIiwidmVyYm9zZSIsInBhY2thZ2VKc29uRGlyIiwiVVJMIiwicGF0aG5hbWUiLCJnZXRWZXJzaW9uIiwic3RyaWN0Iiwicm9vdERpclBhdGgiLCJwYXRocyIsInN1YkRpclBhdGhzIiwiaWdub3JlRXJyb3JBc3luYyIsImQiLCJhYmJyZXZpYXRpb25Qcm9taXNlIiwic3ViUGFja2FnZUNvbmZpZ3MiLCJzdWJEaXJQYXRoIiwiYWxsUGFja2FnZUNvbmZpZ3MiLCJzaG91bGRSdW5Xb3JrZmxvd3MiLCJ0aGVuIiwicm1TeW5jIl0sIm1hcHBpbmdzIjoicXFCQUtPLE1BQU1BLEVBQVUsSUFMdkIsTUFDRUMsV0FBWSxFQUNaQyxtQkFBb0IsR0NnQmYsTUFBTUMsRUFBUyxJQWhCdEIsTUFDRSwrQkFBTUMsQ0FBMEJDLEVBQWNDLEdBQ3hDTixFQUFRQyxXQUNWTSxRQUFRQyxLQUFLLGFBQWFILHFCQUU1QixVQUNRQyxHQUNSLENBQUUsTUFBT0csR0FDUEYsUUFBUUMsS0FBSyxxQkFBcUJILE1BQVNJLGFBQWlCQyxNQUFRRCxFQUFNRSxNQUFRQyxPQUFPSCxNQUMzRixDQUNJVCxFQUFRQyxXQUNWTSxRQUFRQyxLQUFLLGNBQWNILG1CQUUvQixHQ1RLUSxlQUFlQyxFQUFjQyxHQUNsQyxPQUFPWixFQUFPQywwQkFBMEIsZ0JBQWlCUyxVQUN2RCxJQUFLRSxFQUFPQyxzQkFBdUIsT0FFbkMsTUFBTUMsRUFBYUYsRUFBT0csV0FDcEJDLEVBQWFGLEVBRWZBLElBQWVFLFNBQ2JDLEVBQUdDLFVBQVVDLEVBQUtDLEtBQUtSLEVBQU9TLFFBQVMsY0FBZUwsSUFFaEUsQ0NiTyxNQUFNTSxFQUFTLENBQ3BCLDJCQUFNQyxDQUFzQkMsR0FDMUIsSUFDRSxhQUFhUCxFQUFHUSxTQUFTQyxTQUFTRixFQUFVLE9BQzlDLENBQUUsTUFDQSxDQUVK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
17
+ `.trim()}async function lt(t){return _.functionIgnoringException("generateLintstagedrc",async()=>{await Promise.all([$.run(()=>e.promises.rm(`${t.dirPath}/.lintstagedrc.cjs`,{force:!0})),$.run(()=>e.promises.rm(`${t.dirPath}/.lintstagedrc.js`,{force:!0})),$.run(()=>e.promises.rm(`${t.dirPath}/.lintstagedrc.json`,{force:!0}))])})}async function pt(e){return _.functionIgnoringException("generatePrettierignore",async()=>{const n=t.resolve(e.dirPath,".prettierignore"),s=await S.readFileIgnoringError(n)??"",i=me.getHeadUserContent(s),r=me.getTailUserContent(s),o=t.resolve(e.dirPath,".gitignore"),a=await me.readGitignoreWithoutSeparators(o)||"";let c="";e.doesContainPubspecYaml&&(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+r;await $.run(()=>S.generateFile(n,l))})}const dt={venvPath:".",venv:".venv"};async function ut(n){return _.functionIgnoringException("generatePyrightConfigJson",async()=>{let s=u(dt);const i=t.resolve(n.dirPath,"pyrightconfig.json");try{const t=await e.promises.readFile(i,"utf8"),n=JSON.parse(t);s=c.all([s,n,s],{arrayMerge:N})}catch{}const r=JSON.stringify(s);await $.run(()=>S.generateFile(i,r))})}async function mt(n){return _.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=gt(i,"[![semantic-release](https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg)](https://github.com/semantic-release/semantic-release)"));const r=n.repository?.slice(n.repository.indexOf(":")+1),o=e.readdirSync(`${n.dirPath}/.github/workflows`);for(const s of o){if(!s.startsWith("test")&&!s.startsWith("deploy"))continue;let o=s;if(o=(o[0]||"").toUpperCase()+o.slice(1,o.indexOf(".")),o=o.replace("-"," "),!r)continue;const a=`[![${o}](https://github.com/${r}/actions/workflows/${s}/badge.svg)](https://github.com/${r}/actions/workflows/${s})`;e.existsSync(t.resolve(n.dirPath,`.github/workflows/${s}`))&&(i=gt(i,a))}await $.run(()=>S.generateFile(s,i))})}function gt(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 ft(n){return _.functionIgnoringException("generateReleaserc",async()=>{const s=t.resolve(n.dirPath,".releaserc.json");if(!e.existsSync(s))return;const i=JSON.parse(await e.promises.readFile(s,"utf8")),r=i.plugins??[];for(let e=0;e<r.length;e++){const t=Array.isArray(r[e])?r[e]?.[0]:r[e],n=Array.isArray(r[e])&&r[e]?.[1]||{};"@semantic-release/commit-analyzer"===t?r[e]=["@semantic-release/commit-analyzer",c.all([n,{preset:"conventionalcommits"}],{arrayMerge:N})]:"@semantic-release/github"===t&&(r[e]=["@semantic-release/github",c.all([n,{successCommentCondition:!1,failCommentCondition:!1,labels:["r: semantic-release"],releasedLabels:["released :bookmark:"]}],{arrayMerge:N})])}const o=JSON.stringify(i);await $.run(()=>S.generateFile(s,o))})}const ht={$schema:"https://docs.renovatebot.com/renovate-schema.json",extends:["github>WillBooster/willbooster-configs:renovate.json5"]};async function yt(n){return _.functionIgnoringException("generateRenovateJson",async()=>{let s=u(ht);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=c.all([s,n,s],{arrayMerge:N}),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 r=JSON.stringify(s);await $.run(()=>S.generateFile(i,r))})}async function wt(e){return _.functionIgnoringException("installAgentSkills",async()=>{await Promise.all([o.rm(t.resolve(e.dirPath,".agents"),{force:!0,recursive:!0}),o.rm(t.resolve(e.dirPath,".claude"),{force:!0,recursive:!0}),o.rm(t.resolve(e.dirPath,"skills-lock.json"),{force:!0})])})}const bt={node:["src","test","scripts"].toSorted(),blitz:["src","test","scripts","db","integrations","mailers"].toSorted()};function vt(e){return e.depending.blitz?bt.blitz:bt.node}const kt={compilerOptions:{alwaysStrict:!0,noUncheckedIndexedAccess:!0,allowSyntheticDefaultImports:!0,esModuleInterop:!0,resolveJsonModule:!0,declaration:!0,sourceMap:!0,importHelpers:!1,outDir:"dist"},exclude:["packages/*/test/fixtures","test/fixtures"],include:["packages/*/scripts/**/*","packages/*/src/**/*","packages/*/test/**/*","scripts/**/*","src/**/*","test/**/*"]},xt={compilerOptions:{alwaysStrict:!0,noUncheckedIndexedAccess:!0,allowSyntheticDefaultImports:!0,esModuleInterop:!0,resolveJsonModule:!0,declaration:!0,sourceMap:!0,importHelpers:!1,outDir:"dist"},exclude:["test/fixtures"],include:["scripts/**/*","src/**/*","test/**/*"]};async function _t(n){return _.functionIgnoringException("generateTsconfig",async()=>{if(n.depending.blitz||n.depending.next)return;let s=u(n.isRoot?kt:xt);const i=function(n){const s=vt(n).filter(s=>e.existsSync(t.resolve(n.dirPath,s)));if(n.isRoot&&n.doesContainSubPackageJsons){const i=t.resolve(n.dirPath,"packages");if(e.existsSync(i)&&e.readdirSync(i,{withFileTypes:!0}).some(s=>s.isDirectory()&&vt(n).some(n=>e.existsSync(t.resolve(i,s.name,n)))))return s.length>0?".":"./packages"}if(1===s.length)return`./${s[0]}`;if(s.length>1)return"."}(n),r=function(e){const t=new Set,n={...e.packageJson?.dependencies,...e.packageJson?.devDependencies};e.isBun?t.add("bun"):e.depending.reactNative||t.add("node");(n.jest||n["@jest/globals"]||n["jest-environment-jsdom"]||n["ts-jest"])&&t.add("jest");n.vitest&&t.add("vitest/globals");n.mocha&&t.add("mocha");n.cypress&&t.add("cypress");return[...t]}(n);s.extends=function(e){return e.isBun?"@tsconfig/bun/tsconfig.json":e.depending.reactNative?"@tsconfig/react-native/tsconfig.json":["@tsconfig/node-lts/tsconfig.json","@tsconfig/node-ts/tsconfig.json"]}(n),i&&(s.compilerOptions={...s.compilerOptions,rootDir:i}),r.length>0&&(s.compilerOptions={...s.compilerOptions,types:r}),n.doesContainJsxOrTsx||n.doesContainJsxOrTsxInPackages?n.isBun||n.depending.reactNative||(s.compilerOptions={...s.compilerOptions,jsx:"react-jsx"}):delete s.compilerOptions?.jsx,n.isRoot&&!n.doesContainSubPackageJsons&&(s.include=s.include?.filter(e=>!e.startsWith("packages/*/")),s.exclude=s.exclude?.filter(e=>!e.startsWith("packages/*/")));const o=t.resolve(n.dirPath,"tsconfig.json");try{const t=await e.promises.readFile(o,"utf8"),n=JSON.parse(t),l=n.compilerOptions?.rootDir,p=(a=n.compilerOptions?.types,"string"==typeof a?[a]:Array.isArray(a)?a.filter(e=>"string"==typeof e):[]);s.extends=function(e,t){const n=[...jt(e),...jt(t)],s=[...new Set(n)];return 0===s.length?void 0:1===s.length?s[0]:s}(s.extends,n.extends),delete n.extends,delete n.compilerOptions?.jsx,s=c.all([s,n,s],{arrayMerge:J}),s.include=s.include?.filter(e=>!e.includes("@types")&&!e.includes("__tests__/")&&!e.includes("tests/")),s.compilerOptions??={},l?s.compilerOptions.rootDir=l:i?s.compilerOptions.rootDir=i:delete s.compilerOptions.rootDir;const d=[...new Set([...p,...r])];d.length>0?s.compilerOptions.types=d:delete s.compilerOptions.types,r.some(e=>"cypress"===e||e.includes("/"))&&delete s.compilerOptions.typeRoots}catch{}var a;G(s),s.include?.sort(),delete s.compilerOptions?.experimentalDecorators,n.depending.reactNative&&delete s.compilerOptions?.verbatimModuleSyntax;const l=JSON.stringify(s);await $.run(()=>S.generateFile(o,l))})}function jt(e){return e?Array.isArray(e)?e:[e]:[]}const St=["**/.git/objects/**","**/.git/subtree-cache/**","**/node_modules/**","**/tmp/**","**/temp/**","**/dist/**"];async function $t(n){return _.functionIgnoringException("generateVscodeSettings",async()=>{try{const s=t.resolve(n.dirPath,".vscode","settings.json"),i=await e.promises.readFile(s,"utf8");let r=JSON.parse(i);for(const e of St)r=c.all([r,Pt(e)]);n.doesContainPoetryLock&&(r=c.all([r,Pt("**/.venv/**")])),n.depending.next&&(r=c.all([r,Pt("**/.next/**")])),"editor.codeActionsOnSave"in r&&delete r["editor.codeActionsOnSave"],"editor.formatOnSave"in r&&delete r["editor.formatOnSave"],G(r);const o=JSON.stringify(r,void 0,2);await $.run(()=>S.generateFile(s,o))}catch{}})}function Pt(e){return{"files.watcherExclude":{[e]:!0}}}async function Ct(n){return _.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=De("yarn",["--version"],n.dirPath),r=function(e,t){const n=De("npm",["show",e,"versions","--json"],t);return JSON.parse(n).at(-1)}("@yarnpkg/cli",n.dirPath);Et(i)<=Et(r)&&i!==r&&Te("yarn",["set","version",r],n.dirPath,1);const o=t.join(n.dirPath,".yarn","releases");await e.promises.mkdir(o,{recursive:!0});for(const n of await e.promises.readdir(o))n.startsWith("yarn-")&&!n.startsWith(`yarn-${r}.`)&&await $.run(()=>e.promises.rm(t.join(o,n)));const a=t.resolve(n.dirPath,".yarnrc");await $.run(()=>e.promises.rm(a,{force:!0}));const c=d.load(await e.promises.readFile(s,"utf8"));c.defaultSemverRangePrefix="",c.nodeLinker="node-modules",c.nmMode="hardlinks-global",c.npmMinimalAgeGate="5d",c.npmPreapprovedPackages=["@exercode/*","@willbooster/*","next","@next/*","react","react-dom"],delete c.compressionLevel,0===c.injectEnvironmentFiles?.length&&delete c.injectEnvironmentFiles,c.enableGlobalCache=!0;const l=c.plugins?.length??0;if(c.plugins=c.plugins?.filter(e=>".yarn/plugins/undefined.cjs"!==e.path)??[],c.plugins.length!==l){const 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,d.dump(c,{lineWidth:-1})),Te("yarn",["dlx","yarn-plugin-auto-install"],n.dirPath)})}function Et(e){const[t]=e.split(".");return Number(t)}async function Ot(e){return _.functionIgnoringException("setupLabels",async()=>{const[t,n]=Le.getOrgAndName(e.repository??"");if(!t||!n)return;if("WillBooster"!==t&&"WillBoosterLab"!==t)return;if(!Ge(t))return;const s=Je(t);try{await Bt(s,t,n,"d1: x-easy :hedgehog:","EDE9FE"),await Bt(s,t,n,"d2: easy :rabbit2:","DDD6FE"),await Bt(s,t,n,"d3: medium :ox:","C4B5FD"),await Bt(s,t,n,"d4: hard :squid:","A78BFA"),await Bt(s,t,n,"d5: x-hard :whale2:","8B5CF6"),await Bt(s,t,n,"p1: critical :fire::fire::fire:","EF4444"),await Bt(s,t,n,"p2: urgent :fire::fire:","F87171"),await Bt(s,t,n,"p3: important :fire:","FCA5A5"),await Bt(s,t,n,"p4: nice to have :droplet:","FECACA"),await Bt(s,t,n,"r: blitz","5300bc"),await Bt(s,t,n,"r: firebase","ffca28"),await Bt(s,t,n,"r: prisma","0c344b"),await Bt(s,t,n,"r: react","61dafb"),await Bt(s,t,n,"r: svelte","ff3e00"),await Bt(s,t,n,"r: semantic-release","494949"),await Bt(s,t,n,"ready :rocket:","22C55E"),await Bt(s,t,n,"review requested :mag:","FBCA04"),await Bt(s,t,n,"released :bookmark:","6366F1"),await Bt(s,t,n,"s: 0.5h :clock1230:","F3F4F6"),await Bt(s,t,n,"s: 1h :clock1:","E5E7EB"),await Bt(s,t,n,"s: 2h :clock2:","D1D5DB"),await Bt(s,t,n,"s: 3h :clock3:","9CA3AF"),await Bt(s,t,n,"s: 5h :clock5:","6B7280"),await Bt(s,t,n,"s: 8h :clock8:","4B5563"),await Bt(s,t,n,"s: 13h :clock1:","374151"),await Bt(s,t,n,"t: build :hammer:","BFDBFE"),await Bt(s,t,n,"t: chore :broom:","BFDBFE"),await Bt(s,t,n,"t: ci :construction_worker:","BFDBFE"),await Bt(s,t,n,"t: docs :memo:","BFDBFE"),await Bt(s,t,n,"t: feat :sparkles:","BFDBFE"),await Bt(s,t,n,"t: fix :bug:","BFDBFE"),await Bt(s,t,n,"t: perf :zap:","BFDBFE"),await Bt(s,t,n,"t: refactor :recycle:","BFDBFE"),await Bt(s,t,n,"t: style :lipstick:","BFDBFE"),await Bt(s,t,n,"t: test :test_tube:","BFDBFE"),await Bt(s,t,n,"project","24292F"),await Bt(s,t,n,"focused :dart:","22C55E"),await Bt(s,t,n,"gen-pr-all :robot:","00B4D8"),await Bt(s,t,n,"gen-pr-claude :robot:","00B4D8"),await Bt(s,t,n,"gen-pr-codex :robot:","00B4D8"),await Bt(s,t,n,"gen-pr-gemini :robot:","00B4D8"),await Ft(s,t,n,"bug"),await Ft(s,t,n,"documentation"),await Ft(s,t,n,"duplicate"),await Ft(s,t,n,"enhancement"),await Ft(s,t,n,"good first issue"),await Ft(s,t,n,"help wanted"),await Ft(s,t,n,"invalid"),await Ft(s,t,n,"question"),await Ft(s,t,n,"wontfix"),await Ft(s,t,n,"ready"),await Ft(s,t,n,"review requested"),await Ft(s,t,n,"released"),await Ft(s,t,n,"semantic-release"),await Ft(s,t,n,"llm-pr :robot:"),await Ft(s,t,n,"ai-pr :robot:")}catch(e){console.warn("Skip setupLabels due to:",e?.stack??e)}})}async function Bt(e,t,n,s,i){try{await e.request("POST /repos/{owner}/{repo}/labels",{owner:t,repo:n,name:s,color:i})}catch{await e.request("PATCH /repos/{owner}/{repo}/labels/{name}",{owner:t,repo:n,name:s,color:i})}}async function Ft(e,t,n,s){try{await e.request("DELETE /repos/{owner}/{repo}/labels/{name}",{owner:t,repo:n,name:s})}catch{}}const At=["READY_DISCORD_WEBHOOK_URL","GH_BOT_PAT","PUBLIC_GH_BOT_PAT"];async function It(e){return _.functionIgnoringException("setupSecrets",async()=>{const[t,n]=Le.getOrgAndName(e.repository??"");if(!t||!n||"WillBoosterLab"!==t)return;if(!Ge(t)||!x.doesUploadEnvVars)return;const s=y.config().parsed??{};if(0===Object.keys(s).length)return;const i=Je(t);try{for(const e of At)try{await i.request("DELETE /repos/{owner}/{repo}/actions/secrets/{secret_name}",{owner:t,repo:n,secret_name:e})}catch{}const e=await i.request("GET /repos/{owner}/{repo}/actions/secrets/public-key",{owner:t,repo:n}),{key:r,key_id:o}=e.data;await w.ready;for(const[e,a]of Object.entries(s)){if("GH_BOT_PAT"===e||"GH_BOT_PAT_FOR_WILLBOOSTER"===e||"GH_BOT_PAT_FOR_WILLBOOSTERLAB"===e)continue;const s=w.from_base64(r,w.base64_variants.ORIGINAL),c=w.from_string(a),l=w.crypto_box_seal(c,s),p=w.to_base64(l,w.base64_variants.ORIGINAL);await i.request("PUT /repos/{owner}/{repo}/actions/secrets/{secret_name}",{owner:t,repo:n,secret_name:e,encrypted_value:p,key_id:o})}}catch(e){console.warn("Skip setupSecrets due to:",e?.stack??e)}})}async function Tt(e){const[t,n]=Le.getOrgAndName(e.repository??"");if(!t||!n)return;if("WillBooster"!==t&&"WillBoosterLab"!==t)return;if(!Ge(t))return;const i=Je(t);await s(()=>i.request("PATCH /repos/{owner}/{repo}",{owner:t,repo:n,allow_auto_merge:!0,allow_merge_commit:!1,allow_squash_merge:!0,allow_rebase_merge:!1,allow_update_branch:!0,delete_branch_on_merge:!0,squash_merge_commit_title:"PR_TITLE",squash_merge_commit_message:"BLANK",headers:{"X-GitHub-Api-Version":"2022-11-28"},...e.repository?.startsWith("github:WillBooster/")?{allow_auto_merge:!0}:{}}))}const Dt="__PM_RUN__",Rt={"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., \`${Dt} test\`) passed.\n - The lint command (e.g., \`${Dt} 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 Wt(n){return _.functionIgnoringException("generateGitHubTemplates",async()=>{for(const[s,i]of Object.entries(Rt)){const r=Lt(i,n),o=t.resolve(n.dirPath,".github",s);if(e.existsSync(o)){const t=await e.promises.readFile(o,"utf8");if(b(t,r)>r.length/2)continue}await e.promises.mkdir(t.resolve(n.dirPath,".github"),{recursive:!0}),await $.run(()=>S.generateFile(o,r))}})}function Lt(e,t){const n=t.isBun?"bun run":"yarn";return e.replaceAll(Dt,n)}const Nt=k.object({typos:k.object({all:k.record(k.string(),k.string()).optional(),doc:k.record(k.string(),k.string()).optional(),ts:k.record(k.string(),k.string()).optional(),text:k.record(k.string(),k.string()).optional()}).optional()});async function Jt(n,s){const i=t.resolve(n,"package.json");try{const r=e.existsSync(i);let a={},c={},l={},p=!1;if(r){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 o.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 g;m&&(g=await async function(e,t){const n=v(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 Ut(i);if(e)return e}const r="string"==typeof t.repository?t.repository:t.repository?.url;if(r){const e=await Ut(r);if(e&&"Not Found"!==e.message)return e}}(n,l));let f=function(n){const s=t.resolve(n);return e.existsSync(t.join(s,"mise.toml"))||e.existsSync(t.join(s,".mise.toml"))||e.existsSync(t.join(s,".tool-versions"))}(n);for(const s of["java","node","python"])if(e.existsSync(t.resolve(n,`.${s}-version`))){f=!0;break}let h="";try{h=await o.readFile(t.resolve(n,"Dockerfile"),"utf8")}catch{}const y=t.resolve(n,"wbfy.json");let w;try{const e=await o.readFile(y,"utf8");w=Nt.parse(JSON.parse(e))}catch{}const b="string"==typeof g?.full_name?g.full_name:void 0;let k,x;if(b){const e=b.split("/");e.length>=2&&(k=e[0],x=e[1])}const _=b?`github:${b}`:void 0,j={dirPath:n,dockerfile:h,isRoot:m,isPublicRepo:!1===g?.private,isReferredByOtherRepo:!!l.files,repository:_,repoAuthor:k,repoName:x,isWillBoosterRepo:Boolean(_?.startsWith("github:WillBooster/")||_?.startsWith("github:WillBoosterLab/")),isBun:s?.isBun||e.existsSync(t.join(n,"bun.lock")),isEsmPackage:p,isWillBoosterConfigs:i.includes(`${t.sep}willbooster-configs`),doesContainSubPackageJsons:Gt("packages/**/package.json",n),doesContainDockerfile:!!h||e.existsSync(t.resolve(n,"docker-compose.yml")),doesContainGemfile:e.existsSync(t.resolve(n,"Gemfile")),doesContainGoMod:e.existsSync(t.resolve(n,"go.mod")),doesContainPackageJson:e.existsSync(t.resolve(n,"package.json")),doesContainPoetryLock:e.existsSync(t.resolve(n,"poetry.lock")),doesContainPomXml:e.existsSync(t.resolve(n,"pom.xml")),doesContainPubspecYaml:e.existsSync(t.resolve(n,"pubspec.yaml")),doesContainTemplateYaml:e.existsSync(t.resolve(n,"template.yaml")),doesContainVscodeSettingsJson:e.existsSync(t.resolve(n,".vscode","settings.json")),doesContainJavaScript:Gt("{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx}",n),doesContainTypeScript:Gt("{app,src,test,scripts}/**/*.{cts,mts,ts,tsx}",n),doesContainJsxOrTsx:Gt("{app,src,test}/**/*.{t,j}sx",n),doesContainJavaScriptInPackages:Gt("packages/**/{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx}",n),doesContainTypeScriptInPackages:Gt("packages/**/{app,src,test,scripts}/**/*.{cts,mts,ts,tsx}",n),doesContainJsxOrTsxInPackages:Gt("packages/**/{app,src,test}/**/*.{t,j}sx",n),hasStartTestServer:!!l.scripts?.["start-test-server"],depending:{blitz:!!a.blitz,firebase:!!c["firebase-tools"],genI18nTs:!!c["gen-i18n-ts"],litestream:h.includes("install-litestream.sh"),react:!!a.react,next:!!a.next,playwrightTest:!!a["@playwright/test"]||!!c["@playwright/test"]||!!c.playwright,prisma:!!a["@prisma/client"]||!!c.prisma,pyright:!!c.pyright,reactNative:!!a["react-native"],semanticRelease:!!(c["semantic-release"]||d.length>0||u.length>0),storybook:!!c["@storybook/react"],wb:!!a["@willbooster/wb"]||!!c["@willbooster/wb"]},release:{branches:d,github:u.includes("@semantic-release/github"),npm:u.includes("@semantic-release/npm")},hasVersionSettings:f,packageJson:l,wbfyJson:w};if(j.isBun||(j.eslintBase=function(e){if(e.depending.next)return"@willbooster/eslint-config-next";if(e.doesContainTypeScript)return e.doesContainJsxOrTsx?"@willbooster/eslint-config-ts-react":"@willbooster/eslint-config-ts";if(e.doesContainJsxOrTsx)return"@willbooster/eslint-config-js-react";if(e.doesContainJavaScript)return"@willbooster/eslint-config-js"}(j)),j.doesContainGemfile||j.doesContainGoMod||j.doesContainPackageJson||j.doesContainPoetryLock||j.doesContainPomXml||j.doesContainPubspecYaml||j.doesContainTemplateYaml)return j}catch{}}function Gt(e,t){return p.globSync(e,{dot:!0,cwd:t,ignore:D}).length>0}async function Ut(e){const[t,n]=Le.getOrgAndName(e);if(!t||!n)return;const s={full_name:`${t}/${n}`};try{const e=await Je().request("GET /repos/{owner}/{repo}",{owner:t,repo:n});Object.assign(s,e.data)}catch(e){const t=function(e){if(!e||"object"!=typeof e)return;const t="response"in e?e.response:void 0,n=t?.status??e.status;if(301!==n&&302!==n)return;const s=t?.headers?.location;if("string"!=typeof s)return;const[i,r]=Le.getOrgAndName(s);if(!i||!r)return;return`${i}/${r}`}(e);t&&(s.full_name=t)}return s}await async function(){const n=await r(process.argv.slice(2)).command("$0 [paths..]","Make a given project follow the WillBooster standard",e=>{e.positional("paths",{describe:"project paths to be wbfied",array:!0,type:"string",default:["."]})}).options({env:{description:"Upload environment variables as secrets to GitHub",type:"boolean",default:!1,alias:"e"},skipDeps:{description:"Skip dependency installation",type:"boolean",default:!1,alias:"d"},verbose:{description:"Whether or not to enable verbose mode",type:"boolean",default:!1,alias:"v"}}).version(function(){let n=t.dirname(new URL(import.meta.url).pathname);for(;!e.existsSync(t.join(n,"package.json"));)n=t.dirname(n);return JSON.parse(e.readFileSync(t.join(n,"package.json"),"utf8")).version}()).strict().argv;x.isVerbose=n.verbose,x.doesUploadEnvVars=n.env;for(const s of n.paths){const r=t.join(s,"packages"),o=(await i(()=>e.promises.readdir(r,{withFileTypes:!0}))??[]).filter(e=>e.isDirectory()).map(e=>t.join(r,e.name));await W([s,...o]);const a=await Jt(s);if(!a){console.error(`there is no valid package.json in ${s}`);continue}const c=X(a),l=(await Promise.all(o.map(e=>Jt(e,a)))).filter(e=>!!e),p=[a,...l];if(x.isVerbose)for(const e of p)console.info(e);await Ct(a),a.isBun&&await ae(a);const d=!H(a.repository)&&(a.repository?.startsWith("github:WillBooster/")||a.repository?.startsWith("github:WillBoosterLab/"));await Promise.all([j(a),R(a),c.then(()=>mt(a)),te(a,p),fe(a),we(a),xe(a,p),_e(a),Se(a),Wt(a),Ie(a),yt(a),ft(a),...d?[q(a)]:[],Ot(a),It(a),Tt(a),ot(a),lt(a)]),await $.promiseAll();const u=[];for(const e of p)Me(e)||((e.doesContainTypeScript||e.doesContainTypeScriptInPackages)&&u.push(L(e,e.isRoot?p:[e])),e.depending.playwrightTest&&u.push(B(e)),e.depending.next&&u.push(P(e)),await Pe(e,a),await $.promiseAll(),(e.isRoot||e.doesContainPackageJson)&&(await pt(e),await Ve(e,a,n.skipDeps),u.push(lt(e)),e.doesContainVscodeSettingsJson&&e.doesContainPackageJson&&u.push($t(e)),(e.doesContainTypeScript||e.doesContainTypeScriptInPackages)&&u.push(_t(e)),(e.doesContainJavaScript||e.doesContainJavaScriptInPackages||e.doesContainTypeScript||e.doesContainTypeScriptInPackages)&&(a.isBun&&u.push(ie(e)),a.isWillBoosterConfigs||u.push(ve(e))),e.depending.pyright&&u.push(ut(e))));await Promise.all(u),await $.promiseAll();const m=a.isBun?"bun":"yarn";a.isBun?(e.rmSync(t.join(s,"bun.lock"),{force:!0}),Te(m,["update"],s)):(e.rmSync(t.join(s,"yarn.lock"),{force:!0}),Te(m,["install","--no-immutable"],s)),Te(m,["cleanup"],s),a.isBun||Te(m,["install","--no-immutable"],s),await wt(a)}}();
18
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9vcHRpb25zLnRzIiwiLi4vc3JjL2xvZ2dlci50cyIsIi4uL3NyYy9maXhlcnMvZG9ja2VyZmlsZS50cyIsIi4uL3NyYy91dGlscy9mc1V0aWwudHMiLCIuLi9zcmMvdXRpbHMvcHJvbWlzZVBvb2wudHMiLCIuLi9zcmMvZml4ZXJzL25leHRDb25maWcudHMiLCIuLi9zcmMvZml4ZXJzL3BsYXl3cmlnaHRDb25maWcudHMiLCIuLi9zcmMvdXRpbHMvZ2xvYlV0aWwudHMiLCIuLi9zcmMvZml4ZXJzL3ByaXNtYS50cyIsIi4uL3NyYy9maXhlcnMvdGVzdERpcmVjdG9yeS50cyIsIi4uL3NyYy9maXhlcnMvdHlwZURlZmluaXRpb24udHMiLCIuLi9zcmMvdXRpbHMvbWVyZ2VVdGlsLnRzIiwiLi4vc3JjL3V0aWxzL29iamVjdFV0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy93b3JrZmxvdy50cyIsIi4uL3NyYy9maXhlcnMvdHlwb3MudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9hZ2VudHMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9iaW9tZS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2J1bmZpZy50cyIsIi4uL3NyYy91dGlscy9pZ25vcmVGaWxlVXRpbC50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2RvY2tlcmlnbm9yZS50cyIsIi4uL3NyYy91dGlscy9leHRlbnNpb25zLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZWRpdG9yY29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZXNsaW50Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2VtaW5pQ29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2VtaW5pU2V0dGluZ3MudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9naXRhdHRyaWJ1dGVzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2l0aWdub3JlLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvaWRlYS50cyIsIi4uL3NyYy91dGlscy9zcGF3blV0aWwudHMiLCIuLi9zcmMvdXRpbHMvZXNsaW50VXRpbC50cyIsIi4uL3NyYy91dGlscy9naXRodWJVdGlsLnRzIiwiLi4vc3JjL3V0aWxzL3dpbGxib29zdGVyQ29uZmlnc1V0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9wYWNrYWdlSnNvbi50cyIsIi4uL3NyYy91dGlscy90c2NvbmZpZ0Jhc2UudHMiLCIuLi9zcmMvZ2l0aHViL2NvbW1pdC50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2xlZnRob29rLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvbGludHN0YWdlZHJjLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcHJldHRpZXJpZ25vcmUudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9weXJpZ2h0Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVhZG1lLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVsZWFzZXJjLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVub3ZhdGVKc29uLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvc2tpbGxzLnRzIiwiLi4vc3JjL3V0aWxzL3NyY0RpcmVjdG9yaWVzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvdHNjb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy92c2NvZGVTZXR0aW5ncy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3lhcm5yYy50cyIsIi4uL3NyYy9naXRodWIvbGFiZWwudHMiLCIuLi9zcmMvZ2l0aHViL3NlY3JldC50cyIsIi4uL3NyYy9naXRodWIvc2V0dGluZ3MudHMiLCIuLi9zcmMvZ2l0aHViL3RlbXBsYXRlLnRzIiwiLi4vc3JjL3BhY2thZ2VDb25maWcudHMiLCIuLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiY2xhc3MgT3B0aW9ucyB7XG4gIGlzVmVyYm9zZSA9IGZhbHNlO1xuICBkb2VzVXBsb2FkRW52VmFycyA9IGZhbHNlO1xufVxuXG5leHBvcnQgY29uc3Qgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7XG4iLCJpbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi9vcHRpb25zLmpzJztcblxuY2xhc3MgTG9nZ2VyIHtcbiAgYXN5bmMgZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbihuYW1lOiBzdHJpbmcsIGZ1bmM6ICgpID0+IFByb21pc2U8dm9pZD4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgLS0tLS0tLS0tICR7bmFtZX0gc3RhcnQgLS0tLS0tLS0tYCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmdW5jKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRXJyb3Igb2NjdXJyZWQgaW4gJHtuYW1lfTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3Iuc3RhY2sgOiBTdHJpbmcoZXJyb3IpfX1gKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYC0tLS0tLS0tLS0gJHtuYW1lfSBlbmQgLS0tLS0tLS0tLWApO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgbG9nZ2VyID0gbmV3IExvZ2dlcigpO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4RG9ja2VyZmlsZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhEb2NrZXJmaWxlJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghY29uZmlnLmRvZXNDb250YWluRG9ja2VyZmlsZSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2xkQ29udGVudCA9IGNvbmZpZy5kb2NrZXJmaWxlO1xuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBvbGRDb250ZW50O1xuXG4gICAgaWYgKG9sZENvbnRlbnQgPT09IG5ld0NvbnRlbnQpIHJldHVybjtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUocGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAnRG9ja2VyZmlsZScpLCBuZXdDb250ZW50KTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5leHBvcnQgY29uc3QgZnNVdGlsID0ge1xuICBhc3luYyByZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gIH0sXG4gIGFzeW5jIGdlbmVyYXRlRmlsZShmaWxlUGF0aDogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihwYXRoLmRpcm5hbWUoZmlsZVBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBsZXQgbm9ybWFsaXplZENvbnRlbnQgPSBjb250ZW50LnJlcGxhY2VBbGwoJ1xcclxcbicsICdcXG4nKS50cmltKCk7XG4gICAgaWYgKG5vcm1hbGl6ZWRDb250ZW50KSB7XG4gICAgICBub3JtYWxpemVkQ29udGVudCArPSAnXFxuJztcbiAgICB9XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGZpbGVQYXRoLCBub3JtYWxpemVkQ29udGVudCk7XG4gICAgY29uc29sZS5sb2coYEdlbmVyYXRlZC9VcGRhdGVkICR7ZmlsZVBhdGh9YCk7XG4gIH0sXG59O1xuIiwiaW1wb3J0IHsgUHJvbWlzZVBvb2wgfSBmcm9tICdtaW5pbWFsLXByb21pc2UtcG9vbCc7XG5cbmV4cG9ydCBjb25zdCBwcm9taXNlUG9vbCA9IG5ldyBQcm9taXNlUG9vbCgpO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4TmV4dENvbmZpZ0pzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4TmV4dENvbmZpZ0pzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBbJ2pzJywgJ21qcycsICdjanMnXVxuICAgICAgLm1hcCgoZXh0KSA9PiBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGBuZXh0LmNvbmZpZy4ke2V4dH1gKSlcbiAgICAgIC5maW5kKChwKSA9PiBmcy5leGlzdHNTeW5jKHApKTtcbiAgICBpZiAoIWZpbGVQYXRoKSByZXR1cm47XG5cbiAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgLy8gUmVwbGFjZSB0aGUgSlNPTiBvYmplY3QgZnJvbSB0aGUgZmlsZVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBvbGRDb250ZW50LnJlcGxhY2UoLz1cXHMqeyhbXFxTXFxzXSopfTsvLCAoXywgc2V0dGluZ3NUZXh0OiBzdHJpbmcpID0+IHtcbiAgICAgIGlmICghc2V0dGluZ3NUZXh0LmluY2x1ZGVzKCdlc2xpbnQ6JykpIHtcbiAgICAgICAgc2V0dGluZ3NUZXh0ICs9ICdlc2xpbnQ6IHsgaWdub3JlRHVyaW5nQnVpbGRzOiB0cnVlIH0sJztcbiAgICAgIH1cbiAgICAgIGlmICghc2V0dGluZ3NUZXh0LmluY2x1ZGVzKCd0eXBlc2NyaXB0OicpKSB7XG4gICAgICAgIHNldHRpbmdzVGV4dCArPSAndHlwZXNjcmlwdDogeyBpZ25vcmVCdWlsZEVycm9yczogdHJ1ZSB9LCc7XG4gICAgICB9XG4gICAgICByZXR1cm4gYD0geyR7c2V0dGluZ3NUZXh0fX07YDtcbiAgICB9KTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IHRzIGZyb20gJ3R5cGVzY3JpcHQnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbnR5cGUgUGFyc2VkVmFsdWUgPVxuICB8IHsga2luZDogJ2FycmF5JzsgdmFsdWU6IFBhcnNlZFZhbHVlW10gfVxuICB8IHsga2luZDogJ2xpdGVyYWwnOyB2YWx1ZTogc3RyaW5nIH1cbiAgfCB7IGtpbmQ6ICdvYmplY3QnOyB2YWx1ZTogUGFyc2VkT2JqZWN0IH07XG50eXBlIFBhcnNlZE9iamVjdCA9IFJlY29yZDxzdHJpbmcsIFBhcnNlZFZhbHVlPjtcblxuY29uc3QgbGl0ZXJhbCA9ICh2YWx1ZTogc3RyaW5nKTogUGFyc2VkVmFsdWUgPT4gKHsga2luZDogJ2xpdGVyYWwnLCB2YWx1ZSB9KTtcbmNvbnN0IGFzQXJyYXkgPSAodmFsdWU6IFBhcnNlZFZhbHVlW10pOiBQYXJzZWRWYWx1ZSA9PiAoeyBraW5kOiAnYXJyYXknLCB2YWx1ZSB9KTtcbmNvbnN0IGFzT2JqZWN0ID0gKHZhbHVlOiBQYXJzZWRPYmplY3QpOiBQYXJzZWRWYWx1ZSA9PiAoeyBraW5kOiAnb2JqZWN0JywgdmFsdWUgfSk7XG5cbmNvbnN0IGRlZmF1bHRDb25maWc6IFBhcnNlZE9iamVjdCA9IHtcbiAgZm9yYmlkT25seTogbGl0ZXJhbCgnISFwcm9jZXNzLmVudi5DSScpLFxuICByZXRyaWVzOiBsaXRlcmFsKCdwcm9jZXNzLmVudi5QV0RFQlVHID8gMCA6IHByb2Nlc3MuZW52LkNJID8gNSA6IDEnKSxcbiAgdXNlOiBhc09iamVjdCh7XG4gICAgYmFzZVVSTDogbGl0ZXJhbCgncHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfQkFTRV9VUkwnKSxcbiAgICB0cmFjZTogbGl0ZXJhbChcInByb2Nlc3MuZW52LkNJID8gJ29uLWZpcnN0LXJldHJ5JyA6ICdyZXRhaW4tb24tZmFpbHVyZSdcIiksXG4gICAgc2NyZWVuc2hvdDogbGl0ZXJhbChcInByb2Nlc3MuZW52LkNJID8gJ29ubHktb24tZmFpbHVyZScgOiAnb25seS1vbi1mYWlsdXJlJ1wiKSxcbiAgICB2aWRlbzogbGl0ZXJhbChcInByb2Nlc3MuZW52LkNJID8gJ3JldGFpbi1vbi1mYWlsdXJlJyA6ICdyZXRhaW4tb24tZmFpbHVyZSdcIiksXG4gIH0pLFxuICB3ZWJTZXJ2ZXI6IGFzT2JqZWN0KHtcbiAgICBjb21tYW5kOiBsaXRlcmFsKFwiJ3lhcm4gc3RhcnQtdGVzdC1zZXJ2ZXInXCIpLFxuICAgIHVybDogbGl0ZXJhbCgncHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfQkFTRV9VUkwnKSxcbiAgICByZXVzZUV4aXN0aW5nU2VydmVyOiBsaXRlcmFsKCchIXByb2Nlc3MuZW52LkNJJyksXG4gICAgdGltZW91dDogbGl0ZXJhbCgnMzAwXzAwMCcpLFxuICAgIHN0ZG91dDogbGl0ZXJhbChcIidwaXBlJ1wiKSxcbiAgICBzdGRlcnI6IGxpdGVyYWwoXCIncGlwZSdcIiksXG4gICAgZW52OiBsaXRlcmFsKGB7XG4gIC4uLnByb2Nlc3MuZW52LFxuICBQUklTTUFfVVNFUl9DT05TRU5UX0ZPUl9EQU5HRVJPVVNfQUlfQUNUSU9OOiAndHJ1ZScsXG59YCksXG4gICAgZ3JhY2VmdWxTaHV0ZG93bjogbGl0ZXJhbChge1xuICBzaWduYWw6ICdTSUdURVJNJyxcbiAgdGltZW91dDogNTAwLFxufWApLFxuICB9KSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhQbGF5d3JpZ2h0Q29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFBsYXl3cmlnaHRDb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGBwbGF5d3JpZ2h0LmNvbmZpZy50c2ApO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHJldHVybjtcblxuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICBjb25zdCBtYXRjaCA9IC9kZWZpbmVDb25maWdcXHMqXFwoXFxzKihcXHtbXFxzXFxTXSo/fSlcXHMqXFwpOz8vLmV4ZWMob2xkQ29udGVudCk7XG4gICAgY29uc3Qgb2JqZWN0TGl0ZXJhbCA9IG1hdGNoPy5bMV07XG4gICAgaWYgKCFvYmplY3RMaXRlcmFsKSByZXR1cm47XG5cbiAgICBjb25zdCBwYXJzZWQgPSBwYXJzZU9iamVjdExpdGVyYWwob2JqZWN0TGl0ZXJhbCk7XG4gICAgaWYgKCFwYXJzZWQpIHJldHVybjtcblxuICAgIC8vIEtlZXAgZmlsbGluZyBtaXNzaW5nIGRlZmF1bHRzLCBidXQgZG9uJ3Qgb3ZlcndyaXRlIGxvY2FsIGFkanVzdG1lbnRzIG9uIGV2ZXJ5IHJlZ2VuZXJhdGlvbi5cbiAgICBjb25zdCBtZXJnZWQgPSBtZXJnZS5hbGw8UGFyc2VkT2JqZWN0PihbZGVmYXVsdENvbmZpZywgcGFyc2VkXSk7XG4gICAgY29uc3QgaGFzU3RhcnRUZXN0U2VydmVyID0gQm9vbGVhbihjb25maWcucGFja2FnZUpzb24/LnNjcmlwdHM/Llsnc3RhcnQtdGVzdC1zZXJ2ZXInXSk7XG4gICAgaWYgKCFoYXNTdGFydFRlc3RTZXJ2ZXIpIHtcbiAgICAgIGRlbGV0ZSBtZXJnZWQud2ViU2VydmVyO1xuICAgIH1cblxuICAgIGNvbnN0IGhhc0Jhc2VVcmwgPSBhd2FpdCBoYXNOZXh0UHVibGljQmFzZVVybChjb25maWcuZGlyUGF0aCk7XG4gICAgaWYgKCFoYXNCYXNlVXJsKSB7XG4gICAgICBjb25zdCB1c2VDb25maWcgPSBtZXJnZWQudXNlO1xuICAgICAgaWYgKHVzZUNvbmZpZz8ua2luZCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgZGVsZXRlIHVzZUNvbmZpZy52YWx1ZS5iYXNlVVJMO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG5ld09iamVjdExpdGVyYWwgPSBzdHJpbmdpZnlPYmplY3QobWVyZ2VkLCAwKTtcbiAgICBjb25zdCBuZXdDb250ZW50ID0gb2xkQ29udGVudC5yZXBsYWNlKG9iamVjdExpdGVyYWwsIG5ld09iamVjdExpdGVyYWwpO1xuXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGhhc05leHRQdWJsaWNCYXNlVXJsKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBlbnZGaWxlUGF0aHMgPSBbcGF0aC5yZXNvbHZlKGRpclBhdGgsICcuZW52JyksIHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnbWlzZS50b21sJyldO1xuICBmb3IgKGNvbnN0IGVudkZpbGVQYXRoIG9mIGVudkZpbGVQYXRocykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZW52RmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBpZiAoL05FWFRfUFVCTElDX0JBU0VfVVJMXFxzKj0vbS50ZXN0KGNvbnRlbnQpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gTWlzc2luZyBlbnYgZmlsZXMgYXJlIGV4cGVjdGVkIGluIHNvbWUgcmVwb3MuXG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gcGFyc2VPYmplY3RMaXRlcmFsKG9iamVjdExpdGVyYWw6IHN0cmluZyk6IFBhcnNlZE9iamVjdCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHNvdXJjZSA9IHRzLmNyZWF0ZVNvdXJjZUZpbGUoXG4gICAgJ3BsYXl3cmlnaHQtY29uZmlnLnRzJyxcbiAgICBgY29uc3QgY29uZmlnID0gJHtvYmplY3RMaXRlcmFsfTtgLFxuICAgIHRzLlNjcmlwdFRhcmdldC5MYXRlc3QsXG4gICAgdHJ1ZSxcbiAgICB0cy5TY3JpcHRLaW5kLlRTXG4gICk7XG4gIGNvbnN0IHN0YXRlbWVudCA9IHNvdXJjZS5zdGF0ZW1lbnRzWzBdO1xuICBpZiAoIXN0YXRlbWVudCB8fCAhdHMuaXNWYXJpYWJsZVN0YXRlbWVudChzdGF0ZW1lbnQpKSByZXR1cm47XG4gIGNvbnN0IGRlY2xhcmF0aW9uID0gc3RhdGVtZW50LmRlY2xhcmF0aW9uTGlzdC5kZWNsYXJhdGlvbnNbMF07XG4gIGlmICghZGVjbGFyYXRpb24/LmluaXRpYWxpemVyIHx8ICF0cy5pc09iamVjdExpdGVyYWxFeHByZXNzaW9uKGRlY2xhcmF0aW9uLmluaXRpYWxpemVyKSkgcmV0dXJuO1xuICByZXR1cm4gcGFyc2VPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihkZWNsYXJhdGlvbi5pbml0aWFsaXplciwgc291cmNlKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihcbiAgb2JqZWN0TGl0ZXJhbDogdHMuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24sXG4gIHNvdXJjZTogdHMuU291cmNlRmlsZVxuKTogUGFyc2VkT2JqZWN0IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcGFyc2VkOiBQYXJzZWRPYmplY3QgPSB7fTtcbiAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBvYmplY3RMaXRlcmFsLnByb3BlcnRpZXMpIHtcbiAgICBpZiAoIXRzLmlzUHJvcGVydHlBc3NpZ25tZW50KHByb3BlcnR5KSB8fCAoIXRzLmlzSWRlbnRpZmllcihwcm9wZXJ0eS5uYW1lKSAmJiAhdHMuaXNTdHJpbmdMaXRlcmFsKHByb3BlcnR5Lm5hbWUpKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZSA9IHBhcnNlRXhwcmVzc2lvbihwcm9wZXJ0eS5pbml0aWFsaXplciwgc291cmNlKTtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgIHBhcnNlZFtwcm9wZXJ0eS5uYW1lLmdldFRleHQoc291cmNlKV0gPSB2YWx1ZTtcbiAgfVxuICByZXR1cm4gcGFyc2VkO1xufVxuXG5mdW5jdGlvbiBwYXJzZUV4cHJlc3Npb24oZXhwcmVzc2lvbjogdHMuRXhwcmVzc2lvbiwgc291cmNlOiB0cy5Tb3VyY2VGaWxlKTogUGFyc2VkVmFsdWUgfCB1bmRlZmluZWQge1xuICBpZiAodHMuaXNPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihleHByZXNzaW9uKSkge1xuICAgIGNvbnN0IHBhcnNlZE9iamVjdCA9IHBhcnNlT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oZXhwcmVzc2lvbiwgc291cmNlKTtcbiAgICByZXR1cm4gcGFyc2VkT2JqZWN0ID8gYXNPYmplY3QocGFyc2VkT2JqZWN0KSA6IGxpdGVyYWwoZXhwcmVzc2lvbi5nZXRUZXh0KHNvdXJjZSkpO1xuICB9XG4gIGlmICh0cy5pc0FycmF5TGl0ZXJhbEV4cHJlc3Npb24oZXhwcmVzc2lvbikpIHtcbiAgICBjb25zdCBlbGVtZW50cyA9IGV4cHJlc3Npb24uZWxlbWVudHMubWFwKChlbGVtZW50KSA9PiBwYXJzZUV4cHJlc3Npb24oZWxlbWVudCwgc291cmNlKSk7XG4gICAgaWYgKGVsZW1lbnRzLnNvbWUoKGVsZW1lbnQpOiBlbGVtZW50IGlzIHVuZGVmaW5lZCA9PiBlbGVtZW50ID09PSB1bmRlZmluZWQpKSB7XG4gICAgICByZXR1cm4gbGl0ZXJhbChleHByZXNzaW9uLmdldFRleHQoc291cmNlKSk7XG4gICAgfVxuICAgIHJldHVybiBhc0FycmF5KGVsZW1lbnRzIGFzIFBhcnNlZFZhbHVlW10pO1xuICB9XG4gIHJldHVybiBsaXRlcmFsKGV4cHJlc3Npb24uZ2V0VGV4dChzb3VyY2UpKTtcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5VmFsdWUodmFsdWU6IFBhcnNlZFZhbHVlLCBsZXZlbDogbnVtYmVyKTogc3RyaW5nIHtcbiAgaWYgKHZhbHVlLmtpbmQgPT09ICdhcnJheScpIHtcbiAgICByZXR1cm4gc3RyaW5naWZ5QXJyYXkodmFsdWUudmFsdWUsIGxldmVsKTtcbiAgfVxuICBpZiAodmFsdWUua2luZCA9PT0gJ2xpdGVyYWwnKSByZXR1cm4gdmFsdWUudmFsdWU7XG4gIHJldHVybiBzdHJpbmdpZnlPYmplY3QodmFsdWUudmFsdWUsIGxldmVsKTtcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5QXJyYXkodmFsdWVzOiBQYXJzZWRWYWx1ZVtdLCBsZXZlbDogbnVtYmVyKTogc3RyaW5nIHtcbiAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDApIHJldHVybiAnW10nO1xuICBjb25zdCBpbmRlbnQgPSAnICAnLnJlcGVhdChsZXZlbCArIDEpO1xuICBjb25zdCBsaW5lcyA9IHZhbHVlcy5tYXAoKHZhbHVlKSA9PiB7XG4gICAgY29uc3Qgc3RyaW5naWZpZWQgPSBzdHJpbmdpZnlWYWx1ZSh2YWx1ZSwgbGV2ZWwgKyAxKS5zcGxpdCgnXFxuJyk7XG4gICAgc3RyaW5naWZpZWRbc3RyaW5naWZpZWQubGVuZ3RoIC0gMV0gPSBgJHtzdHJpbmdpZmllZC5hdCgtMSl9LGA7XG4gICAgaWYgKHZhbHVlLmtpbmQgPT09ICdsaXRlcmFsJykge1xuICAgICAgZm9yIChsZXQgaW5kZXggPSAxOyBpbmRleCA8IHN0cmluZ2lmaWVkLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgICBzdHJpbmdpZmllZFtpbmRleF0gPSBgJHtpbmRlbnR9JHtzdHJpbmdpZmllZFtpbmRleF19YDtcbiAgICAgIH1cbiAgICB9XG4gICAgc3RyaW5naWZpZWRbMF0gPSBgJHtpbmRlbnR9JHtzdHJpbmdpZmllZFswXX1gO1xuICAgIHJldHVybiBzdHJpbmdpZmllZC5qb2luKCdcXG4nKTtcbiAgfSk7XG4gIGNvbnN0IGNsb3NpbmdJbmRlbnQgPSAnICAnLnJlcGVhdChsZXZlbCk7XG4gIHJldHVybiBgW1xcbiR7bGluZXMuam9pbignXFxuJyl9XFxuJHtjbG9zaW5nSW5kZW50fV1gO1xufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnlPYmplY3Qob2JqZWN0OiBQYXJzZWRPYmplY3QsIGxldmVsOiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCBpbmRlbnQgPSAnICAnLnJlcGVhdChsZXZlbCArIDEpO1xuICBjb25zdCBsaW5lcyA9IE9iamVjdC5lbnRyaWVzKG9iamVjdCkubWFwKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICBjb25zdCBzdHJpbmdpZmllZCA9IHN0cmluZ2lmeVZhbHVlKHZhbHVlLCBsZXZlbCArIDEpLnNwbGl0KCdcXG4nKTtcbiAgICBzdHJpbmdpZmllZFtzdHJpbmdpZmllZC5sZW5ndGggLSAxXSA9IGAke3N0cmluZ2lmaWVkLmF0KC0xKX0sYDtcbiAgICBpZiAodmFsdWUua2luZCA9PT0gJ2xpdGVyYWwnKSB7XG4gICAgICBmb3IgKGxldCBpbmRleCA9IDE7IGluZGV4IDwgc3RyaW5naWZpZWQubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICAgIHN0cmluZ2lmaWVkW2luZGV4XSA9IGAke2luZGVudH0ke3N0cmluZ2lmaWVkW2luZGV4XX1gO1xuICAgICAgfVxuICAgIH1cbiAgICBzdHJpbmdpZmllZFswXSA9IGAke2luZGVudH0ke2tleX06ICR7c3RyaW5naWZpZWRbMF19YDtcbiAgICByZXR1cm4gc3RyaW5naWZpZWQuam9pbignXFxuJyk7XG4gIH0pO1xuICBjb25zdCBjbG9zaW5nSW5kZW50ID0gJyAgJy5yZXBlYXQobGV2ZWwpO1xuICBpZiAobGluZXMubGVuZ3RoID09PSAwKSByZXR1cm4gYHtcXG4ke2Nsb3NpbmdJbmRlbnR9fWA7XG4gIHJldHVybiBge1xcbiR7bGluZXMuam9pbignXFxuJyl9XFxuJHtjbG9zaW5nSW5kZW50fX1gO1xufVxuIiwiZXhwb3J0IGNvbnN0IGdsb2JJZ25vcmUgPSBbXG4gICcqKi9ub2RlX21vZHVsZXMvKionLFxuICAnKiovLnZlbnYvKionLFxuICAnKiovdGVzdC1maXh0dXJlcy8qKicsXG4gICcqKi90ZXN0L2ZpeHR1cmVzLyoqJyxcbiAgJyoqL2Rpc3QvKionLFxuICAnKiovYnVpbGQvKionLFxuICAnKiovdGFyZ2V0LyoqJyxcbiAgJyoqL3RlbXAvKionLFxuICAnKiovdG1wLyoqJyxcbl07XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJy4uL3V0aWxzL2dsb2JVdGlsLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFByaXNtYUVudkZpbGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFByaXNtYUVudkZpbGVzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGVudkZpbGVzID0gYXdhaXQgZmcuZ2xvYihbJyouZW52JywgJyouZW52LionXSwgeyBkb3Q6IHRydWUsIGN3ZDogY29uZmlnLmRpclBhdGgsIGlnbm9yZTogZ2xvYklnbm9yZSB9KTtcbiAgICBmb3IgKGNvbnN0IGVudkZpbGUgb2YgZW52RmlsZXMpIHtcbiAgICAgIGNvbnN0IGVudkZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBlbnZGaWxlKTtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShlbnZGaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoXG4gICAgICAgIC9EQVRBQkFTRV9VUkw9XCI/KC4rXFwuc3FsaXRlMylcIj9bXFxuJF0vLFxuICAgICAgICAnREFUQUJBU0VfVVJMPVwiJDE/Y29ubmVjdGlvbl9saW1pdD0xXCJcXG4nXG4gICAgICApO1xuICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKGVudkZpbGVQYXRoLCBuZXdDb250ZW50KTtcbiAgICB9XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFRlc3REaXJlY3Rvcmllc1VwZGF0aW5nUGFja2FnZUpzb24ocGFja2FnZURpclBhdGhzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFRlc3REaXJlY3Rvcmllc1VwZGF0aW5nUGFja2FnZUpzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBwYWNrYWdlRGlyUGF0aHMubWFwKGFzeW5jIChwYWNrYWdlRGlyUGF0aCkgPT4ge1xuICAgICAgICBjb25zdCBuZXdUZXN0RGlyUGF0aCA9IHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ3Rlc3QnKTtcbiAgICAgICAgZm9yIChjb25zdCBvbGRUZXN0RGlyTmFtZSBvZiBbJ19fdGVzdHNfXycsICd0ZXN0cyddKSB7XG4gICAgICAgICAgY29uc3Qgb2xkVGVzdERpclBhdGggPSBwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsIG9sZFRlc3REaXJOYW1lKTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMucmVuYW1lKG9sZFRlc3REaXJQYXRoLCBuZXdUZXN0RGlyUGF0aCk7XG4gICAgICAgICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUocGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAncGFja2FnZS5qc29uJyksICd1dGY4Jyk7XG4gICAgICAgICAgICBjb25zdCBuZXdDb250ZW50ID0gb2xkQ29udGVudC5yZXBsYWNlQWxsKG9sZFRlc3REaXJOYW1lLCAndGVzdCcpO1xuICAgICAgICAgICAgaWYgKG9sZENvbnRlbnQgPT09IG5ld0NvbnRlbnQpIHJldHVybjtcblxuICAgICAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpLCBuZXdDb250ZW50KTtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBpZ25vcmVFbm9lbnRBc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhUeXBlRGVmaW5pdGlvbnMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgY29uZmlnc0luY2x1ZGluZ0NoaWxkcmVuOiBQYWNrYWdlQ29uZmlnW11cbik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFR5cGVEZWZpbml0aW9ucycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBsaWJUeXBlRGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ0B0eXBlcycpO1xuICAgIGNvbnN0IHNyY1R5cGVEaXJQYXRoID1cbiAgICAgIGNvbmZpZy5pc1Jvb3QgJiYgY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zID8gdW5kZWZpbmVkIDogcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnc3JjJywgJ3R5cGVzJyk7XG5cbiAgICBjb25zdCBkaXJlbnRzID0gYXdhaXQgaWdub3JlRW5vZW50QXN5bmMoKCkgPT4gZnMucmVhZGRpcihsaWJUeXBlRGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKTtcbiAgICBpZiAoIWRpcmVudHMpIHJldHVybjtcblxuICAgIGZvciAoY29uc3QgZGlyZW50IG9mIGRpcmVudHMpIHtcbiAgICAgIGNvbnN0IGRpck5hbWUgPSBkaXJlbnQubmFtZS5zbGljZSgwLCAtNSk7XG4gICAgICBjb25zdCBoYXNUeXBlRGVjbGFyYXRpb25FeHRlbnNpb24gPSBkaXJlbnQubmFtZS5lbmRzV2l0aCgnLmQudHMnKTtcbiAgICAgIGxldCBwYWNrYWdlTmFtZSA9IGhhc1R5cGVEZWNsYXJhdGlvbkV4dGVuc2lvbiA/IGRpck5hbWUgOiBkaXJlbnQubmFtZTtcbiAgICAgIGlmIChwYWNrYWdlTmFtZS5pbmNsdWRlcygnX18nKSkge1xuICAgICAgICBwYWNrYWdlTmFtZSA9IGBAJHtwYWNrYWdlTmFtZS5yZXBsYWNlKCdfXycsICcvJyl9YDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGhhc0xpYnJhcnkgPSBjb25maWdzSW5jbHVkaW5nQ2hpbGRyZW4uc29tZShcbiAgICAgICAgKGNvbmZpZykgPT5cbiAgICAgICAgICBjb25maWcucGFja2FnZUpzb24/LmRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSB8fCBjb25maWcucGFja2FnZUpzb24/LmRldkRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXVxuICAgICAgKTtcblxuICAgICAgaWYgKGRpcmVudC5pc0ZpbGUoKSAmJiBoYXNUeXBlRGVjbGFyYXRpb25FeHRlbnNpb24pIHtcbiAgICAgICAgaWYgKGhhc0xpYnJhcnkpIHtcbiAgICAgICAgICAvLyBNb3ZlIEB0eXBlcy88bmFtZT4vaW5kZXguZC50cyBpZiBpbnN0YWxsZWRcbiAgICAgICAgICBhd2FpdCBmcy5ta2RpcihwYXRoLmpvaW4obGliVHlwZURpclBhdGgsIGRpck5hbWUpKTtcbiAgICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgICAgICAgIGZzLnJlbmFtZShwYXRoLmpvaW4obGliVHlwZURpclBhdGgsIGRpcmVudC5uYW1lKSwgcGF0aC5qb2luKGxpYlR5cGVEaXJQYXRoLCBkaXJOYW1lLCAnaW5kZXguZC50cycpKVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3JjVHlwZURpclBhdGgpIHtcbiAgICAgICAgICAvLyBNb3ZlIHNyYy90eXBlcy88bmFtZT4gaWYgbm90IGluc3RhbGxlZFxuICAgICAgICAgIGF3YWl0IGZzLm1rZGlyKHNyY1R5cGVEaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgICAgICAgIGZzLnJlbmFtZShwYXRoLmpvaW4obGliVHlwZURpclBhdGgsIGRpcmVudC5uYW1lKSwgcGF0aC5qb2luKHNyY1R5cGVEaXJQYXRoLCBkaXJlbnQubmFtZSkpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChkaXJlbnQuaXNEaXJlY3RvcnkoKSAmJiBzcmNUeXBlRGlyUGF0aCAmJiAhaGFzTGlicmFyeSkge1xuICAgICAgICAvLyBNb3ZlIHNyYy90eXBlcy88bmFtZT4uZC50cyBpZiBub3QgaW5zdGFsbGVkXG4gICAgICAgIGF3YWl0IGZzLm1rZGlyKHNyY1R5cGVEaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICAgICAgaWdub3JlRW5vZW50QXN5bmMoKCkgPT5cbiAgICAgICAgICAgIGZzLnJlbmFtZShcbiAgICAgICAgICAgICAgcGF0aC5qb2luKGxpYlR5cGVEaXJQYXRoLCBkaXJlbnQubmFtZSwgJ2luZGV4LmQudHMnKSxcbiAgICAgICAgICAgICAgcGF0aC5qb2luKHNyY1R5cGVEaXJQYXRoLCBgJHtkaXJlbnQubmFtZX0uZC50c2ApXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWFzc2lnbm1lbnQsIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtY2FsbCwgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzLCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWFyZ3VtZW50ICovXG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5leHBvcnQgZnVuY3Rpb24gb3ZlcndyaXRlTWVyZ2U8VD4oZGVzdGluYXRpb25BcnJheTogVFtdLCBzb3VyY2VBcnJheTogVFtdKTogVFtdIHtcbiAgcmV0dXJuIHNvdXJjZUFycmF5O1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGZ1bmN0aW9uIGNvbWJpbmVNZXJnZSh0YXJnZXQ6IG9iamVjdFtdLCBzb3VyY2U6IG9iamVjdFtdLCBvcHRpb25zOiBhbnkpOiBvYmplY3RbXSB7XG4gIGNvbnN0IGRlc3RpbmF0aW9uID0gWy4uLnRhcmdldF07XG5cbiAgZm9yIChjb25zdCBbaW5kZXgsIGl0ZW1dIG9mIHNvdXJjZS5lbnRyaWVzKCkpIHtcbiAgICBpZiAoZGVzdGluYXRpb25baW5kZXhdID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGRlc3RpbmF0aW9uW2luZGV4XSA9IG9wdGlvbnMuY2xvbmVVbmxlc3NPdGhlcndpc2VTcGVjaWZpZWQoaXRlbSwgb3B0aW9ucyk7XG4gICAgfSBlbHNlIGlmIChvcHRpb25zLmlzTWVyZ2VhYmxlT2JqZWN0KGl0ZW0pKSB7XG4gICAgICBkZXN0aW5hdGlvbltpbmRleF0gPSBtZXJnZSh0YXJnZXRbaW5kZXhdIGFzIG9iamVjdCwgaXRlbSwgb3B0aW9ucyk7XG4gICAgfSBlbHNlIGlmICghdGFyZ2V0LmluY2x1ZGVzKGl0ZW0pKSB7XG4gICAgICBkZXN0aW5hdGlvbi5wdXNoKGl0ZW0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGVzdGluYXRpb247XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gbW92ZVRvQm90dG9tPFRPYmogZXh0ZW5kcyBSZWNvcmQ8VEtleSwgdW5rbm93bj4sIFRLZXkgZXh0ZW5kcyBzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2w+KFxuICBvYmo6IFRPYmosXG4gIGtleTogVEtleVxuKTogVE9iaiB7XG4gIGNvbnN0IHZhbHVlID0gb2JqW2tleV07XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgZGVsZXRlIG9ialtrZXldO1xuICAob2JqIGFzIFJlY29yZDxUS2V5LCB1bmtub3duPilba2V5XSA9IHZhbHVlO1xuICByZXR1cm4gb2JqO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc29ydEtleXM8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PihvYmo6IFQpOiBUIHtcbiAgY29uc3Qga2V5QW5kVmFsdWVzID0gT2JqZWN0LmVudHJpZXMob2JqKS50b1NvcnRlZCgoW2tleTFdLCBba2V5Ml0pID0+IGtleTEubG9jYWxlQ29tcGFyZShrZXkyKSk7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGtleUFuZFZhbHVlcykge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgICBkZWxldGUgb2JqW2tleV07XG4gICAgKG9iaiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSA9IHZhbHVlO1xuXG4gICAgLy8gaWYgdmFsdWUgaXMgYW4gb2JqZWN0LCBzb3J0IHRoZSBrZXlzIG9mIHRoZSBvYmplY3RcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgc29ydEtleXModmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb2JqO1xufVxuIiwiLyogZXNsaW50LWRpc2FibGUgdW5pY29ybi9uby1udWxsICovXG5cbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IHlhbWwgZnJvbSAnanMteWFtbCc7XG5pbXBvcnQgY2xvbmVEZWVwIGZyb20gJ2xvZGFzaC5jbG9uZWRlZXAnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBjb21iaW5lTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgbW92ZVRvQm90dG9tLCBzb3J0S2V5cyB9IGZyb20gJy4uL3V0aWxzL29iamVjdFV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmludGVyZmFjZSBXb3JrZmxvdyB7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIG9uPzogT247XG4gIGNvbmN1cnJlbmN5PzogQ29uY3VycmVuY3k7XG4gIHBlcm1pc3Npb25zPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgam9iczogUmVjb3JkPHN0cmluZywgSm9iPjtcbn1cblxuaW50ZXJmYWNlIENvbmN1cnJlbmN5IHtcbiAgZ3JvdXA6IHN0cmluZztcbiAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBPbiB7XG4gIGlzc3Vlcz86IFR5cGVzIHwgbnVsbDtcbiAgcHVsbF9yZXF1ZXN0PzogUHVsbFJlcXVlc3QgfCBudWxsO1xuICBwdWxsX3JlcXVlc3RfdGFyZ2V0PzogVHlwZXMgfCBudWxsO1xuICBwdXNoPzogUHVzaDtcbiAgc2NoZWR1bGU/OiBTY2hlZHVsZVtdO1xuICB3b3JrZmxvd19kaXNwYXRjaD86IG51bGw7XG59XG5cbmludGVyZmFjZSBQdWxsUmVxdWVzdCB7XG4gICdwYXRocy1pZ25vcmUnPzogc3RyaW5nW107XG4gIHR5cGVzPzogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBQdXNoIHtcbiAgYnJhbmNoZXM6IHN0cmluZ1tdO1xuICAncGF0aHMtaWdub3JlJz86IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgU2NoZWR1bGUge1xuICBjcm9uOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBUeXBlcyB7XG4gIHR5cGVzOiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIEpvYiB7XG4gICdydW5zLW9uJz86IHN0cmluZztcbiAgcGVybWlzc2lvbnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBzdGVwcz86IFN0ZXBbXTtcbiAgdXNlcz86IHN0cmluZztcbiAgaWY/OiBzdHJpbmc7XG4gIHNlY3JldHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgd2l0aD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG5pbnRlcmZhY2UgU3RlcCB7XG4gIHVzZXM/OiBzdHJpbmc7XG4gIHdpdGg/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcnVuPzogc3RyaW5nO1xufVxuXG5jb25zdCBwdWJsaWNSZXBvQXV0b2ZpeFdvcmtmbG93OiBXb3JrZmxvdyA9IHtcbiAgbmFtZTogJ2F1dG9maXguY2knLFxuICBvbjoge1xuICAgIHB1bGxfcmVxdWVzdDogbnVsbCxcbiAgICBwdXNoOiB7XG4gICAgICBicmFuY2hlczogWydtYWluJ10sXG4gICAgfSxcbiAgfSxcbiAgcGVybWlzc2lvbnM6IHtcbiAgICBjb250ZW50czogJ3JlYWQnLFxuICB9LFxuICBjb25jdXJyZW5jeToge1xuICAgIGdyb3VwOiAnYXV0b2ZpeC0ke3sgZ2l0aHViLmhlYWRfcmVmIH19JyxcbiAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogdHJ1ZSxcbiAgfSxcbiAgam9iczoge1xuICAgIGF1dG9maXg6IHsgJ3J1bnMtb24nOiAndWJ1bnR1LWxhdGVzdCcgfSxcbiAgfSxcbn07XG5cbmNvbnN0IHByaXZhdGVSZXBvQXV0b2ZpeFdvcmtmbG93OiBXb3JrZmxvdyA9IHtcbiAgbmFtZTogJ0ZpeCBjb2RlIGF1dG9tYXRpY2FsbHknLFxuICBvbjoge1xuICAgIHB1bGxfcmVxdWVzdDogbnVsbCxcbiAgfSxcbiAgY29uY3VycmVuY3k6IHtcbiAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0tJHt7IGdpdGh1Yi5yZWYgfX0nLFxuICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiB0cnVlLFxuICB9LFxuICBqb2JzOiB7XG4gICAgYXV0b2ZpeDoge1xuICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9hdXRvZml4LnltbEBtYWluJyxcbiAgICB9LFxuICB9LFxufTtcblxuY29uc3Qgd29ya2Zsb3dzID0ge1xuICB0ZXN0OiB7XG4gICAgbmFtZTogJ1Rlc3QnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3Q6IG51bGwsXG4gICAgICBwdXNoOiB7XG4gICAgICAgIGJyYW5jaGVzOiBbJ21haW4nLCAnd2JmeSddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIC8vIGNmLiBodHRwczovL2RvY3MuZ2l0aHViLmNvbS9lbi9hY3Rpb25zL3VzaW5nLWpvYnMvdXNpbmctY29uY3VycmVuY3kjZXhhbXBsZS1vbmx5LWNhbmNlbC1pbi1wcm9ncmVzcy1qb2JzLW9yLXJ1bnMtZm9yLXRoZS1jdXJyZW50LXdvcmtmbG93XG4gICAgY29uY3VycmVuY3k6IHtcbiAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fS0ke3sgZ2l0aHViLnJlZiB9fScsXG4gICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogdHJ1ZSxcbiAgICB9LFxuICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAvLyBmb3IgbGludGVyIGZpeFxuICAgICAgY29udGVudHM6ICd3cml0ZScsXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICB0ZXN0OiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvdGVzdC55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIHJlbGVhc2U6IHtcbiAgICBuYW1lOiAnUmVsZWFzZScsXG4gICAgb246IHtcbiAgICAgIHB1c2g6IHtcbiAgICAgICAgYnJhbmNoZXM6IFtdLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0nLFxuICAgICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IGZhbHNlLFxuICAgIH0sXG4gICAgcGVybWlzc2lvbnM6IHtcbiAgICAgIC8vIGh0dHBzOi8vZG9jcy5ucG1qcy5jb20vdHJ1c3RlZC1wdWJsaXNoZXJzI3N0ZXAtMi1jb25maWd1cmUteW91ci1jaWNkLXdvcmtmbG93XG4gICAgICAnaWQtdG9rZW4nOiAnd3JpdGUnLFxuICAgICAgLy8gZm9yIHNlbWFudGljLXJlbGVhc2VcbiAgICAgIGNvbnRlbnRzOiAnd3JpdGUnLFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgcmVsZWFzZToge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3JlbGVhc2UueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAnc2VtYW50aWMtcHInOiB7XG4gICAgbmFtZTogJ0xpbnQgUFIgdGl0bGUnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3RfdGFyZ2V0OiB7XG4gICAgICAgIHR5cGVzOiBbJ29wZW5lZCcsICdlZGl0ZWQnLCAnc3luY2hyb25pemUnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnc2VtYW50aWMtcHInOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3Mvc2VtYW50aWMtcHIueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICBzeW5jOiB7XG4gICAgbmFtZTogJ1N5bmMnLFxuICAgIG9uOiB7fSxcbiAgICBwZXJtaXNzaW9uczoge1xuICAgICAgLy8gZm9yIGNvbW1pdGluZyBjaGFuZ2VzXG4gICAgICBjb250ZW50czogJ3dyaXRlJyxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgIHN5bmM6IHsgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9zeW5jLnltbEBtYWluJyB9LFxuICAgIH0sXG4gIH0sXG4gICdjbG9zZS1jb21tZW50Jzoge1xuICAgIG5hbWU6ICdBZGQgY2xvc2UgY29tbWVudCcsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdDoge1xuICAgICAgICB0eXBlczogWydvcGVuZWQnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnY2xvc2UtY29tbWVudCc6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9jbG9zZS1jb21tZW50LnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ2dlbi1wci1jbGF1ZGUnOiB7XG4gICAgbmFtZTogJ0dlbmVyYXRlIFBSIHdpdGggQ2xhdWRlIENvZGUnLFxuICAgIG9uOiB7XG4gICAgICBpc3N1ZXM6IHtcbiAgICAgICAgdHlwZXM6IFsnbGFiZWxlZCddLFxuICAgICAgfSxcbiAgICAgIHB1bGxfcmVxdWVzdDoge1xuICAgICAgICB0eXBlczogWydsYWJlbGVkJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ2dlbi1wcic6IHtcbiAgICAgICAgaWY6IFwiY29udGFpbnMoZ2l0aHViLmV2ZW50LmxhYmVsLm5hbWUsICdnZW4tcHItYWxsJykgfHwgY29udGFpbnMoZ2l0aHViLmV2ZW50LmxhYmVsLm5hbWUsICdnZW4tcHItY2xhdWRlJylcIixcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9nZW4tcHIueW1sQG1haW4nLFxuICAgICAgICB3aXRoOiB7XG4gICAgICAgICAgJ2NvZGluZy10b29sJzogJ2NsYXVkZS1jb2RlJyxcbiAgICAgICAgICAnaXNzdWUtbnVtYmVyJzogJyR7eyBnaXRodWIuZXZlbnQuaXNzdWUubnVtYmVyIHx8IGdpdGh1Yi5ldmVudC5udW1iZXIgfX0nLFxuICAgICAgICAgICd0ZXN0LWNvbW1hbmQnOiAneWFybnxidW4gY2hlY2stYWxsLWZvci1haScsXG4gICAgICAgIH0sXG4gICAgICAgIHNlY3JldHM6IHtcbiAgICAgICAgICBDTEFVREVfQ09ERV9PQVVUSF9UT0tFTjogJyR7eyBzZWNyZXRzLkNMQVVERV9DT0RFX09BVVRIX1RPS0VOIH19JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ2dlbi1wci1jb2RleCc6IHtcbiAgICBuYW1lOiAnR2VuZXJhdGUgUFIgd2l0aCBDb2RleCBDTEknLFxuICAgIG9uOiB7XG4gICAgICBpc3N1ZXM6IHtcbiAgICAgICAgdHlwZXM6IFsnbGFiZWxlZCddLFxuICAgICAgfSxcbiAgICAgIHB1bGxfcmVxdWVzdDoge1xuICAgICAgICB0eXBlczogWydsYWJlbGVkJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ2dlbi1wcic6IHtcbiAgICAgICAgaWY6IFwiY29udGFpbnMoZ2l0aHViLmV2ZW50LmxhYmVsLm5hbWUsICdnZW4tcHItYWxsJykgfHwgY29udGFpbnMoZ2l0aHViLmV2ZW50LmxhYmVsLm5hbWUsICdnZW4tcHItY29kZXgnKVwiLFxuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL2dlbi1wci55bWxAbWFpbicsXG4gICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAnY29kaW5nLXRvb2wnOiAnY29kZXgtY2xpJyxcbiAgICAgICAgICAnaXNzdWUtbnVtYmVyJzogJyR7eyBnaXRodWIuZXZlbnQuaXNzdWUubnVtYmVyIHx8IGdpdGh1Yi5ldmVudC5udW1iZXIgfX0nLFxuICAgICAgICAgICd0ZXN0LWNvbW1hbmQnOiAneWFybnxidW4gY2hlY2stYWxsLWZvci1haScsXG4gICAgICAgIH0sXG4gICAgICAgIHNlY3JldHM6IHtcbiAgICAgICAgICBPUEVOQUlfQVBJX0tFWTogJyR7eyBzZWNyZXRzLk9QRU5BSV9BUElfS0VZIH19JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ2dlbi1wci1nZW1pbmknOiB7XG4gICAgbmFtZTogJ0dlbmVyYXRlIFBSIHdpdGggR2VtaW5pIENMSScsXG4gICAgb246IHtcbiAgICAgIGlzc3Vlczoge1xuICAgICAgICB0eXBlczogWydsYWJlbGVkJ10sXG4gICAgICB9LFxuICAgICAgcHVsbF9yZXF1ZXN0OiB7XG4gICAgICAgIHR5cGVzOiBbJ2xhYmVsZWQnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnZ2VuLXByJzoge1xuICAgICAgICBpZjogXCJjb250YWlucyhnaXRodWIuZXZlbnQubGFiZWwubmFtZSwgJ2dlbi1wci1hbGwnKSB8fCBjb250YWlucyhnaXRodWIuZXZlbnQubGFiZWwubmFtZSwgJ2dlbi1wci1nZW1pbmknKVwiLFxuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL2dlbi1wci55bWxAbWFpbicsXG4gICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAnY29kaW5nLXRvb2wnOiAnZ2VtaW5pLWNsaScsXG4gICAgICAgICAgJ2lzc3VlLW51bWJlcic6ICcke3sgZ2l0aHViLmV2ZW50Lmlzc3VlLm51bWJlciB8fCBnaXRodWIuZXZlbnQubnVtYmVyIH19JyxcbiAgICAgICAgICAndGVzdC1jb21tYW5kJzogJ3lhcm58YnVuIGNoZWNrLWFsbC1mb3ItYWknLFxuICAgICAgICB9LFxuICAgICAgICBzZWNyZXRzOiB7XG4gICAgICAgICAgR0VNSU5JX0FQSV9LRVk6ICcke3sgc2VjcmV0cy5HRU1JTklfQVBJX0tFWSB9fScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG59IGFzIGNvbnN0O1xuXG50eXBlIEtub3duS2luZCA9IGtleW9mIHR5cGVvZiB3b3JrZmxvd3MgfCAnZGVwbG95JyB8ICdhdXRvZml4JztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlV29ya2Zsb3dzKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVdvcmtmbG93JywgYXN5bmMgKCkgPT4ge1xuICAgIGlmIChpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyhyb290Q29uZmlnLnJlcG9zaXRvcnkpKSB7XG4gICAgICAvLyBEb24ndCB0b3VjaCByZXVzYWJsZS13b3JrZmxvd3MgcmVwbyBiZWNhdXNlIGl0IGhvc3RzIHVwc3RyZWFtIHdvcmtmbG93IGRlZmluaXRpb25zLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHdvcmtmbG93c1BhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicsICd3b3JrZmxvd3MnKTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2Rpcih3b3JrZmxvd3NQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIC8vIFJlbW92ZSBjb25maWcgb2Ygc2VtYW50aWMgcHVsbCByZXF1ZXN0XG4gICAgY29uc3Qgc2VtYW50aWNZbWxQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5naXRodWInLCAnc2VtYW50aWMueW1sJyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHNlbWFudGljWW1sUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pKTtcblxuICAgIGNvbnN0IGVudHJpZXMgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKHdvcmtmbG93c1BhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICBjb25zdCBmaWxlTmFtZVNldCA9IG5ldyBTZXQoW1xuICAgICAgJ3Rlc3QueW1sJyxcbiAgICAgICdhdXRvZml4LnltbCcsXG4gICAgICAnc2VtYW50aWMtcHIueW1sJyxcbiAgICAgICdjbG9zZS1jb21tZW50LnltbCcsXG4gICAgICAnZ2VuLXByLWNsYXVkZS55bWwnLFxuICAgICAgJ2dlbi1wci1jb2RleC55bWwnLFxuICAgICAgJ2dlbi1wci1nZW1pbmkueW1sJyxcbiAgICAgIC4uLmVudHJpZXMuZmlsdGVyKChkaXJlbnQpID0+IGRpcmVudC5pc0ZpbGUoKSAmJiBkaXJlbnQubmFtZS5lbmRzV2l0aCgnLnltbCcpKS5tYXAoKGRpcmVudCkgPT4gZGlyZW50Lm5hbWUpLFxuICAgIF0pO1xuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5zZW1hbnRpY1JlbGVhc2UpIHtcbiAgICAgIGZpbGVOYW1lU2V0LmFkZCgncmVsZWFzZS55bWwnKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGZpbGVOYW1lIG9mIGZpbGVOYW1lU2V0KSB7XG4gICAgICAvLyDlrp/pmpvjga9Lbm93bktpbmTku6XlpJbjga7lgKTjgoLku6PlhaXjgZXjgozjgovjgZPjgajjgavms6jmhI9cbiAgICAgIGNvbnN0IGtpbmQgPSBwYXRoLmJhc2VuYW1lKGZpbGVOYW1lLCAnLnltbCcpIGFzIEtub3duS2luZDtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiB3cml0ZVdvcmtmbG93WWFtbChyb290Q29uZmlnLCB3b3JrZmxvd3NQYXRoLCBraW5kKSk7XG4gICAgfVxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHJlcG9zaXRvcnk/OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHJlcG9zaXRvcnk/LmVuZHNXaXRoKCcvcmV1c2FibGUtd29ya2Zsb3dzJykgPz8gZmFsc2U7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlV29ya2Zsb3dZYW1sKGNvbmZpZzogUGFja2FnZUNvbmZpZywgd29ya2Zsb3dzUGF0aDogc3RyaW5nLCBraW5kOiBLbm93bktpbmQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgYCR7a2luZH0ueW1sYCk7XG4gIGNvbnN0IGRlcGxveVByb2R1Y3Rpb25Xb3JrZmxvd0V4aXN0cyA9IGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsICdkZXBsb3ktcHJvZHVjdGlvbi55bWwnKSk7XG5cbiAgaWYgKGtpbmQgPT09ICdhdXRvZml4Jykge1xuICAgIGF3YWl0IHdyaXRlWWFtbChnZW5lcmF0ZUF1dG9maXhXb3JrZmxvdyhjb25maWcpLCBmaWxlUGF0aCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGV0IG5ld1NldHRpbmdzID0gY2xvbmVEZWVwKGtpbmQgaW4gd29ya2Zsb3dzID8gd29ya2Zsb3dzW2tpbmQgYXMga2V5b2YgdHlwZW9mIHdvcmtmbG93c10gOiB7fSkgYXMgV29ya2Zsb3c7XG4gIC8vIFNraXAgYSBicm9rZW4gd29ya2Zsb3dcbiAgaWYgKCEoJ2pvYnMnIGluIG5ld1NldHRpbmdzKSkgcmV0dXJuO1xuXG4gIHRyeSB7XG4gICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgIGNvbnN0IG9sZFNldHRpbmdzID0geWFtbC5sb2FkKG9sZENvbnRlbnQpIGFzIFdvcmtmbG93O1xuICAgIG5ld1NldHRpbmdzID0gbWVyZ2UuYWxsKFtuZXdTZXR0aW5ncywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzXSwgeyBhcnJheU1lcmdlOiBjb21iaW5lTWVyZ2UgfSkgYXMgV29ya2Zsb3c7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxuXG4gIGlmIChraW5kLnN0YXJ0c1dpdGgoJ2RlcGxveScpKSB7XG4gICAgbmV3U2V0dGluZ3MgPSB7XG4gICAgICAuLi5uZXdTZXR0aW5ncyxcbiAgICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fScsXG4gICAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgfTtcbiAgICAvLyBNb3ZlIGpvYnMgdG8gdGhlIGJvdHRvbVxuICAgIG1vdmVUb0JvdHRvbShuZXdTZXR0aW5ncywgJ2pvYnMnKTtcbiAgICBpZiAobmV3U2V0dGluZ3Mub24/LnB1c2gpIHtcbiAgICAgIG5ld1NldHRpbmdzLm9uLnB1c2hbJ3BhdGhzLWlnbm9yZSddID0gW1xuICAgICAgICAuLi5uZXcgU2V0KFsnKioubWQnLCAnKiovZG9jcy8qKicsIC4uLihuZXdTZXR0aW5ncy5vbi5wdXNoWydwYXRocy1pZ25vcmUnXSA/PyBbXSldKSxcbiAgICAgIF07XG4gICAgfVxuICB9XG5cbiAgaWYgKGtpbmQgPT09ICdyZWxlYXNlJyAmJiBuZXdTZXR0aW5ncy5qb2JzLnJlbGVhc2UgJiYgZGVwbG95UHJvZHVjdGlvbldvcmtmbG93RXhpc3RzKSB7XG4gICAgbmV3U2V0dGluZ3MucGVybWlzc2lvbnMgPz89IHt9O1xuICAgIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zLmFjdGlvbnMgPSAnd3JpdGUnO1xuICAgIG5ld1NldHRpbmdzLmpvYnMucmVsZWFzZS53aXRoID8/PSB7fTtcbiAgICBuZXdTZXR0aW5ncy5qb2JzLnJlbGVhc2Uud2l0aC50cmlnZ2VyX2RlcGxveV93b3JrZmxvdyA9ICdkZXBsb3ktcHJvZHVjdGlvbi55bWwnO1xuICB9XG5cbiAgbGV0IGlzUmV1c2FibGVXb3JrZmxvdyA9IGZhbHNlO1xuICBmb3IgKGNvbnN0IGpvYiBvZiBPYmplY3QudmFsdWVzKG5ld1NldHRpbmdzLmpvYnMpKSB7XG4gICAgLy8gSWdub3JlIG5vbi1yZXVzYWJsZSB3b3JrZmxvd3NcbiAgICBpZiAoIWpvYi51c2VzPy5pbmNsdWRlcygnL3JldXNhYmxlLXdvcmtmbG93cy8nKSkgY29udGludWU7XG5cbiAgICBub3JtYWxpemVKb2IoY29uZmlnLCBqb2IsIGtpbmQpO1xuICAgIGlzUmV1c2FibGVXb3JrZmxvdyA9IHRydWU7XG4gIH1cbiAgaWYgKCFpc1JldXNhYmxlV29ya2Zsb3cpIHJldHVybjtcblxuICBzd2l0Y2ggKGtpbmQpIHtcbiAgICBjYXNlICdyZWxlYXNlJzoge1xuICAgICAgaWYgKG5ld1NldHRpbmdzLm9uPy5zY2hlZHVsZSkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3Mub24ucHVzaDtcbiAgICAgIH0gZWxzZSBpZiAobmV3U2V0dGluZ3Mub24/LnB1c2ggJiYgY29uZmlnLnJlbGVhc2UuYnJhbmNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBuZXdTZXR0aW5ncy5vbi5wdXNoLmJyYW5jaGVzID0gY29uZmlnLnJlbGVhc2UuYnJhbmNoZXM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBEb24ndCB1c2UgcmVsZWFzZS55bWwgaWYgcmVsZWFzZSBicmFuY2ggaXMgbm90IHNwZWNpZmllZFxuICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgJ3JlbGVhc2UueW1sJyksIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuaXNQdWJsaWNSZXBvKSB7XG4gICAgICAgIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zID8/PSB7fTtcbiAgICAgICAgbmV3U2V0dGluZ3MucGVybWlzc2lvbnNbJ2lkLXRva2VuJ10gPSAnd3JpdGUnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zPy5bJ2lkLXRva2VuJ107XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSAndGVzdCc6IHtcbiAgICAgIC8vIERvbid0IHVzZSBgcGF0aHMtaWdub3JlYCBmb3IgdGVzdCBiZWNhdXNlIEdpdEh1YidzIEJyYW5jaCBQcm90ZWN0aW9uIGFuZCBSdWxlc2V0cyByZXF1aXJlIGpvYiBydW5uaW5nLlxuICAgICAgaWYgKG5ld1NldHRpbmdzLm9uPy5wdWxsX3JlcXVlc3QpIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLm9uLnB1bGxfcmVxdWVzdFsncGF0aHMtaWdub3JlJ107XG4gICAgICB9XG4gICAgICBpZiAobmV3U2V0dGluZ3Mub24/LnB1c2gpIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLm9uLnB1c2hbJ3BhdGhzLWlnbm9yZSddO1xuICAgICAgICBuZXdTZXR0aW5ncy5vbi5wdXNoLmJyYW5jaGVzID0gbmV3U2V0dGluZ3Mub24ucHVzaC5icmFuY2hlcy5maWx0ZXIoKGJyYW5jaCkgPT4gYnJhbmNoICE9PSAncmVub3ZhdGUvKionKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICAvLyBObyBkZWZhdWx0XG4gIH1cbiAgYXdhaXQgd3JpdGVZYW1sKG5ld1NldHRpbmdzLCBmaWxlUGF0aCk7XG5cbiAgaWYgKGtpbmQgPT09ICdzeW5jJykge1xuICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAnc3luYy1pbml0LnltbCcpLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgIGlmICghbmV3U2V0dGluZ3Muam9icy5zeW5jPy53aXRoKSByZXR1cm47XG5cbiAgICAvLyBHZW5lcmF0ZSBzeW5jLWZvcmNlLnltbCBiYXNlZCBvbiBzeW5jLnltbCBpZiBpdCBleGlzdHMuXG4gICAgbmV3U2V0dGluZ3Muam9ic1snc3luYy1mb3JjZSddID0gbmV3U2V0dGluZ3Muam9icy5zeW5jO1xuICAgIGNvbnN0IHBhcmFtcyA9IG5ld1NldHRpbmdzLmpvYnMuc3luYy53aXRoLnN5bmNfcGFyYW1zX3dpdGhvdXRfZGVzdDtcbiAgICBpZiAodHlwZW9mIHBhcmFtcyAhPT0gJ3N0cmluZycpIHJldHVybjtcblxuICAgIG5ld1NldHRpbmdzLmpvYnMuc3luYy53aXRoLnN5bmNfcGFyYW1zX3dpdGhvdXRfZGVzdCA9IGAtLWZvcmNlICR7cGFyYW1zfWA7XG4gICAgbmV3U2V0dGluZ3MubmFtZSA9ICdGb3JjZSB0byBTeW5jJztcbiAgICBuZXdTZXR0aW5ncy5vbiA9IHsgd29ya2Zsb3dfZGlzcGF0Y2g6IG51bGwgfTtcbiAgICBkZWxldGUgbmV3U2V0dGluZ3Muam9icy5zeW5jO1xuICAgIGF3YWl0IHdyaXRlWWFtbChuZXdTZXR0aW5ncywgcGF0aC5qb2luKHdvcmtmbG93c1BhdGgsICdzeW5jLWZvcmNlLnltbCcpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVKb2IoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBqb2I6IEpvYiwga2luZDogS25vd25LaW5kKTogdm9pZCB7XG4gIGpvYi53aXRoID8/PSB7fTtcbiAgam9iLnNlY3JldHMgPz89IHt9O1xuICAvLyBVc2UgdHJ1c3RlZCBwdWJsaXNoaW5nIGluc3RlYWQgb2YgTlBNX1RPS0VOXG4gIGRlbGV0ZSBqb2Iuc2VjcmV0cy5OUE1fVE9LRU47XG5cbiAgaWYgKFxuICAgIGtpbmQgPT09ICd0ZXN0JyB8fFxuICAgIGtpbmQgPT09ICdyZWxlYXNlJyB8fFxuICAgIGtpbmQgPT09ICdnZW4tcHItY2xhdWRlJyB8fFxuICAgIGtpbmQgPT09ICdnZW4tcHItY29kZXgnIHx8XG4gICAga2luZCA9PT0gJ2dlbi1wci1nZW1pbmknXG4gICkge1xuICAgIGpvYi5zZWNyZXRzLkdIX1RPS0VOID0gJyR7eyBzZWNyZXRzLkdJVEhVQl9UT0tFTiB9fSc7XG4gIH1cblxuICAvLyBTZXQgdGVzdC1jb21tYW5kIGZvciBnZW4tcHIgd29ya2Zsb3dzIGJhc2VkIG9uIHBhY2thZ2UgbWFuYWdlclxuICBpZiAoa2luZCA9PT0gJ2dlbi1wci1jbGF1ZGUnIHx8IGtpbmQgPT09ICdnZW4tcHItY29kZXgnIHx8IGtpbmQgPT09ICdnZW4tcHItZ2VtaW5pJykge1xuICAgIGpvYi53aXRoWyd0ZXN0LWNvbW1hbmQnXSA9IGNvbmZpZy5pc0J1biA/ICdidW4gcnVuIGNoZWNrLWFsbC1mb3ItYWknIDogJ3lhcm4gY2hlY2stYWxsLWZvci1haSc7XG4gIH1cbiAgaWYgKGpvYi5zZWNyZXRzLkZJUkVCQVNFX1RPS0VOKSB7XG4gICAgam9iLnNlY3JldHMuR0NQX1NBX0tFWV9KU09OX0ZPUl9GSVJFQkFTRSA9ICcke3sgc2VjcmV0cy5HQ1BfU0FfS0VZX0pTT05fRk9SX0ZJUkVCQVNFIH19JztcbiAgICBkZWxldGUgam9iLnNlY3JldHMuRklSRUJBU0VfVE9LRU47XG4gIH1cbiAgaWYgKFxuICAgIChqb2Iuc2VjcmV0cy5ESVNDT1JEX1dFQkhPT0tfVVJMICYmIChraW5kID09PSAncmVsZWFzZScgfHwga2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSkpIHx8XG4gICAgKGpvYi53aXRoLnNlcnZlcl91cmwgJiYga2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSlcbiAgKSB7XG4gICAgam9iLnNlY3JldHMuRElTQ09SRF9XRUJIT09LX1VSTCA9ICcke3sgc2VjcmV0cy5ESVNDT1JEX1dFQkhPT0tfVVJMX0ZPUl9SRUxFQVNFIH19JztcbiAgfVxuXG4gIGlmIChraW5kID09PSAnc3luYycpIHtcbiAgICBjb25zdCBwYXJhbXMgPSBqb2Iud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3Q7XG4gICAgaWYgKHR5cGVvZiBwYXJhbXMgPT09ICdzdHJpbmcnKSB7XG4gICAgICBqb2Iud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3QgPSBwYXJhbXMucmVwbGFjZSgnc3luYyAnLCAnJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXIvJykpIHtcbiAgICBqb2IudXNlcyA9IGpvYi51c2VzPy5yZXBsYWNlKCdXaWxsQm9vc3RlckxhYi8nLCAnV2lsbEJvb3N0ZXIvJyk7XG4gIH0gZWxzZSBpZiAoY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKSkge1xuICAgIGpvYi51c2VzID0gam9iLnVzZXM/LnJlcGxhY2UoJ1dpbGxCb29zdGVyLycsICdXaWxsQm9vc3RlckxhYi8nKTtcbiAgfVxuXG4gIC8vIFJlbW92ZSByZWR1bmRhbnQgcGFyYW1ldGVyc1xuICBpZiAoam9iLndpdGguZG90X2Vudl9wYXRoID09PSAnLmVudicpIHtcbiAgICBkZWxldGUgam9iLndpdGguZG90X2Vudl9wYXRoO1xuICB9XG5cbiAgLy8gRG9uJ3QgdXNlIGBmbHkgZGVwbG95IC0tanNvbmAgc2luY2UgaXQgY2F1c2VzIGFuIGVycm9yXG4gIGlmIChraW5kLnN0YXJ0c1dpdGgoJ2RlcGxveScpICYmIGpvYi5zZWNyZXRzLkZMWV9BUElfVE9LRU4gJiYgdHlwZW9mIGpvYi53aXRoLmRlcGxveV9jb21tYW5kID09PSAnc3RyaW5nJykge1xuICAgIGpvYi53aXRoLmRlcGxveV9jb21tYW5kID0gam9iLndpdGguZGVwbG95X2NvbW1hbmQucmVwbGFjZSgvXFxzKy0tanNvbi8sICcnKTtcbiAgfVxuICBpZiAoY29uZmlnLmRvZXNDb250YWluRG9ja2VyZmlsZSAmJiAham9iLndpdGguY2lfbGFiZWwgJiYga2luZC5zdGFydHNXaXRoKCd0ZXN0JykpIHtcbiAgICBqb2Iud2l0aC5jaV9sYWJlbCA9ICdsYXJnZSc7XG4gIH1cbiAgLy8gQmVjYXVzZSBnaXRodWIuZXZlbnQucmVwb3NpdG9yeS5wcml2YXRlIGlzIGFsd2F5cyB0cnVlIGlmIGpvYiBpcyBzY2hlZHVsZWRcbiAgaWYgKGtpbmQgPT09ICdyZWxlYXNlJyB8fCBraW5kID09PSAndGVzdCcgfHwga2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSkge1xuICAgIGlmIChjb25maWcuaXNQdWJsaWNSZXBvKSB7XG4gICAgICBqb2Iud2l0aC5naXRodWJfaG9zdGVkX3J1bm5lciA9IHRydWU7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGRlbGV0ZSBqb2Iud2l0aC5naXRodWJfaG9zdGVkX3J1bm5lcjtcbiAgfVxuXG4gIGlmIChPYmplY3Qua2V5cyhqb2Iud2l0aCkubGVuZ3RoID4gMCkge1xuICAgIHNvcnRLZXlzKGpvYi53aXRoKTtcbiAgfSBlbHNlIHtcbiAgICBkZWxldGUgam9iLndpdGg7XG4gIH1cbiAgaWYgKE9iamVjdC5rZXlzKGpvYi5zZWNyZXRzKS5sZW5ndGggPiAwKSB7XG4gICAgLy8gTW92ZSBzZWNyZXRzIHByb3AgYWZ0ZXIgd2l0aCBwcm9wXG4gICAgY29uc3QgbmV3U2VjcmV0cyA9IHNvcnRLZXlzKGpvYi5zZWNyZXRzKTtcbiAgICBkZWxldGUgam9iLnNlY3JldHM7XG4gICAgam9iLnNlY3JldHMgPSBuZXdTZWNyZXRzO1xuICB9IGVsc2Uge1xuICAgIGRlbGV0ZSBqb2Iuc2VjcmV0cztcbiAgfVxufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUF1dG9maXhXb3JrZmxvdyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBXb3JrZmxvdyB7XG4gIGlmICghY29uZmlnLmlzUHVibGljUmVwbykge1xuICAgIHJldHVybiBjbG9uZURlZXAocHJpdmF0ZVJlcG9BdXRvZml4V29ya2Zsb3cpO1xuICB9XG5cbiAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSBjb25maWcuaXNCdW4gPyAnYnVuJyA6ICd5YXJuJztcbiAgY29uc3Qgc3RlcHM6IFN0ZXBbXSA9IFtcbiAgICB7IHVzZXM6ICdhY3Rpb25zL2NoZWNrb3V0QHY2JyB9LFxuICAgIHsgdXNlczogJ2FjdGlvbnMvc2V0dXAtbm9kZUB2NicsIHdpdGg6IHsgJ2NoZWNrLWxhdGVzdCc6IHRydWUgfSB9LFxuICAgIC4uLihjb25maWcuaXNCdW4gPyBbeyB1c2VzOiAnb3Zlbi1zaC9zZXR1cC1idW5AdjEnLCB3aXRoOiB7ICdidW4tdmVyc2lvbic6ICdsYXRlc3QnIH0gfV0gOiBbXSksXG4gICAgeyBydW46IGAke3BhY2thZ2VNYW5hZ2VyfSBpbnN0YWxsYCB9LFxuICAgIHsgcnVuOiBgJHtwYWNrYWdlTWFuYWdlcn0gcnVuIGNsZWFudXBgIH0sXG4gIF07XG4gIGlmIChjb25maWcucGFja2FnZUpzb24/LnNjcmlwdHM/LmJ1aWxkKSB7XG4gICAgc3RlcHMucHVzaCh7IHJ1bjogYCR7cGFja2FnZU1hbmFnZXJ9IHJ1biBidWlsZGAgfSk7XG4gIH1cbiAgc3RlcHMucHVzaCh7IHVzZXM6ICdhdXRvZml4LWNpL2FjdGlvbkB2MScgfSk7XG5cbiAgY29uc3QgYXV0b2ZpeFdvcmtmbG93ID0gY2xvbmVEZWVwKHB1YmxpY1JlcG9BdXRvZml4V29ya2Zsb3cpO1xuICBjb25zdCBhdXRvZml4Sm9iID0gYXV0b2ZpeFdvcmtmbG93LmpvYnMuYXV0b2ZpeCA/PyB7ICdydW5zLW9uJzogJ3VidW50dS1sYXRlc3QnIH07XG4gIGF1dG9maXhXb3JrZmxvdy5qb2JzLmF1dG9maXggPSB7IC4uLmF1dG9maXhKb2IsIHN0ZXBzIH07XG4gIHJldHVybiBhdXRvZml4V29ya2Zsb3c7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlWWFtbChuZXdTZXR0aW5nczogV29ya2Zsb3csIGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeWFtbFRleHQgPSB5YW1sLmR1bXAobmV3U2V0dGluZ3MsIHsgbGluZVdpZHRoOiAtMSwgbm9Db21wYXRNb2RlOiB0cnVlLCBzdHlsZXM6IHsgJyEhbnVsbCc6ICdlbXB0eScgfSB9KTtcbiAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGZpbGVQYXRoLCB5YW1sVGV4dCk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcblxuaW1wb3J0IHsgaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8gfSBmcm9tICcuLi9nZW5lcmF0b3JzL3dvcmtmbG93LmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBnbG9iSWdub3JlIH0gZnJvbSAnLi4vdXRpbHMvZ2xvYlV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhUeXBvcyhwYWNrYWdlQ29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4VHlwb3MnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHBhY2thZ2VDb25maWcucmVwb3NpdG9yeSkpIHJldHVybjtcblxuICAgIGNvbnN0IGRpclBhdGggPSBwYWNrYWdlQ29uZmlnLmRpclBhdGg7XG4gICAgY29uc3QgZG9jRmlsZXMgPSBhd2FpdCBmZy5nbG9iKCcqKi8qLm1kJywgeyBkb3Q6IHRydWUsIGN3ZDogZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH0pO1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBGb3VuZCAke2RvY0ZpbGVzLmxlbmd0aH0gbWFya2Rvd24gZmlsZXMgaW4gJHtkaXJQYXRofWApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IG1kRmlsZSBvZiBkb2NGaWxlcykge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgbWRGaWxlKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bihhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgICAgbGV0IG5ld0NvbnRlbnQgPSBmaXhUeXBvc0luVGV4dChjb250ZW50KTtcbiAgICAgICAgbmV3Q29udGVudCA9IHJlcGxhY2VXaXRoQ29uZmlnKG5ld0NvbnRlbnQsIHBhY2thZ2VDb25maWcsICdkb2MnKTtcbiAgICAgICAgaWYgKGNvbnRlbnQgIT09IG5ld0NvbnRlbnQpIHtcbiAgICAgICAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgdHNGaWxlcyA9IGF3YWl0IGZnLmdsb2IoXG4gICAgICBbXG4gICAgICAgICd7YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4LGN0cyxtdHMsdHMsdHN4fScsXG4gICAgICAgICdwYWNrYWdlcy8qKi97YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4LGN0cyxtdHMsdHMsdHN4fScsXG4gICAgICBdLFxuICAgICAgeyBkb3Q6IHRydWUsIGN3ZDogZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH1cbiAgICApO1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBGb3VuZCAke3RzRmlsZXMubGVuZ3RofSBUeXBlU2NyaXB0IGZpbGVzIGluICR7ZGlyUGF0aH1gKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCB0c0ZpbGUgb2YgdHNGaWxlcykge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgdHNGaWxlKTtcbiAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGxldCBuZXdDb250ZW50ID0gZml4VHlwb3NJbkNvZGUob2xkQ29udGVudCk7XG4gICAgICBuZXdDb250ZW50ID0gcmVwbGFjZVdpdGhDb25maWcobmV3Q29udGVudCwgcGFja2FnZUNvbmZpZywgJ3RzJyk7XG5cbiAgICAgIGlmIChvbGRDb250ZW50ID09PSBuZXdDb250ZW50KSBjb250aW51ZTtcbiAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgIH1cblxuICAgIGNvbnN0IHRleHRCYXNlZEZpbGVzID0gYXdhaXQgZmcuZ2xvYignKiovKi57Y3N2LGh0bSxodG1sLHRzdix4bWwseWFtbCx5bWx9Jywge1xuICAgICAgZG90OiB0cnVlLFxuICAgICAgY3dkOiBkaXJQYXRoLFxuICAgICAgaWdub3JlOiBnbG9iSWdub3JlLFxuICAgIH0pO1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBGb3VuZCAke3RleHRCYXNlZEZpbGVzLmxlbmd0aH0gdGV4dC1iYXNlZCBmaWxlcyBpbiAke2RpclBhdGh9YCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgZmlsZSBvZiB0ZXh0QmFzZWRGaWxlcykge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgZmlsZSk7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBsZXQgbmV3Q29udGVudCA9IGZpeFR5cG9zSW5UZXh0KG9sZENvbnRlbnQpO1xuICAgICAgbmV3Q29udGVudCA9IHJlcGxhY2VXaXRoQ29uZmlnKG5ld0NvbnRlbnQsIHBhY2thZ2VDb25maWcsICd0ZXh0Jyk7XG5cbiAgICAgIGlmIChvbGRDb250ZW50ID09PSBuZXdDb250ZW50KSBjb250aW51ZTtcbiAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgIH1cblxuICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaXhUeXBvc0luVGV4dChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gY29udGVudFxuICAgIC5yZXBsYWNlQWxsKC9cXGJjXFwuZlxcLihbXiRdKS9nLCAnY2YuJDEnKVxuICAgIC5yZXBsYWNlQWxsKC9cXGJlZ1xcLihbXiRdKS9nLCAnZS5nLiQxJylcbiAgICAucmVwbGFjZUFsbCgvXFxiaWVcXC4oW14kXSkvZywgJ2kuZS4kMScpO1xufVxuXG5mdW5jdGlvbiBmaXhUeXBvc0luQ29kZShjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gY29udGVudFxuICAgIC5yZXBsYWNlQWxsKC9cXC9cXC8oLiopY1xcLmZcXC4vZywgJy8vJDFjZi4nKVxuICAgIC5yZXBsYWNlQWxsKC9cXC9cXC8oLiopZWdcXC4vZywgJy8vJDFlLmcuJylcbiAgICAucmVwbGFjZUFsbCgvXFwvXFwvKC4qKWllXFwuL2csICcvLyQxaS5lLicpO1xufVxuXG5mdW5jdGlvbiByZXBsYWNlV2l0aENvbmZpZyhuZXdDb250ZW50OiBzdHJpbmcsIHBhY2thZ2VDb25maWc6IFBhY2thZ2VDb25maWcsIHByb3BOYW1lOiAnZG9jJyB8ICd0cycgfCAndGV4dCcpOiBzdHJpbmcge1xuICBmb3IgKGNvbnN0IFtiZWZvcmUsIGFmdGVyXSBvZiBPYmplY3QuZW50cmllcyhwYWNrYWdlQ29uZmlnLndiZnlKc29uPy50eXBvcz8uYWxsID8/IHt9KSkge1xuICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2VBbGwoYmVmb3JlLCBhZnRlcik7XG4gIH1cbiAgZm9yIChjb25zdCBbYmVmb3JlLCBhZnRlcl0gb2YgT2JqZWN0LmVudHJpZXMocGFja2FnZUNvbmZpZy53YmZ5SnNvbj8udHlwb3M/Lltwcm9wTmFtZV0gPz8ge30pKSB7XG4gICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZUFsbChiZWZvcmUsIGFmdGVyKTtcbiAgfVxuICByZXR1cm4gbmV3Q29udGVudDtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbnMocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZywgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIXJvb3RDb25maWcuaXNSb290KSByZXR1cm47XG5cbiAgICAvLyBDaGVjayBpZiBBR0VOVFNfRVhUUkEubWQgZXhpc3RzIGFuZCByZWFkIGl0cyBjb250ZW50XG4gICAgY29uc3QgYWdlbnRzRXh0cmFQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJ0FHRU5UU19FWFRSQS5tZCcpO1xuICAgIGNvbnN0IGV4dHJhQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoYWdlbnRzRXh0cmFQYXRoKTtcblxuICAgIGZvciAoY29uc3QgW2ZpbGVOYW1lLCB0b29sTmFtZV0gb2YgW1xuICAgICAgWydBR0VOVFMubWQnLCAnQ29kZXggQ0xJJ10sXG4gICAgICBbJ0NMQVVERS5tZCcsICdDbGF1ZGUgQ29kZSddLFxuICAgICAgWydHRU1JTkkubWQnLCAnR2VtaW5pIENMSSddLFxuICAgIF0gYXMgY29uc3QpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb24ocm9vdENvbmZpZywgYWxsQ29uZmlncywgdG9vbE5hbWUsIGV4dHJhQ29udGVudCk7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsIGZpbGVOYW1lKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb250ZW50KSk7XG4gICAgfVxuXG4gICAgY29uc3QgY3Vyc29yUnVsZXNQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5jdXJzb3IvcnVsZXMvZ2VuZXJhbC5tZGMnKTtcbiAgICBjb25zdCBjdXJzb3JSdWxlc0NvbnRlbnQgPSBnZW5lcmF0ZUN1cnNvckdlbmVyYWxNZGNDb250ZW50KHJvb3RDb25maWcsIGFsbENvbmZpZ3MsIGV4dHJhQ29udGVudCk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoY3Vyc29yUnVsZXNQYXRoLCBjdXJzb3JSdWxlc0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbihcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdLFxuICB0b29sTmFtZTogc3RyaW5nLFxuICBleHRyYUNvbnRlbnQ/OiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gcm9vdENvbmZpZy5pc0J1biA/ICdidW4nIDogJ3lhcm4nO1xuICBjb25zdCBiYXNlQ29udGVudCA9IGBcbiMjIFByb2plY3QgSW5mb3JtYXRpb25cblxuLSBOYW1lOiBcXGAke3Jvb3RDb25maWcucGFja2FnZUpzb24/Lm5hbWUgfHwgJ3Vua25vd24nfVxcYFxuLSBEZXNjcmlwdGlvbjogJHtyb290Q29uZmlnLnBhY2thZ2VKc29uPy5kZXNjcmlwdGlvbn1cbi0gUGFja2FnZSBNYW5hZ2VyOiAke3BhY2thZ2VNYW5hZ2VyfVxuXG4jIyBHZW5lcmFsIEluc3RydWN0aW9uc1xuXG4tIENyZWF0ZSBhIG5ldyBicmFuY2ggaWYgdGhlIGN1cnJlbnQgYnJhbmNoIGlzIFxcYG1haW5cXGAuXG4tIFJ1biBhbnkgXFxgZ2l0XFxgIGNvbW1hbmRzIHNlcXVlbnRpYWxseS5cbi0gV3JpdGUgdGVzdHMgT05MWSBpZiBleHBsaWNpdGx5IHJlcXVlc3RlZC4gSWYgcmVxdWVzdGVkLCBmb2xsb3cgdGhlc2UgcnVsZXM6XG4gIC0gQ29udGludWUgbW9kaWZ5aW5nIHRoZSB0ZXN0cyBhbmQgY29kZSB1bnRpbCBhbGwgdGVzdHMgcGFzcy5cbiAgLSBFbnN1cmUgdGVzdHMgcmVzZXQgYW55IHJlbGF0ZWQgcGVyc2lzdGVudCBkYXRhLCBhcyBvdXIgdGVzdCBpbmZyYXN0cnVjdHVyZSBkb2VzIG5vdCBjbGVhciBpdCBhdXRvbWF0aWNhbGx5LlxuICAtIFByZWZlciBhY3R1YWwgQVBJIGNhbGxzIG92ZXIgbW9ja3MuIFVzZSBtb2NrcyB3aGVuIGFjdHVhbCBjYWxscyBhcmUgaW1wcmFjdGljYWwsIGhhdmUgdW5pbnRlbmRlZCBzaWRlIGVmZmVjdHMsIG9yIGFyZSBleHBsaWNpdGx5IHJlcXVlc3RlZC5cbi0gQmVmb3JlIGZpeGluZyBpc3N1ZXMsIGFsd2F5cyBpbnZlc3RpZ2F0ZSB0aGUgcm9vdCBjYXVzZSBmaXJzdCAoZS5nLiwgYnkgZ2F0aGVyaW5nIGRlYnVnIGxvZ3MsIHRha2luZyBzY3JlZW5zaG90cywgZXRjLikuXG4tIEFmdGVyIG1ha2luZyBjb2RlIGNoYW5nZXMsIHJ1biBcXGAke3BhY2thZ2VNYW5hZ2VyfSBjaGVjay1hbGwtZm9yLWFpXFxgIHRvIGV4ZWN1dGUgYWxsIHRlc3RzICh0YWtlcyB1cCB0byAxIGhvdXIpIG9yIFxcYCR7cGFja2FnZU1hbmFnZXJ9IGNoZWNrLWZvci1haVxcYCBmb3IgdHlwZSBjaGVja2luZyBhbmQgbGludGluZyBvbmx5ICh0YWtlcyB1cCB0byAxMCBtaW51dGVzKS5cbiAgLSBJZiB5b3UgYXJlIGNvbmZpZGVudCB5b3VyIGNoYW5nZXMgd2lsbCBub3QgYnJlYWsgYW55IHRlc3RzLCB5b3UgbWF5IHVzZSBcXGBjaGVjay1mb3ItYWlcXGAuXG4tIE9uY2UgeW91IGhhdmUgdmVyaWZpZWQgeW91ciBjaGFuZ2VzLCBjb21taXQgYW5kIHB1c2ggdGhlbSB0byB0aGUgY3VycmVudCAobm9uLW1haW4pIGJyYW5jaCB0aGVuIGNyZWF0ZSBhIFBSIHZpYSBcXGBnaFxcYC5cbiAgLSBGb2xsb3cgdGhlIGNvbnZlbnRpb25hbCBjb21taXRzOyB5b3VyIGNvbW1pdCBtZXNzYWdlIHNob3VsZCBzdGFydCB3aXRoIFxcYGZlYXQ6XFxgLCBcXGBmaXg6XFxgLCBldGMuXG4gIC0gSWYgbm90IHNwZWNpZmllZCwgbWFrZSBzdXJlIHRvIGFkZCBhIG5ldyBsaW5lIGF0IHRoZSBlbmQgb2YgeW91ciBjb21taXQgbWVzc2FnZSR7cm9vdENvbmZpZy5pc1dpbGxCb29zdGVyUmVwbyA/IGAgd2l0aDogXFxgQ28tYXV0aG9yZWQtYnk6IFdpbGxCb29zdGVyICgke3Rvb2xOYW1lfSkgPGFnZW50QHdpbGxib29zdGVyLmNvbT5cXGBgIDogJyd9LlxuICAtIEFsd2F5cyBjcmVhdGUgbmV3IGNvbW1pdHMuIEF2b2lkIHVzaW5nIFxcYC0tYW1lbmRcXGAuXG4ke1xuICBhbGxDb25maWdzLnNvbWUoKGMpID0+IGMuaGFzU3RhcnRUZXN0U2VydmVyKVxuICAgID8gYC0gVXNlIFxcYCR7cGFja2FnZU1hbmFnZXJ9IHJ1biBzdGFydC10ZXN0LXNlcnZlclxcYCB0byBsYXVuY2ggYSB3ZWIgc2VydmVyIGZvciBkZWJ1Z2dpbmcgb3IgdGVzdGluZy5gXG4gICAgOiAnJ1xufVxuXG4ke2dlbmVyYXRlQWdlbnRDb2RpbmdTdHlsZShhbGxDb25maWdzKX1cbmBcbiAgICAucmVwbGFjZUFsbCgvXFwuXFxuXFxuKy0vZywgJy5cXG4tJylcbiAgICAucmVwbGFjZUFsbCgvXFxuezMsfS9nLCAnXFxuXFxuJylcbiAgICAudHJpbSgpO1xuXG4gIGNvbnN0IGhhc05ld1NlY3Rpb24gPSBleHRyYUNvbnRlbnQ/LnRyaW0oKS5zdGFydHNXaXRoKCcjJyk7XG4gIGNvbnN0IG5vcm1hbGl6ZWRFeHRyYUNvbnRlbnQgPSBleHRyYUNvbnRlbnRcbiAgICA/IGhhc05ld1NlY3Rpb25cbiAgICAgID8gJ1xcblxcbicgKyBleHRyYUNvbnRlbnQudHJpbSgpXG4gICAgICA6ICdcXG4nICsgZXh0cmFDb250ZW50XG4gICAgOiAnJztcbiAgcmV0dXJuIGJhc2VDb250ZW50ICsgbm9ybWFsaXplZEV4dHJhQ29udGVudDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlQWdlbnRDb2RpbmdTdHlsZShhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBzdHJpbmcge1xuICAvLyBLZWVwIHRvcC1kb3duIG9yZGVyaW5nIGd1aWRhbmNlIGZ1bmN0aW9uLW9ubHkgYmVjYXVzZSBjbGFzc2VzIGFyZSBub3QgaG9pc3RlZCBhbmQgY2FuIGZhaWwgd2hlbiBpbmhlcml0YW5jZSBvciB0b3AtbGV2ZWwgaW5zdGFudGlhdGlvbiBkZXBlbmRzIG9uIGRlY2xhcmF0aW9uIG9yZGVyLlxuICByZXR1cm4gYFxuIyMgQ29kaW5nIFN0eWxlXG5cbi0gU2ltcGxpZnkgY29kZSBhcyBtdWNoIGFzIHBvc3NpYmxlIHRvIGVsaW1pbmF0ZSByZWR1bmRhbmN5LlxuLSBEZXNpZ24gZWFjaCBtb2R1bGUgd2l0aCBoaWdoIGNvaGVzaW9uLCBncm91cGluZyByZWxhdGVkIGZ1bmN0aW9uYWxpdHkgdG9nZXRoZXIuXG4gIC0gUmVmYWN0b3IgZXhpc3RpbmcgbGFyZ2UgbW9kdWxlcyBpbnRvIHNtYWxsZXIsIGZvY3VzZWQgbW9kdWxlcyB3aGVuIG5lY2Vzc2FyeS5cbiAgLSBDcmVhdGUgd2VsbC1vcmdhbml6ZWQgZGlyZWN0b3J5IHN0cnVjdHVyZXMgd2l0aCBsb3cgY291cGxpbmcgYW5kIGhpZ2ggY29oZXNpb24uXG4tIFBsYWNlIGNhbGxpbmcgZnVuY3Rpb25zIGluIHRoZSBmaWxlIGFib3ZlIHRoZSBmdW5jdGlvbnMgdGhleSBjYWxsIHRvIG1haW50YWluIGEgY2xlYXIgdG9wLWRvd24gb3JkZXIuXG4gIC0gZS5nLiBcXGBmdW5jdGlvbiBjYWxsZXIoKSB7IGNhbGxlZSgpOyB9IGZ1bmN0aW9uIGNhbGxlZSgpIHsgLi4uIH1cXGBcbi0gV3JpdGUgY29tbWVudHMgdGhhdCBleHBsYWluIFwid2h5XCIgcmF0aGVyIHRoYW4gXCJ3aGF0XCIuIEF2b2lkIHN0YXRpbmcgd2hhdCBjYW4gYmUgdW5kZXJzdG9vZCBmcm9tIHRoZSBjb2RlIGl0c2VsZi5cbi0gUHJlZmVyIFxcYHVuZGVmaW5lZFxcYCBvdmVyIFxcYG51bGxcXGAgdW5sZXNzIGV4cGxpY2l0bHkgcmVxdWlyZWQgYnkgQVBJcyBvciBsaWJyYXJpZXMuXG4tIFByZWZlciB1c2luZyBhIHNpbmdsZSB0ZW1wbGF0ZSBsaXRlcmFsIGZvciBwcm9tcHRzIGluc3RlYWQgb2YgXFxgam9pbigpXFxgIHdpdGggYW4gYXJyYXkgb2Ygc3RyaW5ncy5cbiR7XG4gIGFsbENvbmZpZ3Muc29tZSgoYykgPT4gYy5kZXBlbmRpbmcuZ2VuSTE4blRzKVxuICAgID8gYC0gV2hlbiBpbnRyb2R1Y2luZyBuZXcgc3RyaW5nIGxpdGVyYWxzIGluIFJlYWN0IGNvbXBvbmVudHMsIHVwZGF0ZSB0aGUgbGFuZ3VhZ2UgcmVzb3VyY2UgZmlsZXMgaW4gdGhlIFxcYGkxOG5cXGAgZGlyZWN0b3J5IChlLmcuLCBcXGBpMThuL2phLUpQLmpzb25cXGApLiBSZWZlcmVuY2UgdGhlc2Ugc3RyaW5ncyB1c2luZyB0aGUgXFxgaTE4blxcYCB1dGlsaXR5LiBGb3IgZXhhbXBsZSwgdXNlIFxcYGkxOG4ucGFnZXMuaG9tZS50aXRsZSgpXFxgIGZvciBcXGB7IFwicGFnZXNcIjogeyBcImhvbWVcIjogeyBcInRpdGxlXCI6IFwiTXkgQXBwXCIgfSB9IH1cXGAuYFxuICAgIDogJydcbn1cbiR7XG4gIGFsbENvbmZpZ3Muc29tZSgoYykgPT4gYy5kZXBlbmRpbmcucmVhY3QgfHwgYy5kZXBlbmRpbmcubmV4dClcbiAgICA/IGAtIFByZWZlciBcXGB1c2VJbW1lclxcYCBmb3Igc3RvcmluZyBhbiBhcnJheSBvciBhbiBvYmplY3QgdG8gXFxgdXNlU3RhdGVcXGAuYFxuICAgIDogJydcbn1cbiR7XG4gIGFsbENvbmZpZ3Muc29tZSgoYykgPT4gYy5kZXBlbmRpbmcubmV4dClcbiAgICA/IGBcbi0gU2luY2UgdGhpcyBwcm9qZWN0IHVzZXMgdGhlIFJlYWN0IENvbXBpbGVyLCB5b3UgZG8gbm90IG5lZWQgdG8gdXNlIFxcYHVzZUNhbGxiYWNrXFxgIG9yIFxcYHVzZU1lbW9cXGAgZm9yIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbi5cbi0gQXNzdW1lIHRoZXJlIGlzIG9ubHkgYSBzaW5nbGUgc2VydmVyIGluc3RhbmNlLlxuYFxuICAgIDogJydcbn1cbmBcbiAgICAucmVwbGFjZUFsbCgvXFwuXFxuXFxuKy0vZywgJy5cXG4tJylcbiAgICAucmVwbGFjZUFsbCgvXFxuezMsfS9nLCAnXFxuXFxuJylcbiAgICAudHJpbSgpO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUN1cnNvckdlbmVyYWxNZGNDb250ZW50KFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSxcbiAgZXh0cmFDb250ZW50Pzogc3RyaW5nXG4pOiBzdHJpbmcge1xuICBjb25zdCBmcm9udG1hdHRlciA9IGAtLS1cXG5kZXNjcmlwdGlvbjogR2VuZXJhbCBDb2RpbmcgUnVsZXNcXG5nbG9iczpcXG5hbHdheXNBcHBseTogdHJ1ZVxcbi0tLWA7XG4gIGNvbnN0IGJvZHkgPSBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb24oY29uZmlnLCBhbGxDb25maWdzLCAnQ3Vyc29yJywgZXh0cmFDb250ZW50KTtcbiAgcmV0dXJuIGAke2Zyb250bWF0dGVyfVxcblxcbiR7Ym9keX1gO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQmlvbWVKc29uYyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUJpb21lSnNvbmMnLCBhc3luYyAoKSA9PiB7XG4gICAgbGV0IG5ld1NldHRpbmdzOiBvYmplY3QgPSB7XG4gICAgICByb290OiBjb25maWcuaXNSb290LFxuICAgICAgJHNjaGVtYTogJy4vbm9kZV9tb2R1bGVzL0BiaW9tZWpzL2Jpb21lL2NvbmZpZ3VyYXRpb25fc2NoZW1hLmpzb24nLFxuICAgICAgZXh0ZW5kczogWydAd2lsbGJvb3N0ZXIvYmlvbWUtY29uZmlnJ10sXG4gICAgfTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2Jpb21lLmpzb25jJyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG9sZFNldHRpbmdzID0gSlNPTi5wYXJzZShvbGRDb250ZW50KSBhcyBvYmplY3Q7XG4gICAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShuZXdTZXR0aW5ncyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBwYXJzZSB9IGZyb20gJ3Ntb2wtdG9tbCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW50ZXJmYWNlIEJ1bmZpZ1RvbWwge1xuICBpbnN0YWxsPzoge1xuICAgIGV4YWN0PzogYm9vbGVhbjtcbiAgfTtcbiAgcnVuPzoge1xuICAgIGJ1bj86IGJvb2xlYW47XG4gIH07XG59XG5cbmNvbnN0IG1pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXMgPSBbXG4gICdAZXhlcmNvZGUvcHJvYmxlbS11dGlscycsXG4gICdAbmV4dC9lbnYnLFxuICAnQG5leHQvZXNsaW50LXBsdWdpbi1uZXh0JyxcbiAgJ0BuZXh0L2ZvbnQnLFxuICAnQG5leHQvcnNwYWNrLWJpbmRpbmctbGludXgtYXJtNjQtZ251JyxcbiAgJ0BuZXh0L3JzcGFjay1iaW5kaW5nLWxpbnV4LWFybTY0LW11c2wnLFxuICAnQG5leHQvcnNwYWNrLWJpbmRpbmctbGludXgteDY0LWdudScsXG4gICdAbmV4dC9yc3BhY2stYmluZGluZy1saW51eC14NjQtbXVzbCcsXG4gICdAbmV4dC9zd2MtYW5kcm9pZC1hcm0tZWFiaScsXG4gICdAbmV4dC9zd2MtYW5kcm9pZC1hcm02NCcsXG4gICdAbmV4dC9zd2MtZGFyd2luLWFybTY0JyxcbiAgJ0BuZXh0L3N3Yy1kYXJ3aW4teDY0JyxcbiAgJ0BuZXh0L3N3Yy1mcmVlYnNkLXg2NCcsXG4gICdAbmV4dC9zd2MtbGludXgtYXJtLWdudWVhYmloZicsXG4gICdAbmV4dC9zd2MtbGludXgtYXJtNjQtZ251JyxcbiAgJ0BuZXh0L3N3Yy1saW51eC1hcm02NC1tdXNsJyxcbiAgJ0BuZXh0L3N3Yy1saW51eC14NjQtZ251JyxcbiAgJ0BuZXh0L3N3Yy1saW51eC14NjQtbXVzbCcsXG4gICdAbmV4dC9zd2Mtd2FzbS1ub2RlanMnLFxuICAnQG5leHQvc3djLXdhc20td2ViJyxcbiAgJ0BuZXh0L3N3Yy13aW4zMi1hcm02NC1tc3ZjJyxcbiAgJ0BuZXh0L3N3Yy13aW4zMi1pYTMyLW1zdmMnLFxuICAnQG5leHQvc3djLXdpbjMyLXg2NC1tc3ZjJyxcbiAgJ0BuZXh0L3RoaXJkLXBhcnRpZXMnLFxuICAnQHdpbGxib29zdGVyL2FnZW50LXNraWxscycsXG4gICdAd2lsbGJvb3N0ZXIvYmFiZWwtY29uZmlncycsXG4gICdAd2lsbGJvb3N0ZXIvYmlvbWUtY29uZmlnJyxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWJsaXR6LW5leHQnLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMnLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMtcmVhY3QnLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctbmV4dCcsXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cycsXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cy1yZWFjdCcsXG4gICdAd2lsbGJvb3N0ZXIvb3hmbXQtY29uZmlnJyxcbiAgJ0B3aWxsYm9vc3Rlci9veGxpbnQtY29uZmlnJyxcbiAgJ0B3aWxsYm9vc3Rlci9wcmV0dGllci1jb25maWcnLFxuICAnQHdpbGxib29zdGVyL3Jlbm92YXRlLWNvbmZpZycsXG4gICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYicsXG4gICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ibGl0ei1uZXh0JyxcbiAgJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5leHQnLFxuICAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZScsXG4gICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1yZWFjdCcsXG4gICdAd2lsbGJvb3N0ZXIvd2InLFxuICAnbmV4dCcsXG4gICdyZWFjdCcsXG4gICdyZWFjdC1kb20nLFxuXTtcblxuY29uc3QgbmV3Q29udGVudCA9IChleGlzdGluZ0NvbnRlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IGJ1bmZpZ1RvbWwgPSBwYXJzZUJ1bmZpZ1RvbWwoZXhpc3RpbmdDb250ZW50KTtcbiAgcmV0dXJuIGBlbnYgPSBmYWxzZVxudGVsZW1ldHJ5ID0gZmFsc2VcblxuJHtnZW5lcmF0ZVJ1blNlY3Rpb24oYnVuZmlnVG9tbCl9XG5baW5zdGFsbF1cbmV4YWN0ID0gJHtidW5maWdUb21sPy5pbnN0YWxsPy5leGFjdCA9PT0gZmFsc2UgPyAnZmFsc2UnIDogJ3RydWUnfVxubGlua2VyID0gXCJob2lzdGVkXCJcbm1pbmltdW1SZWxlYXNlQWdlID0gNDMyMDAwICMgNSBkYXlzXG5taW5pbXVtUmVsZWFzZUFnZUV4Y2x1ZGVzID0gW1xuJHttaW5pbXVtUmVsZWFzZUFnZUV4Y2x1ZGVzLm1hcCgocGFja2FnZU5hbWUpID0+IGAgICAgXCIke3BhY2thZ2VOYW1lfVwiLGApLmpvaW4oJ1xcbicpfVxuXVxuYDtcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUJ1bmZpZ1RvbWwoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVCdW5maWdUb21sJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnYnVuZmlnLnRvbWwnKTtcbiAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSA/IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBjb250ZW50ID0gbmV3Q29udGVudChleGlzdGluZ0NvbnRlbnQpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb250ZW50KSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBwYXJzZUJ1bmZpZ1RvbWwoY29udGVudDogc3RyaW5nIHwgdW5kZWZpbmVkKTogQnVuZmlnVG9tbCB8IHVuZGVmaW5lZCB7XG4gIGlmICghY29udGVudCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgdHJ5IHtcbiAgICByZXR1cm4gcGFyc2UoY29udGVudCkgYXMgQnVuZmlnVG9tbDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZVJ1blNlY3Rpb24oYnVuZmlnVG9tbDogQnVuZmlnVG9tbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIHJldHVybiB0eXBlb2YgYnVuZmlnVG9tbD8ucnVuPy5idW4gPT09ICdib29sZWFuJyA/IGBbcnVuXVxcbmJ1biA9ICR7YnVuZmlnVG9tbC5ydW4uYnVufVxcbmAgOiAnJztcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcblxuY29uc3QgdXNlckNvbnRlbnRIZWFkZXIgPSAnIyBQcm9qZWN0LXNwZWNpZmljIHNldHRpbmdzJztcbmNvbnN0IHVzZXJDb250ZW50SGVhZGVyUmVnZXggPSAvIyBQcm9qZWN0LXNwZWNpZmljIHNldHRpbmdzW15cXG5dKlxcbi9nbTtcbmNvbnN0IHNlcGFyYXRvciA9ICcjIEdlbmVyYXRlZCBieSB3YmZ5JztcbmNvbnN0IHNlcGFyYXRvclByZWZpeCA9ICcjIEdlbmVyYXRlZCBieSAnO1xuY29uc3QgZGVmYXVsdEhlYWRVc2VyQ29udGVudCA9IGAke3VzZXJDb250ZW50SGVhZGVyfSAoaGVhZClcblxuXG4ke3NlcGFyYXRvcn1cbmA7XG5jb25zdCBkZWZhdWx0VGFpbFVzZXJDb250ZW50ID0gYFxuJHt1c2VyQ29udGVudEhlYWRlcn0gKHRhaWwpXG5gO1xuXG5leHBvcnQgY29uc3QgaWdub3JlRmlsZVV0aWwgPSB7XG4gIHNlcGFyYXRvcixcbiAgc2VwYXJhdG9yUHJlZml4LFxuICBkZWZhdWx0SGVhZFVzZXJDb250ZW50LFxuICBkZWZhdWx0VGFpbFVzZXJDb250ZW50LFxuICBhc3luYyByZWFkR2l0aWdub3JlV2l0aG91dFNlcGFyYXRvcnMoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGxldCBjb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBsYXN0SGVhZGVySW5kZXggPSBnZXRJbmRleE9mVGFpbFVzZXJDb250ZW50SGVhZGVyKGNvbnRlbnQpO1xuICAgICAgaWYgKGxhc3RIZWFkZXJJbmRleCA+IDApIHtcbiAgICAgICAgY29udGVudCA9IGNvbnRlbnQuc2xpY2UoMCwgbGFzdEhlYWRlckluZGV4IC0gMSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gKFxuICAgICAgICBjb250ZW50XG4gICAgICAgICAgLnJlcGxhY2VBbGwodXNlckNvbnRlbnRIZWFkZXJSZWdleCwgJycpXG4gICAgICAgICAgLnJlcGxhY2VBbGwoLyMgR2VuZXJhdGVkIGJ5IFteXFxuXSpcXG4vZ20sICcnKVxuICAgICAgICAgIC5yZXBsYWNlQWxsKC9cXHI/XFxuXFxyP1xcbihcXHI/XFxuKSsvZ20sICdcXG5cXG4nKVxuICAgICAgICAgIC50cmltKCkgKyAnXFxuJ1xuICAgICAgKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gIH0sXG4gIGdldEhlYWRVc2VyQ29udGVudChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGluZGV4ID0gY29udGVudC5pbmRleE9mKHRoaXMuc2VwYXJhdG9yUHJlZml4KTtcbiAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICByZXR1cm4gY29udGVudFxuICAgICAgICAuc2xpY2UoMCwgY29udGVudC5pbmRleE9mKCdcXG4nLCBpbmRleCkgKyAxKVxuICAgICAgICAucmVwbGFjZUFsbCh1c2VyQ29udGVudEhlYWRlclJlZ2V4LCBgJHt1c2VyQ29udGVudEhlYWRlcn0gKGhlYWQpXFxuYCk7XG4gICAgfVxuICAgIHJldHVybiBkZWZhdWx0SGVhZFVzZXJDb250ZW50O1xuICB9LFxuICBnZXRUYWlsVXNlckNvbnRlbnQoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBsYXN0SGVhZGVySW5kZXggPSBnZXRJbmRleE9mVGFpbFVzZXJDb250ZW50SGVhZGVyKGNvbnRlbnQpO1xuICAgIGlmIChsYXN0SGVhZGVySW5kZXggPiAwKSB7XG4gICAgICByZXR1cm4gY29udGVudC5zbGljZShsYXN0SGVhZGVySW5kZXggLSAxKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlZmF1bHRUYWlsVXNlckNvbnRlbnQ7XG4gIH0sXG4gIGFzeW5jIGlzQmVycnlaZXJvSW5zdGFsbEVuYWJsZWQoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICByZXR1cm4gY29udGVudC5pbmNsdWRlcygnXFxuIS55YXJuL2NhY2hlJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LFxufTtcblxuZnVuY3Rpb24gZ2V0SW5kZXhPZlRhaWxVc2VyQ29udGVudEhlYWRlcihjb250ZW50OiBzdHJpbmcpOiBudW1iZXIge1xuICBjb25zdCBpbmRleCA9IGNvbnRlbnQuaW5kZXhPZih1c2VyQ29udGVudEhlYWRlcik7XG4gIGNvbnN0IGxhc3RJbmRleCA9IGNvbnRlbnQubGFzdEluZGV4T2YodXNlckNvbnRlbnRIZWFkZXIpO1xuICByZXR1cm4gbGFzdEluZGV4ID4gaW5kZXggPyBsYXN0SW5kZXggOiAtMTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBpZ25vcmVGaWxlVXRpbCB9IGZyb20gJy4uL3V0aWxzL2lnbm9yZUZpbGVVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG4vLyBFeGVyY29kZeOBp+OBr25vZGVfbW9kdWxlc+OCkkNPUFnjgZnjgovlv4XopoHjgYzjgYLjgovjgZ/jgoHjgIFub2RlX21vZHVsZXPjgpLpmaTlpJbjgZfjgabjga/jgYTjgZHjgarjgYTjgIJcbmNvbnN0IGNvbW1vbkNvbnRlbnQgPSBgXG4qKi8uaWRlYVxuKiovKi5zcWxpdGUzKlxuKiovLnlhcm4vaW5zdGFsbC1zdGF0ZS5nelxuKiovLnZlbnZcbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZURvY2tlcmlnbm9yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZURvY2tlcmlnbm9yZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5kb2NrZXJpZ25vcmUnKTtcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluRG9ja2VyZmlsZSkge1xuICAgICAgY29uc3QgY29udGVudCA9IChhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoKSkgPz8gJyc7XG4gICAgICBjb25zdCBoZWFkVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRIZWFkVXNlckNvbnRlbnQoY29udGVudCk7XG4gICAgICBjb25zdCB0YWlsVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRUYWlsVXNlckNvbnRlbnQoY29udGVudCk7XG5cbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBoZWFkVXNlckNvbnRlbnQgKyBjb21tb25Db250ZW50ICsgdGFpbFVzZXJDb250ZW50O1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgfVxuICB9KTtcbn1cbiIsImV4cG9ydCBjb25zdCBleHRlbnNpb25zID0ge1xuICBjb2RlV2l0aDJJbmRlbnRTaXplOiBbXG4gICAgJ2NqcycsXG4gICAgJ21qcycsXG4gICAgJ2pzJyxcbiAgICAnanN4JyxcbiAgICAnY3RzJyxcbiAgICAnbXRzJyxcbiAgICAndHMnLFxuICAgICd0c3gnLFxuICAgICdqc29uJyxcbiAgICAnanNvbjUnLFxuICAgICdqc29uYycsXG4gICAgJ2NwcCcsXG4gICAgJ2RhcnQnLFxuICAgICdodG0nLFxuICAgICdodG1sJyxcbiAgICAncHUnLFxuICAgICdwdW1sJyxcbiAgICAncmInLFxuICAgICd2dWUnLFxuICAgICd4bWwnLFxuICAgICd5YW1sJyxcbiAgICAneW1sJyxcbiAgICAnc2gnLFxuICBdLnRvU29ydGVkKCksXG4gIGNvZGVXaXRoNEluZGVudFNpemU6IFsnZ28nLCAnZ3JhZGxlJywgJ2phdmEnLCAncHknXS50b1NvcnRlZCgpLFxuICBtYXJrZG93bkxpa2U6IFsnbWQnXS50b1NvcnRlZCgpLFxuICBlc2xpbnQ6IFsnY2pzJywgJ21qcycsICdqcycsICdjdHMnLCAnbXRzJywgJ3RzJywgJ3RzeCcsICdqc3gnXS50b1NvcnRlZCgpLFxuICBwcmV0dGllcjogW1xuICAgICdjanMnLFxuICAgICdtanMnLFxuICAgICdqYXZhJyxcbiAgICAnanMnLFxuICAgICdqc3gnLFxuICAgICdjdHMnLFxuICAgICdtdHMnLFxuICAgICd0cycsXG4gICAgJ3RzeCcsXG4gICAgJ2pzb24nLFxuICAgICdqc29uNScsXG4gICAgJ2pzb25jJyxcbiAgICAnY3NzJyxcbiAgICAnaHRtJyxcbiAgICAnaHRtbCcsXG4gICAgJ21kJyxcbiAgICAnc2NzcycsXG4gICAgJ3Z1ZScsXG4gICAgJ3lhbWwnLFxuICAgICd5bWwnLFxuICBdLnRvU29ydGVkKCksXG4gIC8vIGNmLiBodHRwczovL2Jpb21lanMuZGV2L2ludGVybmFscy9sYW5ndWFnZS1zdXBwb3J0L1xuICBiaW9tZTogW1xuICAgICdjanMnLFxuICAgICdtanMnLFxuICAgICdqcycsXG4gICAgJ2pzeCcsXG4gICAgJ2N0cycsXG4gICAgJ210cycsXG4gICAgJ3RzJyxcbiAgICAndHN4JyxcbiAgICAnanNvbicsXG4gICAgJ2pzb241JyxcbiAgICAnanNvbmMnLFxuICAgICdodG0nLFxuICAgICdodG1sJyxcbiAgICAndnVlJyxcbiAgICAnc3ZlbHRlJyxcbiAgICAnYXN0cm8nLFxuICAgICdjc3MnLFxuICAgICd5YW1sJyxcbiAgICAneW1sJyxcbiAgICAnZ3FsJyxcbiAgXS50b1NvcnRlZCgpLFxufTtcbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgbmV3Q29udGVudCA9IGByb290ID0gdHJ1ZVxuXG5bKl1cbmNoYXJzZXQgPSB1dGYtOFxuZW5kX29mX2xpbmUgPSBsZlxuaW5zZXJ0X2ZpbmFsX25ld2xpbmUgPSB0cnVlXG50cmltX3RyYWlsaW5nX3doaXRlc3BhY2UgPSB0cnVlXG5cbiR7Z2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnMuY29kZVdpdGgySW5kZW50U2l6ZSl9XG5pbmRlbnRfc2l6ZSA9IDJcbmluZGVudF9zdHlsZSA9IHNwYWNlXG5cbiR7Z2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnMuY29kZVdpdGg0SW5kZW50U2l6ZSl9XG5pbmRlbnRfc2l6ZSA9IDRcbmluZGVudF9zdHlsZSA9IHNwYWNlXG5cbiR7Z2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnMubWFya2Rvd25MaWtlKX1cbm1heF9saW5lX2xlbmd0aCA9IG9mZlxudHJpbV90cmFpbGluZ193aGl0ZXNwYWNlID0gZmFsc2VcblxuW3tNYWtlZmlsZSwqLm1rfV1cbmluZGVudF9zdHlsZSA9IHRhYlxuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRWRpdG9yY29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlRWRpdG9yY29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmVkaXRvcmNvbmZpZycpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUV4dGVuc2lvbnMoZXh0ZW5zaW9uczogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gZXh0ZW5zaW9ucy5sZW5ndGggPiAxID8gYFsqLnske2V4dGVuc2lvbnMuam9pbignLCcpfX1dYCA6IGBbKi4ke2V4dGVuc2lvbnNbMF19XWA7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUVzbGludHJjKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlRXNsaW50cmMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdlc2xpbnQuY29uZmlnLm1qcycpO1xuICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFjb25maWcuZXNsaW50QmFzZSkgcmV0dXJuO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGlmICghb2xkQ29udGVudC5pbmNsdWRlcygnZXhwb3J0IHsgZGVmYXVsdCB9JykpIHJldHVybjtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgYGV4cG9ydCB7IGRlZmF1bHQgfSBmcm9tICcke2NvbmZpZy5lc2xpbnRCYXNlfSc7YCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IHlhbWwgZnJvbSAnanMteWFtbCc7XG5pbXBvcnQgY2xvbmVEZWVwIGZyb20gJ2xvZGFzaC5jbG9uZWRlZXAnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgb3ZlcndyaXRlTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmltcG9ydCB7IGdlbmVyYXRlQWdlbnRDb2RpbmdTdHlsZSB9IGZyb20gJy4vYWdlbnRzLmpzJztcblxuY29uc3QgZGVmYXVsdENvbmZpZyA9IHtcbiAgaGF2ZV9mdW46IHRydWUsXG4gIGNvZGVfcmV2aWV3OiB7XG4gICAgZGlzYWJsZTogZmFsc2UsXG4gICAgY29tbWVudF9zZXZlcml0eV90aHJlc2hvbGQ6ICdNRURJVU0nLFxuICAgIG1heF9yZXZpZXdfY29tbWVudHM6IC0xLFxuICAgIHB1bGxfcmVxdWVzdF9vcGVuZWQ6IHtcbiAgICAgIGhlbHA6IGZhbHNlLFxuICAgICAgc3VtbWFyeTogdHJ1ZSxcbiAgICAgIGNvZGVfcmV2aWV3OiB0cnVlLFxuICAgIH0sXG4gIH0sXG4gIGlnbm9yZV9wYXR0ZXJuczogWycqKi9fX2dlbmVyYXRlZF9fJ10sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHZW1pbmlDb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdlbWluaUNvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWNvbmZpZy5pc1Jvb3QpIHJldHVybjtcblxuICAgIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2VtaW5pJyk7XG4gICAgY29uc3QgY29uZmlnRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2NvbmZpZy55bWwnKTtcbiAgICBjb25zdCBzdHlsZWd1aWRlRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3N0eWxlZ3VpZGUubWQnKTtcbiAgICBjb25zdCBhZ2VudHNFeHRyYVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdBR0VOVFNfRVhUUkEubWQnKTtcblxuICAgIGxldCBuZXdDb25maWc6IG9iamVjdCA9IGNsb25lRGVlcChkZWZhdWx0Q29uZmlnKTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGNvbmZpZ0ZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3Qgb2xkQ29uZmlnID0geWFtbC5sb2FkKG9sZENvbnRlbnQpIGFzIG9iamVjdDtcbiAgICAgIG5ld0NvbmZpZyA9IG1lcmdlLmFsbChbbmV3Q29uZmlnLCBvbGRDb25maWcsIG5ld0NvbmZpZ10sIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nIC0gZmlsZSBkb2Vzbid0IGV4aXN0IG9yIGNhbid0IGJlIHBhcnNlZFxuICAgIH1cblxuICAgIGNvbnN0IHlhbWxDb250ZW50ID0geWFtbC5kdW1wKG5ld0NvbmZpZywge1xuICAgICAgbGluZVdpZHRoOiAtMSxcbiAgICAgIG5vQ29tcGF0TW9kZTogdHJ1ZSxcbiAgICAgIHN0eWxlczoge1xuICAgICAgICAnISFudWxsJzogJ2VtcHR5JyxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBjb25zdCBleHRyYUNvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGFnZW50c0V4dHJhUGF0aCk7XG4gICAgY29uc3QgY29kaW5nUnVsZUV4dHJhQ29udGVudCA9IGV4dHJhQ29udGVudD8udHJpbVN0YXJ0KCkuc3RhcnRzV2l0aCgnIycpID8gdW5kZWZpbmVkIDogZXh0cmFDb250ZW50O1xuICAgIGNvbnN0IHN0eWxlZ3VpZGVDb250ZW50ID0gYOS7peS4i+OBruOCs+ODvOODh+OCo+ODs+OCsOimj+e0hOOCkui4j+OBvuOBiOOBpuOAgeaXpeacrOiqnuOBp+ODrOODk+ODpeODvOOBl+OBpuOBj+OBoOOBleOBhOOAglxcblxcbiR7Z2VuZXJhdGVBZ2VudENvZGluZ1N0eWxlKGFsbENvbmZpZ3MpfSR7XG4gICAgICBjb2RpbmdSdWxlRXh0cmFDb250ZW50ID8gYFxcblxcbiR7Y29kaW5nUnVsZUV4dHJhQ29udGVudC50cmltRW5kKCl9YCA6ICcnXG4gICAgfWA7XG5cbiAgICBjb25zdCBwcm9taXNlcyA9IFtcbiAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGNvbmZpZ0ZpbGVQYXRoLCB5YW1sQ29udGVudCkpLFxuICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoc3R5bGVndWlkZUZpbGVQYXRoLCBzdHlsZWd1aWRlQ29udGVudCkpLFxuICAgIF07XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbW92ZUdlbWluaVNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlR2VtaW5pU2V0dGluZ3MnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFjb25maWcuaXNSb290KSByZXR1cm47XG5cbiAgICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdlbWluaScpO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdzZXR0aW5ncy5qc29uJyk7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG4vLyBjZi4gaHR0cHM6Ly9idW4uc2gvZ3VpZGVzL2luc3RhbGwvZ2l0LWRpZmYtYnVuLWxvY2tmaWxlXG5jb25zdCBuZXdDb250ZW50ID0gYCogdGV4dD1hdXRvXG5cbioubG9ja2IgYmluYXJ5IGRpZmY9bG9ja2JcbioudmNwcm9qIHRleHQgZW9sPWNybGZcblxuJHtbLi4uZXh0ZW5zaW9ucy5jb2RlV2l0aDJJbmRlbnRTaXplLCAuLi5leHRlbnNpb25zLmNvZGVXaXRoNEluZGVudFNpemUsIC4uLmV4dGVuc2lvbnMubWFya2Rvd25MaWtlXVxuICAubWFwKChleHQpID0+IGAqLiR7ZXh0fSB0ZXh0IGVvbD1sZmApXG4gIC5qb2luKCdcXG4nKX1cblxuZGlzdC8qKiBsaW5ndWlzdC1nZW5lcmF0ZWQ9dHJ1ZVxuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlR2l0YXR0cmlidXRlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0YXR0cmlidXRlcycpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IG9zIGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuLi9vcHRpb25zLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGRlZmF1bHROYW1lcyA9IFsnd2luZG93cycsICdtYWNvcycsICdsaW51eCcsICdqZXRicmFpbnMnLCAndmlzdWFsc3R1ZGlvY29kZScsICdlbWFjcycsICd2aW0nLCAneWFybiddO1xuXG5jb25zdCBjb21tb25Db250ZW50ID0gYFxuIS5rZWVwXG4uYWlkZXIqXG4uZW52LnByb2R1Y3Rpb25cbiovbW91bnQvKi5oYXNoXG4uZGV2Y29udGFpbmVyL1xuLmlkZWEvQXVnbWVudFdlYnZpZXdTdGF0ZVN0b3JlLnhtbFxuLmlkZWEvY29waWxvdC4qXG4uaWRlYS9jb3BpbG90L2NoYXRTZXNzaW9ucy9cbi5wbGF5d3JpZ2h0LWNsaS9cbi5zZXJlbmEvXG4udG1wL1xuX19nZW5lcmF0ZWRfXy9cbkB3aWxsYm9vc3Rlci9cbmRpc3QvXG50ZW1wL1xudG1wL1xuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlR2l0aWdub3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZywgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlR2l0aWdub3JlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGlnbm9yZScpO1xuICAgIGNvbnN0IGNvbnRlbnQgPSAoYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihmaWxlUGF0aCkpID8/ICcnO1xuICAgIGxldCBoZWFkVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRIZWFkVXNlckNvbnRlbnQoY29udGVudCkgKyBjb21tb25Db250ZW50O1xuICAgIGNvbnN0IHRhaWxVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldFRhaWxVc2VyQ29udGVudChjb250ZW50KTtcblxuICAgIGNvbnN0IG5hbWVzID0gWy4uLmRlZmF1bHROYW1lc107XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbkdlbWZpbGUpIHtcbiAgICAgIG5hbWVzLnB1c2goJ3J1YnknKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbkdvTW9kKSB7XG4gICAgICBuYW1lcy5wdXNoKCdnbycpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAke3BhdGguYmFzZW5hbWUoY29uZmlnLmRpclBhdGgpfVxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uKSB7XG4gICAgICBuYW1lcy5wdXNoKCdub2RlJyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb21YbWwpIHtcbiAgICAgIG5hbWVzLnB1c2goJ21hdmVuJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5pZGVhL2dvb2dsZS1qYXZhLWZvcm1hdC54bWxcbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgICAgbmFtZXMucHVzaCgnZmx1dHRlcicsICdBbmRyb2lkU3R1ZGlvJywgJ3J1YnknKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLmZsdXR0ZXItcGx1Z2lucy1kZXBlbmRlbmNpZXNcbmFuZHJvaWQva2V5LnByb3BlcnRpZXNcbmlvcy8uYnVuZGxlXG4uaWRlYS9ydW5Db25maWd1cmF0aW9ucy54bWxcbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5UZW1wbGF0ZVlhbWwpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLmF3cy1zYW0vXG5wYWNrYWdlZC55YW1sXG5gO1xuICAgIH1cbiAgICAvLyBCZWNhdXNlIC52ZW52IHNob3VsZCBiZSBpZ25vcmVkIG9uIHJvb3QgZGlyZWN0b3J5XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2spIHtcbiAgICAgIG5hbWVzLnB1c2goJ3B5dGhvbicpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAudmVudi9cbmA7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHopIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLmJsaXR6L1xuLmJsaXR6KipcbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLm5leHQpIHtcbiAgICAgIG5hbWVzLnB1c2goJ25leHRqcycpO1xuICAgIH1cbiAgICBpZiAocm9vdENvbmZpZy5kZXBlbmRpbmcuZmlyZWJhc2UgfHwgY29uZmlnLmRlcGVuZGluZy5maXJlYmFzZSkge1xuICAgICAgbmFtZXMucHVzaCgnZmlyZWJhc2UnKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHJpc21hKSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYCouc3FsaXRlMypcbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRUZXN0KSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYHBsYXl3cmlnaHQtcmVwb3J0L1xudGVzdC1yZXN1bHRzL1xuYDtcbiAgICB9XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlIHx8IGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICAgIG5hbWVzLnB1c2goJ3JlYWN0bmF0aXZlJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYGdvb2dsZS1zZXJ2aWNlcy5qc29uXG5hbmRyb2lkL2FwcC9zcmMvbWFpbi9hc3NldHMvXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5zdG9yeWJvb2spIHtcbiAgICAgIG5hbWVzLnB1c2goJ3N0b3J5Ym9va2pzJyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLmxpdGVzdHJlYW0pIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgZ2NwLXNhLWtleS5qc29uXG5gO1xuICAgIH1cblxuICAgIGxldCBnZW5lcmF0ZWQgPSAnJztcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcbiAgICAgIGxldCBjb250ZW50ID0gKGF3YWl0IHJlYWRDYWNoZShuYW1lKSkgPz8gJyc7XG4gICAgICBpZiAoIWNvbnRlbnQpIHtcbiAgICAgICAgY29uc3QgdXJsID0gYGh0dHBzOi8vd3d3LnRvcHRhbC5jb20vZGV2ZWxvcGVycy9naXRpZ25vcmUvYXBpLyR7bmFtZX1gO1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCk7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlVGV4dCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgICAgICAgaWYgKCFyZXNwb25zZS5vayB8fCByZXNwb25zZVRleHQuaW5jbHVkZXMoJ0F0dGVudGlvbiBSZXF1aXJlZCEnKSB8fCByZXNwb25zZVRleHQuaW5jbHVkZXMoJzx0aXRsZT4nKSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBmZXRjaCAke3VybH1gKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29udGVudCA9IHJlc3BvbnNlVGV4dC50cmltKCk7XG4gICAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiB3cml0ZUNhY2hlKG5hbWUsIGNvbnRlbnQpKTtcbiAgICAgICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKGBGZXRjaGVkICR7dXJsfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZ2VuZXJhdGVkKSBnZW5lcmF0ZWQgKz0gJ1xcbic7XG4gICAgICBnZW5lcmF0ZWQgKz0gY29udGVudCArICdcXG4nO1xuICAgIH1cbiAgICBpZiAoIShhd2FpdCBpZ25vcmVGaWxlVXRpbC5pc0JlcnJ5WmVyb0luc3RhbGxFbmFibGVkKGZpbGVQYXRoKSkpIHtcbiAgICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZC5yZXBsYWNlKCchLnlhcm4vY2FjaGUnLCAnIyAhLnlhcm4vY2FjaGUnKS5yZXBsYWNlKCcjIC5wbnAuKicsICcucG5wLionKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvbVhtbCB8fCBjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL2FydGlmYWN0cyQvZ20sICcuaWRlYS9hcnRpZmFjdHMnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9jb21waWxlci54bWwkL2dtLCAnLmlkZWEvY29tcGlsZXIueG1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvamFyUmVwb3NpdG9yaWVzLnhtbCQvZ20sICcuaWRlYS9qYXJSZXBvc2l0b3JpZXMueG1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvbW9kdWxlcy54bWwkL2dtLCAnLmlkZWEvbW9kdWxlcy54bWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC8qLmltbCQvZ20sICcuaWRlYS8qLmltbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL21vZHVsZXMkL2dtLCAnLmlkZWEvbW9kdWxlcycpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAqLmltbCQvZ20sICcqLmltbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAqLmlwciQvZ20sICcqLmlwcicpO1xuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZC5yZXBsYWNlQWxsKC9eLmlkZWFcXC9tb2R1bGVzLnhtbCQvZ20sICcjIC5pZGVhL21vZHVsZXMueG1sJyk7XG4gICAgICB9XG4gICAgfVxuICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZC5yZXBsYWNlQWxsKC9eLmlkZWFcXC8/JC9nbSwgJyMgLmlkZWEnKTtcbiAgICBpZiAocm9vdENvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUgfHwgY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSB8fCBjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2VBbGwoL14oLmlkZWFcXC8uKykkL2dtLCAnJDFcXG5hbmRyb2lkLyQxJyk7XG4gICAgfVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBoZWFkVXNlckNvbnRlbnQgKyAnXFxuJyArIGdlbmVyYXRlZCArIHRhaWxVc2VyQ29udGVudDtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuY29uc3QgZGlyUGF0aCA9IHBhdGguam9pbihvcy5ob21lZGlyKCksICcuY2FjaGUnLCAnd2JmeScsICdnaXRpZ25vcmUnKTtcblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVDYWNoZShuYW1lOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihkaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGguam9pbihkaXJQYXRoLCBuYW1lKSwgY29udGVudCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRDYWNoZShuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IHN0YXQgPSBhd2FpdCBmcy5wcm9taXNlcy5zdGF0KHBhdGguam9pbihkaXJQYXRoLCBuYW1lKSk7XG4gICAgaWYgKERhdGUubm93KCkgLSBzdGF0Lm10aW1lTXMgPiA2ICogNjAgKiA2MCAqIDEwMDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHBhdGguam9pbihkaXJQYXRoLCBuYW1lKSwgJ3V0ZjgnKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmZ1bmN0aW9uIGNyZWF0ZVRhc2tPcHRpb25zKHJ1bm5lcjogc3RyaW5nLCBhcmdzOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgZXh0ZW5zaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCAgICA8VGFza09wdGlvbnMgaXNFbmFibGVkPVwidHJ1ZVwiPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiYXJndW1lbnRzXCIgdmFsdWU9XCIke2FyZ3N9ICRGaWxlUGF0aFJlbGF0aXZlVG9Qcm9qZWN0Um9vdCRcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiY2hlY2tTeW50YXhFcnJvcnNcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImRlc2NyaXB0aW9uXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImV4aXRDb2RlQmVoYXZpb3JcIiB2YWx1ZT1cIkVSUk9SXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImZpbGVFeHRlbnNpb25cIiB2YWx1ZT1cIiR7ZXh0ZW5zaW9ufVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJpbW1lZGlhdGVTeW5jXCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJuYW1lXCIgdmFsdWU9XCIke25hbWV9ICguJHtleHRlbnNpb259KVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJvdXRwdXRcIiB2YWx1ZT1cIiRGaWxlUGF0aFJlbGF0aXZlVG9Qcm9qZWN0Um9vdCRcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwib3V0cHV0RmlsdGVyc1wiPlxuICAgICAgICA8YXJyYXkgLz5cbiAgICAgIDwvb3B0aW9uPlxuICAgICAgPG9wdGlvbiBuYW1lPVwib3V0cHV0RnJvbVN0ZG91dFwiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwicHJvZ3JhbVwiIHZhbHVlPVwiJHtydW5uZXJ9XCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cInJ1bk9uRXh0ZXJuYWxDaGFuZ2VzXCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJzY29wZU5hbWVcIiB2YWx1ZT1cIlByb2plY3QgRmlsZXNcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwidHJhY2tPbmx5Um9vdFwiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwid29ya2luZ0RpclwiIHZhbHVlPVwiJFByb2plY3RGaWxlRGlyJFwiIC8+XG4gICAgICA8ZW52cyAvPlxuICAgIDwvVGFza09wdGlvbnM+XG5gO1xufVxuXG5jb25zdCBwcmV0dGllckNvbnRlbnQgPSBgPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG48cHJvamVjdCB2ZXJzaW9uPVwiNFwiPlxuICA8Y29tcG9uZW50IG5hbWU9XCJQcm9qZWN0VGFza3NPcHRpb25zXCI+XG4ke2V4dGVuc2lvbnMucHJldHRpZXIubWFwKChleHQpID0+IGNyZWF0ZVRhc2tPcHRpb25zKCdub2RlJywgJ25vZGVfbW9kdWxlcy8uYmluL3ByZXR0aWVyIC0tY2FjaGUgLS13cml0ZScsICdQcmV0dGllcicsIGV4dCkpLmpvaW4oJycpfVxuICA8L2NvbXBvbmVudD5cbjwvcHJvamVjdD5cbmA7XG5cbmNvbnN0IGJpb21lQ29udGVudCA9IGA8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cbjxwcm9qZWN0IHZlcnNpb249XCI0XCI+XG4gIDxjb21wb25lbnQgbmFtZT1cIlByb2plY3RUYXNrc09wdGlvbnNcIj5cbiR7ZXh0ZW5zaW9ucy5wcmV0dGllci5tYXAoKGV4dCkgPT4gY3JlYXRlVGFza09wdGlvbnMoJ2J1bicsICctLWJ1biBub2RlX21vZHVsZXMvLmJpbi9iaW9tZSBjaGVjayAtLWZpeCAtLW5vLWVycm9ycy1vbi11bm1hdGNoZWQgLS1za2lwLXBhcnNlLWVycm9ycycsICdCaW9tZScsIGV4dCkpLmpvaW4oJycpfVxuICA8L2NvbXBvbmVudD5cbjwvcHJvamVjdD5cbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUlkZWFTZXR0aW5ncyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUlkZWFTZXR0aW5ncycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmlkZWEnKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhkaXJQYXRoKSkge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3dhdGNoZXJUYXNrcy54bWwnKTtcbiAgICAgIGF3YWl0IChjb25maWcuZG9lc0NvbnRhaW5KYXZhU2NyaXB0IHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5KYXZhU2NyaXB0SW5QYWNrYWdlcyB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXMgfHxcbiAgICAgIChjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbiAmJlxuICAgICAgICAhY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwgJiZcbiAgICAgICAgIWNvbmZpZy5kb2VzQ29udGFpbkdlbWZpbGUgJiZcbiAgICAgICAgIWNvbmZpZy5kb2VzQ29udGFpbkdvTW9kICYmXG4gICAgICAgICFjb25maWcuZG9lc0NvbnRhaW5Qb21YbWwpXG4gICAgICAgID8gcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGNvbmZpZy5pc0J1biA/IGJpb21lQ29udGVudCA6IHByZXR0aWVyQ29udGVudCkpXG4gICAgICAgIDogcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKSk7XG4gICAgfVxuICB9KTtcbn1cbiIsImltcG9ydCB0eXBlIHsgU3Bhd25TeW5jT3B0aW9ucyB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5leHBvcnQgZnVuY3Rpb24gc3Bhd25TeW5jKGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nLCByZXRyeSA9IDApOiB2b2lkIHtcbiAgZG8ge1xuICAgIGNvbnN0IFtuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnNdID0gZ2V0U3Bhd25TeW5jQXJncyhjb21tYW5kLCBhcmdzLCBjd2QpO1xuICAgIGNvbnNvbGUubG9nKGAkICR7bmV3Q21kfSAke25ld0FyZ3Muam9pbignICcpfSBhdCAke2N3ZH1gKTtcbiAgICBjb25zdCByZXQgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnMpO1xuICAgIGlmIChyZXQuc3RhdHVzID09PSAwKSBicmVhaztcbiAgfSB3aGlsZSAoLS1yZXRyeSA+PSAwKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXduU3luY0FuZFJldHVyblN0ZG91dChjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IFtuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnNdID0gZ2V0U3Bhd25TeW5jQXJncyhjb21tYW5kLCBhcmdzLCBjd2QpO1xuICBvcHRpb25zLnN0ZGlvID0gJ3BpcGUnO1xuICBjb25zdCBwcm9jID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMobmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zKTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb24gLS0gc3Bhd25TeW5jIHJldHVybnMgbnVsbCBzdGRlcnIgb24gRU5PRU5ULlxuICBjb25zdCBzdGRlcnIgPSBwcm9jLnN0ZGVyciA/PyAnJztcbiAgY29uc3QgZXJyb3IgPSB0eXBlb2Ygc3RkZXJyID09PSAnc3RyaW5nJyA/IHN0ZGVyci50cmltKCkgOiBzdGRlcnIudG9TdHJpbmcoKS50cmltKCk7XG4gIGlmIChwcm9jLmVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihgJHtuZXdDbWR9IFske25ld0FyZ3MubWFwKChzKSA9PiBgXCIke3N9XCJgKS5qb2luKCcsICcpfV0gZmFpbGVkIHdpdGg6ICR7cHJvYy5lcnJvci5tZXNzYWdlfWApO1xuICB9IGVsc2UgaWYgKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihcbiAgICAgIGAke25ld0NtZH0gWyR7bmV3QXJncy5tYXAoKHMpID0+IGBcIiR7c31cImApLmpvaW4oJywgJyl9XSBvdXRwdXRzIHRoZSBmb2xsb3dpbmcgY29udGVudCB0byBzdGRlcnI6XFxuJHtlcnJvcn1gXG4gICAgKTtcbiAgfVxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvbiAtLSBzcGF3blN5bmMgcmV0dXJucyBudWxsIHN0ZG91dCBvbiBFTk9FTlQuXG4gIGNvbnN0IHN0ZG91dCA9IHByb2Muc3Rkb3V0ID8/ICcnO1xuICByZXR1cm4gdHlwZW9mIHN0ZG91dCA9PT0gJ3N0cmluZycgPyBzdGRvdXQudHJpbSgpIDogc3Rkb3V0LnRvU3RyaW5nKCkudHJpbSgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3Bhd25TeW5jQXJncyhjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZyk6IFtzdHJpbmcsIHN0cmluZ1tdLCBTcGF3blN5bmNPcHRpb25zXSB7XG4gIGNvbnN0IGVudiA9IHsgLi4ucHJvY2Vzcy5lbnYgfTtcbiAgLy8gUmVtb3ZlIGJlcnJ5IGZyb20gUEFUSFxuICBpZiAoZW52LlBBVEggJiYgZW52LkJFUlJZX0JJTl9GT0xERVIpIHtcbiAgICBlbnYuUEFUSCA9IGVudi5QQVRILnJlcGxhY2UoYCR7ZW52LkJFUlJZX0JJTl9GT0xERVJ9OmAsICcnKTtcbiAgfVxuXG4gIHJldHVybiBbXG4gICAgY29tbWFuZCxcbiAgICBhcmdzLFxuICAgIHtcbiAgICAgIGN3ZCxcbiAgICAgIGVudixcbiAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgICBzaGVsbDogZmFsc2UsXG4gICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIH0sXG4gIF07XG59XG4iLCJpbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuZXhwb3J0IGNvbnN0IEVzbGludFV0aWwgPSB7XG4gIGdldExpbnRGaXhTdWZmaXgoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gY29uZmlnLmRvZXNDb250YWluSnN4T3JUc3ggPyAnIC0tcnVsZSBcInsgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzOiAwIH1cIicgOiAnJztcbiAgfSxcbn07XG4iLCJpbXBvcnQgeyBPY3Rva2l0IH0gZnJvbSAnQG9jdG9raXQvY29yZSc7XG5cbmNsYXNzIEdpdEh1YlV0aWwge1xuICBnZXRPcmdBbmROYW1lKHVybE9yRnVsbE5hbWU6IHN0cmluZyk6IFtzdHJpbmcsIHN0cmluZ10ge1xuICAgIGNvbnN0IHVybFdpdGhvdXRQcm90b2NvbCA9IHVybE9yRnVsbE5hbWUuc3BsaXQoJzonKS5hdCgtMSk7XG4gICAgY29uc3QgbmFtZXMgPSB1cmxXaXRob3V0UHJvdG9jb2w/LnNwbGl0KCcvJyk7XG4gICAgY29uc3Qgb3JnID0gbmFtZXM/LmF0KC0yKSA/PyAnJztcbiAgICBjb25zdCBuYW1lID0gbmFtZXM/LmF0KC0xKT8ucmVwbGFjZSgvLmdpdCQvLCAnJykgPz8gJyc7XG4gICAgcmV0dXJuIFtvcmcsIG5hbWVdO1xuICB9XG59XG5leHBvcnQgY29uc3QgZ2l0SHViVXRpbCA9IG5ldyBHaXRIdWJVdGlsKCk7XG5cbmNvbnN0IG9jdG9raXRDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBPY3Rva2l0PigpO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0T2N0b2tpdChvd25lcj86IHN0cmluZyk6IE9jdG9raXQge1xuICBjb25zdCBrZXkgPSBvd25lciA/PyAnJztcbiAgY29uc3QgY2FjaGVkID0gb2N0b2tpdENhY2hlLmdldChrZXkpO1xuICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkO1xuXG4gIGNvbnN0IG9jdG9raXQgPSBuZXcgT2N0b2tpdCh7XG4gICAgYXV0aDogZ2V0R2l0SHViVG9rZW4ob3duZXIpIHx8IHVuZGVmaW5lZCxcbiAgfSk7XG4gIG9jdG9raXRDYWNoZS5zZXQoa2V5LCBvY3Rva2l0KTtcbiAgcmV0dXJuIG9jdG9raXQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNHaXRIdWJUb2tlbihvd25lcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAhIWdldEdpdEh1YlRva2VuKG93bmVyKTtcbn1cblxuZnVuY3Rpb24gZ2V0R2l0SHViVG9rZW4ob3duZXI/OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAob3duZXIgPT09ICdXaWxsQm9vc3RlcicpIHtcbiAgICByZXR1cm4gcHJvY2Vzcy5lbnYuR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVI7XG4gIH1cbiAgaWYgKG93bmVyID09PSAnV2lsbEJvb3N0ZXJMYWInKSB7XG4gICAgcmV0dXJuIHByb2Nlc3MuZW52LkdIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSTEFCO1xuICB9XG4gIHJldHVybiAoXG4gICAgcHJvY2Vzcy5lbnYuR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVIgfHxcbiAgICBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUkxBQiB8fFxuICAgIHByb2Nlc3MuZW52LkdIX1RPS0VOIHx8XG4gICAgcHJvY2Vzcy5lbnYuR0lUSFVCX1RPS0VOXG4gICk7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuY29uc3QgRVNMSU5UX0NPTkZJR19QUkVGSVggPSAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctJztcbmNvbnN0IHBpbm5lZERlcGVuZGVuY3lTcGVjaWZpZXJzID0ge1xuICAnQGVzbGludC9qcyc6ICdeOS4zOS40JyxcbiAgZXNsaW50OiAnXjkuMzkuNCcsXG4gIHR5cGVzY3JpcHQ6ICdeNS45LjMnLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGZ1bmN0aW9uIHNob3VsZFNraXBXaWxsYm9vc3RlckNvbmZpZ3NFc2xpbnRQYWNrYWdlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gY29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzICYmIGNvbmZpZy5wYWNrYWdlSnNvbj8ubmFtZT8uc3RhcnRzV2l0aChFU0xJTlRfQ09ORklHX1BSRUZJWCkgPT09IHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQaW5uZWREZXBlbmRlbmN5U3BlY2lmaWVyKGRlcGVuZGVuY3k6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHBpbm5lZERlcGVuZGVuY3lTcGVjaWZpZXJzKSkge1xuICAgIGlmIChrZXkgPT09IGRlcGVuZGVuY3kpIHtcbiAgICAgIHJldHVybiBgJHtrZXl9QCR7dmFsdWV9YDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24sIFNldFJlcXVpcmVkIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgZ2V0TGF0ZXN0Q29tbWl0SGFzaCB9IGZyb20gJy4uL2dpdGh1Yi9jb21taXQuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgRXNsaW50RXh0ZW5zaW9uQmFzZSwgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgRXNsaW50VXRpbCB9IGZyb20gJy4uL3V0aWxzL2VzbGludFV0aWwuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZ2l0SHViVXRpbCB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJy4uL3V0aWxzL2dsb2JVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgY29tYmluZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jIH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcbmltcG9ydCB7IGdldFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyB9IGZyb20gJy4uL3V0aWxzL3RzY29uZmlnQmFzZS5qcyc7XG5pbXBvcnQgeyBnZXRQaW5uZWREZXBlbmRlbmN5U3BlY2lmaWVyIH0gZnJvbSAnLi4vdXRpbHMvd2lsbGJvb3N0ZXJDb25maWdzVXRpbC5qcyc7XG5cbmNvbnN0IGpzQ29tbW9uRGVwcyA9IFtcbiAgJ0Blc2xpbnQvanMnLFxuICAnZXNsaW50JyxcbiAgJ2VzbGludC1jb25maWctZmxhdC1naXRpZ25vcmUnLFxuICAnZXNsaW50LWNvbmZpZy1wcmV0dGllcicsXG4gICdlc2xpbnQtcGx1Z2luLWltcG9ydC14JyxcbiAgJ2VzbGludC1wbHVnaW4tc29ydC1jbGFzcy1tZW1iZXJzJyxcbiAgJ2VzbGludC1wbHVnaW4tc29ydC1kZXN0cnVjdHVyZS1rZXlzJyxcbiAgJ2VzbGludC1wbHVnaW4tdW5pY29ybicsXG4gICdlc2xpbnQtcGx1Z2luLXVudXNlZC1pbXBvcnRzJyxcbiAgJ2dsb2JhbHMnLFxuXTtcblxuY29uc3QgdHNDb21tb25EZXBzID0gWy4uLmpzQ29tbW9uRGVwcywgJ3R5cGVzY3JpcHQtZXNsaW50JywgJ2VzbGludC1pbXBvcnQtcmVzb2x2ZXItdHlwZXNjcmlwdCddO1xuXG5jb25zdCByZWFjdENvbW1vbkRlcHMgPSBbJ2VzbGludC1wbHVnaW4tcmVhY3QnLCAnZXNsaW50LXBsdWdpbi1yZWFjdC1ob29rcycsICdlc2xpbnQtcGx1Z2luLXJlYWN0LWNvbXBpbGVyJ107XG5cbmNvbnN0IGVzbGludERlcHM6IFJlY29yZDxFc2xpbnRFeHRlbnNpb25CYXNlLCBzdHJpbmdbXT4gPSB7XG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcyc6IFsnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMnLCAuLi5qc0NvbW1vbkRlcHNdLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMtcmVhY3QnOiBbJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzLXJlYWN0JywgLi4uanNDb21tb25EZXBzLCAuLi5yZWFjdENvbW1vbkRlcHNdLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMnOiBbJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzJywgLi4udHNDb21tb25EZXBzXSxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzLXJlYWN0JzogWydAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cy1yZWFjdCcsIC4uLnRzQ29tbW9uRGVwcywgLi4ucmVhY3RDb21tb25EZXBzXSxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLW5leHQnOiBbXG4gICAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLW5leHQnLFxuICAgICdAbmV4dC9lc2xpbnQtcGx1Z2luLW5leHQnLFxuICAgIC4uLnRzQ29tbW9uRGVwcyxcbiAgICAuLi5yZWFjdENvbW1vbkRlcHMsXG4gIF0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQYWNrYWdlSnNvbihcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBza2lwQWRkaW5nRGVwczogYm9vbGVhblxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVQYWNrYWdlSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBjb3JlKGNvbmZpZywgcm9vdENvbmZpZywgc2tpcEFkZGluZ0RlcHMpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29yZShjb25maWc6IFBhY2thZ2VDb25maWcsIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsIHNraXBBZGRpbmdEZXBzOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIGNvbnN0IGpzb25UZXh0ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gIGNvbnN0IGpzb25PYmogPSBKU09OLnBhcnNlKGpzb25UZXh0KSBhcyBQYWNrYWdlSnNvbjtcbiAganNvbk9iai5zY3JpcHRzID0ganNvbk9iai5zY3JpcHRzID8/IHt9O1xuICBqc29uT2JqLmRlcGVuZGVuY2llcyA9IGpzb25PYmouZGVwZW5kZW5jaWVzID8/IHt9O1xuICBqc29uT2JqLmRldkRlcGVuZGVuY2llcyA9IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICBqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXMgPSBqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXMgPz8ge307XG4gIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gY29uZmlnLmlzQnVuID8gJ2J1bicgOiAneWFybic7XG5cbiAgYXdhaXQgcmVtb3ZlRGVwcmVjYXRlZFN0dWZmKGpzb25PYmogYXMgU2V0UmVxdWlyZWQ8UGFja2FnZUpzb24sICdzY3JpcHRzJyB8ICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcyc+KTtcblxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhqc29uT2JqLnNjcmlwdHMgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPikpIHtcbiAgICAvLyBGcmVzaCByZXBvIHN0aWxsIHJlcXVpcmVzICd5YXJuIGluc3RhbGwnXG4gICAgaWYgKCF2YWx1ZS5pbmNsdWRlcygnZ2l0IGNsb25lJykpIHtcbiAgICAgIGpzb25PYmouc2NyaXB0c1trZXldID0gdmFsdWUucmVwbGFjZSgveWFyblxccyomJlxccyovLCAnJykucmVwbGFjZSgveWFyblxccyppbnN0YWxsXFxzKiYmXFxzKi8sICcnKTtcbiAgICB9XG4gIH1cblxuICBqc29uT2JqLnNjcmlwdHMgPSBtZXJnZShqc29uT2JqLnNjcmlwdHMsIGdlbmVyYXRlU2NyaXB0cyhjb25maWcsIGpzb25PYmouc2NyaXB0cykpO1xuXG4gIGlmICgnY2hlY2stZm9yLWFpJyBpbiBqc29uT2JqLnNjcmlwdHMpIHtcbiAgICBpZiAoJ2dlbi1jb2RlJyBpbiBqc29uT2JqLnNjcmlwdHMpIHtcbiAgICAgIGpzb25PYmouc2NyaXB0c1snY2hlY2stZm9yLWFpJ10gPSBgJHtwYWNrYWdlTWFuYWdlcn0gZ2VuLWNvZGUgPiAvZGV2L251bGwgJiYgJHtqc29uT2JqLnNjcmlwdHNbJ2NoZWNrLWZvci1haSddfWA7XG4gICAgfVxuICAgIGpzb25PYmouc2NyaXB0c1snY2hlY2stZm9yLWFpJ10gPSBgJHtwYWNrYWdlTWFuYWdlcn0gaW5zdGFsbCA+IC9kZXYvbnVsbCAmJiAke2pzb25PYmouc2NyaXB0c1snY2hlY2stZm9yLWFpJ119YDtcbiAgfVxuXG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLnByZXR0aWZ5O1xuICB9IGVsc2Uge1xuICAgIGpzb25PYmouc2NyaXB0cy5wcmV0dGlmeSA9IChqc29uT2JqLnNjcmlwdHMucHJldHRpZnkgPz8gJycpICsgKGF3YWl0IGdlbmVyYXRlUHJldHRpZXJTdWZmaXgoY29uZmlnLmRpclBhdGgpKTtcbiAgfVxuICAvLyBEZWFsIHdpdGggYnJlYWtpbmcgY2hhbmdlcyBpbiB5YXJuIGJlcnJ5IDQuMC4wLXJjLjQ5XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGpzb25PYmouc2NyaXB0cykpIHtcbiAgICBpZiAoIXZhbHVlPy5pbmNsdWRlcygneWFybiB3b3Jrc3BhY2VzIGZvcmVhY2gnKSkgY29udGludWU7XG4gICAgaWYgKFxuICAgICAgdmFsdWUuaW5jbHVkZXMoJy0tYWxsJykgfHxcbiAgICAgIHZhbHVlLmluY2x1ZGVzKCctLXJlY3Vyc2l2ZScpIHx8XG4gICAgICB2YWx1ZS5pbmNsdWRlcygnLS1zaW5jZScpIHx8XG4gICAgICB2YWx1ZS5pbmNsdWRlcygnLS13b3JrdHJlZScpXG4gICAgKVxuICAgICAgY29udGludWU7XG4gICAganNvbk9iai5zY3JpcHRzW2tleV0gPSB2YWx1ZS5yZXBsYWNlKCd5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCcsICd5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCcpO1xuICB9XG5cbiAgbGV0IGRlcGVuZGVuY2llczogc3RyaW5nW10gPSBbXTtcbiAgbGV0IGRldkRlcGVuZGVuY2llcyA9IFsncHJldHRpZXInLCAnc29ydC1wYWNrYWdlLWpzb24nXTtcbiAgY29uc3QgcG9ldHJ5RGV2RGVwZW5kZW5jaWVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGlmIChcbiAgICAhZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocm9vdENvbmZpZy5kaXJQYXRoLCAnLnByZXR0aWVycmMuanNvbicpKSAmJlxuICAgICFmcy5leGlzdHNTeW5jKHBhdGguam9pbihjb25maWcuZGlyUGF0aCwgJy5wcmV0dGllcnJjLmpzb24nKSlcbiAgKSB7XG4gICAganNvbk9iai5wcmV0dGllciA9ICdAd2lsbGJvb3N0ZXIvcHJldHRpZXItY29uZmlnJztcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgncHJldHRpZXItcGx1Z2luLWphdmEnLCAnQHdpbGxib29zdGVyL3ByZXR0aWVyLWNvbmZpZycpO1xuICB9XG5cbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydsaW50LXN0YWdlZCddO1xuICBkZWxldGUgKGpzb25PYmogYXMgUGFja2FnZUpzb24gJiB7ICdsaW50LXN0YWdlZCc/OiB1bmtub3duIH0pWydsaW50LXN0YWdlZCddO1xuXG4gIGlmIChjb25maWcuaXNSb290KSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLmh1c2t5O1xuICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5waW5zdDtcbiAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLnBvc3RpbnN0YWxsO1xuICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucG9zdHB1Ymxpc2g7XG4gICAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5wcmVwdWJsaXNoT25seTtcbiAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLnByZXBhY2s7XG4gICAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5wb3N0cGFjaztcbiAgICBqc29uT2JqLnNjcmlwdHMucHJlcGFyZSA9ICdsZWZ0aG9vayBpbnN0YWxsIHx8IHRydWUnO1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdsZWZ0aG9vaycpO1xuXG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuc2VtYW50aWNSZWxlYXNlKSB7XG4gICAgICBpZiAoXG4gICAgICAgICFqc29uT2JqLmRldkRlcGVuZGVuY2llc1snc2VtYW50aWMtcmVsZWFzZSddICYmXG4gICAgICAgICFqc29uT2JqLmRldkRlcGVuZGVuY2llc1snbXVsdGktc2VtYW50aWMtcmVsZWFzZSddICYmXG4gICAgICAgICFqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHFpd2kvbXVsdGktc2VtYW50aWMtcmVsZWFzZSddXG4gICAgICApIHtcbiAgICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ3NlbWFudGljLXJlbGVhc2UnKTtcbiAgICAgIH1cbiAgICAgIGpzb25PYmoudmVyc2lvbiA9ICcwLjAuMC1zZW1hbnRpY2FsbHktcmVsZWFzZWQnO1xuICAgIH1cblxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRUZXN0KSB7XG4gICAgICAvLyBTaW5jZSBhcnRpbGxlcnkgcmVxdWlyZXMgYSBzcGVjaWZpYyB2ZXJzaW9uIG9mIEBwbGF5d3JpZ2h0L3Rlc3RcbiAgICAgIGNvbnN0IGhhc0FydGlsbGVyeSA9IGpzb25PYmouZGVwZW5kZW5jaWVzLmFydGlsbGVyeSB8fCBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5hcnRpbGxlcnk7XG4gICAgICAvLyBTaW5jZSBsbG0tdG9vbGJveCByZXF1aXJlcyBAcGxheXdyaWdodC90ZXN0IGluIGRlcGVuZGVuY2llc1xuICAgICAgaWYgKCFoYXNBcnRpbGxlcnkgJiYgIWpzb25PYmouZGVwZW5kZW5jaWVzWydAcGxheXdyaWdodC90ZXN0J10pIHtcbiAgICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0BwbGF5d3JpZ2h0L3Rlc3QnKTtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzWydAcGxheXdyaWdodC90ZXN0J107XG4gICAgICB9XG4gICAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXMucGxheXdyaWdodDtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5wbGF5d3JpZ2h0O1xuICAgIH1cblxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMpIHtcbiAgICAgIC8vIFdlIGRvbid0IGFsbG93IG5vbi1hcnJheSB3b3Jrc3BhY2VzIGluIG1vbm9yZXBvLlxuICAgICAganNvbk9iai53b3Jrc3BhY2VzID0gQXJyYXkuaXNBcnJheShqc29uT2JqLndvcmtzcGFjZXMpXG4gICAgICAgID8gbWVyZ2UuYWxsKFtqc29uT2JqLndvcmtzcGFjZXMsIFsncGFja2FnZXMvKiddXSwge1xuICAgICAgICAgICAgYXJyYXlNZXJnZTogY29tYmluZU1lcmdlLFxuICAgICAgICAgIH0pXG4gICAgICAgIDogWydwYWNrYWdlcy8qJ107XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGpzb25PYmoud29ya3NwYWNlcykpIHtcbiAgICAgIGpzb25PYmoud29ya3NwYWNlcyA9IGpzb25PYmoud29ya3NwYWNlcy5maWx0ZXIoXG4gICAgICAgICh3b3Jrc3BhY2UpID0+XG4gICAgICAgICAgZmcuZ2xvYlN5bmMod29ya3NwYWNlLCB7XG4gICAgICAgICAgICBkb3Q6IHRydWUsXG4gICAgICAgICAgICBjd2Q6IGNvbmZpZy5kaXJQYXRoLFxuICAgICAgICAgICAgaWdub3JlOiBnbG9iSWdub3JlLFxuICAgICAgICAgIH0pLmxlbmd0aCA+IDBcbiAgICAgICk7XG4gICAgICBpZiAoanNvbk9iai53b3Jrc3BhY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBkZWxldGUganNvbk9iai53b3Jrc3BhY2VzO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcuZGVwZW5kaW5nLndiIHx8IGNvbmZpZy5pc0J1bikge1xuICAgIGlmIChqc29uT2JqLmRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3diJ10pIHtcbiAgICAgIGRlcGVuZGVuY2llcy5wdXNoKCdAd2lsbGJvb3N0ZXIvd2InKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0B3aWxsYm9vc3Rlci93YicpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhqc29uT2JqLnNjcmlwdHMgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPikpIHtcbiAgICAgIGpzb25PYmouc2NyaXB0c1trZXldID0gdmFsdWUucmVwbGFjZSgvd2JcXHMrZGIvLCAnd2IgcHJpc21hJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKFxuICAgIGNvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHQgfHxcbiAgICBjb25maWcuZG9lc0NvbnRhaW5KYXZhU2NyaXB0SW5QYWNrYWdlcyB8fFxuICAgIGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHxcbiAgICBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlc1xuICApIHtcbiAgICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnQGJpb21lanMvYmlvbWUnLCAnQHdpbGxib29zdGVyL2Jpb21lLWNvbmZpZycpO1xuICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLmVzbGludDtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5taWNyb21hdGNoO1xuICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWyd0eXBlc2NyaXB0LWVzbGludCddO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnZXNsaW50JywgJ21pY3JvbWF0Y2gnKTtcbiAgICB9XG4gIH1cblxuICBpZiAoXG4gICAgY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdCB8fFxuICAgIGNvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHRJblBhY2thZ2VzIHx8XG4gICAgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fFxuICAgIGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzXG4gICkge1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKC4uLmdldFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyhjb25maWcpKTtcbiAgfVxuXG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzKSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ3R5cGVzY3JpcHQnKTtcbiAgICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnQHR5cGVzL2J1bicpO1xuICAgIH0gZWxzZSBpZiAoIWNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAdHlwZXMvbm9kZScpO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBqc29uT2JqLmRlcGVuZGVuY2llcy5qZXN0IHx8XG4gICAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5qZXN0IHx8XG4gICAgICBqc29uT2JqLmRlcGVuZGVuY2llc1snQGplc3QvZ2xvYmFscyddIHx8XG4gICAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQGplc3QvZ2xvYmFscyddIHx8XG4gICAgICBqc29uT2JqLmRlcGVuZGVuY2llc1sndHMtamVzdCddIHx8XG4gICAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llc1sndHMtamVzdCddXG4gICAgKSB7XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnQHR5cGVzL2plc3QnKTtcbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlnLmVzbGludEJhc2UpIHtcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCguLi5lc2xpbnREZXBzW2NvbmZpZy5lc2xpbnRCYXNlXSk7XG4gIH1cblxuICBpZiAoY29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzKSB7XG4gICAgZGVwZW5kZW5jaWVzID0gZGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhZGVwLmluY2x1ZGVzKCdAd2lsbGJvb3N0ZXIvJykpO1xuICAgIGRldkRlcGVuZGVuY2llcyA9IGRldkRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWRlcC5pbmNsdWRlcygnQHdpbGxib29zdGVyLycpKTtcbiAgfVxuXG4gIGlmICghanNvbk9iai5uYW1lKSB7XG4gICAganNvbk9iai5uYW1lID0gcGF0aC5iYXNlbmFtZShjb25maWcuZGlyUGF0aCk7XG4gIH1cblxuICBpZiAoY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zKSB7XG4gICAganNvbk9iai5wcml2YXRlID0gdHJ1ZTtcbiAgfVxuICBpZiAoIWpzb25PYmoubGljZW5zZSkge1xuICAgIGpzb25PYmoubGljZW5zZSA9ICdVTkxJQ0VOU0VEJztcbiAgfVxuICBpZiAoIWpzb25PYmoucHJpdmF0ZSAmJiBqc29uT2JqLmxpY2Vuc2UgIT09ICdVTkxJQ0VOU0VEJyAmJiByb290Q29uZmlnLmlzUHVibGljUmVwbykge1xuICAgIGpzb25PYmoucHVibGlzaENvbmZpZyA/Pz0ge307XG4gICAganNvbk9iai5wdWJsaXNoQ29uZmlnLmFjY2VzcyA/Pz0gJ3B1YmxpYyc7XG4gIH1cbiAgY29uc3QgW293bmVyXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShjb25maWcucmVwb3NpdG9yeSA/PyAnJyk7XG4gIGlmIChvd25lciA9PT0gJ1dpbGxCb29zdGVyJyB8fCBvd25lciA9PT0gJ1dpbGxCb29zdGVyTGFiJykge1xuICAgIGpzb25PYmouYXV0aG9yID0gJ1dpbGxCb29zdGVyIEluYy4nO1xuICB9XG4gIGlmICghY29uZmlnLmlzUm9vdCAmJiBqc29uT2JqLnByaXZhdGUgJiYgIWpzb25PYmoubWFpbikge1xuICAgIC8vIE1ha2UgVlNDb2RlIHBvc3NpYmxlIHRvIHJlZmFjdG9yIGNvZGUgYWNyb3NzIHN1YnBhY2thZ2VzLlxuICAgIGpzb25PYmoubWFpbiA9ICcuL3NyYyc7XG4gIH1cblxuICAvLyBCZWNhdXNlIGBcInJlc29sdXRpb25zXCI6IHsgXCJucG0vY2hhbGtcIjogXCJeNC4xLjJcIiB9LGAgY2F1c2VzIFwiSW52YWxpZCBucG0gdG9rZW5cIlxuICBkZWxldGUganNvbk9iai5yZXNvbHV0aW9ucz8uWyducG0vY2hhbGsnXTtcblxuICBpZiAoIWNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucykge1xuICAgIGlmICghY29uZmlnLmlzQnVuKSB7XG4gICAgICBpZiAoIWNvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHQgJiYgIWNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQpIHtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5saW50O1xuICAgICAgICBkZWxldGUganNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddO1xuICAgICAgICBmb3IgKGNvbnN0IHNjcmlwdE5hbWUgb2YgWydjbGVhbnVwJywgJ2NoZWNrLWZvci1haSddKSB7XG4gICAgICAgICAgY29uc3Qgc2NyaXB0ID0ganNvbk9iai5zY3JpcHRzW3NjcmlwdE5hbWVdO1xuICAgICAgICAgIGlmICghc2NyaXB0KSBjb250aW51ZTtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHNbc2NyaXB0TmFtZV0gPSBzY3JpcHQucmVwbGFjZSgvID8mJiA/eWFybiBsaW50LWZpeCg/OiAtLXF1aWV0KT8vLCAnJyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGpzb25PYmouc2NyaXB0c1snbGludC1maXgnXSA9IChqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J10gPz8gJycpICsgRXNsaW50VXRpbC5nZXRMaW50Rml4U3VmZml4KGNvbmZpZyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBqc29uT2JqLnNjcmlwdHMubGludCA9ICdmbHV0dGVyIGFuYWx5emUnO1xuICAgICAganNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddID0gJ3lhcm4gbGludCc7XG4gICAgICBjb25zdCBkaXJzID0gWydsaWInLCAndGVzdCcsICd0ZXN0X2RyaXZlciddLmZpbHRlcigoZGlyKSA9PiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgZGlyKSkpO1xuICAgICAgaWYgKGRpcnMubGVuZ3RoID4gMCkge1xuICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2Zvcm1hdC1jb2RlJ10gPSBgZGFydCBmb3JtYXQgJChmaW5kICR7ZGlycy5qb2luKFxuICAgICAgICAgICcgJ1xuICAgICAgICApfSAtbmFtZSBnZW5lcmF0ZWQgLXBydW5lIC1vIC1uYW1lICcqLmZyZWV6ZWQuZGFydCcgLXBydW5lIC1vIC1uYW1lICcqLmcuZGFydCcgLXBydW5lIC1vIC1uYW1lICcqLmRhcnQnIC1wcmludClgO1xuICAgICAgICBqc29uT2JqLnNjcmlwdHMuZm9ybWF0ID0gKGpzb25PYmouc2NyaXB0cy5mb3JtYXQgPz8gJycpICsgYCAmJiB5YXJuIGZvcm1hdC1jb2RlYDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jaykge1xuICAgICAgaWYgKGpzb25PYmouc2NyaXB0cy5wb3N0aW5zdGFsbCA9PT0gJ3BvZXRyeSBpbnN0YWxsJykge1xuICAgICAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLnBvc3RpbnN0YWxsO1xuICAgICAgfVxuICAgICAgY29uc3QgcHl0aG9uRmlsZXMgPSBhd2FpdCBmZy5nbG9iKCcqKi8qLnB5Jywge1xuICAgICAgICBjd2Q6IGNvbmZpZy5kaXJQYXRoLFxuICAgICAgICBkb3Q6IHRydWUsXG4gICAgICAgIGlnbm9yZTogZ2xvYklnbm9yZSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZGlyTmFtZVNldCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgZm9yIChjb25zdCBweXRob25GaWxlIG9mIHB5dGhvbkZpbGVzKSB7XG4gICAgICAgIGNvbnN0IFtmaXJzdCwgc2Vjb25kXSA9IHB5dGhvbkZpbGUuc3BsaXQoL1svXFxcXF0vKTtcbiAgICAgICAgaWYgKGZpcnN0ICYmIHNlY29uZCkge1xuICAgICAgICAgIGRpck5hbWVTZXQuYWRkKGZpcnN0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGRpck5hbWVTZXQuc2l6ZSA+IDApIHtcbiAgICAgICAgY29uc3QgZGlyTmFtZXNTdHIgPSBbLi4uZGlyTmFtZVNldF0uam9pbignICcpO1xuICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2Zvcm1hdC1jb2RlJ10gPVxuICAgICAgICAgIGBwb2V0cnkgcnVuIGlzb3J0IC0tcHJvZmlsZSBibGFjayAke2Rpck5hbWVzU3RyfSAmJiBwb2V0cnkgcnVuIGJsYWNrICR7ZGlyTmFtZXNTdHJ9YDtcbiAgICAgICAgaWYgKGpzb25PYmouc2NyaXB0cy5saW50KSB7XG4gICAgICAgICAganNvbk9iai5zY3JpcHRzLmxpbnQgPSBgcG9ldHJ5IHJ1biBmbGFrZTggJHtkaXJOYW1lc1N0cn0gJiYgJHtqc29uT2JqLnNjcmlwdHMubGludH1gO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGpzb25PYmouc2NyaXB0cy5saW50ID0gYHBvZXRyeSBydW4gZmxha2U4ICR7ZGlyTmFtZXNTdHJ9YDtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J10gPSAneWFybiBsaW50JztcbiAgICAgICAgfVxuICAgICAgICBqc29uT2JqLnNjcmlwdHMuZm9ybWF0ID0gKGpzb25PYmouc2NyaXB0cy5mb3JtYXQgPz8gJycpICsgYCAmJiB5YXJuIGZvcm1hdC1jb2RlYDtcbiAgICAgICAgcG9ldHJ5RGV2RGVwZW5kZW5jaWVzLnB1c2goJ2JsYWNrJywgJ2lzb3J0JywgJ2ZsYWtlOCcpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcucmVwb3NpdG9yeSB8fCBqc29uT2JqLnJlcG9zaXRvcnkpIHtcbiAgICBqc29uT2JqLnJlcG9zaXRvcnkgPSBmb3JtYXRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24oY29uZmlnLnJlcG9zaXRvcnkgPz8ganNvbk9iai5yZXBvc2l0b3J5LCBqc29uT2JqLnJlcG9zaXRvcnkpO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHopIHtcbiAgICBpZiAoIWpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXT8uc3RhcnRzV2l0aCgnYmxpdHogY29kZWdlbicpKSB7XG4gICAgICBqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10gPSAnYmxpdHogY29kZWdlbic7XG4gICAgfSBlbHNlIGlmICghanNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddLmluY2x1ZGVzKCdibGl0eiBwcmlzbWEgZ2VuZXJhdGUnKSkge1xuICAgICAganNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddID0ganNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddLnJlcGxhY2UoXG4gICAgICAgICdibGl0eiBjb2RlZ2VuJyxcbiAgICAgICAgJ2JsaXR6IGNvZGVnZW4gJiYgYmxpdHogcHJpc21hIGdlbmVyYXRlJ1xuICAgICAgKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEgJiYgIWpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXT8uc3RhcnRzV2l0aCgncHJpc21hIGdlbmVyYXRlJykpIHtcbiAgICBqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10gPSAncHJpc21hIGdlbmVyYXRlJztcbiAgfVxuXG4gIGlmICghanNvbk9iai5kZXBlbmRlbmNpZXMucHJldHRpZXIpIHtcbiAgICAvLyBCZWNhdXNlIEB0eXBlcy9wcmV0dGllciBibG9ja3MgcHJldHRpZXIgZXhlY3V0aW9uLlxuICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHR5cGVzL3ByZXR0aWVyJ107XG4gIH1cblxuICBpZiAoT2JqZWN0LmtleXMoanNvbk9iai5kZXBlbmRlbmNpZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llcztcbiAgfVxuICBpZiAoT2JqZWN0LmtleXMoanNvbk9iai5kZXZEZXBlbmRlbmNpZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llcztcbiAgfVxuICBpZiAoT2JqZWN0LmtleXMoanNvbk9iai5wZWVyRGVwZW5kZW5jaWVzKS5sZW5ndGggPT09IDApIHtcbiAgICBkZWxldGUganNvbk9iai5wZWVyRGVwZW5kZW5jaWVzO1xuICB9XG5cbiAgYXdhaXQgdXBkYXRlUHJpdmF0ZVBhY2thZ2VzKGpzb25PYmopO1xuXG4gIGlmIChjb25maWcuaXNCdW4pIGRlbGV0ZSBqc29uT2JqLnBhY2thZ2VNYW5hZ2VyO1xuICBsZXQgbmV3SnNvblRleHQgPSBKU09OLnN0cmluZ2lmeShqc29uT2JqKTtcbiAgbmV3SnNvblRleHQgPSBhd2FpdCBmaXhTY3JpcHROYW1lcyhqc29uT2JqLnNjcmlwdHMsIG5ld0pzb25UZXh0LCBjb25maWcpO1xuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoZmlsZVBhdGgsIG5ld0pzb25UZXh0KTtcblxuICBpZiAoIXNraXBBZGRpbmdEZXBzKSB7XG4gICAgLy8gV2UgY2Fubm90IGFkZCBkZXBlbmRlbmNpZXMgd2hpY2ggYXJlIGFscmVhZHkgaW5jbHVkZWQgaW4gZGV2RGVwZW5kZW5jaWVzLlxuICAgIGRlcGVuZGVuY2llcyA9IGRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzPy5bZGVwXSk7XG4gICAgaWYgKGRlcGVuZGVuY2llcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCB1bmlxdWVEZXBlbmRlbmNpZXMgPSBbLi4ubmV3IFNldChkZXBlbmRlbmNpZXMpXTtcbiAgICAgIGNvbnN0IGRlcGVuZGVuY3lTcGVjaWZpZXJzID0gdW5pcXVlRGVwZW5kZW5jaWVzLm1hcCgoZGVwZW5kZW5jeSkgPT4gZ2V0RGVwZW5kZW5jeVNwZWNpZmllcihkZXBlbmRlbmN5KSk7XG4gICAgICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydyZW1vdmUnLCAuLi51bmlxdWVEZXBlbmRlbmNpZXNdLCBjb25maWcuZGlyUGF0aCk7XG4gICAgICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydhZGQnLCAnLS1leGFjdCcsIC4uLmRlcGVuZGVuY3lTcGVjaWZpZXJzXSwgY29uZmlnLmRpclBhdGgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSW50ZW50aW9uYWxseSBvbWl0IHZlcnNpb25zIHRvIHVwZGF0ZSBkZXBlbmRlbmNpZXMgdG8gdGhlIGxhdGVzdCB2ZXJzaW9ucyB3aXRoIFlhcm4uXG4gICAgICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydhZGQnLCAuLi5kZXBlbmRlbmN5U3BlY2lmaWVyc10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gV2UgY2Fubm90IGFkZCBkZXZEZXBlbmRlbmNpZXMgd2hpY2ggYXJlIGFscmVhZHkgaW5jbHVkZWQgaW4gZGVwZW5kZW5jaWVzLlxuICAgIGRldkRlcGVuZGVuY2llcyA9IGRldkRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWpzb25PYmouZGVwZW5kZW5jaWVzPy5bZGVwXSk7XG4gICAgaWYgKGRldkRlcGVuZGVuY2llcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCB1bmlxdWVEZXZEZXBlbmRlbmNpZXMgPSBbLi4ubmV3IFNldChkZXZEZXBlbmRlbmNpZXMpXTtcbiAgICAgIGNvbnN0IGRldkRlcGVuZGVuY3lTcGVjaWZpZXJzID0gdW5pcXVlRGV2RGVwZW5kZW5jaWVzLm1hcCgoZGVwZW5kZW5jeSkgPT4gZ2V0RGVwZW5kZW5jeVNwZWNpZmllcihkZXBlbmRlbmN5KSk7XG4gICAgICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydyZW1vdmUnLCAuLi51bmlxdWVEZXZEZXBlbmRlbmNpZXNdLCBjb25maWcuZGlyUGF0aCk7XG4gICAgICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydhZGQnLCAnLUQnLCAnLS1leGFjdCcsIC4uLmRldkRlcGVuZGVuY3lTcGVjaWZpZXJzXSwgY29uZmlnLmRpclBhdGgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSW50ZW50aW9uYWxseSBvbWl0IHZlcnNpb25zIHRvIHVwZGF0ZSBkZXBlbmRlbmNpZXMgdG8gdGhlIGxhdGVzdCB2ZXJzaW9ucyB3aXRoIFlhcm4uXG4gICAgICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydhZGQnLCAnLUQnLCAuLi5kZXZEZXBlbmRlbmN5U3BlY2lmaWVyc10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHBvZXRyeURldkRlcGVuZGVuY2llcy5sZW5ndGggPiAwKSB7XG4gICAgICBzcGF3blN5bmMoJ3BvZXRyeScsIFsnYWRkJywgJy0tZ3JvdXAnLCAnZGV2JywgLi4ubmV3IFNldChwb2V0cnlEZXZEZXBlbmRlbmNpZXMpXSwgY29uZmlnLmRpclBhdGgpO1xuICAgIH1cbiAgfVxufVxuXG4vLyBUT0RPOiByZW1vdmUgdGhlIGZvbGxvd2luZyBtaWdyYXRpb24gY29kZSBpbiBmdXR1cmVcbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZURlcHJlY2F0ZWRTdHVmZihcbiAganNvbk9iajogU2V0UmVxdWlyZWQ8UGFja2FnZUpzb24sICdzY3JpcHRzJyB8ICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcyc+XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKGpzb25PYmouYXV0aG9yID09PSAnV2lsbEJvb3N0ZXIgTExDJykge1xuICAgIGpzb25PYmouYXV0aG9yID0gJ1dpbGxCb29zdGVyIEluYy4nO1xuICB9XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3NvcnQtcGFja2FnZS1qc29uJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3NvcnQtYWxsLXBhY2thZ2UtanNvbiddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWyd0eXBlY2hlY2svd2FybiddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWyd0eXBlY2hlY2s6Z2VuLWNvZGUnXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sndHlwZWNoZWNrOmNvZGVnZW4nXTtcbiAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzLnRzbGliO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL2VzbGludC1jb25maWctcmVhY3QnXTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvcmVub3ZhdGUtY29uZmlnJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3RzY29uZmlnJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snZXNsaW50LWltcG9ydC1yZXNvbHZlci1ub2RlJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snZXNsaW50LXBsdWdpbi1wcmV0dGllciddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXMubGVybmE7XG4gIC8vIFRvIGluc3RhbGwgdGhlIGxhdGVzdCBwaW5zdFxuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXMucGluc3Q7XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2ZsdXR0ZXItZm9ybWF0J107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2Zvcm1hdC1mbHV0dGVyJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3B5dGhvbi1mb3JtYXQnXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snZm9ybWF0LXB5dGhvbiddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzLnByZXR0aWVyO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydjaGVjay1hbGwnXTtcbiAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKCdsZXJuYS5qc29uJywgeyBmb3JjZTogdHJ1ZSB9KSk7XG5cbiAgLy8gTWlncmF0ZSBmcm9tIEVTTGludCBsZWdhY3kgY29uZmlncyB0byBmbGF0IGNvbmZpZ3MsXG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHR5cGVzY3JpcHQtZXNsaW50L2VzbGludC1wbHVnaW4nXTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAdHlwZXNjcmlwdC1lc2xpbnQvcGFyc2VyJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snZXNsaW50LXBsdWdpbi1pbXBvcnQnXTtcbn1cblxuZnVuY3Rpb24gZ2V0RGVwZW5kZW5jeVNwZWNpZmllcihkZXBlbmRlbmN5OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gZ2V0UGlubmVkRGVwZW5kZW5jeVNwZWNpZmllcihkZXBlbmRlbmN5KSA/PyBkZXBlbmRlbmN5O1xufVxuXG5mdW5jdGlvbiBmb3JtYXRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24oXG4gIHJlcG9zaXRvcnk6IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J10sXG4gIGV4aXN0aW5nUmVwb3NpdG9yeT86IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J11cbik6IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J10ge1xuICBjb25zdCBub3JtYWxpemVkUmVwb3NpdG9yeSA9IG5vcm1hbGl6ZVJlcG9zaXRvcnlVcmxGb3JQYWNrYWdlSnNvbihyZXBvc2l0b3J5KTtcbiAgaWYgKG5vcm1hbGl6ZWRSZXBvc2l0b3J5KSB7XG4gICAgcmV0dXJuIGJ1aWxkTm9ybWFsaXplZFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbihub3JtYWxpemVkUmVwb3NpdG9yeSwgcmVwb3NpdG9yeSwgZXhpc3RpbmdSZXBvc2l0b3J5KTtcbiAgfVxuXG4gIGNvbnN0IG5vcm1hbGl6ZWRFeGlzdGluZ1JlcG9zaXRvcnkgPSBub3JtYWxpemVSZXBvc2l0b3J5VXJsRm9yUGFja2FnZUpzb24oZXhpc3RpbmdSZXBvc2l0b3J5KTtcbiAgaWYgKG5vcm1hbGl6ZWRFeGlzdGluZ1JlcG9zaXRvcnkpIHtcbiAgICByZXR1cm4gYnVpbGROb3JtYWxpemVkUmVwb3NpdG9yeUZvclBhY2thZ2VKc29uKG5vcm1hbGl6ZWRFeGlzdGluZ1JlcG9zaXRvcnksIGV4aXN0aW5nUmVwb3NpdG9yeSk7XG4gIH1cblxuICByZXR1cm4gcmVwb3NpdG9yeTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplUmVwb3NpdG9yeVVybEZvclBhY2thZ2VKc29uKHJlcG9zaXRvcnk6IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J10pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAodHlwZW9mIHJlcG9zaXRvcnkgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKCFyZXBvc2l0b3J5LnN0YXJ0c1dpdGgoJ2dpdGh1YjonKSkgcmV0dXJuO1xuXG4gICAgY29uc3QgW293bmVyLCByZXBvXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShyZXBvc2l0b3J5KTtcbiAgICBpZiAoIW93bmVyIHx8ICFyZXBvKSByZXR1cm47XG4gICAgcmV0dXJuIGBnaXQraHR0cHM6Ly9naXRodWIuY29tLyR7b3duZXJ9LyR7cmVwb30uZ2l0YDtcbiAgfVxuXG4gIGNvbnN0IHJlcG9zaXRvcnlVcmwgPSByZXBvc2l0b3J5Py51cmw7XG4gIGlmICh0eXBlb2YgcmVwb3NpdG9yeVVybCAhPT0gJ3N0cmluZycpIHJldHVybjtcblxuICBjb25zdCBtYXRjaGVkID0gL14oPzpnaXRcXCspP2h0dHBzOlxcL1xcL2dpdGh1YlxcLmNvbVxcLyhbXi9dKylcXC8oW14vXSs/KSg/OlxcLmdpdCk/JC91LmV4ZWMocmVwb3NpdG9yeVVybCk7XG4gIGlmICghbWF0Y2hlZCkgcmV0dXJuO1xuXG4gIGNvbnN0IFssIG93bmVyLCByZXBvXSA9IG1hdGNoZWQ7XG4gIHJldHVybiBgZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS8ke293bmVyfS8ke3JlcG99LmdpdGA7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkTm9ybWFsaXplZFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbihcbiAgbm9ybWFsaXplZFVybDogc3RyaW5nLFxuICByZXBvc2l0b3J5OiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddLFxuICBleGlzdGluZ1JlcG9zaXRvcnk/OiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddXG4pOiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddIHtcbiAgY29uc3QgcmVwb3NpdG9yeU9iaiA9XG4gICAgdHlwZW9mIHJlcG9zaXRvcnkgPT09ICdvYmplY3QnXG4gICAgICA/IHJlcG9zaXRvcnlcbiAgICAgIDogdHlwZW9mIGV4aXN0aW5nUmVwb3NpdG9yeSA9PT0gJ29iamVjdCdcbiAgICAgICAgPyBleGlzdGluZ1JlcG9zaXRvcnlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5yZXBvc2l0b3J5T2JqLFxuICAgIHR5cGU6ICdnaXQnLFxuICAgIHVybDogbm9ybWFsaXplZFVybCxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlU2NyaXB0cyhjb25maWc6IFBhY2thZ2VDb25maWcsIG9sZFNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgIGNvbnN0IGhhc1R5cGVjaGVjayA9IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXM7XG4gICAgY29uc3Qgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICdjaGVjay1hbGwtZm9yLWFpJzogJ2J1biBydW4gY2hlY2stZm9yLWFpICYmIGJ1biBydW4gdGVzdCcsXG4gICAgICAnY2hlY2stZm9yLWFpJzogYGJ1biBydW4gY2xlYW51cCR7aGFzVHlwZWNoZWNrID8gJyAmJiBidW4gcnVuIHR5cGVjaGVjaycgOiAnJ31gLFxuICAgICAgY2xlYW51cDogJ2J1biAtLWJ1biB3YiBsaW50IC0tZml4IC0tZm9ybWF0JyxcbiAgICAgIGZvcm1hdDogYGJ1biAtLWJ1biB3YiBsaW50IC0tZm9ybWF0YCxcbiAgICAgIGxpbnQ6IGBidW4gLS1idW4gd2IgbGludGAsXG4gICAgICAnbGludC1maXgnOiAnYnVuIC0tYnVuIHdiIGxpbnQgLS1maXgnLFxuICAgICAgdGVzdDogJ2J1biB3YiB0ZXN0JyxcbiAgICAgIHR5cGVjaGVjazogJ2J1biAtLWJ1biB3YiB0eXBlY2hlY2snLFxuICAgIH07XG4gICAgaWYgKCFoYXNUeXBlY2hlY2spIHtcbiAgICAgIGRlbGV0ZSBzY3JpcHRzLnR5cGVjaGVjaztcbiAgICB9XG4gICAgcmV0dXJuIHNjcmlwdHM7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgaGFzVHlwZWNoZWNrID0gY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcztcbiAgICBjb25zdCBvbGRUZXN0ID0gb2xkU2NyaXB0cy50ZXN0O1xuICAgIGxldCBzY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgJ2NoZWNrLWFsbC1mb3ItYWknOiAneWFybiBjaGVjay1mb3ItYWkgJiYgeWFybiB0ZXN0JyxcbiAgICAgICdjaGVjay1mb3ItYWknOiBgeWFybiBmb3JtYXQgPiAvZGV2L251bGwgMj4gL2Rldi9udWxsIHx8IHRydWUke1xuICAgICAgICBoYXNUeXBlY2hlY2sgPyAnICYmIHlhcm4gdHlwZWNoZWNrJyA6ICcnXG4gICAgICB9ICYmIHlhcm4gbGludC1maXggLS1xdWlldGAsXG4gICAgICBjbGVhbnVwOiAneWFybiBmb3JtYXQgJiYgeWFybiBsaW50LWZpeCcsXG4gICAgICBmb3JtYXQ6IGBzb3J0LXBhY2thZ2UtanNvbiAmJiB5YXJuIHByZXR0aWZ5YCxcbiAgICAgIGxpbnQ6IGBlc2xpbnQgLS1jb2xvcmAsXG4gICAgICAnbGludC1maXgnOiAneWFybiBsaW50IC0tZml4JyxcbiAgICAgIHByZXR0aWZ5OiBgcHJldHRpZXIgLS1jYWNoZSAtLWNvbG9yIC0td3JpdGUgXCIqKi97LiovLH0qLnske2V4dGVuc2lvbnMucHJldHRpZXIuam9pbignLCcpfX1cIiBcIiEqKi90ZXN0ey0sL31maXh0dXJlcy8qKlwiYCxcbiAgICAgIHR5cGVjaGVjazogJ3RzYyAtLW5vRW1pdCcsXG4gICAgfTtcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zKSB7XG4gICAgICBzY3JpcHRzID0gbWVyZ2UoXG4gICAgICAgIHsgLi4uc2NyaXB0cyB9LFxuICAgICAgICB7XG4gICAgICAgICAgZm9ybWF0OiBgc29ydC1wYWNrYWdlLWpzb24gJiYgeWFybiBwcmV0dGlmeSAmJiB5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCAtLXBhcmFsbGVsIC0tdmVyYm9zZSBydW4gZm9ybWF0YCxcbiAgICAgICAgICBsaW50OiBgeWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwgLS1wYXJhbGxlbCAtLXZlcmJvc2UgcnVuIGxpbnRgLFxuICAgICAgICAgICdsaW50LWZpeCc6ICd5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCAtLXBhcmFsbGVsIC0tdmVyYm9zZSBydW4gbGludC1maXgnLFxuICAgICAgICAgIHByZXR0aWZ5OiBgcHJldHRpZXIgLS1jYWNoZSAtLWNvbG9yIC0td3JpdGUgXCIqKi97LiovLH0qLnske2V4dGVuc2lvbnMucHJldHRpZXIuam9pbihcbiAgICAgICAgICAgICcsJ1xuICAgICAgICAgICl9fVwiIFwiISoqL3BhY2thZ2VzLyoqXCIgXCIhKiovdGVzdHstLC99Zml4dHVyZXMvKipcImAsXG4gICAgICAgICAgLy8gQ0k9MSBwcmV2ZW50cyB2aXRlc3QgZnJvbSBlbmFibGluZyB3YXRjaC5cbiAgICAgICAgICAvLyBGT1JDRV9DT0xPUj0zIG1ha2Ugd2IgZW5hYmxlIGNvbG9yIG91dHB1dC5cbiAgICAgICAgICB0ZXN0OiAnQ0k9MSBGT1JDRV9DT0xPUj0zIHlhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsIC0tdmVyYm9zZSBydW4gdGVzdCcsXG4gICAgICAgICAgdHlwZWNoZWNrOiAneWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwgLS1wYXJhbGxlbCAtLXZlcmJvc2UgcnVuIHR5cGVjaGVjaycsXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChjb25maWcuZGVwZW5kaW5nLnB5cmlnaHQpIHtcbiAgICAgIHNjcmlwdHMudHlwZWNoZWNrID0gc2NyaXB0cy50eXBlY2hlY2sgPyBgJHtzY3JpcHRzLnR5cGVjaGVja30gJiYgYCA6ICcnO1xuICAgICAgc2NyaXB0cy50eXBlY2hlY2sgKz0gJ3B5cmlnaHQnO1xuICAgIH1cbiAgICBpZiAob2xkVGVzdD8uaW5jbHVkZXMoJ3diIHRlc3QnKSkge1xuICAgICAgc2NyaXB0cy50ZXN0ID0gb2xkVGVzdDtcbiAgICB9XG5cbiAgICBpZiAoIWhhc1R5cGVjaGVjaykge1xuICAgICAgZGVsZXRlIHNjcmlwdHMudHlwZWNoZWNrO1xuICAgIH0gZWxzZSBpZiAoY29uZmlnLmRlcGVuZGluZy53Yikge1xuICAgICAgc2NyaXB0cy50eXBlY2hlY2sgPSAnd2IgdHlwZWNoZWNrJztcbiAgICB9XG4gICAgcmV0dXJuIHNjcmlwdHM7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQcmV0dGllclN1ZmZpeChkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLnByZXR0aWVyaWdub3JlJyk7XG4gIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICBjb25zdCBpbmRleCA9IGV4aXN0aW5nQ29udGVudC5pbmRleE9mKGlnbm9yZUZpbGVVdGlsLnNlcGFyYXRvclByZWZpeCk7XG4gIGlmIChpbmRleCA9PT0gLTEpIHJldHVybiAnJztcblxuICBjb25zdCBvcmlnaW5hbENvbnRlbnQgPSBleGlzdGluZ0NvbnRlbnQuc2xpY2UoMCwgaW5kZXgpO1xuICBjb25zdCBsaW5lcyA9IG9yaWdpbmFsQ29udGVudFxuICAgIC5zcGxpdCgnXFxuJylcbiAgICAubWFwKChsaW5lKSA9PiB7XG4gICAgICBjb25zdCBuZXdMaW5lID0gbGluZS50cmltKCk7XG4gICAgICByZXR1cm4gbmV3TGluZS5lbmRzV2l0aCgnLycpID8gbmV3TGluZS5zbGljZSgwLCAtMSkgOiBuZXdMaW5lO1xuICAgIH0pXG4gICAgLmZpbHRlcigobCkgPT4gbCAmJiAhbC5zdGFydHNXaXRoKCcjJykgJiYgIWwuaW5jbHVkZXMoJy8nKSk7XG5cbiAgcmV0dXJuIGAke2xpbmVzLm1hcCgobGluZSkgPT4gYCBcIiEqKi8ke2xpbmV9LyoqXCJgKS5qb2luKCcnKX0gfHwgdHJ1ZWA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZpeFNjcmlwdE5hbWVzKFxuICBzY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzLFxuICBuZXdKc29uVGV4dDogc3RyaW5nLFxuICBjb25maWc6IFBhY2thZ2VDb25maWdcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IG9sZEFuZE5ld1NjcmlwdE5hbWVzOiBbc3RyaW5nLCBzdHJpbmddW10gPSBbXTtcbiAgZm9yIChjb25zdCBba2V5XSBvZiBPYmplY3Qua2V5cyhzY3JpcHRzKSkge1xuICAgIGlmIChrZXkgJiYgIWtleS5zdGFydHNXaXRoKCc6JykgJiYga2V5LmluY2x1ZGVzKCc6JykpIHtcbiAgICAgIG9sZEFuZE5ld1NjcmlwdE5hbWVzLnB1c2goW2tleSwga2V5LnJlcGxhY2VBbGwoJzonLCAnLScpXSk7XG4gICAgfVxuICB9XG4gIGlmIChvbGRBbmROZXdTY3JpcHROYW1lcy5sZW5ndGggPT09IDApIHJldHVybiBuZXdKc29uVGV4dDtcblxuICBmb3IgKGNvbnN0IFtvbGROYW1lLCBuZXdOYW1lXSBvZiBvbGRBbmROZXdTY3JpcHROYW1lcykge1xuICAgIG5ld0pzb25UZXh0ID0gbmV3SnNvblRleHQucmVwbGFjZUFsbChvbGROYW1lLCBuZXdOYW1lKTtcbiAgfVxuICBjb25zdCBmaWxlcyA9IGF3YWl0IGZnLmdsb2IoWycqKi8qLnttZCxjanMsbWpzLGpzLGpzeCxjdHMsbXRzLHRzLHRzeH0nLCAnKiovRG9ja2VyZmlsZSddLCB7XG4gICAgY3dkOiBjb25maWcuZGlyUGF0aCxcbiAgICBkb3Q6IHRydWUsXG4gICAgaWdub3JlOiBnbG9iSWdub3JlLFxuICB9KTtcbiAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCBmaWxlKTtcbiAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGxldCBuZXdDb250ZW50ID0gb2xkQ29udGVudDtcbiAgICAgIGZvciAoY29uc3QgW29sZE5hbWUsIG5ld05hbWVdIG9mIG9sZEFuZE5ld1NjcmlwdE5hbWVzKSB7XG4gICAgICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2VBbGwob2xkTmFtZSwgbmV3TmFtZSk7XG4gICAgICB9XG4gICAgICBpZiAobmV3Q29udGVudCAhPT0gb2xkQ29udGVudCkge1xuICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgcmV0dXJuIG5ld0pzb25UZXh0O1xufVxuXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVQcml2YXRlUGFja2FnZXMoanNvbk9iajogUGFja2FnZUpzb24pOiBQcm9taXNlPHZvaWQ+IHtcbiAganNvbk9iai5kZXBlbmRlbmNpZXMgPSBqc29uT2JqLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAganNvbk9iai5kZXZEZXBlbmRlbmNpZXMgPSBqc29uT2JqLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAgY29uc3QgcGFja2FnZU5hbWVzID0gbmV3IFNldChbLi4uT2JqZWN0LmtleXMoanNvbk9iai5kZXBlbmRlbmNpZXMpLCAuLi5PYmplY3Qua2V5cyhqc29uT2JqLmRldkRlcGVuZGVuY2llcyldKTtcbiAgaWYgKHBhY2thZ2VOYW1lcy5oYXMoJ0B3aWxsYm9vc3Rlci9hdXRoJykgJiYgIWlzV29ya3NwYWNlUGFja2FnZShqc29uT2JqLCAnQHdpbGxib29zdGVyL2F1dGgnKSkge1xuICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL2F1dGgnXTtcbiAgICBqc29uT2JqLmRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL2F1dGgnXSA9IGF3YWl0IGdldExhdGVzdFByaXZhdGVQYWNrYWdlU3BlY2lmaWVyKCdhdXRoJyk7XG4gIH1cbiAgaWYgKHBhY2thZ2VOYW1lcy5oYXMoJ0BkaXNjb3JkLWJvdC9zaGFyZWQnKSAmJiAhaXNXb3Jrc3BhY2VQYWNrYWdlKGpzb25PYmosICdAZGlzY29yZC1ib3Qvc2hhcmVkJykpIHtcbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0BkaXNjb3JkLWJvdC9zaGFyZWQnXTtcbiAgICBqc29uT2JqLmRlcGVuZGVuY2llc1snQGRpc2NvcmQtYm90L3NoYXJlZCddID0gYXdhaXQgZ2V0TGF0ZXN0UHJpdmF0ZVBhY2thZ2VTcGVjaWZpZXIoJ2Rpc2NvcmQtYm90Jyk7XG4gIH1cblxuICBpZiAocGFja2FnZU5hbWVzLmhhcygnQHdpbGxib29zdGVyL2NvZGUtYW5hbHl6ZXInKSAmJiAhaXNXb3Jrc3BhY2VQYWNrYWdlKGpzb25PYmosICdAd2lsbGJvb3N0ZXIvY29kZS1hbmFseXplcicpKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvY29kZS1hbmFseXplciddO1xuICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvY29kZS1hbmFseXplciddID0gYXdhaXQgZ2V0TGF0ZXN0UHJpdmF0ZVBhY2thZ2VTcGVjaWZpZXIoJ2NvZGUtYW5hbHl6ZXInKTtcbiAgfVxuICBpZiAocGFja2FnZU5hbWVzLmhhcygnQHdpbGxib29zdGVyL2p1ZGdlJykgJiYgIWlzV29ya3NwYWNlUGFja2FnZShqc29uT2JqLCAnQHdpbGxib29zdGVyL2p1ZGdlJykpIHtcbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9qdWRnZSddO1xuICAgIGpzb25PYmouZGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvanVkZ2UnXSA9IGF3YWl0IGdldExhdGVzdFByaXZhdGVQYWNrYWdlU3BlY2lmaWVyKCdqdWRnZScpO1xuICB9XG4gIGlmIChwYWNrYWdlTmFtZXMuaGFzKCdAd2lsbGJvb3N0ZXIvbGxtLXByb3h5JykgJiYgIWlzV29ya3NwYWNlUGFja2FnZShqc29uT2JqLCAnQHdpbGxib29zdGVyL2xsbS1wcm94eScpKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvbGxtLXByb3h5J107XG4gICAganNvbk9iai5kZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9sbG0tcHJveHknXSA9IGF3YWl0IGdldExhdGVzdFByaXZhdGVQYWNrYWdlU3BlY2lmaWVyKCdsbG0tcHJveHknKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRMYXRlc3RQcml2YXRlUGFja2FnZVNwZWNpZmllcihyZXBvOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBjb21taXRIYXNoID0gYXdhaXQgZ2V0TGF0ZXN0Q29tbWl0SGFzaCgnV2lsbEJvb3N0ZXJMYWInLCByZXBvKTtcbiAgcmV0dXJuIGBnaXRAZ2l0aHViLmNvbTpXaWxsQm9vc3RlckxhYi8ke3JlcG99LmdpdCMke2NvbW1pdEhhc2h9YDtcbn1cblxuZnVuY3Rpb24gaXNXb3Jrc3BhY2VQYWNrYWdlKGpzb25PYmo6IFBhY2thZ2VKc29uLCBwYWNrYWdlTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAoanNvbk9iai5kZXZEZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV0gfHwganNvbk9iai5kZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV0gfHwgJycpLmluY2x1ZGVzKCd3b3Jrc3BhY2UnKTtcbn1cbiIsImltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHNjb25maWdFeHRlbmRzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgIHJldHVybiAnQHRzY29uZmlnL2J1bi90c2NvbmZpZy5qc29uJztcbiAgfVxuICBpZiAoY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgIHJldHVybiAnQHRzY29uZmlnL3JlYWN0LW5hdGl2ZS90c2NvbmZpZy5qc29uJztcbiAgfVxuICByZXR1cm4gWydAdHNjb25maWcvbm9kZS1sdHMvdHNjb25maWcuanNvbicsICdAdHNjb25maWcvbm9kZS10cy90c2NvbmZpZy5qc29uJ107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nW10ge1xuICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgcmV0dXJuIFsnQHRzY29uZmlnL2J1biddO1xuICB9XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgcmV0dXJuIFsnQHRzY29uZmlnL3JlYWN0LW5hdGl2ZSddO1xuICB9XG4gIHJldHVybiBbJ0B0c2NvbmZpZy9ub2RlLWx0cycsICdAdHNjb25maWcvbm9kZS10cyddO1xufVxuIiwiaW1wb3J0IHsgc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0IH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldExhdGVzdENvbW1pdEhhc2gob3JnYW5pemF0aW9uOiBzdHJpbmcsIHJlcG86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVwb1VybCA9IGBnaXRAZ2l0aHViLmNvbToke29yZ2FuaXphdGlvbn0vJHtyZXBvfS5naXRgO1xuICAgIGNvbnN0IG91dHB1dCA9IHNwYXduU3luY0FuZFJldHVyblN0ZG91dCgnZ2l0JywgWydscy1yZW1vdGUnLCByZXBvVXJsLCAnSEVBRCddLCBwcm9jZXNzLmN3ZCgpKTtcbiAgICBjb25zdCBjb21taXRIYXNoID0gb3V0cHV0LnNwbGl0KC9cXHMrLylbMF07XG4gICAgaWYgKCFjb21taXRIYXNoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGNvbW1pdHMgZm91bmQgZm9yICR7b3JnYW5pemF0aW9ufS8ke3JlcG99YCk7XG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoY29tbWl0SGFzaCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgRmFpbGVkIHRvIGZldGNoIGNvbW1pdHMgZm9yICR7b3JnYW5pemF0aW9ufS8ke3JlcG99OiAke1N0cmluZyhlcnJvcil9YCkpO1xuICB9XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeWFtbCBmcm9tICdqcy15YW1sJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuXG5pbXBvcnQgeyBnZW5lcmF0ZVNjcmlwdHMgfSBmcm9tICcuL3BhY2thZ2VKc29uLmpzJztcblxuaW50ZXJmYWNlIExlZnRob29rU2V0dGluZ3Mge1xuICAncG9zdC1tZXJnZSc6IHtcbiAgICBzY3JpcHRzOiB7XG4gICAgICAncHJlcGFyZS5zaCc6IHtcbiAgICAgICAgcnVubmVyOiAnYmFzaCc7XG4gICAgICB9O1xuICAgIH07XG4gIH07XG4gICdwcmUtY29tbWl0Jzoge1xuICAgIGNvbW1hbmRzOiB7XG4gICAgICBjbGVhbnVwOiB7XG4gICAgICAgIGdsb2I6IHN0cmluZztcbiAgICAgICAgcnVuOiBzdHJpbmc7XG4gICAgICB9O1xuICAgICAgJ2NoZWNrLW1pZ3JhdGlvbnMnOiB7XG4gICAgICAgIGdsb2I6IHN0cmluZztcbiAgICAgICAgcnVuOiBzdHJpbmc7XG4gICAgICB9O1xuICAgIH07XG4gIH07XG4gICdwcmUtcHVzaCc6IHtcbiAgICBzY3JpcHRzOiB7XG4gICAgICAnY2hlY2suc2gnOiB7XG4gICAgICAgIHJ1bm5lcjogJ2Jhc2gnO1xuICAgICAgfTtcbiAgICB9O1xuICB9O1xufVxuXG5jb25zdCBiYXNlU2V0dGluZ3M6IE9taXQ8TGVmdGhvb2tTZXR0aW5ncywgJ3ByZS1jb21taXQnPiA9IHtcbiAgJ3Bvc3QtbWVyZ2UnOiB7XG4gICAgc2NyaXB0czoge1xuICAgICAgJ3ByZXBhcmUuc2gnOiB7XG4gICAgICAgIHJ1bm5lcjogJ2Jhc2gnLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAncHJlLXB1c2gnOiB7XG4gICAgc2NyaXB0czoge1xuICAgICAgJ2NoZWNrLnNoJzoge1xuICAgICAgICBydW5uZXI6ICdiYXNoJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbn07XG5cbmNvbnN0IHByZUNvbW1pdFNldHRpbmdzOiBMZWZ0aG9va1NldHRpbmdzWydwcmUtY29tbWl0J10gPSB7XG4gIGNvbW1hbmRzOiB7XG4gICAgY2xlYW51cDoge1xuICAgICAgZ2xvYjogJycsXG4gICAgICBydW46ICcnLFxuICAgIH0sXG4gICAgJ2NoZWNrLW1pZ3JhdGlvbnMnOiB7XG4gICAgICBnbG9iOiAnKiovbWlncmF0aW9uLnNxbCcsXG4gICAgICBydW46IGBcbmlmIGdyZXAgLXEgJ1dhcm5pbmdzOicge3N0YWdlZF9maWxlc307IHRoZW5cbiAgZWNobyBcIk1pZ3JhdGlvbiBTUUwgZmlsZXMgKHtzdGFnZWRfZmlsZXN9KSBjb250YWluIHdhcm5pbmdzISBQbGVhc2Ugc29sdmUgdGhlIHdhcm5pbmdzIGFuZCBjb21taXQgYWdhaW4uXCJcbiAgZXhpdCAxXG5maVxuYC50cmltKCksXG4gICAgfSxcbiAgfSxcbn07XG5cbmNvbnN0IHNjcmlwdHMgPSB7XG4gIHBvc3RNZXJnZTogYFxuIyEvYmluL2Jhc2hcblxuY2hhbmdlZF9maWxlcz1cIiQoZ2l0IGRpZmYtdHJlZSAtciAtLW5hbWUtb25seSAtLW5vLWNvbW1pdC1pZCBPUklHX0hFQUQgSEVBRClcIlxuXG5ydW5faWZfY2hhbmdlZCgpIHtcbiAgaWYgZWNobyBcIiRjaGFuZ2VkX2ZpbGVzXCIgfCBncmVwIC0tcXVpZXQgLUUgXCIkMVwiOyB0aGVuXG4gICAgZXZhbCBcIiQyXCJcbiAgZmlcbn1cbmAudHJpbSgpLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlTGVmdGhvb2tVcGRhdGluZ1BhY2thZ2VKc29uKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlTGVmdGhvb2tVcGRhdGluZ1BhY2thZ2VKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IGNvcmUoY29uZmlnKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcubGVmdGhvb2snKTtcbiAgY29uc3QgaHVza3lEaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmh1c2t5Jyk7XG4gIGNvbnN0IGhhc0h1c2t5RGlyID0gZnMuZXhpc3RzU3luYyhodXNreURpclBhdGgpO1xuICBjb25zdCB7IHR5cGVjaGVjayB9ID0gZ2VuZXJhdGVTY3JpcHRzKGNvbmZpZywge30pO1xuICBjb25zdCBzZXR0aW5nczogUGFydGlhbDxMZWZ0aG9va1NldHRpbmdzPiA9IHtcbiAgICAuLi5iYXNlU2V0dGluZ3MsXG4gICAgJ3ByZS1jb21taXQnOiB7XG4gICAgICAuLi5wcmVDb21taXRTZXR0aW5ncyxcbiAgICAgIGNvbW1hbmRzOiB7XG4gICAgICAgIC4uLnByZUNvbW1pdFNldHRpbmdzLmNvbW1hbmRzLFxuICAgICAgICBjbGVhbnVwOiB7XG4gICAgICAgICAgLi4ucHJlQ29tbWl0U2V0dGluZ3MuY29tbWFuZHMuY2xlYW51cCxcbiAgICAgICAgICBnbG9iOiBnZXRDbGVhbnVwR2xvYnMoY29uZmlnKSxcbiAgICAgICAgICBydW46IGdldENsZWFudXBDb21tYW5kKGNvbmZpZyksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIH07XG4gIGlmICghdHlwZWNoZWNrKSB7XG4gICAgZGVsZXRlIHNldHRpbmdzWydwcmUtcHVzaCddO1xuICB9XG4gIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICBmcy5wcm9taXNlcy53cml0ZUZpbGUoXG4gICAgICBwYXRoLmpvaW4oY29uZmlnLmRpclBhdGgsICdsZWZ0aG9vay55bWwnKSxcbiAgICAgIHlhbWwuZHVtcChzZXR0aW5ncywge1xuICAgICAgICBsaW5lV2lkdGg6IC0xLFxuICAgICAgICBub0NvbXBhdE1vZGU6IHRydWUsXG4gICAgICAgIHN0eWxlczoge1xuICAgICAgICAgICchIW51bGwnOiAnZW1wdHknLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICApLFxuICAgIGZzLnByb21pc2VzLnJtKGRpclBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KSxcbiAgXSk7XG4gIGlmIChoYXNIdXNreURpcikge1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIGZzLnByb21pc2VzLnJtKGh1c2t5RGlyUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pLFxuICAgICAgZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmh1c2t5cmMuanNvbicpLCB7IGZvcmNlOiB0cnVlIH0pLFxuICAgIF0pO1xuICAgIHNwYXduU3luYygnZ2l0JywgWydjb25maWcnLCAnLS11bnNldCcsICdjb3JlLmhvb2tzUGF0aCddLCBjb25maWcuZGlyUGF0aCk7XG4gIH1cblxuICBpZiAodHlwZWNoZWNrKSB7XG4gICAgY29uc3QgcHJlUHVzaCA9IGdldFByZVB1c2hTY3JpcHQoY29uZmlnKTtcbiAgICBmcy5ta2RpclN5bmMocGF0aC5qb2luKGRpclBhdGgsICdwcmUtcHVzaCcpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgIGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLmpvaW4oZGlyUGF0aCwgJ3ByZS1wdXNoJywgJ2NoZWNrLnNoJyksIHByZVB1c2ggKyAnXFxuJywge1xuICAgICAgICBtb2RlOiAwbzc1NSxcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuICBjb25zdCBwb3N0TWVyZ2VDb21tYW5kID0gYCR7c2NyaXB0cy5wb3N0TWVyZ2V9XFxuXFxuJHtnZW5lcmF0ZVBvc3RNZXJnZUNvbW1hbmRzKGNvbmZpZykuam9pbignXFxuJyl9XFxuYDtcbiAgZnMubWtkaXJTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncG9zdC1tZXJnZScpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncG9zdC1tZXJnZScsICdwcmVwYXJlLnNoJyksIHBvc3RNZXJnZUNvbW1hbmQsIHtcbiAgICAgIG1vZGU6IDBvNzU1LFxuICAgIH0pXG4gICk7XG59XG5cbmZ1bmN0aW9uIGdldFByZVB1c2hTY3JpcHQoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgbGV0IHR5cGVjaGVja0NvbW1hbmQ6IHN0cmluZztcbiAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgIHR5cGVjaGVja0NvbW1hbmQgPSBjb25maWcuZGVwZW5kaW5nLndiID8gJ2J1biAtLWJ1biB3YiB0eXBlY2hlY2snIDogJ2J1biBydW4gdHlwZWNoZWNrJztcbiAgfSBlbHNlIHtcbiAgICB0eXBlY2hlY2tDb21tYW5kID0gY29uZmlnLmRlcGVuZGluZy53YiA/ICd5YXJuIHdiIHR5cGVjaGVjaycgOiAneWFybiBydW4gdHlwZWNoZWNrJztcbiAgfVxuICBpZiAoY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKSkge1xuICAgIHJldHVybiBgXG4jIS9iaW4vYmFzaFxuXG5pZiBbICQoZ2l0IGJyYW5jaCAtLXNob3ctY3VycmVudCkgPSBcIm1haW5cIiBdICYmIFsgJChnaXQgY29uZmlnIHVzZXIuZW1haWwpICE9IFwiZXhrYXp1dUBnbWFpbC5jb21cIiBdOyB0aGVuXG4gIGVjaG8gXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIlxuICBlY2hvIFwiKioqIERvbid0IHB1c2ggbWFpbiBicmFuY2ggZGlyZWN0bHkuIFVzZSBQUiEgKioqXCJcbiAgZWNobyBcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiXG4gIGV4aXQgMVxuZmlcblxuJHt0eXBlY2hlY2tDb21tYW5kfVxuYC50cmltKCk7XG4gIH1cbiAgcmV0dXJuIHR5cGVjaGVja0NvbW1hbmQ7XG59XG5cbmZ1bmN0aW9uIGdldENsZWFudXBHbG9icyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBjb25zdCBzdXBwb3J0ZWRFeHRlbnNpb25zID0gW1xuICAgIC4uLmV4dGVuc2lvbnMucHJldHRpZXIsXG4gICAgLi4uZXh0ZW5zaW9ucy5lc2xpbnQsXG4gICAgLi4uKGNvbmZpZy5kZXBlbmRpbmcud2IgfHwgY29uZmlnLmlzQnVuID8gZXh0ZW5zaW9ucy5iaW9tZSA6IFtdKSxcbiAgXTtcbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2spIHtcbiAgICBzdXBwb3J0ZWRFeHRlbnNpb25zLnB1c2goJ3B5Jyk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgc3VwcG9ydGVkRXh0ZW5zaW9ucy5wdXNoKCdkYXJ0Jyk7XG4gIH1cbiAgY29uc3QgZmlsdGVyZWRFeHRlbnNpb25zID0gWy4uLm5ldyBTZXQoc3VwcG9ydGVkRXh0ZW5zaW9ucyldXG4gICAgLmZpbHRlcigoZXh0ZW5zaW9uKSA9PiBjb25maWcuaXNCdW4gfHwgIVsnYXN0cm8nLCAnZ3FsJywgJ3N2ZWx0ZSddLmluY2x1ZGVzKGV4dGVuc2lvbikpXG4gICAgLnRvU29ydGVkKCk7XG4gIHJldHVybiBgKiovKi57JHtmaWx0ZXJlZEV4dGVuc2lvbnMuam9pbignLCcpfX1gO1xufVxuXG5mdW5jdGlvbiBnZXRDbGVhbnVwQ29tbWFuZChjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBpZiAoaGFzTG9jYWxXYldvcmtzcGFjZShjb25maWcpKSB7XG4gICAgcmV0dXJuICd5YXJuIHdvcmtzcGFjZSBAd2lsbGJvb3N0ZXIvd2Igc3RhcnQgLS13b3JraW5nLWRpciBcIiQoZ2l0IHJldi1wYXJzZSAtLXNob3ctdG9wbGV2ZWwpXCIgbGludCAtLWZpeCAtLWZvcm1hdCAtLSB7c3RhZ2VkX2ZpbGVzfSAmJiBnaXQgYWRkIC0tIHtzdGFnZWRfZmlsZXN9JztcbiAgfVxuICBpZiAoY29uZmlnLmlzQnVuIHx8IGNvbmZpZy5kZXBlbmRpbmcud2IpIHtcbiAgICBjb25zdCBwYWNrYWdlTWFuYWdlciA9IGNvbmZpZy5pc0J1biA/ICdidW4nIDogJ3lhcm4nO1xuICAgIGNvbnN0IGNvbW1hbmQgPSBjb25maWcuZGVwZW5kaW5nLndiXG4gICAgICA/IGAke2NvbmZpZy5pc0J1biA/ICdidW4gLS1idW4gd2InIDogJ3lhcm4gd2InfSBsaW50IC0tZml4IC0tZm9ybWF0IC0tIHtzdGFnZWRfZmlsZXN9YFxuICAgICAgOiBgJHtwYWNrYWdlTWFuYWdlcn0gcnVuIGZvcm1hdCAmJiAke3BhY2thZ2VNYW5hZ2VyfSBydW4gbGludC1maXhgO1xuICAgIHJldHVybiBgJHtjb21tYW5kfSAmJiBnaXQgYWRkIC0tIHtzdGFnZWRfZmlsZXN9YDtcbiAgfVxuXG4gIGNvbnN0IGVzbGludFJ1bGVTdWZmaXggPVxuICAgIGNvbmZpZy5kb2VzQ29udGFpbkpzeE9yVHN4IHx8IGNvbmZpZy5kb2VzQ29udGFpbkpzeE9yVHN4SW5QYWNrYWdlc1xuICAgICAgPyAnIC0tcnVsZSBcInsgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzOiAwIH1cIidcbiAgICAgIDogJyc7XG4gIGNvbnN0IGVzbGludFBhdHRlcm4gPSBleHRlbnNpb25zLmVzbGludC5tYXAoKGV4dGVuc2lvbikgPT4gU3RyaW5nLnJhd2BcXC4ke2V4dGVuc2lvbn0kYCkuam9pbignfCcpO1xuXG4gIHJldHVybiBTdHJpbmcucmF3YFxuZXNsaW50X2ZpbGVzPVwiJChwcmludGYgJyVzXFxuJyB7c3RhZ2VkX2ZpbGVzfSB8IGdyZXAgLUUgJygke2VzbGludFBhdHRlcm59KScgfHwgdHJ1ZSlcIlxucGFja2FnZV9qc29uX2ZpbGVzPVwiJChwcmludGYgJyVzXFxuJyB7c3RhZ2VkX2ZpbGVzfSB8IGdyZXAgLUUgJyhefC8pcGFja2FnZVxcLmpzb24kJyB8fCB0cnVlKVwiXG4ke2NvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2sgPyBTdHJpbmcucmF3YHB5dGhvbl9maWxlcz1cIiQocHJpbnRmICclc1xcbicge3N0YWdlZF9maWxlc30gfCBncmVwIC1FICdcXC5weSQnIHx8IHRydWUpXCJgIDogJyd9XG4ke2NvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sID8gU3RyaW5nLnJhd2BkYXJ0X2ZpbGVzPVwiJChwcmludGYgJyVzXFxuJyB7c3RhZ2VkX2ZpbGVzfSB8IGdyZXAgLUUgJ1xcLmRhcnQkJyB8IGdyZXAgLXYgJ2dlbmVyYXRlZCcgfCBncmVwIC12ICdcXC5mcmVlemVkXFwuZGFydCQnIHwgZ3JlcCAtdiAnXFwuZ1xcLmRhcnQkJyB8fCB0cnVlKVwiYCA6ICcnfVxuXG5ub2RlIG5vZGVfbW9kdWxlcy8uYmluL3ByZXR0aWVyIC0tY2FjaGUgLS13cml0ZSAtLWlnbm9yZS11bmtub3duIC0tIHtzdGFnZWRfZmlsZXN9XG5pZiBbIC1uIFwiJGVzbGludF9maWxlc1wiIF07IHRoZW5cbiAgbm9kZSBub2RlX21vZHVsZXMvLmJpbi9lc2xpbnQgLS1jb2xvciAtLWZpeCR7ZXNsaW50UnVsZVN1ZmZpeH0gLS0gJGVzbGludF9maWxlc1xuZmlcbmlmIFsgLW4gXCIkcGFja2FnZV9qc29uX2ZpbGVzXCIgXTsgdGhlblxuICBub2RlIG5vZGVfbW9kdWxlcy8uYmluL3NvcnQtcGFja2FnZS1qc29uIC0tICRwYWNrYWdlX2pzb25fZmlsZXNcbmZpXG4ke1xuICBjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrXG4gICAgPyBgaWYgWyAtbiBcIiRweXRob25fZmlsZXNcIiBdOyB0aGVuXG4gIHBvZXRyeSBydW4gaXNvcnQgLS1wcm9maWxlIGJsYWNrIC0tZmlsdGVyLWZpbGVzICRweXRob25fZmlsZXNcbiAgcG9ldHJ5IHJ1biBibGFjayAkcHl0aG9uX2ZpbGVzXG4gIHBvZXRyeSBydW4gZmxha2U4ICRweXRob25fZmlsZXNcbmZpYFxuICAgIDogJydcbn1cbiR7XG4gIGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sXG4gICAgPyBgaWYgWyAtbiBcIiRkYXJ0X2ZpbGVzXCIgXTsgdGhlblxuICBkYXJ0IGZvcm1hdCAkZGFydF9maWxlc1xuZmlgXG4gICAgOiAnJ1xufVxuZ2l0IGFkZCAtLSB7c3RhZ2VkX2ZpbGVzfVxuYC50cmltKCk7XG59XG5cbmZ1bmN0aW9uIGhhc0xvY2FsV2JXb3Jrc3BhY2UoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIGlmICghY29uZmlnLmlzUm9vdCkgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IGxvY2FsV2JQYWNrYWdlSnNvblBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdwYWNrYWdlcycsICd3YicsICdwYWNrYWdlLmpzb24nKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGxvY2FsV2JQYWNrYWdlSnNvblBhdGgpKSByZXR1cm4gZmFsc2U7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKGxvY2FsV2JQYWNrYWdlSnNvblBhdGgsICd1dGY4JykpIGFzIHsgbmFtZT86IHN0cmluZyB9O1xuICAgIHJldHVybiBwYWNrYWdlSnNvbi5uYW1lID09PSAnQHdpbGxib29zdGVyL3diJztcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nW10ge1xuICBjb25zdCBwb3N0TWVyZ2VDb21tYW5kczogc3RyaW5nW10gPSBbXTtcbiAgaWYgKGNvbmZpZy5oYXNWZXJzaW9uU2V0dGluZ3MpIHtcbiAgICBjb25zdCB0b29sc0NoYW5nZWRQYXR0ZXJuID0gU3RyaW5nLnJhd2AobWlzZVxcLnRvbWx8XFwubWlzZVxcLnRvbWx8XFwudG9vbC12ZXJzaW9uc3xcXC4uKy12ZXJzaW9uKWA7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiJHt0b29sc0NoYW5nZWRQYXR0ZXJufVwiIFwibWlzZSBpbnN0YWxsXCJgKTtcbiAgfVxuICBjb25zdCBpbnN0YWxsQ29tbWFuZCA9IGNvbmZpZy5pc0J1biA/ICdidW4gaW5zdGFsbCcgOiAneWFybic7XG4gIGNvbnN0IHJtTmV4dERpcmVjdG9yeSA9IGNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHwgY29uZmlnLmRlcGVuZGluZy5uZXh0ID8gJyAmJiBybSAtUmYgLm5leHQnIDogJyc7XG4gIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcInBhY2thZ2VcXC5qc29uXCIgXCIke2luc3RhbGxDb21tYW5kfSR7cm1OZXh0RGlyZWN0b3J5fVwiYCk7XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrKSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwicG9ldHJ5XFwubG9ja1wiIFwicG9ldHJ5IGluc3RhbGxcImApO1xuICB9XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6KSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIuKlxcLnByaXNtYVwiIFwibm9kZSBub2RlX21vZHVsZXMvLmJpbi9ibGl0eiBwcmlzbWEgbWlncmF0ZSBkZXBsb3lcImAsXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiLipcXC5wcmlzbWFcIiBcIm5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vYmxpdHogcHJpc21hIGdlbmVyYXRlXCJgLFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIi4qXFwucHJpc21hXCIgXCJub2RlIG5vZGVfbW9kdWxlcy8uYmluL2JsaXR6IGNvZGVnZW5cImBcbiAgICApO1xuICB9IGVsc2UgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHJpc21hKSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIuKlxcLnByaXNtYVwiIFwibm9kZSBub2RlX21vZHVsZXMvLmJpbi9kb3RlbnYgLWMgZGV2ZWxvcG1lbnQgLS0gbm9kZSBub2RlX21vZHVsZXMvLmJpbi9wcmlzbWEgbWlncmF0ZSBkZXBsb3lcImAsXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiLipcXC5wcmlzbWFcIiBcIm5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vZG90ZW52IC1jIGRldmVsb3BtZW50IC0tIG5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vcHJpc21hIGdlbmVyYXRlXCJgXG4gICAgKTtcbiAgfVxuICByZXR1cm4gcG9zdE1lcmdlQ29tbWFuZHM7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVMaW50c3RhZ2VkcmMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVMaW50c3RhZ2VkcmMnLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKGAke2NvbmZpZy5kaXJQYXRofS8ubGludHN0YWdlZHJjLmNqc2AsIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKGAke2NvbmZpZy5kaXJQYXRofS8ubGludHN0YWdlZHJjLmpzYCwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oYCR7Y29uZmlnLmRpclBhdGh9Ly5saW50c3RhZ2VkcmMuanNvbmAsIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgIF0pO1xuICB9KTtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBpZ25vcmVGaWxlVXRpbCB9IGZyb20gJy4uL3V0aWxzL2lnbm9yZUZpbGVVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBjb21tb25Db250ZW50ID0gYFxuM3JkLXBhcnR5L1xuYW5kcm9pZC9cbmlvcy9cbm5vLWZvcm1hdC9cbnRlc3QtZml4dHVyZXMvXG50ZXN0L2ZpeHR1cmVzL1xuKi5kLnRzXG4qLm1pbi5qc1xuLnlhcm4vXG4ucG5wLmpzXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQcmV0dGllcmlnbm9yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVByZXR0aWVyaWdub3JlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnByZXR0aWVyaWdub3JlJyk7XG4gICAgY29uc3QgY29udGVudCA9IChhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoKSkgPz8gJyc7XG4gICAgY29uc3QgaGVhZFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQpO1xuICAgIGNvbnN0IHRhaWxVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldFRhaWxVc2VyQ29udGVudChjb250ZW50KTtcblxuICAgIGNvbnN0IGdpdGlnbm9yZUZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGlnbm9yZScpO1xuICAgIGNvbnN0IGdpdGlnbm9yZUNvbnRlbnQgPSAoYXdhaXQgaWdub3JlRmlsZVV0aWwucmVhZEdpdGlnbm9yZVdpdGhvdXRTZXBhcmF0b3JzKGdpdGlnbm9yZUZpbGVQYXRoKSkgfHwgJyc7XG5cbiAgICBsZXQgYWRkaXRpb25hbENvbnRlbnQgPSAnJztcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgIGFkZGl0aW9uYWxDb250ZW50ID0gYFxuYW5kcm9pZC9hcHAvXG5pb3MvUnVubmVyL0Fzc2V0cy54Y2Fzc2V0cy9cbnB1YnNwZWMueWFtbFxuYDtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdDb250ZW50ID0gaGVhZFVzZXJDb250ZW50ICsgY29tbW9uQ29udGVudCArIGFkZGl0aW9uYWxDb250ZW50ICsgZ2l0aWdub3JlQ29udGVudCArIHRhaWxVc2VyQ29udGVudDtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IGNsb25lRGVlcCBmcm9tICdsb2Rhc2guY2xvbmVkZWVwJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBqc29uT2JqID0ge1xuICB2ZW52UGF0aDogJy4nLFxuICB2ZW52OiAnLnZlbnYnLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBsZXQgbmV3U2V0dGluZ3M6IG9iamVjdCA9IGNsb25lRGVlcChqc29uT2JqKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3B5cmlnaHRjb25maWcuanNvbicpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBvbGRTZXR0aW5ncyA9IEpTT04ucGFyc2Uob2xkQ29udGVudCkgYXMgb2JqZWN0O1xuICAgICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBzZW1hbnRpY1JlbGVhc2VCYWRnZSA9XG4gICdbIVtzZW1hbnRpYy1yZWxlYXNlXShodHRwczovL2ltZy5zaGllbGRzLmlvL2JhZGdlLyUyMCUyMCVGMCU5RiU5MyVBNiVGMCU5RiU5QSU4MC1zZW1hbnRpYy0tcmVsZWFzZS1lMTAwNzkuc3ZnKV0oaHR0cHM6Ly9naXRodWIuY29tL3NlbWFudGljLXJlbGVhc2Uvc2VtYW50aWMtcmVsZWFzZSknO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZWFkbWUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVSZWFkbWUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdSRUFETUUubWQnKTtcbiAgICBsZXQgbmV3Q29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuXG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnJlbGVhc2VyYy5qc29uJykpKSB7XG4gICAgICBuZXdDb250ZW50ID0gaW5zZXJ0QmFkZ2UobmV3Q29udGVudCwgc2VtYW50aWNSZWxlYXNlQmFkZ2UpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcG9zaXRvcnkgPSBjb25maWcucmVwb3NpdG9yeT8uc2xpY2UoY29uZmlnLnJlcG9zaXRvcnkuaW5kZXhPZignOicpICsgMSk7XG4gICAgY29uc3QgZmlsZU5hbWVzID0gZnMucmVhZGRpclN5bmMoYCR7Y29uZmlnLmRpclBhdGh9Ly5naXRodWIvd29ya2Zsb3dzYCk7XG4gICAgZm9yIChjb25zdCBmaWxlTmFtZSBvZiBmaWxlTmFtZXMpIHtcbiAgICAgIGlmICghZmlsZU5hbWUuc3RhcnRzV2l0aCgndGVzdCcpICYmICFmaWxlTmFtZS5zdGFydHNXaXRoKCdkZXBsb3knKSkgY29udGludWU7XG5cbiAgICAgIGxldCBiYWRnZU5hbWUgPSBmaWxlTmFtZTtcbiAgICAgIGJhZGdlTmFtZSA9IChiYWRnZU5hbWVbMF0gfHwgJycpLnRvVXBwZXJDYXNlKCkgKyBiYWRnZU5hbWUuc2xpY2UoMSwgYmFkZ2VOYW1lLmluZGV4T2YoJy4nKSk7XG4gICAgICBiYWRnZU5hbWUgPSBiYWRnZU5hbWUucmVwbGFjZSgnLScsICcgJyk7XG4gICAgICBpZiAoIXJlcG9zaXRvcnkpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgYmFkZ2UgPSBgWyFbJHtiYWRnZU5hbWV9XShodHRwczovL2dpdGh1Yi5jb20vJHtyZXBvc2l0b3J5fS9hY3Rpb25zL3dvcmtmbG93cy8ke2ZpbGVOYW1lfS9iYWRnZS5zdmcpXShodHRwczovL2dpdGh1Yi5jb20vJHtyZXBvc2l0b3J5fS9hY3Rpb25zL3dvcmtmbG93cy8ke2ZpbGVOYW1lfSlgO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBgLmdpdGh1Yi93b3JrZmxvd3MvJHtmaWxlTmFtZX1gKSkpIHtcbiAgICAgICAgbmV3Q29udGVudCA9IGluc2VydEJhZGdlKG5ld0NvbnRlbnQsIGJhZGdlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluc2VydEJhZGdlKHJlYWRtZTogc3RyaW5nLCBiYWRnZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8g5pei44GrYmFkZ2XjgYzjgYLjgovloLTlkIjjga/liYrpmaRcbiAgcmVhZG1lID0gcmVhZG1lLnJlcGxhY2UoYmFkZ2UsICcnKS5yZXBsYWNlQWxsKC9cXG5cXG5cXG4rL2csICdcXG5cXG4nKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHJlYWRtZS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChyZWFkbWVbaSAtIDFdID09PSAnXFxuJyAmJiByZWFkbWVbaV0gPT09ICdcXG4nKSB7XG4gICAgICBjb25zdCBiZWZvcmUgPSByZWFkbWUuc2xpY2UoMCwgaSArIDEpO1xuICAgICAgbGV0IGFmdGVyID0gcmVhZG1lLnNsaWNlKGkgKyAxKTtcbiAgICAgIGlmICghYWZ0ZXIuc3RhcnRzV2l0aCgnWycpICYmICFhZnRlci5zdGFydHNXaXRoKCchJykpIHtcbiAgICAgICAgYWZ0ZXIgPSBgXFxuJHthZnRlcn1gO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGAke2JlZm9yZX0ke2JhZGdlfVxcbiR7YWZ0ZXJ9YDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGAke3JlYWRtZX1cXG4ke2JhZGdlfVxcbmA7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZWxlYXNlcmMocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUmVsZWFzZXJjJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5yZWxlYXNlcmMuanNvbicpO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHJldHVybjtcblxuICAgIGNvbnN0IHNldHRpbmdzID0gSlNPTi5wYXJzZShhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKSkgYXMge1xuICAgICAgcGx1Z2lucz86IChzdHJpbmcgfCBbc3RyaW5nLCB1bmtub3duXSlbXTtcbiAgICB9O1xuICAgIGNvbnN0IHBsdWdpbnMgPSBzZXR0aW5ncy5wbHVnaW5zID8/IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGx1Z2lucy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgcGx1Z2luID0gQXJyYXkuaXNBcnJheShwbHVnaW5zW2ldKSA/IHBsdWdpbnNbaV0/LlswXSA6IHBsdWdpbnNbaV07XG4gICAgICBjb25zdCBvbGRDb25maWcgPSAoQXJyYXkuaXNBcnJheShwbHVnaW5zW2ldKSAmJiBwbHVnaW5zW2ldPy5bMV0pIHx8IHt9O1xuICAgICAgaWYgKHBsdWdpbiA9PT0gJ0BzZW1hbnRpYy1yZWxlYXNlL2NvbW1pdC1hbmFseXplcicpIHtcbiAgICAgICAgcGx1Z2luc1tpXSA9IFtcbiAgICAgICAgICAnQHNlbWFudGljLXJlbGVhc2UvY29tbWl0LWFuYWx5emVyJyxcbiAgICAgICAgICBtZXJnZS5hbGwoXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIG9sZENvbmZpZyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHByZXNldDogJ2NvbnZlbnRpb25hbGNvbW1pdHMnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfVxuICAgICAgICAgICksXG4gICAgICAgIF07XG4gICAgICB9IGVsc2UgaWYgKHBsdWdpbiA9PT0gJ0BzZW1hbnRpYy1yZWxlYXNlL2dpdGh1YicpIHtcbiAgICAgICAgcGx1Z2luc1tpXSA9IFtcbiAgICAgICAgICAnQHNlbWFudGljLXJlbGVhc2UvZ2l0aHViJyxcbiAgICAgICAgICBtZXJnZS5hbGwoXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIG9sZENvbmZpZyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIC8vIGNmLiBodHRwczovL2dpdGh1Yi5jb20vc2VtYW50aWMtcmVsZWFzZS9zZW1hbnRpYy1yZWxlYXNlL2lzc3Vlcy8yMjA0I2lzc3VlY29tbWVudC0xNTA4NDE3NzA0XG4gICAgICAgICAgICAgICAgc3VjY2Vzc0NvbW1lbnRDb25kaXRpb246IGZhbHNlLFxuICAgICAgICAgICAgICAgIGZhaWxDb21tZW50Q29uZGl0aW9uOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBsYWJlbHM6IFsncjogc2VtYW50aWMtcmVsZWFzZSddLFxuICAgICAgICAgICAgICAgIHJlbGVhc2VkTGFiZWxzOiBbJ3JlbGVhc2VkIDpib29rbWFyazonXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH1cbiAgICAgICAgICApLFxuICAgICAgICBdO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgY2xvbmVEZWVwIGZyb20gJ2xvZGFzaC5jbG9uZWRlZXAnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgb3ZlcndyaXRlTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGpzb25PYmogPSB7XG4gICRzY2hlbWE6ICdodHRwczovL2RvY3MucmVub3ZhdGVib3QuY29tL3Jlbm92YXRlLXNjaGVtYS5qc29uJyxcbiAgZXh0ZW5kczogWydnaXRodWI+V2lsbEJvb3N0ZXIvd2lsbGJvb3N0ZXItY29uZmlnczpyZW5vdmF0ZS5qc29uNSddLFxufTtcblxudHlwZSBTZXR0aW5ncyA9IHR5cGVvZiBqc29uT2JqICYgeyBwYWNrYWdlUnVsZXM/OiB7IG1hdGNoUGFja2FnZU5hbWVzOiBzdHJpbmdbXTsgZW5hYmxlZD86IGJvb2xlYW4gfVtdIH07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVJlbm92YXRlSnNvbihjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVJlbm92YXRlSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBsZXQgbmV3U2V0dGluZ3MgPSBjbG9uZURlZXAoanNvbk9iaikgYXMgU2V0dGluZ3M7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdyZW5vdmF0ZS5qc29uJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoYCR7ZmlsZVBhdGh9NWApKSB7XG4gICAgICAvLyBTaW5jZSBpdCBpcyBkaWZmaWN1bHQgZm9yIHBhcnNpbmcgcmVub3ZhdGUuanNvbjUsIHdlIGRvIG5vdGhpbmdcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG9sZFNldHRpbmdzID0gSlNPTi5wYXJzZShvbGRDb250ZW50KSBhcyBTZXR0aW5ncztcbiAgICAgIG5ld1NldHRpbmdzID0gbWVyZ2UuYWxsKFtuZXdTZXR0aW5ncywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzXSwge1xuICAgICAgICBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSxcbiAgICAgIH0pIGFzIFNldHRpbmdzO1xuICAgICAgbmV3U2V0dGluZ3MuZXh0ZW5kcyA9IG5ld1NldHRpbmdzLmV4dGVuZHMuZmlsdGVyKChpdGVtOiBzdHJpbmcpID0+IGl0ZW0gIT09ICdAd2lsbGJvb3N0ZXInKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICAvLyBEb24ndCB1cGdyYWRlIE5leHQuanMgYXV0b21hdGljYWxseVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6KSB7XG4gICAgICBuZXdTZXR0aW5ncy5wYWNrYWdlUnVsZXMgPz89IFtdO1xuICAgICAgaWYgKFxuICAgICAgICAhbmV3U2V0dGluZ3MucGFja2FnZVJ1bGVzLnNvbWUoKHJ1bGU6IHsgbWF0Y2hQYWNrYWdlTmFtZXM/OiBzdHJpbmdbXSB9KSA9PlxuICAgICAgICAgIHJ1bGUubWF0Y2hQYWNrYWdlTmFtZXM/LmluY2x1ZGVzKCduZXh0JylcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIG5ld1NldHRpbmdzLnBhY2thZ2VSdWxlcy5wdXNoKHsgbWF0Y2hQYWNrYWdlTmFtZXM6IFsnbmV4dCddLCBlbmFibGVkOiBmYWxzZSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmRlcGVuZGFib3QnKSwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5yZW5vdmF0ZXJjLmpzb24nKSwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KG5ld1NldHRpbmdzKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuLy8gY29uc3QgdGFyZ2V0QWdlbnRzID0gWydjbGF1ZGUtY29kZScsICdjb2RleCcsICdjdXJzb3InLCAnZ2VtaW5pLWNsaSddO1xuLy8gY29uc3QgaW5zdGFsbFRhcmdldEFnZW50QXJncyA9IHRhcmdldEFnZW50cy5mbGF0TWFwKChhZ2VudCkgPT4gWyctLWFnZW50JywgYWdlbnRdKTtcbi8vIGNvbnN0IHNraWxsc1JlcG8gPSAnV2lsbEJvb3N0ZXIvYWdlbnQtc2tpbGxzJztcbi8vIGNvbnN0IHBsYXl3cmlnaHRTa2lsbE5hbWUgPSAncGxheXdyaWdodC1jbGknO1xuLy8gY29uc3Qgbm9uV2ViUmVtb3ZhbEFnZW50QXJncyA9IFsnLS1hZ2VudCcsICd1bml2ZXJzYWwnLCAuLi5pbnN0YWxsVGFyZ2V0QWdlbnRBcmdzXTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGluc3RhbGxBZ2VudFNraWxscyhyb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignaW5zdGFsbEFnZW50U2tpbGxzJywgYXN5bmMgKCkgPT4ge1xuICAgIC8vIFRPRE86IFdlIGFyZSB0ZW1wb3JhcmlseSByZW1vdmluZyBhZ2VudCBza2lsbHMgZnJvbSB0aGUgcmVwb1xuICAgIC8vIGF3YWl0IHJ1bkluc3RhbGxBZ2VudFNraWxscyhyb290Q29uZmlnKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBmcy5ybShwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLmFnZW50cycpLCB7XG4gICAgICAgIGZvcmNlOiB0cnVlLFxuICAgICAgICByZWN1cnNpdmU6IHRydWUsXG4gICAgICB9KSxcbiAgICAgIGZzLnJtKHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcuY2xhdWRlJyksIHtcbiAgICAgICAgZm9yY2U6IHRydWUsXG4gICAgICAgIHJlY3Vyc2l2ZTogdHJ1ZSxcbiAgICAgIH0pLFxuICAgICAgZnMucm0ocGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJ3NraWxscy1sb2NrLmpzb24nKSwge1xuICAgICAgICBmb3JjZTogdHJ1ZSxcbiAgICAgIH0pLFxuICAgIF0pO1xuICB9KTtcbn1cblxuLy8gZnVuY3Rpb24gaXNXZWJBcHBSZWxhdGVkKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuLy8gICByZXR1cm4gKFxuLy8gICAgIGNvbmZpZy5kZXBlbmRpbmcubmV4dCB8fFxuLy8gICAgIGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QgfHxcbi8vICAgICBjb25maWcuZGVwZW5kaW5nLnJlYWN0IHx8XG4vLyAgICAgY29uZmlnLmRlcGVuZGluZy5zdG9yeWJvb2sgfHxcbi8vICAgICBjb25maWcuZG9lc0NvbnRhaW5Kc3hPclRzeCB8fFxuLy8gICAgIGNvbmZpZy5kb2VzQ29udGFpbkpzeE9yVHN4SW5QYWNrYWdlc1xuLy8gICApO1xuLy8gfVxuLy9cbi8vIGFzeW5jIGZ1bmN0aW9uIHJ1bkluc3RhbGxBZ2VudFNraWxscyhyb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4vLyAgIGlmICghcm9vdENvbmZpZy5pc1Jvb3QpIHJldHVybjtcbi8vXG4vLyAgIGNvbnN0IGNvbW1vbkFyZ3MgPSBbJy0teWVzJywgJ3NraWxsc0BsYXRlc3QnLCAnYWRkJywgc2tpbGxzUmVwbywgLi4uaW5zdGFsbFRhcmdldEFnZW50QXJncywgJy0tc2tpbGwnLCAnKicsICctLXllcyddO1xuLy8gICBzcGF3blN5bmMoJ25weCcsIGNvbW1vbkFyZ3MsIHJvb3RDb25maWcuZGlyUGF0aCk7XG4vL1xuLy8gICBpZiAoaXNXZWJBcHBSZWxhdGVkKHJvb3RDb25maWcpKSByZXR1cm47XG4vL1xuLy8gICBzcGF3blN5bmMoXG4vLyAgICAgJ25weCcsXG4vLyAgICAgWydza2lsbHNAbGF0ZXN0JywgJ3JlbW92ZScsIHBsYXl3cmlnaHRTa2lsbE5hbWUsIC4uLm5vbldlYlJlbW92YWxBZ2VudEFyZ3MsICctLXllcyddLFxuLy8gICAgIHJvb3RDb25maWcuZGlyUGF0aFxuLy8gICApO1xuLy8gICBhd2FpdCBQcm9taXNlLmFsbChbXG4vLyAgICAgLy8gVGhlIFZlcmNlbCBDTEkgbGVhdmVzIHRoZSBzaGFyZWQgdW5pdmVyc2FsIGluc3RhbGwgYmVoaW5kIGluIHRoaXMgZmxvdyxcbi8vICAgICAvLyBzbyBub24td2ViIHJlcG9zIG5lZWQgYW4gZXhwbGljaXQgY2xlYW51cCBwYXNzIHRvIGVuZm9yY2UgdGhlIGZpbmFsIHN0YXRlLlxuLy8gICAgIHJlbW92ZVNraWxsRGlyZWN0b3J5KHJvb3RDb25maWcuZGlyUGF0aCwgJy5hZ2VudHMvc2tpbGxzJyksXG4vLyAgICAgcmVtb3ZlU2tpbGxEaXJlY3Rvcnkocm9vdENvbmZpZy5kaXJQYXRoLCAnLmNsYXVkZS9za2lsbHMnKSxcbi8vICAgICByZW1vdmVTa2lsbERpcmVjdG9yeShyb290Q29uZmlnLmRpclBhdGgsICcuY29kZXgvc2tpbGxzJyksXG4vLyAgICAgcmVtb3ZlU2tpbGxEaXJlY3Rvcnkocm9vdENvbmZpZy5kaXJQYXRoLCAnLmN1cnNvci9za2lsbHMnKSxcbi8vICAgICByZW1vdmVTa2lsbERpcmVjdG9yeShyb290Q29uZmlnLmRpclBhdGgsICcuZ2VtaW5pL3NraWxscycpLFxuLy8gICAgIHJlbW92ZVNraWxsRGlyZWN0b3J5KHJvb3RDb25maWcuZGlyUGF0aCwgJy5nZW1pbmkvY29tbWFuZHMnKSxcbi8vICAgICByZW1vdmVTa2lsbExvY2tFbnRyeShyb290Q29uZmlnLmRpclBhdGgpLFxuLy8gICBdKTtcbi8vIH1cbi8vXG4vLyBhc3luYyBmdW5jdGlvbiByZW1vdmVTa2lsbERpcmVjdG9yeShyb290RGlyUGF0aDogc3RyaW5nLCByZWxhdGl2ZVBhcmVudERpclBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuLy8gICBhd2FpdCBmcy5ybShwYXRoLnJlc29sdmUocm9vdERpclBhdGgsIHJlbGF0aXZlUGFyZW50RGlyUGF0aCwgcGxheXdyaWdodFNraWxsTmFtZSksIHtcbi8vICAgICBmb3JjZTogdHJ1ZSxcbi8vICAgICByZWN1cnNpdmU6IHRydWUsXG4vLyAgIH0pO1xuLy8gfVxuLy9cbi8vIGFzeW5jIGZ1bmN0aW9uIHJlbW92ZVNraWxsTG9ja0VudHJ5KHJvb3REaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbi8vICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUocm9vdERpclBhdGgsICdza2lsbHMtbG9jay5qc29uJyk7XG4vLyAgIHRyeSB7XG4vLyAgICAgY29uc3QganNvblRleHQgPSBhd2FpdCBmcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbi8vICAgICBjb25zdCBqc29uOiB1bmtub3duID0gSlNPTi5wYXJzZShqc29uVGV4dCk7XG4vLyAgICAgaWYgKCFpc1NraWxsTG9ja0pzb24oanNvbikgfHwgIWpzb24uc2tpbGxzW3BsYXl3cmlnaHRTa2lsbE5hbWVdKSByZXR1cm47XG4vLyAgICAganNvbi5za2lsbHMgPSBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoanNvbi5za2lsbHMpLmZpbHRlcigoW25hbWVdKSA9PiBuYW1lICE9PSBwbGF5d3JpZ2h0U2tpbGxOYW1lKSk7XG4vLyAgICAgYXdhaXQgZnMud3JpdGVGaWxlKGZpbGVQYXRoLCBKU09OLnN0cmluZ2lmeShqc29uLCB1bmRlZmluZWQsIDIpICsgJ1xcbicpO1xuLy8gICB9IGNhdGNoIHtcbi8vICAgICAvLyBJZ25vcmUgaWYgdGhlIHNraWxsIGxvY2sgZG9lcyBub3QgZXhpc3QgeWV0IG9yIGlzIHVucmVhZGFibGUuXG4vLyAgIH1cbi8vIH1cbi8vXG4vLyBmdW5jdGlvbiBpc1NraWxsTG9ja0pzb24oanNvbjogdW5rbm93bik6IGpzb24gaXMgeyBza2lsbHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0ge1xuLy8gICByZXR1cm4gKFxuLy8gICAgIHR5cGVvZiBqc29uID09PSAnb2JqZWN0JyAmJlxuLy8gICAgIGpzb24gIT09IG51bGwgJiZcbi8vICAgICAnc2tpbGxzJyBpbiBqc29uICYmXG4vLyAgICAgdHlwZW9mIGpzb24uc2tpbGxzID09PSAnb2JqZWN0JyAmJlxuLy8gICAgIGpzb24uc2tpbGxzICE9PSBudWxsICYmXG4vLyAgICAgIUFycmF5LmlzQXJyYXkoanNvbi5za2lsbHMpXG4vLyAgICk7XG4vLyB9XG4iLCJpbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuY29uc3Qgc3JjRGlyZWN0b3JpZXMgPSB7XG4gIG5vZGU6IFsnc3JjJywgJ3Rlc3QnLCAnc2NyaXB0cyddLnRvU29ydGVkKCksXG4gIGJsaXR6OiBbJ3NyYycsICd0ZXN0JywgJ3NjcmlwdHMnLCAnZGInLCAnaW50ZWdyYXRpb25zJywgJ21haWxlcnMnXS50b1NvcnRlZCgpLFxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNyY0RpcnMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nW10ge1xuICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eikge1xuICAgIHJldHVybiBzcmNEaXJlY3Rvcmllcy5ibGl0ejtcbiAgfVxuICByZXR1cm4gc3JjRGlyZWN0b3JpZXMubm9kZTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IGNsb25lRGVlcCBmcm9tICdsb2Rhc2guY2xvbmVkZWVwJztcbmltcG9ydCB0eXBlIHsgVHNDb25maWdKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGNvbWJpbmVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBzb3J0S2V5cyB9IGZyb20gJy4uL3V0aWxzL29iamVjdFV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBnZXRTcmNEaXJzIH0gZnJvbSAnLi4vdXRpbHMvc3JjRGlyZWN0b3JpZXMuanMnO1xuaW1wb3J0IHsgZ2V0VHNjb25maWdFeHRlbmRzIH0gZnJvbSAnLi4vdXRpbHMvdHNjb25maWdCYXNlLmpzJztcblxuY29uc3Qgcm9vdEpzb25PYmogPSB7XG4gIGNvbXBpbGVyT3B0aW9uczoge1xuICAgIGFsd2F5c1N0cmljdDogdHJ1ZSxcbiAgICBub1VuY2hlY2tlZEluZGV4ZWRBY2Nlc3M6IHRydWUsIC8vIGZvciBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLW51bGxpc2gtY29hbGVzY2luZ1xuICAgIGFsbG93U3ludGhldGljRGVmYXVsdEltcG9ydHM6IHRydWUsIC8vIGFsbG93IGBpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnYFxuICAgIGVzTW9kdWxlSW50ZXJvcDogdHJ1ZSwgLy8gYWxsb3cgZGVmYXVsdCBpbXBvcnQgZnJvbSBDb21tb25KUy9BTUQvVU1EIG1vZHVsZXNcbiAgICByZXNvbHZlSnNvbk1vZHVsZTogdHJ1ZSwgLy8gYWxsb3cgdG8gaW1wb3J0IEpTT04gZmlsZXNcbiAgICBkZWNsYXJhdGlvbjogdHJ1ZSxcbiAgICBzb3VyY2VNYXA6IHRydWUsXG4gICAgaW1wb3J0SGVscGVyczogZmFsc2UsXG4gICAgb3V0RGlyOiAnZGlzdCcsXG4gIH0sXG4gIGV4Y2x1ZGU6IFsncGFja2FnZXMvKi90ZXN0L2ZpeHR1cmVzJywgJ3Rlc3QvZml4dHVyZXMnXSxcbiAgaW5jbHVkZTogW1xuICAgICdwYWNrYWdlcy8qL3NjcmlwdHMvKiovKicsXG4gICAgJ3BhY2thZ2VzLyovc3JjLyoqLyonLFxuICAgICdwYWNrYWdlcy8qL3Rlc3QvKiovKicsXG4gICAgJ3NjcmlwdHMvKiovKicsXG4gICAgJ3NyYy8qKi8qJyxcbiAgICAndGVzdC8qKi8qJyxcbiAgXSxcbn07XG5cbmNvbnN0IHN1Ykpzb25PYmogPSB7XG4gIGNvbXBpbGVyT3B0aW9uczoge1xuICAgIGFsd2F5c1N0cmljdDogdHJ1ZSxcbiAgICBub1VuY2hlY2tlZEluZGV4ZWRBY2Nlc3M6IHRydWUsIC8vIGZvciBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLW51bGxpc2gtY29hbGVzY2luZ1xuICAgIGFsbG93U3ludGhldGljRGVmYXVsdEltcG9ydHM6IHRydWUsIC8vIGFsbG93IGBpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnYFxuICAgIGVzTW9kdWxlSW50ZXJvcDogdHJ1ZSwgLy8gYWxsb3cgZGVmYXVsdCBpbXBvcnQgZnJvbSBDb21tb25KUy9BTUQvVU1EIG1vZHVsZXNcbiAgICByZXNvbHZlSnNvbk1vZHVsZTogdHJ1ZSwgLy8gYWxsb3cgdG8gaW1wb3J0IEpTT04gZmlsZXNcbiAgICBkZWNsYXJhdGlvbjogdHJ1ZSxcbiAgICBzb3VyY2VNYXA6IHRydWUsXG4gICAgaW1wb3J0SGVscGVyczogZmFsc2UsXG4gICAgb3V0RGlyOiAnZGlzdCcsXG4gIH0sXG4gIGV4Y2x1ZGU6IFsndGVzdC9maXh0dXJlcyddLFxuICBpbmNsdWRlOiBbJ3NjcmlwdHMvKiovKicsICdzcmMvKiovKicsICd0ZXN0LyoqLyonXSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVRzY29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlVHNjb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHwgY29uZmlnLmRlcGVuZGluZy5uZXh0KSByZXR1cm47XG5cbiAgICBsZXQgbmV3U2V0dGluZ3MgPSBjbG9uZURlZXAoY29uZmlnLmlzUm9vdCA/IHJvb3RKc29uT2JqIDogc3ViSnNvbk9iaikgYXMgVHNDb25maWdKc29uO1xuICAgIGNvbnN0IGdlbmVyYXRlZFJvb3REaXIgPSBnZXRHZW5lcmF0ZWRSb290RGlyKGNvbmZpZyk7XG4gICAgY29uc3QgZ2VuZXJhdGVkVHlwZXMgPSBnZXRHZW5lcmF0ZWRUeXBlcyhjb25maWcpO1xuICAgIG5ld1NldHRpbmdzLmV4dGVuZHMgPSBnZXRUc2NvbmZpZ0V4dGVuZHMoY29uZmlnKTtcbiAgICBpZiAoZ2VuZXJhdGVkUm9vdERpcikge1xuICAgICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zID0geyAuLi5uZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMsIHJvb3REaXI6IGdlbmVyYXRlZFJvb3REaXIgfTtcbiAgICB9XG4gICAgaWYgKGdlbmVyYXRlZFR5cGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyA9IHsgLi4ubmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLCB0eXBlczogZ2VuZXJhdGVkVHlwZXMgfTtcbiAgICB9XG4gICAgaWYgKCFjb25maWcuZG9lc0NvbnRhaW5Kc3hPclRzeCAmJiAhY29uZmlnLmRvZXNDb250YWluSnN4T3JUc3hJblBhY2thZ2VzKSB7XG4gICAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5qc3g7XG4gICAgfSBlbHNlIGlmICghY29uZmlnLmlzQnVuICYmICFjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMgPSB7IC4uLm5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucywganN4OiAncmVhY3QtanN4JyB9O1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmlzUm9vdCAmJiAhY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zKSB7XG4gICAgICBuZXdTZXR0aW5ncy5pbmNsdWRlID0gbmV3U2V0dGluZ3MuaW5jbHVkZT8uZmlsdGVyKChkaXJQYXRoOiBzdHJpbmcpID0+ICFkaXJQYXRoLnN0YXJ0c1dpdGgoJ3BhY2thZ2VzLyovJykpO1xuICAgICAgbmV3U2V0dGluZ3MuZXhjbHVkZSA9IG5ld1NldHRpbmdzLmV4Y2x1ZGU/LmZpbHRlcigoZGlyUGF0aDogc3RyaW5nKSA9PiAhZGlyUGF0aC5zdGFydHNXaXRoKCdwYWNrYWdlcy8qLycpKTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3RzY29uZmlnLmpzb24nKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBvbGRTZXR0aW5ncyA9IEpTT04ucGFyc2UoZXhpc3RpbmdDb250ZW50KSBhcyBUc0NvbmZpZ0pzb247XG4gICAgICBjb25zdCBleGlzdGluZ1Jvb3REaXIgPSBvbGRTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LnJvb3REaXI7XG4gICAgICBjb25zdCBleGlzdGluZ1R5cGVzID0gbm9ybWFsaXplU3RyaW5nQXJyYXkob2xkU2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy50eXBlcyk7XG4gICAgICBuZXdTZXR0aW5ncy5leHRlbmRzID0gbWVyZ2VUc2NvbmZpZ0V4dGVuZHMobmV3U2V0dGluZ3MuZXh0ZW5kcywgb2xkU2V0dGluZ3MuZXh0ZW5kcyk7XG4gICAgICBkZWxldGUgb2xkU2V0dGluZ3MuZXh0ZW5kcztcbiAgICAgIGRlbGV0ZSBvbGRTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmpzeDtcbiAgICAgIG5ld1NldHRpbmdzID0gbWVyZ2UuYWxsKFtuZXdTZXR0aW5ncywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzXSwgeyBhcnJheU1lcmdlOiBjb21iaW5lTWVyZ2UgfSk7XG4gICAgICBuZXdTZXR0aW5ncy5pbmNsdWRlID0gbmV3U2V0dGluZ3MuaW5jbHVkZT8uZmlsdGVyKFxuICAgICAgICAoZGlyUGF0aDogc3RyaW5nKSA9PlxuICAgICAgICAgICFkaXJQYXRoLmluY2x1ZGVzKCdAdHlwZXMnKSAmJiAhZGlyUGF0aC5pbmNsdWRlcygnX190ZXN0c19fLycpICYmICFkaXJQYXRoLmluY2x1ZGVzKCd0ZXN0cy8nKVxuICAgICAgKTtcbiAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyA/Pz0ge307XG4gICAgICBpZiAoZXhpc3RpbmdSb290RGlyKSB7XG4gICAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucy5yb290RGlyID0gZXhpc3RpbmdSb290RGlyO1xuICAgICAgfSBlbHNlIGlmIChnZW5lcmF0ZWRSb290RGlyKSB7XG4gICAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucy5yb290RGlyID0gZ2VuZXJhdGVkUm9vdERpcjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMucm9vdERpcjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbWVyZ2VkVHlwZXMgPSBbLi4ubmV3IFNldChbLi4uZXhpc3RpbmdUeXBlcywgLi4uZ2VuZXJhdGVkVHlwZXNdKV07XG4gICAgICBpZiAobWVyZ2VkVHlwZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMudHlwZXMgPSBtZXJnZWRUeXBlcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMudHlwZXM7XG4gICAgICB9XG4gICAgICBpZiAoc2hvdWxkRGVsZXRlVHlwZVJvb3RzKGdlbmVyYXRlZFR5cGVzKSkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLnR5cGVSb290cztcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gICAgc29ydEtleXMobmV3U2V0dGluZ3MpO1xuICAgIG5ld1NldHRpbmdzLmluY2x1ZGU/LnNvcnQoKTtcbiAgICAvLyBEb24ndCB1c2Ugb2xkIGRlY29yYXRvclxuICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmV4cGVyaW1lbnRhbERlY29yYXRvcnM7XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LnZlcmJhdGltTW9kdWxlU3ludGF4O1xuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBtZXJnZVRzY29uZmlnRXh0ZW5kcyhcbiAgZ2VuZXJhdGVkRXh0ZW5kczogVHNDb25maWdKc29uWydleHRlbmRzJ10sXG4gIGV4aXN0aW5nRXh0ZW5kczogVHNDb25maWdKc29uWydleHRlbmRzJ11cbik6IFRzQ29uZmlnSnNvblsnZXh0ZW5kcyddIHtcbiAgY29uc3QgbWVyZ2VkRXh0ZW5kcyA9IFsuLi5ub3JtYWxpemVFeHRlbmRzKGdlbmVyYXRlZEV4dGVuZHMpLCAuLi5ub3JtYWxpemVFeHRlbmRzKGV4aXN0aW5nRXh0ZW5kcyldO1xuICBjb25zdCB1bmlxdWVFeHRlbmRzID0gWy4uLm5ldyBTZXQobWVyZ2VkRXh0ZW5kcyldO1xuICBpZiAodW5pcXVlRXh0ZW5kcy5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmICh1bmlxdWVFeHRlbmRzLmxlbmd0aCA9PT0gMSkgcmV0dXJuIHVuaXF1ZUV4dGVuZHNbMF07XG4gIHJldHVybiB1bmlxdWVFeHRlbmRzO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVFeHRlbmRzKHZhbHVlOiBUc0NvbmZpZ0pzb25bJ2V4dGVuZHMnXSk6IHN0cmluZ1tdIHtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIFtdO1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVN0cmluZ0FycmF5KHZhbHVlOiB1bmtub3duKTogc3RyaW5nW10ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgcmV0dXJuIFt2YWx1ZV07XG4gIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiBbXTtcbiAgcmV0dXJuIHZhbHVlLmZpbHRlcigoaXRlbSk6IGl0ZW0gaXMgc3RyaW5nID0+IHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJyk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZERlbGV0ZVR5cGVSb290cyh0eXBlTmFtZXM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gIC8vIE9ubHkgZ2VuZXJhdGVkIHBhY2thZ2Utb3duZWQgdGVzdCB0eXBlcyBzaG91bGQgdHJpZ2dlciB0aGlzLiBVc2VyLWRlZmluZWQgc2xhc2gtYmFzZWRcbiAgLy8gZW50cmllcyBtYXkgaW50ZW50aW9uYWxseSByZWx5IG9uIGN1c3RvbSB0eXBlUm9vdHMgYW5kIHNob3VsZCBiZSBwcmVzZXJ2ZWQgYXMtaXMuXG4gIHJldHVybiB0eXBlTmFtZXMuc29tZSgodHlwZU5hbWUpID0+IHR5cGVOYW1lID09PSAnY3lwcmVzcycgfHwgdHlwZU5hbWUuaW5jbHVkZXMoJy8nKSk7XG59XG5cbmZ1bmN0aW9uIGdldEdlbmVyYXRlZFJvb3REaXIoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZXhpc3RpbmdSb290U291cmNlRGlycyA9IGdldFNyY0RpcnMoY29uZmlnKS5maWx0ZXIoKGRpck5hbWUpID0+XG4gICAgZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGRpck5hbWUpKVxuICApO1xuXG4gIGlmIChjb25maWcuaXNSb290ICYmIGNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucykge1xuICAgIGNvbnN0IHBhY2thZ2VzRGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3BhY2thZ2VzJyk7XG4gICAgY29uc3QgaGFzU3ViUGFja2FnZVNvdXJjZXMgPVxuICAgICAgZnMuZXhpc3RzU3luYyhwYWNrYWdlc0RpclBhdGgpICYmXG4gICAgICBmc1xuICAgICAgICAucmVhZGRpclN5bmMocGFja2FnZXNEaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSlcbiAgICAgICAgLnNvbWUoXG4gICAgICAgICAgKGRpcmVudCkgPT5cbiAgICAgICAgICAgIGRpcmVudC5pc0RpcmVjdG9yeSgpICYmXG4gICAgICAgICAgICBnZXRTcmNEaXJzKGNvbmZpZykuc29tZSgoZGlyTmFtZSkgPT4gZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUocGFja2FnZXNEaXJQYXRoLCBkaXJlbnQubmFtZSwgZGlyTmFtZSkpKVxuICAgICAgICApO1xuICAgIGlmIChoYXNTdWJQYWNrYWdlU291cmNlcykge1xuICAgICAgcmV0dXJuIGV4aXN0aW5nUm9vdFNvdXJjZURpcnMubGVuZ3RoID4gMCA/ICcuJyA6ICcuL3BhY2thZ2VzJztcbiAgICB9XG4gIH1cblxuICBpZiAoZXhpc3RpbmdSb290U291cmNlRGlycy5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gYC4vJHtleGlzdGluZ1Jvb3RTb3VyY2VEaXJzWzBdfWA7XG4gIH1cbiAgaWYgKGV4aXN0aW5nUm9vdFNvdXJjZURpcnMubGVuZ3RoID4gMSkge1xuICAgIHJldHVybiAnLic7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0R2VuZXJhdGVkVHlwZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nW10ge1xuICBjb25zdCB0eXBlTmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgZGVwZW5kZW5jaWVzID0ge1xuICAgIC4uLmNvbmZpZy5wYWNrYWdlSnNvbj8uZGVwZW5kZW5jaWVzLFxuICAgIC4uLmNvbmZpZy5wYWNrYWdlSnNvbj8uZGV2RGVwZW5kZW5jaWVzLFxuICB9O1xuXG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICB0eXBlTmFtZXMuYWRkKCdidW4nKTtcbiAgfSBlbHNlIGlmICghY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgIHR5cGVOYW1lcy5hZGQoJ25vZGUnKTtcbiAgfVxuICBpZiAoXG4gICAgZGVwZW5kZW5jaWVzLmplc3QgfHxcbiAgICBkZXBlbmRlbmNpZXNbJ0BqZXN0L2dsb2JhbHMnXSB8fFxuICAgIGRlcGVuZGVuY2llc1snamVzdC1lbnZpcm9ubWVudC1qc2RvbSddIHx8XG4gICAgZGVwZW5kZW5jaWVzWyd0cy1qZXN0J11cbiAgKSB7XG4gICAgdHlwZU5hbWVzLmFkZCgnamVzdCcpO1xuICB9XG4gIGlmIChkZXBlbmRlbmNpZXMudml0ZXN0KSB7XG4gICAgdHlwZU5hbWVzLmFkZCgndml0ZXN0L2dsb2JhbHMnKTtcbiAgfVxuICBpZiAoZGVwZW5kZW5jaWVzLm1vY2hhKSB7XG4gICAgdHlwZU5hbWVzLmFkZCgnbW9jaGEnKTtcbiAgfVxuICBpZiAoZGVwZW5kZW5jaWVzLmN5cHJlc3MpIHtcbiAgICB0eXBlTmFtZXMuYWRkKCdjeXByZXNzJyk7XG4gIH1cblxuICByZXR1cm4gWy4uLnR5cGVOYW1lc107XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHNvcnRLZXlzIH0gZnJvbSAnLi4vdXRpbHMvb2JqZWN0VXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgZXhjbHVkZUZpbGVQYXR0ZXJucyA9IFtcbiAgJyoqLy5naXQvb2JqZWN0cy8qKicsXG4gICcqKi8uZ2l0L3N1YnRyZWUtY2FjaGUvKionLFxuICAnKiovbm9kZV9tb2R1bGVzLyoqJyxcbiAgJyoqL3RtcC8qKicsXG4gICcqKi90ZW1wLyoqJyxcbiAgJyoqL2Rpc3QvKionLFxuXTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlVnNjb2RlU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncycsIGFzeW5jICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcudnNjb2RlJywgJ3NldHRpbmdzLmpzb24nKTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgbGV0IHNldHRpbmdzID0gSlNPTi5wYXJzZShleGlzdGluZ0NvbnRlbnQpIGFzIG9iamVjdDtcbiAgICAgIGZvciAoY29uc3QgZXhjbHVkZUZpbGVQYXR0ZXJuIG9mIGV4Y2x1ZGVGaWxlUGF0dGVybnMpIHtcbiAgICAgICAgc2V0dGluZ3MgPSBtZXJnZS5hbGwoW3NldHRpbmdzLCBleGNsdWRlU2V0dGluZyhleGNsdWRlRmlsZVBhdHRlcm4pXSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jaykge1xuICAgICAgICBzZXR0aW5ncyA9IG1lcmdlLmFsbChbc2V0dGluZ3MsIGV4Y2x1ZGVTZXR0aW5nKCcqKi8udmVudi8qKicpXSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgICAgIHNldHRpbmdzID0gbWVyZ2UuYWxsKFtzZXR0aW5ncywgZXhjbHVkZVNldHRpbmcoJyoqLy5uZXh0LyoqJyldKTtcbiAgICAgIH1cbiAgICAgIC8vIExMTeOBq+OCiOOCi3ZpYmUgY29kaW5n44Gn44Gv44CB6Ieq5YuV44OV44Kp44O844Oe44OD44OI44KE44Kz44O844OJ44Ki44Kv44K344On44Oz44KS54Sh5Yq55YyW44GZ44KL44GT44Go44GnXG4gICAgICAvLyDnlJ/miJDjgZXjgozjgZ/jgrPjg7zjg4njga7lhYPjga7lvaLlvI/jgpLntq3mjIHjgafjgY3jgotcbiAgICAgIGlmICgnZWRpdG9yLmNvZGVBY3Rpb25zT25TYXZlJyBpbiBzZXR0aW5ncykge1xuICAgICAgICBkZWxldGUgc2V0dGluZ3NbJ2VkaXRvci5jb2RlQWN0aW9uc09uU2F2ZSddO1xuICAgICAgfVxuICAgICAgaWYgKCdlZGl0b3IuZm9ybWF0T25TYXZlJyBpbiBzZXR0aW5ncykge1xuICAgICAgICBkZWxldGUgc2V0dGluZ3NbJ2VkaXRvci5mb3JtYXRPblNhdmUnXTtcbiAgICAgIH1cbiAgICAgIHNvcnRLZXlzKHNldHRpbmdzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShzZXR0aW5ncywgdW5kZWZpbmVkLCAyKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZXhjbHVkZVNldHRpbmcoZXhjbHVkZUZpbGVQYXR0ZXJuOiBzdHJpbmcpOiBvYmplY3Qge1xuICByZXR1cm4ge1xuICAgICdmaWxlcy53YXRjaGVyRXhjbHVkZSc6IHtcbiAgICAgIFtleGNsdWRlRmlsZVBhdHRlcm5dOiB0cnVlLFxuICAgIH0sXG4gIH07XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IENvbmZpZ3VyYXRpb25WYWx1ZU1hcCB9IGZyb20gJ0B5YXJucGtnL2NvcmUnO1xuaW1wb3J0IHlhbWwgZnJvbSAnanMteWFtbCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jLCBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuXG50eXBlIFNldHRpbmdzID0ge1xuICBkZWZhdWx0U2VtdmVyUmFuZ2VQcmVmaXg6IHN0cmluZztcbiAgbm1Nb2RlOiBzdHJpbmc7XG4gIG5vZGVMaW5rZXI6IHN0cmluZztcbiAgbnBtTWluaW1hbEFnZUdhdGU/OiBzdHJpbmc7XG4gIG5wbVByZWFwcHJvdmVkUGFja2FnZXM/OiBzdHJpbmdbXTtcbiAgcGx1Z2lucz86IFBsdWdpbltdO1xufSAmIFBhcnRpYWw8Q29uZmlndXJhdGlvblZhbHVlTWFwPjtcblxuaW50ZXJmYWNlIFBsdWdpbiB7XG4gIGNoZWNrc3VtOiBzdHJpbmc7XG4gIHBhdGg6IHN0cmluZztcbiAgc3BlYzogc3RyaW5nO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVZYXJucmNZbWwoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVZYXJucmNZbWwnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeWFybnJjWW1sUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy55YXJucmMueW1sJyk7XG4gICAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHlhcm5yY1ltbFBhdGgsIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICAgIGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy55YXJuJyksIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgICAgKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgICBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICd5YXJuLmxvY2snKSwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRWZXJzaW9uID0gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KCd5YXJuJywgWyctLXZlcnNpb24nXSwgY29uZmlnLmRpclBhdGgpO1xuICAgIGNvbnN0IGxhdGVzdFZlcnNpb24gPSBnZXRMYXRlc3RWZXJzaW9uKCdAeWFybnBrZy9jbGknLCBjb25maWcuZGlyUGF0aCk7XG4gICAgaWYgKGdldE1ham9yTnVtYmVyKGN1cnJlbnRWZXJzaW9uKSA8PSBnZXRNYWpvck51bWJlcihsYXRlc3RWZXJzaW9uKSAmJiBjdXJyZW50VmVyc2lvbiAhPT0gbGF0ZXN0VmVyc2lvbikge1xuICAgICAgc3Bhd25TeW5jKCd5YXJuJywgWydzZXQnLCAndmVyc2lvbicsIGxhdGVzdFZlcnNpb25dLCBjb25maWcuZGlyUGF0aCwgMSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVsZWFzZXNQYXRoID0gcGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm4nLCAncmVsZWFzZXMnKTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihyZWxlYXNlc1BhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGZvciAoY29uc3QgZmlsZSBvZiBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKHJlbGVhc2VzUGF0aCkpIHtcbiAgICAgIGlmIChmaWxlLnN0YXJ0c1dpdGgoJ3lhcm4tJykgJiYgIWZpbGUuc3RhcnRzV2l0aChgeWFybi0ke2xhdGVzdFZlcnNpb259LmApKSB7XG4gICAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4ocmVsZWFzZXNQYXRoLCBmaWxlKSkpO1xuICAgICAgICBjb25zb2xlLmxvZygnUmVtb3ZlZCcsIHBhdGguam9pbihyZWxlYXNlc1BhdGgsIGZpbGUpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB5YXJucmNQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm5yYycpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybSh5YXJucmNQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKTtcblxuICAgIGNvbnN0IHNldHRpbmdzID0geWFtbC5sb2FkKGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHlhcm5yY1ltbFBhdGgsICd1dGY4JykpIGFzIFNldHRpbmdzO1xuICAgIHNldHRpbmdzLmRlZmF1bHRTZW12ZXJSYW5nZVByZWZpeCA9ICcnO1xuICAgIHNldHRpbmdzLm5vZGVMaW5rZXIgPSAnbm9kZS1tb2R1bGVzJztcbiAgICBzZXR0aW5ncy5ubU1vZGUgPSAnaGFyZGxpbmtzLWdsb2JhbCc7XG4gICAgc2V0dGluZ3MubnBtTWluaW1hbEFnZUdhdGUgPSAnNWQnO1xuICAgIHNldHRpbmdzLm5wbVByZWFwcHJvdmVkUGFja2FnZXMgPSBbXG4gICAgICAvLyBXZSBiZWxpZXZlIHdlIGFyZSBzYWZlXG4gICAgICAnQGV4ZXJjb2RlLyonLFxuICAgICAgJ0B3aWxsYm9vc3Rlci8qJyxcbiAgICAgIC8vIFRvIGRlYWwgd2l0aCBDVkUgbGlrZSBodHRwczovL25leHRqcy5vcmcvYmxvZy9DVkUtMjAyNS02NjQ3OFxuICAgICAgJ25leHQnLFxuICAgICAgJ0BuZXh0LyonLFxuICAgICAgJ3JlYWN0JyxcbiAgICAgICdyZWFjdC1kb20nLFxuICAgIF07XG4gICAgZGVsZXRlIHNldHRpbmdzLmNvbXByZXNzaW9uTGV2ZWw7XG4gICAgaWYgKHNldHRpbmdzLmluamVjdEVudmlyb25tZW50RmlsZXM/Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgZGVsZXRlIHNldHRpbmdzLmluamVjdEVudmlyb25tZW50RmlsZXM7XG4gICAgfVxuICAgIC8vIGNmLiBodHRwczovL2dpdGh1Yi5jb20veWFybnBrZy9iZXJyeS9wdWxsLzQ2OThcbiAgICBzZXR0aW5ncy5lbmFibGVHbG9iYWxDYWNoZSA9IHRydWU7XG4gICAgY29uc3Qgb3JpZ2luYWxMZW5ndGggPSBzZXR0aW5ncy5wbHVnaW5zPy5sZW5ndGggPz8gMDtcbiAgICBzZXR0aW5ncy5wbHVnaW5zID0gc2V0dGluZ3MucGx1Z2lucz8uZmlsdGVyKChwKSA9PiBwLnBhdGggIT09ICcueWFybi9wbHVnaW5zL3VuZGVmaW5lZC5janMnKSA/PyBbXTtcbiAgICBpZiAoc2V0dGluZ3MucGx1Z2lucy5sZW5ndGggIT09IG9yaWdpbmFsTGVuZ3RoKSB7XG4gICAgICBjb25zdCBwbHVnaW5QYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm5yYycsICd1bmRlZmluZWQuY2pzJyk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGx1Z2luUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgfVxuICAgIGlmIChzZXR0aW5ncy5wbHVnaW5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZGVsZXRlIHNldHRpbmdzLnBsdWdpbnM7XG4gICAgfVxuICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZSh5YXJucmNZbWxQYXRoLCB5YW1sLmR1bXAoc2V0dGluZ3MsIHsgbGluZVdpZHRoOiAtMSB9KSk7XG5cbiAgICBzcGF3blN5bmMoJ3lhcm4nLCBbJ2RseCcsICd5YXJuLXBsdWdpbi1hdXRvLWluc3RhbGwnXSwgY29uZmlnLmRpclBhdGgpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldExhdGVzdFZlcnNpb24ocGFja2FnZU5hbWU6IHN0cmluZywgZGlyUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgdmVyc2lvbnNKc29uID0gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KCducG0nLCBbJ3Nob3cnLCBwYWNrYWdlTmFtZSwgJ3ZlcnNpb25zJywgJy0tanNvbiddLCBkaXJQYXRoKTtcbiAgY29uc3QgdmVyc2lvbnMgPSBKU09OLnBhcnNlKHZlcnNpb25zSnNvbikgYXMgc3RyaW5nW107XG4gIHJldHVybiB2ZXJzaW9ucy5hdCgtMSkgYXMgc3RyaW5nO1xufVxuZnVuY3Rpb24gZ2V0TWFqb3JOdW1iZXIodmVyc2lvbjogc3RyaW5nKTogbnVtYmVyIHtcbiAgY29uc3QgW21ham9yXSA9IHZlcnNpb24uc3BsaXQoJy4nKTtcbiAgcmV0dXJuIE51bWJlcihtYWpvcik7XG59XG4iLCJpbXBvcnQgdHlwZSB7IE9jdG9raXQgfSBmcm9tICdAb2N0b2tpdC9jb3JlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2V0T2N0b2tpdCwgZ2l0SHViVXRpbCwgaGFzR2l0SHViVG9rZW4gfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwTGFiZWxzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ3NldHVwTGFiZWxzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IFtvd25lciwgcmVwb10gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUoY29uZmlnLnJlcG9zaXRvcnkgPz8gJycpO1xuICAgIGlmICghb3duZXIgfHwgIXJlcG8pIHJldHVybjtcbiAgICBpZiAob3duZXIgIT09ICdXaWxsQm9vc3RlcicgJiYgb3duZXIgIT09ICdXaWxsQm9vc3RlckxhYicpIHJldHVybjtcbiAgICBpZiAoIWhhc0dpdEh1YlRva2VuKG93bmVyKSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2N0b2tpdCA9IGdldE9jdG9raXQob3duZXIpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkMTogeC1lYXN5IDpoZWRnZWhvZzonLCAnRURFOUZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDI6IGVhc3kgOnJhYmJpdDI6JywgJ0RERDZGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2QzOiBtZWRpdW0gOm94OicsICdDNEI1RkQnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkNDogaGFyZCA6c3F1aWQ6JywgJ0E3OEJGQScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2Q1OiB4LWhhcmQgOndoYWxlMjonLCAnOEI1Q0Y2Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncDE6IGNyaXRpY2FsIDpmaXJlOjpmaXJlOjpmaXJlOicsICdFRjQ0NDQnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdwMjogdXJnZW50IDpmaXJlOjpmaXJlOicsICdGODcxNzEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdwMzogaW1wb3J0YW50IDpmaXJlOicsICdGQ0E1QTUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdwNDogbmljZSB0byBoYXZlIDpkcm9wbGV0OicsICdGRUNBQ0EnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiBibGl0eicsICc1MzAwYmMnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiBmaXJlYmFzZScsICdmZmNhMjgnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiBwcmlzbWEnLCAnMGMzNDRiJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogcmVhY3QnLCAnNjFkYWZiJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogc3ZlbHRlJywgJ2ZmM2UwMCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IHNlbWFudGljLXJlbGVhc2UnLCAnNDk0OTQ5Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmVhZHkgOnJvY2tldDonLCAnMjJDNTVFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmV2aWV3IHJlcXVlc3RlZCA6bWFnOicsICdGQkNBMDQnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyZWxlYXNlZCA6Ym9va21hcms6JywgJzYzNjZGMScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDAuNWggOmNsb2NrMTIzMDonLCAnRjNGNEY2Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogMWggOmNsb2NrMTonLCAnRTVFN0VCJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogMmggOmNsb2NrMjonLCAnRDFENURCJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogM2ggOmNsb2NrMzonLCAnOUNBM0FGJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogNWggOmNsb2NrNTonLCAnNkI3MjgwJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogOGggOmNsb2NrODonLCAnNEI1NTYzJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogMTNoIDpjbG9jazE6JywgJzM3NDE1MScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGJ1aWxkIDpoYW1tZXI6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGNob3JlIDpicm9vbTonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogY2kgOmNvbnN0cnVjdGlvbl93b3JrZXI6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGRvY3MgOm1lbW86JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGZlYXQgOnNwYXJrbGVzOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBmaXggOmJ1ZzonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogcGVyZiA6emFwOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiByZWZhY3RvciA6cmVjeWNsZTonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogc3R5bGUgOmxpcHN0aWNrOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiB0ZXN0IDp0ZXN0X3R1YmU6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Byb2plY3QnLCAnMjQyOTJGJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZm9jdXNlZCA6ZGFydDonLCAnMjJDNTVFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZ2VuLXByLWFsbCA6cm9ib3Q6JywgJzAwQjREOCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2dlbi1wci1jbGF1ZGUgOnJvYm90OicsICcwMEI0RDgnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdnZW4tcHItY29kZXggOnJvYm90OicsICcwMEI0RDgnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdnZW4tcHItZ2VtaW5pIDpyb2JvdDonLCAnMDBCNEQ4Jyk7XG5cbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnYnVnJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2RvY3VtZW50YXRpb24nKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZHVwbGljYXRlJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2VuaGFuY2VtZW50Jyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2dvb2QgZmlyc3QgaXNzdWUnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnaGVscCB3YW50ZWQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnaW52YWxpZCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdxdWVzdGlvbicpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd3b250Zml4Jyk7XG5cbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmVhZHknKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmV2aWV3IHJlcXVlc3RlZCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyZWxlYXNlZCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzZW1hbnRpYy1yZWxlYXNlJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2xsbS1wciA6cm9ib3Q6Jyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2FpLXByIDpyb2JvdDonKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKCdTa2lwIHNldHVwTGFiZWxzIGR1ZSB0bzonLCAoZXJyb3IgYXMgRXJyb3IgfCB1bmRlZmluZWQpPy5zdGFjayA/PyBlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0dXBMYWJlbChvY3Rva2l0OiBPY3Rva2l0LCBvd25lcjogc3RyaW5nLCByZXBvOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgY29sb3I6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIC8vIElzc3VlcyBwZXJtaXNzaW9uXG4gICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHMnLCB7XG4gICAgICBvd25lcixcbiAgICAgIHJlcG8sXG4gICAgICBuYW1lLFxuICAgICAgY29sb3IsXG4gICAgfSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIElzc3VlcyBwZXJtaXNzaW9uXG4gICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vbGFiZWxzL3tuYW1lfScsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIG5hbWUsXG4gICAgICBjb2xvcixcbiAgICB9KTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBkZWxldGVMYWJlbChvY3Rva2l0OiBPY3Rva2l0LCBvd25lcjogc3RyaW5nLCByZXBvOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIC8vIElzc3VlcyBwZXJtaXNzaW9uXG4gICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVscy97bmFtZX0nLCB7XG4gICAgICBvd25lcixcbiAgICAgIHJlcG8sXG4gICAgICBuYW1lLFxuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cbiIsImltcG9ydCBkb3RlbnYgZnJvbSAnZG90ZW52JztcbmltcG9ydCBzb2RpdW0gZnJvbSAnbGlic29kaXVtLXdyYXBwZXJzJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuLi9vcHRpb25zLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2V0T2N0b2tpdCwgZ2l0SHViVXRpbCwgaGFzR2l0SHViVG9rZW4gfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcblxuY29uc3QgREVQUkVDQVRFRF9TRUNSRVRfTkFNRVMgPSBbJ1JFQURZX0RJU0NPUkRfV0VCSE9PS19VUkwnLCAnR0hfQk9UX1BBVCcsICdQVUJMSUNfR0hfQk9UX1BBVCddO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0dXBTZWNyZXRzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ3NldHVwU2VjcmV0cycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBbb3duZXIsIHJlcG9dID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGNvbmZpZy5yZXBvc2l0b3J5ID8/ICcnKTtcbiAgICBpZiAoIW93bmVyIHx8ICFyZXBvIHx8IG93bmVyICE9PSAnV2lsbEJvb3N0ZXJMYWInKSByZXR1cm47XG4gICAgaWYgKCFoYXNHaXRIdWJUb2tlbihvd25lcikgfHwgIW9wdGlvbnMuZG9lc1VwbG9hZEVudlZhcnMpIHJldHVybjtcblxuICAgIGNvbnN0IHBhcnNlZCA9IGRvdGVudi5jb25maWcoKS5wYXJzZWQgPz8ge307XG4gICAgaWYgKE9iamVjdC5rZXlzKHBhcnNlZCkubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICBjb25zdCBvY3Rva2l0ID0gZ2V0T2N0b2tpdChvd25lcik7XG5cbiAgICB0cnkge1xuICAgICAgZm9yIChjb25zdCBzZWNyZXROYW1lIG9mIERFUFJFQ0FURURfU0VDUkVUX05BTUVTKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gUmVxdWlyZXMgU2VjcmV0cyBwZXJtaXNzaW9uXG4gICAgICAgICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvc2VjcmV0cy97c2VjcmV0X25hbWV9Jywge1xuICAgICAgICAgICAgb3duZXIsXG4gICAgICAgICAgICByZXBvLFxuICAgICAgICAgICAgc2VjcmV0X25hbWU6IHNlY3JldE5hbWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBSZXF1aXJlcyBTZWNyZXRzIHBlcm1pc3Npb25cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvc2VjcmV0cy9wdWJsaWMta2V5Jywge1xuICAgICAgICBvd25lcixcbiAgICAgICAgcmVwbyxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgeyBrZXksIGtleV9pZDoga2V5SWQgfSA9IHJlc3BvbnNlLmRhdGE7XG5cbiAgICAgIGF3YWl0IHNvZGl1bS5yZWFkeTtcblxuICAgICAgZm9yIChjb25zdCBbbmFtZSwgc2VjcmV0XSBvZiBPYmplY3QuZW50cmllcyhwYXJzZWQpKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBuYW1lID09PSAnR0hfQk9UX1BBVCcgfHxcbiAgICAgICAgICBuYW1lID09PSAnR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVInIHx8XG4gICAgICAgICAgbmFtZSA9PT0gJ0dIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSTEFCJ1xuICAgICAgICApIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbnZlcnQgU2VjcmV0ICYgQmFzZTY0IGtleSB0byBVaW50OEFycmF5LlxuICAgICAgICBjb25zdCByYXdLZXkgPSBzb2RpdW0uZnJvbV9iYXNlNjQoa2V5LCBzb2RpdW0uYmFzZTY0X3ZhcmlhbnRzLk9SSUdJTkFMKTtcbiAgICAgICAgY29uc3QgcmF3U2VjID0gc29kaXVtLmZyb21fc3RyaW5nKHNlY3JldCk7XG5cbiAgICAgICAgLy8gRW5jcnlwdCB0aGUgc2VjcmV0IHVzaW5nIExpYlNvZGl1bVxuICAgICAgICBjb25zdCBlbmNCeXRlcyA9IHNvZGl1bS5jcnlwdG9fYm94X3NlYWwocmF3U2VjLCByYXdLZXkpO1xuXG4gICAgICAgIC8vIENvbnZlcnQgZW5jcnlwdGVkIFVpbnQ4QXJyYXkgdG8gQmFzZTY0XG4gICAgICAgIGNvbnN0IGVuY0Jhc2U2NCA9IHNvZGl1bS50b19iYXNlNjQoZW5jQnl0ZXMsIHNvZGl1bS5iYXNlNjRfdmFyaWFudHMuT1JJR0lOQUwpO1xuXG4gICAgICAgIC8vIFJlcXVpcmVzIFNlY3JldHMgcGVybWlzc2lvblxuICAgICAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ1BVVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9zZWNyZXRzL3tzZWNyZXRfbmFtZX0nLCB7XG4gICAgICAgICAgb3duZXIsXG4gICAgICAgICAgcmVwbyxcbiAgICAgICAgICBzZWNyZXRfbmFtZTogbmFtZSxcbiAgICAgICAgICBlbmNyeXB0ZWRfdmFsdWU6IGVuY0Jhc2U2NCxcbiAgICAgICAgICBrZXlfaWQ6IGtleUlkLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKCdTa2lwIHNldHVwU2VjcmV0cyBkdWUgdG86JywgKGVycm9yIGFzIEVycm9yIHwgdW5kZWZpbmVkKT8uc3RhY2sgPz8gZXJyb3IpO1xuICAgIH1cbiAgfSk7XG59XG4iLCJpbXBvcnQgeyB3aXRoUmV0cnkgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYic7XG5cbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2V0T2N0b2tpdCwgZ2l0SHViVXRpbCwgaGFzR2l0SHViVG9rZW4gfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwR2l0SHViU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IFtvd25lciwgcmVwb10gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUoY29uZmlnLnJlcG9zaXRvcnkgPz8gJycpO1xuICBpZiAoIW93bmVyIHx8ICFyZXBvKSByZXR1cm47XG4gIGlmIChvd25lciAhPT0gJ1dpbGxCb29zdGVyJyAmJiBvd25lciAhPT0gJ1dpbGxCb29zdGVyTGFiJykgcmV0dXJuO1xuICBpZiAoIWhhc0dpdEh1YlRva2VuKG93bmVyKSkgcmV0dXJuO1xuXG4gIGNvbnN0IG9jdG9raXQgPSBnZXRPY3Rva2l0KG93bmVyKTtcblxuICAvLyBBZG1pbmlzdHJhdGlvbiBwZXJtaXNzaW9uXG4gIGF3YWl0IHdpdGhSZXRyeSgoKSA9PlxuICAgIG9jdG9raXQucmVxdWVzdCgnUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99Jywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgYWxsb3dfYXV0b19tZXJnZTogdHJ1ZSxcbiAgICAgIGFsbG93X21lcmdlX2NvbW1pdDogZmFsc2UsXG4gICAgICBhbGxvd19zcXVhc2hfbWVyZ2U6IHRydWUsXG4gICAgICBhbGxvd19yZWJhc2VfbWVyZ2U6IGZhbHNlLFxuICAgICAgYWxsb3dfdXBkYXRlX2JyYW5jaDogdHJ1ZSxcbiAgICAgIGRlbGV0ZV9icmFuY2hfb25fbWVyZ2U6IHRydWUsXG4gICAgICBzcXVhc2hfbWVyZ2VfY29tbWl0X3RpdGxlOiAnUFJfVElUTEUnLFxuICAgICAgc3F1YXNoX21lcmdlX2NvbW1pdF9tZXNzYWdlOiAnQkxBTksnLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAnWC1HaXRIdWItQXBpLVZlcnNpb24nOiAnMjAyMi0xMS0yOCcsXG4gICAgICB9LFxuICAgICAgLi4uKGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXIvJykgPyB7IGFsbG93X2F1dG9fbWVyZ2U6IHRydWUgfSA6IHt9KSxcbiAgICB9KVxuICApO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgZGlzdGFuY2UgfSBmcm9tICdmYXN0ZXN0LWxldmVuc2h0ZWluJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBwYWNrYWdlTWFuYWdlclJ1blBsYWNlaG9sZGVyID0gJ19fUE1fUlVOX18nO1xuXG5jb25zdCB0ZW1wbGF0ZXMgPSB7XG4gICdwdWxsX3JlcXVlc3RfdGVtcGxhdGUubWQnOiBgXG5DbG9zZSAjPElzc3VlTnVtYmVyPlxuXG4jIyBTZWxmIENoZWNrXG5cbi0gWyBdIEkndmUgY29uZmlybWVkIFxcYEFsbCBjaGVja3MgaGF2ZSBwYXNzZWRcXGAgb24gdGhpcyBwYWdlLlxuICAtIFBSIHRpdGxlIGZvbGxvd3MgW0FuZ3VsYXIncyBjb21taXQgbWVzc2FnZSBmb3JtYXRdKGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvYmxvYi9tYWluL0NPTlRSSUJVVElORy5tZCMtY29tbWl0LW1lc3NhZ2UtZm9ybWF0KS5cbiAgLSBQUiB0aXRsZSBkb2Vzbid0IGhhdmUgXFxgV0lQOlxcYC5cbiAgLSBUaGUgdGVzdCBjb21tYW5kIChlLmcuLCBcXGAke3BhY2thZ2VNYW5hZ2VyUnVuUGxhY2Vob2xkZXJ9IHRlc3RcXGApIHBhc3NlZC5cbiAgLSBUaGUgbGludCBjb21tYW5kIChlLmcuLCBcXGAke3BhY2thZ2VNYW5hZ2VyUnVuUGxhY2Vob2xkZXJ9IGxpbnRcXGApIHBhc3NlZC5cbiAgLSBZb3UgbWF5IGxlYXZlIHRoaXMgYm94IHVuY2hlY2tlZCBkdWUgdG8gbG9uZyB3b3JrZmxvd3MuXG4tIFsgXSBJJ3ZlIHJldmlld2VkIG15IGNoYW5nZXMgb24gdGhlIEdpdEh1YiBkaWZmIHZpZXcuXG4tIFsgXSBJJ3ZlIHdyaXR0ZW4gdGhlIHN0ZXBzIHRvIHRlc3QgbXkgY2hhbmdlcy5cbi0gWyBdIEkndmUgYWRkZWQgc2NyZWVuc2hvdHMgKGlmIHRoZSBVSSBjaGFuZ2VkKS5cbiAgLSBZb3UgbWF5IGxlYXZlIHRoaXMgYm94IHVuY2hlY2tlZCBpZiB5b3UgZGlkbid0IG1vZGlmeSB0aGUgVUkuXG5cbjwhLS0gUGxlYXNlIGFkZCBzY3JlZW5zaG90cyBpZiB5b3UgbW9kaWZ5IHRoZSBVSS5cbnwgQ3VycmVudCAgICAgICAgICAgICAgICAgIHwgSW4gY29taW5nICAgICAgICAgICAgICAgIHxcbnwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHxcbnwgPGltZyBzcmM9XCJcIiB3aWR0aD1cIjQwMFwiPiB8IDxpbWcgc3JjPVwiXCIgd2lkdGg9XCI0MDBcIj4gfFxuLS0+XG5cbjwhLS0gUGxlYXNlIGFkZCBzdGVwcyB0byB0ZXN0IHlvdXIgY2hhbmdlcy5cbiMjIFN0ZXBzIHRvIFRlc3RcblxuMS4gT3BlbiBodHRwOi8vbG9jYWxob3N0LWV4ZXJjb2RlLndpbGxib29zdGVyLm5ldDozMDAwL2phLUpQL2NvdXJzZXMvX2V4YW1wbGUvbGVzc29ucy9fZXhhbXBsZV9hX3BsdXNfYi9wcm9ibGVtcy9fZXhhbXBsZV9hX3BsdXNfYiBhZnRlciBsb2dpbi5cbjIuIFNlbGVjdCB0aGUgbGFuZ3VhZ2UgXFxgQ1xcYC5cbjMuIFdyaXRlIHRoZSBmb2xsb3dpbmcgY29kZTpcbiAgIFxcYFxcYFxcYGNcbiAgICNpbmNsdWRlIDxzdGRpby5oPlxuXG4gICBpbnQgbWFpbih2b2lkKSB7XG4gICAgIGludCBhLCBiO1xuXG4gICAgIHNjYW5mKFwiJWQgJWRcIiwgJmEsICZiKTtcbiAgICAgcHJpbnRmKFwiJWRcIiwgYSArIGIpO1xuICAgICByZXR1cm4gMDtcbiAgIH1cbiAgIFxcYFxcYFxcYFxuNC4gUHVzaCBcXGBTdWJtaXRcXGAgYnV0dG9uLlxuNS4gLi4uXG4tLT5cbmAudHJpbSgpLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlR2l0SHViVGVtcGxhdGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlR2l0SHViVGVtcGxhdGVzJywgYXN5bmMgKCkgPT4ge1xuICAgIGZvciAoY29uc3QgW2ZpbGVOYW1lLCBuZXdDb250ZW50XSBvZiBPYmplY3QuZW50cmllcyh0ZW1wbGF0ZXMpKSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXBwbHlQYWNrYWdlTWFuYWdlclRlbXBsYXRlKG5ld0NvbnRlbnQsIGNvbmZpZyk7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRodWInLCBmaWxlTmFtZSk7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHtcbiAgICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgICBpZiAoZGlzdGFuY2Uob2xkQ29udGVudCwgY29udGVudCkgPiBjb250ZW50Lmxlbmd0aCAvIDIpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aHViJyksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQpKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBhcHBseVBhY2thZ2VNYW5hZ2VyVGVtcGxhdGUodGVtcGxhdGU6IHN0cmluZywgY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgY29uc3QgcGFja2FnZU1hbmFnZXJDb21tYW5kID0gY29uZmlnLmlzQnVuID8gJ2J1biBydW4nIDogJ3lhcm4nO1xuICByZXR1cm4gdGVtcGxhdGUucmVwbGFjZUFsbChwYWNrYWdlTWFuYWdlclJ1blBsYWNlaG9sZGVyLCBwYWNrYWdlTWFuYWdlckNvbW1hbmQpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IGZzcCBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuaW1wb3J0IHsgc2ltcGxlR2l0IH0gZnJvbSAnc2ltcGxlLWdpdCc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcbmltcG9ydCB7IHogfSBmcm9tICd6b2QnO1xuXG5pbXBvcnQgeyBnZXRPY3Rva2l0LCBnaXRIdWJVdGlsIH0gZnJvbSAnLi91dGlscy9naXRodWJVdGlsLmpzJztcbmltcG9ydCB7IGdsb2JJZ25vcmUgfSBmcm9tICcuL3V0aWxzL2dsb2JVdGlsLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBQYWNrYWdlQ29uZmlnIHtcbiAgZGlyUGF0aDogc3RyaW5nO1xuICBkb2NrZXJmaWxlOiBzdHJpbmc7XG4gIGlzUm9vdDogYm9vbGVhbjtcbiAgaXNQdWJsaWNSZXBvOiBib29sZWFuO1xuICBpc1JlZmVycmVkQnlPdGhlclJlcG86IGJvb2xlYW47XG4gIHJlcG9zaXRvcnk/OiBzdHJpbmc7XG4gIHJlcG9BdXRob3I/OiBzdHJpbmc7XG4gIHJlcG9OYW1lPzogc3RyaW5nO1xuICBpc1dpbGxCb29zdGVyUmVwbzogYm9vbGVhbjtcbiAgaXNCdW46IGJvb2xlYW47XG4gIGlzRXNtUGFja2FnZTogYm9vbGVhbjtcbiAgaXNXaWxsQm9vc3RlckNvbmZpZ3M6IGJvb2xlYW47XG4gIC8vIGRlcGVuZGVuY3kgaW5mb3JtYXRpb25cbiAgZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluRG9ja2VyZmlsZTogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5HZW1maWxlOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkdvTW9kOiBib29sZWFuO1xuICBkb2VzQ29udGFpblBhY2thZ2VKc29uOiBib29sZWFuO1xuICBkb2VzQ29udGFpblBvZXRyeUxvY2s6IGJvb2xlYW47XG4gIGRvZXNDb250YWluUG9tWG1sOiBib29sZWFuO1xuICBkb2VzQ29udGFpblB1YnNwZWNZYW1sOiBib29sZWFuO1xuICBkb2VzQ29udGFpblRlbXBsYXRlWWFtbDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Wc2NvZGVTZXR0aW5nc0pzb246IGJvb2xlYW47XG4gIC8vIHNvdXJjZSBjb2RlIGZpbGVzXG4gIGRvZXNDb250YWluSmF2YVNjcmlwdDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5UeXBlU2NyaXB0OiBib29sZWFuO1xuICBkb2VzQ29udGFpbkpzeE9yVHN4OiBib29sZWFuO1xuICBkb2VzQ29udGFpbkphdmFTY3JpcHRJblBhY2thZ2VzOiBib29sZWFuO1xuICBkb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkpzeE9yVHN4SW5QYWNrYWdlczogYm9vbGVhbjtcblxuICBoYXNTdGFydFRlc3RTZXJ2ZXI6IGJvb2xlYW47XG5cbiAgZGVwZW5kaW5nOiB7XG4gICAgYmxpdHo6IGJvb2xlYW47XG4gICAgZmlyZWJhc2U6IGJvb2xlYW47XG4gICAgZ2VuSTE4blRzOiBib29sZWFuO1xuICAgIGxpdGVzdHJlYW06IGJvb2xlYW47XG4gICAgbmV4dDogYm9vbGVhbjtcbiAgICBwbGF5d3JpZ2h0VGVzdDogYm9vbGVhbjtcbiAgICBwcmlzbWE6IGJvb2xlYW47XG4gICAgcHlyaWdodDogYm9vbGVhbjtcbiAgICByZWFjdDogYm9vbGVhbjtcbiAgICByZWFjdE5hdGl2ZTogYm9vbGVhbjtcbiAgICBzZW1hbnRpY1JlbGVhc2U6IGJvb2xlYW47XG4gICAgc3Rvcnlib29rOiBib29sZWFuO1xuICAgIHdiOiBib29sZWFuO1xuICB9O1xuICByZWxlYXNlOiB7XG4gICAgYnJhbmNoZXM6IHN0cmluZ1tdO1xuICAgIGdpdGh1YjogYm9vbGVhbjtcbiAgICBucG06IGJvb2xlYW47XG4gIH07XG4gIGVzbGludEJhc2U/OiBFc2xpbnRFeHRlbnNpb25CYXNlO1xuICBoYXNWZXJzaW9uU2V0dGluZ3M6IGJvb2xlYW47XG4gIHBhY2thZ2VKc29uPzogUGFja2FnZUpzb247XG4gIHdiZnlKc29uPzogV2JmeUpzb247XG59XG5cbnR5cGUgV2JmeUpzb24gPSB6LmluZmVyPHR5cGVvZiB3YmZ5SnNvblNjaGVtYT47XG5cbmNvbnN0IHdiZnlKc29uU2NoZW1hID0gei5vYmplY3Qoe1xuICB0eXBvczogelxuICAgIC5vYmplY3Qoe1xuICAgICAgYWxsOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgICAgZG9jOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgICAgdHM6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgICB0ZXh0OiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgIH0pXG4gICAgLm9wdGlvbmFsKCksXG59KTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFBhY2thZ2VDb25maWcoXG4gIGRpclBhdGg6IHN0cmluZyxcbiAgcm9vdENvbmZpZz86IFBhY2thZ2VDb25maWdcbik6IFByb21pc2U8UGFja2FnZUNvbmZpZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICB0cnkge1xuICAgIGNvbnN0IGRvZXNDb250YWluUGFja2FnZUpzb24gPSBmcy5leGlzdHNTeW5jKHBhY2thZ2VKc29uUGF0aCk7XG4gICAgbGV0IGRlcGVuZGVuY2llczogUGFja2FnZUpzb25bJ2RlcGVuZGVuY2llcyddID0ge307XG4gICAgbGV0IGRldkRlcGVuZGVuY2llczogUGFja2FnZUpzb25bJ2RldkRlcGVuZGVuY2llcyddID0ge307XG4gICAgbGV0IHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiA9IHt9O1xuICAgIGxldCBlc21QYWNrYWdlID0gZmFsc2U7XG4gICAgaWYgKGRvZXNDb250YWluUGFja2FnZUpzb24pIHtcbiAgICAgIGNvbnN0IHBhY2thZ2VKc29uVGV4dCA9IGZzLnJlYWRGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgsICd1dGY4Jyk7XG4gICAgICBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UocGFja2FnZUpzb25UZXh0KSBhcyBQYWNrYWdlSnNvbjtcbiAgICAgIGRlcGVuZGVuY2llcyA9IHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICAgIGRldkRlcGVuZGVuY2llcyA9IHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICAgIGVzbVBhY2thZ2UgPSBwYWNrYWdlSnNvbi50eXBlID09PSAnbW9kdWxlJztcbiAgICB9XG5cbiAgICBsZXQgcmVsZWFzZUJyYW5jaGVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCByZWxlYXNlUGx1Z2luczogc3RyaW5nW10gPSBbXTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVsZWFzZXJjSnNvblBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy5yZWxlYXNlcmMuanNvbicpO1xuICAgICAgY29uc3QganNvbiA9IEpTT04ucGFyc2UoYXdhaXQgZnNwLnJlYWRGaWxlKHJlbGVhc2VyY0pzb25QYXRoLCAndXRmOCcpKSBhc1xuICAgICAgICB8IHtcbiAgICAgICAgICAgIGJyYW5jaGVzOiBzdHJpbmdbXTtcbiAgICAgICAgICAgIHBsdWdpbnM/OiBzdHJpbmdbXVtdO1xuICAgICAgICAgIH1cbiAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICByZWxlYXNlQnJhbmNoZXMgPSBqc29uPy5icmFuY2hlcyA/PyBbXTtcbiAgICAgIHJlbGVhc2VQbHVnaW5zID0ganNvbj8ucGx1Z2lucz8uZmxhdCgpID8/IFtdO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cblxuICAgIGNvbnN0IGlzUm9vdCA9XG4gICAgICBwYXRoLmJhc2VuYW1lKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLi4nKSkgIT09ICdwYWNrYWdlcycgfHxcbiAgICAgICFmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLi4nLCAnLi4nLCAncGFja2FnZS5qc29uJykpO1xuXG4gICAgbGV0IHJlcG9JbmZvOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICBpZiAoaXNSb290KSB7XG4gICAgICByZXBvSW5mbyA9IGF3YWl0IGZldGNoUmVwb0luZm8oZGlyUGF0aCwgcGFja2FnZUpzb24pO1xuICAgIH1cblxuICAgIGxldCBoYXNWZXJzaW9uU2V0dGluZ3MgPSBoYXNWZXJzaW9uU2V0dGluZ3NGaWxlKGRpclBhdGgpO1xuICAgIGZvciAoY29uc3QgcHJlZml4IG9mIFsnamF2YScsICdub2RlJywgJ3B5dGhvbiddKSB7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgYC4ke3ByZWZpeH0tdmVyc2lvbmApKSkge1xuICAgICAgICBoYXNWZXJzaW9uU2V0dGluZ3MgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgZG9ja2VyZmlsZSA9ICcnO1xuICAgIHRyeSB7XG4gICAgICBkb2NrZXJmaWxlID0gYXdhaXQgZnNwLnJlYWRGaWxlKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnRG9ja2VyZmlsZScpLCAndXRmOCcpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cblxuICAgIC8vIFJlYWQgd2JmeS5qc29uXG4gICAgY29uc3Qgd2JmeUpzb25QYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICd3YmZ5Lmpzb24nKTtcbiAgICBsZXQgd2JmeUpzb246IFdiZnlKc29uIHwgdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB3YmZ5SnNvblRleHQgPSBhd2FpdCBmc3AucmVhZEZpbGUod2JmeUpzb25QYXRoLCAndXRmOCcpO1xuICAgICAgd2JmeUpzb24gPSB3YmZ5SnNvblNjaGVtYS5wYXJzZShKU09OLnBhcnNlKHdiZnlKc29uVGV4dCkpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cblxuICAgIGNvbnN0IHJlcG9GdWxsTmFtZSA9IHR5cGVvZiByZXBvSW5mbz8uZnVsbF9uYW1lID09PSAnc3RyaW5nJyA/IHJlcG9JbmZvLmZ1bGxfbmFtZSA6IHVuZGVmaW5lZDtcbiAgICBsZXQgcmVwb0F1dGhvcjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGxldCByZXBvTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmIChyZXBvRnVsbE5hbWUpIHtcbiAgICAgIGNvbnN0IHJlcG9QYXJ0cyA9IHJlcG9GdWxsTmFtZS5zcGxpdCgnLycpO1xuICAgICAgaWYgKHJlcG9QYXJ0cy5sZW5ndGggPj0gMikge1xuICAgICAgICByZXBvQXV0aG9yID0gcmVwb1BhcnRzWzBdO1xuICAgICAgICByZXBvTmFtZSA9IHJlcG9QYXJ0c1sxXTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcmVwb3NpdG9yeSA9IHJlcG9GdWxsTmFtZSA/IGBnaXRodWI6JHtyZXBvRnVsbE5hbWV9YCA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBjb25maWc6IFBhY2thZ2VDb25maWcgPSB7XG4gICAgICBkaXJQYXRoLFxuICAgICAgZG9ja2VyZmlsZSxcbiAgICAgIGlzUm9vdCxcbiAgICAgIGlzUHVibGljUmVwbzogcmVwb0luZm8/LnByaXZhdGUgPT09IGZhbHNlLFxuICAgICAgaXNSZWZlcnJlZEJ5T3RoZXJSZXBvOiAhIXBhY2thZ2VKc29uLmZpbGVzLFxuICAgICAgcmVwb3NpdG9yeSxcbiAgICAgIHJlcG9BdXRob3IsXG4gICAgICByZXBvTmFtZSxcbiAgICAgIGlzV2lsbEJvb3N0ZXJSZXBvOiBCb29sZWFuKFxuICAgICAgICByZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXIvJykgfHwgcmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyTGFiLycpXG4gICAgICApLFxuICAgICAgaXNCdW46IHJvb3RDb25maWc/LmlzQnVuIHx8IGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGRpclBhdGgsICdidW4ubG9jaycpKSxcbiAgICAgIGlzRXNtUGFja2FnZTogZXNtUGFja2FnZSxcbiAgICAgIGlzV2lsbEJvb3N0ZXJDb25maWdzOiBwYWNrYWdlSnNvblBhdGguaW5jbHVkZXMoYCR7cGF0aC5zZXB9d2lsbGJvb3N0ZXItY29uZmlnc2ApLFxuICAgICAgZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnM6IGNvbnRhaW5zQW55KCdwYWNrYWdlcy8qKi9wYWNrYWdlLmpzb24nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluRG9ja2VyZmlsZTogISFkb2NrZXJmaWxlIHx8IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdkb2NrZXItY29tcG9zZS55bWwnKSksXG4gICAgICBkb2VzQ29udGFpbkdlbWZpbGU6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdHZW1maWxlJykpLFxuICAgICAgZG9lc0NvbnRhaW5Hb01vZDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2dvLm1vZCcpKSxcbiAgICAgIGRvZXNDb250YWluUGFja2FnZUpzb246IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKSksXG4gICAgICBkb2VzQ29udGFpblBvZXRyeUxvY2s6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwb2V0cnkubG9jaycpKSxcbiAgICAgIGRvZXNDb250YWluUG9tWG1sOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncG9tLnhtbCcpKSxcbiAgICAgIGRvZXNDb250YWluUHVic3BlY1lhbWw6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwdWJzcGVjLnlhbWwnKSksXG4gICAgICBkb2VzQ29udGFpblRlbXBsYXRlWWFtbDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3RlbXBsYXRlLnlhbWwnKSksXG4gICAgICBkb2VzQ29udGFpblZzY29kZVNldHRpbmdzSnNvbjogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy52c2NvZGUnLCAnc2V0dGluZ3MuanNvbicpKSxcbiAgICAgIGRvZXNDb250YWluSmF2YVNjcmlwdDogY29udGFpbnNBbnkoJ3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3h9JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpblR5cGVTY3JpcHQ6IGNvbnRhaW5zQW55KCd7YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2N0cyxtdHMsdHMsdHN4fScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5Kc3hPclRzeDogY29udGFpbnNBbnkoJ3thcHAsc3JjLHRlc3R9LyoqLyoue3Qsan1zeCcsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5KYXZhU2NyaXB0SW5QYWNrYWdlczogY29udGFpbnNBbnkoJ3BhY2thZ2VzLyoqL3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3h9JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzOiBjb250YWluc0FueSgncGFja2FnZXMvKiove2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjdHMsbXRzLHRzLHRzeH0nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluSnN4T3JUc3hJblBhY2thZ2VzOiBjb250YWluc0FueSgncGFja2FnZXMvKiove2FwcCxzcmMsdGVzdH0vKiovKi57dCxqfXN4JywgZGlyUGF0aCksXG4gICAgICBoYXNTdGFydFRlc3RTZXJ2ZXI6ICEhcGFja2FnZUpzb24uc2NyaXB0cz8uWydzdGFydC10ZXN0LXNlcnZlciddLFxuICAgICAgZGVwZW5kaW5nOiB7XG4gICAgICAgIGJsaXR6OiAhIWRlcGVuZGVuY2llcy5ibGl0eixcbiAgICAgICAgZmlyZWJhc2U6ICEhZGV2RGVwZW5kZW5jaWVzWydmaXJlYmFzZS10b29scyddLFxuICAgICAgICBnZW5JMThuVHM6ICEhZGV2RGVwZW5kZW5jaWVzWydnZW4taTE4bi10cyddLFxuICAgICAgICBsaXRlc3RyZWFtOiBkb2NrZXJmaWxlLmluY2x1ZGVzKCdpbnN0YWxsLWxpdGVzdHJlYW0uc2gnKSxcbiAgICAgICAgcmVhY3Q6ICEhZGVwZW5kZW5jaWVzLnJlYWN0LFxuICAgICAgICBuZXh0OiAhIWRlcGVuZGVuY2llcy5uZXh0LFxuICAgICAgICBwbGF5d3JpZ2h0VGVzdDpcbiAgICAgICAgICAhIWRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddIHx8ICEhZGV2RGVwZW5kZW5jaWVzWydAcGxheXdyaWdodC90ZXN0J10gfHwgISFkZXZEZXBlbmRlbmNpZXMucGxheXdyaWdodCxcbiAgICAgICAgcHJpc21hOiAhIWRlcGVuZGVuY2llc1snQHByaXNtYS9jbGllbnQnXSB8fCAhIWRldkRlcGVuZGVuY2llcy5wcmlzbWEsXG4gICAgICAgIHB5cmlnaHQ6ICEhZGV2RGVwZW5kZW5jaWVzLnB5cmlnaHQsXG4gICAgICAgIHJlYWN0TmF0aXZlOiAhIWRlcGVuZGVuY2llc1sncmVhY3QtbmF0aXZlJ10sXG4gICAgICAgIHNlbWFudGljUmVsZWFzZTogISEoXG4gICAgICAgICAgZGV2RGVwZW5kZW5jaWVzWydzZW1hbnRpYy1yZWxlYXNlJ10gfHxcbiAgICAgICAgICByZWxlYXNlQnJhbmNoZXMubGVuZ3RoID4gMCB8fFxuICAgICAgICAgIHJlbGVhc2VQbHVnaW5zLmxlbmd0aCA+IDBcbiAgICAgICAgKSxcbiAgICAgICAgc3Rvcnlib29rOiAhIWRldkRlcGVuZGVuY2llc1snQHN0b3J5Ym9vay9yZWFjdCddLFxuICAgICAgICB3YjogISFkZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci93YiddIHx8ICEhZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvd2InXSxcbiAgICAgIH0sXG4gICAgICByZWxlYXNlOiB7XG4gICAgICAgIGJyYW5jaGVzOiByZWxlYXNlQnJhbmNoZXMsXG4gICAgICAgIGdpdGh1YjogcmVsZWFzZVBsdWdpbnMuaW5jbHVkZXMoJ0BzZW1hbnRpYy1yZWxlYXNlL2dpdGh1YicpLFxuICAgICAgICBucG06IHJlbGVhc2VQbHVnaW5zLmluY2x1ZGVzKCdAc2VtYW50aWMtcmVsZWFzZS9ucG0nKSxcbiAgICAgIH0sXG4gICAgICBoYXNWZXJzaW9uU2V0dGluZ3MsXG4gICAgICBwYWNrYWdlSnNvbixcbiAgICAgIHdiZnlKc29uLFxuICAgIH07XG4gICAgaWYgKCFjb25maWcuaXNCdW4pIHtcbiAgICAgIGNvbmZpZy5lc2xpbnRCYXNlID0gZ2V0RXNsaW50RXh0ZW5zaW9uQmFzZShjb25maWcpO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5HZW1maWxlIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5Hb01vZCB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24gfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2sgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblBvbVhtbCB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblRlbXBsYXRlWWFtbFxuICAgICkge1xuICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5mdW5jdGlvbiBoYXNWZXJzaW9uU2V0dGluZ3NGaWxlKGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBjdXJyZW50ID0gcGF0aC5yZXNvbHZlKGRpclBhdGgpO1xuICByZXR1cm4gKFxuICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGN1cnJlbnQsICdtaXNlLnRvbWwnKSkgfHxcbiAgICBmcy5leGlzdHNTeW5jKHBhdGguam9pbihjdXJyZW50LCAnLm1pc2UudG9tbCcpKSB8fFxuICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGN1cnJlbnQsICcudG9vbC12ZXJzaW9ucycpKVxuICApO1xufVxuXG5mdW5jdGlvbiBjb250YWluc0FueShwYXR0ZXJuOiBzdHJpbmcsIGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZmcuZ2xvYlN5bmMocGF0dGVybiwgeyBkb3Q6IHRydWUsIGN3ZDogZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH0pLmxlbmd0aCA+IDA7XG59XG5cbmV4cG9ydCB0eXBlIEVzbGludEV4dGVuc2lvbkJhc2UgPVxuICB8ICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cy1yZWFjdCdcbiAgfCAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMnXG4gIHwgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzLXJlYWN0J1xuICB8ICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcydcbiAgfCAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctbmV4dCc7XG5cbmZ1bmN0aW9uIGdldEVzbGludEV4dGVuc2lvbkJhc2UoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogRXNsaW50RXh0ZW5zaW9uQmFzZSB8IHVuZGVmaW5lZCB7XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLm5leHQpIHtcbiAgICByZXR1cm4gJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLW5leHQnO1xuICB9IGVsc2UgaWYgKGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQpIHtcbiAgICByZXR1cm4gY29uZmlnLmRvZXNDb250YWluSnN4T3JUc3ggPyAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMtcmVhY3QnIDogJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzJztcbiAgfSBlbHNlIHtcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluSnN4T3JUc3gpIHtcbiAgICAgIHJldHVybiAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMtcmVhY3QnO1xuICAgIH0gZWxzZSBpZiAoY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdCkge1xuICAgICAgcmV0dXJuICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcyc7XG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoUmVwb0luZm8oZGlyUGF0aDogc3RyaW5nLCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGdpdCA9IHNpbXBsZUdpdChkaXJQYXRoKTtcbiAgY29uc3QgcmVtb3RlcyA9IGF3YWl0IGdpdC5nZXRSZW1vdGVzKHRydWUpO1xuICBjb25zdCBvcmlnaW4gPSByZW1vdGVzLmZpbmQoKHIpID0+IHIubmFtZSA9PT0gJ29yaWdpbicpO1xuICBjb25zdCByZW1vdGVVcmwgPSBvcmlnaW4/LnJlZnMuZmV0Y2ggPz8gb3JpZ2luPy5yZWZzLnB1c2g7XG4gIGlmICh0eXBlb2YgcmVtb3RlVXJsID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXF1ZXN0UmVwb0luZm8ocmVtb3RlVXJsKTtcbiAgICBpZiAoanNvbikgcmV0dXJuIGpzb247XG4gIH1cblxuICBjb25zdCB1cmwgPSB0eXBlb2YgcGFja2FnZUpzb24ucmVwb3NpdG9yeSA9PT0gJ3N0cmluZycgPyBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5IDogcGFja2FnZUpzb24ucmVwb3NpdG9yeT8udXJsO1xuICBpZiAodXJsKSB7XG4gICAgY29uc3QganNvbiA9IGF3YWl0IHJlcXVlc3RSZXBvSW5mbyh1cmwpO1xuICAgIGlmIChqc29uICYmIGpzb24ubWVzc2FnZSAhPT0gJ05vdCBGb3VuZCcpIHJldHVybiBqc29uO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlcXVlc3RSZXBvSW5mbyh1cmxPckZ1bGxOYW1lOiBzdHJpbmcpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IFtvcmcsIG5hbWVdID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKHVybE9yRnVsbE5hbWUpO1xuICBpZiAoIW9yZyB8fCAhbmFtZSkgcmV0dXJuO1xuXG4gIGNvbnN0IHJldCA9IHsgZnVsbF9uYW1lOiBgJHtvcmd9LyR7bmFtZX1gIH07XG4gIHRyeSB7XG4gICAgLy8gTWV0YWRhdGEgcGVybWlzc2lvblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZ2V0T2N0b2tpdCgpLnJlcXVlc3QoJ0dFVCAvcmVwb3Mve293bmVyfS97cmVwb30nLCB7XG4gICAgICBvd25lcjogb3JnLFxuICAgICAgcmVwbzogbmFtZSxcbiAgICB9KTtcbiAgICBPYmplY3QuYXNzaWduKHJldCwgcmVzcG9uc2UuZGF0YSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3QgcmVkaXJlY3RlZEZ1bGxOYW1lID0gZ2V0UmVkaXJlY3RlZFJlcG9GdWxsTmFtZShlcnJvcik7XG4gICAgaWYgKHJlZGlyZWN0ZWRGdWxsTmFtZSkge1xuICAgICAgcmV0LmZ1bGxfbmFtZSA9IHJlZGlyZWN0ZWRGdWxsTmFtZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gZ2V0UmVkaXJlY3RlZFJlcG9GdWxsTmFtZShlcnJvcjogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghZXJyb3IgfHwgdHlwZW9mIGVycm9yICE9PSAnb2JqZWN0JykgcmV0dXJuO1xuXG4gIGNvbnN0IHJlc3BvbnNlID1cbiAgICAncmVzcG9uc2UnIGluIGVycm9yXG4gICAgICA/IChlcnJvciBhcyB7IHJlc3BvbnNlPzogeyBzdGF0dXM/OiBudW1iZXI7IGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IH0gfSkucmVzcG9uc2VcbiAgICAgIDogdW5kZWZpbmVkO1xuICBjb25zdCBzdGF0dXMgPSByZXNwb25zZT8uc3RhdHVzID8/IChlcnJvciBhcyB7IHN0YXR1cz86IG51bWJlciB9KS5zdGF0dXM7XG4gIGlmIChzdGF0dXMgIT09IDMwMSAmJiBzdGF0dXMgIT09IDMwMikgcmV0dXJuO1xuXG4gIGNvbnN0IGxvY2F0aW9uID0gcmVzcG9uc2U/LmhlYWRlcnM/LmxvY2F0aW9uO1xuICBpZiAodHlwZW9mIGxvY2F0aW9uICE9PSAnc3RyaW5nJykgcmV0dXJuO1xuXG4gIGNvbnN0IFtvcmcsIG5hbWVdID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGxvY2F0aW9uKTtcbiAgaWYgKCFvcmcgfHwgIW5hbWUpIHJldHVybjtcblxuICByZXR1cm4gYCR7b3JnfS8ke25hbWV9YDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGlnbm9yZUVycm9yQXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYic7XG5pbXBvcnQgeWFyZ3MgZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaXhEb2NrZXJmaWxlIH0gZnJvbSAnLi9maXhlcnMvZG9ja2VyZmlsZS5qcyc7XG5pbXBvcnQgeyBmaXhOZXh0Q29uZmlnSnNvbiB9IGZyb20gJy4vZml4ZXJzL25leHRDb25maWcuanMnO1xuaW1wb3J0IHsgZml4UGxheXdyaWdodENvbmZpZyB9IGZyb20gJy4vZml4ZXJzL3BsYXl3cmlnaHRDb25maWcuanMnO1xuaW1wb3J0IHsgZml4UHJpc21hRW52RmlsZXMgfSBmcm9tICcuL2ZpeGVycy9wcmlzbWEuanMnO1xuaW1wb3J0IHsgZml4VGVzdERpcmVjdG9yaWVzVXBkYXRpbmdQYWNrYWdlSnNvbiB9IGZyb20gJy4vZml4ZXJzL3Rlc3REaXJlY3RvcnkuanMnO1xuaW1wb3J0IHsgZml4VHlwZURlZmluaXRpb25zIH0gZnJvbSAnLi9maXhlcnMvdHlwZURlZmluaXRpb24uanMnO1xuaW1wb3J0IHsgZml4VHlwb3MgfSBmcm9tICcuL2ZpeGVycy90eXBvcy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2FnZW50cy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUJpb21lSnNvbmMgfSBmcm9tICcuL2dlbmVyYXRvcnMvYmlvbWUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVCdW5maWdUb21sIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2J1bmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZURvY2tlcmlnbm9yZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9kb2NrZXJpZ25vcmUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVFZGl0b3Jjb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvZWRpdG9yY29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlRXNsaW50cmMgfSBmcm9tICcuL2dlbmVyYXRvcnMvZXNsaW50Q29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2VtaW5pQ29uZmlnIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dlbWluaUNvbmZpZy5qcyc7XG5pbXBvcnQgeyByZW1vdmVHZW1pbmlTZXR0aW5ncyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9nZW1pbmlTZXR0aW5ncy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMgfSBmcm9tICcuL2dlbmVyYXRvcnMvZ2l0YXR0cmlidXRlcy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUdpdGlnbm9yZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9naXRpZ25vcmUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVJZGVhU2V0dGluZ3MgfSBmcm9tICcuL2dlbmVyYXRvcnMvaWRlYS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUxlZnRob29rVXBkYXRpbmdQYWNrYWdlSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9sZWZ0aG9vay5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUxpbnRzdGFnZWRyYyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9saW50c3RhZ2VkcmMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVQYWNrYWdlSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9wYWNrYWdlSnNvbi5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVByZXR0aWVyaWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3ByZXR0aWVyaWdub3JlLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24gfSBmcm9tICcuL2dlbmVyYXRvcnMvcHlyaWdodENvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJlYWRtZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9yZWFkbWUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVSZWxlYXNlcmMgfSBmcm9tICcuL2dlbmVyYXRvcnMvcmVsZWFzZXJjLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUmVub3ZhdGVKc29uIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3Jlbm92YXRlSnNvbi5qcyc7XG5pbXBvcnQgeyBpbnN0YWxsQWdlbnRTa2lsbHMgfSBmcm9tICcuL2dlbmVyYXRvcnMvc2tpbGxzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlVHNjb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvdHNjb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyB9IGZyb20gJy4vZ2VuZXJhdG9ycy92c2NvZGVTZXR0aW5ncy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVdvcmtmbG93cywgaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8gfSBmcm9tICcuL2dlbmVyYXRvcnMvd29ya2Zsb3cuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVZYXJucmNZbWwgfSBmcm9tICcuL2dlbmVyYXRvcnMveWFybnJjLmpzJztcbmltcG9ydCB7IHNldHVwTGFiZWxzIH0gZnJvbSAnLi9naXRodWIvbGFiZWwuanMnO1xuaW1wb3J0IHsgc2V0dXBTZWNyZXRzIH0gZnJvbSAnLi9naXRodWIvc2VjcmV0LmpzJztcbmltcG9ydCB7IHNldHVwR2l0SHViU2V0dGluZ3MgfSBmcm9tICcuL2dpdGh1Yi9zZXR0aW5ncy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcyB9IGZyb20gJy4vZ2l0aHViL3RlbXBsYXRlLmpzJztcbmltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuL29wdGlvbnMuanMnO1xuaW1wb3J0IHsgZ2V0UGFja2FnZUNvbmZpZyB9IGZyb20gJy4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jIH0gZnJvbSAnLi91dGlscy9zcGF3blV0aWwuanMnO1xuaW1wb3J0IHsgc2hvdWxkU2tpcFdpbGxib29zdGVyQ29uZmlnc0VzbGludFBhY2thZ2UgfSBmcm9tICcuL3V0aWxzL3dpbGxib29zdGVyQ29uZmlnc1V0aWwuanMnO1xuXG5hc3luYyBmdW5jdGlvbiBtYWluKCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBhcmd2ID0gYXdhaXQgeWFyZ3MocHJvY2Vzcy5hcmd2LnNsaWNlKDIpKVxuICAgIC5jb21tYW5kKCckMCBbcGF0aHMuLl0nLCAnTWFrZSBhIGdpdmVuIHByb2plY3QgZm9sbG93IHRoZSBXaWxsQm9vc3RlciBzdGFuZGFyZCcsICh5YXJncykgPT4ge1xuICAgICAgeWFyZ3MucG9zaXRpb25hbCgncGF0aHMnLCB7XG4gICAgICAgIGRlc2NyaWJlOiAncHJvamVjdCBwYXRocyB0byBiZSB3YmZpZWQnLFxuICAgICAgICBhcnJheTogdHJ1ZSxcbiAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgIGRlZmF1bHQ6IFsnLiddLFxuICAgICAgfSk7XG4gICAgfSlcbiAgICAub3B0aW9ucyh7XG4gICAgICBlbnY6IHtcbiAgICAgICAgZGVzY3JpcHRpb246ICdVcGxvYWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFzIHNlY3JldHMgdG8gR2l0SHViJyxcbiAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgYWxpYXM6ICdlJyxcbiAgICAgIH0sXG4gICAgICBza2lwRGVwczoge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ1NraXAgZGVwZW5kZW5jeSBpbnN0YWxsYXRpb24nLFxuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICBhbGlhczogJ2QnLFxuICAgICAgfSxcbiAgICAgIHZlcmJvc2U6IHtcbiAgICAgICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIG9yIG5vdCB0byBlbmFibGUgdmVyYm9zZSBtb2RlJyxcbiAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgYWxpYXM6ICd2JyxcbiAgICAgIH0sXG4gICAgfSlcbiAgICAudmVyc2lvbihnZXRWZXJzaW9uKCkpXG4gICAgLnN0cmljdCgpLmFyZ3Y7XG4gIG9wdGlvbnMuaXNWZXJib3NlID0gYXJndi52ZXJib3NlO1xuICBvcHRpb25zLmRvZXNVcGxvYWRFbnZWYXJzID0gYXJndi5lbnY7XG5cbiAgZm9yIChjb25zdCByb290RGlyUGF0aCBvZiBhcmd2LnBhdGhzIGFzIHN0cmluZ1tdKSB7XG4gICAgY29uc3QgcGFja2FnZXNEaXJQYXRoID0gcGF0aC5qb2luKHJvb3REaXJQYXRoLCAncGFja2FnZXMnKTtcbiAgICBjb25zdCBkaXJlbnRzID0gKGF3YWl0IGlnbm9yZUVycm9yQXN5bmMoKCkgPT4gZnMucHJvbWlzZXMucmVhZGRpcihwYWNrYWdlc0RpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KSkpID8/IFtdO1xuICAgIGNvbnN0IHN1YkRpclBhdGhzID0gZGlyZW50cy5maWx0ZXIoKGQpID0+IGQuaXNEaXJlY3RvcnkoKSkubWFwKChkKSA9PiBwYXRoLmpvaW4ocGFja2FnZXNEaXJQYXRoLCBkLm5hbWUpKTtcblxuICAgIGF3YWl0IGZpeFRlc3REaXJlY3Rvcmllc1VwZGF0aW5nUGFja2FnZUpzb24oW3Jvb3REaXJQYXRoLCAuLi5zdWJEaXJQYXRoc10pO1xuXG4gICAgY29uc3Qgcm9vdENvbmZpZyA9IGF3YWl0IGdldFBhY2thZ2VDb25maWcocm9vdERpclBhdGgpO1xuICAgIGNvbnNvbGUubG9nKCdyb290Q29uZmlnOicsIHJvb3RDb25maWcpO1xuICAgIGlmICghcm9vdENvbmZpZykge1xuICAgICAgY29uc29sZS5lcnJvcihgdGhlcmUgaXMgbm8gdmFsaWQgcGFja2FnZS5qc29uIGluICR7cm9vdERpclBhdGh9YCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgYWJicmV2aWF0aW9uUHJvbWlzZSA9IGZpeFR5cG9zKHJvb3RDb25maWcpO1xuXG4gICAgY29uc3QgbnVsbGFibGVTdWJQYWNrYWdlQ29uZmlncyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgc3ViRGlyUGF0aHMubWFwKChzdWJEaXJQYXRoKSA9PiBnZXRQYWNrYWdlQ29uZmlnKHN1YkRpclBhdGgsIHJvb3RDb25maWcpKVxuICAgICk7XG4gICAgY29uc3Qgc3ViUGFja2FnZUNvbmZpZ3MgPSBudWxsYWJsZVN1YlBhY2thZ2VDb25maWdzLmZpbHRlcigoY29uZmlnKSA9PiAhIWNvbmZpZyk7XG4gICAgY29uc3QgYWxsUGFja2FnZUNvbmZpZ3MgPSBbcm9vdENvbmZpZywgLi4uc3ViUGFja2FnZUNvbmZpZ3NdO1xuXG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBmb3IgKGNvbnN0IGNvbmZpZyBvZiBhbGxQYWNrYWdlQ29uZmlncykge1xuICAgICAgICBjb25zb2xlLmluZm8oY29uZmlnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJbnN0YWxsIHlhcm4gYmVycnlcbiAgICBhd2FpdCBnZW5lcmF0ZVlhcm5yY1ltbChyb290Q29uZmlnKTtcbiAgICBpZiAocm9vdENvbmZpZy5pc0J1bikge1xuICAgICAgYXdhaXQgZ2VuZXJhdGVCdW5maWdUb21sKHJvb3RDb25maWcpO1xuICAgIH1cblxuICAgIGNvbnN0IHNob3VsZFJ1bldvcmtmbG93cyA9XG4gICAgICAhaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8ocm9vdENvbmZpZy5yZXBvc2l0b3J5KSAmJlxuICAgICAgKHJvb3RDb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyLycpIHx8XG4gICAgICAgIHJvb3RDb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyTGFiLycpKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBmaXhEb2NrZXJmaWxlKHJvb3RDb25maWcpLFxuICAgICAgZml4UHJpc21hRW52RmlsZXMocm9vdENvbmZpZyksXG4gICAgICBhYmJyZXZpYXRpb25Qcm9taXNlLnRoZW4oKCkgPT4gZ2VuZXJhdGVSZWFkbWUocm9vdENvbmZpZykpLFxuICAgICAgZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucyhyb290Q29uZmlnLCBhbGxQYWNrYWdlQ29uZmlncyksXG4gICAgICBnZW5lcmF0ZURvY2tlcmlnbm9yZShyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlRWRpdG9yY29uZmlnKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVHZW1pbmlDb25maWcocm9vdENvbmZpZywgYWxsUGFja2FnZUNvbmZpZ3MpLFxuICAgICAgcmVtb3ZlR2VtaW5pU2V0dGluZ3Mocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlSWRlYVNldHRpbmdzKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVSZW5vdmF0ZUpzb24ocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZVJlbGVhc2VyYyhyb290Q29uZmlnKSxcbiAgICAgIC4uLihzaG91bGRSdW5Xb3JrZmxvd3MgPyBbZ2VuZXJhdGVXb3JrZmxvd3Mocm9vdENvbmZpZyldIDogW10pLFxuICAgICAgc2V0dXBMYWJlbHMocm9vdENvbmZpZyksXG4gICAgICBzZXR1cFNlY3JldHMocm9vdENvbmZpZyksXG4gICAgICBzZXR1cEdpdEh1YlNldHRpbmdzKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVMZWZ0aG9va1VwZGF0aW5nUGFja2FnZUpzb24ocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUxpbnRzdGFnZWRyYyhyb290Q29uZmlnKSxcbiAgICBdKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG5cbiAgICBjb25zdCBwcm9taXNlczogUHJvbWlzZTx2b2lkPltdID0gW107XG4gICAgZm9yIChjb25zdCBjb25maWcgb2YgYWxsUGFja2FnZUNvbmZpZ3MpIHtcbiAgICAgIGlmIChzaG91bGRTa2lwV2lsbGJvb3N0ZXJDb25maWdzRXNsaW50UGFja2FnZShjb25maWcpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXMpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChmaXhUeXBlRGVmaW5pdGlvbnMoY29uZmlnLCBjb25maWcuaXNSb290ID8gYWxsUGFja2FnZUNvbmZpZ3MgOiBbY29uZmlnXSkpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChmaXhQbGF5d3JpZ2h0Q29uZmlnKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGZpeE5leHRDb25maWdKc29uKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgYXdhaXQgZ2VuZXJhdGVHaXRpZ25vcmUoY29uZmlnLCByb290Q29uZmlnKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgICAgIGlmICghY29uZmlnLmlzUm9vdCAmJiAhY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBhd2FpdCBnZW5lcmF0ZVByZXR0aWVyaWdub3JlKGNvbmZpZyk7XG4gICAgICBhd2FpdCBnZW5lcmF0ZVBhY2thZ2VKc29uKGNvbmZpZywgcm9vdENvbmZpZywgYXJndi5za2lwRGVwcyk7XG5cbiAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVMaW50c3RhZ2VkcmMoY29uZmlnKSk7XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluVnNjb2RlU2V0dGluZ3NKc29uICYmIGNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyhjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVUc2NvbmZpZyhjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdCB8fFxuICAgICAgICBjb25maWcuZG9lc0NvbnRhaW5KYXZhU2NyaXB0SW5QYWNrYWdlcyB8fFxuICAgICAgICBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8XG4gICAgICAgIGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzXG4gICAgICApIHtcbiAgICAgICAgaWYgKHJvb3RDb25maWcuaXNCdW4pIHtcbiAgICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlQmlvbWVKc29uYyhjb25maWcpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJvb3RDb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3MpIHtcbiAgICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlRXNsaW50cmMoY29uZmlnKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnB5cmlnaHQpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZVB5cmlnaHRDb25maWdKc29uKGNvbmZpZykpO1xuICAgICAgfVxuICAgIH1cbiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuXG4gICAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSByb290Q29uZmlnLmlzQnVuID8gJ2J1bicgOiAneWFybic7XG4gICAgLy8gUmVmcmVzaCBsb2NrIGZpbGVzXG4gICAgaWYgKHJvb3RDb25maWcuaXNCdW4pIHtcbiAgICAgIGZzLnJtU3luYyhwYXRoLmpvaW4ocm9vdERpclBhdGgsICdidW4ubG9jaycpLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ3VwZGF0ZSddLCByb290RGlyUGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZzLnJtU3luYyhwYXRoLmpvaW4ocm9vdERpclBhdGgsICd5YXJuLmxvY2snKSwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydpbnN0YWxsJywgJy0tbm8taW1tdXRhYmxlJ10sIHJvb3REaXJQYXRoKTtcbiAgICB9XG4gICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ2NsZWFudXAnXSwgcm9vdERpclBhdGgpO1xuICAgIC8vICd5YXJuIGluc3RhbGwnIHNob3VsZCBiZSBhZnRlciBgeWFybiBjbGVhbnVwYCBiZWNhdXNlIHlhcm4gYmVycnkgZ2VuZXJhdGVzIHlhcm4ubG9ja1xuICAgIC8vIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGNvbnRlbnRzIG9mIGRlcGVuZGFudCBzdWItcGFja2FnZSBpbiBtb25vcmVwb1xuICAgIGlmICghcm9vdENvbmZpZy5pc0J1bikge1xuICAgICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ2luc3RhbGwnLCAnLS1uby1pbW11dGFibGUnXSwgcm9vdERpclBhdGgpO1xuICAgIH1cblxuICAgIGF3YWl0IGluc3RhbGxBZ2VudFNraWxscyhyb290Q29uZmlnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRWZXJzaW9uKCk6IHN0cmluZyB7XG4gIGxldCBwYWNrYWdlSnNvbkRpciA9IHBhdGguZGlybmFtZShuZXcgVVJMKGltcG9ydC5tZXRhLnVybCkucGF0aG5hbWUpO1xuICB3aGlsZSAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHBhY2thZ2VKc29uRGlyLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgcGFja2FnZUpzb25EaXIgPSBwYXRoLmRpcm5hbWUocGFja2FnZUpzb25EaXIpO1xuICB9XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHBhY2thZ2VKc29uRGlyLCAncGFja2FnZS5qc29uJyksICd1dGY4JykpIGFzIHtcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG4gIH07XG4gIHJldHVybiBwYWNrYWdlSnNvbi52ZXJzaW9uO1xufVxuXG5hd2FpdCBtYWluKCk7XG4iXSwibmFtZXMiOlsib3B0aW9ucyIsImlzVmVyYm9zZSIsImRvZXNVcGxvYWRFbnZWYXJzIiwibG9nZ2VyIiwiZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbiIsIm5hbWUiLCJmdW5jIiwiY29uc29sZSIsImluZm8iLCJlcnJvciIsIkVycm9yIiwic3RhY2siLCJTdHJpbmciLCJhc3luYyIsImZpeERvY2tlcmZpbGUiLCJjb25maWciLCJkb2VzQ29udGFpbkRvY2tlcmZpbGUiLCJvbGRDb250ZW50IiwiZG9ja2VyZmlsZSIsIm5ld0NvbnRlbnQiLCJmcyIsIndyaXRlRmlsZSIsInBhdGgiLCJqb2luIiwiZGlyUGF0aCIsImZzVXRpbCIsInJlYWRGaWxlSWdub3JpbmdFcnJvciIsImZpbGVQYXRoIiwicHJvbWlzZXMiLCJyZWFkRmlsZSIsImdlbmVyYXRlRmlsZSIsImNvbnRlbnQiLCJta2RpciIsImRpcm5hbWUiLCJyZWN1cnNpdmUiLCJub3JtYWxpemVkQ29udGVudCIsInJlcGxhY2VBbGwiLCJ0cmltIiwicHJvbWlzZVBvb2wiLCJQcm9taXNlUG9vbCIsImZpeE5leHRDb25maWdKc29uIiwibWFwIiwiZXh0IiwicmVzb2x2ZSIsImZpbmQiLCJwIiwiZXhpc3RzU3luYyIsInJlcGxhY2UiLCJfIiwic2V0dGluZ3NUZXh0IiwiaW5jbHVkZXMiLCJydW4iLCJsaXRlcmFsIiwidmFsdWUiLCJraW5kIiwiYXNPYmplY3QiLCJkZWZhdWx0Q29uZmlnIiwiZm9yYmlkT25seSIsInJldHJpZXMiLCJ1c2UiLCJiYXNlVVJMIiwidHJhY2UiLCJzY3JlZW5zaG90IiwidmlkZW8iLCJ3ZWJTZXJ2ZXIiLCJjb21tYW5kIiwidXJsIiwicmV1c2VFeGlzdGluZ1NlcnZlciIsInRpbWVvdXQiLCJzdGRvdXQiLCJzdGRlcnIiLCJlbnYiLCJncmFjZWZ1bFNodXRkb3duIiwiZml4UGxheXdyaWdodENvbmZpZyIsIm1hdGNoIiwiZXhlYyIsIm9iamVjdExpdGVyYWwiLCJwYXJzZWQiLCJzb3VyY2UiLCJ0cyIsImNyZWF0ZVNvdXJjZUZpbGUiLCJTY3JpcHRUYXJnZXQiLCJMYXRlc3QiLCJTY3JpcHRLaW5kIiwiVFMiLCJzdGF0ZW1lbnQiLCJzdGF0ZW1lbnRzIiwiaXNWYXJpYWJsZVN0YXRlbWVudCIsImRlY2xhcmF0aW9uIiwiZGVjbGFyYXRpb25MaXN0IiwiZGVjbGFyYXRpb25zIiwiaW5pdGlhbGl6ZXIiLCJpc09iamVjdExpdGVyYWxFeHByZXNzaW9uIiwicGFyc2VPYmplY3RMaXRlcmFsRXhwcmVzc2lvbiIsInBhcnNlT2JqZWN0TGl0ZXJhbCIsIm1lcmdlZCIsIm1lcmdlIiwiYWxsIiwiQm9vbGVhbiIsInBhY2thZ2VKc29uIiwic2NyaXB0cyIsImhhc0Jhc2VVcmwiLCJlbnZGaWxlUGF0aHMiLCJlbnZGaWxlUGF0aCIsInRlc3QiLCJoYXNOZXh0UHVibGljQmFzZVVybCIsInVzZUNvbmZpZyIsIm5ld09iamVjdExpdGVyYWwiLCJzdHJpbmdpZnlPYmplY3QiLCJwcm9wZXJ0eSIsInByb3BlcnRpZXMiLCJpc1Byb3BlcnR5QXNzaWdubWVudCIsImlzSWRlbnRpZmllciIsImlzU3RyaW5nTGl0ZXJhbCIsInBhcnNlRXhwcmVzc2lvbiIsInVuZGVmaW5lZCIsImdldFRleHQiLCJleHByZXNzaW9uIiwicGFyc2VkT2JqZWN0IiwiaXNBcnJheUxpdGVyYWxFeHByZXNzaW9uIiwiZWxlbWVudHMiLCJlbGVtZW50Iiwic29tZSIsInN0cmluZ2lmeVZhbHVlIiwibGV2ZWwiLCJ2YWx1ZXMiLCJsZW5ndGgiLCJpbmRlbnQiLCJyZXBlYXQiLCJsaW5lcyIsInN0cmluZ2lmaWVkIiwic3BsaXQiLCJhdCIsImluZGV4IiwiY2xvc2luZ0luZGVudCIsInN0cmluZ2lmeUFycmF5Iiwib2JqZWN0IiwiT2JqZWN0IiwiZW50cmllcyIsImtleSIsImdsb2JJZ25vcmUiLCJmaXhQcmlzbWFFbnZGaWxlcyIsImVudkZpbGVzIiwiZmciLCJnbG9iIiwiZG90IiwiY3dkIiwiaWdub3JlIiwiZW52RmlsZSIsImZpeFRlc3REaXJlY3Rvcmllc1VwZGF0aW5nUGFja2FnZUpzb24iLCJwYWNrYWdlRGlyUGF0aHMiLCJQcm9taXNlIiwibmV3VGVzdERpclBhdGgiLCJwYWNrYWdlRGlyUGF0aCIsIm9sZFRlc3REaXJOYW1lIiwib2xkVGVzdERpclBhdGgiLCJyZW5hbWUiLCJmaXhUeXBlRGVmaW5pdGlvbnMiLCJjb25maWdzSW5jbHVkaW5nQ2hpbGRyZW4iLCJsaWJUeXBlRGlyUGF0aCIsInNyY1R5cGVEaXJQYXRoIiwiaXNSb290IiwiZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMiLCJkaXJlbnRzIiwiaWdub3JlRW5vZW50QXN5bmMiLCJyZWFkZGlyIiwid2l0aEZpbGVUeXBlcyIsImRpcmVudCIsImRpck5hbWUiLCJzbGljZSIsImhhc1R5cGVEZWNsYXJhdGlvbkV4dGVuc2lvbiIsImVuZHNXaXRoIiwicGFja2FnZU5hbWUiLCJoYXNMaWJyYXJ5IiwiZGVwZW5kZW5jaWVzIiwiZGV2RGVwZW5kZW5jaWVzIiwiaXNGaWxlIiwiaXNEaXJlY3RvcnkiLCJvdmVyd3JpdGVNZXJnZSIsImRlc3RpbmF0aW9uQXJyYXkiLCJzb3VyY2VBcnJheSIsImNvbWJpbmVNZXJnZSIsInRhcmdldCIsImRlc3RpbmF0aW9uIiwiaXRlbSIsImNsb25lVW5sZXNzT3RoZXJ3aXNlU3BlY2lmaWVkIiwiaXNNZXJnZWFibGVPYmplY3QiLCJwdXNoIiwic29ydEtleXMiLCJvYmoiLCJrZXlBbmRWYWx1ZXMiLCJ0b1NvcnRlZCIsImtleTEiLCJrZXkyIiwibG9jYWxlQ29tcGFyZSIsInB1YmxpY1JlcG9BdXRvZml4V29ya2Zsb3ciLCJvbiIsInB1bGxfcmVxdWVzdCIsImJyYW5jaGVzIiwicGVybWlzc2lvbnMiLCJjb250ZW50cyIsImNvbmN1cnJlbmN5IiwiZ3JvdXAiLCJqb2JzIiwiYXV0b2ZpeCIsInByaXZhdGVSZXBvQXV0b2ZpeFdvcmtmbG93IiwidXNlcyIsIndvcmtmbG93cyIsInJlbGVhc2UiLCJwdWxsX3JlcXVlc3RfdGFyZ2V0IiwidHlwZXMiLCJzeW5jIiwiaXNzdWVzIiwiaWYiLCJ3aXRoIiwic2VjcmV0cyIsIkNMQVVERV9DT0RFX09BVVRIX1RPS0VOIiwiT1BFTkFJX0FQSV9LRVkiLCJHRU1JTklfQVBJX0tFWSIsImdlbmVyYXRlV29ya2Zsb3dzIiwicm9vdENvbmZpZyIsImlzUmV1c2FibGVXb3JrZmxvd3NSZXBvIiwicmVwb3NpdG9yeSIsIndvcmtmbG93c1BhdGgiLCJzZW1hbnRpY1ltbFBhdGgiLCJybSIsImZvcmNlIiwiZmlsZU5hbWVTZXQiLCJTZXQiLCJmaWx0ZXIiLCJkZXBlbmRpbmciLCJzZW1hbnRpY1JlbGVhc2UiLCJhZGQiLCJmaWxlTmFtZSIsImJhc2VuYW1lIiwid3JpdGVXb3JrZmxvd1lhbWwiLCJkZXBsb3lQcm9kdWN0aW9uV29ya2Zsb3dFeGlzdHMiLCJ3cml0ZVlhbWwiLCJpc1B1YmxpY1JlcG8iLCJjbG9uZURlZXAiLCJwYWNrYWdlTWFuYWdlciIsImlzQnVuIiwic3RlcHMiLCJidWlsZCIsImF1dG9maXhXb3JrZmxvdyIsImF1dG9maXhKb2IiLCJnZW5lcmF0ZUF1dG9maXhXb3JrZmxvdyIsIm5ld1NldHRpbmdzIiwib2xkU2V0dGluZ3MiLCJ5YW1sIiwibG9hZCIsImFycmF5TWVyZ2UiLCJzdGFydHNXaXRoIiwibW92ZVRvQm90dG9tIiwiYWN0aW9ucyIsInRyaWdnZXJfZGVwbG95X3dvcmtmbG93IiwiaXNSZXVzYWJsZVdvcmtmbG93Iiwiam9iIiwibm9ybWFsaXplSm9iIiwic2NoZWR1bGUiLCJicmFuY2giLCJwYXJhbXMiLCJzeW5jX3BhcmFtc193aXRob3V0X2Rlc3QiLCJ3b3JrZmxvd19kaXNwYXRjaCIsIk5QTV9UT0tFTiIsIkdIX1RPS0VOIiwiRklSRUJBU0VfVE9LRU4iLCJHQ1BfU0FfS0VZX0pTT05fRk9SX0ZJUkVCQVNFIiwiRElTQ09SRF9XRUJIT09LX1VSTCIsInNlcnZlcl91cmwiLCJkb3RfZW52X3BhdGgiLCJGTFlfQVBJX1RPS0VOIiwiZGVwbG95X2NvbW1hbmQiLCJjaV9sYWJlbCIsImdpdGh1Yl9ob3N0ZWRfcnVubmVyIiwia2V5cyIsIm5ld1NlY3JldHMiLCJ5YW1sVGV4dCIsImR1bXAiLCJsaW5lV2lkdGgiLCJub0NvbXBhdE1vZGUiLCJzdHlsZXMiLCJmaXhUeXBvcyIsInBhY2thZ2VDb25maWciLCJkb2NGaWxlcyIsIm1kRmlsZSIsImZpeFR5cG9zSW5UZXh0IiwicmVwbGFjZVdpdGhDb25maWciLCJ0c0ZpbGVzIiwidHNGaWxlIiwiZml4VHlwb3NJbkNvZGUiLCJ0ZXh0QmFzZWRGaWxlcyIsImZpbGUiLCJwcm9taXNlQWxsIiwicHJvcE5hbWUiLCJiZWZvcmUiLCJhZnRlciIsIndiZnlKc29uIiwidHlwb3MiLCJnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zIiwiYWxsQ29uZmlncyIsImFnZW50c0V4dHJhUGF0aCIsImV4dHJhQ29udGVudCIsInRvb2xOYW1lIiwiZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9uIiwiY3Vyc29yUnVsZXNQYXRoIiwiY3Vyc29yUnVsZXNDb250ZW50IiwiZnJvbnRtYXR0ZXIiLCJib2R5IiwiZ2VuZXJhdGVDdXJzb3JHZW5lcmFsTWRjQ29udGVudCIsImJhc2VDb250ZW50IiwiZGVzY3JpcHRpb24iLCJpc1dpbGxCb29zdGVyUmVwbyIsImMiLCJoYXNTdGFydFRlc3RTZXJ2ZXIiLCJnZW5lcmF0ZUFnZW50Q29kaW5nU3R5bGUiLCJoYXNOZXdTZWN0aW9uIiwiZ2VuSTE4blRzIiwicmVhY3QiLCJuZXh0IiwiZ2VuZXJhdGVCaW9tZUpzb25jIiwicm9vdCIsIiRzY2hlbWEiLCJleHRlbmRzIiwiSlNPTiIsInBhcnNlIiwic3RyaW5naWZ5IiwibWluaW11bVJlbGVhc2VBZ2VFeGNsdWRlcyIsImV4aXN0aW5nQ29udGVudCIsImJ1bmZpZ1RvbWwiLCJwYXJzZUJ1bmZpZ1RvbWwiLCJidW4iLCJnZW5lcmF0ZVJ1blNlY3Rpb24iLCJpbnN0YWxsIiwiZXhhY3QiLCJnZW5lcmF0ZUJ1bmZpZ1RvbWwiLCJyZWFkRmlsZVN5bmMiLCJ1c2VyQ29udGVudEhlYWRlciIsInVzZXJDb250ZW50SGVhZGVyUmVnZXgiLCJzZXBhcmF0b3IiLCJkZWZhdWx0SGVhZFVzZXJDb250ZW50IiwiZGVmYXVsdFRhaWxVc2VyQ29udGVudCIsImlnbm9yZUZpbGVVdGlsIiwic2VwYXJhdG9yUHJlZml4IiwicmVhZEdpdGlnbm9yZVdpdGhvdXRTZXBhcmF0b3JzIiwibGFzdEhlYWRlckluZGV4IiwiZ2V0SW5kZXhPZlRhaWxVc2VyQ29udGVudEhlYWRlciIsImdldEhlYWRVc2VyQ29udGVudCIsImluZGV4T2YiLCJ0aGlzIiwiZ2V0VGFpbFVzZXJDb250ZW50IiwiaXNCZXJyeVplcm9JbnN0YWxsRW5hYmxlZCIsImxhc3RJbmRleCIsImxhc3RJbmRleE9mIiwiZ2VuZXJhdGVEb2NrZXJpZ25vcmUiLCJleHRlbnNpb25zIiwiY29kZVdpdGgySW5kZW50U2l6ZSIsImNvZGVXaXRoNEluZGVudFNpemUiLCJtYXJrZG93bkxpa2UiLCJlc2xpbnQiLCJwcmV0dGllciIsImJpb21lIiwiZ2VuZXJhdGVFeHRlbnNpb25zIiwiZ2VuZXJhdGVFZGl0b3Jjb25maWciLCJnZW5lcmF0ZUVzbGludHJjIiwiZXNsaW50QmFzZSIsImhhdmVfZnVuIiwiY29kZV9yZXZpZXciLCJkaXNhYmxlIiwiY29tbWVudF9zZXZlcml0eV90aHJlc2hvbGQiLCJtYXhfcmV2aWV3X2NvbW1lbnRzIiwicHVsbF9yZXF1ZXN0X29wZW5lZCIsImhlbHAiLCJzdW1tYXJ5IiwiaWdub3JlX3BhdHRlcm5zIiwiZ2VuZXJhdGVHZW1pbmlDb25maWciLCJjb25maWdGaWxlUGF0aCIsInN0eWxlZ3VpZGVGaWxlUGF0aCIsIm5ld0NvbmZpZyIsIm9sZENvbmZpZyIsInlhbWxDb250ZW50IiwiY29kaW5nUnVsZUV4dHJhQ29udGVudCIsInRyaW1TdGFydCIsInN0eWxlZ3VpZGVDb250ZW50IiwidHJpbUVuZCIsInJlbW92ZUdlbWluaVNldHRpbmdzIiwiZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzIiwiZGVmYXVsdE5hbWVzIiwiZ2VuZXJhdGVHaXRpZ25vcmUiLCJoZWFkVXNlckNvbnRlbnQiLCJ0YWlsVXNlckNvbnRlbnQiLCJuYW1lcyIsImRvZXNDb250YWluR2VtZmlsZSIsImRvZXNDb250YWluR29Nb2QiLCJkb2VzQ29udGFpblBhY2thZ2VKc29uIiwiZG9lc0NvbnRhaW5Qb21YbWwiLCJkb2VzQ29udGFpblB1YnNwZWNZYW1sIiwiZG9lc0NvbnRhaW5UZW1wbGF0ZVlhbWwiLCJkb2VzQ29udGFpblBvZXRyeUxvY2siLCJibGl0eiIsImZpcmViYXNlIiwicHJpc21hIiwicGxheXdyaWdodFRlc3QiLCJyZWFjdE5hdGl2ZSIsInN0b3J5Ym9vayIsImxpdGVzdHJlYW0iLCJnZW5lcmF0ZWQiLCJyZWFkQ2FjaGUiLCJyZXNwb25zZSIsImZldGNoIiwicmVzcG9uc2VUZXh0IiwidGV4dCIsIm9rIiwid3JpdGVDYWNoZSIsIm9zIiwiaG9tZWRpciIsInN0YXQiLCJEYXRlIiwibm93IiwibXRpbWVNcyIsImNyZWF0ZVRhc2tPcHRpb25zIiwicnVubmVyIiwiYXJncyIsImV4dGVuc2lvbiIsInByZXR0aWVyQ29udGVudCIsImJpb21lQ29udGVudCIsImdlbmVyYXRlSWRlYVNldHRpbmdzIiwiZG9lc0NvbnRhaW5KYXZhU2NyaXB0IiwiZG9lc0NvbnRhaW5KYXZhU2NyaXB0SW5QYWNrYWdlcyIsImRvZXNDb250YWluVHlwZVNjcmlwdCIsImRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXMiLCJzcGF3blN5bmMiLCJyZXRyeSIsIm5ld0NtZCIsIm5ld0FyZ3MiLCJnZXRTcGF3blN5bmNBcmdzIiwiY2hpbGRfcHJvY2VzcyIsInN0YXR1cyIsInNwYXduU3luY0FuZFJldHVyblN0ZG91dCIsInN0ZGlvIiwicHJvYyIsInRvU3RyaW5nIiwicyIsIm1lc3NhZ2UiLCJwcm9jZXNzIiwiUEFUSCIsIkJFUlJZX0JJTl9GT0xERVIiLCJlbmNvZGluZyIsInNoZWxsIiwiRXNsaW50VXRpbCIsImdldExpbnRGaXhTdWZmaXgiLCJkb2VzQ29udGFpbkpzeE9yVHN4IiwiZ2l0SHViVXRpbCIsImdldE9yZ0FuZE5hbWUiLCJ1cmxPckZ1bGxOYW1lIiwidXJsV2l0aG91dFByb3RvY29sIiwib2N0b2tpdENhY2hlIiwiTWFwIiwiZ2V0T2N0b2tpdCIsIm93bmVyIiwiY2FjaGVkIiwiZ2V0Iiwib2N0b2tpdCIsIk9jdG9raXQiLCJhdXRoIiwiZ2V0R2l0SHViVG9rZW4iLCJzZXQiLCJoYXNHaXRIdWJUb2tlbiIsIkdIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSIiwiR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVJMQUIiLCJHSVRIVUJfVE9LRU4iLCJwaW5uZWREZXBlbmRlbmN5U3BlY2lmaWVycyIsInR5cGVzY3JpcHQiLCJzaG91bGRTa2lwV2lsbGJvb3N0ZXJDb25maWdzRXNsaW50UGFja2FnZSIsImlzV2lsbEJvb3N0ZXJDb25maWdzIiwianNDb21tb25EZXBzIiwidHNDb21tb25EZXBzIiwicmVhY3RDb21tb25EZXBzIiwiZXNsaW50RGVwcyIsImdlbmVyYXRlUGFja2FnZUpzb24iLCJza2lwQWRkaW5nRGVwcyIsImpzb25UZXh0IiwianNvbk9iaiIsInBlZXJEZXBlbmRlbmNpZXMiLCJhdXRob3IiLCJ0c2xpYiIsImxlcm5hIiwicGluc3QiLCJyZW1vdmVEZXByZWNhdGVkU3R1ZmYiLCJnZW5lcmF0ZVNjcmlwdHMiLCJwcmV0dGlmeSIsIm9yaWdpbmFsQ29udGVudCIsImxpbmUiLCJuZXdMaW5lIiwibCIsImdlbmVyYXRlUHJldHRpZXJTdWZmaXgiLCJwb2V0cnlEZXZEZXBlbmRlbmNpZXMiLCJodXNreSIsInBvc3RpbnN0YWxsIiwicG9zdHB1Ymxpc2giLCJwcmVwdWJsaXNoT25seSIsInByZXBhY2siLCJwb3N0cGFjayIsInByZXBhcmUiLCJ2ZXJzaW9uIiwiYXJ0aWxsZXJ5IiwicGxheXdyaWdodCIsIndvcmtzcGFjZXMiLCJBcnJheSIsImlzQXJyYXkiLCJ3b3Jrc3BhY2UiLCJnbG9iU3luYyIsIndiIiwibWljcm9tYXRjaCIsImdldFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyIsImplc3QiLCJkZXAiLCJwcml2YXRlIiwibGljZW5zZSIsInB1Ymxpc2hDb25maWciLCJhY2Nlc3MiLCJtYWluIiwicmVzb2x1dGlvbnMiLCJsaW50Iiwic2NyaXB0TmFtZSIsInNjcmlwdCIsImRpcnMiLCJkaXIiLCJmb3JtYXQiLCJweXRob25GaWxlcyIsImRpck5hbWVTZXQiLCJweXRob25GaWxlIiwiZmlyc3QiLCJzZWNvbmQiLCJzaXplIiwiZGlyTmFtZXNTdHIiLCJleGlzdGluZ1JlcG9zaXRvcnkiLCJub3JtYWxpemVkUmVwb3NpdG9yeSIsIm5vcm1hbGl6ZVJlcG9zaXRvcnlVcmxGb3JQYWNrYWdlSnNvbiIsImJ1aWxkTm9ybWFsaXplZFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbiIsIm5vcm1hbGl6ZWRFeGlzdGluZ1JlcG9zaXRvcnkiLCJmb3JtYXRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24iLCJwYWNrYWdlTmFtZXMiLCJoYXMiLCJpc1dvcmtzcGFjZVBhY2thZ2UiLCJnZXRMYXRlc3RQcml2YXRlUGFja2FnZVNwZWNpZmllciIsInVwZGF0ZVByaXZhdGVQYWNrYWdlcyIsIm5ld0pzb25UZXh0Iiwib2xkQW5kTmV3U2NyaXB0TmFtZXMiLCJvbGROYW1lIiwibmV3TmFtZSIsImZpbGVzIiwiZml4U2NyaXB0TmFtZXMiLCJ1bmlxdWVEZXBlbmRlbmNpZXMiLCJkZXBlbmRlbmN5U3BlY2lmaWVycyIsImRlcGVuZGVuY3kiLCJnZXREZXBlbmRlbmN5U3BlY2lmaWVyIiwidW5pcXVlRGV2RGVwZW5kZW5jaWVzIiwiZGV2RGVwZW5kZW5jeVNwZWNpZmllcnMiLCJjb3JlIiwiZ2V0UGlubmVkRGVwZW5kZW5jeVNwZWNpZmllciIsInJlcG8iLCJyZXBvc2l0b3J5VXJsIiwibWF0Y2hlZCIsIm5vcm1hbGl6ZWRVcmwiLCJ0eXBlIiwib2xkU2NyaXB0cyIsImhhc1R5cGVjaGVjayIsImNsZWFudXAiLCJ0eXBlY2hlY2siLCJvbGRUZXN0IiwicHlyaWdodCIsImNvbW1pdEhhc2giLCJvcmdhbml6YXRpb24iLCJyZWplY3QiLCJnZXRMYXRlc3RDb21taXRIYXNoIiwiYmFzZVNldHRpbmdzIiwicHJlQ29tbWl0U2V0dGluZ3MiLCJjb21tYW5kcyIsImdlbmVyYXRlTGVmdGhvb2tVcGRhdGluZ1BhY2thZ2VKc29uIiwiaHVza3lEaXJQYXRoIiwiaGFzSHVza3lEaXIiLCJzZXR0aW5ncyIsImdldENsZWFudXBHbG9icyIsImdldENsZWFudXBDb21tYW5kIiwicHJlUHVzaCIsInR5cGVjaGVja0NvbW1hbmQiLCJnZXRQcmVQdXNoU2NyaXB0IiwibWtkaXJTeW5jIiwibW9kZSIsInBvc3RNZXJnZUNvbW1hbmQiLCJwb3N0TWVyZ2VDb21tYW5kcyIsImhhc1ZlcnNpb25TZXR0aW5ncyIsInRvb2xzQ2hhbmdlZFBhdHRlcm4iLCJyYXciLCJpbnN0YWxsQ29tbWFuZCIsInJtTmV4dERpcmVjdG9yeSIsImdlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMiLCJzdXBwb3J0ZWRFeHRlbnNpb25zIiwibG9jYWxXYlBhY2thZ2VKc29uUGF0aCIsImhhc0xvY2FsV2JXb3Jrc3BhY2UiLCJlc2xpbnRSdWxlU3VmZml4IiwiZG9lc0NvbnRhaW5Kc3hPclRzeEluUGFja2FnZXMiLCJlc2xpbnRQYXR0ZXJuIiwiZ2VuZXJhdGVMaW50c3RhZ2VkcmMiLCJnZW5lcmF0ZVByZXR0aWVyaWdub3JlIiwiZ2l0aWdub3JlRmlsZVBhdGgiLCJnaXRpZ25vcmVDb250ZW50IiwiYWRkaXRpb25hbENvbnRlbnQiLCJ2ZW52UGF0aCIsInZlbnYiLCJnZW5lcmF0ZVB5cmlnaHRDb25maWdKc29uIiwiZ2VuZXJhdGVSZWFkbWUiLCJpbnNlcnRCYWRnZSIsImZpbGVOYW1lcyIsInJlYWRkaXJTeW5jIiwiYmFkZ2VOYW1lIiwidG9VcHBlckNhc2UiLCJiYWRnZSIsInJlYWRtZSIsImkiLCJnZW5lcmF0ZVJlbGVhc2VyYyIsInBsdWdpbnMiLCJwbHVnaW4iLCJwcmVzZXQiLCJzdWNjZXNzQ29tbWVudENvbmRpdGlvbiIsImZhaWxDb21tZW50Q29uZGl0aW9uIiwibGFiZWxzIiwicmVsZWFzZWRMYWJlbHMiLCJnZW5lcmF0ZVJlbm92YXRlSnNvbiIsInBhY2thZ2VSdWxlcyIsInJ1bGUiLCJtYXRjaFBhY2thZ2VOYW1lcyIsImVuYWJsZWQiLCJpbnN0YWxsQWdlbnRTa2lsbHMiLCJzcmNEaXJlY3RvcmllcyIsIm5vZGUiLCJnZXRTcmNEaXJzIiwicm9vdEpzb25PYmoiLCJjb21waWxlck9wdGlvbnMiLCJhbHdheXNTdHJpY3QiLCJub1VuY2hlY2tlZEluZGV4ZWRBY2Nlc3MiLCJhbGxvd1N5bnRoZXRpY0RlZmF1bHRJbXBvcnRzIiwiZXNNb2R1bGVJbnRlcm9wIiwicmVzb2x2ZUpzb25Nb2R1bGUiLCJzb3VyY2VNYXAiLCJpbXBvcnRIZWxwZXJzIiwib3V0RGlyIiwiZXhjbHVkZSIsImluY2x1ZGUiLCJzdWJKc29uT2JqIiwiZ2VuZXJhdGVUc2NvbmZpZyIsImdlbmVyYXRlZFJvb3REaXIiLCJleGlzdGluZ1Jvb3RTb3VyY2VEaXJzIiwicGFja2FnZXNEaXJQYXRoIiwiZ2V0R2VuZXJhdGVkUm9vdERpciIsImdlbmVyYXRlZFR5cGVzIiwidHlwZU5hbWVzIiwidml0ZXN0IiwibW9jaGEiLCJjeXByZXNzIiwiZ2V0R2VuZXJhdGVkVHlwZXMiLCJnZXRUc2NvbmZpZ0V4dGVuZHMiLCJyb290RGlyIiwianN4IiwiZXhpc3RpbmdSb290RGlyIiwiZXhpc3RpbmdUeXBlcyIsImdlbmVyYXRlZEV4dGVuZHMiLCJleGlzdGluZ0V4dGVuZHMiLCJtZXJnZWRFeHRlbmRzIiwibm9ybWFsaXplRXh0ZW5kcyIsInVuaXF1ZUV4dGVuZHMiLCJtZXJnZVRzY29uZmlnRXh0ZW5kcyIsIm1lcmdlZFR5cGVzIiwidHlwZU5hbWUiLCJ0eXBlUm9vdHMiLCJzb3J0IiwiZXhwZXJpbWVudGFsRGVjb3JhdG9ycyIsInZlcmJhdGltTW9kdWxlU3ludGF4IiwiZXhjbHVkZUZpbGVQYXR0ZXJucyIsImdlbmVyYXRlVnNjb2RlU2V0dGluZ3MiLCJleGNsdWRlRmlsZVBhdHRlcm4iLCJleGNsdWRlU2V0dGluZyIsImdlbmVyYXRlWWFybnJjWW1sIiwieWFybnJjWW1sUGF0aCIsImN1cnJlbnRWZXJzaW9uIiwibGF0ZXN0VmVyc2lvbiIsInZlcnNpb25zSnNvbiIsImdldExhdGVzdFZlcnNpb24iLCJnZXRNYWpvck51bWJlciIsInJlbGVhc2VzUGF0aCIsInlhcm5yY1BhdGgiLCJkZWZhdWx0U2VtdmVyUmFuZ2VQcmVmaXgiLCJub2RlTGlua2VyIiwibm1Nb2RlIiwibnBtTWluaW1hbEFnZUdhdGUiLCJucG1QcmVhcHByb3ZlZFBhY2thZ2VzIiwiY29tcHJlc3Npb25MZXZlbCIsImluamVjdEVudmlyb25tZW50RmlsZXMiLCJlbmFibGVHbG9iYWxDYWNoZSIsIm9yaWdpbmFsTGVuZ3RoIiwicGx1Z2luUGF0aCIsIm1ham9yIiwiTnVtYmVyIiwic2V0dXBMYWJlbHMiLCJzZXR1cExhYmVsIiwiZGVsZXRlTGFiZWwiLCJ3YXJuIiwiY29sb3IiLCJyZXF1ZXN0IiwiREVQUkVDQVRFRF9TRUNSRVRfTkFNRVMiLCJzZXR1cFNlY3JldHMiLCJkb3RlbnYiLCJzZWNyZXROYW1lIiwic2VjcmV0X25hbWUiLCJrZXlfaWQiLCJrZXlJZCIsImRhdGEiLCJzb2RpdW0iLCJyZWFkeSIsInNlY3JldCIsInJhd0tleSIsImZyb21fYmFzZTY0IiwiYmFzZTY0X3ZhcmlhbnRzIiwiT1JJR0lOQUwiLCJyYXdTZWMiLCJmcm9tX3N0cmluZyIsImVuY0J5dGVzIiwiY3J5cHRvX2JveF9zZWFsIiwiZW5jQmFzZTY0IiwidG9fYmFzZTY0IiwiZW5jcnlwdGVkX3ZhbHVlIiwic2V0dXBHaXRIdWJTZXR0aW5ncyIsIndpdGhSZXRyeSIsImFsbG93X2F1dG9fbWVyZ2UiLCJhbGxvd19tZXJnZV9jb21taXQiLCJhbGxvd19zcXVhc2hfbWVyZ2UiLCJhbGxvd19yZWJhc2VfbWVyZ2UiLCJhbGxvd191cGRhdGVfYnJhbmNoIiwiZGVsZXRlX2JyYW5jaF9vbl9tZXJnZSIsInNxdWFzaF9tZXJnZV9jb21taXRfdGl0bGUiLCJzcXVhc2hfbWVyZ2VfY29tbWl0X21lc3NhZ2UiLCJoZWFkZXJzIiwicGFja2FnZU1hbmFnZXJSdW5QbGFjZWhvbGRlciIsInRlbXBsYXRlcyIsImdlbmVyYXRlR2l0SHViVGVtcGxhdGVzIiwiYXBwbHlQYWNrYWdlTWFuYWdlclRlbXBsYXRlIiwiZGlzdGFuY2UiLCJ0ZW1wbGF0ZSIsInBhY2thZ2VNYW5hZ2VyQ29tbWFuZCIsIndiZnlKc29uU2NoZW1hIiwieiIsInJlY29yZCIsInN0cmluZyIsIm9wdGlvbmFsIiwiZG9jIiwiZ2V0UGFja2FnZUNvbmZpZyIsInBhY2thZ2VKc29uUGF0aCIsImVzbVBhY2thZ2UiLCJwYWNrYWdlSnNvblRleHQiLCJyZWxlYXNlQnJhbmNoZXMiLCJyZWxlYXNlUGx1Z2lucyIsInJlbGVhc2VyY0pzb25QYXRoIiwianNvbiIsImZzcCIsImZsYXQiLCJyZXBvSW5mbyIsImdpdCIsInNpbXBsZUdpdCIsIm9yaWdpbiIsImdldFJlbW90ZXMiLCJyIiwicmVtb3RlVXJsIiwicmVmcyIsInJlcXVlc3RSZXBvSW5mbyIsImZldGNoUmVwb0luZm8iLCJjdXJyZW50IiwiaGFzVmVyc2lvblNldHRpbmdzRmlsZSIsInByZWZpeCIsIndiZnlKc29uUGF0aCIsIndiZnlKc29uVGV4dCIsInJlcG9GdWxsTmFtZSIsImZ1bGxfbmFtZSIsInJlcG9BdXRob3IiLCJyZXBvTmFtZSIsInJlcG9QYXJ0cyIsImlzUmVmZXJyZWRCeU90aGVyUmVwbyIsImlzRXNtUGFja2FnZSIsInNlcCIsImNvbnRhaW5zQW55IiwiZG9lc0NvbnRhaW5Wc2NvZGVTZXR0aW5nc0pzb24iLCJnaXRodWIiLCJucG0iLCJnZXRFc2xpbnRFeHRlbnNpb25CYXNlIiwicGF0dGVybiIsIm9yZyIsInJldCIsImFzc2lnbiIsInJlZGlyZWN0ZWRGdWxsTmFtZSIsImxvY2F0aW9uIiwiZ2V0UmVkaXJlY3RlZFJlcG9GdWxsTmFtZSIsImFyZ3YiLCJ5YXJncyIsInBvc2l0aW9uYWwiLCJkZXNjcmliZSIsImFycmF5IiwiZGVmYXVsdCIsImFsaWFzIiwic2tpcERlcHMiLCJ2ZXJib3NlIiwicGFja2FnZUpzb25EaXIiLCJVUkwiLCJwYXRobmFtZSIsImdldFZlcnNpb24iLCJzdHJpY3QiLCJyb290RGlyUGF0aCIsInBhdGhzIiwic3ViRGlyUGF0aHMiLCJpZ25vcmVFcnJvckFzeW5jIiwiZCIsImFiYnJldmlhdGlvblByb21pc2UiLCJzdWJQYWNrYWdlQ29uZmlncyIsInN1YkRpclBhdGgiLCJhbGxQYWNrYWdlQ29uZmlncyIsInNob3VsZFJ1bldvcmtmbG93cyIsInRoZW4iLCJybVN5bmMiXSwibWFwcGluZ3MiOiJxcUJBS08sTUFBTUEsRUFBVSxJQUx2QixNQUNFQyxXQUFZLEVBQ1pDLG1CQUFvQixHQ2dCZixNQUFNQyxFQUFTLElBaEJ0QixNQUNFLCtCQUFNQyxDQUEwQkMsRUFBY0MsR0FDeENOLEVBQVFDLFdBQ1ZNLFFBQVFDLEtBQUssYUFBYUgscUJBRTVCLFVBQ1FDLEdBQ1IsQ0FBRSxNQUFPRyxHQUNQRixRQUFRQyxLQUFLLHFCQUFxQkgsTUFBU0ksYUFBaUJDLE1BQVFELEVBQU1FLE1BQVFDLE9BQU9ILE1BQzNGLENBQ0lULEVBQVFDLFdBQ1ZNLFFBQVFDLEtBQUssY0FBY0gsbUJBRS9CLEdDVEtRLGVBQWVDLEVBQWNDLEdBQ2xDLE9BQU9aLEVBQU9DLDBCQUEwQixnQkFBaUJTLFVBQ3ZELElBQUtFLEVBQU9DLHNCQUF1QixPQUVuQyxNQUFNQyxFQUFhRixFQUFPRyxXQUNwQkMsRUFBYUYsRUFFZkEsSUFBZUUsU0FDYkMsRUFBR0MsVUFBVUMsRUFBS0MsS0FBS1IsRUFBT1MsUUFBUyxjQUFlTCxJQUVoRSxDQ2JP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