logixlysia 6.5.0 → 6.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +50 -1
- package/dist/index.js +8 -8
- package/dist/otel.d.ts +3 -1
- package/dist/otel.js +3 -3
- package/package.json +2 -2
package/dist/index.d.ts
CHANGED
|
@@ -48,6 +48,23 @@ interface LogFilter {
|
|
|
48
48
|
*/
|
|
49
49
|
type PrettyPrintConfig = boolean | Record<string, unknown>;
|
|
50
50
|
type LogPreset = "dev" | "prod" | "json";
|
|
51
|
+
interface RequestIdConfig {
|
|
52
|
+
/**
|
|
53
|
+
* Enable request ID generation.
|
|
54
|
+
* When used as a boolean on `Options.config.requestId`, `true` enables with defaults.
|
|
55
|
+
*/
|
|
56
|
+
enabled?: boolean;
|
|
57
|
+
/**
|
|
58
|
+
* Custom ID generator function.
|
|
59
|
+
* @default crypto.randomUUID()
|
|
60
|
+
*/
|
|
61
|
+
generator?: () => string;
|
|
62
|
+
/**
|
|
63
|
+
* Header name to read from the incoming request and write to the response.
|
|
64
|
+
* @default 'X-Request-Id'
|
|
65
|
+
*/
|
|
66
|
+
header?: string;
|
|
67
|
+
}
|
|
51
68
|
interface Options {
|
|
52
69
|
config?: {
|
|
53
70
|
showStartupMessage?: boolean;
|
|
@@ -72,6 +89,20 @@ interface Options {
|
|
|
72
89
|
logQueryParams?: boolean;
|
|
73
90
|
/** Skip automatic WebSocket lifecycle logs from `wrapWs`; default false. */
|
|
74
91
|
disableWebSocketLogging?: boolean;
|
|
92
|
+
/**
|
|
93
|
+
* Enable automatic request ID generation and propagation.
|
|
94
|
+
*
|
|
95
|
+
* - `true`: Enable with defaults (`X-Request-Id` header, `crypto.randomUUID()` generator).
|
|
96
|
+
* - `false` or `undefined`: Disabled (default).
|
|
97
|
+
* - `RequestIdConfig` object: Enable with custom header name and/or generator.
|
|
98
|
+
*
|
|
99
|
+
* When enabled, the plugin will:
|
|
100
|
+
* 1. Read `X-Request-Id` (or custom header) from the incoming request — honoring IDs set by upstream proxies.
|
|
101
|
+
* 2. Generate a new UUID if no header is present.
|
|
102
|
+
* 3. Merge `{ requestId }` into the request context (appears in logs and context tree).
|
|
103
|
+
* 4. Set the header on the outgoing response for client-side tracing.
|
|
104
|
+
*/
|
|
105
|
+
requestId?: boolean | RequestIdConfig;
|
|
75
106
|
logFilter?: LogFilter;
|
|
76
107
|
transports?: Transport[];
|
|
77
108
|
useTransportsOnly?: boolean;
|
|
@@ -143,6 +174,24 @@ import pino from "pino";
|
|
|
143
174
|
declare const createLogger: (options?: Options, pinoFactory?: typeof pino, externalContextStore?: RequestContextStore) => Logger;
|
|
144
175
|
/** Plugin entry: shares one request-context store across the Elysia lifecycle. */
|
|
145
176
|
declare const createPluginLogger: (options: Options, contextStore: RequestContextStore) => Logger;
|
|
177
|
+
interface ResolvedRequestIdConfig {
|
|
178
|
+
enabled: boolean;
|
|
179
|
+
generator: () => string;
|
|
180
|
+
header: string;
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Normalises the `requestId` option into a concrete config object.
|
|
184
|
+
*
|
|
185
|
+
* - `undefined` / `false` → `null` (disabled)
|
|
186
|
+
* - `true` → default config
|
|
187
|
+
* - `RequestIdConfig` → merged with defaults; `enabled: false` inside the object disables the feature
|
|
188
|
+
*/
|
|
189
|
+
declare const resolveRequestIdConfig: (raw?: boolean | RequestIdConfig) => ResolvedRequestIdConfig | null;
|
|
190
|
+
/**
|
|
191
|
+
* Reads an existing request ID from the incoming request header, or generates a
|
|
192
|
+
* new one using the configured generator.
|
|
193
|
+
*/
|
|
194
|
+
declare const getOrCreateRequestId: (request: Request, config: ResolvedRequestIdConfig) => string;
|
|
146
195
|
/**
|
|
147
196
|
* Empty singleton slots must not use `Record<string, never>`: intersecting that with Elysia's `Context`
|
|
148
197
|
* makes every key (including `store`) become `never` because each key is merged with `never`.
|
|
@@ -165,4 +214,4 @@ type LogixlysiaPlugin = Logixlysia & {
|
|
|
165
214
|
wrapWs: ReturnType<typeof createWsHandlerWrapper>;
|
|
166
215
|
};
|
|
167
216
|
declare const logixlysia: (rawOptions?: Options) => LogixlysiaPlugin;
|
|
168
|
-
export { resolveOptions, logixlysia, logixlysia as default, createWsHandlerWrapper, createPluginLogger, createLogger, WsHandlerHooks, Transport, StoreData, Pino, Options, LogixlysiaStore, LogixlysiaSingleton, LogixlysiaPlugin, LogixlysiaContext, Logixlysia, Logger, LogPreset, LogLevel, EmptyElysiaSlot };
|
|
217
|
+
export { resolveRequestIdConfig, resolveOptions, logixlysia, getOrCreateRequestId, logixlysia as default, createWsHandlerWrapper, createPluginLogger, createLogger, WsHandlerHooks, Transport, StoreData, ResolvedRequestIdConfig, RequestIdConfig, Pino, Options, LogixlysiaStore, LogixlysiaSingleton, LogixlysiaPlugin, LogixlysiaContext, Logixlysia, Logger, LogPreset, LogLevel, EmptyElysiaSlot };
|
package/dist/index.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import{Elysia as
|
|
2
|
-
`)},
|
|
3
|
-
`,
|
|
4
|
-
${
|
|
5
|
-
`)}`:
|
|
1
|
+
import{Elysia as n$}from"elysia";var S0={dev:{showStartupMessage:!0,startupMessageFormat:"banner",useColors:!0,showContextTree:!0,pino:{prettyPrint:!0}},prod:{showStartupMessage:!1,useColors:!1,showContextTree:!1,autoRedact:!0,requestId:!0,pino:{prettyPrint:!1}},json:{showStartupMessage:!1,useColors:!1,showContextTree:!1,pino:{prettyPrint:!1}}},w0=($,W)=>{if(!W)return $;let N={...$,...W};if($.pino||W.pino)N.pino={...$.pino,...W.pino,...$.pino?.prettyPrint!==void 0||W.pino?.prettyPrint!==void 0?{prettyPrint:W.pino?.prettyPrint??$.pino?.prettyPrint}:{}};if($.logFilter||W.logFilter)N.logFilter={...$.logFilter,...W.logFilter};if($.logRotation||W.logRotation)N.logRotation={...$.logRotation,...W.logRotation};if($.timestamp||W.timestamp)N.timestamp={...$.timestamp,...W.timestamp};return N},e=($={})=>{let W=$.preset;if(!W)return $;let N=S0[W];return{...$,config:w0(N,$.config)}};var p=()=>{let $=new WeakMap,W=(N)=>{let Q=$.get(N);if(!Q)Q={},$.set(N,Q);return Q};return{mergeContext(N,Q){if(Object.keys(Q).length===0)return;let Z=W(N);Object.assign(Z,Q)},getContext(N){let Q=$.get(N);return Q?{...Q}:{}},clearContext(N){$.delete(N)}}},g=($,W)=>{let N=$.context,Q=Object.keys(W).length>0,Z=N!==void 0&&N!==null&&typeof N==="object"&&!Array.isArray(N)&&Object.keys(N).length>0;if(!(Q||Z))return $;let H={...W,...Z?N:{}};return{...$,context:H}};import{createRequire as z0}from"node:module";var L0=(()=>{try{return z0(import.meta.url)("elysia/package.json")}catch{return{}}})(),k0=(()=>{try{return z0(import.meta.url)("../../package.json")}catch{return{}}})(),y0=($,W)=>{if($.length>=W)return $.slice(0,W);let N=Math.floor((W-$.length)/2),Q=W-$.length-N;return`${" ".repeat(N)}${$}${" ".repeat(Q)}`},K0=($,W)=>{let N=L0.version,Q=N?`Elysia v${N}`:"Elysia",Z=[{kind:"empty"},{kind:"center",text:Q},{kind:"empty"},{kind:"left",text:$}];if(W)Z.push({kind:"left",text:W});Z.push({kind:"empty"});let J=Math.max(Q.length,$.length,...W?[W.length]:[0])+4,j=`┌${"─".repeat(J)}┐`,X=`└${"─".repeat(J)}┘`,V=`│${" ".repeat(J)}│`,z=[j];for(let K of Z){if(K.kind==="empty"){z.push(V);continue}if(K.kind==="center"){z.push(`│${y0(K.text,J)}│`);continue}let B=K.text,M=Math.max(0,J-B.length-4);z.push(`│ ${B}${" ".repeat(M)} │`)}return z.push(X),z.join(`
|
|
2
|
+
`)},Y0=()=>{let $=k0.version;if(!$)return null;return` logixlysia v${$}`};var $0=($,W)=>{if(!(W.config?.showStartupMessage??!0))return;let{port:Q,hostname:Z,protocol:H}=$;if(Q===void 0||!Z||!H)return;let J=`${H}://${Z}:${Q}`,j=`\uD83E\uDD8A Elysia is running at ${J}`,X=`\uD83E\uDD8A ${J}`;if((W.config?.startupMessageFormat??"banner")==="simple"){console.log(j);return}console.log(K0(X,Y0()))};import b0 from"pino";var d=(...$)=>{let W=typeof $[0]==="string"?{level:$[0],request:$[1],data:$[2],store:$[3],options:$[4]}:$[0],{level:N,request:Q,data:Z,store:H,options:J}=W,j=J.config?.transports??[];if(j.length===0)return;let X=typeof Z.message==="string"?Z.message:"",V={request:{method:Q.method,url:Q.url},...Z,beforeTime:H.beforeTime};for(let z of j)try{let K=z.log(N,X,V);if(K&&typeof K.catch==="function")K.catch(()=>{})}catch{}};import{appendFile as l0}from"node:fs/promises";import{dirname as s0}from"node:path";import{promises as C0}from"node:fs";var B0=async($)=>{await C0.mkdir($,{recursive:!0})};import{promises as b}from"node:fs";import{promisify as h0}from"node:util";import{gzip as v0}from"node:zlib";import{promises as W0}from"node:fs";import{basename as f0,dirname as x0}from"node:path";var P0=/^(\d+(?:\.\d+)?)(k|kb|m|mb|g|gb)$/i,q0=/^(\d+)(h|d|w)$/i,m0=/\.(\d{4}-\d{2}-\d{2}-\d{2}-\d{2}-\d{2}(?:-\d{3})?(?:-\d+)?)(?:\.gz)?$/,G0=($)=>{if(typeof $==="number")return $;let W=$.trim(),N=Number(W);if(Number.isFinite(N))return N;let Q=W.match(P0);if(!Q)throw Error(`Invalid size format: ${$}`);let Z=Number(Q[1]),H=Q[2].toLowerCase(),J=1024;if(H.startsWith("m"))J=1048576;else if(H.startsWith("g"))J=1073741824;return Math.floor(Z*J)},c0=($)=>{let W=$.trim().match(q0);if(!W)throw Error(`Invalid interval format: ${$}`);let N=Number(W[1]),Q=W[2].toLowerCase(),Z=3600000;if(Q==="d")Z=86400000;else if(Q==="w")Z=604800000;return N*Z},V0=($)=>{if(typeof $==="number")return{type:"count",value:$};return{type:"time",value:c0($)}},I0=async($,W)=>{try{return(await W0.stat($)).size>W}catch{return!1}},N0=async($)=>{let W=x0($),N=f0($),Q;try{Q=await W0.readdir(W)}catch{return[]}return Q.filter((Z)=>Z.startsWith(`${N}.`)&&m0.test(Z)).map((Z)=>`${W}/${Z}`)};var p0=h0(v0),n=new Map,g0=($)=>{let W=n.get($)??Promise.resolve(),N,Q=new Promise((Z)=>{N=Z});return W.then(()=>{return n.set($,Q),()=>{if(N?.(),n.get($)===Q)n.delete($)}})},P=($)=>String($).padStart(2,"0"),d0=($,W)=>{let N=W.getFullYear(),Q=P(W.getMonth()+1),Z=P(W.getDate()),H=P(W.getHours()),J=P(W.getMinutes()),j=P(W.getSeconds()),X=String(W.getMilliseconds()).padStart(3,"0");return`${$}.${N}-${Q}-${Z}-${H}-${J}-${j}-${X}`},n0=async($)=>{try{if((await b.stat($)).size===0)return""}catch{return""}let N=`${d0($,new Date)}-${process.hrtime.bigint()}`;return await b.rename($,N),N},u0=async($)=>{let W=await g0($);try{try{await b.access($)}catch{return}let N=await b.readFile($),Q=await p0(N);await b.writeFile(`${$}.gz`,Q),await b.rm($,{force:!0})}catch(N){throw console.error(`[logixlysia] Failed to compress file ${$}:`,N),N}finally{W()}},M0=async($,W)=>{if(W.maxSize===void 0)return!1;let N=G0(W.maxSize);return await I0($,N)},i0=async($,W)=>{let N=await N0($);if(N.length<=W)return;let Z=(await Promise.allSettled(N.map(async(j)=>({path:j,stat:await b.stat(j)})))).filter((j)=>j.status==="fulfilled").map((j)=>j.value);if(Z.length<=W)return;Z.sort((j,X)=>X.stat.mtimeMs-j.stat.mtimeMs);let H=Z.slice(W);(await Promise.allSettled(H.map(({path:j})=>b.rm(j,{force:!0})))).forEach((j,X)=>{if(j.status==="rejected")console.error(`[logixlysia] Failed to delete rotated log ${H[X].path}:`,j.reason)})},o0=async($,W)=>{let N=await N0($);if(N.length===0)return;let Q=Date.now(),J=(await Promise.allSettled(N.map(async(X)=>({path:X,stat:await b.stat(X)})))).filter((X)=>X.status==="fulfilled").map((X)=>X.value).filter(({stat:X})=>Q-X.mtimeMs>W);(await Promise.allSettled(J.map(({path:X})=>b.rm(X,{force:!0})))).forEach((X,V)=>{if(X.status==="rejected")console.error(`[logixlysia] Failed to delete old log ${J[V].path}:`,X.reason)})},F0=async($,W)=>{let N=await n0($);if(!N)return;if(W.compress===!0){if((W.compression??"gzip")==="gzip")await u0(N)}if(W.maxFiles!==void 0){let Z=V0(W.maxFiles);if(Z.type==="count")await i0($,Z.value);else await o0($,Z.value)}};var u=new Map,a0=($)=>{let W=u.get($)??Promise.resolve(),N,Q=new Promise((Z)=>{N=Z});return W.then(()=>{return u.set($,Q),()=>{if(N?.(),u.get($)===Q)u.delete($)}})},i=async(...$)=>{let W=typeof $[0]==="string"?(()=>{let[F,_,R,A,E,L]=$;return{filePath:F,level:_,request:R,data:A,store:E,options:L}})():$[0],{filePath:N,level:Q,request:Z,data:H,store:J,options:j}=W,X=j.config,V=X?.useTransportsOnly===!0,z=X?.disableFileLogging===!0;if(V||z)return;let K=typeof H.message==="string"?H.message:"",B=J.beforeTime===BigInt(0)?0:Number(process.hrtime.bigint()-J.beforeTime)/1e6,M="/";try{let{pathname:F,search:_}=new URL(Z.url);M=X?.logQueryParams?`${F}${_}`:F}catch{M=Z.url}let U=`${Q} ${B.toFixed(2)}ms ${Z.method} ${M} ${K}
|
|
3
|
+
`,O=await a0(N);try{try{await B0(s0(N)),await l0(N,U,{encoding:"utf-8"})}catch(R){throw console.error(`[logixlysia] Failed to write to log file ${N}:`,R),R}let F=X?.logRotation;if(!F)return;if(await M0(N,F))try{await F0(N,F)}catch(R){console.error(`[logixlysia] Failed to rotate log file ${N}:`,R)}}finally{O()}};var r0=/[a-zA-Z0-9._%+-]{1,64}@[a-zA-Z0-9.-]{1,253}\.[a-zA-Z]{2,63}/g,t0=/\b(?:\d{1,3}\.){3}\d{1,3}\b/g,e0=/\b(?:\d[ -]*?){13,19}\b/g,$$=/eyJ[a-zA-Z0-9_-]+\.eyJ[a-zA-Z0-9_-]+\.[a-zA-Z0-9_-]+/g;var Q0=($)=>D($).replaceAll("[REDACTED]","redacted"),W$=($)=>{try{let W=new URL($);if(W.username!=="")W.username=Q0(W.username);if(W.password!=="")W.password=Q0(W.password);return W.hostname=Q0(W.hostname),W.pathname=D(W.pathname),W.search=D(W.search),W.hash=D(W.hash),W.toString()}catch{return D($).replaceAll("[REDACTED]","redacted")}},N$=($)=>{if($.length<13||$.length>19)return!1;let W=0,N=!1;for(let Q=$.length-1;Q>=0;Q--){let Z=$.charCodeAt(Q);if(Z<48||Z>57)return!1;let H=Z-48;if(N){if(H*=2,H>9)H-=9}W+=H,N=!N}return W%10===0},Q$=($)=>$.replace(e0,(W)=>{let N=W.replace(/\D/g,"");if(N.length>=13&&N.length<=19&&N$(N))return"[REDACTED]";return W}),D=($)=>{let W=$;return W=W.replace(r0,"[REDACTED]"),W=W.replace(t0,"[REDACTED]"),W=Q$(W),W=W.replace($$,"[REDACTED]"),W},Z$=($,W)=>{let N=D($.message),Q=Object.getPrototypeOf($),Z=Object.create(Q);if(Z.message=N,Z.name=$.name,$.stack!==void 0)Z.stack=D($.stack);let H=$;for(let J of Object.keys(H))if(J!=="message"&&J!=="name"&&J!=="stack")Z[J]=o(H[J],W);return Z},J$=($,W)=>{let N=Array.from({length:$.length});for(let Q=0;Q<$.length;Q++)N[Q]=o($[Q],W);return N},j$=($,W)=>{let N={};for(let Q of Object.keys($))N[Q]=o($[Q],W);return N},Z0=($,W,N)=>{W.add($);try{return N()}finally{W.delete($)}},o=($,W)=>{if($===null||$===void 0)return $;if(typeof $==="string")return D($);if(typeof $!=="object")return $;if($ instanceof Date)return new Date($.getTime());let Q=$;if(W.has(Q))return"[Circular]";if($ instanceof Error)return Z0(Q,W,()=>Z$($,W));if(Array.isArray($))return Z0(Q,W,()=>J$($,W));return Z0(Q,W,()=>j$($,W))},l=($)=>o($,new WeakSet),s=($)=>{let W=W$($.url),N=new Headers,Q=!1;for(let[X,V]of $.headers.entries()){let z=D(V);if(z!==V)Q=!0;N.set(X,z)}let Z=D($.method),H=W!==$.url,J=Z!==$.method;if(!(H||Q||J))return $;let j={method:Z,headers:N,redirect:$.redirect,signal:$.signal};return new Request(W,j)};import{STATUS_CODES as M$}from"node:http";import Y from"chalk";import{StatusMap as H$}from"elysia";var X$=/^\d+$/,z$=/[_-]+/g,K$=/([a-z0-9])([A-Z])/g,Y$=/([A-Z])([A-Z][a-z])/g,B$=/['’]/g,G$=/[^a-z0-9\s]+/g,V$=/\s+/g,U0=($)=>{let W=$.trim();if(!W)return"";return W.replace(z$," ").replace(K$,"$1 $2").replace(Y$,"$1 $2").replace(B$,"").toLowerCase().replace(G$," ").replace(V$," ").trim()},I$=(()=>{let $=new Map;for(let[W,N]of Object.entries(H$))$.set(U0(W),N);return $})(),O0=($)=>{if(typeof $==="number"&&Number.isFinite($))return $;if(typeof $==="string"){let W=$.trim();if(X$.test(W))return Number(W);return I$.get(U0(W))??500}return 500};var a=($)=>{let W="An error occurred";if($ instanceof Error)W=$.message;else if($&&typeof $==="object"&&"message"in $)W=$.message;else W=String($);return W};var q=($)=>String($).padStart(2,"0"),F$=($)=>String($).padStart(3,"0"),U$=500,O$=1000,R$=7,T$="{now} {service}{icon} {method} {pathname} {status} {duration} {message}{speed}",_$=/\{(now|epoch|level|icon|duration|method|pathname|path|query|status|statusText|message|ip|context|service|speed|requestId)\}/g,R0=($)=>{let N=$.config?.useColors??!0,Q=typeof process<"u"&&process.stdout?.isTTY===!0;return N&&Q},b$=($,W)=>{if(!W)return $.toISOString();let N=String($.getFullYear()),Q=q($.getMonth()+1),Z=q($.getDate()),H=q($.getHours()),J=q($.getMinutes()),j=q($.getSeconds()),X=F$($.getMilliseconds());return W.replaceAll("yyyy",N).replaceAll("mm",Q).replaceAll("dd",Z).replaceAll("HH",H).replaceAll("MM",J).replaceAll("ss",j).replaceAll("SSS",X)},D$=($)=>{let W=$.headers.get("x-forwarded-for");if(W)return W.split(",")[0]?.trim()??"";return $.headers.get("x-real-ip")??""},A$=($)=>{if($>=1000){let W=$/1000;if(W>=10)return`${Math.round(W)}s`;let N=W.toFixed(1);return N.endsWith(".0")?`${Math.round(W)}s`:`${N}s`}if($>0&&$<1)return`${$.toFixed(2)}ms`;return`${Math.round($)}ms`},E$=($)=>{let W=$.config;return{slow:W?.slowThreshold??U$,verySlow:W?.verySlowThreshold??O$}},S$=($,W,N)=>{let Q=A$($),{slow:Z,verySlow:H}=E$(N),J=$>=H;if(!W)return{text:Q,isVerySlow:J};let j=Q;if($<Z)j=Y.green(Q);else if($<H)j=Y.yellow(Q);else j=Y.red.bold(Q);return{text:j,isVerySlow:J}},w$=($,W)=>{if(!$)return"";let N="⚡ slow";if(!W)return` ${N}`;return` ${Y.yellow(N)}`},L$=($,W)=>{if(!W)return"\uD83E\uDD8A";if($==="ERROR")return Y.bgRed.black(" \uD83E\uDD8A ");if($==="WARNING")return Y.bgYellow.black(" \uD83E\uDD8A ");if($==="DEBUG")return Y.bgBlue.black(" \uD83E\uDD8A ");return Y.bgGreen.black(" \uD83E\uDD8A ")},k$=($,W)=>{if(!W)return $;if($==="ERROR")return Y.bgRed.black($);if($==="WARNING")return Y.bgYellow.black($);if($==="DEBUG")return Y.bgBlue.black($);return Y.bgGreen.black($)},y$=($,W)=>{if(!W)return $;let N=$.toUpperCase();if(N==="GET")return Y.green.bold(N);if(N==="POST")return Y.blue.bold(N);if(N==="PUT")return Y.yellow.bold(N);if(N==="PATCH")return Y.yellowBright.bold(N);if(N==="DELETE")return Y.red.bold(N);if(N==="OPTIONS")return Y.cyan.bold(N);if(N==="HEAD")return Y.greenBright.bold(N);if(N==="TRACE")return Y.magenta.bold(N);if(N==="CONNECT")return Y.cyanBright.bold(N);return Y.white.bold(N)},C$=($,W)=>{if(!W)return $;let N=Number.parseInt($,10);if(!Number.isFinite(N))return $;if(N>=500)return Y.red($);if(N>=400)return Y.yellow($);if(N>=300)return Y.cyan($);if(N>=200)return Y.green($);return Y.gray($)},f$=($,W)=>{if(!W)return $;return Y.gray($)},x$=($,W)=>{if(!W)return $;return Y.whiteBright($)},P$=($)=>{return M$[$]??""},q$=($,W)=>{let N=$.config?.service?.trim();if(!N)return"";let Q=`[${N}]`;if(!W)return`${Q} `;return`${Y.dim(Q)} `},m$=($)=>{if($===null)return"null";if($===void 0)return"undefined";if(typeof $==="string")return $;if(typeof $==="number"||typeof $==="boolean")return String($);if($ instanceof Error)return $.message;try{return JSON.stringify($)}catch{return String($)}},c$=($)=>$!==null&&typeof $==="object"&&!Array.isArray($)&&!($ instanceof Error)&&!($ instanceof Date),T0=($,W,N)=>{let Q=[];for(let[Z,H]of Object.entries($)){let J=W?`${W}.${Z}`:Z;if(c$(H)&&N>1)Q.push(...T0(H,J,N-1));else Q.push([J,m$(H)])}return Q},h$=($,W)=>{if($.length===0)return[];let N=[],Q=$.length-1;for(let Z=0;Z<$.length;Z++){let H=Z===Q?"└─":"├─",J=$[Z];if(!J)continue;let[j,X]=J,V=W?Y.cyan(j):j,z=W?Y.white(X):X;N.push(` ${H} ${V} ${z}`)}return N};var v$=($,W,N)=>{if(N.config?.showContextTree===!1)return[];let Q=R0(N),Z=N.config?.contextDepth??1,H=[],J=W.context;if(J&&typeof J==="object"&&!Array.isArray(J)&&Object.keys(J).length>0&&Z>=1)H.push(...T0(J,"",Z));if($==="ERROR"&&"error"in W&&W.error!==void 0){let j=a(W.error);if(j)H.push(["error",j])}return h$(H,Q)},p$=($)=>{if(typeof $==="object"&&$!==null)return JSON.stringify($);return""},r=({level:$,request:W,data:N,store:Q,options:Z})=>{let H=Z.config,J=R0(Z),j=H?.customLogFormat??T$,X=new Date,V=String(X.getTime()),z=b$(X,H?.timestamp?.translateTime),K=f$(z,J),B=typeof N.message==="string"?N.message:"",M=Q.beforeTime===BigInt(0)?0:Number(process.hrtime.bigint()-Q.beforeTime)/1e6,U,O;try{let x=new URL(W.url);U=x.pathname,O=x.search}catch{U=W.url||"/",O=""}let F=O,_=H?.logQueryParams?`${U}${F}`:U,R=N.status,A=R===null||R===void 0?200:O0(R),E=String(A),L=H?.ip===!0?D$(W):"",m=H?.showContextTree!==!1&&N.context&&typeof N.context==="object"&&!Array.isArray(N.context)&&Object.keys(N.context).length>0?"":p$(N.context),k=k$($,J),G=W.method.toUpperCase().padEnd(R$),I=y$(G,J),T=x$(_,J),S=C$(E,J),{text:y,isVerySlow:C}=S$(M,J,Z),f=w$(C,J),c=L$($,J),h=P$(A),w=q$(Z,J),v={"{now}":K,"{epoch}":V,"{level}":k,"{icon}":c,"{duration}":y,"{method}":I,"{pathname}":T,"{path}":T,"{query}":F,"{status}":S,"{statusText}":h,"{message}":B,"{ip}":L,"{context}":m,"{service}":w,"{speed}":f,"{requestId}":typeof N.context==="object"&&N.context!==null&&"requestId"in N.context?String(N.context.requestId):""},A0=j.replace(_$,(x)=>v[x]??x),E0=v$($,N,Z);return{main:A0,contextLines:E0}};var g$=($)=>typeof $==="object"&&$!==null&&("status"in $)&&typeof $.status==="number",_0=($,W,N,Q,Z)=>{let H=Q.config,J=H?.logFilter;if(J?.level&&J.level.length>0&&!J.level.includes("ERROR"))return;let j=H?.useTransportsOnly===!0,X=H?.disableInternalLogger===!0,V=H?.disableFileLogging===!0,z=g$(W)?W.status:500,K=a(W),B="ERROR",M={status:z,message:K,error:W},U=Z?g(M,Z.getContext($)):M,O=H?.autoRedact===!0?l(U):U,F=H?.autoRedact===!0?s($):$;if(d({level:B,request:F,data:O,store:N,options:Q}),!(j||V)){let E=H?.logFilePath;if(E)i({filePath:E,level:B,request:F,data:O,store:N,options:Q}).catch(()=>{})}if(j||X)return;let{main:_,contextLines:R}=r({level:B,request:F,data:O,store:N,options:Q}),A=R.length>0?`${_}
|
|
4
|
+
${R.join(`
|
|
5
|
+
`)}`:_;console.error(A)};var D0=($={},W=b0,N)=>{let Q=N??p(),Z=$.config,H=Z?.pino,{prettyPrint:J,...j}=H??{},X=typeof J==="object"&&J!==null?J:void 0,z=(J===!0||X!==void 0)&&j.transport===void 0,K=X?.messageKey??j.messageKey,B=X?.errorKey??j.errorKey,M=z?{target:"pino-pretty",options:{colorize:process.stdout?.isTTY===!0,translateTime:Z?.timestamp?.translateTime,...X,messageKey:K,errorKey:B}}:j.transport,U=W({...j,level:j.level??"info",messageKey:K,errorKey:B,transport:M}),O=(G,I)=>{if(!I?.level||I.level.length===0)return!0;return I.level.includes(G)},F=Z?.useTransportsOnly===!0,_=Z?.disableInternalLogger===!0,R=Z?.disableFileLogging===!0,A=(Z?.transports?.length??0)>0,E=!(F||R)&&!!Z?.logFilePath,L=!(F||_),t=!(A||E||L),m=(G,I,T,S)=>{if(t||!O(G,Z?.logFilter))return;let y=g(T,Q.getContext(I)),C=Z?.autoRedact===!0?l(y):y,f=Z?.autoRedact===!0?s(I):I;if(A)d({level:G,request:f,data:C,store:S,options:$});if(E){let v=Z?.logFilePath;if(v)i({filePath:v,level:G,request:f,data:C,store:S,options:$}).catch(()=>{})}if(!L)return;let{main:c,contextLines:h}=r({level:G,request:f,data:C,store:S,options:$}),w=h.length>0?`${c}
|
|
6
6
|
${h.join(`
|
|
7
|
-
`)}`:c;switch(
|
|
7
|
+
`)}`:c;switch(G){case"DEBUG":{console.debug(w);break}case"INFO":{console.info(w);break}case"WARNING":{console.warn(w);break}case"ERROR":{console.error(w);break}default:{console.log(w);break}}},k=(G,I,T,S)=>{if(t||!O(G,Z?.logFilter))return;let y={beforeTime:process.hrtime.bigint()};m(G,I,{message:T,context:S},y)};return{pino:U,mergeContext:(G,I)=>{Q.mergeContext(G,I)},getContext:(G)=>Q.getContext(G),log:m,handleHttpError:(G,I,T)=>{_0(G,I,T,$,Q)},debug:(G,I,T)=>{k("DEBUG",G,I,T)},info:(G,I,T)=>{k("INFO",G,I,T)},warn:(G,I,T)=>{k("WARNING",G,I,T)},error:(G,I,T)=>{k("ERROR",G,I,T)}}},J0=($,W)=>D0($,b0,W);var j0=($)=>{if($===void 0||$===!1)return null;if($===!0)return{enabled:!0,header:"X-Request-Id",generator:()=>crypto.randomUUID()};if($.enabled===!1)return null;return{enabled:!0,header:$.header?.trim()||"X-Request-Id",generator:$.generator??(()=>crypto.randomUUID())}},H0=($,W)=>{let N=$.headers.get(W.header);if(N)return N;return W.generator()};var d$=($)=>new Request(`http://logixlysia.local${$}`,{method:"WS"}),X0=($,W,N)=>{let Q=new WeakMap,Z=(H,J,j,X,V)=>{let z=J,B={beforeTime:Q.get(z)??process.hrtime.bigint()},M=N.getContext(z),U=Object.keys(M).length>0||V?{...M,...V,wsId:J.id}:{wsId:J.id};W.log(H,d$(j),{message:X,context:U,status:200},B)};return(H,J)=>({...J,open(j){if(Q.set(j,process.hrtime.bigint()),J.open?.(j),$.config?.disableWebSocketLogging!==!0)Z("INFO",j,H,"WebSocket opened")},message(j,X){if(J.message?.(j,X),$.config?.disableWebSocketLogging!==!0)Z("INFO",j,H,"WebSocket message",{payloadType:typeof X})},close(j){if(J.close?.(j),$.config?.disableWebSocketLogging!==!0)Z("INFO",j,H,"WebSocket closed");N.clearContext(j),Q.delete(j)}})};var u$=($={})=>{let W=e($),N=new WeakSet,Q=p(),Z=J0(W,Q),H=X0(W,Z,Q),J=j0(W.config?.requestId),j={...Z,debug:(z,K,B)=>{N.add(z),Z.debug(z,K,B)},info:(z,K,B)=>{N.add(z),Z.info(z,K,B)},warn:(z,K,B)=>{N.add(z),Z.warn(z,K,B)},error:(z,K,B)=>{N.add(z),Z.error(z,K,B)}},V=new n$({name:"Logixlysia",detail:{description:"Logixlysia is a plugin for Elysia that provides a logger and pino logger.",tags:["logging","pino"]}}).state("logger",j).state("pino",j.pino).state("beforeTime",BigInt(0)).onStart(({server:z})=>{if(z)$0(z,W);else{let K=Number(process.env.PORT)||3000,B=process.env.HOST||"localhost";$0({port:K,hostname:B,protocol:"http"},W)}}).onRequest(({request:z,store:K})=>{if(K.beforeTime=process.hrtime.bigint(),J){let B=H0(z,J);Q.mergeContext(z,{requestId:B})}}).onAfterHandle(({request:z,set:K,store:B})=>{try{if(J){let R=Q.getContext(z).requestId;if(R)K.headers[J.header]=R}if(N.has(z))return;let M=typeof K.status==="number"?K.status:200,U="INFO";if(M>=500)U="ERROR";else if(M>=400)U="WARNING";let O=Q.getContext(z),F={status:M};if(Object.keys(O).length>0)F.context={...O};j.log(U,z,F,B)}finally{Q.clearContext(z)}}).onError(({request:z,error:K,set:B,store:M})=>{try{if(J){let O=Q.getContext(z).requestId;if(O)B.headers[J.header]=O}j.handleHttpError(z,K,M)}finally{Q.clearContext(z)}}).as("scoped");return Object.assign(V,{wrapWs:H})},t2=u$;export{j0 as resolveRequestIdConfig,e as resolveOptions,u$ as logixlysia,H0 as getOrCreateRequestId,t2 as default,X0 as createWsHandlerWrapper,J0 as createPluginLogger,D0 as createLogger};
|
|
8
8
|
|
|
9
|
-
//# debugId=
|
|
10
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2luZGV4LnRzIiwgInNyYy9jb25maWcvcmVzb2x2ZS1vcHRpb25zLnRzIiwgInNyYy9jb250ZXh0L3JlcXVlc3QtY29udGV4dC50cyIsICJzcmMvZXh0ZW5zaW9ucy9iYW5uZXIudHMiLCAic3JjL2V4dGVuc2lvbnMvaW5kZXgudHMiLCAic3JjL2xvZ2dlci9pbmRleC50cyIsICJzcmMvb3V0cHV0L2luZGV4LnRzIiwgInNyYy9vdXRwdXQvZmlsZS50cyIsICJzcmMvb3V0cHV0L2ZzLnRzIiwgInNyYy9vdXRwdXQvcm90YXRpb24tbWFuYWdlci50cyIsICJzcmMvdXRpbHMvcm90YXRpb24udHMiLCAic3JjL3V0aWxzL3JlZGFjdC50cyIsICJzcmMvbG9nZ2VyL2NyZWF0ZS1sb2dnZXIudHMiLCAic3JjL2hlbHBlcnMvc3RhdHVzLnRzIiwgInNyYy91dGlscy9lcnJvci50cyIsICJzcmMvbG9nZ2VyL2hhbmRsZS1odHRwLWVycm9yLnRzIiwgInNyYy93ZWJzb2NrZXQvd3JhcC13cy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICJpbXBvcnQgeyBFbHlzaWEgfSBmcm9tICdlbHlzaWEnXG5pbXBvcnQgeyByZXNvbHZlT3B0aW9ucyB9IGZyb20gJy4vY29uZmlnL3Jlc29sdmUtb3B0aW9ucydcbmltcG9ydCB7IGNyZWF0ZVJlcXVlc3RDb250ZXh0U3RvcmUgfSBmcm9tICcuL2NvbnRleHQvcmVxdWVzdC1jb250ZXh0J1xuaW1wb3J0IHsgc3RhcnRTZXJ2ZXIgfSBmcm9tICcuL2V4dGVuc2lvbnMnXG5pbXBvcnQgdHlwZSB7IExvZ2l4bHlzaWFTdG9yZSwgT3B0aW9ucyB9IGZyb20gJy4vaW50ZXJmYWNlcydcbmltcG9ydCB7IGNyZWF0ZVBsdWdpbkxvZ2dlciB9IGZyb20gJy4vbG9nZ2VyJ1xuaW1wb3J0IHsgY3JlYXRlV3NIYW5kbGVyV3JhcHBlciB9IGZyb20gJy4vd2Vic29ja2V0L3dyYXAtd3MnXG5cbi8qKlxuICogRW1wdHkgc2luZ2xldG9uIHNsb3RzIG11c3Qgbm90IHVzZSBgUmVjb3JkPHN0cmluZywgbmV2ZXI+YDogaW50ZXJzZWN0aW5nIHRoYXQgd2l0aCBFbHlzaWEncyBgQ29udGV4dGBcbiAqIG1ha2VzIGV2ZXJ5IGtleSAoaW5jbHVkaW5nIGBzdG9yZWApIGJlY29tZSBgbmV2ZXJgIGJlY2F1c2UgZWFjaCBrZXkgaXMgbWVyZ2VkIHdpdGggYG5ldmVyYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbXB0eUVseXNpYVNsb3Qge1xuICByZWFkb25seSBfX2xvZ2l4bHlzaWFFbXB0eT86IG5ldmVyXG59XG5cbi8qKlxuICogRXhwbGljaXQgc2luZ2xldG9uIHdpdGhvdXQgRWx5c2lhJ3MgYFNpbmdsZXRvbkJhc2VgIGBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPmAgb24gZGVjb3JhdG9yL2Rlcml2ZS9yZXNvbHZlIHNvXG4gKiBtZXJnZWQgYENvbnRleHRgIGFuZCBXZWJTb2NrZXQgYHdzLmRhdGFgIGtlZXAgcHJlY2lzZSBrZXlzIGFmdGVyIGAudXNlKGxvZ2l4bHlzaWEoKSlgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvZ2l4bHlzaWFTaW5nbGV0b24ge1xuICBkZWNvcmF0b3I6IEVtcHR5RWx5c2lhU2xvdFxuICBkZXJpdmU6IEVtcHR5RWx5c2lhU2xvdFxuICByZXNvbHZlOiBFbXB0eUVseXNpYVNsb3RcbiAgc3RvcmU6IExvZ2l4bHlzaWFTdG9yZVxufVxuXG4vLyBFbHlzaWEncyBgU2luZ2xldG9uQmFzZS5zdG9yZWAgaXMgYFJlY29yZDxzdHJpbmcsIHVua25vd24+YDsgYExvZ2l4bHlzaWFTdG9yZWAgaXMgaW50ZW50aW9uYWxseSBjbG9zZWQgKHNlZSAjMjIwKS5cbi8vIEB0cy1leHBlY3QtZXJyb3Ig4oCUIGNsb3NlZCBzdG9yZSBpcyBjb3JyZWN0IGF0IHJ1bnRpbWUgYW5kIGZvciBtZXJnZWQgYHdzLmRhdGFgIGluZmVyZW5jZS5cbmV4cG9ydCB0eXBlIExvZ2l4bHlzaWEgPSBFbHlzaWE8JycsIExvZ2l4bHlzaWFTaW5nbGV0b24+XG5cbmV4cG9ydCB0eXBlIExvZ2l4bHlzaWFQbHVnaW4gPSBMb2dpeGx5c2lhICYge1xuICB3cmFwV3M6IFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZVdzSGFuZGxlcldyYXBwZXI+XG59XG5cbmV4cG9ydCBjb25zdCBsb2dpeGx5c2lhID0gKHJhd09wdGlvbnM6IE9wdGlvbnMgPSB7fSk6IExvZ2l4bHlzaWFQbHVnaW4gPT4ge1xuICBjb25zdCBvcHRpb25zID0gcmVzb2x2ZU9wdGlvbnMocmF3T3B0aW9ucylcbiAgY29uc3QgZGlkQ3VzdG9tTG9nID0gbmV3IFdlYWtTZXQ8UmVxdWVzdD4oKVxuICBjb25zdCBjb250ZXh0U3RvcmUgPSBjcmVhdGVSZXF1ZXN0Q29udGV4dFN0b3JlKClcbiAgY29uc3QgYmFzZUxvZ2dlciA9IGNyZWF0ZVBsdWdpbkxvZ2dlcihvcHRpb25zLCBjb250ZXh0U3RvcmUpXG4gIGNvbnN0IHdyYXBXcyA9IGNyZWF0ZVdzSGFuZGxlcldyYXBwZXIob3B0aW9ucywgYmFzZUxvZ2dlciwgY29udGV4dFN0b3JlKVxuICBjb25zdCBsb2dnZXIgPSB7XG4gICAgLi4uYmFzZUxvZ2dlcixcbiAgICBkZWJ1ZzogKFxuICAgICAgcmVxdWVzdDogUmVxdWVzdCxcbiAgICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICAgIGNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICkgPT4ge1xuICAgICAgZGlkQ3VzdG9tTG9nLmFkZChyZXF1ZXN0KVxuICAgICAgYmFzZUxvZ2dlci5kZWJ1ZyhyZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KVxuICAgIH0sXG4gICAgaW5mbzogKFxuICAgICAgcmVxdWVzdDogUmVxdWVzdCxcbiAgICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICAgIGNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICkgPT4ge1xuICAgICAgZGlkQ3VzdG9tTG9nLmFkZChyZXF1ZXN0KVxuICAgICAgYmFzZUxvZ2dlci5pbmZvKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpXG4gICAgfSxcbiAgICB3YXJuOiAoXG4gICAgICByZXF1ZXN0OiBSZXF1ZXN0LFxuICAgICAgbWVzc2FnZTogc3RyaW5nLFxuICAgICAgY29udGV4dD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgKSA9PiB7XG4gICAgICBkaWRDdXN0b21Mb2cuYWRkKHJlcXVlc3QpXG4gICAgICBiYXNlTG9nZ2VyLndhcm4ocmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dClcbiAgICB9LFxuICAgIGVycm9yOiAoXG4gICAgICByZXF1ZXN0OiBSZXF1ZXN0LFxuICAgICAgbWVzc2FnZTogc3RyaW5nLFxuICAgICAgY29udGV4dD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgKSA9PiB7XG4gICAgICBkaWRDdXN0b21Mb2cuYWRkKHJlcXVlc3QpXG4gICAgICBiYXNlTG9nZ2VyLmVycm9yKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgYXBwID0gbmV3IEVseXNpYSh7XG4gICAgbmFtZTogJ0xvZ2l4bHlzaWEnLFxuICAgIGRldGFpbDoge1xuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICdMb2dpeGx5c2lhIGlzIGEgcGx1Z2luIGZvciBFbHlzaWEgdGhhdCBwcm92aWRlcyBhIGxvZ2dlciBhbmQgcGlubyBsb2dnZXIuJyxcbiAgICAgIHRhZ3M6IFsnbG9nZ2luZycsICdwaW5vJ11cbiAgICB9XG4gIH0pXG5cbiAgY29uc3QgcGx1Z2luID0gYXBwXG4gICAgLnN0YXRlKCdsb2dnZXInLCBsb2dnZXIpXG4gICAgLnN0YXRlKCdwaW5vJywgbG9nZ2VyLnBpbm8pXG4gICAgLnN0YXRlKCdiZWZvcmVUaW1lJywgQmlnSW50KDApKVxuICAgIC5vblN0YXJ0KCh7IHNlcnZlciB9KTogdm9pZCA9PiB7XG4gICAgICBpZiAoc2VydmVyKSB7XG4gICAgICAgIHN0YXJ0U2VydmVyKHNlcnZlciwgb3B0aW9ucylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHBvcnQgPSBOdW1iZXIocHJvY2Vzcy5lbnYuUE9SVCkgfHwgMzAwMFxuICAgICAgICBjb25zdCBob3N0bmFtZSA9IHByb2Nlc3MuZW52LkhPU1QgfHwgJ2xvY2FsaG9zdCdcbiAgICAgICAgc3RhcnRTZXJ2ZXIoeyBwb3J0LCBob3N0bmFtZSwgcHJvdG9jb2w6ICdodHRwJyB9LCBvcHRpb25zKVxuICAgICAgfVxuICAgIH0pXG4gICAgLm9uUmVxdWVzdCgoeyBzdG9yZSB9KSA9PiB7XG4gICAgICBzdG9yZS5iZWZvcmVUaW1lID0gcHJvY2Vzcy5ocnRpbWUuYmlnaW50KClcbiAgICB9KVxuICAgIC5vbkFmdGVySGFuZGxlKCh7IHJlcXVlc3QsIHNldCwgc3RvcmUgfSkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGRpZEN1c3RvbUxvZy5oYXMocmVxdWVzdCkpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHR5cGVvZiBzZXQuc3RhdHVzID09PSAnbnVtYmVyJyA/IHNldC5zdGF0dXMgOiAyMDBcbiAgICAgICAgbGV0IGxldmVsOiAnSU5GTycgfCAnV0FSTklORycgfCAnRVJST1InID0gJ0lORk8nXG4gICAgICAgIGlmIChzdGF0dXMgPj0gNTAwKSB7XG4gICAgICAgICAgbGV2ZWwgPSAnRVJST1InXG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID49IDQwMCkge1xuICAgICAgICAgIGxldmVsID0gJ1dBUk5JTkcnXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhY2N1bXVsYXRlZCA9IGNvbnRleHRTdG9yZS5nZXRDb250ZXh0KHJlcXVlc3QpXG4gICAgICAgIGNvbnN0IGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0geyBzdGF0dXMgfVxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoYWNjdW11bGF0ZWQpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBkYXRhLmNvbnRleHQgPSB7IC4uLmFjY3VtdWxhdGVkIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxvZ2dlci5sb2cobGV2ZWwsIHJlcXVlc3QsIGRhdGEsIHN0b3JlKVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgY29udGV4dFN0b3JlLmNsZWFyQ29udGV4dChyZXF1ZXN0KVxuICAgICAgfVxuICAgIH0pXG4gICAgLm9uRXJyb3IoKHsgcmVxdWVzdCwgZXJyb3IsIHN0b3JlIH0pID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGxvZ2dlci5oYW5kbGVIdHRwRXJyb3IocmVxdWVzdCwgZXJyb3IsIHN0b3JlKVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgY29udGV4dFN0b3JlLmNsZWFyQ29udGV4dChyZXF1ZXN0KVxuICAgICAgfVxuICAgIH0pXG4gICAgLmFzKCdzY29wZWQnKSBhcyBMb2dpeGx5c2lhXG5cbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24ocGx1Z2luLCB7IHdyYXBXcyB9KSBhcyBMb2dpeGx5c2lhUGx1Z2luXG59XG5cbi8vIGJpb21lLWlnbm9yZSBsaW50L3BlcmZvcm1hbmNlL25vQmFycmVsRmlsZTogcHVibGljIHBhY2thZ2UgZW50cnkgcmUtZXhwb3J0c1xuZXhwb3J0IHsgcmVzb2x2ZU9wdGlvbnMgfSBmcm9tICcuL2NvbmZpZy9yZXNvbHZlLW9wdGlvbnMnXG5leHBvcnQgdHlwZSB7XG4gIExvZ2dlcixcbiAgTG9naXhseXNpYUNvbnRleHQsXG4gIExvZ2l4bHlzaWFTdG9yZSxcbiAgTG9nTGV2ZWwsXG4gIExvZ1ByZXNldCxcbiAgT3B0aW9ucyxcbiAgUGlubyxcbiAgU3RvcmVEYXRhLFxuICBUcmFuc3BvcnRcbn0gZnJvbSAnLi9pbnRlcmZhY2VzJ1xuZXhwb3J0IHsgY3JlYXRlTG9nZ2VyLCBjcmVhdGVQbHVnaW5Mb2dnZXIgfSBmcm9tICcuL2xvZ2dlcidcbmV4cG9ydCB0eXBlIHsgV3NIYW5kbGVySG9va3MgfSBmcm9tICcuL3dlYnNvY2tldC93cmFwLXdzJ1xuZXhwb3J0IHsgY3JlYXRlV3NIYW5kbGVyV3JhcHBlciB9IGZyb20gJy4vd2Vic29ja2V0L3dyYXAtd3MnXG5cbmV4cG9ydCBkZWZhdWx0IGxvZ2l4bHlzaWFcbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBPcHRpb25zIH0gZnJvbSAnLi4vaW50ZXJmYWNlcydcblxuZXhwb3J0IHR5cGUgTG9nUHJlc2V0ID0gJ2RldicgfCAncHJvZCcgfCAnanNvbidcblxuY29uc3QgUFJFU0VUX0RFRkFVTFRTOiBSZWNvcmQ8TG9nUHJlc2V0LCBOb25OdWxsYWJsZTxPcHRpb25zWydjb25maWcnXT4+ID0ge1xuICBkZXY6IHtcbiAgICBzaG93U3RhcnR1cE1lc3NhZ2U6IHRydWUsXG4gICAgc3RhcnR1cE1lc3NhZ2VGb3JtYXQ6ICdiYW5uZXInLFxuICAgIHVzZUNvbG9yczogdHJ1ZSxcbiAgICBzaG93Q29udGV4dFRyZWU6IHRydWUsXG4gICAgcGlubzoge1xuICAgICAgcHJldHR5UHJpbnQ6IHRydWVcbiAgICB9XG4gIH0sXG4gIHByb2Q6IHtcbiAgICBzaG93U3RhcnR1cE1lc3NhZ2U6IGZhbHNlLFxuICAgIHVzZUNvbG9yczogZmFsc2UsXG4gICAgc2hvd0NvbnRleHRUcmVlOiBmYWxzZSxcbiAgICBhdXRvUmVkYWN0OiB0cnVlLFxuICAgIHBpbm86IHtcbiAgICAgIHByZXR0eVByaW50OiBmYWxzZVxuICAgIH1cbiAgfSxcbiAganNvbjoge1xuICAgIHNob3dTdGFydHVwTWVzc2FnZTogZmFsc2UsXG4gICAgdXNlQ29sb3JzOiBmYWxzZSxcbiAgICBzaG93Q29udGV4dFRyZWU6IGZhbHNlLFxuICAgIHBpbm86IHtcbiAgICAgIHByZXR0eVByaW50OiBmYWxzZVxuICAgIH1cbiAgfVxufVxuXG5jb25zdCBtZXJnZUNvbmZpZyA9IChcbiAgYmFzZTogTm9uTnVsbGFibGU8T3B0aW9uc1snY29uZmlnJ10+LFxuICBvdmVycmlkZT86IE9wdGlvbnNbJ2NvbmZpZyddXG4pOiBOb25OdWxsYWJsZTxPcHRpb25zWydjb25maWcnXT4gPT4ge1xuICBpZiAoIW92ZXJyaWRlKSB7XG4gICAgcmV0dXJuIGJhc2VcbiAgfVxuXG4gIGNvbnN0IG1lcmdlZDogTm9uTnVsbGFibGU8T3B0aW9uc1snY29uZmlnJ10+ID0geyAuLi5iYXNlLCAuLi5vdmVycmlkZSB9XG5cbiAgaWYgKGJhc2UucGlubyB8fCBvdmVycmlkZS5waW5vKSB7XG4gICAgbWVyZ2VkLnBpbm8gPSB7XG4gICAgICAuLi5iYXNlLnBpbm8sXG4gICAgICAuLi5vdmVycmlkZS5waW5vLFxuICAgICAgLi4uKGJhc2UucGlubz8ucHJldHR5UHJpbnQgIT09IHVuZGVmaW5lZCB8fFxuICAgICAgb3ZlcnJpZGUucGlubz8ucHJldHR5UHJpbnQgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IHtcbiAgICAgICAgICAgIHByZXR0eVByaW50OiBvdmVycmlkZS5waW5vPy5wcmV0dHlQcmludCA/PyBiYXNlLnBpbm8/LnByZXR0eVByaW50XG4gICAgICAgICAgfVxuICAgICAgICA6IHt9KVxuICAgIH1cbiAgfVxuXG4gIGlmIChiYXNlLmxvZ0ZpbHRlciB8fCBvdmVycmlkZS5sb2dGaWx0ZXIpIHtcbiAgICBtZXJnZWQubG9nRmlsdGVyID0ge1xuICAgICAgLi4uYmFzZS5sb2dGaWx0ZXIsXG4gICAgICAuLi5vdmVycmlkZS5sb2dGaWx0ZXJcbiAgICB9XG4gIH1cblxuICBpZiAoYmFzZS5sb2dSb3RhdGlvbiB8fCBvdmVycmlkZS5sb2dSb3RhdGlvbikge1xuICAgIG1lcmdlZC5sb2dSb3RhdGlvbiA9IHtcbiAgICAgIC4uLmJhc2UubG9nUm90YXRpb24sXG4gICAgICAuLi5vdmVycmlkZS5sb2dSb3RhdGlvblxuICAgIH1cbiAgfVxuXG4gIGlmIChiYXNlLnRpbWVzdGFtcCB8fCBvdmVycmlkZS50aW1lc3RhbXApIHtcbiAgICBtZXJnZWQudGltZXN0YW1wID0ge1xuICAgICAgLi4uYmFzZS50aW1lc3RhbXAsXG4gICAgICAuLi5vdmVycmlkZS50aW1lc3RhbXBcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbWVyZ2VkXG59XG5cbi8qKiBBcHBsaWVzIHByZXNldCBkZWZhdWx0czsgZXhwbGljaXQgYGNvbmZpZ2Aga2V5cyBvdmVycmlkZSBwcmVzZXQgdmFsdWVzLiAqL1xuZXhwb3J0IGNvbnN0IHJlc29sdmVPcHRpb25zID0gKG9wdGlvbnM6IE9wdGlvbnMgPSB7fSk6IE9wdGlvbnMgPT4ge1xuICBjb25zdCBwcmVzZXQgPSBvcHRpb25zLnByZXNldFxuICBpZiAoIXByZXNldCkge1xuICAgIHJldHVybiBvcHRpb25zXG4gIH1cblxuICBjb25zdCBwcmVzZXRDb25maWcgPSBQUkVTRVRfREVGQVVMVFNbcHJlc2V0XVxuICByZXR1cm4ge1xuICAgIC4uLm9wdGlvbnMsXG4gICAgY29uZmlnOiBtZXJnZUNvbmZpZyhwcmVzZXRDb25maWcsIG9wdGlvbnMuY29uZmlnKVxuICB9XG59XG4iLAogICAgIi8qKiBIVFRQIGBSZXF1ZXN0YCBvciBXZWJTb2NrZXQgaW5zdGFuY2UgZm9yIGFjY3VtdWxhdGVkIGNvbnRleHQuICovXG5leHBvcnQgdHlwZSBDb250ZXh0S2V5ID0gUmVxdWVzdCB8IG9iamVjdFxuXG5leHBvcnQgaW50ZXJmYWNlIFJlcXVlc3RDb250ZXh0U3RvcmUge1xuICBjbGVhckNvbnRleHQ6IChrZXk6IENvbnRleHRLZXkpID0+IHZvaWRcbiAgZ2V0Q29udGV4dDogKGtleTogQ29udGV4dEtleSkgPT4gUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+XG4gIG1lcmdlQ29udGV4dDogKGtleTogQ29udGV4dEtleSwgcGFydGlhbDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHZvaWRcbn1cblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVJlcXVlc3RDb250ZXh0U3RvcmUgPSAoKTogUmVxdWVzdENvbnRleHRTdG9yZSA9PiB7XG4gIGNvbnN0IGJhZ3MgPSBuZXcgV2Vha01hcDxDb250ZXh0S2V5LCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oKVxuXG4gIGNvbnN0IGdldE9yQ3JlYXRlID0gKGtleTogQ29udGV4dEtleSk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+IHtcbiAgICBsZXQgYmFnID0gYmFncy5nZXQoa2V5KVxuICAgIGlmICghYmFnKSB7XG4gICAgICBiYWcgPSB7fVxuICAgICAgYmFncy5zZXQoa2V5LCBiYWcpXG4gICAgfVxuICAgIHJldHVybiBiYWdcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbWVyZ2VDb250ZXh0KGtleSwgcGFydGlhbCkge1xuICAgICAgaWYgKE9iamVjdC5rZXlzKHBhcnRpYWwpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGNvbnN0IGJhZyA9IGdldE9yQ3JlYXRlKGtleSlcbiAgICAgIE9iamVjdC5hc3NpZ24oYmFnLCBwYXJ0aWFsKVxuICAgIH0sXG4gICAgZ2V0Q29udGV4dChrZXkpIHtcbiAgICAgIGNvbnN0IGJhZyA9IGJhZ3MuZ2V0KGtleSlcbiAgICAgIHJldHVybiBiYWcgPyB7IC4uLmJhZyB9IDoge31cbiAgICB9LFxuICAgIGNsZWFyQ29udGV4dChrZXkpIHtcbiAgICAgIGJhZ3MuZGVsZXRlKGtleSlcbiAgICB9XG4gIH1cbn1cblxuLyoqIEFjY3VtdWxhdGVkIHJlcXVlc3QgY29udGV4dCBmaXJzdDsgZXhwbGljaXQgYGRhdGEuY29udGV4dGAgd2lucyBvbiBrZXkgY29sbGlzaW9uLiAqL1xuZXhwb3J0IGNvbnN0IG1lcmdlTG9nRGF0YUNvbnRleHQgPSAoXG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBhY2N1bXVsYXRlZDogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+XG4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PiB7XG4gIGNvbnN0IGV4cGxpY2l0ID0gZGF0YS5jb250ZXh0XG4gIGNvbnN0IGhhc0FjY3VtdWxhdGVkID0gT2JqZWN0LmtleXMoYWNjdW11bGF0ZWQpLmxlbmd0aCA+IDBcbiAgY29uc3QgaGFzRXhwbGljaXQgPVxuICAgIGV4cGxpY2l0ICE9PSB1bmRlZmluZWQgJiZcbiAgICBleHBsaWNpdCAhPT0gbnVsbCAmJlxuICAgIHR5cGVvZiBleHBsaWNpdCA9PT0gJ29iamVjdCcgJiZcbiAgICAhQXJyYXkuaXNBcnJheShleHBsaWNpdCkgJiZcbiAgICBPYmplY3Qua2V5cyhleHBsaWNpdCBhcyBvYmplY3QpLmxlbmd0aCA+IDBcblxuICBpZiAoIShoYXNBY2N1bXVsYXRlZCB8fCBoYXNFeHBsaWNpdCkpIHtcbiAgICByZXR1cm4gZGF0YVxuICB9XG5cbiAgY29uc3QgbWVyZ2VkQ29udGV4dCA9IHtcbiAgICAuLi5hY2N1bXVsYXRlZCxcbiAgICAuLi4oaGFzRXhwbGljaXQgPyAoZXhwbGljaXQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIDoge30pXG4gIH1cblxuICByZXR1cm4geyAuLi5kYXRhLCBjb250ZXh0OiBtZXJnZWRDb250ZXh0IH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gJ25vZGU6bW9kdWxlJ1xuXG5jb25zdCBlbHlzaWFQa2c6IHsgdmVyc2lvbj86IHN0cmluZyB9ID0gKCgpID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXF1aXJlID0gY3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpXG4gICAgcmV0dXJuIHJlcXVpcmUoJ2VseXNpYS9wYWNrYWdlLmpzb24nKSBhcyB7IHZlcnNpb24/OiBzdHJpbmcgfVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4ge31cbiAgfVxufSkoKVxuXG5jb25zdCBsb2dpeGx5c2lhUGtnOiB7IHZlcnNpb24/OiBzdHJpbmcgfSA9ICgoKSA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVxdWlyZSA9IGNyZWF0ZVJlcXVpcmUoaW1wb3J0Lm1ldGEudXJsKVxuICAgIHJldHVybiByZXF1aXJlKCcuLi8uLi9wYWNrYWdlLmpzb24nKSBhcyB7IHZlcnNpb24/OiBzdHJpbmcgfVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4ge31cbiAgfVxufSkoKVxuXG5jb25zdCBjZW50ZXJUZXh0ID0gKHRleHQ6IHN0cmluZywgd2lkdGg6IG51bWJlcik6IHN0cmluZyA9PiB7XG4gIGlmICh0ZXh0Lmxlbmd0aCA+PSB3aWR0aCkge1xuICAgIHJldHVybiB0ZXh0LnNsaWNlKDAsIHdpZHRoKVxuICB9XG5cbiAgY29uc3QgbGVmdCA9IE1hdGguZmxvb3IoKHdpZHRoIC0gdGV4dC5sZW5ndGgpIC8gMilcbiAgY29uc3QgcmlnaHQgPSB3aWR0aCAtIHRleHQubGVuZ3RoIC0gbGVmdFxuICByZXR1cm4gYCR7JyAnLnJlcGVhdChsZWZ0KX0ke3RleHR9JHsnICcucmVwZWF0KHJpZ2h0KX1gXG59XG5cbnR5cGUgUm93U3BlYyA9XG4gIHwgeyBraW5kOiAnZW1wdHknIH1cbiAgfCB7IGtpbmQ6ICdjZW50ZXInOyB0ZXh0OiBzdHJpbmcgfVxuICB8IHsga2luZDogJ2xlZnQnOyB0ZXh0OiBzdHJpbmcgfVxuXG4vKipcbiAqIEJveCBiYW5uZXI6IEVseXNpYSB2ZXJzaW9uIChjZW50ZXJlZCksIFVSTCBsaW5lLCBvcHRpb25hbCBsb2dpeGx5c2lhIHZlcnNpb24gbGluZS5cbiAqL1xuZXhwb3J0IGNvbnN0IHJlbmRlckJhbm5lciA9IChcbiAgdXJsRGlzcGxheUxpbmU6IHN0cmluZyxcbiAgbG9naXhseXNpYUxpbmU6IHN0cmluZyB8IG51bGxcbik6IHN0cmluZyA9PiB7XG4gIGNvbnN0IHZlcnNpb24gPSBlbHlzaWFQa2cudmVyc2lvblxuICBjb25zdCB2ZXJzaW9uTGluZSA9IHZlcnNpb24gPyBgRWx5c2lhIHYke3ZlcnNpb259YCA6ICdFbHlzaWEnXG5cbiAgY29uc3Qgcm93czogUm93U3BlY1tdID0gW1xuICAgIHsga2luZDogJ2VtcHR5JyB9LFxuICAgIHsga2luZDogJ2NlbnRlcicsIHRleHQ6IHZlcnNpb25MaW5lIH0sXG4gICAgeyBraW5kOiAnZW1wdHknIH0sXG4gICAgeyBraW5kOiAnbGVmdCcsIHRleHQ6IHVybERpc3BsYXlMaW5lIH1cbiAgXVxuICBpZiAobG9naXhseXNpYUxpbmUpIHtcbiAgICByb3dzLnB1c2goeyBraW5kOiAnbGVmdCcsIHRleHQ6IGxvZ2l4bHlzaWFMaW5lIH0pXG4gIH1cbiAgcm93cy5wdXNoKHsga2luZDogJ2VtcHR5JyB9KVxuXG4gIGNvbnN0IGNvbnRlbnRXaWR0aCA9IE1hdGgubWF4KFxuICAgIHZlcnNpb25MaW5lLmxlbmd0aCxcbiAgICB1cmxEaXNwbGF5TGluZS5sZW5ndGgsXG4gICAgLi4uKGxvZ2l4bHlzaWFMaW5lID8gW2xvZ2l4bHlzaWFMaW5lLmxlbmd0aF0gOiBbMF0pXG4gIClcbiAgY29uc3QgaW5uZXJXaWR0aCA9IGNvbnRlbnRXaWR0aCArIDRcblxuICBjb25zdCB0b3AgPSBg4pSMJHsn4pSAJy5yZXBlYXQoaW5uZXJXaWR0aCl94pSQYFxuICBjb25zdCBib3QgPSBg4pSUJHsn4pSAJy5yZXBlYXQoaW5uZXJXaWR0aCl94pSYYFxuICBjb25zdCBlbXB0eVJvdyA9IGDilIIkeycgJy5yZXBlYXQoaW5uZXJXaWR0aCl94pSCYFxuXG4gIGNvbnN0IG91dDogc3RyaW5nW10gPSBbdG9wXVxuICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgaWYgKHJvdy5raW5kID09PSAnZW1wdHknKSB7XG4gICAgICBvdXQucHVzaChlbXB0eVJvdylcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGlmIChyb3cua2luZCA9PT0gJ2NlbnRlcicpIHtcbiAgICAgIG91dC5wdXNoKGDilIIke2NlbnRlclRleHQocm93LnRleHQsIGlubmVyV2lkdGgpfeKUgmApXG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBjb25zdCB0ZXh0ID0gcm93LnRleHRcbiAgICBjb25zdCBwYWRkaW5nID0gTWF0aC5tYXgoMCwgaW5uZXJXaWR0aCAtIHRleHQubGVuZ3RoIC0gNClcbiAgICBvdXQucHVzaChg4pSCICAke3RleHR9JHsnICcucmVwZWF0KHBhZGRpbmcpfSAg4pSCYClcbiAgfVxuICBvdXQucHVzaChib3QpXG4gIHJldHVybiBvdXQuam9pbignXFxuJylcbn1cblxuZXhwb3J0IGNvbnN0IGdldExvZ2l4bHlzaWFWZXJzaW9uTGluZSA9ICgpOiBzdHJpbmcgfCBudWxsID0+IHtcbiAgY29uc3QgdiA9IGxvZ2l4bHlzaWFQa2cudmVyc2lvblxuICBpZiAoIXYpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG4gIHJldHVybiBgICAgICBsb2dpeGx5c2lhIHYke3Z9YFxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IE9wdGlvbnMgfSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IHsgZ2V0TG9naXhseXNpYVZlcnNpb25MaW5lLCByZW5kZXJCYW5uZXIgfSBmcm9tICcuL2Jhbm5lcidcblxuZXhwb3J0IGNvbnN0IHN0YXJ0U2VydmVyID0gKFxuICBzZXJ2ZXI6IHsgcG9ydD86IG51bWJlcjsgaG9zdG5hbWU/OiBzdHJpbmc7IHByb3RvY29sPzogc3RyaW5nIHwgbnVsbCB9LFxuICBvcHRpb25zOiBPcHRpb25zXG4pOiB2b2lkID0+IHtcbiAgY29uc3Qgc2hvd1N0YXJ0dXBNZXNzYWdlID0gb3B0aW9ucy5jb25maWc/LnNob3dTdGFydHVwTWVzc2FnZSA/PyB0cnVlXG4gIGlmICghc2hvd1N0YXJ0dXBNZXNzYWdlKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCB7IHBvcnQsIGhvc3RuYW1lLCBwcm90b2NvbCB9ID0gc2VydmVyXG4gIGlmIChwb3J0ID09PSB1bmRlZmluZWQgfHwgIWhvc3RuYW1lIHx8ICFwcm90b2NvbCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgdXJsID0gYCR7cHJvdG9jb2x9Oi8vJHtob3N0bmFtZX06JHtwb3J0fWBcbiAgY29uc3QgbWVzc2FnZSA9IGDwn6aKIEVseXNpYSBpcyBydW5uaW5nIGF0ICR7dXJsfWBcbiAgY29uc3QgdXJsRGlzcGxheUxpbmUgPSBg8J+miiAgJHt1cmx9YFxuXG4gIGNvbnN0IGZvcm1hdCA9IG9wdGlvbnMuY29uZmlnPy5zdGFydHVwTWVzc2FnZUZvcm1hdCA/PyAnYmFubmVyJ1xuICBpZiAoZm9ybWF0ID09PSAnc2ltcGxlJykge1xuICAgIGNvbnNvbGUubG9nKG1lc3NhZ2UpXG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zb2xlLmxvZyhyZW5kZXJCYW5uZXIodXJsRGlzcGxheUxpbmUsIGdldExvZ2l4bHlzaWFWZXJzaW9uTGluZSgpKSlcbn1cbiIsCiAgICAiaW1wb3J0IHBpbm8gZnJvbSAncGlubydcbmltcG9ydCB7XG4gIGNyZWF0ZVJlcXVlc3RDb250ZXh0U3RvcmUsXG4gIG1lcmdlTG9nRGF0YUNvbnRleHQsXG4gIHR5cGUgUmVxdWVzdENvbnRleHRTdG9yZVxufSBmcm9tICcuLi9jb250ZXh0L3JlcXVlc3QtY29udGV4dCdcbmltcG9ydCB0eXBlIHtcbiAgTG9nRmlsdGVyLFxuICBMb2dnZXIsXG4gIExvZ0xldmVsLFxuICBPcHRpb25zLFxuICBQaW5vLFxuICBSZXF1ZXN0SW5mbyxcbiAgU3RvcmVEYXRhXG59IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQgeyBsb2dUb1RyYW5zcG9ydHMgfSBmcm9tICcuLi9vdXRwdXQnXG5pbXBvcnQgeyBsb2dUb0ZpbGUgfSBmcm9tICcuLi9vdXRwdXQvZmlsZSdcbmltcG9ydCB7IHJlZGFjdCwgcmVkYWN0UmVxdWVzdCB9IGZyb20gJy4uL3V0aWxzL3JlZGFjdCdcbmltcG9ydCB7IGZvcm1hdExvZ091dHB1dCB9IGZyb20gJy4vY3JlYXRlLWxvZ2dlcidcbmltcG9ydCB7IGhhbmRsZUh0dHBFcnJvciB9IGZyb20gJy4vaGFuZGxlLWh0dHAtZXJyb3InXG5cbmV4cG9ydCBjb25zdCBjcmVhdGVMb2dnZXIgPSAoXG4gIG9wdGlvbnM6IE9wdGlvbnMgPSB7fSxcbiAgcGlub0ZhY3Rvcnk6IHR5cGVvZiBwaW5vID0gcGlubyxcbiAgZXh0ZXJuYWxDb250ZXh0U3RvcmU/OiBSZXF1ZXN0Q29udGV4dFN0b3JlXG4pOiBMb2dnZXIgPT4ge1xuICBjb25zdCBjb250ZXh0U3RvcmUgPSBleHRlcm5hbENvbnRleHRTdG9yZSA/PyBjcmVhdGVSZXF1ZXN0Q29udGV4dFN0b3JlKClcbiAgY29uc3QgY29uZmlnID0gb3B0aW9ucy5jb25maWdcblxuICBjb25zdCBwaW5vQ29uZmlnID0gY29uZmlnPy5waW5vXG4gIGNvbnN0IHsgcHJldHR5UHJpbnQsIC4uLnBpbm9PcHRpb25zIH0gPSBwaW5vQ29uZmlnID8/IHt9XG5cbiAgY29uc3QgcHJldHR5UHJpbnRPcHRpb25zID1cbiAgICB0eXBlb2YgcHJldHR5UHJpbnQgPT09ICdvYmplY3QnICYmIHByZXR0eVByaW50ICE9PSBudWxsXG4gICAgICA/IChwcmV0dHlQcmludCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilcbiAgICAgIDogdW5kZWZpbmVkXG5cbiAgY29uc3QgZW5hYmxlUHJldHR5UHJpbnQgPVxuICAgIHByZXR0eVByaW50ID09PSB0cnVlIHx8IHByZXR0eVByaW50T3B0aW9ucyAhPT0gdW5kZWZpbmVkXG5cbiAgY29uc3Qgc2hvdWxkUHJldHR5UHJpbnQgPVxuICAgIGVuYWJsZVByZXR0eVByaW50ICYmIHBpbm9PcHRpb25zLnRyYW5zcG9ydCA9PT0gdW5kZWZpbmVkXG5cbiAgY29uc3QgbWVzc2FnZUtleSA9XG4gICAgKHByZXR0eVByaW50T3B0aW9ucz8ubWVzc2FnZUtleSBhcyBzdHJpbmcgfCB1bmRlZmluZWQpID8/XG4gICAgcGlub09wdGlvbnMubWVzc2FnZUtleVxuICBjb25zdCBlcnJvcktleSA9XG4gICAgKHByZXR0eVByaW50T3B0aW9ucz8uZXJyb3JLZXkgYXMgc3RyaW5nIHwgdW5kZWZpbmVkKSA/PyBwaW5vT3B0aW9ucy5lcnJvcktleVxuXG4gIGNvbnN0IHRyYW5zcG9ydCA9IHNob3VsZFByZXR0eVByaW50XG4gICAgPyB7XG4gICAgICAgIHRhcmdldDogJ3Bpbm8tcHJldHR5JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIGNvbG9yaXplOiBwcm9jZXNzLnN0ZG91dD8uaXNUVFkgPT09IHRydWUsXG4gICAgICAgICAgdHJhbnNsYXRlVGltZTogY29uZmlnPy50aW1lc3RhbXA/LnRyYW5zbGF0ZVRpbWUsXG4gICAgICAgICAgLi4ucHJldHR5UHJpbnRPcHRpb25zLFxuICAgICAgICAgIG1lc3NhZ2VLZXksXG4gICAgICAgICAgZXJyb3JLZXlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIDogcGlub09wdGlvbnMudHJhbnNwb3J0XG5cbiAgY29uc3QgcGlub0xvZ2dlcjogUGlubyA9IHBpbm9GYWN0b3J5KHtcbiAgICAuLi5waW5vT3B0aW9ucyxcbiAgICBsZXZlbDogcGlub09wdGlvbnMubGV2ZWwgPz8gJ2luZm8nLFxuICAgIG1lc3NhZ2VLZXksXG4gICAgZXJyb3JLZXksXG4gICAgdHJhbnNwb3J0XG4gIH0pXG5cbiAgY29uc3Qgc2hvdWxkTG9nID0gKGxldmVsOiBMb2dMZXZlbCwgbG9nRmlsdGVyPzogTG9nRmlsdGVyKTogYm9vbGVhbiA9PiB7XG4gICAgaWYgKCFsb2dGaWx0ZXI/LmxldmVsIHx8IGxvZ0ZpbHRlci5sZXZlbC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIHJldHVybiBsb2dGaWx0ZXIubGV2ZWwuaW5jbHVkZXMobGV2ZWwpXG4gIH1cblxuICBjb25zdCB1c2VUcmFuc3BvcnRzT25seSA9IGNvbmZpZz8udXNlVHJhbnNwb3J0c09ubHkgPT09IHRydWVcbiAgY29uc3QgZGlzYWJsZUludGVybmFsTG9nZ2VyID0gY29uZmlnPy5kaXNhYmxlSW50ZXJuYWxMb2dnZXIgPT09IHRydWVcbiAgY29uc3QgZGlzYWJsZUZpbGVMb2dnaW5nID0gY29uZmlnPy5kaXNhYmxlRmlsZUxvZ2dpbmcgPT09IHRydWVcblxuICBjb25zdCBoYXNUcmFuc3BvcnRzID0gKGNvbmZpZz8udHJhbnNwb3J0cz8ubGVuZ3RoID8/IDApID4gMFxuICBjb25zdCBoYXNGaWxlTG9nZ2luZyA9XG4gICAgISh1c2VUcmFuc3BvcnRzT25seSB8fCBkaXNhYmxlRmlsZUxvZ2dpbmcpICYmICEhY29uZmlnPy5sb2dGaWxlUGF0aFxuICBjb25zdCBoYXNJbnRlcm5hbExvZ2dlciA9ICEodXNlVHJhbnNwb3J0c09ubHkgfHwgZGlzYWJsZUludGVybmFsTG9nZ2VyKVxuICBjb25zdCBpc0VmZmVjdGl2ZWx5RGlzYWJsZWQgPSAhKFxuICAgIGhhc1RyYW5zcG9ydHMgfHxcbiAgICBoYXNGaWxlTG9nZ2luZyB8fFxuICAgIGhhc0ludGVybmFsTG9nZ2VyXG4gIClcblxuICBjb25zdCBsb2cgPSAoXG4gICAgbGV2ZWw6IExvZ0xldmVsLFxuICAgIHJlcXVlc3Q6IFJlcXVlc3RJbmZvLFxuICAgIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIHN0b3JlOiBTdG9yZURhdGFcbiAgKTogdm9pZCA9PiB7XG4gICAgaWYgKGlzRWZmZWN0aXZlbHlEaXNhYmxlZCB8fCAhc2hvdWxkTG9nKGxldmVsLCBjb25maWc/LmxvZ0ZpbHRlcikpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGRhdGFXaXRoQ29udGV4dCA9IG1lcmdlTG9nRGF0YUNvbnRleHQoXG4gICAgICBkYXRhLFxuICAgICAgY29udGV4dFN0b3JlLmdldENvbnRleHQocmVxdWVzdClcbiAgICApXG4gICAgY29uc3QgbG9nRGF0YSA9XG4gICAgICBjb25maWc/LmF1dG9SZWRhY3QgPT09IHRydWUgPyByZWRhY3QoZGF0YVdpdGhDb250ZXh0KSA6IGRhdGFXaXRoQ29udGV4dFxuICAgIGNvbnN0IGxvZ1JlcXVlc3QgPVxuICAgICAgY29uZmlnPy5hdXRvUmVkYWN0ID09PSB0cnVlID8gcmVkYWN0UmVxdWVzdChyZXF1ZXN0KSA6IHJlcXVlc3RcblxuICAgIGlmIChoYXNUcmFuc3BvcnRzKSB7XG4gICAgICBsb2dUb1RyYW5zcG9ydHMoe1xuICAgICAgICBsZXZlbCxcbiAgICAgICAgcmVxdWVzdDogbG9nUmVxdWVzdCxcbiAgICAgICAgZGF0YTogbG9nRGF0YSxcbiAgICAgICAgc3RvcmUsXG4gICAgICAgIG9wdGlvbnNcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKGhhc0ZpbGVMb2dnaW5nKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IGNvbmZpZz8ubG9nRmlsZVBhdGhcbiAgICAgIGlmIChmaWxlUGF0aCkge1xuICAgICAgICBsb2dUb0ZpbGUoe1xuICAgICAgICAgIGZpbGVQYXRoLFxuICAgICAgICAgIGxldmVsLFxuICAgICAgICAgIHJlcXVlc3Q6IGxvZ1JlcXVlc3QsXG4gICAgICAgICAgZGF0YTogbG9nRGF0YSxcbiAgICAgICAgICBzdG9yZSxcbiAgICAgICAgICBvcHRpb25zXG4gICAgICAgIH0pLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAvKiBJZ25vcmUgZXJyb3JzICovXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFoYXNJbnRlcm5hbExvZ2dlcikge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgeyBtYWluLCBjb250ZXh0TGluZXMgfSA9IGZvcm1hdExvZ091dHB1dCh7XG4gICAgICBsZXZlbCxcbiAgICAgIHJlcXVlc3Q6IGxvZ1JlcXVlc3QsXG4gICAgICBkYXRhOiBsb2dEYXRhLFxuICAgICAgc3RvcmUsXG4gICAgICBvcHRpb25zXG4gICAgfSlcbiAgICBjb25zdCBtZXNzYWdlID1cbiAgICAgIGNvbnRleHRMaW5lcy5sZW5ndGggPiAwID8gYCR7bWFpbn1cXG4ke2NvbnRleHRMaW5lcy5qb2luKCdcXG4nKX1gIDogbWFpblxuXG4gICAgc3dpdGNoIChsZXZlbCkge1xuICAgICAgY2FzZSAnREVCVUcnOiB7XG4gICAgICAgIGNvbnNvbGUuZGVidWcobWVzc2FnZSlcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0lORk8nOiB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhtZXNzYWdlKVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgY2FzZSAnV0FSTklORyc6IHtcbiAgICAgICAgY29uc29sZS53YXJuKG1lc3NhZ2UpXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBjYXNlICdFUlJPUic6IHtcbiAgICAgICAgY29uc29sZS5lcnJvcihtZXNzYWdlKVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBjb25zb2xlLmxvZyhtZXNzYWdlKVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGxvZ1dpdGhDb250ZXh0ID0gKFxuICAgIGxldmVsOiBMb2dMZXZlbCxcbiAgICByZXF1ZXN0OiBSZXF1ZXN0SW5mbyxcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgY29udGV4dD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IHZvaWQgPT4ge1xuICAgIGlmIChpc0VmZmVjdGl2ZWx5RGlzYWJsZWQgfHwgIXNob3VsZExvZyhsZXZlbCwgY29uZmlnPy5sb2dGaWx0ZXIpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3Qgc3RvcmU6IFN0b3JlRGF0YSA9IHsgYmVmb3JlVGltZTogcHJvY2Vzcy5ocnRpbWUuYmlnaW50KCkgfVxuICAgIGxvZyhsZXZlbCwgcmVxdWVzdCwgeyBtZXNzYWdlLCBjb250ZXh0IH0sIHN0b3JlKVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBwaW5vOiBwaW5vTG9nZ2VyLFxuICAgIG1lcmdlQ29udGV4dDogKHJlcXVlc3QsIHBhcnRpYWwpID0+IHtcbiAgICAgIGNvbnRleHRTdG9yZS5tZXJnZUNvbnRleHQocmVxdWVzdCwgcGFydGlhbClcbiAgICB9LFxuICAgIGdldENvbnRleHQ6IHJlcXVlc3QgPT4gY29udGV4dFN0b3JlLmdldENvbnRleHQocmVxdWVzdCksXG4gICAgbG9nLFxuICAgIGhhbmRsZUh0dHBFcnJvcjogKHJlcXVlc3QsIGVycm9yLCBzdG9yZSkgPT4ge1xuICAgICAgaGFuZGxlSHR0cEVycm9yKHJlcXVlc3QsIGVycm9yLCBzdG9yZSwgb3B0aW9ucywgY29udGV4dFN0b3JlKVxuICAgIH0sXG4gICAgZGVidWc6IChyZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KSA9PiB7XG4gICAgICBsb2dXaXRoQ29udGV4dCgnREVCVUcnLCByZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KVxuICAgIH0sXG4gICAgaW5mbzogKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpID0+IHtcbiAgICAgIGxvZ1dpdGhDb250ZXh0KCdJTkZPJywgcmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dClcbiAgICB9LFxuICAgIHdhcm46IChyZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KSA9PiB7XG4gICAgICBsb2dXaXRoQ29udGV4dCgnV0FSTklORycsIHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpXG4gICAgfSxcbiAgICBlcnJvcjogKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpID0+IHtcbiAgICAgIGxvZ1dpdGhDb250ZXh0KCdFUlJPUicsIHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpXG4gICAgfVxuICB9XG59XG5cbi8qKiBQbHVnaW4gZW50cnk6IHNoYXJlcyBvbmUgcmVxdWVzdC1jb250ZXh0IHN0b3JlIGFjcm9zcyB0aGUgRWx5c2lhIGxpZmVjeWNsZS4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVQbHVnaW5Mb2dnZXIgPSAoXG4gIG9wdGlvbnM6IE9wdGlvbnMsXG4gIGNvbnRleHRTdG9yZTogUmVxdWVzdENvbnRleHRTdG9yZVxuKTogTG9nZ2VyID0+IGNyZWF0ZUxvZ2dlcihvcHRpb25zLCBwaW5vLCBjb250ZXh0U3RvcmUpXG4iLAogICAgImltcG9ydCB0eXBlIHsgTG9nTGV2ZWwsIE9wdGlvbnMsIFJlcXVlc3RJbmZvLCBTdG9yZURhdGEgfSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuXG5pbnRlcmZhY2UgTG9nVG9UcmFuc3BvcnRzSW5wdXQge1xuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICBsZXZlbDogTG9nTGV2ZWxcbiAgb3B0aW9uczogT3B0aW9uc1xuICByZXF1ZXN0OiBSZXF1ZXN0SW5mb1xuICBzdG9yZTogU3RvcmVEYXRhXG59XG5cbmV4cG9ydCBjb25zdCBsb2dUb1RyYW5zcG9ydHMgPSAoXG4gIC4uLmFyZ3M6XG4gICAgfCBbTG9nVG9UcmFuc3BvcnRzSW5wdXRdXG4gICAgfCBbTG9nTGV2ZWwsIFJlcXVlc3RJbmZvLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgU3RvcmVEYXRhLCBPcHRpb25zXVxuKTogdm9pZCA9PiB7XG4gIGNvbnN0IGlucHV0OiBMb2dUb1RyYW5zcG9ydHNJbnB1dCA9XG4gICAgdHlwZW9mIGFyZ3NbMF0gPT09ICdzdHJpbmcnXG4gICAgICA/IHtcbiAgICAgICAgICBsZXZlbDogYXJnc1swXSxcbiAgICAgICAgICByZXF1ZXN0OiBhcmdzWzFdLFxuICAgICAgICAgIGRhdGE6IGFyZ3NbMl0sXG4gICAgICAgICAgc3RvcmU6IGFyZ3NbM10sXG4gICAgICAgICAgb3B0aW9uczogYXJnc1s0XVxuICAgICAgICB9XG4gICAgICA6IGFyZ3NbMF1cblxuICBjb25zdCB7IGxldmVsLCByZXF1ZXN0LCBkYXRhLCBzdG9yZSwgb3B0aW9ucyB9ID0gaW5wdXRcbiAgY29uc3QgdHJhbnNwb3J0cyA9IG9wdGlvbnMuY29uZmlnPy50cmFuc3BvcnRzID8/IFtdXG4gIGlmICh0cmFuc3BvcnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgbWVzc2FnZSA9IHR5cGVvZiBkYXRhLm1lc3NhZ2UgPT09ICdzdHJpbmcnID8gZGF0YS5tZXNzYWdlIDogJydcbiAgY29uc3QgbWV0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7XG4gICAgcmVxdWVzdDoge1xuICAgICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcbiAgICAgIHVybDogcmVxdWVzdC51cmxcbiAgICB9LFxuICAgIC4uLmRhdGEsXG4gICAgYmVmb3JlVGltZTogc3RvcmUuYmVmb3JlVGltZVxuICB9XG5cbiAgZm9yIChjb25zdCB0cmFuc3BvcnQgb2YgdHJhbnNwb3J0cykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSB0cmFuc3BvcnQubG9nKGxldmVsLCBtZXNzYWdlLCBtZXRhKVxuICAgICAgaWYgKFxuICAgICAgICByZXN1bHQgJiZcbiAgICAgICAgdHlwZW9mIChyZXN1bHQgYXMgeyBjYXRjaD86IHVua25vd24gfSkuY2F0Y2ggPT09ICdmdW5jdGlvbidcbiAgICAgICkge1xuICAgICAgICA7KHJlc3VsdCBhcyBQcm9taXNlPHZvaWQ+KS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgLy8gSWdub3JlIGVycm9yc1xuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gVHJhbnNwb3J0IGZhaWx1cmVzIG11c3QgbmV2ZXIgY3Jhc2ggYXBwbGljYXRpb24gbG9nZ2luZy5cbiAgICB9XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgYXBwZW5kRmlsZSB9IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnXG5pbXBvcnQgeyBkaXJuYW1lIH0gZnJvbSAnbm9kZTpwYXRoJ1xuaW1wb3J0IHR5cGUgeyBMb2dMZXZlbCwgT3B0aW9ucywgUmVxdWVzdEluZm8sIFN0b3JlRGF0YSB9IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQgeyBlbnN1cmVEaXIgfSBmcm9tICcuL2ZzJ1xuaW1wb3J0IHsgcGVyZm9ybVJvdGF0aW9uLCBzaG91bGRSb3RhdGUgfSBmcm9tICcuL3JvdGF0aW9uLW1hbmFnZXInXG5cbi8vIFBlci1maWxlIG11dGV4IHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb25zIGR1cmluZyByb3RhdGlvblxuY29uc3QgZmlsZUxvY2tzID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8dm9pZD4+KClcblxuY29uc3QgYWNxdWlyZUxvY2sgPSAoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8KCkgPT4gdm9pZD4gPT4ge1xuICBjb25zdCBwcmlvciA9IGZpbGVMb2Nrcy5nZXQoZmlsZVBhdGgpID8/IFByb21pc2UucmVzb2x2ZSgpXG5cbiAgbGV0IHJlc29sdmVMb2NrOiAoKSA9PiB2b2lkXG4gIGNvbnN0IG5ld0xvY2sgPSBuZXcgUHJvbWlzZTx2b2lkPihyZXNvbHZlID0+IHtcbiAgICByZXNvbHZlTG9jayA9IHJlc29sdmVcbiAgfSlcblxuICByZXR1cm4gcHJpb3IudGhlbigoKSA9PiB7XG4gICAgLy8gT25seSBzZXQgdGhlIGxvY2sgYWZ0ZXIgYWNxdWlyaW5nIHRoZSBwcmlvciBsb2NrIHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb25zXG4gICAgZmlsZUxvY2tzLnNldChmaWxlUGF0aCwgbmV3TG9jaylcblxuICAgIC8vIENyaXRpY2FsIHNlY3Rpb24gY2FuIG5vdyBwcm9jZWVkXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHJlc29sdmVMb2NrPy4oKVxuICAgICAgaWYgKGZpbGVMb2Nrcy5nZXQoZmlsZVBhdGgpID09PSBuZXdMb2NrKSB7XG4gICAgICAgIGZpbGVMb2Nrcy5kZWxldGUoZmlsZVBhdGgpXG4gICAgICB9XG4gICAgfVxuICB9KVxufVxuXG5pbnRlcmZhY2UgTG9nVG9GaWxlSW5wdXQge1xuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICBmaWxlUGF0aDogc3RyaW5nXG4gIGxldmVsOiBMb2dMZXZlbFxuICBvcHRpb25zOiBPcHRpb25zXG4gIHJlcXVlc3Q6IFJlcXVlc3RJbmZvXG4gIHN0b3JlOiBTdG9yZURhdGFcbn1cblxuZXhwb3J0IGNvbnN0IGxvZ1RvRmlsZSA9IGFzeW5jIChcbiAgLi4uYXJnczpcbiAgICB8IFtMb2dUb0ZpbGVJbnB1dF1cbiAgICB8IFtcbiAgICAgICAgc3RyaW5nLFxuICAgICAgICBMb2dMZXZlbCxcbiAgICAgICAgUmVxdWVzdEluZm8sXG4gICAgICAgIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICBTdG9yZURhdGEsXG4gICAgICAgIE9wdGlvbnNcbiAgICAgIF1cbik6IFByb21pc2U8dm9pZD4gPT4ge1xuICBjb25zdCBpbnB1dDogTG9nVG9GaWxlSW5wdXQgPVxuICAgIHR5cGVvZiBhcmdzWzBdID09PSAnc3RyaW5nJ1xuICAgICAgPyAoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IFtcbiAgICAgICAgICAgIGZpbGVQYXRoQXJnLFxuICAgICAgICAgICAgbGV2ZWxBcmcsXG4gICAgICAgICAgICByZXF1ZXN0QXJnLFxuICAgICAgICAgICAgZGF0YUFyZyxcbiAgICAgICAgICAgIHN0b3JlQXJnLFxuICAgICAgICAgICAgb3B0aW9uc0FyZ1xuICAgICAgICAgIF0gPSBhcmdzIGFzIFtcbiAgICAgICAgICAgIHN0cmluZyxcbiAgICAgICAgICAgIExvZ0xldmVsLFxuICAgICAgICAgICAgUmVxdWVzdEluZm8sXG4gICAgICAgICAgICBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgICAgIFN0b3JlRGF0YSxcbiAgICAgICAgICAgIE9wdGlvbnNcbiAgICAgICAgICBdXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGZpbGVQYXRoOiBmaWxlUGF0aEFyZyxcbiAgICAgICAgICAgIGxldmVsOiBsZXZlbEFyZyxcbiAgICAgICAgICAgIHJlcXVlc3Q6IHJlcXVlc3RBcmcsXG4gICAgICAgICAgICBkYXRhOiBkYXRhQXJnLFxuICAgICAgICAgICAgc3RvcmU6IHN0b3JlQXJnLFxuICAgICAgICAgICAgb3B0aW9uczogb3B0aW9uc0FyZ1xuICAgICAgICAgIH1cbiAgICAgICAgfSkoKVxuICAgICAgOiBhcmdzWzBdXG5cbiAgY29uc3QgeyBmaWxlUGF0aCwgbGV2ZWwsIHJlcXVlc3QsIGRhdGEsIHN0b3JlLCBvcHRpb25zIH0gPSBpbnB1dFxuICBjb25zdCBjb25maWcgPSBvcHRpb25zLmNvbmZpZ1xuICBjb25zdCB1c2VUcmFuc3BvcnRzT25seSA9IGNvbmZpZz8udXNlVHJhbnNwb3J0c09ubHkgPT09IHRydWVcbiAgY29uc3QgZGlzYWJsZUZpbGVMb2dnaW5nID0gY29uZmlnPy5kaXNhYmxlRmlsZUxvZ2dpbmcgPT09IHRydWVcbiAgaWYgKHVzZVRyYW5zcG9ydHNPbmx5IHx8IGRpc2FibGVGaWxlTG9nZ2luZykge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgbWVzc2FnZSA9IHR5cGVvZiBkYXRhLm1lc3NhZ2UgPT09ICdzdHJpbmcnID8gZGF0YS5tZXNzYWdlIDogJydcbiAgY29uc3QgZHVyYXRpb25NcyA9XG4gICAgc3RvcmUuYmVmb3JlVGltZSA9PT0gQmlnSW50KDApXG4gICAgICA/IDBcbiAgICAgIDogTnVtYmVyKHByb2Nlc3MuaHJ0aW1lLmJpZ2ludCgpIC0gc3RvcmUuYmVmb3JlVGltZSkgLyAxXzAwMF8wMDBcblxuICAvLyBTYWZlbHkgcGFyc2UgVVJMIHRvIGF2b2lkIGNyYXNoZXMgb24gbWFsZm9ybWVkIFVSTHNcbiAgbGV0IHBhdGhuYW1lID0gJy8nXG4gIHRyeSB7XG4gICAgY29uc3QgeyBwYXRobmFtZTogcmF3UGF0aG5hbWUsIHNlYXJjaCB9ID0gbmV3IFVSTChyZXF1ZXN0LnVybClcbiAgICBwYXRobmFtZSA9IGNvbmZpZz8ubG9nUXVlcnlQYXJhbXMgPyBgJHtyYXdQYXRobmFtZX0ke3NlYXJjaH1gIDogcmF3UGF0aG5hbWVcbiAgfSBjYXRjaCB7XG4gICAgLy8gRmFsbGJhY2sgdG8gcmF3IFVSTCBpZiBwYXJzaW5nIGZhaWxzXG4gICAgcGF0aG5hbWUgPSByZXF1ZXN0LnVybFxuICB9XG5cbiAgY29uc3QgbGluZSA9IGAke2xldmVsfSAke2R1cmF0aW9uTXMudG9GaXhlZCgyKX1tcyAke3JlcXVlc3QubWV0aG9kfSAke3BhdGhuYW1lfSAke21lc3NhZ2V9XFxuYFxuXG4gIC8vIEFjcXVpcmUgbG9jayBiZWZvcmUgYW55IGZpbGUgb3BlcmF0aW9ucyB0byBwcmV2ZW50IHJhY2UgY29uZGl0aW9uc1xuICBjb25zdCByZWxlYXNlTG9jayA9IGF3YWl0IGFjcXVpcmVMb2NrKGZpbGVQYXRoKVxuXG4gIHRyeSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGVuc3VyZURpcihkaXJuYW1lKGZpbGVQYXRoKSlcbiAgICAgIGF3YWl0IGFwcGVuZEZpbGUoZmlsZVBhdGgsIGxpbmUsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gTG9nIGZpbGUgd3JpdGUgZXJyb3JzIHRvIHN0ZGVyciBzbyB0aGV5J3JlIG5vdCBjb21wbGV0ZWx5IHNpbGVudFxuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgYFtsb2dpeGx5c2lhXSBGYWlsZWQgdG8gd3JpdGUgdG8gbG9nIGZpbGUgJHtmaWxlUGF0aH06YCxcbiAgICAgICAgZXJyb3JcbiAgICAgIClcbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuXG4gICAgY29uc3Qgcm90YXRpb24gPSBjb25maWc/LmxvZ1JvdGF0aW9uXG4gICAgaWYgKCFyb3RhdGlvbikge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3Qgc2hvdWxkID0gYXdhaXQgc2hvdWxkUm90YXRlKGZpbGVQYXRoLCByb3RhdGlvbilcbiAgICBpZiAoc2hvdWxkKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBwZXJmb3JtUm90YXRpb24oZmlsZVBhdGgsIHJvdGF0aW9uKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gTG9nIHJvdGF0aW9uIGVycm9ycyBidXQgZG9uJ3QgY3Jhc2ggLSBsb2cgZW50cnkgd2FzIGFscmVhZHkgd3JpdHRlblxuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIGBbbG9naXhseXNpYV0gRmFpbGVkIHRvIHJvdGF0ZSBsb2cgZmlsZSAke2ZpbGVQYXRofTpgLFxuICAgICAgICAgIGVycm9yXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgLy8gUmVsZWFzZSBsb2NrXG4gICAgcmVsZWFzZUxvY2soKVxuICB9XG59XG4iLAogICAgImltcG9ydCB7IHByb21pc2VzIGFzIGZzIH0gZnJvbSAnbm9kZTpmcydcblxuZXhwb3J0IGNvbnN0IGVuc3VyZURpciA9IGFzeW5jIChkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgYXdhaXQgZnMubWtkaXIoZGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSlcbn1cbiIsCiAgICAiaW1wb3J0IHsgcHJvbWlzZXMgYXMgZnMgfSBmcm9tICdub2RlOmZzJ1xuaW1wb3J0IHsgcHJvbWlzaWZ5IH0gZnJvbSAnbm9kZTp1dGlsJ1xuaW1wb3J0IHsgZ3ppcCB9IGZyb20gJ25vZGU6emxpYidcbmltcG9ydCB0eXBlIHsgTG9nUm90YXRpb25Db25maWcgfSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IHtcbiAgZ2V0Um90YXRlZEZpbGVzLFxuICBwYXJzZVJldGVudGlvbixcbiAgcGFyc2VTaXplLFxuICBzaG91bGRSb3RhdGVCeVNpemVcbn0gZnJvbSAnLi4vdXRpbHMvcm90YXRpb24nXG5cbmNvbnN0IGd6aXBBc3luYyA9IHByb21pc2lmeShnemlwKVxuXG4vLyBDb21wcmVzc2lvbiBsb2NrIHRvIHByZXZlbnQgY29uY3VycmVudCBjb21wcmVzc2lvbiBvZiB0aGUgc2FtZSBmaWxlXG5jb25zdCBjb21wcmVzc2lvbkxvY2tzID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8dm9pZD4+KClcblxuY29uc3QgYWNxdWlyZUNvbXByZXNzaW9uTG9jayA9IChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTwoKSA9PiB2b2lkPiA9PiB7XG4gIGNvbnN0IHByaW9yID0gY29tcHJlc3Npb25Mb2Nrcy5nZXQoZmlsZVBhdGgpID8/IFByb21pc2UucmVzb2x2ZSgpXG5cbiAgbGV0IHJlc29sdmVMb2NrOiAoKSA9PiB2b2lkXG4gIGNvbnN0IG5ld0xvY2sgPSBuZXcgUHJvbWlzZTx2b2lkPihyZXNvbHZlID0+IHtcbiAgICByZXNvbHZlTG9jayA9IHJlc29sdmVcbiAgfSlcblxuICByZXR1cm4gcHJpb3IudGhlbigoKSA9PiB7XG4gICAgLy8gT25seSBzZXQgdGhlIGxvY2sgYWZ0ZXIgYWNxdWlyaW5nIHRoZSBwcmlvciBsb2NrIHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb25zXG4gICAgY29tcHJlc3Npb25Mb2Nrcy5zZXQoZmlsZVBhdGgsIG5ld0xvY2spXG5cbiAgICAvLyBDcml0aWNhbCBzZWN0aW9uIGNhbiBub3cgcHJvY2VlZFxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICByZXNvbHZlTG9jaz8uKClcbiAgICAgIGlmIChjb21wcmVzc2lvbkxvY2tzLmdldChmaWxlUGF0aCkgPT09IG5ld0xvY2spIHtcbiAgICAgICAgY29tcHJlc3Npb25Mb2Nrcy5kZWxldGUoZmlsZVBhdGgpXG4gICAgICB9XG4gICAgfVxuICB9KVxufVxuXG5jb25zdCBwYWQyID0gKHZhbHVlOiBudW1iZXIpOiBzdHJpbmcgPT4gU3RyaW5nKHZhbHVlKS5wYWRTdGFydCgyLCAnMCcpXG5cbmV4cG9ydCBjb25zdCBnZXRSb3RhdGVkRmlsZU5hbWUgPSAoZmlsZVBhdGg6IHN0cmluZywgZGF0ZTogRGF0ZSk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IHl5eXkgPSBkYXRlLmdldEZ1bGxZZWFyKClcbiAgY29uc3QgbW0gPSBwYWQyKGRhdGUuZ2V0TW9udGgoKSArIDEpXG4gIGNvbnN0IGRkID0gcGFkMihkYXRlLmdldERhdGUoKSlcbiAgY29uc3QgSEggPSBwYWQyKGRhdGUuZ2V0SG91cnMoKSlcbiAgY29uc3QgTU0gPSBwYWQyKGRhdGUuZ2V0TWludXRlcygpKVxuICBjb25zdCBzcyA9IHBhZDIoZGF0ZS5nZXRTZWNvbmRzKCkpXG4gIGNvbnN0IFNTUyA9IFN0cmluZyhkYXRlLmdldE1pbGxpc2Vjb25kcygpKS5wYWRTdGFydCgzLCAnMCcpXG4gIHJldHVybiBgJHtmaWxlUGF0aH0uJHt5eXl5fS0ke21tfS0ke2RkfS0ke0hIfS0ke01NfS0ke3NzfS0ke1NTU31gXG59XG5cbmV4cG9ydCBjb25zdCByb3RhdGVGaWxlID0gYXN5bmMgKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IHN0YXQgPSBhd2FpdCBmcy5zdGF0KGZpbGVQYXRoKVxuICAgIGlmIChzdGF0LnNpemUgPT09IDApIHtcbiAgICAgIHJldHVybiAnJ1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICBjb25zdCBiYXNlUm90YXRlZCA9IGdldFJvdGF0ZWRGaWxlTmFtZShmaWxlUGF0aCwgbmV3IERhdGUoKSlcbiAgY29uc3Qgcm90YXRlZCA9IGAke2Jhc2VSb3RhdGVkfS0ke3Byb2Nlc3MuaHJ0aW1lLmJpZ2ludCgpfWBcbiAgYXdhaXQgZnMucmVuYW1lKGZpbGVQYXRoLCByb3RhdGVkKVxuICByZXR1cm4gcm90YXRlZFxufVxuXG5leHBvcnQgY29uc3QgY29tcHJlc3NGaWxlID0gYXN5bmMgKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgY29uc3QgcmVsZWFzZSA9IGF3YWl0IGFjcXVpcmVDb21wcmVzc2lvbkxvY2soZmlsZVBhdGgpXG4gIHRyeSB7XG4gICAgLy8gQ2hlY2sgaWYgZmlsZSBzdGlsbCBleGlzdHMgKG1pZ2h0IGhhdmUgYmVlbiBjb21wcmVzc2VkIGJ5IGFub3RoZXIgcHJvY2VzcylcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZnMuYWNjZXNzKGZpbGVQYXRoKVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gRmlsZSBkb2Vzbid0IGV4aXN0LCBhbHJlYWR5IGNvbXByZXNzZWQgb3IgZGVsZXRlZFxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGZpbGVQYXRoKVxuICAgIGNvbnN0IGNvbXByZXNzZWQgPSBhd2FpdCBnemlwQXN5bmMoY29udGVudClcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUoYCR7ZmlsZVBhdGh9Lmd6YCwgY29tcHJlc3NlZClcbiAgICBhd2FpdCBmcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoYFtsb2dpeGx5c2lhXSBGYWlsZWQgdG8gY29tcHJlc3MgZmlsZSAke2ZpbGVQYXRofTpgLCBlcnJvcilcbiAgICB0aHJvdyBlcnJvclxuICB9IGZpbmFsbHkge1xuICAgIHJlbGVhc2UoKVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBzaG91bGRSb3RhdGUgPSBhc3luYyAoXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIGNvbmZpZzogTG9nUm90YXRpb25Db25maWdcbik6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICBpZiAoY29uZmlnLm1heFNpemUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG4gIGNvbnN0IG1heFNpemUgPSBwYXJzZVNpemUoY29uZmlnLm1heFNpemUpXG4gIHJldHVybiBhd2FpdCBzaG91bGRSb3RhdGVCeVNpemUoZmlsZVBhdGgsIG1heFNpemUpXG59XG5cbmNvbnN0IGNsZWFudXBCeUNvdW50ID0gYXN5bmMgKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBtYXhGaWxlczogbnVtYmVyXG4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgY29uc3Qgcm90YXRlZCA9IGF3YWl0IGdldFJvdGF0ZWRGaWxlcyhmaWxlUGF0aClcbiAgaWYgKHJvdGF0ZWQubGVuZ3RoIDw9IG1heEZpbGVzKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICAvLyBVc2UgUHJvbWlzZS5hbGxTZXR0bGVkIHRvIGhhbmRsZSBpbmRpdmlkdWFsIGZpbGUgc3RhdCBmYWlsdXJlcyBncmFjZWZ1bGx5XG4gIGNvbnN0IHN0YXRzUmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChcbiAgICByb3RhdGVkLm1hcChhc3luYyBwID0+ICh7IHBhdGg6IHAsIHN0YXQ6IGF3YWl0IGZzLnN0YXQocCkgfSkpXG4gIClcblxuICAvLyBFeHRyYWN0IHN1Y2Nlc3NmdWwgc3RhdHMsIGlnbm9yZSBmaWxlcyB0aGF0IHdlcmUgZGVsZXRlZCBjb25jdXJyZW50bHlcbiAgY29uc3Qgc3RhdHMgPSBzdGF0c1Jlc3VsdHNcbiAgICAuZmlsdGVyKFxuICAgICAgKFxuICAgICAgICByZXN1bHRcbiAgICAgICk6IHJlc3VsdCBpcyBQcm9taXNlRnVsZmlsbGVkUmVzdWx0PHtcbiAgICAgICAgcGF0aDogc3RyaW5nXG4gICAgICAgIHN0YXQ6IGltcG9ydCgnbm9kZTpmcycpLlN0YXRzXG4gICAgICB9PiA9PiByZXN1bHQuc3RhdHVzID09PSAnZnVsZmlsbGVkJ1xuICAgIClcbiAgICAubWFwKHJlc3VsdCA9PiByZXN1bHQudmFsdWUpXG5cbiAgaWYgKHN0YXRzLmxlbmd0aCA8PSBtYXhGaWxlcykge1xuICAgIHJldHVyblxuICB9XG5cbiAgc3RhdHMuc29ydCgoYSwgYikgPT4gYi5zdGF0Lm10aW1lTXMgLSBhLnN0YXQubXRpbWVNcylcbiAgY29uc3QgdG9EZWxldGUgPSBzdGF0cy5zbGljZShtYXhGaWxlcylcblxuICAvLyBEZWxldGUgZmlsZXMgaW5kaXZpZHVhbGx5LCBjb250aW51aW5nIGV2ZW4gaWYgc29tZSBmYWlsXG4gIGNvbnN0IGRlbGV0ZVJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgdG9EZWxldGUubWFwKCh7IHBhdGggfSkgPT4gZnMucm0ocGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSlcbiAgKVxuXG4gIC8vIExvZyBmYWlsdXJlcyBidXQgZG9uJ3QgY3Jhc2hcbiAgZGVsZXRlUmVzdWx0cy5mb3JFYWNoKChyZXN1bHQsIGlkeCkgPT4ge1xuICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSAncmVqZWN0ZWQnKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBgW2xvZ2l4bHlzaWFdIEZhaWxlZCB0byBkZWxldGUgcm90YXRlZCBsb2cgJHt0b0RlbGV0ZVtpZHhdLnBhdGh9OmAsXG4gICAgICAgIHJlc3VsdC5yZWFzb25cbiAgICAgIClcbiAgICB9XG4gIH0pXG59XG5cbmNvbnN0IGNsZWFudXBCeVRpbWUgPSBhc3luYyAoXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIG1heEFnZU1zOiBudW1iZXJcbik6IFByb21pc2U8dm9pZD4gPT4ge1xuICBjb25zdCByb3RhdGVkID0gYXdhaXQgZ2V0Um90YXRlZEZpbGVzKGZpbGVQYXRoKVxuICBpZiAocm90YXRlZC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IG5vdyA9IERhdGUubm93KClcblxuICAvLyBVc2UgUHJvbWlzZS5hbGxTZXR0bGVkIHRvIGhhbmRsZSBpbmRpdmlkdWFsIGZpbGUgc3RhdCBmYWlsdXJlcyBncmFjZWZ1bGx5XG4gIGNvbnN0IHN0YXRzUmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChcbiAgICByb3RhdGVkLm1hcChhc3luYyBwID0+ICh7IHBhdGg6IHAsIHN0YXQ6IGF3YWl0IGZzLnN0YXQocCkgfSkpXG4gIClcblxuICAvLyBFeHRyYWN0IHN1Y2Nlc3NmdWwgc3RhdHNcbiAgY29uc3Qgc3RhdHMgPSBzdGF0c1Jlc3VsdHNcbiAgICAuZmlsdGVyKFxuICAgICAgKFxuICAgICAgICByZXN1bHRcbiAgICAgICk6IHJlc3VsdCBpcyBQcm9taXNlRnVsZmlsbGVkUmVzdWx0PHtcbiAgICAgICAgcGF0aDogc3RyaW5nXG4gICAgICAgIHN0YXQ6IGltcG9ydCgnbm9kZTpmcycpLlN0YXRzXG4gICAgICB9PiA9PiByZXN1bHQuc3RhdHVzID09PSAnZnVsZmlsbGVkJ1xuICAgIClcbiAgICAubWFwKHJlc3VsdCA9PiByZXN1bHQudmFsdWUpXG5cbiAgY29uc3QgdG9EZWxldGUgPSBzdGF0cy5maWx0ZXIoKHsgc3RhdCB9KSA9PiBub3cgLSBzdGF0Lm10aW1lTXMgPiBtYXhBZ2VNcylcblxuICAvLyBEZWxldGUgZmlsZXMgaW5kaXZpZHVhbGx5LCBjb250aW51aW5nIGV2ZW4gaWYgc29tZSBmYWlsXG4gIGNvbnN0IGRlbGV0ZVJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgdG9EZWxldGUubWFwKCh7IHBhdGggfSkgPT4gZnMucm0ocGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSlcbiAgKVxuXG4gIC8vIExvZyBmYWlsdXJlcyBidXQgZG9uJ3QgY3Jhc2hcbiAgZGVsZXRlUmVzdWx0cy5mb3JFYWNoKChyZXN1bHQsIGlkeCkgPT4ge1xuICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSAncmVqZWN0ZWQnKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBgW2xvZ2l4bHlzaWFdIEZhaWxlZCB0byBkZWxldGUgb2xkIGxvZyAke3RvRGVsZXRlW2lkeF0ucGF0aH06YCxcbiAgICAgICAgcmVzdWx0LnJlYXNvblxuICAgICAgKVxuICAgIH1cbiAgfSlcbn1cblxuZXhwb3J0IGNvbnN0IHBlcmZvcm1Sb3RhdGlvbiA9IGFzeW5jIChcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgY29uZmlnOiBMb2dSb3RhdGlvbkNvbmZpZ1xuKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IHJvdGF0ZWQgPSBhd2FpdCByb3RhdGVGaWxlKGZpbGVQYXRoKVxuICBpZiAoIXJvdGF0ZWQpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHNob3VsZENvbXByZXNzID0gY29uZmlnLmNvbXByZXNzID09PSB0cnVlXG4gIGlmIChzaG91bGRDb21wcmVzcykge1xuICAgIGNvbnN0IGFsZ28gPSBjb25maWcuY29tcHJlc3Npb24gPz8gJ2d6aXAnXG4gICAgaWYgKGFsZ28gPT09ICdnemlwJykge1xuICAgICAgYXdhaXQgY29tcHJlc3NGaWxlKHJvdGF0ZWQpXG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5tYXhGaWxlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgcmV0ZW50aW9uID0gcGFyc2VSZXRlbnRpb24oY29uZmlnLm1heEZpbGVzKVxuICAgIGlmIChyZXRlbnRpb24udHlwZSA9PT0gJ2NvdW50Jykge1xuICAgICAgYXdhaXQgY2xlYW51cEJ5Q291bnQoZmlsZVBhdGgsIHJldGVudGlvbi52YWx1ZSlcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgY2xlYW51cEJ5VGltZShmaWxlUGF0aCwgcmV0ZW50aW9uLnZhbHVlKVxuICAgIH1cbiAgfVxuXG4gIC8vIE9wdGlvbmFsIGludGVydmFsLWJhc2VkIHJvdGF0aW9uIGNsZWFudXAgKGNyZWF0ZSBpbnRlcnZhbCBkaXJlY3RvcmllcyAvIG5hbWluZykgaXMgbm90IHJlcXVpcmVkIGJ5IHRlc3RzLlxufVxuIiwKICAgICJpbXBvcnQgeyBwcm9taXNlcyBhcyBmcyB9IGZyb20gJ25vZGU6ZnMnXG5pbXBvcnQgeyBiYXNlbmFtZSwgZGlybmFtZSB9IGZyb20gJ25vZGU6cGF0aCdcblxuY29uc3QgU0laRV9SRUdFWCA9IC9eKFxcZCsoPzpcXC5cXGQrKT8pKGt8a2J8bXxtYnxnfGdiKSQvaVxuY29uc3QgSU5URVJWQUxfUkVHRVggPSAvXihcXGQrKShofGR8dykkL2lcbmNvbnN0IFJPVEFURURfUkVHRVggPVxuICAvXFwuKFxcZHs0fS1cXGR7Mn0tXFxkezJ9LVxcZHsyfS1cXGR7Mn0tXFxkezJ9KD86LVxcZHszfSk/KD86LVxcZCspPykoPzpcXC5neik/JC9cblxuZXhwb3J0IGNvbnN0IHBhcnNlU2l6ZSA9ICh2YWx1ZTogbnVtYmVyIHwgc3RyaW5nKTogbnVtYmVyID0+IHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuXG4gIGNvbnN0IHRyaW1tZWQgPSB2YWx1ZS50cmltKClcbiAgY29uc3QgYXNOdW1iZXIgPSBOdW1iZXIodHJpbW1lZClcbiAgaWYgKE51bWJlci5pc0Zpbml0ZShhc051bWJlcikpIHtcbiAgICByZXR1cm4gYXNOdW1iZXJcbiAgfVxuXG4gIGNvbnN0IG1hdGNoID0gdHJpbW1lZC5tYXRjaChTSVpFX1JFR0VYKVxuICBpZiAoIW1hdGNoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHNpemUgZm9ybWF0OiAke3ZhbHVlfWApXG4gIH1cblxuICBjb25zdCBhbW91bnQgPSBOdW1iZXIobWF0Y2hbMV0pXG4gIGNvbnN0IHVuaXQgPSBtYXRjaFsyXS50b0xvd2VyQ2FzZSgpXG5cbiAgbGV0IGJhc2UgPSAxMDI0XG4gIGlmICh1bml0LnN0YXJ0c1dpdGgoJ20nKSkge1xuICAgIGJhc2UgPSAxMDI0ICogMTAyNFxuICB9IGVsc2UgaWYgKHVuaXQuc3RhcnRzV2l0aCgnZycpKSB7XG4gICAgYmFzZSA9IDEwMjQgKiAxMDI0ICogMTAyNFxuICB9XG5cbiAgcmV0dXJuIE1hdGguZmxvb3IoYW1vdW50ICogYmFzZSlcbn1cblxuZXhwb3J0IGNvbnN0IHBhcnNlSW50ZXJ2YWwgPSAodmFsdWU6IHN0cmluZyk6IG51bWJlciA9PiB7XG4gIGNvbnN0IG1hdGNoID0gdmFsdWUudHJpbSgpLm1hdGNoKElOVEVSVkFMX1JFR0VYKVxuICBpZiAoIW1hdGNoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGludGVydmFsIGZvcm1hdDogJHt2YWx1ZX1gKVxuICB9XG5cbiAgY29uc3QgYW1vdW50ID0gTnVtYmVyKG1hdGNoWzFdKVxuICBjb25zdCB1bml0ID0gbWF0Y2hbMl0udG9Mb3dlckNhc2UoKVxuXG4gIGxldCBtcyA9IDYwICogNjAgKiAxMDAwXG4gIGlmICh1bml0ID09PSAnZCcpIHtcbiAgICBtcyA9IDI0ICogNjAgKiA2MCAqIDEwMDBcbiAgfSBlbHNlIGlmICh1bml0ID09PSAndycpIHtcbiAgICBtcyA9IDcgKiAyNCAqIDYwICogNjAgKiAxMDAwXG4gIH1cblxuICByZXR1cm4gYW1vdW50ICogbXNcbn1cblxuZXhwb3J0IGNvbnN0IHBhcnNlUmV0ZW50aW9uID0gKFxuICB2YWx1ZTogbnVtYmVyIHwgc3RyaW5nXG4pOiB7IHR5cGU6ICdjb3VudCcgfCAndGltZSc7IHZhbHVlOiBudW1iZXIgfSA9PiB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIHsgdHlwZTogJ2NvdW50JywgdmFsdWUgfVxuICB9XG4gIHJldHVybiB7IHR5cGU6ICd0aW1lJywgdmFsdWU6IHBhcnNlSW50ZXJ2YWwodmFsdWUpIH1cbn1cblxuZXhwb3J0IGNvbnN0IHNob3VsZFJvdGF0ZUJ5U2l6ZSA9IGFzeW5jIChcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgbWF4U2l6ZUJ5dGVzOiBudW1iZXJcbik6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IHN0YXQgPSBhd2FpdCBmcy5zdGF0KGZpbGVQYXRoKVxuICAgIHJldHVybiBzdGF0LnNpemUgPiBtYXhTaXplQnl0ZXNcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGdldFJvdGF0ZWRGaWxlcyA9IGFzeW5jIChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmdbXT4gPT4ge1xuICBjb25zdCBkaXIgPSBkaXJuYW1lKGZpbGVQYXRoKVxuICBjb25zdCBiYXNlID0gYmFzZW5hbWUoZmlsZVBhdGgpXG5cbiAgbGV0IGVudHJpZXM6IHN0cmluZ1tdXG4gIHRyeSB7XG4gICAgZW50cmllcyA9IGF3YWl0IGZzLnJlYWRkaXIoZGlyKVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gW11cbiAgfVxuXG4gIHJldHVybiBlbnRyaWVzXG4gICAgLmZpbHRlcihuYW1lID0+IG5hbWUuc3RhcnRzV2l0aChgJHtiYXNlfS5gKSAmJiBST1RBVEVEX1JFR0VYLnRlc3QobmFtZSkpXG4gICAgLm1hcChuYW1lID0+IGAke2Rpcn0vJHtuYW1lfWApXG59XG4iLAogICAgIi8vIExvY2FsIHBhcnQg4omkNjQsIGRvbWFpbiDiiaQyNTMsIFRMRCAy4oCTNjMgKFJGQyA1MzIxIC8gMTAzNS1pc2ggbGltaXRzOyBib3VuZGVkIHRvIGF2b2lkIFJlRG9TKVxuY29uc3QgRU1BSUxfUkVHRVggPVxuICAvW2EtekEtWjAtOS5fJSstXXsxLDY0fUBbYS16QS1aMC05Li1dezEsMjUzfVxcLlthLXpBLVpdezIsNjN9L2dcbmNvbnN0IElQVjRfUkVHRVggPSAvXFxiKD86XFxkezEsM31cXC4pezN9XFxkezEsM31cXGIvZ1xuLyoqIERpZ2l0IHJ1bnMgdGhhdCBtYXkgYmUgZm9ybWF0dGVkIFBBTnMgKHNwYWNlcy9kYXNoZXMpOyB2YWxpZGF0ZWQgd2l0aCBMdWhuIGJlZm9yZSByZWRhY3RpbmcuICovXG5jb25zdCBDUkVESVRfQ0FSRF9DQU5ESURBVEVfUkVHRVggPSAvXFxiKD86XFxkWyAtXSo/KXsxMywxOX1cXGIvZ1xuY29uc3QgSldUX1JFR0VYID0gL2V5SlthLXpBLVowLTlfLV0rXFwuZXlKW2EtekEtWjAtOV8tXStcXC5bYS16QS1aMC05Xy1dKy9nXG5cbmNvbnN0IFBBTl9NSU5fTEVOID0gMTNcbmNvbnN0IFBBTl9NQVhfTEVOID0gMTlcblxuY29uc3QgUkVEQUNURURfVEVYVCA9ICdbUkVEQUNURURdJ1xuY29uc3QgQ0lSQ1VMQVJfUkVGID0gJ1tDaXJjdWxhcl0nXG5cbi8qKlxuICogSG9zdCBhbmQgdXNlcmluZm8gY2Fubm90IGNvbnRhaW4gYFtSRURBQ1RFRF1gIOKAlCBgW2AgYmVnaW5zIGFuIElQdjYgbGl0ZXJhbCBpbiBVUkxzIGFuZCBicmVha3MgcGFyc2luZy5cbiAqL1xuY29uc3QgVVJMX1NBRkVfUkVEQUNUID0gJ3JlZGFjdGVkJ1xuXG5jb25zdCByZWRhY3RVcmxBdXRob3JpdHlTZWdtZW50ID0gKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcgPT5cbiAgcmVkYWN0U3RyaW5nKHZhbHVlKS5yZXBsYWNlQWxsKFJFREFDVEVEX1RFWFQsIFVSTF9TQUZFX1JFREFDVClcblxuLyoqIEFwcGx5IFBJSSByZWRhY3Rpb24gdG8gYSByZXF1ZXN0IFVSTCB3aGlsZSBrZWVwaW5nIHRoZSByZXN1bHQgcGFyc2VhYmxlIGJ5IHRoZSBVUkwvUmVxdWVzdCBjb25zdHJ1Y3RvcnMuICovXG5jb25zdCByZWRhY3RSZXF1ZXN0VXJsID0gKHVybFN0cmluZzogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCB1ID0gbmV3IFVSTCh1cmxTdHJpbmcpXG4gICAgaWYgKHUudXNlcm5hbWUgIT09ICcnKSB7XG4gICAgICB1LnVzZXJuYW1lID0gcmVkYWN0VXJsQXV0aG9yaXR5U2VnbWVudCh1LnVzZXJuYW1lKVxuICAgIH1cbiAgICBpZiAodS5wYXNzd29yZCAhPT0gJycpIHtcbiAgICAgIHUucGFzc3dvcmQgPSByZWRhY3RVcmxBdXRob3JpdHlTZWdtZW50KHUucGFzc3dvcmQpXG4gICAgfVxuICAgIHUuaG9zdG5hbWUgPSByZWRhY3RVcmxBdXRob3JpdHlTZWdtZW50KHUuaG9zdG5hbWUpXG4gICAgdS5wYXRobmFtZSA9IHJlZGFjdFN0cmluZyh1LnBhdGhuYW1lKVxuICAgIHUuc2VhcmNoID0gcmVkYWN0U3RyaW5nKHUuc2VhcmNoKVxuICAgIHUuaGFzaCA9IHJlZGFjdFN0cmluZyh1Lmhhc2gpXG4gICAgcmV0dXJuIHUudG9TdHJpbmcoKVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gcmVkYWN0U3RyaW5nKHVybFN0cmluZykucmVwbGFjZUFsbChSRURBQ1RFRF9URVhULCBVUkxfU0FGRV9SRURBQ1QpXG4gIH1cbn1cblxuLyoqIEx1aG4gY2hlY2tzdW07IGBkaWdpdHNgIG11c3QgY29udGFpbiBvbmx5IGAwLTlgIGFuZCBsZW5ndGggaW4gUEFOIHJhbmdlLiAqL1xuY29uc3QgcGFzc2VzTHVobiA9IChkaWdpdHM6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICBpZiAoZGlnaXRzLmxlbmd0aCA8IFBBTl9NSU5fTEVOIHx8IGRpZ2l0cy5sZW5ndGggPiBQQU5fTUFYX0xFTikge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgbGV0IHN1bSA9IDBcbiAgbGV0IGFsdGVybmF0ZSA9IGZhbHNlXG5cbiAgZm9yIChsZXQgaSA9IGRpZ2l0cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGNvbnN0IGNvZGUgPSBkaWdpdHMuY2hhckNvZGVBdChpKVxuICAgIGlmIChjb2RlIDwgNDggfHwgY29kZSA+IDU3KSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgbGV0IG4gPSBjb2RlIC0gNDhcbiAgICBpZiAoYWx0ZXJuYXRlKSB7XG4gICAgICBuICo9IDJcbiAgICAgIGlmIChuID4gOSkge1xuICAgICAgICBuIC09IDlcbiAgICAgIH1cbiAgICB9XG4gICAgc3VtICs9IG5cbiAgICBhbHRlcm5hdGUgPSAhYWx0ZXJuYXRlXG4gIH1cblxuICByZXR1cm4gc3VtICUgMTAgPT09IDBcbn1cblxuY29uc3QgcmVkYWN0Q3JlZGl0Q2FyZENhbmRpZGF0ZXMgPSAodGV4dDogc3RyaW5nKTogc3RyaW5nID0+XG4gIHRleHQucmVwbGFjZShDUkVESVRfQ0FSRF9DQU5ESURBVEVfUkVHRVgsIG1hdGNoID0+IHtcbiAgICBjb25zdCBkaWdpdHMgPSBtYXRjaC5yZXBsYWNlKC9cXEQvZywgJycpXG4gICAgaWYgKFxuICAgICAgZGlnaXRzLmxlbmd0aCA+PSBQQU5fTUlOX0xFTiAmJlxuICAgICAgZGlnaXRzLmxlbmd0aCA8PSBQQU5fTUFYX0xFTiAmJlxuICAgICAgcGFzc2VzTHVobihkaWdpdHMpXG4gICAgKSB7XG4gICAgICByZXR1cm4gUkVEQUNURURfVEVYVFxuICAgIH1cbiAgICByZXR1cm4gbWF0Y2hcbiAgfSlcblxuZXhwb3J0IGNvbnN0IHJlZGFjdFN0cmluZyA9ICh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBsZXQgcmVzdWx0ID0gdGV4dFxuXG4gIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKEVNQUlMX1JFR0VYLCBSRURBQ1RFRF9URVhUKVxuICByZXN1bHQgPSByZXN1bHQucmVwbGFjZShJUFY0X1JFR0VYLCBSRURBQ1RFRF9URVhUKVxuICByZXN1bHQgPSByZWRhY3RDcmVkaXRDYXJkQ2FuZGlkYXRlcyhyZXN1bHQpXG4gIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKEpXVF9SRUdFWCwgUkVEQUNURURfVEVYVClcblxuICByZXR1cm4gcmVzdWx0XG59XG5cbmNvbnN0IHJlZGFjdEVycm9yQ2xvbmUgPSAoXG4gIG9yaWdpbmFsRXJyb3I6IEVycm9yLFxuICBpblByb2dyZXNzOiBXZWFrU2V0PG9iamVjdD5cbik6IEVycm9yICYgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT4ge1xuICBjb25zdCByZWRhY3RlZE1lc3NhZ2UgPSByZWRhY3RTdHJpbmcob3JpZ2luYWxFcnJvci5tZXNzYWdlKVxuICBjb25zdCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvcmlnaW5hbEVycm9yKSBhcyBvYmplY3RcbiAgY29uc3QgbmV3RXJyb3IgPSBPYmplY3QuY3JlYXRlKHByb3RvKSBhcyBFcnJvciAmIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG5cbiAgbmV3RXJyb3IubWVzc2FnZSA9IHJlZGFjdGVkTWVzc2FnZVxuICBuZXdFcnJvci5uYW1lID0gb3JpZ2luYWxFcnJvci5uYW1lXG5cbiAgaWYgKG9yaWdpbmFsRXJyb3Iuc3RhY2sgIT09IHVuZGVmaW5lZCkge1xuICAgIG5ld0Vycm9yLnN0YWNrID0gcmVkYWN0U3RyaW5nKG9yaWdpbmFsRXJyb3Iuc3RhY2spXG4gIH1cblxuICBjb25zdCBlcnJvclJlY29yZCA9IG9yaWdpbmFsRXJyb3IgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuXG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGVycm9yUmVjb3JkKSkge1xuICAgIGlmIChrZXkgIT09ICdtZXNzYWdlJyAmJiBrZXkgIT09ICduYW1lJyAmJiBrZXkgIT09ICdzdGFjaycpIHtcbiAgICAgIG5ld0Vycm9yW2tleV0gPSByZWRhY3RJbm5lcihlcnJvclJlY29yZFtrZXldLCBpblByb2dyZXNzKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXdFcnJvclxufVxuXG5jb25zdCByZWRhY3RBcnJheUl0ZW1zID0gKFxuICB2YWx1ZTogdW5rbm93bltdLFxuICBpblByb2dyZXNzOiBXZWFrU2V0PG9iamVjdD5cbik6IHVua25vd25bXSA9PiB7XG4gIGNvbnN0IHJlZGFjdGVkQXJyYXk6IHVua25vd25bXSA9IEFycmF5LmZyb20oeyBsZW5ndGg6IHZhbHVlLmxlbmd0aCB9KVxuICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgcmVkYWN0ZWRBcnJheVtpXSA9IHJlZGFjdElubmVyKHZhbHVlW2ldLCBpblByb2dyZXNzKVxuICB9XG4gIHJldHVybiByZWRhY3RlZEFycmF5XG59XG5cbmNvbnN0IHJlZGFjdFJlY29yZEVudHJpZXMgPSAoXG4gIHJlY29yZFZhbHVlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgaW5Qcm9ncmVzczogV2Vha1NldDxvYmplY3Q+XG4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PiB7XG4gIGNvbnN0IHJlZGFjdGVkUmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9XG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHJlY29yZFZhbHVlKSkge1xuICAgIHJlZGFjdGVkUmVjb3JkW2tleV0gPSByZWRhY3RJbm5lcihyZWNvcmRWYWx1ZVtrZXldLCBpblByb2dyZXNzKVxuICB9XG4gIHJldHVybiByZWRhY3RlZFJlY29yZFxufVxuXG5jb25zdCB3aXRoUmVlbnRyYW5jeUd1YXJkID0gPFQ+KFxuICBvYmo6IG9iamVjdCxcbiAgaW5Qcm9ncmVzczogV2Vha1NldDxvYmplY3Q+LFxuICBydW46ICgpID0+IFRcbik6IFQgPT4ge1xuICBpblByb2dyZXNzLmFkZChvYmopXG4gIHRyeSB7XG4gICAgcmV0dXJuIHJ1bigpXG4gIH0gZmluYWxseSB7XG4gICAgaW5Qcm9ncmVzcy5kZWxldGUob2JqKVxuICB9XG59XG5cbmNvbnN0IHJlZGFjdElubmVyID0gPFQ+KHZhbHVlOiBULCBpblByb2dyZXNzOiBXZWFrU2V0PG9iamVjdD4pOiBUID0+IHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHJlZGFjdFN0cmluZyh2YWx1ZSkgYXMgdW5rbm93biBhcyBUXG4gIH1cblxuICBjb25zdCB0eXBlID0gdHlwZW9mIHZhbHVlXG4gIGlmICh0eXBlICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgIHJldHVybiBuZXcgRGF0ZSh2YWx1ZS5nZXRUaW1lKCkpIGFzIHVua25vd24gYXMgVFxuICB9XG5cbiAgY29uc3Qgb2JqID0gdmFsdWUgYXMgb2JqZWN0XG4gIGlmIChpblByb2dyZXNzLmhhcyhvYmopKSB7XG4gICAgcmV0dXJuIENJUkNVTEFSX1JFRiBhcyB1bmtub3duIGFzIFRcbiAgfVxuXG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgcmV0dXJuIHdpdGhSZWVudHJhbmN5R3VhcmQob2JqLCBpblByb2dyZXNzLCAoKSA9PlxuICAgICAgcmVkYWN0RXJyb3JDbG9uZSh2YWx1ZSwgaW5Qcm9ncmVzcylcbiAgICApIGFzIHVua25vd24gYXMgVFxuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuIHdpdGhSZWVudHJhbmN5R3VhcmQob2JqLCBpblByb2dyZXNzLCAoKSA9PlxuICAgICAgcmVkYWN0QXJyYXlJdGVtcyh2YWx1ZSwgaW5Qcm9ncmVzcylcbiAgICApIGFzIHVua25vd24gYXMgVFxuICB9XG5cbiAgcmV0dXJuIHdpdGhSZWVudHJhbmN5R3VhcmQob2JqLCBpblByb2dyZXNzLCAoKSA9PlxuICAgIHJlZGFjdFJlY29yZEVudHJpZXModmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGluUHJvZ3Jlc3MpXG4gICkgYXMgdW5rbm93biBhcyBUXG59XG5cbmV4cG9ydCBjb25zdCByZWRhY3QgPSA8VD4odmFsdWU6IFQpOiBUID0+IHJlZGFjdElubmVyKHZhbHVlLCBuZXcgV2Vha1NldCgpKVxuXG4vKipcbiAqIENsb25lIHJlcXVlc3QgVVJMIGFuZCBoZWFkZXJzIGZvciBsb2dnaW5nIHdpdGggdGhlIHNhbWUgc3RyaW5nIHJlZGFjdGlvbiBhcyB7QGxpbmsgcmVkYWN0fS5cbiAqIFByZXNlcnZlcyBib2R5IGFuZCBzaWduYWwgc28gdGhlIG9yaWdpbmFsIHJlcXVlc3QgaXMgc3RpbGwgdXNhYmxlLlxuICovXG5leHBvcnQgY29uc3QgcmVkYWN0UmVxdWVzdCA9IChyZXF1ZXN0OiBSZXF1ZXN0KTogUmVxdWVzdCA9PiB7XG4gIGNvbnN0IHJlZGFjdGVkVXJsID0gcmVkYWN0UmVxdWVzdFVybChyZXF1ZXN0LnVybClcbiAgY29uc3QgbmV4dEhlYWRlcnMgPSBuZXcgSGVhZGVycygpXG4gIGxldCBoZWFkZXJzQ2hhbmdlZCA9IGZhbHNlXG5cbiAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIHJlcXVlc3QuaGVhZGVycy5lbnRyaWVzKCkpIHtcbiAgICBjb25zdCByZWRhY3RlZCA9IHJlZGFjdFN0cmluZyh2YWx1ZSlcbiAgICBpZiAocmVkYWN0ZWQgIT09IHZhbHVlKSB7XG4gICAgICBoZWFkZXJzQ2hhbmdlZCA9IHRydWVcbiAgICB9XG4gICAgbmV4dEhlYWRlcnMuc2V0KG5hbWUsIHJlZGFjdGVkKVxuICB9XG5cbiAgY29uc3QgcmVkYWN0ZWRNZXRob2QgPSByZWRhY3RTdHJpbmcocmVxdWVzdC5tZXRob2QpXG4gIGNvbnN0IHVybENoYW5nZWQgPSByZWRhY3RlZFVybCAhPT0gcmVxdWVzdC51cmxcbiAgY29uc3QgbWV0aG9kQ2hhbmdlZCA9IHJlZGFjdGVkTWV0aG9kICE9PSByZXF1ZXN0Lm1ldGhvZFxuXG4gIGlmICghKHVybENoYW5nZWQgfHwgaGVhZGVyc0NoYW5nZWQgfHwgbWV0aG9kQ2hhbmdlZCkpIHtcbiAgICByZXR1cm4gcmVxdWVzdFxuICB9XG5cbiAgY29uc3QgaW5pdDogUmVxdWVzdEluaXQgJiB7IGR1cGxleD86ICdoYWxmJyB9ID0ge1xuICAgIG1ldGhvZDogcmVkYWN0ZWRNZXRob2QsXG4gICAgaGVhZGVyczogbmV4dEhlYWRlcnMsXG4gICAgcmVkaXJlY3Q6IHJlcXVlc3QucmVkaXJlY3QsXG4gICAgc2lnbmFsOiByZXF1ZXN0LnNpZ25hbFxuICB9XG5cbiAgaWYgKHJlcXVlc3QuYm9keSAhPT0gbnVsbCkge1xuICAgIGluaXQuYm9keSA9IHJlcXVlc3QuYm9keVxuICAgIGluaXQuZHVwbGV4ID0gJ2hhbGYnXG4gIH1cblxuICByZXR1cm4gbmV3IFJlcXVlc3QocmVkYWN0ZWRVcmwsIGluaXQpXG59XG4iLAogICAgImltcG9ydCB7IFNUQVRVU19DT0RFUyB9IGZyb20gJ25vZGU6aHR0cCdcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsaydcbmltcG9ydCB7IGdldFN0YXR1c0NvZGUgfSBmcm9tICcuLi9oZWxwZXJzL3N0YXR1cydcbmltcG9ydCB0eXBlIHtcbiAgTG9nTGV2ZWwsXG4gIE9wdGlvbnMsXG4gIFBpbm8sXG4gIFJlcXVlc3RJbmZvLFxuICBTdG9yZURhdGFcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcydcbmltcG9ydCB7IHBhcnNlRXJyb3IgfSBmcm9tICcuLi91dGlscy9lcnJvcidcblxuY29uc3QgcGFkMiA9ICh2YWx1ZTogbnVtYmVyKTogc3RyaW5nID0+IFN0cmluZyh2YWx1ZSkucGFkU3RhcnQoMiwgJzAnKVxuY29uc3QgcGFkMyA9ICh2YWx1ZTogbnVtYmVyKTogc3RyaW5nID0+IFN0cmluZyh2YWx1ZSkucGFkU3RhcnQoMywgJzAnKVxuXG5jb25zdCBERUZBVUxUX1NMT1dfTVMgPSA1MDBcbmNvbnN0IERFRkFVTFRfVkVSWV9TTE9XX01TID0gMTAwMFxuY29uc3QgTUVUSE9EX1BBRCA9IDdcblxuY29uc3QgREVGQVVMVF9MT0dfRk9STUFUID1cbiAgJ3tub3d9IHtzZXJ2aWNlfXtpY29ufSB7bWV0aG9kfSB7cGF0aG5hbWV9IHtzdGF0dXN9IHtkdXJhdGlvbn0ge21lc3NhZ2V9e3NwZWVkfSdcblxuY29uc3QgTE9HX0ZPUk1BVF9SRUdFWCA9XG4gIC9cXHsobm93fGVwb2NofGxldmVsfGljb258ZHVyYXRpb258bWV0aG9kfHBhdGhuYW1lfHBhdGh8cXVlcnl8c3RhdHVzfHN0YXR1c1RleHR8bWVzc2FnZXxpcHxjb250ZXh0fHNlcnZpY2V8c3BlZWQpXFx9L2dcblxuZXhwb3J0IGludGVyZmFjZSBGb3JtYXR0ZWRMb2dPdXRwdXQge1xuICBjb250ZXh0TGluZXM6IHN0cmluZ1tdXG4gIG1haW46IHN0cmluZ1xufVxuXG5jb25zdCBzaG91bGRVc2VDb2xvcnMgPSAob3B0aW9uczogT3B0aW9ucyk6IGJvb2xlYW4gPT4ge1xuICBjb25zdCBjb25maWcgPSBvcHRpb25zLmNvbmZpZ1xuICBjb25zdCBlbmFibGVkQnlDb25maWcgPSBjb25maWc/LnVzZUNvbG9ycyA/PyB0cnVlXG5cbiAgLy8gQXZvaWQgQU5TSSBzZXF1ZW5jZXMgaW4gbm9uLWludGVyYWN0aXZlIG91dHB1dCAocGlwZXMsIENJIGxvZ3MsIGZpbGVzKS5cbiAgY29uc3QgaXNUdHkgPSB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgcHJvY2Vzcy5zdGRvdXQ/LmlzVFRZID09PSB0cnVlXG4gIHJldHVybiBlbmFibGVkQnlDb25maWcgJiYgaXNUdHlcbn1cblxuY29uc3QgZm9ybWF0VGltZXN0YW1wID0gKGRhdGU6IERhdGUsIHBhdHRlcm4/OiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBpZiAoIXBhdHRlcm4pIHtcbiAgICByZXR1cm4gZGF0ZS50b0lTT1N0cmluZygpXG4gIH1cblxuICBjb25zdCB5eXl5ID0gU3RyaW5nKGRhdGUuZ2V0RnVsbFllYXIoKSlcbiAgY29uc3QgbW0gPSBwYWQyKGRhdGUuZ2V0TW9udGgoKSArIDEpXG4gIGNvbnN0IGRkID0gcGFkMihkYXRlLmdldERhdGUoKSlcbiAgY29uc3QgSEggPSBwYWQyKGRhdGUuZ2V0SG91cnMoKSlcbiAgY29uc3QgTU0gPSBwYWQyKGRhdGUuZ2V0TWludXRlcygpKVxuICBjb25zdCBzcyA9IHBhZDIoZGF0ZS5nZXRTZWNvbmRzKCkpXG4gIGNvbnN0IFNTUyA9IHBhZDMoZGF0ZS5nZXRNaWxsaXNlY29uZHMoKSlcblxuICByZXR1cm4gcGF0dGVyblxuICAgIC5yZXBsYWNlQWxsKCd5eXl5JywgeXl5eSlcbiAgICAucmVwbGFjZUFsbCgnbW0nLCBtbSlcbiAgICAucmVwbGFjZUFsbCgnZGQnLCBkZClcbiAgICAucmVwbGFjZUFsbCgnSEgnLCBISClcbiAgICAucmVwbGFjZUFsbCgnTU0nLCBNTSlcbiAgICAucmVwbGFjZUFsbCgnc3MnLCBzcylcbiAgICAucmVwbGFjZUFsbCgnU1NTJywgU1NTKVxufVxuXG4vKiogUmVzb2x2ZXMgY2xpZW50IElQIGZyb20geC1mb3J3YXJkZWQtZm9yIChmaXJzdCBJUCkgb3IgeC1yZWFsLWlwLiBFbXB0eSB3aGVuIG5laXRoZXIgaGVhZGVyIGlzIHNldCAoZS5nLiBsb2NhbGhvc3QpLiAqL1xuY29uc3QgZ2V0SXAgPSAocmVxdWVzdDogUmVxdWVzdEluZm8pOiBzdHJpbmcgPT4ge1xuICBjb25zdCBmb3J3YXJkZWQgPSByZXF1ZXN0LmhlYWRlcnMuZ2V0KCd4LWZvcndhcmRlZC1mb3InKVxuICBpZiAoZm9yd2FyZGVkKSB7XG4gICAgcmV0dXJuIGZvcndhcmRlZC5zcGxpdCgnLCcpWzBdPy50cmltKCkgPz8gJydcbiAgfVxuICByZXR1cm4gcmVxdWVzdC5oZWFkZXJzLmdldCgneC1yZWFsLWlwJykgPz8gJydcbn1cblxuZXhwb3J0IGNvbnN0IGZvcm1hdER1cmF0aW9uID0gKG1zOiBudW1iZXIpOiBzdHJpbmcgPT4ge1xuICBpZiAobXMgPj0gMTAwMCkge1xuICAgIGNvbnN0IHNlYyA9IG1zIC8gMTAwMFxuICAgIGlmIChzZWMgPj0gMTApIHtcbiAgICAgIHJldHVybiBgJHtNYXRoLnJvdW5kKHNlYyl9c2BcbiAgICB9XG4gICAgY29uc3Qgb25lRGVjaW1hbCA9IHNlYy50b0ZpeGVkKDEpXG4gICAgcmV0dXJuIG9uZURlY2ltYWwuZW5kc1dpdGgoJy4wJykgPyBgJHtNYXRoLnJvdW5kKHNlYyl9c2AgOiBgJHtvbmVEZWNpbWFsfXNgXG4gIH1cbiAgaWYgKG1zID4gMCAmJiBtcyA8IDEpIHtcbiAgICByZXR1cm4gYCR7bXMudG9GaXhlZCgyKX1tc2BcbiAgfVxuICByZXR1cm4gYCR7TWF0aC5yb3VuZChtcyl9bXNgXG59XG5cbmNvbnN0IGdldFNsb3dUaHJlc2hvbGRzID0gKFxuICBvcHRpb25zOiBPcHRpb25zXG4pOiB7IHNsb3c6IG51bWJlcjsgdmVyeVNsb3c6IG51bWJlciB9ID0+IHtcbiAgY29uc3QgY29uZmlnID0gb3B0aW9ucy5jb25maWdcbiAgcmV0dXJuIHtcbiAgICBzbG93OiBjb25maWc/LnNsb3dUaHJlc2hvbGQgPz8gREVGQVVMVF9TTE9XX01TLFxuICAgIHZlcnlTbG93OiBjb25maWc/LnZlcnlTbG93VGhyZXNob2xkID8/IERFRkFVTFRfVkVSWV9TTE9XX01TXG4gIH1cbn1cblxuY29uc3QgY29sb3JEdXJhdGlvblRleHQgPSAoXG4gIG1zOiBudW1iZXIsXG4gIHVzZUNvbG9yczogYm9vbGVhbixcbiAgb3B0aW9uczogT3B0aW9uc1xuKTogeyB0ZXh0OiBzdHJpbmc7IGlzVmVyeVNsb3c6IGJvb2xlYW4gfSA9PiB7XG4gIGNvbnN0IHJhdyA9IGZvcm1hdER1cmF0aW9uKG1zKVxuICBjb25zdCB7IHNsb3csIHZlcnlTbG93IH0gPSBnZXRTbG93VGhyZXNob2xkcyhvcHRpb25zKVxuICBjb25zdCBpc1ZlcnlTbG93ID0gbXMgPj0gdmVyeVNsb3dcblxuICBpZiAoIXVzZUNvbG9ycykge1xuICAgIHJldHVybiB7IHRleHQ6IHJhdywgaXNWZXJ5U2xvdyB9XG4gIH1cblxuICBsZXQgY29sb3JlZCA9IHJhd1xuICBpZiAobXMgPCBzbG93KSB7XG4gICAgY29sb3JlZCA9IGNoYWxrLmdyZWVuKHJhdylcbiAgfSBlbHNlIGlmIChtcyA8IHZlcnlTbG93KSB7XG4gICAgY29sb3JlZCA9IGNoYWxrLnllbGxvdyhyYXcpXG4gIH0gZWxzZSB7XG4gICAgY29sb3JlZCA9IGNoYWxrLnJlZC5ib2xkKHJhdylcbiAgfVxuXG4gIHJldHVybiB7IHRleHQ6IGNvbG9yZWQsIGlzVmVyeVNsb3cgfVxufVxuXG5jb25zdCBnZXRTcGVlZFRva2VuID0gKGlzVmVyeVNsb3c6IGJvb2xlYW4sIHVzZUNvbG9yczogYm9vbGVhbik6IHN0cmluZyA9PiB7XG4gIGlmICghaXNWZXJ5U2xvdykge1xuICAgIHJldHVybiAnJ1xuICB9XG4gIGNvbnN0IGJhZGdlID0gJ+KaoSBzbG93J1xuICBpZiAoIXVzZUNvbG9ycykge1xuICAgIHJldHVybiBgICR7YmFkZ2V9YFxuICB9XG4gIHJldHVybiBgICR7Y2hhbGsueWVsbG93KGJhZGdlKX1gXG59XG5cbi8qKiBMb2dpeGx5c2lhIGJyYW5kOiBmb3ggZW1vamkgd2l0aCBsZXZlbC1jb2xvcmVkIGJhY2tncm91bmQgd2hlbiBjb2xvcnMgYXJlIGVuYWJsZWQuICovXG5jb25zdCBnZXRMZXZlbEljb24gPSAobGV2ZWw6IExvZ0xldmVsLCB1c2VDb2xvcnM6IGJvb2xlYW4pOiBzdHJpbmcgPT4ge1xuICBpZiAoIXVzZUNvbG9ycykge1xuICAgIHJldHVybiAn8J+miidcbiAgfVxuICBpZiAobGV2ZWwgPT09ICdFUlJPUicpIHtcbiAgICByZXR1cm4gY2hhbGsuYmdSZWQuYmxhY2soJyDwn6aKICcpXG4gIH1cbiAgaWYgKGxldmVsID09PSAnV0FSTklORycpIHtcbiAgICByZXR1cm4gY2hhbGsuYmdZZWxsb3cuYmxhY2soJyDwn6aKICcpXG4gIH1cbiAgaWYgKGxldmVsID09PSAnREVCVUcnKSB7XG4gICAgcmV0dXJuIGNoYWxrLmJnQmx1ZS5ibGFjaygnIPCfpoogJylcbiAgfVxuICByZXR1cm4gY2hhbGsuYmdHcmVlbi5ibGFjaygnIPCfpoogJylcbn1cblxuY29uc3QgZ2V0Q29sb3JlZExldmVsID0gKGxldmVsOiBMb2dMZXZlbCwgdXNlQ29sb3JzOiBib29sZWFuKTogc3RyaW5nID0+IHtcbiAgaWYgKCF1c2VDb2xvcnMpIHtcbiAgICByZXR1cm4gbGV2ZWxcbiAgfVxuXG4gIGlmIChsZXZlbCA9PT0gJ0VSUk9SJykge1xuICAgIHJldHVybiBjaGFsay5iZ1JlZC5ibGFjayhsZXZlbClcbiAgfVxuICBpZiAobGV2ZWwgPT09ICdXQVJOSU5HJykge1xuICAgIHJldHVybiBjaGFsay5iZ1llbGxvdy5ibGFjayhsZXZlbClcbiAgfVxuICBpZiAobGV2ZWwgPT09ICdERUJVRycpIHtcbiAgICByZXR1cm4gY2hhbGsuYmdCbHVlLmJsYWNrKGxldmVsKVxuICB9XG5cbiAgcmV0dXJuIGNoYWxrLmJnR3JlZW4uYmxhY2sobGV2ZWwpXG59XG5cbmNvbnN0IGdldENvbG9yZWRNZXRob2QgPSAobWV0aG9kOiBzdHJpbmcsIHVzZUNvbG9yczogYm9vbGVhbik6IHN0cmluZyA9PiB7XG4gIGlmICghdXNlQ29sb3JzKSB7XG4gICAgcmV0dXJuIG1ldGhvZFxuICB9XG5cbiAgY29uc3QgdXBwZXIgPSBtZXRob2QudG9VcHBlckNhc2UoKVxuICBpZiAodXBwZXIgPT09ICdHRVQnKSB7XG4gICAgcmV0dXJuIGNoYWxrLmdyZWVuLmJvbGQodXBwZXIpXG4gIH1cbiAgaWYgKHVwcGVyID09PSAnUE9TVCcpIHtcbiAgICByZXR1cm4gY2hhbGsuYmx1ZS5ib2xkKHVwcGVyKVxuICB9XG4gIGlmICh1cHBlciA9PT0gJ1BVVCcpIHtcbiAgICByZXR1cm4gY2hhbGsueWVsbG93LmJvbGQodXBwZXIpXG4gIH1cbiAgaWYgKHVwcGVyID09PSAnUEFUQ0gnKSB7XG4gICAgcmV0dXJuIGNoYWxrLnllbGxvd0JyaWdodC5ib2xkKHVwcGVyKVxuICB9XG4gIGlmICh1cHBlciA9PT0gJ0RFTEVURScpIHtcbiAgICByZXR1cm4gY2hhbGsucmVkLmJvbGQodXBwZXIpXG4gIH1cbiAgaWYgKHVwcGVyID09PSAnT1BUSU9OUycpIHtcbiAgICByZXR1cm4gY2hhbGsuY3lhbi5ib2xkKHVwcGVyKVxuICB9XG4gIGlmICh1cHBlciA9PT0gJ0hFQUQnKSB7XG4gICAgcmV0dXJuIGNoYWxrLmdyZWVuQnJpZ2h0LmJvbGQodXBwZXIpXG4gIH1cbiAgaWYgKHVwcGVyID09PSAnVFJBQ0UnKSB7XG4gICAgcmV0dXJuIGNoYWxrLm1hZ2VudGEuYm9sZCh1cHBlcilcbiAgfVxuICBpZiAodXBwZXIgPT09ICdDT05ORUNUJykge1xuICAgIHJldHVybiBjaGFsay5jeWFuQnJpZ2h0LmJvbGQodXBwZXIpXG4gIH1cblxuICByZXR1cm4gY2hhbGsud2hpdGUuYm9sZCh1cHBlcilcbn1cblxuY29uc3QgZ2V0Q29sb3JlZFN0YXR1cyA9IChzdGF0dXM6IHN0cmluZywgdXNlQ29sb3JzOiBib29sZWFuKTogc3RyaW5nID0+IHtcbiAgaWYgKCF1c2VDb2xvcnMpIHtcbiAgICByZXR1cm4gc3RhdHVzXG4gIH1cblxuICBjb25zdCBudW1lcmljID0gTnVtYmVyLnBhcnNlSW50KHN0YXR1cywgMTApXG4gIGlmICghTnVtYmVyLmlzRmluaXRlKG51bWVyaWMpKSB7XG4gICAgcmV0dXJuIHN0YXR1c1xuICB9XG5cbiAgaWYgKG51bWVyaWMgPj0gNTAwKSB7XG4gICAgcmV0dXJuIGNoYWxrLnJlZChzdGF0dXMpXG4gIH1cbiAgaWYgKG51bWVyaWMgPj0gNDAwKSB7XG4gICAgcmV0dXJuIGNoYWxrLnllbGxvdyhzdGF0dXMpXG4gIH1cbiAgaWYgKG51bWVyaWMgPj0gMzAwKSB7XG4gICAgcmV0dXJuIGNoYWxrLmN5YW4oc3RhdHVzKVxuICB9XG4gIGlmIChudW1lcmljID49IDIwMCkge1xuICAgIHJldHVybiBjaGFsay5ncmVlbihzdGF0dXMpXG4gIH1cbiAgcmV0dXJuIGNoYWxrLmdyYXkoc3RhdHVzKVxufVxuXG5jb25zdCBnZXRDb2xvcmVkVGltZXN0YW1wID0gKHRpbWVzdGFtcDogc3RyaW5nLCB1c2VDb2xvcnM6IGJvb2xlYW4pOiBzdHJpbmcgPT4ge1xuICBpZiAoIXVzZUNvbG9ycykge1xuICAgIHJldHVybiB0aW1lc3RhbXBcbiAgfVxuXG4gIHJldHVybiBjaGFsay5ncmF5KHRpbWVzdGFtcClcbn1cblxuY29uc3QgZ2V0Q29sb3JlZFBhdGhuYW1lID0gKHBhdGhuYW1lOiBzdHJpbmcsIHVzZUNvbG9yczogYm9vbGVhbik6IHN0cmluZyA9PiB7XG4gIGlmICghdXNlQ29sb3JzKSB7XG4gICAgcmV0dXJuIHBhdGhuYW1lXG4gIH1cblxuICByZXR1cm4gY2hhbGsud2hpdGVCcmlnaHQocGF0aG5hbWUpXG59XG5cbmNvbnN0IGdldFN0YXR1c1RleHQgPSAoc3RhdHVzQ29kZTogbnVtYmVyKTogc3RyaW5nID0+IHtcbiAgY29uc3QgdGV4dCA9IFNUQVRVU19DT0RFU1tzdGF0dXNDb2RlXVxuICByZXR1cm4gdGV4dCA/PyAnJ1xufVxuXG5jb25zdCBnZXRTZXJ2aWNlVG9rZW4gPSAob3B0aW9uczogT3B0aW9ucywgdXNlQ29sb3JzOiBib29sZWFuKTogc3RyaW5nID0+IHtcbiAgY29uc3QgbmFtZSA9IG9wdGlvbnMuY29uZmlnPy5zZXJ2aWNlPy50cmltKClcbiAgaWYgKCFuYW1lKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cbiAgY29uc3QgYnJhY2tldGVkID0gYFske25hbWV9XWBcbiAgaWYgKCF1c2VDb2xvcnMpIHtcbiAgICByZXR1cm4gYCR7YnJhY2tldGVkfSBgXG4gIH1cbiAgcmV0dXJuIGAke2NoYWxrLmRpbShicmFja2V0ZWQpfSBgXG59XG5cbmNvbnN0IHN0cmluZ2lmeVRyZWVWYWx1ZSA9ICh2YWx1ZTogdW5rbm93bik6IHN0cmluZyA9PiB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiAnbnVsbCdcbiAgfVxuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiAndW5kZWZpbmVkJ1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcbiAgICByZXR1cm4gU3RyaW5nKHZhbHVlKVxuICB9XG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgcmV0dXJuIHZhbHVlLm1lc3NhZ2VcbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSlcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIFN0cmluZyh2YWx1ZSlcbiAgfVxufVxuXG4vKiogTmVzdGVkIG9iamVjdHMgdG8gZXhwYW5kIGluIHRoZSBjb250ZXh0IHRyZWUgKGV4Y2x1ZGVzIEFycmF5cywgRXJyb3IsIERhdGUpLiAqL1xuY29uc3QgaXNFeHBhbmRhYmxlT2JqZWN0ID0gKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT5cbiAgdmFsdWUgIT09IG51bGwgJiZcbiAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAhQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiZcbiAgISh2YWx1ZSBpbnN0YW5jZW9mIEVycm9yKSAmJlxuICAhKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSlcblxuY29uc3QgY29sbGVjdENvbnRleHRFbnRyaWVzID0gKFxuICBvYmo6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBwcmVmaXg6IHN0cmluZyxcbiAgZGVwdGhSZW1haW5pbmc6IG51bWJlclxuKTogW3N0cmluZywgc3RyaW5nXVtdID0+IHtcbiAgY29uc3Qgb3V0OiBbc3RyaW5nLCBzdHJpbmddW10gPSBbXVxuICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhvYmopKSB7XG4gICAgY29uc3Qga2V5ID0gcHJlZml4ID8gYCR7cHJlZml4fS4ke2t9YCA6IGtcbiAgICBjb25zdCBleHBhbmRhYmxlID0gaXNFeHBhbmRhYmxlT2JqZWN0KHYpICYmIGRlcHRoUmVtYWluaW5nID4gMVxuXG4gICAgaWYgKGV4cGFuZGFibGUpIHtcbiAgICAgIG91dC5wdXNoKC4uLmNvbGxlY3RDb250ZXh0RW50cmllcyh2LCBrZXksIGRlcHRoUmVtYWluaW5nIC0gMSkpXG4gICAgfSBlbHNlIHtcbiAgICAgIG91dC5wdXNoKFtrZXksIHN0cmluZ2lmeVRyZWVWYWx1ZSh2KV0pXG4gICAgfVxuICB9XG4gIHJldHVybiBvdXRcbn1cblxuY29uc3QgZm9ybWF0RW50cmllc1RvVHJlZUxpbmVzID0gKFxuICBlbnRyaWVzOiBbc3RyaW5nLCBzdHJpbmddW10sXG4gIHVzZUNvbG9yczogYm9vbGVhblxuKTogc3RyaW5nW10gPT4ge1xuICBpZiAoZW50cmllcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gW11cbiAgfVxuXG4gIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdXG4gIGNvbnN0IGxhc3QgPSBlbnRyaWVzLmxlbmd0aCAtIDFcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgYnJhbmNoID0gaSA9PT0gbGFzdCA/ICfilJTilIAnIDogJ+KUnOKUgCdcbiAgICBjb25zdCBwYWlyID0gZW50cmllc1tpXVxuICAgIGlmICghcGFpcikge1xuICAgICAgY29udGludWVcbiAgICB9XG4gICAgY29uc3QgW2ssIHZdID0gcGFpclxuICAgIGNvbnN0IGtleVBhcnQgPSB1c2VDb2xvcnMgPyBjaGFsay5jeWFuKGspIDoga1xuICAgIGNvbnN0IHZhbFBhcnQgPSB1c2VDb2xvcnMgPyBjaGFsay53aGl0ZSh2KSA6IHZcbiAgICBsaW5lcy5wdXNoKGAgICR7YnJhbmNofSAke2tleVBhcnR9ICAke3ZhbFBhcnR9YClcbiAgfVxuICByZXR1cm4gbGluZXNcbn1cblxuZXhwb3J0IGNvbnN0IHJlbmRlckNvbnRleHRUcmVlTGluZXMgPSAoXG4gIGN0eDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIG9wdGlvbnM6IE9wdGlvbnMsXG4gIHVzZUNvbG9yczogYm9vbGVhblxuKTogc3RyaW5nW10gPT4ge1xuICBjb25zdCBkZXB0aCA9IG9wdGlvbnMuY29uZmlnPy5jb250ZXh0RGVwdGggPz8gMVxuICBpZiAoZGVwdGggPCAxKSB7XG4gICAgcmV0dXJuIFtdXG4gIH1cblxuICBjb25zdCBlbnRyaWVzID0gY29sbGVjdENvbnRleHRFbnRyaWVzKGN0eCwgJycsIGRlcHRoKVxuICByZXR1cm4gZm9ybWF0RW50cmllc1RvVHJlZUxpbmVzKGVudHJpZXMsIHVzZUNvbG9ycylcbn1cblxuZXhwb3J0IGNvbnN0IGJ1aWxkQ29udGV4dFRyZWVMaW5lcyA9IChcbiAgbGV2ZWw6IExvZ0xldmVsLFxuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgb3B0aW9uczogT3B0aW9uc1xuKTogc3RyaW5nW10gPT4ge1xuICBpZiAob3B0aW9ucy5jb25maWc/LnNob3dDb250ZXh0VHJlZSA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gW11cbiAgfVxuXG4gIGNvbnN0IHVzZUNvbG9ycyA9IHNob3VsZFVzZUNvbG9ycyhvcHRpb25zKVxuICBjb25zdCBkZXB0aCA9IG9wdGlvbnMuY29uZmlnPy5jb250ZXh0RGVwdGggPz8gMVxuXG4gIGNvbnN0IGVudHJpZXM6IFtzdHJpbmcsIHN0cmluZ11bXSA9IFtdXG5cbiAgY29uc3QgY3R4ID0gZGF0YS5jb250ZXh0XG4gIGlmIChcbiAgICBjdHggJiZcbiAgICB0eXBlb2YgY3R4ID09PSAnb2JqZWN0JyAmJlxuICAgICFBcnJheS5pc0FycmF5KGN0eCkgJiZcbiAgICBPYmplY3Qua2V5cyhjdHggYXMgb2JqZWN0KS5sZW5ndGggPiAwICYmXG4gICAgZGVwdGggPj0gMVxuICApIHtcbiAgICBlbnRyaWVzLnB1c2goXG4gICAgICAuLi5jb2xsZWN0Q29udGV4dEVudHJpZXMoY3R4IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCAnJywgZGVwdGgpXG4gICAgKVxuICB9XG5cbiAgaWYgKGxldmVsID09PSAnRVJST1InICYmICdlcnJvcicgaW4gZGF0YSAmJiBkYXRhLmVycm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBtc2cgPSBwYXJzZUVycm9yKGRhdGEuZXJyb3IpXG4gICAgaWYgKG1zZykge1xuICAgICAgZW50cmllcy5wdXNoKFsnZXJyb3InLCBtc2ddKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmb3JtYXRFbnRyaWVzVG9UcmVlTGluZXMoZW50cmllcywgdXNlQ29sb3JzKVxufVxuXG5jb25zdCBnZXRDb250ZXh0U3RyaW5nID0gKHZhbHVlOiB1bmtub3duKTogc3RyaW5nID0+IHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpXG4gIH1cblxuICByZXR1cm4gJydcbn1cblxuZXhwb3J0IGNvbnN0IGZvcm1hdExvZ091dHB1dCA9ICh7XG4gIGxldmVsLFxuICByZXF1ZXN0LFxuICBkYXRhLFxuICBzdG9yZSxcbiAgb3B0aW9uc1xufToge1xuICBsZXZlbDogTG9nTGV2ZWxcbiAgcmVxdWVzdDogUmVxdWVzdEluZm9cbiAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgc3RvcmU6IFN0b3JlRGF0YVxuICBvcHRpb25zOiBPcHRpb25zXG59KTogRm9ybWF0dGVkTG9nT3V0cHV0ID0+IHtcbiAgY29uc3QgY29uZmlnID0gb3B0aW9ucy5jb25maWdcbiAgY29uc3QgdXNlQ29sb3JzID0gc2hvdWxkVXNlQ29sb3JzKG9wdGlvbnMpXG4gIGNvbnN0IGZvcm1hdCA9IGNvbmZpZz8uY3VzdG9tTG9nRm9ybWF0ID8/IERFRkFVTFRfTE9HX0ZPUk1BVFxuXG4gIGNvbnN0IG5vdyA9IG5ldyBEYXRlKClcbiAgY29uc3QgZXBvY2ggPSBTdHJpbmcobm93LmdldFRpbWUoKSlcbiAgY29uc3QgcmF3VGltZXN0YW1wID0gZm9ybWF0VGltZXN0YW1wKG5vdywgY29uZmlnPy50aW1lc3RhbXA/LnRyYW5zbGF0ZVRpbWUpXG4gIGNvbnN0IHRpbWVzdGFtcCA9IGdldENvbG9yZWRUaW1lc3RhbXAocmF3VGltZXN0YW1wLCB1c2VDb2xvcnMpXG5cbiAgY29uc3QgbWVzc2FnZSA9IHR5cGVvZiBkYXRhLm1lc3NhZ2UgPT09ICdzdHJpbmcnID8gZGF0YS5tZXNzYWdlIDogJydcbiAgY29uc3QgZHVyYXRpb25NcyA9XG4gICAgc3RvcmUuYmVmb3JlVGltZSA9PT0gQmlnSW50KDApXG4gICAgICA/IDBcbiAgICAgIDogTnVtYmVyKHByb2Nlc3MuaHJ0aW1lLmJpZ2ludCgpIC0gc3RvcmUuYmVmb3JlVGltZSkgLyAxXzAwMF8wMDBcblxuICBsZXQgcmF3UGF0aG5hbWU6IHN0cmluZ1xuICBsZXQgc2VhcmNoOiBzdHJpbmdcbiAgdHJ5IHtcbiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHJlcXVlc3QudXJsKVxuICAgIHJhd1BhdGhuYW1lID0gdXJsLnBhdGhuYW1lXG4gICAgc2VhcmNoID0gdXJsLnNlYXJjaFxuICB9IGNhdGNoIHtcbiAgICByYXdQYXRobmFtZSA9IHJlcXVlc3QudXJsIHx8ICcvJ1xuICAgIHNlYXJjaCA9ICcnXG4gIH1cbiAgY29uc3QgcXVlcnkgPSBzZWFyY2hcbiAgY29uc3QgcGF0aG5hbWUgPSBjb25maWc/LmxvZ1F1ZXJ5UGFyYW1zXG4gICAgPyBgJHtyYXdQYXRobmFtZX0ke3F1ZXJ5fWBcbiAgICA6IHJhd1BhdGhuYW1lXG4gIGNvbnN0IHN0YXR1c1ZhbHVlID0gZGF0YS5zdGF0dXNcbiAgY29uc3Qgc3RhdHVzQ29kZSA9XG4gICAgc3RhdHVzVmFsdWUgPT09IG51bGwgfHwgc3RhdHVzVmFsdWUgPT09IHVuZGVmaW5lZFxuICAgICAgPyAyMDBcbiAgICAgIDogZ2V0U3RhdHVzQ29kZShzdGF0dXNWYWx1ZSlcbiAgY29uc3Qgc3RhdHVzID0gU3RyaW5nKHN0YXR1c0NvZGUpXG4gIGNvbnN0IGlwID0gY29uZmlnPy5pcCA9PT0gdHJ1ZSA/IGdldElwKHJlcXVlc3QpIDogJydcblxuICBjb25zdCBzaG93VHJlZSA9IGNvbmZpZz8uc2hvd0NvbnRleHRUcmVlICE9PSBmYWxzZVxuICBjb25zdCBjdHhTdHJpbmcgPVxuICAgIHNob3dUcmVlICYmXG4gICAgZGF0YS5jb250ZXh0ICYmXG4gICAgdHlwZW9mIGRhdGEuY29udGV4dCA9PT0gJ29iamVjdCcgJiZcbiAgICAhQXJyYXkuaXNBcnJheShkYXRhLmNvbnRleHQpICYmXG4gICAgT2JqZWN0LmtleXMoZGF0YS5jb250ZXh0IGFzIG9iamVjdCkubGVuZ3RoID4gMFxuICAgICAgPyAnJ1xuICAgICAgOiBnZXRDb250ZXh0U3RyaW5nKGRhdGEuY29udGV4dClcblxuICBjb25zdCBjb2xvcmVkTGV2ZWwgPSBnZXRDb2xvcmVkTGV2ZWwobGV2ZWwsIHVzZUNvbG9ycylcbiAgY29uc3QgbWV0aG9kUGFkZGVkID0gcmVxdWVzdC5tZXRob2QudG9VcHBlckNhc2UoKS5wYWRFbmQoTUVUSE9EX1BBRClcbiAgY29uc3QgY29sb3JlZE1ldGhvZCA9IGdldENvbG9yZWRNZXRob2QobWV0aG9kUGFkZGVkLCB1c2VDb2xvcnMpXG4gIGNvbnN0IGNvbG9yZWRQYXRobmFtZSA9IGdldENvbG9yZWRQYXRobmFtZShwYXRobmFtZSwgdXNlQ29sb3JzKVxuICBjb25zdCBjb2xvcmVkU3RhdHVzID0gZ2V0Q29sb3JlZFN0YXR1cyhzdGF0dXMsIHVzZUNvbG9ycylcbiAgY29uc3QgeyB0ZXh0OiBjb2xvcmVkRHVyYXRpb24sIGlzVmVyeVNsb3cgfSA9IGNvbG9yRHVyYXRpb25UZXh0KFxuICAgIGR1cmF0aW9uTXMsXG4gICAgdXNlQ29sb3JzLFxuICAgIG9wdGlvbnNcbiAgKVxuICBjb25zdCBzcGVlZFRva2VuID0gZ2V0U3BlZWRUb2tlbihpc1ZlcnlTbG93LCB1c2VDb2xvcnMpXG4gIGNvbnN0IGljb24gPSBnZXRMZXZlbEljb24obGV2ZWwsIHVzZUNvbG9ycylcbiAgY29uc3Qgc3RhdHVzVGV4dCA9IGdldFN0YXR1c1RleHQoc3RhdHVzQ29kZSlcbiAgY29uc3Qgc2VydmljZVRva2VuID0gZ2V0U2VydmljZVRva2VuKG9wdGlvbnMsIHVzZUNvbG9ycylcblxuICBjb25zdCB0b2tlbk1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAne25vd30nOiB0aW1lc3RhbXAsXG4gICAgJ3tlcG9jaH0nOiBlcG9jaCxcbiAgICAne2xldmVsfSc6IGNvbG9yZWRMZXZlbCxcbiAgICAne2ljb259JzogaWNvbixcbiAgICAne2R1cmF0aW9ufSc6IGNvbG9yZWREdXJhdGlvbixcbiAgICAne21ldGhvZH0nOiBjb2xvcmVkTWV0aG9kLFxuICAgICd7cGF0aG5hbWV9JzogY29sb3JlZFBhdGhuYW1lLFxuICAgICd7cGF0aH0nOiBjb2xvcmVkUGF0aG5hbWUsXG4gICAgJ3txdWVyeX0nOiBxdWVyeSxcbiAgICAne3N0YXR1c30nOiBjb2xvcmVkU3RhdHVzLFxuICAgICd7c3RhdHVzVGV4dH0nOiBzdGF0dXNUZXh0LFxuICAgICd7bWVzc2FnZX0nOiBtZXNzYWdlLFxuICAgICd7aXB9JzogaXAsXG4gICAgJ3tjb250ZXh0fSc6IGN0eFN0cmluZyxcbiAgICAne3NlcnZpY2V9Jzogc2VydmljZVRva2VuLFxuICAgICd7c3BlZWR9Jzogc3BlZWRUb2tlblxuICB9XG5cbiAgY29uc3QgbWFpbiA9IGZvcm1hdC5yZXBsYWNlKFxuICAgIExPR19GT1JNQVRfUkVHRVgsXG4gICAgbWF0Y2ggPT4gdG9rZW5NYXBbbWF0Y2hdID8/IG1hdGNoXG4gIClcblxuICBjb25zdCBjb250ZXh0TGluZXMgPSBidWlsZENvbnRleHRUcmVlTGluZXMobGV2ZWwsIGRhdGEsIG9wdGlvbnMpXG5cbiAgcmV0dXJuIHsgbWFpbiwgY29udGV4dExpbmVzIH1cbn1cblxuLyoqIEBkZXByZWNhdGVkIFByZWZlciB7QGxpbmsgZm9ybWF0TG9nT3V0cHV0fSBmb3IgbXVsdGktbGluZSBjb250ZXh0IHRyZWVzLiBSZXR1cm5zIHRoZSBtYWluIGxpbmUgb25seS4gKi9cbmV4cG9ydCBjb25zdCBmb3JtYXRMaW5lID0gKGlucHV0OiB7XG4gIGxldmVsOiBMb2dMZXZlbFxuICByZXF1ZXN0OiBSZXF1ZXN0SW5mb1xuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICBzdG9yZTogU3RvcmVEYXRhXG4gIG9wdGlvbnM6IE9wdGlvbnNcbn0pOiBzdHJpbmcgPT5cbiAgZm9ybWF0TG9nT3V0cHV0KHtcbiAgICAuLi5pbnB1dCxcbiAgICBvcHRpb25zOiB7XG4gICAgICAuLi5pbnB1dC5vcHRpb25zLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIC4uLihpbnB1dC5vcHRpb25zLmNvbmZpZyA/PyB7fSksXG4gICAgICAgIHNob3dDb250ZXh0VHJlZTogZmFsc2VcbiAgICAgIH1cbiAgICB9XG4gIH0pLm1haW5cblxuZXhwb3J0IGNvbnN0IGxvZ1dpdGhQaW5vID0gKFxuICBsb2dnZXI6IFBpbm8sXG4gIGxldmVsOiBMb2dMZXZlbCxcbiAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbik6IHZvaWQgPT4ge1xuICBpZiAobGV2ZWwgPT09ICdFUlJPUicpIHtcbiAgICBsb2dnZXIuZXJyb3IoZGF0YSlcbiAgICByZXR1cm5cbiAgfVxuICBpZiAobGV2ZWwgPT09ICdXQVJOSU5HJykge1xuICAgIGxvZ2dlci53YXJuKGRhdGEpXG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKGxldmVsID09PSAnREVCVUcnKSB7XG4gICAgbG9nZ2VyLmRlYnVnKGRhdGEpXG4gICAgcmV0dXJuXG4gIH1cbiAgbG9nZ2VyLmluZm8oZGF0YSlcbn1cbiIsCiAgICAiaW1wb3J0IHsgU3RhdHVzTWFwIH0gZnJvbSAnZWx5c2lhJ1xuXG5jb25zdCBESUdJVFNfT05MWSA9IC9eXFxkKyQvXG5jb25zdCBERUxJTUlURVJTID0gL1tfLV0rL2dcbmNvbnN0IENBTUVMX0JPVU5EQVJZXzEgPSAvKFthLXowLTldKShbQS1aXSkvZ1xuY29uc3QgQ0FNRUxfQk9VTkRBUllfMiA9IC8oW0EtWl0pKFtBLVpdW2Etel0pL2dcbmNvbnN0IEFQT1NUUk9QSEVTID0gL1sn4oCZXS9nXG5jb25zdCBOT05fQUxQSEFOVU1FUklDID0gL1teYS16MC05XFxzXSsvZ1xuY29uc3QgV0hJVEVTUEFDRSA9IC9cXHMrL2dcblxuY29uc3Qgbm9ybWFsaXplU3RhdHVzTmFtZSA9ICh2YWx1ZTogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgLy8gSGFuZGxlcyBjb21tb24gdmFyaWFudHM6XG4gIC8vIC0gY2FzZSBkaWZmZXJlbmNlczogXCJub3QgZm91bmRcIiB2cyBcIk5vdCBGb3VuZFwiXG4gIC8vIC0gc3BhY2luZy9wdW5jdHVhdGlvbjogXCJOb3QtRm91bmRcIiwgXCJub3RfZm91bmRcIlxuICAvLyAtIGNhbWVsQ2FzZS9QYXNjYWxDYXNlOiBcIkludGVybmFsU2VydmVyRXJyb3JcIlxuICBjb25zdCB0cmltbWVkID0gdmFsdWUudHJpbSgpXG4gIGlmICghdHJpbW1lZCkge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgcmV0dXJuIHRyaW1tZWRcbiAgICAucmVwbGFjZShERUxJTUlURVJTLCAnICcpXG4gICAgLnJlcGxhY2UoQ0FNRUxfQk9VTkRBUllfMSwgJyQxICQyJylcbiAgICAucmVwbGFjZShDQU1FTF9CT1VOREFSWV8yLCAnJDEgJDInKVxuICAgIC5yZXBsYWNlKEFQT1NUUk9QSEVTLCAnJylcbiAgICAudG9Mb3dlckNhc2UoKVxuICAgIC5yZXBsYWNlKE5PTl9BTFBIQU5VTUVSSUMsICcgJylcbiAgICAucmVwbGFjZShXSElURVNQQUNFLCAnICcpXG4gICAgLnRyaW0oKVxufVxuXG5jb25zdCBTVEFUVVNfQllfTk9STUFMSVpFRF9OQU1FID0gKCgpID0+IHtcbiAgY29uc3QgbWFwID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKVxuXG4gIGZvciAoY29uc3QgW25hbWUsIGNvZGVdIG9mIE9iamVjdC5lbnRyaWVzKFN0YXR1c01hcCkpIHtcbiAgICBtYXAuc2V0KG5vcm1hbGl6ZVN0YXR1c05hbWUobmFtZSksIGNvZGUpXG4gIH1cblxuICByZXR1cm4gbWFwXG59KSgpXG5cbmV4cG9ydCBjb25zdCBnZXRTdGF0dXNDb2RlID0gKHZhbHVlOiB1bmtub3duKTogbnVtYmVyID0+IHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzRmluaXRlKHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zdCB0cmltbWVkID0gdmFsdWUudHJpbSgpXG4gICAgaWYgKERJR0lUU19PTkxZLnRlc3QodHJpbW1lZCkpIHtcbiAgICAgIHJldHVybiBOdW1iZXIodHJpbW1lZClcbiAgICB9XG5cbiAgICBjb25zdCBrbm93biA9IFNUQVRVU19CWV9OT1JNQUxJWkVEX05BTUUuZ2V0KG5vcm1hbGl6ZVN0YXR1c05hbWUodHJpbW1lZCkpXG4gICAgcmV0dXJuIGtub3duID8/IDUwMFxuICB9XG5cbiAgcmV0dXJuIDUwMFxufVxuIiwKICAgICJleHBvcnQgY29uc3QgcGFyc2VFcnJvciA9IChlcnJvcjogdW5rbm93bik6IHN0cmluZyA9PiB7XG4gIGxldCBtZXNzYWdlID0gJ0FuIGVycm9yIG9jY3VycmVkJ1xuXG4gIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgbWVzc2FnZSA9IGVycm9yLm1lc3NhZ2VcbiAgfSBlbHNlIGlmIChlcnJvciAmJiB0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmICdtZXNzYWdlJyBpbiBlcnJvcikge1xuICAgIG1lc3NhZ2UgPSBlcnJvci5tZXNzYWdlIGFzIHN0cmluZ1xuICB9IGVsc2Uge1xuICAgIG1lc3NhZ2UgPSBTdHJpbmcoZXJyb3IpXG4gIH1cblxuICByZXR1cm4gbWVzc2FnZVxufVxuIiwKICAgICJpbXBvcnQge1xuICBtZXJnZUxvZ0RhdGFDb250ZXh0LFxuICB0eXBlIFJlcXVlc3RDb250ZXh0U3RvcmVcbn0gZnJvbSAnLi4vY29udGV4dC9yZXF1ZXN0LWNvbnRleHQnXG5pbXBvcnQgdHlwZSB7IExvZ0xldmVsLCBPcHRpb25zLCBSZXF1ZXN0SW5mbywgU3RvcmVEYXRhIH0gZnJvbSAnLi4vaW50ZXJmYWNlcydcbmltcG9ydCB7IGxvZ1RvVHJhbnNwb3J0cyB9IGZyb20gJy4uL291dHB1dCdcbmltcG9ydCB7IGxvZ1RvRmlsZSB9IGZyb20gJy4uL291dHB1dC9maWxlJ1xuaW1wb3J0IHsgcGFyc2VFcnJvciB9IGZyb20gJy4uL3V0aWxzL2Vycm9yJ1xuaW1wb3J0IHsgcmVkYWN0LCByZWRhY3RSZXF1ZXN0IH0gZnJvbSAnLi4vdXRpbHMvcmVkYWN0J1xuaW1wb3J0IHsgZm9ybWF0TG9nT3V0cHV0IH0gZnJvbSAnLi9jcmVhdGUtbG9nZ2VyJ1xuXG5jb25zdCBpc0Vycm9yV2l0aFN0YXR1cyA9IChcbiAgdmFsdWU6IHVua25vd25cbik6IHZhbHVlIGlzIHsgc3RhdHVzOiBudW1iZXI7IG1lc3NhZ2U/OiBzdHJpbmcgfSA9PlxuICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gIHZhbHVlICE9PSBudWxsICYmXG4gICdzdGF0dXMnIGluIHZhbHVlICYmXG4gIHR5cGVvZiAodmFsdWUgYXMgeyBzdGF0dXM/OiB1bmtub3duIH0pLnN0YXR1cyA9PT0gJ251bWJlcidcblxuZXhwb3J0IGNvbnN0IGhhbmRsZUh0dHBFcnJvciA9IChcbiAgcmVxdWVzdDogUmVxdWVzdEluZm8sXG4gIGVycm9yOiB1bmtub3duLFxuICBzdG9yZTogU3RvcmVEYXRhLFxuICBvcHRpb25zOiBPcHRpb25zLFxuICBjb250ZXh0U3RvcmU/OiBSZXF1ZXN0Q29udGV4dFN0b3JlXG4pOiB2b2lkID0+IHtcbiAgY29uc3QgY29uZmlnID0gb3B0aW9ucy5jb25maWdcblxuICBjb25zdCBsb2dGaWx0ZXIgPSBjb25maWc/LmxvZ0ZpbHRlclxuICBpZiAoXG4gICAgbG9nRmlsdGVyPy5sZXZlbCAmJlxuICAgIGxvZ0ZpbHRlci5sZXZlbC5sZW5ndGggPiAwICYmXG4gICAgIWxvZ0ZpbHRlci5sZXZlbC5pbmNsdWRlcygnRVJST1InKVxuICApIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHVzZVRyYW5zcG9ydHNPbmx5ID0gY29uZmlnPy51c2VUcmFuc3BvcnRzT25seSA9PT0gdHJ1ZVxuICBjb25zdCBkaXNhYmxlSW50ZXJuYWxMb2dnZXIgPSBjb25maWc/LmRpc2FibGVJbnRlcm5hbExvZ2dlciA9PT0gdHJ1ZVxuICBjb25zdCBkaXNhYmxlRmlsZUxvZ2dpbmcgPSBjb25maWc/LmRpc2FibGVGaWxlTG9nZ2luZyA9PT0gdHJ1ZVxuXG4gIGNvbnN0IHN0YXR1cyA9IGlzRXJyb3JXaXRoU3RhdHVzKGVycm9yKSA/IGVycm9yLnN0YXR1cyA6IDUwMFxuICBjb25zdCBtZXNzYWdlID0gcGFyc2VFcnJvcihlcnJvcilcblxuICBjb25zdCBsZXZlbDogTG9nTGV2ZWwgPSAnRVJST1InXG4gIGNvbnN0IGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0geyBzdGF0dXMsIG1lc3NhZ2UsIGVycm9yIH1cbiAgY29uc3QgZGF0YVdpdGhDb250ZXh0ID0gY29udGV4dFN0b3JlXG4gICAgPyBtZXJnZUxvZ0RhdGFDb250ZXh0KGRhdGEsIGNvbnRleHRTdG9yZS5nZXRDb250ZXh0KHJlcXVlc3QpKVxuICAgIDogZGF0YVxuICBjb25zdCBsb2dEYXRhID1cbiAgICBjb25maWc/LmF1dG9SZWRhY3QgPT09IHRydWUgPyByZWRhY3QoZGF0YVdpdGhDb250ZXh0KSA6IGRhdGFXaXRoQ29udGV4dFxuICBjb25zdCBsb2dSZXF1ZXN0ID1cbiAgICBjb25maWc/LmF1dG9SZWRhY3QgPT09IHRydWUgPyByZWRhY3RSZXF1ZXN0KHJlcXVlc3QpIDogcmVxdWVzdFxuXG4gIGxvZ1RvVHJhbnNwb3J0cyh7IGxldmVsLCByZXF1ZXN0OiBsb2dSZXF1ZXN0LCBkYXRhOiBsb2dEYXRhLCBzdG9yZSwgb3B0aW9ucyB9KVxuXG4gIGlmICghKHVzZVRyYW5zcG9ydHNPbmx5IHx8IGRpc2FibGVGaWxlTG9nZ2luZykpIHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IGNvbmZpZz8ubG9nRmlsZVBhdGhcbiAgICBpZiAoZmlsZVBhdGgpIHtcbiAgICAgIGxvZ1RvRmlsZSh7XG4gICAgICAgIGZpbGVQYXRoLFxuICAgICAgICBsZXZlbCxcbiAgICAgICAgcmVxdWVzdDogbG9nUmVxdWVzdCxcbiAgICAgICAgZGF0YTogbG9nRGF0YSxcbiAgICAgICAgc3RvcmUsXG4gICAgICAgIG9wdGlvbnNcbiAgICAgIH0pLmNhdGNoKCgpID0+IHtcbiAgICAgICAgLy8gSWdub3JlIGVycm9yc1xuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBpZiAodXNlVHJhbnNwb3J0c09ubHkgfHwgZGlzYWJsZUludGVybmFsTG9nZ2VyKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCB7IG1haW4sIGNvbnRleHRMaW5lcyB9ID0gZm9ybWF0TG9nT3V0cHV0KHtcbiAgICBsZXZlbCxcbiAgICByZXF1ZXN0OiBsb2dSZXF1ZXN0LFxuICAgIGRhdGE6IGxvZ0RhdGEsXG4gICAgc3RvcmUsXG4gICAgb3B0aW9uc1xuICB9KVxuXG4gIGNvbnN0IGZvcm1hdHRlZE1lc3NhZ2UgPVxuICAgIGNvbnRleHRMaW5lcy5sZW5ndGggPiAwID8gYCR7bWFpbn1cXG4ke2NvbnRleHRMaW5lcy5qb2luKCdcXG4nKX1gIDogbWFpblxuICBjb25zb2xlLmVycm9yKGZvcm1hdHRlZE1lc3NhZ2UpXG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgUmVxdWVzdENvbnRleHRTdG9yZSB9IGZyb20gJy4uL2NvbnRleHQvcmVxdWVzdC1jb250ZXh0J1xuaW1wb3J0IHR5cGUgeyBMb2dnZXIsIE9wdGlvbnMsIFN0b3JlRGF0YSB9IGZyb20gJy4uL2ludGVyZmFjZXMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgV2ViU29ja2V0TGlrZSB7XG4gIHJlYWRvbmx5IGRhdGE/OiB7IHN0b3JlPzogeyBsb2dnZXI/OiBMb2dnZXIgfSB9XG4gIHJlYWRvbmx5IGlkPzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgV3NIYW5kbGVySG9va3M8XG4gIFRNZXNzYWdlID0gdW5rbm93bixcbiAgVFdzIGV4dGVuZHMgV2ViU29ja2V0TGlrZSA9IFdlYlNvY2tldExpa2Vcbj4ge1xuICBjbG9zZT86ICh3czogVFdzKSA9PiB2b2lkXG4gIG1lc3NhZ2U/OiAod3M6IFRXcywgbWVzc2FnZTogVE1lc3NhZ2UpID0+IHZvaWRcbiAgb3Blbj86ICh3czogVFdzKSA9PiB2b2lkXG59XG5cbmNvbnN0IHdzU3ludGhldGljUmVxdWVzdCA9IChwYXRoOiBzdHJpbmcpOiBSZXF1ZXN0ID0+XG4gIG5ldyBSZXF1ZXN0KGBodHRwOi8vbG9naXhseXNpYS5sb2NhbCR7cGF0aH1gLCB7IG1ldGhvZDogJ1dTJyB9KVxuXG5leHBvcnQgY29uc3QgY3JlYXRlV3NIYW5kbGVyV3JhcHBlciA9IChcbiAgb3B0aW9uczogT3B0aW9ucyxcbiAgbG9nZ2VyOiBMb2dnZXIsXG4gIGNvbnRleHRTdG9yZTogUmVxdWVzdENvbnRleHRTdG9yZVxuKSA9PiB7XG4gIGNvbnN0IHdzVGltaW5ncyA9IG5ldyBXZWFrTWFwPG9iamVjdCwgYmlnaW50PigpXG5cbiAgY29uc3QgbG9nV3MgPSAoXG4gICAgbGV2ZWw6ICdJTkZPJyB8ICdXQVJOSU5HJyB8ICdFUlJPUicsXG4gICAgd3M6IFdlYlNvY2tldExpa2UsXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICBleHRyYT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IGtleSA9IHdzIGFzIG9iamVjdFxuICAgIGNvbnN0IGJlZm9yZVRpbWUgPSB3c1RpbWluZ3MuZ2V0KGtleSkgPz8gcHJvY2Vzcy5ocnRpbWUuYmlnaW50KClcbiAgICBjb25zdCBzdG9yZTogU3RvcmVEYXRhID0geyBiZWZvcmVUaW1lIH1cbiAgICBjb25zdCBhY2N1bXVsYXRlZCA9IGNvbnRleHRTdG9yZS5nZXRDb250ZXh0KGtleSlcbiAgICBjb25zdCBjb250ZXh0ID1cbiAgICAgIE9iamVjdC5rZXlzKGFjY3VtdWxhdGVkKS5sZW5ndGggPiAwIHx8IGV4dHJhXG4gICAgICAgID8geyAuLi5hY2N1bXVsYXRlZCwgLi4uZXh0cmEsIHdzSWQ6IHdzLmlkIH1cbiAgICAgICAgOiB7IHdzSWQ6IHdzLmlkIH1cblxuICAgIGxvZ2dlci5sb2coXG4gICAgICBsZXZlbCxcbiAgICAgIHdzU3ludGhldGljUmVxdWVzdChwYXRoKSxcbiAgICAgIHsgbWVzc2FnZSwgY29udGV4dCwgc3RhdHVzOiAyMDAgfSxcbiAgICAgIHN0b3JlXG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIDxcbiAgICBUTWVzc2FnZSxcbiAgICBUV3MgZXh0ZW5kcyBXZWJTb2NrZXRMaWtlLFxuICAgIGNvbnN0IFRIb29rcyBleHRlbmRzIFdzSGFuZGxlckhvb2tzPFRNZXNzYWdlLCBUV3M+XG4gID4oXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIGhvb2tzOiBUSG9va3NcbiAgKTogVEhvb2tzID0+XG4gICAgKHtcbiAgICAgIC4uLmhvb2tzLFxuICAgICAgb3Blbih3cykge1xuICAgICAgICB3c1RpbWluZ3Muc2V0KHdzIGFzIG9iamVjdCwgcHJvY2Vzcy5ocnRpbWUuYmlnaW50KCkpXG4gICAgICAgIGhvb2tzLm9wZW4/Lih3cylcbiAgICAgICAgaWYgKG9wdGlvbnMuY29uZmlnPy5kaXNhYmxlV2ViU29ja2V0TG9nZ2luZyAhPT0gdHJ1ZSkge1xuICAgICAgICAgIGxvZ1dzKCdJTkZPJywgd3MsIHBhdGgsICdXZWJTb2NrZXQgb3BlbmVkJylcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIG1lc3NhZ2Uod3MsIG1lc3NhZ2UpIHtcbiAgICAgICAgaG9va3MubWVzc2FnZT8uKHdzLCBtZXNzYWdlKVxuICAgICAgICBpZiAob3B0aW9ucy5jb25maWc/LmRpc2FibGVXZWJTb2NrZXRMb2dnaW5nICE9PSB0cnVlKSB7XG4gICAgICAgICAgbG9nV3MoJ0lORk8nLCB3cywgcGF0aCwgJ1dlYlNvY2tldCBtZXNzYWdlJywge1xuICAgICAgICAgICAgcGF5bG9hZFR5cGU6IHR5cGVvZiBtZXNzYWdlXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGNsb3NlKHdzKSB7XG4gICAgICAgIGhvb2tzLmNsb3NlPy4od3MpXG4gICAgICAgIGlmIChvcHRpb25zLmNvbmZpZz8uZGlzYWJsZVdlYlNvY2tldExvZ2dpbmcgIT09IHRydWUpIHtcbiAgICAgICAgICBsb2dXcygnSU5GTycsIHdzLCBwYXRoLCAnV2ViU29ja2V0IGNsb3NlZCcpXG4gICAgICAgIH1cbiAgICAgICAgY29udGV4dFN0b3JlLmNsZWFyQ29udGV4dCh3cyBhcyBvYmplY3QpXG4gICAgICAgIHdzVGltaW5ncy5kZWxldGUod3MgYXMgb2JqZWN0KVxuICAgICAgfVxuICAgIH0pIGFzIFRIb29rc1xufVxuIgogIF0sCiAgIm1hcHBpbmdzIjogIkFBQUEsaUJBQVMsZ0JDSVQsSUFBTSxHQUFxRSxDQUN6RSxJQUFLLENBQ0gsbUJBQW9CLEdBQ3BCLHFCQUFzQixTQUN0QixVQUFXLEdBQ1gsZ0JBQWlCLEdBQ2pCLEtBQU0sQ0FDSixZQUFhLEVBQ2YsQ0FDRixFQUNBLEtBQU0sQ0FDSixtQkFBb0IsR0FDcEIsVUFBVyxHQUNYLGdCQUFpQixHQUNqQixXQUFZLEdBQ1osS0FBTSxDQUNKLFlBQWEsRUFDZixDQUNGLEVBQ0EsS0FBTSxDQUNKLG1CQUFvQixHQUNwQixVQUFXLEdBQ1gsZ0JBQWlCLEdBQ2pCLEtBQU0sQ0FDSixZQUFhLEVBQ2YsQ0FDRixDQUNGLEVBRU0sR0FBYyxDQUNsQixFQUNBLElBQ21DLENBQ25DLEdBQUksQ0FBQyxFQUNILE9BQU8sRUFHVCxJQUFNLEVBQXlDLElBQUssS0FBUyxDQUFTLEVBRXRFLEdBQUksRUFBSyxNQUFRLEVBQVMsS0FDeEIsRUFBTyxLQUFPLElBQ1QsRUFBSyxRQUNMLEVBQVMsUUFDUixFQUFLLE1BQU0sY0FBZ0IsUUFDL0IsRUFBUyxNQUFNLGNBQWdCLE9BQzNCLENBQ0UsWUFBYSxFQUFTLE1BQU0sYUFBZSxFQUFLLE1BQU0sV0FDeEQsRUFDQSxDQUFDLENBQ1AsRUFHRixHQUFJLEVBQUssV0FBYSxFQUFTLFVBQzdCLEVB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LFVBQVMsTUFBSyxXQUFZLENBQzFDLEdBQUksQ0FDRixHQUFJLEVBQWEsSUFBSSxDQUFPLEVBQzFCLE9BR0YsSUFBTSxFQUFTLE9BQU8sRUFBSSxTQUFXLFNBQVcsRUFBSSxPQUFTLElBQ3pELEVBQXNDLE9BQzFDLEdBQUksR0FBVSxJQUNaLEVBQVEsUUFDSCxRQUFJLEdBQVUsSUFDbkIsRUFBUSxVQUdWLElBQU0sRUFBYyxFQUFhLFdBQVcsQ0FBTyxFQUM3QyxFQUFnQyxDQUFFLFFBQU8sRUFDL0MsR0FBSSxPQUFPLEtBQUssQ0FBVyxFQUFFLE9BQVMsRUFDcEMsRUFBSyxRQUFVLElBQUssQ0FBWSxFQUdsQyxFQUFPLElBQUksRUFBTyxFQUFTLEVBQU0sQ0FBSyxTQUN0QyxDQUNBLEVBQWEsYUFBYSxDQUFPLEdBRXBDLEVBQ0EsUUFBUSxFQUFHLFVBQVMsUUFBTyxXQUFZLENBQ3RDLEdBQUksQ0FDRixFQUFPLGdCQUFnQixFQUFTLEVBQU8sQ0FBSyxTQUM1QyxDQUNBLEVBQWEsYUFBYSxDQUFPLEdBRXBDLEVBQ0EsR0FBRyxRQUFRLEVBRWQsT0FBTyxPQUFPLE9BQU8sRUFBUSxDQUFFLFFBQU8sQ0FBQyxHQW9CMUIiLAogICJkZWJ1Z0lkIjogIkFFMkU2Q0M2RTkzNDJFRDc2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9
|
|
9
|
+
//# debugId=494FFD570C3E142764756E2164756E21
|
|
10
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2luZGV4LnRzIiwgInNyYy9jb25maWcvcmVzb2x2ZS1vcHRpb25zLnRzIiwgInNyYy9jb250ZXh0L3JlcXVlc3QtY29udGV4dC50cyIsICJzcmMvZXh0ZW5zaW9ucy9iYW5uZXIudHMiLCAic3JjL2V4dGVuc2lvbnMvaW5kZXgudHMiLCAic3JjL2xvZ2dlci9pbmRleC50cyIsICJzcmMvb3V0cHV0L2luZGV4LnRzIiwgInNyYy9vdXRwdXQvZmlsZS50cyIsICJzcmMvb3V0cHV0L2ZzLnRzIiwgInNyYy9vdXRwdXQvcm90YXRpb24tbWFuYWdlci50cyIsICJzcmMvdXRpbHMvcm90YXRpb24udHMiLCAic3JjL3V0aWxzL3JlZGFjdC50cyIsICJzcmMvbG9nZ2VyL2NyZWF0ZS1sb2dnZXIudHMiLCAic3JjL2hlbHBlcnMvc3RhdHVzLnRzIiwgInNyYy91dGlscy9lcnJvci50cyIsICJzcmMvbG9nZ2VyL2hhbmRsZS1odHRwLWVycm9yLnRzIiwgInNyYy9taWRkbGV3YXJlL3JlcXVlc3QtaWQudHMiLCAic3JjL3dlYnNvY2tldC93cmFwLXdzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgImltcG9ydCB7IEVseXNpYSB9IGZyb20gJ2VseXNpYSdcbmltcG9ydCB7IHJlc29sdmVPcHRpb25zIH0gZnJvbSAnLi9jb25maWcvcmVzb2x2ZS1vcHRpb25zJ1xuaW1wb3J0IHsgY3JlYXRlUmVxdWVzdENvbnRleHRTdG9yZSB9IGZyb20gJy4vY29udGV4dC9yZXF1ZXN0LWNvbnRleHQnXG5pbXBvcnQgeyBzdGFydFNlcnZlciB9IGZyb20gJy4vZXh0ZW5zaW9ucydcbmltcG9ydCB0eXBlIHsgTG9naXhseXNpYVN0b3JlLCBPcHRpb25zIH0gZnJvbSAnLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IHsgY3JlYXRlUGx1Z2luTG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXInXG5pbXBvcnQge1xuICBnZXRPckNyZWF0ZVJlcXVlc3RJZCxcbiAgcmVzb2x2ZVJlcXVlc3RJZENvbmZpZ1xufSBmcm9tICcuL21pZGRsZXdhcmUvcmVxdWVzdC1pZCdcbmltcG9ydCB7IGNyZWF0ZVdzSGFuZGxlcldyYXBwZXIgfSBmcm9tICcuL3dlYnNvY2tldC93cmFwLXdzJ1xuXG4vKipcbiAqIEVtcHR5IHNpbmdsZXRvbiBzbG90cyBtdXN0IG5vdCB1c2UgYFJlY29yZDxzdHJpbmcsIG5ldmVyPmA6IGludGVyc2VjdGluZyB0aGF0IHdpdGggRWx5c2lhJ3MgYENvbnRleHRgXG4gKiBtYWtlcyBldmVyeSBrZXkgKGluY2x1ZGluZyBgc3RvcmVgKSBiZWNvbWUgYG5ldmVyYCBiZWNhdXNlIGVhY2gga2V5IGlzIG1lcmdlZCB3aXRoIGBuZXZlcmAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW1wdHlFbHlzaWFTbG90IHtcbiAgcmVhZG9ubHkgX19sb2dpeGx5c2lhRW1wdHk/OiBuZXZlclxufVxuXG4vKipcbiAqIEV4cGxpY2l0IHNpbmdsZXRvbiB3aXRob3V0IEVseXNpYSdzIGBTaW5nbGV0b25CYXNlYCBgUmVjb3JkPHN0cmluZywgdW5rbm93bj5gIG9uIGRlY29yYXRvci9kZXJpdmUvcmVzb2x2ZSBzb1xuICogbWVyZ2VkIGBDb250ZXh0YCBhbmQgV2ViU29ja2V0IGB3cy5kYXRhYCBrZWVwIHByZWNpc2Uga2V5cyBhZnRlciBgLnVzZShsb2dpeGx5c2lhKCkpYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2dpeGx5c2lhU2luZ2xldG9uIHtcbiAgZGVjb3JhdG9yOiBFbXB0eUVseXNpYVNsb3RcbiAgZGVyaXZlOiBFbXB0eUVseXNpYVNsb3RcbiAgcmVzb2x2ZTogRW1wdHlFbHlzaWFTbG90XG4gIHN0b3JlOiBMb2dpeGx5c2lhU3RvcmVcbn1cblxuLy8gRWx5c2lhJ3MgYFNpbmdsZXRvbkJhc2Uuc3RvcmVgIGlzIGBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPmA7IGBMb2dpeGx5c2lhU3RvcmVgIGlzIGludGVudGlvbmFsbHkgY2xvc2VkIChzZWUgIzIyMCkuXG4vLyBAdHMtZXhwZWN0LWVycm9yIOKAlCBjbG9zZWQgc3RvcmUgaXMgY29ycmVjdCBhdCBydW50aW1lIGFuZCBmb3IgbWVyZ2VkIGB3cy5kYXRhYCBpbmZlcmVuY2UuXG5leHBvcnQgdHlwZSBMb2dpeGx5c2lhID0gRWx5c2lhPCcnLCBMb2dpeGx5c2lhU2luZ2xldG9uPlxuXG5leHBvcnQgdHlwZSBMb2dpeGx5c2lhUGx1Z2luID0gTG9naXhseXNpYSAmIHtcbiAgd3JhcFdzOiBSZXR1cm5UeXBlPHR5cGVvZiBjcmVhdGVXc0hhbmRsZXJXcmFwcGVyPlxufVxuXG5leHBvcnQgY29uc3QgbG9naXhseXNpYSA9IChyYXdPcHRpb25zOiBPcHRpb25zID0ge30pOiBMb2dpeGx5c2lhUGx1Z2luID0+IHtcbiAgY29uc3Qgb3B0aW9ucyA9IHJlc29sdmVPcHRpb25zKHJhd09wdGlvbnMpXG4gIGNvbnN0IGRpZEN1c3RvbUxvZyA9IG5ldyBXZWFrU2V0PFJlcXVlc3Q+KClcbiAgY29uc3QgY29udGV4dFN0b3JlID0gY3JlYXRlUmVxdWVzdENvbnRleHRTdG9yZSgpXG4gIGNvbnN0IGJhc2VMb2dnZXIgPSBjcmVhdGVQbHVnaW5Mb2dnZXIob3B0aW9ucywgY29udGV4dFN0b3JlKVxuICBjb25zdCB3cmFwV3MgPSBjcmVhdGVXc0hhbmRsZXJXcmFwcGVyKG9wdGlvbnMsIGJhc2VMb2dnZXIsIGNvbnRleHRTdG9yZSlcbiAgY29uc3QgcmVxdWVzdElkQ29uZmlnID0gcmVzb2x2ZVJlcXVlc3RJZENvbmZpZyhvcHRpb25zLmNvbmZpZz8ucmVxdWVzdElkKVxuICBjb25zdCBsb2dnZXIgPSB7XG4gICAgLi4uYmFzZUxvZ2dlcixcbiAgICBkZWJ1ZzogKFxuICAgICAgcmVxdWVzdDogUmVxdWVzdCxcbiAgICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICAgIGNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICkgPT4ge1xuICAgICAgZGlkQ3VzdG9tTG9nLmFkZChyZXF1ZXN0KVxuICAgICAgYmFzZUxvZ2dlci5kZWJ1ZyhyZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KVxuICAgIH0sXG4gICAgaW5mbzogKFxuICAgICAgcmVxdWVzdDogUmVxdWVzdCxcbiAgICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICAgIGNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICkgPT4ge1xuICAgICAgZGlkQ3VzdG9tTG9nLmFkZChyZXF1ZXN0KVxuICAgICAgYmFzZUxvZ2dlci5pbmZvKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpXG4gICAgfSxcbiAgICB3YXJuOiAoXG4gICAgICByZXF1ZXN0OiBSZXF1ZXN0LFxuICAgICAgbWVzc2FnZTogc3RyaW5nLFxuICAgICAgY29udGV4dD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgKSA9PiB7XG4gICAgICBkaWRDdXN0b21Mb2cuYWRkKHJlcXVlc3QpXG4gICAgICBiYXNlTG9nZ2VyLndhcm4ocmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dClcbiAgICB9LFxuICAgIGVycm9yOiAoXG4gICAgICByZXF1ZXN0OiBSZXF1ZXN0LFxuICAgICAgbWVzc2FnZTogc3RyaW5nLFxuICAgICAgY29udGV4dD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgKSA9PiB7XG4gICAgICBkaWRDdXN0b21Mb2cuYWRkKHJlcXVlc3QpXG4gICAgICBiYXNlTG9nZ2VyLmVycm9yKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgYXBwID0gbmV3IEVseXNpYSh7XG4gICAgbmFtZTogJ0xvZ2l4bHlzaWEnLFxuICAgIGRldGFpbDoge1xuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICdMb2dpeGx5c2lhIGlzIGEgcGx1Z2luIGZvciBFbHlzaWEgdGhhdCBwcm92aWRlcyBhIGxvZ2dlciBhbmQgcGlubyBsb2dnZXIuJyxcbiAgICAgIHRhZ3M6IFsnbG9nZ2luZycsICdwaW5vJ11cbiAgICB9XG4gIH0pXG5cbiAgY29uc3QgcGx1Z2luID0gYXBwXG4gICAgLnN0YXRlKCdsb2dnZXInLCBsb2dnZXIpXG4gICAgLnN0YXRlKCdwaW5vJywgbG9nZ2VyLnBpbm8pXG4gICAgLnN0YXRlKCdiZWZvcmVUaW1lJywgQmlnSW50KDApKVxuICAgIC5vblN0YXJ0KCh7IHNlcnZlciB9KTogdm9pZCA9PiB7XG4gICAgICBpZiAoc2VydmVyKSB7XG4gICAgICAgIHN0YXJ0U2VydmVyKHNlcnZlciwgb3B0aW9ucylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHBvcnQgPSBOdW1iZXIocHJvY2Vzcy5lbnYuUE9SVCkgfHwgMzAwMFxuICAgICAgICBjb25zdCBob3N0bmFtZSA9IHByb2Nlc3MuZW52LkhPU1QgfHwgJ2xvY2FsaG9zdCdcbiAgICAgICAgc3RhcnRTZXJ2ZXIoeyBwb3J0LCBob3N0bmFtZSwgcHJvdG9jb2w6ICdodHRwJyB9LCBvcHRpb25zKVxuICAgICAgfVxuICAgIH0pXG4gICAgLm9uUmVxdWVzdCgoeyByZXF1ZXN0LCBzdG9yZSB9KSA9PiB7XG4gICAgICBzdG9yZS5iZWZvcmVUaW1lID0gcHJvY2Vzcy5ocnRpbWUuYmlnaW50KClcbiAgICAgIGlmIChyZXF1ZXN0SWRDb25maWcpIHtcbiAgICAgICAgY29uc3QgcmVxdWVzdElkID0gZ2V0T3JDcmVhdGVSZXF1ZXN0SWQocmVxdWVzdCwgcmVxdWVzdElkQ29uZmlnKVxuICAgICAgICBjb250ZXh0U3RvcmUubWVyZ2VDb250ZXh0KHJlcXVlc3QsIHsgcmVxdWVzdElkIH0pXG4gICAgICB9XG4gICAgfSlcbiAgICAub25BZnRlckhhbmRsZSgoeyByZXF1ZXN0LCBzZXQsIHN0b3JlIH0pID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChyZXF1ZXN0SWRDb25maWcpIHtcbiAgICAgICAgICBjb25zdCBjdHggPSBjb250ZXh0U3RvcmUuZ2V0Q29udGV4dChyZXF1ZXN0KVxuICAgICAgICAgIGNvbnN0IGlkID0gY3R4LnJlcXVlc3RJZCBhcyBzdHJpbmcgfCB1bmRlZmluZWRcbiAgICAgICAgICBpZiAoaWQpIHtcbiAgICAgICAgICAgIHNldC5oZWFkZXJzW3JlcXVlc3RJZENvbmZpZy5oZWFkZXJdID0gaWRcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGlkQ3VzdG9tTG9nLmhhcyhyZXF1ZXN0KSkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3RhdHVzID0gdHlwZW9mIHNldC5zdGF0dXMgPT09ICdudW1iZXInID8gc2V0LnN0YXR1cyA6IDIwMFxuICAgICAgICBsZXQgbGV2ZWw6ICdJTkZPJyB8ICdXQVJOSU5HJyB8ICdFUlJPUicgPSAnSU5GTydcbiAgICAgICAgaWYgKHN0YXR1cyA+PSA1MDApIHtcbiAgICAgICAgICBsZXZlbCA9ICdFUlJPUidcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPj0gNDAwKSB7XG4gICAgICAgICAgbGV2ZWwgPSAnV0FSTklORydcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFjY3VtdWxhdGVkID0gY29udGV4dFN0b3JlLmdldENvbnRleHQocmVxdWVzdClcbiAgICAgICAgY29uc3QgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7IHN0YXR1cyB9XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhhY2N1bXVsYXRlZCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGRhdGEuY29udGV4dCA9IHsgLi4uYWNjdW11bGF0ZWQgfVxuICAgICAgICB9XG5cbiAgICAgICAgbG9nZ2VyLmxvZyhsZXZlbCwgcmVxdWVzdCwgZGF0YSwgc3RvcmUpXG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBjb250ZXh0U3RvcmUuY2xlYXJDb250ZXh0KHJlcXVlc3QpXG4gICAgICB9XG4gICAgfSlcbiAgICAub25FcnJvcigoeyByZXF1ZXN0LCBlcnJvciwgc2V0LCBzdG9yZSB9KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAocmVxdWVzdElkQ29uZmlnKSB7XG4gICAgICAgICAgY29uc3QgY3R4ID0gY29udGV4dFN0b3JlLmdldENvbnRleHQocmVxdWVzdClcbiAgICAgICAgICBjb25zdCBpZCA9IGN0eC5yZXF1ZXN0SWQgYXMgc3RyaW5nIHwgdW5kZWZpbmVkXG4gICAgICAgICAgaWYgKGlkKSB7XG4gICAgICAgICAgICBzZXQuaGVhZGVyc1tyZXF1ZXN0SWRDb25maWcuaGVhZGVyXSA9IGlkXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxvZ2dlci5oYW5kbGVIdHRwRXJyb3IocmVxdWVzdCwgZXJyb3IsIHN0b3JlKVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgY29udGV4dFN0b3JlLmNsZWFyQ29udGV4dChyZXF1ZXN0KVxuICAgICAgfVxuICAgIH0pXG4gICAgLmFzKCdzY29wZWQnKSBhcyBMb2dpeGx5c2lhXG5cbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24ocGx1Z2luLCB7IHdyYXBXcyB9KSBhcyBMb2dpeGx5c2lhUGx1Z2luXG59XG5cbi8vIGJpb21lLWlnbm9yZSBsaW50L3BlcmZvcm1hbmNlL25vQmFycmVsRmlsZTogcHVibGljIHBhY2thZ2UgZW50cnkgcmUtZXhwb3J0c1xuZXhwb3J0IHsgcmVzb2x2ZU9wdGlvbnMgfSBmcm9tICcuL2NvbmZpZy9yZXNvbHZlLW9wdGlvbnMnXG5leHBvcnQgdHlwZSB7XG4gIExvZ2dlcixcbiAgTG9naXhseXNpYUNvbnRleHQsXG4gIExvZ2l4bHlzaWFTdG9yZSxcbiAgTG9nTGV2ZWwsXG4gIExvZ1ByZXNldCxcbiAgT3B0aW9ucyxcbiAgUGlubyxcbiAgUmVxdWVzdElkQ29uZmlnLFxuICBTdG9yZURhdGEsXG4gIFRyYW5zcG9ydFxufSBmcm9tICcuL2ludGVyZmFjZXMnXG5leHBvcnQgeyBjcmVhdGVMb2dnZXIsIGNyZWF0ZVBsdWdpbkxvZ2dlciB9IGZyb20gJy4vbG9nZ2VyJ1xuZXhwb3J0IHR5cGUgeyBSZXNvbHZlZFJlcXVlc3RJZENvbmZpZyB9IGZyb20gJy4vbWlkZGxld2FyZS9yZXF1ZXN0LWlkJ1xuZXhwb3J0IHtcbiAgZ2V0T3JDcmVhdGVSZXF1ZXN0SWQsXG4gIHJlc29sdmVSZXF1ZXN0SWRDb25maWdcbn0gZnJvbSAnLi9taWRkbGV3YXJlL3JlcXVlc3QtaWQnXG5leHBvcnQgdHlwZSB7IFdzSGFuZGxlckhvb2tzIH0gZnJvbSAnLi93ZWJzb2NrZXQvd3JhcC13cydcbmV4cG9ydCB7IGNyZWF0ZVdzSGFuZGxlcldyYXBwZXIgfSBmcm9tICcuL3dlYnNvY2tldC93cmFwLXdzJ1xuXG5leHBvcnQgZGVmYXVsdCBsb2dpeGx5c2lhXG4iLAogICAgImltcG9ydCB0eXBlIHsgT3B0aW9ucyB9IGZyb20gJy4uL2ludGVyZmFjZXMnXG5cbmV4cG9ydCB0eXBlIExvZ1ByZXNldCA9ICdkZXYnIHwgJ3Byb2QnIHwgJ2pzb24nXG5cbmNvbnN0IFBSRVNFVF9ERUZBVUxUUzogUmVjb3JkPExvZ1ByZXNldCwgTm9uTnVsbGFibGU8T3B0aW9uc1snY29uZmlnJ10+PiA9IHtcbiAgZGV2OiB7XG4gICAgc2hvd1N0YXJ0dXBNZXNzYWdlOiB0cnVlLFxuICAgIHN0YXJ0dXBNZXNzYWdlRm9ybWF0OiAnYmFubmVyJyxcbiAgICB1c2VDb2xvcnM6IHRydWUsXG4gICAgc2hvd0NvbnRleHRUcmVlOiB0cnVlLFxuICAgIHBpbm86IHtcbiAgICAgIHByZXR0eVByaW50OiB0cnVlXG4gICAgfVxuICB9LFxuICBwcm9kOiB7XG4gICAgc2hvd1N0YXJ0dXBNZXNzYWdlOiBmYWxzZSxcbiAgICB1c2VDb2xvcnM6IGZhbHNlLFxuICAgIHNob3dDb250ZXh0VHJlZTogZmFsc2UsXG4gICAgYXV0b1JlZGFjdDogdHJ1ZSxcbiAgICByZXF1ZXN0SWQ6IHRydWUsXG4gICAgcGlubzoge1xuICAgICAgcHJldHR5UHJpbnQ6IGZhbHNlXG4gICAgfVxuICB9LFxuICBqc29uOiB7XG4gICAgc2hvd1N0YXJ0dXBNZXNzYWdlOiBmYWxzZSxcbiAgICB1c2VDb2xvcnM6IGZhbHNlLFxuICAgIHNob3dDb250ZXh0VHJlZTogZmFsc2UsXG4gICAgcGlubzoge1xuICAgICAgcHJldHR5UHJpbnQ6IGZhbHNlXG4gICAgfVxuICB9XG59XG5cbmNvbnN0IG1lcmdlQ29uZmlnID0gKFxuICBiYXNlOiBOb25OdWxsYWJsZTxPcHRpb25zWydjb25maWcnXT4sXG4gIG92ZXJyaWRlPzogT3B0aW9uc1snY29uZmlnJ11cbik6IE5vbk51bGxhYmxlPE9wdGlvbnNbJ2NvbmZpZyddPiA9PiB7XG4gIGlmICghb3ZlcnJpZGUpIHtcbiAgICByZXR1cm4gYmFzZVxuICB9XG5cbiAgY29uc3QgbWVyZ2VkOiBOb25OdWxsYWJsZTxPcHRpb25zWydjb25maWcnXT4gPSB7IC4uLmJhc2UsIC4uLm92ZXJyaWRlIH1cblxuICBpZiAoYmFzZS5waW5vIHx8IG92ZXJyaWRlLnBpbm8pIHtcbiAgICBtZXJnZWQucGlubyA9IHtcbiAgICAgIC4uLmJhc2UucGlubyxcbiAgICAgIC4uLm92ZXJyaWRlLnBpbm8sXG4gICAgICAuLi4oYmFzZS5waW5vPy5wcmV0dHlQcmludCAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICBvdmVycmlkZS5waW5vPy5wcmV0dHlQcmludCAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8ge1xuICAgICAgICAgICAgcHJldHR5UHJpbnQ6IG92ZXJyaWRlLnBpbm8/LnByZXR0eVByaW50ID8/IGJhc2UucGlubz8ucHJldHR5UHJpbnRcbiAgICAgICAgICB9XG4gICAgICAgIDoge30pXG4gICAgfVxuICB9XG5cbiAgaWYgKGJhc2UubG9nRmlsdGVyIHx8IG92ZXJyaWRlLmxvZ0ZpbHRlcikge1xuICAgIG1lcmdlZC5sb2dGaWx0ZXIgPSB7XG4gICAgICAuLi5iYXNlLmxvZ0ZpbHRlcixcbiAgICAgIC4uLm92ZXJyaWRlLmxvZ0ZpbHRlclxuICAgIH1cbiAgfVxuXG4gIGlmIChiYXNlLmxvZ1JvdGF0aW9uIHx8IG92ZXJyaWRlLmxvZ1JvdGF0aW9uKSB7XG4gICAgbWVyZ2VkLmxvZ1JvdGF0aW9uID0ge1xuICAgICAgLi4uYmFzZS5sb2dSb3RhdGlvbixcbiAgICAgIC4uLm92ZXJyaWRlLmxvZ1JvdGF0aW9uXG4gICAgfVxuICB9XG5cbiAgaWYgKGJhc2UudGltZXN0YW1wIHx8IG92ZXJyaWRlLnRpbWVzdGFtcCkge1xuICAgIG1lcmdlZC50aW1lc3RhbXAgPSB7XG4gICAgICAuLi5iYXNlLnRpbWVzdGFtcCxcbiAgICAgIC4uLm92ZXJyaWRlLnRpbWVzdGFtcFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtZXJnZWRcbn1cblxuLyoqIEFwcGxpZXMgcHJlc2V0IGRlZmF1bHRzOyBleHBsaWNpdCBgY29uZmlnYCBrZXlzIG92ZXJyaWRlIHByZXNldCB2YWx1ZXMuICovXG5leHBvcnQgY29uc3QgcmVzb2x2ZU9wdGlvbnMgPSAob3B0aW9uczogT3B0aW9ucyA9IHt9KTogT3B0aW9ucyA9PiB7XG4gIGNvbnN0IHByZXNldCA9IG9wdGlvbnMucHJlc2V0XG4gIGlmICghcHJlc2V0KSB7XG4gICAgcmV0dXJuIG9wdGlvbnNcbiAgfVxuXG4gIGNvbnN0IHByZXNldENvbmZpZyA9IFBSRVNFVF9ERUZBVUxUU1twcmVzZXRdXG4gIHJldHVybiB7XG4gICAgLi4ub3B0aW9ucyxcbiAgICBjb25maWc6IG1lcmdlQ29uZmlnKHByZXNldENvbmZpZywgb3B0aW9ucy5jb25maWcpXG4gIH1cbn1cbiIsCiAgICAiLyoqIEhUVFAgYFJlcXVlc3RgIG9yIFdlYlNvY2tldCBpbnN0YW5jZSBmb3IgYWNjdW11bGF0ZWQgY29udGV4dC4gKi9cbmV4cG9ydCB0eXBlIENvbnRleHRLZXkgPSBSZXF1ZXN0IHwgb2JqZWN0XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVxdWVzdENvbnRleHRTdG9yZSB7XG4gIGNsZWFyQ29udGV4dDogKGtleTogQ29udGV4dEtleSkgPT4gdm9pZFxuICBnZXRDb250ZXh0OiAoa2V5OiBDb250ZXh0S2V5KSA9PiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj5cbiAgbWVyZ2VDb250ZXh0OiAoa2V5OiBDb250ZXh0S2V5LCBwYXJ0aWFsOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4gdm9pZFxufVxuXG5leHBvcnQgY29uc3QgY3JlYXRlUmVxdWVzdENvbnRleHRTdG9yZSA9ICgpOiBSZXF1ZXN0Q29udGV4dFN0b3JlID0+IHtcbiAgY29uc3QgYmFncyA9IG5ldyBXZWFrTWFwPENvbnRleHRLZXksIFJlY29yZDxzdHJpbmcsIHVua25vd24+PigpXG5cbiAgY29uc3QgZ2V0T3JDcmVhdGUgPSAoa2V5OiBDb250ZXh0S2V5KTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT4ge1xuICAgIGxldCBiYWcgPSBiYWdzLmdldChrZXkpXG4gICAgaWYgKCFiYWcpIHtcbiAgICAgIGJhZyA9IHt9XG4gICAgICBiYWdzLnNldChrZXksIGJhZylcbiAgICB9XG4gICAgcmV0dXJuIGJhZ1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBtZXJnZUNvbnRleHQoa2V5LCBwYXJ0aWFsKSB7XG4gICAgICBpZiAoT2JqZWN0LmtleXMocGFydGlhbCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgY29uc3QgYmFnID0gZ2V0T3JDcmVhdGUoa2V5KVxuICAgICAgT2JqZWN0LmFzc2lnbihiYWcsIHBhcnRpYWwpXG4gICAgfSxcbiAgICBnZXRDb250ZXh0KGtleSkge1xuICAgICAgY29uc3QgYmFnID0gYmFncy5nZXQoa2V5KVxuICAgICAgcmV0dXJuIGJhZyA/IHsgLi4uYmFnIH0gOiB7fVxuICAgIH0sXG4gICAgY2xlYXJDb250ZXh0KGtleSkge1xuICAgICAgYmFncy5kZWxldGUoa2V5KVxuICAgIH1cbiAgfVxufVxuXG4vKiogQWNjdW11bGF0ZWQgcmVxdWVzdCBjb250ZXh0IGZpcnN0OyBleHBsaWNpdCBgZGF0YS5jb250ZXh0YCB3aW5zIG9uIGtleSBjb2xsaXNpb24uICovXG5leHBvcnQgY29uc3QgbWVyZ2VMb2dEYXRhQ29udGV4dCA9IChcbiAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIGFjY3VtdWxhdGVkOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj5cbik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+IHtcbiAgY29uc3QgZXhwbGljaXQgPSBkYXRhLmNvbnRleHRcbiAgY29uc3QgaGFzQWNjdW11bGF0ZWQgPSBPYmplY3Qua2V5cyhhY2N1bXVsYXRlZCkubGVuZ3RoID4gMFxuICBjb25zdCBoYXNFeHBsaWNpdCA9XG4gICAgZXhwbGljaXQgIT09IHVuZGVmaW5lZCAmJlxuICAgIGV4cGxpY2l0ICE9PSBudWxsICYmXG4gICAgdHlwZW9mIGV4cGxpY2l0ID09PSAnb2JqZWN0JyAmJlxuICAgICFBcnJheS5pc0FycmF5KGV4cGxpY2l0KSAmJlxuICAgIE9iamVjdC5rZXlzKGV4cGxpY2l0IGFzIG9iamVjdCkubGVuZ3RoID4gMFxuXG4gIGlmICghKGhhc0FjY3VtdWxhdGVkIHx8IGhhc0V4cGxpY2l0KSkge1xuICAgIHJldHVybiBkYXRhXG4gIH1cblxuICBjb25zdCBtZXJnZWRDb250ZXh0ID0ge1xuICAgIC4uLmFjY3VtdWxhdGVkLFxuICAgIC4uLihoYXNFeHBsaWNpdCA/IChleHBsaWNpdCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgOiB7fSlcbiAgfVxuXG4gIHJldHVybiB7IC4uLmRhdGEsIGNvbnRleHQ6IG1lcmdlZENvbnRleHQgfVxufVxuIiwKICAgICJpbXBvcnQgeyBjcmVhdGVSZXF1aXJlIH0gZnJvbSAnbm9kZTptb2R1bGUnXG5cbmNvbnN0IGVseXNpYVBrZzogeyB2ZXJzaW9uPzogc3RyaW5nIH0gPSAoKCkgPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IHJlcXVpcmUgPSBjcmVhdGVSZXF1aXJlKGltcG9ydC5tZXRhLnVybClcbiAgICByZXR1cm4gcmVxdWlyZSgnZWx5c2lhL3BhY2thZ2UuanNvbicpIGFzIHsgdmVyc2lvbj86IHN0cmluZyB9XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB7fVxuICB9XG59KSgpXG5cbmNvbnN0IGxvZ2l4bHlzaWFQa2c6IHsgdmVyc2lvbj86IHN0cmluZyB9ID0gKCgpID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXF1aXJlID0gY3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpXG4gICAgcmV0dXJuIHJlcXVpcmUoJy4uLy4uL3BhY2thZ2UuanNvbicpIGFzIHsgdmVyc2lvbj86IHN0cmluZyB9XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB7fVxuICB9XG59KSgpXG5cbmNvbnN0IGNlbnRlclRleHQgPSAodGV4dDogc3RyaW5nLCB3aWR0aDogbnVtYmVyKTogc3RyaW5nID0+IHtcbiAgaWYgKHRleHQubGVuZ3RoID49IHdpZHRoKSB7XG4gICAgcmV0dXJuIHRleHQuc2xpY2UoMCwgd2lkdGgpXG4gIH1cblxuICBjb25zdCBsZWZ0ID0gTWF0aC5mbG9vcigod2lkdGggLSB0ZXh0Lmxlbmd0aCkgLyAyKVxuICBjb25zdCByaWdodCA9IHdpZHRoIC0gdGV4dC5sZW5ndGggLSBsZWZ0XG4gIHJldHVybiBgJHsnICcucmVwZWF0KGxlZnQpfSR7dGV4dH0keycgJy5yZXBlYXQocmlnaHQpfWBcbn1cblxudHlwZSBSb3dTcGVjID1cbiAgfCB7IGtpbmQ6ICdlbXB0eScgfVxuICB8IHsga2luZDogJ2NlbnRlcic7IHRleHQ6IHN0cmluZyB9XG4gIHwgeyBraW5kOiAnbGVmdCc7IHRleHQ6IHN0cmluZyB9XG5cbi8qKlxuICogQm94IGJhbm5lcjogRWx5c2lhIHZlcnNpb24gKGNlbnRlcmVkKSwgVVJMIGxpbmUsIG9wdGlvbmFsIGxvZ2l4bHlzaWEgdmVyc2lvbiBsaW5lLlxuICovXG5leHBvcnQgY29uc3QgcmVuZGVyQmFubmVyID0gKFxuICB1cmxEaXNwbGF5TGluZTogc3RyaW5nLFxuICBsb2dpeGx5c2lhTGluZTogc3RyaW5nIHwgbnVsbFxuKTogc3RyaW5nID0+IHtcbiAgY29uc3QgdmVyc2lvbiA9IGVseXNpYVBrZy52ZXJzaW9uXG4gIGNvbnN0IHZlcnNpb25MaW5lID0gdmVyc2lvbiA/IGBFbHlzaWEgdiR7dmVyc2lvbn1gIDogJ0VseXNpYSdcblxuICBjb25zdCByb3dzOiBSb3dTcGVjW10gPSBbXG4gICAgeyBraW5kOiAnZW1wdHknIH0sXG4gICAgeyBraW5kOiAnY2VudGVyJywgdGV4dDogdmVyc2lvbkxpbmUgfSxcbiAgICB7IGtpbmQ6ICdlbXB0eScgfSxcbiAgICB7IGtpbmQ6ICdsZWZ0JywgdGV4dDogdXJsRGlzcGxheUxpbmUgfVxuICBdXG4gIGlmIChsb2dpeGx5c2lhTGluZSkge1xuICAgIHJvd3MucHVzaCh7IGtpbmQ6ICdsZWZ0JywgdGV4dDogbG9naXhseXNpYUxpbmUgfSlcbiAgfVxuICByb3dzLnB1c2goeyBraW5kOiAnZW1wdHknIH0pXG5cbiAgY29uc3QgY29udGVudFdpZHRoID0gTWF0aC5tYXgoXG4gICAgdmVyc2lvbkxpbmUubGVuZ3RoLFxuICAgIHVybERpc3BsYXlMaW5lLmxlbmd0aCxcbiAgICAuLi4obG9naXhseXNpYUxpbmUgPyBbbG9naXhseXNpYUxpbmUubGVuZ3RoXSA6IFswXSlcbiAgKVxuICBjb25zdCBpbm5lcldpZHRoID0gY29udGVudFdpZHRoICsgNFxuXG4gIGNvbnN0IHRvcCA9IGDilIwkeyfilIAnLnJlcGVhdChpbm5lcldpZHRoKX3ilJBgXG4gIGNvbnN0IGJvdCA9IGDilJQkeyfilIAnLnJlcGVhdChpbm5lcldpZHRoKX3ilJhgXG4gIGNvbnN0IGVtcHR5Um93ID0gYOKUgiR7JyAnLnJlcGVhdChpbm5lcldpZHRoKX3ilIJgXG5cbiAgY29uc3Qgb3V0OiBzdHJpbmdbXSA9IFt0b3BdXG4gIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcbiAgICBpZiAocm93LmtpbmQgPT09ICdlbXB0eScpIHtcbiAgICAgIG91dC5wdXNoKGVtcHR5Um93KVxuICAgICAgY29udGludWVcbiAgICB9XG4gICAgaWYgKHJvdy5raW5kID09PSAnY2VudGVyJykge1xuICAgICAgb3V0LnB1c2goYOKUgiR7Y2VudGVyVGV4dChyb3cudGV4dCwgaW5uZXJXaWR0aCl94pSCYClcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGNvbnN0IHRleHQgPSByb3cudGV4dFxuICAgIGNvbnN0IHBhZGRpbmcgPSBNYXRoLm1heCgwLCBpbm5lcldpZHRoIC0gdGV4dC5sZW5ndGggLSA0KVxuICAgIG91dC5wdXNoKGDilIIgICR7dGV4dH0keycgJy5yZXBlYXQocGFkZGluZyl9ICDilIJgKVxuICB9XG4gIG91dC5wdXNoKGJvdClcbiAgcmV0dXJuIG91dC5qb2luKCdcXG4nKVxufVxuXG5leHBvcnQgY29uc3QgZ2V0TG9naXhseXNpYVZlcnNpb25MaW5lID0gKCk6IHN0cmluZyB8IG51bGwgPT4ge1xuICBjb25zdCB2ID0gbG9naXhseXNpYVBrZy52ZXJzaW9uXG4gIGlmICghdikge1xuICAgIHJldHVybiBudWxsXG4gIH1cbiAgcmV0dXJuIGAgICAgIGxvZ2l4bHlzaWEgdiR7dn1gXG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgT3B0aW9ucyB9IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQgeyBnZXRMb2dpeGx5c2lhVmVyc2lvbkxpbmUsIHJlbmRlckJhbm5lciB9IGZyb20gJy4vYmFubmVyJ1xuXG5leHBvcnQgY29uc3Qgc3RhcnRTZXJ2ZXIgPSAoXG4gIHNlcnZlcjogeyBwb3J0PzogbnVtYmVyOyBob3N0bmFtZT86IHN0cmluZzsgcHJvdG9jb2w/OiBzdHJpbmcgfCBudWxsIH0sXG4gIG9wdGlvbnM6IE9wdGlvbnNcbik6IHZvaWQgPT4ge1xuICBjb25zdCBzaG93U3RhcnR1cE1lc3NhZ2UgPSBvcHRpb25zLmNvbmZpZz8uc2hvd1N0YXJ0dXBNZXNzYWdlID8/IHRydWVcbiAgaWYgKCFzaG93U3RhcnR1cE1lc3NhZ2UpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHsgcG9ydCwgaG9zdG5hbWUsIHByb3RvY29sIH0gPSBzZXJ2ZXJcbiAgaWYgKHBvcnQgPT09IHVuZGVmaW5lZCB8fCAhaG9zdG5hbWUgfHwgIXByb3RvY29sKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCB1cmwgPSBgJHtwcm90b2NvbH06Ly8ke2hvc3RuYW1lfToke3BvcnR9YFxuICBjb25zdCBtZXNzYWdlID0gYPCfpoogRWx5c2lhIGlzIHJ1bm5pbmcgYXQgJHt1cmx9YFxuICBjb25zdCB1cmxEaXNwbGF5TGluZSA9IGDwn6aKICAke3VybH1gXG5cbiAgY29uc3QgZm9ybWF0ID0gb3B0aW9ucy5jb25maWc/LnN0YXJ0dXBNZXNzYWdlRm9ybWF0ID8/ICdiYW5uZXInXG4gIGlmIChmb3JtYXQgPT09ICdzaW1wbGUnKSB7XG4gICAgY29uc29sZS5sb2cobWVzc2FnZSlcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnNvbGUubG9nKHJlbmRlckJhbm5lcih1cmxEaXNwbGF5TGluZSwgZ2V0TG9naXhseXNpYVZlcnNpb25MaW5lKCkpKVxufVxuIiwKICAgICJpbXBvcnQgcGlubyBmcm9tICdwaW5vJ1xuaW1wb3J0IHtcbiAgY3JlYXRlUmVxdWVzdENvbnRleHRTdG9yZSxcbiAgbWVyZ2VMb2dEYXRhQ29udGV4dCxcbiAgdHlwZSBSZXF1ZXN0Q29udGV4dFN0b3JlXG59IGZyb20gJy4uL2NvbnRleHQvcmVxdWVzdC1jb250ZXh0J1xuaW1wb3J0IHR5cGUge1xuICBMb2dGaWx0ZXIsXG4gIExvZ2dlcixcbiAgTG9nTGV2ZWwsXG4gIE9wdGlvbnMsXG4gIFBpbm8sXG4gIFJlcXVlc3RJbmZvLFxuICBTdG9yZURhdGFcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcydcbmltcG9ydCB7IGxvZ1RvVHJhbnNwb3J0cyB9IGZyb20gJy4uL291dHB1dCdcbmltcG9ydCB7IGxvZ1RvRmlsZSB9IGZyb20gJy4uL291dHB1dC9maWxlJ1xuaW1wb3J0IHsgcmVkYWN0LCByZWRhY3RSZXF1ZXN0IH0gZnJvbSAnLi4vdXRpbHMvcmVkYWN0J1xuaW1wb3J0IHsgZm9ybWF0TG9nT3V0cHV0IH0gZnJvbSAnLi9jcmVhdGUtbG9nZ2VyJ1xuaW1wb3J0IHsgaGFuZGxlSHR0cEVycm9yIH0gZnJvbSAnLi9oYW5kbGUtaHR0cC1lcnJvcidcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZUxvZ2dlciA9IChcbiAgb3B0aW9uczogT3B0aW9ucyA9IHt9LFxuICBwaW5vRmFjdG9yeTogdHlwZW9mIHBpbm8gPSBwaW5vLFxuICBleHRlcm5hbENvbnRleHRTdG9yZT86IFJlcXVlc3RDb250ZXh0U3RvcmVcbik6IExvZ2dlciA9PiB7XG4gIGNvbnN0IGNvbnRleHRTdG9yZSA9IGV4dGVybmFsQ29udGV4dFN0b3JlID8/IGNyZWF0ZVJlcXVlc3RDb250ZXh0U3RvcmUoKVxuICBjb25zdCBjb25maWcgPSBvcHRpb25zLmNvbmZpZ1xuXG4gIGNvbnN0IHBpbm9Db25maWcgPSBjb25maWc/LnBpbm9cbiAgY29uc3QgeyBwcmV0dHlQcmludCwgLi4ucGlub09wdGlvbnMgfSA9IHBpbm9Db25maWcgPz8ge31cblxuICBjb25zdCBwcmV0dHlQcmludE9wdGlvbnMgPVxuICAgIHR5cGVvZiBwcmV0dHlQcmludCA9PT0gJ29iamVjdCcgJiYgcHJldHR5UHJpbnQgIT09IG51bGxcbiAgICAgID8gKHByZXR0eVByaW50IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVxuICAgICAgOiB1bmRlZmluZWRcblxuICBjb25zdCBlbmFibGVQcmV0dHlQcmludCA9XG4gICAgcHJldHR5UHJpbnQgPT09IHRydWUgfHwgcHJldHR5UHJpbnRPcHRpb25zICE9PSB1bmRlZmluZWRcblxuICBjb25zdCBzaG91bGRQcmV0dHlQcmludCA9XG4gICAgZW5hYmxlUHJldHR5UHJpbnQgJiYgcGlub09wdGlvbnMudHJhbnNwb3J0ID09PSB1bmRlZmluZWRcblxuICBjb25zdCBtZXNzYWdlS2V5ID1cbiAgICAocHJldHR5UHJpbnRPcHRpb25zPy5tZXNzYWdlS2V5IGFzIHN0cmluZyB8IHVuZGVmaW5lZCkgPz9cbiAgICBwaW5vT3B0aW9ucy5tZXNzYWdlS2V5XG4gIGNvbnN0IGVycm9yS2V5ID1cbiAgICAocHJldHR5UHJpbnRPcHRpb25zPy5lcnJvcktleSBhcyBzdHJpbmcgfCB1bmRlZmluZWQpID8/IHBpbm9PcHRpb25zLmVycm9yS2V5XG5cbiAgY29uc3QgdHJhbnNwb3J0ID0gc2hvdWxkUHJldHR5UHJpbnRcbiAgICA/IHtcbiAgICAgICAgdGFyZ2V0OiAncGluby1wcmV0dHknLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgY29sb3JpemU6IHByb2Nlc3Muc3Rkb3V0Py5pc1RUWSA9PT0gdHJ1ZSxcbiAgICAgICAgICB0cmFuc2xhdGVUaW1lOiBjb25maWc/LnRpbWVzdGFtcD8udHJhbnNsYXRlVGltZSxcbiAgICAgICAgICAuLi5wcmV0dHlQcmludE9wdGlvbnMsXG4gICAgICAgICAgbWVzc2FnZUtleSxcbiAgICAgICAgICBlcnJvcktleVxuICAgICAgICB9XG4gICAgICB9XG4gICAgOiBwaW5vT3B0aW9ucy50cmFuc3BvcnRcblxuICBjb25zdCBwaW5vTG9nZ2VyOiBQaW5vID0gcGlub0ZhY3Rvcnkoe1xuICAgIC4uLnBpbm9PcHRpb25zLFxuICAgIGxldmVsOiBwaW5vT3B0aW9ucy5sZXZlbCA/PyAnaW5mbycsXG4gICAgbWVzc2FnZUtleSxcbiAgICBlcnJvcktleSxcbiAgICB0cmFuc3BvcnRcbiAgfSlcblxuICBjb25zdCBzaG91bGRMb2cgPSAobGV2ZWw6IExvZ0xldmVsLCBsb2dGaWx0ZXI/OiBMb2dGaWx0ZXIpOiBib29sZWFuID0+IHtcbiAgICBpZiAoIWxvZ0ZpbHRlcj8ubGV2ZWwgfHwgbG9nRmlsdGVyLmxldmVsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgcmV0dXJuIGxvZ0ZpbHRlci5sZXZlbC5pbmNsdWRlcyhsZXZlbClcbiAgfVxuXG4gIGNvbnN0IHVzZVRyYW5zcG9ydHNPbmx5ID0gY29uZmlnPy51c2VUcmFuc3BvcnRzT25seSA9PT0gdHJ1ZVxuICBjb25zdCBkaXNhYmxlSW50ZXJuYWxMb2dnZXIgPSBjb25maWc/LmRpc2FibGVJbnRlcm5hbExvZ2dlciA9PT0gdHJ1ZVxuICBjb25zdCBkaXNhYmxlRmlsZUxvZ2dpbmcgPSBjb25maWc/LmRpc2FibGVGaWxlTG9nZ2luZyA9PT0gdHJ1ZVxuXG4gIGNvbnN0IGhhc1RyYW5zcG9ydHMgPSAoY29uZmlnPy50cmFuc3BvcnRzPy5sZW5ndGggPz8gMCkgPiAwXG4gIGNvbnN0IGhhc0ZpbGVMb2dnaW5nID1cbiAgICAhKHVzZVRyYW5zcG9ydHNPbmx5IHx8IGRpc2FibGVGaWxlTG9nZ2luZykgJiYgISFjb25maWc/LmxvZ0ZpbGVQYXRoXG4gIGNvbnN0IGhhc0ludGVybmFsTG9nZ2VyID0gISh1c2VUcmFuc3BvcnRzT25seSB8fCBkaXNhYmxlSW50ZXJuYWxMb2dnZXIpXG4gIGNvbnN0IGlzRWZmZWN0aXZlbHlEaXNhYmxlZCA9ICEoXG4gICAgaGFzVHJhbnNwb3J0cyB8fFxuICAgIGhhc0ZpbGVMb2dnaW5nIHx8XG4gICAgaGFzSW50ZXJuYWxMb2dnZXJcbiAgKVxuXG4gIGNvbnN0IGxvZyA9IChcbiAgICBsZXZlbDogTG9nTGV2ZWwsXG4gICAgcmVxdWVzdDogUmVxdWVzdEluZm8sXG4gICAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgc3RvcmU6IFN0b3JlRGF0YVxuICApOiB2b2lkID0+IHtcbiAgICBpZiAoaXNFZmZlY3RpdmVseURpc2FibGVkIHx8ICFzaG91bGRMb2cobGV2ZWwsIGNvbmZpZz8ubG9nRmlsdGVyKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgZGF0YVdpdGhDb250ZXh0ID0gbWVyZ2VMb2dEYXRhQ29udGV4dChcbiAgICAgIGRhdGEsXG4gICAgICBjb250ZXh0U3RvcmUuZ2V0Q29udGV4dChyZXF1ZXN0KVxuICAgIClcbiAgICBjb25zdCBsb2dEYXRhID1cbiAgICAgIGNvbmZpZz8uYXV0b1JlZGFjdCA9PT0gdHJ1ZSA/IHJlZGFjdChkYXRhV2l0aENvbnRleHQpIDogZGF0YVdpdGhDb250ZXh0XG4gICAgY29uc3QgbG9nUmVxdWVzdCA9XG4gICAgICBjb25maWc/LmF1dG9SZWRhY3QgPT09IHRydWUgPyByZWRhY3RSZXF1ZXN0KHJlcXVlc3QpIDogcmVxdWVzdFxuXG4gICAgaWYgKGhhc1RyYW5zcG9ydHMpIHtcbiAgICAgIGxvZ1RvVHJhbnNwb3J0cyh7XG4gICAgICAgIGxldmVsLFxuICAgICAgICByZXF1ZXN0OiBsb2dSZXF1ZXN0LFxuICAgICAgICBkYXRhOiBsb2dEYXRhLFxuICAgICAgICBzdG9yZSxcbiAgICAgICAgb3B0aW9uc1xuICAgICAgfSlcbiAgICB9XG5cbiAgICBpZiAoaGFzRmlsZUxvZ2dpbmcpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gY29uZmlnPy5sb2dGaWxlUGF0aFxuICAgICAgaWYgKGZpbGVQYXRoKSB7XG4gICAgICAgIGxvZ1RvRmlsZSh7XG4gICAgICAgICAgZmlsZVBhdGgsXG4gICAgICAgICAgbGV2ZWwsXG4gICAgICAgICAgcmVxdWVzdDogbG9nUmVxdWVzdCxcbiAgICAgICAgICBkYXRhOiBsb2dEYXRhLFxuICAgICAgICAgIHN0b3JlLFxuICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgfSkuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgIC8qIElnbm9yZSBlcnJvcnMgKi9cbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWhhc0ludGVybmFsTG9nZ2VyKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCB7IG1haW4sIGNvbnRleHRMaW5lcyB9ID0gZm9ybWF0TG9nT3V0cHV0KHtcbiAgICAgIGxldmVsLFxuICAgICAgcmVxdWVzdDogbG9nUmVxdWVzdCxcbiAgICAgIGRhdGE6IGxvZ0RhdGEsXG4gICAgICBzdG9yZSxcbiAgICAgIG9wdGlvbnNcbiAgICB9KVxuICAgIGNvbnN0IG1lc3NhZ2UgPVxuICAgICAgY29udGV4dExpbmVzLmxlbmd0aCA+IDAgPyBgJHttYWlufVxcbiR7Y29udGV4dExpbmVzLmpvaW4oJ1xcbicpfWAgOiBtYWluXG5cbiAgICBzd2l0Y2ggKGxldmVsKSB7XG4gICAgICBjYXNlICdERUJVRyc6IHtcbiAgICAgICAgY29uc29sZS5kZWJ1ZyhtZXNzYWdlKVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgY2FzZSAnSU5GTyc6IHtcbiAgICAgICAgY29uc29sZS5pbmZvKG1lc3NhZ2UpXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBjYXNlICdXQVJOSU5HJzoge1xuICAgICAgICBjb25zb2xlLndhcm4obWVzc2FnZSlcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0VSUk9SJzoge1xuICAgICAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UpXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIGNvbnNvbGUubG9nKG1lc3NhZ2UpXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgbG9nV2l0aENvbnRleHQgPSAoXG4gICAgbGV2ZWw6IExvZ0xldmVsLFxuICAgIHJlcXVlc3Q6IFJlcXVlc3RJbmZvLFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICBjb250ZXh0PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKTogdm9pZCA9PiB7XG4gICAgaWYgKGlzRWZmZWN0aXZlbHlEaXNhYmxlZCB8fCAhc2hvdWxkTG9nKGxldmVsLCBjb25maWc/LmxvZ0ZpbHRlcikpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCBzdG9yZTogU3RvcmVEYXRhID0geyBiZWZvcmVUaW1lOiBwcm9jZXNzLmhydGltZS5iaWdpbnQoKSB9XG4gICAgbG9nKGxldmVsLCByZXF1ZXN0LCB7IG1lc3NhZ2UsIGNvbnRleHQgfSwgc3RvcmUpXG4gIH1cblxuICByZXR1cm4ge1xuICAgIHBpbm86IHBpbm9Mb2dnZXIsXG4gICAgbWVyZ2VDb250ZXh0OiAocmVxdWVzdCwgcGFydGlhbCkgPT4ge1xuICAgICAgY29udGV4dFN0b3JlLm1lcmdlQ29udGV4dChyZXF1ZXN0LCBwYXJ0aWFsKVxuICAgIH0sXG4gICAgZ2V0Q29udGV4dDogcmVxdWVzdCA9PiBjb250ZXh0U3RvcmUuZ2V0Q29udGV4dChyZXF1ZXN0KSxcbiAgICBsb2csXG4gICAgaGFuZGxlSHR0cEVycm9yOiAocmVxdWVzdCwgZXJyb3IsIHN0b3JlKSA9PiB7XG4gICAgICBoYW5kbGVIdHRwRXJyb3IocmVxdWVzdCwgZXJyb3IsIHN0b3JlLCBvcHRpb25zLCBjb250ZXh0U3RvcmUpXG4gICAgfSxcbiAgICBkZWJ1ZzogKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpID0+IHtcbiAgICAgIGxvZ1dpdGhDb250ZXh0KCdERUJVRycsIHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpXG4gICAgfSxcbiAgICBpbmZvOiAocmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dCkgPT4ge1xuICAgICAgbG9nV2l0aENvbnRleHQoJ0lORk8nLCByZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KVxuICAgIH0sXG4gICAgd2FybjogKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpID0+IHtcbiAgICAgIGxvZ1dpdGhDb250ZXh0KCdXQVJOSU5HJywgcmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dClcbiAgICB9LFxuICAgIGVycm9yOiAocmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dCkgPT4ge1xuICAgICAgbG9nV2l0aENvbnRleHQoJ0VSUk9SJywgcmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dClcbiAgICB9XG4gIH1cbn1cblxuLyoqIFBsdWdpbiBlbnRyeTogc2hhcmVzIG9uZSByZXF1ZXN0LWNvbnRleHQgc3RvcmUgYWNyb3NzIHRoZSBFbHlzaWEgbGlmZWN5Y2xlLiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZVBsdWdpbkxvZ2dlciA9IChcbiAgb3B0aW9uczogT3B0aW9ucyxcbiAgY29udGV4dFN0b3JlOiBSZXF1ZXN0Q29udGV4dFN0b3JlXG4pOiBMb2dnZXIgPT4gY3JlYXRlTG9nZ2VyKG9wdGlvbnMsIHBpbm8sIGNvbnRleHRTdG9yZSlcbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBMb2dMZXZlbCwgT3B0aW9ucywgUmVxdWVzdEluZm8sIFN0b3JlRGF0YSB9IGZyb20gJy4uL2ludGVyZmFjZXMnXG5cbmludGVyZmFjZSBMb2dUb1RyYW5zcG9ydHNJbnB1dCB7XG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gIGxldmVsOiBMb2dMZXZlbFxuICBvcHRpb25zOiBPcHRpb25zXG4gIHJlcXVlc3Q6IFJlcXVlc3RJbmZvXG4gIHN0b3JlOiBTdG9yZURhdGFcbn1cblxuZXhwb3J0IGNvbnN0IGxvZ1RvVHJhbnNwb3J0cyA9IChcbiAgLi4uYXJnczpcbiAgICB8IFtMb2dUb1RyYW5zcG9ydHNJbnB1dF1cbiAgICB8IFtMb2dMZXZlbCwgUmVxdWVzdEluZm8sIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBTdG9yZURhdGEsIE9wdGlvbnNdXG4pOiB2b2lkID0+IHtcbiAgY29uc3QgaW5wdXQ6IExvZ1RvVHJhbnNwb3J0c0lucHV0ID1cbiAgICB0eXBlb2YgYXJnc1swXSA9PT0gJ3N0cmluZydcbiAgICAgID8ge1xuICAgICAgICAgIGxldmVsOiBhcmdzWzBdLFxuICAgICAgICAgIHJlcXVlc3Q6IGFyZ3NbMV0sXG4gICAgICAgICAgZGF0YTogYXJnc1syXSxcbiAgICAgICAgICBzdG9yZTogYXJnc1szXSxcbiAgICAgICAgICBvcHRpb25zOiBhcmdzWzRdXG4gICAgICAgIH1cbiAgICAgIDogYXJnc1swXVxuXG4gIGNvbnN0IHsgbGV2ZWwsIHJlcXVlc3QsIGRhdGEsIHN0b3JlLCBvcHRpb25zIH0gPSBpbnB1dFxuICBjb25zdCB0cmFuc3BvcnRzID0gb3B0aW9ucy5jb25maWc/LnRyYW5zcG9ydHMgPz8gW11cbiAgaWYgKHRyYW5zcG9ydHMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCBtZXNzYWdlID0gdHlwZW9mIGRhdGEubWVzc2FnZSA9PT0gJ3N0cmluZycgPyBkYXRhLm1lc3NhZ2UgOiAnJ1xuICBjb25zdCBtZXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHtcbiAgICByZXF1ZXN0OiB7XG4gICAgICBtZXRob2Q6IHJlcXVlc3QubWV0aG9kLFxuICAgICAgdXJsOiByZXF1ZXN0LnVybFxuICAgIH0sXG4gICAgLi4uZGF0YSxcbiAgICBiZWZvcmVUaW1lOiBzdG9yZS5iZWZvcmVUaW1lXG4gIH1cblxuICBmb3IgKGNvbnN0IHRyYW5zcG9ydCBvZiB0cmFuc3BvcnRzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRyYW5zcG9ydC5sb2cobGV2ZWwsIG1lc3NhZ2UsIG1ldGEpXG4gICAgICBpZiAoXG4gICAgICAgIHJlc3VsdCAmJlxuICAgICAgICB0eXBlb2YgKHJlc3VsdCBhcyB7IGNhdGNoPzogdW5rbm93biB9KS5jYXRjaCA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgKSB7XG4gICAgICAgIDsocmVzdWx0IGFzIFByb21pc2U8dm9pZD4pLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAvLyBJZ25vcmUgZXJyb3JzXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBUcmFuc3BvcnQgZmFpbHVyZXMgbXVzdCBuZXZlciBjcmFzaCBhcHBsaWNhdGlvbiBsb2dnaW5nLlxuICAgIH1cbiAgfVxufVxuIiwKICAgICJpbXBvcnQgeyBhcHBlbmRGaWxlIH0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcydcbmltcG9ydCB7IGRpcm5hbWUgfSBmcm9tICdub2RlOnBhdGgnXG5pbXBvcnQgdHlwZSB7IExvZ0xldmVsLCBPcHRpb25zLCBSZXF1ZXN0SW5mbywgU3RvcmVEYXRhIH0gZnJvbSAnLi4vaW50ZXJmYWNlcydcbmltcG9ydCB7IGVuc3VyZURpciB9IGZyb20gJy4vZnMnXG5pbXBvcnQgeyBwZXJmb3JtUm90YXRpb24sIHNob3VsZFJvdGF0ZSB9IGZyb20gJy4vcm90YXRpb24tbWFuYWdlcidcblxuLy8gUGVyLWZpbGUgbXV0ZXggdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbnMgZHVyaW5nIHJvdGF0aW9uXG5jb25zdCBmaWxlTG9ja3MgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTx2b2lkPj4oKVxuXG5jb25zdCBhY3F1aXJlTG9jayA9IChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTwoKSA9PiB2b2lkPiA9PiB7XG4gIGNvbnN0IHByaW9yID0gZmlsZUxvY2tzLmdldChmaWxlUGF0aCkgPz8gUHJvbWlzZS5yZXNvbHZlKClcblxuICBsZXQgcmVzb2x2ZUxvY2s6ICgpID0+IHZvaWRcbiAgY29uc3QgbmV3TG9jayA9IG5ldyBQcm9taXNlPHZvaWQ+KHJlc29sdmUgPT4ge1xuICAgIHJlc29sdmVMb2NrID0gcmVzb2x2ZVxuICB9KVxuXG4gIHJldHVybiBwcmlvci50aGVuKCgpID0+IHtcbiAgICAvLyBPbmx5IHNldCB0aGUgbG9jayBhZnRlciBhY3F1aXJpbmcgdGhlIHByaW9yIGxvY2sgdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbnNcbiAgICBmaWxlTG9ja3Muc2V0KGZpbGVQYXRoLCBuZXdMb2NrKVxuXG4gICAgLy8gQ3JpdGljYWwgc2VjdGlvbiBjYW4gbm93IHByb2NlZWRcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgcmVzb2x2ZUxvY2s/LigpXG4gICAgICBpZiAoZmlsZUxvY2tzLmdldChmaWxlUGF0aCkgPT09IG5ld0xvY2spIHtcbiAgICAgICAgZmlsZUxvY2tzLmRlbGV0ZShmaWxlUGF0aClcbiAgICAgIH1cbiAgICB9XG4gIH0pXG59XG5cbmludGVyZmFjZSBMb2dUb0ZpbGVJbnB1dCB7XG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gIGZpbGVQYXRoOiBzdHJpbmdcbiAgbGV2ZWw6IExvZ0xldmVsXG4gIG9wdGlvbnM6IE9wdGlvbnNcbiAgcmVxdWVzdDogUmVxdWVzdEluZm9cbiAgc3RvcmU6IFN0b3JlRGF0YVxufVxuXG5leHBvcnQgY29uc3QgbG9nVG9GaWxlID0gYXN5bmMgKFxuICAuLi5hcmdzOlxuICAgIHwgW0xvZ1RvRmlsZUlucHV0XVxuICAgIHwgW1xuICAgICAgICBzdHJpbmcsXG4gICAgICAgIExvZ0xldmVsLFxuICAgICAgICBSZXF1ZXN0SW5mbyxcbiAgICAgICAgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICAgIFN0b3JlRGF0YSxcbiAgICAgICAgT3B0aW9uc1xuICAgICAgXVxuKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IGlucHV0OiBMb2dUb0ZpbGVJbnB1dCA9XG4gICAgdHlwZW9mIGFyZ3NbMF0gPT09ICdzdHJpbmcnXG4gICAgICA/ICgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgW1xuICAgICAgICAgICAgZmlsZVBhdGhBcmcsXG4gICAgICAgICAgICBsZXZlbEFyZyxcbiAgICAgICAgICAgIHJlcXVlc3RBcmcsXG4gICAgICAgICAgICBkYXRhQXJnLFxuICAgICAgICAgICAgc3RvcmVBcmcsXG4gICAgICAgICAgICBvcHRpb25zQXJnXG4gICAgICAgICAgXSA9IGFyZ3MgYXMgW1xuICAgICAgICAgICAgc3RyaW5nLFxuICAgICAgICAgICAgTG9nTGV2ZWwsXG4gICAgICAgICAgICBSZXF1ZXN0SW5mbyxcbiAgICAgICAgICAgIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICAgICAgU3RvcmVEYXRhLFxuICAgICAgICAgICAgT3B0aW9uc1xuICAgICAgICAgIF1cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZmlsZVBhdGg6IGZpbGVQYXRoQXJnLFxuICAgICAgICAgICAgbGV2ZWw6IGxldmVsQXJnLFxuICAgICAgICAgICAgcmVxdWVzdDogcmVxdWVzdEFyZyxcbiAgICAgICAgICAgIGRhdGE6IGRhdGFBcmcsXG4gICAgICAgICAgICBzdG9yZTogc3RvcmVBcmcsXG4gICAgICAgICAgICBvcHRpb25zOiBvcHRpb25zQXJnXG4gICAgICAgICAgfVxuICAgICAgICB9KSgpXG4gICAgICA6IGFyZ3NbMF1cblxuICBjb25zdCB7IGZpbGVQYXRoLCBsZXZlbCwgcmVxdWVzdCwgZGF0YSwgc3RvcmUsIG9wdGlvbnMgfSA9IGlucHV0XG4gIGNvbnN0IGNvbmZpZyA9IG9wdGlvbnMuY29uZmlnXG4gIGNvbnN0IHVzZVRyYW5zcG9ydHNPbmx5ID0gY29uZmlnPy51c2VUcmFuc3BvcnRzT25seSA9PT0gdHJ1ZVxuICBjb25zdCBkaXNhYmxlRmlsZUxvZ2dpbmcgPSBjb25maWc/LmRpc2FibGVGaWxlTG9nZ2luZyA9PT0gdHJ1ZVxuICBpZiAodXNlVHJhbnNwb3J0c09ubHkgfHwgZGlzYWJsZUZpbGVMb2dnaW5nKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCBtZXNzYWdlID0gdHlwZW9mIGRhdGEubWVzc2FnZSA9PT0gJ3N0cmluZycgPyBkYXRhLm1lc3NhZ2UgOiAnJ1xuICBjb25zdCBkdXJhdGlvbk1zID1cbiAgICBzdG9yZS5iZWZvcmVUaW1lID09PSBCaWdJbnQoMClcbiAgICAgID8gMFxuICAgICAgOiBOdW1iZXIocHJvY2Vzcy5ocnRpbWUuYmlnaW50KCkgLSBzdG9yZS5iZWZvcmVUaW1lKSAvIDFfMDAwXzAwMFxuXG4gIC8vIFNhZmVseSBwYXJzZSBVUkwgdG8gYXZvaWQgY3Jhc2hlcyBvbiBtYWxmb3JtZWQgVVJMc1xuICBsZXQgcGF0aG5hbWUgPSAnLydcbiAgdHJ5IHtcbiAgICBjb25zdCB7IHBhdGhuYW1lOiByYXdQYXRobmFtZSwgc2VhcmNoIH0gPSBuZXcgVVJMKHJlcXVlc3QudXJsKVxuICAgIHBhdGhuYW1lID0gY29uZmlnPy5sb2dRdWVyeVBhcmFtcyA/IGAke3Jhd1BhdGhuYW1lfSR7c2VhcmNofWAgOiByYXdQYXRobmFtZVxuICB9IGNhdGNoIHtcbiAgICAvLyBGYWxsYmFjayB0byByYXcgVVJMIGlmIHBhcnNpbmcgZmFpbHNcbiAgICBwYXRobmFtZSA9IHJlcXVlc3QudXJsXG4gIH1cblxuICBjb25zdCBsaW5lID0gYCR7bGV2ZWx9ICR7ZHVyYXRpb25Ncy50b0ZpeGVkKDIpfW1zICR7cmVxdWVzdC5tZXRob2R9ICR7cGF0aG5hbWV9ICR7bWVzc2FnZX1cXG5gXG5cbiAgLy8gQWNxdWlyZSBsb2NrIGJlZm9yZSBhbnkgZmlsZSBvcGVyYXRpb25zIHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb25zXG4gIGNvbnN0IHJlbGVhc2VMb2NrID0gYXdhaXQgYWNxdWlyZUxvY2soZmlsZVBhdGgpXG5cbiAgdHJ5IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZW5zdXJlRGlyKGRpcm5hbWUoZmlsZVBhdGgpKVxuICAgICAgYXdhaXQgYXBwZW5kRmlsZShmaWxlUGF0aCwgbGluZSwgeyBlbmNvZGluZzogJ3V0Zi04JyB9KVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBMb2cgZmlsZSB3cml0ZSBlcnJvcnMgdG8gc3RkZXJyIHNvIHRoZXkncmUgbm90IGNvbXBsZXRlbHkgc2lsZW50XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBgW2xvZ2l4bHlzaWFdIEZhaWxlZCB0byB3cml0ZSB0byBsb2cgZmlsZSAke2ZpbGVQYXRofTpgLFxuICAgICAgICBlcnJvclxuICAgICAgKVxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG5cbiAgICBjb25zdCByb3RhdGlvbiA9IGNvbmZpZz8ubG9nUm90YXRpb25cbiAgICBpZiAoIXJvdGF0aW9uKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBzaG91bGQgPSBhd2FpdCBzaG91bGRSb3RhdGUoZmlsZVBhdGgsIHJvdGF0aW9uKVxuICAgIGlmIChzaG91bGQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHBlcmZvcm1Sb3RhdGlvbihmaWxlUGF0aCwgcm90YXRpb24pXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBMb2cgcm90YXRpb24gZXJyb3JzIGJ1dCBkb24ndCBjcmFzaCAtIGxvZyBlbnRyeSB3YXMgYWxyZWFkeSB3cml0dGVuXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgYFtsb2dpeGx5c2lhXSBGYWlsZWQgdG8gcm90YXRlIGxvZyBmaWxlICR7ZmlsZVBhdGh9OmAsXG4gICAgICAgICAgZXJyb3JcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICAvLyBSZWxlYXNlIGxvY2tcbiAgICByZWxlYXNlTG9jaygpXG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgcHJvbWlzZXMgYXMgZnMgfSBmcm9tICdub2RlOmZzJ1xuXG5leHBvcnQgY29uc3QgZW5zdXJlRGlyID0gYXN5bmMgKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4gPT4ge1xuICBhd2FpdCBmcy5ta2RpcihkaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KVxufVxuIiwKICAgICJpbXBvcnQgeyBwcm9taXNlcyBhcyBmcyB9IGZyb20gJ25vZGU6ZnMnXG5pbXBvcnQgeyBwcm9taXNpZnkgfSBmcm9tICdub2RlOnV0aWwnXG5pbXBvcnQgeyBnemlwIH0gZnJvbSAnbm9kZTp6bGliJ1xuaW1wb3J0IHR5cGUgeyBMb2dSb3RhdGlvbkNvbmZpZyB9IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQge1xuICBnZXRSb3RhdGVkRmlsZXMsXG4gIHBhcnNlUmV0ZW50aW9uLFxuICBwYXJzZVNpemUsXG4gIHNob3VsZFJvdGF0ZUJ5U2l6ZVxufSBmcm9tICcuLi91dGlscy9yb3RhdGlvbidcblxuY29uc3QgZ3ppcEFzeW5jID0gcHJvbWlzaWZ5KGd6aXApXG5cbi8vIENvbXByZXNzaW9uIGxvY2sgdG8gcHJldmVudCBjb25jdXJyZW50IGNvbXByZXNzaW9uIG9mIHRoZSBzYW1lIGZpbGVcbmNvbnN0IGNvbXByZXNzaW9uTG9ja3MgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTx2b2lkPj4oKVxuXG5jb25zdCBhY3F1aXJlQ29tcHJlc3Npb25Mb2NrID0gKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPCgpID0+IHZvaWQ+ID0+IHtcbiAgY29uc3QgcHJpb3IgPSBjb21wcmVzc2lvbkxvY2tzLmdldChmaWxlUGF0aCkgPz8gUHJvbWlzZS5yZXNvbHZlKClcblxuICBsZXQgcmVzb2x2ZUxvY2s6ICgpID0+IHZvaWRcbiAgY29uc3QgbmV3TG9jayA9IG5ldyBQcm9taXNlPHZvaWQ+KHJlc29sdmUgPT4ge1xuICAgIHJlc29sdmVMb2NrID0gcmVzb2x2ZVxuICB9KVxuXG4gIHJldHVybiBwcmlvci50aGVuKCgpID0+IHtcbiAgICAvLyBPbmx5IHNldCB0aGUgbG9jayBhZnRlciBhY3F1aXJpbmcgdGhlIHByaW9yIGxvY2sgdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbnNcbiAgICBjb21wcmVzc2lvbkxvY2tzLnNldChmaWxlUGF0aCwgbmV3TG9jaylcblxuICAgIC8vIENyaXRpY2FsIHNlY3Rpb24gY2FuIG5vdyBwcm9jZWVkXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHJlc29sdmVMb2NrPy4oKVxuICAgICAgaWYgKGNvbXByZXNzaW9uTG9ja3MuZ2V0KGZpbGVQYXRoKSA9PT0gbmV3TG9jaykge1xuICAgICAgICBjb21wcmVzc2lvbkxvY2tzLmRlbGV0ZShmaWxlUGF0aClcbiAgICAgIH1cbiAgICB9XG4gIH0pXG59XG5cbmNvbnN0IHBhZDIgPSAodmFsdWU6IG51bWJlcik6IHN0cmluZyA9PiBTdHJpbmcodmFsdWUpLnBhZFN0YXJ0KDIsICcwJylcblxuZXhwb3J0IGNvbnN0IGdldFJvdGF0ZWRGaWxlTmFtZSA9IChmaWxlUGF0aDogc3RyaW5nLCBkYXRlOiBEYXRlKTogc3RyaW5nID0+IHtcbiAgY29uc3QgeXl5eSA9IGRhdGUuZ2V0RnVsbFllYXIoKVxuICBjb25zdCBtbSA9IHBhZDIoZGF0ZS5nZXRNb250aCgpICsgMSlcbiAgY29uc3QgZGQgPSBwYWQyKGRhdGUuZ2V0RGF0ZSgpKVxuICBjb25zdCBISCA9IHBhZDIoZGF0ZS5nZXRIb3VycygpKVxuICBjb25zdCBNTSA9IHBhZDIoZGF0ZS5nZXRNaW51dGVzKCkpXG4gIGNvbnN0IHNzID0gcGFkMihkYXRlLmdldFNlY29uZHMoKSlcbiAgY29uc3QgU1NTID0gU3RyaW5nKGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCkpLnBhZFN0YXJ0KDMsICcwJylcbiAgcmV0dXJuIGAke2ZpbGVQYXRofS4ke3l5eXl9LSR7bW19LSR7ZGR9LSR7SEh9LSR7TU19LSR7c3N9LSR7U1NTfWBcbn1cblxuZXhwb3J0IGNvbnN0IHJvdGF0ZUZpbGUgPSBhc3luYyAoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdCA9IGF3YWl0IGZzLnN0YXQoZmlsZVBhdGgpXG4gICAgaWYgKHN0YXQuc2l6ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuICcnXG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIGNvbnN0IGJhc2VSb3RhdGVkID0gZ2V0Um90YXRlZEZpbGVOYW1lKGZpbGVQYXRoLCBuZXcgRGF0ZSgpKVxuICBjb25zdCByb3RhdGVkID0gYCR7YmFzZVJvdGF0ZWR9LSR7cHJvY2Vzcy5ocnRpbWUuYmlnaW50KCl9YFxuICBhd2FpdCBmcy5yZW5hbWUoZmlsZVBhdGgsIHJvdGF0ZWQpXG4gIHJldHVybiByb3RhdGVkXG59XG5cbmV4cG9ydCBjb25zdCBjb21wcmVzc0ZpbGUgPSBhc3luYyAoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4gPT4ge1xuICBjb25zdCByZWxlYXNlID0gYXdhaXQgYWNxdWlyZUNvbXByZXNzaW9uTG9jayhmaWxlUGF0aClcbiAgdHJ5IHtcbiAgICAvLyBDaGVjayBpZiBmaWxlIHN0aWxsIGV4aXN0cyAobWlnaHQgaGF2ZSBiZWVuIGNvbXByZXNzZWQgYnkgYW5vdGhlciBwcm9jZXNzKVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmcy5hY2Nlc3MoZmlsZVBhdGgpXG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBGaWxlIGRvZXNuJ3QgZXhpc3QsIGFscmVhZHkgY29tcHJlc3NlZCBvciBkZWxldGVkXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoZmlsZVBhdGgpXG4gICAgY29uc3QgY29tcHJlc3NlZCA9IGF3YWl0IGd6aXBBc3luYyhjb250ZW50KVxuICAgIGF3YWl0IGZzLndyaXRlRmlsZShgJHtmaWxlUGF0aH0uZ3pgLCBjb21wcmVzc2VkKVxuICAgIGF3YWl0IGZzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihgW2xvZ2l4bHlzaWFdIEZhaWxlZCB0byBjb21wcmVzcyBmaWxlICR7ZmlsZVBhdGh9OmAsIGVycm9yKVxuICAgIHRocm93IGVycm9yXG4gIH0gZmluYWxseSB7XG4gICAgcmVsZWFzZSgpXG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHNob3VsZFJvdGF0ZSA9IGFzeW5jIChcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgY29uZmlnOiBMb2dSb3RhdGlvbkNvbmZpZ1xuKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gIGlmIChjb25maWcubWF4U2l6ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgY29uc3QgbWF4U2l6ZSA9IHBhcnNlU2l6ZShjb25maWcubWF4U2l6ZSlcbiAgcmV0dXJuIGF3YWl0IHNob3VsZFJvdGF0ZUJ5U2l6ZShmaWxlUGF0aCwgbWF4U2l6ZSlcbn1cblxuY29uc3QgY2xlYW51cEJ5Q291bnQgPSBhc3luYyAoXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIG1heEZpbGVzOiBudW1iZXJcbik6IFByb21pc2U8dm9pZD4gPT4ge1xuICBjb25zdCByb3RhdGVkID0gYXdhaXQgZ2V0Um90YXRlZEZpbGVzKGZpbGVQYXRoKVxuICBpZiAocm90YXRlZC5sZW5ndGggPD0gbWF4RmlsZXMpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIC8vIFVzZSBQcm9taXNlLmFsbFNldHRsZWQgdG8gaGFuZGxlIGluZGl2aWR1YWwgZmlsZSBzdGF0IGZhaWx1cmVzIGdyYWNlZnVsbHlcbiAgY29uc3Qgc3RhdHNSZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFxuICAgIHJvdGF0ZWQubWFwKGFzeW5jIHAgPT4gKHsgcGF0aDogcCwgc3RhdDogYXdhaXQgZnMuc3RhdChwKSB9KSlcbiAgKVxuXG4gIC8vIEV4dHJhY3Qgc3VjY2Vzc2Z1bCBzdGF0cywgaWdub3JlIGZpbGVzIHRoYXQgd2VyZSBkZWxldGVkIGNvbmN1cnJlbnRseVxuICBjb25zdCBzdGF0cyA9IHN0YXRzUmVzdWx0c1xuICAgIC5maWx0ZXIoXG4gICAgICAoXG4gICAgICAgIHJlc3VsdFxuICAgICAgKTogcmVzdWx0IGlzIFByb21pc2VGdWxmaWxsZWRSZXN1bHQ8e1xuICAgICAgICBwYXRoOiBzdHJpbmdcbiAgICAgICAgc3RhdDogaW1wb3J0KCdub2RlOmZzJykuU3RhdHNcbiAgICAgIH0+ID0+IHJlc3VsdC5zdGF0dXMgPT09ICdmdWxmaWxsZWQnXG4gICAgKVxuICAgIC5tYXAocmVzdWx0ID0+IHJlc3VsdC52YWx1ZSlcblxuICBpZiAoc3RhdHMubGVuZ3RoIDw9IG1heEZpbGVzKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBzdGF0cy5zb3J0KChhLCBiKSA9PiBiLnN0YXQubXRpbWVNcyAtIGEuc3RhdC5tdGltZU1zKVxuICBjb25zdCB0b0RlbGV0ZSA9IHN0YXRzLnNsaWNlKG1heEZpbGVzKVxuXG4gIC8vIERlbGV0ZSBmaWxlcyBpbmRpdmlkdWFsbHksIGNvbnRpbnVpbmcgZXZlbiBpZiBzb21lIGZhaWxcbiAgY29uc3QgZGVsZXRlUmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChcbiAgICB0b0RlbGV0ZS5tYXAoKHsgcGF0aCB9KSA9PiBmcy5ybShwYXRoLCB7IGZvcmNlOiB0cnVlIH0pKVxuICApXG5cbiAgLy8gTG9nIGZhaWx1cmVzIGJ1dCBkb24ndCBjcmFzaFxuICBkZWxldGVSZXN1bHRzLmZvckVhY2goKHJlc3VsdCwgaWR4KSA9PiB7XG4gICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09ICdyZWplY3RlZCcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGBbbG9naXhseXNpYV0gRmFpbGVkIHRvIGRlbGV0ZSByb3RhdGVkIGxvZyAke3RvRGVsZXRlW2lkeF0ucGF0aH06YCxcbiAgICAgICAgcmVzdWx0LnJlYXNvblxuICAgICAgKVxuICAgIH1cbiAgfSlcbn1cblxuY29uc3QgY2xlYW51cEJ5VGltZSA9IGFzeW5jIChcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgbWF4QWdlTXM6IG51bWJlclxuKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IHJvdGF0ZWQgPSBhd2FpdCBnZXRSb3RhdGVkRmlsZXMoZmlsZVBhdGgpXG4gIGlmIChyb3RhdGVkLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKVxuXG4gIC8vIFVzZSBQcm9taXNlLmFsbFNldHRsZWQgdG8gaGFuZGxlIGluZGl2aWR1YWwgZmlsZSBzdGF0IGZhaWx1cmVzIGdyYWNlZnVsbHlcbiAgY29uc3Qgc3RhdHNSZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFxuICAgIHJvdGF0ZWQubWFwKGFzeW5jIHAgPT4gKHsgcGF0aDogcCwgc3RhdDogYXdhaXQgZnMuc3RhdChwKSB9KSlcbiAgKVxuXG4gIC8vIEV4dHJhY3Qgc3VjY2Vzc2Z1bCBzdGF0c1xuICBjb25zdCBzdGF0cyA9IHN0YXRzUmVzdWx0c1xuICAgIC5maWx0ZXIoXG4gICAgICAoXG4gICAgICAgIHJlc3VsdFxuICAgICAgKTogcmVzdWx0IGlzIFByb21pc2VGdWxmaWxsZWRSZXN1bHQ8e1xuICAgICAgICBwYXRoOiBzdHJpbmdcbiAgICAgICAgc3RhdDogaW1wb3J0KCdub2RlOmZzJykuU3RhdHNcbiAgICAgIH0+ID0+IHJlc3VsdC5zdGF0dXMgPT09ICdmdWxmaWxsZWQnXG4gICAgKVxuICAgIC5tYXAocmVzdWx0ID0+IHJlc3VsdC52YWx1ZSlcblxuICBjb25zdCB0b0RlbGV0ZSA9IHN0YXRzLmZpbHRlcigoeyBzdGF0IH0pID0+IG5vdyAtIHN0YXQubXRpbWVNcyA+IG1heEFnZU1zKVxuXG4gIC8vIERlbGV0ZSBmaWxlcyBpbmRpdmlkdWFsbHksIGNvbnRpbnVpbmcgZXZlbiBpZiBzb21lIGZhaWxcbiAgY29uc3QgZGVsZXRlUmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChcbiAgICB0b0RlbGV0ZS5tYXAoKHsgcGF0aCB9KSA9PiBmcy5ybShwYXRoLCB7IGZvcmNlOiB0cnVlIH0pKVxuICApXG5cbiAgLy8gTG9nIGZhaWx1cmVzIGJ1dCBkb24ndCBjcmFzaFxuICBkZWxldGVSZXN1bHRzLmZvckVhY2goKHJlc3VsdCwgaWR4KSA9PiB7XG4gICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09ICdyZWplY3RlZCcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGBbbG9naXhseXNpYV0gRmFpbGVkIHRvIGRlbGV0ZSBvbGQgbG9nICR7dG9EZWxldGVbaWR4XS5wYXRofTpgLFxuICAgICAgICByZXN1bHQucmVhc29uXG4gICAgICApXG4gICAgfVxuICB9KVxufVxuXG5leHBvcnQgY29uc3QgcGVyZm9ybVJvdGF0aW9uID0gYXN5bmMgKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBjb25maWc6IExvZ1JvdGF0aW9uQ29uZmlnXG4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgY29uc3Qgcm90YXRlZCA9IGF3YWl0IHJvdGF0ZUZpbGUoZmlsZVBhdGgpXG4gIGlmICghcm90YXRlZCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3Qgc2hvdWxkQ29tcHJlc3MgPSBjb25maWcuY29tcHJlc3MgPT09IHRydWVcbiAgaWYgKHNob3VsZENvbXByZXNzKSB7XG4gICAgY29uc3QgYWxnbyA9IGNvbmZpZy5jb21wcmVzc2lvbiA/PyAnZ3ppcCdcbiAgICBpZiAoYWxnbyA9PT0gJ2d6aXAnKSB7XG4gICAgICBhd2FpdCBjb21wcmVzc0ZpbGUocm90YXRlZClcbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlnLm1heEZpbGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCByZXRlbnRpb24gPSBwYXJzZVJldGVudGlvbihjb25maWcubWF4RmlsZXMpXG4gICAgaWYgKHJldGVudGlvbi50eXBlID09PSAnY291bnQnKSB7XG4gICAgICBhd2FpdCBjbGVhbnVwQnlDb3VudChmaWxlUGF0aCwgcmV0ZW50aW9uLnZhbHVlKVxuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBjbGVhbnVwQnlUaW1lKGZpbGVQYXRoLCByZXRlbnRpb24udmFsdWUpXG4gICAgfVxuICB9XG5cbiAgLy8gT3B0aW9uYWwgaW50ZXJ2YWwtYmFzZWQgcm90YXRpb24gY2xlYW51cCAoY3JlYXRlIGludGVydmFsIGRpcmVjdG9yaWVzIC8gbmFtaW5nKSBpcyBub3QgcmVxdWlyZWQgYnkgdGVzdHMuXG59XG4iLAogICAgImltcG9ydCB7IHByb21pc2VzIGFzIGZzIH0gZnJvbSAnbm9kZTpmcydcbmltcG9ydCB7IGJhc2VuYW1lLCBkaXJuYW1lIH0gZnJvbSAnbm9kZTpwYXRoJ1xuXG5jb25zdCBTSVpFX1JFR0VYID0gL14oXFxkKyg/OlxcLlxcZCspPykoa3xrYnxtfG1ifGd8Z2IpJC9pXG5jb25zdCBJTlRFUlZBTF9SRUdFWCA9IC9eKFxcZCspKGh8ZHx3KSQvaVxuY29uc3QgUk9UQVRFRF9SRUdFWCA9XG4gIC9cXC4oXFxkezR9LVxcZHsyfS1cXGR7Mn0tXFxkezJ9LVxcZHsyfS1cXGR7Mn0oPzotXFxkezN9KT8oPzotXFxkKyk/KSg/OlxcLmd6KT8kL1xuXG5leHBvcnQgY29uc3QgcGFyc2VTaXplID0gKHZhbHVlOiBudW1iZXIgfCBzdHJpbmcpOiBudW1iZXIgPT4ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgY29uc3QgdHJpbW1lZCA9IHZhbHVlLnRyaW0oKVxuICBjb25zdCBhc051bWJlciA9IE51bWJlcih0cmltbWVkKVxuICBpZiAoTnVtYmVyLmlzRmluaXRlKGFzTnVtYmVyKSkge1xuICAgIHJldHVybiBhc051bWJlclxuICB9XG5cbiAgY29uc3QgbWF0Y2ggPSB0cmltbWVkLm1hdGNoKFNJWkVfUkVHRVgpXG4gIGlmICghbWF0Y2gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc2l6ZSBmb3JtYXQ6ICR7dmFsdWV9YClcbiAgfVxuXG4gIGNvbnN0IGFtb3VudCA9IE51bWJlcihtYXRjaFsxXSlcbiAgY29uc3QgdW5pdCA9IG1hdGNoWzJdLnRvTG93ZXJDYXNlKClcblxuICBsZXQgYmFzZSA9IDEwMjRcbiAgaWYgKHVuaXQuc3RhcnRzV2l0aCgnbScpKSB7XG4gICAgYmFzZSA9IDEwMjQgKiAxMDI0XG4gIH0gZWxzZSBpZiAodW5pdC5zdGFydHNXaXRoKCdnJykpIHtcbiAgICBiYXNlID0gMTAyNCAqIDEwMjQgKiAxMDI0XG4gIH1cblxuICByZXR1cm4gTWF0aC5mbG9vcihhbW91bnQgKiBiYXNlKVxufVxuXG5leHBvcnQgY29uc3QgcGFyc2VJbnRlcnZhbCA9ICh2YWx1ZTogc3RyaW5nKTogbnVtYmVyID0+IHtcbiAgY29uc3QgbWF0Y2ggPSB2YWx1ZS50cmltKCkubWF0Y2goSU5URVJWQUxfUkVHRVgpXG4gIGlmICghbWF0Y2gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgaW50ZXJ2YWwgZm9ybWF0OiAke3ZhbHVlfWApXG4gIH1cblxuICBjb25zdCBhbW91bnQgPSBOdW1iZXIobWF0Y2hbMV0pXG4gIGNvbnN0IHVuaXQgPSBtYXRjaFsyXS50b0xvd2VyQ2FzZSgpXG5cbiAgbGV0IG1zID0gNjAgKiA2MCAqIDEwMDBcbiAgaWYgKHVuaXQgPT09ICdkJykge1xuICAgIG1zID0gMjQgKiA2MCAqIDYwICogMTAwMFxuICB9IGVsc2UgaWYgKHVuaXQgPT09ICd3Jykge1xuICAgIG1zID0gNyAqIDI0ICogNjAgKiA2MCAqIDEwMDBcbiAgfVxuXG4gIHJldHVybiBhbW91bnQgKiBtc1xufVxuXG5leHBvcnQgY29uc3QgcGFyc2VSZXRlbnRpb24gPSAoXG4gIHZhbHVlOiBudW1iZXIgfCBzdHJpbmdcbik6IHsgdHlwZTogJ2NvdW50JyB8ICd0aW1lJzsgdmFsdWU6IG51bWJlciB9ID0+IHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4geyB0eXBlOiAnY291bnQnLCB2YWx1ZSB9XG4gIH1cbiAgcmV0dXJuIHsgdHlwZTogJ3RpbWUnLCB2YWx1ZTogcGFyc2VJbnRlcnZhbCh2YWx1ZSkgfVxufVxuXG5leHBvcnQgY29uc3Qgc2hvdWxkUm90YXRlQnlTaXplID0gYXN5bmMgKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBtYXhTaXplQnl0ZXM6IG51bWJlclxuKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdCA9IGF3YWl0IGZzLnN0YXQoZmlsZVBhdGgpXG4gICAgcmV0dXJuIHN0YXQuc2l6ZSA+IG1heFNpemVCeXRlc1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZ2V0Um90YXRlZEZpbGVzID0gYXN5bmMgKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdPiA9PiB7XG4gIGNvbnN0IGRpciA9IGRpcm5hbWUoZmlsZVBhdGgpXG4gIGNvbnN0IGJhc2UgPSBiYXNlbmFtZShmaWxlUGF0aClcblxuICBsZXQgZW50cmllczogc3RyaW5nW11cbiAgdHJ5IHtcbiAgICBlbnRyaWVzID0gYXdhaXQgZnMucmVhZGRpcihkaXIpXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBbXVxuICB9XG5cbiAgcmV0dXJuIGVudHJpZXNcbiAgICAuZmlsdGVyKG5hbWUgPT4gbmFtZS5zdGFydHNXaXRoKGAke2Jhc2V9LmApICYmIFJPVEFURURfUkVHRVgudGVzdChuYW1lKSlcbiAgICAubWFwKG5hbWUgPT4gYCR7ZGlyfS8ke25hbWV9YClcbn1cbiIsCiAgICAiLy8gTG9jYWwgcGFydCDiiaQ2NCwgZG9tYWluIOKJpDI1MywgVExEIDLigJM2MyAoUkZDIDUzMjEgLyAxMDM1LWlzaCBsaW1pdHM7IGJvdW5kZWQgdG8gYXZvaWQgUmVEb1MpXG5jb25zdCBFTUFJTF9SRUdFWCA9XG4gIC9bYS16QS1aMC05Ll8lKy1dezEsNjR9QFthLXpBLVowLTkuLV17MSwyNTN9XFwuW2EtekEtWl17Miw2M30vZ1xuY29uc3QgSVBWNF9SRUdFWCA9IC9cXGIoPzpcXGR7MSwzfVxcLil7M31cXGR7MSwzfVxcYi9nXG4vKiogRGlnaXQgcnVucyB0aGF0IG1heSBiZSBmb3JtYXR0ZWQgUEFOcyAoc3BhY2VzL2Rhc2hlcyk7IHZhbGlkYXRlZCB3aXRoIEx1aG4gYmVmb3JlIHJlZGFjdGluZy4gKi9cbmNvbnN0IENSRURJVF9DQVJEX0NBTkRJREFURV9SRUdFWCA9IC9cXGIoPzpcXGRbIC1dKj8pezEzLDE5fVxcYi9nXG5jb25zdCBKV1RfUkVHRVggPSAvZXlKW2EtekEtWjAtOV8tXStcXC5leUpbYS16QS1aMC05Xy1dK1xcLlthLXpBLVowLTlfLV0rL2dcblxuY29uc3QgUEFOX01JTl9MRU4gPSAxM1xuY29uc3QgUEFOX01BWF9MRU4gPSAxOVxuXG5jb25zdCBSRURBQ1RFRF9URVhUID0gJ1tSRURBQ1RFRF0nXG5jb25zdCBDSVJDVUxBUl9SRUYgPSAnW0NpcmN1bGFyXSdcblxuLyoqXG4gKiBIb3N0IGFuZCB1c2VyaW5mbyBjYW5ub3QgY29udGFpbiBgW1JFREFDVEVEXWAg4oCUIGBbYCBiZWdpbnMgYW4gSVB2NiBsaXRlcmFsIGluIFVSTHMgYW5kIGJyZWFrcyBwYXJzaW5nLlxuICovXG5jb25zdCBVUkxfU0FGRV9SRURBQ1QgPSAncmVkYWN0ZWQnXG5cbmNvbnN0IHJlZGFjdFVybEF1dGhvcml0eVNlZ21lbnQgPSAodmFsdWU6IHN0cmluZyk6IHN0cmluZyA9PlxuICByZWRhY3RTdHJpbmcodmFsdWUpLnJlcGxhY2VBbGwoUkVEQUNURURfVEVYVCwgVVJMX1NBRkVfUkVEQUNUKVxuXG4vKiogQXBwbHkgUElJIHJlZGFjdGlvbiB0byBhIHJlcXVlc3QgVVJMIHdoaWxlIGtlZXBpbmcgdGhlIHJlc3VsdCBwYXJzZWFibGUgYnkgdGhlIFVSTC9SZXF1ZXN0IGNvbnN0cnVjdG9ycy4gKi9cbmNvbnN0IHJlZGFjdFJlcXVlc3RVcmwgPSAodXJsU3RyaW5nOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IHUgPSBuZXcgVVJMKHVybFN0cmluZylcbiAgICBpZiAodS51c2VybmFtZSAhPT0gJycpIHtcbiAgICAgIHUudXNlcm5hbWUgPSByZWRhY3RVcmxBdXRob3JpdHlTZWdtZW50KHUudXNlcm5hbWUpXG4gICAgfVxuICAgIGlmICh1LnBhc3N3b3JkICE9PSAnJykge1xuICAgICAgdS5wYXNzd29yZCA9IHJlZGFjdFVybEF1dGhvcml0eVNlZ21lbnQodS5wYXNzd29yZClcbiAgICB9XG4gICAgdS5ob3N0bmFtZSA9IHJlZGFjdFVybEF1dGhvcml0eVNlZ21lbnQodS5ob3N0bmFtZSlcbiAgICB1LnBhdGhuYW1lID0gcmVkYWN0U3RyaW5nKHUucGF0aG5hbWUpXG4gICAgdS5zZWFyY2ggPSByZWRhY3RTdHJpbmcodS5zZWFyY2gpXG4gICAgdS5oYXNoID0gcmVkYWN0U3RyaW5nKHUuaGFzaClcbiAgICByZXR1cm4gdS50b1N0cmluZygpXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiByZWRhY3RTdHJpbmcodXJsU3RyaW5nKS5yZXBsYWNlQWxsKFJFREFDVEVEX1RFWFQsIFVSTF9TQUZFX1JFREFDVClcbiAgfVxufVxuXG4vKiogTHVobiBjaGVja3N1bTsgYGRpZ2l0c2AgbXVzdCBjb250YWluIG9ubHkgYDAtOWAgYW5kIGxlbmd0aCBpbiBQQU4gcmFuZ2UuICovXG5jb25zdCBwYXNzZXNMdWhuID0gKGRpZ2l0czogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gIGlmIChkaWdpdHMubGVuZ3RoIDwgUEFOX01JTl9MRU4gfHwgZGlnaXRzLmxlbmd0aCA+IFBBTl9NQVhfTEVOKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBsZXQgc3VtID0gMFxuICBsZXQgYWx0ZXJuYXRlID0gZmFsc2VcblxuICBmb3IgKGxldCBpID0gZGlnaXRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgY29uc3QgY29kZSA9IGRpZ2l0cy5jaGFyQ29kZUF0KGkpXG4gICAgaWYgKGNvZGUgPCA0OCB8fCBjb2RlID4gNTcpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBsZXQgbiA9IGNvZGUgLSA0OFxuICAgIGlmIChhbHRlcm5hdGUpIHtcbiAgICAgIG4gKj0gMlxuICAgICAgaWYgKG4gPiA5KSB7XG4gICAgICAgIG4gLT0gOVxuICAgICAgfVxuICAgIH1cbiAgICBzdW0gKz0gblxuICAgIGFsdGVybmF0ZSA9ICFhbHRlcm5hdGVcbiAgfVxuXG4gIHJldHVybiBzdW0gJSAxMCA9PT0gMFxufVxuXG5jb25zdCByZWRhY3RDcmVkaXRDYXJkQ2FuZGlkYXRlcyA9ICh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcgPT5cbiAgdGV4dC5yZXBsYWNlKENSRURJVF9DQVJEX0NBTkRJREFURV9SRUdFWCwgbWF0Y2ggPT4ge1xuICAgIGNvbnN0IGRpZ2l0cyA9IG1hdGNoLnJlcGxhY2UoL1xcRC9nLCAnJylcbiAgICBpZiAoXG4gICAgICBkaWdpdHMubGVuZ3RoID49IFBBTl9NSU5fTEVOICYmXG4gICAgICBkaWdpdHMubGVuZ3RoIDw9IFBBTl9NQVhfTEVOICYmXG4gICAgICBwYXNzZXNMdWhuKGRpZ2l0cylcbiAgICApIHtcbiAgICAgIHJldHVybiBSRURBQ1RFRF9URVhUXG4gICAgfVxuICAgIHJldHVybiBtYXRjaFxuICB9KVxuXG5leHBvcnQgY29uc3QgcmVkYWN0U3RyaW5nID0gKHRleHQ6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGxldCByZXN1bHQgPSB0ZXh0XG5cbiAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoRU1BSUxfUkVHRVgsIFJFREFDVEVEX1RFWFQpXG4gIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKElQVjRfUkVHRVgsIFJFREFDVEVEX1RFWFQpXG4gIHJlc3VsdCA9IHJlZGFjdENyZWRpdENhcmRDYW5kaWRhdGVzKHJlc3VsdClcbiAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoSldUX1JFR0VYLCBSRURBQ1RFRF9URVhUKVxuXG4gIHJldHVybiByZXN1bHRcbn1cblxuY29uc3QgcmVkYWN0RXJyb3JDbG9uZSA9IChcbiAgb3JpZ2luYWxFcnJvcjogRXJyb3IsXG4gIGluUHJvZ3Jlc3M6IFdlYWtTZXQ8b2JqZWN0PlxuKTogRXJyb3IgJiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PiB7XG4gIGNvbnN0IHJlZGFjdGVkTWVzc2FnZSA9IHJlZGFjdFN0cmluZyhvcmlnaW5hbEVycm9yLm1lc3NhZ2UpXG4gIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9yaWdpbmFsRXJyb3IpIGFzIG9iamVjdFxuICBjb25zdCBuZXdFcnJvciA9IE9iamVjdC5jcmVhdGUocHJvdG8pIGFzIEVycm9yICYgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cblxuICBuZXdFcnJvci5tZXNzYWdlID0gcmVkYWN0ZWRNZXNzYWdlXG4gIG5ld0Vycm9yLm5hbWUgPSBvcmlnaW5hbEVycm9yLm5hbWVcblxuICBpZiAob3JpZ2luYWxFcnJvci5zdGFjayAhPT0gdW5kZWZpbmVkKSB7XG4gICAgbmV3RXJyb3Iuc3RhY2sgPSByZWRhY3RTdHJpbmcob3JpZ2luYWxFcnJvci5zdGFjaylcbiAgfVxuXG4gIGNvbnN0IGVycm9yUmVjb3JkID0gb3JpZ2luYWxFcnJvciBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG5cbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoZXJyb3JSZWNvcmQpKSB7XG4gICAgaWYgKGtleSAhPT0gJ21lc3NhZ2UnICYmIGtleSAhPT0gJ25hbWUnICYmIGtleSAhPT0gJ3N0YWNrJykge1xuICAgICAgbmV3RXJyb3Jba2V5XSA9IHJlZGFjdElubmVyKGVycm9yUmVjb3JkW2tleV0sIGluUHJvZ3Jlc3MpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ld0Vycm9yXG59XG5cbmNvbnN0IHJlZGFjdEFycmF5SXRlbXMgPSAoXG4gIHZhbHVlOiB1bmtub3duW10sXG4gIGluUHJvZ3Jlc3M6IFdlYWtTZXQ8b2JqZWN0PlxuKTogdW5rbm93bltdID0+IHtcbiAgY29uc3QgcmVkYWN0ZWRBcnJheTogdW5rbm93bltdID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogdmFsdWUubGVuZ3RoIH0pXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICByZWRhY3RlZEFycmF5W2ldID0gcmVkYWN0SW5uZXIodmFsdWVbaV0sIGluUHJvZ3Jlc3MpXG4gIH1cbiAgcmV0dXJuIHJlZGFjdGVkQXJyYXlcbn1cblxuY29uc3QgcmVkYWN0UmVjb3JkRW50cmllcyA9IChcbiAgcmVjb3JkVmFsdWU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBpblByb2dyZXNzOiBXZWFrU2V0PG9iamVjdD5cbik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+IHtcbiAgY29uc3QgcmVkYWN0ZWRSZWNvcmQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge31cbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMocmVjb3JkVmFsdWUpKSB7XG4gICAgcmVkYWN0ZWRSZWNvcmRba2V5XSA9IHJlZGFjdElubmVyKHJlY29yZFZhbHVlW2tleV0sIGluUHJvZ3Jlc3MpXG4gIH1cbiAgcmV0dXJuIHJlZGFjdGVkUmVjb3JkXG59XG5cbmNvbnN0IHdpdGhSZWVudHJhbmN5R3VhcmQgPSA8VD4oXG4gIG9iajogb2JqZWN0LFxuICBpblByb2dyZXNzOiBXZWFrU2V0PG9iamVjdD4sXG4gIHJ1bjogKCkgPT4gVFxuKTogVCA9PiB7XG4gIGluUHJvZ3Jlc3MuYWRkKG9iailcbiAgdHJ5IHtcbiAgICByZXR1cm4gcnVuKClcbiAgfSBmaW5hbGx5IHtcbiAgICBpblByb2dyZXNzLmRlbGV0ZShvYmopXG4gIH1cbn1cblxuY29uc3QgcmVkYWN0SW5uZXIgPSA8VD4odmFsdWU6IFQsIGluUHJvZ3Jlc3M6IFdlYWtTZXQ8b2JqZWN0Pik6IFQgPT4ge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gcmVkYWN0U3RyaW5nKHZhbHVlKSBhcyB1bmtub3duIGFzIFRcbiAgfVxuXG4gIGNvbnN0IHR5cGUgPSB0eXBlb2YgdmFsdWVcbiAgaWYgKHR5cGUgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKHZhbHVlLmdldFRpbWUoKSkgYXMgdW5rbm93biBhcyBUXG4gIH1cblxuICBjb25zdCBvYmogPSB2YWx1ZSBhcyBvYmplY3RcbiAgaWYgKGluUHJvZ3Jlc3MuaGFzKG9iaikpIHtcbiAgICByZXR1cm4gQ0lSQ1VMQVJfUkVGIGFzIHVua25vd24gYXMgVFxuICB9XG5cbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICByZXR1cm4gd2l0aFJlZW50cmFuY3lHdWFyZChvYmosIGluUHJvZ3Jlc3MsICgpID0+XG4gICAgICByZWRhY3RFcnJvckNsb25lKHZhbHVlLCBpblByb2dyZXNzKVxuICAgICkgYXMgdW5rbm93biBhcyBUXG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gd2l0aFJlZW50cmFuY3lHdWFyZChvYmosIGluUHJvZ3Jlc3MsICgpID0+XG4gICAgICByZWRhY3RBcnJheUl0ZW1zKHZhbHVlLCBpblByb2dyZXNzKVxuICAgICkgYXMgdW5rbm93biBhcyBUXG4gIH1cblxuICByZXR1cm4gd2l0aFJlZW50cmFuY3lHdWFyZChvYmosIGluUHJvZ3Jlc3MsICgpID0+XG4gICAgcmVkYWN0UmVjb3JkRW50cmllcyh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgaW5Qcm9ncmVzcylcbiAgKSBhcyB1bmtub3duIGFzIFRcbn1cblxuZXhwb3J0IGNvbnN0IHJlZGFjdCA9IDxUPih2YWx1ZTogVCk6IFQgPT4gcmVkYWN0SW5uZXIodmFsdWUsIG5ldyBXZWFrU2V0KCkpXG5cbi8qKlxuICogQ2xvbmUgcmVxdWVzdCBVUkwsIG1ldGhvZCBhbmQgaGVhZGVycyBmb3IgbG9nZ2luZyB3aXRoIHRoZSBzYW1lIHN0cmluZyByZWRhY3Rpb24gYXMge0BsaW5rIHJlZGFjdH0uXG4gKiBUaGUgcmV0dXJuZWQgcmVxdWVzdCBpcyBhIGxvZ2dpbmctb25seSBhcnRpZmFjdCBjYXJyeWluZyB1cmwvbWV0aG9kL2hlYWRlcnMvc2lnbmFsOyBpdCBpbnRlbnRpb25hbGx5XG4gKiBvbWl0cyB0aGUgYm9keSBzbyBpdCBuZXZlciByZS11c2VzIHRoZSBvcmlnaW5hbCAocG9zc2libHkgYWxyZWFkeS1jb25zdW1lZCkgcmVxdWVzdCBzdHJlYW0uIFRoZVxuICogb3JpZ2luYWwgcmVxdWVzdCBpcyBsZWZ0IHVudG91Y2hlZCBhbmQgcmVtYWlucyB1c2FibGUuXG4gKi9cbmV4cG9ydCBjb25zdCByZWRhY3RSZXF1ZXN0ID0gKHJlcXVlc3Q6IFJlcXVlc3QpOiBSZXF1ZXN0ID0+IHtcbiAgY29uc3QgcmVkYWN0ZWRVcmwgPSByZWRhY3RSZXF1ZXN0VXJsKHJlcXVlc3QudXJsKVxuICBjb25zdCBuZXh0SGVhZGVycyA9IG5ldyBIZWFkZXJzKClcbiAgbGV0IGhlYWRlcnNDaGFuZ2VkID0gZmFsc2VcblxuICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgcmVxdWVzdC5oZWFkZXJzLmVudHJpZXMoKSkge1xuICAgIGNvbnN0IHJlZGFjdGVkID0gcmVkYWN0U3RyaW5nKHZhbHVlKVxuICAgIGlmIChyZWRhY3RlZCAhPT0gdmFsdWUpIHtcbiAgICAgIGhlYWRlcnNDaGFuZ2VkID0gdHJ1ZVxuICAgIH1cbiAgICBuZXh0SGVhZGVycy5zZXQobmFtZSwgcmVkYWN0ZWQpXG4gIH1cblxuICBjb25zdCByZWRhY3RlZE1ldGhvZCA9IHJlZGFjdFN0cmluZyhyZXF1ZXN0Lm1ldGhvZClcbiAgY29uc3QgdXJsQ2hhbmdlZCA9IHJlZGFjdGVkVXJsICE9PSByZXF1ZXN0LnVybFxuICBjb25zdCBtZXRob2RDaGFuZ2VkID0gcmVkYWN0ZWRNZXRob2QgIT09IHJlcXVlc3QubWV0aG9kXG5cbiAgaWYgKCEodXJsQ2hhbmdlZCB8fCBoZWFkZXJzQ2hhbmdlZCB8fCBtZXRob2RDaGFuZ2VkKSkge1xuICAgIHJldHVybiByZXF1ZXN0XG4gIH1cblxuICBjb25zdCBpbml0OiBSZXF1ZXN0SW5pdCA9IHtcbiAgICBtZXRob2Q6IHJlZGFjdGVkTWV0aG9kLFxuICAgIGhlYWRlcnM6IG5leHRIZWFkZXJzLFxuICAgIHJlZGlyZWN0OiByZXF1ZXN0LnJlZGlyZWN0LFxuICAgIHNpZ25hbDogcmVxdWVzdC5zaWduYWxcbiAgfVxuXG4gIHJldHVybiBuZXcgUmVxdWVzdChyZWRhY3RlZFVybCwgaW5pdClcbn1cbiIsCiAgICAiaW1wb3J0IHsgU1RBVFVTX0NPREVTIH0gZnJvbSAnbm9kZTpodHRwJ1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJ1xuaW1wb3J0IHsgZ2V0U3RhdHVzQ29kZSB9IGZyb20gJy4uL2hlbHBlcnMvc3RhdHVzJ1xuaW1wb3J0IHR5cGUge1xuICBMb2dMZXZlbCxcbiAgT3B0aW9ucyxcbiAgUGlubyxcbiAgUmVxdWVzdEluZm8sXG4gIFN0b3JlRGF0YVxufSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IHsgcGFyc2VFcnJvciB9IGZyb20gJy4uL3V0aWxzL2Vycm9yJ1xuXG5jb25zdCBwYWQyID0gKHZhbHVlOiBudW1iZXIpOiBzdHJpbmcgPT4gU3RyaW5nKHZhbHVlKS5wYWRTdGFydCgyLCAnMCcpXG5jb25zdCBwYWQzID0gKHZhbHVlOiBudW1iZXIpOiBzdHJpbmcgPT4gU3RyaW5nKHZhbHVlKS5wYWRTdGFydCgzLCAnMCcpXG5cbmNvbnN0IERFRkFVTFRfU0xPV19NUyA9IDUwMFxuY29uc3QgREVGQVVMVF9WRVJZX1NMT1dfTVMgPSAxMDAwXG5jb25zdCBNRVRIT0RfUEFEID0gN1xuXG5jb25zdCBERUZBVUxUX0xPR19GT1JNQVQgPVxuICAne25vd30ge3NlcnZpY2V9e2ljb259IHttZXRob2R9IHtwYXRobmFtZX0ge3N0YXR1c30ge2R1cmF0aW9ufSB7bWVzc2FnZX17c3BlZWR9J1xuXG5jb25zdCBMT0dfRk9STUFUX1JFR0VYID1cbiAgL1xceyhub3d8ZXBvY2h8bGV2ZWx8aWNvbnxkdXJhdGlvbnxtZXRob2R8cGF0aG5hbWV8cGF0aHxxdWVyeXxzdGF0dXN8c3RhdHVzVGV4dHxtZXNzYWdlfGlwfGNvbnRleHR8c2VydmljZXxzcGVlZHxyZXF1ZXN0SWQpXFx9L2dcblxuZXhwb3J0IGludGVyZmFjZSBGb3JtYXR0ZWRMb2dPdXRwdXQge1xuICBjb250ZXh0TGluZXM6IHN0cmluZ1tdXG4gIG1haW46IHN0cmluZ1xufVxuXG5jb25zdCBzaG91bGRVc2VDb2xvcnMgPSAob3B0aW9uczogT3B0aW9ucyk6IGJvb2xlYW4gPT4ge1xuICBjb25zdCBjb25maWcgPSBvcHRpb25zLmNvbmZpZ1xuICBjb25zdCBlbmFibGVkQnlDb25maWcgPSBjb25maWc/LnVzZUNvbG9ycyA/PyB0cnVlXG5cbiAgLy8gQXZvaWQgQU5TSSBzZXF1ZW5jZXMgaW4gbm9uLWludGVyYWN0aXZlIG91dHB1dCAocGlwZXMsIENJIGxvZ3MsIGZpbGVzKS5cbiAgY29uc3QgaXNUdHkgPSB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgcHJvY2Vzcy5zdGRvdXQ/LmlzVFRZID09PSB0cnVlXG4gIHJldHVybiBlbmFibGVkQnlDb25maWcgJiYgaXNUdHlcbn1cblxuY29uc3QgZm9ybWF0VGltZXN0YW1wID0gKGRhdGU6IERhdGUsIHBhdHRlcm4/OiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBpZiAoIXBhdHRlcm4pIHtcbiAgICByZXR1cm4gZGF0ZS50b0lTT1N0cmluZygpXG4gIH1cblxuICBjb25zdCB5eXl5ID0gU3RyaW5nKGRhdGUuZ2V0RnVsbFllYXIoKSlcbiAgY29uc3QgbW0gPSBwYWQyKGRhdGUuZ2V0TW9udGgoKSArIDEpXG4gIGNvbnN0IGRkID0gcGFkMihkYXRlLmdldERhdGUoKSlcbiAgY29uc3QgSEggPSBwYWQyKGRhdGUuZ2V0SG91cnMoKSlcbiAgY29uc3QgTU0gPSBwYWQyKGRhdGUuZ2V0TWludXRlcygpKVxuICBjb25zdCBzcyA9IHBhZDIoZGF0ZS5nZXRTZWNvbmRzKCkpXG4gIGNvbnN0IFNTUyA9IHBhZDMoZGF0ZS5nZXRNaWxsaXNlY29uZHMoKSlcblxuICByZXR1cm4gcGF0dGVyblxuICAgIC5yZXBsYWNlQWxsKCd5eXl5JywgeXl5eSlcbiAgICAucmVwbGFjZUFsbCgnbW0nLCBtbSlcbiAgICAucmVwbGFjZUFsbCgnZGQnLCBkZClcbiAgICAucmVwbGFjZUFsbCgnSEgnLCBISClcbiAgICAucmVwbGFjZUFsbCgnTU0nLCBNTSlcbiAgICAucmVwbGFjZUFsbCgnc3MnLCBzcylcbiAgICAucmVwbGFjZUFsbCgnU1NTJywgU1NTKVxufVxuXG4vKiogUmVzb2x2ZXMgY2xpZW50IElQIGZyb20geC1mb3J3YXJkZWQtZm9yIChmaXJzdCBJUCkgb3IgeC1yZWFsLWlwLiBFbXB0eSB3aGVuIG5laXRoZXIgaGVhZGVyIGlzIHNldCAoZS5nLiBsb2NhbGhvc3QpLiAqL1xuY29uc3QgZ2V0SXAgPSAocmVxdWVzdDogUmVxdWVzdEluZm8pOiBzdHJpbmcgPT4ge1xuICBjb25zdCBmb3J3YXJkZWQgPSByZXF1ZXN0LmhlYWRlcnMuZ2V0KCd4LWZvcndhcmRlZC1mb3InKVxuICBpZiAoZm9yd2FyZGVkKSB7XG4gICAgcmV0dXJuIGZvcndhcmRlZC5zcGxpdCgnLCcpWzBdPy50cmltKCkgPz8gJydcbiAgfVxuICByZXR1cm4gcmVxdWVzdC5oZWFkZXJzLmdldCgneC1yZWFsLWlwJykgPz8gJydcbn1cblxuZXhwb3J0IGNvbnN0IGZvcm1hdER1cmF0aW9uID0gKG1zOiBudW1iZXIpOiBzdHJpbmcgPT4ge1xuICBpZiAobXMgPj0gMTAwMCkge1xuICAgIGNvbnN0IHNlYyA9IG1zIC8gMTAwMFxuICAgIGlmIChzZWMgPj0gMTApIHtcbiAgICAgIHJldHVybiBgJHtNYXRoLnJvdW5kKHNlYyl9c2BcbiAgICB9XG4gICAgY29uc3Qgb25lRGVjaW1hbCA9IHNlYy50b0ZpeGVkKDEpXG4gICAgcmV0dXJuIG9uZURlY2ltYWwuZW5kc1dpdGgoJy4wJykgPyBgJHtNYXRoLnJvdW5kKHNlYyl9c2AgOiBgJHtvbmVEZWNpbWFsfXNgXG4gIH1cbiAgaWYgKG1zID4gMCAmJiBtcyA8IDEpIHtcbiAgICByZXR1cm4gYCR7bXMudG9GaXhlZCgyKX1tc2BcbiAgfVxuICByZXR1cm4gYCR7TWF0aC5yb3VuZChtcyl9bXNgXG59XG5cbmNvbnN0IGdldFNsb3dUaHJlc2hvbGRzID0gKFxuICBvcHRpb25zOiBPcHRpb25zXG4pOiB7IHNsb3c6IG51bWJlcjsgdmVyeVNsb3c6IG51bWJlciB9ID0+IHtcbiAgY29uc3QgY29uZmlnID0gb3B0aW9ucy5jb25maWdcbiAgcmV0dXJuIHtcbiAgICBzbG93OiBjb25maWc/LnNsb3dUaHJlc2hvbGQgPz8gREVGQVVMVF9TTE9XX01TLFxuICAgIHZlcnlTbG93OiBjb25maWc/LnZlcnlTbG93VGhyZXNob2xkID8/IERFRkFVTFRfVkVSWV9TTE9XX01TXG4gIH1cbn1cblxuY29uc3QgY29sb3JEdXJhdGlvblRleHQgPSAoXG4gIG1zOiBudW1iZXIsXG4gIHVzZUNvbG9yczogYm9vbGVhbixcbiAgb3B0aW9uczogT3B0aW9uc1xuKTogeyB0ZXh0OiBzdHJpbmc7IGlzVmVyeVNsb3c6IGJvb2xlYW4gfSA9PiB7XG4gIGNvbnN0IHJhdyA9IGZvcm1hdER1cmF0aW9uKG1zKVxuICBjb25zdCB7IHNsb3csIHZlcnlTbG93IH0gPSBnZXRTbG93VGhyZXNob2xkcyhvcHRpb25zKVxuICBjb25zdCBpc1ZlcnlTbG93ID0gbXMgPj0gdmVyeVNsb3dcblxuICBpZiAoIXVzZUNvbG9ycykge1xuICAgIHJldHVybiB7IHRleHQ6IHJhdywgaXNWZXJ5U2xvdyB9XG4gIH1cblxuICBsZXQgY29sb3JlZCA9IHJhd1xuICBpZiAobXMgPCBzbG93KSB7XG4gICAgY29sb3JlZCA9IGNoYWxrLmdyZWVuKHJhdylcbiAgfSBlbHNlIGlmIChtcyA8IHZlcnlTbG93KSB7XG4gICAgY29sb3JlZCA9IGNoYWxrLnllbGxvdyhyYXcpXG4gIH0gZWxzZSB7XG4gICAgY29sb3JlZCA9IGNoYWxrLnJlZC5ib2xkKHJhdylcbiAgfVxuXG4gIHJldHVybiB7IHRleHQ6IGNvbG9yZWQsIGlzVmVyeVNsb3cgfVxufVxuXG5jb25zdCBnZXRTcGVlZFRva2VuID0gKGlzVmVyeVNsb3c6IGJvb2xlYW4sIHVzZUNvbG9yczogYm9vbGVhbik6IHN0cmluZyA9PiB7XG4gIGlmICghaXNWZXJ5U2xvdykge1xuICAgIHJldHVybiAnJ1xuICB9XG4gIGNvbnN0IGJhZGdlID0gJ+KaoSBzbG93J1xuICBpZiAoIXVzZUNvbG9ycykge1xuICAgIHJldHVybiBgICR7YmFkZ2V9YFxuICB9XG4gIHJldHVybiBgICR7Y2hhbGsueWVsbG93KGJhZGdlKX1gXG59XG5cbi8qKiBMb2dpeGx5c2lhIGJyYW5kOiBmb3ggZW1vamkgd2l0aCBsZXZlbC1jb2xvcmVkIGJhY2tncm91bmQgd2hlbiBjb2xvcnMgYXJlIGVuYWJsZWQuICovXG5jb25zdCBnZXRMZXZlbEljb24gPSAobGV2ZWw6IExvZ0xldmVsLCB1c2VDb2xvcnM6IGJvb2xlYW4pOiBzdHJpbmcgPT4ge1xuICBpZiAoIXVzZUNvbG9ycykge1xuICAgIHJldHVybiAn8J+miidcbiAgfVxuICBpZiAobGV2ZWwgPT09ICdFUlJPUicpIHtcbiAgICByZXR1cm4gY2hhbGsuYmdSZWQuYmxhY2soJyDwn6aKICcpXG4gIH1cbiAgaWYgKGxldmVsID09PSAnV0FSTklORycpIHtcbiAgICByZXR1cm4gY2hhbGsuYmdZZWxsb3cuYmxhY2soJyDwn6aKICcpXG4gIH1cbiAgaWYgKGxldmVsID09PSAnREVCVUcnKSB7XG4gICAgcmV0dXJuIGNoYWxrLmJnQmx1ZS5ibGFjaygnIPCfpoogJylcbiAgfVxuICByZXR1cm4gY2hhbGsuYmdHcmVlbi5ibGFjaygnIPCfpoogJylcbn1cblxuY29uc3QgZ2V0Q29sb3JlZExldmVsID0gKGxldmVsOiBMb2dMZXZlbCwgdXNlQ29sb3JzOiBib29sZWFuKTogc3RyaW5nID0+IHtcbiAgaWYgKCF1c2VDb2xvcnMpIHtcbiAgICByZXR1cm4gbGV2ZWxcbiAgfVxuXG4gIGlmIChsZXZlbCA9PT0gJ0VSUk9SJykge1xuICAgIHJldHVybiBjaGFsay5iZ1JlZC5ibGFjayhsZXZlbClcbiAgfVxuICBpZiAobGV2ZWwgPT09ICdXQVJOSU5HJykge1xuICAgIHJldHVybiBjaGFsay5iZ1llbGxvdy5ibGFjayhsZXZlbClcbiAgfVxuICBpZiAobGV2ZWwgPT09ICdERUJVRycpIHtcbiAgICByZXR1cm4gY2hhbGsuYmdCbHVlLmJsYWNrKGxldmVsKVxuICB9XG5cbiAgcmV0dXJuIGNoYWxrLmJnR3JlZW4uYmxhY2sobGV2ZWwpXG59XG5cbmNvbnN0IGdldENvbG9yZWRNZXRob2QgPSAobWV0aG9kOiBzdHJpbmcsIHVzZUNvbG9yczogYm9vbGVhbik6IHN0cmluZyA9PiB7XG4gIGlmICghdXNlQ29sb3JzKSB7XG4gICAgcmV0dXJuIG1ldGhvZFxuICB9XG5cbiAgY29uc3QgdXBwZXIgPSBtZXRob2QudG9VcHBlckNhc2UoKVxuICBpZiAodXBwZXIgPT09ICdHRVQnKSB7XG4gICAgcmV0dXJuIGNoYWxrLmdyZWVuLmJvbGQodXBwZXIpXG4gIH1cbiAgaWYgKHVwcGVyID09PSAnUE9TVCcpIHtcbiAgICByZXR1cm4gY2hhbGsuYmx1ZS5ib2xkKHVwcGVyKVxuICB9XG4gIGlmICh1cHBlciA9PT0gJ1BVVCcpIHtcbiAgICByZXR1cm4gY2hhbGsueWVsbG93LmJvbGQodXBwZXIpXG4gIH1cbiAgaWYgKHVwcGVyID09PSAnUEFUQ0gnKSB7XG4gICAgcmV0dXJuIGNoYWxrLnllbGxvd0JyaWdodC5ib2xkKHVwcGVyKVxuICB9XG4gIGlmICh1cHBlciA9PT0gJ0RFTEVURScpIHtcbiAgICByZXR1cm4gY2hhbGsucmVkLmJvbGQodXBwZXIpXG4gIH1cbiAgaWYgKHVwcGVyID09PSAnT1BUSU9OUycpIHtcbiAgICByZXR1cm4gY2hhbGsuY3lhbi5ib2xkKHVwcGVyKVxuICB9XG4gIGlmICh1cHBlciA9PT0gJ0hFQUQnKSB7XG4gICAgcmV0dXJuIGNoYWxrLmdyZWVuQnJpZ2h0LmJvbGQodXBwZXIpXG4gIH1cbiAgaWYgKHVwcGVyID09PSAnVFJBQ0UnKSB7XG4gICAgcmV0dXJuIGNoYWxrLm1hZ2VudGEuYm9sZCh1cHBlcilcbiAgfVxuICBpZiAodXBwZXIgPT09ICdDT05ORUNUJykge1xuICAgIHJldHVybiBjaGFsay5jeWFuQnJpZ2h0LmJvbGQodXBwZXIpXG4gIH1cblxuICByZXR1cm4gY2hhbGsud2hpdGUuYm9sZCh1cHBlcilcbn1cblxuY29uc3QgZ2V0Q29sb3JlZFN0YXR1cyA9IChzdGF0dXM6IHN0cmluZywgdXNlQ29sb3JzOiBib29sZWFuKTogc3RyaW5nID0+IHtcbiAgaWYgKCF1c2VDb2xvcnMpIHtcbiAgICByZXR1cm4gc3RhdHVzXG4gIH1cblxuICBjb25zdCBudW1lcmljID0gTnVtYmVyLnBhcnNlSW50KHN0YXR1cywgMTApXG4gIGlmICghTnVtYmVyLmlzRmluaXRlKG51bWVyaWMpKSB7XG4gICAgcmV0dXJuIHN0YXR1c1xuICB9XG5cbiAgaWYgKG51bWVyaWMgPj0gNTAwKSB7XG4gICAgcmV0dXJuIGNoYWxrLnJlZChzdGF0dXMpXG4gIH1cbiAgaWYgKG51bWVyaWMgPj0gNDAwKSB7XG4gICAgcmV0dXJuIGNoYWxrLnllbGxvdyhzdGF0dXMpXG4gIH1cbiAgaWYgKG51bWVyaWMgPj0gMzAwKSB7XG4gICAgcmV0dXJuIGNoYWxrLmN5YW4oc3RhdHVzKVxuICB9XG4gIGlmIChudW1lcmljID49IDIwMCkge1xuICAgIHJldHVybiBjaGFsay5ncmVlbihzdGF0dXMpXG4gIH1cbiAgcmV0dXJuIGNoYWxrLmdyYXkoc3RhdHVzKVxufVxuXG5jb25zdCBnZXRDb2xvcmVkVGltZXN0YW1wID0gKHRpbWVzdGFtcDogc3RyaW5nLCB1c2VDb2xvcnM6IGJvb2xlYW4pOiBzdHJpbmcgPT4ge1xuICBpZiAoIXVzZUNvbG9ycykge1xuICAgIHJldHVybiB0aW1lc3RhbXBcbiAgfVxuXG4gIHJldHVybiBjaGFsay5ncmF5KHRpbWVzdGFtcClcbn1cblxuY29uc3QgZ2V0Q29sb3JlZFBhdGhuYW1lID0gKHBhdGhuYW1lOiBzdHJpbmcsIHVzZUNvbG9yczogYm9vbGVhbik6IHN0cmluZyA9PiB7XG4gIGlmICghdXNlQ29sb3JzKSB7XG4gICAgcmV0dXJuIHBhdGhuYW1lXG4gIH1cblxuICByZXR1cm4gY2hhbGsud2hpdGVCcmlnaHQocGF0aG5hbWUpXG59XG5cbmNvbnN0IGdldFN0YXR1c1RleHQgPSAoc3RhdHVzQ29kZTogbnVtYmVyKTogc3RyaW5nID0+IHtcbiAgY29uc3QgdGV4dCA9IFNUQVRVU19DT0RFU1tzdGF0dXNDb2RlXVxuICByZXR1cm4gdGV4dCA/PyAnJ1xufVxuXG5jb25zdCBnZXRTZXJ2aWNlVG9rZW4gPSAob3B0aW9uczogT3B0aW9ucywgdXNlQ29sb3JzOiBib29sZWFuKTogc3RyaW5nID0+IHtcbiAgY29uc3QgbmFtZSA9IG9wdGlvbnMuY29uZmlnPy5zZXJ2aWNlPy50cmltKClcbiAgaWYgKCFuYW1lKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cbiAgY29uc3QgYnJhY2tldGVkID0gYFske25hbWV9XWBcbiAgaWYgKCF1c2VDb2xvcnMpIHtcbiAgICByZXR1cm4gYCR7YnJhY2tldGVkfSBgXG4gIH1cbiAgcmV0dXJuIGAke2NoYWxrLmRpbShicmFja2V0ZWQpfSBgXG59XG5cbmNvbnN0IHN0cmluZ2lmeVRyZWVWYWx1ZSA9ICh2YWx1ZTogdW5rbm93bik6IHN0cmluZyA9PiB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiAnbnVsbCdcbiAgfVxuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiAndW5kZWZpbmVkJ1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcbiAgICByZXR1cm4gU3RyaW5nKHZhbHVlKVxuICB9XG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgcmV0dXJuIHZhbHVlLm1lc3NhZ2VcbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSlcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIFN0cmluZyh2YWx1ZSlcbiAgfVxufVxuXG4vKiogTmVzdGVkIG9iamVjdHMgdG8gZXhwYW5kIGluIHRoZSBjb250ZXh0IHRyZWUgKGV4Y2x1ZGVzIEFycmF5cywgRXJyb3IsIERhdGUpLiAqL1xuY29uc3QgaXNFeHBhbmRhYmxlT2JqZWN0ID0gKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT5cbiAgdmFsdWUgIT09IG51bGwgJiZcbiAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAhQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiZcbiAgISh2YWx1ZSBpbnN0YW5jZW9mIEVycm9yKSAmJlxuICAhKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSlcblxuY29uc3QgY29sbGVjdENvbnRleHRFbnRyaWVzID0gKFxuICBvYmo6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBwcmVmaXg6IHN0cmluZyxcbiAgZGVwdGhSZW1haW5pbmc6IG51bWJlclxuKTogW3N0cmluZywgc3RyaW5nXVtdID0+IHtcbiAgY29uc3Qgb3V0OiBbc3RyaW5nLCBzdHJpbmddW10gPSBbXVxuICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhvYmopKSB7XG4gICAgY29uc3Qga2V5ID0gcHJlZml4ID8gYCR7cHJlZml4fS4ke2t9YCA6IGtcbiAgICBjb25zdCBleHBhbmRhYmxlID0gaXNFeHBhbmRhYmxlT2JqZWN0KHYpICYmIGRlcHRoUmVtYWluaW5nID4gMVxuXG4gICAgaWYgKGV4cGFuZGFibGUpIHtcbiAgICAgIG91dC5wdXNoKC4uLmNvbGxlY3RDb250ZXh0RW50cmllcyh2LCBrZXksIGRlcHRoUmVtYWluaW5nIC0gMSkpXG4gICAgfSBlbHNlIHtcbiAgICAgIG91dC5wdXNoKFtrZXksIHN0cmluZ2lmeVRyZWVWYWx1ZSh2KV0pXG4gICAgfVxuICB9XG4gIHJldHVybiBvdXRcbn1cblxuY29uc3QgZm9ybWF0RW50cmllc1RvVHJlZUxpbmVzID0gKFxuICBlbnRyaWVzOiBbc3RyaW5nLCBzdHJpbmddW10sXG4gIHVzZUNvbG9yczogYm9vbGVhblxuKTogc3RyaW5nW10gPT4ge1xuICBpZiAoZW50cmllcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gW11cbiAgfVxuXG4gIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdXG4gIGNvbnN0IGxhc3QgPSBlbnRyaWVzLmxlbmd0aCAtIDFcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgYnJhbmNoID0gaSA9PT0gbGFzdCA/ICfilJTilIAnIDogJ+KUnOKUgCdcbiAgICBjb25zdCBwYWlyID0gZW50cmllc1tpXVxuICAgIGlmICghcGFpcikge1xuICAgICAgY29udGludWVcbiAgICB9XG4gICAgY29uc3QgW2ssIHZdID0gcGFpclxuICAgIGNvbnN0IGtleVBhcnQgPSB1c2VDb2xvcnMgPyBjaGFsay5jeWFuKGspIDoga1xuICAgIGNvbnN0IHZhbFBhcnQgPSB1c2VDb2xvcnMgPyBjaGFsay53aGl0ZSh2KSA6IHZcbiAgICBsaW5lcy5wdXNoKGAgICR7YnJhbmNofSAke2tleVBhcnR9ICAke3ZhbFBhcnR9YClcbiAgfVxuICByZXR1cm4gbGluZXNcbn1cblxuZXhwb3J0IGNvbnN0IHJlbmRlckNvbnRleHRUcmVlTGluZXMgPSAoXG4gIGN0eDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIG9wdGlvbnM6IE9wdGlvbnMsXG4gIHVzZUNvbG9yczogYm9vbGVhblxuKTogc3RyaW5nW10gPT4ge1xuICBjb25zdCBkZXB0aCA9IG9wdGlvbnMuY29uZmlnPy5jb250ZXh0RGVwdGggPz8gMVxuICBpZiAoZGVwdGggPCAxKSB7XG4gICAgcmV0dXJuIFtdXG4gIH1cblxuICBjb25zdCBlbnRyaWVzID0gY29sbGVjdENvbnRleHRFbnRyaWVzKGN0eCwgJycsIGRlcHRoKVxuICByZXR1cm4gZm9ybWF0RW50cmllc1RvVHJlZUxpbmVzKGVudHJpZXMsIHVzZUNvbG9ycylcbn1cblxuZXhwb3J0IGNvbnN0IGJ1aWxkQ29udGV4dFRyZWVMaW5lcyA9IChcbiAgbGV2ZWw6IExvZ0xldmVsLFxuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgb3B0aW9uczogT3B0aW9uc1xuKTogc3RyaW5nW10gPT4ge1xuICBpZiAob3B0aW9ucy5jb25maWc/LnNob3dDb250ZXh0VHJlZSA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gW11cbiAgfVxuXG4gIGNvbnN0IHVzZUNvbG9ycyA9IHNob3VsZFVzZUNvbG9ycyhvcHRpb25zKVxuICBjb25zdCBkZXB0aCA9IG9wdGlvbnMuY29uZmlnPy5jb250ZXh0RGVwdGggPz8gMVxuXG4gIGNvbnN0IGVudHJpZXM6IFtzdHJpbmcsIHN0cmluZ11bXSA9IFtdXG5cbiAgY29uc3QgY3R4ID0gZGF0YS5jb250ZXh0XG4gIGlmIChcbiAgICBjdHggJiZcbiAgICB0eXBlb2YgY3R4ID09PSAnb2JqZWN0JyAmJlxuICAgICFBcnJheS5pc0FycmF5KGN0eCkgJiZcbiAgICBPYmplY3Qua2V5cyhjdHggYXMgb2JqZWN0KS5sZW5ndGggPiAwICYmXG4gICAgZGVwdGggPj0gMVxuICApIHtcbiAgICBlbnRyaWVzLnB1c2goXG4gICAgICAuLi5jb2xsZWN0Q29udGV4dEVudHJpZXMoY3R4IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCAnJywgZGVwdGgpXG4gICAgKVxuICB9XG5cbiAgaWYgKGxldmVsID09PSAnRVJST1InICYmICdlcnJvcicgaW4gZGF0YSAmJiBkYXRhLmVycm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBtc2cgPSBwYXJzZUVycm9yKGRhdGEuZXJyb3IpXG4gICAgaWYgKG1zZykge1xuICAgICAgZW50cmllcy5wdXNoKFsnZXJyb3InLCBtc2ddKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmb3JtYXRFbnRyaWVzVG9UcmVlTGluZXMoZW50cmllcywgdXNlQ29sb3JzKVxufVxuXG5jb25zdCBnZXRDb250ZXh0U3RyaW5nID0gKHZhbHVlOiB1bmtub3duKTogc3RyaW5nID0+IHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpXG4gIH1cblxuICByZXR1cm4gJydcbn1cblxuZXhwb3J0IGNvbnN0IGZvcm1hdExvZ091dHB1dCA9ICh7XG4gIGxldmVsLFxuICByZXF1ZXN0LFxuICBkYXRhLFxuICBzdG9yZSxcbiAgb3B0aW9uc1xufToge1xuICBsZXZlbDogTG9nTGV2ZWxcbiAgcmVxdWVzdDogUmVxdWVzdEluZm9cbiAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgc3RvcmU6IFN0b3JlRGF0YVxuICBvcHRpb25zOiBPcHRpb25zXG59KTogRm9ybWF0dGVkTG9nT3V0cHV0ID0+IHtcbiAgY29uc3QgY29uZmlnID0gb3B0aW9ucy5jb25maWdcbiAgY29uc3QgdXNlQ29sb3JzID0gc2hvdWxkVXNlQ29sb3JzKG9wdGlvbnMpXG4gIGNvbnN0IGZvcm1hdCA9IGNvbmZpZz8uY3VzdG9tTG9nRm9ybWF0ID8/IERFRkFVTFRfTE9HX0ZPUk1BVFxuXG4gIGNvbnN0IG5vdyA9IG5ldyBEYXRlKClcbiAgY29uc3QgZXBvY2ggPSBTdHJpbmcobm93LmdldFRpbWUoKSlcbiAgY29uc3QgcmF3VGltZXN0YW1wID0gZm9ybWF0VGltZXN0YW1wKG5vdywgY29uZmlnPy50aW1lc3RhbXA/LnRyYW5zbGF0ZVRpbWUpXG4gIGNvbnN0IHRpbWVzdGFtcCA9IGdldENvbG9yZWRUaW1lc3RhbXAocmF3VGltZXN0YW1wLCB1c2VDb2xvcnMpXG5cbiAgY29uc3QgbWVzc2FnZSA9IHR5cGVvZiBkYXRhLm1lc3NhZ2UgPT09ICdzdHJpbmcnID8gZGF0YS5tZXNzYWdlIDogJydcbiAgY29uc3QgZHVyYXRpb25NcyA9XG4gICAgc3RvcmUuYmVmb3JlVGltZSA9PT0gQmlnSW50KDApXG4gICAgICA/IDBcbiAgICAgIDogTnVtYmVyKHByb2Nlc3MuaHJ0aW1lLmJpZ2ludCgpIC0gc3RvcmUuYmVmb3JlVGltZSkgLyAxXzAwMF8wMDBcblxuICBsZXQgcmF3UGF0aG5hbWU6IHN0cmluZ1xuICBsZXQgc2VhcmNoOiBzdHJpbmdcbiAgdHJ5IHtcbiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHJlcXVlc3QudXJsKVxuICAgIHJhd1BhdGhuYW1lID0gdXJsLnBhdGhuYW1lXG4gICAgc2VhcmNoID0gdXJsLnNlYXJjaFxuICB9IGNhdGNoIHtcbiAgICByYXdQYXRobmFtZSA9IHJlcXVlc3QudXJsIHx8ICcvJ1xuICAgIHNlYXJjaCA9ICcnXG4gIH1cbiAgY29uc3QgcXVlcnkgPSBzZWFyY2hcbiAgY29uc3QgcGF0aG5hbWUgPSBjb25maWc/LmxvZ1F1ZXJ5UGFyYW1zXG4gICAgPyBgJHtyYXdQYXRobmFtZX0ke3F1ZXJ5fWBcbiAgICA6IHJhd1BhdGhuYW1lXG4gIGNvbnN0IHN0YXR1c1ZhbHVlID0gZGF0YS5zdGF0dXNcbiAgY29uc3Qgc3RhdHVzQ29kZSA9XG4gICAgc3RhdHVzVmFsdWUgPT09IG51bGwgfHwgc3RhdHVzVmFsdWUgPT09IHVuZGVmaW5lZFxuICAgICAgPyAyMDBcbiAgICAgIDogZ2V0U3RhdHVzQ29kZShzdGF0dXNWYWx1ZSlcbiAgY29uc3Qgc3RhdHVzID0gU3RyaW5nKHN0YXR1c0NvZGUpXG4gIGNvbnN0IGlwID0gY29uZmlnPy5pcCA9PT0gdHJ1ZSA/IGdldElwKHJlcXVlc3QpIDogJydcblxuICBjb25zdCBzaG93VHJlZSA9IGNvbmZpZz8uc2hvd0NvbnRleHRUcmVlICE9PSBmYWxzZVxuICBjb25zdCBjdHhTdHJpbmcgPVxuICAgIHNob3dUcmVlICYmXG4gICAgZGF0YS5jb250ZXh0ICYmXG4gICAgdHlwZW9mIGRhdGEuY29udGV4dCA9PT0gJ29iamVjdCcgJiZcbiAgICAhQXJyYXkuaXNBcnJheShkYXRhLmNvbnRleHQpICYmXG4gICAgT2JqZWN0LmtleXMoZGF0YS5jb250ZXh0IGFzIG9iamVjdCkubGVuZ3RoID4gMFxuICAgICAgPyAnJ1xuICAgICAgOiBnZXRDb250ZXh0U3RyaW5nKGRhdGEuY29udGV4dClcblxuICBjb25zdCBjb2xvcmVkTGV2ZWwgPSBnZXRDb2xvcmVkTGV2ZWwobGV2ZWwsIHVzZUNvbG9ycylcbiAgY29uc3QgbWV0aG9kUGFkZGVkID0gcmVxdWVzdC5tZXRob2QudG9VcHBlckNhc2UoKS5wYWRFbmQoTUVUSE9EX1BBRClcbiAgY29uc3QgY29sb3JlZE1ldGhvZCA9IGdldENvbG9yZWRNZXRob2QobWV0aG9kUGFkZGVkLCB1c2VDb2xvcnMpXG4gIGNvbnN0IGNvbG9yZWRQYXRobmFtZSA9IGdldENvbG9yZWRQYXRobmFtZShwYXRobmFtZSwgdXNlQ29sb3JzKVxuICBjb25zdCBjb2xvcmVkU3RhdHVzID0gZ2V0Q29sb3JlZFN0YXR1cyhzdGF0dXMsIHVzZUNvbG9ycylcbiAgY29uc3QgeyB0ZXh0OiBjb2xvcmVkRHVyYXRpb24sIGlzVmVyeVNsb3cgfSA9IGNvbG9yRHVyYXRpb25UZXh0KFxuICAgIGR1cmF0aW9uTXMsXG4gICAgdXNlQ29sb3JzLFxuICAgIG9wdGlvbnNcbiAgKVxuICBjb25zdCBzcGVlZFRva2VuID0gZ2V0U3BlZWRUb2tlbihpc1ZlcnlTbG93LCB1c2VDb2xvcnMpXG4gIGNvbnN0IGljb24gPSBnZXRMZXZlbEljb24obGV2ZWwsIHVzZUNvbG9ycylcbiAgY29uc3Qgc3RhdHVzVGV4dCA9IGdldFN0YXR1c1RleHQoc3RhdHVzQ29kZSlcbiAgY29uc3Qgc2VydmljZVRva2VuID0gZ2V0U2VydmljZVRva2VuKG9wdGlvbnMsIHVzZUNvbG9ycylcblxuICBjb25zdCB0b2tlbk1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAne25vd30nOiB0aW1lc3RhbXAsXG4gICAgJ3tlcG9jaH0nOiBlcG9jaCxcbiAgICAne2xldmVsfSc6IGNvbG9yZWRMZXZlbCxcbiAgICAne2ljb259JzogaWNvbixcbiAgICAne2R1cmF0aW9ufSc6IGNvbG9yZWREdXJhdGlvbixcbiAgICAne21ldGhvZH0nOiBjb2xvcmVkTWV0aG9kLFxuICAgICd7cGF0aG5hbWV9JzogY29sb3JlZFBhdGhuYW1lLFxuICAgICd7cGF0aH0nOiBjb2xvcmVkUGF0aG5hbWUsXG4gICAgJ3txdWVyeX0nOiBxdWVyeSxcbiAgICAne3N0YXR1c30nOiBjb2xvcmVkU3RhdHVzLFxuICAgICd7c3RhdHVzVGV4dH0nOiBzdGF0dXNUZXh0LFxuICAgICd7bWVzc2FnZX0nOiBtZXNzYWdlLFxuICAgICd7aXB9JzogaXAsXG4gICAgJ3tjb250ZXh0fSc6IGN0eFN0cmluZyxcbiAgICAne3NlcnZpY2V9Jzogc2VydmljZVRva2VuLFxuICAgICd7c3BlZWR9Jzogc3BlZWRUb2tlbixcbiAgICAne3JlcXVlc3RJZH0nOlxuICAgICAgdHlwZW9mIGRhdGEuY29udGV4dCA9PT0gJ29iamVjdCcgJiZcbiAgICAgIGRhdGEuY29udGV4dCAhPT0gbnVsbCAmJlxuICAgICAgJ3JlcXVlc3RJZCcgaW4gZGF0YS5jb250ZXh0XG4gICAgICAgID8gU3RyaW5nKChkYXRhLmNvbnRleHQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLnJlcXVlc3RJZClcbiAgICAgICAgOiAnJ1xuICB9XG5cbiAgY29uc3QgbWFpbiA9IGZvcm1hdC5yZXBsYWNlKFxuICAgIExPR19GT1JNQVRfUkVHRVgsXG4gICAgbWF0Y2ggPT4gdG9rZW5NYXBbbWF0Y2hdID8/IG1hdGNoXG4gIClcblxuICBjb25zdCBjb250ZXh0TGluZXMgPSBidWlsZENvbnRleHRUcmVlTGluZXMobGV2ZWwsIGRhdGEsIG9wdGlvbnMpXG5cbiAgcmV0dXJuIHsgbWFpbiwgY29udGV4dExpbmVzIH1cbn1cblxuLyoqIEBkZXByZWNhdGVkIFByZWZlciB7QGxpbmsgZm9ybWF0TG9nT3V0cHV0fSBmb3IgbXVsdGktbGluZSBjb250ZXh0IHRyZWVzLiBSZXR1cm5zIHRoZSBtYWluIGxpbmUgb25seS4gKi9cbmV4cG9ydCBjb25zdCBmb3JtYXRMaW5lID0gKGlucHV0OiB7XG4gIGxldmVsOiBMb2dMZXZlbFxuICByZXF1ZXN0OiBSZXF1ZXN0SW5mb1xuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICBzdG9yZTogU3RvcmVEYXRhXG4gIG9wdGlvbnM6IE9wdGlvbnNcbn0pOiBzdHJpbmcgPT5cbiAgZm9ybWF0TG9nT3V0cHV0KHtcbiAgICAuLi5pbnB1dCxcbiAgICBvcHRpb25zOiB7XG4gICAgICAuLi5pbnB1dC5vcHRpb25zLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIC4uLihpbnB1dC5vcHRpb25zLmNvbmZpZyA/PyB7fSksXG4gICAgICAgIHNob3dDb250ZXh0VHJlZTogZmFsc2VcbiAgICAgIH1cbiAgICB9XG4gIH0pLm1haW5cblxuZXhwb3J0IGNvbnN0IGxvZ1dpdGhQaW5vID0gKFxuICBsb2dnZXI6IFBpbm8sXG4gIGxldmVsOiBMb2dMZXZlbCxcbiAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbik6IHZvaWQgPT4ge1xuICBpZiAobGV2ZWwgPT09ICdFUlJPUicpIHtcbiAgICBsb2dnZXIuZXJyb3IoZGF0YSlcbiAgICByZXR1cm5cbiAgfVxuICBpZiAobGV2ZWwgPT09ICdXQVJOSU5HJykge1xuICAgIGxvZ2dlci53YXJuKGRhdGEpXG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKGxldmVsID09PSAnREVCVUcnKSB7XG4gICAgbG9nZ2VyLmRlYnVnKGRhdGEpXG4gICAgcmV0dXJuXG4gIH1cbiAgbG9nZ2VyLmluZm8oZGF0YSlcbn1cbiIsCiAgICAiaW1wb3J0IHsgU3RhdHVzTWFwIH0gZnJvbSAnZWx5c2lhJ1xuXG5jb25zdCBESUdJVFNfT05MWSA9IC9eXFxkKyQvXG5jb25zdCBERUxJTUlURVJTID0gL1tfLV0rL2dcbmNvbnN0IENBTUVMX0JPVU5EQVJZXzEgPSAvKFthLXowLTldKShbQS1aXSkvZ1xuY29uc3QgQ0FNRUxfQk9VTkRBUllfMiA9IC8oW0EtWl0pKFtBLVpdW2Etel0pL2dcbmNvbnN0IEFQT1NUUk9QSEVTID0gL1sn4oCZXS9nXG5jb25zdCBOT05fQUxQSEFOVU1FUklDID0gL1teYS16MC05XFxzXSsvZ1xuY29uc3QgV0hJVEVTUEFDRSA9IC9cXHMrL2dcblxuY29uc3Qgbm9ybWFsaXplU3RhdHVzTmFtZSA9ICh2YWx1ZTogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgLy8gSGFuZGxlcyBjb21tb24gdmFyaWFudHM6XG4gIC8vIC0gY2FzZSBkaWZmZXJlbmNlczogXCJub3QgZm91bmRcIiB2cyBcIk5vdCBGb3VuZFwiXG4gIC8vIC0gc3BhY2luZy9wdW5jdHVhdGlvbjogXCJOb3QtRm91bmRcIiwgXCJub3RfZm91bmRcIlxuICAvLyAtIGNhbWVsQ2FzZS9QYXNjYWxDYXNlOiBcIkludGVybmFsU2VydmVyRXJyb3JcIlxuICBjb25zdCB0cmltbWVkID0gdmFsdWUudHJpbSgpXG4gIGlmICghdHJpbW1lZCkge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgcmV0dXJuIHRyaW1tZWRcbiAgICAucmVwbGFjZShERUxJTUlURVJTLCAnICcpXG4gICAgLnJlcGxhY2UoQ0FNRUxfQk9VTkRBUllfMSwgJyQxICQyJylcbiAgICAucmVwbGFjZShDQU1FTF9CT1VOREFSWV8yLCAnJDEgJDInKVxuICAgIC5yZXBsYWNlKEFQT1NUUk9QSEVTLCAnJylcbiAgICAudG9Mb3dlckNhc2UoKVxuICAgIC5yZXBsYWNlKE5PTl9BTFBIQU5VTUVSSUMsICcgJylcbiAgICAucmVwbGFjZShXSElURVNQQUNFLCAnICcpXG4gICAgLnRyaW0oKVxufVxuXG5jb25zdCBTVEFUVVNfQllfTk9STUFMSVpFRF9OQU1FID0gKCgpID0+IHtcbiAgY29uc3QgbWFwID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKVxuXG4gIGZvciAoY29uc3QgW25hbWUsIGNvZGVdIG9mIE9iamVjdC5lbnRyaWVzKFN0YXR1c01hcCkpIHtcbiAgICBtYXAuc2V0KG5vcm1hbGl6ZVN0YXR1c05hbWUobmFtZSksIGNvZGUpXG4gIH1cblxuICByZXR1cm4gbWFwXG59KSgpXG5cbmV4cG9ydCBjb25zdCBnZXRTdGF0dXNDb2RlID0gKHZhbHVlOiB1bmtub3duKTogbnVtYmVyID0+IHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzRmluaXRlKHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zdCB0cmltbWVkID0gdmFsdWUudHJpbSgpXG4gICAgaWYgKERJR0lUU19PTkxZLnRlc3QodHJpbW1lZCkpIHtcbiAgICAgIHJldHVybiBOdW1iZXIodHJpbW1lZClcbiAgICB9XG5cbiAgICBjb25zdCBrbm93biA9IFNUQVRVU19CWV9OT1JNQUxJWkVEX05BTUUuZ2V0KG5vcm1hbGl6ZVN0YXR1c05hbWUodHJpbW1lZCkpXG4gICAgcmV0dXJuIGtub3duID8/IDUwMFxuICB9XG5cbiAgcmV0dXJuIDUwMFxufVxuIiwKICAgICJleHBvcnQgY29uc3QgcGFyc2VFcnJvciA9IChlcnJvcjogdW5rbm93bik6IHN0cmluZyA9PiB7XG4gIGxldCBtZXNzYWdlID0gJ0FuIGVycm9yIG9jY3VycmVkJ1xuXG4gIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgbWVzc2FnZSA9IGVycm9yLm1lc3NhZ2VcbiAgfSBlbHNlIGlmIChlcnJvciAmJiB0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmICdtZXNzYWdlJyBpbiBlcnJvcikge1xuICAgIG1lc3NhZ2UgPSBlcnJvci5tZXNzYWdlIGFzIHN0cmluZ1xuICB9IGVsc2Uge1xuICAgIG1lc3NhZ2UgPSBTdHJpbmcoZXJyb3IpXG4gIH1cblxuICByZXR1cm4gbWVzc2FnZVxufVxuIiwKICAgICJpbXBvcnQge1xuICBtZXJnZUxvZ0RhdGFDb250ZXh0LFxuICB0eXBlIFJlcXVlc3RDb250ZXh0U3RvcmVcbn0gZnJvbSAnLi4vY29udGV4dC9yZXF1ZXN0LWNvbnRleHQnXG5pbXBvcnQgdHlwZSB7IExvZ0xldmVsLCBPcHRpb25zLCBSZXF1ZXN0SW5mbywgU3RvcmVEYXRhIH0gZnJvbSAnLi4vaW50ZXJmYWNlcydcbmltcG9ydCB7IGxvZ1RvVHJhbnNwb3J0cyB9IGZyb20gJy4uL291dHB1dCdcbmltcG9ydCB7IGxvZ1RvRmlsZSB9IGZyb20gJy4uL291dHB1dC9maWxlJ1xuaW1wb3J0IHsgcGFyc2VFcnJvciB9IGZyb20gJy4uL3V0aWxzL2Vycm9yJ1xuaW1wb3J0IHsgcmVkYWN0LCByZWRhY3RSZXF1ZXN0IH0gZnJvbSAnLi4vdXRpbHMvcmVkYWN0J1xuaW1wb3J0IHsgZm9ybWF0TG9nT3V0cHV0IH0gZnJvbSAnLi9jcmVhdGUtbG9nZ2VyJ1xuXG5jb25zdCBpc0Vycm9yV2l0aFN0YXR1cyA9IChcbiAgdmFsdWU6IHVua25vd25cbik6IHZhbHVlIGlzIHsgc3RhdHVzOiBudW1iZXI7IG1lc3NhZ2U/OiBzdHJpbmcgfSA9PlxuICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gIHZhbHVlICE9PSBudWxsICYmXG4gICdzdGF0dXMnIGluIHZhbHVlICYmXG4gIHR5cGVvZiAodmFsdWUgYXMgeyBzdGF0dXM/OiB1bmtub3duIH0pLnN0YXR1cyA9PT0gJ251bWJlcidcblxuZXhwb3J0IGNvbnN0IGhhbmRsZUh0dHBFcnJvciA9IChcbiAgcmVxdWVzdDogUmVxdWVzdEluZm8sXG4gIGVycm9yOiB1bmtub3duLFxuICBzdG9yZTogU3RvcmVEYXRhLFxuICBvcHRpb25zOiBPcHRpb25zLFxuICBjb250ZXh0U3RvcmU/OiBSZXF1ZXN0Q29udGV4dFN0b3JlXG4pOiB2b2lkID0+IHtcbiAgY29uc3QgY29uZmlnID0gb3B0aW9ucy5jb25maWdcblxuICBjb25zdCBsb2dGaWx0ZXIgPSBjb25maWc/LmxvZ0ZpbHRlclxuICBpZiAoXG4gICAgbG9nRmlsdGVyPy5sZXZlbCAmJlxuICAgIGxvZ0ZpbHRlci5sZXZlbC5sZW5ndGggPiAwICYmXG4gICAgIWxvZ0ZpbHRlci5sZXZlbC5pbmNsdWRlcygnRVJST1InKVxuICApIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHVzZVRyYW5zcG9ydHNPbmx5ID0gY29uZmlnPy51c2VUcmFuc3BvcnRzT25seSA9PT0gdHJ1ZVxuICBjb25zdCBkaXNhYmxlSW50ZXJuYWxMb2dnZXIgPSBjb25maWc/LmRpc2FibGVJbnRlcm5hbExvZ2dlciA9PT0gdHJ1ZVxuICBjb25zdCBkaXNhYmxlRmlsZUxvZ2dpbmcgPSBjb25maWc/LmRpc2FibGVGaWxlTG9nZ2luZyA9PT0gdHJ1ZVxuXG4gIGNvbnN0IHN0YXR1cyA9IGlzRXJyb3JXaXRoU3RhdHVzKGVycm9yKSA/IGVycm9yLnN0YXR1cyA6IDUwMFxuICBjb25zdCBtZXNzYWdlID0gcGFyc2VFcnJvcihlcnJvcilcblxuICBjb25zdCBsZXZlbDogTG9nTGV2ZWwgPSAnRVJST1InXG4gIGNvbnN0IGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0geyBzdGF0dXMsIG1lc3NhZ2UsIGVycm9yIH1cbiAgY29uc3QgZGF0YVdpdGhDb250ZXh0ID0gY29udGV4dFN0b3JlXG4gICAgPyBtZXJnZUxvZ0RhdGFDb250ZXh0KGRhdGEsIGNvbnRleHRTdG9yZS5nZXRDb250ZXh0KHJlcXVlc3QpKVxuICAgIDogZGF0YVxuICBjb25zdCBsb2dEYXRhID1cbiAgICBjb25maWc/LmF1dG9SZWRhY3QgPT09IHRydWUgPyByZWRhY3QoZGF0YVdpdGhDb250ZXh0KSA6IGRhdGFXaXRoQ29udGV4dFxuICBjb25zdCBsb2dSZXF1ZXN0ID1cbiAgICBjb25maWc/LmF1dG9SZWRhY3QgPT09IHRydWUgPyByZWRhY3RSZXF1ZXN0KHJlcXVlc3QpIDogcmVxdWVzdFxuXG4gIGxvZ1RvVHJhbnNwb3J0cyh7IGxldmVsLCByZXF1ZXN0OiBsb2dSZXF1ZXN0LCBkYXRhOiBsb2dEYXRhLCBzdG9yZSwgb3B0aW9ucyB9KVxuXG4gIGlmICghKHVzZVRyYW5zcG9ydHNPbmx5IHx8IGRpc2FibGVGaWxlTG9nZ2luZykpIHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IGNvbmZpZz8ubG9nRmlsZVBhdGhcbiAgICBpZiAoZmlsZVBhdGgpIHtcbiAgICAgIGxvZ1RvRmlsZSh7XG4gICAgICAgIGZpbGVQYXRoLFxuICAgICAgICBsZXZlbCxcbiAgICAgICAgcmVxdWVzdDogbG9nUmVxdWVzdCxcbiAgICAgICAgZGF0YTogbG9nRGF0YSxcbiAgICAgICAgc3RvcmUsXG4gICAgICAgIG9wdGlvbnNcbiAgICAgIH0pLmNhdGNoKCgpID0+IHtcbiAgICAgICAgLy8gSWdub3JlIGVycm9yc1xuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBpZiAodXNlVHJhbnNwb3J0c09ubHkgfHwgZGlzYWJsZUludGVybmFsTG9nZ2VyKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCB7IG1haW4sIGNvbnRleHRMaW5lcyB9ID0gZm9ybWF0TG9nT3V0cHV0KHtcbiAgICBsZXZlbCxcbiAgICByZXF1ZXN0OiBsb2dSZXF1ZXN0LFxuICAgIGRhdGE6IGxvZ0RhdGEsXG4gICAgc3RvcmUsXG4gICAgb3B0aW9uc1xuICB9KVxuXG4gIGNvbnN0IGZvcm1hdHRlZE1lc3NhZ2UgPVxuICAgIGNvbnRleHRMaW5lcy5sZW5ndGggPiAwID8gYCR7bWFpbn1cXG4ke2NvbnRleHRMaW5lcy5qb2luKCdcXG4nKX1gIDogbWFpblxuICBjb25zb2xlLmVycm9yKGZvcm1hdHRlZE1lc3NhZ2UpXG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgUmVxdWVzdElkQ29uZmlnIH0gZnJvbSAnLi4vaW50ZXJmYWNlcydcblxuY29uc3QgREVGQVVMVF9IRUFERVIgPSAnWC1SZXF1ZXN0LUlkJ1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVkUmVxdWVzdElkQ29uZmlnIHtcbiAgZW5hYmxlZDogYm9vbGVhblxuICBnZW5lcmF0b3I6ICgpID0+IHN0cmluZ1xuICBoZWFkZXI6IHN0cmluZ1xufVxuXG4vKipcbiAqIE5vcm1hbGlzZXMgdGhlIGByZXF1ZXN0SWRgIG9wdGlvbiBpbnRvIGEgY29uY3JldGUgY29uZmlnIG9iamVjdC5cbiAqXG4gKiAtIGB1bmRlZmluZWRgIC8gYGZhbHNlYCDihpIgYG51bGxgIChkaXNhYmxlZClcbiAqIC0gYHRydWVgIOKGkiBkZWZhdWx0IGNvbmZpZ1xuICogLSBgUmVxdWVzdElkQ29uZmlnYCDihpIgbWVyZ2VkIHdpdGggZGVmYXVsdHM7IGBlbmFibGVkOiBmYWxzZWAgaW5zaWRlIHRoZSBvYmplY3QgZGlzYWJsZXMgdGhlIGZlYXR1cmVcbiAqL1xuZXhwb3J0IGNvbnN0IHJlc29sdmVSZXF1ZXN0SWRDb25maWcgPSAoXG4gIHJhdz86IGJvb2xlYW4gfCBSZXF1ZXN0SWRDb25maWdcbik6IFJlc29sdmVkUmVxdWVzdElkQ29uZmlnIHwgbnVsbCA9PiB7XG4gIGlmIChyYXcgPT09IHVuZGVmaW5lZCB8fCByYXcgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGlmIChyYXcgPT09IHRydWUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgIGhlYWRlcjogREVGQVVMVF9IRUFERVIsXG4gICAgICBnZW5lcmF0b3I6ICgpID0+IGNyeXB0by5yYW5kb21VVUlEKClcbiAgICB9XG4gIH1cblxuICAvLyBPYmplY3QgZm9ybSDigJQgYGVuYWJsZWRgIGRlZmF1bHRzIHRvIGB0cnVlYCB3aGVuIHRoZSBvYmplY3QgaXMgcHJvdmlkZWRcbiAgaWYgKHJhdy5lbmFibGVkID09PSBmYWxzZSkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICByZXR1cm4ge1xuICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgaGVhZGVyOiByYXcuaGVhZGVyPy50cmltKCkgfHwgREVGQVVMVF9IRUFERVIsXG4gICAgZ2VuZXJhdG9yOiByYXcuZ2VuZXJhdG9yID8/ICgoKSA9PiBjcnlwdG8ucmFuZG9tVVVJRCgpKVxuICB9XG59XG5cbi8qKlxuICogUmVhZHMgYW4gZXhpc3RpbmcgcmVxdWVzdCBJRCBmcm9tIHRoZSBpbmNvbWluZyByZXF1ZXN0IGhlYWRlciwgb3IgZ2VuZXJhdGVzIGFcbiAqIG5ldyBvbmUgdXNpbmcgdGhlIGNvbmZpZ3VyZWQgZ2VuZXJhdG9yLlxuICovXG5leHBvcnQgY29uc3QgZ2V0T3JDcmVhdGVSZXF1ZXN0SWQgPSAoXG4gIHJlcXVlc3Q6IFJlcXVlc3QsXG4gIGNvbmZpZzogUmVzb2x2ZWRSZXF1ZXN0SWRDb25maWdcbik6IHN0cmluZyA9PiB7XG4gIGNvbnN0IGV4aXN0aW5nID0gcmVxdWVzdC5oZWFkZXJzLmdldChjb25maWcuaGVhZGVyKVxuICBpZiAoZXhpc3RpbmcpIHtcbiAgICByZXR1cm4gZXhpc3RpbmdcbiAgfVxuICByZXR1cm4gY29uZmlnLmdlbmVyYXRvcigpXG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgUmVxdWVzdENvbnRleHRTdG9yZSB9IGZyb20gJy4uL2NvbnRleHQvcmVxdWVzdC1jb250ZXh0J1xuaW1wb3J0IHR5cGUgeyBMb2dnZXIsIE9wdGlvbnMsIFN0b3JlRGF0YSB9IGZyb20gJy4uL2ludGVyZmFjZXMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgV2ViU29ja2V0TGlrZSB7XG4gIHJlYWRvbmx5IGRhdGE/OiB7IHN0b3JlPzogeyBsb2dnZXI/OiBMb2dnZXIgfSB9XG4gIHJlYWRvbmx5IGlkPzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgV3NIYW5kbGVySG9va3M8XG4gIFRNZXNzYWdlID0gdW5rbm93bixcbiAgVFdzIGV4dGVuZHMgV2ViU29ja2V0TGlrZSA9IFdlYlNvY2tldExpa2Vcbj4ge1xuICBjbG9zZT86ICh3czogVFdzKSA9PiB2b2lkXG4gIG1lc3NhZ2U/OiAod3M6IFRXcywgbWVzc2FnZTogVE1lc3NhZ2UpID0+IHZvaWRcbiAgb3Blbj86ICh3czogVFdzKSA9PiB2b2lkXG59XG5cbmNvbnN0IHdzU3ludGhldGljUmVxdWVzdCA9IChwYXRoOiBzdHJpbmcpOiBSZXF1ZXN0ID0+XG4gIG5ldyBSZXF1ZXN0KGBodHRwOi8vbG9naXhseXNpYS5sb2NhbCR7cGF0aH1gLCB7IG1ldGhvZDogJ1dTJyB9KVxuXG5leHBvcnQgY29uc3QgY3JlYXRlV3NIYW5kbGVyV3JhcHBlciA9IChcbiAgb3B0aW9uczogT3B0aW9ucyxcbiAgbG9nZ2VyOiBMb2dnZXIsXG4gIGNvbnRleHRTdG9yZTogUmVxdWVzdENvbnRleHRTdG9yZVxuKSA9PiB7XG4gIGNvbnN0IHdzVGltaW5ncyA9IG5ldyBXZWFrTWFwPG9iamVjdCwgYmlnaW50PigpXG5cbiAgY29uc3QgbG9nV3MgPSAoXG4gICAgbGV2ZWw6ICdJTkZPJyB8ICdXQVJOSU5HJyB8ICdFUlJPUicsXG4gICAgd3M6IFdlYlNvY2tldExpa2UsXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICBleHRyYT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IGtleSA9IHdzIGFzIG9iamVjdFxuICAgIGNvbnN0IGJlZm9yZVRpbWUgPSB3c1RpbWluZ3MuZ2V0KGtleSkgPz8gcHJvY2Vzcy5ocnRpbWUuYmlnaW50KClcbiAgICBjb25zdCBzdG9yZTogU3RvcmVEYXRhID0geyBiZWZvcmVUaW1lIH1cbiAgICBjb25zdCBhY2N1bXVsYXRlZCA9IGNvbnRleHRTdG9yZS5nZXRDb250ZXh0KGtleSlcbiAgICBjb25zdCBjb250ZXh0ID1cbiAgICAgIE9iamVjdC5rZXlzKGFjY3VtdWxhdGVkKS5sZW5ndGggPiAwIHx8IGV4dHJhXG4gICAgICAgID8geyAuLi5hY2N1bXVsYXRlZCwgLi4uZXh0cmEsIHdzSWQ6IHdzLmlkIH1cbiAgICAgICAgOiB7IHdzSWQ6IHdzLmlkIH1cblxuICAgIGxvZ2dlci5sb2coXG4gICAgICBsZXZlbCxcbiAgICAgIHdzU3ludGhldGljUmVxdWVzdChwYXRoKSxcbiAgICAgIHsgbWVzc2FnZSwgY29udGV4dCwgc3RhdHVzOiAyMDAgfSxcbiAgICAgIHN0b3JlXG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIDxcbiAgICBUTWVzc2FnZSxcbiAgICBUV3MgZXh0ZW5kcyBXZWJTb2NrZXRMaWtlLFxuICAgIGNvbnN0IFRIb29rcyBleHRlbmRzIFdzSGFuZGxlckhvb2tzPFRNZXNzYWdlLCBUV3M+XG4gID4oXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIGhvb2tzOiBUSG9va3NcbiAgKTogVEhvb2tzID0+XG4gICAgKHtcbiAgICAgIC4uLmhvb2tzLFxuICAgICAgb3Blbih3cykge1xuICAgICAgICB3c1RpbWluZ3Muc2V0KHdzIGFzIG9iamVjdCwgcHJvY2Vzcy5ocnRpbWUuYmlnaW50KCkpXG4gICAgICAgIGhvb2tzLm9wZW4/Lih3cylcbiAgICAgICAgaWYgKG9wdGlvbnMuY29uZmlnPy5kaXNhYmxlV2ViU29ja2V0TG9nZ2luZyAhPT0gdHJ1ZSkge1xuICAgICAgICAgIGxvZ1dzKCdJTkZPJywgd3MsIHBhdGgsICdXZWJTb2NrZXQgb3BlbmVkJylcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIG1lc3NhZ2Uod3MsIG1lc3NhZ2UpIHtcbiAgICAgICAgaG9va3MubWVzc2FnZT8uKHdzLCBtZXNzYWdlKVxuICAgICAgICBpZiAob3B0aW9ucy5jb25maWc/LmRpc2FibGVXZWJTb2NrZXRMb2dnaW5nICE9PSB0cnVlKSB7XG4gICAgICAgICAgbG9nV3MoJ0lORk8nLCB3cywgcGF0aCwgJ1dlYlNvY2tldCBtZXNzYWdlJywge1xuICAgICAgICAgICAgcGF5bG9hZFR5cGU6IHR5cGVvZiBtZXNzYWdlXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGNsb3NlKHdzKSB7XG4gICAgICAgIGhvb2tzLmNsb3NlPy4od3MpXG4gICAgICAgIGlmIChvcHRpb25zLmNvbmZpZz8uZGlzYWJsZVdlYlNvY2tldExvZ2dpbmcgIT09IHRydWUpIHtcbiAgICAgICAgICBsb2dXcygnSU5GTycsIHdzLCBwYXRoLCAnV2ViU29ja2V0IGNsb3NlZCcpXG4gICAgICAgIH1cbiAgICAgICAgY29udGV4dFN0b3JlLmNsZWFyQ29udGV4dCh3cyBhcyBvYmplY3QpXG4gICAgICAgIHdzVGltaW5ncy5kZWxldGUod3MgYXMgb2JqZWN0KVxuICAgICAgfVxuICAgIH0pIGFzIFRIb29rc1xufVxuIgogIF0sCiAgIm1hcHBpbmdzIjogIkFBQUEsaUJBQVMsZ0JDSVQsSUFBTSxHQUFxRSxDQUN6RSxJQUFLLENBQ0gsbUJBQW9CLEdBQ3BCLHFCQUFzQixTQUN0QixVQUFXLEdBQ1gsZ0JBQWlCLEdBQ2pCLEtBQU0sQ0FDSixZQUFhLEVBQ2YsQ0FDRixFQUNBLEtBQU0sQ0FDSixtQkFBb0IsR0FDcEIsVUFBVyxHQUNYLGdCQUFpQixHQUNqQixXQUFZLEdBQ1osVUFBVyxHQUNYLEtBQU0sQ0FDSixZQUFhLEVBQ2YsQ0FDRixFQUNBLEtBQU0sQ0FDSixtQkFBb0IsR0FDcEIsVUFBVyxHQUNYLGdCQUFpQixHQUNqQixLQUFNLENBQ0osWUFBYSxFQUNmLENBQ0YsQ0FDRixFQUVNLEdBQWMsQ0FDbEIsRUFDQSxJQUNtQyxDQUNuQyxHQUFJLENBQUMsRUFDSCxPQUFPLEVBR1QsSUFBTSxFQUF5QyxJQUFLLEtBQVMsQ0FB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T0FBTyxFQUFJLFNBQVcsU0FBVyxFQUFJLE9BQVMsSUFDekQsRUFBc0MsT0FDMUMsR0FBSSxHQUFVLElBQ1osRUFBUSxRQUNILFFBQUksR0FBVSxJQUNuQixFQUFRLFVBR1YsSUFBTSxFQUFjLEVBQWEsV0FBVyxDQUFPLEVBQzdDLEVBQWdDLENBQUUsUUFBTyxFQUMvQyxHQUFJLE9BQU8sS0FBSyxDQUFXLEVBQUUsT0FBUyxFQUNwQyxFQUFLLFFBQVUsSUFBSyxDQUFZLEVBR2xDLEVBQU8sSUFBSSxFQUFPLEVBQVMsRUFBTSxDQUFLLFNBQ3RDLENBQ0EsRUFBYSxhQUFhLENBQU8sR0FFcEMsRUFDQSxRQUFRLEVBQUcsVUFBUyxRQUFPLE1BQUssV0FBWSxDQUMzQyxHQUFJLENBQ0YsR0FBSSxFQUFpQixDQUVuQixJQUFNLEVBRE0sRUFBYSxXQUFXLENBQU8sRUFDNUIsVUFDZixHQUFJLEVBQ0YsRUFBSSxRQUFRLEVBQWdCLFFBQVUsRUFHMUMsRUFBTyxnQkFBZ0IsRUFBUyxFQUFPLENBQUssU0FDNUMsQ0FDQSxFQUFhLGFBQWEsQ0FBTyxHQUVwQyxFQUNBLEdBQUcsUUFBUSxFQUVkLE9BQU8sT0FBTyxPQUFPLEVBQVEsQ0FBRSxRQUFPLENBQUMsR0EwQjFCIiwKICAiZGVidWdJZCI6ICI0OTRGRkQ1NzBDM0UxNDI3NjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==
|
package/dist/otel.d.ts
CHANGED
|
@@ -25,4 +25,6 @@ interface TraceContextFields {
|
|
|
25
25
|
* `@opentelemetry/api` is installed and a span is active.
|
|
26
26
|
*/
|
|
27
27
|
declare const injectTraceContext: (logger: Pick<Logger, "mergeContext">, request: Request) => TraceContextFields | undefined;
|
|
28
|
-
|
|
28
|
+
/** @internal Reset the cached OTel API reference. Only intended for tests. */
|
|
29
|
+
declare const __resetForTesting: () => void;
|
|
30
|
+
export { injectTraceContext, injectTraceContext as default, __resetForTesting, TraceContextFields };
|
package/dist/otel.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{createRequire as
|
|
1
|
+
import{createRequire as F}from"node:module";var G=F(import.meta.url),b,H=()=>{if(b!==void 0)return b;try{b=G("@opentelemetry/api")}catch{b=null}return b},K=(z,B)=>{let k=H();if(!k)return;let v=k.trace.getSpan(k.context.active());if(!v)return;let{traceId:D,spanId:E}=v.spanContext(),w={trace_id:D,span_id:E};return z.mergeContext(B,w),w},L=()=>{b=void 0};export{K as injectTraceContext,K as default,L as __resetForTesting};
|
|
2
2
|
|
|
3
|
-
//# debugId=
|
|
4
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL290ZWwudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gJ25vZGU6bW9kdWxlJ1xuaW1wb3J0IHR5cGUgeyBMb2dnZXIgfSBmcm9tICcuL2ludGVyZmFjZXMnXG5cbmNvbnN0IHJlcXVpcmVPdGVsID0gY3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpXG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhY2VDb250ZXh0RmllbGRzIHtcbiAgc3Bhbl9pZD86IHN0cmluZ1xuICB0cmFjZV9pZD86IHN0cmluZ1xufVxuXG5pbnRlcmZhY2UgT3RlbEFwaSB7XG4gIGNvbnRleHQ6IHsgYWN0aXZlOiAoKSA9PiB1bmtub3duIH1cbiAgdHJhY2U6IHtcbiAgICBnZXRTcGFuOiAoXG4gICAgICBjdHg6IHVua25vd25cbiAgICApID0+IHsgc3BhbkNvbnRleHQ6ICgpID0+
|
|
3
|
+
//# debugId=4D79945910DA067064756E2164756E21
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL290ZWwudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gJ25vZGU6bW9kdWxlJ1xuaW1wb3J0IHR5cGUgeyBMb2dnZXIgfSBmcm9tICcuL2ludGVyZmFjZXMnXG5cbmNvbnN0IHJlcXVpcmVPdGVsID0gY3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpXG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhY2VDb250ZXh0RmllbGRzIHtcbiAgc3Bhbl9pZD86IHN0cmluZ1xuICB0cmFjZV9pZD86IHN0cmluZ1xufVxuXG5pbnRlcmZhY2UgT3RlbEFwaSB7XG4gIGNvbnRleHQ6IHsgYWN0aXZlOiAoKSA9PiB1bmtub3duIH1cbiAgdHJhY2U6IHtcbiAgICBnZXRTcGFuOiAoXG4gICAgICBjdHg6IHVua25vd25cbiAgICApID0+IHsgc3BhbkNvbnRleHQ6ICgpID0+IHsgdHJhY2VJZDogc3RyaW5nOyBzcGFuSWQ6IHN0cmluZyB9IH0gfCB1bmRlZmluZWRcbiAgfVxufVxuXG5sZXQgb3RlbEFwaTogT3RlbEFwaSB8IG51bGwgfCB1bmRlZmluZWRcblxuY29uc3QgZ2V0T3RlbEFwaSA9ICgpOiBPdGVsQXBpIHwgbnVsbCA9PiB7XG4gIGlmIChvdGVsQXBpICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gb3RlbEFwaVxuICB9XG4gIHRyeSB7XG4gICAgb3RlbEFwaSA9IHJlcXVpcmVPdGVsKCdAb3BlbnRlbGVtZXRyeS9hcGknKSBhcyBPdGVsQXBpXG4gIH0gY2F0Y2gge1xuICAgIG90ZWxBcGkgPSBudWxsXG4gIH1cbiAgcmV0dXJuIG90ZWxBcGlcbn1cblxuLyoqXG4gKiBJbmplY3RzIGFjdGl2ZSBPcGVuVGVsZW1ldHJ5IHNwYW4gSURzIGludG8gdGhlIHJlcXVlc3QgY29udGV4dCBiYWcgd2hlblxuICogYEBvcGVudGVsZW1ldHJ5L2FwaWAgaXMgaW5zdGFsbGVkIGFuZCBhIHNwYW4gaXMgYWN0aXZlLlxuICovXG5leHBvcnQgY29uc3QgaW5qZWN0VHJhY2VDb250ZXh0ID0gKFxuICBsb2dnZXI6IFBpY2s8TG9nZ2VyLCAnbWVyZ2VDb250ZXh0Jz4sXG4gIHJlcXVlc3Q6IFJlcXVlc3Rcbik6IFRyYWNlQ29udGV4dEZpZWxkcyB8IHVuZGVmaW5lZCA9PiB7XG4gIGNvbnN0IGFwaSA9IGdldE90ZWxBcGkoKVxuICBpZiAoIWFwaSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3Qgc3BhbiA9IGFwaS50cmFjZS5nZXRTcGFuKGFwaS5jb250ZXh0LmFjdGl2ZSgpKVxuICBpZiAoIXNwYW4pIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHsgdHJhY2VJZCwgc3BhbklkIH0gPSBzcGFuLnNwYW5Db250ZXh0KClcbiAgY29uc3QgZmllbGRzID0ge1xuICAgIHRyYWNlX2lkOiB0cmFjZUlkLFxuICAgIHNwYW5faWQ6IHNwYW5JZFxuICB9IHNhdGlzZmllcyBUcmFjZUNvbnRleHRGaWVsZHNcbiAgbG9nZ2VyLm1lcmdlQ29udGV4dChyZXF1ZXN0LCBmaWVsZHMpXG4gIHJldHVybiBmaWVsZHNcbn1cblxuLyoqIEBpbnRlcm5hbCBSZXNldCB0aGUgY2FjaGVkIE9UZWwgQVBJIHJlZmVyZW5jZS4gT25seSBpbnRlbmRlZCBmb3IgdGVzdHMuICovXG5leHBvcnQgY29uc3QgX19yZXNldEZvclRlc3RpbmcgPSAoKTogdm9pZCA9PiB7XG4gIG90ZWxBcGkgPSB1bmRlZmluZWRcbn1cblxuZXhwb3J0IHsgaW5qZWN0VHJhY2VDb250ZXh0IGFzIGRlZmF1bHQgfVxuIgogIF0sCiAgIm1hcHBpbmdzIjogIkFBQUEsd0JBQVMsb0JBR1QsSUFBTSxFQUFjLEVBQWMsWUFBWSxHQUFHLEVBZ0I3QyxFQUVFLEVBQWEsSUFBc0IsQ0FDdkMsR0FBSSxJQUFZLE9BQ2QsT0FBTyxFQUVULEdBQUksQ0FDRixFQUFVLEVBQVksb0JBQW9CLEVBQzFDLEtBQU0sQ0FDTixFQUFVLEtBRVosT0FBTyxHQU9JLEVBQXFCLENBQ2hDLEVBQ0EsSUFDbUMsQ0FDbkMsSUFBTSxFQUFNLEVBQVcsRUFDdkIsR0FBSSxDQUFDLEVBQ0gsT0FHRixJQUFNLEVBQU8sRUFBSSxNQUFNLFFBQVEsRUFBSSxRQUFRLE9BQU8sQ0FBQyxFQUNuRCxHQUFJLENBQUMsRUFDSCxPQUdGLElBQVEsVUFBUyxVQUFXLEVBQUssWUFBWSxFQUN2QyxFQUFTLENBQ2IsU0FBVSxFQUNWLFFBQVMsQ0FDWCxFQUVBLE9BREEsRUFBTyxhQUFhLEVBQVMsQ0FBTSxFQUM1QixHQUlJLEVBQW9CLElBQVksQ0FDM0MsRUFBVSIsCiAgImRlYnVnSWQiOiAiNEQ3OTk0NTkxMERBMDY3MDY0NzU2RTIxNjQ3NTZFMjEiLAogICJuYW1lcyI6IFtdCn0=
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "logixlysia",
|
|
3
|
-
"version": "6.5.
|
|
3
|
+
"version": "6.5.1",
|
|
4
4
|
"description": "🦊 Logixlysia is a logger for Elysia",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -61,7 +61,7 @@
|
|
|
61
61
|
"devDependencies": {
|
|
62
62
|
"@elysiajs/node": "^1.4.5",
|
|
63
63
|
"@types/bun": "^1.3.14",
|
|
64
|
-
"bunup": "^0.16.
|
|
64
|
+
"bunup": "^0.16.32",
|
|
65
65
|
"elysia": "^1.4.28"
|
|
66
66
|
},
|
|
67
67
|
"peerDependencies": {
|