@brainfish-ai/devdoc 0.1.36 → 0.1.38
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/ai-agents/.claude/skills/bootstrap-docs/SKILL.md +382 -434
- package/ai-agents/.claude/skills/create-doc/SKILL.md +47 -10
- package/ai-agents/.claude/skills/update-doc/SKILL.md +40 -15
- package/ai-agents/.claude/skills/whisk-theme/SKILL.md +561 -0
- package/ai-agents/.cursor/rules/devdoc-bootstrap.mdc +211 -153
- package/ai-agents/.cursor/rules/devdoc-create.mdc +17 -5
- package/ai-agents/.cursor/rules/devdoc-update.mdc +29 -12
- package/ai-agents/.cursor/rules/devdoc-whisk-theme.mdc +301 -0
- package/ai-agents/schemas/code-graph.schema.json +413 -0
- package/ai-agents/schemas/context.schema.json +20 -0
- package/dist/cli/commands/ai.js +5 -1
- package/dist/cli/commands/create.js +3 -1
- package/package.json +1 -1
|
@@ -0,0 +1,413 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"$id": "https://devdoc.sh/schemas/code-graph.json",
|
|
4
|
+
"title": "DevDoc Code Graph",
|
|
5
|
+
"description": "Complete analysis of a codebase for accurate documentation generation",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"required": ["version", "generatedAt", "git", "project"],
|
|
8
|
+
"properties": {
|
|
9
|
+
"$schema": {
|
|
10
|
+
"type": "string",
|
|
11
|
+
"description": "Schema URL for validation"
|
|
12
|
+
},
|
|
13
|
+
"version": {
|
|
14
|
+
"type": "string",
|
|
15
|
+
"description": "Schema version",
|
|
16
|
+
"enum": ["1.0"]
|
|
17
|
+
},
|
|
18
|
+
"generatedAt": {
|
|
19
|
+
"type": "string",
|
|
20
|
+
"format": "date-time",
|
|
21
|
+
"description": "When the code graph was generated"
|
|
22
|
+
},
|
|
23
|
+
"git": {
|
|
24
|
+
"type": "object",
|
|
25
|
+
"description": "Git state when code graph was generated",
|
|
26
|
+
"required": ["commitHash"],
|
|
27
|
+
"properties": {
|
|
28
|
+
"commitHash": {
|
|
29
|
+
"type": "string",
|
|
30
|
+
"description": "Full commit SHA when graph was generated",
|
|
31
|
+
"pattern": "^[a-f0-9]{40}$"
|
|
32
|
+
},
|
|
33
|
+
"commitShort": {
|
|
34
|
+
"type": "string",
|
|
35
|
+
"description": "Short commit hash (7 chars)",
|
|
36
|
+
"pattern": "^[a-f0-9]{7}$"
|
|
37
|
+
},
|
|
38
|
+
"branch": {
|
|
39
|
+
"type": "string",
|
|
40
|
+
"description": "Branch name when generated"
|
|
41
|
+
},
|
|
42
|
+
"commitMessage": {
|
|
43
|
+
"type": "string",
|
|
44
|
+
"description": "Commit message"
|
|
45
|
+
},
|
|
46
|
+
"commitDate": {
|
|
47
|
+
"type": "string",
|
|
48
|
+
"format": "date-time",
|
|
49
|
+
"description": "Date of the commit"
|
|
50
|
+
},
|
|
51
|
+
"isDirty": {
|
|
52
|
+
"type": "boolean",
|
|
53
|
+
"description": "Whether there were uncommitted changes",
|
|
54
|
+
"default": false
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
"project": {
|
|
59
|
+
"type": "object",
|
|
60
|
+
"description": "Project metadata",
|
|
61
|
+
"required": ["name", "language"],
|
|
62
|
+
"properties": {
|
|
63
|
+
"name": {
|
|
64
|
+
"type": "string",
|
|
65
|
+
"description": "Project name from package.json or README"
|
|
66
|
+
},
|
|
67
|
+
"description": {
|
|
68
|
+
"type": "string",
|
|
69
|
+
"description": "Project description"
|
|
70
|
+
},
|
|
71
|
+
"language": {
|
|
72
|
+
"type": "string",
|
|
73
|
+
"description": "Primary programming language",
|
|
74
|
+
"examples": ["TypeScript", "Python", "Go", "Rust", "Java"]
|
|
75
|
+
},
|
|
76
|
+
"framework": {
|
|
77
|
+
"type": "string",
|
|
78
|
+
"description": "Main framework used",
|
|
79
|
+
"examples": ["Express", "Next.js", "FastAPI", "Django", "Spring"]
|
|
80
|
+
},
|
|
81
|
+
"rootDir": {
|
|
82
|
+
"type": "string",
|
|
83
|
+
"description": "Source code root directory",
|
|
84
|
+
"default": "src/"
|
|
85
|
+
},
|
|
86
|
+
"packageManager": {
|
|
87
|
+
"type": "string",
|
|
88
|
+
"enum": ["npm", "yarn", "pnpm", "pip", "cargo", "go"]
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
},
|
|
92
|
+
"structure": {
|
|
93
|
+
"type": "object",
|
|
94
|
+
"description": "Directory structure overview",
|
|
95
|
+
"properties": {
|
|
96
|
+
"sourceDir": {
|
|
97
|
+
"type": "string",
|
|
98
|
+
"description": "Main source directory"
|
|
99
|
+
},
|
|
100
|
+
"testsDir": {
|
|
101
|
+
"type": "string",
|
|
102
|
+
"description": "Tests directory"
|
|
103
|
+
},
|
|
104
|
+
"examplesDir": {
|
|
105
|
+
"type": "string",
|
|
106
|
+
"description": "Examples directory"
|
|
107
|
+
},
|
|
108
|
+
"docsDir": {
|
|
109
|
+
"type": "string",
|
|
110
|
+
"description": "Documentation directory"
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
},
|
|
114
|
+
"files": {
|
|
115
|
+
"type": "array",
|
|
116
|
+
"description": "List of important files",
|
|
117
|
+
"items": {
|
|
118
|
+
"type": "object",
|
|
119
|
+
"required": ["path", "type"],
|
|
120
|
+
"properties": {
|
|
121
|
+
"path": {
|
|
122
|
+
"type": "string",
|
|
123
|
+
"description": "File path relative to project root"
|
|
124
|
+
},
|
|
125
|
+
"type": {
|
|
126
|
+
"type": "string",
|
|
127
|
+
"enum": ["entrypoint", "router", "controller", "model", "service", "util", "type", "config", "test", "example"],
|
|
128
|
+
"description": "File type/purpose"
|
|
129
|
+
},
|
|
130
|
+
"exports": {
|
|
131
|
+
"type": "array",
|
|
132
|
+
"items": { "type": "string" },
|
|
133
|
+
"description": "Named exports from this file"
|
|
134
|
+
},
|
|
135
|
+
"description": {
|
|
136
|
+
"type": "string",
|
|
137
|
+
"description": "Brief description of the file's purpose"
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
},
|
|
142
|
+
"modules": {
|
|
143
|
+
"type": "array",
|
|
144
|
+
"description": "Logical modules/packages in the codebase",
|
|
145
|
+
"items": {
|
|
146
|
+
"type": "object",
|
|
147
|
+
"required": ["name", "path"],
|
|
148
|
+
"properties": {
|
|
149
|
+
"name": {
|
|
150
|
+
"type": "string",
|
|
151
|
+
"description": "Module name"
|
|
152
|
+
},
|
|
153
|
+
"path": {
|
|
154
|
+
"type": "string",
|
|
155
|
+
"description": "Module directory path"
|
|
156
|
+
},
|
|
157
|
+
"description": {
|
|
158
|
+
"type": "string",
|
|
159
|
+
"description": "What this module does"
|
|
160
|
+
},
|
|
161
|
+
"files": {
|
|
162
|
+
"type": "array",
|
|
163
|
+
"items": { "type": "string" },
|
|
164
|
+
"description": "Files in this module"
|
|
165
|
+
},
|
|
166
|
+
"exports": {
|
|
167
|
+
"type": "array",
|
|
168
|
+
"description": "Public exports from this module",
|
|
169
|
+
"items": {
|
|
170
|
+
"type": "object",
|
|
171
|
+
"required": ["name", "type"],
|
|
172
|
+
"properties": {
|
|
173
|
+
"name": {
|
|
174
|
+
"type": "string",
|
|
175
|
+
"description": "Export name"
|
|
176
|
+
},
|
|
177
|
+
"type": {
|
|
178
|
+
"type": "string",
|
|
179
|
+
"enum": ["function", "class", "interface", "type", "constant", "enum"],
|
|
180
|
+
"description": "Type of export"
|
|
181
|
+
},
|
|
182
|
+
"signature": {
|
|
183
|
+
"type": "string",
|
|
184
|
+
"description": "Function/method signature or type definition"
|
|
185
|
+
},
|
|
186
|
+
"description": {
|
|
187
|
+
"type": "string",
|
|
188
|
+
"description": "What this export does"
|
|
189
|
+
},
|
|
190
|
+
"params": {
|
|
191
|
+
"type": "array",
|
|
192
|
+
"description": "Function parameters",
|
|
193
|
+
"items": {
|
|
194
|
+
"type": "object",
|
|
195
|
+
"properties": {
|
|
196
|
+
"name": { "type": "string" },
|
|
197
|
+
"type": { "type": "string" },
|
|
198
|
+
"description": { "type": "string" },
|
|
199
|
+
"optional": { "type": "boolean" }
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
},
|
|
203
|
+
"returns": {
|
|
204
|
+
"type": "object",
|
|
205
|
+
"description": "Return type",
|
|
206
|
+
"properties": {
|
|
207
|
+
"type": { "type": "string" },
|
|
208
|
+
"description": { "type": "string" }
|
|
209
|
+
}
|
|
210
|
+
},
|
|
211
|
+
"async": {
|
|
212
|
+
"type": "boolean",
|
|
213
|
+
"description": "Whether the function is async"
|
|
214
|
+
},
|
|
215
|
+
"deprecated": {
|
|
216
|
+
"type": "boolean",
|
|
217
|
+
"description": "Whether this export is deprecated"
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
},
|
|
222
|
+
"dependencies": {
|
|
223
|
+
"type": "array",
|
|
224
|
+
"items": { "type": "string" },
|
|
225
|
+
"description": "Other modules this depends on"
|
|
226
|
+
},
|
|
227
|
+
"docPriority": {
|
|
228
|
+
"type": "string",
|
|
229
|
+
"enum": ["high", "medium", "low"],
|
|
230
|
+
"description": "Priority for documentation"
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
},
|
|
235
|
+
"types": {
|
|
236
|
+
"type": "array",
|
|
237
|
+
"description": "Type definitions, interfaces, schemas",
|
|
238
|
+
"items": {
|
|
239
|
+
"type": "object",
|
|
240
|
+
"required": ["name", "path"],
|
|
241
|
+
"properties": {
|
|
242
|
+
"name": {
|
|
243
|
+
"type": "string",
|
|
244
|
+
"description": "Type name"
|
|
245
|
+
},
|
|
246
|
+
"path": {
|
|
247
|
+
"type": "string",
|
|
248
|
+
"description": "File where type is defined"
|
|
249
|
+
},
|
|
250
|
+
"kind": {
|
|
251
|
+
"type": "string",
|
|
252
|
+
"enum": ["interface", "type", "class", "enum", "schema"],
|
|
253
|
+
"description": "Kind of type definition"
|
|
254
|
+
},
|
|
255
|
+
"definition": {
|
|
256
|
+
"type": "string",
|
|
257
|
+
"description": "Full type definition code"
|
|
258
|
+
},
|
|
259
|
+
"properties": {
|
|
260
|
+
"type": "array",
|
|
261
|
+
"description": "Properties of the type",
|
|
262
|
+
"items": {
|
|
263
|
+
"type": "object",
|
|
264
|
+
"properties": {
|
|
265
|
+
"name": { "type": "string" },
|
|
266
|
+
"type": { "type": "string" },
|
|
267
|
+
"description": { "type": "string" },
|
|
268
|
+
"optional": { "type": "boolean" }
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
},
|
|
272
|
+
"description": {
|
|
273
|
+
"type": "string",
|
|
274
|
+
"description": "What this type represents"
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
},
|
|
279
|
+
"api": {
|
|
280
|
+
"type": "object",
|
|
281
|
+
"description": "API information (REST/GraphQL)",
|
|
282
|
+
"properties": {
|
|
283
|
+
"type": {
|
|
284
|
+
"type": "string",
|
|
285
|
+
"enum": ["REST", "GraphQL", "gRPC", "WebSocket"],
|
|
286
|
+
"description": "API type"
|
|
287
|
+
},
|
|
288
|
+
"baseUrl": {
|
|
289
|
+
"type": "string",
|
|
290
|
+
"description": "Base URL or path prefix"
|
|
291
|
+
},
|
|
292
|
+
"specPath": {
|
|
293
|
+
"type": "string",
|
|
294
|
+
"description": "Path to OpenAPI/GraphQL spec file"
|
|
295
|
+
},
|
|
296
|
+
"authentication": {
|
|
297
|
+
"type": "object",
|
|
298
|
+
"properties": {
|
|
299
|
+
"type": {
|
|
300
|
+
"type": "string",
|
|
301
|
+
"enum": ["bearer", "apiKey", "basic", "oauth2", "none"]
|
|
302
|
+
},
|
|
303
|
+
"headerName": { "type": "string" },
|
|
304
|
+
"description": { "type": "string" }
|
|
305
|
+
}
|
|
306
|
+
},
|
|
307
|
+
"endpoints": {
|
|
308
|
+
"type": "array",
|
|
309
|
+
"description": "API endpoints (if no spec file)",
|
|
310
|
+
"items": {
|
|
311
|
+
"type": "object",
|
|
312
|
+
"properties": {
|
|
313
|
+
"method": {
|
|
314
|
+
"type": "string",
|
|
315
|
+
"enum": ["GET", "POST", "PUT", "PATCH", "DELETE"]
|
|
316
|
+
},
|
|
317
|
+
"path": { "type": "string" },
|
|
318
|
+
"handler": {
|
|
319
|
+
"type": "string",
|
|
320
|
+
"description": "File:function handling this endpoint"
|
|
321
|
+
},
|
|
322
|
+
"description": { "type": "string" },
|
|
323
|
+
"auth": {
|
|
324
|
+
"type": "string",
|
|
325
|
+
"enum": ["required", "optional", "none"]
|
|
326
|
+
},
|
|
327
|
+
"requestBody": { "type": "string" },
|
|
328
|
+
"responseType": { "type": "string" }
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
},
|
|
334
|
+
"examples": {
|
|
335
|
+
"type": "array",
|
|
336
|
+
"description": "Code example files",
|
|
337
|
+
"items": {
|
|
338
|
+
"type": "object",
|
|
339
|
+
"required": ["path"],
|
|
340
|
+
"properties": {
|
|
341
|
+
"path": {
|
|
342
|
+
"type": "string",
|
|
343
|
+
"description": "Path to example file"
|
|
344
|
+
},
|
|
345
|
+
"description": {
|
|
346
|
+
"type": "string",
|
|
347
|
+
"description": "What this example demonstrates"
|
|
348
|
+
},
|
|
349
|
+
"tags": {
|
|
350
|
+
"type": "array",
|
|
351
|
+
"items": { "type": "string" },
|
|
352
|
+
"description": "Tags for categorizing examples"
|
|
353
|
+
},
|
|
354
|
+
"runnable": {
|
|
355
|
+
"type": "boolean",
|
|
356
|
+
"description": "Whether this example can be run directly"
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
},
|
|
361
|
+
"dependencies": {
|
|
362
|
+
"type": "object",
|
|
363
|
+
"description": "Project dependencies",
|
|
364
|
+
"additionalProperties": {
|
|
365
|
+
"type": "string"
|
|
366
|
+
}
|
|
367
|
+
},
|
|
368
|
+
"config": {
|
|
369
|
+
"type": "object",
|
|
370
|
+
"description": "Configuration options the project supports",
|
|
371
|
+
"properties": {
|
|
372
|
+
"envVars": {
|
|
373
|
+
"type": "array",
|
|
374
|
+
"description": "Environment variables",
|
|
375
|
+
"items": {
|
|
376
|
+
"type": "object",
|
|
377
|
+
"properties": {
|
|
378
|
+
"name": { "type": "string" },
|
|
379
|
+
"description": { "type": "string" },
|
|
380
|
+
"required": { "type": "boolean" },
|
|
381
|
+
"default": { "type": "string" }
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
},
|
|
385
|
+
"configFiles": {
|
|
386
|
+
"type": "array",
|
|
387
|
+
"description": "Configuration files",
|
|
388
|
+
"items": {
|
|
389
|
+
"type": "object",
|
|
390
|
+
"properties": {
|
|
391
|
+
"path": { "type": "string" },
|
|
392
|
+
"format": { "type": "string" },
|
|
393
|
+
"description": { "type": "string" }
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
},
|
|
399
|
+
"errors": {
|
|
400
|
+
"type": "array",
|
|
401
|
+
"description": "Error types/codes defined in the codebase",
|
|
402
|
+
"items": {
|
|
403
|
+
"type": "object",
|
|
404
|
+
"properties": {
|
|
405
|
+
"name": { "type": "string" },
|
|
406
|
+
"code": { "type": "string" },
|
|
407
|
+
"message": { "type": "string" },
|
|
408
|
+
"description": { "type": "string" }
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
}
|
|
@@ -19,6 +19,26 @@
|
|
|
19
19
|
"format": "date-time",
|
|
20
20
|
"description": "ISO 8601 timestamp of last update"
|
|
21
21
|
},
|
|
22
|
+
"git": {
|
|
23
|
+
"type": "object",
|
|
24
|
+
"description": "Git state when context was created/updated",
|
|
25
|
+
"properties": {
|
|
26
|
+
"commitHash": {
|
|
27
|
+
"type": "string",
|
|
28
|
+
"description": "Full commit SHA when context was generated",
|
|
29
|
+
"pattern": "^[a-f0-9]{40}$"
|
|
30
|
+
},
|
|
31
|
+
"commitShort": {
|
|
32
|
+
"type": "string",
|
|
33
|
+
"description": "Short commit hash (7 chars)",
|
|
34
|
+
"pattern": "^[a-f0-9]{7}$"
|
|
35
|
+
},
|
|
36
|
+
"branch": {
|
|
37
|
+
"type": "string",
|
|
38
|
+
"description": "Branch name when generated"
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
},
|
|
22
42
|
"product": {
|
|
23
43
|
"type": "object",
|
|
24
44
|
"description": "Core product information",
|
package/dist/cli/commands/ai.js
CHANGED
|
@@ -85,6 +85,7 @@ async function promptSelect(question, choices) {
|
|
|
85
85
|
// Claude Code skills to create
|
|
86
86
|
const CLAUDE_SKILLS = [
|
|
87
87
|
'bootstrap-docs',
|
|
88
|
+
'whisk-theme',
|
|
88
89
|
'migrate-docs',
|
|
89
90
|
'import-api-spec',
|
|
90
91
|
'check-docs',
|
|
@@ -98,6 +99,7 @@ const CLAUDE_SKILLS = [
|
|
|
98
99
|
const CURSOR_RULES = [
|
|
99
100
|
'devdoc.mdc',
|
|
100
101
|
'devdoc-bootstrap.mdc',
|
|
102
|
+
'devdoc-whisk-theme.mdc',
|
|
101
103
|
'devdoc-migrate.mdc',
|
|
102
104
|
'devdoc-blame.mdc',
|
|
103
105
|
'devdoc-create.mdc',
|
|
@@ -313,6 +315,7 @@ async function ai(options) {
|
|
|
313
315
|
if (tool === 'claude' || tool === 'both') {
|
|
314
316
|
console.log('Available Claude Code commands:');
|
|
315
317
|
console.log(' /bootstrap-docs - Analyze repo and generate initial documentation');
|
|
318
|
+
console.log(' /whisk-theme - Analyze branding and generate custom theme');
|
|
316
319
|
console.log(' /migrate-docs - Migrate from Mintlify, Docusaurus, GitBook, etc.');
|
|
317
320
|
console.log(' /import-api-spec - Import OpenAPI, GraphQL, or AsyncAPI specs');
|
|
318
321
|
console.log(' /check-docs - Quick health check without changes');
|
|
@@ -328,6 +331,7 @@ async function ai(options) {
|
|
|
328
331
|
console.log();
|
|
329
332
|
console.log('Suggested prompts in Agent mode:');
|
|
330
333
|
console.log(' "Analyze this repo and generate initial documentation"');
|
|
334
|
+
console.log(' "Whisk theme - match docs to my brand colors"');
|
|
331
335
|
console.log(' "Migrate my Mintlify docs to DevDoc format"');
|
|
332
336
|
console.log(' "Check my docs for outdated content"');
|
|
333
337
|
console.log(' "Create a new guide about authentication"');
|
|
@@ -346,4 +350,4 @@ async function ai(options) {
|
|
|
346
350
|
console.log();
|
|
347
351
|
}
|
|
348
352
|
}
|
|
349
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY2xpL2NvbW1hbmRzL2FpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBNE1BLGdCQXVKQztBQW5XRCxnREFBd0I7QUFDeEIsd0RBQTBCO0FBQzFCLCtDQUE0QztBQVM1QyxzQ0FBc0M7QUFDdEMsS0FBSyxVQUFVLE1BQU0sQ0FBQyxRQUFnQixFQUFFLFlBQXFCO0lBQzNELE1BQU0sUUFBUSxHQUFHLHdEQUFhLFVBQVUsR0FBQyxDQUFDO0lBQzFDLE1BQU0sRUFBRSxHQUFHLFFBQVEsQ0FBQyxlQUFlLENBQUM7UUFDbEMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLO1FBQ3BCLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTTtLQUN2QixDQUFDLENBQUM7SUFFSCxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7UUFDN0IsTUFBTSxlQUFlLEdBQUcsWUFBWTtZQUNsQyxDQUFDLENBQUMsR0FBRyxRQUFRLEtBQUssWUFBWSxLQUFLO1lBQ25DLENBQUMsQ0FBQyxHQUFHLFFBQVEsSUFBSSxDQUFDO1FBRXBCLEVBQUUsQ0FBQyxRQUFRLENBQUMsZUFBZSxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDdEMsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ1gsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxZQUFZLElBQUksRUFBRSxDQUFDLENBQUM7UUFDL0MsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCxLQUFLLFVBQVUsWUFBWSxDQUFDLFFBQWdCLEVBQUUsT0FBMkM7SUFDdkYsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLFFBQVEsSUFBSSxDQUFDLENBQUM7SUFDL0IsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0s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QUksUUFBUSxFQUFFLENBQUM7UUFDYixPQUFPLENBQUMsR0FBRyxDQUFDLHNFQUFzRSxDQUFDLENBQUM7UUFDcEYsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ2hCLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vLi4vdXRpbHMvbG9nZ2VyJztcblxudHlwZSBBSVRvb2wgPSAnY2xhdWRlJyB8ICdjdXJzb3InIHwgJ2JvdGgnO1xuXG5pbnRlcmZhY2UgQUlPcHRpb25zIHtcbiAgdG9vbD86IEFJVG9vbDtcbiAgdXBkYXRlPzogYm9vbGVhbjtcbn1cblxuLy8gU2ltcGxlIHByb21wdCBoZWxwZXIgdXNpbmcgcmVhZGxpbmVcbmFzeW5jIGZ1bmN0aW9uIHByb21wdChxdWVzdGlvbjogc3RyaW5nLCBkZWZhdWx0VmFsdWU/OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCByZWFkbGluZSA9IGF3YWl0IGltcG9ydCgncmVhZGxpbmUnKTtcbiAgY29uc3QgcmwgPSByZWFkbGluZS5jcmVhdGVJbnRlcmZhY2Uoe1xuICAgIGlucHV0OiBwcm9jZXNzLnN0ZGluLFxuICAgIG91dHB1dDogcHJvY2Vzcy5zdGRvdXQsXG4gIH0pO1xuXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IGRpc3BsYXlRdWVzdGlvbiA9IGRlZmF1bHRWYWx1ZSBcbiAgICAgID8gYCR7cXVlc3Rpb259ICgke2RlZmF1bHRWYWx1ZX0pOiBgXG4gICAgICA6IGAke3F1ZXN0aW9ufTogYDtcbiAgICBcbiAgICBybC5xdWVzdGlvbihkaXNwbGF5UXVlc3Rpb24sIChhbnN3ZXIpID0+IHtcbiAgICAgIHJsLmNsb3NlKCk7XG4gICAgICByZXNvbHZlKGFuc3dlci50cmltKCkgfHwgZGVmYXVsdFZhbHVlIHx8ICcnKTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHByb21wdFNlbGVjdChxdWVzdGlvbjogc3RyaW5nLCBjaG9pY2VzOiB7IHZhbHVlOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfVtdKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc29sZS5sb2coYFxcbiR7cXVlc3Rpb259XFxuYCk7XG4gIGNob2ljZXMuZm9yRWFjaCgoY2hvaWNlLCBpKSA9PiB7XG4gICAgY29uc29sZS5sb2coYCAgJHtpICsgMX0uICR7Y2hvaWNlLmxhYmVsfWApO1xuICB9KTtcbiAgY29uc29sZS5sb2coKTtcbiAgXG4gIGNvbnN0IHJlYWRsaW5lID0gYXdhaXQgaW1wb3J0KCdyZWFkbGluZScpO1xuICBjb25zdCBybCA9IHJlYWRsaW5lLmNyZWF0ZUludGVyZmFjZSh7XG4gICAgaW5wdXQ6IHByb2Nlc3Muc3RkaW4sXG4gICAgb3V0cHV0OiBwcm9jZXNzLnN0ZG91dCxcbiAgfSk7XG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgcmwucXVlc3Rpb24oJ0VudGVyIG51bWJlcjogJywgKGFuc3dlcikgPT4ge1xuICAgICAgcmwuY2xvc2UoKTtcbiAgICAgIGNvbnN0IGluZGV4ID0gcGFyc2VJbnQoYW5zd2VyLnRyaW0oKSwgMTApIC0gMTtcbiAgICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgY2hvaWNlcy5sZW5ndGgpIHtcbiAgICAgICAgcmVzb2x2ZShjaG9pY2VzW2luZGV4XS52YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBEZWZhdWx0IHRvIGZpcnN0IGNob2ljZVxuICAgICAgICByZXNvbHZlKGNob2ljZXNbMF0udmFsdWUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn1cblxuLy8gQ2xhdWRlIENvZGUgc2tpbGxzIHRvIGNyZWF0ZVxuY29uc3QgQ0xBVURFX1NLSUxMUyA9IFtcbiAgJ2Jvb3RzdHJhcC1kb2NzJyxcbiAgJ21pZ3JhdGUtZG9jcycsXG4gICdpbXBvcnQtYXBpLXNwZWMnLFxuICAnY2hlY2stZG9jcycsXG4gICdibGFtZS1kb2MnLFxuICAnY3JlYXRlLWRvYycsXG4gICd1cGRhdGUtZG9jJyxcbiAgJ2RlbGV0ZS1kb2MnLFxuICAnY29tbWl0LWRvYycsXG5dO1xuXG4vLyBDdXJzb3IgcnVsZXMgdG8gY3JlYXRlXG5jb25zdCBDVVJTT1JfUlVMRVMgPSBbXG4gICdkZXZkb2MubWRjJyxcbiAgJ2RldmRvYy1ib290c3RyYXAubWRjJyxcbiAgJ2RldmRvYy1taWdyYXRlLm1kYycsXG4gICdkZXZkb2MtYmxhbWUubWRjJyxcbiAgJ2RldmRvYy1jcmVhdGUubWRjJyxcbiAgJ2RldmRvYy11cGRhdGUubWRjJyxcbiAgJ2RldmRvYy1kZWxldGUubWRjJyxcbiAgJ2RldmRvYy1jb21taXQubWRjJyxcbl07XG5cbi8qKlxuICogR2V0IHRoZSBBSSBhZ2VudHMgdGVtcGxhdGUgZGlyZWN0b3J5IHBhdGggKGhhbmRsZXMgYm90aCBkZXZlbG9wbWVudCBhbmQgaW5zdGFsbGVkIHBhY2thZ2Ugc2NlbmFyaW9zKVxuICovXG5mdW5jdGlvbiBnZXRUZW1wbGF0ZURpcigpOiBzdHJpbmcge1xuICAvLyBUcnkgcmVsYXRpdmUgdG8gY29tcGlsZWQgZGlzdCAocGFja2FnZXMvZGV2ZG9jL2Rpc3QvY2xpL2NvbW1hbmRzIC0+IHBhY2thZ2VzL2RldmRvYy9haS1hZ2VudHMpXG4gIGxldCB0ZW1wbGF0ZURpciA9IHBhdGguam9pbihfX2Rpcm5hbWUsICcuLicsICcuLicsICcuLicsICdhaS1hZ2VudHMnKTtcbiAgXG4gIGlmIChmcy5leGlzdHNTeW5jKHRlbXBsYXRlRGlyKSkge1xuICAgIHJldHVybiB0ZW1wbGF0ZURpcjtcbiAgfVxuICBcbiAgLy8gVHJ5IHJlbGF0aXZlIHRvIHNvdXJjZSAocGFja2FnZXMvZGV2ZG9jL3NyYy9jbGkvY29tbWFuZHMgLT4gcGFja2FnZXMvZGV2ZG9jL2FpLWFnZW50cylcbiAgdGVtcGxhdGVEaXIgPSBwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4nLCAnLi4nLCAnLi4nLCAnYWktYWdlbnRzJyk7XG4gIFxuICBpZiAoZnMuZXhpc3RzU3luYyh0ZW1wbGF0ZURpcikpIHtcbiAgICByZXR1cm4gdGVtcGxhdGVEaXI7XG4gIH1cbiAgXG4gIC8vIFRyeSBkZXZkb2MvdGVtcGxhdGVzIGF0IHJlcG8gcm9vdCAoZGV2ZWxvcG1lbnQgLSBtb25vcmVwbyBzdHJ1Y3R1cmUpXG4gIC8vIF9fZGlybmFtZSBpcyBwYWNrYWdlcy9kZXZkb2MvZGlzdC9jbGkvY29tbWFuZHMgLT4gZ28gdXAgNSBsZXZlbHMgdG8gcmVwbyByb290XG4gIHRlbXBsYXRlRGlyID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uJywgJy4uJywgJy4uJywgJy4uJywgJy4uJywgJ2RldmRvYycsICd0ZW1wbGF0ZXMnLCAnc3RhcnRlcicpO1xuICBcbiAgaWYgKGZzLmV4aXN0c1N5bmModGVtcGxhdGVEaXIpKSB7XG4gICAgcmV0dXJuIHRlbXBsYXRlRGlyO1xuICB9XG4gIFxuICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBmaW5kIHRlbXBsYXRlIGRpcmVjdG9yeScpO1xufVxuXG4vKipcbiAqIENvcHkgQ0xBVURFLm1kIHRvIHByb2plY3Qgcm9vdFxuICogUmV0dXJucyAnY3JlYXRlZCcgfCAndXBkYXRlZCcgfCAnc2tpcHBlZCdcbiAqL1xuZnVuY3Rpb24gY29weUNsYXVkZU1kKHByb2plY3RQYXRoOiBzdHJpbmcsIHRlbXBsYXRlRGlyOiBzdHJpbmcpOiAnY3JlYXRlZCcgfCAndXBkYXRlZCcgfCAnc2tpcHBlZCcge1xuICBjb25zdCBzb3VyY2VQYXRoID0gcGF0aC5qb2luKHRlbXBsYXRlRGlyLCAnQ0xBVURFLm1kJyk7XG4gIGNvbnN0IGRlc3RQYXRoID0gcGF0aC5qb2luKHByb2plY3RQYXRoLCAnQ0xBVURFLm1kJyk7XG4gIFxuICBpZiAoIWZzLmV4aXN0c1N5bmMoc291cmNlUGF0aCkpIHtcbiAgICByZXR1cm4gJ3NraXBwZWQnO1xuICB9XG4gIFxuICBjb25zdCBleGlzdGVkID0gZnMuZXhpc3RzU3luYyhkZXN0UGF0aCk7XG4gIGZzLmNvcHlTeW5jKHNvdXJjZVBhdGgsIGRlc3RQYXRoKTtcbiAgcmV0dXJuIGV4aXN0ZWQgPyAndXBkYXRlZCcgOiAnY3JlYXRlZCc7XG59XG5cbi8qKlxuICogQ29weSBDbGF1ZGUgQ29kZSBza2lsbHMgdG8gLmNsYXVkZS9za2lsbHMvXG4gKiBSZXR1cm5zIGFycmF5IG9mIHsgc2tpbGwsIHN0YXR1czogJ2NyZWF0ZWQnIHwgJ3VwZGF0ZWQnIH1cbiAqL1xuZnVuY3Rpb24gY29weUNsYXVkZVNraWxscyhwcm9qZWN0UGF0aDogc3RyaW5nLCB0ZW1wbGF0ZURpcjogc3RyaW5nKTogeyBza2lsbDogc3RyaW5nOyBzdGF0dXM6ICdjcmVhdGVkJyB8ICd1cGRhdGVkJyB9W10ge1xuICBjb25zdCByZXN1bHRzOiB7IHNraWxsOiBzdHJpbmc7IHN0YXR1czogJ2NyZWF0ZWQnIHwgJ3VwZGF0ZWQnIH1bXSA9IFtdO1xuICBjb25zdCBzb3VyY2VTa2lsbHNEaXIgPSBwYXRoLmpvaW4odGVtcGxhdGVEaXIsICcuY2xhdWRlJywgJ3NraWxscycpO1xuICBjb25zdCBkZXN0U2tpbGxzRGlyID0gcGF0aC5qb2luKHByb2plY3RQYXRoLCAnLmNsYXVkZScsICdza2lsbHMnKTtcbiAgXG4gIGlmICghZnMuZXhpc3RzU3luYyhzb3VyY2VTa2lsbHNEaXIpKSB7XG4gICAgbG9nZ2VyLndhcm4oJ0NsYXVkZSBza2lsbHMgdGVtcGxhdGUgZGlyZWN0b3J5IG5vdCBmb3VuZCcpO1xuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG4gIFxuICAvLyBFbnN1cmUgZGVzdGluYXRpb24gZGlyZWN0b3J5IGV4aXN0c1xuICBmcy5lbnN1cmVEaXJTeW5jKGRlc3RTa2lsbHNEaXIpO1xuICBcbiAgZm9yIChjb25zdCBza2lsbCBvZiBDTEFVREVfU0tJTExTKSB7XG4gICAgY29uc3Qgc291cmNlRGlyID0gcGF0aC5qb2luKHNvdXJjZVNraWxsc0Rpciwgc2tpbGwpO1xuICAgIGNvbnN0IGRlc3REaXIgPSBwYXRoLmpvaW4oZGVzdFNraWxsc0Rpciwgc2tpbGwpO1xuICAgIFxuICAgIGlmIChmcy5leGlzdHNTeW5jKHNvdXJjZURpcikpIHtcbiAgICAgIGNvbnN0IGV4aXN0ZWQgPSBmcy5leGlzdHNTeW5jKGRlc3REaXIpO1xuICAgICAgZnMuY29weVN5bmMoc291cmNlRGlyLCBkZXN0RGlyKTtcbiAgICAgIHJlc3VsdHMucHVzaCh7IHNraWxsLCBzdGF0dXM6IGV4aXN0ZWQgPyAndXBkYXRlZCcgOiAnY3JlYXRlZCcgfSk7XG4gICAgfVxuICB9XG4gIFxuICByZXR1cm4gcmVzdWx0cztcbn1cblxuLyoqXG4gKiBDb3B5IEN1cnNvciBydWxlcyB0byAuY3Vyc29yL3J1bGVzL1xuICogUmV0dXJucyBhcnJheSBvZiB7IHJ1bGUsIHN0YXR1czogJ2NyZWF0ZWQnIHwgJ3VwZGF0ZWQnIH1cbiAqL1xuZnVuY3Rpb24gY29weUN1cnNvclJ1bGVzKHByb2plY3RQYXRoOiBzdHJpbmcsIHRlbXBsYXRlRGlyOiBzdHJpbmcpOiB7IHJ1bGU6IHN0cmluZzsgc3RhdHVzOiAnY3JlYXRlZCcgfCAndXBkYXRlZCcgfVtdIHtcbiAgY29uc3QgcmVzdWx0czogeyBydWxlOiBzdHJpbmc7IHN0YXR1czogJ2NyZWF0ZWQnIHwgJ3VwZGF0ZWQnIH1bXSA9IFtdO1xuICBjb25zdCBzb3VyY2VSdWxlc0RpciA9IHBhdGguam9pbih0ZW1wbGF0ZURpciwgJy5jdXJzb3InLCAncnVsZXMnKTtcbiAgY29uc3QgZGVzdFJ1bGVzRGlyID0gcGF0aC5qb2luKHByb2plY3RQYXRoLCAnLmN1cnNvcicsICdydWxlcycpO1xuICBcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHNvdXJjZVJ1bGVzRGlyKSkge1xuICAgIGxvZ2dlci53YXJuKCdDdXJzb3IgcnVsZXMgdGVtcGxhdGUgZGlyZWN0b3J5IG5vdCBmb3VuZCcpO1xuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG4gIFxuICAvLyBFbnN1cmUgZGVzdGluYXRpb24gZGlyZWN0b3J5IGV4aXN0c1xuICBmcy5lbnN1cmVEaXJTeW5jKGRlc3RSdWxlc0Rpcik7XG4gIFxuICBmb3IgKGNvbnN0IHJ1bGUgb2YgQ1VSU09SX1JVTEVTKSB7XG4gICAgY29uc3Qgc291cmNlUGF0aCA9IHBhdGguam9pbihzb3VyY2VSdWxlc0RpciwgcnVsZSk7XG4gICAgY29uc3QgZGVzdFBhdGggPSBwYXRoLmpvaW4oZGVzdFJ1bGVzRGlyLCBydWxlKTtcbiAgICBcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhzb3VyY2VQYXRoKSkge1xuICAgICAgY29uc3QgZXhpc3RlZCA9IGZzLmV4aXN0c1N5bmMoZGVzdFBhdGgpO1xuICAgICAgZnMuY29weVN5bmMoc291cmNlUGF0aCwgZGVzdFBhdGgpO1xuICAgICAgcmVzdWx0cy5wdXNoKHsgcnVsZSwgc3RhdHVzOiBleGlzdGVkID8gJ3VwZGF0ZWQnIDogJ2NyZWF0ZWQnIH0pO1xuICAgIH1cbiAgfVxuICBcbiAgcmV0dXJuIHJlc3VsdHM7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgQUkgdG9vbHMgYXJlIGFscmVhZHkgaW5zdGFsbGVkXG4gKi9cbmZ1bmN0aW9uIGNoZWNrRXhpc3RpbmdJbnN0YWxsYXRpb24ocHJvamVjdFBhdGg6IHN0cmluZyk6IHsgY2xhdWRlOiBib29sZWFuOyBjdXJzb3I6IGJvb2xlYW4gfSB7XG4gIGNvbnN0IGNsYXVkZURpciA9IHBhdGguam9pbihwcm9qZWN0UGF0aCwgJy5jbGF1ZGUnLCAnc2tpbGxzJyk7XG4gIGNvbnN0IGN1cnNvckRpciA9IHBhdGguam9pbihwcm9qZWN0UGF0aCwgJy5jdXJzb3InLCAncnVsZXMnKTtcbiAgXG4gIHJldHVybiB7XG4gICAgY2xhdWRlOiBmcy5leGlzdHNTeW5jKGNsYXVkZURpcikgJiYgZnMucmVhZGRpclN5bmMoY2xhdWRlRGlyKS5sZW5ndGggPiAwLFxuICAgIGN1cnNvcjogZnMuZXhpc3RzU3luYyhjdXJzb3JEaXIpICYmIGZzLnJlYWRkaXJTeW5jKGN1cnNvckRpcikuc29tZShmID0+IGYuc3RhcnRzV2l0aCgnZGV2ZG9jJykpLFxuICB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYWkob3B0aW9uczogQUlPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnNvbGUubG9nKCk7XG4gIFxuICBjb25zdCBwcm9qZWN0UGF0aCA9IHByb2Nlc3MuY3dkKCk7XG4gIGNvbnN0IGV4aXN0aW5nID0gY2hlY2tFeGlzdGluZ0luc3RhbGxhdGlvbihwcm9qZWN0UGF0aCk7XG4gIGNvbnN0IGlzVXBkYXRlID0gb3B0aW9ucy51cGRhdGUgfHwgZXhpc3RpbmcuY2xhdWRlIHx8IGV4aXN0aW5nLmN1cnNvcjtcbiAgXG4gIGlmIChpc1VwZGF0ZSkge1xuICAgIGxvZ2dlci5pbmZvKCdEZXZEb2MgQUkgQWdlbnQgVXBkYXRlJyk7XG4gIH0gZWxzZSB7XG4gICAgbG9nZ2VyLmluZm8oJ0RldkRvYyBBSSBBZ2VudCBTZXR1cCcpO1xuICB9XG4gIGNvbnNvbGUubG9nKCk7XG5cbiAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIERldkRvYyBwcm9qZWN0XG4gIGNvbnN0IGRvY3NKc29uUGF0aCA9IHBhdGguam9pbihwcm9qZWN0UGF0aCwgJ2RvY3MuanNvbicpO1xuICBjb25zdCBoYXNEb2NzSnNvbiA9IGZzLmV4aXN0c1N5bmMoZG9jc0pzb25QYXRoKTtcbiAgXG4gIGlmICghaGFzRG9jc0pzb24pIHtcbiAgICBsb2dnZXIud2FybignTm8gZG9jcy5qc29uIGZvdW5kLiBUaGlzIG1heSBub3QgYmUgYSBEZXZEb2MgcHJvamVjdC4nKTtcbiAgICBjb25zb2xlLmxvZygpO1xuICB9XG5cbiAgLy8gR2V0IHRlbXBsYXRlIGRpcmVjdG9yeVxuICBsZXQgdGVtcGxhdGVEaXI6IHN0cmluZztcbiAgdHJ5IHtcbiAgICB0ZW1wbGF0ZURpciA9IGdldFRlbXBsYXRlRGlyKCk7XG4gIH0gY2F0Y2gge1xuICAgIGxvZ2dlci5lcnJvcignQ291bGQgbm90IGZpbmQgQUkgYWdlbnQgdGVtcGxhdGVzLiBQbGVhc2UgZW5zdXJlIERldkRvYyBpcyBpbnN0YWxsZWQgY29ycmVjdGx5LicpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIC8vIEdldCB0b29sIHNlbGVjdGlvbiBpZiBub3QgcHJvdmlkZWRcbiAgbGV0IHRvb2w6IEFJVG9vbCA9IG9wdGlvbnMudG9vbCB8fCAnYm90aCc7XG4gIFxuICBpZiAoIW9wdGlvbnMudG9vbCkge1xuICAgIC8vIElmIHVwZGF0aW5nLCBkZWZhdWx0IHRvIHVwZGF0aW5nIHdoYXQncyBhbHJlYWR5IGluc3RhbGxlZFxuICAgIGlmIChpc1VwZGF0ZSAmJiBleGlzdGluZy5jbGF1ZGUgJiYgIWV4aXN0aW5nLmN1cnNvcikge1xuICAgICAgdG9vbCA9ICdjbGF1ZGUnO1xuICAgIH0gZWxzZSBpZiAoaXNVcGRhdGUgJiYgZXhpc3RpbmcuY3Vyc29yICYmICFleGlzdGluZy5jbGF1ZGUpIHtcbiAgICAgIHRvb2wgPSAnY3Vyc29yJztcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdG9vbENob2ljZXMgPSBbXG4gICAgICAgIHsgdmFsdWU6ICdib3RoJywgbGFiZWw6ICdCb3RoIC0gQ2xhdWRlIENvZGUgYW5kIEN1cnNvcicgfSxcbiAgICAgICAgeyB2YWx1ZTogJ2NsYXVkZScsIGxhYmVsOiAnQ2xhdWRlIENvZGUgLSBTa2lsbHMgYW5kIENMQVVERS5tZCcgfSxcbiAgICAgICAgeyB2YWx1ZTogJ2N1cnNvcicsIGxhYmVsOiAnQ3Vyc29yIC0gUnVsZXMgKC5jdXJzb3IvcnVsZXMvKScgfSxcbiAgICAgIF07XG5cbiAgICAgIHRvb2wgPSBhd2FpdCBwcm9tcHRTZWxlY3QoJ1doaWNoIEFJIHRvb2wgZG8geW91IHVzZT8nLCB0b29sQ2hvaWNlcykgYXMgQUlUb29sO1xuICAgIH1cbiAgfVxuXG4gIGNvbnNvbGUubG9nKCk7XG4gIGlmIChpc1VwZGF0ZSkge1xuICAgIGxvZ2dlci5pbmZvKCdVcGRhdGluZyBBSSBhZ2VudCBjb25maWd1cmF0aW9uLi4uJyk7XG4gIH0gZWxzZSB7XG4gICAgbG9nZ2VyLmluZm8oJ1NldHRpbmcgdXAgQUkgYWdlbnQgY29uZmlndXJhdGlvbi4uLicpO1xuICB9XG4gIGNvbnNvbGUubG9nKCk7XG5cbiAgbGV0IGNyZWF0ZWRDb3VudCA9IDA7XG4gIGxldCB1cGRhdGVkQ291bnQgPSAwO1xuXG4gIC8vIFNldHVwIENsYXVkZSBDb2RlXG4gIGlmICh0b29sID09PSAnY2xhdWRlJyB8fCB0b29sID09PSAnYm90aCcpIHtcbiAgICAvLyBDb3B5IENMQVVERS5tZFxuICAgIGNvbnN0IGNsYXVkZU1kU3RhdHVzID0gY29weUNsYXVkZU1kKHByb2plY3RQYXRoLCB0ZW1wbGF0ZURpcik7XG4gICAgaWYgKGNsYXVkZU1kU3RhdHVzID09PSAnY3JlYXRlZCcpIHtcbiAgICAgIGxvZ2dlci5zdWNjZXNzKCdDcmVhdGVkIENMQVVERS5tZCcpO1xuICAgICAgY3JlYXRlZENvdW50Kys7XG4gICAgfSBlbHNlIGlmIChjbGF1ZGVNZFN0YXR1cyA9PT0gJ3VwZGF0ZWQnKSB7XG4gICAgICBsb2dnZXIuc3VjY2VzcygnVXBkYXRlZCBDTEFVREUubWQnKTtcbiAgICAgIHVwZGF0ZWRDb3VudCsrO1xuICAgIH1cbiAgICBcbiAgICAvLyBDb3B5IHNraWxsc1xuICAgIGNvbnN0IHNraWxsUmVzdWx0cyA9IGNvcHlDbGF1ZGVTa2lsbHMocHJvamVjdFBhdGgsIHRlbXBsYXRlRGlyKTtcbiAgICBmb3IgKGNvbnN0IHsgc2tpbGwsIHN0YXR1cyB9IG9mIHNraWxsUmVzdWx0cykge1xuICAgICAgaWYgKHN0YXR1cyA9PT0gJ2NyZWF0ZWQnKSB7XG4gICAgICAgIGxvZ2dlci5zdWNjZXNzKGBDcmVhdGVkIC5jbGF1ZGUvc2tpbGxzLyR7c2tpbGx9L1NLSUxMLm1kYCk7XG4gICAgICAgIGNyZWF0ZWRDb3VudCsrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nZ2VyLnN1Y2Nlc3MoYFVwZGF0ZWQgLmNsYXVkZS9za2lsbHMvJHtza2lsbH0vU0tJTEwubWRgKTtcbiAgICAgICAgdXBkYXRlZENvdW50Kys7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gU2V0dXAgQ3Vyc29yXG4gIGlmICh0b29sID09PSAnY3Vyc29yJyB8fCB0b29sID09PSAnYm90aCcpIHtcbiAgICBjb25zdCBydWxlUmVzdWx0cyA9IGNvcHlDdXJzb3JSdWxlcyhwcm9qZWN0UGF0aCwgdGVtcGxhdGVEaXIpO1xuICAgIGZvciAoY29uc3QgeyBydWxlLCBzdGF0dXMgfSBvZiBydWxlUmVzdWx0cykge1xuICAgICAgaWYgKHN0YXR1cyA9PT0gJ2NyZWF0ZWQnKSB7XG4gICAgICAgIGxvZ2dlci5zdWNjZXNzKGBDcmVhdGVkIC5jdXJzb3IvcnVsZXMvJHtydWxlfWApO1xuICAgICAgICBjcmVhdGVkQ291bnQrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZ2dlci5zdWNjZXNzKGBVcGRhdGVkIC5jdXJzb3IvcnVsZXMvJHtydWxlfWApO1xuICAgICAgICB1cGRhdGVkQ291bnQrKztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBTdW1tYXJ5XG4gIGNvbnNvbGUubG9nKCk7XG4gIGlmICh1cGRhdGVkQ291bnQgPiAwICYmIGNyZWF0ZWRDb3VudCA+IDApIHtcbiAgICBsb2dnZXIuc3VjY2VzcyhgQUkgYWdlbnQgY29uZmlndXJhdGlvbiBjb21wbGV0ZSEgKCR7Y3JlYXRlZENvdW50fSBjcmVhdGVkLCAke3VwZGF0ZWRDb3VudH0gdXBkYXRlZClgKTtcbiAgfSBlbHNlIGlmICh1cGRhdGVkQ291bnQgPiAwKSB7XG4gICAgbG9nZ2VyLnN1Y2Nlc3MoYEFJIGFnZW50IGNvbmZpZ3VyYXRpb24gdXBkYXRlZCEgKCR7dXBkYXRlZENvdW50fSBmaWxlcylgKTtcbiAgfSBlbHNlIHtcbiAgICBsb2dnZXIuc3VjY2VzcygnQUkgYWdlbnQgY29uZmlndXJhdGlvbiBjb21wbGV0ZSEnKTtcbiAgfVxuICBjb25zb2xlLmxvZygpO1xuXG4gIGlmICh0b29sID09PSAnY2xhdWRlJyB8fCB0b29sID09PSAnYm90aCcpIHtcbiAgICBjb25zb2xlLmxvZygnQXZhaWxhYmxlIENsYXVkZSBDb2RlIGNvbW1hbmRzOicpO1xuICAgIGNvbnNvbGUubG9nKCcgIC9ib290c3RyYXAtZG9jcyAgICAtIEFuYWx5emUgcmVwbyBhbmQgZ2VuZXJhdGUgaW5pdGlhbCBkb2N1bWVudGF0aW9uJyk7XG4gICAgY29uc29sZS5sb2coJyAgL21pZ3JhdGUtZG9jcyAgICAgIC0gTWlncmF0ZSBmcm9tIE1pbnRsaWZ5LCBEb2N1c2F1cnVzLCBHaXRCb29rLCBldGMuJyk7XG4gICAgY29uc29sZS5sb2coJyAgL2ltcG9ydC1hcGktc3BlYyAgIC0gSW1wb3J0IE9wZW5BUEksIEdyYXBoUUwsIG9yIEFzeW5jQVBJIHNwZWNzJyk7XG4gICAgY29uc29sZS5sb2coJyAgL2NoZWNrLWRvY3MgICAgICAgIC0gUXVpY2sgaGVhbHRoIGNoZWNrIHdpdGhvdXQgY2hhbmdlcycpO1xuICAgIGNvbnNvbGUubG9nKCcgIC9ibGFtZS1kb2MgICAgICAgICAtIEZpbmQgZHVwbGljYXRlcywgb3V0ZGF0ZWQgY29udGVudCwgZGlzY3JlcGFuY2llcycpO1xuICAgIGNvbnNvbGUubG9nKCcgIC9jcmVhdGUtZG9jICAgICAgICAtIENyZWF0ZSBhIG5ldyBkb2N1bWVudGF0aW9uIHBhZ2UnKTtcbiAgICBjb25zb2xlLmxvZygnICAvdXBkYXRlLWRvYyAgICAgICAgLSBVcGRhdGUgZXhpc3RpbmcgZG9jdW1lbnRhdGlvbicpO1xuICAgIGNvbnNvbGUubG9nKCcgIC9kZWxldGUtZG9jICAgICAgICAtIERlbGV0ZSBkb2N1bWVudGF0aW9uIHBhZ2VzJyk7XG4gICAgY29uc29sZS5sb2coJyAgL2NvbW1pdC1kb2MgICAgICAgIC0gQ29tbWl0IGRvY3VtZW50YXRpb24gY2hhbmdlcycpO1xuICAgIGNvbnNvbGUubG9nKCk7XG4gIH1cblxuICBpZiAodG9vbCA9PT0gJ2N1cnNvcicgfHwgdG9vbCA9PT0gJ2JvdGgnKSB7XG4gICAgY29uc29sZS5sb2coJ0N1cnNvciBydWxlcyBjb25maWd1cmVkIGZvciAqLm1keCBmaWxlcy4nKTtcbiAgICBjb25zb2xlLmxvZygpO1xuICAgIGNvbnNvbGUubG9nKCdTdWdnZXN0ZWQgcHJvbXB0cyBpbiBBZ2VudCBtb2RlOicpO1xuICAgIGNvbnNvbGUubG9nKCcgIFwiQW5hbHl6ZSB0aGlzIHJlcG8gYW5kIGdlbmVyYXRlIGluaXRpYWwgZG9jdW1lbnRhdGlvblwiJyk7XG4gICAgY29uc29sZS5sb2coJyAgXCJNaWdyYXRlIG15IE1pbnRsaWZ5IGRvY3MgdG8gRGV2RG9jIGZvcm1hdFwiJyk7XG4gICAgY29uc29sZS5sb2coJyAgXCJDaGVjayBteSBkb2NzIGZvciBvdXRkYXRlZCBjb250ZW50XCInKTtcbiAgICBjb25zb2xlLmxvZygnICBcIkNyZWF0ZSBhIG5ldyBndWlkZSBhYm91dCBhdXRoZW50aWNhdGlvblwiJyk7XG4gICAgY29uc29sZS5sb2coKTtcbiAgfVxuXG4gIGNvbnNvbGUubG9nKCdRdWljayBzdGFydDonKTtcbiAgaWYgKHRvb2wgPT09ICdjbGF1ZGUnIHx8IHRvb2wgPT09ICdib3RoJykge1xuICAgIGNvbnNvbGUubG9nKCcgIENsYXVkZSBDb2RlOiAvYm9vdHN0cmFwLWRvY3MnKTtcbiAgfVxuICBpZiAodG9vbCA9PT0gJ2N1cnNvcicgfHwgdG9vbCA9PT0gJ2JvdGgnKSB7XG4gICAgY29uc29sZS5sb2coJyAgQ3Vyc29yOiBBc2sgXCJnZW5lcmF0ZSBpbml0aWFsIGRvY3VtZW50YXRpb24gZnJvbSB0aGlzIHJlcG9cIicpO1xuICB9XG4gIGNvbnNvbGUubG9nKCk7XG4gIFxuICBpZiAoaXNVcGRhdGUpIHtcbiAgICBjb25zb2xlLmxvZygnVGlwOiBSZXN0YXJ0IENsYXVkZSBDb2RlIG9yIEN1cnNvciB0byBsb2FkIHRoZSB1cGRhdGVkIHNraWxscy9ydWxlcy4nKTtcbiAgICBjb25zb2xlLmxvZygpO1xuICB9XG59XG4iXX0=
|
|
353
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY2xpL2NvbW1hbmRzL2FpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBOE1BLGdCQXlKQztBQXZXRCxnREFBd0I7QUFDeEIsd0RBQTBCO0FBQzFCLCtDQUE0QztBQVM1QyxzQ0FBc0M7QUFDdEMsS0FBSyxVQUFVLE1BQU0sQ0FBQyxRQUFnQixFQUFFLFlBQXFCO0lBQzNELE1BQU0sUUFBUSxHQUFHLHdEQUFhLFVBQVUsR0FBQyxDQUFDO0lBQzFDLE1BQU0sRUFBRSxHQUFHLFFBQVEsQ0FBQyxlQUFlLENBQUM7UUFDbEMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLO1FBQ3BCLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTTtLQUN2QixDQUFDLENBQUM7SUFFSCxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7UUFDN0IsTUFBTSxlQUFlLEdBQUcsWUFBWTtZQUNsQyxDQUFDLENBQUMsR0FBRyxRQUFRLEtBQUssWUFBWSxLQUFLO1lBQ25DLENBQUMsQ0FBQyxHQUFHLFFBQVEsSUFBSSxDQUFDO1FBRXBCLEVBQUUsQ0FBQyxRQUFRLENBQUMsZUFBZSxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDdEMsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ1gsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxZQUFZLElBQUksRUFBRSxDQUFDLENBQUM7UUFDL0MsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCxLQUFLLFVBQVUsWUFBWSxDQUFDLFFBQWdCLEVBQUUsT0FBMkM7SUFDdkYsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLFFBQVEsSUFBSSxDQUFDLENBQUM7SUFDL0IsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0s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QUssTUFBTSxFQUFFLENBQUM7UUFDekMsT0FBTyxDQUFDLEdBQUcsQ0FBQywrREFBK0QsQ0FBQyxDQUFDO0lBQy9FLENBQUM7SUFDRCxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7SUFFZCxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQ2IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxzRUFBc0UsQ0FBQyxDQUFDO1FBQ3BGLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNoQixDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uLy4uL3V0aWxzL2xvZ2dlcic7XG5cbnR5cGUgQUlUb29sID0gJ2NsYXVkZScgfCAnY3Vyc29yJyB8ICdib3RoJztcblxuaW50ZXJmYWNlIEFJT3B0aW9ucyB7XG4gIHRvb2w/OiBBSVRvb2w7XG4gIHVwZGF0ZT86IGJvb2xlYW47XG59XG5cbi8vIFNpbXBsZSBwcm9tcHQgaGVscGVyIHVzaW5nIHJlYWRsaW5lXG5hc3luYyBmdW5jdGlvbiBwcm9tcHQocXVlc3Rpb246IHN0cmluZywgZGVmYXVsdFZhbHVlPzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgcmVhZGxpbmUgPSBhd2FpdCBpbXBvcnQoJ3JlYWRsaW5lJyk7XG4gIGNvbnN0IHJsID0gcmVhZGxpbmUuY3JlYXRlSW50ZXJmYWNlKHtcbiAgICBpbnB1dDogcHJvY2Vzcy5zdGRpbixcbiAgICBvdXRwdXQ6IHByb2Nlc3Muc3Rkb3V0LFxuICB9KTtcblxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCBkaXNwbGF5UXVlc3Rpb24gPSBkZWZhdWx0VmFsdWUgXG4gICAgICA/IGAke3F1ZXN0aW9ufSAoJHtkZWZhdWx0VmFsdWV9KTogYFxuICAgICAgOiBgJHtxdWVzdGlvbn06IGA7XG4gICAgXG4gICAgcmwucXVlc3Rpb24oZGlzcGxheVF1ZXN0aW9uLCAoYW5zd2VyKSA9PiB7XG4gICAgICBybC5jbG9zZSgpO1xuICAgICAgcmVzb2x2ZShhbnN3ZXIudHJpbSgpIHx8IGRlZmF1bHRWYWx1ZSB8fCAnJyk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBwcm9tcHRTZWxlY3QocXVlc3Rpb246IHN0cmluZywgY2hvaWNlczogeyB2YWx1ZTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH1bXSk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnNvbGUubG9nKGBcXG4ke3F1ZXN0aW9ufVxcbmApO1xuICBjaG9pY2VzLmZvckVhY2goKGNob2ljZSwgaSkgPT4ge1xuICAgIGNvbnNvbGUubG9nKGAgICR7aSArIDF9LiAke2Nob2ljZS5sYWJlbH1gKTtcbiAgfSk7XG4gIGNvbnNvbGUubG9nKCk7XG4gIFxuICBjb25zdCByZWFkbGluZSA9IGF3YWl0IGltcG9ydCgncmVhZGxpbmUnKTtcbiAgY29uc3QgcmwgPSByZWFkbGluZS5jcmVhdGVJbnRlcmZhY2Uoe1xuICAgIGlucHV0OiBwcm9jZXNzLnN0ZGluLFxuICAgIG91dHB1dDogcHJvY2Vzcy5zdGRvdXQsXG4gIH0pO1xuXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIHJsLnF1ZXN0aW9uKCdFbnRlciBudW1iZXI6ICcsIChhbnN3ZXIpID0+IHtcbiAgICAgIHJsLmNsb3NlKCk7XG4gICAgICBjb25zdCBpbmRleCA9IHBhcnNlSW50KGFuc3dlci50cmltKCksIDEwKSAtIDE7XG4gICAgICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IGNob2ljZXMubGVuZ3RoKSB7XG4gICAgICAgIHJlc29sdmUoY2hvaWNlc1tpbmRleF0udmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRGVmYXVsdCB0byBmaXJzdCBjaG9pY2VcbiAgICAgICAgcmVzb2x2ZShjaG9pY2VzWzBdLnZhbHVlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59XG5cbi8vIENsYXVkZSBDb2RlIHNraWxscyB0byBjcmVhdGVcbmNvbnN0IENMQVVERV9TS0lMTFMgPSBbXG4gICdib290c3RyYXAtZG9jcycsXG4gICd3aGlzay10aGVtZScsXG4gICdtaWdyYXRlLWRvY3MnLFxuICAnaW1wb3J0LWFwaS1zcGVjJyxcbiAgJ2NoZWNrLWRvY3MnLFxuICAnYmxhbWUtZG9jJyxcbiAgJ2NyZWF0ZS1kb2MnLFxuICAndXBkYXRlLWRvYycsXG4gICdkZWxldGUtZG9jJyxcbiAgJ2NvbW1pdC1kb2MnLFxuXTtcblxuLy8gQ3Vyc29yIHJ1bGVzIHRvIGNyZWF0ZVxuY29uc3QgQ1VSU09SX1JVTEVTID0gW1xuICAnZGV2ZG9jLm1kYycsXG4gICdkZXZkb2MtYm9vdHN0cmFwLm1kYycsXG4gICdkZXZkb2Mtd2hpc2stdGhlbWUubWRjJyxcbiAgJ2RldmRvYy1taWdyYXRlLm1kYycsXG4gICdkZXZkb2MtYmxhbWUubWRjJyxcbiAgJ2RldmRvYy1jcmVhdGUubWRjJyxcbiAgJ2RldmRvYy11cGRhdGUubWRjJyxcbiAgJ2RldmRvYy1kZWxldGUubWRjJyxcbiAgJ2RldmRvYy1jb21taXQubWRjJyxcbl07XG5cbi8qKlxuICogR2V0IHRoZSBBSSBhZ2VudHMgdGVtcGxhdGUgZGlyZWN0b3J5IHBhdGggKGhhbmRsZXMgYm90aCBkZXZlbG9wbWVudCBhbmQgaW5zdGFsbGVkIHBhY2thZ2Ugc2NlbmFyaW9zKVxuICovXG5mdW5jdGlvbiBnZXRUZW1wbGF0ZURpcigpOiBzdHJpbmcge1xuICAvLyBUcnkgcmVsYXRpdmUgdG8gY29tcGlsZWQgZGlzdCAocGFja2FnZXMvZGV2ZG9jL2Rpc3QvY2xpL2NvbW1hbmRzIC0+IHBhY2thZ2VzL2RldmRvYy9haS1hZ2VudHMpXG4gIGxldCB0ZW1wbGF0ZURpciA9IHBhdGguam9pbihfX2Rpcm5hbWUsICcuLicsICcuLicsICcuLicsICdhaS1hZ2VudHMnKTtcbiAgXG4gIGlmIChmcy5leGlzdHNTeW5jKHRlbXBsYXRlRGlyKSkge1xuICAgIHJldHVybiB0ZW1wbGF0ZURpcjtcbiAgfVxuICBcbiAgLy8gVHJ5IHJlbGF0aXZlIHRvIHNvdXJjZSAocGFja2FnZXMvZGV2ZG9jL3NyYy9jbGkvY29tbWFuZHMgLT4gcGFja2FnZXMvZGV2ZG9jL2FpLWFnZW50cylcbiAgdGVtcGxhdGVEaXIgPSBwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4nLCAnLi4nLCAnLi4nLCAnYWktYWdlbnRzJyk7XG4gIFxuICBpZiAoZnMuZXhpc3RzU3luYyh0ZW1wbGF0ZURpcikpIHtcbiAgICByZXR1cm4gdGVtcGxhdGVEaXI7XG4gIH1cbiAgXG4gIC8vIFRyeSBkZXZkb2MvdGVtcGxhdGVzIGF0IHJlcG8gcm9vdCAoZGV2ZWxvcG1lbnQgLSBtb25vcmVwbyBzdHJ1Y3R1cmUpXG4gIC8vIF9fZGlybmFtZSBpcyBwYWNrYWdlcy9kZXZkb2MvZGlzdC9jbGkvY29tbWFuZHMgLT4gZ28gdXAgNSBsZXZlbHMgdG8gcmVwbyByb290XG4gIHRlbXBsYXRlRGlyID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uJywgJy4uJywgJy4uJywgJy4uJywgJy4uJywgJ2RldmRvYycsICd0ZW1wbGF0ZXMnLCAnc3RhcnRlcicpO1xuICBcbiAgaWYgKGZzLmV4aXN0c1N5bmModGVtcGxhdGVEaXIpKSB7XG4gICAgcmV0dXJuIHRlbXBsYXRlRGlyO1xuICB9XG4gIFxuICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBmaW5kIHRlbXBsYXRlIGRpcmVjdG9yeScpO1xufVxuXG4vKipcbiAqIENvcHkgQ0xBVURFLm1kIHRvIHByb2plY3Qgcm9vdFxuICogUmV0dXJucyAnY3JlYXRlZCcgfCAndXBkYXRlZCcgfCAnc2tpcHBlZCdcbiAqL1xuZnVuY3Rpb24gY29weUNsYXVkZU1kKHByb2plY3RQYXRoOiBzdHJpbmcsIHRlbXBsYXRlRGlyOiBzdHJpbmcpOiAnY3JlYXRlZCcgfCAndXBkYXRlZCcgfCAnc2tpcHBlZCcge1xuICBjb25zdCBzb3VyY2VQYXRoID0gcGF0aC5qb2luKHRlbXBsYXRlRGlyLCAnQ0xBVURFLm1kJyk7XG4gIGNvbnN0IGRlc3RQYXRoID0gcGF0aC5qb2luKHByb2plY3RQYXRoLCAnQ0xBVURFLm1kJyk7XG4gIFxuICBpZiAoIWZzLmV4aXN0c1N5bmMoc291cmNlUGF0aCkpIHtcbiAgICByZXR1cm4gJ3NraXBwZWQnO1xuICB9XG4gIFxuICBjb25zdCBleGlzdGVkID0gZnMuZXhpc3RzU3luYyhkZXN0UGF0aCk7XG4gIGZzLmNvcHlTeW5jKHNvdXJjZVBhdGgsIGRlc3RQYXRoKTtcbiAgcmV0dXJuIGV4aXN0ZWQgPyAndXBkYXRlZCcgOiAnY3JlYXRlZCc7XG59XG5cbi8qKlxuICogQ29weSBDbGF1ZGUgQ29kZSBza2lsbHMgdG8gLmNsYXVkZS9za2lsbHMvXG4gKiBSZXR1cm5zIGFycmF5IG9mIHsgc2tpbGwsIHN0YXR1czogJ2NyZWF0ZWQnIHwgJ3VwZGF0ZWQnIH1cbiAqL1xuZnVuY3Rpb24gY29weUNsYXVkZVNraWxscyhwcm9qZWN0UGF0aDogc3RyaW5nLCB0ZW1wbGF0ZURpcjogc3RyaW5nKTogeyBza2lsbDogc3RyaW5nOyBzdGF0dXM6ICdjcmVhdGVkJyB8ICd1cGRhdGVkJyB9W10ge1xuICBjb25zdCByZXN1bHRzOiB7IHNraWxsOiBzdHJpbmc7IHN0YXR1czogJ2NyZWF0ZWQnIHwgJ3VwZGF0ZWQnIH1bXSA9IFtdO1xuICBjb25zdCBzb3VyY2VTa2lsbHNEaXIgPSBwYXRoLmpvaW4odGVtcGxhdGVEaXIsICcuY2xhdWRlJywgJ3NraWxscycpO1xuICBjb25zdCBkZXN0U2tpbGxzRGlyID0gcGF0aC5qb2luKHByb2plY3RQYXRoLCAnLmNsYXVkZScsICdza2lsbHMnKTtcbiAgXG4gIGlmICghZnMuZXhpc3RzU3luYyhzb3VyY2VTa2lsbHNEaXIpKSB7XG4gICAgbG9nZ2VyLndhcm4oJ0NsYXVkZSBza2lsbHMgdGVtcGxhdGUgZGlyZWN0b3J5IG5vdCBmb3VuZCcpO1xuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG4gIFxuICAvLyBFbnN1cmUgZGVzdGluYXRpb24gZGlyZWN0b3J5IGV4aXN0c1xuICBmcy5lbnN1cmVEaXJTeW5jKGRlc3RTa2lsbHNEaXIpO1xuICBcbiAgZm9yIChjb25zdCBza2lsbCBvZiBDTEFVREVfU0tJTExTKSB7XG4gICAgY29uc3Qgc291cmNlRGlyID0gcGF0aC5qb2luKHNvdXJjZVNraWxsc0Rpciwgc2tpbGwpO1xuICAgIGNvbnN0IGRlc3REaXIgPSBwYXRoLmpvaW4oZGVzdFNraWxsc0Rpciwgc2tpbGwpO1xuICAgIFxuICAgIGlmIChmcy5leGlzdHNTeW5jKHNvdXJjZURpcikpIHtcbiAgICAgIGNvbnN0IGV4aXN0ZWQgPSBmcy5leGlzdHNTeW5jKGRlc3REaXIpO1xuICAgICAgZnMuY29weVN5bmMoc291cmNlRGlyLCBkZXN0RGlyKTtcbiAgICAgIHJlc3VsdHMucHVzaCh7IHNraWxsLCBzdGF0dXM6IGV4aXN0ZWQgPyAndXBkYXRlZCcgOiAnY3JlYXRlZCcgfSk7XG4gICAgfVxuICB9XG4gIFxuICByZXR1cm4gcmVzdWx0cztcbn1cblxuLyoqXG4gKiBDb3B5IEN1cnNvciBydWxlcyB0byAuY3Vyc29yL3J1bGVzL1xuICogUmV0dXJucyBhcnJheSBvZiB7IHJ1bGUsIHN0YXR1czogJ2NyZWF0ZWQnIHwgJ3VwZGF0ZWQnIH1cbiAqL1xuZnVuY3Rpb24gY29weUN1cnNvclJ1bGVzKHByb2plY3RQYXRoOiBzdHJpbmcsIHRlbXBsYXRlRGlyOiBzdHJpbmcpOiB7IHJ1bGU6IHN0cmluZzsgc3RhdHVzOiAnY3JlYXRlZCcgfCAndXBkYXRlZCcgfVtdIHtcbiAgY29uc3QgcmVzdWx0czogeyBydWxlOiBzdHJpbmc7IHN0YXR1czogJ2NyZWF0ZWQnIHwgJ3VwZGF0ZWQnIH1bXSA9IFtdO1xuICBjb25zdCBzb3VyY2VSdWxlc0RpciA9IHBhdGguam9pbih0ZW1wbGF0ZURpciwgJy5jdXJzb3InLCAncnVsZXMnKTtcbiAgY29uc3QgZGVzdFJ1bGVzRGlyID0gcGF0aC5qb2luKHByb2plY3RQYXRoLCAnLmN1cnNvcicsICdydWxlcycpO1xuICBcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHNvdXJjZVJ1bGVzRGlyKSkge1xuICAgIGxvZ2dlci53YXJuKCdDdXJzb3IgcnVsZXMgdGVtcGxhdGUgZGlyZWN0b3J5IG5vdCBmb3VuZCcpO1xuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG4gIFxuICAvLyBFbnN1cmUgZGVzdGluYXRpb24gZGlyZWN0b3J5IGV4aXN0c1xuICBmcy5lbnN1cmVEaXJTeW5jKGRlc3RSdWxlc0Rpcik7XG4gIFxuICBmb3IgKGNvbnN0IHJ1bGUgb2YgQ1VSU09SX1JVTEVTKSB7XG4gICAgY29uc3Qgc291cmNlUGF0aCA9IHBhdGguam9pbihzb3VyY2VSdWxlc0RpciwgcnVsZSk7XG4gICAgY29uc3QgZGVzdFBhdGggPSBwYXRoLmpvaW4oZGVzdFJ1bGVzRGlyLCBydWxlKTtcbiAgICBcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhzb3VyY2VQYXRoKSkge1xuICAgICAgY29uc3QgZXhpc3RlZCA9IGZzLmV4aXN0c1N5bmMoZGVzdFBhdGgpO1xuICAgICAgZnMuY29weVN5bmMoc291cmNlUGF0aCwgZGVzdFBhdGgpO1xuICAgICAgcmVzdWx0cy5wdXNoKHsgcnVsZSwgc3RhdHVzOiBleGlzdGVkID8gJ3VwZGF0ZWQnIDogJ2NyZWF0ZWQnIH0pO1xuICAgIH1cbiAgfVxuICBcbiAgcmV0dXJuIHJlc3VsdHM7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgQUkgdG9vbHMgYXJlIGFscmVhZHkgaW5zdGFsbGVkXG4gKi9cbmZ1bmN0aW9uIGNoZWNrRXhpc3RpbmdJbnN0YWxsYXRpb24ocHJvamVjdFBhdGg6IHN0cmluZyk6IHsgY2xhdWRlOiBib29sZWFuOyBjdXJzb3I6IGJvb2xlYW4gfSB7XG4gIGNvbnN0IGNsYXVkZURpciA9IHBhdGguam9pbihwcm9qZWN0UGF0aCwgJy5jbGF1ZGUnLCAnc2tpbGxzJyk7XG4gIGNvbnN0IGN1cnNvckRpciA9IHBhdGguam9pbihwcm9qZWN0UGF0aCwgJy5jdXJzb3InLCAncnVsZXMnKTtcbiAgXG4gIHJldHVybiB7XG4gICAgY2xhdWRlOiBmcy5leGlzdHNTeW5jKGNsYXVkZURpcikgJiYgZnMucmVhZGRpclN5bmMoY2xhdWRlRGlyKS5sZW5ndGggPiAwLFxuICAgIGN1cnNvcjogZnMuZXhpc3RzU3luYyhjdXJzb3JEaXIpICYmIGZzLnJlYWRkaXJTeW5jKGN1cnNvckRpcikuc29tZShmID0+IGYuc3RhcnRzV2l0aCgnZGV2ZG9jJykpLFxuICB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYWkob3B0aW9uczogQUlPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnNvbGUubG9nKCk7XG4gIFxuICBjb25zdCBwcm9qZWN0UGF0aCA9IHByb2Nlc3MuY3dkKCk7XG4gIGNvbnN0IGV4aXN0aW5nID0gY2hlY2tFeGlzdGluZ0luc3RhbGxhdGlvbihwcm9qZWN0UGF0aCk7XG4gIGNvbnN0IGlzVXBkYXRlID0gb3B0aW9ucy51cGRhdGUgfHwgZXhpc3RpbmcuY2xhdWRlIHx8IGV4aXN0aW5nLmN1cnNvcjtcbiAgXG4gIGlmIChpc1VwZGF0ZSkge1xuICAgIGxvZ2dlci5pbmZvKCdEZXZEb2MgQUkgQWdlbnQgVXBkYXRlJyk7XG4gIH0gZWxzZSB7XG4gICAgbG9nZ2VyLmluZm8oJ0RldkRvYyBBSSBBZ2VudCBTZXR1cCcpO1xuICB9XG4gIGNvbnNvbGUubG9nKCk7XG5cbiAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIERldkRvYyBwcm9qZWN0XG4gIGNvbnN0IGRvY3NKc29uUGF0aCA9IHBhdGguam9pbihwcm9qZWN0UGF0aCwgJ2RvY3MuanNvbicpO1xuICBjb25zdCBoYXNEb2NzSnNvbiA9IGZzLmV4aXN0c1N5bmMoZG9jc0pzb25QYXRoKTtcbiAgXG4gIGlmICghaGFzRG9jc0pzb24pIHtcbiAgICBsb2dnZXIud2FybignTm8gZG9jcy5qc29uIGZvdW5kLiBUaGlzIG1heSBub3QgYmUgYSBEZXZEb2MgcHJvamVjdC4nKTtcbiAgICBjb25zb2xlLmxvZygpO1xuICB9XG5cbiAgLy8gR2V0IHRlbXBsYXRlIGRpcmVjdG9yeVxuICBsZXQgdGVtcGxhdGVEaXI6IHN0cmluZztcbiAgdHJ5IHtcbiAgICB0ZW1wbGF0ZURpciA9IGdldFRlbXBsYXRlRGlyKCk7XG4gIH0gY2F0Y2gge1xuICAgIGxvZ2dlci5lcnJvcignQ291bGQgbm90IGZpbmQgQUkgYWdlbnQgdGVtcGxhdGVzLiBQbGVhc2UgZW5zdXJlIERldkRvYyBpcyBpbnN0YWxsZWQgY29ycmVjdGx5LicpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIC8vIEdldCB0b29sIHNlbGVjdGlvbiBpZiBub3QgcHJvdmlkZWRcbiAgbGV0IHRvb2w6IEFJVG9vbCA9IG9wdGlvbnMudG9vbCB8fCAnYm90aCc7XG4gIFxuICBpZiAoIW9wdGlvbnMudG9vbCkge1xuICAgIC8vIElmIHVwZGF0aW5nLCBkZWZhdWx0IHRvIHVwZGF0aW5nIHdoYXQncyBhbHJlYWR5IGluc3RhbGxlZFxuICAgIGlmIChpc1VwZGF0ZSAmJiBleGlzdGluZy5jbGF1ZGUgJiYgIWV4aXN0aW5nLmN1cnNvcikge1xuICAgICAgdG9vbCA9ICdjbGF1ZGUnO1xuICAgIH0gZWxzZSBpZiAoaXNVcGRhdGUgJiYgZXhpc3RpbmcuY3Vyc29yICYmICFleGlzdGluZy5jbGF1ZGUpIHtcbiAgICAgIHRvb2wgPSAnY3Vyc29yJztcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdG9vbENob2ljZXMgPSBbXG4gICAgICAgIHsgdmFsdWU6ICdib3RoJywgbGFiZWw6ICdCb3RoIC0gQ2xhdWRlIENvZGUgYW5kIEN1cnNvcicgfSxcbiAgICAgICAgeyB2YWx1ZTogJ2NsYXVkZScsIGxhYmVsOiAnQ2xhdWRlIENvZGUgLSBTa2lsbHMgYW5kIENMQVVERS5tZCcgfSxcbiAgICAgICAgeyB2YWx1ZTogJ2N1cnNvcicsIGxhYmVsOiAnQ3Vyc29yIC0gUnVsZXMgKC5jdXJzb3IvcnVsZXMvKScgfSxcbiAgICAgIF07XG5cbiAgICAgIHRvb2wgPSBhd2FpdCBwcm9tcHRTZWxlY3QoJ1doaWNoIEFJIHRvb2wgZG8geW91IHVzZT8nLCB0b29sQ2hvaWNlcykgYXMgQUlUb29sO1xuICAgIH1cbiAgfVxuXG4gIGNvbnNvbGUubG9nKCk7XG4gIGlmIChpc1VwZGF0ZSkge1xuICAgIGxvZ2dlci5pbmZvKCdVcGRhdGluZyBBSSBhZ2VudCBjb25maWd1cmF0aW9uLi4uJyk7XG4gIH0gZWxzZSB7XG4gICAgbG9nZ2VyLmluZm8oJ1NldHRpbmcgdXAgQUkgYWdlbnQgY29uZmlndXJhdGlvbi4uLicpO1xuICB9XG4gIGNvbnNvbGUubG9nKCk7XG5cbiAgbGV0IGNyZWF0ZWRDb3VudCA9IDA7XG4gIGxldCB1cGRhdGVkQ291bnQgPSAwO1xuXG4gIC8vIFNldHVwIENsYXVkZSBDb2RlXG4gIGlmICh0b29sID09PSAnY2xhdWRlJyB8fCB0b29sID09PSAnYm90aCcpIHtcbiAgICAvLyBDb3B5IENMQVVERS5tZFxuICAgIGNvbnN0IGNsYXVkZU1kU3RhdHVzID0gY29weUNsYXVkZU1kKHByb2plY3RQYXRoLCB0ZW1wbGF0ZURpcik7XG4gICAgaWYgKGNsYXVkZU1kU3RhdHVzID09PSAnY3JlYXRlZCcpIHtcbiAgICAgIGxvZ2dlci5zdWNjZXNzKCdDcmVhdGVkIENMQVVERS5tZCcpO1xuICAgICAgY3JlYXRlZENvdW50Kys7XG4gICAgfSBlbHNlIGlmIChjbGF1ZGVNZFN0YXR1cyA9PT0gJ3VwZGF0ZWQnKSB7XG4gICAgICBsb2dnZXIuc3VjY2VzcygnVXBkYXRlZCBDTEFVREUubWQnKTtcbiAgICAgIHVwZGF0ZWRDb3VudCsrO1xuICAgIH1cbiAgICBcbiAgICAvLyBDb3B5IHNraWxsc1xuICAgIGNvbnN0IHNraWxsUmVzdWx0cyA9IGNvcHlDbGF1ZGVTa2lsbHMocHJvamVjdFBhdGgsIHRlbXBsYXRlRGlyKTtcbiAgICBmb3IgKGNvbnN0IHsgc2tpbGwsIHN0YXR1cyB9IG9mIHNraWxsUmVzdWx0cykge1xuICAgICAgaWYgKHN0YXR1cyA9PT0gJ2NyZWF0ZWQnKSB7XG4gICAgICAgIGxvZ2dlci5zdWNjZXNzKGBDcmVhdGVkIC5jbGF1ZGUvc2tpbGxzLyR7c2tpbGx9L1NLSUxMLm1kYCk7XG4gICAgICAgIGNyZWF0ZWRDb3VudCsrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nZ2VyLnN1Y2Nlc3MoYFVwZGF0ZWQgLmNsYXVkZS9za2lsbHMvJHtza2lsbH0vU0tJTEwubWRgKTtcbiAgICAgICAgdXBkYXRlZENvdW50Kys7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gU2V0dXAgQ3Vyc29yXG4gIGlmICh0b29sID09PSAnY3Vyc29yJyB8fCB0b29sID09PSAnYm90aCcpIHtcbiAgICBjb25zdCBydWxlUmVzdWx0cyA9IGNvcHlDdXJzb3JSdWxlcyhwcm9qZWN0UGF0aCwgdGVtcGxhdGVEaXIpO1xuICAgIGZvciAoY29uc3QgeyBydWxlLCBzdGF0dXMgfSBvZiBydWxlUmVzdWx0cykge1xuICAgICAgaWYgKHN0YXR1cyA9PT0gJ2NyZWF0ZWQnKSB7XG4gICAgICAgIGxvZ2dlci5zdWNjZXNzKGBDcmVhdGVkIC5jdXJzb3IvcnVsZXMvJHtydWxlfWApO1xuICAgICAgICBjcmVhdGVkQ291bnQrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZ2dlci5zdWNjZXNzKGBVcGRhdGVkIC5jdXJzb3IvcnVsZXMvJHtydWxlfWApO1xuICAgICAgICB1cGRhdGVkQ291bnQrKztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBTdW1tYXJ5XG4gIGNvbnNvbGUubG9nKCk7XG4gIGlmICh1cGRhdGVkQ291bnQgPiAwICYmIGNyZWF0ZWRDb3VudCA+IDApIHtcbiAgICBsb2dnZXIuc3VjY2VzcyhgQUkgYWdlbnQgY29uZmlndXJhdGlvbiBjb21wbGV0ZSEgKCR7Y3JlYXRlZENvdW50fSBjcmVhdGVkLCAke3VwZGF0ZWRDb3VudH0gdXBkYXRlZClgKTtcbiAgfSBlbHNlIGlmICh1cGRhdGVkQ291bnQgPiAwKSB7XG4gICAgbG9nZ2VyLnN1Y2Nlc3MoYEFJIGFnZW50IGNvbmZpZ3VyYXRpb24gdXBkYXRlZCEgKCR7dXBkYXRlZENvdW50fSBmaWxlcylgKTtcbiAgfSBlbHNlIHtcbiAgICBsb2dnZXIuc3VjY2VzcygnQUkgYWdlbnQgY29uZmlndXJhdGlvbiBjb21wbGV0ZSEnKTtcbiAgfVxuICBjb25zb2xlLmxvZygpO1xuXG4gIGlmICh0b29sID09PSAnY2xhdWRlJyB8fCB0b29sID09PSAnYm90aCcpIHtcbiAgICBjb25zb2xlLmxvZygnQXZhaWxhYmxlIENsYXVkZSBDb2RlIGNvbW1hbmRzOicpO1xuICAgIGNvbnNvbGUubG9nKCcgIC9ib290c3RyYXAtZG9jcyAgICAtIEFuYWx5emUgcmVwbyBhbmQgZ2VuZXJhdGUgaW5pdGlhbCBkb2N1bWVudGF0aW9uJyk7XG4gICAgY29uc29sZS5sb2coJyAgL3doaXNrLXRoZW1lICAgICAgIC0gQW5hbHl6ZSBicmFuZGluZyBhbmQgZ2VuZXJhdGUgY3VzdG9tIHRoZW1lJyk7XG4gICAgY29uc29sZS5sb2coJyAgL21pZ3JhdGUtZG9jcyAgICAgIC0gTWlncmF0ZSBmcm9tIE1pbnRsaWZ5LCBEb2N1c2F1cnVzLCBHaXRCb29rLCBldGMuJyk7XG4gICAgY29uc29sZS5sb2coJyAgL2ltcG9ydC1hcGktc3BlYyAgIC0gSW1wb3J0IE9wZW5BUEksIEdyYXBoUUwsIG9yIEFzeW5jQVBJIHNwZWNzJyk7XG4gICAgY29uc29sZS5sb2coJyAgL2NoZWNrLWRvY3MgICAgICAgIC0gUXVpY2sgaGVhbHRoIGNoZWNrIHdpdGhvdXQgY2hhbmdlcycpO1xuICAgIGNvbnNvbGUubG9nKCcgIC9ibGFtZS1kb2MgICAgICAgICAtIEZpbmQgZHVwbGljYXRlcywgb3V0ZGF0ZWQgY29udGVudCwgZGlzY3JlcGFuY2llcycpO1xuICAgIGNvbnNvbGUubG9nKCcgIC9jcmVhdGUtZG9jICAgICAgICAtIENyZWF0ZSBhIG5ldyBkb2N1bWVudGF0aW9uIHBhZ2UnKTtcbiAgICBjb25zb2xlLmxvZygnICAvdXBkYXRlLWRvYyAgICAgICAgLSBVcGRhdGUgZXhpc3RpbmcgZG9jdW1lbnRhdGlvbicpO1xuICAgIGNvbnNvbGUubG9nKCcgIC9kZWxldGUtZG9jICAgICAgICAtIERlbGV0ZSBkb2N1bWVudGF0aW9uIHBhZ2VzJyk7XG4gICAgY29uc29sZS5sb2coJyAgL2NvbW1pdC1kb2MgICAgICAgIC0gQ29tbWl0IGRvY3VtZW50YXRpb24gY2hhbmdlcycpO1xuICAgIGNvbnNvbGUubG9nKCk7XG4gIH1cblxuICBpZiAodG9vbCA9PT0gJ2N1cnNvcicgfHwgdG9vbCA9PT0gJ2JvdGgnKSB7XG4gICAgY29uc29sZS5sb2coJ0N1cnNvciBydWxlcyBjb25maWd1cmVkIGZvciAqLm1keCBmaWxlcy4nKTtcbiAgICBjb25zb2xlLmxvZygpO1xuICAgIGNvbnNvbGUubG9nKCdTdWdnZXN0ZWQgcHJvbXB0cyBpbiBBZ2VudCBtb2RlOicpO1xuICAgIGNvbnNvbGUubG9nKCcgIFwiQW5hbHl6ZSB0aGlzIHJlcG8gYW5kIGdlbmVyYXRlIGluaXRpYWwgZG9jdW1lbnRhdGlvblwiJyk7XG4gICAgY29uc29sZS5sb2coJyAgXCJXaGlzayB0aGVtZSAtIG1hdGNoIGRvY3MgdG8gbXkgYnJhbmQgY29sb3JzXCInKTtcbiAgICBjb25zb2xlLmxvZygnICBcIk1pZ3JhdGUgbXkgTWludGxpZnkgZG9jcyB0byBEZXZEb2MgZm9ybWF0XCInKTtcbiAgICBjb25zb2xlLmxvZygnICBcIkNoZWNrIG15IGRvY3MgZm9yIG91dGRhdGVkIGNvbnRlbnRcIicpO1xuICAgIGNvbnNvbGUubG9nKCcgIFwiQ3JlYXRlIGEgbmV3IGd1aWRlIGFib3V0IGF1dGhlbnRpY2F0aW9uXCInKTtcbiAgICBjb25zb2xlLmxvZygpO1xuICB9XG5cbiAgY29uc29sZS5sb2coJ1F1aWNrIHN0YXJ0OicpO1xuICBpZiAodG9vbCA9PT0gJ2NsYXVkZScgfHwgdG9vbCA9PT0gJ2JvdGgnKSB7XG4gICAgY29uc29sZS5sb2coJyAgQ2xhdWRlIENvZGU6IC9ib290c3RyYXAtZG9jcycpO1xuICB9XG4gIGlmICh0b29sID09PSAnY3Vyc29yJyB8fCB0b29sID09PSAnYm90aCcpIHtcbiAgICBjb25zb2xlLmxvZygnICBDdXJzb3I6IEFzayBcImdlbmVyYXRlIGluaXRpYWwgZG9jdW1lbnRhdGlvbiBmcm9tIHRoaXMgcmVwb1wiJyk7XG4gIH1cbiAgY29uc29sZS5sb2coKTtcbiAgXG4gIGlmIChpc1VwZGF0ZSkge1xuICAgIGNvbnNvbGUubG9nKCdUaXA6IFJlc3RhcnQgQ2xhdWRlIENvZGUgb3IgQ3Vyc29yIHRvIGxvYWQgdGhlIHVwZGF0ZWQgc2tpbGxzL3J1bGVzLicpO1xuICAgIGNvbnNvbGUubG9nKCk7XG4gIH1cbn1cbiJdfQ==
|