logixlysia 6.5.1 → 6.6.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/README.md +1 -1
- package/dist/ai.d.ts +1 -1
- package/dist/ai.js +3 -3
- package/dist/index.d.ts +18 -2
- package/dist/index.js +9 -9
- package/dist/otel.d.ts +1 -1
- package/dist/otel.js +3 -3
- package/package.json +24 -24
package/README.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<div align="center">
|
|
2
2
|
<h1><code>🦊</code> Logixlysia</h1>
|
|
3
3
|
<strong>Logixlysia is a logging library for ElysiaJS</strong>
|
|
4
|
-
<img src="https://
|
|
4
|
+
<img src="https://logixlysia.vercel.app/opengraph-image.png" alt="Logixlysia" width="100%" height="auto" />
|
|
5
5
|
</div>
|
|
6
6
|
|
|
7
7
|
## `📩` Installation
|
package/dist/ai.d.ts
CHANGED
|
@@ -34,4 +34,4 @@ interface AIMetrics {
|
|
|
34
34
|
* on the final access log (evlog-style `ai` object).
|
|
35
35
|
*/
|
|
36
36
|
declare const mergeAIMetrics: (logger: Pick<Logger, "mergeContext">, request: Request, metrics: AIMetrics) => void;
|
|
37
|
-
export { mergeAIMetrics,
|
|
37
|
+
export { mergeAIMetrics, AIMetrics };
|
package/dist/ai.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var z=(k,w,d)=>{if(Object.keys(d).length===0)return;k.mergeContext(w,{ai:d})};export{z as mergeAIMetrics
|
|
1
|
+
var z=(k,w,d)=>{if(Object.keys(d).length===0)return;k.mergeContext(w,{ai:d})};export{z as mergeAIMetrics};
|
|
2
2
|
|
|
3
|
-
//# debugId=
|
|
4
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2FpLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgImltcG9ydCB0eXBlIHsgTG9nZ2VyIH0gZnJvbSAnLi9pbnRlcmZhY2VzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIEFJTWV0cmljcyB7XG4gIGNhbGxzPzogbnVtYmVyXG4gIGZpbmlzaFJlYXNvbj86IHN0cmluZ1xuICBpbnB1dFRva2Vucz86IG51bWJlclxuICBtb2RlbD86IHN0cmluZ1xuICBtc1RvRmluaXNoPzogbnVtYmVyXG4gIG1zVG9GaXJzdENodW5rPzogbnVtYmVyXG4gIG91dHB1dFRva2Vucz86IG51bWJlclxuICBwcm92aWRlcj86IHN0cmluZ1xuICByZWFzb25pbmdUb2tlbnM/OiBudW1iZXJcbiAgdG9rZW5zUGVyU2Vjb25kPzogbnVtYmVyXG4gIHRvdGFsVG9rZW5zPzogbnVtYmVyXG59XG5cbi8qKlxuICogTWVyZ2VzIEFJIFNESyAvIExMTSB1c2FnZSBtZXRyaWNzIGludG8gdGhlIHJlcXVlc3QgY29udGV4dCBiYWcgc28gdGhleSBhcHBlYXJcbiAqIG9uIHRoZSBmaW5hbCBhY2Nlc3MgbG9nIChldmxvZy1zdHlsZSBgYWlgIG9iamVjdCkuXG4gKi9cbmV4cG9ydCBjb25zdCBtZXJnZUFJTWV0cmljcyA9IChcbiAgbG9nZ2VyOiBQaWNrPExvZ2dlciwgJ21lcmdlQ29udGV4dCc+
|
|
3
|
+
//# debugId=2447CBBCE831480664756E2164756E21
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2FpLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgImltcG9ydCB0eXBlIHsgTG9nZ2VyIH0gZnJvbSAnLi9pbnRlcmZhY2VzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIEFJTWV0cmljcyB7XG4gIGNhbGxzPzogbnVtYmVyXG4gIGZpbmlzaFJlYXNvbj86IHN0cmluZ1xuICBpbnB1dFRva2Vucz86IG51bWJlclxuICBtb2RlbD86IHN0cmluZ1xuICBtc1RvRmluaXNoPzogbnVtYmVyXG4gIG1zVG9GaXJzdENodW5rPzogbnVtYmVyXG4gIG91dHB1dFRva2Vucz86IG51bWJlclxuICBwcm92aWRlcj86IHN0cmluZ1xuICByZWFzb25pbmdUb2tlbnM/OiBudW1iZXJcbiAgdG9rZW5zUGVyU2Vjb25kPzogbnVtYmVyXG4gIHRvdGFsVG9rZW5zPzogbnVtYmVyXG59XG5cbi8qKlxuICogTWVyZ2VzIEFJIFNESyAvIExMTSB1c2FnZSBtZXRyaWNzIGludG8gdGhlIHJlcXVlc3QgY29udGV4dCBiYWcgc28gdGhleSBhcHBlYXJcbiAqIG9uIHRoZSBmaW5hbCBhY2Nlc3MgbG9nIChldmxvZy1zdHlsZSBgYWlgIG9iamVjdCkuXG4gKi9cbmV4cG9ydCBjb25zdCBtZXJnZUFJTWV0cmljcyA9IChcbiAgbG9nZ2VyOiBQaWNrPExvZ2dlciwgJ21lcmdlQ29udGV4dCc+LFxuICByZXF1ZXN0OiBSZXF1ZXN0LFxuICBtZXRyaWNzOiBBSU1ldHJpY3Ncbik6IHZvaWQgPT4ge1xuICBpZiAoT2JqZWN0LmtleXMobWV0cmljcykubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgbG9nZ2VyLm1lcmdlQ29udGV4dChyZXF1ZXN0LCB7IGFpOiBtZXRyaWNzIH0pXG59XG4iCiAgXSwKICAibWFwcGluZ3MiOiAiQUFvQk8sSUFBTSxFQUFpQixDQUM1QixFQUNBLEVBQ0EsSUFDUyxDQUNULEdBQUksT0FBTyxLQUFLLENBQU8sRUFBRSxTQUFXLEVBQ2xDLE9BRUYsRUFBTyxhQUFhLEVBQVMsQ0FBRSxHQUFJLENBQVEsQ0FBQyIsCiAgImRlYnVnSWQiOiAiMjQ0N0NCQkNFODMxNDgwNjY0NzU2RTIxNjQ3NTZFMjEiLAogICJuYW1lcyI6IFtdCn0=
|
package/dist/index.d.ts
CHANGED
|
@@ -118,6 +118,12 @@ interface Options {
|
|
|
118
118
|
pino?: (PinoLoggerOptions & {
|
|
119
119
|
prettyPrint?: PrettyPrintConfig;
|
|
120
120
|
}) | undefined;
|
|
121
|
+
/**
|
|
122
|
+
* Enable request-scoped logger propagation via AsyncLocalStorage.
|
|
123
|
+
* When enabled, a request-scoped logger `log` is also derived on the Elysia context.
|
|
124
|
+
* @default false
|
|
125
|
+
*/
|
|
126
|
+
useAsyncLocalStorage?: boolean;
|
|
121
127
|
};
|
|
122
128
|
/**
|
|
123
129
|
* Opinionated defaults for common environments.
|
|
@@ -136,6 +142,13 @@ interface Logger {
|
|
|
136
142
|
pino: Pino;
|
|
137
143
|
warn: (request: RequestInfo, message: string, context?: Record<string, unknown>) => void;
|
|
138
144
|
}
|
|
145
|
+
interface RequestScopedLogger {
|
|
146
|
+
debug: (message: string, context?: Record<string, unknown>) => void;
|
|
147
|
+
error: (message: string, context?: Record<string, unknown>) => void;
|
|
148
|
+
info: (message: string, context?: Record<string, unknown>) => void;
|
|
149
|
+
mergeContext: (partial: Record<string, unknown>) => void;
|
|
150
|
+
warn: (message: string, context?: Record<string, unknown>) => void;
|
|
151
|
+
}
|
|
139
152
|
interface LogixlysiaContext {
|
|
140
153
|
request: Request;
|
|
141
154
|
store: LogixlysiaStore;
|
|
@@ -170,6 +183,7 @@ declare const createWsHandlerWrapper: (options: Options, logger: Logger, context
|
|
|
170
183
|
>(path: string, hooks: THooks) => THooks;
|
|
171
184
|
/** Applies preset defaults; explicit `config` keys override preset values. */
|
|
172
185
|
declare const resolveOptions: (options?: Options) => Options;
|
|
186
|
+
declare const useLogger: () => RequestScopedLogger;
|
|
173
187
|
import pino from "pino";
|
|
174
188
|
declare const createLogger: (options?: Options, pinoFactory?: typeof pino, externalContextStore?: RequestContextStore) => Logger;
|
|
175
189
|
/** Plugin entry: shares one request-context store across the Elysia lifecycle. */
|
|
@@ -205,7 +219,9 @@ interface EmptyElysiaSlot {
|
|
|
205
219
|
*/
|
|
206
220
|
interface LogixlysiaSingleton {
|
|
207
221
|
decorator: EmptyElysiaSlot;
|
|
208
|
-
derive:
|
|
222
|
+
derive: {
|
|
223
|
+
log: RequestScopedLogger;
|
|
224
|
+
};
|
|
209
225
|
resolve: EmptyElysiaSlot;
|
|
210
226
|
store: LogixlysiaStore;
|
|
211
227
|
}
|
|
@@ -214,4 +230,4 @@ type LogixlysiaPlugin = Logixlysia & {
|
|
|
214
230
|
wrapWs: ReturnType<typeof createWsHandlerWrapper>;
|
|
215
231
|
};
|
|
216
232
|
declare const logixlysia: (rawOptions?: Options) => LogixlysiaPlugin;
|
|
217
|
-
export { resolveRequestIdConfig, resolveOptions,
|
|
233
|
+
export { useLogger, resolveRequestIdConfig, resolveOptions, getOrCreateRequestId, logixlysia as default, createWsHandlerWrapper, createPluginLogger, createLogger, WsHandlerHooks, Transport, StoreData, ResolvedRequestIdConfig, RequestScopedLogger, 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
|
-
`)}`:
|
|
6
|
-
${
|
|
7
|
-
`)}`:
|
|
1
|
+
import{Elysia as W2}from"elysia";import{promises as W0}from"node:fs";import{basename as y0,dirname as C0}from"node:path";var m0=/^(\d+(?:\.\d+)?)(k|kb|m|mb|g|gb)$/i,x0=/^(\d+)(h|d|w)$/i,P0=/\.(\d{4}-\d{2}-\d{2}-\d{2}-\d{2}-\d{2}(?:-\d{3})?(?:-\d+)?)(?:\.gz)?$/,p=($)=>{if(typeof $==="number"){if(!Number.isFinite($)||$<=0)throw Error(`Invalid size: ${$}`);return $}let W=$.trim();if(W!==""){let j=Number(W);if(Number.isFinite(j)){if(j<=0)throw Error(`Invalid size: ${$}`);return j}}let N=W.match(m0);if(!N)throw Error(`Invalid size format: ${$}`);let Q=Number(N[1]),Z=N[2].toLowerCase(),J=1024;if(Z.startsWith("m"))J=1048576;else if(Z.startsWith("g"))J=1073741824;return Math.floor(Q*J)},N0=($)=>{let W=$.trim().match(x0);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},v=($)=>{if(typeof $==="number")return{type:"count",value:$};return{type:"time",value:N0($)}},I0=async($,W)=>{try{return(await W0.stat($)).size>W}catch{return!1}},Q0=async($)=>{let W=C0($),N=y0($),Q;try{Q=await W0.readdir(W)}catch{return[]}return Q.filter((Z)=>Z.startsWith(`${N}.`)&&P0.test(Z)).map((Z)=>`${W}/${Z}`)};var q0=["dev","prod","json"],c0=($)=>{let W=$?.logRotation;if(!W)return;try{if(W.maxSize!==void 0)p(W.maxSize);if(W.maxFiles!==void 0)v(W.maxFiles);if(W.interval!==void 0)N0(W.interval);if(W.compression!==void 0&&W.compression!=="gzip")throw Error(`Invalid compression algorithm: ${W.compression}`)}catch(N){let Q=N instanceof Error?N.message:String(N);throw Error(`logixlysia: invalid logRotation config — ${Q}`,{cause:N})}},h0={dev:{pino:{prettyPrint:!0},showContextTree:!0,showStartupMessage:!0,startupMessageFormat:"banner",useColors:!0},json:{pino:{prettyPrint:!1},showContextTree:!1,showStartupMessage:!1,useColors:!1},prod:{autoRedact:!0,pino:{prettyPrint:!1},requestId:!0,showContextTree:!1,showStartupMessage:!1,useColors:!1}},p0=($,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},Z0=($={})=>{let{preset:W}=$;if(W&&!q0.includes(W))throw Error(`logixlysia: invalid preset — ${W}`);let N=W?{...$,config:p0(h0[W],$.config)}:$;return c0(N.config),N};var g=()=>{let $=new WeakMap,W=(N)=>{let Q=$.get(N);if(!Q)Q={},$.set(N,Q);return Q};return{clearContext(N){$.delete(N)},getContext(N){let Q=$.get(N);return Q?{...Q}:{}},mergeContext(N,Q){if(Object.keys(Q).length===0)return;let Z=W(N);Object.assign(Z,Q)}}},n=($,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 J={...W,...Z?N:{}};return{...$,context:J}};import{AsyncLocalStorage as v0}from"node:async_hooks";var j0=new v0,g0={debug:()=>{return},error:()=>{return},info:()=>{return},mergeContext:()=>{return},warn:()=>{return}},n0=()=>j0.getStore()??g0;import{createRequire as M0}from"node:module";var d0=(()=>{try{return M0(import.meta.url)("elysia/package.json")}catch{return{}}})(),u0=(()=>{try{return M0(import.meta.url)("../../package.json")}catch{return{}}})(),i0=($,W)=>{if($.length>=W)return $.slice(0,W);let N=Math.floor((W-$.length)/2),Q=W-$.length-N;return`${" ".repeat(N)}${$}${" ".repeat(Q)}`},V0=($,W)=>{let{version:N}=d0,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,z=`┌${"─".repeat(j)}┐`,H=`└${"─".repeat(j)}┘`,I=`│${" ".repeat(j)}│`,M=[z];for(let T of Z){if(T.kind==="empty"){M.push(I);continue}if(T.kind==="center"){M.push(`│${i0(T.text,j)}│`);continue}let{text:X}=T,G=Math.max(0,j-X.length-4);M.push(`│ ${X}${" ".repeat(G)} │`)}return M.push(H),M.join(`
|
|
2
|
+
`)},O0=()=>{let $=u0.version;if(!$)return null;return` logixlysia v${$}`};var J0=($,W)=>{if(!(W.config?.showStartupMessage??!0))return;let{port:Q,hostname:Z,protocol:J}=$;if(Q===void 0||!Z||!J)return;let j=`${J}://${Z}:${Q}`,z=`\uD83E\uDD8A Elysia is running at ${j}`,H=`\uD83E\uDD8A ${j}`;if((W.config?.startupMessageFormat??"banner")==="simple"){console.log(z);return}console.log(V0(H,O0()))};import{StatusMap as o0}from"elysia";var l0=/^\d+$/,s0=/[_-]+/g,a0=/([a-z0-9])([A-Z])/g,r0=/([A-Z])([A-Z][a-z])/g,t0=/['’]/g,e0=/[^a-z0-9\s]+/g,$$=/\s+/g,T0=($)=>{let W=$.trim();if(!W)return"";return W.replace(s0," ").replace(a0,"$1 $2").replace(r0,"$1 $2").replace(t0,"").toLowerCase().replace(e0," ").replace($$," ").trim()},W$=(()=>{let $=new Map;for(let[W,N]of Object.entries(o0))$.set(T0(W),N);return $})(),d=($)=>{if(typeof $==="number"&&Number.isFinite($))return $;if(typeof $==="string"){let W=$.trim();if(l0.test(W))return Number(W);return W$.get(T0(W))??500}return 500};import k0 from"pino";import e$ from"pino-pretty";var R0=0,N$=5000,U0=($)=>{let W=Date.now();if(W-R0<N$)return;R0=W,console.error("[logixlysia] transport failed:",$)},u=(...$)=>{let W=typeof $[0]==="string"?{data:$[2],level:$[0],options:$[4],request:$[1],store:$[3]}:$[0],{level:N,request:Q,data:Z,store:J,options:j}=W,z=j.config?.transports??[];if(z.length===0)return;let H=typeof Z.message==="string"?Z.message:"",I={request:{method:Q.method,url:Q.url},...Z,durationMs:J.beforeTime===BigInt(0)?0:Number(process.hrtime.bigint()-J.beforeTime)/1e6};for(let M of z)try{let T=M.log(N,H,I);if(T&&typeof T.catch==="function")T.catch(U0)}catch(T){U0(T)}};import{appendFile as B$}from"node:fs/promises";import{dirname as I$}from"node:path";import{promises as Q$}from"node:fs";var _0=async($)=>{await Q$.mkdir($,{recursive:!0})};import{promises as D}from"node:fs";import{promisify as Z$}from"node:util";import{gzip as j$}from"node:zlib";var J$=Z$(j$),i=new Map,z$=async($)=>{let W=i.get($)??Promise.resolve(),N,Q=new Promise((Z)=>{N=Z});return i.set($,Q),await W,()=>{if(N?.(),i.get($)===Q)i.delete($)}},m=($)=>String($).padStart(2,"0"),H$=($,W)=>{let N=W.getFullYear(),Q=m(W.getMonth()+1),Z=m(W.getDate()),J=m(W.getHours()),j=m(W.getMinutes()),z=m(W.getSeconds()),H=String(W.getMilliseconds()).padStart(3,"0");return`${$}.${N}-${Q}-${Z}-${J}-${j}-${z}-${H}`},X$=async($)=>{try{if((await D.stat($)).size===0)return""}catch{return""}let N=`${H$($,new Date)}-${process.hrtime.bigint()}`;return await D.rename($,N),N},G$=async($)=>{let W=await z$($);try{try{await D.access($)}catch{return}let N=await D.readFile($),Q=await J$(N);await D.writeFile(`${$}.gz`,Q),await D.rm($,{force:!0})}catch(N){throw console.error(`[logixlysia] Failed to compress file ${$}:`,N),N}finally{W()}},b0=async($,W)=>{if(W.maxSize===void 0)return!1;let N=p(W.maxSize);return await I0($,N)},K$=async($,W)=>{let N=await Q0($);if(N.length<=W)return;let Z=(await Promise.allSettled(N.map(async(z)=>({path:z,stat:await D.stat(z)})))).filter((z)=>z.status==="fulfilled").map((z)=>z.value);if(Z.length<=W)return;Z.sort((z,H)=>H.stat.mtimeMs-z.stat.mtimeMs);let J=Z.slice(W);(await Promise.allSettled(J.map(({path:z})=>D.rm(z,{force:!0})))).forEach((z,H)=>{if(z.status==="rejected")console.error(`[logixlysia] Failed to delete rotated log ${J[H].path}:`,z.reason)})},Y$=async($,W)=>{let N=await Q0($);if(N.length===0)return;let Q=Date.now(),j=(await Promise.allSettled(N.map(async(H)=>({path:H,stat:await D.stat(H)})))).filter((H)=>H.status==="fulfilled").map((H)=>H.value).filter(({stat:H})=>Q-H.mtimeMs>W);(await Promise.allSettled(j.map(({path:H})=>D.rm(H,{force:!0})))).forEach((H,I)=>{if(H.status==="rejected")console.error(`[logixlysia] Failed to delete old log ${j[I].path}:`,H.reason)})},F0=async($,W)=>{let N=await X$($);if(!N)return;if(W.compress===!0){if((W.compression??"gzip")==="gzip")await G$(N)}if(W.maxFiles!==void 0){let Z=v(W.maxFiles);if(Z.type==="count")await K$($,Z.value);else await Y$($,Z.value)}};var o=new Map,M$=async($)=>{let W=o.get($)??Promise.resolve(),N,Q=new Promise((Z)=>{N=Z});return o.set($,Q),await W,()=>{if(N?.(),o.get($)===Q)o.delete($)}},l=async(...$)=>{let W=typeof $[0]==="string"?(()=>{let[V,b,U,F,w,k]=$;return{data:F,filePath:V,level:b,options:k,request:U,store:w}})():$[0],{filePath:N,level:Q,request:Z,data:J,store:j,options:z}=W,{config:H}=z,I=H?.useTransportsOnly===!0,M=H?.disableFileLogging===!0;if(I||M)return;let T=typeof J.message==="string"?J.message:"",X=j.beforeTime===BigInt(0)?0:Number(process.hrtime.bigint()-j.beforeTime)/1e6,G="/";try{let{pathname:V,search:b}=new URL(Z.url);G=H?.logQueryParams?`${V}${b}`:V}catch{G=Z.url}let K=`${Q} ${X.toFixed(2)}ms ${Z.method} ${G} ${T}
|
|
3
|
+
`,R=await M$(N);try{try{await _0(I$(N)),await B$(N,K,{encoding:"utf-8"})}catch(U){throw console.error(`[logixlysia] Failed to write to log file ${N}:`,U),U}let V=H?.logRotation;if(!V)return;if(await b0(N,V))try{await F0(N,V)}catch(U){console.error(`[logixlysia] Failed to rotate log file ${N}:`,U)}}finally{R()}};var V$=/[a-zA-Z0-9._%+-]{1,64}@[a-zA-Z0-9.-]{1,253}\.[a-zA-Z]{2,63}/g,O$=/\b(?:\d{1,3}\.){3}\d{1,3}\b/g,T$=/\b(?:\d[ -]*?){13,19}\b/g,R$=/eyJ[a-zA-Z0-9_-]+\.eyJ[a-zA-Z0-9_-]+\.[a-zA-Z0-9_-]+/g;var z0=($)=>A($).replaceAll("[REDACTED]","redacted"),U$=($)=>{try{let W=new URL($);if(W.username!=="")W.username=z0(W.username);if(W.password!=="")W.password=z0(W.password);return W.hostname=z0(W.hostname),W.pathname=A(W.pathname),W.search=A(W.search),W.hash=A(W.hash),W.toString()}catch{return A($).replaceAll("[REDACTED]","redacted")}},_$=($)=>{if($.length<13||$.length>19)return!1;let W=0,N=!1;for(let Q=$.length-1;Q>=0;Q-=1){let Z=$.charCodeAt(Q);if(Z<48||Z>57)return!1;let J=Z-48;if(N){if(J*=2,J>9)J-=9}W+=J,N=!N}return W%10===0},b$=($)=>$.replace(T$,(W)=>{let N=W.replace(/\D/g,"");if(N.length>=13&&N.length<=19&&_$(N))return"[REDACTED]";return W}),A=($)=>{let W=$;return W=W.replace(V$,"[REDACTED]"),W=W.replace(O$,"[REDACTED]"),W=b$(W),W=W.replace(R$,"[REDACTED]"),W},F$=($,W)=>{let N=A($.message),Q=Object.getPrototypeOf($),Z=Object.create(Q);if(Z.message=N,Z.name=$.name,$.stack!==void 0)Z.stack=A($.stack);let J=$;for(let j of Object.keys(J))if(j!=="message"&&j!=="name"&&j!=="stack")Z[j]=s(J[j],W);return Z},D$=($,W)=>{let N=Array.from({length:$.length});for(let Q=0;Q<$.length;Q+=1)N[Q]=s($[Q],W);return N},A$=($,W)=>{let N={};for(let Q of Object.keys($))N[Q]=s($[Q],W);return N},H0=($,W,N)=>{W.add($);try{return N()}finally{W.delete($)}},s=($,W)=>{if($===null||$===void 0)return $;if(typeof $==="string")return A($);if(typeof $!=="object")return $;if($ instanceof Date)return new Date($.getTime());let Q=$;if(W.has(Q))return"[Circular]";if($ instanceof Error)return H0(Q,W,()=>F$($,W));if(Array.isArray($))return H0(Q,W,()=>D$($,W));return H0(Q,W,()=>A$($,W))},a=($)=>s($,new WeakSet),r=($)=>{let W=U$($.url),N=new Headers,Q=!1;for(let[H,I]of $.headers.entries()){let M=A(I);if(M!==I)Q=!0;N.set(H,M)}let Z=A($.method),J=W!==$.url,j=Z!==$.method;if(!(J||Q||j))return $;let z={headers:N,method:Z,redirect:$.redirect,signal:$.signal};return new Request(W,z)};import{STATUS_CODES as w$}from"node:http";import Y from"chalk";var t=($)=>{if($ instanceof Error)return $.message;if($&&typeof $==="object"&&"message"in $)return $.message;return String($)},D0=($)=>typeof $==="object"&&$!==null&&(("why"in $)||("fix"in $)||("link"in $)||("internal"in $));var x=($)=>String($).padStart(2,"0"),E$=($)=>String($).padStart(3,"0"),L$=500,k$=1000,S$=7,f$="{now} {service}{icon} {method} {pathname} {status} {duration} {message}{speed}",y$=/\{(now|epoch|level|icon|duration|method|pathname|path|query|status|statusText|message|ip|context|service|speed|requestId)\}/g,A0=($)=>{let{config:W}=$,N=W?.useColors??!0,Q=typeof process<"u"&&process.stdout?.isTTY===!0;return N&&Q},C$=($,W)=>{if(!W)return $.toISOString();let N=String($.getFullYear()),Q=x($.getMonth()+1),Z=x($.getDate()),J=x($.getHours()),j=x($.getMinutes()),z=x($.getSeconds()),H=E$($.getMilliseconds());return W.replaceAll("yyyy",N).replaceAll("mm",Q).replaceAll("dd",Z).replaceAll("HH",J).replaceAll("MM",j).replaceAll("ss",z).replaceAll("SSS",H)},m$=($)=>{let W=$.headers.get("x-forwarded-for");if(W)return W.split(",")[0]?.trim()??"";return $.headers.get("x-real-ip")??""},x$=($)=>{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`},P$=($)=>{let{config:W}=$;return{slow:W?.slowThreshold??L$,verySlow:W?.verySlowThreshold??k$}},q$=($,W,N)=>{let Q=x$($),{slow:Z,verySlow:J}=P$(N),j=$>=J;if(!W)return{isVerySlow:j,text:Q};let z=Q;if($<Z)z=Y.green(Q);else if($<J)z=Y.yellow(Q);else z=Y.red.bold(Q);return{isVerySlow:j,text:z}},c$=($,W)=>{if(!$)return"";let N="⚡ slow";if(!W)return` ${N}`;return` ${Y.yellow(N)}`},h$=($,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 ")},p$=($,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($)},v$=($,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)},g$=($,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($)},n$=($,W)=>{if(!W)return $;return Y.gray($)},d$=($,W)=>{if(!W)return $;return Y.whiteBright($)},u$=($)=>{return w$[$]??""},i$=($,W)=>{let N=$.config?.service?.trim();if(!N)return"";let Q=`[${N}]`;if(!W)return`${Q} `;return`${Y.dim(Q)} `},w0=($)=>{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($)}},o$=($)=>$!==null&&typeof $==="object"&&!Array.isArray($)&&!($ instanceof Error)&&!($ instanceof Date),E0=($,W,N)=>{let Q=[];for(let[Z,J]of Object.entries($)){let j=W?`${W}.${Z}`:Z;if(o$(J)&&N>1)Q.push(...E0(J,j,N-1));else Q.push([j,w0(J)])}return Q},l$=($,W)=>{if($.length===0)return[];let N=[],Q=$.length-1;for(let Z=0;Z<$.length;Z+=1){let J=Z===Q?"└─":"├─",j=$[Z];if(!j)continue;let[z,H]=j,I=W?Y.cyan(z):z,M=W?Y.white(H):H;N.push(` ${J} ${I} ${M}`)}return N};var s$=($)=>{let W=[],N=t($);if(N)W.push(["error",N]);if(D0($)){if($.why!==void 0)W.push(["error.why",String($.why)]);if($.fix!==void 0)W.push(["error.fix",String($.fix)]);if($.link!==void 0)W.push(["error.link",String($.link)]);if($.internal!==void 0)W.push(["error.internal",w0($.internal)])}return W},a$=($,W,N)=>{if(N.config?.showContextTree===!1)return[];let Q=A0(N),Z=N.config?.contextDepth??1,J=[],j=W.context;if(j&&typeof j==="object"&&!Array.isArray(j)&&Object.keys(j).length>0&&Z>=1)J.push(...E0(j,"",Z));if($==="ERROR"&&"error"in W&&W.error!==void 0)J.push(...s$(W.error));return l$(J,Q)},r$=($)=>{if(typeof $==="object"&&$!==null)return JSON.stringify($);return""},e=({level:$,request:W,data:N,store:Q,options:Z})=>{let{config:J}=Z,j=A0(Z),z=J?.customLogFormat??f$,H=new Date,I=String(H.getTime()),M=C$(H,J?.timestamp?.translateTime),T=n$(M,j),X=typeof N.message==="string"?N.message:"",G=Q.beforeTime===BigInt(0)?0:Number(process.hrtime.bigint()-Q.beforeTime)/1e6,K,R;try{({pathname:K,search:R}=new URL(W.url))}catch{K=W.url||"/",R=""}let V=R,b=J?.logQueryParams?`${K}${V}`:K,U=N.status,F=U===null||U===void 0?200:d(U),w=String(F),k=J?.ip===!0?m$(W):"",P=J?.showContextTree!==!1&&N.context&&typeof N.context==="object"&&!Array.isArray(N.context)&&Object.keys(N.context).length>0?"":r$(N.context),S=p$($,j),B=W.method.toUpperCase().padEnd(S$),O=v$(B,j),_=d$(b,j),E=g$(w,j),{text:f,isVerySlow:y}=q$(G,j,Z),C=c$(y,j),q=h$($,j),c=u$(F),L=i$(Z,j),h={"{context}":P,"{duration}":f,"{epoch}":I,"{icon}":q,"{ip}":k,"{level}":S,"{message}":X,"{method}":O,"{now}":T,"{path}":_,"{pathname}":_,"{query}":V,"{requestId}":typeof N.context==="object"&&N.context!==null&&"requestId"in N.context?String(N.context.requestId):"","{service}":L,"{speed}":C,"{status}":E,"{statusText}":c},f0=z.replace(y$,(B0)=>h[B0]??B0);return{contextLines:a$($,N,Z),main:f0}};var t$=($)=>typeof $==="object"&&$!==null&&("status"in $)&&typeof $.status==="number",L0=($,W,N,Q,Z)=>{let{config:J}=Q,j=t$(W)?W.status:500,z="ERROR";if(j<500&&j>=400)z="WARNING";let H=J?.logFilter;if(H?.level&&H.level.length>0&&!H.level.includes(z))return;let I=J?.useTransportsOnly===!0,M=J?.disableInternalLogger===!0,T=J?.disableFileLogging===!0,X=t(W),G={error:W,message:X,status:j},K=Z?n(G,Z.getContext($)):G,R=J?.autoRedact===!0?a(K):K,V=J?.autoRedact===!0?r($):$;if(u({data:R,level:z,options:Q,request:V,store:N}),!(I||T)){let w=J?.logFilePath;if(w)l({data:R,filePath:w,level:z,options:Q,request:V,store:N}).catch(()=>{})}if(I||M)return;let{main:b,contextLines:U}=e({data:R,level:z,options:Q,request:V,store:N}),F=U.length>0?`${b}
|
|
4
|
+
${U.join(`
|
|
5
|
+
`)}`:b;console.error(F)};var S0=($={},W=k0,N)=>{let Q=N??g(),{config:Z}=$,J=Z?.pino,{prettyPrint:j,...z}=J??{},H=typeof j==="object"&&j!==null?j:void 0,M=(j===!0||H!==void 0)&&z.transport===void 0,T=H?.messageKey??z.messageKey,X=H?.errorKey??z.errorKey,G={...z,errorKey:X,level:z.level??"info",messageKey:T},K;if(M){let B=e$({colorize:process.stdout?.isTTY===!0,translateTime:Z?.timestamp?.translateTime,...H,errorKey:X,messageKey:T});K=W(G,B)}else K=W({...G,transport:z.transport});let R=(B,O)=>{if(!O?.level||O.level.length===0)return!0;return O.level.includes(B)},V=Z?.useTransportsOnly===!0,b=Z?.disableInternalLogger===!0,U=Z?.disableFileLogging===!0,F=(Z?.transports?.length??0)>0,w=!(V||U)&&!!Z?.logFilePath,k=!(V||b),$0=!(F||w||k),P=(B,O,_,E)=>{if($0||!R(B,Z?.logFilter))return;let f=n(_,Q.getContext(O)),y=Z?.autoRedact===!0?a(f):f,C=Z?.autoRedact===!0?r(O):O;if(F)u({data:y,level:B,options:$,request:C,store:E});if(w){let h=Z?.logFilePath;if(h)l({data:y,filePath:h,level:B,options:$,request:C,store:E}).catch(()=>{})}if(!k)return;let{main:q,contextLines:c}=e({data:y,level:B,options:$,request:C,store:E}),L=c.length>0?`${q}
|
|
6
|
+
${c.join(`
|
|
7
|
+
`)}`:q;switch(B){case"DEBUG":{console.debug(L);break}case"INFO":{console.info(L);break}case"WARNING":{console.warn(L);break}case"ERROR":{console.error(L);break}default:{console.log(L);break}}},S=(B,O,_,E)=>{if($0||!R(B,Z?.logFilter))return;let f={beforeTime:process.hrtime.bigint()};P(B,O,{context:E,message:_},f)};return{debug:(B,O,_)=>{S("DEBUG",B,O,_)},error:(B,O,_)=>{S("ERROR",B,O,_)},getContext:(B)=>Q.getContext(B),handleHttpError:(B,O,_)=>{L0(B,O,_,$,Q)},info:(B,O,_)=>{S("INFO",B,O,_)},log:P,mergeContext:(B,O)=>{Q.mergeContext(B,O)},pino:K,warn:(B,O,_)=>{S("WARNING",B,O,_)}}},X0=($,W)=>S0($,k0,W);var G0=($)=>{if($===void 0||$===!1)return null;if($===!0)return{enabled:!0,generator:()=>crypto.randomUUID(),header:"X-Request-Id"};if($.enabled===!1)return null;return{enabled:!0,generator:$.generator??(()=>crypto.randomUUID()),header:$.header?.trim()||"X-Request-Id"}},K0=($,W)=>{let N=$.headers.get(W.header);if(N)return N;return W.generator()};var $2=($)=>new Request(`http://logixlysia.local${$}`,{method:"WS"}),Y0=($,W,N)=>{let Q=new WeakMap,Z=(J,j,z,H,I)=>{let M=j,X={beforeTime:Q.get(M)??process.hrtime.bigint()},G=N.getContext(M),K=Object.keys(G).length>0||I?{...G,...I,wsId:j.id}:{wsId:j.id};W.log(J,$2(z),{context:K,message:H,status:200},X)};return(J,j)=>({...j,close(z){if(j.close?.(z),$.config?.disableWebSocketLogging!==!0)Z("INFO",z,J,"WebSocket closed");N.clearContext(z),Q.delete(z)},message(z,H){if(j.message?.(z,H),$.config?.disableWebSocketLogging!==!0)Z("INFO",z,J,"WebSocket message",{payloadType:typeof H})},open(z){if(Q.set(z,process.hrtime.bigint()),j.open?.(z),$.config?.disableWebSocketLogging!==!0)Z("INFO",z,J,"WebSocket opened")}})};var N2=($={})=>{let W=Z0($),N=new WeakSet,Q=new WeakMap,Z=g(),J=X0(W,Z),j=Y0(W,J,Z),z=G0(W.config?.requestId),H={...J,debug:(X,G,K)=>{N.add(X),J.debug(X,G,K)},error:(X,G,K)=>{N.add(X),J.error(X,G,K)},info:(X,G,K)=>{N.add(X),J.info(X,G,K)},warn:(X,G,K)=>{N.add(X),J.warn(X,G,K)}},I=(X)=>({debug:(G,K)=>H.debug(X,G,K),error:(G,K)=>H.error(X,G,K),info:(G,K)=>H.info(X,G,K),mergeContext:(G)=>Z.mergeContext(X,G),warn:(G,K)=>H.warn(X,G,K)}),T=new W2({detail:{description:"Logixlysia is a plugin for Elysia that provides a logger and pino logger.",tags:["logging","pino"]},name:"Logixlysia"}).state("logger",H).state("pino",H.pino).state("beforeTime",BigInt(0)).derive(({request:X})=>({log:I(X)})).onStart(({server:X})=>{if(X)J0(X,W);else{let G=Number(process.env.PORT)||3000,K=process.env.HOST||"localhost";J0({hostname:K,port:G,protocol:"http"},W)}}).onRequest(({request:X})=>{if(Q.set(X,process.hrtime.bigint()),z){let G=K0(X,z);Z.mergeContext(X,{requestId:G})}if(W.config?.useAsyncLocalStorage)j0.enterWith(I(X))}).onAfterHandle(({request:X,set:G})=>{try{if(z){let F=Z.getContext(X).requestId;if(F)G.headers[z.header]=F}if(N.has(X))return;let K=G.status===void 0||G.status===null?200:d(G.status),R="INFO";if(K>=500)R="ERROR";else if(K>=400)R="WARNING";let V=Z.getContext(X),b={status:K};if(Object.keys(V).length>0)b.context={...V};H.log(R,X,b,{beforeTime:Q.get(X)??BigInt(0)})}finally{Q.delete(X),Z.clearContext(X)}}).onError(({request:X,error:G,set:K})=>{try{if(z){let V=Z.getContext(X).requestId;if(V)K.headers[z.header]=V}H.handleHttpError(X,G,{beforeTime:Q.get(X)??BigInt(0)})}finally{Q.delete(X),Z.clearContext(X)}}).as("scoped");return Object.assign(T,{wrapWs:j})},OW=N2;export{n0 as useLogger,G0 as resolveRequestIdConfig,Z0 as resolveOptions,K0 as getOrCreateRequestId,OW as default,Y0 as createWsHandlerWrapper,X0 as createPluginLogger,S0 as createLogger};
|
|
8
8
|
|
|
9
|
-
//# debugId=
|
|
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==
|
|
9
|
+
//# debugId=7DF387E8E4621F0864756E2164756E21
|
|
10
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2luZGV4LnRzIiwgInNyYy91dGlscy9yb3RhdGlvbi50cyIsICJzcmMvY29uZmlnL3Jlc29sdmUtb3B0aW9ucy50cyIsICJzcmMvY29udGV4dC9yZXF1ZXN0LWNvbnRleHQudHMiLCAic3JjL2NvbnRleHQvc3RvcmFnZS50cyIsICJzcmMvZXh0ZW5zaW9ucy9iYW5uZXIudHMiLCAic3JjL2V4dGVuc2lvbnMvaW5kZXgudHMiLCAic3JjL2hlbHBlcnMvc3RhdHVzLnRzIiwgInNyYy9sb2dnZXIvaW5kZXgudHMiLCAic3JjL291dHB1dC9pbmRleC50cyIsICJzcmMvb3V0cHV0L2ZpbGUudHMiLCAic3JjL291dHB1dC9mcy50cyIsICJzcmMvb3V0cHV0L3JvdGF0aW9uLW1hbmFnZXIudHMiLCAic3JjL3V0aWxzL3JlZGFjdC50cyIsICJzcmMvbG9nZ2VyL2NyZWF0ZS1sb2dnZXIudHMiLCAic3JjL3V0aWxzL2Vycm9yLnRzIiwgInNyYy9sb2dnZXIvaGFuZGxlLWh0dHAtZXJyb3IudHMiLCAic3JjL21pZGRsZXdhcmUvcmVxdWVzdC1pZC50cyIsICJzcmMvd2Vic29ja2V0L3dyYXAtd3MudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiaW1wb3J0IHsgRWx5c2lhIH0gZnJvbSAnZWx5c2lhJ1xuaW1wb3J0IHsgcmVzb2x2ZU9wdGlvbnMgfSBmcm9tICcuL2NvbmZpZy9yZXNvbHZlLW9wdGlvbnMnXG5pbXBvcnQgeyBjcmVhdGVSZXF1ZXN0Q29udGV4dFN0b3JlIH0gZnJvbSAnLi9jb250ZXh0L3JlcXVlc3QtY29udGV4dCdcbmltcG9ydCB7IGxvZ2dlclN0b3JhZ2UgfSBmcm9tICcuL2NvbnRleHQvc3RvcmFnZSdcbmltcG9ydCB7IHN0YXJ0U2VydmVyIH0gZnJvbSAnLi9leHRlbnNpb25zJ1xuaW1wb3J0IHsgZ2V0U3RhdHVzQ29kZSB9IGZyb20gJy4vaGVscGVycy9zdGF0dXMnXG5pbXBvcnQgdHlwZSB7XG4gIExvZ2l4bHlzaWFTdG9yZSxcbiAgT3B0aW9ucyxcbiAgUmVxdWVzdFNjb3BlZExvZ2dlclxufSBmcm9tICcuL2ludGVyZmFjZXMnXG5pbXBvcnQgeyBjcmVhdGVQbHVnaW5Mb2dnZXIgfSBmcm9tICcuL2xvZ2dlcidcbmltcG9ydCB7XG4gIGdldE9yQ3JlYXRlUmVxdWVzdElkLFxuICByZXNvbHZlUmVxdWVzdElkQ29uZmlnXG59IGZyb20gJy4vbWlkZGxld2FyZS9yZXF1ZXN0LWlkJ1xuaW1wb3J0IHsgY3JlYXRlV3NIYW5kbGVyV3JhcHBlciB9IGZyb20gJy4vd2Vic29ja2V0L3dyYXAtd3MnXG5cbi8qKlxuICogRW1wdHkgc2luZ2xldG9uIHNsb3RzIG11c3Qgbm90IHVzZSBgUmVjb3JkPHN0cmluZywgbmV2ZXI+YDogaW50ZXJzZWN0aW5nIHRoYXQgd2l0aCBFbHlzaWEncyBgQ29udGV4dGBcbiAqIG1ha2VzIGV2ZXJ5IGtleSAoaW5jbHVkaW5nIGBzdG9yZWApIGJlY29tZSBgbmV2ZXJgIGJlY2F1c2UgZWFjaCBrZXkgaXMgbWVyZ2VkIHdpdGggYG5ldmVyYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbXB0eUVseXNpYVNsb3Qge1xuICByZWFkb25seSBfX2xvZ2l4bHlzaWFFbXB0eT86IG5ldmVyXG59XG5cbi8qKlxuICogRXhwbGljaXQgc2luZ2xldG9uIHdpdGhvdXQgRWx5c2lhJ3MgYFNpbmdsZXRvbkJhc2VgIGBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPmAgb24gZGVjb3JhdG9yL2Rlcml2ZS9yZXNvbHZlIHNvXG4gKiBtZXJnZWQgYENvbnRleHRgIGFuZCBXZWJTb2NrZXQgYHdzLmRhdGFgIGtlZXAgcHJlY2lzZSBrZXlzIGFmdGVyIGAudXNlKGxvZ2l4bHlzaWEoKSlgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvZ2l4bHlzaWFTaW5nbGV0b24ge1xuICBkZWNvcmF0b3I6IEVtcHR5RWx5c2lhU2xvdFxuICBkZXJpdmU6IHtcbiAgICBsb2c6IFJlcXVlc3RTY29wZWRMb2dnZXJcbiAgfVxuICByZXNvbHZlOiBFbXB0eUVseXNpYVNsb3RcbiAgc3RvcmU6IExvZ2l4bHlzaWFTdG9yZVxufVxuXG4vLyBFbHlzaWEncyBgU2luZ2xldG9uQmFzZS5zdG9yZWAgaXMgYFJlY29yZDxzdHJpbmcsIHVua25vd24+YDsgYExvZ2l4bHlzaWFTdG9yZWAgaXMgaW50ZW50aW9uYWxseSBjbG9zZWQgKHNlZSAjMjIwKS5cbi8vIEB0cy1leHBlY3QtZXJyb3Ig4oCUIGNsb3NlZCBzdG9yZSBpcyBjb3JyZWN0IGF0IHJ1bnRpbWUgYW5kIGZvciBtZXJnZWQgYHdzLmRhdGFgIGluZmVyZW5jZS5cbmV4cG9ydCB0eXBlIExvZ2l4bHlzaWEgPSBFbHlzaWE8JycsIExvZ2l4bHlzaWFTaW5nbGV0b24+XG5cbmV4cG9ydCB0eXBlIExvZ2l4bHlzaWFQbHVnaW4gPSBMb2dpeGx5c2lhICYge1xuICB3cmFwV3M6IFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZVdzSGFuZGxlcldyYXBwZXI+XG59XG5cbmNvbnN0IGxvZ2l4bHlzaWEgPSAocmF3T3B0aW9uczogT3B0aW9ucyA9IHt9KTogTG9naXhseXNpYVBsdWdpbiA9PiB7XG4gIGNvbnN0IG9wdGlvbnMgPSByZXNvbHZlT3B0aW9ucyhyYXdPcHRpb25zKVxuICBjb25zdCBkaWRDdXN0b21Mb2cgPSBuZXcgV2Vha1NldDxSZXF1ZXN0PigpXG4gIGNvbnN0IHJlcXVlc3RTdGFydFRpbWVzID0gbmV3IFdlYWtNYXA8UmVxdWVzdCwgYmlnaW50PigpXG4gIGNvbnN0IGNvbnRleHRTdG9yZSA9IGNyZWF0ZVJlcXVlc3RDb250ZXh0U3RvcmUoKVxuICBjb25zdCBiYXNlTG9nZ2VyID0gY3JlYXRlUGx1Z2luTG9nZ2VyKG9wdGlvbnMsIGNvbnRleHRTdG9yZSlcbiAgY29uc3Qgd3JhcFdzID0gY3JlYXRlV3NIYW5kbGVyV3JhcHBlcihvcHRpb25zLCBiYXNlTG9nZ2VyLCBjb250ZXh0U3RvcmUpXG4gIGNvbnN0IHJlcXVlc3RJZENvbmZpZyA9IHJlc29sdmVSZXF1ZXN0SWRDb25maWcob3B0aW9ucy5jb25maWc/LnJlcXVlc3RJZClcbiAgY29uc3QgbG9nZ2VyID0ge1xuICAgIC4uLmJhc2VMb2dnZXIsXG4gICAgZGVidWc6IChcbiAgICAgIHJlcXVlc3Q6IFJlcXVlc3QsXG4gICAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgICBjb250ZXh0PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICApID0+IHtcbiAgICAgIGRpZEN1c3RvbUxvZy5hZGQocmVxdWVzdClcbiAgICAgIGJhc2VMb2dnZXIuZGVidWcocmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dClcbiAgICB9LFxuICAgIGVycm9yOiAoXG4gICAgICByZXF1ZXN0OiBSZXF1ZXN0LFxuICAgICAgbWVzc2FnZTogc3RyaW5nLFxuICAgICAgY29udGV4dD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgKSA9PiB7XG4gICAgICBkaWRDdXN0b21Mb2cuYWRkKHJlcXVlc3QpXG4gICAgICBiYXNlTG9nZ2VyLmVycm9yKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpXG4gICAgfSxcbiAgICBpbmZvOiAoXG4gICAgICByZXF1ZXN0OiBSZXF1ZXN0LFxuICAgICAgbWVzc2FnZTogc3RyaW5nLFxuICAgICAgY29udGV4dD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgKSA9PiB7XG4gICAgICBkaWRDdXN0b21Mb2cuYWRkKHJlcXVlc3QpXG4gICAgICBiYXNlTG9nZ2VyLmluZm8ocmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dClcbiAgICB9LFxuICAgIHdhcm46IChcbiAgICAgIHJlcXVlc3Q6IFJlcXVlc3QsXG4gICAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgICBjb250ZXh0PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICApID0+IHtcbiAgICAgIGRpZEN1c3RvbUxvZy5hZGQocmVxdWVzdClcbiAgICAgIGJhc2VMb2dnZXIud2FybihyZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGNyZWF0ZVJlcXVlc3RTY29wZWRMb2dnZXIgPSAoXG4gICAgcmVxdWVzdDogUmVxdWVzdFxuICApOiBSZXF1ZXN0U2NvcGVkTG9nZ2VyID0+ICh7XG4gICAgZGVidWc6IChtZXNzYWdlLCBjb250ZXh0KSA9PiBsb2dnZXIuZGVidWcocmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dCksXG4gICAgZXJyb3I6IChtZXNzYWdlLCBjb250ZXh0KSA9PiBsb2dnZXIuZXJyb3IocmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dCksXG4gICAgaW5mbzogKG1lc3NhZ2UsIGNvbnRleHQpID0+IGxvZ2dlci5pbmZvKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpLFxuICAgIG1lcmdlQ29udGV4dDogcGFydGlhbCA9PiBjb250ZXh0U3RvcmUubWVyZ2VDb250ZXh0KHJlcXVlc3QsIHBhcnRpYWwpLFxuICAgIHdhcm46IChtZXNzYWdlLCBjb250ZXh0KSA9PiBsb2dnZXIud2FybihyZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KVxuICB9KVxuXG4gIGNvbnN0IGFwcCA9IG5ldyBFbHlzaWEoe1xuICAgIGRldGFpbDoge1xuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICdMb2dpeGx5c2lhIGlzIGEgcGx1Z2luIGZvciBFbHlzaWEgdGhhdCBwcm92aWRlcyBhIGxvZ2dlciBhbmQgcGlubyBsb2dnZXIuJyxcbiAgICAgIHRhZ3M6IFsnbG9nZ2luZycsICdwaW5vJ11cbiAgICB9LFxuICAgIG5hbWU6ICdMb2dpeGx5c2lhJ1xuICB9KVxuXG4gIC8vIEB0cy1leHBlY3QtZXJyb3Ig4oCUIGRlcml2ZWQgbG9nIHR5cGluZyBtYXRjaGVzIExvZ2l4bHlzaWFTaW5nbGV0b24uXG4gIGNvbnN0IHBsdWdpbiA9IGFwcFxuICAgIC5zdGF0ZSgnbG9nZ2VyJywgbG9nZ2VyKVxuICAgIC5zdGF0ZSgncGlubycsIGxvZ2dlci5waW5vKVxuICAgIC5zdGF0ZSgnYmVmb3JlVGltZScsIEJpZ0ludCgwKSlcbiAgICAuZGVyaXZlKCh7IHJlcXVlc3QgfSkgPT4gKHsgbG9nOiBjcmVhdGVSZXF1ZXN0U2NvcGVkTG9nZ2VyKHJlcXVlc3QpIH0pKVxuICAgIC5vblN0YXJ0KCh7IHNlcnZlciB9KTogdm9pZCA9PiB7XG4gICAgICBpZiAoc2VydmVyKSB7XG4gICAgICAgIHN0YXJ0U2VydmVyKHNlcnZlciwgb3B0aW9ucylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHBvcnQgPSBOdW1iZXIocHJvY2Vzcy5lbnYuUE9SVCkgfHwgMzAwMFxuICAgICAgICBjb25zdCBob3N0bmFtZSA9IHByb2Nlc3MuZW52LkhPU1QgfHwgJ2xvY2FsaG9zdCdcbiAgICAgICAgc3RhcnRTZXJ2ZXIoeyBob3N0bmFtZSwgcG9ydCwgcHJvdG9jb2w6ICdodHRwJyB9LCBvcHRpb25zKVxuICAgICAgfVxuICAgIH0pXG4gICAgLm9uUmVxdWVzdCgoeyByZXF1ZXN0IH0pID0+IHtcbiAgICAgIHJlcXVlc3RTdGFydFRpbWVzLnNldChyZXF1ZXN0LCBwcm9jZXNzLmhydGltZS5iaWdpbnQoKSlcbiAgICAgIGlmIChyZXF1ZXN0SWRDb25maWcpIHtcbiAgICAgICAgY29uc3QgcmVxdWVzdElkID0gZ2V0T3JDcmVhdGVSZXF1ZXN0SWQocmVxdWVzdCwgcmVxdWVzdElkQ29uZmlnKVxuICAgICAgICBjb250ZXh0U3RvcmUubWVyZ2VDb250ZXh0KHJlcXVlc3QsIHsgcmVxdWVzdElkIH0pXG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRpb25zLmNvbmZpZz8udXNlQXN5bmNMb2NhbFN0b3JhZ2UpIHtcbiAgICAgICAgbG9nZ2VyU3RvcmFnZS5lbnRlcldpdGgoY3JlYXRlUmVxdWVzdFNjb3BlZExvZ2dlcihyZXF1ZXN0KSlcbiAgICAgIH1cbiAgICB9KVxuICAgIC5vbkFmdGVySGFuZGxlKCh7IHJlcXVlc3QsIHNldCB9KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAocmVxdWVzdElkQ29uZmlnKSB7XG4gICAgICAgICAgY29uc3QgY3R4ID0gY29udGV4dFN0b3JlLmdldENvbnRleHQocmVxdWVzdClcbiAgICAgICAgICBjb25zdCBpZCA9IGN0eC5yZXF1ZXN0SWQgYXMgc3RyaW5nIHwgdW5kZWZpbmVkXG4gICAgICAgICAgaWYgKGlkKSB7XG4gICAgICAgICAgICBzZXQuaGVhZGVyc1tyZXF1ZXN0SWRDb25maWcuaGVhZGVyXSA9IGlkXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRpZEN1c3RvbUxvZy5oYXMocmVxdWVzdCkpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN0YXR1cyA9XG4gICAgICAgICAgc2V0LnN0YXR1cyA9PT0gdW5kZWZpbmVkIHx8IHNldC5zdGF0dXMgPT09IG51bGxcbiAgICAgICAgICAgID8gMjAwXG4gICAgICAgICAgICA6IGdldFN0YXR1c0NvZGUoc2V0LnN0YXR1cylcbiAgICAgICAgbGV0IGxldmVsOiAnSU5GTycgfCAnV0FSTklORycgfCAnRVJST1InID0gJ0lORk8nXG4gICAgICAgIGlmIChzdGF0dXMgPj0gNTAwKSB7XG4gICAgICAgICAgbGV2ZWwgPSAnRVJST1InXG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID49IDQwMCkge1xuICAgICAgICAgIGxldmVsID0gJ1dBUk5JTkcnXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhY2N1bXVsYXRlZCA9IGNvbnRleHRTdG9yZS5nZXRDb250ZXh0KHJlcXVlc3QpXG4gICAgICAgIGNvbnN0IGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0geyBzdGF0dXMgfVxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoYWNjdW11bGF0ZWQpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBkYXRhLmNvbnRleHQgPSB7IC4uLmFjY3VtdWxhdGVkIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxvZ2dlci5sb2cobGV2ZWwsIHJlcXVlc3QsIGRhdGEsIHtcbiAgICAgICAgICBiZWZvcmVUaW1lOiByZXF1ZXN0U3RhcnRUaW1lcy5nZXQocmVxdWVzdCkgPz8gQmlnSW50KDApXG4gICAgICAgIH0pXG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICByZXF1ZXN0U3RhcnRUaW1lcy5kZWxldGUocmVxdWVzdClcbiAgICAgICAgY29udGV4dFN0b3JlLmNsZWFyQ29udGV4dChyZXF1ZXN0KVxuICAgICAgfVxuICAgIH0pXG4gICAgLm9uRXJyb3IoKHsgcmVxdWVzdCwgZXJyb3IsIHNldCB9KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAocmVxdWVzdElkQ29uZmlnKSB7XG4gICAgICAgICAgY29uc3QgY3R4ID0gY29udGV4dFN0b3JlLmdldENvbnRleHQocmVxdWVzdClcbiAgICAgICAgICBjb25zdCBpZCA9IGN0eC5yZXF1ZXN0SWQgYXMgc3RyaW5nIHwgdW5kZWZpbmVkXG4gICAgICAgICAgaWYgKGlkKSB7XG4gICAgICAgICAgICBzZXQuaGVhZGVyc1tyZXF1ZXN0SWRDb25maWcuaGVhZGVyXSA9IGlkXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxvZ2dlci5oYW5kbGVIdHRwRXJyb3IocmVxdWVzdCwgZXJyb3IsIHtcbiAgICAgICAgICBiZWZvcmVUaW1lOiByZXF1ZXN0U3RhcnRUaW1lcy5nZXQocmVxdWVzdCkgPz8gQmlnSW50KDApXG4gICAgICAgIH0pXG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICByZXF1ZXN0U3RhcnRUaW1lcy5kZWxldGUocmVxdWVzdClcbiAgICAgICAgY29udGV4dFN0b3JlLmNsZWFyQ29udGV4dChyZXF1ZXN0KVxuICAgICAgfVxuICAgIH0pXG4gICAgLmFzKCdzY29wZWQnKSBhcyBMb2dpeGx5c2lhXG5cbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24ocGx1Z2luLCB7IHdyYXBXcyB9KSBhcyBMb2dpeGx5c2lhUGx1Z2luXG59XG5cbi8vIGJpb21lLWlnbm9yZSBsaW50L3BlcmZvcm1hbmNlL25vQmFycmVsRmlsZTogcHVibGljIHBhY2thZ2UgZW50cnkgcmUtZXhwb3J0c1xuZXhwb3J0IHsgcmVzb2x2ZU9wdGlvbnMgfSBmcm9tICcuL2NvbmZpZy9yZXNvbHZlLW9wdGlvbnMnXG5leHBvcnQgeyB1c2VMb2dnZXIgfSBmcm9tICcuL2NvbnRleHQvc3RvcmFnZSdcbmV4cG9ydCB0eXBlIHtcbiAgTG9nZ2VyLFxuICBMb2dpeGx5c2lhQ29udGV4dCxcbiAgTG9naXhseXNpYVN0b3JlLFxuICBMb2dMZXZlbCxcbiAgTG9nUHJlc2V0LFxuICBPcHRpb25zLFxuICBQaW5vLFxuICBSZXF1ZXN0SWRDb25maWcsXG4gIFJlcXVlc3RTY29wZWRMb2dnZXIsXG4gIFN0b3JlRGF0YSxcbiAgVHJhbnNwb3J0XG59IGZyb20gJy4vaW50ZXJmYWNlcydcbmV4cG9ydCB7IGNyZWF0ZUxvZ2dlciwgY3JlYXRlUGx1Z2luTG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXInXG5leHBvcnQgdHlwZSB7IFJlc29sdmVkUmVxdWVzdElkQ29uZmlnIH0gZnJvbSAnLi9taWRkbGV3YXJlL3JlcXVlc3QtaWQnXG5leHBvcnQge1xuICBnZXRPckNyZWF0ZVJlcXVlc3RJZCxcbiAgcmVzb2x2ZVJlcXVlc3RJZENvbmZpZ1xufSBmcm9tICcuL21pZGRsZXdhcmUvcmVxdWVzdC1pZCdcbmV4cG9ydCB0eXBlIHsgV3NIYW5kbGVySG9va3MgfSBmcm9tICcuL3dlYnNvY2tldC93cmFwLXdzJ1xuZXhwb3J0IHsgY3JlYXRlV3NIYW5kbGVyV3JhcHBlciB9IGZyb20gJy4vd2Vic29ja2V0L3dyYXAtd3MnXG5cbmV4cG9ydCBkZWZhdWx0IGxvZ2l4bHlzaWFcbiIsCiAgICAiaW1wb3J0IHsgcHJvbWlzZXMgYXMgZnMgfSBmcm9tICdub2RlOmZzJ1xuaW1wb3J0IHsgYmFzZW5hbWUsIGRpcm5hbWUgfSBmcm9tICdub2RlOnBhdGgnXG5cbmNvbnN0IFNJWkVfUkVHRVggPSAvXihcXGQrKD86XFwuXFxkKyk/KShrfGtifG18bWJ8Z3xnYikkL2lcbmNvbnN0IElOVEVSVkFMX1JFR0VYID0gL14oXFxkKykoaHxkfHcpJC9pXG5jb25zdCBST1RBVEVEX1JFR0VYID1cbiAgL1xcLihcXGR7NH0tXFxkezJ9LVxcZHsyfS1cXGR7Mn0tXFxkezJ9LVxcZHsyfSg/Oi1cXGR7M30pPyg/Oi1cXGQrKT8pKD86XFwuZ3opPyQvXG5cbmV4cG9ydCBjb25zdCBwYXJzZVNpemUgPSAodmFsdWU6IG51bWJlciB8IHN0cmluZyk6IG51bWJlciA9PiB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUodmFsdWUpIHx8IHZhbHVlIDw9IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzaXplOiAke3ZhbHVlfWApXG4gICAgfVxuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgY29uc3QgdHJpbW1lZCA9IHZhbHVlLnRyaW0oKVxuICBpZiAodHJpbW1lZCAhPT0gJycpIHtcbiAgICBjb25zdCBhc051bWJlciA9IE51bWJlcih0cmltbWVkKVxuICAgIGlmIChOdW1iZXIuaXNGaW5pdGUoYXNOdW1iZXIpKSB7XG4gICAgICBpZiAoYXNOdW1iZXIgPD0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc2l6ZTogJHt2YWx1ZX1gKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGFzTnVtYmVyXG4gICAgfVxuICB9XG5cbiAgY29uc3QgbWF0Y2ggPSB0cmltbWVkLm1hdGNoKFNJWkVfUkVHRVgpXG4gIGlmICghbWF0Y2gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc2l6ZSBmb3JtYXQ6ICR7dmFsdWV9YClcbiAgfVxuXG4gIGNvbnN0IGFtb3VudCA9IE51bWJlcihtYXRjaFsxXSlcbiAgY29uc3QgdW5pdCA9IG1hdGNoWzJdLnRvTG93ZXJDYXNlKClcblxuICBsZXQgYmFzZSA9IDEwMjRcbiAgaWYgKHVuaXQuc3RhcnRzV2l0aCgnbScpKSB7XG4gICAgYmFzZSA9IDEwMjQgKiAxMDI0XG4gIH0gZWxzZSBpZiAodW5pdC5zdGFydHNXaXRoKCdnJykpIHtcbiAgICBiYXNlID0gMTAyNCAqIDEwMjQgKiAxMDI0XG4gIH1cblxuICByZXR1cm4gTWF0aC5mbG9vcihhbW91bnQgKiBiYXNlKVxufVxuXG5leHBvcnQgY29uc3QgcGFyc2VJbnRlcnZhbCA9ICh2YWx1ZTogc3RyaW5nKTogbnVtYmVyID0+IHtcbiAgY29uc3QgbWF0Y2ggPSB2YWx1ZS50cmltKCkubWF0Y2goSU5URVJWQUxfUkVHRVgpXG4gIGlmICghbWF0Y2gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgaW50ZXJ2YWwgZm9ybWF0OiAke3ZhbHVlfWApXG4gIH1cblxuICBjb25zdCBhbW91bnQgPSBOdW1iZXIobWF0Y2hbMV0pXG4gIGNvbnN0IHVuaXQgPSBtYXRjaFsyXS50b0xvd2VyQ2FzZSgpXG5cbiAgbGV0IG1zID0gNjAgKiA2MCAqIDEwMDBcbiAgaWYgKHVuaXQgPT09ICdkJykge1xuICAgIG1zID0gMjQgKiA2MCAqIDYwICogMTAwMFxuICB9IGVsc2UgaWYgKHVuaXQgPT09ICd3Jykge1xuICAgIG1zID0gNyAqIDI0ICogNjAgKiA2MCAqIDEwMDBcbiAgfVxuXG4gIHJldHVybiBhbW91bnQgKiBtc1xufVxuXG5leHBvcnQgY29uc3QgcGFyc2VSZXRlbnRpb24gPSAoXG4gIHZhbHVlOiBudW1iZXIgfCBzdHJpbmdcbik6IHsgdHlwZTogJ2NvdW50JyB8ICd0aW1lJzsgdmFsdWU6IG51bWJlciB9ID0+IHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4geyB0eXBlOiAnY291bnQnLCB2YWx1ZSB9XG4gIH1cbiAgcmV0dXJuIHsgdHlwZTogJ3RpbWUnLCB2YWx1ZTogcGFyc2VJbnRlcnZhbCh2YWx1ZSkgfVxufVxuXG5leHBvcnQgY29uc3Qgc2hvdWxkUm90YXRlQnlTaXplID0gYXN5bmMgKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBtYXhTaXplQnl0ZXM6IG51bWJlclxuKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdCA9IGF3YWl0IGZzLnN0YXQoZmlsZVBhdGgpXG4gICAgcmV0dXJuIHN0YXQuc2l6ZSA+IG1heFNpemVCeXRlc1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZ2V0Um90YXRlZEZpbGVzID0gYXN5bmMgKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdPiA9PiB7XG4gIGNvbnN0IGRpciA9IGRpcm5hbWUoZmlsZVBhdGgpXG4gIGNvbnN0IGJhc2UgPSBiYXNlbmFtZShmaWxlUGF0aClcblxuICBsZXQgZW50cmllczogc3RyaW5nW11cbiAgdHJ5IHtcbiAgICBlbnRyaWVzID0gYXdhaXQgZnMucmVhZGRpcihkaXIpXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBbXVxuICB9XG5cbiAgcmV0dXJuIGVudHJpZXNcbiAgICAuZmlsdGVyKG5hbWUgPT4gbmFtZS5zdGFydHNXaXRoKGAke2Jhc2V9LmApICYmIFJPVEFURURfUkVHRVgudGVzdChuYW1lKSlcbiAgICAubWFwKG5hbWUgPT4gYCR7ZGlyfS8ke25hbWV9YClcbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBPcHRpb25zIH0gZnJvbSAnLi4vaW50ZXJmYWNlcydcbmltcG9ydCB7IHBhcnNlSW50ZXJ2YWwsIHBhcnNlUmV0ZW50aW9uLCBwYXJzZVNpemUgfSBmcm9tICcuLi91dGlscy9yb3RhdGlvbidcblxuZXhwb3J0IHR5cGUgTG9nUHJlc2V0ID0gJ2RldicgfCAncHJvZCcgfCAnanNvbidcblxuY29uc3QgVkFMSURfUFJFU0VUUzogcmVhZG9ubHkgTG9nUHJlc2V0W10gPSBbJ2RldicsICdwcm9kJywgJ2pzb24nXVxuXG5jb25zdCB2YWxpZGF0ZUxvZ1JvdGF0aW9uID0gKGNvbmZpZzogT3B0aW9uc1snY29uZmlnJ10pOiB2b2lkID0+IHtcbiAgY29uc3QgbG9nUm90YXRpb24gPSBjb25maWc/LmxvZ1JvdGF0aW9uXG4gIGlmICghbG9nUm90YXRpb24pIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIHRyeSB7XG4gICAgaWYgKGxvZ1JvdGF0aW9uLm1heFNpemUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcGFyc2VTaXplKGxvZ1JvdGF0aW9uLm1heFNpemUpXG4gICAgfVxuICAgIGlmIChsb2dSb3RhdGlvbi5tYXhGaWxlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBwYXJzZVJldGVudGlvbihsb2dSb3RhdGlvbi5tYXhGaWxlcylcbiAgICB9XG4gICAgaWYgKGxvZ1JvdGF0aW9uLmludGVydmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHBhcnNlSW50ZXJ2YWwobG9nUm90YXRpb24uaW50ZXJ2YWwpXG4gICAgfVxuICAgIGlmIChcbiAgICAgIGxvZ1JvdGF0aW9uLmNvbXByZXNzaW9uICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIGxvZ1JvdGF0aW9uLmNvbXByZXNzaW9uICE9PSAnZ3ppcCdcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEludmFsaWQgY29tcHJlc3Npb24gYWxnb3JpdGhtOiAke2xvZ1JvdGF0aW9uLmNvbXByZXNzaW9ufWBcbiAgICAgIClcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKVxuICAgIHRocm93IG5ldyBFcnJvcihgbG9naXhseXNpYTogaW52YWxpZCBsb2dSb3RhdGlvbiBjb25maWcg4oCUICR7bWVzc2FnZX1gLCB7XG4gICAgICBjYXVzZTogZXJyb3JcbiAgICB9KVxuICB9XG59XG5cbmNvbnN0IFBSRVNFVF9ERUZBVUxUUzogUmVjb3JkPExvZ1ByZXNldCwgTm9uTnVsbGFibGU8T3B0aW9uc1snY29uZmlnJ10+PiA9IHtcbiAgZGV2OiB7XG4gICAgcGlubzoge1xuICAgICAgcHJldHR5UHJpbnQ6IHRydWVcbiAgICB9LFxuICAgIHNob3dDb250ZXh0VHJlZTogdHJ1ZSxcbiAgICBzaG93U3RhcnR1cE1lc3NhZ2U6IHRydWUsXG4gICAgc3RhcnR1cE1lc3NhZ2VGb3JtYXQ6ICdiYW5uZXInLFxuICAgIHVzZUNvbG9yczogdHJ1ZVxuICB9LFxuICBqc29uOiB7XG4gICAgcGlubzoge1xuICAgICAgcHJldHR5UHJpbnQ6IGZhbHNlXG4gICAgfSxcbiAgICBzaG93Q29udGV4dFRyZWU6IGZhbHNlLFxuICAgIHNob3dTdGFydHVwTWVzc2FnZTogZmFsc2UsXG4gICAgdXNlQ29sb3JzOiBmYWxzZVxuICB9LFxuICBwcm9kOiB7XG4gICAgYXV0b1JlZGFjdDogdHJ1ZSxcbiAgICBwaW5vOiB7XG4gICAgICBwcmV0dHlQcmludDogZmFsc2VcbiAgICB9LFxuICAgIHJlcXVlc3RJZDogdHJ1ZSxcbiAgICBzaG93Q29udGV4dFRyZWU6IGZhbHNlLFxuICAgIHNob3dTdGFydHVwTWVzc2FnZTogZmFsc2UsXG4gICAgdXNlQ29sb3JzOiBmYWxzZVxuICB9XG59XG5cbmNvbnN0IG1lcmdlQ29uZmlnID0gKFxuICBiYXNlOiBOb25OdWxsYWJsZTxPcHRpb25zWydjb25maWcnXT4sXG4gIG92ZXJyaWRlPzogT3B0aW9uc1snY29uZmlnJ11cbik6IE5vbk51bGxhYmxlPE9wdGlvbnNbJ2NvbmZpZyddPiA9PiB7XG4gIGlmICghb3ZlcnJpZGUpIHtcbiAgICByZXR1cm4gYmFzZVxuICB9XG5cbiAgY29uc3QgbWVyZ2VkOiBOb25OdWxsYWJsZTxPcHRpb25zWydjb25maWcnXT4gPSB7IC4uLmJhc2UsIC4uLm92ZXJyaWRlIH1cblxuICBpZiAoYmFzZS5waW5vIHx8IG92ZXJyaWRlLnBpbm8pIHtcbiAgICBtZXJnZWQucGlubyA9IHtcbiAgICAgIC4uLmJhc2UucGlubyxcbiAgICAgIC4uLm92ZXJyaWRlLnBpbm8sXG4gICAgICAuLi4oYmFzZS5waW5vPy5wcmV0dHlQcmludCAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICBvdmVycmlkZS5waW5vPy5wcmV0dHlQcmludCAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8ge1xuICAgICAgICAgICAgcHJldHR5UHJpbnQ6IG92ZXJyaWRlLnBpbm8/LnByZXR0eVByaW50ID8/IGJhc2UucGlubz8ucHJldHR5UHJpbnRcbiAgICAgICAgICB9XG4gICAgICAgIDoge30pXG4gICAgfVxuICB9XG5cbiAgaWYgKGJhc2UubG9nRmlsdGVyIHx8IG92ZXJyaWRlLmxvZ0ZpbHRlcikge1xuICAgIG1lcmdlZC5sb2dGaWx0ZXIgPSB7XG4gICAgICAuLi5iYXNlLmxvZ0ZpbHRlcixcbiAgICAgIC4uLm92ZXJyaWRlLmxvZ0ZpbHRlclxuICAgIH1cbiAgfVxuXG4gIGlmIChiYXNlLmxvZ1JvdGF0aW9uIHx8IG92ZXJyaWRlLmxvZ1JvdGF0aW9uKSB7XG4gICAgbWVyZ2VkLmxvZ1JvdGF0aW9uID0ge1xuICAgICAgLi4uYmFzZS5sb2dSb3RhdGlvbixcbiAgICAgIC4uLm92ZXJyaWRlLmxvZ1JvdGF0aW9uXG4gICAgfVxuICB9XG5cbiAgaWYgKGJhc2UudGltZXN0YW1wIHx8IG92ZXJyaWRlLnRpbWVzdGFtcCkge1xuICAgIG1lcmdlZC50aW1lc3RhbXAgPSB7XG4gICAgICAuLi5iYXNlLnRpbWVzdGFtcCxcbiAgICAgIC4uLm92ZXJyaWRlLnRpbWVzdGFtcFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtZXJnZWRcbn1cblxuLyoqIEFwcGxpZXMgcHJlc2V0IGRlZmF1bHRzOyBleHBsaWNpdCBgY29uZmlnYCBrZXlzIG92ZXJyaWRlIHByZXNldCB2YWx1ZXMuICovXG5leHBvcnQgY29uc3QgcmVzb2x2ZU9wdGlvbnMgPSAob3B0aW9uczogT3B0aW9ucyA9IHt9KTogT3B0aW9ucyA9PiB7XG4gIGNvbnN0IHsgcHJlc2V0IH0gPSBvcHRpb25zXG4gIGlmIChwcmVzZXQgJiYgIVZBTElEX1BSRVNFVFMuaW5jbHVkZXMocHJlc2V0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgbG9naXhseXNpYTogaW52YWxpZCBwcmVzZXQg4oCUICR7cHJlc2V0fWApXG4gIH1cblxuICBjb25zdCByZXNvbHZlZCA9IHByZXNldFxuICAgID8ge1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBjb25maWc6IG1lcmdlQ29uZmlnKFBSRVNFVF9ERUZBVUxUU1twcmVzZXRdLCBvcHRpb25zLmNvbmZpZylcbiAgICAgIH1cbiAgICA6IG9wdGlvbnNcblxuICB2YWxpZGF0ZUxvZ1JvdGF0aW9uKHJlc29sdmVkLmNvbmZpZylcbiAgcmV0dXJuIHJlc29sdmVkXG59XG4iLAogICAgIi8qKiBIVFRQIGBSZXF1ZXN0YCBvciBXZWJTb2NrZXQgaW5zdGFuY2UgZm9yIGFjY3VtdWxhdGVkIGNvbnRleHQuICovXG5leHBvcnQgdHlwZSBDb250ZXh0S2V5ID0gUmVxdWVzdCB8IG9iamVjdFxuXG5leHBvcnQgaW50ZXJmYWNlIFJlcXVlc3RDb250ZXh0U3RvcmUge1xuICBjbGVhckNvbnRleHQ6IChrZXk6IENvbnRleHRLZXkpID0+IHZvaWRcbiAgZ2V0Q29udGV4dDogKGtleTogQ29udGV4dEtleSkgPT4gUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+XG4gIG1lcmdlQ29udGV4dDogKGtleTogQ29udGV4dEtleSwgcGFydGlhbDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHZvaWRcbn1cblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVJlcXVlc3RDb250ZXh0U3RvcmUgPSAoKTogUmVxdWVzdENvbnRleHRTdG9yZSA9PiB7XG4gIGNvbnN0IGJhZ3MgPSBuZXcgV2Vha01hcDxDb250ZXh0S2V5LCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oKVxuXG4gIGNvbnN0IGdldE9yQ3JlYXRlID0gKGtleTogQ29udGV4dEtleSk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+IHtcbiAgICBsZXQgYmFnID0gYmFncy5nZXQoa2V5KVxuICAgIGlmICghYmFnKSB7XG4gICAgICBiYWcgPSB7fVxuICAgICAgYmFncy5zZXQoa2V5LCBiYWcpXG4gICAgfVxuICAgIHJldHVybiBiYWdcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgY2xlYXJDb250ZXh0KGtleSkge1xuICAgICAgYmFncy5kZWxldGUoa2V5KVxuICAgIH0sXG4gICAgZ2V0Q29udGV4dChrZXkpIHtcbiAgICAgIGNvbnN0IGJhZyA9IGJhZ3MuZ2V0KGtleSlcbiAgICAgIHJldHVybiBiYWcgPyB7IC4uLmJhZyB9IDoge31cbiAgICB9LFxuICAgIG1lcmdlQ29udGV4dChrZXksIHBhcnRpYWwpIHtcbiAgICAgIGlmIChPYmplY3Qua2V5cyhwYXJ0aWFsKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBjb25zdCBiYWcgPSBnZXRPckNyZWF0ZShrZXkpXG4gICAgICBPYmplY3QuYXNzaWduKGJhZywgcGFydGlhbClcbiAgICB9XG4gIH1cbn1cblxuLyoqIEFjY3VtdWxhdGVkIHJlcXVlc3QgY29udGV4dCBmaXJzdDsgZXhwbGljaXQgYGRhdGEuY29udGV4dGAgd2lucyBvbiBrZXkgY29sbGlzaW9uLiAqL1xuZXhwb3J0IGNvbnN0IG1lcmdlTG9nRGF0YUNvbnRleHQgPSAoXG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBhY2N1bXVsYXRlZDogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+XG4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PiB7XG4gIGNvbnN0IGV4cGxpY2l0ID0gZGF0YS5jb250ZXh0XG4gIGNvbnN0IGhhc0FjY3VtdWxhdGVkID0gT2JqZWN0LmtleXMoYWNjdW11bGF0ZWQpLmxlbmd0aCA+IDBcbiAgY29uc3QgaGFzRXhwbGljaXQgPVxuICAgIGV4cGxpY2l0ICE9PSB1bmRlZmluZWQgJiZcbiAgICBleHBsaWNpdCAhPT0gbnVsbCAmJlxuICAgIHR5cGVvZiBleHBsaWNpdCA9PT0gJ29iamVjdCcgJiZcbiAgICAhQXJyYXkuaXNBcnJheShleHBsaWNpdCkgJiZcbiAgICBPYmplY3Qua2V5cyhleHBsaWNpdCBhcyBvYmplY3QpLmxlbmd0aCA+IDBcblxuICBpZiAoIShoYXNBY2N1bXVsYXRlZCB8fCBoYXNFeHBsaWNpdCkpIHtcbiAgICByZXR1cm4gZGF0YVxuICB9XG5cbiAgY29uc3QgbWVyZ2VkQ29udGV4dCA9IHtcbiAgICAuLi5hY2N1bXVsYXRlZCxcbiAgICAuLi4oaGFzRXhwbGljaXQgPyAoZXhwbGljaXQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIDoge30pXG4gIH1cblxuICByZXR1cm4geyAuLi5kYXRhLCBjb250ZXh0OiBtZXJnZWRDb250ZXh0IH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgQXN5bmNMb2NhbFN0b3JhZ2UgfSBmcm9tICdub2RlOmFzeW5jX2hvb2tzJ1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0U2NvcGVkTG9nZ2VyIH0gZnJvbSAnLi4vaW50ZXJmYWNlcydcblxuZXhwb3J0IGNvbnN0IGxvZ2dlclN0b3JhZ2U6IEFzeW5jTG9jYWxTdG9yYWdlPFJlcXVlc3RTY29wZWRMb2dnZXI+ID1cbiAgbmV3IEFzeW5jTG9jYWxTdG9yYWdlPFJlcXVlc3RTY29wZWRMb2dnZXI+KClcblxuY29uc3QgTk9PUF9MT0dHRVI6IFJlcXVlc3RTY29wZWRMb2dnZXIgPSB7XG4gIGRlYnVnOiAoKSA9PiB1bmRlZmluZWQsXG4gIGVycm9yOiAoKSA9PiB1bmRlZmluZWQsXG4gIGluZm86ICgpID0+IHVuZGVmaW5lZCxcbiAgbWVyZ2VDb250ZXh0OiAoKSA9PiB1bmRlZmluZWQsXG4gIHdhcm46ICgpID0+IHVuZGVmaW5lZFxufVxuXG5leHBvcnQgY29uc3QgdXNlTG9nZ2VyID0gKCk6IFJlcXVlc3RTY29wZWRMb2dnZXIgPT5cbiAgbG9nZ2VyU3RvcmFnZS5nZXRTdG9yZSgpID8/IE5PT1BfTE9HR0VSXG4iLAogICAgImltcG9ydCB7IGNyZWF0ZVJlcXVpcmUgfSBmcm9tICdub2RlOm1vZHVsZSdcblxuY29uc3QgZWx5c2lhUGtnOiB7IHZlcnNpb24/OiBzdHJpbmcgfSA9ICgoKSA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVxdWlyZSA9IGNyZWF0ZVJlcXVpcmUoaW1wb3J0Lm1ldGEudXJsKVxuICAgIHJldHVybiByZXF1aXJlKCdlbHlzaWEvcGFja2FnZS5qc29uJykgYXMgeyB2ZXJzaW9uPzogc3RyaW5nIH1cbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHt9XG4gIH1cbn0pKClcblxuY29uc3QgbG9naXhseXNpYVBrZzogeyB2ZXJzaW9uPzogc3RyaW5nIH0gPSAoKCkgPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IHJlcXVpcmUgPSBjcmVhdGVSZXF1aXJlKGltcG9ydC5tZXRhLnVybClcbiAgICByZXR1cm4gcmVxdWlyZSgnLi4vLi4vcGFja2FnZS5qc29uJykgYXMgeyB2ZXJzaW9uPzogc3RyaW5nIH1cbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHt9XG4gIH1cbn0pKClcblxuY29uc3QgY2VudGVyVGV4dCA9ICh0ZXh0OiBzdHJpbmcsIHdpZHRoOiBudW1iZXIpOiBzdHJpbmcgPT4ge1xuICBpZiAodGV4dC5sZW5ndGggPj0gd2lkdGgpIHtcbiAgICByZXR1cm4gdGV4dC5zbGljZSgwLCB3aWR0aClcbiAgfVxuXG4gIGNvbnN0IGxlZnQgPSBNYXRoLmZsb29yKCh3aWR0aCAtIHRleHQubGVuZ3RoKSAvIDIpXG4gIGNvbnN0IHJpZ2h0ID0gd2lkdGggLSB0ZXh0Lmxlbmd0aCAtIGxlZnRcbiAgcmV0dXJuIGAkeycgJy5yZXBlYXQobGVmdCl9JHt0ZXh0fSR7JyAnLnJlcGVhdChyaWdodCl9YFxufVxuXG50eXBlIFJvd1NwZWMgPVxuICB8IHsga2luZDogJ2VtcHR5JyB9XG4gIHwgeyBraW5kOiAnY2VudGVyJzsgdGV4dDogc3RyaW5nIH1cbiAgfCB7IGtpbmQ6ICdsZWZ0JzsgdGV4dDogc3RyaW5nIH1cblxuLyoqXG4gKiBCb3ggYmFubmVyOiBFbHlzaWEgdmVyc2lvbiAoY2VudGVyZWQpLCBVUkwgbGluZSwgb3B0aW9uYWwgbG9naXhseXNpYSB2ZXJzaW9uIGxpbmUuXG4gKi9cbmV4cG9ydCBjb25zdCByZW5kZXJCYW5uZXIgPSAoXG4gIHVybERpc3BsYXlMaW5lOiBzdHJpbmcsXG4gIGxvZ2l4bHlzaWFMaW5lOiBzdHJpbmcgfCBudWxsXG4pOiBzdHJpbmcgPT4ge1xuICBjb25zdCB7IHZlcnNpb24gfSA9IGVseXNpYVBrZ1xuICBjb25zdCB2ZXJzaW9uTGluZSA9IHZlcnNpb24gPyBgRWx5c2lhIHYke3ZlcnNpb259YCA6ICdFbHlzaWEnXG5cbiAgY29uc3Qgcm93czogUm93U3BlY1tdID0gW1xuICAgIHsga2luZDogJ2VtcHR5JyB9LFxuICAgIHsga2luZDogJ2NlbnRlcicsIHRleHQ6IHZlcnNpb25MaW5lIH0sXG4gICAgeyBraW5kOiAnZW1wdHknIH0sXG4gICAgeyBraW5kOiAnbGVmdCcsIHRleHQ6IHVybERpc3BsYXlMaW5lIH1cbiAgXVxuICBpZiAobG9naXhseXNpYUxpbmUpIHtcbiAgICByb3dzLnB1c2goeyBraW5kOiAnbGVmdCcsIHRleHQ6IGxvZ2l4bHlzaWFMaW5lIH0pXG4gIH1cbiAgcm93cy5wdXNoKHsga2luZDogJ2VtcHR5JyB9KVxuXG4gIGNvbnN0IGNvbnRlbnRXaWR0aCA9IE1hdGgubWF4KFxuICAgIHZlcnNpb25MaW5lLmxlbmd0aCxcbiAgICB1cmxEaXNwbGF5TGluZS5sZW5ndGgsXG4gICAgLi4uKGxvZ2l4bHlzaWFMaW5lID8gW2xvZ2l4bHlzaWFMaW5lLmxlbmd0aF0gOiBbMF0pXG4gIClcbiAgY29uc3QgaW5uZXJXaWR0aCA9IGNvbnRlbnRXaWR0aCArIDRcblxuICBjb25zdCB0b3AgPSBg4pSMJHsn4pSAJy5yZXBlYXQoaW5uZXJXaWR0aCl94pSQYFxuICBjb25zdCBib3QgPSBg4pSUJHsn4pSAJy5yZXBlYXQoaW5uZXJXaWR0aCl94pSYYFxuICBjb25zdCBlbXB0eVJvdyA9IGDilIIkeycgJy5yZXBlYXQoaW5uZXJXaWR0aCl94pSCYFxuXG4gIGNvbnN0IG91dDogc3RyaW5nW10gPSBbdG9wXVxuICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgaWYgKHJvdy5raW5kID09PSAnZW1wdHknKSB7XG4gICAgICBvdXQucHVzaChlbXB0eVJvdylcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGlmIChyb3cua2luZCA9PT0gJ2NlbnRlcicpIHtcbiAgICAgIG91dC5wdXNoKGDilIIke2NlbnRlclRleHQocm93LnRleHQsIGlubmVyV2lkdGgpfeKUgmApXG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBjb25zdCB7IHRleHQgfSA9IHJvd1xuICAgIGNvbnN0IHBhZGRpbmcgPSBNYXRoLm1heCgwLCBpbm5lcldpZHRoIC0gdGV4dC5sZW5ndGggLSA0KVxuICAgIG91dC5wdXNoKGDilIIgICR7dGV4dH0keycgJy5yZXBlYXQocGFkZGluZyl9ICDilIJgKVxuICB9XG4gIG91dC5wdXNoKGJvdClcbiAgcmV0dXJuIG91dC5qb2luKCdcXG4nKVxufVxuXG5leHBvcnQgY29uc3QgZ2V0TG9naXhseXNpYVZlcnNpb25MaW5lID0gKCk6IHN0cmluZyB8IG51bGwgPT4ge1xuICBjb25zdCB2ID0gbG9naXhseXNpYVBrZy52ZXJzaW9uXG4gIGlmICghdikge1xuICAgIHJldHVybiBudWxsXG4gIH1cbiAgcmV0dXJuIGAgICAgIGxvZ2l4bHlzaWEgdiR7dn1gXG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgT3B0aW9ucyB9IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQgeyBnZXRMb2dpeGx5c2lhVmVyc2lvbkxpbmUsIHJlbmRlckJhbm5lciB9IGZyb20gJy4vYmFubmVyJ1xuXG5leHBvcnQgY29uc3Qgc3RhcnRTZXJ2ZXIgPSAoXG4gIHNlcnZlcjogeyBwb3J0PzogbnVtYmVyOyBob3N0bmFtZT86IHN0cmluZzsgcHJvdG9jb2w/OiBzdHJpbmcgfCBudWxsIH0sXG4gIG9wdGlvbnM6IE9wdGlvbnNcbik6IHZvaWQgPT4ge1xuICBjb25zdCBzaG93U3RhcnR1cE1lc3NhZ2UgPSBvcHRpb25zLmNvbmZpZz8uc2hvd1N0YXJ0dXBNZXNzYWdlID8/IHRydWVcbiAgaWYgKCFzaG93U3RhcnR1cE1lc3NhZ2UpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHsgcG9ydCwgaG9zdG5hbWUsIHByb3RvY29sIH0gPSBzZXJ2ZXJcbiAgaWYgKHBvcnQgPT09IHVuZGVmaW5lZCB8fCAhaG9zdG5hbWUgfHwgIXByb3RvY29sKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCB1cmwgPSBgJHtwcm90b2NvbH06Ly8ke2hvc3RuYW1lfToke3BvcnR9YFxuICBjb25zdCBtZXNzYWdlID0gYPCfpoogRWx5c2lhIGlzIHJ1bm5pbmcgYXQgJHt1cmx9YFxuICBjb25zdCB1cmxEaXNwbGF5TGluZSA9IGDwn6aKICAke3VybH1gXG5cbiAgY29uc3QgZm9ybWF0ID0gb3B0aW9ucy5jb25maWc/LnN0YXJ0dXBNZXNzYWdlRm9ybWF0ID8/ICdiYW5uZXInXG4gIGlmIChmb3JtYXQgPT09ICdzaW1wbGUnKSB7XG4gICAgY29uc29sZS5sb2cobWVzc2FnZSlcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnNvbGUubG9nKHJlbmRlckJhbm5lcih1cmxEaXNwbGF5TGluZSwgZ2V0TG9naXhseXNpYVZlcnNpb25MaW5lKCkpKVxufVxuIiwKICAgICJpbXBvcnQgeyBTdGF0dXNNYXAgfSBmcm9tICdlbHlzaWEnXG5cbmNvbnN0IERJR0lUU19PTkxZID0gL15cXGQrJC9cbmNvbnN0IERFTElNSVRFUlMgPSAvW18tXSsvZ1xuY29uc3QgQ0FNRUxfQk9VTkRBUllfMSA9IC8oW2EtejAtOV0pKFtBLVpdKS9nXG5jb25zdCBDQU1FTF9CT1VOREFSWV8yID0gLyhbQS1aXSkoW0EtWl1bYS16XSkvZ1xuY29uc3QgQVBPU1RST1BIRVMgPSAvWyfigJldL2dcbmNvbnN0IE5PTl9BTFBIQU5VTUVSSUMgPSAvW15hLXowLTlcXHNdKy9nXG5jb25zdCBXSElURVNQQUNFID0gL1xccysvZ1xuXG5jb25zdCBub3JtYWxpemVTdGF0dXNOYW1lID0gKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICAvLyBIYW5kbGVzIGNvbW1vbiB2YXJpYW50czpcbiAgLy8gLSBjYXNlIGRpZmZlcmVuY2VzOiBcIm5vdCBmb3VuZFwiIHZzIFwiTm90IEZvdW5kXCJcbiAgLy8gLSBzcGFjaW5nL3B1bmN0dWF0aW9uOiBcIk5vdC1Gb3VuZFwiLCBcIm5vdF9mb3VuZFwiXG4gIC8vIC0gY2FtZWxDYXNlL1Bhc2NhbENhc2U6IFwiSW50ZXJuYWxTZXJ2ZXJFcnJvclwiXG4gIGNvbnN0IHRyaW1tZWQgPSB2YWx1ZS50cmltKClcbiAgaWYgKCF0cmltbWVkKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICByZXR1cm4gdHJpbW1lZFxuICAgIC5yZXBsYWNlKERFTElNSVRFUlMsICcgJylcbiAgICAucmVwbGFjZShDQU1FTF9CT1VOREFSWV8xLCAnJDEgJDInKVxuICAgIC5yZXBsYWNlKENBTUVMX0JPVU5EQVJZXzIsICckMSAkMicpXG4gICAgLnJlcGxhY2UoQVBPU1RST1BIRVMsICcnKVxuICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgLnJlcGxhY2UoTk9OX0FMUEhBTlVNRVJJQywgJyAnKVxuICAgIC5yZXBsYWNlKFdISVRFU1BBQ0UsICcgJylcbiAgICAudHJpbSgpXG59XG5cbmNvbnN0IFNUQVRVU19CWV9OT1JNQUxJWkVEX05BTUUgPSAoKCkgPT4ge1xuICBjb25zdCBtYXAgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpXG5cbiAgZm9yIChjb25zdCBbbmFtZSwgY29kZV0gb2YgT2JqZWN0LmVudHJpZXMoU3RhdHVzTWFwKSkge1xuICAgIG1hcC5zZXQobm9ybWFsaXplU3RhdHVzTmFtZShuYW1lKSwgY29kZSlcbiAgfVxuXG4gIHJldHVybiBtYXBcbn0pKClcblxuZXhwb3J0IGNvbnN0IGdldFN0YXR1c0NvZGUgPSAodmFsdWU6IHVua25vd24pOiBudW1iZXIgPT4ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNGaW5pdGUodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IHRyaW1tZWQgPSB2YWx1ZS50cmltKClcbiAgICBpZiAoRElHSVRTX09OTFkudGVzdCh0cmltbWVkKSkge1xuICAgICAgcmV0dXJuIE51bWJlcih0cmltbWVkKVxuICAgIH1cblxuICAgIGNvbnN0IGtub3duID0gU1RBVFVTX0JZX05PUk1BTElaRURfTkFNRS5nZXQobm9ybWFsaXplU3RhdHVzTmFtZSh0cmltbWVkKSlcbiAgICByZXR1cm4ga25vd24gPz8gNTAwXG4gIH1cblxuICByZXR1cm4gNTAwXG59XG4iLAogICAgImltcG9ydCBwaW5vIGZyb20gJ3Bpbm8nXG5pbXBvcnQgcHJldHR5IGZyb20gJ3Bpbm8tcHJldHR5J1xuaW1wb3J0IHtcbiAgY3JlYXRlUmVxdWVzdENvbnRleHRTdG9yZSxcbiAgbWVyZ2VMb2dEYXRhQ29udGV4dCxcbiAgdHlwZSBSZXF1ZXN0Q29udGV4dFN0b3JlXG59IGZyb20gJy4uL2NvbnRleHQvcmVxdWVzdC1jb250ZXh0J1xuaW1wb3J0IHR5cGUge1xuICBMb2dGaWx0ZXIsXG4gIExvZ2dlcixcbiAgTG9nTGV2ZWwsXG4gIE9wdGlvbnMsXG4gIFBpbm8sXG4gIFJlcXVlc3RJbmZvLFxuICBTdG9yZURhdGFcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcydcbmltcG9ydCB7IGxvZ1RvVHJhbnNwb3J0cyB9IGZyb20gJy4uL291dHB1dCdcbmltcG9ydCB7IGxvZ1RvRmlsZSB9IGZyb20gJy4uL291dHB1dC9maWxlJ1xuaW1wb3J0IHsgcmVkYWN0LCByZWRhY3RSZXF1ZXN0IH0gZnJvbSAnLi4vdXRpbHMvcmVkYWN0J1xuaW1wb3J0IHsgZm9ybWF0TG9nT3V0cHV0IH0gZnJvbSAnLi9jcmVhdGUtbG9nZ2VyJ1xuaW1wb3J0IHsgaGFuZGxlSHR0cEVycm9yIH0gZnJvbSAnLi9oYW5kbGUtaHR0cC1lcnJvcidcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZUxvZ2dlciA9IChcbiAgb3B0aW9uczogT3B0aW9ucyA9IHt9LFxuICBwaW5vRmFjdG9yeTogdHlwZW9mIHBpbm8gPSBwaW5vLFxuICBleHRlcm5hbENvbnRleHRTdG9yZT86IFJlcXVlc3RDb250ZXh0U3RvcmVcbik6IExvZ2dlciA9PiB7XG4gIGNvbnN0IGNvbnRleHRTdG9yZSA9IGV4dGVybmFsQ29udGV4dFN0b3JlID8/IGNyZWF0ZVJlcXVlc3RDb250ZXh0U3RvcmUoKVxuICBjb25zdCB7IGNvbmZpZyB9ID0gb3B0aW9uc1xuXG4gIGNvbnN0IHBpbm9Db25maWcgPSBjb25maWc/LnBpbm9cbiAgY29uc3QgeyBwcmV0dHlQcmludCwgLi4ucGlub09wdGlvbnMgfSA9IHBpbm9Db25maWcgPz8ge31cblxuICBjb25zdCBwcmV0dHlQcmludE9wdGlvbnMgPVxuICAgIHR5cGVvZiBwcmV0dHlQcmludCA9PT0gJ29iamVjdCcgJiYgcHJldHR5UHJpbnQgIT09IG51bGxcbiAgICAgID8gKHByZXR0eVByaW50IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVxuICAgICAgOiB1bmRlZmluZWRcblxuICBjb25zdCBlbmFibGVQcmV0dHlQcmludCA9XG4gICAgcHJldHR5UHJpbnQgPT09IHRydWUgfHwgcHJldHR5UHJpbnRPcHRpb25zICE9PSB1bmRlZmluZWRcblxuICBjb25zdCBzaG91bGRQcmV0dHlQcmludCA9XG4gICAgZW5hYmxlUHJldHR5UHJpbnQgJiYgcGlub09wdGlvbnMudHJhbnNwb3J0ID09PSB1bmRlZmluZWRcblxuICBjb25zdCBtZXNzYWdlS2V5ID1cbiAgICAocHJldHR5UHJpbnRPcHRpb25zPy5tZXNzYWdlS2V5IGFzIHN0cmluZyB8IHVuZGVmaW5lZCkgPz9cbiAgICBwaW5vT3B0aW9ucy5tZXNzYWdlS2V5XG4gIGNvbnN0IGVycm9yS2V5ID1cbiAgICAocHJldHR5UHJpbnRPcHRpb25zPy5lcnJvcktleSBhcyBzdHJpbmcgfCB1bmRlZmluZWQpID8/IHBpbm9PcHRpb25zLmVycm9yS2V5XG5cbiAgY29uc3QgYmFzZVBpbm9PcHRpb25zID0ge1xuICAgIC4uLnBpbm9PcHRpb25zLFxuICAgIGVycm9yS2V5LFxuICAgIGxldmVsOiBwaW5vT3B0aW9ucy5sZXZlbCA/PyAnaW5mbycsXG4gICAgbWVzc2FnZUtleVxuICB9XG5cbiAgbGV0IHBpbm9Mb2dnZXI6IFBpbm9cblxuICBpZiAoc2hvdWxkUHJldHR5UHJpbnQpIHtcbiAgICBjb25zdCBwcmV0dHlTdHJlYW0gPSBwcmV0dHkoe1xuICAgICAgY29sb3JpemU6IHByb2Nlc3Muc3Rkb3V0Py5pc1RUWSA9PT0gdHJ1ZSxcbiAgICAgIHRyYW5zbGF0ZVRpbWU6IGNvbmZpZz8udGltZXN0YW1wPy50cmFuc2xhdGVUaW1lLFxuICAgICAgLi4ucHJldHR5UHJpbnRPcHRpb25zLFxuICAgICAgZXJyb3JLZXksXG4gICAgICBtZXNzYWdlS2V5XG4gICAgfSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilcblxuICAgIHBpbm9Mb2dnZXIgPSBwaW5vRmFjdG9yeShiYXNlUGlub09wdGlvbnMsIHByZXR0eVN0cmVhbSlcbiAgfSBlbHNlIHtcbiAgICBwaW5vTG9nZ2VyID0gcGlub0ZhY3Rvcnkoe1xuICAgICAgLi4uYmFzZVBpbm9PcHRpb25zLFxuICAgICAgdHJhbnNwb3J0OiBwaW5vT3B0aW9ucy50cmFuc3BvcnRcbiAgICB9KVxuICB9XG5cbiAgY29uc3Qgc2hvdWxkTG9nID0gKGxldmVsOiBMb2dMZXZlbCwgbG9nRmlsdGVyPzogTG9nRmlsdGVyKTogYm9vbGVhbiA9PiB7XG4gICAgaWYgKCFsb2dGaWx0ZXI/LmxldmVsIHx8IGxvZ0ZpbHRlci5sZXZlbC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIHJldHVybiBsb2dGaWx0ZXIubGV2ZWwuaW5jbHVkZXMobGV2ZWwpXG4gIH1cblxuICBjb25zdCB1c2VUcmFuc3BvcnRzT25seSA9IGNvbmZpZz8udXNlVHJhbnNwb3J0c09ubHkgPT09IHRydWVcbiAgY29uc3QgZGlzYWJsZUludGVybmFsTG9nZ2VyID0gY29uZmlnPy5kaXNhYmxlSW50ZXJuYWxMb2dnZXIgPT09IHRydWVcbiAgY29uc3QgZGlzYWJsZUZpbGVMb2dnaW5nID0gY29uZmlnPy5kaXNhYmxlRmlsZUxvZ2dpbmcgPT09IHRydWVcblxuICBjb25zdCBoYXNUcmFuc3BvcnRzID0gKGNvbmZpZz8udHJhbnNwb3J0cz8ubGVuZ3RoID8/IDApID4gMFxuICBjb25zdCBoYXNGaWxlTG9nZ2luZyA9XG4gICAgISh1c2VUcmFuc3BvcnRzT25seSB8fCBkaXNhYmxlRmlsZUxvZ2dpbmcpICYmICEhY29uZmlnPy5sb2dGaWxlUGF0aFxuICBjb25zdCBoYXNJbnRlcm5hbExvZ2dlciA9ICEodXNlVHJhbnNwb3J0c09ubHkgfHwgZGlzYWJsZUludGVybmFsTG9nZ2VyKVxuICBjb25zdCBpc0VmZmVjdGl2ZWx5RGlzYWJsZWQgPSAhKFxuICAgIGhhc1RyYW5zcG9ydHMgfHxcbiAgICBoYXNGaWxlTG9nZ2luZyB8fFxuICAgIGhhc0ludGVybmFsTG9nZ2VyXG4gIClcblxuICBjb25zdCBsb2cgPSAoXG4gICAgbGV2ZWw6IExvZ0xldmVsLFxuICAgIHJlcXVlc3Q6IFJlcXVlc3RJbmZvLFxuICAgIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIHN0b3JlOiBTdG9yZURhdGFcbiAgKTogdm9pZCA9PiB7XG4gICAgaWYgKGlzRWZmZWN0aXZlbHlEaXNhYmxlZCB8fCAhc2hvdWxkTG9nKGxldmVsLCBjb25maWc/LmxvZ0ZpbHRlcikpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGRhdGFXaXRoQ29udGV4dCA9IG1lcmdlTG9nRGF0YUNvbnRleHQoXG4gICAgICBkYXRhLFxuICAgICAgY29udGV4dFN0b3JlLmdldENvbnRleHQocmVxdWVzdClcbiAgICApXG4gICAgY29uc3QgbG9nRGF0YSA9XG4gICAgICBjb25maWc/LmF1dG9SZWRhY3QgPT09IHRydWUgPyByZWRhY3QoZGF0YVdpdGhDb250ZXh0KSA6IGRhdGFXaXRoQ29udGV4dFxuICAgIGNvbnN0IGxvZ1JlcXVlc3QgPVxuICAgICAgY29uZmlnPy5hdXRvUmVkYWN0ID09PSB0cnVlID8gcmVkYWN0UmVxdWVzdChyZXF1ZXN0KSA6IHJlcXVlc3RcblxuICAgIGlmIChoYXNUcmFuc3BvcnRzKSB7XG4gICAgICBsb2dUb1RyYW5zcG9ydHMoe1xuICAgICAgICBkYXRhOiBsb2dEYXRhLFxuICAgICAgICBsZXZlbCxcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgcmVxdWVzdDogbG9nUmVxdWVzdCxcbiAgICAgICAgc3RvcmVcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKGhhc0ZpbGVMb2dnaW5nKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IGNvbmZpZz8ubG9nRmlsZVBhdGhcbiAgICAgIGlmIChmaWxlUGF0aCkge1xuICAgICAgICBsb2dUb0ZpbGUoe1xuICAgICAgICAgIGRhdGE6IGxvZ0RhdGEsXG4gICAgICAgICAgZmlsZVBhdGgsXG4gICAgICAgICAgbGV2ZWwsXG4gICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICByZXF1ZXN0OiBsb2dSZXF1ZXN0LFxuICAgICAgICAgIHN0b3JlXG4gICAgICAgIH0pLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAvKiBJZ25vcmUgZXJyb3JzICovXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFoYXNJbnRlcm5hbExvZ2dlcikge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgeyBtYWluLCBjb250ZXh0TGluZXMgfSA9IGZvcm1hdExvZ091dHB1dCh7XG4gICAgICBkYXRhOiBsb2dEYXRhLFxuICAgICAgbGV2ZWwsXG4gICAgICBvcHRpb25zLFxuICAgICAgcmVxdWVzdDogbG9nUmVxdWVzdCxcbiAgICAgIHN0b3JlXG4gICAgfSlcbiAgICBjb25zdCBtZXNzYWdlID1cbiAgICAgIGNvbnRleHRMaW5lcy5sZW5ndGggPiAwID8gYCR7bWFpbn1cXG4ke2NvbnRleHRMaW5lcy5qb2luKCdcXG4nKX1gIDogbWFpblxuXG4gICAgc3dpdGNoIChsZXZlbCkge1xuICAgICAgY2FzZSAnREVCVUcnOiB7XG4gICAgICAgIGNvbnNvbGUuZGVidWcobWVzc2FnZSlcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0lORk8nOiB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhtZXNzYWdlKVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgY2FzZSAnV0FSTklORyc6IHtcbiAgICAgICAgY29uc29sZS53YXJuKG1lc3NhZ2UpXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBjYXNlICdFUlJPUic6IHtcbiAgICAgICAgY29uc29sZS5lcnJvcihtZXNzYWdlKVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBjb25zb2xlLmxvZyhtZXNzYWdlKVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGxvZ1dpdGhDb250ZXh0ID0gKFxuICAgIGxldmVsOiBMb2dMZXZlbCxcbiAgICByZXF1ZXN0OiBSZXF1ZXN0SW5mbyxcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgY29udGV4dD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IHZvaWQgPT4ge1xuICAgIGlmIChpc0VmZmVjdGl2ZWx5RGlzYWJsZWQgfHwgIXNob3VsZExvZyhsZXZlbCwgY29uZmlnPy5sb2dGaWx0ZXIpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3Qgc3RvcmU6IFN0b3JlRGF0YSA9IHsgYmVmb3JlVGltZTogcHJvY2Vzcy5ocnRpbWUuYmlnaW50KCkgfVxuICAgIGxvZyhsZXZlbCwgcmVxdWVzdCwgeyBjb250ZXh0LCBtZXNzYWdlIH0sIHN0b3JlKVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBkZWJ1ZzogKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpID0+IHtcbiAgICAgIGxvZ1dpdGhDb250ZXh0KCdERUJVRycsIHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpXG4gICAgfSxcbiAgICBlcnJvcjogKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpID0+IHtcbiAgICAgIGxvZ1dpdGhDb250ZXh0KCdFUlJPUicsIHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpXG4gICAgfSxcbiAgICBnZXRDb250ZXh0OiByZXF1ZXN0ID0+IGNvbnRleHRTdG9yZS5nZXRDb250ZXh0KHJlcXVlc3QpLFxuICAgIGhhbmRsZUh0dHBFcnJvcjogKHJlcXVlc3QsIGVycm9yLCBzdG9yZSkgPT4ge1xuICAgICAgaGFuZGxlSHR0cEVycm9yKHJlcXVlc3QsIGVycm9yLCBzdG9yZSwgb3B0aW9ucywgY29udGV4dFN0b3JlKVxuICAgIH0sXG4gICAgaW5mbzogKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpID0+IHtcbiAgICAgIGxvZ1dpdGhDb250ZXh0KCdJTkZPJywgcmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dClcbiAgICB9LFxuICAgIGxvZyxcbiAgICBtZXJnZUNvbnRleHQ6IChyZXF1ZXN0LCBwYXJ0aWFsKSA9PiB7XG4gICAgICBjb250ZXh0U3RvcmUubWVyZ2VDb250ZXh0KHJlcXVlc3QsIHBhcnRpYWwpXG4gICAgfSxcbiAgICBwaW5vOiBwaW5vTG9nZ2VyLFxuICAgIHdhcm46IChyZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KSA9PiB7XG4gICAgICBsb2dXaXRoQ29udGV4dCgnV0FSTklORycsIHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpXG4gICAgfVxuICB9XG59XG5cbi8qKiBQbHVnaW4gZW50cnk6IHNoYXJlcyBvbmUgcmVxdWVzdC1jb250ZXh0IHN0b3JlIGFjcm9zcyB0aGUgRWx5c2lhIGxpZmVjeWNsZS4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVQbHVnaW5Mb2dnZXIgPSAoXG4gIG9wdGlvbnM6IE9wdGlvbnMsXG4gIGNvbnRleHRTdG9yZTogUmVxdWVzdENvbnRleHRTdG9yZVxuKTogTG9nZ2VyID0+IGNyZWF0ZUxvZ2dlcihvcHRpb25zLCBwaW5vLCBjb250ZXh0U3RvcmUpXG4iLAogICAgImltcG9ydCB0eXBlIHsgTG9nTGV2ZWwsIE9wdGlvbnMsIFJlcXVlc3RJbmZvLCBTdG9yZURhdGEgfSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuXG5sZXQgbGFzdFRyYW5zcG9ydEVycm9yQXQgPSAwXG5jb25zdCBUUkFOU1BPUlRfRVJST1JfSU5URVJWQUxfTVMgPSA1MDAwXG5cbmNvbnN0IHJlcG9ydFRyYW5zcG9ydEVycm9yID0gKGVycm9yOiB1bmtub3duKTogdm9pZCA9PiB7XG4gIGNvbnN0IG5vdyA9IERhdGUubm93KClcbiAgaWYgKG5vdyAtIGxhc3RUcmFuc3BvcnRFcnJvckF0IDwgVFJBTlNQT1JUX0VSUk9SX0lOVEVSVkFMX01TKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgbGFzdFRyYW5zcG9ydEVycm9yQXQgPSBub3dcbiAgY29uc29sZS5lcnJvcignW2xvZ2l4bHlzaWFdIHRyYW5zcG9ydCBmYWlsZWQ6JywgZXJyb3IpXG59XG5cbmludGVyZmFjZSBMb2dUb1RyYW5zcG9ydHNJbnB1dCB7XG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gIGxldmVsOiBMb2dMZXZlbFxuICBvcHRpb25zOiBPcHRpb25zXG4gIHJlcXVlc3Q6IFJlcXVlc3RJbmZvXG4gIHN0b3JlOiBTdG9yZURhdGFcbn1cblxuZXhwb3J0IGNvbnN0IGxvZ1RvVHJhbnNwb3J0cyA9IChcbiAgLi4uYXJnczpcbiAgICB8IFtMb2dUb1RyYW5zcG9ydHNJbnB1dF1cbiAgICB8IFtMb2dMZXZlbCwgUmVxdWVzdEluZm8sIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBTdG9yZURhdGEsIE9wdGlvbnNdXG4pOiB2b2lkID0+IHtcbiAgY29uc3QgaW5wdXQ6IExvZ1RvVHJhbnNwb3J0c0lucHV0ID1cbiAgICB0eXBlb2YgYXJnc1swXSA9PT0gJ3N0cmluZydcbiAgICAgID8ge1xuICAgICAgICAgIGRhdGE6IGFyZ3NbMl0sXG4gICAgICAgICAgbGV2ZWw6IGFyZ3NbMF0sXG4gICAgICAgICAgb3B0aW9uczogYXJnc1s0XSxcbiAgICAgICAgICByZXF1ZXN0OiBhcmdzWzFdLFxuICAgICAgICAgIHN0b3JlOiBhcmdzWzNdXG4gICAgICAgIH1cbiAgICAgIDogYXJnc1swXVxuXG4gIGNvbnN0IHsgbGV2ZWwsIHJlcXVlc3QsIGRhdGEsIHN0b3JlLCBvcHRpb25zIH0gPSBpbnB1dFxuICBjb25zdCB0cmFuc3BvcnRzID0gb3B0aW9ucy5jb25maWc/LnRyYW5zcG9ydHMgPz8gW11cbiAgaWYgKHRyYW5zcG9ydHMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCBtZXNzYWdlID0gdHlwZW9mIGRhdGEubWVzc2FnZSA9PT0gJ3N0cmluZycgPyBkYXRhLm1lc3NhZ2UgOiAnJ1xuICBjb25zdCBtZXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHtcbiAgICByZXF1ZXN0OiB7XG4gICAgICBtZXRob2Q6IHJlcXVlc3QubWV0aG9kLFxuICAgICAgdXJsOiByZXF1ZXN0LnVybFxuICAgIH0sXG4gICAgLi4uZGF0YSxcbiAgICBkdXJhdGlvbk1zOlxuICAgICAgc3RvcmUuYmVmb3JlVGltZSA9PT0gQmlnSW50KDApXG4gICAgICAgID8gMFxuICAgICAgICA6IE51bWJlcihwcm9jZXNzLmhydGltZS5iaWdpbnQoKSAtIHN0b3JlLmJlZm9yZVRpbWUpIC8gMV8wMDBfMDAwXG4gIH1cblxuICBmb3IgKGNvbnN0IHRyYW5zcG9ydCBvZiB0cmFuc3BvcnRzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRyYW5zcG9ydC5sb2cobGV2ZWwsIG1lc3NhZ2UsIG1ldGEpXG4gICAgICBpZiAoXG4gICAgICAgIHJlc3VsdCAmJlxuICAgICAgICB0eXBlb2YgKHJlc3VsdCBhcyB7IGNhdGNoPzogdW5rbm93biB9KS5jYXRjaCA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgKSB7XG4gICAgICAgIDsocmVzdWx0IGFzIFByb21pc2U8dm9pZD4pLmNhdGNoKHJlcG9ydFRyYW5zcG9ydEVycm9yKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXBvcnRUcmFuc3BvcnRFcnJvcihlcnJvcilcbiAgICB9XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgYXBwZW5kRmlsZSB9IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnXG5pbXBvcnQgeyBkaXJuYW1lIH0gZnJvbSAnbm9kZTpwYXRoJ1xuaW1wb3J0IHR5cGUgeyBMb2dMZXZlbCwgT3B0aW9ucywgUmVxdWVzdEluZm8sIFN0b3JlRGF0YSB9IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQgeyBlbnN1cmVEaXIgfSBmcm9tICcuL2ZzJ1xuaW1wb3J0IHsgcGVyZm9ybVJvdGF0aW9uLCBzaG91bGRSb3RhdGUgfSBmcm9tICcuL3JvdGF0aW9uLW1hbmFnZXInXG5cbi8vIFBlci1maWxlIG11dGV4IHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb25zIGR1cmluZyByb3RhdGlvblxuY29uc3QgZmlsZUxvY2tzID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8dm9pZD4+KClcblxuY29uc3QgYWNxdWlyZUxvY2sgPSBhc3luYyAoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8KCkgPT4gdm9pZD4gPT4ge1xuICBjb25zdCBwcmlvciA9IGZpbGVMb2Nrcy5nZXQoZmlsZVBhdGgpID8/IFByb21pc2UucmVzb2x2ZSgpXG5cbiAgbGV0IHJlc29sdmVMb2NrOiAoKSA9PiB2b2lkXG4gIGNvbnN0IG5ld0xvY2sgPSBuZXcgUHJvbWlzZTx2b2lkPihyZXNvbHZlID0+IHtcbiAgICByZXNvbHZlTG9jayA9IHJlc29sdmVcbiAgfSlcblxuICAvLyBSZWdpc3RlciBiZWZvcmUgYXdhaXRpbmc6IHNhbWUtdGljayBjYWxsZXJzIG11c3QgY2hhaW4gb250byBUSElTIGxvY2suXG4gIGZpbGVMb2Nrcy5zZXQoZmlsZVBhdGgsIG5ld0xvY2spXG5cbiAgYXdhaXQgcHJpb3JcblxuICByZXR1cm4gKCkgPT4ge1xuICAgIHJlc29sdmVMb2NrPy4oKVxuICAgIGlmIChmaWxlTG9ja3MuZ2V0KGZpbGVQYXRoKSA9PT0gbmV3TG9jaykge1xuICAgICAgZmlsZUxvY2tzLmRlbGV0ZShmaWxlUGF0aClcbiAgICB9XG4gIH1cbn1cblxuaW50ZXJmYWNlIExvZ1RvRmlsZUlucHV0IHtcbiAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgZmlsZVBhdGg6IHN0cmluZ1xuICBsZXZlbDogTG9nTGV2ZWxcbiAgb3B0aW9uczogT3B0aW9uc1xuICByZXF1ZXN0OiBSZXF1ZXN0SW5mb1xuICBzdG9yZTogU3RvcmVEYXRhXG59XG5cbmV4cG9ydCBjb25zdCBsb2dUb0ZpbGUgPSBhc3luYyAoXG4gIC4uLmFyZ3M6XG4gICAgfCBbTG9nVG9GaWxlSW5wdXRdXG4gICAgfCBbXG4gICAgICAgIHN0cmluZyxcbiAgICAgICAgTG9nTGV2ZWwsXG4gICAgICAgIFJlcXVlc3RJbmZvLFxuICAgICAgICBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgU3RvcmVEYXRhLFxuICAgICAgICBPcHRpb25zXG4gICAgICBdXG4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgY29uc3QgaW5wdXQ6IExvZ1RvRmlsZUlucHV0ID1cbiAgICB0eXBlb2YgYXJnc1swXSA9PT0gJ3N0cmluZydcbiAgICAgID8gKCgpID0+IHtcbiAgICAgICAgICBjb25zdCBbXG4gICAgICAgICAgICBmaWxlUGF0aEFyZyxcbiAgICAgICAgICAgIGxldmVsQXJnLFxuICAgICAgICAgICAgcmVxdWVzdEFyZyxcbiAgICAgICAgICAgIGRhdGFBcmcsXG4gICAgICAgICAgICBzdG9yZUFyZyxcbiAgICAgICAgICAgIG9wdGlvbnNBcmdcbiAgICAgICAgICBdID0gYXJncyBhcyBbXG4gICAgICAgICAgICBzdHJpbmcsXG4gICAgICAgICAgICBMb2dMZXZlbCxcbiAgICAgICAgICAgIFJlcXVlc3RJbmZvLFxuICAgICAgICAgICAgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICAgICAgICBTdG9yZURhdGEsXG4gICAgICAgICAgICBPcHRpb25zXG4gICAgICAgICAgXVxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkYXRhOiBkYXRhQXJnLFxuICAgICAgICAgICAgZmlsZVBhdGg6IGZpbGVQYXRoQXJnLFxuICAgICAgICAgICAgbGV2ZWw6IGxldmVsQXJnLFxuICAgICAgICAgICAgb3B0aW9uczogb3B0aW9uc0FyZyxcbiAgICAgICAgICAgIHJlcXVlc3Q6IHJlcXVlc3RBcmcsXG4gICAgICAgICAgICBzdG9yZTogc3RvcmVBcmdcbiAgICAgICAgICB9XG4gICAgICAgIH0pKClcbiAgICAgIDogYXJnc1swXVxuXG4gIGNvbnN0IHsgZmlsZVBhdGgsIGxldmVsLCByZXF1ZXN0LCBkYXRhLCBzdG9yZSwgb3B0aW9ucyB9ID0gaW5wdXRcbiAgY29uc3QgeyBjb25maWcgfSA9IG9wdGlvbnNcbiAgY29uc3QgdXNlVHJhbnNwb3J0c09ubHkgPSBjb25maWc/LnVzZVRyYW5zcG9ydHNPbmx5ID09PSB0cnVlXG4gIGNvbnN0IGRpc2FibGVGaWxlTG9nZ2luZyA9IGNvbmZpZz8uZGlzYWJsZUZpbGVMb2dnaW5nID09PSB0cnVlXG4gIGlmICh1c2VUcmFuc3BvcnRzT25seSB8fCBkaXNhYmxlRmlsZUxvZ2dpbmcpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IG1lc3NhZ2UgPSB0eXBlb2YgZGF0YS5tZXNzYWdlID09PSAnc3RyaW5nJyA/IGRhdGEubWVzc2FnZSA6ICcnXG4gIGNvbnN0IGR1cmF0aW9uTXMgPVxuICAgIHN0b3JlLmJlZm9yZVRpbWUgPT09IEJpZ0ludCgwKVxuICAgICAgPyAwXG4gICAgICA6IE51bWJlcihwcm9jZXNzLmhydGltZS5iaWdpbnQoKSAtIHN0b3JlLmJlZm9yZVRpbWUpIC8gMV8wMDBfMDAwXG5cbiAgLy8gU2FmZWx5IHBhcnNlIFVSTCB0byBhdm9pZCBjcmFzaGVzIG9uIG1hbGZvcm1lZCBVUkxzXG4gIGxldCBwYXRobmFtZSA9ICcvJ1xuICB0cnkge1xuICAgIGNvbnN0IHsgcGF0aG5hbWU6IHJhd1BhdGhuYW1lLCBzZWFyY2ggfSA9IG5ldyBVUkwocmVxdWVzdC51cmwpXG4gICAgcGF0aG5hbWUgPSBjb25maWc/LmxvZ1F1ZXJ5UGFyYW1zID8gYCR7cmF3UGF0aG5hbWV9JHtzZWFyY2h9YCA6IHJhd1BhdGhuYW1lXG4gIH0gY2F0Y2gge1xuICAgIC8vIEZhbGxiYWNrIHRvIHJhdyBVUkwgaWYgcGFyc2luZyBmYWlsc1xuICAgIHBhdGhuYW1lID0gcmVxdWVzdC51cmxcbiAgfVxuXG4gIGNvbnN0IGxpbmUgPSBgJHtsZXZlbH0gJHtkdXJhdGlvbk1zLnRvRml4ZWQoMil9bXMgJHtyZXF1ZXN0Lm1ldGhvZH0gJHtwYXRobmFtZX0gJHttZXNzYWdlfVxcbmBcblxuICAvLyBBY3F1aXJlIGxvY2sgYmVmb3JlIGFueSBmaWxlIG9wZXJhdGlvbnMgdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbnNcbiAgY29uc3QgcmVsZWFzZUxvY2sgPSBhd2FpdCBhY3F1aXJlTG9jayhmaWxlUGF0aClcblxuICB0cnkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBlbnN1cmVEaXIoZGlybmFtZShmaWxlUGF0aCkpXG4gICAgICBhd2FpdCBhcHBlbmRGaWxlKGZpbGVQYXRoLCBsaW5lLCB7IGVuY29kaW5nOiAndXRmLTgnIH0pXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIExvZyBmaWxlIHdyaXRlIGVycm9ycyB0byBzdGRlcnIgc28gdGhleSdyZSBub3QgY29tcGxldGVseSBzaWxlbnRcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGBbbG9naXhseXNpYV0gRmFpbGVkIHRvIHdyaXRlIHRvIGxvZyBmaWxlICR7ZmlsZVBhdGh9OmAsXG4gICAgICAgIGVycm9yXG4gICAgICApXG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cblxuICAgIGNvbnN0IHJvdGF0aW9uID0gY29uZmlnPy5sb2dSb3RhdGlvblxuICAgIGlmICghcm90YXRpb24pIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHNob3VsZCA9IGF3YWl0IHNob3VsZFJvdGF0ZShmaWxlUGF0aCwgcm90YXRpb24pXG4gICAgaWYgKHNob3VsZCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgcGVyZm9ybVJvdGF0aW9uKGZpbGVQYXRoLCByb3RhdGlvbilcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIExvZyByb3RhdGlvbiBlcnJvcnMgYnV0IGRvbid0IGNyYXNoIC0gbG9nIGVudHJ5IHdhcyBhbHJlYWR5IHdyaXR0ZW5cbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICBgW2xvZ2l4bHlzaWFdIEZhaWxlZCB0byByb3RhdGUgbG9nIGZpbGUgJHtmaWxlUGF0aH06YCxcbiAgICAgICAgICBlcnJvclxuICAgICAgICApXG4gICAgICB9XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIC8vIFJlbGVhc2UgbG9ja1xuICAgIHJlbGVhc2VMb2NrKClcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgeyBwcm9taXNlcyBhcyBmcyB9IGZyb20gJ25vZGU6ZnMnXG5cbmV4cG9ydCBjb25zdCBlbnN1cmVEaXIgPSBhc3luYyAoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGF3YWl0IGZzLm1rZGlyKGRpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pXG59XG4iLAogICAgImltcG9ydCB7IHByb21pc2VzIGFzIGZzIH0gZnJvbSAnbm9kZTpmcydcbmltcG9ydCB7IHByb21pc2lmeSB9IGZyb20gJ25vZGU6dXRpbCdcbmltcG9ydCB7IGd6aXAgfSBmcm9tICdub2RlOnpsaWInXG5pbXBvcnQgdHlwZSB7IExvZ1JvdGF0aW9uQ29uZmlnIH0gZnJvbSAnLi4vaW50ZXJmYWNlcydcbmltcG9ydCB7XG4gIGdldFJvdGF0ZWRGaWxlcyxcbiAgcGFyc2VSZXRlbnRpb24sXG4gIHBhcnNlU2l6ZSxcbiAgc2hvdWxkUm90YXRlQnlTaXplXG59IGZyb20gJy4uL3V0aWxzL3JvdGF0aW9uJ1xuXG5jb25zdCBnemlwQXN5bmMgPSBwcm9taXNpZnkoZ3ppcClcblxuLy8gQ29tcHJlc3Npb24gbG9jayB0byBwcmV2ZW50IGNvbmN1cnJlbnQgY29tcHJlc3Npb24gb2YgdGhlIHNhbWUgZmlsZVxuY29uc3QgY29tcHJlc3Npb25Mb2NrcyA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPHZvaWQ+PigpXG5cbmNvbnN0IGFjcXVpcmVDb21wcmVzc2lvbkxvY2sgPSBhc3luYyAoXG4gIGZpbGVQYXRoOiBzdHJpbmdcbik6IFByb21pc2U8KCkgPT4gdm9pZD4gPT4ge1xuICBjb25zdCBwcmlvciA9IGNvbXByZXNzaW9uTG9ja3MuZ2V0KGZpbGVQYXRoKSA/PyBQcm9taXNlLnJlc29sdmUoKVxuXG4gIGxldCByZXNvbHZlTG9jazogKCkgPT4gdm9pZFxuICBjb25zdCBuZXdMb2NrID0gbmV3IFByb21pc2U8dm9pZD4ocmVzb2x2ZSA9PiB7XG4gICAgcmVzb2x2ZUxvY2sgPSByZXNvbHZlXG4gIH0pXG5cbiAgLy8gUmVnaXN0ZXIgYmVmb3JlIGF3YWl0aW5nOiBzYW1lLXRpY2sgY2FsbGVycyBtdXN0IGNoYWluIG9udG8gVEhJUyBsb2NrLlxuICBjb21wcmVzc2lvbkxvY2tzLnNldChmaWxlUGF0aCwgbmV3TG9jaylcblxuICBhd2FpdCBwcmlvclxuXG4gIHJldHVybiAoKSA9PiB7XG4gICAgcmVzb2x2ZUxvY2s/LigpXG4gICAgaWYgKGNvbXByZXNzaW9uTG9ja3MuZ2V0KGZpbGVQYXRoKSA9PT0gbmV3TG9jaykge1xuICAgICAgY29tcHJlc3Npb25Mb2Nrcy5kZWxldGUoZmlsZVBhdGgpXG4gICAgfVxuICB9XG59XG5cbmNvbnN0IHBhZDIgPSAodmFsdWU6IG51bWJlcik6IHN0cmluZyA9PiBTdHJpbmcodmFsdWUpLnBhZFN0YXJ0KDIsICcwJylcblxuZXhwb3J0IGNvbnN0IGdldFJvdGF0ZWRGaWxlTmFtZSA9IChmaWxlUGF0aDogc3RyaW5nLCBkYXRlOiBEYXRlKTogc3RyaW5nID0+IHtcbiAgY29uc3QgeXl5eSA9IGRhdGUuZ2V0RnVsbFllYXIoKVxuICBjb25zdCBtbSA9IHBhZDIoZGF0ZS5nZXRNb250aCgpICsgMSlcbiAgY29uc3QgZGQgPSBwYWQyKGRhdGUuZ2V0RGF0ZSgpKVxuICBjb25zdCBISCA9IHBhZDIoZGF0ZS5nZXRIb3VycygpKVxuICBjb25zdCBNTSA9IHBhZDIoZGF0ZS5nZXRNaW51dGVzKCkpXG4gIGNvbnN0IHNzID0gcGFkMihkYXRlLmdldFNlY29uZHMoKSlcbiAgY29uc3QgU1NTID0gU3RyaW5nKGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCkpLnBhZFN0YXJ0KDMsICcwJylcbiAgcmV0dXJuIGAke2ZpbGVQYXRofS4ke3l5eXl9LSR7bW19LSR7ZGR9LSR7SEh9LSR7TU19LSR7c3N9LSR7U1NTfWBcbn1cblxuZXhwb3J0IGNvbnN0IHJvdGF0ZUZpbGUgPSBhc3luYyAoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdCA9IGF3YWl0IGZzLnN0YXQoZmlsZVBhdGgpXG4gICAgaWYgKHN0YXQuc2l6ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuICcnXG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIGNvbnN0IGJhc2VSb3RhdGVkID0gZ2V0Um90YXRlZEZpbGVOYW1lKGZpbGVQYXRoLCBuZXcgRGF0ZSgpKVxuICBjb25zdCByb3RhdGVkID0gYCR7YmFzZVJvdGF0ZWR9LSR7cHJvY2Vzcy5ocnRpbWUuYmlnaW50KCl9YFxuICBhd2FpdCBmcy5yZW5hbWUoZmlsZVBhdGgsIHJvdGF0ZWQpXG4gIHJldHVybiByb3RhdGVkXG59XG5cbmV4cG9ydCBjb25zdCBjb21wcmVzc0ZpbGUgPSBhc3luYyAoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4gPT4ge1xuICBjb25zdCByZWxlYXNlID0gYXdhaXQgYWNxdWlyZUNvbXByZXNzaW9uTG9jayhmaWxlUGF0aClcbiAgdHJ5IHtcbiAgICAvLyBDaGVjayBpZiBmaWxlIHN0aWxsIGV4aXN0cyAobWlnaHQgaGF2ZSBiZWVuIGNvbXByZXNzZWQgYnkgYW5vdGhlciBwcm9jZXNzKVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmcy5hY2Nlc3MoZmlsZVBhdGgpXG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBGaWxlIGRvZXNuJ3QgZXhpc3QsIGFscmVhZHkgY29tcHJlc3NlZCBvciBkZWxldGVkXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoZmlsZVBhdGgpXG4gICAgY29uc3QgY29tcHJlc3NlZCA9IGF3YWl0IGd6aXBBc3luYyhjb250ZW50KVxuICAgIGF3YWl0IGZzLndyaXRlRmlsZShgJHtmaWxlUGF0aH0uZ3pgLCBjb21wcmVzc2VkKVxuICAgIGF3YWl0IGZzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihgW2xvZ2l4bHlzaWFdIEZhaWxlZCB0byBjb21wcmVzcyBmaWxlICR7ZmlsZVBhdGh9OmAsIGVycm9yKVxuICAgIHRocm93IGVycm9yXG4gIH0gZmluYWxseSB7XG4gICAgcmVsZWFzZSgpXG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHNob3VsZFJvdGF0ZSA9IGFzeW5jIChcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgY29uZmlnOiBMb2dSb3RhdGlvbkNvbmZpZ1xuKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gIGlmIChjb25maWcubWF4U2l6ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgY29uc3QgbWF4U2l6ZSA9IHBhcnNlU2l6ZShjb25maWcubWF4U2l6ZSlcbiAgcmV0dXJuIGF3YWl0IHNob3VsZFJvdGF0ZUJ5U2l6ZShmaWxlUGF0aCwgbWF4U2l6ZSlcbn1cblxuY29uc3QgY2xlYW51cEJ5Q291bnQgPSBhc3luYyAoXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIG1heEZpbGVzOiBudW1iZXJcbik6IFByb21pc2U8dm9pZD4gPT4ge1xuICBjb25zdCByb3RhdGVkID0gYXdhaXQgZ2V0Um90YXRlZEZpbGVzKGZpbGVQYXRoKVxuICBpZiAocm90YXRlZC5sZW5ndGggPD0gbWF4RmlsZXMpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIC8vIFVzZSBQcm9taXNlLmFsbFNldHRsZWQgdG8gaGFuZGxlIGluZGl2aWR1YWwgZmlsZSBzdGF0IGZhaWx1cmVzIGdyYWNlZnVsbHlcbiAgY29uc3Qgc3RhdHNSZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFxuICAgIHJvdGF0ZWQubWFwKGFzeW5jIHAgPT4gKHsgcGF0aDogcCwgc3RhdDogYXdhaXQgZnMuc3RhdChwKSB9KSlcbiAgKVxuXG4gIC8vIEV4dHJhY3Qgc3VjY2Vzc2Z1bCBzdGF0cywgaWdub3JlIGZpbGVzIHRoYXQgd2VyZSBkZWxldGVkIGNvbmN1cnJlbnRseVxuICBjb25zdCBzdGF0cyA9IHN0YXRzUmVzdWx0c1xuICAgIC5maWx0ZXIoXG4gICAgICAoXG4gICAgICAgIHJlc3VsdFxuICAgICAgKTogcmVzdWx0IGlzIFByb21pc2VGdWxmaWxsZWRSZXN1bHQ8e1xuICAgICAgICBwYXRoOiBzdHJpbmdcbiAgICAgICAgc3RhdDogaW1wb3J0KCdub2RlOmZzJykuU3RhdHNcbiAgICAgIH0+ID0+IHJlc3VsdC5zdGF0dXMgPT09ICdmdWxmaWxsZWQnXG4gICAgKVxuICAgIC5tYXAocmVzdWx0ID0+IHJlc3VsdC52YWx1ZSlcblxuICBpZiAoc3RhdHMubGVuZ3RoIDw9IG1heEZpbGVzKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBzdGF0cy5zb3J0KChhLCBiKSA9PiBiLnN0YXQubXRpbWVNcyAtIGEuc3RhdC5tdGltZU1zKVxuICBjb25zdCB0b0RlbGV0ZSA9IHN0YXRzLnNsaWNlKG1heEZpbGVzKVxuXG4gIC8vIERlbGV0ZSBmaWxlcyBpbmRpdmlkdWFsbHksIGNvbnRpbnVpbmcgZXZlbiBpZiBzb21lIGZhaWxcbiAgY29uc3QgZGVsZXRlUmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChcbiAgICB0b0RlbGV0ZS5tYXAoKHsgcGF0aCB9KSA9PiBmcy5ybShwYXRoLCB7IGZvcmNlOiB0cnVlIH0pKVxuICApXG5cbiAgLy8gTG9nIGZhaWx1cmVzIGJ1dCBkb24ndCBjcmFzaFxuICBkZWxldGVSZXN1bHRzLmZvckVhY2goKHJlc3VsdCwgaWR4KSA9PiB7XG4gICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09ICdyZWplY3RlZCcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGBbbG9naXhseXNpYV0gRmFpbGVkIHRvIGRlbGV0ZSByb3RhdGVkIGxvZyAke3RvRGVsZXRlW2lkeF0ucGF0aH06YCxcbiAgICAgICAgcmVzdWx0LnJlYXNvblxuICAgICAgKVxuICAgIH1cbiAgfSlcbn1cblxuY29uc3QgY2xlYW51cEJ5VGltZSA9IGFzeW5jIChcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgbWF4QWdlTXM6IG51bWJlclxuKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IHJvdGF0ZWQgPSBhd2FpdCBnZXRSb3RhdGVkRmlsZXMoZmlsZVBhdGgpXG4gIGlmIChyb3RhdGVkLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKVxuXG4gIC8vIFVzZSBQcm9taXNlLmFsbFNldHRsZWQgdG8gaGFuZGxlIGluZGl2aWR1YWwgZmlsZSBzdGF0IGZhaWx1cmVzIGdyYWNlZnVsbHlcbiAgY29uc3Qgc3RhdHNSZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFxuICAgIHJvdGF0ZWQubWFwKGFzeW5jIHAgPT4gKHsgcGF0aDogcCwgc3RhdDogYXdhaXQgZnMuc3RhdChwKSB9KSlcbiAgKVxuXG4gIC8vIEV4dHJhY3Qgc3VjY2Vzc2Z1bCBzdGF0c1xuICBjb25zdCBzdGF0cyA9IHN0YXRzUmVzdWx0c1xuICAgIC5maWx0ZXIoXG4gICAgICAoXG4gICAgICAgIHJlc3VsdFxuICAgICAgKTogcmVzdWx0IGlzIFByb21pc2VGdWxmaWxsZWRSZXN1bHQ8e1xuICAgICAgICBwYXRoOiBzdHJpbmdcbiAgICAgICAgc3RhdDogaW1wb3J0KCdub2RlOmZzJykuU3RhdHNcbiAgICAgIH0+ID0+IHJlc3VsdC5zdGF0dXMgPT09ICdmdWxmaWxsZWQnXG4gICAgKVxuICAgIC5tYXAocmVzdWx0ID0+IHJlc3VsdC52YWx1ZSlcblxuICBjb25zdCB0b0RlbGV0ZSA9IHN0YXRzLmZpbHRlcigoeyBzdGF0IH0pID0+IG5vdyAtIHN0YXQubXRpbWVNcyA+IG1heEFnZU1zKVxuXG4gIC8vIERlbGV0ZSBmaWxlcyBpbmRpdmlkdWFsbHksIGNvbnRpbnVpbmcgZXZlbiBpZiBzb21lIGZhaWxcbiAgY29uc3QgZGVsZXRlUmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChcbiAgICB0b0RlbGV0ZS5tYXAoKHsgcGF0aCB9KSA9PiBmcy5ybShwYXRoLCB7IGZvcmNlOiB0cnVlIH0pKVxuICApXG5cbiAgLy8gTG9nIGZhaWx1cmVzIGJ1dCBkb24ndCBjcmFzaFxuICBkZWxldGVSZXN1bHRzLmZvckVhY2goKHJlc3VsdCwgaWR4KSA9PiB7XG4gICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09ICdyZWplY3RlZCcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGBbbG9naXhseXNpYV0gRmFpbGVkIHRvIGRlbGV0ZSBvbGQgbG9nICR7dG9EZWxldGVbaWR4XS5wYXRofTpgLFxuICAgICAgICByZXN1bHQucmVhc29uXG4gICAgICApXG4gICAgfVxuICB9KVxufVxuXG5leHBvcnQgY29uc3QgcGVyZm9ybVJvdGF0aW9uID0gYXN5bmMgKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBjb25maWc6IExvZ1JvdGF0aW9uQ29uZmlnXG4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgY29uc3Qgcm90YXRlZCA9IGF3YWl0IHJvdGF0ZUZpbGUoZmlsZVBhdGgpXG4gIGlmICghcm90YXRlZCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3Qgc2hvdWxkQ29tcHJlc3MgPSBjb25maWcuY29tcHJlc3MgPT09IHRydWVcbiAgaWYgKHNob3VsZENvbXByZXNzKSB7XG4gICAgY29uc3QgYWxnbyA9IGNvbmZpZy5jb21wcmVzc2lvbiA/PyAnZ3ppcCdcbiAgICBpZiAoYWxnbyA9PT0gJ2d6aXAnKSB7XG4gICAgICBhd2FpdCBjb21wcmVzc0ZpbGUocm90YXRlZClcbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlnLm1heEZpbGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCByZXRlbnRpb24gPSBwYXJzZVJldGVudGlvbihjb25maWcubWF4RmlsZXMpXG4gICAgaWYgKHJldGVudGlvbi50eXBlID09PSAnY291bnQnKSB7XG4gICAgICBhd2FpdCBjbGVhbnVwQnlDb3VudChmaWxlUGF0aCwgcmV0ZW50aW9uLnZhbHVlKVxuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBjbGVhbnVwQnlUaW1lKGZpbGVQYXRoLCByZXRlbnRpb24udmFsdWUpXG4gICAgfVxuICB9XG5cbiAgLy8gT3B0aW9uYWwgaW50ZXJ2YWwtYmFzZWQgcm90YXRpb24gY2xlYW51cCAoY3JlYXRlIGludGVydmFsIGRpcmVjdG9yaWVzIC8gbmFtaW5nKSBpcyBub3QgcmVxdWlyZWQgYnkgdGVzdHMuXG59XG4iLAogICAgIi8vIExvY2FsIHBhcnQg4omkNjQsIGRvbWFpbiDiiaQyNTMsIFRMRCAy4oCTNjMgKFJGQyA1MzIxIC8gMTAzNS1pc2ggbGltaXRzOyBib3VuZGVkIHRvIGF2b2lkIFJlRG9TKVxuY29uc3QgRU1BSUxfUkVHRVggPVxuICAvW2EtekEtWjAtOS5fJSstXXsxLDY0fUBbYS16QS1aMC05Li1dezEsMjUzfVxcLlthLXpBLVpdezIsNjN9L2dcbmNvbnN0IElQVjRfUkVHRVggPSAvXFxiKD86XFxkezEsM31cXC4pezN9XFxkezEsM31cXGIvZ1xuLyoqIERpZ2l0IHJ1bnMgdGhhdCBtYXkgYmUgZm9ybWF0dGVkIFBBTnMgKHNwYWNlcy9kYXNoZXMpOyB2YWxpZGF0ZWQgd2l0aCBMdWhuIGJlZm9yZSByZWRhY3RpbmcuICovXG5jb25zdCBDUkVESVRfQ0FSRF9DQU5ESURBVEVfUkVHRVggPSAvXFxiKD86XFxkWyAtXSo/KXsxMywxOX1cXGIvZ1xuY29uc3QgSldUX1JFR0VYID0gL2V5SlthLXpBLVowLTlfLV0rXFwuZXlKW2EtekEtWjAtOV8tXStcXC5bYS16QS1aMC05Xy1dKy9nXG5cbmNvbnN0IFBBTl9NSU5fTEVOID0gMTNcbmNvbnN0IFBBTl9NQVhfTEVOID0gMTlcblxuY29uc3QgUkVEQUNURURfVEVYVCA9ICdbUkVEQUNURURdJ1xuY29uc3QgQ0lSQ1VMQVJfUkVGID0gJ1tDaXJjdWxhcl0nXG5cbi8qKlxuICogSG9zdCBhbmQgdXNlcmluZm8gY2Fubm90IGNvbnRhaW4gYFtSRURBQ1RFRF1gIOKAlCBgW2AgYmVnaW5zIGFuIElQdjYgbGl0ZXJhbCBpbiBVUkxzIGFuZCBicmVha3MgcGFyc2luZy5cbiAqL1xuY29uc3QgVVJMX1NBRkVfUkVEQUNUID0gJ3JlZGFjdGVkJ1xuXG5jb25zdCByZWRhY3RVcmxBdXRob3JpdHlTZWdtZW50ID0gKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcgPT5cbiAgcmVkYWN0U3RyaW5nKHZhbHVlKS5yZXBsYWNlQWxsKFJFREFDVEVEX1RFWFQsIFVSTF9TQUZFX1JFREFDVClcblxuLyoqIEFwcGx5IFBJSSByZWRhY3Rpb24gdG8gYSByZXF1ZXN0IFVSTCB3aGlsZSBrZWVwaW5nIHRoZSByZXN1bHQgcGFyc2VhYmxlIGJ5IHRoZSBVUkwvUmVxdWVzdCBjb25zdHJ1Y3RvcnMuICovXG5jb25zdCByZWRhY3RSZXF1ZXN0VXJsID0gKHVybFN0cmluZzogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCB1ID0gbmV3IFVSTCh1cmxTdHJpbmcpXG4gICAgaWYgKHUudXNlcm5hbWUgIT09ICcnKSB7XG4gICAgICB1LnVzZXJuYW1lID0gcmVkYWN0VXJsQXV0aG9yaXR5U2VnbWVudCh1LnVzZXJuYW1lKVxuICAgIH1cbiAgICBpZiAodS5wYXNzd29yZCAhPT0gJycpIHtcbiAgICAgIHUucGFzc3dvcmQgPSByZWRhY3RVcmxBdXRob3JpdHlTZWdtZW50KHUucGFzc3dvcmQpXG4gICAgfVxuICAgIHUuaG9zdG5hbWUgPSByZWRhY3RVcmxBdXRob3JpdHlTZWdtZW50KHUuaG9zdG5hbWUpXG4gICAgdS5wYXRobmFtZSA9IHJlZGFjdFN0cmluZyh1LnBhdGhuYW1lKVxuICAgIHUuc2VhcmNoID0gcmVkYWN0U3RyaW5nKHUuc2VhcmNoKVxuICAgIHUuaGFzaCA9IHJlZGFjdFN0cmluZyh1Lmhhc2gpXG4gICAgcmV0dXJuIHUudG9TdHJpbmcoKVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gcmVkYWN0U3RyaW5nKHVybFN0cmluZykucmVwbGFjZUFsbChSRURBQ1RFRF9URVhULCBVUkxfU0FGRV9SRURBQ1QpXG4gIH1cbn1cblxuLyoqIEx1aG4gY2hlY2tzdW07IGBkaWdpdHNgIG11c3QgY29udGFpbiBvbmx5IGAwLTlgIGFuZCBsZW5ndGggaW4gUEFOIHJhbmdlLiAqL1xuY29uc3QgcGFzc2VzTHVobiA9IChkaWdpdHM6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICBpZiAoZGlnaXRzLmxlbmd0aCA8IFBBTl9NSU5fTEVOIHx8IGRpZ2l0cy5sZW5ndGggPiBQQU5fTUFYX0xFTikge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgbGV0IHN1bSA9IDBcbiAgbGV0IGFsdGVybmF0ZSA9IGZhbHNlXG5cbiAgZm9yIChsZXQgaSA9IGRpZ2l0cy5sZW5ndGggLSAxOyBpID49IDA7IGkgLT0gMSkge1xuICAgIGNvbnN0IGNvZGUgPSBkaWdpdHMuY2hhckNvZGVBdChpKVxuICAgIGlmIChjb2RlIDwgNDggfHwgY29kZSA+IDU3KSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgbGV0IG4gPSBjb2RlIC0gNDhcbiAgICBpZiAoYWx0ZXJuYXRlKSB7XG4gICAgICBuICo9IDJcbiAgICAgIGlmIChuID4gOSkge1xuICAgICAgICBuIC09IDlcbiAgICAgIH1cbiAgICB9XG4gICAgc3VtICs9IG5cbiAgICBhbHRlcm5hdGUgPSAhYWx0ZXJuYXRlXG4gIH1cblxuICByZXR1cm4gc3VtICUgMTAgPT09IDBcbn1cblxuY29uc3QgcmVkYWN0Q3JlZGl0Q2FyZENhbmRpZGF0ZXMgPSAodGV4dDogc3RyaW5nKTogc3RyaW5nID0+XG4gIHRleHQucmVwbGFjZShDUkVESVRfQ0FSRF9DQU5ESURBVEVfUkVHRVgsIG1hdGNoID0+IHtcbiAgICBjb25zdCBkaWdpdHMgPSBtYXRjaC5yZXBsYWNlKC9cXEQvZywgJycpXG4gICAgaWYgKFxuICAgICAgZGlnaXRzLmxlbmd0aCA+PSBQQU5fTUlOX0xFTiAmJlxuICAgICAgZGlnaXRzLmxlbmd0aCA8PSBQQU5fTUFYX0xFTiAmJlxuICAgICAgcGFzc2VzTHVobihkaWdpdHMpXG4gICAgKSB7XG4gICAgICByZXR1cm4gUkVEQUNURURfVEVYVFxuICAgIH1cbiAgICByZXR1cm4gbWF0Y2hcbiAgfSlcblxuZXhwb3J0IGNvbnN0IHJlZGFjdFN0cmluZyA9ICh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBsZXQgcmVzdWx0ID0gdGV4dFxuXG4gIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKEVNQUlMX1JFR0VYLCBSRURBQ1RFRF9URVhUKVxuICByZXN1bHQgPSByZXN1bHQucmVwbGFjZShJUFY0X1JFR0VYLCBSRURBQ1RFRF9URVhUKVxuICByZXN1bHQgPSByZWRhY3RDcmVkaXRDYXJkQ2FuZGlkYXRlcyhyZXN1bHQpXG4gIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKEpXVF9SRUdFWCwgUkVEQUNURURfVEVYVClcblxuICByZXR1cm4gcmVzdWx0XG59XG5cbmNvbnN0IHJlZGFjdEVycm9yQ2xvbmUgPSAoXG4gIG9yaWdpbmFsRXJyb3I6IEVycm9yLFxuICBpblByb2dyZXNzOiBXZWFrU2V0PG9iamVjdD5cbik6IEVycm9yICYgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT4ge1xuICBjb25zdCByZWRhY3RlZE1lc3NhZ2UgPSByZWRhY3RTdHJpbmcob3JpZ2luYWxFcnJvci5tZXNzYWdlKVxuICBjb25zdCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvcmlnaW5hbEVycm9yKSBhcyBvYmplY3RcbiAgY29uc3QgbmV3RXJyb3IgPSBPYmplY3QuY3JlYXRlKHByb3RvKSBhcyBFcnJvciAmIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG5cbiAgbmV3RXJyb3IubWVzc2FnZSA9IHJlZGFjdGVkTWVzc2FnZVxuICBuZXdFcnJvci5uYW1lID0gb3JpZ2luYWxFcnJvci5uYW1lXG5cbiAgaWYgKG9yaWdpbmFsRXJyb3Iuc3RhY2sgIT09IHVuZGVmaW5lZCkge1xuICAgIG5ld0Vycm9yLnN0YWNrID0gcmVkYWN0U3RyaW5nKG9yaWdpbmFsRXJyb3Iuc3RhY2spXG4gIH1cblxuICBjb25zdCBlcnJvclJlY29yZCA9IG9yaWdpbmFsRXJyb3IgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuXG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGVycm9yUmVjb3JkKSkge1xuICAgIGlmIChrZXkgIT09ICdtZXNzYWdlJyAmJiBrZXkgIT09ICduYW1lJyAmJiBrZXkgIT09ICdzdGFjaycpIHtcbiAgICAgIG5ld0Vycm9yW2tleV0gPSByZWRhY3RJbm5lcihlcnJvclJlY29yZFtrZXldLCBpblByb2dyZXNzKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXdFcnJvclxufVxuXG5jb25zdCByZWRhY3RBcnJheUl0ZW1zID0gKFxuICB2YWx1ZTogdW5rbm93bltdLFxuICBpblByb2dyZXNzOiBXZWFrU2V0PG9iamVjdD5cbik6IHVua25vd25bXSA9PiB7XG4gIGNvbnN0IHJlZGFjdGVkQXJyYXk6IHVua25vd25bXSA9IEFycmF5LmZyb20oeyBsZW5ndGg6IHZhbHVlLmxlbmd0aCB9KVxuICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgcmVkYWN0ZWRBcnJheVtpXSA9IHJlZGFjdElubmVyKHZhbHVlW2ldLCBpblByb2dyZXNzKVxuICB9XG4gIHJldHVybiByZWRhY3RlZEFycmF5XG59XG5cbmNvbnN0IHJlZGFjdFJlY29yZEVudHJpZXMgPSAoXG4gIHJlY29yZFZhbHVlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgaW5Qcm9ncmVzczogV2Vha1NldDxvYmplY3Q+XG4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PiB7XG4gIGNvbnN0IHJlZGFjdGVkUmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9XG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHJlY29yZFZhbHVlKSkge1xuICAgIHJlZGFjdGVkUmVjb3JkW2tleV0gPSByZWRhY3RJbm5lcihyZWNvcmRWYWx1ZVtrZXldLCBpblByb2dyZXNzKVxuICB9XG4gIHJldHVybiByZWRhY3RlZFJlY29yZFxufVxuXG5jb25zdCB3aXRoUmVlbnRyYW5jeUd1YXJkID0gPFQ+KFxuICBvYmo6IG9iamVjdCxcbiAgaW5Qcm9ncmVzczogV2Vha1NldDxvYmplY3Q+LFxuICBydW46ICgpID0+IFRcbik6IFQgPT4ge1xuICBpblByb2dyZXNzLmFkZChvYmopXG4gIHRyeSB7XG4gICAgcmV0dXJuIHJ1bigpXG4gIH0gZmluYWxseSB7XG4gICAgaW5Qcm9ncmVzcy5kZWxldGUob2JqKVxuICB9XG59XG5cbmNvbnN0IHJlZGFjdElubmVyID0gPFQ+KHZhbHVlOiBULCBpblByb2dyZXNzOiBXZWFrU2V0PG9iamVjdD4pOiBUID0+IHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHJlZGFjdFN0cmluZyh2YWx1ZSkgYXMgdW5rbm93biBhcyBUXG4gIH1cblxuICBjb25zdCB0eXBlID0gdHlwZW9mIHZhbHVlXG4gIGlmICh0eXBlICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgIHJldHVybiBuZXcgRGF0ZSh2YWx1ZS5nZXRUaW1lKCkpIGFzIHVua25vd24gYXMgVFxuICB9XG5cbiAgY29uc3Qgb2JqID0gdmFsdWUgYXMgb2JqZWN0XG4gIGlmIChpblByb2dyZXNzLmhhcyhvYmopKSB7XG4gICAgcmV0dXJuIENJUkNVTEFSX1JFRiBhcyB1bmtub3duIGFzIFRcbiAgfVxuXG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgcmV0dXJuIHdpdGhSZWVudHJhbmN5R3VhcmQob2JqLCBpblByb2dyZXNzLCAoKSA9PlxuICAgICAgcmVkYWN0RXJyb3JDbG9uZSh2YWx1ZSwgaW5Qcm9ncmVzcylcbiAgICApIGFzIHVua25vd24gYXMgVFxuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuIHdpdGhSZWVudHJhbmN5R3VhcmQob2JqLCBpblByb2dyZXNzLCAoKSA9PlxuICAgICAgcmVkYWN0QXJyYXlJdGVtcyh2YWx1ZSwgaW5Qcm9ncmVzcylcbiAgICApIGFzIHVua25vd24gYXMgVFxuICB9XG5cbiAgcmV0dXJuIHdpdGhSZWVudHJhbmN5R3VhcmQob2JqLCBpblByb2dyZXNzLCAoKSA9PlxuICAgIHJlZGFjdFJlY29yZEVudHJpZXModmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGluUHJvZ3Jlc3MpXG4gICkgYXMgdW5rbm93biBhcyBUXG59XG5cbmV4cG9ydCBjb25zdCByZWRhY3QgPSA8VD4odmFsdWU6IFQpOiBUID0+IHJlZGFjdElubmVyKHZhbHVlLCBuZXcgV2Vha1NldCgpKVxuXG4vKipcbiAqIENsb25lIHJlcXVlc3QgVVJMLCBtZXRob2QgYW5kIGhlYWRlcnMgZm9yIGxvZ2dpbmcgd2l0aCB0aGUgc2FtZSBzdHJpbmcgcmVkYWN0aW9uIGFzIHtAbGluayByZWRhY3R9LlxuICogVGhlIHJldHVybmVkIHJlcXVlc3QgaXMgYSBsb2dnaW5nLW9ubHkgYXJ0aWZhY3QgY2FycnlpbmcgdXJsL21ldGhvZC9oZWFkZXJzL3NpZ25hbDsgaXQgaW50ZW50aW9uYWxseVxuICogb21pdHMgdGhlIGJvZHkgc28gaXQgbmV2ZXIgcmUtdXNlcyB0aGUgb3JpZ2luYWwgKHBvc3NpYmx5IGFscmVhZHktY29uc3VtZWQpIHJlcXVlc3Qgc3RyZWFtLiBUaGVcbiAqIG9yaWdpbmFsIHJlcXVlc3QgaXMgbGVmdCB1bnRvdWNoZWQgYW5kIHJlbWFpbnMgdXNhYmxlLlxuICovXG5leHBvcnQgY29uc3QgcmVkYWN0UmVxdWVzdCA9IChyZXF1ZXN0OiBSZXF1ZXN0KTogUmVxdWVzdCA9PiB7XG4gIGNvbnN0IHJlZGFjdGVkVXJsID0gcmVkYWN0UmVxdWVzdFVybChyZXF1ZXN0LnVybClcbiAgY29uc3QgbmV4dEhlYWRlcnMgPSBuZXcgSGVhZGVycygpXG4gIGxldCBoZWFkZXJzQ2hhbmdlZCA9IGZhbHNlXG5cbiAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIHJlcXVlc3QuaGVhZGVycy5lbnRyaWVzKCkpIHtcbiAgICBjb25zdCByZWRhY3RlZCA9IHJlZGFjdFN0cmluZyh2YWx1ZSlcbiAgICBpZiAocmVkYWN0ZWQgIT09IHZhbHVlKSB7XG4gICAgICBoZWFkZXJzQ2hhbmdlZCA9IHRydWVcbiAgICB9XG4gICAgbmV4dEhlYWRlcnMuc2V0KG5hbWUsIHJlZGFjdGVkKVxuICB9XG5cbiAgY29uc3QgcmVkYWN0ZWRNZXRob2QgPSByZWRhY3RTdHJpbmcocmVxdWVzdC5tZXRob2QpXG4gIGNvbnN0IHVybENoYW5nZWQgPSByZWRhY3RlZFVybCAhPT0gcmVxdWVzdC51cmxcbiAgY29uc3QgbWV0aG9kQ2hhbmdlZCA9IHJlZGFjdGVkTWV0aG9kICE9PSByZXF1ZXN0Lm1ldGhvZFxuXG4gIGlmICghKHVybENoYW5nZWQgfHwgaGVhZGVyc0NoYW5nZWQgfHwgbWV0aG9kQ2hhbmdlZCkpIHtcbiAgICByZXR1cm4gcmVxdWVzdFxuICB9XG5cbiAgY29uc3QgaW5pdDogUmVxdWVzdEluaXQgPSB7XG4gICAgaGVhZGVyczogbmV4dEhlYWRlcnMsXG4gICAgbWV0aG9kOiByZWRhY3RlZE1ldGhvZCxcbiAgICByZWRpcmVjdDogcmVxdWVzdC5yZWRpcmVjdCxcbiAgICBzaWduYWw6IHJlcXVlc3Quc2lnbmFsXG4gIH1cblxuICByZXR1cm4gbmV3IFJlcXVlc3QocmVkYWN0ZWRVcmwsIGluaXQpXG59XG4iLAogICAgImltcG9ydCB7IFNUQVRVU19DT0RFUyB9IGZyb20gJ25vZGU6aHR0cCdcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsaydcbmltcG9ydCB7IGdldFN0YXR1c0NvZGUgfSBmcm9tICcuLi9oZWxwZXJzL3N0YXR1cydcbmltcG9ydCB0eXBlIHtcbiAgTG9nTGV2ZWwsXG4gIE9wdGlvbnMsXG4gIFBpbm8sXG4gIFJlcXVlc3RJbmZvLFxuICBTdG9yZURhdGFcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcydcbmltcG9ydCB7IGlzU3RydWN0dXJlZEVycm9yLCBwYXJzZUVycm9yIH0gZnJvbSAnLi4vdXRpbHMvZXJyb3InXG5cbmNvbnN0IHBhZDIgPSAodmFsdWU6IG51bWJlcik6IHN0cmluZyA9PiBTdHJpbmcodmFsdWUpLnBhZFN0YXJ0KDIsICcwJylcbmNvbnN0IHBhZDMgPSAodmFsdWU6IG51bWJlcik6IHN0cmluZyA9PiBTdHJpbmcodmFsdWUpLnBhZFN0YXJ0KDMsICcwJylcblxuY29uc3QgREVGQVVMVF9TTE9XX01TID0gNTAwXG5jb25zdCBERUZBVUxUX1ZFUllfU0xPV19NUyA9IDEwMDBcbmNvbnN0IE1FVEhPRF9QQUQgPSA3XG5cbmNvbnN0IERFRkFVTFRfTE9HX0ZPUk1BVCA9XG4gICd7bm93fSB7c2VydmljZX17aWNvbn0ge21ldGhvZH0ge3BhdGhuYW1lfSB7c3RhdHVzfSB7ZHVyYXRpb259IHttZXNzYWdlfXtzcGVlZH0nXG5cbmNvbnN0IExPR19GT1JNQVRfUkVHRVggPVxuICAvXFx7KG5vd3xlcG9jaHxsZXZlbHxpY29ufGR1cmF0aW9ufG1ldGhvZHxwYXRobmFtZXxwYXRofHF1ZXJ5fHN0YXR1c3xzdGF0dXNUZXh0fG1lc3NhZ2V8aXB8Y29udGV4dHxzZXJ2aWNlfHNwZWVkfHJlcXVlc3RJZClcXH0vZ1xuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1hdHRlZExvZ091dHB1dCB7XG4gIGNvbnRleHRMaW5lczogc3RyaW5nW11cbiAgbWFpbjogc3RyaW5nXG59XG5cbmNvbnN0IHNob3VsZFVzZUNvbG9ycyA9IChvcHRpb25zOiBPcHRpb25zKTogYm9vbGVhbiA9PiB7XG4gIGNvbnN0IHsgY29uZmlnIH0gPSBvcHRpb25zXG4gIGNvbnN0IGVuYWJsZWRCeUNvbmZpZyA9IGNvbmZpZz8udXNlQ29sb3JzID8/IHRydWVcblxuICAvLyBBdm9pZCBBTlNJIHNlcXVlbmNlcyBpbiBub24taW50ZXJhY3RpdmUgb3V0cHV0IChwaXBlcywgQ0kgbG9ncywgZmlsZXMpLlxuICBjb25zdCBpc1R0eSA9IHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiBwcm9jZXNzLnN0ZG91dD8uaXNUVFkgPT09IHRydWVcbiAgcmV0dXJuIGVuYWJsZWRCeUNvbmZpZyAmJiBpc1R0eVxufVxuXG5jb25zdCBmb3JtYXRUaW1lc3RhbXAgPSAoZGF0ZTogRGF0ZSwgcGF0dGVybj86IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGlmICghcGF0dGVybikge1xuICAgIHJldHVybiBkYXRlLnRvSVNPU3RyaW5nKClcbiAgfVxuXG4gIGNvbnN0IHl5eXkgPSBTdHJpbmcoZGF0ZS5nZXRGdWxsWWVhcigpKVxuICBjb25zdCBtbSA9IHBhZDIoZGF0ZS5nZXRNb250aCgpICsgMSlcbiAgY29uc3QgZGQgPSBwYWQyKGRhdGUuZ2V0RGF0ZSgpKVxuICBjb25zdCBISCA9IHBhZDIoZGF0ZS5nZXRIb3VycygpKVxuICBjb25zdCBNTSA9IHBhZDIoZGF0ZS5nZXRNaW51dGVzKCkpXG4gIGNvbnN0IHNzID0gcGFkMihkYXRlLmdldFNlY29uZHMoKSlcbiAgY29uc3QgU1NTID0gcGFkMyhkYXRlLmdldE1pbGxpc2Vjb25kcygpKVxuXG4gIHJldHVybiBwYXR0ZXJuXG4gICAgLnJlcGxhY2VBbGwoJ3l5eXknLCB5eXl5KVxuICAgIC5yZXBsYWNlQWxsKCdtbScsIG1tKVxuICAgIC5yZXBsYWNlQWxsKCdkZCcsIGRkKVxuICAgIC5yZXBsYWNlQWxsKCdISCcsIEhIKVxuICAgIC5yZXBsYWNlQWxsKCdNTScsIE1NKVxuICAgIC5yZXBsYWNlQWxsKCdzcycsIHNzKVxuICAgIC5yZXBsYWNlQWxsKCdTU1MnLCBTU1MpXG59XG5cbi8qKiBSZXNvbHZlcyBjbGllbnQgSVAgZnJvbSB4LWZvcndhcmRlZC1mb3IgKGZpcnN0IElQKSBvciB4LXJlYWwtaXAuIEVtcHR5IHdoZW4gbmVpdGhlciBoZWFkZXIgaXMgc2V0IChlLmcuIGxvY2FsaG9zdCkuICovXG5jb25zdCBnZXRJcCA9IChyZXF1ZXN0OiBSZXF1ZXN0SW5mbyk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IGZvcndhcmRlZCA9IHJlcXVlc3QuaGVhZGVycy5nZXQoJ3gtZm9yd2FyZGVkLWZvcicpXG4gIGlmIChmb3J3YXJkZWQpIHtcbiAgICByZXR1cm4gZm9yd2FyZGVkLnNwbGl0KCcsJylbMF0/LnRyaW0oKSA/PyAnJ1xuICB9XG4gIHJldHVybiByZXF1ZXN0LmhlYWRlcnMuZ2V0KCd4LXJlYWwtaXAnKSA/PyAnJ1xufVxuXG5leHBvcnQgY29uc3QgZm9ybWF0RHVyYXRpb24gPSAobXM6IG51bWJlcik6IHN0cmluZyA9PiB7XG4gIGlmIChtcyA+PSAxMDAwKSB7XG4gICAgY29uc3Qgc2VjID0gbXMgLyAxMDAwXG4gICAgaWYgKHNlYyA+PSAxMCkge1xuICAgICAgcmV0dXJuIGAke01hdGgucm91bmQoc2VjKX1zYFxuICAgIH1cbiAgICBjb25zdCBvbmVEZWNpbWFsID0gc2VjLnRvRml4ZWQoMSlcbiAgICByZXR1cm4gb25lRGVjaW1hbC5lbmRzV2l0aCgnLjAnKSA/IGAke01hdGgucm91bmQoc2VjKX1zYCA6IGAke29uZURlY2ltYWx9c2BcbiAgfVxuICBpZiAobXMgPiAwICYmIG1zIDwgMSkge1xuICAgIHJldHVybiBgJHttcy50b0ZpeGVkKDIpfW1zYFxuICB9XG4gIHJldHVybiBgJHtNYXRoLnJvdW5kKG1zKX1tc2Bcbn1cblxuY29uc3QgZ2V0U2xvd1RocmVzaG9sZHMgPSAoXG4gIG9wdGlvbnM6IE9wdGlvbnNcbik6IHsgc2xvdzogbnVtYmVyOyB2ZXJ5U2xvdzogbnVtYmVyIH0gPT4ge1xuICBjb25zdCB7IGNvbmZpZyB9ID0gb3B0aW9uc1xuICByZXR1cm4ge1xuICAgIHNsb3c6IGNvbmZpZz8uc2xvd1RocmVzaG9sZCA/PyBERUZBVUxUX1NMT1dfTVMsXG4gICAgdmVyeVNsb3c6IGNvbmZpZz8udmVyeVNsb3dUaHJlc2hvbGQgPz8gREVGQVVMVF9WRVJZX1NMT1dfTVNcbiAgfVxufVxuXG5jb25zdCBjb2xvckR1cmF0aW9uVGV4dCA9IChcbiAgbXM6IG51bWJlcixcbiAgdXNlQ29sb3JzOiBib29sZWFuLFxuICBvcHRpb25zOiBPcHRpb25zXG4pOiB7IHRleHQ6IHN0cmluZzsgaXNWZXJ5U2xvdzogYm9vbGVhbiB9ID0+IHtcbiAgY29uc3QgcmF3ID0gZm9ybWF0RHVyYXRpb24obXMpXG4gIGNvbnN0IHsgc2xvdywgdmVyeVNsb3cgfSA9IGdldFNsb3dUaHJlc2hvbGRzKG9wdGlvbnMpXG4gIGNvbnN0IGlzVmVyeVNsb3cgPSBtcyA+PSB2ZXJ5U2xvd1xuXG4gIGlmICghdXNlQ29sb3JzKSB7XG4gICAgcmV0dXJuIHsgaXNWZXJ5U2xvdywgdGV4dDogcmF3IH1cbiAgfVxuXG4gIGxldCBjb2xvcmVkID0gcmF3XG4gIGlmIChtcyA8IHNsb3cpIHtcbiAgICBjb2xvcmVkID0gY2hhbGsuZ3JlZW4ocmF3KVxuICB9IGVsc2UgaWYgKG1zIDwgdmVyeVNsb3cpIHtcbiAgICBjb2xvcmVkID0gY2hhbGsueWVsbG93KHJhdylcbiAgfSBlbHNlIHtcbiAgICBjb2xvcmVkID0gY2hhbGsucmVkLmJvbGQocmF3KVxuICB9XG5cbiAgcmV0dXJuIHsgaXNWZXJ5U2xvdywgdGV4dDogY29sb3JlZCB9XG59XG5cbmNvbnN0IGdldFNwZWVkVG9rZW4gPSAoaXNWZXJ5U2xvdzogYm9vbGVhbiwgdXNlQ29sb3JzOiBib29sZWFuKTogc3RyaW5nID0+IHtcbiAgaWYgKCFpc1ZlcnlTbG93KSB7XG4gICAgcmV0dXJuICcnXG4gIH1cbiAgY29uc3QgYmFkZ2UgPSAn4pqhIHNsb3cnXG4gIGlmICghdXNlQ29sb3JzKSB7XG4gICAgcmV0dXJuIGAgJHtiYWRnZX1gXG4gIH1cbiAgcmV0dXJuIGAgJHtjaGFsay55ZWxsb3coYmFkZ2UpfWBcbn1cblxuLyoqIExvZ2l4bHlzaWEgYnJhbmQ6IGZveCBlbW9qaSB3aXRoIGxldmVsLWNvbG9yZWQgYmFja2dyb3VuZCB3aGVuIGNvbG9ycyBhcmUgZW5hYmxlZC4gKi9cbmNvbnN0IGdldExldmVsSWNvbiA9IChsZXZlbDogTG9nTGV2ZWwsIHVzZUNvbG9yczogYm9vbGVhbik6IHN0cmluZyA9PiB7XG4gIGlmICghdXNlQ29sb3JzKSB7XG4gICAgcmV0dXJuICfwn6aKJ1xuICB9XG4gIGlmIChsZXZlbCA9PT0gJ0VSUk9SJykge1xuICAgIHJldHVybiBjaGFsay5iZ1JlZC5ibGFjaygnIPCfpoogJylcbiAgfVxuICBpZiAobGV2ZWwgPT09ICdXQVJOSU5HJykge1xuICAgIHJldHVybiBjaGFsay5iZ1llbGxvdy5ibGFjaygnIPCfpoogJylcbiAgfVxuICBpZiAobGV2ZWwgPT09ICdERUJVRycpIHtcbiAgICByZXR1cm4gY2hhbGsuYmdCbHVlLmJsYWNrKCcg8J+miiAnKVxuICB9XG4gIHJldHVybiBjaGFsay5iZ0dyZWVuLmJsYWNrKCcg8J+miiAnKVxufVxuXG5jb25zdCBnZXRDb2xvcmVkTGV2ZWwgPSAobGV2ZWw6IExvZ0xldmVsLCB1c2VDb2xvcnM6IGJvb2xlYW4pOiBzdHJpbmcgPT4ge1xuICBpZiAoIXVzZUNvbG9ycykge1xuICAgIHJldHVybiBsZXZlbFxuICB9XG5cbiAgaWYgKGxldmVsID09PSAnRVJST1InKSB7XG4gICAgcmV0dXJuIGNoYWxrLmJnUmVkLmJsYWNrKGxldmVsKVxuICB9XG4gIGlmIChsZXZlbCA9PT0gJ1dBUk5JTkcnKSB7XG4gICAgcmV0dXJuIGNoYWxrLmJnWWVsbG93LmJsYWNrKGxldmVsKVxuICB9XG4gIGlmIChsZXZlbCA9PT0gJ0RFQlVHJykge1xuICAgIHJldHVybiBjaGFsay5iZ0JsdWUuYmxhY2sobGV2ZWwpXG4gIH1cblxuICByZXR1cm4gY2hhbGsuYmdHcmVlbi5ibGFjayhsZXZlbClcbn1cblxuY29uc3QgZ2V0Q29sb3JlZE1ldGhvZCA9IChtZXRob2Q6IHN0cmluZywgdXNlQ29sb3JzOiBib29sZWFuKTogc3RyaW5nID0+IHtcbiAgaWYgKCF1c2VDb2xvcnMpIHtcbiAgICByZXR1cm4gbWV0aG9kXG4gIH1cblxuICBjb25zdCB1cHBlciA9IG1ldGhvZC50b1VwcGVyQ2FzZSgpXG4gIGlmICh1cHBlciA9PT0gJ0dFVCcpIHtcbiAgICByZXR1cm4gY2hhbGsuZ3JlZW4uYm9sZCh1cHBlcilcbiAgfVxuICBpZiAodXBwZXIgPT09ICdQT1NUJykge1xuICAgIHJldHVybiBjaGFsay5ibHVlLmJvbGQodXBwZXIpXG4gIH1cbiAgaWYgKHVwcGVyID09PSAnUFVUJykge1xuICAgIHJldHVybiBjaGFsay55ZWxsb3cuYm9sZCh1cHBlcilcbiAgfVxuICBpZiAodXBwZXIgPT09ICdQQVRDSCcpIHtcbiAgICByZXR1cm4gY2hhbGsueWVsbG93QnJpZ2h0LmJvbGQodXBwZXIpXG4gIH1cbiAgaWYgKHVwcGVyID09PSAnREVMRVRFJykge1xuICAgIHJldHVybiBjaGFsay5yZWQuYm9sZCh1cHBlcilcbiAgfVxuICBpZiAodXBwZXIgPT09ICdPUFRJT05TJykge1xuICAgIHJldHVybiBjaGFsay5jeWFuLmJvbGQodXBwZXIpXG4gIH1cbiAgaWYgKHVwcGVyID09PSAnSEVBRCcpIHtcbiAgICByZXR1cm4gY2hhbGsuZ3JlZW5CcmlnaHQuYm9sZCh1cHBlcilcbiAgfVxuICBpZiAodXBwZXIgPT09ICdUUkFDRScpIHtcbiAgICByZXR1cm4gY2hhbGsubWFnZW50YS5ib2xkKHVwcGVyKVxuICB9XG4gIGlmICh1cHBlciA9PT0gJ0NPTk5FQ1QnKSB7XG4gICAgcmV0dXJuIGNoYWxrLmN5YW5CcmlnaHQuYm9sZCh1cHBlcilcbiAgfVxuXG4gIHJldHVybiBjaGFsay53aGl0ZS5ib2xkKHVwcGVyKVxufVxuXG5jb25zdCBnZXRDb2xvcmVkU3RhdHVzID0gKHN0YXR1czogc3RyaW5nLCB1c2VDb2xvcnM6IGJvb2xlYW4pOiBzdHJpbmcgPT4ge1xuICBpZiAoIXVzZUNvbG9ycykge1xuICAgIHJldHVybiBzdGF0dXNcbiAgfVxuXG4gIGNvbnN0IG51bWVyaWMgPSBOdW1iZXIucGFyc2VJbnQoc3RhdHVzLCAxMClcbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUobnVtZXJpYykpIHtcbiAgICByZXR1cm4gc3RhdHVzXG4gIH1cblxuICBpZiAobnVtZXJpYyA+PSA1MDApIHtcbiAgICByZXR1cm4gY2hhbGsucmVkKHN0YXR1cylcbiAgfVxuICBpZiAobnVtZXJpYyA+PSA0MDApIHtcbiAgICByZXR1cm4gY2hhbGsueWVsbG93KHN0YXR1cylcbiAgfVxuICBpZiAobnVtZXJpYyA+PSAzMDApIHtcbiAgICByZXR1cm4gY2hhbGsuY3lhbihzdGF0dXMpXG4gIH1cbiAgaWYgKG51bWVyaWMgPj0gMjAwKSB7XG4gICAgcmV0dXJuIGNoYWxrLmdyZWVuKHN0YXR1cylcbiAgfVxuICByZXR1cm4gY2hhbGsuZ3JheShzdGF0dXMpXG59XG5cbmNvbnN0IGdldENvbG9yZWRUaW1lc3RhbXAgPSAodGltZXN0YW1wOiBzdHJpbmcsIHVzZUNvbG9yczogYm9vbGVhbik6IHN0cmluZyA9PiB7XG4gIGlmICghdXNlQ29sb3JzKSB7XG4gICAgcmV0dXJuIHRpbWVzdGFtcFxuICB9XG5cbiAgcmV0dXJuIGNoYWxrLmdyYXkodGltZXN0YW1wKVxufVxuXG5jb25zdCBnZXRDb2xvcmVkUGF0aG5hbWUgPSAocGF0aG5hbWU6IHN0cmluZywgdXNlQ29sb3JzOiBib29sZWFuKTogc3RyaW5nID0+IHtcbiAgaWYgKCF1c2VDb2xvcnMpIHtcbiAgICByZXR1cm4gcGF0aG5hbWVcbiAgfVxuXG4gIHJldHVybiBjaGFsay53aGl0ZUJyaWdodChwYXRobmFtZSlcbn1cblxuY29uc3QgZ2V0U3RhdHVzVGV4dCA9IChzdGF0dXNDb2RlOiBudW1iZXIpOiBzdHJpbmcgPT4ge1xuICBjb25zdCB0ZXh0ID0gU1RBVFVTX0NPREVTW3N0YXR1c0NvZGVdXG4gIHJldHVybiB0ZXh0ID8/ICcnXG59XG5cbmNvbnN0IGdldFNlcnZpY2VUb2tlbiA9IChvcHRpb25zOiBPcHRpb25zLCB1c2VDb2xvcnM6IGJvb2xlYW4pOiBzdHJpbmcgPT4ge1xuICBjb25zdCBuYW1lID0gb3B0aW9ucy5jb25maWc/LnNlcnZpY2U/LnRyaW0oKVxuICBpZiAoIW5hbWUpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuICBjb25zdCBicmFja2V0ZWQgPSBgWyR7bmFtZX1dYFxuICBpZiAoIXVzZUNvbG9ycykge1xuICAgIHJldHVybiBgJHticmFja2V0ZWR9IGBcbiAgfVxuICByZXR1cm4gYCR7Y2hhbGsuZGltKGJyYWNrZXRlZCl9IGBcbn1cblxuY29uc3Qgc3RyaW5naWZ5VHJlZVZhbHVlID0gKHZhbHVlOiB1bmtub3duKTogc3RyaW5nID0+IHtcbiAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgcmV0dXJuICdudWxsJ1xuICB9XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuICd1bmRlZmluZWQnXG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykge1xuICAgIHJldHVybiBTdHJpbmcodmFsdWUpXG4gIH1cbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICByZXR1cm4gdmFsdWUubWVzc2FnZVxuICB9XG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlKVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gU3RyaW5nKHZhbHVlKVxuICB9XG59XG5cbi8qKiBOZXN0ZWQgb2JqZWN0cyB0byBleHBhbmQgaW4gdGhlIGNvbnRleHQgdHJlZSAoZXhjbHVkZXMgQXJyYXlzLCBFcnJvciwgRGF0ZSkuICovXG5jb25zdCBpc0V4cGFuZGFibGVPYmplY3QgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PlxuICB2YWx1ZSAhPT0gbnVsbCAmJlxuICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gICFBcnJheS5pc0FycmF5KHZhbHVlKSAmJlxuICAhKHZhbHVlIGluc3RhbmNlb2YgRXJyb3IpICYmXG4gICEodmFsdWUgaW5zdGFuY2VvZiBEYXRlKVxuXG5jb25zdCBjb2xsZWN0Q29udGV4dEVudHJpZXMgPSAoXG4gIG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIHByZWZpeDogc3RyaW5nLFxuICBkZXB0aFJlbWFpbmluZzogbnVtYmVyXG4pOiBbc3RyaW5nLCBzdHJpbmddW10gPT4ge1xuICBjb25zdCBvdXQ6IFtzdHJpbmcsIHN0cmluZ11bXSA9IFtdXG4gIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKG9iaikpIHtcbiAgICBjb25zdCBrZXkgPSBwcmVmaXggPyBgJHtwcmVmaXh9LiR7a31gIDoga1xuICAgIGNvbnN0IGV4cGFuZGFibGUgPSBpc0V4cGFuZGFibGVPYmplY3QodikgJiYgZGVwdGhSZW1haW5pbmcgPiAxXG5cbiAgICBpZiAoZXhwYW5kYWJsZSkge1xuICAgICAgb3V0LnB1c2goLi4uY29sbGVjdENvbnRleHRFbnRyaWVzKHYsIGtleSwgZGVwdGhSZW1haW5pbmcgLSAxKSlcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0LnB1c2goW2tleSwgc3RyaW5naWZ5VHJlZVZhbHVlKHYpXSlcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG91dFxufVxuXG5jb25zdCBmb3JtYXRFbnRyaWVzVG9UcmVlTGluZXMgPSAoXG4gIGVudHJpZXM6IFtzdHJpbmcsIHN0cmluZ11bXSxcbiAgdXNlQ29sb3JzOiBib29sZWFuXG4pOiBzdHJpbmdbXSA9PiB7XG4gIGlmIChlbnRyaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBbXVxuICB9XG5cbiAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW11cbiAgY29uc3QgbGFzdCA9IGVudHJpZXMubGVuZ3RoIC0gMVxuICBmb3IgKGxldCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBjb25zdCBicmFuY2ggPSBpID09PSBsYXN0ID8gJ+KUlOKUgCcgOiAn4pSc4pSAJ1xuICAgIGNvbnN0IHBhaXIgPSBlbnRyaWVzW2ldXG4gICAgaWYgKCFwYWlyKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBjb25zdCBbaywgdl0gPSBwYWlyXG4gICAgY29uc3Qga2V5UGFydCA9IHVzZUNvbG9ycyA/IGNoYWxrLmN5YW4oaykgOiBrXG4gICAgY29uc3QgdmFsUGFydCA9IHVzZUNvbG9ycyA/IGNoYWxrLndoaXRlKHYpIDogdlxuICAgIGxpbmVzLnB1c2goYCAgJHticmFuY2h9ICR7a2V5UGFydH0gICR7dmFsUGFydH1gKVxuICB9XG4gIHJldHVybiBsaW5lc1xufVxuXG5leHBvcnQgY29uc3QgcmVuZGVyQ29udGV4dFRyZWVMaW5lcyA9IChcbiAgY3R4OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgb3B0aW9uczogT3B0aW9ucyxcbiAgdXNlQ29sb3JzOiBib29sZWFuXG4pOiBzdHJpbmdbXSA9PiB7XG4gIGNvbnN0IGRlcHRoID0gb3B0aW9ucy5jb25maWc/LmNvbnRleHREZXB0aCA/PyAxXG4gIGlmIChkZXB0aCA8IDEpIHtcbiAgICByZXR1cm4gW11cbiAgfVxuXG4gIGNvbnN0IGVudHJpZXMgPSBjb2xsZWN0Q29udGV4dEVudHJpZXMoY3R4LCAnJywgZGVwdGgpXG4gIHJldHVybiBmb3JtYXRFbnRyaWVzVG9UcmVlTGluZXMoZW50cmllcywgdXNlQ29sb3JzKVxufVxuXG5jb25zdCBjb2xsZWN0U3RydWN0dXJlZEVycm9yRW50cmllcyA9IChlcnJvcjogdW5rbm93bik6IFtzdHJpbmcsIHN0cmluZ11bXSA9PiB7XG4gIGNvbnN0IGVudHJpZXM6IFtzdHJpbmcsIHN0cmluZ11bXSA9IFtdXG4gIGNvbnN0IG1zZyA9IHBhcnNlRXJyb3IoZXJyb3IpXG4gIGlmIChtc2cpIHtcbiAgICBlbnRyaWVzLnB1c2goWydlcnJvcicsIG1zZ10pXG4gIH1cbiAgaWYgKGlzU3RydWN0dXJlZEVycm9yKGVycm9yKSkge1xuICAgIGlmIChlcnJvci53aHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZW50cmllcy5wdXNoKFsnZXJyb3Iud2h5JywgU3RyaW5nKGVycm9yLndoeSldKVxuICAgIH1cbiAgICBpZiAoZXJyb3IuZml4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGVudHJpZXMucHVzaChbJ2Vycm9yLmZpeCcsIFN0cmluZyhlcnJvci5maXgpXSlcbiAgICB9XG4gICAgaWYgKGVycm9yLmxpbmsgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZW50cmllcy5wdXNoKFsnZXJyb3IubGluaycsIFN0cmluZyhlcnJvci5saW5rKV0pXG4gICAgfVxuICAgIGlmIChlcnJvci5pbnRlcm5hbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBlbnRyaWVzLnB1c2goWydlcnJvci5pbnRlcm5hbCcsIHN0cmluZ2lmeVRyZWVWYWx1ZShlcnJvci5pbnRlcm5hbCldKVxuICAgIH1cbiAgfVxuICByZXR1cm4gZW50cmllc1xufVxuXG5leHBvcnQgY29uc3QgYnVpbGRDb250ZXh0VHJlZUxpbmVzID0gKFxuICBsZXZlbDogTG9nTGV2ZWwsXG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBvcHRpb25zOiBPcHRpb25zXG4pOiBzdHJpbmdbXSA9PiB7XG4gIGlmIChvcHRpb25zLmNvbmZpZz8uc2hvd0NvbnRleHRUcmVlID09PSBmYWxzZSkge1xuICAgIHJldHVybiBbXVxuICB9XG5cbiAgY29uc3QgdXNlQ29sb3JzID0gc2hvdWxkVXNlQ29sb3JzKG9wdGlvbnMpXG4gIGNvbnN0IGRlcHRoID0gb3B0aW9ucy5jb25maWc/LmNvbnRleHREZXB0aCA/PyAxXG5cbiAgY29uc3QgZW50cmllczogW3N0cmluZywgc3RyaW5nXVtdID0gW11cblxuICBjb25zdCBjdHggPSBkYXRhLmNvbnRleHRcbiAgaWYgKFxuICAgIGN0eCAmJlxuICAgIHR5cGVvZiBjdHggPT09ICdvYmplY3QnICYmXG4gICAgIUFycmF5LmlzQXJyYXkoY3R4KSAmJlxuICAgIE9iamVjdC5rZXlzKGN0eCBhcyBvYmplY3QpLmxlbmd0aCA+IDAgJiZcbiAgICBkZXB0aCA+PSAxXG4gICkge1xuICAgIGVudHJpZXMucHVzaChcbiAgICAgIC4uLmNvbGxlY3RDb250ZXh0RW50cmllcyhjdHggYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sICcnLCBkZXB0aClcbiAgICApXG4gIH1cblxuICBpZiAobGV2ZWwgPT09ICdFUlJPUicgJiYgJ2Vycm9yJyBpbiBkYXRhICYmIGRhdGEuZXJyb3IgIT09IHVuZGVmaW5lZCkge1xuICAgIGVudHJpZXMucHVzaCguLi5jb2xsZWN0U3RydWN0dXJlZEVycm9yRW50cmllcyhkYXRhLmVycm9yKSlcbiAgfVxuXG4gIHJldHVybiBmb3JtYXRFbnRyaWVzVG9UcmVlTGluZXMoZW50cmllcywgdXNlQ29sb3JzKVxufVxuXG5jb25zdCBnZXRDb250ZXh0U3RyaW5nID0gKHZhbHVlOiB1bmtub3duKTogc3RyaW5nID0+IHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpXG4gIH1cblxuICByZXR1cm4gJydcbn1cblxuZXhwb3J0IGNvbnN0IGZvcm1hdExvZ091dHB1dCA9ICh7XG4gIGxldmVsLFxuICByZXF1ZXN0LFxuICBkYXRhLFxuICBzdG9yZSxcbiAgb3B0aW9uc1xufToge1xuICBsZXZlbDogTG9nTGV2ZWxcbiAgcmVxdWVzdDogUmVxdWVzdEluZm9cbiAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgc3RvcmU6IFN0b3JlRGF0YVxuICBvcHRpb25zOiBPcHRpb25zXG59KTogRm9ybWF0dGVkTG9nT3V0cHV0ID0+IHtcbiAgY29uc3QgeyBjb25maWcgfSA9IG9wdGlvbnNcbiAgY29uc3QgdXNlQ29sb3JzID0gc2hvdWxkVXNlQ29sb3JzKG9wdGlvbnMpXG4gIGNvbnN0IGZvcm1hdCA9IGNvbmZpZz8uY3VzdG9tTG9nRm9ybWF0ID8/IERFRkFVTFRfTE9HX0ZPUk1BVFxuXG4gIGNvbnN0IG5vdyA9IG5ldyBEYXRlKClcbiAgY29uc3QgZXBvY2ggPSBTdHJpbmcobm93LmdldFRpbWUoKSlcbiAgY29uc3QgcmF3VGltZXN0YW1wID0gZm9ybWF0VGltZXN0YW1wKG5vdywgY29uZmlnPy50aW1lc3RhbXA/LnRyYW5zbGF0ZVRpbWUpXG4gIGNvbnN0IHRpbWVzdGFtcCA9IGdldENvbG9yZWRUaW1lc3RhbXAocmF3VGltZXN0YW1wLCB1c2VDb2xvcnMpXG5cbiAgY29uc3QgbWVzc2FnZSA9IHR5cGVvZiBkYXRhLm1lc3NhZ2UgPT09ICdzdHJpbmcnID8gZGF0YS5tZXNzYWdlIDogJydcbiAgY29uc3QgZHVyYXRpb25NcyA9XG4gICAgc3RvcmUuYmVmb3JlVGltZSA9PT0gQmlnSW50KDApXG4gICAgICA/IDBcbiAgICAgIDogTnVtYmVyKHByb2Nlc3MuaHJ0aW1lLmJpZ2ludCgpIC0gc3RvcmUuYmVmb3JlVGltZSkgLyAxXzAwMF8wMDBcblxuICBsZXQgcmF3UGF0aG5hbWU6IHN0cmluZ1xuICBsZXQgc2VhcmNoOiBzdHJpbmdcbiAgdHJ5IHtcbiAgICA7KHsgcGF0aG5hbWU6IHJhd1BhdGhuYW1lLCBzZWFyY2ggfSA9IG5ldyBVUkwocmVxdWVzdC51cmwpKVxuICB9IGNhdGNoIHtcbiAgICByYXdQYXRobmFtZSA9IHJlcXVlc3QudXJsIHx8ICcvJ1xuICAgIHNlYXJjaCA9ICcnXG4gIH1cbiAgY29uc3QgcXVlcnkgPSBzZWFyY2hcbiAgY29uc3QgcGF0aG5hbWUgPSBjb25maWc/LmxvZ1F1ZXJ5UGFyYW1zXG4gICAgPyBgJHtyYXdQYXRobmFtZX0ke3F1ZXJ5fWBcbiAgICA6IHJhd1BhdGhuYW1lXG4gIGNvbnN0IHN0YXR1c1ZhbHVlID0gZGF0YS5zdGF0dXNcbiAgY29uc3Qgc3RhdHVzQ29kZSA9XG4gICAgc3RhdHVzVmFsdWUgPT09IG51bGwgfHwgc3RhdHVzVmFsdWUgPT09IHVuZGVmaW5lZFxuICAgICAgPyAyMDBcbiAgICAgIDogZ2V0U3RhdHVzQ29kZShzdGF0dXNWYWx1ZSlcbiAgY29uc3Qgc3RhdHVzID0gU3RyaW5nKHN0YXR1c0NvZGUpXG4gIGNvbnN0IGlwID0gY29uZmlnPy5pcCA9PT0gdHJ1ZSA/IGdldElwKHJlcXVlc3QpIDogJydcblxuICBjb25zdCBzaG93VHJlZSA9IGNvbmZpZz8uc2hvd0NvbnRleHRUcmVlICE9PSBmYWxzZVxuICBjb25zdCBjdHhTdHJpbmcgPVxuICAgIHNob3dUcmVlICYmXG4gICAgZGF0YS5jb250ZXh0ICYmXG4gICAgdHlwZW9mIGRhdGEuY29udGV4dCA9PT0gJ29iamVjdCcgJiZcbiAgICAhQXJyYXkuaXNBcnJheShkYXRhLmNvbnRleHQpICYmXG4gICAgT2JqZWN0LmtleXMoZGF0YS5jb250ZXh0IGFzIG9iamVjdCkubGVuZ3RoID4gMFxuICAgICAgPyAnJ1xuICAgICAgOiBnZXRDb250ZXh0U3RyaW5nKGRhdGEuY29udGV4dClcblxuICBjb25zdCBjb2xvcmVkTGV2ZWwgPSBnZXRDb2xvcmVkTGV2ZWwobGV2ZWwsIHVzZUNvbG9ycylcbiAgY29uc3QgbWV0aG9kUGFkZGVkID0gcmVxdWVzdC5tZXRob2QudG9VcHBlckNhc2UoKS5wYWRFbmQoTUVUSE9EX1BBRClcbiAgY29uc3QgY29sb3JlZE1ldGhvZCA9IGdldENvbG9yZWRNZXRob2QobWV0aG9kUGFkZGVkLCB1c2VDb2xvcnMpXG4gIGNvbnN0IGNvbG9yZWRQYXRobmFtZSA9IGdldENvbG9yZWRQYXRobmFtZShwYXRobmFtZSwgdXNlQ29sb3JzKVxuICBjb25zdCBjb2xvcmVkU3RhdHVzID0gZ2V0Q29sb3JlZFN0YXR1cyhzdGF0dXMsIHVzZUNvbG9ycylcbiAgY29uc3QgeyB0ZXh0OiBjb2xvcmVkRHVyYXRpb24sIGlzVmVyeVNsb3cgfSA9IGNvbG9yRHVyYXRpb25UZXh0KFxuICAgIGR1cmF0aW9uTXMsXG4gICAgdXNlQ29sb3JzLFxuICAgIG9wdGlvbnNcbiAgKVxuICBjb25zdCBzcGVlZFRva2VuID0gZ2V0U3BlZWRUb2tlbihpc1ZlcnlTbG93LCB1c2VDb2xvcnMpXG4gIGNvbnN0IGljb24gPSBnZXRMZXZlbEljb24obGV2ZWwsIHVzZUNvbG9ycylcbiAgY29uc3Qgc3RhdHVzVGV4dCA9IGdldFN0YXR1c1RleHQoc3RhdHVzQ29kZSlcbiAgY29uc3Qgc2VydmljZVRva2VuID0gZ2V0U2VydmljZVRva2VuKG9wdGlvbnMsIHVzZUNvbG9ycylcblxuICBjb25zdCB0b2tlbk1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAne2NvbnRleHR9JzogY3R4U3RyaW5nLFxuICAgICd7ZHVyYXRpb259JzogY29sb3JlZER1cmF0aW9uLFxuICAgICd7ZXBvY2h9JzogZXBvY2gsXG4gICAgJ3tpY29ufSc6IGljb24sXG4gICAgJ3tpcH0nOiBpcCxcbiAgICAne2xldmVsfSc6IGNvbG9yZWRMZXZlbCxcbiAgICAne21lc3NhZ2V9JzogbWVzc2FnZSxcbiAgICAne21ldGhvZH0nOiBjb2xvcmVkTWV0aG9kLFxuICAgICd7bm93fSc6IHRpbWVzdGFtcCxcbiAgICAne3BhdGh9JzogY29sb3JlZFBhdGhuYW1lLFxuICAgICd7cGF0aG5hbWV9JzogY29sb3JlZFBhdGhuYW1lLFxuICAgICd7cXVlcnl9JzogcXVlcnksXG4gICAgJ3tyZXF1ZXN0SWR9JzpcbiAgICAgIHR5cGVvZiBkYXRhLmNvbnRleHQgPT09ICdvYmplY3QnICYmXG4gICAgICBkYXRhLmNvbnRleHQgIT09IG51bGwgJiZcbiAgICAgICdyZXF1ZXN0SWQnIGluIGRhdGEuY29udGV4dFxuICAgICAgICA/IFN0cmluZygoZGF0YS5jb250ZXh0IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KS5yZXF1ZXN0SWQpXG4gICAgICAgIDogJycsXG4gICAgJ3tzZXJ2aWNlfSc6IHNlcnZpY2VUb2tlbixcbiAgICAne3NwZWVkfSc6IHNwZWVkVG9rZW4sXG4gICAgJ3tzdGF0dXN9JzogY29sb3JlZFN0YXR1cyxcbiAgICAne3N0YXR1c1RleHR9Jzogc3RhdHVzVGV4dFxuICB9XG5cbiAgY29uc3QgbWFpbiA9IGZvcm1hdC5yZXBsYWNlKFxuICAgIExPR19GT1JNQVRfUkVHRVgsXG4gICAgbWF0Y2ggPT4gdG9rZW5NYXBbbWF0Y2hdID8/IG1hdGNoXG4gIClcblxuICBjb25zdCBjb250ZXh0TGluZXMgPSBidWlsZENvbnRleHRUcmVlTGluZXMobGV2ZWwsIGRhdGEsIG9wdGlvbnMpXG5cbiAgcmV0dXJuIHsgY29udGV4dExpbmVzLCBtYWluIH1cbn1cblxuLyoqIEBkZXByZWNhdGVkIFByZWZlciB7QGxpbmsgZm9ybWF0TG9nT3V0cHV0fSBmb3IgbXVsdGktbGluZSBjb250ZXh0IHRyZWVzLiBSZXR1cm5zIHRoZSBtYWluIGxpbmUgb25seS4gKi9cbmV4cG9ydCBjb25zdCBmb3JtYXRMaW5lID0gKGlucHV0OiB7XG4gIGxldmVsOiBMb2dMZXZlbFxuICByZXF1ZXN0OiBSZXF1ZXN0SW5mb1xuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICBzdG9yZTogU3RvcmVEYXRhXG4gIG9wdGlvbnM6IE9wdGlvbnNcbn0pOiBzdHJpbmcgPT5cbiAgZm9ybWF0TG9nT3V0cHV0KHtcbiAgICAuLi5pbnB1dCxcbiAgICBvcHRpb25zOiB7XG4gICAgICAuLi5pbnB1dC5vcHRpb25zLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIC4uLmlucHV0Lm9wdGlvbnMuY29uZmlnLFxuICAgICAgICBzaG93Q29udGV4dFRyZWU6IGZhbHNlXG4gICAgICB9XG4gICAgfVxuICB9KS5tYWluXG5cbmV4cG9ydCBjb25zdCBsb2dXaXRoUGlubyA9IChcbiAgbG9nZ2VyOiBQaW5vLFxuICBsZXZlbDogTG9nTGV2ZWwsXG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4pOiB2b2lkID0+IHtcbiAgaWYgKGxldmVsID09PSAnRVJST1InKSB7XG4gICAgbG9nZ2VyLmVycm9yKGRhdGEpXG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKGxldmVsID09PSAnV0FSTklORycpIHtcbiAgICBsb2dnZXIud2FybihkYXRhKVxuICAgIHJldHVyblxuICB9XG4gIGlmIChsZXZlbCA9PT0gJ0RFQlVHJykge1xuICAgIGxvZ2dlci5kZWJ1ZyhkYXRhKVxuICAgIHJldHVyblxuICB9XG4gIGxvZ2dlci5pbmZvKGRhdGEpXG59XG4iLAogICAgImV4cG9ydCBjb25zdCBwYXJzZUVycm9yID0gKGVycm9yOiB1bmtub3duKTogc3RyaW5nID0+IHtcbiAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICByZXR1cm4gZXJyb3IubWVzc2FnZVxuICB9XG4gIGlmIChlcnJvciAmJiB0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmICdtZXNzYWdlJyBpbiBlcnJvcikge1xuICAgIHJldHVybiBlcnJvci5tZXNzYWdlIGFzIHN0cmluZ1xuICB9XG4gIHJldHVybiBTdHJpbmcoZXJyb3IpXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RydWN0dXJlZEVycm9yIHtcbiAgZml4Pzogc3RyaW5nXG4gIGludGVybmFsPzogdW5rbm93blxuICBsaW5rPzogc3RyaW5nXG4gIHdoeT86IHN0cmluZ1xufVxuXG5leHBvcnQgY29uc3QgaXNTdHJ1Y3R1cmVkRXJyb3IgPSAoXG4gIHZhbHVlOiB1bmtub3duXG4pOiB2YWx1ZSBpcyBTdHJ1Y3R1cmVkRXJyb3IgJiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PlxuICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gIHZhbHVlICE9PSBudWxsICYmXG4gICgnd2h5JyBpbiB2YWx1ZSB8fCAnZml4JyBpbiB2YWx1ZSB8fCAnbGluaycgaW4gdmFsdWUgfHwgJ2ludGVybmFsJyBpbiB2YWx1ZSlcbiIsCiAgICAiaW1wb3J0IHtcbiAgbWVyZ2VMb2dEYXRhQ29udGV4dCxcbiAgdHlwZSBSZXF1ZXN0Q29udGV4dFN0b3JlXG59IGZyb20gJy4uL2NvbnRleHQvcmVxdWVzdC1jb250ZXh0J1xuaW1wb3J0IHR5cGUgeyBMb2dMZXZlbCwgT3B0aW9ucywgUmVxdWVzdEluZm8sIFN0b3JlRGF0YSB9IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQgeyBsb2dUb1RyYW5zcG9ydHMgfSBmcm9tICcuLi9vdXRwdXQnXG5pbXBvcnQgeyBsb2dUb0ZpbGUgfSBmcm9tICcuLi9vdXRwdXQvZmlsZSdcbmltcG9ydCB7IHBhcnNlRXJyb3IgfSBmcm9tICcuLi91dGlscy9lcnJvcidcbmltcG9ydCB7IHJlZGFjdCwgcmVkYWN0UmVxdWVzdCB9IGZyb20gJy4uL3V0aWxzL3JlZGFjdCdcbmltcG9ydCB7IGZvcm1hdExvZ091dHB1dCB9IGZyb20gJy4vY3JlYXRlLWxvZ2dlcidcblxuY29uc3QgaXNFcnJvcldpdGhTdGF0dXMgPSAoXG4gIHZhbHVlOiB1bmtub3duXG4pOiB2YWx1ZSBpcyB7IHN0YXR1czogbnVtYmVyOyBtZXNzYWdlPzogc3RyaW5nIH0gPT5cbiAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAnc3RhdHVzJyBpbiB2YWx1ZSAmJlxuICB0eXBlb2YgKHZhbHVlIGFzIHsgc3RhdHVzPzogdW5rbm93biB9KS5zdGF0dXMgPT09ICdudW1iZXInXG5cbmV4cG9ydCBjb25zdCBoYW5kbGVIdHRwRXJyb3IgPSAoXG4gIHJlcXVlc3Q6IFJlcXVlc3RJbmZvLFxuICBlcnJvcjogdW5rbm93bixcbiAgc3RvcmU6IFN0b3JlRGF0YSxcbiAgb3B0aW9uczogT3B0aW9ucyxcbiAgY29udGV4dFN0b3JlPzogUmVxdWVzdENvbnRleHRTdG9yZVxuKTogdm9pZCA9PiB7XG4gIGNvbnN0IHsgY29uZmlnIH0gPSBvcHRpb25zXG5cbiAgY29uc3Qgc3RhdHVzID0gaXNFcnJvcldpdGhTdGF0dXMoZXJyb3IpID8gZXJyb3Iuc3RhdHVzIDogNTAwXG4gIGxldCBsZXZlbDogTG9nTGV2ZWwgPSAnRVJST1InXG4gIGlmIChzdGF0dXMgPCA1MDAgJiYgc3RhdHVzID49IDQwMCkge1xuICAgIGxldmVsID0gJ1dBUk5JTkcnXG4gIH1cblxuICBjb25zdCBsb2dGaWx0ZXIgPSBjb25maWc/LmxvZ0ZpbHRlclxuICBpZiAoXG4gICAgbG9nRmlsdGVyPy5sZXZlbCAmJlxuICAgIGxvZ0ZpbHRlci5sZXZlbC5sZW5ndGggPiAwICYmXG4gICAgIWxvZ0ZpbHRlci5sZXZlbC5pbmNsdWRlcyhsZXZlbClcbiAgKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCB1c2VUcmFuc3BvcnRzT25seSA9IGNvbmZpZz8udXNlVHJhbnNwb3J0c09ubHkgPT09IHRydWVcbiAgY29uc3QgZGlzYWJsZUludGVybmFsTG9nZ2VyID0gY29uZmlnPy5kaXNhYmxlSW50ZXJuYWxMb2dnZXIgPT09IHRydWVcbiAgY29uc3QgZGlzYWJsZUZpbGVMb2dnaW5nID0gY29uZmlnPy5kaXNhYmxlRmlsZUxvZ2dpbmcgPT09IHRydWVcblxuICBjb25zdCBtZXNzYWdlID0gcGFyc2VFcnJvcihlcnJvcilcblxuICBjb25zdCBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHsgZXJyb3IsIG1lc3NhZ2UsIHN0YXR1cyB9XG4gIGNvbnN0IGRhdGFXaXRoQ29udGV4dCA9IGNvbnRleHRTdG9yZVxuICAgID8gbWVyZ2VMb2dEYXRhQ29udGV4dChkYXRhLCBjb250ZXh0U3RvcmUuZ2V0Q29udGV4dChyZXF1ZXN0KSlcbiAgICA6IGRhdGFcbiAgY29uc3QgbG9nRGF0YSA9XG4gICAgY29uZmlnPy5hdXRvUmVkYWN0ID09PSB0cnVlID8gcmVkYWN0KGRhdGFXaXRoQ29udGV4dCkgOiBkYXRhV2l0aENvbnRleHRcbiAgY29uc3QgbG9nUmVxdWVzdCA9XG4gICAgY29uZmlnPy5hdXRvUmVkYWN0ID09PSB0cnVlID8gcmVkYWN0UmVxdWVzdChyZXF1ZXN0KSA6IHJlcXVlc3RcblxuICBsb2dUb1RyYW5zcG9ydHMoeyBkYXRhOiBsb2dEYXRhLCBsZXZlbCwgb3B0aW9ucywgcmVxdWVzdDogbG9nUmVxdWVzdCwgc3RvcmUgfSlcblxuICBpZiAoISh1c2VUcmFuc3BvcnRzT25seSB8fCBkaXNhYmxlRmlsZUxvZ2dpbmcpKSB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBjb25maWc/LmxvZ0ZpbGVQYXRoXG4gICAgaWYgKGZpbGVQYXRoKSB7XG4gICAgICBsb2dUb0ZpbGUoe1xuICAgICAgICBkYXRhOiBsb2dEYXRhLFxuICAgICAgICBmaWxlUGF0aCxcbiAgICAgICAgbGV2ZWwsXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICAgIHJlcXVlc3Q6IGxvZ1JlcXVlc3QsXG4gICAgICAgIHN0b3JlXG4gICAgICB9KS5jYXRjaCgoKSA9PiB7XG4gICAgICAgIC8vIElnbm9yZSBlcnJvcnNcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgaWYgKHVzZVRyYW5zcG9ydHNPbmx5IHx8IGRpc2FibGVJbnRlcm5hbExvZ2dlcikge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgeyBtYWluLCBjb250ZXh0TGluZXMgfSA9IGZvcm1hdExvZ091dHB1dCh7XG4gICAgZGF0YTogbG9nRGF0YSxcbiAgICBsZXZlbCxcbiAgICBvcHRpb25zLFxuICAgIHJlcXVlc3Q6IGxvZ1JlcXVlc3QsXG4gICAgc3RvcmVcbiAgfSlcblxuICBjb25zdCBmb3JtYXR0ZWRNZXNzYWdlID1cbiAgICBjb250ZXh0TGluZXMubGVuZ3RoID4gMCA/IGAke21haW59XFxuJHtjb250ZXh0TGluZXMuam9pbignXFxuJyl9YCA6IG1haW5cbiAgY29uc29sZS5lcnJvcihmb3JtYXR0ZWRNZXNzYWdlKVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IFJlcXVlc3RJZENvbmZpZyB9IGZyb20gJy4uL2ludGVyZmFjZXMnXG5cbmNvbnN0IERFRkFVTFRfSEVBREVSID0gJ1gtUmVxdWVzdC1JZCdcblxuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZFJlcXVlc3RJZENvbmZpZyB7XG4gIGVuYWJsZWQ6IGJvb2xlYW5cbiAgZ2VuZXJhdG9yOiAoKSA9PiBzdHJpbmdcbiAgaGVhZGVyOiBzdHJpbmdcbn1cblxuLyoqXG4gKiBOb3JtYWxpc2VzIHRoZSBgcmVxdWVzdElkYCBvcHRpb24gaW50byBhIGNvbmNyZXRlIGNvbmZpZyBvYmplY3QuXG4gKlxuICogLSBgdW5kZWZpbmVkYCAvIGBmYWxzZWAg4oaSIGBudWxsYCAoZGlzYWJsZWQpXG4gKiAtIGB0cnVlYCDihpIgZGVmYXVsdCBjb25maWdcbiAqIC0gYFJlcXVlc3RJZENvbmZpZ2Ag4oaSIG1lcmdlZCB3aXRoIGRlZmF1bHRzOyBgZW5hYmxlZDogZmFsc2VgIGluc2lkZSB0aGUgb2JqZWN0IGRpc2FibGVzIHRoZSBmZWF0dXJlXG4gKi9cbmV4cG9ydCBjb25zdCByZXNvbHZlUmVxdWVzdElkQ29uZmlnID0gKFxuICByYXc/OiBib29sZWFuIHwgUmVxdWVzdElkQ29uZmlnXG4pOiBSZXNvbHZlZFJlcXVlc3RJZENvbmZpZyB8IG51bGwgPT4ge1xuICBpZiAocmF3ID09PSB1bmRlZmluZWQgfHwgcmF3ID09PSBmYWxzZSkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBpZiAocmF3ID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICBnZW5lcmF0b3I6ICgpID0+IGNyeXB0by5yYW5kb21VVUlEKCksXG4gICAgICBoZWFkZXI6IERFRkFVTFRfSEVBREVSXG4gICAgfVxuICB9XG5cbiAgLy8gT2JqZWN0IGZvcm0g4oCUIGBlbmFibGVkYCBkZWZhdWx0cyB0byBgdHJ1ZWAgd2hlbiB0aGUgb2JqZWN0IGlzIHByb3ZpZGVkXG4gIGlmIChyYXcuZW5hYmxlZCA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBlbmFibGVkOiB0cnVlLFxuICAgIGdlbmVyYXRvcjogcmF3LmdlbmVyYXRvciA/PyAoKCkgPT4gY3J5cHRvLnJhbmRvbVVVSUQoKSksXG4gICAgaGVhZGVyOiByYXcuaGVhZGVyPy50cmltKCkgfHwgREVGQVVMVF9IRUFERVJcbiAgfVxufVxuXG4vKipcbiAqIFJlYWRzIGFuIGV4aXN0aW5nIHJlcXVlc3QgSUQgZnJvbSB0aGUgaW5jb21pbmcgcmVxdWVzdCBoZWFkZXIsIG9yIGdlbmVyYXRlcyBhXG4gKiBuZXcgb25lIHVzaW5nIHRoZSBjb25maWd1cmVkIGdlbmVyYXRvci5cbiAqL1xuZXhwb3J0IGNvbnN0IGdldE9yQ3JlYXRlUmVxdWVzdElkID0gKFxuICByZXF1ZXN0OiBSZXF1ZXN0LFxuICBjb25maWc6IFJlc29sdmVkUmVxdWVzdElkQ29uZmlnXG4pOiBzdHJpbmcgPT4ge1xuICBjb25zdCBleGlzdGluZyA9IHJlcXVlc3QuaGVhZGVycy5nZXQoY29uZmlnLmhlYWRlcilcbiAgaWYgKGV4aXN0aW5nKSB7XG4gICAgcmV0dXJuIGV4aXN0aW5nXG4gIH1cbiAgcmV0dXJuIGNvbmZpZy5nZW5lcmF0b3IoKVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IFJlcXVlc3RDb250ZXh0U3RvcmUgfSBmcm9tICcuLi9jb250ZXh0L3JlcXVlc3QtY29udGV4dCdcbmltcG9ydCB0eXBlIHsgTG9nZ2VyLCBPcHRpb25zLCBTdG9yZURhdGEgfSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIFdlYlNvY2tldExpa2Uge1xuICByZWFkb25seSBkYXRhPzogeyBzdG9yZT86IHsgbG9nZ2VyPzogTG9nZ2VyIH0gfVxuICByZWFkb25seSBpZD86IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdzSGFuZGxlckhvb2tzPFxuICBUTWVzc2FnZSA9IHVua25vd24sXG4gIFRXcyBleHRlbmRzIFdlYlNvY2tldExpa2UgPSBXZWJTb2NrZXRMaWtlXG4+IHtcbiAgY2xvc2U/OiAod3M6IFRXcykgPT4gdm9pZFxuICBtZXNzYWdlPzogKHdzOiBUV3MsIG1lc3NhZ2U6IFRNZXNzYWdlKSA9PiB2b2lkXG4gIG9wZW4/OiAod3M6IFRXcykgPT4gdm9pZFxufVxuXG5jb25zdCB3c1N5bnRoZXRpY1JlcXVlc3QgPSAocGF0aDogc3RyaW5nKTogUmVxdWVzdCA9PlxuICBuZXcgUmVxdWVzdChgaHR0cDovL2xvZ2l4bHlzaWEubG9jYWwke3BhdGh9YCwgeyBtZXRob2Q6ICdXUycgfSlcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVdzSGFuZGxlcldyYXBwZXIgPSAoXG4gIG9wdGlvbnM6IE9wdGlvbnMsXG4gIGxvZ2dlcjogTG9nZ2VyLFxuICBjb250ZXh0U3RvcmU6IFJlcXVlc3RDb250ZXh0U3RvcmVcbikgPT4ge1xuICBjb25zdCB3c1RpbWluZ3MgPSBuZXcgV2Vha01hcDxvYmplY3QsIGJpZ2ludD4oKVxuXG4gIGNvbnN0IGxvZ1dzID0gKFxuICAgIGxldmVsOiAnSU5GTycgfCAnV0FSTklORycgfCAnRVJST1InLFxuICAgIHdzOiBXZWJTb2NrZXRMaWtlLFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgZXh0cmE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApOiB2b2lkID0+IHtcbiAgICBjb25zdCBrZXkgPSB3cyBhcyBvYmplY3RcbiAgICBjb25zdCBiZWZvcmVUaW1lID0gd3NUaW1pbmdzLmdldChrZXkpID8/IHByb2Nlc3MuaHJ0aW1lLmJpZ2ludCgpXG4gICAgY29uc3Qgc3RvcmU6IFN0b3JlRGF0YSA9IHsgYmVmb3JlVGltZSB9XG4gICAgY29uc3QgYWNjdW11bGF0ZWQgPSBjb250ZXh0U3RvcmUuZ2V0Q29udGV4dChrZXkpXG4gICAgY29uc3QgY29udGV4dCA9XG4gICAgICBPYmplY3Qua2V5cyhhY2N1bXVsYXRlZCkubGVuZ3RoID4gMCB8fCBleHRyYVxuICAgICAgICA/IHsgLi4uYWNjdW11bGF0ZWQsIC4uLmV4dHJhLCB3c0lkOiB3cy5pZCB9XG4gICAgICAgIDogeyB3c0lkOiB3cy5pZCB9XG5cbiAgICBsb2dnZXIubG9nKFxuICAgICAgbGV2ZWwsXG4gICAgICB3c1N5bnRoZXRpY1JlcXVlc3QocGF0aCksXG4gICAgICB7IGNvbnRleHQsIG1lc3NhZ2UsIHN0YXR1czogMjAwIH0sXG4gICAgICBzdG9yZVxuICAgIClcbiAgfVxuXG4gIHJldHVybiA8XG4gICAgVE1lc3NhZ2UsXG4gICAgVFdzIGV4dGVuZHMgV2ViU29ja2V0TGlrZSxcbiAgICBjb25zdCBUSG9va3MgZXh0ZW5kcyBXc0hhbmRsZXJIb29rczxUTWVzc2FnZSwgVFdzPlxuICA+KFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBob29rczogVEhvb2tzXG4gICk6IFRIb29rcyA9PlxuICAgICh7XG4gICAgICAuLi5ob29rcyxcbiAgICAgIGNsb3NlKHdzKSB7XG4gICAgICAgIGhvb2tzLmNsb3NlPy4od3MpXG4gICAgICAgIGlmIChvcHRpb25zLmNvbmZpZz8uZGlzYWJsZVdlYlNvY2tldExvZ2dpbmcgIT09IHRydWUpIHtcbiAgICAgICAgICBsb2dXcygnSU5GTycsIHdzLCBwYXRoLCAnV2ViU29ja2V0IGNsb3NlZCcpXG4gICAgICAgIH1cbiAgICAgICAgY29udGV4dFN0b3JlLmNsZWFyQ29udGV4dCh3cyBhcyBvYmplY3QpXG4gICAgICAgIHdzVGltaW5ncy5kZWxldGUod3MgYXMgb2JqZWN0KVxuICAgICAgfSxcbiAgICAgIG1lc3NhZ2Uod3MsIG1lc3NhZ2UpIHtcbiAgICAgICAgaG9va3MubWVzc2FnZT8uKHdzLCBtZXNzYWdlKVxuICAgICAgICBpZiAob3B0aW9ucy5jb25maWc/LmRpc2FibGVXZWJTb2NrZXRMb2dnaW5nICE9PSB0cnVlKSB7XG4gICAgICAgICAgbG9nV3MoJ0lORk8nLCB3cywgcGF0aCwgJ1dlYlNvY2tldCBtZXNzYWdlJywge1xuICAgICAgICAgICAgcGF5bG9hZFR5cGU6IHR5cGVvZiBtZXNzYWdlXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIG9wZW4od3MpIHtcbiAgICAgICAgd3NUaW1pbmdzLnNldCh3cyBhcyBvYmplY3QsIHByb2Nlc3MuaHJ0aW1lLmJpZ2ludCgpKVxuICAgICAgICBob29rcy5vcGVuPy4od3MpXG4gICAgICAgIGlmIChvcHRpb25zLmNvbmZpZz8uZGlzYWJsZVdlYlNvY2tldExvZ2dpbmcgIT09IHRydWUpIHtcbiAgICAgICAgICBsb2dXcygnSU5GTycsIHdzLCBwYXRoLCAnV2ViU29ja2V0IG9wZW5lZCcpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KSBhcyBUSG9va3Ncbn1cbiIKICBdLAogICJtYXBwaW5ncyI6ICJBQUFBLGlCQUFTLGdCQ0FULG1CQUFTLGlCQUNULG1CQUFTLGNBQVUsbUJBRW5CLElBQU0sR0FBYSxxQ0FDYixHQUFpQixrQkFDakIsR0FDSix3RUFFVyxFQUFZLENBQUMsSUFBbUMsQ0FDM0QsR0FBSSxPQUFPLElBQVUsU0FBVSxDQUM3QixHQUFJLENBQUMsT0FBTyxTQUFTLENBQUssR0FBSyxHQUFTLEVBQ3RDLE1BQVUsTUFBTSxpQkFBaUIsR0FBTyxFQUUxQyxPQUFPLEVBR1QsSUFBTSxFQUFVLEVB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
|
package/dist/otel.d.ts
CHANGED
|
@@ -27,4 +27,4 @@ interface TraceContextFields {
|
|
|
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
29
|
declare const __resetForTesting: () => void;
|
|
30
|
-
export { injectTraceContext,
|
|
30
|
+
export { injectTraceContext, __resetForTesting, TraceContextFields };
|
package/dist/otel.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{createRequire as
|
|
1
|
+
import{createRequire as C}from"node:module";var D=C(import.meta.url),b,E=()=>{if(b!==void 0)return b;try{b=D("@opentelemetry/api")}catch{b=null}return b},G=(w,x)=>{let j=E();if(!j)return;let k=j.trace.getSpan(j.context.active());if(!k)return;let{traceId:z,spanId:B}=k.spanContext(),v={span_id:B,trace_id:z};return w.mergeContext(x,v),v},H=()=>{b=void 0};export{G as injectTraceContext,H as __resetForTesting};
|
|
2
2
|
|
|
3
|
-
//# debugId=
|
|
4
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL290ZWwudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gJ25vZGU6bW9kdWxlJ1xuaW1wb3J0IHR5cGUgeyBMb2dnZXIgfSBmcm9tICcuL2ludGVyZmFjZXMnXG5cbmNvbnN0IHJlcXVpcmVPdGVsID0gY3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpXG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhY2VDb250ZXh0RmllbGRzIHtcbiAgc3Bhbl9pZD86IHN0cmluZ1xuICB0cmFjZV9pZD86IHN0cmluZ1xufVxuXG5pbnRlcmZhY2UgT3RlbEFwaSB7XG4gIGNvbnRleHQ6IHsgYWN0aXZlOiAoKSA9PiB1bmtub3duIH1cbiAgdHJhY2U6IHtcbiAgICBnZXRTcGFuOiAoXG4gICAgICBjdHg6IHVua25vd25cbiAgICApID0+IHsgc3BhbkNvbnRleHQ6ICgpID0+
|
|
3
|
+
//# debugId=7368325CD5F9403C64756E2164756E21
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL290ZWwudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gJ25vZGU6bW9kdWxlJ1xuaW1wb3J0IHR5cGUgeyBMb2dnZXIgfSBmcm9tICcuL2ludGVyZmFjZXMnXG5cbmNvbnN0IHJlcXVpcmVPdGVsID0gY3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpXG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhY2VDb250ZXh0RmllbGRzIHtcbiAgc3Bhbl9pZD86IHN0cmluZ1xuICB0cmFjZV9pZD86IHN0cmluZ1xufVxuXG5pbnRlcmZhY2UgT3RlbEFwaSB7XG4gIGNvbnRleHQ6IHsgYWN0aXZlOiAoKSA9PiB1bmtub3duIH1cbiAgdHJhY2U6IHtcbiAgICBnZXRTcGFuOiAoXG4gICAgICBjdHg6IHVua25vd25cbiAgICApID0+IHsgc3BhbkNvbnRleHQ6ICgpID0+IHsgdHJhY2VJZDogc3RyaW5nOyBzcGFuSWQ6IHN0cmluZyB9IH0gfCB1bmRlZmluZWRcbiAgfVxufVxuXG5sZXQgb3RlbEFwaTogT3RlbEFwaSB8IG51bGwgfCB1bmRlZmluZWRcblxuY29uc3QgZ2V0T3RlbEFwaSA9ICgpOiBPdGVsQXBpIHwgbnVsbCA9PiB7XG4gIGlmIChvdGVsQXBpICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gb3RlbEFwaVxuICB9XG4gIHRyeSB7XG4gICAgb3RlbEFwaSA9IHJlcXVpcmVPdGVsKCdAb3BlbnRlbGVtZXRyeS9hcGknKSBhcyBPdGVsQXBpXG4gIH0gY2F0Y2gge1xuICAgIG90ZWxBcGkgPSBudWxsXG4gIH1cbiAgcmV0dXJuIG90ZWxBcGlcbn1cblxuLyoqXG4gKiBJbmplY3RzIGFjdGl2ZSBPcGVuVGVsZW1ldHJ5IHNwYW4gSURzIGludG8gdGhlIHJlcXVlc3QgY29udGV4dCBiYWcgd2hlblxuICogYEBvcGVudGVsZW1ldHJ5L2FwaWAgaXMgaW5zdGFsbGVkIGFuZCBhIHNwYW4gaXMgYWN0aXZlLlxuICovXG5leHBvcnQgY29uc3QgaW5qZWN0VHJhY2VDb250ZXh0ID0gKFxuICBsb2dnZXI6IFBpY2s8TG9nZ2VyLCAnbWVyZ2VDb250ZXh0Jz4sXG4gIHJlcXVlc3Q6IFJlcXVlc3Rcbik6IFRyYWNlQ29udGV4dEZpZWxkcyB8IHVuZGVmaW5lZCA9PiB7XG4gIGNvbnN0IGFwaSA9IGdldE90ZWxBcGkoKVxuICBpZiAoIWFwaSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3Qgc3BhbiA9IGFwaS50cmFjZS5nZXRTcGFuKGFwaS5jb250ZXh0LmFjdGl2ZSgpKVxuICBpZiAoIXNwYW4pIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHsgdHJhY2VJZCwgc3BhbklkIH0gPSBzcGFuLnNwYW5Db250ZXh0KClcbiAgY29uc3QgZmllbGRzID0ge1xuICAgIHNwYW5faWQ6IHNwYW5JZCxcbiAgICB0cmFjZV9pZDogdHJhY2VJZFxuICB9IHNhdGlzZmllcyBUcmFjZUNvbnRleHRGaWVsZHNcbiAgbG9nZ2VyLm1lcmdlQ29udGV4dChyZXF1ZXN0LCBmaWVsZHMpXG4gIHJldHVybiBmaWVsZHNcbn1cblxuLyoqIEBpbnRlcm5hbCBSZXNldCB0aGUgY2FjaGVkIE9UZWwgQVBJIHJlZmVyZW5jZS4gT25seSBpbnRlbmRlZCBmb3IgdGVzdHMuICovXG5leHBvcnQgY29uc3QgX19yZXNldEZvclRlc3RpbmcgPSAoKTogdm9pZCA9PiB7XG4gIG90ZWxBcGkgPSB1bmRlZmluZWRcbn1cbiIKICBdLAogICJtYXBwaW5ncyI6ICJBQUFBLHdCQUFTLG9CQUdULElBQU0sRUFBYyxFQUFjLFlBQVksR0FBRyxFQWdCN0MsRUFFRSxFQUFhLElBQXNCLENBQ3ZDLEdBQUksSUFBWSxPQUNkLE9BQU8sRUFFVCxHQUFJLENBQ0YsRUFBVSxFQUFZLG9CQUFvQixFQUMxQyxLQUFNLENBQ04sRUFBVSxLQUVaLE9BQU8sR0FPSSxFQUFxQixDQUNoQyxFQUNBLElBQ21DLENBQ25DLElBQU0sRUFBTSxFQUFXLEVBQ3ZCLEdBQUksQ0FBQyxFQUNILE9BR0YsSUFBTSxFQUFPLEVBQUksTUFBTSxRQUFRLEVBQUksUUFBUSxPQUFPLENBQUMsRUFDbkQsR0FBSSxDQUFDLEVBQ0gsT0FHRixJQUFRLFVBQVMsVUFBVyxFQUFLLFlBQVksRUFDdkMsRUFBUyxDQUNiLFFBQVMsRUFDVCxTQUFVLENBQ1osRUFFQSxPQURBLEVBQU8sYUFBYSxFQUFTLENBQU0sRUFDNUIsR0FJSSxFQUFvQixJQUFZLENBQzNDLEVBQVUiLAogICJkZWJ1Z0lkIjogIjczNjgzMjVDRDVGOTQwM0M2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9
|
package/package.json
CHANGED
|
@@ -1,9 +1,23 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "logixlysia",
|
|
3
|
-
"version": "6.
|
|
3
|
+
"version": "6.6.1",
|
|
4
4
|
"description": "🦊 Logixlysia is a logger for Elysia",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"logixlysia",
|
|
7
|
+
"elysiajs",
|
|
8
|
+
"logger"
|
|
9
|
+
],
|
|
10
|
+
"homepage": "https://logixlysia.vercel.app",
|
|
11
|
+
"bugs": {
|
|
12
|
+
"url": "https://github.com/PunGrumpy/logixlysia/issues"
|
|
13
|
+
},
|
|
14
|
+
"repository": {
|
|
15
|
+
"type": "git",
|
|
16
|
+
"url": "git+https://github.com/PunGrumpy/logixlysia.git"
|
|
17
|
+
},
|
|
18
|
+
"license": "MIT",
|
|
19
|
+
"author": "Noppakorn Kaewsalabnil <hello@pungrumpy.com>",
|
|
5
20
|
"type": "module",
|
|
6
|
-
"main": "dist/index.js",
|
|
7
21
|
"exports": {
|
|
8
22
|
".": {
|
|
9
23
|
"types": "./dist/index.d.ts",
|
|
@@ -22,39 +36,21 @@
|
|
|
22
36
|
},
|
|
23
37
|
"./package.json": "./package.json"
|
|
24
38
|
},
|
|
39
|
+
"main": "dist/index.js",
|
|
25
40
|
"files": [
|
|
26
41
|
"dist",
|
|
27
42
|
"README.md"
|
|
28
43
|
],
|
|
29
44
|
"scripts": {
|
|
30
|
-
"dev": "bunup --watch",
|
|
31
45
|
"build": "bunup",
|
|
46
|
+
"clean": "git clean -fdx .turbo dist node_modules coverage",
|
|
47
|
+
"dev": "bunup --watch",
|
|
32
48
|
"test": "bun test",
|
|
33
49
|
"test:coverage": "bun test --coverage --coverage-reporter=lcov",
|
|
34
|
-
"clean": "git clean -fdx .turbo dist node_modules coverage",
|
|
35
50
|
"typecheck": "tsc --noEmit --emitDeclarationOnly false"
|
|
36
51
|
},
|
|
37
|
-
"author": "Noppakorn Kaewsalabnil <hello@pungrumpy.com>",
|
|
38
|
-
"bugs": {
|
|
39
|
-
"url": "https://github.com/PunGrumpy/logixlysia/issues"
|
|
40
|
-
},
|
|
41
|
-
"homepage": "https://logixlysia.vercel.app",
|
|
42
|
-
"keywords": [
|
|
43
|
-
"logixlysia",
|
|
44
|
-
"elysiajs",
|
|
45
|
-
"logger"
|
|
46
|
-
],
|
|
47
|
-
"license": "MIT",
|
|
48
|
-
"publishConfig": {
|
|
49
|
-
"access": "public",
|
|
50
|
-
"registry": "https://registry.npmjs.org/"
|
|
51
|
-
},
|
|
52
|
-
"repository": {
|
|
53
|
-
"type": "git",
|
|
54
|
-
"url": "git+https://github.com/PunGrumpy/logixlysia.git"
|
|
55
|
-
},
|
|
56
52
|
"dependencies": {
|
|
57
|
-
"chalk": "^
|
|
53
|
+
"chalk": "^6.0.0",
|
|
58
54
|
"pino": "^10.3.1",
|
|
59
55
|
"pino-pretty": "^13.1.3"
|
|
60
56
|
},
|
|
@@ -77,5 +73,9 @@
|
|
|
77
73
|
"ai": {
|
|
78
74
|
"optional": true
|
|
79
75
|
}
|
|
76
|
+
},
|
|
77
|
+
"publishConfig": {
|
|
78
|
+
"access": "public",
|
|
79
|
+
"registry": "https://registry.npmjs.org/"
|
|
80
80
|
}
|
|
81
81
|
}
|