occam-nominal 1.0.569 → 1.0.573
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/lib/context/cladic.js +85 -3
- package/lib/context/file/nominal.js +7 -1
- package/lib/context/metexic.js +9 -1
- package/lib/context/mnemic.js +98 -12
- package/lib/context.js +27 -1
- package/lib/element/assertion/type.js +7 -3
- package/lib/element/combinator.js +7 -3
- package/lib/element/constraint.js +7 -3
- package/lib/element/constructor.js +8 -4
- package/lib/element/fact/premise.js +7 -3
- package/lib/element/fact/step.js +3 -3
- package/lib/element/fact/supposition.js +7 -3
- package/lib/element/fact.js +6 -6
- package/lib/element/generator.js +8 -4
- package/lib/element/hypothesis.js +10 -3
- package/lib/element/metavariable.js +25 -4
- package/lib/element/parameter.js +37 -3
- package/lib/element/procedureCall.js +76 -35
- package/lib/element/property.js +8 -4
- package/lib/element/statement.js +10 -3
- package/lib/element/substitution.js +2 -7
- package/lib/element/term.js +2 -3
- package/lib/example/nominal/bnf.js +2 -4
- package/lib/node/assertion/type.js +5 -1
- package/lib/node/metavariable.js +9 -1
- package/lib/node/procedureCall.js +16 -8
- package/lib/nonTerminalNodeMap.js +1 -3
- package/lib/preamble.js +1 -2
- package/lib/process/instantiate.js +7 -7
- package/lib/ruleNames.js +1 -5
- package/lib/utilities/element.js +16 -32
- package/lib/utilities/json.js +45 -1
- package/lib/utilities/string.js +7 -7
- package/package.json +5 -5
- package/src/context/cladic.js +137 -4
- package/src/context/file/nominal.js +8 -0
- package/src/context/metexic.js +12 -0
- package/src/context/mnemic.js +186 -39
- package/src/context.js +45 -1
- package/src/element/assertion/type.js +9 -2
- package/src/element/combinator.js +9 -1
- package/src/element/constraint.js +8 -1
- package/src/element/constructor.js +10 -2
- package/src/element/fact/premise.js +10 -3
- package/src/element/fact/step.js +2 -2
- package/src/element/fact/supposition.js +11 -4
- package/src/element/fact.js +6 -6
- package/src/element/generator.js +10 -2
- package/src/element/hypothesis.js +14 -1
- package/src/element/metavariable.js +35 -4
- package/src/element/parameter.js +63 -2
- package/src/element/procedureCall.js +113 -44
- package/src/element/property.js +10 -2
- package/src/element/statement.js +12 -1
- package/src/element/substitution.js +1 -10
- package/src/element/term.js +3 -4
- package/src/example/nominal/bnf.js +1 -3
- package/src/node/assertion/type.js +7 -0
- package/src/node/metavariable.js +12 -0
- package/src/node/procedureCall.js +23 -12
- package/src/nonTerminalNodeMap.js +0 -2
- package/src/preamble.js +0 -1
- package/src/process/instantiate.js +4 -4
- package/src/ruleNames.js +0 -1
- package/src/utilities/element.js +21 -42
- package/src/utilities/json.js +58 -6
- package/src/utilities/string.js +7 -8
- package/lib/element/procedureReference.js +0 -58
- package/lib/node/procedureReference.js +0 -30
- package/src/element/procedureReference.js +0 -76
- package/src/node/procedureReference.js +0 -26
package/lib/context/cladic.js
CHANGED
|
@@ -17,7 +17,7 @@ function _interop_require_default(obj) {
|
|
|
17
17
|
}
|
|
18
18
|
const { push, extract } = _necessary.arrayUtilities;
|
|
19
19
|
class CladicContext extends _context.default {
|
|
20
|
-
constructor(context, terms, links, frames, equalities, assertions, statements, assumptions, metavariables){
|
|
20
|
+
constructor(context, terms, links, frames, equalities, assertions, statements, parameters, assumptions, metavariables, procedureCalls){
|
|
21
21
|
super(context);
|
|
22
22
|
this.terms = terms;
|
|
23
23
|
this.links = links;
|
|
@@ -25,8 +25,10 @@ class CladicContext extends _context.default {
|
|
|
25
25
|
this.equalities = equalities;
|
|
26
26
|
this.assertions = assertions;
|
|
27
27
|
this.statements = statements;
|
|
28
|
+
this.parameters = parameters;
|
|
28
29
|
this.assumptions = assumptions;
|
|
29
30
|
this.metavariables = metavariables;
|
|
31
|
+
this.procedureCalls = procedureCalls;
|
|
30
32
|
}
|
|
31
33
|
getTerms(terms = []) {
|
|
32
34
|
const context = this.getContext();
|
|
@@ -58,6 +60,12 @@ class CladicContext extends _context.default {
|
|
|
58
60
|
context.getStatements(statements);
|
|
59
61
|
return statements;
|
|
60
62
|
}
|
|
63
|
+
getParameters(parameters = []) {
|
|
64
|
+
const context = this.getContext();
|
|
65
|
+
push(parameters, this.parameters);
|
|
66
|
+
context.getParameters(parameters);
|
|
67
|
+
return parameters;
|
|
68
|
+
}
|
|
61
69
|
getAssertions(assertions = []) {
|
|
62
70
|
const context = this.getContext();
|
|
63
71
|
push(assertions, this.assertions);
|
|
@@ -76,6 +84,12 @@ class CladicContext extends _context.default {
|
|
|
76
84
|
context.getMetavariables(metavariables);
|
|
77
85
|
return metavariables;
|
|
78
86
|
}
|
|
87
|
+
getProcedureCalls(procedureCalls = []) {
|
|
88
|
+
const context = this.getContext();
|
|
89
|
+
push(procedureCalls, this.procedureCalls);
|
|
90
|
+
context.getProcedureCalls(procedureCalls);
|
|
91
|
+
return procedureCalls;
|
|
92
|
+
}
|
|
79
93
|
addTerm(term) {
|
|
80
94
|
const context = this, termString = term.getString();
|
|
81
95
|
context.trace(`Adding the '${termString}' term to the cladic context...`);
|
|
@@ -166,6 +180,21 @@ class CladicContext extends _context.default {
|
|
|
166
180
|
this.statements.push(statement);
|
|
167
181
|
context.debug(`...added the '${statementString}' statement to the cladic context.`);
|
|
168
182
|
}
|
|
183
|
+
addParameter(paramter) {
|
|
184
|
+
const context = this, paramterString = paramter.getString();
|
|
185
|
+
context.trace(`Adding the '${paramterString}' paramter to the cladic context...`);
|
|
186
|
+
const paramterA = paramter; ///
|
|
187
|
+
extract(this.paramters, (paramter)=>{
|
|
188
|
+
const paramterB = paramter, paramterAEqualToParameterB = paramterA.isEqualTo(paramterB);
|
|
189
|
+
if (paramterAEqualToParameterB) {
|
|
190
|
+
const paramterString = paramter.getString();
|
|
191
|
+
context.trace(`Removed the existing '${paramterString}' paramter from the cladic context...`);
|
|
192
|
+
return true;
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
this.paramters.push(paramter);
|
|
196
|
+
context.debug(`...added the '${paramterString}' paramter to the cladic context.`);
|
|
197
|
+
}
|
|
169
198
|
addAssumption(assumption) {
|
|
170
199
|
const context = this, assumptionString = assumption.getString();
|
|
171
200
|
context.trace(`Adding the '${assumptionString}' assumption to the cladic context...`);
|
|
@@ -200,6 +229,21 @@ class CladicContext extends _context.default {
|
|
|
200
229
|
const context = this.getContext();
|
|
201
230
|
context.addSubstitution(substitution);
|
|
202
231
|
}
|
|
232
|
+
addProcedureCall(procedureCall) {
|
|
233
|
+
const context = this, procedureCallString = procedureCall.getString();
|
|
234
|
+
context.trace(`Adding the '${procedureCallString}' procedure call to the cladic context...`);
|
|
235
|
+
const procedureCallA = procedureCall; ///
|
|
236
|
+
extract(this.procedureCalls, (procedureCall)=>{
|
|
237
|
+
const procedureCallB = procedureCall, procedureCallAEqualToProcedureallB = procedureCallA.isEqualTo(procedureCallB);
|
|
238
|
+
if (procedureCallAEqualToProcedureallB) {
|
|
239
|
+
const procedureCallString = procedureCall.getString();
|
|
240
|
+
context.trace(`Removed the existing '${procedureCallString}' procedure call from the cladic context...`);
|
|
241
|
+
return true;
|
|
242
|
+
}
|
|
243
|
+
});
|
|
244
|
+
this.procedureCalls.push(procedureCall);
|
|
245
|
+
context.debug(`...added the '${procedureCallString}' procedure call to the cladic context.`);
|
|
246
|
+
}
|
|
203
247
|
addAssignment(assignment) {
|
|
204
248
|
const context = this.getContext();
|
|
205
249
|
context.addAssignment(assignment);
|
|
@@ -234,6 +278,11 @@ class CladicContext extends _context.default {
|
|
|
234
278
|
this.addStatement(statement);
|
|
235
279
|
});
|
|
236
280
|
}
|
|
281
|
+
addParameters(parameters) {
|
|
282
|
+
parameters.forEach((parameter)=>{
|
|
283
|
+
this.addParameter(parameter);
|
|
284
|
+
});
|
|
285
|
+
}
|
|
237
286
|
addAssumptions(assumptions) {
|
|
238
287
|
assumptions.forEach((assumption)=>{
|
|
239
288
|
this.addAssumption(assumption);
|
|
@@ -244,6 +293,11 @@ class CladicContext extends _context.default {
|
|
|
244
293
|
this.addMetavariable(metavariable);
|
|
245
294
|
});
|
|
246
295
|
}
|
|
296
|
+
addProcedureCalls(procedureCalls) {
|
|
297
|
+
procedureCalls.forEach((procedureCall)=>{
|
|
298
|
+
this.addProcedureCall(procedureCall);
|
|
299
|
+
});
|
|
300
|
+
}
|
|
247
301
|
findTermByTermNode(termNode) {
|
|
248
302
|
const terms = this.getTerms(), term = terms.find((term)=>{
|
|
249
303
|
const termNodeMatches = term.matchTermNode(termNode);
|
|
@@ -298,6 +352,15 @@ class CladicContext extends _context.default {
|
|
|
298
352
|
}) || null;
|
|
299
353
|
return statement;
|
|
300
354
|
}
|
|
355
|
+
findParameterByParameterNode(parameterNode) {
|
|
356
|
+
const parameters = this.getParameters(), parameter = parameters.find((parameter)=>{
|
|
357
|
+
const parameterNodeMatches = parameter.matchParameterNode(parameterNode);
|
|
358
|
+
if (parameterNodeMatches) {
|
|
359
|
+
return true;
|
|
360
|
+
}
|
|
361
|
+
}) || null;
|
|
362
|
+
return parameter;
|
|
363
|
+
}
|
|
301
364
|
findAssumptionByAssumptionNode(assumptionNode) {
|
|
302
365
|
const assumptions = this.getAssumptions(), assumption = assumptions.find((assumption)=>{
|
|
303
366
|
const assumptionNodeMatches = assumption.matchAssumptionNode(assumptionNode);
|
|
@@ -316,6 +379,15 @@ class CladicContext extends _context.default {
|
|
|
316
379
|
}) || null;
|
|
317
380
|
return metavariable;
|
|
318
381
|
}
|
|
382
|
+
findProcedureCallByProcedureCallNode(procedureCallNode) {
|
|
383
|
+
const procedureCalls = this.getProcedureCalls(), procedureCall = procedureCalls.find((procedureCall)=>{
|
|
384
|
+
const procedureCallNodeMatches = procedureCall.matchProcedureCallNode(procedureCallNode);
|
|
385
|
+
if (procedureCallNodeMatches) {
|
|
386
|
+
return true;
|
|
387
|
+
}
|
|
388
|
+
}) || null;
|
|
389
|
+
return procedureCall;
|
|
390
|
+
}
|
|
319
391
|
isTermPresentByTermNode(termNode) {
|
|
320
392
|
const term = this.findTermByTermNode(termNode), termPresent = term !== null;
|
|
321
393
|
return termPresent;
|
|
@@ -340,6 +412,10 @@ class CladicContext extends _context.default {
|
|
|
340
412
|
const statement = this.findStatementByStatementNode(statementNode), statementPresent = statement !== null;
|
|
341
413
|
return statementPresent;
|
|
342
414
|
}
|
|
415
|
+
isParameterPresentByParameterNode(parameterNode) {
|
|
416
|
+
const parameter = this.findParameterByParameterNode(parameterNode), parameterPresent = parameter !== null;
|
|
417
|
+
return parameterPresent;
|
|
418
|
+
}
|
|
343
419
|
isAssumptionPresentByAssumptionNode(assumptionNode) {
|
|
344
420
|
const assumption = this.findAssumptionByAssumptionNode(assumptionNode), assumptionPresent = assumption !== null;
|
|
345
421
|
return assumptionPresent;
|
|
@@ -348,6 +424,10 @@ class CladicContext extends _context.default {
|
|
|
348
424
|
const metavariablen = this.findMetavariableByMetavariableNode(metavariableNode), metavariablenPresent = metavariablen !== null;
|
|
349
425
|
return metavariablenPresent;
|
|
350
426
|
}
|
|
427
|
+
isProcedureCallPresentByProcedureCallNode(procedureCallNode) {
|
|
428
|
+
const procedureCall = this.findProcedureCallByProcedureCallNode(procedureCallNode), procedureCallPresent = procedureCall !== null;
|
|
429
|
+
return procedureCallPresent;
|
|
430
|
+
}
|
|
351
431
|
merge(context) {
|
|
352
432
|
context.debug(`Merging the cladic context`);
|
|
353
433
|
context.addTerms(this.terms);
|
|
@@ -356,13 +436,15 @@ class CladicContext extends _context.default {
|
|
|
356
436
|
context.addEqualities(this.equalities);
|
|
357
437
|
context.addAssertions(this.assertions);
|
|
358
438
|
context.addStatements(this.statements);
|
|
439
|
+
context.addParameters(this.parameters);
|
|
359
440
|
context.addAssumptions(this.assumptions);
|
|
360
441
|
context.addMetavariables(this.metavariables);
|
|
442
|
+
context.addProcedureCalls(this.procedureCalls);
|
|
361
443
|
}
|
|
362
444
|
static fromNothing(context) {
|
|
363
|
-
const terms = [], links = [], frames = [], equalities = [], statements = [], assertions = [], assumptions = [], metavariables = [], cladicContext = new CladicContext(context, terms, links, frames, equalities, assertions, statements, assumptions, metavariables);
|
|
445
|
+
const terms = [], links = [], frames = [], equalities = [], statements = [], parameters = [], assertions = [], assumptions = [], metavariables = [], procedureCalls = [], cladicContext = new CladicContext(context, terms, links, frames, equalities, assertions, statements, parameters, assumptions, metavariables, procedureCalls);
|
|
364
446
|
return cladicContext;
|
|
365
447
|
}
|
|
366
448
|
}
|
|
367
449
|
|
|
368
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb250ZXh0L2NsYWRpYy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IHsgYXJyYXlVdGlsaXRpZXMgfSBmcm9tIFwibmVjZXNzYXJ5XCI7XG5cbmltcG9ydCBDb250ZXh0IGZyb20gXCIuLi9jb250ZXh0XCI7XG5cbmNvbnN0IHsgcHVzaCwgZXh0cmFjdCB9ID0gYXJyYXlVdGlsaXRpZXM7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENsYWRpY0NvbnRleHQgZXh0ZW5kcyBDb250ZXh0IHtcbiAgY29uc3RydWN0b3IoY29udGV4dCwgdGVybXMsIGxpbmtzLCBmcmFtZXMsIGVxdWFsaXRpZXMsIGFzc2VydGlvbnMsIHN0YXRlbWVudHMsIGFzc3VtcHRpb25zLCBtZXRhdmFyaWFibGVzKSB7XG4gICAgc3VwZXIoY29udGV4dCk7XG5cbiAgICB0aGlzLnRlcm1zID0gdGVybXM7XG4gICAgdGhpcy5saW5rcyA9IGxpbmtzO1xuICAgIHRoaXMuZnJhbWVzID0gZnJhbWVzO1xuICAgIHRoaXMuZXF1YWxpdGllcyA9IGVxdWFsaXRpZXM7XG4gICAgdGhpcy5hc3NlcnRpb25zID0gYXNzZXJ0aW9ucztcbiAgICB0aGlzLnN0YXRlbWVudHMgPSBzdGF0ZW1lbnRzO1xuICAgIHRoaXMuYXNzdW1wdGlvbnMgPSBhc3N1bXB0aW9ucztcbiAgICB0aGlzLm1ldGF2YXJpYWJsZXMgPSBtZXRhdmFyaWFibGVzO1xuICB9XG5cbiAgZ2V0VGVybXModGVybXMgPSBbXSkge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmdldENvbnRleHQoKTtcblxuICAgIHB1c2godGVybXMsIHRoaXMudGVybXMpO1xuXG4gICAgY29udGV4dC5nZXRUZXJtcyh0ZXJtcyk7XG5cbiAgICByZXR1cm4gdGVybXM7XG4gIH1cblxuICBnZXRMaW5rcyhsaW5rcyA9IFtdKSB7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMuZ2V0Q29udGV4dCgpO1xuXG4gICAgcHVzaChsaW5rcywgdGhpcy5saW5rcyk7XG5cbiAgICBjb250ZXh0LmdldExpbmtzKGxpbmtzKTtcblxuICAgIHJldHVybiBsaW5rcztcbiAgfVxuXG4gIGdldEZyYW1lcyhmcmFtZXMgPSBbXSkge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmdldENvbnRleHQoKTtcblxuICAgIHB1c2goZnJhbWVzLCB0aGlzLmZyYW1lcyk7XG5cbiAgICBjb250ZXh0LmdldEZyYW1lcyhmcmFtZXMpO1xuXG4gICAgcmV0dXJuIGZyYW1lcztcbiAgfVxuXG4gIGdldEVxdWFsaXRpZXMoZXF1YWxpdGllcyA9IFtdKSB7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMuZ2V0Q29udGV4dCgpO1xuXG4gICAgcHVzaChlcXVhbGl0aWVzLCB0aGlzLmVxdWFsaXRpZXMpO1xuXG4gICAgY29udGV4dC5nZXRFcXVhbGl0aWVzKGVxdWFsaXRpZXMpO1xuXG4gICAgcmV0dXJuIGVxdWFsaXRpZXM7XG4gIH1cblxuICBnZXRTdGF0ZW1lbnRzKHN0YXRlbWVudHMgPSBbXSkge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmdldENvbnRleHQoKTtcblxuICAgIHB1c2goc3RhdGVtZW50cywgdGhpcy5zdGF0ZW1lbnRzKTtcblxuICAgIGNvbnRleHQuZ2V0U3RhdGVtZW50cyhzdGF0ZW1lbnRzKTtcblxuICAgIHJldHVybiBzdGF0ZW1lbnRzO1xuICB9XG5cbiAgZ2V0QXNzZXJ0aW9ucyhhc3NlcnRpb25zID0gW10pIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5nZXRDb250ZXh0KCk7XG5cbiAgICBwdXNoKGFzc2VydGlvbnMsIHRoaXMuYXNzZXJ0aW9ucyk7XG5cbiAgICBjb250ZXh0LmdldEFzc2VydGlvbnMoYXNzZXJ0aW9ucyk7XG5cbiAgICByZXR1cm4gYXNzZXJ0aW9ucztcbiAgfVxuXG4gIGdldEFzc3VtcHRpb25zKGFzc3VtcHRpb25zID0gW10pIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5nZXRDb250ZXh0KCk7XG5cbiAgICBwdXNoKGFzc3VtcHRpb25zLCB0aGlzLmFzc3VtcHRpb25zKTtcblxuICAgIGNvbnRleHQuZ2V0QXNzdW1wdGlvbnMoYXNzdW1wdGlvbnMpO1xuXG4gICAgcmV0dXJuIGFzc3VtcHRpb25zO1xuICB9XG5cbiAgZ2V0TWV0YXZhcmlhYmxlcyhtZXRhdmFyaWFibGVzID0gW10pIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5nZXRDb250ZXh0KCk7XG5cbiAgICBwdXNoKG1ldGF2YXJpYWJsZXMsIHRoaXMubWV0YXZhcmlhYmxlcyk7XG5cbiAgICBjb250ZXh0LmdldE1ldGF2YXJpYWJsZXMobWV0YXZhcmlhYmxlcyk7XG5cbiAgICByZXR1cm4gbWV0YXZhcmlhYmxlcztcbiAgfVxuXG4gIGFkZFRlcm0odGVybSkge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLCAvLy9cbiAgICAgICAgICB0ZXJtU3RyaW5nID0gdGVybS5nZXRTdHJpbmcoKTtcblxuICAgIGNvbnRleHQudHJhY2UoYEFkZGluZyB0aGUgJyR7dGVybVN0cmluZ30nIHRlcm0gdG8gdGhlIGNsYWRpYyBjb250ZXh0Li4uYCk7XG5cbiAgICBjb25zdCB0ZXJtQSA9IHRlcm07IC8vL1xuXG4gICAgZXh0cmFjdCh0aGlzLnRlcm1zLCAodGVybSkgPT4ge1xuICAgICAgY29uc3QgdGVybUIgPSB0ZXJtLCAvLy9cbiAgICAgICAgICAgIHRlcm1BRXF1YWxUb1Rlcm1CID0gdGVybUEuaXNFcXVhbFRvKHRlcm1CKTtcblxuICAgICAgaWYgKHRlcm1BRXF1YWxUb1Rlcm1CKSB7XG4gICAgICAgIGNvbnN0IHRlcm1TdHJpbmcgPSB0ZXJtLmdldFN0cmluZygpO1xuXG4gICAgICAgIGNvbnRleHQudHJhY2UoYFJlbW92ZWQgdGhlIGV4aXN0aW5nICcke3Rlcm1TdHJpbmd9JyB0ZXJtIGZyb20gdGhlIGNsYWRpYyBjb250ZXh0Li4uYCk7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLnRlcm1zLnB1c2godGVybSk7XG5cbiAgICBjb250ZXh0LmRlYnVnKGAuLi5hZGRlZCB0aGUgJyR7dGVybVN0cmluZ30nIHRlcm0gdG8gdGhlIGNsYWRpYyBjb250ZXh0LmApO1xuICB9XG5cbiAgYWRkTGluayhsaW5rKSB7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMsIC8vL1xuICAgICAgICAgIGxpbmtTdHJpbmcgPSBsaW5rLmdldFN0cmluZygpO1xuXG4gICAgY29udGV4dC50cmFjZShgQWRkaW5nIHRoZSAnJHtsaW5rU3RyaW5nfScgbGluayB0byB0aGUgY2xhZGljIGNvbnRleHQuLi5gKTtcblxuICAgIGNvbnN0IGxpbmtBID0gbGluazsgLy8vXG5cbiAgICBleHRyYWN0KHRoaXMubGlua3MsIChsaW5rKSA9PiB7XG4gICAgICBjb25zdCBsaW5rQiA9IGxpbmssIC8vL1xuICAgICAgICAgICAgbGlua0FFcXVhbFRvTGlua0IgPSBsaW5rQS5pc0VxdWFsVG8obGlua0IpO1xuXG4gICAgICBpZiAobGlua0FFcXVhbFRvTGlua0IpIHtcbiAgICAgICAgY29uc3QgbGlua1N0cmluZyA9IGxpbmsuZ2V0U3RyaW5nKCk7XG5cbiAgICAgICAgY29udGV4dC50cmFjZShgUmVtb3ZlZCB0aGUgZXhpc3RpbmcgJyR7bGlua1N0cmluZ30nIGxpbmsgZnJvbSB0aGUgY2xhZGljIGNvbnRleHQuLi5gKTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMubGlua3MucHVzaChsaW5rKTtcblxuICAgIGNvbnRleHQuZGVidWcoYC4uLmFkZGVkIHRoZSAnJHtsaW5rU3RyaW5nfScgbGluayB0byB0aGUgY2xhZGljIGNvbnRleHQuYCk7XG4gIH1cblxuICBhZGRGcmFtZShmcmFtZSkge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLCAvLy9cbiAgICAgICAgICBmcmFtZVN0cmluZyA9IGZyYW1lLmdldFN0cmluZygpO1xuXG4gICAgY29udGV4dC50cmFjZShgQWRkaW5nIHRoZSAnJHtmcmFtZVN0cmluZ30nIGZyYW1lIHRvIHRoZSBjbGFkaWMgY29udGV4dC4uLmApO1xuXG4gICAgY29uc3QgZnJhbWVBID0gZnJhbWU7IC8vL1xuXG4gICAgZXh0cmFjdCh0aGlzLmZyYW1lcywgKGZyYW1lKSA9PiB7XG4gICAgICBjb25zdCBmcmFtZUIgPSBmcmFtZSwgLy8vXG4gICAgICAgICAgICBmcmFtZUFFcXVhbFRvRnJhbWVCID0gZnJhbWVBLmlzRXF1YWxUbyhmcmFtZUIpO1xuXG4gICAgICBpZiAoZnJhbWVBRXF1YWxUb0ZyYW1lQikge1xuICAgICAgICBjb25zdCBmcmFtZVN0cmluZyA9IGZyYW1lLmdldFN0cmluZygpO1xuXG4gICAgICAgIGNvbnRleHQudHJhY2UoYFJlbW92ZWQgdGhlIGV4aXN0aW5nICcke2ZyYW1lU3RyaW5nfScgZnJhbWUgZnJvbSB0aGUgY2xhZGljIGNvbnRleHQuLi5gKTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuZnJhbWVzLnB1c2goZnJhbWUpO1xuXG4gICAgY29udGV4dC5kZWJ1ZyhgLi4uYWRkZWQgdGhlICcke2ZyYW1lU3RyaW5nfScgZnJhbWUgdG8gdGhlIGNsYWRpYyBjb250ZXh0LmApO1xuICB9XG5cbiAgYWRkRXF1YWxpdHkoZXF1YWxpdHkpIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcywgLy8vXG4gICAgICAgICAgZXF1YWxpdHlTdHJpbmcgPSBlcXVhbGl0eS5nZXRTdHJpbmcoKTtcblxuICAgIGNvbnRleHQudHJhY2UoYEFkZGluZyB0aGUgJyR7ZXF1YWxpdHlTdHJpbmd9JyBlcXVhbGl0eSB0byB0aGUgY2xhZGljIGNvbnRleHQuLi5gKTtcblxuICAgIGNvbnN0IGVxdWFsaXR5QSA9IGVxdWFsaXR5OyAvLy9cblxuICAgIGV4dHJhY3QodGhpcy5lcXVhbGl0aWVzLCAoZXF1YWxpdHkpID0+IHtcbiAgICAgIGNvbnN0IGVxdWFsaXR5QiA9IGVxdWFsaXR5LCAvLy9cbiAgICAgICAgICAgIGVxdWFsaXR5QUVxdWFsVG9FcXVhbGl0eUIgPSBlcXVhbGl0eUEuaXNFcXVhbFRvKGVxdWFsaXR5Qik7XG5cbiAgICAgIGlmIChlcXVhbGl0eUFFcXVhbFRvRXF1YWxpdHlCKSB7XG4gICAgICAgIGNvbnN0IGVxdWFsaXR5U3RyaW5nID0gZXF1YWxpdHkuZ2V0U3RyaW5nKCk7XG5cbiAgICAgICAgY29udGV4dC50cmFjZShgUmVtb3ZlZCB0aGUgZXhpc3RpbmcgJyR7ZXF1YWxpdHlTdHJpbmd9JyBlcXVhbGl0eSBmcm9tIHRoZSBjbGFkaWMgY29udGV4dC4uLmApO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5lcXVhbGl0aWVzLnB1c2goZXF1YWxpdHkpO1xuXG4gICAgY29udGV4dC5kZWJ1ZyhgLi4uYWRkZWQgdGhlICcke2VxdWFsaXR5U3RyaW5nfScgZXF1YWxpdHkgdG8gdGhlIGNsYWRpYyBjb250ZXh0LmApO1xuICB9XG5cbiAgYWRkQXNzZXJ0aW9uKGFzc2VydGlvbikge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLCAvLy9cbiAgICAgICAgICBhc3NlcnRpb25TdHJpbmcgPSBhc3NlcnRpb24uZ2V0U3RyaW5nKCk7XG5cbiAgICBjb250ZXh0LnRyYWNlKGBBZGRpbmcgdGhlICcke2Fzc2VydGlvblN0cmluZ30nIGFzc2VydGlvbiB0byB0aGUgY2xhZGljIGNvbnRleHQuLi5gKTtcblxuICAgIGNvbnN0IGFzc2VydGlvbkEgPSBhc3NlcnRpb247IC8vL1xuXG4gICAgZXh0cmFjdCh0aGlzLmFzc2VydGlvbnMsIChhc3NlcnRpb24pID0+IHtcbiAgICAgIGNvbnN0IGFzc2VydGlvbkIgPSBhc3NlcnRpb24sIC8vL1xuICAgICAgICAgICAgYXNzZXJ0aW9uQUVxdWFsVG9Bc3NlcnRpb25CID0gYXNzZXJ0aW9uQS5pc0VxdWFsVG8oYXNzZXJ0aW9uQik7XG5cbiAgICAgIGlmIChhc3NlcnRpb25BRXF1YWxUb0Fzc2VydGlvbkIpIHtcbiAgICAgICAgY29uc3QgYXNzZXJ0aW9uU3RyaW5nID0gYXNzZXJ0aW9uLmdldFN0cmluZygpO1xuXG4gICAgICAgIGNvbnRleHQudHJhY2UoYFJlbW92ZWQgdGhlIGV4aXN0aW5nICcke2Fzc2VydGlvblN0cmluZ30nIGFzc2VydGlvbiBmcm9tIHRoZSBjbGFkaWMgY29udGV4dC4uLmApO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5hc3NlcnRpb25zLnB1c2goYXNzZXJ0aW9uKTtcblxuICAgIGNvbnRleHQuZGVidWcoYC4uLmFkZGVkIHRoZSAnJHthc3NlcnRpb25TdHJpbmd9JyBhc3NlcnRpb24gdG8gdGhlIGNsYWRpYyBjb250ZXh0LmApO1xuICB9XG5cbiAgYWRkU3RhdGVtZW50KHN0YXRlbWVudCkge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLCAvLy9cbiAgICAgICAgICBzdGF0ZW1lbnRTdHJpbmcgPSBzdGF0ZW1lbnQuZ2V0U3RyaW5nKCk7XG5cbiAgICBjb250ZXh0LnRyYWNlKGBBZGRpbmcgdGhlICcke3N0YXRlbWVudFN0cmluZ30nIHN0YXRlbWVudCB0byB0aGUgY2xhZGljIGNvbnRleHQuLi5gKTtcblxuICAgIGNvbnN0IHN0YXRlbWVudEEgPSBzdGF0ZW1lbnQ7IC8vL1xuXG4gICAgZXh0cmFjdCh0aGlzLnN0YXRlbWVudHMsIChzdGF0ZW1lbnQpID0+IHtcbiAgICAgIGNvbnN0IHN0YXRlbWVudEIgPSBzdGF0ZW1lbnQsIC8vL1xuICAgICAgICAgICAgc3RhdGVtZW50QUVxdWFsVG9TdGF0ZW1lbnRCID0gc3RhdGVtZW50QS5pc0VxdWFsVG8oc3RhdGVtZW50Qik7XG5cbiAgICAgIGlmIChzdGF0ZW1lbnRBRXF1YWxUb1N0YXRlbWVudEIpIHtcbiAgICAgICAgY29uc3Qgc3RhdGVtZW50U3RyaW5nID0gc3RhdGVtZW50LmdldFN0cmluZygpO1xuXG4gICAgICAgIGNvbnRleHQudHJhY2UoYFJlbW92ZWQgdGhlIGV4aXN0aW5nICcke3N0YXRlbWVudFN0cmluZ30nIHN0YXRlbWVudCBmcm9tIHRoZSBjbGFkaWMgY29udGV4dC4uLmApO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5zdGF0ZW1lbnRzLnB1c2goc3RhdGVtZW50KTtcblxuICAgIGNvbnRleHQuZGVidWcoYC4uLmFkZGVkIHRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbnQgdG8gdGhlIGNsYWRpYyBjb250ZXh0LmApO1xuICB9XG5cbiAgYWRkQXNzdW1wdGlvbihhc3N1bXB0aW9uKSB7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMsIC8vL1xuICAgICAgICAgIGFzc3VtcHRpb25TdHJpbmcgPSBhc3N1bXB0aW9uLmdldFN0cmluZygpO1xuXG4gICAgY29udGV4dC50cmFjZShgQWRkaW5nIHRoZSAnJHthc3N1bXB0aW9uU3RyaW5nfScgYXNzdW1wdGlvbiB0byB0aGUgY2xhZGljIGNvbnRleHQuLi5gKTtcblxuICAgIGNvbnN0IGFzc3VtcHRpb25BID0gYXNzdW1wdGlvbjsgLy8vXG5cbiAgICBleHRyYWN0KHRoaXMuYXNzdW1wdGlvbnMsIChhc3N1bXB0aW9uKSA9PiB7XG4gICAgICBjb25zdCBhc3N1bXB0aW9uQiA9IGFzc3VtcHRpb24sIC8vL1xuICAgICAgICAgICAgYXNzdW1wdGlvbkFFcXVhbFRvQXNzdW1wdGlvbkIgPSBhc3N1bXB0aW9uQS5pc0VxdWFsVG8oYXNzdW1wdGlvbkIpO1xuXG4gICAgICBpZiAoYXNzdW1wdGlvbkFFcXVhbFRvQXNzdW1wdGlvbkIpIHtcbiAgICAgICAgY29uc3QgYXNzdW1wdGlvblN0cmluZyA9IGFzc3VtcHRpb24uZ2V0U3RyaW5nKCk7XG5cbiAgICAgICAgY29udGV4dC50cmFjZShgUmVtb3ZlZCB0aGUgZXhpc3RpbmcgJyR7YXNzdW1wdGlvblN0cmluZ30nIGFzc3VtcHRpb24gZnJvbSB0aGUgY2xhZGljIGNvbnRleHQuLi5gKTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuYXNzdW1wdGlvbnMucHVzaChhc3N1bXB0aW9uKTtcblxuICAgIGNvbnRleHQuZGVidWcoYC4uLmFkZGVkIHRoZSAnJHthc3N1bXB0aW9uU3RyaW5nfScgYXNzdW1wdGlvbiB0byB0aGUgY2xhZGljIGNvbnRleHQuYCk7XG4gIH1cblxuICBhZGRNZXRhdmFyaWFibGUobWV0YXZhcmlhYmxlKSB7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMsIC8vL1xuICAgICAgICAgIG1ldGF2YXJpYWJsZVN0cmluZyA9IG1ldGF2YXJpYWJsZS5nZXRTdHJpbmcoKTtcblxuICAgIGNvbnRleHQudHJhY2UoYEFkZGluZyB0aGUgJyR7bWV0YXZhcmlhYmxlU3RyaW5nfScgbWV0YXZhcmlhYmxlIHRvIHRoZSBjbGFkaWMgY29udGV4dC4uLmApO1xuXG4gICAgY29uc3QgbWV0YXZhcmlhYmxlQSA9IG1ldGF2YXJpYWJsZTsgLy8vXG5cbiAgICBleHRyYWN0KHRoaXMubWV0YXZhcmlhYmxlcywgKG1ldGF2YXJpYWJsZSkgPT4ge1xuICAgICAgY29uc3QgbWV0YXZhcmlhYmxlQiA9IG1ldGF2YXJpYWJsZSwgLy8vXG4gICAgICAgICAgICBtZXRhdmFyaWFibGVBRXF1YWxUb01ldGF2YXJpYWJsZUIgPSBtZXRhdmFyaWFibGVBLmlzRXF1YWxUbyhtZXRhdmFyaWFibGVCKTtcblxuICAgICAgaWYgKG1ldGF2YXJpYWJsZUFFcXVhbFRvTWV0YXZhcmlhYmxlQikge1xuICAgICAgICBjb25zdCBtZXRhdmFyaWFibGVTdHJpbmcgPSBtZXRhdmFyaWFibGUuZ2V0U3RyaW5nKCk7XG5cbiAgICAgICAgY29udGV4dC50cmFjZShgUmVtb3ZlZCB0aGUgZXhpc3RpbmcgJyR7bWV0YXZhcmlhYmxlU3RyaW5nfScgbWV0YXZhcmlhYmxlIGZyb20gdGhlIGNsYWRpYyBjb250ZXh0Li4uYCk7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLm1ldGF2YXJpYWJsZXMucHVzaChtZXRhdmFyaWFibGUpO1xuXG4gICAgY29udGV4dC5kZWJ1ZyhgLi4uYWRkZWQgdGhlICcke21ldGF2YXJpYWJsZVN0cmluZ30nIG1ldGF2YXJpYWJsZSB0byB0aGUgY2xhZGljIGNvbnRleHQuYCk7XG4gIH1cblxuICBhZGRTdWJzdGl0dXRpb24oc3Vic3RpdHV0aW9uKSB7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMuZ2V0Q29udGV4dCgpO1xuXG4gICAgY29udGV4dC5hZGRTdWJzdGl0dXRpb24oc3Vic3RpdHV0aW9uKTtcbiAgfVxuXG4gIGFkZEFzc2lnbm1lbnQoYXNzaWdubWVudCkge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmdldENvbnRleHQoKTtcblxuICAgIGNvbnRleHQuYWRkQXNzaWdubWVudChhc3NpZ25tZW50KTtcbiAgfVxuXG4gIGFkZFRlcm1zKHRlcm1zKSB7XG4gICAgdGVybXMuZm9yRWFjaCgodGVybSkgPT4ge1xuICAgICAgdGhpcy5hZGRUZXJtKHRlcm0pO1xuICAgIH0pO1xuICB9XG5cbiAgYWRkTGlua3MobGlua3MpIHtcbiAgICBsaW5rcy5mb3JFYWNoKChsaW5rKSA9PiB7XG4gICAgICB0aGlzLmFkZExpbmsobGluayk7XG4gICAgfSk7XG4gIH1cblxuICBhZGRGcmFtZXMoZnJhbWVzKSB7XG4gICAgZnJhbWVzLmZvckVhY2goKGZyYW1lKSA9PiB7XG4gICAgICB0aGlzLmFkZEZyYW1lKGZyYW1lKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFkZEVxdWFsaXRpZXMoZXF1YWxpdGllcykge1xuICAgIGVxdWFsaXRpZXMuZm9yRWFjaCgoZXF1YWxpdHkpID0+IHtcbiAgICAgIHRoaXMuYWRkRXF1YWxpdHkoZXF1YWxpdHkpO1xuICAgIH0pO1xuICB9XG5cbiAgYWRkQXNzZXJ0aW9ucyhhc3NlcnRpb25zKSB7XG4gICAgYXNzZXJ0aW9ucy5mb3JFYWNoKChhc3NlcnRpb24pID0+IHtcbiAgICAgIHRoaXMuYWRkQXNzZXJ0aW9uKGFzc2VydGlvbik7XG4gICAgfSk7XG4gIH1cblxuICBhZGRTdGF0ZW1lbnRzKHN0YXRlbWVudHMpIHtcbiAgICBzdGF0ZW1lbnRzLmZvckVhY2goKHN0YXRlbWVudCkgPT4ge1xuICAgICAgdGhpcy5hZGRTdGF0ZW1lbnQoc3RhdGVtZW50KTtcbiAgICB9KTtcbiAgfVxuXG4gIGFkZEFzc3VtcHRpb25zKGFzc3VtcHRpb25zKSB7XG4gICAgYXNzdW1wdGlvbnMuZm9yRWFjaCgoYXNzdW1wdGlvbikgPT4ge1xuICAgICAgdGhpcy5hZGRBc3N1bXB0aW9uKGFzc3VtcHRpb24pO1xuICAgIH0pO1xuICB9XG5cbiAgYWRkTWV0YXZhcmlhYmxlcyhtZXRhdmFyaWFibGVzKSB7XG4gICAgbWV0YXZhcmlhYmxlcy5mb3JFYWNoKChtZXRhdmFyaWFibGUpID0+IHtcbiAgICAgIHRoaXMuYWRkTWV0YXZhcmlhYmxlKG1ldGF2YXJpYWJsZSk7XG4gICAgfSk7XG4gIH1cblxuICBmaW5kVGVybUJ5VGVybU5vZGUodGVybU5vZGUpIHtcbiAgICBjb25zdCB0ZXJtcyA9IHRoaXMuZ2V0VGVybXMoKSxcbiAgICAgICAgICB0ZXJtID0gdGVybXMuZmluZCgodGVybSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdGVybU5vZGVNYXRjaGVzID0gdGVybS5tYXRjaFRlcm1Ob2RlKHRlcm1Ob2RlKTtcblxuICAgICAgICAgICAgaWYgKHRlcm1Ob2RlTWF0Y2hlcykge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSB8fCBudWxsO1xuXG4gICAgcmV0dXJuIHRlcm07XG4gIH1cblxuICBmaW5kTGlua0J5TGlua05vZGUobGlua05vZGUpIHtcbiAgICBjb25zdCBsaW5rcyA9IHRoaXMuZ2V0TGlua3MoKSxcbiAgICAgICAgICBsaW5rID0gbGlua3MuZmluZCgobGluaykgPT4ge1xuICAgICAgICAgICAgY29uc3QgbGlua05vZGVNYXRjaGVzID0gbGluay5tYXRjaExpbmtOb2RlKGxpbmtOb2RlKTtcblxuICAgICAgICAgICAgaWYgKGxpbmtOb2RlTWF0Y2hlcykge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSB8fCBudWxsO1xuXG4gICAgcmV0dXJuIGxpbms7XG4gIH1cblxuICBmaW5kRnJhbWVCeUZyYW1lTm9kZShmcmFtZU5vZGUpIHtcbiAgICBjb25zdCBmcmFtZXMgPSB0aGlzLmdldEZyYW1lcygpLFxuICAgICAgICAgIGZyYW1lID0gZnJhbWVzLmZpbmQoKGZyYW1lKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmcmFtZU5vZGVNYXRjaGVzID0gZnJhbWUubWF0Y2hGcmFtZU5vZGUoZnJhbWVOb2RlKTtcblxuICAgICAgICAgICAgaWYgKGZyYW1lTm9kZU1hdGNoZXMpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkgfHwgbnVsbDtcblxuICAgIHJldHVybiBmcmFtZTtcbiAgfVxuXG4gIGZpbmRFcXVhbGl0eUJ5RXF1YWxpdHlOb2RlKGVxdWFsaXR5Tm9kZSkge1xuICAgIGNvbnN0IGVxdWFsaXRpZXMgPSB0aGlzLmdldEVxdWFsaXRpZXMoKSxcbiAgICAgICAgICBlcXVhbGl0eSA9IGVxdWFsaXRpZXMuZmluZCgoZXF1YWxpdHkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVxdWFsaXR5Tm9kZU1hdGNoZXMgPSBlcXVhbGl0eS5tYXRjaEVxdWFsaXR5Tm9kZShlcXVhbGl0eU5vZGUpO1xuXG4gICAgICAgICAgICBpZiAoZXF1YWxpdHlOb2RlTWF0Y2hlcykge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSB8fCBudWxsO1xuXG4gICAgcmV0dXJuIGVxdWFsaXR5O1xuICB9XG5cbiAgZmluZEFzc2VydGlvbkJ5QXNzZXJ0aW9uTm9kZShhc3NlcnRpb25Ob2RlKSB7XG4gICAgY29uc3QgYXNzZXJ0aW9ucyA9IHRoaXMuZ2V0QXNzZXJ0aW9ucygpLFxuICAgICAgICAgIGFzc2VydGlvbiA9IGFzc2VydGlvbnMuZmluZCgoYXNzZXJ0aW9uKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhc3NlcnRpb25Ob2RlTWF0Y2hlcyA9IGFzc2VydGlvbi5tYXRjaEFzc2VydGlvbk5vZGUoYXNzZXJ0aW9uTm9kZSk7XG5cbiAgICAgICAgICAgIGlmIChhc3NlcnRpb25Ob2RlTWF0Y2hlcykge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSB8fCBudWxsO1xuXG4gICAgcmV0dXJuIGFzc2VydGlvbjtcbiAgfVxuXG4gIGZpbmRTdGF0ZW1lbnRCeVN0YXRlbWVudE5vZGUoc3RhdGVtZW50Tm9kZSkge1xuICAgIGNvbnN0IHN0YXRlbWVudHMgPSB0aGlzLmdldFN0YXRlbWVudHMoKSxcbiAgICAgICAgICBzdGF0ZW1lbnQgPSBzdGF0ZW1lbnRzLmZpbmQoKHN0YXRlbWVudCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3RhdGVtZW50Tm9kZU1hdGNoZXMgPSBzdGF0ZW1lbnQubWF0Y2hTdGF0ZW1lbnROb2RlKHN0YXRlbWVudE5vZGUpO1xuXG4gICAgICAgICAgICBpZiAoc3RhdGVtZW50Tm9kZU1hdGNoZXMpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkgfHwgbnVsbDtcblxuICAgIHJldHVybiBzdGF0ZW1lbnQ7XG4gIH1cblxuICBmaW5kQXNzdW1wdGlvbkJ5QXNzdW1wdGlvbk5vZGUoYXNzdW1wdGlvbk5vZGUpIHtcbiAgICBjb25zdCBhc3N1bXB0aW9ucyA9IHRoaXMuZ2V0QXNzdW1wdGlvbnMoKSxcbiAgICAgICAgICBhc3N1bXB0aW9uID0gYXNzdW1wdGlvbnMuZmluZCgoYXNzdW1wdGlvbikgPT4ge1xuICAgICAgICAgICAgY29uc3QgYXNzdW1wdGlvbk5vZGVNYXRjaGVzID0gYXNzdW1wdGlvbi5tYXRjaEFzc3VtcHRpb25Ob2RlKGFzc3VtcHRpb25Ob2RlKTtcblxuICAgICAgICAgICAgaWYgKGFzc3VtcHRpb25Ob2RlTWF0Y2hlcykge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSB8fCBudWxsO1xuXG4gICAgcmV0dXJuIGFzc3VtcHRpb247XG4gIH1cblxuICBmaW5kTWV0YXZhcmlhYmxlQnlNZXRhdmFyaWFibGVOb2RlKG1ldGF2YXJpYWJsZU5vZGUpIHtcbiAgICBjb25zdCBtZXRhdmFyaWFibGVzID0gdGhpcy5nZXRNZXRhdmFyaWFibGVzKCksXG4gICAgICAgICAgbWV0YXZhcmlhYmxlID0gbWV0YXZhcmlhYmxlcy5maW5kKChtZXRhdmFyaWFibGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG1ldGF2YXJpYWJsZU5vZGVNYXRjaGVzID0gbWV0YXZhcmlhYmxlLm1hdGNoTWV0YXZhcmlhYmxlTm9kZShtZXRhdmFyaWFibGVOb2RlKTtcblxuICAgICAgICAgICAgaWYgKG1ldGF2YXJpYWJsZU5vZGVNYXRjaGVzKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pIHx8IG51bGw7XG5cbiAgICByZXR1cm4gbWV0YXZhcmlhYmxlO1xuICB9XG5cbiAgaXNUZXJtUHJlc2VudEJ5VGVybU5vZGUodGVybU5vZGUpIHtcbiAgICBjb25zdCB0ZXJtID0gdGhpcy5maW5kVGVybUJ5VGVybU5vZGUodGVybU5vZGUpLFxuICAgICAgICAgIHRlcm1QcmVzZW50ID0gKHRlcm0gIT09IG51bGwpO1xuXG4gICAgcmV0dXJuIHRlcm1QcmVzZW50O1xuICB9XG5cbiAgaXNMaW5rUHJlc2VudEJ5TGlua05vZGUobGlua05vZGUpIHtcbiAgICBjb25zdCBsaW5rID0gdGhpcy5maW5kTGlua0J5TGlua05vZGUobGlua05vZGUpLFxuICAgICAgICAgIGxpbmtQcmVzZW50ID0gKGxpbmsgIT09IG51bGwpO1xuXG4gICAgcmV0dXJuIGxpbmtQcmVzZW50O1xuICB9XG5cbiAgaXNGcmFtZVByZXNlbnRCeUZyYW1lTm9kZShmcmFtZU5vZGUpIHtcbiAgICBjb25zdCBmcmFtZSA9IHRoaXMuZmluZEZyYW1lQnlGcmFtZU5vZGUoZnJhbWVOb2RlKSxcbiAgICAgICAgICBmcmFtZVByZXNlbnQgPSAoZnJhbWUgIT09IG51bGwpO1xuXG4gICAgcmV0dXJuIGZyYW1lUHJlc2VudDtcbiAgfVxuXG4gIGlzRXF1YWxpdHlQcmVzZW50QnlFcXVhbGl0eU5vZGUoZXF1YWxpdHlOb2RlKSB7XG4gICAgY29uc3QgZXF1YWxpdHkgPSB0aGlzLmZpbmRFcXVhbGl0eUJ5RXF1YWxpdHlOb2RlKGVxdWFsaXR5Tm9kZSksXG4gICAgICAgICAgZXF1YWxpdHlQcmVzZW50ID0gKGVxdWFsaXR5ICE9PSBudWxsKTtcblxuICAgIHJldHVybiBlcXVhbGl0eVByZXNlbnQ7XG4gIH1cblxuICBpc0Fzc2VydGlvblByZXNlbnRCeUFzc2VydGlvbk5vZGUoYXNzZXJ0aW9uTm9kZSkge1xuICAgIGNvbnN0IGFzc2VydGlvbiA9IHRoaXMuZmluZEFzc2VydGlvbkJ5QXNzZXJ0aW9uTm9kZShhc3NlcnRpb25Ob2RlKSxcbiAgICAgICAgICBhc3NlcnRpb25QcmVzZW50ID0gKGFzc2VydGlvbiAhPT0gbnVsbCk7XG5cbiAgICByZXR1cm4gYXNzZXJ0aW9uUHJlc2VudDtcbiAgfVxuXG4gIGlzU3RhdGVtZW50UHJlc2VudEJ5U3RhdGVtZW50Tm9kZShzdGF0ZW1lbnROb2RlKSB7XG4gICAgY29uc3Qgc3RhdGVtZW50ID0gdGhpcy5maW5kU3RhdGVtZW50QnlTdGF0ZW1lbnROb2RlKHN0YXRlbWVudE5vZGUpLFxuICAgICAgICAgIHN0YXRlbWVudFByZXNlbnQgPSAoc3RhdGVtZW50ICE9PSBudWxsKTtcblxuICAgIHJldHVybiBzdGF0ZW1lbnRQcmVzZW50O1xuICB9XG5cbiAgaXNBc3N1bXB0aW9uUHJlc2VudEJ5QXNzdW1wdGlvbk5vZGUoYXNzdW1wdGlvbk5vZGUpIHtcbiAgICBjb25zdCBhc3N1bXB0aW9uID0gdGhpcy5maW5kQXNzdW1wdGlvbkJ5QXNzdW1wdGlvbk5vZGUoYXNzdW1wdGlvbk5vZGUpLFxuICAgICAgICAgIGFzc3VtcHRpb25QcmVzZW50ID0gKGFzc3VtcHRpb24gIT09IG51bGwpO1xuXG4gICAgcmV0dXJuIGFzc3VtcHRpb25QcmVzZW50O1xuICB9XG5cbiAgaXNNZXRhdmFyaWFibGVQcmVzZW50QnlNZXRhdmFyaWFibGVOb2RlKG1ldGF2YXJpYWJsZU5vZGUpIHtcbiAgICBjb25zdCBtZXRhdmFyaWFibGVuID0gdGhpcy5maW5kTWV0YXZhcmlhYmxlQnlNZXRhdmFyaWFibGVOb2RlKG1ldGF2YXJpYWJsZU5vZGUpLFxuICAgICAgICAgIG1ldGF2YXJpYWJsZW5QcmVzZW50ID0gKG1ldGF2YXJpYWJsZW4gIT09IG51bGwpO1xuXG4gICAgcmV0dXJuIG1ldGF2YXJpYWJsZW5QcmVzZW50O1xuICB9XG5cbiAgbWVyZ2UoY29udGV4dCkge1xuICAgIGNvbnRleHQuZGVidWcoYE1lcmdpbmcgdGhlIGNsYWRpYyBjb250ZXh0YCk7XG5cbiAgICBjb250ZXh0LmFkZFRlcm1zKHRoaXMudGVybXMpO1xuXG4gICAgY29udGV4dC5hZGRMaW5rcyh0aGlzLmxpbmtzKTtcblxuICAgIGNvbnRleHQuYWRkRnJhbWVzKHRoaXMuZnJhbWVzKTtcblxuICAgIGNvbnRleHQuYWRkRXF1YWxpdGllcyh0aGlzLmVxdWFsaXRpZXMpO1xuXG4gICAgY29udGV4dC5hZGRBc3NlcnRpb25zKHRoaXMuYXNzZXJ0aW9ucyk7XG5cbiAgICBjb250ZXh0LmFkZFN0YXRlbWVudHModGhpcy5zdGF0ZW1lbnRzKTtcblxuICAgIGNvbnRleHQuYWRkQXNzdW1wdGlvbnModGhpcy5hc3N1bXB0aW9ucyk7XG5cbiAgICBjb250ZXh0LmFkZE1ldGF2YXJpYWJsZXModGhpcy5tZXRhdmFyaWFibGVzKTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tTm90aGluZyhjb250ZXh0KSB7XG4gICAgY29uc3QgdGVybXMgPSBbXSxcbiAgICAgICAgICBsaW5rcyA9IFtdLFxuICAgICAgICAgIGZyYW1lcyA9IFtdLFxuICAgICAgICAgIGVxdWFsaXRpZXMgPSBbXSxcbiAgICAgICAgICBzdGF0ZW1lbnRzID0gW10sXG4gICAgICAgICAgYXNzZXJ0aW9ucyA9IFtdLFxuICAgICAgICAgIGFzc3VtcHRpb25zID0gW10sXG4gICAgICAgICAgbWV0YXZhcmlhYmxlcyA9IFtdLFxuICAgICAgICAgIGNsYWRpY0NvbnRleHQgPSBuZXcgQ2xhZGljQ29udGV4dChjb250ZXh0LCB0ZXJtcywgbGlua3MsIGZyYW1lcywgZXF1YWxpdGllcywgYXNzZXJ0aW9ucywgc3RhdGVtZW50cywgYXNzdW1wdGlvbnMsIG1ldGF2YXJpYWJsZXMpO1xuICAgIHJldHVybiBjbGFkaWNDb250ZXh0O1xuICB9XG59XG4iXSwibmFtZXMiOlsiQ2xhZGljQ29udGV4dCIsInB1c2giLCJleHRyYWN0IiwiYXJyYXlVdGlsaXRpZXMiLCJDb250ZXh0IiwiY29udGV4dCIsInRlcm1zIiwibGlua3MiLCJmcmFtZXMiLCJlcXVhbGl0aWVzIiwiYXNzZXJ0aW9ucyIsInN0YXRlbWVudHMiLCJhc3N1bXB0aW9ucyIsIm1ldGF2YXJpYWJsZXMiLCJnZXRUZXJtcyIsImdldENvbnRleHQiLCJnZXRMaW5rcyIsImdldEZyYW1lcyIsImdldEVxdWFsaXRpZXMiLCJnZXRTdGF0ZW1lbnRzIiwiZ2V0QXNzZXJ0aW9ucyIsImdldEFzc3VtcHRpb25zIiwiZ2V0TWV0YXZhcmlhYmxlcyIsImFkZFRlcm0iLCJ0ZXJtIiwidGVybVN0cmluZyIsImdldFN0cmluZyIsInRyYWNlIiwidGVybUEiLCJ0ZXJtQiIsInRlcm1BRXF1YWxUb1Rlcm1CIiwiaXNFcXVhbFRvIiwiZGVidWciLCJhZGRMaW5rIiwibGluayIsImxpbmtTdHJpbmciLCJsaW5rQSIsImxpbmtCIiwibGlua0FFcXVhbFRvTGlua0IiLCJhZGRGcmFtZSIsImZyYW1lIiwiZnJhbWVTdHJpbmciLCJmcmFtZUEiLCJmcmFtZUIiLCJmcmFtZUFFcXVhbFRvRnJhbWVCIiwiYWRkRXF1YWxpdHkiLCJlcXVhbGl0eSIsImVxdWFsaXR5U3RyaW5nIiwiZXF1YWxpdHlBIiwiZXF1YWxpdHlCIiwiZXF1YWxpdHlBRXF1YWxUb0VxdWFsaXR5QiIsImFkZEFzc2VydGlvbiIsImFzc2VydGlvbiIsImFzc2VydGlvblN0cmluZyIsImFzc2VydGlvbkEiLCJhc3NlcnRpb25CIiwiYXNzZXJ0aW9uQUVxdWFsVG9Bc3NlcnRpb25CIiwiYWRkU3RhdGVtZW50Iiwic3RhdGVtZW50Iiwic3RhdGVtZW50U3RyaW5nIiwic3RhdGVtZW50QSIsInN0YXRlbWVudEIiLCJzdGF0ZW1lbnRBRXF1YWxUb1N0YXRlbWVudEIiLCJhZGRBc3N1bXB0aW9uIiwiYXNzdW1wdGlvbiIsImFzc3VtcHRpb25TdHJpbmciLCJhc3N1bXB0aW9uQSIsImFzc3VtcHRpb25CIiwiYXNzdW1wdGlvbkFFcXVhbFRvQXNzdW1wdGlvbkIiLCJhZGRNZXRhdmFyaWFibGUiLCJtZXRhdmFyaWFibGUiLCJtZXRhdmFyaWFibGVTdHJpbmciLCJtZXRhdmFyaWFibGVBIiwibWV0YXZhcmlhYmxlQiIsIm1ldGF2YXJpYWJsZUFFcXVhbFRvTWV0YXZhcmlhYmxlQiIsImFkZFN1YnN0aXR1dGlvbiIsInN1YnN0aXR1dGlvbiIsImFkZEFzc2lnbm1lbnQiLCJhc3NpZ25tZW50IiwiYWRkVGVybXMiLCJmb3JFYWNoIiwiYWRkTGlua3MiLCJhZGRGcmFtZXMiLCJhZGRFcXVhbGl0aWVzIiwiYWRkQXNzZXJ0aW9ucyIsImFkZFN0YXRlbWVudHMiLCJhZGRBc3N1bXB0aW9ucyIsImFkZE1ldGF2YXJpYWJsZXMiLCJmaW5kVGVybUJ5VGVybU5vZGUiLCJ0ZXJtTm9kZSIsImZpbmQiLCJ0ZXJtTm9kZU1hdGNoZXMiLCJtYXRjaFRlcm1Ob2RlIiwiZmluZExpbmtCeUxpbmtOb2RlIiwibGlua05vZGUiLCJsaW5rTm9kZU1hdGNoZXMiLCJtYXRjaExpbmtOb2RlIiwiZmluZEZyYW1lQnlGcmFtZU5vZGUiLCJmcmFtZU5vZGUiLCJmcmFtZU5vZGVNYXRjaGVzIiwibWF0Y2hGcmFtZU5vZGUiLCJmaW5kRXF1YWxpdHlCeUVxdWFsaXR5Tm9kZSIsImVxdWFsaXR5Tm9kZSIsImVxdWFsaXR5Tm9kZU1hdGNoZXMiLCJtYXRjaEVxdWFsaXR5Tm9kZSIsImZpbmRBc3NlcnRpb25CeUFzc2VydGlvbk5vZGUiLCJhc3NlcnRpb25Ob2RlIiwiYXNzZXJ0aW9uTm9kZU1hdGNoZXMiLCJtYXRjaEFzc2VydGlvbk5vZGUiLCJmaW5kU3RhdGVtZW50QnlTdGF0ZW1lbnROb2RlIiwic3RhdGVtZW50Tm9kZSIsInN0YXRlbWVudE5vZGVNYXRjaGVzIiwibWF0Y2hTdGF0ZW1lbnROb2RlIiwiZmluZEFzc3VtcHRpb25CeUFzc3VtcHRpb25Ob2RlIiwiYXNzdW1wdGlvbk5vZGUiLCJhc3N1bXB0aW9uTm9kZU1hdGNoZXMiLCJtYXRjaEFzc3VtcHRpb25Ob2RlIiwiZmluZE1ldGF2YXJpYWJsZUJ5TWV0YXZhcmlhYmxlTm9kZSIsIm1ldGF2YXJpYWJsZU5vZGUiLCJtZXRhdmFyaWFibGVOb2RlTWF0Y2hlcyIsIm1hdGNoTWV0YXZhcmlhYmxlTm9kZSIsImlzVGVybVByZXNlbnRCeVRlcm1Ob2RlIiwidGVybVByZXNlbnQiLCJpc0xpbmtQcmVzZW50QnlMaW5rTm9kZSIsImxpbmtQcmVzZW50IiwiaXNGcmFtZVByZXNlbnRCeUZyYW1lTm9kZSIsImZyYW1lUHJlc2VudCIsImlzRXF1YWxpdHlQcmVzZW50QnlFcXVhbGl0eU5vZGUiLCJlcXVhbGl0eVByZXNlbnQiLCJpc0Fzc2VydGlvblByZXNlbnRCeUFzc2VydGlvbk5vZGUiLCJhc3NlcnRpb25QcmVzZW50IiwiaXNTdGF0ZW1lbnRQcmVzZW50QnlTdGF0ZW1lbnROb2RlIiwic3RhdGVtZW50UHJlc2VudCIsImlzQXNzdW1wdGlvblByZXNlbnRCeUFzc3VtcHRpb25Ob2RlIiwiYXNzdW1wdGlvblByZXNlbnQiLCJpc01ldGF2YXJpYWJsZVByZXNlbnRCeU1ldGF2YXJpYWJsZU5vZGUiLCJtZXRhdmFyaWFibGVuIiwibWV0YXZhcmlhYmxlblByZXNlbnQiLCJtZXJnZSIsImZyb21Ob3RoaW5nIiwiY2xhZGljQ29udGV4dCJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7K0JBUUE7OztlQUFxQkE7OzsyQkFOVTtnRUFFWDs7Ozs7O0FBRXBCLE1BQU0sRUFBRUMsSUFBSSxFQUFFQyxPQUFPLEVBQUUsR0FBR0MseUJBQWM7QUFFekIsTUFBTUgsc0JBQXNCSSxnQkFBTztJQUNoRCxZQUFZQyxPQUFPLEVBQUVDLEtBQUssRUFBRUMsS0FBSyxFQUFFQyxNQUFNLEVBQUVDLFVBQVUsRUFBRUMsVUFBVSxFQUFFQyxVQUFVLEVBQUVDLFdBQVcsRUFBRUMsYUFBYSxDQUFFO1FBQ3pHLEtBQUssQ0FBQ1I7UUFFTixJQUFJLENBQUNDLEtBQUssR0FBR0E7UUFDYixJQUFJLENBQUNDLEtBQUssR0FBR0E7UUFDYixJQUFJLENBQUNDLE1BQU0sR0FBR0E7UUFDZCxJQUFJLENBQUNDLFVBQVUsR0FBR0E7UUFDbEIsSUFBSSxDQUFDQyxVQUFVLEdBQUdBO1FBQ2xCLElBQUksQ0FBQ0MsVUFBVSxHQUFHQTtRQUNsQixJQUFJLENBQUNDLFdBQVcsR0FBR0E7UUFDbkIsSUFBSSxDQUFDQyxhQUFhLEdBQUdBO0lBQ3ZCO0lBRUFDLFNBQVNSLFFBQVEsRUFBRSxFQUFFO1FBQ25CLE1BQU1ELFVBQVUsSUFBSSxDQUFDVSxVQUFVO1FBRS9CZCxLQUFLSyxPQUFPLElBQUksQ0FBQ0EsS0FBSztRQUV0QkQsUUFBUVMsUUFBUSxDQUFDUjtRQUVqQixPQUFPQTtJQUNUO0lBRUFVLFNBQVNULFFBQVEsRUFBRSxFQUFFO1FBQ25CLE1BQU1GLFVBQVUsSUFBSSxDQUFDVSxVQUFVO1FBRS9CZCxLQUFLTSxPQUFPLElBQUksQ0FBQ0EsS0FBSztRQUV0QkYsUUFBUVcsUUFBUSxDQUFDVDtRQUVqQixPQUFPQTtJ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
|
|
450
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb250ZXh0L2NsYWRpYy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IHsgYXJyYXlVdGlsaXRpZXMgfSBmcm9tIFwibmVjZXNzYXJ5XCI7XG5cbmltcG9ydCBDb250ZXh0IGZyb20gXCIuLi9jb250ZXh0XCI7XG5cbmNvbnN0IHsgcHVzaCwgZXh0cmFjdCB9ID0gYXJyYXlVdGlsaXRpZXM7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENsYWRpY0NvbnRleHQgZXh0ZW5kcyBDb250ZXh0IHtcbiAgY29uc3RydWN0b3IoY29udGV4dCwgdGVybXMsIGxpbmtzLCBmcmFtZXMsIGVxdWFsaXRpZXMsIGFzc2VydGlvbnMsIHN0YXRlbWVudHMsIHBhcmFtZXRlcnMsIGFzc3VtcHRpb25zLCBtZXRhdmFyaWFibGVzLCBwcm9jZWR1cmVDYWxscykge1xuICAgIHN1cGVyKGNvbnRleHQpO1xuXG4gICAgdGhpcy50ZXJtcyA9IHRlcm1zO1xuICAgIHRoaXMubGlua3MgPSBsaW5rcztcbiAgICB0aGlzLmZyYW1lcyA9IGZyYW1lcztcbiAgICB0aGlzLmVxdWFsaXRpZXMgPSBlcXVhbGl0aWVzO1xuICAgIHRoaXMuYXNzZXJ0aW9ucyA9IGFzc2VydGlvbnM7XG4gICAgdGhpcy5zdGF0ZW1lbnRzID0gc3RhdGVtZW50cztcbiAgICB0aGlzLnBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzO1xuICAgIHRoaXMuYXNzdW1wdGlvbnMgPSBhc3N1bXB0aW9ucztcbiAgICB0aGlzLm1ldGF2YXJpYWJsZXMgPSBtZXRhdmFyaWFibGVzO1xuICAgIHRoaXMucHJvY2VkdXJlQ2FsbHMgPSBwcm9jZWR1cmVDYWxscztcbiAgfVxuXG4gIGdldFRlcm1zKHRlcm1zID0gW10pIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5nZXRDb250ZXh0KCk7XG5cbiAgICBwdXNoKHRlcm1zLCB0aGlzLnRlcm1zKTtcblxuICAgIGNvbnRleHQuZ2V0VGVybXModGVybXMpO1xuXG4gICAgcmV0dXJuIHRlcm1zO1xuICB9XG5cbiAgZ2V0TGlua3MobGlua3MgPSBbXSkge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmdldENvbnRleHQoKTtcblxuICAgIHB1c2gobGlua3MsIHRoaXMubGlua3MpO1xuXG4gICAgY29udGV4dC5nZXRMaW5rcyhsaW5rcyk7XG5cbiAgICByZXR1cm4gbGlua3M7XG4gIH1cblxuICBnZXRGcmFtZXMoZnJhbWVzID0gW10pIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5nZXRDb250ZXh0KCk7XG5cbiAgICBwdXNoKGZyYW1lcywgdGhpcy5mcmFtZXMpO1xuXG4gICAgY29udGV4dC5nZXRGcmFtZXMoZnJhbWVzKTtcblxuICAgIHJldHVybiBmcmFtZXM7XG4gIH1cblxuICBnZXRFcXVhbGl0aWVzKGVxdWFsaXRpZXMgPSBbXSkge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmdldENvbnRleHQoKTtcblxuICAgIHB1c2goZXF1YWxpdGllcywgdGhpcy5lcXVhbGl0aWVzKTtcblxuICAgIGNvbnRleHQuZ2V0RXF1YWxpdGllcyhlcXVhbGl0aWVzKTtcblxuICAgIHJldHVybiBlcXVhbGl0aWVzO1xuICB9XG5cbiAgZ2V0U3RhdGVtZW50cyhzdGF0ZW1lbnRzID0gW10pIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5nZXRDb250ZXh0KCk7XG5cbiAgICBwdXNoKHN0YXRlbWVudHMsIHRoaXMuc3RhdGVtZW50cyk7XG5cbiAgICBjb250ZXh0LmdldFN0YXRlbWVudHMoc3RhdGVtZW50cyk7XG5cbiAgICByZXR1cm4gc3RhdGVtZW50cztcbiAgfVxuXG4gIGdldFBhcmFtZXRlcnMocGFyYW1ldGVycyA9IFtdKSB7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMuZ2V0Q29udGV4dCgpO1xuXG4gICAgcHVzaChwYXJhbWV0ZXJzLCB0aGlzLnBhcmFtZXRlcnMpO1xuXG4gICAgY29udGV4dC5nZXRQYXJhbWV0ZXJzKHBhcmFtZXRlcnMpO1xuXG4gICAgcmV0dXJuIHBhcmFtZXRlcnM7XG4gIH1cblxuICBnZXRBc3NlcnRpb25zKGFzc2VydGlvbnMgPSBbXSkge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmdldENvbnRleHQoKTtcblxuICAgIHB1c2goYXNzZXJ0aW9ucywgdGhpcy5hc3NlcnRpb25zKTtcblxuICAgIGNvbnRleHQuZ2V0QXNzZXJ0aW9ucyhhc3NlcnRpb25zKTtcblxuICAgIHJldHVybiBhc3NlcnRpb25zO1xuICB9XG5cbiAgZ2V0QXNzdW1wdGlvbnMoYXNzdW1wdGlvbnMgPSBbXSkge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmdldENvbnRleHQoKTtcblxuICAgIHB1c2goYXNzdW1wdGlvbnMsIHRoaXMuYXNzdW1wdGlvbnMpO1xuXG4gICAgY29udGV4dC5nZXRBc3N1bXB0aW9ucyhhc3N1bXB0aW9ucyk7XG5cbiAgICByZXR1cm4gYXNzdW1wdGlvbnM7XG4gIH1cblxuICBnZXRNZXRhdmFyaWFibGVzKG1ldGF2YXJpYWJsZXMgPSBbXSkge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmdldENvbnRleHQoKTtcblxuICAgIHB1c2gobWV0YXZhcmlhYmxlcywgdGhpcy5tZXRhdmFyaWFibGVzKTtcblxuICAgIGNvbnRleHQuZ2V0TWV0YXZhcmlhYmxlcyhtZXRhdmFyaWFibGVzKTtcblxuICAgIHJldHVybiBtZXRhdmFyaWFibGVzO1xuICB9XG5cbiAgZ2V0UHJvY2VkdXJlQ2FsbHMocHJvY2VkdXJlQ2FsbHMgPSBbXSkge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmdldENvbnRleHQoKTtcblxuICAgIHB1c2gocHJvY2VkdXJlQ2FsbHMsIHRoaXMucHJvY2VkdXJlQ2FsbHMpO1xuXG4gICAgY29udGV4dC5nZXRQcm9jZWR1cmVDYWxscyhwcm9jZWR1cmVDYWxscyk7XG5cbiAgICByZXR1cm4gcHJvY2VkdXJlQ2FsbHM7XG4gIH1cblxuICBhZGRUZXJtKHRlcm0pIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcywgLy8vXG4gICAgICAgICAgdGVybVN0cmluZyA9IHRlcm0uZ2V0U3RyaW5nKCk7XG5cbiAgICBjb250ZXh0LnRyYWNlKGBBZGRpbmcgdGhlICcke3Rlcm1TdHJpbmd9JyB0ZXJtIHRvIHRoZSBjbGFkaWMgY29udGV4dC4uLmApO1xuXG4gICAgY29uc3QgdGVybUEgPSB0ZXJtOyAvLy9cblxuICAgIGV4dHJhY3QodGhpcy50ZXJtcywgKHRlcm0pID0+IHtcbiAgICAgIGNvbnN0IHRlcm1CID0gdGVybSwgLy8vXG4gICAgICAgICAgICB0ZXJtQUVxdWFsVG9UZXJtQiA9IHRlcm1BLmlzRXF1YWxUbyh0ZXJtQik7XG5cbiAgICAgIGlmICh0ZXJtQUVxdWFsVG9UZXJtQikge1xuICAgICAgICBjb25zdCB0ZXJtU3RyaW5nID0gdGVybS5nZXRTdHJpbmcoKTtcblxuICAgICAgICBjb250ZXh0LnRyYWNlKGBSZW1vdmVkIHRoZSBleGlzdGluZyAnJHt0ZXJtU3RyaW5nfScgdGVybSBmcm9tIHRoZSBjbGFkaWMgY29udGV4dC4uLmApO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy50ZXJtcy5wdXNoKHRlcm0pO1xuXG4gICAgY29udGV4dC5kZWJ1ZyhgLi4uYWRkZWQgdGhlICcke3Rlcm1TdHJpbmd9JyB0ZXJtIHRvIHRoZSBjbGFkaWMgY29udGV4dC5gKTtcbiAgfVxuXG4gIGFkZExpbmsobGluaykge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLCAvLy9cbiAgICAgICAgICBsaW5rU3RyaW5nID0gbGluay5nZXRTdHJpbmcoKTtcblxuICAgIGNvbnRleHQudHJhY2UoYEFkZGluZyB0aGUgJyR7bGlua1N0cmluZ30nIGxpbmsgdG8gdGhlIGNsYWRpYyBjb250ZXh0Li4uYCk7XG5cbiAgICBjb25zdCBsaW5rQSA9IGxpbms7IC8vL1xuXG4gICAgZXh0cmFjdCh0aGlzLmxpbmtzLCAobGluaykgPT4ge1xuICAgICAgY29uc3QgbGlua0IgPSBsaW5rLCAvLy9cbiAgICAgICAgICAgIGxpbmtBRXF1YWxUb0xpbmtCID0gbGlua0EuaXNFcXVhbFRvKGxpbmtCKTtcblxuICAgICAgaWYgKGxpbmtBRXF1YWxUb0xpbmtCKSB7XG4gICAgICAgIGNvbnN0IGxpbmtTdHJpbmcgPSBsaW5rLmdldFN0cmluZygpO1xuXG4gICAgICAgIGNvbnRleHQudHJhY2UoYFJlbW92ZWQgdGhlIGV4aXN0aW5nICcke2xpbmtTdHJpbmd9JyBsaW5rIGZyb20gdGhlIGNsYWRpYyBjb250ZXh0Li4uYCk7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLmxpbmtzLnB1c2gobGluayk7XG5cbiAgICBjb250ZXh0LmRlYnVnKGAuLi5hZGRlZCB0aGUgJyR7bGlua1N0cmluZ30nIGxpbmsgdG8gdGhlIGNsYWRpYyBjb250ZXh0LmApO1xuICB9XG5cbiAgYWRkRnJhbWUoZnJhbWUpIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcywgLy8vXG4gICAgICAgICAgZnJhbWVTdHJpbmcgPSBmcmFtZS5nZXRTdHJpbmcoKTtcblxuICAgIGNvbnRleHQudHJhY2UoYEFkZGluZyB0aGUgJyR7ZnJhbWVTdHJpbmd9JyBmcmFtZSB0byB0aGUgY2xhZGljIGNvbnRleHQuLi5gKTtcblxuICAgIGNvbnN0IGZyYW1lQSA9IGZyYW1lOyAvLy9cblxuICAgIGV4dHJhY3QodGhpcy5mcmFtZXMsIChmcmFtZSkgPT4ge1xuICAgICAgY29uc3QgZnJhbWVCID0gZnJhbWUsIC8vL1xuICAgICAgICAgICAgZnJhbWVBRXF1YWxUb0ZyYW1lQiA9IGZyYW1lQS5pc0VxdWFsVG8oZnJhbWVCKTtcblxuICAgICAgaWYgKGZyYW1lQUVxdWFsVG9GcmFtZUIpIHtcbiAgICAgICAgY29uc3QgZnJhbWVTdHJpbmcgPSBmcmFtZS5nZXRTdHJpbmcoKTtcblxuICAgICAgICBjb250ZXh0LnRyYWNlKGBSZW1vdmVkIHRoZSBleGlzdGluZyAnJHtmcmFtZVN0cmluZ30nIGZyYW1lIGZyb20gdGhlIGNsYWRpYyBjb250ZXh0Li4uYCk7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLmZyYW1lcy5wdXNoKGZyYW1lKTtcblxuICAgIGNvbnRleHQuZGVidWcoYC4uLmFkZGVkIHRoZSAnJHtmcmFtZVN0cmluZ30nIGZyYW1lIHRvIHRoZSBjbGFkaWMgY29udGV4dC5gKTtcbiAgfVxuXG4gIGFkZEVxdWFsaXR5KGVxdWFsaXR5KSB7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMsIC8vL1xuICAgICAgICAgIGVxdWFsaXR5U3RyaW5nID0gZXF1YWxpdHkuZ2V0U3RyaW5nKCk7XG5cbiAgICBjb250ZXh0LnRyYWNlKGBBZGRpbmcgdGhlICcke2VxdWFsaXR5U3RyaW5nfScgZXF1YWxpdHkgdG8gdGhlIGNsYWRpYyBjb250ZXh0Li4uYCk7XG5cbiAgICBjb25zdCBlcXVhbGl0eUEgPSBlcXVhbGl0eTsgLy8vXG5cbiAgICBleHRyYWN0KHRoaXMuZXF1YWxpdGllcywgKGVxdWFsaXR5KSA9PiB7XG4gICAgICBjb25zdCBlcXVhbGl0eUIgPSBlcXVhbGl0eSwgLy8vXG4gICAgICAgICAgICBlcXVhbGl0eUFFcXVhbFRvRXF1YWxpdHlCID0gZXF1YWxpdHlBLmlzRXF1YWxUbyhlcXVhbGl0eUIpO1xuXG4gICAgICBpZiAoZXF1YWxpdHlBRXF1YWxUb0VxdWFsaXR5Qikge1xuICAgICAgICBjb25zdCBlcXVhbGl0eVN0cmluZyA9IGVxdWFsaXR5LmdldFN0cmluZygpO1xuXG4gICAgICAgIGNvbnRleHQudHJhY2UoYFJlbW92ZWQgdGhlIGV4aXN0aW5nICcke2VxdWFsaXR5U3RyaW5nfScgZXF1YWxpdHkgZnJvbSB0aGUgY2xhZGljIGNvbnRleHQuLi5gKTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuZXF1YWxpdGllcy5wdXNoKGVxdWFsaXR5KTtcblxuICAgIGNvbnRleHQuZGVidWcoYC4uLmFkZGVkIHRoZSAnJHtlcXVhbGl0eVN0cmluZ30nIGVxdWFsaXR5IHRvIHRoZSBjbGFkaWMgY29udGV4dC5gKTtcbiAgfVxuXG4gIGFkZEFzc2VydGlvbihhc3NlcnRpb24pIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcywgLy8vXG4gICAgICAgICAgYXNzZXJ0aW9uU3RyaW5nID0gYXNzZXJ0aW9uLmdldFN0cmluZygpO1xuXG4gICAgY29udGV4dC50cmFjZShgQWRkaW5nIHRoZSAnJHthc3NlcnRpb25TdHJpbmd9JyBhc3NlcnRpb24gdG8gdGhlIGNsYWRpYyBjb250ZXh0Li4uYCk7XG5cbiAgICBjb25zdCBhc3NlcnRpb25BID0gYXNzZXJ0aW9uOyAvLy9cblxuICAgIGV4dHJhY3QodGhpcy5hc3NlcnRpb25zLCAoYXNzZXJ0aW9uKSA9PiB7XG4gICAgICBjb25zdCBhc3NlcnRpb25CID0gYXNzZXJ0aW9uLCAvLy9cbiAgICAgICAgICAgIGFzc2VydGlvbkFFcXVhbFRvQXNzZXJ0aW9uQiA9IGFzc2VydGlvbkEuaXNFcXVhbFRvKGFzc2VydGlvbkIpO1xuXG4gICAgICBpZiAoYXNzZXJ0aW9uQUVxdWFsVG9Bc3NlcnRpb25CKSB7XG4gICAgICAgIGNvbnN0IGFzc2VydGlvblN0cmluZyA9IGFzc2VydGlvbi5nZXRTdHJpbmcoKTtcblxuICAgICAgICBjb250ZXh0LnRyYWNlKGBSZW1vdmVkIHRoZSBleGlzdGluZyAnJHthc3NlcnRpb25TdHJpbmd9JyBhc3NlcnRpb24gZnJvbSB0aGUgY2xhZGljIGNvbnRleHQuLi5gKTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuYXNzZXJ0aW9ucy5wdXNoKGFzc2VydGlvbik7XG5cbiAgICBjb250ZXh0LmRlYnVnKGAuLi5hZGRlZCB0aGUgJyR7YXNzZXJ0aW9uU3RyaW5nfScgYXNzZXJ0aW9uIHRvIHRoZSBjbGFkaWMgY29udGV4dC5gKTtcbiAgfVxuXG4gIGFkZFN0YXRlbWVudChzdGF0ZW1lbnQpIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcywgLy8vXG4gICAgICBzdGF0ZW1lbnRTdHJpbmcgPSBzdGF0ZW1lbnQuZ2V0U3RyaW5nKCk7XG5cbiAgICBjb250ZXh0LnRyYWNlKGBBZGRpbmcgdGhlICcke3N0YXRlbWVudFN0cmluZ30nIHN0YXRlbWVudCB0byB0aGUgY2xhZGljIGNvbnRleHQuLi5gKTtcblxuICAgIGNvbnN0IHN0YXRlbWVudEEgPSBzdGF0ZW1lbnQ7IC8vL1xuXG4gICAgZXh0cmFjdCh0aGlzLnN0YXRlbWVudHMsIChzdGF0ZW1lbnQpID0+IHtcbiAgICAgIGNvbnN0IHN0YXRlbWVudEIgPSBzdGF0ZW1lbnQsIC8vL1xuICAgICAgICBzdGF0ZW1lbnRBRXF1YWxUb1N0YXRlbWVudEIgPSBzdGF0ZW1lbnRBLmlzRXF1YWxUbyhzdGF0ZW1lbnRCKTtcblxuICAgICAgaWYgKHN0YXRlbWVudEFFcXVhbFRvU3RhdGVtZW50Qikge1xuICAgICAgICBjb25zdCBzdGF0ZW1lbnRTdHJpbmcgPSBzdGF0ZW1lbnQuZ2V0U3RyaW5nKCk7XG5cbiAgICAgICAgY29udGV4dC50cmFjZShgUmVtb3ZlZCB0aGUgZXhpc3RpbmcgJyR7c3RhdGVtZW50U3RyaW5nfScgc3RhdGVtZW50IGZyb20gdGhlIGNsYWRpYyBjb250ZXh0Li4uYCk7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLnN0YXRlbWVudHMucHVzaChzdGF0ZW1lbnQpO1xuXG4gICAgY29udGV4dC5kZWJ1ZyhgLi4uYWRkZWQgdGhlICcke3N0YXRlbWVudFN0cmluZ30nIHN0YXRlbWVudCB0byB0aGUgY2xhZGljIGNvbnRleHQuYCk7XG4gIH1cblxuICBhZGRQYXJhbWV0ZXIocGFyYW10ZXIpIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcywgLy8vXG4gICAgICAgICAgcGFyYW10ZXJTdHJpbmcgPSBwYXJhbXRlci5nZXRTdHJpbmcoKTtcblxuICAgIGNvbnRleHQudHJhY2UoYEFkZGluZyB0aGUgJyR7cGFyYW10ZXJTdHJpbmd9JyBwYXJhbXRlciB0byB0aGUgY2xhZGljIGNvbnRleHQuLi5gKTtcblxuICAgIGNvbnN0IHBhcmFtdGVyQSA9IHBhcmFtdGVyOyAvLy9cblxuICAgIGV4dHJhY3QodGhpcy5wYXJhbXRlcnMsIChwYXJhbXRlcikgPT4ge1xuICAgICAgY29uc3QgcGFyYW10ZXJCID0gcGFyYW10ZXIsIC8vL1xuICAgICAgICAgICAgcGFyYW10ZXJBRXF1YWxUb1BhcmFtZXRlckIgPSBwYXJhbXRlckEuaXNFcXVhbFRvKHBhcmFtdGVyQik7XG5cbiAgICAgIGlmIChwYXJhbXRlckFFcXVhbFRvUGFyYW1ldGVyQikge1xuICAgICAgICBjb25zdCBwYXJhbXRlclN0cmluZyA9IHBhcmFtdGVyLmdldFN0cmluZygpO1xuXG4gICAgICAgIGNvbnRleHQudHJhY2UoYFJlbW92ZWQgdGhlIGV4aXN0aW5nICcke3BhcmFtdGVyU3RyaW5nfScgcGFyYW10ZXIgZnJvbSB0aGUgY2xhZGljIGNvbnRleHQuLi5gKTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMucGFyYW10ZXJzLnB1c2gocGFyYW10ZXIpO1xuXG4gICAgY29udGV4dC5kZWJ1ZyhgLi4uYWRkZWQgdGhlICcke3BhcmFtdGVyU3RyaW5nfScgcGFyYW10ZXIgdG8gdGhlIGNsYWRpYyBjb250ZXh0LmApO1xuICB9XG5cbiAgYWRkQXNzdW1wdGlvbihhc3N1bXB0aW9uKSB7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMsIC8vL1xuICAgICAgICAgIGFzc3VtcHRpb25TdHJpbmcgPSBhc3N1bXB0aW9uLmdldFN0cmluZygpO1xuXG4gICAgY29udGV4dC50cmFjZShgQWRkaW5nIHRoZSAnJHthc3N1bXB0aW9uU3RyaW5nfScgYXNzdW1wdGlvbiB0byB0aGUgY2xhZGljIGNvbnRleHQuLi5gKTtcblxuICAgIGNvbnN0IGFzc3VtcHRpb25BID0gYXNzdW1wdGlvbjsgLy8vXG5cbiAgICBleHRyYWN0KHRoaXMuYXNzdW1wdGlvbnMsIChhc3N1bXB0aW9uKSA9PiB7XG4gICAgICBjb25zdCBhc3N1bXB0aW9uQiA9IGFzc3VtcHRpb24sIC8vL1xuICAgICAgICAgICAgYXNzdW1wdGlvbkFFcXVhbFRvQXNzdW1wdGlvbkIgPSBhc3N1bXB0aW9uQS5pc0VxdWFsVG8oYXNzdW1wdGlvbkIpO1xuXG4gICAgICBpZiAoYXNzdW1wdGlvbkFFcXVhbFRvQXNzdW1wdGlvbkIpIHtcbiAgICAgICAgY29uc3QgYXNzdW1wdGlvblN0cmluZyA9IGFzc3VtcHRpb24uZ2V0U3RyaW5nKCk7XG5cbiAgICAgICAgY29udGV4dC50cmFjZShgUmVtb3ZlZCB0aGUgZXhpc3RpbmcgJyR7YXNzdW1wdGlvblN0cmluZ30nIGFzc3VtcHRpb24gZnJvbSB0aGUgY2xhZGljIGNvbnRleHQuLi5gKTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuYXNzdW1wdGlvbnMucHVzaChhc3N1bXB0aW9uKTtcblxuICAgIGNvbnRleHQuZGVidWcoYC4uLmFkZGVkIHRoZSAnJHthc3N1bXB0aW9uU3RyaW5nfScgYXNzdW1wdGlvbiB0byB0aGUgY2xhZGljIGNvbnRleHQuYCk7XG4gIH1cblxuICBhZGRNZXRhdmFyaWFibGUobWV0YXZhcmlhYmxlKSB7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMsIC8vL1xuICAgICAgICAgIG1ldGF2YXJpYWJsZVN0cmluZyA9IG1ldGF2YXJpYWJsZS5nZXRTdHJpbmcoKTtcblxuICAgIGNvbnRleHQudHJhY2UoYEFkZGluZyB0aGUgJyR7bWV0YXZhcmlhYmxlU3RyaW5nfScgbWV0YXZhcmlhYmxlIHRvIHRoZSBjbGFkaWMgY29udGV4dC4uLmApO1xuXG4gICAgY29uc3QgbWV0YXZhcmlhYmxlQSA9IG1ldGF2YXJpYWJsZTsgLy8vXG5cbiAgICBleHRyYWN0KHRoaXMubWV0YXZhcmlhYmxlcywgKG1ldGF2YXJpYWJsZSkgPT4ge1xuICAgICAgY29uc3QgbWV0YXZhcmlhYmxlQiA9IG1ldGF2YXJpYWJsZSwgLy8vXG4gICAgICAgICAgICBtZXRhdmFyaWFibGVBRXF1YWxUb01ldGF2YXJpYWJsZUIgPSBtZXRhdmFyaWFibGVBLmlzRXF1YWxUbyhtZXRhdmFyaWFibGVCKTtcblxuICAgICAgaWYgKG1ldGF2YXJpYWJsZUFFcXVhbFRvTWV0YXZhcmlhYmxlQikge1xuICAgICAgICBjb25zdCBtZXRhdmFyaWFibGVTdHJpbmcgPSBtZXRhdmFyaWFibGUuZ2V0U3RyaW5nKCk7XG5cbiAgICAgICAgY29udGV4dC50cmFjZShgUmVtb3ZlZCB0aGUgZXhpc3RpbmcgJyR7bWV0YXZhcmlhYmxlU3RyaW5nfScgbWV0YXZhcmlhYmxlIGZyb20gdGhlIGNsYWRpYyBjb250ZXh0Li4uYCk7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLm1ldGF2YXJpYWJsZXMucHVzaChtZXRhdmFyaWFibGUpO1xuXG4gICAgY29udGV4dC5kZWJ1ZyhgLi4uYWRkZWQgdGhlICcke21ldGF2YXJpYWJsZVN0cmluZ30nIG1ldGF2YXJpYWJsZSB0byB0aGUgY2xhZGljIGNvbnRleHQuYCk7XG4gIH1cblxuICBhZGRTdWJzdGl0dXRpb24oc3Vic3RpdHV0aW9uKSB7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMuZ2V0Q29udGV4dCgpO1xuXG4gICAgY29udGV4dC5hZGRTdWJzdGl0dXRpb24oc3Vic3RpdHV0aW9uKTtcbiAgfVxuXG4gIGFkZFByb2NlZHVyZUNhbGwocHJvY2VkdXJlQ2FsbCkge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLCAvLy9cbiAgICAgICAgICBwcm9jZWR1cmVDYWxsU3RyaW5nID0gcHJvY2VkdXJlQ2FsbC5nZXRTdHJpbmcoKTtcblxuICAgIGNvbnRleHQudHJhY2UoYEFkZGluZyB0aGUgJyR7cHJvY2VkdXJlQ2FsbFN0cmluZ30nIHByb2NlZHVyZSBjYWxsIHRvIHRoZSBjbGFkaWMgY29udGV4dC4uLmApO1xuXG4gICAgY29uc3QgcHJvY2VkdXJlQ2FsbEEgPSBwcm9jZWR1cmVDYWxsOyAvLy9cblxuICAgIGV4dHJhY3QodGhpcy5wcm9jZWR1cmVDYWxscywgKHByb2NlZHVyZUNhbGwpID0+IHtcbiAgICAgIGNvbnN0IHByb2NlZHVyZUNhbGxCID0gcHJvY2VkdXJlQ2FsbCwgLy8vXG4gICAgICAgICAgICBwcm9jZWR1cmVDYWxsQUVxdWFsVG9Qcm9jZWR1cmVhbGxCID0gcHJvY2VkdXJlQ2FsbEEuaXNFcXVhbFRvKHByb2NlZHVyZUNhbGxCKTtcblxuICAgICAgaWYgKHByb2NlZHVyZUNhbGxBRXF1YWxUb1Byb2NlZHVyZWFsbEIpIHtcbiAgICAgICAgY29uc3QgcHJvY2VkdXJlQ2FsbFN0cmluZyA9IHByb2NlZHVyZUNhbGwuZ2V0U3RyaW5nKCk7XG5cbiAgICAgICAgY29udGV4dC50cmFjZShgUmVtb3ZlZCB0aGUgZXhpc3RpbmcgJyR7cHJvY2VkdXJlQ2FsbFN0cmluZ30nIHByb2NlZHVyZSBjYWxsIGZyb20gdGhlIGNsYWRpYyBjb250ZXh0Li4uYCk7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLnByb2NlZHVyZUNhbGxzLnB1c2gocHJvY2VkdXJlQ2FsbCk7XG5cbiAgICBjb250ZXh0LmRlYnVnKGAuLi5hZGRlZCB0aGUgJyR7cHJvY2VkdXJlQ2FsbFN0cmluZ30nIHByb2NlZHVyZSBjYWxsIHRvIHRoZSBjbGFkaWMgY29udGV4dC5gKTtcbiAgfVxuXG4gIGFkZEFzc2lnbm1lbnQoYXNzaWdubWVudCkge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmdldENvbnRleHQoKTtcblxuICAgIGNvbnRleHQuYWRkQXNzaWdubWVudChhc3NpZ25tZW50KTtcbiAgfVxuXG4gIGFkZFRlcm1zKHRlcm1zKSB7XG4gICAgdGVybXMuZm9yRWFjaCgodGVybSkgPT4ge1xuICAgICAgdGhpcy5hZGRUZXJtKHRlcm0pO1xuICAgIH0pO1xuICB9XG5cbiAgYWRkTGlua3MobGlua3MpIHtcbiAgICBsaW5rcy5mb3JFYWNoKChsaW5rKSA9PiB7XG4gICAgICB0aGlzLmFkZExpbmsobGluayk7XG4gICAgfSk7XG4gIH1cblxuICBhZGRGcmFtZXMoZnJhbWVzKSB7XG4gICAgZnJhbWVzLmZvckVhY2goKGZyYW1lKSA9PiB7XG4gICAgICB0aGlzLmFkZEZyYW1lKGZyYW1lKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFkZEVxdWFsaXRpZXMoZXF1YWxpdGllcykge1xuICAgIGVxdWFsaXRpZXMuZm9yRWFjaCgoZXF1YWxpdHkpID0+IHtcbiAgICAgIHRoaXMuYWRkRXF1YWxpdHkoZXF1YWxpdHkpO1xuICAgIH0pO1xuICB9XG5cbiAgYWRkQXNzZXJ0aW9ucyhhc3NlcnRpb25zKSB7XG4gICAgYXNzZXJ0aW9ucy5mb3JFYWNoKChhc3NlcnRpb24pID0+IHtcbiAgICAgIHRoaXMuYWRkQXNzZXJ0aW9uKGFzc2VydGlvbik7XG4gICAgfSk7XG4gIH1cblxuICBhZGRTdGF0ZW1lbnRzKHN0YXRlbWVudHMpIHtcbiAgICBzdGF0ZW1lbnRzLmZvckVhY2goKHN0YXRlbWVudCkgPT4ge1xuICAgICAgdGhpcy5hZGRTdGF0ZW1lbnQoc3RhdGVtZW50KTtcbiAgICB9KTtcbiAgfVxuXG4gIGFkZFBhcmFtZXRlcnMocGFyYW1ldGVycykge1xuICAgIHBhcmFtZXRlcnMuZm9yRWFjaCgocGFyYW1ldGVyKSA9PiB7XG4gICAgICB0aGlzLmFkZFBhcmFtZXRlcihwYXJhbWV0ZXIpO1xuICAgIH0pO1xuICB9XG5cbiAgYWRkQXNzdW1wdGlvbnMoYXNzdW1wdGlvbnMpIHtcbiAgICBhc3N1bXB0aW9ucy5mb3JFYWNoKChhc3N1bXB0aW9uKSA9PiB7XG4gICAgICB0aGlzLmFkZEFzc3VtcHRpb24oYXNzdW1wdGlvbik7XG4gICAgfSk7XG4gIH1cblxuICBhZGRNZXRhdmFyaWFibGVzKG1ldGF2YXJpYWJsZXMpIHtcbiAgICBtZXRhdmFyaWFibGVzLmZvckVhY2goKG1ldGF2YXJpYWJsZSkgPT4ge1xuICAgICAgdGhpcy5hZGRNZXRhdmFyaWFibGUobWV0YXZhcmlhYmxlKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFkZFByb2NlZHVyZUNhbGxzKHByb2NlZHVyZUNhbGxzKSB7XG4gICAgcHJvY2VkdXJlQ2FsbHMuZm9yRWFjaCgocHJvY2VkdXJlQ2FsbCkgPT4ge1xuICAgICAgdGhpcy5hZGRQcm9jZWR1cmVDYWxsKHByb2NlZHVyZUNhbGwpO1xuICAgIH0pO1xuICB9XG5cbiAgZmluZFRlcm1CeVRlcm1Ob2RlKHRlcm1Ob2RlKSB7XG4gICAgY29uc3QgdGVybXMgPSB0aGlzLmdldFRlcm1zKCksXG4gICAgICAgICAgdGVybSA9IHRlcm1zLmZpbmQoKHRlcm0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRlcm1Ob2RlTWF0Y2hlcyA9IHRlcm0ubWF0Y2hUZXJtTm9kZSh0ZXJtTm9kZSk7XG5cbiAgICAgICAgICAgIGlmICh0ZXJtTm9kZU1hdGNoZXMpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkgfHwgbnVsbDtcblxuICAgIHJldHVybiB0ZXJtO1xuICB9XG5cbiAgZmluZExpbmtCeUxpbmtOb2RlKGxpbmtOb2RlKSB7XG4gICAgY29uc3QgbGlua3MgPSB0aGlzLmdldExpbmtzKCksXG4gICAgICAgICAgbGluayA9IGxpbmtzLmZpbmQoKGxpbmspID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxpbmtOb2RlTWF0Y2hlcyA9IGxpbmsubWF0Y2hMaW5rTm9kZShsaW5rTm9kZSk7XG5cbiAgICAgICAgICAgIGlmIChsaW5rTm9kZU1hdGNoZXMpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkgfHwgbnVsbDtcblxuICAgIHJldHVybiBsaW5rO1xuICB9XG5cbiAgZmluZEZyYW1lQnlGcmFtZU5vZGUoZnJhbWVOb2RlKSB7XG4gICAgY29uc3QgZnJhbWVzID0gdGhpcy5nZXRGcmFtZXMoKSxcbiAgICAgICAgICBmcmFtZSA9IGZyYW1lcy5maW5kKChmcmFtZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZnJhbWVOb2RlTWF0Y2hlcyA9IGZyYW1lLm1hdGNoRnJhbWVOb2RlKGZyYW1lTm9kZSk7XG5cbiAgICAgICAgICAgIGlmIChmcmFtZU5vZGVNYXRjaGVzKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pIHx8IG51bGw7XG5cbiAgICByZXR1cm4gZnJhbWU7XG4gIH1cblxuICBmaW5kRXF1YWxpdHlCeUVxdWFsaXR5Tm9kZShlcXVhbGl0eU5vZGUpIHtcbiAgICBjb25zdCBlcXVhbGl0aWVzID0gdGhpcy5nZXRFcXVhbGl0aWVzKCksXG4gICAgICAgICAgZXF1YWxpdHkgPSBlcXVhbGl0aWVzLmZpbmQoKGVxdWFsaXR5KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlcXVhbGl0eU5vZGVNYXRjaGVzID0gZXF1YWxpdHkubWF0Y2hFcXVhbGl0eU5vZGUoZXF1YWxpdHlOb2RlKTtcblxuICAgICAgICAgICAgaWYgKGVxdWFsaXR5Tm9kZU1hdGNoZXMpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkgfHwgbnVsbDtcblxuICAgIHJldHVybiBlcXVhbGl0eTtcbiAgfVxuXG4gIGZpbmRBc3NlcnRpb25CeUFzc2VydGlvbk5vZGUoYXNzZXJ0aW9uTm9kZSkge1xuICAgIGNvbnN0IGFzc2VydGlvbnMgPSB0aGlzLmdldEFzc2VydGlvbnMoKSxcbiAgICAgICAgICBhc3NlcnRpb24gPSBhc3NlcnRpb25zLmZpbmQoKGFzc2VydGlvbikgPT4ge1xuICAgICAgICAgICAgY29uc3QgYXNzZXJ0aW9uTm9kZU1hdGNoZXMgPSBhc3NlcnRpb24ubWF0Y2hBc3NlcnRpb25Ob2RlKGFzc2VydGlvbk5vZGUpO1xuXG4gICAgICAgICAgICBpZiAoYXNzZXJ0aW9uTm9kZU1hdGNoZXMpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkgfHwgbnVsbDtcblxuICAgIHJldHVybiBhc3NlcnRpb247XG4gIH1cblxuICBmaW5kU3RhdGVtZW50QnlTdGF0ZW1lbnROb2RlKHN0YXRlbWVudE5vZGUpIHtcbiAgICBjb25zdCBzdGF0ZW1lbnRzID0gdGhpcy5nZXRTdGF0ZW1lbnRzKCksXG4gICAgICAgICAgc3RhdGVtZW50ID0gc3RhdGVtZW50cy5maW5kKChzdGF0ZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXRlbWVudE5vZGVNYXRjaGVzID0gc3RhdGVtZW50Lm1hdGNoU3RhdGVtZW50Tm9kZShzdGF0ZW1lbnROb2RlKTtcblxuICAgICAgICAgICAgaWYgKHN0YXRlbWVudE5vZGVNYXRjaGVzKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pIHx8IG51bGw7XG5cbiAgICByZXR1cm4gc3RhdGVtZW50O1xuICB9XG5cbiAgZmluZFBhcmFtZXRlckJ5UGFyYW1ldGVyTm9kZShwYXJhbWV0ZXJOb2RlKSB7XG4gICAgY29uc3QgcGFyYW1ldGVycyA9IHRoaXMuZ2V0UGFyYW1ldGVycygpLFxuICAgICAgICAgIHBhcmFtZXRlciA9IHBhcmFtZXRlcnMuZmluZCgocGFyYW1ldGVyKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwYXJhbWV0ZXJOb2RlTWF0Y2hlcyA9IHBhcmFtZXRlci5tYXRjaFBhcmFtZXRlck5vZGUocGFyYW1ldGVyTm9kZSk7XG5cbiAgICAgICAgICAgIGlmIChwYXJhbWV0ZXJOb2RlTWF0Y2hlcykge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSB8fCBudWxsO1xuXG4gICAgcmV0dXJuIHBhcmFtZXRlcjtcbiAgfVxuXG4gIGZpbmRBc3N1bXB0aW9uQnlBc3N1bXB0aW9uTm9kZShhc3N1bXB0aW9uTm9kZSkge1xuICAgIGNvbnN0IGFzc3VtcHRpb25zID0gdGhpcy5nZXRBc3N1bXB0aW9ucygpLFxuICAgICAgICAgIGFzc3VtcHRpb24gPSBhc3N1bXB0aW9ucy5maW5kKChhc3N1bXB0aW9uKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhc3N1bXB0aW9uTm9kZU1hdGNoZXMgPSBhc3N1bXB0aW9uLm1hdGNoQXNzdW1wdGlvbk5vZGUoYXNzdW1wdGlvbk5vZGUpO1xuXG4gICAgICAgICAgICBpZiAoYXNzdW1wdGlvbk5vZGVNYXRjaGVzKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pIHx8IG51bGw7XG5cbiAgICByZXR1cm4gYXNzdW1wdGlvbjtcbiAgfVxuXG4gIGZpbmRNZXRhdmFyaWFibGVCeU1ldGF2YXJpYWJsZU5vZGUobWV0YXZhcmlhYmxlTm9kZSkge1xuICAgIGNvbnN0IG1ldGF2YXJpYWJsZXMgPSB0aGlzLmdldE1ldGF2YXJpYWJsZXMoKSxcbiAgICAgICAgICBtZXRhdmFyaWFibGUgPSBtZXRhdmFyaWFibGVzLmZpbmQoKG1ldGF2YXJpYWJsZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbWV0YXZhcmlhYmxlTm9kZU1hdGNoZXMgPSBtZXRhdmFyaWFibGUubWF0Y2hNZXRhdmFyaWFibGVOb2RlKG1ldGF2YXJpYWJsZU5vZGUpO1xuXG4gICAgICAgICAgICBpZiAobWV0YXZhcmlhYmxlTm9kZU1hdGNoZXMpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkgfHwgbnVsbDtcblxuICAgIHJldHVybiBtZXRhdmFyaWFibGU7XG4gIH1cblxuICBmaW5kUHJvY2VkdXJlQ2FsbEJ5UHJvY2VkdXJlQ2FsbE5vZGUocHJvY2VkdXJlQ2FsbE5vZGUpIHtcbiAgICBjb25zdCBwcm9jZWR1cmVDYWxscyA9IHRoaXMuZ2V0UHJvY2VkdXJlQ2FsbHMoKSxcbiAgICAgICAgICBwcm9jZWR1cmVDYWxsID0gcHJvY2VkdXJlQ2FsbHMuZmluZCgocHJvY2VkdXJlQ2FsbCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcHJvY2VkdXJlQ2FsbE5vZGVNYXRjaGVzID0gcHJvY2VkdXJlQ2FsbC5tYXRjaFByb2NlZHVyZUNhbGxOb2RlKHByb2NlZHVyZUNhbGxOb2RlKTtcblxuICAgICAgICAgICAgaWYgKHByb2NlZHVyZUNhbGxOb2RlTWF0Y2hlcykge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSB8fCBudWxsO1xuXG4gICAgcmV0dXJuIHByb2NlZHVyZUNhbGw7XG4gIH1cblxuICBpc1Rlcm1QcmVzZW50QnlUZXJtTm9kZSh0ZXJtTm9kZSkge1xuICAgIGNvbnN0IHRlcm0gPSB0aGlzLmZpbmRUZXJtQnlUZXJtTm9kZSh0ZXJtTm9kZSksXG4gICAgICAgICAgdGVybVByZXNlbnQgPSAodGVybSAhPT0gbnVsbCk7XG5cbiAgICByZXR1cm4gdGVybVByZXNlbnQ7XG4gIH1cblxuICBpc0xpbmtQcmVzZW50QnlMaW5rTm9kZShsaW5rTm9kZSkge1xuICAgIGNvbnN0IGxpbmsgPSB0aGlzLmZpbmRMaW5rQnlMaW5rTm9kZShsaW5rTm9kZSksXG4gICAgICAgICAgbGlua1ByZXNlbnQgPSAobGluayAhPT0gbnVsbCk7XG5cbiAgICByZXR1cm4gbGlua1ByZXNlbnQ7XG4gIH1cblxuICBpc0ZyYW1lUHJlc2VudEJ5RnJhbWVOb2RlKGZyYW1lTm9kZSkge1xuICAgIGNvbnN0IGZyYW1lID0gdGhpcy5maW5kRnJhbWVCeUZyYW1lTm9kZShmcmFtZU5vZGUpLFxuICAgICAgICAgIGZyYW1lUHJlc2VudCA9IChmcmFtZSAhPT0gbnVsbCk7XG5cbiAgICByZXR1cm4gZnJhbWVQcmVzZW50O1xuICB9XG5cbiAgaXNFcXVhbGl0eVByZXNlbnRCeUVxdWFsaXR5Tm9kZShlcXVhbGl0eU5vZGUpIHtcbiAgICBjb25zdCBlcXVhbGl0eSA9IHRoaXMuZmluZEVxdWFsaXR5QnlFcXVhbGl0eU5vZGUoZXF1YWxpdHlOb2RlKSxcbiAgICAgICAgICBlcXVhbGl0eVByZXNlbnQgPSAoZXF1YWxpdHkgIT09IG51bGwpO1xuXG4gICAgcmV0dXJuIGVxdWFsaXR5UHJlc2VudDtcbiAgfVxuXG4gIGlzQXNzZXJ0aW9uUHJlc2VudEJ5QXNzZXJ0aW9uTm9kZShhc3NlcnRpb25Ob2RlKSB7XG4gICAgY29uc3QgYXNzZXJ0aW9uID0gdGhpcy5maW5kQXNzZXJ0aW9uQnlBc3NlcnRpb25Ob2RlKGFzc2VydGlvbk5vZGUpLFxuICAgICAgICAgIGFzc2VydGlvblByZXNlbnQgPSAoYXNzZXJ0aW9uICE9PSBudWxsKTtcblxuICAgIHJldHVybiBhc3NlcnRpb25QcmVzZW50O1xuICB9XG5cbiAgaXNTdGF0ZW1lbnRQcmVzZW50QnlTdGF0ZW1lbnROb2RlKHN0YXRlbWVudE5vZGUpIHtcbiAgICBjb25zdCBzdGF0ZW1lbnQgPSB0aGlzLmZpbmRTdGF0ZW1lbnRCeVN0YXRlbWVudE5vZGUoc3RhdGVtZW50Tm9kZSksXG4gICAgICAgICAgc3RhdGVtZW50UHJlc2VudCA9IChzdGF0ZW1lbnQgIT09IG51bGwpO1xuXG4gICAgcmV0dXJuIHN0YXRlbWVudFByZXNlbnQ7XG4gIH1cblxuICBpc1BhcmFtZXRlclByZXNlbnRCeVBhcmFtZXRlck5vZGUocGFyYW1ldGVyTm9kZSkge1xuICAgIGNvbnN0IHBhcmFtZXRlciA9IHRoaXMuZmluZFBhcmFtZXRlckJ5UGFyYW1ldGVyTm9kZShwYXJhbWV0ZXJOb2RlKSxcbiAgICAgICAgICBwYXJhbWV0ZXJQcmVzZW50ID0gKHBhcmFtZXRlciAhPT0gbnVsbCk7XG5cbiAgICByZXR1cm4gcGFyYW1ldGVyUHJlc2VudDtcbiAgfVxuXG4gIGlzQXNzdW1wdGlvblByZXNlbnRCeUFzc3VtcHRpb25Ob2RlKGFzc3VtcHRpb25Ob2RlKSB7XG4gICAgY29uc3QgYXNzdW1wdGlvbiA9IHRoaXMuZmluZEFzc3VtcHRpb25CeUFzc3VtcHRpb25Ob2RlKGFzc3VtcHRpb25Ob2RlKSxcbiAgICAgICAgICBhc3N1bXB0aW9uUHJlc2VudCA9IChhc3N1bXB0aW9uICE9PSBudWxsKTtcblxuICAgIHJldHVybiBhc3N1bXB0aW9uUHJlc2VudDtcbiAgfVxuXG4gIGlzTWV0YXZhcmlhYmxlUHJlc2VudEJ5TWV0YXZhcmlhYmxlTm9kZShtZXRhdmFyaWFibGVOb2RlKSB7XG4gICAgY29uc3QgbWV0YXZhcmlhYmxlbiA9IHRoaXMuZmluZE1ldGF2YXJpYWJsZUJ5TWV0YXZhcmlhYmxlTm9kZShtZXRhdmFyaWFibGVOb2RlKSxcbiAgICAgICAgICBtZXRhdmFyaWFibGVuUHJlc2VudCA9IChtZXRhdmFyaWFibGVuICE9PSBudWxsKTtcblxuICAgIHJldHVybiBtZXRhdmFyaWFibGVuUHJlc2VudDtcbiAgfVxuXG4gIGlzUHJvY2VkdXJlQ2FsbFByZXNlbnRCeVByb2NlZHVyZUNhbGxOb2RlKHByb2NlZHVyZUNhbGxOb2RlKSB7XG4gICAgY29uc3QgcHJvY2VkdXJlQ2FsbCA9IHRoaXMuZmluZFByb2NlZHVyZUNhbGxCeVByb2NlZHVyZUNhbGxOb2RlKHByb2NlZHVyZUNhbGxOb2RlKSxcbiAgICAgICAgICBwcm9jZWR1cmVDYWxsUHJlc2VudCA9IChwcm9jZWR1cmVDYWxsICE9PSBudWxsKTtcblxuICAgIHJldHVybiBwcm9jZWR1cmVDYWxsUHJlc2VudDtcbiAgfVxuXG4gIG1lcmdlKGNvbnRleHQpIHtcbiAgICBjb250ZXh0LmRlYnVnKGBNZXJnaW5nIHRoZSBjbGFkaWMgY29udGV4dGApO1xuXG4gICAgY29udGV4dC5hZGRUZXJtcyh0aGlzLnRlcm1zKTtcblxuICAgIGNvbnRleHQuYWRkTGlua3ModGhpcy5saW5rcyk7XG5cbiAgICBjb250ZXh0LmFkZEZyYW1lcyh0aGlzLmZyYW1lcyk7XG5cbiAgICBjb250ZXh0LmFkZEVxdWFsaXRpZXModGhpcy5lcXVhbGl0aWVzKTtcblxuICAgIGNvbnRleHQuYWRkQXNzZXJ0aW9ucyh0aGlzLmFzc2VydGlvbnMpO1xuXG4gICAgY29udGV4dC5hZGRTdGF0ZW1lbnRzKHRoaXMuc3RhdGVtZW50cyk7XG5cbiAgICBjb250ZXh0LmFkZFBhcmFtZXRlcnModGhpcy5wYXJhbWV0ZXJzKTtcblxuICAgIGNvbnRleHQuYWRkQXNzdW1wdGlvbnModGhpcy5hc3N1bXB0aW9ucyk7XG5cbiAgICBjb250ZXh0LmFkZE1ldGF2YXJpYWJsZXModGhpcy5tZXRhdmFyaWFibGVzKTtcblxuICAgIGNvbnRleHQuYWRkUHJvY2VkdXJlQ2FsbHModGhpcy5wcm9jZWR1cmVDYWxscyk7XG4gIH1cblxuICBzdGF0aWMgZnJvbU5vdGhpbmcoY29udGV4dCkge1xuICAgIGNvbnN0IHRlcm1zID0gW10sXG4gICAgICAgICAgbGlua3MgPSBbXSxcbiAgICAgICAgICBmcmFtZXMgPSBbXSxcbiAgICAgICAgICBlcXVhbGl0aWVzID0gW10sXG4gICAgICAgICAgc3RhdGVtZW50cyA9IFtdLFxuICAgICAgICAgIHBhcmFtZXRlcnMgPSBbXSxcbiAgICAgICAgICBhc3NlcnRpb25zID0gW10sXG4gICAgICAgICAgYXNzdW1wdGlvbnMgPSBbXSxcbiAgICAgICAgICBtZXRhdmFyaWFibGVzID0gW10sXG4gICAgICAgICAgcHJvY2VkdXJlQ2FsbHMgPSBbXSxcbiAgICAgICAgICBjbGFkaWNDb250ZXh0ID0gbmV3IENsYWRpY0NvbnRleHQoY29udGV4dCwgdGVybXMsIGxpbmtzLCBmcmFtZXMsIGVxdWFsaXRpZXMsIGFzc2VydGlvbnMsIHN0YXRlbWVudHMsIHBhcmFtZXRlcnMsIGFzc3VtcHRpb25zLCBtZXRhdmFyaWFibGVzLCBwcm9jZWR1cmVDYWxscyk7XG5cbiAgICByZXR1cm4gY2xhZGljQ29udGV4dDtcbiAgfVxufVxuIl0sIm5hbWVzIjpbIkNsYWRpY0NvbnRleHQiLCJwdXNoIiwiZXh0cmFjdCIsImFycmF5VXRpbGl0aWVzIiwiQ29udGV4dCIsImNvbnRleHQiLCJ0ZXJtcyIsImxpbmtzIiwiZnJhbWVzIiwiZXF1YWxpdGllcyIsImFzc2VydGlvbnMiLCJzdGF0ZW1lbnRzIiwicGFyYW1ldGVycyIsImFzc3VtcHRpb25zIiwibWV0YXZhcmlhYmxlcyIsInByb2NlZHVyZUNhbGxzIiwiZ2V0VGVybXMiLCJnZXRDb250ZXh0IiwiZ2V0TGlua3MiLCJnZXRGcmFtZXMiLCJnZXRFcXVhbGl0aWVzIiwiZ2V0U3RhdGVtZW50cyIsImdldFBhcmFtZXRlcnMiLCJnZXRBc3NlcnRpb25zIiwiZ2V0QXNzdW1wdGlvbnMiLCJnZXRNZXRhdmFyaWFibGVzIiwiZ2V0UHJvY2VkdXJlQ2FsbHMiLCJhZGRUZXJtIiwidGVybSIsInRlcm1TdHJpbmciLCJnZXRTdHJpbmciLCJ0cmFjZSIsInRlcm1BIiwidGVybUIiLCJ0ZXJtQUVxdWFsVG9UZXJtQiIsImlzRXF1YWxUbyIsImRlYnVnIiwiYWRkTGluayIsImxpbmsiLCJsaW5rU3RyaW5nIiwibGlua0EiLCJsaW5rQiIsImxpbmtBRXF1YWxUb0xpbmtCIiwiYWRkRnJhbWUiLCJmcmFtZSIsImZyYW1lU3RyaW5nIiwiZnJhbWVBIiwiZnJhbWVCIiwiZnJhbWVBRXF1YWxUb0ZyYW1lQiIsImFkZEVxdWFsaXR5IiwiZXF1YWxpdHkiLCJlcXVhbGl0eVN0cmluZyIsImVxdWFsaXR5QSIsImVxdWFsaXR5QiIsImVxdWFsaXR5QUVxdWFsVG9FcXVhbGl0eUIiLCJhZGRBc3NlcnRpb24iLCJhc3NlcnRpb24iLCJhc3NlcnRpb25TdHJpbmciLCJhc3NlcnRpb25BIiwiYXNzZXJ0aW9uQiIsImFzc2VydGlvbkFFcXVhbFRvQXNzZXJ0aW9uQiIsImFkZFN0YXRlbWVudCIsInN0YXRlbWVudCIsInN0YXRlbWVudFN0cmluZyIsInN0YXRlbWVudEEiLCJzdGF0ZW1lbnRCIiwic3RhdGVtZW50QUVxdWFsVG9TdGF0ZW1lbnRCIiwiYWRkUGFyYW1ldGVyIiwicGFyYW10ZXIiLCJwYXJhbXRlclN0cmluZyIsInBhcmFtdGVyQSIsInBhcmFtdGVycyIsInBhcmFtdGVyQiIsInBhcmFtdGVyQUVxdWFsVG9QYXJhbWV0ZXJCIiwiYWRkQXNzdW1wdGlvbiIsImFzc3VtcHRpb24iLCJhc3N1bXB0aW9uU3RyaW5nIiwiYXNzdW1wdGlvbkEiLCJhc3N1bXB0aW9uQiIsImFzc3VtcHRpb25BRXF1YWxUb0Fzc3VtcHRpb25CIiwiYWRkTWV0YXZhcmlhYmxlIiwibWV0YXZhcmlhYmxlIiwibWV0YXZhcmlhYmxlU3RyaW5nIiwibWV0YXZhcmlhYmxlQSIsIm1ldGF2YXJpYWJsZUIiLCJtZXRhdmFyaWFibGVBRXF1YWxUb01ldGF2YXJpYWJsZUIiLCJhZGRTdWJzdGl0dXRpb24iLCJzdWJzdGl0dXRpb24iLCJhZGRQcm9jZWR1cmVDYWxsIiwicHJvY2VkdXJlQ2FsbCIsInByb2NlZHVyZUNhbGxTdHJpbmciLCJwcm9jZWR1cmVDYWxsQSIsInByb2NlZHVyZUNhbGxCIiwicHJvY2VkdXJlQ2FsbEFFcXVhbFRvUHJvY2VkdXJlYWxsQiIsImFkZEFzc2lnbm1lbnQiLCJhc3NpZ25tZW50IiwiYWRkVGVybXMiLCJmb3JFYWNoIiwiYWRkTGlua3MiLCJhZGRGcmFtZXMiLCJhZGRFcXVhbGl0aWVzIiwiYWRkQXNzZXJ0aW9ucyIsImFkZFN0YXRlbWVudHMiLCJhZGRQYXJhbWV0ZXJzIiwicGFyYW1ldGVyIiwiYWRkQXNzdW1wdGlvbnMiLCJhZGRNZXRhdmFyaWFibGVzIiwiYWRkUHJvY2VkdXJlQ2FsbHMiLCJmaW5kVGVybUJ5VGVybU5vZGUiLCJ0ZXJtTm9kZSIsImZpbmQiLCJ0ZXJtTm9kZU1hdGNoZXMiLCJtYXRjaFRlcm1Ob2RlIiwiZmluZExpbmtCeUxpbmtOb2RlIiwibGlua05vZGUiLCJsaW5rTm9kZU1hdGNoZXMiLCJtYXRjaExpbmtOb2RlIiwiZmluZEZyYW1lQnlGcmFtZU5vZGUiLCJmcmFtZU5vZGUiLCJmcmFtZU5vZGVNYXRjaGVzIiwibWF0Y2hGcmFtZU5vZGUiLCJmaW5kRXF1YWxpdHlCeUVxdWFsaXR5Tm9kZSIsImVxdWFsaXR5Tm9kZSIsImVxdWFsaXR5Tm9kZU1hdGNoZXMiLCJtYXRjaEVxdWFsaXR5Tm9kZSIsImZpbmRBc3NlcnRpb25CeUFzc2VydGlvbk5vZGUiLCJhc3NlcnRpb25Ob2RlIiwiYXNzZXJ0aW9uTm9kZU1hdGNoZXMiLCJtYXRjaEFzc2VydGlvbk5vZGUiLCJmaW5kU3RhdGVtZW50QnlTdGF0ZW1lbnROb2RlIiwic3RhdGVtZW50Tm9kZSIsInN0YXRlbWVudE5vZGVNYXRjaGVzIiwibWF0Y2hTdGF0ZW1lbnROb2RlIiwiZmluZFBhcmFtZXRlckJ5UGFyYW1ldGVyTm9kZSIsInBhcmFtZXRlck5vZGUiLCJwYXJhbWV0ZXJOb2RlTWF0Y2hlcyIsIm1hdGNoUGFyYW1ldGVyTm9kZSIsImZpbmRBc3N1bXB0aW9uQnlBc3N1bXB0aW9uTm9kZSIsImFzc3VtcHRpb25Ob2RlIiwiYXNzdW1wdGlvbk5vZGVNYXRjaGVzIiwibWF0Y2hBc3N1bXB0aW9uTm9kZSIsImZpbmRNZXRhdmFyaWFibGVCeU1ldGF2YXJpYWJsZU5vZGUiLCJtZXRhdmFyaWFibGVOb2RlIiwibWV0YXZhcmlhYmxlTm9kZU1hdGNoZXMiLCJtYXRjaE1ldGF2YXJpYWJsZU5vZGUiLCJmaW5kUHJvY2VkdXJlQ2FsbEJ5UHJvY2VkdXJlQ2FsbE5vZGUiLCJwcm9jZWR1cmVDYWxsTm9kZSIsInByb2NlZHVyZUNhbGxOb2RlTWF0Y2hlcyIsIm1hdGNoUHJvY2VkdXJlQ2FsbE5vZGUiLCJpc1Rlcm1QcmVzZW50QnlUZXJtTm9kZSIsInRlcm1QcmVzZW50IiwiaXNMaW5rUHJlc2VudEJ5TGlua05vZGUiLCJsaW5rUHJlc2VudCIsImlzRnJhbWVQcmVzZW50QnlGcmFtZU5vZGUiLCJmcmFtZVByZXNlbnQiLCJpc0VxdWFsaXR5UHJlc2VudEJ5RXF1YWxpdHlOb2RlIiwiZXF1YWxpdHlQcmVzZW50IiwiaXNBc3NlcnRpb25QcmVzZW50QnlBc3NlcnRpb25Ob2RlIiwiYXNzZXJ0aW9uUHJlc2VudCIsImlzU3RhdGVtZW50UHJlc2VudEJ5U3RhdGVtZW50Tm9kZSIsInN0YXRlbWVudFByZXNlbnQiLCJpc1BhcmFtZXRlclByZXNlbnRCeVBhcmFtZXRlck5vZGUiLCJwYXJhbWV0ZXJQcmVzZW50IiwiaXNBc3N1bXB0aW9uUHJlc2VudEJ5QXNzdW1wdGlvbk5vZGUiLCJhc3N1bXB0aW9uUHJlc2VudCIsImlzTWV0YXZhcmlhYmxlUHJlc2VudEJ5TWV0YXZhcmlhYmxlTm9kZSIsIm1ldGF2YXJpYWJsZW4iLCJtZXRhdmFyaWFibGVuUHJlc2VudCIsImlzUHJvY2VkdXJlQ2FsbFByZXNlbnRCeVByb2NlZHVyZUNhbGxOb2RlIiwicHJvY2VkdXJlQ2FsbFByZXNlbnQiLCJtZXJnZSIsImZyb21Ob3RoaW5nIiwiY2xhZGljQ29udGV4dCJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7K0JBUUE7OztlQUFxQkE7OzsyQkFOVTtnRUFFWDs7Ozs7O0FBRXBCLE1BQU0sRUFBRUMsSUFBSSxFQUFFQyxPQUFPLEVBQUUsR0FBR0MseUJBQWM7QUFFekIsTUFBTUgsc0JBQXNCSSxnQkFBTztJQUNoRCxZQUFZQyxPQUFPLEVBQUVDLEtBQUssRUFBRUMsS0FBSyxFQUFFQyxNQUFNLEVBQUVDLFVBQVUsRUFBRUMsVUFBVSxFQUFFQyxVQUFVLEVBQUVDLFVBQVUsRUFBRUMsV0FBVyxFQUFFQyxhQUFhLEVBQUVDLGNBQWMsQ0FBRTtRQUNySSxLQUFLLENBQUNWO1FBRU4sSUFBSSxDQUFDQyxLQUFLLEdBQUdBO1FBQ2IsSUFBSSxDQUFDQyxLQUFLLEdBQUdBO1FBQ2IsSUFBSSxDQUFDQyxNQUFNLEdBQUdBO1FBQ2QsSUFBSSxDQUFDQyxVQUFVLEdBQUdBO1FBQ2xCLElBQUksQ0FBQ0MsVUFBVSxHQUFHQTtRQUNsQixJQUFJLENBQUNDLFVBQVUsR0FBR0E7UUFDbEIsSUFBSSxDQUFDQyxVQUFVLEdBQUdBO1FBQ2xCLElBQUksQ0FBQ0MsV0FBVyxHQUFHQTtRQUNuQixJQUFJLENBQUNDLGFBQWEsR0FBR0E7UUFDckIsSUFBSSxDQUFDQyxjQUFjLEdBQUdBO0lBQ3hCO0lBRUFDLFNBQVNWLFFBQVEsRUFBRSxFQUFFO1FBQ25CLE1BQU1ELFVBQVUsSUFBSSxDQUFDWSxVQUFVO1FB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
|