@pori15/logixlysia 6.0.10 → 6.0.12

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 CHANGED
@@ -1,79 +1,79 @@
1
- <div align="center">
2
- <h1><code>🦊</code> Logixlysia</h1>
3
- <strong>Logixlysia is a logging library for ElysiaJS</strong>
4
- <img src="https://github.com/PunGrumpy/logixlysia/blob/main/apps/docs/app/opengraph-image.png?raw=true" alt="Logixlysia" width="100%" height="auto" />
5
- </div>
6
-
7
- ## `📩` Installation
8
-
9
- ```bash
10
- bun add @pori15/logixlysia
11
- ```
12
-
13
- ## `📝` Usage
14
-
15
- ### Basic
16
-
17
- ```ts
18
- import { Elysia } from 'elysia'
19
- import logixlysia from 'logixlysia'
20
-
21
- const app = new Elysia()
22
- .use(logixlysia())
23
- .get('/', () => 'Hello World')
24
- .listen(3000)
25
- ```
26
-
27
- ### With Configuration
28
-
29
- ```ts
30
- app.use(logixlysia({
31
- startup: {
32
- show: true,
33
- format: 'simple',
34
- },
35
- format: {
36
- timestamp: 'yyyy-mm-dd HH:MM:ss.SSS',
37
- showIp: true,
38
- template: '🦊 {now} {level} {duration} {method} {pathname} {status} {message} {ip}',
39
- },
40
- file: {
41
- path: './logs/example.log',
42
- rotation: {
43
- maxSize: '10m',
44
- maxFiles: 7,
45
- compress: true,
46
- },
47
- },
48
- logLevel: ['ERROR', 'WARNING'],
49
- }))
50
- ```
51
-
52
- ## `⚙️` Options
53
-
54
- | Option | Type | Default | Description |
55
- |--------|------|---------|-------------|
56
- | `startup.show` | `boolean` | `true` | Show startup message |
57
- | `startup.format` | `"simple" \| "banner"` | `"banner"` | Startup message style |
58
- | `format.colors` | `boolean` | `true` (TTY) | Enable colored output |
59
- | `format.timestamp` | `string` | — | Timestamp format pattern (e.g. `'yyyy-mm-dd HH:MM:ss.SSS'`) |
60
- | `format.template` | `string` | — | Custom log format template |
61
- | `format.showIp` | `boolean` | `false` | Show IP address in logs |
62
- | `logLevel` | `LogLevel \| LogLevel[]` | — | Filter logs by level(s) |
63
- | `file` | `false \| { path, rotation? }` | — | File logging config (`false` to disable) |
64
- | `file.path` | `string` | — | Log file path (required when file logging enabled) |
65
- | `file.rotation` | `LogRotationConfig` | — | Log file rotation settings |
66
- | `transports` | `Transport[] \| { targets, only? }` | — | Custom transports |
67
- | `pino` | `PinoLoggerOptions` | — | Pino logger options |
68
- | `error.typeBaseUrl` | `string` | — | Base URL for error types (RFC 9457) |
69
- | `error.errorMap` | `Record<string, ErrorMapping>` | — | Error code to HTTP status mapping |
70
- | `error.resolve` | `ErrorResolver` | — | Custom error resolver function |
71
- | `error.verbose` | `boolean` | `false` | Show full error details in console |
72
-
73
- ## `📚` Documentation
74
-
75
- Check out the [website](https://logixlysia.vercel.app) for more detailed documentation and examples.
76
-
77
- ## `📄` License
78
-
79
- Licensed under the [MIT License](LICENSE).
1
+ <div align="center">
2
+ <h1><code>🦊</code> Logixlysia</h1>
3
+ <strong>Logixlysia is a logging library for ElysiaJS</strong>
4
+ <img src="https://github.com/PunGrumpy/logixlysia/blob/main/apps/docs/app/opengraph-image.png?raw=true" alt="Logixlysia" width="100%" height="auto" />
5
+ </div>
6
+
7
+ ## `📩` Installation
8
+
9
+ ```bash
10
+ bun add @pori15/logixlysia
11
+ ```
12
+
13
+ ## `📝` Usage
14
+
15
+ ### Basic
16
+
17
+ ```ts
18
+ import { Elysia } from 'elysia'
19
+ import logixlysia from 'logixlysia'
20
+
21
+ const app = new Elysia()
22
+ .use(logixlysia())
23
+ .get('/', () => 'Hello World')
24
+ .listen(3000)
25
+ ```
26
+
27
+ ### With Configuration
28
+
29
+ ```ts
30
+ app.use(logixlysia({
31
+ startup: {
32
+ show: true,
33
+ format: 'simple',
34
+ },
35
+ format: {
36
+ timestamp: 'yyyy-mm-dd HH:MM:ss.SSS',
37
+ showIp: true,
38
+ template: '🦊 {now} {level} {duration} {method} {pathname} {status} {message} {ip}',
39
+ },
40
+ file: {
41
+ path: './logs/example.log',
42
+ rotation: {
43
+ maxSize: '10m',
44
+ maxFiles: 7,
45
+ compress: true,
46
+ },
47
+ },
48
+ logLevel: ['ERROR', 'WARNING'],
49
+ }))
50
+ ```
51
+
52
+ ## `⚙️` Options
53
+
54
+ | Option | Type | Default | Description |
55
+ |--------|------|---------|-------------|
56
+ | `startup.show` | `boolean` | `true` | Show startup message |
57
+ | `startup.format` | `"simple" \| "banner"` | `"banner"` | Startup message style |
58
+ | `format.colors` | `boolean` | `true` (TTY) | Enable colored output |
59
+ | `format.timestamp` | `string` | — | Timestamp format pattern (e.g. `'yyyy-mm-dd HH:MM:ss.SSS'`) |
60
+ | `format.template` | `string` | — | Custom log format template |
61
+ | `format.showIp` | `boolean` | `false` | Show IP address in logs |
62
+ | `logLevel` | `LogLevel \| LogLevel[]` | — | Filter logs by level(s) |
63
+ | `file` | `false \| { path, rotation? }` | — | File logging config (`false` to disable) |
64
+ | `file.path` | `string` | — | Log file path (required when file logging enabled) |
65
+ | `file.rotation` | `LogRotationConfig` | — | Log file rotation settings |
66
+ | `transports` | `Transport[] \| { targets, only? }` | — | Custom transports |
67
+ | `pino` | `PinoLoggerOptions` | — | Pino logger options |
68
+ | `error.typeBaseUrl` | `string` | — | Base URL for error types (RFC 9457) |
69
+ | `error.errorMap` | `Record<string, ErrorMapping>` | — | Error code to HTTP status mapping |
70
+ | `error.resolve` | `ErrorResolver` | — | Custom error resolver function |
71
+ | `error.verbose` | `boolean` | `false` | Show full error details in console |
72
+
73
+ ## `📚` Documentation
74
+
75
+ Check out the [website](https://logixlysia.vercel.app) for more detailed documentation and examples.
76
+
77
+ ## `📄` License
78
+
79
+ Licensed under the [MIT License](LICENSE).
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pori15/logixlysia",
3
- "version": "6.0.10",
3
+ "version": "6.0.12",
4
4
  "description": "🦊 Logixlysia is a logger for Elysia",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -51,7 +51,7 @@
51
51
  "peerDependencies": {
52
52
  "elysia": "^1.4.28",
53
53
  "pino-pretty": ">=13.0.0",
54
- "typescript": "^5.9.3"
54
+ "typescript": "^6.0.2"
55
55
  },
56
56
  "peerDependenciesMeta": {
57
57
  "pino-pretty": {
package/dist/index.d.ts DELETED
@@ -1,244 +0,0 @@
1
- import { Elysia, SingletonBase } from "elysia";
2
- import { Logger as PinoLogger, LoggerOptions as PinoLoggerOptions } from "pino";
3
- interface ProblemDocument {
4
- type: string;
5
- title: string;
6
- status?: number;
7
- detail?: string;
8
- instance?: string;
9
- [key: string]: unknown;
10
- }
11
- /**
12
- * RFC 9457 Problem Details Error Base Class
13
- *
14
- * Core members as per RFC 9457:
15
- * - type: A URI reference [RFC3986] that identifies the problem type.
16
- * Defaults to "about:blank" when omitted.
17
- * - title: A short, human-readable summary of the problem type.
18
- * - status: The HTTP status code ([RFC7231], Section 6).
19
- * - detail: A human-readable explanation specific to this occurrence of the problem.
20
- * - instance: A URI reference that identifies the specific occurrence of the problem.
21
- *
22
- * Extension members: Additional properties can be added to provide more context.
23
- * These are serialized as-is in the JSON response.
24
- */
25
- /**
26
- * RFC 9457 Error Base Class
27
- * * 修改思路:直接使用 public readonly 属性,拒绝嵌套,拒绝 Getter。
28
- */
29
- declare class ProblemError extends Error {
30
- readonly status: number;
31
- readonly title: string;
32
- readonly type: string;
33
- readonly detail?: string;
34
- readonly instance?: string;
35
- readonly extensions?: Record<string, unknown>;
36
- constructor(type: string | undefined, title: string, status: number, detail?: string, instance?: string, extensions?: Record<string, unknown>);
37
- toJSON(): ProblemDocument;
38
- }
39
- declare class BadRequest extends ProblemError {
40
- constructor(detail?: string, extensions?: Record<string, any>);
41
- }
42
- declare class Unauthorized extends ProblemError {
43
- constructor(detail?: string, extensions?: Record<string, any>);
44
- }
45
- declare class Forbidden extends ProblemError {
46
- constructor(detail?: string, extensions?: Record<string, any>);
47
- }
48
- declare class NotFound extends ProblemError {
49
- constructor(detail?: string, extensions?: Record<string, any>);
50
- }
51
- declare class Conflict extends ProblemError {
52
- constructor(detail?: string, extensions?: Record<string, any>);
53
- }
54
- declare class PaymentRequired extends ProblemError {
55
- constructor(detail?: string, extensions?: Record<string, any>);
56
- }
57
- declare class MethodNotAllowed extends ProblemError {
58
- constructor(detail?: string, extensions?: Record<string, any>);
59
- }
60
- declare class NotAcceptable extends ProblemError {
61
- constructor(detail?: string, extensions?: Record<string, any>);
62
- }
63
- declare class InternalServerError extends ProblemError {
64
- constructor(detail?: string, extensions?: Record<string, any>);
65
- }
66
- declare class NotImplemented extends ProblemError {
67
- constructor(detail?: string, extensions?: Record<string, any>);
68
- }
69
- declare class BadGateway extends ProblemError {
70
- constructor(detail?: string, extensions?: Record<string, any>);
71
- }
72
- declare class ServiceUnavailable extends ProblemError {
73
- constructor(detail?: string, extensions?: Record<string, any>);
74
- }
75
- declare class GatewayTimeout extends ProblemError {
76
- constructor(detail?: string, extensions?: Record<string, any>);
77
- }
78
- interface HttpErrorConstructor {
79
- BadRequest: typeof BadRequest;
80
- Unauthorized: typeof Unauthorized;
81
- PaymentRequired: typeof PaymentRequired;
82
- Forbidden: typeof Forbidden;
83
- NotFound: typeof NotFound;
84
- MethodNotAllowed: typeof MethodNotAllowed;
85
- NotAcceptable: typeof NotAcceptable;
86
- Conflict: typeof Conflict;
87
- InternalServerError: typeof InternalServerError;
88
- NotImplemented: typeof NotImplemented;
89
- BadGateway: typeof BadGateway;
90
- ServiceUnavailable: typeof ServiceUnavailable;
91
- GatewayTimeout: typeof GatewayTimeout;
92
- }
93
- declare const HttpError: HttpErrorConstructor;
94
- type Code = number | "PROBLEM_ERROR" | "UNKNOWN" | "VALIDATION" | "NOT_FOUND" | "PARSE" | "INTERNAL_SERVER_ERROR" | "INVALID_COOKIE_SIGNATURE" | "INVALID_FILE_TYPE";
95
- interface ErrorContext {
96
- request: Request;
97
- path: string;
98
- code: string | number;
99
- error: unknown;
100
- }
101
- interface HttpProblemJsonOptions {
102
- /**
103
- * 自定义错误类型的 Base URL
104
- * @example "https://api.mysite.com/errors"
105
- */
106
- typeBaseUrl?: string;
107
- /**
108
- * 🪝 Transform Hook
109
- * 将未知错误转换为 HttpError。
110
- * 返回 undefined/null 表示不处理(走默认逻辑)。
111
- */
112
- transform?: (error: unknown, context: ErrorContext) => ProblemError | undefined | null;
113
- /**
114
- * 📢 Listen Hook
115
- * 在响应发送前触发(用于日志)。
116
- */
117
- onBeforeRespond?: (problem: ProblemError, context: ErrorContext) => void | Promise<void>;
118
- }
119
- type Pino = PinoLogger<never, boolean>;
120
- type LogLevel = "DEBUG" | "INFO" | "WARNING" | "ERROR";
121
- interface StoreData {
122
- beforeTime: bigint;
123
- }
124
- interface LogixlysiaStore {
125
- logger: Logger;
126
- pino: Pino;
127
- beforeTime?: bigint;
128
- [key: string]: unknown;
129
- }
130
- interface Transport {
131
- log: (level: LogLevel, message: string, meta?: Record<string, unknown>) => void | Promise<void>;
132
- }
133
- interface LogRotationConfig {
134
- /**
135
- * Max log file size before rotation, e.g. '10m', '5k', or a byte count.
136
- */
137
- maxSize?: string | number;
138
- /**
139
- * Keep at most N files or keep files for a duration like '7d'.
140
- */
141
- maxFiles?: number | string;
142
- /**
143
- * Rotate at a fixed interval, e.g. '1d', '12h'.
144
- */
145
- interval?: string;
146
- compress?: boolean;
147
- compression?: "gzip";
148
- }
149
- interface LogFilter {
150
- /**
151
- * Array of log levels to allow. If specified, only logs with these levels will be processed.
152
- * If not specified, all log levels will be allowed.
153
- */
154
- level?: LogLevel[];
155
- }
156
- interface Options {
157
- config?: {
158
- showStartupMessage?: boolean;
159
- startupMessageFormat?: "simple" | "banner";
160
- useColors?: boolean;
161
- ip?: boolean;
162
- timestamp?: {
163
- translateTime?: string;
164
- };
165
- customLogFormat?: string;
166
- logFilter?: LogFilter;
167
- transports?: Transport[];
168
- useTransportsOnly?: boolean;
169
- disableInternalLogger?: boolean;
170
- disableFileLogging?: boolean;
171
- logFilePath?: string;
172
- logRotation?: LogRotationConfig;
173
- pino?: (PinoLoggerOptions & {
174
- prettyPrint?: boolean;
175
- }) | undefined;
176
- error?: {
177
- problemJson?: {
178
- typeBaseUrl?: string;
179
- };
180
- /**
181
- * 是否在控制台显示完整的错误详情(包括 detail 和 extensions)
182
- * 开启后会将完整的错误对象打印到控制台,便于调试
183
- * @default false
184
- */
185
- verboseErrorLogging?: boolean;
186
- };
187
- };
188
- transform?: (error: unknown, context: {
189
- request: Request;
190
- code: Code;
191
- path: string;
192
- }) => ProblemError | unknown;
193
- }
194
- interface Logger {
195
- pino: Pino;
196
- log: (level: LogLevel, request: Request, data: Record<string, unknown>, store: StoreData) => void;
197
- handleHttpError: (request: Request, error: ProblemError, store: StoreData, options: Options) => void;
198
- debug: (request: Request, message: string, context?: Record<string, unknown>) => void;
199
- info: (request: Request, message: string, context?: Record<string, unknown>) => void;
200
- warn: (request: Request, message: string, context?: Record<string, unknown>) => void;
201
- error: (request: Request, message: string, context?: Record<string, unknown>) => void;
202
- }
203
- interface LogixlysiaContext {
204
- request: Request;
205
- store: LogixlysiaStore;
206
- }
207
- declare const normalizeToProblem: (error: any, code: Code, path: string, typeBaseUrl?: string) => ProblemError;
208
- interface ProblemJson {
209
- type?: string;
210
- title: string;
211
- status: number;
212
- detail?: string;
213
- instance?: string;
214
- [key: string]: unknown;
215
- }
216
- interface ProblemJsonOptions {
217
- /**
218
- * 基础 URL,用于生成错误类型的链接
219
- * @example 'https://api.example.com/errors'
220
- */
221
- typeBaseUrl?: string;
222
- /**
223
- * 是否在日志中显示完整的 Problem JSON
224
- * @default true
225
- */
226
- enabled?: boolean;
227
- /**
228
- * 自定义格式化函数
229
- */
230
- format?: (error: unknown, request: Request) => ProblemJson | null;
231
- }
232
- /**
233
- * 将错误转换为 RFC 9457 Problem JSON 格式
234
- */
235
- declare function toProblemJson(error: unknown, request: Request, options?: ProblemJsonOptions): ProblemJson;
236
- /**
237
- * 将 Problem JSON 格式化为日志字符串
238
- */
239
- declare function formatProblemJsonLog(problem: ProblemJson, request: Request): string;
240
- type Logixlysia = Elysia<"Logixlysia", SingletonBase & {
241
- store: LogixlysiaStore;
242
- }>;
243
- declare const logixlysia: (options?: Options) => Logixlysia;
244
- export { toProblemJson, normalizeToProblem, logixlysia, formatProblemJsonLog, logixlysia as default, Transport, StoreData, ProblemJsonOptions, ProblemJson, ProblemError, ProblemDocument, Pino, Options, LogixlysiaStore, LogixlysiaContext, Logixlysia, Logger, LogLevel, HttpProblemJsonOptions, HttpErrorConstructor, HttpError, ErrorContext, Code };
package/dist/index.js DELETED
@@ -1,8 +0,0 @@
1
- import{Elysia as $$}from"elysia";import J0 from"elysia/package.json";var V0=($,R)=>{if($.length>=R)return $.slice(0,R);let X=Math.floor((R-$.length)/2),K=R-$.length-X;return`${" ".repeat(X)}${$}${" ".repeat(K)}`},c=($)=>{let R=`Elysia v${J0.version}`,K=Math.max($.length,R.length)+4,w=`┌${"─".repeat(K)}┐`,Q=`└${"─".repeat(K)}┘`,Z=`│${" ".repeat(K)}│`,G=`│${V0(R,K)}│`,Y=`│ ${$}${" ".repeat(Math.max(0,K-$.length-4))} │`;return[w,Z,G,Z,Y,Z,Q].join(`
2
- `)};var b=($,R)=>{if(!(R.config?.showStartupMessage??!0))return;let{port:K,hostname:w,protocol:Q}=$;if(K===void 0||!w||!Q)return;let G=`\uD83E\uDD8A Elysia is running at ${`${Q}://${w}:${K}`}`;if((R.config?.startupMessageFormat??"banner")==="simple"){console.log(G);return}console.log(c(G))};import u from"pino";var U=(...$)=>{let R=typeof $[0]==="string"?{level:$[0],request:$[1],data:$[2],store:$[3],options:$[4]}:$[0],{level:X,request:K,data:w,store:Q,options:Z}=R,G=Z.config?.transports??[];if(G.length===0)return;let Y=typeof w.message==="string"?w.message:"",z={request:{method:K.method,url:K.url},...w,beforeTime:Q.beforeTime};for(let H of G)try{let V=H.log(X,Y,z);if(V&&typeof V.catch==="function")V.catch(()=>{})}catch{}};import{appendFile as U0}from"node:fs/promises";import{dirname as T0}from"node:path";import{promises as Y0}from"node:fs";var P=async($)=>{await Y0.mkdir($,{recursive:!0})};import{promises as O}from"node:fs";import{promisify as j0}from"node:util";import{gzip as O0}from"node:zlib";import{promises as y}from"node:fs";import{basename as D0,dirname as I0}from"node:path";var _0=/^(\d+(?:\.\d+)?)(k|kb|m|mb|g|gb)$/i,z0=/^(\d+)(h|d|w)$/i,H0=/\.(\d{4}-\d{2}-\d{2}-\d{2}-\d{2}-\d{2})(?:\.gz)?$/,x=($)=>{if(typeof $==="number")return $;let R=$.trim(),X=Number(R);if(Number.isFinite(X))return X;let K=R.match(_0);if(!K)throw Error(`Invalid size format: ${$}`);let w=Number(K[1]),Q=K[2].toLowerCase(),Z=1024;if(Q.startsWith("m"))Z=1048576;else if(Q.startsWith("g"))Z=1073741824;return Math.floor(w*Z)},W0=($)=>{let R=$.trim().match(z0);if(!R)throw Error(`Invalid interval format: ${$}`);let X=Number(R[1]),K=R[2].toLowerCase(),w=3600000;if(K==="d")w=86400000;else if(K==="w")w=604800000;return X*w},q=($)=>{if(typeof $==="number")return{type:"count",value:$};return{type:"time",value:W0($)}},h=async($,R)=>{try{return(await y.stat($)).size>R}catch{return!1}},f=async($)=>{let R=I0($),X=D0($),K;try{K=await y.readdir(R)}catch{return[]}return K.filter((w)=>w.startsWith(`${X}.`)&&H0.test(w)).map((w)=>`${R}/${w}`)};var F0=j0(O0),B=($)=>String($).padStart(2,"0"),L0=($,R)=>{let X=R.getFullYear(),K=B(R.getMonth()+1),w=B(R.getDate()),Q=B(R.getHours()),Z=B(R.getMinutes()),G=B(R.getSeconds());return`${$}.${X}-${K}-${w}-${Q}-${Z}-${G}`},M0=async($)=>{try{if((await O.stat($)).size===0)return""}catch{return""}let R=L0($,new Date);return await O.rename($,R),R},A0=async($)=>{let R=await O.readFile($),X=await F0(R);await O.writeFile(`${$}.gz`,X),await O.rm($,{force:!0})},v=async($,R)=>{if(R.maxSize===void 0)return!1;let X=x(R.maxSize);return await h($,X)},B0=async($,R)=>{let X=await f($);if(X.length<=R)return;let K=await Promise.all(X.map(async(Q)=>({path:Q,stat:await O.stat(Q)})));K.sort((Q,Z)=>Z.stat.mtimeMs-Q.stat.mtimeMs);let w=K.slice(R);await Promise.all(w.map(({path:Q})=>O.rm(Q,{force:!0})))},N0=async($,R)=>{let X=await f($);if(X.length===0)return;let K=Date.now(),Q=(await Promise.all(X.map(async(Z)=>({path:Z,stat:await O.stat(Z)})))).filter(({stat:Z})=>K-Z.mtimeMs>R);await Promise.all(Q.map(({path:Z})=>O.rm(Z,{force:!0})))},g=async($,R)=>{let X=await M0($);if(!X)return;if(R.compress===!0){if((R.compression??"gzip")==="gzip")await A0(X)}if(R.maxFiles!==void 0){let w=q(R.maxFiles);if(w.type==="count")await B0($,w.value);else await N0($,w.value)}};var T=async(...$)=>{let R=typeof $[0]==="string"?(()=>{let[M,A,F,L,S,k]=$;return{filePath:M,level:A,request:F,data:L,store:S,options:k}})():$[0],{filePath:X,level:K,request:w,data:Q,store:Z,options:G}=R,Y=G.config,z=Y?.useTransportsOnly===!0,H=Y?.disableFileLogging===!0;if(z||H)return;let V=typeof Q.message==="string"?Q.message:"",J=Z.beforeTime===BigInt(0)?0:Number(process.hrtime.bigint()-Z.beforeTime)/1e6,D=`${K} ${J.toFixed(2)}ms ${w.method} ${new URL(w.url).pathname} ${V}
3
- `;await P(T0(X)),await U0(X,D,{encoding:"utf-8"});let W=Y?.logRotation;if(!W)return;if(await v(X,W))await g(X,W)};import I from"chalk";import{StatusMap as S0}from"elysia";var k0=/^\d+$/,y0=/[_-]+/g,f0=/([a-z0-9])([A-Z])/g,E0=/([A-Z])([A-Z][a-z])/g,C0=/['’]/g,c0=/[^a-z0-9\s]+/g,b0=/\s+/g,m=($)=>{let R=$.trim();if(!R)return"";return R.replace(y0," ").replace(f0,"$1 $2").replace(E0,"$1 $2").replace(C0,"").toLowerCase().replace(c0," ").replace(b0," ").trim()},P0=(()=>{let $=new Map;for(let[R,X]of Object.entries(S0))$.set(m(R),X);return $})(),n=($)=>{if(typeof $==="number"&&Number.isFinite($))return $;if(typeof $==="string"){let R=$.trim();if(k0.test(R))return Number(R);return P0.get(m(R))??500}return 500};var N=($)=>String($).padStart(2,"0"),x0=($)=>String($).padStart(3,"0"),q0=($)=>{let X=$.config?.useColors??!0,K=typeof process<"u"&&process.stdout?.isTTY===!0;return X&&K},h0=($,R)=>{if(!R)return $.toISOString();let X=String($.getFullYear()),K=N($.getMonth()+1),w=N($.getDate()),Q=N($.getHours()),Z=N($.getMinutes()),G=N($.getSeconds()),Y=x0($.getMilliseconds());return R.replaceAll("yyyy",X).replaceAll("mm",K).replaceAll("dd",w).replaceAll("HH",Q).replaceAll("MM",Z).replaceAll("ss",G).replaceAll("SSS",Y)},v0=($)=>{let R=$.headers.get("x-forwarded-for");if(R)return R.split(",")[0]?.trim()??"";return $.headers.get("x-real-ip")??""},g0=($,R)=>{if(!R)return $;if($==="ERROR")return I.bgRed.black($);if($==="WARNING")return I.bgYellow.black($);if($==="DEBUG")return I.bgBlue.black($);return I.bgGreen.black($)},m0=($,R)=>{if(!R)return $;let X=$.toUpperCase();if(X==="GET")return I.green.bold(X);if(X==="POST")return I.blue.bold(X);if(X==="PUT")return I.yellow.bold(X);if(X==="PATCH")return I.yellowBright.bold(X);if(X==="DELETE")return I.red.bold(X);if(X==="OPTIONS")return I.cyan.bold(X);if(X==="HEAD")return I.greenBright.bold(X);if(X==="TRACE")return I.magenta.bold(X);if(X==="CONNECT")return I.cyanBright.bold(X);return I.white.bold(X)},n0=($,R)=>{if(!R)return $;let X=Number.parseInt($,10);if(!Number.isFinite(X))return $;if(X>=500)return I.red($);if(X>=400)return I.yellow($);if(X>=300)return I.cyan($);if(X>=200)return I.green($);return I.gray($)},d0=($,R)=>{if(!R)return $;return I.gray($)},p0=($,R)=>{if(!R)return $;return I.bgHex("#FFA500").black($)},u0=($,R)=>{if(!R)return $;return I.whiteBright($)},i0=($)=>{if(typeof $==="object"&&$!==null)return JSON.stringify($);return""},d=({level:$,request:R,data:X,store:K,options:w})=>{let Q=w.config,Z=q0(w),G=Q?.customLogFormat??"\uD83E\uDD8A {now} {level} {duration} {method} {pathname} {status} {message} {ip} {context}",Y=new Date,z=String(Y.getTime()),H=h0(Y,Q?.timestamp?.translateTime),V=p0(H,Z),J=typeof X.message==="string"?X.message:"",D=K.beforeTime===BigInt(0)?0:Number(process.hrtime.bigint()-K.beforeTime)/1e6,W=new URL(R.url).pathname,j=X.status,M=j===null||j===void 0?200:n(j),A=String(M),F=Q?.ip===!0?v0(R):"",L=i0(X.context),S=g0($,Z),k=m0(R.method,Z),C=u0(W,Z),Z0=n0(A,Z),G0=d0(`${D.toFixed(2)}ms`,Z);return G.replaceAll("{now}",V).replaceAll("{epoch}",z).replaceAll("{level}",S).replaceAll("{duration}",G0).replaceAll("{method}",k).replaceAll("{pathname}",C).replaceAll("{path}",C).replaceAll("{status}",Z0).replaceAll("{message}",J).replaceAll("{ip}",F).replaceAll("{context}",L)};var p=($,R,X,K)=>{let w=K.config,Q="ERROR",Z=R.toJSON(),G={status:R.status,message:R.detail||R.title,...Z};if(U({level:"ERROR",request:$,data:G,store:X,options:K}),!(w?.useTransportsOnly||w?.disableFileLogging)){let J=w?.logFilePath;if(J)T({filePath:J,level:"ERROR",request:$,data:G,store:X,options:K}).catch(()=>{})}if(w?.useTransportsOnly||w?.disableInternalLogger)return;let Y="";if(w?.timestamp)Y=`[${new Date().toISOString()}] `;let z=typeof $==="string"?"REQ":$.method,H=typeof $==="string"?$:$.url,V;try{V=H.includes("://")?new URL(H).pathname:H}catch{V=H}if(console.error(`${Y}ERROR ${z} ${V} ${R.status} - ${R.title}`),w?.error?.verboseErrorLogging){let J=R.toJSON();if(J.detail)console.error(` Detail: ${J.detail}`);if(J.instance)console.error(` Instance: ${J.instance}`);if(J.type&&J.type!=="about:blank")console.error(` Type: ${J.type}`);let D=Object.entries(J).filter(([W])=>!["type","title","status","detail","instance"].includes(W));if(D.length>0){console.error(" Extensions:");for(let[W,j]of D)console.error(` ${W}:`,j)}}};var i=($={})=>{let R=$.config,X=R?.pino,{prettyPrint:K,...w}=X??{},Z=K===!0&&w.transport===void 0?u.transport({target:"pino-pretty",options:{colorize:process.stdout?.isTTY===!0,translateTime:R?.timestamp?.translateTime,messageKey:w.messageKey,errorKey:w.errorKey}}):w.transport,G=u({...w,level:w.level??"info",messageKey:w.messageKey,errorKey:w.errorKey,transport:Z}),Y=(V,J)=>{if(!J?.level||J.level.length===0)return!0;return J.level.includes(V)},z=(V,J,D,W)=>{if(!Y(V,R?.logFilter))return;U({level:V,request:J,data:D,store:W,options:$});let j=R?.useTransportsOnly===!0,M=R?.disableInternalLogger===!0,A=R?.disableFileLogging===!0;if(!(j||A)){let L=R?.logFilePath;if(L)T({filePath:L,level:V,request:J,data:D,store:W,options:$}).catch(()=>{})}if(j||M)return;let F=d({level:V,request:J,data:D,store:W,options:$});switch(V){case"DEBUG":{console.debug(F);break}case"INFO":{console.info(F);break}case"WARNING":{console.warn(F);break}case"ERROR":{console.error(F);break}default:{console.log(F);break}}},H=(V,J,D,W)=>{let j={beforeTime:process.hrtime.bigint()};z(V,J,{message:D,context:W},j)};return{pino:G,log:z,handleHttpError:(V,J,D)=>{p(V,J,D,$)},debug:(V,J,D)=>{H("DEBUG",V,J,D)},info:(V,J,D)=>{H("INFO",V,J,D)},warn:(V,J,D)=>{H("WARNING",V,J,D)},error:(V,J,D)=>{H("ERROR",V,J,D)}}};class _ extends Error{status;title;type;detail;instance;extensions;constructor($="about:blank",R,X,K,w,Q={}){super(K||R);Object.setPrototypeOf(this,_.prototype),this.status=X,this.title=R,this.type=$,this.detail=K,this.instance=w,this.extensions=Q}toJSON(){return{type:this.type,title:this.title,status:this.status,...this.detail?{detail:this.detail}:{},...this.instance?{instance:this.instance}:{},...this.extensions}}}class l extends _{constructor($,R){super("https://httpstatuses.com/400","Bad Request",400,$,void 0,R)}}class a extends _{constructor($,R){super("https://httpstatuses.com/401","Unauthorized",401,$,void 0,R)}}class s extends _{constructor($,R){super("https://httpstatuses.com/403","Forbidden",403,$,void 0,R)}}class o extends _{constructor($,R){super("https://httpstatuses.com/404","Not Found",404,$,void 0,R)}}class r extends _{constructor($,R){super("https://httpstatuses.com/409","Conflict",409,$,void 0,R)}}class t extends _{constructor($,R){super("https://httpstatuses.com/402","Payment Required",402,$,void 0,R)}}class e extends _{constructor($,R){super("https://httpstatuses.com/405","Method Not Allowed",405,$,void 0,R)}}class $0 extends _{constructor($,R){super("https://httpstatuses.com/406","Not Acceptable",406,$,void 0,R)}}class R0 extends _{constructor($,R){super("https://httpstatuses.com/500","Internal Server Error",500,$,void 0,R)}}class X0 extends _{constructor($,R){super("https://httpstatuses.com/501","Not Implemented",501,$,void 0,R)}}class w0 extends _{constructor($,R){super("https://httpstatuses.com/502","Bad Gateway",502,$,void 0,R)}}class K0 extends _{constructor($,R){super("https://httpstatuses.com/503","Service Unavailable",503,$,void 0,R)}}class Q0 extends _{constructor($,R){super("https://httpstatuses.com/504","Gateway Timeout",504,$,void 0,R)}}var x$={BadRequest:l,Unauthorized:a,PaymentRequired:t,Forbidden:s,NotFound:o,MethodNotAllowed:e,NotAcceptable:$0,Conflict:r,InternalServerError:R0,NotImplemented:X0,BadGateway:w0,ServiceUnavailable:K0,GatewayTimeout:Q0};var l0={400:"Bad Request",401:"Unauthorized",403:"Forbidden",404:"Not Found",409:"Conflict",422:"Unprocessable Entity",500:"Internal Server Error",503:"Service Unavailable"},E=($,R,X,K="about:blank")=>{if($ instanceof _)return $.instance?$:new _($.type,$.title,$.status,$.detail,X,$.extensions);let w=500,Q="Internal Server Error",Z=$ instanceof Error?$.message:String($),G={};switch(R){case"VALIDATION":w=400,Q="Validation Failed",G={errors:$.all||[]};break;case"NOT_FOUND":w=404,Q="Resource Not Found";break;case"PARSE":w=400,Q="Invalid Payload",Z="The request body could not be parsed as valid JSON.";break;case"INVALID_COOKIE_SIGNATURE":w=401,Q="Invalid Credentials";break;default:if(typeof $?.status==="number")w=$.status,Q=l0[w]||"Unknown Error";break}return new _(K==="about:blank"?K:`${K}/${R}`,Q,w,Z,X,G)},a0=($)=>typeof $==="object"&&$!==null&&("status"in $)&&typeof $.status==="number",s0=($)=>$ instanceof Error||typeof $==="object"&&$!==null&&("message"in $)&&typeof $.message==="string";function o0($,R,X={}){if(X.format){let G=X.format($,R);if(G)return G}let K=new URL(R.url),w=a0($)?$.status:500,Q=s0($)?$.message:String($??"Unknown Error"),Z={type:X.typeBaseUrl?`${X.typeBaseUrl}/${w}`:"about:blank",title:r0(w),status:w,detail:Q,instance:K.pathname+K.search};if(typeof $==="object"&&$!==null){let G=$;if("type"in G||"title"in G){if(G.type)Z.type=G.type;if(G.title)Z.title=G.title}for(let[Y,z]of Object.entries(G))if(!["status","message","type","title","detail","instance"].includes(Y))Z[Y]=z}return Z}function r0($){return{400:"Bad Request",401:"Unauthorized",402:"Payment Required",403:"Forbidden",404:"Not Found",405:"Method Not Allowed",406:"Not Acceptable",407:"Proxy Authentication Required",408:"Request Timeout",409:"Conflict",410:"Gone",411:"Length Required",412:"Precondition Failed",413:"Payload Too Large",414:"URI Too Long",415:"Unsupported Media Type",416:"Range Not Satisfiable",417:"Expectation Failed",418:"I'm a teapot",422:"Unprocessable Entity",423:"Locked",424:"Failed Dependency",425:"Too Early",426:"Upgrade Required",428:"Precondition Required",429:"Too Many Requests",431:"Request Header Fields Too Large",451:"Unavailable For Legal Reasons",500:"Internal Server Error",501:"Not Implemented",502:"Bad Gateway",503:"Service Unavailable",504:"Gateway Timeout",505:"HTTP Version Not Supported",506:"Variant Also Negotiates",507:"Insufficient Storage",508:"Loop Detected",510:"Not Extended",511:"Network Authentication Required"}[$]||"Error"}function t0($,R){let X=new URL(R.url),K=[],w=$.status.toString(),Q=e0($.status);if(K.push(`
4
- ${Q} [HTTP ${w}] ${R.method} ${X.pathname}`),K.push(` Type: ${$.type}`),K.push(` Title: ${$.title}`),$.detail)K.push(` Detail: ${$.detail}`);if($.instance)K.push(` Instance: ${$.instance}`);let Z=Object.entries($).filter(([G])=>!["type","title","status","detail","instance"].includes(G));if(Z.length>0){K.push(" Extensions:");for(let[G,Y]of Z)K.push(` ${G}: ${JSON.stringify(Y)}`)}return K.join(`
5
- `)}function e0($){if($>=500)return"\uD83D\uDD34";if($>=400)return"\uD83D\uDFE1";if($>=300)return"\uD83D\uDD35";if($>=200)return"\uD83D\uDFE2";return"⚪"}var R$=($={})=>{let R=new WeakSet,X=i($),K={...X,debug:(Q,Z,G)=>{R.add(Q),X.debug(Q,Z,G)},info:(Q,Z,G)=>{R.add(Q),X.info(Q,Z,G)},warn:(Q,Z,G)=>{R.add(Q),X.warn(Q,Z,G)},error:(Q,Z,G)=>{R.add(Q),X.error(Q,Z,G)}};return new $$({name:"Logixlysia",detail:{description:"Logixlysia is a plugin for Elysia that provides a logger and pino logger.",tags:["logging","pino"]}}).state("logger",K).state("pino",K.pino).state("beforeTime",BigInt(0)).onStart(({server:Q})=>{if(Q)b(Q,$)}).onRequest(({store:Q})=>{Q.beforeTime=process.hrtime.bigint()}).onAfterHandle(({request:Q,set:Z,store:G})=>{if(R.has(Q))return;let Y=typeof Z.status==="number"?Z.status:200,z="INFO";if(Y>=500)z="ERROR";else if(Y>=400)z="WARNING";K.log(z,Q,{status:Y},G)}).onError(({request:Q,error:Z,code:G,path:Y,store:z,set:H})=>{let V=$.transform?$.transform(Z,{request:Q,code:G,path:Y}):Z,J=E(V,G,Y,$.config?.error?.problemJson?.typeBaseUrl);return K.handleHttpError(Q,J,z,$),H.status=J.status,H.headers["content-type"]="application/problem+json",J.toJSON()}).as("scoped")},a$=R$;export{o0 as toProblemJson,E as normalizeToProblem,R$ as logixlysia,t0 as formatProblemJsonLog,a$ as default,_ as ProblemError,x$ as HttpError};
6
-
7
- //# debugId=BA7FA774476C25BE64756E2164756E21
8
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjXFxpbmRleC50cyIsICJzcmNcXGV4dGVuc2lvbnNcXGJhbm5lci50cyIsICJzcmNcXGV4dGVuc2lvbnNcXGluZGV4LnRzIiwgInNyY1xcbG9nZ2VyXFxpbmRleC50cyIsICJzcmNcXG91dHB1dFxcaW5kZXgudHMiLCAic3JjXFxvdXRwdXRcXGZpbGUudHMiLCAic3JjXFxvdXRwdXRcXGZzLnRzIiwgInNyY1xcb3V0cHV0XFxyb3RhdGlvbi1tYW5hZ2VyLnRzIiwgInNyY1xcdXRpbHNcXHJvdGF0aW9uLnRzIiwgInNyY1xcbG9nZ2VyXFxjcmVhdGUtbG9nZ2VyLnRzIiwgInNyY1xcaGVscGVyc1xcc3RhdHVzLnRzIiwgInNyY1xcbG9nZ2VyXFxoYW5kbGUtaHR0cC1lcnJvci50cyIsICJzcmNcXEVycm9yXFxlcnJvcnMudHMiLCAic3JjXFx1dGlsc1xcaGFuZGxlLWVycm9yLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgImltcG9ydCB7IEVseXNpYSwgdHlwZSBTaW5nbGV0b25CYXNlIH0gZnJvbSAnZWx5c2lhJ1xuaW1wb3J0IHsgc3RhcnRTZXJ2ZXIgfSBmcm9tICcuL2V4dGVuc2lvbnMnXG5pbXBvcnQgdHlwZSB7IExvZ2l4bHlzaWFTdG9yZSwgT3B0aW9ucyB9IGZyb20gJy4vaW50ZXJmYWNlcydcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gJy4vbG9nZ2VyJ1xuaW1wb3J0IHsgbm9ybWFsaXplVG9Qcm9ibGVtIH0gZnJvbSAnLi91dGlscy9oYW5kbGUtZXJyb3InXG5cbmV4cG9ydCB0eXBlIExvZ2l4bHlzaWEgPSBFbHlzaWE8XG4gICdMb2dpeGx5c2lhJyxcbiAgU2luZ2xldG9uQmFzZSAmIHsgc3RvcmU6IExvZ2l4bHlzaWFTdG9yZSB9XG4+XG5cbmV4cG9ydCBjb25zdCBsb2dpeGx5c2lhID0gKG9wdGlvbnM6IE9wdGlvbnMgPSB7fSk6IExvZ2l4bHlzaWEgPT4ge1xuICBjb25zdCBkaWRDdXN0b21Mb2cgPSBuZXcgV2Vha1NldDxSZXF1ZXN0PigpXG4gIGNvbnN0IGJhc2VMb2dnZXIgPSBjcmVhdGVMb2dnZXIob3B0aW9ucylcbiAgY29uc3QgbG9nZ2VyID0ge1xuICAgIC4uLmJhc2VMb2dnZXIsXG4gICAgZGVidWc6IChcbiAgICAgIHJlcXVlc3Q6IFJlcXVlc3QsXG4gICAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgICBjb250ZXh0PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICApID0+IHtcbiAgICAgIGRpZEN1c3RvbUxvZy5hZGQocmVxdWVzdClcbiAgICAgIGJhc2VMb2dnZXIuZGVidWcocmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dClcbiAgICB9LFxuICAgIGluZm86IChcbiAgICAgIHJlcXVlc3Q6IFJlcXVlc3QsXG4gICAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgICBjb250ZXh0PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICApID0+IHtcbiAgICAgIGRpZEN1c3RvbUxvZy5hZGQocmVxdWVzdClcbiAgICAgIGJhc2VMb2dnZXIuaW5mbyhyZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KVxuICAgIH0sXG4gICAgd2FybjogKFxuICAgICAgcmVxdWVzdDogUmVxdWVzdCxcbiAgICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICAgIGNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICkgPT4ge1xuICAgICAgZGlkQ3VzdG9tTG9nLmFkZChyZXF1ZXN0KVxuICAgICAgYmFzZUxvZ2dlci53YXJuKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpXG4gICAgfSxcbiAgICBlcnJvcjogKFxuICAgICAgcmVxdWVzdDogUmVxdWVzdCxcbiAgICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICAgIGNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICkgPT4ge1xuICAgICAgZGlkQ3VzdG9tTG9nLmFkZChyZXF1ZXN0KVxuICAgICAgYmFzZUxvZ2dlci5lcnJvcihyZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGFwcCA9IG5ldyBFbHlzaWEoe1xuICAgIG5hbWU6ICdMb2dpeGx5c2lhJyxcbiAgICBkZXRhaWw6IHtcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAnTG9naXhseXNpYSBpcyBhIHBsdWdpbiBmb3IgRWx5c2lhIHRoYXQgcHJvdmlkZXMgYSBsb2dnZXIgYW5kIHBpbm8gbG9nZ2VyLicsXG4gICAgICB0YWdzOiBbJ2xvZ2dpbmcnLCAncGlubyddXG4gICAgfVxuICB9KVxuXG4gIHJldHVybiAoXG4gICAgYXBwXG4gICAgICAuc3RhdGUoJ2xvZ2dlcicsIGxvZ2dlcilcbiAgICAgIC5zdGF0ZSgncGlubycsIGxvZ2dlci5waW5vKVxuICAgICAgLnN0YXRlKCdiZWZvcmVUaW1lJywgQmlnSW50KDApKVxuICAgICAgLm9uU3RhcnQoKHsgc2VydmVyIH0pID0+IHtcbiAgICAgICAgaWYgKHNlcnZlcikge1xuICAgICAgICAgIHN0YXJ0U2VydmVyKHNlcnZlciwgb3B0aW9ucylcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC5vblJlcXVlc3QoKHsgc3RvcmUgfSkgPT4ge1xuICAgICAgICBzdG9yZS5iZWZvcmVUaW1lID0gcHJvY2Vzcy5ocnRpbWUuYmlnaW50KClcbiAgICAgIH0pXG4gICAgICAub25BZnRlckhhbmRsZSgoeyByZXF1ZXN0LCBzZXQsIHN0b3JlIH0pID0+IHtcbiAgICAgICAgaWYgKGRpZEN1c3RvbUxvZy5oYXMocmVxdWVzdCkpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHR5cGVvZiBzZXQuc3RhdHVzID09PSAnbnVtYmVyJyA/IHNldC5zdGF0dXMgOiAyMDBcbiAgICAgICAgbGV0IGxldmVsOiAnSU5GTycgfCAnV0FSTklORycgfCAnRVJST1InID0gJ0lORk8nXG4gICAgICAgIGlmIChzdGF0dXMgPj0gNTAwKSB7XG4gICAgICAgICAgbGV2ZWwgPSAnRVJST1InXG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID49IDQwMCkge1xuICAgICAgICAgIGxldmVsID0gJ1dBUk5JTkcnXG4gICAgICAgIH1cblxuICAgICAgICBsb2dnZXIubG9nKGxldmVsLCByZXF1ZXN0LCB7IHN0YXR1cyB9LCBzdG9yZSlcbiAgICAgIH0pXG4gICAgICAub25FcnJvcigoeyByZXF1ZXN0LCBlcnJvciwgY29kZSwgcGF0aCwgc3RvcmUsIHNldCB9KSA9PiB7XG4gICAgICAgIC8vIGxvZ2dlci5oYW5kbGVIdHRwRXJyb3IocmVxdWVzdCwgZXJyb3IsIHN0b3JlKVxuXG4gICAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgICAvLyBQaGFzZSAxOiBUcmFuc2Zvcm0gKOi9rOaNoilcbiAgICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG9wdGlvbnMudHJhbnNmb3JtXG4gICAgICAgICAgPyBvcHRpb25zLnRyYW5zZm9ybShlcnJvciwgeyByZXF1ZXN0LCBjb2RlLCBwYXRoIH0pXG4gICAgICAgICAgOiBlcnJvclxuXG4gICAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgICAvLyBQaGFzZSAyOiBOb3JtYWxpemF0aW9uICjop4TojIPljJYpXG4gICAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgICAvLyDnu5/kuIDovazkuLogUHJvYmxlbUVycm9yIOWunuS+i1xuICAgICAgICBjb25zdCBwcm9ibGVtID0gbm9ybWFsaXplVG9Qcm9ibGVtKFxuICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICBjb2RlLFxuICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgb3B0aW9ucy5jb25maWc/LmVycm9yPy5wcm9ibGVtSnNvbj8udHlwZUJhc2VVcmxcbiAgICAgICAgKVxuXG4gICAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgICAvLyBQaGFzZSAzOiBMb2dnaW5nICjml6Xlv5cpXG4gICAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgICAvLyDosIPnlKjkuIrpnaLmlLnpgKDlkI7nmoTlh73mlbDvvIzlroPnjrDlnKjlj6rotJ/otKPorrDlvZXvvIzkuI3otJ/otKPpgLvovpHliKTmlq1cbiAgICAgICAgbG9nZ2VyLmhhbmRsZUh0dHBFcnJvcihyZXF1ZXN0LCBwcm9ibGVtLCBzdG9yZSwgb3B0aW9ucylcblxuICAgICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgICAgLy8gUGhhc2UgNDogUmVzcG9uc2UgKOWTjeW6lClcbiAgICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAgIC8vIOe7n+S4gOiuvue9riBIZWFkZXIg5ZKMIFN0YXR1c1xuICAgICAgICBzZXQuc3RhdHVzID0gcHJvYmxlbS5zdGF0dXNcbiAgICAgICAgc2V0LmhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddID0gJ2FwcGxpY2F0aW9uL3Byb2JsZW0ranNvbidcblxuICAgICAgICAvLyDov5Tlm57nrKblkIggUkZDIOagh+WHhueahCBKU09OXG4gICAgICAgIHJldHVybiBwcm9ibGVtLnRvSlNPTigpXG4gICAgICB9KVxuICAgICAgLy8gRW5zdXJlIHBsdWdpbiBsaWZlY3ljbGUgaG9va3MgKG9uUmVxdWVzdC9vbkFmdGVySGFuZGxlL29uRXJyb3IpIGFwcGx5IHRvIHRoZSBwYXJlbnQgYXBwLlxuICAgICAgLmFzKCdzY29wZWQnKSBhcyB1bmtub3duIGFzIExvZ2l4bHlzaWFcbiAgKVxufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEVycm9yIEV4cG9ydHNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgKiBmcm9tIFwiLi9FcnJvci9lcnJvcnNcIjtcbmV4cG9ydCB0eXBlIHsgUHJvYmxlbURvY3VtZW50IH0gZnJvbSAnLi9FcnJvci9lcnJvcnMnXG5leHBvcnQgdHlwZSB7XG4gIENvZGUsXG4gIEVycm9yQ29udGV4dCxcbiAgSHR0cFByb2JsZW1Kc29uT3B0aW9uc1xufSBmcm9tICcuL0Vycm9yL3R5cGUnXG5leHBvcnQgeyBub3JtYWxpemVUb1Byb2JsZW0gfSBmcm9tICcuL3V0aWxzL2hhbmRsZS1lcnJvcidcbmV4cG9ydCB0eXBlIHtcbiAgUHJvYmxlbUpzb24sXG4gIFByb2JsZW1Kc29uT3B0aW9uc1xufSBmcm9tICcuL3V0aWxzL2hhbmRsZS1lcnJvcidcbmV4cG9ydCB7IGZvcm1hdFByb2JsZW1Kc29uTG9nLCB0b1Byb2JsZW1Kc29uIH0gZnJvbSAnLi91dGlscy9oYW5kbGUtZXJyb3InXG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQ29yZSBFeHBvcnRzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbmV4cG9ydCB0eXBlIHtcbiAgTG9nZ2VyLFxuICBMb2dpeGx5c2lhQ29udGV4dCxcbiAgTG9naXhseXNpYVN0b3JlLFxuICBMb2dMZXZlbCxcbiAgT3B0aW9ucyxcbiAgUGlubyxcbiAgU3RvcmVEYXRhLFxuICBUcmFuc3BvcnRcbn0gZnJvbSAnLi9pbnRlcmZhY2VzJ1xuXG5leHBvcnQgZGVmYXVsdCBsb2dpeGx5c2lhXG4iLAogICAgImltcG9ydCBlbHlzaWFQa2cgZnJvbSAnZWx5c2lhL3BhY2thZ2UuanNvbidcblxuY29uc3QgY2VudGVyVGV4dCA9ICh0ZXh0OiBzdHJpbmcsIHdpZHRoOiBudW1iZXIpOiBzdHJpbmcgPT4ge1xuICBpZiAodGV4dC5sZW5ndGggPj0gd2lkdGgpIHtcbiAgICByZXR1cm4gdGV4dC5zbGljZSgwLCB3aWR0aClcbiAgfVxuXG4gIGNvbnN0IGxlZnQgPSBNYXRoLmZsb29yKCh3aWR0aCAtIHRleHQubGVuZ3RoKSAvIDIpXG4gIGNvbnN0IHJpZ2h0ID0gd2lkdGggLSB0ZXh0Lmxlbmd0aCAtIGxlZnRcbiAgcmV0dXJuIGAkeycgJy5yZXBlYXQobGVmdCl9JHt0ZXh0fSR7JyAnLnJlcGVhdChyaWdodCl9YFxufVxuXG5leHBvcnQgY29uc3QgcmVuZGVyQmFubmVyID0gKG1lc3NhZ2U6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IHZlcnNpb25MaW5lID0gYEVseXNpYSB2JHtlbHlzaWFQa2cudmVyc2lvbn1gXG4gIGNvbnN0IGNvbnRlbnRXaWR0aCA9IE1hdGgubWF4KG1lc3NhZ2UubGVuZ3RoLCB2ZXJzaW9uTGluZS5sZW5ndGgpXG4gIGNvbnN0IGlubmVyV2lkdGggPSBjb250ZW50V2lkdGggKyA0IC8vIDIgc3BhY2VzIHBhZGRpbmcgb24gYm90aCBzaWRlc1xuXG4gIGNvbnN0IHRvcCA9IGDilIwkeyfilIAnLnJlcGVhdChpbm5lcldpZHRoKX3ilJBgXG4gIGNvbnN0IGJvdCA9IGDilJQkeyfilIAnLnJlcGVhdChpbm5lcldpZHRoKX3ilJhgXG4gIGNvbnN0IGVtcHR5ID0gYOKUgiR7JyAnLnJlcGVhdChpbm5lcldpZHRoKX3ilIJgXG5cbiAgY29uc3QgdmVyc2lvblJvdyA9IGDilIIke2NlbnRlclRleHQodmVyc2lvbkxpbmUsIGlubmVyV2lkdGgpfeKUgmBcbiAgY29uc3QgbWVzc2FnZVJvdyA9IGDilIIgICR7bWVzc2FnZX0keycgJy5yZXBlYXQoTWF0aC5tYXgoMCwgaW5uZXJXaWR0aCAtIG1lc3NhZ2UubGVuZ3RoIC0gNCkpfSAg4pSCYFxuXG4gIHJldHVybiBbdG9wLCBlbXB0eSwgdmVyc2lvblJvdywgZW1wdHksIG1lc3NhZ2VSb3csIGVtcHR5LCBib3RdLmpvaW4oJ1xcbicpXG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgT3B0aW9ucyB9IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQgeyByZW5kZXJCYW5uZXIgfSBmcm9tICcuL2Jhbm5lcidcblxuZXhwb3J0IGNvbnN0IHN0YXJ0U2VydmVyID0gKFxuICBzZXJ2ZXI6IHsgcG9ydD86IG51bWJlcjsgaG9zdG5hbWU/OiBzdHJpbmc7IHByb3RvY29sPzogc3RyaW5nIHwgbnVsbCB9LFxuICBvcHRpb25zOiBPcHRpb25zXG4pOiB2b2lkID0+IHtcbiAgY29uc3Qgc2hvd1N0YXJ0dXBNZXNzYWdlID0gb3B0aW9ucy5jb25maWc/LnNob3dTdGFydHVwTWVzc2FnZSA/PyB0cnVlXG4gIGlmICghc2hvd1N0YXJ0dXBNZXNzYWdlKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCB7IHBvcnQsIGhvc3RuYW1lLCBwcm90b2NvbCB9ID0gc2VydmVyXG4gIGlmIChwb3J0ID09PSB1bmRlZmluZWQgfHwgIWhvc3RuYW1lIHx8ICFwcm90b2NvbCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgdXJsID0gYCR7cHJvdG9jb2x9Oi8vJHtob3N0bmFtZX06JHtwb3J0fWBcbiAgY29uc3QgbWVzc2FnZSA9IGDwn6aKIEVseXNpYSBpcyBydW5uaW5nIGF0ICR7dXJsfWBcblxuICBjb25zdCBmb3JtYXQgPSBvcHRpb25zLmNvbmZpZz8uc3RhcnR1cE1lc3NhZ2VGb3JtYXQgPz8gJ2Jhbm5lcidcbiAgaWYgKGZvcm1hdCA9PT0gJ3NpbXBsZScpIHtcbiAgICBjb25zb2xlLmxvZyhtZXNzYWdlKVxuICAgIHJldHVyblxuICB9XG5cbiAgY29uc29sZS5sb2cocmVuZGVyQmFubmVyKG1lc3NhZ2UpKVxufVxuIiwKICAgICJpbXBvcnQgcGlubyBmcm9tICdwaW5vJ1xuaW1wb3J0IHR5cGUge1xuICBMb2dGaWx0ZXIsXG4gIExvZ2dlcixcbiAgTG9nTGV2ZWwsXG4gIE9wdGlvbnMsXG4gIFBpbm8sXG4gIFN0b3JlRGF0YVxufSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IHsgbG9nVG9UcmFuc3BvcnRzIH0gZnJvbSAnLi4vb3V0cHV0J1xuaW1wb3J0IHsgbG9nVG9GaWxlIH0gZnJvbSAnLi4vb3V0cHV0L2ZpbGUnXG5pbXBvcnQgeyBmb3JtYXRMaW5lIH0gZnJvbSAnLi9jcmVhdGUtbG9nZ2VyJ1xuaW1wb3J0IHsgaGFuZGxlSHR0cEVycm9yIH0gZnJvbSAnLi9oYW5kbGUtaHR0cC1lcnJvcidcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZUxvZ2dlciA9IChvcHRpb25zOiBPcHRpb25zID0ge30pOiBMb2dnZXIgPT4ge1xuICBjb25zdCBjb25maWcgPSBvcHRpb25zLmNvbmZpZ1xuXG4gIGNvbnN0IHBpbm9Db25maWcgPSBjb25maWc/LnBpbm9cbiAgY29uc3QgeyBwcmV0dHlQcmludCwgLi4ucGlub09wdGlvbnMgfSA9IHBpbm9Db25maWcgPz8ge31cblxuICBjb25zdCBzaG91bGRQcmV0dHlQcmludCA9XG4gICAgcHJldHR5UHJpbnQgPT09IHRydWUgJiYgcGlub09wdGlvbnMudHJhbnNwb3J0ID09PSB1bmRlZmluZWRcblxuICBjb25zdCB0cmFuc3BvcnQgPSBzaG91bGRQcmV0dHlQcmludFxuICAgID8gcGluby50cmFuc3BvcnQoe1xuICAgICAgICB0YXJnZXQ6ICdwaW5vLXByZXR0eScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBjb2xvcml6ZTogcHJvY2Vzcy5zdGRvdXQ/LmlzVFRZID09PSB0cnVlLFxuICAgICAgICAgIHRyYW5zbGF0ZVRpbWU6IGNvbmZpZz8udGltZXN0YW1wPy50cmFuc2xhdGVUaW1lLFxuICAgICAgICAgIG1lc3NhZ2VLZXk6IHBpbm9PcHRpb25zLm1lc3NhZ2VLZXksXG4gICAgICAgICAgZXJyb3JLZXk6IHBpbm9PcHRpb25zLmVycm9yS2V5XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgOiBwaW5vT3B0aW9ucy50cmFuc3BvcnRcblxuICBjb25zdCBwaW5vTG9nZ2VyOiBQaW5vID0gcGlubyh7XG4gICAgLi4ucGlub09wdGlvbnMsXG4gICAgbGV2ZWw6IHBpbm9PcHRpb25zLmxldmVsID8/ICdpbmZvJyxcbiAgICBtZXNzYWdlS2V5OiBwaW5vT3B0aW9ucy5tZXNzYWdlS2V5LFxuICAgIGVycm9yS2V5OiBwaW5vT3B0aW9ucy5lcnJvcktleSxcbiAgICB0cmFuc3BvcnRcbiAgfSlcblxuICBjb25zdCBzaG91bGRMb2cgPSAobGV2ZWw6IExvZ0xldmVsLCBsb2dGaWx0ZXI/OiBMb2dGaWx0ZXIpOiBib29sZWFuID0+IHtcbiAgICBpZiAoIWxvZ0ZpbHRlcj8ubGV2ZWwgfHwgbG9nRmlsdGVyLmxldmVsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgcmV0dXJuIGxvZ0ZpbHRlci5sZXZlbC5pbmNsdWRlcyhsZXZlbClcbiAgfVxuXG4gIGNvbnN0IGxvZyA9IChcbiAgICBsZXZlbDogTG9nTGV2ZWwsXG4gICAgcmVxdWVzdDogUmVxdWVzdCxcbiAgICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICBzdG9yZTogU3RvcmVEYXRhXG4gICk6IHZvaWQgPT4ge1xuICAgIC8vIENoZWNrIGlmIHRoaXMgbG9nIGxldmVsIHNob3VsZCBiZSBmaWx0ZXJlZFxuICAgIGlmICghc2hvdWxkTG9nKGxldmVsLCBjb25maWc/LmxvZ0ZpbHRlcikpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGxvZ1RvVHJhbnNwb3J0cyh7IGxldmVsLCByZXF1ZXN0LCBkYXRhLCBzdG9yZSwgb3B0aW9ucyB9KVxuXG4gICAgY29uc3QgdXNlVHJhbnNwb3J0c09ubHkgPSBjb25maWc/LnVzZVRyYW5zcG9ydHNPbmx5ID09PSB0cnVlXG4gICAgY29uc3QgZGlzYWJsZUludGVybmFsTG9nZ2VyID0gY29uZmlnPy5kaXNhYmxlSW50ZXJuYWxMb2dnZXIgPT09IHRydWVcbiAgICBjb25zdCBkaXNhYmxlRmlsZUxvZ2dpbmcgPSBjb25maWc/LmRpc2FibGVGaWxlTG9nZ2luZyA9PT0gdHJ1ZVxuXG4gICAgaWYgKCEodXNlVHJhbnNwb3J0c09ubHkgfHwgZGlzYWJsZUZpbGVMb2dnaW5nKSkge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBjb25maWc/LmxvZ0ZpbGVQYXRoXG4gICAgICBpZiAoZmlsZVBhdGgpIHtcbiAgICAgICAgbG9nVG9GaWxlKHsgZmlsZVBhdGgsIGxldmVsLCByZXF1ZXN0LCBkYXRhLCBzdG9yZSwgb3B0aW9ucyB9KS5jYXRjaChcbiAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAvLyBJZ25vcmUgZXJyb3JzXG4gICAgICAgICAgfVxuICAgICAgICApXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHVzZVRyYW5zcG9ydHNPbmx5IHx8IGRpc2FibGVJbnRlcm5hbExvZ2dlcikge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgbWVzc2FnZSA9IGZvcm1hdExpbmUoeyBsZXZlbCwgcmVxdWVzdCwgZGF0YSwgc3RvcmUsIG9wdGlvbnMgfSlcblxuICAgIHN3aXRjaCAobGV2ZWwpIHtcbiAgICAgIGNhc2UgJ0RFQlVHJzoge1xuICAgICAgICBjb25zb2xlLmRlYnVnKG1lc3NhZ2UpXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBjYXNlICdJTkZPJzoge1xuICAgICAgICBjb25zb2xlLmluZm8obWVzc2FnZSlcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ1dBUk5JTkcnOiB7XG4gICAgICAgIGNvbnNvbGUud2FybihtZXNzYWdlKVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgY2FzZSAnRVJST1InOiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSlcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgY29uc29sZS5sb2cobWVzc2FnZSlcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBsb2dXaXRoQ29udGV4dCA9IChcbiAgICBsZXZlbDogTG9nTGV2ZWwsXG4gICAgcmVxdWVzdDogUmVxdWVzdCxcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgY29udGV4dD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IHN0b3JlOiBTdG9yZURhdGEgPSB7IGJlZm9yZVRpbWU6IHByb2Nlc3MuaHJ0aW1lLmJpZ2ludCgpIH1cbiAgICBsb2cobGV2ZWwsIHJlcXVlc3QsIHsgbWVzc2FnZSwgY29udGV4dCB9LCBzdG9yZSlcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcGlubzogcGlub0xvZ2dlcixcbiAgICBsb2csXG4gICAgaGFuZGxlSHR0cEVycm9yOiAocmVxdWVzdCwgZXJyb3IsIHN0b3JlKSA9PiB7XG4gICAgICBoYW5kbGVIdHRwRXJyb3IocmVxdWVzdCwgZXJyb3IsIHN0b3JlLCBvcHRpb25zKVxuICAgIH0sXG4gICAgZGVidWc6IChyZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KSA9PiB7XG4gICAgICBsb2dXaXRoQ29udGV4dCgnREVCVUcnLCByZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KVxuICAgIH0sXG4gICAgaW5mbzogKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpID0+IHtcbiAgICAgIGxvZ1dpdGhDb250ZXh0KCdJTkZPJywgcmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dClcbiAgICB9LFxuICAgIHdhcm46IChyZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KSA9PiB7XG4gICAgICBsb2dXaXRoQ29udGV4dCgnV0FSTklORycsIHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpXG4gICAgfSxcbiAgICBlcnJvcjogKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpID0+IHtcbiAgICAgIGxvZ1dpdGhDb250ZXh0KCdFUlJPUicsIHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpXG4gICAgfVxuICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgTG9nTGV2ZWwsIE9wdGlvbnMsIFJlcXVlc3QsIFN0b3JlRGF0YSB9IGZyb20gJy4uL2ludGVyZmFjZXMnXG5cbmludGVyZmFjZSBMb2dUb1RyYW5zcG9ydHNJbnB1dCB7XG4gIGxldmVsOiBMb2dMZXZlbFxuICByZXF1ZXN0OiBSZXF1ZXN0XG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gIHN0b3JlOiBTdG9yZURhdGFcbiAgb3B0aW9uczogT3B0aW9uc1xufVxuXG5leHBvcnQgY29uc3QgbG9nVG9UcmFuc3BvcnRzID0gKFxuICAuLi5hcmdzOlxuICAgIHwgW0xvZ1RvVHJhbnNwb3J0c0lucHV0XVxuICAgIHwgW0xvZ0xldmVsLCBSZXF1ZXN0LCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgU3RvcmVEYXRhLCBPcHRpb25zXVxuKTogdm9pZCA9PiB7XG4gIGNvbnN0IGlucHV0OiBMb2dUb1RyYW5zcG9ydHNJbnB1dCA9XG4gICAgdHlwZW9mIGFyZ3NbMF0gPT09ICdzdHJpbmcnXG4gICAgICA/IHtcbiAgICAgICAgICBsZXZlbDogYXJnc1swXSxcbiAgICAgICAgICByZXF1ZXN0OiBhcmdzWzFdLFxuICAgICAgICAgIGRhdGE6IGFyZ3NbMl0sXG4gICAgICAgICAgc3RvcmU6IGFyZ3NbM10sXG4gICAgICAgICAgb3B0aW9uczogYXJnc1s0XVxuICAgICAgICB9XG4gICAgICA6IGFyZ3NbMF1cblxuICBjb25zdCB7IGxldmVsLCByZXF1ZXN0LCBkYXRhLCBzdG9yZSwgb3B0aW9ucyB9ID0gaW5wdXRcbiAgY29uc3QgdHJhbnNwb3J0cyA9IG9wdGlvbnMuY29uZmlnPy50cmFuc3BvcnRzID8/IFtdXG4gIGlmICh0cmFuc3BvcnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgbWVzc2FnZSA9IHR5cGVvZiBkYXRhLm1lc3NhZ2UgPT09ICdzdHJpbmcnID8gZGF0YS5tZXNzYWdlIDogJydcbiAgY29uc3QgbWV0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7XG4gICAgcmVxdWVzdDoge1xuICAgICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcbiAgICAgIHVybDogcmVxdWVzdC51cmxcbiAgICB9LFxuICAgIC4uLmRhdGEsXG4gICAgYmVmb3JlVGltZTogc3RvcmUuYmVmb3JlVGltZVxuICB9XG5cbiAgZm9yIChjb25zdCB0cmFuc3BvcnQgb2YgdHJhbnNwb3J0cykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSB0cmFuc3BvcnQubG9nKGxldmVsLCBtZXNzYWdlLCBtZXRhKVxuICAgICAgaWYgKFxuICAgICAgICByZXN1bHQgJiZcbiAgICAgICAgdHlwZW9mIChyZXN1bHQgYXMgeyBjYXRjaD86IHVua25vd24gfSkuY2F0Y2ggPT09ICdmdW5jdGlvbidcbiAgICAgICkge1xuICAgICAgICA7KHJlc3VsdCBhcyBQcm9taXNlPHZvaWQ+KS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgLy8gSWdub3JlIGVycm9yc1xuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gVHJhbnNwb3J0IGZhaWx1cmVzIG11c3QgbmV2ZXIgY3Jhc2ggYXBwbGljYXRpb24gbG9nZ2luZy5cbiAgICB9XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgYXBwZW5kRmlsZSB9IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnXG5pbXBvcnQgeyBkaXJuYW1lIH0gZnJvbSAnbm9kZTpwYXRoJ1xuaW1wb3J0IHR5cGUgeyBMb2dMZXZlbCwgT3B0aW9ucywgUmVxdWVzdEluZm8sIFN0b3JlRGF0YSB9IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQgeyBlbnN1cmVEaXIgfSBmcm9tICcuL2ZzJ1xuaW1wb3J0IHsgcGVyZm9ybVJvdGF0aW9uLCBzaG91bGRSb3RhdGUgfSBmcm9tICcuL3JvdGF0aW9uLW1hbmFnZXInXG5cbmludGVyZmFjZSBMb2dUb0ZpbGVJbnB1dCB7XG4gIGZpbGVQYXRoOiBzdHJpbmdcbiAgbGV2ZWw6IExvZ0xldmVsXG4gIHJlcXVlc3Q6IFJlcXVlc3RJbmZvXG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gIHN0b3JlOiBTdG9yZURhdGFcbiAgb3B0aW9uczogT3B0aW9uc1xufVxuXG5leHBvcnQgY29uc3QgbG9nVG9GaWxlID0gYXN5bmMgKFxuICAuLi5hcmdzOlxuICAgIHwgW0xvZ1RvRmlsZUlucHV0XVxuICAgIHwgW1xuICAgICAgICBzdHJpbmcsXG4gICAgICAgIExvZ0xldmVsLFxuICAgICAgICBSZXF1ZXN0SW5mbyxcbiAgICAgICAgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICAgIFN0b3JlRGF0YSxcbiAgICAgICAgT3B0aW9uc1xuICAgICAgXVxuKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IGlucHV0OiBMb2dUb0ZpbGVJbnB1dCA9XG4gICAgdHlwZW9mIGFyZ3NbMF0gPT09ICdzdHJpbmcnXG4gICAgICA/ICgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgW1xuICAgICAgICAgICAgZmlsZVBhdGhBcmcsXG4gICAgICAgICAgICBsZXZlbEFyZyxcbiAgICAgICAgICAgIHJlcXVlc3RBcmcsXG4gICAgICAgICAgICBkYXRhQXJnLFxuICAgICAgICAgICAgc3RvcmVBcmcsXG4gICAgICAgICAgICBvcHRpb25zQXJnXG4gICAgICAgICAgXSA9IGFyZ3MgYXMgW1xuICAgICAgICAgICAgc3RyaW5nLFxuICAgICAgICAgICAgTG9nTGV2ZWwsXG4gICAgICAgICAgICBSZXF1ZXN0SW5mbyxcbiAgICAgICAgICAgIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICAgICAgU3RvcmVEYXRhLFxuICAgICAgICAgICAgT3B0aW9uc1xuICAgICAgICAgIF1cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZmlsZVBhdGg6IGZpbGVQYXRoQXJnLFxuICAgICAgICAgICAgbGV2ZWw6IGxldmVsQXJnLFxuICAgICAgICAgICAgcmVxdWVzdDogcmVxdWVzdEFyZyxcbiAgICAgICAgICAgIGRhdGE6IGRhdGFBcmcsXG4gICAgICAgICAgICBzdG9yZTogc3RvcmVBcmcsXG4gICAgICAgICAgICBvcHRpb25zOiBvcHRpb25zQXJnXG4gICAgICAgICAgfVxuICAgICAgICB9KSgpXG4gICAgICA6IGFyZ3NbMF1cblxuICBjb25zdCB7IGZpbGVQYXRoLCBsZXZlbCwgcmVxdWVzdCwgZGF0YSwgc3RvcmUsIG9wdGlvbnMgfSA9IGlucHV0XG4gIGNvbnN0IGNvbmZpZyA9IG9wdGlvbnMuY29uZmlnXG4gIGNvbnN0IHVzZVRyYW5zcG9ydHNPbmx5ID0gY29uZmlnPy51c2VUcmFuc3BvcnRzT25seSA9PT0gdHJ1ZVxuICBjb25zdCBkaXNhYmxlRmlsZUxvZ2dpbmcgPSBjb25maWc/LmRpc2FibGVGaWxlTG9nZ2luZyA9PT0gdHJ1ZVxuICBpZiAodXNlVHJhbnNwb3J0c09ubHkgfHwgZGlzYWJsZUZpbGVMb2dnaW5nKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCBtZXNzYWdlID0gdHlwZW9mIGRhdGEubWVzc2FnZSA9PT0gJ3N0cmluZycgPyBkYXRhLm1lc3NhZ2UgOiAnJ1xuICBjb25zdCBkdXJhdGlvbk1zID1cbiAgICBzdG9yZS5iZWZvcmVUaW1lID09PSBCaWdJbnQoMClcbiAgICAgID8gMFxuICAgICAgOiBOdW1iZXIocHJvY2Vzcy5ocnRpbWUuYmlnaW50KCkgLSBzdG9yZS5iZWZvcmVUaW1lKSAvIDFfMDAwXzAwMFxuXG4gIGNvbnN0IGxpbmUgPSBgJHtsZXZlbH0gJHtkdXJhdGlvbk1zLnRvRml4ZWQoMil9bXMgJHtyZXF1ZXN0Lm1ldGhvZH0gJHtuZXcgVVJMKHJlcXVlc3QudXJsKS5wYXRobmFtZX0gJHttZXNzYWdlfVxcbmBcblxuICBhd2FpdCBlbnN1cmVEaXIoZGlybmFtZShmaWxlUGF0aCkpXG4gIGF3YWl0IGFwcGVuZEZpbGUoZmlsZVBhdGgsIGxpbmUsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSlcblxuICBjb25zdCByb3RhdGlvbiA9IGNvbmZpZz8ubG9nUm90YXRpb25cbiAgaWYgKCFyb3RhdGlvbikge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3Qgc2hvdWxkID0gYXdhaXQgc2hvdWxkUm90YXRlKGZpbGVQYXRoLCByb3RhdGlvbilcbiAgaWYgKHNob3VsZCkge1xuICAgIGF3YWl0IHBlcmZvcm1Sb3RhdGlvbihmaWxlUGF0aCwgcm90YXRpb24pXG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgcHJvbWlzZXMgYXMgZnMgfSBmcm9tICdub2RlOmZzJ1xuXG5leHBvcnQgY29uc3QgZW5zdXJlRGlyID0gYXN5bmMgKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4gPT4ge1xuICBhd2FpdCBmcy5ta2RpcihkaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KVxufVxuIiwKICAgICJpbXBvcnQgeyBwcm9taXNlcyBhcyBmcyB9IGZyb20gJ25vZGU6ZnMnXG5pbXBvcnQgeyBwcm9taXNpZnkgfSBmcm9tICdub2RlOnV0aWwnXG5pbXBvcnQgeyBnemlwIH0gZnJvbSAnbm9kZTp6bGliJ1xuaW1wb3J0IHR5cGUgeyBMb2dSb3RhdGlvbkNvbmZpZyB9IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQge1xuICBnZXRSb3RhdGVkRmlsZXMsXG4gIHBhcnNlUmV0ZW50aW9uLFxuICBwYXJzZVNpemUsXG4gIHNob3VsZFJvdGF0ZUJ5U2l6ZVxufSBmcm9tICcuLi91dGlscy9yb3RhdGlvbidcblxuY29uc3QgZ3ppcEFzeW5jID0gcHJvbWlzaWZ5KGd6aXApXG5cbmNvbnN0IHBhZDIgPSAodmFsdWU6IG51bWJlcik6IHN0cmluZyA9PiBTdHJpbmcodmFsdWUpLnBhZFN0YXJ0KDIsICcwJylcblxuZXhwb3J0IGNvbnN0IGdldFJvdGF0ZWRGaWxlTmFtZSA9IChmaWxlUGF0aDogc3RyaW5nLCBkYXRlOiBEYXRlKTogc3RyaW5nID0+IHtcbiAgY29uc3QgeXl5eSA9IGRhdGUuZ2V0RnVsbFllYXIoKVxuICBjb25zdCBtbSA9IHBhZDIoZGF0ZS5nZXRNb250aCgpICsgMSlcbiAgY29uc3QgZGQgPSBwYWQyKGRhdGUuZ2V0RGF0ZSgpKVxuICBjb25zdCBISCA9IHBhZDIoZGF0ZS5nZXRIb3VycygpKVxuICBjb25zdCBNTSA9IHBhZDIoZGF0ZS5nZXRNaW51dGVzKCkpXG4gIGNvbnN0IHNzID0gcGFkMihkYXRlLmdldFNlY29uZHMoKSlcbiAgcmV0dXJuIGAke2ZpbGVQYXRofS4ke3l5eXl9LSR7bW19LSR7ZGR9LSR7SEh9LSR7TU19LSR7c3N9YFxufVxuXG5leHBvcnQgY29uc3Qgcm90YXRlRmlsZSA9IGFzeW5jIChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0ID0gYXdhaXQgZnMuc3RhdChmaWxlUGF0aClcbiAgICBpZiAoc3RhdC5zaXplID09PSAwKSB7XG4gICAgICByZXR1cm4gJydcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgY29uc3Qgcm90YXRlZCA9IGdldFJvdGF0ZWRGaWxlTmFtZShmaWxlUGF0aCwgbmV3IERhdGUoKSlcbiAgYXdhaXQgZnMucmVuYW1lKGZpbGVQYXRoLCByb3RhdGVkKVxuICByZXR1cm4gcm90YXRlZFxufVxuXG5leHBvcnQgY29uc3QgY29tcHJlc3NGaWxlID0gYXN5bmMgKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGZpbGVQYXRoKVxuICBjb25zdCBjb21wcmVzc2VkID0gYXdhaXQgZ3ppcEFzeW5jKGNvbnRlbnQpXG4gIGF3YWl0IGZzLndyaXRlRmlsZShgJHtmaWxlUGF0aH0uZ3pgLCBjb21wcmVzc2VkKVxuICBhd2FpdCBmcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KVxufVxuXG5leHBvcnQgY29uc3Qgc2hvdWxkUm90YXRlID0gYXN5bmMgKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBjb25maWc6IExvZ1JvdGF0aW9uQ29uZmlnXG4pOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgaWYgKGNvbmZpZy5tYXhTaXplID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuICBjb25zdCBtYXhTaXplID0gcGFyc2VTaXplKGNvbmZpZy5tYXhTaXplKVxuICByZXR1cm4gYXdhaXQgc2hvdWxkUm90YXRlQnlTaXplKGZpbGVQYXRoLCBtYXhTaXplKVxufVxuXG5jb25zdCBjbGVhbnVwQnlDb3VudCA9IGFzeW5jIChcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgbWF4RmlsZXM6IG51bWJlclxuKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IHJvdGF0ZWQgPSBhd2FpdCBnZXRSb3RhdGVkRmlsZXMoZmlsZVBhdGgpXG4gIGlmIChyb3RhdGVkLmxlbmd0aCA8PSBtYXhGaWxlcykge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3Qgc3RhdHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICByb3RhdGVkLm1hcChhc3luYyBwID0+ICh7IHBhdGg6IHAsIHN0YXQ6IGF3YWl0IGZzLnN0YXQocCkgfSkpXG4gIClcblxuICBzdGF0cy5zb3J0KChhLCBiKSA9PiBiLnN0YXQubXRpbWVNcyAtIGEuc3RhdC5tdGltZU1zKVxuICBjb25zdCB0b0RlbGV0ZSA9IHN0YXRzLnNsaWNlKG1heEZpbGVzKVxuICBhd2FpdCBQcm9taXNlLmFsbCh0b0RlbGV0ZS5tYXAoKHsgcGF0aCB9KSA9PiBmcy5ybShwYXRoLCB7IGZvcmNlOiB0cnVlIH0pKSlcbn1cblxuY29uc3QgY2xlYW51cEJ5VGltZSA9IGFzeW5jIChcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgbWF4QWdlTXM6IG51bWJlclxuKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IHJvdGF0ZWQgPSBhd2FpdCBnZXRSb3RhdGVkRmlsZXMoZmlsZVBhdGgpXG4gIGlmIChyb3RhdGVkLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKVxuICBjb25zdCBzdGF0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgIHJvdGF0ZWQubWFwKGFzeW5jIHAgPT4gKHsgcGF0aDogcCwgc3RhdDogYXdhaXQgZnMuc3RhdChwKSB9KSlcbiAgKVxuXG4gIGNvbnN0IHRvRGVsZXRlID0gc3RhdHMuZmlsdGVyKCh7IHN0YXQgfSkgPT4gbm93IC0gc3RhdC5tdGltZU1zID4gbWF4QWdlTXMpXG4gIGF3YWl0IFByb21pc2UuYWxsKHRvRGVsZXRlLm1hcCgoeyBwYXRoIH0pID0+IGZzLnJtKHBhdGgsIHsgZm9yY2U6IHRydWUgfSkpKVxufVxuXG5leHBvcnQgY29uc3QgcGVyZm9ybVJvdGF0aW9uID0gYXN5bmMgKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBjb25maWc6IExvZ1JvdGF0aW9uQ29uZmlnXG4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgY29uc3Qgcm90YXRlZCA9IGF3YWl0IHJvdGF0ZUZpbGUoZmlsZVBhdGgpXG4gIGlmICghcm90YXRlZCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3Qgc2hvdWxkQ29tcHJlc3MgPSBjb25maWcuY29tcHJlc3MgPT09IHRydWVcbiAgaWYgKHNob3VsZENvbXByZXNzKSB7XG4gICAgY29uc3QgYWxnbyA9IGNvbmZpZy5jb21wcmVzc2lvbiA/PyAnZ3ppcCdcbiAgICBpZiAoYWxnbyA9PT0gJ2d6aXAnKSB7XG4gICAgICBhd2FpdCBjb21wcmVzc0ZpbGUocm90YXRlZClcbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlnLm1heEZpbGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCByZXRlbnRpb24gPSBwYXJzZVJldGVudGlvbihjb25maWcubWF4RmlsZXMpXG4gICAgaWYgKHJldGVudGlvbi50eXBlID09PSAnY291bnQnKSB7XG4gICAgICBhd2FpdCBjbGVhbnVwQnlDb3VudChmaWxlUGF0aCwgcmV0ZW50aW9uLnZhbHVlKVxuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBjbGVhbnVwQnlUaW1lKGZpbGVQYXRoLCByZXRlbnRpb24udmFsdWUpXG4gICAgfVxuICB9XG5cbiAgLy8gT3B0aW9uYWwgaW50ZXJ2YWwtYmFzZWQgcm90YXRpb24gY2xlYW51cCAoY3JlYXRlIGludGVydmFsIGRpcmVjdG9yaWVzIC8gbmFtaW5nKSBpcyBub3QgcmVxdWlyZWQgYnkgdGVzdHMuXG59XG4iLAogICAgImltcG9ydCB7IHByb21pc2VzIGFzIGZzIH0gZnJvbSAnbm9kZTpmcydcbmltcG9ydCB7IGJhc2VuYW1lLCBkaXJuYW1lIH0gZnJvbSAnbm9kZTpwYXRoJ1xuXG5jb25zdCBTSVpFX1JFR0VYID0gL14oXFxkKyg/OlxcLlxcZCspPykoa3xrYnxtfG1ifGd8Z2IpJC9pXG5jb25zdCBJTlRFUlZBTF9SRUdFWCA9IC9eKFxcZCspKGh8ZHx3KSQvaVxuY29uc3QgUk9UQVRFRF9SRUdFWCA9IC9cXC4oXFxkezR9LVxcZHsyfS1cXGR7Mn0tXFxkezJ9LVxcZHsyfS1cXGR7Mn0pKD86XFwuZ3opPyQvXG5cbmV4cG9ydCBjb25zdCBwYXJzZVNpemUgPSAodmFsdWU6IG51bWJlciB8IHN0cmluZyk6IG51bWJlciA9PiB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuICBjb25zdCB0cmltbWVkID0gdmFsdWUudHJpbSgpXG4gIGNvbnN0IGFzTnVtYmVyID0gTnVtYmVyKHRyaW1tZWQpXG4gIGlmIChOdW1iZXIuaXNGaW5pdGUoYXNOdW1iZXIpKSB7XG4gICAgcmV0dXJuIGFzTnVtYmVyXG4gIH1cblxuICBjb25zdCBtYXRjaCA9IHRyaW1tZWQubWF0Y2goU0laRV9SRUdFWClcbiAgaWYgKCFtYXRjaCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzaXplIGZvcm1hdDogJHt2YWx1ZX1gKVxuICB9XG5cbiAgY29uc3QgYW1vdW50ID0gTnVtYmVyKG1hdGNoWzFdKVxuICBjb25zdCB1bml0ID0gbWF0Y2hbMl0udG9Mb3dlckNhc2UoKVxuXG4gIGxldCBiYXNlID0gMTAyNFxuICBpZiAodW5pdC5zdGFydHNXaXRoKCdtJykpIHtcbiAgICBiYXNlID0gMTAyNCAqIDEwMjRcbiAgfSBlbHNlIGlmICh1bml0LnN0YXJ0c1dpdGgoJ2cnKSkge1xuICAgIGJhc2UgPSAxMDI0ICogMTAyNCAqIDEwMjRcbiAgfVxuXG4gIHJldHVybiBNYXRoLmZsb29yKGFtb3VudCAqIGJhc2UpXG59XG5cbmV4cG9ydCBjb25zdCBwYXJzZUludGVydmFsID0gKHZhbHVlOiBzdHJpbmcpOiBudW1iZXIgPT4ge1xuICBjb25zdCBtYXRjaCA9IHZhbHVlLnRyaW0oKS5tYXRjaChJTlRFUlZBTF9SRUdFWClcbiAgaWYgKCFtYXRjaCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBpbnRlcnZhbCBmb3JtYXQ6ICR7dmFsdWV9YClcbiAgfVxuXG4gIGNvbnN0IGFtb3VudCA9IE51bWJlcihtYXRjaFsxXSlcbiAgY29uc3QgdW5pdCA9IG1hdGNoWzJdLnRvTG93ZXJDYXNlKClcblxuICBsZXQgbXMgPSA2MCAqIDYwICogMTAwMFxuICBpZiAodW5pdCA9PT0gJ2QnKSB7XG4gICAgbXMgPSAyNCAqIDYwICogNjAgKiAxMDAwXG4gIH0gZWxzZSBpZiAodW5pdCA9PT0gJ3cnKSB7XG4gICAgbXMgPSA3ICogMjQgKiA2MCAqIDYwICogMTAwMFxuICB9XG5cbiAgcmV0dXJuIGFtb3VudCAqIG1zXG59XG5cbmV4cG9ydCBjb25zdCBwYXJzZVJldGVudGlvbiA9IChcbiAgdmFsdWU6IG51bWJlciB8IHN0cmluZ1xuKTogeyB0eXBlOiAnY291bnQnIHwgJ3RpbWUnOyB2YWx1ZTogbnVtYmVyIH0gPT4ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB7IHR5cGU6ICdjb3VudCcsIHZhbHVlIH1cbiAgfVxuICByZXR1cm4geyB0eXBlOiAndGltZScsIHZhbHVlOiBwYXJzZUludGVydmFsKHZhbHVlKSB9XG59XG5cbmV4cG9ydCBjb25zdCBzaG91bGRSb3RhdGVCeVNpemUgPSBhc3luYyAoXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIG1heFNpemVCeXRlczogbnVtYmVyXG4pOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0ID0gYXdhaXQgZnMuc3RhdChmaWxlUGF0aClcbiAgICByZXR1cm4gc3RhdC5zaXplID4gbWF4U2l6ZUJ5dGVzXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBnZXRSb3RhdGVkRmlsZXMgPSBhc3luYyAoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nW10+ID0+IHtcbiAgY29uc3QgZGlyID0gZGlybmFtZShmaWxlUGF0aClcbiAgY29uc3QgYmFzZSA9IGJhc2VuYW1lKGZpbGVQYXRoKVxuXG4gIGxldCBlbnRyaWVzOiBzdHJpbmdbXVxuICB0cnkge1xuICAgIGVudHJpZXMgPSBhd2FpdCBmcy5yZWFkZGlyKGRpcilcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIFtdXG4gIH1cblxuICByZXR1cm4gZW50cmllc1xuICAgIC5maWx0ZXIobmFtZSA9PiBuYW1lLnN0YXJ0c1dpdGgoYCR7YmFzZX0uYCkgJiYgUk9UQVRFRF9SRUdFWC50ZXN0KG5hbWUpKVxuICAgIC5tYXAobmFtZSA9PiBgJHtkaXJ9LyR7bmFtZX1gKVxufVxuIiwKICAgICJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnXG5pbXBvcnQgeyBnZXRTdGF0dXNDb2RlIH0gZnJvbSAnLi4vaGVscGVycy9zdGF0dXMnXG5pbXBvcnQgdHlwZSB7IExvZ0xldmVsLCBPcHRpb25zLCBQaW5vLCBTdG9yZURhdGEgfSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuXG5jb25zdCBwYWQyID0gKHZhbHVlOiBudW1iZXIpOiBzdHJpbmcgPT4gU3RyaW5nKHZhbHVlKS5wYWRTdGFydCgyLCAnMCcpXG5jb25zdCBwYWQzID0gKHZhbHVlOiBudW1iZXIpOiBzdHJpbmcgPT4gU3RyaW5nKHZhbHVlKS5wYWRTdGFydCgzLCAnMCcpXG5cbmNvbnN0IHNob3VsZFVzZUNvbG9ycyA9IChvcHRpb25zOiBPcHRpb25zKTogYm9vbGVhbiA9PiB7XG4gIGNvbnN0IGNvbmZpZyA9IG9wdGlvbnMuY29uZmlnXG4gIGNvbnN0IGVuYWJsZWRCeUNvbmZpZyA9IGNvbmZpZz8udXNlQ29sb3JzID8/IHRydWVcblxuICAvLyBBdm9pZCBBTlNJIHNlcXVlbmNlcyBpbiBub24taW50ZXJhY3RpdmUgb3V0cHV0IChwaXBlcywgQ0kgbG9ncywgZmlsZXMpLlxuICBjb25zdCBpc1R0eSA9IHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiBwcm9jZXNzLnN0ZG91dD8uaXNUVFkgPT09IHRydWVcbiAgcmV0dXJuIGVuYWJsZWRCeUNvbmZpZyAmJiBpc1R0eVxufVxuXG5jb25zdCBmb3JtYXRUaW1lc3RhbXAgPSAoZGF0ZTogRGF0ZSwgcGF0dGVybj86IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGlmICghcGF0dGVybikge1xuICAgIHJldHVybiBkYXRlLnRvSVNPU3RyaW5nKClcbiAgfVxuXG4gIGNvbnN0IHl5eXkgPSBTdHJpbmcoZGF0ZS5nZXRGdWxsWWVhcigpKVxuICBjb25zdCBtbSA9IHBhZDIoZGF0ZS5nZXRNb250aCgpICsgMSlcbiAgY29uc3QgZGQgPSBwYWQyKGRhdGUuZ2V0RGF0ZSgpKVxuICBjb25zdCBISCA9IHBhZDIoZGF0ZS5nZXRIb3VycygpKVxuICBjb25zdCBNTSA9IHBhZDIoZGF0ZS5nZXRNaW51dGVzKCkpXG4gIGNvbnN0IHNzID0gcGFkMihkYXRlLmdldFNlY29uZHMoKSlcbiAgY29uc3QgU1NTID0gcGFkMyhkYXRlLmdldE1pbGxpc2Vjb25kcygpKVxuXG4gIHJldHVybiBwYXR0ZXJuXG4gICAgLnJlcGxhY2VBbGwoJ3l5eXknLCB5eXl5KVxuICAgIC5yZXBsYWNlQWxsKCdtbScsIG1tKVxuICAgIC5yZXBsYWNlQWxsKCdkZCcsIGRkKVxuICAgIC5yZXBsYWNlQWxsKCdISCcsIEhIKVxuICAgIC5yZXBsYWNlQWxsKCdNTScsIE1NKVxuICAgIC5yZXBsYWNlQWxsKCdzcycsIHNzKVxuICAgIC5yZXBsYWNlQWxsKCdTU1MnLCBTU1MpXG59XG5cbmNvbnN0IGdldElwID0gKHJlcXVlc3Q6IFJlcXVlc3QpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBmb3J3YXJkZWQgPSByZXF1ZXN0LmhlYWRlcnMuZ2V0KCd4LWZvcndhcmRlZC1mb3InKVxuICBpZiAoZm9yd2FyZGVkKSB7XG4gICAgcmV0dXJuIGZvcndhcmRlZC5zcGxpdCgnLCcpWzBdPy50cmltKCkgPz8gJydcbiAgfVxuICByZXR1cm4gcmVxdWVzdC5oZWFkZXJzLmdldCgneC1yZWFsLWlwJykgPz8gJydcbn1cblxuY29uc3QgZ2V0Q29sb3JlZExldmVsID0gKGxldmVsOiBMb2dMZXZlbCwgdXNlQ29sb3JzOiBib29sZWFuKTogc3RyaW5nID0+IHtcbiAgaWYgKCF1c2VDb2xvcnMpIHtcbiAgICByZXR1cm4gbGV2ZWxcbiAgfVxuXG4gIGlmIChsZXZlbCA9PT0gJ0VSUk9SJykge1xuICAgIHJldHVybiBjaGFsay5iZ1JlZC5ibGFjayhsZXZlbClcbiAgfVxuICBpZiAobGV2ZWwgPT09ICdXQVJOSU5HJykge1xuICAgIHJldHVybiBjaGFsay5iZ1llbGxvdy5ibGFjayhsZXZlbClcbiAgfVxuICBpZiAobGV2ZWwgPT09ICdERUJVRycpIHtcbiAgICByZXR1cm4gY2hhbGsuYmdCbHVlLmJsYWNrKGxldmVsKVxuICB9XG5cbiAgcmV0dXJuIGNoYWxrLmJnR3JlZW4uYmxhY2sobGV2ZWwpXG59XG5cbmNvbnN0IGdldENvbG9yZWRNZXRob2QgPSAobWV0aG9kOiBzdHJpbmcsIHVzZUNvbG9yczogYm9vbGVhbik6IHN0cmluZyA9PiB7XG4gIGlmICghdXNlQ29sb3JzKSB7XG4gICAgcmV0dXJuIG1ldGhvZFxuICB9XG5cbiAgY29uc3QgdXBwZXIgPSBtZXRob2QudG9VcHBlckNhc2UoKVxuICBpZiAodXBwZXIgPT09ICdHRVQnKSB7XG4gICAgcmV0dXJuIGNoYWxrLmdyZWVuLmJvbGQodXBwZXIpXG4gIH1cbiAgaWYgKHVwcGVyID09PSAnUE9TVCcpIHtcbiAgICByZXR1cm4gY2hhbGsuYmx1ZS5ib2xkKHVwcGVyKVxuICB9XG4gIGlmICh1cHBlciA9PT0gJ1BVVCcpIHtcbiAgICByZXR1cm4gY2hhbGsueWVsbG93LmJvbGQodXBwZXIpXG4gIH1cbiAgaWYgKHVwcGVyID09PSAnUEFUQ0gnKSB7XG4gICAgcmV0dXJuIGNoYWxrLnllbGxvd0JyaWdodC5ib2xkKHVwcGVyKVxuICB9XG4gIGlmICh1cHBlciA9PT0gJ0RFTEVURScpIHtcbiAgICByZXR1cm4gY2hhbGsucmVkLmJvbGQodXBwZXIpXG4gIH1cbiAgaWYgKHVwcGVyID09PSAnT1BUSU9OUycpIHtcbiAgICByZXR1cm4gY2hhbGsuY3lhbi5ib2xkKHVwcGVyKVxuICB9XG4gIGlmICh1cHBlciA9PT0gJ0hFQUQnKSB7XG4gICAgcmV0dXJuIGNoYWxrLmdyZWVuQnJpZ2h0LmJvbGQodXBwZXIpXG4gIH1cbiAgaWYgKHVwcGVyID09PSAnVFJBQ0UnKSB7XG4gICAgcmV0dXJuIGNoYWxrLm1hZ2VudGEuYm9sZCh1cHBlcilcbiAgfVxuICBpZiAodXBwZXIgPT09ICdDT05ORUNUJykge1xuICAgIHJldHVybiBjaGFsay5jeWFuQnJpZ2h0LmJvbGQodXBwZXIpXG4gIH1cblxuICByZXR1cm4gY2hhbGsud2hpdGUuYm9sZCh1cHBlcilcbn1cblxuY29uc3QgZ2V0Q29sb3JlZFN0YXR1cyA9IChzdGF0dXM6IHN0cmluZywgdXNlQ29sb3JzOiBib29sZWFuKTogc3RyaW5nID0+IHtcbiAgaWYgKCF1c2VDb2xvcnMpIHtcbiAgICByZXR1cm4gc3RhdHVzXG4gIH1cblxuICBjb25zdCBudW1lcmljID0gTnVtYmVyLnBhcnNlSW50KHN0YXR1cywgMTApXG4gIGlmICghTnVtYmVyLmlzRmluaXRlKG51bWVyaWMpKSB7XG4gICAgcmV0dXJuIHN0YXR1c1xuICB9XG5cbiAgaWYgKG51bWVyaWMgPj0gNTAwKSB7XG4gICAgcmV0dXJuIGNoYWxrLnJlZChzdGF0dXMpXG4gIH1cbiAgaWYgKG51bWVyaWMgPj0gNDAwKSB7XG4gICAgcmV0dXJuIGNoYWxrLnllbGxvdyhzdGF0dXMpXG4gIH1cbiAgaWYgKG51bWVyaWMgPj0gMzAwKSB7XG4gICAgcmV0dXJuIGNoYWxrLmN5YW4oc3RhdHVzKVxuICB9XG4gIGlmIChudW1lcmljID49IDIwMCkge1xuICAgIHJldHVybiBjaGFsay5ncmVlbihzdGF0dXMpXG4gIH1cbiAgcmV0dXJuIGNoYWxrLmdyYXkoc3RhdHVzKVxufVxuXG5jb25zdCBnZXRDb2xvcmVkRHVyYXRpb24gPSAoZHVyYXRpb246IHN0cmluZywgdXNlQ29sb3JzOiBib29sZWFuKTogc3RyaW5nID0+IHtcbiAgaWYgKCF1c2VDb2xvcnMpIHtcbiAgICByZXR1cm4gZHVyYXRpb25cbiAgfVxuXG4gIHJldHVybiBjaGFsay5ncmF5KGR1cmF0aW9uKVxufVxuXG5jb25zdCBnZXRDb2xvcmVkVGltZXN0YW1wID0gKHRpbWVzdGFtcDogc3RyaW5nLCB1c2VDb2xvcnM6IGJvb2xlYW4pOiBzdHJpbmcgPT4ge1xuICBpZiAoIXVzZUNvbG9ycykge1xuICAgIHJldHVybiB0aW1lc3RhbXBcbiAgfVxuXG4gIHJldHVybiBjaGFsay5iZ0hleCgnI0ZGQTUwMCcpLmJsYWNrKHRpbWVzdGFtcClcbn1cblxuY29uc3QgZ2V0Q29sb3JlZFBhdGhuYW1lID0gKHBhdGhuYW1lOiBzdHJpbmcsIHVzZUNvbG9yczogYm9vbGVhbik6IHN0cmluZyA9PiB7XG4gIGlmICghdXNlQ29sb3JzKSB7XG4gICAgcmV0dXJuIHBhdGhuYW1lXG4gIH1cblxuICByZXR1cm4gY2hhbGsud2hpdGVCcmlnaHQocGF0aG5hbWUpXG59XG5cbmNvbnN0IGdldENvbnRleHRTdHJpbmcgPSAodmFsdWU6IHVua25vd24pOiBzdHJpbmcgPT4ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSlcbiAgfVxuXG4gIHJldHVybiAnJ1xufVxuXG5leHBvcnQgY29uc3QgZm9ybWF0TGluZSA9ICh7XG4gIGxldmVsLFxuICByZXF1ZXN0LFxuICBkYXRhLFxuICBzdG9yZSxcbiAgb3B0aW9uc1xufToge1xuICBsZXZlbDogTG9nTGV2ZWxcbiAgcmVxdWVzdDogUmVxdWVzdFxuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICBzdG9yZTogU3RvcmVEYXRhXG4gIG9wdGlvbnM6IE9wdGlvbnNcbn0pOiBzdHJpbmcgPT4ge1xuICBjb25zdCBjb25maWcgPSBvcHRpb25zLmNvbmZpZ1xuICBjb25zdCB1c2VDb2xvcnMgPSBzaG91bGRVc2VDb2xvcnMob3B0aW9ucylcbiAgY29uc3QgZm9ybWF0ID1cbiAgICBjb25maWc/LmN1c3RvbUxvZ0Zvcm1hdCA/P1xuICAgICfwn6aKIHtub3d9IHtsZXZlbH0ge2R1cmF0aW9ufSB7bWV0aG9kfSB7cGF0aG5hbWV9IHtzdGF0dXN9IHttZXNzYWdlfSB7aXB9IHtjb250ZXh0fSdcblxuICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpXG4gIGNvbnN0IGVwb2NoID0gU3RyaW5nKG5vdy5nZXRUaW1lKCkpXG4gIGNvbnN0IHJhd1RpbWVzdGFtcCA9IGZvcm1hdFRpbWVzdGFtcChub3csIGNvbmZpZz8udGltZXN0YW1wPy50cmFuc2xhdGVUaW1lKVxuICBjb25zdCB0aW1lc3RhbXAgPSBnZXRDb2xvcmVkVGltZXN0YW1wKHJhd1RpbWVzdGFtcCwgdXNlQ29sb3JzKVxuXG4gIGNvbnN0IG1lc3NhZ2UgPSB0eXBlb2YgZGF0YS5tZXNzYWdlID09PSAnc3RyaW5nJyA/IGRhdGEubWVzc2FnZSA6ICcnXG4gIGNvbnN0IGR1cmF0aW9uTXMgPVxuICAgIHN0b3JlLmJlZm9yZVRpbWUgPT09IEJpZ0ludCgwKVxuICAgICAgPyAwXG4gICAgICA6IE51bWJlcihwcm9jZXNzLmhydGltZS5iaWdpbnQoKSAtIHN0b3JlLmJlZm9yZVRpbWUpIC8gMV8wMDBfMDAwXG5cbiAgY29uc3QgcGF0aG5hbWUgPSBuZXcgVVJMKHJlcXVlc3QudXJsKS5wYXRobmFtZVxuICBjb25zdCBzdGF0dXNWYWx1ZSA9IGRhdGEuc3RhdHVzXG4gIGNvbnN0IHN0YXR1c0NvZGUgPVxuICAgIHN0YXR1c1ZhbHVlID09PSBudWxsIHx8IHN0YXR1c1ZhbHVlID09PSB1bmRlZmluZWRcbiAgICAgID8gMjAwXG4gICAgICA6IGdldFN0YXR1c0NvZGUoc3RhdHVzVmFsdWUpXG4gIGNvbnN0IHN0YXR1cyA9IFN0cmluZyhzdGF0dXNDb2RlKVxuICBjb25zdCBpcCA9IGNvbmZpZz8uaXAgPT09IHRydWUgPyBnZXRJcChyZXF1ZXN0KSA6ICcnXG4gIGNvbnN0IGN0eFN0cmluZyA9IGdldENvbnRleHRTdHJpbmcoZGF0YS5jb250ZXh0KVxuICBjb25zdCBjb2xvcmVkTGV2ZWwgPSBnZXRDb2xvcmVkTGV2ZWwobGV2ZWwsIHVzZUNvbG9ycylcbiAgY29uc3QgY29sb3JlZE1ldGhvZCA9IGdldENvbG9yZWRNZXRob2QocmVxdWVzdC5tZXRob2QsIHVzZUNvbG9ycylcbiAgY29uc3QgY29sb3JlZFBhdGhuYW1lID0gZ2V0Q29sb3JlZFBhdGhuYW1lKHBhdGhuYW1lLCB1c2VDb2xvcnMpXG4gIGNvbnN0IGNvbG9yZWRTdGF0dXMgPSBnZXRDb2xvcmVkU3RhdHVzKHN0YXR1cywgdXNlQ29sb3JzKVxuICBjb25zdCBjb2xvcmVkRHVyYXRpb24gPSBnZXRDb2xvcmVkRHVyYXRpb24oXG4gICAgYCR7ZHVyYXRpb25Ncy50b0ZpeGVkKDIpfW1zYCxcbiAgICB1c2VDb2xvcnNcbiAgKVxuXG4gIHJldHVybiBmb3JtYXRcbiAgICAucmVwbGFjZUFsbCgne25vd30nLCB0aW1lc3RhbXApXG4gICAgLnJlcGxhY2VBbGwoJ3tlcG9jaH0nLCBlcG9jaClcbiAgICAucmVwbGFjZUFsbCgne2xldmVsfScsIGNvbG9yZWRMZXZlbClcbiAgICAucmVwbGFjZUFsbCgne2R1cmF0aW9ufScsIGNvbG9yZWREdXJhdGlvbilcbiAgICAucmVwbGFjZUFsbCgne21ldGhvZH0nLCBjb2xvcmVkTWV0aG9kKVxuICAgIC5yZXBsYWNlQWxsKCd7cGF0aG5hbWV9JywgY29sb3JlZFBhdGhuYW1lKVxuICAgIC5yZXBsYWNlQWxsKCd7cGF0aH0nLCBjb2xvcmVkUGF0aG5hbWUpXG4gICAgLnJlcGxhY2VBbGwoJ3tzdGF0dXN9JywgY29sb3JlZFN0YXR1cylcbiAgICAucmVwbGFjZUFsbCgne21lc3NhZ2V9JywgbWVzc2FnZSlcbiAgICAucmVwbGFjZUFsbCgne2lwfScsIGlwKVxuICAgIC5yZXBsYWNlQWxsKCd7Y29udGV4dH0nLCBjdHhTdHJpbmcpXG59XG5cbmV4cG9ydCBjb25zdCBsb2dXaXRoUGlubyA9IChcbiAgbG9nZ2VyOiBQaW5vLFxuICBsZXZlbDogTG9nTGV2ZWwsXG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4pOiB2b2lkID0+IHtcbiAgaWYgKGxldmVsID09PSAnRVJST1InKSB7XG4gICAgbG9nZ2VyLmVycm9yKGRhdGEpXG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKGxldmVsID09PSAnV0FSTklORycpIHtcbiAgICBsb2dnZXIud2FybihkYXRhKVxuICAgIHJldHVyblxuICB9XG4gIGlmIChsZXZlbCA9PT0gJ0RFQlVHJykge1xuICAgIGxvZ2dlci5kZWJ1ZyhkYXRhKVxuICAgIHJldHVyblxuICB9XG4gIGxvZ2dlci5pbmZvKGRhdGEpXG59XG4iLAogICAgImltcG9ydCB7IFN0YXR1c01hcCB9IGZyb20gJ2VseXNpYSdcblxuY29uc3QgRElHSVRTX09OTFkgPSAvXlxcZCskL1xuY29uc3QgREVMSU1JVEVSUyA9IC9bXy1dKy9nXG5jb25zdCBDQU1FTF9CT1VOREFSWV8xID0gLyhbYS16MC05XSkoW0EtWl0pL2dcbmNvbnN0IENBTUVMX0JPVU5EQVJZXzIgPSAvKFtBLVpdKShbQS1aXVthLXpdKS9nXG5jb25zdCBBUE9TVFJPUEhFUyA9IC9bJ+KAmV0vZ1xuY29uc3QgTk9OX0FMUEhBTlVNRVJJQyA9IC9bXmEtejAtOVxcc10rL2dcbmNvbnN0IFdISVRFU1BBQ0UgPSAvXFxzKy9nXG5cbmNvbnN0IG5vcm1hbGl6ZVN0YXR1c05hbWUgPSAodmFsdWU6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIC8vIEhhbmRsZXMgY29tbW9uIHZhcmlhbnRzOlxuICAvLyAtIGNhc2UgZGlmZmVyZW5jZXM6IFwibm90IGZvdW5kXCIgdnMgXCJOb3QgRm91bmRcIlxuICAvLyAtIHNwYWNpbmcvcHVuY3R1YXRpb246IFwiTm90LUZvdW5kXCIsIFwibm90X2ZvdW5kXCJcbiAgLy8gLSBjYW1lbENhc2UvUGFzY2FsQ2FzZTogXCJJbnRlcm5hbFNlcnZlckVycm9yXCJcbiAgY29uc3QgdHJpbW1lZCA9IHZhbHVlLnRyaW0oKVxuICBpZiAoIXRyaW1tZWQpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIHJldHVybiB0cmltbWVkXG4gICAgLnJlcGxhY2UoREVMSU1JVEVSUywgJyAnKVxuICAgIC5yZXBsYWNlKENBTUVMX0JPVU5EQVJZXzEsICckMSAkMicpXG4gICAgLnJlcGxhY2UoQ0FNRUxfQk9VTkRBUllfMiwgJyQxICQyJylcbiAgICAucmVwbGFjZShBUE9TVFJPUEhFUywgJycpXG4gICAgLnRvTG93ZXJDYXNlKClcbiAgICAucmVwbGFjZShOT05fQUxQSEFOVU1FUklDLCAnICcpXG4gICAgLnJlcGxhY2UoV0hJVEVTUEFDRSwgJyAnKVxuICAgIC50cmltKClcbn1cblxuY29uc3QgU1RBVFVTX0JZX05PUk1BTElaRURfTkFNRSA9ICgoKSA9PiB7XG4gIGNvbnN0IG1hcCA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KClcblxuICBmb3IgKGNvbnN0IFtuYW1lLCBjb2RlXSBvZiBPYmplY3QuZW50cmllcyhTdGF0dXNNYXApKSB7XG4gICAgbWFwLnNldChub3JtYWxpemVTdGF0dXNOYW1lKG5hbWUpLCBjb2RlKVxuICB9XG5cbiAgcmV0dXJuIG1hcFxufSkoKVxuXG5leHBvcnQgY29uc3QgZ2V0U3RhdHVzQ29kZSA9ICh2YWx1ZTogdW5rbm93bik6IG51bWJlciA9PiB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIE51bWJlci5pc0Zpbml0ZSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QgdHJpbW1lZCA9IHZhbHVlLnRyaW0oKVxuICAgIGlmIChESUdJVFNfT05MWS50ZXN0KHRyaW1tZWQpKSB7XG4gICAgICByZXR1cm4gTnVtYmVyKHRyaW1tZWQpXG4gICAgfVxuXG4gICAgY29uc3Qga25vd24gPSBTVEFUVVNfQllfTk9STUFMSVpFRF9OQU1FLmdldChub3JtYWxpemVTdGF0dXNOYW1lKHRyaW1tZWQpKVxuICAgIHJldHVybiBrbm93biA/PyA1MDBcbiAgfVxuXG4gIHJldHVybiA1MDBcbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBQcm9ibGVtRXJyb3IgfSBmcm9tICcuLi9FcnJvci9lcnJvcnMnXG5pbXBvcnQgdHlwZSB7IExvZ0xldmVsLCBPcHRpb25zLCBTdG9yZURhdGEgfSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IHsgbG9nVG9UcmFuc3BvcnRzIH0gZnJvbSAnLi4vb3V0cHV0J1xuaW1wb3J0IHsgbG9nVG9GaWxlIH0gZnJvbSAnLi4vb3V0cHV0L2ZpbGUnXG5cbmV4cG9ydCBjb25zdCBoYW5kbGVIdHRwRXJyb3IgPSAoXG4gIHJlcXVlc3Q6IFJlcXVlc3QsXG4gIHByb2JsZW06IFByb2JsZW1FcnJvcixcbiAgc3RvcmU6IFN0b3JlRGF0YSxcbiAgb3B0aW9uczogT3B0aW9uc1xuKTogdm9pZCA9PiB7XG4gIGNvbnN0IGNvbmZpZyA9IG9wdGlvbnMuY29uZmlnXG4gIC8vIDEuIOWHhuWkh+aXpeW/l+aVsOaNru+8muWwhiBSRkMg5qCH5YeG5a2X5q615LiO5pel5b+X5YWD5pWw5o2u5ZCI5bm2XG4gIGNvbnN0IGxldmVsOiBMb2dMZXZlbCA9ICdFUlJPUidcbiAgY29uc3QgcmZjRGF0YSA9IHByb2JsZW0udG9KU09OKClcbiAgY29uc3QgZGF0YSA9IHtcbiAgICBzdGF0dXM6IHByb2JsZW0uc3RhdHVzLFxuICAgIG1lc3NhZ2U6IHByb2JsZW0uZGV0YWlsIHx8IHByb2JsZW0udGl0bGUsXG4gICAgLi4ucmZjRGF0YVxuICB9XG4gIC8vIDIuIOmYtuaute+8muS8oOi+k+WxgiAoVHJhbnNwb3J0cylcbiAgbG9nVG9UcmFuc3BvcnRzKHsgbGV2ZWwsIHJlcXVlc3QsIGRhdGEsIHN0b3JlLCBvcHRpb25zIH0pXG4gIC8vIDMuIOmYtuaute+8muaMgeS5heWMliAoRmlsZSBMb2dnaW5nKVxuICAvLyDljLnphY3kvaDnmoTmjqXlj6PvvJp1c2VUcmFuc3BvcnRzT25seSDlkowgZGlzYWJsZUZpbGVMb2dnaW5nIOebtOaOpeWcqCBjb25maWcg5LiLXG4gIGlmICghKGNvbmZpZz8udXNlVHJhbnNwb3J0c09ubHkgfHwgY29uZmlnPy5kaXNhYmxlRmlsZUxvZ2dpbmcpKSB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBjb25maWc/LmxvZ0ZpbGVQYXRoXG4gICAgaWYgKGZpbGVQYXRoKSB7XG4gICAgICBsb2dUb0ZpbGUoeyBmaWxlUGF0aCwgbGV2ZWwsIHJlcXVlc3QsIGRhdGEsIHN0b3JlLCBvcHRpb25zIH0pLmNhdGNoKFxuICAgICAgICAoKSA9PiB7IH1cbiAgICAgIClcbiAgICB9XG4gIH1cblxuICAvLyA0LiDpmLbmrrXvvJrmjqfliLblj7DovpPlh7ogKENvbnNvbGUvSW50ZXJuYWwpXG4gIGlmIChjb25maWc/LnVzZVRyYW5zcG9ydHNPbmx5IHx8IGNvbmZpZz8uZGlzYWJsZUludGVybmFsTG9nZ2VyKSByZXR1cm5cblxuICAvLyDlpITnkIbml7bpl7TmiLPmmL7npLrpgLvovpFcbiAgbGV0IHRpbWVzdGFtcCA9ICcnXG4gIGlmIChjb25maWc/LnRpbWVzdGFtcCkge1xuICAgIHRpbWVzdGFtcCA9IGBbJHtuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCl9XSBgXG4gIH1cblxuICAvLyAxLiDlronlhajmj5Dlj5YgTWV0aG9kIOWSjCBQYXRoXG4gIGNvbnN0IG1ldGhvZCA9IHR5cGVvZiByZXF1ZXN0ID09PSAnc3RyaW5nJyA/ICdSRVEnIDogcmVxdWVzdC5tZXRob2RcbiAgY29uc3QgdXJsU3RyaW5nID0gdHlwZW9mIHJlcXVlc3QgPT09ICdzdHJpbmcnID8gcmVxdWVzdCA6IHJlcXVlc3QudXJsXG5cbiAgbGV0IHBhdGg6IHN0cmluZ1xuICB0cnkge1xuICAgIC8vIOWmguaenOaYr+WujOaVtCBVUkwg5YiZ5o+Q5Y+WIHBhdGhuYW1l77yM5aaC5p6c5piv55u45a+56Lev5b6E5YiZ55u05o6l5L2/55SoXG4gICAgcGF0aCA9IHVybFN0cmluZy5pbmNsdWRlcygnOi8vJykgPyBuZXcgVVJMKHVybFN0cmluZykucGF0aG5hbWUgOiB1cmxTdHJpbmdcbiAgfSBjYXRjaCB7XG4gICAgcGF0aCA9IHVybFN0cmluZ1xuICB9XG5cbiAgLy8gMi4g6K+t5LmJ5YyW57uI56uv5omT5Y2wXG4gIC8vIOeOsOWcqOeahOS7o+eggeWvuSBzdHJpbmcg5ZKMIFJlcXVlc3Qg57G75Z6L6YO955m+5YiG5LmL55m+5a6J5YWo5LqGXG4gIGNvbnNvbGUuZXJyb3IoXG4gICAgYCR7dGltZXN0YW1wfSR7bGV2ZWx9ICR7bWV0aG9kfSAke3BhdGh9ICR7cHJvYmxlbS5zdGF0dXN9IC0gJHtwcm9ibGVtLnRpdGxlfWBcbiAgKVxuXG4gIC8vIOWmguaenOWQr+eUqOS6huivpue7humUmeivr+aXpeW/l++8jOaJk+WNsOWujOaVtOeahOmUmeivr+S/oeaBr1xuICBpZiAoY29uZmlnPy5lcnJvcj8udmVyYm9zZUVycm9yTG9nZ2luZykge1xuICAgIGNvbnN0IGpzb24gPSBwcm9ibGVtLnRvSlNPTigpXG5cbiAgICAvLyDmiZPljbAgZGV0YWlsXG4gICAgaWYgKGpzb24uZGV0YWlsKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGAgIERldGFpbDogJHtqc29uLmRldGFpbH1gKVxuICAgIH1cblxuICAgIC8vIOaJk+WNsCBpbnN0YW5jZVxuICAgIGlmIChqc29uLmluc3RhbmNlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGAgIEluc3RhbmNlOiAke2pzb24uaW5zdGFuY2V9YClcbiAgICB9XG5cbiAgICAvLyDmiZPljbAgdHlwZVxuICAgIGlmIChqc29uLnR5cGUgJiYganNvbi50eXBlICE9PSAnYWJvdXQ6YmxhbmsnKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGAgIFR5cGU6ICR7anNvbi50eXBlfWApXG4gICAgfVxuXG4gICAgLy8g5omT5Y2w5omp5bGV5a2X5q6177yI5aaCIHZhbGlkYXRpb24gZXJyb3Jz77yJXG4gICAgY29uc3QgZXh0ZW5zaW9ucyA9IE9iamVjdC5lbnRyaWVzKGpzb24pLmZpbHRlcihcbiAgICAgIChba2V5XSkgPT4gIVsndHlwZScsICd0aXRsZScsICdzdGF0dXMnLCAnZGV0YWlsJywgJ2luc3RhbmNlJ10uaW5jbHVkZXMoa2V5KVxuICAgIClcbiAgICBpZiAoZXh0ZW5zaW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCcgIEV4dGVuc2lvbnM6JylcbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGV4dGVuc2lvbnMpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgICAgICR7a2V5fTpgLCB2YWx1ZSlcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsCiAgICAiLy8gc3JjL2xpYnMvZWx5c2lhLWh0dHAtcHJvYmxlbS1qc29uL2Vycm9ycy50c1xuXG5leHBvcnQgaW50ZXJmYWNlIFByb2JsZW1Eb2N1bWVudCB7XG4gIHR5cGU6IHN0cmluZ1xuICB0aXRsZTogc3RyaW5nXG4gIHN0YXR1cz86IG51bWJlclxuICBkZXRhaWw/OiBzdHJpbmdcbiAgaW5zdGFuY2U/OiBzdHJpbmdcbiAgW2tleTogc3RyaW5nXTogdW5rbm93blxufVxuXG4vKipcbiAqIFJGQyA5NDU3IFByb2JsZW0gRGV0YWlscyBFcnJvciBCYXNlIENsYXNzXG4gKlxuICogQ29yZSBtZW1iZXJzIGFzIHBlciBSRkMgOTQ1NzpcbiAqIC0gdHlwZTogQSBVUkkgcmVmZXJlbmNlIFtSRkMzOTg2XSB0aGF0IGlkZW50aWZpZXMgdGhlIHByb2JsZW0gdHlwZS5cbiAqICAgICAgICAgRGVmYXVsdHMgdG8gXCJhYm91dDpibGFua1wiIHdoZW4gb21pdHRlZC5cbiAqIC0gdGl0bGU6IEEgc2hvcnQsIGh1bWFuLXJlYWRhYmxlIHN1bW1hcnkgb2YgdGhlIHByb2JsZW0gdHlwZS5cbiAqIC0gc3RhdHVzOiBUaGUgSFRUUCBzdGF0dXMgY29kZSAoW1JGQzcyMzFdLCBTZWN0aW9uIDYpLlxuICogLSBkZXRhaWw6IEEgaHVtYW4tcmVhZGFibGUgZXhwbGFuYXRpb24gc3BlY2lmaWMgdG8gdGhpcyBvY2N1cnJlbmNlIG9mIHRoZSBwcm9ibGVtLlxuICogLSBpbnN0YW5jZTogQSBVUkkgcmVmZXJlbmNlIHRoYXQgaWRlbnRpZmllcyB0aGUgc3BlY2lmaWMgb2NjdXJyZW5jZSBvZiB0aGUgcHJvYmxlbS5cbiAqXG4gKiBFeHRlbnNpb24gbWVtYmVyczogQWRkaXRpb25hbCBwcm9wZXJ0aWVzIGNhbiBiZSBhZGRlZCB0byBwcm92aWRlIG1vcmUgY29udGV4dC5cbiAqIFRoZXNlIGFyZSBzZXJpYWxpemVkIGFzLWlzIGluIHRoZSBKU09OIHJlc3BvbnNlLlxuICovXG4vKipcbiAqIFJGQyA5NDU3IEVycm9yIEJhc2UgQ2xhc3NcbiAqICog5L+u5pS55oCd6Lev77ya55u05o6l5L2/55SoIHB1YmxpYyByZWFkb25seSDlsZ7mgKfvvIzmi5Lnu53ltYzlpZfvvIzmi5Lnu50gR2V0dGVy44CCXG4gKi9cbmV4cG9ydCBjbGFzcyBQcm9ibGVtRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8vIDEuIOebtOaOpeWjsOaYjuWFrOW8gOWxnuaAp1xuICBwdWJsaWMgcmVhZG9ubHkgc3RhdHVzOiBudW1iZXJcbiAgcHVibGljIHJlYWRvbmx5IHRpdGxlOiBzdHJpbmdcbiAgcHVibGljIHJlYWRvbmx5IHR5cGU6IHN0cmluZ1xuICBwdWJsaWMgcmVhZG9ubHkgZGV0YWlsPzogc3RyaW5nXG4gIHB1YmxpYyByZWFkb25seSBpbnN0YW5jZT86IHN0cmluZ1xuICBwdWJsaWMgcmVhZG9ubHkgZXh0ZW5zaW9ucz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG5cbiAgY29uc3RydWN0b3IoXG4gICAgdHlwZSA9ICdhYm91dDpibGFuaycsXG4gICAgdGl0bGU6IHN0cmluZyxcbiAgICBzdGF0dXM6IG51bWJlcixcbiAgICBkZXRhaWw/OiBzdHJpbmcsXG4gICAgaW5zdGFuY2U/OiBzdHJpbmcsXG4gICAgZXh0ZW5zaW9uczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fVxuICApIHtcbiAgICBzdXBlcihkZXRhaWwgfHwgdGl0bGUpXG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIFByb2JsZW1FcnJvci5wcm90b3R5cGUpXG5cbiAgICAvLyAyLiDnm7TmjqXotYvlgLznu5kgdGhpc1xuICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzXG4gICAgdGhpcy50aXRsZSA9IHRpdGxlXG4gICAgdGhpcy50eXBlID0gdHlwZVxuICAgIHRoaXMuZGV0YWlsID0gZGV0YWlsXG4gICAgdGhpcy5pbnN0YW5jZSA9IGluc3RhbmNlXG4gICAgdGhpcy5leHRlbnNpb25zID0gZXh0ZW5zaW9uc1xuICB9XG5cbiAgLy8gMy4gdG9KU09OIOeahOaXtuWAmeWKqOaAgee7hOijheS4gOS4i+WNs+WPr1xuICB0b0pTT04oKTogUHJvYmxlbURvY3VtZW50IHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgdGl0bGU6IHRoaXMudGl0bGUsXG4gICAgICBzdGF0dXM6IHRoaXMuc3RhdHVzLFxuICAgICAgLi4uKHRoaXMuZGV0YWlsID8geyBkZXRhaWw6IHRoaXMuZGV0YWlsIH0gOiB7fSksXG4gICAgICAuLi4odGhpcy5pbnN0YW5jZSA/IHsgaW5zdGFuY2U6IHRoaXMuaW5zdGFuY2UgfSA6IHt9KSxcbiAgICAgIC8vIOaKiuaJqeWxleWtl+auteWxleW8gCAoZXh0ZW5zaW9ucylcbiAgICAgIC4uLnRoaXMuZXh0ZW5zaW9uc1xuICAgIH1cbiAgfVxufVxuXG4vLyAtLS0gNDBYIEVycm9ycyAtLS1cbmNsYXNzIEJhZFJlcXVlc3QgZXh0ZW5kcyBQcm9ibGVtRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihkZXRhaWw/OiBzdHJpbmcsIGV4dGVuc2lvbnM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgc3VwZXIoXG4gICAgICAnaHR0cHM6Ly9odHRwc3RhdHVzZXMuY29tLzQwMCcsXG4gICAgICAnQmFkIFJlcXVlc3QnLFxuICAgICAgNDAwLFxuICAgICAgZGV0YWlsLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgZXh0ZW5zaW9uc1xuICAgIClcbiAgfVxufVxuXG5jbGFzcyBVbmF1dGhvcml6ZWQgZXh0ZW5kcyBQcm9ibGVtRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihkZXRhaWw/OiBzdHJpbmcsIGV4dGVuc2lvbnM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgc3VwZXIoXG4gICAgICAnaHR0cHM6Ly9odHRwc3RhdHVzZXMuY29tLzQwMScsXG4gICAgICAnVW5hdXRob3JpemVkJyxcbiAgICAgIDQwMSxcbiAgICAgIGRldGFpbCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIGV4dGVuc2lvbnNcbiAgICApXG4gIH1cbn1cblxuY2xhc3MgRm9yYmlkZGVuIGV4dGVuZHMgUHJvYmxlbUVycm9yIHtcbiAgY29uc3RydWN0b3IoZGV0YWlsPzogc3RyaW5nLCBleHRlbnNpb25zPzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgIHN1cGVyKFxuICAgICAgJ2h0dHBzOi8vaHR0cHN0YXR1c2VzLmNvbS80MDMnLFxuICAgICAgJ0ZvcmJpZGRlbicsXG4gICAgICA0MDMsXG4gICAgICBkZXRhaWwsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBleHRlbnNpb25zXG4gICAgKVxuICB9XG59XG5cbmNsYXNzIE5vdEZvdW5kIGV4dGVuZHMgUHJvYmxlbUVycm9yIHtcbiAgY29uc3RydWN0b3IoZGV0YWlsPzogc3RyaW5nLCBleHRlbnNpb25zPzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgIHN1cGVyKFxuICAgICAgJ2h0dHBzOi8vaHR0cHN0YXR1c2VzLmNvbS80MDQnLFxuICAgICAgJ05vdCBGb3VuZCcsXG4gICAgICA0MDQsXG4gICAgICBkZXRhaWwsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBleHRlbnNpb25zXG4gICAgKVxuICB9XG59XG5cbmNsYXNzIENvbmZsaWN0IGV4dGVuZHMgUHJvYmxlbUVycm9yIHtcbiAgY29uc3RydWN0b3IoZGV0YWlsPzogc3RyaW5nLCBleHRlbnNpb25zPzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgIHN1cGVyKFxuICAgICAgJ2h0dHBzOi8vaHR0cHN0YXR1c2VzLmNvbS80MDknLFxuICAgICAgJ0NvbmZsaWN0JyxcbiAgICAgIDQwOSxcbiAgICAgIGRldGFpbCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIGV4dGVuc2lvbnNcbiAgICApXG4gIH1cbn1cblxuY2xhc3MgUGF5bWVudFJlcXVpcmVkIGV4dGVuZHMgUHJvYmxlbUVycm9yIHtcbiAgY29uc3RydWN0b3IoZGV0YWlsPzogc3RyaW5nLCBleHRlbnNpb25zPzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgIHN1cGVyKFxuICAgICAgJ2h0dHBzOi8vaHR0cHN0YXR1c2VzLmNvbS80MDInLFxuICAgICAgJ1BheW1lbnQgUmVxdWlyZWQnLFxuICAgICAgNDAyLFxuICAgICAgZGV0YWlsLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgZXh0ZW5zaW9uc1xuICAgIClcbiAgfVxufVxuXG5jbGFzcyBNZXRob2ROb3RBbGxvd2VkIGV4dGVuZHMgUHJvYmxlbUVycm9yIHtcbiAgY29uc3RydWN0b3IoZGV0YWlsPzogc3RyaW5nLCBleHRlbnNpb25zPzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgIHN1cGVyKFxuICAgICAgJ2h0dHBzOi8vaHR0cHN0YXR1c2VzLmNvbS80MDUnLFxuICAgICAgJ01ldGhvZCBOb3QgQWxsb3dlZCcsXG4gICAgICA0MDUsXG4gICAgICBkZXRhaWwsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBleHRlbnNpb25zXG4gICAgKVxuICB9XG59XG5cbmNsYXNzIE5vdEFjY2VwdGFibGUgZXh0ZW5kcyBQcm9ibGVtRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihkZXRhaWw/OiBzdHJpbmcsIGV4dGVuc2lvbnM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgc3VwZXIoXG4gICAgICAnaHR0cHM6Ly9odHRwc3RhdHVzZXMuY29tLzQwNicsXG4gICAgICAnTm90IEFjY2VwdGFibGUnLFxuICAgICAgNDA2LFxuICAgICAgZGV0YWlsLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgZXh0ZW5zaW9uc1xuICAgIClcbiAgfVxufVxuXG4vLyA1MFggRXJyb3JzXG5jbGFzcyBJbnRlcm5hbFNlcnZlckVycm9yIGV4dGVuZHMgUHJvYmxlbUVycm9yIHtcbiAgY29uc3RydWN0b3IoZGV0YWlsPzogc3RyaW5nLCBleHRlbnNpb25zPzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgIHN1cGVyKFxuICAgICAgJ2h0dHBzOi8vaHR0cHN0YXR1c2VzLmNvbS81MDAnLFxuICAgICAgJ0ludGVybmFsIFNlcnZlciBFcnJvcicsXG4gICAgICA1MDAsXG4gICAgICBkZXRhaWwsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBleHRlbnNpb25zXG4gICAgKVxuICB9XG59XG5cbmNsYXNzIE5vdEltcGxlbWVudGVkIGV4dGVuZHMgUHJvYmxlbUVycm9yIHtcbiAgY29uc3RydWN0b3IoZGV0YWlsPzogc3RyaW5nLCBleHRlbnNpb25zPzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgIHN1cGVyKFxuICAgICAgJ2h0dHBzOi8vaHR0cHN0YXR1c2VzLmNvbS81MDEnLFxuICAgICAgJ05vdCBJbXBsZW1lbnRlZCcsXG4gICAgICA1MDEsXG4gICAgICBkZXRhaWwsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBleHRlbnNpb25zXG4gICAgKVxuICB9XG59XG5cbmNsYXNzIEJhZEdhdGV3YXkgZXh0ZW5kcyBQcm9ibGVtRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihkZXRhaWw/OiBzdHJpbmcsIGV4dGVuc2lvbnM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgc3VwZXIoXG4gICAgICAnaHR0cHM6Ly9odHRwc3RhdHVzZXMuY29tLzUwMicsXG4gICAgICAnQmFkIEdhdGV3YXknLFxuICAgICAgNTAyLFxuICAgICAgZGV0YWlsLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgZXh0ZW5zaW9uc1xuICAgIClcbiAgfVxufVxuXG5jbGFzcyBTZXJ2aWNlVW5hdmFpbGFibGUgZXh0ZW5kcyBQcm9ibGVtRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihkZXRhaWw/OiBzdHJpbmcsIGV4dGVuc2lvbnM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgc3VwZXIoXG4gICAgICAnaHR0cHM6Ly9odHRwc3RhdHVzZXMuY29tLzUwMycsXG4gICAgICAnU2VydmljZSBVbmF2YWlsYWJsZScsXG4gICAgICA1MDMsXG4gICAgICBkZXRhaWwsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBleHRlbnNpb25zXG4gICAgKVxuICB9XG59XG5cbmNsYXNzIEdhdGV3YXlUaW1lb3V0IGV4dGVuZHMgUHJvYmxlbUVycm9yIHtcbiAgY29uc3RydWN0b3IoZGV0YWlsPzogc3RyaW5nLCBleHRlbnNpb25zPzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgIHN1cGVyKFxuICAgICAgJ2h0dHBzOi8vaHR0cHN0YXR1c2VzLmNvbS81MDQnLFxuICAgICAgJ0dhdGV3YXkgVGltZW91dCcsXG4gICAgICA1MDQsXG4gICAgICBkZXRhaWwsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBleHRlbnNpb25zXG4gICAgKVxuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSHR0cEVycm9yQ29uc3RydWN0b3Ige1xuICBCYWRSZXF1ZXN0OiB0eXBlb2YgQmFkUmVxdWVzdFxuICBVbmF1dGhvcml6ZWQ6IHR5cGVvZiBVbmF1dGhvcml6ZWRcbiAgUGF5bWVudFJlcXVpcmVkOiB0eXBlb2YgUGF5bWVudFJlcXVpcmVkXG4gIEZvcmJpZGRlbjogdHlwZW9mIEZvcmJpZGRlblxuICBOb3RGb3VuZDogdHlwZW9mIE5vdEZvdW5kXG4gIE1ldGhvZE5vdEFsbG93ZWQ6IHR5cGVvZiBNZXRob2ROb3RBbGxvd2VkXG4gIE5vdEFjY2VwdGFibGU6IHR5cGVvZiBOb3RBY2NlcHRhYmxlXG4gIENvbmZsaWN0OiB0eXBlb2YgQ29uZmxpY3RcbiAgSW50ZXJuYWxTZXJ2ZXJFcnJvcjogdHlwZW9mIEludGVybmFsU2VydmVyRXJyb3JcbiAgTm90SW1wbGVtZW50ZWQ6IHR5cGVvZiBOb3RJbXBsZW1lbnRlZFxuICBCYWRHYXRld2F5OiB0eXBlb2YgQmFkR2F0ZXdheVxuICBTZXJ2aWNlVW5hdmFpbGFibGU6IHR5cGVvZiBTZXJ2aWNlVW5hdmFpbGFibGVcbiAgR2F0ZXdheVRpbWVvdXQ6IHR5cGVvZiBHYXRld2F5VGltZW91dFxufVxuXG5leHBvcnQgY29uc3QgSHR0cEVycm9yOiBIdHRwRXJyb3JDb25zdHJ1Y3RvciA9IHtcbiAgQmFkUmVxdWVzdCxcbiAgVW5hdXRob3JpemVkLFxuICBQYXltZW50UmVxdWlyZWQsXG4gIEZvcmJpZGRlbixcbiAgTm90Rm91bmQsXG4gIE1ldGhvZE5vdEFsbG93ZWQsXG4gIE5vdEFjY2VwdGFibGUsXG4gIENvbmZsaWN0LFxuICBJbnRlcm5hbFNlcnZlckVycm9yLFxuICBOb3RJbXBsZW1lbnRlZCxcbiAgQmFkR2F0ZXdheSxcbiAgU2VydmljZVVuYXZhaWxhYmxlLFxuICBHYXRld2F5VGltZW91dFxufVxuIiwKICAgICIvKipcbiAqIFJGQyA5NDU3IFByb2JsZW0gSlNPTiDmoLzlvI/ljJblt6XlhbdcbiAqIEBzZWUgaHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzk0NTcuaHRtbFxuICovXG5cbmltcG9ydCB7IFByb2JsZW1FcnJvciB9IGZyb20gJy4uL0Vycm9yL2Vycm9ycydcbmltcG9ydCB0eXBlIHsgQ29kZSB9IGZyb20gJy4uL0Vycm9yL3R5cGUnXG5cbi8qKlxuICog6buY6K6k55qE54q25oCB56CB5LiO5qCH6aKY5pig5bCE6KGoIChSRkMg5qCH5YeG5o6o6I2QKVxuICovXG5jb25zdCBERUZBVUxUX1RJVExFUzogUmVjb3JkPG51bWJlciwgc3RyaW5nPiA9IHtcbiAgNDAwOiAnQmFkIFJlcXVlc3QnLFxuICA0MDE6ICdVbmF1dGhvcml6ZWQnLFxuICA0MDM6ICdGb3JiaWRkZW4nLFxuICA0MDQ6ICdOb3QgRm91bmQnLFxuICA0MDk6ICdDb25mbGljdCcsXG4gIDQyMjogJ1VucHJvY2Vzc2FibGUgRW50aXR5JyxcbiAgNTAwOiAnSW50ZXJuYWwgU2VydmVyIEVycm9yJyxcbiAgNTAzOiAnU2VydmljZSBVbmF2YWlsYWJsZSdcbn1cblxuZXhwb3J0IGNvbnN0IG5vcm1hbGl6ZVRvUHJvYmxlbSA9IChcbiAgZXJyb3I6IGFueSxcbiAgY29kZTogQ29kZSxcbiAgcGF0aDogc3RyaW5nLFxuICB0eXBlQmFzZVVybCA9ICdhYm91dDpibGFuaydcbik6IFByb2JsZW1FcnJvciA9PiB7XG4gIC8vIDEuIOWmguaenOW3sue7j+aYryBQcm9ibGVtRXJyb3LvvIznm7TmjqXooaXlhYUgaW5zdGFuY2Ug5bm26L+U5ZueXG4gIGlmIChlcnJvciBpbnN0YW5jZW9mIFByb2JsZW1FcnJvcikge1xuICAgIC8vIOWmguaenOayoeaciSBpbnN0YW5jZe+8jOiHquWKqOihpeWFqOS4uuW9k+WJjeivt+axgui3r+W+hFxuICAgIHJldHVybiBlcnJvci5pbnN0YW5jZVxuICAgICAgPyBlcnJvclxuICAgICAgOiBuZXcgUHJvYmxlbUVycm9yKFxuICAgICAgICAgIGVycm9yLnR5cGUsXG4gICAgICAgICAgZXJyb3IudGl0bGUsXG4gICAgICAgICAgZXJyb3Iuc3RhdHVzLFxuICAgICAgICAgIGVycm9yLmRldGFpbCxcbiAgICAgICAgICBwYXRoLFxuICAgICAgICAgIGVycm9yLmV4dGVuc2lvbnNcbiAgICAgICAgKVxuICB9XG5cbiAgLy8gMi4g5Yid5aeL5YyW6buY6K6k5YC8XG4gIGxldCBzdGF0dXMgPSA1MDBcbiAgbGV0IHRpdGxlID0gJ0ludGVybmFsIFNlcnZlciBFcnJvcidcbiAgbGV0IGRldGFpbCA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKVxuICBsZXQgZXh0ZW5zaW9uczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fVxuXG4gIC8vIDMuIOivhuWIqyBFbHlzaWEg5YaF572u6ZSZ6K+v56CB5bm24oCc5a+56b2Q4oCd5qCH5YeGXG4gIHN3aXRjaCAoY29kZSkge1xuICAgIGNhc2UgJ1ZBTElEQVRJT04nOlxuICAgICAgc3RhdHVzID0gNDAwXG4gICAgICB0aXRsZSA9ICdWYWxpZGF0aW9uIEZhaWxlZCdcbiAgICAgIC8vIOaPkOWPliBFbHlzaWEg55qE5qCh6aqM57uG6IqCXG4gICAgICBleHRlbnNpb25zID0geyBlcnJvcnM6IGVycm9yLmFsbCB8fCBbXSB9XG4gICAgICBicmVha1xuICAgIGNhc2UgJ05PVF9GT1VORCc6XG4gICAgICBzdGF0dXMgPSA0MDRcbiAgICAgIHRpdGxlID0gJ1Jlc291cmNlIE5vdCBGb3VuZCdcbiAgICAgIGJyZWFrXG4gICAgY2FzZSAnUEFSU0UnOlxuICAgICAgc3RhdHVzID0gNDAwXG4gICAgICB0aXRsZSA9ICdJbnZhbGlkIFBheWxvYWQnXG4gICAgICBkZXRhaWwgPSAnVGhlIHJlcXVlc3QgYm9keSBjb3VsZCBub3QgYmUgcGFyc2VkIGFzIHZhbGlkIEpTT04uJ1xuICAgICAgYnJlYWtcbiAgICBjYXNlICdJTlZBTElEX0NPT0tJRV9TSUdOQVRVUkUnOlxuICAgICAgc3RhdHVzID0gNDAxXG4gICAgICB0aXRsZSA9ICdJbnZhbGlkIENyZWRlbnRpYWxzJ1xuICAgICAgYnJlYWtcbiAgICBkZWZhdWx0OlxuICAgICAgLy8g5aaC5p6c6ZSZ6K+v5a+56LGh5pys6Lqr5bim5pyJ54q25oCB56CB77yI5q+U5aaC5p+Q5Lqb5bqT5oqb5Ye655qE77yJXG4gICAgICBpZiAodHlwZW9mIGVycm9yPy5zdGF0dXMgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHN0YXR1cyA9IGVycm9yLnN0YXR1c1xuICAgICAgICB0aXRsZSA9IERFRkFVTFRfVElUTEVTW3N0YXR1c10gfHwgJ1Vua25vd24gRXJyb3InXG4gICAgICB9XG4gICAgICBicmVha1xuICB9XG5cbiAgLy8gNC4g5p6E6YCg5bm26L+U5Zue5qCH5YeG55qEIFByb2JsZW1FcnJvclxuICByZXR1cm4gbmV3IFByb2JsZW1FcnJvcihcbiAgICB0eXBlQmFzZVVybCA9PT0gJ2Fib3V0OmJsYW5rJyA/IHR5cGVCYXNlVXJsIDogYCR7dHlwZUJhc2VVcmx9LyR7Y29kZX1gLFxuICAgIHRpdGxlLFxuICAgIHN0YXR1cyxcbiAgICBkZXRhaWwsXG4gICAgcGF0aCxcbiAgICBleHRlbnNpb25zXG4gIClcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcm9ibGVtSnNvbiB7XG4gIHR5cGU/OiBzdHJpbmdcbiAgdGl0bGU6IHN0cmluZ1xuICBzdGF0dXM6IG51bWJlclxuICBkZXRhaWw/OiBzdHJpbmdcbiAgaW5zdGFuY2U/OiBzdHJpbmdcbiAgW2tleTogc3RyaW5nXTogdW5rbm93blxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByb2JsZW1Kc29uT3B0aW9ucyB7XG4gIC8qKlxuICAgKiDln7rnoYAgVVJM77yM55So5LqO55Sf5oiQ6ZSZ6K+v57G75Z6L55qE6ZO+5o6lXG4gICAqIEBleGFtcGxlICdodHRwczovL2FwaS5leGFtcGxlLmNvbS9lcnJvcnMnXG4gICAqL1xuICB0eXBlQmFzZVVybD86IHN0cmluZ1xuXG4gIC8qKlxuICAgKiDmmK/lkKblnKjml6Xlv5fkuK3mmL7npLrlrozmlbTnmoQgUHJvYmxlbSBKU09OXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIGVuYWJsZWQ/OiBib29sZWFuXG5cbiAgLyoqXG4gICAqIOiHquWumuS5ieagvOW8j+WMluWHveaVsFxuICAgKi9cbiAgZm9ybWF0PzogKGVycm9yOiB1bmtub3duLCByZXF1ZXN0OiBSZXF1ZXN0KSA9PiBQcm9ibGVtSnNvbiB8IG51bGxcbn1cblxuY29uc3QgaXNFcnJvcldpdGhTdGF0dXMgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyB7IHN0YXR1czogbnVtYmVyIH0gPT5cbiAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAnc3RhdHVzJyBpbiB2YWx1ZSAmJlxuICB0eXBlb2YgKHZhbHVlIGFzIHsgc3RhdHVzPzogdW5rbm93biB9KS5zdGF0dXMgPT09ICdudW1iZXInXG5cbmNvbnN0IGlzRXJyb3JMaWtlID0gKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgRXJyb3IgPT5cbiAgdmFsdWUgaW5zdGFuY2VvZiBFcnJvciB8fFxuICAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgJ21lc3NhZ2UnIGluIHZhbHVlICYmXG4gICAgdHlwZW9mICh2YWx1ZSBhcyB7IG1lc3NhZ2U/OiB1bmtub3duIH0pLm1lc3NhZ2UgPT09ICdzdHJpbmcnKVxuXG4vKipcbiAqIOWwhumUmeivr+i9rOaNouS4uiBSRkMgOTQ1NyBQcm9ibGVtIEpTT04g5qC85byPXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1Byb2JsZW1Kc29uKFxuICBlcnJvcjogdW5rbm93bixcbiAgcmVxdWVzdDogUmVxdWVzdCxcbiAgb3B0aW9uczogUHJvYmxlbUpzb25PcHRpb25zID0ge31cbik6IFByb2JsZW1Kc29uIHtcbiAgLy8g5aaC5p6c5o+Q5L6b5LqG6Ieq5a6a5LmJ5qC85byP5YyW5Ye95pWw77yM5L2/55So5a6DXG4gIGlmIChvcHRpb25zLmZvcm1hdCkge1xuICAgIGNvbnN0IGN1c3RvbSA9IG9wdGlvbnMuZm9ybWF0KGVycm9yLCByZXF1ZXN0KVxuICAgIGlmIChjdXN0b20pIHtcbiAgICAgIHJldHVybiBjdXN0b21cbiAgICB9XG4gIH1cblxuICBjb25zdCB1cmwgPSBuZXcgVVJMKHJlcXVlc3QudXJsKVxuICBjb25zdCBzdGF0dXMgPSBpc0Vycm9yV2l0aFN0YXR1cyhlcnJvcikgPyBlcnJvci5zdGF0dXMgOiA1MDBcbiAgY29uc3QgbWVzc2FnZSA9IGlzRXJyb3JMaWtlKGVycm9yKVxuICAgID8gZXJyb3IubWVzc2FnZVxuICAgIDogU3RyaW5nKGVycm9yID8/ICdVbmtub3duIEVycm9yJylcblxuICAvLyDpu5jorqTnmoQgUHJvYmxlbSBKU09OIOe7k+aehFxuICBjb25zdCBwcm9ibGVtOiBQcm9ibGVtSnNvbiA9IHtcbiAgICB0eXBlOiBvcHRpb25zLnR5cGVCYXNlVXJsXG4gICAgICA/IGAke29wdGlvbnMudHlwZUJhc2VVcmx9LyR7c3RhdHVzfWBcbiAgICAgIDogJ2Fib3V0OmJsYW5rJyxcbiAgICB0aXRsZTogZ2V0RGVmYXVsdFRpdGxlKHN0YXR1cyksXG4gICAgc3RhdHVzLFxuICAgIGRldGFpbDogbWVzc2FnZSxcbiAgICBpbnN0YW5jZTogdXJsLnBhdGhuYW1lICsgdXJsLnNlYXJjaFxuICB9XG5cbiAgLy8g5bCd6K+V5LuO6ZSZ6K+v5a+56LGh5Lit5o+Q5Y+W6aKd5aSW55qE5L+h5oGvXG4gIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICE9PSBudWxsKSB7XG4gICAgY29uc3QgZXJyID0gZXJyb3IgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cblxuICAgIC8vIOWmguaenOmUmeivr+W3sue7j+aciSBQcm9ibGVtIEpTT04g57uT5p6E77yM55u05o6l5L2/55SoXG4gICAgaWYgKCd0eXBlJyBpbiBlcnIgfHwgJ3RpdGxlJyBpbiBlcnIpIHtcbiAgICAgIGlmIChlcnIudHlwZSkgcHJvYmxlbS50eXBlID0gZXJyLnR5cGUgYXMgc3RyaW5nXG4gICAgICBpZiAoZXJyLnRpdGxlKSBwcm9ibGVtLnRpdGxlID0gZXJyLnRpdGxlIGFzIHN0cmluZ1xuICAgIH1cblxuICAgIC8vIOa3u+WKoOWFtuS7luaJqeWxleWtl+aute+8iOaOkumZpOagh+WHhuWtl+aute+8iVxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGVycikpIHtcbiAgICAgIGlmIChcbiAgICAgICAgIVsnc3RhdHVzJywgJ21lc3NhZ2UnLCAndHlwZScsICd0aXRsZScsICdkZXRhaWwnLCAnaW5zdGFuY2UnXS5pbmNsdWRlcyhcbiAgICAgICAgICBrZXlcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIHByb2JsZW1ba2V5XSA9IHZhbHVlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHByb2JsZW1cbn1cblxuLyoqXG4gKiDmoLnmja7nirbmgIHnoIHojrflj5bpu5jorqTmoIfpophcbiAqL1xuZnVuY3Rpb24gZ2V0RGVmYXVsdFRpdGxlKHN0YXR1czogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3QgdGl0bGVzOiBSZWNvcmQ8bnVtYmVyLCBzdHJpbmc+ID0ge1xuICAgIDQwMDogJ0JhZCBSZXF1ZXN0JyxcbiAgICA0MDE6ICdVbmF1dGhvcml6ZWQnLFxuICAgIDQwMjogJ1BheW1lbnQgUmVxdWlyZWQnLFxuICAgIDQwMzogJ0ZvcmJpZGRlbicsXG4gICAgNDA0OiAnTm90IEZvdW5kJyxcbiAgICA0MDU6ICdNZXRob2QgTm90IEFsbG93ZWQnLFxuICAgIDQwNjogJ05vdCBBY2NlcHRhYmxlJyxcbiAgICA0MDc6ICdQcm94eSBBdXRoZW50aWNhdGlvbiBSZXF1aXJlZCcsXG4gICAgNDA4OiAnUmVxdWVzdCBUaW1lb3V0JyxcbiAgICA0MDk6ICdDb25mbGljdCcsXG4gICAgNDEwOiAnR29uZScsXG4gICAgNDExOiAnTGVuZ3RoIFJlcXVpcmVkJyxcbiAgICA0MTI6ICdQcmVjb25kaXRpb24gRmFpbGVkJyxcbiAgICA0MTM6ICdQYXlsb2FkIFRvbyBMYXJnZScsXG4gICAgNDE0OiAnVVJJIFRvbyBMb25nJyxcbiAgICA0MTU6ICdVbnN1cHBvcnRlZCBNZWRpYSBUeXBlJyxcbiAgICA0MTY6ICdSYW5nZSBOb3QgU2F0aXNmaWFibGUnLFxuICAgIDQxNzogJ0V4cGVjdGF0aW9uIEZhaWxlZCcsXG4gICAgNDE4OiBcIkknbSBhIHRlYXBvdFwiLFxuICAgIDQyMjogJ1VucHJvY2Vzc2FibGUgRW50aXR5JyxcbiAgICA0MjM6ICdMb2NrZWQnLFxuICAgIDQyNDogJ0ZhaWxlZCBEZXBlbmRlbmN5JyxcbiAgICA0MjU6ICdUb28gRWFybHknLFxuICAgIDQyNjogJ1VwZ3JhZGUgUmVxdWlyZWQnLFxuICAgIDQyODogJ1ByZWNvbmRpdGlvbiBSZXF1aXJlZCcsXG4gICAgNDI5OiAnVG9vIE1hbnkgUmVxdWVzdHMnLFxuICAgIDQzMTogJ1JlcXVlc3QgSGVhZGVyIEZpZWxkcyBUb28gTGFyZ2UnLFxuICAgIDQ1MTogJ1VuYXZhaWxhYmxlIEZvciBMZWdhbCBSZWFzb25zJyxcbiAgICA1MDA6ICdJbnRlcm5hbCBTZXJ2ZXIgRXJyb3InLFxuICAgIDUwMTogJ05vdCBJbXBsZW1lbnRlZCcsXG4gICAgNTAyOiAnQmFkIEdhdGV3YXknLFxuICAgIDUwMzogJ1NlcnZpY2UgVW5hdmFpbGFibGUnLFxuICAgIDUwNDogJ0dhdGV3YXkgVGltZW91dCcsXG4gICAgNTA1OiAnSFRUUCBWZXJzaW9uIE5vdCBTdXBwb3J0ZWQnLFxuICAgIDUwNjogJ1ZhcmlhbnQgQWxzbyBOZWdvdGlhdGVzJyxcbiAgICA1MDc6ICdJbnN1ZmZpY2llbnQgU3RvcmFnZScsXG4gICAgNTA4OiAnTG9vcCBEZXRlY3RlZCcsXG4gICAgNTEwOiAnTm90IEV4dGVuZGVkJyxcbiAgICA1MTE6ICdOZXR3b3JrIEF1dGhlbnRpY2F0aW9uIFJlcXVpcmVkJ1xuICB9XG5cbiAgcmV0dXJuIHRpdGxlc1tzdGF0dXNdIHx8ICdFcnJvcidcbn1cblxuLyoqXG4gKiDlsIYgUHJvYmxlbSBKU09OIOagvOW8j+WMluS4uuaXpeW/l+Wtl+espuS4slxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0UHJvYmxlbUpzb25Mb2coXG4gIHByb2JsZW06IFByb2JsZW1Kc29uLFxuICByZXF1ZXN0OiBSZXF1ZXN0XG4pOiBzdHJpbmcge1xuICBjb25zdCB1cmwgPSBuZXcgVVJMKHJlcXVlc3QudXJsKVxuICBjb25zdCBwYXJ0czogc3RyaW5nW10gPSBbXVxuXG4gIC8vIOagh+mimOihjFxuICBjb25zdCBzdGF0dXNTdHIgPSBwcm9ibGVtLnN0YXR1cy50b1N0cmluZygpXG4gIGNvbnN0IGVtb2ppID0gZ2V0U3RhdHVzRW1vamkocHJvYmxlbS5zdGF0dXMpXG4gIHBhcnRzLnB1c2goYFxcbiR7ZW1vaml9IFtIVFRQICR7c3RhdHVzU3RyfV0gJHtyZXF1ZXN0Lm1ldGhvZH0gJHt1cmwucGF0aG5hbWV9YClcblxuICAvLyBQcm9ibGVtIEpTT04g5YaF5a65XG4gIHBhcnRzLnB1c2goYCAgVHlwZTogICAgJHtwcm9ibGVtLnR5cGV9YClcbiAgcGFydHMucHVzaChgICBUaXRsZTogICAke3Byb2JsZW0udGl0bGV9YClcbiAgaWYgKHByb2JsZW0uZGV0YWlsKSB7XG4gICAgcGFydHMucHVzaChgICBEZXRhaWw6ICAke3Byb2JsZW0uZGV0YWlsfWApXG4gIH1cbiAgaWYgKHByb2JsZW0uaW5zdGFuY2UpIHtcbiAgICBwYXJ0cy5wdXNoKGAgIEluc3RhbmNlOiAke3Byb2JsZW0uaW5zdGFuY2V9YClcbiAgfVxuXG4gIC8vIOaJqeWxleWtl+autVxuICBjb25zdCBleHRlbnNpb25zID0gT2JqZWN0LmVudHJpZXMocHJvYmxlbSkuZmlsdGVyKFxuICAgIChba2V5XSkgPT4gIVsndHlwZScsICd0aXRsZScsICdzdGF0dXMnLCAnZGV0YWlsJywgJ2luc3RhbmNlJ10uaW5jbHVkZXMoa2V5KVxuICApXG4gIGlmIChleHRlbnNpb25zLmxlbmd0aCA+IDApIHtcbiAgICBwYXJ0cy5wdXNoKCcgIEV4dGVuc2lvbnM6JylcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBleHRlbnNpb25zKSB7XG4gICAgICBwYXJ0cy5wdXNoKGAgICAgJHtrZXl9OiAke0pTT04uc3RyaW5naWZ5KHZhbHVlKX1gKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwYXJ0cy5qb2luKCdcXG4nKVxufVxuXG5mdW5jdGlvbiBnZXRTdGF0dXNFbW9qaShzdGF0dXM6IG51bWJlcik6IHN0cmluZyB7XG4gIGlmIChzdGF0dXMgPj0gNTAwKSByZXR1cm4gJ/CflLQnXG4gIGlmIChzdGF0dXMgPj0gNDAwKSByZXR1cm4gJ/Cfn6EnXG4gIGlmIChzdGF0dXMgPj0gMzAwKSByZXR1cm4gJ/CflLUnXG4gIGlmIChzdGF0dXMgPj0gMjAwKSByZXR1cm4gJ/Cfn6InXG4gIHJldHVybiAn4pqqJ1xufVxuIgogIF0sCiAgIm1hcHBpbmdzIjogIkFBQUEsaUJBQVMsZ0JDQVQsb0NBRUEsSUFBTSxHQUFhLENBQUMsRUFBYyxJQUEwQixDQUMxRCxHQUFJLEVBQUssUUFBVSxFQUNqQixPQUFPLEVBQUssTUFBTSxFQUFHLENBQUssRUFHNUIsSUFBTSxFQUFPLEtBQUssT0FBTyxFQUFRLEVBQUssUUFBVSxDQUFDLEVBQzNDLEVBQVEsRUFBUSxFQUFLLE9BQVMsRUFDcEMsTUFBTyxHQUFHLElBQUksT0FBTyxDQUFJLElBQUksSUFBTyxJQUFJLE9BQU8sQ0FBSyxLQUd6QyxFQUFlLENBQUMsSUFBNEIsQ0FDdkQsSUFBTSxFQUFjLFdBQVcsR0FBVSxVQUVuQyxFQURlLEtBQUssSUFBSSxFQUFRLE9BQVEsRUFBWSxNQUFNLEVBQzlCLEVBRTVCLEVBQU0sSUFBRyxJQUFJLE9BQU8sQ0FBVSxLQUM5QixFQUFNLElBQUcsSUFBSSxPQUFPLENBQVUsS0FDOUIsRUFBUSxJQUFHLElBQUksT0FBTyxDQUFVLEtBRWhDLEVBQWEsSUFBRyxHQUFXLEVBQWEsQ0FBVSxLQUNs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
File without changes
File without changes