@jigx/core-sdk 1.2.0-next.3 → 1.2.0-next.4
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.
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": "2.0.0",
|
|
3
|
-
"sourceHash": "
|
|
4
|
-
"timestamp":
|
|
3
|
+
"sourceHash": "d4e1d2b256b3484699539f4a70ede121",
|
|
4
|
+
"timestamp": 1789125988357,
|
|
5
5
|
"stats": {
|
|
6
|
-
"inputFiles":
|
|
7
|
-
"extractionTimeMs":
|
|
6
|
+
"inputFiles": 427,
|
|
7
|
+
"extractionTimeMs": 284
|
|
8
8
|
}
|
|
9
9
|
}
|
|
@@ -95,15 +95,26 @@ export declare abstract class JsonataBuilderBase<TValue extends JsonataVariableV
|
|
|
95
95
|
protected validateDeclaredVariables(contextPath: string): JsonataBuilderValidationIssue[];
|
|
96
96
|
private validateDeclaredVariablesWithAst;
|
|
97
97
|
/**
|
|
98
|
-
* Validate JSONata syntax of expression
|
|
98
|
+
* Validate JSONata syntax of the full built expression, bindings included.
|
|
99
|
+
*
|
|
100
|
+
* Parses the same string {@link JsonataBuilderBase._build} emits, so a malformed
|
|
101
|
+
* `$name := <value>;` declaration is caught here rather than at runtime on device.
|
|
102
|
+
*
|
|
103
|
+
* @param contextPath - Context path reported on any issue.
|
|
104
|
+
* @param ctx - Build-time consumption context used to resolve {@link ResolvableBinding} values.
|
|
99
105
|
*/
|
|
100
|
-
protected validateSyntax(contextPath: string): JsonataBuilderValidationIssue[];
|
|
106
|
+
protected validateSyntax(contextPath: string, ctx?: JsonataResolutionContext): JsonataBuilderValidationIssue[];
|
|
101
107
|
/**
|
|
102
|
-
* Run base validation (syntax + declared variables).
|
|
108
|
+
* Run base validation (syntax of the full built expression + declared variables).
|
|
103
109
|
* Subclasses should call this and then append domain-specific checks.
|
|
110
|
+
*
|
|
111
|
+
* @param options.contextPath - Context path reported on any issue.
|
|
112
|
+
* @param options.ctx - Build-time consumption context, passed through to `_build` so bindings
|
|
113
|
+
* are validated exactly as they will be emitted.
|
|
104
114
|
*/
|
|
105
115
|
protected _validateBase(options?: {
|
|
106
116
|
contextPath?: string;
|
|
117
|
+
ctx?: JsonataResolutionContext;
|
|
107
118
|
}): JsonataBuilderValidationResult;
|
|
108
119
|
/**
|
|
109
120
|
* Build final expression string.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../src/jsonata/builder.ts"],"names":[],"mappings":"AAIA;;;;;;;GAOG;AACH,eAAO,MAAM,mBAAmB,wBAAwB,CAAA;AAExD;;;;;GAKG;AACH,MAAM,WAAW,4BAA4B;IAC3C,0DAA0D;IAC1D,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,wFAAwF;IACxF,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;IAC3B;;;;OAIG;IACH,QAAQ,CAAC,kBAAkB,CAAC,EAAE,OAAO,CAAA;CACtC;AAED;;;;GAIG;AACH,MAAM,MAAM,wBAAwB,GAAG,4BAA4B,GAAG,OAAO,mBAAmB,CAAA;AAEhG;;;;;;GAMG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;;;;OAMG;IACH,cAAc,CAAC,GAAG,EAAE,wBAAwB,GAAG,MAAM,CAAA;CACtD;AAED,MAAM,MAAM,oBAAoB,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../src/jsonata/builder.ts"],"names":[],"mappings":"AAIA;;;;;;;GAOG;AACH,eAAO,MAAM,mBAAmB,wBAAwB,CAAA;AAExD;;;;;GAKG;AACH,MAAM,WAAW,4BAA4B;IAC3C,0DAA0D;IAC1D,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,wFAAwF;IACxF,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;IAC3B;;;;OAIG;IACH,QAAQ,CAAC,kBAAkB,CAAC,EAAE,OAAO,CAAA;CACtC;AAED;;;;GAIG;AACH,MAAM,MAAM,wBAAwB,GAAG,4BAA4B,GAAG,OAAO,mBAAmB,CAAA;AAEhG;;;;;;GAMG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;;;;OAMG;IACH,cAAc,CAAC,GAAG,EAAE,wBAAwB,GAAG,MAAM,CAAA;CACtD;AAED,MAAM,MAAM,oBAAoB,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,iBAAiB,CAAA;AA8GvF;;;;GAIG;AACH,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,MAAM,EAAE,SAAS,6BAA6B,EAAE,CAAA;CAC1D;AAED;;;;;;;;;GASG;AACH,8BAAsB,kBAAkB,CACtC,MAAM,SAAS,oBAAoB,GAAG,oBAAoB;IAE1D,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACjD,SAAS,CAAC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;IAEzC;;;OAGG;IACH,SAAS,aAAa,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAwDrE;IAED;;OAEG;IACH,MAAM,CAAC,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAEpD;IAED;;OAEG;IACH,SAAS,CAAC,yBAAyB,CAAC,WAAW,EAAE,MAAM,GAAG,6BAA6B,EAAE,CAExF;IAED,OAAO,CAAC,gCAAgC;IAmExC;;;;;;;;OAQG;IACH,SAAS,CAAC,cAAc,CACtB,WAAW,EAAE,MAAM,EACnB,GAAG,CAAC,EAAE,wBAAwB,GAC7B,6BAA6B,EAAE,CAejC;IAED;;;;;;;OAOG;IACH,SAAS,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE;QAChC,WAAW,CAAC,EAAE,MAAM,CAAA;QACpB,GAAG,CAAC,EAAE,wBAAwB,CAAA;KAC/B,GAAG,8BAA8B,CAYjC;IAED;;;;;;;;;OASG;IACH,MAAM,CAAC,OAAO,EAAE;QAAE,yBAAyB,EAAE,OAAO,CAAC;QAAC,GAAG,CAAC,EAAE,wBAAwB,CAAA;KAAE,GAAG,MAAM,CAe9F;CACF"}
|
package/dist/jsonata/builder.js
CHANGED
|
@@ -16,6 +16,94 @@ export const RECORD_DATA_CONTEXT = 'RECORD_DATA_CONTEXT';
|
|
|
16
16
|
function isResolvableBinding(value) {
|
|
17
17
|
return value !== null && typeof value === 'object' && typeof value.resolveBinding === 'function';
|
|
18
18
|
}
|
|
19
|
+
/** A JSONata variable name: a letter or underscore, then letters, digits, or underscores. */
|
|
20
|
+
const VARIABLE_NAME_PATTERN = /^[a-zA-Z_][a-zA-Z0-9_]*$/;
|
|
21
|
+
/**
|
|
22
|
+
* Does a `@`/`$`-prefixed string denote a JSONata reference rather than literal text?
|
|
23
|
+
*
|
|
24
|
+
* Parsing alone is too weak a test — `"$a := 1"` and `"$"` are both valid JSONata, but as a binding
|
|
25
|
+
* value they inject an assignment and the whole input context respectively. A reference is a `path`
|
|
26
|
+
* (`"@ctx.a.b"`), a `function` call (`"$now()"`), or a plain named `variable` (`"$someVar"`).
|
|
27
|
+
*
|
|
28
|
+
* Excluded, and therefore treated as literal text:
|
|
29
|
+
* - any `bind`, at the top level or nested — every binding shares one `(...)` block scope, so a
|
|
30
|
+
* `:=` anywhere inside a value would reassign a sibling binding.
|
|
31
|
+
* - a variable whose name is not a plain identifier. The parser is permissive here: `"$"` and
|
|
32
|
+
* `"$$"` yield an empty or `$` name, `"$5"` a digit, and `"$\"x\""` a name of `"x"` with the
|
|
33
|
+
* quotes kept — each parses and evaluates to `undefined` or the whole input context. Matching
|
|
34
|
+
* {@link VARIABLE_NAME_PATTERN} admits only real identifiers, so the rest stay literal text.
|
|
35
|
+
* - a variable carrying a predicate, such as `"$x[0]"`.
|
|
36
|
+
*/
|
|
37
|
+
function isReferenceFragment(trimmed) {
|
|
38
|
+
const ast = parseJsonataAst(trimmed);
|
|
39
|
+
if (ast === null || containsBind(ast)) {
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
const astType = getAstType(ast);
|
|
43
|
+
if (astType === 'path' || astType === 'function') {
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
if (astType !== 'variable') {
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
const name = getAstString(ast, 'value');
|
|
50
|
+
return name !== undefined && VARIABLE_NAME_PATTERN.test(name) && ast.predicate === undefined;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Does an AST assign to a variable anywhere within it?
|
|
54
|
+
*
|
|
55
|
+
* A `:=` nested inside an otherwise-valid reference — `"$trim($a := 1)"`, or a path predicate such
|
|
56
|
+
* as `"@ctx.items[$a := 1].name"` — reassigns whatever sibling binding shares that name, since
|
|
57
|
+
* {@link JsonataBuilderBase._build} splices every binding into one block scope.
|
|
58
|
+
*/
|
|
59
|
+
function containsBind(ast) {
|
|
60
|
+
let found = false;
|
|
61
|
+
visitAst(ast, (node) => {
|
|
62
|
+
if (getAstType(node) === 'bind') {
|
|
63
|
+
found = true;
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
return found;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Is a quote-wrapped string a single string literal, rather than an expression that merely starts
|
|
70
|
+
* and ends with a quote? `'"AB-12"'` is; `'"a" & "b"'` parses as a concatenation and is not.
|
|
71
|
+
*/
|
|
72
|
+
function isSingleStringLiteral(trimmed) {
|
|
73
|
+
const ast = parseJsonataAst(trimmed);
|
|
74
|
+
return ast !== null && getAstType(ast) === 'string';
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Emit a string binding value as JSONata source.
|
|
78
|
+
*
|
|
79
|
+
* A string is emitted verbatim only when it is genuinely JSONata source: a `@`/`$`-prefixed
|
|
80
|
+
* reference that parses, or a single quoted literal. Anything else — prose, an empty string, a
|
|
81
|
+
* price like `"$5"`, a handle like `"@jigx"` — is literal text and is JSON-quoted, so it can
|
|
82
|
+
* neither produce an unparseable `$name := <value>;` declaration nor silently evaluate to
|
|
83
|
+
* something other than itself.
|
|
84
|
+
*
|
|
85
|
+
* Classification never guesses about an unprefixed, unquoted string: a bare word such as
|
|
86
|
+
* `Manufacturer` parses as a path lookup, so parsing cannot tell it apart from literal text. Those
|
|
87
|
+
* are always quoted.
|
|
88
|
+
*/
|
|
89
|
+
function emitStringBinding(value) {
|
|
90
|
+
const trimmed = value.trim();
|
|
91
|
+
const isQuoteWrapped = trimmed.length >= 2 &&
|
|
92
|
+
((trimmed.startsWith('"') && trimmed.endsWith('"')) ||
|
|
93
|
+
(trimmed.startsWith("'") && trimmed.endsWith("'")));
|
|
94
|
+
// Raw branches emit `trimmed`, never `value`: classification parses `trimmed`, and
|
|
95
|
+
// `String.prototype.trim()` strips the whole Unicode `White_Space` set while JSONata's lexer
|
|
96
|
+
// skips only ASCII whitespace. Emitting `value` would splice a padding NBSP back in and turn
|
|
97
|
+
// `"hello"` into the field lookup ` "hello" `, which evaluates to `undefined` and still parses,
|
|
98
|
+
// so validation cannot see it.
|
|
99
|
+
if (isQuoteWrapped) {
|
|
100
|
+
return isSingleStringLiteral(trimmed) ? trimmed : JSON.stringify(value);
|
|
101
|
+
}
|
|
102
|
+
if (trimmed.startsWith('@') || trimmed.startsWith('$')) {
|
|
103
|
+
return isReferenceFragment(trimmed) ? trimmed : JSON.stringify(value);
|
|
104
|
+
}
|
|
105
|
+
return JSON.stringify(value);
|
|
106
|
+
}
|
|
19
107
|
/**
|
|
20
108
|
* Reusable JSONata builder base for variable-ized expressions.
|
|
21
109
|
*
|
|
@@ -39,9 +127,8 @@ export class JsonataBuilderBase {
|
|
|
39
127
|
`The "=" prefix is handled internally by the builder.`);
|
|
40
128
|
}
|
|
41
129
|
this.variables = new Map();
|
|
42
|
-
const variableNamePattern = /^[a-zA-Z_][a-zA-Z0-9_]*$/;
|
|
43
130
|
for (const [name, value] of Object.entries(variables ?? {})) {
|
|
44
|
-
if (!
|
|
131
|
+
if (!VARIABLE_NAME_PATTERN.test(name)) {
|
|
45
132
|
throw new Error(`Invalid variable name: "${name}". ` +
|
|
46
133
|
`Variable names must start with a letter or underscore, ` +
|
|
47
134
|
`followed by letters, digits, or underscores.`);
|
|
@@ -50,6 +137,24 @@ export class JsonataBuilderBase {
|
|
|
50
137
|
throw new Error(`Invalid variable value for "${name}": "${value}". ` +
|
|
51
138
|
`String values must not start with "=".`);
|
|
52
139
|
}
|
|
140
|
+
// Without these, an object with no `resolveBinding` reaches `String(value)` in `_build` and
|
|
141
|
+
// emits the unparseable `$name := [object Object];`.
|
|
142
|
+
if (value instanceof JsonataBuilderBase) {
|
|
143
|
+
throw new Error(`Invalid variable value for "${name}": a builder cannot be nested inside another ` +
|
|
144
|
+
`builder's variables. Inline its body and merge its variables, or pass a field ` +
|
|
145
|
+
`reference such as \`field.valueRef()\`.`);
|
|
146
|
+
}
|
|
147
|
+
if (typeof value === 'object' && value !== null && !isResolvableBinding(value)) {
|
|
148
|
+
throw new Error(`Invalid variable value for "${name}": expected a string, number, boolean, null, or a ` +
|
|
149
|
+
`ResolvableBinding (e.g. a field reference), but received an object.`);
|
|
150
|
+
}
|
|
151
|
+
// `TValue` excludes these, but an `any`-typed or deserialized map reaches here anyway, and
|
|
152
|
+
// `String(value)` would emit `$name := undefined;` — valid JSONata that evaluates to nothing.
|
|
153
|
+
const valueType = typeof value;
|
|
154
|
+
if (valueType === 'undefined' || valueType === 'function' || valueType === 'symbol') {
|
|
155
|
+
throw new Error(`Invalid variable value for "${name}": expected a string, number, boolean, null, or a ` +
|
|
156
|
+
`ResolvableBinding (e.g. a field reference), but received ${valueType}.`);
|
|
157
|
+
}
|
|
53
158
|
this.variables.set(name, value);
|
|
54
159
|
}
|
|
55
160
|
this.expressionBody = body;
|
|
@@ -124,16 +229,17 @@ export class JsonataBuilderBase {
|
|
|
124
229
|
}));
|
|
125
230
|
}
|
|
126
231
|
/**
|
|
127
|
-
* Validate JSONata syntax of expression
|
|
232
|
+
* Validate JSONata syntax of the full built expression, bindings included.
|
|
233
|
+
*
|
|
234
|
+
* Parses the same string {@link JsonataBuilderBase._build} emits, so a malformed
|
|
235
|
+
* `$name := <value>;` declaration is caught here rather than at runtime on device.
|
|
236
|
+
*
|
|
237
|
+
* @param contextPath - Context path reported on any issue.
|
|
238
|
+
* @param ctx - Build-time consumption context used to resolve {@link ResolvableBinding} values.
|
|
128
239
|
*/
|
|
129
|
-
validateSyntax(contextPath) {
|
|
130
|
-
const
|
|
131
|
-
|
|
132
|
-
// Multi-statement JSONata often requires explicit block wrapping.
|
|
133
|
-
if (!syntaxValidation.isValid) {
|
|
134
|
-
const wrapped = transformForValidation(`(${this.expressionBody})`);
|
|
135
|
-
syntaxValidation = validateSyntax(wrapped);
|
|
136
|
-
}
|
|
240
|
+
validateSyntax(contextPath, ctx) {
|
|
241
|
+
const built = this._build({ shouldReturnRawExpression: true, ctx });
|
|
242
|
+
const syntaxValidation = validateSyntax(transformForValidation(built));
|
|
137
243
|
if (!syntaxValidation.isValid && syntaxValidation.error) {
|
|
138
244
|
return [
|
|
139
245
|
{
|
|
@@ -147,8 +253,12 @@ export class JsonataBuilderBase {
|
|
|
147
253
|
return [];
|
|
148
254
|
}
|
|
149
255
|
/**
|
|
150
|
-
* Run base validation (syntax + declared variables).
|
|
256
|
+
* Run base validation (syntax of the full built expression + declared variables).
|
|
151
257
|
* Subclasses should call this and then append domain-specific checks.
|
|
258
|
+
*
|
|
259
|
+
* @param options.contextPath - Context path reported on any issue.
|
|
260
|
+
* @param options.ctx - Build-time consumption context, passed through to `_build` so bindings
|
|
261
|
+
* are validated exactly as they will be emitted.
|
|
152
262
|
*/
|
|
153
263
|
_validateBase(options) {
|
|
154
264
|
const contextPath = options?.contextPath ?? '';
|
|
@@ -156,7 +266,7 @@ export class JsonataBuilderBase {
|
|
|
156
266
|
if (!this.expressionBody) {
|
|
157
267
|
return { isValid: true, issues: [] };
|
|
158
268
|
}
|
|
159
|
-
issues.push(...this.validateSyntax(contextPath));
|
|
269
|
+
issues.push(...this.validateSyntax(contextPath, options?.ctx));
|
|
160
270
|
issues.push(...this.validateDeclaredVariables(contextPath));
|
|
161
271
|
return { isValid: issues.length === 0, issues };
|
|
162
272
|
}
|
|
@@ -176,11 +286,13 @@ export class JsonataBuilderBase {
|
|
|
176
286
|
for (const [name, value] of this.variables) {
|
|
177
287
|
const emitted = isResolvableBinding(value)
|
|
178
288
|
? value.resolveBinding(ctx ?? RECORD_DATA_CONTEXT)
|
|
179
|
-
:
|
|
289
|
+
: typeof value === 'string'
|
|
290
|
+
? emitStringBinding(value)
|
|
291
|
+
: String(value);
|
|
180
292
|
jsonata += `$${name} := ${emitted};\n`;
|
|
181
293
|
}
|
|
182
294
|
jsonata += this.expressionBody;
|
|
183
295
|
return shouldReturnRawExpression ? `(${jsonata})` : `=(${jsonata})`;
|
|
184
296
|
}
|
|
185
297
|
}
|
|
186
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9qc29uYXRhL2J1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHNCQUFzQixJQUFJLCtCQUErQixFQUFFLE1BQU0saUJBQWlCLENBQUE7QUFDM0YsT0FBTyxFQUFFLGVBQWUsRUFBRSxzQkFBc0IsRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTtBQUN6RixPQUFPLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sVUFBVSxDQUFBO0FBRXhFOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxxQkFBcUIsQ0FBQTtBQWdEeEQ7O0dBRUc7QUFDSCxTQUFTLG1CQUFtQixDQUFDLEtBQTJCO0lBQ3RELE9BQU8sS0FBSyxLQUFLLElBQUksSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksT0FBTyxLQUFLLENBQUMsY0FBYyxLQUFLLFVBQVUsQ0FBQTtBQUNsRyxDQUFDO0FBc0JEOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sT0FBZ0Isa0JBQWtCO0lBR25CLFNBQVMsQ0FBcUI7SUFDOUIsY0FBYyxDQUFRO0lBRXpDOzs7T0FHRztJQUNILFlBQXNCLElBQVksRUFBRSxTQUFrQztRQUNwRSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN6QixNQUFNLElBQUksS0FBSyxDQUNiLG1EQUFtRDtnQkFDakQsc0RBQXNELENBQ3pELENBQUE7UUFDSCxDQUFDO1FBRUQsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFBO1FBQzFCLE1BQU0sbUJBQW1CLEdBQUcsMEJBQTBCLENBQUE7UUFFdEQsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxJQUFJ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QUMsV0FBVyxDQUFDLENBQUMsQ0FBQTtRQUUzRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFBO0lBQ2pELENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSCxNQUFNLENBQUMsT0FBK0U7UUFDcEYsTUFBTSxFQUFFLHlCQUF5QixFQUFFLEdBQUcsRUFBRSxHQUFHLE9BQU8sQ0FBQTtRQUNsRCxJQUFJLE9BQU8sR0FBRyxFQUFFLENBQUE7UUFFaEIsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUMzQyxNQUFNLE9BQU8sR0FBRyxtQkFBbUIsQ0FBQyxLQUFLLENBQUM7Z0JBQ3hDLENBQUMsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLEdBQUcsSUFBSSxtQkFBbUIsQ0FBQztnQkFDbEQsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtZQUNqQixPQUFPLElBQUksSUFBSSxJQUFJLE9BQU8sT0FBTyxLQUFLLENBQUE7UUFDeEMsQ0FBQztRQUVELE9BQU8sSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFBO1FBQzlCLE9BQU8seUJBQXlCLENBQUMsQ0FBQyxDQUFDLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssT0FBTyxHQUFHLENBQUE7SUFDckUsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZXh0cmFjdFNjb3BlUmVmZXJlbmNlcyBhcyBleHRyYWN0Q2Fub25pY2FsU2NvcGVSZWZlcmVuY2VzIH0gZnJvbSAnLi9leHByZXNzaW9uLmpzJ1xuaW1wb3J0IHsgcGFyc2VKc29uYXRhQXN0LCB0cmFuc2Zvcm1Gb3JWYWxpZGF0aW9uLCB2YWxpZGF0ZVN5bnRheCB9IGZyb20gJy4vZXhwcmVzc2lvbi5qcydcbmltcG9ydCB7IGdldEFzdFN0cmluZywgZ2V0QXN0VHlwZSwgaXNBc3ROb2RlLCB2aXNpdEFzdCB9IGZyb20gJy4vYXN0LmpzJ1xuXG4vKipcbiAqIFNlbnRpbmVsIGNvbnRleHQgbWVhbmluZyBcIm5vIGNvbnN1bXB0aW9uIHNpdGUg4oCUIHJlc29sdmUgYWdhaW5zdCBzYXZlZCByZWNvcmQgZGF0YS5cIlxuICpcbiAqIFBhc3NlZCBpbnN0ZWFkIG9mIGEge0BsaW5rIEpzb25hdGFSZXNvbHV0aW9uQ29udGV4dFNpdGV9IHdoZW4gYSBiaW5kaW5nIGlzIGJ1aWx0IG91dHNpZGUgYW55XG4gKiBsaXZlIGNvbXBvbmVudCBzY29wZSAoZS5nLiBleHBlcnQtc2RrIHN0ZXAtbGV2ZWwgdGl0bGUvbmV4dC9pc1JlcXVpcmVkIHNsb3RzLCBkcm9wZG93biBsaXN0XG4gKiBkYXRhKS4gQSB7QGxpbmsgUmVzb2x2YWJsZUJpbmRpbmd9IHRyZWF0cyBpdCBhcyB0aGUgZXhwbGljaXQgY3Jvc3Mtc3RlcC9wZXJzaXN0ZWQtZGF0YSBicmFuY2hcbiAqIHJhdGhlciB0aGFuIGd1ZXNzaW5nIGZyb20gYW4gZW1wdHkgb2JqZWN0LlxuICovXG5leHBvcnQgY29uc3QgUkVDT1JEX0RBVEFfQ09OVEVYVCA9ICdSRUNPUkRfREFUQV9DT05URVhUJ1xuXG4vKipcbiAqIFNpdGUgaGFsZiBvZiBhIHtAbGluayBKc29uYXRhUmVzb2x1dGlvbkNvbnRleHR9OiB0aGUgbGl2ZSBjb25zdW1wdGlvbiBzaXRlJ3Mgc3RlcC9hcnJheSBzY29wZS5cbiAqXG4gKiBPcGFxdWUgdG8gY29yZS1zZGs6IGRvbWFpbiBTREtzIChlLmcuIGV4cGVydC1zZGspIHBvcHVsYXRlIHRoZXNlIGZpZWxkcyBhbmQgYVxuICoge0BsaW5rIFJlc29sdmFibGVCaW5kaW5nfSBpbnRlcnByZXRzIHRoZW0gdG8gcGljayB0aGUgY29ycmVjdCBzY29wZSBzdHJpbmcuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSnNvbmF0YVJlc29sdXRpb25Db250ZXh0U2l0ZSB7XG4gIC8qKiBPd25pbmcgc3RlcCBpZCBvZiB0aGUgY29uc3VtcHRpb24gc2l0ZSwgd2hlbiBrbm93bi4gKi9cbiAgcmVhZG9ubHkgc3RlcElkPzogc3RyaW5nXG4gIC8qKiBBcnJheSBuYW1lIG9mIHRoZSBjb25zdW1wdGlvbiBzaXRlLCB3aGVuIHRoZSBleHByZXNzaW9uIGlzIGJ1aWx0IGluc2lkZSBhbiBhcnJheS4gKi9cbiAgcmVhZG9ubHkgYXJyYXlOYW1lPzogc3RyaW5nXG4gIC8qKlxuICAgKiBUcnVlIHdoZW4gdGhlIHNpdGUgY29uc3VtZXMgdGhlIGxpdmUgY3VycmVudCBpdGVtIG9mIGEgbGlzdC9hcnJheSBjb21wb25lbnQg4oCUIGl0c1xuICAgKiBwZXItaXRlbSB0aXRsZS9zdWJ0aXRsZS9kZXNjcmlwdGlvbiBkaXNwbGF5IHNsb3RzLiBTYW1lLWFycmF5IHJlZnMgaGVyZSByZXNvbHZlIHRvXG4gICAqIGBAY3R4LmN1cnJlbnQuaXRlbS4qYC5cbiAgICovXG4gIHJlYWRvbmx5IGlzQ3VycmVudEl0ZW1TY29wZT86IGJvb2xlYW5cbn1cblxuLyoqXG4gKiBCdWlsZC10aW1lIGNvbnRleHQgZGVzY3JpYmluZyB3aGVyZSBhIEpTT05hdGEgZXhwcmVzc2lvbiBpcyBiZWluZyBjb25zdW1lZDogZWl0aGVyIGEgbGl2ZVxuICoge0BsaW5rIEpzb25hdGFSZXNvbHV0aW9uQ29udGV4dFNpdGV9IChzdGVwL2FycmF5IHNjb3BlKSBvciB0aGUge0BsaW5rIFJFQ09SRF9EQVRBX0NPTlRFWFR9XG4gKiBzZW50aW5lbCBmb3IgYmluZGluZ3MgYnVpbHQgb3V0c2lkZSBhbnkgY29tcG9uZW50IHNjb3BlLlxuICovXG5leHBvcnQgdHlwZSBKc29uYXRhUmVzb2x1dGlvbkNvbnRleHQgPSBKc29uYXRhUmVzb2x1dGlvbkNvbnRleHRTaXRlIHwgdHlwZW9mIFJFQ09SRF9EQVRBX0NPTlRFWFRcblxuLyoqXG4gKiBBIGJpbmRpbmcgdmFsdWUgdGhhdCByZXNvbHZlcyB0byBhIEpTT05hdGEtZW1iZWRkYWJsZSBzdHJpbmcgYXQgYnVpbGQgdGltZS5cbiAqXG4gKiBMZXRzIGEgZG9tYWluIFNESyBkZWZlciBhIGJpbmRpbmcncyBmaW5hbCBzY29wZSBzdHJpbmcgdW50aWwge0BsaW5rIEpzb25hdGFCdWlsZGVyQmFzZS5fYnVpbGR9LFxuICogd2hlbiB0aGUgY29uc3VtcHRpb24tc2l0ZSB7QGxpbmsgSnNvbmF0YVJlc29sdXRpb25Db250ZXh0fSBpcyBrbm93biwgd2l0aG91dCBjb3VwbGluZyBjb3JlLXNka1xuICogdG8gdGhlIGRvbWFpbiB0eXBlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZhYmxlQmluZGluZyB7XG4gIC8qKlxuICAgKiBSZXNvbHZlIHRvIHRoZSBmaW5hbCBzY29wZSBzdHJpbmcgZ2l2ZW4gdGhlIGJ1aWxkLXRpbWUgY29uc3VtcHRpb24gY29udGV4dC5cbiAgICpcbiAgICogQHBhcmFtIGN0eCAtIEJ1aWxkLXRpbWUgY29uc3VtcHRpb24gY29udGV4dDogYSB7QGxpbmsgSnNvbmF0YVJlc29sdXRpb25Db250ZXh0U2l0ZX0sIG9yXG4gICAqICAge0BsaW5rIFJFQ09SRF9EQVRBX0NPTlRFWFR9IHdoZW4gdGhlIGJpbmRpbmcgaXMgYnVpbHQgb3V0c2lkZSBhbnkgbGl2ZSBjb21wb25lbnQgc2NvcGUuXG4gICAqIEByZXR1cm5zIEEgSlNPTmF0YS1lbWJlZGRhYmxlIHN0cmluZyAobXVzdCBub3Qgc3RhcnQgd2l0aCBgPWApLlxuICAgKi9cbiAgcmVzb2x2ZUJpbmRpbmcoY3R4OiBKc29uYXRhUmVzb2x1dGlvbkNvbnRleHQpOiBzdHJpbmdcbn1cblxuZXhwb3J0IHR5cGUgSnNvbmF0YVZhcmlhYmxlVmFsdWUgPSBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgbnVsbCB8IFJlc29sdmFibGVCaW5kaW5nXG5cbi8qKlxuICogVHlwZSBndWFyZCBmb3Ige0BsaW5rIFJlc29sdmFibGVCaW5kaW5nfSB2YWx1ZXMgaW5zaWRlIGEgYmluZGluZyBtYXAuXG4gKi9cbmZ1bmN0aW9uIGlzUmVzb2x2YWJsZUJpbmRpbmcodmFsdWU6IEpzb25hdGFWYXJpYWJsZVZhbHVlKTogdmFsdWUgaXMgUmVzb2x2YWJsZUJpbmRpbmcge1xuICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgdmFsdWUucmVzb2x2ZUJpbmRpbmcgPT09ICdmdW5jdGlvbidcbn1cblxuLyoqXG4gKiBNaW5pbWFsLCBjb3JlLWxldmVsIEpTT05hdGEgdmFsaWRhdGlvbiBpc3N1ZSBlbWl0dGVkIGJ5IHtAbGluayBKc29uYXRhQnVpbGRlckJhc2V9LlxuICpcbiAqIERvbWFpbiBTREtzIGNhbiBtYXAgdGhpcyB0byByaWNoZXIgaXNzdWUgbW9kZWxzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEpzb25hdGFCdWlsZGVyVmFsaWRhdGlvbklzc3VlIHtcbiAgcmVhZG9ubHkgc2NvcGU6IHN0cmluZ1xuICByZWFkb25seSBzZXZlcml0eTogJ2Vycm9yJ1xuICByZWFkb25seSBjb250ZXh0UGF0aDogc3RyaW5nXG4gIHJlYWRvbmx5IG1lc3NhZ2U6IHN0cmluZ1xufVxuXG4vKipcbiAqIEJhc2UgdmFsaWRhdGlvbiByZXN1bHQgZnJvbSB7QGxpbmsgSnNvbmF0YUJ1aWxkZXJCYXNlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBKc29uYXRhQnVpbGRlclZhbGlkYXRpb25SZXN1bHQge1xuICByZWFkb25seSBpc1ZhbGlkOiBib29sZWFuXG4gIHJlYWRvbmx5IGlzc3VlczogcmVhZG9ubHkgSnNvbmF0YUJ1aWxkZXJWYWxpZGF0aW9uSXNzdWVbXVxufVxuXG4vKipcbiAqIFJldXNhYmxlIEpTT05hdGEgYnVpbGRlciBiYXNlIGZvciB2YXJpYWJsZS1pemVkIGV4cHJlc3Npb25zLlxuICpcbiAqIFVzZSB0aGlzIGNsYXNzIHdoZW4geW91IG5lZWQ6XG4gKiAtIGEgc3RhYmxlIGNvbnN0cnVjdG9yIGZvciBKU09OYXRhIGJvZHkgKyB2YXJpYWJsZXMsXG4gKiAtIHN5bnRheCArIHVuZGVjbGFyZWQgdmFyaWFibGUgY2hlY2tzLFxuICogLSBjb25zaXN0ZW50IG91dHB1dCBmb3JtYXR0aW5nIChgPS4uLmAgb3IgcmF3KS5cbiAqXG4gKiBFeHRlbmQgdGhpcyBpbiBkb21haW4gcGFja2FnZXMgKGUuZy4gZXhwZXJ0LXNkaykgdG8gYWRkIGRvbWFpbiBwb2xpY3kgY2hlY2tzLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgSnNvbmF0YUJ1aWxkZXJCYXNlPFxuICBUVmFsdWUgZXh0ZW5kcyBKc29uYXRhVmFyaWFibGVWYWx1ZSA9IEpzb25hdGFWYXJpYWJsZVZhbHVlLFxuPiB7XG4gIHByb3RlY3RlZCByZWFkb25seSB2YXJpYWJsZXM6IE1hcDxzdHJpbmcsIFRWYWx1ZT5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGV4cHJlc3Npb25Cb2R5OiBzdHJpbmdcblxuICAvKipcbiAgICogQHBhcmFtIGJvZHkgSlNPTmF0YSBib2R5IGV4cHJlc3Npb24uIE11c3Qgbm90IHN0YXJ0IHdpdGggYD1gLlxuICAgKiBAcGFyYW0gdmFyaWFibGVzIE9wdGlvbmFsIHZhcmlhYmxlcyB1c2VkIGluc2lkZSB0aGUgYm9keSBhcyBgJG5hbWVgLlxuICAgKi9cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKGJvZHk6IHN0cmluZywgdmFyaWFibGVzPzogUmVjb3JkPHN0cmluZywgVFZhbHVlPikge1xuICAgIGlmIChib2R5LnN0YXJ0c1dpdGgoJz0nKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgSlNPTmF0YSBleHByZXNzaW9uIGJvZHkgbXVzdCBub3Qgc3RhcnQgd2l0aCBcIj1cIi4gYCArXG4gICAgICAgICAgYFRoZSBcIj1cIiBwcmVmaXggaXMgaGFuZGxlZCBpbnRlcm5hbGx5IGJ5IHRoZSBidWlsZGVyLmAsXG4gICAgICApXG4gICAgfVxuXG4gICAgdGhpcy52YXJpYWJsZXMgPSBuZXcgTWFwKClcbiAgICBjb25zdCB2YXJpYWJsZU5hbWVQYXR0ZXJuID0gL15bYS16QS1aX11bYS16QS1aMC05X10qJC9cblxuICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh2YXJpYWJsZXMgPz8ge30pKSB7XG4gICAgICBpZiAoIXZhcmlhYmxlTmFtZVBhdHRlcm4udGVzdChuYW1lKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEludmFsaWQgdmFyaWFibGUgbmFtZTogXCIke25hbWV9XCIuIGAgK1xuICAgICAgICAgICAgYFZhcmlhYmxlIG5hbWVzIG11c3Qgc3RhcnQgd2l0aCBhIGxldHRlciBvciB1bmRlcnNjb3JlLCBgICtcbiAgICAgICAgICAgIGBmb2xsb3dlZCBieSBsZXR0ZXJzLCBkaWdpdHMsIG9yIHVuZGVyc2NvcmVzLmAsXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUuc3RhcnRzV2l0aCgnPScpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgSW52YWxpZCB2YXJpYWJsZSB2YWx1ZSBmb3IgXCIke25hbWV9XCI6IFwiJHt2YWx1ZX1cIi4gYCArXG4gICAgICAgICAgICBgU3RyaW5nIHZhbHVlcyBtdXN0IG5vdCBzdGFydCB3aXRoIFwiPVwiLmAsXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgdGhpcy52YXJpYWJsZXMuc2V0KG5hbWUsIHZhbHVlKVxuICAgIH1cblxuICAgIHRoaXMuZXhwcmVzc2lvbkJvZHkgPSBib2R5XG4gIH1cblxuICAvKipcbiAgICogRXh0cmFjdCBjYW5vbmljYWwgYGN0eC4qYCBzY29wZSByZWZlcmVuY2VzIGZyb20gYXJiaXRyYXJ5IEpTT05hdGEtbGlrZSB0ZXh0LlxuICAgKi9cbiAgc3RhdGljIGV4dHJhY3RTY29wZVJlZmVyZW5jZXModGV4dDogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBleHRyYWN0Q2Fub25pY2FsU2NvcGVSZWZlcmVuY2VzKHRleHQpXG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgYCR2YXJgIHJlZmVyZW5jZXMgaW4gZXhwcmVzc2lvbiBib2R5IGFyZSBkZWNsYXJlZCwgbGFtYmRhIHBhcmFtcywgb3IgbG9jYWwgYXNzaWdubWVudHMuXG4gICAqL1xuICBwcm90ZWN0ZWQgdmFsaWRhdGVEZWNsYXJlZFZhcmlhYmxlcyhjb250ZXh0UGF0aDogc3RyaW5nKTogSnNvbmF0YUJ1aWxkZXJWYWxpZGF0aW9uSXNzdWVbXSB7XG4gICAgcmV0dXJuIHRoaXMudmFsaWRhdGVEZWNsYXJlZFZhcmlhYmxlc1dpdGhBc3QoY29udGV4dFBhdGgpXG4gIH1cblxuICBwcml2YXRlIHZhbGlkYXRlRGVjbGFyZWRWYXJpYWJsZXNXaXRoQXN0KGNvbnRleHRQYXRoOiBzdHJpbmcpOiBKc29uYXRhQnVpbGRlclZhbGlkYXRpb25Jc3N1ZVtdIHtcbiAgICBjb25zdCBhc3QgPSBwYXJzZUpzb25hdGFBc3QodGhpcy5leHByZXNzaW9uQm9keSlcbiAgICBpZiAoYXN0ID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gW1xuICAgICAgICB7XG4gICAgICAgICAgc2NvcGU6IHRoaXMuZXhwcmVzc2lvbkJvZHksXG4gICAgICAgICAgc2V2ZXJpdHk6ICdlcnJvcicsXG4gICAgICAgICAgY29udGV4dFBhdGgsXG4gICAgICAgICAgbWVzc2FnZTogJ1VuYWJsZSB0byBwYXJzZSBKU09OYXRhIGV4cHJlc3Npb24gZm9yIHZhcmlhYmxlIHZhbGlkYXRpb24nLFxuICAgICAgICB9LFxuICAgICAgXVxuICAgIH1cblxuICAgIGNvbnN0IGRlY2xhcmVkID0gbmV3IFNldDxzdHJpbmc+KHRoaXMudmFyaWFibGVzLmtleXMoKSlcbiAgICBjb25zdCByZWZlcmVuY2VkID0gbmV3IFNldDxzdHJpbmc+KClcbiAgICB2aXNpdEFzdChhc3QsIChub2RlLCBwYXJlbnQsIGtleUluUGFyZW50KSA9PiB7XG4gICAgICBjb25zdCBub2RlVHlwZSA9IGdldEFzdFR5cGUobm9kZSlcblxuICAgICAgaWYgKG5vZGVUeXBlID09PSAnbGFtYmRhJyAmJiBBcnJheS5pc0FycmF5KG5vZGUuYXJndW1lbnRzKSkge1xuICAgICAgICBmb3IgKGNvbnN0IGFyZyBvZiBub2RlLmFyZ3VtZW50cykge1xuICAgICAgICAgIGlmIChpc0FzdE5vZGUoYXJnKSAmJiBnZXRBc3RUeXBlKGFyZykgPT09ICd2YXJpYWJsZScpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhck5hbWUgPSBnZXRBc3RTdHJpbmcoYXJnLCAndmFsdWUnKVxuICAgICAgICAgICAgaWYgKHZhck5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBkZWNsYXJlZC5hZGQodmFyTmFtZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKG5vZGVUeXBlID09PSAnYmluZCcgJiYgaXNBc3ROb2RlKG5vZGUubGhzKSAmJiBnZXRBc3RUeXBlKG5vZGUubGhzKSA9PT0gJ3ZhcmlhYmxlJykge1xuICAgICAgICBjb25zdCBsaHNWYXIgPSBnZXRBc3RTdHJpbmcobm9kZS5saHMsICd2YWx1ZScpXG4gICAgICAgIGlmIChsaHNWYXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGRlY2xhcmVkLmFkZChsaHNWYXIpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKG5vZGVUeXBlID09PSAndmFyaWFibGUnKSB7XG4gICAgICAgIGNvbnN0IHZhcmlhYmxlTmFtZSA9IGdldEFzdFN0cmluZyhub2RlLCAndmFsdWUnKVxuICAgICAgICBpZiAodmFyaWFibGVOYW1lID09PSB1bmRlZmluZWQpIHJldHVyblxuXG4gICAgICAgIGNvbnN0IGlzQ29udGV4dFJvb3QgPSB2YXJpYWJsZU5hbWUgPT09ICcnIHx8IHZhcmlhYmxlTmFtZSA9PT0gJyQnXG4gICAgICAgIGNvbnN0IGlzRnVuY3Rpb25Qcm9jZWR1cmUgPVxuICAgICAgICAgIHBhcmVudCAhPT0gbnVsbCAmJiBnZXRBc3RUeXBlKHBhcmVudCkgPT09ICdmdW5jdGlvbicgJiYga2V5SW5QYXJlbnQgPT09ICdwcm9jZWR1cmUnXG4gICAgICAgIGlmICghaXNDb250ZXh0Um9vdCAmJiAhaXNGdW5jdGlvblByb2NlZHVyZSkge1xuICAgICAgICAgIHJlZmVyZW5jZWQuYWRkKHZhcmlhYmxlTmFtZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG5cbiAgICBjb25zdCB1bmRlY2xhcmVkID0gQXJyYXkuZnJvbShyZWZlcmVuY2VkKS5maWx0ZXIoKG5hbWUpID0+ICFkZWNsYXJlZC5oYXMobmFtZSkpXG4gICAgaWYgKHVuZGVjbGFyZWQubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gW11cbiAgICB9XG5cbiAgICBjb25zdCB2YXJpYWJsZUxpc3QgPSB1bmRlY2xhcmVkLmpvaW4oJywgJylcbiAgICBjb25zdCBtZXNzYWdlID1cbiAgICAgIGBKU09OYXRhIGV4cHJlc3Npb24gcmVmZXJlbmNlcyB1bmRlY2xhcmVkIHZhcmlhYmxlczogJHt2YXJpYWJsZUxpc3R9LiBgICtcbiAgICAgIGBEZWNsYXJlIHRoZW0gaW4gdGhlIHZhcmlhYmxlcyBtYXAgcGFzc2VkIHRvIHRoZSBidWlsZGVyIGNvbnN0cnVjdG9yLmBcblxuICAgIHJldHVybiB1bmRlY2xhcmVkLm1hcCgobmFtZSkgPT4gKHtcbiAgICAgIHNjb3BlOiBgJCR7bmFtZX1gLFxuICAgICAgc2V2ZXJpdHk6ICdlcnJvcicgYXMgY29uc3QsXG4gICAgICBjb250ZXh0UGF0aCxcbiAgICAgIG1lc3NhZ2UsXG4gICAgfSkpXG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgSlNPTmF0YSBzeW50YXggb2YgZXhwcmVzc2lvbiBib2R5LlxuICAgKi9cbiAgcHJvdGVjdGVkIHZhbGlkYXRlU3ludGF4KGNvbnRleHRQYXRoOiBzdHJpbmcpOiBKc29uYXRhQnVpbGRlclZhbGlkYXRpb25Jc3N1ZVtdIHtcbiAgICBjb25zdCB0cmFuc2Zvcm1lZCA9IHRyYW5zZm9ybUZvclZhbGlkYXRpb24odGhpcy5leHByZXNzaW9uQm9keSlcbiAgICBsZXQgc3ludGF4VmFsaWRhdGlvbiA9IHZhbGlkYXRlU3ludGF4KHRyYW5zZm9ybWVkKVxuXG4gICAgLy8gTXVsdGktc3RhdGVtZW50IEpTT05hdGEgb2Z0ZW4gcmVxdWlyZXMgZXhwbGljaXQgYmxvY2sgd3JhcHBpbmcuXG4gICAgaWYgKCFzeW50YXhWYWxpZGF0aW9uLmlzVmFsaWQpIHtcbiAgICAgIGNvbnN0IHdyYXBwZWQgPSB0cmFuc2Zvcm1Gb3JWYWxpZGF0aW9uKGAoJHt0aGlzLmV4cHJlc3Npb25Cb2R5fSlgKVxuICAgICAgc3ludGF4VmFsaWRhdGlvbiA9IHZhbGlkYXRlU3ludGF4KHdyYXBwZWQpXG4gICAgfVxuXG4gICAgaWYgKCFzeW50YXhWYWxpZGF0aW9uLmlzVmFsaWQgJiYgc3ludGF4VmFsaWRhdGlvbi5lcnJvcikge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAge1xuICAgICAgICAgIHNjb3BlOiB0aGlzLmV4cHJlc3Npb25Cb2R5LFxuICAgICAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgICAgIGNvbnRleHRQYXRoLFxuICAgICAgICAgIG1lc3NhZ2U6IHN5bnRheFZhbGlkYXRpb24uZXJyb3IsXG4gICAgICAgIH0sXG4gICAgICBdXG4gICAgfVxuICAgIHJldHVybiBbXVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1biBiYXNlIHZhbGlkYXRpb24gKHN5bnRheCArIGRlY2xhcmVkIHZhcmlhYmxlcykuXG4gICAqIFN1YmNsYXNzZXMgc2hvdWxkIGNhbGwgdGhpcyBhbmQgdGhlbiBhcHBlbmQgZG9tYWluLXNwZWNpZmljIGNoZWNrcy5cbiAgICovXG4gIHByb3RlY3RlZCBfdmFsaWRhdGVCYXNlKG9wdGlvbnM/OiB7IGNvbnRleHRQYXRoPzogc3RyaW5nIH0pOiBKc29uYXRhQnVpbGRlclZhbGlkYXRpb25SZXN1bHQge1xuICAgIGNvbnN0IGNvbnRleHRQYXRoID0gb3B0aW9ucz8uY29udGV4dFBhdGggPz8gJydcbiAgICBjb25zdCBpc3N1ZXM6IEpzb25hdGFCdWlsZGVyVmFsaWRhdGlvbklzc3VlW10gPSBbXVxuXG4gICAgaWYgKCF0aGlzLmV4cHJlc3Npb25Cb2R5KSB7XG4gICAgICByZXR1cm4geyBpc1ZhbGlkOiB0cnVlLCBpc3N1ZXM6IFtdIH1cbiAgICB9XG5cbiAgICBpc3N1ZXMucHVzaCguLi50aGlzLnZhbGlkYXRlU3ludGF4KGNvbnRleHRQYXRoKSlcbiAgICBpc3N1ZXMucHVzaCguLi50aGlzLnZhbGlkYXRlRGVjbGFyZWRWYXJpYWJsZXMoY29udGV4dFBhdGgpKVxuXG4gICAgcmV0dXJuIHsgaXNWYWxpZDogaXNzdWVzLmxlbmd0aCA9PT0gMCwgaXNzdWVzIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBmaW5hbCBleHByZXNzaW9uIHN0cmluZy5cbiAgICpcbiAgICogUmVzb2x2YWJsZSBiaW5kaW5ncyBhcmUgcmVzb2x2ZWQgYWdhaW5zdCBgY3R4YCAob3Ige0BsaW5rIFJFQ09SRF9EQVRBX0NPTlRFWFR9IHdoZW4gb21pdHRlZCk7XG4gICAqIGBudWxsYCBhbmQgc2NhbGFyIGJpbmRpbmdzIGFyZSBlbWl0dGVkIHZlcmJhdGltLlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucy5zaG91bGRSZXR1cm5SYXdFeHByZXNzaW9uIC0gUmV0dXJuIGAoJHtib2R5fSlgIGluc3RlYWQgb2YgYD0oJHtib2R5fSlgLlxuICAgKiBAcGFyYW0gb3B0aW9ucy5jdHggLSBCdWlsZC10aW1lIGNvbnN1bXB0aW9uIGNvbnRleHQgdXNlZCB0byByZXNvbHZlIHtAbGluayBSZXNvbHZhYmxlQmluZGluZ30gdmFsdWVzLlxuICAgKiBAcmV0dXJucyBgPSgke2JvZHl9KWAgYnkgZGVmYXVsdCwgb3IgYCgke2JvZHl9KWAgd2hlbiBgc2hvdWxkUmV0dXJuUmF3RXhwcmVzc2lvbmAgaXMgdHJ1ZS5cbiAgICovXG4gIF9idWlsZChvcHRpb25zOiB7IHNob3VsZFJldHVyblJhd0V4cHJlc3Npb246IGJvb2xlYW47IGN0eD86IEpzb25hdGFSZXNvbHV0aW9uQ29udGV4dCB9KTogc3RyaW5nIHtcbiAgICBjb25zdCB7IHNob3VsZFJldHVyblJhd0V4cHJlc3Npb24sIGN0eCB9ID0gb3B0aW9uc1xuICAgIGxldCBqc29uYXRhID0gJydcblxuICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiB0aGlzLnZhcmlhYmxlcykge1xuICAgICAgY29uc3QgZW1pdHRlZCA9IGlzUmVzb2x2YWJsZUJpbmRpbmcodmFsdWUpXG4gICAgICAgID8gdmFsdWUucmVzb2x2ZUJpbmRpbmcoY3R4ID8/IFJFQ09SRF9EQVRBX0NPTlRFWFQpXG4gICAgICAgIDogU3RyaW5nKHZhbHVlKVxuICAgICAganNvbmF0YSArPSBgJCR7bmFtZX0gOj0gJHtlbWl0dGVkfTtcXG5gXG4gICAgfVxuXG4gICAganNvbmF0YSArPSB0aGlzLmV4cHJlc3Npb25Cb2R5XG4gICAgcmV0dXJuIHNob3VsZFJldHVyblJhd0V4cHJlc3Npb24gPyBgKCR7anNvbmF0YX0pYCA6IGA9KCR7anNvbmF0YX0pYFxuICB9XG59XG4iXX0=
|
|
298
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9qc29uYXRhL2J1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHNCQUFzQixJQUFJLCtCQUErQixFQUFFLE1BQU0saUJBQWlCLENBQUE7QUFDM0YsT0FBTyxFQUFFLGVBQWUsRUFBRSxzQkFBc0IsRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTtBQUN6RixPQUFPLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sVUFBVSxDQUFBO0FBRXhFOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxxQkFBcUIsQ0FBQTtBQWdEeEQ7O0dBRUc7QUFDSCxTQUFTLG1CQUFtQixDQUFDLEtBQTJCO0lBQ3RELE9BQU8sS0FBSyxLQUFLLElBQUksSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksT0FBTyxLQUFLLENBQUMsY0FBYyxLQUFLLFVBQVUsQ0FBQTtBQUNsRyxDQUFDO0FBRUQsNkZBQTZGO0FBQzdGLE1BQU0scUJBQXFCLEdBQUcsMEJBQTBCLENBQUE7QUFFeEQ7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsU0FBUyxtQkFBbUIsQ0FBQyxPQUFlO0lBQzFDLE1BQU0sR0FBRyxHQUFHLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUNwQyxJQUFJLEdBQUcsS0FBSyxJQUFJLElBQUksWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDdEMsT0FBTyxLQUFLLENBQUE7SUFDZCxDQUFDO0lBRUQsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQy9CLElBQUksT0FBTyxLQUFLLE1BQU0sSUFBSSxPQUFPLEtBQUssVUFBVSxFQUFFLENBQUM7UUFDakQsT0FBTyxJQUFJLENBQUE7SUFDYixDQUFDO0lBRUQsSUFBSSxPQUFPLEtBQUss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SyxDQUFDO29CQUMxQixDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO1lBQ25CLE9BQU8sSUFBSSxJQUFJLElBQUksT0FBTyxPQUFPLEtBQUssQ0FBQTtRQUN4QyxDQUFDO1FBRUQsT0FBTyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUE7UUFDOUIsT0FBTyx5QkFBeUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxPQUFPLEdBQUcsQ0FBQTtJQUNyRSxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBleHRyYWN0U2NvcGVSZWZlcmVuY2VzIGFzIGV4dHJhY3RDYW5vbmljYWxTY29wZVJlZmVyZW5jZXMgfSBmcm9tICcuL2V4cHJlc3Npb24uanMnXG5pbXBvcnQgeyBwYXJzZUpzb25hdGFBc3QsIHRyYW5zZm9ybUZvclZhbGlkYXRpb24sIHZhbGlkYXRlU3ludGF4IH0gZnJvbSAnLi9leHByZXNzaW9uLmpzJ1xuaW1wb3J0IHsgZ2V0QXN0U3RyaW5nLCBnZXRBc3RUeXBlLCBpc0FzdE5vZGUsIHZpc2l0QXN0IH0gZnJvbSAnLi9hc3QuanMnXG5cbi8qKlxuICogU2VudGluZWwgY29udGV4dCBtZWFuaW5nIFwibm8gY29uc3VtcHRpb24gc2l0ZSDigJQgcmVzb2x2ZSBhZ2FpbnN0IHNhdmVkIHJlY29yZCBkYXRhLlwiXG4gKlxuICogUGFzc2VkIGluc3RlYWQgb2YgYSB7QGxpbmsgSnNvbmF0YVJlc29sdXRpb25Db250ZXh0U2l0ZX0gd2hlbiBhIGJpbmRpbmcgaXMgYnVpbHQgb3V0c2lkZSBhbnlcbiAqIGxpdmUgY29tcG9uZW50IHNjb3BlIChlLmcuIGV4cGVydC1zZGsgc3RlcC1sZXZlbCB0aXRsZS9uZXh0L2lzUmVxdWlyZWQgc2xvdHMsIGRyb3Bkb3duIGxpc3RcbiAqIGRhdGEpLiBBIHtAbGluayBSZXNvbHZhYmxlQmluZGluZ30gdHJlYXRzIGl0IGFzIHRoZSBleHBsaWNpdCBjcm9zcy1zdGVwL3BlcnNpc3RlZC1kYXRhIGJyYW5jaFxuICogcmF0aGVyIHRoYW4gZ3Vlc3NpbmcgZnJvbSBhbiBlbXB0eSBvYmplY3QuXG4gKi9cbmV4cG9ydCBjb25zdCBSRUNPUkRfREFUQV9DT05URVhUID0gJ1JFQ09SRF9EQVRBX0NPTlRFWFQnXG5cbi8qKlxuICogU2l0ZSBoYWxmIG9mIGEge0BsaW5rIEpzb25hdGFSZXNvbHV0aW9uQ29udGV4dH06IHRoZSBsaXZlIGNvbnN1bXB0aW9uIHNpdGUncyBzdGVwL2FycmF5IHNjb3BlLlxuICpcbiAqIE9wYXF1ZSB0byBjb3JlLXNkazogZG9tYWluIFNES3MgKGUuZy4gZXhwZXJ0LXNkaykgcG9wdWxhdGUgdGhlc2UgZmllbGRzIGFuZCBhXG4gKiB7QGxpbmsgUmVzb2x2YWJsZUJpbmRpbmd9IGludGVycHJldHMgdGhlbSB0byBwaWNrIHRoZSBjb3JyZWN0IHNjb3BlIHN0cmluZy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBKc29uYXRhUmVzb2x1dGlvbkNvbnRleHRTaXRlIHtcbiAgLyoqIE93bmluZyBzdGVwIGlkIG9mIHRoZSBjb25zdW1wdGlvbiBzaXRlLCB3aGVuIGtub3duLiAqL1xuICByZWFkb25seSBzdGVwSWQ/OiBzdHJpbmdcbiAgLyoqIEFycmF5IG5hbWUgb2YgdGhlIGNvbnN1bXB0aW9uIHNpdGUsIHdoZW4gdGhlIGV4cHJlc3Npb24gaXMgYnVpbHQgaW5zaWRlIGFuIGFycmF5LiAqL1xuICByZWFkb25seSBhcnJheU5hbWU/OiBzdHJpbmdcbiAgLyoqXG4gICAqIFRydWUgd2hlbiB0aGUgc2l0ZSBjb25zdW1lcyB0aGUgbGl2ZSBjdXJyZW50IGl0ZW0gb2YgYSBsaXN0L2FycmF5IGNvbXBvbmVudCDigJQgaXRzXG4gICAqIHBlci1pdGVtIHRpdGxlL3N1YnRpdGxlL2Rlc2NyaXB0aW9uIGRpc3BsYXkgc2xvdHMuIFNhbWUtYXJyYXkgcmVmcyBoZXJlIHJlc29sdmUgdG9cbiAgICogYEBjdHguY3VycmVudC5pdGVtLipgLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNDdXJyZW50SXRlbVNjb3BlPzogYm9vbGVhblxufVxuXG4vKipcbiAqIEJ1aWxkLXRpbWUgY29udGV4dCBkZXNjcmliaW5nIHdoZXJlIGEgSlNPTmF0YSBleHByZXNzaW9uIGlzIGJlaW5nIGNvbnN1bWVkOiBlaXRoZXIgYSBsaXZlXG4gKiB7QGxpbmsgSnNvbmF0YVJlc29sdXRpb25Db250ZXh0U2l0ZX0gKHN0ZXAvYXJyYXkgc2NvcGUpIG9yIHRoZSB7QGxpbmsgUkVDT1JEX0RBVEFfQ09OVEVYVH1cbiAqIHNlbnRpbmVsIGZvciBiaW5kaW5ncyBidWlsdCBvdXRzaWRlIGFueSBjb21wb25lbnQgc2NvcGUuXG4gKi9cbmV4cG9ydCB0eXBlIEpzb25hdGFSZXNvbHV0aW9uQ29udGV4dCA9IEpzb25hdGFSZXNvbHV0aW9uQ29udGV4dFNpdGUgfCB0eXBlb2YgUkVDT1JEX0RBVEFfQ09OVEVYVFxuXG4vKipcbiAqIEEgYmluZGluZyB2YWx1ZSB0aGF0IHJlc29sdmVzIHRvIGEgSlNPTmF0YS1lbWJlZGRhYmxlIHN0cmluZyBhdCBidWlsZCB0aW1lLlxuICpcbiAqIExldHMgYSBkb21haW4gU0RLIGRlZmVyIGEgYmluZGluZydzIGZpbmFsIHNjb3BlIHN0cmluZyB1bnRpbCB7QGxpbmsgSnNvbmF0YUJ1aWxkZXJCYXNlLl9idWlsZH0sXG4gKiB3aGVuIHRoZSBjb25zdW1wdGlvbi1zaXRlIHtAbGluayBKc29uYXRhUmVzb2x1dGlvbkNvbnRleHR9IGlzIGtub3duLCB3aXRob3V0IGNvdXBsaW5nIGNvcmUtc2RrXG4gKiB0byB0aGUgZG9tYWluIHR5cGVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmFibGVCaW5kaW5nIHtcbiAgLyoqXG4gICAqIFJlc29sdmUgdG8gdGhlIGZpbmFsIHNjb3BlIHN0cmluZyBnaXZlbiB0aGUgYnVpbGQtdGltZSBjb25zdW1wdGlvbiBjb250ZXh0LlxuICAgKlxuICAgKiBAcGFyYW0gY3R4IC0gQnVpbGQtdGltZSBjb25zdW1wdGlvbiBjb250ZXh0OiBhIHtAbGluayBKc29uYXRhUmVzb2x1dGlvbkNvbnRleHRTaXRlfSwgb3JcbiAgICogICB7QGxpbmsgUkVDT1JEX0RBVEFfQ09OVEVYVH0gd2hlbiB0aGUgYmluZGluZyBpcyBidWlsdCBvdXRzaWRlIGFueSBsaXZlIGNvbXBvbmVudCBzY29wZS5cbiAgICogQHJldHVybnMgQSBKU09OYXRhLWVtYmVkZGFibGUgc3RyaW5nIChtdXN0IG5vdCBzdGFydCB3aXRoIGA9YCkuXG4gICAqL1xuICByZXNvbHZlQmluZGluZyhjdHg6IEpzb25hdGFSZXNvbHV0aW9uQ29udGV4dCk6IHN0cmluZ1xufVxuXG5leHBvcnQgdHlwZSBKc29uYXRhVmFyaWFibGVWYWx1ZSA9IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBudWxsIHwgUmVzb2x2YWJsZUJpbmRpbmdcblxuLyoqXG4gKiBUeXBlIGd1YXJkIGZvciB7QGxpbmsgUmVzb2x2YWJsZUJpbmRpbmd9IHZhbHVlcyBpbnNpZGUgYSBiaW5kaW5nIG1hcC5cbiAqL1xuZnVuY3Rpb24gaXNSZXNvbHZhYmxlQmluZGluZyh2YWx1ZTogSnNvbmF0YVZhcmlhYmxlVmFsdWUpOiB2YWx1ZSBpcyBSZXNvbHZhYmxlQmluZGluZyB7XG4gIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHR5cGVvZiB2YWx1ZS5yZXNvbHZlQmluZGluZyA9PT0gJ2Z1bmN0aW9uJ1xufVxuXG4vKiogQSBKU09OYXRhIHZhcmlhYmxlIG5hbWU6IGEgbGV0dGVyIG9yIHVuZGVyc2NvcmUsIHRoZW4gbGV0dGVycywgZGlnaXRzLCBvciB1bmRlcnNjb3Jlcy4gKi9cbmNvbnN0IFZBUklBQkxFX05BTUVfUEFUVEVSTiA9IC9eW2EtekEtWl9dW2EtekEtWjAtOV9dKiQvXG5cbi8qKlxuICogRG9lcyBhIGBAYC9gJGAtcHJlZml4ZWQgc3RyaW5nIGRlbm90ZSBhIEpTT05hdGEgcmVmZXJlbmNlIHJhdGhlciB0aGFuIGxpdGVyYWwgdGV4dD9cbiAqXG4gKiBQYXJzaW5nIGFsb25lIGlzIHRvbyB3ZWFrIGEgdGVzdCDigJQgYFwiJGEgOj0gMVwiYCBhbmQgYFwiJFwiYCBhcmUgYm90aCB2YWxpZCBKU09OYXRhLCBidXQgYXMgYSBiaW5kaW5nXG4gKiB2YWx1ZSB0aGV5IGluamVjdCBhbiBhc3NpZ25tZW50IGFuZCB0aGUgd2hvbGUgaW5wdXQgY29udGV4dCByZXNwZWN0aXZlbHkuIEEgcmVmZXJlbmNlIGlzIGEgYHBhdGhgXG4gKiAoYFwiQGN0eC5hLmJcImApLCBhIGBmdW5jdGlvbmAgY2FsbCAoYFwiJG5vdygpXCJgKSwgb3IgYSBwbGFpbiBuYW1lZCBgdmFyaWFibGVgIChgXCIkc29tZVZhclwiYCkuXG4gKlxuICogRXhjbHVkZWQsIGFuZCB0aGVyZWZvcmUgdHJlYXRlZCBhcyBsaXRlcmFsIHRleHQ6XG4gKiAtIGFueSBgYmluZGAsIGF0IHRoZSB0b3AgbGV2ZWwgb3IgbmVzdGVkIOKAlCBldmVyeSBiaW5kaW5nIHNoYXJlcyBvbmUgYCguLi4pYCBibG9jayBzY29wZSwgc28gYVxuICogICBgOj1gIGFueXdoZXJlIGluc2lkZSBhIHZhbHVlIHdvdWxkIHJlYXNzaWduIGEgc2libGluZyBiaW5kaW5nLlxuICogLSBhIHZhcmlhYmxlIHdob3NlIG5hbWUgaXMgbm90IGEgcGxhaW4gaWRlbnRpZmllci4gVGhlIHBhcnNlciBpcyBwZXJtaXNzaXZlIGhlcmU6IGBcIiRcImAgYW5kXG4gKiAgIGBcIiQkXCJgIHlpZWxkIGFuIGVtcHR5IG9yIGAkYCBuYW1lLCBgXCIkNVwiYCBhIGRpZ2l0LCBhbmQgYFwiJFxcXCJ4XFxcIlwiYCBhIG5hbWUgb2YgYFwieFwiYCB3aXRoIHRoZVxuICogICBxdW90ZXMga2VwdCDigJQgZWFjaCBwYXJzZXMgYW5kIGV2YWx1YXRlcyB0byBgdW5kZWZpbmVkYCBvciB0aGUgd2hvbGUgaW5wdXQgY29udGV4dC4gTWF0Y2hpbmdcbiAqICAge0BsaW5rIFZBUklBQkxFX05BTUVfUEFUVEVSTn0gYWRtaXRzIG9ubHkgcmVhbCBpZGVudGlmaWVycywgc28gdGhlIHJlc3Qgc3RheSBsaXRlcmFsIHRleHQuXG4gKiAtIGEgdmFyaWFibGUgY2FycnlpbmcgYSBwcmVkaWNhdGUsIHN1Y2ggYXMgYFwiJHhbMF1cImAuXG4gKi9cbmZ1bmN0aW9uIGlzUmVmZXJlbmNlRnJhZ21lbnQodHJpbW1lZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGFzdCA9IHBhcnNlSnNvbmF0YUFzdCh0cmltbWVkKVxuICBpZiAoYXN0ID09PSBudWxsIHx8IGNvbnRhaW5zQmluZChhc3QpKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBjb25zdCBhc3RUeXBlID0gZ2V0QXN0VHlwZShhc3QpXG4gIGlmIChhc3RUeXBlID09PSAncGF0aCcgfHwgYXN0VHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBpZiAoYXN0VHlwZSAhPT0gJ3ZhcmlhYmxlJykge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgY29uc3QgbmFtZSA9IGdldEFzdFN0cmluZyhhc3QsICd2YWx1ZScpXG4gIHJldHVybiBuYW1lICE9PSB1bmRlZmluZWQgJiYgVkFSSUFCTEVfTkFNRV9QQVRURVJOLnRlc3QobmFtZSkgJiYgYXN0LnByZWRpY2F0ZSA9PT0gdW5kZWZpbmVkXG59XG5cbi8qKlxuICogRG9lcyBhbiBBU1QgYXNzaWduIHRvIGEgdmFyaWFibGUgYW55d2hlcmUgd2l0aGluIGl0P1xuICpcbiAqIEEgYDo9YCBuZXN0ZWQgaW5zaWRlIGFuIG90aGVyd2lzZS12YWxpZCByZWZlcmVuY2Ug4oCUIGBcIiR0cmltKCRhIDo9IDEpXCJgLCBvciBhIHBhdGggcHJlZGljYXRlIHN1Y2hcbiAqIGFzIGBcIkBjdHguaXRlbXNbJGEgOj0gMV0ubmFtZVwiYCDigJQgcmVhc3NpZ25zIHdoYXRldmVyIHNpYmxpbmcgYmluZGluZyBzaGFyZXMgdGhhdCBuYW1lLCBzaW5jZVxuICoge0BsaW5rIEpzb25hdGFCdWlsZGVyQmFzZS5fYnVpbGR9IHNwbGljZXMgZXZlcnkgYmluZGluZyBpbnRvIG9uZSBibG9jayBzY29wZS5cbiAqL1xuZnVuY3Rpb24gY29udGFpbnNCaW5kKGFzdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBib29sZWFuIHtcbiAgbGV0IGZvdW5kID0gZmFsc2VcbiAgdmlzaXRBc3QoYXN0LCAobm9kZSkgPT4ge1xuICAgIGlmIChnZXRBc3RUeXBlKG5vZGUpID09PSAnYmluZCcpIHtcbiAgICAgIGZvdW5kID0gdHJ1ZVxuICAgIH1cbiAgfSlcbiAgcmV0dXJuIGZvdW5kXG59XG5cbi8qKlxuICogSXMgYSBxdW90ZS13cmFwcGVkIHN0cmluZyBhIHNpbmdsZSBzdHJpbmcgbGl0ZXJhbCwgcmF0aGVyIHRoYW4gYW4gZXhwcmVzc2lvbiB0aGF0IG1lcmVseSBzdGFydHNcbiAqIGFuZCBlbmRzIHdpdGggYSBxdW90ZT8gYCdcIkFCLTEyXCInYCBpczsgYCdcImFcIiAmIFwiYlwiJ2AgcGFyc2VzIGFzIGEgY29uY2F0ZW5hdGlvbiBhbmQgaXMgbm90LlxuICovXG5mdW5jdGlvbiBpc1NpbmdsZVN0cmluZ0xpdGVyYWwodHJpbW1lZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGFzdCA9IHBhcnNlSnNvbmF0YUFzdCh0cmltbWVkKVxuICByZXR1cm4gYXN0ICE9PSBudWxsICYmIGdldEFzdFR5cGUoYXN0KSA9PT0gJ3N0cmluZydcbn1cblxuLyoqXG4gKiBFbWl0IGEgc3RyaW5nIGJpbmRpbmcgdmFsdWUgYXMgSlNPTmF0YSBzb3VyY2UuXG4gKlxuICogQSBzdHJpbmcgaXMgZW1pdHRlZCB2ZXJiYXRpbSBvbmx5IHdoZW4gaXQgaXMgZ2VudWluZWx5IEpTT05hdGEgc291cmNlOiBhIGBAYC9gJGAtcHJlZml4ZWRcbiAqIHJlZmVyZW5jZSB0aGF0IHBhcnNlcywgb3IgYSBzaW5nbGUgcXVvdGVkIGxpdGVyYWwuIEFueXRoaW5nIGVsc2Ug4oCUIHByb3NlLCBhbiBlbXB0eSBzdHJpbmcsIGFcbiAqIHByaWNlIGxpa2UgYFwiJDVcImAsIGEgaGFuZGxlIGxpa2UgYFwiQGppZ3hcImAg4oCUIGlzIGxpdGVyYWwgdGV4dCBhbmQgaXMgSlNPTi1xdW90ZWQsIHNvIGl0IGNhblxuICogbmVpdGhlciBwcm9kdWNlIGFuIHVucGFyc2VhYmxlIGAkbmFtZSA6PSA8dmFsdWU+O2AgZGVjbGFyYXRpb24gbm9yIHNpbGVudGx5IGV2YWx1YXRlIHRvXG4gKiBzb21ldGhpbmcgb3RoZXIgdGhhbiBpdHNlbGYuXG4gKlxuICogQ2xhc3NpZmljYXRpb24gbmV2ZXIgZ3Vlc3NlcyBhYm91dCBhbiB1bnByZWZpeGVkLCB1bnF1b3RlZCBzdHJpbmc6IGEgYmFyZSB3b3JkIHN1Y2ggYXNcbiAqIGBNYW51ZmFjdHVyZXJgIHBhcnNlcyBhcyBhIHBhdGggbG9va3VwLCBzbyBwYXJzaW5nIGNhbm5vdCB0ZWxsIGl0IGFwYXJ0IGZyb20gbGl0ZXJhbCB0ZXh0LiBUaG9zZVxuICogYXJlIGFsd2F5cyBxdW90ZWQuXG4gKi9cbmZ1bmN0aW9uIGVtaXRTdHJpbmdCaW5kaW5nKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCB0cmltbWVkID0gdmFsdWUudHJpbSgpXG5cbiAgY29uc3QgaXNRdW90ZVdyYXBwZWQgPVxuICAgIHRyaW1tZWQubGVuZ3RoID49IDIgJiZcbiAgICAoKHRyaW1tZWQuc3RhcnRzV2l0aCgnXCInKSAmJiB0cmltbWVkLmVuZHNXaXRoKCdcIicpKSB8fFxuICAgICAgKHRyaW1tZWQuc3RhcnRzV2l0aChcIidcIikgJiYgdHJpbW1lZC5lbmRzV2l0aChcIidcIikpKVxuXG4gIC8vIFJhdyBicmFuY2hlcyBlbWl0IGB0cmltbWVkYCwgbmV2ZXIgYHZhbHVlYDogY2xhc3NpZmljYXRpb24gcGFyc2VzIGB0cmltbWVkYCwgYW5kXG4gIC8vIGBTdHJpbmcucHJvdG90eXBlLnRyaW0oKWAgc3RyaXBzIHRoZSB3aG9sZSBVbmljb2RlIGBXaGl0ZV9TcGFjZWAgc2V0IHdoaWxlIEpTT05hdGEncyBsZXhlclxuICAvLyBza2lwcyBvbmx5IEFTQ0lJIHdoaXRlc3BhY2UuIEVtaXR0aW5nIGB2YWx1ZWAgd291bGQgc3BsaWNlIGEgcGFkZGluZyBOQlNQIGJhY2sgaW4gYW5kIHR1cm5cbiAgLy8gYFwiaGVsbG9cImAgaW50byB0aGUgZmllbGQgbG9va3VwIGAgXCJoZWxsb1wiIGAsIHdoaWNoIGV2YWx1YXRlcyB0byBgdW5kZWZpbmVkYCBhbmQgc3RpbGwgcGFyc2VzLFxuICAvLyBzbyB2YWxpZGF0aW9uIGNhbm5vdCBzZWUgaXQuXG4gIGlmIChpc1F1b3RlV3JhcHBlZCkge1xuICAgIHJldHVybiBpc1NpbmdsZVN0cmluZ0xpdGVyYWwodHJpbW1lZCkgPyB0cmltbWVkIDogSlNPTi5zdHJpbmdpZnkodmFsdWUpXG4gIH1cblxuICBpZiAodHJpbW1lZC5zdGFydHNXaXRoKCdAJykgfHwgdHJpbW1lZC5zdGFydHNXaXRoKCckJykpIHtcbiAgICByZXR1cm4gaXNSZWZlcmVuY2VGcmFnbWVudCh0cmltbWVkKSA/IHRyaW1tZWQgOiBKU09OLnN0cmluZ2lmeSh2YWx1ZSlcbiAgfVxuXG4gIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSlcbn1cblxuLyoqXG4gKiBNaW5pbWFsLCBjb3JlLWxldmVsIEpTT05hdGEgdmFsaWRhdGlvbiBpc3N1ZSBlbWl0dGVkIGJ5IHtAbGluayBKc29uYXRhQnVpbGRlckJhc2V9LlxuICpcbiAqIERvbWFpbiBTREtzIGNhbiBtYXAgdGhpcyB0byByaWNoZXIgaXNzdWUgbW9kZWxzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEpzb25hdGFCdWlsZGVyVmFsaWRhdGlvbklzc3VlIHtcbiAgcmVhZG9ubHkgc2NvcGU6IHN0cmluZ1xuICByZWFkb25seSBzZXZlcml0eTogJ2Vycm9yJ1xuICByZWFkb25seSBjb250ZXh0UGF0aDogc3RyaW5nXG4gIHJlYWRvbmx5IG1lc3NhZ2U6IHN0cmluZ1xufVxuXG4vKipcbiAqIEJhc2UgdmFsaWRhdGlvbiByZXN1bHQgZnJvbSB7QGxpbmsgSnNvbmF0YUJ1aWxkZXJCYXNlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBKc29uYXRhQnVpbGRlclZhbGlkYXRpb25SZXN1bHQge1xuICByZWFkb25seSBpc1ZhbGlkOiBib29sZWFuXG4gIHJlYWRvbmx5IGlzc3VlczogcmVhZG9ubHkgSnNvbmF0YUJ1aWxkZXJWYWxpZGF0aW9uSXNzdWVbXVxufVxuXG4vKipcbiAqIFJldXNhYmxlIEpTT05hdGEgYnVpbGRlciBiYXNlIGZvciB2YXJpYWJsZS1pemVkIGV4cHJlc3Npb25zLlxuICpcbiAqIFVzZSB0aGlzIGNsYXNzIHdoZW4geW91IG5lZWQ6XG4gKiAtIGEgc3RhYmxlIGNvbnN0cnVjdG9yIGZvciBKU09OYXRhIGJvZHkgKyB2YXJpYWJsZXMsXG4gKiAtIHN5bnRheCArIHVuZGVjbGFyZWQgdmFyaWFibGUgY2hlY2tzLFxuICogLSBjb25zaXN0ZW50IG91dHB1dCBmb3JtYXR0aW5nIChgPS4uLmAgb3IgcmF3KS5cbiAqXG4gKiBFeHRlbmQgdGhpcyBpbiBkb21haW4gcGFja2FnZXMgKGUuZy4gZXhwZXJ0LXNkaykgdG8gYWRkIGRvbWFpbiBwb2xpY3kgY2hlY2tzLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgSnNvbmF0YUJ1aWxkZXJCYXNlPFxuICBUVmFsdWUgZXh0ZW5kcyBKc29uYXRhVmFyaWFibGVWYWx1ZSA9IEpzb25hdGFWYXJpYWJsZVZhbHVlLFxuPiB7XG4gIHByb3RlY3RlZCByZWFkb25seSB2YXJpYWJsZXM6IE1hcDxzdHJpbmcsIFRWYWx1ZT5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGV4cHJlc3Npb25Cb2R5OiBzdHJpbmdcblxuICAvKipcbiAgICogQHBhcmFtIGJvZHkgSlNPTmF0YSBib2R5IGV4cHJlc3Npb24uIE11c3Qgbm90IHN0YXJ0IHdpdGggYD1gLlxuICAgKiBAcGFyYW0gdmFyaWFibGVzIE9wdGlvbmFsIHZhcmlhYmxlcyB1c2VkIGluc2lkZSB0aGUgYm9keSBhcyBgJG5hbWVgLlxuICAgKi9cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKGJvZHk6IHN0cmluZywgdmFyaWFibGVzPzogUmVjb3JkPHN0cmluZywgVFZhbHVlPikge1xuICAgIGlmIChib2R5LnN0YXJ0c1dpdGgoJz0nKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgSlNPTmF0YSBleHByZXNzaW9uIGJvZHkgbXVzdCBub3Qgc3RhcnQgd2l0aCBcIj1cIi4gYCArXG4gICAgICAgICAgYFRoZSBcIj1cIiBwcmVmaXggaXMgaGFuZGxlZCBpbnRlcm5hbGx5IGJ5IHRoZSBidWlsZGVyLmAsXG4gICAgICApXG4gICAgfVxuXG4gICAgdGhpcy52YXJpYWJsZXMgPSBuZXcgTWFwKClcbiAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModmFyaWFibGVzID8/IHt9KSkge1xuICAgICAgaWYgKCFWQVJJQUJMRV9OQU1FX1BBVFRFUk4udGVzdChuYW1lKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEludmFsaWQgdmFyaWFibGUgbmFtZTogXCIke25hbWV9XCIuIGAgK1xuICAgICAgICAgICAgYFZhcmlhYmxlIG5hbWVzIG11c3Qgc3RhcnQgd2l0aCBhIGxldHRlciBvciB1bmRlcnNjb3JlLCBgICtcbiAgICAgICAgICAgIGBmb2xsb3dlZCBieSBsZXR0ZXJzLCBkaWdpdHMsIG9yIHVuZGVyc2NvcmVzLmAsXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUuc3RhcnRzV2l0aCgnPScpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgSW52YWxpZCB2YXJpYWJsZSB2YWx1ZSBmb3IgXCIke25hbWV9XCI6IFwiJHt2YWx1ZX1cIi4gYCArXG4gICAgICAgICAgICBgU3RyaW5nIHZhbHVlcyBtdXN0IG5vdCBzdGFydCB3aXRoIFwiPVwiLmAsXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgLy8gV2l0aG91dCB0aGVzZSwgYW4gb2JqZWN0IHdpdGggbm8gYHJlc29sdmVCaW5kaW5nYCByZWFjaGVzIGBTdHJpbmcodmFsdWUpYCBpbiBgX2J1aWxkYCBhbmRcbiAgICAgIC8vIGVtaXRzIHRoZSB1bnBhcnNlYWJsZSBgJG5hbWUgOj0gW29iamVjdCBPYmplY3RdO2AuXG4gICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBKc29uYXRhQnVpbGRlckJhc2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBJbnZhbGlkIHZhcmlhYmxlIHZhbHVlIGZvciBcIiR7bmFtZX1cIjogYSBidWlsZGVyIGNhbm5vdCBiZSBuZXN0ZWQgaW5zaWRlIGFub3RoZXIgYCArXG4gICAgICAgICAgICBgYnVpbGRlcidzIHZhcmlhYmxlcy4gSW5saW5lIGl0cyBib2R5IGFuZCBtZXJnZSBpdHMgdmFyaWFibGVzLCBvciBwYXNzIGEgZmllbGQgYCArXG4gICAgICAgICAgICBgcmVmZXJlbmNlIHN1Y2ggYXMgXFxgZmllbGQudmFsdWVSZWYoKVxcYC5gLFxuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmICFpc1Jlc29sdmFibGVCaW5kaW5nKHZhbHVlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEludmFsaWQgdmFyaWFibGUgdmFsdWUgZm9yIFwiJHtuYW1lfVwiOiBleHBlY3RlZCBhIHN0cmluZywgbnVtYmVyLCBib29sZWFuLCBudWxsLCBvciBhIGAgK1xuICAgICAgICAgICAgYFJlc29sdmFibGVCaW5kaW5nIChlLmcuIGEgZmllbGQgcmVmZXJlbmNlKSwgYnV0IHJlY2VpdmVkIGFuIG9iamVjdC5gLFxuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIC8vIGBUVmFsdWVgIGV4Y2x1ZGVzIHRoZXNlLCBidXQgYW4gYGFueWAtdHlwZWQgb3IgZGVzZXJpYWxpemVkIG1hcCByZWFjaGVzIGhlcmUgYW55d2F5LCBhbmRcbiAgICAgIC8vIGBTdHJpbmcodmFsdWUpYCB3b3VsZCBlbWl0IGAkbmFtZSA6PSB1bmRlZmluZWQ7YCDigJQgdmFsaWQgSlNPTmF0YSB0aGF0IGV2YWx1YXRlcyB0byBub3RoaW5nLlxuICAgICAgY29uc3QgdmFsdWVUeXBlID0gdHlwZW9mIHZhbHVlXG4gICAgICBpZiAodmFsdWVUeXBlID09PSAndW5kZWZpbmVkJyB8fCB2YWx1ZVR5cGUgPT09ICdmdW5jdGlvbicgfHwgdmFsdWVUeXBlID09PSAnc3ltYm9sJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEludmFsaWQgdmFyaWFibGUgdmFsdWUgZm9yIFwiJHtuYW1lfVwiOiBleHBlY3RlZCBhIHN0cmluZywgbnVtYmVyLCBib29sZWFuLCBudWxsLCBvciBhIGAgK1xuICAgICAgICAgICAgYFJlc29sdmFibGVCaW5kaW5nIChlLmcuIGEgZmllbGQgcmVmZXJlbmNlKSwgYnV0IHJlY2VpdmVkICR7dmFsdWVUeXBlfS5gLFxuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIHRoaXMudmFyaWFibGVzLnNldChuYW1lLCB2YWx1ZSlcbiAgICB9XG5cbiAgICB0aGlzLmV4cHJlc3Npb25Cb2R5ID0gYm9keVxuICB9XG5cbiAgLyoqXG4gICAqIEV4dHJhY3QgY2Fub25pY2FsIGBjdHguKmAgc2NvcGUgcmVmZXJlbmNlcyBmcm9tIGFyYml0cmFyeSBKU09OYXRhLWxpa2UgdGV4dC5cbiAgICovXG4gIHN0YXRpYyBleHRyYWN0U2NvcGVSZWZlcmVuY2VzKHRleHQ6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gZXh0cmFjdENhbm9uaWNhbFNjb3BlUmVmZXJlbmNlcyh0ZXh0KVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGAkdmFyYCByZWZlcmVuY2VzIGluIGV4cHJlc3Npb24gYm9keSBhcmUgZGVjbGFyZWQsIGxhbWJkYSBwYXJhbXMsIG9yIGxvY2FsIGFzc2lnbm1lbnRzLlxuICAgKi9cbiAgcHJvdGVjdGVkIHZhbGlkYXRlRGVjbGFyZWRWYXJpYWJsZXMoY29udGV4dFBhdGg6IHN0cmluZyk6IEpzb25hdGFCdWlsZGVyVmFsaWRhdGlvbklzc3VlW10ge1xuICAgIHJldHVybiB0aGlzLnZhbGlkYXRlRGVjbGFyZWRWYXJpYWJsZXNXaXRoQXN0KGNvbnRleHRQYXRoKVxuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZURlY2xhcmVkVmFyaWFibGVzV2l0aEFzdChjb250ZXh0UGF0aDogc3RyaW5nKTogSnNvbmF0YUJ1aWxkZXJWYWxpZGF0aW9uSXNzdWVbXSB7XG4gICAgY29uc3QgYXN0ID0gcGFyc2VKc29uYXRhQXN0KHRoaXMuZXhwcmVzc2lvbkJvZHkpXG4gICAgaWYgKGFzdCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAge1xuICAgICAgICAgIHNjb3BlOiB0aGlzLmV4cHJlc3Npb25Cb2R5LFxuICAgICAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgICAgIGNvbnRleHRQYXRoLFxuICAgICAgICAgIG1lc3NhZ2U6ICdVbmFibGUgdG8gcGFyc2UgSlNPTmF0YSBleHByZXNzaW9uIGZvciB2YXJpYWJsZSB2YWxpZGF0aW9uJyxcbiAgICAgICAgfSxcbiAgICAgIF1cbiAgICB9XG5cbiAgICBjb25zdCBkZWNsYXJlZCA9IG5ldyBTZXQ8c3RyaW5nPih0aGlzLnZhcmlhYmxlcy5rZXlzKCkpXG4gICAgY29uc3QgcmVmZXJlbmNlZCA9IG5ldyBTZXQ8c3RyaW5nPigpXG4gICAgdmlzaXRBc3QoYXN0LCAobm9kZSwgcGFyZW50LCBrZXlJblBhcmVudCkgPT4ge1xuICAgICAgY29uc3Qgbm9kZVR5cGUgPSBnZXRBc3RUeXBlKG5vZGUpXG5cbiAgICAgIGlmIChub2RlVHlwZSA9PT0gJ2xhbWJkYScgJiYgQXJyYXkuaXNBcnJheShub2RlLmFyZ3VtZW50cykpIHtcbiAgICAgICAgZm9yIChjb25zdCBhcmcgb2Ygbm9kZS5hcmd1bWVudHMpIHtcbiAgICAgICAgICBpZiAoaXNBc3ROb2RlKGFyZykgJiYgZ2V0QXN0VHlwZShhcmcpID09PSAndmFyaWFibGUnKSB7XG4gICAgICAgICAgICBjb25zdCB2YXJOYW1lID0gZ2V0QXN0U3RyaW5nKGFyZywgJ3ZhbHVlJylcbiAgICAgICAgICAgIGlmICh2YXJOYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgZGVjbGFyZWQuYWRkKHZhck5hbWUpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlVHlwZSA9PT0gJ2JpbmQnICYmIGlzQXN0Tm9kZShub2RlLmxocykgJiYgZ2V0QXN0VHlwZShub2RlLmxocykgPT09ICd2YXJpYWJsZScpIHtcbiAgICAgICAgY29uc3QgbGhzVmFyID0gZ2V0QXN0U3RyaW5nKG5vZGUubGhzLCAndmFsdWUnKVxuICAgICAgICBpZiAobGhzVmFyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBkZWNsYXJlZC5hZGQobGhzVmFyKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlVHlwZSA9PT0gJ3ZhcmlhYmxlJykge1xuICAgICAgICBjb25zdCB2YXJpYWJsZU5hbWUgPSBnZXRBc3RTdHJpbmcobm9kZSwgJ3ZhbHVlJylcbiAgICAgICAgaWYgKHZhcmlhYmxlTmFtZSA9PT0gdW5kZWZpbmVkKSByZXR1cm5cblxuICAgICAgICBjb25zdCBpc0NvbnRleHRSb290ID0gdmFyaWFibGVOYW1lID09PSAnJyB8fCB2YXJpYWJsZU5hbWUgPT09ICckJ1xuICAgICAgICBjb25zdCBpc0Z1bmN0aW9uUHJvY2VkdXJlID1cbiAgICAgICAgICBwYXJlbnQgIT09IG51bGwgJiYgZ2V0QXN0VHlwZShwYXJlbnQpID09PSAnZnVuY3Rpb24nICYmIGtleUluUGFyZW50ID09PSAncHJvY2VkdXJlJ1xuICAgICAgICBpZiAoIWlzQ29udGV4dFJvb3QgJiYgIWlzRnVuY3Rpb25Qcm9jZWR1cmUpIHtcbiAgICAgICAgICByZWZlcmVuY2VkLmFkZCh2YXJpYWJsZU5hbWUpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuXG4gICAgY29uc3QgdW5kZWNsYXJlZCA9IEFycmF5LmZyb20ocmVmZXJlbmNlZCkuZmlsdGVyKChuYW1lKSA9PiAhZGVjbGFyZWQuaGFzKG5hbWUpKVxuICAgIGlmICh1bmRlY2xhcmVkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtdXG4gICAgfVxuXG4gICAgY29uc3QgdmFyaWFibGVMaXN0ID0gdW5kZWNsYXJlZC5qb2luKCcsICcpXG4gICAgY29uc3QgbWVzc2FnZSA9XG4gICAgICBgSlNPTmF0YSBleHByZXNzaW9uIHJlZmVyZW5jZXMgdW5kZWNsYXJlZCB2YXJpYWJsZXM6ICR7dmFyaWFibGVMaXN0fS4gYCArXG4gICAgICBgRGVjbGFyZSB0aGVtIGluIHRoZSB2YXJpYWJsZXMgbWFwIHBhc3NlZCB0byB0aGUgYnVpbGRlciBjb25zdHJ1Y3Rvci5gXG5cbiAgICByZXR1cm4gdW5kZWNsYXJlZC5tYXAoKG5hbWUpID0+ICh7XG4gICAgICBzY29wZTogYCQke25hbWV9YCxcbiAgICAgIHNldmVyaXR5OiAnZXJyb3InIGFzIGNvbnN0LFxuICAgICAgY29udGV4dFBhdGgsXG4gICAgICBtZXNzYWdlLFxuICAgIH0pKVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIEpTT05hdGEgc3ludGF4IG9mIHRoZSBmdWxsIGJ1aWx0IGV4cHJlc3Npb24sIGJpbmRpbmdzIGluY2x1ZGVkLlxuICAgKlxuICAgKiBQYXJzZXMgdGhlIHNhbWUgc3RyaW5nIHtAbGluayBKc29uYXRhQnVpbGRlckJhc2UuX2J1aWxkfSBlbWl0cywgc28gYSBtYWxmb3JtZWRcbiAgICogYCRuYW1lIDo9IDx2YWx1ZT47YCBkZWNsYXJhdGlvbiBpcyBjYXVnaHQgaGVyZSByYXRoZXIgdGhhbiBhdCBydW50aW1lIG9uIGRldmljZS5cbiAgICpcbiAgICogQHBhcmFtIGNvbnRleHRQYXRoIC0gQ29udGV4dCBwYXRoIHJlcG9ydGVkIG9uIGFueSBpc3N1ZS5cbiAgICogQHBhcmFtIGN0eCAtIEJ1aWxkLXRpbWUgY29uc3VtcHRpb24gY29udGV4dCB1c2VkIHRvIHJlc29sdmUge0BsaW5rIFJlc29sdmFibGVCaW5kaW5nfSB2YWx1ZXMuXG4gICAqL1xuICBwcm90ZWN0ZWQgdmFsaWRhdGVTeW50YXgoXG4gICAgY29udGV4dFBhdGg6IHN0cmluZyxcbiAgICBjdHg/OiBKc29uYXRhUmVzb2x1dGlvbkNvbnRleHQsXG4gICk6IEpzb25hdGFCdWlsZGVyVmFsaWRhdGlvbklzc3VlW10ge1xuICAgIGNvbnN0IGJ1aWx0ID0gdGhpcy5fYnVpbGQoeyBzaG91bGRSZXR1cm5SYXdFeHByZXNzaW9uOiB0cnVlLCBjdHggfSlcbiAgICBjb25zdCBzeW50YXhWYWxpZGF0aW9uID0gdmFsaWRhdGVTeW50YXgodHJhbnNmb3JtRm9yVmFsaWRhdGlvbihidWlsdCkpXG5cbiAgICBpZiAoIXN5bnRheFZhbGlkYXRpb24uaXNWYWxpZCAmJiBzeW50YXhWYWxpZGF0aW9uLmVycm9yKSB7XG4gICAgICByZXR1cm4gW1xuICAgICAgICB7XG4gICAgICAgICAgc2NvcGU6IHRoaXMuZXhwcmVzc2lvbkJvZHksXG4gICAgICAgICAgc2V2ZXJpdHk6ICdlcnJvcicsXG4gICAgICAgICAgY29udGV4dFBhdGgsXG4gICAgICAgICAgbWVzc2FnZTogc3ludGF4VmFsaWRhdGlvbi5lcnJvcixcbiAgICAgICAgfSxcbiAgICAgIF1cbiAgICB9XG4gICAgcmV0dXJuIFtdXG4gIH1cblxuICAvKipcbiAgICogUnVuIGJhc2UgdmFsaWRhdGlvbiAoc3ludGF4IG9mIHRoZSBmdWxsIGJ1aWx0IGV4cHJlc3Npb24gKyBkZWNsYXJlZCB2YXJpYWJsZXMpLlxuICAgKiBTdWJjbGFzc2VzIHNob3VsZCBjYWxsIHRoaXMgYW5kIHRoZW4gYXBwZW5kIGRvbWFpbi1zcGVjaWZpYyBjaGVja3MuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zLmNvbnRleHRQYXRoIC0gQ29udGV4dCBwYXRoIHJlcG9ydGVkIG9uIGFueSBpc3N1ZS5cbiAgICogQHBhcmFtIG9wdGlvbnMuY3R4IC0gQnVpbGQtdGltZSBjb25zdW1wdGlvbiBjb250ZXh0LCBwYXNzZWQgdGhyb3VnaCB0byBgX2J1aWxkYCBzbyBiaW5kaW5nc1xuICAgKiAgIGFyZSB2YWxpZGF0ZWQgZXhhY3RseSBhcyB0aGV5IHdpbGwgYmUgZW1pdHRlZC5cbiAgICovXG4gIHByb3RlY3RlZCBfdmFsaWRhdGVCYXNlKG9wdGlvbnM/OiB7XG4gICAgY29udGV4dFBhdGg/OiBzdHJpbmdcbiAgICBjdHg/OiBKc29uYXRhUmVzb2x1dGlvbkNvbnRleHRcbiAgfSk6IEpzb25hdGFCdWlsZGVyVmFsaWRhdGlvblJlc3VsdCB7XG4gICAgY29uc3QgY29udGV4dFBhdGggPSBvcHRpb25zPy5jb250ZXh0UGF0aCA/PyAnJ1xuICAgIGNvbnN0IGlzc3VlczogSnNvbmF0YUJ1aWxkZXJWYWxpZGF0aW9uSXNzdWVbXSA9IFtdXG5cbiAgICBpZiAoIXRoaXMuZXhwcmVzc2lvbkJvZHkpIHtcbiAgICAgIHJldHVybiB7IGlzVmFsaWQ6IHRydWUsIGlzc3VlczogW10gfVxuICAgIH1cblxuICAgIGlzc3Vlcy5wdXNoKC4uLnRoaXMudmFsaWRhdGVTeW50YXgoY29udGV4dFBhdGgsIG9wdGlvbnM/LmN0eCkpXG4gICAgaXNzdWVzLnB1c2goLi4udGhpcy52YWxpZGF0ZURlY2xhcmVkVmFyaWFibGVzKGNvbnRleHRQYXRoKSlcblxuICAgIHJldHVybiB7IGlzVmFsaWQ6IGlzc3Vlcy5sZW5ndGggPT09IDAsIGlzc3VlcyB9XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgZmluYWwgZXhwcmVzc2lvbiBzdHJpbmcuXG4gICAqXG4gICAqIFJlc29sdmFibGUgYmluZGluZ3MgYXJlIHJlc29sdmVkIGFnYWluc3QgYGN0eGAgKG9yIHtAbGluayBSRUNPUkRfREFUQV9DT05URVhUfSB3aGVuIG9taXR0ZWQpO1xuICAgKiBgbnVsbGAgYW5kIHNjYWxhciBiaW5kaW5ncyBhcmUgZW1pdHRlZCB2ZXJiYXRpbS5cbiAgICpcbiAgICogQHBhcmFtIG9wdGlvbnMuc2hvdWxkUmV0dXJuUmF3RXhwcmVzc2lvbiAtIFJldHVybiBgKCR7Ym9keX0pYCBpbnN0ZWFkIG9mIGA9KCR7Ym9keX0pYC5cbiAgICogQHBhcmFtIG9wdGlvbnMuY3R4IC0gQnVpbGQtdGltZSBjb25zdW1wdGlvbiBjb250ZXh0IHVzZWQgdG8gcmVzb2x2ZSB7QGxpbmsgUmVzb2x2YWJsZUJpbmRpbmd9IHZhbHVlcy5cbiAgICogQHJldHVybnMgYD0oJHtib2R5fSlgIGJ5IGRlZmF1bHQsIG9yIGAoJHtib2R5fSlgIHdoZW4gYHNob3VsZFJldHVyblJhd0V4cHJlc3Npb25gIGlzIHRydWUuXG4gICAqL1xuICBfYnVpbGQob3B0aW9uczogeyBzaG91bGRSZXR1cm5SYXdFeHByZXNzaW9uOiBib29sZWFuOyBjdHg/OiBKc29uYXRhUmVzb2x1dGlvbkNvbnRleHQgfSk6IHN0cmluZyB7XG4gICAgY29uc3QgeyBzaG91bGRSZXR1cm5SYXdFeHByZXNzaW9uLCBjdHggfSA9IG9wdGlvbnNcbiAgICBsZXQganNvbmF0YSA9ICcnXG5cbiAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgdGhpcy52YXJpYWJsZXMpIHtcbiAgICAgIGNvbnN0IGVtaXR0ZWQgPSBpc1Jlc29sdmFibGVCaW5kaW5nKHZhbHVlKVxuICAgICAgICA/IHZhbHVlLnJlc29sdmVCaW5kaW5nKGN0eCA/PyBSRUNPUkRfREFUQV9DT05URVhUKVxuICAgICAgICA6IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZydcbiAgICAgICAgICA/IGVtaXRTdHJpbmdCaW5kaW5nKHZhbHVlKVxuICAgICAgICAgIDogU3RyaW5nKHZhbHVlKVxuICAgICAganNvbmF0YSArPSBgJCR7bmFtZX0gOj0gJHtlbWl0dGVkfTtcXG5gXG4gICAgfVxuXG4gICAganNvbmF0YSArPSB0aGlzLmV4cHJlc3Npb25Cb2R5XG4gICAgcmV0dXJuIHNob3VsZFJldHVyblJhd0V4cHJlc3Npb24gPyBgKCR7anNvbmF0YX0pYCA6IGA9KCR7anNvbmF0YX0pYFxuICB9XG59XG4iXX0=
|