@willbooster/wb 13.6.0 → 13.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.js +3 -3
  2. package/package.json +9 -8
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import e from"node:fs";import t from"node:path";import n from"yargs";import{hideBin as r}from"yargs/helpers";import o from"chalk";import{globby as s}from"globby";import{config as i}from"dotenv";import{expand as a}from"dotenv-expand";import{PromisePool as c}from"minimal-promise-pool";import l,{execFileSync as d,spawn as u,spawnSync as p}from"node:child_process";import f from"node:fs/promises";import h from"kill-port";import{createServer as m}from"node:net";import{createHash as g}from"node:crypto";import y,{constants as b}from"node:os";const w={env:{description:".env files to be loaded.",type:"array"},"cascade-env":{description:"Environment to load cascading .env files (e.g., `.env`, `.env.<environment>`, `.env.local` and `.env.<environment>.local`). Preferred over `cascade-node-env` and `auto-cascade-env`.",type:"string"},"cascade-node-env":{description:'Same with --cascade-env=<NODE_ENV || "development">. Preferred over `auto-cascade-env`.',type:"boolean"},"auto-cascade-env":{description:'Same with --cascade-env=<WB_ENV || NODE_ENV || "development">.',type:"boolean",default:!0},"include-root-env":{description:"Include .env files in root directory if the project is in a monorepo and --env option is not used.",type:"boolean",default:!0},"check-env":{description:"Check whether the keys of the loaded .env files are same with the given .env file.",type:"string",default:".env.example"},verbose:{description:"Whether to show verbose information",type:"boolean",alias:"v"}};const v=new Map;function k(e){const n=v.get(e);if(n)return n;const r=i({path:t.resolve(e),processEnv:{}}).parsed??{};return v.set(e,r),r}function E(e){return e instanceof Error&&"code"in e}function A(e,t="SIGTERM"){if(!Number.isInteger(e)||e<=0)throw new Error(`Invalid pid: ${e}`);if("win32"===process.platform)return void function(e){try{S("taskkill",["/PID",String(e),"/T","/F"],{maxBuffer:1048576,timeout:2e3})}catch(e){if(x(e))return;throw e}}(e);const n=function(e){const{stdout:t}=S("ps",["-Ao","pid=,ppid="],{maxBuffer:1048576,timeout:2e3}),n=function(e){const t=new Map;for(const n of e.split("\n")){const e=/^\s*(\d+)\s+(\d+)\s*$/.exec(n);if(!e)continue;const r=Number(e[1]),o=Number(e[2]),s=t.get(o);s?s.push(r):t.set(o,[r])}return t}(t);return function(e,t){const n=[],r=[...t.get(e)??[]];let o=0;for(;o<r.length;){const e=r[o];o+=1,n.push(e),r.push(...t.get(e)??[])}return n}(e,n)}(e),r=function(e,t){const n=t.toReversed();return n.push(e),n}(e,n);for(const e of r)P(e,t)}function P(e,t){try{process.kill(e,t)}catch(e){if(x(e))return;throw e}}function S(e,t,n){try{return{stdout:d(e,[...t],{encoding:"utf8",maxBuffer:n?.maxBuffer,timeout:n?.timeout,stdio:["ignore","pipe","pipe"]}),stderr:""}}catch(n){const r=function(e){if("object"!=typeof e||null===e||!("stderr"in e))return"";const t=e.stderr;if("string"==typeof t)return t;if(Buffer.isBuffer(t))return t.toString("utf8");return""}(n);throw new $(e,t,r,function(e){if(E(e))return e.code;if("object"==typeof e&&null!==e&&"status"in e){const t=e.status;if("number"==typeof t)return t}return}(n))}}function x(e){return!(!E(e)||"ESRCH"!==e.code)||e instanceof $&&/no such process|not found|not recognized|there is no running instance/i.test(e.stderr)}class $ extends Error{constructor(e,t,n,r){super(`Command failed: ${e} ${t.join(" ")}`),this.name="CommandExecutionError",this.stderr=n,this.code=r}}async function R(e,t,n){return new Promise((r,o)=>{try{const s=u(e,t??[],n??{});s.stdout?.setEncoding?.("utf8"),s.stderr?.setEncoding?.("utf8");let i="",a="";s.stdout?.on("data",e=>{i+=e,n?.printingStdout&&process.stdout.write(e)}),s.stderr?.on("data",e=>{n?.mergeOutAndError?i+=e:a+=e,n?.printingStderr&&process.stderr.write(e)});let c=!1;const l=()=>{if(!c&&s.pid){c=!0,n?.verbose&&console.info(`treeKill(${s.pid})`);try{A(s.pid)}catch(e){n?.verbose&&console.warn(`Failed to treeKill(${s.pid})`,e)}}},d="win32"===process.platform?["SIGINT","SIGTERM"]:["SIGINT","SIGTERM","SIGQUIT"],p=new Map,f=()=>{process.removeListener("beforeExit",l);for(const[e,t]of p)process.removeListener(e,t);p.clear()};if(n?.killOnExit){process.on("beforeExit",l);for(const e of d){const t=()=>{l(),f(),0===process.listenerCount(e)&&process.kill(process.pid,e)};p.set(e,t),process.on(e,t)}}s.on("error",e=>{f(),s.removeAllListeners("close"),o(e)}),s.on("close",(e,t)=>{f(),void 0===s.pid?o(new Error("Process has no pid.")):r({pid:s.pid,stdout:i,stderr:a,status:e,signal:t})}),n?.input&&(s.stdin?.write(n.input),s.stdin?.end())}catch(e){o(e)}})}function j(e){if(Object(e)!==e)throw TypeError("right-hand side of 'in' should be an object, got "+(null!==e?typeof e:"null"));return e}function N(e,t,n){"symbol"==typeof t&&(t=(t=t.description)?"["+t+"]":"");try{Object.defineProperty(e,"name",{configurable:!0,value:n?n+" "+t:t})}catch(e){}return e}function D(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,t);if("object"!=typeof r)return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}
1
+ import e from"node:fs";import t from"node:path";import n from"yargs";import{hideBin as r}from"yargs/helpers";import o,{execFileSync as s,spawn as i,spawnSync as a}from"node:child_process";import{createHash as c}from"node:crypto";import l from"chalk";import{globby as d}from"globby";import{config as u}from"dotenv";import{expand as p}from"dotenv-expand";import f,{constants as h}from"node:os";import{PromisePool as m}from"minimal-promise-pool";import g from"kill-port";import y from"node:fs/promises";import{createServer as b}from"node:net";const w={env:{description:".env files to be loaded.",type:"array"},"cascade-env":{description:"Environment to load cascading .env files (e.g., `.env`, `.env.<environment>`, `.env.local` and `.env.<environment>.local`). Preferred over `cascade-node-env` and `auto-cascade-env`.",type:"string"},"cascade-node-env":{description:'Same with --cascade-env=<NODE_ENV || "development">. Preferred over `auto-cascade-env`.',type:"boolean"},"auto-cascade-env":{description:'Same with --cascade-env=<WB_ENV || NODE_ENV || "development">.',type:"boolean",default:!0},"include-root-env":{description:"Include .env files in root directory if the project is in a monorepo and --env option is not used.",type:"boolean",default:!0},"check-env":{description:"Check whether the keys of the loaded .env files are same with the given .env file.",type:"string",default:".env.example"},verbose:{description:"Whether to show verbose information",type:"boolean",alias:"v"}};const v=new Map;function k(e){const n=v.get(e);if(n)return n;const r=u({path:t.resolve(e),processEnv:{}}).parsed??{};return v.set(e,r),r}function E(e){return e instanceof Error&&"code"in e}function A(e,t="SIGTERM"){if(!Number.isInteger(e)||e<=0)throw new Error(`Invalid pid: ${e}`);if("win32"===process.platform)return void function(e){try{S("taskkill",["/PID",String(e),"/T","/F"],{maxBuffer:1048576,timeout:2e3})}catch(e){if(x(e))return;throw e}}(e);const n=function(e){const{stdout:t}=S("ps",["-Ao","pid=,ppid="],{maxBuffer:1048576,timeout:2e3}),n=function(e){const t=new Map;for(const n of e.split("\n")){const e=/^\s*(\d+)\s+(\d+)\s*$/.exec(n);if(!e)continue;const r=Number(e[1]),o=Number(e[2]),s=t.get(o);s?s.push(r):t.set(o,[r])}return t}(t);return function(e,t){const n=[],r=[...t.get(e)??[]];let o=0;for(;o<r.length;){const e=r[o];o+=1,n.push(e),r.push(...t.get(e)??[])}return n}(e,n)}(e),r=function(e,t){const n=t.toReversed();return n.push(e),n}(e,n);for(const e of r)P(e,t)}function P(e,t){try{process.kill(e,t)}catch(e){if(x(e))return;throw e}}function S(e,t,n){try{return{stdout:s(e,[...t],{encoding:"utf8",maxBuffer:n?.maxBuffer,timeout:n?.timeout,stdio:["ignore","pipe","pipe"]}),stderr:""}}catch(n){const r=function(e){if("object"!=typeof e||null===e||!("stderr"in e))return"";const t=e.stderr;if("string"==typeof t)return t;if(Buffer.isBuffer(t))return t.toString("utf8");return""}(n);throw new $(e,t,r,function(e){if(E(e))return e.code;if("object"==typeof e&&null!==e&&"status"in e){const t=e.status;if("number"==typeof t)return t}return}(n))}}function x(e){return!(!E(e)||"ESRCH"!==e.code)||e instanceof $&&/no such process|not found|not recognized|there is no running instance/i.test(e.stderr)}class $ extends Error{constructor(e,t,n,r){super(`Command failed: ${e} ${t.join(" ")}`),this.name="CommandExecutionError",this.stderr=n,this.code=r}}async function R(e,t,n){return new Promise((r,o)=>{try{const s=i(e,t??[],n??{});s.stdout?.setEncoding?.("utf8"),s.stderr?.setEncoding?.("utf8");let a="",c="";s.stdout?.on("data",e=>{a+=e,n?.printingStdout&&process.stdout.write(e)}),s.stderr?.on("data",e=>{n?.mergeOutAndError?a+=e:c+=e,n?.printingStderr&&process.stderr.write(e)});let l=!1;const d=()=>{if(!l&&s.pid){l=!0,n?.verbose&&console.info(`treeKill(${s.pid})`);try{A(s.pid)}catch(e){n?.verbose&&console.warn(`Failed to treeKill(${s.pid})`,e)}}},u="win32"===process.platform?["SIGINT","SIGTERM"]:["SIGINT","SIGTERM","SIGQUIT"],p=new Map,f=()=>{process.removeListener("beforeExit",d);for(const[e,t]of p)process.removeListener(e,t);p.clear()};if(n?.killOnExit){process.on("beforeExit",d);for(const e of u){const t=()=>{d(),f(),0===process.listenerCount(e)&&process.kill(process.pid,e)};p.set(e,t),process.on(e,t)}}s.on("error",e=>{f(),s.removeAllListeners("close"),o(e)}),s.on("close",(e,t)=>{f(),void 0===s.pid?o(new Error("Process has no pid.")):r({pid:s.pid,stdout:a,stderr:c,status:e,signal:t})}),n?.input&&(s.stdin?.write(n.input),s.stdin?.end())}catch(e){o(e)}})}function j(e){if(Object(e)!==e)throw TypeError("right-hand side of 'in' should be an object, got "+(null!==e?typeof e:"null"));return e}function N(e,t,n){"symbol"==typeof t&&(t=(t=t.description)?"["+t+"]":"");try{Object.defineProperty(e,"name",{configurable:!0,value:n?n+" "+t:t})}catch(e){}return e}function D(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,t);if("object"!=typeof r)return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}
2
2
  /**
3
3
  * [js-sha3]{@link https://github.com/emn178/js-sha3}
4
4
  *
@@ -6,5 +6,5 @@ import e from"node:fs";import t from"node:path";import n from"yargs";import{hide
6
6
  * @author Chen, Yi-Cyuan [emn178@gmail.com]
7
7
  * @copyright Chen, Yi-Cyuan 2015-2023
8
8
  * @license MIT
9
- */const T=[..."0123456789abcdef"],O=[6,1536,393216,100663296],I=[0,8,16,24],_=[1,0,32898,0,32906,2147483648,2147516416,2147483648,32907,0,2147483649,0,2147516545,2147483648,32777,2147483648,138,0,136,0,2147516425,0,2147483658,0,2147516555,0,139,2147483648,32905,2147483648,32771,2147483648,32770,2147483648,128,2147483648,32778,0,2147483658,2147483648,2147516545,2147483648,32896,2147483648,2147483649,0,2147516424,2147483648];const C=e=>{const t=[];for(const[n,r]of e.entries())t[n]=r;return t};class L{blocks=[];s=[];reset=!0;finalized=!1;block=0;start=0;lastByteIndex=0;constructor(e,t,n){this.padding=t,this.outputBits=n,this.blockCount=1600-(e<<1)>>5,this.byteCount=this.blockCount<<2,this.outputBlocks=n>>5,this.extraBytes=(31&n)>>3;for(let e=0;e<50;++e)this.s[e]=0}update(e){if(this.finalized)throw new Error("finalize already called");const t=this.blocks,n=this.byteCount,r=e.length,o=this.blockCount,s=this.s;let i,a,c=0;for(;c<r;){if(this.reset)for(this.reset=!1,t[0]=this.block,i=1;i<o+1;++i)t[i]=0;for(i=this.start;c<r&&i<n;++c)a=e.codePointAt(c)||0,a<128?t[i>>2]|=a<<I[3&i++]:a<2048?(t[i>>2]|=(192|a>>6)<<I[3&i++],t[i>>2]|=(128|63&a)<<I[3&i++]):a<55296||a>=57344?(t[i>>2]|=(224|a>>12)<<I[3&i++],t[i>>2]|=(128|a>>6&63)<<I[3&i++],t[i>>2]|=(128|63&a)<<I[3&i++]):(a=65536+((1023&a)<<10|1023&(e.codePointAt(++c)||0)),t[i>>2]|=(240|a>>18)<<I[3&i++],t[i>>2]|=(128|a>>12&63)<<I[3&i++],t[i>>2]|=(128|a>>6&63)<<I[3&i++],t[i>>2]|=(128|63&a)<<I[3&i++]);if(this.lastByteIndex=i,i>=n){for(this.start=i-n,this.block=t[o],i=0;i<o;++i)s[i]^=t[i];B(s),this.reset=!0}else this.start=i}return this}finalize(){if(this.finalized)return;this.finalized=!0;const e=this.blocks;let t=this.lastByteIndex;const n=this.blockCount,r=this.s;if(e[t>>2]|=this.padding[3&t],this.lastByteIndex===this.byteCount)for(e[0]=e[n],t=1;t<n+1;++t)e[t]=0;for(e[n-1]|=2147483648,t=0;t<n;++t)r[t]^=e[t];B(r)}hex(){this.finalize();const e=this.blockCount;let t=this.s;const n=this.outputBlocks,r=this.extraBytes;let o,s=0,i=0,a="";for(;i<n;){for(s=0;s<e&&i<n;++s,++i)o=t[s],a+=T[o>>4&15]+T[15&o]+T[o>>12&15]+T[o>>8&15]+T[o>>20&15]+T[o>>16&15]+T[o>>28&15]+T[o>>24&15];i%e===0&&(t=C(t),B(t),s=0)}return r&&(o=t[s],a+=T[o>>4&15]+T[15&o],r>1&&(a+=T[o>>12&15]+T[o>>8&15]),r>2&&(a+=T[o>>20&15]+T[o>>16&15])),a}}const B=function(e){let t,n,r,o,s,i,a,c,l,d,u,p,f,h,m,g,y,b,w,v,k,E,A,P,S,x,$,R,j,N,D,T,O,I,C,L,B,F,J,U,W,M,z,Y,q,V,G,K,H,Q,X,Z,ee,te,ne,re,oe,se,ie,ae,ce,le,de;for(r=0;r<48;r+=2)o=e[0]^e[10]^e[20]^e[30]^e[40],s=e[1]^e[11]^e[21]^e[31]^e[41],i=e[2]^e[12]^e[22]^e[32]^e[42],a=e[3]^e[13]^e[23]^e[33]^e[43],c=e[4]^e[14]^e[24]^e[34]^e[44],l=e[5]^e[15]^e[25]^e[35]^e[45],d=e[6]^e[16]^e[26]^e[36]^e[46],u=e[7]^e[17]^e[27]^e[37]^e[47],p=e[8]^e[18]^e[28]^e[38]^e[48],f=e[9]^e[19]^e[29]^e[39]^e[49],t=p^(i<<1|a>>>31),n=f^(a<<1|i>>>31),e[0]^=t,e[1]^=n,e[10]^=t,e[11]^=n,e[20]^=t,e[21]^=n,e[30]^=t,e[31]^=n,e[40]^=t,e[41]^=n,t=o^(c<<1|l>>>31),n=s^(l<<1|c>>>31),e[2]^=t,e[3]^=n,e[12]^=t,e[13]^=n,e[22]^=t,e[23]^=n,e[32]^=t,e[33]^=n,e[42]^=t,e[43]^=n,t=i^(d<<1|u>>>31),n=a^(u<<1|d>>>31),e[4]^=t,e[5]^=n,e[14]^=t,e[15]^=n,e[24]^=t,e[25]^=n,e[34]^=t,e[35]^=n,e[44]^=t,e[45]^=n,t=c^(p<<1|f>>>31),n=l^(f<<1|p>>>31),e[6]^=t,e[7]^=n,e[16]^=t,e[17]^=n,e[26]^=t,e[27]^=n,e[36]^=t,e[37]^=n,e[46]^=t,e[47]^=n,t=d^(o<<1|s>>>31),n=u^(s<<1|o>>>31),e[8]^=t,e[9]^=n,e[18]^=t,e[19]^=n,e[28]^=t,e[29]^=n,e[38]^=t,e[39]^=n,e[48]^=t,e[49]^=n,h=e[0],m=e[1],V=e[11]<<4|e[10]>>>28,G=e[10]<<4|e[11]>>>28,R=e[20]<<3|e[21]>>>29,j=e[21]<<3|e[20]>>>29,ae=e[31]<<9|e[30]>>>23,ce=e[30]<<9|e[31]>>>23,M=e[40]<<18|e[41]>>>14,z=e[41]<<18|e[40]>>>14,I=e[2]<<1|e[3]>>>31,C=e[3]<<1|e[2]>>>31,g=e[13]<<12|e[12]>>>20,y=e[12]<<12|e[13]>>>20,K=e[22]<<10|e[23]>>>22,H=e[23]<<10|e[22]>>>22,N=e[33]<<13|e[32]>>>19,D=e[32]<<13|e[33]>>>19,le=e[42]<<2|e[43]>>>30,de=e[43]<<2|e[42]>>>30,te=e[5]<<30|e[4]>>>2,ne=e[4]<<30|e[5]>>>2,L=e[14]<<6|e[15]>>>26,B=e[15]<<6|e[14]>>>26,b=e[25]<<11|e[24]>>>21,w=e[24]<<11|e[25]>>>21,Q=e[34]<<15|e[35]>>>17,X=e[35]<<15|e[34]>>>17,T=e[45]<<29|e[44]>>>3,O=e[44]<<29|e[45]>>>3,P=e[6]<<28|e[7]>>>4,S=e[7]<<28|e[6]>>>4,re=e[17]<<23|e[16]>>>9,oe=e[16]<<23|e[17]>>>9,F=e[26]<<25|e[27]>>>7,J=e[27]<<25|e[26]>>>7,v=e[36]<<21|e[37]>>>11,k=e[37]<<21|e[36]>>>11,Z=e[47]<<24|e[46]>>>8,ee=e[46]<<24|e[47]>>>8,Y=e[8]<<27|e[9]>>>5,q=e[9]<<27|e[8]>>>5,x=e[18]<<20|e[19]>>>12,$=e[19]<<20|e[18]>>>12,se=e[29]<<7|e[28]>>>25,ie=e[28]<<7|e[29]>>>25,U=e[38]<<8|e[39]>>>24,W=e[39]<<8|e[38]>>>24,E=e[48]<<14|e[49]>>>18,A=e[49]<<14|e[48]>>>18,e[0]=h^~g&b,e[1]=m^~y&w,e[10]=P^~x&R,e[11]=S^~$&j,e[20]=I^~L&F,e[21]=C^~B&J,e[30]=Y^~V&K,e[31]=q^~G&H,e[40]=te^~re&se,e[41]=ne^~oe&ie,e[2]=g^~b&v,e[3]=y^~w&k,e[12]=x^~R&N,e[13]=$^~j&D,e[22]=L^~F&U,e[23]=B^~J&W,e[32]=V^~K&Q,e[33]=G^~H&X,e[42]=re^~se&ae,e[43]=oe^~ie&ce,e[4]=b^~v&E,e[5]=w^~k&A,e[14]=R^~N&T,e[15]=j^~D&O,e[24]=F^~U&M,e[25]=J^~W&z,e[34]=K^~Q&Z,e[35]=H^~X&ee,e[44]=se^~ae&le,e[45]=ie^~ce&de,e[6]=v^~E&h,e[7]=k^~A&m,e[16]=N^~T&P,e[17]=D^~O&S,e[26]=U^~M&I,e[27]=W^~z&C,e[36]=Q^~Z&Y,e[37]=X^~ee&q,e[46]=ae^~le&te,e[47]=ce^~de&ne,e[8]=E^~h&g,e[9]=A^~m&y,e[18]=T^~P&x,e[19]=O^~S&$,e[28]=M^~I&L,e[29]=z^~C&B,e[38]=Z^~Y&V,e[39]=ee^~q&G,e[48]=le^~te&re,e[49]=de^~ne&oe,e[0]^=_[r],e[1]^=_[r+1]},F=function(){const e={instance:Error,from:e=>{const t=[e.name,e.message];return void 0!==e.stack&&t.push(e.stack),void 0!==e.cause&&(void 0===e.stack&&t.push(void 0),t.push(e.cause)),t},stub:()=>new Error,hydrate:(e,[t,n,r,o])=>{e.name=t,e.message=n,void 0===r?delete e.stack:e.stack=r,void 0!==o&&(e.cause=o)}},t={instance:Uint8Array,from:e=>[btoa(U.decode(e))],create:([e])=>J.encode(atob(e))},n={instance:Map,from:e=>[...e.entries()],stub:()=>new Map,hydrate:(e,t)=>{for(const[n,r]of t)e.set(n,r)}},r={instance:Set,from:e=>[...e.values()],stub:()=>new Set,hydrate:(e,t)=>{for(const n of t)e.add(n)}},o={instance:Date,from:e=>[e.toJSON()],create:([e])=>new Date(e)},s={instance:RegExp,from:({flags:e,source:t})=>e?[t,e]:[t],create:([e,t])=>new RegExp(e,t)},i={instance:URL,from:e=>[e.href],create:([e])=>new URL(e)};return new Map([e,t,n,r,o,s,i].map(e=>[e.instance.name,e]))}(),J=new TextEncoder,U=new TextDecoder("utf-8");function W(e=void 0,t=F){return JSON.stringify(Y(e,t))}function M(e){if(void 0===e)return-1;if("number"==typeof e){if(Number.isNaN(e))return-3;if(!Number.isFinite(e))return e<0?-5:-4}return null}const z=[];function Y(e,t=F){const n=M(e);if(null!==n)return n;const r=[],o=new Map;return function e(n){const s=M(n);if(null!==s)return s;let i=o.get(n);if(void 0!==i)return i;switch(i=r.length,typeof n){case"number":case"string":case"boolean":r[i]=n,o.set(n,i);break;case"bigint":r[i]=[-6,n.toString(16)],o.set(n,i);break;case"object":if(null===n)r[i]=n,o.set(n,i);else if(Array.isArray(n)){const t=function(e){if(z.length<e){const t=z.length;z.length=e,z.fill(-2,t,e)}return z.slice(0,e)}(n.length);r[i]=t,o.set(n,i);for(const[r,o]of n.entries())t[r]=e(o)}else{const[s,a]=function(e,t){const n=e.constructor;if("function"==typeof n){const r=n.name,o=t.get(r);if(void 0!==o)return[r,o.from(e)]}const r=Object.entries(e),o=r.length,s=Array.from({length:o+o});for(let e=0;e<o;e++){const t=r[e],n=e+e;s[n]=t[0],s[n+1]=t[1]}return["",s]}(n,t),c=a.length,l=Array.from({length:c+1});l[0]=s,r[i]=l,o.set(n,i);for(let t=0;t<c;t++)l[t+1]=e(a[t])}}return i}(e),r}function q(e,t){return function(e){return new L(512,O,512).update(e).hex()}(W([e,t]))}const V=function({cacheDuration:e=Number.POSITIVE_INFINITY,getCacheKey:t=q}={}){return function(n,r){let o,s,i;return"getter"===r?.kind?function(){const r=t(this,[]),a=Date.now();return(i!==r||a-s>e)&&(i=r,o=n.call(this),s=a),o}:function(...a){const c=t(this,a),l=Date.now();return(i!==c||l-s>e)&&(i=c,o=r?n.call(this,...a):n(...a),s=l),o}}}({getCacheKey:q});function G(e){return!!e&&"0"!==e&&"false"!==e}let K;class H{static{[K]=function(e,t,n,r,o){var s,i,a,c,l,d,u,p=Symbol.metadata||Symbol.for("Symbol.metadata"),f=Object.defineProperty,h=Object.create,m=[h(null),h(null)],g=t.length;function y(t,n,r){return function(o,s){n&&(s=o,o=e);for(var i=0;i<t.length;i++)s=t[i].apply(o,r?[s]:[]);return r?s:o}}function b(e,t,n,r){if("function"!=typeof e&&(r||void 0!==e))throw new TypeError(t+" must "+(n||"be")+" a function"+(r?"":" or undefined"));return e}function w(e,t,n,r,o,a,c,l,d,u,p){function h(e){if(!p(e))throw new TypeError("Attempted to access private element on non-instance")}var g=[].concat(t[0]),w=t[3],v=!c,k=1===o,E=3===o,A=4===o,P=2===o;function S(t,n,r){return function(o,s){return n&&(s=o,o=e),r&&r(o),x[t].call(o,s)}}if(!v){var x={},$=[],R=E?"get":A||k?"set":"value";if(d?(u||k?x={get:N(function(){return w(this)},r,"get"),set:function(e){t[4](this,e)}}:x[R]=w,u||N(x[R],r,P?"":R)):u||(x=Object.getOwnPropertyDescriptor(e,r)),!u&&!d){if((i=m[+l][r])&&7!==(i^o))throw Error("Decorating two elements with the same name ("+x[R].name+") is not supported yet");m[+l][r]=o<3?1:o}}for(var j=e,D=g.length-1;D>=0;D-=n?2:1){var T=b(g[D],"A decorator","be",!0),O=n?g[D-1]:void 0,I={},_={kind:["field","accessor","method","getter","setter","class"][o],name:r,metadata:s,addInitializer:function(e,t){if(e.v)throw new TypeError("attempted to call addInitializer after decoration was finished");b(t,"An initializer","be",!0),a.push(t)}.bind(null,I)};if(v)i=T.call(O,j,_),I.v=1,b(i,"class decorators","return")&&(j=i);else if(_.static=l,_.private=d,i=_.access={has:d?p.bind():function(e){return r in e}},A||(i.get=d?P?function(e){return h(e),x.value}:S("get",0,h):function(e){return e[r]}),P||E||(i.set=d?S("set",0,h):function(e,t){e[r]=t}),j=T.call(O,k?{get:x.get,set:x.set}:x[R],_),I.v=1,k){if("object"==typeof j&&j)(i=b(j.get,"accessor.get"))&&(x.get=i),(i=b(j.set,"accessor.set"))&&(x.set=i),(i=b(j.init,"accessor.init"))&&$.unshift(i);else if(void 0!==j)throw new TypeError("accessor decorators must return an object with get, set, or init properties or undefined")}else b(j,(u?"field":"method")+" decorators","return")&&(u?$.unshift(j):x[R]=j)}return o<2&&c.push(y($,l,1),y(a,l,0)),u||v||(d?k?c.splice(-1,0,S("get",l),S("set",l)):c.push(P?x[R]:b.call.bind(x[R])):f(e,r,x)),j}function v(e){return f(e,p,{configurable:!0,enumerable:!0,value:s})}return s=h(null==s?null:s),l=[],d=function(e){e&&l.push(y(e))},u=function(t,r){for(var s=0;s<n.length;s++){var i=n[s],d=i[1],u=7&d;if((8&d)==t&&!u==r){var p=i[2],f=!!i[3],h=16&d;w(t?e:e.prototype,i,h,f?"#"+p:D(p),u,u<2?[]:t?c=c||[]:a=a||[],l,!!t,f,r,t&&f?function(t){return j(t)===e}:o)}}},u(8,0),u(0,0),u(8,1),u(0,1),d(a),d(c),i=l,g||v(e),{e:i,get c(){var n=[];return g&&[v(e=w(e,[t],r,e.name,5,n)),y(n,1)]}}}(this,[],[[V,3,"isBunAvailable"],[V,3,"buildCommand"],[V,3,"rootDirPath"],[V,3,"dockerfile"],[V,3,"hasDockerfile"],[V,3,"hasSourceCode"],[V,3,"name"],[V,3,"dockerImageName"],[V,3,"env"],[V,3,"packageJson"],[V,3,"packageJsonPath"],[V,3,"hasPrisma"],[V,3,"hasVitest"],[V,3,"hasBiome"],[V,3,"hasEslint"],[V,3,"hasOxlint"],[V,3,"hasOxfmt"],[V,3,"hasPoetryLock"],[V,3,"hasPubspecYaml"],[V,3,"preferredLinter"],[V,3,"hasPlaywrightConfig"],[V,3,"skipLaunchingServerForPlaywright"],[V,3,"dockerPackageJson"],[V,3,"binExists"],[V,3,"rootPackageJson"]]).e}argv=void K(this);pathByName=new Map;constructor(e,n,r){this._dirPath=t.resolve(e),this.argv=n,this.loadEnv=r}get isBunAvailable(){try{return/(^|\n)bun\s/.test(e.readFileSync(t.join(this.rootDirPath,".tool-versions"),"utf8"))}catch{return!1}}get buildCommand(){return this.packageJson.scripts?.build?.includes("buildIfNeeded")?"YARN run build":this.packageJson.scripts?.build?"YARN wb buildIfNeeded "+(this.argv.verbose?"--verbose":""):"echo 'No build script'"}get dirPath(){return this._dirPath}get rootDirPath(){return e.existsSync(t.join(this.dirPath,"..","..","package.json"))?t.resolve(this.dirPath,"..",".."):this.dirPath}get dockerfile(){return e.readFileSync(this.findFile("Dockerfile"),"utf8")}get hasDockerfile(){try{return!!this.findFile("Dockerfile")}catch{return!1}}get hasSourceCode(){return e.existsSync(t.join(this.dirPath,"src"))}get name(){return this.packageJson.name||"unknown"}get dockerImageName(){return(this.packageJson.name||"unknown").replaceAll("@","").replaceAll("/","-")}get env(){if(!this.loadEnv)return process.env;const[n,r]=function(n,r){let o=(n.env??[]).map(e=>t.resolve(r,e.toString()));const s=n.cascadeEnv??(n.cascadeNodeEnv?process.env.NODE_ENV||"development":n.autoCascadeEnv?process.env.WB_ENV||process.env.NODE_ENV||"development":void 0);if("string"==typeof s){if(0===o.length&&(o.push(t.join(r,".env")),n.includeRootEnv)){const n=t.resolve(r,"..","..");e.existsSync(t.join(n,"package.json"))&&o.push(t.join(n,".env"))}o=o.flatMap(e=>s?[`${e}.${s}.local`,`${e}.local`,`${e}.${s}`,e]:[`${e}.local`,e])}o=o.filter(t=>e.existsSync(t)).map(e=>t.relative(r,e)),n.verbose&&(console.info(`WB_ENV: ${process.env.WB_ENV}, NODE_ENV: ${process.env.NODE_ENV}`),console.info("Reading env files:",o.join(", ")));const i=[],c={};for(const e of o){const o=[];for(const[n,s]of Object.entries(k(t.join(r,e))))n in c||n in process.env||(c[n]=s,o.push(n));i.push([e,o]),n.verbose&&o.length>0&&console.info(`Read ${o.length} environment variables from ${e}`)}if(n.verbose||console.info(`Read env files: ${i.map(([e,t])=>t.length>0?`${e} (${t.join(", ")})`:e).join(", ")||"nothing"}`),n.checkEnv){const e=Object.keys(k(t.join(r,n.checkEnv))).filter(e=>!(e in c)&&!(e in process.env));if(e.length>0)throw new Error(`Missing environment variables in [${o.join(", ")}]: [${e.join(", ")}]`)}return[a({parsed:c,processEnv:{}}).parsed??c,i]}(this.argv,this.dirPath);for(const[e,t]of r)console.info(`Loaded ${t} environment variables from ${e}`);return{...n,...process.env}}get packageJson(){return JSON.parse(e.readFileSync(this.packageJsonPath,"utf8"))}get packageJsonPath(){return t.join(this.dirPath,"package.json")}get hasPrisma(){return!!(this.packageJson.dependencies?.prisma??this.packageJson.devDependencies?.prisma)}get hasVitest(){return!!(this.packageJson.dependencies?.vitest??this.packageJson.devDependencies?.vitest)}get hasBiome(){return this.hasDependency("@biomejs/biome")||this.hasDependency("biome")}get hasEslint(){return this.hasDependency("eslint")}get hasOxlint(){return this.hasDependency("oxlint")}get hasOxfmt(){return this.hasDependency("oxfmt")}get hasPoetryLock(){return e.existsSync(t.join(this.dirPath,"poetry.lock"))||e.existsSync(t.join(this.rootDirPath,"poetry.lock"))}get hasPubspecYaml(){return e.existsSync(t.join(this.dirPath,"pubspec.yaml"))||e.existsSync(t.join(this.rootDirPath,"pubspec.yaml"))}get preferredLinter(){return this.hasBiome?"biome":this.hasOxlint?"oxlint":this.hasEslint?"eslint":void 0}get hasPlaywrightConfig(){try{return!!this.findFile("playwright.config.ts")}catch{return!1}}get skipLaunchingServerForPlaywright(){if(G(this.env.CI))return!1;try{const t=this.findFile("playwright.config.ts");return/\bwebServer\b/.test(e.readFileSync(t,"utf8"))}catch{return!1}}get dockerPackageJson(){return t.dirname(this.findFile("Dockerfile"))===this.dirPath?this.packageJson:JSON.parse(e.readFileSync(t.join(t.dirname(this.findFile("Dockerfile")),"package.json"),"utf8"))}get binExists(){let n=!1,r=this.dirPath;for(;;){const o=t.join(r,"node_modules",".bin");if(e.existsSync(o)&&(this.env.PATH=`${o}:${this.env.PATH}`,n=!0),e.existsSync(t.join(r,".git")))break;const s=t.dirname(r);if(r===s)break;r=s}return n}findFile(n){let r=this.pathByName.get(n);if(r)return r;if(r=[n,t.join("..","..",n)].map(e=>t.resolve(this.dirPath,e)).find(t=>e.existsSync(t)),!r)throw new Error(`File not found: ${n}`);return this.pathByName.set(n,r),r}hasDependency(e){const t=t=>!(!t||!(t.dependencies?.[e]||t.devDependencies?.[e]||t.optionalDependencies?.[e]||t.peerDependencies?.[e]));return t(this.packageJson)||t(this.rootPackageJson)}get rootPackageJson(){if(this.rootDirPath===this.dirPath)return this.packageJson;try{return JSON.parse(e.readFileSync(t.join(this.rootDirPath,"package.json"),"utf8"))}catch(e){return void console.error(`[wb] Failed to read or parse ${t.join(this.rootDirPath,"package.json")}`,e)}}}function Q(n,r=!0,o){if(o??=process.cwd(),e.existsSync(t.join(o,"package.json")))return new H(o,n,r)}async function X(e,t=!0,n){const r=Z(e,t,n);if(r)return{...r,descendants:r.root===r.self?await ee(e,r.root,t):[r.self]}}function Z(n,r=!0,o){if(o??=process.cwd(),!e.existsSync(t.join(o,"package.json")))return;const s=new H(o,n,r);let i=s;if(!s.packageJson.workspaces&&t.dirname(o).endsWith("/packages")){const s=t.resolve(o,"..","..");e.existsSync(t.join(s,"package.json"))&&(i=new H(s,n,r))}return{root:i,self:s}}async function ee(n,r,o){const i=[r],a=r.packageJson.workspaces;if(!Array.isArray(a))return i;const c=[],l=[];for(const n of a.map(e=>t.join(r.dirPath,e)))e.existsSync(n)?l.push(n):c.push(n);l.push(...await s(c,{dot:!0,onlyDirectories:!0}));for(const r of l)e.existsSync(t.join(r,"package.json"))&&i.push(new H(r,n,o));return i}const te=new c,ne=process.versions.bun||process.argv[0]?.endsWith("/bun")||process.env.npm_execpath?.endsWith("/bun"),re=ne?"bun --bun run":"node",oe=ne?"bun":"yarn",se=ne?"bun --bun run":"yarn",ie={exitIfFailed:!0};async function ae(e,t,n,r=ie){const o=le(e,t);if(de(o.printable,t),n.verbose&&de(o.runnable,t,"Start (raw)",!0),n.dryRun)return ue(o.printable,0,r),0;const s=await R(o.runnable,void 0,{cwd:t.dirPath,env:pe(t.env,r),shell:!0,stdio:"inherit",timeout:r.timeout,killOnExit:!0,verbose:n.verbose});return r.onSignal?.(s.signal),ue(o.printable,s.status,r),s.status??1}function ce(e,t,n,r=ie){return te.runAndWaitForReturnValue(async()=>{const o=le(e,t);if(de(o.printable,t,"Start (parallel)",!0),n.dryRun)return de(o.printable,t,"Started (log)"),n.verbose&&de(o.runnable,t,"Started (raw)",!0),ue(o.printable,0,r),0;const s=await R(o.runnable,void 0,{cwd:t.dirPath,env:pe(t.env,r),shell:!0,stdio:"pipe",timeout:r.timeout,mergeOutAndError:!0,killOnExit:!0,verbose:n.verbose});r.onSignal?.(s.signal),de(o.printable,t,"Started (log)"),n.verbose&&de(o.runnable,t,"Started (raw)",!0);const i=s.stdout.trim();return i&&(process.stdout.write(i),process.stdout.write("\n")),ue(o.printable,s.status,r),s.status??1})}function le(e,t){let n=e.replaceAll("\n","").replaceAll(/\s\s+/g," ").replaceAll("PRISMA generate ",t.packageJson.dependencies?.blitz?"PRISMA generate ":"PRISMA generate --no-hints ").replaceAll("PRISMA ",t.packageJson.dependencies?.blitz?"YARN blitz prisma ":"YARN prisma ").replaceAll("BUN ",t.isBunAvailable?"bun --bun run ":"YARN ").replaceAll("YARN run ",ne?"bun --bun run ":"yarn run ");ne&&(n=n.replaceAll("YARN build-ts run","bun --bun run").replaceAll("bun --bun run bun --bun run","bun --bun run").replaceAll("dist/index.js","src/index.ts").replaceAll(/(?:YARN )?vitest run/g,"bun test").replaceAll(/ --color --passWithNoTests(?: --allowOnly)?/g,"")),n=n.trim();const r=fe(n.replaceAll("YARN ",`${se} `)),o=fe(n.replaceAll("YARN playwright ",`${se} playwright `).replaceAll("YARN ",!ne&&t.binExists?"":`${se} `)),s=t.env.WB_ENV?` -c=${t.env.WB_ENV||"development"}`:"";return{printable:`${se} dotenv${s} -- ${r}`,runnable:o}}function de(e,t,n="Start",r=!1){console.info("\n"+(r?o.gray:o.cyan)(o.bold(`${n}:`),e)+o.gray(` at ${t.dirPath}`))}function ue(e,t,n){0===t?console.info(o.green(o.bold("Finished:"),e)):(console.info(o.red(o.bold(`Failed (exit code ${t}): `),e)),!1!==n.exitIfFailed&&process.exit(t??1))}function pe(e,t){const n={...e};return t.ci&&(n.CI="1"),t.forceColor&&(n.FORCE_COLOR="3"),n}function fe(e){return e.includes("next dev")||e.includes("playwright")||e.includes("prisma")||e.includes("test/e2e-additional")?e.replaceAll("bun --bun","bun"):e}function he(e){return e.map(e=>me(e)).join(" ")}function me(e){return/^[\w./:=,@%+-]+$/u.test(e)?e:`'${e.replaceAll("'","'\"'\"'")}'`}const ge=new Set(["astro","cjs","css","cts","gql","htm","html","js","json","json5","jsonc","jsx","mjs","mts","svelte","ts","tsx","vue","yaml","yml"]),ye=new Set(["cjs","cts","js","jsx","mjs","mts","ts","tsx"]),be=new Set([...ye,"astro","svelte","vue"]),we=new Set(["py"]),ve=new Set(["dart"]),ke=new Set([...be,"css","gql","graphql","hbs","htm","html","json","json5","jsonc","less","md","mdx","scss","toml","yaml","yml"]),Ee=new Set(["cjs","css","cts","htm","html","java","js","json","json5","jsonc","jsx","md","mjs","mts","scss","ts","tsx","vue","yaml","yml"]),Ae=new Set([...Ee].filter(e=>!ge.has(e))),Pe="!**/test{-,/}fixtures/**",Se={command:"lint [files...]",describe:"Lint code",builder:{fix:{description:"Fix the linting errors",type:"boolean"},format:{description:"Format the code",type:"boolean"},quiet:{description:"Report errors only",type:"boolean"}},async handler(e){const t=await xe(e);t&&process.exit(t)}};async function xe(e){if("win32"===process.platform)return console.error(o.red("This command is not supported on Windows.")),1;const n=await X(e,!1);if(!n)return console.error(o.red("No project found.")),1;const r=function(e){const t=new Set;for(const n of[...e.files??[],...e._.slice(1),...e["--"]??[]])t.add(String(n));return[...t]}(e),s=new Map,i=new Map,a=new Map,c=new Map,l=[],d=[];let u,p,h=!1;if(r.length>0){const e=await Promise.all(r.map(async e=>{const n=t.resolve(e),r=await async function(e){try{if((await f.stat(e)).isDirectory())return"directory"}catch{}return"other"}(n);return{fileKind:r,filePath:n}}));for(const{fileKind:r,filePath:u}of e){if(u.endsWith("/test/fixtures")||u.includes("/test/fixtures/")||u.endsWith("/test-fixtures")||u.includes("/test-fixtures/"))continue;const e=t.extname(u).slice(1);if(u.endsWith("/package.json"))d.push(u);else{d.push(...Te(n.descendants,u,r));for(const{lintPath:t,project:d}of Oe(n.descendants,u,r)){if(d.hasPoetryLock&&("directory"===r||we.has(e))){const e=a.get(d)??[];if(e.push(t),a.set(d,e),"directory"!==r)continue}if(d.hasPubspecYaml&&("directory"===r||ve.has(e))){const e=c.get(d)??[];if(e.push(t),c.set(d,e),"directory"!==r)continue}if("biome"===d.preferredLinter||"directory"===r||_e(d,e)){const n=s.get(d)??[];n.push(t),s.set(d,n);for(const n of De(d,t,r,e))if(d.hasOxfmt){const e=i.get(d)??[];e.push(n),i.set(d,e)}else l.push(n)}else if(Ee.has(e)||ke.has(e))if(d.hasOxfmt&&ke.has(e)){const e=i.get(d)??[];e.push(t),i.set(d,e)}else Ee.has(e)&&l.push(t);else Ie(e)&&!d.preferredLinter&&(console.error(o.red(`No linter found for ${d.name}. Install ESLint or Biome.`)),h=!0)}}}u=[...new Set(l)],p=[...new Set(d)]}else u=function(e,n){const r=new Set([`**/{.*/,}*.{${[...Ae].join(",")}}`,Pe]);for(const o of n){if(!Ce(o))continue;const n=t.join(o.dirPath,"**/{.*/,}*.{"+[...Ee].join(",")+"}");r.add(t.relative(e,n)||n)}return[...r]}(n.self.dirPath,n.descendants),p=n.descendants.map(e=>e.packageJsonPath);const m=[],g={exitIfFailed:!1,forceColor:!0};if(r.length>0){for(const[t,n]of s){const r=$e(t,e,n);r&&m.push(ce(r,t,e,g))}for(const[t,n]of i)m.push(ce(Re(n),t,e,g));for(const[t,n]of a)m.push(ce(je(e,n),t,e,g));for(const[t,n]of c)m.push(ce(Ne(e,n),t,e,g))}else{for(const t of n.descendants){if(t.packageJson.workspaces&&!t.hasSourceCode)continue;const n=$e(t,e);n&&m.push(ce(n,t,e,g))}for(const t of n.descendants)t.hasPoetryLock&&m.push(ce(je(e),t,e,g)),t.hasPubspecYaml&&m.push(ce(Ne(e),t,e,g)),t.hasOxfmt&&e.format&&m.push(ce(Re(),t,e,g))}const y=await Promise.all(m);return h||y.some(e=>0!==e)?1:(e.format&&(u.length>0&&y.push(await ce(he(["YARN","prettier","--cache","--color","--no-error-on-unmatched-pattern","--write","--",...u]),n.self,e,{exitIfFailed:!1,forceColor:!0})),p.length>0&&y.push(await ce(he(["YARN","sort-package-json","--",...p]),n.self,e,{exitIfFailed:!1,forceColor:!0}))),y.some(e=>0!==e)?1:0)}function $e(e,t,n){if("biome"===e.preferredLinter){let e;return e=t.fix&&t.format?["check","--fix"]:t.fix?["lint","--fix"]:t.format?["format","--fix"]:["lint"],he(["BUN","biome",...e,"--colors=force","--no-errors-on-unmatched","--files-ignore-unknown=true",...t.quiet?["--diagnostic-level=error"]:[],...n?.length?["--"]:[],...n??[]])}return"eslint"===e.preferredLinter?he(["YARN","eslint","--color",...t.quiet?["--quiet"]:[],...t.fix||t.format?["--fix"]:[],"--",...n??["."]]):"oxlint"===e.preferredLinter?he(["YARN","oxlint",...t.quiet?["--quiet"]:[],...t.fix?["--fix"]:[],...n??["."]]):void 0}function Re(e){return he(["YARN","oxfmt","--write","--no-error-on-unmatched-pattern",...e??["."]])}function je(e,t){const n=t&&t.length>0?t:["."];return(e.fix||e.format?[he(["poetry","run","isort","--profile","black","--filter-files",...n]),he(["poetry","run","black",...n]),he(["poetry","run","flake8",...e.quiet?["-q"]:[],...n])]:[he(["poetry","run","flake8",...e.quiet?["-q"]:[],...n])]).join(" && ")}function Ne(e,t){const n=t&&t.length>0?t:["."],r=[];return(e.fix||e.format)&&r.push(he(["dart","format",...n])),r.push(he(["dart","analyze",...n])),r.join(" && ")}function De(e,n,r,o){return"directory"===r&&e.hasOxfmt?[n]:"directory"===r&&"biome"===e.preferredLinter?[t.join(n,"**/{.*/,}*.{"+[...Ae].join(",")+"}"),Pe]:"directory"===r&&Ce(e)?[n,Pe]:function(e,t){return e.hasOxfmt?ke.has(t):!!Ce(e)||"biome"===e.preferredLinter&&!_e(e,t)&&Ee.has(t)}(e,o)?[n]:[]}function Te(e,n,r){return"directory"!==r?[]:e.filter(e=>e.packageJsonPath===t.join(n,"package.json")||e.packageJsonPath.startsWith(`${n}/`)).map(e=>e.packageJsonPath)}function Oe(e,t,n){if("directory"===n){const n=e.filter(e=>e.dirPath===t||e.dirPath.startsWith(`${t}/`));if(n.length>0)return n.map(e=>({lintPath:e.dirPath,project:e}))}const r=function(e,t){let n;for(const r of e)t!==r.dirPath&&!t.startsWith(`${r.dirPath}/`)||n&&!(r.dirPath.length>n.dirPath.length)||(n=r);return n}(e,t);return r?[{lintPath:t,project:r}]:[]}function Ie(e){return ge.has(e)||be.has(e)||ye.has(e)||we.has(e)||ve.has(e)}function _e(e,t){return"biome"===e.preferredLinter?ge.has(t):"oxlint"===e.preferredLinter?be.has(t):"eslint"===e.preferredLinter&&ye.has(t)}function Ce(e){return!e.hasOxfmt&&("eslint"===e.preferredLinter||"oxlint"===e.preferredLinter)}function Le(e){return e.silent?" > /dev/null":""}async function Be(e,t){const n=Number(e);if(!n)throw new Error(`The given port (${n}) is invalid.`);return await async function(e,t){const n=await async function(e){for(const t of["127.0.0.1","::"]){if(!await Fe(t,e))return!1}return!0}(e);n||await Ue(e,t);const r=async()=>{Je.has(e)||(Je.add(e),await Ue(e,t))};for(const e of["beforeExit","SIGINT","SIGTERM","SIGQUIT"])process.on(e,r)}(n,t),n}async function Fe(e,t){return new Promise(n=>{const r=m();r.once("error",e=>{"EADDRINUSE"!==e.code?"EAFNOSUPPORT"!==e.code?n(!1):n(!0):n(!1)}),r.once("listening",()=>{r.close(()=>{n(!0)})}),r.listen(t,e)})}const Je=new Set;async function Ue(e,t){await async function(e,t){await async function(e,t){try{const n=await async function(e,t){const{stdout:n}=await R("docker",["ps","-q",...e],{cwd:t.dirPath,env:t.env});return n.split(/\s+/).map(e=>e.trim()).filter(Boolean)}(e,t);if(0===n.length)return;await R("docker",["rm","-f",...n],{cwd:t.dirPath,env:t.env})}catch{}}(["--filter",`publish=${e}`],t)}(e,t);try{await h(e)}catch{}}const We=new class{buildImage(e,n){const r=e.dockerPackageJson.scripts?.["docker/build/prepare"]?"YARN run docker/build/prepare && ":"";return`cd ${t.dirname(e.findFile("Dockerfile"))}\n && ${r}YARN wb optimizeForDockerBuild --outside\n && YARN wb retry -- docker build -t ${e.dockerImageName}\n --build-arg ARCH=$([ $(uname -m) = 'arm64' ] && echo arm64 || echo x86_64)\n --build-arg WB_ENV=${e.env.WB_ENV}\n --build-arg WB_VERSION=${n} .`}stopAndStart(e,t="",n=""){return`${this.stop(e)} && ${this.start(e,t,n)}`}start(e,t="",n=""){!function(e,t){const n=()=>{if(Je.has(e))return;Je.add(e),de(e,t);const{status:n}=p(e,{cwd:t.dirPath,shell:!0,stdio:"inherit"});ue(e,n,{})};for(const e of["beforeExit","SIGINT","SIGTERM","SIGQUIT"])process.on(e,n)}(this.stop(e),e);return`docker run --rm ${n.includes("/bin/bash")?"-it ":""}--publish ${e.env.PORT}:8080 --name ${e.dockerImageName} ${t} ${e.dockerImageName} ${n}`}stop(e){return`true $(docker rm -f $(docker container ls -q -f name=${e.dockerImageName}) 2> /dev/null)`}stopAll(){return"true $(docker rm -f $(docker ps -q) 2> /dev/null)"}},Me={...w,"working-dir":{description:"A working directory",type:"string",alias:"w"},"dry-run":{description:"Whether to skip actual command execution",type:"boolean",alias:["dry","d"]}};function ze(e){const t=[];for(const n of Object.keys(w)){const r=Ye(e,n);if(void 0!==r)if("boolean"!=typeof r)if("string"!=typeof r&&"number"!=typeof r){if(Array.isArray(r))for(const e of r)t.push(`--${n}=${e}`)}else t.push(`--${n}=${r}`);else t.push(r?`--${n}`:`--${n}=false`)}return t}function Ye(e,t){const n=t.replaceAll(/-([a-z])/g,(e,t)=>t.toUpperCase()),r=e;return r[t]??r[n]}const qe="file:",Ve=[{schemaPath:t.join("prisma","schema.prisma"),dbPath:"prisma"},{schemaPath:t.join("prisma","schema"),dbPath:t.join("prisma","schema")},{schemaPath:t.join("db","schema.prisma"),dbPath:"db"}];function Ge(e){return e.packageJson.dependencies?.blitz?"db/mount":"prisma/mount"}function Ke(n){return Ve.find(({schemaPath:r})=>e.existsSync(t.resolve(n.dirPath,r)))?.dbPath}const He=new class{cleanUpLitestream(e){const t=Ge(e);var n;return`${`if [ -f "${n=`${t}/prod.sqlite3`}" ]; then printf 'PRAGMA wal_checkpoint(TRUNCATE);' | PRISMA db execute --stdin --url "${qe}${n}"; fi && rm -f "${n}".* "${n}"-*`}; rm -Rf ${t}/.prod.sqlite3* || true`}deploy(e,t=""){return`PRISMA migrate deploy ${t}`}deployForce(e){const t=Ge(e),n=`rm -Rf "${`${t}/prod.sqlite3`}"*`;return`${n}; PRISMA migrate reset --force --skip-seed && ${n}\n && litestream restore -config litestream.yml -o ${t}/prod.sqlite3 ${t}/prod.sqlite3 && ls -ahl ${t}/prod.sqlite3 && ALLOW_TO_SKIP_SEED=0 PRISMA migrate deploy`}listBackups(e){return`litestream ltx -config litestream.yml ${Ge(e)}/prod.sqlite3`}migrate(e,t=""){return`PRISMA migrate deploy ${t} && PRISMA generate && ${this.seed(e)}`}migrateDev(e,t=""){return`PRISMA migrate dev ${t}`}reset(e,n=""){const r=[],o=function(e){const n=e.env.DATABASE_URL;if(!n?.startsWith(qe))return;const r=n.slice(5).replace(/[?#].*$/,"");if(!r)return;const o=Ke(e),s=t.isAbsolute(r)?r:t.resolve(e.dirPath,o??".",r);return`rm -f "${s}" "${s}-wal" "${s}-shm"`}(e);o&&r.push(o);const s=["PRISMA migrate reset --force",n].filter(Boolean).join(" ");return r.push(s),e.packageJson.dependencies?.blitz&&r.push(this.seed(e)),r.filter(Boolean).join(" && ")}restore(e,t){return`rm -Rf ${t}*; litestream restore -config litestream.yml -o ${t} ${Ge(e)}/prod.sqlite3`}seed(e,t){return e.packageJson.dependencies?.blitz?"YARN blitz db seed"+(t?` -f ${t}`:""):t?`BUN build-ts run ${t}`:e.packageJson.prisma?.seed?"YARN prisma db seed":'if [ -e "prisma/seeds.ts" ]; then BUN build-ts run prisma/seeds.ts; fi'}studio(e,n,r=""){let o="";if(n)try{new URL(n),o=`DATABASE_URL=${n} `}catch{const e=t.resolve(n);o=`DATABASE_URL=${qe}${e} `}else if(e.env.DATABASE_URL?.startsWith(qe)){const n=Ke(e);if(n){const r=t.resolve(e.dirPath,n,e.env.DATABASE_URL.slice(5));o=`DATABASE_URL=${qe}${r} `}}return`${o}PRISMA studio ${r}`}};class Qe{constructor(e){this.shouldWaitAndOpenApp=e}buildDocker(e,t){return We.buildImage(e,t)}async startDev(e,t){return await Be(e.env.PORT,e),this.shouldWaitAndOpenApp?he(["YARN","wb","concurrently",...ze(t),"--kill-others-on-fail",this.startDevProtected(e,t),this.waitAndOpenApp(e)]):this.startDevProtected(e,t)}async startProduction(e,t){return await Be(e.env.PORT,e),this.shouldWaitAndOpenApp?he(["YARN","wb","concurrently",...ze(t),"--kill-others-on-fail",this.startProductionProtected(e,t),this.waitAndOpenApp(e)]):this.startProductionProtected(e,t)}async startTest(e,t){return await Be(e.env.PORT,e),this.startProductionProtected(e,t)}async startDocker(e,t){return await Be(e.env.PORT,e),this.shouldWaitAndOpenApp?`${this.buildDocker(e,"development")}\n && ${he(["YARN","wb","concurrently",...ze(t),"--kill-others-on-fail",We.stopAndStart(e,t.normalizedDockerOptionsText??"",t.normalizedArgsText??""),this.waitAndOpenApp(e)])}`:`${this.buildDocker(e,"development")}\n && ${We.stopAndStart(e,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}`}startProductionProtected(e,t){const n=function(e){try{return e.findFile("ecosystem.config.cjs")}catch{return}}(e),r=void 0===n?[("YARN wb buildIfNeeded "+(t.verbose?"--verbose":"")).trim(),`node dist/index.js ${t.normalizedArgsText??""}`.trim()]:[e.buildCommand,`pm2-runtime start --no-autorestart ${n}`];return[...e.hasPrisma?He.migrate(e).split("&&"):[],...r].filter(Boolean).map(e=>`${e} ${Le(t)}`.trim()).join(" && ")}testE2EDev(e,t,n){return this.testE2EProtected(e,t,this.startDevProtected(e,t),n)}testE2EProduction(e,t,n){return this.testE2EProtected(e,t,this.startProductionProtected(e,t),n)}testE2EDocker(e,t,n){return this.testE2EProtected(e,t,We.stopAndStart(e),n)}async testStart(e,t){return await Be(e.env.PORT,e),`${n="NODE_ENV",r="",`${n}=${me(r)}`} ${he(["YARN","wb","concurrently",...ze(t),"--kill-others","--success","first",this.startDevProtected(e,t),this.waitApp(e)])}`;var n,r}async testE2EProtected(e,t,n,{forwardedPlaywrightArgs:r=[],playwrightArgs:o=["test","test/e2e/"]}){const s=await Be(e.env.PORT,e),i=e.packageJson.scripts?.["test/e2e-additional"]?" && YARN test/e2e-additional":"",a=function(e,t,n,r=[]){const o=["BUN","playwright"],s=t?.map(String);if("test"!==e[0]||!s?.length)return Xe([...o,...e,...r],n);const i=e.slice(1),a=Ze(i),c=0===a.length?i:i.filter((e,t)=>!a.includes(t));return Xe([...o,"test",...s,...c,...r],n)}(o,t.targets,t.bail,r);return e.skipLaunchingServerForPlaywright?`${a}${i}`:he(["YARN","wb","concurrently",...ze(t),"--kill-others","--success","first",`${n} && exit 1`,`wait-on -t 600000 -i 2000 http-get://127.0.0.1:${s}\n && ${a}${i}`])}testUnit(e,t){const n=t.targets?.map(String);return e.hasVitest?he(["YARN","vitest","run",...n?.length?n:["test/unit/"],"--color","--passWithNoTests","--allowOnly","--watch=false",...t.bail?["--bail=1"]:[]]):e.isBunAvailable?he(["bun","test",...n?.length?n:["test/unit/"],...t.bail?["--bail"]:[]]):'echo "No tests."'}waitApp(e){const t=e.env.PORT;return`wait-on -t 10000 http-get://127.0.0.1:${t} 2> /dev/null\n || wait-on -t 10000 -i 500 http-get://127.0.0.1:${t} 2> /dev/null\n || wait-on -t 10000 -i 1000 http-get://127.0.0.1:${t} 2> /dev/null\n || wait-on -t 10000 -i 2000 http-get://127.0.0.1:${t} 2> /dev/null\n || wait-on -t 20000 -i 4000 http-get://127.0.0.1:${t} 2> /dev/null\n || wait-on -t 60000 -i 5000 http-get://127.0.0.1:${t} 2> /dev/null\n || wait-on -t 90000 -i 10000 http-get://127.0.0.1:${t}`}waitAndOpenApp(e){const t=e.env.PORT;return`${this.waitApp(e)} || wait-on http-get://127.0.0.1:${t} && open-cli http://\${HOST:-localhost}:${t}`}}function Xe(e,t){const n=e.indexOf("playwright"),r=-1!==n&&"test"===e[n+1];return t&&r?e.some(e=>"--max-failures"===e||e.startsWith("--max-failures="))?he(e):he([...e,"--max-failures=1"]):he(e)}function Ze(e){let t;const n=[];for(const[r,o]of e.entries()){if(t){if("required"===t||!o.startsWith("-")){t=void 0;continue}t=void 0}if("--"===o)return[...n,...e.slice(r+1).map((e,t)=>r+1+t)];if(o.startsWith("--")){if(o.includes("="))continue;et.has(o)?t="required":tt.has(o)&&(t="optional")}else{if(o.startsWith("-")&&"-"!==o){const e=o.slice(0,2);2===o.length&&nt.has(e)&&(t="required");continue}n.push(r)}}return n}const et=new Set(["--browser","--config","--grep","--grep-invert","--global-timeout","--max-failures","--output","--project","--repeat-each","--reporter","--retries","--shard","--test-list","--test-list-invert","--timeout","--trace","--tsconfig","--ui-host","--ui-port","--ui-title","--workers"]),tt=new Set(["--only-changed","--update-snapshots","--update-source-method"]),nt=new Set(["-c","-g","-j"]);const rt=new class extends Qe{constructor(){super(!0)}startDevProtected(e,t){return`blitz dev ${t.normalizedArgsText??""}`}};const ot=new class extends Qe{constructor(){super(!1)}startDevProtected(e,t){return`YARN build-ts run ${t.watch?"--watch":""} src/index.ts -- ${t.normalizedArgsText??""}`}async testE2EProtected(e,t,n,r={}){if(e.hasPlaywrightConfig)return super.testE2EProtected(e,t,n,r);const o=await Be(e.env.PORT,e),s=e.packageJson.scripts?.["test/e2e-additional"]?" && YARN test/e2e-additional":"",i=t.targets?.map(String);return he(["YARN","wb","concurrently",...ze(t),"--kill-others","--success","first",`${n} && exit 1`,`wait-on -t 600000 -i 2000 http-get://127.0.0.1:${o}\n && ${he(["vitest","run",...i&&i.length>0?i:["test/e2e/"],"--color","--passWithNoTests","--allowOnly",...t.bail?["--bail=1"]:[]])}${s}`])}};const st=new class extends Qe{constructor(){super(!0)}startDevProtected(e,t){return`next dev --turbopack ${t.normalizedArgsText??""}`}};const it=new class extends Qe{constructor(){super(!1)}startDevProtected(e,t){throw new Error("This method should not be called.")}startDev(e,t){return Promise.resolve(`YARN build-ts run ${t.watch?"--watch":""} src/index.ts -- ${t.normalizedArgsText??""}`)}startProduction(e,t){return Promise.resolve(`${e.buildCommand} && ${re} dist/index.js ${t.normalizedArgsText??""} | tee server.log`)}startTest(){return Promise.resolve("echo 'do nothing.'")}startDocker(e,t){return Promise.resolve(`${this.buildDocker(e,"development")} && ${We.stopAndStart(e,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}`)}testE2EDev(){return Promise.resolve("echo 'do nothing.'")}testE2EProduction(){return Promise.resolve("echo 'do nothing.'")}testE2EDocker(){return Promise.resolve("echo 'do nothing.'")}testStart(){return Promise.resolve("echo 'do nothing.'")}};const at=new class extends Qe{constructor(){super(!0)}startDevProtected(e,t){return`remix dev ${t.normalizedArgsText??""}`}};const ct=new class extends Qe{constructor(){super(!0)}startDevProtected(e,t){return`YARN vite dev ${t.normalizedArgsText??""}`.trim()}startProductionProtected(e,t){return`${e.buildCommand} && YARN vite preview ${t.normalizedArgsText??""}`.trim()}},lt=["express","fastify","elysia","hono"],dt={e2e:{description:"E2e test mode: headless (default) | headless-dev | headed | headed-dev | docker | docker-debug | debug | generate | trace",type:"string",choices:["headless","headless-dev","headed","headed-dev","docker","docker-debug","debug","generate","trace"],default:"headless"},silent:{description:"Reduce redundant outputs",type:"boolean"},bail:{description:"Stop tests after the first failure",type:"boolean"},"unit-timeout":{description:"Timeout for unit tests",type:"number"}},ut={targets:{description:"Test target paths",type:"array"}},pt={command:"test [targets...]",describe:"Test project. If you pass no arguments, it will run all tests. Use '--' to stop wb option parsing and forward the remaining flags to Playwright. Example: wb test -- --grep 'uploaded image asset'",builder:e=>e.parserConfiguration({"populate--":!0}).options({...dt,...ut}),async handler(e){await ft(e)}};async function ft(n){const r=await X(n);r||(console.error(o.red("No project found.")),process.exit(1)),process.env.FORCE_COLOR||="3",process.env.WB_ENV||="test";const s=n.targets??[],i=n["--"]??[],{shouldRunE2e:a,shouldRunUnit:c}=function(e,t=[]){const n=e.some(e=>e.includes("/e2e")),r=e.some(e=>e.includes("/unit")),o=0===e.length&&0===t.length;return{shouldRunUnit:o||r,shouldRunE2e:o||n||t.length>0}}(s,i);for(const o of r.descendants){const r=o.packageJson.dependencies??{},l=o.packageJson.devDependencies??{};let d;if(d=r.blitz?rt:r.next?st:l["@remix-run/dev"]?at:l.vite?ct:lt.some(e=>r[e])&&!r["firebase-functions"]?ot:it,console.info(`Running "test" for ${o.name} ...`),c&&e.existsSync(t.join(o.dirPath,"test","unit"))){const e=s.filter(e=>e.includes("/unit")),t={...n,targets:e.length>0?e:void 0};await ae(d.testUnit(o,t),o,n,{timeout:n.unitTimeout})}if(!a||!e.existsSync(t.join(o.dirPath,"test","e2e")))continue;const u=s.filter(e=>e.includes("/e2e")),p={...n,targets:u.length>0?u:void 0};switch(n.e2e){case"headless":await ae(await d.testE2EProduction(o,p,{playwrightArgs:mt(u,i),forwardedPlaywrightArgs:i}),o,n);continue;case"headless-dev":await ae(await d.testE2EDev(o,p,{playwrightArgs:mt(u,i),forwardedPlaywrightArgs:i}),o,n);continue;case"docker":await ht(o,p,d,mt(u,i),i);continue;case"docker-debug":await ht(o,p,d,mt(u,i,["--debug"]),i);continue}if(r.blitz||r.next||l["@remix-run/dev"]||l.vite)switch(n.e2e){case"headed":await ae(await d.testE2EProduction(o,p,{playwrightArgs:mt(u,i,["--headed"]),forwardedPlaywrightArgs:i}),o,n);break;case"headed-dev":await ae(await d.testE2EDev(o,p,{playwrightArgs:mt(u,i,["--headed"]),forwardedPlaywrightArgs:i}),o,n);break;case"debug":await ae(await d.testE2EProduction(o,p,{playwrightArgs:mt(u,i,["--debug"]),forwardedPlaywrightArgs:i}),o,n);break;case"generate":await ae(await d.testE2EProduction(o,p,{playwrightArgs:["codegen",`http://localhost:${o.env.PORT}`]}),o,n);break;case"trace":await ae("BUN playwright show-trace",o,n)}}}async function ht(e,t,n,r,o){e.env.WB_DOCKER||="1",await ae(`${n.buildDocker(e,"test")}${Le(t)}`,e,t),process.exitCode=await ae(await n.testE2EDocker(e,t,{playwrightArgs:r,forwardedPlaywrightArgs:o}),e,t,{exitIfFailed:!1}),await ae(We.stop(e),e,t)}function mt(e,t=[],n=[]){const r=Ze(t).length>0;return["test",...e.length>0||r?[]:["test/e2e/"],...n]}const gt={command:"typecheck",describe:"Run type checking. .env files are ignored.",builder:{},async handler(e){process.exit(await yt(e))}};async function yt(n){const r=await X(n,!1);if(!r)return console.error(o.red("No project found.")),1;let s=!1;const i=r.descendants.map(async i=>{const a=[];for(i.packageJson.workspaces?i.hasSourceCode&&(i.packageJson.dependencies?.typescript||i.packageJson.devDependencies?.typescript)&&a.push("BUN tsc --noEmit"):((i.packageJson.dependencies?.typescript||i.packageJson.devDependencies?.typescript)&&a.push("BUN tsc --noEmit"),i.packageJson.devDependencies?.pyright&&a.push("YARN pyright"));a.length>0;){const c=await ce(a.join(" && "),i,n,{ci:r.descendants.length>1,exitIfFailed:!1,forceColor:!0}),l=t.join(i.dirPath,".next");if(!c||!e.existsSync(l))return c;e.rmSync(l,{force:!0,recursive:!0}),console.info(o.yellow("Removed `.next` directory. We will re-try type checking.")),s=!0}}),a=await Promise.all(i);let c=0;for(const[e,t]of a.entries())if(t){(r.descendants[e]?.packageJson.dependencies??{}).blitz&&console.info(o.yellow('Please try "yarn gen-code" if you face unknown type errors.')),c=t}return c||console.info(o.green(s?"-----\nNo type errors found. Please ignore the previous type errors, as they were caused by outdated Next.js cache files.":"No type errors found.")),c}const bt={...gt,command:"tc"},wt={},vt={command:["check","check-for-ai"],describe:"Run project checks",builder:wt,async handler(e){const t=Z(e,!1);t||(console.error(o.red("No project found.")),process.exit(1)),await Et(t.self,e)}},kt={command:["check-all","check-all-for-ai"],describe:"Run project checks and tests",builder:wt,async handler(e){const t=Z(e,!1);t||(console.error(o.red("No project found.")),process.exit(1)),await Et(t.self,e),await async function(e,t){if(e.packageJson.scripts?.test?.includes("wb test"))return console.info("\n"+o.cyan(o.bold("Start:"),"test")),await ft({...t,_:["test"],e2e:"headless"}),void console.info(o.green(o.bold("Finished:"),"test"));await Pt("test",`${oe} test`,e,t)}(t.self,e)}};async function Et(e,t){await Pt("install",`${oe} install`,e,t,{silent:!0}),e.packageJson.scripts?.["gen-code"]&&await Pt("gen-code",`${oe} gen-code`,e,t,{silent:!0}),await At("format",()=>xe({...t,_:["lint"],format:!0}),{allowFailure:!0}),await At("typecheck",()=>yt(t)),await At("lint-fix",()=>xe({...t,_:["lint"],fix:!0,quiet:!0}))}async function At(e,t,n={}){console.info("\n"+o.cyan(o.bold("Start:"),e));const r=await t()??0;return 0===r||n.allowFailure?console.info(o.green(o.bold("Finished:"),e)):(console.info(o.red(o.bold(`Failed (exit code ${r}):`),e)),process.exit(r)),r}async function Pt(e,t,n,r,s={}){if(console.info("\n"+o.cyan(o.bold("Start:"),e)+o.gray(` at ${n.dirPath}`)),r.verbose&&console.info(o.gray(o.bold("Start (raw):"),t)),r.dryRun)return console.info(o.green(o.bold("Finished:"),e)),0;const i=await R(t,void 0,{cwd:n.dirPath,env:pe(n.env,{forceColor:!0}),shell:!0,stdio:s.silent?["ignore","ignore","inherit"]:"inherit",killOnExit:!0,verbose:r.verbose});return 0===i.status||s.allowFailure?console.info(o.green(o.bold("Finished:"),e)):(console.info(o.red(o.bold(`Failed (exit code ${i.status}):`),e)),process.exit(i.status??1)),i.status??1}const St={command:"buildIfNeeded",describe:"Build code if changes are detected",builder:{command:{description:"A build command (default: yarn|bun build)",type:"string",alias:"c"}},async handler(n){await async function(n,r){const s=Q(n,!0,r);if(!s)return console.error(o.red("No project found.")),!0;if(n={...n,command:n.command??(ne?"bun run build":"yarn build")},!e.existsSync(t.join(s.rootDirPath,".git")))return xt(s,n),!0;const[i,a,c]=await async function(n,r){const o=t.resolve(n.dirPath,"node_modules",".cache","build"),s=t.resolve(o,"last-build");await e.promises.mkdir(o,{recursive:!0});const i=g("sha256"),a=l.execSync("git rev-parse HEAD",{cwd:n.dirPath}).toString().trim();i.update(a);const c=JSON.stringify(Object.entries(n.env).filter(([e])=>!$t.has(e)).toSorted(([e],[t])=>e.localeCompare(t)));i.update(c),await async function(e,t,n){return new Promise(r=>{const o=l.spawnSync("git",["status","--porcelain"],{cwd:e.dirPath,env:e.env,stdio:"pipe",encoding:"utf8"}).stdout.trim().split("\n").filter(e=>e.length>0).map(e=>e.slice(2).trim()).map(t=>"test"===e.env.WB_ENV?t.replace(/packages\/wb\/test\/fixtures\/[^/]+\//,""):t).filter(e=>(Rt.some(t=>e.includes(t))||jt.some(t=>e.endsWith(t)))&&!Nt.some(t=>e.includes(t)));t.verbose&&console.info(`Changed files: ${o.join(", ")}`);const s=l.spawn("git",["diff","--",...o],{cwd:e.rootDirPath});s.stdout.on("data",e=>{n.update(e),t.verbose&&(console.info("Data:",e),console.info("Hash:",n.copy().digest("hex")))}),s.on("close",()=>{r()})})}(n,r,i);const d=i.digest("hex"),u=await async function(e){try{return await e()}catch(e){if("object"==typeof e&&e&&"code"in e&&"ENOENT"===e.code)return;throw e}}(()=>e.promises.readFile(s,"utf8"));return[u===d,s,d]}(s,n);if(i)return console.info(o.green(`Skip to run '${n.command}' 💫`)),!1;if(!xt(s,n))return;n.dryRun||await e.promises.writeFile(a,c,"utf8");return!0}(n)}};function xt(e,t){if(console.info(o.green(`Run '${t.command}'`)),!t.dryRun){const n=l.spawnSync(t.command??"",{cwd:e.dirPath,env:e.env,shell:!0,stdio:"inherit"});if(0!==n.status)return process.exitCode=n.status??1,!1}return!0}const $t=new Set(["CI","PWDEBUG","TMPDIR"]);const Rt=["src/","public/"],jt=[".js",".cjs",".mjs",".jsx",".ts",".cts",".mts",".tsx",".json",".browserslistrc","package.json","yarn.lock"],Nt=["test/","tests/","__tests__/","test-fixtures/","test/fixtures/"];const Dt={command:"concurrently <commands...>",describe:"Run commands concurrently",builder:{...Me,"kill-others":{description:"Kill other commands when one command exits",type:"boolean"},"kill-others-on-fail":{description:"Kill other commands when one command fails",type:"boolean"},success:{description:"Define successful completion criteria",type:"string",choices:["all","first"],default:"all"},commands:{description:"Commands to run concurrently",type:"array"}},async handler(e){"win32"===process.platform&&(console.error(o.red("This command is not supported on Windows.")),process.exit(1));const t=Q(e);t||(console.error(o.red("No project found.")),process.exit(1));const n=(e.commands??[]).map(String).filter(Boolean);0===n.length&&(console.error(o.red("No commands provided.")),process.exit(1));try{const r=await async function(e){const t=e.commands.map(t=>l.spawn(le(t,e.project).runnable,{cwd:e.project.dirPath,detached:!0,env:pe(e.project.env,{ci:e.ci,forceColor:e.forceColor}),shell:!0,stdio:"inherit"}));let n,r,o,s=!1;const i=Array.from({length:t.length}),a=t.map((n,a)=>new Promise(c=>{let l=!1;const d=n=>{l||(l=!0,i[a]=n,r??=n,!s&&function(e,t){return"first"===t.success||t.killOthers||t.killOthersOnFail&&0!==e}(n,e)&&(o=n,s=!0,Ot(t)),c())};n.once("error",e=>{console.error("Failed to start child process:",e),d(1)}),n.once("exit",(e,t)=>{d(Tt(e??void 0,t??void 0))})})),c=e=>{n??=e,s||(s=!0,Ot(t))},d=()=>{c("SIGINT")},u=()=>{c("SIGTERM")},p=()=>{c("SIGQUIT")};process.on("SIGINT",d),process.on("SIGTERM",u),process.on("SIGQUIT",p);try{await Promise.all(a)}finally{process.removeListener("SIGINT",d),process.removeListener("SIGTERM",u),process.removeListener("SIGQUIT",p)}if(n)return Tt(void 0,n);if("first"===e.success)return r??1;if(void 0!==o)return o;for(const e of i)if(void 0!==e&&0!==e)return e;return 0}({commands:n,project:t,killOthers:e.killOthers??!1,killOthersOnFail:e.killOthersOnFail??!1,success:e.success,ci:"boolean"==typeof e.ci?e.ci:void 0,forceColor:"boolean"==typeof e.forceColor?e.forceColor:void 0});process.exit(r)}catch(e){console.error(o.red(e instanceof Error?e.message:String(e))),process.exit(1)}}};function Tt(e,t){return void 0!==e?e:t&&t in b.signals?128+b.signals[t]:1}function Ot(e){for(const t of e)if(t.pid)try{It(t.pid),A(t.pid)}catch(e){console.warn("Failed to kill child process:",e)}}function It(e){try{process.kill(-e,"SIGTERM")}catch(e){if(function(e){return"object"==typeof e&&null!==e&&"code"in e&&"ESRCH"===e.code}(e))return;throw e}}const _t={command:"kill-port-if-non-ci",describe:"Kill the port specified by PORT environment variable if non-CI.",builder:{},async handler(e){await async function(e){const t=Q(e);t||(console.error(o.red("No project found.")),process.exit(1));if(G(t.env.CI))return void console.info(`Skip killing port due to CI: ${t.env.CI}`);const n=t.env.PORT,r=Number(n);(!Number.isInteger(r)||r<=0)&&(console.error(o.red(`PORT environment variable is invalid: ${n}`)),process.exit(1));console.info(`Killing the port: ${r}`);try{await h(r)}catch{}}(e)}};function*Ct(e,t){for(const n of t)console.info(`Running "${e}" for ${n.name} ...`),yield n}const Lt={command:"optimizeForDockerBuild",describe:"Optimize configuration when building a Docker image",builder:{outside:{description:"Whether the optimization is executed outside a docker container or not",type:"boolean",alias:"o"}},async handler(n){const r=await X(n);r||(console.error(o.red("No project found.")),process.exit(1));for(const o of Ct("optimizeForDockerBuild",r.descendants)){const r=o.packageJson,s=["dependencies","devDependencies"];for(const e of s){const t=r[e]??{};for(const[e,n]of Object.entries(t))n?.startsWith("git@github.com:")&&(t[e]=`./${e}`)}if(Bt(n,r),Ft(r),Jt(r),n.dryRun)continue;const i=n.outside?t.join(o.dirPath,"dist"):o.dirPath;await e.promises.mkdir(i,{recursive:!0}),await e.promises.writeFile(t.join(i,"package.json"),JSON.stringify(r),"utf8")}n.dryRun||n.outside||(l.spawnSync(oe,["install"],{stdio:"inherit"}),console.info("Installed dependencies."))}};function Bt(e,t){if(!e.outside)return delete t.devDependencies,void console.info("Removed all devDependencies.");const n=t.devDependencies??{},r=["artillery","biome","concurrently","conventional-changelog-conventionalcommits","eslint","husky","imagemin","jest","kill-port","lint-staged","open-cli","playwright","prettier","pinst","railway","semantic-release","sort-package-json","wait-on","vitest"],o=[];for(const e of Object.keys(n))(r.some(t=>e.includes(t))||e.includes("willbooster")&&e.includes("config"))&&(delete n[e],o.push(e));console.info("Removed devDependencies:",o.join(", ")||"none")}function Ft(e){const t=["check","deploy","format","lint","start","test"],n=["pinst ","husky "],r=e.scripts??{},o=[];for(const[e,s]of Object.entries(r))(t.some(t=>e.startsWith(t))||n.some(e=>s.includes(e)||s.trim()===e.trim()))&&(delete r[e],o.push(e));console.info("Removed scripts:",o.join(", ")||"none")}function Jt(e){delete e.private,delete e.publishConfig,delete e.prettier}const Ut={},Wt={command:"prisma",describe:"Run prisma commands. Use '--' to stop wb option parsing and forward the remaining arguments to Prisma. Example: wb prisma migrate-dev -- --name init",builder:e=>e.parserConfiguration({"populate--":!0}).command(Mt).command(zt).command(Yt).command(qt).command(Vt).command(Gt).command(Kt).command(Ht).command(Qt).command(Xt).command(Zt).command(en).demandCommand().strict(!1),handler(){}},Mt={command:"cleanup-litestream",describe:"Clean up temporal Litestream files",builder:Ut,async handler(e){const t=await nn(e);for(const n of Ct("prisma cleanup-litestream",t))await ae(He.cleanUpLitestream(n),n,e)}},zt={command:"create-litestream-config",describe:"Create Litestream configuration file",builder:Ut,async handler(e){const t=await nn(e);for(const e of Ct("prisma create-litestream-config",t))tn(e)}},Yt={command:"deploy",describe:"Apply migration to DB without initializing it",builder:Ut,async handler(e){const t=await nn(e),n=rn(e);for(const r of Ct("prisma deploy",t))await ae(He.deploy(r,n),r,e)}},qt={command:"deploy-force",describe:"Force to apply migration to DB utilizing Litestream's backup without initializing it",builder:Ut,async handler(e){const t=await nn(e);for(const n of Ct("prisma deploy-force",t))await ae(He.deployForce(n),n,e)}},Vt={command:"list-backups",describe:"List Litestream backups",builder:Ut,async handler(e){const t=await nn(e);for(const n of Ct("prisma list-backups",t))await ae(He.listBackups(n),n,e)}},Gt={command:"migrate",describe:"Apply migration to DB with initializing it",builder:Ut,async handler(e){const t=await nn(e),n=rn(e);for(const r of Ct("prisma migrate",t))await ae(He.migrate(r,n),r,e)}},Kt={command:"migrate-dev",describe:"Create a migration file",builder:Ut,async handler(e){const t=await nn(e),n=rn(e);for(const r of Ct("prisma migrate-dev",t))await ae(He.migrateDev(r,n),r,e)}},Ht={command:"reset",describe:"Reset DB",builder:Ut,async handler(e){const t=await nn(e),n=rn(e);for(const r of Ct("prisma reset",t))await ae(He.reset(r,n),r,e);if("test"!==process.env.WB_ENV){process.env.WB_ENV="test";for(const t of Ct("WB_ENV=test prisma reset",await nn(e)))await ae(He.reset(t,n),t,e)}}},Qt={command:"restore",describe:"Restore DB from Litestream's backup",builder:{...Ut,output:{description:'Output path of the restored database. Defaults to "<db|prisma>/restored.sqlite3".',type:"string"}},async handler(e){const t=await nn(e);for(const n of Ct("prisma restore",t)){const t=e.output??(n.packageJson.dependencies?.blitz?"db/restored.sqlite3":"prisma/restored.sqlite3");await ae(He.restore(n,t),n,e)}}},Xt={command:"seed",describe:"Populate DB with seed data",builder:{...Ut,file:{alias:"f",description:"Path of the seed script.",type:"string"}},async handler(e){const t=await nn(e);for(const n of Ct("prisma seed",t))await ae(He.seed(n,e.file),n,e)}},Zt={command:"studio [db-url-or-path]",describe:"Open Prisma Studio",builder:{...Ut,"db-url-or-path":{description:"URL or path to the database",type:"string"},restored:{description:"Whether to open the default restored database (<db|prisma>/restored.sqlite3).",type:"boolean"}},async handler(e){if(e.restored&&e.dbUrlOrPath)throw new Error("You cannot specify both --restored and --db-url-or-path.");const t=await nn(e),n=rn(e,["db-url-or-path","restored"]);for(const r of Ct("prisma studio",t)){const t=e.restored?r.packageJson.dependencies?.blitz?"db/restored.sqlite3":"prisma/restored.sqlite3":e.dbUrlOrPath?.toString();await ae(He.studio(r,t,n),r,e)}}},en={command:"$0 <args..>",describe:"Pass the command and arguments to prisma as is. Additional Prisma flags can also be forwarded after '--'.",builder:{args:{type:"array"}},async handler(e){const t=await nn(e),n=[(e.args?.join(" ")??"").trimEnd(),rn(e,["args"])].filter(Boolean).join(" ");for(const r of Ct(`prisma ${n}`,t))await ae(`PRISMA ${n}`,r,e)}};function tn(t){const n=`${t.packageJson.dependencies?.blitz?"db":"prisma"}/mount/prod.sqlite3`,r={CLOUDFLARE_R2_LITESTREAM_ACCOUNT_ID:t.env.CLOUDFLARE_R2_LITESTREAM_ACCOUNT_ID,CLOUDFLARE_R2_LITESTREAM_BUCKET_NAME:t.env.CLOUDFLARE_R2_LITESTREAM_BUCKET_NAME,CLOUDFLARE_R2_LITESTREAM_ACCESS_KEY_ID:t.env.CLOUDFLARE_R2_LITESTREAM_ACCESS_KEY_ID,CLOUDFLARE_R2_LITESTREAM_SECRET_ACCESS_KEY:t.env.CLOUDFLARE_R2_LITESTREAM_SECRET_ACCESS_KEY},o=Object.entries(r).filter(([,e])=>!e).map(([e])=>e);if(o.length>0)throw new Error(`Missing environment variables for Litestream: ${o.join(", ")}`);const s="staging"===t.env.WB_ENV?"5m":"1h",i=`dbs:\n - path: ${n}\n busy-timeout: 5s\n checkpoint-interval: 1m\n replica:\n type: s3\n endpoint: https://${r.CLOUDFLARE_R2_LITESTREAM_ACCOUNT_ID}.r2.cloudflarestorage.com\n bucket: ${r.CLOUDFLARE_R2_LITESTREAM_BUCKET_NAME}\n access-key-id: ${r.CLOUDFLARE_R2_LITESTREAM_ACCESS_KEY_ID}\n secret-access-key: ${r.CLOUDFLARE_R2_LITESTREAM_SECRET_ACCESS_KEY}\n snapshot-interval: 24h # Create a backup per day\n retention: 72h # Keep backups for 3 days\n retention-check-interval: ${s}\n sync-interval: 1m\n`,a="/etc/litestream.yml";try{e.writeFileSync(a,i),console.info(`Generated ${a}`)}catch(e){const t=e instanceof Error?e.message:String(e);throw new Error(`Failed to write ${a}: ${t}`,{cause:e})}}async function nn(e){const t=await X(e);t||(console.error(o.red("No project found.")),process.exit(1));const n=t.descendants.filter(e=>e.packageJson.dependencies?.prisma??e.packageJson.devDependencies?.prisma);return 0===n.length&&(console.error(o.red("No prisma project found.")),process.exit(1)),n}function rn(e,t=[]){const n=[],r=Object.keys(Me),o=Object.values(Me).flatMap(e=>"alias"in e?Array.isArray(e.alias)?e.alias:[e.alias]:[]).map(String),s=new Set([...t,...r,...o,"--","_","$0"]);for(const[t,r]of Object.entries(e))if(!s.has(t)){const o=t.replaceAll(/[A-Z]/g,e=>`-${e.toLowerCase()}`);if(o!==t&&void 0!==e[o])continue;if("boolean"==typeof r&&r)n.push(`--${t}`);else if("string"==typeof r||"number"==typeof r)n.push(`--${t}`,String(r));else if(Array.isArray(r))for(const e of r)n.push(`--${t}`,String(e))}const i=Array.isArray(e["--"])?e["--"].map(String):[];return he([...n,...i])}const on={command:"retry [command] [args...]",describe:"Retry the given command until it succeeds",builder:{retry:{description:"A maximum retry count",type:"number",alias:"r",default:3}},async handler(e){const t=Q(e);t||(console.error(o.red("No project found.")),process.exit(1));const n=[e.command,...e.args??[],...e._.slice(1)].filter(Boolean);let r=0;for(let s=0;s<e.retry;s++)if(s>0&&console.info(`\n${o.yellow(`#${s} Retrying: ${n.join(" ")}`)}`),r=await ae(n.join(" "),t,e,{exitIfFailed:!1,onSignal:e=>{e&&process.exit(1)}}),0===r)return;process.exit(r)}},sn={command:"setup",describe:"Setup development environment. .env files are ignored.",builder:{},async handler(e){await async function(e,t){const n=await X(e,!1,t);n||(console.error(o.red("No project found.")),process.exit(1));for(const t of Ct("setup",n.descendants)){const r=await f.readdir(t.dirPath,{withFileTypes:!0});if(t===n.root){if("darwin"===y.platform()){const n=["pstree"];await ce(`brew install ${n.join(" ")}`,t,e)}r.some(e=>e.isFile()&&e.name.includes("-version"))&&await ae("asdf install",t,e,{exitIfFailed:!1})}if(r.some(e=>e.isFile()&&"pyproject.toml"===e.name)){await ce("poetry config virtualenvs.in-project true",t,e);const[,n]=l.execSync("asdf current python").toString().trim().split(/\s+/);await ce(`poetry env use ${n}`,t,e),await te.promiseAll(),await ae("poetry run pip install --upgrade pip",t,e),await ae("poetry install --ansi",t,e)}t!==n.root&&n.root.packageJson.scripts?.["gen-code"]||!t.packageJson.scripts?.["gen-code"]||await ae(`${se} gen-code`,t,e)}const r=n.descendants.find(e=>e.packageJson.devDependencies?.playwright);r&&await ae(`${se} playwright install --with-deps`,r,e)}(e)}};const an={watch:{description:"Whether to watch files",type:"boolean"},args:{description:"Arguments for core command",type:"array",alias:"a",default:[]},"docker-options":{description:'Arguments for "docker run"',type:"array",default:[]},mode:{description:"Start mode: dev[elopment] (default) | staging | docker | docker-debug | test",type:"string",alias:"m"}},cn={command:"start [args..]",describe:"Start app. Use '--' to stop wb option parsing and forward the remaining arguments to the underlying app command. Example: wb start -- --host 0.0.0.0",builder:e=>e.parserConfiguration({"populate--":!0}).options(an),async handler(e){!function(e){e.normalizedArgsText=[...e.args??[],...e._?.slice(1)??[],...e["--"]??[]].map(e=>me(String(e))).join(" "),e.normalizedDockerOptionsText=(e.dockerOptions??[]).map(e=>me(String(e))).join(" ")}(e);const t=await X(e);t||(console.error(o.red("No project found.")),process.exit(1));for(const n of t.descendants){const t=n.packageJson.dependencies??{},r=n.packageJson.devDependencies??{};let o;if(t.blitz)o=rt;else if(t.next)o=st;else if(r["@remix-run/dev"])o=at;else if(r.vite)o=ct;else if(lt.some(e=>t[e])&&!t["firebase-functions"]||n.hasDockerfile&&/EXPOSE\s+8080/.test(n.dockerfile))o=ot;else{if(!t["build-ts"]&&!r["build-ts"])continue;o=it}switch(console.info(`Running "start" for ${n.name} ...`),e.mode??"dev"){case"dev":case"development":process.env.WB_ENV||="development",await ae(await o.startDev(n,e),n,e);break;case"staging":process.env.WB_ENV||="staging",await ae(await o.startProduction(n,e),n,e);break;case"docker":process.env.WB_ENV||="staging",await ae(await o.startDocker(n,e),n,e);break;case"docker-debug":process.env.WB_ENV||="staging",e.normalizedArgsText="'/bin/bash'",await ae(await o.startDocker(n,e),n,e);break;case"test":{process.env.WB_ENV||="test";const t=await o.startTest(n,e);await ae(t,n,e);break}default:throw new Error(`Unknown start mode: ${e.mode}`)}}}},ln={command:"test-on-ci",describe:"Test project on CI with no options.",builder:{silent:{description:"Reduce redundant outputs",type:"boolean"}},async handler(n){await async function(n){const r=await X(n);r||(console.error(o.red("No project found.")),process.exit(1));process.env.CI||="1",process.env.FORCE_COLOR||="3",process.env.WB_ENV||="test";for(const o of r.descendants){const r=o.packageJson.dependencies??{},s=o.packageJson.devDependencies??{};let i;if(i=r.blitz?rt:r.next?st:s["@remix-run/dev"]?at:s.vite?ct:lt.some(e=>r[e])&&!r["firebase-functions"]?ot:it,console.info(`Running "test-on-ci" for ${o.name} ...`),await ce(We.stopAll(),o,n),e.existsSync(t.join(o.dirPath,"test","unit"))&&await ce(i.testUnit(o,n).replaceAll(" --allowOnly",""),o,n),e.existsSync(t.join(o.dirPath,"test","e2e"))){await ce(await i.testStart(o,n),o,n),await te.promiseAll(),o.hasDockerfile&&(o.env.WB_DOCKER||="1",await ae(`${i.buildDocker(o,"test")}${Le(n)}`,o,n));const e=o.hasDockerfile?await i.testE2EDocker(o,n,{}):await i.testE2EProduction(o,n,{});process.exitCode=await ae(e.replaceAll(" --allowOnly",""),o,n,{exitIfFailed:!1}),await ae(We.stop(o),o,n)}}}(n)}};const dn={command:"tree-kill <pid> [signal]",describe:"Kill the given process and all descendants",builder:e=>e.positional("pid",{description:"The process ID to kill.",type:"number",demandOption:!0}).option("signal",{description:"Signal to send to the process tree.",type:"string",default:"SIGTERM"}),handler(e){try{const t=e.signal;if(!(t in b.signals))throw new Error(`Invalid signal: ${t}`);A(e.pid,t)}catch(e){console.error(e instanceof Error?e.message:String(e)),process.exit(1)}}};await n(r(process.argv)).scriptName("wb").options(Me).middleware(e=>{const n=e["working-dir"];if(n){const e=t.resolve(n);process.chdir(e)}!function(e){e.PATH&&e.BERRY_BIN_FOLDER&&(e.PATH=e.PATH.replace(`${e.BERRY_BIN_FOLDER}:`,"").replaceAll(/\/private\/var\/folders\/[^:]+:/g,"").replaceAll(/\/var\/tmp\/[^:]+:/g,"").replaceAll(/\/tmp\/[^:]+:/g,""));for(const t of Object.keys(e)){const n=t.toUpperCase();(n.startsWith("NPM_")||n.startsWith("YARN_")||n.startsWith("BERRY_")||"PROJECT_CWD"===n||"INIT_CWD"===n)&&delete e[t]}}(process.env)}).command(kt).command(vt).command(St).command(Dt).command(_t).command(Se).command(Lt).command(Wt).command(on).command(sn).command(cn).command(pt).command(ln).command(dn).command(gt).command(bt).demandCommand().strict().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}()).help().argv;let un=!1;for(const e of["SIGINT","SIGTERM","SIGQUIT"])process.on(e,()=>{if(!un){un=!0;try{A(process.pid)}catch(e){console.warn(`Failed to treeKill(${process.pid}) during shutdown:`,e)}process.exit()}});
10
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvZW52LnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9lcnJuby50cyIsIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvdHJlZUtpbGwudHMiLCIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL3Byb2Nlc3NUcmVlLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9zcGF3bi50cyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvaGFzaC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3Qvb3Nvbi9jb25zdHJ1Y3RvcnMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvYXQtZGVjb3JhdG9ycy9kaXN0L29zb24vc3RyaW5naWZ5LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2F0LWRlY29yYXRvcnMvZGlzdC9nZXRDYWNoZUtleS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvbWVtb2l6ZU9uZS5qcyIsIi4uL3NyYy91dGlscy9jaS50cyIsIi4uL3NyYy9wcm9qZWN0LnRzIiwiLi4vc3JjL3V0aWxzL3Byb21pc2VQb29sLnRzIiwiLi4vc3JjL3V0aWxzL3J1bnRpbWUudHMiLCIuLi9zcmMvc2NyaXB0cy9ydW4udHMiLCIuLi9zcmMvdXRpbHMvc2hlbGwudHMiLCIuLi9zcmMvY29tbWFuZHMvbGludC50cyIsIi4uL3NyYy9zY3JpcHRzL2J1aWxkZXIudHMiLCIuLi9zcmMvdXRpbHMvcG9ydC50cyIsIi4uL3NyYy91dGlscy9wcm9jZXNzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZG9ja2VyU2NyaXB0cy50cyIsIi4uL3NyYy9zaGFyZWRPcHRpb25zQnVpbGRlci50cyIsIi4uL3NyYy9zY3JpcHRzL3ByaXNtYVNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vYmxpdHpTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL2h0dHBTZXJ2ZXJTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL25leHRTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL3BsYWluQXBwU2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9yZW1peFNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vdml0ZVNjcmlwdHMudHMiLCIuLi9zcmMvY29tbWFuZHMvaHR0cFNlcnZlclBhY2thZ2VzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3Rlc3QudHMiLCIuLi9zcmMvY29tbWFuZHMvdHlwZWNoZWNrLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2FpQ2hlY2sudHMiLCIuLi9zcmMvY29tbWFuZHMvYnVpbGRJZk5lZWRlZC50cyIsIi4uLy4uL3NoYXJlZC1saWIvc3JjL2Vycm9yLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2NvbmN1cnJlbnRseS50cyIsIi4uL3NyYy9jb21tYW5kcy9raWxsUG9ydElmTm9uQ2kudHMiLCIuLi9zcmMvY29tbWFuZHMvY29tbWFuZFV0aWxzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL29wdGltaXplRm9yRG9ja2VyQnVpbGQudHMiLCIuLi9zcmMvY29tbWFuZHMvcHJpc21hLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3JldHJ5LnRzIiwiLi4vc3JjL2NvbW1hbmRzL3NldHVwLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3N0YXJ0LnRzIiwiLi4vc3JjL2NvbW1hbmRzL3Rlc3RPbkNpLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3RyZWVLaWxsLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGNvbmZpZyB9IGZyb20gJ2RvdGVudic7XG5pbXBvcnQgeyBleHBhbmQgfSBmcm9tICdkb3RlbnYtZXhwYW5kJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5leHBvcnQgY29uc3QgeWFyZ3NPcHRpb25zQnVpbGRlckZvckVudiA9IHtcbiAgZW52OiB7XG4gICAgZGVzY3JpcHRpb246ICcuZW52IGZpbGVzIHRvIGJlIGxvYWRlZC4nLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG4gICdjYXNjYWRlLWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdFbnZpcm9ubWVudCB0byBsb2FkIGNhc2NhZGluZyAuZW52IGZpbGVzIChlLmcuLCBgLmVudmAsIGAuZW52LjxlbnZpcm9ubWVudD5gLCBgLmVudi5sb2NhbGAgYW5kIGAuZW52LjxlbnZpcm9ubWVudD4ubG9jYWxgKS4gUHJlZmVycmVkIG92ZXIgYGNhc2NhZGUtbm9kZS1lbnZgIGFuZCBgYXV0by1jYXNjYWRlLWVudmAuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbiAgJ2Nhc2NhZGUtbm9kZS1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246ICdTYW1lIHdpdGggLS1jYXNjYWRlLWVudj08Tk9ERV9FTlYgfHwgXCJkZXZlbG9wbWVudFwiPi4gUHJlZmVycmVkIG92ZXIgYGF1dG8tY2FzY2FkZS1lbnZgLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICAnYXV0by1jYXNjYWRlLWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1NhbWUgd2l0aCAtLWNhc2NhZGUtZW52PTxXQl9FTlYgfHwgTk9ERV9FTlYgfHwgXCJkZXZlbG9wbWVudFwiPi4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICB9LFxuICAnaW5jbHVkZS1yb290LWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0luY2x1ZGUgLmVudiBmaWxlcyBpbiByb290IGRpcmVjdG9yeSBpZiB0aGUgcHJvamVjdCBpcyBpbiBhIG1vbm9yZXBvIGFuZCAtLWVudiBvcHRpb24gaXMgbm90IHVzZWQuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgfSxcbiAgJ2NoZWNrLWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0NoZWNrIHdoZXRoZXIgdGhlIGtleXMgb2YgdGhlIGxvYWRlZCAuZW52IGZpbGVzIGFyZSBzYW1lIHdpdGggdGhlIGdpdmVuIC5lbnYgZmlsZS4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGRlZmF1bHQ6ICcuZW52LmV4YW1wbGUnLFxuICB9LFxuICB2ZXJib3NlOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHNob3cgdmVyYm9zZSBpbmZvcm1hdGlvbicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGFsaWFzOiAndicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBFbnZSZWFkZXJPcHRpb25zID0gUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgeWFyZ3NPcHRpb25zQnVpbGRlckZvckVudj4+PjtcblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHJlYWRzIGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tIGAuZW52YCBmaWxlcy5cbiAqIE5vdGUgaXQgZG9lcyBub3QgYXNzaWduIHRoZW0gaW4gYHByb2Nlc3MuZW52YC5cbiAqIEByZXR1cm4gW2VudlZhcnMsIFtlbnZQYXRocywgZW52VmFyTmFtZXNdW11dXG4gKiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgY3dkOiBzdHJpbmdcbik6IFtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LCBbc3RyaW5nLCBzdHJpbmdbXV1bXV0ge1xuICBsZXQgZW52UGF0aHMgPSAoYXJndi5lbnYgPz8gW10pLm1hcCgoZW52UGF0aCkgPT4gcGF0aC5yZXNvbHZlKGN3ZCwgZW52UGF0aC50b1N0cmluZygpKSk7XG4gIGNvbnN0IGNhc2NhZGUgPVxuICAgIGFyZ3YuY2FzY2FkZUVudiA/P1xuICAgIChhcmd2LmNhc2NhZGVOb2RlRW52XG4gICAgICA/IHByb2Nlc3MuZW52Lk5PREVfRU5WIHx8ICdkZXZlbG9wbWVudCdcbiAgICAgIDogYXJndi5hdXRvQ2FzY2FkZUVudlxuICAgICAgICA/IHByb2Nlc3MuZW52LldCX0VOViB8fCBwcm9jZXNzLmVudi5OT0RFX0VOViB8fCAnZGV2ZWxvcG1lbnQnXG4gICAgICAgIDogdW5kZWZpbmVkKTtcbiAgaWYgKHR5cGVvZiBjYXNjYWRlID09PSAnc3RyaW5nJykge1xuICAgIGlmIChlbnZQYXRocy5sZW5ndGggPT09IDApIHtcbiAgICAgIGVudlBhdGhzLnB1c2gocGF0aC5qb2luKGN3ZCwgJy5lbnYnKSk7XG4gICAgICBpZiAoYXJndi5pbmNsdWRlUm9vdEVudikge1xuICAgICAgICBjb25zdCByb290UGF0aCA9IHBhdGgucmVzb2x2ZShjd2QsICcuLicsICcuLicpO1xuICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocm9vdFBhdGgsICdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICAgICAgICBlbnZQYXRocy5wdXNoKHBhdGguam9pbihyb290UGF0aCwgJy5lbnYnKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZW52UGF0aHMgPSBlbnZQYXRocy5mbGF0TWFwKChlbnZQYXRoKSA9PlxuICAgICAgY2FzY2FkZVxuICAgICAgICA/IFtgJHtlbnZQYXRofS4ke2Nhc2NhZGV9LmxvY2FsYCwgYCR7ZW52UGF0aH0ubG9jYWxgLCBgJHtlbnZQYXRofS4ke2Nhc2NhZGV9YCwgZW52UGF0aF1cbiAgICAgICAgOiBbYCR7ZW52UGF0aH0ubG9jYWxgLCBlbnZQYXRoXVxuICAgICk7XG4gIH1cbiAgZW52UGF0aHMgPSBlbnZQYXRocy5maWx0ZXIoKGVudlBhdGgpID0+IGZzLmV4aXN0c1N5bmMoZW52UGF0aCkpLm1hcCgoZW52UGF0aCkgPT4gcGF0aC5yZWxhdGl2ZShjd2QsIGVudlBhdGgpKTtcbiAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgIGNvbnNvbGUuaW5mbyhgV0JfRU5WOiAke3Byb2Nlc3MuZW52LldCX0VOVn0sIE5PREVfRU5WOiAke3Byb2Nlc3MuZW52Lk5PREVfRU5WfWApO1xuICAgIGNvbnNvbGUuaW5mbygnUmVhZGluZyBlbnYgZmlsZXM6JywgZW52UGF0aHMuam9pbignLCAnKSk7XG4gIH1cblxuICBjb25zdCBlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZXM6IFtzdHJpbmcsIHN0cmluZ1tdXVtdID0gW107XG4gIGNvbnN0IGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgZm9yIChjb25zdCBlbnZQYXRoIG9mIGVudlBhdGhzKSB7XG4gICAgY29uc3Qga2V5czogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhyZWFkRW52RmlsZShwYXRoLmpvaW4oY3dkLCBlbnZQYXRoKSkpKSB7XG4gICAgICBpZiAoIShrZXkgaW4gZW52VmFycykgJiYgIShrZXkgaW4gcHJvY2Vzcy5lbnYpKSB7XG4gICAgICAgIGVudlZhcnNba2V5XSA9IHZhbHVlO1xuICAgICAgICBrZXlzLnB1c2goa2V5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgZW52UGF0aEFuZExvYWRlZEVudlZhck5hbWVzLnB1c2goW2VudlBhdGgsIGtleXNdKTtcbiAgICBpZiAoYXJndi52ZXJib3NlICYmIGtleXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc29sZS5pbmZvKGBSZWFkICR7a2V5cy5sZW5ndGh9IGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tICR7ZW52UGF0aH1gKTtcbiAgICB9XG4gIH1cbiAgaWYgKCFhcmd2LnZlcmJvc2UpIHtcbiAgICBjb25zb2xlLmluZm8oXG4gICAgICBgUmVhZCBlbnYgZmlsZXM6ICR7ZW52UGF0aEFuZExvYWRlZEVudlZhck5hbWVzLm1hcCgoW2VudlBhdGgsIGtleXNdKSA9PiAoa2V5cy5sZW5ndGggPiAwID8gYCR7ZW52UGF0aH0gKCR7a2V5cy5qb2luKCcsICcpfSlgIDogZW52UGF0aCkpLmpvaW4oJywgJykgfHwgJ25vdGhpbmcnfWBcbiAgICApO1xuICB9XG5cbiAgaWYgKGFyZ3YuY2hlY2tFbnYpIHtcbiAgICBjb25zdCBleGFtcGxlS2V5cyA9IE9iamVjdC5rZXlzKHJlYWRFbnZGaWxlKHBhdGguam9pbihjd2QsIGFyZ3YuY2hlY2tFbnYpKSk7XG4gICAgY29uc3QgbWlzc2luZ0tleXMgPSBleGFtcGxlS2V5cy5maWx0ZXIoKGtleSkgPT4gIShrZXkgaW4gZW52VmFycykgJiYgIShrZXkgaW4gcHJvY2Vzcy5lbnYpKTtcbiAgICBpZiAobWlzc2luZ0tleXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBbJHtlbnZQYXRocy5qb2luKCcsICcpfV06IFske21pc3NpbmdLZXlzLmpvaW4oJywgJyl9XWApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gW2V4cGFuZCh7IHBhcnNlZDogZW52VmFycywgcHJvY2Vzc0Vudjoge30gfSkucGFyc2VkID8/IGVudlZhcnMsIGVudlBhdGhBbmRMb2FkZWRFbnZWYXJOYW1lc107XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiByZWFkIGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tIGAuZW52YCBmaWxlcyBhbmQgYXNzaWduIHRoZW0gaW4gYHByb2Nlc3MuZW52YC5cbiAqICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZEFuZEFwcGx5RW52aXJvbm1lbnRWYXJpYWJsZXMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIGN3ZDogc3RyaW5nXG4pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgW2VudlZhcnNdID0gcmVhZEVudmlyb25tZW50VmFyaWFibGVzKGFyZ3YsIGN3ZCk7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGVudlZhcnMpKSB7XG4gICAgaWYgKCEoa2V5IGluIHByb2Nlc3MuZW52KSkge1xuICAgICAgcHJvY2Vzcy5lbnZba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZW52VmFycztcbn1cblxuY29uc3QgY2FjaGVkRW52VmFycyA9IG5ldyBNYXA8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PigpO1xuXG5mdW5jdGlvbiByZWFkRW52RmlsZShmaWxlUGF0aDogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IGNhY2hlZCA9IGNhY2hlZEVudlZhcnMuZ2V0KGZpbGVQYXRoKTtcbiAgaWYgKGNhY2hlZCkgcmV0dXJuIGNhY2hlZDtcblxuICBjb25zdCBwYXJzZWQgPSBjb25maWcoeyBwYXRoOiBwYXRoLnJlc29sdmUoZmlsZVBhdGgpLCBwcm9jZXNzRW52OiB7fSB9KS5wYXJzZWQgPz8ge307XG4gIGNhY2hlZEVudlZhcnMuc2V0KGZpbGVQYXRoLCBwYXJzZWQpO1xuICByZXR1cm4gcGFyc2VkO1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gcmVtb3ZlcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgcmVsYXRlZCB0byBucG0gYW5kIHlhcm4gZnJvbSB0aGUgZ2l2ZW4gZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMoZW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPik6IHZvaWQge1xuICAvLyBSZW1vdmUgbnBtICYgeWFybiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBwcm9jZXNzLmVudlxuICBpZiAoZW52VmFycy5QQVRIICYmIGVudlZhcnMuQkVSUllfQklOX0ZPTERFUikge1xuICAgIGVudlZhcnMuUEFUSCA9IGVudlZhcnMuUEFUSC5yZXBsYWNlKGAke2VudlZhcnMuQkVSUllfQklOX0ZPTERFUn06YCwgJycpXG4gICAgICAvLyBUZW1wb3JhcnkgZGlyZWN0b3J5IGluIG1hY09TXG4gICAgICAucmVwbGFjZUFsbCgvXFwvcHJpdmF0ZVxcL3ZhclxcL2ZvbGRlcnNcXC9bXjpdKzovZywgJycpXG4gICAgICAvLyBUZW1wb3JhcnkgZGlyZWN0b3JpZXMgaW4gTGludXhcbiAgICAgIC5yZXBsYWNlQWxsKC9cXC92YXJcXC90bXBcXC9bXjpdKzovZywgJycpXG4gICAgICAucmVwbGFjZUFsbCgvXFwvdG1wXFwvW146XSs6L2csICcnKTtcbiAgfVxuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhlbnZWYXJzKSkge1xuICAgIGNvbnN0IHVwcGVyS2V5ID0ga2V5LnRvVXBwZXJDYXNlKCk7XG4gICAgaWYgKFxuICAgICAgdXBwZXJLZXkuc3RhcnRzV2l0aCgnTlBNXycpIHx8XG4gICAgICB1cHBlcktleS5zdGFydHNXaXRoKCdZQVJOXycpIHx8XG4gICAgICB1cHBlcktleS5zdGFydHNXaXRoKCdCRVJSWV8nKSB8fFxuICAgICAgdXBwZXJLZXkgPT09ICdQUk9KRUNUX0NXRCcgfHxcbiAgICAgIHVwcGVyS2V5ID09PSAnSU5JVF9DV0QnXG4gICAgKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gICAgICBkZWxldGUgZW52VmFyc1trZXldO1xuICAgIH1cbiAgfVxufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGlzRXJybm9FeGNlcHRpb24oZXJyb3I6IHVua25vd24pOiBlcnJvciBpcyBOb2RlSlMuRXJybm9FeGNlcHRpb24ge1xuICByZXR1cm4gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiAnY29kZScgaW4gZXJyb3I7XG59XG4iLCJpbXBvcnQgeyBleGVjRmlsZVN5bmMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5pbXBvcnQgeyBpc0Vycm5vRXhjZXB0aW9uIH0gZnJvbSAnLi9lcnJuby5qcyc7XG5pbXBvcnQgeyBidWlsZENoaWxkcmVuQnlQYXJlbnRNYXAsIGNvbGxlY3REZXNjZW5kYW50UGlkcyBhcyBjb2xsZWN0RGVzY2VuZGFudFBpZHNGcm9tTWFwIH0gZnJvbSAnLi9wcm9jZXNzVHJlZS5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiB0cmVlS2lsbChwaWQ6IG51bWJlciwgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyA9ICdTSUdURVJNJyk6IHZvaWQge1xuICBpZiAoIU51bWJlci5pc0ludGVnZXIocGlkKSB8fCBwaWQgPD0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwaWQ6ICR7cGlkfWApO1xuICB9XG5cbiAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICBraWxsVHJlZU9uV2luZG93cyhwaWQpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGRlc2NlbmRhbnRzID0gY29sbGVjdERlc2NlbmRhbnRQaWRzKHBpZCk7XG4gIGNvbnN0IHRhcmdldFBpZHMgPSB0b0NoaWxkcmVuRmlyc3RQaWRzKHBpZCwgZGVzY2VuZGFudHMpO1xuICBmb3IgKGNvbnN0IHRhcmdldFBpZCBvZiB0YXJnZXRQaWRzKSB7XG4gICAga2lsbElmTmVlZGVkKHRhcmdldFBpZCwgc2lnbmFsKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBraWxsSWZOZWVkZWQocGlkOiBudW1iZXIsIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMpOiB2b2lkIHtcbiAgdHJ5IHtcbiAgICBwcm9jZXNzLmtpbGwocGlkLCBzaWduYWwpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChpc05vU3VjaFByb2Nlc3NFcnJvcihlcnJvcikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZnVuY3Rpb24ga2lsbFRyZWVPbldpbmRvd3MocGlkOiBudW1iZXIpOiB2b2lkIHtcbiAgdHJ5IHtcbiAgICBydW5Db21tYW5kKCd0YXNra2lsbCcsIFsnL1BJRCcsIFN0cmluZyhwaWQpLCAnL1QnLCAnL0YnXSwge1xuICAgICAgbWF4QnVmZmVyOiAxMDI0ICogMTAyNCxcbiAgICAgIHRpbWVvdXQ6IDIwMDAsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGlzTm9TdWNoUHJvY2Vzc0Vycm9yKGVycm9yKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb2xsZWN0RGVzY2VuZGFudFBpZHMocm9vdFBpZDogbnVtYmVyKTogbnVtYmVyW10ge1xuICBjb25zdCB7IHN0ZG91dCB9ID0gcnVuQ29tbWFuZChcbiAgICAncHMnLFxuICAgIFsnLUFvJywgJ3BpZD0scHBpZD0nXSxcbiAgICAvLyBLZWVwIGNvbW1hbmQgYm91bmRlZCBzbyB3YXRjaC1tb2RlIGtpbGwgbG9vcHMgY2Fubm90IGhhbmcgdGhpcyBwYXRoLlxuICAgIHsgbWF4QnVmZmVyOiAxMDI0ICogMTAyNCwgdGltZW91dDogMjAwMCB9XG4gICk7XG4gIGNvbnN0IGNoaWxkcmVuQnlQYXJlbnQgPSBidWlsZENoaWxkcmVuQnlQYXJlbnRNYXAoc3Rkb3V0KTtcbiAgcmV0dXJuIGNvbGxlY3REZXNjZW5kYW50UGlkc0Zyb21NYXAocm9vdFBpZCwgY2hpbGRyZW5CeVBhcmVudCk7XG59XG5cbmZ1bmN0aW9uIHRvQ2hpbGRyZW5GaXJzdFBpZHMocGlkOiBudW1iZXIsIGRlc2NlbmRhbnRzOiByZWFkb25seSBudW1iZXJbXSk6IG51bWJlcltdIHtcbiAgY29uc3QgdGFyZ2V0UGlkcyA9IGRlc2NlbmRhbnRzLnRvUmV2ZXJzZWQoKTtcbiAgdGFyZ2V0UGlkcy5wdXNoKHBpZCk7XG4gIHJldHVybiB0YXJnZXRQaWRzO1xufVxuXG5mdW5jdGlvbiBydW5Db21tYW5kKFxuICBjb21tYW5kOiBzdHJpbmcsXG4gIGFyZ3M6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBvcHRpb25zPzogeyB0aW1lb3V0OiBudW1iZXI7IG1heEJ1ZmZlcjogbnVtYmVyIH1cbik6IHsgc3Rkb3V0OiBzdHJpbmc7IHN0ZGVycjogc3RyaW5nIH0ge1xuICB0cnkge1xuICAgIGNvbnN0IHN0ZG91dCA9IGV4ZWNGaWxlU3luYyhjb21tYW5kLCBbLi4uYXJnc10sIHtcbiAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgICBtYXhCdWZmZXI6IG9wdGlvbnM/Lm1heEJ1ZmZlcixcbiAgICAgIHRpbWVvdXQ6IG9wdGlvbnM/LnRpbWVvdXQsXG4gICAgICBzdGRpbzogWydpZ25vcmUnLCAncGlwZScsICdwaXBlJ10sXG4gICAgfSk7XG4gICAgcmV0dXJuIHsgc3Rkb3V0LCBzdGRlcnI6ICcnIH07XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3Qgc3RkZXJyID0gZXh0cmFjdFN0ZGVycihlcnJvcik7XG4gICAgdGhyb3cgbmV3IENvbW1hbmRFeGVjdXRpb25FcnJvcihjb21tYW5kLCBhcmdzLCBzdGRlcnIsIHRvRXhpdENvZGUoZXJyb3IpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc05vU3VjaFByb2Nlc3NFcnJvcihlcnJvcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAoaXNFcnJub0V4Y2VwdGlvbihlcnJvcikgJiYgZXJyb3IuY29kZSA9PT0gJ0VTUkNIJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGVycm9yIGluc3RhbmNlb2YgQ29tbWFuZEV4ZWN1dGlvbkVycm9yKSB7XG4gICAgcmV0dXJuIC9ubyBzdWNoIHByb2Nlc3N8bm90IGZvdW5kfG5vdCByZWNvZ25pemVkfHRoZXJlIGlzIG5vIHJ1bm5pbmcgaW5zdGFuY2UvaS50ZXN0KGVycm9yLnN0ZGVycik7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiB0b0V4aXRDb2RlKGVycm9yOiB1bmtub3duKTogbnVtYmVyIHwgc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGlzRXJybm9FeGNlcHRpb24oZXJyb3IpKSB7XG4gICAgcmV0dXJuIGVycm9yLmNvZGU7XG4gIH1cbiAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgIT09IG51bGwgJiYgJ3N0YXR1cycgaW4gZXJyb3IpIHtcbiAgICBjb25zdCBzdGF0dXMgPSAoZXJyb3IgYXMgeyBzdGF0dXM6IHVua25vd24gfSkuc3RhdHVzO1xuICAgIGlmICh0eXBlb2Ygc3RhdHVzID09PSAnbnVtYmVyJykge1xuICAgICAgcmV0dXJuIHN0YXR1cztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdFN0ZGVycihlcnJvcjogdW5rbm93bik6IHN0cmluZyB7XG4gIGlmICh0eXBlb2YgZXJyb3IgIT09ICdvYmplY3QnIHx8IGVycm9yID09PSBudWxsIHx8ICEoJ3N0ZGVycicgaW4gZXJyb3IpKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgY29uc3Qgc3RkZXJyID0gKGVycm9yIGFzIFJlY29yZDwnc3RkZXJyJywgdW5rbm93bj4pLnN0ZGVycjtcbiAgaWYgKHR5cGVvZiBzdGRlcnIgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHN0ZGVycjtcbiAgfVxuICBpZiAoQnVmZmVyLmlzQnVmZmVyKHN0ZGVycikpIHtcbiAgICByZXR1cm4gc3RkZXJyLnRvU3RyaW5nKCd1dGY4Jyk7XG4gIH1cbiAgcmV0dXJuICcnO1xufVxuXG5jbGFzcyBDb21tYW5kRXhlY3V0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHJlYWRvbmx5IHN0ZGVycjogc3RyaW5nO1xuICByZWFkb25seSBjb2RlOiBudW1iZXIgfCBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoY29tbWFuZDogc3RyaW5nLCBhcmdzOiByZWFkb25seSBzdHJpbmdbXSwgc3RkZXJyOiBzdHJpbmcsIGNvZGU6IG51bWJlciB8IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIHN1cGVyKGBDb21tYW5kIGZhaWxlZDogJHtjb21tYW5kfSAke2FyZ3Muam9pbignICcpfWApO1xuICAgIHRoaXMubmFtZSA9ICdDb21tYW5kRXhlY3V0aW9uRXJyb3InO1xuICAgIHRoaXMuc3RkZXJyID0gc3RkZXJyO1xuICAgIHRoaXMuY29kZSA9IGNvZGU7XG4gIH1cbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBidWlsZENoaWxkcmVuQnlQYXJlbnRNYXAocHNPdXRwdXQ6IHN0cmluZyk6IE1hcDxudW1iZXIsIG51bWJlcltdPiB7XG4gIGNvbnN0IGNoaWxkcmVuQnlQYXJlbnQgPSBuZXcgTWFwPG51bWJlciwgbnVtYmVyW10+KCk7XG4gIGZvciAoY29uc3QgbGluZSBvZiBwc091dHB1dC5zcGxpdCgnXFxuJykpIHtcbiAgICBjb25zdCBtYXRjaGVkID0gL15cXHMqKFxcZCspXFxzKyhcXGQrKVxccyokLy5leGVjKGxpbmUpO1xuICAgIGlmICghbWF0Y2hlZCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgY2hpbGRQaWQgPSBOdW1iZXIobWF0Y2hlZFsxXSk7XG4gICAgY29uc3QgcGFyZW50UGlkID0gTnVtYmVyKG1hdGNoZWRbMl0pO1xuICAgIGNvbnN0IGNoaWxkcmVuID0gY2hpbGRyZW5CeVBhcmVudC5nZXQocGFyZW50UGlkKTtcbiAgICBpZiAoY2hpbGRyZW4pIHtcbiAgICAgIGNoaWxkcmVuLnB1c2goY2hpbGRQaWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjaGlsZHJlbkJ5UGFyZW50LnNldChwYXJlbnRQaWQsIFtjaGlsZFBpZF0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY2hpbGRyZW5CeVBhcmVudDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbGxlY3REZXNjZW5kYW50UGlkcyhyb290UGlkOiBudW1iZXIsIGNoaWxkcmVuQnlQYXJlbnQ6IE1hcDxudW1iZXIsIG51bWJlcltdPik6IG51bWJlcltdIHtcbiAgY29uc3QgZGVzY2VuZGFudHM6IG51bWJlcltdID0gW107XG4gIGNvbnN0IHF1ZXVlID0gWy4uLihjaGlsZHJlbkJ5UGFyZW50LmdldChyb290UGlkKSA/PyBbXSldO1xuICBsZXQgaW5kZXggPSAwO1xuICB3aGlsZSAoaW5kZXggPCBxdWV1ZS5sZW5ndGgpIHtcbiAgICBjb25zdCBwaWQgPSBxdWV1ZVtpbmRleF0gYXMgbnVtYmVyO1xuICAgIGluZGV4ICs9IDE7XG4gICAgZGVzY2VuZGFudHMucHVzaChwaWQpO1xuICAgIHF1ZXVlLnB1c2goLi4uKGNoaWxkcmVuQnlQYXJlbnQuZ2V0KHBpZCkgPz8gW10pKTtcbiAgfVxuICByZXR1cm4gZGVzY2VuZGFudHM7XG59XG4iLCJpbXBvcnQgdHlwZSB7XG4gIFNwYXduT3B0aW9ucyxcbiAgU3Bhd25PcHRpb25zV2l0aG91dFN0ZGlvLFxuICBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZSxcbiAgU3Bhd25TeW5jUmV0dXJucyxcbiAgU3RkaW9OdWxsLFxuICBTdGRpb1BpcGUsXG59IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgeyBzcGF3biB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmltcG9ydCB7IHRyZWVLaWxsIH0gZnJvbSAnLi90cmVlS2lsbC5qcyc7XG5cbi8qKlxuICogUmV0dXJuIHR5cGUgZm9yIHNwYXduQXN5bmMgZnVuY3Rpb24sIGJhc2VkIG9uIFNwYXduU3luY1JldHVybnMgYnV0IHdpdGhvdXQgb3V0cHV0IGFuZCBlcnJvciBwcm9wZXJ0aWVzXG4gKi9cbmV4cG9ydCB0eXBlIFNwYXduQXN5bmNSZXR1cm5zID0gT21pdDxTcGF3blN5bmNSZXR1cm5zPHN0cmluZz4sICdvdXRwdXQnIHwgJ2Vycm9yJz47XG5cbi8qKlxuICogT3B0aW9ucyBmb3Igc3Bhd25Bc3luYyBmdW5jdGlvbiwgZXh0ZW5kaW5nIHZhcmlvdXMgTm9kZS5qcyBzcGF3biBvcHRpb25zIHdpdGggYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5XG4gKi9cbmV4cG9ydCB0eXBlIFNwYXduQXN5bmNPcHRpb25zID0gKFxuICB8IFNwYXduT3B0aW9uc1dpdGhvdXRTdGRpb1xuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvUGlwZSwgU3RkaW9QaXBlLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9QaXBlLCBTdGRpb1BpcGUsIFN0ZGlvTnVsbD5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb1BpcGUsIFN0ZGlvTnVsbCwgU3RkaW9QaXBlPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvTnVsbCwgU3RkaW9QaXBlLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9QaXBlLCBTdGRpb051bGwsIFN0ZGlvTnVsbD5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb051bGwsIFN0ZGlvUGlwZSwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvTnVsbCwgU3RkaW9OdWxsLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9OdWxsLCBTdGRpb051bGwsIFN0ZGlvTnVsbD5cbiAgfCBTcGF3bk9wdGlvbnNcbikgJiB7XG4gIC8qKiBJbnB1dCBzdHJpbmcgdG8gd3JpdGUgdG8gdGhlIHNwYXduZWQgcHJvY2VzcydzIHN0ZGluICovXG4gIGlucHV0Pzogc3RyaW5nO1xuICAvKiogSWYgdHJ1ZSwgc3RkZXJyIG91dHB1dCB3aWxsIGJlIG1lcmdlZCBpbnRvIHN0ZG91dCAqL1xuICBtZXJnZU91dEFuZEVycm9yPzogYm9vbGVhbjtcbiAgLyoqIElmIHRydWUsIHRoZSBzcGF3bmVkIHByb2Nlc3Mgd2lsbCBiZSBraWxsZWQgd2hlbiB0aGUgcGFyZW50IHByb2Nlc3MgZXhpdHMgKi9cbiAga2lsbE9uRXhpdD86IGJvb2xlYW47XG4gIC8qKiBJZiB0cnVlLCBlbmFibGVzIHZlcmJvc2UgbG9nZ2luZyBvZiBwcm9jZXNzIG9wZXJhdGlvbnMgKi9cbiAgdmVyYm9zZT86IGJvb2xlYW47XG4gIC8qKiBJZiB0cnVlLCBzdGRvdXQgZGF0YSB3aWxsIGJlIHByaW50ZWQgdG8gY29uc29sZSBhcyBpdCdzIHJlY2VpdmVkICovXG4gIHByaW50aW5nU3Rkb3V0PzogYm9vbGVhbjtcbiAgLyoqIElmIHRydWUsIHN0ZGVyciBkYXRhIHdpbGwgYmUgcHJpbnRlZCB0byBjb25zb2xlIGFzIGl0J3MgcmVjZWl2ZWQgKi9cbiAgcHJpbnRpbmdTdGRlcnI/OiBib29sZWFuO1xufTtcblxuLyoqXG4gKiBTcGF3bnMgYSBjaGlsZCBwcm9jZXNzIGFzeW5jaHJvbm91c2x5IGFuZCByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHByb2Nlc3MgcmVzdWx0c1xuICpcbiAqIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgYSBQcm9taXNlLWJhc2VkIHdyYXBwZXIgYXJvdW5kIE5vZGUuanMncyBzcGF3biBmdW5jdGlvbiB3aXRoIGFkZGl0aW9uYWwgZmVhdHVyZXM6XG4gKiAtIEF1dG9tYXRpYyBlbmNvZGluZyBvZiBzdGRvdXQvc3RkZXJyIGFzIFVURi04XG4gKiAtIE9wdGlvbiB0byBtZXJnZSBzdGRlcnIgaW50byBzdGRvdXRcbiAqIC0gT3B0aW9uIHRvIGF1dG9tYXRpY2FsbHkga2lsbCB0aGUgcHJvY2VzcyBvbiBwYXJlbnQgZXhpdFxuICogLSBPcHRpb24gdG8gcHJvdmlkZSBpbnB1dCB2aWEgc3RkaW5cbiAqIC0gVmVyYm9zZSBsb2dnaW5nIGNhcGFiaWxpdHlcbiAqXG4gKiBAcGFyYW0gY29tbWFuZCAtIFRoZSBjb21tYW5kIHRvIHJ1blxuICogQHBhcmFtIGFyZ3MgLSBMaXN0IG9mIHN0cmluZyBhcmd1bWVudHNcbiAqIEBwYXJhbSBvcHRpb25zIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgc3Bhd25lZCBwcm9jZXNzXG4gKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgcHJvY2VzcyByZXN1bHRzIGluY2x1ZGluZyBwaWQsIHN0ZG91dCwgc3RkZXJyLCBzdGF0dXMsIGFuZCBzaWduYWxcbiAqIEB0aHJvd3MgV2lsbCByZWplY3QgdGhlIHByb21pc2UgaWYgdGhlIHByb2Nlc3MgZmFpbHMgdG8gc3Bhd24gb3IgZW5jb3VudGVycyBhbiBlcnJvclxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBzcGF3bkFzeW5jKCdscycsIFsnLWxhJ10sIHsgdmVyYm9zZTogdHJ1ZSB9KTtcbiAqIGNvbnNvbGUubG9nKHJlc3VsdC5zdGRvdXQpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzcGF3bkFzeW5jKFxuICBjb21tYW5kOiBzdHJpbmcsXG4gIGFyZ3M/OiByZWFkb25seSBzdHJpbmdbXSxcbiAgb3B0aW9ucz86IFNwYXduQXN5bmNPcHRpb25zXG4pOiBQcm9taXNlPFNwYXduQXN5bmNSZXR1cm5zPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHByb2MgPSBzcGF3bihjb21tYW5kLCBhcmdzID8/IFtdLCBvcHRpb25zID8/IHt9KTtcbiAgICAgIC8vIGBzZXRFbmNvZGluZ2AgaXMgdW5kZWZpbmVkIGluIEJ1blxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb25cbiAgICAgIHByb2Muc3Rkb3V0Py5zZXRFbmNvZGluZz8uKCd1dGY4Jyk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvblxuICAgICAgcHJvYy5zdGRlcnI/LnNldEVuY29kaW5nPy4oJ3V0ZjgnKTtcblxuICAgICAgbGV0IHN0ZG91dCA9ICcnO1xuICAgICAgbGV0IHN0ZGVyciA9ICcnO1xuICAgICAgcHJvYy5zdGRvdXQ/Lm9uKCdkYXRhJywgKGRhdGE6IHN0cmluZykgPT4ge1xuICAgICAgICBzdGRvdXQgKz0gZGF0YTtcbiAgICAgICAgaWYgKG9wdGlvbnM/LnByaW50aW5nU3Rkb3V0KSB7XG4gICAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcHJvYy5zdGRlcnI/Lm9uKCdkYXRhJywgKGRhdGE6IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAob3B0aW9ucz8ubWVyZ2VPdXRBbmRFcnJvcikge1xuICAgICAgICAgIHN0ZG91dCArPSBkYXRhO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0ZGVyciArPSBkYXRhO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zPy5wcmludGluZ1N0ZGVycikge1xuICAgICAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKGRhdGEpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgbGV0IHN0b3BwZWQgPSBmYWxzZTtcbiAgICAgIGNvbnN0IHN0b3BQcm9jZXNzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAoc3RvcHBlZCB8fCAhcHJvYy5waWQpIHJldHVybjtcblxuICAgICAgICBzdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKG9wdGlvbnM/LnZlcmJvc2UpIHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oYHRyZWVLaWxsKCR7cHJvYy5waWR9KWApO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdHJlZUtpbGwocHJvYy5waWQpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGlmIChvcHRpb25zPy52ZXJib3NlKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYEZhaWxlZCB0byB0cmVlS2lsbCgke3Byb2MucGlkfSlgLCBlcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgY29uc3QgY2xlYW51cFNpZ25hbHM6IE5vZGVKUy5TaWduYWxzW10gPVxuICAgICAgICBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInID8gWydTSUdJTlQnLCAnU0lHVEVSTSddIDogWydTSUdJTlQnLCAnU0lHVEVSTScsICdTSUdRVUlUJ107XG4gICAgICBjb25zdCBzaWduYWxIYW5kbGVycyA9IG5ldyBNYXA8Tm9kZUpTLlNpZ25hbHMsICgpID0+IHZvaWQ+KCk7XG4gICAgICBjb25zdCByZW1vdmVLaWxsT25FeGl0SGFuZGxlcnMgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ2JlZm9yZUV4aXQnLCBzdG9wUHJvY2Vzcyk7XG4gICAgICAgIGZvciAoY29uc3QgW3NpZ25hbCwgaGFuZGxlcl0gb2Ygc2lnbmFsSGFuZGxlcnMpIHtcbiAgICAgICAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKHNpZ25hbCwgaGFuZGxlcik7XG4gICAgICAgIH1cbiAgICAgICAgc2lnbmFsSGFuZGxlcnMuY2xlYXIoKTtcbiAgICAgIH07XG4gICAgICBpZiAob3B0aW9ucz8ua2lsbE9uRXhpdCkge1xuICAgICAgICBwcm9jZXNzLm9uKCdiZWZvcmVFeGl0Jywgc3RvcFByb2Nlc3MpO1xuICAgICAgICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBjbGVhbnVwU2lnbmFscykge1xuICAgICAgICAgIGNvbnN0IGhhbmRsZVNpZ25hbCA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgICAgIHN0b3BQcm9jZXNzKCk7XG4gICAgICAgICAgICByZW1vdmVLaWxsT25FeGl0SGFuZGxlcnMoKTtcbiAgICAgICAgICAgIGlmIChwcm9jZXNzLmxpc3RlbmVyQ291bnQoc2lnbmFsKSA9PT0gMCkge1xuICAgICAgICAgICAgICBwcm9jZXNzLmtpbGwocHJvY2Vzcy5waWQsIHNpZ25hbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgICBzaWduYWxIYW5kbGVycy5zZXQoc2lnbmFsLCBoYW5kbGVTaWduYWwpO1xuICAgICAgICAgIHByb2Nlc3Mub24oc2lnbmFsLCBoYW5kbGVTaWduYWwpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHByb2Mub24oJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gICAgICAgIHJlbW92ZUtpbGxPbkV4aXRIYW5kbGVycygpO1xuICAgICAgICBwcm9jLnJlbW92ZUFsbExpc3RlbmVycygnY2xvc2UnKTtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH0pO1xuICAgICAgcHJvYy5vbignY2xvc2UnLCAoY29kZTogbnVtYmVyIHwgbnVsbCwgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyB8IG51bGwpID0+IHtcbiAgICAgICAgcmVtb3ZlS2lsbE9uRXhpdEhhbmRsZXJzKCk7XG4gICAgICAgIGlmIChwcm9jLnBpZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignUHJvY2VzcyBoYXMgbm8gcGlkLicpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgIHBpZDogcHJvYy5waWQsXG4gICAgICAgICAgICBzdGRvdXQsXG4gICAgICAgICAgICBzdGRlcnIsXG4gICAgICAgICAgICBzdGF0dXM6IGNvZGUsXG4gICAgICAgICAgICBzaWduYWwsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAob3B0aW9ucz8uaW5wdXQpIHtcbiAgICAgICAgcHJvYy5zdGRpbj8ud3JpdGUob3B0aW9ucy5pbnB1dCk7XG4gICAgICAgIHByb2Muc3RkaW4/LmVuZCgpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1wcm9taXNlLXJlamVjdC1lcnJvcnNcbiAgICAgIHJlamVjdChlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cbiIsIi8qKlxuICogW2pzLXNoYTNde0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9lbW4xNzgvanMtc2hhM31cbiAqXG4gKiBAdmVyc2lvbiAwLjkuM1xuICogQGF1dGhvciBDaGVuLCBZaS1DeXVhbiBbZW1uMTc4QGdtYWlsLmNvbV1cbiAqIEBjb3B5cmlnaHQgQ2hlbiwgWWktQ3l1YW4gMjAxNS0yMDIzXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuY29uc3QgdD1bLi4uXCIwMTIzNDU2Nzg5YWJjZGVmXCJdLHM9WzYsMTUzNiwzOTMyMTYsMTAwNjYzMjk2XSxpPVswLDgsMTYsMjRdLGU9WzEsMCwzMjg5OCwwLDMyOTA2LDIxNDc0ODM2NDgsMjE0NzUxNjQxNiwyMTQ3NDgzNjQ4LDMyOTA3LDAsMjE0NzQ4MzY0OSwwLDIxNDc1MTY1NDUsMjE0NzQ4MzY0OCwzMjc3NywyMTQ3NDgzNjQ4LDEzOCwwLDEzNiwwLDIxNDc1MTY0MjUsMCwyMTQ3NDgzNjU4LDAsMjE0NzUxNjU1NSwwLDEzOSwyMTQ3NDgzNjQ4LDMyOTA1LDIxNDc0ODM2NDgsMzI3NzEsMjE0NzQ4MzY0OCwzMjc3MCwyMTQ3NDgzNjQ4LDEyOCwyMTQ3NDgzNjQ4LDMyNzc4LDAsMjE0NzQ4MzY1OCwyMTQ3NDgzNjQ4LDIxNDc1MTY1NDUsMjE0NzQ4MzY0OCwzMjg5NiwyMTQ3NDgzNjQ4LDIxNDc0ODM2NDksMCwyMTQ3NTE2NDI0LDIxNDc0ODM2NDhdO2Z1bmN0aW9uIG8odCl7cmV0dXJuIG5ldyBoKDUxMixzLDUxMikudXBkYXRlKHQpLmhleCgpfWNvbnN0IG49dD0+e2NvbnN0IHM9W107Zm9yKGNvbnN0W2ksZV1vZiB0LmVudHJpZXMoKSlzW2ldPWU7cmV0dXJuIHN9O2NsYXNzIGh7YmxvY2tzPVtdO3M9W107cmVzZXQ9ITA7ZmluYWxpemVkPSExO2Jsb2NrPTA7c3RhcnQ9MDtsYXN0Qnl0ZUluZGV4PTA7Y29uc3RydWN0b3IodCxzLGkpe3RoaXMucGFkZGluZz1zLHRoaXMub3V0cHV0Qml0cz1pLHRoaXMuYmxvY2tDb3VudD0xNjAwLSh0PDwxKT4+NSx0aGlzLmJ5dGVDb3VudD10aGlzLmJsb2NrQ291bnQ8PDIsdGhpcy5vdXRwdXRCbG9ja3M9aT4+NSx0aGlzLmV4dHJhQnl0ZXM9KDMxJmkpPj4zO2ZvcihsZXQgdD0wO3Q8NTA7Kyt0KXRoaXMuc1t0XT0wfXVwZGF0ZSh0KXtpZih0aGlzLmZpbmFsaXplZCl0aHJvdyBuZXcgRXJyb3IoXCJmaW5hbGl6ZSBhbHJlYWR5IGNhbGxlZFwiKTtjb25zdCBzPXRoaXMuYmxvY2tzLGU9dGhpcy5ieXRlQ291bnQsbz10Lmxlbmd0aCxuPXRoaXMuYmxvY2tDb3VudCxoPXRoaXMucztsZXQgbCxjLGY9MDtmb3IoO2Y8bzspe2lmKHRoaXMucmVzZXQpZm9yKHRoaXMucmVzZXQ9ITEsc1swXT10aGlzLmJsb2NrLGw9MTtsPG4rMTsrK2wpc1tsXT0wO2ZvcihsPXRoaXMuc3RhcnQ7ZjxvJiZsPGU7KytmKWM9dC5jb2RlUG9pbnRBdChmKXx8MCxjPDEyOD9zW2w+PjJdfD1jPDxpWzMmbCsrXTpjPDIwNDg/KHNbbD4+Ml18PSgxOTJ8Yz4+Nik8PGlbMyZsKytdLHNbbD4+Ml18PSgxMjh8NjMmYyk8PGlbMyZsKytdKTpjPDU1Mjk2fHxjPj01NzM0ND8oc1tsPj4yXXw9KDIyNHxjPj4xMik8PGlbMyZsKytdLHNbbD4+Ml18PSgxMjh8Yz4+NiY2Myk8PGlbMyZsKytdLHNbbD4+Ml18PSgxMjh8NjMmYyk8PGlbMyZsKytdKTooYz02NTUzNisoKDEwMjMmYyk8PDEwfDEwMjMmKHQuY29kZVBvaW50QXQoKytmKXx8MCkpLHNbbD4+Ml18PSgyNDB8Yz4+MTgpPDxpWzMmbCsrXSxzW2w+PjJdfD0oMTI4fGM+PjEyJjYzKTw8aVszJmwrK10sc1tsPj4yXXw9KDEyOHxjPj42JjYzKTw8aVszJmwrK10sc1tsPj4yXXw9KDEyOHw2MyZjKTw8aVszJmwrK10pO2lmKHRoaXMubGFzdEJ5dGVJbmRleD1sLGw+PWUpe2Zvcih0aGlzLnN0YXJ0PWwtZSx0aGlzLmJsb2NrPXNbbl0sbD0wO2w8bjsrK2wpaFtsXV49c1tsXTtyKGgpLHRoaXMucmVzZXQ9ITB9ZWxzZSB0aGlzLnN0YXJ0PWx9cmV0dXJuIHRoaXN9ZmluYWxpemUoKXtpZih0aGlzLmZpbmFsaXplZClyZXR1cm47dGhpcy5maW5hbGl6ZWQ9ITA7Y29uc3QgdD10aGlzLmJsb2NrcztsZXQgcz10aGlzLmxhc3RCeXRlSW5kZXg7Y29uc3QgaT10aGlzLmJsb2NrQ291bnQsZT10aGlzLnM7aWYodFtzPj4yXXw9dGhpcy5wYWRkaW5nWzMmc10sdGhpcy5sYXN0Qnl0ZUluZGV4PT09dGhpcy5ieXRlQ291bnQpZm9yKHRbMF09dFtpXSxzPTE7czxpKzE7KytzKXRbc109MDtmb3IodFtpLTFdfD0yMTQ3NDgzNjQ4LHM9MDtzPGk7KytzKWVbc11ePXRbc107cihlKX1oZXgoKXt0aGlzLmZpbmFsaXplKCk7Y29uc3Qgcz10aGlzLmJsb2NrQ291bnQ7bGV0IGk9dGhpcy5zO2NvbnN0IGU9dGhpcy5vdXRwdXRCbG9ja3Msbz10aGlzLmV4dHJhQnl0ZXM7bGV0IGgsbD0wLGM9MCxmPVwiXCI7Zm9yKDtjPGU7KXtmb3IobD0wO2w8cyYmYzxlOysrbCwrK2MpaD1pW2xdLGYrPXRbaD4+NCYxNV0rdFsxNSZoXSt0W2g+PjEyJjE1XSt0W2g+PjgmMTVdK3RbaD4+MjAmMTVdK3RbaD4+MTYmMTVdK3RbaD4+MjgmMTVdK3RbaD4+MjQmMTVdO2Mlcz09PTAmJihpPW4oaSkscihpKSxsPTApfXJldHVybiBvJiYoaD1pW2xdLGYrPXRbaD4+NCYxNV0rdFsxNSZoXSxvPjEmJihmKz10W2g+PjEyJjE1XSt0W2g+PjgmMTVdKSxvPjImJihmKz10W2g+PjIwJjE1XSt0W2g+PjE2JjE1XSkpLGZ9fWNvbnN0IHI9ZnVuY3Rpb24odCl7bGV0IHMsaSxvLG4saCxyLGwsYyxmLGEsdSxkLGIsayx5LHgsQixwLEMseixJLGcsdyxBLFAsRSxqLG0scSx2LEQsRixHLEgsSixLLEwsTSxOLE8sUSxSLFMsVCxVLFYsVyxYLFksWiwkLF8sdHQsc3QsaXQsZXQsb3QsbnQsaHQscnQsbHQsY3QsZnQ7Zm9yKG89MDtvPDQ4O28rPTIpbj10WzBdXnRbMTBdXnRbMjBdXnRbMzBdXnRbNDBdLGg9dFsxXV50WzExXV50WzIxXV50WzMxXV50WzQxXSxyPXRbMl1edFsxMl1edFsyMl1edFszMl1edFs0Ml0sbD10WzNdXnRbMTNdXnRbMjNdXnRbMzNdXnRbNDNdLGM9dFs0XV50WzE0XV50WzI0XV50WzM0XV50WzQ0XSxmPXRbNV1edFsxNV1edFsyNV1edFszNV1edFs0NV0sYT10WzZdXnRbMTZdXnRbMjZdXnRbMzZdXnRbNDZdLHU9dFs3XV50WzE3XV50WzI3XV50WzM3XV50WzQ3XSxkPXRbOF1edFsxOF1edFsyOF1edFszOF1edFs0OF0sYj10WzldXnRbMTldXnRbMjldXnRbMzldXnRbNDldLHM9ZF4ocjw8MXxsPj4+MzEpLGk9Yl4obDw8MXxyPj4+MzEpLHRbMF1ePXMsdFsxXV49aSx0WzEwXV49cyx0WzExXV49aSx0WzIwXV49cyx0WzIxXV49aSx0WzMwXV49cyx0WzMxXV49aSx0WzQwXV49cyx0WzQxXV49aSxzPW5eKGM8PDF8Zj4+PjMxKSxpPWheKGY8PDF8Yz4+PjMxKSx0WzJdXj1zLHRbM11ePWksdFsxMl1ePXMsdFsxM11ePWksdFsyMl1ePXMsdFsyM11ePWksdFszMl1ePXMsdFszM11ePWksdFs0Ml1ePXMsdFs0M11ePWkscz1yXihhPDwxfHU+Pj4zMSksaT1sXih1PDwxfGE+Pj4zMSksdFs0XV49cyx0WzVdXj1pLHRbMTRdXj1zLHRbMTVdXj1pLHRbMjRdXj1zLHRbMjVdXj1pLHRbMzRdXj1zLHRbMzVdXj1pLHRbNDRdXj1zLHRbNDVdXj1pLHM9Y14oZDw8MXxiPj4+MzEpLGk9Zl4oYjw8MXxkPj4+MzEpLHRbNl1ePXMsdFs3XV49aSx0WzE2XV49cyx0WzE3XV49aSx0WzI2XV49cyx0WzI3XV49aSx0WzM2XV49cyx0WzM3XV49aSx0WzQ2XV49cyx0WzQ3XV49aSxzPWFeKG48PDF8aD4+PjMxKSxpPXVeKGg8PDF8bj4+PjMxKSx0WzhdXj1zLHRbOV1ePWksdFsxOF1ePXMsdFsxOV1ePWksdFsyOF1ePXMsdFsyOV1ePWksdFszOF1ePXMsdFszOV1ePWksdFs0OF1ePXMsdFs0OV1ePWksaz10WzBdLHk9dFsxXSxWPXRbMTFdPDw0fHRbMTBdPj4+MjgsVz10WzEwXTw8NHx0WzExXT4+PjI4LG09dFsyMF08PDN8dFsyMV0+Pj4yOSxxPXRbMjFdPDwzfHRbMjBdPj4+MjkscnQ9dFszMV08PDl8dFszMF0+Pj4yMyxsdD10WzMwXTw8OXx0WzMxXT4+PjIzLFI9dFs0MF08PDE4fHRbNDFdPj4+MTQsUz10WzQxXTw8MTh8dFs0MF0+Pj4xNCxIPXRbMl08PDF8dFszXT4+PjMxLEo9dFszXTw8MXx0WzJdPj4+MzEseD10WzEzXTw8MTJ8dFsxMl0+Pj4yMCxCPXRbMTJdPDwxMnx0WzEzXT4+PjIwLFg9dFsyMl08PDEwfHRbMjNdPj4+MjIsWT10WzIzXTw8MTB8dFsyMl0+Pj4yMix2PXRbMzNdPDwxM3x0WzMyXT4+PjE5LEQ9dFszMl08PDEzfHRbMzNdPj4+MTksY3Q9dFs0Ml08PDJ8dFs0M10+Pj4zMCxmdD10WzQzXTw8Mnx0WzQyXT4+PjMwLHN0PXRbNV08PDMwfHRbNF0+Pj4yLGl0PXRbNF08PDMwfHRbNV0+Pj4yLEs9dFsxNF08PDZ8dFsxNV0+Pj4yNixMPXRbMTVdPDw2fHRbMTRdPj4+MjYscD10WzI1XTw8MTF8dFsyNF0+Pj4yMSxDPXRbMjRdPDwxMXx0WzI1XT4+PjIxLFo9dFszNF08PDE1fHRbMzVdPj4+MTcsJD10WzM1XTw8MTV8dFszNF0+Pj4xNyxGPXRbNDVdPDwyOXx0WzQ0XT4+PjMsRz10WzQ0XTw8Mjl8dFs0NV0+Pj4zLEE9dFs2XTw8Mjh8dFs3XT4+PjQsUD10WzddPDwyOHx0WzZdPj4+NCxldD10WzE3XTw8MjN8dFsxNl0+Pj45LG90PXRbMTZdPDwyM3x0WzE3XT4+PjksTT10WzI2XTw8MjV8dFsyN10+Pj43LE49dFsyN108PDI1fHRbMjZdPj4+Nyx6PXRbMzZdPDwyMXx0WzM3XT4+PjExLEk9dFszN108PDIxfHRbMzZdPj4+MTEsXz10WzQ3XTw8MjR8dFs0Nl0+Pj44LHR0PXRbNDZdPDwyNHx0WzQ3XT4+PjgsVD10WzhdPDwyN3x0WzldPj4+NSxVPXRbOV08PDI3fHRbOF0+Pj41LEU9dFsxOF08PDIwfHRbMTldPj4+MTIsaj10WzE5XTw8MjB8dFsxOF0+Pj4xMixudD10WzI5XTw8N3x0WzI4XT4+PjI1LGh0PXRbMjhdPDw3fHRbMjldPj4+MjUsTz10WzM4XTw8OHx0WzM5XT4+PjI0LFE9dFszOV08PDh8dFszOF0+Pj4yNCxnPXRbNDhdPDwxNHx0WzQ5XT4+PjE4LHc9dFs0OV08PDE0fHRbNDhdPj4+MTgsdFswXT1rXn54JnAsdFsxXT15Xn5CJkMsdFsxMF09QV5+RSZtLHRbMTFdPVBefmomcSx0WzIwXT1IXn5LJk0sdFsyMV09Sl5+TCZOLHRbMzBdPVReflYmWCx0WzMxXT1VXn5XJlksdFs0MF09c3RefmV0Jm50LHRbNDFdPWl0Xn5vdCZodCx0WzJdPXhefnAmeix0WzNdPUJefkMmSSx0WzEyXT1FXn5tJnYsdFsxM109al5+cSZELHRbMjJdPUtefk0mTyx0WzIzXT1MXn5OJlEsdFszMl09Vl5+WCZaLHRbMzNdPVdeflkmJCx0WzQyXT1ldF5+bnQmcnQsdFs0M109b3Refmh0Jmx0LHRbNF09cF5+eiZnLHRbNV09Q15+SSZ3LHRbMTRdPW1efnYmRix0WzE1XT1xXn5EJkcsdFsyNF09TV5+TyZSLHRbMjVdPU5eflEmUyx0WzM0XT1YXn5aJl8sdFszNV09WV5+JCZ0dCx0WzQ0XT1udF5+cnQmY3QsdFs0NV09aHRefmx0JmZ0LHRbNl09el5+ZyZrLHRbN109SV5+dyZ5LHRbMTZdPXZefkYmQSx0WzE3XT1EXn5HJlAsdFsyNl09T15+UiZILHRbMjddPVFeflMmSix0WzM2XT1aXn5fJlQsdFszN109JF5+dHQmVSx0WzQ2XT1ydF5+Y3Qmc3QsdFs0N109bHRefmZ0Jml0LHRbOF09Z15+ayZ4LHRbOV09d15+eSZCLHRbMThdPUZefkEmRSx0WzE5XT1HXn5QJmosdFsyOF09Ul5+SCZLLHRbMjldPVNefkomTCx0WzM4XT1fXn5UJlYsdFszOV09dHReflUmVyx0WzQ4XT1jdF5+c3QmZXQsdFs0OV09ZnRefml0Jm90LHRbMF1ePWVbb10sdFsxXV49ZVtvKzFdfTtleHBvcnR7byBhcyBzaGEzXzUxMn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1oYXNoLmpzLm1hcFxuIiwiY29uc3QgZT1cIlwiLHQ9ZnVuY3Rpb24oKXtjb25zdCBlPXtpbnN0YW5jZTpFcnJvcixmcm9tOmU9Pntjb25zdCB0PVtlLm5hbWUsZS5tZXNzYWdlXTtyZXR1cm4gdm9pZCAwIT09ZS5zdGFjayYmdC5wdXNoKGUuc3RhY2spLHZvaWQgMCE9PWUuY2F1c2UmJih2b2lkIDA9PT1lLnN0YWNrJiZ0LnB1c2godm9pZCAwKSx0LnB1c2goZS5jYXVzZSkpLHR9LHN0dWI6KCk9Pm5ldyBFcnJvcixoeWRyYXRlOihlLFt0LG4sYSxzXSk9PntlLm5hbWU9dCxlLm1lc3NhZ2U9bix2b2lkIDA9PT1hP2RlbGV0ZSBlLnN0YWNrOmUuc3RhY2s9YSx2b2lkIDAhPT1zJiYoZS5jYXVzZT1zKX19LHQ9e2luc3RhbmNlOlVpbnQ4QXJyYXksZnJvbTplPT5bYnRvYShhLmRlY29kZShlKSldLGNyZWF0ZTooW2VdKT0+bi5lbmNvZGUoYXRvYihlKSl9LHM9e2luc3RhbmNlOk1hcCxmcm9tOmU9PlsuLi5lLmVudHJpZXMoKV0sc3R1YjooKT0+bmV3IE1hcCxoeWRyYXRlOihlLHQpPT57Zm9yKGNvbnN0W24sYV1vZiB0KWUuc2V0KG4sYSl9fSxvPXtpbnN0YW5jZTpTZXQsZnJvbTplPT5bLi4uZS52YWx1ZXMoKV0sc3R1YjooKT0+bmV3IFNldCxoeWRyYXRlOihlLHQpPT57Zm9yKGNvbnN0IG4gb2YgdCllLmFkZChuKX19LHI9e2luc3RhbmNlOkRhdGUsZnJvbTplPT5bZS50b0pTT04oKV0sY3JlYXRlOihbZV0pPT5uZXcgRGF0ZShlKX0sYz17aW5zdGFuY2U6UmVnRXhwLGZyb206KHtmbGFnczplLHNvdXJjZTp0fSk9PmU/W3QsZV06W3RdLGNyZWF0ZTooW2UsdF0pPT5uZXcgUmVnRXhwKGUsdCl9LGQ9e2luc3RhbmNlOlVSTCxmcm9tOmU9PltlLmhyZWZdLGNyZWF0ZTooW2VdKT0+bmV3IFVSTChlKX07cmV0dXJuIG5ldyBNYXAoW2UsdCxzLG8scixjLGRdLm1hcChlPT5bZS5pbnN0YW5jZS5uYW1lLGVdKSl9KCksbj1uZXcgVGV4dEVuY29kZXIsYT1uZXcgVGV4dERlY29kZXIoXCJ1dGYtOFwiKTtleHBvcnR7dCBhcyBHTE9CQUxfQ09OU1RSVUNUT1JfTUFQLGUgYXMgUExBSU5fT0JKRUNUX0xBQkVMfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbnN0cnVjdG9ycy5qcy5tYXBcbiIsImltcG9ydHtHTE9CQUxfQ09OU1RSVUNUT1JfTUFQIGFzIHQsUExBSU5fT0JKRUNUX0xBQkVMIGFzIG59ZnJvbVwiLi9jb25zdHJ1Y3RvcnMuanNcIjtjb25zdCBlPS0xLHI9LTIsbz0tMyxpPS00LHM9LTUsYz0tNjtmdW5jdGlvbiBmKG49dm9pZCAwLGU9dCl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KGEobixlKSl9ZnVuY3Rpb24gdSh0KXtpZih2b2lkIDA9PT10KXJldHVybi0xO2lmKFwibnVtYmVyXCI9PXR5cGVvZiB0KXtpZihOdW1iZXIuaXNOYU4odCkpcmV0dXJuLTM7aWYoIU51bWJlci5pc0Zpbml0ZSh0KSlyZXR1cm4gdDwwPy01Oi00fXJldHVybiBudWxsfWNvbnN0IGw9W107ZnVuY3Rpb24gYShlLHI9dCl7Y29uc3Qgbz11KGUpO2lmKG51bGwhPT1vKXJldHVybiBvO2NvbnN0IGk9W10scz1uZXcgTWFwO3JldHVybiBmdW5jdGlvbiB0KGUpe2NvbnN0IG89dShlKTtpZihudWxsIT09bylyZXR1cm4gbztsZXQgYz1zLmdldChlKTtpZih2b2lkIDAhPT1jKXJldHVybiBjO3N3aXRjaChjPWkubGVuZ3RoLHR5cGVvZiBlKXtjYXNlXCJudW1iZXJcIjpjYXNlXCJzdHJpbmdcIjpjYXNlXCJib29sZWFuXCI6aVtjXT1lLHMuc2V0KGUsYyk7YnJlYWs7Y2FzZVwiYmlnaW50XCI6aVtjXT1bLTYsZS50b1N0cmluZygxNildLHMuc2V0KGUsYyk7YnJlYWs7Y2FzZVwib2JqZWN0XCI6aWYobnVsbD09PWUpaVtjXT1lLHMuc2V0KGUsYyk7ZWxzZSBpZihBcnJheS5pc0FycmF5KGUpKXtjb25zdCBuPWZ1bmN0aW9uKHQpe2lmKGwubGVuZ3RoPHQpe2NvbnN0IG49bC5sZW5ndGg7bC5sZW5ndGg9dCxsLmZpbGwoLTIsbix0KX1yZXR1cm4gbC5zbGljZSgwLHQpfShlLmxlbmd0aCk7aVtjXT1uLHMuc2V0KGUsYyk7Zm9yKGNvbnN0W3Isb11vZiBlLmVudHJpZXMoKSluW3JdPXQobyl9ZWxzZXtjb25zdFtvLGZdPWZ1bmN0aW9uKHQsZSl7Y29uc3Qgcj10LmNvbnN0cnVjdG9yO2lmKFwiZnVuY3Rpb25cIj09dHlwZW9mIHIpe2NvbnN0IG49ci5uYW1lLG89ZS5nZXQobik7aWYodm9pZCAwIT09bylyZXR1cm5bbixvLmZyb20odCldfWNvbnN0IG89T2JqZWN0LmVudHJpZXModCksaT1vLmxlbmd0aCxzPUFycmF5LmZyb20oe2xlbmd0aDppK2l9KTtmb3IobGV0IHQ9MDt0PGk7dCsrKXtjb25zdCBuPW9bdF0sZT10K3Q7c1tlXT1uWzBdLHNbZSsxXT1uWzFdfXJldHVybltuLHNdfShlLHIpLHU9Zi5sZW5ndGgsbD1BcnJheS5mcm9tKHtsZW5ndGg6dSsxfSk7bFswXT1vLGlbY109bCxzLnNldChlLGMpO2ZvcihsZXQgbj0wO248dTtuKyspbFtuKzFdPXQoZltuXSl9fXJldHVybiBjfShlKSxpfWV4cG9ydHtyIGFzIEFSUkFZX0hPTEVfSU5ERVgsYyBhcyBCSUdfSU5UX0xBQkVMLG8gYXMgTkFOX0lOREVYLHMgYXMgTkVHX0lORl9JTkRFWCxpIGFzIFBPU19JTkZfSU5ERVgsZSBhcyBVTkRFRklORURfSU5ERVgsYSBhcyBsaXN0aWZ5LGYgYXMgc3RyaW5naWZ5fTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXN0cmluZ2lmeS5qcy5tYXBcbiIsImltcG9ydHtzaGEzXzUxMiBhcyByfWZyb21cIi4vaGFzaC5qc1wiO2ltcG9ydHtzdHJpbmdpZnkgYXMgbn1mcm9tXCIuL29zb24vc3RyaW5naWZ5LmpzXCI7ZnVuY3Rpb24gbyhvLHQpe3JldHVybiByKG4oW28sdF0pKX1mdW5jdGlvbiB0KHIsbyl7cmV0dXJuIG4oW3Isb10pfWZ1bmN0aW9uIGkoKXtyZXR1cm5cIlwifWV4cG9ydHtpIGFzIGdldENhY2hlS2V5T2ZFbXB0eVN0cmluZyxvIGFzIGdldENhY2hlS2V5T2ZIYXNoLHQgYXMgZ2V0Q2FjaGVLZXlPZlN0cmluZ2lmaWVkfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdldENhY2hlS2V5LmpzLm1hcFxuIiwiaW1wb3J0e2dldENhY2hlS2V5T2ZIYXNoIGFzIHQsZ2V0Q2FjaGVLZXlPZkVtcHR5U3RyaW5nIGFzIGV9ZnJvbVwiLi9nZXRDYWNoZUtleS5qc1wiO2NvbnN0IG49cih7Z2V0Q2FjaGVLZXk6dH0pLGM9cih7Z2V0Q2FjaGVLZXk6ZX0pO2Z1bmN0aW9uIHIoe2NhY2hlRHVyYXRpb246ZT1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksZ2V0Q2FjaGVLZXk6bj10fT17fSl7cmV0dXJuIGZ1bmN0aW9uKHQsYyl7bGV0IHIsbyxpO3JldHVyblwiZ2V0dGVyXCI9PT1jPy5raW5kP2Z1bmN0aW9uKCl7Y29uc3QgYz1uKHRoaXMsW10pLGE9RGF0ZS5ub3coKTtyZXR1cm4oaSE9PWN8fGEtbz5lKSYmKGk9YyxyPXQuY2FsbCh0aGlzKSxvPWEpLHJ9OmZ1bmN0aW9uKC4uLmEpe2NvbnN0IHU9bih0aGlzLGEpLGg9RGF0ZS5ub3coKTtyZXR1cm4oaSE9PXV8fGgtbz5lKSYmKGk9dSxyPWM/dC5jYWxsKHRoaXMsLi4uYSk6dCguLi5hKSxvPWgpLHJ9fX1leHBvcnR7biBhcyBtZW1vaXplT25lLHIgYXMgbWVtb2l6ZU9uZUZhY3RvcnksYyBhcyBtZW1vaXplT25lV2l0aEVtcHR5SGFzaH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tZW1vaXplT25lLmpzLm1hcFxuIiwiZXhwb3J0IGZ1bmN0aW9uIGlzQ0koY2lFbnY6IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gISFjaUVudiAmJiBjaUVudiAhPT0gJzAnICYmIGNpRW52ICE9PSAnZmFsc2UnO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBFbnZSZWFkZXJPcHRpb25zIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHsgcmVhZEVudmlyb25tZW50VmFyaWFibGVzIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHsgbWVtb2l6ZU9uZSB9IGZyb20gJ2F0LWRlY29yYXRvcnMnO1xuaW1wb3J0IHsgZ2xvYmJ5IH0gZnJvbSAnZ2xvYmJ5JztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBpc0NJIH0gZnJvbSAnLi91dGlscy9jaS5qcyc7XG5cbmV4cG9ydCBjbGFzcyBQcm9qZWN0IHtcbiAgcHJpdmF0ZSByZWFkb25seSBhcmd2OiBFbnZSZWFkZXJPcHRpb25zO1xuICBwcml2YXRlIHJlYWRvbmx5IGxvYWRFbnY6IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgcGF0aEJ5TmFtZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfZGlyUGF0aDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGRpclBhdGg6IHN0cmluZywgYXJndjogRW52UmVhZGVyT3B0aW9ucywgbG9hZEVudjogYm9vbGVhbikge1xuICAgIHRoaXMuX2RpclBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCk7XG4gICAgdGhpcy5hcmd2ID0gYXJndjtcbiAgICB0aGlzLmxvYWRFbnYgPSBsb2FkRW52O1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGlzQnVuQXZhaWxhYmxlKCk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gLyhefFxcbilidW5cXHMvLnRlc3QoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbih0aGlzLnJvb3REaXJQYXRoLCAnLnRvb2wtdmVyc2lvbnMnKSwgJ3V0ZjgnKSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGJ1aWxkQ29tbWFuZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnBhY2thZ2VKc29uLnNjcmlwdHM/LmJ1aWxkPy5pbmNsdWRlcygnYnVpbGRJZk5lZWRlZCcpXG4gICAgICA/ICdZQVJOIHJ1biBidWlsZCdcbiAgICAgIDogdGhpcy5wYWNrYWdlSnNvbi5zY3JpcHRzPy5idWlsZFxuICAgICAgICA/IGBZQVJOIHdiIGJ1aWxkSWZOZWVkZWQgJHt0aGlzLmFyZ3YudmVyYm9zZSA/ICctLXZlcmJvc2UnIDogJyd9YFxuICAgICAgICA6IFwiZWNobyAnTm8gYnVpbGQgc2NyaXB0J1wiO1xuICB9XG5cbiAgZ2V0IGRpclBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZGlyUGF0aDtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCByb290RGlyUGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLmRpclBhdGgsICcuLicsICcuLicsICdwYWNrYWdlLmpzb24nKSlcbiAgICAgID8gcGF0aC5yZXNvbHZlKHRoaXMuZGlyUGF0aCwgJy4uJywgJy4uJylcbiAgICAgIDogdGhpcy5kaXJQYXRoO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGRvY2tlcmZpbGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZnMucmVhZEZpbGVTeW5jKHRoaXMuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSwgJ3V0ZjgnKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNEb2NrZXJmaWxlKCk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gISF0aGlzLmZpbmRGaWxlKCdEb2NrZXJmaWxlJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1NvdXJjZUNvZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJ3NyYycpKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucGFja2FnZUpzb24ubmFtZSB8fCAndW5rbm93bic7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgZG9ja2VySW1hZ2VOYW1lKCk6IHN0cmluZyB7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMucGFja2FnZUpzb24ubmFtZSB8fCAndW5rbm93bic7XG4gICAgcmV0dXJuIG5hbWUucmVwbGFjZUFsbCgnQCcsICcnKS5yZXBsYWNlQWxsKCcvJywgJy0nKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBlbnYoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgaWYgKCF0aGlzLmxvYWRFbnYpIHJldHVybiBwcm9jZXNzLmVudjtcblxuICAgIGNvbnN0IFtlbnZWYXJzLCBlbnZQYXRoQW5kTG9hZGVkRW52VmFyQ291bnRQYWlyc10gPSByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXModGhpcy5hcmd2LCB0aGlzLmRpclBhdGgpO1xuICAgIGZvciAoY29uc3QgW2VudlBhdGgsIGNvdW50XSBvZiBlbnZQYXRoQW5kTG9hZGVkRW52VmFyQ291bnRQYWlycykge1xuICAgICAgY29uc29sZS5pbmZvKGBMb2FkZWQgJHtjb3VudH0gZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gJHtlbnZQYXRofWApO1xuICAgIH1cbiAgICByZXR1cm4geyAuLi5lbnZWYXJzLCAuLi5wcm9jZXNzLmVudiB9O1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IHBhY2thZ2VKc29uKCk6IFBhY2thZ2VKc29uIHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmModGhpcy5wYWNrYWdlSnNvblBhdGgsICd1dGY4JykpIGFzIFBhY2thZ2VKc29uO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IHBhY2thZ2VKc29uUGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBwYXRoLmpvaW4odGhpcy5kaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzUHJpc21hKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhISh0aGlzLnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8ucHJpc21hID8/IHRoaXMucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy5wcmlzbWEpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1ZpdGVzdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEodGhpcy5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LnZpdGVzdCA/PyB0aGlzLnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8udml0ZXN0KTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNCaW9tZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5oYXNEZXBlbmRlbmN5KCdAYmlvbWVqcy9iaW9tZScpIHx8IHRoaXMuaGFzRGVwZW5kZW5jeSgnYmlvbWUnKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNFc2xpbnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGFzRGVwZW5kZW5jeSgnZXNsaW50Jyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzT3hsaW50KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhhc0RlcGVuZGVuY3koJ294bGludCcpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc094Zm10KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhhc0RlcGVuZGVuY3koJ294Zm10Jyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzUG9ldHJ5TG9jaygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5kaXJQYXRoLCAncG9ldHJ5LmxvY2snKSkgfHwgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5yb290RGlyUGF0aCwgJ3BvZXRyeS5sb2NrJykpXG4gICAgKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNQdWJzcGVjWWFtbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5kaXJQYXRoLCAncHVic3BlYy55YW1sJykpIHx8XG4gICAgICBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLnJvb3REaXJQYXRoLCAncHVic3BlYy55YW1sJykpXG4gICAgKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBwcmVmZXJyZWRMaW50ZXIoKTogJ2Jpb21lJyB8ICdveGxpbnQnIHwgJ2VzbGludCcgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmhhc0Jpb21lKSByZXR1cm4gJ2Jpb21lJztcbiAgICBpZiAodGhpcy5oYXNPeGxpbnQpIHJldHVybiAnb3hsaW50JztcbiAgICBpZiAodGhpcy5oYXNFc2xpbnQpIHJldHVybiAnZXNsaW50JztcbiAgICByZXR1cm47XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzUGxheXdyaWdodENvbmZpZygpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuICEhdGhpcy5maW5kRmlsZSgncGxheXdyaWdodC5jb25maWcudHMnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgc2tpcExhdW5jaGluZ1NlcnZlckZvclBsYXl3cmlnaHQoKTogYm9vbGVhbiB7XG4gICAgaWYgKGlzQ0kodGhpcy5lbnYuQ0kpKSByZXR1cm4gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbmZpZ1BhdGggPSB0aGlzLmZpbmRGaWxlKCdwbGF5d3JpZ2h0LmNvbmZpZy50cycpO1xuICAgICAgcmV0dXJuIC9cXGJ3ZWJTZXJ2ZXJcXGIvLnRlc3QoZnMucmVhZEZpbGVTeW5jKGNvbmZpZ1BhdGgsICd1dGY4JykpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBkb2NrZXJQYWNrYWdlSnNvbigpOiBQYWNrYWdlSnNvbiB7XG4gICAgcmV0dXJuIHBhdGguZGlybmFtZSh0aGlzLmZpbmRGaWxlKCdEb2NrZXJmaWxlJykpID09PSB0aGlzLmRpclBhdGhcbiAgICAgID8gdGhpcy5wYWNrYWdlSnNvblxuICAgICAgOiAoSlNPTi5wYXJzZShcbiAgICAgICAgICBmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHBhdGguZGlybmFtZSh0aGlzLmZpbmRGaWxlKCdEb2NrZXJmaWxlJykpLCAncGFja2FnZS5qc29uJyksICd1dGY4JylcbiAgICAgICAgKSBhcyBQYWNrYWdlSnNvbik7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgYmluRXhpc3RzKCk6IGJvb2xlYW4ge1xuICAgIGxldCBiaW5Gb3VuZCA9IGZhbHNlO1xuICAgIGxldCBjdXJyZW50UGF0aCA9IHRoaXMuZGlyUGF0aDtcbiAgICBmb3IgKDs7KSB7XG4gICAgICBjb25zdCBiaW5QYXRoID0gcGF0aC5qb2luKGN1cnJlbnRQYXRoLCAnbm9kZV9tb2R1bGVzJywgJy5iaW4nKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKGJpblBhdGgpKSB7XG4gICAgICAgIHRoaXMuZW52LlBBVEggPSBgJHtiaW5QYXRofToke3RoaXMuZW52LlBBVEh9YDtcbiAgICAgICAgYmluRm91bmQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY3VycmVudFBhdGgsICcuZ2l0JykpKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY29uc3QgcGFyZW50UGF0aCA9IHBhdGguZGlybmFtZShjdXJyZW50UGF0aCk7XG4gICAgICBpZiAoY3VycmVudFBhdGggPT09IHBhcmVudFBhdGgpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjdXJyZW50UGF0aCA9IHBhcmVudFBhdGg7XG4gICAgfVxuICAgIHJldHVybiBiaW5Gb3VuZDtcbiAgfVxuXG4gIGZpbmRGaWxlKGZpbGVOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCBmaWxlUGF0aCA9IHRoaXMucGF0aEJ5TmFtZS5nZXQoZmlsZU5hbWUpO1xuICAgIGlmIChmaWxlUGF0aCkgcmV0dXJuIGZpbGVQYXRoO1xuXG4gICAgZmlsZVBhdGggPSBbZmlsZU5hbWUsIHBhdGguam9pbignLi4nLCAnLi4nLCBmaWxlTmFtZSldXG4gICAgICAubWFwKChwKSA9PiBwYXRoLnJlc29sdmUodGhpcy5kaXJQYXRoLCBwKSlcbiAgICAgIC5maW5kKChwKSA9PiBmcy5leGlzdHNTeW5jKHApKTtcbiAgICBpZiAoIWZpbGVQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgbm90IGZvdW5kOiAke2ZpbGVOYW1lfWApO1xuICAgIH1cbiAgICB0aGlzLnBhdGhCeU5hbWUuc2V0KGZpbGVOYW1lLCBmaWxlUGF0aCk7XG4gICAgcmV0dXJuIGZpbGVQYXRoO1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNEZXBlbmRlbmN5KHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBoYXNEZXBlbmRlbmN5SW5QYWNrYWdlSnNvbiA9IChwYWNrYWdlSnNvbjogUGFja2FnZUpzb24gfCB1bmRlZmluZWQpOiBib29sZWFuID0+XG4gICAgICAhIShcbiAgICAgICAgcGFja2FnZUpzb24gJiZcbiAgICAgICAgKHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSB8fFxuICAgICAgICAgIHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSB8fFxuICAgICAgICAgIHBhY2thZ2VKc29uLm9wdGlvbmFsRGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdIHx8XG4gICAgICAgICAgcGFja2FnZUpzb24ucGVlckRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSlcbiAgICAgICk7XG5cbiAgICByZXR1cm4gaGFzRGVwZW5kZW5jeUluUGFja2FnZUpzb24odGhpcy5wYWNrYWdlSnNvbikgfHwgaGFzRGVwZW5kZW5jeUluUGFja2FnZUpzb24odGhpcy5yb290UGFja2FnZUpzb24pO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgcHJpdmF0ZSBnZXQgcm9vdFBhY2thZ2VKc29uKCk6IFBhY2thZ2VKc29uIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5yb290RGlyUGF0aCA9PT0gdGhpcy5kaXJQYXRoKSByZXR1cm4gdGhpcy5wYWNrYWdlSnNvbjtcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHRoaXMucm9vdERpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKSkgYXMgUGFja2FnZUpzb247XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFt3Yl0gRmFpbGVkIHRvIHJlYWQgb3IgcGFyc2UgJHtwYXRoLmpvaW4odGhpcy5yb290RGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpfWAsIGVycm9yKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBGb3VuZFByb2plY3RzIHtcbiAgcm9vdDogUHJvamVjdDtcbiAgc2VsZjogUHJvamVjdDtcbiAgZGVzY2VuZGFudHM6IFByb2plY3RbXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRTZWxmUHJvamVjdChhcmd2OiBFbnZSZWFkZXJPcHRpb25zLCBsb2FkRW52ID0gdHJ1ZSwgZGlyUGF0aD86IHN0cmluZyk6IFByb2plY3QgfCB1bmRlZmluZWQge1xuICBkaXJQYXRoID8/PSBwcm9jZXNzLmN3ZCgpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKSkpIHJldHVybjtcblxuICByZXR1cm4gbmV3IFByb2plY3QoZGlyUGF0aCwgYXJndiwgbG9hZEVudik7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaW5kRGVzY2VuZGFudFByb2plY3RzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBsb2FkRW52ID0gdHJ1ZSxcbiAgZGlyUGF0aD86IHN0cmluZ1xuKTogUHJvbWlzZTxGb3VuZFByb2plY3RzIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHJvb3RBbmRTZWxmUHJvamVjdHMgPSBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyhhcmd2LCBsb2FkRW52LCBkaXJQYXRoKTtcbiAgaWYgKCFyb290QW5kU2VsZlByb2plY3RzKSByZXR1cm47XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5yb290QW5kU2VsZlByb2plY3RzLFxuICAgIGRlc2NlbmRhbnRzOlxuICAgICAgcm9vdEFuZFNlbGZQcm9qZWN0cy5yb290ID09PSByb290QW5kU2VsZlByb2plY3RzLnNlbGZcbiAgICAgICAgPyBhd2FpdCBnZXRBbGxEZXNjZW5kYW50UHJvamVjdHMoYXJndiwgcm9vdEFuZFNlbGZQcm9qZWN0cy5yb290LCBsb2FkRW52KVxuICAgICAgICA6IFtyb290QW5kU2VsZlByb2plY3RzLnNlbGZdLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZFJvb3RBbmRTZWxmUHJvamVjdHMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIGxvYWRFbnYgPSB0cnVlLFxuICBkaXJQYXRoPzogc3RyaW5nXG4pOiBPbWl0PEZvdW5kUHJvamVjdHMsICdkZXNjZW5kYW50cyc+IHwgdW5kZWZpbmVkIHtcbiAgZGlyUGF0aCA/Pz0gcHJvY2Vzcy5jd2QoKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSByZXR1cm47XG5cbiAgY29uc3QgdGhpc1Byb2plY3QgPSBuZXcgUHJvamVjdChkaXJQYXRoLCBhcmd2LCBsb2FkRW52KTtcbiAgbGV0IHJvb3RQcm9qZWN0ID0gdGhpc1Byb2plY3Q7XG4gIGlmICghdGhpc1Byb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcyAmJiBwYXRoLmRpcm5hbWUoZGlyUGF0aCkuZW5kc1dpdGgoJy9wYWNrYWdlcycpKSB7XG4gICAgY29uc3Qgcm9vdERpclBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy4uJywgJy4uJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHJvb3REaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgICByb290UHJvamVjdCA9IG5ldyBQcm9qZWN0KHJvb3REaXJQYXRoLCBhcmd2LCBsb2FkRW52KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgcm9vdDogcm9vdFByb2plY3QsIHNlbGY6IHRoaXNQcm9qZWN0IH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEFsbERlc2NlbmRhbnRQcm9qZWN0cyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgcm9vdFByb2plY3Q6IFByb2plY3QsXG4gIGxvYWRFbnY6IGJvb2xlYW5cbik6IFByb21pc2U8UHJvamVjdFtdPiB7XG4gIGNvbnN0IHByb2plY3RzID0gW3Jvb3RQcm9qZWN0XTtcblxuICBjb25zdCB3b3Jrc3BhY2UgPSByb290UHJvamVjdC5wYWNrYWdlSnNvbi53b3Jrc3BhY2VzO1xuICBpZiAoIUFycmF5LmlzQXJyYXkod29ya3NwYWNlKSkgcmV0dXJuIHByb2plY3RzO1xuXG4gIGNvbnN0IGdsb2JQYXR0ZXJuOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBwYWNrYWdlRGlyczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCB3b3Jrc3BhY2VQYXRoIG9mIHdvcmtzcGFjZS5tYXAoKHdzOiBzdHJpbmcpID0+IHBhdGguam9pbihyb290UHJvamVjdC5kaXJQYXRoLCB3cykpKSB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMod29ya3NwYWNlUGF0aCkpIHtcbiAgICAgIHBhY2thZ2VEaXJzLnB1c2god29ya3NwYWNlUGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdsb2JQYXR0ZXJuLnB1c2god29ya3NwYWNlUGF0aCk7XG4gICAgfVxuICB9XG4gIHBhY2thZ2VEaXJzLnB1c2goLi4uKGF3YWl0IGdsb2JieShnbG9iUGF0dGVybiwgeyBkb3Q6IHRydWUsIG9ubHlEaXJlY3RvcmllczogdHJ1ZSB9KSkpO1xuICBmb3IgKGNvbnN0IHN1YlBhY2thZ2VEaXJQYXRoIG9mIHBhY2thZ2VEaXJzKSB7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihzdWJQYWNrYWdlRGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkgY29udGludWU7XG5cbiAgICBwcm9qZWN0cy5wdXNoKG5ldyBQcm9qZWN0KHN1YlBhY2thZ2VEaXJQYXRoLCBhcmd2LCBsb2FkRW52KSk7XG4gIH1cbiAgcmV0dXJuIHByb2plY3RzO1xufVxuIiwiaW1wb3J0IHsgUHJvbWlzZVBvb2wgfSBmcm9tICdtaW5pbWFsLXByb21pc2UtcG9vbCc7XG5cbmV4cG9ydCBjb25zdCBwcm9taXNlUG9vbCA9IG5ldyBQcm9taXNlUG9vbCgpO1xuIiwiZXhwb3J0IGNvbnN0IGlzUnVubmluZ09uQnVuID1cbiAgLy8gRGV0ZWN0IGBidW4gLS1idW4gcnVuIHdiIC4uLmAuIGNmLiBodHRwczovL2J1bi5zaC9ndWlkZXMvdXRpbC9kZXRlY3QtYnVuXG4gIHByb2Nlc3MudmVyc2lvbnMuYnVuIHx8XG4gIC8vIERldGVjdCBgYnVuIHJ1biB3YiAuLi5gLlxuICBwcm9jZXNzLmFyZ3ZbMF0/LmVuZHNXaXRoKCcvYnVuJykgfHxcbiAgcHJvY2Vzcy5lbnYubnBtX2V4ZWNwYXRoPy5lbmRzV2l0aCgnL2J1bicpO1xuXG5leHBvcnQgY29uc3QgcnVudGltZVdpdGhBcmdzID0gaXNSdW5uaW5nT25CdW4gPyAnYnVuIC0tYnVuIHJ1bicgOiAnbm9kZSc7XG5leHBvcnQgY29uc3QgcGFja2FnZU1hbmFnZXIgPSBpc1J1bm5pbmdPbkJ1biA/ICdidW4nIDogJ3lhcm4nO1xuZXhwb3J0IGNvbnN0IHBhY2thZ2VNYW5hZ2VyV2l0aFJ1biA9IGlzUnVubmluZ09uQnVuID8gJ2J1biAtLWJ1biBydW4nIDogJ3lhcm4nO1xuIiwiaW1wb3J0IHsgc3Bhd25Bc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBpc1J1bm5pbmdPbkJ1biwgcGFja2FnZU1hbmFnZXJXaXRoUnVuIH0gZnJvbSAnLi4vdXRpbHMvcnVudGltZS5qcyc7XG5cbmludGVyZmFjZSBPcHRpb25zIHtcbiAgY2k/OiBib29sZWFuO1xuICBleGl0SWZGYWlsZWQ/OiBib29sZWFuO1xuICBvblNpZ25hbD86IChzaWduYWw6IE5vZGVKUy5TaWduYWxzIHwgbnVsbCkgPT4gdm9pZDtcbiAgZm9yY2VDb2xvcj86IGJvb2xlYW47XG4gIHRpbWVvdXQ/OiBudW1iZXI7XG59XG5cbmNvbnN0IGRlZmF1bHRPcHRpb25zOiBPcHRpb25zID0ge1xuICBleGl0SWZGYWlsZWQ6IHRydWUsXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuV2l0aFNwYXduKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+Pj4sXG4gIG9wdHM6IE9wdGlvbnMgPSBkZWZhdWx0T3B0aW9uc1xuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3Qgbm9ybWFsaXplZFNjcmlwdCA9IG5vcm1hbGl6ZVNjcmlwdChzY3JpcHQsIHByb2plY3QpO1xuICBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCBwcm9qZWN0KTtcbiAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdC5ydW5uYWJsZSwgcHJvamVjdCwgJ1N0YXJ0IChyYXcpJywgdHJ1ZSk7XG4gIH1cbiAgaWYgKGFyZ3YuZHJ5UnVuKSB7XG4gICAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgMCwgb3B0cyk7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBjb25zdCByZXQgPSBhd2FpdCBzcGF3bkFzeW5jKG5vcm1hbGl6ZWRTY3JpcHQucnVubmFibGUsIHVuZGVmaW5lZCwge1xuICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIGVudjogY29uZmlndXJlRW52KHByb2plY3QuZW52LCBvcHRzKSxcbiAgICBzaGVsbDogdHJ1ZSxcbiAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIHRpbWVvdXQ6IG9wdHMudGltZW91dCxcbiAgICBraWxsT25FeGl0OiB0cnVlLFxuICAgIHZlcmJvc2U6IGFyZ3YudmVyYm9zZSxcbiAgfSk7XG4gIG9wdHMub25TaWduYWw/LihyZXQuc2lnbmFsKTtcbiAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgcmV0LnN0YXR1cywgb3B0cyk7XG4gIHJldHVybiByZXQuc3RhdHVzID8/IDE7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBydW5XaXRoU3Bhd25JblBhcmFsbGVsKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+Pj4sXG4gIG9wdHM6IE9wdGlvbnMgPSBkZWZhdWx0T3B0aW9uc1xuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgcmV0dXJuIHByb21pc2VQb29sLnJ1bkFuZFdhaXRGb3JSZXR1cm5WYWx1ZShhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFNjcmlwdCA9IG5vcm1hbGl6ZVNjcmlwdChzY3JpcHQsIHByb2plY3QpO1xuICAgIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIHByb2plY3QsICdTdGFydCAocGFyYWxsZWwpJywgdHJ1ZSk7XG4gICAgaWYgKGFyZ3YuZHJ5UnVuKSB7XG4gICAgICBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCBwcm9qZWN0LCAnU3RhcnRlZCAobG9nKScpO1xuICAgICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgICBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQucnVubmFibGUsIHByb2plY3QsICdTdGFydGVkIChyYXcpJywgdHJ1ZSk7XG4gICAgICB9XG4gICAgICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCAwLCBvcHRzKTtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIGNvbnN0IHJldCA9IGF3YWl0IHNwYXduQXN5bmMobm9ybWFsaXplZFNjcmlwdC5ydW5uYWJsZSwgdW5kZWZpbmVkLCB7XG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIGVudjogY29uZmlndXJlRW52KHByb2plY3QuZW52LCBvcHRzKSxcbiAgICAgIHNoZWxsOiB0cnVlLFxuICAgICAgc3RkaW86ICdwaXBlJyxcbiAgICAgIHRpbWVvdXQ6IG9wdHMudGltZW91dCxcbiAgICAgIG1lcmdlT3V0QW5kRXJyb3I6IHRydWUsXG4gICAgICBraWxsT25FeGl0OiB0cnVlLFxuICAgICAgdmVyYm9zZTogYXJndi52ZXJib3NlLFxuICAgIH0pO1xuICAgIG9wdHMub25TaWduYWw/LihyZXQuc2lnbmFsKTtcbiAgICBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCBwcm9qZWN0LCAnU3RhcnRlZCAobG9nKScpO1xuICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdC5ydW5uYWJsZSwgcHJvamVjdCwgJ1N0YXJ0ZWQgKHJhdyknLCB0cnVlKTtcbiAgICB9XG4gICAgY29uc3Qgb3V0ID0gcmV0LnN0ZG91dC50cmltKCk7XG4gICAgaWYgKG91dCkge1xuICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUob3V0KTtcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdcXG4nKTtcbiAgICB9XG4gICAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgcmV0LnN0YXR1cywgb3B0cyk7XG4gICAgcmV0dXJuIHJldC5zdGF0dXMgPz8gMTtcbiAgfSk7XG59XG5cbi8qKlxuICogUmVwbGFjZSBjYXBpdGFsaXplZCBjb21tYW5kcyAoZS5nLiwgWUFSTiwgUFJJU01BLCBCVU4pIHdpdGggc3VpdGFibGUgY29tbWFuZHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVTY3JpcHQoc2NyaXB0OiBzdHJpbmcsIHByb2plY3Q6IFByb2plY3QpOiB7IHByaW50YWJsZTogc3RyaW5nOyBydW5uYWJsZTogc3RyaW5nIH0ge1xuICBsZXQgbmV3U2NyaXB0ID0gc2NyaXB0XG4gICAgLnJlcGxhY2VBbGwoJ1xcbicsICcnKVxuICAgIC5yZXBsYWNlQWxsKC9cXHNcXHMrL2csICcgJylcbiAgICAucmVwbGFjZUFsbChcbiAgICAgICdQUklTTUEgZ2VuZXJhdGUgJyxcbiAgICAgIHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0eiA/ICdQUklTTUEgZ2VuZXJhdGUgJyA6ICdQUklTTUEgZ2VuZXJhdGUgLS1uby1oaW50cyAnXG4gICAgKVxuICAgIC5yZXBsYWNlQWxsKCdQUklTTUEgJywgcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6ID8gJ1lBUk4gYmxpdHogcHJpc21hICcgOiAnWUFSTiBwcmlzbWEgJylcbiAgICAucmVwbGFjZUFsbCgnQlVOICcsIHByb2plY3QuaXNCdW5BdmFpbGFibGUgPyAnYnVuIC0tYnVuIHJ1biAnIDogJ1lBUk4gJylcbiAgICAvLyBBdm9pZCByZXBsYWNpbmcgYFlBUk4gcnVuYCB3aXRoIGBydW5gIGJ5IHJlcGxhY2luZyBgWUFSTmAgd2l0aCBgKHlhcm58YnVuIC0tYnVuKSBydW5gXG4gICAgLnJlcGxhY2VBbGwoJ1lBUk4gcnVuICcsIGlzUnVubmluZ09uQnVuID8gJ2J1biAtLWJ1biBydW4gJyA6ICd5YXJuIHJ1biAnKTtcbiAgaWYgKGlzUnVubmluZ09uQnVuKSB7XG4gICAgbmV3U2NyaXB0ID0gbmV3U2NyaXB0XG4gICAgICAucmVwbGFjZUFsbCgnWUFSTiBidWlsZC10cyBydW4nLCAnYnVuIC0tYnVuIHJ1bicpXG4gICAgICAucmVwbGFjZUFsbCgnYnVuIC0tYnVuIHJ1biBidW4gLS1idW4gcnVuJywgJ2J1biAtLWJ1biBydW4nKVxuICAgICAgLy8gQmVjYXVzZSBidW4gY2FuIHJ1biBzcmMvaW5kZXgudHMgZGlyZWN0bHkuXG4gICAgICAucmVwbGFjZUFsbCgnZGlzdC9pbmRleC5qcycsICdzcmMvaW5kZXgudHMnKVxuICAgICAgLnJlcGxhY2VBbGwoLyg/OllBUk4gKT92aXRlc3QgcnVuL2csICdidW4gdGVzdCcpXG4gICAgICAvLyAnLS1hbGxvd09ubHknIGlzIHNvbWV0aW1lcyByZW1vdmVkLlxuICAgICAgLnJlcGxhY2VBbGwoLyAtLWNvbG9yIC0tcGFzc1dpdGhOb1Rlc3RzKD86IC0tYWxsb3dPbmx5KT8vZywgJycpO1xuICB9XG4gIG5ld1NjcmlwdCA9IG5ld1NjcmlwdC50cmltKCk7XG4gIGNvbnN0IHByaW50YWJsZVNjcmlwdCA9IGZpeEJ1bkNvbW1hbmQobmV3U2NyaXB0LnJlcGxhY2VBbGwoJ1lBUk4gJywgYCR7cGFja2FnZU1hbmFnZXJXaXRoUnVufSBgKSk7XG4gIGNvbnN0IHJ1bm5hYmxlU2NyaXB0ID0gZml4QnVuQ29tbWFuZChcbiAgICBuZXdTY3JpcHRcbiAgICAgIC8vIEJlY2F1c2Ugd2UgbmVlZCB0byB1c2UgYHlhcm4gcGxheXdyaWdodGAgaW4gYSBwcm9qZWN0IGRlcGVuZGluZyBvbiBgYXJ0aWxsZXJ5LWVuZ2luZS1wbGF5d3JpZ2h0YC5cbiAgICAgIC5yZXBsYWNlQWxsKCdZQVJOIHBsYXl3cmlnaHQgJywgYCR7cGFja2FnZU1hbmFnZXJXaXRoUnVufSBwbGF5d3JpZ2h0IGApXG4gICAgICAucmVwbGFjZUFsbCgnWUFSTiAnLCAhaXNSdW5uaW5nT25CdW4gJiYgcHJvamVjdC5iaW5FeGlzdHMgPyAnJyA6IGAke3BhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gYClcbiAgKTtcbiAgLy8gQWRkIGNhc2NhZGUgb3B0aW9uIHdoZW4gV0JfRU5WIGlzIGRlZmluZWRcbiAgY29uc3QgY2FzY2FkZU9wdGlvbiA9IHByb2plY3QuZW52LldCX0VOViA/IGAgLWM9JHtwcm9qZWN0LmVudi5XQl9FTlYgfHwgJ2RldmVsb3BtZW50J31gIDogJyc7XG4gIHJldHVybiB7XG4gICAgcHJpbnRhYmxlOiBgJHtwYWNrYWdlTWFuYWdlcldpdGhSdW59IGRvdGVudiR7Y2FzY2FkZU9wdGlvbn0gLS0gJHtwcmludGFibGVTY3JpcHR9YCxcbiAgICBydW5uYWJsZTogcnVubmFibGVTY3JpcHQsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQ6IHN0cmluZywgcHJvamVjdDogUHJvamVjdCwgcHJlZml4ID0gJ1N0YXJ0Jywgd2VhayA9IGZhbHNlKTogdm9pZCB7XG4gIGNvbnNvbGUuaW5mbyhcbiAgICAnXFxuJyArXG4gICAgICAod2VhayA/IGNoYWxrLmdyYXkgOiBjaGFsay5jeWFuKShjaGFsay5ib2xkKGAke3ByZWZpeH06YCksIG5vcm1hbGl6ZWRTY3JpcHQpICtcbiAgICAgIGNoYWxrLmdyYXkoYCBhdCAke3Byb2plY3QuZGlyUGF0aH1gKVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChcbiAgc2NyaXB0OiBzdHJpbmcsXG4gIGV4aXRDb2RlOiBudW1iZXIgfCBudWxsLFxuICBvcHRzOiBPbWl0PE9wdGlvbnMsICd0aW1lb3V0Jz5cbik6IHZvaWQge1xuICBpZiAoZXhpdENvZGUgPT09IDApIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oY2hhbGsuYm9sZCgnRmluaXNoZWQ6JyksIHNjcmlwdCkpO1xuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5yZWQoY2hhbGsuYm9sZChgRmFpbGVkIChleGl0IGNvZGUgJHtleGl0Q29kZX0pOiBgKSwgc2NyaXB0KSk7XG4gICAgaWYgKG9wdHMuZXhpdElmRmFpbGVkICE9PSBmYWxzZSkge1xuICAgICAgcHJvY2Vzcy5leGl0KGV4aXRDb2RlID8/IDEpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY29uZmlndXJlRW52KFxuICBlbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4sXG4gIG9wdHM6IE9wdGlvbnNcbik6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBuZXdFbnYgPSB7IC4uLmVudiB9O1xuICBpZiAob3B0cy5jaSkge1xuICAgIG5ld0Vudi5DSSA9ICcxJztcbiAgfVxuICBpZiAob3B0cy5mb3JjZUNvbG9yKSB7XG4gICAgbmV3RW52LkZPUkNFX0NPTE9SID0gJzMnO1xuICB9XG4gIHJldHVybiBuZXdFbnY7XG59XG5cbmZ1bmN0aW9uIGZpeEJ1bkNvbW1hbmQoY29tbWFuZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gY2YuIGh0dHBzOi8vZ2l0aHViLmNvbS9vdmVuLXNoL2J1bi9pc3N1ZXMvMTQzNTlcbiAgcmV0dXJuIGNvbW1hbmQuaW5jbHVkZXMoJ25leHQgZGV2JykgfHxcbiAgICAvLyBjZi4gaHR0cHM6Ly9naXRodWIuY29tL292ZW4tc2gvYnVuL2lzc3Vlcy84MjIyXG4gICAgY29tbWFuZC5pbmNsdWRlcygncGxheXdyaWdodCcpIHx8XG4gICAgLy8gXCJidW4gLS1idW4gcHJpc21hIGdlbmVyYXRlXCIgZG9lc24ndCB3b3JrXG4gICAgY29tbWFuZC5pbmNsdWRlcygncHJpc21hJykgfHxcbiAgICBjb21tYW5kLmluY2x1ZGVzKCd0ZXN0L2UyZS1hZGRpdGlvbmFsJylcbiAgICA/IGNvbW1hbmQucmVwbGFjZUFsbCgnYnVuIC0tYnVuJywgJ2J1bicpXG4gICAgOiBjb21tYW5kO1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU2hlbGxDb21tYW5kKGFyZ3M6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGFyZ3MubWFwKChhcmcpID0+IHNoZWxsRXNjYXBlQXJndW1lbnQoYXJnKSkuam9pbignICcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRTaGVsbEVudmlyb25tZW50QXNzaWdubWVudChuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7bmFtZX09JHtzaGVsbEVzY2FwZUFyZ3VtZW50KHZhbHVlKX1gO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2hlbGxFc2NhcGVBcmd1bWVudChhcmc6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiAvXltcXHcuLzo9LEAlKy1dKyQvdS50ZXN0KGFyZykgPyBhcmcgOiBgJyR7YXJnLnJlcGxhY2VBbGwoXCInXCIsIGAnXCInXCInYCl9J2A7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBidWlsZFNoZWxsQ29tbWFuZCB9IGZyb20gJy4uL3V0aWxzL3NoZWxsLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgZml4OiB7XG4gICAgZGVzY3JpcHRpb246ICdGaXggdGhlIGxpbnRpbmcgZXJyb3JzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIGZvcm1hdDoge1xuICAgIGRlc2NyaXB0aW9uOiAnRm9ybWF0IHRoZSBjb2RlJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIHF1aWV0OiB7XG4gICAgZGVzY3JpcHRpb246ICdSZXBvcnQgZXJyb3JzIG9ubHknLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IF9hcmd1bWVudHNCdWlsZGVyID0ge1xuICBmaWxlczoge1xuICAgIGRlc2NyaXB0aW9uOiAnRmlsZSBhbmQgZGlyZWN0b3J5IHBhdGhzIHRvIGxpbnQnLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBMaW50Q29tbWFuZE9wdGlvbnMgPSBJbmZlcnJlZE9wdGlvblR5cGVzPFxuICB0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlciAmIHR5cGVvZiBfYXJndW1lbnRzQnVpbGRlclxuPjtcbmV4cG9ydCB0eXBlIExpbnRDb21tYW5kQXJndiA9IEFyZ3VtZW50c0NhbWVsQ2FzZTxMaW50Q29tbWFuZE9wdGlvbnM+ICYgeyAnLS0nPzogdW5rbm93bltdOyBfOiB1bmtub3duW10gfTtcblxuY29uc3QgYmlvbWVFeHRlbnNpb25zID0gbmV3IFNldChbXG4gICdhc3RybycsXG4gICdjanMnLFxuICAnY3NzJyxcbiAgJ2N0cycsXG4gICdncWwnLFxuICAnaHRtJyxcbiAgJ2h0bWwnLFxuICAnanMnLFxuICAnanNvbicsXG4gICdqc29uNScsXG4gICdqc29uYycsXG4gICdqc3gnLFxuICAnbWpzJyxcbiAgJ210cycsXG4gICdzdmVsdGUnLFxuICAndHMnLFxuICAndHN4JyxcbiAgJ3Z1ZScsXG4gICd5YW1sJyxcbiAgJ3ltbCcsXG5dKTtcbmNvbnN0IGVzbGludEV4dGVuc2lvbnMgPSBuZXcgU2V0KFsnY2pzJywgJ2N0cycsICdqcycsICdqc3gnLCAnbWpzJywgJ210cycsICd0cycsICd0c3gnXSk7XG5jb25zdCBveGxpbnRFeHRlbnNpb25zID0gbmV3IFNldChbLi4uZXNsaW50RXh0ZW5zaW9ucywgJ2FzdHJvJywgJ3N2ZWx0ZScsICd2dWUnXSk7XG5jb25zdCBweXRob25FeHRlbnNpb25zID0gbmV3IFNldChbJ3B5J10pO1xuY29uc3QgZGFydEV4dGVuc2lvbnMgPSBuZXcgU2V0KFsnZGFydCddKTtcbmNvbnN0IG94Zm10RXh0ZW5zaW9ucyA9IG5ldyBTZXQoW1xuICAuLi5veGxpbnRFeHRlbnNpb25zLFxuICAnY3NzJyxcbiAgJ2dxbCcsXG4gICdncmFwaHFsJyxcbiAgJ2hicycsXG4gICdodG0nLFxuICAnaHRtbCcsXG4gICdqc29uJyxcbiAgJ2pzb241JyxcbiAgJ2pzb25jJyxcbiAgJ2xlc3MnLFxuICAnbWQnLFxuICAnbWR4JyxcbiAgJ3Njc3MnLFxuICAndG9tbCcsXG4gICd5YW1sJyxcbiAgJ3ltbCcsXG5dKTtcbmNvbnN0IHByZXR0aWVyRXh0ZW5zaW9ucyA9IG5ldyBTZXQoW1xuICAnY2pzJyxcbiAgJ2NzcycsXG4gICdjdHMnLFxuICAnaHRtJyxcbiAgJ2h0bWwnLFxuICAnamF2YScsXG4gICdqcycsXG4gICdqc29uJyxcbiAgJ2pzb241JyxcbiAgJ2pzb25jJyxcbiAgJ2pzeCcsXG4gICdtZCcsXG4gICdtanMnLFxuICAnbXRzJyxcbiAgJ3Njc3MnLFxuICAndHMnLFxuICAndHN4JyxcbiAgJ3Z1ZScsXG4gICd5YW1sJyxcbiAgJ3ltbCcsXG5dKTtcbmNvbnN0IHByZXR0aWVyT25seUV4dGVuc2lvbnMgPSBuZXcgU2V0KFsuLi5wcmV0dGllckV4dGVuc2lvbnNdLmZpbHRlcigoZXh0KSA9PiAhYmlvbWVFeHRlbnNpb25zLmhhcyhleHQpKSk7XG5jb25zdCBwcmV0dGllckZpeHR1cmVJZ25vcmVQYXR0ZXJuID0gJyEqKi90ZXN0ey0sL31maXh0dXJlcy8qKic7XG5cbmV4cG9ydCBjb25zdCBsaW50Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBMaW50Q29tbWFuZE9wdGlvbnM+ID0ge1xuICBjb21tYW5kOiAnbGludCBbZmlsZXMuLi5dJyxcbiAgZGVzY3JpYmU6ICdMaW50IGNvZGUnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IGxpbnQoYXJndiBhcyBMaW50Q29tbWFuZEFyZ3YpO1xuICAgIGlmIChleGl0Q29kZSkgcHJvY2Vzcy5leGl0KGV4aXRDb2RlKTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsaW50KGFyZ3Y6IExpbnRDb21tYW5kQXJndik6IFByb21pc2U8bnVtYmVyPiB7XG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ1RoaXMgY29tbWFuZCBpcyBub3Qgc3VwcG9ydGVkIG9uIFdpbmRvd3MuJykpO1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YsIGZhbHNlKTtcbiAgaWYgKCFwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIGNvbnN0IGZpbGVzID0gZ2V0TGludFRhcmdldEZpbGVzKGFyZ3YpO1xuICBjb25zdCBsaW50RmlsZVBhdGhzQnlQcm9qZWN0ID0gbmV3IE1hcDxQcm9qZWN0LCBzdHJpbmdbXT4oKTtcbiAgY29uc3Qgb3hmbXRGaWxlUGF0aHNCeVByb2plY3QgPSBuZXcgTWFwPFByb2plY3QsIHN0cmluZ1tdPigpO1xuICBjb25zdCBweXRob25GaWxlUGF0aHNCeVByb2plY3QgPSBuZXcgTWFwPFByb2plY3QsIHN0cmluZ1tdPigpO1xuICBjb25zdCBkYXJ0RmlsZVBhdGhzQnlQcm9qZWN0ID0gbmV3IE1hcDxQcm9qZWN0LCBzdHJpbmdbXT4oKTtcbiAgY29uc3QgcHJldHRpZXJGaWxlUGF0aHM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHBhY2thZ2VKc29uRmlsZVBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgbWlzc2luZ0xpbnRUb29sRm9yRXhwbGljaXRGaWxlcyA9IGZhbHNlO1xuICBsZXQgcHJldHRpZXJBcmdzOiBzdHJpbmdbXTtcbiAgbGV0IHNvcnRQYWNrYWdlSnNvbkFyZ3M6IHN0cmluZ1tdO1xuICBpZiAoZmlsZXMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGxpbnRUYXJnZXRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBmaWxlcy5tYXAoYXN5bmMgKGZpbGUpID0+IHtcbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZmlsZSk7XG4gICAgICAgIGNvbnN0IGZpbGVLaW5kID0gYXdhaXQgZ2V0TGludFRhcmdldEZpbGVLaW5kKGZpbGVQYXRoKTtcbiAgICAgICAgcmV0dXJuIHsgZmlsZUtpbmQsIGZpbGVQYXRoIH07XG4gICAgICB9KVxuICAgICk7XG4gICAgZm9yIChjb25zdCB7IGZpbGVLaW5kLCBmaWxlUGF0aCB9IG9mIGxpbnRUYXJnZXRzKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGZpbGVQYXRoLmVuZHNXaXRoKCcvdGVzdC9maXh0dXJlcycpIHx8XG4gICAgICAgIGZpbGVQYXRoLmluY2x1ZGVzKCcvdGVzdC9maXh0dXJlcy8nKSB8fFxuICAgICAgICBmaWxlUGF0aC5lbmRzV2l0aCgnL3Rlc3QtZml4dHVyZXMnKSB8fFxuICAgICAgICBmaWxlUGF0aC5pbmNsdWRlcygnL3Rlc3QtZml4dHVyZXMvJylcbiAgICAgICkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZXh0ZW5zaW9uID0gcGF0aC5leHRuYW1lKGZpbGVQYXRoKS5zbGljZSgxKTtcbiAgICAgIGlmIChmaWxlUGF0aC5lbmRzV2l0aCgnL3BhY2thZ2UuanNvbicpKSB7XG4gICAgICAgIHBhY2thZ2VKc29uRmlsZVBhdGhzLnB1c2goZmlsZVBhdGgpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHBhY2thZ2VKc29uRmlsZVBhdGhzLnB1c2goLi4uZ2V0RXhwbGljaXRQYWNrYWdlSnNvblBhdGhzKHByb2plY3RzLmRlc2NlbmRhbnRzLCBmaWxlUGF0aCwgZmlsZUtpbmQpKTtcblxuICAgICAgZm9yIChjb25zdCB7IGxpbnRQYXRoLCBwcm9qZWN0IH0gb2YgZ2V0RXhwbGljaXRMaW50VGFyZ2V0cyhwcm9qZWN0cy5kZXNjZW5kYW50cywgZmlsZVBhdGgsIGZpbGVLaW5kKSkge1xuICAgICAgICBpZiAocHJvamVjdC5oYXNQb2V0cnlMb2NrICYmIChmaWxlS2luZCA9PT0gJ2RpcmVjdG9yeScgfHwgcHl0aG9uRXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSkpIHtcbiAgICAgICAgICBjb25zdCBweXRob25GaWxlUGF0aHMgPSBweXRob25GaWxlUGF0aHNCeVByb2plY3QuZ2V0KHByb2plY3QpID8/IFtdO1xuICAgICAgICAgIHB5dGhvbkZpbGVQYXRocy5wdXNoKGxpbnRQYXRoKTtcbiAgICAgICAgICBweXRob25GaWxlUGF0aHNCeVByb2plY3Quc2V0KHByb2plY3QsIHB5dGhvbkZpbGVQYXRocyk7XG4gICAgICAgICAgaWYgKGZpbGVLaW5kICE9PSAnZGlyZWN0b3J5JykgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2plY3QuaGFzUHVic3BlY1lhbWwgJiYgKGZpbGVLaW5kID09PSAnZGlyZWN0b3J5JyB8fCBkYXJ0RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSkpIHtcbiAgICAgICAgICBjb25zdCBkYXJ0RmlsZVBhdGhzID0gZGFydEZpbGVQYXRoc0J5UHJvamVjdC5nZXQocHJvamVjdCkgPz8gW107XG4gICAgICAgICAgZGFydEZpbGVQYXRocy5wdXNoKGxpbnRQYXRoKTtcbiAgICAgICAgICBkYXJ0RmlsZVBhdGhzQnlQcm9qZWN0LnNldChwcm9qZWN0LCBkYXJ0RmlsZVBhdGhzKTtcbiAgICAgICAgICBpZiAoZmlsZUtpbmQgIT09ICdkaXJlY3RvcnknKSBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgcHJvamVjdC5wcmVmZXJyZWRMaW50ZXIgPT09ICdiaW9tZScgfHxcbiAgICAgICAgICBmaWxlS2luZCA9PT0gJ2RpcmVjdG9yeScgfHxcbiAgICAgICAgICBzdXBwb3J0c0xpbnRpbmdFeHRlbnNpb24ocHJvamVjdCwgZXh0ZW5zaW9uKVxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBsaW50RmlsZVBhdGhzID0gbGludEZpbGVQYXRoc0J5UHJvamVjdC5nZXQocHJvamVjdCkgPz8gW107XG4gICAgICAgICAgbGludEZpbGVQYXRocy5wdXNoKGxpbnRQYXRoKTtcbiAgICAgICAgICBsaW50RmlsZVBhdGhzQnlQcm9qZWN0LnNldChwcm9qZWN0LCBsaW50RmlsZVBhdGhzKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IGZvcm1hdHRlclBhdGggb2YgYnVpbGRFeHBsaWNpdEZvcm1hdHRlckFyZ3MocHJvamVjdCwgbGludFBhdGgsIGZpbGVLaW5kLCBleHRlbnNpb24pKSB7XG4gICAgICAgICAgICBpZiAocHJvamVjdC5oYXNPeGZtdCkge1xuICAgICAgICAgICAgICBjb25zdCBveGZtdEZpbGVQYXRocyA9IG94Zm10RmlsZVBhdGhzQnlQcm9qZWN0LmdldChwcm9qZWN0KSA/PyBbXTtcbiAgICAgICAgICAgICAgb3hmbXRGaWxlUGF0aHMucHVzaChmb3JtYXR0ZXJQYXRoKTtcbiAgICAgICAgICAgICAgb3hmbXRGaWxlUGF0aHNCeVByb2plY3Quc2V0KHByb2plY3QsIG94Zm10RmlsZVBhdGhzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHByZXR0aWVyRmlsZVBhdGhzLnB1c2goZm9ybWF0dGVyUGF0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHByZXR0aWVyRXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSB8fCBveGZtdEV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikpIHtcbiAgICAgICAgICBpZiAocHJvamVjdC5oYXNPeGZtdCAmJiBveGZtdEV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikpIHtcbiAgICAgICAgICAgIGNvbnN0IG94Zm10RmlsZVBhdGhzID0gb3hmbXRGaWxlUGF0aHNCeVByb2plY3QuZ2V0KHByb2plY3QpID8/IFtdO1xuICAgICAgICAgICAgb3hmbXRGaWxlUGF0aHMucHVzaChsaW50UGF0aCk7XG4gICAgICAgICAgICBveGZtdEZpbGVQYXRoc0J5UHJvamVjdC5zZXQocHJvamVjdCwgb3hmbXRGaWxlUGF0aHMpO1xuICAgICAgICAgIH0gZWxzZSBpZiAocHJldHRpZXJFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pKSB7XG4gICAgICAgICAgICBwcmV0dGllckZpbGVQYXRocy5wdXNoKGxpbnRQYXRoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoaXNQb3RlbnRpYWxMaW50VGFyZ2V0KGV4dGVuc2lvbikgJiYgIXByb2plY3QucHJlZmVycmVkTGludGVyKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoYE5vIGxpbnRlciBmb3VuZCBmb3IgJHtwcm9qZWN0Lm5hbWV9LiBJbnN0YWxsIEVTTGludCBvciBCaW9tZS5gKSk7XG4gICAgICAgICAgbWlzc2luZ0xpbnRUb29sRm9yRXhwbGljaXRGaWxlcyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcHJldHRpZXJBcmdzID0gWy4uLm5ldyBTZXQocHJldHRpZXJGaWxlUGF0aHMpXTtcbiAgICBzb3J0UGFja2FnZUpzb25BcmdzID0gWy4uLm5ldyBTZXQocGFja2FnZUpzb25GaWxlUGF0aHMpXTtcbiAgfSBlbHNlIHtcbiAgICBwcmV0dGllckFyZ3MgPSBidWlsZFByZXR0aWVyQXJncyhwcm9qZWN0cy5zZWxmLmRpclBhdGgsIHByb2plY3RzLmRlc2NlbmRhbnRzKTtcbiAgICBzb3J0UGFja2FnZUpzb25BcmdzID0gcHJvamVjdHMuZGVzY2VuZGFudHMubWFwKChwKSA9PiBwLnBhY2thZ2VKc29uUGF0aCk7XG4gIH1cblxuICBjb25zdCBsaW50UHJvbWlzZXM6IFByb21pc2U8bnVtYmVyPltdID0gW107XG4gIGNvbnN0IGxpbnRSdW5PcHRpb25zID0geyBleGl0SWZGYWlsZWQ6IGZhbHNlLCBmb3JjZUNvbG9yOiB0cnVlIH0gYXMgY29uc3Q7XG4gIGlmIChmaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgZm9yIChjb25zdCBbcHJvamVjdCwgbGludEZpbGVQYXRoc10gb2YgbGludEZpbGVQYXRoc0J5UHJvamVjdCkge1xuICAgICAgY29uc3QgbGludENvbW1hbmQgPSBidWlsZExpbnRDb21tYW5kKHByb2plY3QsIGFyZ3YsIGxpbnRGaWxlUGF0aHMpO1xuICAgICAgaWYgKCFsaW50Q29tbWFuZCkgY29udGludWU7XG5cbiAgICAgIGxpbnRQcm9taXNlcy5wdXNoKHJ1bldpdGhTcGF3bkluUGFyYWxsZWwobGludENvbW1hbmQsIHByb2plY3QsIGFyZ3YsIGxpbnRSdW5PcHRpb25zKSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgW3Byb2plY3QsIG94Zm10RmlsZVBhdGhzXSBvZiBveGZtdEZpbGVQYXRoc0J5UHJvamVjdCkge1xuICAgICAgbGludFByb21pc2VzLnB1c2gocnVuV2l0aFNwYXduSW5QYXJhbGxlbChidWlsZE94Zm10Q29tbWFuZChveGZtdEZpbGVQYXRocyksIHByb2plY3QsIGFyZ3YsIGxpbnRSdW5PcHRpb25zKSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgW3Byb2plY3QsIHB5dGhvbkZpbGVQYXRoc10gb2YgcHl0aG9uRmlsZVBhdGhzQnlQcm9qZWN0KSB7XG4gICAgICBsaW50UHJvbWlzZXMucHVzaChcbiAgICAgICAgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChidWlsZFBvZXRyeUNvbW1hbmQoYXJndiwgcHl0aG9uRmlsZVBhdGhzKSwgcHJvamVjdCwgYXJndiwgbGludFJ1bk9wdGlvbnMpXG4gICAgICApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtwcm9qZWN0LCBkYXJ0RmlsZVBhdGhzXSBvZiBkYXJ0RmlsZVBhdGhzQnlQcm9qZWN0KSB7XG4gICAgICBsaW50UHJvbWlzZXMucHVzaChydW5XaXRoU3Bhd25JblBhcmFsbGVsKGJ1aWxkRGFydENvbW1hbmQoYXJndiwgZGFydEZpbGVQYXRocyksIHByb2plY3QsIGFyZ3YsIGxpbnRSdW5PcHRpb25zKSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cy5kZXNjZW5kYW50cykge1xuICAgICAgaWYgKHByb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcyAmJiAhcHJvamVjdC5oYXNTb3VyY2VDb2RlKSBjb250aW51ZTtcblxuICAgICAgY29uc3QgbGludENvbW1hbmQgPSBidWlsZExpbnRDb21tYW5kKHByb2plY3QsIGFyZ3YpO1xuICAgICAgaWYgKCFsaW50Q29tbWFuZCkgY29udGludWU7XG5cbiAgICAgIGxpbnRQcm9taXNlcy5wdXNoKHJ1bldpdGhTcGF3bkluUGFyYWxsZWwobGludENvbW1hbmQsIHByb2plY3QsIGFyZ3YsIGxpbnRSdW5PcHRpb25zKSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cy5kZXNjZW5kYW50cykge1xuICAgICAgaWYgKHByb2plY3QuaGFzUG9ldHJ5TG9jaykge1xuICAgICAgICBsaW50UHJvbWlzZXMucHVzaChydW5XaXRoU3Bhd25JblBhcmFsbGVsKGJ1aWxkUG9ldHJ5Q29tbWFuZChhcmd2KSwgcHJvamVjdCwgYXJndiwgbGludFJ1bk9wdGlvbnMpKTtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9qZWN0Lmhhc1B1YnNwZWNZYW1sKSB7XG4gICAgICAgIGxpbnRQcm9taXNlcy5wdXNoKHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoYnVpbGREYXJ0Q29tbWFuZChhcmd2KSwgcHJvamVjdCwgYXJndiwgbGludFJ1bk9wdGlvbnMpKTtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9qZWN0Lmhhc094Zm10ICYmIGFyZ3YuZm9ybWF0KSB7XG4gICAgICAgIGxpbnRQcm9taXNlcy5wdXNoKHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoYnVpbGRPeGZtdENvbW1hbmQoKSwgcHJvamVjdCwgYXJndiwgbGludFJ1bk9wdGlvbnMpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY29uc3QgbGludEV4aXRDb2RlcyA9IGF3YWl0IFByb21pc2UuYWxsKGxpbnRQcm9taXNlcyk7XG5cbiAgaWYgKG1pc3NpbmdMaW50VG9vbEZvckV4cGxpY2l0RmlsZXMgfHwgbGludEV4aXRDb2Rlcy5zb21lKChleGl0Q29kZSkgPT4gZXhpdENvZGUgIT09IDApKSB7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICBpZiAoYXJndi5mb3JtYXQpIHtcbiAgICBpZiAocHJldHRpZXJBcmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIGxpbnRFeGl0Q29kZXMucHVzaChcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChcbiAgICAgICAgICBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAgICAgICAnWUFSTicsXG4gICAgICAgICAgICAncHJldHRpZXInLFxuICAgICAgICAgICAgJy0tY2FjaGUnLFxuICAgICAgICAgICAgJy0tY29sb3InLFxuICAgICAgICAgICAgJy0tbm8tZXJyb3Itb24tdW5tYXRjaGVkLXBhdHRlcm4nLFxuICAgICAgICAgICAgJy0td3JpdGUnLFxuICAgICAgICAgICAgJy0tJyxcbiAgICAgICAgICAgIC4uLnByZXR0aWVyQXJncyxcbiAgICAgICAgICBdKSxcbiAgICAgICAgICBwcm9qZWN0cy5zZWxmLFxuICAgICAgICAgIGFyZ3YsXG4gICAgICAgICAgeyBleGl0SWZGYWlsZWQ6IGZhbHNlLCBmb3JjZUNvbG9yOiB0cnVlIH1cbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHNvcnRQYWNrYWdlSnNvbkFyZ3MubGVuZ3RoID4gMCkge1xuICAgICAgbGludEV4aXRDb2Rlcy5wdXNoKFxuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKFxuICAgICAgICAgIGJ1aWxkU2hlbGxDb21tYW5kKFsnWUFSTicsICdzb3J0LXBhY2thZ2UtanNvbicsICctLScsIC4uLnNvcnRQYWNrYWdlSnNvbkFyZ3NdKSxcbiAgICAgICAgICBwcm9qZWN0cy5zZWxmLFxuICAgICAgICAgIGFyZ3YsXG4gICAgICAgICAgeyBleGl0SWZGYWlsZWQ6IGZhbHNlLCBmb3JjZUNvbG9yOiB0cnVlIH1cbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbGludEV4aXRDb2Rlcy5zb21lKChleGl0Q29kZSkgPT4gZXhpdENvZGUgIT09IDApID8gMSA6IDA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZExpbnRDb21tYW5kKFxuICBwcm9qZWN0OiBQaWNrPFByb2plY3QsICdwcmVmZXJyZWRMaW50ZXInPixcbiAgYXJndjogUGljazxMaW50Q29tbWFuZE9wdGlvbnMsICdmaXgnIHwgJ2Zvcm1hdCc+ICYgUGFydGlhbDxQaWNrPExpbnRDb21tYW5kT3B0aW9ucywgJ3F1aWV0Jz4+LFxuICBmaWxlcz86IHN0cmluZ1tdXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAocHJvamVjdC5wcmVmZXJyZWRMaW50ZXIgPT09ICdiaW9tZScpIHtcbiAgICBsZXQgYmlvbWVBcmdzOiBzdHJpbmdbXTtcbiAgICBpZiAoYXJndi5maXggJiYgYXJndi5mb3JtYXQpIHtcbiAgICAgIGJpb21lQXJncyA9IFsnY2hlY2snLCAnLS1maXgnXTtcbiAgICB9IGVsc2UgaWYgKGFyZ3YuZml4KSB7XG4gICAgICBiaW9tZUFyZ3MgPSBbJ2xpbnQnLCAnLS1maXgnXTtcbiAgICB9IGVsc2UgaWYgKGFyZ3YuZm9ybWF0KSB7XG4gICAgICBiaW9tZUFyZ3MgPSBbJ2Zvcm1hdCcsICctLWZpeCddO1xuICAgIH0gZWxzZSB7XG4gICAgICBiaW9tZUFyZ3MgPSBbJ2xpbnQnXTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICdCVU4nLFxuICAgICAgJ2Jpb21lJyxcbiAgICAgIC4uLmJpb21lQXJncyxcbiAgICAgICctLWNvbG9ycz1mb3JjZScsXG4gICAgICAnLS1uby1lcnJvcnMtb24tdW5tYXRjaGVkJyxcbiAgICAgICctLWZpbGVzLWlnbm9yZS11bmtub3duPXRydWUnLFxuICAgICAgLi4uKGFyZ3YucXVpZXQgPyBbJy0tZGlhZ25vc3RpYy1sZXZlbD1lcnJvciddIDogW10pLFxuICAgICAgLi4uKGZpbGVzPy5sZW5ndGggPyBbJy0tJ10gOiBbXSksXG4gICAgICAuLi4oZmlsZXMgPz8gW10pLFxuICAgIF0pO1xuICB9XG4gIGlmIChwcm9qZWN0LnByZWZlcnJlZExpbnRlciA9PT0gJ2VzbGludCcpIHtcbiAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgJ1lBUk4nLFxuICAgICAgJ2VzbGludCcsXG4gICAgICAnLS1jb2xvcicsXG4gICAgICAuLi4oYXJndi5xdWlldCA/IFsnLS1xdWlldCddIDogW10pLFxuICAgICAgLi4uKGFyZ3YuZml4IHx8IGFyZ3YuZm9ybWF0ID8gWyctLWZpeCddIDogW10pLFxuICAgICAgJy0tJyxcbiAgICAgIC4uLihmaWxlcyA/PyBbJy4nXSksXG4gICAgXSk7XG4gIH1cbiAgaWYgKHByb2plY3QucHJlZmVycmVkTGludGVyID09PSAnb3hsaW50Jykge1xuICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAnWUFSTicsXG4gICAgICAnb3hsaW50JyxcbiAgICAgIC4uLihhcmd2LnF1aWV0ID8gWyctLXF1aWV0J10gOiBbXSksXG4gICAgICAuLi4oYXJndi5maXggPyBbJy0tZml4J10gOiBbXSksXG4gICAgICAuLi4oZmlsZXMgPz8gWycuJ10pLFxuICAgIF0pO1xuICB9XG4gIHJldHVybjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkT3hmbXRDb21tYW5kKGZpbGVzPzogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoWydZQVJOJywgJ294Zm10JywgJy0td3JpdGUnLCAnLS1uby1lcnJvci1vbi11bm1hdGNoZWQtcGF0dGVybicsIC4uLihmaWxlcyA/PyBbJy4nXSldKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUG9ldHJ5Q29tbWFuZChcbiAgYXJndjogUGljazxMaW50Q29tbWFuZE9wdGlvbnMsICdmaXgnIHwgJ2Zvcm1hdCc+ICYgUGFydGlhbDxQaWNrPExpbnRDb21tYW5kT3B0aW9ucywgJ3F1aWV0Jz4+LFxuICBmaWxlcz86IHN0cmluZ1tdXG4pOiBzdHJpbmcge1xuICBjb25zdCB0YXJnZXRzID0gZmlsZXMgJiYgZmlsZXMubGVuZ3RoID4gMCA/IGZpbGVzIDogWycuJ107XG4gIGNvbnN0IGNvbW1hbmRzID1cbiAgICBhcmd2LmZpeCB8fCBhcmd2LmZvcm1hdFxuICAgICAgPyBbXG4gICAgICAgICAgYnVpbGRTaGVsbENvbW1hbmQoWydwb2V0cnknLCAncnVuJywgJ2lzb3J0JywgJy0tcHJvZmlsZScsICdibGFjaycsICctLWZpbHRlci1maWxlcycsIC4uLnRhcmdldHNdKSxcbiAgICAgICAgICBidWlsZFNoZWxsQ29tbWFuZChbJ3BvZXRyeScsICdydW4nLCAnYmxhY2snLCAuLi50YXJnZXRzXSksXG4gICAgICAgICAgYnVpbGRTaGVsbENvbW1hbmQoWydwb2V0cnknLCAncnVuJywgJ2ZsYWtlOCcsIC4uLihhcmd2LnF1aWV0ID8gWyctcSddIDogW10pLCAuLi50YXJnZXRzXSksXG4gICAgICAgIF1cbiAgICAgIDogW2J1aWxkU2hlbGxDb21tYW5kKFsncG9ldHJ5JywgJ3J1bicsICdmbGFrZTgnLCAuLi4oYXJndi5xdWlldCA/IFsnLXEnXSA6IFtdKSwgLi4udGFyZ2V0c10pXTtcbiAgcmV0dXJuIGNvbW1hbmRzLmpvaW4oJyAmJiAnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRGFydENvbW1hbmQoXG4gIGFyZ3Y6IFBpY2s8TGludENvbW1hbmRPcHRpb25zLCAnZml4JyB8ICdmb3JtYXQnPiAmIFBhcnRpYWw8UGljazxMaW50Q29tbWFuZE9wdGlvbnMsICdxdWlldCc+PixcbiAgZmlsZXM/OiBzdHJpbmdbXVxuKTogc3RyaW5nIHtcbiAgY29uc3QgdGFyZ2V0cyA9IGZpbGVzICYmIGZpbGVzLmxlbmd0aCA+IDAgPyBmaWxlcyA6IFsnLiddO1xuICBjb25zdCBjb21tYW5kczogc3RyaW5nW10gPSBbXTtcbiAgaWYgKGFyZ3YuZml4IHx8IGFyZ3YuZm9ybWF0KSB7XG4gICAgY29tbWFuZHMucHVzaChidWlsZFNoZWxsQ29tbWFuZChbJ2RhcnQnLCAnZm9ybWF0JywgLi4udGFyZ2V0c10pKTtcbiAgfVxuICBjb21tYW5kcy5wdXNoKGJ1aWxkU2hlbGxDb21tYW5kKFsnZGFydCcsICdhbmFseXplJywgLi4udGFyZ2V0c10pKTtcbiAgcmV0dXJuIGNvbW1hbmRzLmpvaW4oJyAmJiAnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUHJldHRpZXJBcmdzKFxuICBzZWxmRGlyUGF0aDogc3RyaW5nLFxuICBwcm9qZWN0czogUGljazxQcm9qZWN0LCAnZGlyUGF0aCcgfCAncHJlZmVycmVkTGludGVyJyB8ICdoYXNPeGZtdCc+W11cbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgYXJncyA9IG5ldyBTZXQ8c3RyaW5nPihbYCoqL3suKi8sfSoueyR7Wy4uLnByZXR0aWVyT25seUV4dGVuc2lvbnNdLmpvaW4oJywnKX19YCwgcHJldHRpZXJGaXh0dXJlSWdub3JlUGF0dGVybl0pO1xuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMpIHtcbiAgICBpZiAoIW5lZWRzUHJldHRpZXIocHJvamVjdCkpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgcHJvamVjdFBhdHRlcm4gPSBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAnKiovey4qLyx9Ki57JyArIFsuLi5wcmV0dGllckV4dGVuc2lvbnNdLmpvaW4oJywnKSArICd9Jyk7XG4gICAgYXJncy5hZGQocGF0aC5yZWxhdGl2ZShzZWxmRGlyUGF0aCwgcHJvamVjdFBhdHRlcm4pIHx8IHByb2plY3RQYXR0ZXJuKTtcbiAgfVxuICByZXR1cm4gWy4uLmFyZ3NdO1xufVxuXG5mdW5jdGlvbiBmaW5kT3duaW5nUHJvamVjdChwcm9qZWN0czogUHJvamVjdFtdLCBmaWxlUGF0aDogc3RyaW5nKTogUHJvamVjdCB8IHVuZGVmaW5lZCB7XG4gIGxldCBvd25pbmdQcm9qZWN0OiBQcm9qZWN0IHwgdW5kZWZpbmVkO1xuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMpIHtcbiAgICBpZiAoXG4gICAgICAoZmlsZVBhdGggPT09IHByb2plY3QuZGlyUGF0aCB8fCBmaWxlUGF0aC5zdGFydHNXaXRoKGAke3Byb2plY3QuZGlyUGF0aH0vYCkpICYmXG4gICAgICAoIW93bmluZ1Byb2plY3QgfHwgcHJvamVjdC5kaXJQYXRoLmxlbmd0aCA+IG93bmluZ1Byb2plY3QuZGlyUGF0aC5sZW5ndGgpXG4gICAgKSB7XG4gICAgICBvd25pbmdQcm9qZWN0ID0gcHJvamVjdDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG93bmluZ1Byb2plY3Q7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMaW50VGFyZ2V0RmlsZXMoYXJndjogUGljazxMaW50Q29tbWFuZEFyZ3YsICctLScgfCAnXycgfCAnZmlsZXMnPik6IHN0cmluZ1tdIHtcbiAgY29uc3QgbGludFRhcmdldHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiBbLi4uKGFyZ3YuZmlsZXMgPz8gW10pLCAuLi5hcmd2Ll8uc2xpY2UoMSksIC4uLihhcmd2WyctLSddID8/IFtdKV0pIHtcbiAgICBsaW50VGFyZ2V0cy5hZGQoU3RyaW5nKHZhbHVlKSk7XG4gIH1cbiAgcmV0dXJuIFsuLi5saW50VGFyZ2V0c107XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRMaW50VGFyZ2V0RmlsZUtpbmQoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8J2RpcmVjdG9yeScgfCAnb3RoZXInPiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmcy5zdGF0KGZpbGVQYXRoKTtcbiAgICBpZiAoc3RhdHMuaXNEaXJlY3RvcnkoKSkgcmV0dXJuICdkaXJlY3RvcnknO1xuICB9IGNhdGNoIHtcbiAgICAvLyBNaXNzaW5nIHBhdGhzIGFyZSBoYW5kbGVkIGJ5IHRoZSBkb3duc3RyZWFtIHRvb2xzLlxuICB9XG5cbiAgcmV0dXJuICdvdGhlcic7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRGb3JtYXRFeHBsaWNpdFBhdGhXaXRoUHJldHRpZXIoXG4gIHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ3ByZWZlcnJlZExpbnRlcicgfCAnaGFzT3hmbXQnPixcbiAgZXh0ZW5zaW9uOiBzdHJpbmdcbik6IGJvb2xlYW4ge1xuICBpZiAocHJvamVjdC5oYXNPeGZtdCkgcmV0dXJuIG94Zm10RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKTtcbiAgaWYgKG5lZWRzUHJldHRpZXIocHJvamVjdCkpIHJldHVybiB0cnVlO1xuICByZXR1cm4gKFxuICAgIHByb2plY3QucHJlZmVycmVkTGludGVyID09PSAnYmlvbWUnICYmXG4gICAgIXN1cHBvcnRzTGludGluZ0V4dGVuc2lvbihwcm9qZWN0LCBleHRlbnNpb24pICYmXG4gICAgcHJldHRpZXJFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEV4cGxpY2l0Rm9ybWF0dGVyQXJncyhcbiAgcHJvamVjdDogUGljazxQcm9qZWN0LCAncHJlZmVycmVkTGludGVyJyB8ICdoYXNPeGZtdCc+LFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBmaWxlS2luZDogJ2RpcmVjdG9yeScgfCAnb3RoZXInLFxuICBleHRlbnNpb246IHN0cmluZ1xuKTogc3RyaW5nW10ge1xuICBpZiAoZmlsZUtpbmQgPT09ICdkaXJlY3RvcnknICYmIHByb2plY3QuaGFzT3hmbXQpIHtcbiAgICByZXR1cm4gW2ZpbGVQYXRoXTtcbiAgfVxuICBpZiAoZmlsZUtpbmQgPT09ICdkaXJlY3RvcnknICYmIHByb2plY3QucHJlZmVycmVkTGludGVyID09PSAnYmlvbWUnKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHBhdGguam9pbihmaWxlUGF0aCwgJyoqL3suKi8sfSoueycgKyBbLi4ucHJldHRpZXJPbmx5RXh0ZW5zaW9uc10uam9pbignLCcpICsgJ30nKSxcbiAgICAgIHByZXR0aWVyRml4dHVyZUlnbm9yZVBhdHRlcm4sXG4gICAgXTtcbiAgfVxuICBpZiAoZmlsZUtpbmQgPT09ICdkaXJlY3RvcnknICYmIG5lZWRzUHJldHRpZXIocHJvamVjdCkpIHtcbiAgICByZXR1cm4gW2ZpbGVQYXRoLCBwcmV0dGllckZpeHR1cmVJZ25vcmVQYXR0ZXJuXTtcbiAgfVxuICBpZiAoc2hvdWxkRm9ybWF0RXhwbGljaXRQYXRoV2l0aFByZXR0aWVyKHByb2plY3QsIGV4dGVuc2lvbikpIHtcbiAgICByZXR1cm4gW2ZpbGVQYXRoXTtcbiAgfVxuICByZXR1cm4gW107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFeHBsaWNpdFBhY2thZ2VKc29uUGF0aHMoXG4gIHByb2plY3RzOiBQaWNrPFByb2plY3QsICdkaXJQYXRoJyB8ICdwYWNrYWdlSnNvblBhdGgnPltdLFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBmaWxlS2luZDogJ2RpcmVjdG9yeScgfCAnb3RoZXInXG4pOiBzdHJpbmdbXSB7XG4gIGlmIChmaWxlS2luZCAhPT0gJ2RpcmVjdG9yeScpIHJldHVybiBbXTtcbiAgcmV0dXJuIHByb2plY3RzXG4gICAgLmZpbHRlcihcbiAgICAgIChwcm9qZWN0KSA9PlxuICAgICAgICBwcm9qZWN0LnBhY2thZ2VKc29uUGF0aCA9PT0gcGF0aC5qb2luKGZpbGVQYXRoLCAncGFja2FnZS5qc29uJykgfHxcbiAgICAgICAgcHJvamVjdC5wYWNrYWdlSnNvblBhdGguc3RhcnRzV2l0aChgJHtmaWxlUGF0aH0vYClcbiAgICApXG4gICAgLm1hcCgocHJvamVjdCkgPT4gcHJvamVjdC5wYWNrYWdlSnNvblBhdGgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXhwbGljaXRMaW50VGFyZ2V0cyhcbiAgcHJvamVjdHM6IFByb2plY3RbXSxcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgZmlsZUtpbmQ6ICdkaXJlY3RvcnknIHwgJ290aGVyJ1xuKTogeyBsaW50UGF0aDogc3RyaW5nOyBwcm9qZWN0OiBQcm9qZWN0IH1bXSB7XG4gIGlmIChmaWxlS2luZCA9PT0gJ2RpcmVjdG9yeScpIHtcbiAgICBjb25zdCBkZXNjZW5kYW50UHJvamVjdHMgPSBwcm9qZWN0cy5maWx0ZXIoXG4gICAgICAocHJvamVjdCkgPT4gcHJvamVjdC5kaXJQYXRoID09PSBmaWxlUGF0aCB8fCBwcm9qZWN0LmRpclBhdGguc3RhcnRzV2l0aChgJHtmaWxlUGF0aH0vYClcbiAgICApO1xuICAgIGlmIChkZXNjZW5kYW50UHJvamVjdHMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIGRlc2NlbmRhbnRQcm9qZWN0cy5tYXAoKHByb2plY3QpID0+ICh7IGxpbnRQYXRoOiBwcm9qZWN0LmRpclBhdGgsIHByb2plY3QgfSkpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHByb2plY3QgPSBmaW5kT3duaW5nUHJvamVjdChwcm9qZWN0cywgZmlsZVBhdGgpO1xuICByZXR1cm4gcHJvamVjdCA/IFt7IGxpbnRQYXRoOiBmaWxlUGF0aCwgcHJvamVjdCB9XSA6IFtdO1xufVxuXG5mdW5jdGlvbiBpc1BvdGVudGlhbExpbnRUYXJnZXQoZXh0ZW5zaW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBiaW9tZUV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikgfHxcbiAgICBveGxpbnRFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pIHx8XG4gICAgZXNsaW50RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSB8fFxuICAgIHB5dGhvbkV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikgfHxcbiAgICBkYXJ0RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKVxuICApO1xufVxuXG5mdW5jdGlvbiBzdXBwb3J0c0xpbnRpbmdFeHRlbnNpb24ocHJvamVjdDogUGljazxQcm9qZWN0LCAncHJlZmVycmVkTGludGVyJz4sIGV4dGVuc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmIChwcm9qZWN0LnByZWZlcnJlZExpbnRlciA9PT0gJ2Jpb21lJykgcmV0dXJuIGJpb21lRXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKTtcbiAgaWYgKHByb2plY3QucHJlZmVycmVkTGludGVyID09PSAnb3hsaW50JykgcmV0dXJuIG94bGludEV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbik7XG4gIGlmIChwcm9qZWN0LnByZWZlcnJlZExpbnRlciA9PT0gJ2VzbGludCcpIHJldHVybiBlc2xpbnRFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pO1xuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIG5lZWRzUHJldHRpZXIocHJvamVjdDogUGljazxQcm9qZWN0LCAncHJlZmVycmVkTGludGVyJyB8ICdoYXNPeGZtdCc+KTogYm9vbGVhbiB7XG4gIHJldHVybiAhcHJvamVjdC5oYXNPeGZtdCAmJiAocHJvamVjdC5wcmVmZXJyZWRMaW50ZXIgPT09ICdlc2xpbnQnIHx8IHByb2plY3QucHJlZmVycmVkTGludGVyID09PSAnb3hsaW50Jyk7XG59XG4iLCJpbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgc2hlbGxFc2NhcGVBcmd1bWVudCB9IGZyb20gJy4uL3V0aWxzL3NoZWxsLmpzJztcblxuZXhwb3J0IGNvbnN0IHNjcmlwdE9wdGlvbnNCdWlsZGVyID0ge1xuICB3YXRjaDoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byB3YXRjaCBmaWxlcycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICBhcmdzOiB7XG4gICAgZGVzY3JpcHRpb246ICdBcmd1bWVudHMgZm9yIGNvcmUgY29tbWFuZCcsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgICBhbGlhczogJ2EnLFxuICAgIGRlZmF1bHQ6IFtdLFxuICB9LFxuICAnZG9ja2VyLW9wdGlvbnMnOiB7XG4gICAgZGVzY3JpcHRpb246ICdBcmd1bWVudHMgZm9yIFwiZG9ja2VyIHJ1blwiJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICAgIGRlZmF1bHQ6IFtdLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgU2NyaXB0QXJndiA9IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNjcmlwdE9wdGlvbnNCdWlsZGVyPj4+ICYge1xuICAnLS0nPzogc3RyaW5nW107XG4gIG5vcm1hbGl6ZWRBcmdzVGV4dD86IHN0cmluZztcbiAgbm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0Pzogc3RyaW5nO1xuICBzaWxlbnQ/OiBib29sZWFuO1xuICB2ZXJib3NlPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVBcmdzKFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzY3JpcHRPcHRpb25zQnVpbGRlcj4+PiAmIHsgJy0tJz86IHN0cmluZ1tdIH1cbik6IHZvaWQge1xuICAoYXJndiBhcyBTY3JpcHRBcmd2KS5ub3JtYWxpemVkQXJnc1RleHQgPSBbLi4uKGFyZ3YuYXJncyA/PyBbXSksIC4uLihhcmd2Ll8/LnNsaWNlKDEpID8/IFtdKSwgLi4uKGFyZ3ZbJy0tJ10gPz8gW10pXVxuICAgIC5tYXAoKGFyZykgPT4gc2hlbGxFc2NhcGVBcmd1bWVudChTdHJpbmcoYXJnKSkpXG4gICAgLmpvaW4oJyAnKTtcbiAgKGFyZ3YgYXMgU2NyaXB0QXJndikubm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0ID0gKGFyZ3YuZG9ja2VyT3B0aW9ucyA/PyBbXSlcbiAgICAubWFwKChhcmcpID0+IHNoZWxsRXNjYXBlQXJndW1lbnQoU3RyaW5nKGFyZykpKVxuICAgIC5qb2luKCcgJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b0Rldk51bGwoYXJndjogdW5rbm93bik6IHN0cmluZyB7XG4gIHJldHVybiAoYXJndiBhcyB7IHNpbGVudDogYm9vbGVhbiB9KS5zaWxlbnQgPyBgID4gL2Rldi9udWxsYCA6ICcnO1xufVxuIiwiaW1wb3J0IHsgY3JlYXRlU2VydmVyIH0gZnJvbSAnbm9kZTpuZXQnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcblxuaW1wb3J0IHsga2lsbFBvcnRQcm9jZXNzSW1tZWRpYXRlbHlBbmRPbkV4aXQgfSBmcm9tICcuL3Byb2Nlc3MuanMnO1xuXG4vKipcbiAqIENoZWNrcyB0aGUgZ2l2ZW4gcG9ydCBhbmQga2lsbHMgYW55IHByb2Nlc3MgdXNpbmcgaXQuXG4gKiBOb3RlIHdiIGFsd2F5cyByZXF1aXJlcyBQT1JUIGVudmlyb25tZW50IHZhcmlhYmxlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocmF3UG9ydDogdW5rbm93biwgcHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IHBvcnQgPSBOdW1iZXIocmF3UG9ydCk7XG4gIGlmICghcG9ydCkgdGhyb3cgbmV3IEVycm9yKGBUaGUgZ2l2ZW4gcG9ydCAoJHtwb3J0fSkgaXMgaW52YWxpZC5gKTtcblxuICBhd2FpdCBraWxsUG9ydFByb2Nlc3NJbW1lZGlhdGVseUFuZE9uRXhpdChwb3J0LCBwcm9qZWN0KTtcbiAgcmV0dXJuIHBvcnQ7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgcG9ydCBpcyBhdmFpbGFibGUuXG4gKiBAcGFyYW0gcG9ydCAtIFRoZSBwb3J0IG51bWJlciB0byBjaGVja1xuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdHJ1ZSBpZiB0aGUgcG9ydCBpcyBhdmFpbGFibGUsIGZhbHNlIG90aGVyd2lzZVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaXNQb3J0QXZhaWxhYmxlKHBvcnQ6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAvLyBDaGVjayBib3RoIHN0YWNrcyB0byBjYXRjaCBwcm9jZXNzZXMgYm91bmQgb25seSBvbiBJUHY2IG9yIElQdjQuXG4gIGZvciAoY29uc3QgaG9zdCBvZiBbJzEyNy4wLjAuMScsICc6OiddKSB7XG4gICAgY29uc3QgYXZhaWxhYmxlID0gYXdhaXQgcHJvYmVQb3J0KGhvc3QsIHBvcnQpO1xuICAgIGlmICghYXZhaWxhYmxlKSByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHByb2JlUG9ydChob3N0OiBzdHJpbmcsIHBvcnQ6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCBzZXJ2ZXIgPSBjcmVhdGVTZXJ2ZXIoKTtcblxuICAgIHNlcnZlci5vbmNlKCdlcnJvcicsIChlcnI6IE5vZGVKUy5FcnJub0V4Y2VwdGlvbikgPT4ge1xuICAgICAgaWYgKGVyci5jb2RlID09PSAnRUFERFJJTlVTRScpIHtcbiAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChlcnIuY29kZSA9PT0gJ0VBRk5PU1VQUE9SVCcpIHtcbiAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBzZXJ2ZXIub25jZSgnbGlzdGVuaW5nJywgKCkgPT4ge1xuICAgICAgc2VydmVyLmNsb3NlKCgpID0+IHtcbiAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgc2VydmVyLmxpc3Rlbihwb3J0LCBob3N0KTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgeyBzcGF3blN5bmMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5pbXBvcnQgeyBzcGF3bkFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGtpbGxQb3J0UHJvY2VzcyBmcm9tICdraWxsLXBvcnQnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQsIHByaW50U3RhcnQgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5cbmltcG9ydCB7IGlzUG9ydEF2YWlsYWJsZSB9IGZyb20gJy4vcG9ydC5qcyc7XG5cbmNvbnN0IGtpbGxlZCA9IG5ldyBTZXQ8bnVtYmVyIHwgc3RyaW5nPigpO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24ga2lsbFBvcnRQcm9jZXNzSW1tZWRpYXRlbHlBbmRPbkV4aXQocG9ydDogbnVtYmVyLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGF2YWlsYWJsZSA9IGF3YWl0IGlzUG9ydEF2YWlsYWJsZShwb3J0KTtcbiAgaWYgKCFhdmFpbGFibGUpIHtcbiAgICBhd2FpdCBraWxsUG9ydENvbnRhaW5lckFuZFByb2Nlc3MocG9ydCwgcHJvamVjdCk7XG4gIH1cblxuICBjb25zdCBraWxsRnVuYyA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBpZiAoa2lsbGVkLmhhcyhwb3J0KSkgcmV0dXJuO1xuXG4gICAga2lsbGVkLmFkZChwb3J0KTtcbiAgICBhd2FpdCBraWxsUG9ydENvbnRhaW5lckFuZFByb2Nlc3MocG9ydCwgcHJvamVjdCk7XG4gIH07XG4gIGZvciAoY29uc3Qgc2lnbmFsIG9mIFsnYmVmb3JlRXhpdCcsICdTSUdJTlQnLCAnU0lHVEVSTScsICdTSUdRVUlUJ10pIHtcbiAgICBwcm9jZXNzLm9uKHNpZ25hbCwga2lsbEZ1bmMpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGtpbGxQb3J0Q29udGFpbmVyQW5kUHJvY2Vzcyhwb3J0OiBudW1iZXIsIHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgLy8gV2Ugc2hvdWxkIHN0b3AgRG9ja2VyIGNvbnRhaW5lcnMgZmlyc3QgYmVjYXVzZSBga2lsbC1wb3J0YCBtYXkgZmFpbCB0byBzdG9wIERvY2tlciBjb250YWluZXJzLlxuICBhd2FpdCBzdG9wRG9ja2VyQ29udGFpbmVyQnlQb3J0KHBvcnQsIHByb2plY3QpO1xuICB0cnkge1xuICAgIGF3YWl0IGtpbGxQb3J0UHJvY2Vzcyhwb3J0KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdG9wRG9ja2VyQ29udGFpbmVyQnlJbWFnZU5hbWUoaW1hZ2VOYW1lOiBzdHJpbmcsIHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgcmVtb3ZlRG9ja2VyQ29udGFpbmVycyhbJy0tZmlsdGVyJywgYG5hbWU9JHtpbWFnZU5hbWV9YF0sIHByb2plY3QpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RvcERvY2tlckNvbnRhaW5lckJ5UG9ydChwb3J0OiBudW1iZXIsIHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgcmVtb3ZlRG9ja2VyQ29udGFpbmVycyhbJy0tZmlsdGVyJywgYHB1Ymxpc2g9JHtwb3J0fWBdLCBwcm9qZWN0KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlRG9ja2VyQ29udGFpbmVycyhmaWx0ZXJBcmdzOiBzdHJpbmdbXSwgcHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IGNvbnRhaW5lcklkcyA9IGF3YWl0IGxpc3REb2NrZXJDb250YWluZXJJZHMoZmlsdGVyQXJncywgcHJvamVjdCk7XG4gICAgaWYgKGNvbnRhaW5lcklkcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIGF3YWl0IHNwYXduQXN5bmMoJ2RvY2tlcicsIFsncm0nLCAnLWYnLCAuLi5jb250YWluZXJJZHNdLCB7XG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIGVudjogcHJvamVjdC5lbnYsXG4gICAgfSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBsaXN0RG9ja2VyQ29udGFpbmVySWRzKGZpbHRlckFyZ3M6IHN0cmluZ1tdLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCB7IHN0ZG91dCB9ID0gYXdhaXQgc3Bhd25Bc3luYygnZG9ja2VyJywgWydwcycsICctcScsIC4uLmZpbHRlckFyZ3NdLCB7XG4gICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgZW52OiBwcm9qZWN0LmVudixcbiAgfSk7XG4gIHJldHVybiBzdGRvdXRcbiAgICAuc3BsaXQoL1xccysvKVxuICAgIC5tYXAoKGlkKSA9PiBpZC50cmltKCkpXG4gICAgLmZpbHRlcihCb29sZWFuKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXduU3luY09uRXhpdChzY3JpcHQ6IHN0cmluZywgcHJvamVjdDogUHJvamVjdCk6IHZvaWQge1xuICBjb25zdCBraWxsRnVuYyA9ICgpOiB2b2lkID0+IHtcbiAgICBpZiAoa2lsbGVkLmhhcyhzY3JpcHQpKSByZXR1cm47XG5cbiAgICBraWxsZWQuYWRkKHNjcmlwdCk7XG4gICAgcHJpbnRTdGFydChzY3JpcHQsIHByb2plY3QpO1xuICAgIGNvbnN0IHsgc3RhdHVzIH0gPSBzcGF3blN5bmMoc2NyaXB0LCB7IGN3ZDogcHJvamVjdC5kaXJQYXRoLCBzaGVsbDogdHJ1ZSwgc3RkaW86ICdpbmhlcml0JyB9KTtcbiAgICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKHNjcmlwdCwgc3RhdHVzLCB7fSk7XG4gIH07XG4gIGZvciAoY29uc3Qgc2lnbmFsIG9mIFsnYmVmb3JlRXhpdCcsICdTSUdJTlQnLCAnU0lHVEVSTScsICdTSUdRVUlUJ10pIHtcbiAgICBwcm9jZXNzLm9uKHNpZ25hbCwga2lsbEZ1bmMpO1xuICB9XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHNwYXduU3luY09uRXhpdCB9IGZyb20gJy4uL3V0aWxzL3Byb2Nlc3MuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgRG9ja2VyIGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBEb2NrZXJTY3JpcHRzIHtcbiAgYnVpbGRJbWFnZShwcm9qZWN0OiBQcm9qZWN0LCB2ZXJzaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIGUuZy4gY29kaW5nLWJvb3N0ZXIgdXNlcyBgXCJkb2NrZXIvYnVpbGQvcHJlcGFyZVwiOiBcInRvdWNoIGRyaWxsLXVzZXJzLmNzdlwiLGBcbiAgICBjb25zdCBwcmVmaXggPSBwcm9qZWN0LmRvY2tlclBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZG9ja2VyL2J1aWxkL3ByZXBhcmUnXVxuICAgICAgPyAnWUFSTiBydW4gZG9ja2VyL2J1aWxkL3ByZXBhcmUgJiYgJ1xuICAgICAgOiAnJztcbiAgICByZXR1cm4gYGNkICR7cGF0aC5kaXJuYW1lKHByb2plY3QuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSl9XG4gICAgJiYgJHtwcmVmaXh9WUFSTiB3YiBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkIC0tb3V0c2lkZVxuICAgICYmIFlBUk4gd2IgcmV0cnkgLS0gZG9ja2VyIGJ1aWxkIC10ICR7cHJvamVjdC5kb2NrZXJJbWFnZU5hbWV9XG4gICAgICAgIC0tYnVpbGQtYXJnIEFSQ0g9JChbICQodW5hbWUgLW0pID0gJ2FybTY0JyBdICYmIGVjaG8gYXJtNjQgfHwgZWNobyB4ODZfNjQpXG4gICAgICAgIC0tYnVpbGQtYXJnIFdCX0VOVj0ke3Byb2plY3QuZW52LldCX0VOVn1cbiAgICAgICAgLS1idWlsZC1hcmcgV0JfVkVSU0lPTj0ke3ZlcnNpb259IC5gO1xuICB9XG5cbiAgc3RvcEFuZFN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycsIGFkZGl0aW9uYWxBcmdzID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLnN0b3AocHJvamVjdCl9ICYmICR7dGhpcy5zdGFydChwcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucywgYWRkaXRpb25hbEFyZ3MpfWA7XG4gIH1cblxuICBzdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnLCBhZGRpdGlvbmFsQXJncyA9ICcnKTogc3RyaW5nIHtcbiAgICBzcGF3blN5bmNPbkV4aXQodGhpcy5zdG9wKHByb2plY3QpLCBwcm9qZWN0KTtcbiAgICBjb25zdCBhbGxvY2F0ZVR0eSA9IGFkZGl0aW9uYWxBcmdzLmluY2x1ZGVzKCcvYmluL2Jhc2gnKTtcbiAgICByZXR1cm4gYGRvY2tlciBydW4gLS1ybSAke2FsbG9jYXRlVHR5ID8gJy1pdCAnIDogJyd9LS1wdWJsaXNoICR7cHJvamVjdC5lbnYuUE9SVH06ODA4MCAtLW5hbWUgJHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX0gJHthZGRpdGlvbmFsT3B0aW9uc30gJHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX0gJHthZGRpdGlvbmFsQXJnc31gO1xuICB9XG5cbiAgc3RvcChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYHRydWUgJChkb2NrZXIgcm0gLWYgJChkb2NrZXIgY29udGFpbmVyIGxzIC1xIC1mIG5hbWU9JHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX0pIDI+IC9kZXYvbnVsbClgO1xuICB9XG5cbiAgc3RvcEFsbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgdHJ1ZSAkKGRvY2tlciBybSAtZiAkKGRvY2tlciBwcyAtcSkgMj4gL2Rldi9udWxsKWA7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGRvY2tlclNjcmlwdHMgPSBuZXcgRG9ja2VyU2NyaXB0cygpO1xuIiwiaW1wb3J0IHsgeWFyZ3NPcHRpb25zQnVpbGRlckZvckVudiB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB0eXBlIHsgRW52UmVhZGVyT3B0aW9ucyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcblxuZXhwb3J0IGNvbnN0IHNoYXJlZE9wdGlvbnNCdWlsZGVyID0ge1xuICAuLi55YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52LFxuICAvLyBUaGlzIG9wdGlvbiBpcyBmb3IgZGVidWdnaW5nIG1haW5seS5cbiAgJ3dvcmtpbmctZGlyJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnQSB3b3JraW5nIGRpcmVjdG9yeScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICd3JyxcbiAgfSxcbiAgJ2RyeS1ydW4nOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHNraXAgYWN0dWFsIGNvbW1hbmQgZXhlY3V0aW9uJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgYWxpYXM6IFsnZHJ5JywgJ2QnXSxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndjogRW52UmVhZGVyT3B0aW9ucyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgYXJnczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBvcHRpb25OYW1lIG9mIE9iamVjdC5rZXlzKHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYpKSB7XG4gICAgY29uc3QgdmFsdWUgPSBnZXRPcHRpb25WYWx1ZShhcmd2LCBvcHRpb25OYW1lKTtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcbiAgICAgIGFyZ3MucHVzaCh2YWx1ZSA/IGAtLSR7b3B0aW9uTmFtZX1gIDogYC0tJHtvcHRpb25OYW1lfT1mYWxzZWApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIGFyZ3MucHVzaChgLS0ke29wdGlvbk5hbWV9PSR7dmFsdWV9YCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdmFsdWUpIHtcbiAgICAgICAgYXJncy5wdXNoKGAtLSR7b3B0aW9uTmFtZX09JHtpdGVtfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gYXJncztcbn1cblxuZnVuY3Rpb24gZ2V0T3B0aW9uVmFsdWUoYXJndjogRW52UmVhZGVyT3B0aW9ucywgb3B0aW9uTmFtZTogc3RyaW5nKTogdW5rbm93biB7XG4gIGNvbnN0IGNhbWVsQ2FzZU9wdGlvbk5hbWUgPSBvcHRpb25OYW1lLnJlcGxhY2VBbGwoLy0oW2Etel0pL2csIChfLCBjaGFyYWN0ZXI6IHN0cmluZykgPT4gY2hhcmFjdGVyLnRvVXBwZXJDYXNlKCkpO1xuICBjb25zdCBvcHRpb25zID0gYXJndiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcmV0dXJuIG9wdGlvbnNbb3B0aW9uTmFtZV0gPz8gb3B0aW9uc1tjYW1lbENhc2VPcHRpb25OYW1lXTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuXG5jb25zdCBGSUxFX1NDSEVNQSA9ICdmaWxlOic7XG5cbmNvbnN0IFBPU1NJQkxFX1BSSVNNQV9QQVRIUyA9IFtcbiAgeyBzY2hlbWFQYXRoOiBwYXRoLmpvaW4oJ3ByaXNtYScsICdzY2hlbWEucHJpc21hJyksIGRiUGF0aDogJ3ByaXNtYScgfSxcbiAgeyBzY2hlbWFQYXRoOiBwYXRoLmpvaW4oJ3ByaXNtYScsICdzY2hlbWEnKSwgZGJQYXRoOiBwYXRoLmpvaW4oJ3ByaXNtYScsICdzY2hlbWEnKSB9LFxuICB7IHNjaGVtYVBhdGg6IHBhdGguam9pbignZGInLCAnc2NoZW1hLnByaXNtYScpLCBkYlBhdGg6ICdkYicgfSxcbl07XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBQcmlzbWEgY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFBSSVNNQWAgaXMgcmVwbGFjZWQgd2l0aCBgWUFSTiBwcmlzbWFgIG9yIGBZQVJOIGJsaXR6IHByaXNtYWBcbiAqIGFuZCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgUHJpc21hU2NyaXB0cyB7XG4gIGNsZWFuVXBMaXRlc3RyZWFtKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRpclBhdGggPSBnZXREYXRhYmFzZURpclBhdGgocHJvamVjdCk7XG4gICAgY29uc3QgY2xlYW5VcENvbW1hbmQgPSBidWlsZFdhbENoZWNrcG9pbnRBbmRSZW1vdmVTcWxpdGVTaWRlY2FyRmlsZXNDb21tYW5kKGAke2RpclBhdGh9L3Byb2Quc3FsaXRlM2ApO1xuICAgIC8vIENsZWFudXAgZXhpc3RpbmcgYXJ0aWZhY3RzIHRvIGF2b2lkIGlzc3VlcyB3aXRoIExpdGVzdHJlYW0gcmVwbGljYXRpb24uXG4gICAgLy8gTm90ZSB0aGF0IGRvbid0IG1lcmdlIG11bHRpcGxlIHJtIGNvbW1hbmRzIGludG8gb25lLCBiZWNhdXNlIGlmIG9uZSBmYWlscywgdGhlIHN1YnNlcXVlbnQgb25lcyB3b24ndCBydW4uXG4gICAgcmV0dXJuIGAke2NsZWFuVXBDb21tYW5kfTsgcm0gLVJmICR7ZGlyUGF0aH0vLnByb2Quc3FsaXRlMyogfHwgdHJ1ZWA7XG4gIH1cblxuICBkZXBsb3koXzogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBQUklTTUEgbWlncmF0ZSBkZXBsb3kgJHthZGRpdGlvbmFsT3B0aW9uc31gO1xuICB9XG5cbiAgZGVwbG95Rm9yY2UocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgY29uc3QgZGlyUGF0aCA9IGdldERhdGFiYXNlRGlyUGF0aChwcm9qZWN0KTtcbiAgICBjb25zdCByZW1vdmVEYkNvbW1hbmQgPSBidWlsZFJlbW92ZVNxbGl0ZURiQ29tbWFuZChgJHtkaXJQYXRofS9wcm9kLnNxbGl0ZTNgKTtcbiAgICAvLyBgcHJpc21hIG1pZ3JhdGUgcmVzZXRgIGNhbiBmYWlsIGRlcGVuZGluZyBvbiB0aGUgc3RhdGUgb2YgdGhlIGV4aXN0aW5nIGRhdGFiYXNlLCBzbyB3ZSByZW1vdmUgaXQgZmlyc3QuXG4gICAgLy8gRG9uJ3Qgc2tpcCBcIm1pZ3JhdGUgZGVwbG95XCIgYmVjYXVzZSByZXN0b3JlZCBkYXRhYmFzZSBtYXkgYmUgb2xkZXIgdGhhbiB0aGUgY3VycmVudCBzY2hlbWEuXG4gICAgcmV0dXJuIGAke3JlbW92ZURiQ29tbWFuZH07IFBSSVNNQSBtaWdyYXRlIHJlc2V0IC0tZm9yY2UgLS1za2lwLXNlZWQgJiYgJHtyZW1vdmVEYkNvbW1hbmR9XG4gICAgICAmJiBsaXRlc3RyZWFtIHJlc3RvcmUgLWNvbmZpZyBsaXRlc3RyZWFtLnltbCAtbyAke2RpclBhdGh9L3Byb2Quc3FsaXRlMyAke2RpclBhdGh9L3Byb2Quc3FsaXRlMyAmJiBscyAtYWhsICR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzICYmIEFMTE9XX1RPX1NLSVBfU0VFRD0wIFBSSVNNQSBtaWdyYXRlIGRlcGxveWA7XG4gIH1cblxuICBsaXN0QmFja3Vwcyhwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICBjb25zdCBkaXJQYXRoID0gZ2V0RGF0YWJhc2VEaXJQYXRoKHByb2plY3QpO1xuICAgIHJldHVybiBgbGl0ZXN0cmVhbSBsdHggLWNvbmZpZyBsaXRlc3RyZWFtLnltbCAke2RpclBhdGh9L3Byb2Quc3FsaXRlM2A7XG4gIH1cblxuICBtaWdyYXRlKHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgUFJJU01BIG1pZ3JhdGUgZGVwbG95ICR7YWRkaXRpb25hbE9wdGlvbnN9ICYmIFBSSVNNQSBnZW5lcmF0ZSAmJiAke3RoaXMuc2VlZChwcm9qZWN0KX1gO1xuICB9XG5cbiAgbWlncmF0ZURldihfOiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFBSSVNNQSBtaWdyYXRlIGRldiAke2FkZGl0aW9uYWxPcHRpb25zfWA7XG4gIH1cblxuICByZXNldChwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICAvLyBjZi4gaHR0cHM6Ly93d3cucHJpc21hLmlvL2RvY3MvZ3VpZGVzL2RhdGFiYXNlL3NlZWQtZGF0YWJhc2UjaW50ZWdyYXRlZC1zZWVkaW5nLXdpdGgtcHJpc21hLW1pZ3JhdGVcbiAgICBjb25zdCBzdGVwczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBjbGVhbnVwQ29tbWFuZCA9IGNsZWFuVXBTcWxpdGVEYklmTmVlZGVkKHByb2plY3QpO1xuICAgIGlmIChjbGVhbnVwQ29tbWFuZCkgc3RlcHMucHVzaChjbGVhbnVwQ29tbWFuZCk7XG4gICAgY29uc3QgcmVzZXRDb21tYW5kID0gWydQUklTTUEgbWlncmF0ZSByZXNldCAtLWZvcmNlJywgYWRkaXRpb25hbE9wdGlvbnNdLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJyk7XG4gICAgc3RlcHMucHVzaChyZXNldENvbW1hbmQpO1xuICAgIGlmIChwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHopIHtcbiAgICAgIC8vIEJsaXR6IGRvZXMgbm90IHRyaWdnZXIgc2VlZCBhdXRvbWF0aWNhbGx5LCBzbyB3ZSBuZWVkIHRvIHJ1biBpdCBtYW51YWxseS5cbiAgICAgIHN0ZXBzLnB1c2godGhpcy5zZWVkKHByb2plY3QpKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0ZXBzLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJiYgJyk7XG4gIH1cblxuICByZXN0b3JlKHByb2plY3Q6IFByb2plY3QsIG91dHB1dFBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgZGlyUGF0aCA9IGdldERhdGFiYXNlRGlyUGF0aChwcm9qZWN0KTtcbiAgICByZXR1cm4gYHJtIC1SZiAke291dHB1dFBhdGh9KjsgbGl0ZXN0cmVhbSByZXN0b3JlIC1jb25maWcgbGl0ZXN0cmVhbS55bWwgLW8gJHtvdXRwdXRQYXRofSAke2RpclBhdGh9L3Byb2Quc3FsaXRlM2A7XG4gIH1cblxuICBzZWVkKHByb2plY3Q6IFByb2plY3QsIHNjcmlwdFBhdGg/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHopIHJldHVybiBgWUFSTiBibGl0eiBkYiBzZWVkJHtzY3JpcHRQYXRoID8gYCAtZiAke3NjcmlwdFBhdGh9YCA6ICcnfWA7XG4gICAgaWYgKHNjcmlwdFBhdGgpIHJldHVybiBgQlVOIGJ1aWxkLXRzIHJ1biAke3NjcmlwdFBhdGh9YDtcbiAgICBpZiAoKHByb2plY3QucGFja2FnZUpzb24ucHJpc21hIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCB1bmRlZmluZWQpPy5zZWVkKSByZXR1cm4gYFlBUk4gcHJpc21hIGRiIHNlZWRgO1xuICAgIHJldHVybiBgaWYgWyAtZSBcInByaXNtYS9zZWVkcy50c1wiIF07IHRoZW4gQlVOIGJ1aWxkLXRzIHJ1biBwcmlzbWEvc2VlZHMudHM7IGZpYDtcbiAgfVxuXG4gIHN0dWRpbyhwcm9qZWN0OiBQcm9qZWN0LCBkYlVybE9yUGF0aD86IHN0cmluZywgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgbGV0IHByZWZpeCA9ICcnO1xuICAgIC8vIERlYWwgd2l0aCBQcmlzbWEgaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9wcmlzbWEvc3R1ZGlvL2lzc3Vlcy8xMjczXG4gICAgaWYgKGRiVXJsT3JQYXRoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBuZXcgVVJMKGRiVXJsT3JQYXRoKTtcbiAgICAgICAgcHJlZml4ID0gYERBVEFCQVNFX1VSTD0ke2RiVXJsT3JQYXRofSBgO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGNvbnN0IGFic29sdXRlUGF0aCA9IHBhdGgucmVzb2x2ZShkYlVybE9yUGF0aCk7XG4gICAgICAgIHByZWZpeCA9IGBEQVRBQkFTRV9VUkw9JHtGSUxFX1NDSEVNQX0ke2Fic29sdXRlUGF0aH0gYDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByb2plY3QuZW52LkRBVEFCQVNFX1VSTD8uc3RhcnRzV2l0aChGSUxFX1NDSEVNQSkpIHtcbiAgICAgIGNvbnN0IGJhc2VEaXIgPSBnZXRQcmlzbWFCYXNlRGlyKHByb2plY3QpO1xuICAgICAgaWYgKGJhc2VEaXIpIHtcbiAgICAgICAgY29uc3QgYWJzb2x1dGVQYXRoID0gcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgYmFzZURpciwgcHJvamVjdC5lbnYuREFUQUJBU0VfVVJMLnNsaWNlKEZJTEVfU0NIRU1BLmxlbmd0aCkpO1xuICAgICAgICBwcmVmaXggPSBgREFUQUJBU0VfVVJMPSR7RklMRV9TQ0hFTUF9JHthYnNvbHV0ZVBhdGh9IGA7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBgJHtwcmVmaXh9UFJJU01BIHN0dWRpbyAke2FkZGl0aW9uYWxPcHRpb25zfWA7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0RGF0YWJhc2VEaXJQYXRoKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICByZXR1cm4gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6ID8gJ2RiL21vdW50JyA6ICdwcmlzbWEvbW91bnQnO1xufVxuXG5mdW5jdGlvbiBnZXRQcmlzbWFCYXNlRGlyKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gUE9TU0lCTEVfUFJJU01BX1BBVEhTLmZpbmQoKHsgc2NoZW1hUGF0aCB9KSA9PiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsIHNjaGVtYVBhdGgpKSlcbiAgICA/LmRiUGF0aDtcbn1cblxuZnVuY3Rpb24gYnVpbGRSZW1vdmVTcWxpdGVEYkNvbW1hbmQoZGJQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYHJtIC1SZiBcIiR7ZGJQYXRofVwiKmA7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkV2FsQ2hlY2twb2ludEFuZFJlbW92ZVNxbGl0ZVNpZGVjYXJGaWxlc0NvbW1hbmQoZGJQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYGlmIFsgLWYgXCIke2RiUGF0aH1cIiBdOyB0aGVuIHByaW50ZiAnUFJBR01BIHdhbF9jaGVja3BvaW50KFRSVU5DQVRFKTsnIHwgUFJJU01BIGRiIGV4ZWN1dGUgLS1zdGRpbiAtLXVybCBcIiR7RklMRV9TQ0hFTUF9JHtkYlBhdGh9XCI7IGZpICYmIHJtIC1mIFwiJHtkYlBhdGh9XCIuKiBcIiR7ZGJQYXRofVwiLSpgO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xlYW5VcFNxbGl0ZURiSWZOZWVkZWQocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGRiVXJsID0gcHJvamVjdC5lbnYuREFUQUJBU0VfVVJMO1xuICBpZiAoIWRiVXJsPy5zdGFydHNXaXRoKEZJTEVfU0NIRU1BKSkgcmV0dXJuO1xuXG4gIGNvbnN0IHJhd0RiUGF0aCA9IGRiVXJsLnNsaWNlKEZJTEVfU0NIRU1BLmxlbmd0aCkucmVwbGFjZSgvWz8jXS4qJC8sICcnKTtcbiAgaWYgKCFyYXdEYlBhdGgpIHJldHVybjtcblxuICBjb25zdCBiYXNlRGlyID0gZ2V0UHJpc21hQmFzZURpcihwcm9qZWN0KTtcbiAgY29uc3QgYWJzb2x1dGVQYXRoID0gcGF0aC5pc0Fic29sdXRlKHJhd0RiUGF0aClcbiAgICA/IHJhd0RiUGF0aFxuICAgIDogcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgYmFzZURpciA/PyAnLicsIHJhd0RiUGF0aCk7XG5cbiAgcmV0dXJuIGBybSAtZiBcIiR7YWJzb2x1dGVQYXRofVwiIFwiJHthYnNvbHV0ZVBhdGh9LXdhbFwiIFwiJHthYnNvbHV0ZVBhdGh9LXNobVwiYDtcbn1cblxuZXhwb3J0IGNvbnN0IHByaXNtYVNjcmlwdHMgPSBuZXcgUHJpc21hU2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBUZXN0QXJndiB9IGZyb20gJy4uLy4uL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBidWlsZEVudlJlYWRlck9wdGlvbkFyZ3MgfSBmcm9tICcuLi8uLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBjaGVja0FuZEtpbGxQb3J0UHJvY2VzcyB9IGZyb20gJy4uLy4uL3V0aWxzL3BvcnQuanMnO1xuaW1wb3J0IHsgYnVpbGRTaGVsbENvbW1hbmQsIGJ1aWxkU2hlbGxFbnZpcm9ubWVudEFzc2lnbm1lbnQgfSBmcm9tICcuLi8uLi91dGlscy9zaGVsbC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IHRvRGV2TnVsbCB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL2RvY2tlclNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcHJpc21hU2NyaXB0cyB9IGZyb20gJy4uL3ByaXNtYVNjcmlwdHMuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRlc3RFMkVPcHRpb25zIHtcbiAgLyoqICctLWUyZSBnZW5lcmF0ZScgY2FsbHMgJ2NvZGVnZW4gaHR0cDovL2xvY2FsaG9zdDo4MDgwJyAqL1xuICBwbGF5d3JpZ2h0QXJncz86IHN0cmluZ1tdO1xuICAvKiogUmF3IFBsYXl3cmlnaHQgYXJncyBmb3J3YXJkZWQgYWZ0ZXIgYHdiIHRlc3QgLS0gLi4uYCAqL1xuICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgYW4gYXBwLlxuICogTm90ZSB0aGF0IFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlU2NyaXB0cyB7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2hvdWxkV2FpdEFuZE9wZW5BcHA6IGJvb2xlYW47XG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihzaG91bGRXYWl0QW5kT3BlbkFwcDogYm9vbGVhbikge1xuICAgIHRoaXMuc2hvdWxkV2FpdEFuZE9wZW5BcHAgPSBzaG91bGRXYWl0QW5kT3BlbkFwcDtcbiAgfVxuXG4gIGJ1aWxkRG9ja2VyKHByb2plY3Q6IFByb2plY3QsIHZlcnNpb246IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGRvY2tlclNjcmlwdHMuYnVpbGRJbWFnZShwcm9qZWN0LCB2ZXJzaW9uKTtcbiAgfVxuXG4gIC8vIC0tLS0tLS0tLS0tLSBTVEFSVDogc3RhcnQgY29tbWFuZHMgLS0tLS0tLS0tLS0tXG4gIGFzeW5jIHN0YXJ0RGV2KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGF3YWl0IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHByb2plY3QuZW52LlBPUlQsIHByb2plY3QpO1xuICAgIGlmICghdGhpcy5zaG91bGRXYWl0QW5kT3BlbkFwcCkgcmV0dXJuIHRoaXMuc3RhcnREZXZQcm90ZWN0ZWQocHJvamVjdCwgYXJndik7XG5cbiAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgJ1lBUk4nLFxuICAgICAgJ3diJyxcbiAgICAgICdjb25jdXJyZW50bHknLFxuICAgICAgLi4uYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3YpLFxuICAgICAgJy0ta2lsbC1vdGhlcnMtb24tZmFpbCcsXG4gICAgICB0aGlzLnN0YXJ0RGV2UHJvdGVjdGVkKHByb2plY3QsIGFyZ3YpLFxuICAgICAgdGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0KSxcbiAgICBdKTtcbiAgfVxuICBhc3luYyBzdGFydFByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgYXdhaXQgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocHJvamVjdC5lbnYuUE9SVCwgcHJvamVjdCk7XG4gICAgaWYgKCF0aGlzLnNob3VsZFdhaXRBbmRPcGVuQXBwKSByZXR1cm4gdGhpcy5zdGFydFByb2R1Y3Rpb25Qcm90ZWN0ZWQocHJvamVjdCwgYXJndik7XG5cbiAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgJ1lBUk4nLFxuICAgICAgJ3diJyxcbiAgICAgICdjb25jdXJyZW50bHknLFxuICAgICAgLi4uYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3YpLFxuICAgICAgJy0ta2lsbC1vdGhlcnMtb24tZmFpbCcsXG4gICAgICB0aGlzLnN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0LCBhcmd2KSxcbiAgICAgIHRoaXMud2FpdEFuZE9wZW5BcHAocHJvamVjdCksXG4gICAgXSk7XG4gIH1cbiAgYXN5bmMgc3RhcnRUZXN0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGF3YWl0IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHByb2plY3QuZW52LlBPUlQsIHByb2plY3QpO1xuICAgIHJldHVybiB0aGlzLnN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0LCBhcmd2KTtcbiAgfVxuICBhc3luYyBzdGFydERvY2tlcihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBhd2FpdCBjaGVja0FuZEtpbGxQb3J0UHJvY2Vzcyhwcm9qZWN0LmVudi5QT1JULCBwcm9qZWN0KTtcbiAgICBpZiAoIXRoaXMuc2hvdWxkV2FpdEFuZE9wZW5BcHApIHtcbiAgICAgIHJldHVybiBgJHt0aGlzLmJ1aWxkRG9ja2VyKHByb2plY3QsICdkZXZlbG9wbWVudCcpfVxuICAgICAgJiYgJHtkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChwcm9qZWN0LCBhcmd2Lm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCA/PyAnJywgYXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJycpfWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGAke3RoaXMuYnVpbGREb2NrZXIocHJvamVjdCwgJ2RldmVsb3BtZW50Jyl9XG4gICAgICAmJiAke2J1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICAgJ1lBUk4nLFxuICAgICAgICAnd2InLFxuICAgICAgICAnY29uY3VycmVudGx5JyxcbiAgICAgICAgLi4uYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3YpLFxuICAgICAgICAnLS1raWxsLW90aGVycy1vbi1mYWlsJyxcbiAgICAgICAgZG9ja2VyU2NyaXB0cy5zdG9wQW5kU3RhcnQocHJvamVjdCwgYXJndi5ub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQgPz8gJycsIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnKSxcbiAgICAgICAgdGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0KSxcbiAgICAgIF0pfWA7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWJzdHJhY3Qgc3RhcnREZXZQcm90ZWN0ZWQoXzogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZztcbiAgcHJvdGVjdGVkIHN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICBjb25zdCBlY29zeXN0ZW1Db25maWdQYXRoID0gZmluZEVjb3N5c3RlbUNvbmZpZ1BhdGgocHJvamVjdCk7XG4gICAgY29uc3QgY29tbWFuZHMgPVxuICAgICAgZWNvc3lzdGVtQ29uZmlnUGF0aCA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8gW1xuICAgICAgICAgICAgYFlBUk4gd2IgYnVpbGRJZk5lZWRlZCAke2FyZ3YudmVyYm9zZSA/ICctLXZlcmJvc2UnIDogJyd9YC50cmltKCksXG4gICAgICAgICAgICBgbm9kZSBkaXN0L2luZGV4LmpzICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YC50cmltKCksXG4gICAgICAgICAgXVxuICAgICAgICA6IFtwcm9qZWN0LmJ1aWxkQ29tbWFuZCwgYHBtMi1ydW50aW1lIHN0YXJ0IC0tbm8tYXV0b3Jlc3RhcnQgJHtlY29zeXN0ZW1Db25maWdQYXRofWBdO1xuXG4gICAgcmV0dXJuIFsuLi4ocHJvamVjdC5oYXNQcmlzbWEgPyBwcmlzbWFTY3JpcHRzLm1pZ3JhdGUocHJvamVjdCkuc3BsaXQoJyYmJykgOiBbXSksIC4uLmNvbW1hbmRzXVxuICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgLm1hcCgoY21kKSA9PiBgJHtjbWR9ICR7dG9EZXZOdWxsKGFyZ3YpfWAudHJpbSgpKVxuICAgICAgLmpvaW4oJyAmJiAnKTtcbiAgfVxuICAvLyAtLS0tLS0tLS0tLS0gRU5EOiBzdGFydCBjb21tYW5kcyAtLS0tLS0tLS0tLS1cblxuICAvLyAtLS0tLS0tLS0tLS0gU1RBUlQ6IHRlc3QgKGUyZSkgY29tbWFuZHMgLS0tLS0tLS0tLS0tXG4gIHRlc3RFMkVEZXYocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YsIG9wdGlvbnM6IFRlc3RFMkVPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy50ZXN0RTJFUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YsIHRoaXMuc3RhcnREZXZQcm90ZWN0ZWQocHJvamVjdCwgYXJndiksIG9wdGlvbnMpO1xuICB9XG4gIHRlc3RFMkVQcm9kdWN0aW9uKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RBcmd2LCBvcHRpb25zOiBUZXN0RTJFT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMudGVzdEUyRVByb3RlY3RlZChwcm9qZWN0LCBhcmd2LCB0aGlzLnN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0LCBhcmd2KSwgb3B0aW9ucyk7XG4gIH1cbiAgdGVzdEUyRURvY2tlcihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndiwgb3B0aW9uczogVGVzdEUyRU9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLnRlc3RFMkVQcm90ZWN0ZWQocHJvamVjdCwgYXJndiwgZG9ja2VyU2NyaXB0cy5zdG9wQW5kU3RhcnQocHJvamVjdCksIG9wdGlvbnMpO1xuICB9XG4gIGFzeW5jIHRlc3RTdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBhd2FpdCBjaGVja0FuZEtpbGxQb3J0UHJvY2Vzcyhwcm9qZWN0LmVudi5QT1JULCBwcm9qZWN0KTtcbiAgICAvLyBVc2UgZW1wdHkgTk9ERV9FTlYgdG8gYXZvaWQgXCJwcm9kdWN0aW9uXCIgbW9kZSBpbiBzb21lIGZyYW1ld29ya3MgbGlrZSBCbGl0ei5qcy5cbiAgICByZXR1cm4gYCR7YnVpbGRTaGVsbEVudmlyb25tZW50QXNzaWdubWVudCgnTk9ERV9FTlYnLCAnJyl9ICR7YnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgJ1lBUk4nLFxuICAgICAgJ3diJyxcbiAgICAgICdjb25jdXJyZW50bHknLFxuICAgICAgLi4uYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3YpLFxuICAgICAgJy0ta2lsbC1vdGhlcnMnLFxuICAgICAgJy0tc3VjY2VzcycsXG4gICAgICAnZmlyc3QnLFxuICAgICAgdGhpcy5zdGFydERldlByb3RlY3RlZChwcm9qZWN0LCBhcmd2KSxcbiAgICAgIHRoaXMud2FpdEFwcChwcm9qZWN0KSxcbiAgICBdKX1gO1xuICB9XG5cbiAgYXN5bmMgdGVzdEUyRVByb3RlY3RlZChcbiAgICBwcm9qZWN0OiBQcm9qZWN0LFxuICAgIGFyZ3Y6IFRlc3RBcmd2LFxuICAgIHN0YXJ0Q29tbWFuZDogc3RyaW5nLFxuICAgIHsgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MgPSBbXSwgcGxheXdyaWdodEFyZ3MgPSBbJ3Rlc3QnLCAndGVzdC9lMmUvJ10gfTogVGVzdEUyRU9wdGlvbnNcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBwb3J0ID0gYXdhaXQgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocHJvamVjdC5lbnYuUE9SVCwgcHJvamVjdCk7XG4gICAgY29uc3Qgc3VmZml4ID0gcHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ3Rlc3QvZTJlLWFkZGl0aW9uYWwnXSA/ICcgJiYgWUFSTiB0ZXN0L2UyZS1hZGRpdGlvbmFsJyA6ICcnO1xuICAgIGNvbnN0IHBsYXl3cmlnaHRDb21tYW5kID0gYnVpbGRQbGF5d3JpZ2h0Q29tbWFuZChwbGF5d3JpZ2h0QXJncywgYXJndi50YXJnZXRzLCBhcmd2LmJhaWwsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzKTtcbiAgICBpZiAocHJvamVjdC5za2lwTGF1bmNoaW5nU2VydmVyRm9yUGxheXdyaWdodCkge1xuICAgICAgcmV0dXJuIGAke3BsYXl3cmlnaHRDb21tYW5kfSR7c3VmZml4fWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICdZQVJOJyxcbiAgICAgICd3YicsXG4gICAgICAnY29uY3VycmVudGx5JyxcbiAgICAgIC4uLmJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyhhcmd2KSxcbiAgICAgICctLWtpbGwtb3RoZXJzJyxcbiAgICAgICctLXN1Y2Nlc3MnLFxuICAgICAgJ2ZpcnN0JyxcbiAgICAgIGAke3N0YXJ0Q29tbWFuZH0gJiYgZXhpdCAxYCxcbiAgICAgIGB3YWl0LW9uIC10IDYwMDAwMCAtaSAyMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH1cbiAgICAgICAgJiYgJHtwbGF5d3JpZ2h0Q29tbWFuZH0ke3N1ZmZpeH1gLFxuICAgIF0pO1xuICB9XG4gIC8vIC0tLS0tLS0tLS0tLSBFTkQ6IHRlc3QgKGUyZSkgY29tbWFuZHMgLS0tLS0tLS0tLS0tXG5cbiAgdGVzdFVuaXQocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YpOiBzdHJpbmcge1xuICAgIGNvbnN0IHRhcmdldHMgPSBhcmd2LnRhcmdldHM/Lm1hcChTdHJpbmcpO1xuICAgIGlmIChwcm9qZWN0Lmhhc1ZpdGVzdCkge1xuICAgICAgLy8gU2luY2UgdGhpcyBjb21tYW5kIGlzIHJlZmVycmVkIGZyb20gb3RoZXIgY29tbWFuZHMsIHdlIGhhdmUgdG8gdXNlIFwidml0ZXN0IHJ1blwiIChub24taW50ZXJhY3RpdmUgbW9kZSkuXG4gICAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgICAnWUFSTicsXG4gICAgICAgICd2aXRlc3QnLFxuICAgICAgICAncnVuJyxcbiAgICAgICAgLi4uKHRhcmdldHM/Lmxlbmd0aCA/IHRhcmdldHMgOiBbJ3Rlc3QvdW5pdC8nXSksXG4gICAgICAgICctLWNvbG9yJyxcbiAgICAgICAgJy0tcGFzc1dpdGhOb1Rlc3RzJyxcbiAgICAgICAgJy0tYWxsb3dPbmx5JyxcbiAgICAgICAgJy0td2F0Y2g9ZmFsc2UnLFxuICAgICAgICAuLi4oYXJndi5iYWlsID8gWyctLWJhaWw9MSddIDogW10pLFxuICAgICAgXSk7XG4gICAgfSBlbHNlIGlmIChwcm9qZWN0LmlzQnVuQXZhaWxhYmxlKSB7XG4gICAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgICAnYnVuJyxcbiAgICAgICAgJ3Rlc3QnLFxuICAgICAgICAuLi4odGFyZ2V0cz8ubGVuZ3RoID8gdGFyZ2V0cyA6IFsndGVzdC91bml0LyddKSxcbiAgICAgICAgLi4uKGFyZ3YuYmFpbCA/IFsnLS1iYWlsJ10gOiBbXSksXG4gICAgICBdKTtcbiAgICB9XG4gICAgcmV0dXJuICdlY2hvIFwiTm8gdGVzdHMuXCInO1xuICB9XG5cbiAgcHJvdGVjdGVkIHdhaXRBcHAocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgY29uc3QgcG9ydCA9IHByb2plY3QuZW52LlBPUlQ7XG4gICAgcmV0dXJuIGB3YWl0LW9uIC10IDEwMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDEwMDAwIC1pIDUwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCAxMDAwMCAtaSAxMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDEwMDAwIC1pIDIwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgMjAwMDAgLWkgNDAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCA2MDAwMCAtaSA1MDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDkwMDAwIC1pIDEwMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH1gO1xuICB9XG5cbiAgcHJvdGVjdGVkIHdhaXRBbmRPcGVuQXBwKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBvcnQgPSBwcm9qZWN0LmVudi5QT1JUO1xuICAgIHJldHVybiBgJHt0aGlzLndhaXRBcHAoXG4gICAgICBwcm9qZWN0XG4gICAgKX0gfHwgd2FpdC1vbiBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9ICYmIG9wZW4tY2xpIGh0dHA6Ly9cXCR7SE9TVDotbG9jYWxob3N0fToke3BvcnR9YDtcbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kRWNvc3lzdGVtQ29uZmlnUGF0aChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gcHJvamVjdC5maW5kRmlsZSgnZWNvc3lzdGVtLmNvbmZpZy5janMnKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUGxheXdyaWdodENvbW1hbmQoXG4gIHBsYXl3cmlnaHRBcmdzOiBzdHJpbmdbXSxcbiAgdGFyZ2V0czogVGVzdEFyZ3ZbJ3RhcmdldHMnXSxcbiAgYmFpbD86IGJvb2xlYW4sXG4gIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzOiBzdHJpbmdbXSA9IFtdXG4pOiBzdHJpbmcge1xuICBjb25zdCBiYXNlID0gWydCVU4nLCAncGxheXdyaWdodCddO1xuICBjb25zdCBub3JtYWxpemVkVGFyZ2V0cyA9IHRhcmdldHM/Lm1hcChTdHJpbmcpO1xuICBpZiAocGxheXdyaWdodEFyZ3NbMF0gIT09ICd0ZXN0JyB8fCAhbm9ybWFsaXplZFRhcmdldHM/Lmxlbmd0aCkge1xuICAgIHJldHVybiBhcHBlbmRQbGF5d3JpZ2h0QmFpbE9wdGlvbihbLi4uYmFzZSwgLi4ucGxheXdyaWdodEFyZ3MsIC4uLmZvcndhcmRlZFBsYXl3cmlnaHRBcmdzXSwgYmFpbCk7XG4gIH1cblxuICBjb25zdCByZXN0ID0gcGxheXdyaWdodEFyZ3Muc2xpY2UoMSk7XG4gIGNvbnN0IGV4cGxpY2l0VGFyZ2V0SW5kZXhlcyA9IGZpbmRFeHBsaWNpdFBsYXl3cmlnaHRUYXJnZXRJbmRleGVzKHJlc3QpO1xuICBjb25zdCByZXN0V2l0aG91dEV4cGxpY2l0VGFyZ2V0ID1cbiAgICBleHBsaWNpdFRhcmdldEluZGV4ZXMubGVuZ3RoID09PSAwID8gcmVzdCA6IHJlc3QuZmlsdGVyKChfLCBpbmRleCkgPT4gIWV4cGxpY2l0VGFyZ2V0SW5kZXhlcy5pbmNsdWRlcyhpbmRleCkpO1xuICByZXR1cm4gYXBwZW5kUGxheXdyaWdodEJhaWxPcHRpb24oXG4gICAgWy4uLmJhc2UsICd0ZXN0JywgLi4ubm9ybWFsaXplZFRhcmdldHMsIC4uLnJlc3RXaXRob3V0RXhwbGljaXRUYXJnZXQsIC4uLmZvcndhcmRlZFBsYXl3cmlnaHRBcmdzXSxcbiAgICBiYWlsXG4gICk7XG59XG5cbmZ1bmN0aW9uIGFwcGVuZFBsYXl3cmlnaHRCYWlsT3B0aW9uKGNvbW1hbmRBcmdzOiBzdHJpbmdbXSwgYmFpbD86IGJvb2xlYW4pOiBzdHJpbmcge1xuICBjb25zdCBwbGF5d3JpZ2h0SW5kZXggPSBjb21tYW5kQXJncy5pbmRleE9mKCdwbGF5d3JpZ2h0Jyk7XG4gIGNvbnN0IGlzUGxheXdyaWdodFRlc3RDb21tYW5kID0gcGxheXdyaWdodEluZGV4ICE9PSAtMSAmJiBjb21tYW5kQXJnc1twbGF5d3JpZ2h0SW5kZXggKyAxXSA9PT0gJ3Rlc3QnO1xuICBpZiAoIWJhaWwgfHwgIWlzUGxheXdyaWdodFRlc3RDb21tYW5kKSB7XG4gICAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKGNvbW1hbmRBcmdzKTtcbiAgfVxuICBpZiAoY29tbWFuZEFyZ3Muc29tZSgoYXJnKSA9PiBhcmcgPT09ICctLW1heC1mYWlsdXJlcycgfHwgYXJnLnN0YXJ0c1dpdGgoJy0tbWF4LWZhaWx1cmVzPScpKSkge1xuICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChjb21tYW5kQXJncyk7XG4gIH1cbiAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFsuLi5jb21tYW5kQXJncywgJy0tbWF4LWZhaWx1cmVzPTEnXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kRXhwbGljaXRQbGF5d3JpZ2h0VGFyZ2V0SW5kZXhlcyhhcmdzOiBzdHJpbmdbXSk6IG51bWJlcltdIHtcbiAgbGV0IHBlbmRpbmdWYWx1ZU1vZGU6ICdvcHRpb25hbCcgfCAncmVxdWlyZWQnIHwgdW5kZWZpbmVkO1xuICBjb25zdCB0YXJnZXRJbmRleGVzOiBudW1iZXJbXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgW2luZGV4LCBhcmddIG9mIGFyZ3MuZW50cmllcygpKSB7XG4gICAgaWYgKHBlbmRpbmdWYWx1ZU1vZGUpIHtcbiAgICAgIGlmIChwZW5kaW5nVmFsdWVNb2RlID09PSAncmVxdWlyZWQnIHx8ICFhcmcuc3RhcnRzV2l0aCgnLScpKSB7XG4gICAgICAgIHBlbmRpbmdWYWx1ZU1vZGUgPSB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgcGVuZGluZ1ZhbHVlTW9kZSA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAoYXJnID09PSAnLS0nKSB7XG4gICAgICByZXR1cm4gWy4uLnRhcmdldEluZGV4ZXMsIC4uLmFyZ3Muc2xpY2UoaW5kZXggKyAxKS5tYXAoKF8sIG9mZnNldCkgPT4gaW5kZXggKyAxICsgb2Zmc2V0KV07XG4gICAgfVxuICAgIGlmIChhcmcuc3RhcnRzV2l0aCgnLS0nKSkge1xuICAgICAgaWYgKGFyZy5pbmNsdWRlcygnPScpKSBjb250aW51ZTtcbiAgICAgIGlmIChQTEFZV1JJR0hUX1RFU1RfT1BUSU9OU19XSVRIX1JFUVVJUkVEX1ZBTFVFUy5oYXMoYXJnKSkge1xuICAgICAgICBwZW5kaW5nVmFsdWVNb2RlID0gJ3JlcXVpcmVkJztcbiAgICAgIH0gZWxzZSBpZiAoUExBWVdSSUdIVF9URVNUX09QVElPTlNfV0lUSF9PUFRJT05BTF9WQUxVRVMuaGFzKGFyZykpIHtcbiAgICAgICAgcGVuZGluZ1ZhbHVlTW9kZSA9ICdvcHRpb25hbCc7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGFyZy5zdGFydHNXaXRoKCctJykgJiYgYXJnICE9PSAnLScpIHtcbiAgICAgIGNvbnN0IHNob3J0T3B0aW9uID0gYXJnLnNsaWNlKDAsIDIpO1xuICAgICAgaWYgKGFyZy5sZW5ndGggPT09IDIgJiYgUExBWVdSSUdIVF9URVNUX1NIT1JUX09QVElPTlNfV0lUSF9SRVFVSVJFRF9WQUxVRVMuaGFzKHNob3J0T3B0aW9uKSkge1xuICAgICAgICBwZW5kaW5nVmFsdWVNb2RlID0gJ3JlcXVpcmVkJztcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICB0YXJnZXRJbmRleGVzLnB1c2goaW5kZXgpO1xuICB9XG5cbiAgcmV0dXJuIHRhcmdldEluZGV4ZXM7XG59XG5cbmNvbnN0IFBMQVlXUklHSFRfVEVTVF9PUFRJT05TX1dJVEhfUkVRVUlSRURfVkFMVUVTID0gbmV3IFNldChbXG4gICctLWJyb3dzZXInLFxuICAnLS1jb25maWcnLFxuICAnLS1ncmVwJyxcbiAgJy0tZ3JlcC1pbnZlcnQnLFxuICAnLS1nbG9iYWwtdGltZW91dCcsXG4gICctLW1heC1mYWlsdXJlcycsXG4gICctLW91dHB1dCcsXG4gICctLXByb2plY3QnLFxuICAnLS1yZXBlYXQtZWFjaCcsXG4gICctLXJlcG9ydGVyJyxcbiAgJy0tcmV0cmllcycsXG4gICctLXNoYXJkJyxcbiAgJy0tdGVzdC1saXN0JyxcbiAgJy0tdGVzdC1saXN0LWludmVydCcsXG4gICctLXRpbWVvdXQnLFxuICAnLS10cmFjZScsXG4gICctLXRzY29uZmlnJyxcbiAgJy0tdWktaG9zdCcsXG4gICctLXVpLXBvcnQnLFxuICAnLS11aS10aXRsZScsXG4gICctLXdvcmtlcnMnLFxuXSk7XG5cbmNvbnN0IFBMQVlXUklHSFRfVEVTVF9PUFRJT05TX1dJVEhfT1BUSU9OQUxfVkFMVUVTID0gbmV3IFNldChbXG4gICctLW9ubHktY2hhbmdlZCcsXG4gICctLXVwZGF0ZS1zbmFwc2hvdHMnLFxuICAnLS11cGRhdGUtc291cmNlLW1ldGhvZCcsXG5dKTtcblxuY29uc3QgUExBWVdSSUdIVF9URVNUX1NIT1JUX09QVElPTlNfV0lUSF9SRVFVSVJFRF9WQUxVRVMgPSBuZXcgU2V0KFsnLWMnLCAnLWcnLCAnLWonXSk7XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgQmxpdHouanMgY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIEJsaXR6U2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIodHJ1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RhcnREZXZQcm90ZWN0ZWQoXzogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBibGl0eiBkZXYgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBibGl0elNjcmlwdHMgPSBuZXcgQmxpdHpTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFRlc3RBcmd2IH0gZnJvbSAnLi4vLi4vY29tbWFuZHMvdGVzdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyB9IGZyb20gJy4uLy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzIH0gZnJvbSAnLi4vLi4vdXRpbHMvcG9ydC5qcyc7XG5pbXBvcnQgeyBidWlsZFNoZWxsQ29tbWFuZCB9IGZyb20gJy4uLy4uL3V0aWxzL3NoZWxsLmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cywgdHlwZSBUZXN0RTJFT3B0aW9ucyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgYW4gYXBwIHRoYXQgdXRpbGl6ZXMgYW4gSFRUUCBzZXJ2ZXIgbGlrZSBleHByZXNzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBIdHRwU2VydmVyU2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoZmFsc2UpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0YXJ0RGV2UHJvdGVjdGVkKF86IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWUFSTiBidWlsZC10cyBydW4gJHthcmd2LndhdGNoID8gJy0td2F0Y2gnIDogJyd9IHNyYy9pbmRleC50cyAtLSAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWA7XG4gIH1cblxuICBhc3luYyB0ZXN0RTJFUHJvdGVjdGVkKFxuICAgIHByb2plY3Q6IFByb2plY3QsXG4gICAgYXJndjogVGVzdEFyZ3YsXG4gICAgc3RhcnRDb21tYW5kOiBzdHJpbmcsXG4gICAgb3B0aW9uczogVGVzdEUyRU9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmIChwcm9qZWN0Lmhhc1BsYXl3cmlnaHRDb25maWcpIHtcbiAgICAgIHJldHVybiBzdXBlci50ZXN0RTJFUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YsIHN0YXJ0Q29tbWFuZCwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgY29uc3QgcG9ydCA9IGF3YWl0IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHByb2plY3QuZW52LlBPUlQsIHByb2plY3QpO1xuICAgIGNvbnN0IHN1ZmZpeCA9IHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWyd0ZXN0L2UyZS1hZGRpdGlvbmFsJ10gPyAnICYmIFlBUk4gdGVzdC9lMmUtYWRkaXRpb25hbCcgOiAnJztcbiAgICBjb25zdCB0YXJnZXRzID0gYXJndi50YXJnZXRzPy5tYXAoU3RyaW5nKTtcbiAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgJ1lBUk4nLFxuICAgICAgJ3diJyxcbiAgICAgICdjb25jdXJyZW50bHknLFxuICAgICAgLi4uYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3YpLFxuICAgICAgJy0ta2lsbC1vdGhlcnMnLFxuICAgICAgJy0tc3VjY2VzcycsXG4gICAgICAnZmlyc3QnLFxuICAgICAgYCR7c3RhcnRDb21tYW5kfSAmJiBleGl0IDFgLFxuICAgICAgYHdhaXQtb24gLXQgNjAwMDAwIC1pIDIwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fVxuICAgICAgICAmJiAke2J1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICAgICAndml0ZXN0JyxcbiAgICAgICAgICAncnVuJyxcbiAgICAgICAgICAuLi4odGFyZ2V0cyAmJiB0YXJnZXRzLmxlbmd0aCA+IDAgPyB0YXJnZXRzIDogWyd0ZXN0L2UyZS8nXSksXG4gICAgICAgICAgJy0tY29sb3InLFxuICAgICAgICAgICctLXBhc3NXaXRoTm9UZXN0cycsXG4gICAgICAgICAgJy0tYWxsb3dPbmx5JyxcbiAgICAgICAgICAuLi4oYXJndi5iYWlsID8gWyctLWJhaWw9MSddIDogW10pLFxuICAgICAgICBdKX0ke3N1ZmZpeH1gLFxuICAgIF0pO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBodHRwU2VydmVyU2NyaXB0cyA9IG5ldyBIdHRwU2VydmVyU2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcblxuaW1wb3J0IHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIE5leHQuanMgY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIE5leHRTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcih0cnVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzdGFydERldlByb3RlY3RlZChfOiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYG5leHQgZGV2IC0tdHVyYm9wYWNrICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgbmV4dFNjcmlwdHMgPSBuZXcgTmV4dFNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgU0VSVkVSX0xPR19GSUxFIH0gZnJvbSAnLi4vLi4vdXRpbHMvbG9nLmpzJztcbmltcG9ydCB7IHJ1bnRpbWVXaXRoQXJncyB9IGZyb20gJy4uLy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBkb2NrZXJTY3JpcHRzIH0gZnJvbSAnLi4vZG9ja2VyU2NyaXB0cy5qcyc7XG5cbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBhbiBhcHAgdGhhdCB1dGlsaXplcyBhbiBIVFRQIHNlcnZlciBsaWtlIGV4cHJlc3MuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIFBsYWluQXBwU2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoZmFsc2UpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN0YXJ0RGV2UHJvdGVjdGVkKF8xOiBQcm9qZWN0LCBfMjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZC4nKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0RGV2KF86IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoXG4gICAgICBgWUFSTiBidWlsZC10cyBydW4gJHthcmd2LndhdGNoID8gJy0td2F0Y2gnIDogJyd9IHNyYy9pbmRleC50cyAtLSAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWBcbiAgICApO1xuICB9XG4gIG92ZXJyaWRlIHN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFxuICAgICAgYCR7cHJvamVjdC5idWlsZENvbW1hbmR9ICYmICR7cnVudGltZVdpdGhBcmdzfSBkaXN0L2luZGV4LmpzICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9IHwgdGVlICR7U0VSVkVSX0xPR19GSUxFfWBcbiAgICApO1xuICB9XG4gIG92ZXJyaWRlIHN0YXJ0VGVzdCgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYGVjaG8gJ2RvIG5vdGhpbmcuJ2ApO1xuICB9XG4gIG92ZXJyaWRlIHN0YXJ0RG9ja2VyKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoXG4gICAgICBgJHt0aGlzLmJ1aWxkRG9ja2VyKHByb2plY3QsICdkZXZlbG9wbWVudCcpfSAmJiAke2RvY2tlclNjcmlwdHMuc3RvcEFuZFN0YXJ0KFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBhcmd2Lm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCA/PyAnJyxcbiAgICAgICAgYXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJydcbiAgICAgICl9YFxuICAgICk7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0RTJFRGV2KCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShgZWNobyAnZG8gbm90aGluZy4nYCk7XG4gIH1cbiAgb3ZlcnJpZGUgdGVzdEUyRVByb2R1Y3Rpb24oKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGBlY2hvICdkbyBub3RoaW5nLidgKTtcbiAgfVxuICBvdmVycmlkZSB0ZXN0RTJFRG9ja2VyKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShgZWNobyAnZG8gbm90aGluZy4nYCk7XG4gIH1cbiAgb3ZlcnJpZGUgdGVzdFN0YXJ0KCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShgZWNobyAnZG8gbm90aGluZy4nYCk7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHBsYWluQXBwU2NyaXB0cyA9IG5ldyBQbGFpbkFwcFNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBSZW1peCBjb21tYW5kcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgUmVtaXhTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcih0cnVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzdGFydERldlByb3RlY3RlZChfOiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYHJlbWl4IGRldiAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWA7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHJlbWl4U2NyaXB0cyA9IG5ldyBSZW1peFNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBWaXRlLWJhc2VkIGFwcHMgd2l0aCBQbGF5d3JpZ2h0IGUyZSB0ZXN0cy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgVml0ZVNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKHRydWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0YXJ0RGV2UHJvdGVjdGVkKF86IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWUFSTiB2aXRlIGRldiAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWAudHJpbSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7cHJvamVjdC5idWlsZENvbW1hbmR9ICYmIFlBUk4gdml0ZSBwcmV2aWV3ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YC50cmltKCk7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHZpdGVTY3JpcHRzID0gbmV3IFZpdGVTY3JpcHRzKCk7XG4iLCJleHBvcnQgY29uc3QgaHR0cFNlcnZlclBhY2thZ2VzID0gWydleHByZXNzJywgJ2Zhc3RpZnknLCAnZWx5c2lhJywgJ2hvbm8nXTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3YsIEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNjcmlwdE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2NyaXB0cy9idWlsZGVyLmpzJztcbmltcG9ydCB7IHRvRGV2TnVsbCB9IGZyb20gJy4uL3NjcmlwdHMvYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBkb2NrZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9kb2NrZXJTY3JpcHRzLmpzJztcbmltcG9ydCB0eXBlIHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBmaW5kRXhwbGljaXRQbGF5d3JpZ2h0VGFyZ2V0SW5kZXhlcyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IGJsaXR6U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2JsaXR6U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBodHRwU2VydmVyU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2h0dHBTZXJ2ZXJTY3JpcHRzLmpzJztcbmltcG9ydCB7IG5leHRTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vbmV4dFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcGxhaW5BcHBTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcGxhaW5BcHBTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJlbWl4U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3JlbWl4U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyB2aXRlU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3ZpdGVTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IGh0dHBTZXJ2ZXJQYWNrYWdlcyB9IGZyb20gJy4vaHR0cFNlcnZlclBhY2thZ2VzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgZTJlOiB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnRTJlIHRlc3QgbW9kZTogaGVhZGxlc3MgKGRlZmF1bHQpIHwgaGVhZGxlc3MtZGV2IHwgaGVhZGVkIHwgaGVhZGVkLWRldiB8IGRvY2tlciB8IGRvY2tlci1kZWJ1ZyB8IGRlYnVnIHwgZ2VuZXJhdGUgfCB0cmFjZScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgY2hvaWNlczogW1xuICAgICAgJ2hlYWRsZXNzJyxcbiAgICAgICdoZWFkbGVzcy1kZXYnLFxuICAgICAgJ2hlYWRlZCcsXG4gICAgICAnaGVhZGVkLWRldicsXG4gICAgICAnZG9ja2VyJyxcbiAgICAgICdkb2NrZXItZGVidWcnLFxuICAgICAgJ2RlYnVnJyxcbiAgICAgICdnZW5lcmF0ZScsXG4gICAgICAndHJhY2UnLFxuICAgIF0sXG4gICAgZGVmYXVsdDogJ2hlYWRsZXNzJyxcbiAgfSxcbiAgc2lsZW50OiB7XG4gICAgZGVzY3JpcHRpb246ICdSZWR1Y2UgcmVkdW5kYW50IG91dHB1dHMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgYmFpbDoge1xuICAgIGRlc2NyaXB0aW9uOiAnU3RvcCB0ZXN0cyBhZnRlciB0aGUgZmlyc3QgZmFpbHVyZScsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICAndW5pdC10aW1lb3V0Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnVGltZW91dCBmb3IgdW5pdCB0ZXN0cycsXG4gICAgdHlwZTogJ251bWJlcicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBhcmd1bWVudHNCdWlsZGVyID0ge1xuICB0YXJnZXRzOiB7XG4gICAgZGVzY3JpcHRpb246ICdUZXN0IHRhcmdldCBwYXRocycsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbnR5cGUgVGVzdENvbW1hbmRPcHRpb25zID0gSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyPjtcblxuZXhwb3J0IHR5cGUgVGVzdEFyZ3YgPSBQYXJ0aWFsPFxuICBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzY3JpcHRPcHRpb25zQnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyPj5cbj47XG5cbmV4cG9ydCB0eXBlIFRlc3RDb21tYW5kQXJndiA9IEFyZ3VtZW50c0NhbWVsQ2FzZTxUZXN0Q29tbWFuZE9wdGlvbnM+ICYgeyAnLS0nPzogc3RyaW5nW10gfTtcblxuZXhwb3J0IGNvbnN0IHRlc3RDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIFRlc3RDb21tYW5kT3B0aW9ucz4gPSB7XG4gIGNvbW1hbmQ6ICd0ZXN0IFt0YXJnZXRzLi4uXScsXG4gIGRlc2NyaWJlOlxuICAgIFwiVGVzdCBwcm9qZWN0LiBJZiB5b3UgcGFzcyBubyBhcmd1bWVudHMsIGl0IHdpbGwgcnVuIGFsbCB0ZXN0cy4gVXNlICctLScgdG8gc3RvcCB3YiBvcHRpb24gcGFyc2luZyBhbmQgZm9yd2FyZCB0aGUgcmVtYWluaW5nIGZsYWdzIHRvIFBsYXl3cmlnaHQuIEV4YW1wbGU6IHdiIHRlc3QgLS0gLS1ncmVwICd1cGxvYWRlZCBpbWFnZSBhc3NldCdcIixcbiAgYnVpbGRlcjogKHlhcmdzOiBBcmd2PHVua25vd24+KTogQXJndjxUZXN0Q29tbWFuZE9wdGlvbnM+ID0+XG4gICAgeWFyZ3NcbiAgICAgIC5wYXJzZXJDb25maWd1cmF0aW9uKHsgJ3BvcHVsYXRlLS0nOiB0cnVlIH0pXG4gICAgICAub3B0aW9ucyh7IC4uLmJ1aWxkZXIsIC4uLmFyZ3VtZW50c0J1aWxkZXIgfSkgYXMgQXJndjxUZXN0Q29tbWFuZE9wdGlvbnM+LFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCB0ZXN0KGFyZ3YgYXMgVGVzdENvbW1hbmRBcmd2KTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0ZXN0KGFyZ3Y6IFRlc3RDb21tYW5kQXJndik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgcHJvY2Vzcy5lbnYuRk9SQ0VfQ09MT1IgfHw9ICczJztcbiAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAndGVzdCc7XG5cbiAgLy8gR2V0IHRlc3QgdGFyZ2V0cyBmcm9tIHBvc2l0aW9uYWwgYXJndW1lbnRzXG4gIGNvbnN0IHRlc3RUYXJnZXRzID0gKGFyZ3YudGFyZ2V0cyA/PyBbXSkgYXMgc3RyaW5nW107XG4gIGNvbnN0IGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzID0gYXJndlsnLS0nXSA/PyBbXTtcbiAgY29uc3QgeyBzaG91bGRSdW5FMmUsIHNob3VsZFJ1blVuaXQgfSA9IHJlc29sdmVUZXN0RXhlY3V0aW9uVGFyZ2V0cyh0ZXN0VGFyZ2V0cywgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MpO1xuXG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cy5kZXNjZW5kYW50cykge1xuICAgIGNvbnN0IGRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICBjb25zdCBkZXZEZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gICAgbGV0IHNjcmlwdHM6IEJhc2VTY3JpcHRzO1xuICAgIGlmIChkZXBzLmJsaXR6KSB7XG4gICAgICBzY3JpcHRzID0gYmxpdHpTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGVwcy5uZXh0KSB7XG4gICAgICBzY3JpcHRzID0gbmV4dFNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChkZXZEZXBzWydAcmVtaXgtcnVuL2RldiddKSB7XG4gICAgICBzY3JpcHRzID0gcmVtaXhTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGV2RGVwcy52aXRlKSB7XG4gICAgICBzY3JpcHRzID0gdml0ZVNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChodHRwU2VydmVyUGFja2FnZXMuc29tZSgocCkgPT4gZGVwc1twXSkgJiYgIWRlcHNbJ2ZpcmViYXNlLWZ1bmN0aW9ucyddKSB7XG4gICAgICBzY3JpcHRzID0gaHR0cFNlcnZlclNjcmlwdHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNjcmlwdHMgPSBwbGFpbkFwcFNjcmlwdHM7XG4gICAgfVxuXG4gICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwidGVzdFwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICAvLyBSdW4gdW5pdCB0ZXN0cyBpZiBuZWVkZWRcbiAgICBpZiAoc2hvdWxkUnVuVW5pdCAmJiBmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICd0ZXN0JywgJ3VuaXQnKSkpIHtcbiAgICAgIGNvbnN0IHVuaXRUYXJnZXRzID0gdGVzdFRhcmdldHMuZmlsdGVyKCh0YXJnZXQpID0+IHRhcmdldC5pbmNsdWRlcygnL3VuaXQnKSk7XG4gICAgICBjb25zdCB1bml0QXJndiA9IHsgLi4uYXJndiwgdGFyZ2V0czogdW5pdFRhcmdldHMubGVuZ3RoID4gMCA/IHVuaXRUYXJnZXRzIDogdW5kZWZpbmVkIH07XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oc2NyaXB0cy50ZXN0VW5pdChwcm9qZWN0LCB1bml0QXJndiksIHByb2plY3QsIGFyZ3YsIHsgdGltZW91dDogYXJndi51bml0VGltZW91dCB9KTtcbiAgICB9XG4gICAgLy8gU2tpcCBlMmUgdGVzdHMgaWYgbm90IG5lZWRlZCBvciBubyBlMmUgZGlyZWN0b3J5IGV4aXN0c1xuICAgIGlmICghc2hvdWxkUnVuRTJlIHx8ICFmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICd0ZXN0JywgJ2UyZScpKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gR2V0IGUyZSB0YXJnZXRzIGZvciB0aGlzIHByb2plY3RcbiAgICBjb25zdCBlMmVUYXJnZXRzID0gdGVzdFRhcmdldHMuZmlsdGVyKCh0YXJnZXQpID0+IHRhcmdldC5pbmNsdWRlcygnL2UyZScpKTtcbiAgICBjb25zdCBlMmVBcmd2ID0geyAuLi5hcmd2LCB0YXJnZXRzOiBlMmVUYXJnZXRzLmxlbmd0aCA+IDAgPyBlMmVUYXJnZXRzIDogdW5kZWZpbmVkIH07XG5cbiAgICBzd2l0Y2ggKGFyZ3YuZTJlKSB7XG4gICAgICBjYXNlICdoZWFkbGVzcyc6IHtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdCwgZTJlQXJndiwge1xuICAgICAgICAgICAgcGxheXdyaWdodEFyZ3M6IGJ1aWxkUGxheXdyaWdodEFyZ3NGb3JFMkUoZTJlVGFyZ2V0cywgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MpLFxuICAgICAgICAgICAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsXG4gICAgICAgICAgfSksXG4gICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICBhcmd2XG4gICAgICAgICk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY2FzZSAnaGVhZGxlc3MtZGV2Jzoge1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgICAgYXdhaXQgc2NyaXB0cy50ZXN0RTJFRGV2KHByb2plY3QsIGUyZUFyZ3YsIHtcbiAgICAgICAgICAgIHBsYXl3cmlnaHRBcmdzOiBidWlsZFBsYXl3cmlnaHRBcmdzRm9yRTJFKGUyZVRhcmdldHMsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzKSxcbiAgICAgICAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgYXJndlxuICAgICAgICApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2RvY2tlcic6IHtcbiAgICAgICAgYXdhaXQgdGVzdE9uRG9ja2VyKFxuICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgZTJlQXJndixcbiAgICAgICAgICBzY3JpcHRzLFxuICAgICAgICAgIGJ1aWxkUGxheXdyaWdodEFyZ3NGb3JFMkUoZTJlVGFyZ2V0cywgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MpLFxuICAgICAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzXG4gICAgICAgICk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY2FzZSAnZG9ja2VyLWRlYnVnJzoge1xuICAgICAgICBhd2FpdCB0ZXN0T25Eb2NrZXIoXG4gICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICBlMmVBcmd2LFxuICAgICAgICAgIHNjcmlwdHMsXG4gICAgICAgICAgYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShlMmVUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncywgWyctLWRlYnVnJ10pLFxuICAgICAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzXG4gICAgICAgICk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZGVwcy5ibGl0eiB8fCBkZXBzLm5leHQgfHwgZGV2RGVwc1snQHJlbWl4LXJ1bi9kZXYnXSB8fCBkZXZEZXBzLnZpdGUpIHtcbiAgICAgIHN3aXRjaCAoYXJndi5lMmUpIHtcbiAgICAgICAgY2FzZSAnaGVhZGVkJzoge1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdCwgZTJlQXJndiwge1xuICAgICAgICAgICAgICBwbGF5d3JpZ2h0QXJnczogYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShlMmVUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncywgWyctLWhlYWRlZCddKSxcbiAgICAgICAgICAgICAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICBhcmd2XG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdoZWFkZWQtZGV2Jzoge1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRURldihwcm9qZWN0LCBlMmVBcmd2LCB7XG4gICAgICAgICAgICAgIHBsYXl3cmlnaHRBcmdzOiBidWlsZFBsYXl3cmlnaHRBcmdzRm9yRTJFKGUyZVRhcmdldHMsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLCBbJy0taGVhZGVkJ10pLFxuICAgICAgICAgICAgICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICAgIGFyZ3ZcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2RlYnVnJzoge1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdCwgZTJlQXJndiwge1xuICAgICAgICAgICAgICBwbGF5d3JpZ2h0QXJnczogYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShlMmVUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncywgWyctLWRlYnVnJ10pLFxuICAgICAgICAgICAgICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICAgIGFyZ3ZcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2dlbmVyYXRlJzoge1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdCwgZTJlQXJndiwge1xuICAgICAgICAgICAgICBwbGF5d3JpZ2h0QXJnczogWydjb2RlZ2VuJywgYGh0dHA6Ly9sb2NhbGhvc3Q6JHtwcm9qZWN0LmVudi5QT1JUfWBdLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgYXJndlxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAndHJhY2UnOiB7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGBCVU4gcGxheXdyaWdodCBzaG93LXRyYWNlYCwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gdGVzdE9uRG9ja2VyKFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyPj4sXG4gIHNjcmlwdHM6IEJhc2VTY3JpcHRzLFxuICBwbGF5d3JpZ2h0QXJncz86IHN0cmluZ1tdLFxuICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncz86IHN0cmluZ1tdXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcHJvamVjdC5lbnYuV0JfRE9DS0VSIHx8PSAnMSc7XG4gIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtzY3JpcHRzLmJ1aWxkRG9ja2VyKHByb2plY3QsICd0ZXN0Jyl9JHt0b0Rldk51bGwoYXJndil9YCwgcHJvamVjdCwgYXJndik7XG4gIHByb2Nlc3MuZXhpdENvZGUgPSBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgYXdhaXQgc2NyaXB0cy50ZXN0RTJFRG9ja2VyKHByb2plY3QsIGFyZ3YsIHtcbiAgICAgIHBsYXl3cmlnaHRBcmdzLFxuICAgICAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsXG4gICAgfSksXG4gICAgcHJvamVjdCxcbiAgICBhcmd2LFxuICAgIHsgZXhpdElmRmFpbGVkOiBmYWxzZSB9XG4gICk7XG4gIGF3YWl0IHJ1bldpdGhTcGF3bihkb2NrZXJTY3JpcHRzLnN0b3AocHJvamVjdCksIHByb2plY3QsIGFyZ3YpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShcbiAgZTJlVGFyZ2V0czogc3RyaW5nW10sXG4gIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzOiBzdHJpbmdbXSA9IFtdLFxuICBhZGRpdGlvbmFsQXJnczogc3RyaW5nW10gPSBbXVxuKTogc3RyaW5nW10ge1xuICBjb25zdCBoYXNGb3J3YXJkZWRQbGF5d3JpZ2h0VGFyZ2V0cyA9IGZpbmRFeHBsaWNpdFBsYXl3cmlnaHRUYXJnZXRJbmRleGVzKGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzKS5sZW5ndGggPiAwO1xuICByZXR1cm4gWyd0ZXN0JywgLi4uKGUyZVRhcmdldHMubGVuZ3RoID4gMCB8fCBoYXNGb3J3YXJkZWRQbGF5d3JpZ2h0VGFyZ2V0cyA/IFtdIDogWyd0ZXN0L2UyZS8nXSksIC4uLmFkZGl0aW9uYWxBcmdzXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVUZXN0RXhlY3V0aW9uVGFyZ2V0cyhcbiAgdGVzdFRhcmdldHM6IHN0cmluZ1tdLFxuICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJnczogc3RyaW5nW10gPSBbXVxuKTogeyBzaG91bGRSdW5Vbml0OiBib29sZWFuOyBzaG91bGRSdW5FMmU6IGJvb2xlYW4gfSB7XG4gIGNvbnN0IGhhc0UyZVRhcmdldHMgPSB0ZXN0VGFyZ2V0cy5zb21lKCh0YXJnZXQpID0+IHRhcmdldC5pbmNsdWRlcygnL2UyZScpKTtcbiAgY29uc3QgaGFzVW5pdFRhcmdldHMgPSB0ZXN0VGFyZ2V0cy5zb21lKCh0YXJnZXQpID0+IHRhcmdldC5pbmNsdWRlcygnL3VuaXQnKSk7XG4gIGNvbnN0IHNob3VsZFJ1bkFsbFRlc3RzID0gdGVzdFRhcmdldHMubGVuZ3RoID09PSAwICYmIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLmxlbmd0aCA9PT0gMDtcblxuICByZXR1cm4ge1xuICAgIHNob3VsZFJ1blVuaXQ6IHNob3VsZFJ1bkFsbFRlc3RzIHx8IGhhc1VuaXRUYXJnZXRzLFxuICAgIHNob3VsZFJ1bkUyZTogc2hvdWxkUnVuQWxsVGVzdHMgfHwgaGFzRTJlVGFyZ2V0cyB8fCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncy5sZW5ndGggPiAwLFxuICB9O1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd25JblBhcmFsbGVsIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG50eXBlIFR5cGVDaGVja0NvbW1hbmRPcHRpb25zID0gSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj47XG5leHBvcnQgdHlwZSBUeXBlQ2hlY2tDb21tYW5kQXJndiA9IEFyZ3VtZW50c0NhbWVsQ2FzZTxUeXBlQ2hlY2tDb21tYW5kT3B0aW9ucz47XG5cbmV4cG9ydCBjb25zdCB0eXBlQ2hlY2tDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIFR5cGVDaGVja0NvbW1hbmRPcHRpb25zPiA9IHtcbiAgY29tbWFuZDogJ3R5cGVjaGVjaycsXG4gIGRlc2NyaWJlOiAnUnVuIHR5cGUgY2hlY2tpbmcuIC5lbnYgZmlsZXMgYXJlIGlnbm9yZWQuJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgcHJvY2Vzcy5leGl0KGF3YWl0IHR5cGVDaGVjayhhcmd2KSk7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdHlwZUNoZWNrKGFyZ3Y6IFR5cGVDaGVja0NvbW1hbmRBcmd2KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YsIGZhbHNlKTtcbiAgaWYgKCFwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIGxldCByZW1vdmVkTmV4dERpciA9IGZhbHNlIGFzIGJvb2xlYW47XG4gIGNvbnN0IHByb21pc2VzID0gcHJvamVjdHMuZGVzY2VuZGFudHMubWFwKGFzeW5jIChwcm9qZWN0KSA9PiB7XG4gICAgY29uc3QgY29tbWFuZHM6IHN0cmluZ1tdID0gW107XG4gICAgaWYgKCFwcm9qZWN0LnBhY2thZ2VKc29uLndvcmtzcGFjZXMpIHtcbiAgICAgIGlmIChwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8udHlwZXNjcmlwdCB8fCBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8udHlwZXNjcmlwdCkge1xuICAgICAgICBjb21tYW5kcy5wdXNoKCdCVU4gdHNjIC0tbm9FbWl0Jyk7XG4gICAgICB9XG4gICAgICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LnB5cmlnaHQpIHtcbiAgICAgICAgY29tbWFuZHMucHVzaCgnWUFSTiBweXJpZ2h0Jyk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHByb2plY3QuaGFzU291cmNlQ29kZSAmJlxuICAgICAgKHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy50eXBlc2NyaXB0IHx8IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy50eXBlc2NyaXB0KVxuICAgICkge1xuICAgICAgY29tbWFuZHMucHVzaCgnQlVOIHRzYyAtLW5vRW1pdCcpO1xuICAgIH1cbiAgICB3aGlsZSAoY29tbWFuZHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGNvbW1hbmRzLmpvaW4oJyAmJiAnKSwgcHJvamVjdCwgYXJndiwge1xuICAgICAgICAvLyBEaXNhYmxlIGludGVyYWN0aXZlIG1vZGVcbiAgICAgICAgY2k6IHByb2plY3RzLmRlc2NlbmRhbnRzLmxlbmd0aCA+IDEsXG4gICAgICAgIGV4aXRJZkZhaWxlZDogZmFsc2UsXG4gICAgICAgIGZvcmNlQ29sb3I6IHRydWUsXG4gICAgICB9KTtcblxuICAgICAgLy8gUmUtdHJ5IHR5cGUgY2hlY2tpbmcgYWZ0ZXIgcmVtb3ZpbmcgYC5uZXh0YCBkaXJlY3RvcnlcbiAgICAgIGNvbnN0IG5leHREaXJQYXRoID0gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJy5uZXh0Jyk7XG4gICAgICBpZiAoZXhpdENvZGUgJiYgZnMuZXhpc3RzU3luYyhuZXh0RGlyUGF0aCkpIHtcbiAgICAgICAgZnMucm1TeW5jKG5leHREaXJQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhjaGFsay55ZWxsb3coJ1JlbW92ZWQgYC5uZXh0YCBkaXJlY3RvcnkuIFdlIHdpbGwgcmUtdHJ5IHR5cGUgY2hlY2tpbmcuJykpO1xuICAgICAgICByZW1vdmVkTmV4dERpciA9IHRydWU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZXhpdENvZGU7XG4gICAgfVxuICB9KTtcbiAgY29uc3QgZXhpdENvZGVzID0gYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICBsZXQgZmluYWxFeGl0Q29kZSA9IDA7XG4gIGZvciAoY29uc3QgW2ksIGV4aXRDb2RlXSBvZiBleGl0Q29kZXMuZW50cmllcygpKSB7XG4gICAgaWYgKGV4aXRDb2RlKSB7XG4gICAgICBjb25zdCBkZXBzID0gcHJvamVjdHMuZGVzY2VuZGFudHNbaV0/LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICAgIGlmIChkZXBzLmJsaXR6KSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhjaGFsay55ZWxsb3coJ1BsZWFzZSB0cnkgXCJ5YXJuIGdlbi1jb2RlXCIgaWYgeW91IGZhY2UgdW5rbm93biB0eXBlIGVycm9ycy4nKSk7XG4gICAgICB9XG4gICAgICBmaW5hbEV4aXRDb2RlID0gZXhpdENvZGU7XG4gICAgfVxuICB9XG4gIGlmICghZmluYWxFeGl0Q29kZSlcbiAgICBjb25zb2xlLmluZm8oXG4gICAgICBjaGFsay5ncmVlbihcbiAgICAgICAgcmVtb3ZlZE5leHREaXJcbiAgICAgICAgICA/ICctLS0tLVxcbk5vIHR5cGUgZXJyb3JzIGZvdW5kLiBQbGVhc2UgaWdub3JlIHRoZSBwcmV2aW91cyB0eXBlIGVycm9ycywgYXMgdGhleSB3ZXJlIGNhdXNlZCBieSBvdXRkYXRlZCBOZXh0LmpzIGNhY2hlIGZpbGVzLidcbiAgICAgICAgICA6ICdObyB0eXBlIGVycm9ycyBmb3VuZC4nXG4gICAgICApXG4gICAgKTtcbiAgcmV0dXJuIGZpbmFsRXhpdENvZGU7XG59XG5cbmV4cG9ydCBjb25zdCB0Y0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgVHlwZUNoZWNrQ29tbWFuZE9wdGlvbnM+ID0ge1xuICAuLi50eXBlQ2hlY2tDb21tYW5kLFxuICBjb21tYW5kOiAndGMnLFxufTtcbiIsImltcG9ydCB7IHNwYXduQXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZFJvb3RBbmRTZWxmUHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGNvbmZpZ3VyZUVudiB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBwYWNrYWdlTWFuYWdlciB9IGZyb20gJy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuXG5pbXBvcnQgeyBsaW50LCB0eXBlIExpbnRDb21tYW5kQXJndiB9IGZyb20gJy4vbGludC5qcyc7XG5pbXBvcnQgeyB0ZXN0LCB0eXBlIFRlc3RDb21tYW5kQXJndiB9IGZyb20gJy4vdGVzdC5qcyc7XG5pbXBvcnQgeyB0eXBlQ2hlY2sgfSBmcm9tICcuL3R5cGVjaGVjay5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcblxudHlwZSBBaUNoZWNrQ29tbWFuZE9wdGlvbnMgPSBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPjtcbnR5cGUgQWlDaGVja0NvbW1hbmRBcmd2ID0gQXJndW1lbnRzQ2FtZWxDYXNlPEFpQ2hlY2tDb21tYW5kT3B0aW9ucz47XG5cbmV4cG9ydCBjb25zdCBjaGVja0ZvckFpQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBBaUNoZWNrQ29tbWFuZE9wdGlvbnM+ID0ge1xuICBjb21tYW5kOiBbJ2NoZWNrJywgJ2NoZWNrLWZvci1haSddLFxuICBkZXNjcmliZTogJ1J1biBwcm9qZWN0IGNoZWNrcycsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IHByb2plY3RzID0gZmluZFJvb3RBbmRTZWxmUHJvamVjdHMoYXJndiwgZmFsc2UpO1xuICAgIGlmICghcHJvamVjdHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBhd2FpdCBjaGVja0ZvckFpKHByb2plY3RzLnNlbGYsIGFyZ3YpO1xuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IGNoZWNrQWxsRm9yQWlDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEFpQ2hlY2tDb21tYW5kT3B0aW9ucz4gPSB7XG4gIGNvbW1hbmQ6IFsnY2hlY2stYWxsJywgJ2NoZWNrLWFsbC1mb3ItYWknXSxcbiAgZGVzY3JpYmU6ICdSdW4gcHJvamVjdCBjaGVja3MgYW5kIHRlc3RzJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdHMgPSBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyhhcmd2LCBmYWxzZSk7XG4gICAgaWYgKCFwcm9qZWN0cykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGF3YWl0IGNoZWNrRm9yQWkocHJvamVjdHMuc2VsZiwgYXJndik7XG4gICAgYXdhaXQgcnVuUHJvamVjdFRlc3QocHJvamVjdHMuc2VsZiwgYXJndik7XG4gIH0sXG59O1xuXG5hc3luYyBmdW5jdGlvbiBjaGVja0ZvckFpKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IEFpQ2hlY2tDb21tYW5kQXJndik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBydW5QYWNrYWdlQ29tbWFuZCgnaW5zdGFsbCcsIGAke3BhY2thZ2VNYW5hZ2VyfSBpbnN0YWxsYCwgcHJvamVjdCwgYXJndiwgeyBzaWxlbnQ6IHRydWUgfSk7XG4gIGlmIChwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZ2VuLWNvZGUnXSkge1xuICAgIGF3YWl0IHJ1blBhY2thZ2VDb21tYW5kKCdnZW4tY29kZScsIGAke3BhY2thZ2VNYW5hZ2VyfSBnZW4tY29kZWAsIHByb2plY3QsIGFyZ3YsIHtcbiAgICAgIHNpbGVudDogdHJ1ZSxcbiAgICB9KTtcbiAgfVxuICBhd2FpdCBydW5JblByb2Nlc3NDb21tYW5kKCdmb3JtYXQnLCAoKSA9PiBsaW50KHsgLi4uYXJndiwgXzogWydsaW50J10sIGZvcm1hdDogdHJ1ZSB9IGFzIExpbnRDb21tYW5kQXJndiksIHtcbiAgICBhbGxvd0ZhaWx1cmU6IHRydWUsXG4gIH0pO1xuICBhd2FpdCBydW5JblByb2Nlc3NDb21tYW5kKCd0eXBlY2hlY2snLCAoKSA9PiB0eXBlQ2hlY2soYXJndikpO1xuICBhd2FpdCBydW5JblByb2Nlc3NDb21tYW5kKCdsaW50LWZpeCcsICgpID0+XG4gICAgbGludCh7IC4uLmFyZ3YsIF86IFsnbGludCddLCBmaXg6IHRydWUsIHF1aWV0OiB0cnVlIH0gYXMgTGludENvbW1hbmRBcmd2KVxuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBydW5Qcm9qZWN0VGVzdChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBBaUNoZWNrQ29tbWFuZEFyZ3YpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8udGVzdD8uaW5jbHVkZXMoJ3diIHRlc3QnKSkge1xuICAgIGNvbnNvbGUuaW5mbygnXFxuJyArIGNoYWxrLmN5YW4oY2hhbGsuYm9sZCgnU3RhcnQ6JyksICd0ZXN0JykpO1xuICAgIGF3YWl0IHRlc3QoeyAuLi5hcmd2LCBfOiBbJ3Rlc3QnXSwgZTJlOiAnaGVhZGxlc3MnIH0gYXMgVGVzdENvbW1hbmRBcmd2KTtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oY2hhbGsuYm9sZCgnRmluaXNoZWQ6JyksICd0ZXN0JykpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGF3YWl0IHJ1blBhY2thZ2VDb21tYW5kKCd0ZXN0JywgYCR7cGFja2FnZU1hbmFnZXJ9IHRlc3RgLCBwcm9qZWN0LCBhcmd2KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVuSW5Qcm9jZXNzQ29tbWFuZChcbiAgY29tbWFuZE5hbWU6IHN0cmluZyxcbiAgY29tbWFuZDogKCkgPT4gUHJvbWlzZTxudW1iZXIgfCB1bmRlZmluZWQ+LFxuICBvcHRpb25zOiB7IGFsbG93RmFpbHVyZT86IGJvb2xlYW4gfSA9IHt9XG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zb2xlLmluZm8oJ1xcbicgKyBjaGFsay5jeWFuKGNoYWxrLmJvbGQoJ1N0YXJ0OicpLCBjb21tYW5kTmFtZSkpO1xuICBjb25zdCBleGl0Q29kZSA9IChhd2FpdCBjb21tYW5kKCkpID8/IDA7XG4gIGlmIChleGl0Q29kZSA9PT0gMCB8fCBvcHRpb25zLmFsbG93RmFpbHVyZSkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbihjaGFsay5ib2xkKCdGaW5pc2hlZDonKSwgY29tbWFuZE5hbWUpKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsucmVkKGNoYWxrLmJvbGQoYEZhaWxlZCAoZXhpdCBjb2RlICR7ZXhpdENvZGV9KTpgKSwgY29tbWFuZE5hbWUpKTtcbiAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUpO1xuICB9XG4gIHJldHVybiBleGl0Q29kZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVuUGFja2FnZUNvbW1hbmQoXG4gIGNvbW1hbmROYW1lOiBzdHJpbmcsXG4gIGNvbW1hbmQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogQWlDaGVja0NvbW1hbmRBcmd2LFxuICBvcHRpb25zOiB7IGFsbG93RmFpbHVyZT86IGJvb2xlYW47IHNpbGVudD86IGJvb2xlYW4gfSA9IHt9XG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zb2xlLmluZm8oJ1xcbicgKyBjaGFsay5jeWFuKGNoYWxrLmJvbGQoJ1N0YXJ0OicpLCBjb21tYW5kTmFtZSkgKyBjaGFsay5ncmF5KGAgYXQgJHtwcm9qZWN0LmRpclBhdGh9YCkpO1xuICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmdyYXkoY2hhbGsuYm9sZCgnU3RhcnQgKHJhdyk6JyksIGNvbW1hbmQpKTtcbiAgfVxuICBpZiAoYXJndi5kcnlSdW4pIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oY2hhbGsuYm9sZCgnRmluaXNoZWQ6JyksIGNvbW1hbmROYW1lKSk7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBjb25zdCByZXQgPSBhd2FpdCBzcGF3bkFzeW5jKGNvbW1hbmQsIHVuZGVmaW5lZCwge1xuICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIGVudjogY29uZmlndXJlRW52KHByb2plY3QuZW52LCB7IGZvcmNlQ29sb3I6IHRydWUgfSksXG4gICAgc2hlbGw6IHRydWUsXG4gICAgc3RkaW86IG9wdGlvbnMuc2lsZW50ID8gWydpZ25vcmUnLCAnaWdub3JlJywgJ2luaGVyaXQnXSA6ICdpbmhlcml0JyxcbiAgICBraWxsT25FeGl0OiB0cnVlLFxuICAgIHZlcmJvc2U6IGFyZ3YudmVyYm9zZSxcbiAgfSk7XG5cbiAgaWYgKHJldC5zdGF0dXMgPT09IDAgfHwgb3B0aW9ucy5hbGxvd0ZhaWx1cmUpIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oY2hhbGsuYm9sZCgnRmluaXNoZWQ6JyksIGNvbW1hbmROYW1lKSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLnJlZChjaGFsay5ib2xkKGBGYWlsZWQgKGV4aXQgY29kZSAke3JldC5zdGF0dXN9KTpgKSwgY29tbWFuZE5hbWUpKTtcbiAgICBwcm9jZXNzLmV4aXQocmV0LnN0YXR1cyA/PyAxKTtcbiAgfVxuICByZXR1cm4gcmV0LnN0YXR1cyA/PyAxO1xufVxuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB0eXBlIHsgQmluYXJ5TGlrZSwgSGFzaCB9IGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBpZ25vcmVFbm9lbnRBc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgaXNSdW5uaW5nT25CdW4gfSBmcm9tICcuLi91dGlscy9ydW50aW1lLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgY29tbWFuZDoge1xuICAgIGRlc2NyaXB0aW9uOiAnQSBidWlsZCBjb21tYW5kIChkZWZhdWx0OiB5YXJufGJ1biBidWlsZCknLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAnYycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgYnVpbGRJZk5lZWRlZENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnYnVpbGRJZk5lZWRlZCcsXG4gIGRlc2NyaWJlOiAnQnVpbGQgY29kZSBpZiBjaGFuZ2VzIGFyZSBkZXRlY3RlZCcsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IGJ1aWxkSWZOZWVkZWQoYXJndik7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRJZk5lZWRlZChcbiAgLy8gVGVzdCBjb2RlIHJlcXVpcmVzIFBhcnRpYWw8Li4uPlxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4+LFxuICBwcm9qZWN0UGF0aEZvclRlc3Rpbmc/OiBzdHJpbmdcbik6IFByb21pc2U8Ym9vbGVhbiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YsIHRydWUsIHByb2plY3RQYXRoRm9yVGVzdGluZyk7XG4gIGlmICghcHJvamVjdCkge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGFyZ3YgPSB7IC4uLmFyZ3YsIGNvbW1hbmQ6IGFyZ3YuY29tbWFuZCA/PyAoaXNSdW5uaW5nT25CdW4gPyAnYnVuIHJ1biBidWlsZCcgOiAneWFybiBidWlsZCcpIH07XG5cbiAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LnJvb3REaXJQYXRoLCAnLmdpdCcpKSkge1xuICAgIGJ1aWxkKHByb2plY3QsIGFyZ3YpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY29uc3QgW2NhblNraXAsIGNhY2hlRmlsZVBhdGgsIGNvbnRlbnRIYXNoXSA9IGF3YWl0IGNhblNraXBCdWlsZChwcm9qZWN0LCBhcmd2KTtcbiAgaWYgKGNhblNraXApIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oYFNraXAgdG8gcnVuICcke2FyZ3YuY29tbWFuZH0nIPCfkqtgKSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFidWlsZChwcm9qZWN0LCBhcmd2KSkgcmV0dXJuO1xuXG4gIGlmICghYXJndi5kcnlSdW4pIHtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoY2FjaGVGaWxlUGF0aCwgY29udGVudEhhc2gsICd1dGY4Jyk7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+Pj4pOiBib29sZWFuIHtcbiAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKGBSdW4gJyR7YXJndi5jb21tYW5kfSdgKSk7XG4gIGlmICghYXJndi5kcnlSdW4pIHtcbiAgICBjb25zdCByZXQgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhhcmd2LmNvbW1hbmQgPz8gJycsIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBwcm9qZWN0LmVudixcbiAgICAgIHNoZWxsOiB0cnVlLFxuICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICB9KTtcbiAgICBpZiAocmV0LnN0YXR1cyAhPT0gMCkge1xuICAgICAgcHJvY2Vzcy5leGl0Q29kZSA9IHJldC5zdGF0dXMgPz8gMTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmNvbnN0IGlnbm9yaW5nRW52VmFyTmFtZXMgPSBuZXcgU2V0KFsnQ0knLCAnUFdERUJVRycsICdUTVBESVInXSk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjYW5Ta2lwQnVpbGQoXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+Pj5cbik6IFByb21pc2U8W2Jvb2xlYW4sIHN0cmluZywgc3RyaW5nXT4ge1xuICBjb25zdCBjYWNoZURpcmVjdG9yeVBhdGggPSBwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCAnbm9kZV9tb2R1bGVzJywgJy5jYWNoZScsICdidWlsZCcpO1xuICBjb25zdCBjYWNoZUZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNhY2hlRGlyZWN0b3J5UGF0aCwgJ2xhc3QtYnVpbGQnKTtcbiAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIoY2FjaGVEaXJlY3RvcnlQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICBjb25zdCBoYXNoID0gY3JlYXRlSGFzaCgnc2hhMjU2Jyk7XG5cbiAgY29uc3QgY29tbWl0SGFzaCA9IGNoaWxkX3Byb2Nlc3MuZXhlY1N5bmMoJ2dpdCByZXYtcGFyc2UgSEVBRCcsIHsgY3dkOiBwcm9qZWN0LmRpclBhdGggfSkudG9TdHJpbmcoKS50cmltKCk7XG4gIGhhc2gudXBkYXRlKGNvbW1pdEhhc2gpO1xuXG4gIGNvbnN0IGVudmlyb25tZW50SnNvbiA9IEpTT04uc3RyaW5naWZ5KFxuICAgIE9iamVjdC5lbnRyaWVzKHByb2plY3QuZW52KVxuICAgICAgLmZpbHRlcigoW2tleV0pID0+ICFpZ25vcmluZ0VudlZhck5hbWVzLmhhcyhrZXkpKVxuICAgICAgLnRvU29ydGVkKChba2V5MV0sIFtrZXkyXSkgPT4ga2V5MS5sb2NhbGVDb21wYXJlKGtleTIpKVxuICApO1xuICBoYXNoLnVwZGF0ZShlbnZpcm9ubWVudEpzb24pO1xuXG4gIGF3YWl0IHVwZGF0ZUhhc2hXaXRoRGlmZlJlc3VsdChwcm9qZWN0LCBhcmd2LCBoYXNoKTtcbiAgY29uc3QgY29udGVudEhhc2ggPSBoYXNoLmRpZ2VzdCgnaGV4Jyk7XG5cbiAgY29uc3QgY2FjaGVkQ29udGVudEhhc2ggPSBhd2FpdCBpZ25vcmVFbm9lbnRBc3luYygoKSA9PiBmcy5wcm9taXNlcy5yZWFkRmlsZShjYWNoZUZpbGVQYXRoLCAndXRmOCcpKTtcbiAgcmV0dXJuIFtjYWNoZWRDb250ZW50SGFzaCA9PT0gY29udGVudEhhc2gsIGNhY2hlRmlsZVBhdGgsIGNvbnRlbnRIYXNoXTtcbn1cblxuY29uc3QgaW5jbHVkZVBhdHRlcm5zID0gWydzcmMvJywgJ3B1YmxpYy8nXTtcbmNvbnN0IGluY2x1ZGVTdWZmaXggPSBbXG4gICcuanMnLFxuICAnLmNqcycsXG4gICcubWpzJyxcbiAgJy5qc3gnLFxuICAnLnRzJyxcbiAgJy5jdHMnLFxuICAnLm10cycsXG4gICcudHN4JyxcbiAgJy5qc29uJyxcbiAgJy5icm93c2Vyc2xpc3RyYycsXG4gIC8vIEJlY2F1c2Ugc29tZSBidWlsZCBjb21tYW5kcyBhZmZlY3RlZCBieSBjaGFuZ2VzIGluIGBwYWNrYWdlLmpzb25gXG4gICdwYWNrYWdlLmpzb24nLFxuICAneWFybi5sb2NrJyxcbl07XG5jb25zdCBleGNsdWRlUGF0dGVybnMgPSBbJ3Rlc3QvJywgJ3Rlc3RzLycsICdfX3Rlc3RzX18vJywgJ3Rlc3QtZml4dHVyZXMvJywgJ3Rlc3QvZml4dHVyZXMvJ107XG5cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUhhc2hXaXRoRGlmZlJlc3VsdChcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+PixcbiAgaGFzaDogSGFzaFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IHJldCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKCdnaXQnLCBbJ3N0YXR1cycsICctLXBvcmNlbGFpbiddLCB7XG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIGVudjogcHJvamVjdC5lbnYsXG4gICAgICBzdGRpbzogJ3BpcGUnLFxuICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICB9KTtcbiAgICBjb25zdCBsaW5lcyA9IHJldC5zdGRvdXRcbiAgICAgIC50cmltKClcbiAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgIC5maWx0ZXIoKGxpbmUpID0+IGxpbmUubGVuZ3RoID4gMCk7XG4gICAgY29uc3QgZmlsZVBhdGhzID0gbGluZXNcbiAgICAgIC5tYXAoKGxpbmUpID0+IGxpbmUuc2xpY2UoMikudHJpbSgpKVxuICAgICAgLm1hcCgoZmlsZVBhdGgpID0+XG4gICAgICAgIHByb2plY3QuZW52LldCX0VOViA9PT0gJ3Rlc3QnID8gZmlsZVBhdGgucmVwbGFjZSgvcGFja2FnZXNcXC93YlxcL3Rlc3RcXC9maXh0dXJlc1xcL1teL10rXFwvLywgJycpIDogZmlsZVBhdGhcbiAgICAgICk7XG4gICAgY29uc3QgZmlsdGVyZWRGaWxlUGF0aHMgPSBmaWxlUGF0aHMuZmlsdGVyKFxuICAgICAgKGZpbGVQYXRoKSA9PlxuICAgICAgICAoaW5jbHVkZVBhdHRlcm5zLnNvbWUoKHBhdHRlcm4pID0+IGZpbGVQYXRoLmluY2x1ZGVzKHBhdHRlcm4pKSB8fFxuICAgICAgICAgIGluY2x1ZGVTdWZmaXguc29tZSgoc3VmZml4KSA9PiBmaWxlUGF0aC5lbmRzV2l0aChzdWZmaXgpKSkgJiZcbiAgICAgICAgIWV4Y2x1ZGVQYXR0ZXJucy5zb21lKChwYXR0ZXJuKSA9PiBmaWxlUGF0aC5pbmNsdWRlcyhwYXR0ZXJuKSlcbiAgICApO1xuICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgQ2hhbmdlZCBmaWxlczogJHtmaWx0ZXJlZEZpbGVQYXRocy5qb2luKCcsICcpfWApO1xuICAgIH1cblxuICAgIC8vICdnaXQgZGlmZiAtLScgd29ya3Mgb25seSBvbiByb290RGlyUGF0aFxuICAgIGNvbnN0IHByb2MgPSBjaGlsZF9wcm9jZXNzLnNwYXduKCdnaXQnLCBbJ2RpZmYnLCAnLS0nLCAuLi5maWx0ZXJlZEZpbGVQYXRoc10sIHsgY3dkOiBwcm9qZWN0LnJvb3REaXJQYXRoIH0pO1xuICAgIHByb2Muc3Rkb3V0Lm9uKCdkYXRhJywgKGRhdGE6IEJpbmFyeUxpa2UpID0+IHtcbiAgICAgIGhhc2gudXBkYXRlKGRhdGEpO1xuICAgICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgICBjb25zb2xlLmluZm8oJ0RhdGE6JywgZGF0YSk7XG4gICAgICAgIGNvbnNvbGUuaW5mbygnSGFzaDonLCBoYXNoLmNvcHkoKS5kaWdlc3QoJ2hleCcpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBwcm9jLm9uKCdjbG9zZScsICgpID0+IHtcbiAgICAgIHJlc29sdmUoKTtcbiAgICB9KTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgeyBzbGVlcCB9IGZyb20gJy4vc2xlZXAuanMnO1xuXG4vKipcbiAqIENvbnZlcnQgYW4gb2JqZWN0IHRvIGFuIGVycm9yLlxuICogQHBhcmFtIG9iaiBUaGUgb2JqZWN0IHRvIGNvbnZlcnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlcnJvcmlmeShvYmo6IHVua25vd24pOiBFcnJvciB7XG4gIGlmIChvYmogaW5zdGFuY2VvZiBFcnJvcikgcmV0dXJuIG9iajtcbiAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSByZXR1cm4gbmV3IEVycm9yKG9iaik7XG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihKU09OLnN0cmluZ2lmeShvYmopKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihTdHJpbmcob2JqKSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlnbm9yZUVycm9yPFQ+KGZuOiAoKSA9PiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaWdub3JlRW5vZW50PFQ+KGZuOiAoKSA9PiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgJiYgJ2NvZGUnIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFcnJvckFzeW5jPFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaWdub3JlRW5vZW50QXN5bmM8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXRyeU9wdGlvbnMge1xuICBiZWZvcmVSZXRyeT86IChlcnJvcjogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgaGFuZGxlRXJyb3I/OiAoZXJyb3I6IHVua25vd24pID0+IFByb21pc2U8dm9pZD47XG4gIHJldHJ5Q291bnQ/OiBudW1iZXI7XG4gIHJldHJ5TG9nZ2VyPzogKG1lc3NhZ2U6IHN0cmluZykgPT4gdm9pZDtcbiAgc2hvdWxkUmV0cnk/OiAoZXJyb3I6IHVua25vd24pID0+IGJvb2xlYW47XG4gIHNsZWVwTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuICB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcz86IChzbGVlcE1pbGxpc2Vjb25kczogbnVtYmVyKSA9PiBudW1iZXI7XG59XG5cbi8qKlxuICogUmV0cnkgdGhlIGdpdmVuIGZ1bmN0aW9uLlxuICogQHBhcmFtIGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJldHJ5LlxuICogQHBhcmFtIGJlZm9yZVJldHJ5IFRoZSBmdW5jdGlvbiB0byBjYWxsIGltbWVkaWF0ZWx5IGJlZm9yZSByZXRyeWluZy5cbiAqIEBwYXJhbSBoYW5kbGVFcnJvciBUaGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIGFuIGVycm9yIG9jY3Vycy5cbiAqIEBwYXJhbSByZXRyeUNvdW50IFRoZSBtYXhpbXVtIG51bWJlciBvZiByZXRyaWVzLlxuICogQHBhcmFtIHJldHJ5TG9nZ2VyIFRoZSBmdW5jdGlvbiB0byBsb2cgcmV0cnlpbmcuXG4gKiBAcGFyYW0gc2xlZXBNaWxsaXNlY29uZHMgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gc2xlZXAgYmVmb3JlIHJldHJ5aW5nLlxuICogQHBhcmFtIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzIFRoZSBmdW5jdGlvbiB0byB1cGRhdGUgc2xlZXAgbWlsbGlzZWNvbmRzIGFmdGVyIGVhY2ggcmV0cnkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3aXRoUmV0cnk8VD4oXG4gIGZ1bmM6IChmYWlsZWRDb3VudDogbnVtYmVyKSA9PiBUIHwgUHJvbWlzZTxUPixcbiAge1xuICAgIGJlZm9yZVJldHJ5LFxuICAgIGhhbmRsZUVycm9yLFxuICAgIHJldHJ5Q291bnQgPSAzLFxuICAgIHJldHJ5TG9nZ2VyLFxuICAgIHNob3VsZFJldHJ5LFxuICAgIHNsZWVwTWlsbGlzZWNvbmRzID0gMCxcbiAgICB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcyxcbiAgfTogUmV0cnlPcHRpb25zID0ge31cbik6IFByb21pc2U8VD4ge1xuICBsZXQgZmFpbGVkQ291bnQgPSAwO1xuICBmb3IgKDs7KSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmdW5jKGZhaWxlZENvdW50KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgYXdhaXQgaGFuZGxlRXJyb3I/LihlcnJvcik7XG4gICAgICBmYWlsZWRDb3VudCsrO1xuICAgICAgaWYgKGZhaWxlZENvdW50ID49IHJldHJ5Q291bnQpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBpZiAoc2hvdWxkUmV0cnkgJiYgIXNob3VsZFJldHJ5KGVycm9yKSkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGlmIChzbGVlcE1pbGxpc2Vjb25kcyA+IDApIHtcbiAgICAgICAgYXdhaXQgc2xlZXAoc2xlZXBNaWxsaXNlY29uZHMpO1xuICAgICAgfVxuICAgICAgaWYgKHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzKSB7XG4gICAgICAgIHNsZWVwTWlsbGlzZWNvbmRzID0gdXBkYXRlU2xlZXBNaWxsaXNlY29uZHMoc2xlZXBNaWxsaXNlY29uZHMpO1xuICAgICAgfVxuICAgICAgcmV0cnlMb2dnZXI/LihgUmV0cnkgZHVlIHRvOiAke2Vycm9yfVxuJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gJy0tLVxcbicgKyAoZXJyb3Iuc3RhY2sgPz8gJycpIDogJyd9YCk7XG4gICAgICBhd2FpdCBiZWZvcmVSZXRyeT8uKGVycm9yKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgeyBjb25zdGFudHMgfSBmcm9tICdub2RlOm9zJztcblxuaW1wb3J0IHsgdHJlZUtpbGwgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QsIHR5cGUgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgY29uZmlndXJlRW52LCBub3JtYWxpemVTY3JpcHQgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgJ2tpbGwtb3RoZXJzJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnS2lsbCBvdGhlciBjb21tYW5kcyB3aGVuIG9uZSBjb21tYW5kIGV4aXRzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gICdraWxsLW90aGVycy1vbi1mYWlsJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnS2lsbCBvdGhlciBjb21tYW5kcyB3aGVuIG9uZSBjb21tYW5kIGZhaWxzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIHN1Y2Nlc3M6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0RlZmluZSBzdWNjZXNzZnVsIGNvbXBsZXRpb24gY3JpdGVyaWEnLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGNob2ljZXM6IFsnYWxsJywgJ2ZpcnN0J10sXG4gICAgZGVmYXVsdDogJ2FsbCcsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBhcmd1bWVudHNCdWlsZGVyID0ge1xuICBjb21tYW5kczoge1xuICAgIGRlc2NyaXB0aW9uOiAnQ29tbWFuZHMgdG8gcnVuIGNvbmN1cnJlbnRseScsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmludGVyZmFjZSBSdW5Db25jdXJyZW50bHlPcHRpb25zIHtcbiAgY29tbWFuZHM6IHN0cmluZ1tdO1xuICBwcm9qZWN0OiBQcm9qZWN0O1xuICBraWxsT3RoZXJzOiBib29sZWFuO1xuICBraWxsT3RoZXJzT25GYWlsOiBib29sZWFuO1xuICBzdWNjZXNzOiAnYWxsJyB8ICdmaXJzdCc7XG4gIGNpPzogYm9vbGVhbjtcbiAgZm9yY2VDb2xvcj86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCBjb25jdXJyZW50bHlDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIGFyZ3VtZW50c0J1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAnY29uY3VycmVudGx5IDxjb21tYW5kcy4uLj4nLFxuICBkZXNjcmliZTogJ1J1biBjb21tYW5kcyBjb25jdXJyZW50bHknLFxuICBidWlsZGVyOiB7IC4uLnNoYXJlZE9wdGlvbnNCdWlsZGVyLCAuLi5idWlsZGVyLCAuLi5hcmd1bWVudHNCdWlsZGVyIH0sXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnVGhpcyBjb21tYW5kIGlzIG5vdCBzdXBwb3J0ZWQgb24gV2luZG93cy4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2KTtcbiAgICBpZiAoIXByb2plY3QpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb21tYW5kcyA9IChhcmd2LmNvbW1hbmRzID8/IFtdKS5tYXAoU3RyaW5nKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgaWYgKGNvbW1hbmRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIGNvbW1hbmRzIHByb3ZpZGVkLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5Db25jdXJyZW50bHkoe1xuICAgICAgICBjb21tYW5kcyxcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAga2lsbE90aGVyczogYXJndi5raWxsT3RoZXJzID8/IGZhbHNlLFxuICAgICAgICBraWxsT3RoZXJzT25GYWlsOiBhcmd2LmtpbGxPdGhlcnNPbkZhaWwgPz8gZmFsc2UsXG4gICAgICAgIHN1Y2Nlc3M6IGFyZ3Yuc3VjY2VzcyxcbiAgICAgICAgY2k6IHR5cGVvZiBhcmd2LmNpID09PSAnYm9vbGVhbicgPyBhcmd2LmNpIDogdW5kZWZpbmVkLFxuICAgICAgICBmb3JjZUNvbG9yOiB0eXBlb2YgYXJndi5mb3JjZUNvbG9yID09PSAnYm9vbGVhbicgPyBhcmd2LmZvcmNlQ29sb3IgOiB1bmRlZmluZWQsXG4gICAgICB9KTtcbiAgICAgIHByb2Nlc3MuZXhpdChleGl0Q29kZSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSkpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5Db25jdXJyZW50bHkob3B0aW9uczogUnVuQ29uY3VycmVudGx5T3B0aW9ucyk6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IGNoaWxkcmVuID0gb3B0aW9ucy5jb21tYW5kcy5tYXAoKGNvbW1hbmQpID0+XG4gICAgY2hpbGRfcHJvY2Vzcy5zcGF3bihub3JtYWxpemVTY3JpcHQoY29tbWFuZCwgb3B0aW9ucy5wcm9qZWN0KS5ydW5uYWJsZSwge1xuICAgICAgY3dkOiBvcHRpb25zLnByb2plY3QuZGlyUGF0aCxcbiAgICAgIGRldGFjaGVkOiB0cnVlLFxuICAgICAgZW52OiBjb25maWd1cmVFbnYob3B0aW9ucy5wcm9qZWN0LmVudiwgeyBjaTogb3B0aW9ucy5jaSwgZm9yY2VDb2xvcjogb3B0aW9ucy5mb3JjZUNvbG9yIH0pLFxuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIH0pXG4gICk7XG5cbiAgbGV0IHN0b3BwaW5nID0gZmFsc2U7XG4gIGxldCBpbnRlcnJ1cHRlZFNpZ25hbDogTm9kZUpTLlNpZ25hbHMgfCB1bmRlZmluZWQ7XG4gIGxldCBmaXJzdFJlc3VsdDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBsZXQgc3RvcFJlc3VsdDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBjb25zdCByZXN1bHRzID0gQXJyYXkuZnJvbTxudW1iZXIgfCB1bmRlZmluZWQ+KHsgbGVuZ3RoOiBjaGlsZHJlbi5sZW5ndGggfSk7XG4gIGNvbnN0IHdhaXRGb3JFeGl0UHJvbWlzZXMgPSBjaGlsZHJlbi5tYXAoKGNoaWxkLCBpbmRleCkgPT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgbGV0IHNldHRsZWQgPSBmYWxzZTtcbiAgICAgIGNvbnN0IHNldHRsZSA9IChleGl0Q29kZTogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG5cbiAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgIHJlc3VsdHNbaW5kZXhdID0gZXhpdENvZGU7XG4gICAgICAgIGZpcnN0UmVzdWx0ID8/PSBleGl0Q29kZTtcblxuICAgICAgICBpZiAoIXN0b3BwaW5nICYmIHNob3VsZFN0b3BPdGhlcnMoZXhpdENvZGUsIG9wdGlvbnMpKSB7XG4gICAgICAgICAgc3RvcFJlc3VsdCA9IGV4aXRDb2RlO1xuICAgICAgICAgIHN0b3BwaW5nID0gdHJ1ZTtcbiAgICAgICAgICB0ZXJtaW5hdGVDaGlsZHJlbihjaGlsZHJlbik7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfTtcblxuICAgICAgY2hpbGQub25jZSgnZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIHN0YXJ0IGNoaWxkIHByb2Nlc3M6JywgZXJyb3IpO1xuICAgICAgICBzZXR0bGUoMSk7XG4gICAgICB9KTtcbiAgICAgIGNoaWxkLm9uY2UoJ2V4aXQnLCAoY29kZSwgc2lnbmFsKSA9PiB7XG4gICAgICAgIHNldHRsZShnZXRFeGl0Q29kZShjb2RlID8/IHVuZGVmaW5lZCwgc2lnbmFsID8/IHVuZGVmaW5lZCkpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGNvbnN0IHN0b3BBbGwgPSAoc2lnbmFsOiBOb2RlSlMuU2lnbmFscyk6IHZvaWQgPT4ge1xuICAgIGludGVycnVwdGVkU2lnbmFsID8/PSBzaWduYWw7XG4gICAgaWYgKHN0b3BwaW5nKSByZXR1cm47XG5cbiAgICBzdG9wcGluZyA9IHRydWU7XG4gICAgdGVybWluYXRlQ2hpbGRyZW4oY2hpbGRyZW4pO1xuICB9O1xuICBjb25zdCBzdG9wT25TaWdpbnQgPSAoKTogdm9pZCA9PiB7XG4gICAgc3RvcEFsbCgnU0lHSU5UJyk7XG4gIH07XG4gIGNvbnN0IHN0b3BPblNpZ3Rlcm0gPSAoKTogdm9pZCA9PiB7XG4gICAgc3RvcEFsbCgnU0lHVEVSTScpO1xuICB9O1xuICBjb25zdCBzdG9wT25TaWdxdWl0ID0gKCk6IHZvaWQgPT4ge1xuICAgIHN0b3BBbGwoJ1NJR1FVSVQnKTtcbiAgfTtcbiAgcHJvY2Vzcy5vbignU0lHSU5UJywgc3RvcE9uU2lnaW50KTtcbiAgcHJvY2Vzcy5vbignU0lHVEVSTScsIHN0b3BPblNpZ3Rlcm0pO1xuICBwcm9jZXNzLm9uKCdTSUdRVUlUJywgc3RvcE9uU2lncXVpdCk7XG4gIHRyeSB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwod2FpdEZvckV4aXRQcm9taXNlcyk7XG4gIH0gZmluYWxseSB7XG4gICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignU0lHSU5UJywgc3RvcE9uU2lnaW50KTtcbiAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKCdTSUdURVJNJywgc3RvcE9uU2lndGVybSk7XG4gICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignU0lHUVVJVCcsIHN0b3BPblNpZ3F1aXQpO1xuICB9XG5cbiAgaWYgKGludGVycnVwdGVkU2lnbmFsKSB7XG4gICAgcmV0dXJuIGdldEV4aXRDb2RlKHVuZGVmaW5lZCwgaW50ZXJydXB0ZWRTaWduYWwpO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMuc3VjY2VzcyA9PT0gJ2ZpcnN0Jykge1xuICAgIHJldHVybiBmaXJzdFJlc3VsdCA/PyAxO1xuICB9XG4gIGlmIChzdG9wUmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gc3RvcFJlc3VsdDtcbiAgfVxuICBmb3IgKGNvbnN0IHJlc3VsdCBvZiByZXN1bHRzKSB7XG4gICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkICYmIHJlc3VsdCAhPT0gMCkge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbmZ1bmN0aW9uIGdldEV4aXRDb2RlKGNvZGU6IG51bWJlciB8IHVuZGVmaW5lZCwgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyB8IHVuZGVmaW5lZCk6IG51bWJlciB7XG4gIGlmIChjb2RlICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gY29kZTtcbiAgfVxuICBpZiAoc2lnbmFsICYmIHNpZ25hbCBpbiBjb25zdGFudHMuc2lnbmFscykge1xuICAgIHJldHVybiAxMjggKyBjb25zdGFudHMuc2lnbmFsc1tzaWduYWxdO1xuICB9XG4gIHJldHVybiAxO1xufVxuXG5mdW5jdGlvbiBzaG91bGRTdG9wT3RoZXJzKFxuICBleGl0Q29kZTogbnVtYmVyLFxuICBvcHRpb25zOiBQaWNrPFJ1bkNvbmN1cnJlbnRseU9wdGlvbnMsICdraWxsT3RoZXJzJyB8ICdraWxsT3RoZXJzT25GYWlsJyB8ICdzdWNjZXNzJz5cbik6IGJvb2xlYW4ge1xuICByZXR1cm4gb3B0aW9ucy5zdWNjZXNzID09PSAnZmlyc3QnIHx8IG9wdGlvbnMua2lsbE90aGVycyB8fCAob3B0aW9ucy5raWxsT3RoZXJzT25GYWlsICYmIGV4aXRDb2RlICE9PSAwKTtcbn1cblxuZnVuY3Rpb24gdGVybWluYXRlQ2hpbGRyZW4oY2hpbGRyZW46IGNoaWxkX3Byb2Nlc3MuQ2hpbGRQcm9jZXNzW10pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZHJlbikge1xuICAgIGlmICghY2hpbGQucGlkKSBjb250aW51ZTtcblxuICAgIHRyeSB7XG4gICAgICBraWxsUHJvY2Vzc0dyb3VwKGNoaWxkLnBpZCk7XG4gICAgICB0cmVlS2lsbChjaGlsZC5waWQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0ZhaWxlZCB0byBraWxsIGNoaWxkIHByb2Nlc3M6JywgZXJyb3IpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBraWxsUHJvY2Vzc0dyb3VwKHBpZDogbnVtYmVyKTogdm9pZCB7XG4gIHRyeSB7XG4gICAgcHJvY2Vzcy5raWxsKC1waWQsICdTSUdURVJNJyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGlzTm9TdWNoUHJvY2Vzc0Vycm9yKGVycm9yKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc05vU3VjaFByb2Nlc3NFcnJvcihlcnJvcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAhPT0gbnVsbCAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ0VTUkNIJztcbn1cbiIsImltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQga2lsbFBvcnRQcm9jZXNzIGZyb20gJ2tpbGwtcG9ydCc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgaXNDSSB9IGZyb20gJy4uL3V0aWxzL2NpLmpzJztcblxuY29uc3Qga2lsbFBvcnRJZk5vbkNpQnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qga2lsbFBvcnRJZk5vbkNpQ29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Yga2lsbFBvcnRJZk5vbkNpQnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj5cbj4gPSB7XG4gIGNvbW1hbmQ6ICdraWxsLXBvcnQtaWYtbm9uLWNpJyxcbiAgZGVzY3JpYmU6ICdLaWxsIHRoZSBwb3J0IHNwZWNpZmllZCBieSBQT1JUIGVudmlyb25tZW50IHZhcmlhYmxlIGlmIG5vbi1DSS4nLFxuICBidWlsZGVyOiBraWxsUG9ydElmTm9uQ2lCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCBraWxsUG9ydElmTm9uQ2koYXJndik7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24ga2lsbFBvcnRJZk5vbkNpKFxuICBhcmd2OiBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Yga2lsbFBvcnRJZk5vbkNpQnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2KTtcbiAgaWYgKCFwcm9qZWN0KSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGlmIChpc0NJKHByb2plY3QuZW52LkNJKSkge1xuICAgIGNvbnNvbGUuaW5mbyhgU2tpcCBraWxsaW5nIHBvcnQgZHVlIHRvIENJOiAke3Byb2plY3QuZW52LkNJfWApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHBvcnRFbnYgPSBwcm9qZWN0LmVudi5QT1JUO1xuICBjb25zdCBwb3J0ID0gTnVtYmVyKHBvcnRFbnYpO1xuICBpZiAoIU51bWJlci5pc0ludGVnZXIocG9ydCkgfHwgcG9ydCA8PSAwKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoYFBPUlQgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgaW52YWxpZDogJHtwb3J0RW52fWApKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBjb25zb2xlLmluZm8oYEtpbGxpbmcgdGhlIHBvcnQ6ICR7cG9ydH1gKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBraWxsUG9ydFByb2Nlc3MocG9ydCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiogcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKGNvbW1hbmROYW1lOiBzdHJpbmcsIHByb2plY3RzOiBQcm9qZWN0W10pOiBHZW5lcmF0b3I8UHJvamVjdCwgdm9pZCwgdW5rbm93bj4ge1xuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmluZm8oYFJ1bm5pbmcgXCIke2NvbW1hbmROYW1lfVwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICB5aWVsZCBwcm9qZWN0O1xuICB9XG59XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBwYWNrYWdlTWFuYWdlciB9IGZyb20gJy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuXG5pbXBvcnQgeyBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRVdGlscy5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIG91dHNpZGU6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdGhlIG9wdGltaXphdGlvbiBpcyBleGVjdXRlZCBvdXRzaWRlIGEgZG9ja2VyIGNvbnRhaW5lciBvciBub3QnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBhbGlhczogJ28nLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IG9wdGltaXplRm9yRG9ja2VyQnVpbGRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ29wdGltaXplRm9yRG9ja2VyQnVpbGQnLFxuICBkZXNjcmliZTogJ09wdGltaXplIGNvbmZpZ3VyYXRpb24gd2hlbiBidWlsZGluZyBhIERvY2tlciBpbWFnZScsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2KTtcbiAgICBpZiAoIXByb2plY3RzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgnb3B0aW1pemVGb3JEb2NrZXJCdWlsZCcsIHByb2plY3RzLmRlc2NlbmRhbnRzKSkge1xuICAgICAgY29uc3QgcGFja2FnZUpzb246IFBhY2thZ2VKc29uID0gcHJvamVjdC5wYWNrYWdlSnNvbjtcbiAgICAgIGNvbnN0IGtleXMgPSBbJ2RlcGVuZGVuY2llcycsICdkZXZEZXBlbmRlbmNpZXMnXSBhcyBjb25zdDtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgICAgY29uc3QgZGVwcyA9IHBhY2thZ2VKc29uW2tleV0gPz8ge307XG4gICAgICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhkZXBzKSkge1xuICAgICAgICAgIGlmICh2YWx1ZT8uc3RhcnRzV2l0aCgnZ2l0QGdpdGh1Yi5jb206JykpIHtcbiAgICAgICAgICAgIGRlcHNbbmFtZV0gPSBgLi8ke25hbWV9YDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgb3B0aW1pemVEZXZEZXBlbmRlbmNpZXMoYXJndiwgcGFja2FnZUpzb24pO1xuXG4gICAgICBvcHRpbWl6ZVNjcmlwdHMocGFja2FnZUpzb24pO1xuXG4gICAgICBvcHRpbWl6ZVJvb3RQcm9wcyhwYWNrYWdlSnNvbik7XG5cbiAgICAgIGlmIChhcmd2LmRyeVJ1bikgY29udGludWU7XG5cbiAgICAgIGNvbnN0IGRpc3REaXJQYXRoID0gYXJndi5vdXRzaWRlID8gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ2Rpc3QnKSA6IHByb2plY3QuZGlyUGF0aDtcbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKGRpc3REaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLmpvaW4oZGlzdERpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgSlNPTi5zdHJpbmdpZnkocGFja2FnZUpzb24pLCAndXRmOCcpO1xuICAgIH1cbiAgICBpZiAoIWFyZ3YuZHJ5UnVuICYmICFhcmd2Lm91dHNpZGUpIHtcbiAgICAgIGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ2luc3RhbGwnXSwge1xuICAgICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgICAgfSk7XG4gICAgICBjb25zb2xlLmluZm8oJ0luc3RhbGxlZCBkZXBlbmRlbmNpZXMuJyk7XG4gICAgfVxuICB9LFxufTtcblxuZnVuY3Rpb24gb3B0aW1pemVEZXZEZXBlbmRlbmNpZXMoYXJndjogSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4sIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IHZvaWQge1xuICBpZiAoIWFyZ3Yub3V0c2lkZSkge1xuICAgIGRlbGV0ZSBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM7XG4gICAgY29uc29sZS5pbmZvKCdSZW1vdmVkIGFsbCBkZXZEZXBlbmRlbmNpZXMuJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgZGV2RGVwcyA9IHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAgY29uc3QgbmFtZVdvcmRzVG9CZVJlbW92ZWQgPSBbXG4gICAgJ2FydGlsbGVyeScsXG4gICAgJ2Jpb21lJyxcbiAgICAnY29uY3VycmVudGx5JyxcbiAgICAnY29udmVudGlvbmFsLWNoYW5nZWxvZy1jb252ZW50aW9uYWxjb21taXRzJyxcbiAgICAnZXNsaW50JyxcbiAgICAnaHVza3knLFxuICAgICdpbWFnZW1pbicsXG4gICAgJ2plc3QnLFxuICAgICdraWxsLXBvcnQnLFxuICAgICdsaW50LXN0YWdlZCcsXG4gICAgJ29wZW4tY2xpJyxcbiAgICAncGxheXdyaWdodCcsXG4gICAgJ3ByZXR0aWVyJyxcbiAgICAncGluc3QnLFxuICAgICdyYWlsd2F5JyxcbiAgICAnc2VtYW50aWMtcmVsZWFzZScsXG4gICAgJ3NvcnQtcGFja2FnZS1qc29uJyxcbiAgICAnd2FpdC1vbicsXG4gICAgJ3ZpdGVzdCcsXG4gIF07XG4gIGNvbnN0IHJlbW92ZWREZXBzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmtleXMoZGV2RGVwcykpIHtcbiAgICBpZiAoXG4gICAgICBuYW1lV29yZHNUb0JlUmVtb3ZlZC5zb21lKCh3b3JkKSA9PiBuYW1lLmluY2x1ZGVzKHdvcmQpKSB8fFxuICAgICAgKG5hbWUuaW5jbHVkZXMoJ3dpbGxib29zdGVyJykgJiYgbmFtZS5pbmNsdWRlcygnY29uZmlnJykpXG4gICAgKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gICAgICBkZWxldGUgZGV2RGVwc1tuYW1lXTtcbiAgICAgIHJlbW92ZWREZXBzLnB1c2gobmFtZSk7XG4gICAgfVxuICB9XG4gIGNvbnNvbGUuaW5mbygnUmVtb3ZlZCBkZXZEZXBlbmRlbmNpZXM6JywgcmVtb3ZlZERlcHMuam9pbignLCAnKSB8fCAnbm9uZScpO1xufVxuXG5mdW5jdGlvbiBvcHRpbWl6ZVNjcmlwdHMocGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGNvbnN0IG5hbWVXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzID0gWydjaGVjaycsICdkZXBsb3knLCAnZm9ybWF0JywgJ2xpbnQnLCAnc3RhcnQnLCAndGVzdCddO1xuICBjb25zdCBjb250ZW50V29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cyA9IFsncGluc3QgJywgJ2h1c2t5ICddO1xuICBjb25zdCBzY3JpcHRzID0gKHBhY2thZ2VKc29uLnNjcmlwdHMgPz8ge30pIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIGNvbnN0IHJlbW92ZWRTY3JpcHRzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IFtuYW1lLCBjb250ZW50XSBvZiBPYmplY3QuZW50cmllcyhzY3JpcHRzKSkge1xuICAgIGlmIChcbiAgICAgIG5hbWVXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzLnNvbWUoKHdvcmQpID0+IG5hbWUuc3RhcnRzV2l0aCh3b3JkKSkgfHxcbiAgICAgIC8vIFN1cHBvcnQgXCJodXNreVwiIHNpbmNlIGh1c2t5IHY5IHJlcXVpcmVzIGBcInBvc3RpbnN0YWxsXCI6IFwiaHVza3lcImBcbiAgICAgIGNvbnRlbnRXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzLnNvbWUoKHdvcmQpID0+IGNvbnRlbnQuaW5jbHVkZXMod29yZCkgfHwgY29udGVudC50cmltKCkgPT09IHdvcmQudHJpbSgpKVxuICAgICkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZVxuICAgICAgZGVsZXRlIHNjcmlwdHNbbmFtZV07XG4gICAgICByZW1vdmVkU2NyaXB0cy5wdXNoKG5hbWUpO1xuICAgIH1cbiAgfVxuICBjb25zb2xlLmluZm8oJ1JlbW92ZWQgc2NyaXB0czonLCByZW1vdmVkU2NyaXB0cy5qb2luKCcsICcpIHx8ICdub25lJyk7XG59XG5cbmZ1bmN0aW9uIG9wdGltaXplUm9vdFByb3BzKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IHZvaWQge1xuICBkZWxldGUgcGFja2FnZUpzb24ucHJpdmF0ZTtcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnB1Ymxpc2hDb25maWc7XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5wcmV0dGllcjtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcblxuaW1wb3J0IHR5cGUgeyBFbnZSZWFkZXJPcHRpb25zIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBwcmlzbWFTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9wcmlzbWFTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgYnVpbGRTaGVsbENvbW1hbmQgfSBmcm9tICcuLi91dGlscy9zaGVsbC5qcyc7XG5cbmltcG9ydCB7IHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZFV0aWxzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgcHJpc21hQ29tbWFuZDogQ29tbWFuZE1vZHVsZSA9IHtcbiAgY29tbWFuZDogJ3ByaXNtYScsXG4gIGRlc2NyaWJlOlxuICAgIFwiUnVuIHByaXNtYSBjb21tYW5kcy4gVXNlICctLScgdG8gc3RvcCB3YiBvcHRpb24gcGFyc2luZyBhbmQgZm9yd2FyZCB0aGUgcmVtYWluaW5nIGFyZ3VtZW50cyB0byBQcmlzbWEuIEV4YW1wbGU6IHdiIHByaXNtYSBtaWdyYXRlLWRldiAtLSAtLW5hbWUgaW5pdFwiLFxuICBidWlsZGVyOiAoeWFyZ3MpID0+IHtcbiAgICByZXR1cm4geWFyZ3NcbiAgICAgIC5wYXJzZXJDb25maWd1cmF0aW9uKHsgJ3BvcHVsYXRlLS0nOiB0cnVlIH0pXG4gICAgICAuY29tbWFuZChjbGVhblVwTGl0ZXN0cmVhbUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChjcmVhdGVMaXRlc3RyZWFtQ29uZmlnQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKGRlcGxveUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChkZXBsb3lGb3JjZUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChsaXN0QmFja3Vwc0NvbW1hbmQpXG4gICAgICAuY29tbWFuZChtaWdyYXRlQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKG1pZ3JhdGVEZXZDb21tYW5kKVxuICAgICAgLmNvbW1hbmQocmVzZXRDb21tYW5kKVxuICAgICAgLmNvbW1hbmQocmVzdG9yZUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChzZWVkQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKHN0dWRpb0NvbW1hbmQpXG4gICAgICAuY29tbWFuZChkZWZhdWx0Q29tbWFuZClcbiAgICAgIC5kZW1hbmRDb21tYW5kKClcbiAgICAgIC5zdHJpY3QoZmFsc2UpOyAvLyBBbGxvdyB1bmtub3duIG9wdGlvbnMgdG8gYmUgcGFzc2VkIHRocm91Z2hcbiAgfSxcbiAgaGFuZGxlcigpIHtcbiAgICAvLyBEbyBub3RoaW5nXG4gIH0sXG59O1xuXG5jb25zdCBjbGVhblVwTGl0ZXN0cmVhbUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnY2xlYW51cC1saXRlc3RyZWFtJyxcbiAgZGVzY3JpYmU6ICdDbGVhbiB1cCB0ZW1wb3JhbCBMaXRlc3RyZWFtIGZpbGVzJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIGNsZWFudXAtbGl0ZXN0cmVhbScsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMuY2xlYW5VcExpdGVzdHJlYW0ocHJvamVjdCksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IGNyZWF0ZUxpdGVzdHJlYW1Db25maWdDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2NyZWF0ZS1saXRlc3RyZWFtLWNvbmZpZycsXG4gIGRlc2NyaWJlOiAnQ3JlYXRlIExpdGVzdHJlYW0gY29uZmlndXJhdGlvbiBmaWxlJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIGNyZWF0ZS1saXRlc3RyZWFtLWNvbmZpZycsIGFsbFByb2plY3RzKSkge1xuICAgICAgY3JlYXRlTGl0ZXN0cmVhbUNvbmZpZyhwcm9qZWN0KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBkZXBsb3lDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2RlcGxveScsXG4gIGRlc2NyaWJlOiAnQXBwbHkgbWlncmF0aW9uIHRvIERCIHdpdGhvdXQgaW5pdGlhbGl6aW5nIGl0JyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIGRlcGxveScsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMuZGVwbG95KHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgZGVwbG95Rm9yY2VDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2RlcGxveS1mb3JjZScsXG4gIGRlc2NyaWJlOiBcIkZvcmNlIHRvIGFwcGx5IG1pZ3JhdGlvbiB0byBEQiB1dGlsaXppbmcgTGl0ZXN0cmVhbSdzIGJhY2t1cCB3aXRob3V0IGluaXRpYWxpemluZyBpdFwiLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgZGVwbG95LWZvcmNlJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5kZXBsb3lGb3JjZShwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgbGlzdEJhY2t1cHNDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2xpc3QtYmFja3VwcycsXG4gIGRlc2NyaWJlOiAnTGlzdCBMaXRlc3RyZWFtIGJhY2t1cHMnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgbGlzdC1iYWNrdXBzJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5saXN0QmFja3Vwcyhwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgbWlncmF0ZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnbWlncmF0ZScsXG4gIGRlc2NyaWJlOiAnQXBwbHkgbWlncmF0aW9uIHRvIERCIHdpdGggaW5pdGlhbGl6aW5nIGl0JyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIG1pZ3JhdGUnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLm1pZ3JhdGUocHJvamVjdCwgdW5rbm93bk9wdGlvbnMpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBtaWdyYXRlRGV2Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdtaWdyYXRlLWRldicsXG4gIGRlc2NyaWJlOiAnQ3JlYXRlIGEgbWlncmF0aW9uIGZpbGUnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgbWlncmF0ZS1kZXYnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLm1pZ3JhdGVEZXYocHJvamVjdCwgdW5rbm93bk9wdGlvbnMpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCByZXNldENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAncmVzZXQnLFxuICBkZXNjcmliZTogJ1Jlc2V0IERCJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIHJlc2V0JywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5yZXNldChwcm9qZWN0LCB1bmtub3duT3B0aW9ucyksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgICAvLyBGb3JjZSB0byByZXNldCB0ZXN0IGRhdGFiYXNlXG4gICAgaWYgKHByb2Nlc3MuZW52LldCX0VOViAhPT0gJ3Rlc3QnKSB7XG4gICAgICBwcm9jZXNzLmVudi5XQl9FTlYgPSAndGVzdCc7XG4gICAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdXQl9FTlY9dGVzdCBwcmlzbWEgcmVzZXQnLCBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndikpKSB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLnJlc2V0KHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgICB9XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgcmVzdG9yZUJ1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gIG91dHB1dDoge1xuICAgIGRlc2NyaXB0aW9uOiAnT3V0cHV0IHBhdGggb2YgdGhlIHJlc3RvcmVkIGRhdGFiYXNlLiBEZWZhdWx0cyB0byBcIjxkYnxwcmlzbWE+L3Jlc3RvcmVkLnNxbGl0ZTNcIi4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgcmVzdG9yZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgcmVzdG9yZUJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3Jlc3RvcmUnLFxuICBkZXNjcmliZTogXCJSZXN0b3JlIERCIGZyb20gTGl0ZXN0cmVhbSdzIGJhY2t1cFwiLFxuICBidWlsZGVyOiByZXN0b3JlQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIHJlc3RvcmUnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGNvbnN0IG91dHB1dCA9XG4gICAgICAgIGFyZ3Yub3V0cHV0ID8/IChwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHogPyAnZGIvcmVzdG9yZWQuc3FsaXRlMycgOiAncHJpc21hL3Jlc3RvcmVkLnNxbGl0ZTMnKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLnJlc3RvcmUocHJvamVjdCwgb3V0cHV0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3Qgc2VlZEJ1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gIGZpbGU6IHtcbiAgICBhbGlhczogJ2YnLFxuICAgIGRlc2NyaXB0aW9uOiAnUGF0aCBvZiB0aGUgc2VlZCBzY3JpcHQuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IHNlZWRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNlZWRCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdzZWVkJyxcbiAgZGVzY3JpYmU6ICdQb3B1bGF0ZSBEQiB3aXRoIHNlZWQgZGF0YScsXG4gIGJ1aWxkZXI6IHNlZWRCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgc2VlZCcsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMuc2VlZChwcm9qZWN0LCBhcmd2LmZpbGUpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBzdHVkaW9CdWlsZGVyID0ge1xuICAuLi5idWlsZGVyLFxuICAnZGItdXJsLW9yLXBhdGgnOiB7XG4gICAgZGVzY3JpcHRpb246ICdVUkwgb3IgcGF0aCB0byB0aGUgZGF0YWJhc2UnLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxuICByZXN0b3JlZDoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBvcGVuIHRoZSBkZWZhdWx0IHJlc3RvcmVkIGRhdGFiYXNlICg8ZGJ8cHJpc21hPi9yZXN0b3JlZC5zcWxpdGUzKS4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IHN0dWRpb0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc3R1ZGlvQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnc3R1ZGlvIFtkYi11cmwtb3ItcGF0aF0nLFxuICBkZXNjcmliZTogJ09wZW4gUHJpc21hIFN0dWRpbycsXG4gIGJ1aWxkZXI6IHN0dWRpb0J1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGlmIChhcmd2LnJlc3RvcmVkICYmIGFyZ3YuZGJVcmxPclBhdGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignWW91IGNhbm5vdCBzcGVjaWZ5IGJvdGggLS1yZXN0b3JlZCBhbmQgLS1kYi11cmwtb3ItcGF0aC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2LCBbJ2RiLXVybC1vci1wYXRoJywgJ3Jlc3RvcmVkJ10pO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSBzdHVkaW8nLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGNvbnN0IGRiVXJsT3JQYXRoID0gYXJndi5yZXN0b3JlZFxuICAgICAgICA/IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0elxuICAgICAgICAgID8gJ2RiL3Jlc3RvcmVkLnNxbGl0ZTMnXG4gICAgICAgICAgOiAncHJpc21hL3Jlc3RvcmVkLnNxbGl0ZTMnXG4gICAgICAgIDogYXJndi5kYlVybE9yUGF0aD8udG9TdHJpbmcoKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLnN0dWRpbyhwcm9qZWN0LCBkYlVybE9yUGF0aCwgdW5rbm93bk9wdGlvbnMpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBkZWZhdWx0Q29tbWFuZEJ1aWxkZXIgPSB7IGFyZ3M6IHsgdHlwZTogJ2FycmF5JyB9IH0gYXMgY29uc3Q7XG5cbmNvbnN0IGRlZmF1bHRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGRlZmF1bHRDb21tYW5kQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnJDAgPGFyZ3MuLj4nLFxuICBkZXNjcmliZTogXCJQYXNzIHRoZSBjb21tYW5kIGFuZCBhcmd1bWVudHMgdG8gcHJpc21hIGFzIGlzLiBBZGRpdGlvbmFsIFByaXNtYSBmbGFncyBjYW4gYWxzbyBiZSBmb3J3YXJkZWQgYWZ0ZXIgJy0tJy5cIixcbiAgYnVpbGRlcjogZGVmYXVsdENvbW1hbmRCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCBzY3JpcHQgPSAoYXJndi5hcmdzPy5qb2luKCcgJykgPz8gJycpLnRyaW1FbmQoKTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2LCBbJ2FyZ3MnXSk7XG4gICAgY29uc3QgZnVsbENvbW1hbmQgPSBbc2NyaXB0LCB1bmtub3duT3B0aW9uc10uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKGBwcmlzbWEgJHtmdWxsQ29tbWFuZH1gLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgUFJJU01BICR7ZnVsbENvbW1hbmR9YCwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuZnVuY3Rpb24gY3JlYXRlTGl0ZXN0cmVhbUNvbmZpZyhwcm9qZWN0OiBQcm9qZWN0KTogdm9pZCB7XG4gIGNvbnN0IGRpck5hbWUgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHogPyAnZGInIDogJ3ByaXNtYSc7XG4gIGNvbnN0IGRiUGF0aCA9IGAke2Rpck5hbWV9L21vdW50L3Byb2Quc3FsaXRlM2A7XG4gIGNvbnN0IHJlcXVpcmVkRW52VmFycyA9IHtcbiAgICBDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDT1VOVF9JRDogcHJvamVjdC5lbnYuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ09VTlRfSUQsXG4gICAgQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0JVQ0tFVF9OQU1FOiBwcm9qZWN0LmVudi5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQlVDS0VUX05BTUUsXG4gICAgQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ0VTU19LRVlfSUQ6IHByb2plY3QuZW52LkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9BQ0NFU1NfS0VZX0lELFxuICAgIENMT1VERkxBUkVfUjJfTElURVNUUkVBTV9TRUNSRVRfQUNDRVNTX0tFWTogcHJvamVjdC5lbnYuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX1NFQ1JFVF9BQ0NFU1NfS0VZLFxuICB9IGFzIGNvbnN0O1xuICBjb25zdCBtaXNzaW5nRW52VmFycyA9IE9iamVjdC5lbnRyaWVzKHJlcXVpcmVkRW52VmFycylcbiAgICAuZmlsdGVyKChbLCB2YWx1ZV0pID0+ICF2YWx1ZSlcbiAgICAubWFwKChba2V5XSkgPT4ga2V5KTtcbiAgaWYgKG1pc3NpbmdFbnZWYXJzLmxlbmd0aCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBMaXRlc3RyZWFtOiAke21pc3NpbmdFbnZWYXJzLmpvaW4oJywgJyl9YCk7XG4gIH1cblxuICBjb25zdCByZXRlbnRpb25DaGVja0ludGVydmFsID0gcHJvamVjdC5lbnYuV0JfRU5WID09PSAnc3RhZ2luZycgPyAnNW0nIDogJzFoJztcbiAgY29uc3QgbGl0ZXN0cmVhbUNvbmZpZyA9IGBkYnM6XG4gIC0gcGF0aDogJHtkYlBhdGh9XG4gICAgYnVzeS10aW1lb3V0OiA1c1xuICAgIGNoZWNrcG9pbnQtaW50ZXJ2YWw6IDFtXG4gICAgcmVwbGljYTpcbiAgICAgIHR5cGU6IHMzXG4gICAgICBlbmRwb2ludDogaHR0cHM6Ly8ke3JlcXVpcmVkRW52VmFycy5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDT1VOVF9JRH0ucjIuY2xvdWRmbGFyZXN0b3JhZ2UuY29tXG4gICAgICBidWNrZXQ6ICR7cmVxdWlyZWRFbnZWYXJzLkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9CVUNLRVRfTkFNRX1cbiAgICAgIGFjY2Vzcy1rZXktaWQ6ICR7cmVxdWlyZWRFbnZWYXJzLkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9BQ0NFU1NfS0VZX0lEfVxuICAgICAgc2VjcmV0LWFjY2Vzcy1rZXk6ICR7cmVxdWlyZWRFbnZWYXJzLkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9TRUNSRVRfQUNDRVNTX0tFWX1cbiAgICAgIHNuYXBzaG90LWludGVydmFsOiAyNGggICMgQ3JlYXRlIGEgYmFja3VwIHBlciBkYXlcbiAgICAgIHJldGVudGlvbjogNzJoICAgICAgICAgICMgS2VlcCBiYWNrdXBzIGZvciAzIGRheXNcbiAgICAgIHJldGVudGlvbi1jaGVjay1pbnRlcnZhbDogJHtyZXRlbnRpb25DaGVja0ludGVydmFsfVxuICAgICAgc3luYy1pbnRlcnZhbDogMW1cbmA7XG5cbiAgY29uc3QgY29uZmlnUGF0aCA9ICcvZXRjL2xpdGVzdHJlYW0ueW1sJztcbiAgdHJ5IHtcbiAgICBmcy53cml0ZUZpbGVTeW5jKGNvbmZpZ1BhdGgsIGxpdGVzdHJlYW1Db25maWcpO1xuICAgIGNvbnNvbGUuaW5mbyhgR2VuZXJhdGVkICR7Y29uZmlnUGF0aH1gKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zdCByZWFzb24gPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gd3JpdGUgJHtjb25maWdQYXRofTogJHtyZWFzb259YCwge1xuICAgICAgY2F1c2U6IGVycm9yLFxuICAgIH0pO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2OiBFbnZSZWFkZXJPcHRpb25zKTogUHJvbWlzZTxQcm9qZWN0W10+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGNvbnN0IGZpbHRlcmVkID0gcHJvamVjdHMuZGVzY2VuZGFudHMuZmlsdGVyKFxuICAgIChwcm9qZWN0KSA9PiBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8ucHJpc21hID8/IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy5wcmlzbWFcbiAgKTtcbiAgaWYgKGZpbHRlcmVkLmxlbmd0aCA9PT0gMCkge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcmlzbWEgcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG4gIHJldHVybiBmaWx0ZXJlZDtcbn1cblxuLyoqXG4gKiBFeHRyYWN0IHVua25vd24gb3B0aW9ucyBmcm9tIGFyZ3YgdG8gcGFzcyB0byBwcmlzbWEgY29tbWFuZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3Y6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBrbm93bk9wdGlvbnM6IHN0cmluZ1tdID0gW10pOiBzdHJpbmcge1xuICBjb25zdCB1bmtub3duT3B0aW9uczogc3RyaW5nW10gPSBbXTtcblxuICAvLyBCdWlsZCBsaXN0IG9mIGtub3duIG9wdGlvbnMgZnJvbSBzaGFyZWQgb3B0aW9ucyBidWlsZGVyc1xuICBjb25zdCBzaGFyZWRPcHRpb25LZXlzID0gT2JqZWN0LmtleXMoc2hhcmVkT3B0aW9uc0J1aWxkZXIpO1xuICBjb25zdCBzaGFyZWRPcHRpb25BbGlhc2VzID0gT2JqZWN0LnZhbHVlcyhzaGFyZWRPcHRpb25zQnVpbGRlcilcbiAgICAuZmxhdE1hcCgob3B0aW9uKSA9PiB7XG4gICAgICBpZiAoJ2FsaWFzJyBpbiBvcHRpb24pIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkob3B0aW9uLmFsaWFzKSA/IG9wdGlvbi5hbGlhcyA6IFtvcHRpb24uYWxpYXNdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtdO1xuICAgIH0pXG4gICAgLm1hcChTdHJpbmcpO1xuXG4gIGNvbnN0IGFsbEtub3duT3B0aW9ucyA9IG5ldyBTZXQoW1xuICAgIC4uLmtub3duT3B0aW9ucyxcbiAgICAuLi5zaGFyZWRPcHRpb25LZXlzLFxuICAgIC4uLnNoYXJlZE9wdGlvbkFsaWFzZXMsXG4gICAgLy8gSW50ZXJuYWwgeWFyZ3MgcHJvcGVydGllc1xuICAgICctLScsXG4gICAgJ18nLFxuICAgICckMCcsXG4gIF0pO1xuXG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGFyZ3YpKSB7XG4gICAgaWYgKCFhbGxLbm93bk9wdGlvbnMuaGFzKGtleSkpIHtcbiAgICAgIC8vIFNraXAgY2FtZWxDYXNlIHZlcnNpb25zIG9mIGtlYmFiLWNhc2Ugb3B0aW9ucyB0byBhdm9pZCBkdXBsaWNhdGlvblxuICAgICAgLy8gSWYgd2UgaGF2ZSBib3RoICdjcmVhdGUtb25seScgYW5kICdjcmVhdGVPbmx5JywgcHJlZmVyIHRoZSBrZWJhYi1jYXNlIHZlcnNpb25cbiAgICAgIGNvbnN0IGtlYmFiQ2FzZUtleSA9IGtleS5yZXBsYWNlQWxsKC9bQS1aXS9nLCAobWF0Y2gpID0+IGAtJHttYXRjaC50b0xvd2VyQ2FzZSgpfWApO1xuICAgICAgaWYgKGtlYmFiQ2FzZUtleSAhPT0ga2V5ICYmIGFyZ3Zba2ViYWJDYXNlS2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnRpbnVlOyAvLyBTa2lwIGNhbWVsQ2FzZSB2ZXJzaW9uIGlmIGtlYmFiLWNhc2UgZXhpc3RzXG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZSBib29sZWFuIGZsYWdzXG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicgJiYgdmFsdWUpIHtcbiAgICAgICAgdW5rbm93bk9wdGlvbnMucHVzaChgLS0ke2tleX1gKTtcbiAgICAgIH1cbiAgICAgIC8vIEhhbmRsZSBzdHJpbmcvbnVtYmVyIHZhbHVlc1xuICAgICAgZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHVua25vd25PcHRpb25zLnB1c2goYC0tJHtrZXl9YCwgU3RyaW5nKHZhbHVlKSk7XG4gICAgICB9XG4gICAgICAvLyBIYW5kbGUgYXJyYXlzXG4gICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdmFsdWUpIHtcbiAgICAgICAgICB1bmtub3duT3B0aW9ucy5wdXNoKGAtLSR7a2V5fWAsIFN0cmluZyhpdGVtKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBwYXNzdGhyb3VnaEFyZ3MgPSBBcnJheS5pc0FycmF5KGFyZ3ZbJy0tJ10pID8gYXJndlsnLS0nXS5tYXAoU3RyaW5nKSA6IFtdO1xuICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoWy4uLnVua25vd25PcHRpb25zLCAuLi5wYXNzdGhyb3VnaEFyZ3NdKTtcbn1cbiIsImltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmRTZWxmUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgcmV0cnk6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0EgbWF4aW11bSByZXRyeSBjb3VudCcsXG4gICAgdHlwZTogJ251bWJlcicsXG4gICAgYWxpYXM6ICdyJyxcbiAgICBkZWZhdWx0OiAzLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgX2FyZ3VtZW50c0J1aWxkZXIgPSB7XG4gIGNvbW1hbmQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0EgY29tbWFuZCB0byByZXRyeScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG4gIGFyZ3M6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0FyZ3VtZW50cyBmb3IgdGhlIGNvbW1hbmQnLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgcmV0cnlDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyICYgdHlwZW9mIF9hcmd1bWVudHNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ3JldHJ5IFtjb21tYW5kXSBbYXJncy4uLl0nLFxuICBkZXNjcmliZTogJ1JldHJ5IHRoZSBnaXZlbiBjb21tYW5kIHVudGlsIGl0IHN1Y2NlZWRzJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2KTtcbiAgICBpZiAoIXByb2plY3QpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBjbWRBbmRBcmdzID0gW2FyZ3YuY29tbWFuZCwgLi4uKGFyZ3YuYXJncyA/PyBbXSksIC4uLmFyZ3YuXy5zbGljZSgxKV0uZmlsdGVyKEJvb2xlYW4pO1xuICAgIGxldCBsYXN0U3RhdHVzID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3YucmV0cnk7IGkrKykge1xuICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhgXFxuJHtjaGFsay55ZWxsb3coYCMke2l9IFJldHJ5aW5nOiAke2NtZEFuZEFyZ3Muam9pbignICcpfWApfWApO1xuICAgICAgfVxuICAgICAgLy8gVE9ETzogc2hvdWxkIHdlIGFkZCBzaW5nbGUgcXVvdGVzIGFyb3VuZCBlYWNoIGFyZ3VtZW50P1xuICAgICAgbGFzdFN0YXR1cyA9IGF3YWl0IHJ1bldpdGhTcGF3bihjbWRBbmRBcmdzLmpvaW4oJyAnKSwgcHJvamVjdCwgYXJndiwge1xuICAgICAgICBleGl0SWZGYWlsZWQ6IGZhbHNlLFxuICAgICAgICBvblNpZ25hbDogKHNpZ25hbCkgPT4ge1xuICAgICAgICAgIGlmIChzaWduYWwpIHtcbiAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIGlmIChsYXN0U3RhdHVzID09PSAwKSByZXR1cm47XG4gICAgfVxuICAgIHByb2Nlc3MuZXhpdChsYXN0U3RhdHVzKTtcbiAgfSxcbn07XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IG9zIGZyb20gJ25vZGU6b3MnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biwgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgcGFja2FnZU1hbmFnZXJXaXRoUnVuIH0gZnJvbSAnLi4vdXRpbHMvcnVudGltZS5qcyc7XG5cbmltcG9ydCB7IHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZFV0aWxzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qgc2V0dXBDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3NldHVwJyxcbiAgZGVzY3JpYmU6ICdTZXR1cCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudC4gLmVudiBmaWxlcyBhcmUgaWdub3JlZC4nLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCBzZXR1cChhcmd2KTtcbiAgfSxcbn07XG5cbi8vIFRlc3QgY29kZSByZXF1aXJlcyBQYXJ0aWFsPC4uLj5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cChcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+PixcbiAgcHJvamVjdFBhdGhGb3JUZXN0aW5nPzogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YsIGZhbHNlLCBwcm9qZWN0UGF0aEZvclRlc3RpbmcpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3NldHVwJywgcHJvamVjdHMuZGVzY2VuZGFudHMpKSB7XG4gICAgY29uc3QgZGlyZW50cyA9IGF3YWl0IGZzLnJlYWRkaXIocHJvamVjdC5kaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgaWYgKHByb2plY3QgPT09IHByb2plY3RzLnJvb3QpIHtcbiAgICAgIGlmIChvcy5wbGF0Zm9ybSgpID09PSAnZGFyd2luJykge1xuICAgICAgICBjb25zdCBwYWNrYWdlcyA9IFsncHN0cmVlJ107XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoYGJyZXcgaW5zdGFsbCAke3BhY2thZ2VzLmpvaW4oJyAnKX1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRpcmVudHMuc29tZSgoZCkgPT4gZC5pc0ZpbGUoKSAmJiBkLm5hbWUuaW5jbHVkZXMoJy12ZXJzaW9uJykpKSB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bignYXNkZiBpbnN0YWxsJywgcHJvamVjdCwgYXJndiwgeyBleGl0SWZGYWlsZWQ6IGZhbHNlIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChkaXJlbnRzLnNvbWUoKGQpID0+IGQuaXNGaWxlKCkgJiYgZC5uYW1lID09PSAncHlwcm9qZWN0LnRvbWwnKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCgncG9ldHJ5IGNvbmZpZyB2aXJ0dWFsZW52cy5pbi1wcm9qZWN0IHRydWUnLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIGNvbnN0IFssIHZlcnNpb25dID0gY2hpbGRfcHJvY2Vzcy5leGVjU3luYygnYXNkZiBjdXJyZW50IHB5dGhvbicpLnRvU3RyaW5nKCkudHJpbSgpLnNwbGl0KC9cXHMrLyk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGBwb2V0cnkgZW52IHVzZSAke3ZlcnNpb259YCwgcHJvamVjdCwgYXJndik7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oJ3BvZXRyeSBydW4gcGlwIGluc3RhbGwgLS11cGdyYWRlIHBpcCcsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKCdwb2V0cnkgaW5zdGFsbCAtLWFuc2knLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICAocHJvamVjdCA9PT0gcHJvamVjdHMucm9vdCB8fCAhcHJvamVjdHMucm9vdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ2dlbi1jb2RlJ10pICYmXG4gICAgICBwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZ2VuLWNvZGUnXVxuICAgICkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3BhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gZ2VuLWNvZGVgLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBwcm9qZWN0ID0gcHJvamVjdHMuZGVzY2VuZGFudHMuZmluZCgocCkgPT4gcC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LnBsYXl3cmlnaHQpO1xuICBpZiAocHJvamVjdCkge1xuICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtwYWNrYWdlTWFuYWdlcldpdGhSdW59IHBsYXl3cmlnaHQgaW5zdGFsbCAtLXdpdGgtZGVwc2AsIHByb2plY3QsIGFyZ3YpO1xuICB9XG59XG4iLCJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd2LCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBub3JtYWxpemVBcmdzLCBzY3JpcHRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NjcmlwdHMvYnVpbGRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgYmxpdHpTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmxpdHpTY3JpcHRzLmpzJztcbmltcG9ydCB7IGh0dHBTZXJ2ZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vaHR0cFNlcnZlclNjcmlwdHMuanMnO1xuaW1wb3J0IHsgbmV4dFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9uZXh0U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwbGFpbkFwcFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9wbGFpbkFwcFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcmVtaXhTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcmVtaXhTY3JpcHRzLmpzJztcbmltcG9ydCB7IHZpdGVTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vdml0ZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuaW1wb3J0IHsgaHR0cFNlcnZlclBhY2thZ2VzIH0gZnJvbSAnLi9odHRwU2VydmVyUGFja2FnZXMuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICAuLi5zY3JpcHRPcHRpb25zQnVpbGRlcixcbiAgbW9kZToge1xuICAgIGRlc2NyaXB0aW9uOiAnU3RhcnQgbW9kZTogZGV2W2Vsb3BtZW50XSAoZGVmYXVsdCkgfCBzdGFnaW5nIHwgZG9ja2VyIHwgZG9ja2VyLWRlYnVnIHwgdGVzdCcsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICdtJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBzdGFydENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnc3RhcnQgW2FyZ3MuLl0nLFxuICBkZXNjcmliZTpcbiAgICBcIlN0YXJ0IGFwcC4gVXNlICctLScgdG8gc3RvcCB3YiBvcHRpb24gcGFyc2luZyBhbmQgZm9yd2FyZCB0aGUgcmVtYWluaW5nIGFyZ3VtZW50cyB0byB0aGUgdW5kZXJseWluZyBhcHAgY29tbWFuZC4gRXhhbXBsZTogd2Igc3RhcnQgLS0gLS1ob3N0IDAuMC4wLjBcIixcbiAgYnVpbGRlcjogKHlhcmdzOiBBcmd2PHVua25vd24+KSA9PlxuICAgIHlhcmdzLnBhcnNlckNvbmZpZ3VyYXRpb24oeyAncG9wdWxhdGUtLSc6IHRydWUgfSkub3B0aW9ucyhidWlsZGVyKSBhcyBBcmd2PFxuICAgICAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj5cbiAgICA+LFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBub3JtYWxpemVBcmdzKGFyZ3YpO1xuXG4gICAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICAgIGlmICghcHJvamVjdHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMuZGVzY2VuZGFudHMpIHtcbiAgICAgIGNvbnN0IGRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICAgIGNvbnN0IGRldkRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICAgIGxldCBzY3JpcHRzOiBCYXNlU2NyaXB0cztcbiAgICAgIGlmIChkZXBzLmJsaXR6KSB7XG4gICAgICAgIHNjcmlwdHMgPSBibGl0elNjcmlwdHM7XG4gICAgICB9IGVsc2UgaWYgKGRlcHMubmV4dCkge1xuICAgICAgICBzY3JpcHRzID0gbmV4dFNjcmlwdHM7XG4gICAgICB9IGVsc2UgaWYgKGRldkRlcHNbJ0ByZW1peC1ydW4vZGV2J10pIHtcbiAgICAgICAgc2NyaXB0cyA9IHJlbWl4U2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoZGV2RGVwcy52aXRlKSB7XG4gICAgICAgIHNjcmlwdHMgPSB2aXRlU2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIChodHRwU2VydmVyUGFja2FnZXMuc29tZSgocCkgPT4gZGVwc1twXSkgJiYgIWRlcHNbJ2ZpcmViYXNlLWZ1bmN0aW9ucyddKSB8fFxuICAgICAgICAocHJvamVjdC5oYXNEb2NrZXJmaWxlICYmIC9FWFBPU0VcXHMrODA4MC8udGVzdChwcm9qZWN0LmRvY2tlcmZpbGUpKVxuICAgICAgKSB7XG4gICAgICAgIHNjcmlwdHMgPSBodHRwU2VydmVyU2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoZGVwc1snYnVpbGQtdHMnXSB8fCBkZXZEZXBzWydidWlsZC10cyddKSB7XG4gICAgICAgIHNjcmlwdHMgPSBwbGFpbkFwcFNjcmlwdHM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyBcInN0YXJ0XCIgZm9yICR7cHJvamVjdC5uYW1lfSAuLi5gKTtcblxuICAgICAgc3dpdGNoIChhcmd2Lm1vZGUgPz8gJ2RldicpIHtcbiAgICAgICAgY2FzZSAnZGV2JzpcbiAgICAgICAgY2FzZSAnZGV2ZWxvcG1lbnQnOiB7XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAnZGV2ZWxvcG1lbnQnO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihhd2FpdCBzY3JpcHRzLnN0YXJ0RGV2KHByb2plY3QsIGFyZ3YpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdzdGFnaW5nJzoge1xuICAgICAgICAgIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3N0YWdpbmcnO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihhd2FpdCBzY3JpcHRzLnN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0LCBhcmd2KSwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZG9ja2VyJzoge1xuICAgICAgICAgIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3N0YWdpbmcnO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihhd2FpdCBzY3JpcHRzLnN0YXJ0RG9ja2VyKHByb2plY3QsIGFyZ3YpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdkb2NrZXItZGVidWcnOiB7XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAnc3RhZ2luZyc7XG4gICAgICAgICAgYXJndi5ub3JtYWxpemVkQXJnc1RleHQgPSBgJy9iaW4vYmFzaCdgO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihhd2FpdCBzY3JpcHRzLnN0YXJ0RG9ja2VyKHByb2plY3QsIGFyZ3YpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICd0ZXN0Jzoge1xuICAgICAgICAgIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3Rlc3QnO1xuICAgICAgICAgIGNvbnN0IHNjcmlwdCA9IGF3YWl0IHNjcmlwdHMuc3RhcnRUZXN0KHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihzY3JpcHQsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gc3RhcnQgbW9kZTogJHthcmd2Lm1vZGV9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG59O1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyB0b0Rldk51bGwgfSBmcm9tICcuLi9zY3JpcHRzL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZG9ja2VyU2NyaXB0cy5qcyc7XG5pbXBvcnQgdHlwZSB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgYmxpdHpTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmxpdHpTY3JpcHRzLmpzJztcbmltcG9ydCB7IGh0dHBTZXJ2ZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vaHR0cFNlcnZlclNjcmlwdHMuanMnO1xuaW1wb3J0IHsgbmV4dFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9uZXh0U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwbGFpbkFwcFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9wbGFpbkFwcFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcmVtaXhTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcmVtaXhTY3JpcHRzLmpzJztcbmltcG9ydCB7IHZpdGVTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vdml0ZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduLCBydW5XaXRoU3Bhd25JblBhcmFsbGVsIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5pbXBvcnQgeyBodHRwU2VydmVyUGFja2FnZXMgfSBmcm9tICcuL2h0dHBTZXJ2ZXJQYWNrYWdlcy5qcyc7XG5cbmNvbnN0IHRlc3RPbkNpQnVpbGRlciA9IHtcbiAgc2lsZW50OiB7XG4gICAgZGVzY3JpcHRpb246ICdSZWR1Y2UgcmVkdW5kYW50IG91dHB1dHMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5leHBvcnQgY29uc3QgdGVzdE9uQ2lDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiB0ZXN0T25DaUJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAndGVzdC1vbi1jaScsXG4gIGRlc2NyaWJlOiAnVGVzdCBwcm9qZWN0IG9uIENJIHdpdGggbm8gb3B0aW9ucy4nLFxuICBidWlsZGVyOiB0ZXN0T25DaUJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IHRlc3RPbkNpKGFyZ3YpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlc3RPbkNpKFxuICBhcmd2OiBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgdGVzdE9uQ2lCdWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj5cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgcHJvY2Vzcy5lbnYuQ0kgfHw9ICcxJztcbiAgcHJvY2Vzcy5lbnYuRk9SQ0VfQ09MT1IgfHw9ICczJztcbiAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAndGVzdCc7XG5cbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzLmRlc2NlbmRhbnRzKSB7XG4gICAgY29uc3QgZGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgIGNvbnN0IGRldkRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICBsZXQgc2NyaXB0czogQmFzZVNjcmlwdHM7XG4gICAgaWYgKGRlcHMuYmxpdHopIHtcbiAgICAgIHNjcmlwdHMgPSBibGl0elNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChkZXBzLm5leHQpIHtcbiAgICAgIHNjcmlwdHMgPSBuZXh0U2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGRldkRlcHNbJ0ByZW1peC1ydW4vZGV2J10pIHtcbiAgICAgIHNjcmlwdHMgPSByZW1peFNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChkZXZEZXBzLnZpdGUpIHtcbiAgICAgIHNjcmlwdHMgPSB2aXRlU2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGh0dHBTZXJ2ZXJQYWNrYWdlcy5zb21lKChwKSA9PiBkZXBzW3BdKSAmJiAhZGVwc1snZmlyZWJhc2UtZnVuY3Rpb25zJ10pIHtcbiAgICAgIHNjcmlwdHMgPSBodHRwU2VydmVyU2NyaXB0cztcbiAgICB9IGVsc2Uge1xuICAgICAgc2NyaXB0cyA9IHBsYWluQXBwU2NyaXB0cztcbiAgICB9XG5cbiAgICBjb25zb2xlLmluZm8oYFJ1bm5pbmcgXCJ0ZXN0LW9uLWNpXCIgZm9yICR7cHJvamVjdC5uYW1lfSAuLi5gKTtcblxuICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoZG9ja2VyU2NyaXB0cy5zdG9wQWxsKCksIHByb2plY3QsIGFyZ3YpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICd0ZXN0JywgJ3VuaXQnKSkpIHtcbiAgICAgIC8vIENJIG1vZGUgZGlzYWxsb3dzIGBvbmx5YCB0byBhdm9pZCBpbmNsdWRpbmcgZGVidWcgdGVzdHNcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoc2NyaXB0cy50ZXN0VW5pdChwcm9qZWN0LCBhcmd2KS5yZXBsYWNlQWxsKCcgLS1hbGxvd09ubHknLCAnJyksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAndGVzdCcsICdlMmUnKSkpIHtcbiAgICAgIC8vIEF2b2lkIGxhdW5jaGluZyBkZXYgc2VydmVycyBmb3IgYnVpbGQtb25seSBwYWNrYWdlczsgb25seSBzdGFydCBhIHNlcnZlciB3aGVuIEUyRSBuZWVkcyBpdC5cbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoYXdhaXQgc2NyaXB0cy50ZXN0U3RhcnQocHJvamVjdCwgYXJndiksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICAgICAgaWYgKHByb2plY3QuaGFzRG9ja2VyZmlsZSkge1xuICAgICAgICBwcm9qZWN0LmVudi5XQl9ET0NLRVIgfHw9ICcxJztcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3NjcmlwdHMuYnVpbGREb2NrZXIocHJvamVjdCwgJ3Rlc3QnKX0ke3RvRGV2TnVsbChhcmd2KX1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNjcmlwdCA9IHByb2plY3QuaGFzRG9ja2VyZmlsZVxuICAgICAgICA/IGF3YWl0IHNjcmlwdHMudGVzdEUyRURvY2tlcihwcm9qZWN0LCBhcmd2LCB7fSlcbiAgICAgICAgOiBhd2FpdCBzY3JpcHRzLnRlc3RFMkVQcm9kdWN0aW9uKHByb2plY3QsIGFyZ3YsIHt9KTtcbiAgICAgIHByb2Nlc3MuZXhpdENvZGUgPSBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgIC8vIENJIG1vZGUgZGlzYWxsb3dzIGBvbmx5YCB0byBhdm9pZCBpbmNsdWRpbmcgZGVidWcgdGVzdHNcbiAgICAgICAgc2NyaXB0LnJlcGxhY2VBbGwoJyAtLWFsbG93T25seScsICcnKSxcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAgYXJndixcbiAgICAgICAge1xuICAgICAgICAgIGV4aXRJZkZhaWxlZDogZmFsc2UsXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oZG9ja2VyU2NyaXB0cy5zdG9wKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IGNvbnN0YW50cyB9IGZyb20gJ25vZGU6b3MnO1xuXG5pbXBvcnQgeyB0cmVlS2lsbCB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB0eXBlIHsgQXJndiwgQ29tbWFuZE1vZHVsZSB9IGZyb20gJ3lhcmdzJztcblxuaW50ZXJmYWNlIFRyZWVLaWxsQ29tbWFuZEFyZ3Mge1xuICBwaWQ6IG51bWJlcjtcbiAgc2lnbmFsOiBzdHJpbmc7XG59XG5cbmNvbnN0IGJ1aWxkZXIgPSAoeWFyZ3M6IEFyZ3YpOiBBcmd2PFRyZWVLaWxsQ29tbWFuZEFyZ3M+ID0+XG4gIHlhcmdzXG4gICAgLnBvc2l0aW9uYWwoJ3BpZCcsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIHByb2Nlc3MgSUQgdG8ga2lsbC4nLFxuICAgICAgdHlwZTogJ251bWJlcicsXG4gICAgICBkZW1hbmRPcHRpb246IHRydWUsXG4gICAgfSlcbiAgICAub3B0aW9uKCdzaWduYWwnLCB7XG4gICAgICBkZXNjcmlwdGlvbjogJ1NpZ25hbCB0byBzZW5kIHRvIHRoZSBwcm9jZXNzIHRyZWUuJyxcbiAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgZGVmYXVsdDogJ1NJR1RFUk0nLFxuICAgIH0pIGFzIEFyZ3Y8VHJlZUtpbGxDb21tYW5kQXJncz47XG5cbmV4cG9ydCBjb25zdCB0cmVlS2lsbENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8b2JqZWN0LCBUcmVlS2lsbENvbW1hbmRBcmdzPiA9IHtcbiAgY29tbWFuZDogJ3RyZWUta2lsbCA8cGlkPiBbc2lnbmFsXScsXG4gIGRlc2NyaWJlOiAnS2lsbCB0aGUgZ2l2ZW4gcHJvY2VzcyBhbmQgYWxsIGRlc2NlbmRhbnRzJyxcbiAgYnVpbGRlcixcbiAgaGFuZGxlcihhcmd2KSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNpZ25hbCA9IGFyZ3Yuc2lnbmFsIGFzIE5vZGVKUy5TaWduYWxzO1xuICAgICAgaWYgKCEoc2lnbmFsIGluIGNvbnN0YW50cy5zaWduYWxzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc2lnbmFsOiAke3NpZ25hbH1gKTtcbiAgICAgIH1cbiAgICAgIHRyZWVLaWxsKGFyZ3YucGlkLCBzaWduYWwpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICB9LFxufTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IHJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcywgdHJlZUtpbGwgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgeWFyZ3MgZnJvbSAneWFyZ3MnO1xuaW1wb3J0IHsgaGlkZUJpbiB9IGZyb20gJ3lhcmdzL2hlbHBlcnMnO1xuXG5pbXBvcnQgeyBjaGVja0FsbEZvckFpQ29tbWFuZCwgY2hlY2tGb3JBaUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2FpQ2hlY2suanMnO1xuaW1wb3J0IHsgYnVpbGRJZk5lZWRlZENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2J1aWxkSWZOZWVkZWQuanMnO1xuaW1wb3J0IHsgY29uY3VycmVudGx5Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvY29uY3VycmVudGx5LmpzJztcbmltcG9ydCB7IGtpbGxQb3J0SWZOb25DaUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2tpbGxQb3J0SWZOb25DaS5qcyc7XG5pbXBvcnQgeyBsaW50Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvbGludC5qcyc7XG5pbXBvcnQgeyBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvb3B0aW1pemVGb3JEb2NrZXJCdWlsZC5qcyc7XG5pbXBvcnQgeyBwcmlzbWFDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9wcmlzbWEuanMnO1xuaW1wb3J0IHsgcmV0cnlDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9yZXRyeS5qcyc7XG5pbXBvcnQgeyBzZXR1cENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3NldHVwLmpzJztcbmltcG9ydCB7IHN0YXJ0Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvc3RhcnQuanMnO1xuaW1wb3J0IHsgdGVzdENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHsgdGVzdE9uQ2lDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy90ZXN0T25DaS5qcyc7XG5pbXBvcnQgeyB0cmVlS2lsbENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3RyZWVLaWxsLmpzJztcbmltcG9ydCB7IHRjQ29tbWFuZCwgdHlwZUNoZWNrQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvdHlwZWNoZWNrLmpzJztcbmltcG9ydCB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmF3YWl0IHlhcmdzKGhpZGVCaW4ocHJvY2Vzcy5hcmd2KSlcbiAgLnNjcmlwdE5hbWUoJ3diJylcbiAgLm9wdGlvbnMoc2hhcmVkT3B0aW9uc0J1aWxkZXIpXG4gIC5taWRkbGV3YXJlKChhcmd2KSA9PiB7XG4gICAgY29uc3Qgd29ya2luZ0RpciA9IGFyZ3ZbJ3dvcmtpbmctZGlyJ107XG4gICAgaWYgKHdvcmtpbmdEaXIpIHtcbiAgICAgIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUod29ya2luZ0Rpcik7XG4gICAgICBwcm9jZXNzLmNoZGlyKGRpclBhdGgpO1xuICAgIH1cblxuICAgIHJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcyhwcm9jZXNzLmVudik7XG4gIH0pXG4gIC5jb21tYW5kKGNoZWNrQWxsRm9yQWlDb21tYW5kKVxuICAuY29tbWFuZChjaGVja0ZvckFpQ29tbWFuZClcbiAgLmNvbW1hbmQoYnVpbGRJZk5lZWRlZENvbW1hbmQpXG4gIC5jb21tYW5kKGNvbmN1cnJlbnRseUNvbW1hbmQpXG4gIC5jb21tYW5kKGtpbGxQb3J0SWZOb25DaUNvbW1hbmQpXG4gIC5jb21tYW5kKGxpbnRDb21tYW5kKVxuICAuY29tbWFuZChvcHRpbWl6ZUZvckRvY2tlckJ1aWxkQ29tbWFuZClcbiAgLmNvbW1hbmQocHJpc21hQ29tbWFuZClcbiAgLmNvbW1hbmQocmV0cnlDb21tYW5kKVxuICAuY29tbWFuZChzZXR1cENvbW1hbmQpXG4gIC5jb21tYW5kKHN0YXJ0Q29tbWFuZClcbiAgLmNvbW1hbmQodGVzdENvbW1hbmQpXG4gIC5jb21tYW5kKHRlc3RPbkNpQ29tbWFuZClcbiAgLmNvbW1hbmQodHJlZUtpbGxDb21tYW5kKVxuICAuY29tbWFuZCh0eXBlQ2hlY2tDb21tYW5kKVxuICAuY29tbWFuZCh0Y0NvbW1hbmQpXG4gIC5kZW1hbmRDb21tYW5kKClcbiAgLnN0cmljdCgpXG4gIC52ZXJzaW9uKGdldFZlcnNpb24oKSlcbiAgLmhlbHAoKS5hcmd2O1xuXG5mdW5jdGlvbiBnZXRWZXJzaW9uKCk6IHN0cmluZyB7XG4gIGxldCBwYWNrYWdlSnNvbkRpciA9IHBhdGguZGlybmFtZShuZXcgVVJMKGltcG9ydC5tZXRhLnVybCkucGF0aG5hbWUpO1xuICB3aGlsZSAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHBhY2thZ2VKc29uRGlyLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgcGFja2FnZUpzb25EaXIgPSBwYXRoLmRpcm5hbWUocGFja2FnZUpzb25EaXIpO1xuICB9XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHBhY2thZ2VKc29uRGlyLCAncGFja2FnZS5qc29uJyksICd1dGY4JykpIGFzIHtcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG4gIH07XG4gIHJldHVybiBwYWNrYWdlSnNvbi52ZXJzaW9uO1xufVxuXG5sZXQgc2h1dHRpbmdEb3duID0gZmFsc2U7XG5mb3IgKGNvbnN0IHNpZ25hbCBvZiBbJ1NJR0lOVCcsICdTSUdURVJNJywgJ1NJR1FVSVQnXSkge1xuICBwcm9jZXNzLm9uKHNpZ25hbCwgKCkgPT4ge1xuICAgIGlmIChzaHV0dGluZ0Rvd24pIHJldHVybjtcblxuICAgIHNodXR0aW5nRG93biA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIHRyZWVLaWxsKHByb2Nlc3MucGlkKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKGBGYWlsZWQgdG8gdHJlZUtpbGwoJHtwcm9jZXNzLnBpZH0pIGR1cmluZyBzaHV0ZG93bjpgLCBlcnJvcik7XG4gICAgfVxuICAgIHByb2Nlc3MuZXhpdCgpO1xuICB9KTtcbn1cbiJdLCJuYW1lcyI6WyJ5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52IiwiZW52IiwiZGVzY3JpcHRpb24iLCJ0eXBlIiwiZGVmYXVsdCIsInZlcmJvc2UiLCJhbGlhcyIsImNhY2hlZEVudlZhcnMiLCJNYXAiLCJyZWFkRW52RmlsZSIsImZpbGVQYXRoIiwiY2FjaGVkIiwiZ2V0IiwicGFyc2VkIiwiY29uZmlnIiwicGF0aCIsInJlc29sdmUiLCJwcm9jZXNzRW52Iiwic2V0IiwiaXNFcnJub0V4Y2VwdGlvbiIsImVycm9yIiwiRXJyb3IiLCJ0cmVlS2lsbCIsInBpZCIsInNpZ25hbCIsIk51bWJlciIsImlzSW50ZWdlciIsInByb2Nlc3MiLCJwbGF0Zm9ybSIsInJ1bkNvbW1hbmQiLCJTdHJpbmciLCJtYXhCdWZmZXIiLCJ0aW1lb3V0IiwiaXNOb1N1Y2hQcm9jZXNzRXJyb3IiLCJraWxsVHJlZU9uV2luZG93cyIsImRlc2NlbmRhbnRzIiwicm9vdFBpZCIsInN0ZG91dCIsImNoaWxkcmVuQnlQYXJlbnQiLCJwc091dHB1dCIsImxpbmUiLCJzcGxpdCIsIm1hdGNoZWQiLCJleGVjIiwiY2hpbGRQaWQiLCJwYXJlbnRQaWQiLCJjaGlsZHJlbiIsInB1c2giLCJidWlsZENoaWxkcmVuQnlQYXJlbnRNYXAiLCJxdWV1ZSIsImluZGV4IiwibGVuZ3RoIiwiY29sbGVjdERlc2NlbmRhbnRQaWRzRnJvbU1hcCIsImNvbGxlY3REZXNjZW5kYW50UGlkcyIsInRhcmdldFBpZHMiLCJ0b1JldmVyc2VkIiwidG9DaGlsZHJlbkZpcnN0UGlkcyIsInRhcmdldFBpZCIsImtpbGxJZk5lZWRlZCIsImtpbGwiLCJjb21tYW5kIiwiYXJncyIsIm9wdGlvbnMiLCJleGVjRmlsZVN5bmMiLCJlbmNvZGluZyIsInN0ZGlvIiwic3RkZXJyIiwiQnVmZmVyIiwiaXNCdWZmZXIiLCJ0b1N0cmluZyIsImV4dHJhY3RTdGRlcnIiLCJDb21tYW5kRXhlY3V0aW9uRXJyb3IiLCJjb2RlIiwic3RhdHVzIiwidG9FeGl0Q29kZSIsInRlc3QiLCJjb25zdHJ1Y3RvciIsInN1cGVyIiwiam9pbiIsInRoaXMiLCJuYW1lIiwiYXN5bmMiLCJzcGF3bkFzeW5jIiwiUHJvbWlzZSIsInJlamVjdCIsInByb2MiLCJzcGF3biIsInNldEVuY29kaW5nIiwib24iLCJkYXRhIiwicHJpbnRpbmdTdGRvdXQiLCJ3cml0ZSIsIm1lcmdlT3V0QW5kRXJyb3IiLCJwcmludGluZ1N0ZGVyciIsInN0b3BwZWQiLCJzdG9wUHJvY2VzcyIsImNvbnNvbGUiLCJpbmZvIiwid2FybiIsImNsZWFudXBTaWduYWxzIiwic2lnbmFsSGFuZGxlcnMiLCJyZW1vdmVLaWxsT25FeGl0SGFuZGxlcnMiLCJyZW1vdmVMaXN0ZW5lciIsImhhbmRsZXIiLCJjbGVhciIsImtpbGxPbkV4aXQiLCJoYW5kbGVTaWduYWwiLCJsaXN0ZW5lckNvdW50IiwicmVtb3ZlQWxsTGlzdGVuZXJzIiwidW5kZWZpbmVkIiwiaW5wdXQiLCJzdGRpbiIsImVuZCIsInQiLCJzIiwiaSIsImUiLCJuIiwiZW50cmllcyIsImgiLCJibG9ja3MiLCJyZXNldCIsImZpbmFsaXplZCIsImJsb2NrIiwic3RhcnQiLCJsYXN0Qnl0ZUluZGV4IiwicGFkZGluZyIsIm91dHB1dEJpdHMiLCJibG9ja0NvdW50IiwiYnl0ZUNvdW50Iiwib3V0cHV0QmxvY2tzIiwiZXh0cmFCeXRlcyIsInVwZGF0ZSIsIm8iLCJsIiwiYyIsImYiLCJjb2RlUG9pbnRBdCIsInIiLCJmaW5hbGl6ZSIsImhleCIsImEiLCJ1IiwiZCIsImIiLCJrIiwieSIsIngiLCJCIiwicCIsIkMiLCJ6IiwiSSIsImciLCJ3IiwiQSIsIlAiLCJFIiwiaiIsIm0iLCJxIiwidiIsIkQiLCJGIiwiRyIsIkgiLCJKIiwiSyIsIkwiLCJNIiwiTiIsIk8iLCJRIiwiUiIsIlMiLCJUIiwiVSIsIlYiLCJXIiwiWCIsIlkiLCJaIiwiJCIsIl8iLCJ0dCIsInN0IiwiaXQiLCJldCIsIm90IiwibnQiLCJodCIsInJ0IiwibHQiLCJjdCIsImZ0IiwiaW5zdGFuY2UiLCJmcm9tIiwibWVzc2FnZSIsInN0YWNrIiwiY2F1c2UiLCJzdHViIiwiaHlkcmF0ZSIsIlVpbnQ4QXJyYXkiLCJidG9hIiwiZGVjb2RlIiwiY3JlYXRlIiwiZW5jb2RlIiwiYXRvYiIsIlNldCIsInZhbHVlcyIsImFkZCIsIkRhdGUiLCJ0b0pTT04iLCJSZWdFeHAiLCJmbGFncyIsInNvdXJjZSIsIlVSTCIsImhyZWYiLCJtYXAiLCJUZXh0RW5jb2RlciIsIlRleHREZWNvZGVyIiwiSlNPTiIsInN0cmluZ2lmeSIsImlzTmFOIiwiaXNGaW5pdGUiLCJBcnJheSIsImlzQXJyYXkiLCJmaWxsIiwic2xpY2UiLCJPYmplY3QiLCJjYWNoZUR1cmF0aW9uIiwiUE9TSVRJVkVfSU5GSU5JVFkiLCJnZXRDYWNoZUtleSIsImtpbmQiLCJub3ciLCJjYWxsIiwiaXNDSSIsImNpRW52IiwiUHJvamVjdCIsIl9pbml0UHJvdG8iLCJfYXBwbHlEZWNzIiwibWVtb2l6ZU9uZSIsImFyZ3YiLCJwYXRoQnlOYW1lIiwiZGlyUGF0aCIsImxvYWRFbnYiLCJfZGlyUGF0aCIsImlzQnVuQXZhaWxhYmxlIiwiZnMiLCJyZWFkRmlsZVN5bmMiLCJyb290RGlyUGF0aCIsImJ1aWxkQ29tbWFuZCIsInBhY2thZ2VKc29uIiwic2NyaXB0cyIsImJ1aWxkIiwiaW5jbHVkZXMiLCJleGlzdHNTeW5jIiwiZG9ja2VyZmlsZSIsImZpbmRGaWxlIiwiaGFzRG9ja2VyZmlsZSIsImhhc1NvdXJjZUNvZGUiLCJkb2NrZXJJbWFnZU5hbWUiLCJyZXBsYWNlQWxsIiwiZW52VmFycyIsImVudlBhdGhBbmRMb2FkZWRFbnZWYXJDb3VudFBhaXJzIiwiY3dkIiwiZW52UGF0aHMiLCJlbnZQYXRoIiwiY2FzY2FkZSIsImNhc2NhZGVFbnYiLCJjYXNjYWRlTm9kZUVudiIsIk5PREVfRU5WIiwiYXV0b0Nhc2NhZGVFbnYiLCJXQl9FTlYiLCJpbmNsdWRlUm9vdEVudiIsInJvb3RQYXRoIiwiZmxhdE1hcCIsImZpbHRlciIsInJlbGF0aXZlIiwiZW52UGF0aEFuZExvYWRlZEVudlZhck5hbWVzIiwia2V5cyIsImtleSIsInZhbHVlIiwiY2hlY2tFbnYiLCJtaXNzaW5nS2V5cyIsImV4cGFuZCIsInJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyIsImNvdW50IiwicGFyc2UiLCJwYWNrYWdlSnNvblBhdGgiLCJoYXNQcmlzbWEiLCJkZXBlbmRlbmNpZXMiLCJwcmlzbWEiLCJkZXZEZXBlbmRlbmNpZXMiLCJoYXNWaXRlc3QiLCJ2aXRlc3QiLCJoYXNCaW9tZSIsImhhc0RlcGVuZGVuY3kiLCJoYXNFc2xpbnQiLCJoYXNPeGxpbnQiLCJoYXNPeGZtdCIsImhhc1BvZXRyeUxvY2siLCJoYXNQdWJzcGVjWWFtbCIsInByZWZlcnJlZExpbnRlciIsImhhc1BsYXl3cmlnaHRDb25maWciLCJza2lwTGF1bmNoaW5nU2VydmVyRm9yUGxheXdyaWdodCIsIkNJIiwiY29uZmlnUGF0aCIsImRvY2tlclBhY2thZ2VKc29uIiwiZGlybmFtZSIsImJpbkV4aXN0cyIsImJpbkZvdW5kIiwiY3VycmVudFBhdGgiLCJiaW5QYXRoIiwiUEFUSCIsInBhcmVudFBhdGgiLCJmaWxlTmFtZSIsImZpbmQiLCJwYWNrYWdlTmFtZSIsImhhc0RlcGVuZGVuY3lJblBhY2thZ2VKc29uIiwib3B0aW9uYWxEZXBlbmRlbmNpZXMiLCJwZWVyRGVwZW5kZW5jaWVzIiwicm9vdFBhY2thZ2VKc29uIiwiZmluZFNlbGZQcm9qZWN0IiwiZmluZERlc2NlbmRhbnRQcm9qZWN0cyIsInJvb3RBbmRTZWxmUHJvamVjdHMiLCJmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyIsInJvb3QiLCJzZWxmIiwiZ2V0QWxsRGVzY2VuZGFudFByb2plY3RzIiwidGhpc1Byb2plY3QiLCJyb290UHJvamVjdCIsIndvcmtzcGFjZXMiLCJlbmRzV2l0aCIsInByb2plY3RzIiwid29ya3NwYWNlIiwiZ2xvYlBhdHRlcm4iLCJwYWNrYWdlRGlycyIsIndvcmtzcGFjZVBhdGgiLCJ3cyIsImdsb2JieSIsImRvdCIsIm9ubHlEaXJlY3RvcmllcyIsInN1YlBhY2thZ2VEaXJQYXRoIiwicHJvbWlzZVBvb2wiLCJQcm9taXNlUG9vbCIsImlzUnVubmluZ09uQnVuIiwidmVyc2lvbnMiLCJidW4iLCJucG1fZXhlY3BhdGgiLCJydW50aW1lV2l0aEFyZ3MiLCJwYWNrYWdlTWFuYWdlciIsInBhY2thZ2VNYW5hZ2VyV2l0aFJ1biIsImRlZmF1bHRPcHRpb25zIiwiZXhpdElmRmFpbGVkIiwicnVuV2l0aFNwYXduIiwic2NyaXB0IiwicHJvamVjdCIsIm9wdHMiLCJub3JtYWxpemVkU2NyaXB0Iiwibm9ybWFsaXplU2NyaXB0IiwicHJpbnRTdGFydCIsInByaW50YWJsZSIsInJ1bm5hYmxlIiwiZHJ5UnVuIiwicHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZCIsInJldCIsImNvbmZpZ3VyZUVudiIsInNoZWxsIiwib25TaWduYWwiLCJydW5XaXRoU3Bhd25JblBhcmFsbGVsIiwicnVuQW5kV2FpdEZvclJldHVyblZhbHVlIiwib3V0IiwidHJpbSIsIm5ld1NjcmlwdCIsImJsaXR6IiwicHJpbnRhYmxlU2NyaXB0IiwiZml4QnVuQ29tbWFuZCIsInJ1bm5hYmxlU2NyaXB0IiwiY2FzY2FkZU9wdGlvbiIsInByZWZpeCIsIndlYWsiLCJjaGFsayIsImdyYXkiLCJjeWFuIiwiYm9sZCIsImV4aXRDb2RlIiwiZ3JlZW4iLCJyZWQiLCJleGl0IiwibmV3RW52IiwiY2kiLCJmb3JjZUNvbG9yIiwiRk9SQ0VfQ09MT1IiLCJidWlsZFNoZWxsQ29tbWFuZCIsImFyZyIsInNoZWxsRXNjYXBlQXJndW1lbnQiLCJiaW9tZUV4dGVuc2lvbnMiLCJlc2xpbnRFeHRlbnNpb25zIiwib3hsaW50RXh0ZW5zaW9ucyIsInB5dGhvbkV4dGVuc2lvbnMiLCJkYXJ0RXh0ZW5zaW9ucyIsIm94Zm10RXh0ZW5zaW9ucyIsInByZXR0aWVyRXh0ZW5zaW9ucyIsInByZXR0aWVyT25seUV4dGVuc2lvbnMiLCJleHQiLCJoYXMiLCJwcmV0dGllckZpeHR1cmVJZ25vcmVQYXR0ZXJuIiwibGludENvbW1hbmQiLCJkZXNjcmliZSIsImZpeCIsImZvcm1hdCIsInF1aWV0IiwibGludCIsImZpbGVzIiwibGludFRhcmdldHMiLCJnZXRMaW50VGFyZ2V0RmlsZXMiLCJsaW50RmlsZVBhdGhzQnlQcm9qZWN0Iiwib3hmbXRGaWxlUGF0aHNCeVByb2plY3QiLCJweXRob25GaWxlUGF0aHNCeVByb2plY3QiLCJkYXJ0RmlsZVBhdGhzQnlQcm9qZWN0IiwicHJldHRpZXJGaWxlUGF0aHMiLCJwYWNrYWdlSnNvbkZpbGVQYXRocyIsInByZXR0aWVyQXJncyIsInNvcnRQYWNrYWdlSnNvbkFyZ3MiLCJtaXNzaW5nTGludFRvb2xGb3JFeHBsaWNpdEZpbGVzIiwiYWxsIiwiZmlsZSIsImZpbGVLaW5kIiwic3RhdCIsImlzRGlyZWN0b3J5IiwiZ2V0TGludFRhcmdldEZpbGVLaW5kIiwiZXh0ZW5zaW9uIiwiZXh0bmFtZSIsImdldEV4cGxpY2l0UGFja2FnZUpzb25QYXRocyIsImxpbnRQYXRoIiwiZ2V0RXhwbGljaXRMaW50VGFyZ2V0cyIsInB5dGhvbkZpbGVQYXRocyIsImRhcnRGaWxlUGF0aHMiLCJzdXBwb3J0c0xpbnRpbmdFeHRlbnNpb24iLCJsaW50RmlsZVBhdGhzIiwiZm9ybWF0dGVyUGF0aCIsImJ1aWxkRXhwbGljaXRGb3JtYXR0ZXJBcmdzIiwib3hmbXRGaWxlUGF0aHMiLCJpc1BvdGVudGlhbExpbnRUYXJnZXQiLCJzZWxmRGlyUGF0aCIsIm5lZWRzUHJldHRpZXIiLCJwcm9qZWN0UGF0dGVybiIsImJ1aWxkUHJldHRpZXJBcmdzIiwibGludFByb21pc2VzIiwibGludFJ1bk9wdGlvbnMiLCJidWlsZExpbnRDb21tYW5kIiwiYnVpbGRPeGZtdENvbW1hbmQiLCJidWlsZFBvZXRyeUNvbW1hbmQiLCJidWlsZERhcnRDb21tYW5kIiwibGludEV4aXRDb2RlcyIsInNvbWUiLCJiaW9tZUFyZ3MiLCJ0YXJnZXRzIiwiY29tbWFuZHMiLCJzaG91bGRGb3JtYXRFeHBsaWNpdFBhdGhXaXRoUHJldHRpZXIiLCJzdGFydHNXaXRoIiwiZGVzY2VuZGFudFByb2plY3RzIiwib3duaW5nUHJvamVjdCIsImZpbmRPd25pbmdQcm9qZWN0IiwidG9EZXZOdWxsIiwic2lsZW50IiwiY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MiLCJyYXdQb3J0IiwicG9ydCIsImF2YWlsYWJsZSIsImhvc3QiLCJwcm9iZVBvcnQiLCJpc1BvcnRBdmFpbGFibGUiLCJraWxsUG9ydENvbnRhaW5lckFuZFByb2Nlc3MiLCJraWxsRnVuYyIsImtpbGxlZCIsImtpbGxQb3J0UHJvY2Vzc0ltbWVkaWF0ZWx5QW5kT25FeGl0Iiwic2VydmVyIiwiY3JlYXRlU2VydmVyIiwib25jZSIsImVyciIsImNsb3NlIiwibGlzdGVuIiwiZmlsdGVyQXJncyIsImNvbnRhaW5lcklkcyIsImlkIiwiQm9vbGVhbiIsImxpc3REb2NrZXJDb250YWluZXJJZHMiLCJyZW1vdmVEb2NrZXJDb250YWluZXJzIiwic3RvcERvY2tlckNvbnRhaW5lckJ5UG9ydCIsImtpbGxQb3J0UHJvY2VzcyIsImRvY2tlclNjcmlwdHMiLCJidWlsZEltYWdlIiwidmVyc2lvbiIsInN0b3BBbmRTdGFydCIsImFkZGl0aW9uYWxPcHRpb25zIiwiYWRkaXRpb25hbEFyZ3MiLCJzdG9wIiwic3Bhd25TeW5jIiwic3Bhd25TeW5jT25FeGl0IiwiUE9SVCIsInN0b3BBbGwiLCJzaGFyZWRPcHRpb25zQnVpbGRlciIsImJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyIsIm9wdGlvbk5hbWUiLCJnZXRPcHRpb25WYWx1ZSIsIml0ZW0iLCJjYW1lbENhc2VPcHRpb25OYW1lIiwiY2hhcmFjdGVyIiwidG9VcHBlckNhc2UiLCJGSUxFX1NDSEVNQSIsIlBPU1NJQkxFX1BSSVNNQV9QQVRIUyIsInNjaGVtYVBhdGgiLCJkYlBhdGgiLCJnZXREYXRhYmFzZURpclBhdGgiLCJnZXRQcmlzbWFCYXNlRGlyIiwicHJpc21hU2NyaXB0cyIsImNsZWFuVXBMaXRlc3RyZWFtIiwiZGVwbG95IiwiZGVwbG95Rm9yY2UiLCJyZW1vdmVEYkNvbW1hbmQiLCJsaXN0QmFja3VwcyIsIm1pZ3JhdGUiLCJzZWVkIiwibWlncmF0ZURldiIsInN0ZXBzIiwiY2xlYW51cENvbW1hbmQiLCJkYlVybCIsIkRBVEFCQVNFX1VSTCIsInJhd0RiUGF0aCIsInJlcGxhY2UiLCJiYXNlRGlyIiwiYWJzb2x1dGVQYXRoIiwiaXNBYnNvbHV0ZSIsImNsZWFuVXBTcWxpdGVEYklmTmVlZGVkIiwicmVzZXRDb21tYW5kIiwicmVzdG9yZSIsIm91dHB1dFBhdGgiLCJzY3JpcHRQYXRoIiwic3R1ZGlvIiwiZGJVcmxPclBhdGgiLCJCYXNlU2NyaXB0cyIsInNob3VsZFdhaXRBbmRPcGVuQXBwIiwiYnVpbGREb2NrZXIiLCJzdGFydERldiIsInN0YXJ0RGV2UHJvdGVjdGVkIiwid2FpdEFuZE9wZW5BcHAiLCJzdGFydFByb2R1Y3Rpb24iLCJzdGFydFByb2R1Y3Rpb25Qcm90ZWN0ZWQiLCJzdGFydFRlc3QiLCJzdGFydERvY2tlciIsIm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCIsIm5vcm1hbGl6ZWRBcmdzVGV4dCIsImVjb3N5c3RlbUNvbmZpZ1BhdGgiLCJmaW5kRWNvc3lzdGVtQ29uZmlnUGF0aCIsImNtZCIsInRlc3RFMkVEZXYiLCJ0ZXN0RTJFUHJvdGVjdGVkIiwidGVzdEUyRVByb2R1Y3Rpb24iLCJ0ZXN0RTJFRG9ja2VyIiwidGVzdFN0YXJ0Iiwid2FpdEFwcCIsInN0YXJ0Q29tbWFuZCIsImZvcndhcmRlZFBsYXl3cmlnaHRBcmdzIiwicGxheXdyaWdodEFyZ3MiLCJzdWZmaXgiLCJwbGF5d3JpZ2h0Q29tbWFuZCIsImJhaWwiLCJiYXNlIiwibm9ybWFsaXplZFRhcmdldHMiLCJhcHBlbmRQbGF5d3JpZ2h0QmFpbE9wdGlvbiIsInJlc3QiLCJleHBsaWNpdFRhcmdldEluZGV4ZXMiLCJmaW5kRXhwbGljaXRQbGF5d3JpZ2h0VGFyZ2V0SW5kZXhlcyIsInJlc3RXaXRob3V0RXhwbGljaXRUYXJnZXQiLCJidWlsZFBsYXl3cmlnaHRDb21tYW5kIiwidGVzdFVuaXQiLCJjb21tYW5kQXJncyIsInBsYXl3cmlnaHRJbmRleCIsImluZGV4T2YiLCJpc1BsYXl3cmlnaHRUZXN0Q29tbWFuZCIsInBlbmRpbmdWYWx1ZU1vZGUiLCJ0YXJnZXRJbmRleGVzIiwib2Zmc2V0IiwiUExBWVdSSUdIVF9URVNUX09QVElPTlNfV0lUSF9SRVFVSVJFRF9WQUxVRVMiLCJQTEFZV1JJR0hUX1RFU1RfT1BUSU9OU19XSVRIX09QVElPTkFMX1ZBTFVFUyIsInNob3J0T3B0aW9uIiwiUExBWVdSSUdIVF9URVNUX1NIT1JUX09QVElPTlNfV0lUSF9SRVFVSVJFRF9WQUxVRVMiLCJibGl0elNjcmlwdHMiLCJodHRwU2VydmVyU2NyaXB0cyIsIndhdGNoIiwibmV4dFNjcmlwdHMiLCJwbGFpbkFwcFNjcmlwdHMiLCJfMSIsIl8yIiwicmVtaXhTY3JpcHRzIiwidml0ZVNjcmlwdHMiLCJodHRwU2VydmVyUGFja2FnZXMiLCJidWlsZGVyIiwiZTJlIiwiY2hvaWNlcyIsImFyZ3VtZW50c0J1aWxkZXIiLCJ0ZXN0Q29tbWFuZCIsInlhcmdzIiwicGFyc2VyQ29uZmlndXJhdGlvbiIsInRlc3RUYXJnZXRzIiwic2hvdWxkUnVuRTJlIiwic2hvdWxkUnVuVW5pdCIsImhhc0UyZVRhcmdldHMiLCJ0YXJnZXQiLCJoYXNVbml0VGFyZ2V0cyIsInNob3VsZFJ1bkFsbFRlc3RzIiwicmVzb2x2ZVRlc3RFeGVjdXRpb25UYXJnZXRzIiwiZGVwcyIsImRldkRlcHMiLCJuZXh0Iiwidml0ZSIsInVuaXRUYXJnZXRzIiwidW5pdEFyZ3YiLCJ1bml0VGltZW91dCIsImUyZVRhcmdldHMiLCJlMmVBcmd2IiwiYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRSIsInRlc3RPbkRvY2tlciIsIldCX0RPQ0tFUiIsImhhc0ZvcndhcmRlZFBsYXl3cmlnaHRUYXJnZXRzIiwidHlwZUNoZWNrQ29tbWFuZCIsInR5cGVDaGVjayIsInJlbW92ZWROZXh0RGlyIiwicHJvbWlzZXMiLCJ0eXBlc2NyaXB0IiwicHlyaWdodCIsIm5leHREaXJQYXRoIiwicm1TeW5jIiwiZm9yY2UiLCJyZWN1cnNpdmUiLCJ5ZWxsb3ciLCJleGl0Q29kZXMiLCJmaW5hbEV4aXRDb2RlIiwidGNDb21tYW5kIiwiY2hlY2tGb3JBaUNvbW1hbmQiLCJjaGVja0ZvckFpIiwiY2hlY2tBbGxGb3JBaUNvbW1hbmQiLCJydW5QYWNrYWdlQ29tbWFuZCIsInJ1blByb2plY3RUZXN0IiwicnVuSW5Qcm9jZXNzQ29tbWFuZCIsImFsbG93RmFpbHVyZSIsImNvbW1hbmROYW1lIiwiYnVpbGRJZk5lZWRlZENvbW1hbmQiLCJwcm9qZWN0UGF0aEZvclRlc3RpbmciLCJjYW5Ta2lwIiwiY2FjaGVGaWxlUGF0aCIsImNvbnRlbnRIYXNoIiwiY2FjaGVEaXJlY3RvcnlQYXRoIiwibWtkaXIiLCJoYXNoIiwiY3JlYXRlSGFzaCIsImNvbW1pdEhhc2giLCJjaGlsZF9wcm9jZXNzIiwiZXhlY1N5bmMiLCJlbnZpcm9ubWVudEpzb24iLCJpZ25vcmluZ0VudlZhck5hbWVzIiwidG9Tb3J0ZWQiLCJrZXkxIiwia2V5MiIsImxvY2FsZUNvbXBhcmUiLCJmaWx0ZXJlZEZpbGVQYXRocyIsImluY2x1ZGVQYXR0ZXJucyIsInBhdHRlcm4iLCJpbmNsdWRlU3VmZml4IiwiZXhjbHVkZVBhdHRlcm5zIiwiY29weSIsImRpZ2VzdCIsInVwZGF0ZUhhc2hXaXRoRGlmZlJlc3VsdCIsImNhY2hlZENvbnRlbnRIYXNoIiwiZm4iLCJpZ25vcmVFbm9lbnRBc3luYyIsInJlYWRGaWxlIiwiY2FuU2tpcEJ1aWxkIiwid3JpdGVGaWxlIiwiYnVpbGRJZk5lZWRlZCIsImNvbmN1cnJlbnRseUNvbW1hbmQiLCJzdWNjZXNzIiwiZGV0YWNoZWQiLCJpbnRlcnJ1cHRlZFNpZ25hbCIsImZpcnN0UmVzdWx0Iiwic3RvcFJlc3VsdCIsInN0b3BwaW5nIiwicmVzdWx0cyIsIndhaXRGb3JFeGl0UHJvbWlzZXMiLCJjaGlsZCIsInNldHRsZWQiLCJzZXR0bGUiLCJraWxsT3RoZXJzIiwia2lsbE90aGVyc09uRmFpbCIsInNob3VsZFN0b3BPdGhlcnMiLCJ0ZXJtaW5hdGVDaGlsZHJlbiIsImdldEV4aXRDb2RlIiwic3RvcE9uU2lnaW50Iiwic3RvcE9uU2lndGVybSIsInN0b3BPblNpZ3F1aXQiLCJyZXN1bHQiLCJydW5Db25jdXJyZW50bHkiLCJjb25zdGFudHMiLCJzaWduYWxzIiwia2lsbFByb2Nlc3NHcm91cCIsImtpbGxQb3J0SWZOb25DaUNvbW1hbmQiLCJwb3J0RW52Iiwia2lsbFBvcnRJZk5vbkNpIiwicHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kIiwib3B0aW1pemVGb3JEb2NrZXJCdWlsZENvbW1hbmQiLCJvdXRzaWRlIiwib3B0aW1pemVEZXZEZXBlbmRlbmNpZXMiLCJvcHRpbWl6ZVNjcmlwdHMiLCJvcHRpbWl6ZVJvb3RQcm9wcyIsImRpc3REaXJQYXRoIiwibmFtZVdvcmRzVG9CZVJlbW92ZWQiLCJyZW1vdmVkRGVwcyIsIndvcmQiLCJuYW1lV29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cyIsImNvbnRlbnRXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzIiwicmVtb3ZlZFNjcmlwdHMiLCJjb250ZW50IiwicHJpdmF0ZSIsInB1Ymxpc2hDb25maWciLCJwcmV0dGllciIsInByaXNtYUNvbW1hbmQiLCJjbGVhblVwTGl0ZXN0cmVhbUNvbW1hbmQiLCJjcmVhdGVMaXRlc3RyZWFtQ29uZmlnQ29tbWFuZCIsImRlcGxveUNvbW1hbmQiLCJkZXBsb3lGb3JjZUNvbW1hbmQiLCJsaXN0QmFja3Vwc0NvbW1hbmQiLCJtaWdyYXRlQ29tbWFuZCIsIm1pZ3JhdGVEZXZDb21tYW5kIiwicmVzdG9yZUNvbW1hbmQiLCJzZWVkQ29tbWFuZCIsInN0dWRpb0NvbW1hbmQiLCJkZWZhdWx0Q29tbWFuZCIsImRlbWFuZENvbW1hbmQiLCJzdHJpY3QiLCJhbGxQcm9qZWN0cyIsImZpbmRQcmlzbWFQcm9qZWN0cyIsImNyZWF0ZUxpdGVzdHJlYW1Db25maWciLCJ1bmtub3duT3B0aW9ucyIsImV4dHJhY3RVbmtub3duT3B0aW9ucyIsIm91dHB1dCIsInJlc3RvcmVkIiwiZnVsbENvbW1hbmQiLCJ0cmltRW5kIiwicmVxdWlyZWRFbnZWYXJzIiwiQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ09VTlRfSUQiLCJDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQlVDS0VUX05BTUUiLCJDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDRVNTX0tFWV9JRCIsIkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9TRUNSRVRfQUNDRVNTX0tFWSIsIm1pc3NpbmdFbnZWYXJzIiwicmV0ZW50aW9uQ2hlY2tJbnRlcnZhbCIsImxpdGVzdHJlYW1Db25maWciLCJ3cml0ZUZpbGVTeW5jIiwicmVhc29uIiwiZmlsdGVyZWQiLCJrbm93bk9wdGlvbnMiLCJzaGFyZWRPcHRpb25LZXlzIiwic2hhcmVkT3B0aW9uQWxpYXNlcyIsIm9wdGlvbiIsImFsbEtub3duT3B0aW9ucyIsImtlYmFiQ2FzZUtleSIsIm1hdGNoIiwidG9Mb3dlckNhc2UiLCJwYXNzdGhyb3VnaEFyZ3MiLCJyZXRyeUNvbW1hbmQiLCJyZXRyeSIsImNtZEFuZEFyZ3MiLCJsYXN0U3RhdHVzIiwic2V0dXBDb21tYW5kIiwiZGlyZW50cyIsInJlYWRkaXIiLCJ3aXRoRmlsZVR5cGVzIiwib3MiLCJwYWNrYWdlcyIsImlzRmlsZSIsInByb21pc2VBbGwiLCJwbGF5d3JpZ2h0Iiwic2V0dXAiLCJtb2RlIiwiZG9ja2VyT3B0aW9ucyIsIm5vcm1hbGl6ZUFyZ3MiLCJ0ZXN0T25DaUNvbW1hbmQiLCJ0ZXN0T25DaSIsInRyZWVLaWxsQ29tbWFuZCIsInBvc2l0aW9uYWwiLCJkZW1hbmRPcHRpb24iLCJoaWRlQmluIiwic2NyaXB0TmFtZSIsIm1pZGRsZXdhcmUiLCJ3b3JraW5nRGlyIiwiY2hkaXIiLCJCRVJSWV9CSU5fRk9MREVSIiwidXBwZXJLZXkiLCJyZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMiLCJwYWNrYWdlSnNvbkRpciIsInVybCIsInBhdGhuYW1lIiwiZ2V0VmVyc2lvbiIsImhlbHAiLCJzaHV0dGluZ0Rvd24iXSwibWFwcGluZ3MiOiI0aEJBT08sTUFBTUEsRUFBNEIsQ0FDdkNDLElBQUssQ0FDSEMsWUFBYSwyQkFDYkMsS0FBTSxTQUVSLGNBQWUsQ0FDYkQsWUFDRSx3TEFDRkMsS0FBTSxVQUVSLG1CQUFvQixDQUNsQkQsWUFBYSwwRkFDYkMsS0FBTSxXQUVSLG1CQUFvQixDQUNsQkQsWUFBYSxpRUFDYkMsS0FBTSxVQUNOQyxTQUFTLEdBRVgsbUJBQW9CLENBQ2xCRixZQUFhLHFHQUNiQyxLQUFNLFVBQ05DLFNBQVMsR0FFWCxZQUFhLENBQ1hGLFlBQWEscUZBQ2JDLEtBQU0sU0FDTkMsUUFBUyxnQkFFWEMsUUFBUyxDQUNQSCxZQUFhLHNDQUNiQyxLQUFNLFVBQ05HLE1BQU8sTUE0RlgsTUFBTUMsRUFBZ0IsSUFBSUMsSUFFMUIsU0FBU0MsRUFBWUMsR0FDbkIsTUFBTUMsRUFBU0osRUFBY0ssSUFBSUYsR0FDakMsR0FBSUMsRUFBUSxPQUFPQSxFQUVuQixNQUFNRSxFQUFTQyxFQUFPLENBQUVDLEtBQU1BLEVBQUtDLFFBQVFOLEdBQVdPLFdBQVksQ0FBQSxJQUFNSixRQUFVLENBQUEs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LEVBQUUsSUFBSUUsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVELEVBQUVHLEdBQUdrQixHQUFHLEVBQUVDLElBQUksSUFBSXJCLEVBQUVJLEdBQUdpQixHQUFHLEVBQUVELElBQUksSUFBSXRCLEVBQUUsSUFBSUMsRUFBRUQsRUFBRSxJQUFJRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUQsRUFBRXdCLEdBQUdHLEdBQUcsRUFBRUMsSUFBSSxJQUFJM0IsRUFBRW1CLEdBQUdRLEdBQUcsRUFBRUQsSUFBSSxJQUFJNUIsRUFBRSxJQUFJQyxFQUFFRCxFQUFFLElBQUlFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRCxFQUFFcUIsR0FBR1EsR0FBRyxFQUFFQyxJQUFJLElBQUk3QixFQUFFcUIsR0FBR1EsR0FBRyxFQUFFRCxJQUFJLElBQUk5QixFQUFFLElBQUlDLEVBQUVELEVBQUUsSUFBSUUsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVELEVBQUUyQixHQUFHeEIsR0FBRyxF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
9
+ */const T=[..."0123456789abcdef"],O=[6,1536,393216,100663296],I=[0,8,16,24],_=[1,0,32898,0,32906,2147483648,2147516416,2147483648,32907,0,2147483649,0,2147516545,2147483648,32777,2147483648,138,0,136,0,2147516425,0,2147483658,0,2147516555,0,139,2147483648,32905,2147483648,32771,2147483648,32770,2147483648,128,2147483648,32778,0,2147483658,2147483648,2147516545,2147483648,32896,2147483648,2147483649,0,2147516424,2147483648];const C=e=>{const t=[];for(const[n,r]of e.entries())t[n]=r;return t};class L{blocks=[];s=[];reset=!0;finalized=!1;block=0;start=0;lastByteIndex=0;constructor(e,t,n){this.padding=t,this.outputBits=n,this.blockCount=1600-(e<<1)>>5,this.byteCount=this.blockCount<<2,this.outputBlocks=n>>5,this.extraBytes=(31&n)>>3;for(let e=0;e<50;++e)this.s[e]=0}update(e){if(this.finalized)throw new Error("finalize already called");const t=this.blocks,n=this.byteCount,r=e.length,o=this.blockCount,s=this.s;let i,a,c=0;for(;c<r;){if(this.reset)for(this.reset=!1,t[0]=this.block,i=1;i<o+1;++i)t[i]=0;for(i=this.start;c<r&&i<n;++c)a=e.codePointAt(c)||0,a<128?t[i>>2]|=a<<I[3&i++]:a<2048?(t[i>>2]|=(192|a>>6)<<I[3&i++],t[i>>2]|=(128|63&a)<<I[3&i++]):a<55296||a>=57344?(t[i>>2]|=(224|a>>12)<<I[3&i++],t[i>>2]|=(128|a>>6&63)<<I[3&i++],t[i>>2]|=(128|63&a)<<I[3&i++]):(a=65536+((1023&a)<<10|1023&(e.codePointAt(++c)||0)),t[i>>2]|=(240|a>>18)<<I[3&i++],t[i>>2]|=(128|a>>12&63)<<I[3&i++],t[i>>2]|=(128|a>>6&63)<<I[3&i++],t[i>>2]|=(128|63&a)<<I[3&i++]);if(this.lastByteIndex=i,i>=n){for(this.start=i-n,this.block=t[o],i=0;i<o;++i)s[i]^=t[i];B(s),this.reset=!0}else this.start=i}return this}finalize(){if(this.finalized)return;this.finalized=!0;const e=this.blocks;let t=this.lastByteIndex;const n=this.blockCount,r=this.s;if(e[t>>2]|=this.padding[3&t],this.lastByteIndex===this.byteCount)for(e[0]=e[n],t=1;t<n+1;++t)e[t]=0;for(e[n-1]|=2147483648,t=0;t<n;++t)r[t]^=e[t];B(r)}hex(){this.finalize();const e=this.blockCount;let t=this.s;const n=this.outputBlocks,r=this.extraBytes;let o,s=0,i=0,a="";for(;i<n;){for(s=0;s<e&&i<n;++s,++i)o=t[s],a+=T[o>>4&15]+T[15&o]+T[o>>12&15]+T[o>>8&15]+T[o>>20&15]+T[o>>16&15]+T[o>>28&15]+T[o>>24&15];i%e===0&&(t=C(t),B(t),s=0)}return r&&(o=t[s],a+=T[o>>4&15]+T[15&o],r>1&&(a+=T[o>>12&15]+T[o>>8&15]),r>2&&(a+=T[o>>20&15]+T[o>>16&15])),a}}const B=function(e){let t,n,r,o,s,i,a,c,l,d,u,p,f,h,m,g,y,b,w,v,k,E,A,P,S,x,$,R,j,N,D,T,O,I,C,L,B,F,J,U,W,M,z,Y,q,V,G,K,H,Q,X,Z,ee,te,ne,re,oe,se,ie,ae,ce,le,de;for(r=0;r<48;r+=2)o=e[0]^e[10]^e[20]^e[30]^e[40],s=e[1]^e[11]^e[21]^e[31]^e[41],i=e[2]^e[12]^e[22]^e[32]^e[42],a=e[3]^e[13]^e[23]^e[33]^e[43],c=e[4]^e[14]^e[24]^e[34]^e[44],l=e[5]^e[15]^e[25]^e[35]^e[45],d=e[6]^e[16]^e[26]^e[36]^e[46],u=e[7]^e[17]^e[27]^e[37]^e[47],p=e[8]^e[18]^e[28]^e[38]^e[48],f=e[9]^e[19]^e[29]^e[39]^e[49],t=p^(i<<1|a>>>31),n=f^(a<<1|i>>>31),e[0]^=t,e[1]^=n,e[10]^=t,e[11]^=n,e[20]^=t,e[21]^=n,e[30]^=t,e[31]^=n,e[40]^=t,e[41]^=n,t=o^(c<<1|l>>>31),n=s^(l<<1|c>>>31),e[2]^=t,e[3]^=n,e[12]^=t,e[13]^=n,e[22]^=t,e[23]^=n,e[32]^=t,e[33]^=n,e[42]^=t,e[43]^=n,t=i^(d<<1|u>>>31),n=a^(u<<1|d>>>31),e[4]^=t,e[5]^=n,e[14]^=t,e[15]^=n,e[24]^=t,e[25]^=n,e[34]^=t,e[35]^=n,e[44]^=t,e[45]^=n,t=c^(p<<1|f>>>31),n=l^(f<<1|p>>>31),e[6]^=t,e[7]^=n,e[16]^=t,e[17]^=n,e[26]^=t,e[27]^=n,e[36]^=t,e[37]^=n,e[46]^=t,e[47]^=n,t=d^(o<<1|s>>>31),n=u^(s<<1|o>>>31),e[8]^=t,e[9]^=n,e[18]^=t,e[19]^=n,e[28]^=t,e[29]^=n,e[38]^=t,e[39]^=n,e[48]^=t,e[49]^=n,h=e[0],m=e[1],V=e[11]<<4|e[10]>>>28,G=e[10]<<4|e[11]>>>28,R=e[20]<<3|e[21]>>>29,j=e[21]<<3|e[20]>>>29,ae=e[31]<<9|e[30]>>>23,ce=e[30]<<9|e[31]>>>23,M=e[40]<<18|e[41]>>>14,z=e[41]<<18|e[40]>>>14,I=e[2]<<1|e[3]>>>31,C=e[3]<<1|e[2]>>>31,g=e[13]<<12|e[12]>>>20,y=e[12]<<12|e[13]>>>20,K=e[22]<<10|e[23]>>>22,H=e[23]<<10|e[22]>>>22,N=e[33]<<13|e[32]>>>19,D=e[32]<<13|e[33]>>>19,le=e[42]<<2|e[43]>>>30,de=e[43]<<2|e[42]>>>30,te=e[5]<<30|e[4]>>>2,ne=e[4]<<30|e[5]>>>2,L=e[14]<<6|e[15]>>>26,B=e[15]<<6|e[14]>>>26,b=e[25]<<11|e[24]>>>21,w=e[24]<<11|e[25]>>>21,Q=e[34]<<15|e[35]>>>17,X=e[35]<<15|e[34]>>>17,T=e[45]<<29|e[44]>>>3,O=e[44]<<29|e[45]>>>3,P=e[6]<<28|e[7]>>>4,S=e[7]<<28|e[6]>>>4,re=e[17]<<23|e[16]>>>9,oe=e[16]<<23|e[17]>>>9,F=e[26]<<25|e[27]>>>7,J=e[27]<<25|e[26]>>>7,v=e[36]<<21|e[37]>>>11,k=e[37]<<21|e[36]>>>11,Z=e[47]<<24|e[46]>>>8,ee=e[46]<<24|e[47]>>>8,Y=e[8]<<27|e[9]>>>5,q=e[9]<<27|e[8]>>>5,x=e[18]<<20|e[19]>>>12,$=e[19]<<20|e[18]>>>12,se=e[29]<<7|e[28]>>>25,ie=e[28]<<7|e[29]>>>25,U=e[38]<<8|e[39]>>>24,W=e[39]<<8|e[38]>>>24,E=e[48]<<14|e[49]>>>18,A=e[49]<<14|e[48]>>>18,e[0]=h^~g&b,e[1]=m^~y&w,e[10]=P^~x&R,e[11]=S^~$&j,e[20]=I^~L&F,e[21]=C^~B&J,e[30]=Y^~V&K,e[31]=q^~G&H,e[40]=te^~re&se,e[41]=ne^~oe&ie,e[2]=g^~b&v,e[3]=y^~w&k,e[12]=x^~R&N,e[13]=$^~j&D,e[22]=L^~F&U,e[23]=B^~J&W,e[32]=V^~K&Q,e[33]=G^~H&X,e[42]=re^~se&ae,e[43]=oe^~ie&ce,e[4]=b^~v&E,e[5]=w^~k&A,e[14]=R^~N&T,e[15]=j^~D&O,e[24]=F^~U&M,e[25]=J^~W&z,e[34]=K^~Q&Z,e[35]=H^~X&ee,e[44]=se^~ae&le,e[45]=ie^~ce&de,e[6]=v^~E&h,e[7]=k^~A&m,e[16]=N^~T&P,e[17]=D^~O&S,e[26]=U^~M&I,e[27]=W^~z&C,e[36]=Q^~Z&Y,e[37]=X^~ee&q,e[46]=ae^~le&te,e[47]=ce^~de&ne,e[8]=E^~h&g,e[9]=A^~m&y,e[18]=T^~P&x,e[19]=O^~S&$,e[28]=M^~I&L,e[29]=z^~C&B,e[38]=Z^~Y&V,e[39]=ee^~q&G,e[48]=le^~te&re,e[49]=de^~ne&oe,e[0]^=_[r],e[1]^=_[r+1]},F=function(){const e={instance:Error,from:e=>{const t=[e.name,e.message];return void 0!==e.stack&&t.push(e.stack),void 0!==e.cause&&(void 0===e.stack&&t.push(void 0),t.push(e.cause)),t},stub:()=>new Error,hydrate:(e,[t,n,r,o])=>{e.name=t,e.message=n,void 0===r?delete e.stack:e.stack=r,void 0!==o&&(e.cause=o)}},t={instance:Uint8Array,from:e=>[btoa(U.decode(e))],create:([e])=>J.encode(atob(e))},n={instance:Map,from:e=>[...e.entries()],stub:()=>new Map,hydrate:(e,t)=>{for(const[n,r]of t)e.set(n,r)}},r={instance:Set,from:e=>[...e.values()],stub:()=>new Set,hydrate:(e,t)=>{for(const n of t)e.add(n)}},o={instance:Date,from:e=>[e.toJSON()],create:([e])=>new Date(e)},s={instance:RegExp,from:({flags:e,source:t})=>e?[t,e]:[t],create:([e,t])=>new RegExp(e,t)},i={instance:URL,from:e=>[e.href],create:([e])=>new URL(e)};return new Map([e,t,n,r,o,s,i].map(e=>[e.instance.name,e]))}(),J=new TextEncoder,U=new TextDecoder("utf-8");function W(e=void 0,t=F){return JSON.stringify(Y(e,t))}function M(e){if(void 0===e)return-1;if("number"==typeof e){if(Number.isNaN(e))return-3;if(!Number.isFinite(e))return e<0?-5:-4}return null}const z=[];function Y(e,t=F){const n=M(e);if(null!==n)return n;const r=[],o=new Map;return function e(n){const s=M(n);if(null!==s)return s;let i=o.get(n);if(void 0!==i)return i;switch(i=r.length,typeof n){case"number":case"string":case"boolean":r[i]=n,o.set(n,i);break;case"bigint":r[i]=[-6,n.toString(16)],o.set(n,i);break;case"object":if(null===n)r[i]=n,o.set(n,i);else if(Array.isArray(n)){const t=function(e){if(z.length<e){const t=z.length;z.length=e,z.fill(-2,t,e)}return z.slice(0,e)}(n.length);r[i]=t,o.set(n,i);for(const[r,o]of n.entries())t[r]=e(o)}else{const[s,a]=function(e,t){const n=e.constructor;if("function"==typeof n){const r=n.name,o=t.get(r);if(void 0!==o)return[r,o.from(e)]}const r=Object.entries(e),o=r.length,s=Array.from({length:o+o});for(let e=0;e<o;e++){const t=r[e],n=e+e;s[n]=t[0],s[n+1]=t[1]}return["",s]}(n,t),c=a.length,l=Array.from({length:c+1});l[0]=s,r[i]=l,o.set(n,i);for(let t=0;t<c;t++)l[t+1]=e(a[t])}}return i}(e),r}function q(e,t){return function(e){return new L(512,O,512).update(e).hex()}(W([e,t]))}const V=function({cacheDuration:e=Number.POSITIVE_INFINITY,getCacheKey:t=q}={}){return function(n,r){let o,s,i;return"getter"===r?.kind?function(){const r=t(this,[]),a=Date.now();return(i!==r||a-s>e)&&(i=r,o=n.call(this),s=a),o}:function(...a){const c=t(this,a),l=Date.now();return(i!==c||l-s>e)&&(i=c,o=r?n.call(this,...a):n(...a),s=l),o}}}({getCacheKey:q});function G(e){return!!e&&"0"!==e&&"false"!==e}let K;class H{static{[K]=function(e,t,n,r,o){var s,i,a,c,l,d,u,p=Symbol.metadata||Symbol.for("Symbol.metadata"),f=Object.defineProperty,h=Object.create,m=[h(null),h(null)],g=t.length;function y(t,n,r){return function(o,s){n&&(s=o,o=e);for(var i=0;i<t.length;i++)s=t[i].apply(o,r?[s]:[]);return r?s:o}}function b(e,t,n,r){if("function"!=typeof e&&(r||void 0!==e))throw new TypeError(t+" must "+(n||"be")+" a function"+(r?"":" or undefined"));return e}function w(e,t,n,r,o,a,c,l,d,u,p){function h(e){if(!p(e))throw new TypeError("Attempted to access private element on non-instance")}var g=[].concat(t[0]),w=t[3],v=!c,k=1===o,E=3===o,A=4===o,P=2===o;function S(t,n,r){return function(o,s){return n&&(s=o,o=e),r&&r(o),x[t].call(o,s)}}if(!v){var x={},$=[],R=E?"get":A||k?"set":"value";if(d?(u||k?x={get:N(function(){return w(this)},r,"get"),set:function(e){t[4](this,e)}}:x[R]=w,u||N(x[R],r,P?"":R)):u||(x=Object.getOwnPropertyDescriptor(e,r)),!u&&!d){if((i=m[+l][r])&&7!==(i^o))throw Error("Decorating two elements with the same name ("+x[R].name+") is not supported yet");m[+l][r]=o<3?1:o}}for(var j=e,D=g.length-1;D>=0;D-=n?2:1){var T=b(g[D],"A decorator","be",!0),O=n?g[D-1]:void 0,I={},_={kind:["field","accessor","method","getter","setter","class"][o],name:r,metadata:s,addInitializer:function(e,t){if(e.v)throw new TypeError("attempted to call addInitializer after decoration was finished");b(t,"An initializer","be",!0),a.push(t)}.bind(null,I)};if(v)i=T.call(O,j,_),I.v=1,b(i,"class decorators","return")&&(j=i);else if(_.static=l,_.private=d,i=_.access={has:d?p.bind():function(e){return r in e}},A||(i.get=d?P?function(e){return h(e),x.value}:S("get",0,h):function(e){return e[r]}),P||E||(i.set=d?S("set",0,h):function(e,t){e[r]=t}),j=T.call(O,k?{get:x.get,set:x.set}:x[R],_),I.v=1,k){if("object"==typeof j&&j)(i=b(j.get,"accessor.get"))&&(x.get=i),(i=b(j.set,"accessor.set"))&&(x.set=i),(i=b(j.init,"accessor.init"))&&$.unshift(i);else if(void 0!==j)throw new TypeError("accessor decorators must return an object with get, set, or init properties or undefined")}else b(j,(u?"field":"method")+" decorators","return")&&(u?$.unshift(j):x[R]=j)}return o<2&&c.push(y($,l,1),y(a,l,0)),u||v||(d?k?c.splice(-1,0,S("get",l),S("set",l)):c.push(P?x[R]:b.call.bind(x[R])):f(e,r,x)),j}function v(e){return f(e,p,{configurable:!0,enumerable:!0,value:s})}return s=h(null==s?null:s),l=[],d=function(e){e&&l.push(y(e))},u=function(t,r){for(var s=0;s<n.length;s++){var i=n[s],d=i[1],u=7&d;if((8&d)==t&&!u==r){var p=i[2],f=!!i[3],h=16&d;w(t?e:e.prototype,i,h,f?"#"+p:D(p),u,u<2?[]:t?c=c||[]:a=a||[],l,!!t,f,r,t&&f?function(t){return j(t)===e}:o)}}},u(8,0),u(0,0),u(8,1),u(0,1),d(a),d(c),i=l,g||v(e),{e:i,get c(){var n=[];return g&&[v(e=w(e,[t],r,e.name,5,n)),y(n,1)]}}}(this,[],[[V,3,"isBunAvailable"],[V,3,"buildCommand"],[V,3,"rootDirPath"],[V,3,"dockerfile"],[V,3,"hasDockerfile"],[V,3,"hasSourceCode"],[V,3,"name"],[V,3,"dockerImageName"],[V,3,"env"],[V,3,"packageJson"],[V,3,"packageJsonPath"],[V,3,"hasPrisma"],[V,3,"hasVitest"],[V,3,"hasBiome"],[V,3,"hasEslint"],[V,3,"hasOxlint"],[V,3,"hasOxfmt"],[V,3,"hasPoetryLock"],[V,3,"hasPubspecYaml"],[V,3,"preferredLinter"],[V,3,"hasPlaywrightConfig"],[V,3,"skipLaunchingServerForPlaywright"],[V,3,"dockerPackageJson"],[V,3,"binExists"],[V,3,"rootPackageJson"]]).e}argv=void K(this);pathByName=new Map;constructor(e,n,r){this._dirPath=t.resolve(e),this.argv=n,this.loadEnv=r}get isBunAvailable(){try{return/(^|\n)bun\s/.test(e.readFileSync(t.join(this.rootDirPath,".tool-versions"),"utf8"))}catch{return!1}}get buildCommand(){return this.packageJson.scripts?.build?.includes("buildIfNeeded")?"YARN run build":this.packageJson.scripts?.build?"YARN wb buildIfNeeded "+(this.argv.verbose?"--verbose":""):"echo 'No build script'"}get dirPath(){return this._dirPath}get rootDirPath(){return e.existsSync(t.join(this.dirPath,"..","..","package.json"))?t.resolve(this.dirPath,"..",".."):this.dirPath}get dockerfile(){return e.readFileSync(this.findFile("Dockerfile"),"utf8")}get hasDockerfile(){try{return!!this.findFile("Dockerfile")}catch{return!1}}get hasSourceCode(){return e.existsSync(t.join(this.dirPath,"src"))}get name(){return this.packageJson.name||"unknown"}get dockerImageName(){return(this.packageJson.name||"unknown").replaceAll("@","").replaceAll("/","-")}get env(){if(!this.loadEnv)return process.env;const[n,r]=function(n,r){let o=(n.env??[]).map(e=>t.resolve(r,e.toString()));const s=n.cascadeEnv??(n.cascadeNodeEnv?process.env.NODE_ENV||"development":n.autoCascadeEnv?process.env.WB_ENV||process.env.NODE_ENV||"development":void 0);if("string"==typeof s){if(0===o.length&&(o.push(t.join(r,".env")),n.includeRootEnv)){const n=t.resolve(r,"..","..");e.existsSync(t.join(n,"package.json"))&&o.push(t.join(n,".env"))}o=o.flatMap(e=>s?[`${e}.${s}.local`,`${e}.local`,`${e}.${s}`,e]:[`${e}.local`,e])}o=o.filter(t=>e.existsSync(t)).map(e=>t.relative(r,e)),n.verbose&&(console.info(`WB_ENV: ${process.env.WB_ENV}, NODE_ENV: ${process.env.NODE_ENV}`),console.info("Reading env files:",o.join(", ")));const i=[],a={};for(const e of o){const o=[];for(const[n,s]of Object.entries(k(t.join(r,e))))n in a||n in process.env||(a[n]=s,o.push(n));i.push([e,o]),n.verbose&&o.length>0&&console.info(`Read ${o.length} environment variables from ${e}`)}if(n.verbose||console.info(`Read env files: ${i.map(([e,t])=>t.length>0?`${e} (${t.join(", ")})`:e).join(", ")||"nothing"}`),n.checkEnv){const e=Object.keys(k(t.join(r,n.checkEnv))).filter(e=>!(e in a)&&!(e in process.env));if(e.length>0)throw new Error(`Missing environment variables in [${o.join(", ")}]: [${e.join(", ")}]`)}return[p({parsed:a,processEnv:{}}).parsed??a,i]}(this.argv,this.dirPath);for(const[e,t]of r)console.info(`Loaded ${t} environment variables from ${e}`);return{...n,...process.env}}get packageJson(){return JSON.parse(e.readFileSync(this.packageJsonPath,"utf8"))}get packageJsonPath(){return t.join(this.dirPath,"package.json")}get hasPrisma(){return!!(this.packageJson.dependencies?.prisma??this.packageJson.devDependencies?.prisma)}get hasVitest(){return!!(this.packageJson.dependencies?.vitest??this.packageJson.devDependencies?.vitest)}get hasBiome(){return this.hasDependency("@biomejs/biome")||this.hasDependency("biome")}get hasEslint(){return this.hasDependency("eslint")}get hasOxlint(){return this.hasDependency("oxlint")}get hasOxfmt(){return this.hasDependency("oxfmt")}get hasPoetryLock(){return e.existsSync(t.join(this.dirPath,"poetry.lock"))||e.existsSync(t.join(this.rootDirPath,"poetry.lock"))}get hasPubspecYaml(){return e.existsSync(t.join(this.dirPath,"pubspec.yaml"))||e.existsSync(t.join(this.rootDirPath,"pubspec.yaml"))}get preferredLinter(){return this.hasBiome?"biome":this.hasOxlint?"oxlint":this.hasEslint?"eslint":void 0}get hasPlaywrightConfig(){try{return!!this.findFile("playwright.config.ts")}catch{return!1}}get skipLaunchingServerForPlaywright(){if(G(this.env.CI))return!1;try{const t=this.findFile("playwright.config.ts");return/\bwebServer\b/.test(e.readFileSync(t,"utf8"))}catch{return!1}}get dockerPackageJson(){return t.dirname(this.findFile("Dockerfile"))===this.dirPath?this.packageJson:JSON.parse(e.readFileSync(t.join(t.dirname(this.findFile("Dockerfile")),"package.json"),"utf8"))}get binExists(){let n=!1,r=this.dirPath;for(;;){const o=t.join(r,"node_modules",".bin");if(e.existsSync(o)&&(this.env.PATH=`${o}:${this.env.PATH}`,n=!0),e.existsSync(t.join(r,".git")))break;const s=t.dirname(r);if(r===s)break;r=s}return n}findFile(n){let r=this.pathByName.get(n);if(r)return r;if(r=[n,t.join("..","..",n)].map(e=>t.resolve(this.dirPath,e)).find(t=>e.existsSync(t)),!r)throw new Error(`File not found: ${n}`);return this.pathByName.set(n,r),r}hasDependency(e){const t=t=>!(!t||!(t.dependencies?.[e]||t.devDependencies?.[e]||t.optionalDependencies?.[e]||t.peerDependencies?.[e]));return t(this.packageJson)||t(this.rootPackageJson)}get rootPackageJson(){if(this.rootDirPath===this.dirPath)return this.packageJson;try{return JSON.parse(e.readFileSync(t.join(this.rootDirPath,"package.json"),"utf8"))}catch(e){return void console.error(`[wb] Failed to read or parse ${t.join(this.rootDirPath,"package.json")}`,e)}}}function Q(n,r=!0,o){if(o??=process.cwd(),e.existsSync(t.join(o,"package.json")))return new H(o,n,r)}async function X(e,t=!0,n){const r=Z(e,t,n);if(r)return{...r,descendants:r.root===r.self?await ee(e,r.root,t):[r.self]}}function Z(n,r=!0,o){if(o??=process.cwd(),!e.existsSync(t.join(o,"package.json")))return;const s=new H(o,n,r);let i=s;if(!s.packageJson.workspaces&&t.dirname(o).endsWith("/packages")){const s=t.resolve(o,"..","..");e.existsSync(t.join(s,"package.json"))&&(i=new H(s,n,r))}return{root:i,self:s}}async function ee(n,r,o){const s=[r],i=r.packageJson.workspaces;if(!Array.isArray(i))return s;const a=[],c=[];for(const n of i.map(e=>t.join(r.dirPath,e)))e.existsSync(n)?c.push(n):a.push(n);c.push(...await d(a,{dot:!0,onlyDirectories:!0}));for(const r of c)e.existsSync(t.join(r,"package.json"))&&s.push(new H(r,n,o));return s}const te=process.versions.bun||process.argv[0]?.endsWith("/bun")||process.env.npm_execpath?.endsWith("/bun"),ne=te?"bun --bun run":"node",re=te?"bun":"yarn",oe=te?"bun --bun run":"yarn",se={command:"buildIfNeeded",describe:"Build code if changes are detected",builder:{command:{description:"A build command (default: yarn|bun build)",type:"string",alias:"c"}},async handler(n){await async function(n,r){const s=Q(n,!0,r);if(!s)return console.error(l.red("No project found.")),!0;if(n={...n,command:n.command??(te?"bun run build":"yarn build")},!e.existsSync(t.join(s.rootDirPath,".git")))return ie(s,n),!0;const[i,a,d]=await async function(n,r){const s=t.resolve(n.dirPath,"node_modules",".cache","build"),i=t.resolve(s,"last-build");await e.promises.mkdir(s,{recursive:!0});const a=c("sha256"),l=o.execSync("git rev-parse HEAD",{cwd:n.dirPath}).toString().trim();a.update(l);const d=JSON.stringify(Object.entries(n.env).filter(([e])=>!ae.has(e)).toSorted(([e],[t])=>e.localeCompare(t)));a.update(d),await async function(e,t,n){return new Promise(r=>{const s=o.spawnSync("git",["status","--porcelain"],{cwd:e.dirPath,env:e.env,stdio:"pipe",encoding:"utf8"}).stdout.trim().split("\n").filter(e=>e.length>0).map(e=>e.slice(2).trim()).map(t=>"test"===e.env.WB_ENV?t.replace(/packages\/wb\/test\/fixtures\/[^/]+\//,""):t).filter(e=>(ce.some(t=>e.includes(t))||le.some(t=>e.endsWith(t)))&&!de.some(t=>e.includes(t)));t.verbose&&console.info(`Changed files: ${s.join(", ")}`);const i=o.spawn("git",["diff","--",...s],{cwd:e.rootDirPath});i.stdout.on("data",e=>{n.update(e),t.verbose&&(console.info("Data:",e),console.info("Hash:",n.copy().digest("hex")))}),i.on("close",()=>{r()})})}(n,r,a);const u=a.digest("hex"),p=await async function(e){try{return await e()}catch(e){if("object"==typeof e&&e&&"code"in e&&"ENOENT"===e.code)return;throw e}}(()=>e.promises.readFile(i,"utf8"));return[p===u,i,u]}(s,n);if(i)return console.info(l.green(`Skip to run '${n.command}' 💫`)),!1;if(!ie(s,n))return;n.dryRun||await e.promises.writeFile(a,d,"utf8");return!0}(n)}};function ie(e,t){if(console.info(l.green(`Run '${t.command}'`)),!t.dryRun){const n=o.spawnSync(t.command??"",{cwd:e.dirPath,env:e.env,shell:!0,stdio:"inherit"});if(0!==n.status)return process.exitCode=n.status??1,!1}return!0}const ae=new Set(["CI","PWDEBUG","TMPDIR"]);const ce=["src/","public/"],le=[".js",".cjs",".mjs",".jsx",".ts",".cts",".mts",".tsx",".json",".browserslistrc","package.json","yarn.lock"],de=["test/","tests/","__tests__/","test-fixtures/","test/fixtures/"];const ue=new m,pe={exitIfFailed:!0};async function fe(e,t,n,r=pe){const o=me(e,t);if(ge(o.printable,t),n.verbose&&ge(o.runnable,t,"Start (raw)",!0),n.dryRun)return ye(o.printable,0,r),0;const s=await R(o.runnable,void 0,{cwd:t.dirPath,env:be(t.env,r),shell:!0,stdio:"inherit",timeout:r.timeout,killOnExit:!0,verbose:n.verbose});return r.onSignal?.(s.signal),ye(o.printable,s.status,r),s.status??1}function he(e,t,n,r=pe){return ue.runAndWaitForReturnValue(async()=>{const o=me(e,t);if(ge(o.printable,t,"Start (parallel)",!0),n.dryRun)return ge(o.printable,t,"Started (log)"),n.verbose&&ge(o.runnable,t,"Started (raw)",!0),ye(o.printable,0,r),0;const s=await R(o.runnable,void 0,{cwd:t.dirPath,env:be(t.env,r),shell:!0,stdio:"pipe",timeout:r.timeout,mergeOutAndError:!0,killOnExit:!0,verbose:n.verbose});r.onSignal?.(s.signal),ge(o.printable,t,"Started (log)"),n.verbose&&ge(o.runnable,t,"Started (raw)",!0);const i=s.stdout.trim();return i&&(process.stdout.write(i),process.stdout.write("\n")),ye(o.printable,s.status,r),s.status??1})}function me(e,t){let n=e.replaceAll("\n","").replaceAll(/\s\s+/g," ").replaceAll("PRISMA generate ",t.packageJson.dependencies?.blitz?"PRISMA generate ":"PRISMA generate --no-hints ").replaceAll("PRISMA ",t.packageJson.dependencies?.blitz?"YARN blitz prisma ":"YARN prisma ").replaceAll("BUN ",t.isBunAvailable?"bun --bun run ":"YARN ").replaceAll("YARN run ",te?"bun --bun run ":"yarn run ");te&&(n=n.replaceAll("YARN build-ts run","bun --bun run").replaceAll("bun --bun run bun --bun run","bun --bun run").replaceAll("dist/index.js","src/index.ts").replaceAll(/(?:YARN )?vitest run/g,"bun test").replaceAll(/ --color --passWithNoTests(?: --allowOnly)?/g,"")),n=n.trim();const r=we(n.replaceAll("YARN ",`${oe} `)),o=we(n.replaceAll("YARN playwright ",`${oe} playwright `).replaceAll("YARN ",!te&&t.binExists?"":`${oe} `)),s=t.env.WB_ENV?` -c=${t.env.WB_ENV||"development"}`:"";return{printable:`${oe} dotenv${s} -- ${r}`,runnable:o}}function ge(e,t,n="Start",r=!1){console.info("\n"+(r?l.gray:l.cyan)(l.bold(`${n}:`),e)+l.gray(` at ${t.dirPath}`))}function ye(e,t,n){0===t?console.info(l.green(l.bold("Finished:"),e)):(console.info(l.red(l.bold(`Failed (exit code ${t}): `),e)),!1!==n.exitIfFailed&&process.exit(t??1))}function be(e,t){const n={...e};return t.ci&&(n.CI="1"),t.forceColor&&(n.FORCE_COLOR="3"),n}function we(e){return e.includes("next dev")||e.includes("playwright")||e.includes("prisma")||e.includes("test/e2e-additional")?e.replaceAll("bun --bun","bun"):e}const ve={...w,"working-dir":{description:"A working directory",type:"string",alias:"w"},"dry-run":{description:"Whether to skip actual command execution",type:"boolean",alias:["dry","d"]}};function ke(e){const t=[];for(const n of Object.keys(w)){const r=Ee(e,n);if(void 0!==r)if("boolean"!=typeof r)if("string"!=typeof r&&"number"!=typeof r){if(Array.isArray(r))for(const e of r)t.push(`--${n}=${e}`)}else t.push(`--${n}=${r}`);else t.push(r?`--${n}`:`--${n}=false`)}return t}function Ee(e,t){const n=t.replaceAll(/-([a-z])/g,(e,t)=>t.toUpperCase()),r=e;return r[t]??r[n]}const Ae={command:"concurrently <commands...>",describe:"Run commands concurrently",builder:{...ve,"kill-others":{description:"Kill other commands when one command exits",type:"boolean"},"kill-others-on-fail":{description:"Kill other commands when one command fails",type:"boolean"},success:{description:"Define successful completion criteria",type:"string",choices:["all","first"],default:"all"},commands:{description:"Commands to run concurrently",type:"array"}},async handler(e){"win32"===process.platform&&(console.error(l.red("This command is not supported on Windows.")),process.exit(1));const t=Q(e);t||(console.error(l.red("No project found.")),process.exit(1));const n=(e.commands??[]).map(String).filter(Boolean);0===n.length&&(console.error(l.red("No commands provided.")),process.exit(1));try{const r=await async function(e){const t=e.commands.map(t=>o.spawn(me(t,e.project).runnable,{cwd:e.project.dirPath,detached:!0,env:be(e.project.env,{ci:e.ci,forceColor:e.forceColor}),shell:!0,stdio:"inherit"}));let n,r,s,i=!1;const a=Array.from({length:t.length}),c=t.map((n,o)=>new Promise(c=>{let l=!1;const d=n=>{l||(l=!0,a[o]=n,r??=n,!i&&function(e,t){return"first"===t.success||t.killOthers||t.killOthersOnFail&&0!==e}(n,e)&&(s=n,i=!0,Se(t)),c())};n.once("error",e=>{console.error("Failed to start child process:",e),d(1)}),n.once("exit",(e,t)=>{d(Pe(e??void 0,t??void 0))})})),l=e=>{n??=e,i||(i=!0,Se(t))},d=()=>{l("SIGINT")},u=()=>{l("SIGTERM")},p=()=>{l("SIGQUIT")};process.on("SIGINT",d),process.on("SIGTERM",u),process.on("SIGQUIT",p);try{await Promise.all(c)}finally{process.removeListener("SIGINT",d),process.removeListener("SIGTERM",u),process.removeListener("SIGQUIT",p)}if(n)return Pe(void 0,n);if("first"===e.success)return r??1;if(void 0!==s)return s;for(const e of a)if(void 0!==e&&0!==e)return e;return 0}({commands:n,project:t,killOthers:e.killOthers??!1,killOthersOnFail:e.killOthersOnFail??!1,success:e.success,ci:"boolean"==typeof e.ci?e.ci:void 0,forceColor:"boolean"==typeof e.forceColor?e.forceColor:void 0});process.exit(r)}catch(e){console.error(l.red(e instanceof Error?e.message:String(e))),process.exit(1)}}};function Pe(e,t){return void 0!==e?e:t&&t in h.signals?128+h.signals[t]:1}function Se(e){for(const t of e)if(t.pid)try{xe(t.pid),A(t.pid)}catch(e){console.warn("Failed to kill child process:",e)}}function xe(e){try{process.kill(-e,"SIGTERM")}catch(e){if(function(e){return"object"==typeof e&&null!==e&&"code"in e&&"ESRCH"===e.code}(e))return;throw e}}const $e={command:"kill-port-if-non-ci",describe:"Kill the port specified by PORT environment variable if non-CI.",builder:{},async handler(e){await async function(e){const t=Q(e);t||(console.error(l.red("No project found.")),process.exit(1));if(G(t.env.CI))return void console.info(`Skip killing port due to CI: ${t.env.CI}`);const n=t.env.PORT,r=Number(n);(!Number.isInteger(r)||r<=0)&&(console.error(l.red(`PORT environment variable is invalid: ${n}`)),process.exit(1));console.info(`Killing the port: ${r}`);try{await g(r)}catch{}}(e)}};function Re(e){return e.map(e=>je(e)).join(" ")}function je(e){return/^[\w./:=,@%+-]+$/u.test(e)?e:`'${e.replaceAll("'","'\"'\"'")}'`}const Ne=new Set(["astro","cjs","css","cts","gql","htm","html","js","json","json5","jsonc","jsx","mjs","mts","svelte","ts","tsx","vue","yaml","yml"]),De=new Set(["cjs","cts","js","jsx","mjs","mts","ts","tsx"]),Te=new Set([...De,"astro","svelte","vue"]),Oe=new Set(["py"]),Ie=new Set(["dart"]),_e=new Set([...Te,"css","gql","graphql","hbs","htm","html","json","json5","jsonc","less","md","mdx","scss","toml","yaml","yml"]),Ce=new Set(["cjs","css","cts","htm","html","java","js","json","json5","jsonc","jsx","md","mjs","mts","scss","ts","tsx","vue","yaml","yml"]),Le=new Set([...Ce].filter(e=>!Ne.has(e))),Be="!**/test{-,/}fixtures/**",Fe={command:"lint [files...]",describe:"Lint code",builder:{fix:{description:"Fix the linting errors",type:"boolean"},format:{description:"Format the code",type:"boolean"},quiet:{description:"Report errors only",type:"boolean"}},async handler(e){const t=await Je(e);t&&process.exit(t)}};async function Je(e){if("win32"===process.platform)return console.error(l.red("This command is not supported on Windows.")),1;const n=await X(e,!1);if(!n)return console.error(l.red("No project found.")),1;const r=function(e){const t=new Set;for(const n of[...e.files??[],...e._.slice(1),...e["--"]??[]])t.add(String(n));return[...t]}(e),o=new Map,s=new Map,i=new Map,a=new Map,c=[],d=[];let u,p,f=!1;if(r.length>0){const e=await Promise.all(r.map(async e=>{const n=t.resolve(e),r=await async function(e){try{if((await y.stat(e)).isDirectory())return"directory"}catch{}return"other"}(n);return{fileKind:r,filePath:n}}));for(const{fileKind:r,filePath:u}of e){if(u.endsWith("/test/fixtures")||u.includes("/test/fixtures/")||u.endsWith("/test-fixtures")||u.includes("/test-fixtures/"))continue;const e=t.extname(u).slice(1);if(u.endsWith("/package.json"))d.push(u);else{d.push(...qe(n.descendants,u,r));for(const{lintPath:t,project:d}of Ve(n.descendants,u,r)){if(d.hasPoetryLock&&("directory"===r||Oe.has(e))){const e=i.get(d)??[];if(e.push(t),i.set(d,e),"directory"!==r)continue}if(d.hasPubspecYaml&&("directory"===r||Ie.has(e))){const e=a.get(d)??[];if(e.push(t),a.set(d,e),"directory"!==r)continue}if("biome"===d.preferredLinter||"directory"===r||Ke(d,e)){const n=o.get(d)??[];n.push(t),o.set(d,n);for(const n of Ye(d,t,r,e))if(d.hasOxfmt){const e=s.get(d)??[];e.push(n),s.set(d,e)}else c.push(n)}else if(Ce.has(e)||_e.has(e))if(d.hasOxfmt&&_e.has(e)){const e=s.get(d)??[];e.push(t),s.set(d,e)}else Ce.has(e)&&c.push(t);else Ge(e)&&!d.preferredLinter&&(console.error(l.red(`No linter found for ${d.name}. Install ESLint or Biome.`)),f=!0)}}}u=[...new Set(c)],p=[...new Set(d)]}else u=function(e,n){const r=new Set([`**/{.*/,}*.{${[...Le].join(",")}}`,Be]);for(const o of n){if(!He(o))continue;const n=t.join(o.dirPath,"**/{.*/,}*.{"+[...Ce].join(",")+"}");r.add(t.relative(e,n)||n)}return[...r]}(n.self.dirPath,n.descendants),p=n.descendants.map(e=>e.packageJsonPath);const h=[],m={exitIfFailed:!1,forceColor:!0};if(r.length>0){for(const[t,n]of o){const r=Ue(t,e,n);r&&h.push(he(r,t,e,m))}for(const[t,n]of s)h.push(he(We(n),t,e,m));for(const[t,n]of i)h.push(he(Me(e,n),t,e,m));for(const[t,n]of a)h.push(he(ze(e,n),t,e,m))}else{for(const t of n.descendants){if(t.packageJson.workspaces&&!t.hasSourceCode)continue;const n=Ue(t,e);n&&h.push(he(n,t,e,m))}for(const t of n.descendants)t.hasPoetryLock&&h.push(he(Me(e),t,e,m)),t.hasPubspecYaml&&h.push(he(ze(e),t,e,m)),t.hasOxfmt&&e.format&&h.push(he(We(),t,e,m))}const g=await Promise.all(h);return f||g.some(e=>0!==e)?1:(e.format&&(u.length>0&&g.push(await he(Re(["YARN","prettier","--cache","--color","--no-error-on-unmatched-pattern","--write","--",...u]),n.self,e,{exitIfFailed:!1,forceColor:!0})),p.length>0&&g.push(await he(Re(["YARN","sort-package-json","--",...p]),n.self,e,{exitIfFailed:!1,forceColor:!0}))),g.some(e=>0!==e)?1:0)}function Ue(e,t,n){if("biome"===e.preferredLinter){let e;return e=t.fix&&t.format?["check","--fix"]:t.fix?["lint","--fix"]:t.format?["format","--fix"]:["lint"],Re(["BUN","biome",...e,"--colors=force","--no-errors-on-unmatched","--files-ignore-unknown=true",...t.quiet?["--diagnostic-level=error"]:[],...n?.length?["--"]:[],...n??[]])}return"eslint"===e.preferredLinter?Re(["YARN","eslint","--color",...t.quiet?["--quiet"]:[],...t.fix||t.format?["--fix"]:[],"--",...n??["."]]):"oxlint"===e.preferredLinter?Re(["YARN","oxlint",...t.quiet?["--quiet"]:[],...t.fix?["--fix"]:[],...n??["."]]):void 0}function We(e){return Re(["YARN","oxfmt","--write","--no-error-on-unmatched-pattern",...e??["."]])}function Me(e,t){const n=t&&t.length>0?t:["."];return(e.fix||e.format?[Re(["poetry","run","isort","--profile","black","--filter-files",...n]),Re(["poetry","run","black",...n]),Re(["poetry","run","flake8",...e.quiet?["-q"]:[],...n])]:[Re(["poetry","run","flake8",...e.quiet?["-q"]:[],...n])]).join(" && ")}function ze(e,t){const n=t&&t.length>0?t:["."],r=[];return(e.fix||e.format)&&r.push(Re(["dart","format",...n])),r.push(Re(["dart","analyze",...n])),r.join(" && ")}function Ye(e,n,r,o){return"directory"===r&&e.hasOxfmt?[n]:"directory"===r&&"biome"===e.preferredLinter?[t.join(n,"**/{.*/,}*.{"+[...Le].join(",")+"}"),Be]:"directory"===r&&He(e)?[n,Be]:function(e,t){return e.hasOxfmt?_e.has(t):!!He(e)||"biome"===e.preferredLinter&&!Ke(e,t)&&Ce.has(t)}(e,o)?[n]:[]}function qe(e,n,r){return"directory"!==r?[]:e.filter(e=>e.packageJsonPath===t.join(n,"package.json")||e.packageJsonPath.startsWith(`${n}/`)).map(e=>e.packageJsonPath)}function Ve(e,t,n){if("directory"===n){const n=e.filter(e=>e.dirPath===t||e.dirPath.startsWith(`${t}/`));if(n.length>0)return n.map(e=>({lintPath:e.dirPath,project:e}))}const r=function(e,t){let n;for(const r of e)t!==r.dirPath&&!t.startsWith(`${r.dirPath}/`)||n&&!(r.dirPath.length>n.dirPath.length)||(n=r);return n}(e,t);return r?[{lintPath:t,project:r}]:[]}function Ge(e){return Ne.has(e)||Te.has(e)||De.has(e)||Oe.has(e)||Ie.has(e)}function Ke(e,t){return"biome"===e.preferredLinter?Ne.has(t):"oxlint"===e.preferredLinter?Te.has(t):"eslint"===e.preferredLinter&&De.has(t)}function He(e){return!e.hasOxfmt&&("eslint"===e.preferredLinter||"oxlint"===e.preferredLinter)}function*Qe(e,t){for(const n of t)console.info(`Running "${e}" for ${n.name} ...`),yield n}const Xe={command:"optimizeForDockerBuild",describe:"Optimize configuration when building a Docker image",builder:{outside:{description:"Whether the optimization is executed outside a docker container or not",type:"boolean",alias:"o"}},async handler(n){const r=await X(n);r||(console.error(l.red("No project found.")),process.exit(1));for(const o of Qe("optimizeForDockerBuild",r.descendants)){const r=o.packageJson,s=["dependencies","devDependencies"];for(const e of s){const t=r[e]??{};for(const[e,n]of Object.entries(t))n?.startsWith("git@github.com:")&&(t[e]=`./${e}`)}if(Ze(n,r),et(r),tt(r),n.dryRun)continue;const i=n.outside?t.join(o.dirPath,"dist"):o.dirPath;await e.promises.mkdir(i,{recursive:!0}),await e.promises.writeFile(t.join(i,"package.json"),JSON.stringify(r),"utf8")}n.dryRun||n.outside||(o.spawnSync(re,["install"],{stdio:"inherit"}),console.info("Installed dependencies."))}};function Ze(e,t){if(!e.outside)return delete t.devDependencies,void console.info("Removed all devDependencies.");const n=t.devDependencies??{},r=["artillery","biome","concurrently","conventional-changelog-conventionalcommits","eslint","husky","imagemin","jest","kill-port","lint-staged","open-cli","playwright","prettier","pinst","railway","semantic-release","sort-package-json","wait-on","vitest"],o=[];for(const e of Object.keys(n))(r.some(t=>e.includes(t))||e.includes("willbooster")&&e.includes("config"))&&(delete n[e],o.push(e));console.info("Removed devDependencies:",o.join(", ")||"none")}function et(e){const t=["check","deploy","format","lint","start","test"],n=["pinst ","husky "],r=e.scripts??{},o=[];for(const[e,s]of Object.entries(r))(t.some(t=>e.startsWith(t))||n.some(e=>s.includes(e)||s.trim()===e.trim()))&&(delete r[e],o.push(e));console.info("Removed scripts:",o.join(", ")||"none")}function tt(e){delete e.private,delete e.publishConfig,delete e.prettier}const nt="file:",rt=[{schemaPath:t.join("prisma","schema.prisma"),dbPath:"prisma"},{schemaPath:t.join("prisma","schema"),dbPath:t.join("prisma","schema")},{schemaPath:t.join("db","schema.prisma"),dbPath:"db"}];function ot(e){return e.packageJson.dependencies?.blitz?"db/mount":"prisma/mount"}function st(n){return rt.find(({schemaPath:r})=>e.existsSync(t.resolve(n.dirPath,r)))?.dbPath}const it=new class{cleanUpLitestream(e){const t=ot(e);var n;return`${`if [ -f "${n=`${t}/prod.sqlite3`}" ]; then printf 'PRAGMA wal_checkpoint(TRUNCATE);' | PRISMA db execute --stdin --url "${nt}${n}"; fi && rm -f "${n}".* "${n}"-*`}; rm -Rf ${t}/.prod.sqlite3* || true`}deploy(e,t=""){return`PRISMA migrate deploy ${t}`}deployForce(e){const t=ot(e),n=`rm -Rf "${`${t}/prod.sqlite3`}"*`;return`${n}; PRISMA migrate reset --force --skip-seed && ${n}\n && litestream restore -config litestream.yml -o ${t}/prod.sqlite3 ${t}/prod.sqlite3 && ls -ahl ${t}/prod.sqlite3 && ALLOW_TO_SKIP_SEED=0 PRISMA migrate deploy`}listBackups(e){return`litestream ltx -config litestream.yml ${ot(e)}/prod.sqlite3`}migrate(e,t=""){return`PRISMA migrate deploy ${t} && PRISMA generate && ${this.seed(e)}`}migrateDev(e,t=""){return`PRISMA migrate dev ${t}`}reset(e,n=""){const r=[],o=function(e){const n=e.env.DATABASE_URL;if(!n?.startsWith(nt))return;const r=n.slice(5).replace(/[?#].*$/,"");if(!r)return;const o=st(e),s=t.isAbsolute(r)?r:t.resolve(e.dirPath,o??".",r);return`rm -f "${s}" "${s}-wal" "${s}-shm"`}(e);o&&r.push(o);const s=["PRISMA migrate reset --force",n].filter(Boolean).join(" ");return r.push(s),e.packageJson.dependencies?.blitz&&r.push(this.seed(e)),r.filter(Boolean).join(" && ")}restore(e,t){return`rm -Rf ${t}*; litestream restore -config litestream.yml -o ${t} ${ot(e)}/prod.sqlite3`}seed(e,t){return e.packageJson.dependencies?.blitz?"YARN blitz db seed"+(t?` -f ${t}`:""):t?`BUN build-ts run ${t}`:e.packageJson.prisma?.seed?"YARN prisma db seed":'if [ -e "prisma/seeds.ts" ]; then BUN build-ts run prisma/seeds.ts; fi'}studio(e,n,r=""){let o="";if(n)try{new URL(n),o=`DATABASE_URL=${n} `}catch{const e=t.resolve(n);o=`DATABASE_URL=${nt}${e} `}else if(e.env.DATABASE_URL?.startsWith(nt)){const n=st(e);if(n){const r=t.resolve(e.dirPath,n,e.env.DATABASE_URL.slice(5));o=`DATABASE_URL=${nt}${r} `}}return`${o}PRISMA studio ${r}`}},at={},ct={command:"prisma",describe:"Run prisma commands. Use '--' to stop wb option parsing and forward the remaining arguments to Prisma. Example: wb prisma migrate-dev -- --name init",builder:e=>e.parserConfiguration({"populate--":!0}).command(lt).command(dt).command(ut).command(pt).command(ft).command(ht).command(mt).command(gt).command(yt).command(bt).command(wt).command(vt).demandCommand().strict(!1),handler(){}},lt={command:"cleanup-litestream",describe:"Clean up temporal Litestream files",builder:at,async handler(e){const t=await Et(e);for(const n of Qe("prisma cleanup-litestream",t))await fe(it.cleanUpLitestream(n),n,e)}},dt={command:"create-litestream-config",describe:"Create Litestream configuration file",builder:at,async handler(e){const t=await Et(e);for(const e of Qe("prisma create-litestream-config",t))kt(e)}},ut={command:"deploy",describe:"Apply migration to DB without initializing it",builder:at,async handler(e){const t=await Et(e),n=At(e);for(const r of Qe("prisma deploy",t))await fe(it.deploy(r,n),r,e)}},pt={command:"deploy-force",describe:"Force to apply migration to DB utilizing Litestream's backup without initializing it",builder:at,async handler(e){const t=await Et(e);for(const n of Qe("prisma deploy-force",t))await fe(it.deployForce(n),n,e)}},ft={command:"list-backups",describe:"List Litestream backups",builder:at,async handler(e){const t=await Et(e);for(const n of Qe("prisma list-backups",t))await fe(it.listBackups(n),n,e)}},ht={command:"migrate",describe:"Apply migration to DB with initializing it",builder:at,async handler(e){const t=await Et(e),n=At(e);for(const r of Qe("prisma migrate",t))await fe(it.migrate(r,n),r,e)}},mt={command:"migrate-dev",describe:"Create a migration file",builder:at,async handler(e){const t=await Et(e),n=At(e);for(const r of Qe("prisma migrate-dev",t))await fe(it.migrateDev(r,n),r,e)}},gt={command:"reset",describe:"Reset DB",builder:at,async handler(e){const t=await Et(e),n=At(e);for(const r of Qe("prisma reset",t))await fe(it.reset(r,n),r,e);if("test"!==process.env.WB_ENV){process.env.WB_ENV="test";for(const t of Qe("WB_ENV=test prisma reset",await Et(e)))await fe(it.reset(t,n),t,e)}}},yt={command:"restore",describe:"Restore DB from Litestream's backup",builder:{...at,output:{description:'Output path of the restored database. Defaults to "<db|prisma>/restored.sqlite3".',type:"string"}},async handler(e){const t=await Et(e);for(const n of Qe("prisma restore",t)){const t=e.output??(n.packageJson.dependencies?.blitz?"db/restored.sqlite3":"prisma/restored.sqlite3");await fe(it.restore(n,t),n,e)}}},bt={command:"seed",describe:"Populate DB with seed data",builder:{...at,file:{alias:"f",description:"Path of the seed script.",type:"string"}},async handler(e){const t=await Et(e);for(const n of Qe("prisma seed",t))await fe(it.seed(n,e.file),n,e)}},wt={command:"studio [db-url-or-path]",describe:"Open Prisma Studio",builder:{...at,"db-url-or-path":{description:"URL or path to the database",type:"string"},restored:{description:"Whether to open the default restored database (<db|prisma>/restored.sqlite3).",type:"boolean"}},async handler(e){if(e.restored&&e.dbUrlOrPath)throw new Error("You cannot specify both --restored and --db-url-or-path.");const t=await Et(e),n=At(e,["db-url-or-path","restored"]);for(const r of Qe("prisma studio",t)){const t=e.restored?r.packageJson.dependencies?.blitz?"db/restored.sqlite3":"prisma/restored.sqlite3":e.dbUrlOrPath?.toString();await fe(it.studio(r,t,n),r,e)}}},vt={command:"$0 <args..>",describe:"Pass the command and arguments to prisma as is. Additional Prisma flags can also be forwarded after '--'.",builder:{args:{type:"array"}},async handler(e){const t=await Et(e),n=[(e.args?.join(" ")??"").trimEnd(),At(e,["args"])].filter(Boolean).join(" ");for(const r of Qe(`prisma ${n}`,t))await fe(`PRISMA ${n}`,r,e)}};function kt(t){const n=`${t.packageJson.dependencies?.blitz?"db":"prisma"}/mount/prod.sqlite3`,r={CLOUDFLARE_R2_LITESTREAM_ACCOUNT_ID:t.env.CLOUDFLARE_R2_LITESTREAM_ACCOUNT_ID,CLOUDFLARE_R2_LITESTREAM_BUCKET_NAME:t.env.CLOUDFLARE_R2_LITESTREAM_BUCKET_NAME,CLOUDFLARE_R2_LITESTREAM_ACCESS_KEY_ID:t.env.CLOUDFLARE_R2_LITESTREAM_ACCESS_KEY_ID,CLOUDFLARE_R2_LITESTREAM_SECRET_ACCESS_KEY:t.env.CLOUDFLARE_R2_LITESTREAM_SECRET_ACCESS_KEY},o=Object.entries(r).filter(([,e])=>!e).map(([e])=>e);if(o.length>0)throw new Error(`Missing environment variables for Litestream: ${o.join(", ")}`);const s="staging"===t.env.WB_ENV?"5m":"1h",i=`dbs:\n - path: ${n}\n busy-timeout: 5s\n checkpoint-interval: 1m\n replica:\n type: s3\n endpoint: https://${r.CLOUDFLARE_R2_LITESTREAM_ACCOUNT_ID}.r2.cloudflarestorage.com\n bucket: ${r.CLOUDFLARE_R2_LITESTREAM_BUCKET_NAME}\n access-key-id: ${r.CLOUDFLARE_R2_LITESTREAM_ACCESS_KEY_ID}\n secret-access-key: ${r.CLOUDFLARE_R2_LITESTREAM_SECRET_ACCESS_KEY}\n snapshot-interval: 24h # Create a backup per day\n retention: 72h # Keep backups for 3 days\n retention-check-interval: ${s}\n sync-interval: 1m\n`,a="/etc/litestream.yml";try{e.writeFileSync(a,i),console.info(`Generated ${a}`)}catch(e){const t=e instanceof Error?e.message:String(e);throw new Error(`Failed to write ${a}: ${t}`,{cause:e})}}async function Et(e){const t=await X(e);t||(console.error(l.red("No project found.")),process.exit(1));const n=t.descendants.filter(e=>e.packageJson.dependencies?.prisma??e.packageJson.devDependencies?.prisma);return 0===n.length&&(console.error(l.red("No prisma project found.")),process.exit(1)),n}function At(e,t=[]){const n=[],r=Object.keys(ve),o=Object.values(ve).flatMap(e=>"alias"in e?Array.isArray(e.alias)?e.alias:[e.alias]:[]).map(String),s=new Set([...t,...r,...o,"--","_","$0"]);for(const[t,r]of Object.entries(e))if(!s.has(t)){const o=t.replaceAll(/[A-Z]/g,e=>`-${e.toLowerCase()}`);if(o!==t&&void 0!==e[o])continue;if("boolean"==typeof r&&r)n.push(`--${t}`);else if("string"==typeof r||"number"==typeof r)n.push(`--${t}`,String(r));else if(Array.isArray(r))for(const e of r)n.push(`--${t}`,String(e))}const i=Array.isArray(e["--"])?e["--"].map(String):[];return Re([...n,...i])}const Pt={command:"retry [command] [args...]",describe:"Retry the given command until it succeeds",builder:{retry:{description:"A maximum retry count",type:"number",alias:"r",default:3}},async handler(e){const t=Q(e);t||(console.error(l.red("No project found.")),process.exit(1));const n=[e.command,...e.args??[],...e._.slice(1)].filter(Boolean);let r=0;for(let o=0;o<e.retry;o++)if(o>0&&console.info(`\n${l.yellow(`#${o} Retrying: ${n.join(" ")}`)}`),r=await fe(n.join(" "),t,e,{exitIfFailed:!1,onSignal:e=>{e&&process.exit(1)}}),0===r)return;process.exit(r)}},St={command:"setup",describe:"Setup development environment. .env files are ignored.",builder:{},async handler(e){await async function(e,t){const n=await X(e,!1,t);n||(console.error(l.red("No project found.")),process.exit(1));for(const t of Qe("setup",n.descendants)){const r=await y.readdir(t.dirPath,{withFileTypes:!0});if(t===n.root){if("darwin"===f.platform()){const n=["pstree"];await he(`brew install ${n.join(" ")}`,t,e)}r.some(e=>e.isFile()&&e.name.includes("-version"))&&await fe("asdf install",t,e,{exitIfFailed:!1})}if(r.some(e=>e.isFile()&&"pyproject.toml"===e.name)){await he("poetry config virtualenvs.in-project true",t,e);const[,n]=o.execSync("asdf current python").toString().trim().split(/\s+/);await he(`poetry env use ${n}`,t,e),await ue.promiseAll(),await fe("poetry run pip install --upgrade pip",t,e),await fe("poetry install --ansi",t,e)}t!==n.root&&n.root.packageJson.scripts?.["gen-code"]||!t.packageJson.scripts?.["gen-code"]||await fe(`${oe} gen-code`,t,e)}const r=n.descendants.find(e=>e.packageJson.devDependencies?.playwright);r&&await fe(`${oe} playwright install --with-deps`,r,e)}(e)}};function xt(e){return e.silent?" > /dev/null":""}const $t=new Set;async function Rt(e,t){const n=await async function(e){for(const t of["127.0.0.1","::"]){if(!await Dt(t,e))return!1}return!0}(e);n||await jt(e,t);const r=async()=>{$t.has(e)||($t.add(e),await jt(e,t))};for(const e of["beforeExit","SIGINT","SIGTERM","SIGQUIT"])process.on(e,r)}async function jt(e,t){await async function(e,t){await async function(e,t){try{const n=await async function(e,t){const{stdout:n}=await R("docker",["ps","-q",...e],{cwd:t.dirPath,env:t.env});return n.split(/\s+/).map(e=>e.trim()).filter(Boolean)}(e,t);if(0===n.length)return;await R("docker",["rm","-f",...n],{cwd:t.dirPath,env:t.env})}catch{}}(["--filter",`publish=${e}`],t)}(e,t);try{await g(e)}catch{}}async function Nt(e,t){const n=Number(e);if(!n)throw new Error(`The given port (${n}) is invalid.`);return await Rt(n,t),n}async function Dt(e,t){return new Promise(n=>{const r=b();r.once("error",e=>{"EADDRINUSE"!==e.code?"EAFNOSUPPORT"!==e.code?n(!1):n(!0):n(!1)}),r.once("listening",()=>{r.close(()=>{n(!0)})}),r.listen(t,e)})}const Tt=new class{buildImage(e,n){const r=e.dockerPackageJson.scripts?.["docker/build/prepare"]?"YARN run docker/build/prepare && ":"";return`cd ${t.dirname(e.findFile("Dockerfile"))}\n && ${r}YARN wb optimizeForDockerBuild --outside\n && YARN wb retry -- docker build -t ${e.dockerImageName}\n --build-arg ARCH=$([ $(uname -m) = 'arm64' ] && echo arm64 || echo x86_64)\n --build-arg WB_ENV=${e.env.WB_ENV}\n --build-arg WB_VERSION=${n} .`}stopAndStart(e,t="",n=""){return`${this.stop(e)} && ${this.start(e,t,n)}`}start(e,t="",n=""){!function(e,t){const n=()=>{if($t.has(e))return;$t.add(e),ge(e,t);const{status:n}=a(e,{cwd:t.dirPath,shell:!0,stdio:"inherit"});ye(e,n,{})};for(const e of["beforeExit","SIGINT","SIGTERM","SIGQUIT"])process.on(e,n)}(this.stop(e),e);return`docker run --rm ${n.includes("/bin/bash")?"-it ":""}--publish ${e.env.PORT}:8080 --name ${e.dockerImageName} ${t} ${e.dockerImageName} ${n}`}stop(e){return`true $(docker rm -f $(docker container ls -q -f name=${e.dockerImageName}) 2> /dev/null)`}stopAll(){return"true $(docker rm -f $(docker ps -q) 2> /dev/null)"}};class Ot{constructor(e){this.shouldWaitAndOpenApp=e}buildDocker(e,t){return Tt.buildImage(e,t)}async startDev(e,t){return await Nt(e.env.PORT,e),this.shouldWaitAndOpenApp?Re(["YARN","wb","concurrently",...ke(t),"--kill-others-on-fail",this.startDevProtected(e,t),this.waitAndOpenApp(e)]):this.startDevProtected(e,t)}async startProduction(e,t){return await Nt(e.env.PORT,e),this.shouldWaitAndOpenApp?Re(["YARN","wb","concurrently",...ke(t),"--kill-others-on-fail",this.startProductionProtected(e,t),this.waitAndOpenApp(e)]):this.startProductionProtected(e,t)}async startTest(e,t){return await Nt(e.env.PORT,e),this.startProductionProtected(e,t)}async startDocker(e,t){return await Nt(e.env.PORT,e),this.shouldWaitAndOpenApp?`${this.buildDocker(e,"development")}\n && ${Re(["YARN","wb","concurrently",...ke(t),"--kill-others-on-fail",Tt.stopAndStart(e,t.normalizedDockerOptionsText??"",t.normalizedArgsText??""),this.waitAndOpenApp(e)])}`:`${this.buildDocker(e,"development")}\n && ${Tt.stopAndStart(e,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}`}startProductionProtected(e,t){const n=function(e){try{return e.findFile("ecosystem.config.cjs")}catch{return}}(e),r=void 0===n?[("YARN wb buildIfNeeded "+(t.verbose?"--verbose":"")).trim(),`node dist/index.js ${t.normalizedArgsText??""}`.trim()]:[e.buildCommand,`pm2-runtime start --no-autorestart ${n}`];return[...e.hasPrisma?it.migrate(e).split("&&"):[],...r].filter(Boolean).map(e=>`${e} ${xt(t)}`.trim()).join(" && ")}testE2EDev(e,t,n){return this.testE2EProtected(e,t,this.startDevProtected(e,t),n)}testE2EProduction(e,t,n){return this.testE2EProtected(e,t,this.startProductionProtected(e,t),n)}testE2EDocker(e,t,n){return this.testE2EProtected(e,t,Tt.stopAndStart(e),n)}async testStart(e,t){return await Nt(e.env.PORT,e),`${n="NODE_ENV",r="",`${n}=${je(r)}`} ${Re(["YARN","wb","concurrently",...ke(t),"--kill-others","--success","first",this.startDevProtected(e,t),this.waitApp(e)])}`;var n,r}async testE2EProtected(e,t,n,{forwardedPlaywrightArgs:r=[],playwrightArgs:o=["test","test/e2e/"]}){const s=await Nt(e.env.PORT,e),i=e.packageJson.scripts?.["test/e2e-additional"]?" && YARN test/e2e-additional":"",a=function(e,t,n,r=[]){const o=["BUN","playwright"],s=t?.map(String);if("test"!==e[0]||!s?.length)return It([...o,...e,...r],n);const i=e.slice(1),a=_t(i),c=0===a.length?i:i.filter((e,t)=>!a.includes(t));return It([...o,"test",...s,...c,...r],n)}(o,t.targets,t.bail,r);return e.skipLaunchingServerForPlaywright?`${a}${i}`:Re(["YARN","wb","concurrently",...ke(t),"--kill-others","--success","first",`${n} && exit 1`,`wait-on -t 600000 -i 2000 http-get://127.0.0.1:${s}\n && ${a}${i}`])}testUnit(e,t){const n=t.targets?.map(String);return e.hasVitest?Re(["YARN","vitest","run",...n?.length?n:["test/unit/"],"--color","--passWithNoTests","--allowOnly","--watch=false",...t.bail?["--bail=1"]:[]]):e.isBunAvailable?Re(["bun","test",...n?.length?n:["test/unit/"],...t.bail?["--bail"]:[]]):'echo "No tests."'}waitApp(e){const t=e.env.PORT;return`wait-on -t 10000 http-get://127.0.0.1:${t} 2> /dev/null\n || wait-on -t 10000 -i 500 http-get://127.0.0.1:${t} 2> /dev/null\n || wait-on -t 10000 -i 1000 http-get://127.0.0.1:${t} 2> /dev/null\n || wait-on -t 10000 -i 2000 http-get://127.0.0.1:${t} 2> /dev/null\n || wait-on -t 20000 -i 4000 http-get://127.0.0.1:${t} 2> /dev/null\n || wait-on -t 60000 -i 5000 http-get://127.0.0.1:${t} 2> /dev/null\n || wait-on -t 90000 -i 10000 http-get://127.0.0.1:${t}`}waitAndOpenApp(e){const t=e.env.PORT;return`${this.waitApp(e)} || wait-on http-get://127.0.0.1:${t} && open-cli http://\${HOST:-localhost}:${t}`}}function It(e,t){const n=e.indexOf("playwright"),r=-1!==n&&"test"===e[n+1];return t&&r?e.some(e=>"--max-failures"===e||e.startsWith("--max-failures="))?Re(e):Re([...e,"--max-failures=1"]):Re(e)}function _t(e){let t;const n=[];for(const[r,o]of e.entries()){if(t){if("required"===t||!o.startsWith("-")){t=void 0;continue}t=void 0}if("--"===o)return[...n,...e.slice(r+1).map((e,t)=>r+1+t)];if(o.startsWith("--")){if(o.includes("="))continue;Ct.has(o)?t="required":Lt.has(o)&&(t="optional")}else{if(o.startsWith("-")&&"-"!==o){const e=o.slice(0,2);2===o.length&&Bt.has(e)&&(t="required");continue}n.push(r)}}return n}const Ct=new Set(["--browser","--config","--grep","--grep-invert","--global-timeout","--max-failures","--output","--project","--repeat-each","--reporter","--retries","--shard","--test-list","--test-list-invert","--timeout","--trace","--tsconfig","--ui-host","--ui-port","--ui-title","--workers"]),Lt=new Set(["--only-changed","--update-snapshots","--update-source-method"]),Bt=new Set(["-c","-g","-j"]);const Ft=new class extends Ot{constructor(){super(!0)}startDevProtected(e,t){return`blitz dev ${t.normalizedArgsText??""}`}};const Jt=new class extends Ot{constructor(){super(!1)}startDevProtected(e,t){return`YARN build-ts run ${t.watch?"--watch":""} src/index.ts -- ${t.normalizedArgsText??""}`}async testE2EProtected(e,t,n,r={}){if(e.hasPlaywrightConfig)return super.testE2EProtected(e,t,n,r);const o=await Nt(e.env.PORT,e),s=e.packageJson.scripts?.["test/e2e-additional"]?" && YARN test/e2e-additional":"",i=t.targets?.map(String);return Re(["YARN","wb","concurrently",...ke(t),"--kill-others","--success","first",`${n} && exit 1`,`wait-on -t 600000 -i 2000 http-get://127.0.0.1:${o}\n && ${Re(["vitest","run",...i&&i.length>0?i:["test/e2e/"],"--color","--passWithNoTests","--allowOnly",...t.bail?["--bail=1"]:[]])}${s}`])}};const Ut=new class extends Ot{constructor(){super(!0)}startDevProtected(e,t){return`next dev --turbopack ${t.normalizedArgsText??""}`}};const Wt=new class extends Ot{constructor(){super(!1)}startDevProtected(e,t){throw new Error("This method should not be called.")}startDev(e,t){return Promise.resolve(`YARN build-ts run ${t.watch?"--watch":""} src/index.ts -- ${t.normalizedArgsText??""}`)}startProduction(e,t){return Promise.resolve(`${e.buildCommand} && ${ne} dist/index.js ${t.normalizedArgsText??""} | tee server.log`)}startTest(){return Promise.resolve("echo 'do nothing.'")}startDocker(e,t){return Promise.resolve(`${this.buildDocker(e,"development")} && ${Tt.stopAndStart(e,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}`)}testE2EDev(){return Promise.resolve("echo 'do nothing.'")}testE2EProduction(){return Promise.resolve("echo 'do nothing.'")}testE2EDocker(){return Promise.resolve("echo 'do nothing.'")}testStart(){return Promise.resolve("echo 'do nothing.'")}};const Mt=new class extends Ot{constructor(){super(!0)}startDevProtected(e,t){return`remix dev ${t.normalizedArgsText??""}`}};const zt=new class extends Ot{constructor(){super(!0)}startDevProtected(e,t){return`YARN vite dev ${t.normalizedArgsText??""}`.trim()}startProductionProtected(e,t){return`${e.buildCommand} && YARN vite preview ${t.normalizedArgsText??""}`.trim()}},Yt=["express","fastify","elysia","hono"],qt={watch:{description:"Whether to watch files",type:"boolean"},args:{description:"Arguments for core command",type:"array",alias:"a",default:[]},"docker-options":{description:'Arguments for "docker run"',type:"array",default:[]},mode:{description:"Start mode: dev[elopment] (default) | staging | docker | docker-debug | test",type:"string",alias:"m"}},Vt={command:"start [args..]",describe:"Start app. Use '--' to stop wb option parsing and forward the remaining arguments to the underlying app command. Example: wb start -- --host 0.0.0.0",builder:e=>e.parserConfiguration({"populate--":!0}).options(qt),async handler(e){!function(e){e.normalizedArgsText=[...e.args??[],...e._?.slice(1)??[],...e["--"]??[]].map(e=>je(String(e))).join(" "),e.normalizedDockerOptionsText=(e.dockerOptions??[]).map(e=>je(String(e))).join(" ")}(e);const t=await X(e);t||(console.error(l.red("No project found.")),process.exit(1));for(const n of t.descendants){const t=n.packageJson.dependencies??{},r=n.packageJson.devDependencies??{};let o;if(t.blitz)o=Ft;else if(t.next)o=Ut;else if(r["@remix-run/dev"])o=Mt;else if(r.vite)o=zt;else if(Yt.some(e=>t[e])&&!t["firebase-functions"]||n.hasDockerfile&&/EXPOSE\s+8080/.test(n.dockerfile))o=Jt;else{if(!t["build-ts"]&&!r["build-ts"])continue;o=Wt}switch(console.info(`Running "start" for ${n.name} ...`),e.mode??"dev"){case"dev":case"development":process.env.WB_ENV||="development",await fe(await o.startDev(n,e),n,e);break;case"staging":process.env.WB_ENV||="staging",await fe(await o.startProduction(n,e),n,e);break;case"docker":process.env.WB_ENV||="staging",await fe(await o.startDocker(n,e),n,e);break;case"docker-debug":process.env.WB_ENV||="staging",e.normalizedArgsText="'/bin/bash'",await fe(await o.startDocker(n,e),n,e);break;case"test":{process.env.WB_ENV||="test";const t=await o.startTest(n,e);await fe(t,n,e);break}default:throw new Error(`Unknown start mode: ${e.mode}`)}}}},Gt={e2e:{description:"E2e test mode: headless (default) | headless-dev | headed | headed-dev | docker | docker-debug | debug | generate | trace",type:"string",choices:["headless","headless-dev","headed","headed-dev","docker","docker-debug","debug","generate","trace"],default:"headless"},silent:{description:"Reduce redundant outputs",type:"boolean"},bail:{description:"Stop tests after the first failure",type:"boolean"},"unit-timeout":{description:"Timeout for unit tests",type:"number"}},Kt={targets:{description:"Test target paths",type:"array"}},Ht={command:"test [targets...]",describe:"Test project. If you pass no arguments, it will run all tests. Use '--' to stop wb option parsing and forward the remaining flags to Playwright. Example: wb test -- --grep 'uploaded image asset'",builder:e=>e.parserConfiguration({"populate--":!0}).options({...Gt,...Kt}),async handler(e){await Qt(e)}};async function Qt(n){const r=await X(n);r||(console.error(l.red("No project found.")),process.exit(1)),process.env.FORCE_COLOR||="3",process.env.WB_ENV||="test";const o=n.targets??[],s=n["--"]??[],{shouldRunE2e:i,shouldRunUnit:a}=function(e,t=[]){const n=e.some(e=>e.includes("/e2e")),r=e.some(e=>e.includes("/unit")),o=0===e.length&&0===t.length;return{shouldRunUnit:o||r,shouldRunE2e:o||n||t.length>0}}(o,s);for(const c of r.descendants){const r=c.packageJson.dependencies??{},l=c.packageJson.devDependencies??{};let d;if(d=r.blitz?Ft:r.next?Ut:l["@remix-run/dev"]?Mt:l.vite?zt:Yt.some(e=>r[e])&&!r["firebase-functions"]?Jt:Wt,console.info(`Running "test" for ${c.name} ...`),a&&e.existsSync(t.join(c.dirPath,"test","unit"))){const e=o.filter(e=>e.includes("/unit")),t={...n,targets:e.length>0?e:void 0};await fe(d.testUnit(c,t),c,n,{timeout:n.unitTimeout})}if(!i||!e.existsSync(t.join(c.dirPath,"test","e2e")))continue;const u=o.filter(e=>e.includes("/e2e")),p={...n,targets:u.length>0?u:void 0};switch(n.e2e){case"headless":await fe(await d.testE2EProduction(c,p,{playwrightArgs:Zt(u,s),forwardedPlaywrightArgs:s}),c,n);continue;case"headless-dev":await fe(await d.testE2EDev(c,p,{playwrightArgs:Zt(u,s),forwardedPlaywrightArgs:s}),c,n);continue;case"docker":await Xt(c,p,d,Zt(u,s),s);continue;case"docker-debug":await Xt(c,p,d,Zt(u,s,["--debug"]),s);continue}if(r.blitz||r.next||l["@remix-run/dev"]||l.vite)switch(n.e2e){case"headed":await fe(await d.testE2EProduction(c,p,{playwrightArgs:Zt(u,s,["--headed"]),forwardedPlaywrightArgs:s}),c,n);break;case"headed-dev":await fe(await d.testE2EDev(c,p,{playwrightArgs:Zt(u,s,["--headed"]),forwardedPlaywrightArgs:s}),c,n);break;case"debug":await fe(await d.testE2EProduction(c,p,{playwrightArgs:Zt(u,s,["--debug"]),forwardedPlaywrightArgs:s}),c,n);break;case"generate":await fe(await d.testE2EProduction(c,p,{playwrightArgs:["codegen",`http://localhost:${c.env.PORT}`]}),c,n);break;case"trace":await fe("BUN playwright show-trace",c,n)}}}async function Xt(e,t,n,r,o){e.env.WB_DOCKER||="1",await fe(`${n.buildDocker(e,"test")}${xt(t)}`,e,t),process.exitCode=await fe(await n.testE2EDocker(e,t,{playwrightArgs:r,forwardedPlaywrightArgs:o}),e,t,{exitIfFailed:!1}),await fe(Tt.stop(e),e,t)}function Zt(e,t=[],n=[]){const r=_t(t).length>0;return["test",...e.length>0||r?[]:["test/e2e/"],...n]}const en={command:"test-on-ci",describe:"Test project on CI with no options.",builder:{silent:{description:"Reduce redundant outputs",type:"boolean"}},async handler(n){await async function(n){const r=await X(n);r||(console.error(l.red("No project found.")),process.exit(1));process.env.CI||="1",process.env.FORCE_COLOR||="3",process.env.WB_ENV||="test";for(const o of r.descendants){const r=o.packageJson.dependencies??{},s=o.packageJson.devDependencies??{};let i;if(i=r.blitz?Ft:r.next?Ut:s["@remix-run/dev"]?Mt:s.vite?zt:Yt.some(e=>r[e])&&!r["firebase-functions"]?Jt:Wt,console.info(`Running "test-on-ci" for ${o.name} ...`),await he(Tt.stopAll(),o,n),e.existsSync(t.join(o.dirPath,"test","unit"))&&await he(i.testUnit(o,n).replaceAll(" --allowOnly",""),o,n),e.existsSync(t.join(o.dirPath,"test","e2e"))){await he(await i.testStart(o,n),o,n),await ue.promiseAll(),o.hasDockerfile&&(o.env.WB_DOCKER||="1",await fe(`${i.buildDocker(o,"test")}${xt(n)}`,o,n));const e=o.hasDockerfile?await i.testE2EDocker(o,n,{}):await i.testE2EProduction(o,n,{});process.exitCode=await fe(e.replaceAll(" --allowOnly",""),o,n,{exitIfFailed:!1}),await fe(Tt.stop(o),o,n)}}}(n)}};const tn={command:"tree-kill <pid> [signal]",describe:"Kill the given process and all descendants",builder:e=>e.positional("pid",{description:"The process ID to kill.",type:"number",demandOption:!0}).option("signal",{description:"Signal to send to the process tree.",type:"string",default:"SIGTERM"}),handler(e){try{const t=e.signal;if(!(t in h.signals))throw new Error(`Invalid signal: ${t}`);A(e.pid,t)}catch(e){console.error(e instanceof Error?e.message:String(e)),process.exit(1)}}},nn={command:"typecheck",describe:"Run type checking. .env files are ignored.",builder:{},async handler(e){process.exit(await rn(e))}};async function rn(n){const r=await X(n,!1);if(!r)return console.error(l.red("No project found.")),1;let o=!1;const s=r.descendants.map(async s=>{const i=[];for(s.packageJson.workspaces?s.hasSourceCode&&(s.packageJson.dependencies?.typescript||s.packageJson.devDependencies?.typescript)&&i.push("BUN tsc --noEmit"):((s.packageJson.dependencies?.typescript||s.packageJson.devDependencies?.typescript)&&i.push("BUN tsc --noEmit"),s.packageJson.devDependencies?.pyright&&i.push("YARN pyright"));i.length>0;){const a=await he(i.join(" && "),s,n,{ci:r.descendants.length>1,exitIfFailed:!1,forceColor:!0}),c=t.join(s.dirPath,".next");if(!a||!e.existsSync(c))return a;e.rmSync(c,{force:!0,recursive:!0}),console.info(l.yellow("Removed `.next` directory. We will re-try type checking.")),o=!0}}),i=await Promise.all(s);let a=0;for(const[e,t]of i.entries())if(t){(r.descendants[e]?.packageJson.dependencies??{}).blitz&&console.info(l.yellow('Please try "yarn gen-code" if you face unknown type errors.')),a=t}return a||console.info(l.green(o?"-----\nNo type errors found. Please ignore the previous type errors, as they were caused by outdated Next.js cache files.":"No type errors found.")),a}const on={...nn,command:"tc"},sn={},an={command:"verify-code",describe:"Verify project code",builder:sn,async handler(e){const t=Z(e,!1);t||(console.error(l.red("No project found.")),process.exit(1)),await ln(t.self,e)}},cn={command:"verify-code-with-tests",describe:"Verify project code and run tests",builder:sn,async handler(e){const t=Z(e,!1);t||(console.error(l.red("No project found.")),process.exit(1)),await ln(t.self,e),await async function(e,t){if(e.packageJson.scripts?.test?.includes("wb test"))return console.info("\n"+l.cyan(l.bold("Start:"),"test")),await Qt({...t,_:["test"],e2e:"headless"}),void console.info(l.green(l.bold("Finished:"),"test"));await un("test",`${re} test`,e,t)}(t.self,e)}};async function ln(e,t){await un("install",`${re} install`,e,t,{silent:!0}),e.packageJson.scripts?.["gen-code"]&&await un("gen-code",`${re} gen-code`,e,t,{silent:!0}),await dn("format",()=>Je({...t,_:["lint"],format:!0}),{allowFailure:!0}),await dn("typecheck",()=>rn(t)),await dn("lint-fix",()=>Je({...t,_:["lint"],fix:!0,quiet:!0}))}async function dn(e,t,n={}){console.info("\n"+l.cyan(l.bold("Start:"),e));const r=await t()??0;return 0===r||n.allowFailure?console.info(l.green(l.bold("Finished:"),e)):(console.info(l.red(l.bold(`Failed (exit code ${r}):`),e)),process.exit(r)),r}async function un(e,t,n,r,o={}){if(console.info("\n"+l.cyan(l.bold("Start:"),e)+l.gray(` at ${n.dirPath}`)),r.verbose&&console.info(l.gray(l.bold("Start (raw):"),t)),r.dryRun)return console.info(l.green(l.bold("Finished:"),e)),0;const s=await R(t,void 0,{cwd:n.dirPath,env:be(n.env,{forceColor:!0}),shell:!0,stdio:o.silent?["ignore","ignore","inherit"]:"inherit",killOnExit:!0,verbose:r.verbose});return 0===s.status||o.allowFailure?console.info(l.green(l.bold("Finished:"),e)):(console.info(l.red(l.bold(`Failed (exit code ${s.status}):`),e)),process.exit(s.status??1)),s.status??1}await n(r(process.argv)).scriptName("wb").options(ve).middleware(e=>{const n=e["working-dir"];if(n){const e=t.resolve(n);process.chdir(e)}!function(e){e.PATH&&e.BERRY_BIN_FOLDER&&(e.PATH=e.PATH.replace(`${e.BERRY_BIN_FOLDER}:`,"").replaceAll(/\/private\/var\/folders\/[^:]+:/g,"").replaceAll(/\/var\/tmp\/[^:]+:/g,"").replaceAll(/\/tmp\/[^:]+:/g,""));for(const t of Object.keys(e)){const n=t.toUpperCase();(n.startsWith("NPM_")||n.startsWith("YARN_")||n.startsWith("BERRY_")||"PROJECT_CWD"===n||"INIT_CWD"===n)&&delete e[t]}}(process.env)}).command(cn).command(an).command(se).command(Ae).command($e).command(Fe).command(Xe).command(ct).command(Pt).command(St).command(Vt).command(Ht).command(en).command(tn).command(nn).command(on).demandCommand().strict().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}()).help().argv;let pn=!1;for(const e of["SIGINT","SIGTERM","SIGQUIT"])process.on(e,()=>{if(!pn){pn=!0;try{A(process.pid)}catch(e){console.warn(`Failed to treeKill(${process.pid}) during shutdown:`,e)}process.exit()}});
10
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvZW52LnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9lcnJuby50cyIsIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvdHJlZUtpbGwudHMiLCIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL3Byb2Nlc3NUcmVlLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9zcGF3bi50cyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvaGFzaC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3Qvb3Nvbi9jb25zdHJ1Y3RvcnMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvYXQtZGVjb3JhdG9ycy9kaXN0L29zb24vc3RyaW5naWZ5LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2F0LWRlY29yYXRvcnMvZGlzdC9nZXRDYWNoZUtleS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvbWVtb2l6ZU9uZS5qcyIsIi4uL3NyYy91dGlscy9jaS50cyIsIi4uL3NyYy9wcm9qZWN0LnRzIiwiLi4vc3JjL3V0aWxzL3J1bnRpbWUudHMiLCIuLi9zcmMvY29tbWFuZHMvYnVpbGRJZk5lZWRlZC50cyIsIi4uLy4uL3NoYXJlZC1saWIvc3JjL2Vycm9yLnRzIiwiLi4vc3JjL3V0aWxzL3Byb21pc2VQb29sLnRzIiwiLi4vc3JjL3NjcmlwdHMvcnVuLnRzIiwiLi4vc3JjL3NoYXJlZE9wdGlvbnNCdWlsZGVyLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2NvbmN1cnJlbnRseS50cyIsIi4uL3NyYy9jb21tYW5kcy9raWxsUG9ydElmTm9uQ2kudHMiLCIuLi9zcmMvdXRpbHMvc2hlbGwudHMiLCIuLi9zcmMvY29tbWFuZHMvbGludC50cyIsIi4uL3NyYy9jb21tYW5kcy9jb21tYW5kVXRpbHMudHMiLCIuLi9zcmMvY29tbWFuZHMvb3B0aW1pemVGb3JEb2NrZXJCdWlsZC50cyIsIi4uL3NyYy9zY3JpcHRzL3ByaXNtYVNjcmlwdHMudHMiLCIuLi9zcmMvY29tbWFuZHMvcHJpc21hLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3JldHJ5LnRzIiwiLi4vc3JjL2NvbW1hbmRzL3NldHVwLnRzIiwiLi4vc3JjL3NjcmlwdHMvYnVpbGRlci50cyIsIi4uL3NyYy91dGlscy9wcm9jZXNzLnRzIiwiLi4vc3JjL3V0aWxzL3BvcnQudHMiLCIuLi9zcmMvc2NyaXB0cy9kb2NrZXJTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL2Jhc2VTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL2JsaXR6U2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9odHRwU2VydmVyU2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9uZXh0U2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9wbGFpbkFwcFNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vcmVtaXhTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL3ZpdGVTY3JpcHRzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2h0dHBTZXJ2ZXJQYWNrYWdlcy50cyIsIi4uL3NyYy9jb21tYW5kcy9zdGFydC50cyIsIi4uL3NyYy9jb21tYW5kcy90ZXN0LnRzIiwiLi4vc3JjL2NvbW1hbmRzL3Rlc3RPbkNpLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3RyZWVLaWxsLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3R5cGVjaGVjay50cyIsIi4uL3NyYy9jb21tYW5kcy92ZXJpZnlDb2RlLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGNvbmZpZyB9IGZyb20gJ2RvdGVudic7XG5pbXBvcnQgeyBleHBhbmQgfSBmcm9tICdkb3RlbnYtZXhwYW5kJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5leHBvcnQgY29uc3QgeWFyZ3NPcHRpb25zQnVpbGRlckZvckVudiA9IHtcbiAgZW52OiB7XG4gICAgZGVzY3JpcHRpb246ICcuZW52IGZpbGVzIHRvIGJlIGxvYWRlZC4nLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG4gICdjYXNjYWRlLWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdFbnZpcm9ubWVudCB0byBsb2FkIGNhc2NhZGluZyAuZW52IGZpbGVzIChlLmcuLCBgLmVudmAsIGAuZW52LjxlbnZpcm9ubWVudD5gLCBgLmVudi5sb2NhbGAgYW5kIGAuZW52LjxlbnZpcm9ubWVudD4ubG9jYWxgKS4gUHJlZmVycmVkIG92ZXIgYGNhc2NhZGUtbm9kZS1lbnZgIGFuZCBgYXV0by1jYXNjYWRlLWVudmAuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbiAgJ2Nhc2NhZGUtbm9kZS1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246ICdTYW1lIHdpdGggLS1jYXNjYWRlLWVudj08Tk9ERV9FTlYgfHwgXCJkZXZlbG9wbWVudFwiPi4gUHJlZmVycmVkIG92ZXIgYGF1dG8tY2FzY2FkZS1lbnZgLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICAnYXV0by1jYXNjYWRlLWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1NhbWUgd2l0aCAtLWNhc2NhZGUtZW52PTxXQl9FTlYgfHwgTk9ERV9FTlYgfHwgXCJkZXZlbG9wbWVudFwiPi4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICB9LFxuICAnaW5jbHVkZS1yb290LWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0luY2x1ZGUgLmVudiBmaWxlcyBpbiByb290IGRpcmVjdG9yeSBpZiB0aGUgcHJvamVjdCBpcyBpbiBhIG1vbm9yZXBvIGFuZCAtLWVudiBvcHRpb24gaXMgbm90IHVzZWQuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgfSxcbiAgJ2NoZWNrLWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0NoZWNrIHdoZXRoZXIgdGhlIGtleXMgb2YgdGhlIGxvYWRlZCAuZW52IGZpbGVzIGFyZSBzYW1lIHdpdGggdGhlIGdpdmVuIC5lbnYgZmlsZS4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGRlZmF1bHQ6ICcuZW52LmV4YW1wbGUnLFxuICB9LFxuICB2ZXJib3NlOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHNob3cgdmVyYm9zZSBpbmZvcm1hdGlvbicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGFsaWFzOiAndicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBFbnZSZWFkZXJPcHRpb25zID0gUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgeWFyZ3NPcHRpb25zQnVpbGRlckZvckVudj4+PjtcblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHJlYWRzIGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tIGAuZW52YCBmaWxlcy5cbiAqIE5vdGUgaXQgZG9lcyBub3QgYXNzaWduIHRoZW0gaW4gYHByb2Nlc3MuZW52YC5cbiAqIEByZXR1cm4gW2VudlZhcnMsIFtlbnZQYXRocywgZW52VmFyTmFtZXNdW11dXG4gKiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgY3dkOiBzdHJpbmdcbik6IFtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LCBbc3RyaW5nLCBzdHJpbmdbXV1bXV0ge1xuICBsZXQgZW52UGF0aHMgPSAoYXJndi5lbnYgPz8gW10pLm1hcCgoZW52UGF0aCkgPT4gcGF0aC5yZXNvbHZlKGN3ZCwgZW52UGF0aC50b1N0cmluZygpKSk7XG4gIGNvbnN0IGNhc2NhZGUgPVxuICAgIGFyZ3YuY2FzY2FkZUVudiA/P1xuICAgIChhcmd2LmNhc2NhZGVOb2RlRW52XG4gICAgICA/IHByb2Nlc3MuZW52Lk5PREVfRU5WIHx8ICdkZXZlbG9wbWVudCdcbiAgICAgIDogYXJndi5hdXRvQ2FzY2FkZUVudlxuICAgICAgICA/IHByb2Nlc3MuZW52LldCX0VOViB8fCBwcm9jZXNzLmVudi5OT0RFX0VOViB8fCAnZGV2ZWxvcG1lbnQnXG4gICAgICAgIDogdW5kZWZpbmVkKTtcbiAgaWYgKHR5cGVvZiBjYXNjYWRlID09PSAnc3RyaW5nJykge1xuICAgIGlmIChlbnZQYXRocy5sZW5ndGggPT09IDApIHtcbiAgICAgIGVudlBhdGhzLnB1c2gocGF0aC5qb2luKGN3ZCwgJy5lbnYnKSk7XG4gICAgICBpZiAoYXJndi5pbmNsdWRlUm9vdEVudikge1xuICAgICAgICBjb25zdCByb290UGF0aCA9IHBhdGgucmVzb2x2ZShjd2QsICcuLicsICcuLicpO1xuICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocm9vdFBhdGgsICdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICAgICAgICBlbnZQYXRocy5wdXNoKHBhdGguam9pbihyb290UGF0aCwgJy5lbnYnKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZW52UGF0aHMgPSBlbnZQYXRocy5mbGF0TWFwKChlbnZQYXRoKSA9PlxuICAgICAgY2FzY2FkZVxuICAgICAgICA/IFtgJHtlbnZQYXRofS4ke2Nhc2NhZGV9LmxvY2FsYCwgYCR7ZW52UGF0aH0ubG9jYWxgLCBgJHtlbnZQYXRofS4ke2Nhc2NhZGV9YCwgZW52UGF0aF1cbiAgICAgICAgOiBbYCR7ZW52UGF0aH0ubG9jYWxgLCBlbnZQYXRoXVxuICAgICk7XG4gIH1cbiAgZW52UGF0aHMgPSBlbnZQYXRocy5maWx0ZXIoKGVudlBhdGgpID0+IGZzLmV4aXN0c1N5bmMoZW52UGF0aCkpLm1hcCgoZW52UGF0aCkgPT4gcGF0aC5yZWxhdGl2ZShjd2QsIGVudlBhdGgpKTtcbiAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgIGNvbnNvbGUuaW5mbyhgV0JfRU5WOiAke3Byb2Nlc3MuZW52LldCX0VOVn0sIE5PREVfRU5WOiAke3Byb2Nlc3MuZW52Lk5PREVfRU5WfWApO1xuICAgIGNvbnNvbGUuaW5mbygnUmVhZGluZyBlbnYgZmlsZXM6JywgZW52UGF0aHMuam9pbignLCAnKSk7XG4gIH1cblxuICBjb25zdCBlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZXM6IFtzdHJpbmcsIHN0cmluZ1tdXVtdID0gW107XG4gIGNvbnN0IGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgZm9yIChjb25zdCBlbnZQYXRoIG9mIGVudlBhdGhzKSB7XG4gICAgY29uc3Qga2V5czogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhyZWFkRW52RmlsZShwYXRoLmpvaW4oY3dkLCBlbnZQYXRoKSkpKSB7XG4gICAgICBpZiAoIShrZXkgaW4gZW52VmFycykgJiYgIShrZXkgaW4gcHJvY2Vzcy5lbnYpKSB7XG4gICAgICAgIGVudlZhcnNba2V5XSA9IHZhbHVlO1xuICAgICAgICBrZXlzLnB1c2goa2V5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgZW52UGF0aEFuZExvYWRlZEVudlZhck5hbWVzLnB1c2goW2VudlBhdGgsIGtleXNdKTtcbiAgICBpZiAoYXJndi52ZXJib3NlICYmIGtleXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc29sZS5pbmZvKGBSZWFkICR7a2V5cy5sZW5ndGh9IGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tICR7ZW52UGF0aH1gKTtcbiAgICB9XG4gIH1cbiAgaWYgKCFhcmd2LnZlcmJvc2UpIHtcbiAgICBjb25zb2xlLmluZm8oXG4gICAgICBgUmVhZCBlbnYgZmlsZXM6ICR7ZW52UGF0aEFuZExvYWRlZEVudlZhck5hbWVzLm1hcCgoW2VudlBhdGgsIGtleXNdKSA9PiAoa2V5cy5sZW5ndGggPiAwID8gYCR7ZW52UGF0aH0gKCR7a2V5cy5qb2luKCcsICcpfSlgIDogZW52UGF0aCkpLmpvaW4oJywgJykgfHwgJ25vdGhpbmcnfWBcbiAgICApO1xuICB9XG5cbiAgaWYgKGFyZ3YuY2hlY2tFbnYpIHtcbiAgICBjb25zdCBleGFtcGxlS2V5cyA9IE9iamVjdC5rZXlzKHJlYWRFbnZGaWxlKHBhdGguam9pbihjd2QsIGFyZ3YuY2hlY2tFbnYpKSk7XG4gICAgY29uc3QgbWlzc2luZ0tleXMgPSBleGFtcGxlS2V5cy5maWx0ZXIoKGtleSkgPT4gIShrZXkgaW4gZW52VmFycykgJiYgIShrZXkgaW4gcHJvY2Vzcy5lbnYpKTtcbiAgICBpZiAobWlzc2luZ0tleXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBbJHtlbnZQYXRocy5qb2luKCcsICcpfV06IFske21pc3NpbmdLZXlzLmpvaW4oJywgJyl9XWApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gW2V4cGFuZCh7IHBhcnNlZDogZW52VmFycywgcHJvY2Vzc0Vudjoge30gfSkucGFyc2VkID8/IGVudlZhcnMsIGVudlBhdGhBbmRMb2FkZWRFbnZWYXJOYW1lc107XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiByZWFkIGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tIGAuZW52YCBmaWxlcyBhbmQgYXNzaWduIHRoZW0gaW4gYHByb2Nlc3MuZW52YC5cbiAqICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZEFuZEFwcGx5RW52aXJvbm1lbnRWYXJpYWJsZXMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIGN3ZDogc3RyaW5nXG4pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgW2VudlZhcnNdID0gcmVhZEVudmlyb25tZW50VmFyaWFibGVzKGFyZ3YsIGN3ZCk7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGVudlZhcnMpKSB7XG4gICAgaWYgKCEoa2V5IGluIHByb2Nlc3MuZW52KSkge1xuICAgICAgcHJvY2Vzcy5lbnZba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZW52VmFycztcbn1cblxuY29uc3QgY2FjaGVkRW52VmFycyA9IG5ldyBNYXA8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PigpO1xuXG5mdW5jdGlvbiByZWFkRW52RmlsZShmaWxlUGF0aDogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IGNhY2hlZCA9IGNhY2hlZEVudlZhcnMuZ2V0KGZpbGVQYXRoKTtcbiAgaWYgKGNhY2hlZCkgcmV0dXJuIGNhY2hlZDtcblxuICBjb25zdCBwYXJzZWQgPSBjb25maWcoeyBwYXRoOiBwYXRoLnJlc29sdmUoZmlsZVBhdGgpLCBwcm9jZXNzRW52OiB7fSB9KS5wYXJzZWQgPz8ge307XG4gIGNhY2hlZEVudlZhcnMuc2V0KGZpbGVQYXRoLCBwYXJzZWQpO1xuICByZXR1cm4gcGFyc2VkO1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gcmVtb3ZlcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgcmVsYXRlZCB0byBucG0gYW5kIHlhcm4gZnJvbSB0aGUgZ2l2ZW4gZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMoZW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPik6IHZvaWQge1xuICAvLyBSZW1vdmUgbnBtICYgeWFybiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBwcm9jZXNzLmVudlxuICBpZiAoZW52VmFycy5QQVRIICYmIGVudlZhcnMuQkVSUllfQklOX0ZPTERFUikge1xuICAgIGVudlZhcnMuUEFUSCA9IGVudlZhcnMuUEFUSC5yZXBsYWNlKGAke2VudlZhcnMuQkVSUllfQklOX0ZPTERFUn06YCwgJycpXG4gICAgICAvLyBUZW1wb3JhcnkgZGlyZWN0b3J5IGluIG1hY09TXG4gICAgICAucmVwbGFjZUFsbCgvXFwvcHJpdmF0ZVxcL3ZhclxcL2ZvbGRlcnNcXC9bXjpdKzovZywgJycpXG4gICAgICAvLyBUZW1wb3JhcnkgZGlyZWN0b3JpZXMgaW4gTGludXhcbiAgICAgIC5yZXBsYWNlQWxsKC9cXC92YXJcXC90bXBcXC9bXjpdKzovZywgJycpXG4gICAgICAucmVwbGFjZUFsbCgvXFwvdG1wXFwvW146XSs6L2csICcnKTtcbiAgfVxuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhlbnZWYXJzKSkge1xuICAgIGNvbnN0IHVwcGVyS2V5ID0ga2V5LnRvVXBwZXJDYXNlKCk7XG4gICAgaWYgKFxuICAgICAgdXBwZXJLZXkuc3RhcnRzV2l0aCgnTlBNXycpIHx8XG4gICAgICB1cHBlcktleS5zdGFydHNXaXRoKCdZQVJOXycpIHx8XG4gICAgICB1cHBlcktleS5zdGFydHNXaXRoKCdCRVJSWV8nKSB8fFxuICAgICAgdXBwZXJLZXkgPT09ICdQUk9KRUNUX0NXRCcgfHxcbiAgICAgIHVwcGVyS2V5ID09PSAnSU5JVF9DV0QnXG4gICAgKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gICAgICBkZWxldGUgZW52VmFyc1trZXldO1xuICAgIH1cbiAgfVxufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGlzRXJybm9FeGNlcHRpb24oZXJyb3I6IHVua25vd24pOiBlcnJvciBpcyBOb2RlSlMuRXJybm9FeGNlcHRpb24ge1xuICByZXR1cm4gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiAnY29kZScgaW4gZXJyb3I7XG59XG4iLCJpbXBvcnQgeyBleGVjRmlsZVN5bmMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5pbXBvcnQgeyBpc0Vycm5vRXhjZXB0aW9uIH0gZnJvbSAnLi9lcnJuby5qcyc7XG5pbXBvcnQgeyBidWlsZENoaWxkcmVuQnlQYXJlbnRNYXAsIGNvbGxlY3REZXNjZW5kYW50UGlkcyBhcyBjb2xsZWN0RGVzY2VuZGFudFBpZHNGcm9tTWFwIH0gZnJvbSAnLi9wcm9jZXNzVHJlZS5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiB0cmVlS2lsbChwaWQ6IG51bWJlciwgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyA9ICdTSUdURVJNJyk6IHZvaWQge1xuICBpZiAoIU51bWJlci5pc0ludGVnZXIocGlkKSB8fCBwaWQgPD0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwaWQ6ICR7cGlkfWApO1xuICB9XG5cbiAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICBraWxsVHJlZU9uV2luZG93cyhwaWQpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGRlc2NlbmRhbnRzID0gY29sbGVjdERlc2NlbmRhbnRQaWRzKHBpZCk7XG4gIGNvbnN0IHRhcmdldFBpZHMgPSB0b0NoaWxkcmVuRmlyc3RQaWRzKHBpZCwgZGVzY2VuZGFudHMpO1xuICBmb3IgKGNvbnN0IHRhcmdldFBpZCBvZiB0YXJnZXRQaWRzKSB7XG4gICAga2lsbElmTmVlZGVkKHRhcmdldFBpZCwgc2lnbmFsKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBraWxsSWZOZWVkZWQocGlkOiBudW1iZXIsIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMpOiB2b2lkIHtcbiAgdHJ5IHtcbiAgICBwcm9jZXNzLmtpbGwocGlkLCBzaWduYWwpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChpc05vU3VjaFByb2Nlc3NFcnJvcihlcnJvcikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZnVuY3Rpb24ga2lsbFRyZWVPbldpbmRvd3MocGlkOiBudW1iZXIpOiB2b2lkIHtcbiAgdHJ5IHtcbiAgICBydW5Db21tYW5kKCd0YXNra2lsbCcsIFsnL1BJRCcsIFN0cmluZyhwaWQpLCAnL1QnLCAnL0YnXSwge1xuICAgICAgbWF4QnVmZmVyOiAxMDI0ICogMTAyNCxcbiAgICAgIHRpbWVvdXQ6IDIwMDAsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGlzTm9TdWNoUHJvY2Vzc0Vycm9yKGVycm9yKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb2xsZWN0RGVzY2VuZGFudFBpZHMocm9vdFBpZDogbnVtYmVyKTogbnVtYmVyW10ge1xuICBjb25zdCB7IHN0ZG91dCB9ID0gcnVuQ29tbWFuZChcbiAgICAncHMnLFxuICAgIFsnLUFvJywgJ3BpZD0scHBpZD0nXSxcbiAgICAvLyBLZWVwIGNvbW1hbmQgYm91bmRlZCBzbyB3YXRjaC1tb2RlIGtpbGwgbG9vcHMgY2Fubm90IGhhbmcgdGhpcyBwYXRoLlxuICAgIHsgbWF4QnVmZmVyOiAxMDI0ICogMTAyNCwgdGltZW91dDogMjAwMCB9XG4gICk7XG4gIGNvbnN0IGNoaWxkcmVuQnlQYXJlbnQgPSBidWlsZENoaWxkcmVuQnlQYXJlbnRNYXAoc3Rkb3V0KTtcbiAgcmV0dXJuIGNvbGxlY3REZXNjZW5kYW50UGlkc0Zyb21NYXAocm9vdFBpZCwgY2hpbGRyZW5CeVBhcmVudCk7XG59XG5cbmZ1bmN0aW9uIHRvQ2hpbGRyZW5GaXJzdFBpZHMocGlkOiBudW1iZXIsIGRlc2NlbmRhbnRzOiByZWFkb25seSBudW1iZXJbXSk6IG51bWJlcltdIHtcbiAgY29uc3QgdGFyZ2V0UGlkcyA9IGRlc2NlbmRhbnRzLnRvUmV2ZXJzZWQoKTtcbiAgdGFyZ2V0UGlkcy5wdXNoKHBpZCk7XG4gIHJldHVybiB0YXJnZXRQaWRzO1xufVxuXG5mdW5jdGlvbiBydW5Db21tYW5kKFxuICBjb21tYW5kOiBzdHJpbmcsXG4gIGFyZ3M6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBvcHRpb25zPzogeyB0aW1lb3V0OiBudW1iZXI7IG1heEJ1ZmZlcjogbnVtYmVyIH1cbik6IHsgc3Rkb3V0OiBzdHJpbmc7IHN0ZGVycjogc3RyaW5nIH0ge1xuICB0cnkge1xuICAgIGNvbnN0IHN0ZG91dCA9IGV4ZWNGaWxlU3luYyhjb21tYW5kLCBbLi4uYXJnc10sIHtcbiAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgICBtYXhCdWZmZXI6IG9wdGlvbnM/Lm1heEJ1ZmZlcixcbiAgICAgIHRpbWVvdXQ6IG9wdGlvbnM/LnRpbWVvdXQsXG4gICAgICBzdGRpbzogWydpZ25vcmUnLCAncGlwZScsICdwaXBlJ10sXG4gICAgfSk7XG4gICAgcmV0dXJuIHsgc3Rkb3V0LCBzdGRlcnI6ICcnIH07XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3Qgc3RkZXJyID0gZXh0cmFjdFN0ZGVycihlcnJvcik7XG4gICAgdGhyb3cgbmV3IENvbW1hbmRFeGVjdXRpb25FcnJvcihjb21tYW5kLCBhcmdzLCBzdGRlcnIsIHRvRXhpdENvZGUoZXJyb3IpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc05vU3VjaFByb2Nlc3NFcnJvcihlcnJvcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAoaXNFcnJub0V4Y2VwdGlvbihlcnJvcikgJiYgZXJyb3IuY29kZSA9PT0gJ0VTUkNIJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGVycm9yIGluc3RhbmNlb2YgQ29tbWFuZEV4ZWN1dGlvbkVycm9yKSB7XG4gICAgcmV0dXJuIC9ubyBzdWNoIHByb2Nlc3N8bm90IGZvdW5kfG5vdCByZWNvZ25pemVkfHRoZXJlIGlzIG5vIHJ1bm5pbmcgaW5zdGFuY2UvaS50ZXN0KGVycm9yLnN0ZGVycik7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiB0b0V4aXRDb2RlKGVycm9yOiB1bmtub3duKTogbnVtYmVyIHwgc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGlzRXJybm9FeGNlcHRpb24oZXJyb3IpKSB7XG4gICAgcmV0dXJuIGVycm9yLmNvZGU7XG4gIH1cbiAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgIT09IG51bGwgJiYgJ3N0YXR1cycgaW4gZXJyb3IpIHtcbiAgICBjb25zdCBzdGF0dXMgPSAoZXJyb3IgYXMgeyBzdGF0dXM6IHVua25vd24gfSkuc3RhdHVzO1xuICAgIGlmICh0eXBlb2Ygc3RhdHVzID09PSAnbnVtYmVyJykge1xuICAgICAgcmV0dXJuIHN0YXR1cztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdFN0ZGVycihlcnJvcjogdW5rbm93bik6IHN0cmluZyB7XG4gIGlmICh0eXBlb2YgZXJyb3IgIT09ICdvYmplY3QnIHx8IGVycm9yID09PSBudWxsIHx8ICEoJ3N0ZGVycicgaW4gZXJyb3IpKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgY29uc3Qgc3RkZXJyID0gKGVycm9yIGFzIFJlY29yZDwnc3RkZXJyJywgdW5rbm93bj4pLnN0ZGVycjtcbiAgaWYgKHR5cGVvZiBzdGRlcnIgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHN0ZGVycjtcbiAgfVxuICBpZiAoQnVmZmVyLmlzQnVmZmVyKHN0ZGVycikpIHtcbiAgICByZXR1cm4gc3RkZXJyLnRvU3RyaW5nKCd1dGY4Jyk7XG4gIH1cbiAgcmV0dXJuICcnO1xufVxuXG5jbGFzcyBDb21tYW5kRXhlY3V0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHJlYWRvbmx5IHN0ZGVycjogc3RyaW5nO1xuICByZWFkb25seSBjb2RlOiBudW1iZXIgfCBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoY29tbWFuZDogc3RyaW5nLCBhcmdzOiByZWFkb25seSBzdHJpbmdbXSwgc3RkZXJyOiBzdHJpbmcsIGNvZGU6IG51bWJlciB8IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIHN1cGVyKGBDb21tYW5kIGZhaWxlZDogJHtjb21tYW5kfSAke2FyZ3Muam9pbignICcpfWApO1xuICAgIHRoaXMubmFtZSA9ICdDb21tYW5kRXhlY3V0aW9uRXJyb3InO1xuICAgIHRoaXMuc3RkZXJyID0gc3RkZXJyO1xuICAgIHRoaXMuY29kZSA9IGNvZGU7XG4gIH1cbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBidWlsZENoaWxkcmVuQnlQYXJlbnRNYXAocHNPdXRwdXQ6IHN0cmluZyk6IE1hcDxudW1iZXIsIG51bWJlcltdPiB7XG4gIGNvbnN0IGNoaWxkcmVuQnlQYXJlbnQgPSBuZXcgTWFwPG51bWJlciwgbnVtYmVyW10+KCk7XG4gIGZvciAoY29uc3QgbGluZSBvZiBwc091dHB1dC5zcGxpdCgnXFxuJykpIHtcbiAgICBjb25zdCBtYXRjaGVkID0gL15cXHMqKFxcZCspXFxzKyhcXGQrKVxccyokLy5leGVjKGxpbmUpO1xuICAgIGlmICghbWF0Y2hlZCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgY2hpbGRQaWQgPSBOdW1iZXIobWF0Y2hlZFsxXSk7XG4gICAgY29uc3QgcGFyZW50UGlkID0gTnVtYmVyKG1hdGNoZWRbMl0pO1xuICAgIGNvbnN0IGNoaWxkcmVuID0gY2hpbGRyZW5CeVBhcmVudC5nZXQocGFyZW50UGlkKTtcbiAgICBpZiAoY2hpbGRyZW4pIHtcbiAgICAgIGNoaWxkcmVuLnB1c2goY2hpbGRQaWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjaGlsZHJlbkJ5UGFyZW50LnNldChwYXJlbnRQaWQsIFtjaGlsZFBpZF0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY2hpbGRyZW5CeVBhcmVudDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbGxlY3REZXNjZW5kYW50UGlkcyhyb290UGlkOiBudW1iZXIsIGNoaWxkcmVuQnlQYXJlbnQ6IE1hcDxudW1iZXIsIG51bWJlcltdPik6IG51bWJlcltdIHtcbiAgY29uc3QgZGVzY2VuZGFudHM6IG51bWJlcltdID0gW107XG4gIGNvbnN0IHF1ZXVlID0gWy4uLihjaGlsZHJlbkJ5UGFyZW50LmdldChyb290UGlkKSA/PyBbXSldO1xuICBsZXQgaW5kZXggPSAwO1xuICB3aGlsZSAoaW5kZXggPCBxdWV1ZS5sZW5ndGgpIHtcbiAgICBjb25zdCBwaWQgPSBxdWV1ZVtpbmRleF0gYXMgbnVtYmVyO1xuICAgIGluZGV4ICs9IDE7XG4gICAgZGVzY2VuZGFudHMucHVzaChwaWQpO1xuICAgIHF1ZXVlLnB1c2goLi4uKGNoaWxkcmVuQnlQYXJlbnQuZ2V0KHBpZCkgPz8gW10pKTtcbiAgfVxuICByZXR1cm4gZGVzY2VuZGFudHM7XG59XG4iLCJpbXBvcnQgdHlwZSB7XG4gIFNwYXduT3B0aW9ucyxcbiAgU3Bhd25PcHRpb25zV2l0aG91dFN0ZGlvLFxuICBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZSxcbiAgU3Bhd25TeW5jUmV0dXJucyxcbiAgU3RkaW9OdWxsLFxuICBTdGRpb1BpcGUsXG59IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgeyBzcGF3biB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmltcG9ydCB7IHRyZWVLaWxsIH0gZnJvbSAnLi90cmVlS2lsbC5qcyc7XG5cbi8qKlxuICogUmV0dXJuIHR5cGUgZm9yIHNwYXduQXN5bmMgZnVuY3Rpb24sIGJhc2VkIG9uIFNwYXduU3luY1JldHVybnMgYnV0IHdpdGhvdXQgb3V0cHV0IGFuZCBlcnJvciBwcm9wZXJ0aWVzXG4gKi9cbmV4cG9ydCB0eXBlIFNwYXduQXN5bmNSZXR1cm5zID0gT21pdDxTcGF3blN5bmNSZXR1cm5zPHN0cmluZz4sICdvdXRwdXQnIHwgJ2Vycm9yJz47XG5cbi8qKlxuICogT3B0aW9ucyBmb3Igc3Bhd25Bc3luYyBmdW5jdGlvbiwgZXh0ZW5kaW5nIHZhcmlvdXMgTm9kZS5qcyBzcGF3biBvcHRpb25zIHdpdGggYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5XG4gKi9cbmV4cG9ydCB0eXBlIFNwYXduQXN5bmNPcHRpb25zID0gKFxuICB8IFNwYXduT3B0aW9uc1dpdGhvdXRTdGRpb1xuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvUGlwZSwgU3RkaW9QaXBlLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9QaXBlLCBTdGRpb1BpcGUsIFN0ZGlvTnVsbD5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb1BpcGUsIFN0ZGlvTnVsbCwgU3RkaW9QaXBlPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvTnVsbCwgU3RkaW9QaXBlLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9QaXBlLCBTdGRpb051bGwsIFN0ZGlvTnVsbD5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb051bGwsIFN0ZGlvUGlwZSwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvTnVsbCwgU3RkaW9OdWxsLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9OdWxsLCBTdGRpb051bGwsIFN0ZGlvTnVsbD5cbiAgfCBTcGF3bk9wdGlvbnNcbikgJiB7XG4gIC8qKiBJbnB1dCBzdHJpbmcgdG8gd3JpdGUgdG8gdGhlIHNwYXduZWQgcHJvY2VzcydzIHN0ZGluICovXG4gIGlucHV0Pzogc3RyaW5nO1xuICAvKiogSWYgdHJ1ZSwgc3RkZXJyIG91dHB1dCB3aWxsIGJlIG1lcmdlZCBpbnRvIHN0ZG91dCAqL1xuICBtZXJnZU91dEFuZEVycm9yPzogYm9vbGVhbjtcbiAgLyoqIElmIHRydWUsIHRoZSBzcGF3bmVkIHByb2Nlc3Mgd2lsbCBiZSBraWxsZWQgd2hlbiB0aGUgcGFyZW50IHByb2Nlc3MgZXhpdHMgKi9cbiAga2lsbE9uRXhpdD86IGJvb2xlYW47XG4gIC8qKiBJZiB0cnVlLCBlbmFibGVzIHZlcmJvc2UgbG9nZ2luZyBvZiBwcm9jZXNzIG9wZXJhdGlvbnMgKi9cbiAgdmVyYm9zZT86IGJvb2xlYW47XG4gIC8qKiBJZiB0cnVlLCBzdGRvdXQgZGF0YSB3aWxsIGJlIHByaW50ZWQgdG8gY29uc29sZSBhcyBpdCdzIHJlY2VpdmVkICovXG4gIHByaW50aW5nU3Rkb3V0PzogYm9vbGVhbjtcbiAgLyoqIElmIHRydWUsIHN0ZGVyciBkYXRhIHdpbGwgYmUgcHJpbnRlZCB0byBjb25zb2xlIGFzIGl0J3MgcmVjZWl2ZWQgKi9cbiAgcHJpbnRpbmdTdGRlcnI/OiBib29sZWFuO1xufTtcblxuLyoqXG4gKiBTcGF3bnMgYSBjaGlsZCBwcm9jZXNzIGFzeW5jaHJvbm91c2x5IGFuZCByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHByb2Nlc3MgcmVzdWx0c1xuICpcbiAqIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgYSBQcm9taXNlLWJhc2VkIHdyYXBwZXIgYXJvdW5kIE5vZGUuanMncyBzcGF3biBmdW5jdGlvbiB3aXRoIGFkZGl0aW9uYWwgZmVhdHVyZXM6XG4gKiAtIEF1dG9tYXRpYyBlbmNvZGluZyBvZiBzdGRvdXQvc3RkZXJyIGFzIFVURi04XG4gKiAtIE9wdGlvbiB0byBtZXJnZSBzdGRlcnIgaW50byBzdGRvdXRcbiAqIC0gT3B0aW9uIHRvIGF1dG9tYXRpY2FsbHkga2lsbCB0aGUgcHJvY2VzcyBvbiBwYXJlbnQgZXhpdFxuICogLSBPcHRpb24gdG8gcHJvdmlkZSBpbnB1dCB2aWEgc3RkaW5cbiAqIC0gVmVyYm9zZSBsb2dnaW5nIGNhcGFiaWxpdHlcbiAqXG4gKiBAcGFyYW0gY29tbWFuZCAtIFRoZSBjb21tYW5kIHRvIHJ1blxuICogQHBhcmFtIGFyZ3MgLSBMaXN0IG9mIHN0cmluZyBhcmd1bWVudHNcbiAqIEBwYXJhbSBvcHRpb25zIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgc3Bhd25lZCBwcm9jZXNzXG4gKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgcHJvY2VzcyByZXN1bHRzIGluY2x1ZGluZyBwaWQsIHN0ZG91dCwgc3RkZXJyLCBzdGF0dXMsIGFuZCBzaWduYWxcbiAqIEB0aHJvd3MgV2lsbCByZWplY3QgdGhlIHByb21pc2UgaWYgdGhlIHByb2Nlc3MgZmFpbHMgdG8gc3Bhd24gb3IgZW5jb3VudGVycyBhbiBlcnJvclxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBzcGF3bkFzeW5jKCdscycsIFsnLWxhJ10sIHsgdmVyYm9zZTogdHJ1ZSB9KTtcbiAqIGNvbnNvbGUubG9nKHJlc3VsdC5zdGRvdXQpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzcGF3bkFzeW5jKFxuICBjb21tYW5kOiBzdHJpbmcsXG4gIGFyZ3M/OiByZWFkb25seSBzdHJpbmdbXSxcbiAgb3B0aW9ucz86IFNwYXduQXN5bmNPcHRpb25zXG4pOiBQcm9taXNlPFNwYXduQXN5bmNSZXR1cm5zPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHByb2MgPSBzcGF3bihjb21tYW5kLCBhcmdzID8/IFtdLCBvcHRpb25zID8/IHt9KTtcbiAgICAgIC8vIGBzZXRFbmNvZGluZ2AgaXMgdW5kZWZpbmVkIGluIEJ1blxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb25cbiAgICAgIHByb2Muc3Rkb3V0Py5zZXRFbmNvZGluZz8uKCd1dGY4Jyk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvblxuICAgICAgcHJvYy5zdGRlcnI/LnNldEVuY29kaW5nPy4oJ3V0ZjgnKTtcblxuICAgICAgbGV0IHN0ZG91dCA9ICcnO1xuICAgICAgbGV0IHN0ZGVyciA9ICcnO1xuICAgICAgcHJvYy5zdGRvdXQ/Lm9uKCdkYXRhJywgKGRhdGE6IHN0cmluZykgPT4ge1xuICAgICAgICBzdGRvdXQgKz0gZGF0YTtcbiAgICAgICAgaWYgKG9wdGlvbnM/LnByaW50aW5nU3Rkb3V0KSB7XG4gICAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcHJvYy5zdGRlcnI/Lm9uKCdkYXRhJywgKGRhdGE6IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAob3B0aW9ucz8ubWVyZ2VPdXRBbmRFcnJvcikge1xuICAgICAgICAgIHN0ZG91dCArPSBkYXRhO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0ZGVyciArPSBkYXRhO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zPy5wcmludGluZ1N0ZGVycikge1xuICAgICAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKGRhdGEpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgbGV0IHN0b3BwZWQgPSBmYWxzZTtcbiAgICAgIGNvbnN0IHN0b3BQcm9jZXNzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAoc3RvcHBlZCB8fCAhcHJvYy5waWQpIHJldHVybjtcblxuICAgICAgICBzdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKG9wdGlvbnM/LnZlcmJvc2UpIHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oYHRyZWVLaWxsKCR7cHJvYy5waWR9KWApO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdHJlZUtpbGwocHJvYy5waWQpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGlmIChvcHRpb25zPy52ZXJib3NlKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYEZhaWxlZCB0byB0cmVlS2lsbCgke3Byb2MucGlkfSlgLCBlcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgY29uc3QgY2xlYW51cFNpZ25hbHM6IE5vZGVKUy5TaWduYWxzW10gPVxuICAgICAgICBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInID8gWydTSUdJTlQnLCAnU0lHVEVSTSddIDogWydTSUdJTlQnLCAnU0lHVEVSTScsICdTSUdRVUlUJ107XG4gICAgICBjb25zdCBzaWduYWxIYW5kbGVycyA9IG5ldyBNYXA8Tm9kZUpTLlNpZ25hbHMsICgpID0+IHZvaWQ+KCk7XG4gICAgICBjb25zdCByZW1vdmVLaWxsT25FeGl0SGFuZGxlcnMgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ2JlZm9yZUV4aXQnLCBzdG9wUHJvY2Vzcyk7XG4gICAgICAgIGZvciAoY29uc3QgW3NpZ25hbCwgaGFuZGxlcl0gb2Ygc2lnbmFsSGFuZGxlcnMpIHtcbiAgICAgICAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKHNpZ25hbCwgaGFuZGxlcik7XG4gICAgICAgIH1cbiAgICAgICAgc2lnbmFsSGFuZGxlcnMuY2xlYXIoKTtcbiAgICAgIH07XG4gICAgICBpZiAob3B0aW9ucz8ua2lsbE9uRXhpdCkge1xuICAgICAgICBwcm9jZXNzLm9uKCdiZWZvcmVFeGl0Jywgc3RvcFByb2Nlc3MpO1xuICAgICAgICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBjbGVhbnVwU2lnbmFscykge1xuICAgICAgICAgIGNvbnN0IGhhbmRsZVNpZ25hbCA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgICAgIHN0b3BQcm9jZXNzKCk7XG4gICAgICAgICAgICByZW1vdmVLaWxsT25FeGl0SGFuZGxlcnMoKTtcbiAgICAgICAgICAgIGlmIChwcm9jZXNzLmxpc3RlbmVyQ291bnQoc2lnbmFsKSA9PT0gMCkge1xuICAgICAgICAgICAgICBwcm9jZXNzLmtpbGwocHJvY2Vzcy5waWQsIHNpZ25hbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgICBzaWduYWxIYW5kbGVycy5zZXQoc2lnbmFsLCBoYW5kbGVTaWduYWwpO1xuICAgICAgICAgIHByb2Nlc3Mub24oc2lnbmFsLCBoYW5kbGVTaWduYWwpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHByb2Mub24oJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gICAgICAgIHJlbW92ZUtpbGxPbkV4aXRIYW5kbGVycygpO1xuICAgICAgICBwcm9jLnJlbW92ZUFsbExpc3RlbmVycygnY2xvc2UnKTtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH0pO1xuICAgICAgcHJvYy5vbignY2xvc2UnLCAoY29kZTogbnVtYmVyIHwgbnVsbCwgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyB8IG51bGwpID0+IHtcbiAgICAgICAgcmVtb3ZlS2lsbE9uRXhpdEhhbmRsZXJzKCk7XG4gICAgICAgIGlmIChwcm9jLnBpZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignUHJvY2VzcyBoYXMgbm8gcGlkLicpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgIHBpZDogcHJvYy5waWQsXG4gICAgICAgICAgICBzdGRvdXQsXG4gICAgICAgICAgICBzdGRlcnIsXG4gICAgICAgICAgICBzdGF0dXM6IGNvZGUsXG4gICAgICAgICAgICBzaWduYWwsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAob3B0aW9ucz8uaW5wdXQpIHtcbiAgICAgICAgcHJvYy5zdGRpbj8ud3JpdGUob3B0aW9ucy5pbnB1dCk7XG4gICAgICAgIHByb2Muc3RkaW4/LmVuZCgpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1wcm9taXNlLXJlamVjdC1lcnJvcnNcbiAgICAgIHJlamVjdChlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cbiIsIi8qKlxuICogW2pzLXNoYTNde0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9lbW4xNzgvanMtc2hhM31cbiAqXG4gKiBAdmVyc2lvbiAwLjkuM1xuICogQGF1dGhvciBDaGVuLCBZaS1DeXVhbiBbZW1uMTc4QGdtYWlsLmNvbV1cbiAqIEBjb3B5cmlnaHQgQ2hlbiwgWWktQ3l1YW4gMjAxNS0yMDIzXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuY29uc3QgdD1bLi4uXCIwMTIzNDU2Nzg5YWJjZGVmXCJdLHM9WzYsMTUzNiwzOTMyMTYsMTAwNjYzMjk2XSxpPVswLDgsMTYsMjRdLGU9WzEsMCwzMjg5OCwwLDMyOTA2LDIxNDc0ODM2NDgsMjE0NzUxNjQxNiwyMTQ3NDgzNjQ4LDMyOTA3LDAsMjE0NzQ4MzY0OSwwLDIxNDc1MTY1NDUsMjE0NzQ4MzY0OCwzMjc3NywyMTQ3NDgzNjQ4LDEzOCwwLDEzNiwwLDIxNDc1MTY0MjUsMCwyMTQ3NDgzNjU4LDAsMjE0NzUxNjU1NSwwLDEzOSwyMTQ3NDgzNjQ4LDMyOTA1LDIxNDc0ODM2NDgsMzI3NzEsMjE0NzQ4MzY0OCwzMjc3MCwyMTQ3NDgzNjQ4LDEyOCwyMTQ3NDgzNjQ4LDMyNzc4LDAsMjE0NzQ4MzY1OCwyMTQ3NDgzNjQ4LDIxNDc1MTY1NDUsMjE0NzQ4MzY0OCwzMjg5NiwyMTQ3NDgzNjQ4LDIxNDc0ODM2NDksMCwyMTQ3NTE2NDI0LDIxNDc0ODM2NDhdO2Z1bmN0aW9uIG8odCl7cmV0dXJuIG5ldyBoKDUxMixzLDUxMikudXBkYXRlKHQpLmhleCgpfWNvbnN0IG49dD0+e2NvbnN0IHM9W107Zm9yKGNvbnN0W2ksZV1vZiB0LmVudHJpZXMoKSlzW2ldPWU7cmV0dXJuIHN9O2NsYXNzIGh7YmxvY2tzPVtdO3M9W107cmVzZXQ9ITA7ZmluYWxpemVkPSExO2Jsb2NrPTA7c3RhcnQ9MDtsYXN0Qnl0ZUluZGV4PTA7Y29uc3RydWN0b3IodCxzLGkpe3RoaXMucGFkZGluZz1zLHRoaXMub3V0cHV0Qml0cz1pLHRoaXMuYmxvY2tDb3VudD0xNjAwLSh0PDwxKT4+NSx0aGlzLmJ5dGVDb3VudD10aGlzLmJsb2NrQ291bnQ8PDIsdGhpcy5vdXRwdXRCbG9ja3M9aT4+NSx0aGlzLmV4dHJhQnl0ZXM9KDMxJmkpPj4zO2ZvcihsZXQgdD0wO3Q8NTA7Kyt0KXRoaXMuc1t0XT0wfXVwZGF0ZSh0KXtpZih0aGlzLmZpbmFsaXplZCl0aHJvdyBuZXcgRXJyb3IoXCJmaW5hbGl6ZSBhbHJlYWR5IGNhbGxlZFwiKTtjb25zdCBzPXRoaXMuYmxvY2tzLGU9dGhpcy5ieXRlQ291bnQsbz10Lmxlbmd0aCxuPXRoaXMuYmxvY2tDb3VudCxoPXRoaXMucztsZXQgbCxjLGY9MDtmb3IoO2Y8bzspe2lmKHRoaXMucmVzZXQpZm9yKHRoaXMucmVzZXQ9ITEsc1swXT10aGlzLmJsb2NrLGw9MTtsPG4rMTsrK2wpc1tsXT0wO2ZvcihsPXRoaXMuc3RhcnQ7ZjxvJiZsPGU7KytmKWM9dC5jb2RlUG9pbnRBdChmKXx8MCxjPDEyOD9zW2w+PjJdfD1jPDxpWzMmbCsrXTpjPDIwNDg/KHNbbD4+Ml18PSgxOTJ8Yz4+Nik8PGlbMyZsKytdLHNbbD4+Ml18PSgxMjh8NjMmYyk8PGlbMyZsKytdKTpjPDU1Mjk2fHxjPj01NzM0ND8oc1tsPj4yXXw9KDIyNHxjPj4xMik8PGlbMyZsKytdLHNbbD4+Ml18PSgxMjh8Yz4+NiY2Myk8PGlbMyZsKytdLHNbbD4+Ml18PSgxMjh8NjMmYyk8PGlbMyZsKytdKTooYz02NTUzNisoKDEwMjMmYyk8PDEwfDEwMjMmKHQuY29kZVBvaW50QXQoKytmKXx8MCkpLHNbbD4+Ml18PSgyNDB8Yz4+MTgpPDxpWzMmbCsrXSxzW2w+PjJdfD0oMTI4fGM+PjEyJjYzKTw8aVszJmwrK10sc1tsPj4yXXw9KDEyOHxjPj42JjYzKTw8aVszJmwrK10sc1tsPj4yXXw9KDEyOHw2MyZjKTw8aVszJmwrK10pO2lmKHRoaXMubGFzdEJ5dGVJbmRleD1sLGw+PWUpe2Zvcih0aGlzLnN0YXJ0PWwtZSx0aGlzLmJsb2NrPXNbbl0sbD0wO2w8bjsrK2wpaFtsXV49c1tsXTtyKGgpLHRoaXMucmVzZXQ9ITB9ZWxzZSB0aGlzLnN0YXJ0PWx9cmV0dXJuIHRoaXN9ZmluYWxpemUoKXtpZih0aGlzLmZpbmFsaXplZClyZXR1cm47dGhpcy5maW5hbGl6ZWQ9ITA7Y29uc3QgdD10aGlzLmJsb2NrcztsZXQgcz10aGlzLmxhc3RCeXRlSW5kZXg7Y29uc3QgaT10aGlzLmJsb2NrQ291bnQsZT10aGlzLnM7aWYodFtzPj4yXXw9dGhpcy5wYWRkaW5nWzMmc10sdGhpcy5sYXN0Qnl0ZUluZGV4PT09dGhpcy5ieXRlQ291bnQpZm9yKHRbMF09dFtpXSxzPTE7czxpKzE7KytzKXRbc109MDtmb3IodFtpLTFdfD0yMTQ3NDgzNjQ4LHM9MDtzPGk7KytzKWVbc11ePXRbc107cihlKX1oZXgoKXt0aGlzLmZpbmFsaXplKCk7Y29uc3Qgcz10aGlzLmJsb2NrQ291bnQ7bGV0IGk9dGhpcy5zO2NvbnN0IGU9dGhpcy5vdXRwdXRCbG9ja3Msbz10aGlzLmV4dHJhQnl0ZXM7bGV0IGgsbD0wLGM9MCxmPVwiXCI7Zm9yKDtjPGU7KXtmb3IobD0wO2w8cyYmYzxlOysrbCwrK2MpaD1pW2xdLGYrPXRbaD4+NCYxNV0rdFsxNSZoXSt0W2g+PjEyJjE1XSt0W2g+PjgmMTVdK3RbaD4+MjAmMTVdK3RbaD4+MTYmMTVdK3RbaD4+MjgmMTVdK3RbaD4+MjQmMTVdO2Mlcz09PTAmJihpPW4oaSkscihpKSxsPTApfXJldHVybiBvJiYoaD1pW2xdLGYrPXRbaD4+NCYxNV0rdFsxNSZoXSxvPjEmJihmKz10W2g+PjEyJjE1XSt0W2g+PjgmMTVdKSxvPjImJihmKz10W2g+PjIwJjE1XSt0W2g+PjE2JjE1XSkpLGZ9fWNvbnN0IHI9ZnVuY3Rpb24odCl7bGV0IHMsaSxvLG4saCxyLGwsYyxmLGEsdSxkLGIsayx5LHgsQixwLEMseixJLGcsdyxBLFAsRSxqLG0scSx2LEQsRixHLEgsSixLLEwsTSxOLE8sUSxSLFMsVCxVLFYsVyxYLFksWiwkLF8sdHQsc3QsaXQsZXQsb3QsbnQsaHQscnQsbHQsY3QsZnQ7Zm9yKG89MDtvPDQ4O28rPTIpbj10WzBdXnRbMTBdXnRbMjBdXnRbMzBdXnRbNDBdLGg9dFsxXV50WzExXV50WzIxXV50WzMxXV50WzQxXSxyPXRbMl1edFsxMl1edFsyMl1edFszMl1edFs0Ml0sbD10WzNdXnRbMTNdXnRbMjNdXnRbMzNdXnRbNDNdLGM9dFs0XV50WzE0XV50WzI0XV50WzM0XV50WzQ0XSxmPXRbNV1edFsxNV1edFsyNV1edFszNV1edFs0NV0sYT10WzZdXnRbMTZdXnRbMjZdXnRbMzZdXnRbNDZdLHU9dFs3XV50WzE3XV50WzI3XV50WzM3XV50WzQ3XSxkPXRbOF1edFsxOF1edFsyOF1edFszOF1edFs0OF0sYj10WzldXnRbMTldXnRbMjldXnRbMzldXnRbNDldLHM9ZF4ocjw8MXxsPj4+MzEpLGk9Yl4obDw8MXxyPj4+MzEpLHRbMF1ePXMsdFsxXV49aSx0WzEwXV49cyx0WzExXV49aSx0WzIwXV49cyx0WzIxXV49aSx0WzMwXV49cyx0WzMxXV49aSx0WzQwXV49cyx0WzQxXV49aSxzPW5eKGM8PDF8Zj4+PjMxKSxpPWheKGY8PDF8Yz4+PjMxKSx0WzJdXj1zLHRbM11ePWksdFsxMl1ePXMsdFsxM11ePWksdFsyMl1ePXMsdFsyM11ePWksdFszMl1ePXMsdFszM11ePWksdFs0Ml1ePXMsdFs0M11ePWkscz1yXihhPDwxfHU+Pj4zMSksaT1sXih1PDwxfGE+Pj4zMSksdFs0XV49cyx0WzVdXj1pLHRbMTRdXj1zLHRbMTVdXj1pLHRbMjRdXj1zLHRbMjVdXj1pLHRbMzRdXj1zLHRbMzVdXj1pLHRbNDRdXj1zLHRbNDVdXj1pLHM9Y14oZDw8MXxiPj4+MzEpLGk9Zl4oYjw8MXxkPj4+MzEpLHRbNl1ePXMsdFs3XV49aSx0WzE2XV49cyx0WzE3XV49aSx0WzI2XV49cyx0WzI3XV49aSx0WzM2XV49cyx0WzM3XV49aSx0WzQ2XV49cyx0WzQ3XV49aSxzPWFeKG48PDF8aD4+PjMxKSxpPXVeKGg8PDF8bj4+PjMxKSx0WzhdXj1zLHRbOV1ePWksdFsxOF1ePXMsdFsxOV1ePWksdFsyOF1ePXMsdFsyOV1ePWksdFszOF1ePXMsdFszOV1ePWksdFs0OF1ePXMsdFs0OV1ePWksaz10WzBdLHk9dFsxXSxWPXRbMTFdPDw0fHRbMTBdPj4+MjgsVz10WzEwXTw8NHx0WzExXT4+PjI4LG09dFsyMF08PDN8dFsyMV0+Pj4yOSxxPXRbMjFdPDwzfHRbMjBdPj4+MjkscnQ9dFszMV08PDl8dFszMF0+Pj4yMyxsdD10WzMwXTw8OXx0WzMxXT4+PjIzLFI9dFs0MF08PDE4fHRbNDFdPj4+MTQsUz10WzQxXTw8MTh8dFs0MF0+Pj4xNCxIPXRbMl08PDF8dFszXT4+PjMxLEo9dFszXTw8MXx0WzJdPj4+MzEseD10WzEzXTw8MTJ8dFsxMl0+Pj4yMCxCPXRbMTJdPDwxMnx0WzEzXT4+PjIwLFg9dFsyMl08PDEwfHRbMjNdPj4+MjIsWT10WzIzXTw8MTB8dFsyMl0+Pj4yMix2PXRbMzNdPDwxM3x0WzMyXT4+PjE5LEQ9dFszMl08PDEzfHRbMzNdPj4+MTksY3Q9dFs0Ml08PDJ8dFs0M10+Pj4zMCxmdD10WzQzXTw8Mnx0WzQyXT4+PjMwLHN0PXRbNV08PDMwfHRbNF0+Pj4yLGl0PXRbNF08PDMwfHRbNV0+Pj4yLEs9dFsxNF08PDZ8dFsxNV0+Pj4yNixMPXRbMTVdPDw2fHRbMTRdPj4+MjYscD10WzI1XTw8MTF8dFsyNF0+Pj4yMSxDPXRbMjRdPDwxMXx0WzI1XT4+PjIxLFo9dFszNF08PDE1fHRbMzVdPj4+MTcsJD10WzM1XTw8MTV8dFszNF0+Pj4xNyxGPXRbNDVdPDwyOXx0WzQ0XT4+PjMsRz10WzQ0XTw8Mjl8dFs0NV0+Pj4zLEE9dFs2XTw8Mjh8dFs3XT4+PjQsUD10WzddPDwyOHx0WzZdPj4+NCxldD10WzE3XTw8MjN8dFsxNl0+Pj45LG90PXRbMTZdPDwyM3x0WzE3XT4+PjksTT10WzI2XTw8MjV8dFsyN10+Pj43LE49dFsyN108PDI1fHRbMjZdPj4+Nyx6PXRbMzZdPDwyMXx0WzM3XT4+PjExLEk9dFszN108PDIxfHRbMzZdPj4+MTEsXz10WzQ3XTw8MjR8dFs0Nl0+Pj44LHR0PXRbNDZdPDwyNHx0WzQ3XT4+PjgsVD10WzhdPDwyN3x0WzldPj4+NSxVPXRbOV08PDI3fHRbOF0+Pj41LEU9dFsxOF08PDIwfHRbMTldPj4+MTIsaj10WzE5XTw8MjB8dFsxOF0+Pj4xMixudD10WzI5XTw8N3x0WzI4XT4+PjI1LGh0PXRbMjhdPDw3fHRbMjldPj4+MjUsTz10WzM4XTw8OHx0WzM5XT4+PjI0LFE9dFszOV08PDh8dFszOF0+Pj4yNCxnPXRbNDhdPDwxNHx0WzQ5XT4+PjE4LHc9dFs0OV08PDE0fHRbNDhdPj4+MTgsdFswXT1rXn54JnAsdFsxXT15Xn5CJkMsdFsxMF09QV5+RSZtLHRbMTFdPVBefmomcSx0WzIwXT1IXn5LJk0sdFsyMV09Sl5+TCZOLHRbMzBdPVReflYmWCx0WzMxXT1VXn5XJlksdFs0MF09c3RefmV0Jm50LHRbNDFdPWl0Xn5vdCZodCx0WzJdPXhefnAmeix0WzNdPUJefkMmSSx0WzEyXT1FXn5tJnYsdFsxM109al5+cSZELHRbMjJdPUtefk0mTyx0WzIzXT1MXn5OJlEsdFszMl09Vl5+WCZaLHRbMzNdPVdeflkmJCx0WzQyXT1ldF5+bnQmcnQsdFs0M109b3Refmh0Jmx0LHRbNF09cF5+eiZnLHRbNV09Q15+SSZ3LHRbMTRdPW1efnYmRix0WzE1XT1xXn5EJkcsdFsyNF09TV5+TyZSLHRbMjVdPU5eflEmUyx0WzM0XT1YXn5aJl8sdFszNV09WV5+JCZ0dCx0WzQ0XT1udF5+cnQmY3QsdFs0NV09aHRefmx0JmZ0LHRbNl09el5+ZyZrLHRbN109SV5+dyZ5LHRbMTZdPXZefkYmQSx0WzE3XT1EXn5HJlAsdFsyNl09T15+UiZILHRbMjddPVFeflMmSix0WzM2XT1aXn5fJlQsdFszN109JF5+dHQmVSx0WzQ2XT1ydF5+Y3Qmc3QsdFs0N109bHRefmZ0Jml0LHRbOF09Z15+ayZ4LHRbOV09d15+eSZCLHRbMThdPUZefkEmRSx0WzE5XT1HXn5QJmosdFsyOF09Ul5+SCZLLHRbMjldPVNefkomTCx0WzM4XT1fXn5UJlYsdFszOV09dHReflUmVyx0WzQ4XT1jdF5+c3QmZXQsdFs0OV09ZnRefml0Jm90LHRbMF1ePWVbb10sdFsxXV49ZVtvKzFdfTtleHBvcnR7byBhcyBzaGEzXzUxMn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1oYXNoLmpzLm1hcFxuIiwiY29uc3QgZT1cIlwiLHQ9ZnVuY3Rpb24oKXtjb25zdCBlPXtpbnN0YW5jZTpFcnJvcixmcm9tOmU9Pntjb25zdCB0PVtlLm5hbWUsZS5tZXNzYWdlXTtyZXR1cm4gdm9pZCAwIT09ZS5zdGFjayYmdC5wdXNoKGUuc3RhY2spLHZvaWQgMCE9PWUuY2F1c2UmJih2b2lkIDA9PT1lLnN0YWNrJiZ0LnB1c2godm9pZCAwKSx0LnB1c2goZS5jYXVzZSkpLHR9LHN0dWI6KCk9Pm5ldyBFcnJvcixoeWRyYXRlOihlLFt0LG4sYSxzXSk9PntlLm5hbWU9dCxlLm1lc3NhZ2U9bix2b2lkIDA9PT1hP2RlbGV0ZSBlLnN0YWNrOmUuc3RhY2s9YSx2b2lkIDAhPT1zJiYoZS5jYXVzZT1zKX19LHQ9e2luc3RhbmNlOlVpbnQ4QXJyYXksZnJvbTplPT5bYnRvYShhLmRlY29kZShlKSldLGNyZWF0ZTooW2VdKT0+bi5lbmNvZGUoYXRvYihlKSl9LHM9e2luc3RhbmNlOk1hcCxmcm9tOmU9PlsuLi5lLmVudHJpZXMoKV0sc3R1YjooKT0+bmV3IE1hcCxoeWRyYXRlOihlLHQpPT57Zm9yKGNvbnN0W24sYV1vZiB0KWUuc2V0KG4sYSl9fSxvPXtpbnN0YW5jZTpTZXQsZnJvbTplPT5bLi4uZS52YWx1ZXMoKV0sc3R1YjooKT0+bmV3IFNldCxoeWRyYXRlOihlLHQpPT57Zm9yKGNvbnN0IG4gb2YgdCllLmFkZChuKX19LHI9e2luc3RhbmNlOkRhdGUsZnJvbTplPT5bZS50b0pTT04oKV0sY3JlYXRlOihbZV0pPT5uZXcgRGF0ZShlKX0sYz17aW5zdGFuY2U6UmVnRXhwLGZyb206KHtmbGFnczplLHNvdXJjZTp0fSk9PmU/W3QsZV06W3RdLGNyZWF0ZTooW2UsdF0pPT5uZXcgUmVnRXhwKGUsdCl9LGQ9e2luc3RhbmNlOlVSTCxmcm9tOmU9PltlLmhyZWZdLGNyZWF0ZTooW2VdKT0+bmV3IFVSTChlKX07cmV0dXJuIG5ldyBNYXAoW2UsdCxzLG8scixjLGRdLm1hcChlPT5bZS5pbnN0YW5jZS5uYW1lLGVdKSl9KCksbj1uZXcgVGV4dEVuY29kZXIsYT1uZXcgVGV4dERlY29kZXIoXCJ1dGYtOFwiKTtleHBvcnR7dCBhcyBHTE9CQUxfQ09OU1RSVUNUT1JfTUFQLGUgYXMgUExBSU5fT0JKRUNUX0xBQkVMfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbnN0cnVjdG9ycy5qcy5tYXBcbiIsImltcG9ydHtHTE9CQUxfQ09OU1RSVUNUT1JfTUFQIGFzIHQsUExBSU5fT0JKRUNUX0xBQkVMIGFzIG59ZnJvbVwiLi9jb25zdHJ1Y3RvcnMuanNcIjtjb25zdCBlPS0xLHI9LTIsbz0tMyxpPS00LHM9LTUsYz0tNjtmdW5jdGlvbiBmKG49dm9pZCAwLGU9dCl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KGEobixlKSl9ZnVuY3Rpb24gdSh0KXtpZih2b2lkIDA9PT10KXJldHVybi0xO2lmKFwibnVtYmVyXCI9PXR5cGVvZiB0KXtpZihOdW1iZXIuaXNOYU4odCkpcmV0dXJuLTM7aWYoIU51bWJlci5pc0Zpbml0ZSh0KSlyZXR1cm4gdDwwPy01Oi00fXJldHVybiBudWxsfWNvbnN0IGw9W107ZnVuY3Rpb24gYShlLHI9dCl7Y29uc3Qgbz11KGUpO2lmKG51bGwhPT1vKXJldHVybiBvO2NvbnN0IGk9W10scz1uZXcgTWFwO3JldHVybiBmdW5jdGlvbiB0KGUpe2NvbnN0IG89dShlKTtpZihudWxsIT09bylyZXR1cm4gbztsZXQgYz1zLmdldChlKTtpZih2b2lkIDAhPT1jKXJldHVybiBjO3N3aXRjaChjPWkubGVuZ3RoLHR5cGVvZiBlKXtjYXNlXCJudW1iZXJcIjpjYXNlXCJzdHJpbmdcIjpjYXNlXCJib29sZWFuXCI6aVtjXT1lLHMuc2V0KGUsYyk7YnJlYWs7Y2FzZVwiYmlnaW50XCI6aVtjXT1bLTYsZS50b1N0cmluZygxNildLHMuc2V0KGUsYyk7YnJlYWs7Y2FzZVwib2JqZWN0XCI6aWYobnVsbD09PWUpaVtjXT1lLHMuc2V0KGUsYyk7ZWxzZSBpZihBcnJheS5pc0FycmF5KGUpKXtjb25zdCBuPWZ1bmN0aW9uKHQpe2lmKGwubGVuZ3RoPHQpe2NvbnN0IG49bC5sZW5ndGg7bC5sZW5ndGg9dCxsLmZpbGwoLTIsbix0KX1yZXR1cm4gbC5zbGljZSgwLHQpfShlLmxlbmd0aCk7aVtjXT1uLHMuc2V0KGUsYyk7Zm9yKGNvbnN0W3Isb11vZiBlLmVudHJpZXMoKSluW3JdPXQobyl9ZWxzZXtjb25zdFtvLGZdPWZ1bmN0aW9uKHQsZSl7Y29uc3Qgcj10LmNvbnN0cnVjdG9yO2lmKFwiZnVuY3Rpb25cIj09dHlwZW9mIHIpe2NvbnN0IG49ci5uYW1lLG89ZS5nZXQobik7aWYodm9pZCAwIT09bylyZXR1cm5bbixvLmZyb20odCldfWNvbnN0IG89T2JqZWN0LmVudHJpZXModCksaT1vLmxlbmd0aCxzPUFycmF5LmZyb20oe2xlbmd0aDppK2l9KTtmb3IobGV0IHQ9MDt0PGk7dCsrKXtjb25zdCBuPW9bdF0sZT10K3Q7c1tlXT1uWzBdLHNbZSsxXT1uWzFdfXJldHVybltuLHNdfShlLHIpLHU9Zi5sZW5ndGgsbD1BcnJheS5mcm9tKHtsZW5ndGg6dSsxfSk7bFswXT1vLGlbY109bCxzLnNldChlLGMpO2ZvcihsZXQgbj0wO248dTtuKyspbFtuKzFdPXQoZltuXSl9fXJldHVybiBjfShlKSxpfWV4cG9ydHtyIGFzIEFSUkFZX0hPTEVfSU5ERVgsYyBhcyBCSUdfSU5UX0xBQkVMLG8gYXMgTkFOX0lOREVYLHMgYXMgTkVHX0lORl9JTkRFWCxpIGFzIFBPU19JTkZfSU5ERVgsZSBhcyBVTkRFRklORURfSU5ERVgsYSBhcyBsaXN0aWZ5LGYgYXMgc3RyaW5naWZ5fTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXN0cmluZ2lmeS5qcy5tYXBcbiIsImltcG9ydHtzaGEzXzUxMiBhcyByfWZyb21cIi4vaGFzaC5qc1wiO2ltcG9ydHtzdHJpbmdpZnkgYXMgbn1mcm9tXCIuL29zb24vc3RyaW5naWZ5LmpzXCI7ZnVuY3Rpb24gbyhvLHQpe3JldHVybiByKG4oW28sdF0pKX1mdW5jdGlvbiB0KHIsbyl7cmV0dXJuIG4oW3Isb10pfWZ1bmN0aW9uIGkoKXtyZXR1cm5cIlwifWV4cG9ydHtpIGFzIGdldENhY2hlS2V5T2ZFbXB0eVN0cmluZyxvIGFzIGdldENhY2hlS2V5T2ZIYXNoLHQgYXMgZ2V0Q2FjaGVLZXlPZlN0cmluZ2lmaWVkfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdldENhY2hlS2V5LmpzLm1hcFxuIiwiaW1wb3J0e2dldENhY2hlS2V5T2ZIYXNoIGFzIHQsZ2V0Q2FjaGVLZXlPZkVtcHR5U3RyaW5nIGFzIGV9ZnJvbVwiLi9nZXRDYWNoZUtleS5qc1wiO2NvbnN0IG49cih7Z2V0Q2FjaGVLZXk6dH0pLGM9cih7Z2V0Q2FjaGVLZXk6ZX0pO2Z1bmN0aW9uIHIoe2NhY2hlRHVyYXRpb246ZT1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksZ2V0Q2FjaGVLZXk6bj10fT17fSl7cmV0dXJuIGZ1bmN0aW9uKHQsYyl7bGV0IHIsbyxpO3JldHVyblwiZ2V0dGVyXCI9PT1jPy5raW5kP2Z1bmN0aW9uKCl7Y29uc3QgYz1uKHRoaXMsW10pLGE9RGF0ZS5ub3coKTtyZXR1cm4oaSE9PWN8fGEtbz5lKSYmKGk9YyxyPXQuY2FsbCh0aGlzKSxvPWEpLHJ9OmZ1bmN0aW9uKC4uLmEpe2NvbnN0IHU9bih0aGlzLGEpLGg9RGF0ZS5ub3coKTtyZXR1cm4oaSE9PXV8fGgtbz5lKSYmKGk9dSxyPWM/dC5jYWxsKHRoaXMsLi4uYSk6dCguLi5hKSxvPWgpLHJ9fX1leHBvcnR7biBhcyBtZW1vaXplT25lLHIgYXMgbWVtb2l6ZU9uZUZhY3RvcnksYyBhcyBtZW1vaXplT25lV2l0aEVtcHR5SGFzaH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tZW1vaXplT25lLmpzLm1hcFxuIiwiZXhwb3J0IGZ1bmN0aW9uIGlzQ0koY2lFbnY6IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gISFjaUVudiAmJiBjaUVudiAhPT0gJzAnICYmIGNpRW52ICE9PSAnZmFsc2UnO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBFbnZSZWFkZXJPcHRpb25zIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHsgcmVhZEVudmlyb25tZW50VmFyaWFibGVzIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHsgbWVtb2l6ZU9uZSB9IGZyb20gJ2F0LWRlY29yYXRvcnMnO1xuaW1wb3J0IHsgZ2xvYmJ5IH0gZnJvbSAnZ2xvYmJ5JztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBpc0NJIH0gZnJvbSAnLi91dGlscy9jaS5qcyc7XG5cbmV4cG9ydCBjbGFzcyBQcm9qZWN0IHtcbiAgcHJpdmF0ZSByZWFkb25seSBhcmd2OiBFbnZSZWFkZXJPcHRpb25zO1xuICBwcml2YXRlIHJlYWRvbmx5IGxvYWRFbnY6IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgcGF0aEJ5TmFtZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfZGlyUGF0aDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGRpclBhdGg6IHN0cmluZywgYXJndjogRW52UmVhZGVyT3B0aW9ucywgbG9hZEVudjogYm9vbGVhbikge1xuICAgIHRoaXMuX2RpclBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCk7XG4gICAgdGhpcy5hcmd2ID0gYXJndjtcbiAgICB0aGlzLmxvYWRFbnYgPSBsb2FkRW52O1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGlzQnVuQXZhaWxhYmxlKCk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gLyhefFxcbilidW5cXHMvLnRlc3QoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbih0aGlzLnJvb3REaXJQYXRoLCAnLnRvb2wtdmVyc2lvbnMnKSwgJ3V0ZjgnKSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGJ1aWxkQ29tbWFuZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnBhY2thZ2VKc29uLnNjcmlwdHM/LmJ1aWxkPy5pbmNsdWRlcygnYnVpbGRJZk5lZWRlZCcpXG4gICAgICA/ICdZQVJOIHJ1biBidWlsZCdcbiAgICAgIDogdGhpcy5wYWNrYWdlSnNvbi5zY3JpcHRzPy5idWlsZFxuICAgICAgICA/IGBZQVJOIHdiIGJ1aWxkSWZOZWVkZWQgJHt0aGlzLmFyZ3YudmVyYm9zZSA/ICctLXZlcmJvc2UnIDogJyd9YFxuICAgICAgICA6IFwiZWNobyAnTm8gYnVpbGQgc2NyaXB0J1wiO1xuICB9XG5cbiAgZ2V0IGRpclBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZGlyUGF0aDtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCByb290RGlyUGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLmRpclBhdGgsICcuLicsICcuLicsICdwYWNrYWdlLmpzb24nKSlcbiAgICAgID8gcGF0aC5yZXNvbHZlKHRoaXMuZGlyUGF0aCwgJy4uJywgJy4uJylcbiAgICAgIDogdGhpcy5kaXJQYXRoO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGRvY2tlcmZpbGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZnMucmVhZEZpbGVTeW5jKHRoaXMuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSwgJ3V0ZjgnKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNEb2NrZXJmaWxlKCk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gISF0aGlzLmZpbmRGaWxlKCdEb2NrZXJmaWxlJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1NvdXJjZUNvZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJ3NyYycpKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucGFja2FnZUpzb24ubmFtZSB8fCAndW5rbm93bic7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgZG9ja2VySW1hZ2VOYW1lKCk6IHN0cmluZyB7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMucGFja2FnZUpzb24ubmFtZSB8fCAndW5rbm93bic7XG4gICAgcmV0dXJuIG5hbWUucmVwbGFjZUFsbCgnQCcsICcnKS5yZXBsYWNlQWxsKCcvJywgJy0nKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBlbnYoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgaWYgKCF0aGlzLmxvYWRFbnYpIHJldHVybiBwcm9jZXNzLmVudjtcblxuICAgIGNvbnN0IFtlbnZWYXJzLCBlbnZQYXRoQW5kTG9hZGVkRW52VmFyQ291bnRQYWlyc10gPSByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXModGhpcy5hcmd2LCB0aGlzLmRpclBhdGgpO1xuICAgIGZvciAoY29uc3QgW2VudlBhdGgsIGNvdW50XSBvZiBlbnZQYXRoQW5kTG9hZGVkRW52VmFyQ291bnRQYWlycykge1xuICAgICAgY29uc29sZS5pbmZvKGBMb2FkZWQgJHtjb3VudH0gZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gJHtlbnZQYXRofWApO1xuICAgIH1cbiAgICByZXR1cm4geyAuLi5lbnZWYXJzLCAuLi5wcm9jZXNzLmVudiB9O1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IHBhY2thZ2VKc29uKCk6IFBhY2thZ2VKc29uIHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmModGhpcy5wYWNrYWdlSnNvblBhdGgsICd1dGY4JykpIGFzIFBhY2thZ2VKc29uO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IHBhY2thZ2VKc29uUGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBwYXRoLmpvaW4odGhpcy5kaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzUHJpc21hKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhISh0aGlzLnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8ucHJpc21hID8/IHRoaXMucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy5wcmlzbWEpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1ZpdGVzdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEodGhpcy5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LnZpdGVzdCA/PyB0aGlzLnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8udml0ZXN0KTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNCaW9tZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5oYXNEZXBlbmRlbmN5KCdAYmlvbWVqcy9iaW9tZScpIHx8IHRoaXMuaGFzRGVwZW5kZW5jeSgnYmlvbWUnKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNFc2xpbnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGFzRGVwZW5kZW5jeSgnZXNsaW50Jyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzT3hsaW50KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhhc0RlcGVuZGVuY3koJ294bGludCcpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc094Zm10KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhhc0RlcGVuZGVuY3koJ294Zm10Jyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzUG9ldHJ5TG9jaygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5kaXJQYXRoLCAncG9ldHJ5LmxvY2snKSkgfHwgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5yb290RGlyUGF0aCwgJ3BvZXRyeS5sb2NrJykpXG4gICAgKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNQdWJzcGVjWWFtbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5kaXJQYXRoLCAncHVic3BlYy55YW1sJykpIHx8XG4gICAgICBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLnJvb3REaXJQYXRoLCAncHVic3BlYy55YW1sJykpXG4gICAgKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBwcmVmZXJyZWRMaW50ZXIoKTogJ2Jpb21lJyB8ICdveGxpbnQnIHwgJ2VzbGludCcgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmhhc0Jpb21lKSByZXR1cm4gJ2Jpb21lJztcbiAgICBpZiAodGhpcy5oYXNPeGxpbnQpIHJldHVybiAnb3hsaW50JztcbiAgICBpZiAodGhpcy5oYXNFc2xpbnQpIHJldHVybiAnZXNsaW50JztcbiAgICByZXR1cm47XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzUGxheXdyaWdodENvbmZpZygpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuICEhdGhpcy5maW5kRmlsZSgncGxheXdyaWdodC5jb25maWcudHMnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgc2tpcExhdW5jaGluZ1NlcnZlckZvclBsYXl3cmlnaHQoKTogYm9vbGVhbiB7XG4gICAgaWYgKGlzQ0kodGhpcy5lbnYuQ0kpKSByZXR1cm4gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbmZpZ1BhdGggPSB0aGlzLmZpbmRGaWxlKCdwbGF5d3JpZ2h0LmNvbmZpZy50cycpO1xuICAgICAgcmV0dXJuIC9cXGJ3ZWJTZXJ2ZXJcXGIvLnRlc3QoZnMucmVhZEZpbGVTeW5jKGNvbmZpZ1BhdGgsICd1dGY4JykpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBkb2NrZXJQYWNrYWdlSnNvbigpOiBQYWNrYWdlSnNvbiB7XG4gICAgcmV0dXJuIHBhdGguZGlybmFtZSh0aGlzLmZpbmRGaWxlKCdEb2NrZXJmaWxlJykpID09PSB0aGlzLmRpclBhdGhcbiAgICAgID8gdGhpcy5wYWNrYWdlSnNvblxuICAgICAgOiAoSlNPTi5wYXJzZShcbiAgICAgICAgICBmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHBhdGguZGlybmFtZSh0aGlzLmZpbmRGaWxlKCdEb2NrZXJmaWxlJykpLCAncGFja2FnZS5qc29uJyksICd1dGY4JylcbiAgICAgICAgKSBhcyBQYWNrYWdlSnNvbik7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgYmluRXhpc3RzKCk6IGJvb2xlYW4ge1xuICAgIGxldCBiaW5Gb3VuZCA9IGZhbHNlO1xuICAgIGxldCBjdXJyZW50UGF0aCA9IHRoaXMuZGlyUGF0aDtcbiAgICBmb3IgKDs7KSB7XG4gICAgICBjb25zdCBiaW5QYXRoID0gcGF0aC5qb2luKGN1cnJlbnRQYXRoLCAnbm9kZV9tb2R1bGVzJywgJy5iaW4nKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKGJpblBhdGgpKSB7XG4gICAgICAgIHRoaXMuZW52LlBBVEggPSBgJHtiaW5QYXRofToke3RoaXMuZW52LlBBVEh9YDtcbiAgICAgICAgYmluRm91bmQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY3VycmVudFBhdGgsICcuZ2l0JykpKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY29uc3QgcGFyZW50UGF0aCA9IHBhdGguZGlybmFtZShjdXJyZW50UGF0aCk7XG4gICAgICBpZiAoY3VycmVudFBhdGggPT09IHBhcmVudFBhdGgpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjdXJyZW50UGF0aCA9IHBhcmVudFBhdGg7XG4gICAgfVxuICAgIHJldHVybiBiaW5Gb3VuZDtcbiAgfVxuXG4gIGZpbmRGaWxlKGZpbGVOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCBmaWxlUGF0aCA9IHRoaXMucGF0aEJ5TmFtZS5nZXQoZmlsZU5hbWUpO1xuICAgIGlmIChmaWxlUGF0aCkgcmV0dXJuIGZpbGVQYXRoO1xuXG4gICAgZmlsZVBhdGggPSBbZmlsZU5hbWUsIHBhdGguam9pbignLi4nLCAnLi4nLCBmaWxlTmFtZSldXG4gICAgICAubWFwKChwKSA9PiBwYXRoLnJlc29sdmUodGhpcy5kaXJQYXRoLCBwKSlcbiAgICAgIC5maW5kKChwKSA9PiBmcy5leGlzdHNTeW5jKHApKTtcbiAgICBpZiAoIWZpbGVQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgbm90IGZvdW5kOiAke2ZpbGVOYW1lfWApO1xuICAgIH1cbiAgICB0aGlzLnBhdGhCeU5hbWUuc2V0KGZpbGVOYW1lLCBmaWxlUGF0aCk7XG4gICAgcmV0dXJuIGZpbGVQYXRoO1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNEZXBlbmRlbmN5KHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBoYXNEZXBlbmRlbmN5SW5QYWNrYWdlSnNvbiA9IChwYWNrYWdlSnNvbjogUGFja2FnZUpzb24gfCB1bmRlZmluZWQpOiBib29sZWFuID0+XG4gICAgICAhIShcbiAgICAgICAgcGFja2FnZUpzb24gJiZcbiAgICAgICAgKHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSB8fFxuICAgICAgICAgIHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSB8fFxuICAgICAgICAgIHBhY2thZ2VKc29uLm9wdGlvbmFsRGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdIHx8XG4gICAgICAgICAgcGFja2FnZUpzb24ucGVlckRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSlcbiAgICAgICk7XG5cbiAgICByZXR1cm4gaGFzRGVwZW5kZW5jeUluUGFja2FnZUpzb24odGhpcy5wYWNrYWdlSnNvbikgfHwgaGFzRGVwZW5kZW5jeUluUGFja2FnZUpzb24odGhpcy5yb290UGFja2FnZUpzb24pO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgcHJpdmF0ZSBnZXQgcm9vdFBhY2thZ2VKc29uKCk6IFBhY2thZ2VKc29uIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5yb290RGlyUGF0aCA9PT0gdGhpcy5kaXJQYXRoKSByZXR1cm4gdGhpcy5wYWNrYWdlSnNvbjtcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHRoaXMucm9vdERpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKSkgYXMgUGFja2FnZUpzb247XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFt3Yl0gRmFpbGVkIHRvIHJlYWQgb3IgcGFyc2UgJHtwYXRoLmpvaW4odGhpcy5yb290RGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpfWAsIGVycm9yKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBGb3VuZFByb2plY3RzIHtcbiAgcm9vdDogUHJvamVjdDtcbiAgc2VsZjogUHJvamVjdDtcbiAgZGVzY2VuZGFudHM6IFByb2plY3RbXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRTZWxmUHJvamVjdChhcmd2OiBFbnZSZWFkZXJPcHRpb25zLCBsb2FkRW52ID0gdHJ1ZSwgZGlyUGF0aD86IHN0cmluZyk6IFByb2plY3QgfCB1bmRlZmluZWQge1xuICBkaXJQYXRoID8/PSBwcm9jZXNzLmN3ZCgpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKSkpIHJldHVybjtcblxuICByZXR1cm4gbmV3IFByb2plY3QoZGlyUGF0aCwgYXJndiwgbG9hZEVudik7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaW5kRGVzY2VuZGFudFByb2plY3RzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBsb2FkRW52ID0gdHJ1ZSxcbiAgZGlyUGF0aD86IHN0cmluZ1xuKTogUHJvbWlzZTxGb3VuZFByb2plY3RzIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHJvb3RBbmRTZWxmUHJvamVjdHMgPSBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyhhcmd2LCBsb2FkRW52LCBkaXJQYXRoKTtcbiAgaWYgKCFyb290QW5kU2VsZlByb2plY3RzKSByZXR1cm47XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5yb290QW5kU2VsZlByb2plY3RzLFxuICAgIGRlc2NlbmRhbnRzOlxuICAgICAgcm9vdEFuZFNlbGZQcm9qZWN0cy5yb290ID09PSByb290QW5kU2VsZlByb2plY3RzLnNlbGZcbiAgICAgICAgPyBhd2FpdCBnZXRBbGxEZXNjZW5kYW50UHJvamVjdHMoYXJndiwgcm9vdEFuZFNlbGZQcm9qZWN0cy5yb290LCBsb2FkRW52KVxuICAgICAgICA6IFtyb290QW5kU2VsZlByb2plY3RzLnNlbGZdLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZFJvb3RBbmRTZWxmUHJvamVjdHMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIGxvYWRFbnYgPSB0cnVlLFxuICBkaXJQYXRoPzogc3RyaW5nXG4pOiBPbWl0PEZvdW5kUHJvamVjdHMsICdkZXNjZW5kYW50cyc+IHwgdW5kZWZpbmVkIHtcbiAgZGlyUGF0aCA/Pz0gcHJvY2Vzcy5jd2QoKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSByZXR1cm47XG5cbiAgY29uc3QgdGhpc1Byb2plY3QgPSBuZXcgUHJvamVjdChkaXJQYXRoLCBhcmd2LCBsb2FkRW52KTtcbiAgbGV0IHJvb3RQcm9qZWN0ID0gdGhpc1Byb2plY3Q7XG4gIGlmICghdGhpc1Byb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcyAmJiBwYXRoLmRpcm5hbWUoZGlyUGF0aCkuZW5kc1dpdGgoJy9wYWNrYWdlcycpKSB7XG4gICAgY29uc3Qgcm9vdERpclBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy4uJywgJy4uJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHJvb3REaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgICByb290UHJvamVjdCA9IG5ldyBQcm9qZWN0KHJvb3REaXJQYXRoLCBhcmd2LCBsb2FkRW52KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgcm9vdDogcm9vdFByb2plY3QsIHNlbGY6IHRoaXNQcm9qZWN0IH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEFsbERlc2NlbmRhbnRQcm9qZWN0cyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgcm9vdFByb2plY3Q6IFByb2plY3QsXG4gIGxvYWRFbnY6IGJvb2xlYW5cbik6IFByb21pc2U8UHJvamVjdFtdPiB7XG4gIGNvbnN0IHByb2plY3RzID0gW3Jvb3RQcm9qZWN0XTtcblxuICBjb25zdCB3b3Jrc3BhY2UgPSByb290UHJvamVjdC5wYWNrYWdlSnNvbi53b3Jrc3BhY2VzO1xuICBpZiAoIUFycmF5LmlzQXJyYXkod29ya3NwYWNlKSkgcmV0dXJuIHByb2plY3RzO1xuXG4gIGNvbnN0IGdsb2JQYXR0ZXJuOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBwYWNrYWdlRGlyczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCB3b3Jrc3BhY2VQYXRoIG9mIHdvcmtzcGFjZS5tYXAoKHdzOiBzdHJpbmcpID0+IHBhdGguam9pbihyb290UHJvamVjdC5kaXJQYXRoLCB3cykpKSB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMod29ya3NwYWNlUGF0aCkpIHtcbiAgICAgIHBhY2thZ2VEaXJzLnB1c2god29ya3NwYWNlUGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdsb2JQYXR0ZXJuLnB1c2god29ya3NwYWNlUGF0aCk7XG4gICAgfVxuICB9XG4gIHBhY2thZ2VEaXJzLnB1c2goLi4uKGF3YWl0IGdsb2JieShnbG9iUGF0dGVybiwgeyBkb3Q6IHRydWUsIG9ubHlEaXJlY3RvcmllczogdHJ1ZSB9KSkpO1xuICBmb3IgKGNvbnN0IHN1YlBhY2thZ2VEaXJQYXRoIG9mIHBhY2thZ2VEaXJzKSB7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihzdWJQYWNrYWdlRGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkgY29udGludWU7XG5cbiAgICBwcm9qZWN0cy5wdXNoKG5ldyBQcm9qZWN0KHN1YlBhY2thZ2VEaXJQYXRoLCBhcmd2LCBsb2FkRW52KSk7XG4gIH1cbiAgcmV0dXJuIHByb2plY3RzO1xufVxuIiwiZXhwb3J0IGNvbnN0IGlzUnVubmluZ09uQnVuID1cbiAgLy8gRGV0ZWN0IGBidW4gLS1idW4gcnVuIHdiIC4uLmAuIGNmLiBodHRwczovL2J1bi5zaC9ndWlkZXMvdXRpbC9kZXRlY3QtYnVuXG4gIHByb2Nlc3MudmVyc2lvbnMuYnVuIHx8XG4gIC8vIERldGVjdCBgYnVuIHJ1biB3YiAuLi5gLlxuICBwcm9jZXNzLmFyZ3ZbMF0/LmVuZHNXaXRoKCcvYnVuJykgfHxcbiAgcHJvY2Vzcy5lbnYubnBtX2V4ZWNwYXRoPy5lbmRzV2l0aCgnL2J1bicpO1xuXG5leHBvcnQgY29uc3QgcnVudGltZVdpdGhBcmdzID0gaXNSdW5uaW5nT25CdW4gPyAnYnVuIC0tYnVuIHJ1bicgOiAnbm9kZSc7XG5leHBvcnQgY29uc3QgcGFja2FnZU1hbmFnZXIgPSBpc1J1bm5pbmdPbkJ1biA/ICdidW4nIDogJ3lhcm4nO1xuZXhwb3J0IGNvbnN0IHBhY2thZ2VNYW5hZ2VyV2l0aFJ1biA9IGlzUnVubmluZ09uQnVuID8gJ2J1biAtLWJ1biBydW4nIDogJ3lhcm4nO1xuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB0eXBlIHsgQmluYXJ5TGlrZSwgSGFzaCB9IGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBpZ25vcmVFbm9lbnRBc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgaXNSdW5uaW5nT25CdW4gfSBmcm9tICcuLi91dGlscy9ydW50aW1lLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgY29tbWFuZDoge1xuICAgIGRlc2NyaXB0aW9uOiAnQSBidWlsZCBjb21tYW5kIChkZWZhdWx0OiB5YXJufGJ1biBidWlsZCknLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAnYycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgYnVpbGRJZk5lZWRlZENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnYnVpbGRJZk5lZWRlZCcsXG4gIGRlc2NyaWJlOiAnQnVpbGQgY29kZSBpZiBjaGFuZ2VzIGFyZSBkZXRlY3RlZCcsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IGJ1aWxkSWZOZWVkZWQoYXJndik7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRJZk5lZWRlZChcbiAgLy8gVGVzdCBjb2RlIHJlcXVpcmVzIFBhcnRpYWw8Li4uPlxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4+LFxuICBwcm9qZWN0UGF0aEZvclRlc3Rpbmc/OiBzdHJpbmdcbik6IFByb21pc2U8Ym9vbGVhbiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YsIHRydWUsIHByb2plY3RQYXRoRm9yVGVzdGluZyk7XG4gIGlmICghcHJvamVjdCkge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGFyZ3YgPSB7IC4uLmFyZ3YsIGNvbW1hbmQ6IGFyZ3YuY29tbWFuZCA/PyAoaXNSdW5uaW5nT25CdW4gPyAnYnVuIHJ1biBidWlsZCcgOiAneWFybiBidWlsZCcpIH07XG5cbiAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LnJvb3REaXJQYXRoLCAnLmdpdCcpKSkge1xuICAgIGJ1aWxkKHByb2plY3QsIGFyZ3YpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY29uc3QgW2NhblNraXAsIGNhY2hlRmlsZVBhdGgsIGNvbnRlbnRIYXNoXSA9IGF3YWl0IGNhblNraXBCdWlsZChwcm9qZWN0LCBhcmd2KTtcbiAgaWYgKGNhblNraXApIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oYFNraXAgdG8gcnVuICcke2FyZ3YuY29tbWFuZH0nIPCfkqtgKSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFidWlsZChwcm9qZWN0LCBhcmd2KSkgcmV0dXJuO1xuXG4gIGlmICghYXJndi5kcnlSdW4pIHtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoY2FjaGVGaWxlUGF0aCwgY29udGVudEhhc2gsICd1dGY4Jyk7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+Pj4pOiBib29sZWFuIHtcbiAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKGBSdW4gJyR7YXJndi5jb21tYW5kfSdgKSk7XG4gIGlmICghYXJndi5kcnlSdW4pIHtcbiAgICBjb25zdCByZXQgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhhcmd2LmNvbW1hbmQgPz8gJycsIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBwcm9qZWN0LmVudixcbiAgICAgIHNoZWxsOiB0cnVlLFxuICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICB9KTtcbiAgICBpZiAocmV0LnN0YXR1cyAhPT0gMCkge1xuICAgICAgcHJvY2Vzcy5leGl0Q29kZSA9IHJldC5zdGF0dXMgPz8gMTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmNvbnN0IGlnbm9yaW5nRW52VmFyTmFtZXMgPSBuZXcgU2V0KFsnQ0knLCAnUFdERUJVRycsICdUTVBESVInXSk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjYW5Ta2lwQnVpbGQoXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+Pj5cbik6IFByb21pc2U8W2Jvb2xlYW4sIHN0cmluZywgc3RyaW5nXT4ge1xuICBjb25zdCBjYWNoZURpcmVjdG9yeVBhdGggPSBwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCAnbm9kZV9tb2R1bGVzJywgJy5jYWNoZScsICdidWlsZCcpO1xuICBjb25zdCBjYWNoZUZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNhY2hlRGlyZWN0b3J5UGF0aCwgJ2xhc3QtYnVpbGQnKTtcbiAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIoY2FjaGVEaXJlY3RvcnlQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICBjb25zdCBoYXNoID0gY3JlYXRlSGFzaCgnc2hhMjU2Jyk7XG5cbiAgY29uc3QgY29tbWl0SGFzaCA9IGNoaWxkX3Byb2Nlc3MuZXhlY1N5bmMoJ2dpdCByZXYtcGFyc2UgSEVBRCcsIHsgY3dkOiBwcm9qZWN0LmRpclBhdGggfSkudG9TdHJpbmcoKS50cmltKCk7XG4gIGhhc2gudXBkYXRlKGNvbW1pdEhhc2gpO1xuXG4gIGNvbnN0IGVudmlyb25tZW50SnNvbiA9IEpTT04uc3RyaW5naWZ5KFxuICAgIE9iamVjdC5lbnRyaWVzKHByb2plY3QuZW52KVxuICAgICAgLmZpbHRlcigoW2tleV0pID0+ICFpZ25vcmluZ0VudlZhck5hbWVzLmhhcyhrZXkpKVxuICAgICAgLnRvU29ydGVkKChba2V5MV0sIFtrZXkyXSkgPT4ga2V5MS5sb2NhbGVDb21wYXJlKGtleTIpKVxuICApO1xuICBoYXNoLnVwZGF0ZShlbnZpcm9ubWVudEpzb24pO1xuXG4gIGF3YWl0IHVwZGF0ZUhhc2hXaXRoRGlmZlJlc3VsdChwcm9qZWN0LCBhcmd2LCBoYXNoKTtcbiAgY29uc3QgY29udGVudEhhc2ggPSBoYXNoLmRpZ2VzdCgnaGV4Jyk7XG5cbiAgY29uc3QgY2FjaGVkQ29udGVudEhhc2ggPSBhd2FpdCBpZ25vcmVFbm9lbnRBc3luYygoKSA9PiBmcy5wcm9taXNlcy5yZWFkRmlsZShjYWNoZUZpbGVQYXRoLCAndXRmOCcpKTtcbiAgcmV0dXJuIFtjYWNoZWRDb250ZW50SGFzaCA9PT0gY29udGVudEhhc2gsIGNhY2hlRmlsZVBhdGgsIGNvbnRlbnRIYXNoXTtcbn1cblxuY29uc3QgaW5jbHVkZVBhdHRlcm5zID0gWydzcmMvJywgJ3B1YmxpYy8nXTtcbmNvbnN0IGluY2x1ZGVTdWZmaXggPSBbXG4gICcuanMnLFxuICAnLmNqcycsXG4gICcubWpzJyxcbiAgJy5qc3gnLFxuICAnLnRzJyxcbiAgJy5jdHMnLFxuICAnLm10cycsXG4gICcudHN4JyxcbiAgJy5qc29uJyxcbiAgJy5icm93c2Vyc2xpc3RyYycsXG4gIC8vIEJlY2F1c2Ugc29tZSBidWlsZCBjb21tYW5kcyBhZmZlY3RlZCBieSBjaGFuZ2VzIGluIGBwYWNrYWdlLmpzb25gXG4gICdwYWNrYWdlLmpzb24nLFxuICAneWFybi5sb2NrJyxcbl07XG5jb25zdCBleGNsdWRlUGF0dGVybnMgPSBbJ3Rlc3QvJywgJ3Rlc3RzLycsICdfX3Rlc3RzX18vJywgJ3Rlc3QtZml4dHVyZXMvJywgJ3Rlc3QvZml4dHVyZXMvJ107XG5cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUhhc2hXaXRoRGlmZlJlc3VsdChcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+PixcbiAgaGFzaDogSGFzaFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IHJldCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKCdnaXQnLCBbJ3N0YXR1cycsICctLXBvcmNlbGFpbiddLCB7XG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIGVudjogcHJvamVjdC5lbnYsXG4gICAgICBzdGRpbzogJ3BpcGUnLFxuICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICB9KTtcbiAgICBjb25zdCBsaW5lcyA9IHJldC5zdGRvdXRcbiAgICAgIC50cmltKClcbiAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgIC5maWx0ZXIoKGxpbmUpID0+IGxpbmUubGVuZ3RoID4gMCk7XG4gICAgY29uc3QgZmlsZVBhdGhzID0gbGluZXNcbiAgICAgIC5tYXAoKGxpbmUpID0+IGxpbmUuc2xpY2UoMikudHJpbSgpKVxuICAgICAgLm1hcCgoZmlsZVBhdGgpID0+XG4gICAgICAgIHByb2plY3QuZW52LldCX0VOViA9PT0gJ3Rlc3QnID8gZmlsZVBhdGgucmVwbGFjZSgvcGFja2FnZXNcXC93YlxcL3Rlc3RcXC9maXh0dXJlc1xcL1teL10rXFwvLywgJycpIDogZmlsZVBhdGhcbiAgICAgICk7XG4gICAgY29uc3QgZmlsdGVyZWRGaWxlUGF0aHMgPSBmaWxlUGF0aHMuZmlsdGVyKFxuICAgICAgKGZpbGVQYXRoKSA9PlxuICAgICAgICAoaW5jbHVkZVBhdHRlcm5zLnNvbWUoKHBhdHRlcm4pID0+IGZpbGVQYXRoLmluY2x1ZGVzKHBhdHRlcm4pKSB8fFxuICAgICAgICAgIGluY2x1ZGVTdWZmaXguc29tZSgoc3VmZml4KSA9PiBmaWxlUGF0aC5lbmRzV2l0aChzdWZmaXgpKSkgJiZcbiAgICAgICAgIWV4Y2x1ZGVQYXR0ZXJucy5zb21lKChwYXR0ZXJuKSA9PiBmaWxlUGF0aC5pbmNsdWRlcyhwYXR0ZXJuKSlcbiAgICApO1xuICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgQ2hhbmdlZCBmaWxlczogJHtmaWx0ZXJlZEZpbGVQYXRocy5qb2luKCcsICcpfWApO1xuICAgIH1cblxuICAgIC8vICdnaXQgZGlmZiAtLScgd29ya3Mgb25seSBvbiByb290RGlyUGF0aFxuICAgIGNvbnN0IHByb2MgPSBjaGlsZF9wcm9jZXNzLnNwYXduKCdnaXQnLCBbJ2RpZmYnLCAnLS0nLCAuLi5maWx0ZXJlZEZpbGVQYXRoc10sIHsgY3dkOiBwcm9qZWN0LnJvb3REaXJQYXRoIH0pO1xuICAgIHByb2Muc3Rkb3V0Lm9uKCdkYXRhJywgKGRhdGE6IEJpbmFyeUxpa2UpID0+IHtcbiAgICAgIGhhc2gudXBkYXRlKGRhdGEpO1xuICAgICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgICBjb25zb2xlLmluZm8oJ0RhdGE6JywgZGF0YSk7XG4gICAgICAgIGNvbnNvbGUuaW5mbygnSGFzaDonLCBoYXNoLmNvcHkoKS5kaWdlc3QoJ2hleCcpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBwcm9jLm9uKCdjbG9zZScsICgpID0+IHtcbiAgICAgIHJlc29sdmUoKTtcbiAgICB9KTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgeyBzbGVlcCB9IGZyb20gJy4vc2xlZXAuanMnO1xuXG4vKipcbiAqIENvbnZlcnQgYW4gb2JqZWN0IHRvIGFuIGVycm9yLlxuICogQHBhcmFtIG9iaiBUaGUgb2JqZWN0IHRvIGNvbnZlcnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlcnJvcmlmeShvYmo6IHVua25vd24pOiBFcnJvciB7XG4gIGlmIChvYmogaW5zdGFuY2VvZiBFcnJvcikgcmV0dXJuIG9iajtcbiAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSByZXR1cm4gbmV3IEVycm9yKG9iaik7XG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihKU09OLnN0cmluZ2lmeShvYmopKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihTdHJpbmcob2JqKSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlnbm9yZUVycm9yPFQ+KGZuOiAoKSA9PiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaWdub3JlRW5vZW50PFQ+KGZuOiAoKSA9PiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgJiYgJ2NvZGUnIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFcnJvckFzeW5jPFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaWdub3JlRW5vZW50QXN5bmM8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXRyeU9wdGlvbnMge1xuICBiZWZvcmVSZXRyeT86IChlcnJvcjogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgaGFuZGxlRXJyb3I/OiAoZXJyb3I6IHVua25vd24pID0+IFByb21pc2U8dm9pZD47XG4gIHJldHJ5Q291bnQ/OiBudW1iZXI7XG4gIHJldHJ5TG9nZ2VyPzogKG1lc3NhZ2U6IHN0cmluZykgPT4gdm9pZDtcbiAgc2hvdWxkUmV0cnk/OiAoZXJyb3I6IHVua25vd24pID0+IGJvb2xlYW47XG4gIHNsZWVwTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuICB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcz86IChzbGVlcE1pbGxpc2Vjb25kczogbnVtYmVyKSA9PiBudW1iZXI7XG59XG5cbi8qKlxuICogUmV0cnkgdGhlIGdpdmVuIGZ1bmN0aW9uLlxuICogQHBhcmFtIGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJldHJ5LlxuICogQHBhcmFtIGJlZm9yZVJldHJ5IFRoZSBmdW5jdGlvbiB0byBjYWxsIGltbWVkaWF0ZWx5IGJlZm9yZSByZXRyeWluZy5cbiAqIEBwYXJhbSBoYW5kbGVFcnJvciBUaGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIGFuIGVycm9yIG9jY3Vycy5cbiAqIEBwYXJhbSByZXRyeUNvdW50IFRoZSBtYXhpbXVtIG51bWJlciBvZiByZXRyaWVzLlxuICogQHBhcmFtIHJldHJ5TG9nZ2VyIFRoZSBmdW5jdGlvbiB0byBsb2cgcmV0cnlpbmcuXG4gKiBAcGFyYW0gc2xlZXBNaWxsaXNlY29uZHMgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gc2xlZXAgYmVmb3JlIHJldHJ5aW5nLlxuICogQHBhcmFtIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzIFRoZSBmdW5jdGlvbiB0byB1cGRhdGUgc2xlZXAgbWlsbGlzZWNvbmRzIGFmdGVyIGVhY2ggcmV0cnkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3aXRoUmV0cnk8VD4oXG4gIGZ1bmM6IChmYWlsZWRDb3VudDogbnVtYmVyKSA9PiBUIHwgUHJvbWlzZTxUPixcbiAge1xuICAgIGJlZm9yZVJldHJ5LFxuICAgIGhhbmRsZUVycm9yLFxuICAgIHJldHJ5Q291bnQgPSAzLFxuICAgIHJldHJ5TG9nZ2VyLFxuICAgIHNob3VsZFJldHJ5LFxuICAgIHNsZWVwTWlsbGlzZWNvbmRzID0gMCxcbiAgICB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcyxcbiAgfTogUmV0cnlPcHRpb25zID0ge31cbik6IFByb21pc2U8VD4ge1xuICBsZXQgZmFpbGVkQ291bnQgPSAwO1xuICBmb3IgKDs7KSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmdW5jKGZhaWxlZENvdW50KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgYXdhaXQgaGFuZGxlRXJyb3I/LihlcnJvcik7XG4gICAgICBmYWlsZWRDb3VudCsrO1xuICAgICAgaWYgKGZhaWxlZENvdW50ID49IHJldHJ5Q291bnQpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBpZiAoc2hvdWxkUmV0cnkgJiYgIXNob3VsZFJldHJ5KGVycm9yKSkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGlmIChzbGVlcE1pbGxpc2Vjb25kcyA+IDApIHtcbiAgICAgICAgYXdhaXQgc2xlZXAoc2xlZXBNaWxsaXNlY29uZHMpO1xuICAgICAgfVxuICAgICAgaWYgKHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzKSB7XG4gICAgICAgIHNsZWVwTWlsbGlzZWNvbmRzID0gdXBkYXRlU2xlZXBNaWxsaXNlY29uZHMoc2xlZXBNaWxsaXNlY29uZHMpO1xuICAgICAgfVxuICAgICAgcmV0cnlMb2dnZXI/LihgUmV0cnkgZHVlIHRvOiAke2Vycm9yfVxuJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gJy0tLVxcbicgKyAoZXJyb3Iuc3RhY2sgPz8gJycpIDogJyd9YCk7XG4gICAgICBhd2FpdCBiZWZvcmVSZXRyeT8uKGVycm9yKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IFByb21pc2VQb29sIH0gZnJvbSAnbWluaW1hbC1wcm9taXNlLXBvb2wnO1xuXG5leHBvcnQgY29uc3QgcHJvbWlzZVBvb2wgPSBuZXcgUHJvbWlzZVBvb2woKTtcbiIsImltcG9ydCB7IHNwYXduQXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgaXNSdW5uaW5nT25CdW4sIHBhY2thZ2VNYW5hZ2VyV2l0aFJ1biB9IGZyb20gJy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuXG5pbnRlcmZhY2UgT3B0aW9ucyB7XG4gIGNpPzogYm9vbGVhbjtcbiAgZXhpdElmRmFpbGVkPzogYm9vbGVhbjtcbiAgb25TaWduYWw/OiAoc2lnbmFsOiBOb2RlSlMuU2lnbmFscyB8IG51bGwpID0+IHZvaWQ7XG4gIGZvcmNlQ29sb3I/OiBib29sZWFuO1xuICB0aW1lb3V0PzogbnVtYmVyO1xufVxuXG5jb25zdCBkZWZhdWx0T3B0aW9uczogT3B0aW9ucyA9IHtcbiAgZXhpdElmRmFpbGVkOiB0cnVlLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bldpdGhTcGF3bihcbiAgc2NyaXB0OiBzdHJpbmcsXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4+LFxuICBvcHRzOiBPcHRpb25zID0gZGVmYXVsdE9wdGlvbnNcbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRTY3JpcHQgPSBub3JtYWxpemVTY3JpcHQoc2NyaXB0LCBwcm9qZWN0KTtcbiAgcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgcHJvamVjdCk7XG4gIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQucnVubmFibGUsIHByb2plY3QsICdTdGFydCAocmF3KScsIHRydWUpO1xuICB9XG4gIGlmIChhcmd2LmRyeVJ1bikge1xuICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIDAsIG9wdHMpO1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgY29uc3QgcmV0ID0gYXdhaXQgc3Bhd25Bc3luYyhub3JtYWxpemVkU2NyaXB0LnJ1bm5hYmxlLCB1bmRlZmluZWQsIHtcbiAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICBlbnY6IGNvbmZpZ3VyZUVudihwcm9qZWN0LmVudiwgb3B0cyksXG4gICAgc2hlbGw6IHRydWUsXG4gICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICB0aW1lb3V0OiBvcHRzLnRpbWVvdXQsXG4gICAga2lsbE9uRXhpdDogdHJ1ZSxcbiAgICB2ZXJib3NlOiBhcmd2LnZlcmJvc2UsXG4gIH0pO1xuICBvcHRzLm9uU2lnbmFsPy4ocmV0LnNpZ25hbCk7XG4gIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIHJldC5zdGF0dXMsIG9wdHMpO1xuICByZXR1cm4gcmV0LnN0YXR1cyA/PyAxO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcnVuV2l0aFNwYXduSW5QYXJhbGxlbChcbiAgc2NyaXB0OiBzdHJpbmcsXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4+LFxuICBvcHRzOiBPcHRpb25zID0gZGVmYXVsdE9wdGlvbnNcbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIHJldHVybiBwcm9taXNlUG9vbC5ydW5BbmRXYWl0Rm9yUmV0dXJuVmFsdWUoYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRTY3JpcHQgPSBub3JtYWxpemVTY3JpcHQoc2NyaXB0LCBwcm9qZWN0KTtcbiAgICBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCBwcm9qZWN0LCAnU3RhcnQgKHBhcmFsbGVsKScsIHRydWUpO1xuICAgIGlmIChhcmd2LmRyeVJ1bikge1xuICAgICAgcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgcHJvamVjdCwgJ1N0YXJ0ZWQgKGxvZyknKTtcbiAgICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgICAgcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0LnJ1bm5hYmxlLCBwcm9qZWN0LCAnU3RhcnRlZCAocmF3KScsIHRydWUpO1xuICAgICAgfVxuICAgICAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgMCwgb3B0cyk7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBjb25zdCByZXQgPSBhd2FpdCBzcGF3bkFzeW5jKG5vcm1hbGl6ZWRTY3JpcHQucnVubmFibGUsIHVuZGVmaW5lZCwge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IGNvbmZpZ3VyZUVudihwcm9qZWN0LmVudiwgb3B0cyksXG4gICAgICBzaGVsbDogdHJ1ZSxcbiAgICAgIHN0ZGlvOiAncGlwZScsXG4gICAgICB0aW1lb3V0OiBvcHRzLnRpbWVvdXQsXG4gICAgICBtZXJnZU91dEFuZEVycm9yOiB0cnVlLFxuICAgICAga2lsbE9uRXhpdDogdHJ1ZSxcbiAgICAgIHZlcmJvc2U6IGFyZ3YudmVyYm9zZSxcbiAgICB9KTtcbiAgICBvcHRzLm9uU2lnbmFsPy4ocmV0LnNpZ25hbCk7XG4gICAgcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgcHJvamVjdCwgJ1N0YXJ0ZWQgKGxvZyknKTtcbiAgICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgICBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQucnVubmFibGUsIHByb2plY3QsICdTdGFydGVkIChyYXcpJywgdHJ1ZSk7XG4gICAgfVxuICAgIGNvbnN0IG91dCA9IHJldC5zdGRvdXQudHJpbSgpO1xuICAgIGlmIChvdXQpIHtcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKG91dCk7XG4gICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFxuJyk7XG4gICAgfVxuICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIHJldC5zdGF0dXMsIG9wdHMpO1xuICAgIHJldHVybiByZXQuc3RhdHVzID8/IDE7XG4gIH0pO1xufVxuXG4vKipcbiAqIFJlcGxhY2UgY2FwaXRhbGl6ZWQgY29tbWFuZHMgKGUuZy4sIFlBUk4sIFBSSVNNQSwgQlVOKSB3aXRoIHN1aXRhYmxlIGNvbW1hbmRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplU2NyaXB0KHNjcmlwdDogc3RyaW5nLCBwcm9qZWN0OiBQcm9qZWN0KTogeyBwcmludGFibGU6IHN0cmluZzsgcnVubmFibGU6IHN0cmluZyB9IHtcbiAgbGV0IG5ld1NjcmlwdCA9IHNjcmlwdFxuICAgIC5yZXBsYWNlQWxsKCdcXG4nLCAnJylcbiAgICAucmVwbGFjZUFsbCgvXFxzXFxzKy9nLCAnICcpXG4gICAgLnJlcGxhY2VBbGwoXG4gICAgICAnUFJJU01BIGdlbmVyYXRlICcsXG4gICAgICBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHogPyAnUFJJU01BIGdlbmVyYXRlICcgOiAnUFJJU01BIGdlbmVyYXRlIC0tbm8taGludHMgJ1xuICAgIClcbiAgICAucmVwbGFjZUFsbCgnUFJJU01BICcsIHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0eiA/ICdZQVJOIGJsaXR6IHByaXNtYSAnIDogJ1lBUk4gcHJpc21hICcpXG4gICAgLnJlcGxhY2VBbGwoJ0JVTiAnLCBwcm9qZWN0LmlzQnVuQXZhaWxhYmxlID8gJ2J1biAtLWJ1biBydW4gJyA6ICdZQVJOICcpXG4gICAgLy8gQXZvaWQgcmVwbGFjaW5nIGBZQVJOIHJ1bmAgd2l0aCBgcnVuYCBieSByZXBsYWNpbmcgYFlBUk5gIHdpdGggYCh5YXJufGJ1biAtLWJ1bikgcnVuYFxuICAgIC5yZXBsYWNlQWxsKCdZQVJOIHJ1biAnLCBpc1J1bm5pbmdPbkJ1biA/ICdidW4gLS1idW4gcnVuICcgOiAneWFybiBydW4gJyk7XG4gIGlmIChpc1J1bm5pbmdPbkJ1bikge1xuICAgIG5ld1NjcmlwdCA9IG5ld1NjcmlwdFxuICAgICAgLnJlcGxhY2VBbGwoJ1lBUk4gYnVpbGQtdHMgcnVuJywgJ2J1biAtLWJ1biBydW4nKVxuICAgICAgLnJlcGxhY2VBbGwoJ2J1biAtLWJ1biBydW4gYnVuIC0tYnVuIHJ1bicsICdidW4gLS1idW4gcnVuJylcbiAgICAgIC8vIEJlY2F1c2UgYnVuIGNhbiBydW4gc3JjL2luZGV4LnRzIGRpcmVjdGx5LlxuICAgICAgLnJlcGxhY2VBbGwoJ2Rpc3QvaW5kZXguanMnLCAnc3JjL2luZGV4LnRzJylcbiAgICAgIC5yZXBsYWNlQWxsKC8oPzpZQVJOICk/dml0ZXN0IHJ1bi9nLCAnYnVuIHRlc3QnKVxuICAgICAgLy8gJy0tYWxsb3dPbmx5JyBpcyBzb21ldGltZXMgcmVtb3ZlZC5cbiAgICAgIC5yZXBsYWNlQWxsKC8gLS1jb2xvciAtLXBhc3NXaXRoTm9UZXN0cyg/OiAtLWFsbG93T25seSk/L2csICcnKTtcbiAgfVxuICBuZXdTY3JpcHQgPSBuZXdTY3JpcHQudHJpbSgpO1xuICBjb25zdCBwcmludGFibGVTY3JpcHQgPSBmaXhCdW5Db21tYW5kKG5ld1NjcmlwdC5yZXBsYWNlQWxsKCdZQVJOICcsIGAke3BhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gYCkpO1xuICBjb25zdCBydW5uYWJsZVNjcmlwdCA9IGZpeEJ1bkNvbW1hbmQoXG4gICAgbmV3U2NyaXB0XG4gICAgICAvLyBCZWNhdXNlIHdlIG5lZWQgdG8gdXNlIGB5YXJuIHBsYXl3cmlnaHRgIGluIGEgcHJvamVjdCBkZXBlbmRpbmcgb24gYGFydGlsbGVyeS1lbmdpbmUtcGxheXdyaWdodGAuXG4gICAgICAucmVwbGFjZUFsbCgnWUFSTiBwbGF5d3JpZ2h0ICcsIGAke3BhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gcGxheXdyaWdodCBgKVxuICAgICAgLnJlcGxhY2VBbGwoJ1lBUk4gJywgIWlzUnVubmluZ09uQnVuICYmIHByb2plY3QuYmluRXhpc3RzID8gJycgOiBgJHtwYWNrYWdlTWFuYWdlcldpdGhSdW59IGApXG4gICk7XG4gIC8vIEFkZCBjYXNjYWRlIG9wdGlvbiB3aGVuIFdCX0VOViBpcyBkZWZpbmVkXG4gIGNvbnN0IGNhc2NhZGVPcHRpb24gPSBwcm9qZWN0LmVudi5XQl9FTlYgPyBgIC1jPSR7cHJvamVjdC5lbnYuV0JfRU5WIHx8ICdkZXZlbG9wbWVudCd9YCA6ICcnO1xuICByZXR1cm4ge1xuICAgIHByaW50YWJsZTogYCR7cGFja2FnZU1hbmFnZXJXaXRoUnVufSBkb3RlbnYke2Nhc2NhZGVPcHRpb259IC0tICR7cHJpbnRhYmxlU2NyaXB0fWAsXG4gICAgcnVubmFibGU6IHJ1bm5hYmxlU2NyaXB0LFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0OiBzdHJpbmcsIHByb2plY3Q6IFByb2plY3QsIHByZWZpeCA9ICdTdGFydCcsIHdlYWsgPSBmYWxzZSk6IHZvaWQge1xuICBjb25zb2xlLmluZm8oXG4gICAgJ1xcbicgK1xuICAgICAgKHdlYWsgPyBjaGFsay5ncmF5IDogY2hhbGsuY3lhbikoY2hhbGsuYm9sZChgJHtwcmVmaXh9OmApLCBub3JtYWxpemVkU2NyaXB0KSArXG4gICAgICBjaGFsay5ncmF5KGAgYXQgJHtwcm9qZWN0LmRpclBhdGh9YClcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQoXG4gIHNjcmlwdDogc3RyaW5nLFxuICBleGl0Q29kZTogbnVtYmVyIHwgbnVsbCxcbiAgb3B0czogT21pdDxPcHRpb25zLCAndGltZW91dCc+XG4pOiB2b2lkIHtcbiAgaWYgKGV4aXRDb2RlID09PSAwKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKGNoYWxrLmJvbGQoJ0ZpbmlzaGVkOicpLCBzY3JpcHQpKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsucmVkKGNoYWxrLmJvbGQoYEZhaWxlZCAoZXhpdCBjb2RlICR7ZXhpdENvZGV9KTogYCksIHNjcmlwdCkpO1xuICAgIGlmIChvcHRzLmV4aXRJZkZhaWxlZCAhPT0gZmFsc2UpIHtcbiAgICAgIHByb2Nlc3MuZXhpdChleGl0Q29kZSA/PyAxKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbmZpZ3VyZUVudihcbiAgZW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+LFxuICBvcHRzOiBPcHRpb25zXG4pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgbmV3RW52ID0geyAuLi5lbnYgfTtcbiAgaWYgKG9wdHMuY2kpIHtcbiAgICBuZXdFbnYuQ0kgPSAnMSc7XG4gIH1cbiAgaWYgKG9wdHMuZm9yY2VDb2xvcikge1xuICAgIG5ld0Vudi5GT1JDRV9DT0xPUiA9ICczJztcbiAgfVxuICByZXR1cm4gbmV3RW52O1xufVxuXG5mdW5jdGlvbiBmaXhCdW5Db21tYW5kKGNvbW1hbmQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIGNmLiBodHRwczovL2dpdGh1Yi5jb20vb3Zlbi1zaC9idW4vaXNzdWVzLzE0MzU5XG4gIHJldHVybiBjb21tYW5kLmluY2x1ZGVzKCduZXh0IGRldicpIHx8XG4gICAgLy8gY2YuIGh0dHBzOi8vZ2l0aHViLmNvbS9vdmVuLXNoL2J1bi9pc3N1ZXMvODIyMlxuICAgIGNvbW1hbmQuaW5jbHVkZXMoJ3BsYXl3cmlnaHQnKSB8fFxuICAgIC8vIFwiYnVuIC0tYnVuIHByaXNtYSBnZW5lcmF0ZVwiIGRvZXNuJ3Qgd29ya1xuICAgIGNvbW1hbmQuaW5jbHVkZXMoJ3ByaXNtYScpIHx8XG4gICAgY29tbWFuZC5pbmNsdWRlcygndGVzdC9lMmUtYWRkaXRpb25hbCcpXG4gICAgPyBjb21tYW5kLnJlcGxhY2VBbGwoJ2J1biAtLWJ1bicsICdidW4nKVxuICAgIDogY29tbWFuZDtcbn1cbiIsImltcG9ydCB7IHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgdHlwZSB7IEVudlJlYWRlck9wdGlvbnMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5cbmV4cG9ydCBjb25zdCBzaGFyZWRPcHRpb25zQnVpbGRlciA9IHtcbiAgLi4ueWFyZ3NPcHRpb25zQnVpbGRlckZvckVudixcbiAgLy8gVGhpcyBvcHRpb24gaXMgZm9yIGRlYnVnZ2luZyBtYWlubHkuXG4gICd3b3JraW5nLWRpcic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0Egd29ya2luZyBkaXJlY3RvcnknLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAndycsXG4gIH0sXG4gICdkcnktcnVuJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBza2lwIGFjdHVhbCBjb21tYW5kIGV4ZWN1dGlvbicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGFsaWFzOiBbJ2RyeScsICdkJ10sXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGFyZ3M6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3Qgb3B0aW9uTmFtZSBvZiBPYmplY3Qua2V5cyh5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52KSkge1xuICAgIGNvbnN0IHZhbHVlID0gZ2V0T3B0aW9uVmFsdWUoYXJndiwgb3B0aW9uTmFtZSk7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICBhcmdzLnB1c2godmFsdWUgPyBgLS0ke29wdGlvbk5hbWV9YCA6IGAtLSR7b3B0aW9uTmFtZX09ZmFsc2VgKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICBhcmdzLnB1c2goYC0tJHtvcHRpb25OYW1lfT0ke3ZhbHVlfWApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHZhbHVlKSB7XG4gICAgICAgIGFyZ3MucHVzaChgLS0ke29wdGlvbk5hbWV9PSR7aXRlbX1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGFyZ3M7XG59XG5cbmZ1bmN0aW9uIGdldE9wdGlvblZhbHVlKGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsIG9wdGlvbk5hbWU6IHN0cmluZyk6IHVua25vd24ge1xuICBjb25zdCBjYW1lbENhc2VPcHRpb25OYW1lID0gb3B0aW9uTmFtZS5yZXBsYWNlQWxsKC8tKFthLXpdKS9nLCAoXywgY2hhcmFjdGVyOiBzdHJpbmcpID0+IGNoYXJhY3Rlci50b1VwcGVyQ2FzZSgpKTtcbiAgY29uc3Qgb3B0aW9ucyA9IGFyZ3YgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHJldHVybiBvcHRpb25zW29wdGlvbk5hbWVdID8/IG9wdGlvbnNbY2FtZWxDYXNlT3B0aW9uTmFtZV07XG59XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgY29uc3RhbnRzIH0gZnJvbSAnbm9kZTpvcyc7XG5cbmltcG9ydCB7IHRyZWVLaWxsIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0LCB0eXBlIFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGNvbmZpZ3VyZUVudiwgbm9ybWFsaXplU2NyaXB0IH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gICdraWxsLW90aGVycyc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0tpbGwgb3RoZXIgY29tbWFuZHMgd2hlbiBvbmUgY29tbWFuZCBleGl0cycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICAna2lsbC1vdGhlcnMtb24tZmFpbCc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0tpbGwgb3RoZXIgY29tbWFuZHMgd2hlbiBvbmUgY29tbWFuZCBmYWlscycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICBzdWNjZXNzOiB7XG4gICAgZGVzY3JpcHRpb246ICdEZWZpbmUgc3VjY2Vzc2Z1bCBjb21wbGV0aW9uIGNyaXRlcmlhJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBjaG9pY2VzOiBbJ2FsbCcsICdmaXJzdCddLFxuICAgIGRlZmF1bHQ6ICdhbGwnLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgYXJndW1lbnRzQnVpbGRlciA9IHtcbiAgY29tbWFuZHM6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0NvbW1hbmRzIHRvIHJ1biBjb25jdXJyZW50bHknLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5pbnRlcmZhY2UgUnVuQ29uY3VycmVudGx5T3B0aW9ucyB7XG4gIGNvbW1hbmRzOiBzdHJpbmdbXTtcbiAgcHJvamVjdDogUHJvamVjdDtcbiAga2lsbE90aGVyczogYm9vbGVhbjtcbiAga2lsbE90aGVyc09uRmFpbDogYm9vbGVhbjtcbiAgc3VjY2VzczogJ2FsbCcgfCAnZmlyc3QnO1xuICBjaT86IGJvb2xlYW47XG4gIGZvcmNlQ29sb3I/OiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgY29uY3VycmVudGx5Q29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ2NvbmN1cnJlbnRseSA8Y29tbWFuZHMuLi4+JyxcbiAgZGVzY3JpYmU6ICdSdW4gY29tbWFuZHMgY29uY3VycmVudGx5JyxcbiAgYnVpbGRlcjogeyAuLi5zaGFyZWRPcHRpb25zQnVpbGRlciwgLi4uYnVpbGRlciwgLi4uYXJndW1lbnRzQnVpbGRlciB9LFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ1RoaXMgY29tbWFuZCBpcyBub3Qgc3VwcG9ydGVkIG9uIFdpbmRvd3MuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IHByb2plY3QgPSBmaW5kU2VsZlByb2plY3QoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0KSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3QgY29tbWFuZHMgPSAoYXJndi5jb21tYW5kcyA/PyBbXSkubWFwKFN0cmluZykuZmlsdGVyKEJvb2xlYW4pO1xuICAgIGlmIChjb21tYW5kcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBjb21tYW5kcyBwcm92aWRlZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcnVuQ29uY3VycmVudGx5KHtcbiAgICAgICAgY29tbWFuZHMsXG4gICAgICAgIHByb2plY3QsXG4gICAgICAgIGtpbGxPdGhlcnM6IGFyZ3Yua2lsbE90aGVycyA/PyBmYWxzZSxcbiAgICAgICAga2lsbE90aGVyc09uRmFpbDogYXJndi5raWxsT3RoZXJzT25GYWlsID8/IGZhbHNlLFxuICAgICAgICBzdWNjZXNzOiBhcmd2LnN1Y2Nlc3MsXG4gICAgICAgIGNpOiB0eXBlb2YgYXJndi5jaSA9PT0gJ2Jvb2xlYW4nID8gYXJndi5jaSA6IHVuZGVmaW5lZCxcbiAgICAgICAgZm9yY2VDb2xvcjogdHlwZW9mIGFyZ3YuZm9yY2VDb2xvciA9PT0gJ2Jvb2xlYW4nID8gYXJndi5mb3JjZUNvbG9yIDogdW5kZWZpbmVkLFxuICAgICAgfSk7XG4gICAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcikpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuQ29uY3VycmVudGx5KG9wdGlvbnM6IFJ1bkNvbmN1cnJlbnRseU9wdGlvbnMpOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zdCBjaGlsZHJlbiA9IG9wdGlvbnMuY29tbWFuZHMubWFwKChjb21tYW5kKSA9PlxuICAgIGNoaWxkX3Byb2Nlc3Muc3Bhd24obm9ybWFsaXplU2NyaXB0KGNvbW1hbmQsIG9wdGlvbnMucHJvamVjdCkucnVubmFibGUsIHtcbiAgICAgIGN3ZDogb3B0aW9ucy5wcm9qZWN0LmRpclBhdGgsXG4gICAgICBkZXRhY2hlZDogdHJ1ZSxcbiAgICAgIGVudjogY29uZmlndXJlRW52KG9wdGlvbnMucHJvamVjdC5lbnYsIHsgY2k6IG9wdGlvbnMuY2ksIGZvcmNlQ29sb3I6IG9wdGlvbnMuZm9yY2VDb2xvciB9KSxcbiAgICAgIHNoZWxsOiB0cnVlLFxuICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICB9KVxuICApO1xuXG4gIGxldCBzdG9wcGluZyA9IGZhbHNlO1xuICBsZXQgaW50ZXJydXB0ZWRTaWduYWw6IE5vZGVKUy5TaWduYWxzIHwgdW5kZWZpbmVkO1xuICBsZXQgZmlyc3RSZXN1bHQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgbGV0IHN0b3BSZXN1bHQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgY29uc3QgcmVzdWx0cyA9IEFycmF5LmZyb208bnVtYmVyIHwgdW5kZWZpbmVkPih7IGxlbmd0aDogY2hpbGRyZW4ubGVuZ3RoIH0pO1xuICBjb25zdCB3YWl0Rm9yRXhpdFByb21pc2VzID0gY2hpbGRyZW4ubWFwKChjaGlsZCwgaW5kZXgpID0+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgIGxldCBzZXR0bGVkID0gZmFsc2U7XG4gICAgICBjb25zdCBzZXR0bGUgPSAoZXhpdENvZGU6IG51bWJlcik6IHZvaWQgPT4ge1xuICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuO1xuXG4gICAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgICByZXN1bHRzW2luZGV4XSA9IGV4aXRDb2RlO1xuICAgICAgICBmaXJzdFJlc3VsdCA/Pz0gZXhpdENvZGU7XG5cbiAgICAgICAgaWYgKCFzdG9wcGluZyAmJiBzaG91bGRTdG9wT3RoZXJzKGV4aXRDb2RlLCBvcHRpb25zKSkge1xuICAgICAgICAgIHN0b3BSZXN1bHQgPSBleGl0Q29kZTtcbiAgICAgICAgICBzdG9wcGluZyA9IHRydWU7XG4gICAgICAgICAgdGVybWluYXRlQ2hpbGRyZW4oY2hpbGRyZW4pO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH07XG5cbiAgICAgIGNoaWxkLm9uY2UoJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBzdGFydCBjaGlsZCBwcm9jZXNzOicsIGVycm9yKTtcbiAgICAgICAgc2V0dGxlKDEpO1xuICAgICAgfSk7XG4gICAgICBjaGlsZC5vbmNlKCdleGl0JywgKGNvZGUsIHNpZ25hbCkgPT4ge1xuICAgICAgICBzZXR0bGUoZ2V0RXhpdENvZGUoY29kZSA/PyB1bmRlZmluZWQsIHNpZ25hbCA/PyB1bmRlZmluZWQpKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBjb25zdCBzdG9wQWxsID0gKHNpZ25hbDogTm9kZUpTLlNpZ25hbHMpOiB2b2lkID0+IHtcbiAgICBpbnRlcnJ1cHRlZFNpZ25hbCA/Pz0gc2lnbmFsO1xuICAgIGlmIChzdG9wcGluZykgcmV0dXJuO1xuXG4gICAgc3RvcHBpbmcgPSB0cnVlO1xuICAgIHRlcm1pbmF0ZUNoaWxkcmVuKGNoaWxkcmVuKTtcbiAgfTtcbiAgY29uc3Qgc3RvcE9uU2lnaW50ID0gKCk6IHZvaWQgPT4ge1xuICAgIHN0b3BBbGwoJ1NJR0lOVCcpO1xuICB9O1xuICBjb25zdCBzdG9wT25TaWd0ZXJtID0gKCk6IHZvaWQgPT4ge1xuICAgIHN0b3BBbGwoJ1NJR1RFUk0nKTtcbiAgfTtcbiAgY29uc3Qgc3RvcE9uU2lncXVpdCA9ICgpOiB2b2lkID0+IHtcbiAgICBzdG9wQWxsKCdTSUdRVUlUJyk7XG4gIH07XG4gIHByb2Nlc3Mub24oJ1NJR0lOVCcsIHN0b3BPblNpZ2ludCk7XG4gIHByb2Nlc3Mub24oJ1NJR1RFUk0nLCBzdG9wT25TaWd0ZXJtKTtcbiAgcHJvY2Vzcy5vbignU0lHUVVJVCcsIHN0b3BPblNpZ3F1aXQpO1xuICB0cnkge1xuICAgIGF3YWl0IFByb21pc2UuYWxsKHdhaXRGb3JFeGl0UHJvbWlzZXMpO1xuICB9IGZpbmFsbHkge1xuICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ1NJR0lOVCcsIHN0b3BPblNpZ2ludCk7XG4gICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignU0lHVEVSTScsIHN0b3BPblNpZ3Rlcm0pO1xuICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ1NJR1FVSVQnLCBzdG9wT25TaWdxdWl0KTtcbiAgfVxuXG4gIGlmIChpbnRlcnJ1cHRlZFNpZ25hbCkge1xuICAgIHJldHVybiBnZXRFeGl0Q29kZSh1bmRlZmluZWQsIGludGVycnVwdGVkU2lnbmFsKTtcbiAgfVxuXG4gIGlmIChvcHRpb25zLnN1Y2Nlc3MgPT09ICdmaXJzdCcpIHtcbiAgICByZXR1cm4gZmlyc3RSZXN1bHQgPz8gMTtcbiAgfVxuICBpZiAoc3RvcFJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHN0b3BSZXN1bHQ7XG4gIH1cbiAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVzdWx0cykge1xuICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCAmJiByZXN1bHQgIT09IDApIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICB9XG4gIHJldHVybiAwO1xufVxuXG5mdW5jdGlvbiBnZXRFeGl0Q29kZShjb2RlOiBudW1iZXIgfCB1bmRlZmluZWQsIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMgfCB1bmRlZmluZWQpOiBudW1iZXIge1xuICBpZiAoY29kZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGNvZGU7XG4gIH1cbiAgaWYgKHNpZ25hbCAmJiBzaWduYWwgaW4gY29uc3RhbnRzLnNpZ25hbHMpIHtcbiAgICByZXR1cm4gMTI4ICsgY29uc3RhbnRzLnNpZ25hbHNbc2lnbmFsXTtcbiAgfVxuICByZXR1cm4gMTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkU3RvcE90aGVycyhcbiAgZXhpdENvZGU6IG51bWJlcixcbiAgb3B0aW9uczogUGljazxSdW5Db25jdXJyZW50bHlPcHRpb25zLCAna2lsbE90aGVycycgfCAna2lsbE90aGVyc09uRmFpbCcgfCAnc3VjY2Vzcyc+XG4pOiBib29sZWFuIHtcbiAgcmV0dXJuIG9wdGlvbnMuc3VjY2VzcyA9PT0gJ2ZpcnN0JyB8fCBvcHRpb25zLmtpbGxPdGhlcnMgfHwgKG9wdGlvbnMua2lsbE90aGVyc09uRmFpbCAmJiBleGl0Q29kZSAhPT0gMCk7XG59XG5cbmZ1bmN0aW9uIHRlcm1pbmF0ZUNoaWxkcmVuKGNoaWxkcmVuOiBjaGlsZF9wcm9jZXNzLkNoaWxkUHJvY2Vzc1tdKTogdm9pZCB7XG4gIGZvciAoY29uc3QgY2hpbGQgb2YgY2hpbGRyZW4pIHtcbiAgICBpZiAoIWNoaWxkLnBpZCkgY29udGludWU7XG5cbiAgICB0cnkge1xuICAgICAga2lsbFByb2Nlc3NHcm91cChjaGlsZC5waWQpO1xuICAgICAgdHJlZUtpbGwoY2hpbGQucGlkKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8ga2lsbCBjaGlsZCBwcm9jZXNzOicsIGVycm9yKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24ga2lsbFByb2Nlc3NHcm91cChwaWQ6IG51bWJlcik6IHZvaWQge1xuICB0cnkge1xuICAgIHByb2Nlc3Mua2lsbCgtcGlkLCAnU0lHVEVSTScpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChpc05vU3VjaFByb2Nlc3NFcnJvcihlcnJvcikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNOb1N1Y2hQcm9jZXNzRXJyb3IoZXJyb3I6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgIT09IG51bGwgJiYgJ2NvZGUnIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT09ICdFU1JDSCc7XG59XG4iLCJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IGtpbGxQb3J0UHJvY2VzcyBmcm9tICdraWxsLXBvcnQnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmRTZWxmUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IGlzQ0kgfSBmcm9tICcuLi91dGlscy9jaS5qcyc7XG5cbmNvbnN0IGtpbGxQb3J0SWZOb25DaUJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IGtpbGxQb3J0SWZOb25DaUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8XG4gIHVua25vd24sXG4gIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGtpbGxQb3J0SWZOb25DaUJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAna2lsbC1wb3J0LWlmLW5vbi1jaScsXG4gIGRlc2NyaWJlOiAnS2lsbCB0aGUgcG9ydCBzcGVjaWZpZWQgYnkgUE9SVCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpZiBub24tQ0kuJyxcbiAgYnVpbGRlcjoga2lsbFBvcnRJZk5vbkNpQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgYXdhaXQga2lsbFBvcnRJZk5vbkNpKGFyZ3YpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGtpbGxQb3J0SWZOb25DaShcbiAgYXJndjogQXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGtpbGxQb3J0SWZOb25DaUJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+PlxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHByb2plY3QgPSBmaW5kU2VsZlByb2plY3QoYXJndik7XG4gIGlmICghcHJvamVjdCkge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBpZiAoaXNDSShwcm9qZWN0LmVudi5DSSkpIHtcbiAgICBjb25zb2xlLmluZm8oYFNraXAga2lsbGluZyBwb3J0IGR1ZSB0byBDSTogJHtwcm9qZWN0LmVudi5DSX1gKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBwb3J0RW52ID0gcHJvamVjdC5lbnYuUE9SVDtcbiAgY29uc3QgcG9ydCA9IE51bWJlcihwb3J0RW52KTtcbiAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHBvcnQpIHx8IHBvcnQgPD0gMCkge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGBQT1JUIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIGludmFsaWQ6ICR7cG9ydEVudn1gKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgY29uc29sZS5pbmZvKGBLaWxsaW5nIHRoZSBwb3J0OiAke3BvcnR9YCk7XG4gIHRyeSB7XG4gICAgYXdhaXQga2lsbFBvcnRQcm9jZXNzKHBvcnQpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBidWlsZFNoZWxsQ29tbWFuZChhcmdzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIHJldHVybiBhcmdzLm1hcCgoYXJnKSA9PiBzaGVsbEVzY2FwZUFyZ3VtZW50KGFyZykpLmpvaW4oJyAnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU2hlbGxFbnZpcm9ubWVudEFzc2lnbm1lbnQobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke25hbWV9PSR7c2hlbGxFc2NhcGVBcmd1bWVudCh2YWx1ZSl9YDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNoZWxsRXNjYXBlQXJndW1lbnQoYXJnOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gL15bXFx3Li86PSxAJSstXSskL3UudGVzdChhcmcpID8gYXJnIDogYCcke2FyZy5yZXBsYWNlQWxsKFwiJ1wiLCBgJ1wiJ1wiJ2ApfSdgO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgYnVpbGRTaGVsbENvbW1hbmQgfSBmcm9tICcuLi91dGlscy9zaGVsbC5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIGZpeDoge1xuICAgIGRlc2NyaXB0aW9uOiAnRml4IHRoZSBsaW50aW5nIGVycm9ycycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICBmb3JtYXQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0Zvcm1hdCB0aGUgY29kZScsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICBxdWlldDoge1xuICAgIGRlc2NyaXB0aW9uOiAnUmVwb3J0IGVycm9ycyBvbmx5JyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBfYXJndW1lbnRzQnVpbGRlciA9IHtcbiAgZmlsZXM6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0ZpbGUgYW5kIGRpcmVjdG9yeSBwYXRocyB0byBsaW50JyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgTGludENvbW1hbmRPcHRpb25zID0gSW5mZXJyZWRPcHRpb25UeXBlczxcbiAgdHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXIgJiB0eXBlb2YgX2FyZ3VtZW50c0J1aWxkZXJcbj47XG5leHBvcnQgdHlwZSBMaW50Q29tbWFuZEFyZ3YgPSBBcmd1bWVudHNDYW1lbENhc2U8TGludENvbW1hbmRPcHRpb25zPiAmIHsgJy0tJz86IHVua25vd25bXTsgXzogdW5rbm93bltdIH07XG5cbmNvbnN0IGJpb21lRXh0ZW5zaW9ucyA9IG5ldyBTZXQoW1xuICAnYXN0cm8nLFxuICAnY2pzJyxcbiAgJ2NzcycsXG4gICdjdHMnLFxuICAnZ3FsJyxcbiAgJ2h0bScsXG4gICdodG1sJyxcbiAgJ2pzJyxcbiAgJ2pzb24nLFxuICAnanNvbjUnLFxuICAnanNvbmMnLFxuICAnanN4JyxcbiAgJ21qcycsXG4gICdtdHMnLFxuICAnc3ZlbHRlJyxcbiAgJ3RzJyxcbiAgJ3RzeCcsXG4gICd2dWUnLFxuICAneWFtbCcsXG4gICd5bWwnLFxuXSk7XG5jb25zdCBlc2xpbnRFeHRlbnNpb25zID0gbmV3IFNldChbJ2NqcycsICdjdHMnLCAnanMnLCAnanN4JywgJ21qcycsICdtdHMnLCAndHMnLCAndHN4J10pO1xuY29uc3Qgb3hsaW50RXh0ZW5zaW9ucyA9IG5ldyBTZXQoWy4uLmVzbGludEV4dGVuc2lvbnMsICdhc3RybycsICdzdmVsdGUnLCAndnVlJ10pO1xuY29uc3QgcHl0aG9uRXh0ZW5zaW9ucyA9IG5ldyBTZXQoWydweSddKTtcbmNvbnN0IGRhcnRFeHRlbnNpb25zID0gbmV3IFNldChbJ2RhcnQnXSk7XG5jb25zdCBveGZtdEV4dGVuc2lvbnMgPSBuZXcgU2V0KFtcbiAgLi4ub3hsaW50RXh0ZW5zaW9ucyxcbiAgJ2NzcycsXG4gICdncWwnLFxuICAnZ3JhcGhxbCcsXG4gICdoYnMnLFxuICAnaHRtJyxcbiAgJ2h0bWwnLFxuICAnanNvbicsXG4gICdqc29uNScsXG4gICdqc29uYycsXG4gICdsZXNzJyxcbiAgJ21kJyxcbiAgJ21keCcsXG4gICdzY3NzJyxcbiAgJ3RvbWwnLFxuICAneWFtbCcsXG4gICd5bWwnLFxuXSk7XG5jb25zdCBwcmV0dGllckV4dGVuc2lvbnMgPSBuZXcgU2V0KFtcbiAgJ2NqcycsXG4gICdjc3MnLFxuICAnY3RzJyxcbiAgJ2h0bScsXG4gICdodG1sJyxcbiAgJ2phdmEnLFxuICAnanMnLFxuICAnanNvbicsXG4gICdqc29uNScsXG4gICdqc29uYycsXG4gICdqc3gnLFxuICAnbWQnLFxuICAnbWpzJyxcbiAgJ210cycsXG4gICdzY3NzJyxcbiAgJ3RzJyxcbiAgJ3RzeCcsXG4gICd2dWUnLFxuICAneWFtbCcsXG4gICd5bWwnLFxuXSk7XG5jb25zdCBwcmV0dGllck9ubHlFeHRlbnNpb25zID0gbmV3IFNldChbLi4ucHJldHRpZXJFeHRlbnNpb25zXS5maWx0ZXIoKGV4dCkgPT4gIWJpb21lRXh0ZW5zaW9ucy5oYXMoZXh0KSkpO1xuY29uc3QgcHJldHRpZXJGaXh0dXJlSWdub3JlUGF0dGVybiA9ICchKiovdGVzdHstLC99Zml4dHVyZXMvKionO1xuXG5leHBvcnQgY29uc3QgbGludENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgTGludENvbW1hbmRPcHRpb25zPiA9IHtcbiAgY29tbWFuZDogJ2xpbnQgW2ZpbGVzLi4uXScsXG4gIGRlc2NyaWJlOiAnTGludCBjb2RlJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBsaW50KGFyZ3YgYXMgTGludENvbW1hbmRBcmd2KTtcbiAgICBpZiAoZXhpdENvZGUpIHByb2Nlc3MuZXhpdChleGl0Q29kZSk7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGludChhcmd2OiBMaW50Q29tbWFuZEFyZ3YpOiBQcm9taXNlPG51bWJlcj4ge1xuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdUaGlzIGNvbW1hbmQgaXMgbm90IHN1cHBvcnRlZCBvbiBXaW5kb3dzLicpKTtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2LCBmYWxzZSk7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICBjb25zdCBmaWxlcyA9IGdldExpbnRUYXJnZXRGaWxlcyhhcmd2KTtcbiAgY29uc3QgbGludEZpbGVQYXRoc0J5UHJvamVjdCA9IG5ldyBNYXA8UHJvamVjdCwgc3RyaW5nW10+KCk7XG4gIGNvbnN0IG94Zm10RmlsZVBhdGhzQnlQcm9qZWN0ID0gbmV3IE1hcDxQcm9qZWN0LCBzdHJpbmdbXT4oKTtcbiAgY29uc3QgcHl0aG9uRmlsZVBhdGhzQnlQcm9qZWN0ID0gbmV3IE1hcDxQcm9qZWN0LCBzdHJpbmdbXT4oKTtcbiAgY29uc3QgZGFydEZpbGVQYXRoc0J5UHJvamVjdCA9IG5ldyBNYXA8UHJvamVjdCwgc3RyaW5nW10+KCk7XG4gIGNvbnN0IHByZXR0aWVyRmlsZVBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBwYWNrYWdlSnNvbkZpbGVQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgbGV0IG1pc3NpbmdMaW50VG9vbEZvckV4cGxpY2l0RmlsZXMgPSBmYWxzZTtcbiAgbGV0IHByZXR0aWVyQXJnczogc3RyaW5nW107XG4gIGxldCBzb3J0UGFja2FnZUpzb25BcmdzOiBzdHJpbmdbXTtcbiAgaWYgKGZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBsaW50VGFyZ2V0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgZmlsZXMubWFwKGFzeW5jIChmaWxlKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGZpbGUpO1xuICAgICAgICBjb25zdCBmaWxlS2luZCA9IGF3YWl0IGdldExpbnRUYXJnZXRGaWxlS2luZChmaWxlUGF0aCk7XG4gICAgICAgIHJldHVybiB7IGZpbGVLaW5kLCBmaWxlUGF0aCB9O1xuICAgICAgfSlcbiAgICApO1xuICAgIGZvciAoY29uc3QgeyBmaWxlS2luZCwgZmlsZVBhdGggfSBvZiBsaW50VGFyZ2V0cykge1xuICAgICAgaWYgKFxuICAgICAgICBmaWxlUGF0aC5lbmRzV2l0aCgnL3Rlc3QvZml4dHVyZXMnKSB8fFxuICAgICAgICBmaWxlUGF0aC5pbmNsdWRlcygnL3Rlc3QvZml4dHVyZXMvJykgfHxcbiAgICAgICAgZmlsZVBhdGguZW5kc1dpdGgoJy90ZXN0LWZpeHR1cmVzJykgfHxcbiAgICAgICAgZmlsZVBhdGguaW5jbHVkZXMoJy90ZXN0LWZpeHR1cmVzLycpXG4gICAgICApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IHBhdGguZXh0bmFtZShmaWxlUGF0aCkuc2xpY2UoMSk7XG4gICAgICBpZiAoZmlsZVBhdGguZW5kc1dpdGgoJy9wYWNrYWdlLmpzb24nKSkge1xuICAgICAgICBwYWNrYWdlSnNvbkZpbGVQYXRocy5wdXNoKGZpbGVQYXRoKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBwYWNrYWdlSnNvbkZpbGVQYXRocy5wdXNoKC4uLmdldEV4cGxpY2l0UGFja2FnZUpzb25QYXRocyhwcm9qZWN0cy5kZXNjZW5kYW50cywgZmlsZVBhdGgsIGZpbGVLaW5kKSk7XG5cbiAgICAgIGZvciAoY29uc3QgeyBsaW50UGF0aCwgcHJvamVjdCB9IG9mIGdldEV4cGxpY2l0TGludFRhcmdldHMocHJvamVjdHMuZGVzY2VuZGFudHMsIGZpbGVQYXRoLCBmaWxlS2luZCkpIHtcbiAgICAgICAgaWYgKHByb2plY3QuaGFzUG9ldHJ5TG9jayAmJiAoZmlsZUtpbmQgPT09ICdkaXJlY3RvcnknIHx8IHB5dGhvbkV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikpKSB7XG4gICAgICAgICAgY29uc3QgcHl0aG9uRmlsZVBhdGhzID0gcHl0aG9uRmlsZVBhdGhzQnlQcm9qZWN0LmdldChwcm9qZWN0KSA/PyBbXTtcbiAgICAgICAgICBweXRob25GaWxlUGF0aHMucHVzaChsaW50UGF0aCk7XG4gICAgICAgICAgcHl0aG9uRmlsZVBhdGhzQnlQcm9qZWN0LnNldChwcm9qZWN0LCBweXRob25GaWxlUGF0aHMpO1xuICAgICAgICAgIGlmIChmaWxlS2luZCAhPT0gJ2RpcmVjdG9yeScpIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9qZWN0Lmhhc1B1YnNwZWNZYW1sICYmIChmaWxlS2luZCA9PT0gJ2RpcmVjdG9yeScgfHwgZGFydEV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikpKSB7XG4gICAgICAgICAgY29uc3QgZGFydEZpbGVQYXRocyA9IGRhcnRGaWxlUGF0aHNCeVByb2plY3QuZ2V0KHByb2plY3QpID8/IFtdO1xuICAgICAgICAgIGRhcnRGaWxlUGF0aHMucHVzaChsaW50UGF0aCk7XG4gICAgICAgICAgZGFydEZpbGVQYXRoc0J5UHJvamVjdC5zZXQocHJvamVjdCwgZGFydEZpbGVQYXRocyk7XG4gICAgICAgICAgaWYgKGZpbGVLaW5kICE9PSAnZGlyZWN0b3J5JykgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHByb2plY3QucHJlZmVycmVkTGludGVyID09PSAnYmlvbWUnIHx8XG4gICAgICAgICAgZmlsZUtpbmQgPT09ICdkaXJlY3RvcnknIHx8XG4gICAgICAgICAgc3VwcG9ydHNMaW50aW5nRXh0ZW5zaW9uKHByb2plY3QsIGV4dGVuc2lvbilcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgbGludEZpbGVQYXRocyA9IGxpbnRGaWxlUGF0aHNCeVByb2plY3QuZ2V0KHByb2plY3QpID8/IFtdO1xuICAgICAgICAgIGxpbnRGaWxlUGF0aHMucHVzaChsaW50UGF0aCk7XG4gICAgICAgICAgbGludEZpbGVQYXRoc0J5UHJvamVjdC5zZXQocHJvamVjdCwgbGludEZpbGVQYXRocyk7XG4gICAgICAgICAgZm9yIChjb25zdCBmb3JtYXR0ZXJQYXRoIG9mIGJ1aWxkRXhwbGljaXRGb3JtYXR0ZXJBcmdzKHByb2plY3QsIGxpbnRQYXRoLCBmaWxlS2luZCwgZXh0ZW5zaW9uKSkge1xuICAgICAgICAgICAgaWYgKHByb2plY3QuaGFzT3hmbXQpIHtcbiAgICAgICAgICAgICAgY29uc3Qgb3hmbXRGaWxlUGF0aHMgPSBveGZtdEZpbGVQYXRoc0J5UHJvamVjdC5nZXQocHJvamVjdCkgPz8gW107XG4gICAgICAgICAgICAgIG94Zm10RmlsZVBhdGhzLnB1c2goZm9ybWF0dGVyUGF0aCk7XG4gICAgICAgICAgICAgIG94Zm10RmlsZVBhdGhzQnlQcm9qZWN0LnNldChwcm9qZWN0LCBveGZtdEZpbGVQYXRocyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBwcmV0dGllckZpbGVQYXRocy5wdXNoKGZvcm1hdHRlclBhdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChwcmV0dGllckV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikgfHwgb3hmbXRFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pKSB7XG4gICAgICAgICAgaWYgKHByb2plY3QuaGFzT3hmbXQgJiYgb3hmbXRFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pKSB7XG4gICAgICAgICAgICBjb25zdCBveGZtdEZpbGVQYXRocyA9IG94Zm10RmlsZVBhdGhzQnlQcm9qZWN0LmdldChwcm9qZWN0KSA/PyBbXTtcbiAgICAgICAgICAgIG94Zm10RmlsZVBhdGhzLnB1c2gobGludFBhdGgpO1xuICAgICAgICAgICAgb3hmbXRGaWxlUGF0aHNCeVByb2plY3Quc2V0KHByb2plY3QsIG94Zm10RmlsZVBhdGhzKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHByZXR0aWVyRXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSkge1xuICAgICAgICAgICAgcHJldHRpZXJGaWxlUGF0aHMucHVzaChsaW50UGF0aCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGlzUG90ZW50aWFsTGludFRhcmdldChleHRlbnNpb24pICYmICFwcm9qZWN0LnByZWZlcnJlZExpbnRlcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGBObyBsaW50ZXIgZm91bmQgZm9yICR7cHJvamVjdC5uYW1lfS4gSW5zdGFsbCBFU0xpbnQgb3IgQmlvbWUuYCkpO1xuICAgICAgICAgIG1pc3NpbmdMaW50VG9vbEZvckV4cGxpY2l0RmlsZXMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHByZXR0aWVyQXJncyA9IFsuLi5uZXcgU2V0KHByZXR0aWVyRmlsZVBhdGhzKV07XG4gICAgc29ydFBhY2thZ2VKc29uQXJncyA9IFsuLi5uZXcgU2V0KHBhY2thZ2VKc29uRmlsZVBhdGhzKV07XG4gIH0gZWxzZSB7XG4gICAgcHJldHRpZXJBcmdzID0gYnVpbGRQcmV0dGllckFyZ3MocHJvamVjdHMuc2VsZi5kaXJQYXRoLCBwcm9qZWN0cy5kZXNjZW5kYW50cyk7XG4gICAgc29ydFBhY2thZ2VKc29uQXJncyA9IHByb2plY3RzLmRlc2NlbmRhbnRzLm1hcCgocCkgPT4gcC5wYWNrYWdlSnNvblBhdGgpO1xuICB9XG5cbiAgY29uc3QgbGludFByb21pc2VzOiBQcm9taXNlPG51bWJlcj5bXSA9IFtdO1xuICBjb25zdCBsaW50UnVuT3B0aW9ucyA9IHsgZXhpdElmRmFpbGVkOiBmYWxzZSwgZm9yY2VDb2xvcjogdHJ1ZSB9IGFzIGNvbnN0O1xuICBpZiAoZmlsZXMubGVuZ3RoID4gMCkge1xuICAgIGZvciAoY29uc3QgW3Byb2plY3QsIGxpbnRGaWxlUGF0aHNdIG9mIGxpbnRGaWxlUGF0aHNCeVByb2plY3QpIHtcbiAgICAgIGNvbnN0IGxpbnRDb21tYW5kID0gYnVpbGRMaW50Q29tbWFuZChwcm9qZWN0LCBhcmd2LCBsaW50RmlsZVBhdGhzKTtcbiAgICAgIGlmICghbGludENvbW1hbmQpIGNvbnRpbnVlO1xuXG4gICAgICBsaW50UHJvbWlzZXMucHVzaChydW5XaXRoU3Bhd25JblBhcmFsbGVsKGxpbnRDb21tYW5kLCBwcm9qZWN0LCBhcmd2LCBsaW50UnVuT3B0aW9ucykpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtwcm9qZWN0LCBveGZtdEZpbGVQYXRoc10gb2Ygb3hmbXRGaWxlUGF0aHNCeVByb2plY3QpIHtcbiAgICAgIGxpbnRQcm9taXNlcy5wdXNoKHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoYnVpbGRPeGZtdENvbW1hbmQob3hmbXRGaWxlUGF0aHMpLCBwcm9qZWN0LCBhcmd2LCBsaW50UnVuT3B0aW9ucykpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtwcm9qZWN0LCBweXRob25GaWxlUGF0aHNdIG9mIHB5dGhvbkZpbGVQYXRoc0J5UHJvamVjdCkge1xuICAgICAgbGludFByb21pc2VzLnB1c2goXG4gICAgICAgIHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoYnVpbGRQb2V0cnlDb21tYW5kKGFyZ3YsIHB5dGhvbkZpbGVQYXRocyksIHByb2plY3QsIGFyZ3YsIGxpbnRSdW5PcHRpb25zKVxuICAgICAgKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBbcHJvamVjdCwgZGFydEZpbGVQYXRoc10gb2YgZGFydEZpbGVQYXRoc0J5UHJvamVjdCkge1xuICAgICAgbGludFByb21pc2VzLnB1c2gocnVuV2l0aFNwYXduSW5QYXJhbGxlbChidWlsZERhcnRDb21tYW5kKGFyZ3YsIGRhcnRGaWxlUGF0aHMpLCBwcm9qZWN0LCBhcmd2LCBsaW50UnVuT3B0aW9ucykpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMuZGVzY2VuZGFudHMpIHtcbiAgICAgIGlmIChwcm9qZWN0LnBhY2thZ2VKc29uLndvcmtzcGFjZXMgJiYgIXByb2plY3QuaGFzU291cmNlQ29kZSkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IGxpbnRDb21tYW5kID0gYnVpbGRMaW50Q29tbWFuZChwcm9qZWN0LCBhcmd2KTtcbiAgICAgIGlmICghbGludENvbW1hbmQpIGNvbnRpbnVlO1xuXG4gICAgICBsaW50UHJvbWlzZXMucHVzaChydW5XaXRoU3Bhd25JblBhcmFsbGVsKGxpbnRDb21tYW5kLCBwcm9qZWN0LCBhcmd2LCBsaW50UnVuT3B0aW9ucykpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMuZGVzY2VuZGFudHMpIHtcbiAgICAgIGlmIChwcm9qZWN0Lmhhc1BvZXRyeUxvY2spIHtcbiAgICAgICAgbGludFByb21pc2VzLnB1c2gocnVuV2l0aFNwYXduSW5QYXJhbGxlbChidWlsZFBvZXRyeUNvbW1hbmQoYXJndiksIHByb2plY3QsIGFyZ3YsIGxpbnRSdW5PcHRpb25zKSk7XG4gICAgICB9XG4gICAgICBpZiAocHJvamVjdC5oYXNQdWJzcGVjWWFtbCkge1xuICAgICAgICBsaW50UHJvbWlzZXMucHVzaChydW5XaXRoU3Bhd25JblBhcmFsbGVsKGJ1aWxkRGFydENvbW1hbmQoYXJndiksIHByb2plY3QsIGFyZ3YsIGxpbnRSdW5PcHRpb25zKSk7XG4gICAgICB9XG4gICAgICBpZiAocHJvamVjdC5oYXNPeGZtdCAmJiBhcmd2LmZvcm1hdCkge1xuICAgICAgICBsaW50UHJvbWlzZXMucHVzaChydW5XaXRoU3Bhd25JblBhcmFsbGVsKGJ1aWxkT3hmbXRDb21tYW5kKCksIHByb2plY3QsIGFyZ3YsIGxpbnRSdW5PcHRpb25zKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNvbnN0IGxpbnRFeGl0Q29kZXMgPSBhd2FpdCBQcm9taXNlLmFsbChsaW50UHJvbWlzZXMpO1xuXG4gIGlmIChtaXNzaW5nTGludFRvb2xGb3JFeHBsaWNpdEZpbGVzIHx8IGxpbnRFeGl0Q29kZXMuc29tZSgoZXhpdENvZGUpID0+IGV4aXRDb2RlICE9PSAwKSkge1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgaWYgKGFyZ3YuZm9ybWF0KSB7XG4gICAgaWYgKHByZXR0aWVyQXJncy5sZW5ndGggPiAwKSB7XG4gICAgICBsaW50RXhpdENvZGVzLnB1c2goXG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoXG4gICAgICAgICAgYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgICAgICAgJ1lBUk4nLFxuICAgICAgICAgICAgJ3ByZXR0aWVyJyxcbiAgICAgICAgICAgICctLWNhY2hlJyxcbiAgICAgICAgICAgICctLWNvbG9yJyxcbiAgICAgICAgICAgICctLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuJyxcbiAgICAgICAgICAgICctLXdyaXRlJyxcbiAgICAgICAgICAgICctLScsXG4gICAgICAgICAgICAuLi5wcmV0dGllckFyZ3MsXG4gICAgICAgICAgXSksXG4gICAgICAgICAgcHJvamVjdHMuc2VsZixcbiAgICAgICAgICBhcmd2LFxuICAgICAgICAgIHsgZXhpdElmRmFpbGVkOiBmYWxzZSwgZm9yY2VDb2xvcjogdHJ1ZSB9XG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChzb3J0UGFja2FnZUpzb25BcmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIGxpbnRFeGl0Q29kZXMucHVzaChcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChcbiAgICAgICAgICBidWlsZFNoZWxsQ29tbWFuZChbJ1lBUk4nLCAnc29ydC1wYWNrYWdlLWpzb24nLCAnLS0nLCAuLi5zb3J0UGFja2FnZUpzb25BcmdzXSksXG4gICAgICAgICAgcHJvamVjdHMuc2VsZixcbiAgICAgICAgICBhcmd2LFxuICAgICAgICAgIHsgZXhpdElmRmFpbGVkOiBmYWxzZSwgZm9yY2VDb2xvcjogdHJ1ZSB9XG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGxpbnRFeGl0Q29kZXMuc29tZSgoZXhpdENvZGUpID0+IGV4aXRDb2RlICE9PSAwKSA/IDEgOiAwO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRMaW50Q29tbWFuZChcbiAgcHJvamVjdDogUGljazxQcm9qZWN0LCAncHJlZmVycmVkTGludGVyJz4sXG4gIGFyZ3Y6IFBpY2s8TGludENvbW1hbmRPcHRpb25zLCAnZml4JyB8ICdmb3JtYXQnPiAmIFBhcnRpYWw8UGljazxMaW50Q29tbWFuZE9wdGlvbnMsICdxdWlldCc+PixcbiAgZmlsZXM/OiBzdHJpbmdbXVxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHByb2plY3QucHJlZmVycmVkTGludGVyID09PSAnYmlvbWUnKSB7XG4gICAgbGV0IGJpb21lQXJnczogc3RyaW5nW107XG4gICAgaWYgKGFyZ3YuZml4ICYmIGFyZ3YuZm9ybWF0KSB7XG4gICAgICBiaW9tZUFyZ3MgPSBbJ2NoZWNrJywgJy0tZml4J107XG4gICAgfSBlbHNlIGlmIChhcmd2LmZpeCkge1xuICAgICAgYmlvbWVBcmdzID0gWydsaW50JywgJy0tZml4J107XG4gICAgfSBlbHNlIGlmIChhcmd2LmZvcm1hdCkge1xuICAgICAgYmlvbWVBcmdzID0gWydmb3JtYXQnLCAnLS1maXgnXTtcbiAgICB9IGVsc2Uge1xuICAgICAgYmlvbWVBcmdzID0gWydsaW50J107XG4gICAgfVxuICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAnQlVOJyxcbiAgICAgICdiaW9tZScsXG4gICAgICAuLi5iaW9tZUFyZ3MsXG4gICAgICAnLS1jb2xvcnM9Zm9yY2UnLFxuICAgICAgJy0tbm8tZXJyb3JzLW9uLXVubWF0Y2hlZCcsXG4gICAgICAnLS1maWxlcy1pZ25vcmUtdW5rbm93bj10cnVlJyxcbiAgICAgIC4uLihhcmd2LnF1aWV0ID8gWyctLWRpYWdub3N0aWMtbGV2ZWw9ZXJyb3InXSA6IFtdKSxcbiAgICAgIC4uLihmaWxlcz8ubGVuZ3RoID8gWyctLSddIDogW10pLFxuICAgICAgLi4uKGZpbGVzID8/IFtdKSxcbiAgICBdKTtcbiAgfVxuICBpZiAocHJvamVjdC5wcmVmZXJyZWRMaW50ZXIgPT09ICdlc2xpbnQnKSB7XG4gICAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICdZQVJOJyxcbiAgICAgICdlc2xpbnQnLFxuICAgICAgJy0tY29sb3InLFxuICAgICAgLi4uKGFyZ3YucXVpZXQgPyBbJy0tcXVpZXQnXSA6IFtdKSxcbiAgICAgIC4uLihhcmd2LmZpeCB8fCBhcmd2LmZvcm1hdCA/IFsnLS1maXgnXSA6IFtdKSxcbiAgICAgICctLScsXG4gICAgICAuLi4oZmlsZXMgPz8gWycuJ10pLFxuICAgIF0pO1xuICB9XG4gIGlmIChwcm9qZWN0LnByZWZlcnJlZExpbnRlciA9PT0gJ294bGludCcpIHtcbiAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgJ1lBUk4nLFxuICAgICAgJ294bGludCcsXG4gICAgICAuLi4oYXJndi5xdWlldCA/IFsnLS1xdWlldCddIDogW10pLFxuICAgICAgLi4uKGFyZ3YuZml4ID8gWyctLWZpeCddIDogW10pLFxuICAgICAgLi4uKGZpbGVzID8/IFsnLiddKSxcbiAgICBdKTtcbiAgfVxuICByZXR1cm47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZE94Zm10Q29tbWFuZChmaWxlcz86IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFsnWUFSTicsICdveGZtdCcsICctLXdyaXRlJywgJy0tbm8tZXJyb3Itb24tdW5tYXRjaGVkLXBhdHRlcm4nLCAuLi4oZmlsZXMgPz8gWycuJ10pXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFBvZXRyeUNvbW1hbmQoXG4gIGFyZ3Y6IFBpY2s8TGludENvbW1hbmRPcHRpb25zLCAnZml4JyB8ICdmb3JtYXQnPiAmIFBhcnRpYWw8UGljazxMaW50Q29tbWFuZE9wdGlvbnMsICdxdWlldCc+PixcbiAgZmlsZXM/OiBzdHJpbmdbXVxuKTogc3RyaW5nIHtcbiAgY29uc3QgdGFyZ2V0cyA9IGZpbGVzICYmIGZpbGVzLmxlbmd0aCA+IDAgPyBmaWxlcyA6IFsnLiddO1xuICBjb25zdCBjb21tYW5kcyA9XG4gICAgYXJndi5maXggfHwgYXJndi5mb3JtYXRcbiAgICAgID8gW1xuICAgICAgICAgIGJ1aWxkU2hlbGxDb21tYW5kKFsncG9ldHJ5JywgJ3J1bicsICdpc29ydCcsICctLXByb2ZpbGUnLCAnYmxhY2snLCAnLS1maWx0ZXItZmlsZXMnLCAuLi50YXJnZXRzXSksXG4gICAgICAgICAgYnVpbGRTaGVsbENvbW1hbmQoWydwb2V0cnknLCAncnVuJywgJ2JsYWNrJywgLi4udGFyZ2V0c10pLFxuICAgICAgICAgIGJ1aWxkU2hlbGxDb21tYW5kKFsncG9ldHJ5JywgJ3J1bicsICdmbGFrZTgnLCAuLi4oYXJndi5xdWlldCA/IFsnLXEnXSA6IFtdKSwgLi4udGFyZ2V0c10pLFxuICAgICAgICBdXG4gICAgICA6IFtidWlsZFNoZWxsQ29tbWFuZChbJ3BvZXRyeScsICdydW4nLCAnZmxha2U4JywgLi4uKGFyZ3YucXVpZXQgPyBbJy1xJ10gOiBbXSksIC4uLnRhcmdldHNdKV07XG4gIHJldHVybiBjb21tYW5kcy5qb2luKCcgJiYgJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZERhcnRDb21tYW5kKFxuICBhcmd2OiBQaWNrPExpbnRDb21tYW5kT3B0aW9ucywgJ2ZpeCcgfCAnZm9ybWF0Jz4gJiBQYXJ0aWFsPFBpY2s8TGludENvbW1hbmRPcHRpb25zLCAncXVpZXQnPj4sXG4gIGZpbGVzPzogc3RyaW5nW11cbik6IHN0cmluZyB7XG4gIGNvbnN0IHRhcmdldHMgPSBmaWxlcyAmJiBmaWxlcy5sZW5ndGggPiAwID8gZmlsZXMgOiBbJy4nXTtcbiAgY29uc3QgY29tbWFuZHM6IHN0cmluZ1tdID0gW107XG4gIGlmIChhcmd2LmZpeCB8fCBhcmd2LmZvcm1hdCkge1xuICAgIGNvbW1hbmRzLnB1c2goYnVpbGRTaGVsbENvbW1hbmQoWydkYXJ0JywgJ2Zvcm1hdCcsIC4uLnRhcmdldHNdKSk7XG4gIH1cbiAgY29tbWFuZHMucHVzaChidWlsZFNoZWxsQ29tbWFuZChbJ2RhcnQnLCAnYW5hbHl6ZScsIC4uLnRhcmdldHNdKSk7XG4gIHJldHVybiBjb21tYW5kcy5qb2luKCcgJiYgJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFByZXR0aWVyQXJncyhcbiAgc2VsZkRpclBhdGg6IHN0cmluZyxcbiAgcHJvamVjdHM6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnIHwgJ3ByZWZlcnJlZExpbnRlcicgfCAnaGFzT3hmbXQnPltdXG4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGFyZ3MgPSBuZXcgU2V0PHN0cmluZz4oW2AqKi97LiovLH0qLnske1suLi5wcmV0dGllck9ubHlFeHRlbnNpb25zXS5qb2luKCcsJyl9fWAsIHByZXR0aWVyRml4dHVyZUlnbm9yZVBhdHRlcm5dKTtcbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzKSB7XG4gICAgaWYgKCFuZWVkc1ByZXR0aWVyKHByb2plY3QpKSBjb250aW51ZTtcblxuICAgIGNvbnN0IHByb2plY3RQYXR0ZXJuID0gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJyoqL3suKi8sfSoueycgKyBbLi4ucHJldHRpZXJFeHRlbnNpb25zXS5qb2luKCcsJykgKyAnfScpO1xuICAgIGFyZ3MuYWRkKHBhdGgucmVsYXRpdmUoc2VsZkRpclBhdGgsIHByb2plY3RQYXR0ZXJuKSB8fCBwcm9qZWN0UGF0dGVybik7XG4gIH1cbiAgcmV0dXJuIFsuLi5hcmdzXTtcbn1cblxuZnVuY3Rpb24gZmluZE93bmluZ1Byb2plY3QocHJvamVjdHM6IFByb2plY3RbXSwgZmlsZVBhdGg6IHN0cmluZyk6IFByb2plY3QgfCB1bmRlZmluZWQge1xuICBsZXQgb3duaW5nUHJvamVjdDogUHJvamVjdCB8IHVuZGVmaW5lZDtcbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzKSB7XG4gICAgaWYgKFxuICAgICAgKGZpbGVQYXRoID09PSBwcm9qZWN0LmRpclBhdGggfHwgZmlsZVBhdGguc3RhcnRzV2l0aChgJHtwcm9qZWN0LmRpclBhdGh9L2ApKSAmJlxuICAgICAgKCFvd25pbmdQcm9qZWN0IHx8IHByb2plY3QuZGlyUGF0aC5sZW5ndGggPiBvd25pbmdQcm9qZWN0LmRpclBhdGgubGVuZ3RoKVxuICAgICkge1xuICAgICAgb3duaW5nUHJvamVjdCA9IHByb2plY3Q7XG4gICAgfVxuICB9XG4gIHJldHVybiBvd25pbmdQcm9qZWN0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGludFRhcmdldEZpbGVzKGFyZ3Y6IFBpY2s8TGludENvbW1hbmRBcmd2LCAnLS0nIHwgJ18nIHwgJ2ZpbGVzJz4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGxpbnRUYXJnZXRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgdmFsdWUgb2YgWy4uLihhcmd2LmZpbGVzID8/IFtdKSwgLi4uYXJndi5fLnNsaWNlKDEpLCAuLi4oYXJndlsnLS0nXSA/PyBbXSldKSB7XG4gICAgbGludFRhcmdldHMuYWRkKFN0cmluZyh2YWx1ZSkpO1xuICB9XG4gIHJldHVybiBbLi4ubGludFRhcmdldHNdO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0TGludFRhcmdldEZpbGVLaW5kKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPCdkaXJlY3RvcnknIHwgJ290aGVyJz4ge1xuICB0cnkge1xuICAgIGNvbnN0IHN0YXRzID0gYXdhaXQgZnMuc3RhdChmaWxlUGF0aCk7XG4gICAgaWYgKHN0YXRzLmlzRGlyZWN0b3J5KCkpIHJldHVybiAnZGlyZWN0b3J5JztcbiAgfSBjYXRjaCB7XG4gICAgLy8gTWlzc2luZyBwYXRocyBhcmUgaGFuZGxlZCBieSB0aGUgZG93bnN0cmVhbSB0b29scy5cbiAgfVxuXG4gIHJldHVybiAnb3RoZXInO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2hvdWxkRm9ybWF0RXhwbGljaXRQYXRoV2l0aFByZXR0aWVyKFxuICBwcm9qZWN0OiBQaWNrPFByb2plY3QsICdwcmVmZXJyZWRMaW50ZXInIHwgJ2hhc094Zm10Jz4sXG4gIGV4dGVuc2lvbjogc3RyaW5nXG4pOiBib29sZWFuIHtcbiAgaWYgKHByb2plY3QuaGFzT3hmbXQpIHJldHVybiBveGZtdEV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbik7XG4gIGlmIChuZWVkc1ByZXR0aWVyKHByb2plY3QpKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIChcbiAgICBwcm9qZWN0LnByZWZlcnJlZExpbnRlciA9PT0gJ2Jpb21lJyAmJlxuICAgICFzdXBwb3J0c0xpbnRpbmdFeHRlbnNpb24ocHJvamVjdCwgZXh0ZW5zaW9uKSAmJlxuICAgIHByZXR0aWVyRXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRFeHBsaWNpdEZvcm1hdHRlckFyZ3MoXG4gIHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ3ByZWZlcnJlZExpbnRlcicgfCAnaGFzT3hmbXQnPixcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgZmlsZUtpbmQ6ICdkaXJlY3RvcnknIHwgJ290aGVyJyxcbiAgZXh0ZW5zaW9uOiBzdHJpbmdcbik6IHN0cmluZ1tdIHtcbiAgaWYgKGZpbGVLaW5kID09PSAnZGlyZWN0b3J5JyAmJiBwcm9qZWN0Lmhhc094Zm10KSB7XG4gICAgcmV0dXJuIFtmaWxlUGF0aF07XG4gIH1cbiAgaWYgKGZpbGVLaW5kID09PSAnZGlyZWN0b3J5JyAmJiBwcm9qZWN0LnByZWZlcnJlZExpbnRlciA9PT0gJ2Jpb21lJykge1xuICAgIHJldHVybiBbXG4gICAgICBwYXRoLmpvaW4oZmlsZVBhdGgsICcqKi97LiovLH0qLnsnICsgWy4uLnByZXR0aWVyT25seUV4dGVuc2lvbnNdLmpvaW4oJywnKSArICd9JyksXG4gICAgICBwcmV0dGllckZpeHR1cmVJZ25vcmVQYXR0ZXJuLFxuICAgIF07XG4gIH1cbiAgaWYgKGZpbGVLaW5kID09PSAnZGlyZWN0b3J5JyAmJiBuZWVkc1ByZXR0aWVyKHByb2plY3QpKSB7XG4gICAgcmV0dXJuIFtmaWxlUGF0aCwgcHJldHRpZXJGaXh0dXJlSWdub3JlUGF0dGVybl07XG4gIH1cbiAgaWYgKHNob3VsZEZvcm1hdEV4cGxpY2l0UGF0aFdpdGhQcmV0dGllcihwcm9qZWN0LCBleHRlbnNpb24pKSB7XG4gICAgcmV0dXJuIFtmaWxlUGF0aF07XG4gIH1cbiAgcmV0dXJuIFtdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXhwbGljaXRQYWNrYWdlSnNvblBhdGhzKFxuICBwcm9qZWN0czogUGljazxQcm9qZWN0LCAnZGlyUGF0aCcgfCAncGFja2FnZUpzb25QYXRoJz5bXSxcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgZmlsZUtpbmQ6ICdkaXJlY3RvcnknIHwgJ290aGVyJ1xuKTogc3RyaW5nW10ge1xuICBpZiAoZmlsZUtpbmQgIT09ICdkaXJlY3RvcnknKSByZXR1cm4gW107XG4gIHJldHVybiBwcm9qZWN0c1xuICAgIC5maWx0ZXIoXG4gICAgICAocHJvamVjdCkgPT5cbiAgICAgICAgcHJvamVjdC5wYWNrYWdlSnNvblBhdGggPT09IHBhdGguam9pbihmaWxlUGF0aCwgJ3BhY2thZ2UuanNvbicpIHx8XG4gICAgICAgIHByb2plY3QucGFja2FnZUpzb25QYXRoLnN0YXJ0c1dpdGgoYCR7ZmlsZVBhdGh9L2ApXG4gICAgKVxuICAgIC5tYXAoKHByb2plY3QpID0+IHByb2plY3QucGFja2FnZUpzb25QYXRoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEV4cGxpY2l0TGludFRhcmdldHMoXG4gIHByb2plY3RzOiBQcm9qZWN0W10sXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIGZpbGVLaW5kOiAnZGlyZWN0b3J5JyB8ICdvdGhlcidcbik6IHsgbGludFBhdGg6IHN0cmluZzsgcHJvamVjdDogUHJvamVjdCB9W10ge1xuICBpZiAoZmlsZUtpbmQgPT09ICdkaXJlY3RvcnknKSB7XG4gICAgY29uc3QgZGVzY2VuZGFudFByb2plY3RzID0gcHJvamVjdHMuZmlsdGVyKFxuICAgICAgKHByb2plY3QpID0+IHByb2plY3QuZGlyUGF0aCA9PT0gZmlsZVBhdGggfHwgcHJvamVjdC5kaXJQYXRoLnN0YXJ0c1dpdGgoYCR7ZmlsZVBhdGh9L2ApXG4gICAgKTtcbiAgICBpZiAoZGVzY2VuZGFudFByb2plY3RzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBkZXNjZW5kYW50UHJvamVjdHMubWFwKChwcm9qZWN0KSA9PiAoeyBsaW50UGF0aDogcHJvamVjdC5kaXJQYXRoLCBwcm9qZWN0IH0pKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBwcm9qZWN0ID0gZmluZE93bmluZ1Byb2plY3QocHJvamVjdHMsIGZpbGVQYXRoKTtcbiAgcmV0dXJuIHByb2plY3QgPyBbeyBsaW50UGF0aDogZmlsZVBhdGgsIHByb2plY3QgfV0gOiBbXTtcbn1cblxuZnVuY3Rpb24gaXNQb3RlbnRpYWxMaW50VGFyZ2V0KGV4dGVuc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgYmlvbWVFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pIHx8XG4gICAgb3hsaW50RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSB8fFxuICAgIGVzbGludEV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikgfHxcbiAgICBweXRob25FeHRlbnNpb25zLmhhcyhleHRlbnNpb24pIHx8XG4gICAgZGFydEV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbilcbiAgKTtcbn1cblxuZnVuY3Rpb24gc3VwcG9ydHNMaW50aW5nRXh0ZW5zaW9uKHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ3ByZWZlcnJlZExpbnRlcic+LCBleHRlbnNpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAocHJvamVjdC5wcmVmZXJyZWRMaW50ZXIgPT09ICdiaW9tZScpIHJldHVybiBiaW9tZUV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbik7XG4gIGlmIChwcm9qZWN0LnByZWZlcnJlZExpbnRlciA9PT0gJ294bGludCcpIHJldHVybiBveGxpbnRFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pO1xuICBpZiAocHJvamVjdC5wcmVmZXJyZWRMaW50ZXIgPT09ICdlc2xpbnQnKSByZXR1cm4gZXNsaW50RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKTtcbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBuZWVkc1ByZXR0aWVyKHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ3ByZWZlcnJlZExpbnRlcicgfCAnaGFzT3hmbXQnPik6IGJvb2xlYW4ge1xuICByZXR1cm4gIXByb2plY3QuaGFzT3hmbXQgJiYgKHByb2plY3QucHJlZmVycmVkTGludGVyID09PSAnZXNsaW50JyB8fCBwcm9qZWN0LnByZWZlcnJlZExpbnRlciA9PT0gJ294bGludCcpO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiogcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKGNvbW1hbmROYW1lOiBzdHJpbmcsIHByb2plY3RzOiBQcm9qZWN0W10pOiBHZW5lcmF0b3I8UHJvamVjdCwgdm9pZCwgdW5rbm93bj4ge1xuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmluZm8oYFJ1bm5pbmcgXCIke2NvbW1hbmROYW1lfVwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICB5aWVsZCBwcm9qZWN0O1xuICB9XG59XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBwYWNrYWdlTWFuYWdlciB9IGZyb20gJy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuXG5pbXBvcnQgeyBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRVdGlscy5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIG91dHNpZGU6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdGhlIG9wdGltaXphdGlvbiBpcyBleGVjdXRlZCBvdXRzaWRlIGEgZG9ja2VyIGNvbnRhaW5lciBvciBub3QnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBhbGlhczogJ28nLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IG9wdGltaXplRm9yRG9ja2VyQnVpbGRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ29wdGltaXplRm9yRG9ja2VyQnVpbGQnLFxuICBkZXNjcmliZTogJ09wdGltaXplIGNvbmZpZ3VyYXRpb24gd2hlbiBidWlsZGluZyBhIERvY2tlciBpbWFnZScsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2KTtcbiAgICBpZiAoIXByb2plY3RzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgnb3B0aW1pemVGb3JEb2NrZXJCdWlsZCcsIHByb2plY3RzLmRlc2NlbmRhbnRzKSkge1xuICAgICAgY29uc3QgcGFja2FnZUpzb246IFBhY2thZ2VKc29uID0gcHJvamVjdC5wYWNrYWdlSnNvbjtcbiAgICAgIGNvbnN0IGtleXMgPSBbJ2RlcGVuZGVuY2llcycsICdkZXZEZXBlbmRlbmNpZXMnXSBhcyBjb25zdDtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgICAgY29uc3QgZGVwcyA9IHBhY2thZ2VKc29uW2tleV0gPz8ge307XG4gICAgICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhkZXBzKSkge1xuICAgICAgICAgIGlmICh2YWx1ZT8uc3RhcnRzV2l0aCgnZ2l0QGdpdGh1Yi5jb206JykpIHtcbiAgICAgICAgICAgIGRlcHNbbmFtZV0gPSBgLi8ke25hbWV9YDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgb3B0aW1pemVEZXZEZXBlbmRlbmNpZXMoYXJndiwgcGFja2FnZUpzb24pO1xuXG4gICAgICBvcHRpbWl6ZVNjcmlwdHMocGFja2FnZUpzb24pO1xuXG4gICAgICBvcHRpbWl6ZVJvb3RQcm9wcyhwYWNrYWdlSnNvbik7XG5cbiAgICAgIGlmIChhcmd2LmRyeVJ1bikgY29udGludWU7XG5cbiAgICAgIGNvbnN0IGRpc3REaXJQYXRoID0gYXJndi5vdXRzaWRlID8gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ2Rpc3QnKSA6IHByb2plY3QuZGlyUGF0aDtcbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKGRpc3REaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLmpvaW4oZGlzdERpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgSlNPTi5zdHJpbmdpZnkocGFja2FnZUpzb24pLCAndXRmOCcpO1xuICAgIH1cbiAgICBpZiAoIWFyZ3YuZHJ5UnVuICYmICFhcmd2Lm91dHNpZGUpIHtcbiAgICAgIGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ2luc3RhbGwnXSwge1xuICAgICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgICAgfSk7XG4gICAgICBjb25zb2xlLmluZm8oJ0luc3RhbGxlZCBkZXBlbmRlbmNpZXMuJyk7XG4gICAgfVxuICB9LFxufTtcblxuZnVuY3Rpb24gb3B0aW1pemVEZXZEZXBlbmRlbmNpZXMoYXJndjogSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4sIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IHZvaWQge1xuICBpZiAoIWFyZ3Yub3V0c2lkZSkge1xuICAgIGRlbGV0ZSBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM7XG4gICAgY29uc29sZS5pbmZvKCdSZW1vdmVkIGFsbCBkZXZEZXBlbmRlbmNpZXMuJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgZGV2RGVwcyA9IHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAgY29uc3QgbmFtZVdvcmRzVG9CZVJlbW92ZWQgPSBbXG4gICAgJ2FydGlsbGVyeScsXG4gICAgJ2Jpb21lJyxcbiAgICAnY29uY3VycmVudGx5JyxcbiAgICAnY29udmVudGlvbmFsLWNoYW5nZWxvZy1jb252ZW50aW9uYWxjb21taXRzJyxcbiAgICAnZXNsaW50JyxcbiAgICAnaHVza3knLFxuICAgICdpbWFnZW1pbicsXG4gICAgJ2plc3QnLFxuICAgICdraWxsLXBvcnQnLFxuICAgICdsaW50LXN0YWdlZCcsXG4gICAgJ29wZW4tY2xpJyxcbiAgICAncGxheXdyaWdodCcsXG4gICAgJ3ByZXR0aWVyJyxcbiAgICAncGluc3QnLFxuICAgICdyYWlsd2F5JyxcbiAgICAnc2VtYW50aWMtcmVsZWFzZScsXG4gICAgJ3NvcnQtcGFja2FnZS1qc29uJyxcbiAgICAnd2FpdC1vbicsXG4gICAgJ3ZpdGVzdCcsXG4gIF07XG4gIGNvbnN0IHJlbW92ZWREZXBzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmtleXMoZGV2RGVwcykpIHtcbiAgICBpZiAoXG4gICAgICBuYW1lV29yZHNUb0JlUmVtb3ZlZC5zb21lKCh3b3JkKSA9PiBuYW1lLmluY2x1ZGVzKHdvcmQpKSB8fFxuICAgICAgKG5hbWUuaW5jbHVkZXMoJ3dpbGxib29zdGVyJykgJiYgbmFtZS5pbmNsdWRlcygnY29uZmlnJykpXG4gICAgKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gICAgICBkZWxldGUgZGV2RGVwc1tuYW1lXTtcbiAgICAgIHJlbW92ZWREZXBzLnB1c2gobmFtZSk7XG4gICAgfVxuICB9XG4gIGNvbnNvbGUuaW5mbygnUmVtb3ZlZCBkZXZEZXBlbmRlbmNpZXM6JywgcmVtb3ZlZERlcHMuam9pbignLCAnKSB8fCAnbm9uZScpO1xufVxuXG5mdW5jdGlvbiBvcHRpbWl6ZVNjcmlwdHMocGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGNvbnN0IG5hbWVXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzID0gWydjaGVjaycsICdkZXBsb3knLCAnZm9ybWF0JywgJ2xpbnQnLCAnc3RhcnQnLCAndGVzdCddO1xuICBjb25zdCBjb250ZW50V29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cyA9IFsncGluc3QgJywgJ2h1c2t5ICddO1xuICBjb25zdCBzY3JpcHRzID0gKHBhY2thZ2VKc29uLnNjcmlwdHMgPz8ge30pIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIGNvbnN0IHJlbW92ZWRTY3JpcHRzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IFtuYW1lLCBjb250ZW50XSBvZiBPYmplY3QuZW50cmllcyhzY3JpcHRzKSkge1xuICAgIGlmIChcbiAgICAgIG5hbWVXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzLnNvbWUoKHdvcmQpID0+IG5hbWUuc3RhcnRzV2l0aCh3b3JkKSkgfHxcbiAgICAgIC8vIFN1cHBvcnQgXCJodXNreVwiIHNpbmNlIGh1c2t5IHY5IHJlcXVpcmVzIGBcInBvc3RpbnN0YWxsXCI6IFwiaHVza3lcImBcbiAgICAgIGNvbnRlbnRXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzLnNvbWUoKHdvcmQpID0+IGNvbnRlbnQuaW5jbHVkZXMod29yZCkgfHwgY29udGVudC50cmltKCkgPT09IHdvcmQudHJpbSgpKVxuICAgICkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZVxuICAgICAgZGVsZXRlIHNjcmlwdHNbbmFtZV07XG4gICAgICByZW1vdmVkU2NyaXB0cy5wdXNoKG5hbWUpO1xuICAgIH1cbiAgfVxuICBjb25zb2xlLmluZm8oJ1JlbW92ZWQgc2NyaXB0czonLCByZW1vdmVkU2NyaXB0cy5qb2luKCcsICcpIHx8ICdub25lJyk7XG59XG5cbmZ1bmN0aW9uIG9wdGltaXplUm9vdFByb3BzKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IHZvaWQge1xuICBkZWxldGUgcGFja2FnZUpzb24ucHJpdmF0ZTtcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnB1Ymxpc2hDb25maWc7XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5wcmV0dGllcjtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuXG5jb25zdCBGSUxFX1NDSEVNQSA9ICdmaWxlOic7XG5cbmNvbnN0IFBPU1NJQkxFX1BSSVNNQV9QQVRIUyA9IFtcbiAgeyBzY2hlbWFQYXRoOiBwYXRoLmpvaW4oJ3ByaXNtYScsICdzY2hlbWEucHJpc21hJyksIGRiUGF0aDogJ3ByaXNtYScgfSxcbiAgeyBzY2hlbWFQYXRoOiBwYXRoLmpvaW4oJ3ByaXNtYScsICdzY2hlbWEnKSwgZGJQYXRoOiBwYXRoLmpvaW4oJ3ByaXNtYScsICdzY2hlbWEnKSB9LFxuICB7IHNjaGVtYVBhdGg6IHBhdGguam9pbignZGInLCAnc2NoZW1hLnByaXNtYScpLCBkYlBhdGg6ICdkYicgfSxcbl07XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBQcmlzbWEgY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFBSSVNNQWAgaXMgcmVwbGFjZWQgd2l0aCBgWUFSTiBwcmlzbWFgIG9yIGBZQVJOIGJsaXR6IHByaXNtYWBcbiAqIGFuZCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgUHJpc21hU2NyaXB0cyB7XG4gIGNsZWFuVXBMaXRlc3RyZWFtKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRpclBhdGggPSBnZXREYXRhYmFzZURpclBhdGgocHJvamVjdCk7XG4gICAgY29uc3QgY2xlYW5VcENvbW1hbmQgPSBidWlsZFdhbENoZWNrcG9pbnRBbmRSZW1vdmVTcWxpdGVTaWRlY2FyRmlsZXNDb21tYW5kKGAke2RpclBhdGh9L3Byb2Quc3FsaXRlM2ApO1xuICAgIC8vIENsZWFudXAgZXhpc3RpbmcgYXJ0aWZhY3RzIHRvIGF2b2lkIGlzc3VlcyB3aXRoIExpdGVzdHJlYW0gcmVwbGljYXRpb24uXG4gICAgLy8gTm90ZSB0aGF0IGRvbid0IG1lcmdlIG11bHRpcGxlIHJtIGNvbW1hbmRzIGludG8gb25lLCBiZWNhdXNlIGlmIG9uZSBmYWlscywgdGhlIHN1YnNlcXVlbnQgb25lcyB3b24ndCBydW4uXG4gICAgcmV0dXJuIGAke2NsZWFuVXBDb21tYW5kfTsgcm0gLVJmICR7ZGlyUGF0aH0vLnByb2Quc3FsaXRlMyogfHwgdHJ1ZWA7XG4gIH1cblxuICBkZXBsb3koXzogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBQUklTTUEgbWlncmF0ZSBkZXBsb3kgJHthZGRpdGlvbmFsT3B0aW9uc31gO1xuICB9XG5cbiAgZGVwbG95Rm9yY2UocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgY29uc3QgZGlyUGF0aCA9IGdldERhdGFiYXNlRGlyUGF0aChwcm9qZWN0KTtcbiAgICBjb25zdCByZW1vdmVEYkNvbW1hbmQgPSBidWlsZFJlbW92ZVNxbGl0ZURiQ29tbWFuZChgJHtkaXJQYXRofS9wcm9kLnNxbGl0ZTNgKTtcbiAgICAvLyBgcHJpc21hIG1pZ3JhdGUgcmVzZXRgIGNhbiBmYWlsIGRlcGVuZGluZyBvbiB0aGUgc3RhdGUgb2YgdGhlIGV4aXN0aW5nIGRhdGFiYXNlLCBzbyB3ZSByZW1vdmUgaXQgZmlyc3QuXG4gICAgLy8gRG9uJ3Qgc2tpcCBcIm1pZ3JhdGUgZGVwbG95XCIgYmVjYXVzZSByZXN0b3JlZCBkYXRhYmFzZSBtYXkgYmUgb2xkZXIgdGhhbiB0aGUgY3VycmVudCBzY2hlbWEuXG4gICAgcmV0dXJuIGAke3JlbW92ZURiQ29tbWFuZH07IFBSSVNNQSBtaWdyYXRlIHJlc2V0IC0tZm9yY2UgLS1za2lwLXNlZWQgJiYgJHtyZW1vdmVEYkNvbW1hbmR9XG4gICAgICAmJiBsaXRlc3RyZWFtIHJlc3RvcmUgLWNvbmZpZyBsaXRlc3RyZWFtLnltbCAtbyAke2RpclBhdGh9L3Byb2Quc3FsaXRlMyAke2RpclBhdGh9L3Byb2Quc3FsaXRlMyAmJiBscyAtYWhsICR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzICYmIEFMTE9XX1RPX1NLSVBfU0VFRD0wIFBSSVNNQSBtaWdyYXRlIGRlcGxveWA7XG4gIH1cblxuICBsaXN0QmFja3Vwcyhwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICBjb25zdCBkaXJQYXRoID0gZ2V0RGF0YWJhc2VEaXJQYXRoKHByb2plY3QpO1xuICAgIHJldHVybiBgbGl0ZXN0cmVhbSBsdHggLWNvbmZpZyBsaXRlc3RyZWFtLnltbCAke2RpclBhdGh9L3Byb2Quc3FsaXRlM2A7XG4gIH1cblxuICBtaWdyYXRlKHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgUFJJU01BIG1pZ3JhdGUgZGVwbG95ICR7YWRkaXRpb25hbE9wdGlvbnN9ICYmIFBSSVNNQSBnZW5lcmF0ZSAmJiAke3RoaXMuc2VlZChwcm9qZWN0KX1gO1xuICB9XG5cbiAgbWlncmF0ZURldihfOiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFBSSVNNQSBtaWdyYXRlIGRldiAke2FkZGl0aW9uYWxPcHRpb25zfWA7XG4gIH1cblxuICByZXNldChwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICAvLyBjZi4gaHR0cHM6Ly93d3cucHJpc21hLmlvL2RvY3MvZ3VpZGVzL2RhdGFiYXNlL3NlZWQtZGF0YWJhc2UjaW50ZWdyYXRlZC1zZWVkaW5nLXdpdGgtcHJpc21hLW1pZ3JhdGVcbiAgICBjb25zdCBzdGVwczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBjbGVhbnVwQ29tbWFuZCA9IGNsZWFuVXBTcWxpdGVEYklmTmVlZGVkKHByb2plY3QpO1xuICAgIGlmIChjbGVhbnVwQ29tbWFuZCkgc3RlcHMucHVzaChjbGVhbnVwQ29tbWFuZCk7XG4gICAgY29uc3QgcmVzZXRDb21tYW5kID0gWydQUklTTUEgbWlncmF0ZSByZXNldCAtLWZvcmNlJywgYWRkaXRpb25hbE9wdGlvbnNdLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJyk7XG4gICAgc3RlcHMucHVzaChyZXNldENvbW1hbmQpO1xuICAgIGlmIChwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHopIHtcbiAgICAgIC8vIEJsaXR6IGRvZXMgbm90IHRyaWdnZXIgc2VlZCBhdXRvbWF0aWNhbGx5LCBzbyB3ZSBuZWVkIHRvIHJ1biBpdCBtYW51YWxseS5cbiAgICAgIHN0ZXBzLnB1c2godGhpcy5zZWVkKHByb2plY3QpKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0ZXBzLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJiYgJyk7XG4gIH1cblxuICByZXN0b3JlKHByb2plY3Q6IFByb2plY3QsIG91dHB1dFBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgZGlyUGF0aCA9IGdldERhdGFiYXNlRGlyUGF0aChwcm9qZWN0KTtcbiAgICByZXR1cm4gYHJtIC1SZiAke291dHB1dFBhdGh9KjsgbGl0ZXN0cmVhbSByZXN0b3JlIC1jb25maWcgbGl0ZXN0cmVhbS55bWwgLW8gJHtvdXRwdXRQYXRofSAke2RpclBhdGh9L3Byb2Quc3FsaXRlM2A7XG4gIH1cblxuICBzZWVkKHByb2plY3Q6IFByb2plY3QsIHNjcmlwdFBhdGg/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHopIHJldHVybiBgWUFSTiBibGl0eiBkYiBzZWVkJHtzY3JpcHRQYXRoID8gYCAtZiAke3NjcmlwdFBhdGh9YCA6ICcnfWA7XG4gICAgaWYgKHNjcmlwdFBhdGgpIHJldHVybiBgQlVOIGJ1aWxkLXRzIHJ1biAke3NjcmlwdFBhdGh9YDtcbiAgICBpZiAoKHByb2plY3QucGFja2FnZUpzb24ucHJpc21hIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCB1bmRlZmluZWQpPy5zZWVkKSByZXR1cm4gYFlBUk4gcHJpc21hIGRiIHNlZWRgO1xuICAgIHJldHVybiBgaWYgWyAtZSBcInByaXNtYS9zZWVkcy50c1wiIF07IHRoZW4gQlVOIGJ1aWxkLXRzIHJ1biBwcmlzbWEvc2VlZHMudHM7IGZpYDtcbiAgfVxuXG4gIHN0dWRpbyhwcm9qZWN0OiBQcm9qZWN0LCBkYlVybE9yUGF0aD86IHN0cmluZywgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgbGV0IHByZWZpeCA9ICcnO1xuICAgIC8vIERlYWwgd2l0aCBQcmlzbWEgaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9wcmlzbWEvc3R1ZGlvL2lzc3Vlcy8xMjczXG4gICAgaWYgKGRiVXJsT3JQYXRoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBuZXcgVVJMKGRiVXJsT3JQYXRoKTtcbiAgICAgICAgcHJlZml4ID0gYERBVEFCQVNFX1VSTD0ke2RiVXJsT3JQYXRofSBgO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGNvbnN0IGFic29sdXRlUGF0aCA9IHBhdGgucmVzb2x2ZShkYlVybE9yUGF0aCk7XG4gICAgICAgIHByZWZpeCA9IGBEQVRBQkFTRV9VUkw9JHtGSUxFX1NDSEVNQX0ke2Fic29sdXRlUGF0aH0gYDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByb2plY3QuZW52LkRBVEFCQVNFX1VSTD8uc3RhcnRzV2l0aChGSUxFX1NDSEVNQSkpIHtcbiAgICAgIGNvbnN0IGJhc2VEaXIgPSBnZXRQcmlzbWFCYXNlRGlyKHByb2plY3QpO1xuICAgICAgaWYgKGJhc2VEaXIpIHtcbiAgICAgICAgY29uc3QgYWJzb2x1dGVQYXRoID0gcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgYmFzZURpciwgcHJvamVjdC5lbnYuREFUQUJBU0VfVVJMLnNsaWNlKEZJTEVfU0NIRU1BLmxlbmd0aCkpO1xuICAgICAgICBwcmVmaXggPSBgREFUQUJBU0VfVVJMPSR7RklMRV9TQ0hFTUF9JHthYnNvbHV0ZVBhdGh9IGA7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBgJHtwcmVmaXh9UFJJU01BIHN0dWRpbyAke2FkZGl0aW9uYWxPcHRpb25zfWA7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0RGF0YWJhc2VEaXJQYXRoKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICByZXR1cm4gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6ID8gJ2RiL21vdW50JyA6ICdwcmlzbWEvbW91bnQnO1xufVxuXG5mdW5jdGlvbiBnZXRQcmlzbWFCYXNlRGlyKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gUE9TU0lCTEVfUFJJU01BX1BBVEhTLmZpbmQoKHsgc2NoZW1hUGF0aCB9KSA9PiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsIHNjaGVtYVBhdGgpKSlcbiAgICA/LmRiUGF0aDtcbn1cblxuZnVuY3Rpb24gYnVpbGRSZW1vdmVTcWxpdGVEYkNvbW1hbmQoZGJQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYHJtIC1SZiBcIiR7ZGJQYXRofVwiKmA7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkV2FsQ2hlY2twb2ludEFuZFJlbW92ZVNxbGl0ZVNpZGVjYXJGaWxlc0NvbW1hbmQoZGJQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYGlmIFsgLWYgXCIke2RiUGF0aH1cIiBdOyB0aGVuIHByaW50ZiAnUFJBR01BIHdhbF9jaGVja3BvaW50KFRSVU5DQVRFKTsnIHwgUFJJU01BIGRiIGV4ZWN1dGUgLS1zdGRpbiAtLXVybCBcIiR7RklMRV9TQ0hFTUF9JHtkYlBhdGh9XCI7IGZpICYmIHJtIC1mIFwiJHtkYlBhdGh9XCIuKiBcIiR7ZGJQYXRofVwiLSpgO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xlYW5VcFNxbGl0ZURiSWZOZWVkZWQocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGRiVXJsID0gcHJvamVjdC5lbnYuREFUQUJBU0VfVVJMO1xuICBpZiAoIWRiVXJsPy5zdGFydHNXaXRoKEZJTEVfU0NIRU1BKSkgcmV0dXJuO1xuXG4gIGNvbnN0IHJhd0RiUGF0aCA9IGRiVXJsLnNsaWNlKEZJTEVfU0NIRU1BLmxlbmd0aCkucmVwbGFjZSgvWz8jXS4qJC8sICcnKTtcbiAgaWYgKCFyYXdEYlBhdGgpIHJldHVybjtcblxuICBjb25zdCBiYXNlRGlyID0gZ2V0UHJpc21hQmFzZURpcihwcm9qZWN0KTtcbiAgY29uc3QgYWJzb2x1dGVQYXRoID0gcGF0aC5pc0Fic29sdXRlKHJhd0RiUGF0aClcbiAgICA/IHJhd0RiUGF0aFxuICAgIDogcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgYmFzZURpciA/PyAnLicsIHJhd0RiUGF0aCk7XG5cbiAgcmV0dXJuIGBybSAtZiBcIiR7YWJzb2x1dGVQYXRofVwiIFwiJHthYnNvbHV0ZVBhdGh9LXdhbFwiIFwiJHthYnNvbHV0ZVBhdGh9LXNobVwiYDtcbn1cblxuZXhwb3J0IGNvbnN0IHByaXNtYVNjcmlwdHMgPSBuZXcgUHJpc21hU2NyaXB0cygpO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuXG5pbXBvcnQgdHlwZSB7IEVudlJlYWRlck9wdGlvbnMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHByaXNtYVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL3ByaXNtYVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBidWlsZFNoZWxsQ29tbWFuZCB9IGZyb20gJy4uL3V0aWxzL3NoZWxsLmpzJztcblxuaW1wb3J0IHsgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kVXRpbHMuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBwcmlzbWFDb21tYW5kOiBDb21tYW5kTW9kdWxlID0ge1xuICBjb21tYW5kOiAncHJpc21hJyxcbiAgZGVzY3JpYmU6XG4gICAgXCJSdW4gcHJpc21hIGNvbW1hbmRzLiBVc2UgJy0tJyB0byBzdG9wIHdiIG9wdGlvbiBwYXJzaW5nIGFuZCBmb3J3YXJkIHRoZSByZW1haW5pbmcgYXJndW1lbnRzIHRvIFByaXNtYS4gRXhhbXBsZTogd2IgcHJpc21hIG1pZ3JhdGUtZGV2IC0tIC0tbmFtZSBpbml0XCIsXG4gIGJ1aWxkZXI6ICh5YXJncykgPT4ge1xuICAgIHJldHVybiB5YXJnc1xuICAgICAgLnBhcnNlckNvbmZpZ3VyYXRpb24oeyAncG9wdWxhdGUtLSc6IHRydWUgfSlcbiAgICAgIC5jb21tYW5kKGNsZWFuVXBMaXRlc3RyZWFtQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKGNyZWF0ZUxpdGVzdHJlYW1Db25maWdDb21tYW5kKVxuICAgICAgLmNvbW1hbmQoZGVwbG95Q29tbWFuZClcbiAgICAgIC5jb21tYW5kKGRlcGxveUZvcmNlQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKGxpc3RCYWNrdXBzQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKG1pZ3JhdGVDb21tYW5kKVxuICAgICAgLmNvbW1hbmQobWlncmF0ZURldkNvbW1hbmQpXG4gICAgICAuY29tbWFuZChyZXNldENvbW1hbmQpXG4gICAgICAuY29tbWFuZChyZXN0b3JlQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKHNlZWRDb21tYW5kKVxuICAgICAgLmNvbW1hbmQoc3R1ZGlvQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKGRlZmF1bHRDb21tYW5kKVxuICAgICAgLmRlbWFuZENvbW1hbmQoKVxuICAgICAgLnN0cmljdChmYWxzZSk7IC8vIEFsbG93IHVua25vd24gb3B0aW9ucyB0byBiZSBwYXNzZWQgdGhyb3VnaFxuICB9LFxuICBoYW5kbGVyKCkge1xuICAgIC8vIERvIG5vdGhpbmdcbiAgfSxcbn07XG5cbmNvbnN0IGNsZWFuVXBMaXRlc3RyZWFtQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdjbGVhbnVwLWxpdGVzdHJlYW0nLFxuICBkZXNjcmliZTogJ0NsZWFuIHVwIHRlbXBvcmFsIExpdGVzdHJlYW0gZmlsZXMnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgY2xlYW51cC1saXRlc3RyZWFtJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5jbGVhblVwTGl0ZXN0cmVhbShwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgY3JlYXRlTGl0ZXN0cmVhbUNvbmZpZ0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnY3JlYXRlLWxpdGVzdHJlYW0tY29uZmlnJyxcbiAgZGVzY3JpYmU6ICdDcmVhdGUgTGl0ZXN0cmVhbSBjb25maWd1cmF0aW9uIGZpbGUnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgY3JlYXRlLWxpdGVzdHJlYW0tY29uZmlnJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBjcmVhdGVMaXRlc3RyZWFtQ29uZmlnKHByb2plY3QpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IGRlcGxveUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnZGVwbG95JyxcbiAgZGVzY3JpYmU6ICdBcHBseSBtaWdyYXRpb24gdG8gREIgd2l0aG91dCBpbml0aWFsaXppbmcgaXQnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgZGVwbG95JywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5kZXBsb3kocHJvamVjdCwgdW5rbm93bk9wdGlvbnMpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBkZXBsb3lGb3JjZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnZGVwbG95LWZvcmNlJyxcbiAgZGVzY3JpYmU6IFwiRm9yY2UgdG8gYXBwbHkgbWlncmF0aW9uIHRvIERCIHV0aWxpemluZyBMaXRlc3RyZWFtJ3MgYmFja3VwIHdpdGhvdXQgaW5pdGlhbGl6aW5nIGl0XCIsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSBkZXBsb3ktZm9yY2UnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLmRlcGxveUZvcmNlKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBsaXN0QmFja3Vwc0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnbGlzdC1iYWNrdXBzJyxcbiAgZGVzY3JpYmU6ICdMaXN0IExpdGVzdHJlYW0gYmFja3VwcycsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSBsaXN0LWJhY2t1cHMnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLmxpc3RCYWNrdXBzKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBtaWdyYXRlQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdtaWdyYXRlJyxcbiAgZGVzY3JpYmU6ICdBcHBseSBtaWdyYXRpb24gdG8gREIgd2l0aCBpbml0aWFsaXppbmcgaXQnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgbWlncmF0ZScsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMubWlncmF0ZShwcm9qZWN0LCB1bmtub3duT3B0aW9ucyksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IG1pZ3JhdGVEZXZDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ21pZ3JhdGUtZGV2JyxcbiAgZGVzY3JpYmU6ICdDcmVhdGUgYSBtaWdyYXRpb24gZmlsZScsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSBtaWdyYXRlLWRldicsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMubWlncmF0ZURldihwcm9qZWN0LCB1bmtub3duT3B0aW9ucyksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IHJlc2V0Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdyZXNldCcsXG4gIGRlc2NyaWJlOiAnUmVzZXQgREInLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgcmVzZXQnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLnJlc2V0KHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICAgIC8vIEZvcmNlIHRvIHJlc2V0IHRlc3QgZGF0YWJhc2VcbiAgICBpZiAocHJvY2Vzcy5lbnYuV0JfRU5WICE9PSAndGVzdCcpIHtcbiAgICAgIHByb2Nlc3MuZW52LldCX0VOViA9ICd0ZXN0JztcbiAgICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ1dCX0VOVj10ZXN0IHByaXNtYSByZXNldCcsIGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KSkpIHtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMucmVzZXQocHJvamVjdCwgdW5rbm93bk9wdGlvbnMpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCByZXN0b3JlQnVpbGRlciA9IHtcbiAgLi4uYnVpbGRlcixcbiAgb3V0cHV0OiB7XG4gICAgZGVzY3JpcHRpb246ICdPdXRwdXQgcGF0aCBvZiB0aGUgcmVzdG9yZWQgZGF0YWJhc2UuIERlZmF1bHRzIHRvIFwiPGRifHByaXNtYT4vcmVzdG9yZWQuc3FsaXRlM1wiLicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCByZXN0b3JlQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiByZXN0b3JlQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAncmVzdG9yZScsXG4gIGRlc2NyaWJlOiBcIlJlc3RvcmUgREIgZnJvbSBMaXRlc3RyZWFtJ3MgYmFja3VwXCIsXG4gIGJ1aWxkZXI6IHJlc3RvcmVCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgcmVzdG9yZScsIGFsbFByb2plY3RzKSkge1xuICAgICAgY29uc3Qgb3V0cHV0ID1cbiAgICAgICAgYXJndi5vdXRwdXQgPz8gKHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0eiA/ICdkYi9yZXN0b3JlZC5zcWxpdGUzJyA6ICdwcmlzbWEvcmVzdG9yZWQuc3FsaXRlMycpO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMucmVzdG9yZShwcm9qZWN0LCBvdXRwdXQpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBzZWVkQnVpbGRlciA9IHtcbiAgLi4uYnVpbGRlcixcbiAgZmlsZToge1xuICAgIGFsaWFzOiAnZicsXG4gICAgZGVzY3JpcHRpb246ICdQYXRoIG9mIHRoZSBzZWVkIHNjcmlwdC4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3Qgc2VlZENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2VlZEJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3NlZWQnLFxuICBkZXNjcmliZTogJ1BvcHVsYXRlIERCIHdpdGggc2VlZCBkYXRhJyxcbiAgYnVpbGRlcjogc2VlZEJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSBzZWVkJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5zZWVkKHByb2plY3QsIGFyZ3YuZmlsZSksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IHN0dWRpb0J1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gICdkYi11cmwtb3ItcGF0aCc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1VSTCBvciBwYXRoIHRvIHRoZSBkYXRhYmFzZScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG4gIHJlc3RvcmVkOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIG9wZW4gdGhlIGRlZmF1bHQgcmVzdG9yZWQgZGF0YWJhc2UgKDxkYnxwcmlzbWE+L3Jlc3RvcmVkLnNxbGl0ZTMpLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3Qgc3R1ZGlvQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzdHVkaW9CdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdzdHVkaW8gW2RiLXVybC1vci1wYXRoXScsXG4gIGRlc2NyaWJlOiAnT3BlbiBQcmlzbWEgU3R1ZGlvJyxcbiAgYnVpbGRlcjogc3R1ZGlvQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgaWYgKGFyZ3YucmVzdG9yZWQgJiYgYXJndi5kYlVybE9yUGF0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgY2Fubm90IHNwZWNpZnkgYm90aCAtLXJlc3RvcmVkIGFuZCAtLWRiLXVybC1vci1wYXRoLicpO1xuICAgIH1cblxuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YsIFsnZGItdXJsLW9yLXBhdGgnLCAncmVzdG9yZWQnXSk7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIHN0dWRpbycsIGFsbFByb2plY3RzKSkge1xuICAgICAgY29uc3QgZGJVcmxPclBhdGggPSBhcmd2LnJlc3RvcmVkXG4gICAgICAgID8gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6XG4gICAgICAgICAgPyAnZGIvcmVzdG9yZWQuc3FsaXRlMydcbiAgICAgICAgICA6ICdwcmlzbWEvcmVzdG9yZWQuc3FsaXRlMydcbiAgICAgICAgOiBhcmd2LmRiVXJsT3JQYXRoPy50b1N0cmluZygpO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMuc3R1ZGlvKHByb2plY3QsIGRiVXJsT3JQYXRoLCB1bmtub3duT3B0aW9ucyksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IGRlZmF1bHRDb21tYW5kQnVpbGRlciA9IHsgYXJnczogeyB0eXBlOiAnYXJyYXknIH0gfSBhcyBjb25zdDtcblxuY29uc3QgZGVmYXVsdENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgZGVmYXVsdENvbW1hbmRCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICckMCA8YXJncy4uPicsXG4gIGRlc2NyaWJlOiBcIlBhc3MgdGhlIGNvbW1hbmQgYW5kIGFyZ3VtZW50cyB0byBwcmlzbWEgYXMgaXMuIEFkZGl0aW9uYWwgUHJpc21hIGZsYWdzIGNhbiBhbHNvIGJlIGZvcndhcmRlZCBhZnRlciAnLS0nLlwiLFxuICBidWlsZGVyOiBkZWZhdWx0Q29tbWFuZEJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHNjcmlwdCA9IChhcmd2LmFyZ3M/LmpvaW4oJyAnKSA/PyAnJykudHJpbUVuZCgpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YsIFsnYXJncyddKTtcbiAgICBjb25zdCBmdWxsQ29tbWFuZCA9IFtzY3JpcHQsIHVua25vd25PcHRpb25zXS5maWx0ZXIoQm9vbGVhbikuam9pbignICcpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoYHByaXNtYSAke2Z1bGxDb21tYW5kfWAsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGBQUklTTUEgJHtmdWxsQ29tbWFuZH1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5mdW5jdGlvbiBjcmVhdGVMaXRlc3RyZWFtQ29uZmlnKHByb2plY3Q6IFByb2plY3QpOiB2b2lkIHtcbiAgY29uc3QgZGlyTmFtZSA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0eiA/ICdkYicgOiAncHJpc21hJztcbiAgY29uc3QgZGJQYXRoID0gYCR7ZGlyTmFtZX0vbW91bnQvcHJvZC5zcWxpdGUzYDtcbiAgY29uc3QgcmVxdWlyZWRFbnZWYXJzID0ge1xuICAgIENMT1VERkxBUkVfUjJfTElURVNUUkVBTV9BQ0NPVU5UX0lEOiBwcm9qZWN0LmVudi5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDT1VOVF9JRCxcbiAgICBDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQlVDS0VUX05BTUU6IHByb2plY3QuZW52LkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9CVUNLRVRfTkFNRSxcbiAgICBDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDRVNTX0tFWV9JRDogcHJvamVjdC5lbnYuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ0VTU19LRVlfSUQsXG4gICAgQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX1NFQ1JFVF9BQ0NFU1NfS0VZOiBwcm9qZWN0LmVudi5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fU0VDUkVUX0FDQ0VTU19LRVksXG4gIH0gYXMgY29uc3Q7XG4gIGNvbnN0IG1pc3NpbmdFbnZWYXJzID0gT2JqZWN0LmVudHJpZXMocmVxdWlyZWRFbnZWYXJzKVxuICAgIC5maWx0ZXIoKFssIHZhbHVlXSkgPT4gIXZhbHVlKVxuICAgIC5tYXAoKFtrZXldKSA9PiBrZXkpO1xuICBpZiAobWlzc2luZ0VudlZhcnMubGVuZ3RoID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIExpdGVzdHJlYW06ICR7bWlzc2luZ0VudlZhcnMuam9pbignLCAnKX1gKTtcbiAgfVxuXG4gIGNvbnN0IHJldGVudGlvbkNoZWNrSW50ZXJ2YWwgPSBwcm9qZWN0LmVudi5XQl9FTlYgPT09ICdzdGFnaW5nJyA/ICc1bScgOiAnMWgnO1xuICBjb25zdCBsaXRlc3RyZWFtQ29uZmlnID0gYGRiczpcbiAgLSBwYXRoOiAke2RiUGF0aH1cbiAgICBidXN5LXRpbWVvdXQ6IDVzXG4gICAgY2hlY2twb2ludC1pbnRlcnZhbDogMW1cbiAgICByZXBsaWNhOlxuICAgICAgdHlwZTogczNcbiAgICAgIGVuZHBvaW50OiBodHRwczovLyR7cmVxdWlyZWRFbnZWYXJzLkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9BQ0NPVU5UX0lEfS5yMi5jbG91ZGZsYXJlc3RvcmFnZS5jb21cbiAgICAgIGJ1Y2tldDogJHtyZXF1aXJlZEVudlZhcnMuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0JVQ0tFVF9OQU1FfVxuICAgICAgYWNjZXNzLWtleS1pZDogJHtyZXF1aXJlZEVudlZhcnMuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ0VTU19LRVlfSUR9XG4gICAgICBzZWNyZXQtYWNjZXNzLWtleTogJHtyZXF1aXJlZEVudlZhcnMuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX1NFQ1JFVF9BQ0NFU1NfS0VZfVxuICAgICAgc25hcHNob3QtaW50ZXJ2YWw6IDI0aCAgIyBDcmVhdGUgYSBiYWNrdXAgcGVyIGRheVxuICAgICAgcmV0ZW50aW9uOiA3MmggICAgICAgICAgIyBLZWVwIGJhY2t1cHMgZm9yIDMgZGF5c1xuICAgICAgcmV0ZW50aW9uLWNoZWNrLWludGVydmFsOiAke3JldGVudGlvbkNoZWNrSW50ZXJ2YWx9XG4gICAgICBzeW5jLWludGVydmFsOiAxbVxuYDtcblxuICBjb25zdCBjb25maWdQYXRoID0gJy9ldGMvbGl0ZXN0cmVhbS55bWwnO1xuICB0cnkge1xuICAgIGZzLndyaXRlRmlsZVN5bmMoY29uZmlnUGF0aCwgbGl0ZXN0cmVhbUNvbmZpZyk7XG4gICAgY29uc29sZS5pbmZvKGBHZW5lcmF0ZWQgJHtjb25maWdQYXRofWApO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IHJlYXNvbiA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byB3cml0ZSAke2NvbmZpZ1BhdGh9OiAke3JlYXNvbn1gLCB7XG4gICAgICBjYXVzZTogZXJyb3IsXG4gICAgfSk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZmluZFByaXNtYVByb2plY3RzKGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMpOiBQcm9taXNlPFByb2plY3RbXT4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgY29uc3QgZmlsdGVyZWQgPSBwcm9qZWN0cy5kZXNjZW5kYW50cy5maWx0ZXIoXG4gICAgKHByb2plY3QpID0+IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5wcmlzbWEgPz8gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LnByaXNtYVxuICApO1xuICBpZiAoZmlsdGVyZWQubGVuZ3RoID09PSAwKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByaXNtYSBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbiAgcmV0dXJuIGZpbHRlcmVkO1xufVxuXG4vKipcbiAqIEV4dHJhY3QgdW5rbm93biBvcHRpb25zIGZyb20gYXJndiB0byBwYXNzIHRvIHByaXNtYSBjb21tYW5kXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndjogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGtub3duT3B0aW9uczogc3RyaW5nW10gPSBbXSk6IHN0cmluZyB7XG4gIGNvbnN0IHVua25vd25PcHRpb25zOiBzdHJpbmdbXSA9IFtdO1xuXG4gIC8vIEJ1aWxkIGxpc3Qgb2Yga25vd24gb3B0aW9ucyBmcm9tIHNoYXJlZCBvcHRpb25zIGJ1aWxkZXJzXG4gIGNvbnN0IHNoYXJlZE9wdGlvbktleXMgPSBPYmplY3Qua2V5cyhzaGFyZWRPcHRpb25zQnVpbGRlcik7XG4gIGNvbnN0IHNoYXJlZE9wdGlvbkFsaWFzZXMgPSBPYmplY3QudmFsdWVzKHNoYXJlZE9wdGlvbnNCdWlsZGVyKVxuICAgIC5mbGF0TWFwKChvcHRpb24pID0+IHtcbiAgICAgIGlmICgnYWxpYXMnIGluIG9wdGlvbikge1xuICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShvcHRpb24uYWxpYXMpID8gb3B0aW9uLmFsaWFzIDogW29wdGlvbi5hbGlhc107XG4gICAgICB9XG4gICAgICByZXR1cm4gW107XG4gICAgfSlcbiAgICAubWFwKFN0cmluZyk7XG5cbiAgY29uc3QgYWxsS25vd25PcHRpb25zID0gbmV3IFNldChbXG4gICAgLi4ua25vd25PcHRpb25zLFxuICAgIC4uLnNoYXJlZE9wdGlvbktleXMsXG4gICAgLi4uc2hhcmVkT3B0aW9uQWxpYXNlcyxcbiAgICAvLyBJbnRlcm5hbCB5YXJncyBwcm9wZXJ0aWVzXG4gICAgJy0tJyxcbiAgICAnXycsXG4gICAgJyQwJyxcbiAgXSk7XG5cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoYXJndikpIHtcbiAgICBpZiAoIWFsbEtub3duT3B0aW9ucy5oYXMoa2V5KSkge1xuICAgICAgLy8gU2tpcCBjYW1lbENhc2UgdmVyc2lvbnMgb2Yga2ViYWItY2FzZSBvcHRpb25zIHRvIGF2b2lkIGR1cGxpY2F0aW9uXG4gICAgICAvLyBJZiB3ZSBoYXZlIGJvdGggJ2NyZWF0ZS1vbmx5JyBhbmQgJ2NyZWF0ZU9ubHknLCBwcmVmZXIgdGhlIGtlYmFiLWNhc2UgdmVyc2lvblxuICAgICAgY29uc3Qga2ViYWJDYXNlS2V5ID0ga2V5LnJlcGxhY2VBbGwoL1tBLVpdL2csIChtYXRjaCkgPT4gYC0ke21hdGNoLnRvTG93ZXJDYXNlKCl9YCk7XG4gICAgICBpZiAoa2ViYWJDYXNlS2V5ICE9PSBrZXkgJiYgYXJndltrZWJhYkNhc2VLZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29udGludWU7IC8vIFNraXAgY2FtZWxDYXNlIHZlcnNpb24gaWYga2ViYWItY2FzZSBleGlzdHNcbiAgICAgIH1cblxuICAgICAgLy8gSGFuZGxlIGJvb2xlYW4gZmxhZ3NcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJyAmJiB2YWx1ZSkge1xuICAgICAgICB1bmtub3duT3B0aW9ucy5wdXNoKGAtLSR7a2V5fWApO1xuICAgICAgfVxuICAgICAgLy8gSGFuZGxlIHN0cmluZy9udW1iZXIgdmFsdWVzXG4gICAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgdW5rbm93bk9wdGlvbnMucHVzaChgLS0ke2tleX1gLCBTdHJpbmcodmFsdWUpKTtcbiAgICAgIH1cbiAgICAgIC8vIEhhbmRsZSBhcnJheXNcbiAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB2YWx1ZSkge1xuICAgICAgICAgIHVua25vd25PcHRpb25zLnB1c2goYC0tJHtrZXl9YCwgU3RyaW5nKGl0ZW0pKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHBhc3N0aHJvdWdoQXJncyA9IEFycmF5LmlzQXJyYXkoYXJndlsnLS0nXSkgPyBhcmd2WyctLSddLm1hcChTdHJpbmcpIDogW107XG4gIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbLi4udW5rbm93bk9wdGlvbnMsIC4uLnBhc3N0aHJvdWdoQXJnc10pO1xufVxuIiwiaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24gfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICByZXRyeToge1xuICAgIGRlc2NyaXB0aW9uOiAnQSBtYXhpbXVtIHJldHJ5IGNvdW50JyxcbiAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICBhbGlhczogJ3InLFxuICAgIGRlZmF1bHQ6IDMsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBfYXJndW1lbnRzQnVpbGRlciA9IHtcbiAgY29tbWFuZDoge1xuICAgIGRlc2NyaXB0aW9uOiAnQSBjb21tYW5kIHRvIHJldHJ5JyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbiAgYXJnczoge1xuICAgIGRlc2NyaXB0aW9uOiAnQXJndW1lbnRzIGZvciB0aGUgY29tbWFuZCcsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCByZXRyeUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8XG4gIHVua25vd24sXG4gIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXIgJiB0eXBlb2YgX2FyZ3VtZW50c0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAncmV0cnkgW2NvbW1hbmRdIFthcmdzLi4uXScsXG4gIGRlc2NyaWJlOiAnUmV0cnkgdGhlIGdpdmVuIGNvbW1hbmQgdW50aWwgaXQgc3VjY2VlZHMnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YpO1xuICAgIGlmICghcHJvamVjdCkge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IGNtZEFuZEFyZ3MgPSBbYXJndi5jb21tYW5kLCAuLi4oYXJndi5hcmdzID8/IFtdKSwgLi4uYXJndi5fLnNsaWNlKDEpXS5maWx0ZXIoQm9vbGVhbik7XG4gICAgbGV0IGxhc3RTdGF0dXMgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJndi5yZXRyeTsgaSsrKSB7XG4gICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGBcXG4ke2NoYWxrLnllbGxvdyhgIyR7aX0gUmV0cnlpbmc6ICR7Y21kQW5kQXJncy5qb2luKCcgJyl9YCl9YCk7XG4gICAgICB9XG4gICAgICAvLyBUT0RPOiBzaG91bGQgd2UgYWRkIHNpbmdsZSBxdW90ZXMgYXJvdW5kIGVhY2ggYXJndW1lbnQ/XG4gICAgICBsYXN0U3RhdHVzID0gYXdhaXQgcnVuV2l0aFNwYXduKGNtZEFuZEFyZ3Muam9pbignICcpLCBwcm9qZWN0LCBhcmd2LCB7XG4gICAgICAgIGV4aXRJZkZhaWxlZDogZmFsc2UsXG4gICAgICAgIG9uU2lnbmFsOiAoc2lnbmFsKSA9PiB7XG4gICAgICAgICAgaWYgKHNpZ25hbCkge1xuICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgaWYgKGxhc3RTdGF0dXMgPT09IDApIHJldHVybjtcbiAgICB9XG4gICAgcHJvY2Vzcy5leGl0KGxhc3RTdGF0dXMpO1xuICB9LFxufTtcbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgb3MgZnJvbSAnbm9kZTpvcyc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduLCBydW5XaXRoU3Bhd25JblBhcmFsbGVsIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBwYWNrYWdlTWFuYWdlcldpdGhSdW4gfSBmcm9tICcuLi91dGlscy9ydW50aW1lLmpzJztcblxuaW1wb3J0IHsgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kVXRpbHMuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBzZXR1cENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnc2V0dXAnLFxuICBkZXNjcmliZTogJ1NldHVwIGRldmVsb3BtZW50IGVudmlyb25tZW50LiAuZW52IGZpbGVzIGFyZSBpZ25vcmVkLicsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IHNldHVwKGFyZ3YpO1xuICB9LFxufTtcblxuLy8gVGVzdCBjb2RlIHJlcXVpcmVzIFBhcnRpYWw8Li4uPlxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwKFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4+LFxuICBwcm9qZWN0UGF0aEZvclRlc3Rpbmc/OiBzdHJpbmdcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndiwgZmFsc2UsIHByb2plY3RQYXRoRm9yVGVzdGluZyk7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgnc2V0dXAnLCBwcm9qZWN0cy5kZXNjZW5kYW50cykpIHtcbiAgICBjb25zdCBkaXJlbnRzID0gYXdhaXQgZnMucmVhZGRpcihwcm9qZWN0LmRpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICBpZiAocHJvamVjdCA9PT0gcHJvamVjdHMucm9vdCkge1xuICAgICAgaWYgKG9zLnBsYXRmb3JtKCkgPT09ICdkYXJ3aW4nKSB7XG4gICAgICAgIGNvbnN0IHBhY2thZ2VzID0gWydwc3RyZWUnXTtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChgYnJldyBpbnN0YWxsICR7cGFja2FnZXMuam9pbignICcpfWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGlyZW50cy5zb21lKChkKSA9PiBkLmlzRmlsZSgpICYmIGQubmFtZS5pbmNsdWRlcygnLXZlcnNpb24nKSkpIHtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKCdhc2RmIGluc3RhbGwnLCBwcm9qZWN0LCBhcmd2LCB7IGV4aXRJZkZhaWxlZDogZmFsc2UgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGRpcmVudHMuc29tZSgoZCkgPT4gZC5pc0ZpbGUoKSAmJiBkLm5hbWUgPT09ICdweXByb2plY3QudG9tbCcpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKCdwb2V0cnkgY29uZmlnIHZpcnR1YWxlbnZzLmluLXByb2plY3QgdHJ1ZScsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgY29uc3QgWywgdmVyc2lvbl0gPSBjaGlsZF9wcm9jZXNzLmV4ZWNTeW5jKCdhc2RmIGN1cnJlbnQgcHl0aG9uJykudG9TdHJpbmcoKS50cmltKCkuc3BsaXQoL1xccysvKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoYHBvZXRyeSBlbnYgdXNlICR7dmVyc2lvbn1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bigncG9ldHJ5IHJ1biBwaXAgaW5zdGFsbCAtLXVwZ3JhZGUgcGlwJywgcHJvamVjdCwgYXJndik7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oJ3BvZXRyeSBpbnN0YWxsIC0tYW5zaScsIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIChwcm9qZWN0ID09PSBwcm9qZWN0cy5yb290IHx8ICFwcm9qZWN0cy5yb290LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZ2VuLWNvZGUnXSkgJiZcbiAgICAgIHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWydnZW4tY29kZSddXG4gICAgKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7cGFja2FnZU1hbmFnZXJXaXRoUnVufSBnZW4tY29kZWAsIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHByb2plY3QgPSBwcm9qZWN0cy5kZXNjZW5kYW50cy5maW5kKChwKSA9PiBwLnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8ucGxheXdyaWdodCk7XG4gIGlmIChwcm9qZWN0KSB7XG4gICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3BhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gcGxheXdyaWdodCBpbnN0YWxsIC0td2l0aC1kZXBzYCwgcHJvamVjdCwgYXJndik7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBzaGVsbEVzY2FwZUFyZ3VtZW50IH0gZnJvbSAnLi4vdXRpbHMvc2hlbGwuanMnO1xuXG5leHBvcnQgY29uc3Qgc2NyaXB0T3B0aW9uc0J1aWxkZXIgPSB7XG4gIHdhdGNoOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHdhdGNoIGZpbGVzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIGFyZ3M6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0FyZ3VtZW50cyBmb3IgY29yZSBjb21tYW5kJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICAgIGFsaWFzOiAnYScsXG4gICAgZGVmYXVsdDogW10sXG4gIH0sXG4gICdkb2NrZXItb3B0aW9ucyc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0FyZ3VtZW50cyBmb3IgXCJkb2NrZXIgcnVuXCInLFxuICAgIHR5cGU6ICdhcnJheScsXG4gICAgZGVmYXVsdDogW10sXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBTY3JpcHRBcmd2ID0gUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2NyaXB0T3B0aW9uc0J1aWxkZXI+Pj4gJiB7XG4gICctLSc/OiBzdHJpbmdbXTtcbiAgbm9ybWFsaXplZEFyZ3NUZXh0Pzogc3RyaW5nO1xuICBub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQ/OiBzdHJpbmc7XG4gIHNpbGVudD86IGJvb2xlYW47XG4gIHZlcmJvc2U/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUFyZ3MoXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNjcmlwdE9wdGlvbnNCdWlsZGVyPj4+ICYgeyAnLS0nPzogc3RyaW5nW10gfVxuKTogdm9pZCB7XG4gIChhcmd2IGFzIFNjcmlwdEFyZ3YpLm5vcm1hbGl6ZWRBcmdzVGV4dCA9IFsuLi4oYXJndi5hcmdzID8/IFtdKSwgLi4uKGFyZ3YuXz8uc2xpY2UoMSkgPz8gW10pLCAuLi4oYXJndlsnLS0nXSA/PyBbXSldXG4gICAgLm1hcCgoYXJnKSA9PiBzaGVsbEVzY2FwZUFyZ3VtZW50KFN0cmluZyhhcmcpKSlcbiAgICAuam9pbignICcpO1xuICAoYXJndiBhcyBTY3JpcHRBcmd2KS5ub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQgPSAoYXJndi5kb2NrZXJPcHRpb25zID8/IFtdKVxuICAgIC5tYXAoKGFyZykgPT4gc2hlbGxFc2NhcGVBcmd1bWVudChTdHJpbmcoYXJnKSkpXG4gICAgLmpvaW4oJyAnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvRGV2TnVsbChhcmd2OiB1bmtub3duKTogc3RyaW5nIHtcbiAgcmV0dXJuIChhcmd2IGFzIHsgc2lsZW50OiBib29sZWFuIH0pLnNpbGVudCA/IGAgPiAvZGV2L251bGxgIDogJyc7XG59XG4iLCJpbXBvcnQgeyBzcGF3blN5bmMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5pbXBvcnQgeyBzcGF3bkFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGtpbGxQb3J0UHJvY2VzcyBmcm9tICdraWxsLXBvcnQnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQsIHByaW50U3RhcnQgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5cbmltcG9ydCB7IGlzUG9ydEF2YWlsYWJsZSB9IGZyb20gJy4vcG9ydC5qcyc7XG5cbmNvbnN0IGtpbGxlZCA9IG5ldyBTZXQ8bnVtYmVyIHwgc3RyaW5nPigpO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24ga2lsbFBvcnRQcm9jZXNzSW1tZWRpYXRlbHlBbmRPbkV4aXQocG9ydDogbnVtYmVyLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGF2YWlsYWJsZSA9IGF3YWl0IGlzUG9ydEF2YWlsYWJsZShwb3J0KTtcbiAgaWYgKCFhdmFpbGFibGUpIHtcbiAgICBhd2FpdCBraWxsUG9ydENvbnRhaW5lckFuZFByb2Nlc3MocG9ydCwgcHJvamVjdCk7XG4gIH1cblxuICBjb25zdCBraWxsRnVuYyA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBpZiAoa2lsbGVkLmhhcyhwb3J0KSkgcmV0dXJuO1xuXG4gICAga2lsbGVkLmFkZChwb3J0KTtcbiAgICBhd2FpdCBraWxsUG9ydENvbnRhaW5lckFuZFByb2Nlc3MocG9ydCwgcHJvamVjdCk7XG4gIH07XG4gIGZvciAoY29uc3Qgc2lnbmFsIG9mIFsnYmVmb3JlRXhpdCcsICdTSUdJTlQnLCAnU0lHVEVSTScsICdTSUdRVUlUJ10pIHtcbiAgICBwcm9jZXNzLm9uKHNpZ25hbCwga2lsbEZ1bmMpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGtpbGxQb3J0Q29udGFpbmVyQW5kUHJvY2Vzcyhwb3J0OiBudW1iZXIsIHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgLy8gV2Ugc2hvdWxkIHN0b3AgRG9ja2VyIGNvbnRhaW5lcnMgZmlyc3QgYmVjYXVzZSBga2lsbC1wb3J0YCBtYXkgZmFpbCB0byBzdG9wIERvY2tlciBjb250YWluZXJzLlxuICBhd2FpdCBzdG9wRG9ja2VyQ29udGFpbmVyQnlQb3J0KHBvcnQsIHByb2plY3QpO1xuICB0cnkge1xuICAgIGF3YWl0IGtpbGxQb3J0UHJvY2Vzcyhwb3J0KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdG9wRG9ja2VyQ29udGFpbmVyQnlJbWFnZU5hbWUoaW1hZ2VOYW1lOiBzdHJpbmcsIHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgcmVtb3ZlRG9ja2VyQ29udGFpbmVycyhbJy0tZmlsdGVyJywgYG5hbWU9JHtpbWFnZU5hbWV9YF0sIHByb2plY3QpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RvcERvY2tlckNvbnRhaW5lckJ5UG9ydChwb3J0OiBudW1iZXIsIHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgcmVtb3ZlRG9ja2VyQ29udGFpbmVycyhbJy0tZmlsdGVyJywgYHB1Ymxpc2g9JHtwb3J0fWBdLCBwcm9qZWN0KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlRG9ja2VyQ29udGFpbmVycyhmaWx0ZXJBcmdzOiBzdHJpbmdbXSwgcHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IGNvbnRhaW5lcklkcyA9IGF3YWl0IGxpc3REb2NrZXJDb250YWluZXJJZHMoZmlsdGVyQXJncywgcHJvamVjdCk7XG4gICAgaWYgKGNvbnRhaW5lcklkcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIGF3YWl0IHNwYXduQXN5bmMoJ2RvY2tlcicsIFsncm0nLCAnLWYnLCAuLi5jb250YWluZXJJZHNdLCB7XG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIGVudjogcHJvamVjdC5lbnYsXG4gICAgfSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBsaXN0RG9ja2VyQ29udGFpbmVySWRzKGZpbHRlckFyZ3M6IHN0cmluZ1tdLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCB7IHN0ZG91dCB9ID0gYXdhaXQgc3Bhd25Bc3luYygnZG9ja2VyJywgWydwcycsICctcScsIC4uLmZpbHRlckFyZ3NdLCB7XG4gICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgZW52OiBwcm9qZWN0LmVudixcbiAgfSk7XG4gIHJldHVybiBzdGRvdXRcbiAgICAuc3BsaXQoL1xccysvKVxuICAgIC5tYXAoKGlkKSA9PiBpZC50cmltKCkpXG4gICAgLmZpbHRlcihCb29sZWFuKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXduU3luY09uRXhpdChzY3JpcHQ6IHN0cmluZywgcHJvamVjdDogUHJvamVjdCk6IHZvaWQge1xuICBjb25zdCBraWxsRnVuYyA9ICgpOiB2b2lkID0+IHtcbiAgICBpZiAoa2lsbGVkLmhhcyhzY3JpcHQpKSByZXR1cm47XG5cbiAgICBraWxsZWQuYWRkKHNjcmlwdCk7XG4gICAgcHJpbnRTdGFydChzY3JpcHQsIHByb2plY3QpO1xuICAgIGNvbnN0IHsgc3RhdHVzIH0gPSBzcGF3blN5bmMoc2NyaXB0LCB7IGN3ZDogcHJvamVjdC5kaXJQYXRoLCBzaGVsbDogdHJ1ZSwgc3RkaW86ICdpbmhlcml0JyB9KTtcbiAgICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKHNjcmlwdCwgc3RhdHVzLCB7fSk7XG4gIH07XG4gIGZvciAoY29uc3Qgc2lnbmFsIG9mIFsnYmVmb3JlRXhpdCcsICdTSUdJTlQnLCAnU0lHVEVSTScsICdTSUdRVUlUJ10pIHtcbiAgICBwcm9jZXNzLm9uKHNpZ25hbCwga2lsbEZ1bmMpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBjcmVhdGVTZXJ2ZXIgfSBmcm9tICdub2RlOm5ldCc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuXG5pbXBvcnQgeyBraWxsUG9ydFByb2Nlc3NJbW1lZGlhdGVseUFuZE9uRXhpdCB9IGZyb20gJy4vcHJvY2Vzcy5qcyc7XG5cbi8qKlxuICogQ2hlY2tzIHRoZSBnaXZlbiBwb3J0IGFuZCBraWxscyBhbnkgcHJvY2VzcyB1c2luZyBpdC5cbiAqIE5vdGUgd2IgYWx3YXlzIHJlcXVpcmVzIFBPUlQgZW52aXJvbm1lbnQgdmFyaWFibGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjaGVja0FuZEtpbGxQb3J0UHJvY2VzcyhyYXdQb3J0OiB1bmtub3duLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3QgcG9ydCA9IE51bWJlcihyYXdQb3J0KTtcbiAgaWYgKCFwb3J0KSB0aHJvdyBuZXcgRXJyb3IoYFRoZSBnaXZlbiBwb3J0ICgke3BvcnR9KSBpcyBpbnZhbGlkLmApO1xuXG4gIGF3YWl0IGtpbGxQb3J0UHJvY2Vzc0ltbWVkaWF0ZWx5QW5kT25FeGl0KHBvcnQsIHByb2plY3QpO1xuICByZXR1cm4gcG9ydDtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSBwb3J0IGlzIGF2YWlsYWJsZS5cbiAqIEBwYXJhbSBwb3J0IC0gVGhlIHBvcnQgbnVtYmVyIHRvIGNoZWNrXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0cnVlIGlmIHRoZSBwb3J0IGlzIGF2YWlsYWJsZSwgZmFsc2Ugb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpc1BvcnRBdmFpbGFibGUocG9ydDogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIC8vIENoZWNrIGJvdGggc3RhY2tzIHRvIGNhdGNoIHByb2Nlc3NlcyBib3VuZCBvbmx5IG9uIElQdjYgb3IgSVB2NC5cbiAgZm9yIChjb25zdCBob3N0IG9mIFsnMTI3LjAuMC4xJywgJzo6J10pIHtcbiAgICBjb25zdCBhdmFpbGFibGUgPSBhd2FpdCBwcm9iZVBvcnQoaG9zdCwgcG9ydCk7XG4gICAgaWYgKCFhdmFpbGFibGUpIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcHJvYmVQb3J0KGhvc3Q6IHN0cmluZywgcG9ydDogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IHNlcnZlciA9IGNyZWF0ZVNlcnZlcigpO1xuXG4gICAgc2VydmVyLm9uY2UoJ2Vycm9yJywgKGVycjogTm9kZUpTLkVycm5vRXhjZXB0aW9uKSA9PiB7XG4gICAgICBpZiAoZXJyLmNvZGUgPT09ICdFQUREUklOVVNFJykge1xuICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGVyci5jb2RlID09PSAnRUFGTk9TVVBQT1JUJykge1xuICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIHNlcnZlci5vbmNlKCdsaXN0ZW5pbmcnLCAoKSA9PiB7XG4gICAgICBzZXJ2ZXIuY2xvc2UoKCkgPT4ge1xuICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBzZXJ2ZXIubGlzdGVuKHBvcnQsIGhvc3QpO1xuICB9KTtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jT25FeGl0IH0gZnJvbSAnLi4vdXRpbHMvcHJvY2Vzcy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBEb2NrZXIgY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIERvY2tlclNjcmlwdHMge1xuICBidWlsZEltYWdlKHByb2plY3Q6IFByb2plY3QsIHZlcnNpb246IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy8gZS5nLiBjb2RpbmctYm9vc3RlciB1c2VzIGBcImRvY2tlci9idWlsZC9wcmVwYXJlXCI6IFwidG91Y2ggZHJpbGwtdXNlcnMuY3N2XCIsYFxuICAgIGNvbnN0IHByZWZpeCA9IHByb2plY3QuZG9ja2VyUGFja2FnZUpzb24uc2NyaXB0cz8uWydkb2NrZXIvYnVpbGQvcHJlcGFyZSddXG4gICAgICA/ICdZQVJOIHJ1biBkb2NrZXIvYnVpbGQvcHJlcGFyZSAmJiAnXG4gICAgICA6ICcnO1xuICAgIHJldHVybiBgY2QgJHtwYXRoLmRpcm5hbWUocHJvamVjdC5maW5kRmlsZSgnRG9ja2VyZmlsZScpKX1cbiAgICAmJiAke3ByZWZpeH1ZQVJOIHdiIG9wdGltaXplRm9yRG9ja2VyQnVpbGQgLS1vdXRzaWRlXG4gICAgJiYgWUFSTiB3YiByZXRyeSAtLSBkb2NrZXIgYnVpbGQgLXQgJHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX1cbiAgICAgICAgLS1idWlsZC1hcmcgQVJDSD0kKFsgJCh1bmFtZSAtbSkgPSAnYXJtNjQnIF0gJiYgZWNobyBhcm02NCB8fCBlY2hvIHg4Nl82NClcbiAgICAgICAgLS1idWlsZC1hcmcgV0JfRU5WPSR7cHJvamVjdC5lbnYuV0JfRU5WfVxuICAgICAgICAtLWJ1aWxkLWFyZyBXQl9WRVJTSU9OPSR7dmVyc2lvbn0gLmA7XG4gIH1cblxuICBzdG9wQW5kU3RhcnQocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJywgYWRkaXRpb25hbEFyZ3MgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuc3RvcChwcm9qZWN0KX0gJiYgJHt0aGlzLnN0YXJ0KHByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zLCBhZGRpdGlvbmFsQXJncyl9YDtcbiAgfVxuXG4gIHN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycsIGFkZGl0aW9uYWxBcmdzID0gJycpOiBzdHJpbmcge1xuICAgIHNwYXduU3luY09uRXhpdCh0aGlzLnN0b3AocHJvamVjdCksIHByb2plY3QpO1xuICAgIGNvbnN0IGFsbG9jYXRlVHR5ID0gYWRkaXRpb25hbEFyZ3MuaW5jbHVkZXMoJy9iaW4vYmFzaCcpO1xuICAgIHJldHVybiBgZG9ja2VyIHJ1biAtLXJtICR7YWxsb2NhdGVUdHkgPyAnLWl0ICcgOiAnJ30tLXB1Ymxpc2ggJHtwcm9qZWN0LmVudi5QT1JUfTo4MDgwIC0tbmFtZSAke3Byb2plY3QuZG9ja2VySW1hZ2VOYW1lfSAke2FkZGl0aW9uYWxPcHRpb25zfSAke3Byb2plY3QuZG9ja2VySW1hZ2VOYW1lfSAke2FkZGl0aW9uYWxBcmdzfWA7XG4gIH1cblxuICBzdG9wKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIHJldHVybiBgdHJ1ZSAkKGRvY2tlciBybSAtZiAkKGRvY2tlciBjb250YWluZXIgbHMgLXEgLWYgbmFtZT0ke3Byb2plY3QuZG9ja2VySW1hZ2VOYW1lfSkgMj4gL2Rldi9udWxsKWA7XG4gIH1cblxuICBzdG9wQWxsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGB0cnVlICQoZG9ja2VyIHJtIC1mICQoZG9ja2VyIHBzIC1xKSAyPiAvZGV2L251bGwpYDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZG9ja2VyU2NyaXB0cyA9IG5ldyBEb2NrZXJTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFRlc3RBcmd2IH0gZnJvbSAnLi4vLi4vY29tbWFuZHMvdGVzdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyB9IGZyb20gJy4uLy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzIH0gZnJvbSAnLi4vLi4vdXRpbHMvcG9ydC5qcyc7XG5pbXBvcnQgeyBidWlsZFNoZWxsQ29tbWFuZCwgYnVpbGRTaGVsbEVudmlyb25tZW50QXNzaWdubWVudCB9IGZyb20gJy4uLy4uL3V0aWxzL3NoZWxsLmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgdG9EZXZOdWxsIH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBkb2NrZXJTY3JpcHRzIH0gZnJvbSAnLi4vZG9ja2VyU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwcmlzbWFTY3JpcHRzIH0gZnJvbSAnLi4vcHJpc21hU2NyaXB0cy5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGVzdEUyRU9wdGlvbnMge1xuICAvKiogJy0tZTJlIGdlbmVyYXRlJyBjYWxscyAnY29kZWdlbiBodHRwOi8vbG9jYWxob3N0OjgwODAnICovXG4gIHBsYXl3cmlnaHRBcmdzPzogc3RyaW5nW107XG4gIC8qKiBSYXcgUGxheXdyaWdodCBhcmdzIGZvcndhcmRlZCBhZnRlciBgd2IgdGVzdCAtLSAuLi5gICovXG4gIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBhbiBhcHAuXG4gKiBOb3RlIHRoYXQgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VTY3JpcHRzIHtcbiAgcHJpdmF0ZSByZWFkb25seSBzaG91bGRXYWl0QW5kT3BlbkFwcDogYm9vbGVhbjtcbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKHNob3VsZFdhaXRBbmRPcGVuQXBwOiBib29sZWFuKSB7XG4gICAgdGhpcy5zaG91bGRXYWl0QW5kT3BlbkFwcCA9IHNob3VsZFdhaXRBbmRPcGVuQXBwO1xuICB9XG5cbiAgYnVpbGREb2NrZXIocHJvamVjdDogUHJvamVjdCwgdmVyc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZG9ja2VyU2NyaXB0cy5idWlsZEltYWdlKHByb2plY3QsIHZlcnNpb24pO1xuICB9XG5cbiAgLy8gLS0tLS0tLS0tLS0tIFNUQVJUOiBzdGFydCBjb21tYW5kcyAtLS0tLS0tLS0tLS1cbiAgYXN5bmMgc3RhcnREZXYocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgYXdhaXQgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocHJvamVjdC5lbnYuUE9SVCwgcHJvamVjdCk7XG4gICAgaWYgKCF0aGlzLnNob3VsZFdhaXRBbmRPcGVuQXBwKSByZXR1cm4gdGhpcy5zdGFydERldlByb3RlY3RlZChwcm9qZWN0LCBhcmd2KTtcblxuICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAnWUFSTicsXG4gICAgICAnd2InLFxuICAgICAgJ2NvbmN1cnJlbnRseScsXG4gICAgICAuLi5idWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndiksXG4gICAgICAnLS1raWxsLW90aGVycy1vbi1mYWlsJyxcbiAgICAgIHRoaXMuc3RhcnREZXZQcm90ZWN0ZWQocHJvamVjdCwgYXJndiksXG4gICAgICB0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QpLFxuICAgIF0pO1xuICB9XG4gIGFzeW5jIHN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBhd2FpdCBjaGVja0FuZEtpbGxQb3J0UHJvY2Vzcyhwcm9qZWN0LmVudi5QT1JULCBwcm9qZWN0KTtcbiAgICBpZiAoIXRoaXMuc2hvdWxkV2FpdEFuZE9wZW5BcHApIHJldHVybiB0aGlzLnN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0LCBhcmd2KTtcblxuICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAnWUFSTicsXG4gICAgICAnd2InLFxuICAgICAgJ2NvbmN1cnJlbnRseScsXG4gICAgICAuLi5idWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndiksXG4gICAgICAnLS1raWxsLW90aGVycy1vbi1mYWlsJyxcbiAgICAgIHRoaXMuc3RhcnRQcm9kdWN0aW9uUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YpLFxuICAgICAgdGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0KSxcbiAgICBdKTtcbiAgfVxuICBhc3luYyBzdGFydFRlc3QocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgYXdhaXQgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocHJvamVjdC5lbnYuUE9SVCwgcHJvamVjdCk7XG4gICAgcmV0dXJuIHRoaXMuc3RhcnRQcm9kdWN0aW9uUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YpO1xuICB9XG4gIGFzeW5jIHN0YXJ0RG9ja2VyKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGF3YWl0IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHByb2plY3QuZW52LlBPUlQsIHByb2plY3QpO1xuICAgIGlmICghdGhpcy5zaG91bGRXYWl0QW5kT3BlbkFwcCkge1xuICAgICAgcmV0dXJuIGAke3RoaXMuYnVpbGREb2NrZXIocHJvamVjdCwgJ2RldmVsb3BtZW50Jyl9XG4gICAgICAmJiAke2RvY2tlclNjcmlwdHMuc3RvcEFuZFN0YXJ0KHByb2plY3QsIGFyZ3Yubm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0ID8/ICcnLCBhcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJyl9YDtcbiAgICB9XG5cbiAgICByZXR1cm4gYCR7dGhpcy5idWlsZERvY2tlcihwcm9qZWN0LCAnZGV2ZWxvcG1lbnQnKX1cbiAgICAgICYmICR7YnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgICAnWUFSTicsXG4gICAgICAgICd3YicsXG4gICAgICAgICdjb25jdXJyZW50bHknLFxuICAgICAgICAuLi5idWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndiksXG4gICAgICAgICctLWtpbGwtb3RoZXJzLW9uLWZhaWwnLFxuICAgICAgICBkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChwcm9qZWN0LCBhcmd2Lm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCA/PyAnJywgYXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJycpLFxuICAgICAgICB0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QpLFxuICAgICAgXSl9YDtcbiAgfVxuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBzdGFydERldlByb3RlY3RlZChfOiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nO1xuICBwcm90ZWN0ZWQgc3RhcnRQcm9kdWN0aW9uUHJvdGVjdGVkKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIGNvbnN0IGVjb3N5c3RlbUNvbmZpZ1BhdGggPSBmaW5kRWNvc3lzdGVtQ29uZmlnUGF0aChwcm9qZWN0KTtcbiAgICBjb25zdCBjb21tYW5kcyA9XG4gICAgICBlY29zeXN0ZW1Db25maWdQYXRoID09PSB1bmRlZmluZWRcbiAgICAgICAgPyBbXG4gICAgICAgICAgICBgWUFSTiB3YiBidWlsZElmTmVlZGVkICR7YXJndi52ZXJib3NlID8gJy0tdmVyYm9zZScgOiAnJ31gLnRyaW0oKSxcbiAgICAgICAgICAgIGBub2RlIGRpc3QvaW5kZXguanMgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLnRyaW0oKSxcbiAgICAgICAgICBdXG4gICAgICAgIDogW3Byb2plY3QuYnVpbGRDb21tYW5kLCBgcG0yLXJ1bnRpbWUgc3RhcnQgLS1uby1hdXRvcmVzdGFydCAke2Vjb3N5c3RlbUNvbmZpZ1BhdGh9YF07XG5cbiAgICByZXR1cm4gWy4uLihwcm9qZWN0Lmhhc1ByaXNtYSA/IHByaXNtYVNjcmlwdHMubWlncmF0ZShwcm9qZWN0KS5zcGxpdCgnJiYnKSA6IFtdKSwgLi4uY29tbWFuZHNdXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAubWFwKChjbWQpID0+IGAke2NtZH0gJHt0b0Rldk51bGwoYXJndil9YC50cmltKCkpXG4gICAgICAuam9pbignICYmICcpO1xuICB9XG4gIC8vIC0tLS0tLS0tLS0tLSBFTkQ6IHN0YXJ0IGNvbW1hbmRzIC0tLS0tLS0tLS0tLVxuXG4gIC8vIC0tLS0tLS0tLS0tLSBTVEFSVDogdGVzdCAoZTJlKSBjb21tYW5kcyAtLS0tLS0tLS0tLS1cbiAgdGVzdEUyRURldihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndiwgb3B0aW9uczogVGVzdEUyRU9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLnRlc3RFMkVQcm90ZWN0ZWQocHJvamVjdCwgYXJndiwgdGhpcy5zdGFydERldlByb3RlY3RlZChwcm9qZWN0LCBhcmd2KSwgb3B0aW9ucyk7XG4gIH1cbiAgdGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YsIG9wdGlvbnM6IFRlc3RFMkVPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy50ZXN0RTJFUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YsIHRoaXMuc3RhcnRQcm9kdWN0aW9uUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YpLCBvcHRpb25zKTtcbiAgfVxuICB0ZXN0RTJFRG9ja2VyKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RBcmd2LCBvcHRpb25zOiBUZXN0RTJFT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMudGVzdEUyRVByb3RlY3RlZChwcm9qZWN0LCBhcmd2LCBkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChwcm9qZWN0KSwgb3B0aW9ucyk7XG4gIH1cbiAgYXN5bmMgdGVzdFN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGF3YWl0IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHByb2plY3QuZW52LlBPUlQsIHByb2plY3QpO1xuICAgIC8vIFVzZSBlbXB0eSBOT0RFX0VOViB0byBhdm9pZCBcInByb2R1Y3Rpb25cIiBtb2RlIGluIHNvbWUgZnJhbWV3b3JrcyBsaWtlIEJsaXR6LmpzLlxuICAgIHJldHVybiBgJHtidWlsZFNoZWxsRW52aXJvbm1lbnRBc3NpZ25tZW50KCdOT0RFX0VOVicsICcnKX0gJHtidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAnWUFSTicsXG4gICAgICAnd2InLFxuICAgICAgJ2NvbmN1cnJlbnRseScsXG4gICAgICAuLi5idWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndiksXG4gICAgICAnLS1raWxsLW90aGVycycsXG4gICAgICAnLS1zdWNjZXNzJyxcbiAgICAgICdmaXJzdCcsXG4gICAgICB0aGlzLnN0YXJ0RGV2UHJvdGVjdGVkKHByb2plY3QsIGFyZ3YpLFxuICAgICAgdGhpcy53YWl0QXBwKHByb2plY3QpLFxuICAgIF0pfWA7XG4gIH1cblxuICBhc3luYyB0ZXN0RTJFUHJvdGVjdGVkKFxuICAgIHByb2plY3Q6IFByb2plY3QsXG4gICAgYXJndjogVGVzdEFyZ3YsXG4gICAgc3RhcnRDb21tYW5kOiBzdHJpbmcsXG4gICAgeyBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyA9IFtdLCBwbGF5d3JpZ2h0QXJncyA9IFsndGVzdCcsICd0ZXN0L2UyZS8nXSB9OiBUZXN0RTJFT3B0aW9uc1xuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHBvcnQgPSBhd2FpdCBjaGVja0FuZEtpbGxQb3J0UHJvY2Vzcyhwcm9qZWN0LmVudi5QT1JULCBwcm9qZWN0KTtcbiAgICBjb25zdCBzdWZmaXggPSBwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsndGVzdC9lMmUtYWRkaXRpb25hbCddID8gJyAmJiBZQVJOIHRlc3QvZTJlLWFkZGl0aW9uYWwnIDogJyc7XG4gICAgY29uc3QgcGxheXdyaWdodENvbW1hbmQgPSBidWlsZFBsYXl3cmlnaHRDb21tYW5kKHBsYXl3cmlnaHRBcmdzLCBhcmd2LnRhcmdldHMsIGFyZ3YuYmFpbCwgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MpO1xuICAgIGlmIChwcm9qZWN0LnNraXBMYXVuY2hpbmdTZXJ2ZXJGb3JQbGF5d3JpZ2h0KSB7XG4gICAgICByZXR1cm4gYCR7cGxheXdyaWdodENvbW1hbmR9JHtzdWZmaXh9YDtcbiAgICB9XG5cbiAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgJ1lBUk4nLFxuICAgICAgJ3diJyxcbiAgICAgICdjb25jdXJyZW50bHknLFxuICAgICAgLi4uYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3YpLFxuICAgICAgJy0ta2lsbC1vdGhlcnMnLFxuICAgICAgJy0tc3VjY2VzcycsXG4gICAgICAnZmlyc3QnLFxuICAgICAgYCR7c3RhcnRDb21tYW5kfSAmJiBleGl0IDFgLFxuICAgICAgYHdhaXQtb24gLXQgNjAwMDAwIC1pIDIwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fVxuICAgICAgICAmJiAke3BsYXl3cmlnaHRDb21tYW5kfSR7c3VmZml4fWAsXG4gICAgXSk7XG4gIH1cbiAgLy8gLS0tLS0tLS0tLS0tIEVORDogdGVzdCAoZTJlKSBjb21tYW5kcyAtLS0tLS0tLS0tLS1cblxuICB0ZXN0VW5pdChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndik6IHN0cmluZyB7XG4gICAgY29uc3QgdGFyZ2V0cyA9IGFyZ3YudGFyZ2V0cz8ubWFwKFN0cmluZyk7XG4gICAgaWYgKHByb2plY3QuaGFzVml0ZXN0KSB7XG4gICAgICAvLyBTaW5jZSB0aGlzIGNvbW1hbmQgaXMgcmVmZXJyZWQgZnJvbSBvdGhlciBjb21tYW5kcywgd2UgaGF2ZSB0byB1c2UgXCJ2aXRlc3QgcnVuXCIgKG5vbi1pbnRlcmFjdGl2ZSBtb2RlKS5cbiAgICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAgICdZQVJOJyxcbiAgICAgICAgJ3ZpdGVzdCcsXG4gICAgICAgICdydW4nLFxuICAgICAgICAuLi4odGFyZ2V0cz8ubGVuZ3RoID8gdGFyZ2V0cyA6IFsndGVzdC91bml0LyddKSxcbiAgICAgICAgJy0tY29sb3InLFxuICAgICAgICAnLS1wYXNzV2l0aE5vVGVzdHMnLFxuICAgICAgICAnLS1hbGxvd09ubHknLFxuICAgICAgICAnLS13YXRjaD1mYWxzZScsXG4gICAgICAgIC4uLihhcmd2LmJhaWwgPyBbJy0tYmFpbD0xJ10gOiBbXSksXG4gICAgICBdKTtcbiAgICB9IGVsc2UgaWYgKHByb2plY3QuaXNCdW5BdmFpbGFibGUpIHtcbiAgICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAgICdidW4nLFxuICAgICAgICAndGVzdCcsXG4gICAgICAgIC4uLih0YXJnZXRzPy5sZW5ndGggPyB0YXJnZXRzIDogWyd0ZXN0L3VuaXQvJ10pLFxuICAgICAgICAuLi4oYXJndi5iYWlsID8gWyctLWJhaWwnXSA6IFtdKSxcbiAgICAgIF0pO1xuICAgIH1cbiAgICByZXR1cm4gJ2VjaG8gXCJObyB0ZXN0cy5cIic7XG4gIH1cblxuICBwcm90ZWN0ZWQgd2FpdEFwcChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICBjb25zdCBwb3J0ID0gcHJvamVjdC5lbnYuUE9SVDtcbiAgICByZXR1cm4gYHdhaXQtb24gLXQgMTAwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgMTAwMDAgLWkgNTAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDEwMDAwIC1pIDEwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgMTAwMDAgLWkgMjAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCAyMDAwMCAtaSA0MDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDYwMDAwIC1pIDUwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgOTAwMDAgLWkgMTAwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fWA7XG4gIH1cblxuICBwcm90ZWN0ZWQgd2FpdEFuZE9wZW5BcHAocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgY29uc3QgcG9ydCA9IHByb2plY3QuZW52LlBPUlQ7XG4gICAgcmV0dXJuIGAke3RoaXMud2FpdEFwcChcbiAgICAgIHByb2plY3RcbiAgICApfSB8fCB3YWl0LW9uIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gJiYgb3Blbi1jbGkgaHR0cDovL1xcJHtIT1NUOi1sb2NhbGhvc3R9OiR7cG9ydH1gO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmRFY29zeXN0ZW1Db25maWdQYXRoKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIHJldHVybiBwcm9qZWN0LmZpbmRGaWxlKCdlY29zeXN0ZW0uY29uZmlnLmNqcycpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm47XG4gIH1cbn1cblxuZnVuY3Rpb24gYnVpbGRQbGF5d3JpZ2h0Q29tbWFuZChcbiAgcGxheXdyaWdodEFyZ3M6IHN0cmluZ1tdLFxuICB0YXJnZXRzOiBUZXN0QXJndlsndGFyZ2V0cyddLFxuICBiYWlsPzogYm9vbGVhbixcbiAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3M6IHN0cmluZ1tdID0gW11cbik6IHN0cmluZyB7XG4gIGNvbnN0IGJhc2UgPSBbJ0JVTicsICdwbGF5d3JpZ2h0J107XG4gIGNvbnN0IG5vcm1hbGl6ZWRUYXJnZXRzID0gdGFyZ2V0cz8ubWFwKFN0cmluZyk7XG4gIGlmIChwbGF5d3JpZ2h0QXJnc1swXSAhPT0gJ3Rlc3QnIHx8ICFub3JtYWxpemVkVGFyZ2V0cz8ubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGFwcGVuZFBsYXl3cmlnaHRCYWlsT3B0aW9uKFsuLi5iYXNlLCAuLi5wbGF5d3JpZ2h0QXJncywgLi4uZm9yd2FyZGVkUGxheXdyaWdodEFyZ3NdLCBiYWlsKTtcbiAgfVxuXG4gIGNvbnN0IHJlc3QgPSBwbGF5d3JpZ2h0QXJncy5zbGljZSgxKTtcbiAgY29uc3QgZXhwbGljaXRUYXJnZXRJbmRleGVzID0gZmluZEV4cGxpY2l0UGxheXdyaWdodFRhcmdldEluZGV4ZXMocmVzdCk7XG4gIGNvbnN0IHJlc3RXaXRob3V0RXhwbGljaXRUYXJnZXQgPVxuICAgIGV4cGxpY2l0VGFyZ2V0SW5kZXhlcy5sZW5ndGggPT09IDAgPyByZXN0IDogcmVzdC5maWx0ZXIoKF8sIGluZGV4KSA9PiAhZXhwbGljaXRUYXJnZXRJbmRleGVzLmluY2x1ZGVzKGluZGV4KSk7XG4gIHJldHVybiBhcHBlbmRQbGF5d3JpZ2h0QmFpbE9wdGlvbihcbiAgICBbLi4uYmFzZSwgJ3Rlc3QnLCAuLi5ub3JtYWxpemVkVGFyZ2V0cywgLi4ucmVzdFdpdGhvdXRFeHBsaWNpdFRhcmdldCwgLi4uZm9yd2FyZGVkUGxheXdyaWdodEFyZ3NdLFxuICAgIGJhaWxcbiAgKTtcbn1cblxuZnVuY3Rpb24gYXBwZW5kUGxheXdyaWdodEJhaWxPcHRpb24oY29tbWFuZEFyZ3M6IHN0cmluZ1tdLCBiYWlsPzogYm9vbGVhbik6IHN0cmluZyB7XG4gIGNvbnN0IHBsYXl3cmlnaHRJbmRleCA9IGNvbW1hbmRBcmdzLmluZGV4T2YoJ3BsYXl3cmlnaHQnKTtcbiAgY29uc3QgaXNQbGF5d3JpZ2h0VGVzdENvbW1hbmQgPSBwbGF5d3JpZ2h0SW5kZXggIT09IC0xICYmIGNvbW1hbmRBcmdzW3BsYXl3cmlnaHRJbmRleCArIDFdID09PSAndGVzdCc7XG4gIGlmICghYmFpbCB8fCAhaXNQbGF5d3JpZ2h0VGVzdENvbW1hbmQpIHtcbiAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoY29tbWFuZEFyZ3MpO1xuICB9XG4gIGlmIChjb21tYW5kQXJncy5zb21lKChhcmcpID0+IGFyZyA9PT0gJy0tbWF4LWZhaWx1cmVzJyB8fCBhcmcuc3RhcnRzV2l0aCgnLS1tYXgtZmFpbHVyZXM9JykpKSB7XG4gICAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKGNvbW1hbmRBcmdzKTtcbiAgfVxuICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoWy4uLmNvbW1hbmRBcmdzLCAnLS1tYXgtZmFpbHVyZXM9MSddKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRFeHBsaWNpdFBsYXl3cmlnaHRUYXJnZXRJbmRleGVzKGFyZ3M6IHN0cmluZ1tdKTogbnVtYmVyW10ge1xuICBsZXQgcGVuZGluZ1ZhbHVlTW9kZTogJ29wdGlvbmFsJyB8ICdyZXF1aXJlZCcgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IHRhcmdldEluZGV4ZXM6IG51bWJlcltdID0gW107XG5cbiAgZm9yIChjb25zdCBbaW5kZXgsIGFyZ10gb2YgYXJncy5lbnRyaWVzKCkpIHtcbiAgICBpZiAocGVuZGluZ1ZhbHVlTW9kZSkge1xuICAgICAgaWYgKHBlbmRpbmdWYWx1ZU1vZGUgPT09ICdyZXF1aXJlZCcgfHwgIWFyZy5zdGFydHNXaXRoKCctJykpIHtcbiAgICAgICAgcGVuZGluZ1ZhbHVlTW9kZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBwZW5kaW5nVmFsdWVNb2RlID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlmIChhcmcgPT09ICctLScpIHtcbiAgICAgIHJldHVybiBbLi4udGFyZ2V0SW5kZXhlcywgLi4uYXJncy5zbGljZShpbmRleCArIDEpLm1hcCgoXywgb2Zmc2V0KSA9PiBpbmRleCArIDEgKyBvZmZzZXQpXTtcbiAgICB9XG4gICAgaWYgKGFyZy5zdGFydHNXaXRoKCctLScpKSB7XG4gICAgICBpZiAoYXJnLmluY2x1ZGVzKCc9JykpIGNvbnRpbnVlO1xuICAgICAgaWYgKFBMQVlXUklHSFRfVEVTVF9PUFRJT05TX1dJVEhfUkVRVUlSRURfVkFMVUVTLmhhcyhhcmcpKSB7XG4gICAgICAgIHBlbmRpbmdWYWx1ZU1vZGUgPSAncmVxdWlyZWQnO1xuICAgICAgfSBlbHNlIGlmIChQTEFZV1JJR0hUX1RFU1RfT1BUSU9OU19XSVRIX09QVElPTkFMX1ZBTFVFUy5oYXMoYXJnKSkge1xuICAgICAgICBwZW5kaW5nVmFsdWVNb2RlID0gJ29wdGlvbmFsJztcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoYXJnLnN0YXJ0c1dpdGgoJy0nKSAmJiBhcmcgIT09ICctJykge1xuICAgICAgY29uc3Qgc2hvcnRPcHRpb24gPSBhcmcuc2xpY2UoMCwgMik7XG4gICAgICBpZiAoYXJnLmxlbmd0aCA9PT0gMiAmJiBQTEFZV1JJR0hUX1RFU1RfU0hPUlRfT1BUSU9OU19XSVRIX1JFUVVJUkVEX1ZBTFVFUy5oYXMoc2hvcnRPcHRpb24pKSB7XG4gICAgICAgIHBlbmRpbmdWYWx1ZU1vZGUgPSAncmVxdWlyZWQnO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHRhcmdldEluZGV4ZXMucHVzaChpbmRleCk7XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0SW5kZXhlcztcbn1cblxuY29uc3QgUExBWVdSSUdIVF9URVNUX09QVElPTlNfV0lUSF9SRVFVSVJFRF9WQUxVRVMgPSBuZXcgU2V0KFtcbiAgJy0tYnJvd3NlcicsXG4gICctLWNvbmZpZycsXG4gICctLWdyZXAnLFxuICAnLS1ncmVwLWludmVydCcsXG4gICctLWdsb2JhbC10aW1lb3V0JyxcbiAgJy0tbWF4LWZhaWx1cmVzJyxcbiAgJy0tb3V0cHV0JyxcbiAgJy0tcHJvamVjdCcsXG4gICctLXJlcGVhdC1lYWNoJyxcbiAgJy0tcmVwb3J0ZXInLFxuICAnLS1yZXRyaWVzJyxcbiAgJy0tc2hhcmQnLFxuICAnLS10ZXN0LWxpc3QnLFxuICAnLS10ZXN0LWxpc3QtaW52ZXJ0JyxcbiAgJy0tdGltZW91dCcsXG4gICctLXRyYWNlJyxcbiAgJy0tdHNjb25maWcnLFxuICAnLS11aS1ob3N0JyxcbiAgJy0tdWktcG9ydCcsXG4gICctLXVpLXRpdGxlJyxcbiAgJy0td29ya2VycycsXG5dKTtcblxuY29uc3QgUExBWVdSSUdIVF9URVNUX09QVElPTlNfV0lUSF9PUFRJT05BTF9WQUxVRVMgPSBuZXcgU2V0KFtcbiAgJy0tb25seS1jaGFuZ2VkJyxcbiAgJy0tdXBkYXRlLXNuYXBzaG90cycsXG4gICctLXVwZGF0ZS1zb3VyY2UtbWV0aG9kJyxcbl0pO1xuXG5jb25zdCBQTEFZV1JJR0hUX1RFU1RfU0hPUlRfT1BUSU9OU19XSVRIX1JFUVVJUkVEX1ZBTFVFUyA9IG5ldyBTZXQoWyctYycsICctZycsICctaiddKTtcbiIsImltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBCbGl0ei5qcyBjb21tYW5kcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgQmxpdHpTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcih0cnVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzdGFydERldlByb3RlY3RlZChfOiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYGJsaXR6IGRldiAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWA7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGJsaXR6U2NyaXB0cyA9IG5ldyBCbGl0elNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgVGVzdEFyZ3YgfSBmcm9tICcuLi8uLi9jb21tYW5kcy90ZXN0LmpzJztcbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzIH0gZnJvbSAnLi4vLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MgfSBmcm9tICcuLi8uLi91dGlscy9wb3J0LmpzJztcbmltcG9ydCB7IGJ1aWxkU2hlbGxDb21tYW5kIH0gZnJvbSAnLi4vLi4vdXRpbHMvc2hlbGwuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IEJhc2VTY3JpcHRzLCB0eXBlIFRlc3RFMkVPcHRpb25zIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBhbiBhcHAgdGhhdCB1dGlsaXplcyBhbiBIVFRQIHNlcnZlciBsaWtlIGV4cHJlc3MuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIEh0dHBTZXJ2ZXJTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihmYWxzZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RhcnREZXZQcm90ZWN0ZWQoXzogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBZQVJOIGJ1aWxkLXRzIHJ1biAke2FyZ3Yud2F0Y2ggPyAnLS13YXRjaCcgOiAnJ30gc3JjL2luZGV4LnRzIC0tICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YDtcbiAgfVxuXG4gIGFzeW5jIHRlc3RFMkVQcm90ZWN0ZWQoXG4gICAgcHJvamVjdDogUHJvamVjdCxcbiAgICBhcmd2OiBUZXN0QXJndixcbiAgICBzdGFydENvbW1hbmQ6IHN0cmluZyxcbiAgICBvcHRpb25zOiBUZXN0RTJFT3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKHByb2plY3QuaGFzUGxheXdyaWdodENvbmZpZykge1xuICAgICAgcmV0dXJuIHN1cGVyLnRlc3RFMkVQcm90ZWN0ZWQocHJvamVjdCwgYXJndiwgc3RhcnRDb21tYW5kLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBjb25zdCBwb3J0ID0gYXdhaXQgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocHJvamVjdC5lbnYuUE9SVCwgcHJvamVjdCk7XG4gICAgY29uc3Qgc3VmZml4ID0gcHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ3Rlc3QvZTJlLWFkZGl0aW9uYWwnXSA/ICcgJiYgWUFSTiB0ZXN0L2UyZS1hZGRpdGlvbmFsJyA6ICcnO1xuICAgIGNvbnN0IHRhcmdldHMgPSBhcmd2LnRhcmdldHM/Lm1hcChTdHJpbmcpO1xuICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAnWUFSTicsXG4gICAgICAnd2InLFxuICAgICAgJ2NvbmN1cnJlbnRseScsXG4gICAgICAuLi5idWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndiksXG4gICAgICAnLS1raWxsLW90aGVycycsXG4gICAgICAnLS1zdWNjZXNzJyxcbiAgICAgICdmaXJzdCcsXG4gICAgICBgJHtzdGFydENvbW1hbmR9ICYmIGV4aXQgMWAsXG4gICAgICBgd2FpdC1vbiAtdCA2MDAwMDAgLWkgMjAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9XG4gICAgICAgICYmICR7YnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgICAgICd2aXRlc3QnLFxuICAgICAgICAgICdydW4nLFxuICAgICAgICAgIC4uLih0YXJnZXRzICYmIHRhcmdldHMubGVuZ3RoID4gMCA/IHRhcmdldHMgOiBbJ3Rlc3QvZTJlLyddKSxcbiAgICAgICAgICAnLS1jb2xvcicsXG4gICAgICAgICAgJy0tcGFzc1dpdGhOb1Rlc3RzJyxcbiAgICAgICAgICAnLS1hbGxvd09ubHknLFxuICAgICAgICAgIC4uLihhcmd2LmJhaWwgPyBbJy0tYmFpbD0xJ10gOiBbXSksXG4gICAgICAgIF0pfSR7c3VmZml4fWAsXG4gICAgXSk7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGh0dHBTZXJ2ZXJTY3JpcHRzID0gbmV3IEh0dHBTZXJ2ZXJTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgTmV4dC5qcyBjb21tYW5kcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgTmV4dFNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKHRydWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0YXJ0RGV2UHJvdGVjdGVkKF86IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgbmV4dCBkZXYgLS10dXJib3BhY2sgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBuZXh0U2NyaXB0cyA9IG5ldyBOZXh0U2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBTRVJWRVJfTE9HX0ZJTEUgfSBmcm9tICcuLi8uLi91dGlscy9sb2cuanMnO1xuaW1wb3J0IHsgcnVudGltZVdpdGhBcmdzIH0gZnJvbSAnLi4vLi4vdXRpbHMvcnVudGltZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IGRvY2tlclNjcmlwdHMgfSBmcm9tICcuLi9kb2NrZXJTY3JpcHRzLmpzJztcblxuaW1wb3J0IHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIGFuIGFwcCB0aGF0IHV0aWxpemVzIGFuIEhUVFAgc2VydmVyIGxpa2UgZXhwcmVzcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgUGxhaW5BcHBTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihmYWxzZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc3RhcnREZXZQcm90ZWN0ZWQoXzE6IFByb2plY3QsIF8yOiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgY2FsbGVkLicpO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnREZXYoXzogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShcbiAgICAgIGBZQVJOIGJ1aWxkLXRzIHJ1biAke2FyZ3Yud2F0Y2ggPyAnLS13YXRjaCcgOiAnJ30gc3JjL2luZGV4LnRzIC0tICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YFxuICAgICk7XG4gIH1cbiAgb3ZlcnJpZGUgc3RhcnRQcm9kdWN0aW9uKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoXG4gICAgICBgJHtwcm9qZWN0LmJ1aWxkQ29tbWFuZH0gJiYgJHtydW50aW1lV2l0aEFyZ3N9IGRpc3QvaW5kZXguanMgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ30gfCB0ZWUgJHtTRVJWRVJfTE9HX0ZJTEV9YFxuICAgICk7XG4gIH1cbiAgb3ZlcnJpZGUgc3RhcnRUZXN0KCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShgZWNobyAnZG8gbm90aGluZy4nYCk7XG4gIH1cbiAgb3ZlcnJpZGUgc3RhcnREb2NrZXIocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShcbiAgICAgIGAke3RoaXMuYnVpbGREb2NrZXIocHJvamVjdCwgJ2RldmVsb3BtZW50Jyl9ICYmICR7ZG9ja2VyU2NyaXB0cy5zdG9wQW5kU3RhcnQoXG4gICAgICAgIHByb2plY3QsXG4gICAgICAgIGFyZ3Yubm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0ID8/ICcnLFxuICAgICAgICBhcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ1xuICAgICAgKX1gXG4gICAgKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHRlc3RFMkVEZXYoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGBlY2hvICdkbyBub3RoaW5nLidgKTtcbiAgfVxuICBvdmVycmlkZSB0ZXN0RTJFUHJvZHVjdGlvbigpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYGVjaG8gJ2RvIG5vdGhpbmcuJ2ApO1xuICB9XG4gIG92ZXJyaWRlIHRlc3RFMkVEb2NrZXIoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGBlY2hvICdkbyBub3RoaW5nLidgKTtcbiAgfVxuICBvdmVycmlkZSB0ZXN0U3RhcnQoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGBlY2hvICdkbyBub3RoaW5nLidgKTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgcGxhaW5BcHBTY3JpcHRzID0gbmV3IFBsYWluQXBwU2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcblxuaW1wb3J0IHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIFJlbWl4IGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBSZW1peFNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKHRydWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0YXJ0RGV2UHJvdGVjdGVkKF86IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgcmVtaXggZGV2ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgcmVtaXhTY3JpcHRzID0gbmV3IFJlbWl4U2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcblxuaW1wb3J0IHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIFZpdGUtYmFzZWQgYXBwcyB3aXRoIFBsYXl3cmlnaHQgZTJlIHRlc3RzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBWaXRlU2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIodHJ1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RhcnREZXZQcm90ZWN0ZWQoXzogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBZQVJOIHZpdGUgZGV2ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YC50cmltKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RhcnRQcm9kdWN0aW9uUHJvdGVjdGVkKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtwcm9qZWN0LmJ1aWxkQ29tbWFuZH0gJiYgWUFSTiB2aXRlIHByZXZpZXcgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLnRyaW0oKTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgdml0ZVNjcmlwdHMgPSBuZXcgVml0ZVNjcmlwdHMoKTtcbiIsImV4cG9ydCBjb25zdCBodHRwU2VydmVyUGFja2FnZXMgPSBbJ2V4cHJlc3MnLCAnZmFzdGlmeScsICdlbHlzaWEnLCAnaG9ubyddO1xuIiwiaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndiwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgbm9ybWFsaXplQXJncywgc2NyaXB0T3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zY3JpcHRzL2J1aWxkZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IGJsaXR6U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2JsaXR6U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBodHRwU2VydmVyU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2h0dHBTZXJ2ZXJTY3JpcHRzLmpzJztcbmltcG9ydCB7IG5leHRTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vbmV4dFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcGxhaW5BcHBTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcGxhaW5BcHBTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJlbWl4U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3JlbWl4U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyB2aXRlU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3ZpdGVTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IGh0dHBTZXJ2ZXJQYWNrYWdlcyB9IGZyb20gJy4vaHR0cFNlcnZlclBhY2thZ2VzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgLi4uc2NyaXB0T3B0aW9uc0J1aWxkZXIsXG4gIG1vZGU6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1N0YXJ0IG1vZGU6IGRldltlbG9wbWVudF0gKGRlZmF1bHQpIHwgc3RhZ2luZyB8IGRvY2tlciB8IGRvY2tlci1kZWJ1ZyB8IHRlc3QnLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAnbScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qgc3RhcnRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3N0YXJ0IFthcmdzLi5dJyxcbiAgZGVzY3JpYmU6XG4gICAgXCJTdGFydCBhcHAuIFVzZSAnLS0nIHRvIHN0b3Agd2Igb3B0aW9uIHBhcnNpbmcgYW5kIGZvcndhcmQgdGhlIHJlbWFpbmluZyBhcmd1bWVudHMgdG8gdGhlIHVuZGVybHlpbmcgYXBwIGNvbW1hbmQuIEV4YW1wbGU6IHdiIHN0YXJ0IC0tIC0taG9zdCAwLjAuMC4wXCIsXG4gIGJ1aWxkZXI6ICh5YXJnczogQXJndjx1bmtub3duPikgPT5cbiAgICB5YXJncy5wYXJzZXJDb25maWd1cmF0aW9uKHsgJ3BvcHVsYXRlLS0nOiB0cnVlIH0pLm9wdGlvbnMoYnVpbGRlcikgYXMgQXJndjxcbiAgICAgIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+XG4gICAgPixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgbm9ybWFsaXplQXJncyhhcmd2KTtcblxuICAgIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2KTtcbiAgICBpZiAoIXByb2plY3RzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzLmRlc2NlbmRhbnRzKSB7XG4gICAgICBjb25zdCBkZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge307XG4gICAgICBjb25zdCBkZXZEZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gICAgICBsZXQgc2NyaXB0czogQmFzZVNjcmlwdHM7XG4gICAgICBpZiAoZGVwcy5ibGl0eikge1xuICAgICAgICBzY3JpcHRzID0gYmxpdHpTY3JpcHRzO1xuICAgICAgfSBlbHNlIGlmIChkZXBzLm5leHQpIHtcbiAgICAgICAgc2NyaXB0cyA9IG5leHRTY3JpcHRzO1xuICAgICAgfSBlbHNlIGlmIChkZXZEZXBzWydAcmVtaXgtcnVuL2RldiddKSB7XG4gICAgICAgIHNjcmlwdHMgPSByZW1peFNjcmlwdHM7XG4gICAgICB9IGVsc2UgaWYgKGRldkRlcHMudml0ZSkge1xuICAgICAgICBzY3JpcHRzID0gdml0ZVNjcmlwdHM7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAoaHR0cFNlcnZlclBhY2thZ2VzLnNvbWUoKHApID0+IGRlcHNbcF0pICYmICFkZXBzWydmaXJlYmFzZS1mdW5jdGlvbnMnXSkgfHxcbiAgICAgICAgKHByb2plY3QuaGFzRG9ja2VyZmlsZSAmJiAvRVhQT1NFXFxzKzgwODAvLnRlc3QocHJvamVjdC5kb2NrZXJmaWxlKSlcbiAgICAgICkge1xuICAgICAgICBzY3JpcHRzID0gaHR0cFNlcnZlclNjcmlwdHM7XG4gICAgICB9IGVsc2UgaWYgKGRlcHNbJ2J1aWxkLXRzJ10gfHwgZGV2RGVwc1snYnVpbGQtdHMnXSkge1xuICAgICAgICBzY3JpcHRzID0gcGxhaW5BcHBTY3JpcHRzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zb2xlLmluZm8oYFJ1bm5pbmcgXCJzdGFydFwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICAgIHN3aXRjaCAoYXJndi5tb2RlID8/ICdkZXYnKSB7XG4gICAgICAgIGNhc2UgJ2Rldic6XG4gICAgICAgIGNhc2UgJ2RldmVsb3BtZW50Jzoge1xuICAgICAgICAgIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ2RldmVsb3BtZW50JztcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYXdhaXQgc2NyaXB0cy5zdGFydERldihwcm9qZWN0LCBhcmd2KSwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnc3RhZ2luZyc6IHtcbiAgICAgICAgICBwcm9jZXNzLmVudi5XQl9FTlYgfHw9ICdzdGFnaW5nJztcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYXdhaXQgc2NyaXB0cy5zdGFydFByb2R1Y3Rpb24ocHJvamVjdCwgYXJndiksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2RvY2tlcic6IHtcbiAgICAgICAgICBwcm9jZXNzLmVudi5XQl9FTlYgfHw9ICdzdGFnaW5nJztcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYXdhaXQgc2NyaXB0cy5zdGFydERvY2tlcihwcm9qZWN0LCBhcmd2KSwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZG9ja2VyLWRlYnVnJzoge1xuICAgICAgICAgIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3N0YWdpbmcnO1xuICAgICAgICAgIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID0gYCcvYmluL2Jhc2gnYDtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYXdhaXQgc2NyaXB0cy5zdGFydERvY2tlcihwcm9qZWN0LCBhcmd2KSwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAndGVzdCc6IHtcbiAgICAgICAgICBwcm9jZXNzLmVudi5XQl9FTlYgfHw9ICd0ZXN0JztcbiAgICAgICAgICBjb25zdCBzY3JpcHQgPSBhd2FpdCBzY3JpcHRzLnN0YXJ0VGVzdChwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oc2NyaXB0LCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHN0YXJ0IG1vZGU6ICR7YXJndi5tb2RlfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxufTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3YsIEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNjcmlwdE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2NyaXB0cy9idWlsZGVyLmpzJztcbmltcG9ydCB7IHRvRGV2TnVsbCB9IGZyb20gJy4uL3NjcmlwdHMvYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBkb2NrZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9kb2NrZXJTY3JpcHRzLmpzJztcbmltcG9ydCB0eXBlIHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBmaW5kRXhwbGljaXRQbGF5d3JpZ2h0VGFyZ2V0SW5kZXhlcyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IGJsaXR6U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2JsaXR6U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBodHRwU2VydmVyU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2h0dHBTZXJ2ZXJTY3JpcHRzLmpzJztcbmltcG9ydCB7IG5leHRTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vbmV4dFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcGxhaW5BcHBTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcGxhaW5BcHBTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJlbWl4U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3JlbWl4U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyB2aXRlU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3ZpdGVTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IGh0dHBTZXJ2ZXJQYWNrYWdlcyB9IGZyb20gJy4vaHR0cFNlcnZlclBhY2thZ2VzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgZTJlOiB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnRTJlIHRlc3QgbW9kZTogaGVhZGxlc3MgKGRlZmF1bHQpIHwgaGVhZGxlc3MtZGV2IHwgaGVhZGVkIHwgaGVhZGVkLWRldiB8IGRvY2tlciB8IGRvY2tlci1kZWJ1ZyB8IGRlYnVnIHwgZ2VuZXJhdGUgfCB0cmFjZScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgY2hvaWNlczogW1xuICAgICAgJ2hlYWRsZXNzJyxcbiAgICAgICdoZWFkbGVzcy1kZXYnLFxuICAgICAgJ2hlYWRlZCcsXG4gICAgICAnaGVhZGVkLWRldicsXG4gICAgICAnZG9ja2VyJyxcbiAgICAgICdkb2NrZXItZGVidWcnLFxuICAgICAgJ2RlYnVnJyxcbiAgICAgICdnZW5lcmF0ZScsXG4gICAgICAndHJhY2UnLFxuICAgIF0sXG4gICAgZGVmYXVsdDogJ2hlYWRsZXNzJyxcbiAgfSxcbiAgc2lsZW50OiB7XG4gICAgZGVzY3JpcHRpb246ICdSZWR1Y2UgcmVkdW5kYW50IG91dHB1dHMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgYmFpbDoge1xuICAgIGRlc2NyaXB0aW9uOiAnU3RvcCB0ZXN0cyBhZnRlciB0aGUgZmlyc3QgZmFpbHVyZScsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICAndW5pdC10aW1lb3V0Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnVGltZW91dCBmb3IgdW5pdCB0ZXN0cycsXG4gICAgdHlwZTogJ251bWJlcicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBhcmd1bWVudHNCdWlsZGVyID0ge1xuICB0YXJnZXRzOiB7XG4gICAgZGVzY3JpcHRpb246ICdUZXN0IHRhcmdldCBwYXRocycsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbnR5cGUgVGVzdENvbW1hbmRPcHRpb25zID0gSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyPjtcblxuZXhwb3J0IHR5cGUgVGVzdEFyZ3YgPSBQYXJ0aWFsPFxuICBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzY3JpcHRPcHRpb25zQnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyPj5cbj47XG5cbmV4cG9ydCB0eXBlIFRlc3RDb21tYW5kQXJndiA9IEFyZ3VtZW50c0NhbWVsQ2FzZTxUZXN0Q29tbWFuZE9wdGlvbnM+ICYgeyAnLS0nPzogc3RyaW5nW10gfTtcblxuZXhwb3J0IGNvbnN0IHRlc3RDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIFRlc3RDb21tYW5kT3B0aW9ucz4gPSB7XG4gIGNvbW1hbmQ6ICd0ZXN0IFt0YXJnZXRzLi4uXScsXG4gIGRlc2NyaWJlOlxuICAgIFwiVGVzdCBwcm9qZWN0LiBJZiB5b3UgcGFzcyBubyBhcmd1bWVudHMsIGl0IHdpbGwgcnVuIGFsbCB0ZXN0cy4gVXNlICctLScgdG8gc3RvcCB3YiBvcHRpb24gcGFyc2luZyBhbmQgZm9yd2FyZCB0aGUgcmVtYWluaW5nIGZsYWdzIHRvIFBsYXl3cmlnaHQuIEV4YW1wbGU6IHdiIHRlc3QgLS0gLS1ncmVwICd1cGxvYWRlZCBpbWFnZSBhc3NldCdcIixcbiAgYnVpbGRlcjogKHlhcmdzOiBBcmd2PHVua25vd24+KTogQXJndjxUZXN0Q29tbWFuZE9wdGlvbnM+ID0+XG4gICAgeWFyZ3NcbiAgICAgIC5wYXJzZXJDb25maWd1cmF0aW9uKHsgJ3BvcHVsYXRlLS0nOiB0cnVlIH0pXG4gICAgICAub3B0aW9ucyh7IC4uLmJ1aWxkZXIsIC4uLmFyZ3VtZW50c0J1aWxkZXIgfSkgYXMgQXJndjxUZXN0Q29tbWFuZE9wdGlvbnM+LFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCB0ZXN0KGFyZ3YgYXMgVGVzdENvbW1hbmRBcmd2KTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0ZXN0KGFyZ3Y6IFRlc3RDb21tYW5kQXJndik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgcHJvY2Vzcy5lbnYuRk9SQ0VfQ09MT1IgfHw9ICczJztcbiAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAndGVzdCc7XG5cbiAgLy8gR2V0IHRlc3QgdGFyZ2V0cyBmcm9tIHBvc2l0aW9uYWwgYXJndW1lbnRzXG4gIGNvbnN0IHRlc3RUYXJnZXRzID0gKGFyZ3YudGFyZ2V0cyA/PyBbXSkgYXMgc3RyaW5nW107XG4gIGNvbnN0IGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzID0gYXJndlsnLS0nXSA/PyBbXTtcbiAgY29uc3QgeyBzaG91bGRSdW5FMmUsIHNob3VsZFJ1blVuaXQgfSA9IHJlc29sdmVUZXN0RXhlY3V0aW9uVGFyZ2V0cyh0ZXN0VGFyZ2V0cywgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MpO1xuXG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cy5kZXNjZW5kYW50cykge1xuICAgIGNvbnN0IGRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICBjb25zdCBkZXZEZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gICAgbGV0IHNjcmlwdHM6IEJhc2VTY3JpcHRzO1xuICAgIGlmIChkZXBzLmJsaXR6KSB7XG4gICAgICBzY3JpcHRzID0gYmxpdHpTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGVwcy5uZXh0KSB7XG4gICAgICBzY3JpcHRzID0gbmV4dFNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChkZXZEZXBzWydAcmVtaXgtcnVuL2RldiddKSB7XG4gICAgICBzY3JpcHRzID0gcmVtaXhTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGV2RGVwcy52aXRlKSB7XG4gICAgICBzY3JpcHRzID0gdml0ZVNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChodHRwU2VydmVyUGFja2FnZXMuc29tZSgocCkgPT4gZGVwc1twXSkgJiYgIWRlcHNbJ2ZpcmViYXNlLWZ1bmN0aW9ucyddKSB7XG4gICAgICBzY3JpcHRzID0gaHR0cFNlcnZlclNjcmlwdHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNjcmlwdHMgPSBwbGFpbkFwcFNjcmlwdHM7XG4gICAgfVxuXG4gICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwidGVzdFwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICAvLyBSdW4gdW5pdCB0ZXN0cyBpZiBuZWVkZWRcbiAgICBpZiAoc2hvdWxkUnVuVW5pdCAmJiBmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICd0ZXN0JywgJ3VuaXQnKSkpIHtcbiAgICAgIGNvbnN0IHVuaXRUYXJnZXRzID0gdGVzdFRhcmdldHMuZmlsdGVyKCh0YXJnZXQpID0+IHRhcmdldC5pbmNsdWRlcygnL3VuaXQnKSk7XG4gICAgICBjb25zdCB1bml0QXJndiA9IHsgLi4uYXJndiwgdGFyZ2V0czogdW5pdFRhcmdldHMubGVuZ3RoID4gMCA/IHVuaXRUYXJnZXRzIDogdW5kZWZpbmVkIH07XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oc2NyaXB0cy50ZXN0VW5pdChwcm9qZWN0LCB1bml0QXJndiksIHByb2plY3QsIGFyZ3YsIHsgdGltZW91dDogYXJndi51bml0VGltZW91dCB9KTtcbiAgICB9XG4gICAgLy8gU2tpcCBlMmUgdGVzdHMgaWYgbm90IG5lZWRlZCBvciBubyBlMmUgZGlyZWN0b3J5IGV4aXN0c1xuICAgIGlmICghc2hvdWxkUnVuRTJlIHx8ICFmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICd0ZXN0JywgJ2UyZScpKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gR2V0IGUyZSB0YXJnZXRzIGZvciB0aGlzIHByb2plY3RcbiAgICBjb25zdCBlMmVUYXJnZXRzID0gdGVzdFRhcmdldHMuZmlsdGVyKCh0YXJnZXQpID0+IHRhcmdldC5pbmNsdWRlcygnL2UyZScpKTtcbiAgICBjb25zdCBlMmVBcmd2ID0geyAuLi5hcmd2LCB0YXJnZXRzOiBlMmVUYXJnZXRzLmxlbmd0aCA+IDAgPyBlMmVUYXJnZXRzIDogdW5kZWZpbmVkIH07XG5cbiAgICBzd2l0Y2ggKGFyZ3YuZTJlKSB7XG4gICAgICBjYXNlICdoZWFkbGVzcyc6IHtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdCwgZTJlQXJndiwge1xuICAgICAgICAgICAgcGxheXdyaWdodEFyZ3M6IGJ1aWxkUGxheXdyaWdodEFyZ3NGb3JFMkUoZTJlVGFyZ2V0cywgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MpLFxuICAgICAgICAgICAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsXG4gICAgICAgICAgfSksXG4gICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICBhcmd2XG4gICAgICAgICk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY2FzZSAnaGVhZGxlc3MtZGV2Jzoge1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgICAgYXdhaXQgc2NyaXB0cy50ZXN0RTJFRGV2KHByb2plY3QsIGUyZUFyZ3YsIHtcbiAgICAgICAgICAgIHBsYXl3cmlnaHRBcmdzOiBidWlsZFBsYXl3cmlnaHRBcmdzRm9yRTJFKGUyZVRhcmdldHMsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzKSxcbiAgICAgICAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgYXJndlxuICAgICAgICApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2RvY2tlcic6IHtcbiAgICAgICAgYXdhaXQgdGVzdE9uRG9ja2VyKFxuICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgZTJlQXJndixcbiAgICAgICAgICBzY3JpcHRzLFxuICAgICAgICAgIGJ1aWxkUGxheXdyaWdodEFyZ3NGb3JFMkUoZTJlVGFyZ2V0cywgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MpLFxuICAgICAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzXG4gICAgICAgICk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY2FzZSAnZG9ja2VyLWRlYnVnJzoge1xuICAgICAgICBhd2FpdCB0ZXN0T25Eb2NrZXIoXG4gICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICBlMmVBcmd2LFxuICAgICAgICAgIHNjcmlwdHMsXG4gICAgICAgICAgYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShlMmVUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncywgWyctLWRlYnVnJ10pLFxuICAgICAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzXG4gICAgICAgICk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZGVwcy5ibGl0eiB8fCBkZXBzLm5leHQgfHwgZGV2RGVwc1snQHJlbWl4LXJ1bi9kZXYnXSB8fCBkZXZEZXBzLnZpdGUpIHtcbiAgICAgIHN3aXRjaCAoYXJndi5lMmUpIHtcbiAgICAgICAgY2FzZSAnaGVhZGVkJzoge1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdCwgZTJlQXJndiwge1xuICAgICAgICAgICAgICBwbGF5d3JpZ2h0QXJnczogYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShlMmVUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncywgWyctLWhlYWRlZCddKSxcbiAgICAgICAgICAgICAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICBhcmd2XG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdoZWFkZWQtZGV2Jzoge1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRURldihwcm9qZWN0LCBlMmVBcmd2LCB7XG4gICAgICAgICAgICAgIHBsYXl3cmlnaHRBcmdzOiBidWlsZFBsYXl3cmlnaHRBcmdzRm9yRTJFKGUyZVRhcmdldHMsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLCBbJy0taGVhZGVkJ10pLFxuICAgICAgICAgICAgICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICAgIGFyZ3ZcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2RlYnVnJzoge1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdCwgZTJlQXJndiwge1xuICAgICAgICAgICAgICBwbGF5d3JpZ2h0QXJnczogYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShlMmVUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncywgWyctLWRlYnVnJ10pLFxuICAgICAgICAgICAgICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICAgIGFyZ3ZcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2dlbmVyYXRlJzoge1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdCwgZTJlQXJndiwge1xuICAgICAgICAgICAgICBwbGF5d3JpZ2h0QXJnczogWydjb2RlZ2VuJywgYGh0dHA6Ly9sb2NhbGhvc3Q6JHtwcm9qZWN0LmVudi5QT1JUfWBdLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgYXJndlxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAndHJhY2UnOiB7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGBCVU4gcGxheXdyaWdodCBzaG93LXRyYWNlYCwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gdGVzdE9uRG9ja2VyKFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyPj4sXG4gIHNjcmlwdHM6IEJhc2VTY3JpcHRzLFxuICBwbGF5d3JpZ2h0QXJncz86IHN0cmluZ1tdLFxuICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncz86IHN0cmluZ1tdXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcHJvamVjdC5lbnYuV0JfRE9DS0VSIHx8PSAnMSc7XG4gIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtzY3JpcHRzLmJ1aWxkRG9ja2VyKHByb2plY3QsICd0ZXN0Jyl9JHt0b0Rldk51bGwoYXJndil9YCwgcHJvamVjdCwgYXJndik7XG4gIHByb2Nlc3MuZXhpdENvZGUgPSBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgYXdhaXQgc2NyaXB0cy50ZXN0RTJFRG9ja2VyKHByb2plY3QsIGFyZ3YsIHtcbiAgICAgIHBsYXl3cmlnaHRBcmdzLFxuICAgICAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsXG4gICAgfSksXG4gICAgcHJvamVjdCxcbiAgICBhcmd2LFxuICAgIHsgZXhpdElmRmFpbGVkOiBmYWxzZSB9XG4gICk7XG4gIGF3YWl0IHJ1bldpdGhTcGF3bihkb2NrZXJTY3JpcHRzLnN0b3AocHJvamVjdCksIHByb2plY3QsIGFyZ3YpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShcbiAgZTJlVGFyZ2V0czogc3RyaW5nW10sXG4gIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzOiBzdHJpbmdbXSA9IFtdLFxuICBhZGRpdGlvbmFsQXJnczogc3RyaW5nW10gPSBbXVxuKTogc3RyaW5nW10ge1xuICBjb25zdCBoYXNGb3J3YXJkZWRQbGF5d3JpZ2h0VGFyZ2V0cyA9IGZpbmRFeHBsaWNpdFBsYXl3cmlnaHRUYXJnZXRJbmRleGVzKGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzKS5sZW5ndGggPiAwO1xuICByZXR1cm4gWyd0ZXN0JywgLi4uKGUyZVRhcmdldHMubGVuZ3RoID4gMCB8fCBoYXNGb3J3YXJkZWRQbGF5d3JpZ2h0VGFyZ2V0cyA/IFtdIDogWyd0ZXN0L2UyZS8nXSksIC4uLmFkZGl0aW9uYWxBcmdzXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVUZXN0RXhlY3V0aW9uVGFyZ2V0cyhcbiAgdGVzdFRhcmdldHM6IHN0cmluZ1tdLFxuICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJnczogc3RyaW5nW10gPSBbXVxuKTogeyBzaG91bGRSdW5Vbml0OiBib29sZWFuOyBzaG91bGRSdW5FMmU6IGJvb2xlYW4gfSB7XG4gIGNvbnN0IGhhc0UyZVRhcmdldHMgPSB0ZXN0VGFyZ2V0cy5zb21lKCh0YXJnZXQpID0+IHRhcmdldC5pbmNsdWRlcygnL2UyZScpKTtcbiAgY29uc3QgaGFzVW5pdFRhcmdldHMgPSB0ZXN0VGFyZ2V0cy5zb21lKCh0YXJnZXQpID0+IHRhcmdldC5pbmNsdWRlcygnL3VuaXQnKSk7XG4gIGNvbnN0IHNob3VsZFJ1bkFsbFRlc3RzID0gdGVzdFRhcmdldHMubGVuZ3RoID09PSAwICYmIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLmxlbmd0aCA9PT0gMDtcblxuICByZXR1cm4ge1xuICAgIHNob3VsZFJ1blVuaXQ6IHNob3VsZFJ1bkFsbFRlc3RzIHx8IGhhc1VuaXRUYXJnZXRzLFxuICAgIHNob3VsZFJ1bkUyZTogc2hvdWxkUnVuQWxsVGVzdHMgfHwgaGFzRTJlVGFyZ2V0cyB8fCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncy5sZW5ndGggPiAwLFxuICB9O1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyB0b0Rldk51bGwgfSBmcm9tICcuLi9zY3JpcHRzL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZG9ja2VyU2NyaXB0cy5qcyc7XG5pbXBvcnQgdHlwZSB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgYmxpdHpTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmxpdHpTY3JpcHRzLmpzJztcbmltcG9ydCB7IGh0dHBTZXJ2ZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vaHR0cFNlcnZlclNjcmlwdHMuanMnO1xuaW1wb3J0IHsgbmV4dFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9uZXh0U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwbGFpbkFwcFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9wbGFpbkFwcFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcmVtaXhTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcmVtaXhTY3JpcHRzLmpzJztcbmltcG9ydCB7IHZpdGVTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vdml0ZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduLCBydW5XaXRoU3Bhd25JblBhcmFsbGVsIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5pbXBvcnQgeyBodHRwU2VydmVyUGFja2FnZXMgfSBmcm9tICcuL2h0dHBTZXJ2ZXJQYWNrYWdlcy5qcyc7XG5cbmNvbnN0IHRlc3RPbkNpQnVpbGRlciA9IHtcbiAgc2lsZW50OiB7XG4gICAgZGVzY3JpcHRpb246ICdSZWR1Y2UgcmVkdW5kYW50IG91dHB1dHMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5leHBvcnQgY29uc3QgdGVzdE9uQ2lDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiB0ZXN0T25DaUJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAndGVzdC1vbi1jaScsXG4gIGRlc2NyaWJlOiAnVGVzdCBwcm9qZWN0IG9uIENJIHdpdGggbm8gb3B0aW9ucy4nLFxuICBidWlsZGVyOiB0ZXN0T25DaUJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IHRlc3RPbkNpKGFyZ3YpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlc3RPbkNpKFxuICBhcmd2OiBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgdGVzdE9uQ2lCdWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj5cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgcHJvY2Vzcy5lbnYuQ0kgfHw9ICcxJztcbiAgcHJvY2Vzcy5lbnYuRk9SQ0VfQ09MT1IgfHw9ICczJztcbiAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAndGVzdCc7XG5cbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzLmRlc2NlbmRhbnRzKSB7XG4gICAgY29uc3QgZGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgIGNvbnN0IGRldkRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICBsZXQgc2NyaXB0czogQmFzZVNjcmlwdHM7XG4gICAgaWYgKGRlcHMuYmxpdHopIHtcbiAgICAgIHNjcmlwdHMgPSBibGl0elNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChkZXBzLm5leHQpIHtcbiAgICAgIHNjcmlwdHMgPSBuZXh0U2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGRldkRlcHNbJ0ByZW1peC1ydW4vZGV2J10pIHtcbiAgICAgIHNjcmlwdHMgPSByZW1peFNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChkZXZEZXBzLnZpdGUpIHtcbiAgICAgIHNjcmlwdHMgPSB2aXRlU2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGh0dHBTZXJ2ZXJQYWNrYWdlcy5zb21lKChwKSA9PiBkZXBzW3BdKSAmJiAhZGVwc1snZmlyZWJhc2UtZnVuY3Rpb25zJ10pIHtcbiAgICAgIHNjcmlwdHMgPSBodHRwU2VydmVyU2NyaXB0cztcbiAgICB9IGVsc2Uge1xuICAgICAgc2NyaXB0cyA9IHBsYWluQXBwU2NyaXB0cztcbiAgICB9XG5cbiAgICBjb25zb2xlLmluZm8oYFJ1bm5pbmcgXCJ0ZXN0LW9uLWNpXCIgZm9yICR7cHJvamVjdC5uYW1lfSAuLi5gKTtcblxuICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoZG9ja2VyU2NyaXB0cy5zdG9wQWxsKCksIHByb2plY3QsIGFyZ3YpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICd0ZXN0JywgJ3VuaXQnKSkpIHtcbiAgICAgIC8vIENJIG1vZGUgZGlzYWxsb3dzIGBvbmx5YCB0byBhdm9pZCBpbmNsdWRpbmcgZGVidWcgdGVzdHNcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoc2NyaXB0cy50ZXN0VW5pdChwcm9qZWN0LCBhcmd2KS5yZXBsYWNlQWxsKCcgLS1hbGxvd09ubHknLCAnJyksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAndGVzdCcsICdlMmUnKSkpIHtcbiAgICAgIC8vIEF2b2lkIGxhdW5jaGluZyBkZXYgc2VydmVycyBmb3IgYnVpbGQtb25seSBwYWNrYWdlczsgb25seSBzdGFydCBhIHNlcnZlciB3aGVuIEUyRSBuZWVkcyBpdC5cbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoYXdhaXQgc2NyaXB0cy50ZXN0U3RhcnQocHJvamVjdCwgYXJndiksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICAgICAgaWYgKHByb2plY3QuaGFzRG9ja2VyZmlsZSkge1xuICAgICAgICBwcm9qZWN0LmVudi5XQl9ET0NLRVIgfHw9ICcxJztcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3NjcmlwdHMuYnVpbGREb2NrZXIocHJvamVjdCwgJ3Rlc3QnKX0ke3RvRGV2TnVsbChhcmd2KX1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNjcmlwdCA9IHByb2plY3QuaGFzRG9ja2VyZmlsZVxuICAgICAgICA/IGF3YWl0IHNjcmlwdHMudGVzdEUyRURvY2tlcihwcm9qZWN0LCBhcmd2LCB7fSlcbiAgICAgICAgOiBhd2FpdCBzY3JpcHRzLnRlc3RFMkVQcm9kdWN0aW9uKHByb2plY3QsIGFyZ3YsIHt9KTtcbiAgICAgIHByb2Nlc3MuZXhpdENvZGUgPSBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgIC8vIENJIG1vZGUgZGlzYWxsb3dzIGBvbmx5YCB0byBhdm9pZCBpbmNsdWRpbmcgZGVidWcgdGVzdHNcbiAgICAgICAgc2NyaXB0LnJlcGxhY2VBbGwoJyAtLWFsbG93T25seScsICcnKSxcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAgYXJndixcbiAgICAgICAge1xuICAgICAgICAgIGV4aXRJZkZhaWxlZDogZmFsc2UsXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oZG9ja2VyU2NyaXB0cy5zdG9wKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IGNvbnN0YW50cyB9IGZyb20gJ25vZGU6b3MnO1xuXG5pbXBvcnQgeyB0cmVlS2lsbCB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB0eXBlIHsgQXJndiwgQ29tbWFuZE1vZHVsZSB9IGZyb20gJ3lhcmdzJztcblxuaW50ZXJmYWNlIFRyZWVLaWxsQ29tbWFuZEFyZ3Mge1xuICBwaWQ6IG51bWJlcjtcbiAgc2lnbmFsOiBzdHJpbmc7XG59XG5cbmNvbnN0IGJ1aWxkZXIgPSAoeWFyZ3M6IEFyZ3YpOiBBcmd2PFRyZWVLaWxsQ29tbWFuZEFyZ3M+ID0+XG4gIHlhcmdzXG4gICAgLnBvc2l0aW9uYWwoJ3BpZCcsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIHByb2Nlc3MgSUQgdG8ga2lsbC4nLFxuICAgICAgdHlwZTogJ251bWJlcicsXG4gICAgICBkZW1hbmRPcHRpb246IHRydWUsXG4gICAgfSlcbiAgICAub3B0aW9uKCdzaWduYWwnLCB7XG4gICAgICBkZXNjcmlwdGlvbjogJ1NpZ25hbCB0byBzZW5kIHRvIHRoZSBwcm9jZXNzIHRyZWUuJyxcbiAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgZGVmYXVsdDogJ1NJR1RFUk0nLFxuICAgIH0pIGFzIEFyZ3Y8VHJlZUtpbGxDb21tYW5kQXJncz47XG5cbmV4cG9ydCBjb25zdCB0cmVlS2lsbENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8b2JqZWN0LCBUcmVlS2lsbENvbW1hbmRBcmdzPiA9IHtcbiAgY29tbWFuZDogJ3RyZWUta2lsbCA8cGlkPiBbc2lnbmFsXScsXG4gIGRlc2NyaWJlOiAnS2lsbCB0aGUgZ2l2ZW4gcHJvY2VzcyBhbmQgYWxsIGRlc2NlbmRhbnRzJyxcbiAgYnVpbGRlcixcbiAgaGFuZGxlcihhcmd2KSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNpZ25hbCA9IGFyZ3Yuc2lnbmFsIGFzIE5vZGVKUy5TaWduYWxzO1xuICAgICAgaWYgKCEoc2lnbmFsIGluIGNvbnN0YW50cy5zaWduYWxzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc2lnbmFsOiAke3NpZ25hbH1gKTtcbiAgICAgIH1cbiAgICAgIHRyZWVLaWxsKGFyZ3YucGlkLCBzaWduYWwpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICB9LFxufTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcblxudHlwZSBUeXBlQ2hlY2tDb21tYW5kT3B0aW9ucyA9IEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+O1xuZXhwb3J0IHR5cGUgVHlwZUNoZWNrQ29tbWFuZEFyZ3YgPSBBcmd1bWVudHNDYW1lbENhc2U8VHlwZUNoZWNrQ29tbWFuZE9wdGlvbnM+O1xuXG5leHBvcnQgY29uc3QgdHlwZUNoZWNrQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBUeXBlQ2hlY2tDb21tYW5kT3B0aW9ucz4gPSB7XG4gIGNvbW1hbmQ6ICd0eXBlY2hlY2snLFxuICBkZXNjcmliZTogJ1J1biB0eXBlIGNoZWNraW5nLiAuZW52IGZpbGVzIGFyZSBpZ25vcmVkLicsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIHByb2Nlc3MuZXhpdChhd2FpdCB0eXBlQ2hlY2soYXJndikpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHR5cGVDaGVjayhhcmd2OiBUeXBlQ2hlY2tDb21tYW5kQXJndik6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2LCBmYWxzZSk7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICBsZXQgcmVtb3ZlZE5leHREaXIgPSBmYWxzZSBhcyBib29sZWFuO1xuICBjb25zdCBwcm9taXNlcyA9IHByb2plY3RzLmRlc2NlbmRhbnRzLm1hcChhc3luYyAocHJvamVjdCkgPT4ge1xuICAgIGNvbnN0IGNvbW1hbmRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGlmICghcHJvamVjdC5wYWNrYWdlSnNvbi53b3Jrc3BhY2VzKSB7XG4gICAgICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LnR5cGVzY3JpcHQgfHwgcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LnR5cGVzY3JpcHQpIHtcbiAgICAgICAgY29tbWFuZHMucHVzaCgnQlVOIHRzYyAtLW5vRW1pdCcpO1xuICAgICAgfVxuICAgICAgaWYgKHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy5weXJpZ2h0KSB7XG4gICAgICAgIGNvbW1hbmRzLnB1c2goJ1lBUk4gcHlyaWdodCcpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBwcm9qZWN0Lmhhc1NvdXJjZUNvZGUgJiZcbiAgICAgIChwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8udHlwZXNjcmlwdCB8fCBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8udHlwZXNjcmlwdClcbiAgICApIHtcbiAgICAgIGNvbW1hbmRzLnB1c2goJ0JVTiB0c2MgLS1ub0VtaXQnKTtcbiAgICB9XG4gICAgd2hpbGUgKGNvbW1hbmRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChjb21tYW5kcy5qb2luKCcgJiYgJyksIHByb2plY3QsIGFyZ3YsIHtcbiAgICAgICAgLy8gRGlzYWJsZSBpbnRlcmFjdGl2ZSBtb2RlXG4gICAgICAgIGNpOiBwcm9qZWN0cy5kZXNjZW5kYW50cy5sZW5ndGggPiAxLFxuICAgICAgICBleGl0SWZGYWlsZWQ6IGZhbHNlLFxuICAgICAgICBmb3JjZUNvbG9yOiB0cnVlLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIFJlLXRyeSB0eXBlIGNoZWNraW5nIGFmdGVyIHJlbW92aW5nIGAubmV4dGAgZGlyZWN0b3J5XG4gICAgICBjb25zdCBuZXh0RGlyUGF0aCA9IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICcubmV4dCcpO1xuICAgICAgaWYgKGV4aXRDb2RlICYmIGZzLmV4aXN0c1N5bmMobmV4dERpclBhdGgpKSB7XG4gICAgICAgIGZzLnJtU3luYyhuZXh0RGlyUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICBjb25zb2xlLmluZm8oY2hhbGsueWVsbG93KCdSZW1vdmVkIGAubmV4dGAgZGlyZWN0b3J5LiBXZSB3aWxsIHJlLXRyeSB0eXBlIGNoZWNraW5nLicpKTtcbiAgICAgICAgcmVtb3ZlZE5leHREaXIgPSB0cnVlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGV4aXRDb2RlO1xuICAgIH1cbiAgfSk7XG4gIGNvbnN0IGV4aXRDb2RlcyA9IGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgbGV0IGZpbmFsRXhpdENvZGUgPSAwO1xuICBmb3IgKGNvbnN0IFtpLCBleGl0Q29kZV0gb2YgZXhpdENvZGVzLmVudHJpZXMoKSkge1xuICAgIGlmIChleGl0Q29kZSkge1xuICAgICAgY29uc3QgZGVwcyA9IHByb2plY3RzLmRlc2NlbmRhbnRzW2ldPy5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge307XG4gICAgICBpZiAoZGVwcy5ibGl0eikge1xuICAgICAgICBjb25zb2xlLmluZm8oY2hhbGsueWVsbG93KCdQbGVhc2UgdHJ5IFwieWFybiBnZW4tY29kZVwiIGlmIHlvdSBmYWNlIHVua25vd24gdHlwZSBlcnJvcnMuJykpO1xuICAgICAgfVxuICAgICAgZmluYWxFeGl0Q29kZSA9IGV4aXRDb2RlO1xuICAgIH1cbiAgfVxuICBpZiAoIWZpbmFsRXhpdENvZGUpXG4gICAgY29uc29sZS5pbmZvKFxuICAgICAgY2hhbGsuZ3JlZW4oXG4gICAgICAgIHJlbW92ZWROZXh0RGlyXG4gICAgICAgICAgPyAnLS0tLS1cXG5ObyB0eXBlIGVycm9ycyBmb3VuZC4gUGxlYXNlIGlnbm9yZSB0aGUgcHJldmlvdXMgdHlwZSBlcnJvcnMsIGFzIHRoZXkgd2VyZSBjYXVzZWQgYnkgb3V0ZGF0ZWQgTmV4dC5qcyBjYWNoZSBmaWxlcy4nXG4gICAgICAgICAgOiAnTm8gdHlwZSBlcnJvcnMgZm91bmQuJ1xuICAgICAgKVxuICAgICk7XG4gIHJldHVybiBmaW5hbEV4aXRDb2RlO1xufVxuXG5leHBvcnQgY29uc3QgdGNDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIFR5cGVDaGVja0NvbW1hbmRPcHRpb25zPiA9IHtcbiAgLi4udHlwZUNoZWNrQ29tbWFuZCxcbiAgY29tbWFuZDogJ3RjJyxcbn07XG4iLCJpbXBvcnQgeyBzcGF3bkFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmRSb290QW5kU2VsZlByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBjb25maWd1cmVFbnYgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgcGFja2FnZU1hbmFnZXIgfSBmcm9tICcuLi91dGlscy9ydW50aW1lLmpzJztcblxuaW1wb3J0IHsgbGludCwgdHlwZSBMaW50Q29tbWFuZEFyZ3YgfSBmcm9tICcuL2xpbnQuanMnO1xuaW1wb3J0IHsgdGVzdCwgdHlwZSBUZXN0Q29tbWFuZEFyZ3YgfSBmcm9tICcuL3Rlc3QuanMnO1xuaW1wb3J0IHsgdHlwZUNoZWNrIH0gZnJvbSAnLi90eXBlY2hlY2suanMnO1xuXG5jb25zdCBidWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbnR5cGUgVmVyaWZ5Q29kZUNvbW1hbmRPcHRpb25zID0gSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj47XG50eXBlIFZlcmlmeUNvZGVDb21tYW5kQXJndiA9IEFyZ3VtZW50c0NhbWVsQ2FzZTxWZXJpZnlDb2RlQ29tbWFuZE9wdGlvbnM+O1xuXG5leHBvcnQgY29uc3QgdmVyaWZ5Q29kZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgVmVyaWZ5Q29kZUNvbW1hbmRPcHRpb25zPiA9IHtcbiAgY29tbWFuZDogJ3ZlcmlmeS1jb2RlJyxcbiAgZGVzY3JpYmU6ICdWZXJpZnkgcHJvamVjdCBjb2RlJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdHMgPSBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyhhcmd2LCBmYWxzZSk7XG4gICAgaWYgKCFwcm9qZWN0cykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGF3YWl0IHZlcmlmeUNvZGUocHJvamVjdHMuc2VsZiwgYXJndik7XG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgdmVyaWZ5Q29kZVdpdGhUZXN0c0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgVmVyaWZ5Q29kZUNvbW1hbmRPcHRpb25zPiA9IHtcbiAgY29tbWFuZDogJ3ZlcmlmeS1jb2RlLXdpdGgtdGVzdHMnLFxuICBkZXNjcmliZTogJ1ZlcmlmeSBwcm9qZWN0IGNvZGUgYW5kIHJ1biB0ZXN0cycsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IHByb2plY3RzID0gZmluZFJvb3RBbmRTZWxmUHJvamVjdHMoYXJndiwgZmFsc2UpO1xuICAgIGlmICghcHJvamVjdHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBhd2FpdCB2ZXJpZnlDb2RlKHByb2plY3RzLnNlbGYsIGFyZ3YpO1xuICAgIGF3YWl0IHJ1blByb2plY3RUZXN0KHByb2plY3RzLnNlbGYsIGFyZ3YpO1xuICB9LFxufTtcblxuYXN5bmMgZnVuY3Rpb24gdmVyaWZ5Q29kZShwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBWZXJpZnlDb2RlQ29tbWFuZEFyZ3YpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgcnVuUGFja2FnZUNvbW1hbmQoJ2luc3RhbGwnLCBgJHtwYWNrYWdlTWFuYWdlcn0gaW5zdGFsbGAsIHByb2plY3QsIGFyZ3YsIHsgc2lsZW50OiB0cnVlIH0pO1xuICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ2dlbi1jb2RlJ10pIHtcbiAgICBhd2FpdCBydW5QYWNrYWdlQ29tbWFuZCgnZ2VuLWNvZGUnLCBgJHtwYWNrYWdlTWFuYWdlcn0gZ2VuLWNvZGVgLCBwcm9qZWN0LCBhcmd2LCB7XG4gICAgICBzaWxlbnQ6IHRydWUsXG4gICAgfSk7XG4gIH1cbiAgYXdhaXQgcnVuSW5Qcm9jZXNzQ29tbWFuZCgnZm9ybWF0JywgKCkgPT4gbGludCh7IC4uLmFyZ3YsIF86IFsnbGludCddLCBmb3JtYXQ6IHRydWUgfSBhcyBMaW50Q29tbWFuZEFyZ3YpLCB7XG4gICAgYWxsb3dGYWlsdXJlOiB0cnVlLFxuICB9KTtcbiAgYXdhaXQgcnVuSW5Qcm9jZXNzQ29tbWFuZCgndHlwZWNoZWNrJywgKCkgPT4gdHlwZUNoZWNrKGFyZ3YpKTtcbiAgYXdhaXQgcnVuSW5Qcm9jZXNzQ29tbWFuZCgnbGludC1maXgnLCAoKSA9PlxuICAgIGxpbnQoeyAuLi5hcmd2LCBfOiBbJ2xpbnQnXSwgZml4OiB0cnVlLCBxdWlldDogdHJ1ZSB9IGFzIExpbnRDb21tYW5kQXJndilcbiAgKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVuUHJvamVjdFRlc3QocHJvamVjdDogUHJvamVjdCwgYXJndjogVmVyaWZ5Q29kZUNvbW1hbmRBcmd2KTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LnRlc3Q/LmluY2x1ZGVzKCd3YiB0ZXN0JykpIHtcbiAgICBjb25zb2xlLmluZm8oJ1xcbicgKyBjaGFsay5jeWFuKGNoYWxrLmJvbGQoJ1N0YXJ0OicpLCAndGVzdCcpKTtcbiAgICBhd2FpdCB0ZXN0KHsgLi4uYXJndiwgXzogWyd0ZXN0J10sIGUyZTogJ2hlYWRsZXNzJyB9IGFzIFRlc3RDb21tYW5kQXJndik7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKGNoYWxrLmJvbGQoJ0ZpbmlzaGVkOicpLCAndGVzdCcpKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBhd2FpdCBydW5QYWNrYWdlQ29tbWFuZCgndGVzdCcsIGAke3BhY2thZ2VNYW5hZ2VyfSB0ZXN0YCwgcHJvamVjdCwgYXJndik7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1bkluUHJvY2Vzc0NvbW1hbmQoXG4gIGNvbW1hbmROYW1lOiBzdHJpbmcsXG4gIGNvbW1hbmQ6ICgpID0+IFByb21pc2U8bnVtYmVyIHwgdW5kZWZpbmVkPixcbiAgb3B0aW9uczogeyBhbGxvd0ZhaWx1cmU/OiBib29sZWFuIH0gPSB7fVxuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc29sZS5pbmZvKCdcXG4nICsgY2hhbGsuY3lhbihjaGFsay5ib2xkKCdTdGFydDonKSwgY29tbWFuZE5hbWUpKTtcbiAgY29uc3QgZXhpdENvZGUgPSAoYXdhaXQgY29tbWFuZCgpKSA/PyAwO1xuICBpZiAoZXhpdENvZGUgPT09IDAgfHwgb3B0aW9ucy5hbGxvd0ZhaWx1cmUpIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oY2hhbGsuYm9sZCgnRmluaXNoZWQ6JyksIGNvbW1hbmROYW1lKSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLnJlZChjaGFsay5ib2xkKGBGYWlsZWQgKGV4aXQgY29kZSAke2V4aXRDb2RlfSk6YCksIGNvbW1hbmROYW1lKSk7XG4gICAgcHJvY2Vzcy5leGl0KGV4aXRDb2RlKTtcbiAgfVxuICByZXR1cm4gZXhpdENvZGU7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1blBhY2thZ2VDb21tYW5kKFxuICBjb21tYW5kTmFtZTogc3RyaW5nLFxuICBjb21tYW5kOiBzdHJpbmcsXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFZlcmlmeUNvZGVDb21tYW5kQXJndixcbiAgb3B0aW9uczogeyBhbGxvd0ZhaWx1cmU/OiBib29sZWFuOyBzaWxlbnQ/OiBib29sZWFuIH0gPSB7fVxuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc29sZS5pbmZvKCdcXG4nICsgY2hhbGsuY3lhbihjaGFsay5ib2xkKCdTdGFydDonKSwgY29tbWFuZE5hbWUpICsgY2hhbGsuZ3JheShgIGF0ICR7cHJvamVjdC5kaXJQYXRofWApKTtcbiAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmF5KGNoYWxrLmJvbGQoJ1N0YXJ0IChyYXcpOicpLCBjb21tYW5kKSk7XG4gIH1cbiAgaWYgKGFyZ3YuZHJ5UnVuKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKGNoYWxrLmJvbGQoJ0ZpbmlzaGVkOicpLCBjb21tYW5kTmFtZSkpO1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgY29uc3QgcmV0ID0gYXdhaXQgc3Bhd25Bc3luYyhjb21tYW5kLCB1bmRlZmluZWQsIHtcbiAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICBlbnY6IGNvbmZpZ3VyZUVudihwcm9qZWN0LmVudiwgeyBmb3JjZUNvbG9yOiB0cnVlIH0pLFxuICAgIHNoZWxsOiB0cnVlLFxuICAgIHN0ZGlvOiBvcHRpb25zLnNpbGVudCA/IFsnaWdub3JlJywgJ2lnbm9yZScsICdpbmhlcml0J10gOiAnaW5oZXJpdCcsXG4gICAga2lsbE9uRXhpdDogdHJ1ZSxcbiAgICB2ZXJib3NlOiBhcmd2LnZlcmJvc2UsXG4gIH0pO1xuXG4gIGlmIChyZXQuc3RhdHVzID09PSAwIHx8IG9wdGlvbnMuYWxsb3dGYWlsdXJlKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKGNoYWxrLmJvbGQoJ0ZpbmlzaGVkOicpLCBjb21tYW5kTmFtZSkpO1xuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5yZWQoY2hhbGsuYm9sZChgRmFpbGVkIChleGl0IGNvZGUgJHtyZXQuc3RhdHVzfSk6YCksIGNvbW1hbmROYW1lKSk7XG4gICAgcHJvY2Vzcy5leGl0KHJldC5zdGF0dXMgPz8gMSk7XG4gIH1cbiAgcmV0dXJuIHJldC5zdGF0dXMgPz8gMTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IHJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcywgdHJlZUtpbGwgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgeWFyZ3MgZnJvbSAneWFyZ3MnO1xuaW1wb3J0IHsgaGlkZUJpbiB9IGZyb20gJ3lhcmdzL2hlbHBlcnMnO1xuXG5pbXBvcnQgeyBidWlsZElmTmVlZGVkQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvYnVpbGRJZk5lZWRlZC5qcyc7XG5pbXBvcnQgeyBjb25jdXJyZW50bHlDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9jb25jdXJyZW50bHkuanMnO1xuaW1wb3J0IHsga2lsbFBvcnRJZk5vbkNpQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMva2lsbFBvcnRJZk5vbkNpLmpzJztcbmltcG9ydCB7IGxpbnRDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9saW50LmpzJztcbmltcG9ydCB7IG9wdGltaXplRm9yRG9ja2VyQnVpbGRDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9vcHRpbWl6ZUZvckRvY2tlckJ1aWxkLmpzJztcbmltcG9ydCB7IHByaXNtYUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3ByaXNtYS5qcyc7XG5pbXBvcnQgeyByZXRyeUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3JldHJ5LmpzJztcbmltcG9ydCB7IHNldHVwQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvc2V0dXAuanMnO1xuaW1wb3J0IHsgc3RhcnRDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9zdGFydC5qcyc7XG5pbXBvcnQgeyB0ZXN0Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvdGVzdC5qcyc7XG5pbXBvcnQgeyB0ZXN0T25DaUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3Rlc3RPbkNpLmpzJztcbmltcG9ydCB7IHRyZWVLaWxsQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvdHJlZUtpbGwuanMnO1xuaW1wb3J0IHsgdGNDb21tYW5kLCB0eXBlQ2hlY2tDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy90eXBlY2hlY2suanMnO1xuaW1wb3J0IHsgdmVyaWZ5Q29kZUNvbW1hbmQsIHZlcmlmeUNvZGVXaXRoVGVzdHNDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy92ZXJpZnlDb2RlLmpzJztcbmltcG9ydCB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmF3YWl0IHlhcmdzKGhpZGVCaW4ocHJvY2Vzcy5hcmd2KSlcbiAgLnNjcmlwdE5hbWUoJ3diJylcbiAgLm9wdGlvbnMoc2hhcmVkT3B0aW9uc0J1aWxkZXIpXG4gIC5taWRkbGV3YXJlKChhcmd2KSA9PiB7XG4gICAgY29uc3Qgd29ya2luZ0RpciA9IGFyZ3ZbJ3dvcmtpbmctZGlyJ107XG4gICAgaWYgKHdvcmtpbmdEaXIpIHtcbiAgICAgIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUod29ya2luZ0Rpcik7XG4gICAgICBwcm9jZXNzLmNoZGlyKGRpclBhdGgpO1xuICAgIH1cblxuICAgIHJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcyhwcm9jZXNzLmVudik7XG4gIH0pXG4gIC5jb21tYW5kKHZlcmlmeUNvZGVXaXRoVGVzdHNDb21tYW5kKVxuICAuY29tbWFuZCh2ZXJpZnlDb2RlQ29tbWFuZClcbiAgLmNvbW1hbmQoYnVpbGRJZk5lZWRlZENvbW1hbmQpXG4gIC5jb21tYW5kKGNvbmN1cnJlbnRseUNvbW1hbmQpXG4gIC5jb21tYW5kKGtpbGxQb3J0SWZOb25DaUNvbW1hbmQpXG4gIC5jb21tYW5kKGxpbnRDb21tYW5kKVxuICAuY29tbWFuZChvcHRpbWl6ZUZvckRvY2tlckJ1aWxkQ29tbWFuZClcbiAgLmNvbW1hbmQocHJpc21hQ29tbWFuZClcbiAgLmNvbW1hbmQocmV0cnlDb21tYW5kKVxuICAuY29tbWFuZChzZXR1cENvbW1hbmQpXG4gIC5jb21tYW5kKHN0YXJ0Q29tbWFuZClcbiAgLmNvbW1hbmQodGVzdENvbW1hbmQpXG4gIC5jb21tYW5kKHRlc3RPbkNpQ29tbWFuZClcbiAgLmNvbW1hbmQodHJlZUtpbGxDb21tYW5kKVxuICAuY29tbWFuZCh0eXBlQ2hlY2tDb21tYW5kKVxuICAuY29tbWFuZCh0Y0NvbW1hbmQpXG4gIC5kZW1hbmRDb21tYW5kKClcbiAgLnN0cmljdCgpXG4gIC52ZXJzaW9uKGdldFZlcnNpb24oKSlcbiAgLmhlbHAoKS5hcmd2O1xuXG5mdW5jdGlvbiBnZXRWZXJzaW9uKCk6IHN0cmluZyB7XG4gIGxldCBwYWNrYWdlSnNvbkRpciA9IHBhdGguZGlybmFtZShuZXcgVVJMKGltcG9ydC5tZXRhLnVybCkucGF0aG5hbWUpO1xuICB3aGlsZSAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHBhY2thZ2VKc29uRGlyLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgcGFja2FnZUpzb25EaXIgPSBwYXRoLmRpcm5hbWUocGFja2FnZUpzb25EaXIpO1xuICB9XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHBhY2thZ2VKc29uRGlyLCAncGFja2FnZS5qc29uJyksICd1dGY4JykpIGFzIHtcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG4gIH07XG4gIHJldHVybiBwYWNrYWdlSnNvbi52ZXJzaW9uO1xufVxuXG5sZXQgc2h1dHRpbmdEb3duID0gZmFsc2U7XG5mb3IgKGNvbnN0IHNpZ25hbCBvZiBbJ1NJR0lOVCcsICdTSUdURVJNJywgJ1NJR1FVSVQnXSkge1xuICBwcm9jZXNzLm9uKHNpZ25hbCwgKCkgPT4ge1xuICAgIGlmIChzaHV0dGluZ0Rvd24pIHJldHVybjtcblxuICAgIHNodXR0aW5nRG93biA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIHRyZWVLaWxsKHByb2Nlc3MucGlkKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKGBGYWlsZWQgdG8gdHJlZUtpbGwoJHtwcm9jZXNzLnBpZH0pIGR1cmluZyBzaHV0ZG93bjpgLCBlcnJvcik7XG4gICAgfVxuICAgIHByb2Nlc3MuZXhpdCgpO1xuICB9KTtcbn1cbiJdLCJuYW1lcyI6WyJ5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52IiwiZW52IiwiZGVzY3JpcHRpb24iLCJ0eXBlIiwiZGVmYXVsdCIsInZlcmJvc2UiLCJhbGlhcyIsImNhY2hlZEVudlZhcnMiLCJNYXAiLCJyZWFkRW52RmlsZSIsImZpbGVQYXRoIiwiY2FjaGVkIiwiZ2V0IiwicGFyc2VkIiwiY29uZmlnIiwicGF0aCIsInJlc29sdmUiLCJwcm9jZXNzRW52Iiwic2V0IiwiaXNFcnJub0V4Y2VwdGlvbiIsImVycm9yIiwiRXJyb3IiLCJ0cmVlS2lsbCIsInBpZCIsInNpZ25hbCIsIk51bWJlciIsImlzSW50ZWdlciIsInByb2Nlc3MiLCJwbGF0Zm9ybSIsInJ1bkNvbW1hbmQiLCJTdHJpbmciLCJtYXhCdWZmZXIiLCJ0aW1lb3V0IiwiaXNOb1N1Y2hQcm9jZXNzRXJyb3IiLCJraWxsVHJlZU9uV2luZG93cyIsImRlc2NlbmRhbnRzIiwicm9vdFBpZCIsInN0ZG91dCIsImNoaWxkcmVuQnlQYXJlbnQiLCJwc091dHB1dCIsImxpbmUiLCJzcGxpdCIsIm1hdGNoZWQiLCJleGVjIiwiY2hpbGRQaWQiLCJwYXJlbnRQaWQiLCJjaGlsZHJlbiIsInB1c2giLCJidWlsZENoaWxkcmVuQnlQYXJlbnRNYXAiLCJxdWV1ZSIsImluZGV4IiwibGVuZ3RoIiwiY29sbGVjdERlc2NlbmRhbnRQaWRzRnJvbU1hcCIsImNvbGxlY3REZXNjZW5kYW50UGlkcyIsInRhcmdldFBpZHMiLCJ0b1JldmVyc2VkIiwidG9DaGlsZHJlbkZpcnN0UGlkcyIsInRhcmdldFBpZCIsImtpbGxJZk5lZWRlZCIsImtpbGwiLCJjb21tYW5kIiwiYXJncyIsIm9wdGlvbnMiLCJleGVjRmlsZVN5bmMiLCJlbmNvZGluZyIsInN0ZGlvIiwic3RkZXJyIiwiQnVmZmVyIiwiaXNCdWZmZXIiLCJ0b1N0cmluZyIsImV4dHJhY3RTdGRlcnIiLCJDb21tYW5kRXhlY3V0aW9uRXJyb3IiLCJjb2RlIiwic3RhdHVzIiwidG9FeGl0Q29kZSIsInRlc3QiLCJjb25zdHJ1Y3RvciIsInN1cGVyIiwiam9pbiIsInRoaXMiLCJuYW1lIiwiYXN5bmMiLCJzcGF3bkFzeW5jIiwiUHJvbWlzZSIsInJlamVjdCIsInByb2MiLCJzcGF3biIsInNldEVuY29kaW5nIiwib24iLCJkYXRhIiwicHJpbnRpbmdTdGRvdXQiLCJ3cml0ZSIsIm1lcmdlT3V0QW5kRXJyb3IiLCJwcmludGluZ1N0ZGVyciIsInN0b3BwZWQiLCJzdG9wUHJvY2VzcyIsImNvbnNvbGUiLCJpbmZvIiwid2FybiIsImNsZWFudXBTaWduYWxzIiwic2lnbmFsSGFuZGxlcnMiLCJyZW1vdmVLaWxsT25FeGl0SGFuZGxlcnMiLCJyZW1vdmVMaXN0ZW5lciIsImhhbmRsZXIiLCJjbGVhciIsImtpbGxPbkV4aXQiLCJoYW5kbGVTaWduYWwiLCJsaXN0ZW5lckNvdW50IiwicmVtb3ZlQWxsTGlzdGVuZXJzIiwidW5kZWZpbmVkIiwiaW5wdXQiLCJzdGRpbiIsImVuZCIsInQiLCJzIiwiaSIsImUiLCJuIiwiZW50cmllcyIsImgiLCJibG9ja3MiLCJyZXNldCIsImZpbmFsaXplZCIsImJsb2NrIiwic3RhcnQiLCJsYXN0Qnl0ZUluZGV4IiwicGFkZGluZyIsIm91dHB1dEJpdHMiLCJibG9ja0NvdW50IiwiYnl0ZUNvdW50Iiwib3V0cHV0QmxvY2tzIiwiZXh0cmFCeXRlcyIsInVwZGF0ZSIsIm8iLCJsIiwiYyIsImYiLCJjb2RlUG9pbnRBdCIsInIiLCJmaW5hbGl6ZSIsImhleCIsImEiLCJ1IiwiZCIsImIiLCJrIiwieSIsIngiLCJCIiwicCIsIkMiLCJ6IiwiSSIsImciLCJ3IiwiQSIsIlAiLCJFIiwiaiIsIm0iLCJxIiwidiIsIkQiLCJGIiwiRyIsIkgiLCJKIiwiSyIsIkwiLCJNIiwiTiIsIk8iLCJRIiwiUiIsIlMiLCJUIiwiVSIsIlYiLCJXIiwiWCIsIlkiLCJaIiwiJCIsIl8iLCJ0dCIsInN0IiwiaXQiLCJldCIsIm90IiwibnQiLCJodCIsInJ0IiwibHQiLCJjdCIsImZ0IiwiaW5zdGFuY2UiLCJmcm9tIiwibWVzc2FnZSIsInN0YWNrIiwiY2F1c2UiLCJzdHViIiwiaHlkcmF0ZSIsIlVpbnQ4QXJyYXkiLCJidG9hIiwiZGVjb2RlIiwiY3JlYXRlIiwiZW5jb2RlIiwiYXRvYiIsIlNldCIsInZhbHVlcyIsImFkZCIsIkRhdGUiLCJ0b0pTT04iLCJSZWdFeHAiLCJmbGFncyIsInNvdXJjZSIsIlVSTCIsImhyZWYiLCJtYXAiLCJUZXh0RW5jb2RlciIsIlRleHREZWNvZGVyIiwiSlNPTiIsInN0cmluZ2lmeSIsImlzTmFOIiwiaXNGaW5pdGUiLCJBcnJheSIsImlzQXJyYXkiLCJmaWxsIiwic2xpY2UiLCJPYmplY3QiLCJjYWNoZUR1cmF0aW9uIiwiUE9TSVRJVkVfSU5GSU5JVFkiLCJnZXRDYWNoZUtleSIsImtpbmQiLCJub3ciLCJjYWxsIiwiaXNDSSIsImNpRW52IiwiUHJvamVjdCIsIl9pbml0UHJvdG8iLCJfYXBwbHlEZWNzIiwibWVtb2l6ZU9uZSIsImFyZ3YiLCJwYXRoQnlOYW1lIiwiZGlyUGF0aCIsImxvYWRFbnYiLCJfZGlyUGF0aCIsImlzQnVuQXZhaWxhYmxlIiwiZnMiLCJyZWFkRmlsZVN5bmMiLCJyb290RGlyUGF0aCIsImJ1aWxkQ29tbWFuZCIsInBhY2thZ2VKc29uIiwic2NyaXB0cyIsImJ1aWxkIiwiaW5jbHVkZXMiLCJleGlzdHNTeW5jIiwiZG9ja2VyZmlsZSIsImZpbmRGaWxlIiwiaGFzRG9ja2VyZmlsZSIsImhhc1NvdXJjZUNvZGUiLCJkb2NrZXJJbWFnZU5hbWUiLCJyZXBsYWNlQWxsIiwiZW52VmFycyIsImVudlBhdGhBbmRMb2FkZWRFbnZWYXJDb3VudFBhaXJzIiwiY3dkIiwiZW52UGF0aHMiLCJlbnZQYXRoIiwiY2FzY2FkZSIsImNhc2NhZGVFbnYiLCJjYXNjYWRlTm9kZUVudiIsIk5PREVfRU5WIiwiYXV0b0Nhc2NhZGVFbnYiLCJXQl9FTlYiLCJpbmNsdWRlUm9vdEVudiIsInJvb3RQYXRoIiwiZmxhdE1hcCIsImZpbHRlciIsInJlbGF0aXZlIiwiZW52UGF0aEFuZExvYWRlZEVudlZhck5hbWVzIiwia2V5cyIsImtleSIsInZhbHVlIiwiY2hlY2tFbnYiLCJtaXNzaW5nS2V5cyIsImV4cGFuZCIsInJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyIsImNvdW50IiwicGFyc2UiLCJwYWNrYWdlSnNvblBhdGgiLCJoYXNQcmlzbWEiLCJkZXBlbmRlbmNpZXMiLCJwcmlzbWEiLCJkZXZEZXBlbmRlbmNpZXMiLCJoYXNWaXRlc3QiLCJ2aXRlc3QiLCJoYXNCaW9tZSIsImhhc0RlcGVuZGVuY3kiLCJoYXNFc2xpbnQiLCJoYXNPeGxpbnQiLCJoYXNPeGZtdCIsImhhc1BvZXRyeUxvY2siLCJoYXNQdWJzcGVjWWFtbCIsInByZWZlcnJlZExpbnRlciIsImhhc1BsYXl3cmlnaHRDb25maWciLCJza2lwTGF1bmNoaW5nU2VydmVyRm9yUGxheXdyaWdodCIsIkNJIiwiY29uZmlnUGF0aCIsImRvY2tlclBhY2thZ2VKc29uIiwiZGlybmFtZSIsImJpbkV4aXN0cyIsImJpbkZvdW5kIiwiY3VycmVudFBhdGgiLCJiaW5QYXRoIiwiUEFUSCIsInBhcmVudFBhdGgiLCJmaWxlTmFtZSIsImZpbmQiLCJwYWNrYWdlTmFtZSIsImhhc0RlcGVuZGVuY3lJblBhY2thZ2VKc29uIiwib3B0aW9uYWxEZXBlbmRlbmNpZXMiLCJwZWVyRGVwZW5kZW5jaWVzIiwicm9vdFBhY2thZ2VKc29uIiwiZmluZFNlbGZQcm9qZWN0IiwiZmluZERlc2NlbmRhbnRQcm9qZWN0cyIsInJvb3RBbmRTZWxmUHJvamVjdHMiLCJmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyIsInJvb3QiLCJzZWxmIiwiZ2V0QWxsRGVzY2VuZGFudFByb2plY3RzIiwidGhpc1Byb2plY3QiLCJyb290UHJvamVjdCIsIndvcmtzcGFjZXMiLCJlbmRzV2l0aCIsInByb2plY3RzIiwid29ya3NwYWNlIiwiZ2xvYlBhdHRlcm4iLCJwYWNrYWdlRGlycyIsIndvcmtzcGFjZVBhdGgiLCJ3cyIsImdsb2JieSIsImRvdCIsIm9ubHlEaXJlY3RvcmllcyIsInN1YlBhY2thZ2VEaXJQYXRoIiwiaXNSdW5uaW5nT25CdW4iLCJ2ZXJzaW9ucyIsImJ1biIsIm5wbV9leGVjcGF0aCIsInJ1bnRpbWVXaXRoQXJncyIsInBhY2thZ2VNYW5hZ2VyIiwicGFja2FnZU1hbmFnZXJXaXRoUnVuIiwiYnVpbGRJZk5lZWRlZENvbW1hbmQiLCJkZXNjcmliZSIsInByb2plY3RQYXRoRm9yVGVzdGluZyIsInByb2plY3QiLCJjaGFsayIsInJlZCIsImNhblNraXAiLCJjYWNoZUZpbGVQYXRoIiwiY29udGVudEhhc2giLCJjYWNoZURpcmVjdG9yeVBhdGgiLCJwcm9taXNlcyIsIm1rZGlyIiwicmVjdXJzaXZlIiwiaGFzaCIsImNyZWF0ZUhhc2giLCJjb21taXRIYXNoIiwiY2hpbGRfcHJvY2VzcyIsImV4ZWNTeW5jIiwidHJpbSIsImVudmlyb25tZW50SnNvbiIsImlnbm9yaW5nRW52VmFyTmFtZXMiLCJoYXMiLCJ0b1NvcnRlZCIsImtleTEiLCJrZXkyIiwibG9jYWxlQ29tcGFyZSIsImZpbHRlcmVkRmlsZVBhdGhzIiwic3Bhd25TeW5jIiwicmVwbGFjZSIsImluY2x1ZGVQYXR0ZXJucyIsInNvbWUiLCJwYXR0ZXJuIiwiaW5jbHVkZVN1ZmZpeCIsInN1ZmZpeCIsImV4Y2x1ZGVQYXR0ZXJucyIsImNvcHkiLCJkaWdlc3QiLCJ1cGRhdGVIYXNoV2l0aERpZmZSZXN1bHQiLCJjYWNoZWRDb250ZW50SGFzaCIsImZuIiwiaWdub3JlRW5vZW50QXN5bmMiLCJyZWFkRmlsZSIsImNhblNraXBCdWlsZCIsImdyZWVuIiwiZHJ5UnVuIiwid3JpdGVGaWxlIiwiYnVpbGRJZk5lZWRlZCIsInJldCIsInNoZWxsIiwiZXhpdENvZGUiLCJwcm9taXNlUG9vbCIsIlByb21pc2VQb29sIiwiZGVmYXVsdE9wdGlvbnMiLCJleGl0SWZGYWlsZWQiLCJydW5XaXRoU3Bhd24iLCJzY3JpcHQiLCJvcHRzIiwibm9ybWFsaXplZFNjcmlwdCIsIm5vcm1hbGl6ZVNjcmlwdCIsInByaW50U3RhcnQiLCJwcmludGFibGUiLCJydW5uYWJsZSIsInByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQiLCJjb25maWd1cmVFbnYiLCJvblNpZ25hbCIsInJ1bldpdGhTcGF3bkluUGFyYWxsZWwiLCJydW5BbmRXYWl0Rm9yUmV0dXJuVmFsdWUiLCJvdXQiLCJuZXdTY3JpcHQiLCJibGl0eiIsInByaW50YWJsZVNjcmlwdCIsImZpeEJ1bkNvbW1hbmQiLCJydW5uYWJsZVNjcmlwdCIsImNhc2NhZGVPcHRpb24iLCJwcmVmaXgiLCJ3ZWFrIiwiZ3JheSIsImN5YW4iLCJib2xkIiwiZXhpdCIsIm5ld0VudiIsImNpIiwiZm9yY2VDb2xvciIsIkZPUkNFX0NPTE9SIiwic2hhcmVkT3B0aW9uc0J1aWxkZXIiLCJidWlsZEVudlJlYWRlck9wdGlvbkFyZ3MiLCJvcHRpb25OYW1lIiwiZ2V0T3B0aW9uVmFsdWUiLCJpdGVtIiwiY2FtZWxDYXNlT3B0aW9uTmFtZSIsImNoYXJhY3RlciIsInRvVXBwZXJDYXNlIiwiY29uY3VycmVudGx5Q29tbWFuZCIsImJ1aWxkZXIiLCJzdWNjZXNzIiwiY2hvaWNlcyIsImNvbW1hbmRzIiwiQm9vbGVhbiIsImRldGFjaGVkIiwiaW50ZXJydXB0ZWRTaWduYWwiLCJmaXJzdFJlc3VsdCIsInN0b3BSZXN1bHQiLCJzdG9wcGluZyIsInJlc3VsdHMiLCJ3YWl0Rm9yRXhpdFByb21pc2VzIiwiY2hpbGQiLCJzZXR0bGVkIiwic2V0dGxlIiwia2lsbE90aGVycyIsImtpbGxPdGhlcnNPbkZhaWwiLCJzaG91bGRTdG9wT3RoZXJzIiwidGVybWluYXRlQ2hpbGRyZW4iLCJvbmNlIiwiZ2V0RXhpdENvZGUiLCJzdG9wQWxsIiwic3RvcE9uU2lnaW50Iiwic3RvcE9uU2lndGVybSIsInN0b3BPblNpZ3F1aXQiLCJhbGwiLCJyZXN1bHQiLCJydW5Db25jdXJyZW50bHkiLCJjb25zdGFudHMiLCJzaWduYWxzIiwia2lsbFByb2Nlc3NHcm91cCIsImtpbGxQb3J0SWZOb25DaUNvbW1hbmQiLCJwb3J0RW52IiwiUE9SVCIsInBvcnQiLCJraWxsUG9ydFByb2Nlc3MiLCJraWxsUG9ydElmTm9uQ2kiLCJidWlsZFNoZWxsQ29tbWFuZCIsImFyZyIsInNoZWxsRXNjYXBlQXJndW1lbnQiLCJiaW9tZUV4dGVuc2lvbnMiLCJlc2xpbnRFeHRlbnNpb25zIiwib3hsaW50RXh0ZW5zaW9ucyIsInB5dGhvbkV4dGVuc2lvbnMiLCJkYXJ0RXh0ZW5zaW9ucyIsIm94Zm10RXh0ZW5zaW9ucyIsInByZXR0aWVyRXh0ZW5zaW9ucyIsInByZXR0aWVyT25seUV4dGVuc2lvbnMiLCJleHQiLCJwcmV0dGllckZpeHR1cmVJZ25vcmVQYXR0ZXJuIiwibGludENvbW1hbmQiLCJmaXgiLCJmb3JtYXQiLCJxdWlldCIsImxpbnQiLCJmaWxlcyIsImxpbnRUYXJnZXRzIiwiZ2V0TGludFRhcmdldEZpbGVzIiwibGludEZpbGVQYXRoc0J5UHJvamVjdCIsIm94Zm10RmlsZVBhdGhzQnlQcm9qZWN0IiwicHl0aG9uRmlsZVBhdGhzQnlQcm9qZWN0IiwiZGFydEZpbGVQYXRoc0J5UHJvamVjdCIsInByZXR0aWVyRmlsZVBhdGhzIiwicGFja2FnZUpzb25GaWxlUGF0aHMiLCJwcmV0dGllckFyZ3MiLCJzb3J0UGFja2FnZUpzb25BcmdzIiwibWlzc2luZ0xpbnRUb29sRm9yRXhwbGljaXRGaWxlcyIsImZpbGUiLCJmaWxlS2luZCIsInN0YXQiLCJpc0RpcmVjdG9yeSIsImdldExpbnRUYXJnZXRGaWxlS2luZCIsImV4dGVuc2lvbiIsImV4dG5hbWUiLCJnZXRFeHBsaWNpdFBhY2thZ2VKc29uUGF0aHMiLCJsaW50UGF0aCIsImdldEV4cGxpY2l0TGludFRhcmdldHMiLCJweXRob25GaWxlUGF0aHMiLCJkYXJ0RmlsZVBhdGhzIiwic3VwcG9ydHNMaW50aW5nRXh0ZW5zaW9uIiwibGludEZpbGVQYXRocyIsImZvcm1hdHRlclBhdGgiLCJidWlsZEV4cGxpY2l0Rm9ybWF0dGVyQXJncyIsIm94Zm10RmlsZVBhdGhzIiwiaXNQb3RlbnRpYWxMaW50VGFyZ2V0Iiwic2VsZkRpclBhdGgiLCJuZWVkc1ByZXR0aWVyIiwicHJvamVjdFBhdHRlcm4iLCJidWlsZFByZXR0aWVyQXJncyIsImxpbnRQcm9taXNlcyIsImxpbnRSdW5PcHRpb25zIiwiYnVpbGRMaW50Q29tbWFuZCIsImJ1aWxkT3hmbXRDb21tYW5kIiwiYnVpbGRQb2V0cnlDb21tYW5kIiwiYnVpbGREYXJ0Q29tbWFuZCIsImxpbnRFeGl0Q29kZXMiLCJiaW9tZUFyZ3MiLCJ0YXJnZXRzIiwic2hvdWxkRm9ybWF0RXhwbGljaXRQYXRoV2l0aFByZXR0aWVyIiwic3RhcnRzV2l0aCIsImRlc2NlbmRhbnRQcm9qZWN0cyIsIm93bmluZ1Byb2plY3QiLCJmaW5kT3duaW5nUHJvamVjdCIsInByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCIsImNvbW1hbmROYW1lIiwib3B0aW1pemVGb3JEb2NrZXJCdWlsZENvbW1hbmQiLCJvdXRzaWRlIiwiZGVwcyIsIm9wdGltaXplRGV2RGVwZW5kZW5jaWVzIiwib3B0aW1pemVTY3JpcHRzIiwib3B0aW1pemVSb290UHJvcHMiLCJkaXN0RGlyUGF0aCIsImRldkRlcHMiLCJuYW1lV29yZHNUb0JlUmVtb3ZlZCIsInJlbW92ZWREZXBzIiwid29yZCIsIm5hbWVXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzIiwiY29udGVudFdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMiLCJyZW1vdmVkU2NyaXB0cyIsImNvbnRlbnQiLCJwcml2YXRlIiwicHVibGlzaENvbmZpZyIsInByZXR0aWVyIiwiRklMRV9TQ0hFTUEiLCJQT1NTSUJMRV9QUklTTUFfUEFUSFMiLCJzY2hlbWFQYXRoIiwiZGJQYXRoIiwiZ2V0RGF0YWJhc2VEaXJQYXRoIiwiZ2V0UHJpc21hQmFzZURpciIsInByaXNtYVNjcmlwdHMiLCJjbGVhblVwTGl0ZXN0cmVhbSIsImRlcGxveSIsImFkZGl0aW9uYWxPcHRpb25zIiwiZGVwbG95Rm9yY2UiLCJyZW1vdmVEYkNvbW1hbmQiLCJsaXN0QmFja3VwcyIsIm1pZ3JhdGUiLCJzZWVkIiwibWlncmF0ZURldiIsInN0ZXBzIiwiY2xlYW51cENvbW1hbmQiLCJkYlVybCIsIkRBVEFCQVNFX1VSTCIsInJhd0RiUGF0aCIsImJhc2VEaXIiLCJhYnNvbHV0ZVBhdGgiLCJpc0Fic29sdXRlIiwiY2xlYW5VcFNxbGl0ZURiSWZOZWVkZWQiLCJyZXNldENvbW1hbmQiLCJyZXN0b3JlIiwib3V0cHV0UGF0aCIsInNjcmlwdFBhdGgiLCJzdHVkaW8iLCJkYlVybE9yUGF0aCIsInByaXNtYUNvbW1hbmQiLCJ5YXJncyIsInBhcnNlckNvbmZpZ3VyYXRpb24iLCJjbGVhblVwTGl0ZXN0cmVhbUNvbW1hbmQiLCJjcmVhdGVMaXRlc3RyZWFtQ29uZmlnQ29tbWFuZCIsImRlcGxveUNvbW1hbmQiLCJkZXBsb3lGb3JjZUNvbW1hbmQiLCJsaXN0QmFja3Vwc0NvbW1hbmQiLCJtaWdyYXRlQ29tbWFuZCIsIm1pZ3JhdGVEZXZDb21tYW5kIiwicmVzdG9yZUNvbW1hbmQiLCJzZWVkQ29tbWFuZCIsInN0dWRpb0NvbW1hbmQiLCJkZWZhdWx0Q29tbWFuZCIsImRlbWFuZENvbW1hbmQiLCJzdHJpY3QiLCJhbGxQcm9qZWN0cyIsImZpbmRQcmlzbWFQcm9qZWN0cyIsImNyZWF0ZUxpdGVzdHJlYW1Db25maWciLCJ1bmtub3duT3B0aW9ucyIsImV4dHJhY3RVbmtub3duT3B0aW9ucyIsIm91dHB1dCIsInJlc3RvcmVkIiwiZnVsbENvbW1hbmQiLCJ0cmltRW5kIiwicmVxdWlyZWRFbnZWYXJzIiwiQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ09VTlRfSUQiLCJDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQlVDS0VUX05BTUUiLCJDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDRVNTX0tFWV9JRCIsIkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9TRUNSRVRfQUNDRVNTX0tFWSIsIm1pc3NpbmdFbnZWYXJzIiwicmV0ZW50aW9uQ2hlY2tJbnRlcnZhbCIsImxpdGVzdHJlYW1Db25maWciLCJ3cml0ZUZpbGVTeW5jIiwicmVhc29uIiwiZmlsdGVyZWQiLCJrbm93bk9wdGlvbnMiLCJzaGFyZWRPcHRpb25LZXlzIiwic2hhcmVkT3B0aW9uQWxpYXNlcyIsIm9wdGlvbiIsImFsbEtub3duT3B0aW9ucyIsImtlYmFiQ2FzZUtleSIsIm1hdGNoIiwidG9Mb3dlckNhc2UiLCJwYXNzdGhyb3VnaEFyZ3MiLCJyZXRyeUNvbW1hbmQiLCJyZXRyeSIsImNtZEFuZEFyZ3MiLCJsYXN0U3RhdHVzIiwieWVsbG93Iiwic2V0dXBDb21tYW5kIiwiZGlyZW50cyIsInJlYWRkaXIiLCJ3aXRoRmlsZVR5cGVzIiwib3MiLCJwYWNrYWdlcyIsImlzRmlsZSIsInZlcnNpb24iLCJwcm9taXNlQWxsIiwicGxheXdyaWdodCIsInNldHVwIiwidG9EZXZOdWxsIiwic2lsZW50Iiwia2lsbGVkIiwia2lsbFBvcnRQcm9jZXNzSW1tZWRpYXRlbHlBbmRPbkV4aXQiLCJhdmFpbGFibGUiLCJob3N0IiwicHJvYmVQb3J0IiwiaXNQb3J0QXZhaWxhYmxlIiwia2lsbFBvcnRDb250YWluZXJBbmRQcm9jZXNzIiwia2lsbEZ1bmMiLCJmaWx0ZXJBcmdzIiwiY29udGFpbmVySWRzIiwiaWQiLCJsaXN0RG9ja2VyQ29udGFpbmVySWRzIiwicmVtb3ZlRG9ja2VyQ29udGFpbmVycyIsInN0b3BEb2NrZXJDb250YWluZXJCeVBvcnQiLCJjaGVja0FuZEtpbGxQb3J0UHJvY2VzcyIsInJhd1BvcnQiLCJzZXJ2ZXIiLCJjcmVhdGVTZXJ2ZXIiLCJlcnIiLCJjbG9zZSIsImxpc3RlbiIsImRvY2tlclNjcmlwdHMiLCJidWlsZEltYWdlIiwic3RvcEFuZFN0YXJ0IiwiYWRkaXRpb25hbEFyZ3MiLCJzdG9wIiwic3Bhd25TeW5jT25FeGl0IiwiQmFzZVNjcmlwdHMiLCJzaG91bGRXYWl0QW5kT3BlbkFwcCIsImJ1aWxkRG9ja2VyIiwic3RhcnREZXYiLCJzdGFydERldlByb3RlY3RlZCIsIndhaXRBbmRPcGVuQXBwIiwic3RhcnRQcm9kdWN0aW9uIiwic3RhcnRQcm9kdWN0aW9uUHJvdGVjdGVkIiwic3RhcnRUZXN0Iiwic3RhcnREb2NrZXIiLCJub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQiLCJub3JtYWxpemVkQXJnc1RleHQiLCJlY29zeXN0ZW1Db25maWdQYXRoIiwiZmluZEVjb3N5c3RlbUNvbmZpZ1BhdGgiLCJjbWQiLCJ0ZXN0RTJFRGV2IiwidGVzdEUyRVByb3RlY3RlZCIsInRlc3RFMkVQcm9kdWN0aW9uIiwidGVzdEUyRURvY2tlciIsInRlc3RTdGFydCIsIndhaXRBcHAiLCJzdGFydENvbW1hbmQiLCJmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyIsInBsYXl3cmlnaHRBcmdzIiwicGxheXdyaWdodENvbW1hbmQiLCJiYWlsIiwiYmFzZSIsIm5vcm1hbGl6ZWRUYXJnZXRzIiwiYXBwZW5kUGxheXdyaWdodEJhaWxPcHRpb24iLCJyZXN0IiwiZXhwbGljaXRUYXJnZXRJbmRleGVzIiwiZmluZEV4cGxpY2l0UGxheXdyaWdodFRhcmdldEluZGV4ZXMiLCJyZXN0V2l0aG91dEV4cGxpY2l0VGFyZ2V0IiwiYnVpbGRQbGF5d3JpZ2h0Q29tbWFuZCIsInRlc3RVbml0IiwiY29tbWFuZEFyZ3MiLCJwbGF5d3JpZ2h0SW5kZXgiLCJpbmRleE9mIiwiaXNQbGF5d3JpZ2h0VGVzdENvbW1hbmQiLCJwZW5kaW5nVmFsdWVNb2RlIiwidGFyZ2V0SW5kZXhlcyIsIm9mZnNldCIsIlBMQVlXUklHSFRfVEVTVF9PUFRJT05TX1dJVEhfUkVRVUlSRURfVkFMVUVTIiwiUExBWVdSSUdIVF9URVNUX09QVElPTlNfV0lUSF9PUFRJT05BTF9WQUxVRVMiLCJzaG9ydE9wdGlvbiIsIlBMQVlXUklHSFRfVEVTVF9TSE9SVF9PUFRJT05TX1dJVEhfUkVRVUlSRURfVkFMVUVTIiwiYmxpdHpTY3JpcHRzIiwiaHR0cFNlcnZlclNjcmlwdHMiLCJ3YXRjaCIsIm5leHRTY3JpcHRzIiwicGxhaW5BcHBTY3JpcHRzIiwiXzEiLCJfMiIsInJlbWl4U2NyaXB0cyIsInZpdGVTY3JpcHRzIiwiaHR0cFNlcnZlclBhY2thZ2VzIiwibW9kZSIsImRvY2tlck9wdGlvbnMiLCJub3JtYWxpemVBcmdzIiwibmV4dCIsInZpdGUiLCJlMmUiLCJhcmd1bWVudHNCdWlsZGVyIiwidGVzdENvbW1hbmQiLCJ0ZXN0VGFyZ2V0cyIsInNob3VsZFJ1bkUyZSIsInNob3VsZFJ1blVuaXQiLCJoYXNFMmVUYXJnZXRzIiwidGFyZ2V0IiwiaGFzVW5pdFRhcmdldHMiLCJzaG91bGRSdW5BbGxUZXN0cyIsInJlc29sdmVUZXN0RXhlY3V0aW9uVGFyZ2V0cyIsInVuaXRUYXJnZXRzIiwidW5pdEFyZ3YiLCJ1bml0VGltZW91dCIsImUyZVRhcmdldHMiLCJlMmVBcmd2IiwiYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRSIsInRlc3RPbkRvY2tlciIsIldCX0RPQ0tFUiIsImhhc0ZvcndhcmRlZFBsYXl3cmlnaHRUYXJnZXRzIiwidGVzdE9uQ2lDb21tYW5kIiwidGVzdE9uQ2kiLCJ0cmVlS2lsbENvbW1hbmQiLCJwb3NpdGlvbmFsIiwiZGVtYW5kT3B0aW9uIiwidHlwZUNoZWNrQ29tbWFuZCIsInR5cGVDaGVjayIsInJlbW92ZWROZXh0RGlyIiwidHlwZXNjcmlwdCIsInB5cmlnaHQiLCJuZXh0RGlyUGF0aCIsInJtU3luYyIsImZvcmNlIiwiZXhpdENvZGVzIiwiZmluYWxFeGl0Q29kZSIsInRjQ29tbWFuZCIsInZlcmlmeUNvZGVDb21tYW5kIiwidmVyaWZ5Q29kZSIsInZlcmlmeUNvZGVXaXRoVGVzdHNDb21tYW5kIiwicnVuUGFja2FnZUNvbW1hbmQiLCJydW5Qcm9qZWN0VGVzdCIsInJ1bkluUHJvY2Vzc0NvbW1hbmQiLCJhbGxvd0ZhaWx1cmUiLCJoaWRlQmluIiwic2NyaXB0TmFtZSIsIm1pZGRsZXdhcmUiLCJ3b3JraW5nRGlyIiwiY2hkaXIiLCJCRVJSWV9CSU5fRk9MREVSIiwidXBwZXJLZXkiLCJyZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMiLCJwYWNrYWdlSnNvbkRpciIsInVybCIsInBhdGhuYW1lIiwiZ2V0VmVyc2lvbiIsImhlbHAiLCJzaHV0dGluZ0Rvd24iXSwibWFwcGluZ3MiOiI0aEJBT08sTUFBTUEsRUFBNEIsQ0FDdkNDLElBQUssQ0FDSEMsWUFBYSwyQkFDYkMsS0FBTSxTQUVSLGNBQWUsQ0FDYkQsWUFDRSx3TEFDRkMsS0FBTSxVQUVSLG1CQUFvQixDQUNsQkQsWUFBYSwwRkFDYkMsS0FBTSxXQUVSLG1CQUFvQixDQUNsQkQsWUFBYSxpRUFDYkMsS0FBTSxVQUNOQyxTQUFTLEdBRVgsbUJBQW9CLENBQ2xCRixZQUFhLHFHQUNiQyxLQUFNLFVBQ05DLFNBQVMsR0FFWCxZQUFhLENBQ1hGLFlBQWEscUZBQ2JDLEtBQU0sU0FDTkMsUUFBUyxnQkFFWEMsUUFBUyxDQUNQSCxZQUFhLHNDQUNiQyxLQUFNLFVBQ05HLE1BQU8sTUE0RlgsTUFBTUMsRUFBZ0IsSUFBSUMsSUFFMUIsU0FBU0MsRUFBWUMsR0FDbkIsTUFBTUMsRUFBU0osRUFBY0ssSUFBSUYsR0FDakMsR0FBSUMsRUFBUSxPQUFPQSxFQUVuQixNQUFNRSxFQUFTQyxFQUFPLENBQUVDLEtBQU1BLEVBQUtD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QUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxHQUFHQyxHQUFHQyxHQUFHQyxHQUFHQyxHQUFHQyxHQUFHQyxHQUFHQyxHQUFHQyxHQUFHQyxHQUFHQyxHQUFHLElBQUk3RCxFQUFFLEVBQUVBLEVBQUUsR0FBR0EsR0FBRyxFQUFFaEIsRUFBRUosRUFBRSxHQUFHQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlNLEVBQUVOLEVBQUUsR0FBR0EsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJeUIsRUFBRXpCLEVBQUUsR0FBR0EsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJcUIsRUFBRXJCLEVBQUUsR0FBR0EsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJc0IsRUFBRXRCLEVBQUUsR0FBR0EsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJdUIsRUFBRXZCLEVBQUUsR0FBR0EsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJNEIsRUFBRTVCLEVBQUUsR0FBR0EsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJNkIsRUFBRTdCLEVBQUUsR0FBR0EsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJOEIsRUFBRTlCLEVBQUUsR0FBR0EsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJK0IsRUFBRS9CLEVBQUUsR0FBR0EsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQyxFQUFFNkIsR0FBR0wsR0FBRyxFQUFFSixJQUFJLElBQUluQixFQUFFNkIsR0FBR1YsR0FBRyxFQUFFSSxJQUFJLElBQUl6QixFQUFFLElBQUlDLEVBQUVELEVBQUUsSUFBSUUsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVELEVBQUVHLEdBQUdrQixHQUFHLEVBQUVDLElBQUksSUFBSXJCLEVBQUVJLEdBQUdpQixHQUFHLEVBQUVELElBQUksSUFBSXRCLEVBQUUsSUFBSUMsRUFBRUQsRUFBRSxJQUFJRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUQsRUFBRXdCLEdBQUdHLEdBQUcsRUFBRUMsSUFBSSxJQUFJM0IsRUFBRW1CLEdBQUdRLEdBQUcsRUFBRUQsSUFBSSxJQUFJNUIsRUFBRSxJQUFJQyxFQUFFRCxFQUFFLElBQUlFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRCxFQUFFcUIsR0FBR1EsR0FBRyxFQUFFQyxJQUFJLElBQUk3QixFQUFFcUIsR0FBR1EsR0FBRyxFQUFFRCxJQUFJLElBQUk5QixFQUFFLElBQUlDLEVBQUVELEVBQUUsSUFBSUUsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFF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