wbfy 5.11.21 → 5.11.23

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 +1 -1
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}),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){const s=t.resolve(n.dirPath,"playwright.config.ts");if(e.existsSync(s))return await async function(n){const s=[t.resolve(n,".env"),t.resolve(n,".env.test"),t.resolve(n,"mise.toml"),t.resolve(n,"mise.test.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}catch{}throw new Error("NEXT_PUBLIC_BASE_URL is required for Playwright. Define NEXT_PUBLIC_BASE_URL in the target repo.")}(n.dirPath),_.functionIgnoringException("fixPlaywrightConfig",async()=>{const t=await e.promises.readFile(s,"utf8"),i=function(e){const t=l.createSourceFile("playwright.config.ts",e,l.ScriptTarget.Latest,!0,l.ScriptKind.TS);let n;const s=e=>{if(!n){if(l.isCallExpression(e)&&"defineConfig"===e.expression.getText(t)){const t=e.arguments[0];if(t&&l.isObjectLiteralExpression(t))return void(n=t)}l.forEachChild(e,s)}};return s(t),n?{source:t,node:n}:void 0}(t);if(!i)return;const r=F(i.node,i.source);if(!r)return;const o=c.all([O,r]),a=Boolean(n.packageJson?.scripts?.["start-test-server"]),p=Boolean(r.webServer);a||p||delete o.webServer,function(e,t){const n=t.webServer;if("object"!==n?.kind)return;n.value.command=C(e.isBun?"'bun start-test-server'":"'yarn start-test-server'")}(n,o);const d=T(o,0),u=i.node.getStart(i.source),m=i.node.getEnd(),g=`${t.slice(0,u)}${d}${t.slice(m)}`;await $.run(()=>S.generateFile(s,g))})}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 U(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&&U(s);return e}const G={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"}}},q={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 M(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(G),i=s.jobs.autofix??{"runs-on":"ubuntu-latest"};return s.jobs.autofix={...i,steps:n},s}(n),r);let a=u(i in q?q[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?U(t.with):delete t.with,Object.keys(t.secrets).length>0){const e=U(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- Use camelCase for JavaScript and TypeScript files (or PascalCase for React components).\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){De(e,t,n,s)}function De(e,t,n,s=0){let i=1;do{const[s,r,o]=We(e,t,n);if(i=f.spawnSync(s,r,o).status??1,0===i)break}while(--s>=0);return i}function Re(e,t,n){const[s,i,r]=We(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 We(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 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 Ue(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 Ge(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 qe={"@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 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)),function(e,t){if(!e.depending.playwrightTest||!e.depending.wb||t.scripts?.["start-test-server"])return;t.scripts??={},t.scripts["start-test-server"]="wb start --mode test"}(n,a),"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)]);t.has("@willbooster/auth")&&!st(e,"@willbooster/auth")&&(delete e.devDependencies["@willbooster/auth"],e.dependencies["@willbooster/auth"]=await nt("auth"));t.has("@discord-bot/shared")&&!st(e,"@discord-bot/shared")&&(delete e.devDependencies["@discord-bot/shared"],e.dependencies["@discord-bot/shared"]=await nt("discord-bot"));t.has("@willbooster/code-analyzer")&&!st(e,"@willbooster/code-analyzer")&&(delete e.dependencies["@willbooster/code-analyzer"],e.devDependencies["@willbooster/code-analyzer"]=await nt("code-analyzer"));t.has("@willbooster/judge")&&!st(e,"@willbooster/judge")&&(delete e.devDependencies["@willbooster/judge"],e.dependencies["@willbooster/judge"]=await nt("judge"));t.has("@willbooster/llm-proxy")&&!st(e,"@willbooster/llm-proxy")&&(delete e.devDependencies["@willbooster/llm-proxy"],e.dependencies["@willbooster/llm-proxy"]=await nt("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}\n`),!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(qe))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}}async function nt(e){const t=await function(e,t){try{const n=Re("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 st(e,t){return(e.devDependencies?.[t]||e.dependencies?.[t]||"").includes("workspace")}const it={"post-merge":{scripts:{"prepare.sh":{runner:"bash"}}},"pre-push":{scripts:{"check.sh":{runner:"bash"}}}},rt={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()}}},ot='\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 at(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={...it,"pre-commit":{...rt,commands:{...rt.commands,cleanup:{...rt.commands.cleanup,glob:ct(n),run:lt(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=`${ot}\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 ct(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 lt(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){const s=t.resolve(n.dirPath,"playwright.config.ts");if(e.existsSync(s))return await async function(n){const s=[t.resolve(n,".env"),t.resolve(n,".env.test"),t.resolve(n,"mise.toml"),t.resolve(n,"mise.test.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}catch{}throw new Error("NEXT_PUBLIC_BASE_URL is required for Playwright. Define NEXT_PUBLIC_BASE_URL in the target repo.")}(n.dirPath),_.functionIgnoringException("fixPlaywrightConfig",async()=>{const t=await e.promises.readFile(s,"utf8"),i=function(e){const t=l.createSourceFile("playwright.config.ts",e,l.ScriptTarget.Latest,!0,l.ScriptKind.TS);let n;const s=e=>{if(!n){if(l.isCallExpression(e)&&"defineConfig"===e.expression.getText(t)){const t=e.arguments[0];if(t&&l.isObjectLiteralExpression(t))return void(n=t)}l.forEachChild(e,s)}};return s(t),n?{source:t,node:n}:void 0}(t);if(!i)return;const r=F(i.node,i.source);if(!r)return;const o=c.all([O,r]),a=Boolean(n.packageJson?.scripts?.["start-test-server"]),p=Boolean(r.webServer);a||p||delete o.webServer,function(e,t){const n=t.webServer;if("object"!==n?.kind)return;n.value.command=C(e.isBun?"'bun start-test-server'":"'yarn start-test-server'")}(n,o);const d=T(o,0),u=i.node.getStart(i.source),m=i.node.getEnd(),g=`${t.slice(0,u)}${d}${t.slice(m)}`;await $.run(()=>S.generateFile(s,g))})}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 U(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&&U(s);return e}const G={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"}}},q={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 M(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(G),i=s.jobs.autofix??{"runs-on":"ubuntu-latest"};return s.jobs.autofix={...i,steps:n},s}(n),r);let a=u(i in q?q[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?U(t.with):delete t.with,Object.keys(t.secrets).length>0){const e=U(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- Use camelCase for JavaScript and TypeScript files (or PascalCase for React components).\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","agent-runtime-kit","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${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){De(e,t,n,s)}function De(e,t,n,s=0){let i=1;do{const[s,r,o]=We(e,t,n);if(i=f.spawnSync(s,r,o).status??1,0===i)break}while(--s>=0);return i}function Re(e,t,n){const[s,i,r]=We(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 We(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 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 Ue(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 Ge(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 qe={"@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 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)),function(e,t){if(!e.depending.playwrightTest||!e.depending.wb||t.scripts?.["start-test-server"])return;t.scripts??={},t.scripts["start-test-server"]="wb start --mode test"}(n,a),"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)]);t.has("@willbooster/auth")&&!st(e,"@willbooster/auth")&&(delete e.devDependencies["@willbooster/auth"],e.dependencies["@willbooster/auth"]=await nt("auth"));t.has("@discord-bot/shared")&&!st(e,"@discord-bot/shared")&&(delete e.devDependencies["@discord-bot/shared"],e.dependencies["@discord-bot/shared"]=await nt("discord-bot"));t.has("@willbooster/code-analyzer")&&!st(e,"@willbooster/code-analyzer")&&(delete e.dependencies["@willbooster/code-analyzer"],e.devDependencies["@willbooster/code-analyzer"]=await nt("code-analyzer"));t.has("@willbooster/judge")&&!st(e,"@willbooster/judge")&&(delete e.devDependencies["@willbooster/judge"],e.dependencies["@willbooster/judge"]=await nt("judge"));t.has("@willbooster/llm-proxy")&&!st(e,"@willbooster/llm-proxy")&&(delete e.devDependencies["@willbooster/llm-proxy"],e.dependencies["@willbooster/llm-proxy"]=await nt("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}\n`),!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(qe))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}}async function nt(e){const t=await function(e,t){try{const n=Re("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 st(e,t){return(e.devDependencies?.[t]||e.dependencies?.[t]||"").includes("workspace")}const it={"post-merge":{scripts:{"prepare.sh":{runner:"bash"}}},"pre-push":{scripts:{"check.sh":{runner:"bash"}}}},rt={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()}}},ot='\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 at(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={...it,"pre-commit":{...rt,commands:{...rt.commands,cleanup:{...rt.commands.cleanup,glob:ct(n),run:lt(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=`${ot}\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 ct(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 lt(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 pt(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 dt(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 ut={venvPath:".",venv:".venv"};async function mt(n){return _.functionIgnoringException("generatePyrightConfigJson",async()=>{let s=u(ut);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 gt(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=ft(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=ft(i,a))}await $.run(()=>S.generateFile(s,i))})}function ft(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 ht(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 yt={$schema:"https://docs.renovatebot.com/renovate-schema.json",extends:["github>WillBooster/willbooster-configs:renovate.json5"]};async function wt(n){return _.functionIgnoringException("generateRenovateJson",async()=>{let s=u(yt);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 bt(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 vt={node:["src","test","scripts"].toSorted(),blitz:["src","test","scripts","db","integrations","mailers"].toSorted()};function kt(e){return e.depending.blitz?vt.blitz:vt.node}const xt={compilerOptions:{alwaysStrict:!0,noUncheckedIndexedAccess:!0,allowSyntheticDefaultImports:!0,esModuleInterop:!0,resolveJsonModule:!0,declaration:!0,sourceMap:!0,importHelpers:!1,noEmit:!1,outDir:"dist"},exclude:["packages/*/test/fixtures","test/fixtures"],include:["packages/*/scripts/**/*","packages/*/src/**/*","packages/*/test/**/*","scripts/**/*","src/**/*","test/**/*"]},_t={compilerOptions:{alwaysStrict:!0,noUncheckedIndexedAccess:!0,allowSyntheticDefaultImports:!0,esModuleInterop:!0,resolveJsonModule:!0,declaration:!0,sourceMap:!0,importHelpers:!1,noEmit:!1,outDir:"dist"},exclude:["test/fixtures"],include:["scripts/**/*","src/**/*","test/**/*"]};async function jt(n){return _.functionIgnoringException("generateTsconfig",async()=>{if(n.depending.blitz||n.depending.next)return;let s=u(n.isRoot?xt:_t);const i=function(n){const s=function(e){return kt(e).filter(e=>"scripts"!==e&&"test"!==e)}(n),i=kt(n).filter(s=>e.existsSync(t.resolve(n.dirPath,s))),r=i.filter(e=>s.includes(e));if(n.isRoot&&n.doesContainSubPackageJsons)return;if(1===i.length&&1===r.length)return`./${r[0]}`}(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=[...St(e),...St(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&&!function(e,t){return void 0===t||"."===e&&"."!==t}(l,i)?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;U(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 St(e){return e?Array.isArray(e)?e:[e]:[]}const $t=["**/.git/objects/**","**/.git/subtree-cache/**","**/node_modules/**","**/tmp/**","**/temp/**","**/dist/**"];async function Pt(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 $t)r=c.all([r,Ct(e)]);n.doesContainPoetryLock&&(r=c.all([r,Ct("**/.venv/**")])),n.depending.next&&(r=c.all([r,Ct("**/.next/**")])),"editor.codeActionsOnSave"in r&&delete r["editor.codeActionsOnSave"],"editor.formatOnSave"in r&&delete r["editor.formatOnSave"],U(r);const o=JSON.stringify(r,void 0,2);await $.run(()=>S.generateFile(s,o))}catch{}})}function Ct(e){return{"files.watcherExclude":{[e]:!0}}}async function Et(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=Re("yarn",["--version"],n.dirPath),r=function(e,t){const n=Re("npm",["show",e,"versions","--json"],t);return JSON.parse(n).at(-1)}("@yarnpkg/cli",n.dirPath);Ot(i)<=Ot(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 Ot(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(!Ge(t))return;const s=Ue(t);try{await Ft(s,t,n,"d1: x-easy :hedgehog:","EDE9FE"),await Ft(s,t,n,"d2: easy :rabbit2:","DDD6FE"),await Ft(s,t,n,"d3: medium :ox:","C4B5FD"),await Ft(s,t,n,"d4: hard :squid:","A78BFA"),await Ft(s,t,n,"d5: x-hard :whale2:","8B5CF6"),await Ft(s,t,n,"p1: critical :fire::fire::fire:","EF4444"),await Ft(s,t,n,"p2: urgent :fire::fire:","F87171"),await Ft(s,t,n,"p3: important :fire:","FCA5A5"),await Ft(s,t,n,"p4: nice to have :droplet:","FECACA"),await Ft(s,t,n,"r: blitz","5300bc"),await Ft(s,t,n,"r: firebase","ffca28"),await Ft(s,t,n,"r: prisma","0c344b"),await Ft(s,t,n,"r: react","61dafb"),await Ft(s,t,n,"r: svelte","ff3e00"),await Ft(s,t,n,"r: semantic-release","494949"),await Ft(s,t,n,"ready :rocket:","22C55E"),await Ft(s,t,n,"review requested :mag:","FBCA04"),await Ft(s,t,n,"released :bookmark:","6366F1"),await Ft(s,t,n,"s: 0.5h :clock1230:","F3F4F6"),await Ft(s,t,n,"s: 1h :clock1:","E5E7EB"),await Ft(s,t,n,"s: 2h :clock2:","D1D5DB"),await Ft(s,t,n,"s: 3h :clock3:","9CA3AF"),await Ft(s,t,n,"s: 5h :clock5:","6B7280"),await Ft(s,t,n,"s: 8h :clock8:","4B5563"),await Ft(s,t,n,"s: 13h :clock1:","374151"),await Ft(s,t,n,"t: build :hammer:","BFDBFE"),await Ft(s,t,n,"t: chore :broom:","BFDBFE"),await Ft(s,t,n,"t: ci :construction_worker:","BFDBFE"),await Ft(s,t,n,"t: docs :memo:","BFDBFE"),await Ft(s,t,n,"t: feat :sparkles:","BFDBFE"),await Ft(s,t,n,"t: fix :bug:","BFDBFE"),await Ft(s,t,n,"t: perf :zap:","BFDBFE"),await Ft(s,t,n,"t: refactor :recycle:","BFDBFE"),await Ft(s,t,n,"t: style :lipstick:","BFDBFE"),await Ft(s,t,n,"t: test :test_tube:","BFDBFE"),await Ft(s,t,n,"project","24292F"),await Ft(s,t,n,"focused :dart:","22C55E"),await Ft(s,t,n,"gen-pr-all :robot:","00B4D8"),await Ft(s,t,n,"gen-pr-claude :robot:","00B4D8"),await Ft(s,t,n,"gen-pr-codex :robot:","00B4D8"),await Ft(s,t,n,"gen-pr-gemini :robot:","00B4D8"),await At(s,t,n,"bug"),await At(s,t,n,"documentation"),await At(s,t,n,"duplicate"),await At(s,t,n,"enhancement"),await At(s,t,n,"good first issue"),await At(s,t,n,"help wanted"),await At(s,t,n,"invalid"),await At(s,t,n,"question"),await At(s,t,n,"wontfix"),await At(s,t,n,"ready"),await At(s,t,n,"review requested"),await At(s,t,n,"released"),await At(s,t,n,"semantic-release"),await At(s,t,n,"llm-pr :robot:"),await At(s,t,n,"ai-pr :robot:")}catch(e){console.warn("Skip setupLabels due to:",e?.stack??e)}})}async function Ft(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 At(e,t,n,s){try{await e.request("DELETE /repos/{owner}/{repo}/labels/{name}",{owner:t,repo:n,name:s})}catch{}}const It=["READY_DISCORD_WEBHOOK_URL","GH_BOT_PAT","PUBLIC_GH_BOT_PAT"];async function Tt(e){return _.functionIgnoringException("setupSecrets",async()=>{const[t,n]=Ne.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=Ue(t);try{for(const e of It)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 Dt(e){const[t,n]=Ne.getOrgAndName(e.repository??"");if(!t||!n)return;if("WillBooster"!==t&&"WillBoosterLab"!==t)return;if(!Ge(t))return;const i=Ue(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 Rt="__PM_RUN__",Wt={"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., \`${Rt} test\`) passed.\n - The lint command (e.g., \`${Rt} 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 Lt(n){return _.functionIgnoringException("generateGitHubTemplates",async()=>{for(const[s,i]of Object.entries(Wt)){const r=Nt(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 Nt(e,t){const n=t.isBun?"bun run":"yarn";return e.replaceAll(Rt,n)}const Jt=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 Ut(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 zt(i);if(e)return e}const r="string"==typeof t.repository?t.repository:t.repository?.url;if(r){const e=await zt(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=Jt.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 zt(e){const[t,n]=Ne.getOrgAndName(e);if(!t||!n)return;const s={full_name:`${t}/${n}`};try{const e=await Ue().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}function qt(n){const s=t.join(n,"bun.lock"),i=t.join(n,".bun.lock.wbfy-backup");e.rmSync(i,{force:!0}),e.existsSync(s)&&(e.copyFileSync(s,i),e.rmSync(s,{force:!0}));if(0!==De("bun",["update"],n)||!e.existsSync(s))throw e.existsSync(i)&&(e.copyFileSync(i,s),e.rmSync(i,{force:!0})),new Error(`Failed to regenerate ${s}`);e.rmSync(i,{force:!0})}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 Ut(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=>Ut(e,a)))).filter(e=>!!e),p=[a,...l];if(x.isVerbose)for(const e of p)console.info(e);await Et(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(()=>gt(a)),te(a,p),fe(a),we(a),xe(a,p),_e(a),Se(a),Lt(a),Ie(a),wt(a),ht(a),...d?[M(a)]:[],Bt(a),Tt(a),Dt(a),at(a),pt(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 dt(e),await Xe(e,a,n.skipDeps),u.push(pt(e)),e.doesContainVscodeSettingsJson&&e.doesContainPackageJson&&u.push(Pt(e)),(e.doesContainTypeScript||e.doesContainTypeScriptInPackages)&&u.push(jt(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(mt(e))));await Promise.all(u),await $.promiseAll();const m=a.isBun?"bun":"yarn";a.isBun?qt(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 bt(a)}}();
18
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9vcHRpb25zLnRzIiwiLi4vc3JjL2xvZ2dlci50cyIsIi4uL3NyYy9maXhlcnMvZG9ja2VyZmlsZS50cyIsIi4uL3NyYy91dGlscy9mc1V0aWwudHMiLCIuLi9zcmMvdXRpbHMvcHJvbWlzZVBvb2wudHMiLCIuLi9zcmMvZml4ZXJzL25leHRDb25maWcudHMiLCIuLi9zcmMvZml4ZXJzL3BsYXl3cmlnaHRDb25maWcudHMiLCIuLi9zcmMvdXRpbHMvZ2xvYlV0aWwudHMiLCIuLi9zcmMvZml4ZXJzL3ByaXNtYS50cyIsIi4uL3NyYy9maXhlcnMvdGVzdERpcmVjdG9yeS50cyIsIi4uL3NyYy9maXhlcnMvdHlwZURlZmluaXRpb24udHMiLCIuLi9zcmMvdXRpbHMvbWVyZ2VVdGlsLnRzIiwiLi4vc3JjL3V0aWxzL29iamVjdFV0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy93b3JrZmxvdy50cyIsIi4uL3NyYy9maXhlcnMvdHlwb3MudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9hZ2VudHMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9iaW9tZS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2J1bmZpZy50cyIsIi4uL3NyYy91dGlscy9pZ25vcmVGaWxlVXRpbC50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2RvY2tlcmlnbm9yZS50cyIsIi4uL3NyYy91dGlscy9leHRlbnNpb25zLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZWRpdG9yY29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZXNsaW50Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2VtaW5pQ29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2VtaW5pU2V0dGluZ3MudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9naXRhdHRyaWJ1dGVzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2l0aWdub3JlLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvaWRlYS50cyIsIi4uL3NyYy91dGlscy9zcGF3blV0aWwudHMiLCIuLi9zcmMvdXRpbHMvZXNsaW50VXRpbC50cyIsIi4uL3NyYy91dGlscy9naXRodWJVdGlsLnRzIiwiLi4vc3JjL3V0aWxzL3dpbGxib29zdGVyQ29uZmlnc1V0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9wYWNrYWdlSnNvbi50cyIsIi4uL3NyYy91dGlscy90c2NvbmZpZ0Jhc2UudHMiLCIuLi9zcmMvZ2l0aHViL2NvbW1pdC50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2xlZnRob29rLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvbGludHN0YWdlZHJjLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcHJldHRpZXJpZ25vcmUudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9weXJpZ2h0Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVhZG1lLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVsZWFzZXJjLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVub3ZhdGVKc29uLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvc2tpbGxzLnRzIiwiLi4vc3JjL3V0aWxzL3NyY0RpcmVjdG9yaWVzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvdHNjb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy92c2NvZGVTZXR0aW5ncy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3lhcm5yYy50cyIsIi4uL3NyYy9naXRodWIvbGFiZWwudHMiLCIuLi9zcmMvZ2l0aHViL3NlY3JldC50cyIsIi4uL3NyYy9naXRodWIvc2V0dGluZ3MudHMiLCIuLi9zcmMvZ2l0aHViL3RlbXBsYXRlLnRzIiwiLi4vc3JjL3BhY2thZ2VDb25maWcudHMiLCIuLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiY2xhc3MgT3B0aW9ucyB7XG4gIGlzVmVyYm9zZSA9IGZhbHNlO1xuICBkb2VzVXBsb2FkRW52VmFycyA9IGZhbHNlO1xufVxuXG5leHBvcnQgY29uc3Qgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7XG4iLCJpbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi9vcHRpb25zLmpzJztcblxuY2xhc3MgTG9nZ2VyIHtcbiAgYXN5bmMgZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbihuYW1lOiBzdHJpbmcsIGZ1bmM6ICgpID0+IFByb21pc2U8dm9pZD4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgLS0tLS0tLS0tICR7bmFtZX0gc3RhcnQgLS0tLS0tLS0tYCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmdW5jKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRXJyb3Igb2NjdXJyZWQgaW4gJHtuYW1lfTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3Iuc3RhY2sgOiBTdHJpbmcoZXJyb3IpfX1gKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYC0tLS0tLS0tLS0gJHtuYW1lfSBlbmQgLS0tLS0tLS0tLWApO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgbG9nZ2VyID0gbmV3IExvZ2dlcigpO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4RG9ja2VyZmlsZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhEb2NrZXJmaWxlJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghY29uZmlnLmRvZXNDb250YWluRG9ja2VyZmlsZSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2xkQ29udGVudCA9IGNvbmZpZy5kb2NrZXJmaWxlO1xuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBvbGRDb250ZW50O1xuXG4gICAgaWYgKG9sZENvbnRlbnQgPT09IG5ld0NvbnRlbnQpIHJldHVybjtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUocGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAnRG9ja2VyZmlsZScpLCBuZXdDb250ZW50KTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5leHBvcnQgY29uc3QgZnNVdGlsID0ge1xuICBhc3luYyByZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gIH0sXG4gIGFzeW5jIGdlbmVyYXRlRmlsZShmaWxlUGF0aDogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihwYXRoLmRpcm5hbWUoZmlsZVBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBsZXQgbm9ybWFsaXplZENvbnRlbnQgPSBjb250ZW50LnJlcGxhY2VBbGwoJ1xcclxcbicsICdcXG4nKS50cmltKCk7XG4gICAgaWYgKG5vcm1hbGl6ZWRDb250ZW50KSB7XG4gICAgICBub3JtYWxpemVkQ29udGVudCArPSAnXFxuJztcbiAgICB9XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGZpbGVQYXRoLCBub3JtYWxpemVkQ29udGVudCk7XG4gICAgY29uc29sZS5sb2coYEdlbmVyYXRlZC9VcGRhdGVkICR7ZmlsZVBhdGh9YCk7XG4gIH0sXG59O1xuIiwiaW1wb3J0IHsgUHJvbWlzZVBvb2wgfSBmcm9tICdtaW5pbWFsLXByb21pc2UtcG9vbCc7XG5cbmV4cG9ydCBjb25zdCBwcm9taXNlUG9vbCA9IG5ldyBQcm9taXNlUG9vbCgpO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4TmV4dENvbmZpZ0pzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4TmV4dENvbmZpZ0pzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBbJ2pzJywgJ21qcycsICdjanMnXVxuICAgICAgLm1hcCgoZXh0KSA9PiBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGBuZXh0LmNvbmZpZy4ke2V4dH1gKSlcbiAgICAgIC5maW5kKChwKSA9PiBmcy5leGlzdHNTeW5jKHApKTtcbiAgICBpZiAoIWZpbGVQYXRoKSByZXR1cm47XG5cbiAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgLy8gUmVwbGFjZSB0aGUgSlNPTiBvYmplY3QgZnJvbSB0aGUgZmlsZVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBvbGRDb250ZW50LnJlcGxhY2UoLz1cXHMqeyhbXFxTXFxzXSopfTsvLCAoXywgc2V0dGluZ3NUZXh0OiBzdHJpbmcpID0+IHtcbiAgICAgIGlmICghc2V0dGluZ3NUZXh0LmluY2x1ZGVzKCdlc2xpbnQ6JykpIHtcbiAgICAgICAgc2V0dGluZ3NUZXh0ICs9ICdlc2xpbnQ6IHsgaWdub3JlRHVyaW5nQnVpbGRzOiB0cnVlIH0sJztcbiAgICAgIH1cbiAgICAgIGlmICghc2V0dGluZ3NUZXh0LmluY2x1ZGVzKCd0eXBlc2NyaXB0OicpKSB7XG4gICAgICAgIHNldHRpbmdzVGV4dCArPSAndHlwZXNjcmlwdDogeyBpZ25vcmVCdWlsZEVycm9yczogdHJ1ZSB9LCc7XG4gICAgICB9XG4gICAgICByZXR1cm4gYD0geyR7c2V0dGluZ3NUZXh0fX07YDtcbiAgICB9KTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IHRzIGZyb20gJ3R5cGVzY3JpcHQnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbnR5cGUgUGFyc2VkVmFsdWUgPVxuICB8IHsga2luZDogJ2FycmF5JzsgdmFsdWU6IFBhcnNlZFZhbHVlW10gfVxuICB8IHsga2luZDogJ2xpdGVyYWwnOyB2YWx1ZTogc3RyaW5nIH1cbiAgfCB7IGtpbmQ6ICdvYmplY3QnOyB2YWx1ZTogUGFyc2VkT2JqZWN0IH07XG50eXBlIFBhcnNlZE9iamVjdCA9IFJlY29yZDxzdHJpbmcsIFBhcnNlZFZhbHVlPjtcbmludGVyZmFjZSBFeHRyYWN0ZWRPYmplY3RMaXRlcmFsIHtcbiAgc291cmNlOiB0cy5Tb3VyY2VGaWxlO1xuICBub2RlOiB0cy5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbjtcbn1cblxuY29uc3QgbGl0ZXJhbCA9ICh2YWx1ZTogc3RyaW5nKTogUGFyc2VkVmFsdWUgPT4gKHsga2luZDogJ2xpdGVyYWwnLCB2YWx1ZSB9KTtcbmNvbnN0IGFzQXJyYXkgPSAodmFsdWU6IFBhcnNlZFZhbHVlW10pOiBQYXJzZWRWYWx1ZSA9PiAoeyBraW5kOiAnYXJyYXknLCB2YWx1ZSB9KTtcbmNvbnN0IGFzT2JqZWN0ID0gKHZhbHVlOiBQYXJzZWRPYmplY3QpOiBQYXJzZWRWYWx1ZSA9PiAoeyBraW5kOiAnb2JqZWN0JywgdmFsdWUgfSk7XG5cbmNvbnN0IGRlZmF1bHRDb25maWc6IFBhcnNlZE9iamVjdCA9IHtcbiAgZm9yYmlkT25seTogbGl0ZXJhbCgnISFwcm9jZXNzLmVudi5DSScpLFxuICByZXRyaWVzOiBsaXRlcmFsKCdwcm9jZXNzLmVudi5QV0RFQlVHID8gMCA6IHByb2Nlc3MuZW52LkNJID8gNSA6IDEnKSxcbiAgdXNlOiBhc09iamVjdCh7XG4gICAgYmFzZVVSTDogbGl0ZXJhbCgncHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfQkFTRV9VUkwnKSxcbiAgICB0cmFjZTogbGl0ZXJhbChcInByb2Nlc3MuZW52LkNJID8gJ29uLWZpcnN0LXJldHJ5JyA6ICdyZXRhaW4tb24tZmFpbHVyZSdcIiksXG4gICAgc2NyZWVuc2hvdDogbGl0ZXJhbChcInByb2Nlc3MuZW52LkNJID8gJ29ubHktb24tZmFpbHVyZScgOiAnb25seS1vbi1mYWlsdXJlJ1wiKSxcbiAgICB2aWRlbzogbGl0ZXJhbChcInByb2Nlc3MuZW52LkNJID8gJ3JldGFpbi1vbi1mYWlsdXJlJyA6ICdyZXRhaW4tb24tZmFpbHVyZSdcIiksXG4gIH0pLFxuICB3ZWJTZXJ2ZXI6IGFzT2JqZWN0KHtcbiAgICBjb21tYW5kOiBsaXRlcmFsKFwiJ3lhcm4gc3RhcnQtdGVzdC1zZXJ2ZXInXCIpLFxuICAgIHVybDogbGl0ZXJhbCgncHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfQkFTRV9VUkwnKSxcbiAgICByZXVzZUV4aXN0aW5nU2VydmVyOiBsaXRlcmFsKCchIXByb2Nlc3MuZW52LkNJJyksXG4gICAgdGltZW91dDogbGl0ZXJhbCgnMzAwXzAwMCcpLFxuICAgIHN0ZG91dDogbGl0ZXJhbChcIidwaXBlJ1wiKSxcbiAgICBzdGRlcnI6IGxpdGVyYWwoXCIncGlwZSdcIiksXG4gICAgZW52OiBsaXRlcmFsKGB7XG4gIC4uLnByb2Nlc3MuZW52LFxuICBQUklTTUFfVVNFUl9DT05TRU5UX0ZPUl9EQU5HRVJPVVNfQUlfQUNUSU9OOiAndHJ1ZScsXG59YCksXG4gICAgZ3JhY2VmdWxTaHV0ZG93bjogbGl0ZXJhbChge1xuICBzaWduYWw6ICdTSUdURVJNJyxcbiAgdGltZW91dDogNTAwLFxufWApLFxuICB9KSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhQbGF5d3JpZ2h0Q29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgYHBsYXl3cmlnaHQuY29uZmlnLnRzYCk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHJldHVybjtcblxuICBhd2FpdCBhc3NlcnROZXh0UHVibGljQmFzZVVybChjb25maWcuZGlyUGF0aCk7XG5cbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhQbGF5d3JpZ2h0Q29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICBjb25zdCBleHRyYWN0ZWRPYmplY3RMaXRlcmFsID0gZXh0cmFjdERlZmluZUNvbmZpZ09iamVjdExpdGVyYWwob2xkQ29udGVudCk7XG4gICAgaWYgKCFleHRyYWN0ZWRPYmplY3RMaXRlcmFsKSByZXR1cm47XG5cbiAgICBjb25zdCBwYXJzZWQgPSBwYXJzZU9iamVjdExpdGVyYWxFeHByZXNzaW9uKGV4dHJhY3RlZE9iamVjdExpdGVyYWwubm9kZSwgZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbC5zb3VyY2UpO1xuICAgIGlmICghcGFyc2VkKSByZXR1cm47XG5cbiAgICAvLyBLZWVwIGZpbGxpbmcgbWlzc2luZyBkZWZhdWx0cywgYnV0IGRvbid0IG92ZXJ3cml0ZSBsb2NhbCBhZGp1c3RtZW50cyBvbiBldmVyeSByZWdlbmVyYXRpb24uXG4gICAgY29uc3QgbWVyZ2VkID0gbWVyZ2UuYWxsPFBhcnNlZE9iamVjdD4oW2RlZmF1bHRDb25maWcsIHBhcnNlZF0pO1xuICAgIGNvbnN0IGhhc1N0YXJ0VGVzdFNlcnZlciA9IEJvb2xlYW4oY29uZmlnLnBhY2thZ2VKc29uPy5zY3JpcHRzPy5bJ3N0YXJ0LXRlc3Qtc2VydmVyJ10pO1xuICAgIGNvbnN0IGhhc0V4aXN0aW5nV2ViU2VydmVyID0gQm9vbGVhbihwYXJzZWQud2ViU2VydmVyKTtcbiAgICAvLyBPbmx5IGRyb3Agd2JmeSdzIGRlZmF1bHQgc2VydmVyIGNvbW1hbmQuIFJlcG9zIHdpdGggY3VzdG9tIFBsYXl3cmlnaHRcbiAgICAvLyBzZXJ2ZXIgc2V0dXAgc3RpbGwgbmVlZCBpdCBldmVuIHdoZW4gdGhleSBkbyBub3QgZXhwb3NlIHN0YXJ0LXRlc3Qtc2VydmVyLlxuICAgIGlmICghaGFzU3RhcnRUZXN0U2VydmVyICYmICFoYXNFeGlzdGluZ1dlYlNlcnZlcikge1xuICAgICAgZGVsZXRlIG1lcmdlZC53ZWJTZXJ2ZXI7XG4gICAgfVxuICAgIHNldFdlYlNlcnZlckNvbW1hbmQoY29uZmlnLCBtZXJnZWQpO1xuXG4gICAgY29uc3QgbmV3T2JqZWN0TGl0ZXJhbCA9IHN0cmluZ2lmeU9iamVjdChtZXJnZWQsIDApO1xuICAgIGNvbnN0IHN0YXJ0ID0gZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbC5ub2RlLmdldFN0YXJ0KGV4dHJhY3RlZE9iamVjdExpdGVyYWwuc291cmNlKTtcbiAgICBjb25zdCBlbmQgPSBleHRyYWN0ZWRPYmplY3RMaXRlcmFsLm5vZGUuZ2V0RW5kKCk7XG4gICAgY29uc3QgbmV3Q29udGVudCA9IGAke29sZENvbnRlbnQuc2xpY2UoMCwgc3RhcnQpfSR7bmV3T2JqZWN0TGl0ZXJhbH0ke29sZENvbnRlbnQuc2xpY2UoZW5kKX1gO1xuXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGFzc2VydE5leHRQdWJsaWNCYXNlVXJsKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBlbnZGaWxlUGF0aHMgPSBbXG4gICAgcGF0aC5yZXNvbHZlKGRpclBhdGgsICcuZW52JyksXG4gICAgcGF0aC5yZXNvbHZlKGRpclBhdGgsICcuZW52LnRlc3QnKSxcbiAgICBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ21pc2UudG9tbCcpLFxuICAgIHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnbWlzZS50ZXN0LnRvbWwnKSxcbiAgXTtcbiAgZm9yIChjb25zdCBlbnZGaWxlUGF0aCBvZiBlbnZGaWxlUGF0aHMpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGVudkZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgaWYgKC9ORVhUX1BVQkxJQ19CQVNFX1VSTFxccyo9L20udGVzdChjb250ZW50KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBNaXNzaW5nIGVudiBmaWxlcyBhcmUgZXhwZWN0ZWQgaW4gc29tZSByZXBvcy5cbiAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoJ05FWFRfUFVCTElDX0JBU0VfVVJMIGlzIHJlcXVpcmVkIGZvciBQbGF5d3JpZ2h0LiBEZWZpbmUgTkVYVF9QVUJMSUNfQkFTRV9VUkwgaW4gdGhlIHRhcmdldCByZXBvLicpO1xufVxuXG5mdW5jdGlvbiBzZXRXZWJTZXJ2ZXJDb21tYW5kKGNvbmZpZzogUGFja2FnZUNvbmZpZywgb2JqZWN0OiBQYXJzZWRPYmplY3QpOiB2b2lkIHtcbiAgY29uc3Qgd2ViU2VydmVyID0gb2JqZWN0LndlYlNlcnZlcjtcbiAgaWYgKHdlYlNlcnZlcj8ua2luZCAhPT0gJ29iamVjdCcpIHJldHVybjtcblxuICAvLyB3YmZ5IG93bnMgdGhlIHBhY2thZ2Ugc2NyaXB0LCBzbyBQbGF5d3JpZ2h0IHNob3VsZCBjb25zaXN0ZW50bHkgY2FsbCB0aGF0XG4gIC8vIHNjcmlwdCB3aGlsZSBwcmVzZXJ2aW5nIHRoZSByZXN0IG9mIGVhY2ggcmVwb3NpdG9yeSdzIHdlYlNlcnZlciBzZXR0aW5ncy5cbiAgd2ViU2VydmVyLnZhbHVlLmNvbW1hbmQgPSBsaXRlcmFsKGNvbmZpZy5pc0J1biA/IFwiJ2J1biBzdGFydC10ZXN0LXNlcnZlcidcIiA6IFwiJ3lhcm4gc3RhcnQtdGVzdC1zZXJ2ZXInXCIpO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0RGVmaW5lQ29uZmlnT2JqZWN0TGl0ZXJhbChjb250ZW50OiBzdHJpbmcpOiBFeHRyYWN0ZWRPYmplY3RMaXRlcmFsIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc291cmNlID0gdHMuY3JlYXRlU291cmNlRmlsZSgncGxheXdyaWdodC5jb25maWcudHMnLCBjb250ZW50LCB0cy5TY3JpcHRUYXJnZXQuTGF0ZXN0LCB0cnVlLCB0cy5TY3JpcHRLaW5kLlRTKTtcblxuICAvLyBUeXBlU2NyaXB0IGFscmVhZHkgdW5kZXJzdGFuZHMgbmVzdGVkIG9iamVjdCBsaXRlcmFscyBhbmQgdGVtcGxhdGUgc3RyaW5ncywgc28gdXNlXG4gIC8vIGl0cyBBU1QgcmFuZ2VzIGluc3RlYWQgb2YgYSByZWdleCB0aGF0IGNhbiBzdG9wIGF0IHRoZSBmaXJzdCBpbm5lciBjbG9zaW5nIGJyYWNlLlxuICBsZXQgZm91bmQ6IHRzLk9iamVjdExpdGVyYWxFeHByZXNzaW9uIHwgdW5kZWZpbmVkO1xuICBjb25zdCB2aXNpdCA9IChub2RlOiB0cy5Ob2RlKTogdm9pZCA9PiB7XG4gICAgaWYgKGZvdW5kKSByZXR1cm47XG4gICAgaWYgKHRzLmlzQ2FsbEV4cHJlc3Npb24obm9kZSkgJiYgbm9kZS5leHByZXNzaW9uLmdldFRleHQoc291cmNlKSA9PT0gJ2RlZmluZUNvbmZpZycpIHtcbiAgICAgIGNvbnN0IGZpcnN0QXJndW1lbnQgPSBub2RlLmFyZ3VtZW50c1swXTtcbiAgICAgIGlmIChmaXJzdEFyZ3VtZW50ICYmIHRzLmlzT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oZmlyc3RBcmd1bWVudCkpIHtcbiAgICAgICAgZm91bmQgPSBmaXJzdEFyZ3VtZW50O1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIHRzLmZvckVhY2hDaGlsZChub2RlLCB2aXNpdCk7XG4gIH07XG4gIHZpc2l0KHNvdXJjZSk7XG5cbiAgcmV0dXJuIGZvdW5kID8geyBzb3VyY2UsIG5vZGU6IGZvdW5kIH0gOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHBhcnNlT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oXG4gIG9iamVjdExpdGVyYWw6IHRzLk9iamVjdExpdGVyYWxFeHByZXNzaW9uLFxuICBzb3VyY2U6IHRzLlNvdXJjZUZpbGVcbik6IFBhcnNlZE9iamVjdCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHBhcnNlZDogUGFyc2VkT2JqZWN0ID0ge307XG4gIGZvciAoY29uc3QgcHJvcGVydHkgb2Ygb2JqZWN0TGl0ZXJhbC5wcm9wZXJ0aWVzKSB7XG4gICAgaWYgKCF0cy5pc1Byb3BlcnR5QXNzaWdubWVudChwcm9wZXJ0eSkgfHwgKCF0cy5pc0lkZW50aWZpZXIocHJvcGVydHkubmFtZSkgJiYgIXRzLmlzU3RyaW5nTGl0ZXJhbChwcm9wZXJ0eS5uYW1lKSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdmFsdWUgPSBwYXJzZUV4cHJlc3Npb24ocHJvcGVydHkuaW5pdGlhbGl6ZXIsIHNvdXJjZSk7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICBwYXJzZWRbcHJvcGVydHkubmFtZS5nZXRUZXh0KHNvdXJjZSldID0gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIHBhcnNlZDtcbn1cblxuZnVuY3Rpb24gcGFyc2VFeHByZXNzaW9uKGV4cHJlc3Npb246IHRzLkV4cHJlc3Npb24sIHNvdXJjZTogdHMuU291cmNlRmlsZSk6IFBhcnNlZFZhbHVlIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHRzLmlzT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oZXhwcmVzc2lvbikpIHtcbiAgICBjb25zdCBwYXJzZWRPYmplY3QgPSBwYXJzZU9iamVjdExpdGVyYWxFeHByZXNzaW9uKGV4cHJlc3Npb24sIHNvdXJjZSk7XG4gICAgcmV0dXJuIHBhcnNlZE9iamVjdCA/IGFzT2JqZWN0KHBhcnNlZE9iamVjdCkgOiBsaXRlcmFsKGV4cHJlc3Npb24uZ2V0VGV4dChzb3VyY2UpKTtcbiAgfVxuICBpZiAodHMuaXNBcnJheUxpdGVyYWxFeHByZXNzaW9uKGV4cHJlc3Npb24pKSB7XG4gICAgY29uc3QgZWxlbWVudHMgPSBleHByZXNzaW9uLmVsZW1lbnRzLm1hcCgoZWxlbWVudCkgPT4gcGFyc2VFeHByZXNzaW9uKGVsZW1lbnQsIHNvdXJjZSkpO1xuICAgIGlmIChlbGVtZW50cy5zb21lKChlbGVtZW50KTogZWxlbWVudCBpcyB1bmRlZmluZWQgPT4gZWxlbWVudCA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgcmV0dXJuIGxpdGVyYWwoZXhwcmVzc2lvbi5nZXRUZXh0KHNvdXJjZSkpO1xuICAgIH1cbiAgICByZXR1cm4gYXNBcnJheShlbGVtZW50cyBhcyBQYXJzZWRWYWx1ZVtdKTtcbiAgfVxuICByZXR1cm4gbGl0ZXJhbChleHByZXNzaW9uLmdldFRleHQoc291cmNlKSk7XG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeVZhbHVlKHZhbHVlOiBQYXJzZWRWYWx1ZSwgbGV2ZWw6IG51bWJlcik6IHN0cmluZyB7XG4gIGlmICh2YWx1ZS5raW5kID09PSAnYXJyYXknKSB7XG4gICAgcmV0dXJuIHN0cmluZ2lmeUFycmF5KHZhbHVlLnZhbHVlLCBsZXZlbCk7XG4gIH1cbiAgaWYgKHZhbHVlLmtpbmQgPT09ICdsaXRlcmFsJykgcmV0dXJuIHZhbHVlLnZhbHVlO1xuICByZXR1cm4gc3RyaW5naWZ5T2JqZWN0KHZhbHVlLnZhbHVlLCBsZXZlbCk7XG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeUFycmF5KHZhbHVlczogUGFyc2VkVmFsdWVbXSwgbGV2ZWw6IG51bWJlcik6IHN0cmluZyB7XG4gIGlmICh2YWx1ZXMubGVuZ3RoID09PSAwKSByZXR1cm4gJ1tdJztcbiAgY29uc3QgaW5kZW50ID0gJyAgJy5yZXBlYXQobGV2ZWwgKyAxKTtcbiAgY29uc3QgbGluZXMgPSB2YWx1ZXMubWFwKCh2YWx1ZSkgPT4ge1xuICAgIGNvbnN0IHN0cmluZ2lmaWVkID0gc3RyaW5naWZ5VmFsdWUodmFsdWUsIGxldmVsICsgMSkuc3BsaXQoJ1xcbicpO1xuICAgIHN0cmluZ2lmaWVkW3N0cmluZ2lmaWVkLmxlbmd0aCAtIDFdID0gYCR7c3RyaW5naWZpZWQuYXQoLTEpfSxgO1xuICAgIGlmICh2YWx1ZS5raW5kID09PSAnbGl0ZXJhbCcpIHtcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMTsgaW5kZXggPCBzdHJpbmdpZmllZC5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAgICAgc3RyaW5naWZpZWRbaW5kZXhdID0gYCR7aW5kZW50fSR7c3RyaW5naWZpZWRbaW5kZXhdfWA7XG4gICAgICB9XG4gICAgfVxuICAgIHN0cmluZ2lmaWVkWzBdID0gYCR7aW5kZW50fSR7c3RyaW5naWZpZWRbMF19YDtcbiAgICByZXR1cm4gc3RyaW5naWZpZWQuam9pbignXFxuJyk7XG4gIH0pO1xuICBjb25zdCBjbG9zaW5nSW5kZW50ID0gJyAgJy5yZXBlYXQobGV2ZWwpO1xuICByZXR1cm4gYFtcXG4ke2xpbmVzLmpvaW4oJ1xcbicpfVxcbiR7Y2xvc2luZ0luZGVudH1dYDtcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5T2JqZWN0KG9iamVjdDogUGFyc2VkT2JqZWN0LCBsZXZlbDogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3QgaW5kZW50ID0gJyAgJy5yZXBlYXQobGV2ZWwgKyAxKTtcbiAgY29uc3QgbGluZXMgPSBPYmplY3QuZW50cmllcyhvYmplY3QpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgY29uc3Qgc3RyaW5naWZpZWQgPSBzdHJpbmdpZnlWYWx1ZSh2YWx1ZSwgbGV2ZWwgKyAxKS5zcGxpdCgnXFxuJyk7XG4gICAgc3RyaW5naWZpZWRbc3RyaW5naWZpZWQubGVuZ3RoIC0gMV0gPSBgJHtzdHJpbmdpZmllZC5hdCgtMSl9LGA7XG4gICAgaWYgKHZhbHVlLmtpbmQgPT09ICdsaXRlcmFsJykge1xuICAgICAgZm9yIChsZXQgaW5kZXggPSAxOyBpbmRleCA8IHN0cmluZ2lmaWVkLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgICBzdHJpbmdpZmllZFtpbmRleF0gPSBgJHtpbmRlbnR9JHtzdHJpbmdpZmllZFtpbmRleF19YDtcbiAgICAgIH1cbiAgICB9XG4gICAgc3RyaW5naWZpZWRbMF0gPSBgJHtpbmRlbnR9JHtrZXl9OiAke3N0cmluZ2lmaWVkWzBdfWA7XG4gICAgcmV0dXJuIHN0cmluZ2lmaWVkLmpvaW4oJ1xcbicpO1xuICB9KTtcbiAgY29uc3QgY2xvc2luZ0luZGVudCA9ICcgICcucmVwZWF0KGxldmVsKTtcbiAgaWYgKGxpbmVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGB7XFxuJHtjbG9zaW5nSW5kZW50fX1gO1xuICByZXR1cm4gYHtcXG4ke2xpbmVzLmpvaW4oJ1xcbicpfVxcbiR7Y2xvc2luZ0luZGVudH19YDtcbn1cbiIsImV4cG9ydCBjb25zdCBnbG9iSWdub3JlID0gW1xuICAnKiovbm9kZV9tb2R1bGVzLyoqJyxcbiAgJyoqLy52ZW52LyoqJyxcbiAgJyoqL3Rlc3QtZml4dHVyZXMvKionLFxuICAnKiovdGVzdC9maXh0dXJlcy8qKicsXG4gICcqKi9kaXN0LyoqJyxcbiAgJyoqL2J1aWxkLyoqJyxcbiAgJyoqL3RhcmdldC8qKicsXG4gICcqKi90ZW1wLyoqJyxcbiAgJyoqL3RtcC8qKicsXG5dO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYic7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdsb2JJZ25vcmUgfSBmcm9tICcuLi91dGlscy9nbG9iVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhQcmlzbWFFbnZGaWxlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhQcmlzbWFFbnZGaWxlcycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBlbnZGaWxlcyA9IGF3YWl0IGZnLmdsb2IoWycqLmVudicsICcqLmVudi4qJ10sIHsgZG90OiB0cnVlLCBjd2Q6IGNvbmZpZy5kaXJQYXRoLCBpZ25vcmU6IGdsb2JJZ25vcmUgfSk7XG4gICAgZm9yIChjb25zdCBlbnZGaWxlIG9mIGVudkZpbGVzKSB7XG4gICAgICBjb25zdCBlbnZGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgZW52RmlsZSk7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoZW52RmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBuZXdDb250ZW50ID0gY29udGVudC5yZXBsYWNlKFxuICAgICAgICAvREFUQUJBU0VfVVJMPVwiPyguK1xcLnNxbGl0ZTMpXCI/W1xcbiRdLyxcbiAgICAgICAgJ0RBVEFCQVNFX1VSTD1cIiQxP2Nvbm5lY3Rpb25fbGltaXQ9MVwiXFxuJ1xuICAgICAgKTtcbiAgICAgIGF3YWl0IGZzLndyaXRlRmlsZShlbnZGaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgfVxuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhUZXN0RGlyZWN0b3JpZXNVcGRhdGluZ1BhY2thZ2VKc29uKHBhY2thZ2VEaXJQYXRoczogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhUZXN0RGlyZWN0b3JpZXNVcGRhdGluZ1BhY2thZ2VKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgcGFja2FnZURpclBhdGhzLm1hcChhc3luYyAocGFja2FnZURpclBhdGgpID0+IHtcbiAgICAgICAgY29uc3QgbmV3VGVzdERpclBhdGggPSBwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsICd0ZXN0Jyk7XG4gICAgICAgIGZvciAoY29uc3Qgb2xkVGVzdERpck5hbWUgb2YgWydfX3Rlc3RzX18nLCAndGVzdHMnXSkge1xuICAgICAgICAgIGNvbnN0IG9sZFRlc3REaXJQYXRoID0gcGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCBvbGRUZXN0RGlyTmFtZSk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IGZzLnByb21pc2VzLnJlbmFtZShvbGRUZXN0RGlyUGF0aCwgbmV3VGVzdERpclBhdGgpO1xuICAgICAgICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpO1xuICAgICAgICAgICAgY29uc3QgbmV3Q29udGVudCA9IG9sZENvbnRlbnQucmVwbGFjZUFsbChvbGRUZXN0RGlyTmFtZSwgJ3Rlc3QnKTtcbiAgICAgICAgICAgIGlmIChvbGRDb250ZW50ID09PSBuZXdDb250ZW50KSByZXR1cm47XG5cbiAgICAgICAgICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgbmV3Q29udGVudCk7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgaWdub3JlRW5vZW50QXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYic7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4VHlwZURlZmluaXRpb25zKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGNvbmZpZ3NJbmNsdWRpbmdDaGlsZHJlbjogUGFja2FnZUNvbmZpZ1tdXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhUeXBlRGVmaW5pdGlvbnMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgbGliVHlwZURpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdAdHlwZXMnKTtcbiAgICBjb25zdCBzcmNUeXBlRGlyUGF0aCA9XG4gICAgICBjb25maWcuaXNSb290ICYmIGNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucyA/IHVuZGVmaW5lZCA6IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3NyYycsICd0eXBlcycpO1xuXG4gICAgY29uc3QgZGlyZW50cyA9IGF3YWl0IGlnbm9yZUVub2VudEFzeW5jKCgpID0+IGZzLnJlYWRkaXIobGliVHlwZURpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KSk7XG4gICAgaWYgKCFkaXJlbnRzKSByZXR1cm47XG5cbiAgICBmb3IgKGNvbnN0IGRpcmVudCBvZiBkaXJlbnRzKSB7XG4gICAgICBjb25zdCBkaXJOYW1lID0gZGlyZW50Lm5hbWUuc2xpY2UoMCwgLTUpO1xuICAgICAgY29uc3QgaGFzVHlwZURlY2xhcmF0aW9uRXh0ZW5zaW9uID0gZGlyZW50Lm5hbWUuZW5kc1dpdGgoJy5kLnRzJyk7XG4gICAgICBsZXQgcGFja2FnZU5hbWUgPSBoYXNUeXBlRGVjbGFyYXRpb25FeHRlbnNpb24gPyBkaXJOYW1lIDogZGlyZW50Lm5hbWU7XG4gICAgICBpZiAocGFja2FnZU5hbWUuaW5jbHVkZXMoJ19fJykpIHtcbiAgICAgICAgcGFja2FnZU5hbWUgPSBgQCR7cGFja2FnZU5hbWUucmVwbGFjZSgnX18nLCAnLycpfWA7XG4gICAgICB9XG4gICAgICBjb25zdCBoYXNMaWJyYXJ5ID0gY29uZmlnc0luY2x1ZGluZ0NoaWxkcmVuLnNvbWUoXG4gICAgICAgIChjb25maWcpID0+XG4gICAgICAgICAgY29uZmlnLnBhY2thZ2VKc29uPy5kZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV0gfHwgY29uZmlnLnBhY2thZ2VKc29uPy5kZXZEZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV1cbiAgICAgICk7XG5cbiAgICAgIGlmIChkaXJlbnQuaXNGaWxlKCkgJiYgaGFzVHlwZURlY2xhcmF0aW9uRXh0ZW5zaW9uKSB7XG4gICAgICAgIGlmIChoYXNMaWJyYXJ5KSB7XG4gICAgICAgICAgLy8gTW92ZSBAdHlwZXMvPG5hbWU+L2luZGV4LmQudHMgaWYgaW5zdGFsbGVkXG4gICAgICAgICAgYXdhaXQgZnMubWtkaXIocGF0aC5qb2luKGxpYlR5cGVEaXJQYXRoLCBkaXJOYW1lKSk7XG4gICAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICAgICAgICBmcy5yZW5hbWUocGF0aC5qb2luKGxpYlR5cGVEaXJQYXRoLCBkaXJlbnQubmFtZSksIHBhdGguam9pbihsaWJUeXBlRGlyUGF0aCwgZGlyTmFtZSwgJ2luZGV4LmQudHMnKSlcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKHNyY1R5cGVEaXJQYXRoKSB7XG4gICAgICAgICAgLy8gTW92ZSBzcmMvdHlwZXMvPG5hbWU+IGlmIG5vdCBpbnN0YWxsZWRcbiAgICAgICAgICBhd2FpdCBmcy5ta2RpcihzcmNUeXBlRGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICAgICAgICBmcy5yZW5hbWUocGF0aC5qb2luKGxpYlR5cGVEaXJQYXRoLCBkaXJlbnQubmFtZSksIHBhdGguam9pbihzcmNUeXBlRGlyUGF0aCwgZGlyZW50Lm5hbWUpKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZGlyZW50LmlzRGlyZWN0b3J5KCkgJiYgc3JjVHlwZURpclBhdGggJiYgIWhhc0xpYnJhcnkpIHtcbiAgICAgICAgLy8gTW92ZSBzcmMvdHlwZXMvPG5hbWU+LmQudHMgaWYgbm90IGluc3RhbGxlZFxuICAgICAgICBhd2FpdCBmcy5ta2RpcihzcmNUeXBlRGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgICAgIGlnbm9yZUVub2VudEFzeW5jKCgpID0+XG4gICAgICAgICAgICBmcy5yZW5hbWUoXG4gICAgICAgICAgICAgIHBhdGguam9pbihsaWJUeXBlRGlyUGF0aCwgZGlyZW50Lm5hbWUsICdpbmRleC5kLnRzJyksXG4gICAgICAgICAgICAgIHBhdGguam9pbihzcmNUeXBlRGlyUGF0aCwgYCR7ZGlyZW50Lm5hbWV9LmQudHNgKVxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufVxuIiwiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1hc3NpZ25tZW50LCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWNhbGwsIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2VzcywgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1hcmd1bWVudCAqL1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuZXhwb3J0IGZ1bmN0aW9uIG92ZXJ3cml0ZU1lcmdlPFQ+KGRlc3RpbmF0aW9uQXJyYXk6IFRbXSwgc291cmNlQXJyYXk6IFRbXSk6IFRbXSB7XG4gIHJldHVybiBzb3VyY2VBcnJheTtcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCBmdW5jdGlvbiBjb21iaW5lTWVyZ2UodGFyZ2V0OiBvYmplY3RbXSwgc291cmNlOiBvYmplY3RbXSwgb3B0aW9uczogYW55KTogb2JqZWN0W10ge1xuICBjb25zdCBkZXN0aW5hdGlvbiA9IFsuLi50YXJnZXRdO1xuXG4gIGZvciAoY29uc3QgW2luZGV4LCBpdGVtXSBvZiBzb3VyY2UuZW50cmllcygpKSB7XG4gICAgaWYgKGRlc3RpbmF0aW9uW2luZGV4XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBkZXN0aW5hdGlvbltpbmRleF0gPSBvcHRpb25zLmNsb25lVW5sZXNzT3RoZXJ3aXNlU3BlY2lmaWVkKGl0ZW0sIG9wdGlvbnMpO1xuICAgIH0gZWxzZSBpZiAob3B0aW9ucy5pc01lcmdlYWJsZU9iamVjdChpdGVtKSkge1xuICAgICAgZGVzdGluYXRpb25baW5kZXhdID0gbWVyZ2UodGFyZ2V0W2luZGV4XSBhcyBvYmplY3QsIGl0ZW0sIG9wdGlvbnMpO1xuICAgIH0gZWxzZSBpZiAoIXRhcmdldC5pbmNsdWRlcyhpdGVtKSkge1xuICAgICAgZGVzdGluYXRpb24ucHVzaChpdGVtKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRlc3RpbmF0aW9uO1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIG1vdmVUb0JvdHRvbTxUT2JqIGV4dGVuZHMgUmVjb3JkPFRLZXksIHVua25vd24+LCBUS2V5IGV4dGVuZHMgc3RyaW5nIHwgbnVtYmVyIHwgc3ltYm9sPihcbiAgb2JqOiBUT2JqLFxuICBrZXk6IFRLZXlcbik6IFRPYmoge1xuICBjb25zdCB2YWx1ZSA9IG9ialtrZXldO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gIGRlbGV0ZSBvYmpba2V5XTtcbiAgKG9iaiBhcyBSZWNvcmQ8VEtleSwgdW5rbm93bj4pW2tleV0gPSB2YWx1ZTtcbiAgcmV0dXJuIG9iajtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNvcnRLZXlzPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ob2JqOiBUKTogVCB7XG4gIGNvbnN0IGtleUFuZFZhbHVlcyA9IE9iamVjdC5lbnRyaWVzKG9iaikudG9Tb3J0ZWQoKFtrZXkxXSwgW2tleTJdKSA9PiBrZXkxLmxvY2FsZUNvbXBhcmUoa2V5MikpO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBrZXlBbmRWYWx1ZXMpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gICAgZGVsZXRlIG9ialtrZXldO1xuICAgIChvYmogYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0gPSB2YWx1ZTtcblxuICAgIC8vIGlmIHZhbHVlIGlzIGFuIG9iamVjdCwgc29ydCB0aGUga2V5cyBvZiB0aGUgb2JqZWN0XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgIHNvcnRLZXlzKHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG9iajtcbn1cbiIsIi8qIGVzbGludC1kaXNhYmxlIHVuaWNvcm4vbm8tbnVsbCAqL1xuXG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuaW1wb3J0IGNsb25lRGVlcCBmcm9tICdsb2Rhc2guY2xvbmVkZWVwJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgY29tYmluZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IG1vdmVUb0JvdHRvbSwgc29ydEtleXMgfSBmcm9tICcuLi91dGlscy9vYmplY3RVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5pbnRlcmZhY2UgV29ya2Zsb3cge1xuICBuYW1lPzogc3RyaW5nO1xuICBvbj86IE9uO1xuICBjb25jdXJyZW5jeT86IENvbmN1cnJlbmN5O1xuICBwZXJtaXNzaW9ucz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIGpvYnM6IFJlY29yZDxzdHJpbmcsIEpvYj47XG59XG5cbmludGVyZmFjZSBDb25jdXJyZW5jeSB7XG4gIGdyb3VwOiBzdHJpbmc7XG4gICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgT24ge1xuICBpc3N1ZXM/OiBUeXBlcyB8IG51bGw7XG4gIHB1bGxfcmVxdWVzdD86IFB1bGxSZXF1ZXN0IHwgbnVsbDtcbiAgcHVsbF9yZXF1ZXN0X3RhcmdldD86IFR5cGVzIHwgbnVsbDtcbiAgcHVzaD86IFB1c2g7XG4gIHNjaGVkdWxlPzogU2NoZWR1bGVbXTtcbiAgd29ya2Zsb3dfZGlzcGF0Y2g/OiBudWxsO1xufVxuXG5pbnRlcmZhY2UgUHVsbFJlcXVlc3Qge1xuICAncGF0aHMtaWdub3JlJz86IHN0cmluZ1tdO1xuICB0eXBlcz86IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgUHVzaCB7XG4gIGJyYW5jaGVzOiBzdHJpbmdbXTtcbiAgJ3BhdGhzLWlnbm9yZSc/OiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIFNjaGVkdWxlIHtcbiAgY3Jvbjogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgVHlwZXMge1xuICB0eXBlczogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBKb2Ige1xuICAncnVucy1vbic/OiBzdHJpbmc7XG4gIHBlcm1pc3Npb25zPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgc3RlcHM/OiBTdGVwW107XG4gIHVzZXM/OiBzdHJpbmc7XG4gIGlmPzogc3RyaW5nO1xuICBzZWNyZXRzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHdpdGg/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuaW50ZXJmYWNlIFN0ZXAge1xuICB1c2VzPzogc3RyaW5nO1xuICB3aXRoPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHJ1bj86IHN0cmluZztcbn1cblxuY29uc3QgcHVibGljUmVwb0F1dG9maXhXb3JrZmxvdzogV29ya2Zsb3cgPSB7XG4gIG5hbWU6ICdhdXRvZml4LmNpJyxcbiAgb246IHtcbiAgICBwdWxsX3JlcXVlc3Q6IG51bGwsXG4gICAgcHVzaDoge1xuICAgICAgYnJhbmNoZXM6IFsnbWFpbiddLFxuICAgIH0sXG4gIH0sXG4gIHBlcm1pc3Npb25zOiB7XG4gICAgY29udGVudHM6ICdyZWFkJyxcbiAgfSxcbiAgY29uY3VycmVuY3k6IHtcbiAgICBncm91cDogJ2F1dG9maXgtJHt7IGdpdGh1Yi5oZWFkX3JlZiB9fScsXG4gICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IHRydWUsXG4gIH0sXG4gIGpvYnM6IHtcbiAgICBhdXRvZml4OiB7ICdydW5zLW9uJzogJ3VidW50dS1sYXRlc3QnIH0sXG4gIH0sXG59O1xuXG5jb25zdCBwcml2YXRlUmVwb0F1dG9maXhXb3JrZmxvdzogV29ya2Zsb3cgPSB7XG4gIG5hbWU6ICdGaXggY29kZSBhdXRvbWF0aWNhbGx5JyxcbiAgb246IHtcbiAgICBwdWxsX3JlcXVlc3Q6IG51bGwsXG4gIH0sXG4gIGNvbmN1cnJlbmN5OiB7XG4gICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19LSR7eyBnaXRodWIucmVmIH19JyxcbiAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogdHJ1ZSxcbiAgfSxcbiAgam9iczoge1xuICAgIGF1dG9maXg6IHtcbiAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvYXV0b2ZpeC55bWxAbWFpbicsXG4gICAgfSxcbiAgfSxcbn07XG5cbmNvbnN0IHdvcmtmbG93cyA9IHtcbiAgdGVzdDoge1xuICAgIG5hbWU6ICdUZXN0JyxcbiAgICBvbjoge1xuICAgICAgcHVsbF9yZXF1ZXN0OiBudWxsLFxuICAgICAgcHVzaDoge1xuICAgICAgICBicmFuY2hlczogWydtYWluJywgJ3diZnknXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICAvLyBjZi4gaHR0cHM6Ly9kb2NzLmdpdGh1Yi5jb20vZW4vYWN0aW9ucy91c2luZy1qb2JzL3VzaW5nLWNvbmN1cnJlbmN5I2V4YW1wbGUtb25seS1jYW5jZWwtaW4tcHJvZ3Jlc3Mtam9icy1vci1ydW5zLWZvci10aGUtY3VycmVudC13b3JrZmxvd1xuICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0tJHt7IGdpdGh1Yi5yZWYgfX0nLFxuICAgICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IHRydWUsXG4gICAgfSxcbiAgICBwZXJtaXNzaW9uczoge1xuICAgICAgLy8gZm9yIGxpbnRlciBmaXhcbiAgICAgIGNvbnRlbnRzOiAnd3JpdGUnLFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgdGVzdDoge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3Rlc3QueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICByZWxlYXNlOiB7XG4gICAgbmFtZTogJ1JlbGVhc2UnLFxuICAgIG9uOiB7XG4gICAgICBwdXNoOiB7XG4gICAgICAgIGJyYW5jaGVzOiBbXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBjb25jdXJyZW5jeToge1xuICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19JyxcbiAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiBmYWxzZSxcbiAgICB9LFxuICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAvLyBodHRwczovL2RvY3MubnBtanMuY29tL3RydXN0ZWQtcHVibGlzaGVycyNzdGVwLTItY29uZmlndXJlLXlvdXItY2ljZC13b3JrZmxvd1xuICAgICAgJ2lkLXRva2VuJzogJ3dyaXRlJyxcbiAgICAgIC8vIGZvciBzZW1hbnRpYy1yZWxlYXNlXG4gICAgICBjb250ZW50czogJ3dyaXRlJyxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgIHJlbGVhc2U6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9yZWxlYXNlLnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ3NlbWFudGljLXByJzoge1xuICAgIG5hbWU6ICdMaW50IFBSIHRpdGxlJyxcbiAgICBvbjoge1xuICAgICAgcHVsbF9yZXF1ZXN0X3RhcmdldDoge1xuICAgICAgICB0eXBlczogWydvcGVuZWQnLCAnZWRpdGVkJywgJ3N5bmNocm9uaXplJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ3NlbWFudGljLXByJzoge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3NlbWFudGljLXByLnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgc3luYzoge1xuICAgIG5hbWU6ICdTeW5jJyxcbiAgICBvbjoge30sXG4gICAgcGVybWlzc2lvbnM6IHtcbiAgICAgIC8vIGZvciBjb21taXRpbmcgY2hhbmdlc1xuICAgICAgY29udGVudHM6ICd3cml0ZScsXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICBzeW5jOiB7IHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3Mvc3luYy55bWxAbWFpbicgfSxcbiAgICB9LFxuICB9LFxuICAnY2xvc2UtY29tbWVudCc6IHtcbiAgICBuYW1lOiAnQWRkIGNsb3NlIGNvbW1lbnQnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3Q6IHtcbiAgICAgICAgdHlwZXM6IFsnb3BlbmVkJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ2Nsb3NlLWNvbW1lbnQnOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvY2xvc2UtY29tbWVudC55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gICdnZW4tcHItY2xhdWRlJzoge1xuICAgIG5hbWU6ICdHZW5lcmF0ZSBQUiB3aXRoIENsYXVkZSBDb2RlJyxcbiAgICBvbjoge1xuICAgICAgaXNzdWVzOiB7XG4gICAgICAgIHR5cGVzOiBbJ2xhYmVsZWQnXSxcbiAgICAgIH0sXG4gICAgICBwdWxsX3JlcXVlc3Q6IHtcbiAgICAgICAgdHlwZXM6IFsnbGFiZWxlZCddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgICdnZW4tcHInOiB7XG4gICAgICAgIGlmOiBcImNvbnRhaW5zKGdpdGh1Yi5ldmVudC5sYWJlbC5uYW1lLCAnZ2VuLXByLWFsbCcpIHx8IGNvbnRhaW5zKGdpdGh1Yi5ldmVudC5sYWJlbC5uYW1lLCAnZ2VuLXByLWNsYXVkZScpXCIsXG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvZ2VuLXByLnltbEBtYWluJyxcbiAgICAgICAgd2l0aDoge1xuICAgICAgICAgICdjb2RpbmctdG9vbCc6ICdjbGF1ZGUtY29kZScsXG4gICAgICAgICAgJ2lzc3VlLW51bWJlcic6ICcke3sgZ2l0aHViLmV2ZW50Lmlzc3VlLm51bWJlciB8fCBnaXRodWIuZXZlbnQubnVtYmVyIH19JyxcbiAgICAgICAgICAndGVzdC1jb21tYW5kJzogJ3lhcm58YnVuIGNoZWNrLWFsbC1mb3ItYWknLFxuICAgICAgICB9LFxuICAgICAgICBzZWNyZXRzOiB7XG4gICAgICAgICAgQ0xBVURFX0NPREVfT0FVVEhfVE9LRU46ICcke3sgc2VjcmV0cy5DTEFVREVfQ09ERV9PQVVUSF9UT0tFTiB9fScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gICdnZW4tcHItY29kZXgnOiB7XG4gICAgbmFtZTogJ0dlbmVyYXRlIFBSIHdpdGggQ29kZXggQ0xJJyxcbiAgICBvbjoge1xuICAgICAgaXNzdWVzOiB7XG4gICAgICAgIHR5cGVzOiBbJ2xhYmVsZWQnXSxcbiAgICAgIH0sXG4gICAgICBwdWxsX3JlcXVlc3Q6IHtcbiAgICAgICAgdHlwZXM6IFsnbGFiZWxlZCddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgICdnZW4tcHInOiB7XG4gICAgICAgIGlmOiBcImNvbnRhaW5zKGdpdGh1Yi5ldmVudC5sYWJlbC5uYW1lLCAnZ2VuLXByLWFsbCcpIHx8IGNvbnRhaW5zKGdpdGh1Yi5ldmVudC5sYWJlbC5uYW1lLCAnZ2VuLXByLWNvZGV4JylcIixcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9nZW4tcHIueW1sQG1haW4nLFxuICAgICAgICB3aXRoOiB7XG4gICAgICAgICAgJ2NvZGluZy10b29sJzogJ2NvZGV4LWNsaScsXG4gICAgICAgICAgJ2lzc3VlLW51bWJlcic6ICcke3sgZ2l0aHViLmV2ZW50Lmlzc3VlLm51bWJlciB8fCBnaXRodWIuZXZlbnQubnVtYmVyIH19JyxcbiAgICAgICAgICAndGVzdC1jb21tYW5kJzogJ3lhcm58YnVuIGNoZWNrLWFsbC1mb3ItYWknLFxuICAgICAgICB9LFxuICAgICAgICBzZWNyZXRzOiB7XG4gICAgICAgICAgT1BFTkFJX0FQSV9LRVk6ICcke3sgc2VjcmV0cy5PUEVOQUlfQVBJX0tFWSB9fScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gICdnZW4tcHItZ2VtaW5pJzoge1xuICAgIG5hbWU6ICdHZW5lcmF0ZSBQUiB3aXRoIEdlbWluaSBDTEknLFxuICAgIG9uOiB7XG4gICAgICBpc3N1ZXM6IHtcbiAgICAgICAgdHlwZXM6IFsnbGFiZWxlZCddLFxuICAgICAgfSxcbiAgICAgIHB1bGxfcmVxdWVzdDoge1xuICAgICAgICB0eXBlczogWydsYWJlbGVkJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ2dlbi1wcic6IHtcbiAgICAgICAgaWY6IFwiY29udGFpbnMoZ2l0aHViLmV2ZW50LmxhYmVsLm5hbWUsICdnZW4tcHItYWxsJykgfHwgY29udGFpbnMoZ2l0aHViLmV2ZW50LmxhYmVsLm5hbWUsICdnZW4tcHItZ2VtaW5pJylcIixcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9nZW4tcHIueW1sQG1haW4nLFxuICAgICAgICB3aXRoOiB7XG4gICAgICAgICAgJ2NvZGluZy10b29sJzogJ2dlbWluaS1jbGknLFxuICAgICAgICAgICdpc3N1ZS1udW1iZXInOiAnJHt7IGdpdGh1Yi5ldmVudC5pc3N1ZS5udW1iZXIgfHwgZ2l0aHViLmV2ZW50Lm51bWJlciB9fScsXG4gICAgICAgICAgJ3Rlc3QtY29tbWFuZCc6ICd5YXJufGJ1biBjaGVjay1hbGwtZm9yLWFpJyxcbiAgICAgICAgfSxcbiAgICAgICAgc2VjcmV0czoge1xuICAgICAgICAgIEdFTUlOSV9BUElfS0VZOiAnJHt7IHNlY3JldHMuR0VNSU5JX0FQSV9LRVkgfX0nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxufSBhcyBjb25zdDtcblxudHlwZSBLbm93bktpbmQgPSBrZXlvZiB0eXBlb2Ygd29ya2Zsb3dzIHwgJ2RlcGxveScgfCAnYXV0b2ZpeCc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVdvcmtmbG93cyhyb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVXb3JrZmxvdycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8ocm9vdENvbmZpZy5yZXBvc2l0b3J5KSkge1xuICAgICAgLy8gRG9uJ3QgdG91Y2ggcmV1c2FibGUtd29ya2Zsb3dzIHJlcG8gYmVjYXVzZSBpdCBob3N0cyB1cHN0cmVhbSB3b3JrZmxvdyBkZWZpbml0aW9ucy5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB3b3JrZmxvd3NQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5naXRodWInLCAnd29ya2Zsb3dzJyk7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIod29ya2Zsb3dzUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICAvLyBSZW1vdmUgY29uZmlnIG9mIHNlbWFudGljIHB1bGwgcmVxdWVzdFxuICAgIGNvbnN0IHNlbWFudGljWW1sUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcuZ2l0aHViJywgJ3NlbWFudGljLnltbCcpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShzZW1hbnRpY1ltbFBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KSk7XG5cbiAgICBjb25zdCBlbnRyaWVzID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcih3b3JrZmxvd3NQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgY29uc3QgZmlsZU5hbWVTZXQgPSBuZXcgU2V0KFtcbiAgICAgICd0ZXN0LnltbCcsXG4gICAgICAnYXV0b2ZpeC55bWwnLFxuICAgICAgJ3NlbWFudGljLXByLnltbCcsXG4gICAgICAnY2xvc2UtY29tbWVudC55bWwnLFxuICAgICAgJ2dlbi1wci1jbGF1ZGUueW1sJyxcbiAgICAgICdnZW4tcHItY29kZXgueW1sJyxcbiAgICAgICdnZW4tcHItZ2VtaW5pLnltbCcsXG4gICAgICAuLi5lbnRyaWVzLmZpbHRlcigoZGlyZW50KSA9PiBkaXJlbnQuaXNGaWxlKCkgJiYgZGlyZW50Lm5hbWUuZW5kc1dpdGgoJy55bWwnKSkubWFwKChkaXJlbnQpID0+IGRpcmVudC5uYW1lKSxcbiAgICBdKTtcbiAgICBpZiAocm9vdENvbmZpZy5kZXBlbmRpbmcuc2VtYW50aWNSZWxlYXNlKSB7XG4gICAgICBmaWxlTmFtZVNldC5hZGQoJ3JlbGVhc2UueW1sJyk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBmaWxlTmFtZSBvZiBmaWxlTmFtZVNldCkge1xuICAgICAgLy8g5a6f6Zqb44GvS25vd25LaW5k5Lul5aSW44Gu5YCk44KC5Luj5YWl44GV44KM44KL44GT44Go44Gr5rOo5oSPXG4gICAgICBjb25zdCBraW5kID0gcGF0aC5iYXNlbmFtZShmaWxlTmFtZSwgJy55bWwnKSBhcyBLbm93bktpbmQ7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gd3JpdGVXb3JrZmxvd1lhbWwocm9vdENvbmZpZywgd29ya2Zsb3dzUGF0aCwga2luZCkpO1xuICAgIH1cbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyhyZXBvc2l0b3J5Pzogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiByZXBvc2l0b3J5Py5lbmRzV2l0aCgnL3JldXNhYmxlLXdvcmtmbG93cycpID8/IGZhbHNlO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZVdvcmtmbG93WWFtbChjb25maWc6IFBhY2thZ2VDb25maWcsIHdvcmtmbG93c1BhdGg6IHN0cmluZywga2luZDogS25vd25LaW5kKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKHdvcmtmbG93c1BhdGgsIGAke2tpbmR9LnltbGApO1xuICBjb25zdCBkZXBsb3lQcm9kdWN0aW9uV29ya2Zsb3dFeGlzdHMgPSBmcy5leGlzdHNTeW5jKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAnZGVwbG95LXByb2R1Y3Rpb24ueW1sJykpO1xuXG4gIGlmIChraW5kID09PSAnYXV0b2ZpeCcpIHtcbiAgICBhd2FpdCB3cml0ZVlhbWwoZ2VuZXJhdGVBdXRvZml4V29ya2Zsb3coY29uZmlnKSwgZmlsZVBhdGgpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBuZXdTZXR0aW5ncyA9IGNsb25lRGVlcChraW5kIGluIHdvcmtmbG93cyA/IHdvcmtmbG93c1traW5kIGFzIGtleW9mIHR5cGVvZiB3b3JrZmxvd3NdIDoge30pIGFzIFdvcmtmbG93O1xuICAvLyBTa2lwIGEgYnJva2VuIHdvcmtmbG93XG4gIGlmICghKCdqb2JzJyBpbiBuZXdTZXR0aW5ncykpIHJldHVybjtcblxuICB0cnkge1xuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICBjb25zdCBvbGRTZXR0aW5ncyA9IHlhbWwubG9hZChvbGRDb250ZW50KSBhcyBXb3JrZmxvdztcbiAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHsgYXJyYXlNZXJnZTogY29tYmluZU1lcmdlIH0pIGFzIFdvcmtmbG93O1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cblxuICBpZiAoa2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSkge1xuICAgIG5ld1NldHRpbmdzID0ge1xuICAgICAgLi4ubmV3U2V0dGluZ3MsXG4gICAgICBjb25jdXJyZW5jeToge1xuICAgICAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0nLFxuICAgICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogZmFsc2UsXG4gICAgICB9LFxuICAgIH07XG4gICAgLy8gTW92ZSBqb2JzIHRvIHRoZSBib3R0b21cbiAgICBtb3ZlVG9Cb3R0b20obmV3U2V0dGluZ3MsICdqb2JzJyk7XG4gICAgaWYgKG5ld1NldHRpbmdzLm9uPy5wdXNoKSB7XG4gICAgICBuZXdTZXR0aW5ncy5vbi5wdXNoWydwYXRocy1pZ25vcmUnXSA9IFtcbiAgICAgICAgLi4ubmV3IFNldChbJyoqLm1kJywgJyoqL2RvY3MvKionLCAuLi4obmV3U2V0dGluZ3Mub24ucHVzaFsncGF0aHMtaWdub3JlJ10gPz8gW10pXSksXG4gICAgICBdO1xuICAgIH1cbiAgfVxuXG4gIGlmIChraW5kID09PSAncmVsZWFzZScgJiYgbmV3U2V0dGluZ3Muam9icy5yZWxlYXNlICYmIGRlcGxveVByb2R1Y3Rpb25Xb3JrZmxvd0V4aXN0cykge1xuICAgIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zID8/PSB7fTtcbiAgICBuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucy5hY3Rpb25zID0gJ3dyaXRlJztcbiAgICBuZXdTZXR0aW5ncy5qb2JzLnJlbGVhc2Uud2l0aCA/Pz0ge307XG4gICAgbmV3U2V0dGluZ3Muam9icy5yZWxlYXNlLndpdGgudHJpZ2dlcl9kZXBsb3lfd29ya2Zsb3cgPSAnZGVwbG95LXByb2R1Y3Rpb24ueW1sJztcbiAgfVxuXG4gIGxldCBpc1JldXNhYmxlV29ya2Zsb3cgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBqb2Igb2YgT2JqZWN0LnZhbHVlcyhuZXdTZXR0aW5ncy5qb2JzKSkge1xuICAgIC8vIElnbm9yZSBub24tcmV1c2FibGUgd29ya2Zsb3dzXG4gICAgaWYgKCFqb2IudXNlcz8uaW5jbHVkZXMoJy9yZXVzYWJsZS13b3JrZmxvd3MvJykpIGNvbnRpbnVlO1xuXG4gICAgbm9ybWFsaXplSm9iKGNvbmZpZywgam9iLCBraW5kKTtcbiAgICBpc1JldXNhYmxlV29ya2Zsb3cgPSB0cnVlO1xuICB9XG4gIGlmICghaXNSZXVzYWJsZVdvcmtmbG93KSByZXR1cm47XG5cbiAgc3dpdGNoIChraW5kKSB7XG4gICAgY2FzZSAncmVsZWFzZSc6IHtcbiAgICAgIGlmIChuZXdTZXR0aW5ncy5vbj8uc2NoZWR1bGUpIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLm9uLnB1c2g7XG4gICAgICB9IGVsc2UgaWYgKG5ld1NldHRpbmdzLm9uPy5wdXNoICYmIGNvbmZpZy5yZWxlYXNlLmJyYW5jaGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbmV3U2V0dGluZ3Mub24ucHVzaC5icmFuY2hlcyA9IGNvbmZpZy5yZWxlYXNlLmJyYW5jaGVzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRG9uJ3QgdXNlIHJlbGVhc2UueW1sIGlmIHJlbGVhc2UgYnJhbmNoIGlzIG5vdCBzcGVjaWZpZWRcbiAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsICdyZWxlYXNlLnltbCcpLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmlzUHVibGljUmVwbykge1xuICAgICAgICBuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucyA/Pz0ge307XG4gICAgICAgIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zWydpZC10b2tlbiddID0gJ3dyaXRlJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucz8uWydpZC10b2tlbiddO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgJ3Rlc3QnOiB7XG4gICAgICAvLyBEb24ndCB1c2UgYHBhdGhzLWlnbm9yZWAgZm9yIHRlc3QgYmVjYXVzZSBHaXRIdWIncyBCcmFuY2ggUHJvdGVjdGlvbiBhbmQgUnVsZXNldHMgcmVxdWlyZSBqb2IgcnVubmluZy5cbiAgICAgIGlmIChuZXdTZXR0aW5ncy5vbj8ucHVsbF9yZXF1ZXN0KSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5vbi5wdWxsX3JlcXVlc3RbJ3BhdGhzLWlnbm9yZSddO1xuICAgICAgfVxuICAgICAgaWYgKG5ld1NldHRpbmdzLm9uPy5wdXNoKSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5vbi5wdXNoWydwYXRocy1pZ25vcmUnXTtcbiAgICAgICAgbmV3U2V0dGluZ3Mub24ucHVzaC5icmFuY2hlcyA9IG5ld1NldHRpbmdzLm9uLnB1c2guYnJhbmNoZXMuZmlsdGVyKChicmFuY2gpID0+IGJyYW5jaCAhPT0gJ3Jlbm92YXRlLyoqJyk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgLy8gTm8gZGVmYXVsdFxuICB9XG4gIGF3YWl0IHdyaXRlWWFtbChuZXdTZXR0aW5ncywgZmlsZVBhdGgpO1xuXG4gIGlmIChraW5kID09PSAnc3luYycpIHtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgJ3N5bmMtaW5pdC55bWwnKSwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICBpZiAoIW5ld1NldHRpbmdzLmpvYnMuc3luYz8ud2l0aCkgcmV0dXJuO1xuXG4gICAgLy8gR2VuZXJhdGUgc3luYy1mb3JjZS55bWwgYmFzZWQgb24gc3luYy55bWwgaWYgaXQgZXhpc3RzLlxuICAgIG5ld1NldHRpbmdzLmpvYnNbJ3N5bmMtZm9yY2UnXSA9IG5ld1NldHRpbmdzLmpvYnMuc3luYztcbiAgICBjb25zdCBwYXJhbXMgPSBuZXdTZXR0aW5ncy5qb2JzLnN5bmMud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3Q7XG4gICAgaWYgKHR5cGVvZiBwYXJhbXMgIT09ICdzdHJpbmcnKSByZXR1cm47XG5cbiAgICBuZXdTZXR0aW5ncy5qb2JzLnN5bmMud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3QgPSBgLS1mb3JjZSAke3BhcmFtc31gO1xuICAgIG5ld1NldHRpbmdzLm5hbWUgPSAnRm9yY2UgdG8gU3luYyc7XG4gICAgbmV3U2V0dGluZ3Mub24gPSB7IHdvcmtmbG93X2Rpc3BhdGNoOiBudWxsIH07XG4gICAgZGVsZXRlIG5ld1NldHRpbmdzLmpvYnMuc3luYztcbiAgICBhd2FpdCB3cml0ZVlhbWwobmV3U2V0dGluZ3MsIHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAnc3luYy1mb3JjZS55bWwnKSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplSm9iKGNvbmZpZzogUGFja2FnZUNvbmZpZywgam9iOiBKb2IsIGtpbmQ6IEtub3duS2luZCk6IHZvaWQge1xuICBqb2Iud2l0aCA/Pz0ge307XG4gIGpvYi5zZWNyZXRzID8/PSB7fTtcbiAgLy8gVXNlIHRydXN0ZWQgcHVibGlzaGluZyBpbnN0ZWFkIG9mIE5QTV9UT0tFTlxuICBkZWxldGUgam9iLnNlY3JldHMuTlBNX1RPS0VOO1xuXG4gIGlmIChcbiAgICBraW5kID09PSAndGVzdCcgfHxcbiAgICBraW5kID09PSAncmVsZWFzZScgfHxcbiAgICBraW5kID09PSAnZ2VuLXByLWNsYXVkZScgfHxcbiAgICBraW5kID09PSAnZ2VuLXByLWNvZGV4JyB8fFxuICAgIGtpbmQgPT09ICdnZW4tcHItZ2VtaW5pJ1xuICApIHtcbiAgICBqb2Iuc2VjcmV0cy5HSF9UT0tFTiA9ICcke3sgc2VjcmV0cy5HSVRIVUJfVE9LRU4gfX0nO1xuICB9XG5cbiAgLy8gU2V0IHRlc3QtY29tbWFuZCBmb3IgZ2VuLXByIHdvcmtmbG93cyBiYXNlZCBvbiBwYWNrYWdlIG1hbmFnZXJcbiAgaWYgKGtpbmQgPT09ICdnZW4tcHItY2xhdWRlJyB8fCBraW5kID09PSAnZ2VuLXByLWNvZGV4JyB8fCBraW5kID09PSAnZ2VuLXByLWdlbWluaScpIHtcbiAgICBqb2Iud2l0aFsndGVzdC1jb21tYW5kJ10gPSBjb25maWcuaXNCdW4gPyAnYnVuIHJ1biBjaGVjay1hbGwtZm9yLWFpJyA6ICd5YXJuIGNoZWNrLWFsbC1mb3ItYWknO1xuICB9XG4gIGlmIChqb2Iuc2VjcmV0cy5GSVJFQkFTRV9UT0tFTikge1xuICAgIGpvYi5zZWNyZXRzLkdDUF9TQV9LRVlfSlNPTl9GT1JfRklSRUJBU0UgPSAnJHt7IHNlY3JldHMuR0NQX1NBX0tFWV9KU09OX0ZPUl9GSVJFQkFTRSB9fSc7XG4gICAgZGVsZXRlIGpvYi5zZWNyZXRzLkZJUkVCQVNFX1RPS0VOO1xuICB9XG4gIGlmIChcbiAgICAoam9iLnNlY3JldHMuRElTQ09SRF9XRUJIT09LX1VSTCAmJiAoa2luZCA9PT0gJ3JlbGVhc2UnIHx8IGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykpKSB8fFxuICAgIChqb2Iud2l0aC5zZXJ2ZXJfdXJsICYmIGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykpXG4gICkge1xuICAgIGpvYi5zZWNyZXRzLkRJU0NPUkRfV0VCSE9PS19VUkwgPSAnJHt7IHNlY3JldHMuRElTQ09SRF9XRUJIT09LX1VSTF9GT1JfUkVMRUFTRSB9fSc7XG4gIH1cblxuICBpZiAoa2luZCA9PT0gJ3N5bmMnKSB7XG4gICAgY29uc3QgcGFyYW1zID0gam9iLndpdGguc3luY19wYXJhbXNfd2l0aG91dF9kZXN0O1xuICAgIGlmICh0eXBlb2YgcGFyYW1zID09PSAnc3RyaW5nJykge1xuICAgICAgam9iLndpdGguc3luY19wYXJhbXNfd2l0aG91dF9kZXN0ID0gcGFyYW1zLnJlcGxhY2UoJ3N5bmMgJywgJycpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyLycpKSB7XG4gICAgam9iLnVzZXMgPSBqb2IudXNlcz8ucmVwbGFjZSgnV2lsbEJvb3N0ZXJMYWIvJywgJ1dpbGxCb29zdGVyLycpO1xuICB9IGVsc2UgaWYgKGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJykpIHtcbiAgICBqb2IudXNlcyA9IGpvYi51c2VzPy5yZXBsYWNlKCdXaWxsQm9vc3Rlci8nLCAnV2lsbEJvb3N0ZXJMYWIvJyk7XG4gIH1cblxuICAvLyBSZW1vdmUgcmVkdW5kYW50IHBhcmFtZXRlcnNcbiAgaWYgKGpvYi53aXRoLmRvdF9lbnZfcGF0aCA9PT0gJy5lbnYnKSB7XG4gICAgZGVsZXRlIGpvYi53aXRoLmRvdF9lbnZfcGF0aDtcbiAgfVxuXG4gIC8vIERvbid0IHVzZSBgZmx5IGRlcGxveSAtLWpzb25gIHNpbmNlIGl0IGNhdXNlcyBhbiBlcnJvclxuICBpZiAoa2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSAmJiBqb2Iuc2VjcmV0cy5GTFlfQVBJX1RPS0VOICYmIHR5cGVvZiBqb2Iud2l0aC5kZXBsb3lfY29tbWFuZCA9PT0gJ3N0cmluZycpIHtcbiAgICBqb2Iud2l0aC5kZXBsb3lfY29tbWFuZCA9IGpvYi53aXRoLmRlcGxveV9jb21tYW5kLnJlcGxhY2UoL1xccystLWpzb24vLCAnJyk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbkRvY2tlcmZpbGUgJiYgIWpvYi53aXRoLmNpX2xhYmVsICYmIGtpbmQuc3RhcnRzV2l0aCgndGVzdCcpKSB7XG4gICAgam9iLndpdGguY2lfbGFiZWwgPSAnbGFyZ2UnO1xuICB9XG4gIC8vIEJlY2F1c2UgZ2l0aHViLmV2ZW50LnJlcG9zaXRvcnkucHJpdmF0ZSBpcyBhbHdheXMgdHJ1ZSBpZiBqb2IgaXMgc2NoZWR1bGVkXG4gIGlmIChraW5kID09PSAncmVsZWFzZScgfHwga2luZCA9PT0gJ3Rlc3QnIHx8IGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykpIHtcbiAgICBpZiAoY29uZmlnLmlzUHVibGljUmVwbykge1xuICAgICAgam9iLndpdGguZ2l0aHViX2hvc3RlZF9ydW5uZXIgPSB0cnVlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBkZWxldGUgam9iLndpdGguZ2l0aHViX2hvc3RlZF9ydW5uZXI7XG4gIH1cblxuICBpZiAoT2JqZWN0LmtleXMoam9iLndpdGgpLmxlbmd0aCA+IDApIHtcbiAgICBzb3J0S2V5cyhqb2Iud2l0aCk7XG4gIH0gZWxzZSB7XG4gICAgZGVsZXRlIGpvYi53aXRoO1xuICB9XG4gIGlmIChPYmplY3Qua2V5cyhqb2Iuc2VjcmV0cykubGVuZ3RoID4gMCkge1xuICAgIC8vIE1vdmUgc2VjcmV0cyBwcm9wIGFmdGVyIHdpdGggcHJvcFxuICAgIGNvbnN0IG5ld1NlY3JldHMgPSBzb3J0S2V5cyhqb2Iuc2VjcmV0cyk7XG4gICAgZGVsZXRlIGpvYi5zZWNyZXRzO1xuICAgIGpvYi5zZWNyZXRzID0gbmV3U2VjcmV0cztcbiAgfSBlbHNlIHtcbiAgICBkZWxldGUgam9iLnNlY3JldHM7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVBdXRvZml4V29ya2Zsb3coY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogV29ya2Zsb3cge1xuICBpZiAoIWNvbmZpZy5pc1B1YmxpY1JlcG8pIHtcbiAgICByZXR1cm4gY2xvbmVEZWVwKHByaXZhdGVSZXBvQXV0b2ZpeFdvcmtmbG93KTtcbiAgfVxuXG4gIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gY29uZmlnLmlzQnVuID8gJ2J1bicgOiAneWFybic7XG4gIGNvbnN0IHN0ZXBzOiBTdGVwW10gPSBbXG4gICAgeyB1c2VzOiAnYWN0aW9ucy9jaGVja291dEB2NicgfSxcbiAgICB7IHVzZXM6ICdhY3Rpb25zL3NldHVwLW5vZGVAdjYnLCB3aXRoOiB7ICdjaGVjay1sYXRlc3QnOiB0cnVlIH0gfSxcbiAgICAuLi4oY29uZmlnLmlzQnVuID8gW3sgdXNlczogJ292ZW4tc2gvc2V0dXAtYnVuQHYxJywgd2l0aDogeyAnYnVuLXZlcnNpb24nOiAnbGF0ZXN0JyB9IH1dIDogW10pLFxuICAgIHsgcnVuOiBgJHtwYWNrYWdlTWFuYWdlcn0gaW5zdGFsbGAgfSxcbiAgICB7IHJ1bjogYCR7cGFja2FnZU1hbmFnZXJ9IHJ1biBjbGVhbnVwYCB9LFxuICBdO1xuICBpZiAoY29uZmlnLnBhY2thZ2VKc29uPy5zY3JpcHRzPy5idWlsZCkge1xuICAgIHN0ZXBzLnB1c2goeyBydW46IGAke3BhY2thZ2VNYW5hZ2VyfSBydW4gYnVpbGRgIH0pO1xuICB9XG4gIHN0ZXBzLnB1c2goeyB1c2VzOiAnYXV0b2ZpeC1jaS9hY3Rpb25AdjEnIH0pO1xuXG4gIGNvbnN0IGF1dG9maXhXb3JrZmxvdyA9IGNsb25lRGVlcChwdWJsaWNSZXBvQXV0b2ZpeFdvcmtmbG93KTtcbiAgY29uc3QgYXV0b2ZpeEpvYiA9IGF1dG9maXhXb3JrZmxvdy5qb2JzLmF1dG9maXggPz8geyAncnVucy1vbic6ICd1YnVudHUtbGF0ZXN0JyB9O1xuICBhdXRvZml4V29ya2Zsb3cuam9icy5hdXRvZml4ID0geyAuLi5hdXRvZml4Sm9iLCBzdGVwcyB9O1xuICByZXR1cm4gYXV0b2ZpeFdvcmtmbG93O1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZVlhbWwobmV3U2V0dGluZ3M6IFdvcmtmbG93LCBmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHlhbWxUZXh0ID0geWFtbC5kdW1wKG5ld1NldHRpbmdzLCB7IGxpbmVXaWR0aDogLTEsIG5vQ29tcGF0TW9kZTogdHJ1ZSwgc3R5bGVzOiB7ICchIW51bGwnOiAnZW1wdHknIH0gfSk7XG4gIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShmaWxlUGF0aCwgeWFtbFRleHQpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYic7XG5cbmltcG9ydCB7IGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvIH0gZnJvbSAnLi4vZ2VuZXJhdG9ycy93b3JrZmxvdy5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4uL29wdGlvbnMuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJy4uL3V0aWxzL2dsb2JVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4VHlwb3MocGFja2FnZUNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFR5cG9zJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmIChpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyhwYWNrYWdlQ29uZmlnLnJlcG9zaXRvcnkpKSByZXR1cm47XG5cbiAgICBjb25zdCBkaXJQYXRoID0gcGFja2FnZUNvbmZpZy5kaXJQYXRoO1xuICAgIGNvbnN0IGRvY0ZpbGVzID0gYXdhaXQgZmcuZ2xvYignKiovKi5tZCcsIHsgZG90OiB0cnVlLCBjd2Q6IGRpclBhdGgsIGlnbm9yZTogZ2xvYklnbm9yZSB9KTtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRm91bmQgJHtkb2NGaWxlcy5sZW5ndGh9IG1hcmtkb3duIGZpbGVzIGluICR7ZGlyUGF0aH1gKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBtZEZpbGUgb2YgZG9jRmlsZXMpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIG1kRmlsZSk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICAgIGxldCBuZXdDb250ZW50ID0gZml4VHlwb3NJblRleHQoY29udGVudCk7XG4gICAgICAgIG5ld0NvbnRlbnQgPSByZXBsYWNlV2l0aENvbmZpZyhuZXdDb250ZW50LCBwYWNrYWdlQ29uZmlnLCAnZG9jJyk7XG4gICAgICAgIGlmIChjb250ZW50ICE9PSBuZXdDb250ZW50KSB7XG4gICAgICAgICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHRzRmlsZXMgPSBhd2FpdCBmZy5nbG9iKFxuICAgICAgW1xuICAgICAgICAne2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjanMsbWpzLGpzLGpzeCxjdHMsbXRzLHRzLHRzeH0nLFxuICAgICAgICAncGFja2FnZXMvKiove2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjanMsbWpzLGpzLGpzeCxjdHMsbXRzLHRzLHRzeH0nLFxuICAgICAgXSxcbiAgICAgIHsgZG90OiB0cnVlLCBjd2Q6IGRpclBhdGgsIGlnbm9yZTogZ2xvYklnbm9yZSB9XG4gICAgKTtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRm91bmQgJHt0c0ZpbGVzLmxlbmd0aH0gVHlwZVNjcmlwdCBmaWxlcyBpbiAke2RpclBhdGh9YCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgdHNGaWxlIG9mIHRzRmlsZXMpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIHRzRmlsZSk7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBsZXQgbmV3Q29udGVudCA9IGZpeFR5cG9zSW5Db2RlKG9sZENvbnRlbnQpO1xuICAgICAgbmV3Q29udGVudCA9IHJlcGxhY2VXaXRoQ29uZmlnKG5ld0NvbnRlbnQsIHBhY2thZ2VDb25maWcsICd0cycpO1xuXG4gICAgICBpZiAob2xkQ29udGVudCA9PT0gbmV3Q29udGVudCkgY29udGludWU7XG4gICAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KTtcbiAgICB9XG5cbiAgICBjb25zdCB0ZXh0QmFzZWRGaWxlcyA9IGF3YWl0IGZnLmdsb2IoJyoqLyoue2NzdixodG0saHRtbCx0c3YseG1sLHlhbWwseW1sfScsIHtcbiAgICAgIGRvdDogdHJ1ZSxcbiAgICAgIGN3ZDogZGlyUGF0aCxcbiAgICAgIGlnbm9yZTogZ2xvYklnbm9yZSxcbiAgICB9KTtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRm91bmQgJHt0ZXh0QmFzZWRGaWxlcy5sZW5ndGh9IHRleHQtYmFzZWQgZmlsZXMgaW4gJHtkaXJQYXRofWApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgdGV4dEJhc2VkRmlsZXMpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIGZpbGUpO1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgbGV0IG5ld0NvbnRlbnQgPSBmaXhUeXBvc0luVGV4dChvbGRDb250ZW50KTtcbiAgICAgIG5ld0NvbnRlbnQgPSByZXBsYWNlV2l0aENvbmZpZyhuZXdDb250ZW50LCBwYWNrYWdlQ29uZmlnLCAndGV4dCcpO1xuXG4gICAgICBpZiAob2xkQ29udGVudCA9PT0gbmV3Q29udGVudCkgY29udGludWU7XG4gICAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KTtcbiAgICB9XG5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZml4VHlwb3NJblRleHQoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNvbnRlbnRcbiAgICAucmVwbGFjZUFsbCgvXFxiY1xcLmZcXC4oW14kXSkvZywgJ2NmLiQxJylcbiAgICAucmVwbGFjZUFsbCgvXFxiZWdcXC4oW14kXSkvZywgJ2UuZy4kMScpXG4gICAgLnJlcGxhY2VBbGwoL1xcYmllXFwuKFteJF0pL2csICdpLmUuJDEnKTtcbn1cblxuZnVuY3Rpb24gZml4VHlwb3NJbkNvZGUoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNvbnRlbnRcbiAgICAucmVwbGFjZUFsbCgvXFwvXFwvKC4qKWNcXC5mXFwuL2csICcvLyQxY2YuJylcbiAgICAucmVwbGFjZUFsbCgvXFwvXFwvKC4qKWVnXFwuL2csICcvLyQxZS5nLicpXG4gICAgLnJlcGxhY2VBbGwoL1xcL1xcLyguKilpZVxcLi9nLCAnLy8kMWkuZS4nKTtcbn1cblxuZnVuY3Rpb24gcmVwbGFjZVdpdGhDb25maWcobmV3Q29udGVudDogc3RyaW5nLCBwYWNrYWdlQ29uZmlnOiBQYWNrYWdlQ29uZmlnLCBwcm9wTmFtZTogJ2RvYycgfCAndHMnIHwgJ3RleHQnKTogc3RyaW5nIHtcbiAgZm9yIChjb25zdCBbYmVmb3JlLCBhZnRlcl0gb2YgT2JqZWN0LmVudHJpZXMocGFja2FnZUNvbmZpZy53YmZ5SnNvbj8udHlwb3M/LmFsbCA/PyB7fSkpIHtcbiAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlQWxsKGJlZm9yZSwgYWZ0ZXIpO1xuICB9XG4gIGZvciAoY29uc3QgW2JlZm9yZSwgYWZ0ZXJdIG9mIE9iamVjdC5lbnRyaWVzKHBhY2thZ2VDb25maWcud2JmeUpzb24/LnR5cG9zPy5bcHJvcE5hbWVdID8/IHt9KSkge1xuICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2VBbGwoYmVmb3JlLCBhZnRlcik7XG4gIH1cbiAgcmV0dXJuIG5ld0NvbnRlbnQ7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbnMnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFyb290Q29uZmlnLmlzUm9vdCkgcmV0dXJuO1xuXG4gICAgLy8gQ2hlY2sgaWYgQUdFTlRTX0VYVFJBLm1kIGV4aXN0cyBhbmQgcmVhZCBpdHMgY29udGVudFxuICAgIGNvbnN0IGFnZW50c0V4dHJhUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICdBR0VOVFNfRVhUUkEubWQnKTtcbiAgICBjb25zdCBleHRyYUNvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGFnZW50c0V4dHJhUGF0aCk7XG5cbiAgICBmb3IgKGNvbnN0IFtmaWxlTmFtZSwgdG9vbE5hbWVdIG9mIFtcbiAgICAgIFsnQUdFTlRTLm1kJywgJ0NvZGV4IENMSSddLFxuICAgICAgWydDTEFVREUubWQnLCAnQ2xhdWRlIENvZGUnXSxcbiAgICAgIFsnR0VNSU5JLm1kJywgJ0dlbWluaSBDTEknXSxcbiAgICBdIGFzIGNvbnN0KSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9uKHJvb3RDb25maWcsIGFsbENvbmZpZ3MsIHRvb2xOYW1lLCBleHRyYUNvbnRlbnQpO1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCBmaWxlTmFtZSk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgY29udGVudCkpO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnNvclJ1bGVzUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcuY3Vyc29yL3J1bGVzL2dlbmVyYWwubWRjJyk7XG4gICAgY29uc3QgY3Vyc29yUnVsZXNDb250ZW50ID0gZ2VuZXJhdGVDdXJzb3JHZW5lcmFsTWRjQ29udGVudChyb290Q29uZmlnLCBhbGxDb25maWdzLCBleHRyYUNvbnRlbnQpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGN1cnNvclJ1bGVzUGF0aCwgY3Vyc29yUnVsZXNDb250ZW50KSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb24oXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSxcbiAgdG9vbE5hbWU6IHN0cmluZyxcbiAgZXh0cmFDb250ZW50Pzogc3RyaW5nXG4pOiBzdHJpbmcge1xuICBjb25zdCBwYWNrYWdlTWFuYWdlciA9IHJvb3RDb25maWcuaXNCdW4gPyAnYnVuJyA6ICd5YXJuJztcbiAgY29uc3QgYmFzZUNvbnRlbnQgPSBgXG4jIyBQcm9qZWN0IEluZm9ybWF0aW9uXG5cbi0gTmFtZTogXFxgJHtyb290Q29uZmlnLnBhY2thZ2VKc29uPy5uYW1lIHx8ICd1bmtub3duJ31cXGBcbi0gRGVzY3JpcHRpb246ICR7cm9vdENvbmZpZy5wYWNrYWdlSnNvbj8uZGVzY3JpcHRpb259XG4tIFBhY2thZ2UgTWFuYWdlcjogJHtwYWNrYWdlTWFuYWdlcn1cblxuIyMgR2VuZXJhbCBJbnN0cnVjdGlvbnNcblxuLSBDcmVhdGUgYSBuZXcgYnJhbmNoIGlmIHRoZSBjdXJyZW50IGJyYW5jaCBpcyBcXGBtYWluXFxgLlxuLSBSdW4gYW55IFxcYGdpdFxcYCBjb21tYW5kcyBzZXF1ZW50aWFsbHkuXG4tIFdyaXRlIHRlc3RzIE9OTFkgaWYgZXhwbGljaXRseSByZXF1ZXN0ZWQuIElmIHJlcXVlc3RlZCwgZm9sbG93IHRoZXNlIHJ1bGVzOlxuICAtIENvbnRpbnVlIG1vZGlmeWluZyB0aGUgdGVzdHMgYW5kIGNvZGUgdW50aWwgYWxsIHRlc3RzIHBhc3MuXG4gIC0gRW5zdXJlIHRlc3RzIHJlc2V0IGFueSByZWxhdGVkIHBlcnNpc3RlbnQgZGF0YSwgYXMgb3VyIHRlc3QgaW5mcmFzdHJ1Y3R1cmUgZG9lcyBub3QgY2xlYXIgaXQgYXV0b21hdGljYWxseS5cbiAgLSBQcmVmZXIgYWN0dWFsIEFQSSBjYWxscyBvdmVyIG1vY2tzLiBVc2UgbW9ja3Mgd2hlbiBhY3R1YWwgY2FsbHMgYXJlIGltcHJhY3RpY2FsLCBoYXZlIHVuaW50ZW5kZWQgc2lkZSBlZmZlY3RzLCBvciBhcmUgZXhwbGljaXRseSByZXF1ZXN0ZWQuXG4tIEJlZm9yZSBmaXhpbmcgaXNzdWVzLCBhbHdheXMgaW52ZXN0aWdhdGUgdGhlIHJvb3QgY2F1c2UgZmlyc3QgKGUuZy4sIGJ5IGdhdGhlcmluZyBkZWJ1ZyBsb2dzLCB0YWtpbmcgc2NyZWVuc2hvdHMsIGV0Yy4pLlxuLSBBZnRlciBtYWtpbmcgY29kZSBjaGFuZ2VzLCBydW4gXFxgJHtwYWNrYWdlTWFuYWdlcn0gY2hlY2stYWxsLWZvci1haVxcYCB0byBleGVjdXRlIGFsbCB0ZXN0cyAodGFrZXMgdXAgdG8gMSBob3VyKSBvciBcXGAke3BhY2thZ2VNYW5hZ2VyfSBjaGVjay1mb3ItYWlcXGAgZm9yIHR5cGUgY2hlY2tpbmcgYW5kIGxpbnRpbmcgb25seSAodGFrZXMgdXAgdG8gMTAgbWludXRlcykuXG4gIC0gSWYgeW91IGFyZSBjb25maWRlbnQgeW91ciBjaGFuZ2VzIHdpbGwgbm90IGJyZWFrIGFueSB0ZXN0cywgeW91IG1heSB1c2UgXFxgY2hlY2stZm9yLWFpXFxgLlxuLSBPbmNlIHlvdSBoYXZlIHZlcmlmaWVkIHlvdXIgY2hhbmdlcywgY29tbWl0IGFuZCBwdXNoIHRoZW0gdG8gdGhlIGN1cnJlbnQgKG5vbi1tYWluKSBicmFuY2ggdGhlbiBjcmVhdGUgYSBQUiB2aWEgXFxgZ2hcXGAuXG4gIC0gRm9sbG93IHRoZSBjb252ZW50aW9uYWwgY29tbWl0czsgeW91ciBjb21taXQgbWVzc2FnZSBzaG91bGQgc3RhcnQgd2l0aCBcXGBmZWF0OlxcYCwgXFxgZml4OlxcYCwgZXRjLlxuICAtIElmIG5vdCBzcGVjaWZpZWQsIG1ha2Ugc3VyZSB0byBhZGQgYSBuZXcgbGluZSBhdCB0aGUgZW5kIG9mIHlvdXIgY29tbWl0IG1lc3NhZ2Uke3Jvb3RDb25maWcuaXNXaWxsQm9vc3RlclJlcG8gPyBgIHdpdGg6IFxcYENvLWF1dGhvcmVkLWJ5OiBXaWxsQm9vc3RlciAoJHt0b29sTmFtZX0pIDxhZ2VudEB3aWxsYm9vc3Rlci5jb20+XFxgYCA6ICcnfS5cbiAgLSBBbHdheXMgY3JlYXRlIG5ldyBjb21taXRzLiBBdm9pZCB1c2luZyBcXGAtLWFtZW5kXFxgLlxuJHtcbiAgYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmhhc1N0YXJ0VGVzdFNlcnZlcilcbiAgICA/IGAtIFVzZSBcXGAke3BhY2thZ2VNYW5hZ2VyfSBydW4gc3RhcnQtdGVzdC1zZXJ2ZXJcXGAgdG8gbGF1bmNoIGEgd2ViIHNlcnZlciBmb3IgZGVidWdnaW5nIG9yIHRlc3RpbmcuYFxuICAgIDogJydcbn1cblxuJHtnZW5lcmF0ZUFnZW50Q29kaW5nU3R5bGUoYWxsQ29uZmlncyl9XG5gXG4gICAgLnJlcGxhY2VBbGwoL1xcLlxcblxcbistL2csICcuXFxuLScpXG4gICAgLnJlcGxhY2VBbGwoL1xcbnszLH0vZywgJ1xcblxcbicpXG4gICAgLnRyaW0oKTtcblxuICBjb25zdCBoYXNOZXdTZWN0aW9uID0gZXh0cmFDb250ZW50Py50cmltKCkuc3RhcnRzV2l0aCgnIycpO1xuICBjb25zdCBub3JtYWxpemVkRXh0cmFDb250ZW50ID0gZXh0cmFDb250ZW50XG4gICAgPyBoYXNOZXdTZWN0aW9uXG4gICAgICA/ICdcXG5cXG4nICsgZXh0cmFDb250ZW50LnRyaW0oKVxuICAgICAgOiAnXFxuJyArIGV4dHJhQ29udGVudFxuICAgIDogJyc7XG4gIHJldHVybiBiYXNlQ29udGVudCArIG5vcm1hbGl6ZWRFeHRyYUNvbnRlbnQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUFnZW50Q29kaW5nU3R5bGUoYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogc3RyaW5nIHtcbiAgLy8gS2VlcCB0b3AtZG93biBvcmRlcmluZyBndWlkYW5jZSBmdW5jdGlvbi1vbmx5IGJlY2F1c2UgY2xhc3NlcyBhcmUgbm90IGhvaXN0ZWQgYW5kIGNhbiBmYWlsIHdoZW4gaW5oZXJpdGFuY2Ugb3IgdG9wLWxldmVsIGluc3RhbnRpYXRpb24gZGVwZW5kcyBvbiBkZWNsYXJhdGlvbiBvcmRlci5cbiAgcmV0dXJuIGBcbiMjIENvZGluZyBTdHlsZVxuXG4tIFVzZSBjYW1lbENhc2UgZm9yIEphdmFTY3JpcHQgYW5kIFR5cGVTY3JpcHQgZmlsZXMgKG9yIFBhc2NhbENhc2UgZm9yIFJlYWN0IGNvbXBvbmVudHMpLlxuLSBTaW1wbGlmeSBjb2RlIGFzIG11Y2ggYXMgcG9zc2libGUgdG8gZWxpbWluYXRlIHJlZHVuZGFuY3kuXG4tIERlc2lnbiBlYWNoIG1vZHVsZSB3aXRoIGhpZ2ggY29oZXNpb24sIGdyb3VwaW5nIHJlbGF0ZWQgZnVuY3Rpb25hbGl0eSB0b2dldGhlci5cbiAgLSBSZWZhY3RvciBleGlzdGluZyBsYXJnZSBtb2R1bGVzIGludG8gc21hbGxlciwgZm9jdXNlZCBtb2R1bGVzIHdoZW4gbmVjZXNzYXJ5LlxuICAtIENyZWF0ZSB3ZWxsLW9yZ2FuaXplZCBkaXJlY3Rvcnkgc3RydWN0dXJlcyB3aXRoIGxvdyBjb3VwbGluZyBhbmQgaGlnaCBjb2hlc2lvbi5cbi0gUGxhY2UgY2FsbGluZyBmdW5jdGlvbnMgaW4gdGhlIGZpbGUgYWJvdmUgdGhlIGZ1bmN0aW9ucyB0aGV5IGNhbGwgdG8gbWFpbnRhaW4gYSBjbGVhciB0b3AtZG93biBvcmRlci5cbiAgLSBlLmcuIFxcYGZ1bmN0aW9uIGNhbGxlcigpIHsgY2FsbGVlKCk7IH0gZnVuY3Rpb24gY2FsbGVlKCkgeyAuLi4gfVxcYFxuLSBXcml0ZSBjb21tZW50cyB0aGF0IGV4cGxhaW4gXCJ3aHlcIiByYXRoZXIgdGhhbiBcIndoYXRcIi4gQXZvaWQgc3RhdGluZyB3aGF0IGNhbiBiZSB1bmRlcnN0b29kIGZyb20gdGhlIGNvZGUgaXRzZWxmLlxuLSBQcmVmZXIgXFxgdW5kZWZpbmVkXFxgIG92ZXIgXFxgbnVsbFxcYCB1bmxlc3MgZXhwbGljaXRseSByZXF1aXJlZCBieSBBUElzIG9yIGxpYnJhcmllcy5cbi0gUHJlZmVyIHVzaW5nIGEgc2luZ2xlIHRlbXBsYXRlIGxpdGVyYWwgZm9yIHByb21wdHMgaW5zdGVhZCBvZiBcXGBqb2luKClcXGAgd2l0aCBhbiBhcnJheSBvZiBzdHJpbmdzLlxuJHtcbiAgYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRlcGVuZGluZy5nZW5JMThuVHMpXG4gICAgPyBgLSBXaGVuIGludHJvZHVjaW5nIG5ldyBzdHJpbmcgbGl0ZXJhbHMgaW4gUmVhY3QgY29tcG9uZW50cywgdXBkYXRlIHRoZSBsYW5ndWFnZSByZXNvdXJjZSBmaWxlcyBpbiB0aGUgXFxgaTE4blxcYCBkaXJlY3RvcnkgKGUuZy4sIFxcYGkxOG4vamEtSlAuanNvblxcYCkuIFJlZmVyZW5jZSB0aGVzZSBzdHJpbmdzIHVzaW5nIHRoZSBcXGBpMThuXFxgIHV0aWxpdHkuIEZvciBleGFtcGxlLCB1c2UgXFxgaTE4bi5wYWdlcy5ob21lLnRpdGxlKClcXGAgZm9yIFxcYHsgXCJwYWdlc1wiOiB7IFwiaG9tZVwiOiB7IFwidGl0bGVcIjogXCJNeSBBcHBcIiB9IH0gfVxcYC5gXG4gICAgOiAnJ1xufVxuJHtcbiAgYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRlcGVuZGluZy5yZWFjdCB8fCBjLmRlcGVuZGluZy5uZXh0KVxuICAgID8gYC0gUHJlZmVyIFxcYHVzZUltbWVyXFxgIGZvciBzdG9yaW5nIGFuIGFycmF5IG9yIGFuIG9iamVjdCB0byBcXGB1c2VTdGF0ZVxcYC5gXG4gICAgOiAnJ1xufVxuJHtcbiAgYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRlcGVuZGluZy5uZXh0KVxuICAgID8gYFxuLSBTaW5jZSB0aGlzIHByb2plY3QgdXNlcyB0aGUgUmVhY3QgQ29tcGlsZXIsIHlvdSBkbyBub3QgbmVlZCB0byB1c2UgXFxgdXNlQ2FsbGJhY2tcXGAgb3IgXFxgdXNlTWVtb1xcYCBmb3IgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uLlxuLSBBc3N1bWUgdGhlcmUgaXMgb25seSBhIHNpbmdsZSBzZXJ2ZXIgaW5zdGFuY2UuXG5gXG4gICAgOiAnJ1xufVxuYFxuICAgIC5yZXBsYWNlQWxsKC9cXC5cXG5cXG4rLS9nLCAnLlxcbi0nKVxuICAgIC5yZXBsYWNlQWxsKC9cXG57Myx9L2csICdcXG5cXG4nKVxuICAgIC50cmltKCk7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlQ3Vyc29yR2VuZXJhbE1kY0NvbnRlbnQoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdLFxuICBleHRyYUNvbnRlbnQ/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+IGZzLnByb21pc2VzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWNvbmZpZy5lc2xpbnRCYXNlKSByZXR1cm47XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgaWYgKCFvbGRDb250ZW50LmluY2x1ZGVzKCdleHBvcnQgeyBkZWZhdWx0IH0nKSkgcmV0dXJuO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cblxuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBgZXhwb3J0IHsgZGVmYXVsdCB9IGZyb20gJyR7Y29uZmlnLmVzbGludEJhc2V9JztgKSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgeWFtbCBmcm9tICdqcy15YW1sJztcbmltcG9ydCBjbG9uZURlZXAgZnJvbSAnbG9kYXNoLmNsb25lZGVlcCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW1wb3J0IHsgZ2VuZXJhdGVBZ2VudENvZGluZ1N0eWxlIH0gZnJvbSAnLi9hZ2VudHMuanMnO1xuXG5jb25zdCBkZWZhdWx0Q29uZmlnID0ge1xuICBoYXZlX2Z1bjogdHJ1ZSxcbiAgY29kZV9yZXZpZXc6IHtcbiAgICBkaXNhYmxlOiBmYWxzZSxcbiAgICBjb21tZW50X3NldmVyaXR5X3RocmVzaG9sZDogJ01FRElVTScsXG4gICAgbWF4X3Jldmlld19jb21tZW50czogLTEsXG4gICAgcHVsbF9yZXF1ZXN0X29wZW5lZDoge1xuICAgICAgaGVscDogZmFsc2UsXG4gICAgICBzdW1tYXJ5OiB0cnVlLFxuICAgICAgY29kZV9yZXZpZXc6IHRydWUsXG4gICAgfSxcbiAgfSxcbiAgaWdub3JlX3BhdHRlcm5zOiBbJyoqL19fZ2VuZXJhdGVkX18nXSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUdlbWluaUNvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcsIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlR2VtaW5pQ29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghY29uZmlnLmlzUm9vdCkgcmV0dXJuO1xuXG4gICAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5nZW1pbmknKTtcbiAgICBjb25zdCBjb25maWdGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnY29uZmlnLnltbCcpO1xuICAgIGNvbnN0IHN0eWxlZ3VpZGVGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnc3R5bGVndWlkZS5tZCcpO1xuICAgIGNvbnN0IGFnZW50c0V4dHJhUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ0FHRU5UU19FWFRSQS5tZCcpO1xuXG4gICAgbGV0IG5ld0NvbmZpZzogb2JqZWN0ID0gY2xvbmVEZWVwKGRlZmF1bHRDb25maWcpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoY29uZmlnRmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBvbGRDb25maWcgPSB5YW1sLmxvYWQob2xkQ29udGVudCkgYXMgb2JqZWN0O1xuICAgICAgbmV3Q29uZmlnID0gbWVyZ2UuYWxsKFtuZXdDb25maWcsIG9sZENvbmZpZywgbmV3Q29uZmlnXSwgeyBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmcgLSBmaWxlIGRvZXNuJ3QgZXhpc3Qgb3IgY2FuJ3QgYmUgcGFyc2VkXG4gICAgfVxuXG4gICAgY29uc3QgeWFtbENvbnRlbnQgPSB5YW1sLmR1bXAobmV3Q29uZmlnLCB7XG4gICAgICBsaW5lV2lkdGg6IC0xLFxuICAgICAgbm9Db21wYXRNb2RlOiB0cnVlLFxuICAgICAgc3R5bGVzOiB7XG4gICAgICAgICchIW51bGwnOiAnZW1wdHknLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGV4dHJhQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoYWdlbnRzRXh0cmFQYXRoKTtcbiAgICBjb25zdCBjb2RpbmdSdWxlRXh0cmFDb250ZW50ID0gZXh0cmFDb250ZW50Py50cmltU3RhcnQoKS5zdGFydHNXaXRoKCcjJykgPyB1bmRlZmluZWQgOiBleHRyYUNvbnRlbnQ7XG4gICAgY29uc3Qgc3R5bGVndWlkZUNvbnRlbnQgPSBg5Lul5LiL44Gu44Kz44O844OH44Kj44Oz44Kw6KaP57SE44KS6LiP44G+44GI44Gm44CB5pel5pys6Kqe44Gn44Os44OT44Ol44O844GX44Gm44GP44Gg44GV44GE44CCXFxuXFxuJHtnZW5lcmF0ZUFnZW50Q29kaW5nU3R5bGUoYWxsQ29uZmlncyl9JHtcbiAgICAgIGNvZGluZ1J1bGVFeHRyYUNvbnRlbnQgPyBgXFxuXFxuJHtjb2RpbmdSdWxlRXh0cmFDb250ZW50LnRyaW1FbmQoKX1gIDogJydcbiAgICB9YDtcblxuICAgIGNvbnN0IHByb21pc2VzID0gW1xuICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoY29uZmlnRmlsZVBhdGgsIHlhbWxDb250ZW50KSksXG4gICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShzdHlsZWd1aWRlRmlsZVBhdGgsIHN0eWxlZ3VpZGVDb250ZW50KSksXG4gICAgXTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVtb3ZlR2VtaW5pU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHZW1pbmlTZXR0aW5ncycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWNvbmZpZy5pc1Jvb3QpIHJldHVybjtcblxuICAgIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2VtaW5pJyk7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3NldHRpbmdzLmpzb24nKTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbi8vIGNmLiBodHRwczovL2J1bi5zaC9ndWlkZXMvaW5zdGFsbC9naXQtZGlmZi1idW4tbG9ja2ZpbGVcbmNvbnN0IG5ld0NvbnRlbnQgPSBgKiB0ZXh0PWF1dG9cblxuKi5sb2NrYiBiaW5hcnkgZGlmZj1sb2NrYlxuKi52Y3Byb2ogdGV4dCBlb2w9Y3JsZlxuXG4ke1suLi5leHRlbnNpb25zLmNvZGVXaXRoMkluZGVudFNpemUsIC4uLmV4dGVuc2lvbnMuY29kZVdpdGg0SW5kZW50U2l6ZSwgLi4uZXh0ZW5zaW9ucy5tYXJrZG93bkxpa2VdXG4gIC5tYXAoKGV4dCkgPT4gYCouJHtleHR9IHRleHQgZW9sPWxmYClcbiAgLmpvaW4oJ1xcbicpfVxuXG5kaXN0LyoqIGxpbmd1aXN0LWdlbmVyYXRlZD10cnVlXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlR2l0YXR0cmlidXRlcycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRhdHRyaWJ1dGVzJyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgb3MgZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4uL29wdGlvbnMuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgaWdub3JlRmlsZVV0aWwgfSBmcm9tICcuLi91dGlscy9pZ25vcmVGaWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgZGVmYXVsdE5hbWVzID0gWyd3aW5kb3dzJywgJ21hY29zJywgJ2xpbnV4JywgJ2pldGJyYWlucycsICd2aXN1YWxzdHVkaW9jb2RlJywgJ2VtYWNzJywgJ3ZpbScsICd5YXJuJ107XG5cbmNvbnN0IGNvbW1vbkNvbnRlbnQgPSBgXG4hLmtlZXBcbi5haWRlcipcbi5lbnYucHJvZHVjdGlvblxuKi9tb3VudC8qLmhhc2hcbi5kZXZjb250YWluZXIvXG4uaWRlYS9BdWdtZW50V2Vidmlld1N0YXRlU3RvcmUueG1sXG4uaWRlYS9jb3BpbG90Lipcbi5pZGVhL2NvcGlsb3QvY2hhdFNlc3Npb25zL1xuLnBsYXl3cmlnaHQtY2xpL1xuLnNlcmVuYS9cbi50bXAvXG5fX2dlbmVyYXRlZF9fL1xuQHdpbGxib29zdGVyL1xuZGlzdC9cbnRlbXAvXG50bXAvXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHaXRpZ25vcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHaXRpZ25vcmUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aWdub3JlJyk7XG4gICAgY29uc3QgY29udGVudCA9IChhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoKSkgPz8gJyc7XG4gICAgbGV0IGhlYWRVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldEhlYWRVc2VyQ29udGVudChjb250ZW50KSArIGNvbW1vbkNvbnRlbnQ7XG4gICAgY29uc3QgdGFpbFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0VGFpbFVzZXJDb250ZW50KGNvbnRlbnQpO1xuXG4gICAgY29uc3QgbmFtZXMgPSBbLi4uZGVmYXVsdE5hbWVzXTtcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluR2VtZmlsZSkge1xuICAgICAgbmFtZXMucHVzaCgncnVieScpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluR29Nb2QpIHtcbiAgICAgIG5hbWVzLnB1c2goJ2dvJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYCR7cGF0aC5iYXNlbmFtZShjb25maWcuZGlyUGF0aCl9XG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24pIHtcbiAgICAgIG5hbWVzLnB1c2goJ25vZGUnKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvbVhtbCkge1xuICAgICAgbmFtZXMucHVzaCgnbWF2ZW4nKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLmlkZWEvZ29vZ2xlLWphdmEtZm9ybWF0LnhtbFxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBuYW1lcy5wdXNoKCdmbHV0dGVyJywgJ0FuZHJvaWRTdHVkaW8nLCAncnVieScpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuZmx1dHRlci1wbHVnaW5zLWRlcGVuZGVuY2llc1xuYW5kcm9pZC9rZXkucHJvcGVydGllc1xuaW9zLy5idW5kbGVcbi5pZGVhL3J1bkNvbmZpZ3VyYXRpb25zLnhtbFxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblRlbXBsYXRlWWFtbCkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuYXdzLXNhbS9cbnBhY2thZ2VkLnlhbWxcbmA7XG4gICAgfVxuICAgIC8vIEJlY2F1c2UgLnZlbnYgc2hvdWxkIGJlIGlnbm9yZWQgb24gcm9vdCBkaXJlY3RvcnlcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jaykge1xuICAgICAgbmFtZXMucHVzaCgncHl0aG9uJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC52ZW52L1xuYDtcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eikge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuYmxpdHovXG4uYmxpdHoqKlxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgbmFtZXMucHVzaCgnbmV4dGpzJyk7XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5maXJlYmFzZSB8fCBjb25maWcuZGVwZW5kaW5nLmZpcmViYXNlKSB7XG4gICAgICBuYW1lcy5wdXNoKCdmaXJlYmFzZScpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgKi5zcWxpdGUzKlxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgcGxheXdyaWdodC1yZXBvcnQvXG50ZXN0LXJlc3VsdHMvXG5gO1xuICAgIH1cbiAgICBpZiAocm9vdENvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUgfHwgY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgICAgbmFtZXMucHVzaCgncmVhY3RuYXRpdmUnKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgZ29vZ2xlLXNlcnZpY2VzLmpzb25cbmFuZHJvaWQvYXBwL3NyYy9tYWluL2Fzc2V0cy9cbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnN0b3J5Ym9vaykge1xuICAgICAgbmFtZXMucHVzaCgnc3Rvcnlib29ranMnKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubGl0ZXN0cmVhbSkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGBnY3Atc2Eta2V5Lmpzb25cbmA7XG4gICAgfVxuXG4gICAgbGV0IGdlbmVyYXRlZCA9ICcnO1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykge1xuICAgICAgbGV0IGNvbnRlbnQgPSAoYXdhaXQgcmVhZENhY2hlKG5hbWUpKSA/PyAnJztcbiAgICAgIGlmICghY29udGVudCkge1xuICAgICAgICBjb25zdCB1cmwgPSBgaHR0cHM6Ly93d3cudG9wdGFsLmNvbS9kZXZlbG9wZXJzL2dpdGlnbm9yZS9hcGkvJHtuYW1lfWA7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsKTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2VUZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgICBpZiAoIXJlc3BvbnNlLm9rIHx8IHJlc3BvbnNlVGV4dC5pbmNsdWRlcygnQXR0ZW50aW9uIFJlcXVpcmVkIScpIHx8IHJlc3BvbnNlVGV4dC5pbmNsdWRlcygnPHRpdGxlPicpKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGZldGNoICR7dXJsfWApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb250ZW50ID0gcmVzcG9uc2VUZXh0LnRyaW0oKTtcbiAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IHdyaXRlQ2FjaGUobmFtZSwgY29udGVudCkpO1xuICAgICAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oYEZldGNoZWQgJHt1cmx9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChnZW5lcmF0ZWQpIGdlbmVyYXRlZCArPSAnXFxuJztcbiAgICAgIGdlbmVyYXRlZCArPSBjb250ZW50ICsgJ1xcbic7XG4gICAgfVxuICAgIGlmICghKGF3YWl0IGlnbm9yZUZpbGVVdGlsLmlzQmVycnlaZXJvSW5zdGFsbEVuYWJsZWQoZmlsZVBhdGgpKSkge1xuICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2UoJyEueWFybi9jYWNoZScsICcjICEueWFybi9jYWNoZScpLnJlcGxhY2UoJyMgLnBucC4qJywgJy5wbnAuKicpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9tWG1sIHx8IGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWRcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvYXJ0aWZhY3RzJC9nbSwgJy5pZGVhL2FydGlmYWN0cycpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL2NvbXBpbGVyLnhtbCQvZ20sICcuaWRlYS9jb21waWxlci54bWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9qYXJSZXBvc2l0b3JpZXMueG1sJC9nbSwgJy5pZGVhL2phclJlcG9zaXRvcmllcy54bWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9tb2R1bGVzLnhtbCQvZ20sICcuaWRlYS9tb2R1bGVzLnhtbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcLyouaW1sJC9nbSwgJy5pZGVhLyouaW1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvbW9kdWxlcyQvZ20sICcuaWRlYS9tb2R1bGVzJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jICouaW1sJC9nbSwgJyouaW1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jICouaXByJC9nbSwgJyouaXByJyk7XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2VBbGwoL14uaWRlYVxcL21vZHVsZXMueG1sJC9nbSwgJyMgLmlkZWEvbW9kdWxlcy54bWwnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2VBbGwoL14uaWRlYVxcLz8kL2dtLCAnIyAuaWRlYScpO1xuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSB8fCBjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlIHx8IGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZUFsbCgvXiguaWRlYVxcLy4rKSQvZ20sICckMVxcbmFuZHJvaWQvJDEnKTtcbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGVudCA9IGhlYWRVc2VyQ29udGVudCArICdcXG4nICsgZ2VuZXJhdGVkICsgdGFpbFVzZXJDb250ZW50O1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5jb25zdCBkaXJQYXRoID0gcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5jYWNoZScsICd3YmZ5JywgJ2dpdGlnbm9yZScpO1xuXG5hc3luYyBmdW5jdGlvbiB3cml0ZUNhY2hlKG5hbWU6IHN0cmluZywgY29udGVudDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKGRpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpLCBjb250ZW50KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZENhY2hlKG5hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdCA9IGF3YWl0IGZzLnByb21pc2VzLnN0YXQocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpKTtcbiAgICBpZiAoRGF0ZS5ub3coKSAtIHN0YXQubXRpbWVNcyA+IDYgKiA2MCAqIDYwICogMTAwMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpLCAndXRmOCcpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZnVuY3Rpb24gY3JlYXRlVGFza09wdGlvbnMocnVubmVyOiBzdHJpbmcsIGFyZ3M6IHN0cmluZywgbmFtZTogc3RyaW5nLCBleHRlbnNpb246IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgICAgIDxUYXNrT3B0aW9ucyBpc0VuYWJsZWQ9XCJ0cnVlXCI+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJhcmd1bWVudHNcIiB2YWx1ZT1cIiR7YXJnc30gJEZpbGVQYXRoUmVsYXRpdmVUb1Byb2plY3RSb290JFwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJjaGVja1N5bnRheEVycm9yc1wiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiZGVzY3JpcHRpb25cIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiZXhpdENvZGVCZWhhdmlvclwiIHZhbHVlPVwiRVJST1JcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiZmlsZUV4dGVuc2lvblwiIHZhbHVlPVwiJHtleHRlbnNpb259XCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImltbWVkaWF0ZVN5bmNcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cIm5hbWVcIiB2YWx1ZT1cIiR7bmFtZX0gKC4ke2V4dGVuc2lvbn0pXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cIm91dHB1dFwiIHZhbHVlPVwiJEZpbGVQYXRoUmVsYXRpdmVUb1Byb2plY3RSb290JFwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJvdXRwdXRGaWx0ZXJzXCI+XG4gICAgICAgIDxhcnJheSAvPlxuICAgICAgPC9vcHRpb24+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJvdXRwdXRGcm9tU3Rkb3V0XCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJwcm9ncmFtXCIgdmFsdWU9XCIke3J1bm5lcn1cIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwicnVuT25FeHRlcm5hbENoYW5nZXNcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cInNjb3BlTmFtZVwiIHZhbHVlPVwiUHJvamVjdCBGaWxlc1wiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJ0cmFja09ubHlSb290XCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJ3b3JraW5nRGlyXCIgdmFsdWU9XCIkUHJvamVjdEZpbGVEaXIkXCIgLz5cbiAgICAgIDxlbnZzIC8+XG4gICAgPC9UYXNrT3B0aW9ucz5cbmA7XG59XG5cbmNvbnN0IHByZXR0aWVyQ29udGVudCA9IGA8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cbjxwcm9qZWN0IHZlcnNpb249XCI0XCI+XG4gIDxjb21wb25lbnQgbmFtZT1cIlByb2plY3RUYXNrc09wdGlvbnNcIj5cbiR7ZXh0ZW5zaW9ucy5wcmV0dGllci5tYXAoKGV4dCkgPT4gY3JlYXRlVGFza09wdGlvbnMoJ25vZGUnLCAnbm9kZV9tb2R1bGVzLy5iaW4vcHJldHRpZXIgLS1jYWNoZSAtLXdyaXRlJywgJ1ByZXR0aWVyJywgZXh0KSkuam9pbignJyl9XG4gIDwvY29tcG9uZW50PlxuPC9wcm9qZWN0PlxuYDtcblxuY29uc3QgYmlvbWVDb250ZW50ID0gYDw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuPHByb2plY3QgdmVyc2lvbj1cIjRcIj5cbiAgPGNvbXBvbmVudCBuYW1lPVwiUHJvamVjdFRhc2tzT3B0aW9uc1wiPlxuJHtleHRlbnNpb25zLnByZXR0aWVyLm1hcCgoZXh0KSA9PiBjcmVhdGVUYXNrT3B0aW9ucygnYnVuJywgJy0tYnVuIG5vZGVfbW9kdWxlcy8uYmluL2Jpb21lIGNoZWNrIC0tZml4IC0tbm8tZXJyb3JzLW9uLXVubWF0Y2hlZCAtLXNraXAtcGFyc2UtZXJyb3JzJywgJ0Jpb21lJywgZXh0KSkuam9pbignJyl9XG4gIDwvY29tcG9uZW50PlxuPC9wcm9qZWN0PlxuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlSWRlYVNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlSWRlYVNldHRpbmdzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuaWRlYScpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGRpclBhdGgpKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnd2F0Y2hlclRhc2tzLnhtbCcpO1xuICAgICAgYXdhaXQgKGNvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHQgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHRJblBhY2thZ2VzIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcyB8fFxuICAgICAgKGNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uICYmXG4gICAgICAgICFjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCAmJlxuICAgICAgICAhY29uZmlnLmRvZXNDb250YWluR2VtZmlsZSAmJlxuICAgICAgICAhY29uZmlnLmRvZXNDb250YWluR29Nb2QgJiZcbiAgICAgICAgIWNvbmZpZy5kb2VzQ29udGFpblBvbVhtbClcbiAgICAgICAgPyBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgY29uZmlnLmlzQnVuID8gYmlvbWVDb250ZW50IDogcHJldHRpZXJDb250ZW50KSlcbiAgICAgICAgOiBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSkpKTtcbiAgICB9XG4gIH0pO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBTcGF3blN5bmNPcHRpb25zIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3blN5bmMoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcsIHJldHJ5ID0gMCk6IHZvaWQge1xuICBzcGF3blN5bmNBbmRSZXR1cm5TdGF0dXMoY29tbWFuZCwgYXJncywgY3dkLCByZXRyeSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3blN5bmNBbmRSZXR1cm5TdGF0dXMoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcsIHJldHJ5ID0gMCk6IG51bWJlciB7XG4gIGxldCBzdGF0dXMgPSAxO1xuICBkbyB7XG4gICAgY29uc3QgW25ld0NtZCwgbmV3QXJncywgb3B0aW9uc10gPSBnZXRTcGF3blN5bmNBcmdzKGNvbW1hbmQsIGFyZ3MsIGN3ZCk7XG4gICAgY29uc29sZS5sb2coYCQgJHtuZXdDbWR9ICR7bmV3QXJncy5qb2luKCcgJyl9IGF0ICR7Y3dkfWApO1xuICAgIGNvbnN0IHJldCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKG5ld0NtZCwgbmV3QXJncywgb3B0aW9ucyk7XG4gICAgc3RhdHVzID0gcmV0LnN0YXR1cyA/PyAxO1xuICAgIGlmIChzdGF0dXMgPT09IDApIGJyZWFrO1xuICB9IHdoaWxlICgtLXJldHJ5ID49IDApO1xuICByZXR1cm4gc3RhdHVzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgW25ld0NtZCwgbmV3QXJncywgb3B0aW9uc10gPSBnZXRTcGF3blN5bmNBcmdzKGNvbW1hbmQsIGFyZ3MsIGN3ZCk7XG4gIG9wdGlvbnMuc3RkaW8gPSAncGlwZSc7XG4gIGNvbnN0IHByb2MgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnMpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvbiAtLSBzcGF3blN5bmMgcmV0dXJucyBudWxsIHN0ZGVyciBvbiBFTk9FTlQuXG4gIGNvbnN0IHN0ZGVyciA9IHByb2Muc3RkZXJyID8/ICcnO1xuICBjb25zdCBlcnJvciA9IHR5cGVvZiBzdGRlcnIgPT09ICdzdHJpbmcnID8gc3RkZXJyLnRyaW0oKSA6IHN0ZGVyci50b1N0cmluZygpLnRyaW0oKTtcbiAgaWYgKHByb2MuZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKGAke25ld0NtZH0gWyR7bmV3QXJncy5tYXAoKHMpID0+IGBcIiR7c31cImApLmpvaW4oJywgJyl9XSBmYWlsZWQgd2l0aDogJHtwcm9jLmVycm9yLm1lc3NhZ2V9YCk7XG4gIH0gZWxzZSBpZiAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgYCR7bmV3Q21kfSBbJHtuZXdBcmdzLm1hcCgocykgPT4gYFwiJHtzfVwiYCkuam9pbignLCAnKX1dIG91dHB1dHMgdGhlIGZvbGxvd2luZyBjb250ZW50IHRvIHN0ZGVycjpcXG4ke2Vycm9yfWBcbiAgICApO1xuICB9XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uIC0tIHNwYXduU3luYyByZXR1cm5zIG51bGwgc3Rkb3V0IG9uIEVOT0VOVC5cbiAgY29uc3Qgc3Rkb3V0ID0gcHJvYy5zdGRvdXQgPz8gJyc7XG4gIHJldHVybiB0eXBlb2Ygc3Rkb3V0ID09PSAnc3RyaW5nJyA/IHN0ZG91dC50cmltKCkgOiBzdGRvdXQudG9TdHJpbmcoKS50cmltKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTcGF3blN5bmNBcmdzKGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nKTogW3N0cmluZywgc3RyaW5nW10sIFNwYXduU3luY09wdGlvbnNdIHtcbiAgY29uc3QgZW52ID0geyAuLi5wcm9jZXNzLmVudiB9O1xuICAvLyBSZW1vdmUgYmVycnkgZnJvbSBQQVRIXG4gIGlmIChlbnYuUEFUSCAmJiBlbnYuQkVSUllfQklOX0ZPTERFUikge1xuICAgIGVudi5QQVRIID0gZW52LlBBVEgucmVwbGFjZShgJHtlbnYuQkVSUllfQklOX0ZPTERFUn06YCwgJycpO1xuICB9XG5cbiAgcmV0dXJuIFtcbiAgICBjb21tYW5kLFxuICAgIGFyZ3MsXG4gICAge1xuICAgICAgY3dkLFxuICAgICAgZW52LFxuICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICAgIHNoZWxsOiBmYWxzZSxcbiAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgfSxcbiAgXTtcbn1cbiIsImltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgY29uc3QgRXNsaW50VXRpbCA9IHtcbiAgZ2V0TGludEZpeFN1ZmZpeChjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICAgIHJldHVybiBjb25maWcuZG9lc0NvbnRhaW5Kc3hPclRzeCA/ICcgLS1ydWxlIFwieyByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHM6IDAgfVwiJyA6ICcnO1xuICB9LFxufTtcbiIsImltcG9ydCB7IE9jdG9raXQgfSBmcm9tICdAb2N0b2tpdC9jb3JlJztcblxuY2xhc3MgR2l0SHViVXRpbCB7XG4gIGdldE9yZ0FuZE5hbWUodXJsT3JGdWxsTmFtZTogc3RyaW5nKTogW3N0cmluZywgc3RyaW5nXSB7XG4gICAgY29uc3QgdXJsV2l0aG91dFByb3RvY29sID0gdXJsT3JGdWxsTmFtZS5zcGxpdCgnOicpLmF0KC0xKTtcbiAgICBjb25zdCBuYW1lcyA9IHVybFdpdGhvdXRQcm90b2NvbD8uc3BsaXQoJy8nKTtcbiAgICBjb25zdCBvcmcgPSBuYW1lcz8uYXQoLTIpID8/ICcnO1xuICAgIGNvbnN0IG5hbWUgPSBuYW1lcz8uYXQoLTEpPy5yZXBsYWNlKC8uZ2l0JC8sICcnKSA/PyAnJztcbiAgICByZXR1cm4gW29yZywgbmFtZV07XG4gIH1cbn1cbmV4cG9ydCBjb25zdCBnaXRIdWJVdGlsID0gbmV3IEdpdEh1YlV0aWwoKTtcblxuY29uc3Qgb2N0b2tpdENhY2hlID0gbmV3IE1hcDxzdHJpbmcsIE9jdG9raXQ+KCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRPY3Rva2l0KG93bmVyPzogc3RyaW5nKTogT2N0b2tpdCB7XG4gIGNvbnN0IGtleSA9IG93bmVyID8/ICcnO1xuICBjb25zdCBjYWNoZWQgPSBvY3Rva2l0Q2FjaGUuZ2V0KGtleSk7XG4gIGlmIChjYWNoZWQpIHJldHVybiBjYWNoZWQ7XG5cbiAgY29uc3Qgb2N0b2tpdCA9IG5ldyBPY3Rva2l0KHtcbiAgICBhdXRoOiBnZXRHaXRIdWJUb2tlbihvd25lcikgfHwgdW5kZWZpbmVkLFxuICB9KTtcbiAgb2N0b2tpdENhY2hlLnNldChrZXksIG9jdG9raXQpO1xuICByZXR1cm4gb2N0b2tpdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc0dpdEh1YlRva2VuKG93bmVyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhZ2V0R2l0SHViVG9rZW4ob3duZXIpO1xufVxuXG5mdW5jdGlvbiBnZXRHaXRIdWJUb2tlbihvd25lcj86IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChvd25lciA9PT0gJ1dpbGxCb29zdGVyJykge1xuICAgIHJldHVybiBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUjtcbiAgfVxuICBpZiAob3duZXIgPT09ICdXaWxsQm9vc3RlckxhYicpIHtcbiAgICByZXR1cm4gcHJvY2Vzcy5lbnYuR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVJMQUI7XG4gIH1cbiAgcmV0dXJuIChcbiAgICBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUiB8fFxuICAgIHByb2Nlc3MuZW52LkdIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSTEFCIHx8XG4gICAgcHJvY2Vzcy5lbnYuR0hfVE9LRU4gfHxcbiAgICBwcm9jZXNzLmVudi5HSVRIVUJfVE9LRU5cbiAgKTtcbn1cbiIsImltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5jb25zdCBFU0xJTlRfQ09ORklHX1BSRUZJWCA9ICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy0nO1xuY29uc3QgcGlubmVkRGVwZW5kZW5jeVNwZWNpZmllcnMgPSB7XG4gICdAZXNsaW50L2pzJzogJ145LjM5LjQnLFxuICBlc2xpbnQ6ICdeOS4zOS40JyxcbiAgdHlwZXNjcmlwdDogJ141LjkuMycsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgZnVuY3Rpb24gc2hvdWxkU2tpcFdpbGxib29zdGVyQ29uZmlnc0VzbGludFBhY2thZ2UoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIHJldHVybiBjb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3MgJiYgY29uZmlnLnBhY2thZ2VKc29uPy5uYW1lPy5zdGFydHNXaXRoKEVTTElOVF9DT05GSUdfUFJFRklYKSA9PT0gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFBpbm5lZERlcGVuZGVuY3lTcGVjaWZpZXIoZGVwZW5kZW5jeTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocGlubmVkRGVwZW5kZW5jeVNwZWNpZmllcnMpKSB7XG4gICAgaWYgKGtleSA9PT0gZGVwZW5kZW5jeSkge1xuICAgICAgcmV0dXJuIGAke2tleX1AJHt2YWx1ZX1gO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiwgU2V0UmVxdWlyZWQgfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBnZXRMYXRlc3RDb21taXRIYXNoIH0gZnJvbSAnLi4vZ2l0aHViL2NvbW1pdC5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBFc2xpbnRFeHRlbnNpb25CYXNlLCBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBFc2xpbnRVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZXNsaW50VXRpbC5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBnaXRIdWJVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5pbXBvcnQgeyBnbG9iSWdub3JlIH0gZnJvbSAnLi4vdXRpbHMvZ2xvYlV0aWwuanMnO1xuaW1wb3J0IHsgaWdub3JlRmlsZVV0aWwgfSBmcm9tICcuLi91dGlscy9pZ25vcmVGaWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBjb21iaW5lTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuaW1wb3J0IHsgZ2V0VHNjb25maWdCYXNlRGVwZW5kZW5jaWVzIH0gZnJvbSAnLi4vdXRpbHMvdHNjb25maWdCYXNlLmpzJztcbmltcG9ydCB7IGdldFBpbm5lZERlcGVuZGVuY3lTcGVjaWZpZXIgfSBmcm9tICcuLi91dGlscy93aWxsYm9vc3RlckNvbmZpZ3NVdGlsLmpzJztcblxuY29uc3QganNDb21tb25EZXBzID0gW1xuICAnQGVzbGludC9qcycsXG4gICdlc2xpbnQnLFxuICAnZXNsaW50LWNvbmZpZy1mbGF0LWdpdGlnbm9yZScsXG4gICdlc2xpbnQtY29uZmlnLXByZXR0aWVyJyxcbiAgJ2VzbGludC1wbHVnaW4taW1wb3J0LXgnLFxuICAnZXNsaW50LXBsdWdpbi1zb3J0LWNsYXNzLW1lbWJlcnMnLFxuICAnZXNsaW50LXBsdWdpbi1zb3J0LWRlc3RydWN0dXJlLWtleXMnLFxuICAnZXNsaW50LXBsdWdpbi11bmljb3JuJyxcbiAgJ2VzbGludC1wbHVnaW4tdW51c2VkLWltcG9ydHMnLFxuICAnZ2xvYmFscycsXG5dO1xuXG5jb25zdCB0c0NvbW1vbkRlcHMgPSBbLi4uanNDb21tb25EZXBzLCAndHlwZXNjcmlwdC1lc2xpbnQnLCAnZXNsaW50LWltcG9ydC1yZXNvbHZlci10eXBlc2NyaXB0J107XG5cbmNvbnN0IHJlYWN0Q29tbW9uRGVwcyA9IFsnZXNsaW50LXBsdWdpbi1yZWFjdCcsICdlc2xpbnQtcGx1Z2luLXJlYWN0LWhvb2tzJywgJ2VzbGludC1wbHVnaW4tcmVhY3QtY29tcGlsZXInXTtcblxuY29uc3QgZXNsaW50RGVwczogUmVjb3JkPEVzbGludEV4dGVuc2lvbkJhc2UsIHN0cmluZ1tdPiA9IHtcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzJzogWydAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcycsIC4uLmpzQ29tbW9uRGVwc10sXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcy1yZWFjdCc6IFsnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMtcmVhY3QnLCAuLi5qc0NvbW1vbkRlcHMsIC4uLnJlYWN0Q29tbW9uRGVwc10sXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cyc6IFsnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMnLCAuLi50c0NvbW1vbkRlcHNdLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMtcmVhY3QnOiBbJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzLXJlYWN0JywgLi4udHNDb21tb25EZXBzLCAuLi5yZWFjdENvbW1vbkRlcHNdLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctbmV4dCc6IFtcbiAgICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctbmV4dCcsXG4gICAgJ0BuZXh0L2VzbGludC1wbHVnaW4tbmV4dCcsXG4gICAgLi4udHNDb21tb25EZXBzLFxuICAgIC4uLnJlYWN0Q29tbW9uRGVwcyxcbiAgXSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVBhY2thZ2VKc29uKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHNraXBBZGRpbmdEZXBzOiBib29sZWFuXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVBhY2thZ2VKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IGNvcmUoY29uZmlnLCByb290Q29uZmlnLCBza2lwQWRkaW5nRGVwcyk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZywgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZywgc2tpcEFkZGluZ0RlcHM6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgY29uc3QganNvblRleHQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgY29uc3QganNvbk9iaiA9IEpTT04ucGFyc2UoanNvblRleHQpIGFzIFBhY2thZ2VKc29uO1xuICBqc29uT2JqLnNjcmlwdHMgPSBqc29uT2JqLnNjcmlwdHMgPz8ge307XG4gIGpzb25PYmouZGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXBlbmRlbmNpZXMgPz8ge307XG4gIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gIGpzb25PYmoucGVlckRlcGVuZGVuY2llcyA9IGpzb25PYmoucGVlckRlcGVuZGVuY2llcyA/PyB7fTtcbiAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSBjb25maWcuaXNCdW4gPyAnYnVuJyA6ICd5YXJuJztcblxuICBhd2FpdCByZW1vdmVEZXByZWNhdGVkU3R1ZmYoanNvbk9iaiBhcyBTZXRSZXF1aXJlZDxQYWNrYWdlSnNvbiwgJ3NjcmlwdHMnIHwgJ2RlcGVuZGVuY2llcycgfCAnZGV2RGVwZW5kZW5jaWVzJz4pO1xuXG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGpzb25PYmouc2NyaXB0cyBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSkge1xuICAgIC8vIEZyZXNoIHJlcG8gc3RpbGwgcmVxdWlyZXMgJ3lhcm4gaW5zdGFsbCdcbiAgICBpZiAoIXZhbHVlLmluY2x1ZGVzKCdnaXQgY2xvbmUnKSkge1xuICAgICAganNvbk9iai5zY3JpcHRzW2tleV0gPSB2YWx1ZS5yZXBsYWNlKC95YXJuXFxzKiYmXFxzKi8sICcnKS5yZXBsYWNlKC95YXJuXFxzKmluc3RhbGxcXHMqJiZcXHMqLywgJycpO1xuICAgIH1cbiAgfVxuXG4gIGpzb25PYmouc2NyaXB0cyA9IG1lcmdlKGpzb25PYmouc2NyaXB0cywgZ2VuZXJhdGVTY3JpcHRzKGNvbmZpZywganNvbk9iai5zY3JpcHRzKSk7XG4gIGFkZFN0YXJ0VGVzdFNlcnZlclNjcmlwdElmTmVlZGVkKGNvbmZpZywganNvbk9iaik7XG5cbiAgaWYgKCdjaGVjay1mb3ItYWknIGluIGpzb25PYmouc2NyaXB0cykge1xuICAgIGlmICgnZ2VuLWNvZGUnIGluIGpzb25PYmouc2NyaXB0cykge1xuICAgICAganNvbk9iai5zY3JpcHRzWydjaGVjay1mb3ItYWknXSA9IGAke3BhY2thZ2VNYW5hZ2VyfSBnZW4tY29kZSA+IC9kZXYvbnVsbCAmJiAke2pzb25PYmouc2NyaXB0c1snY2hlY2stZm9yLWFpJ119YDtcbiAgICB9XG4gICAganNvbk9iai5zY3JpcHRzWydjaGVjay1mb3ItYWknXSA9IGAke3BhY2thZ2VNYW5hZ2VyfSBpbnN0YWxsID4gL2Rldi9udWxsICYmICR7anNvbk9iai5zY3JpcHRzWydjaGVjay1mb3ItYWknXX1gO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucHJldHRpZnk7XG4gIH0gZWxzZSB7XG4gICAganNvbk9iai5zY3JpcHRzLnByZXR0aWZ5ID0gKGpzb25PYmouc2NyaXB0cy5wcmV0dGlmeSA/PyAnJykgKyAoYXdhaXQgZ2VuZXJhdGVQcmV0dGllclN1ZmZpeChjb25maWcuZGlyUGF0aCkpO1xuICB9XG4gIC8vIERlYWwgd2l0aCBicmVha2luZyBjaGFuZ2VzIGluIHlhcm4gYmVycnkgNC4wLjAtcmMuNDlcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoanNvbk9iai5zY3JpcHRzKSkge1xuICAgIGlmICghdmFsdWU/LmluY2x1ZGVzKCd5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCcpKSBjb250aW51ZTtcbiAgICBpZiAoXG4gICAgICB2YWx1ZS5pbmNsdWRlcygnLS1hbGwnKSB8fFxuICAgICAgdmFsdWUuaW5jbHVkZXMoJy0tcmVjdXJzaXZlJykgfHxcbiAgICAgIHZhbHVlLmluY2x1ZGVzKCctLXNpbmNlJykgfHxcbiAgICAgIHZhbHVlLmluY2x1ZGVzKCctLXdvcmt0cmVlJylcbiAgICApXG4gICAgICBjb250aW51ZTtcbiAgICBqc29uT2JqLnNjcmlwdHNba2V5XSA9IHZhbHVlLnJlcGxhY2UoJ3lhcm4gd29ya3NwYWNlcyBmb3JlYWNoJywgJ3lhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsJyk7XG4gIH1cblxuICBsZXQgZGVwZW5kZW5jaWVzOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgZGV2RGVwZW5kZW5jaWVzID0gWydwcmV0dGllcicsICdzb3J0LXBhY2thZ2UtanNvbiddO1xuICBjb25zdCBwb2V0cnlEZXZEZXBlbmRlbmNpZXM6IHN0cmluZ1tdID0gW107XG5cbiAgaWYgKFxuICAgICFmcy5leGlzdHNTeW5jKHBhdGguam9pbihyb290Q29uZmlnLmRpclBhdGgsICcucHJldHRpZXJyYy5qc29uJykpICYmXG4gICAgIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAnLnByZXR0aWVycmMuanNvbicpKVxuICApIHtcbiAgICBqc29uT2JqLnByZXR0aWVyID0gJ0B3aWxsYm9vc3Rlci9wcmV0dGllci1jb25maWcnO1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdwcmV0dGllci1wbHVnaW4tamF2YScsICdAd2lsbGJvb3N0ZXIvcHJldHRpZXItY29uZmlnJyk7XG4gIH1cblxuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ2xpbnQtc3RhZ2VkJ107XG4gIGRlbGV0ZSAoanNvbk9iaiBhcyBQYWNrYWdlSnNvbiAmIHsgJ2xpbnQtc3RhZ2VkJz86IHVua25vd24gfSlbJ2xpbnQtc3RhZ2VkJ107XG5cbiAgaWYgKGNvbmZpZy5pc1Jvb3QpIHtcbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXMuaHVza3k7XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLnBpbnN0O1xuICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucG9zdGluc3RhbGw7XG4gICAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5wb3N0cHVibGlzaDtcbiAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLnByZXB1Ymxpc2hPbmx5O1xuICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucHJlcGFjaztcbiAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLnBvc3RwYWNrO1xuICAgIGpzb25PYmouc2NyaXB0cy5wcmVwYXJlID0gJ2xlZnRob29rIGluc3RhbGwgfHwgdHJ1ZSc7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ2xlZnRob29rJyk7XG5cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5zZW1hbnRpY1JlbGVhc2UpIHtcbiAgICAgIGlmIChcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydzZW1hbnRpYy1yZWxlYXNlJ10gJiZcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydtdWx0aS1zZW1hbnRpYy1yZWxlYXNlJ10gJiZcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAcWl3aS9tdWx0aS1zZW1hbnRpYy1yZWxlYXNlJ11cbiAgICAgICkge1xuICAgICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnc2VtYW50aWMtcmVsZWFzZScpO1xuICAgICAgfVxuICAgICAganNvbk9iai52ZXJzaW9uID0gJzAuMC4wLXNlbWFudGljYWxseS1yZWxlYXNlZCc7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpIHtcbiAgICAgIC8vIFNpbmNlIGFydGlsbGVyeSByZXF1aXJlcyBhIHNwZWNpZmljIHZlcnNpb24gb2YgQHBsYXl3cmlnaHQvdGVzdFxuICAgICAgY29uc3QgaGFzQXJ0aWxsZXJ5ID0ganNvbk9iai5kZXBlbmRlbmNpZXMuYXJ0aWxsZXJ5IHx8IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLmFydGlsbGVyeTtcbiAgICAgIC8vIFNpbmNlIGxsbS10b29sYm94IHJlcXVpcmVzIEBwbGF5d3JpZ2h0L3Rlc3QgaW4gZGVwZW5kZW5jaWVzXG4gICAgICBpZiAoIWhhc0FydGlsbGVyeSAmJiAhanNvbk9iai5kZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXSkge1xuICAgICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnQHBsYXl3cmlnaHQvdGVzdCcpO1xuICAgICAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXTtcbiAgICAgIH1cbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llcy5wbGF5d3JpZ2h0O1xuICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQ7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucykge1xuICAgICAgLy8gV2UgZG9uJ3QgYWxsb3cgbm9uLWFycmF5IHdvcmtzcGFjZXMgaW4gbW9ub3JlcG8uXG4gICAgICBqc29uT2JqLndvcmtzcGFjZXMgPSBBcnJheS5pc0FycmF5KGpzb25PYmoud29ya3NwYWNlcylcbiAgICAgICAgPyBtZXJnZS5hbGwoW2pzb25PYmoud29ya3NwYWNlcywgWydwYWNrYWdlcy8qJ11dLCB7XG4gICAgICAgICAgICBhcnJheU1lcmdlOiBjb21iaW5lTWVyZ2UsXG4gICAgICAgICAgfSlcbiAgICAgICAgOiBbJ3BhY2thZ2VzLyonXTtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoanNvbk9iai53b3Jrc3BhY2VzKSkge1xuICAgICAganNvbk9iai53b3Jrc3BhY2VzID0ganNvbk9iai53b3Jrc3BhY2VzLmZpbHRlcihcbiAgICAgICAgKHdvcmtzcGFjZSkgPT5cbiAgICAgICAgICBmZy5nbG9iU3luYyh3b3Jrc3BhY2UsIHtcbiAgICAgICAgICAgIGRvdDogdHJ1ZSxcbiAgICAgICAgICAgIGN3ZDogY29uZmlnLmRpclBhdGgsXG4gICAgICAgICAgICBpZ25vcmU6IGdsb2JJZ25vcmUsXG4gICAgICAgICAgfSkubGVuZ3RoID4gMFxuICAgICAgKTtcbiAgICAgIGlmIChqc29uT2JqLndvcmtzcGFjZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLndvcmtzcGFjZXM7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcud2IgfHwgY29uZmlnLmlzQnVuKSB7XG4gICAgaWYgKGpzb25PYmouZGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvd2InXSkge1xuICAgICAgZGVwZW5kZW5jaWVzLnB1c2goJ0B3aWxsYm9vc3Rlci93YicpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnQHdpbGxib29zdGVyL3diJyk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGpzb25PYmouc2NyaXB0cyBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSkge1xuICAgICAganNvbk9iai5zY3JpcHRzW2tleV0gPSB2YWx1ZS5yZXBsYWNlKC93YlxccytkYi8sICd3YiBwcmlzbWEnKTtcbiAgICB9XG4gIH1cblxuICBpZiAoXG4gICAgY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdCB8fFxuICAgIGNvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHRJblBhY2thZ2VzIHx8XG4gICAgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fFxuICAgIGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzXG4gICkge1xuICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAYmlvbWVqcy9iaW9tZScsICdAd2lsbGJvb3N0ZXIvYmlvbWUtY29uZmlnJyk7XG4gICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXMuZXNsaW50O1xuICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLm1pY3JvbWF0Y2g7XG4gICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ3R5cGVzY3JpcHQtZXNsaW50J107XG4gICAgfSBlbHNlIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdlc2xpbnQnLCAnbWljcm9tYXRjaCcpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChcbiAgICBjb25maWcuZG9lc0NvbnRhaW5KYXZhU2NyaXB0IHx8XG4gICAgY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdEluUGFja2FnZXMgfHxcbiAgICBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8XG4gICAgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXNcbiAgKSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goLi4uZ2V0VHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKGNvbmZpZykpO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXMpIHtcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgndHlwZXNjcmlwdCcpO1xuICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAdHlwZXMvYnVuJyk7XG4gICAgfSBlbHNlIGlmICghY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0B0eXBlcy9ub2RlJyk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGpzb25PYmouZGVwZW5kZW5jaWVzLmplc3QgfHxcbiAgICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLmplc3QgfHxcbiAgICAgIGpzb25PYmouZGVwZW5kZW5jaWVzWydAamVzdC9nbG9iYWxzJ10gfHxcbiAgICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAamVzdC9nbG9iYWxzJ10gfHxcbiAgICAgIGpzb25PYmouZGVwZW5kZW5jaWVzWyd0cy1qZXN0J10gfHxcbiAgICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWyd0cy1qZXN0J11cbiAgICApIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAdHlwZXMvamVzdCcpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcuZXNsaW50QmFzZSkge1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKC4uLmVzbGludERlcHNbY29uZmlnLmVzbGludEJhc2VdKTtcbiAgfVxuXG4gIGlmIChjb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3MpIHtcbiAgICBkZXBlbmRlbmNpZXMgPSBkZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFkZXAuaW5jbHVkZXMoJ0B3aWxsYm9vc3Rlci8nKSk7XG4gICAgZGV2RGVwZW5kZW5jaWVzID0gZGV2RGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhZGVwLmluY2x1ZGVzKCdAd2lsbGJvb3N0ZXIvJykpO1xuICB9XG5cbiAgaWYgKCFqc29uT2JqLm5hbWUpIHtcbiAgICBqc29uT2JqLm5hbWUgPSBwYXRoLmJhc2VuYW1lKGNvbmZpZy5kaXJQYXRoKTtcbiAgfVxuXG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMpIHtcbiAgICBqc29uT2JqLnByaXZhdGUgPSB0cnVlO1xuICB9XG4gIGlmICghanNvbk9iai5saWNlbnNlKSB7XG4gICAganNvbk9iai5saWNlbnNlID0gJ1VOTElDRU5TRUQnO1xuICB9XG4gIGlmICghanNvbk9iai5wcml2YXRlICYmIGpzb25PYmoubGljZW5zZSAhPT0gJ1VOTElDRU5TRUQnICYmIHJvb3RDb25maWcuaXNQdWJsaWNSZXBvKSB7XG4gICAganNvbk9iai5wdWJsaXNoQ29uZmlnID8/PSB7fTtcbiAgICBqc29uT2JqLnB1Ymxpc2hDb25maWcuYWNjZXNzID8/PSAncHVibGljJztcbiAgfVxuICBjb25zdCBbb3duZXJdID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGNvbmZpZy5yZXBvc2l0b3J5ID8/ICcnKTtcbiAgaWYgKG93bmVyID09PSAnV2lsbEJvb3N0ZXInIHx8IG93bmVyID09PSAnV2lsbEJvb3N0ZXJMYWInKSB7XG4gICAganNvbk9iai5hdXRob3IgPSAnV2lsbEJvb3N0ZXIgSW5jLic7XG4gIH1cbiAgaWYgKCFjb25maWcuaXNSb290ICYmIGpzb25PYmoucHJpdmF0ZSAmJiAhanNvbk9iai5tYWluKSB7XG4gICAgLy8gTWFrZSBWU0NvZGUgcG9zc2libGUgdG8gcmVmYWN0b3IgY29kZSBhY3Jvc3Mgc3VicGFja2FnZXMuXG4gICAganNvbk9iai5tYWluID0gJy4vc3JjJztcbiAgfVxuXG4gIC8vIEJlY2F1c2UgYFwicmVzb2x1dGlvbnNcIjogeyBcIm5wbS9jaGFsa1wiOiBcIl40LjEuMlwiIH0sYCBjYXVzZXMgXCJJbnZhbGlkIG5wbSB0b2tlblwiXG4gIGRlbGV0ZSBqc29uT2JqLnJlc29sdXRpb25zPy5bJ25wbS9jaGFsayddO1xuXG4gIGlmICghY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zKSB7XG4gICAgaWYgKCFjb25maWcuaXNCdW4pIHtcbiAgICAgIGlmICghY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdCAmJiAhY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCkge1xuICAgICAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLmxpbnQ7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J107XG4gICAgICAgIGZvciAoY29uc3Qgc2NyaXB0TmFtZSBvZiBbJ2NsZWFudXAnLCAnY2hlY2stZm9yLWFpJ10pIHtcbiAgICAgICAgICBjb25zdCBzY3JpcHQgPSBqc29uT2JqLnNjcmlwdHNbc2NyaXB0TmFtZV07XG4gICAgICAgICAgaWYgKCFzY3JpcHQpIGNvbnRpbnVlO1xuICAgICAgICAgIGpzb25PYmouc2NyaXB0c1tzY3JpcHROYW1lXSA9IHNjcmlwdC5yZXBsYWNlKC8gPyYmID95YXJuIGxpbnQtZml4KD86IC0tcXVpZXQpPy8sICcnKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAganNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddID0gKGpzb25PYmouc2NyaXB0c1snbGludC1maXgnXSA/PyAnJykgKyBFc2xpbnRVdGlsLmdldExpbnRGaXhTdWZmaXgoY29uZmlnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgIGpzb25PYmouc2NyaXB0cy5saW50ID0gJ2ZsdXR0ZXIgYW5hbHl6ZSc7XG4gICAgICBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J10gPSAneWFybiBsaW50JztcbiAgICAgIGNvbnN0IGRpcnMgPSBbJ2xpYicsICd0ZXN0JywgJ3Rlc3RfZHJpdmVyJ10uZmlsdGVyKChkaXIpID0+IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBkaXIpKSk7XG4gICAgICBpZiAoZGlycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGpzb25PYmouc2NyaXB0c1snZm9ybWF0LWNvZGUnXSA9IGBkYXJ0IGZvcm1hdCAkKGZpbmQgJHtkaXJzLmpvaW4oXG4gICAgICAgICAgJyAnXG4gICAgICAgICl9IC1uYW1lIGdlbmVyYXRlZCAtcHJ1bmUgLW8gLW5hbWUgJyouZnJlZXplZC5kYXJ0JyAtcHJ1bmUgLW8gLW5hbWUgJyouZy5kYXJ0JyAtcHJ1bmUgLW8gLW5hbWUgJyouZGFydCcgLXByaW50KWA7XG4gICAgICAgIGpzb25PYmouc2NyaXB0cy5mb3JtYXQgPSAoanNvbk9iai5zY3JpcHRzLmZvcm1hdCA/PyAnJykgKyBgICYmIHlhcm4gZm9ybWF0LWNvZGVgO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrKSB7XG4gICAgICBpZiAoanNvbk9iai5zY3JpcHRzLnBvc3RpbnN0YWxsID09PSAncG9ldHJ5IGluc3RhbGwnKSB7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucG9zdGluc3RhbGw7XG4gICAgICB9XG4gICAgICBjb25zdCBweXRob25GaWxlcyA9IGF3YWl0IGZnLmdsb2IoJyoqLyoucHknLCB7XG4gICAgICAgIGN3ZDogY29uZmlnLmRpclBhdGgsXG4gICAgICAgIGRvdDogdHJ1ZSxcbiAgICAgICAgaWdub3JlOiBnbG9iSWdub3JlLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBkaXJOYW1lU2V0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICBmb3IgKGNvbnN0IHB5dGhvbkZpbGUgb2YgcHl0aG9uRmlsZXMpIHtcbiAgICAgICAgY29uc3QgW2ZpcnN0LCBzZWNvbmRdID0gcHl0aG9uRmlsZS5zcGxpdCgvWy9cXFxcXS8pO1xuICAgICAgICBpZiAoZmlyc3QgJiYgc2Vjb25kKSB7XG4gICAgICAgICAgZGlyTmFtZVNldC5hZGQoZmlyc3QpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZGlyTmFtZVNldC5zaXplID4gMCkge1xuICAgICAgICBjb25zdCBkaXJOYW1lc1N0ciA9IFsuLi5kaXJOYW1lU2V0XS5qb2luKCcgJyk7XG4gICAgICAgIGpzb25PYmouc2NyaXB0c1snZm9ybWF0LWNvZGUnXSA9XG4gICAgICAgICAgYHBvZXRyeSBydW4gaXNvcnQgLS1wcm9maWxlIGJsYWNrICR7ZGlyTmFtZXNTdHJ9ICYmIHBvZXRyeSBydW4gYmxhY2sgJHtkaXJOYW1lc1N0cn1gO1xuICAgICAgICBpZiAoanNvbk9iai5zY3JpcHRzLmxpbnQpIHtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHMubGludCA9IGBwb2V0cnkgcnVuIGZsYWtlOCAke2Rpck5hbWVzU3RyfSAmJiAke2pzb25PYmouc2NyaXB0cy5saW50fWA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAganNvbk9iai5zY3JpcHRzLmxpbnQgPSBgcG9ldHJ5IHJ1biBmbGFrZTggJHtkaXJOYW1lc1N0cn1gO1xuICAgICAgICAgIGpzb25PYmouc2NyaXB0c1snbGludC1maXgnXSA9ICd5YXJuIGxpbnQnO1xuICAgICAgICB9XG4gICAgICAgIGpzb25PYmouc2NyaXB0cy5mb3JtYXQgPSAoanNvbk9iai5zY3JpcHRzLmZvcm1hdCA/PyAnJykgKyBgICYmIHlhcm4gZm9ybWF0LWNvZGVgO1xuICAgICAgICBwb2V0cnlEZXZEZXBlbmRlbmNpZXMucHVzaCgnYmxhY2snLCAnaXNvcnQnLCAnZmxha2U4Jyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5yZXBvc2l0b3J5IHx8IGpzb25PYmoucmVwb3NpdG9yeSkge1xuICAgIGpzb25PYmoucmVwb3NpdG9yeSA9IGZvcm1hdFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbihjb25maWcucmVwb3NpdG9yeSA/PyBqc29uT2JqLnJlcG9zaXRvcnksIGpzb25PYmoucmVwb3NpdG9yeSk7XG4gIH1cblxuICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eikge1xuICAgIGlmICghanNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddPy5zdGFydHNXaXRoKCdibGl0eiBjb2RlZ2VuJykpIHtcbiAgICAgIGpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXSA9ICdibGl0eiBjb2RlZ2VuJztcbiAgICB9IGVsc2UgaWYgKCFqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10uaW5jbHVkZXMoJ2JsaXR6IHByaXNtYSBnZW5lcmF0ZScpKSB7XG4gICAgICBqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10gPSBqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10ucmVwbGFjZShcbiAgICAgICAgJ2JsaXR6IGNvZGVnZW4nLFxuICAgICAgICAnYmxpdHogY29kZWdlbiAmJiBibGl0eiBwcmlzbWEgZ2VuZXJhdGUnXG4gICAgICApO1xuICAgIH1cbiAgfSBlbHNlIGlmIChjb25maWcuZGVwZW5kaW5nLnByaXNtYSAmJiAhanNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddPy5zdGFydHNXaXRoKCdwcmlzbWEgZ2VuZXJhdGUnKSkge1xuICAgIGpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXSA9ICdwcmlzbWEgZ2VuZXJhdGUnO1xuICB9XG5cbiAgaWYgKCFqc29uT2JqLmRlcGVuZGVuY2llcy5wcmV0dGllcikge1xuICAgIC8vIEJlY2F1c2UgQHR5cGVzL3ByZXR0aWVyIGJsb2NrcyBwcmV0dGllciBleGVjdXRpb24uXG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAdHlwZXMvcHJldHRpZXInXTtcbiAgfVxuXG4gIGlmIChPYmplY3Qua2V5cyhqc29uT2JqLmRlcGVuZGVuY2llcykubGVuZ3RoID09PSAwKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzO1xuICB9XG4gIGlmIChPYmplY3Qua2V5cyhqc29uT2JqLmRldkRlcGVuZGVuY2llcykubGVuZ3RoID09PSAwKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzO1xuICB9XG4gIGlmIChPYmplY3Qua2V5cyhqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgIGRlbGV0ZSBqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXM7XG4gIH1cblxuICBhd2FpdCB1cGRhdGVQcml2YXRlUGFja2FnZXMoanNvbk9iaik7XG5cbiAgaWYgKGNvbmZpZy5pc0J1bikgZGVsZXRlIGpzb25PYmoucGFja2FnZU1hbmFnZXI7XG4gIGxldCBuZXdKc29uVGV4dCA9IEpTT04uc3RyaW5naWZ5KGpzb25PYmopO1xuICBuZXdKc29uVGV4dCA9IGF3YWl0IGZpeFNjcmlwdE5hbWVzKGpzb25PYmouc2NyaXB0cywgbmV3SnNvblRleHQsIGNvbmZpZyk7XG4gIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShmaWxlUGF0aCwgYCR7bmV3SnNvblRleHR9XFxuYCk7XG5cbiAgaWYgKCFza2lwQWRkaW5nRGVwcykge1xuICAgIC8vIFdlIGNhbm5vdCBhZGQgZGVwZW5kZW5jaWVzIHdoaWNoIGFyZSBhbHJlYWR5IGluY2x1ZGVkIGluIGRldkRlcGVuZGVuY2llcy5cbiAgICBkZXBlbmRlbmNpZXMgPSBkZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFqc29uT2JqLmRldkRlcGVuZGVuY2llcz8uW2RlcF0pO1xuICAgIGlmIChkZXBlbmRlbmNpZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgdW5pcXVlRGVwZW5kZW5jaWVzID0gWy4uLm5ldyBTZXQoZGVwZW5kZW5jaWVzKV07XG4gICAgICBjb25zdCBkZXBlbmRlbmN5U3BlY2lmaWVycyA9IHVuaXF1ZURlcGVuZGVuY2llcy5tYXAoKGRlcGVuZGVuY3kpID0+IGdldERlcGVuZGVuY3lTcGVjaWZpZXIoZGVwZW5kZW5jeSkpO1xuICAgICAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgICAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsncmVtb3ZlJywgLi4udW5pcXVlRGVwZW5kZW5jaWVzXSwgY29uZmlnLmRpclBhdGgpO1xuICAgICAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnYWRkJywgJy0tZXhhY3QnLCAuLi5kZXBlbmRlbmN5U3BlY2lmaWVyc10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEludGVudGlvbmFsbHkgb21pdCB2ZXJzaW9ucyB0byB1cGRhdGUgZGVwZW5kZW5jaWVzIHRvIHRoZSBsYXRlc3QgdmVyc2lvbnMgd2l0aCBZYXJuLlxuICAgICAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnYWRkJywgLi4uZGVwZW5kZW5jeVNwZWNpZmllcnNdLCBjb25maWcuZGlyUGF0aCk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIFdlIGNhbm5vdCBhZGQgZGV2RGVwZW5kZW5jaWVzIHdoaWNoIGFyZSBhbHJlYWR5IGluY2x1ZGVkIGluIGRlcGVuZGVuY2llcy5cbiAgICBkZXZEZXBlbmRlbmNpZXMgPSBkZXZEZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFqc29uT2JqLmRlcGVuZGVuY2llcz8uW2RlcF0pO1xuICAgIGlmIChkZXZEZXBlbmRlbmNpZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgdW5pcXVlRGV2RGVwZW5kZW5jaWVzID0gWy4uLm5ldyBTZXQoZGV2RGVwZW5kZW5jaWVzKV07XG4gICAgICBjb25zdCBkZXZEZXBlbmRlbmN5U3BlY2lmaWVycyA9IHVuaXF1ZURldkRlcGVuZGVuY2llcy5tYXAoKGRlcGVuZGVuY3kpID0+IGdldERlcGVuZGVuY3lTcGVjaWZpZXIoZGVwZW5kZW5jeSkpO1xuICAgICAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgICAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsncmVtb3ZlJywgLi4udW5pcXVlRGV2RGVwZW5kZW5jaWVzXSwgY29uZmlnLmRpclBhdGgpO1xuICAgICAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnYWRkJywgJy1EJywgJy0tZXhhY3QnLCAuLi5kZXZEZXBlbmRlbmN5U3BlY2lmaWVyc10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEludGVudGlvbmFsbHkgb21pdCB2ZXJzaW9ucyB0byB1cGRhdGUgZGVwZW5kZW5jaWVzIHRvIHRoZSBsYXRlc3QgdmVyc2lvbnMgd2l0aCBZYXJuLlxuICAgICAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnYWRkJywgJy1EJywgLi4uZGV2RGVwZW5kZW5jeVNwZWNpZmllcnNdLCBjb25maWcuZGlyUGF0aCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChwb2V0cnlEZXZEZXBlbmRlbmNpZXMubGVuZ3RoID4gMCkge1xuICAgICAgc3Bhd25TeW5jKCdwb2V0cnknLCBbJ2FkZCcsICctLWdyb3VwJywgJ2RldicsIC4uLm5ldyBTZXQocG9ldHJ5RGV2RGVwZW5kZW5jaWVzKV0sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICB9XG4gIH1cbn1cblxuLy8gVE9ETzogcmVtb3ZlIHRoZSBmb2xsb3dpbmcgbWlncmF0aW9uIGNvZGUgaW4gZnV0dXJlXG5hc3luYyBmdW5jdGlvbiByZW1vdmVEZXByZWNhdGVkU3R1ZmYoXG4gIGpzb25PYmo6IFNldFJlcXVpcmVkPFBhY2thZ2VKc29uLCAnc2NyaXB0cycgfCAnZGVwZW5kZW5jaWVzJyB8ICdkZXZEZXBlbmRlbmNpZXMnPlxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChqc29uT2JqLmF1dGhvciA9PT0gJ1dpbGxCb29zdGVyIExMQycpIHtcbiAgICBqc29uT2JqLmF1dGhvciA9ICdXaWxsQm9vc3RlciBJbmMuJztcbiAgfVxuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydzb3J0LXBhY2thZ2UtanNvbiddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydzb3J0LWFsbC1wYWNrYWdlLWpzb24nXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sndHlwZWNoZWNrL3dhcm4nXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sndHlwZWNoZWNrOmdlbi1jb2RlJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3R5cGVjaGVjazpjb2RlZ2VuJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llcy50c2xpYjtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZyddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXJlYWN0J107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3Jlbm92YXRlLWNvbmZpZyddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci90c2NvbmZpZyddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ2VzbGludC1pbXBvcnQtcmVzb2x2ZXItbm9kZSddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ2VzbGludC1wbHVnaW4tcHJldHRpZXInXTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLmxlcm5hO1xuICAvLyBUbyBpbnN0YWxsIHRoZSBsYXRlc3QgcGluc3RcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLnBpbnN0O1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydmbHV0dGVyLWZvcm1hdCddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydmb3JtYXQtZmx1dHRlciddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydweXRob24tZm9ybWF0J107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2Zvcm1hdC1weXRob24nXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5wcmV0dGllcjtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snY2hlY2stYWxsJ107XG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybSgnbGVybmEuanNvbicsIHsgZm9yY2U6IHRydWUgfSkpO1xuXG4gIC8vIE1pZ3JhdGUgZnJvbSBFU0xpbnQgbGVnYWN5IGNvbmZpZ3MgdG8gZmxhdCBjb25maWdzLFxuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B0eXBlc2NyaXB0LWVzbGludC9lc2xpbnQtcGx1Z2luJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHR5cGVzY3JpcHQtZXNsaW50L3BhcnNlciddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ2VzbGludC1wbHVnaW4taW1wb3J0J107XG59XG5cbmZ1bmN0aW9uIGdldERlcGVuZGVuY3lTcGVjaWZpZXIoZGVwZW5kZW5jeTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGdldFBpbm5lZERlcGVuZGVuY3lTcGVjaWZpZXIoZGVwZW5kZW5jeSkgPz8gZGVwZW5kZW5jeTtcbn1cblxuZnVuY3Rpb24gYWRkU3RhcnRUZXN0U2VydmVyU2NyaXB0SWZOZWVkZWQoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBqc29uT2JqOiBQYWNrYWdlSnNvbik6IHZvaWQge1xuICBpZiAoIWNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QgfHwgIWNvbmZpZy5kZXBlbmRpbmcud2IgfHwganNvbk9iai5zY3JpcHRzPy5bJ3N0YXJ0LXRlc3Qtc2VydmVyJ10pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBqc29uT2JqLnNjcmlwdHMgPz89IHt9O1xuICBqc29uT2JqLnNjcmlwdHNbJ3N0YXJ0LXRlc3Qtc2VydmVyJ10gPSAnd2Igc3RhcnQgLS1tb2RlIHRlc3QnO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24oXG4gIHJlcG9zaXRvcnk6IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J10sXG4gIGV4aXN0aW5nUmVwb3NpdG9yeT86IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J11cbik6IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J10ge1xuICBjb25zdCBub3JtYWxpemVkUmVwb3NpdG9yeSA9IG5vcm1hbGl6ZVJlcG9zaXRvcnlVcmxGb3JQYWNrYWdlSnNvbihyZXBvc2l0b3J5KTtcbiAgaWYgKG5vcm1hbGl6ZWRSZXBvc2l0b3J5KSB7XG4gICAgcmV0dXJuIGJ1aWxkTm9ybWFsaXplZFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbihub3JtYWxpemVkUmVwb3NpdG9yeSwgcmVwb3NpdG9yeSwgZXhpc3RpbmdSZXBvc2l0b3J5KTtcbiAgfVxuXG4gIGNvbnN0IG5vcm1hbGl6ZWRFeGlzdGluZ1JlcG9zaXRvcnkgPSBub3JtYWxpemVSZXBvc2l0b3J5VXJsRm9yUGFja2FnZUpzb24oZXhpc3RpbmdSZXBvc2l0b3J5KTtcbiAgaWYgKG5vcm1hbGl6ZWRFeGlzdGluZ1JlcG9zaXRvcnkpIHtcbiAgICByZXR1cm4gYnVpbGROb3JtYWxpemVkUmVwb3NpdG9yeUZvclBhY2thZ2VKc29uKG5vcm1hbGl6ZWRFeGlzdGluZ1JlcG9zaXRvcnksIGV4aXN0aW5nUmVwb3NpdG9yeSk7XG4gIH1cblxuICByZXR1cm4gcmVwb3NpdG9yeTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplUmVwb3NpdG9yeVVybEZvclBhY2thZ2VKc29uKHJlcG9zaXRvcnk6IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J10pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAodHlwZW9mIHJlcG9zaXRvcnkgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKCFyZXBvc2l0b3J5LnN0YXJ0c1dpdGgoJ2dpdGh1YjonKSkgcmV0dXJuO1xuXG4gICAgY29uc3QgW293bmVyLCByZXBvXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShyZXBvc2l0b3J5KTtcbiAgICBpZiAoIW93bmVyIHx8ICFyZXBvKSByZXR1cm47XG4gICAgcmV0dXJuIGBnaXQraHR0cHM6Ly9naXRodWIuY29tLyR7b3duZXJ9LyR7cmVwb30uZ2l0YDtcbiAgfVxuXG4gIGNvbnN0IHJlcG9zaXRvcnlVcmwgPSByZXBvc2l0b3J5Py51cmw7XG4gIGlmICh0eXBlb2YgcmVwb3NpdG9yeVVybCAhPT0gJ3N0cmluZycpIHJldHVybjtcblxuICBjb25zdCBtYXRjaGVkID0gL14oPzpnaXRcXCspP2h0dHBzOlxcL1xcL2dpdGh1YlxcLmNvbVxcLyhbXi9dKylcXC8oW14vXSs/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+IH0ge1xuLy8gICByZXR1cm4gKFxuLy8gICAgIHR5cGVvZiBqc29uID09PSAnb2JqZWN0JyAmJlxuLy8gICAgIGpzb24gIT09IG51bGwgJiZcbi8vICAgICAnc2tpbGxzJyBpbiBqc29uICYmXG4vLyAgICAgdHlwZW9mIGpzb24uc2tpbGxzID09PSAnb2JqZWN0JyAmJlxuLy8gICAgIGpzb24uc2tpbGxzICE9PSBudWxsICYmXG4vLyAgICAgIUFycmF5LmlzQXJyYXkoanNvbi5za2lsbHMpXG4vLyAgICk7XG4vLyB9XG4iLCJpbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuY29uc3Qgc3JjRGlyZWN0b3JpZXMgPSB7XG4gIG5vZGU6IFsnc3JjJywgJ3Rlc3QnLCAnc2NyaXB0cyddLnRvU29ydGVkKCksXG4gIGJsaXR6OiBbJ3NyYycsICd0ZXN0JywgJ3NjcmlwdHMnLCAnZGInLCAnaW50ZWdyYXRpb25zJywgJ21haWxlcnMnXS50b1NvcnRlZCgpLFxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNyY0RpcnMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nW10ge1xuICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eikge1xuICAgIHJldHVybiBzcmNEaXJlY3Rvcmllcy5ibGl0ejtcbiAgfVxuICByZXR1cm4gc3JjRGlyZWN0b3JpZXMubm9kZTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IGNsb25lRGVlcCBmcm9tICdsb2Rhc2guY2xvbmVkZWVwJztcbmltcG9ydCB0eXBlIHsgVHNDb25maWdKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGNvbWJpbmVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBzb3J0S2V5cyB9IGZyb20gJy4uL3V0aWxzL29iamVjdFV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBnZXRTcmNEaXJzIH0gZnJvbSAnLi4vdXRpbHMvc3JjRGlyZWN0b3JpZXMuanMnO1xuaW1wb3J0IHsgZ2V0VHNjb25maWdFeHRlbmRzIH0gZnJvbSAnLi4vdXRpbHMvdHNjb25maWdCYXNlLmpzJztcblxuY29uc3Qgcm9vdEpzb25PYmogPSB7XG4gIGNvbXBpbGVyT3B0aW9uczoge1xuICAgIGFsd2F5c1N0cmljdDogdHJ1ZSxcbiAgICBub1VuY2hlY2tlZEluZGV4ZWRBY2Nlc3M6IHRydWUsIC8vIGZvciBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLW51bGxpc2gtY29hbGVzY2luZ1xuICAgIGFsbG93U3ludGhldGljRGVmYXVsdEltcG9ydHM6IHRydWUsIC8vIGFsbG93IGBpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnYFxuICAgIGVzTW9kdWxlSW50ZXJvcDogdHJ1ZSwgLy8gYWxsb3cgZGVmYXVsdCBpbXBvcnQgZnJvbSBDb21tb25KUy9BTUQvVU1EIG1vZHVsZXNcbiAgICByZXNvbHZlSnNvbk1vZHVsZTogdHJ1ZSwgLy8gYWxsb3cgdG8gaW1wb3J0IEpTT04gZmlsZXNcbiAgICBkZWNsYXJhdGlvbjogdHJ1ZSxcbiAgICBzb3VyY2VNYXA6IHRydWUsXG4gICAgaW1wb3J0SGVscGVyczogZmFsc2UsXG4gICAgbm9FbWl0OiBmYWxzZSxcbiAgICBvdXREaXI6ICdkaXN0JyxcbiAgfSxcbiAgZXhjbHVkZTogWydwYWNrYWdlcy8qL3Rlc3QvZml4dHVyZXMnLCAndGVzdC9maXh0dXJlcyddLFxuICBpbmNsdWRlOiBbXG4gICAgJ3BhY2thZ2VzLyovc2NyaXB0cy8qKi8qJyxcbiAgICAncGFja2FnZXMvKi9zcmMvKiovKicsXG4gICAgJ3BhY2thZ2VzLyovdGVzdC8qKi8qJyxcbiAgICAnc2NyaXB0cy8qKi8qJyxcbiAgICAnc3JjLyoqLyonLFxuICAgICd0ZXN0LyoqLyonLFxuICBdLFxufTtcblxuY29uc3Qgc3ViSnNvbk9iaiA9IHtcbiAgY29tcGlsZXJPcHRpb25zOiB7XG4gICAgYWx3YXlzU3RyaWN0OiB0cnVlLFxuICAgIG5vVW5jaGVja2VkSW5kZXhlZEFjY2VzczogdHJ1ZSwgLy8gZm9yIEB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItbnVsbGlzaC1jb2FsZXNjaW5nXG4gICAgYWxsb3dTeW50aGV0aWNEZWZhdWx0SW1wb3J0czogdHJ1ZSwgLy8gYWxsb3cgYGltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdgXG4gICAgZXNNb2R1bGVJbnRlcm9wOiB0cnVlLCAvLyBhbGxvdyBkZWZhdWx0IGltcG9ydCBmcm9tIENvbW1vbkpTL0FNRC9VTUQgbW9kdWxlc1xuICAgIHJlc29sdmVKc29uTW9kdWxlOiB0cnVlLCAvLyBhbGxvdyB0byBpbXBvcnQgSlNPTiBmaWxlc1xuICAgIGRlY2xhcmF0aW9uOiB0cnVlLFxuICAgIHNvdXJjZU1hcDogdHJ1ZSxcbiAgICBpbXBvcnRIZWxwZXJzOiBmYWxzZSxcbiAgICBub0VtaXQ6IGZhbHNlLFxuICAgIG91dERpcjogJ2Rpc3QnLFxuICB9LFxuICBleGNsdWRlOiBbJ3Rlc3QvZml4dHVyZXMnXSxcbiAgaW5jbHVkZTogWydzY3JpcHRzLyoqLyonLCAnc3JjLyoqLyonLCAndGVzdC8qKi8qJ10sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVUc2NvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVRzY29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6IHx8IGNvbmZpZy5kZXBlbmRpbmcubmV4dCkgcmV0dXJuO1xuXG4gICAgbGV0IG5ld1NldHRpbmdzID0gY2xvbmVEZWVwKGNvbmZpZy5pc1Jvb3QgPyByb290SnNvbk9iaiA6IHN1Ykpzb25PYmopIGFzIFRzQ29uZmlnSnNvbjtcbiAgICBjb25zdCBnZW5lcmF0ZWRSb290RGlyID0gZ2V0R2VuZXJhdGVkUm9vdERpcihjb25maWcpO1xuICAgIGNvbnN0IGdlbmVyYXRlZFR5cGVzID0gZ2V0R2VuZXJhdGVkVHlwZXMoY29uZmlnKTtcbiAgICBuZXdTZXR0aW5ncy5leHRlbmRzID0gZ2V0VHNjb25maWdFeHRlbmRzKGNvbmZpZyk7XG4gICAgaWYgKGdlbmVyYXRlZFJvb3REaXIpIHtcbiAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyA9IHsgLi4ubmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLCByb290RGlyOiBnZW5lcmF0ZWRSb290RGlyIH07XG4gICAgfVxuICAgIGlmIChnZW5lcmF0ZWRUeXBlcy5sZW5ndGggPiAwKSB7XG4gICAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMgPSB7IC4uLm5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucywgdHlwZXM6IGdlbmVyYXRlZFR5cGVzIH07XG4gICAgfVxuICAgIGlmICghY29uZmlnLmRvZXNDb250YWluSnN4T3JUc3ggJiYgIWNvbmZpZy5kb2VzQ29udGFpbkpzeE9yVHN4SW5QYWNrYWdlcykge1xuICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8uanN4O1xuICAgIH0gZWxzZSBpZiAoIWNvbmZpZy5pc0J1biAmJiAhY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zID0geyAuLi5uZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMsIGpzeDogJ3JlYWN0LWpzeCcgfTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5pc1Jvb3QgJiYgIWNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucykge1xuICAgICAgbmV3U2V0dGluZ3MuaW5jbHVkZSA9IG5ld1NldHRpbmdzLmluY2x1ZGU/LmZpbHRlcigoZGlyUGF0aDogc3RyaW5nKSA9PiAhZGlyUGF0aC5zdGFydHNXaXRoKCdwYWNrYWdlcy8qLycpKTtcbiAgICAgIG5ld1NldHRpbmdzLmV4Y2x1ZGUgPSBuZXdTZXR0aW5ncy5leGNsdWRlPy5maWx0ZXIoKGRpclBhdGg6IHN0cmluZykgPT4gIWRpclBhdGguc3RhcnRzV2l0aCgncGFja2FnZXMvKi8nKSk7XG4gICAgfVxuXG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICd0c2NvbmZpZy5qc29uJyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3Qgb2xkU2V0dGluZ3MgPSBKU09OLnBhcnNlKGV4aXN0aW5nQ29udGVudCkgYXMgVHNDb25maWdKc29uO1xuICAgICAgY29uc3QgZXhpc3RpbmdSb290RGlyID0gb2xkU2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5yb290RGlyO1xuICAgICAgY29uc3QgZXhpc3RpbmdUeXBlcyA9IG5vcm1hbGl6ZVN0cmluZ0FycmF5KG9sZFNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8udHlwZXMpO1xuICAgICAgbmV3U2V0dGluZ3MuZXh0ZW5kcyA9IG1lcmdlVHNjb25maWdFeHRlbmRzKG5ld1NldHRpbmdzLmV4dGVuZHMsIG9sZFNldHRpbmdzLmV4dGVuZHMpO1xuICAgICAgZGVsZXRlIG9sZFNldHRpbmdzLmV4dGVuZHM7XG4gICAgICBkZWxldGUgb2xkU2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5qc3g7XG4gICAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHsgYXJyYXlNZXJnZTogY29tYmluZU1lcmdlIH0pO1xuICAgICAgbmV3U2V0dGluZ3MuaW5jbHVkZSA9IG5ld1NldHRpbmdzLmluY2x1ZGU/LmZpbHRlcihcbiAgICAgICAgKGRpclBhdGg6IHN0cmluZykgPT5cbiAgICAgICAgICAhZGlyUGF0aC5pbmNsdWRlcygnQHR5cGVzJykgJiYgIWRpclBhdGguaW5jbHVkZXMoJ19fdGVzdHNfXy8nKSAmJiAhZGlyUGF0aC5pbmNsdWRlcygndGVzdHMvJylcbiAgICAgICk7XG4gICAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMgPz89IHt9O1xuICAgICAgaWYgKGV4aXN0aW5nUm9vdERpciAmJiAhc2hvdWxkUmVwbGFjZUV4aXN0aW5nUm9vdERpcihleGlzdGluZ1Jvb3REaXIsIGdlbmVyYXRlZFJvb3REaXIpKSB7XG4gICAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucy5yb290RGlyID0gZXhpc3RpbmdSb290RGlyO1xuICAgICAgfSBlbHNlIGlmIChnZW5lcmF0ZWRSb290RGlyKSB7XG4gICAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucy5yb290RGlyID0gZ2VuZXJhdGVkUm9vdERpcjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMucm9vdERpcjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbWVyZ2VkVHlwZXMgPSBbLi4ubmV3IFNldChbLi4uZXhpc3RpbmdUeXBlcywgLi4uZ2VuZXJhdGVkVHlwZXNdKV07XG4gICAgICBpZiAobWVyZ2VkVHlwZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMudHlwZXMgPSBtZXJnZWRUeXBlcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMudHlwZXM7XG4gICAgICB9XG4gICAgICBpZiAoc2hvdWxkRGVsZXRlVHlwZVJvb3RzKGdlbmVyYXRlZFR5cGVzKSkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLnR5cGVSb290cztcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gICAgc29ydEtleXMobmV3U2V0dGluZ3MpO1xuICAgIG5ld1NldHRpbmdzLmluY2x1ZGU/LnNvcnQoKTtcbiAgICAvLyBEb24ndCB1c2Ugb2xkIGRlY29yYXRvclxuICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmV4cGVyaW1lbnRhbERlY29yYXRvcnM7XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LnZlcmJhdGltTW9kdWxlU3ludGF4O1xuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBtZXJnZVRzY29uZmlnRXh0ZW5kcyhcbiAgZ2VuZXJhdGVkRXh0ZW5kczogVHNDb25maWdKc29uWydleHRlbmRzJ10sXG4gIGV4aXN0aW5nRXh0ZW5kczogVHNDb25maWdKc29uWydleHRlbmRzJ11cbik6IFRzQ29uZmlnSnNvblsnZXh0ZW5kcyddIHtcbiAgY29uc3QgbWVyZ2VkRXh0ZW5kcyA9IFsuLi5ub3JtYWxpemVFeHRlbmRzKGdlbmVyYXRlZEV4dGVuZHMpLCAuLi5ub3JtYWxpemVFeHRlbmRzKGV4aXN0aW5nRXh0ZW5kcyldO1xuICBjb25zdCB1bmlxdWVFeHRlbmRzID0gWy4uLm5ldyBTZXQobWVyZ2VkRXh0ZW5kcyldO1xuICBpZiAodW5pcXVlRXh0ZW5kcy5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmICh1bmlxdWVFeHRlbmRzLmxlbmd0aCA9PT0gMSkgcmV0dXJuIHVuaXF1ZUV4dGVuZHNbMF07XG4gIHJldHVybiB1bmlxdWVFeHRlbmRzO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVFeHRlbmRzKHZhbHVlOiBUc0NvbmZpZ0pzb25bJ2V4dGVuZHMnXSk6IHN0cmluZ1tdIHtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIFtdO1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVN0cmluZ0FycmF5KHZhbHVlOiB1bmtub3duKTogc3RyaW5nW10ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgcmV0dXJuIFt2YWx1ZV07XG4gIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiBbXTtcbiAgcmV0dXJuIHZhbHVlLmZpbHRlcigoaXRlbSk6IGl0ZW0gaXMgc3RyaW5nID0+IHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJyk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZERlbGV0ZVR5cGVSb290cyh0eXBlTmFtZXM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gIC8vIE9ubHkgZ2VuZXJhdGVkIHBhY2thZ2Utb3duZWQgdGVzdCB0eXBlcyBzaG91bGQgdHJpZ2dlciB0aGlzLiBVc2VyLWRlZmluZWQgc2xhc2gtYmFzZWRcbiAgLy8gZW50cmllcyBtYXkgaW50ZW50aW9uYWxseSByZWx5IG9uIGN1c3RvbSB0eXBlUm9vdHMgYW5kIHNob3VsZCBiZSBwcmVzZXJ2ZWQgYXMtaXMuXG4gIHJldHVybiB0eXBlTmFtZXMuc29tZSgodHlwZU5hbWUpID0+IHR5cGVOYW1lID09PSAnY3lwcmVzcycgfHwgdHlwZU5hbWUuaW5jbHVkZXMoJy8nKSk7XG59XG5cbmZ1bmN0aW9uIGdldEdlbmVyYXRlZFJvb3REaXIoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgcm9vdERpckNhbmRpZGF0ZXMgPSBnZXRSb290RGlyQ2FuZGlkYXRlcyhjb25maWcpO1xuICAvLyBLZWVwIHRlc3QgYW5kIHNjcmlwdHMgaW4gdGhpcyBsaXN0IHNvIG1peGVkIHRzY29uZmlncyBvbWl0IHJvb3REaXIgaW5zdGVhZCBvZlxuICAvLyBnZW5lcmF0aW5nIGEgc3JjLW9ubHkgcm9vdERpciB0aGF0IGNvbmZsaWN0cyB3aXRoIHRoZSBnZW5lcmF0ZWQgaW5jbHVkZSBnbG9icy5cbiAgY29uc3QgZXhpc3RpbmdJbmNsdWRlZERpcnMgPSBnZXRTcmNEaXJzKGNvbmZpZykuZmlsdGVyKChkaXJOYW1lKSA9PlxuICAgIGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBkaXJOYW1lKSlcbiAgKTtcbiAgY29uc3QgZXhpc3RpbmdSb290U291cmNlRGlycyA9IGV4aXN0aW5nSW5jbHVkZWREaXJzLmZpbHRlcigoZGlyTmFtZSkgPT4gcm9vdERpckNhbmRpZGF0ZXMuaW5jbHVkZXMoZGlyTmFtZSkpO1xuXG4gIC8vIFN1YnBhY2thZ2UgdHNjb25maWdzIGluaGVyaXQgcm9vdCBvcHRpb25zLCBzbyBhIG1vbm9yZXBvIHJvb3REaXIgd291bGQgc2hpZnRcbiAgLy8gZ2VuZXJhdGVkIHBhY2thZ2UgZGVjbGFyYXRpb25zIGludG8gbmVzdGVkIHBhdGhzIHN1Y2ggYXMgZGlzdC9zaGFyZWQvc2hhcmVkL3NyYy5cbiAgaWYgKGNvbmZpZy5pc1Jvb3QgJiYgY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGlmIChleGlzdGluZ0luY2x1ZGVkRGlycy5sZW5ndGggPT09IDEgJiYgZXhpc3RpbmdSb290U291cmNlRGlycy5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gYC4vJHtleGlzdGluZ1Jvb3RTb3VyY2VEaXJzWzBdfWA7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0Um9vdERpckNhbmRpZGF0ZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nW10ge1xuICByZXR1cm4gZ2V0U3JjRGlycyhjb25maWcpLmZpbHRlcigoZGlyTmFtZSkgPT4gZGlyTmFtZSAhPT0gJ3NjcmlwdHMnICYmIGRpck5hbWUgIT09ICd0ZXN0Jyk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFJlcGxhY2VFeGlzdGluZ1Jvb3REaXIoZXhpc3RpbmdSb290RGlyOiBzdHJpbmcsIGdlbmVyYXRlZFJvb3REaXI6IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICAvLyBNaXhlZCBzb3VyY2UvdGVzdCB0c2NvbmZpZ3MgbXVzdCBvbWl0IHJvb3REaXI7IG90aGVyd2lzZSBzcmMtb25seSByb290RGlyIGJyZWFrcyB0eXBlY2hlY2ssXG4gIC8vIHdoaWxlIFwiLlwiIGNoYW5nZXMgbGlicmFyeSBkZWNsYXJhdGlvbiBvdXRwdXQgZnJvbSBkaXN0LyouZC50cyB0byBkaXN0L3NyYy8qLmQudHMuXG4gIHJldHVybiBnZW5lcmF0ZWRSb290RGlyID09PSB1bmRlZmluZWQgfHwgKGV4aXN0aW5nUm9vdERpciA9PT0gJy4nICYmIGdlbmVyYXRlZFJvb3REaXIgIT09ICcuJyk7XG59XG5cbmZ1bmN0aW9uIGdldEdlbmVyYXRlZFR5cGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgdHlwZU5hbWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IGRlcGVuZGVuY2llcyA9IHtcbiAgICAuLi5jb25maWcucGFja2FnZUpzb24/LmRlcGVuZGVuY2llcyxcbiAgICAuLi5jb25maWcucGFja2FnZUpzb24/LmRldkRlcGVuZGVuY2llcyxcbiAgfTtcblxuICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgdHlwZU5hbWVzLmFkZCgnYnVuJyk7XG4gIH0gZWxzZSBpZiAoIWNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICB0eXBlTmFtZXMuYWRkKCdub2RlJyk7XG4gIH1cbiAgaWYgKFxuICAgIGRlcGVuZGVuY2llcy5qZXN0IHx8XG4gICAgZGVwZW5kZW5jaWVzWydAamVzdC9nbG9iYWxzJ10gfHxcbiAgICBkZXBlbmRlbmNpZXNbJ2plc3QtZW52aXJvbm1lbnQtanNkb20nXSB8fFxuICAgIGRlcGVuZGVuY2llc1sndHMtamVzdCddXG4gICkge1xuICAgIHR5cGVOYW1lcy5hZGQoJ2plc3QnKTtcbiAgfVxuICBpZiAoZGVwZW5kZW5jaWVzLnZpdGVzdCkge1xuICAgIHR5cGVOYW1lcy5hZGQoJ3ZpdGVzdC9nbG9iYWxzJyk7XG4gIH1cbiAgaWYgKGRlcGVuZGVuY2llcy5tb2NoYSkge1xuICAgIHR5cGVOYW1lcy5hZGQoJ21vY2hhJyk7XG4gIH1cbiAgaWYgKGRlcGVuZGVuY2llcy5jeXByZXNzKSB7XG4gICAgdHlwZU5hbWVzLmFkZCgnY3lwcmVzcycpO1xuICB9XG5cbiAgcmV0dXJuIFsuLi50eXBlTmFtZXNdO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBzb3J0S2V5cyB9IGZyb20gJy4uL3V0aWxzL29iamVjdFV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGV4Y2x1ZGVGaWxlUGF0dGVybnMgPSBbXG4gICcqKi8uZ2l0L29iamVjdHMvKionLFxuICAnKiovLmdpdC9zdWJ0cmVlLWNhY2hlLyoqJyxcbiAgJyoqL25vZGVfbW9kdWxlcy8qKicsXG4gICcqKi90bXAvKionLFxuICAnKiovdGVtcC8qKicsXG4gICcqKi9kaXN0LyoqJyxcbl07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVZzY29kZVNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlVnNjb2RlU2V0dGluZ3MnLCBhc3luYyAoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnZzY29kZScsICdzZXR0aW5ncy5qc29uJyk7XG4gICAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGxldCBzZXR0aW5ncyA9IEpTT04ucGFyc2UoZXhpc3RpbmdDb250ZW50KSBhcyBvYmplY3Q7XG4gICAgICBmb3IgKGNvbnN0IGV4Y2x1ZGVGaWxlUGF0dGVybiBvZiBleGNsdWRlRmlsZVBhdHRlcm5zKSB7XG4gICAgICAgIHNldHRpbmdzID0gbWVyZ2UuYWxsKFtzZXR0aW5ncywgZXhjbHVkZVNldHRpbmcoZXhjbHVkZUZpbGVQYXR0ZXJuKV0pO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2spIHtcbiAgICAgICAgc2V0dGluZ3MgPSBtZXJnZS5hbGwoW3NldHRpbmdzLCBleGNsdWRlU2V0dGluZygnKiovLnZlbnYvKionKV0pO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgICBzZXR0aW5ncyA9IG1lcmdlLmFsbChbc2V0dGluZ3MsIGV4Y2x1ZGVTZXR0aW5nKCcqKi8ubmV4dC8qKicpXSk7XG4gICAgICB9XG4gICAgICAvLyBMTE3jgavjgojjgot2aWJlIGNvZGluZ+OBp+OBr+OAgeiHquWLleODleOCqeODvOODnuODg+ODiOOChOOCs+ODvOODieOCouOCr+OCt+ODp+ODs+OCkueEoeWKueWMluOBmeOCi+OBk+OBqOOBp1xuICAgICAgLy8g55Sf5oiQ44GV44KM44Gf44Kz44O844OJ44Gu5YWD44Gu5b2i5byP44KS57at5oyB44Gn44GN44KLXG4gICAgICBpZiAoJ2VkaXRvci5jb2RlQWN0aW9uc09uU2F2ZScgaW4gc2V0dGluZ3MpIHtcbiAgICAgICAgZGVsZXRlIHNldHRpbmdzWydlZGl0b3IuY29kZUFjdGlvbnNPblNhdmUnXTtcbiAgICAgIH1cbiAgICAgIGlmICgnZWRpdG9yLmZvcm1hdE9uU2F2ZScgaW4gc2V0dGluZ3MpIHtcbiAgICAgICAgZGVsZXRlIHNldHRpbmdzWydlZGl0b3IuZm9ybWF0T25TYXZlJ107XG4gICAgICB9XG4gICAgICBzb3J0S2V5cyhzZXR0aW5ncyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MsIHVuZGVmaW5lZCwgMik7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGV4Y2x1ZGVTZXR0aW5nKGV4Y2x1ZGVGaWxlUGF0dGVybjogc3RyaW5nKTogb2JqZWN0IHtcbiAgcmV0dXJuIHtcbiAgICAnZmlsZXMud2F0Y2hlckV4Y2x1ZGUnOiB7XG4gICAgICBbZXhjbHVkZUZpbGVQYXR0ZXJuXTogdHJ1ZSxcbiAgICB9LFxuICB9O1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBDb25maWd1cmF0aW9uVmFsdWVNYXAgfSBmcm9tICdAeWFybnBrZy9jb3JlJztcbmltcG9ydCB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHNwYXduU3luYywgc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0IH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcblxudHlwZSBTZXR0aW5ncyA9IHtcbiAgZGVmYXVsdFNlbXZlclJhbmdlUHJlZml4OiBzdHJpbmc7XG4gIG5tTW9kZTogc3RyaW5nO1xuICBub2RlTGlua2VyOiBzdHJpbmc7XG4gIG5wbU1pbmltYWxBZ2VHYXRlPzogc3RyaW5nO1xuICBucG1QcmVhcHByb3ZlZFBhY2thZ2VzPzogc3RyaW5nW107XG4gIHBsdWdpbnM/OiBQbHVnaW5bXTtcbn0gJiBQYXJ0aWFsPENvbmZpZ3VyYXRpb25WYWx1ZU1hcD47XG5cbmludGVyZmFjZSBQbHVnaW4ge1xuICBjaGVja3N1bTogc3RyaW5nO1xuICBwYXRoOiBzdHJpbmc7XG4gIHNwZWM6IHN0cmluZztcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlWWFybnJjWW1sKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlWWFybnJjWW1sJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHlhcm5yY1ltbFBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcueWFybnJjLnltbCcpO1xuICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybSh5YXJucmNZbWxQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgICBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcueWFybicpLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSlcbiAgICAgICk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgICAgZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAneWFybi5sb2NrJyksIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50VmVyc2lvbiA9IHNwYXduU3luY0FuZFJldHVyblN0ZG91dCgneWFybicsIFsnLS12ZXJzaW9uJ10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICBjb25zdCBsYXRlc3RWZXJzaW9uID0gZ2V0TGF0ZXN0VmVyc2lvbignQHlhcm5wa2cvY2xpJywgY29uZmlnLmRpclBhdGgpO1xuICAgIGlmIChnZXRNYWpvck51bWJlcihjdXJyZW50VmVyc2lvbikgPD0gZ2V0TWFqb3JOdW1iZXIobGF0ZXN0VmVyc2lvbikgJiYgY3VycmVudFZlcnNpb24gIT09IGxhdGVzdFZlcnNpb24pIHtcbiAgICAgIHNwYXduU3luYygneWFybicsIFsnc2V0JywgJ3ZlcnNpb24nLCBsYXRlc3RWZXJzaW9uXSwgY29uZmlnLmRpclBhdGgsIDEpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlbGVhc2VzUGF0aCA9IHBhdGguam9pbihjb25maWcuZGlyUGF0aCwgJy55YXJuJywgJ3JlbGVhc2VzJyk7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIocmVsZWFzZXNQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcihyZWxlYXNlc1BhdGgpKSB7XG4gICAgICBpZiAoZmlsZS5zdGFydHNXaXRoKCd5YXJuLScpICYmICFmaWxlLnN0YXJ0c1dpdGgoYHlhcm4tJHtsYXRlc3RWZXJzaW9ufS5gKSkge1xuICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKHJlbGVhc2VzUGF0aCwgZmlsZSkpKTtcbiAgICAgICAgY29uc29sZS5sb2coJ1JlbW92ZWQnLCBwYXRoLmpvaW4ocmVsZWFzZXNQYXRoLCBmaWxlKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgeWFybnJjUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy55YXJucmMnKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oeWFybnJjUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSk7XG5cbiAgICBjb25zdCBzZXR0aW5ncyA9IHlhbWwubG9hZChhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZSh5YXJucmNZbWxQYXRoLCAndXRmOCcpKSBhcyBTZXR0aW5ncztcbiAgICBzZXR0aW5ncy5kZWZhdWx0U2VtdmVyUmFuZ2VQcmVmaXggPSAnJztcbiAgICBzZXR0aW5ncy5ub2RlTGlua2VyID0gJ25vZGUtbW9kdWxlcyc7XG4gICAgc2V0dGluZ3Mubm1Nb2RlID0gJ2hhcmRsaW5rcy1nbG9iYWwnO1xuICAgIHNldHRpbmdzLm5wbU1pbmltYWxBZ2VHYXRlID0gJzVkJztcbiAgICBzZXR0aW5ncy5ucG1QcmVhcHByb3ZlZFBhY2thZ2VzID0gW1xuICAgICAgLy8gV2UgYmVsaWV2ZSB3ZSBhcmUgc2FmZVxuICAgICAgJ0BleGVyY29kZS8qJyxcbiAgICAgICdAd2lsbGJvb3N0ZXIvKicsXG4gICAgICAvLyBUbyBkZWFsIHdpdGggQ1ZFIGxpa2UgaHR0cHM6Ly9uZXh0anMub3JnL2Jsb2cvQ1ZFLTIwMjUtNjY0NzhcbiAgICAgICduZXh0JyxcbiAgICAgICdAbmV4dC8qJyxcbiAgICAgICdyZWFjdCcsXG4gICAgICAncmVhY3QtZG9tJyxcbiAgICBdO1xuICAgIGRlbGV0ZSBzZXR0aW5ncy5jb21wcmVzc2lvbkxldmVsO1xuICAgIGlmIChzZXR0aW5ncy5pbmplY3RFbnZpcm9ubWVudEZpbGVzPy5sZW5ndGggPT09IDApIHtcbiAgICAgIGRlbGV0ZSBzZXR0aW5ncy5pbmplY3RFbnZpcm9ubWVudEZpbGVzO1xuICAgIH1cbiAgICAvLyBjZi4gaHR0cHM6Ly9naXRodWIuY29tL3lhcm5wa2cvYmVycnkvcHVsbC80Njk4XG4gICAgc2V0dGluZ3MuZW5hYmxlR2xvYmFsQ2FjaGUgPSB0cnVlO1xuICAgIGNvbnN0IG9yaWdpbmFsTGVuZ3RoID0gc2V0dGluZ3MucGx1Z2lucz8ubGVuZ3RoID8/IDA7XG4gICAgc2V0dGluZ3MucGx1Z2lucyA9IHNldHRpbmdzLnBsdWdpbnM/LmZpbHRlcigocCkgPT4gcC5wYXRoICE9PSAnLnlhcm4vcGx1Z2lucy91bmRlZmluZWQuY2pzJykgPz8gW107XG4gICAgaWYgKHNldHRpbmdzLnBsdWdpbnMubGVuZ3RoICE9PSBvcmlnaW5hbExlbmd0aCkge1xuICAgICAgY29uc3QgcGx1Z2luUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy55YXJucmMnLCAndW5kZWZpbmVkLmNqcycpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBsdWdpblBhdGgsIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgIH1cbiAgICBpZiAoc2V0dGluZ3MucGx1Z2lucy5sZW5ndGggPT09IDApIHtcbiAgICAgIGRlbGV0ZSBzZXR0aW5ncy5wbHVnaW5zO1xuICAgIH1cbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoeWFybnJjWW1sUGF0aCwgeWFtbC5kdW1wKHNldHRpbmdzLCB7IGxpbmVXaWR0aDogLTEgfSkpO1xuXG4gICAgc3Bhd25TeW5jKCd5YXJuJywgWydkbHgnLCAneWFybi1wbHVnaW4tYXV0by1pbnN0YWxsJ10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMYXRlc3RWZXJzaW9uKHBhY2thZ2VOYW1lOiBzdHJpbmcsIGRpclBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHZlcnNpb25zSnNvbiA9IHNwYXduU3luY0FuZFJldHVyblN0ZG91dCgnbnBtJywgWydzaG93JywgcGFja2FnZU5hbWUsICd2ZXJzaW9ucycsICctLWpzb24nXSwgZGlyUGF0aCk7XG4gIGNvbnN0IHZlcnNpb25zID0gSlNPTi5wYXJzZSh2ZXJzaW9uc0pzb24pIGFzIHN0cmluZ1tdO1xuICByZXR1cm4gdmVyc2lvbnMuYXQoLTEpIGFzIHN0cmluZztcbn1cbmZ1bmN0aW9uIGdldE1ham9yTnVtYmVyKHZlcnNpb246IHN0cmluZyk6IG51bWJlciB7XG4gIGNvbnN0IFttYWpvcl0gPSB2ZXJzaW9uLnNwbGl0KCcuJyk7XG4gIHJldHVybiBOdW1iZXIobWFqb3IpO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBPY3Rva2l0IH0gZnJvbSAnQG9jdG9raXQvY29yZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdldE9jdG9raXQsIGdpdEh1YlV0aWwsIGhhc0dpdEh1YlRva2VuIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cExhYmVscyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdzZXR1cExhYmVscycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBbb3duZXIsIHJlcG9dID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGNvbmZpZy5yZXBvc2l0b3J5ID8/ICcnKTtcbiAgICBpZiAoIW93bmVyIHx8ICFyZXBvKSByZXR1cm47XG4gICAgaWYgKG93bmVyICE9PSAnV2lsbEJvb3N0ZXInICYmIG93bmVyICE9PSAnV2lsbEJvb3N0ZXJMYWInKSByZXR1cm47XG4gICAgaWYgKCFoYXNHaXRIdWJUb2tlbihvd25lcikpIHJldHVybjtcblxuICAgIGNvbnN0IG9jdG9raXQgPSBnZXRPY3Rva2l0KG93bmVyKTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDE6IHgtZWFzeSA6aGVkZ2Vob2c6JywgJ0VERTlGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2QyOiBlYXN5IDpyYWJiaXQyOicsICdEREQ2RkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkMzogbWVkaXVtIDpveDonLCAnQzRCNUZEJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDQ6IGhhcmQgOnNxdWlkOicsICdBNzhCRkEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkNTogeC1oYXJkIDp3aGFsZTI6JywgJzhCNUNGNicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3AxOiBjcml0aWNhbCA6ZmlyZTo6ZmlyZTo6ZmlyZTonLCAnRUY0NDQ0Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncDI6IHVyZ2VudCA6ZmlyZTo6ZmlyZTonLCAnRjg3MTcxJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncDM6IGltcG9ydGFudCA6ZmlyZTonLCAnRkNBNUE1Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncDQ6IG5pY2UgdG8gaGF2ZSA6ZHJvcGxldDonLCAnRkVDQUNBJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogYmxpdHonLCAnNTMwMGJjJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogZmlyZWJhc2UnLCAnZmZjYTI4Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogcHJpc21hJywgJzBjMzQ0YicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IHJlYWN0JywgJzYxZGFmYicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IHN2ZWx0ZScsICdmZjNlMDAnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiBzZW1hbnRpYy1yZWxlYXNlJywgJzQ5NDk0OScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JlYWR5IDpyb2NrZXQ6JywgJzIyQzU1RScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JldmlldyByZXF1ZXN0ZWQgOm1hZzonLCAnRkJDQTA0Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmVsZWFzZWQgOmJvb2ttYXJrOicsICc2MzY2RjEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiAwLjVoIDpjbG9jazEyMzA6JywgJ0YzRjRGNicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDFoIDpjbG9jazE6JywgJ0U1RTdFQicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDJoIDpjbG9jazI6JywgJ0QxRDVEQicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDNoIDpjbG9jazM6JywgJzlDQTNBRicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDVoIDpjbG9jazU6JywgJzZCNzI4MCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDhoIDpjbG9jazg6JywgJzRCNTU2MycpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDEzaCA6Y2xvY2sxOicsICczNzQxNTEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBidWlsZCA6aGFtbWVyOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBjaG9yZSA6YnJvb206JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGNpIDpjb25zdHJ1Y3Rpb25fd29ya2VyOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBkb2NzIDptZW1vOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBmZWF0IDpzcGFya2xlczonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogZml4IDpidWc6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IHBlcmYgOnphcDonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogcmVmYWN0b3IgOnJlY3ljbGU6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IHN0eWxlIDpsaXBzdGljazonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogdGVzdCA6dGVzdF90dWJlOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdwcm9qZWN0JywgJzI0MjkyRicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2ZvY3VzZWQgOmRhcnQ6JywgJzIyQzU1RScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2dlbi1wci1hbGwgOnJvYm90OicsICcwMEI0RDgnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdnZW4tcHItY2xhdWRlIDpyb2JvdDonLCAnMDBCNEQ4Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZ2VuLXByLWNvZGV4IDpyb2JvdDonLCAnMDBCNEQ4Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZ2VuLXByLWdlbWluaSA6cm9ib3Q6JywgJzAwQjREOCcpO1xuXG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2J1ZycpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkb2N1bWVudGF0aW9uJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2R1cGxpY2F0ZScpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdlbmhhbmNlbWVudCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdnb29kIGZpcnN0IGlzc3VlJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2hlbHAgd2FudGVkJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2ludmFsaWQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncXVlc3Rpb24nKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnd29udGZpeCcpO1xuXG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JlYWR5Jyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JldmlldyByZXF1ZXN0ZWQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmVsZWFzZWQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnc2VtYW50aWMtcmVsZWFzZScpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdsbG0tcHIgOnJvYm90OicpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdhaS1wciA6cm9ib3Q6Jyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybignU2tpcCBzZXR1cExhYmVscyBkdWUgdG86JywgKGVycm9yIGFzIEVycm9yIHwgdW5kZWZpbmVkKT8uc3RhY2sgPz8gZXJyb3IpO1xuICAgIH1cbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNldHVwTGFiZWwob2N0b2tpdDogT2N0b2tpdCwgb3duZXI6IHN0cmluZywgcmVwbzogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIGNvbG9yOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICAvLyBJc3N1ZXMgcGVybWlzc2lvblxuICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vbGFiZWxzJywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgbmFtZSxcbiAgICAgIGNvbG9yLFxuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICAvLyBJc3N1ZXMgcGVybWlzc2lvblxuICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVscy97bmFtZX0nLCB7XG4gICAgICBvd25lcixcbiAgICAgIHJlcG8sXG4gICAgICBuYW1lLFxuICAgICAgY29sb3IsXG4gICAgfSk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZGVsZXRlTGFiZWwob2N0b2tpdDogT2N0b2tpdCwgb3duZXI6IHN0cmluZywgcmVwbzogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICAvLyBJc3N1ZXMgcGVybWlzc2lvblxuICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHMve25hbWV9Jywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgbmFtZSxcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG4iLCJpbXBvcnQgZG90ZW52IGZyb20gJ2RvdGVudic7XG5pbXBvcnQgc29kaXVtIGZyb20gJ2xpYnNvZGl1bS13cmFwcGVycyc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdldE9jdG9raXQsIGdpdEh1YlV0aWwsIGhhc0dpdEh1YlRva2VuIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmNvbnN0IERFUFJFQ0FURURfU0VDUkVUX05BTUVTID0gWydSRUFEWV9ESVNDT1JEX1dFQkhPT0tfVVJMJywgJ0dIX0JPVF9QQVQnLCAnUFVCTElDX0dIX0JPVF9QQVQnXTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwU2VjcmV0cyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdzZXR1cFNlY3JldHMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgW293bmVyLCByZXBvXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShjb25maWcucmVwb3NpdG9yeSA/PyAnJyk7XG4gICAgaWYgKCFvd25lciB8fCAhcmVwbyB8fCBvd25lciAhPT0gJ1dpbGxCb29zdGVyTGFiJykgcmV0dXJuO1xuICAgIGlmICghaGFzR2l0SHViVG9rZW4ob3duZXIpIHx8ICFvcHRpb25zLmRvZXNVcGxvYWRFbnZWYXJzKSByZXR1cm47XG5cbiAgICBjb25zdCBwYXJzZWQgPSBkb3RlbnYuY29uZmlnKCkucGFyc2VkID8/IHt9O1xuICAgIGlmIChPYmplY3Qua2V5cyhwYXJzZWQpLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2N0b2tpdCA9IGdldE9jdG9raXQob3duZXIpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGZvciAoY29uc3Qgc2VjcmV0TmFtZSBvZiBERVBSRUNBVEVEX1NFQ1JFVF9OQU1FUykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIFJlcXVpcmVzIFNlY3JldHMgcGVybWlzc2lvblxuICAgICAgICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3NlY3JldHMve3NlY3JldF9uYW1lfScsIHtcbiAgICAgICAgICAgIG93bmVyLFxuICAgICAgICAgICAgcmVwbyxcbiAgICAgICAgICAgIHNlY3JldF9uYW1lOiBzZWNyZXROYW1lLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gUmVxdWlyZXMgU2VjcmV0cyBwZXJtaXNzaW9uXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG9jdG9raXQucmVxdWVzdCgnR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3NlY3JldHMvcHVibGljLWtleScsIHtcbiAgICAgICAgb3duZXIsXG4gICAgICAgIHJlcG8sXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHsga2V5LCBrZXlfaWQ6IGtleUlkIH0gPSByZXNwb25zZS5kYXRhO1xuXG4gICAgICBhd2FpdCBzb2RpdW0ucmVhZHk7XG5cbiAgICAgIGZvciAoY29uc3QgW25hbWUsIHNlY3JldF0gb2YgT2JqZWN0LmVudHJpZXMocGFyc2VkKSkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgbmFtZSA9PT0gJ0dIX0JPVF9QQVQnIHx8XG4gICAgICAgICAgbmFtZSA9PT0gJ0dIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSJyB8fFxuICAgICAgICAgIG5hbWUgPT09ICdHSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUkxBQidcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb252ZXJ0IFNlY3JldCAmIEJhc2U2NCBrZXkgdG8gVWludDhBcnJheS5cbiAgICAgICAgY29uc3QgcmF3S2V5ID0gc29kaXVtLmZyb21fYmFzZTY0KGtleSwgc29kaXVtLmJhc2U2NF92YXJpYW50cy5PUklHSU5BTCk7XG4gICAgICAgIGNvbnN0IHJhd1NlYyA9IHNvZGl1bS5mcm9tX3N0cmluZyhzZWNyZXQpO1xuXG4gICAgICAgIC8vIEVuY3J5cHQgdGhlIHNlY3JldCB1c2luZyBMaWJTb2RpdW1cbiAgICAgICAgY29uc3QgZW5jQnl0ZXMgPSBzb2RpdW0uY3J5cHRvX2JveF9zZWFsKHJhd1NlYywgcmF3S2V5KTtcblxuICAgICAgICAvLyBDb252ZXJ0IGVuY3J5cHRlZCBVaW50OEFycmF5IHRvIEJhc2U2NFxuICAgICAgICBjb25zdCBlbmNCYXNlNjQgPSBzb2RpdW0udG9fYmFzZTY0KGVuY0J5dGVzLCBzb2RpdW0uYmFzZTY0X3ZhcmlhbnRzLk9SSUdJTkFMKTtcblxuICAgICAgICAvLyBSZXF1aXJlcyBTZWNyZXRzIHBlcm1pc3Npb25cbiAgICAgICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvc2VjcmV0cy97c2VjcmV0X25hbWV9Jywge1xuICAgICAgICAgIG93bmVyLFxuICAgICAgICAgIHJlcG8sXG4gICAgICAgICAgc2VjcmV0X25hbWU6IG5hbWUsXG4gICAgICAgICAgZW5jcnlwdGVkX3ZhbHVlOiBlbmNCYXNlNjQsXG4gICAgICAgICAga2V5X2lkOiBrZXlJZCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybignU2tpcCBzZXR1cFNlY3JldHMgZHVlIHRvOicsIChlcnJvciBhcyBFcnJvciB8IHVuZGVmaW5lZCk/LnN0YWNrID8/IGVycm9yKTtcbiAgICB9XG4gIH0pO1xufVxuIiwiaW1wb3J0IHsgd2l0aFJldHJ5IH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWInO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdldE9jdG9raXQsIGdpdEh1YlV0aWwsIGhhc0dpdEh1YlRva2VuIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cEdpdEh1YlNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBbb3duZXIsIHJlcG9dID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGNvbmZpZy5yZXBvc2l0b3J5ID8/ICcnKTtcbiAgaWYgKCFvd25lciB8fCAhcmVwbykgcmV0dXJuO1xuICBpZiAob3duZXIgIT09ICdXaWxsQm9vc3RlcicgJiYgb3duZXIgIT09ICdXaWxsQm9vc3RlckxhYicpIHJldHVybjtcbiAgaWYgKCFoYXNHaXRIdWJUb2tlbihvd25lcikpIHJldHVybjtcblxuICBjb25zdCBvY3Rva2l0ID0gZ2V0T2N0b2tpdChvd25lcik7XG5cbiAgLy8gQWRtaW5pc3RyYXRpb24gcGVybWlzc2lvblxuICBhd2FpdCB3aXRoUmV0cnkoKCkgPT5cbiAgICBvY3Rva2l0LnJlcXVlc3QoJ1BBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfScsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIGFsbG93X2F1dG9fbWVyZ2U6IHRydWUsXG4gICAgICBhbGxvd19tZXJnZV9jb21taXQ6IGZhbHNlLFxuICAgICAgYWxsb3dfc3F1YXNoX21lcmdlOiB0cnVlLFxuICAgICAgYWxsb3dfcmViYXNlX21lcmdlOiBmYWxzZSxcbiAgICAgIGFsbG93X3VwZGF0ZV9icmFuY2g6IHRydWUsXG4gICAgICBkZWxldGVfYnJhbmNoX29uX21lcmdlOiB0cnVlLFxuICAgICAgc3F1YXNoX21lcmdlX2NvbW1pdF90aXRsZTogJ1BSX1RJVExFJyxcbiAgICAgIHNxdWFzaF9tZXJnZV9jb21taXRfbWVzc2FnZTogJ0JMQU5LJyxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ1gtR2l0SHViLUFwaS1WZXJzaW9uJzogJzIwMjItMTEtMjgnLFxuICAgICAgfSxcbiAgICAgIC4uLihjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyLycpID8geyBhbGxvd19hdXRvX21lcmdlOiB0cnVlIH0gOiB7fSksXG4gICAgfSlcbiAgKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGRpc3RhbmNlIH0gZnJvbSAnZmFzdGVzdC1sZXZlbnNodGVpbic7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgcGFja2FnZU1hbmFnZXJSdW5QbGFjZWhvbGRlciA9ICdfX1BNX1JVTl9fJztcblxuY29uc3QgdGVtcGxhdGVzID0ge1xuICAncHVsbF9yZXF1ZXN0X3RlbXBsYXRlLm1kJzogYFxuQ2xvc2UgIzxJc3N1ZU51bWJlcj5cblxuIyMgU2VsZiBDaGVja1xuXG4tIFsgXSBJJ3ZlIGNvbmZpcm1lZCBcXGBBbGwgY2hlY2tzIGhhdmUgcGFzc2VkXFxgIG9uIHRoaXMgcGFnZS5cbiAgLSBQUiB0aXRsZSBmb2xsb3dzIFtBbmd1bGFyJ3MgY29tbWl0IG1lc3NhZ2UgZm9ybWF0XShodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2Jsb2IvbWFpbi9DT05UUklCVVRJTkcubWQjLWNvbW1pdC1tZXNzYWdlLWZvcm1hdCkuXG4gIC0gUFIgdGl0bGUgZG9lc24ndCBoYXZlIFxcYFdJUDpcXGAuXG4gIC0gVGhlIHRlc3QgY29tbWFuZCAoZS5nLiwgXFxgJHtwYWNrYWdlTWFuYWdlclJ1blBsYWNlaG9sZGVyfSB0ZXN0XFxgKSBwYXNzZWQuXG4gIC0gVGhlIGxpbnQgY29tbWFuZCAoZS5nLiwgXFxgJHtwYWNrYWdlTWFuYWdlclJ1blBsYWNlaG9sZGVyfSBsaW50XFxgKSBwYXNzZWQuXG4gIC0gWW91IG1heSBsZWF2ZSB0aGlzIGJveCB1bmNoZWNrZWQgZHVlIHRvIGxvbmcgd29ya2Zsb3dzLlxuLSBbIF0gSSd2ZSByZXZpZXdlZCBteSBjaGFuZ2VzIG9uIHRoZSBHaXRIdWIgZGlmZiB2aWV3LlxuLSBbIF0gSSd2ZSB3cml0dGVuIHRoZSBzdGVwcyB0byB0ZXN0IG15IGNoYW5nZXMuXG4tIFsgXSBJJ3ZlIGFkZGVkIHNjcmVlbnNob3RzIChpZiB0aGUgVUkgY2hhbmdlZCkuXG4gIC0gWW91IG1heSBsZWF2ZSB0aGlzIGJveCB1bmNoZWNrZWQgaWYgeW91IGRpZG4ndCBtb2RpZnkgdGhlIFVJLlxuXG48IS0tIFBsZWFzZSBhZGQgc2NyZWVuc2hvdHMgaWYgeW91IG1vZGlmeSB0aGUgVUkuXG58IEN1cnJlbnQgICAgICAgICAgICAgICAgICB8IEluIGNvbWluZyAgICAgICAgICAgICAgICB8XG58IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8XG58IDxpbWcgc3JjPVwiXCIgd2lkdGg9XCI0MDBcIj4gfCA8aW1nIHNyYz1cIlwiIHdpZHRoPVwiNDAwXCI+IHxcbi0tPlxuXG48IS0tIFBsZWFzZSBhZGQgc3RlcHMgdG8gdGVzdCB5b3VyIGNoYW5nZXMuXG4jIyBTdGVwcyB0byBUZXN0XG5cbjEuIE9wZW4gaHR0cDovL2xvY2FsaG9zdC1leGVyY29kZS53aWxsYm9vc3Rlci5uZXQ6MzAwMC9qYS1KUC9jb3Vyc2VzL19leGFtcGxlL2xlc3NvbnMvX2V4YW1wbGVfYV9wbHVzX2IvcHJvYmxlbXMvX2V4YW1wbGVfYV9wbHVzX2IgYWZ0ZXIgbG9naW4uXG4yLiBTZWxlY3QgdGhlIGxhbmd1YWdlIFxcYENcXGAuXG4zLiBXcml0ZSB0aGUgZm9sbG93aW5nIGNvZGU6XG4gICBcXGBcXGBcXGBjXG4gICAjaW5jbHVkZSA8c3RkaW8uaD5cblxuICAgaW50IG1haW4odm9pZCkge1xuICAgICBpbnQgYSwgYjtcblxuICAgICBzY2FuZihcIiVkICVkXCIsICZhLCAmYik7XG4gICAgIHByaW50ZihcIiVkXCIsIGEgKyBiKTtcbiAgICAgcmV0dXJuIDA7XG4gICB9XG4gICBcXGBcXGBcXGBcbjQuIFB1c2ggXFxgU3VibWl0XFxgIGJ1dHRvbi5cbjUuIC4uLlxuLS0+XG5gLnRyaW0oKSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcycsIGFzeW5jICgpID0+IHtcbiAgICBmb3IgKGNvbnN0IFtmaWxlTmFtZSwgbmV3Q29udGVudF0gb2YgT2JqZWN0LmVudHJpZXModGVtcGxhdGVzKSkge1xuICAgICAgY29uc3QgY29udGVudCA9IGFwcGx5UGFja2FnZU1hbmFnZXJUZW1wbGF0ZShuZXdDb250ZW50LCBjb25maWcpO1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aHViJywgZmlsZU5hbWUpO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSB7XG4gICAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgICAgaWYgKGRpc3RhbmNlKG9sZENvbnRlbnQsIGNvbnRlbnQpID4gY29udGVudC5sZW5ndGggLyAyKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb250ZW50KSk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gYXBwbHlQYWNrYWdlTWFuYWdlclRlbXBsYXRlKHRlbXBsYXRlOiBzdHJpbmcsIGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIGNvbnN0IHBhY2thZ2VNYW5hZ2VyQ29tbWFuZCA9IGNvbmZpZy5pc0J1biA/ICdidW4gcnVuJyA6ICd5YXJuJztcbiAgcmV0dXJuIHRlbXBsYXRlLnJlcGxhY2VBbGwocGFja2FnZU1hbmFnZXJSdW5QbGFjZWhvbGRlciwgcGFja2FnZU1hbmFnZXJDb21tYW5kKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBmc3AgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcbmltcG9ydCB7IHNpbXBsZUdpdCB9IGZyb20gJ3NpbXBsZS1naXQnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5pbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcblxuaW1wb3J0IHsgZ2V0T2N0b2tpdCwgZ2l0SHViVXRpbCB9IGZyb20gJy4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5pbXBvcnQgeyBnbG9iSWdub3JlIH0gZnJvbSAnLi91dGlscy9nbG9iVXRpbC5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFja2FnZUNvbmZpZyB7XG4gIGRpclBhdGg6IHN0cmluZztcbiAgZG9ja2VyZmlsZTogc3RyaW5nO1xuICBpc1Jvb3Q6IGJvb2xlYW47XG4gIGlzUHVibGljUmVwbzogYm9vbGVhbjtcbiAgaXNSZWZlcnJlZEJ5T3RoZXJSZXBvOiBib29sZWFuO1xuICByZXBvc2l0b3J5Pzogc3RyaW5nO1xuICByZXBvQXV0aG9yPzogc3RyaW5nO1xuICByZXBvTmFtZT86IHN0cmluZztcbiAgaXNXaWxsQm9vc3RlclJlcG86IGJvb2xlYW47XG4gIGlzQnVuOiBib29sZWFuO1xuICBpc0VzbVBhY2thZ2U6IGJvb2xlYW47XG4gIGlzV2lsbEJvb3N0ZXJDb25maWdzOiBib29sZWFuO1xuICAvLyBkZXBlbmRlbmN5IGluZm9ybWF0aW9uXG4gIGRvZXNDb250YWluU3ViUGFja2FnZUpzb25zOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkRvY2tlcmZpbGU6IGJvb2xlYW47XG4gIGRvZXNDb250YWluR2VtZmlsZTogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Hb01vZDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5QYWNrYWdlSnNvbjogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Qb2V0cnlMb2NrOiBib29sZWFuO1xuICBkb2VzQ29udGFpblBvbVhtbDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5QdWJzcGVjWWFtbDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5UZW1wbGF0ZVlhbWw6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVnNjb2RlU2V0dGluZ3NKc29uOiBib29sZWFuO1xuICAvLyBzb3VyY2UgY29kZSBmaWxlc1xuICBkb2VzQ29udGFpbkphdmFTY3JpcHQ6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVHlwZVNjcmlwdDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Kc3hPclRzeDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5KYXZhU2NyaXB0SW5QYWNrYWdlczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Kc3hPclRzeEluUGFja2FnZXM6IGJvb2xlYW47XG5cbiAgaGFzU3RhcnRUZXN0U2VydmVyOiBib29sZWFuO1xuXG4gIGRlcGVuZGluZzoge1xuICAgIGJsaXR6OiBib29sZWFuO1xuICAgIGZpcmViYXNlOiBib29sZWFuO1xuICAgIGdlbkkxOG5UczogYm9vbGVhbjtcbiAgICBsaXRlc3RyZWFtOiBib29sZWFuO1xuICAgIG5leHQ6IGJvb2xlYW47XG4gICAgcGxheXdyaWdodFRlc3Q6IGJvb2xlYW47XG4gICAgcHJpc21hOiBib29sZWFuO1xuICAgIHB5cmlnaHQ6IGJvb2xlYW47XG4gICAgcmVhY3Q6IGJvb2xlYW47XG4gICAgcmVhY3ROYXRpdmU6IGJvb2xlYW47XG4gICAgc2VtYW50aWNSZWxlYXNlOiBib29sZWFuO1xuICAgIHN0b3J5Ym9vazogYm9vbGVhbjtcbiAgICB3YjogYm9vbGVhbjtcbiAgfTtcbiAgcmVsZWFzZToge1xuICAgIGJyYW5jaGVzOiBzdHJpbmdbXTtcbiAgICBnaXRodWI6IGJvb2xlYW47XG4gICAgbnBtOiBib29sZWFuO1xuICB9O1xuICBlc2xpbnRCYXNlPzogRXNsaW50RXh0ZW5zaW9uQmFzZTtcbiAgaGFzVmVyc2lvblNldHRpbmdzOiBib29sZWFuO1xuICBwYWNrYWdlSnNvbj86IFBhY2thZ2VKc29uO1xuICB3YmZ5SnNvbj86IFdiZnlKc29uO1xufVxuXG50eXBlIFdiZnlKc29uID0gei5pbmZlcjx0eXBlb2Ygd2JmeUpzb25TY2hlbWE+O1xuXG5jb25zdCB3YmZ5SnNvblNjaGVtYSA9IHoub2JqZWN0KHtcbiAgdHlwb3M6IHpcbiAgICAub2JqZWN0KHtcbiAgICAgIGFsbDogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICAgIGRvYzogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICAgIHRzOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgICAgdGV4dDogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICB9KVxuICAgIC5vcHRpb25hbCgpLFxufSk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRQYWNrYWdlQ29uZmlnKFxuICBkaXJQYXRoOiBzdHJpbmcsXG4gIHJvb3RDb25maWc/OiBQYWNrYWdlQ29uZmlnXG4pOiBQcm9taXNlPFBhY2thZ2VDb25maWcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBkb2VzQ29udGFpblBhY2thZ2VKc29uID0gZnMuZXhpc3RzU3luYyhwYWNrYWdlSnNvblBhdGgpO1xuICAgIGxldCBkZXBlbmRlbmNpZXM6IFBhY2thZ2VKc29uWydkZXBlbmRlbmNpZXMnXSA9IHt9O1xuICAgIGxldCBkZXZEZXBlbmRlbmNpZXM6IFBhY2thZ2VKc29uWydkZXZEZXBlbmRlbmNpZXMnXSA9IHt9O1xuICAgIGxldCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24gPSB7fTtcbiAgICBsZXQgZXNtUGFja2FnZSA9IGZhbHNlO1xuICAgIGlmIChkb2VzQ29udGFpblBhY2thZ2VKc29uKSB7XG4gICAgICBjb25zdCBwYWNrYWdlSnNvblRleHQgPSBmcy5yZWFkRmlsZVN5bmMocGFja2FnZUpzb25QYXRoLCAndXRmOCcpO1xuICAgICAgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKHBhY2thZ2VKc29uVGV4dCkgYXMgUGFja2FnZUpzb247XG4gICAgICBkZXBlbmRlbmNpZXMgPSBwYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge307XG4gICAgICBkZXZEZXBlbmRlbmNpZXMgPSBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gICAgICBlc21QYWNrYWdlID0gcGFja2FnZUpzb24udHlwZSA9PT0gJ21vZHVsZSc7XG4gICAgfVxuXG4gICAgbGV0IHJlbGVhc2VCcmFuY2hlczogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgcmVsZWFzZVBsdWdpbnM6IHN0cmluZ1tdID0gW107XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlbGVhc2VyY0pzb25QYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICcucmVsZWFzZXJjLmpzb24nKTtcbiAgICAgIGNvbnN0IGpzb24gPSBKU09OLnBhcnNlKGF3YWl0IGZzcC5yZWFkRmlsZShyZWxlYXNlcmNKc29uUGF0aCwgJ3V0ZjgnKSkgYXNcbiAgICAgICAgfCB7XG4gICAgICAgICAgICBicmFuY2hlczogc3RyaW5nW107XG4gICAgICAgICAgICBwbHVnaW5zPzogc3RyaW5nW11bXTtcbiAgICAgICAgICB9XG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgcmVsZWFzZUJyYW5jaGVzID0ganNvbj8uYnJhbmNoZXMgPz8gW107XG4gICAgICByZWxlYXNlUGx1Z2lucyA9IGpzb24/LnBsdWdpbnM/LmZsYXQoKSA/PyBbXTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICBjb25zdCBpc1Jvb3QgPVxuICAgICAgcGF0aC5iYXNlbmFtZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy4uJykpICE9PSAncGFja2FnZXMnIHx8XG4gICAgICAhZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy4uJywgJy4uJywgJ3BhY2thZ2UuanNvbicpKTtcblxuICAgIGxldCByZXBvSW5mbzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgaWYgKGlzUm9vdCkge1xuICAgICAgcmVwb0luZm8gPSBhd2FpdCBmZXRjaFJlcG9JbmZvKGRpclBhdGgsIHBhY2thZ2VKc29uKTtcbiAgICB9XG5cbiAgICBsZXQgaGFzVmVyc2lvblNldHRpbmdzID0gaGFzVmVyc2lvblNldHRpbmdzRmlsZShkaXJQYXRoKTtcbiAgICBmb3IgKGNvbnN0IHByZWZpeCBvZiBbJ2phdmEnLCAnbm9kZScsICdweXRob24nXSkge1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsIGAuJHtwcmVmaXh9LXZlcnNpb25gKSkpIHtcbiAgICAgICAgaGFzVmVyc2lvblNldHRpbmdzID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGRvY2tlcmZpbGUgPSAnJztcbiAgICB0cnkge1xuICAgICAgZG9ja2VyZmlsZSA9IGF3YWl0IGZzcC5yZWFkRmlsZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ0RvY2tlcmZpbGUnKSwgJ3V0ZjgnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICAvLyBSZWFkIHdiZnkuanNvblxuICAgIGNvbnN0IHdiZnlKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnd2JmeS5qc29uJyk7XG4gICAgbGV0IHdiZnlKc29uOiBXYmZ5SnNvbiB8IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgd2JmeUpzb25UZXh0ID0gYXdhaXQgZnNwLnJlYWRGaWxlKHdiZnlKc29uUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIHdiZnlKc29uID0gd2JmeUpzb25TY2hlbWEucGFyc2UoSlNPTi5wYXJzZSh3YmZ5SnNvblRleHQpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICBjb25zdCByZXBvRnVsbE5hbWUgPSB0eXBlb2YgcmVwb0luZm8/LmZ1bGxfbmFtZSA9PT0gJ3N0cmluZycgPyByZXBvSW5mby5mdWxsX25hbWUgOiB1bmRlZmluZWQ7XG4gICAgbGV0IHJlcG9BdXRob3I6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgcmVwb05hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBpZiAocmVwb0Z1bGxOYW1lKSB7XG4gICAgICBjb25zdCByZXBvUGFydHMgPSByZXBvRnVsbE5hbWUuc3BsaXQoJy8nKTtcbiAgICAgIGlmIChyZXBvUGFydHMubGVuZ3RoID49IDIpIHtcbiAgICAgICAgcmVwb0F1dGhvciA9IHJlcG9QYXJ0c1swXTtcbiAgICAgICAgcmVwb05hbWUgPSByZXBvUGFydHNbMV07XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJlcG9zaXRvcnkgPSByZXBvRnVsbE5hbWUgPyBgZ2l0aHViOiR7cmVwb0Z1bGxOYW1lfWAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgY29uZmlnOiBQYWNrYWdlQ29uZmlnID0ge1xuICAgICAgZGlyUGF0aCxcbiAgICAgIGRvY2tlcmZpbGUsXG4gICAgICBpc1Jvb3QsXG4gICAgICBpc1B1YmxpY1JlcG86IHJlcG9JbmZvPy5wcml2YXRlID09PSBmYWxzZSxcbiAgICAgIGlzUmVmZXJyZWRCeU90aGVyUmVwbzogISFwYWNrYWdlSnNvbi5maWxlcyxcbiAgICAgIHJlcG9zaXRvcnksXG4gICAgICByZXBvQXV0aG9yLFxuICAgICAgcmVwb05hbWUsXG4gICAgICBpc1dpbGxCb29zdGVyUmVwbzogQm9vbGVhbihcbiAgICAgICAgcmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyLycpIHx8IHJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKVxuICAgICAgKSxcbiAgICAgIGlzQnVuOiByb290Q29uZmlnPy5pc0J1biB8fCBmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAnYnVuLmxvY2snKSksXG4gICAgICBpc0VzbVBhY2thZ2U6IGVzbVBhY2thZ2UsXG4gICAgICBpc1dpbGxCb29zdGVyQ29uZmlnczogcGFja2FnZUpzb25QYXRoLmluY2x1ZGVzKGAke3BhdGguc2VwfXdpbGxib29zdGVyLWNvbmZpZ3NgKSxcbiAgICAgIGRvZXNDb250YWluU3ViUGFja2FnZUpzb25zOiBjb250YWluc0FueSgncGFja2FnZXMvKiovcGFja2FnZS5qc29uJywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbkRvY2tlcmZpbGU6ICEhZG9ja2VyZmlsZSB8fCBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnZG9ja2VyLWNvbXBvc2UueW1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5HZW1maWxlOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnR2VtZmlsZScpKSxcbiAgICAgIGRvZXNDb250YWluR29Nb2Q6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdnby5tb2QnKSksXG4gICAgICBkb2VzQ29udGFpblBhY2thZ2VKc29uOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncGFja2FnZS5qc29uJykpLFxuICAgICAgZG9lc0NvbnRhaW5Qb2V0cnlMb2NrOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncG9ldHJ5LmxvY2snKSksXG4gICAgICBkb2VzQ29udGFpblBvbVhtbDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BvbS54bWwnKSksXG4gICAgICBkb2VzQ29udGFpblB1YnNwZWNZYW1sOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncHVic3BlYy55YW1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5UZW1wbGF0ZVlhbWw6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICd0ZW1wbGF0ZS55YW1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5Wc2NvZGVTZXR0aW5nc0pzb246IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICcudnNjb2RlJywgJ3NldHRpbmdzLmpzb24nKSksXG4gICAgICBkb2VzQ29udGFpbkphdmFTY3JpcHQ6IGNvbnRhaW5zQW55KCd7YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4fScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5UeXBlU2NyaXB0OiBjb250YWluc0FueSgne2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjdHMsbXRzLHRzLHRzeH0nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluSnN4T3JUc3g6IGNvbnRhaW5zQW55KCd7YXBwLHNyYyx0ZXN0fS8qKi8qLnt0LGp9c3gnLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluSmF2YVNjcmlwdEluUGFja2FnZXM6IGNvbnRhaW5zQW55KCdwYWNrYWdlcy8qKi97YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4fScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlczogY29udGFpbnNBbnkoJ3BhY2thZ2VzLyoqL3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y3RzLG10cyx0cyx0c3h9JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbkpzeE9yVHN4SW5QYWNrYWdlczogY29udGFpbnNBbnkoJ3BhY2thZ2VzLyoqL3thcHAsc3JjLHRlc3R9LyoqLyoue3Qsan1zeCcsIGRpclBhdGgpLFxuICAgICAgaGFzU3RhcnRUZXN0U2VydmVyOiAhIXBhY2thZ2VKc29uLnNjcmlwdHM/Llsnc3RhcnQtdGVzdC1zZXJ2ZXInXSxcbiAgICAgIGRlcGVuZGluZzoge1xuICAgICAgICBibGl0ejogISFkZXBlbmRlbmNpZXMuYmxpdHosXG4gICAgICAgIGZpcmViYXNlOiAhIWRldkRlcGVuZGVuY2llc1snZmlyZWJhc2UtdG9vbHMnXSxcbiAgICAgICAgZ2VuSTE4blRzOiAhIWRldkRlcGVuZGVuY2llc1snZ2VuLWkxOG4tdHMnXSxcbiAgICAgICAgbGl0ZXN0cmVhbTogZG9ja2VyZmlsZS5pbmNsdWRlcygnaW5zdGFsbC1saXRlc3RyZWFtLnNoJyksXG4gICAgICAgIHJlYWN0OiAhIWRlcGVuZGVuY2llcy5yZWFjdCxcbiAgICAgICAgbmV4dDogISFkZXBlbmRlbmNpZXMubmV4dCxcbiAgICAgICAgcGxheXdyaWdodFRlc3Q6XG4gICAgICAgICAgISFkZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXSB8fCAhIWRldkRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddIHx8ICEhZGV2RGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQsXG4gICAgICAgIHByaXNtYTogISFkZXBlbmRlbmNpZXNbJ0BwcmlzbWEvY2xpZW50J10gfHwgISFkZXZEZXBlbmRlbmNpZXMucHJpc21hLFxuICAgICAgICBweXJpZ2h0OiAhIWRldkRlcGVuZGVuY2llcy5weXJpZ2h0LFxuICAgICAgICByZWFjdE5hdGl2ZTogISFkZXBlbmRlbmNpZXNbJ3JlYWN0LW5hdGl2ZSddLFxuICAgICAgICBzZW1hbnRpY1JlbGVhc2U6ICEhKFxuICAgICAgICAgIGRldkRlcGVuZGVuY2llc1snc2VtYW50aWMtcmVsZWFzZSddIHx8XG4gICAgICAgICAgcmVsZWFzZUJyYW5jaGVzLmxlbmd0aCA+IDAgfHxcbiAgICAgICAgICByZWxlYXNlUGx1Z2lucy5sZW5ndGggPiAwXG4gICAgICAgICksXG4gICAgICAgIHN0b3J5Ym9vazogISFkZXZEZXBlbmRlbmNpZXNbJ0BzdG9yeWJvb2svcmVhY3QnXSxcbiAgICAgICAgd2I6ICEhZGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvd2InXSB8fCAhIWRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3diJ10sXG4gICAgICB9LFxuICAgICAgcmVsZWFzZToge1xuICAgICAgICBicmFuY2hlczogcmVsZWFzZUJyYW5jaGVzLFxuICAgICAgICBnaXRodWI6IHJlbGVhc2VQbHVnaW5zLmluY2x1ZGVzKCdAc2VtYW50aWMtcmVsZWFzZS9naXRodWInKSxcbiAgICAgICAgbnBtOiByZWxlYXNlUGx1Z2lucy5pbmNsdWRlcygnQHNlbWFudGljLXJlbGVhc2UvbnBtJyksXG4gICAgICB9LFxuICAgICAgaGFzVmVyc2lvblNldHRpbmdzLFxuICAgICAgcGFja2FnZUpzb24sXG4gICAgICB3YmZ5SnNvbixcbiAgICB9O1xuICAgIGlmICghY29uZmlnLmlzQnVuKSB7XG4gICAgICBjb25maWcuZXNsaW50QmFzZSA9IGdldEVzbGludEV4dGVuc2lvbkJhc2UoY29uZmlnKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgY29uZmlnLmRvZXNDb250YWluR2VtZmlsZSB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluR29Nb2QgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5Qb21YbWwgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5UZW1wbGF0ZVlhbWxcbiAgICApIHtcbiAgICAgIHJldHVybiBjb25maWc7XG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cblxuZnVuY3Rpb24gaGFzVmVyc2lvblNldHRpbmdzRmlsZShkaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgY3VycmVudCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoKTtcbiAgcmV0dXJuIChcbiAgICBmcy5leGlzdHNTeW5jKHBhdGguam9pbihjdXJyZW50LCAnbWlzZS50b21sJykpIHx8XG4gICAgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY3VycmVudCwgJy5taXNlLnRvbWwnKSkgfHxcbiAgICBmcy5leGlzdHNTeW5jKHBhdGguam9pbihjdXJyZW50LCAnLnRvb2wtdmVyc2lvbnMnKSlcbiAgKTtcbn1cblxuZnVuY3Rpb24gY29udGFpbnNBbnkocGF0dGVybjogc3RyaW5nLCBkaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGZnLmdsb2JTeW5jKHBhdHRlcm4sIHsgZG90OiB0cnVlLCBjd2Q6IGRpclBhdGgsIGlnbm9yZTogZ2xvYklnbm9yZSB9KS5sZW5ndGggPiAwO1xufVxuXG5leHBvcnQgdHlwZSBFc2xpbnRFeHRlbnNpb25CYXNlID1cbiAgfCAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMtcmVhY3QnXG4gIHwgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzJ1xuICB8ICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcy1yZWFjdCdcbiAgfCAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMnXG4gIHwgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLW5leHQnO1xuXG5mdW5jdGlvbiBnZXRFc2xpbnRFeHRlbnNpb25CYXNlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IEVzbGludEV4dGVuc2lvbkJhc2UgfCB1bmRlZmluZWQge1xuICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgcmV0dXJuICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1uZXh0JztcbiAgfSBlbHNlIGlmIChjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0KSB7XG4gICAgcmV0dXJuIGNvbmZpZy5kb2VzQ29udGFpbkpzeE9yVHN4ID8gJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzLXJlYWN0JyA6ICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cyc7XG4gIH0gZWxzZSB7XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbkpzeE9yVHN4KSB7XG4gICAgICByZXR1cm4gJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzLXJlYWN0JztcbiAgICB9IGVsc2UgaWYgKGNvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHQpIHtcbiAgICAgIHJldHVybiAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMnO1xuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaFJlcG9JbmZvKGRpclBhdGg6IHN0cmluZywgcGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBnaXQgPSBzaW1wbGVHaXQoZGlyUGF0aCk7XG4gIGNvbnN0IHJlbW90ZXMgPSBhd2FpdCBnaXQuZ2V0UmVtb3Rlcyh0cnVlKTtcbiAgY29uc3Qgb3JpZ2luID0gcmVtb3Rlcy5maW5kKChyKSA9PiByLm5hbWUgPT09ICdvcmlnaW4nKTtcbiAgY29uc3QgcmVtb3RlVXJsID0gb3JpZ2luPy5yZWZzLmZldGNoID8/IG9yaWdpbj8ucmVmcy5wdXNoO1xuICBpZiAodHlwZW9mIHJlbW90ZVVybCA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zdCBqc29uID0gYXdhaXQgcmVxdWVzdFJlcG9JbmZvKHJlbW90ZVVybCk7XG4gICAgaWYgKGpzb24pIHJldHVybiBqc29uO1xuICB9XG5cbiAgY29uc3QgdXJsID0gdHlwZW9mIHBhY2thZ2VKc29uLnJlcG9zaXRvcnkgPT09ICdzdHJpbmcnID8gcGFja2FnZUpzb24ucmVwb3NpdG9yeSA6IHBhY2thZ2VKc29uLnJlcG9zaXRvcnk/LnVybDtcbiAgaWYgKHVybCkge1xuICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXF1ZXN0UmVwb0luZm8odXJsKTtcbiAgICBpZiAoanNvbiAmJiBqc29uLm1lc3NhZ2UgIT09ICdOb3QgRm91bmQnKSByZXR1cm4ganNvbjtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZXF1ZXN0UmVwb0luZm8odXJsT3JGdWxsTmFtZTogc3RyaW5nKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBbb3JnLCBuYW1lXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZSh1cmxPckZ1bGxOYW1lKTtcbiAgaWYgKCFvcmcgfHwgIW5hbWUpIHJldHVybjtcblxuICBjb25zdCByZXQgPSB7IGZ1bGxfbmFtZTogYCR7b3JnfS8ke25hbWV9YCB9O1xuICB0cnkge1xuICAgIC8vIE1ldGFkYXRhIHBlcm1pc3Npb25cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGdldE9jdG9raXQoKS5yZXF1ZXN0KCdHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99Jywge1xuICAgICAgb3duZXI6IG9yZyxcbiAgICAgIHJlcG86IG5hbWUsXG4gICAgfSk7XG4gICAgT2JqZWN0LmFzc2lnbihyZXQsIHJlc3BvbnNlLmRhdGEpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IHJlZGlyZWN0ZWRGdWxsTmFtZSA9IGdldFJlZGlyZWN0ZWRSZXBvRnVsbE5hbWUoZXJyb3IpO1xuICAgIGlmIChyZWRpcmVjdGVkRnVsbE5hbWUpIHtcbiAgICAgIHJldC5mdWxsX25hbWUgPSByZWRpcmVjdGVkRnVsbE5hbWU7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGdldFJlZGlyZWN0ZWRSZXBvRnVsbE5hbWUoZXJyb3I6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIWVycm9yIHx8IHR5cGVvZiBlcnJvciAhPT0gJ29iamVjdCcpIHJldHVybjtcblxuICBjb25zdCByZXNwb25zZSA9XG4gICAgJ3Jlc3BvbnNlJyBpbiBlcnJvclxuICAgICAgPyAoZXJyb3IgYXMgeyByZXNwb25zZT86IHsgc3RhdHVzPzogbnVtYmVyOyBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB9IH0pLnJlc3BvbnNlXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2U/LnN0YXR1cyA/PyAoZXJyb3IgYXMgeyBzdGF0dXM/OiBudW1iZXIgfSkuc3RhdHVzO1xuICBpZiAoc3RhdHVzICE9PSAzMDEgJiYgc3RhdHVzICE9PSAzMDIpIHJldHVybjtcblxuICBjb25zdCBsb2NhdGlvbiA9IHJlc3BvbnNlPy5oZWFkZXJzPy5sb2NhdGlvbjtcbiAgaWYgKHR5cGVvZiBsb2NhdGlvbiAhPT0gJ3N0cmluZycpIHJldHVybjtcblxuICBjb25zdCBbb3JnLCBuYW1lXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShsb2NhdGlvbik7XG4gIGlmICghb3JnIHx8ICFuYW1lKSByZXR1cm47XG5cbiAgcmV0dXJuIGAke29yZ30vJHtuYW1lfWA7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBpZ25vcmVFcnJvckFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWInO1xuaW1wb3J0IHlhcmdzIGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZml4RG9ja2VyZmlsZSB9IGZyb20gJy4vZml4ZXJzL2RvY2tlcmZpbGUuanMnO1xuaW1wb3J0IHsgZml4TmV4dENvbmZpZ0pzb24gfSBmcm9tICcuL2ZpeGVycy9uZXh0Q29uZmlnLmpzJztcbmltcG9ydCB7IGZpeFBsYXl3cmlnaHRDb25maWcgfSBmcm9tICcuL2ZpeGVycy9wbGF5d3JpZ2h0Q29uZmlnLmpzJztcbmltcG9ydCB7IGZpeFByaXNtYUVudkZpbGVzIH0gZnJvbSAnLi9maXhlcnMvcHJpc21hLmpzJztcbmltcG9ydCB7IGZpeFRlc3REaXJlY3Rvcmllc1VwZGF0aW5nUGFja2FnZUpzb24gfSBmcm9tICcuL2ZpeGVycy90ZXN0RGlyZWN0b3J5LmpzJztcbmltcG9ydCB7IGZpeFR5cGVEZWZpbml0aW9ucyB9IGZyb20gJy4vZml4ZXJzL3R5cGVEZWZpbml0aW9uLmpzJztcbmltcG9ydCB7IGZpeFR5cG9zIH0gZnJvbSAnLi9maXhlcnMvdHlwb3MuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9hZ2VudHMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVCaW9tZUpzb25jIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2Jpb21lLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlQnVuZmlnVG9tbCB9IGZyb20gJy4vZ2VuZXJhdG9ycy9idW5maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVEb2NrZXJpZ25vcmUgfSBmcm9tICcuL2dlbmVyYXRvcnMvZG9ja2VyaWdub3JlLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlRWRpdG9yY29uZmlnIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2VkaXRvcmNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUVzbGludHJjIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2VzbGludENvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUdlbWluaUNvbmZpZyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9nZW1pbmlDb25maWcuanMnO1xuaW1wb3J0IHsgcmVtb3ZlR2VtaW5pU2V0dGluZ3MgfSBmcm9tICcuL2dlbmVyYXRvcnMvZ2VtaW5pU2V0dGluZ3MuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dpdGF0dHJpYnV0ZXMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVHaXRpZ25vcmUgfSBmcm9tICcuL2dlbmVyYXRvcnMvZ2l0aWdub3JlLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlSWRlYVNldHRpbmdzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2lkZWEuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVMZWZ0aG9va1VwZGF0aW5nUGFja2FnZUpzb24gfSBmcm9tICcuL2dlbmVyYXRvcnMvbGVmdGhvb2suanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVMaW50c3RhZ2VkcmMgfSBmcm9tICcuL2dlbmVyYXRvcnMvbGludHN0YWdlZHJjLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUGFja2FnZUpzb24gfSBmcm9tICcuL2dlbmVyYXRvcnMvcGFja2FnZUpzb24uanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVQcmV0dGllcmlnbm9yZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9wcmV0dGllcmlnbm9yZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVB5cmlnaHRDb25maWdKc29uIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3B5cmlnaHRDb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVSZWFkbWUgfSBmcm9tICcuL2dlbmVyYXRvcnMvcmVhZG1lLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUmVsZWFzZXJjIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3JlbGVhc2VyYy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJlbm92YXRlSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9yZW5vdmF0ZUpzb24uanMnO1xuaW1wb3J0IHsgaW5zdGFsbEFnZW50U2tpbGxzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3NraWxscy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVRzY29uZmlnIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3RzY29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlVnNjb2RlU2V0dGluZ3MgfSBmcm9tICcuL2dlbmVyYXRvcnMvdnNjb2RlU2V0dGluZ3MuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVXb3JrZmxvd3MsIGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3dvcmtmbG93LmpzJztcbmltcG9ydCB7IGdlbmVyYXRlWWFybnJjWW1sIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3lhcm5yYy5qcyc7XG5pbXBvcnQgeyBzZXR1cExhYmVscyB9IGZyb20gJy4vZ2l0aHViL2xhYmVsLmpzJztcbmltcG9ydCB7IHNldHVwU2VjcmV0cyB9IGZyb20gJy4vZ2l0aHViL3NlY3JldC5qcyc7XG5pbXBvcnQgeyBzZXR1cEdpdEh1YlNldHRpbmdzIH0gZnJvbSAnLi9naXRodWIvc2V0dGluZ3MuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMgfSBmcm9tICcuL2dpdGh1Yi90ZW1wbGF0ZS5qcyc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi9vcHRpb25zLmpzJztcbmltcG9ydCB7IGdldFBhY2thZ2VDb25maWcgfSBmcm9tICcuL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHNwYXduU3luYywgc3Bhd25TeW5jQW5kUmV0dXJuU3RhdHVzIH0gZnJvbSAnLi91dGlscy9zcGF3blV0aWwuanMnO1xuaW1wb3J0IHsgc2hvdWxkU2tpcFdpbGxib29zdGVyQ29uZmlnc0VzbGludFBhY2thZ2UgfSBmcm9tICcuL3V0aWxzL3dpbGxib29zdGVyQ29uZmlnc1V0aWwuanMnO1xuXG5hc3luYyBmdW5jdGlvbiBtYWluKCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBhcmd2ID0gYXdhaXQgeWFyZ3MocHJvY2Vzcy5hcmd2LnNsaWNlKDIpKVxuICAgIC5jb21tYW5kKCckMCBbcGF0aHMuLl0nLCAnTWFrZSBhIGdpdmVuIHByb2plY3QgZm9sbG93IHRoZSBXaWxsQm9vc3RlciBzdGFuZGFyZCcsICh5YXJncykgPT4ge1xuICAgICAgeWFyZ3MucG9zaXRpb25hbCgncGF0aHMnLCB7XG4gICAgICAgIGRlc2NyaWJlOiAncHJvamVjdCBwYXRocyB0byBiZSB3YmZpZWQnLFxuICAgICAgICBhcnJheTogdHJ1ZSxcbiAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgIGRlZmF1bHQ6IFsnLiddLFxuICAgICAgfSk7XG4gICAgfSlcbiAgICAub3B0aW9ucyh7XG4gICAgICBlbnY6IHtcbiAgICAgICAgZGVzY3JpcHRpb246ICdVcGxvYWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFzIHNlY3JldHMgdG8gR2l0SHViJyxcbiAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgYWxpYXM6ICdlJyxcbiAgICAgIH0sXG4gICAgICBza2lwRGVwczoge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ1NraXAgZGVwZW5kZW5jeSBpbnN0YWxsYXRpb24nLFxuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICBhbGlhczogJ2QnLFxuICAgICAgfSxcbiAgICAgIHZlcmJvc2U6IHtcbiAgICAgICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIG9yIG5vdCB0byBlbmFibGUgdmVyYm9zZSBtb2RlJyxcbiAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgYWxpYXM6ICd2JyxcbiAgICAgIH0sXG4gICAgfSlcbiAgICAudmVyc2lvbihnZXRWZXJzaW9uKCkpXG4gICAgLnN0cmljdCgpLmFyZ3Y7XG4gIG9wdGlvbnMuaXNWZXJib3NlID0gYXJndi52ZXJib3NlO1xuICBvcHRpb25zLmRvZXNVcGxvYWRFbnZWYXJzID0gYXJndi5lbnY7XG5cbiAgZm9yIChjb25zdCByb290RGlyUGF0aCBvZiBhcmd2LnBhdGhzIGFzIHN0cmluZ1tdKSB7XG4gICAgY29uc3QgcGFja2FnZXNEaXJQYXRoID0gcGF0aC5qb2luKHJvb3REaXJQYXRoLCAncGFja2FnZXMnKTtcbiAgICBjb25zdCBkaXJlbnRzID0gKGF3YWl0IGlnbm9yZUVycm9yQXN5bmMoKCkgPT4gZnMucHJvbWlzZXMucmVhZGRpcihwYWNrYWdlc0RpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KSkpID8/IFtdO1xuICAgIGNvbnN0IHN1YkRpclBhdGhzID0gZGlyZW50cy5maWx0ZXIoKGQpID0+IGQuaXNEaXJlY3RvcnkoKSkubWFwKChkKSA9PiBwYXRoLmpvaW4ocGFja2FnZXNEaXJQYXRoLCBkLm5hbWUpKTtcblxuICAgIGF3YWl0IGZpeFRlc3REaXJlY3Rvcmllc1VwZGF0aW5nUGFja2FnZUpzb24oW3Jvb3REaXJQYXRoLCAuLi5zdWJEaXJQYXRoc10pO1xuXG4gICAgY29uc3Qgcm9vdENvbmZpZyA9IGF3YWl0IGdldFBhY2thZ2VDb25maWcocm9vdERpclBhdGgpO1xuICAgIGNvbnNvbGUubG9nKCdyb290Q29uZmlnOicsIHJvb3RDb25maWcpO1xuICAgIGlmICghcm9vdENvbmZpZykge1xuICAgICAgY29uc29sZS5lcnJvcihgdGhlcmUgaXMgbm8gdmFsaWQgcGFja2FnZS5qc29uIGluICR7cm9vdERpclBhdGh9YCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgYWJicmV2aWF0aW9uUHJvbWlzZSA9IGZpeFR5cG9zKHJvb3RDb25maWcpO1xuXG4gICAgY29uc3QgbnVsbGFibGVTdWJQYWNrYWdlQ29uZmlncyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgc3ViRGlyUGF0aHMubWFwKChzdWJEaXJQYXRoKSA9PiBnZXRQYWNrYWdlQ29uZmlnKHN1YkRpclBhdGgsIHJvb3RDb25maWcpKVxuICAgICk7XG4gICAgY29uc3Qgc3ViUGFja2FnZUNvbmZpZ3MgPSBudWxsYWJsZVN1YlBhY2thZ2VDb25maWdzLmZpbHRlcigoY29uZmlnKSA9PiAhIWNvbmZpZyk7XG4gICAgY29uc3QgYWxsUGFja2FnZUNvbmZpZ3MgPSBbcm9vdENvbmZpZywgLi4uc3ViUGFja2FnZUNvbmZpZ3NdO1xuXG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBmb3IgKGNvbnN0IGNvbmZpZyBvZiBhbGxQYWNrYWdlQ29uZmlncykge1xuICAgICAgICBjb25zb2xlLmluZm8oY29uZmlnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJbnN0YWxsIHlhcm4gYmVycnlcbiAgICBhd2FpdCBnZW5lcmF0ZVlhcm5yY1ltbChyb290Q29uZmlnKTtcbiAgICBpZiAocm9vdENvbmZpZy5pc0J1bikge1xuICAgICAgYXdhaXQgZ2VuZXJhdGVCdW5maWdUb21sKHJvb3RDb25maWcpO1xuICAgIH1cblxuICAgIGNvbnN0IHNob3VsZFJ1bldvcmtmbG93cyA9XG4gICAgICAhaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8ocm9vdENvbmZpZy5yZXBvc2l0b3J5KSAmJlxuICAgICAgKHJvb3RDb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyLycpIHx8XG4gICAgICAgIHJvb3RDb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyTGFiLycpKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBmaXhEb2NrZXJmaWxlKHJvb3RDb25maWcpLFxuICAgICAgZml4UHJpc21hRW52RmlsZXMocm9vdENvbmZpZyksXG4gICAgICBhYmJyZXZpYXRpb25Qcm9taXNlLnRoZW4oKCkgPT4gZ2VuZXJhdGVSZWFkbWUocm9vdENvbmZpZykpLFxuICAgICAgZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucyhyb290Q29uZmlnLCBhbGxQYWNrYWdlQ29uZmlncyksXG4gICAgICBnZW5lcmF0ZURvY2tlcmlnbm9yZShyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlRWRpdG9yY29uZmlnKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVHZW1pbmlDb25maWcocm9vdENvbmZpZywgYWxsUGFja2FnZUNvbmZpZ3MpLFxuICAgICAgcmVtb3ZlR2VtaW5pU2V0dGluZ3Mocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlSWRlYVNldHRpbmdzKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVSZW5vdmF0ZUpzb24ocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZVJlbGVhc2VyYyhyb290Q29uZmlnKSxcbiAgICAgIC4uLihzaG91bGRSdW5Xb3JrZmxvd3MgPyBbZ2VuZXJhdGVXb3JrZmxvd3Mocm9vdENvbmZpZyldIDogW10pLFxuICAgICAgc2V0dXBMYWJlbHMocm9vdENvbmZpZyksXG4gICAgICBzZXR1cFNlY3JldHMocm9vdENvbmZpZyksXG4gICAgICBzZXR1cEdpdEh1YlNldHRpbmdzKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVMZWZ0aG9va1VwZGF0aW5nUGFja2FnZUpzb24ocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUxpbnRzdGFnZWRyYyhyb290Q29uZmlnKSxcbiAgICBdKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG5cbiAgICBjb25zdCBwcm9taXNlczogUHJvbWlzZTx2b2lkPltdID0gW107XG4gICAgZm9yIChjb25zdCBjb25maWcgb2YgYWxsUGFja2FnZUNvbmZpZ3MpIHtcbiAgICAgIGlmIChzaG91bGRTa2lwV2lsbGJvb3N0ZXJDb25maWdzRXNsaW50UGFja2FnZShjb25maWcpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXMpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChmaXhUeXBlRGVmaW5pdGlvbnMoY29uZmlnLCBjb25maWcuaXNSb290ID8gYWxsUGFja2FnZUNvbmZpZ3MgOiBbY29uZmlnXSkpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChmaXhQbGF5d3JpZ2h0Q29uZmlnKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGZpeE5leHRDb25maWdKc29uKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgYXdhaXQgZ2VuZXJhdGVHaXRpZ25vcmUoY29uZmlnLCByb290Q29uZmlnKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgICAgIGlmICghY29uZmlnLmlzUm9vdCAmJiAhY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBhd2FpdCBnZW5lcmF0ZVByZXR0aWVyaWdub3JlKGNvbmZpZyk7XG4gICAgICBhd2FpdCBnZW5lcmF0ZVBhY2thZ2VKc29uKGNvbmZpZywgcm9vdENvbmZpZywgYXJndi5za2lwRGVwcyk7XG5cbiAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVMaW50c3RhZ2VkcmMoY29uZmlnKSk7XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluVnNjb2RlU2V0dGluZ3NKc29uICYmIGNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyhjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVUc2NvbmZpZyhjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdCB8fFxuICAgICAgICBjb25maWcuZG9lc0NvbnRhaW5KYXZhU2NyaXB0SW5QYWNrYWdlcyB8fFxuICAgICAgICBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8XG4gICAgICAgIGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzXG4gICAgICApIHtcbiAgICAgICAgaWYgKHJvb3RDb25maWcuaXNCdW4pIHtcbiAgICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlQmlvbWVKc29uYyhjb25maWcpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJvb3RDb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3MpIHtcbiAgICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlRXNsaW50cmMoY29uZmlnKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnB5cmlnaHQpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZVB5cmlnaHRDb25maWdKc29uKGNvbmZpZykpO1xuICAgICAgfVxuICAgIH1cbiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuXG4gICAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSByb290Q29uZmlnLmlzQnVuID8gJ2J1bicgOiAneWFybic7XG4gICAgLy8gUmVmcmVzaCBsb2NrIGZpbGVzXG4gICAgaWYgKHJvb3RDb25maWcuaXNCdW4pIHtcbiAgICAgIHJlZnJlc2hCdW5Mb2NrKHJvb3REaXJQYXRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZnMucm1TeW5jKHBhdGguam9pbihyb290RGlyUGF0aCwgJ3lhcm4ubG9jaycpLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ2luc3RhbGwnLCAnLS1uby1pbW11dGFibGUnXSwgcm9vdERpclBhdGgpO1xuICAgIH1cbiAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnY2xlYW51cCddLCByb290RGlyUGF0aCk7XG4gICAgLy8gJ3lhcm4gaW5zdGFsbCcgc2hvdWxkIGJlIGFmdGVyIGB5YXJuIGNsZWFudXBgIGJlY2F1c2UgeWFybiBiZXJyeSBnZW5lcmF0ZXMgeWFybi5sb2NrXG4gICAgLy8gY29ycmVzcG9uZGluZyB0byB0aGUgY29udGVudHMgb2YgZGVwZW5kYW50IHN1Yi1wYWNrYWdlIGluIG1vbm9yZXBvXG4gICAgaWYgKCFyb290Q29uZmlnLmlzQnVuKSB7XG4gICAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnaW5zdGFsbCcsICctLW5vLWltbXV0YWJsZSddLCByb290RGlyUGF0aCk7XG4gICAgfVxuXG4gICAgYXdhaXQgaW5zdGFsbEFnZW50U2tpbGxzKHJvb3RDb25maWcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlZnJlc2hCdW5Mb2NrKHJvb3REaXJQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgbG9ja0ZpbGVQYXRoID0gcGF0aC5qb2luKHJvb3REaXJQYXRoLCAnYnVuLmxvY2snKTtcbiAgY29uc3QgYmFja3VwTG9ja0ZpbGVQYXRoID0gcGF0aC5qb2luKHJvb3REaXJQYXRoLCAnLmJ1bi5sb2NrLndiZnktYmFja3VwJyk7XG4gIGZzLnJtU3luYyhiYWNrdXBMb2NrRmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSk7XG4gIGlmIChmcy5leGlzdHNTeW5jKGxvY2tGaWxlUGF0aCkpIHtcbiAgICAvLyBSZWdlbmVyYXRlIGZyb20gc2NyYXRjaCwgYnV0IGtlZXAgdGhlIHByZXZpb3VzIGxvY2tmaWxlIHNvIGEgcmVnaXN0cnkgb3JcbiAgICAvLyByZXNvbHZlciBmYWlsdXJlIGNhbm5vdCBsZWF2ZSB0aGUgcmVwb3NpdG9yeSB3aXRob3V0IGEgbG9ja2ZpbGUuXG4gICAgZnMuY29weUZpbGVTeW5jKGxvY2tGaWxlUGF0aCwgYmFja3VwTG9ja0ZpbGVQYXRoKTtcbiAgICBmcy5ybVN5bmMobG9ja0ZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pO1xuICB9XG5cbiAgY29uc3Qgc3RhdHVzID0gc3Bhd25TeW5jQW5kUmV0dXJuU3RhdHVzKCdidW4nLCBbJ3VwZGF0ZSddLCByb290RGlyUGF0aCk7XG4gIGlmIChzdGF0dXMgPT09IDAgJiYgZnMuZXhpc3RzU3luYyhsb2NrRmlsZVBhdGgpKSB7XG4gICAgZnMucm1TeW5jKGJhY2t1cExvY2tGaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoZnMuZXhpc3RzU3luYyhiYWNrdXBMb2NrRmlsZVBhdGgpKSB7XG4gICAgZnMuY29weUZpbGVTeW5jKGJhY2t1cExvY2tGaWxlUGF0aCwgbG9ja0ZpbGVQYXRoKTtcbiAgICBmcy5ybVN5bmMoYmFja3VwTG9ja0ZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHJlZ2VuZXJhdGUgJHtsb2NrRmlsZVBhdGh9YCk7XG59XG5cbmZ1bmN0aW9uIGdldFZlcnNpb24oKTogc3RyaW5nIHtcbiAgbGV0IHBhY2thZ2VKc29uRGlyID0gcGF0aC5kaXJuYW1lKG5ldyBVUkwoaW1wb3J0Lm1ldGEudXJsKS5wYXRobmFtZSk7XG4gIHdoaWxlICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocGFja2FnZUpzb25EaXIsICdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICBwYWNrYWdlSnNvbkRpciA9IHBhdGguZGlybmFtZShwYWNrYWdlSnNvbkRpcik7XG4gIH1cbiAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4ocGFja2FnZUpzb25EaXIsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKSkgYXMge1xuICAgIHZlcnNpb246IHN0cmluZztcbiAgfTtcbiAgcmV0dXJuIHBhY2thZ2VKc29uLnZlcnNpb247XG59XG5cbmF3YWl0IG1haW4oKTtcbiJdLCJuYW1lcyI6WyJvcHRpb25zIiwiaXNWZXJib3NlIiwiZG9lc1VwbG9hZEVudlZhcnMiLCJsb2dnZXIiLCJmdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uIiwibmFtZSIsImZ1bmMiLCJjb25zb2xlIiwiaW5mbyIsImVycm9yIiwiRXJyb3IiLCJzdGFjayIsIlN0cmluZyIsImFzeW5jIiwiZml4RG9ja2VyZmlsZSIsImNvbmZpZyIsImRvZXNDb250YWluRG9ja2VyZmlsZSIsIm9sZENvbnRlbnQiLCJkb2NrZXJmaWxlIiwibmV3Q29udGVudCIsImZzIiwid3JpdGVGaWxlIiwicGF0aCIsImpvaW4iLCJkaXJQYXRoIiwiZnNVdGlsIiwicmVhZEZpbGVJZ25vcmluZ0Vycm9yIiwiZmlsZVBhdGgiLCJwcm9taXNlcyIsInJlYWRGaWxlIiwiZ2VuZXJhdGVGaWxlIiwiY29udGVudCIsIm1rZGlyIiwiZGlybmFtZSIsInJlY3Vyc2l2ZSIsIm5vcm1hbGl6ZWRDb250ZW50IiwicmVwbGFjZUFsbCIsInRyaW0iLCJwcm9taXNlUG9vbCIsIlByb21pc2VQb29sIiwiZml4TmV4dENvbmZpZ0pzb24iLCJtYXAiLCJleHQiLCJyZXNvbHZlIiwiZmluZCIsInAiLCJleGlzdHNTeW5jIiwicmVwbGFjZSIsIl8iLCJzZXR0aW5nc1RleHQiLCJpbmNsdWRlcyIsInJ1biIsImxpdGVyYWwiLCJ2YWx1ZSIsImtpbmQiLCJhc09iamVjdCIsImRlZmF1bHRDb25maWciLCJmb3JiaWRPbmx5IiwicmV0cmllcyIsInVzZSIsImJhc2VVUkwiLCJ0cmFjZSIsInNjcmVlbnNob3QiLCJ2aWRlbyIsIndlYlNlcnZlciIsImNvbW1hbmQiLCJ1cmwiLCJyZXVzZUV4aXN0aW5nU2VydmVyIiwidGltZW91dCIsInN0ZG91dCIsInN0ZGVyciIsImVudiIsImdyYWNlZnVsU2h1dGRvd24iLCJmaXhQbGF5d3JpZ2h0Q29uZmlnIiwiZW52RmlsZVBhdGhzIiwiZW52RmlsZVBhdGgiLCJ0ZXN0IiwiYXNzZXJ0TmV4dFB1YmxpY0Jhc2VVcmwiLCJleHRyYWN0ZWRPYmplY3RMaXRlcmFsIiwic291cmNlIiwidHMiLCJjcmVhdGVTb3VyY2VGaWxlIiwiU2NyaXB0VGFyZ2V0IiwiTGF0ZXN0IiwiU2NyaXB0S2luZCIsIlRTIiwiZm91bmQiLCJ2aXNpdCIsIm5vZGUiLCJpc0NhbGxFeHByZXNzaW9uIiwiZXhwcmVzc2lvbiIsImdldFRleHQiLCJmaXJzdEFyZ3VtZW50IiwiYXJndW1lbnRzIiwiaXNPYmplY3RMaXRlcmFsRXhwcmVzc2lvbiIsImZvckVhY2hDaGlsZCIsInVuZGVmaW5lZCIsImV4dHJhY3REZWZpbmVDb25maWdPYmplY3RMaXRlcmFsIiwicGFyc2VkIiwicGFyc2VPYmplY3RMaXRlcmFsRXhwcmVzc2lvbiIsIm1lcmdlZCIsIm1lcmdlIiwiYWxsIiwiaGFzU3RhcnRUZXN0U2VydmVyIiwiQm9vbGVhbiIsInBhY2thZ2VKc29uIiwic2NyaXB0cyIsImhhc0V4aXN0aW5nV2ViU2VydmVyIiwib2JqZWN0IiwiaXNCdW4iLCJzZXRXZWJTZXJ2ZXJDb21tYW5kIiwibmV3T2JqZWN0TGl0ZXJhbCIsInN0cmluZ2lmeU9iamVjdCIsInN0YXJ0IiwiZ2V0U3RhcnQiLCJlbmQiLCJnZXRFbmQiLCJzbGljZSIsIm9iamVjdExpdGVyYWwiLCJwcm9wZXJ0eSIsInByb3BlcnRpZXMiLCJpc1Byb3BlcnR5QXNzaWdubWVudCIsImlzSWRlbnRpZmllciIsImlzU3RyaW5nTGl0ZXJhbCIsInBhcnNlRXhwcmVzc2lvbiIsImluaXRpYWxpemVyIiwicGFyc2VkT2JqZWN0IiwiaXNBcnJheUxpdGVyYWxFeHByZXNzaW9uIiwiZWxlbWVudHMiLCJlbGVtZW50Iiwic29tZSIsInN0cmluZ2lmeVZhbHVlIiwibGV2ZWwiLCJ2YWx1ZXMiLCJsZW5ndGgiLCJpbmRlbnQiLCJyZXBlYXQiLCJsaW5lcyIsInN0cmluZ2lmaWVkIiwic3BsaXQiLCJhdCIsImluZGV4IiwiY2xvc2luZ0luZGVudCIsInN0cmluZ2lmeUFycmF5IiwiT2JqZWN0IiwiZW50cmllcyIsImtleSIsImdsb2JJZ25vcmUiLCJmaXhQcmlzbWFFbnZGaWxlcyIsImVudkZpbGVzIiwiZmciLCJnbG9iIiwiZG90IiwiY3dkIiwiaWdub3JlIiwiZW52RmlsZSIsImZpeFRlc3REaXJlY3Rvcmllc1VwZGF0aW5nUGFja2FnZUpzb24iLCJwYWNrYWdlRGlyUGF0aHMiLCJQcm9taXNlIiwibmV3VGVzdERpclBhdGgiLCJwYWNrYWdlRGlyUGF0aCIsIm9sZFRlc3REaXJOYW1lIiwib2xkVGVzdERpclBhdGgiLCJyZW5hbWUiLCJmaXhUeXBlRGVmaW5pdGlvbnMiLCJjb25maWdzSW5jbHVkaW5nQ2hpbGRyZW4iLCJsaWJUeXBlRGlyUGF0aCIsInNyY1R5cGVEaXJQYXRoIiwiaXNSb290IiwiZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMiLCJkaXJlbnRzIiwiaWdub3JlRW5vZW50QXN5bmMiLCJyZWFkZGlyIiwid2l0aEZpbGVUeXBlcyIsImRpcmVudCIsImRpck5hbWUiLCJoYXNUeXBlRGVjbGFyYXRpb25FeHRlbnNpb24iLCJlbmRzV2l0aCIsInBhY2thZ2VOYW1lIiwiaGFzTGlicmFyeSIsImRlcGVuZGVuY2llcyIsImRldkRlcGVuZGVuY2llcyIsImlzRmlsZSIsImlzRGlyZWN0b3J5Iiwib3ZlcndyaXRlTWVyZ2UiLCJkZXN0aW5hdGlvbkFycmF5Iiwic291cmNlQXJyYXkiLCJjb21iaW5lTWVyZ2UiLCJ0YXJnZXQiLCJkZXN0aW5hdGlvbiIsIml0ZW0iLCJjbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZCIsImlzTWVyZ2VhYmxlT2JqZWN0IiwicHVzaCIsInNvcnRLZXlzIiwib2JqIiwia2V5QW5kVmFsdWVzIiwidG9Tb3J0ZWQiLCJrZXkxIiwia2V5MiIsImxvY2FsZUNvbXBhcmUiLCJwdWJsaWNSZXBvQXV0b2ZpeFdvcmtmbG93Iiwib24iLCJwdWxsX3JlcXVlc3QiLCJicmFuY2hlcyIsInBlcm1pc3Npb25zIiwiY29udGVudHMiLCJjb25jdXJyZW5jeSIsImdyb3VwIiwiam9icyIsImF1dG9maXgiLCJwcml2YXRlUmVwb0F1dG9maXhXb3JrZmxvdyIsInVzZXMiLCJ3b3JrZmxvd3MiLCJyZWxlYXNlIiwicHVsbF9yZXF1ZXN0X3RhcmdldCIsInR5cGVzIiwic3luYyIsImlzc3VlcyIsImlmIiwid2l0aCIsInNlY3JldHMiLCJDTEFVREVfQ09ERV9PQVVUSF9UT0tFTiIsIk9QRU5BSV9BUElfS0VZIiwiR0VNSU5JX0FQSV9LRVkiLCJnZW5lcmF0ZVdvcmtmbG93cyIsInJvb3RDb25maWciLCJpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyIsInJlcG9zaXRvcnkiLCJ3b3JrZmxvd3NQYXRoIiwic2VtYW50aWNZbWxQYXRoIiwicm0iLCJmb3JjZSIsImZpbGVOYW1lU2V0IiwiU2V0IiwiZmlsdGVyIiwiZGVwZW5kaW5nIiwic2VtYW50aWNSZWxlYXNlIiwiYWRkIiwiZmlsZU5hbWUiLCJiYXNlbmFtZSIsIndyaXRlV29ya2Zsb3dZYW1sIiwiZGVwbG95UHJvZHVjdGlvbldvcmtmbG93RXhpc3RzIiwid3JpdGVZYW1sIiwiaXNQdWJsaWNSZXBvIiwiY2xvbmVEZWVwIiwicGFja2FnZU1hbmFnZXIiLCJzdGVwcyIsImJ1aWxkIiwiYXV0b2ZpeFdvcmtmbG93IiwiYXV0b2ZpeEpvYiIsImdlbmVyYXRlQXV0b2ZpeFdvcmtmbG93IiwibmV3U2V0dGluZ3MiLCJvbGRTZXR0aW5ncyIsInlhbWwiLCJsb2FkIiwiYXJyYXlNZXJnZSIsInN0YXJ0c1dpdGgiLCJtb3ZlVG9Cb3R0b20iLCJhY3Rpb25zIiwidHJpZ2dlcl9kZXBsb3lfd29ya2Zsb3ciLCJpc1JldXNhYmxlV29ya2Zsb3ciLCJqb2IiLCJub3JtYWxpemVKb2IiLCJzY2hlZHVsZSIsImJyYW5jaCIsInBhcmFtcyIsInN5bmNfcGFyYW1zX3dpdGhvdXRfZGVzdCIsIndvcmtmbG93X2Rpc3BhdGNoIiwiTlBNX1RPS0VOIiwiR0hfVE9LRU4iLCJGSVJFQkFTRV9UT0tFTiIsIkdDUF9TQV9LRVlfSlNPTl9GT1JfRklSRUJBU0UiLCJESVNDT1JEX1dFQkhPT0tfVVJMIiwic2VydmVyX3VybCIsImRvdF9lbnZfcGF0aCIsIkZMWV9BUElfVE9LRU4iLCJkZXBsb3lfY29tbWFuZCIsImNpX2xhYmVsIiwiZ2l0aHViX2hvc3RlZF9ydW5uZXIiLCJrZXlzIiwibmV3U2VjcmV0cyIsInlhbWxUZXh0IiwiZHVtcCIsImxpbmVXaWR0aCIsIm5vQ29tcGF0TW9kZSIsInN0eWxlcyIsImZpeFR5cG9zIiwicGFja2FnZUNvbmZpZyIsImRvY0ZpbGVzIiwibWRGaWxlIiwiZml4VHlwb3NJblRleHQiLCJyZXBsYWNlV2l0aENvbmZpZyIsInRzRmlsZXMiLCJ0c0ZpbGUiLCJmaXhUeXBvc0luQ29kZSIsInRleHRCYXNlZEZpbGVzIiwiZmlsZSIsInByb21pc2VBbGwiLCJwcm9wTmFtZSIsImJlZm9yZSIsImFmdGVyIiwid2JmeUpzb24iLCJ0eXBvcyIsImdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbnMiLCJhbGxDb25maWdzIiwiYWdlbnRzRXh0cmFQYXRoIiwiZXh0cmFDb250ZW50IiwidG9vbE5hbWUiLCJnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb24iLCJjdXJzb3JSdWxlc1BhdGgiLCJjdXJzb3JSdWxlc0NvbnRlbnQiLCJmcm9udG1hdHRlciIsImJvZHkiLCJnZW5lcmF0ZUN1cnNvckdlbmVyYWxNZGNDb250ZW50IiwiYmFzZUNvbnRlbnQiLCJkZXNjcmlwdGlvbiIsImlzV2lsbEJvb3N0ZXJSZXBvIiwiYyIsImdlbmVyYXRlQWdlbnRDb2RpbmdTdHlsZSIsImhhc05ld1NlY3Rpb24iLCJnZW5JMThuVHMiLCJyZWFjdCIsIm5leHQiLCJnZW5lcmF0ZUJpb21lSnNvbmMiLCJyb290IiwiJHNjaGVtYSIsImV4dGVuZHMiLCJKU09OIiwicGFyc2UiLCJzdHJpbmdpZnkiLCJtaW5pbXVtUmVsZWFzZUFnZUV4Y2x1ZGVzIiwiZXhpc3RpbmdDb250ZW50IiwiYnVuZmlnVG9tbCIsInBhcnNlQnVuZmlnVG9tbCIsImJ1biIsImdlbmVyYXRlUnVuU2VjdGlvbiIsImluc3RhbGwiLCJleGFjdCIsImdlbmVyYXRlQnVuZmlnVG9tbCIsInJlYWRGaWxlU3luYyIsInVzZXJDb250ZW50SGVhZGVyIiwidXNlckNvbnRlbnRIZWFkZXJSZWdleCIsInNlcGFyYXRvciIsImRlZmF1bHRIZWFkVXNlckNvbnRlbnQiLCJkZWZhdWx0VGFpbFVzZXJDb250ZW50IiwiaWdub3JlRmlsZVV0aWwiLCJzZXBhcmF0b3JQcmVmaXgiLCJyZWFkR2l0aWdub3JlV2l0aG91dFNlcGFyYXRvcnMiLCJsYXN0SGVhZGVySW5kZXgiLCJnZXRJbmRleE9mVGFpbFVzZXJDb250ZW50SGVhZGVyIiwiZ2V0SGVhZFVzZXJDb250ZW50IiwiaW5kZXhPZiIsInRoaXMiLCJnZXRUYWlsVXNlckNvbnRlbnQiLCJpc0JlcnJ5WmVyb0luc3RhbGxFbmFibGVkIiwibGFzdEluZGV4IiwibGFzdEluZGV4T2YiLCJnZW5lcmF0ZURvY2tlcmlnbm9yZSIsImV4dGVuc2lvbnMiLCJjb2RlV2l0aDJJbmRlbnRTaXplIiwiY29kZVdpdGg0SW5kZW50U2l6ZSIsIm1hcmtkb3duTGlrZSIsImVzbGludCIsInByZXR0aWVyIiwiYmlvbWUiLCJnZW5lcmF0ZUV4dGVuc2lvbnMiLCJnZW5lcmF0ZUVkaXRvcmNvbmZpZyIsImdlbmVyYXRlRXNsaW50cmMiLCJlc2xpbnRCYXNlIiwiaGF2ZV9mdW4iLCJjb2RlX3JldmlldyIsImRpc2FibGUiLCJjb21tZW50X3NldmVyaXR5X3RocmVzaG9sZCIsIm1heF9yZXZpZXdfY29tbWVudHMiLCJwdWxsX3JlcXVlc3Rfb3BlbmVkIiwiaGVscCIsInN1bW1hcnkiLCJpZ25vcmVfcGF0dGVybnMiLCJnZW5lcmF0ZUdlbWluaUNvbmZpZyIsImNvbmZpZ0ZpbGVQYXRoIiwic3R5bGVndWlkZUZpbGVQYXRoIiwibmV3Q29uZmlnIiwib2xkQ29uZmlnIiwieWFtbENvbnRlbnQiLCJjb2RpbmdSdWxlRXh0cmFDb250ZW50IiwidHJpbVN0YXJ0Iiwic3R5bGVndWlkZUNvbnRlbnQiLCJ0cmltRW5kIiwicmVtb3ZlR2VtaW5pU2V0dGluZ3MiLCJnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMiLCJkZWZhdWx0TmFtZXMiLCJnZW5lcmF0ZUdpdGlnbm9yZSIsImhlYWRVc2VyQ29udGVudCIsInRhaWxVc2VyQ29udGVudCIsIm5hbWVzIiwiZG9lc0NvbnRhaW5HZW1maWxlIiwiZG9lc0NvbnRhaW5Hb01vZCIsImRvZXNDb250YWluUGFja2FnZUpzb24iLCJkb2VzQ29udGFpblBvbVhtbCIsImRvZXNDb250YWluUHVic3BlY1lhbWwiLCJkb2VzQ29udGFpblRlbXBsYXRlWWFtbCIsImRvZXNDb250YWluUG9ldHJ5TG9jayIsImJsaXR6IiwiZmlyZWJhc2UiLCJwcmlzbWEiLCJwbGF5d3JpZ2h0VGVzdCIsInJlYWN0TmF0aXZlIiwic3Rvcnlib29rIiwibGl0ZXN0cmVhbSIsImdlbmVyYXRlZCIsInJlYWRDYWNoZSIsInJlc3BvbnNlIiwiZmV0Y2giLCJyZXNwb25zZVRleHQiLCJ0ZXh0Iiwib2siLCJ3cml0ZUNhY2hlIiwib3MiLCJob21lZGlyIiwic3RhdCIsIkRhdGUiLCJub3ciLCJtdGltZU1zIiwiY3JlYXRlVGFza09wdGlvbnMiLCJydW5uZXIiLCJhcmdzIiwiZXh0ZW5zaW9uIiwicHJldHRpZXJDb250ZW50IiwiYmlvbWVDb250ZW50IiwiZ2VuZXJhdGVJZGVhU2V0dGluZ3MiLCJkb2VzQ29udGFpbkphdmFTY3JpcHQiLCJkb2VzQ29udGFpbkphdmFTY3JpcHRJblBhY2thZ2VzIiwiZG9lc0NvbnRhaW5UeXBlU2NyaXB0IiwiZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcyIsInNwYXduU3luYyIsInJldHJ5Iiwic3Bhd25TeW5jQW5kUmV0dXJuU3RhdHVzIiwic3RhdHVzIiwibmV3Q21kIiwibmV3QXJncyIsImdldFNwYXduU3luY0FyZ3MiLCJjaGlsZF9wcm9jZXNzIiwic3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0Iiwic3RkaW8iLCJwcm9jIiwidG9TdHJpbmciLCJzIiwibWVzc2FnZSIsInByb2Nlc3MiLCJQQVRIIiwiQkVSUllfQklOX0ZPTERFUiIsImVuY29kaW5nIiwic2hlbGwiLCJFc2xpbnRVdGlsIiwiZ2V0TGludEZpeFN1ZmZpeCIsImRvZXNDb250YWluSnN4T3JUc3giLCJnaXRIdWJVdGlsIiwiZ2V0T3JnQW5kTmFtZSIsInVybE9yRnVsbE5hbWUiLCJ1cmxXaXRob3V0UHJvdG9jb2wiLCJvY3Rva2l0Q2FjaGUiLCJNYXAiLCJnZXRPY3Rva2l0Iiwib3duZXIiLCJjYWNoZWQiLCJnZXQiLCJvY3Rva2l0IiwiT2N0b2tpdCIsImF1dGgiLCJnZXRHaXRIdWJUb2tlbiIsInNldCIsImhhc0dpdEh1YlRva2VuIiwiR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVIiLCJHSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUkxBQiIsIkdJVEhVQl9UT0tFTiIsInBpbm5lZERlcGVuZGVuY3lTcGVjaWZpZXJzIiwidHlwZXNjcmlwdCIsInNob3VsZFNraXBXaWxsYm9vc3RlckNvbmZpZ3NFc2xpbnRQYWNrYWdlIiwiaXNXaWxsQm9vc3RlckNvbmZpZ3MiLCJqc0NvbW1vbkRlcHMiLCJ0c0NvbW1vbkRlcHMiLCJyZWFjdENvbW1vbkRlcHMiLCJlc2xpbnREZXBzIiwiZ2VuZXJhdGVQYWNrYWdlSnNvbiIsInNraXBBZGRpbmdEZXBzIiwianNvblRleHQiLCJqc29uT2JqIiwicGVlckRlcGVuZGVuY2llcyIsImF1dGhvciIsInRzbGliIiwibGVybmEiLCJwaW5zdCIsInJlbW92ZURlcHJlY2F0ZWRTdHVmZiIsImdlbmVyYXRlU2NyaXB0cyIsIndiIiwiYWRkU3RhcnRUZXN0U2VydmVyU2NyaXB0SWZOZWVkZWQiLCJwcmV0dGlmeSIsIm9yaWdpbmFsQ29udGVudCIsImxpbmUiLCJuZXdMaW5lIiwibCIsImdlbmVyYXRlUHJldHRpZXJTdWZmaXgiLCJwb2V0cnlEZXZEZXBlbmRlbmNpZXMiLCJodXNreSIsInBvc3RpbnN0YWxsIiwicG9zdHB1Ymxpc2giLCJwcmVwdWJsaXNoT25seSIsInByZXBhY2siLCJwb3N0cGFjayIsInByZXBhcmUiLCJ2ZXJzaW9uIiwiYXJ0aWxsZXJ5IiwicGxheXdyaWdodCIsIndvcmtzcGFjZXMiLCJBcnJheSIsImlzQXJyYXkiLCJ3b3Jrc3BhY2UiLCJnbG9iU3luYyIsIm1pY3JvbWF0Y2giLCJnZXRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMiLCJqZXN0IiwiZGVwIiwicHJpdmF0ZSIsImxpY2Vuc2UiLCJwdWJsaXNoQ29uZmlnIiwiYWNjZXNzIiwibWFpbiIsInJlc29sdXRpb25zIiwibGludCIsInNjcmlwdE5hbWUiLCJzY3JpcHQiLCJkaXJzIiwiZGlyIiwiZm9ybWF0IiwicHl0aG9uRmlsZXMiLCJkaXJOYW1lU2V0IiwicHl0aG9uRmlsZSIsImZpcnN0Iiwic2Vjb25kIiwic2l6ZSIsImRpck5hbWVzU3RyIiwiZXhpc3RpbmdSZXBvc2l0b3J5Iiwibm9ybWFsaXplZFJlcG9zaXRvcnkiLCJub3JtYWxpemVSZXBvc2l0b3J5VXJsRm9yUGFja2FnZUpzb24iLCJidWlsZE5vcm1hbGl6ZWRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24iLCJub3JtYWxpemVkRXhpc3RpbmdSZXBvc2l0b3J5IiwiZm9ybWF0UmVwb3NpdG9yeUZvclBhY2thZ2VKc29uIiwicGFja2FnZU5hbWVzIiwiaGFzIiwiaXNXb3Jrc3BhY2VQYWNrYWdlIiwiZ2V0TGF0ZXN0UHJpdmF0ZVBhY2thZ2VTcGVjaWZpZXIiLCJ1cGRhdGVQcml2YXRlUGFja2FnZXMiLCJuZXdKc29uVGV4dCIsIm9sZEFuZE5ld1NjcmlwdE5hbWVzIiwib2xkTmFtZSIsIm5ld05hbWUiLCJmaWxlcyIsImZpeFNjcmlwdE5hbWVzIiwidW5pcXVlRGVwZW5kZW5jaWVzIiwiZGVwZW5kZW5jeVNwZWNpZmllcnMiLCJkZXBlbmRlbmN5IiwiZ2V0RGVwZW5kZW5jeVNwZWNpZmllciIsInVuaXF1ZURldkRlcGVuZGVuY2llcyIsImRldkRlcGVuZGVuY3lTcGVjaWZpZXJzIiwiY29yZSIsImdldFBpbm5lZERlcGVuZGVuY3lTcGVjaWZpZXIiLCJyZXBvIiwicmVwb3NpdG9yeVVybCIsIm1hdGNoZWQiLCJleGVjIiwibm9ybWFsaXplZFVybCIsInR5cGUiLCJvbGRTY3JpcHRzIiwiaGFzVHlwZWNoZWNrIiwiY2xlYW51cCIsInR5cGVjaGVjayIsIm9sZFRlc3QiLCJweXJpZ2h0IiwiY29tbWl0SGFzaCIsIm9yZ2FuaXphdGlvbiIsInJlamVjdCIsImdldExhdGVzdENvbW1pdEhhc2giLCJiYXNlU2V0dGluZ3MiLCJwcmVDb21taXRTZXR0aW5ncyIsImNvbW1hbmRzIiwiZ2VuZXJhdGVMZWZ0aG9va1VwZGF0aW5nUGFja2FnZUpzb24iLCJodXNreURpclBhdGgiLCJoYXNIdXNreURpciIsInNldHRpbmdzIiwiZ2V0Q2xlYW51cEdsb2JzIiwiZ2V0Q2xlYW51cENvbW1hbmQiLCJwcmVQdXNoIiwidHlwZWNoZWNrQ29tbWFuZCIsImdldFByZVB1c2hTY3JpcHQiLCJta2RpclN5bmMiLCJtb2RlIiwicG9zdE1lcmdlQ29tbWFuZCIsInBvc3RNZXJnZUNvbW1hbmRzIiwiaGFzVmVyc2lvblNldHRpbmdzIiwidG9vbHNDaGFuZ2VkUGF0dGVybiIsInJhdyIsImluc3RhbGxDb21tYW5kIiwicm1OZXh0RGlyZWN0b3J5IiwiZ2VuZXJhdGVQb3N0TWVyZ2VDb21tYW5kcyIsInN1cHBvcnRlZEV4dGVuc2lvbnMiLCJsb2NhbFdiUGFja2FnZUpzb25QYXRoIiwiaGFzTG9jYWxXYldvcmtzcGFjZSIsImVzbGludFJ1bGVTdWZmaXgiLCJkb2VzQ29udGFpbkpzeE9yVHN4SW5QYWNrYWdlcyIsImVzbGludFBhdHRlcm4iLCJnZW5lcmF0ZUxpbnRzdGFnZWRyYyIsImdlbmVyYXRlUHJldHRpZXJpZ25vcmUiLCJnaXRpZ25vcmVGaWxlUGF0aCIsImdpdGlnbm9yZUNvbnRlbnQiLCJhZGRpdGlvbmFsQ29udGVudCIsInZlbnZQYXRoIiwidmVudiIsImdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24iLCJnZW5lcmF0ZVJlYWRtZSIsImluc2VydEJhZGdlIiwiZmlsZU5hbWVzIiwicmVhZGRpclN5bmMiLCJiYWRnZU5hbWUiLCJ0b1VwcGVyQ2FzZSIsImJhZGdlIiwicmVhZG1lIiwiaSIsImdlbmVyYXRlUmVsZWFzZXJjIiwicGx1Z2lucyIsInBsdWdpbiIsInByZXNldCIsInN1Y2Nlc3NDb21tZW50Q29uZGl0aW9uIiwiZmFpbENvbW1lbnRDb25kaXRpb24iLCJsYWJlbHMiLCJyZWxlYXNlZExhYmVscyIsImdlbmVyYXRlUmVub3ZhdGVKc29uIiwicGFja2FnZVJ1bGVzIiwicnVsZSIsIm1hdGNoUGFja2FnZU5hbWVzIiwiZW5hYmxlZCIsImluc3RhbGxBZ2VudFNraWxscyIsInNyY0RpcmVjdG9yaWVzIiwiZ2V0U3JjRGlycyIsInJvb3RKc29uT2JqIiwiY29tcGlsZXJPcHRpb25zIiwiYWx3YXlzU3RyaWN0Iiwibm9VbmNoZWNrZWRJbmRleGVkQWNjZXNzIiwiYWxsb3dTeW50aGV0aWNEZWZhdWx0SW1wb3J0cyIsImVzTW9kdWxlSW50ZXJvcCIsInJlc29sdmVKc29uTW9kdWxlIiwiZGVjbGFyYXRpb24iLCJzb3VyY2VNYXAiLCJpbXBvcnRIZWxwZXJzIiwibm9FbWl0Iiwib3V0RGlyIiwiZXhjbHVkZSIsImluY2x1ZGUiLCJzdWJKc29uT2JqIiwiZ2VuZXJhdGVUc2NvbmZpZyIsImdlbmVyYXRlZFJvb3REaXIiLCJyb290RGlyQ2FuZGlkYXRlcyIsImdldFJvb3REaXJDYW5kaWRhdGVzIiwiZXhpc3RpbmdJbmNsdWRlZERpcnMiLCJleGlzdGluZ1Jvb3RTb3VyY2VEaXJzIiwiZ2V0R2VuZXJhdGVkUm9vdERpciIsImdlbmVyYXRlZFR5cGVzIiwidHlwZU5hbWVzIiwidml0ZXN0IiwibW9jaGEiLCJjeXByZXNzIiwiZ2V0R2VuZXJhdGVkVHlwZXMiLCJnZXRUc2NvbmZpZ0V4dGVuZHMiLCJyb290RGlyIiwianN4IiwiZXhpc3RpbmdSb290RGlyIiwiZXhpc3RpbmdUeXBlcyIsImdlbmVyYXRlZEV4dGVuZHMiLCJleGlzdGluZ0V4dGVuZHMiLCJtZXJnZWRFeHRlbmRzIiwibm9ybWFsaXplRXh0ZW5kcyIsInVuaXF1ZUV4dGVuZHMiLCJtZXJnZVRzY29uZmlnRXh0ZW5kcyIsInNob3VsZFJlcGxhY2VFeGlzdGluZ1Jvb3REaXIiLCJtZXJnZWRUeXBlcyIsInR5cGVOYW1lIiwidHlwZVJvb3RzIiwic29ydCIsImV4cGVyaW1lbnRhbERlY29yYXRvcnMiLCJ2ZXJiYXRpbU1vZHVsZVN5bnRheCIsImV4Y2x1ZGVGaWxlUGF0dGVybnMiLCJnZW5lcmF0ZVZzY29kZVNldHRpbmdzIiwiZXhjbHVkZUZpbGVQYXR0ZXJuIiwiZXhjbHVkZVNldHRpbmciLCJnZW5lcmF0ZVlhcm5yY1ltbCIsInlhcm5yY1ltbFBhdGgiLCJjdXJyZW50VmVyc2lvbiIsImxhdGVzdFZlcnNpb24iLCJ2ZXJzaW9uc0pzb24iLCJnZXRMYXRlc3RWZXJzaW9uIiwiZ2V0TWFqb3JOdW1iZXIiLCJyZWxlYXNlc1BhdGgiLCJ5YXJucmNQYXRoIiwiZGVmYXVsdFNlbXZlclJhbmdlUHJlZml4Iiwibm9kZUxpbmtlciIsIm5tTW9kZSIsIm5wbU1pbmltYWxBZ2VHYXRlIiwibnBtUHJlYXBwcm92ZWRQYWNrYWdlcyIsImNvbXByZXNzaW9uTGV2ZWwiLCJpbmplY3RFbnZpcm9ubWVudEZpbGVzIiwiZW5hYmxlR2xvYmFsQ2FjaGUiLCJvcmlnaW5hbExlbmd0aCIsInBsdWdpblBhdGgiLCJtYWpvciIsIk51bWJlciIsInNldHVwTGFiZWxzIiwic2V0dXBMYWJlbCIsImRlbGV0ZUxhYmVsIiwid2FybiIsImNvbG9yIiwicmVxdWVzdCIsIkRFUFJFQ0FURURfU0VDUkVUX05BTUVTIiwic2V0dXBTZWNyZXRzIiwiZG90ZW52Iiwic2VjcmV0TmFtZSIsInNlY3JldF9uYW1lIiwia2V5X2lkIiwia2V5SWQiLCJkYXRhIiwic29kaXVtIiwicmVhZHkiLCJzZWNyZXQiLCJyYXdLZXkiLCJmcm9tX2Jhc2U2NCIsImJhc2U2NF92YXJpYW50cyIsIk9SSUdJTkFMIiwicmF3U2VjIiwiZnJvbV9zdHJpbmciLCJlbmNCeXRlcyIsImNyeXB0b19ib3hfc2VhbCIsImVuY0Jhc2U2NCIsInRvX2Jhc2U2NCIsImVuY3J5cHRlZF92YWx1ZSIsInNldHVwR2l0SHViU2V0dGluZ3MiLCJ3aXRoUmV0cnkiLCJhbGxvd19hdXRvX21lcmdlIiwiYWxsb3dfbWVyZ2VfY29tbWl0IiwiYWxsb3dfc3F1YXNoX21lcmdlIiwiYWxsb3dfcmViYXNlX21lcmdlIiwiYWxsb3dfdXBkYXRlX2JyYW5jaCIsImRlbGV0ZV9icmFuY2hfb25fbWVyZ2UiLCJzcXVhc2hfbWVyZ2VfY29tbWl0X3RpdGxlIiwic3F1YXNoX21lcmdlX2NvbW1pdF9tZXNzYWdlIiwiaGVhZGVycyIsInBhY2thZ2VNYW5hZ2VyUnVuUGxhY2Vob2xkZXIiLCJ0ZW1wbGF0ZXMiLCJnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcyIsImFwcGx5UGFja2FnZU1hbmFnZXJUZW1wbGF0ZSIsImRpc3RhbmNlIiwidGVtcGxhdGUiLCJwYWNrYWdlTWFuYWdlckNvbW1hbmQiLCJ3YmZ5SnNvblNjaGVtYSIsInoiLCJyZWNvcmQiLCJzdHJpbmciLCJvcHRpb25hbCIsImRvYyIsImdldFBhY2thZ2VDb25maWciLCJwYWNrYWdlSnNvblBhdGgiLCJlc21QYWNrYWdlIiwicGFja2FnZUpzb25UZXh0IiwicmVsZWFzZUJyYW5jaGVzIiwicmVsZWFzZVBsdWdpbnMiLCJyZWxlYXNlcmNKc29uUGF0aCIsImpzb24iLCJmc3AiLCJmbGF0IiwicmVwb0luZm8iLCJnaXQiLCJzaW1wbGVHaXQiLCJvcmlnaW4iLCJnZXRSZW1vdGVzIiwiciIsInJlbW90ZVVybCIsInJlZnMiLCJyZXF1ZXN0UmVwb0luZm8iLCJmZXRjaFJlcG9JbmZvIiwiY3VycmVudCIsImhhc1ZlcnNpb25TZXR0aW5nc0ZpbGUiLCJwcmVmaXgiLCJ3YmZ5SnNvblBhdGgiLCJ3YmZ5SnNvblRleHQiLCJyZXBvRnVsbE5hbWUiLCJmdWxsX25hbWUiLCJyZXBvQXV0aG9yIiwicmVwb05hbWUiLCJyZXBvUGFydHMiLCJpc1JlZmVycmVkQnlPdGhlclJlcG8iLCJpc0VzbVBhY2thZ2UiLCJzZXAiLCJjb250YWluc0FueSIsImRvZXNDb250YWluVnNjb2RlU2V0dGluZ3NKc29uIiwiZ2l0aHViIiwibnBtIiwiZ2V0RXNsaW50RXh0ZW5zaW9uQmFzZSIsInBhdHRlcm4iLCJvcmciLCJyZXQiLCJhc3NpZ24iLCJyZWRpcmVjdGVkRnVsbE5hbWUiLCJsb2NhdGlvbiIsImdldFJlZGlyZWN0ZWRSZXBvRnVsbE5hbWUiLCJyZWZyZXNoQnVuTG9jayIsInJvb3REaXJQYXRoIiwibG9ja0ZpbGVQYXRoIiwiYmFja3VwTG9ja0ZpbGVQYXRoIiwicm1TeW5jIiwiY29weUZpbGVTeW5jIiwiYXJndiIsInlhcmdzIiwicG9zaXRpb25hbCIsImRlc2NyaWJlIiwiYXJyYXkiLCJkZWZhdWx0IiwiYWxpYXMiLCJza2lwRGVwcyIsInZlcmJvc2UiLCJwYWNrYWdlSnNvbkRpciIsIlVSTCIsInBhdGhuYW1lIiwiZ2V0VmVyc2lvbiIsInN0cmljdCIsInBhdGhzIiwicGFja2FnZXNEaXJQYXRoIiwic3ViRGlyUGF0aHMiLCJpZ25vcmVFcnJvckFzeW5jIiwiZCIsImFiYnJldmlhdGlvblByb21pc2UiLCJzdWJQYWNrYWdlQ29uZmlncyIsInN1YkRpclBhdGgiLCJhbGxQYWNrYWdlQ29uZmlncyIsInNob3VsZFJ1bldvcmtmbG93cyIsInRoZW4iXSwibWFwcGluZ3MiOiJxcUJBS08sTUFBTUEsRUFBVSxJQUx2QixNQUNFQyxXQUFZLEVBQ1pDLG1CQUFvQixHQ2dCZixNQUFNQyxFQUFTLElBaEJ0QixNQUNFLCtCQUFNQyxDQUEwQkMsRUFBY0MsR0FDeENOLEVBQVFDLFdBQ1ZNLFFBQVFDLEtBQUssYUFB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
17
+ `.trim()}async function pt(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 dt(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 ut={venvPath:".",venv:".venv"};async function mt(n){return _.functionIgnoringException("generatePyrightConfigJson",async()=>{let s=u(ut);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 gt(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=ft(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=ft(i,a))}await $.run(()=>S.generateFile(s,i))})}function ft(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 ht(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 yt={$schema:"https://docs.renovatebot.com/renovate-schema.json",extends:["github>WillBooster/willbooster-configs:renovate.json5"]};async function wt(n){return _.functionIgnoringException("generateRenovateJson",async()=>{let s=u(yt);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 bt(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 vt={node:["src","test","scripts"].toSorted(),blitz:["src","test","scripts","db","integrations","mailers"].toSorted()};function kt(e){return e.depending.blitz?vt.blitz:vt.node}const xt={compilerOptions:{alwaysStrict:!0,noUncheckedIndexedAccess:!0,allowSyntheticDefaultImports:!0,esModuleInterop:!0,resolveJsonModule:!0,declaration:!0,sourceMap:!0,importHelpers:!1,noEmit:!1,outDir:"dist"},exclude:["packages/*/test/fixtures","test/fixtures"],include:["packages/*/scripts/**/*","packages/*/src/**/*","packages/*/test/**/*","scripts/**/*","src/**/*","test/**/*"]},_t={compilerOptions:{alwaysStrict:!0,noUncheckedIndexedAccess:!0,allowSyntheticDefaultImports:!0,esModuleInterop:!0,resolveJsonModule:!0,declaration:!0,sourceMap:!0,importHelpers:!1,noEmit:!1,outDir:"dist"},exclude:["test/fixtures"],include:["scripts/**/*","src/**/*","test/**/*"]};async function jt(n){return _.functionIgnoringException("generateTsconfig",async()=>{if(n.depending.blitz||n.depending.next)return;let s=u(n.isRoot?xt:_t);const i=function(n){const s=function(e){return kt(e).filter(e=>"scripts"!==e&&"test"!==e)}(n),i=kt(n).filter(s=>e.existsSync(t.resolve(n.dirPath,s))),r=i.filter(e=>s.includes(e));if(n.isRoot&&n.doesContainSubPackageJsons)return;if(1===i.length&&1===r.length)return`./${r[0]}`}(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=[...St(e),...St(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&&!function(e,t){return void 0===t||"."===e&&"."!==t}(l,i)?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;U(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 St(e){return e?Array.isArray(e)?e:[e]:[]}const $t=["**/.git/objects/**","**/.git/subtree-cache/**","**/node_modules/**","**/tmp/**","**/temp/**","**/dist/**"];async function Pt(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 $t)r=c.all([r,Ct(e)]);n.doesContainPoetryLock&&(r=c.all([r,Ct("**/.venv/**")])),n.depending.next&&(r=c.all([r,Ct("**/.next/**")])),"editor.codeActionsOnSave"in r&&delete r["editor.codeActionsOnSave"],"editor.formatOnSave"in r&&delete r["editor.formatOnSave"],U(r);const o=JSON.stringify(r,void 0,2);await $.run(()=>S.generateFile(s,o))}catch{}})}function Ct(e){return{"files.watcherExclude":{[e]:!0}}}async function Et(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=Re("yarn",["--version"],n.dirPath),r=function(e,t){const n=Re("npm",["show",e,"versions","--json"],t);return JSON.parse(n).at(-1)}("@yarnpkg/cli",n.dirPath);Ot(i)<=Ot(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/*","agent-runtime-kit","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 Ot(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(!Ge(t))return;const s=Ue(t);try{await Ft(s,t,n,"d1: x-easy :hedgehog:","EDE9FE"),await Ft(s,t,n,"d2: easy :rabbit2:","DDD6FE"),await Ft(s,t,n,"d3: medium :ox:","C4B5FD"),await Ft(s,t,n,"d4: hard :squid:","A78BFA"),await Ft(s,t,n,"d5: x-hard :whale2:","8B5CF6"),await Ft(s,t,n,"p1: critical :fire::fire::fire:","EF4444"),await Ft(s,t,n,"p2: urgent :fire::fire:","F87171"),await Ft(s,t,n,"p3: important :fire:","FCA5A5"),await Ft(s,t,n,"p4: nice to have :droplet:","FECACA"),await Ft(s,t,n,"r: blitz","5300bc"),await Ft(s,t,n,"r: firebase","ffca28"),await Ft(s,t,n,"r: prisma","0c344b"),await Ft(s,t,n,"r: react","61dafb"),await Ft(s,t,n,"r: svelte","ff3e00"),await Ft(s,t,n,"r: semantic-release","494949"),await Ft(s,t,n,"ready :rocket:","22C55E"),await Ft(s,t,n,"review requested :mag:","FBCA04"),await Ft(s,t,n,"released :bookmark:","6366F1"),await Ft(s,t,n,"s: 0.5h :clock1230:","F3F4F6"),await Ft(s,t,n,"s: 1h :clock1:","E5E7EB"),await Ft(s,t,n,"s: 2h :clock2:","D1D5DB"),await Ft(s,t,n,"s: 3h :clock3:","9CA3AF"),await Ft(s,t,n,"s: 5h :clock5:","6B7280"),await Ft(s,t,n,"s: 8h :clock8:","4B5563"),await Ft(s,t,n,"s: 13h :clock1:","374151"),await Ft(s,t,n,"t: build :hammer:","BFDBFE"),await Ft(s,t,n,"t: chore :broom:","BFDBFE"),await Ft(s,t,n,"t: ci :construction_worker:","BFDBFE"),await Ft(s,t,n,"t: docs :memo:","BFDBFE"),await Ft(s,t,n,"t: feat :sparkles:","BFDBFE"),await Ft(s,t,n,"t: fix :bug:","BFDBFE"),await Ft(s,t,n,"t: perf :zap:","BFDBFE"),await Ft(s,t,n,"t: refactor :recycle:","BFDBFE"),await Ft(s,t,n,"t: style :lipstick:","BFDBFE"),await Ft(s,t,n,"t: test :test_tube:","BFDBFE"),await Ft(s,t,n,"project","24292F"),await Ft(s,t,n,"focused :dart:","22C55E"),await Ft(s,t,n,"gen-pr-all :robot:","00B4D8"),await Ft(s,t,n,"gen-pr-claude :robot:","00B4D8"),await Ft(s,t,n,"gen-pr-codex :robot:","00B4D8"),await Ft(s,t,n,"gen-pr-gemini :robot:","00B4D8"),await At(s,t,n,"bug"),await At(s,t,n,"documentation"),await At(s,t,n,"duplicate"),await At(s,t,n,"enhancement"),await At(s,t,n,"good first issue"),await At(s,t,n,"help wanted"),await At(s,t,n,"invalid"),await At(s,t,n,"question"),await At(s,t,n,"wontfix"),await At(s,t,n,"ready"),await At(s,t,n,"review requested"),await At(s,t,n,"released"),await At(s,t,n,"semantic-release"),await At(s,t,n,"llm-pr :robot:"),await At(s,t,n,"ai-pr :robot:")}catch(e){console.warn("Skip setupLabels due to:",e?.stack??e)}})}async function Ft(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 At(e,t,n,s){try{await e.request("DELETE /repos/{owner}/{repo}/labels/{name}",{owner:t,repo:n,name:s})}catch{}}const It=["READY_DISCORD_WEBHOOK_URL","GH_BOT_PAT","PUBLIC_GH_BOT_PAT"];async function Tt(e){return _.functionIgnoringException("setupSecrets",async()=>{const[t,n]=Ne.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=Ue(t);try{for(const e of It)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 Dt(e){const[t,n]=Ne.getOrgAndName(e.repository??"");if(!t||!n)return;if("WillBooster"!==t&&"WillBoosterLab"!==t)return;if(!Ge(t))return;const i=Ue(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 Rt="__PM_RUN__",Wt={"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., \`${Rt} test\`) passed.\n - The lint command (e.g., \`${Rt} 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 Lt(n){return _.functionIgnoringException("generateGitHubTemplates",async()=>{for(const[s,i]of Object.entries(Wt)){const r=Nt(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 Nt(e,t){const n=t.isBun?"bun run":"yarn";return e.replaceAll(Rt,n)}const Jt=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 Ut(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 zt(i);if(e)return e}const r="string"==typeof t.repository?t.repository:t.repository?.url;if(r){const e=await zt(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=Jt.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 zt(e){const[t,n]=Ne.getOrgAndName(e);if(!t||!n)return;const s={full_name:`${t}/${n}`};try{const e=await Ue().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}function qt(n){const s=t.join(n,"bun.lock"),i=t.join(n,".bun.lock.wbfy-backup");e.rmSync(i,{force:!0}),e.existsSync(s)&&(e.copyFileSync(s,i),e.rmSync(s,{force:!0}));if(0!==De("bun",["update"],n)||!e.existsSync(s))throw e.existsSync(i)&&(e.copyFileSync(i,s),e.rmSync(i,{force:!0})),new Error(`Failed to regenerate ${s}`);e.rmSync(i,{force:!0})}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 Ut(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=>Ut(e,a)))).filter(e=>!!e),p=[a,...l];if(x.isVerbose)for(const e of p)console.info(e);await Et(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(()=>gt(a)),te(a,p),fe(a),we(a),xe(a,p),_e(a),Se(a),Lt(a),Ie(a),wt(a),ht(a),...d?[M(a)]:[],Bt(a),Tt(a),Dt(a),at(a),pt(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 dt(e),await Xe(e,a,n.skipDeps),u.push(pt(e)),e.doesContainVscodeSettingsJson&&e.doesContainPackageJson&&u.push(Pt(e)),(e.doesContainTypeScript||e.doesContainTypeScriptInPackages)&&u.push(jt(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(mt(e))));await Promise.all(u),await $.promiseAll();const m=a.isBun?"bun":"yarn";a.isBun?qt(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 bt(a)}}();
18
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9vcHRpb25zLnRzIiwiLi4vc3JjL2xvZ2dlci50cyIsIi4uL3NyYy9maXhlcnMvZG9ja2VyZmlsZS50cyIsIi4uL3NyYy91dGlscy9mc1V0aWwudHMiLCIuLi9zcmMvdXRpbHMvcHJvbWlzZVBvb2wudHMiLCIuLi9zcmMvZml4ZXJzL25leHRDb25maWcudHMiLCIuLi9zcmMvZml4ZXJzL3BsYXl3cmlnaHRDb25maWcudHMiLCIuLi9zcmMvdXRpbHMvZ2xvYlV0aWwudHMiLCIuLi9zcmMvZml4ZXJzL3ByaXNtYS50cyIsIi4uL3NyYy9maXhlcnMvdGVzdERpcmVjdG9yeS50cyIsIi4uL3NyYy9maXhlcnMvdHlwZURlZmluaXRpb24udHMiLCIuLi9zcmMvdXRpbHMvbWVyZ2VVdGlsLnRzIiwiLi4vc3JjL3V0aWxzL29iamVjdFV0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy93b3JrZmxvdy50cyIsIi4uL3NyYy9maXhlcnMvdHlwb3MudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9hZ2VudHMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9iaW9tZS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2J1bmZpZy50cyIsIi4uL3NyYy91dGlscy9pZ25vcmVGaWxlVXRpbC50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2RvY2tlcmlnbm9yZS50cyIsIi4uL3NyYy91dGlscy9leHRlbnNpb25zLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZWRpdG9yY29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZXNsaW50Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2VtaW5pQ29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2VtaW5pU2V0dGluZ3MudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9naXRhdHRyaWJ1dGVzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2l0aWdub3JlLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvaWRlYS50cyIsIi4uL3NyYy91dGlscy9zcGF3blV0aWwudHMiLCIuLi9zcmMvdXRpbHMvZXNsaW50VXRpbC50cyIsIi4uL3NyYy91dGlscy9naXRodWJVdGlsLnRzIiwiLi4vc3JjL3V0aWxzL3dpbGxib29zdGVyQ29uZmlnc1V0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9wYWNrYWdlSnNvbi50cyIsIi4uL3NyYy91dGlscy90c2NvbmZpZ0Jhc2UudHMiLCIuLi9zcmMvZ2l0aHViL2NvbW1pdC50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2xlZnRob29rLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvbGludHN0YWdlZHJjLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcHJldHRpZXJpZ25vcmUudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9weXJpZ2h0Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVhZG1lLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVsZWFzZXJjLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVub3ZhdGVKc29uLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvc2tpbGxzLnRzIiwiLi4vc3JjL3V0aWxzL3NyY0RpcmVjdG9yaWVzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvdHNjb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy92c2NvZGVTZXR0aW5ncy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3lhcm5yYy50cyIsIi4uL3NyYy9naXRodWIvbGFiZWwudHMiLCIuLi9zcmMvZ2l0aHViL3NlY3JldC50cyIsIi4uL3NyYy9naXRodWIvc2V0dGluZ3MudHMiLCIuLi9zcmMvZ2l0aHViL3RlbXBsYXRlLnRzIiwiLi4vc3JjL3BhY2thZ2VDb25maWcudHMiLCIuLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiY2xhc3MgT3B0aW9ucyB7XG4gIGlzVmVyYm9zZSA9IGZhbHNlO1xuICBkb2VzVXBsb2FkRW52VmFycyA9IGZhbHNlO1xufVxuXG5leHBvcnQgY29uc3Qgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7XG4iLCJpbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi9vcHRpb25zLmpzJztcblxuY2xhc3MgTG9nZ2VyIHtcbiAgYXN5bmMgZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbihuYW1lOiBzdHJpbmcsIGZ1bmM6ICgpID0+IFByb21pc2U8dm9pZD4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgLS0tLS0tLS0tICR7bmFtZX0gc3RhcnQgLS0tLS0tLS0tYCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmdW5jKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRXJyb3Igb2NjdXJyZWQgaW4gJHtuYW1lfTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3Iuc3RhY2sgOiBTdHJpbmcoZXJyb3IpfX1gKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYC0tLS0tLS0tLS0gJHtuYW1lfSBlbmQgLS0tLS0tLS0tLWApO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgbG9nZ2VyID0gbmV3IExvZ2dlcigpO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4RG9ja2VyZmlsZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhEb2NrZXJmaWxlJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghY29uZmlnLmRvZXNDb250YWluRG9ja2VyZmlsZSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2xkQ29udGVudCA9IGNvbmZpZy5kb2NrZXJmaWxlO1xuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBvbGRDb250ZW50O1xuXG4gICAgaWYgKG9sZENvbnRlbnQgPT09IG5ld0NvbnRlbnQpIHJldHVybjtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUocGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAnRG9ja2VyZmlsZScpLCBuZXdDb250ZW50KTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5leHBvcnQgY29uc3QgZnNVdGlsID0ge1xuICBhc3luYyByZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gIH0sXG4gIGFzeW5jIGdlbmVyYXRlRmlsZShmaWxlUGF0aDogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihwYXRoLmRpcm5hbWUoZmlsZVBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBsZXQgbm9ybWFsaXplZENvbnRlbnQgPSBjb250ZW50LnJlcGxhY2VBbGwoJ1xcclxcbicsICdcXG4nKS50cmltKCk7XG4gICAgaWYgKG5vcm1hbGl6ZWRDb250ZW50KSB7XG4gICAgICBub3JtYWxpemVkQ29udGVudCArPSAnXFxuJztcbiAgICB9XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGZpbGVQYXRoLCBub3JtYWxpemVkQ29udGVudCk7XG4gICAgY29uc29sZS5sb2coYEdlbmVyYXRlZC9VcGRhdGVkICR7ZmlsZVBhdGh9YCk7XG4gIH0sXG59O1xuIiwiaW1wb3J0IHsgUHJvbWlzZVBvb2wgfSBmcm9tICdtaW5pbWFsLXByb21pc2UtcG9vbCc7XG5cbmV4cG9ydCBjb25zdCBwcm9taXNlUG9vbCA9IG5ldyBQcm9taXNlUG9vbCgpO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4TmV4dENvbmZpZ0pzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4TmV4dENvbmZpZ0pzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBbJ2pzJywgJ21qcycsICdjanMnXVxuICAgICAgLm1hcCgoZXh0KSA9PiBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGBuZXh0LmNvbmZpZy4ke2V4dH1gKSlcbiAgICAgIC5maW5kKChwKSA9PiBmcy5leGlzdHNTeW5jKHApKTtcbiAgICBpZiAoIWZpbGVQYXRoKSByZXR1cm47XG5cbiAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgLy8gUmVwbGFjZSB0aGUgSlNPTiBvYmplY3QgZnJvbSB0aGUgZmlsZVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBvbGRDb250ZW50LnJlcGxhY2UoLz1cXHMqeyhbXFxTXFxzXSopfTsvLCAoXywgc2V0dGluZ3NUZXh0OiBzdHJpbmcpID0+IHtcbiAgICAgIGlmICghc2V0dGluZ3NUZXh0LmluY2x1ZGVzKCdlc2xpbnQ6JykpIHtcbiAgICAgICAgc2V0dGluZ3NUZXh0ICs9ICdlc2xpbnQ6IHsgaWdub3JlRHVyaW5nQnVpbGRzOiB0cnVlIH0sJztcbiAgICAgIH1cbiAgICAgIGlmICghc2V0dGluZ3NUZXh0LmluY2x1ZGVzKCd0eXBlc2NyaXB0OicpKSB7XG4gICAgICAgIHNldHRpbmdzVGV4dCArPSAndHlwZXNjcmlwdDogeyBpZ25vcmVCdWlsZEVycm9yczogdHJ1ZSB9LCc7XG4gICAgICB9XG4gICAgICByZXR1cm4gYD0geyR7c2V0dGluZ3NUZXh0fX07YDtcbiAgICB9KTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IHRzIGZyb20gJ3R5cGVzY3JpcHQnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbnR5cGUgUGFyc2VkVmFsdWUgPVxuICB8IHsga2luZDogJ2FycmF5JzsgdmFsdWU6IFBhcnNlZFZhbHVlW10gfVxuICB8IHsga2luZDogJ2xpdGVyYWwnOyB2YWx1ZTogc3RyaW5nIH1cbiAgfCB7IGtpbmQ6ICdvYmplY3QnOyB2YWx1ZTogUGFyc2VkT2JqZWN0IH07XG50eXBlIFBhcnNlZE9iamVjdCA9IFJlY29yZDxzdHJpbmcsIFBhcnNlZFZhbHVlPjtcbmludGVyZmFjZSBFeHRyYWN0ZWRPYmplY3RMaXRlcmFsIHtcbiAgc291cmNlOiB0cy5Tb3VyY2VGaWxlO1xuICBub2RlOiB0cy5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbjtcbn1cblxuY29uc3QgbGl0ZXJhbCA9ICh2YWx1ZTogc3RyaW5nKTogUGFyc2VkVmFsdWUgPT4gKHsga2luZDogJ2xpdGVyYWwnLCB2YWx1ZSB9KTtcbmNvbnN0IGFzQXJyYXkgPSAodmFsdWU6IFBhcnNlZFZhbHVlW10pOiBQYXJzZWRWYWx1ZSA9PiAoeyBraW5kOiAnYXJyYXknLCB2YWx1ZSB9KTtcbmNvbnN0IGFzT2JqZWN0ID0gKHZhbHVlOiBQYXJzZWRPYmplY3QpOiBQYXJzZWRWYWx1ZSA9PiAoeyBraW5kOiAnb2JqZWN0JywgdmFsdWUgfSk7XG5cbmNvbnN0IGRlZmF1bHRDb25maWc6IFBhcnNlZE9iamVjdCA9IHtcbiAgZm9yYmlkT25seTogbGl0ZXJhbCgnISFwcm9jZXNzLmVudi5DSScpLFxuICByZXRyaWVzOiBsaXRlcmFsKCdwcm9jZXNzLmVudi5QV0RFQlVHID8gMCA6IHByb2Nlc3MuZW52LkNJID8gNSA6IDEnKSxcbiAgdXNlOiBhc09iamVjdCh7XG4gICAgYmFzZVVSTDogbGl0ZXJhbCgncHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfQkFTRV9VUkwnKSxcbiAgICB0cmFjZTogbGl0ZXJhbChcInByb2Nlc3MuZW52LkNJID8gJ29uLWZpcnN0LXJldHJ5JyA6ICdyZXRhaW4tb24tZmFpbHVyZSdcIiksXG4gICAgc2NyZWVuc2hvdDogbGl0ZXJhbChcInByb2Nlc3MuZW52LkNJID8gJ29ubHktb24tZmFpbHVyZScgOiAnb25seS1vbi1mYWlsdXJlJ1wiKSxcbiAgICB2aWRlbzogbGl0ZXJhbChcInByb2Nlc3MuZW52LkNJID8gJ3JldGFpbi1vbi1mYWlsdXJlJyA6ICdyZXRhaW4tb24tZmFpbHVyZSdcIiksXG4gIH0pLFxuICB3ZWJTZXJ2ZXI6IGFzT2JqZWN0KHtcbiAgICBjb21tYW5kOiBsaXRlcmFsKFwiJ3lhcm4gc3RhcnQtdGVzdC1zZXJ2ZXInXCIpLFxuICAgIHVybDogbGl0ZXJhbCgncHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfQkFTRV9VUkwnKSxcbiAgICByZXVzZUV4aXN0aW5nU2VydmVyOiBsaXRlcmFsKCchIXByb2Nlc3MuZW52LkNJJyksXG4gICAgdGltZW91dDogbGl0ZXJhbCgnMzAwXzAwMCcpLFxuICAgIHN0ZG91dDogbGl0ZXJhbChcIidwaXBlJ1wiKSxcbiAgICBzdGRlcnI6IGxpdGVyYWwoXCIncGlwZSdcIiksXG4gICAgZW52OiBsaXRlcmFsKGB7XG4gIC4uLnByb2Nlc3MuZW52LFxuICBQUklTTUFfVVNFUl9DT05TRU5UX0ZPUl9EQU5HRVJPVVNfQUlfQUNUSU9OOiAndHJ1ZScsXG59YCksXG4gICAgZ3JhY2VmdWxTaHV0ZG93bjogbGl0ZXJhbChge1xuICBzaWduYWw6ICdTSUdURVJNJyxcbiAgdGltZW91dDogNTAwLFxufWApLFxuICB9KSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhQbGF5d3JpZ2h0Q29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgYHBsYXl3cmlnaHQuY29uZmlnLnRzYCk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHJldHVybjtcblxuICBhd2FpdCBhc3NlcnROZXh0UHVibGljQmFzZVVybChjb25maWcuZGlyUGF0aCk7XG5cbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhQbGF5d3JpZ2h0Q29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICBjb25zdCBleHRyYWN0ZWRPYmplY3RMaXRlcmFsID0gZXh0cmFjdERlZmluZUNvbmZpZ09iamVjdExpdGVyYWwob2xkQ29udGVudCk7XG4gICAgaWYgKCFleHRyYWN0ZWRPYmplY3RMaXRlcmFsKSByZXR1cm47XG5cbiAgICBjb25zdCBwYXJzZWQgPSBwYXJzZU9iamVjdExpdGVyYWxFeHByZXNzaW9uKGV4dHJhY3RlZE9iamVjdExpdGVyYWwubm9kZSwgZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbC5zb3VyY2UpO1xuICAgIGlmICghcGFyc2VkKSByZXR1cm47XG5cbiAgICAvLyBLZWVwIGZpbGxpbmcgbWlzc2luZyBkZWZhdWx0cywgYnV0IGRvbid0IG92ZXJ3cml0ZSBsb2NhbCBhZGp1c3RtZW50cyBvbiBldmVyeSByZWdlbmVyYXRpb24uXG4gICAgY29uc3QgbWVyZ2VkID0gbWVyZ2UuYWxsPFBhcnNlZE9iamVjdD4oW2RlZmF1bHRDb25maWcsIHBhcnNlZF0pO1xuICAgIGNvbnN0IGhhc1N0YXJ0VGVzdFNlcnZlciA9IEJvb2xlYW4oY29uZmlnLnBhY2thZ2VKc29uPy5zY3JpcHRzPy5bJ3N0YXJ0LXRlc3Qtc2VydmVyJ10pO1xuICAgIGNvbnN0IGhhc0V4aXN0aW5nV2ViU2VydmVyID0gQm9vbGVhbihwYXJzZWQud2ViU2VydmVyKTtcbiAgICAvLyBPbmx5IGRyb3Agd2JmeSdzIGRlZmF1bHQgc2VydmVyIGNvbW1hbmQuIFJlcG9zIHdpdGggY3VzdG9tIFBsYXl3cmlnaHRcbiAgICAvLyBzZXJ2ZXIgc2V0dXAgc3RpbGwgbmVlZCBpdCBldmVuIHdoZW4gdGhleSBkbyBub3QgZXhwb3NlIHN0YXJ0LXRlc3Qtc2VydmVyLlxuICAgIGlmICghaGFzU3RhcnRUZXN0U2VydmVyICYmICFoYXNFeGlzdGluZ1dlYlNlcnZlcikge1xuICAgICAgZGVsZXRlIG1lcmdlZC53ZWJTZXJ2ZXI7XG4gICAgfVxuICAgIHNldFdlYlNlcnZlckNvbW1hbmQoY29uZmlnLCBtZXJnZWQpO1xuXG4gICAgY29uc3QgbmV3T2JqZWN0TGl0ZXJhbCA9IHN0cmluZ2lmeU9iamVjdChtZXJnZWQsIDApO1xuICAgIGNvbnN0IHN0YXJ0ID0gZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbC5ub2RlLmdldFN0YXJ0KGV4dHJhY3RlZE9iamVjdExpdGVyYWwuc291cmNlKTtcbiAgICBjb25zdCBlbmQgPSBleHRyYWN0ZWRPYmplY3RMaXRlcmFsLm5vZGUuZ2V0RW5kKCk7XG4gICAgY29uc3QgbmV3Q29udGVudCA9IGAke29sZENvbnRlbnQuc2xpY2UoMCwgc3RhcnQpfSR7bmV3T2JqZWN0TGl0ZXJhbH0ke29sZENvbnRlbnQuc2xpY2UoZW5kKX1gO1xuXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGFzc2VydE5leHRQdWJsaWNCYXNlVXJsKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBlbnZGaWxlUGF0aHMgPSBbXG4gICAgcGF0aC5yZXNvbHZlKGRpclBhdGgsICcuZW52JyksXG4gICAgcGF0aC5yZXNvbHZlKGRpclBhdGgsICcuZW52LnRlc3QnKSxcbiAgICBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ21pc2UudG9tbCcpLFxuICAgIHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnbWlzZS50ZXN0LnRvbWwnKSxcbiAgXTtcbiAgZm9yIChjb25zdCBlbnZGaWxlUGF0aCBvZiBlbnZGaWxlUGF0aHMpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGVudkZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgaWYgKC9ORVhUX1BVQkxJQ19CQVNFX1VSTFxccyo9L20udGVzdChjb250ZW50KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBNaXNzaW5nIGVudiBmaWxlcyBhcmUgZXhwZWN0ZWQgaW4gc29tZSByZXBvcy5cbiAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoJ05FWFRfUFVCTElDX0JBU0VfVVJMIGlzIHJlcXVpcmVkIGZvciBQbGF5d3JpZ2h0LiBEZWZpbmUgTkVYVF9QVUJMSUNfQkFTRV9VUkwgaW4gdGhlIHRhcmdldCByZXBvLicpO1xufVxuXG5mdW5jdGlvbiBzZXRXZWJTZXJ2ZXJDb21tYW5kKGNvbmZpZzogUGFja2FnZUNvbmZpZywgb2JqZWN0OiBQYXJzZWRPYmplY3QpOiB2b2lkIHtcbiAgY29uc3Qgd2ViU2VydmVyID0gb2JqZWN0LndlYlNlcnZlcjtcbiAgaWYgKHdlYlNlcnZlcj8ua2luZCAhPT0gJ29iamVjdCcpIHJldHVybjtcblxuICAvLyB3YmZ5IG93bnMgdGhlIHBhY2thZ2Ugc2NyaXB0LCBzbyBQbGF5d3JpZ2h0IHNob3VsZCBjb25zaXN0ZW50bHkgY2FsbCB0aGF0XG4gIC8vIHNjcmlwdCB3aGlsZSBwcmVzZXJ2aW5nIHRoZSByZXN0IG9mIGVhY2ggcmVwb3NpdG9yeSdzIHdlYlNlcnZlciBzZXR0aW5ncy5cbiAgd2ViU2VydmVyLnZhbHVlLmNvbW1hbmQgPSBsaXRlcmFsKGNvbmZpZy5pc0J1biA/IFwiJ2J1biBzdGFydC10ZXN0LXNlcnZlcidcIiA6IFwiJ3lhcm4gc3RhcnQtdGVzdC1zZXJ2ZXInXCIpO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0RGVmaW5lQ29uZmlnT2JqZWN0TGl0ZXJhbChjb250ZW50OiBzdHJpbmcpOiBFeHRyYWN0ZWRPYmplY3RMaXRlcmFsIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc291cmNlID0gdHMuY3JlYXRlU291cmNlRmlsZSgncGxheXdyaWdodC5jb25maWcudHMnLCBjb250ZW50LCB0cy5TY3JpcHRUYXJnZXQuTGF0ZXN0LCB0cnVlLCB0cy5TY3JpcHRLaW5kLlRTKTtcblxuICAvLyBUeXBlU2NyaXB0IGFscmVhZHkgdW5kZXJzdGFuZHMgbmVzdGVkIG9iamVjdCBsaXRlcmFscyBhbmQgdGVtcGxhdGUgc3RyaW5ncywgc28gdXNlXG4gIC8vIGl0cyBBU1QgcmFuZ2VzIGluc3RlYWQgb2YgYSByZWdleCB0aGF0IGNhbiBzdG9wIGF0IHRoZSBmaXJzdCBpbm5lciBjbG9zaW5nIGJyYWNlLlxuICBsZXQgZm91bmQ6IHRzLk9iamVjdExpdGVyYWxFeHByZXNzaW9uIHwgdW5kZWZpbmVkO1xuICBjb25zdCB2aXNpdCA9IChub2RlOiB0cy5Ob2RlKTogdm9pZCA9PiB7XG4gICAgaWYgKGZvdW5kKSByZXR1cm47XG4gICAgaWYgKHRzLmlzQ2FsbEV4cHJlc3Npb24obm9kZSkgJiYgbm9kZS5leHByZXNzaW9uLmdldFRleHQoc291cmNlKSA9PT0gJ2RlZmluZUNvbmZpZycpIHtcbiAgICAgIGNvbnN0IGZpcnN0QXJndW1lbnQgPSBub2RlLmFyZ3VtZW50c1swXTtcbiAgICAgIGlmIChmaXJzdEFyZ3VtZW50ICYmIHRzLmlzT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oZmlyc3RBcmd1bWVudCkpIHtcbiAgICAgICAgZm91bmQgPSBmaXJzdEFyZ3VtZW50O1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIHRzLmZvckVhY2hDaGlsZChub2RlLCB2aXNpdCk7XG4gIH07XG4gIHZpc2l0KHNvdXJjZSk7XG5cbiAgcmV0dXJuIGZvdW5kID8geyBzb3VyY2UsIG5vZGU6IGZvdW5kIH0gOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHBhcnNlT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oXG4gIG9iamVjdExpdGVyYWw6IHRzLk9iamVjdExpdGVyYWxFeHByZXNzaW9uLFxuICBzb3VyY2U6IHRzLlNvdXJjZUZpbGVcbik6IFBhcnNlZE9iamVjdCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHBhcnNlZDogUGFyc2VkT2JqZWN0ID0ge307XG4gIGZvciAoY29uc3QgcHJvcGVydHkgb2Ygb2JqZWN0TGl0ZXJhbC5wcm9wZXJ0aWVzKSB7XG4gICAgaWYgKCF0cy5pc1Byb3BlcnR5QXNzaWdubWVudChwcm9wZXJ0eSkgfHwgKCF0cy5pc0lkZW50aWZpZXIocHJvcGVydHkubmFtZSkgJiYgIXRzLmlzU3RyaW5nTGl0ZXJhbChwcm9wZXJ0eS5uYW1lKSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdmFsdWUgPSBwYXJzZUV4cHJlc3Npb24ocHJvcGVydHkuaW5pdGlhbGl6ZXIsIHNvdXJjZSk7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICBwYXJzZWRbcHJvcGVydHkubmFtZS5nZXRUZXh0KHNvdXJjZSldID0gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIHBhcnNlZDtcbn1cblxuZnVuY3Rpb24gcGFyc2VFeHByZXNzaW9uKGV4cHJlc3Npb246IHRzLkV4cHJlc3Npb24sIHNvdXJjZTogdHMuU291cmNlRmlsZSk6IFBhcnNlZFZhbHVlIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHRzLmlzT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oZXhwcmVzc2lvbikpIHtcbiAgICBjb25zdCBwYXJzZWRPYmplY3QgPSBwYXJzZU9iamVjdExpdGVyYWxFeHByZXNzaW9uKGV4cHJlc3Npb24sIHNvdXJjZSk7XG4gICAgcmV0dXJuIHBhcnNlZE9iamVjdCA/IGFzT2JqZWN0KHBhcnNlZE9iamVjdCkgOiBsaXRlcmFsKGV4cHJlc3Npb24uZ2V0VGV4dChzb3VyY2UpKTtcbiAgfVxuICBpZiAodHMuaXNBcnJheUxpdGVyYWxFeHByZXNzaW9uKGV4cHJlc3Npb24pKSB7XG4gICAgY29uc3QgZWxlbWVudHMgPSBleHByZXNzaW9uLmVsZW1lbnRzLm1hcCgoZWxlbWVudCkgPT4gcGFyc2VFeHByZXNzaW9uKGVsZW1lbnQsIHNvdXJjZSkpO1xuICAgIGlmIChlbGVtZW50cy5zb21lKChlbGVtZW50KTogZWxlbWVudCBpcyB1bmRlZmluZWQgPT4gZWxlbWVudCA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgcmV0dXJuIGxpdGVyYWwoZXhwcmVzc2lvbi5nZXRUZXh0KHNvdXJjZSkpO1xuICAgIH1cbiAgICByZXR1cm4gYXNBcnJheShlbGVtZW50cyBhcyBQYXJzZWRWYWx1ZVtdKTtcbiAgfVxuICByZXR1cm4gbGl0ZXJhbChleHByZXNzaW9uLmdldFRleHQoc291cmNlKSk7XG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeVZhbHVlKHZhbHVlOiBQYXJzZWRWYWx1ZSwgbGV2ZWw6IG51bWJlcik6IHN0cmluZyB7XG4gIGlmICh2YWx1ZS5raW5kID09PSAnYXJyYXknKSB7XG4gICAgcmV0dXJuIHN0cmluZ2lmeUFycmF5KHZhbHVlLnZhbHVlLCBsZXZlbCk7XG4gIH1cbiAgaWYgKHZhbHVlLmtpbmQgPT09ICdsaXRlcmFsJykgcmV0dXJuIHZhbHVlLnZhbHVlO1xuICByZXR1cm4gc3RyaW5naWZ5T2JqZWN0KHZhbHVlLnZhbHVlLCBsZXZlbCk7XG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeUFycmF5KHZhbHVlczogUGFyc2VkVmFsdWVbXSwgbGV2ZWw6IG51bWJlcik6IHN0cmluZyB7XG4gIGlmICh2YWx1ZXMubGVuZ3RoID09PSAwKSByZXR1cm4gJ1tdJztcbiAgY29uc3QgaW5kZW50ID0gJyAgJy5yZXBlYXQobGV2ZWwgKyAxKTtcbiAgY29uc3QgbGluZXMgPSB2YWx1ZXMubWFwKCh2YWx1ZSkgPT4ge1xuICAgIGNvbnN0IHN0cmluZ2lmaWVkID0gc3RyaW5naWZ5VmFsdWUodmFsdWUsIGxldmVsICsgMSkuc3BsaXQoJ1xcbicpO1xuICAgIHN0cmluZ2lmaWVkW3N0cmluZ2lmaWVkLmxlbmd0aCAtIDFdID0gYCR7c3RyaW5naWZpZWQuYXQoLTEpfSxgO1xuICAgIGlmICh2YWx1ZS5raW5kID09PSAnbGl0ZXJhbCcpIHtcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMTsgaW5kZXggPCBzdHJpbmdpZmllZC5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAgICAgc3RyaW5naWZpZWRbaW5kZXhdID0gYCR7aW5kZW50fSR7c3RyaW5naWZpZWRbaW5kZXhdfWA7XG4gICAgICB9XG4gICAgfVxuICAgIHN0cmluZ2lmaWVkWzBdID0gYCR7aW5kZW50fSR7c3RyaW5naWZpZWRbMF19YDtcbiAgICByZXR1cm4gc3RyaW5naWZpZWQuam9pbignXFxuJyk7XG4gIH0pO1xuICBjb25zdCBjbG9zaW5nSW5kZW50ID0gJyAgJy5yZXBlYXQobGV2ZWwpO1xuICByZXR1cm4gYFtcXG4ke2xpbmVzLmpvaW4oJ1xcbicpfVxcbiR7Y2xvc2luZ0luZGVudH1dYDtcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5T2JqZWN0KG9iamVjdDogUGFyc2VkT2JqZWN0LCBsZXZlbDogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3QgaW5kZW50ID0gJyAgJy5yZXBlYXQobGV2ZWwgKyAxKTtcbiAgY29uc3QgbGluZXMgPSBPYmplY3QuZW50cmllcyhvYmplY3QpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgY29uc3Qgc3RyaW5naWZpZWQgPSBzdHJpbmdpZnlWYWx1ZSh2YWx1ZSwgbGV2ZWwgKyAxKS5zcGxpdCgnXFxuJyk7XG4gICAgc3RyaW5naWZpZWRbc3RyaW5naWZpZWQubGVuZ3RoIC0gMV0gPSBgJHtzdHJpbmdpZmllZC5hdCgtMSl9LGA7XG4gICAgaWYgKHZhbHVlLmtpbmQgPT09ICdsaXRlcmFsJykge1xuICAgICAgZm9yIChsZXQgaW5kZXggPSAxOyBpbmRleCA8IHN0cmluZ2lmaWVkLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgICBzdHJpbmdpZmllZFtpbmRleF0gPSBgJHtpbmRlbnR9JHtzdHJpbmdpZmllZFtpbmRleF19YDtcbiAgICAgIH1cbiAgICB9XG4gICAgc3RyaW5naWZpZWRbMF0gPSBgJHtpbmRlbnR9JHtrZXl9OiAke3N0cmluZ2lmaWVkWzBdfWA7XG4gICAgcmV0dXJuIHN0cmluZ2lmaWVkLmpvaW4oJ1xcbicpO1xuICB9KTtcbiAgY29uc3QgY2xvc2luZ0luZGVudCA9ICcgICcucmVwZWF0KGxldmVsKTtcbiAgaWYgKGxpbmVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGB7XFxuJHtjbG9zaW5nSW5kZW50fX1gO1xuICByZXR1cm4gYHtcXG4ke2xpbmVzLmpvaW4oJ1xcbicpfVxcbiR7Y2xvc2luZ0luZGVudH19YDtcbn1cbiIsImV4cG9ydCBjb25zdCBnbG9iSWdub3JlID0gW1xuICAnKiovbm9kZV9tb2R1bGVzLyoqJyxcbiAgJyoqLy52ZW52LyoqJyxcbiAgJyoqL3Rlc3QtZml4dHVyZXMvKionLFxuICAnKiovdGVzdC9maXh0dXJlcy8qKicsXG4gICcqKi9kaXN0LyoqJyxcbiAgJyoqL2J1aWxkLyoqJyxcbiAgJyoqL3RhcmdldC8qKicsXG4gICcqKi90ZW1wLyoqJyxcbiAgJyoqL3RtcC8qKicsXG5dO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYic7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdsb2JJZ25vcmUgfSBmcm9tICcuLi91dGlscy9nbG9iVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhQcmlzbWFFbnZGaWxlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhQcmlzbWFFbnZGaWxlcycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBlbnZGaWxlcyA9IGF3YWl0IGZnLmdsb2IoWycqLmVudicsICcqLmVudi4qJ10sIHsgZG90OiB0cnVlLCBjd2Q6IGNvbmZpZy5kaXJQYXRoLCBpZ25vcmU6IGdsb2JJZ25vcmUgfSk7XG4gICAgZm9yIChjb25zdCBlbnZGaWxlIG9mIGVudkZpbGVzKSB7XG4gICAgICBjb25zdCBlbnZGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgZW52RmlsZSk7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoZW52RmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBuZXdDb250ZW50ID0gY29udGVudC5yZXBsYWNlKFxuICAgICAgICAvREFUQUJBU0VfVVJMPVwiPyguK1xcLnNxbGl0ZTMpXCI/W1xcbiRdLyxcbiAgICAgICAgJ0RBVEFCQVNFX1VSTD1cIiQxP2Nvbm5lY3Rpb25fbGltaXQ9MVwiXFxuJ1xuICAgICAgKTtcbiAgICAgIGF3YWl0IGZzLndyaXRlRmlsZShlbnZGaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgfVxuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhUZXN0RGlyZWN0b3JpZXNVcGRhdGluZ1BhY2thZ2VKc29uKHBhY2thZ2VEaXJQYXRoczogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhUZXN0RGlyZWN0b3JpZXNVcGRhdGluZ1BhY2thZ2VKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgcGFja2FnZURpclBhdGhzLm1hcChhc3luYyAocGFja2FnZURpclBhdGgpID0+IHtcbiAgICAgICAgY29uc3QgbmV3VGVzdERpclBhdGggPSBwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsICd0ZXN0Jyk7XG4gICAgICAgIGZvciAoY29uc3Qgb2xkVGVzdERpck5hbWUgb2YgWydfX3Rlc3RzX18nLCAndGVzdHMnXSkge1xuICAgICAgICAgIGNvbnN0IG9sZFRlc3REaXJQYXRoID0gcGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCBvbGRUZXN0RGlyTmFtZSk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IGZzLnByb21pc2VzLnJlbmFtZShvbGRUZXN0RGlyUGF0aCwgbmV3VGVzdERpclBhdGgpO1xuICAgICAgICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpO1xuICAgICAgICAgICAgY29uc3QgbmV3Q29udGVudCA9IG9sZENvbnRlbnQucmVwbGFjZUFsbChvbGRUZXN0RGlyTmFtZSwgJ3Rlc3QnKTtcbiAgICAgICAgICAgIGlmIChvbGRDb250ZW50ID09PSBuZXdDb250ZW50KSByZXR1cm47XG5cbiAgICAgICAgICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgbmV3Q29udGVudCk7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgaWdub3JlRW5vZW50QXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYic7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4VHlwZURlZmluaXRpb25zKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGNvbmZpZ3NJbmNsdWRpbmdDaGlsZHJlbjogUGFja2FnZUNvbmZpZ1tdXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhUeXBlRGVmaW5pdGlvbnMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgbGliVHlwZURpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdAdHlwZXMnKTtcbiAgICBjb25zdCBzcmNUeXBlRGlyUGF0aCA9XG4gICAgICBjb25maWcuaXNSb290ICYmIGNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucyA/IHVuZGVmaW5lZCA6IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3NyYycsICd0eXBlcycpO1xuXG4gICAgY29uc3QgZGlyZW50cyA9IGF3YWl0IGlnbm9yZUVub2VudEFzeW5jKCgpID0+IGZzLnJlYWRkaXIobGliVHlwZURpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KSk7XG4gICAgaWYgKCFkaXJlbnRzKSByZXR1cm47XG5cbiAgICBmb3IgKGNvbnN0IGRpcmVudCBvZiBkaXJlbnRzKSB7XG4gICAgICBjb25zdCBkaXJOYW1lID0gZGlyZW50Lm5hbWUuc2xpY2UoMCwgLTUpO1xuICAgICAgY29uc3QgaGFzVHlwZURlY2xhcmF0aW9uRXh0ZW5zaW9uID0gZGlyZW50Lm5hbWUuZW5kc1dpdGgoJy5kLnRzJyk7XG4gICAgICBsZXQgcGFja2FnZU5hbWUgPSBoYXNUeXBlRGVjbGFyYXRpb25FeHRlbnNpb24gPyBkaXJOYW1lIDogZGlyZW50Lm5hbWU7XG4gICAgICBpZiAocGFja2FnZU5hbWUuaW5jbHVkZXMoJ19fJykpIHtcbiAgICAgICAgcGFja2FnZU5hbWUgPSBgQCR7cGFja2FnZU5hbWUucmVwbGFjZSgnX18nLCAnLycpfWA7XG4gICAgICB9XG4gICAgICBjb25zdCBoYXNMaWJyYXJ5ID0gY29uZmlnc0luY2x1ZGluZ0NoaWxkcmVuLnNvbWUoXG4gICAgICAgIChjb25maWcpID0+XG4gICAgICAgICAgY29uZmlnLnBhY2thZ2VKc29uPy5kZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV0gfHwgY29uZmlnLnBhY2thZ2VKc29uPy5kZXZEZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV1cbiAgICAgICk7XG5cbiAgICAgIGlmIChkaXJlbnQuaXNGaWxlKCkgJiYgaGFzVHlwZURlY2xhcmF0aW9uRXh0ZW5zaW9uKSB7XG4gICAgICAgIGlmIChoYXNMaWJyYXJ5KSB7XG4gICAgICAgICAgLy8gTW92ZSBAdHlwZXMvPG5hbWU+L2luZGV4LmQudHMgaWYgaW5zdGFsbGVkXG4gICAgICAgICAgYXdhaXQgZnMubWtkaXIocGF0aC5qb2luKGxpYlR5cGVEaXJQYXRoLCBkaXJOYW1lKSk7XG4gICAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICAgICAgICBmcy5yZW5hbWUocGF0aC5qb2luKGxpYlR5cGVEaXJQYXRoLCBkaXJlbnQubmFtZSksIHBhdGguam9pbihsaWJUeXBlRGlyUGF0aCwgZGlyTmFtZSwgJ2luZGV4LmQudHMnKSlcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKHNyY1R5cGVEaXJQYXRoKSB7XG4gICAgICAgICAgLy8gTW92ZSBzcmMvdHlwZXMvPG5hbWU+IGlmIG5vdCBpbnN0YWxsZWRcbiAgICAgICAgICBhd2FpdCBmcy5ta2RpcihzcmNUeXBlRGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICAgICAgICBmcy5yZW5hbWUocGF0aC5qb2luKGxpYlR5cGVEaXJQYXRoLCBkaXJlbnQubmFtZSksIHBhdGguam9pbihzcmNUeXBlRGlyUGF0aCwgZGlyZW50Lm5hbWUpKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZGlyZW50LmlzRGlyZWN0b3J5KCkgJiYgc3JjVHlwZURpclBhdGggJiYgIWhhc0xpYnJhcnkpIHtcbiAgICAgICAgLy8gTW92ZSBzcmMvdHlwZXMvPG5hbWU+LmQudHMgaWYgbm90IGluc3RhbGxlZFxuICAgICAgICBhd2FpdCBmcy5ta2RpcihzcmNUeXBlRGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgICAgIGlnbm9yZUVub2VudEFzeW5jKCgpID0+XG4gICAgICAgICAgICBmcy5yZW5hbWUoXG4gICAgICAgICAgICAgIHBhdGguam9pbihsaWJUeXBlRGlyUGF0aCwgZGlyZW50Lm5hbWUsICdpbmRleC5kLnRzJyksXG4gICAgICAgICAgICAgIHBhdGguam9pbihzcmNUeXBlRGlyUGF0aCwgYCR7ZGlyZW50Lm5hbWV9LmQudHNgKVxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufVxuIiwiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1hc3NpZ25tZW50LCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWNhbGwsIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2VzcywgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1hcmd1bWVudCAqL1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuZXhwb3J0IGZ1bmN0aW9uIG92ZXJ3cml0ZU1lcmdlPFQ+KGRlc3RpbmF0aW9uQXJyYXk6IFRbXSwgc291cmNlQXJyYXk6IFRbXSk6IFRbXSB7XG4gIHJldHVybiBzb3VyY2VBcnJheTtcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCBmdW5jdGlvbiBjb21iaW5lTWVyZ2UodGFyZ2V0OiBvYmplY3RbXSwgc291cmNlOiBvYmplY3RbXSwgb3B0aW9uczogYW55KTogb2JqZWN0W10ge1xuICBjb25zdCBkZXN0aW5hdGlvbiA9IFsuLi50YXJnZXRdO1xuXG4gIGZvciAoY29uc3QgW2luZGV4LCBpdGVtXSBvZiBzb3VyY2UuZW50cmllcygpKSB7XG4gICAgaWYgKGRlc3RpbmF0aW9uW2luZGV4XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBkZXN0aW5hdGlvbltpbmRleF0gPSBvcHRpb25zLmNsb25lVW5sZXNzT3RoZXJ3aXNlU3BlY2lmaWVkKGl0ZW0sIG9wdGlvbnMpO1xuICAgIH0gZWxzZSBpZiAob3B0aW9ucy5pc01lcmdlYWJsZU9iamVjdChpdGVtKSkge1xuICAgICAgZGVzdGluYXRpb25baW5kZXhdID0gbWVyZ2UodGFyZ2V0W2luZGV4XSBhcyBvYmplY3QsIGl0ZW0sIG9wdGlvbnMpO1xuICAgIH0gZWxzZSBpZiAoIXRhcmdldC5pbmNsdWRlcyhpdGVtKSkge1xuICAgICAgZGVzdGluYXRpb24ucHVzaChpdGVtKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRlc3RpbmF0aW9uO1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIG1vdmVUb0JvdHRvbTxUT2JqIGV4dGVuZHMgUmVjb3JkPFRLZXksIHVua25vd24+LCBUS2V5IGV4dGVuZHMgc3RyaW5nIHwgbnVtYmVyIHwgc3ltYm9sPihcbiAgb2JqOiBUT2JqLFxuICBrZXk6IFRLZXlcbik6IFRPYmoge1xuICBjb25zdCB2YWx1ZSA9IG9ialtrZXldO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gIGRlbGV0ZSBvYmpba2V5XTtcbiAgKG9iaiBhcyBSZWNvcmQ8VEtleSwgdW5rbm93bj4pW2tleV0gPSB2YWx1ZTtcbiAgcmV0dXJuIG9iajtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNvcnRLZXlzPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ob2JqOiBUKTogVCB7XG4gIGNvbnN0IGtleUFuZFZhbHVlcyA9IE9iamVjdC5lbnRyaWVzKG9iaikudG9Tb3J0ZWQoKFtrZXkxXSwgW2tleTJdKSA9PiBrZXkxLmxvY2FsZUNvbXBhcmUoa2V5MikpO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBrZXlBbmRWYWx1ZXMpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gICAgZGVsZXRlIG9ialtrZXldO1xuICAgIChvYmogYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0gPSB2YWx1ZTtcblxuICAgIC8vIGlmIHZhbHVlIGlzIGFuIG9iamVjdCwgc29ydCB0aGUga2V5cyBvZiB0aGUgb2JqZWN0XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgIHNvcnRLZXlzKHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG9iajtcbn1cbiIsIi8qIGVzbGludC1kaXNhYmxlIHVuaWNvcm4vbm8tbnVsbCAqL1xuXG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuaW1wb3J0IGNsb25lRGVlcCBmcm9tICdsb2Rhc2guY2xvbmVkZWVwJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgY29tYmluZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IG1vdmVUb0JvdHRvbSwgc29ydEtleXMgfSBmcm9tICcuLi91dGlscy9vYmplY3RVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5pbnRlcmZhY2UgV29ya2Zsb3cge1xuICBuYW1lPzogc3RyaW5nO1xuICBvbj86IE9uO1xuICBjb25jdXJyZW5jeT86IENvbmN1cnJlbmN5O1xuICBwZXJtaXNzaW9ucz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIGpvYnM6IFJlY29yZDxzdHJpbmcsIEpvYj47XG59XG5cbmludGVyZmFjZSBDb25jdXJyZW5jeSB7XG4gIGdyb3VwOiBzdHJpbmc7XG4gICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgT24ge1xuICBpc3N1ZXM/OiBUeXBlcyB8IG51bGw7XG4gIHB1bGxfcmVxdWVzdD86IFB1bGxSZXF1ZXN0IHwgbnVsbDtcbiAgcHVsbF9yZXF1ZXN0X3RhcmdldD86IFR5cGVzIHwgbnVsbDtcbiAgcHVzaD86IFB1c2g7XG4gIHNjaGVkdWxlPzogU2NoZWR1bGVbXTtcbiAgd29ya2Zsb3dfZGlzcGF0Y2g/OiBudWxsO1xufVxuXG5pbnRlcmZhY2UgUHVsbFJlcXVlc3Qge1xuICAncGF0aHMtaWdub3JlJz86IHN0cmluZ1tdO1xuICB0eXBlcz86IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgUHVzaCB7XG4gIGJyYW5jaGVzOiBzdHJpbmdbXTtcbiAgJ3BhdGhzLWlnbm9yZSc/OiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIFNjaGVkdWxlIHtcbiAgY3Jvbjogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgVHlwZXMge1xuICB0eXBlczogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBKb2Ige1xuICAncnVucy1vbic/OiBzdHJpbmc7XG4gIHBlcm1pc3Npb25zPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgc3RlcHM/OiBTdGVwW107XG4gIHVzZXM/OiBzdHJpbmc7XG4gIGlmPzogc3RyaW5nO1xuICBzZWNyZXRzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHdpdGg/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuaW50ZXJmYWNlIFN0ZXAge1xuICB1c2VzPzogc3RyaW5nO1xuICB3aXRoPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHJ1bj86IHN0cmluZztcbn1cblxuY29uc3QgcHVibGljUmVwb0F1dG9maXhXb3JrZmxvdzogV29ya2Zsb3cgPSB7XG4gIG5hbWU6ICdhdXRvZml4LmNpJyxcbiAgb246IHtcbiAgICBwdWxsX3JlcXVlc3Q6IG51bGwsXG4gICAgcHVzaDoge1xuICAgICAgYnJhbmNoZXM6IFsnbWFpbiddLFxuICAgIH0sXG4gIH0sXG4gIHBlcm1pc3Npb25zOiB7XG4gICAgY29udGVudHM6ICdyZWFkJyxcbiAgfSxcbiAgY29uY3VycmVuY3k6IHtcbiAgICBncm91cDogJ2F1dG9maXgtJHt7IGdpdGh1Yi5oZWFkX3JlZiB9fScsXG4gICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IHRydWUsXG4gIH0sXG4gIGpvYnM6IHtcbiAgICBhdXRvZml4OiB7ICdydW5zLW9uJzogJ3VidW50dS1sYXRlc3QnIH0sXG4gIH0sXG59O1xuXG5jb25zdCBwcml2YXRlUmVwb0F1dG9maXhXb3JrZmxvdzogV29ya2Zsb3cgPSB7XG4gIG5hbWU6ICdGaXggY29kZSBhdXRvbWF0aWNhbGx5JyxcbiAgb246IHtcbiAgICBwdWxsX3JlcXVlc3Q6IG51bGwsXG4gIH0sXG4gIGNvbmN1cnJlbmN5OiB7XG4gICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19LSR7eyBnaXRodWIucmVmIH19JyxcbiAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogdHJ1ZSxcbiAgfSxcbiAgam9iczoge1xuICAgIGF1dG9maXg6IHtcbiAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvYXV0b2ZpeC55bWxAbWFpbicsXG4gICAgfSxcbiAgfSxcbn07XG5cbmNvbnN0IHdvcmtmbG93cyA9IHtcbiAgdGVzdDoge1xuICAgIG5hbWU6ICdUZXN0JyxcbiAgICBvbjoge1xuICAgICAgcHVsbF9yZXF1ZXN0OiBudWxsLFxuICAgICAgcHVzaDoge1xuICAgICAgICBicmFuY2hlczogWydtYWluJywgJ3diZnknXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICAvLyBjZi4gaHR0cHM6Ly9kb2NzLmdpdGh1Yi5jb20vZW4vYWN0aW9ucy91c2luZy1qb2JzL3VzaW5nLWNvbmN1cnJlbmN5I2V4YW1wbGUtb25seS1jYW5jZWwtaW4tcHJvZ3Jlc3Mtam9icy1vci1ydW5zLWZvci10aGUtY3VycmVudC13b3JrZmxvd1xuICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0tJHt7IGdpdGh1Yi5yZWYgfX0nLFxuICAgICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IHRydWUsXG4gICAgfSxcbiAgICBwZXJtaXNzaW9uczoge1xuICAgICAgLy8gZm9yIGxpbnRlciBmaXhcbiAgICAgIGNvbnRlbnRzOiAnd3JpdGUnLFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgdGVzdDoge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3Rlc3QueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICByZWxlYXNlOiB7XG4gICAgbmFtZTogJ1JlbGVhc2UnLFxuICAgIG9uOiB7XG4gICAgICBwdXNoOiB7XG4gICAgICAgIGJyYW5jaGVzOiBbXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBjb25jdXJyZW5jeToge1xuICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19JyxcbiAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiBmYWxzZSxcbiAgICB9LFxuICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAvLyBodHRwczovL2RvY3MubnBtanMuY29tL3RydXN0ZWQtcHVibGlzaGVycyNzdGVwLTItY29uZmlndXJlLXlvdXItY2ljZC13b3JrZmxvd1xuICAgICAgJ2lkLXRva2VuJzogJ3dyaXRlJyxcbiAgICAgIC8vIGZvciBzZW1hbnRpYy1yZWxlYXNlXG4gICAgICBjb250ZW50czogJ3dyaXRlJyxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgIHJlbGVhc2U6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9yZWxlYXNlLnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ3NlbWFudGljLXByJzoge1xuICAgIG5hbWU6ICdMaW50IFBSIHRpdGxlJyxcbiAgICBvbjoge1xuICAgICAgcHVsbF9yZXF1ZXN0X3RhcmdldDoge1xuICAgICAgICB0eXBlczogWydvcGVuZWQnLCAnZWRpdGVkJywgJ3N5bmNocm9uaXplJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ3NlbWFudGljLXByJzoge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3NlbWFudGljLXByLnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgc3luYzoge1xuICAgIG5hbWU6ICdTeW5jJyxcbiAgICBvbjoge30sXG4gICAgcGVybWlzc2lvbnM6IHtcbiAgICAgIC8vIGZvciBjb21taXRpbmcgY2hhbmdlc1xuICAgICAgY29udGVudHM6ICd3cml0ZScsXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICBzeW5jOiB7IHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3Mvc3luYy55bWxAbWFpbicgfSxcbiAgICB9LFxuICB9LFxuICAnY2xvc2UtY29tbWVudCc6IHtcbiAgICBuYW1lOiAnQWRkIGNsb3NlIGNvbW1lbnQnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3Q6IHtcbiAgICAgICAgdHlwZXM6IFsnb3BlbmVkJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ2Nsb3NlLWNvbW1lbnQnOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvY2xvc2UtY29tbWVudC55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gICdnZW4tcHItY2xhdWRlJzoge1xuICAgIG5hbWU6ICdHZW5lcmF0ZSBQUiB3aXRoIENsYXVkZSBDb2RlJyxcbiAgICBvbjoge1xuICAgICAgaXNzdWVzOiB7XG4gICAgICAgIHR5cGVzOiBbJ2xhYmVsZWQnXSxcbiAgICAgIH0sXG4gICAgICBwdWxsX3JlcXVlc3Q6IHtcbiAgICAgICAgdHlwZXM6IFsnbGFiZWxlZCddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgICdnZW4tcHInOiB7XG4gICAgICAgIGlmOiBcImNvbnRhaW5zKGdpdGh1Yi5ldmVudC5sYWJlbC5uYW1lLCAnZ2VuLXByLWFsbCcpIHx8IGNvbnRhaW5zKGdpdGh1Yi5ldmVudC5sYWJlbC5uYW1lLCAnZ2VuLXByLWNsYXVkZScpXCIsXG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvZ2VuLXByLnltbEBtYWluJyxcbiAgICAgICAgd2l0aDoge1xuICAgICAgICAgICdjb2RpbmctdG9vbCc6ICdjbGF1ZGUtY29kZScsXG4gICAgICAgICAgJ2lzc3VlLW51bWJlcic6ICcke3sgZ2l0aHViLmV2ZW50Lmlzc3VlLm51bWJlciB8fCBnaXRodWIuZXZlbnQubnVtYmVyIH19JyxcbiAgICAgICAgICAndGVzdC1jb21tYW5kJzogJ3lhcm58YnVuIGNoZWNrLWFsbC1mb3ItYWknLFxuICAgICAgICB9LFxuICAgICAgICBzZWNyZXRzOiB7XG4gICAgICAgICAgQ0xBVURFX0NPREVfT0FVVEhfVE9LRU46ICcke3sgc2VjcmV0cy5DTEFVREVfQ09ERV9PQVVUSF9UT0tFTiB9fScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gICdnZW4tcHItY29kZXgnOiB7XG4gICAgbmFtZTogJ0dlbmVyYXRlIFBSIHdpdGggQ29kZXggQ0xJJyxcbiAgICBvbjoge1xuICAgICAgaXNzdWVzOiB7XG4gICAgICAgIHR5cGVzOiBbJ2xhYmVsZWQnXSxcbiAgICAgIH0sXG4gICAgICBwdWxsX3JlcXVlc3Q6IHtcbiAgICAgICAgdHlwZXM6IFsnbGFiZWxlZCddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgICdnZW4tcHInOiB7XG4gICAgICAgIGlmOiBcImNvbnRhaW5zKGdpdGh1Yi5ldmVudC5sYWJlbC5uYW1lLCAnZ2VuLXByLWFsbCcpIHx8IGNvbnRhaW5zKGdpdGh1Yi5ldmVudC5sYWJlbC5uYW1lLCAnZ2VuLXByLWNvZGV4JylcIixcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9nZW4tcHIueW1sQG1haW4nLFxuICAgICAgICB3aXRoOiB7XG4gICAgICAgICAgJ2NvZGluZy10b29sJzogJ2NvZGV4LWNsaScsXG4gICAgICAgICAgJ2lzc3VlLW51bWJlcic6ICcke3sgZ2l0aHViLmV2ZW50Lmlzc3VlLm51bWJlciB8fCBnaXRodWIuZXZlbnQubnVtYmVyIH19JyxcbiAgICAgICAgICAndGVzdC1jb21tYW5kJzogJ3lhcm58YnVuIGNoZWNrLWFsbC1mb3ItYWknLFxuICAgICAgICB9LFxuICAgICAgICBzZWNyZXRzOiB7XG4gICAgICAgICAgT1BFTkFJX0FQSV9LRVk6ICcke3sgc2VjcmV0cy5PUEVOQUlfQVBJX0tFWSB9fScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gICdnZW4tcHItZ2VtaW5pJzoge1xuICAgIG5hbWU6ICdHZW5lcmF0ZSBQUiB3aXRoIEdlbWluaSBDTEknLFxuICAgIG9uOiB7XG4gICAgICBpc3N1ZXM6IHtcbiAgICAgICAgdHlwZXM6IFsnbGFiZWxlZCddLFxuICAgICAgfSxcbiAgICAgIHB1bGxfcmVxdWVzdDoge1xuICAgICAgICB0eXBlczogWydsYWJlbGVkJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ2dlbi1wcic6IHtcbiAgICAgICAgaWY6IFwiY29udGFpbnMoZ2l0aHViLmV2ZW50LmxhYmVsLm5hbWUsICdnZW4tcHItYWxsJykgfHwgY29udGFpbnMoZ2l0aHViLmV2ZW50LmxhYmVsLm5hbWUsICdnZW4tcHItZ2VtaW5pJylcIixcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9nZW4tcHIueW1sQG1haW4nLFxuICAgICAgICB3aXRoOiB7XG4gICAgICAgICAgJ2NvZGluZy10b29sJzogJ2dlbWluaS1jbGknLFxuICAgICAgICAgICdpc3N1ZS1udW1iZXInOiAnJHt7IGdpdGh1Yi5ldmVudC5pc3N1ZS5udW1iZXIgfHwgZ2l0aHViLmV2ZW50Lm51bWJlciB9fScsXG4gICAgICAgICAgJ3Rlc3QtY29tbWFuZCc6ICd5YXJufGJ1biBjaGVjay1hbGwtZm9yLWFpJyxcbiAgICAgICAgfSxcbiAgICAgICAgc2VjcmV0czoge1xuICAgICAgICAgIEdFTUlOSV9BUElfS0VZOiAnJHt7IHNlY3JldHMuR0VNSU5JX0FQSV9LRVkgfX0nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxufSBhcyBjb25zdDtcblxudHlwZSBLbm93bktpbmQgPSBrZXlvZiB0eXBlb2Ygd29ya2Zsb3dzIHwgJ2RlcGxveScgfCAnYXV0b2ZpeCc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVdvcmtmbG93cyhyb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVXb3JrZmxvdycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8ocm9vdENvbmZpZy5yZXBvc2l0b3J5KSkge1xuICAgICAgLy8gRG9uJ3QgdG91Y2ggcmV1c2FibGUtd29ya2Zsb3dzIHJlcG8gYmVjYXVzZSBpdCBob3N0cyB1cHN0cmVhbSB3b3JrZmxvdyBkZWZpbml0aW9ucy5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB3b3JrZmxvd3NQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5naXRodWInLCAnd29ya2Zsb3dzJyk7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIod29ya2Zsb3dzUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICAvLyBSZW1vdmUgY29uZmlnIG9mIHNlbWFudGljIHB1bGwgcmVxdWVzdFxuICAgIGNvbnN0IHNlbWFudGljWW1sUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcuZ2l0aHViJywgJ3NlbWFudGljLnltbCcpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShzZW1hbnRpY1ltbFBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KSk7XG5cbiAgICBjb25zdCBlbnRyaWVzID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcih3b3JrZmxvd3NQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgY29uc3QgZmlsZU5hbWVTZXQgPSBuZXcgU2V0KFtcbiAgICAgICd0ZXN0LnltbCcsXG4gICAgICAnYXV0b2ZpeC55bWwnLFxuICAgICAgJ3NlbWFudGljLXByLnltbCcsXG4gICAgICAnY2xvc2UtY29tbWVudC55bWwnLFxuICAgICAgJ2dlbi1wci1jbGF1ZGUueW1sJyxcbiAgICAgICdnZW4tcHItY29kZXgueW1sJyxcbiAgICAgICdnZW4tcHItZ2VtaW5pLnltbCcsXG4gICAgICAuLi5lbnRyaWVzLmZpbHRlcigoZGlyZW50KSA9PiBkaXJlbnQuaXNGaWxlKCkgJiYgZGlyZW50Lm5hbWUuZW5kc1dpdGgoJy55bWwnKSkubWFwKChkaXJlbnQpID0+IGRpcmVudC5uYW1lKSxcbiAgICBdKTtcbiAgICBpZiAocm9vdENvbmZpZy5kZXBlbmRpbmcuc2VtYW50aWNSZWxlYXNlKSB7XG4gICAgICBmaWxlTmFtZVNldC5hZGQoJ3JlbGVhc2UueW1sJyk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBmaWxlTmFtZSBvZiBmaWxlTmFtZVNldCkge1xuICAgICAgLy8g5a6f6Zqb44GvS25vd25LaW5k5Lul5aSW44Gu5YCk44KC5Luj5YWl44GV44KM44KL44GT44Go44Gr5rOo5oSPXG4gICAgICBjb25zdCBraW5kID0gcGF0aC5iYXNlbmFtZShmaWxlTmFtZSwgJy55bWwnKSBhcyBLbm93bktpbmQ7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gd3JpdGVXb3JrZmxvd1lhbWwocm9vdENvbmZpZywgd29ya2Zsb3dzUGF0aCwga2luZCkpO1xuICAgIH1cbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyhyZXBvc2l0b3J5Pzogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiByZXBvc2l0b3J5Py5lbmRzV2l0aCgnL3JldXNhYmxlLXdvcmtmbG93cycpID8/IGZhbHNlO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZVdvcmtmbG93WWFtbChjb25maWc6IFBhY2thZ2VDb25maWcsIHdvcmtmbG93c1BhdGg6IHN0cmluZywga2luZDogS25vd25LaW5kKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKHdvcmtmbG93c1BhdGgsIGAke2tpbmR9LnltbGApO1xuICBjb25zdCBkZXBsb3lQcm9kdWN0aW9uV29ya2Zsb3dFeGlzdHMgPSBmcy5leGlzdHNTeW5jKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAnZGVwbG95LXByb2R1Y3Rpb24ueW1sJykpO1xuXG4gIGlmIChraW5kID09PSAnYXV0b2ZpeCcpIHtcbiAgICBhd2FpdCB3cml0ZVlhbWwoZ2VuZXJhdGVBdXRvZml4V29ya2Zsb3coY29uZmlnKSwgZmlsZVBhdGgpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBuZXdTZXR0aW5ncyA9IGNsb25lRGVlcChraW5kIGluIHdvcmtmbG93cyA/IHdvcmtmbG93c1traW5kIGFzIGtleW9mIHR5cGVvZiB3b3JrZmxvd3NdIDoge30pIGFzIFdvcmtmbG93O1xuICAvLyBTa2lwIGEgYnJva2VuIHdvcmtmbG93XG4gIGlmICghKCdqb2JzJyBpbiBuZXdTZXR0aW5ncykpIHJldHVybjtcblxuICB0cnkge1xuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICBjb25zdCBvbGRTZXR0aW5ncyA9IHlhbWwubG9hZChvbGRDb250ZW50KSBhcyBXb3JrZmxvdztcbiAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHsgYXJyYXlNZXJnZTogY29tYmluZU1lcmdlIH0pIGFzIFdvcmtmbG93O1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cblxuICBpZiAoa2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSkge1xuICAgIG5ld1NldHRpbmdzID0ge1xuICAgICAgLi4ubmV3U2V0dGluZ3MsXG4gICAgICBjb25jdXJyZW5jeToge1xuICAgICAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0nLFxuICAgICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogZmFsc2UsXG4gICAgICB9LFxuICAgIH07XG4gICAgLy8gTW92ZSBqb2JzIHRvIHRoZSBib3R0b21cbiAgICBtb3ZlVG9Cb3R0b20obmV3U2V0dGluZ3MsICdqb2JzJyk7XG4gICAgaWYgKG5ld1NldHRpbmdzLm9uPy5wdXNoKSB7XG4gICAgICBuZXdTZXR0aW5ncy5vbi5wdXNoWydwYXRocy1pZ25vcmUnXSA9IFtcbiAgICAgICAgLi4ubmV3IFNldChbJyoqLm1kJywgJyoqL2RvY3MvKionLCAuLi4obmV3U2V0dGluZ3Mub24ucHVzaFsncGF0aHMtaWdub3JlJ10gPz8gW10pXSksXG4gICAgICBdO1xuICAgIH1cbiAgfVxuXG4gIGlmIChraW5kID09PSAncmVsZWFzZScgJiYgbmV3U2V0dGluZ3Muam9icy5yZWxlYXNlICYmIGRlcGxveVByb2R1Y3Rpb25Xb3JrZmxvd0V4aXN0cykge1xuICAgIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zID8/PSB7fTtcbiAgICBuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucy5hY3Rpb25zID0gJ3dyaXRlJztcbiAgICBuZXdTZXR0aW5ncy5qb2JzLnJlbGVhc2Uud2l0aCA/Pz0ge307XG4gICAgbmV3U2V0dGluZ3Muam9icy5yZWxlYXNlLndpdGgudHJpZ2dlcl9kZXBsb3lfd29ya2Zsb3cgPSAnZGVwbG95LXByb2R1Y3Rpb24ueW1sJztcbiAgfVxuXG4gIGxldCBpc1JldXNhYmxlV29ya2Zsb3cgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBqb2Igb2YgT2JqZWN0LnZhbHVlcyhuZXdTZXR0aW5ncy5qb2JzKSkge1xuICAgIC8vIElnbm9yZSBub24tcmV1c2FibGUgd29ya2Zsb3dzXG4gICAgaWYgKCFqb2IudXNlcz8uaW5jbHVkZXMoJy9yZXVzYWJsZS13b3JrZmxvd3MvJykpIGNvbnRpbnVlO1xuXG4gICAgbm9ybWFsaXplSm9iKGNvbmZpZywgam9iLCBraW5kKTtcbiAgICBpc1JldXNhYmxlV29ya2Zsb3cgPSB0cnVlO1xuICB9XG4gIGlmICghaXNSZXVzYWJsZVdvcmtmbG93KSByZXR1cm47XG5cbiAgc3dpdGNoIChraW5kKSB7XG4gICAgY2FzZSAncmVsZWFzZSc6IHtcbiAgICAgIGlmIChuZXdTZXR0aW5ncy5vbj8uc2NoZWR1bGUpIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLm9uLnB1c2g7XG4gICAgICB9IGVsc2UgaWYgKG5ld1NldHRpbmdzLm9uPy5wdXNoICYmIGNvbmZpZy5yZWxlYXNlLmJyYW5jaGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbmV3U2V0dGluZ3Mub24ucHVzaC5icmFuY2hlcyA9IGNvbmZpZy5yZWxlYXNlLmJyYW5jaGVzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRG9uJ3QgdXNlIHJlbGVhc2UueW1sIGlmIHJlbGVhc2UgYnJhbmNoIGlzIG5vdCBzcGVjaWZpZWRcbiAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsICdyZWxlYXNlLnltbCcpLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmlzUHVibGljUmVwbykge1xuICAgICAgICBuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucyA/Pz0ge307XG4gICAgICAgIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zWydpZC10b2tlbiddID0gJ3dyaXRlJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucz8uWydpZC10b2tlbiddO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgJ3Rlc3QnOiB7XG4gICAgICAvLyBEb24ndCB1c2UgYHBhdGhzLWlnbm9yZWAgZm9yIHRlc3QgYmVjYXVzZSBHaXRIdWIncyBCcmFuY2ggUHJvdGVjdGlvbiBhbmQgUnVsZXNldHMgcmVxdWlyZSBqb2IgcnVubmluZy5cbiAgICAgIGlmIChuZXdTZXR0aW5ncy5vbj8ucHVsbF9yZXF1ZXN0KSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5vbi5wdWxsX3JlcXVlc3RbJ3BhdGhzLWlnbm9yZSddO1xuICAgICAgfVxuICAgICAgaWYgKG5ld1NldHRpbmdzLm9uPy5wdXNoKSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5vbi5wdXNoWydwYXRocy1pZ25vcmUnXTtcbiAgICAgICAgbmV3U2V0dGluZ3Mub24ucHVzaC5icmFuY2hlcyA9IG5ld1NldHRpbmdzLm9uLnB1c2guYnJhbmNoZXMuZmlsdGVyKChicmFuY2gpID0+IGJyYW5jaCAhPT0gJ3Jlbm92YXRlLyoqJyk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgLy8gTm8gZGVmYXVsdFxuICB9XG4gIGF3YWl0IHdyaXRlWWFtbChuZXdTZXR0aW5ncywgZmlsZVBhdGgpO1xuXG4gIGlmIChraW5kID09PSAnc3luYycpIHtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgJ3N5bmMtaW5pdC55bWwnKSwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICBpZiAoIW5ld1NldHRpbmdzLmpvYnMuc3luYz8ud2l0aCkgcmV0dXJuO1xuXG4gICAgLy8gR2VuZXJhdGUgc3luYy1mb3JjZS55bWwgYmFzZWQgb24gc3luYy55bWwgaWYgaXQgZXhpc3RzLlxuICAgIG5ld1NldHRpbmdzLmpvYnNbJ3N5bmMtZm9yY2UnXSA9IG5ld1NldHRpbmdzLmpvYnMuc3luYztcbiAgICBjb25zdCBwYXJhbXMgPSBuZXdTZXR0aW5ncy5qb2JzLnN5bmMud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3Q7XG4gICAgaWYgKHR5cGVvZiBwYXJhbXMgIT09ICdzdHJpbmcnKSByZXR1cm47XG5cbiAgICBuZXdTZXR0aW5ncy5qb2JzLnN5bmMud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3QgPSBgLS1mb3JjZSAke3BhcmFtc31gO1xuICAgIG5ld1NldHRpbmdzLm5hbWUgPSAnRm9yY2UgdG8gU3luYyc7XG4gICAgbmV3U2V0dGluZ3Mub24gPSB7IHdvcmtmbG93X2Rpc3BhdGNoOiBudWxsIH07XG4gICAgZGVsZXRlIG5ld1NldHRpbmdzLmpvYnMuc3luYztcbiAgICBhd2FpdCB3cml0ZVlhbWwobmV3U2V0dGluZ3MsIHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAnc3luYy1mb3JjZS55bWwnKSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplSm9iKGNvbmZpZzogUGFja2FnZUNvbmZpZywgam9iOiBKb2IsIGtpbmQ6IEtub3duS2luZCk6IHZvaWQge1xuICBqb2Iud2l0aCA/Pz0ge307XG4gIGpvYi5zZWNyZXRzID8/PSB7fTtcbiAgLy8gVXNlIHRydXN0ZWQgcHVibGlzaGluZyBpbnN0ZWFkIG9mIE5QTV9UT0tFTlxuICBkZWxldGUgam9iLnNlY3JldHMuTlBNX1RPS0VOO1xuXG4gIGlmIChcbiAgICBraW5kID09PSAndGVzdCcgfHxcbiAgICBraW5kID09PSAncmVsZWFzZScgfHxcbiAgICBraW5kID09PSAnZ2VuLXByLWNsYXVkZScgfHxcbiAgICBraW5kID09PSAnZ2VuLXByLWNvZGV4JyB8fFxuICAgIGtpbmQgPT09ICdnZW4tcHItZ2VtaW5pJ1xuICApIHtcbiAgICBqb2Iuc2VjcmV0cy5HSF9UT0tFTiA9ICcke3sgc2VjcmV0cy5HSVRIVUJfVE9LRU4gfX0nO1xuICB9XG5cbiAgLy8gU2V0IHRlc3QtY29tbWFuZCBmb3IgZ2VuLXByIHdvcmtmbG93cyBiYXNlZCBvbiBwYWNrYWdlIG1hbmFnZXJcbiAgaWYgKGtpbmQgPT09ICdnZW4tcHItY2xhdWRlJyB8fCBraW5kID09PSAnZ2VuLXByLWNvZGV4JyB8fCBraW5kID09PSAnZ2VuLXByLWdlbWluaScpIHtcbiAgICBqb2Iud2l0aFsndGVzdC1jb21tYW5kJ10gPSBjb25maWcuaXNCdW4gPyAnYnVuIHJ1biBjaGVjay1hbGwtZm9yLWFpJyA6ICd5YXJuIGNoZWNrLWFsbC1mb3ItYWknO1xuICB9XG4gIGlmIChqb2Iuc2VjcmV0cy5GSVJFQkFTRV9UT0tFTikge1xuICAgIGpvYi5zZWNyZXRzLkdDUF9TQV9LRVlfSlNPTl9GT1JfRklSRUJBU0UgPSAnJHt7IHNlY3JldHMuR0NQX1NBX0tFWV9KU09OX0ZPUl9GSVJFQkFTRSB9fSc7XG4gICAgZGVsZXRlIGpvYi5zZWNyZXRzLkZJUkVCQVNFX1RPS0VOO1xuICB9XG4gIGlmIChcbiAgICAoam9iLnNlY3JldHMuRElTQ09SRF9XRUJIT09LX1VSTCAmJiAoa2luZCA9PT0gJ3JlbGVhc2UnIHx8IGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykpKSB8fFxuICAgIChqb2Iud2l0aC5zZXJ2ZXJfdXJsICYmIGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykpXG4gICkge1xuICAgIGpvYi5zZWNyZXRzLkRJU0NPUkRfV0VCSE9PS19VUkwgPSAnJHt7IHNlY3JldHMuRElTQ09SRF9XRUJIT09LX1VSTF9GT1JfUkVMRUFTRSB9fSc7XG4gIH1cblxuICBpZiAoa2luZCA9PT0gJ3N5bmMnKSB7XG4gICAgY29uc3QgcGFyYW1zID0gam9iLndpdGguc3luY19wYXJhbXNfd2l0aG91dF9kZXN0O1xuICAgIGlmICh0eXBlb2YgcGFyYW1zID09PSAnc3RyaW5nJykge1xuICAgICAgam9iLndpdGguc3luY19wYXJhbXNfd2l0aG91dF9kZXN0ID0gcGFyYW1zLnJlcGxhY2UoJ3N5bmMgJywgJycpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyLycpKSB7XG4gICAgam9iLnVzZXMgPSBqb2IudXNlcz8ucmVwbGFjZSgnV2lsbEJvb3N0ZXJMYWIvJywgJ1dpbGxCb29zdGVyLycpO1xuICB9IGVsc2UgaWYgKGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJykpIHtcbiAgICBqb2IudXNlcyA9IGpvYi51c2VzPy5yZXBsYWNlKCdXaWxsQm9vc3Rlci8nLCAnV2lsbEJvb3N0ZXJMYWIvJyk7XG4gIH1cblxuICAvLyBSZW1vdmUgcmVkdW5kYW50IHBhcmFtZXRlcnNcbiAgaWYgKGpvYi53aXRoLmRvdF9lbnZfcGF0aCA9PT0gJy5lbnYnKSB7XG4gICAgZGVsZXRlIGpvYi53aXRoLmRvdF9lbnZfcGF0aDtcbiAgfVxuXG4gIC8vIERvbid0IHVzZSBgZmx5IGRlcGxveSAtLWpzb25gIHNpbmNlIGl0IGNhdXNlcyBhbiBlcnJvclxuICBpZiAoa2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSAmJiBqb2Iuc2VjcmV0cy5GTFlfQVBJX1RPS0VOICYmIHR5cGVvZiBqb2Iud2l0aC5kZXBsb3lfY29tbWFuZCA9PT0gJ3N0cmluZycpIHtcbiAgICBqb2Iud2l0aC5kZXBsb3lfY29tbWFuZCA9IGpvYi53aXRoLmRlcGxveV9jb21tYW5kLnJlcGxhY2UoL1xccystLWpzb24vLCAnJyk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbkRvY2tlcmZpbGUgJiYgIWpvYi53aXRoLmNpX2xhYmVsICYmIGtpbmQuc3RhcnRzV2l0aCgndGVzdCcpKSB7XG4gICAgam9iLndpdGguY2lfbGFiZWwgPSAnbGFyZ2UnO1xuICB9XG4gIC8vIEJlY2F1c2UgZ2l0aHViLmV2ZW50LnJlcG9zaXRvcnkucHJpdmF0ZSBpcyBhbHdheXMgdHJ1ZSBpZiBqb2IgaXMgc2NoZWR1bGVkXG4gIGlmIChraW5kID09PSAncmVsZWFzZScgfHwga2luZCA9PT0gJ3Rlc3QnIHx8IGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykpIHtcbiAgICBpZiAoY29uZmlnLmlzUHVibGljUmVwbykge1xuICAgICAgam9iLndpdGguZ2l0aHViX2hvc3RlZF9ydW5uZXIgPSB0cnVlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBkZWxldGUgam9iLndpdGguZ2l0aHViX2hvc3RlZF9ydW5uZXI7XG4gIH1cblxuICBpZiAoT2JqZWN0LmtleXMoam9iLndpdGgpLmxlbmd0aCA+IDApIHtcbiAgICBzb3J0S2V5cyhqb2Iud2l0aCk7XG4gIH0gZWxzZSB7XG4gICAgZGVsZXRlIGpvYi53aXRoO1xuICB9XG4gIGlmIChPYmplY3Qua2V5cyhqb2Iuc2VjcmV0cykubGVuZ3RoID4gMCkge1xuICAgIC8vIE1vdmUgc2VjcmV0cyBwcm9wIGFmdGVyIHdpdGggcHJvcFxuICAgIGNvbnN0IG5ld1NlY3JldHMgPSBzb3J0S2V5cyhqb2Iuc2VjcmV0cyk7XG4gICAgZGVsZXRlIGpvYi5zZWNyZXRzO1xuICAgIGpvYi5zZWNyZXRzID0gbmV3U2VjcmV0cztcbiAgfSBlbHNlIHtcbiAgICBkZWxldGUgam9iLnNlY3JldHM7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVBdXRvZml4V29ya2Zsb3coY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogV29ya2Zsb3cge1xuICBpZiAoIWNvbmZpZy5pc1B1YmxpY1JlcG8pIHtcbiAgICByZXR1cm4gY2xvbmVEZWVwKHByaXZhdGVSZXBvQXV0b2ZpeFdvcmtmbG93KTtcbiAgfVxuXG4gIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gY29uZmlnLmlzQnVuID8gJ2J1bicgOiAneWFybic7XG4gIGNvbnN0IHN0ZXBzOiBTdGVwW10gPSBbXG4gICAgeyB1c2VzOiAnYWN0aW9ucy9jaGVja291dEB2NicgfSxcbiAgICB7IHVzZXM6ICdhY3Rpb25zL3NldHVwLW5vZGVAdjYnLCB3aXRoOiB7ICdjaGVjay1sYXRlc3QnOiB0cnVlIH0gfSxcbiAgICAuLi4oY29uZmlnLmlzQnVuID8gW3sgdXNlczogJ292ZW4tc2gvc2V0dXAtYnVuQHYxJywgd2l0aDogeyAnYnVuLXZlcnNpb24nOiAnbGF0ZXN0JyB9IH1dIDogW10pLFxuICAgIHsgcnVuOiBgJHtwYWNrYWdlTWFuYWdlcn0gaW5zdGFsbGAgfSxcbiAgICB7IHJ1bjogYCR7cGFja2FnZU1hbmFnZXJ9IHJ1biBjbGVhbnVwYCB9LFxuICBdO1xuICBpZiAoY29uZmlnLnBhY2thZ2VKc29uPy5zY3JpcHRzPy5idWlsZCkge1xuICAgIHN0ZXBzLnB1c2goeyBydW46IGAke3BhY2thZ2VNYW5hZ2VyfSBydW4gYnVpbGRgIH0pO1xuICB9XG4gIHN0ZXBzLnB1c2goeyB1c2VzOiAnYXV0b2ZpeC1jaS9hY3Rpb25AdjEnIH0pO1xuXG4gIGNvbnN0IGF1dG9maXhXb3JrZmxvdyA9IGNsb25lRGVlcChwdWJsaWNSZXBvQXV0b2ZpeFdvcmtmbG93KTtcbiAgY29uc3QgYXV0b2ZpeEpvYiA9IGF1dG9maXhXb3JrZmxvdy5qb2JzLmF1dG9maXggPz8geyAncnVucy1vbic6ICd1YnVudHUtbGF0ZXN0JyB9O1xuICBhdXRvZml4V29ya2Zsb3cuam9icy5hdXRvZml4ID0geyAuLi5hdXRvZml4Sm9iLCBzdGVwcyB9O1xuICByZXR1cm4gYXV0b2ZpeFdvcmtmbG93O1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZVlhbWwobmV3U2V0dGluZ3M6IFdvcmtmbG93LCBmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHlhbWxUZXh0ID0geWFtbC5kdW1wKG5ld1NldHRpbmdzLCB7IGxpbmVXaWR0aDogLTEsIG5vQ29tcGF0TW9kZTogdHJ1ZSwgc3R5bGVzOiB7ICchIW51bGwnOiAnZW1wdHknIH0gfSk7XG4gIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShmaWxlUGF0aCwgeWFtbFRleHQpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYic7XG5cbmltcG9ydCB7IGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvIH0gZnJvbSAnLi4vZ2VuZXJhdG9ycy93b3JrZmxvdy5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4uL29wdGlvbnMuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJy4uL3V0aWxzL2dsb2JVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4VHlwb3MocGFja2FnZUNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFR5cG9zJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmIChpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyhwYWNrYWdlQ29uZmlnLnJlcG9zaXRvcnkpKSByZXR1cm47XG5cbiAgICBjb25zdCBkaXJQYXRoID0gcGFja2FnZUNvbmZpZy5kaXJQYXRoO1xuICAgIGNvbnN0IGRvY0ZpbGVzID0gYXdhaXQgZmcuZ2xvYignKiovKi5tZCcsIHsgZG90OiB0cnVlLCBjd2Q6IGRpclBhdGgsIGlnbm9yZTogZ2xvYklnbm9yZSB9KTtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRm91bmQgJHtkb2NGaWxlcy5sZW5ndGh9IG1hcmtkb3duIGZpbGVzIGluICR7ZGlyUGF0aH1gKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBtZEZpbGUgb2YgZG9jRmlsZXMpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIG1kRmlsZSk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICAgIGxldCBuZXdDb250ZW50ID0gZml4VHlwb3NJblRleHQoY29udGVudCk7XG4gICAgICAgIG5ld0NvbnRlbnQgPSByZXBsYWNlV2l0aENvbmZpZyhuZXdDb250ZW50LCBwYWNrYWdlQ29uZmlnLCAnZG9jJyk7XG4gICAgICAgIGlmIChjb250ZW50ICE9PSBuZXdDb250ZW50KSB7XG4gICAgICAgICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHRzRmlsZXMgPSBhd2FpdCBmZy5nbG9iKFxuICAgICAgW1xuICAgICAgICAne2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjanMsbWpzLGpzLGpzeCxjdHMsbXRzLHRzLHRzeH0nLFxuICAgICAgICAncGFja2FnZXMvKiove2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjanMsbWpzLGpzLGpzeCxjdHMsbXRzLHRzLHRzeH0nLFxuICAgICAgXSxcbiAgICAgIHsgZG90OiB0cnVlLCBjd2Q6IGRpclBhdGgsIGlnbm9yZTogZ2xvYklnbm9yZSB9XG4gICAgKTtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRm91bmQgJHt0c0ZpbGVzLmxlbmd0aH0gVHlwZVNjcmlwdCBmaWxlcyBpbiAke2RpclBhdGh9YCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgdHNGaWxlIG9mIHRzRmlsZXMpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIHRzRmlsZSk7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBsZXQgbmV3Q29udGVudCA9IGZpeFR5cG9zSW5Db2RlKG9sZENvbnRlbnQpO1xuICAgICAgbmV3Q29udGVudCA9IHJlcGxhY2VXaXRoQ29uZmlnKG5ld0NvbnRlbnQsIHBhY2thZ2VDb25maWcsICd0cycpO1xuXG4gICAgICBpZiAob2xkQ29udGVudCA9PT0gbmV3Q29udGVudCkgY29udGludWU7XG4gICAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KTtcbiAgICB9XG5cbiAgICBjb25zdCB0ZXh0QmFzZWRGaWxlcyA9IGF3YWl0IGZnLmdsb2IoJyoqLyoue2NzdixodG0saHRtbCx0c3YseG1sLHlhbWwseW1sfScsIHtcbiAgICAgIGRvdDogdHJ1ZSxcbiAgICAgIGN3ZDogZGlyUGF0aCxcbiAgICAgIGlnbm9yZTogZ2xvYklnbm9yZSxcbiAgICB9KTtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRm91bmQgJHt0ZXh0QmFzZWRGaWxlcy5sZW5ndGh9IHRleHQtYmFzZWQgZmlsZXMgaW4gJHtkaXJQYXRofWApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgdGV4dEJhc2VkRmlsZXMpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIGZpbGUpO1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgbGV0IG5ld0NvbnRlbnQgPSBmaXhUeXBvc0luVGV4dChvbGRDb250ZW50KTtcbiAgICAgIG5ld0NvbnRlbnQgPSByZXBsYWNlV2l0aENvbmZpZyhuZXdDb250ZW50LCBwYWNrYWdlQ29uZmlnLCAndGV4dCcpO1xuXG4gICAgICBpZiAob2xkQ29udGVudCA9PT0gbmV3Q29udGVudCkgY29udGludWU7XG4gICAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KTtcbiAgICB9XG5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZml4VHlwb3NJblRleHQoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNvbnRlbnRcbiAgICAucmVwbGFjZUFsbCgvXFxiY1xcLmZcXC4oW14kXSkvZywgJ2NmLiQxJylcbiAgICAucmVwbGFjZUFsbCgvXFxiZWdcXC4oW14kXSkvZywgJ2UuZy4kMScpXG4gICAgLnJlcGxhY2VBbGwoL1xcYmllXFwuKFteJF0pL2csICdpLmUuJDEnKTtcbn1cblxuZnVuY3Rpb24gZml4VHlwb3NJbkNvZGUoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNvbnRlbnRcbiAgICAucmVwbGFjZUFsbCgvXFwvXFwvKC4qKWNcXC5mXFwuL2csICcvLyQxY2YuJylcbiAgICAucmVwbGFjZUFsbCgvXFwvXFwvKC4qKWVnXFwuL2csICcvLyQxZS5nLicpXG4gICAgLnJlcGxhY2VBbGwoL1xcL1xcLyguKilpZVxcLi9nLCAnLy8kMWkuZS4nKTtcbn1cblxuZnVuY3Rpb24gcmVwbGFjZVdpdGhDb25maWcobmV3Q29udGVudDogc3RyaW5nLCBwYWNrYWdlQ29uZmlnOiBQYWNrYWdlQ29uZmlnLCBwcm9wTmFtZTogJ2RvYycgfCAndHMnIHwgJ3RleHQnKTogc3RyaW5nIHtcbiAgZm9yIChjb25zdCBbYmVmb3JlLCBhZnRlcl0gb2YgT2JqZWN0LmVudHJpZXMocGFja2FnZUNvbmZpZy53YmZ5SnNvbj8udHlwb3M/LmFsbCA/PyB7fSkpIHtcbiAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlQWxsKGJlZm9yZSwgYWZ0ZXIpO1xuICB9XG4gIGZvciAoY29uc3QgW2JlZm9yZSwgYWZ0ZXJdIG9mIE9iamVjdC5lbnRyaWVzKHBhY2thZ2VDb25maWcud2JmeUpzb24/LnR5cG9zPy5bcHJvcE5hbWVdID8/IHt9KSkge1xuICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2VBbGwoYmVmb3JlLCBhZnRlcik7XG4gIH1cbiAgcmV0dXJuIG5ld0NvbnRlbnQ7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbnMnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFyb290Q29uZmlnLmlzUm9vdCkgcmV0dXJuO1xuXG4gICAgLy8gQ2hlY2sgaWYgQUdFTlRTX0VYVFJBLm1kIGV4aXN0cyBhbmQgcmVhZCBpdHMgY29udGVudFxuICAgIGNvbnN0IGFnZW50c0V4dHJhUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICdBR0VOVFNfRVhUUkEubWQnKTtcbiAgICBjb25zdCBleHRyYUNvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGFnZW50c0V4dHJhUGF0aCk7XG5cbiAgICBmb3IgKGNvbnN0IFtmaWxlTmFtZSwgdG9vbE5hbWVdIG9mIFtcbiAgICAgIFsnQUdFTlRTLm1kJywgJ0NvZGV4IENMSSddLFxuICAgICAgWydDTEFVREUubWQnLCAnQ2xhdWRlIENvZGUnXSxcbiAgICAgIFsnR0VNSU5JLm1kJywgJ0dlbWluaSBDTEknXSxcbiAgICBdIGFzIGNvbnN0KSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9uKHJvb3RDb25maWcsIGFsbENvbmZpZ3MsIHRvb2xOYW1lLCBleHRyYUNvbnRlbnQpO1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCBmaWxlTmFtZSk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgY29udGVudCkpO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnNvclJ1bGVzUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcuY3Vyc29yL3J1bGVzL2dlbmVyYWwubWRjJyk7XG4gICAgY29uc3QgY3Vyc29yUnVsZXNDb250ZW50ID0gZ2VuZXJhdGVDdXJzb3JHZW5lcmFsTWRjQ29udGVudChyb290Q29uZmlnLCBhbGxDb25maWdzLCBleHRyYUNvbnRlbnQpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGN1cnNvclJ1bGVzUGF0aCwgY3Vyc29yUnVsZXNDb250ZW50KSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb24oXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSxcbiAgdG9vbE5hbWU6IHN0cmluZyxcbiAgZXh0cmFDb250ZW50Pzogc3RyaW5nXG4pOiBzdHJpbmcge1xuICBjb25zdCBwYWNrYWdlTWFuYWdlciA9IHJvb3RDb25maWcuaXNCdW4gPyAnYnVuJyA6ICd5YXJuJztcbiAgY29uc3QgYmFzZUNvbnRlbnQgPSBgXG4jIyBQcm9qZWN0IEluZm9ybWF0aW9uXG5cbi0gTmFtZTogXFxgJHtyb290Q29uZmlnLnBhY2thZ2VKc29uPy5uYW1lIHx8ICd1bmtub3duJ31cXGBcbi0gRGVzY3JpcHRpb246ICR7cm9vdENvbmZpZy5wYWNrYWdlSnNvbj8uZGVzY3JpcHRpb259XG4tIFBhY2thZ2UgTWFuYWdlcjogJHtwYWNrYWdlTWFuYWdlcn1cblxuIyMgR2VuZXJhbCBJbnN0cnVjdGlvbnNcblxuLSBDcmVhdGUgYSBuZXcgYnJhbmNoIGlmIHRoZSBjdXJyZW50IGJyYW5jaCBpcyBcXGBtYWluXFxgLlxuLSBSdW4gYW55IFxcYGdpdFxcYCBjb21tYW5kcyBzZXF1ZW50aWFsbHkuXG4tIFdyaXRlIHRlc3RzIE9OTFkgaWYgZXhwbGljaXRseSByZXF1ZXN0ZWQuIElmIHJlcXVlc3RlZCwgZm9sbG93IHRoZXNlIHJ1bGVzOlxuICAtIENvbnRpbnVlIG1vZGlmeWluZyB0aGUgdGVzdHMgYW5kIGNvZGUgdW50aWwgYWxsIHRlc3RzIHBhc3MuXG4gIC0gRW5zdXJlIHRlc3RzIHJlc2V0IGFueSByZWxhdGVkIHBlcnNpc3RlbnQgZGF0YSwgYXMgb3VyIHRlc3QgaW5mcmFzdHJ1Y3R1cmUgZG9lcyBub3QgY2xlYXIgaXQgYXV0b21hdGljYWxseS5cbiAgLSBQcmVmZXIgYWN0dWFsIEFQSSBjYWxscyBvdmVyIG1vY2tzLiBVc2UgbW9ja3Mgd2hlbiBhY3R1YWwgY2FsbHMgYXJlIGltcHJhY3RpY2FsLCBoYXZlIHVuaW50ZW5kZWQgc2lkZSBlZmZlY3RzLCBvciBhcmUgZXhwbGljaXRseSByZXF1ZXN0ZWQuXG4tIEJlZm9yZSBmaXhpbmcgaXNzdWVzLCBhbHdheXMgaW52ZXN0aWdhdGUgdGhlIHJvb3QgY2F1c2UgZmlyc3QgKGUuZy4sIGJ5IGdhdGhlcmluZyBkZWJ1ZyBsb2dzLCB0YWtpbmcgc2NyZWVuc2hvdHMsIGV0Yy4pLlxuLSBBZnRlciBtYWtpbmcgY29kZSBjaGFuZ2VzLCBydW4gXFxgJHtwYWNrYWdlTWFuYWdlcn0gY2hlY2stYWxsLWZvci1haVxcYCB0byBleGVjdXRlIGFsbCB0ZXN0cyAodGFrZXMgdXAgdG8gMSBob3VyKSBvciBcXGAke3BhY2thZ2VNYW5hZ2VyfSBjaGVjay1mb3ItYWlcXGAgZm9yIHR5cGUgY2hlY2tpbmcgYW5kIGxpbnRpbmcgb25seSAodGFrZXMgdXAgdG8gMTAgbWludXRlcykuXG4gIC0gSWYgeW91IGFyZSBjb25maWRlbnQgeW91ciBjaGFuZ2VzIHdpbGwgbm90IGJyZWFrIGFueSB0ZXN0cywgeW91IG1heSB1c2UgXFxgY2hlY2stZm9yLWFpXFxgLlxuLSBPbmNlIHlvdSBoYXZlIHZlcmlmaWVkIHlvdXIgY2hhbmdlcywgY29tbWl0IGFuZCBwdXNoIHRoZW0gdG8gdGhlIGN1cnJlbnQgKG5vbi1tYWluKSBicmFuY2ggdGhlbiBjcmVhdGUgYSBQUiB2aWEgXFxgZ2hcXGAuXG4gIC0gRm9sbG93IHRoZSBjb252ZW50aW9uYWwgY29tbWl0czsgeW91ciBjb21taXQgbWVzc2FnZSBzaG91bGQgc3RhcnQgd2l0aCBcXGBmZWF0OlxcYCwgXFxgZml4OlxcYCwgZXRjLlxuICAtIElmIG5vdCBzcGVjaWZpZWQsIG1ha2Ugc3VyZSB0byBhZGQgYSBuZXcgbGluZSBhdCB0aGUgZW5kIG9mIHlvdXIgY29tbWl0IG1lc3NhZ2Uke3Jvb3RDb25maWcuaXNXaWxsQm9vc3RlclJlcG8gPyBgIHdpdGg6IFxcYENvLWF1dGhvcmVkLWJ5OiBXaWxsQm9vc3RlciAoJHt0b29sTmFtZX0pIDxhZ2VudEB3aWxsYm9vc3Rlci5jb20+XFxgYCA6ICcnfS5cbiAgLSBBbHdheXMgY3JlYXRlIG5ldyBjb21taXRzLiBBdm9pZCB1c2luZyBcXGAtLWFtZW5kXFxgLlxuJHtcbiAgYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmhhc1N0YXJ0VGVzdFNlcnZlcilcbiAgICA/IGAtIFVzZSBcXGAke3BhY2thZ2VNYW5hZ2VyfSBydW4gc3RhcnQtdGVzdC1zZXJ2ZXJcXGAgdG8gbGF1bmNoIGEgd2ViIHNlcnZlciBmb3IgZGVidWdnaW5nIG9yIHRlc3RpbmcuYFxuICAgIDogJydcbn1cblxuJHtnZW5lcmF0ZUFnZW50Q29kaW5nU3R5bGUoYWxsQ29uZmlncyl9XG5gXG4gICAgLnJlcGxhY2VBbGwoL1xcLlxcblxcbistL2csICcuXFxuLScpXG4gICAgLnJlcGxhY2VBbGwoL1xcbnszLH0vZywgJ1xcblxcbicpXG4gICAgLnRyaW0oKTtcblxuICBjb25zdCBoYXNOZXdTZWN0aW9uID0gZXh0cmFDb250ZW50Py50cmltKCkuc3RhcnRzV2l0aCgnIycpO1xuICBjb25zdCBub3JtYWxpemVkRXh0cmFDb250ZW50ID0gZXh0cmFDb250ZW50XG4gICAgPyBoYXNOZXdTZWN0aW9uXG4gICAgICA/ICdcXG5cXG4nICsgZXh0cmFDb250ZW50LnRyaW0oKVxuICAgICAgOiAnXFxuJyArIGV4dHJhQ29udGVudFxuICAgIDogJyc7XG4gIHJldHVybiBiYXNlQ29udGVudCArIG5vcm1hbGl6ZWRFeHRyYUNvbnRlbnQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUFnZW50Q29kaW5nU3R5bGUoYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogc3RyaW5nIHtcbiAgLy8gS2VlcCB0b3AtZG93biBvcmRlcmluZyBndWlkYW5jZSBmdW5jdGlvbi1vbmx5IGJlY2F1c2UgY2xhc3NlcyBhcmUgbm90IGhvaXN0ZWQgYW5kIGNhbiBmYWlsIHdoZW4gaW5oZXJpdGFuY2Ugb3IgdG9wLWxldmVsIGluc3RhbnRpYXRpb24gZGVwZW5kcyBvbiBkZWNsYXJhdGlvbiBvcmRlci5cbiAgcmV0dXJuIGBcbiMjIENvZGluZyBTdHlsZVxuXG4tIFVzZSBjYW1lbENhc2UgZm9yIEphdmFTY3JpcHQgYW5kIFR5cGVTY3JpcHQgZmlsZXMgKG9yIFBhc2NhbENhc2UgZm9yIFJlYWN0IGNvbXBvbmVudHMpLlxuLSBTaW1wbGlmeSBjb2RlIGFzIG11Y2ggYXMgcG9zc2libGUgdG8gZWxpbWluYXRlIHJlZHVuZGFuY3kuXG4tIERlc2lnbiBlYWNoIG1vZHVsZSB3aXRoIGhpZ2ggY29oZXNpb24sIGdyb3VwaW5nIHJlbGF0ZWQgZnVuY3Rpb25hbGl0eSB0b2dldGhlci5cbiAgLSBSZWZhY3RvciBleGlzdGluZyBsYXJnZSBtb2R1bGVzIGludG8gc21hbGxlciwgZm9jdXNlZCBtb2R1bGVzIHdoZW4gbmVjZXNzYXJ5LlxuICAtIENyZWF0ZSB3ZWxsLW9yZ2FuaXplZCBkaXJlY3Rvcnkgc3RydWN0dXJlcyB3aXRoIGxvdyBjb3VwbGluZyBhbmQgaGlnaCBjb2hlc2lvbi5cbi0gUGxhY2UgY2FsbGluZyBmdW5jdGlvbnMgaW4gdGhlIGZpbGUgYWJvdmUgdGhlIGZ1bmN0aW9ucyB0aGV5IGNhbGwgdG8gbWFpbnRhaW4gYSBjbGVhciB0b3AtZG93biBvcmRlci5cbiAgLSBlLmcuIFxcYGZ1bmN0aW9uIGNhbGxlcigpIHsgY2FsbGVlKCk7IH0gZnVuY3Rpb24gY2FsbGVlKCkgeyAuLi4gfVxcYFxuLSBXcml0ZSBjb21tZW50cyB0aGF0IGV4cGxhaW4gXCJ3aHlcIiByYXRoZXIgdGhhbiBcIndoYXRcIi4gQXZvaWQgc3RhdGluZyB3aGF0IGNhbiBiZSB1bmRlcnN0b29kIGZyb20gdGhlIGNvZGUgaXRzZWxmLlxuLSBQcmVmZXIgXFxgdW5kZWZpbmVkXFxgIG92ZXIgXFxgbnVsbFxcYCB1bmxlc3MgZXhwbGljaXRseSByZXF1aXJlZCBieSBBUElzIG9yIGxpYnJhcmllcy5cbi0gUHJlZmVyIHVzaW5nIGEgc2luZ2xlIHRlbXBsYXRlIGxpdGVyYWwgZm9yIHByb21wdHMgaW5zdGVhZCBvZiBcXGBqb2luKClcXGAgd2l0aCBhbiBhcnJheSBvZiBzdHJpbmdzLlxuJHtcbiAgYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRlcGVuZGluZy5nZW5JMThuVHMpXG4gICAgPyBgLSBXaGVuIGludHJvZHVjaW5nIG5ldyBzdHJpbmcgbGl0ZXJhbHMgaW4gUmVhY3QgY29tcG9uZW50cywgdXBkYXRlIHRoZSBsYW5ndWFnZSByZXNvdXJjZSBmaWxlcyBpbiB0aGUgXFxgaTE4blxcYCBkaXJlY3RvcnkgKGUuZy4sIFxcYGkxOG4vamEtSlAuanNvblxcYCkuIFJlZmVyZW5jZSB0aGVzZSBzdHJpbmdzIHVzaW5nIHRoZSBcXGBpMThuXFxgIHV0aWxpdHkuIEZvciBleGFtcGxlLCB1c2UgXFxgaTE4bi5wYWdlcy5ob21lLnRpdGxlKClcXGAgZm9yIFxcYHsgXCJwYWdlc1wiOiB7IFwiaG9tZVwiOiB7IFwidGl0bGVcIjogXCJNeSBBcHBcIiB9IH0gfVxcYC5gXG4gICAgOiAnJ1xufVxuJHtcbiAgYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRlcGVuZGluZy5yZWFjdCB8fCBjLmRlcGVuZGluZy5uZXh0KVxuICAgID8gYC0gUHJlZmVyIFxcYHVzZUltbWVyXFxgIGZvciBzdG9yaW5nIGFuIGFycmF5IG9yIGFuIG9iamVjdCB0byBcXGB1c2VTdGF0ZVxcYC5gXG4gICAgOiAnJ1xufVxuJHtcbiAgYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRlcGVuZGluZy5uZXh0KVxuICAgID8gYFxuLSBTaW5jZSB0aGlzIHByb2plY3QgdXNlcyB0aGUgUmVhY3QgQ29tcGlsZXIsIHlvdSBkbyBub3QgbmVlZCB0byB1c2UgXFxgdXNlQ2FsbGJhY2tcXGAgb3IgXFxgdXNlTWVtb1xcYCBmb3IgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uLlxuLSBBc3N1bWUgdGhlcmUgaXMgb25seSBhIHNpbmdsZSBzZXJ2ZXIgaW5zdGFuY2UuXG5gXG4gICAgOiAnJ1xufVxuYFxuICAgIC5yZXBsYWNlQWxsKC9cXC5cXG5cXG4rLS9nLCAnLlxcbi0nKVxuICAgIC5yZXBsYWNlQWxsKC9cXG57Myx9L2csICdcXG5cXG4nKVxuICAgIC50cmltKCk7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlQ3Vyc29yR2VuZXJhbE1kY0NvbnRlbnQoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdLFxuICBleHRyYUNvbnRlbnQ/OiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIGNvbnN0IGZyb250bWF0dGVyID0gYC0tLVxcbmRlc2NyaXB0aW9uOiBHZW5lcmFsIENvZGluZyBSdWxlc1xcbmdsb2JzOlxcbmFsd2F5c0FwcGx5OiB0cnVlXFxuLS0tYDtcbiAgY29uc3QgYm9keSA9IGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbihjb25maWcsIGFsbENvbmZpZ3MsICdDdXJzb3InLCBleHRyYUNvbnRlbnQpO1xuICByZXR1cm4gYCR7ZnJvbnRtYXR0ZXJ9XFxuXFxuJHtib2R5fWA7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVCaW9tZUpzb25jKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlQmlvbWVKc29uYycsIGFzeW5jICgpID0+IHtcbiAgICBsZXQgbmV3U2V0dGluZ3M6IG9iamVjdCA9IHtcbiAgICAgIHJvb3Q6IGNvbmZpZy5pc1Jvb3QsXG4gICAgICAkc2NoZW1hOiAnLi9ub2RlX21vZHVsZXMvQGJpb21lanMvYmlvbWUvY29uZmlndXJhdGlvbl9zY2hlbWEuanNvbicsXG4gICAgICBleHRlbmRzOiBbJ0B3aWxsYm9vc3Rlci9iaW9tZS1jb25maWcnXSxcbiAgICB9O1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnYmlvbWUuanNvbmMnKTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3Qgb2xkU2V0dGluZ3MgPSBKU09OLnBhcnNlKG9sZENvbnRlbnQpIGFzIG9iamVjdDtcbiAgICAgIG5ld1NldHRpbmdzID0gbWVyZ2UuYWxsKFtuZXdTZXR0aW5ncywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzXSwgeyBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KG5ld1NldHRpbmdzKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IHBhcnNlIH0gZnJvbSAnc21vbC10b21sJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5pbnRlcmZhY2UgQnVuZmlnVG9tbCB7XG4gIGluc3RhbGw/OiB7XG4gICAgZXhhY3Q/OiBib29sZWFuO1xuICB9O1xuICBydW4/OiB7XG4gICAgYnVuPzogYm9vbGVhbjtcbiAgfTtcbn1cblxuY29uc3QgbWluaW11bVJlbGVhc2VBZ2VFeGNsdWRlcyA9IFtcbiAgJ0BleGVyY29kZS9wcm9ibGVtLXV0aWxzJyxcbiAgJ0BuZXh0L2VudicsXG4gICdAbmV4dC9lc2xpbnQtcGx1Z2luLW5leHQnLFxuICAnQG5leHQvZm9udCcsXG4gICdAbmV4dC9yc3BhY2stYmluZGluZy1saW51eC1hcm02NC1nbnUnLFxuICAnQG5leHQvcnNwYWNrLWJpbmRpbmctbGludXgtYXJtNjQtbXVzbCcsXG4gICdAbmV4dC9yc3BhY2stYmluZGluZy1saW51eC14NjQtZ251JyxcbiAgJ0BuZXh0L3JzcGFjay1iaW5kaW5nLWxpbnV4LXg2NC1tdXNsJyxcbiAgJ0BuZXh0L3N3Yy1hbmRyb2lkLWFybS1lYWJpJyxcbiAgJ0BuZXh0L3N3Yy1hbmRyb2lkLWFybTY0JyxcbiAgJ0BuZXh0L3N3Yy1kYXJ3aW4tYXJtNjQnLFxuICAnQG5leHQvc3djLWRhcndpbi14NjQnLFxuICAnQG5leHQvc3djLWZyZWVic2QteDY0JyxcbiAgJ0BuZXh0L3N3Yy1saW51eC1hcm0tZ251ZWFiaWhmJyxcbiAgJ0BuZXh0L3N3Yy1saW51eC1hcm02NC1nbnUnLFxuICAnQG5leHQvc3djLWxpbnV4LWFybTY0LW11c2wnLFxuICAnQG5leHQvc3djLWxpbnV4LXg2NC1nbnUnLFxuICAnQG5leHQvc3djLWxpbnV4LXg2NC1tdXNsJyxcbiAgJ0BuZXh0L3N3Yy13YXNtLW5vZGVqcycsXG4gICdAbmV4dC9zd2Mtd2FzbS13ZWInLFxuICAnQG5leHQvc3djLXdpbjMyLWFybTY0LW1zdmMnLFxuICAnQG5leHQvc3djLXdpbjMyLWlhMzItbXN2YycsXG4gICdAbmV4dC9zd2Mtd2luMzIteDY0LW1zdmMnLFxuICAnQG5leHQvdGhpcmQtcGFydGllcycsXG4gICdAd2lsbGJvb3N0ZXIvYWdlbnQtc2tpbGxzJyxcbiAgJ0B3aWxsYm9vc3Rlci9iYWJlbC1jb25maWdzJyxcbiAgJ0B3aWxsYm9vc3Rlci9iaW9tZS1jb25maWcnLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctYmxpdHotbmV4dCcsXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcycsXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcy1yZWFjdCcsXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1uZXh0JyxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzJyxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzLXJlYWN0JyxcbiAgJ0B3aWxsYm9vc3Rlci9veGZtdC1jb25maWcnLFxuICAnQHdpbGxib29zdGVyL294bGludC1jb25maWcnLFxuICAnQHdpbGxib29zdGVyL3ByZXR0aWVyLWNvbmZpZycsXG4gICdAd2lsbGJvb3N0ZXIvcmVub3ZhdGUtY29uZmlnJyxcbiAgJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliJyxcbiAgJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLWJsaXR6LW5leHQnLFxuICAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbmV4dCcsXG4gICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlJyxcbiAgJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLXJlYWN0JyxcbiAgJ0B3aWxsYm9vc3Rlci93YicsXG4gICdhZ2VudC1ydW50aW1lLWtpdCcsXG4gICduZXh0JyxcbiAgJ3JlYWN0JyxcbiAgJ3JlYWN0LWRvbScsXG5dO1xuXG5jb25zdCBuZXdDb250ZW50ID0gKGV4aXN0aW5nQ29udGVudDogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nID0+IHtcbiAgY29uc3QgYnVuZmlnVG9tbCA9IHBhcnNlQnVuZmlnVG9tbChleGlzdGluZ0NvbnRlbnQpO1xuICByZXR1cm4gYGVudiA9IGZhbHNlXG50ZWxlbWV0cnkgPSBmYWxzZVxuXG4ke2dlbmVyYXRlUnVuU2VjdGlvbihidW5maWdUb21sKX1cbltpbnN0YWxsXVxuZXhhY3QgPSAke2J1bmZpZ1RvbWw/Lmluc3RhbGw/LmV4YWN0ID09PSBmYWxzZSA/ICdmYWxzZScgOiAndHJ1ZSd9XG5saW5rZXIgPSBcImhvaXN0ZWRcIlxubWluaW11bVJlbGVhc2VBZ2UgPSA0MzIwMDAgIyA1IGRheXNcbm1pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXMgPSBbXG4ke21pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXMubWFwKChwYWNrYWdlTmFtZSkgPT4gYCAgICBcIiR7cGFja2FnZU5hbWV9XCIsYCkuam9pbignXFxuJyl9XG5dXG5gO1xufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQnVuZmlnVG9tbChjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUJ1bmZpZ1RvbWwnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdidW5maWcudG9tbCcpO1xuICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpID8gZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmOCcpIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGNvbnRlbnQgPSBuZXdDb250ZW50KGV4aXN0aW5nQ29udGVudCk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlQnVuZmlnVG9tbChjb250ZW50OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBCdW5maWdUb21sIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFjb250ZW50KSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBwYXJzZShjb250ZW50KSBhcyBCdW5maWdUb21sO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlUnVuU2VjdGlvbihidW5maWdUb21sOiBCdW5maWdUb21sIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgcmV0dXJuIHR5cGVvZiBidW5maWdUb21sPy5ydW4/LmJ1biA9PT0gJ2Jvb2xlYW4nID8gYFtydW5dXFxuYnVuID0gJHtidW5maWdUb21sLnJ1bi5idW59XFxuYCA6ICcnO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuXG5jb25zdCB1c2VyQ29udGVudEhlYWRlciA9ICcjIFByb2plY3Qtc3BlY2lmaWMgc2V0dGluZ3MnO1xuY29uc3QgdXNlckNvbnRlbnRIZWFkZXJSZWdleCA9IC8jIFByb2plY3Qtc3BlY2lmaWMgc2V0dGluZ3NbXlxcbl0qXFxuL2dtO1xuY29uc3Qgc2VwYXJhdG9yID0gJyMgR2VuZXJhdGVkIGJ5IHdiZnknO1xuY29uc3Qgc2VwYXJhdG9yUHJlZml4ID0gJyMgR2VuZXJhdGVkIGJ5ICc7XG5jb25zdCBkZWZhdWx0SGVhZFVzZXJDb250ZW50ID0gYCR7dXNlckNvbnRlbnRIZWFkZXJ9IChoZWFkKVxuXG5cbiR7c2VwYXJhdG9yfVxuYDtcbmNvbnN0IGRlZmF1bHRUYWlsVXNlckNvbnRlbnQgPSBgXG4ke3VzZXJDb250ZW50SGVhZGVyfSAodGFpbClcbmA7XG5cbmV4cG9ydCBjb25zdCBpZ25vcmVGaWxlVXRpbCA9IHtcbiAgc2VwYXJhdG9yLFxuICBzZXBhcmF0b3JQcmVmaXgsXG4gIGRlZmF1bHRIZWFkVXNlckNvbnRlbnQsXG4gIGRlZmF1bHRUYWlsVXNlckNvbnRlbnQsXG4gIGFzeW5jIHJlYWRHaXRpZ25vcmVXaXRob3V0U2VwYXJhdG9ycyhmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICB0cnkge1xuICAgICAgbGV0IGNvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IGxhc3RIZWFkZXJJbmRleCA9IGdldEluZGV4T2ZUYWlsVXNlckNvbnRlbnRIZWFkZXIoY29udGVudCk7XG4gICAgICBpZiAobGFzdEhlYWRlckluZGV4ID4gMCkge1xuICAgICAgICBjb250ZW50ID0gY29udGVudC5zbGljZSgwLCBsYXN0SGVhZGVySW5kZXggLSAxKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNvbnRlbnRcbiAgICAgICAgICAucmVwbGFjZUFsbCh1c2VyQ29udGVudEhlYWRlclJlZ2V4LCAnJylcbiAgICAgICAgICAucmVwbGFjZUFsbCgvIyBHZW5lcmF0ZWQgYnkgW15cXG5dKlxcbi9nbSwgJycpXG4gICAgICAgICAgLnJlcGxhY2VBbGwoL1xccj9cXG5cXHI/XFxuKFxccj9cXG4pKy9nbSwgJ1xcblxcbicpXG4gICAgICAgICAgLnRyaW0oKSArICdcXG4nXG4gICAgICApO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgfSxcbiAgZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgaW5kZXggPSBjb250ZW50LmluZGV4T2YodGhpcy5zZXBhcmF0b3JQcmVmaXgpO1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgIHJldHVybiBjb250ZW50XG4gICAgICAgIC5zbGljZSgwLCBjb250ZW50LmluZGV4T2YoJ1xcbicsIGluZGV4KSArIDEpXG4gICAgICAgIC5yZXBsYWNlQWxsKHVzZXJDb250ZW50SGVhZGVyUmVnZXgsIGAke3VzZXJDb250ZW50SGVhZGVyfSAoaGVhZClcXG5gKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlZmF1bHRIZWFkVXNlckNvbnRlbnQ7XG4gIH0sXG4gIGdldFRhaWxVc2VyQ29udGVudChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGxhc3RIZWFkZXJJbmRleCA9IGdldEluZGV4T2ZUYWlsVXNlckNvbnRlbnRIZWFkZXIoY29udGVudCk7XG4gICAgaWYgKGxhc3RIZWFkZXJJbmRleCA+IDApIHtcbiAgICAgIHJldHVybiBjb250ZW50LnNsaWNlKGxhc3RIZWFkZXJJbmRleCAtIDEpO1xuICAgIH1cbiAgICByZXR1cm4gZGVmYXVsdFRhaWxVc2VyQ29udGVudDtcbiAgfSxcbiAgYXN5bmMgaXNCZXJyeVplcm9JbnN0YWxsRW5hYmxlZChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIHJldHVybiBjb250ZW50LmluY2x1ZGVzKCdcXG4hLnlhcm4vY2FjaGUnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0sXG59O1xuXG5mdW5jdGlvbiBnZXRJbmRleE9mVGFpbFVzZXJDb250ZW50SGVhZGVyKGNvbnRlbnQ6IHN0cmluZyk6IG51bWJlciB7XG4gIGNvbnN0IGluZGV4ID0gY29udGVudC5pbmRleE9mKHVzZXJDb250ZW50SGVhZGVyKTtcbiAgY29uc3QgbGFzdEluZGV4ID0gY29udGVudC5sYXN0SW5kZXhPZih1c2VyQ29udGVudEhlYWRlcik7XG4gIHJldHVybiBsYXN0SW5kZXggPiBpbmRleCA/IGxhc3RJbmRleCA6IC0xO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbi8vIEV4ZXJjb2Rl44Gn44Gvbm9kZV9tb2R1bGVz44KSQ09QWeOBmeOCi+W/heimgeOBjOOBguOCi+OBn+OCgeOAgW5vZGVfbW9kdWxlc+OCkumZpOWkluOBl+OBpuOBr+OBhOOBkeOBquOBhOOAglxuY29uc3QgY29tbW9uQ29udGVudCA9IGBcbioqLy5pZGVhXG4qKi8qLnNxbGl0ZTMqXG4qKi8ueWFybi9pbnN0YWxsLXN0YXRlLmd6XG4qKi8udmVudlxuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRG9ja2VyaWdub3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlRG9ja2VyaWdub3JlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmRvY2tlcmlnbm9yZScpO1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Eb2NrZXJmaWxlKSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gKGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGgpKSA/PyAnJztcbiAgICAgIGNvbnN0IGhlYWRVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldEhlYWRVc2VyQ29udGVudChjb250ZW50KTtcbiAgICAgIGNvbnN0IHRhaWxVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldFRhaWxVc2VyQ29udGVudChjb250ZW50KTtcblxuICAgICAgY29uc3QgbmV3Q29udGVudCA9IGhlYWRVc2VyQ29udGVudCArIGNvbW1vbkNvbnRlbnQgKyB0YWlsVXNlckNvbnRlbnQ7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH0pO1xufVxuIiwiZXhwb3J0IGNvbnN0IGV4dGVuc2lvbnMgPSB7XG4gIGNvZGVXaXRoMkluZGVudFNpemU6IFtcbiAgICAnY2pzJyxcbiAgICAnbWpzJyxcbiAgICAnanMnLFxuICAgICdqc3gnLFxuICAgICdjdHMnLFxuICAgICdtdHMnLFxuICAgICd0cycsXG4gICAgJ3RzeCcsXG4gICAgJ2pzb24nLFxuICAgICdqc29uNScsXG4gICAgJ2pzb25jJyxcbiAgICAnY3BwJyxcbiAgICAnZGFydCcsXG4gICAgJ2h0bScsXG4gICAgJ2h0bWwnLFxuICAgICdwdScsXG4gICAgJ3B1bWwnLFxuICAgICdyYicsXG4gICAgJ3Z1ZScsXG4gICAgJ3htbCcsXG4gICAgJ3lhbWwnLFxuICAgICd5bWwnLFxuICAgICdzaCcsXG4gIF0udG9Tb3J0ZWQoKSxcbiAgY29kZVdpdGg0SW5kZW50U2l6ZTogWydnbycsICdncmFkbGUnLCAnamF2YScsICdweSddLnRvU29ydGVkKCksXG4gIG1hcmtkb3duTGlrZTogWydtZCddLnRvU29ydGVkKCksXG4gIGVzbGludDogWydjanMnLCAnbWpzJywgJ2pzJywgJ2N0cycsICdtdHMnLCAndHMnLCAndHN4JywgJ2pzeCddLnRvU29ydGVkKCksXG4gIHByZXR0aWVyOiBbXG4gICAgJ2NqcycsXG4gICAgJ21qcycsXG4gICAgJ2phdmEnLFxuICAgICdqcycsXG4gICAgJ2pzeCcsXG4gICAgJ2N0cycsXG4gICAgJ210cycsXG4gICAgJ3RzJyxcbiAgICAndHN4JyxcbiAgICAnanNvbicsXG4gICAgJ2pzb241JyxcbiAgICAnanNvbmMnLFxuICAgICdjc3MnLFxuICAgICdodG0nLFxuICAgICdodG1sJyxcbiAgICAnbWQnLFxuICAgICdzY3NzJyxcbiAgICAndnVlJyxcbiAgICAneWFtbCcsXG4gICAgJ3ltbCcsXG4gIF0udG9Tb3J0ZWQoKSxcbiAgLy8gY2YuIGh0dHBzOi8vYmlvbWVqcy5kZXYvaW50ZXJuYWxzL2xhbmd1YWdlLXN1cHBvcnQvXG4gIGJpb21lOiBbXG4gICAgJ2NqcycsXG4gICAgJ21qcycsXG4gICAgJ2pzJyxcbiAgICAnanN4JyxcbiAgICAnY3RzJyxcbiAgICAnbXRzJyxcbiAgICAndHMnLFxuICAgICd0c3gnLFxuICAgICdqc29uJyxcbiAgICAnanNvbjUnLFxuICAgICdqc29uYycsXG4gICAgJ2h0bScsXG4gICAgJ2h0bWwnLFxuICAgICd2dWUnLFxuICAgICdzdmVsdGUnLFxuICAgICdhc3RybycsXG4gICAgJ2NzcycsXG4gICAgJ3lhbWwnLFxuICAgICd5bWwnLFxuICAgICdncWwnLFxuICBdLnRvU29ydGVkKCksXG59O1xuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBuZXdDb250ZW50ID0gYHJvb3QgPSB0cnVlXG5cblsqXVxuY2hhcnNldCA9IHV0Zi04XG5lbmRfb2ZfbGluZSA9IGxmXG5pbnNlcnRfZmluYWxfbmV3bGluZSA9IHRydWVcbnRyaW1fdHJhaWxpbmdfd2hpdGVzcGFjZSA9IHRydWVcblxuJHtnZW5lcmF0ZUV4dGVuc2lvbnMoZXh0ZW5zaW9ucy5jb2RlV2l0aDJJbmRlbnRTaXplKX1cbmluZGVudF9zaXplID0gMlxuaW5kZW50X3N0eWxlID0gc3BhY2VcblxuJHtnZW5lcmF0ZUV4dGVuc2lvbnMoZXh0ZW5zaW9ucy5jb2RlV2l0aDRJbmRlbnRTaXplKX1cbmluZGVudF9zaXplID0gNFxuaW5kZW50X3N0eWxlID0gc3BhY2VcblxuJHtnZW5lcmF0ZUV4dGVuc2lvbnMoZXh0ZW5zaW9ucy5tYXJrZG93bkxpa2UpfVxubWF4X2xpbmVfbGVuZ3RoID0gb2ZmXG50cmltX3RyYWlsaW5nX3doaXRlc3BhY2UgPSBmYWxzZVxuXG5be01ha2VmaWxlLCoubWt9XVxuaW5kZW50X3N0eWxlID0gdGFiXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVFZGl0b3Jjb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVFZGl0b3Jjb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZWRpdG9yY29uZmlnJyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIHJldHVybiBleHRlbnNpb25zLmxlbmd0aCA+IDEgPyBgWyoueyR7ZXh0ZW5zaW9ucy5qb2luKCcsJyl9fV1gIDogYFsqLiR7ZXh0ZW5zaW9uc1swXX1dYDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRXNsaW50cmMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVFc2xpbnRyYycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2VzbGludC5jb25maWcubWpzJyk7XG4gICAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWNvbmZpZy5lc2xpbnRCYXNlKSByZXR1cm47XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgaWYgKCFvbGRDb250ZW50LmluY2x1ZGVzKCdleHBvcnQgeyBkZWZhdWx0IH0nKSkgcmV0dXJuO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cblxuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBgZXhwb3J0IHsgZGVmYXVsdCB9IGZyb20gJyR7Y29uZmlnLmVzbGludEJhc2V9JztgKSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgeWFtbCBmcm9tICdqcy15YW1sJztcbmltcG9ydCBjbG9uZURlZXAgZnJvbSAnbG9kYXNoLmNsb25lZGVlcCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW1wb3J0IHsgZ2VuZXJhdGVBZ2VudENvZGluZ1N0eWxlIH0gZnJvbSAnLi9hZ2VudHMuanMnO1xuXG5jb25zdCBkZWZhdWx0Q29uZmlnID0ge1xuICBoYXZlX2Z1bjogdHJ1ZSxcbiAgY29kZV9yZXZpZXc6IHtcbiAgICBkaXNhYmxlOiBmYWxzZSxcbiAgICBjb21tZW50X3NldmVyaXR5X3RocmVzaG9sZDogJ01FRElVTScsXG4gICAgbWF4X3Jldmlld19jb21tZW50czogLTEsXG4gICAgcHVsbF9yZXF1ZXN0X29wZW5lZDoge1xuICAgICAgaGVscDogZmFsc2UsXG4gICAgICBzdW1tYXJ5OiB0cnVlLFxuICAgICAgY29kZV9yZXZpZXc6IHRydWUsXG4gICAgfSxcbiAgfSxcbiAgaWdub3JlX3BhdHRlcm5zOiBbJyoqL19fZ2VuZXJhdGVkX18nXSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUdlbWluaUNvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcsIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlR2VtaW5pQ29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghY29uZmlnLmlzUm9vdCkgcmV0dXJuO1xuXG4gICAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5nZW1pbmknKTtcbiAgICBjb25zdCBjb25maWdGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnY29uZmlnLnltbCcpO1xuICAgIGNvbnN0IHN0eWxlZ3VpZGVGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnc3R5bGVndWlkZS5tZCcpO1xuICAgIGNvbnN0IGFnZW50c0V4dHJhUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ0FHRU5UU19FWFRSQS5tZCcpO1xuXG4gICAgbGV0IG5ld0NvbmZpZzogb2JqZWN0ID0gY2xvbmVEZWVwKGRlZmF1bHRDb25maWcpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoY29uZmlnRmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBvbGRDb25maWcgPSB5YW1sLmxvYWQob2xkQ29udGVudCkgYXMgb2JqZWN0O1xuICAgICAgbmV3Q29uZmlnID0gbWVyZ2UuYWxsKFtuZXdDb25maWcsIG9sZENvbmZpZywgbmV3Q29uZmlnXSwgeyBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmcgLSBmaWxlIGRvZXNuJ3QgZXhpc3Qgb3IgY2FuJ3QgYmUgcGFyc2VkXG4gICAgfVxuXG4gICAgY29uc3QgeWFtbENvbnRlbnQgPSB5YW1sLmR1bXAobmV3Q29uZmlnLCB7XG4gICAgICBsaW5lV2lkdGg6IC0xLFxuICAgICAgbm9Db21wYXRNb2RlOiB0cnVlLFxuICAgICAgc3R5bGVzOiB7XG4gICAgICAgICchIW51bGwnOiAnZW1wdHknLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGV4dHJhQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoYWdlbnRzRXh0cmFQYXRoKTtcbiAgICBjb25zdCBjb2RpbmdSdWxlRXh0cmFDb250ZW50ID0gZXh0cmFDb250ZW50Py50cmltU3RhcnQoKS5zdGFydHNXaXRoKCcjJykgPyB1bmRlZmluZWQgOiBleHRyYUNvbnRlbnQ7XG4gICAgY29uc3Qgc3R5bGVndWlkZUNvbnRlbnQgPSBg5Lul5LiL44Gu44Kz44O844OH44Kj44Oz44Kw6KaP57SE44KS6LiP44G+44GI44Gm44CB5pel5pys6Kqe44Gn44Os44OT44Ol44O844GX44Gm44GP44Gg44GV44GE44CCXFxuXFxuJHtnZW5lcmF0ZUFnZW50Q29kaW5nU3R5bGUoYWxsQ29uZmlncyl9JHtcbiAgICAgIGNvZGluZ1J1bGVFeHRyYUNvbnRlbnQgPyBgXFxuJHtjb2RpbmdSdWxlRXh0cmFDb250ZW50LnRyaW1FbmQoKX1gIDogJydcbiAgICB9YDtcblxuICAgIGNvbnN0IHByb21pc2VzID0gW1xuICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoY29uZmlnRmlsZVBhdGgsIHlhbWxDb250ZW50KSksXG4gICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShzdHlsZWd1aWRlRmlsZVBhdGgsIHN0eWxlZ3VpZGVDb250ZW50KSksXG4gICAgXTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVtb3ZlR2VtaW5pU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHZW1pbmlTZXR0aW5ncycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWNvbmZpZy5pc1Jvb3QpIHJldHVybjtcblxuICAgIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2VtaW5pJyk7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3NldHRpbmdzLmpzb24nKTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbi8vIGNmLiBodHRwczovL2J1bi5zaC9ndWlkZXMvaW5zdGFsbC9naXQtZGlmZi1idW4tbG9ja2ZpbGVcbmNvbnN0IG5ld0NvbnRlbnQgPSBgKiB0ZXh0PWF1dG9cblxuKi5sb2NrYiBiaW5hcnkgZGlmZj1sb2NrYlxuKi52Y3Byb2ogdGV4dCBlb2w9Y3JsZlxuXG4ke1suLi5leHRlbnNpb25zLmNvZGVXaXRoMkluZGVudFNpemUsIC4uLmV4dGVuc2lvbnMuY29kZVdpdGg0SW5kZW50U2l6ZSwgLi4uZXh0ZW5zaW9ucy5tYXJrZG93bkxpa2VdXG4gIC5tYXAoKGV4dCkgPT4gYCouJHtleHR9IHRleHQgZW9sPWxmYClcbiAgLmpvaW4oJ1xcbicpfVxuXG5kaXN0LyoqIGxpbmd1aXN0LWdlbmVyYXRlZD10cnVlXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlR2l0YXR0cmlidXRlcycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRhdHRyaWJ1dGVzJyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgb3MgZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4uL29wdGlvbnMuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgaWdub3JlRmlsZVV0aWwgfSBmcm9tICcuLi91dGlscy9pZ25vcmVGaWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgZGVmYXVsdE5hbWVzID0gWyd3aW5kb3dzJywgJ21hY29zJywgJ2xpbnV4JywgJ2pldGJyYWlucycsICd2aXN1YWxzdHVkaW9jb2RlJywgJ2VtYWNzJywgJ3ZpbScsICd5YXJuJ107XG5cbmNvbnN0IGNvbW1vbkNvbnRlbnQgPSBgXG4hLmtlZXBcbi5haWRlcipcbi5lbnYucHJvZHVjdGlvblxuKi9tb3VudC8qLmhhc2hcbi5kZXZjb250YWluZXIvXG4uaWRlYS9BdWdtZW50V2Vidmlld1N0YXRlU3RvcmUueG1sXG4uaWRlYS9jb3BpbG90Lipcbi5pZGVhL2NvcGlsb3QvY2hhdFNlc3Npb25zL1xuLnBsYXl3cmlnaHQtY2xpL1xuLnNlcmVuYS9cbi50bXAvXG5fX2dlbmVyYXRlZF9fL1xuQHdpbGxib29zdGVyL1xuZGlzdC9cbnRlbXAvXG50bXAvXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHaXRpZ25vcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHaXRpZ25vcmUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aWdub3JlJyk7XG4gICAgY29uc3QgY29udGVudCA9IChhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoKSkgPz8gJyc7XG4gICAgbGV0IGhlYWRVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldEhlYWRVc2VyQ29udGVudChjb250ZW50KSArIGNvbW1vbkNvbnRlbnQ7XG4gICAgY29uc3QgdGFpbFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0VGFpbFVzZXJDb250ZW50KGNvbnRlbnQpO1xuXG4gICAgY29uc3QgbmFtZXMgPSBbLi4uZGVmYXVsdE5hbWVzXTtcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluR2VtZmlsZSkge1xuICAgICAgbmFtZXMucHVzaCgncnVieScpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluR29Nb2QpIHtcbiAgICAgIG5hbWVzLnB1c2goJ2dvJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYCR7cGF0aC5iYXNlbmFtZShjb25maWcuZGlyUGF0aCl9XG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24pIHtcbiAgICAgIG5hbWVzLnB1c2goJ25vZGUnKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvbVhtbCkge1xuICAgICAgbmFtZXMucHVzaCgnbWF2ZW4nKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLmlkZWEvZ29vZ2xlLWphdmEtZm9ybWF0LnhtbFxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBuYW1lcy5wdXNoKCdmbHV0dGVyJywgJ0FuZHJvaWRTdHVkaW8nLCAncnVieScpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuZmx1dHRlci1wbHVnaW5zLWRlcGVuZGVuY2llc1xuYW5kcm9pZC9rZXkucHJvcGVydGllc1xuaW9zLy5idW5kbGVcbi5pZGVhL3J1bkNvbmZpZ3VyYXRpb25zLnhtbFxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblRlbXBsYXRlWWFtbCkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuYXdzLXNhbS9cbnBhY2thZ2VkLnlhbWxcbmA7XG4gICAgfVxuICAgIC8vIEJlY2F1c2UgLnZlbnYgc2hvdWxkIGJlIGlnbm9yZWQgb24gcm9vdCBkaXJlY3RvcnlcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jaykge1xuICAgICAgbmFtZXMucHVzaCgncHl0aG9uJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC52ZW52L1xuYDtcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eikge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuYmxpdHovXG4uYmxpdHoqKlxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgbmFtZXMucHVzaCgnbmV4dGpzJyk7XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5maXJlYmFzZSB8fCBjb25maWcuZGVwZW5kaW5nLmZpcmViYXNlKSB7XG4gICAgICBuYW1lcy5wdXNoKCdmaXJlYmFzZScpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgKi5zcWxpdGUzKlxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgcGxheXdyaWdodC1yZXBvcnQvXG50ZXN0LXJlc3VsdHMvXG5gO1xuICAgIH1cbiAgICBpZiAocm9vdENvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUgfHwgY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgICAgbmFtZXMucHVzaCgncmVhY3RuYXRpdmUnKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgZ29vZ2xlLXNlcnZpY2VzLmpzb25cbmFuZHJvaWQvYXBwL3NyYy9tYWluL2Fzc2V0cy9cbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnN0b3J5Ym9vaykge1xuICAgICAgbmFtZXMucHVzaCgnc3Rvcnlib29ranMnKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubGl0ZXN0cmVhbSkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGBnY3Atc2Eta2V5Lmpzb25cbmA7XG4gICAgfVxuXG4gICAgbGV0IGdlbmVyYXRlZCA9ICcnO1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykge1xuICAgICAgbGV0IGNvbnRlbnQgPSAoYXdhaXQgcmVhZENhY2hlKG5hbWUpKSA/PyAnJztcbiAgICAgIGlmICghY29udGVudCkge1xuICAgICAgICBjb25zdCB1cmwgPSBgaHR0cHM6Ly93d3cudG9wdGFsLmNvbS9kZXZlbG9wZXJzL2dpdGlnbm9yZS9hcGkvJHtuYW1lfWA7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsKTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2VUZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgICBpZiAoIXJlc3BvbnNlLm9rIHx8IHJlc3BvbnNlVGV4dC5pbmNsdWRlcygnQXR0ZW50aW9uIFJlcXVpcmVkIScpIHx8IHJlc3BvbnNlVGV4dC5pbmNsdWRlcygnPHRpdGxlPicpKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGZldGNoICR7dXJsfWApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb250ZW50ID0gcmVzcG9uc2VUZXh0LnRyaW0oKTtcbiAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IHdyaXRlQ2FjaGUobmFtZSwgY29udGVudCkpO1xuICAgICAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oYEZldGNoZWQgJHt1cmx9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChnZW5lcmF0ZWQpIGdlbmVyYXRlZCArPSAnXFxuJztcbiAgICAgIGdlbmVyYXRlZCArPSBjb250ZW50ICsgJ1xcbic7XG4gICAgfVxuICAgIGlmICghKGF3YWl0IGlnbm9yZUZpbGVVdGlsLmlzQmVycnlaZXJvSW5zdGFsbEVuYWJsZWQoZmlsZVBhdGgpKSkge1xuICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2UoJyEueWFybi9jYWNoZScsICcjICEueWFybi9jYWNoZScpLnJlcGxhY2UoJyMgLnBucC4qJywgJy5wbnAuKicpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9tWG1sIHx8IGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWRcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvYXJ0aWZhY3RzJC9nbSwgJy5pZGVhL2FydGlmYWN0cycpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL2NvbXBpbGVyLnhtbCQvZ20sICcuaWRlYS9jb21waWxlci54bWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9qYXJSZXBvc2l0b3JpZXMueG1sJC9nbSwgJy5pZGVhL2phclJlcG9zaXRvcmllcy54bWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9tb2R1bGVzLnhtbCQvZ20sICcuaWRlYS9tb2R1bGVzLnhtbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcLyouaW1sJC9nbSwgJy5pZGVhLyouaW1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvbW9kdWxlcyQvZ20sICcuaWRlYS9tb2R1bGVzJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jICouaW1sJC9nbSwgJyouaW1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jICouaXByJC9nbSwgJyouaXByJyk7XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2VBbGwoL14uaWRlYVxcL21vZHVsZXMueG1sJC9nbSwgJyMgLmlkZWEvbW9kdWxlcy54bWwnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2VBbGwoL14uaWRlYVxcLz8kL2dtLCAnIyAuaWRlYScpO1xuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSB8fCBjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlIHx8IGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZUFsbCgvXiguaWRlYVxcLy4rKSQvZ20sICckMVxcbmFuZHJvaWQvJDEnKTtcbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGVudCA9IGhlYWRVc2VyQ29udGVudCArICdcXG4nICsgZ2VuZXJhdGVkICsgdGFpbFVzZXJDb250ZW50O1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5jb25zdCBkaXJQYXRoID0gcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5jYWNoZScsICd3YmZ5JywgJ2dpdGlnbm9yZScpO1xuXG5hc3luYyBmdW5jdGlvbiB3cml0ZUNhY2hlKG5hbWU6IHN0cmluZywgY29udGVudDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKGRpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpLCBjb250ZW50KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZENhY2hlKG5hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdCA9IGF3YWl0IGZzLnByb21pc2VzLnN0YXQocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpKTtcbiAgICBpZiAoRGF0ZS5ub3coKSAtIHN0YXQubXRpbWVNcyA+IDYgKiA2MCAqIDYwICogMTAwMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpLCAndXRmOCcpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZnVuY3Rpb24gY3JlYXRlVGFza09wdGlvbnMocnVubmVyOiBzdHJpbmcsIGFyZ3M6IHN0cmluZywgbmFtZTogc3RyaW5nLCBleHRlbnNpb246IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgICAgIDxUYXNrT3B0aW9ucyBpc0VuYWJsZWQ9XCJ0cnVlXCI+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJhcmd1bWVudHNcIiB2YWx1ZT1cIiR7YXJnc30gJEZpbGVQYXRoUmVsYXRpdmVUb1Byb2plY3RSb290JFwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJjaGVja1N5bnRheEVycm9yc1wiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiZGVzY3JpcHRpb25cIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiZXhpdENvZGVCZWhhdmlvclwiIHZhbHVlPVwiRVJST1JcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiZmlsZUV4dGVuc2lvblwiIHZhbHVlPVwiJHtleHRlbnNpb259XCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImltbWVkaWF0ZVN5bmNcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cIm5hbWVcIiB2YWx1ZT1cIiR7bmFtZX0gKC4ke2V4dGVuc2lvbn0pXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cIm91dHB1dFwiIHZhbHVlPVwiJEZpbGVQYXRoUmVsYXRpdmVUb1Byb2plY3RSb290JFwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJvdXRwdXRGaWx0ZXJzXCI+XG4gICAgICAgIDxhcnJheSAvPlxuICAgICAgPC9vcHRpb24+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJvdXRwdXRGcm9tU3Rkb3V0XCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJwcm9ncmFtXCIgdmFsdWU9XCIke3J1bm5lcn1cIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwicnVuT25FeHRlcm5hbENoYW5nZXNcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cInNjb3BlTmFtZVwiIHZhbHVlPVwiUHJvamVjdCBGaWxlc1wiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJ0cmFja09ubHlSb290XCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJ3b3JraW5nRGlyXCIgdmFsdWU9XCIkUHJvamVjdEZpbGVEaXIkXCIgLz5cbiAgICAgIDxlbnZzIC8+XG4gICAgPC9UYXNrT3B0aW9ucz5cbmA7XG59XG5cbmNvbnN0IHByZXR0aWVyQ29udGVudCA9IGA8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cbjxwcm9qZWN0IHZlcnNpb249XCI0XCI+XG4gIDxjb21wb25lbnQgbmFtZT1cIlByb2plY3RUYXNrc09wdGlvbnNcIj5cbiR7ZXh0ZW5zaW9ucy5wcmV0dGllci5tYXAoKGV4dCkgPT4gY3JlYXRlVGFza09wdGlvbnMoJ25vZGUnLCAnbm9kZV9tb2R1bGVzLy5iaW4vcHJldHRpZXIgLS1jYWNoZSAtLXdyaXRlJywgJ1ByZXR0aWVyJywgZXh0KSkuam9pbignJyl9XG4gIDwvY29tcG9uZW50PlxuPC9wcm9qZWN0PlxuYDtcblxuY29uc3QgYmlvbWVDb250ZW50ID0gYDw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuPHByb2plY3QgdmVyc2lvbj1cIjRcIj5cbiAgPGNvbXBvbmVudCBuYW1lPVwiUHJvamVjdFRhc2tzT3B0aW9uc1wiPlxuJHtleHRlbnNpb25zLnByZXR0aWVyLm1hcCgoZXh0KSA9PiBjcmVhdGVUYXNrT3B0aW9ucygnYnVuJywgJy0tYnVuIG5vZGVfbW9kdWxlcy8uYmluL2Jpb21lIGNoZWNrIC0tZml4IC0tbm8tZXJyb3JzLW9uLXVubWF0Y2hlZCAtLXNraXAtcGFyc2UtZXJyb3JzJywgJ0Jpb21lJywgZXh0KSkuam9pbignJyl9XG4gIDwvY29tcG9uZW50PlxuPC9wcm9qZWN0PlxuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlSWRlYVNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlSWRlYVNldHRpbmdzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuaWRlYScpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGRpclBhdGgpKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnd2F0Y2hlclRhc2tzLnhtbCcpO1xuICAgICAgYXdhaXQgKGNvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHQgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHRJblBhY2thZ2VzIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcyB8fFxuICAgICAgKGNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uICYmXG4gICAgICAgICFjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCAmJlxuICAgICAgICAhY29uZmlnLmRvZXNDb250YWluR2VtZmlsZSAmJlxuICAgICAgICAhY29uZmlnLmRvZXNDb250YWluR29Nb2QgJiZcbiAgICAgICAgIWNvbmZpZy5kb2VzQ29udGFpblBvbVhtbClcbiAgICAgICAgPyBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgY29uZmlnLmlzQnVuID8gYmlvbWVDb250ZW50IDogcHJldHRpZXJDb250ZW50KSlcbiAgICAgICAgOiBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSkpKTtcbiAgICB9XG4gIH0pO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBTcGF3blN5bmNPcHRpb25zIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3blN5bmMoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcsIHJldHJ5ID0gMCk6IHZvaWQge1xuICBzcGF3blN5bmNBbmRSZXR1cm5TdGF0dXMoY29tbWFuZCwgYXJncywgY3dkLCByZXRyeSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3blN5bmNBbmRSZXR1cm5TdGF0dXMoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcsIHJldHJ5ID0gMCk6IG51bWJlciB7XG4gIGxldCBzdGF0dXMgPSAxO1xuICBkbyB7XG4gICAgY29uc3QgW25ld0NtZCwgbmV3QXJncywgb3B0aW9uc10gPSBnZXRTcGF3blN5bmNBcmdzKGNvbW1hbmQsIGFyZ3MsIGN3ZCk7XG4gICAgY29uc29sZS5sb2coYCQgJHtuZXdDbWR9ICR7bmV3QXJncy5qb2luKCcgJyl9IGF0ICR7Y3dkfWApO1xuICAgIGNvbnN0IHJldCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKG5ld0NtZCwgbmV3QXJncywgb3B0aW9ucyk7XG4gICAgc3RhdHVzID0gcmV0LnN0YXR1cyA/PyAxO1xuICAgIGlmIChzdGF0dXMgPT09IDApIGJyZWFrO1xuICB9IHdoaWxlICgtLXJldHJ5ID49IDApO1xuICByZXR1cm4gc3RhdHVzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgW25ld0NtZCwgbmV3QXJncywgb3B0aW9uc10gPSBnZXRTcGF3blN5bmNBcmdzKGNvbW1hbmQsIGFyZ3MsIGN3ZCk7XG4gIG9wdGlvbnMuc3RkaW8gPSAncGlwZSc7XG4gIGNvbnN0IHByb2MgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnMpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvbiAtLSBzcGF3blN5bmMgcmV0dXJucyBudWxsIHN0ZGVyciBvbiBFTk9FTlQuXG4gIGNvbnN0IHN0ZGVyciA9IHByb2Muc3RkZXJyID8/ICcnO1xuICBjb25zdCBlcnJvciA9IHR5cGVvZiBzdGRlcnIgPT09ICdzdHJpbmcnID8gc3RkZXJyLnRyaW0oKSA6IHN0ZGVyci50b1N0cmluZygpLnRyaW0oKTtcbiAgaWYgKHByb2MuZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKGAke25ld0NtZH0gWyR7bmV3QXJncy5tYXAoKHMpID0+IGBcIiR7c31cImApLmpvaW4oJywgJyl9XSBmYWlsZWQgd2l0aDogJHtwcm9jLmVycm9yLm1lc3NhZ2V9YCk7XG4gIH0gZWxzZSBpZiAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgYCR7bmV3Q21kfSBbJHtuZXdBcmdzLm1hcCgocykgPT4gYFwiJHtzfVwiYCkuam9pbignLCAnKX1dIG91dHB1dHMgdGhlIGZvbGxvd2luZyBjb250ZW50IHRvIHN0ZGVycjpcXG4ke2Vycm9yfWBcbiAgICApO1xuICB9XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uIC0tIHNwYXduU3luYyByZXR1cm5zIG51bGwgc3Rkb3V0IG9uIEVOT0VOVC5cbiAgY29uc3Qgc3Rkb3V0ID0gcHJvYy5zdGRvdXQgPz8gJyc7XG4gIHJldHVybiB0eXBlb2Ygc3Rkb3V0ID09PSAnc3RyaW5nJyA/IHN0ZG91dC50cmltKCkgOiBzdGRvdXQudG9TdHJpbmcoKS50cmltKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTcGF3blN5bmNBcmdzKGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nKTogW3N0cmluZywgc3RyaW5nW10sIFNwYXduU3luY09wdGlvbnNdIHtcbiAgY29uc3QgZW52ID0geyAuLi5wcm9jZXNzLmVudiB9O1xuICAvLyBSZW1vdmUgYmVycnkgZnJvbSBQQVRIXG4gIGlmIChlbnYuUEFUSCAmJiBlbnYuQkVSUllfQklOX0ZPTERFUikge1xuICAgIGVudi5QQVRIID0gZW52LlBBVEgucmVwbGFjZShgJHtlbnYuQkVSUllfQklOX0ZPTERFUn06YCwgJycpO1xuICB9XG5cbiAgcmV0dXJuIFtcbiAgICBjb21tYW5kLFxuICAgIGFyZ3MsXG4gICAge1xuICAgICAgY3dkLFxuICAgICAgZW52LFxuICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICAgIHNoZWxsOiBmYWxzZSxcbiAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgfSxcbiAgXTtcbn1cbiIsImltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgY29uc3QgRXNsaW50VXRpbCA9IHtcbiAgZ2V0TGludEZpeFN1ZmZpeChjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICAgIHJldHVybiBjb25maWcuZG9lc0NvbnRhaW5Kc3hPclRzeCA/ICcgLS1ydWxlIFwieyByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHM6IDAgfVwiJyA6ICcnO1xuICB9LFxufTtcbiIsImltcG9ydCB7IE9jdG9raXQgfSBmcm9tICdAb2N0b2tpdC9jb3JlJztcblxuY2xhc3MgR2l0SHViVXRpbCB7XG4gIGdldE9yZ0FuZE5hbWUodXJsT3JGdWxsTmFtZTogc3RyaW5nKTogW3N0cmluZywgc3RyaW5nXSB7XG4gICAgY29uc3QgdXJsV2l0aG91dFByb3RvY29sID0gdXJsT3JGdWxsTmFtZS5zcGxpdCgnOicpLmF0KC0xKTtcbiAgICBjb25zdCBuYW1lcyA9IHVybFdpdGhvdXRQcm90b2NvbD8uc3BsaXQoJy8nKTtcbiAgICBjb25zdCBvcmcgPSBuYW1lcz8uYXQoLTIpID8/ICcnO1xuICAgIGNvbnN0IG5hbWUgPSBuYW1lcz8uYXQoLTEpPy5yZXBsYWNlKC8uZ2l0JC8sICcnKSA/PyAnJztcbiAgICByZXR1cm4gW29yZywgbmFtZV07XG4gIH1cbn1cbmV4cG9ydCBjb25zdCBnaXRIdWJVdGlsID0gbmV3IEdpdEh1YlV0aWwoKTtcblxuY29uc3Qgb2N0b2tpdENhY2hlID0gbmV3IE1hcDxzdHJpbmcsIE9jdG9raXQ+KCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRPY3Rva2l0KG93bmVyPzogc3RyaW5nKTogT2N0b2tpdCB7XG4gIGNvbnN0IGtleSA9IG93bmVyID8/ICcnO1xuICBjb25zdCBjYWNoZWQgPSBvY3Rva2l0Q2FjaGUuZ2V0KGtleSk7XG4gIGlmIChjYWNoZWQpIHJldHVybiBjYWNoZWQ7XG5cbiAgY29uc3Qgb2N0b2tpdCA9IG5ldyBPY3Rva2l0KHtcbiAgICBhdXRoOiBnZXRHaXRIdWJUb2tlbihvd25lcikgfHwgdW5kZWZpbmVkLFxuICB9KTtcbiAgb2N0b2tpdENhY2hlLnNldChrZXksIG9jdG9raXQpO1xuICByZXR1cm4gb2N0b2tpdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc0dpdEh1YlRva2VuKG93bmVyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhZ2V0R2l0SHViVG9rZW4ob3duZXIpO1xufVxuXG5mdW5jdGlvbiBnZXRHaXRIdWJUb2tlbihvd25lcj86IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChvd25lciA9PT0gJ1dpbGxCb29zdGVyJykge1xuICAgIHJldHVybiBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUjtcbiAgfVxuICBpZiAob3duZXIgPT09ICdXaWxsQm9vc3RlckxhYicpIHtcbiAgICByZXR1cm4gcHJvY2Vzcy5lbnYuR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVJMQUI7XG4gIH1cbiAgcmV0dXJuIChcbiAgICBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUiB8fFxuICAgIHByb2Nlc3MuZW52LkdIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSTEFCIHx8XG4gICAgcHJvY2Vzcy5lbnYuR0hfVE9LRU4gfHxcbiAgICBwcm9jZXNzLmVudi5HSVRIVUJfVE9LRU5cbiAgKTtcbn1cbiIsImltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5jb25zdCBFU0xJTlRfQ09ORklHX1BSRUZJWCA9ICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy0nO1xuY29uc3QgcGlubmVkRGVwZW5kZW5jeVNwZWNpZmllcnMgPSB7XG4gICdAZXNsaW50L2pzJzogJ145LjM5LjQnLFxuICBlc2xpbnQ6ICdeOS4zOS40JyxcbiAgdHlwZXNjcmlwdDogJ141LjkuMycsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgZnVuY3Rpb24gc2hvdWxkU2tpcFdpbGxib29zdGVyQ29uZmlnc0VzbGludFBhY2thZ2UoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIHJldHVybiBjb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3MgJiYgY29uZmlnLnBhY2thZ2VKc29uPy5uYW1lPy5zdGFydHNXaXRoKEVTTElOVF9DT05GSUdfUFJFRklYKSA9PT0gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFBpbm5lZERlcGVuZGVuY3lTcGVjaWZpZXIoZGVwZW5kZW5jeTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocGlubmVkRGVwZW5kZW5jeVNwZWNpZmllcnMpKSB7XG4gICAgaWYgKGtleSA9PT0gZGVwZW5kZW5jeSkge1xuICAgICAgcmV0dXJuIGAke2tleX1AJHt2YWx1ZX1gO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiwgU2V0UmVxdWlyZWQgfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBnZXRMYXRlc3RDb21taXRIYXNoIH0gZnJvbSAnLi4vZ2l0aHViL2NvbW1pdC5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBFc2xpbnRFeHRlbnNpb25CYXNlLCBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBFc2xpbnRVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZXNsaW50VXRpbC5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBnaXRIdWJVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5pbXBvcnQgeyBnbG9iSWdub3JlIH0gZnJvbSAnLi4vdXRpbHMvZ2xvYlV0aWwuanMnO1xuaW1wb3J0IHsgaWdub3JlRmlsZVV0aWwgfSBmcm9tICcuLi91dGlscy9pZ25vcmVGaWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBjb21iaW5lTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuaW1wb3J0IHsgZ2V0VHNjb25maWdCYXNlRGVwZW5kZW5jaWVzIH0gZnJvbSAnLi4vdXRpbHMvdHNjb25maWdCYXNlLmpzJztcbmltcG9ydCB7IGdldFBpbm5lZERlcGVuZGVuY3lTcGVjaWZpZXIgfSBmcm9tICcuLi91dGlscy93aWxsYm9vc3RlckNvbmZpZ3NVdGlsLmpzJztcblxuY29uc3QganNDb21tb25EZXBzID0gW1xuICAnQGVzbGludC9qcycsXG4gICdlc2xpbnQnLFxuICAnZXNsaW50LWNvbmZpZy1mbGF0LWdpdGlnbm9yZScsXG4gICdlc2xpbnQtY29uZmlnLXByZXR0aWVyJyxcbiAgJ2VzbGludC1wbHVnaW4taW1wb3J0LXgnLFxuICAnZXNsaW50LXBsdWdpbi1zb3J0LWNsYXNzLW1lbWJlcnMnLFxuICAnZXNsaW50LXBsdWdpbi1zb3J0LWRlc3RydWN0dXJlLWtleXMnLFxuICAnZXNsaW50LXBsdWdpbi11bmljb3JuJyxcbiAgJ2VzbGludC1wbHVnaW4tdW51c2VkLWltcG9ydHMnLFxuICAnZ2xvYmFscycsXG5dO1xuXG5jb25zdCB0c0NvbW1vbkRlcHMgPSBbLi4uanNDb21tb25EZXBzLCAndHlwZXNjcmlwdC1lc2xpbnQnLCAnZXNsaW50LWltcG9ydC1yZXNvbHZlci10eXBlc2NyaXB0J107XG5cbmNvbnN0IHJlYWN0Q29tbW9uRGVwcyA9IFsnZXNsaW50LXBsdWdpbi1yZWFjdCcsICdlc2xpbnQtcGx1Z2luLXJlYWN0LWhvb2tzJywgJ2VzbGludC1wbHVnaW4tcmVhY3QtY29tcGlsZXInXTtcblxuY29uc3QgZXNsaW50RGVwczogUmVjb3JkPEVzbGludEV4dGVuc2lvbkJhc2UsIHN0cmluZ1tdPiA9IHtcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzJzogWydAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcycsIC4uLmpzQ29tbW9uRGVwc10sXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcy1yZWFjdCc6IFsnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMtcmVhY3QnLCAuLi5qc0NvbW1vbkRlcHMsIC4uLnJlYWN0Q29tbW9uRGVwc10sXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cyc6IFsnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMnLCAuLi50c0NvbW1vbkRlcHNdLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMtcmVhY3QnOiBbJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzLXJlYWN0JywgLi4udHNDb21tb25EZXBzLCAuLi5yZWFjdENvbW1vbkRlcHNdLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctbmV4dCc6IFtcbiAgICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctbmV4dCcsXG4gICAgJ0BuZXh0L2VzbGludC1wbHVnaW4tbmV4dCcsXG4gICAgLi4udHNDb21tb25EZXBzLFxuICAgIC4uLnJlYWN0Q29tbW9uRGVwcyxcbiAgXSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVBhY2thZ2VKc29uKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHNraXBBZGRpbmdEZXBzOiBib29sZWFuXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVBhY2thZ2VKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IGNvcmUoY29uZmlnLCByb290Q29uZmlnLCBza2lwQWRkaW5nRGVwcyk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZywgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZywgc2tpcEFkZGluZ0RlcHM6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgY29uc3QganNvblRleHQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgY29uc3QganNvbk9iaiA9IEpTT04ucGFyc2UoanNvblRleHQpIGFzIFBhY2thZ2VKc29uO1xuICBqc29uT2JqLnNjcmlwdHMgPSBqc29uT2JqLnNjcmlwdHMgPz8ge307XG4gIGpzb25PYmouZGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXBlbmRlbmNpZXMgPz8ge307XG4gIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gIGpzb25PYmoucGVlckRlcGVuZGVuY2llcyA9IGpzb25PYmoucGVlckRlcGVuZGVuY2llcyA/PyB7fTtcbiAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSBjb25maWcuaXNCdW4gPyAnYnVuJyA6ICd5YXJuJztcblxuICBhd2FpdCByZW1vdmVEZXByZWNhdGVkU3R1ZmYoanNvbk9iaiBhcyBTZXRSZXF1aXJlZDxQYWNrYWdlSnNvbiwgJ3NjcmlwdHMnIHwgJ2RlcGVuZGVuY2llcycgfCAnZGV2RGVwZW5kZW5jaWVzJz4pO1xuXG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGpzb25PYmouc2NyaXB0cyBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSkge1xuICAgIC8vIEZyZXNoIHJlcG8gc3RpbGwgcmVxdWlyZXMgJ3lhcm4gaW5zdGFsbCdcbiAgICBpZiAoIXZhbHVlLmluY2x1ZGVzKCdnaXQgY2xvbmUnKSkge1xuICAgICAganNvbk9iai5zY3JpcHRzW2tleV0gPSB2YWx1ZS5yZXBsYWNlKC95YXJuXFxzKiYmXFxzKi8sICcnKS5yZXBsYWNlKC95YXJuXFxzKmluc3RhbGxcXHMqJiZcXHMqLywgJycpO1xuICAgIH1cbiAgfVxuXG4gIGpzb25PYmouc2NyaXB0cyA9IG1lcmdlKGpzb25PYmouc2NyaXB0cywgZ2VuZXJhdGVTY3JpcHRzKGNvbmZpZywganNvbk9iai5zY3JpcHRzKSk7XG4gIGFkZFN0YXJ0VGVzdFNlcnZlclNjcmlwdElmTmVlZGVkKGNvbmZpZywganNvbk9iaik7XG5cbiAgaWYgKCdjaGVjay1mb3ItYWknIGluIGpzb25PYmouc2NyaXB0cykge1xuICAgIGlmICgnZ2VuLWNvZGUnIGluIGpzb25PYmouc2NyaXB0cykge1xuICAgICAganNvbk9iai5zY3JpcHRzWydjaGVjay1mb3ItYWknXSA9IGAke3BhY2thZ2VNYW5hZ2VyfSBnZW4tY29kZSA+IC9kZXYvbnVsbCAmJiAke2pzb25PYmouc2NyaXB0c1snY2hlY2stZm9yLWFpJ119YDtcbiAgICB9XG4gICAganNvbk9iai5zY3JpcHRzWydjaGVjay1mb3ItYWknXSA9IGAke3BhY2thZ2VNYW5hZ2VyfSBpbnN0YWxsID4gL2Rldi9udWxsICYmICR7anNvbk9iai5zY3JpcHRzWydjaGVjay1mb3ItYWknXX1gO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucHJldHRpZnk7XG4gIH0gZWxzZSB7XG4gICAganNvbk9iai5zY3JpcHRzLnByZXR0aWZ5ID0gKGpzb25PYmouc2NyaXB0cy5wcmV0dGlmeSA/PyAnJykgKyAoYXdhaXQgZ2VuZXJhdGVQcmV0dGllclN1ZmZpeChjb25maWcuZGlyUGF0aCkpO1xuICB9XG4gIC8vIERlYWwgd2l0aCBicmVha2luZyBjaGFuZ2VzIGluIHlhcm4gYmVycnkgNC4wLjAtcmMuNDlcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoanNvbk9iai5zY3JpcHRzKSkge1xuICAgIGlmICghdmFsdWU/LmluY2x1ZGVzKCd5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCcpKSBjb250aW51ZTtcbiAgICBpZiAoXG4gICAgICB2YWx1ZS5pbmNsdWRlcygnLS1hbGwnKSB8fFxuICAgICAgdmFsdWUuaW5jbHVkZXMoJy0tcmVjdXJzaXZlJykgfHxcbiAgICAgIHZhbHVlLmluY2x1ZGVzKCctLXNpbmNlJykgfHxcbiAgICAgIHZhbHVlLmluY2x1ZGVzKCctLXdvcmt0cmVlJylcbiAgICApXG4gICAgICBjb250aW51ZTtcbiAgICBqc29uT2JqLnNjcmlwdHNba2V5XSA9IHZhbHVlLnJlcGxhY2UoJ3lhcm4gd29ya3NwYWNlcyBmb3JlYWNoJywgJ3lhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsJyk7XG4gIH1cblxuICBsZXQgZGVwZW5kZW5jaWVzOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgZGV2RGVwZW5kZW5jaWVzID0gWydwcmV0dGllcicsICdzb3J0LXBhY2thZ2UtanNvbiddO1xuICBjb25zdCBwb2V0cnlEZXZEZXBlbmRlbmNpZXM6IHN0cmluZ1tdID0gW107XG5cbiAgaWYgKFxuICAgICFmcy5leGlzdHNTeW5jKHBhdGguam9pbihyb290Q29uZmlnLmRpclBhdGgsICcucHJldHRpZXJyYy5qc29uJykpICYmXG4gICAgIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAnLnByZXR0aWVycmMuanNvbicpKVxuICApIHtcbiAgICBqc29uT2JqLnByZXR0aWVyID0gJ0B3aWxsYm9vc3Rlci9wcmV0dGllci1jb25maWcnO1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdwcmV0dGllci1wbHVnaW4tamF2YScsICdAd2lsbGJvb3N0ZXIvcHJldHRpZXItY29uZmlnJyk7XG4gIH1cblxuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ2xpbnQtc3RhZ2VkJ107XG4gIGRlbGV0ZSAoanNvbk9iaiBhcyBQYWNrYWdlSnNvbiAmIHsgJ2xpbnQtc3RhZ2VkJz86IHVua25vd24gfSlbJ2xpbnQtc3RhZ2VkJ107XG5cbiAgaWYgKGNvbmZpZy5pc1Jvb3QpIHtcbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXMuaHVza3k7XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLnBpbnN0O1xuICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucG9zdGluc3RhbGw7XG4gICAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5wb3N0cHVibGlzaDtcbiAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLnByZXB1Ymxpc2hPbmx5O1xuICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucHJlcGFjaztcbiAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLnBvc3RwYWNrO1xuICAgIGpzb25PYmouc2NyaXB0cy5wcmVwYXJlID0gJ2xlZnRob29rIGluc3RhbGwgfHwgdHJ1ZSc7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ2xlZnRob29rJyk7XG5cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5zZW1hbnRpY1JlbGVhc2UpIHtcbiAgICAgIGlmIChcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydzZW1hbnRpYy1yZWxlYXNlJ10gJiZcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydtdWx0aS1zZW1hbnRpYy1yZWxlYXNlJ10gJiZcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAcWl3aS9tdWx0aS1zZW1hbnRpYy1yZWxlYXNlJ11cbiAgICAgICkge1xuICAgICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnc2VtYW50aWMtcmVsZWFzZScpO1xuICAgICAgfVxuICAgICAganNvbk9iai52ZXJzaW9uID0gJzAuMC4wLXNlbWFudGljYWxseS1yZWxlYXNlZCc7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpIHtcbiAgICAgIC8vIFNpbmNlIGFydGlsbGVyeSByZXF1aXJlcyBhIHNwZWNpZmljIHZlcnNpb24gb2YgQHBsYXl3cmlnaHQvdGVzdFxuICAgICAgY29uc3QgaGFzQXJ0aWxsZXJ5ID0ganNvbk9iai5kZXBlbmRlbmNpZXMuYXJ0aWxsZXJ5IHx8IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLmFydGlsbGVyeTtcbiAgICAgIC8vIFNpbmNlIGxsbS10b29sYm94IHJlcXVpcmVzIEBwbGF5d3JpZ2h0L3Rlc3QgaW4gZGVwZW5kZW5jaWVzXG4gICAgICBpZiAoIWhhc0FydGlsbGVyeSAmJiAhanNvbk9iai5kZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXSkge1xuICAgICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnQHBsYXl3cmlnaHQvdGVzdCcpO1xuICAgICAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXTtcbiAgICAgIH1cbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llcy5wbGF5d3JpZ2h0O1xuICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQ7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucykge1xuICAgICAgLy8gV2UgZG9uJ3QgYWxsb3cgbm9uLWFycmF5IHdvcmtzcGFjZXMgaW4gbW9ub3JlcG8uXG4gICAgICBqc29uT2JqLndvcmtzcGFjZXMgPSBBcnJheS5pc0FycmF5KGpzb25PYmoud29ya3NwYWNlcylcbiAgICAgICAgPyBtZXJnZS5hbGwoW2pzb25PYmoud29ya3NwYWNlcywgWydwYWNrYWdlcy8qJ11dLCB7XG4gICAgICAgICAgICBhcnJheU1lcmdlOiBjb21iaW5lTWVyZ2UsXG4gICAgICAgICAgfSlcbiAgICAgICAgOiBbJ3BhY2thZ2VzLyonXTtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoanNvbk9iai53b3Jrc3BhY2VzKSkge1xuICAgICAganNvbk9iai53b3Jrc3BhY2VzID0ganNvbk9iai53b3Jrc3BhY2VzLmZpbHRlcihcbiAgICAgICAgKHdvcmtzcGFjZSkgPT5cbiAgICAgICAgICBmZy5nbG9iU3luYyh3b3Jrc3BhY2UsIHtcbiAgICAgICAgICAgIGRvdDogdHJ1ZSxcbiAgICAgICAgICAgIGN3ZDogY29uZmlnLmRpclBhdGgsXG4gICAgICAgICAgICBpZ25vcmU6IGdsb2JJZ25vcmUsXG4gICAgICAgICAgfSkubGVuZ3RoID4gMFxuICAgICAgKTtcbiAgICAgIGlmIChqc29uT2JqLndvcmtzcGFjZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLndvcmtzcGFjZXM7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcud2IgfHwgY29uZmlnLmlzQnVuKSB7XG4gICAgaWYgKGpzb25PYmouZGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvd2InXSkge1xuICAgICAgZGVwZW5kZW5jaWVzLnB1c2goJ0B3aWxsYm9vc3Rlci93YicpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnQHdpbGxib29zdGVyL3diJyk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGpzb25PYmouc2NyaXB0cyBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSkge1xuICAgICAganNvbk9iai5zY3JpcHRzW2tleV0gPSB2YWx1ZS5yZXBsYWNlKC93YlxccytkYi8sICd3YiBwcmlzbWEnKTtcbiAgICB9XG4gIH1cblxuICBpZiAoXG4gICAgY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdCB8fFxuICAgIGNvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHRJblBhY2thZ2VzIHx8XG4gICAgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fFxuICAgIGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzXG4gICkge1xuICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAYmlvbWVqcy9iaW9tZScsICdAd2lsbGJvb3N0ZXIvYmlvbWUtY29uZmlnJyk7XG4gICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXMuZXNsaW50O1xuICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLm1pY3JvbWF0Y2g7XG4gICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ3R5cGVzY3JpcHQtZXNsaW50J107XG4gICAgfSBlbHNlIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdlc2xpbnQnLCAnbWljcm9tYXRjaCcpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChcbiAgICBjb25maWcuZG9lc0NvbnRhaW5KYXZhU2NyaXB0IHx8XG4gICAgY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdEluUGFja2FnZXMgfHxcbiAgICBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8XG4gICAgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXNcbiAgKSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goLi4uZ2V0VHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKGNvbmZpZykpO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXMpIHtcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgndHlwZXNjcmlwdCcpO1xuICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAdHlwZXMvYnVuJyk7XG4gICAgfSBlbHNlIGlmICghY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0B0eXBlcy9ub2RlJyk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGpzb25PYmouZGVwZW5kZW5jaWVzLmplc3QgfHxcbiAgICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLmplc3QgfHxcbiAgICAgIGpzb25PYmouZGVwZW5kZW5jaWVzWydAamVzdC9nbG9iYWxzJ10gfHxcbiAgICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAamVzdC9nbG9iYWxzJ10gfHxcbiAgICAgIGpzb25PYmouZGVwZW5kZW5jaWVzWyd0cy1qZXN0J10gfHxcbiAgICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWyd0cy1qZXN0J11cbiAgICApIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAdHlwZXMvamVzdCcpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcuZXNsaW50QmFzZSkge1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKC4uLmVzbGludERlcHNbY29uZmlnLmVzbGludEJhc2VdKTtcbiAgfVxuXG4gIGlmIChjb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3MpIHtcbiAgICBkZXBlbmRlbmNpZXMgPSBkZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFkZXAuaW5jbHVkZXMoJ0B3aWxsYm9vc3Rlci8nKSk7XG4gICAgZGV2RGVwZW5kZW5jaWVzID0gZGV2RGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhZGVwLmluY2x1ZGVzKCdAd2lsbGJvb3N0ZXIvJykpO1xuICB9XG5cbiAgaWYgKCFqc29uT2JqLm5hbWUpIHtcbiAgICBqc29uT2JqLm5hbWUgPSBwYXRoLmJhc2VuYW1lKGNvbmZpZy5kaXJQYXRoKTtcbiAgfVxuXG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMpIHtcbiAgICBqc29uT2JqLnByaXZhdGUgPSB0cnVlO1xuICB9XG4gIGlmICghanNvbk9iai5saWNlbnNlKSB7XG4gICAganNvbk9iai5saWNlbnNlID0gJ1VOTElDRU5TRUQnO1xuICB9XG4gIGlmICghanNvbk9iai5wcml2YXRlICYmIGpzb25PYmoubGljZW5zZSAhPT0gJ1VOTElDRU5TRUQnICYmIHJvb3RDb25maWcuaXNQdWJsaWNSZXBvKSB7XG4gICAganNvbk9iai5wdWJsaXNoQ29uZmlnID8/PSB7fTtcbiAgICBqc29uT2JqLnB1Ymxpc2hDb25maWcuYWNjZXNzID8/PSAncHVibGljJztcbiAgfVxuICBjb25zdCBbb3duZXJdID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGNvbmZpZy5yZXBvc2l0b3J5ID8/ICcnKTtcbiAgaWYgKG93bmVyID09PSAnV2lsbEJvb3N0ZXInIHx8IG93bmVyID09PSAnV2lsbEJvb3N0ZXJMYWInKSB7XG4gICAganNvbk9iai5hdXRob3IgPSAnV2lsbEJvb3N0ZXIgSW5jLic7XG4gIH1cbiAgaWYgKCFjb25maWcuaXNSb290ICYmIGpzb25PYmoucHJpdmF0ZSAmJiAhanNvbk9iai5tYWluKSB7XG4gICAgLy8gTWFrZSBWU0NvZGUgcG9zc2libGUgdG8gcmVmYWN0b3IgY29kZSBhY3Jvc3Mgc3VicGFja2FnZXMuXG4gICAganNvbk9iai5tYWluID0gJy4vc3JjJztcbiAgfVxuXG4gIC8vIEJlY2F1c2UgYFwicmVzb2x1dGlvbnNcIjogeyBcIm5wbS9jaGFsa1wiOiBcIl40LjEuMlwiIH0sYCBjYXVzZXMgXCJJbnZhbGlkIG5wbSB0b2tlblwiXG4gIGRlbGV0ZSBqc29uT2JqLnJlc29sdXRpb25zPy5bJ25wbS9jaGFsayddO1xuXG4gIGlmICghY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zKSB7XG4gICAgaWYgKCFjb25maWcuaXNCdW4pIHtcbiAgICAgIGlmICghY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdCAmJiAhY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCkge1xuICAgICAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLmxpbnQ7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J107XG4gICAgICAgIGZvciAoY29uc3Qgc2NyaXB0TmFtZSBvZiBbJ2NsZWFudXAnLCAnY2hlY2stZm9yLWFpJ10pIHtcbiAgICAgICAgICBjb25zdCBzY3JpcHQgPSBqc29uT2JqLnNjcmlwdHNbc2NyaXB0TmFtZV07XG4gICAgICAgICAgaWYgKCFzY3JpcHQpIGNvbnRpbnVlO1xuICAgICAgICAgIGpzb25PYmouc2NyaXB0c1tzY3JpcHROYW1lXSA9IHNjcmlwdC5yZXBsYWNlKC8gPyYmID95YXJuIGxpbnQtZml4KD86IC0tcXVpZXQpPy8sICcnKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAganNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddID0gKGpzb25PYmouc2NyaXB0c1snbGludC1maXgnXSA/PyAnJykgKyBFc2xpbnRVdGlsLmdldExpbnRGaXhTdWZmaXgoY29uZmlnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgIGpzb25PYmouc2NyaXB0cy5saW50ID0gJ2ZsdXR0ZXIgYW5hbHl6ZSc7XG4gICAgICBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J10gPSAneWFybiBsaW50JztcbiAgICAgIGNvbnN0IGRpcnMgPSBbJ2xpYicsICd0ZXN0JywgJ3Rlc3RfZHJpdmVyJ10uZmlsdGVyKChkaXIpID0+IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBkaXIpKSk7XG4gICAgICBpZiAoZGlycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGpzb25PYmouc2NyaXB0c1snZm9ybWF0LWNvZGUnXSA9IGBkYXJ0IGZvcm1hdCAkKGZpbmQgJHtkaXJzLmpvaW4oXG4gICAgICAgICAgJyAnXG4gICAgICAgICl9IC1uYW1lIGdlbmVyYXRlZCAtcHJ1bmUgLW8gLW5hbWUgJyouZnJlZXplZC5kYXJ0JyAtcHJ1bmUgLW8gLW5hbWUgJyouZy5kYXJ0JyAtcHJ1bmUgLW8gLW5hbWUgJyouZGFydCcgLXByaW50KWA7XG4gICAgICAgIGpzb25PYmouc2NyaXB0cy5mb3JtYXQgPSAoanNvbk9iai5zY3JpcHRzLmZvcm1hdCA/PyAnJykgKyBgICYmIHlhcm4gZm9ybWF0LWNvZGVgO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrKSB7XG4gICAgICBpZiAoanNvbk9iai5zY3JpcHRzLnBvc3RpbnN0YWxsID09PSAncG9ldHJ5IGluc3RhbGwnKSB7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucG9zdGluc3RhbGw7XG4gICAgICB9XG4gICAgICBjb25zdCBweXRob25GaWxlcyA9IGF3YWl0IGZnLmdsb2IoJyoqLyoucHknLCB7XG4gICAgICAgIGN3ZDogY29uZmlnLmRpclBhdGgsXG4gICAgICAgIGRvdDogdHJ1ZSxcbiAgICAgICAgaWdub3JlOiBnbG9iSWdub3JlLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBkaXJOYW1lU2V0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICBmb3IgKGNvbnN0IHB5dGhvbkZpbGUgb2YgcHl0aG9uRmlsZXMpIHtcbiAgICAgICAgY29uc3QgW2ZpcnN0LCBzZWNvbmRdID0gcHl0aG9uRmlsZS5zcGxpdCgvWy9cXFxcXS8pO1xuICAgICAgICBpZiAoZmlyc3QgJiYgc2Vjb25kKSB7XG4gICAgICAgICAgZGlyTmFtZVNldC5hZGQoZmlyc3QpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZGlyTmFtZVNldC5zaXplID4gMCkge1xuICAgICAgICBjb25zdCBkaXJOYW1lc1N0ciA9IFsuLi5kaXJOYW1lU2V0XS5qb2luKCcgJyk7XG4gICAgICAgIGpzb25PYmouc2NyaXB0c1snZm9ybWF0LWNvZGUnXSA9XG4gICAgICAgICAgYHBvZXRyeSBydW4gaXNvcnQgLS1wcm9maWxlIGJsYWNrICR7ZGlyTmFtZXNTdHJ9ICYmIHBvZXRyeSBydW4gYmxhY2sgJHtkaXJOYW1lc1N0cn1gO1xuICAgICAgICBpZiAoanNvbk9iai5zY3JpcHRzLmxpbnQpIHtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHMubGludCA9IGBwb2V0cnkgcnVuIGZsYWtlOCAke2Rpck5hbWVzU3RyfSAmJiAke2pzb25PYmouc2NyaXB0cy5saW50fWA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAganNvbk9iai5zY3JpcHRzLmxpbnQgPSBgcG9ldHJ5IHJ1biBmbGFrZTggJHtkaXJOYW1lc1N0cn1gO1xuICAgICAgICAgIGpzb25PYmouc2NyaXB0c1snbGludC1maXgnXSA9ICd5YXJuIGxpbnQnO1xuICAgICAgICB9XG4gICAgICAgIGpzb25PYmouc2NyaXB0cy5mb3JtYXQgPSAoanNvbk9iai5zY3JpcHRzLmZvcm1hdCA/PyAnJykgKyBgICYmIHlhcm4gZm9ybWF0LWNvZGVgO1xuICAgICAgICBwb2V0cnlEZXZEZXBlbmRlbmNpZXMucHVzaCgnYmxhY2snLCAnaXNvcnQnLCAnZmxha2U4Jyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5yZXBvc2l0b3J5IHx8IGpzb25PYmoucmVwb3NpdG9yeSkge1xuICAgIGpzb25PYmoucmVwb3NpdG9yeSA9IGZvcm1hdFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbihjb25maWcucmVwb3NpdG9yeSA/PyBqc29uT2JqLnJlcG9zaXRvcnksIGpzb25PYmoucmVwb3NpdG9yeSk7XG4gIH1cblxuICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eikge1xuICAgIGlmICghanNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddPy5zdGFydHNXaXRoKCdibGl0eiBjb2RlZ2VuJykpIHtcbiAgICAgIGpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXSA9ICdibGl0eiBjb2RlZ2VuJztcbiAgICB9IGVsc2UgaWYgKCFqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10uaW5jbHVkZXMoJ2JsaXR6IHByaXNtYSBnZW5lcmF0ZScpKSB7XG4gICAgICBqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10gPSBqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10ucmVwbGFjZShcbiAgICAgICAgJ2JsaXR6IGNvZGVnZW4nLFxuICAgICAgICAnYmxpdHogY29kZWdlbiAmJiBibGl0eiBwcmlzbWEgZ2VuZXJhdGUnXG4gICAgICApO1xuICAgIH1cbiAgfSBlbHNlIGlmIChjb25maWcuZGVwZW5kaW5nLnByaXNtYSAmJiAhanNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddPy5zdGFydHNXaXRoKCdwcmlzbWEgZ2VuZXJhdGUnKSkge1xuICAgIGpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXSA9ICdwcmlzbWEgZ2VuZXJhdGUnO1xuICB9XG5cbiAgaWYgKCFqc29uT2JqLmRlcGVuZGVuY2llcy5wcmV0dGllcikge1xuICAgIC8vIEJlY2F1c2UgQHR5cGVzL3ByZXR0aWVyIGJsb2NrcyBwcmV0dGllciBleGVjdXRpb24uXG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAdHlwZXMvcHJldHRpZXInXTtcbiAgfVxuXG4gIGlmIChPYmplY3Qua2V5cyhqc29uT2JqLmRlcGVuZGVuY2llcykubGVuZ3RoID09PSAwKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzO1xuICB9XG4gIGlmIChPYmplY3Qua2V5cyhqc29uT2JqLmRldkRlcGVuZGVuY2llcykubGVuZ3RoID09PSAwKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzO1xuICB9XG4gIGlmIChPYmplY3Qua2V5cyhqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgIGRlbGV0ZSBqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXM7XG4gIH1cblxuICBhd2FpdCB1cGRhdGVQcml2YXRlUGFja2FnZXMoanNvbk9iaik7XG5cbiAgaWYgKGNvbmZpZy5pc0J1bikgZGVsZXRlIGpzb25PYmoucGFja2FnZU1hbmFnZXI7XG4gIGxldCBuZXdKc29uVGV4dCA9IEpTT04uc3RyaW5naWZ5KGpzb25PYmopO1xuICBuZXdKc29uVGV4dCA9IGF3YWl0IGZpeFNjcmlwdE5hbWVzKGpzb25PYmouc2NyaXB0cywgbmV3SnNvblRleHQsIGNvbmZpZyk7XG4gIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShmaWxlUGF0aCwgYCR7bmV3SnNvblRleHR9XFxuYCk7XG5cbiAgaWYgKCFza2lwQWRkaW5nRGVwcykge1xuICAgIC8vIFdlIGNhbm5vdCBhZGQgZGVwZW5kZW5jaWVzIHdoaWNoIGFyZSBhbHJlYWR5IGluY2x1ZGVkIGluIGRldkRlcGVuZGVuY2llcy5cbiAgICBkZXBlbmRlbmNpZXMgPSBkZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFqc29uT2JqLmRldkRlcGVuZGVuY2llcz8uW2RlcF0pO1xuICAgIGlmIChkZXBlbmRlbmNpZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgdW5pcXVlRGVwZW5kZW5jaWVzID0gWy4uLm5ldyBTZXQoZGVwZW5kZW5jaWVzKV07XG4gICAgICBjb25zdCBkZXBlbmRlbmN5U3BlY2lmaWVycyA9IHVuaXF1ZURlcGVuZGVuY2llcy5tYXAoKGRlcGVuZGVuY3kpID0+IGdldERlcGVuZGVuY3lTcGVjaWZpZXIoZGVwZW5kZW5jeSkpO1xuICAgICAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgICAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsncmVtb3ZlJywgLi4udW5pcXVlRGVwZW5kZW5jaWVzXSwgY29uZmlnLmRpclBhdGgpO1xuICAgICAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnYWRkJywgJy0tZXhhY3QnLCAuLi5kZXBlbmRlbmN5U3BlY2lmaWVyc10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEludGVudGlvbmFsbHkgb21pdCB2ZXJzaW9ucyB0byB1cGRhdGUgZGVwZW5kZW5jaWVzIHRvIHRoZSBsYXRlc3QgdmVyc2lvbnMgd2l0aCBZYXJuLlxuICAgICAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnYWRkJywgLi4uZGVwZW5kZW5jeVNwZWNpZmllcnNdLCBjb25maWcuZGlyUGF0aCk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIFdlIGNhbm5vdCBhZGQgZGV2RGVwZW5kZW5jaWVzIHdoaWNoIGFyZSBhbHJlYWR5IGluY2x1ZGVkIGluIGRlcGVuZGVuY2llcy5cbiAgICBkZXZEZXBlbmRlbmNpZXMgPSBkZXZEZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFqc29uT2JqLmRlcGVuZGVuY2llcz8uW2RlcF0pO1xuICAgIGlmIChkZXZEZXBlbmRlbmNpZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgdW5pcXVlRGV2RGVwZW5kZW5jaWVzID0gWy4uLm5ldyBTZXQoZGV2RGVwZW5kZW5jaWVzKV07XG4gICAgICBjb25zdCBkZXZEZXBlbmRlbmN5U3BlY2lmaWVycyA9IHVuaXF1ZURldkRlcGVuZGVuY2llcy5tYXAoKGRlcGVuZGVuY3kpID0+IGdldERlcGVuZGVuY3lTcGVjaWZpZXIoZGVwZW5kZW5jeSkpO1xuICAgICAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgICAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsncmVtb3ZlJywgLi4udW5pcXVlRGV2RGVwZW5kZW5jaWVzXSwgY29uZmlnLmRpclBhdGgpO1xuICAgICAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnYWRkJywgJy1EJywgJy0tZXhhY3QnLCAuLi5kZXZEZXBlbmRlbmN5U3BlY2lmaWVyc10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEludGVudGlvbmFsbHkgb21pdCB2ZXJzaW9ucyB0byB1cGRhdGUgZGVwZW5kZW5jaWVzIHRvIHRoZSBsYXRlc3QgdmVyc2lvbnMgd2l0aCBZYXJuLlxuICAgICAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnYWRkJywgJy1EJywgLi4uZGV2RGVwZW5kZW5jeVNwZWNpZmllcnNdLCBjb25maWcuZGlyUGF0aCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChwb2V0cnlEZXZEZXBlbmRlbmNpZXMubGVuZ3RoID4gMCkge1xuICAgICAgc3Bhd25TeW5jKCdwb2V0cnknLCBbJ2FkZCcsICctLWdyb3VwJywgJ2RldicsIC4uLm5ldyBTZXQocG9ldHJ5RGV2RGVwZW5kZW5jaWVzKV0sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICB9XG4gIH1cbn1cblxuLy8gVE9ETzogcmVtb3ZlIHRoZSBmb2xsb3dpbmcgbWlncmF0aW9uIGNvZGUgaW4gZnV0dXJlXG5hc3luYyBmdW5jdGlvbiByZW1vdmVEZXByZWNhdGVkU3R1ZmYoXG4gIGpzb25PYmo6IFNldFJlcXVpcmVkPFBhY2thZ2VKc29uLCAnc2NyaXB0cycgfCAnZGVwZW5kZW5jaWVzJyB8ICdkZXZEZXBlbmRlbmNpZXMnPlxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChqc29uT2JqLmF1dGhvciA9PT0gJ1dpbGxCb29zdGVyIExMQycpIHtcbiAgICBqc29uT2JqLmF1dGhvciA9ICdXaWxsQm9vc3RlciBJbmMuJztcbiAgfVxuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydzb3J0LXBhY2thZ2UtanNvbiddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydzb3J0LWFsbC1wYWNrYWdlLWpzb24nXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sndHlwZWNoZWNrL3dhcm4nXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sndHlwZWNoZWNrOmdlbi1jb2RlJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3R5cGVjaGVjazpjb2RlZ2VuJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llcy50c2xpYjtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZyddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXJlYWN0J107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3Jlbm92YXRlLWNvbmZpZyddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci90c2NvbmZpZyddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ2VzbGludC1pbXBvcnQtcmVzb2x2ZXItbm9kZSddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ2VzbGludC1wbHVnaW4tcHJldHRpZXInXTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLmxlcm5hO1xuICAvLyBUbyBpbnN0YWxsIHRoZSBsYXRlc3QgcGluc3RcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLnBpbnN0O1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydmbHV0dGVyLWZvcm1hdCddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydmb3JtYXQtZmx1dHRlciddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydweXRob24tZm9ybWF0J107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2Zvcm1hdC1weXRob24nXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5wcmV0dGllcjtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snY2hlY2stYWxsJ107XG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybSgnbGVybmEuanNvbicsIHsgZm9yY2U6IHRydWUgfSkpO1xuXG4gIC8vIE1pZ3JhdGUgZnJvbSBFU0xpbnQgbGVnYWN5IGNvbmZpZ3MgdG8gZmxhdCBjb25maWdzLFxuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B0eXBlc2NyaXB0LWVzbGludC9lc2xpbnQtcGx1Z2luJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHR5cGVzY3JpcHQtZXNsaW50L3BhcnNlciddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ2VzbGludC1wbHVnaW4taW1wb3J0J107XG59XG5cbmZ1bmN0aW9uIGdldERlcGVuZGVuY3lTcGVjaWZpZXIoZGVwZW5kZW5jeTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGdldFBpbm5lZERlcGVuZGVuY3lTcGVjaWZpZXIoZGVwZW5kZW5jeSkgPz8gZGVwZW5kZW5jeTtcbn1cblxuZnVuY3Rpb24gYWRkU3RhcnRUZXN0U2VydmVyU2NyaXB0SWZOZWVkZWQoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBqc29uT2JqOiBQYWNrYWdlSnNvbik6IHZvaWQge1xuICBpZiAoIWNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QgfHwgIWNvbmZpZy5kZXBlbmRpbmcud2IgfHwganNvbk9iai5zY3JpcHRzPy5bJ3N0YXJ0LXRlc3Qtc2VydmVyJ10pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBqc29uT2JqLnNjcmlwdHMgPz89IHt9O1xuICBqc29uT2JqLnNjcmlwdHNbJ3N0YXJ0LXRlc3Qtc2VydmVyJ10gPSAnd2Igc3RhcnQgLS1tb2RlIHRlc3QnO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24oXG4gIHJlcG9zaXRvcnk6IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J10sXG4gIGV4aXN0aW5nUmVwb3NpdG9yeT86IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J11cbik6IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J10ge1xuICBjb25zdCBub3JtYWxpemVkUmVwb3NpdG9yeSA9IG5vcm1hbGl6ZVJlcG9zaXRvcnlVcmxGb3JQYWNrYWdlSnNvbihyZXBvc2l0b3J5KTtcbiAgaWYgKG5vcm1hbGl6ZWRSZXBvc2l0b3J5KSB7XG4gICAgcmV0dXJuIGJ1aWxkTm9ybWFsaXplZFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbihub3JtYWxpemVkUmVwb3NpdG9yeSwgcmVwb3NpdG9yeSwgZXhpc3RpbmdSZXBvc2l0b3J5KTtcbiAgfVxuXG4gIGNvbnN0IG5vcm1hbGl6ZWRFeGlzdGluZ1JlcG9zaXRvcnkgPSBub3JtYWxpemVSZXBvc2l0b3J5VXJsRm9yUGFja2FnZUpzb24oZXhpc3RpbmdSZXBvc2l0b3J5KTtcbiAgaWYgKG5vcm1hbGl6ZWRFeGlzdGluZ1JlcG9zaXRvcnkpIHtcbiAgICByZXR1cm4gYnVpbGROb3JtYWxpemVkUmVwb3NpdG9yeUZvclBhY2thZ2VKc29uKG5vcm1hbGl6ZWRFeGlzdGluZ1JlcG9zaXRvcnksIGV4aXN0aW5nUmVwb3NpdG9yeSk7XG4gIH1cblxuICByZXR1cm4gcmVwb3NpdG9yeTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplUmVwb3NpdG9yeVVybEZvclBhY2thZ2VKc29uKHJlcG9zaXRvcnk6IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J10pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAodHlwZW9mIHJlcG9zaXRvcnkgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKCFyZXBvc2l0b3J5LnN0YXJ0c1dpdGgoJ2dpdGh1YjonKSkgcmV0dXJuO1xuXG4gICAgY29uc3QgW293bmVyLCByZXBvXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShyZXBvc2l0b3J5KTtcbiAgICBpZiAoIW93bmVyIHx8ICFyZXBvKSByZXR1cm47XG4gICAgcmV0dXJuIGBnaXQraHR0cHM6Ly9naXRodWIuY29tLyR7b3duZXJ9LyR7cmVwb30uZ2l0YDtcbiAgfVxuXG4gIGNvbnN0IHJlcG9zaXRvcnlVcmwgPSByZXBvc2l0b3J5Py51cmw7XG4gIGlmICh0eXBlb2YgcmVwb3NpdG9yeVVybCAhPT0gJ3N0cmluZycpIHJldHVybjtcblxuICBjb25zdCBtYXRjaGVkID0gL14oPzpnaXRcXCspP2h0dHBzOlxcL1xcL2dpdGh1YlxcLmNvbVxcLyhbXi9dKylcXC8oW14vXSs/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+IH0ge1xuLy8gICByZXR1cm4gKFxuLy8gICAgIHR5cGVvZiBqc29uID09PSAnb2JqZWN0JyAmJlxuLy8gICAgIGpzb24gIT09IG51bGwgJiZcbi8vICAgICAnc2tpbGxzJyBpbiBqc29uICYmXG4vLyAgICAgdHlwZW9mIGpzb24uc2tpbGxzID09PSAnb2JqZWN0JyAmJlxuLy8gICAgIGpzb24uc2tpbGxzICE9PSBudWxsICYmXG4vLyAgICAgIUFycmF5LmlzQXJyYXkoanNvbi5za2lsbHMpXG4vLyAgICk7XG4vLyB9XG4iLCJpbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuY29uc3Qgc3JjRGlyZWN0b3JpZXMgPSB7XG4gIG5vZGU6IFsnc3JjJywgJ3Rlc3QnLCAnc2NyaXB0cyddLnRvU29ydGVkKCksXG4gIGJsaXR6OiBbJ3NyYycsICd0ZXN0JywgJ3NjcmlwdHMnLCAnZGInLCAnaW50ZWdyYXRpb25zJywgJ21haWxlcnMnXS50b1NvcnRlZCgpLFxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNyY0RpcnMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nW10ge1xuICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eikge1xuICAgIHJldHVybiBzcmNEaXJlY3Rvcmllcy5ibGl0ejtcbiAgfVxuICByZXR1cm4gc3JjRGlyZWN0b3JpZXMubm9kZTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IGNsb25lRGVlcCBmcm9tICdsb2Rhc2guY2xvbmVkZWVwJztcbmltcG9ydCB0eXBlIHsgVHNDb25maWdKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGNvbWJpbmVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBzb3J0S2V5cyB9IGZyb20gJy4uL3V0aWxzL29iamVjdFV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBnZXRTcmNEaXJzIH0gZnJvbSAnLi4vdXRpbHMvc3JjRGlyZWN0b3JpZXMuanMnO1xuaW1wb3J0IHsgZ2V0VHNjb25maWdFeHRlbmRzIH0gZnJvbSAnLi4vdXRpbHMvdHNjb25maWdCYXNlLmpzJztcblxuY29uc3Qgcm9vdEpzb25PYmogPSB7XG4gIGNvbXBpbGVyT3B0aW9uczoge1xuICAgIGFsd2F5c1N0cmljdDogdHJ1ZSxcbiAgICBub1VuY2hlY2tlZEluZGV4ZWRBY2Nlc3M6IHRydWUsIC8vIGZvciBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLW51bGxpc2gtY29hbGVzY2luZ1xuICAgIGFsbG93U3ludGhldGljRGVmYXVsdEltcG9ydHM6IHRydWUsIC8vIGFsbG93IGBpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnYFxuICAgIGVzTW9kdWxlSW50ZXJvcDogdHJ1ZSwgLy8gYWxsb3cgZGVmYXVsdCBpbXBvcnQgZnJvbSBDb21tb25KUy9BTUQvVU1EIG1vZHVsZXNcbiAgICByZXNvbHZlSnNvbk1vZHVsZTogdHJ1ZSwgLy8gYWxsb3cgdG8gaW1wb3J0IEpTT04gZmlsZXNcbiAgICBkZWNsYXJhdGlvbjogdHJ1ZSxcbiAgICBzb3VyY2VNYXA6IHRydWUsXG4gICAgaW1wb3J0SGVscGVyczogZmFsc2UsXG4gICAgbm9FbWl0OiBmYWxzZSxcbiAgICBvdXREaXI6ICdkaXN0JyxcbiAgfSxcbiAgZXhjbHVkZTogWydwYWNrYWdlcy8qL3Rlc3QvZml4dHVyZXMnLCAndGVzdC9maXh0dXJlcyddLFxuICBpbmNsdWRlOiBbXG4gICAgJ3BhY2thZ2VzLyovc2NyaXB0cy8qKi8qJyxcbiAgICAncGFja2FnZXMvKi9zcmMvKiovKicsXG4gICAgJ3BhY2thZ2VzLyovdGVzdC8qKi8qJyxcbiAgICAnc2NyaXB0cy8qKi8qJyxcbiAgICAnc3JjLyoqLyonLFxuICAgICd0ZXN0LyoqLyonLFxuICBdLFxufTtcblxuY29uc3Qgc3ViSnNvbk9iaiA9IHtcbiAgY29tcGlsZXJPcHRpb25zOiB7XG4gICAgYWx3YXlzU3RyaWN0OiB0cnVlLFxuICAgIG5vVW5jaGVja2VkSW5kZXhlZEFjY2VzczogdHJ1ZSwgLy8gZm9yIEB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItbnVsbGlzaC1jb2FsZXNjaW5nXG4gICAgYWxsb3dTeW50aGV0aWNEZWZhdWx0SW1wb3J0czogdHJ1ZSwgLy8gYWxsb3cgYGltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdgXG4gICAgZXNNb2R1bGVJbnRlcm9wOiB0cnVlLCAvLyBhbGxvdyBkZWZhdWx0IGltcG9ydCBmcm9tIENvbW1vbkpTL0FNRC9VTUQgbW9kdWxlc1xuICAgIHJlc29sdmVKc29uTW9kdWxlOiB0cnVlLCAvLyBhbGxvdyB0byBpbXBvcnQgSlNPTiBmaWxlc1xuICAgIGRlY2xhcmF0aW9uOiB0cnVlLFxuICAgIHNvdXJjZU1hcDogdHJ1ZSxcbiAgICBpbXBvcnRIZWxwZXJzOiBmYWxzZSxcbiAgICBub0VtaXQ6IGZhbHNlLFxuICAgIG91dERpcjogJ2Rpc3QnLFxuICB9LFxuICBleGNsdWRlOiBbJ3Rlc3QvZml4dHVyZXMnXSxcbiAgaW5jbHVkZTogWydzY3JpcHRzLyoqLyonLCAnc3JjLyoqLyonLCAndGVzdC8qKi8qJ10sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVUc2NvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVRzY29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6IHx8IGNvbmZpZy5kZXBlbmRpbmcubmV4dCkgcmV0dXJuO1xuXG4gICAgbGV0IG5ld1NldHRpbmdzID0gY2xvbmVEZWVwKGNvbmZpZy5pc1Jvb3QgPyByb290SnNvbk9iaiA6IHN1Ykpzb25PYmopIGFzIFRzQ29uZmlnSnNvbjtcbiAgICBjb25zdCBnZW5lcmF0ZWRSb290RGlyID0gZ2V0R2VuZXJhdGVkUm9vdERpcihjb25maWcpO1xuICAgIGNvbnN0IGdlbmVyYXRlZFR5cGVzID0gZ2V0R2VuZXJhdGVkVHlwZXMoY29uZmlnKTtcbiAgICBuZXdTZXR0aW5ncy5leHRlbmRzID0gZ2V0VHNjb25maWdFeHRlbmRzKGNvbmZpZyk7XG4gICAgaWYgKGdlbmVyYXRlZFJvb3REaXIpIHtcbiAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyA9IHsgLi4ubmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLCByb290RGlyOiBnZW5lcmF0ZWRSb290RGlyIH07XG4gICAgfVxuICAgIGlmIChnZW5lcmF0ZWRUeXBlcy5sZW5ndGggPiAwKSB7XG4gICAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMgPSB7IC4uLm5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucywgdHlwZXM6IGdlbmVyYXRlZFR5cGVzIH07XG4gICAgfVxuICAgIGlmICghY29uZmlnLmRvZXNDb250YWluSnN4T3JUc3ggJiYgIWNvbmZpZy5kb2VzQ29udGFpbkpzeE9yVHN4SW5QYWNrYWdlcykge1xuICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8uanN4O1xuICAgIH0gZWxzZSBpZiAoIWNvbmZpZy5pc0J1biAmJiAhY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zID0geyAuLi5uZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMsIGpzeDogJ3JlYWN0LWpzeCcgfTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5pc1Jvb3QgJiYgIWNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucykge1xuICAgICAgbmV3U2V0dGluZ3MuaW5jbHVkZSA9IG5ld1NldHRpbmdzLmluY2x1ZGU/LmZpbHRlcigoZGlyUGF0aDogc3RyaW5nKSA9PiAhZGlyUGF0aC5zdGFydHNXaXRoKCdwYWNrYWdlcy8qLycpKTtcbiAgICAgIG5ld1NldHRpbmdzLmV4Y2x1ZGUgPSBuZXdTZXR0aW5ncy5leGNsdWRlPy5maWx0ZXIoKGRpclBhdGg6IHN0cmluZykgPT4gIWRpclBhdGguc3RhcnRzV2l0aCgncGFja2FnZXMvKi8nKSk7XG4gICAgfVxuXG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICd0c2NvbmZpZy5qc29uJyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3Qgb2xkU2V0dGluZ3MgPSBKU09OLnBhcnNlKGV4aXN0aW5nQ29udGVudCkgYXMgVHNDb25maWdKc29uO1xuICAgICAgY29uc3QgZXhpc3RpbmdSb290RGlyID0gb2xkU2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5yb290RGlyO1xuICAgICAgY29uc3QgZXhpc3RpbmdUeXBlcyA9IG5vcm1hbGl6ZVN0cmluZ0FycmF5KG9sZFNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8udHlwZXMpO1xuICAgICAgbmV3U2V0dGluZ3MuZXh0ZW5kcyA9IG1lcmdlVHNjb25maWdFeHRlbmRzKG5ld1NldHRpbmdzLmV4dGVuZHMsIG9sZFNldHRpbmdzLmV4dGVuZHMpO1xuICAgICAgZGVsZXRlIG9sZFNldHRpbmdzLmV4dGVuZHM7XG4gICAgICBkZWxldGUgb2xkU2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5qc3g7XG4gICAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHsgYXJyYXlNZXJnZTogY29tYmluZU1lcmdlIH0pO1xuICAgICAgbmV3U2V0dGluZ3MuaW5jbHVkZSA9IG5ld1NldHRpbmdzLmluY2x1ZGU/LmZpbHRlcihcbiAgICAgICAgKGRpclBhdGg6IHN0cmluZykgPT5cbiAgICAgICAgICAhZGlyUGF0aC5pbmNsdWRlcygnQHR5cGVzJykgJiYgIWRpclBhdGguaW5jbHVkZXMoJ19fdGVzdHNfXy8nKSAmJiAhZGlyUGF0aC5pbmNsdWRlcygndGVzdHMvJylcbiAgICAgICk7XG4gICAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMgPz89IHt9O1xuICAgICAgaWYgKGV4aXN0aW5nUm9vdERpciAmJiAhc2hvdWxkUmVwbGFjZUV4aXN0aW5nUm9vdERpcihleGlzdGluZ1Jvb3REaXIsIGdlbmVyYXRlZFJvb3REaXIpKSB7XG4gICAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucy5yb290RGlyID0gZXhpc3RpbmdSb290RGlyO1xuICAgICAgfSBlbHNlIGlmIChnZW5lcmF0ZWRSb290RGlyKSB7XG4gICAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucy5yb290RGlyID0gZ2VuZXJhdGVkUm9vdERpcjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMucm9vdERpcjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbWVyZ2VkVHlwZXMgPSBbLi4ubmV3IFNldChbLi4uZXhpc3RpbmdUeXBlcywgLi4uZ2VuZXJhdGVkVHlwZXNdKV07XG4gICAgICBpZiAobWVyZ2VkVHlwZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMudHlwZXMgPSBtZXJnZWRUeXBlcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMudHlwZXM7XG4gICAgICB9XG4gICAgICBpZiAoc2hvdWxkRGVsZXRlVHlwZVJvb3RzKGdlbmVyYXRlZFR5cGVzKSkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLnR5cGVSb290cztcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gICAgc29ydEtleXMobmV3U2V0dGluZ3MpO1xuICAgIG5ld1NldHRpbmdzLmluY2x1ZGU/LnNvcnQoKTtcbiAgICAvLyBEb24ndCB1c2Ugb2xkIGRlY29yYXRvclxuICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmV4cGVyaW1lbnRhbERlY29yYXRvcnM7XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LnZlcmJhdGltTW9kdWxlU3ludGF4O1xuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBtZXJnZVRzY29uZmlnRXh0ZW5kcyhcbiAgZ2VuZXJhdGVkRXh0ZW5kczogVHNDb25maWdKc29uWydleHRlbmRzJ10sXG4gIGV4aXN0aW5nRXh0ZW5kczogVHNDb25maWdKc29uWydleHRlbmRzJ11cbik6IFRzQ29uZmlnSnNvblsnZXh0ZW5kcyddIHtcbiAgY29uc3QgbWVyZ2VkRXh0ZW5kcyA9IFsuLi5ub3JtYWxpemVFeHRlbmRzKGdlbmVyYXRlZEV4dGVuZHMpLCAuLi5ub3JtYWxpemVFeHRlbmRzKGV4aXN0aW5nRXh0ZW5kcyldO1xuICBjb25zdCB1bmlxdWVFeHRlbmRzID0gWy4uLm5ldyBTZXQobWVyZ2VkRXh0ZW5kcyldO1xuICBpZiAodW5pcXVlRXh0ZW5kcy5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmICh1bmlxdWVFeHRlbmRzLmxlbmd0aCA9PT0gMSkgcmV0dXJuIHVuaXF1ZUV4dGVuZHNbMF07XG4gIHJldHVybiB1bmlxdWVFeHRlbmRzO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVFeHRlbmRzKHZhbHVlOiBUc0NvbmZpZ0pzb25bJ2V4dGVuZHMnXSk6IHN0cmluZ1tdIHtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIFtdO1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVN0cmluZ0FycmF5KHZhbHVlOiB1bmtub3duKTogc3RyaW5nW10ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgcmV0dXJuIFt2YWx1ZV07XG4gIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiBbXTtcbiAgcmV0dXJuIHZhbHVlLmZpbHRlcigoaXRlbSk6IGl0ZW0gaXMgc3RyaW5nID0+IHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJyk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZERlbGV0ZVR5cGVSb290cyh0eXBlTmFtZXM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gIC8vIE9ubHkgZ2VuZXJhdGVkIHBhY2thZ2Utb3duZWQgdGVzdCB0eXBlcyBzaG91bGQgdHJpZ2dlciB0aGlzLiBVc2VyLWRlZmluZWQgc2xhc2gtYmFzZWRcbiAgLy8gZW50cmllcyBtYXkgaW50ZW50aW9uYWxseSByZWx5IG9uIGN1c3RvbSB0eXBlUm9vdHMgYW5kIHNob3VsZCBiZSBwcmVzZXJ2ZWQgYXMtaXMuXG4gIHJldHVybiB0eXBlTmFtZXMuc29tZSgodHlwZU5hbWUpID0+IHR5cGVOYW1lID09PSAnY3lwcmVzcycgfHwgdHlwZU5hbWUuaW5jbHVkZXMoJy8nKSk7XG59XG5cbmZ1bmN0aW9uIGdldEdlbmVyYXRlZFJvb3REaXIoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgcm9vdERpckNhbmRpZGF0ZXMgPSBnZXRSb290RGlyQ2FuZGlkYXRlcyhjb25maWcpO1xuICAvLyBLZWVwIHRlc3QgYW5kIHNjcmlwdHMgaW4gdGhpcyBsaXN0IHNvIG1peGVkIHRzY29uZmlncyBvbWl0IHJvb3REaXIgaW5zdGVhZCBvZlxuICAvLyBnZW5lcmF0aW5nIGEgc3JjLW9ubHkgcm9vdERpciB0aGF0IGNvbmZsaWN0cyB3aXRoIHRoZSBnZW5lcmF0ZWQgaW5jbHVkZSBnbG9icy5cbiAgY29uc3QgZXhpc3RpbmdJbmNsdWRlZERpcnMgPSBnZXRTcmNEaXJzKGNvbmZpZykuZmlsdGVyKChkaXJOYW1lKSA9PlxuICAgIGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBkaXJOYW1lKSlcbiAgKTtcbiAgY29uc3QgZXhpc3RpbmdSb290U291cmNlRGlycyA9IGV4aXN0aW5nSW5jbHVkZWREaXJzLmZpbHRlcigoZGlyTmFtZSkgPT4gcm9vdERpckNhbmRpZGF0ZXMuaW5jbHVkZXMoZGlyTmFtZSkpO1xuXG4gIC8vIFN1YnBhY2thZ2UgdHNjb25maWdzIGluaGVyaXQgcm9vdCBvcHRpb25zLCBzbyBhIG1vbm9yZXBvIHJvb3REaXIgd291bGQgc2hpZnRcbiAgLy8gZ2VuZXJhdGVkIHBhY2thZ2UgZGVjbGFyYXRpb25zIGludG8gbmVzdGVkIHBhdGhzIHN1Y2ggYXMgZGlzdC9zaGFyZWQvc2hhcmVkL3NyYy5cbiAgaWYgKGNvbmZpZy5pc1Jvb3QgJiYgY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGlmIChleGlzdGluZ0luY2x1ZGVkRGlycy5sZW5ndGggPT09IDEgJiYgZXhpc3RpbmdSb290U291cmNlRGlycy5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gYC4vJHtleGlzdGluZ1Jvb3RTb3VyY2VEaXJzWzBdfWA7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0Um9vdERpckNhbmRpZGF0ZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nW10ge1xuICByZXR1cm4gZ2V0U3JjRGlycyhjb25maWcpLmZpbHRlcigoZGlyTmFtZSkgPT4gZGlyTmFtZSAhPT0gJ3NjcmlwdHMnICYmIGRpck5hbWUgIT09ICd0ZXN0Jyk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFJlcGxhY2VFeGlzdGluZ1Jvb3REaXIoZXhpc3RpbmdSb290RGlyOiBzdHJpbmcsIGdlbmVyYXRlZFJvb3REaXI6IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICAvLyBNaXhlZCBzb3VyY2UvdGVzdCB0c2NvbmZpZ3MgbXVzdCBvbWl0IHJvb3REaXI7IG90aGVyd2lzZSBzcmMtb25seSByb290RGlyIGJyZWFrcyB0eXBlY2hlY2ssXG4gIC8vIHdoaWxlIFwiLlwiIGNoYW5nZXMgbGlicmFyeSBkZWNsYXJhdGlvbiBvdXRwdXQgZnJvbSBkaXN0LyouZC50cyB0byBkaXN0L3NyYy8qLmQudHMuXG4gIHJldHVybiBnZW5lcmF0ZWRSb290RGlyID09PSB1bmRlZmluZWQgfHwgKGV4aXN0aW5nUm9vdERpciA9PT0gJy4nICYmIGdlbmVyYXRlZFJvb3REaXIgIT09ICcuJyk7XG59XG5cbmZ1bmN0aW9uIGdldEdlbmVyYXRlZFR5cGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgdHlwZU5hbWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IGRlcGVuZGVuY2llcyA9IHtcbiAgICAuLi5jb25maWcucGFja2FnZUpzb24/LmRlcGVuZGVuY2llcyxcbiAgICAuLi5jb25maWcucGFja2FnZUpzb24/LmRldkRlcGVuZGVuY2llcyxcbiAgfTtcblxuICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgdHlwZU5hbWVzLmFkZCgnYnVuJyk7XG4gIH0gZWxzZSBpZiAoIWNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICB0eXBlTmFtZXMuYWRkKCdub2RlJyk7XG4gIH1cbiAgaWYgKFxuICAgIGRlcGVuZGVuY2llcy5qZXN0IHx8XG4gICAgZGVwZW5kZW5jaWVzWydAamVzdC9nbG9iYWxzJ10gfHxcbiAgICBkZXBlbmRlbmNpZXNbJ2plc3QtZW52aXJvbm1lbnQtanNkb20nXSB8fFxuICAgIGRlcGVuZGVuY2llc1sndHMtamVzdCddXG4gICkge1xuICAgIHR5cGVOYW1lcy5hZGQoJ2plc3QnKTtcbiAgfVxuICBpZiAoZGVwZW5kZW5jaWVzLnZpdGVzdCkge1xuICAgIHR5cGVOYW1lcy5hZGQoJ3ZpdGVzdC9nbG9iYWxzJyk7XG4gIH1cbiAgaWYgKGRlcGVuZGVuY2llcy5tb2NoYSkge1xuICAgIHR5cGVOYW1lcy5hZGQoJ21vY2hhJyk7XG4gIH1cbiAgaWYgKGRlcGVuZGVuY2llcy5jeXByZXNzKSB7XG4gICAgdHlwZU5hbWVzLmFkZCgnY3lwcmVzcycpO1xuICB9XG5cbiAgcmV0dXJuIFsuLi50eXBlTmFtZXNdO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBzb3J0S2V5cyB9IGZyb20gJy4uL3V0aWxzL29iamVjdFV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGV4Y2x1ZGVGaWxlUGF0dGVybnMgPSBbXG4gICcqKi8uZ2l0L29iamVjdHMvKionLFxuICAnKiovLmdpdC9zdWJ0cmVlLWNhY2hlLyoqJyxcbiAgJyoqL25vZGVfbW9kdWxlcy8qKicsXG4gICcqKi90bXAvKionLFxuICAnKiovdGVtcC8qKicsXG4gICcqKi9kaXN0LyoqJyxcbl07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVZzY29kZVNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlVnNjb2RlU2V0dGluZ3MnLCBhc3luYyAoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnZzY29kZScsICdzZXR0aW5ncy5qc29uJyk7XG4gICAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGxldCBzZXR0aW5ncyA9IEpTT04ucGFyc2UoZXhpc3RpbmdDb250ZW50KSBhcyBvYmplY3Q7XG4gICAgICBmb3IgKGNvbnN0IGV4Y2x1ZGVGaWxlUGF0dGVybiBvZiBleGNsdWRlRmlsZVBhdHRlcm5zKSB7XG4gICAgICAgIHNldHRpbmdzID0gbWVyZ2UuYWxsKFtzZXR0aW5ncywgZXhjbHVkZVNldHRpbmcoZXhjbHVkZUZpbGVQYXR0ZXJuKV0pO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2spIHtcbiAgICAgICAgc2V0dGluZ3MgPSBtZXJnZS5hbGwoW3NldHRpbmdzLCBleGNsdWRlU2V0dGluZygnKiovLnZlbnYvKionKV0pO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgICBzZXR0aW5ncyA9IG1lcmdlLmFsbChbc2V0dGluZ3MsIGV4Y2x1ZGVTZXR0aW5nKCcqKi8ubmV4dC8qKicpXSk7XG4gICAgICB9XG4gICAgICAvLyBMTE3jgavjgojjgot2aWJlIGNvZGluZ+OBp+OBr+OAgeiHquWLleODleOCqeODvOODnuODg+ODiOOChOOCs+ODvOODieOCouOCr+OCt+ODp+ODs+OCkueEoeWKueWMluOBmeOCi+OBk+OBqOOBp1xuICAgICAgLy8g55Sf5oiQ44GV44KM44Gf44Kz44O844OJ44Gu5YWD44Gu5b2i5byP44KS57at5oyB44Gn44GN44KLXG4gICAgICBpZiAoJ2VkaXRvci5jb2RlQWN0aW9uc09uU2F2ZScgaW4gc2V0dGluZ3MpIHtcbiAgICAgICAgZGVsZXRlIHNldHRpbmdzWydlZGl0b3IuY29kZUFjdGlvbnNPblNhdmUnXTtcbiAgICAgIH1cbiAgICAgIGlmICgnZWRpdG9yLmZvcm1hdE9uU2F2ZScgaW4gc2V0dGluZ3MpIHtcbiAgICAgICAgZGVsZXRlIHNldHRpbmdzWydlZGl0b3IuZm9ybWF0T25TYXZlJ107XG4gICAgICB9XG4gICAgICBzb3J0S2V5cyhzZXR0aW5ncyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MsIHVuZGVmaW5lZCwgMik7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGV4Y2x1ZGVTZXR0aW5nKGV4Y2x1ZGVGaWxlUGF0dGVybjogc3RyaW5nKTogb2JqZWN0IHtcbiAgcmV0dXJuIHtcbiAgICAnZmlsZXMud2F0Y2hlckV4Y2x1ZGUnOiB7XG4gICAgICBbZXhjbHVkZUZpbGVQYXR0ZXJuXTogdHJ1ZSxcbiAgICB9LFxuICB9O1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBDb25maWd1cmF0aW9uVmFsdWVNYXAgfSBmcm9tICdAeWFybnBrZy9jb3JlJztcbmltcG9ydCB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHNwYXduU3luYywgc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0IH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcblxudHlwZSBTZXR0aW5ncyA9IHtcbiAgZGVmYXVsdFNlbXZlclJhbmdlUHJlZml4OiBzdHJpbmc7XG4gIG5tTW9kZTogc3RyaW5nO1xuICBub2RlTGlua2VyOiBzdHJpbmc7XG4gIG5wbU1pbmltYWxBZ2VHYXRlPzogc3RyaW5nO1xuICBucG1QcmVhcHByb3ZlZFBhY2thZ2VzPzogc3RyaW5nW107XG4gIHBsdWdpbnM/OiBQbHVnaW5bXTtcbn0gJiBQYXJ0aWFsPENvbmZpZ3VyYXRpb25WYWx1ZU1hcD47XG5cbmludGVyZmFjZSBQbHVnaW4ge1xuICBjaGVja3N1bTogc3RyaW5nO1xuICBwYXRoOiBzdHJpbmc7XG4gIHNwZWM6IHN0cmluZztcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlWWFybnJjWW1sKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlWWFybnJjWW1sJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHlhcm5yY1ltbFBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcueWFybnJjLnltbCcpO1xuICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybSh5YXJucmNZbWxQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgICBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcueWFybicpLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSlcbiAgICAgICk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgICAgZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAneWFybi5sb2NrJyksIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50VmVyc2lvbiA9IHNwYXduU3luY0FuZFJldHVyblN0ZG91dCgneWFybicsIFsnLS12ZXJzaW9uJ10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICBjb25zdCBsYXRlc3RWZXJzaW9uID0gZ2V0TGF0ZXN0VmVyc2lvbignQHlhcm5wa2cvY2xpJywgY29uZmlnLmRpclBhdGgpO1xuICAgIGlmIChnZXRNYWpvck51bWJlcihjdXJyZW50VmVyc2lvbikgPD0gZ2V0TWFqb3JOdW1iZXIobGF0ZXN0VmVyc2lvbikgJiYgY3VycmVudFZlcnNpb24gIT09IGxhdGVzdFZlcnNpb24pIHtcbiAgICAgIHNwYXduU3luYygneWFybicsIFsnc2V0JywgJ3ZlcnNpb24nLCBsYXRlc3RWZXJzaW9uXSwgY29uZmlnLmRpclBhdGgsIDEpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlbGVhc2VzUGF0aCA9IHBhdGguam9pbihjb25maWcuZGlyUGF0aCwgJy55YXJuJywgJ3JlbGVhc2VzJyk7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIocmVsZWFzZXNQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcihyZWxlYXNlc1BhdGgpKSB7XG4gICAgICBpZiAoZmlsZS5zdGFydHNXaXRoKCd5YXJuLScpICYmICFmaWxlLnN0YXJ0c1dpdGgoYHlhcm4tJHtsYXRlc3RWZXJzaW9ufS5gKSkge1xuICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKHJlbGVhc2VzUGF0aCwgZmlsZSkpKTtcbiAgICAgICAgY29uc29sZS5sb2coJ1JlbW92ZWQnLCBwYXRoLmpvaW4ocmVsZWFzZXNQYXRoLCBmaWxlKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgeWFybnJjUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy55YXJucmMnKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oeWFybnJjUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSk7XG5cbiAgICBjb25zdCBzZXR0aW5ncyA9IHlhbWwubG9hZChhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZSh5YXJucmNZbWxQYXRoLCAndXRmOCcpKSBhcyBTZXR0aW5ncztcbiAgICBzZXR0aW5ncy5kZWZhdWx0U2VtdmVyUmFuZ2VQcmVmaXggPSAnJztcbiAgICBzZXR0aW5ncy5ub2RlTGlua2VyID0gJ25vZGUtbW9kdWxlcyc7XG4gICAgc2V0dGluZ3Mubm1Nb2RlID0gJ2hhcmRsaW5rcy1nbG9iYWwnO1xuICAgIHNldHRpbmdzLm5wbU1pbmltYWxBZ2VHYXRlID0gJzVkJztcbiAgICBzZXR0aW5ncy5ucG1QcmVhcHByb3ZlZFBhY2thZ2VzID0gW1xuICAgICAgLy8gV2UgYmVsaWV2ZSB3ZSBhcmUgc2FmZVxuICAgICAgJ0BleGVyY29kZS8qJyxcbiAgICAgICdAd2lsbGJvb3N0ZXIvKicsXG4gICAgICAnYWdlbnQtcnVudGltZS1raXQnLFxuICAgICAgLy8gVG8gZGVhbCB3aXRoIENWRSBsaWtlIGh0dHBzOi8vbmV4dGpzLm9yZy9ibG9nL0NWRS0yMDI1LTY2NDc4XG4gICAgICAnbmV4dCcsXG4gICAgICAnQG5leHQvKicsXG4gICAgICAncmVhY3QnLFxuICAgICAgJ3JlYWN0LWRvbScsXG4gICAgXTtcbiAgICBkZWxldGUgc2V0dGluZ3MuY29tcHJlc3Npb25MZXZlbDtcbiAgICBpZiAoc2V0dGluZ3MuaW5qZWN0RW52aXJvbm1lbnRGaWxlcz8ubGVuZ3RoID09PSAwKSB7XG4gICAgICBkZWxldGUgc2V0dGluZ3MuaW5qZWN0RW52aXJvbm1lbnRGaWxlcztcbiAgICB9XG4gICAgLy8gY2YuIGh0dHBzOi8vZ2l0aHViLmNvbS95YXJucGtnL2JlcnJ5L3B1bGwvNDY5OFxuICAgIHNldHRpbmdzLmVuYWJsZUdsb2JhbENhY2hlID0gdHJ1ZTtcbiAgICBjb25zdCBvcmlnaW5hbExlbmd0aCA9IHNldHRpbmdzLnBsdWdpbnM/Lmxlbmd0aCA/PyAwO1xuICAgIHNldHRpbmdzLnBsdWdpbnMgPSBzZXR0aW5ncy5wbHVnaW5zPy5maWx0ZXIoKHApID0+IHAucGF0aCAhPT0gJy55YXJuL3BsdWdpbnMvdW5kZWZpbmVkLmNqcycpID8/IFtdO1xuICAgIGlmIChzZXR0aW5ncy5wbHVnaW5zLmxlbmd0aCAhPT0gb3JpZ2luYWxMZW5ndGgpIHtcbiAgICAgIGNvbnN0IHBsdWdpblBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcueWFybnJjJywgJ3VuZGVmaW5lZC5janMnKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwbHVnaW5QYXRoLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICB9XG4gICAgaWYgKHNldHRpbmdzLnBsdWdpbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICBkZWxldGUgc2V0dGluZ3MucGx1Z2lucztcbiAgICB9XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHlhcm5yY1ltbFBhdGgsIHlhbWwuZHVtcChzZXR0aW5ncywgeyBsaW5lV2lkdGg6IC0xIH0pKTtcblxuICAgIHNwYXduU3luYygneWFybicsIFsnZGx4JywgJ3lhcm4tcGx1Z2luLWF1dG8taW5zdGFsbCddLCBjb25maWcuZGlyUGF0aCk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGF0ZXN0VmVyc2lvbihwYWNrYWdlTmFtZTogc3RyaW5nLCBkaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCB2ZXJzaW9uc0pzb24gPSBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoJ25wbScsIFsnc2hvdycsIHBhY2thZ2VOYW1lLCAndmVyc2lvbnMnLCAnLS1qc29uJ10sIGRpclBhdGgpO1xuICBjb25zdCB2ZXJzaW9ucyA9IEpTT04ucGFyc2UodmVyc2lvbnNKc29uKSBhcyBzdHJpbmdbXTtcbiAgcmV0dXJuIHZlcnNpb25zLmF0KC0xKSBhcyBzdHJpbmc7XG59XG5mdW5jdGlvbiBnZXRNYWpvck51bWJlcih2ZXJzaW9uOiBzdHJpbmcpOiBudW1iZXIge1xuICBjb25zdCBbbWFqb3JdID0gdmVyc2lvbi5zcGxpdCgnLicpO1xuICByZXR1cm4gTnVtYmVyKG1ham9yKTtcbn1cbiIsImltcG9ydCB0eXBlIHsgT2N0b2tpdCB9IGZyb20gJ0BvY3Rva2l0L2NvcmUnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZXRPY3Rva2l0LCBnaXRIdWJVdGlsLCBoYXNHaXRIdWJUb2tlbiB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0dXBMYWJlbHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignc2V0dXBMYWJlbHMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgW293bmVyLCByZXBvXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShjb25maWcucmVwb3NpdG9yeSA/PyAnJyk7XG4gICAgaWYgKCFvd25lciB8fCAhcmVwbykgcmV0dXJuO1xuICAgIGlmIChvd25lciAhPT0gJ1dpbGxCb29zdGVyJyAmJiBvd25lciAhPT0gJ1dpbGxCb29zdGVyTGFiJykgcmV0dXJuO1xuICAgIGlmICghaGFzR2l0SHViVG9rZW4ob3duZXIpKSByZXR1cm47XG5cbiAgICBjb25zdCBvY3Rva2l0ID0gZ2V0T2N0b2tpdChvd25lcik7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2QxOiB4LWVhc3kgOmhlZGdlaG9nOicsICdFREU5RkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkMjogZWFzeSA6cmFiYml0MjonLCAnRERENkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDM6IG1lZGl1bSA6b3g6JywgJ0M0QjVGRCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2Q0OiBoYXJkIDpzcXVpZDonLCAnQTc4QkZBJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDU6IHgtaGFyZCA6d2hhbGUyOicsICc4QjVDRjYnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdwMTogY3JpdGljYWwgOmZpcmU6OmZpcmU6OmZpcmU6JywgJ0VGNDQ0NCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3AyOiB1cmdlbnQgOmZpcmU6OmZpcmU6JywgJ0Y4NzE3MScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3AzOiBpbXBvcnRhbnQgOmZpcmU6JywgJ0ZDQTVBNScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3A0OiBuaWNlIHRvIGhhdmUgOmRyb3BsZXQ6JywgJ0ZFQ0FDQScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IGJsaXR6JywgJzUzMDBiYycpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IGZpcmViYXNlJywgJ2ZmY2EyOCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IHByaXNtYScsICcwYzM0NGInKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiByZWFjdCcsICc2MWRhZmInKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiBzdmVsdGUnLCAnZmYzZTAwJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogc2VtYW50aWMtcmVsZWFzZScsICc0OTQ5NDknKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyZWFkeSA6cm9ja2V0OicsICcyMkM1NUUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyZXZpZXcgcmVxdWVzdGVkIDptYWc6JywgJ0ZCQ0EwNCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JlbGVhc2VkIDpib29rbWFyazonLCAnNjM2NkYxJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogMC41aCA6Y2xvY2sxMjMwOicsICdGM0Y0RjYnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiAxaCA6Y2xvY2sxOicsICdFNUU3RUInKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiAyaCA6Y2xvY2syOicsICdEMUQ1REInKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiAzaCA6Y2xvY2szOicsICc5Q0EzQUYnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiA1aCA6Y2xvY2s1OicsICc2QjcyODAnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiA4aCA6Y2xvY2s4OicsICc0QjU1NjMnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiAxM2ggOmNsb2NrMTonLCAnMzc0MTUxJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogYnVpbGQgOmhhbW1lcjonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogY2hvcmUgOmJyb29tOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBjaSA6Y29uc3RydWN0aW9uX3dvcmtlcjonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogZG9jcyA6bWVtbzonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogZmVhdCA6c3BhcmtsZXM6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGZpeCA6YnVnOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBwZXJmIDp6YXA6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IHJlZmFjdG9yIDpyZWN5Y2xlOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBzdHlsZSA6bGlwc3RpY2s6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IHRlc3QgOnRlc3RfdHViZTonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncHJvamVjdCcsICcyNDI5MkYnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdmb2N1c2VkIDpkYXJ0OicsICcyMkM1NUUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdnZW4tcHItYWxsIDpyb2JvdDonLCAnMDBCNEQ4Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZ2VuLXByLWNsYXVkZSA6cm9ib3Q6JywgJzAwQjREOCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2dlbi1wci1jb2RleCA6cm9ib3Q6JywgJzAwQjREOCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2dlbi1wci1nZW1pbmkgOnJvYm90OicsICcwMEI0RDgnKTtcblxuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdidWcnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZG9jdW1lbnRhdGlvbicpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkdXBsaWNhdGUnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZW5oYW5jZW1lbnQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZ29vZCBmaXJzdCBpc3N1ZScpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdoZWxwIHdhbnRlZCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdpbnZhbGlkJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3F1ZXN0aW9uJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3dvbnRmaXgnKTtcblxuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyZWFkeScpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyZXZpZXcgcmVxdWVzdGVkJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JlbGVhc2VkJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3NlbWFudGljLXJlbGVhc2UnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnbGxtLXByIDpyb2JvdDonKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnYWktcHIgOnJvYm90OicpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1NraXAgc2V0dXBMYWJlbHMgZHVlIHRvOicsIChlcnJvciBhcyBFcnJvciB8IHVuZGVmaW5lZCk/LnN0YWNrID8/IGVycm9yKTtcbiAgICB9XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzZXR1cExhYmVsKG9jdG9raXQ6IE9jdG9raXQsIG93bmVyOiBzdHJpbmcsIHJlcG86IHN0cmluZywgbmFtZTogc3RyaW5nLCBjb2xvcjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgLy8gSXNzdWVzIHBlcm1pc3Npb25cbiAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ1BPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVscycsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIG5hbWUsXG4gICAgICBjb2xvcixcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gSXNzdWVzIHBlcm1pc3Npb25cbiAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ1BBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHMve25hbWV9Jywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgbmFtZSxcbiAgICAgIGNvbG9yLFxuICAgIH0pO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUxhYmVsKG9jdG9raXQ6IE9jdG9raXQsIG93bmVyOiBzdHJpbmcsIHJlcG86IHN0cmluZywgbmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgLy8gSXNzdWVzIHBlcm1pc3Npb25cbiAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ0RFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vbGFiZWxzL3tuYW1lfScsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIG5hbWUsXG4gICAgfSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuIiwiaW1wb3J0IGRvdGVudiBmcm9tICdkb3RlbnYnO1xuaW1wb3J0IHNvZGl1bSBmcm9tICdsaWJzb2RpdW0td3JhcHBlcnMnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4uL29wdGlvbnMuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZXRPY3Rva2l0LCBnaXRIdWJVdGlsLCBoYXNHaXRIdWJUb2tlbiB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuXG5jb25zdCBERVBSRUNBVEVEX1NFQ1JFVF9OQU1FUyA9IFsnUkVBRFlfRElTQ09SRF9XRUJIT09LX1VSTCcsICdHSF9CT1RfUEFUJywgJ1BVQkxJQ19HSF9CT1RfUEFUJ107XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cFNlY3JldHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignc2V0dXBTZWNyZXRzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IFtvd25lciwgcmVwb10gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUoY29uZmlnLnJlcG9zaXRvcnkgPz8gJycpO1xuICAgIGlmICghb3duZXIgfHwgIXJlcG8gfHwgb3duZXIgIT09ICdXaWxsQm9vc3RlckxhYicpIHJldHVybjtcbiAgICBpZiAoIWhhc0dpdEh1YlRva2VuKG93bmVyKSB8fCAhb3B0aW9ucy5kb2VzVXBsb2FkRW52VmFycykgcmV0dXJuO1xuXG4gICAgY29uc3QgcGFyc2VkID0gZG90ZW52LmNvbmZpZygpLnBhcnNlZCA/PyB7fTtcbiAgICBpZiAoT2JqZWN0LmtleXMocGFyc2VkKS5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIGNvbnN0IG9jdG9raXQgPSBnZXRPY3Rva2l0KG93bmVyKTtcblxuICAgIHRyeSB7XG4gICAgICBmb3IgKGNvbnN0IHNlY3JldE5hbWUgb2YgREVQUkVDQVRFRF9TRUNSRVRfTkFNRVMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBSZXF1aXJlcyBTZWNyZXRzIHBlcm1pc3Npb25cbiAgICAgICAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ0RFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9zZWNyZXRzL3tzZWNyZXRfbmFtZX0nLCB7XG4gICAgICAgICAgICBvd25lcixcbiAgICAgICAgICAgIHJlcG8sXG4gICAgICAgICAgICBzZWNyZXRfbmFtZTogc2VjcmV0TmFtZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gZG8gbm90aGluZ1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFJlcXVpcmVzIFNlY3JldHMgcGVybWlzc2lvblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ0dFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9zZWNyZXRzL3B1YmxpYy1rZXknLCB7XG4gICAgICAgIG93bmVyLFxuICAgICAgICByZXBvLFxuICAgICAgfSk7XG4gICAgICBjb25zdCB7IGtleSwga2V5X2lkOiBrZXlJZCB9ID0gcmVzcG9uc2UuZGF0YTtcblxuICAgICAgYXdhaXQgc29kaXVtLnJlYWR5O1xuXG4gICAgICBmb3IgKGNvbnN0IFtuYW1lLCBzZWNyZXRdIG9mIE9iamVjdC5lbnRyaWVzKHBhcnNlZCkpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIG5hbWUgPT09ICdHSF9CT1RfUEFUJyB8fFxuICAgICAgICAgIG5hbWUgPT09ICdHSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUicgfHxcbiAgICAgICAgICBuYW1lID09PSAnR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVJMQUInXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29udmVydCBTZWNyZXQgJiBCYXNlNjQga2V5IHRvIFVpbnQ4QXJyYXkuXG4gICAgICAgIGNvbnN0IHJhd0tleSA9IHNvZGl1bS5mcm9tX2Jhc2U2NChrZXksIHNvZGl1bS5iYXNlNjRfdmFyaWFudHMuT1JJR0lOQUwpO1xuICAgICAgICBjb25zdCByYXdTZWMgPSBzb2RpdW0uZnJvbV9zdHJpbmcoc2VjcmV0KTtcblxuICAgICAgICAvLyBFbmNyeXB0IHRoZSBzZWNyZXQgdXNpbmcgTGliU29kaXVtXG4gICAgICAgIGNvbnN0IGVuY0J5dGVzID0gc29kaXVtLmNyeXB0b19ib3hfc2VhbChyYXdTZWMsIHJhd0tleSk7XG5cbiAgICAgICAgLy8gQ29udmVydCBlbmNyeXB0ZWQgVWludDhBcnJheSB0byBCYXNlNjRcbiAgICAgICAgY29uc3QgZW5jQmFzZTY0ID0gc29kaXVtLnRvX2Jhc2U2NChlbmNCeXRlcywgc29kaXVtLmJhc2U2NF92YXJpYW50cy5PUklHSU5BTCk7XG5cbiAgICAgICAgLy8gUmVxdWlyZXMgU2VjcmV0cyBwZXJtaXNzaW9uXG4gICAgICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3NlY3JldHMve3NlY3JldF9uYW1lfScsIHtcbiAgICAgICAgICBvd25lcixcbiAgICAgICAgICByZXBvLFxuICAgICAgICAgIHNlY3JldF9uYW1lOiBuYW1lLFxuICAgICAgICAgIGVuY3J5cHRlZF92YWx1ZTogZW5jQmFzZTY0LFxuICAgICAgICAgIGtleV9pZDoga2V5SWQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1NraXAgc2V0dXBTZWNyZXRzIGR1ZSB0bzonLCAoZXJyb3IgYXMgRXJyb3IgfCB1bmRlZmluZWQpPy5zdGFjayA/PyBlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cbiIsImltcG9ydCB7IHdpdGhSZXRyeSB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliJztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZXRPY3Rva2l0LCBnaXRIdWJVdGlsLCBoYXNHaXRIdWJUb2tlbiB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0dXBHaXRIdWJTZXR0aW5ncyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgW293bmVyLCByZXBvXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShjb25maWcucmVwb3NpdG9yeSA/PyAnJyk7XG4gIGlmICghb3duZXIgfHwgIXJlcG8pIHJldHVybjtcbiAgaWYgKG93bmVyICE9PSAnV2lsbEJvb3N0ZXInICYmIG93bmVyICE9PSAnV2lsbEJvb3N0ZXJMYWInKSByZXR1cm47XG4gIGlmICghaGFzR2l0SHViVG9rZW4ob3duZXIpKSByZXR1cm47XG5cbiAgY29uc3Qgb2N0b2tpdCA9IGdldE9jdG9raXQob3duZXIpO1xuXG4gIC8vIEFkbWluaXN0cmF0aW9uIHBlcm1pc3Npb25cbiAgYXdhaXQgd2l0aFJldHJ5KCgpID0+XG4gICAgb2N0b2tpdC5yZXF1ZXN0KCdQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30nLCB7XG4gICAgICBvd25lcixcbiAgICAgIHJlcG8sXG4gICAgICBhbGxvd19hdXRvX21lcmdlOiB0cnVlLFxuICAgICAgYWxsb3dfbWVyZ2VfY29tbWl0OiBmYWxzZSxcbiAgICAgIGFsbG93X3NxdWFzaF9tZXJnZTogdHJ1ZSxcbiAgICAgIGFsbG93X3JlYmFzZV9tZXJnZTogZmFsc2UsXG4gICAgICBhbGxvd191cGRhdGVfYnJhbmNoOiB0cnVlLFxuICAgICAgZGVsZXRlX2JyYW5jaF9vbl9tZXJnZTogdHJ1ZSxcbiAgICAgIHNxdWFzaF9tZXJnZV9jb21taXRfdGl0bGU6ICdQUl9USVRMRScsXG4gICAgICBzcXVhc2hfbWVyZ2VfY29tbWl0X21lc3NhZ2U6ICdCTEFOSycsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgICdYLUdpdEh1Yi1BcGktVmVyc2lvbic6ICcyMDIyLTExLTI4JyxcbiAgICAgIH0sXG4gICAgICAuLi4oY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3Rlci8nKSA/IHsgYWxsb3dfYXV0b19tZXJnZTogdHJ1ZSB9IDoge30pLFxuICAgIH0pXG4gICk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBkaXN0YW5jZSB9IGZyb20gJ2Zhc3Rlc3QtbGV2ZW5zaHRlaW4nO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IHBhY2thZ2VNYW5hZ2VyUnVuUGxhY2Vob2xkZXIgPSAnX19QTV9SVU5fXyc7XG5cbmNvbnN0IHRlbXBsYXRlcyA9IHtcbiAgJ3B1bGxfcmVxdWVzdF90ZW1wbGF0ZS5tZCc6IGBcbkNsb3NlICM8SXNzdWVOdW1iZXI+XG5cbiMjIFNlbGYgQ2hlY2tcblxuLSBbIF0gSSd2ZSBjb25maXJtZWQgXFxgQWxsIGNoZWNrcyBoYXZlIHBhc3NlZFxcYCBvbiB0aGlzIHBhZ2UuXG4gIC0gUFIgdGl0bGUgZm9sbG93cyBbQW5ndWxhcidzIGNvbW1pdCBtZXNzYWdlIGZvcm1hdF0oaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9ibG9iL21haW4vQ09OVFJJQlVUSU5HLm1kIy1jb21taXQtbWVzc2FnZS1mb3JtYXQpLlxuICAtIFBSIHRpdGxlIGRvZXNuJ3QgaGF2ZSBcXGBXSVA6XFxgLlxuICAtIFRoZSB0ZXN0IGNvbW1hbmQgKGUuZy4sIFxcYCR7cGFja2FnZU1hbmFnZXJSdW5QbGFjZWhvbGRlcn0gdGVzdFxcYCkgcGFzc2VkLlxuICAtIFRoZSBsaW50IGNvbW1hbmQgKGUuZy4sIFxcYCR7cGFja2FnZU1hbmFnZXJSdW5QbGFjZWhvbGRlcn0gbGludFxcYCkgcGFzc2VkLlxuICAtIFlvdSBtYXkgbGVhdmUgdGhpcyBib3ggdW5jaGVja2VkIGR1ZSB0byBsb25nIHdvcmtmbG93cy5cbi0gWyBdIEkndmUgcmV2aWV3ZWQgbXkgY2hhbmdlcyBvbiB0aGUgR2l0SHViIGRpZmYgdmlldy5cbi0gWyBdIEkndmUgd3JpdHRlbiB0aGUgc3RlcHMgdG8gdGVzdCBteSBjaGFuZ2VzLlxuLSBbIF0gSSd2ZSBhZGRlZCBzY3JlZW5zaG90cyAoaWYgdGhlIFVJIGNoYW5nZWQpLlxuICAtIFlvdSBtYXkgbGVhdmUgdGhpcyBib3ggdW5jaGVja2VkIGlmIHlvdSBkaWRuJ3QgbW9kaWZ5IHRoZSBVSS5cblxuPCEtLSBQbGVhc2UgYWRkIHNjcmVlbnNob3RzIGlmIHlvdSBtb2RpZnkgdGhlIFVJLlxufCBDdXJyZW50ICAgICAgICAgICAgICAgICAgfCBJbiBjb21pbmcgICAgICAgICAgICAgICAgfFxufCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfFxufCA8aW1nIHNyYz1cIlwiIHdpZHRoPVwiNDAwXCI+IHwgPGltZyBzcmM9XCJcIiB3aWR0aD1cIjQwMFwiPiB8XG4tLT5cblxuPCEtLSBQbGVhc2UgYWRkIHN0ZXBzIHRvIHRlc3QgeW91ciBjaGFuZ2VzLlxuIyMgU3RlcHMgdG8gVGVzdFxuXG4xLiBPcGVuIGh0dHA6Ly9sb2NhbGhvc3QtZXhlcmNvZGUud2lsbGJvb3N0ZXIubmV0OjMwMDAvamEtSlAvY291cnNlcy9fZXhhbXBsZS9sZXNzb25zL19leGFtcGxlX2FfcGx1c19iL3Byb2JsZW1zL19leGFtcGxlX2FfcGx1c19iIGFmdGVyIGxvZ2luLlxuMi4gU2VsZWN0IHRoZSBsYW5ndWFnZSBcXGBDXFxgLlxuMy4gV3JpdGUgdGhlIGZvbGxvd2luZyBjb2RlOlxuICAgXFxgXFxgXFxgY1xuICAgI2luY2x1ZGUgPHN0ZGlvLmg+XG5cbiAgIGludCBtYWluKHZvaWQpIHtcbiAgICAgaW50IGEsIGI7XG5cbiAgICAgc2NhbmYoXCIlZCAlZFwiLCAmYSwgJmIpO1xuICAgICBwcmludGYoXCIlZFwiLCBhICsgYik7XG4gICAgIHJldHVybiAwO1xuICAgfVxuICAgXFxgXFxgXFxgXG40LiBQdXNoIFxcYFN1Ym1pdFxcYCBidXR0b24uXG41LiAuLi5cbi0tPlxuYC50cmltKCksXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgZm9yIChjb25zdCBbZmlsZU5hbWUsIG5ld0NvbnRlbnRdIG9mIE9iamVjdC5lbnRyaWVzKHRlbXBsYXRlcykpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhcHBseVBhY2thZ2VNYW5hZ2VyVGVtcGxhdGUobmV3Q29udGVudCwgY29uZmlnKTtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicsIGZpbGVOYW1lKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSkge1xuICAgICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICAgIGlmIChkaXN0YW5jZShvbGRDb250ZW50LCBjb250ZW50KSA+IGNvbnRlbnQubGVuZ3RoIC8gMikge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRodWInKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgY29udGVudCkpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGFwcGx5UGFja2FnZU1hbmFnZXJUZW1wbGF0ZSh0ZW1wbGF0ZTogc3RyaW5nLCBjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBjb25zdCBwYWNrYWdlTWFuYWdlckNvbW1hbmQgPSBjb25maWcuaXNCdW4gPyAnYnVuIHJ1bicgOiAneWFybic7XG4gIHJldHVybiB0ZW1wbGF0ZS5yZXBsYWNlQWxsKHBhY2thZ2VNYW5hZ2VyUnVuUGxhY2Vob2xkZXIsIHBhY2thZ2VNYW5hZ2VyQ29tbWFuZCk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgZnNwIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYic7XG5pbXBvcnQgeyBzaW1wbGVHaXQgfSBmcm9tICdzaW1wbGUtZ2l0JztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5cbmltcG9ydCB7IGdldE9jdG9raXQsIGdpdEh1YlV0aWwgfSBmcm9tICcuL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJy4vdXRpbHMvZ2xvYlV0aWwuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBhY2thZ2VDb25maWcge1xuICBkaXJQYXRoOiBzdHJpbmc7XG4gIGRvY2tlcmZpbGU6IHN0cmluZztcbiAgaXNSb290OiBib29sZWFuO1xuICBpc1B1YmxpY1JlcG86IGJvb2xlYW47XG4gIGlzUmVmZXJyZWRCeU90aGVyUmVwbzogYm9vbGVhbjtcbiAgcmVwb3NpdG9yeT86IHN0cmluZztcbiAgcmVwb0F1dGhvcj86IHN0cmluZztcbiAgcmVwb05hbWU/OiBzdHJpbmc7XG4gIGlzV2lsbEJvb3N0ZXJSZXBvOiBib29sZWFuO1xuICBpc0J1bjogYm9vbGVhbjtcbiAgaXNFc21QYWNrYWdlOiBib29sZWFuO1xuICBpc1dpbGxCb29zdGVyQ29uZmlnczogYm9vbGVhbjtcbiAgLy8gZGVwZW5kZW5jeSBpbmZvcm1hdGlvblxuICBkb2VzQ29udGFpblN1YlBhY2thZ2VKc29uczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Eb2NrZXJmaWxlOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkdlbWZpbGU6IGJvb2xlYW47XG4gIGRvZXNDb250YWluR29Nb2Q6IGJvb2xlYW47XG4gIGRvZXNDb250YWluUGFja2FnZUpzb246IGJvb2xlYW47XG4gIGRvZXNDb250YWluUG9ldHJ5TG9jazogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Qb21YbWw6IGJvb2xlYW47XG4gIGRvZXNDb250YWluUHVic3BlY1lhbWw6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVGVtcGxhdGVZYW1sOiBib29sZWFuO1xuICBkb2VzQ29udGFpblZzY29kZVNldHRpbmdzSnNvbjogYm9vbGVhbjtcbiAgLy8gc291cmNlIGNvZGUgZmlsZXNcbiAgZG9lc0NvbnRhaW5KYXZhU2NyaXB0OiBib29sZWFuO1xuICBkb2VzQ29udGFpblR5cGVTY3JpcHQ6IGJvb2xlYW47XG4gIGRvZXNDb250YWluSnN4T3JUc3g6IGJvb2xlYW47XG4gIGRvZXNDb250YWluSmF2YVNjcmlwdEluUGFja2FnZXM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluSnN4T3JUc3hJblBhY2thZ2VzOiBib29sZWFuO1xuXG4gIGhhc1N0YXJ0VGVzdFNlcnZlcjogYm9vbGVhbjtcblxuICBkZXBlbmRpbmc6IHtcbiAgICBibGl0ejogYm9vbGVhbjtcbiAgICBmaXJlYmFzZTogYm9vbGVhbjtcbiAgICBnZW5JMThuVHM6IGJvb2xlYW47XG4gICAgbGl0ZXN0cmVhbTogYm9vbGVhbjtcbiAgICBuZXh0OiBib29sZWFuO1xuICAgIHBsYXl3cmlnaHRUZXN0OiBib29sZWFuO1xuICAgIHByaXNtYTogYm9vbGVhbjtcbiAgICBweXJpZ2h0OiBib29sZWFuO1xuICAgIHJlYWN0OiBib29sZWFuO1xuICAgIHJlYWN0TmF0aXZlOiBib29sZWFuO1xuICAgIHNlbWFudGljUmVsZWFzZTogYm9vbGVhbjtcbiAgICBzdG9yeWJvb2s6IGJvb2xlYW47XG4gICAgd2I6IGJvb2xlYW47XG4gIH07XG4gIHJlbGVhc2U6IHtcbiAgICBicmFuY2hlczogc3RyaW5nW107XG4gICAgZ2l0aHViOiBib29sZWFuO1xuICAgIG5wbTogYm9vbGVhbjtcbiAgfTtcbiAgZXNsaW50QmFzZT86IEVzbGludEV4dGVuc2lvbkJhc2U7XG4gIGhhc1ZlcnNpb25TZXR0aW5nczogYm9vbGVhbjtcbiAgcGFja2FnZUpzb24/OiBQYWNrYWdlSnNvbjtcbiAgd2JmeUpzb24/OiBXYmZ5SnNvbjtcbn1cblxudHlwZSBXYmZ5SnNvbiA9IHouaW5mZXI8dHlwZW9mIHdiZnlKc29uU2NoZW1hPjtcblxuY29uc3Qgd2JmeUpzb25TY2hlbWEgPSB6Lm9iamVjdCh7XG4gIHR5cG9zOiB6XG4gICAgLm9iamVjdCh7XG4gICAgICBhbGw6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgICBkb2M6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgICB0czogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICAgIHRleHQ6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgfSlcbiAgICAub3B0aW9uYWwoKSxcbn0pO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UGFja2FnZUNvbmZpZyhcbiAgZGlyUGF0aDogc3RyaW5nLFxuICByb290Q29uZmlnPzogUGFja2FnZUNvbmZpZ1xuKTogUHJvbWlzZTxQYWNrYWdlQ29uZmlnIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIHRyeSB7XG4gICAgY29uc3QgZG9lc0NvbnRhaW5QYWNrYWdlSnNvbiA9IGZzLmV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKTtcbiAgICBsZXQgZGVwZW5kZW5jaWVzOiBQYWNrYWdlSnNvblsnZGVwZW5kZW5jaWVzJ10gPSB7fTtcbiAgICBsZXQgZGV2RGVwZW5kZW5jaWVzOiBQYWNrYWdlSnNvblsnZGV2RGVwZW5kZW5jaWVzJ10gPSB7fTtcbiAgICBsZXQgcGFja2FnZUpzb246IFBhY2thZ2VKc29uID0ge307XG4gICAgbGV0IGVzbVBhY2thZ2UgPSBmYWxzZTtcbiAgICBpZiAoZG9lc0NvbnRhaW5QYWNrYWdlSnNvbikge1xuICAgICAgY29uc3QgcGFja2FnZUpzb25UZXh0ID0gZnMucmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShwYWNrYWdlSnNvblRleHQpIGFzIFBhY2thZ2VKc29uO1xuICAgICAgZGVwZW5kZW5jaWVzID0gcGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgZGV2RGVwZW5kZW5jaWVzID0gcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgZXNtUGFja2FnZSA9IHBhY2thZ2VKc29uLnR5cGUgPT09ICdtb2R1bGUnO1xuICAgIH1cblxuICAgIGxldCByZWxlYXNlQnJhbmNoZXM6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IHJlbGVhc2VQbHVnaW5zOiBzdHJpbmdbXSA9IFtdO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZWxlYXNlcmNKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLnJlbGVhc2VyYy5qc29uJyk7XG4gICAgICBjb25zdCBqc29uID0gSlNPTi5wYXJzZShhd2FpdCBmc3AucmVhZEZpbGUocmVsZWFzZXJjSnNvblBhdGgsICd1dGY4JykpIGFzXG4gICAgICAgIHwge1xuICAgICAgICAgICAgYnJhbmNoZXM6IHN0cmluZ1tdO1xuICAgICAgICAgICAgcGx1Z2lucz86IHN0cmluZ1tdW107XG4gICAgICAgICAgfVxuICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICAgIHJlbGVhc2VCcmFuY2hlcyA9IGpzb24/LmJyYW5jaGVzID8/IFtdO1xuICAgICAgcmVsZWFzZVBsdWdpbnMgPSBqc29uPy5wbHVnaW5zPy5mbGF0KCkgPz8gW107XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgY29uc3QgaXNSb290ID1cbiAgICAgIHBhdGguYmFzZW5hbWUocGF0aC5yZXNvbHZlKGRpclBhdGgsICcuLicpKSAhPT0gJ3BhY2thZ2VzJyB8fFxuICAgICAgIWZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICcuLicsICcuLicsICdwYWNrYWdlLmpzb24nKSk7XG5cbiAgICBsZXQgcmVwb0luZm86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICAgIGlmIChpc1Jvb3QpIHtcbiAgICAgIHJlcG9JbmZvID0gYXdhaXQgZmV0Y2hSZXBvSW5mbyhkaXJQYXRoLCBwYWNrYWdlSnNvbik7XG4gICAgfVxuXG4gICAgbGV0IGhhc1ZlcnNpb25TZXR0aW5ncyA9IGhhc1ZlcnNpb25TZXR0aW5nc0ZpbGUoZGlyUGF0aCk7XG4gICAgZm9yIChjb25zdCBwcmVmaXggb2YgWydqYXZhJywgJ25vZGUnLCAncHl0aG9uJ10pIHtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCBgLiR7cHJlZml4fS12ZXJzaW9uYCkpKSB7XG4gICAgICAgIGhhc1ZlcnNpb25TZXR0aW5ncyA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBkb2NrZXJmaWxlID0gJyc7XG4gICAgdHJ5IHtcbiAgICAgIGRvY2tlcmZpbGUgPSBhd2FpdCBmc3AucmVhZEZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsICdEb2NrZXJmaWxlJyksICd1dGY4Jyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgLy8gUmVhZCB3YmZ5Lmpzb25cbiAgICBjb25zdCB3YmZ5SnNvblBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3diZnkuanNvbicpO1xuICAgIGxldCB3YmZ5SnNvbjogV2JmeUpzb24gfCB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHdiZnlKc29uVGV4dCA9IGF3YWl0IGZzcC5yZWFkRmlsZSh3YmZ5SnNvblBhdGgsICd1dGY4Jyk7XG4gICAgICB3YmZ5SnNvbiA9IHdiZnlKc29uU2NoZW1hLnBhcnNlKEpTT04ucGFyc2Uod2JmeUpzb25UZXh0KSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgY29uc3QgcmVwb0Z1bGxOYW1lID0gdHlwZW9mIHJlcG9JbmZvPy5mdWxsX25hbWUgPT09ICdzdHJpbmcnID8gcmVwb0luZm8uZnVsbF9uYW1lIDogdW5kZWZpbmVkO1xuICAgIGxldCByZXBvQXV0aG9yOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHJlcG9OYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHJlcG9GdWxsTmFtZSkge1xuICAgICAgY29uc3QgcmVwb1BhcnRzID0gcmVwb0Z1bGxOYW1lLnNwbGl0KCcvJyk7XG4gICAgICBpZiAocmVwb1BhcnRzLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgIHJlcG9BdXRob3IgPSByZXBvUGFydHNbMF07XG4gICAgICAgIHJlcG9OYW1lID0gcmVwb1BhcnRzWzFdO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCByZXBvc2l0b3J5ID0gcmVwb0Z1bGxOYW1lID8gYGdpdGh1Yjoke3JlcG9GdWxsTmFtZX1gIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGNvbmZpZzogUGFja2FnZUNvbmZpZyA9IHtcbiAgICAgIGRpclBhdGgsXG4gICAgICBkb2NrZXJmaWxlLFxuICAgICAgaXNSb290LFxuICAgICAgaXNQdWJsaWNSZXBvOiByZXBvSW5mbz8ucHJpdmF0ZSA9PT0gZmFsc2UsXG4gICAgICBpc1JlZmVycmVkQnlPdGhlclJlcG86ICEhcGFja2FnZUpzb24uZmlsZXMsXG4gICAgICByZXBvc2l0b3J5LFxuICAgICAgcmVwb0F1dGhvcixcbiAgICAgIHJlcG9OYW1lLFxuICAgICAgaXNXaWxsQm9vc3RlclJlcG86IEJvb2xlYW4oXG4gICAgICAgIHJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3Rlci8nKSB8fCByZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJylcbiAgICAgICksXG4gICAgICBpc0J1bjogcm9vdENvbmZpZz8uaXNCdW4gfHwgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ2J1bi5sb2NrJykpLFxuICAgICAgaXNFc21QYWNrYWdlOiBlc21QYWNrYWdlLFxuICAgICAgaXNXaWxsQm9vc3RlckNvbmZpZ3M6IHBhY2thZ2VKc29uUGF0aC5pbmNsdWRlcyhgJHtwYXRoLnNlcH13aWxsYm9vc3Rlci1jb25maWdzYCksXG4gICAgICBkb2VzQ29udGFpblN1YlBhY2thZ2VKc29uczogY29udGFpbnNBbnkoJ3BhY2thZ2VzLyoqL3BhY2thZ2UuanNvbicsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5Eb2NrZXJmaWxlOiAhIWRvY2tlcmZpbGUgfHwgZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2RvY2tlci1jb21wb3NlLnltbCcpKSxcbiAgICAgIGRvZXNDb250YWluR2VtZmlsZTogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ0dlbWZpbGUnKSksXG4gICAgICBkb2VzQ29udGFpbkdvTW9kOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnZ28ubW9kJykpLFxuICAgICAgZG9lc0NvbnRhaW5QYWNrYWdlSnNvbjogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSxcbiAgICAgIGRvZXNDb250YWluUG9ldHJ5TG9jazogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BvZXRyeS5sb2NrJykpLFxuICAgICAgZG9lc0NvbnRhaW5Qb21YbWw6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwb20ueG1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5QdWJzcGVjWWFtbDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3B1YnNwZWMueWFtbCcpKSxcbiAgICAgIGRvZXNDb250YWluVGVtcGxhdGVZYW1sOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAndGVtcGxhdGUueWFtbCcpKSxcbiAgICAgIGRvZXNDb250YWluVnNjb2RlU2V0dGluZ3NKc29uOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLnZzY29kZScsICdzZXR0aW5ncy5qc29uJykpLFxuICAgICAgZG9lc0NvbnRhaW5KYXZhU2NyaXB0OiBjb250YWluc0FueSgne2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjanMsbWpzLGpzLGpzeH0nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluVHlwZVNjcmlwdDogY29udGFpbnNBbnkoJ3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y3RzLG10cyx0cyx0c3h9JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbkpzeE9yVHN4OiBjb250YWluc0FueSgne2FwcCxzcmMsdGVzdH0vKiovKi57dCxqfXN4JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbkphdmFTY3JpcHRJblBhY2thZ2VzOiBjb250YWluc0FueSgncGFja2FnZXMvKiove2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjanMsbWpzLGpzLGpzeH0nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXM6IGNvbnRhaW5zQW55KCdwYWNrYWdlcy8qKi97YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2N0cyxtdHMsdHMsdHN4fScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5Kc3hPclRzeEluUGFja2FnZXM6IGNvbnRhaW5zQW55KCdwYWNrYWdlcy8qKi97YXBwLHNyYyx0ZXN0fS8qKi8qLnt0LGp9c3gnLCBkaXJQYXRoKSxcbiAgICAgIGhhc1N0YXJ0VGVzdFNlcnZlcjogISFwYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ3N0YXJ0LXRlc3Qtc2VydmVyJ10sXG4gICAgICBkZXBlbmRpbmc6IHtcbiAgICAgICAgYmxpdHo6ICEhZGVwZW5kZW5jaWVzLmJsaXR6LFxuICAgICAgICBmaXJlYmFzZTogISFkZXZEZXBlbmRlbmNpZXNbJ2ZpcmViYXNlLXRvb2xzJ10sXG4gICAgICAgIGdlbkkxOG5UczogISFkZXZEZXBlbmRlbmNpZXNbJ2dlbi1pMThuLXRzJ10sXG4gICAgICAgIGxpdGVzdHJlYW06IGRvY2tlcmZpbGUuaW5jbHVkZXMoJ2luc3RhbGwtbGl0ZXN0cmVhbS5zaCcpLFxuICAgICAgICByZWFjdDogISFkZXBlbmRlbmNpZXMucmVhY3QsXG4gICAgICAgIG5leHQ6ICEhZGVwZW5kZW5jaWVzLm5leHQsXG4gICAgICAgIHBsYXl3cmlnaHRUZXN0OlxuICAgICAgICAgICEhZGVwZW5kZW5jaWVzWydAcGxheXdyaWdodC90ZXN0J10gfHwgISFkZXZEZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXSB8fCAhIWRldkRlcGVuZGVuY2llcy5wbGF5d3JpZ2h0LFxuICAgICAgICBwcmlzbWE6ICEhZGVwZW5kZW5jaWVzWydAcHJpc21hL2NsaWVudCddIHx8ICEhZGV2RGVwZW5kZW5jaWVzLnByaXNtYSxcbiAgICAgICAgcHlyaWdodDogISFkZXZEZXBlbmRlbmNpZXMucHlyaWdodCxcbiAgICAgICAgcmVhY3ROYXRpdmU6ICEhZGVwZW5kZW5jaWVzWydyZWFjdC1uYXRpdmUnXSxcbiAgICAgICAgc2VtYW50aWNSZWxlYXNlOiAhIShcbiAgICAgICAgICBkZXZEZXBlbmRlbmNpZXNbJ3NlbWFudGljLXJlbGVhc2UnXSB8fFxuICAgICAgICAgIHJlbGVhc2VCcmFuY2hlcy5sZW5ndGggPiAwIHx8XG4gICAgICAgICAgcmVsZWFzZVBsdWdpbnMubGVuZ3RoID4gMFxuICAgICAgICApLFxuICAgICAgICBzdG9yeWJvb2s6ICEhZGV2RGVwZW5kZW5jaWVzWydAc3Rvcnlib29rL3JlYWN0J10sXG4gICAgICAgIHdiOiAhIWRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3diJ10gfHwgISFkZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci93YiddLFxuICAgICAgfSxcbiAgICAgIHJlbGVhc2U6IHtcbiAgICAgICAgYnJhbmNoZXM6IHJlbGVhc2VCcmFuY2hlcyxcbiAgICAgICAgZ2l0aHViOiByZWxlYXNlUGx1Z2lucy5pbmNsdWRlcygnQHNlbWFudGljLXJlbGVhc2UvZ2l0aHViJyksXG4gICAgICAgIG5wbTogcmVsZWFzZVBsdWdpbnMuaW5jbHVkZXMoJ0BzZW1hbnRpYy1yZWxlYXNlL25wbScpLFxuICAgICAgfSxcbiAgICAgIGhhc1ZlcnNpb25TZXR0aW5ncyxcbiAgICAgIHBhY2thZ2VKc29uLFxuICAgICAgd2JmeUpzb24sXG4gICAgfTtcbiAgICBpZiAoIWNvbmZpZy5pc0J1bikge1xuICAgICAgY29uZmlnLmVzbGludEJhc2UgPSBnZXRFc2xpbnRFeHRlbnNpb25CYXNlKGNvbmZpZyk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbkdlbWZpbGUgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbkdvTW9kIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbiB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jayB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluUG9tWG1sIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluVGVtcGxhdGVZYW1sXG4gICAgKSB7XG4gICAgICByZXR1cm4gY29uZmlnO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhc1ZlcnNpb25TZXR0aW5nc0ZpbGUoZGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGN1cnJlbnQgPSBwYXRoLnJlc29sdmUoZGlyUGF0aCk7XG4gIHJldHVybiAoXG4gICAgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY3VycmVudCwgJ21pc2UudG9tbCcpKSB8fFxuICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGN1cnJlbnQsICcubWlzZS50b21sJykpIHx8XG4gICAgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY3VycmVudCwgJy50b29sLXZlcnNpb25zJykpXG4gICk7XG59XG5cbmZ1bmN0aW9uIGNvbnRhaW5zQW55KHBhdHRlcm46IHN0cmluZywgZGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBmZy5nbG9iU3luYyhwYXR0ZXJuLCB7IGRvdDogdHJ1ZSwgY3dkOiBkaXJQYXRoLCBpZ25vcmU6IGdsb2JJZ25vcmUgfSkubGVuZ3RoID4gMDtcbn1cblxuZXhwb3J0IHR5cGUgRXNsaW50RXh0ZW5zaW9uQmFzZSA9XG4gIHwgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzLXJlYWN0J1xuICB8ICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cydcbiAgfCAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMtcmVhY3QnXG4gIHwgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzJ1xuICB8ICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1uZXh0JztcblxuZnVuY3Rpb24gZ2V0RXNsaW50RXh0ZW5zaW9uQmFzZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBFc2xpbnRFeHRlbnNpb25CYXNlIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgIHJldHVybiAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctbmV4dCc7XG4gIH0gZWxzZSBpZiAoY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCkge1xuICAgIHJldHVybiBjb25maWcuZG9lc0NvbnRhaW5Kc3hPclRzeCA/ICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cy1yZWFjdCcgOiAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMnO1xuICB9IGVsc2Uge1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Kc3hPclRzeCkge1xuICAgICAgcmV0dXJuICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcy1yZWFjdCc7XG4gICAgfSBlbHNlIGlmIChjb25maWcuZG9lc0NvbnRhaW5KYXZhU2NyaXB0KSB7XG4gICAgICByZXR1cm4gJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzJztcbiAgICB9XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hSZXBvSW5mbyhkaXJQYXRoOiBzdHJpbmcsIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgZ2l0ID0gc2ltcGxlR2l0KGRpclBhdGgpO1xuICBjb25zdCByZW1vdGVzID0gYXdhaXQgZ2l0LmdldFJlbW90ZXModHJ1ZSk7XG4gIGNvbnN0IG9yaWdpbiA9IHJlbW90ZXMuZmluZCgocikgPT4gci5uYW1lID09PSAnb3JpZ2luJyk7XG4gIGNvbnN0IHJlbW90ZVVybCA9IG9yaWdpbj8ucmVmcy5mZXRjaCA/PyBvcmlnaW4/LnJlZnMucHVzaDtcbiAgaWYgKHR5cGVvZiByZW1vdGVVcmwgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QganNvbiA9IGF3YWl0IHJlcXVlc3RSZXBvSW5mbyhyZW1vdGVVcmwpO1xuICAgIGlmIChqc29uKSByZXR1cm4ganNvbjtcbiAgfVxuXG4gIGNvbnN0IHVybCA9IHR5cGVvZiBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5ID09PSAnc3RyaW5nJyA/IHBhY2thZ2VKc29uLnJlcG9zaXRvcnkgOiBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5Py51cmw7XG4gIGlmICh1cmwpIHtcbiAgICBjb25zdCBqc29uID0gYXdhaXQgcmVxdWVzdFJlcG9JbmZvKHVybCk7XG4gICAgaWYgKGpzb24gJiYganNvbi5tZXNzYWdlICE9PSAnTm90IEZvdW5kJykgcmV0dXJuIGpzb247XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVxdWVzdFJlcG9JbmZvKHVybE9yRnVsbE5hbWU6IHN0cmluZyk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgW29yZywgbmFtZV0gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUodXJsT3JGdWxsTmFtZSk7XG4gIGlmICghb3JnIHx8ICFuYW1lKSByZXR1cm47XG5cbiAgY29uc3QgcmV0ID0geyBmdWxsX25hbWU6IGAke29yZ30vJHtuYW1lfWAgfTtcbiAgdHJ5IHtcbiAgICAvLyBNZXRhZGF0YSBwZXJtaXNzaW9uXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBnZXRPY3Rva2l0KCkucmVxdWVzdCgnR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfScsIHtcbiAgICAgIG93bmVyOiBvcmcsXG4gICAgICByZXBvOiBuYW1lLFxuICAgIH0pO1xuICAgIE9iamVjdC5hc3NpZ24ocmV0LCByZXNwb25zZS5kYXRhKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zdCByZWRpcmVjdGVkRnVsbE5hbWUgPSBnZXRSZWRpcmVjdGVkUmVwb0Z1bGxOYW1lKGVycm9yKTtcbiAgICBpZiAocmVkaXJlY3RlZEZ1bGxOYW1lKSB7XG4gICAgICByZXQuZnVsbF9uYW1lID0gcmVkaXJlY3RlZEZ1bGxOYW1lO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBnZXRSZWRpcmVjdGVkUmVwb0Z1bGxOYW1lKGVycm9yOiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFlcnJvciB8fCB0eXBlb2YgZXJyb3IgIT09ICdvYmplY3QnKSByZXR1cm47XG5cbiAgY29uc3QgcmVzcG9uc2UgPVxuICAgICdyZXNwb25zZScgaW4gZXJyb3JcbiAgICAgID8gKGVycm9yIGFzIHsgcmVzcG9uc2U/OiB7IHN0YXR1cz86IG51bWJlcjsgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4gfSB9KS5yZXNwb25zZVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlPy5zdGF0dXMgPz8gKGVycm9yIGFzIHsgc3RhdHVzPzogbnVtYmVyIH0pLnN0YXR1cztcbiAgaWYgKHN0YXR1cyAhPT0gMzAxICYmIHN0YXR1cyAhPT0gMzAyKSByZXR1cm47XG5cbiAgY29uc3QgbG9jYXRpb24gPSByZXNwb25zZT8uaGVhZGVycz8ubG9jYXRpb247XG4gIGlmICh0eXBlb2YgbG9jYXRpb24gIT09ICdzdHJpbmcnKSByZXR1cm47XG5cbiAgY29uc3QgW29yZywgbmFtZV0gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUobG9jYXRpb24pO1xuICBpZiAoIW9yZyB8fCAhbmFtZSkgcmV0dXJuO1xuXG4gIHJldHVybiBgJHtvcmd9LyR7bmFtZX1gO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgaWdub3JlRXJyb3JBc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliJztcbmltcG9ydCB5YXJncyBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpeERvY2tlcmZpbGUgfSBmcm9tICcuL2ZpeGVycy9kb2NrZXJmaWxlLmpzJztcbmltcG9ydCB7IGZpeE5leHRDb25maWdKc29uIH0gZnJvbSAnLi9maXhlcnMvbmV4dENvbmZpZy5qcyc7XG5pbXBvcnQgeyBmaXhQbGF5d3JpZ2h0Q29uZmlnIH0gZnJvbSAnLi9maXhlcnMvcGxheXdyaWdodENvbmZpZy5qcyc7XG5pbXBvcnQgeyBmaXhQcmlzbWFFbnZGaWxlcyB9IGZyb20gJy4vZml4ZXJzL3ByaXNtYS5qcyc7XG5pbXBvcnQgeyBmaXhUZXN0RGlyZWN0b3JpZXNVcGRhdGluZ1BhY2thZ2VKc29uIH0gZnJvbSAnLi9maXhlcnMvdGVzdERpcmVjdG9yeS5qcyc7XG5pbXBvcnQgeyBmaXhUeXBlRGVmaW5pdGlvbnMgfSBmcm9tICcuL2ZpeGVycy90eXBlRGVmaW5pdGlvbi5qcyc7XG5pbXBvcnQgeyBmaXhUeXBvcyB9IGZyb20gJy4vZml4ZXJzL3R5cG9zLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbnMgfSBmcm9tICcuL2dlbmVyYXRvcnMvYWdlbnRzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlQmlvbWVKc29uYyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9iaW9tZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUJ1bmZpZ1RvbWwgfSBmcm9tICcuL2dlbmVyYXRvcnMvYnVuZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlRG9ja2VyaWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2RvY2tlcmlnbm9yZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUVkaXRvcmNvbmZpZyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9lZGl0b3Jjb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVFc2xpbnRyYyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9lc2xpbnRDb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVHZW1pbmlDb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvZ2VtaW5pQ29uZmlnLmpzJztcbmltcG9ydCB7IHJlbW92ZUdlbWluaVNldHRpbmdzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dlbWluaVNldHRpbmdzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2l0YXR0cmlidXRlcyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9naXRhdHRyaWJ1dGVzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2l0aWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dpdGlnbm9yZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUlkZWFTZXR0aW5ncyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9pZGVhLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlTGVmdGhvb2tVcGRhdGluZ1BhY2thZ2VKc29uIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2xlZnRob29rLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlTGludHN0YWdlZHJjIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2xpbnRzdGFnZWRyYy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVBhY2thZ2VKc29uIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3BhY2thZ2VKc29uLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUHJldHRpZXJpZ25vcmUgfSBmcm9tICcuL2dlbmVyYXRvcnMvcHJldHRpZXJpZ25vcmUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9weXJpZ2h0Q29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUmVhZG1lIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3JlYWRtZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJlbGVhc2VyYyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9yZWxlYXNlcmMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVSZW5vdmF0ZUpzb24gfSBmcm9tICcuL2dlbmVyYXRvcnMvcmVub3ZhdGVKc29uLmpzJztcbmltcG9ydCB7IGluc3RhbGxBZ2VudFNraWxscyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9za2lsbHMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVUc2NvbmZpZyB9IGZyb20gJy4vZ2VuZXJhdG9ycy90c2NvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVZzY29kZVNldHRpbmdzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3ZzY29kZVNldHRpbmdzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlV29ya2Zsb3dzLCBpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyB9IGZyb20gJy4vZ2VuZXJhdG9ycy93b3JrZmxvdy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVlhcm5yY1ltbCB9IGZyb20gJy4vZ2VuZXJhdG9ycy95YXJucmMuanMnO1xuaW1wb3J0IHsgc2V0dXBMYWJlbHMgfSBmcm9tICcuL2dpdGh1Yi9sYWJlbC5qcyc7XG5pbXBvcnQgeyBzZXR1cFNlY3JldHMgfSBmcm9tICcuL2dpdGh1Yi9zZWNyZXQuanMnO1xuaW1wb3J0IHsgc2V0dXBHaXRIdWJTZXR0aW5ncyB9IGZyb20gJy4vZ2l0aHViL3NldHRpbmdzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2l0SHViVGVtcGxhdGVzIH0gZnJvbSAnLi9naXRodWIvdGVtcGxhdGUuanMnO1xuaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgeyBnZXRQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMsIHNwYXduU3luY0FuZFJldHVyblN0YXR1cyB9IGZyb20gJy4vdXRpbHMvc3Bhd25VdGlsLmpzJztcbmltcG9ydCB7IHNob3VsZFNraXBXaWxsYm9vc3RlckNvbmZpZ3NFc2xpbnRQYWNrYWdlIH0gZnJvbSAnLi91dGlscy93aWxsYm9vc3RlckNvbmZpZ3NVdGlsLmpzJztcblxuYXN5bmMgZnVuY3Rpb24gbWFpbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgYXJndiA9IGF3YWl0IHlhcmdzKHByb2Nlc3MuYXJndi5zbGljZSgyKSlcbiAgICAuY29tbWFuZCgnJDAgW3BhdGhzLi5dJywgJ01ha2UgYSBnaXZlbiBwcm9qZWN0IGZvbGxvdyB0aGUgV2lsbEJvb3N0ZXIgc3RhbmRhcmQnLCAoeWFyZ3MpID0+IHtcbiAgICAgIHlhcmdzLnBvc2l0aW9uYWwoJ3BhdGhzJywge1xuICAgICAgICBkZXNjcmliZTogJ3Byb2plY3QgcGF0aHMgdG8gYmUgd2JmaWVkJyxcbiAgICAgICAgYXJyYXk6IHRydWUsXG4gICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICBkZWZhdWx0OiBbJy4nXSxcbiAgICAgIH0pO1xuICAgIH0pXG4gICAgLm9wdGlvbnMoe1xuICAgICAgZW52OiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiAnVXBsb2FkIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcyBzZWNyZXRzIHRvIEdpdEh1YicsXG4gICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgIGFsaWFzOiAnZScsXG4gICAgICB9LFxuICAgICAgc2tpcERlcHM6IHtcbiAgICAgICAgZGVzY3JpcHRpb246ICdTa2lwIGRlcGVuZGVuY3kgaW5zdGFsbGF0aW9uJyxcbiAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgYWxpYXM6ICdkJyxcbiAgICAgIH0sXG4gICAgICB2ZXJib3NlOiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciBvciBub3QgdG8gZW5hYmxlIHZlcmJvc2UgbW9kZScsXG4gICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgIGFsaWFzOiAndicsXG4gICAgICB9LFxuICAgIH0pXG4gICAgLnZlcnNpb24oZ2V0VmVyc2lvbigpKVxuICAgIC5zdHJpY3QoKS5hcmd2O1xuICBvcHRpb25zLmlzVmVyYm9zZSA9IGFyZ3YudmVyYm9zZTtcbiAgb3B0aW9ucy5kb2VzVXBsb2FkRW52VmFycyA9IGFyZ3YuZW52O1xuXG4gIGZvciAoY29uc3Qgcm9vdERpclBhdGggb2YgYXJndi5wYXRocyBhcyBzdHJpbmdbXSkge1xuICAgIGNvbnN0IHBhY2thZ2VzRGlyUGF0aCA9IHBhdGguam9pbihyb290RGlyUGF0aCwgJ3BhY2thZ2VzJyk7XG4gICAgY29uc3QgZGlyZW50cyA9IChhd2FpdCBpZ25vcmVFcnJvckFzeW5jKCgpID0+IGZzLnByb21pc2VzLnJlYWRkaXIocGFja2FnZXNEaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpKSA/PyBbXTtcbiAgICBjb25zdCBzdWJEaXJQYXRocyA9IGRpcmVudHMuZmlsdGVyKChkKSA9PiBkLmlzRGlyZWN0b3J5KCkpLm1hcCgoZCkgPT4gcGF0aC5qb2luKHBhY2thZ2VzRGlyUGF0aCwgZC5uYW1lKSk7XG5cbiAgICBhd2FpdCBmaXhUZXN0RGlyZWN0b3JpZXNVcGRhdGluZ1BhY2thZ2VKc29uKFtyb290RGlyUGF0aCwgLi4uc3ViRGlyUGF0aHNdKTtcblxuICAgIGNvbnN0IHJvb3RDb25maWcgPSBhd2FpdCBnZXRQYWNrYWdlQ29uZmlnKHJvb3REaXJQYXRoKTtcbiAgICBjb25zb2xlLmxvZygncm9vdENvbmZpZzonLCByb290Q29uZmlnKTtcbiAgICBpZiAoIXJvb3RDb25maWcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYHRoZXJlIGlzIG5vIHZhbGlkIHBhY2thZ2UuanNvbiBpbiAke3Jvb3REaXJQYXRofWApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGFiYnJldmlhdGlvblByb21pc2UgPSBmaXhUeXBvcyhyb290Q29uZmlnKTtcblxuICAgIGNvbnN0IG51bGxhYmxlU3ViUGFja2FnZUNvbmZpZ3MgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHN1YkRpclBhdGhzLm1hcCgoc3ViRGlyUGF0aCkgPT4gZ2V0UGFja2FnZUNvbmZpZyhzdWJEaXJQYXRoLCByb290Q29uZmlnKSlcbiAgICApO1xuICAgIGNvbnN0IHN1YlBhY2thZ2VDb25maWdzID0gbnVsbGFibGVTdWJQYWNrYWdlQ29uZmlncy5maWx0ZXIoKGNvbmZpZykgPT4gISFjb25maWcpO1xuICAgIGNvbnN0IGFsbFBhY2thZ2VDb25maWdzID0gW3Jvb3RDb25maWcsIC4uLnN1YlBhY2thZ2VDb25maWdzXTtcblxuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgZm9yIChjb25zdCBjb25maWcgb2YgYWxsUGFja2FnZUNvbmZpZ3MpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGNvbmZpZyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSW5zdGFsbCB5YXJuIGJlcnJ5XG4gICAgYXdhaXQgZ2VuZXJhdGVZYXJucmNZbWwocm9vdENvbmZpZyk7XG4gICAgaWYgKHJvb3RDb25maWcuaXNCdW4pIHtcbiAgICAgIGF3YWl0IGdlbmVyYXRlQnVuZmlnVG9tbChyb290Q29uZmlnKTtcbiAgICB9XG5cbiAgICBjb25zdCBzaG91bGRSdW5Xb3JrZmxvd3MgPVxuICAgICAgIWlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHJvb3RDb25maWcucmVwb3NpdG9yeSkgJiZcbiAgICAgIChyb290Q29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3Rlci8nKSB8fFxuICAgICAgICByb290Q29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKSk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgZml4RG9ja2VyZmlsZShyb290Q29uZmlnKSxcbiAgICAgIGZpeFByaXNtYUVudkZpbGVzKHJvb3RDb25maWcpLFxuICAgICAgYWJicmV2aWF0aW9uUHJvbWlzZS50aGVuKCgpID0+IGdlbmVyYXRlUmVhZG1lKHJvb3RDb25maWcpKSxcbiAgICAgIGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbnMocm9vdENvbmZpZywgYWxsUGFja2FnZUNvbmZpZ3MpLFxuICAgICAgZ2VuZXJhdGVEb2NrZXJpZ25vcmUocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUVkaXRvcmNvbmZpZyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlR2VtaW5pQ29uZmlnKHJvb3RDb25maWcsIGFsbFBhY2thZ2VDb25maWdzKSxcbiAgICAgIHJlbW92ZUdlbWluaVNldHRpbmdzKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUlkZWFTZXR0aW5ncyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlUmVub3ZhdGVKc29uKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVSZWxlYXNlcmMocm9vdENvbmZpZyksXG4gICAgICAuLi4oc2hvdWxkUnVuV29ya2Zsb3dzID8gW2dlbmVyYXRlV29ya2Zsb3dzKHJvb3RDb25maWcpXSA6IFtdKSxcbiAgICAgIHNldHVwTGFiZWxzKHJvb3RDb25maWcpLFxuICAgICAgc2V0dXBTZWNyZXRzKHJvb3RDb25maWcpLFxuICAgICAgc2V0dXBHaXRIdWJTZXR0aW5ncyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlTGVmdGhvb2tVcGRhdGluZ1BhY2thZ2VKc29uKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVMaW50c3RhZ2VkcmMocm9vdENvbmZpZyksXG4gICAgXSk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuXG4gICAgY29uc3QgcHJvbWlzZXM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuICAgIGZvciAoY29uc3QgY29uZmlnIG9mIGFsbFBhY2thZ2VDb25maWdzKSB7XG4gICAgICBpZiAoc2hvdWxkU2tpcFdpbGxib29zdGVyQ29uZmlnc0VzbGludFBhY2thZ2UoY29uZmlnKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZml4VHlwZURlZmluaXRpb25zKGNvbmZpZywgY29uZmlnLmlzUm9vdCA/IGFsbFBhY2thZ2VDb25maWdzIDogW2NvbmZpZ10pKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRUZXN0KSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZml4UGxheXdyaWdodENvbmZpZyhjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZGVwZW5kaW5nLm5leHQpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChmaXhOZXh0Q29uZmlnSnNvbihjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IGdlbmVyYXRlR2l0aWdub3JlKGNvbmZpZywgcm9vdENvbmZpZyk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG4gICAgICBpZiAoIWNvbmZpZy5pc1Jvb3QgJiYgIWNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgYXdhaXQgZ2VuZXJhdGVQcmV0dGllcmlnbm9yZShjb25maWcpO1xuICAgICAgYXdhaXQgZ2VuZXJhdGVQYWNrYWdlSnNvbihjb25maWcsIHJvb3RDb25maWcsIGFyZ3Yuc2tpcERlcHMpO1xuXG4gICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlTGludHN0YWdlZHJjKGNvbmZpZykpO1xuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblZzY29kZVNldHRpbmdzSnNvbiAmJiBjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbikge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlVnNjb2RlU2V0dGluZ3MoY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlVHNjb25maWcoY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIGNvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHQgfHxcbiAgICAgICAgY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdEluUGFja2FnZXMgfHxcbiAgICAgICAgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fFxuICAgICAgICBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlc1xuICAgICAgKSB7XG4gICAgICAgIGlmIChyb290Q29uZmlnLmlzQnVuKSB7XG4gICAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZUJpb21lSnNvbmMoY29uZmlnKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFyb290Q29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzKSB7XG4gICAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZUVzbGludHJjKGNvbmZpZykpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5weXJpZ2h0KSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbihjb25maWcpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcblxuICAgIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gcm9vdENvbmZpZy5pc0J1biA/ICdidW4nIDogJ3lhcm4nO1xuICAgIC8vIFJlZnJlc2ggbG9jayBmaWxlc1xuICAgIGlmIChyb290Q29uZmlnLmlzQnVuKSB7XG4gICAgICByZWZyZXNoQnVuTG9jayhyb290RGlyUGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZzLnJtU3luYyhwYXRoLmpvaW4ocm9vdERpclBhdGgsICd5YXJuLmxvY2snKSwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydpbnN0YWxsJywgJy0tbm8taW1tdXRhYmxlJ10sIHJvb3REaXJQYXRoKTtcbiAgICB9XG4gICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ2NsZWFudXAnXSwgcm9vdERpclBhdGgpO1xuICAgIC8vICd5YXJuIGluc3RhbGwnIHNob3VsZCBiZSBhZnRlciBgeWFybiBjbGVhbnVwYCBiZWNhdXNlIHlhcm4gYmVycnkgZ2VuZXJhdGVzIHlhcm4ubG9ja1xuICAgIC8vIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGNvbnRlbnRzIG9mIGRlcGVuZGFudCBzdWItcGFja2FnZSBpbiBtb25vcmVwb1xuICAgIGlmICghcm9vdENvbmZpZy5pc0J1bikge1xuICAgICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ2luc3RhbGwnLCAnLS1uby1pbW11dGFibGUnXSwgcm9vdERpclBhdGgpO1xuICAgIH1cblxuICAgIGF3YWl0IGluc3RhbGxBZ2VudFNraWxscyhyb290Q29uZmlnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZWZyZXNoQnVuTG9jayhyb290RGlyUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGxvY2tGaWxlUGF0aCA9IHBhdGguam9pbihyb290RGlyUGF0aCwgJ2J1bi5sb2NrJyk7XG4gIGNvbnN0IGJhY2t1cExvY2tGaWxlUGF0aCA9IHBhdGguam9pbihyb290RGlyUGF0aCwgJy5idW4ubG9jay53YmZ5LWJhY2t1cCcpO1xuICBmcy5ybVN5bmMoYmFja3VwTG9ja0ZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pO1xuICBpZiAoZnMuZXhpc3RzU3luYyhsb2NrRmlsZVBhdGgpKSB7XG4gICAgLy8gUmVnZW5lcmF0ZSBmcm9tIHNjcmF0Y2gsIGJ1dCBrZWVwIHRoZSBwcmV2aW91cyBsb2NrZmlsZSBzbyBhIHJlZ2lzdHJ5IG9yXG4gICAgLy8gcmVzb2x2ZXIgZmFpbHVyZSBjYW5ub3QgbGVhdmUgdGhlIHJlcG9zaXRvcnkgd2l0aG91dCBhIGxvY2tmaWxlLlxuICAgIGZzLmNvcHlGaWxlU3luYyhsb2NrRmlsZVBhdGgsIGJhY2t1cExvY2tGaWxlUGF0aCk7XG4gICAgZnMucm1TeW5jKGxvY2tGaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIGNvbnN0IHN0YXR1cyA9IHNwYXduU3luY0FuZFJldHVyblN0YXR1cygnYnVuJywgWyd1cGRhdGUnXSwgcm9vdERpclBhdGgpO1xuICBpZiAoc3RhdHVzID09PSAwICYmIGZzLmV4aXN0c1N5bmMobG9ja0ZpbGVQYXRoKSkge1xuICAgIGZzLnJtU3luYyhiYWNrdXBMb2NrRmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGZzLmV4aXN0c1N5bmMoYmFja3VwTG9ja0ZpbGVQYXRoKSkge1xuICAgIGZzLmNvcHlGaWxlU3luYyhiYWNrdXBMb2NrRmlsZVBhdGgsIGxvY2tGaWxlUGF0aCk7XG4gICAgZnMucm1TeW5jKGJhY2t1cExvY2tGaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byByZWdlbmVyYXRlICR7bG9ja0ZpbGVQYXRofWApO1xufVxuXG5mdW5jdGlvbiBnZXRWZXJzaW9uKCk6IHN0cmluZyB7XG4gIGxldCBwYWNrYWdlSnNvbkRpciA9IHBhdGguZGlybmFtZShuZXcgVVJMKGltcG9ydC5tZXRhLnVybCkucGF0aG5hbWUpO1xuICB3aGlsZSAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHBhY2thZ2VKc29uRGlyLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgcGFja2FnZUpzb25EaXIgPSBwYXRoLmRpcm5hbWUocGFja2FnZUpzb25EaXIpO1xuICB9XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHBhY2thZ2VKc29uRGlyLCAncGFja2FnZS5qc29uJyksICd1dGY4JykpIGFzIHtcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG4gIH07XG4gIHJldHVybiBwYWNrYWdlSnNvbi52ZXJzaW9uO1xufVxuXG5hd2FpdCBtYWluKCk7XG4iXSwibmFtZXMiOlsib3B0aW9ucyIsImlzVmVyYm9zZSIsImRvZXNVcGxvYWRFbnZWYXJzIiwibG9nZ2VyIiwiZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbiIsIm5hbWUiLCJmdW5jIiwiY29uc29sZSIsImluZm8iLCJlcnJvciIsIkVycm9yIiwic3RhY2siLCJTdHJpbmciLCJhc3luYyIsImZpeERvY2tlcmZpbGUiLCJjb25maWciLCJkb2VzQ29udGFpbkRvY2tlcmZpbGUiLCJvbGRDb250ZW50IiwiZG9ja2VyZmlsZSIsIm5ld0NvbnRlbnQiLCJmcyIsIndyaXRlRmlsZSIsInBhdGgiLCJqb2luIiwiZGlyUGF0aCIsImZzVXRpbCIsInJlYWRGaWxlSWdub3JpbmdFcnJvciIsImZpbGVQYXRoIiwicHJvbWlzZXMiLCJyZWFkRmlsZSIsImdlbmVyYXRlRmlsZSIsImNvbnRlbnQiLCJta2RpciIsImRpcm5hbWUiLCJyZWN1cnNpdmUiLCJub3JtYWxpemVkQ29udGVudCIsInJlcGxhY2VBbGwiLCJ0cmltIiwicHJvbWlzZVBvb2wiLCJQcm9taXNlUG9vbCIsImZpeE5leHRDb25maWdKc29uIiwibWFwIiwiZXh0IiwicmVzb2x2ZSIsImZpbmQiLCJwIiwiZXhpc3RzU3luYyIsInJlcGxhY2UiLCJfIiwic2V0dGluZ3NUZXh0IiwiaW5jbHVkZXMiLCJydW4iLCJsaXRlcmFsIiwidmFsdWUiLCJraW5kIiwiYXNPYmplY3QiLCJkZWZhdWx0Q29uZmlnIiwiZm9yYmlkT25seSIsInJldHJpZXMiLCJ1c2UiLCJiYXNlVVJMIiwidHJhY2UiLCJzY3JlZW5zaG90IiwidmlkZW8iLCJ3ZWJTZXJ2ZXIiLCJjb21tYW5kIiwidXJsIiwicmV1c2VFeGlzdGluZ1NlcnZlciIsInRpbWVvdXQiLCJzdGRvdXQiLCJzdGRlcnIiLCJlbnYiLCJncmFjZWZ1bFNodXRkb3duIiwiZml4UGxheXdyaWdodENvbmZpZyIsImVudkZpbGVQYXRocyIsImVudkZpbGVQYXRoIiwidGVzdCIsImFzc2VydE5leHRQdWJsaWNCYXNlVXJsIiwiZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbCIsInNvdXJjZSIsInRzIiwiY3JlYXRlU291cmNlRmlsZSIsIlNjcmlwdFRhcmdldCIsIkxhdGVzdCIsIlNjcmlwdEtpbmQiLCJUUyIsImZvdW5kIiwidmlzaXQiLCJub2RlIiwiaXNDYWxsRXhwcmVzc2lvbiIsImV4cHJlc3Npb24iLCJnZXRUZXh0IiwiZmlyc3RBcmd1bWVudCIsImFyZ3VtZW50cyIsImlzT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24iLCJmb3JFYWNoQ2hpbGQiLCJ1bmRlZmluZWQiLCJleHRyYWN0RGVmaW5lQ29uZmlnT2JqZWN0TGl0ZXJhbCIsInBhcnNlZCIsInBhcnNlT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24iLCJtZXJnZWQiLCJtZXJnZSIsImFsbCIsImhhc1N0YXJ0VGVzdFNlcnZlciIsIkJvb2xlYW4iLCJwYWNrYWdlSnNvbiIsInNjcmlwdHMiLCJoYXNFeGlzdGluZ1dlYlNlcnZlciIsIm9iamVjdCIsImlzQnVuIiwic2V0V2ViU2VydmVyQ29tbWFuZCIsIm5ld09iamVjdExpdGVyYWwiLCJzdHJpbmdpZnlPYmplY3QiLCJzdGFydCIsImdldFN0YXJ0IiwiZW5kIiwiZ2V0RW5kIiwic2xpY2UiLCJvYmplY3RMaXRlcmFsIiwicHJvcGVydHkiLCJwcm9wZXJ0aWVzIiwiaXNQcm9wZXJ0eUFzc2lnbm1lbnQiLCJpc0lkZW50aWZpZXIiLCJpc1N0cmluZ0xpdGVyYWwiLCJwYXJzZUV4cHJlc3Npb24iLCJpbml0aWFsaXplciIsInBhcnNlZE9iamVjdCIsImlzQXJyYXlMaXRlcmFsRXhwcmVzc2lvbiIsImVsZW1lbnRzIiwiZWxlbWVudCIsInNvbWUiLCJzdHJpbmdpZnlWYWx1ZSIsImxldmVsIiwidmFsdWVzIiwibGVuZ3RoIiwiaW5kZW50IiwicmVwZWF0IiwibGluZXMiLCJzdHJpbmdpZmllZCIsInNwbGl0IiwiYXQiLCJpbmRleCIsImNsb3NpbmdJbmRlbnQiLCJzdHJpbmdpZnlBcnJheSIsIk9iamVjdCIsImVudHJpZXMiLCJrZXkiLCJnbG9iSWdub3JlIiwiZml4UHJpc21hRW52RmlsZXMiLCJlbnZGaWxlcyIsImZnIiwiZ2xvYiIsImRvdCIsImN3ZCIsImlnbm9yZSIsImVudkZpbGUiLCJmaXhUZXN0RGlyZWN0b3JpZXNVcGRhdGluZ1BhY2thZ2VKc29uIiwicGFja2FnZURpclBhdGhzIiwiUHJvbWlzZSIsIm5ld1Rlc3REaXJQYXRoIiwicGFja2FnZURpclBhdGgiLCJvbGRUZXN0RGlyTmFtZSIsIm9sZFRlc3REaXJQYXRoIiwicmVuYW1lIiwiZml4VHlwZURlZmluaXRpb25zIiwiY29uZmlnc0luY2x1ZGluZ0NoaWxkcmVuIiwibGliVHlwZURpclBhdGgiLCJzcmNUeXBlRGlyUGF0aCIsImlzUm9vdCIsImRvZXNDb250YWluU3ViUGFja2FnZUpzb25zIiwiZGlyZW50cyIsImlnbm9yZUVub2VudEFzeW5jIiwicmVhZGRpciIsIndpdGhGaWxlVHlwZXMiLCJkaXJlbnQiLCJkaXJOYW1lIiwiaGFzVHlwZURlY2xhcmF0aW9uRXh0ZW5zaW9uIiwiZW5kc1dpdGgiLCJwYWNrYWdlTmFtZSIsImhhc0xpYnJhcnkiLCJkZXBlbmRlbmNpZXMiLCJkZXZEZXBlbmRlbmNpZXMiLCJpc0ZpbGUiLCJpc0RpcmVjdG9yeSIsIm92ZXJ3cml0ZU1lcmdlIiwiZGVzdGluYXRpb25BcnJheSIsInNvdXJjZUFycmF5IiwiY29tYmluZU1lcmdlIiwidGFyZ2V0IiwiZGVzdGluYXRpb24iLCJpdGVtIiwiY2xvbmVVbmxlc3NPdGhlcndpc2VTcGVjaWZpZWQiLCJpc01lcmdlYWJsZU9iamVjdCIsInB1c2giLCJzb3J0S2V5cyIsIm9iaiIsImtleUFuZFZhbHVlcyIsInRvU29ydGVkIiwia2V5MSIsImtleTIiLCJsb2NhbGVDb21wYXJlIiwicHVibGljUmVwb0F1dG9maXhXb3JrZmxvdyIsIm9uIiwicHVsbF9yZXF1ZXN0IiwiYnJhbmNoZXMiLCJwZXJtaXNzaW9ucyIsImNvbnRlbnRzIiwiY29uY3VycmVuY3kiLCJncm91cCIsImpvYnMiLCJhdXRvZml4IiwicHJpdmF0ZVJlcG9BdXRvZml4V29ya2Zsb3ciLCJ1c2VzIiwid29ya2Zsb3dzIiwicmVsZWFzZSIsInB1bGxfcmVxdWVzdF90YXJnZXQiLCJ0eXBlcyIsInN5bmMiLCJpc3N1ZXMiLCJpZiIsIndpdGgiLCJzZWNyZXRzIiwiQ0xBVURFX0NPREVfT0FVVEhfVE9LRU4iLCJPUEVOQUlfQVBJX0tFWSIsIkdFTUlOSV9BUElfS0VZIiwiZ2VuZXJhdGVXb3JrZmxvd3MiLCJyb290Q29uZmlnIiwiaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8iLCJyZXBvc2l0b3J5Iiwid29ya2Zsb3dzUGF0aCIsInNlbWFudGljWW1sUGF0aCIsInJtIiwiZm9yY2UiLCJmaWxlTmFtZVNldCIsIlNldCIsImZpbHRlciIsImRlcGVuZGluZyIsInNlbWFudGljUmVsZWFzZSIsImFkZCIsImZpbGVOYW1lIiwiYmFzZW5hbWUiLCJ3cml0ZVdvcmtmbG93WWFtbCIsImRlcGxveVByb2R1Y3Rpb25Xb3JrZmxvd0V4aXN0cyIsIndyaXRlWWFtbCIsImlzUHVibGljUmVwbyIsImNsb25lRGVlcCIsInBhY2thZ2VNYW5hZ2VyIiwic3RlcHMiLCJidWlsZCIsImF1dG9maXhXb3JrZmxvdyIsImF1dG9maXhKb2IiLCJnZW5lcmF0ZUF1dG9maXhXb3JrZmxvdyIsIm5ld1NldHRpbmdzIiwib2xkU2V0dGluZ3MiLCJ5YW1sIiwibG9hZCIsImFycmF5TWVyZ2UiLCJzdGFydHNXaXRoIiwibW92ZVRvQm90dG9tIiwiYWN0aW9ucyIsInRyaWdnZXJfZGVwbG95X3dvcmtmbG93IiwiaXNSZXVzYWJsZVdvcmtmbG93Iiwiam9iIiwibm9ybWFsaXplSm9iIiwic2NoZWR1bGUiLCJicmFuY2giLCJwYXJhbXMiLCJzeW5jX3BhcmFtc193aXRob3V0X2Rlc3QiLCJ3b3JrZmxvd19kaXNwYXRjaCIsIk5QTV9UT0tFTiIsIkdIX1RPS0VOIiwiRklSRUJBU0VfVE9LRU4iLCJHQ1BfU0FfS0VZX0pTT05fRk9SX0ZJUkVCQVNFIiwiRElTQ09SRF9XRUJIT09LX1VSTCIsInNlcnZlcl91cmwiLCJkb3RfZW52X3BhdGgiLCJGTFlfQVBJX1RPS0VOIiwiZGVwbG95X2NvbW1hbmQiLCJjaV9sYWJlbCIsImdpdGh1Yl9ob3N0ZWRfcnVubmVyIiwia2V5cyIsIm5ld1NlY3JldHMiLCJ5YW1sVGV4dCIsImR1bXAiLCJsaW5lV2lkdGgiLCJub0NvbXBhdE1vZGUiLCJzdHlsZXMiLCJmaXhUeXBvcyIsInBhY2thZ2VDb25maWciLCJkb2NGaWxlcyIsIm1kRmlsZSIsImZpeFR5cG9zSW5UZXh0IiwicmVwbGFjZVdpdGhDb25maWciLCJ0c0ZpbGVzIiwidHNGaWxlIiwiZml4VHlwb3NJbkNvZGUiLCJ0ZXh0QmFzZWRGaWxlcyIsImZpbGUiLCJwcm9taXNlQWxsIiwicHJvcE5hbWUiLCJiZWZvcmUiLCJhZnRlciIsIndiZnlKc29uIiwidHlwb3MiLCJnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zIiwiYWxsQ29uZmlncyIsImFnZW50c0V4dHJhUGF0aCIsImV4dHJhQ29udGVudCIsInRvb2xOYW1lIiwiZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9uIiwiY3Vyc29yUnVsZXNQYXRoIiwiY3Vyc29yUnVsZXNDb250ZW50IiwiZnJvbnRtYXR0ZXIiLCJib2R5IiwiZ2VuZXJhdGVDdXJzb3JHZW5lcmFsTWRjQ29udGVudCIsImJhc2VDb250ZW50IiwiZGVzY3JpcHRpb24iLCJpc1dpbGxCb29zdGVyUmVwbyIsImMiLCJnZW5lcmF0ZUFnZW50Q29kaW5nU3R5bGUiLCJoYXNOZXdTZWN0aW9uIiwiZ2VuSTE4blRzIiwicmVhY3QiLCJuZXh0IiwiZ2VuZXJhdGVCaW9tZUpzb25jIiwicm9vdCIsIiRzY2hlbWEiLCJleHRlbmRzIiwiSlNPTiIsInBhcnNlIiwic3RyaW5naWZ5IiwibWluaW11bVJlbGVhc2VBZ2VFeGNsdWRlcyIsImV4aXN0aW5nQ29udGVudCIsImJ1bmZpZ1RvbWwiLCJwYXJzZUJ1bmZpZ1RvbWwiLCJidW4iLCJnZW5lcmF0ZVJ1blNlY3Rpb24iLCJpbnN0YWxsIiwiZXhhY3QiLCJnZW5lcmF0ZUJ1bmZpZ1RvbWwiLCJyZWFkRmlsZVN5bmMiLCJ1c2VyQ29udGVudEhlYWRlciIsInVzZXJDb250ZW50SGVhZGVyUmVnZXgiLCJzZXBhcmF0b3IiLCJkZWZhdWx0SGVhZFVzZXJDb250ZW50IiwiZGVmYXVsdFRhaWxVc2VyQ29udGVudCIsImlnbm9yZUZpbGVVdGlsIiwic2VwYXJhdG9yUHJlZml4IiwicmVhZEdpdGlnbm9yZVdpdGhvdXRTZXBhcmF0b3JzIiwibGFzdEhlYWRlckluZGV4IiwiZ2V0SW5kZXhPZlRhaWxVc2VyQ29udGVudEhlYWRlciIsImdldEhlYWRVc2VyQ29udGVudCIsImluZGV4T2YiLCJ0aGlzIiwiZ2V0VGFpbFVzZXJDb250ZW50IiwiaXNCZXJyeVplcm9JbnN0YWxsRW5hYmxlZCIsImxhc3RJbmRleCIsImxhc3RJbmRleE9mIiwiZ2VuZXJhdGVEb2NrZXJpZ25vcmUiLCJleHRlbnNpb25zIiwiY29kZVdpdGgySW5kZW50U2l6ZSIsImNvZGVXaXRoNEluZGVudFNpemUiLCJtYXJrZG93bkxpa2UiLCJlc2xpbnQiLCJwcmV0dGllciIsImJpb21lIiwiZ2VuZXJhdGVFeHRlbnNpb25zIiwiZ2VuZXJhdGVFZGl0b3Jjb25maWciLCJnZW5lcmF0ZUVzbGludHJjIiwiZXNsaW50QmFzZSIsImhhdmVfZnVuIiwiY29kZV9yZXZpZXciLCJkaXNhYmxlIiwiY29tbWVudF9zZXZlcml0eV90aHJlc2hvbGQiLCJtYXhfcmV2aWV3X2NvbW1lbnRzIiwicHVsbF9yZXF1ZXN0X29wZW5lZCIsImhlbHAiLCJzdW1tYXJ5IiwiaWdub3JlX3BhdHRlcm5zIiwiZ2VuZXJhdGVHZW1pbmlDb25maWciLCJjb25maWdGaWxlUGF0aCIsInN0eWxlZ3VpZGVGaWxlUGF0aCIsIm5ld0NvbmZpZyIsIm9sZENvbmZpZyIsInlhbWxDb250ZW50IiwiY29kaW5nUnVsZUV4dHJhQ29udGVudCIsInRyaW1TdGFydCIsInN0eWxlZ3VpZGVDb250ZW50IiwidHJpbUVuZCIsInJlbW92ZUdlbWluaVNldHRpbmdzIiwiZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzIiwiZGVmYXVsdE5hbWVzIiwiZ2VuZXJhdGVHaXRpZ25vcmUiLCJoZWFkVXNlckNvbnRlbnQiLCJ0YWlsVXNlckNvbnRlbnQiLCJuYW1lcyIsImRvZXNDb250YWluR2VtZmlsZSIsImRvZXNDb250YWluR29Nb2QiLCJkb2VzQ29udGFpblBhY2thZ2VKc29uIiwiZG9lc0NvbnRhaW5Qb21YbWwiLCJkb2VzQ29udGFpblB1YnNwZWNZYW1sIiwiZG9lc0NvbnRhaW5UZW1wbGF0ZVlhbWwiLCJkb2VzQ29udGFpblBvZXRyeUxvY2siLCJibGl0eiIsImZpcmViYXNlIiwicHJpc21hIiwicGxheXdyaWdodFRlc3QiLCJyZWFjdE5hdGl2ZSIsInN0b3J5Ym9vayIsImxpdGVzdHJlYW0iLCJnZW5lcmF0ZWQiLCJyZWFkQ2FjaGUiLCJyZXNwb25zZSIsImZldGNoIiwicmVzcG9uc2VUZXh0IiwidGV4dCIsIm9rIiwid3JpdGVDYWNoZSIsIm9zIiwiaG9tZWRpciIsInN0YXQiLCJEYXRlIiwibm93IiwibXRpbWVNcyIsImNyZWF0ZVRhc2tPcHRpb25zIiwicnVubmVyIiwiYXJncyIsImV4dGVuc2lvbiIsInByZXR0aWVyQ29udGVudCIsImJpb21lQ29udGVudCIsImdlbmVyYXRlSWRlYVNldHRpbmdzIiwiZG9lc0NvbnRhaW5KYXZhU2NyaXB0IiwiZG9lc0NvbnRhaW5KYXZhU2NyaXB0SW5QYWNrYWdlcyIsImRvZXNDb250YWluVHlwZVNjcmlwdCIsImRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXMiLCJzcGF3blN5bmMiLCJyZXRyeSIsInNwYXduU3luY0FuZFJldHVyblN0YXR1cyIsInN0YXR1cyIsIm5ld0NtZCIsIm5ld0FyZ3MiLCJnZXRTcGF3blN5bmNBcmdzIiwiY2hpbGRfcHJvY2VzcyIsInNwYXduU3luY0FuZFJldHVyblN0ZG91dCIsInN0ZGlvIiwicHJvYyIsInRvU3RyaW5nIiwicyIsIm1lc3NhZ2UiLCJwcm9jZXNzIiwiUEFUSCIsIkJFUlJZX0JJTl9GT0xERVIiLCJlbmNvZGluZyIsInNoZWxsIiwiRXNsaW50VXRpbCIsImdldExpbnRGaXhTdWZmaXgiLCJkb2VzQ29udGFpbkpzeE9yVHN4IiwiZ2l0SHViVXRpbCIsImdldE9yZ0FuZE5hbWUiLCJ1cmxPckZ1bGxOYW1lIiwidXJsV2l0aG91dFByb3RvY29sIiwib2N0b2tpdENhY2hlIiwiTWFwIiwiZ2V0T2N0b2tpdCIsIm93bmVyIiwiY2FjaGVkIiwiZ2V0Iiwib2N0b2tpdCIsIk9jdG9raXQiLCJhdXRoIiwiZ2V0R2l0SHViVG9rZW4iLCJzZXQiLCJoYXNHaXRIdWJUb2tlbiIsIkdIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSIiwiR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVJMQUIiLCJHSVRIVUJfVE9LRU4iLCJwaW5uZWREZXBlbmRlbmN5U3BlY2lmaWVycyIsInR5cGVzY3JpcHQiLCJzaG91bGRTa2lwV2lsbGJvb3N0ZXJDb25maWdzRXNsaW50UGFja2FnZSIsImlzV2lsbEJvb3N0ZXJDb25maWdzIiwianNDb21tb25EZXBzIiwidHNDb21tb25EZXBzIiwicmVhY3RDb21tb25EZXBzIiwiZXNsaW50RGVwcyIsImdlbmVyYXRlUGFja2FnZUpzb24iLCJza2lwQWRkaW5nRGVwcyIsImpzb25UZXh0IiwianNvbk9iaiIsInBlZXJEZXBlbmRlbmNpZXMiLCJhdXRob3IiLCJ0c2xpYiIsImxlcm5hIiwicGluc3QiLCJyZW1vdmVEZXByZWNhdGVkU3R1ZmYiLCJnZW5lcmF0ZVNjcmlwdHMiLCJ3YiIsImFkZFN0YXJ0VGVzdFNlcnZlclNjcmlwdElmTmVlZGVkIiwicHJldHRpZnkiLCJvcmlnaW5hbENvbnRlbnQiLCJsaW5lIiwibmV3TGluZSIsImwiLCJnZW5lcmF0ZVByZXR0aWVyU3VmZml4IiwicG9ldHJ5RGV2RGVwZW5kZW5jaWVzIiwiaHVza3kiLCJwb3N0aW5zdGFsbCIsInBvc3RwdWJsaXNoIiwicHJlcHVibGlzaE9ubHkiLCJwcmVwYWNrIiwicG9zdHBhY2siLCJwcmVwYXJlIiwidmVyc2lvbiIsImFydGlsbGVyeSIsInBsYXl3cmlnaHQiLCJ3b3Jrc3BhY2VzIiwiQXJyYXkiLCJpc0FycmF5Iiwid29ya3NwYWNlIiwiZ2xvYlN5bmMiLCJtaWNyb21hdGNoIiwiZ2V0VHNjb25maWdCYXNlRGVwZW5kZW5jaWVzIiwiamVzdCIsImRlcCIsInByaXZhdGUiLCJsaWNlbnNlIiwicHVibGlzaENvbmZpZyIsImFjY2VzcyIsIm1haW4iLCJyZXNvbHV0aW9ucyIsImxpbnQiLCJzY3JpcHROYW1lIiwic2NyaXB0IiwiZGlycyIsImRpciIsImZvcm1hdCIsInB5dGhvbkZpbGVzIiwiZGlyTmFtZVNldCIsInB5dGhvbkZpbGUiLCJmaXJzdCIsInNlY29uZCIsInNpemUiLCJkaXJOYW1lc1N0ciIsImV4aXN0aW5nUmVwb3NpdG9yeSIsIm5vcm1hbGl6ZWRSZXBvc2l0b3J5Iiwibm9ybWFsaXplUmVwb3NpdG9yeVVybEZvclBhY2thZ2VKc29uIiwiYnVpbGROb3JtYWxpemVkUmVwb3NpdG9yeUZvclBhY2thZ2VKc29uIiwibm9ybWFsaXplZEV4aXN0aW5nUmVwb3NpdG9yeSIsImZvcm1hdFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbiIsInBhY2thZ2VOYW1lcyIsImhhcyIsImlzV29ya3NwYWNlUGFja2FnZSIsImdldExhdGVzdFByaXZhdGVQYWNrYWdlU3BlY2lmaWVyIiwidXBkYXRlUHJpdmF0ZVBhY2thZ2VzIiwibmV3SnNvblRleHQiLCJvbGRBbmROZXdTY3JpcHROYW1lcyIsIm9sZE5hbWUiLCJuZXdOYW1lIiwiZmlsZXMiLCJmaXhTY3JpcHROYW1lcyIsInVuaXF1ZURlcGVuZGVuY2llcyIsImRlcGVuZGVuY3lTcGVjaWZpZXJzIiwiZGVwZW5kZW5jeSIsImdldERlcGVuZGVuY3lTcGVjaWZpZXIiLCJ1bmlxdWVEZXZEZXBlbmRlbmNpZXMiLCJkZXZEZXBlbmRlbmN5U3BlY2lmaWVycyIsImNvcmUiLCJnZXRQaW5uZWREZXBlbmRlbmN5U3BlY2lmaWVyIiwicmVwbyIsInJlcG9zaXRvcnlVcmwiLCJtYXRjaGVkIiwiZXhlYyIsIm5vcm1hbGl6ZWRVcmwiLCJ0eXBlIiwib2xkU2NyaXB0cyIsImhhc1R5cGVjaGVjayIsImNsZWFudXAiLCJ0eXBlY2hlY2siLCJvbGRUZXN0IiwicHlyaWdodCIsImNvbW1pdEhhc2giLCJvcmdhbml6YXRpb24iLCJyZWplY3QiLCJnZXRMYXRlc3RDb21taXRIYXNoIiwiYmFzZVNldHRpbmdzIiwicHJlQ29tbWl0U2V0dGluZ3MiLCJjb21tYW5kcyIsImdlbmVyYXRlTGVmdGhvb2tVcGRhdGluZ1BhY2thZ2VKc29uIiwiaHVza3lEaXJQYXRoIiwiaGFzSHVza3lEaXIiLCJzZXR0aW5ncyIsImdldENsZWFudXBHbG9icyIsImdldENsZWFudXBDb21tYW5kIiwicHJlUHVzaCIsInR5cGVjaGVja0NvbW1hbmQiLCJnZXRQcmVQdXNoU2NyaXB0IiwibWtkaXJTeW5jIiwibW9kZSIsInBvc3RNZXJnZUNvbW1hbmQiLCJwb3N0TWVyZ2VDb21tYW5kcyIsImhhc1ZlcnNpb25TZXR0aW5ncyIsInRvb2xzQ2hhbmdlZFBhdHRlcm4iLCJyYXciLCJpbnN0YWxsQ29tbWFuZCIsInJtTmV4dERpcmVjdG9yeSIsImdlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMiLCJzdXBwb3J0ZWRFeHRlbnNpb25zIiwibG9jYWxXYlBhY2thZ2VKc29uUGF0aCIsImhhc0xvY2FsV2JXb3Jrc3BhY2UiLCJlc2xpbnRSdWxlU3VmZml4IiwiZG9lc0NvbnRhaW5Kc3hPclRzeEluUGFja2FnZXMiLCJlc2xpbnRQYXR0ZXJuIiwiZ2VuZXJhdGVMaW50c3RhZ2VkcmMiLCJnZW5lcmF0ZVByZXR0aWVyaWdub3JlIiwiZ2l0aWdub3JlRmlsZVBhdGgiLCJnaXRpZ25vcmVDb250ZW50IiwiYWRkaXRpb25hbENvbnRlbnQiLCJ2ZW52UGF0aCIsInZlbnYiLCJnZW5lcmF0ZVB5cmlnaHRDb25maWdKc29uIiwiZ2VuZXJhdGVSZWFkbWUiLCJpbnNlcnRCYWRnZSIsImZpbGVOYW1lcyIsInJlYWRkaXJTeW5jIiwiYmFkZ2VOYW1lIiwidG9VcHBlckNhc2UiLCJiYWRnZSIsInJlYWRtZSIsImkiLCJnZW5lcmF0ZVJlbGVhc2VyYyIsInBsdWdpbnMiLCJwbHVnaW4iLCJwcmVzZXQiLCJzdWNjZXNzQ29tbWVudENvbmRpdGlvbiIsImZhaWxDb21tZW50Q29uZGl0aW9uIiwibGFiZWxzIiwicmVsZWFzZWRMYWJlbHMiLCJnZW5lcmF0ZVJlbm92YXRlSnNvbiIsInBhY2thZ2VSdWxlcyIsInJ1bGUiLCJtYXRjaFBhY2thZ2VOYW1lcyIsImVuYWJsZWQiLCJpbnN0YWxsQWdlbnRTa2lsbHMiLCJzcmNEaXJlY3RvcmllcyIsImdldFNyY0RpcnMiLCJyb290SnNvbk9iaiIsImNvbXBpbGVyT3B0aW9ucyIsImFsd2F5c1N0cmljdCIsIm5vVW5jaGVja2VkSW5kZXhlZEFjY2VzcyIsImFsbG93U3ludGhldGljRGVmYXVsdEltcG9ydHMiLCJlc01vZHVsZUludGVyb3AiLCJyZXNvbHZlSnNvbk1vZHVsZSIsImRlY2xhcmF0aW9uIiwic291cmNlTWFwIiwiaW1wb3J0SGVscGVycyIsIm5vRW1pdCIsIm91dERpciIsImV4Y2x1ZGUiLCJpbmNsdWRlIiwic3ViSnNvbk9iaiIsImdlbmVyYXRlVHNjb25maWciLCJnZW5lcmF0ZWRSb290RGlyIiwicm9vdERpckNhbmRpZGF0ZXMiLCJnZXRSb290RGlyQ2FuZGlkYXRlcyIsImV4aXN0aW5nSW5jbHVkZWREaXJzIiwiZXhpc3RpbmdSb290U291cmNlRGlycyIsImdldEdlbmVyYXRlZFJvb3REaXIiLCJnZW5lcmF0ZWRUeXBlcyIsInR5cGVOYW1lcyIsInZpdGVzdCIsIm1vY2hhIiwiY3lwcmVzcyIsImdldEdlbmVyYXRlZFR5cGVzIiwiZ2V0VHNjb25maWdFeHRlbmRzIiwicm9vdERpciIsImpzeCIsImV4aXN0aW5nUm9vdERpciIsImV4aXN0aW5nVHlwZXMiLCJnZW5lcmF0ZWRFeHRlbmRzIiwiZXhpc3RpbmdFeHRlbmRzIiwibWVyZ2VkRXh0ZW5kcyIsIm5vcm1hbGl6ZUV4dGVuZHMiLCJ1bmlxdWVFeHRlbmRzIiwibWVyZ2VUc2NvbmZpZ0V4dGVuZHMiLCJzaG91bGRSZXBsYWNlRXhpc3RpbmdSb290RGlyIiwibWVyZ2VkVHlwZXMiLCJ0eXBlTmFtZSIsInR5cGVSb290cyIsInNvcnQiLCJleHBlcmltZW50YWxEZWNvcmF0b3JzIiwidmVyYmF0aW1Nb2R1bGVTeW50YXgiLCJleGNsdWRlRmlsZVBhdHRlcm5zIiwiZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyIsImV4Y2x1ZGVGaWxlUGF0dGVybiIsImV4Y2x1ZGVTZXR0aW5nIiwiZ2VuZXJhdGVZYXJucmNZbWwiLCJ5YXJucmNZbWxQYXRoIiwiY3VycmVudFZlcnNpb24iLCJsYXRlc3RWZXJzaW9uIiwidmVyc2lvbnNKc29uIiwiZ2V0TGF0ZXN0VmVyc2lvbiIsImdldE1ham9yTnVtYmVyIiwicmVsZWFzZXNQYXRoIiwieWFybnJjUGF0aCIsImRlZmF1bHRTZW12ZXJSYW5nZVByZWZpeCIsIm5vZGVMaW5rZXIiLCJubU1vZGUiLCJucG1NaW5pbWFsQWdlR2F0ZSIsIm5wbVByZWFwcHJvdmVkUGFja2FnZXMiLCJjb21wcmVzc2lvbkxldmVsIiwiaW5qZWN0RW52aXJvbm1lbnRGaWxlcyIsImVuYWJsZUdsb2JhbENhY2hlIiwib3JpZ2luYWxMZW5ndGgiLCJwbHVnaW5QYXRoIiwibWFqb3IiLCJOdW1iZXIiLCJzZXR1cExhYmVscyIsInNldHVwTGFiZWwiLCJkZWxldGVMYWJlbCIsIndhcm4iLCJjb2xvciIsInJlcXVlc3QiLCJERVBSRUNBVEVEX1NFQ1JFVF9OQU1FUyIsInNldHVwU2VjcmV0cyIsImRvdGVudiIsInNlY3JldE5hbWUiLCJzZWNyZXRfbmFtZSIsImtleV9pZCIsImtleUlkIiwiZGF0YSIsInNvZGl1bSIsInJlYWR5Iiwic2VjcmV0IiwicmF3S2V5IiwiZnJvbV9iYXNlNjQiLCJiYXNlNjRfdmFyaWFudHMiLCJPUklHSU5BTCIsInJhd1NlYyIsImZyb21fc3RyaW5nIiwiZW5jQnl0ZXMiLCJjcnlwdG9fYm94X3NlYWwiLCJlbmNCYXNlNjQiLCJ0b19iYXNlNjQiLCJlbmNyeXB0ZWRfdmFsdWUiLCJzZXR1cEdpdEh1YlNldHRpbmdzIiwid2l0aFJldHJ5IiwiYWxsb3dfYXV0b19tZXJnZSIsImFsbG93X21lcmdlX2NvbW1pdCIsImFsbG93X3NxdWFzaF9tZXJnZSIsImFsbG93X3JlYmFzZV9tZXJnZSIsImFsbG93X3VwZGF0ZV9icmFuY2giLCJkZWxldGVfYnJhbmNoX29uX21lcmdlIiwic3F1YXNoX21lcmdlX2NvbW1pdF90aXRsZSIsInNxdWFzaF9tZXJnZV9jb21taXRfbWVzc2FnZSIsImhlYWRlcnMiLCJwYWNrYWdlTWFuYWdlclJ1blBsYWNlaG9sZGVyIiwidGVtcGxhdGVzIiwiZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMiLCJhcHBseVBhY2thZ2VNYW5hZ2VyVGVtcGxhdGUiLCJkaXN0YW5jZSIsInRlbXBsYXRlIiwicGFja2FnZU1hbmFnZXJDb21tYW5kIiwid2JmeUpzb25TY2hlbWEiLCJ6IiwicmVjb3JkIiwic3RyaW5nIiwib3B0aW9uYWwiLCJkb2MiLCJnZXRQYWNrYWdlQ29uZmlnIiwicGFja2FnZUpzb25QYXRoIiwiZXNtUGFja2FnZSIsInBhY2thZ2VKc29uVGV4dCIsInJlbGVhc2VCcmFuY2hlcyIsInJlbGVhc2VQbHVnaW5zIiwicmVsZWFzZXJjSnNvblBhdGgiLCJqc29uIiwiZnNwIiwiZmxhdCIsInJlcG9JbmZvIiwiZ2l0Iiwic2ltcGxlR2l0Iiwib3JpZ2luIiwiZ2V0UmVtb3RlcyIsInIiLCJyZW1vdGVVcmwiLCJyZWZzIiwicmVxdWVzdFJlcG9JbmZvIiwiZmV0Y2hSZXBvSW5mbyIsImN1cnJlbnQiLCJoYXNWZXJzaW9uU2V0dGluZ3NGaWxlIiwicHJlZml4Iiwid2JmeUpzb25QYXRoIiwid2JmeUpzb25UZXh0IiwicmVwb0Z1bGxOYW1lIiwiZnVsbF9uYW1lIiwicmVwb0F1dGhvciIsInJlcG9OYW1lIiwicmVwb1BhcnRzIiwiaXNSZWZlcnJlZEJ5T3RoZXJSZXBvIiwiaXNFc21QYWNrYWdlIiwic2VwIiwiY29udGFpbnNBbnkiLCJkb2VzQ29udGFpblZzY29kZVNldHRpbmdzSnNvbiIsImdpdGh1YiIsIm5wbSIsImdldEVzbGludEV4dGVuc2lvbkJhc2UiLCJwYXR0ZXJuIiwib3JnIiwicmV0IiwiYXNzaWduIiwicmVkaXJlY3RlZEZ1bGxOYW1lIiwibG9jYXRpb24iLCJnZXRSZWRpcmVjdGVkUmVwb0Z1bGxOYW1lIiwicmVmcmVzaEJ1bkxvY2siLCJyb290RGlyUGF0aCIsImxvY2tGaWxlUGF0aCIsImJhY2t1cExvY2tGaWxlUGF0aCIsInJtU3luYyIsImNvcHlGaWxlU3luYyIsImFyZ3YiLCJ5YXJncyIsInBvc2l0aW9uYWwiLCJkZXNjcmliZSIsImFycmF5IiwiZGVmYXVsdCIsImFsaWFzIiwic2tpcERlcHMiLCJ2ZXJib3NlIiwicGFja2FnZUpzb25EaXIiLCJVUkwiLCJwYXRobmFtZSIsImdldFZlcnNpb24iLCJzdHJpY3QiLCJwYXRocyIsInBhY2thZ2VzRGlyUGF0aCIsInN1YkRpclBhdGhzIiwiaWdub3JlRXJyb3JBc3luYyIsImQiLCJhYmJyZXZpYXRpb25Qcm9taXNlIiwic3ViUGFja2FnZUNvbmZpZ3MiLCJzdWJEaXJQYXRoIiwiYWxsUGFja2FnZUNvbmZpZ3MiLCJzaG91bGRSdW5Xb3JrZmxvd3MiLCJ0aGVuIl0sIm1hcHBpbmdzIjoicXFCQUtPLE1BQU1BLEVBQVUsSUFMdkIsTUFDRUMsV0FBWSxFQUNaQyxtQkFBb0IsR0NnQmYsTUFBTUMsRUFBUyxJQWhCdEIsTUFDRSwrQkFB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